diff --git a/.changeset/config.json b/.changeset/config.json index 6fd32816ad74..5efcfc14dbb8 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -3,7 +3,7 @@ "changelog": ["@changesets/changelog-github", { "repo": "ethereum-optimism/optimism" }], "commit": false, "fixed": [], - "linked": [["@eth-optimism/contracts-bedrock", "@eth-optimism/contracts-ts"]], + "linked": [], "access": "public", "baseBranch": "develop", "updateInternalDependencies": "patch", diff --git a/.changeset/witty-pants-move.md b/.changeset/witty-pants-move.md new file mode 100644 index 000000000000..aa85cb679e4e --- /dev/null +++ b/.changeset/witty-pants-move.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts-bedrock': patch +--- + +Add data field to faucet contract drip parameters diff --git a/.circleci/config.yml b/.circleci/config.yml index 2e0e84ac42e9..a87fa9ba41b1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2.1 parameters: ci_builder_image: type: string - default: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.43.0 + default: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.49.0 ci_builder_rust_image: type: string default: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder-rust:latest @@ -23,9 +23,15 @@ parameters: fault_proofs_dispatch: type: boolean default: false + reproducibility_dispatch: + type: boolean + default: false kontrol_dispatch: type: boolean default: false + sdk_dispatch: + type: boolean + default: false orbs: go: circleci/go@1.8.0 @@ -120,6 +126,8 @@ jobs: - checkout - check-changed: patterns: cannon,packages/contracts-bedrock/src/cannon,op-preimage,go.mod + - attach_workspace: + at: "." - run: name: prep Cannon results dir command: mkdir -p /tmp/test-results @@ -135,7 +143,8 @@ jobs: - run: name: Cannon Go tests command: | - gotestsum --format=standard-verbose --junitfile=/tmp/test-results/cannon.xml \ + mkdir -p /testlogs + gotestsum --format=testname --junitfile=/tmp/test-results/cannon.xml --jsonfile=/testlogs/log.json \ -- -parallel=2 -coverpkg=github.com/ethereum-optimism/optimism/cannon/... -coverprofile=coverage.out ./... working_directory: cannon - run: @@ -143,6 +152,9 @@ jobs: command: codecov --verbose --clean --flags cannon-go-tests - store_test_results: path: /tmp/test-results + - store_artifacts: + path: /testlogs + when: always cannon-build-test-vectors: docker: - image: <> @@ -212,6 +224,12 @@ jobs: - run: name: Copy Plasma allocs to .devnet-plasma command: cp -r .devnet/ .devnet-plasma/ + - run: + name: Generate Generic Plasma allocs + command: DEVNET_PLASMA="true" GENERIC_PLASMA="true" make devnet-allocs + - run: + name: Copy Plasma allocs to .devnet-plasma + command: cp -r .devnet/ .devnet-plasma-generic/ - run: name: Generate non-FPAC allocs command: make devnet-allocs @@ -225,13 +243,28 @@ jobs: - "packages/contracts-bedrock/tsconfig.tsbuildinfo" - "packages/contracts-bedrock/tsconfig.build.tsbuildinfo" - ".devnet/allocs-l1.json" + - ".devnet/allocs-l2.json" + - ".devnet/allocs-l2-delta.json" + - ".devnet/allocs-l2-ecotone.json" - ".devnet/addresses.json" - ".devnet-fault-proofs/allocs-l1.json" - ".devnet-fault-proofs/addresses.json" + - ".devnet-fault-proofs/allocs-l2.json" + - ".devnet-fault-proofs/allocs-l2-delta.json" + - ".devnet-fault-proofs/allocs-l2-ecotone.json" - ".devnet-plasma/allocs-l1.json" - ".devnet-plasma/addresses.json" + - ".devnet-plasma/allocs-l2.json" + - ".devnet-plasma/allocs-l2-delta.json" + - ".devnet-plasma/allocs-l2-ecotone.json" + - ".devnet-plasma-generic/allocs-l1.json" + - ".devnet-plasma-generic/addresses.json" + - ".devnet-plasma-generic/allocs-l2.json" + - ".devnet-plasma-generic/allocs-l2-delta.json" + - ".devnet-plasma-generic/allocs-l2-ecotone.json" - "packages/contracts-bedrock/deploy-config/devnetL1.json" - "packages/contracts-bedrock/deployments/devnetL1" + - notify-failures-on-develop docker-build: environment: @@ -307,9 +340,32 @@ jobs: export IMAGE_TAGS="$(echo -ne "<>" | sed "s/[^a-zA-Z0-9\n,]/-/g")" export GIT_COMMIT="$(git rev-parse HEAD)" export GIT_DATE="$(git show -s --format='%ct')" - export GIT_VERSION="<>" export PLATFORMS="<>" + echo "Checking git tags pointing at $GIT_COMMIT:" + tags_at_commit=$(git tag --points-at $GIT_COMMIT) + echo "Tags at commit:\n$tags_at_commit" + + filtered_tags=$(echo "$tags_at_commit" | grep "^<>/" || true) + echo "Filtered tags: $filtered_tags" + + if [ -z "$filtered_tags" ]; then + export GIT_VERSION="untagged" + else + sorted_tags=$(echo "$filtered_tags" | sed "s/<>\///" | sort -V) + echo "Sorted tags: $sorted_tags" + + # prefer full release tag over "-rc" release candidate tag if both exist + full_release_tag=$(echo "$sorted_tags" | grep -v -- "-rc" || true) + if [ -z "$full_release_tag" ]; then + export GIT_VERSION=$(echo "$sorted_tags" | tail -n 1) + else + export GIT_VERSION=$(echo "$full_release_tag" | tail -n 1) + fi + fi + + echo "Setting GIT_VERSION=$GIT_VERSION" + # Create, start (bootstrap) and use a *named* docker builder # This allows us to cross-build multi-platform, # and naming allows us to use the DLC (docker-layer-cache) @@ -397,8 +453,50 @@ jobs: --signer-logging-level="INFO"\ --attestor-key-id="//cloudkms.googleapis.com/v1/projects/$ATTESTOR_PROJECT_NAME/locations/global/keyRings/$ATTESTOR_NAME-key-ring/cryptoKeys/$ATTESTOR_NAME-key/cryptoKeyVersions/1" + # Verify newly published images (built on AMD machine) will run on ARM + check-cross-platform: + docker: + - image: cimg/base:current + resource_class: arm.medium + parameters: + registry: + description: Docker registry + type: string + default: "us-docker.pkg.dev" + repo: + description: Docker repo + type: string + default: "oplabs-tools-artifacts/images" + op_component: + description: "Name of op-stack component (e.g. op-node)" + type: string + default: "" + docker_tag: + description: "Tag of docker image" + type: string + default: "<>" + steps: + - setup_remote_docker + - run: + name: "Verify Image Platform" + command: | + image_name="<>/<>/<>:<>" + echo "Retrieving Docker image manifest: $image_name" + MANIFEST=$(docker manifest inspect $image_name) - + echo "Verifying 'linux/arm64' is supported..." + SUPPORTED_PLATFORM=$(echo "$MANIFEST" | jq -r '.manifests[] | select(.platform.architecture == "arm64" and .platform.os == "linux")') + echo $SUPPORT_PLATFORM + if [ -z "$SUPPORTED_PLATFORM" ]; then + echo "Platform 'linux/arm64' not supported by this image" + exit 1 + fi + - run: + name: "Pull and run docker image" + command: | + image_name="<>/<>/<>:<>" + docker pull $image_name || exit 1 + docker run $image_name <> --version || exit 1 contracts-bedrock-coverage: docker: @@ -483,11 +581,21 @@ jobs: - run: name: Install dependencies command: pnpm install:ci - # Note: this step needs to come first because one of the later steps modifies the cache & forces a contracts rebuild - run: name: forge version command: forge --version - run: + # The solc warnings check must be the first step to build the contracts, that way the + # warnings are output here. On subsequent runs, forge will read artifacts from the cache + # so warnings would not occur. + name: solc warnings check + command: | + forge build --deny-warnings || echo "export SOLC_WARNINGS_CHECK=1" >> "$BASH_ENV" + environment: + FOUNDRY_PROFILE: ci + working_directory: packages/contracts-bedrock + - run: + # Semver lock must come second because one of the later steps may modify the cache & force a contracts rebuild. name: semver lock command: | pnpm semver-lock @@ -521,6 +629,13 @@ jobs: command: | pnpm snapshots:check || echo "export SNAPSHOTS_STATUS=1" >> "$BASH_ENV" working_directory: packages/contracts-bedrock + - run: + name: size check + command: | + forge build --sizes --skip "/**/test/**" --skip "/**/scripts/**" || echo "export SIZE_CHECK=1" >> "$BASH_ENV" + environment: + FOUNDRY_PROFILE: ci + working_directory: packages/contracts-bedrock - run: name: check statuses command: | @@ -528,6 +643,10 @@ jobs: echo "Linting failed, see job output for details." FAILED=1 fi + if [[ "$SOLC_WARNINGS_CHECK" -ne 0 ]]; then + echo "Solidity emitted warnings, see job output for details." + FAILED=1 + fi if [[ "$GAS_SNAPSHOT_STATUS" -ne 0 ]]; then echo "Gas snapshot failed, see job output for details." FAILED=1 @@ -548,6 +667,10 @@ jobs: echo "Snapshots check failed, see job output for details." FAILED=1 fi + if [[ "$SIZE_CHECK" -ne 0 ]]; then + echo "Contract(s) exceed size limit, see job output for details." + FAILED=1 + fi if [[ "$FAILED" -ne 0 ]]; then exit 1 fi @@ -573,41 +696,6 @@ jobs: command: pnpm validate-spacers working_directory: packages/contracts-bedrock - op-bindings-build: - docker: - - image: <> - resource_class: xlarge - steps: - - checkout - - run: - name: check go bindings - command: make && git diff --exit-code - working_directory: op-bindings - - bindgen-remote: - docker: - - image: <> - resource_class: xlarge - steps: - - checkout - - run: - name: bindgen remote bindings - command: make bindgen-remote && git diff --exit-code - working_directory: op-bindings - - notify-failures-on-develop - - bindgen-test-e2e: - docker: - - image: <> - resource_class: xlarge - steps: - - checkout - - run: - name: bindgen test E2E - command: make test-bindgen-e2e - working_directory: op-bindings-e2e - - notify-failures-on-develop - js-lint-test: parameters: package_name: @@ -648,28 +736,6 @@ jobs: name: Upload coverage command: codecov --verbose --clean --flags <> - contracts-ts-tests: - docker: - - image: <> - resource_class: medium - steps: - - checkout - - attach_workspace: { at: "." } - - restore_cache: - name: Restore pnpm Package Cache - keys: - - pnpm-packages-v2-{{ checksum "pnpm.lock.yaml" }} - - check-changed: - patterns: sdk,contracts-bedrock,contracts - # populate node modules from the cache - - run: - name: Install dependencies - command: pnpm install:ci - - run: - name: Check generated and build - command: pnpm generate:check - working_directory: packages/contracts-ts - sdk-next-tests: docker: - image: <> @@ -682,22 +748,22 @@ jobs: keys: - pnpm-packages-v2-{{ checksum "pnpm.lock.yaml" }} - check-changed: - patterns: sdk,contracts-bedrock,contracts + patterns: sdk # populate node modules from the cache - run: name: Install dependencies command: pnpm install:ci - run: - name: anvil-l1 + name: sepolia-fork background: true # atm this is goerli but we should use mainnet after bedrock is live - command: anvil --fork-url $ANVIL_L1_FORK_URL --fork-block-number 9256679 + command: anvil --fork-url $ANVIL_SEPOLIA_FORK_URL --fork-block-number 5580113 --port 8545 - run: - name: anvil-l2 + name: op-sepolia-fork background: true # atm this is goerli but we should use mainnet after bedrock is live - command: anvil --fork-url $ANVIL_L2_FORK_URL --port 9545 --fork-block-number 11276409 + command: anvil --fork-url $ANVIL_OP_SEPOLIA_FORK_URL --port 9545 --fork-block-number 9925328 - run: name: build @@ -723,6 +789,7 @@ jobs: VITE_E2E_PRIVATE_KEY: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" VITE_E2E_RPC_URL_L1: http://localhost:8545 VITE_E2E_RPC_URL_L2: http://localhost:9545 + - notify-failures-on-develop todo-issues: machine: @@ -745,12 +812,19 @@ jobs: on_changes: description: changed pattern to fire fuzzer on type: string + uses_artifacts: + description: should load in foundry artifacts + type: boolean + default: false docker: - image: <> steps: - checkout - check-changed: patterns: "<>" + - attach_workspace: + at: "." + if: ${{ uses_artifacts }} - restore_cache: name: Restore Go modules cache key: gomod-{{ checksum "go.sum" }} @@ -778,14 +852,6 @@ jobs: - pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} - check-changed: patterns: packages - - run: - name: Check common-ts - command: npx depcheck - working_directory: packages/common-ts - - run: - name: Check core-utils - command: npx depcheck - working_directory: packages/core-utils - run: name: Check sdk command: npx depcheck @@ -847,11 +913,11 @@ jobs: - golang-build-cache- - run: name: prep results dir - command: mkdir -p /tmp/test-results + command: mkdir -p /tmp/test-results && mkdir -p /testlogs - run: name: run tests command: | - gotestsum --format=standard-verbose --junitfile=/tmp/test-results/<>.xml \ + gotestsum --format=testname --junitfile=/tmp/test-results/<>.xml --jsonfile=/testlogs/log.json \ -- -parallel=8 -coverpkg=github.com/ethereum-optimism/optimism/... -coverprofile=coverage.out ./... working_directory: <> - save_cache: @@ -864,6 +930,9 @@ jobs: #command: codecov --verbose --clean --flags bedrock-go-tests - store_test_results: path: /tmp/test-results + - store_artifacts: + path: /testlogs + when: always go-e2e-test: parameters: @@ -931,6 +1000,9 @@ jobs: name: Load devnet-allocs command: | mkdir -p .devnet + cp /tmp/workspace/.devnet<>/allocs-l2.json .devnet/allocs-l2.json + cp /tmp/workspace/.devnet<>/allocs-l2-delta.json .devnet/allocs-l2-delta.json + cp /tmp/workspace/.devnet<>/allocs-l2-ecotone.json .devnet/allocs-l2-ecotone.json cp /tmp/workspace/.devnet<>/allocs-l1.json .devnet/allocs-l1.json cp /tmp/workspace/.devnet<>/addresses.json .devnet/addresses.json cp /tmp/workspace/packages/contracts-bedrock/deploy-config/devnetL1.json packages/contracts-bedrock/deploy-config/devnetL1.json @@ -950,7 +1022,7 @@ jobs: export OP_E2E_CANNON_ENABLED="false" # Note: We don't use circle CI test splits because we need to split by test name, not by package. There is an additional # constraint that gotestsum does not currently (nor likely will) accept files from different pacakges when building. - JUNIT_FILE=/tmp/test-results/<>_<>.xml make <> 2>&1 | tee /testlogs/test.log + JUNIT_FILE=/tmp/test-results/<>_<>.xml JSON_LOG_FILE=/testlogs/test.log make <> working_directory: <> - store_artifacts: path: /testlogs @@ -994,10 +1066,13 @@ jobs: name: Test command: | mkdir -p /test-results - gotestsum --format=standard-verbose --junitfile /test-results/tests.xml -- -parallel=2 + gotestsum --format=testname --junitfile /test-results/tests.xml --jsonfile /test-results/log.json -- -parallel=2 working_directory: <> - store_test_results: path: /test-results + - store_artifacts: + path: /testlogs + when: always - when: condition: equal: [ true, <> ] @@ -1100,6 +1175,56 @@ jobs: - "op-program/bin/meta.json" - "op-program/bin/prestate-proof.json" + preimage-reproducibility: + docker: + - image: <> + parameters: + version: + type: string + steps: + - checkout + - setup_remote_docker + - run: + name: Switch to tag + command: | + git fetch + git checkout "op-program/v<>" + git submodule update --init --recursive + - run: + name: Set expected prestate hashes + command: | + if [[ "<>" == "0.1.0" ]]; then + echo 'export EXPECTED_PRESTATE_HASH="0x038942ec840131a63c49fa514a3f0577ae401fd5584d56ad50cdf5a8b41d4538"' >> $BASH_ENV + elif [[ "<>" == "0.2.0" ]]; then + echo 'export EXPECTED_PRESTATE_HASH="0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808"' >> $BASH_ENV + elif [[ "<>" == "0.3.0" ]]; then + echo 'export EXPECTED_PRESTATE_HASH="0x034c8cc69f22c35ae386a97136715dd48aaf97fd190942a111bfa680c2f2f421"' >> $BASH_ENV + elif [[ "<>" == "1.0.0" ]]; then + echo 'export EXPECTED_PRESTATE_HASH="0x037ef3c1a487960b0e633d3e513df020c43432769f41a634d18a9595cbf53c55"' >> $BASH_ENV + elif [[ "<>" == "1.1.0" ]]; then + echo 'export EXPECTED_PRESTATE_HASH="0x03e69d3de5155f4a80da99dd534561cbddd4f9dd56c9ecc704d6886625711d2b"' >> $BASH_ENV + else + echo "Unknown prestate version <>" + exit 1 + fi + - run: + name: Build prestate + command: make reproducible-prestate + - run: + name: Verify prestate + command: | + ACTUAL=$(jq -r .pre ./op-program/bin/prestate-proof.json) + echo "Expected: ${EXPECTED_PRESTATE_HASH}" + echo "Actual: ${ACTUAL}" + if [[ "${EXPECTED_PRESTATE_HASH}" != "${ACTUAL}" ]] + then + echo "Prestate did not match expected" + exit 1 + fi + - notify-failures-on-develop: + mentions: "@proofs-squad" + + devnet-allocs: docker: - image: <> @@ -1120,6 +1245,9 @@ jobs: - persist_to_workspace: root: . paths: + - ".devnet/allocs-l2.json" + - ".devnet/allocs-l2-delta.json" + - ".devnet/allocs-l2-ecotone.json" - ".devnet/allocs-l1.json" - ".devnet/addresses.json" - "packages/contracts-bedrock/deploy-config/devnetL1.json" @@ -1136,15 +1264,33 @@ jobs: DEVNET_NO_BUILD: 'true' # Default value; Can be overridden. DEVNET_FPAC: 'false' + DEVNET_PLASMA: 'false' steps: - checkout - when: condition: - equal: ['-fault-proofs', <>] + equal: ['fault-proofs', <>] steps: - run: name: Set DEVNET_FPAC = true command: echo 'export DEVNET_FPAC=true' >> $BASH_ENV + - when: + condition: + equal: ['plasma', <>] + steps: + - run: + name: Set DEVNET_PLASMA = true + command: echo 'export DEVNET_PLASMA=true' >> $BASH_ENV + - when: + condition: + equal: ['plasma-generic', <>] + steps: + - run: + name: Set DEVNET_PLASMA = true + command: echo 'export DEVNET_PLASMA=true' >> $BASH_ENV + - run: + name: Set GENERIC_PLASMA = true + command: echo 'export GENERIC_PLASMA=true' >> $BASH_ENV - check-changed: patterns: op-(.+),packages,ops-bedrock,bedrock-devnet - run: @@ -1158,11 +1304,11 @@ jobs: - run: name: Install Geth command: | - wget https://gethstore.blob.core.windows.net/builds/geth-alltools-linux-amd64-1.13.4-3f907d6a.tar.gz + wget https://gethstore.blob.core.windows.net/builds/geth-alltools-linux-amd64-1.13.14-2bd6bd01.tar.gz # geth only provides md5 sums sadly - echo 'c2e3d38372cb8081ed01591246a7556f geth-alltools-linux-amd64-1.13.4-3f907d6a.tar.gz' | md5sum -c - - tar -xzvf geth-alltools-linux-amd64-1.13.4-3f907d6a.tar.gz - sudo cp geth-alltools-linux-amd64-1.13.4-3f907d6a/* /usr/local/bin + echo '76a04354dba9980fcbc35bece2957b30 geth-alltools-linux-amd64-1.13.14-2bd6bd01.tar.gz' | md5sum -c - + tar -xzvf geth-alltools-linux-amd64-1.13.14-2bd6bd01.tar.gz + sudo cp geth-alltools-linux-amd64-1.13.14-2bd6bd01/* /usr/local/bin - run: name: foundryup command: | @@ -1175,7 +1321,7 @@ jobs: - run: name: Install NVM command: | - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm --version - run: @@ -1192,20 +1338,30 @@ jobs: command: make submodules - attach_workspace: at: "." + - when: + condition: + not: + equal: ['legacy', <>] + steps: + - run: + name: Use non-legacy devnet allocs + command: rm -r .devnet && mv .devnet-<> .devnet - run: name: Load and tag docker images command: | IMAGE_BASE_PREFIX="us-docker.pkg.dev/oplabs-tools-artifacts/images" # Load from previous docker-build job - docker load < "./op-stack-go.tar" docker load < "./op-node.tar" docker load < "./op-proposer.tar" docker load < "./op-batcher.tar" + docker load < "./op-challenger.tar" + docker load < "./da-server.tar" # rename to the tags that the docker-compose of the devnet expects - docker tag "$IMAGE_BASE_PREFIX/op-stack-go:<>" "$IMAGE_BASE_PREFIX/op-stack-go:devnet" docker tag "$IMAGE_BASE_PREFIX/op-node:<>" "$IMAGE_BASE_PREFIX/op-node:devnet" docker tag "$IMAGE_BASE_PREFIX/op-proposer:<>" "$IMAGE_BASE_PREFIX/op-proposer:devnet" docker tag "$IMAGE_BASE_PREFIX/op-batcher:<>" "$IMAGE_BASE_PREFIX/op-batcher:devnet" + docker tag "$IMAGE_BASE_PREFIX/op-challenger:<>" "$IMAGE_BASE_PREFIX/op-challenger:devnet" + docker tag "$IMAGE_BASE_PREFIX/da-server:<>" "$IMAGE_BASE_PREFIX/da-server:devnet" - run: name: pnpm i command: | @@ -1248,6 +1404,11 @@ jobs: command: | docker logs ops-bedrock-op-challenger-1 || echo "No logs." when: on_fail + - run: + name: Dump da-server logs + command: | + docker logs ops-bedrock-da-server-1 || echo "No logs." + when: on_fail - run: name: Log deployment artifact command: | @@ -1480,7 +1641,7 @@ jobs: command: make submodules - check-changed: no_go_deps: "true" - patterns: contracts-bedrock/test/kontrol,contracts-bedrock/src/L1/OptimismPortal\.sol,contracts-bedrock/src/L1/L1CrossDomainMessenger\.sol,contracts-bedrock/src/L1/L1ERC721Bridge\.sol,contracts-bedrock/src/L1/L1StandardBridge\.sol,contracts-bedrock/src/L1/ResourceMetering\.sol,contracts-bedrock/src/universal/StandardBridge\.sol,contracts-bedrock/src/universal/ERC721Bridge\.sol,contracts-bedrock/src/universal/CrossDomainMessenger\.sol + patterns: contracts-bedrock/test/kontrol,contracts-bedrock/src/L1/OptimismPortal\.sol,contracts-bedrock/src/L1/OptimismPortal2\.sol,contracts-bedrock/src/L1/L1CrossDomainMessenger\.sol,contracts-bedrock/src/L1/L1ERC721Bridge\.sol,contracts-bedrock/src/L1/L1StandardBridge\.sol,contracts-bedrock/src/L1/ResourceMetering\.sol,contracts-bedrock/src/universal/StandardBridge\.sol,contracts-bedrock/src/universal/ERC721Bridge\.sol,contracts-bedrock/src/universal/CrossDomainMessenger\.sol - setup_remote_docker: docker_layer_caching: true - run: @@ -1507,18 +1668,6 @@ workflows: jobs: - pnpm-monorepo: name: pnpm-monorepo - - js-lint-test: - name: common-ts-tests - coverage_flag: common-ts-tests - package_name: common-ts - requires: - - pnpm-monorepo - - js-lint-test: - name: core-utils-tests - coverage_flag: core-utils-tests - package_name: core-utils - requires: - - pnpm-monorepo - contracts-bedrock-tests: requires: - pnpm-monorepo @@ -1529,33 +1678,18 @@ workflows: - contracts-bedrock-validate-spaces: requires: - pnpm-monorepo - - op-bindings-build - js-lint-test: name: chain-mon-tests coverage_flag: chain-mon-tests package_name: chain-mon - dependencies: "(common-ts|contracts-bedrock|core-utils|sdk)" - requires: - - pnpm-monorepo - - js-lint-test: - name: contracts-ts-tests - coverage_flag: contracts-ts-tests - package_name: contracts-ts - dependencies: '(contracts-bedrock|contracts-ts)' - requires: - - pnpm-monorepo - - js-lint-test: - name: sdk-next-tests - coverage_flag: sdk-next-tests - package_name: sdk - dependencies: "(common-ts|contracts-bedrock|core-utils)" + dependencies: "(contracts-bedrock|sdk)" requires: - pnpm-monorepo - js-lint-test: name: sdk-tests coverage_flag: sdk-tests package_name: sdk - dependencies: "(contracts-bedrock|core-utils)" + dependencies: "contracts-bedrock" requires: - pnpm-monorepo - depcheck: @@ -1590,13 +1724,20 @@ workflows: - fuzz-golang: name: op-chain-ops-fuzz package_name: op-chain-ops - on_changes: op-chain-ops,op-bindings + on_changes: op-chain-ops requires: ["go-mod-download"] - fuzz-golang: name: cannon-fuzz package_name: cannon on_changes: cannon,packages/contracts-bedrock/src/cannon - requires: ["go-mod-download"] + uses_artifacts: true + requires: ["go-mod-download", "pnpm-monorepo"] + - fuzz-golang: + name: op-e2e-fuzz + package_name: op-e2e + on_changes: op-e2e,packages/contracts-bedrock/src + uses_artifacts: true + requires: ["go-mod-download", "pnpm-monorepo"] - go-test: name: op-heartbeat-tests module: op-heartbeat @@ -1605,10 +1746,6 @@ workflows: name: op-batcher-tests module: op-batcher requires: ["go-mod-download"] - - go-test: - name: op-bindings-tests - module: op-bindings - requires: ["go-mod-download"] - go-test: name: op-chain-ops-tests module: op-chain-ops @@ -1696,7 +1833,6 @@ workflows: - check-generated-mocks-op-service - go-mod-download - op-batcher-tests - - op-bindings-tests - op-chain-ops-tests - op-heartbeat-tests - op-node-tests @@ -1712,58 +1848,50 @@ workflows: - op-e2e-fault-proof-tests - op-e2e-action-tests - op-e2e-ext-geth-tests - - docker-build: # just to warm up the cache (other jobs run in parallel) - name: op-stack-go-docker-build - docker_name: op-stack-go - docker_tags: <>,<> - save_image_tag: <> # for devnet later - docker-build: name: op-node-docker-build docker_name: op-node docker_tags: <>,<> - requires: ['op-stack-go-docker-build'] save_image_tag: <> # for devnet later - docker-build: name: op-batcher-docker-build docker_name: op-batcher docker_tags: <>,<> - requires: ['op-stack-go-docker-build'] save_image_tag: <> # for devnet later - docker-build: name: op-program-docker-build docker_name: op-program docker_tags: <>,<> - requires: ['op-stack-go-docker-build'] - save_image_tag: <> # for devnet later + # op-program is not part of the devnet, we don't save it. - docker-build: name: op-proposer-docker-build docker_name: op-proposer docker_tags: <>,<> - requires: ['op-stack-go-docker-build'] save_image_tag: <> # for devnet later - docker-build: name: op-challenger-docker-build docker_name: op-challenger docker_tags: <>,<> - requires: ['op-stack-go-docker-build'] save_image_tag: <> # for devnet later - docker-build: name: op-dispute-mon-docker-build docker_name: op-dispute-mon docker_tags: <>,<> - requires: ['op-stack-go-docker-build'] save_image_tag: <> # for devnet later - docker-build: name: op-conductor-docker-build docker_name: op-conductor docker_tags: <>,<> - requires: ['op-stack-go-docker-build'] - save_image_tag: <> # for devnet later + # op-conductor is not part of the devnet, we don't save it. - docker-build: name: op-heartbeat-docker-build docker_name: op-heartbeat docker_tags: <>,<> - requires: ['op-stack-go-docker-build'] + # op-heartbeat is not part of the devnet, we don't save it. + - docker-build: + name: da-server-docker-build + docker_name: da-server + docker_tags: <>,<> save_image_tag: <> # for devnet later - cannon-prestate: requires: @@ -1771,12 +1899,14 @@ workflows: - devnet: matrix: parameters: - fpac: ["legacy", "fault-proofs"] + fpac: ["legacy", "fault-proofs", "plasma", "plasma-generic"] requires: - pnpm-monorepo - op-batcher-docker-build - op-proposer-docker-build - op-node-docker-build + - op-challenger-docker-build + - da-server-docker-build - cannon-prestate - docker-build: name: indexer-docker-build @@ -1788,7 +1918,9 @@ workflows: docker_tags: <>,<> - check-generated-mocks-op-node - check-generated-mocks-op-service - - cannon-go-lint-and-test + - cannon-go-lint-and-test: + requires: + - pnpm-monorepo - cannon-build-test-vectors - shellcheck/check: name: shell-check @@ -1806,21 +1938,9 @@ workflows: type: approval filters: tags: - only: /^(proxyd|chain-mon|indexer|ci-builder(-rust)?|ufm-[a-z0-9\-]*|op-[a-z0-9\-]*)\/v.*/ - branches: - ignore: /.*/ - - docker-build: # just to warm up the cache (other jobs run in parallel) - name: op-stack-go-docker-build-release - filters: - tags: - only: /^(proxyd|chain-mon|indexer|ci-builder(-rust)?|ufm-[a-z0-9\-]*|op-[a-z0-9\-]*)\/v.*/ + only: /^(da-server|proxyd|chain-mon|indexer|ci-builder(-rust)?|ufm-[a-z0-9\-]*|op-[a-z0-9\-]*)\/v.*/ branches: ignore: /.*/ - docker_name: op-stack-go - docker_tags: <> - platforms: "linux/amd64,linux/arm64" - requires: - - hold - docker-build: name: op-heartbeat-release filters: @@ -1830,12 +1950,17 @@ workflows: ignore: /.*/ docker_name: op-heartbeat docker_tags: <> - requires: ['op-stack-go-docker-build-release'] + requires: ['hold'] platforms: "linux/amd64,linux/arm64" publish: true release: true context: - oplabs-gcr-release + - check-cross-platform: + name: op-heartbeat-cross-platform + op_component: op-heartbeat + requires: + - op-heartbeat-release - docker-build: name: op-node-docker-release filters: @@ -1845,12 +1970,17 @@ workflows: ignore: /.*/ docker_name: op-node docker_tags: <> - requires: ['op-stack-go-docker-build-release'] + requires: ['hold'] platforms: "linux/amd64,linux/arm64" publish: true release: true context: - oplabs-gcr-release + - check-cross-platform: + name: op-node-cross-platform + op_component: op-node + requires: + - op-node-docker-release - docker-build: name: op-batcher-docker-release filters: @@ -1860,12 +1990,17 @@ workflows: ignore: /.*/ docker_name: op-batcher docker_tags: <> - requires: ['op-stack-go-docker-build-release'] + requires: ['hold'] platforms: "linux/amd64,linux/arm64" publish: true release: true context: - oplabs-gcr-release + - check-cross-platform: + name: op-batcher-cross-platform + op_component: op-batcher + requires: + - op-batcher-docker-release - docker-build: name: op-proposer-docker-release filters: @@ -1875,12 +2010,17 @@ workflows: ignore: /.*/ docker_name: op-proposer docker_tags: <> - requires: ['op-stack-go-docker-build-release'] + requires: ['hold'] platforms: "linux/amd64,linux/arm64" publish: true release: true context: - oplabs-gcr-release + - check-cross-platform: + name: op-proposer-cross-platform + op_component: op-proposer + requires: + - op-proposer-docker-release - docker-build: name: op-challenger-docker-release filters: @@ -1890,12 +2030,17 @@ workflows: ignore: /.*/ docker_name: op-challenger docker_tags: <> - requires: ['op-stack-go-docker-build-release'] + requires: ['hold'] platforms: "linux/amd64,linux/arm64" publish: true release: true context: - oplabs-gcr-release + - check-cross-platform: + name: op-challenger-cross-platform + op_component: op-challenger + requires: + - op-challenger-docker-release - docker-build: name: op-dispute-mon-docker-release filters: @@ -1905,12 +2050,17 @@ workflows: ignore: /.*/ docker_name: op-dispute-mon docker_tags: <> - requires: ['op-stack-go-docker-build-release'] + requires: ['hold'] platforms: "linux/amd64,linux/arm64" publish: true release: true context: - oplabs-gcr-release + - check-cross-platform: + name: op-dispute-mon-cross-platform + op_component: op-dispute-mon + requires: + - op-dispute-mon-docker-release - docker-build: name: op-conductor-docker-release filters: @@ -1920,12 +2070,37 @@ workflows: ignore: /.*/ docker_name: op-conductor docker_tags: <> - requires: ['op-stack-go-docker-build-release'] + requires: ['hold'] + platforms: "linux/amd64,linux/arm64" + publish: true + release: true + context: + - oplabs-gcr-release + - check-cross-platform: + name: op-conductor-cross-platform + op_component: op-conductor + requires: + - op-conductor-docker-release + - docker-build: + name: da-server-docker-release + filters: + tags: + only: /^da-server\/v.*/ + branches: + ignore: /.*/ + docker_name: da-server + docker_tags: <> + requires: ['hold'] platforms: "linux/amd64,linux/arm64" publish: true release: true context: - oplabs-gcr-release + - check-cross-platform: + name: da-server-cross-platform + op_component: da-server + requires: + - da-server-docker-release - docker-build: name: op-ufm-docker-release filters: @@ -2096,23 +2271,34 @@ workflows: context: - slack - scheduled-docker-publish: + develop-sdk-next-tests: when: - equal: [ build_hourly, <> ] + and: + - or: + - equal: [ "develop", <> ] + - equal: [ true, <> ] + - not: + equal: [ scheduled_pipeline, << pipeline.trigger_source >> ] jobs: - - docker-build: # just to warm up the cache (other jobs run in parallel) - name: op-stack-go-docker-build-publish - docker_name: op-stack-go - docker_tags: <>,<> - platforms: "linux/amd64,linux/arm64" + - pnpm-monorepo: + name: pnpm-monorepo context: - - oplabs-gcr - slack + - sdk-next-tests: + name: sdk-next-tests + requires: + - pnpm-monorepo + context: + - slack + + scheduled-docker-publish: + when: + equal: [ build_hourly, <> ] + jobs: - docker-build: name: op-node-docker-publish docker_name: op-node docker_tags: <>,<> - requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -2122,7 +2308,6 @@ workflows: name: op-batcher-docker-publish docker_name: op-batcher docker_tags: <>,<> - requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -2132,7 +2317,6 @@ workflows: name: op-program-docker-publish docker_name: op-program docker_tags: <>,<> - requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -2142,7 +2326,6 @@ workflows: name: op-proposer-docker-publish docker_name: op-proposer docker_tags: <>,<> - requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -2152,7 +2335,6 @@ workflows: name: op-challenger-docker-publish docker_name: op-challenger docker_tags: <>,<> - requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -2162,7 +2344,6 @@ workflows: name: op-dispute-mon-docker-publish docker_name: op-dispute-mon docker_tags: <>,<> - requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -2172,7 +2353,6 @@ workflows: name: op-conductor-docker-publish docker_name: op-conductor docker_tags: <>,<> - requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -2182,7 +2362,6 @@ workflows: name: op-heartbeat-docker-publish docker_name: op-heartbeat docker_tags: <>,<> - requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -2225,15 +2404,16 @@ workflows: - oplabs-gcr - slack - scheduled-bindgen: + scheduled-preimage-reproducibility: when: - equal: [ build_daily, <> ] + or: + - equal: [build_daily, <> ] + # Trigger on manual triggers if explicitly requested + - equal: [ true, << pipeline.parameters.reproducibility_dispatch >> ] jobs: - - bindgen-remote: - context: - - slack - - oplabs-etherscan - - bindgen-test-e2e: + - preimage-reproducibility: + matrix: + parameters: + version: ["0.1.0", "0.2.0", "0.3.0", "1.0.0", "1.1.0"] context: - - slack - - oplabs-etherscan + slack diff --git a/.coderabbit.yml b/.coderabbit.yml index 2b0209adcf38..6e33cda85da8 100644 --- a/.coderabbit.yml +++ b/.coderabbit.yml @@ -16,7 +16,7 @@ reviews: - Removing unnecessary code " auto_review: - enabled: true + enabled: false drafts: false base_branches: - "develop" diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9bfa44258161..c3d58c300f34 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,8 +1,7 @@ # Packages -/packages/chain-mon @ethereum-optimism/devxpod -/packages/common-ts @ethereum-optimism/typescript-reviewers +/packages/chain-mon @ethereum-optimism/security-reviewers +/packages/chain-mon/internal/balance-mon @ethereum-optimism/infra-reviewers /packages/contracts-bedrock @ethereum-optimism/contract-reviewers -/packages/core-utils @ethereum-optimism/legacy-reviewers /packages/sdk @ethereum-optimism/devxpod # Bedrock codebases @@ -17,6 +16,7 @@ /op-heartbeat @ethereum-optimism/go-reviewers /op-node @ethereum-optimism/go-reviewers /op-node/rollup @protolambda @trianglesphere @ajsutton +/op-plasma @ethereum-optimism/go-reviewers /op-preimage @ethereum-optimism/go-reviewers /op-program @ethereum-optimism/go-reviewers /op-proposer @ethereum-optimism/go-reviewers @@ -36,7 +36,6 @@ /indexer @ethereum-optimism/devxpod /infra @ethereum-optimism/infra-reviewers /specs @ethereum-optimism/contract-reviewers @ethereum-optimism/go-reviewers -/endpoint-monitor @ethereum-optimism/infra-reviewers # Don't add owners if only package.json is updated /packages/*/package.json diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index f45efa027414..311595e7ab98 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -4,9 +4,9 @@ runs: using: composite steps: - name: Setup pnpm - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v3 with: - version: 8.6.5 + version: 9 - name: Setup node uses: actions/setup-node@v3 with: diff --git a/.github/mergify.yml b/.github/mergify.yml index 6cda289acf09..ca07ed88ad64 100644 --- a/.github/mergify.yml +++ b/.github/mergify.yml @@ -221,17 +221,6 @@ pull_request_rules: label: add: - A-pkg-chain-mon - - name: Add A-pkg-common-ts label and ecopod reviewers - conditions: - - 'files~=^packages/common-ts/' - - '#label<5' - actions: - label: - add: - - A-pkg-common-ts - request_reviews: - users: - - roninjin10 - name: Add A-pkg-contracts-bedrock label conditions: - 'files~=^packages/contracts-bedrock/' @@ -239,30 +228,6 @@ pull_request_rules: label: add: - A-pkg-contracts-bedrock - - name: Add A-pkg-contracts-ts label - conditions: - - 'files~=^packages/contracts-ts/' - - '#label<5' - actions: - label: - add: - - A-pkg-contracts-ts - - name: Add A-pkg-core-utils label - conditions: - - 'files~=^packages/core-utils/' - - '#label<5' - actions: - label: - add: - - A-pkg-core-utils - - name: Add A-pkg-fee-estimation label - conditions: - - 'files~=^packages/fee-estimation/' - - '#label<5' - actions: - label: - add: - - A-pkg-fee-estimation - name: Add A-pkg-sdk label and ecopod reviewers conditions: - 'files~=^packages/sdk/' @@ -274,14 +239,6 @@ pull_request_rules: request_reviews: users: - roninjin10 - - name: Add A-pkg-web3js-plugin label - conditions: - - 'files~=^packages/web3js-plugin/' - - '#label<5' - actions: - label: - add: - - A-pkg-web3js-plugin - name: Add A-proxyd label conditions: - 'files~=^proxyd/' diff --git a/.github/workflows/release-docker-canary.yml b/.github/workflows/release-docker-canary.yml index 61ddf994f94c..34109152b414 100644 --- a/.github/workflows/release-docker-canary.yml +++ b/.github/workflows/release-docker-canary.yml @@ -22,7 +22,6 @@ jobs: replica-mon: ${{ steps.packages.outputs.replica-mon }} wd-mon: ${{ steps.packages.outputs.wd-mon }} canary-docker-tag: ${{ steps.docker-image-name.outputs.canary-docker-tag }} - endpoint-monitor: ${{ steps.packages.outputs.endpoint-monitor }} steps: - name: Check out source code @@ -204,41 +203,3 @@ jobs: target: replica-mon push: true tags: ethereumoptimism/replica-mon:${{ needs.canary-publish.outputs.canary-docker-tag }} - - endpoint-monitor: - name: Publish endpoint-monitor Version ${{ needs.canary-publish.outputs.canary-docker-tag }} - needs: canary-publish - if: needs.canary-publish.outputs.endpoint-monitor != '' - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }} - password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }} - - - name: Set build args - id: build_args - run: | - echo ::set-output name=GITDATE::"$(date +%d-%m-%Y)" - echo ::set-output name=GITVERSION::$(jq -r .version ./endpoint-monitor/package.json) - echo ::set-output name=GITCOMMIT::"$GITHUB_SHA" - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./endpoint-monitor/Dockerfile - push: true - tags: ethereumoptimism/endpoint-monitor:${{ needs.canary-publish.outputs.endpoint-monitor }} - build-args: | - GITDATE=${{ steps.build_args.outputs.GITDATE }} - GITCOMMIT=${{ steps.build_args.outputs.GITCOMMIT }} - GITVERSION=${{ steps.build_args.outputs.GITVERSION }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 469db26b5d3a..8424d9aa7855 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,6 @@ jobs: multisig-mon: ${{ steps.packages.outputs.multisig-mon }} replica-mon: ${{ steps.packages.outputs.replica-mon }} wd-mon: ${{ steps.packages.outputs.wd-mon }} - endpoint-monitor: ${{ steps.packages.outputs.endpoint-monitor }} # Permissions necessary for Changesets to push a new branch and open PRs # (for automated Version Packages PRs), and request the JWT for provenance. # More info: https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#adding-permissions-settings @@ -241,40 +240,3 @@ jobs: target: replica-mon push: true tags: ethereumoptimism/replica-mon:${{ needs.release.outputs.replica-mon }},ethereumoptimism/replica-mon:latest - - endpoint-monitor: - name: Publish endpoint-monitor Version ${{ needs.release.outputs.endpoint-monitor}} - needs: release - if: needs.release.outputs.endpoint-monitor != '' - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }} - password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }} - - - name: Set build args - id: build_args - run: | - echo ::set-output name=GITDATE::"$(date +%d-%m-%Y)" - echo ::set-output name=GITVERSION::$(jq -r .version ./endpoint-monitor/package.json) - echo ::set-output name=GITCOMMIT::"$GITHUB_SHA" - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./endpoint-monitor/Dockerfile - push: true - tags: ethereumoptimism/endpoint-monitor:${{ needs.release.outputs.endpoint-monitor }},ethereumoptimism/endpoint-monitor:latest - build-args: | - GITDATE=${{ steps.build_args.outputs.GITDATE }} - GITCOMMIT=${{ steps.build_args.outputs.GITCOMMIT }} - GITVERSION=${{ steps.build_args.outputs.GITVERSION }} diff --git a/.github/workflows/slither.yml b/.github/workflows/slither.yml index f8935a75070a..f863b8de60d8 100644 --- a/.github/workflows/slither.yml +++ b/.github/workflows/slither.yml @@ -11,7 +11,7 @@ jobs: slither-analyze: runs-on: ubuntu-latest container: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.43.0 + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.49.0 steps: - uses: actions/checkout@v4 @@ -23,7 +23,7 @@ jobs: run: rm packages/contracts-bedrock/package.json - name: Run Slither - uses: crytic/slither-action@v0.3.1 + uses: crytic/slither-action@v0.4.0 id: slither with: target: packages/contracts-bedrock diff --git a/.github/workflows/tag-service.yml b/.github/workflows/tag-service.yml index 35e2c6d8c805..c825c264242b 100644 --- a/.github/workflows/tag-service.yml +++ b/.github/workflows/tag-service.yml @@ -30,9 +30,11 @@ on: - op-program - op-dispute-mon - op-ufm + - da-server - proxyd - ufm-metamask - op-contracts + - op-conductor prerelease: description: Increment major/minor/patch as prerelease? required: false diff --git a/.gitmodules b/.gitmodules index 5ac336fdb249..0f325f432c65 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,9 +7,6 @@ [submodule "packages/contracts-bedrock/lib/solmate"] path = packages/contracts-bedrock/lib/solmate url = https://github.com/transmissions11/solmate -[submodule "packages/contracts-bedrock/lib/clones-with-immutable-args"] - path = packages/contracts-bedrock/lib/clones-with-immutable-args - url = https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args [submodule "packages/contracts-bedrock/lib/forge-std"] path = packages/contracts-bedrock/lib/forge-std url = https://github.com/foundry-rs/forge-std diff --git a/.vscode/settings.json b/.vscode/settings.json index 1dbca8ebc4df..8768228725a2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,18 +4,6 @@ "editor.formatOnSave": true }, "eslint.workingDirectories": [ - { - "directory": "packages/core-utils", - "changeProcessCWD": true - }, - { - "directory": "packages/common-ts", - "changeProcessCWD": true - }, - { - "directory": "packages/contracts", - "changeProcessCWD": true - }, { "directory": "packages/chain-mon", "changeProcessCWD": true @@ -25,4 +13,4 @@ "eslint.format.enable": true, "editorconfig.generateAuto": false, "files.trimTrailingWhitespace": true -} \ No newline at end of file +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c854c6eb91eb..f27642d2d472 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,19 +37,6 @@ Once ready for review, make sure to include a thorough PR description to help re ### Response time: We aim to provide a meaningful response to all PRs and issues from external contributors within 2 business days. -### Changesets - -We use [changesets](https://github.com/atlassian/changesets) to manage releases of our various packages. -You *must* include a `changeset` file in your PR when making a change that would require a new package release. - -Adding a `changeset` file is easy: - -1. Navigate to the root of the monorepo. -2. Run `pnpm changeset`. You'll be prompted to select packages to include in the changeset. Use the arrow keys to move the cursor up and down, hit the `spacebar` to select a package, and hit `enter` to confirm your selection. Select *all* packages that require a new release as a result of your PR. -3. Once you hit `enter` you'll be prompted to decide whether your selected packages need a `major`, `minor`, or `patch` release. We follow the [Semantic Versioning](https://semver.org/) scheme. Please avoid using `major` releases for any packages that are still in version `0.y.z`. -4. Commit your changeset and push it into your PR. The changeset bot will notice your changeset file and leave a little comment to this effect on GitHub. -5. Voilà, c'est fini! - ### Rebasing We use the `git rebase` command to keep our commit history tidy. diff --git a/Makefile b/Makefile index 2573851088b2..2c85b1c12f31 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ lint-go: .PHONY: lint-go build-ts: submodules - if [ -n "$$NVM_DIR" ]; then \ + if [ -f "$$NVM_DIR/nvm.sh" ]; then \ . $$NVM_DIR/nvm.sh && nvm use; \ fi pnpm install:ci @@ -38,9 +38,57 @@ golang-docker: --progress plain \ --load \ -f docker-bake.hcl \ - op-node op-batcher op-proposer op-challenger + op-node op-batcher op-proposer op-challenger op-dispute-mon .PHONY: golang-docker +docker-builder-clean: + docker buildx rm buildx-build +.PHONY: docker-builder-clean + +docker-builder: + docker buildx create \ + --driver=docker-container --name=buildx-build --bootstrap --use +.PHONY: docker-builder + +# add --print to dry-run +cross-op-node: + # We don't use a buildx builder here, and just load directly into regular docker, for convenience. + GIT_COMMIT=$$(git rev-parse HEAD) \ + GIT_DATE=$$(git show -s --format='%ct') \ + IMAGE_TAGS=$$(git rev-parse HEAD),latest \ + PLATFORMS="linux/arm64" \ + GIT_VERSION=$(shell tags=$$(git tag --points-at $(GITCOMMIT) | grep '^op-node/' | sed 's/op-node\///' | sort -V); \ + preferred_tag=$$(echo "$$tags" | grep -v -- '-rc' | tail -n 1); \ + if [ -z "$$preferred_tag" ]; then \ + if [ -z "$$tags" ]; then \ + echo "untagged"; \ + else \ + echo "$$tags" | tail -n 1; \ + fi \ + else \ + echo $$preferred_tag; \ + fi) \ + docker buildx bake \ + --progress plain \ + --builder=buildx-build \ + --load \ + --no-cache \ + -f docker-bake.hcl \ + op-node +.PHONY: golang-docker + +chain-mon-docker: + # We don't use a buildx builder here, and just load directly into regular docker, for convenience. + GIT_COMMIT=$$(git rev-parse HEAD) \ + GIT_DATE=$$(git show -s --format='%ct') \ + IMAGE_TAGS=$$(git rev-parse HEAD),latest \ + docker buildx bake \ + --progress plain \ + --load \ + -f docker-bake.hcl \ + chain-mon +.PHONY: chain-mon-docker + contracts-bedrock-docker: IMAGE_TAGS=$$(git rev-parse HEAD),latest \ docker buildx bake \ @@ -169,11 +217,6 @@ test-unit: pnpm test .PHONY: test-unit -test-integration: - bash ./ops-bedrock/test-integration.sh \ - ./packages/contracts-bedrock/deployments/devnetL1 -.PHONY: test-integration - # Remove the baseline-commit to generate a base reading & show all issues semgrep: $(eval DEV_REF := $(shell git rev-parse develop)) diff --git a/README.md b/README.md index 9c189f9662c2..0b4b0526ee2e 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,6 @@ The Optimism Immunefi program offers up to $2,000,042 for in-scope critical vuln
 ├── docs: A collection of documents including audits and post-mortems
 ├── op-batcher: L2-Batch Submitter, submits bundles of batches to L1
-├── op-bindings: Go bindings for Bedrock smart contracts.
 ├── op-bootnode: Standalone op-node discovery bootnode
 ├── op-chain-ops: State surgery utilities
 ├── op-challenger: Dispute game challenge agent
@@ -81,13 +80,8 @@ The Optimism Immunefi program offers up to $2,000,042 for in-scope critical vuln
 ├── ops-bedrock: Bedrock devnet work
 ├── packages
 │   ├── chain-mon: Chain monitoring services
-│   ├── common-ts: Common tools for building apps in TypeScript
 │   ├── contracts-bedrock: Bedrock smart contracts
-│   ├── contracts-ts: ABI and Address constants
-│   ├── core-utils: Low-level utilities that make building Optimism easier
-│   ├── fee-estimation: Tools for estimating gas on OP chains
 │   ├── sdk: provides a set of tools for interacting with Optimism
-│   └── web3js-plugin: Adds functions to estimate L1 and L2 gas
 ├── proxyd: Configurable RPC request router and proxy
 ├── specs: Specs of the rollup starting at the Bedrock upgrade
 └── ufm-test-services: Runs a set of tasks to generate metrics
diff --git a/bedrock-devnet/devnet/__init__.py b/bedrock-devnet/devnet/__init__.py
index 09766bdd9c37..c9a4ee03606d 100644
--- a/bedrock-devnet/devnet/__init__.py
+++ b/bedrock-devnet/devnet/__init__.py
@@ -30,6 +30,7 @@
 DEVNET_NO_BUILD = os.getenv('DEVNET_NO_BUILD') == "true"
 DEVNET_FPAC = os.getenv('DEVNET_FPAC') == "true"
 DEVNET_PLASMA = os.getenv('DEVNET_PLASMA') == "true"
+GENERIC_PLASMA = os.getenv('GENERIC_PLASMA') == "true"
 
 class Bunch:
     def __init__(self, **kwds):
@@ -63,7 +64,7 @@ def main():
     devnet_dir = pjoin(monorepo_dir, '.devnet')
     contracts_bedrock_dir = pjoin(monorepo_dir, 'packages', 'contracts-bedrock')
     deployment_dir = pjoin(contracts_bedrock_dir, 'deployments', 'devnetL1')
-    forge_dump_path = pjoin(contracts_bedrock_dir, 'Deploy-900.json')
+    forge_l1_dump_path = pjoin(contracts_bedrock_dir, 'state-dump-900.json')
     op_node_dir = pjoin(args.monorepo_dir, 'op-node')
     ops_bedrock_dir = pjoin(monorepo_dir, 'ops-bedrock')
     deploy_config_dir = pjoin(contracts_bedrock_dir, 'deploy-config')
@@ -77,7 +78,7 @@ def main():
       devnet_dir=devnet_dir,
       contracts_bedrock_dir=contracts_bedrock_dir,
       deployment_dir=deployment_dir,
-      forge_dump_path=forge_dump_path,
+      forge_l1_dump_path=forge_l1_dump_path,
       l1_deployments_path=pjoin(deployment_dir, '.deploy'),
       deploy_config_dir=deploy_config_dir,
       devnet_config_path=devnet_config_path,
@@ -88,7 +89,7 @@ def main():
       sdk_dir=sdk_dir,
       genesis_l1_path=pjoin(devnet_dir, 'genesis-l1.json'),
       genesis_l2_path=pjoin(devnet_dir, 'genesis-l2.json'),
-      allocs_path=pjoin(devnet_dir, 'allocs-l1.json'),
+      allocs_l1_path=pjoin(devnet_dir, 'allocs-l1.json'),
       addresses_json_path=pjoin(devnet_dir, 'addresses.json'),
       sdk_addresses_json_path=pjoin(devnet_dir, 'sdk-addresses.json'),
       rollup_config_path=pjoin(devnet_dir, 'rollup.json')
@@ -102,7 +103,8 @@ def main():
     os.makedirs(devnet_dir, exist_ok=True)
 
     if args.allocs:
-        devnet_l1_genesis(paths)
+        devnet_l1_allocs(paths)
+        devnet_l2_allocs(paths)
         return
 
     git_commit = subprocess.run(['git', 'rev-parse', 'HEAD'], capture_output=True, text=True).stdout.strip()
@@ -130,41 +132,71 @@ def init_devnet_l1_deploy_config(paths, update_timestamp=False):
         deploy_config['l1GenesisBlockTimestamp'] = '{:#x}'.format(int(time.time()))
     if DEVNET_FPAC:
         deploy_config['useFaultProofs'] = True
-        deploy_config['faultGameMaxDuration'] = 10
+        deploy_config['faultGameMaxClockDuration'] = 10
+        deploy_config['faultGameWithdrawalDelay'] = 0
     if DEVNET_PLASMA:
         deploy_config['usePlasma'] = True
+    if GENERIC_PLASMA:
+        deploy_config['daCommitmentType'] = "GenericCommitment"
     write_json(paths.devnet_config_path, deploy_config)
 
-def devnet_l1_genesis(paths):
-    log.info('Generating L1 genesis state')
+def devnet_l1_allocs(paths):
+    log.info('Generating L1 genesis allocs')
     init_devnet_l1_deploy_config(paths)
 
     fqn = 'scripts/Deploy.s.sol:Deploy'
     run_command([
-        'forge', 'script', '--chain-id', '900', fqn, "--sig", "runWithStateDump()"
-    ], env={}, cwd=paths.contracts_bedrock_dir)
+        # We need to set the sender here to an account we know the private key of,
+        # because the sender ends up being the owner of the ProxyAdmin SAFE
+        # (which we need to enable the Custom Gas Token feature).
+        'forge', 'script', fqn, "--sig", "runWithStateDump()", "--sender", "0x90F79bf6EB2c4f870365E785982E1f101E93b906"
+    ], env={
+      'DEPLOYMENT_OUTFILE': paths.l1_deployments_path,
+      'DEPLOY_CONFIG_PATH': paths.devnet_config_path,
+    }, cwd=paths.contracts_bedrock_dir)
 
-    forge_dump = read_json(paths.forge_dump_path)
-    write_json(paths.allocs_path, { "accounts": forge_dump })
-    os.remove(paths.forge_dump_path)
+    shutil.move(src=paths.forge_l1_dump_path, dst=paths.allocs_l1_path)
 
     shutil.copy(paths.l1_deployments_path, paths.addresses_json_path)
 
+
+def devnet_l2_allocs(paths):
+    log.info('Generating L2 genesis allocs, with L1 addresses: '+paths.l1_deployments_path)
+
+    fqn = 'scripts/L2Genesis.s.sol:L2Genesis'
+    run_command([
+        'forge', 'script', fqn, "--sig", "runWithAllUpgrades()"
+    ], env={
+      'CONTRACT_ADDRESSES_PATH': paths.l1_deployments_path,
+      'DEPLOY_CONFIG_PATH': paths.devnet_config_path,
+    }, cwd=paths.contracts_bedrock_dir)
+
+    # For the previous forks, and the latest fork (default, thus empty prefix),
+    # move the forge-dumps into place as .devnet allocs.
+    for suffix in ["-delta", "-ecotone", ""]:
+        input_path = pjoin(paths.contracts_bedrock_dir, f"state-dump-901{suffix}.json")
+        output_path = pjoin(paths.devnet_dir, f'allocs-l2{suffix}.json')
+        shutil.move(src=input_path, dst=output_path)
+        log.info("Generated L2 allocs: "+output_path)
+
+
 # Bring up the devnet where the contracts are deployed to L1
 def devnet_deploy(paths):
     if os.path.exists(paths.genesis_l1_path):
         log.info('L1 genesis already generated.')
     else:
         log.info('Generating L1 genesis.')
-        if os.path.exists(paths.allocs_path) == False or DEVNET_FPAC == True:
+        if not os.path.exists(paths.allocs_l1_path) or DEVNET_FPAC or DEVNET_PLASMA:
             # If this is the FPAC devnet then we need to generate the allocs
             # file here always. This is because CI will run devnet-allocs
             # without DEVNET_FPAC=true which means the allocs will be wrong.
             # Re-running this step means the allocs will be correct.
-            devnet_l1_genesis(paths)
+            devnet_l1_allocs(paths)
+        else:
+            log.info('Re-using existing L1 allocs.')
 
         # It's odd that we want to regenerate the devnetL1.json file with
-        # an updated timestamp different than the one used in the devnet_l1_genesis
+        # an updated timestamp different than the one used in the devnet_l1_allocs
         # function.  But, without it, CI flakes on this test rather consistently.
         # If someone reads this comment and understands why this is being done, please
         # update this comment to explain.
@@ -172,7 +204,7 @@ def devnet_deploy(paths):
         run_command([
             'go', 'run', 'cmd/main.go', 'genesis', 'l1',
             '--deploy-config', paths.devnet_config_path,
-            '--l1-allocs', paths.allocs_path,
+            '--l1-allocs', paths.allocs_l1_path,
             '--l1-deployments', paths.addresses_json_path,
             '--outfile.l1', paths.genesis_l1_path,
         ], cwd=paths.op_node_dir)
@@ -188,10 +220,19 @@ def devnet_deploy(paths):
         log.info('L2 genesis and rollup configs already generated.')
     else:
         log.info('Generating L2 genesis and rollup configs.')
+        l2_allocs_path = pjoin(paths.devnet_dir, 'allocs-l2.json')
+        if os.path.exists(l2_allocs_path) == False or DEVNET_FPAC == True:
+            # Also regenerate if FPAC.
+            # The FPAC flag may affect the L1 deployments addresses, which may affect the L2 genesis.
+            devnet_l2_allocs(paths)
+        else:
+            log.info('Re-using existing L2 allocs.')
+
         run_command([
             'go', 'run', 'cmd/main.go', 'genesis', 'l2',
             '--l1-rpc', 'http://localhost:8545',
             '--deploy-config', paths.devnet_config_path,
+            '--l2-allocs', l2_allocs_path,
             '--l1-deployments', paths.addresses_json_path,
             '--outfile.l2', paths.genesis_l2_path,
             '--outfile.rollup', paths.rollup_config_path
@@ -233,6 +274,19 @@ def devnet_deploy(paths):
     else:
         docker_env['L2OO_ADDRESS'] = l2_output_oracle
 
+    if DEVNET_PLASMA:
+        docker_env['PLASMA_ENABLED'] = 'true'
+    else:
+        docker_env['PLASMA_ENABLED'] = 'false'
+
+    if GENERIC_PLASMA:
+        docker_env['PLASMA_GENERIC_DA'] = 'true'
+        docker_env['PLASMA_DA_SERVICE'] = 'true'
+    else:
+        docker_env['PLASMA_GENERIC_DA'] = 'false'
+        docker_env['PLASMA_DA_SERVICE'] = 'false'
+
+
     # Bring up the rest of the services.
     log.info('Bringing up `op-node`, `op-proposer` and `op-batcher`.')
     run_command(['docker', 'compose', 'up', '-d', 'op-node', 'op-proposer', 'op-batcher', 'artifact-server'], cwd=paths.ops_bedrock_dir, env=docker_env)
@@ -242,6 +296,11 @@ def devnet_deploy(paths):
         log.info('Bringing up `op-challenger`.')
         run_command(['docker', 'compose', 'up', '-d', 'op-challenger'], cwd=paths.ops_bedrock_dir, env=docker_env)
 
+    # Optionally bring up Plasma Mode components.
+    if DEVNET_PLASMA:
+        log.info('Bringing up `da-server`, `sentinel`.') # TODO(10141): We don't have public sentinel images yet
+        run_command(['docker', 'compose', 'up', '-d', 'da-server'], cwd=paths.ops_bedrock_dir, env=docker_env)
+
     # Fin.
     log.info('Devnet ready.')
 
@@ -282,7 +341,7 @@ def devnet_test(paths):
           ['npx', 'hardhat',  'deposit-eth', '--network',  'devnetL1',
            '--l1-contracts-json-path', paths.addresses_json_path, '--signer-index', '15'],
           cwd=paths.sdk_dir, timeout=8*60)
-    ], max_workers=2)
+    ], max_workers=1)
 
 
 def run_commands(commands: list[CommandPreset], max_workers=2):
diff --git a/cannon/Makefile b/cannon/Makefile
index 6e3afdd26524..3accd2e11bc3 100644
--- a/cannon/Makefile
+++ b/cannon/Makefile
@@ -1,6 +1,6 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+VERSION ?= v0.0.0
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
@@ -8,6 +8,11 @@ LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-program/version.Vers
 LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-program/version.Meta=$(VERSION_META)
 LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
 
+# Use the old Apple linker to workaround broken xcode - https://github.com/golang/go/issues/65169
+ifeq ($(shell uname),Darwin)
+	FUZZLDFLAGS := -ldflags=-extldflags=-Wl,-ld_classic
+endif
+
 cannon:
 	env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/cannon .
 
@@ -21,15 +26,15 @@ test: elf
 	go test -v ./...
 
 fuzz:
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateSyscallBrk ./mipsevm
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateSyscallClone ./mipsevm
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateSyscallMmap ./mipsevm
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateSyscallExitGroup ./mipsevm
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateSyscallFnctl ./mipsevm
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateHintRead ./mipsevm
-	go test -run NOTAREALTEST -v -fuzztime 20s -fuzz=FuzzStatePreimageRead ./mipsevm
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateHintWrite ./mipsevm
-	go test -run NOTAREALTEST -v -fuzztime 20s -fuzz=FuzzStatePreimageWrite ./mipsevm
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateSyscallBrk ./mipsevm
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateSyscallClone ./mipsevm
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateSyscallMmap ./mipsevm
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateSyscallExitGroup ./mipsevm
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateSyscallFnctl ./mipsevm
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateHintRead ./mipsevm
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 20s -fuzz=FuzzStatePreimageRead ./mipsevm
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzStateHintWrite ./mipsevm
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 20s -fuzz=FuzzStatePreimageWrite ./mipsevm
 
 .PHONY: \
 	cannon \
diff --git a/cannon/example/claim/go.mod b/cannon/example/claim/go.mod
index 8a286a3e4a05..1f6e8b00f49d 100644
--- a/cannon/example/claim/go.mod
+++ b/cannon/example/claim/go.mod
@@ -7,8 +7,8 @@ toolchain go1.21.1
 require github.com/ethereum-optimism/optimism v0.0.0
 
 require (
-	golang.org/x/crypto v0.21.0 // indirect
-	golang.org/x/sys v0.18.0 // indirect
+	golang.org/x/crypto v0.23.0 // indirect
+	golang.org/x/sys v0.20.0 // indirect
 )
 
 replace github.com/ethereum-optimism/optimism v0.0.0 => ../../..
diff --git a/cannon/example/claim/go.sum b/cannon/example/claim/go.sum
index f5cfc4a02848..7873502bf9e5 100644
--- a/cannon/example/claim/go.sum
+++ b/cannon/example/claim/go.sum
@@ -4,9 +4,9 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
-golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
-golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
-golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
-golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
+golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
+golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
+golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/cannon/mipsevm/README.md b/cannon/mipsevm/README.md
index 163a900ddf98..df7558187992 100644
--- a/cannon/mipsevm/README.md
+++ b/cannon/mipsevm/README.md
@@ -1,23 +1,23 @@
 # `mipsevm`
 
-Supported 55 instructions:
+Supported 63 instructions:
 | Category             | Instruction   | Description                                  |
 |----------------------|---------------|----------------------------------------------|
+| `Arithmetic`         | `add`         | Add.                                         |
 | `Arithmetic`         | `addi`        | Add immediate (with sign-extension).         |
-| `Arithmetic`         | `addiu`       | Add immediate unsigned (no overflow).        |
-| `Arithmetic`         | `addu`        | Add unsigned (no overflow).                  |
+| `Arithmetic`         | `addiu`       | Add immediate unsigned.                      |
+| `Arithmetic`         | `addu`        | Add unsigned.                                |
 | `Logical`            | `and`         | Bitwise AND.                                 |
 | `Logical`            | `andi`        | Bitwise AND immediate.                       |
-| `Branch`             | `b`           | Unconditional branch.                        |
 | `Conditional Branch` | `beq`         | Branch on equal.                             |
-| `Conditional Branch` | `beqz`        | Branch if equal to zero.                     |
 | `Conditional Branch` | `bgez`        | Branch on greater than or equal to zero.     |
 | `Conditional Branch` | `bgtz`        | Branch on greater than zero.                 |
 | `Conditional Branch` | `blez`        | Branch on less than or equal to zero.        |
 | `Conditional Branch` | `bltz`        | Branch on less than zero.                    |
 | `Conditional Branch` | `bne`         | Branch on not equal.                         |
-| `Conditional Branch` | `bnez`        | Branch if not equal to zero.                 |
+| `Logical`            | `clo`         | Count leading ones.                          |
 | `Logical`            | `clz`         | Count leading zeros.                         |
+| `Arithmetic`         | `div`         | Divide.                                      |
 | `Arithmetic`         | `divu`        | Divide unsigned.                             |
 | `Unconditional Jump` | `j`           | Jump.                                        |
 | `Unconditional Jump` | `jal`         | Jump and link.                               |
@@ -25,34 +25,42 @@ Supported 55 instructions:
 | `Unconditional Jump` | `jr`          | Jump register.                               |
 | `Data Transfer`      | `lb`          | Load byte.                                   |
 | `Data Transfer`      | `lbu`         | Load byte unsigned.                          |
+| `Data Transfer`      | `lh`          | Load halfword.                               |
+| `Data Transfer`      | `lhu`         | Load halfword unsigned.                      |
+| `Data Transfer`      | `ll`          | Load linked word.                            |
 | `Data Transfer`      | `lui`         | Load upper immediate.                        |
 | `Data Transfer`      | `lw`          | Load word.                                   |
+| `Data Transfer`      | `lwl`         | Load word left.                              |
 | `Data Transfer`      | `lwr`         | Load word right.                             |
 | `Data Transfer`      | `mfhi`        | Move from HI register.                       |
 | `Data Transfer`      | `mflo`        | Move from LO register.                       |
-| `Data Transfer`      | `move`        | Move between registers.                      |
 | `Data Transfer`      | `movn`        | Move conditional on not zero.                |
 | `Data Transfer`      | `movz`        | Move conditional on zero.                    |
+| `Data Transfer`      | `mthi`        | Move to HI register.                         |
 | `Data Transfer`      | `mtlo`        | Move to LO register.                         |
 | `Arithmetic`         | `mul`         | Multiply (to produce a word result).         |
+| `Arithmetic`         | `mult`        | Multiply.                                    |
 | `Arithmetic`         | `multu`       | Multiply unsigned.                           |
-| `Arithmetic`         | `negu`        | Negate unsigned.                             |
-| `No Op`              | `nop`         | No operation.                                |
-| `Logical`            | `not`         | Bitwise NOT (pseudo-instruction in MIPS).    |
+| `Logical`            | `nor`         | Bitwise NOR.                                 |
 | `Logical`            | `or`          | Bitwise OR.                                  |
 | `Logical`            | `ori`         | Bitwise OR immediate.                        |
 | `Data Transfer`      | `sb`          | Store byte.                                  |
+| `Data Transfer`      | `sc`          | Store conditional.                           |
+| `Data Transfer`      | `sh`          | Store halfword.                              |
 | `Logical`            | `sll`         | Shift left logical.                          |
 | `Logical`            | `sllv`        | Shift left logical variable.                 |
 | `Comparison`         | `slt`         | Set on less than (signed).                   |
 | `Comparison`         | `slti`        | Set on less than immediate.                  |
-| `Comparison`         | `sltiu`       | Set on less than immediate unsigned.        |
+| `Comparison`         | `sltiu`       | Set on less than immediate unsigned.         |
 | `Comparison`         | `sltu`        | Set on less than unsigned.                   |
 | `Logical`            | `sra`         | Shift right arithmetic.                      |
+| `Logical`            | `srav`        | Shift right arithmetic variable.             |
 | `Logical`            | `srl`         | Shift right logical.                         |
 | `Logical`            | `srlv`        | Shift right logical variable.                |
+| `Arithmetic`         | `sub`         | Subtract.                                    |
 | `Arithmetic`         | `subu`        | Subtract unsigned.                           |
 | `Data Transfer`      | `sw`          | Store word.                                  |
+| `Data Transfer`      | `swl`         | Store word left.                             |
 | `Data Transfer`      | `swr`         | Store word right.                            |
 | `Serialization`      | `sync`        | Synchronize shared memory.                   |
 | `System Calls`       | `syscall`     | System call.                                 |
diff --git a/cannon/mipsevm/evm.go b/cannon/mipsevm/evm.go
index 27bd085b70a6..e5111bb6da28 100644
--- a/cannon/mipsevm/evm.go
+++ b/cannon/mipsevm/evm.go
@@ -5,6 +5,8 @@ import (
 	"fmt"
 	"math/big"
 
+	"github.com/ethereum-optimism/optimism/op-chain-ops/foundry"
+
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/consensus"
@@ -15,33 +17,29 @@ import (
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/core/vm"
 	"github.com/ethereum/go-ethereum/params"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 )
 
-// LoadContracts loads the Cannon contracts, from op-bindings package
-func LoadContracts() (*Contracts, error) {
-	var mips, oracle Contract
-	mips.DeployedBytecode.Object = hexutil.MustDecode(bindings.MIPSDeployedBin)
-	oracle.DeployedBytecode.Object = hexutil.MustDecode(bindings.PreimageOracleDeployedBin)
-	return &Contracts{
-		MIPS:   &mips,
-		Oracle: &oracle,
-	}, nil
-}
+// LoadArtifacts loads the Cannon contracts, from the contracts package.
+func LoadArtifacts() (*Artifacts, error) {
+	mips, err := foundry.ReadArtifact("../../packages/contracts-bedrock/forge-artifacts/MIPS.sol/MIPS.json")
+	if err != nil {
+		return nil, fmt.Errorf("failed to load MIPS contract: %w", err)
+	}
 
-type Contract struct {
-	DeployedBytecode struct {
-		Object    hexutil.Bytes `json:"object"`
-		SourceMap string        `json:"sourceMap"`
-	} `json:"deployedBytecode"`
+	oracle, err := foundry.ReadArtifact("../../packages/contracts-bedrock/forge-artifacts/PreimageOracle.sol/PreimageOracle.json")
+	if err != nil {
+		return nil, fmt.Errorf("failed to load Oracle contract: %w", err)
+	}
 
-	// ignore abi,bytecode,etc.
+	return &Artifacts{
+		MIPS:   mips,
+		Oracle: oracle,
+	}, nil
 }
 
-type Contracts struct {
-	MIPS   *Contract
-	Oracle *Contract
+type Artifacts struct {
+	MIPS   *foundry.Artifact
+	Oracle *foundry.Artifact
 }
 
 type Addresses struct {
@@ -51,7 +49,7 @@ type Addresses struct {
 	FeeRecipient common.Address
 }
 
-func NewEVMEnv(contracts *Contracts, addrs *Addresses) (*vm.EVM, *state.StateDB) {
+func NewEVMEnv(artifacts *Artifacts, addrs *Addresses) (*vm.EVM, *state.StateDB) {
 	// Temporary hack until Cancun is activated on mainnet
 	cpy := *params.MainnetChainConfig
 	chainCfg := &cpy // don't modify the global chain config
@@ -72,13 +70,13 @@ func NewEVMEnv(contracts *Contracts, addrs *Addresses) (*vm.EVM, *state.StateDB)
 
 	env := vm.NewEVM(blockContext, vm.TxContext{}, state, chainCfg, vmCfg)
 	// pre-deploy the contracts
-	env.StateDB.SetCode(addrs.Oracle, contracts.Oracle.DeployedBytecode.Object)
+	env.StateDB.SetCode(addrs.Oracle, artifacts.Oracle.DeployedBytecode.Object)
 
 	var mipsCtorArgs [32]byte
 	copy(mipsCtorArgs[12:], addrs.Oracle[:])
-	mipsDeploy := append(hexutil.MustDecode(bindings.MIPSMetaData.Bin), mipsCtorArgs[:]...)
+	mipsDeploy := append(hexutil.MustDecode(artifacts.MIPS.Bytecode.Object.String()), mipsCtorArgs[:]...)
 	startingGas := uint64(30_000_000)
-	_, deployedMipsAddr, leftOverGas, err := env.Create(vm.AccountRef(addrs.Sender), mipsDeploy, startingGas, big.NewInt(0))
+	_, deployedMipsAddr, leftOverGas, err := env.Create(vm.AccountRef(addrs.Sender), mipsDeploy, startingGas, common.U2560)
 	if err != nil {
 		panic(fmt.Errorf("failed to deploy MIPS contract: %w. took %d gas", err, startingGas-leftOverGas))
 	}
diff --git a/cannon/mipsevm/evm_test.go b/cannon/mipsevm/evm_test.go
index 274521edce1e..703dc6e30a61 100644
--- a/cannon/mipsevm/evm_test.go
+++ b/cannon/mipsevm/evm_test.go
@@ -12,7 +12,7 @@ import (
 	"testing"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-chain-ops/foundry"
 	preimage "github.com/ethereum-optimism/optimism/op-preimage"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
@@ -22,8 +22,8 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
-func testContractsSetup(t require.TestingT) (*Contracts, *Addresses) {
-	contracts, err := LoadContracts()
+func testContractsSetup(t require.TestingT) (*Artifacts, *Addresses) {
+	artifacts, err := LoadArtifacts()
 	require.NoError(t, err)
 
 	addrs := &Addresses{
@@ -33,7 +33,7 @@ func testContractsSetup(t require.TestingT) (*Contracts, *Addresses) {
 		FeeRecipient: common.Address{0xaa},
 	}
 
-	return contracts, addrs
+	return artifacts, addrs
 }
 
 func MarkdownTracer() vm.EVMLogger {
@@ -45,11 +45,12 @@ type MIPSEVM struct {
 	evmState    *state.StateDB
 	addrs       *Addresses
 	localOracle PreimageOracle
+	artifacts   *Artifacts
 }
 
-func NewMIPSEVM(contracts *Contracts, addrs *Addresses) *MIPSEVM {
-	env, evmState := NewEVMEnv(contracts, addrs)
-	return &MIPSEVM{env, evmState, addrs, nil}
+func NewMIPSEVM(artifacts *Artifacts, addrs *Addresses) *MIPSEVM {
+	env, evmState := NewEVMEnv(artifacts, addrs)
+	return &MIPSEVM{env, evmState, addrs, nil, artifacts}
 }
 
 func (m *MIPSEVM) SetTracer(tracer vm.EVMLogger) {
@@ -70,14 +71,14 @@ func (m *MIPSEVM) Step(t *testing.T, stepWitness *StepWitness) []byte {
 
 	if stepWitness.HasPreimage() {
 		t.Logf("reading preimage key %x at offset %d", stepWitness.PreimageKey, stepWitness.PreimageOffset)
-		poInput, err := encodePreimageOracleInput(t, stepWitness, LocalContext{}, m.localOracle)
+		poInput, err := encodePreimageOracleInput(t, stepWitness, LocalContext{}, m.localOracle, m.artifacts.Oracle)
 		require.NoError(t, err, "encode preimage oracle input")
-		_, leftOverGas, err := m.env.Call(vm.AccountRef(sender), m.addrs.Oracle, poInput, startingGas, big.NewInt(0))
+		_, leftOverGas, err := m.env.Call(vm.AccountRef(sender), m.addrs.Oracle, poInput, startingGas, common.U2560)
 		require.NoErrorf(t, err, "evm should not fail, took %d gas", startingGas-leftOverGas)
 	}
 
-	input := encodeStepInput(t, stepWitness, LocalContext{})
-	ret, leftOverGas, err := m.env.Call(vm.AccountRef(sender), m.addrs.MIPS, input, startingGas, big.NewInt(0))
+	input := encodeStepInput(t, stepWitness, LocalContext{}, m.artifacts.MIPS)
+	ret, leftOverGas, err := m.env.Call(vm.AccountRef(sender), m.addrs.MIPS, input, startingGas, common.U2560)
 	require.NoError(t, err, "evm should not fail")
 	require.Len(t, ret, 32, "expecting 32-byte state hash")
 	// remember state hash, to check it against state
@@ -95,23 +96,17 @@ func (m *MIPSEVM) Step(t *testing.T, stepWitness *StepWitness) []byte {
 	return evmPost
 }
 
-func encodeStepInput(t *testing.T, wit *StepWitness, localContext LocalContext) []byte {
-	mipsAbi, err := bindings.MIPSMetaData.GetAbi()
-	require.NoError(t, err)
-
-	input, err := mipsAbi.Pack("step", wit.State, wit.MemProof, localContext)
+func encodeStepInput(t *testing.T, wit *StepWitness, localContext LocalContext, mips *foundry.Artifact) []byte {
+	input, err := mips.ABI.Pack("step", wit.State, wit.MemProof, localContext)
 	require.NoError(t, err)
 	return input
 }
 
-func encodePreimageOracleInput(t *testing.T, wit *StepWitness, localContext LocalContext, localOracle PreimageOracle) ([]byte, error) {
+func encodePreimageOracleInput(t *testing.T, wit *StepWitness, localContext LocalContext, localOracle PreimageOracle, oracle *foundry.Artifact) ([]byte, error) {
 	if wit.PreimageKey == ([32]byte{}) {
 		return nil, errors.New("cannot encode pre-image oracle input, witness has no pre-image to proof")
 	}
 
-	preimageAbi, err := bindings.PreimageOracleMetaData.GetAbi()
-	require.NoError(t, err, "failed to load pre-image oracle ABI")
-
 	switch preimage.KeyType(wit.PreimageKey[0]) {
 	case preimage.LocalKeyType:
 		if len(wit.PreimageValue) > 32+8 {
@@ -120,7 +115,7 @@ func encodePreimageOracleInput(t *testing.T, wit *StepWitness, localContext Loca
 		preimagePart := wit.PreimageValue[8:]
 		var tmp [32]byte
 		copy(tmp[:], preimagePart)
-		input, err := preimageAbi.Pack("loadLocalData",
+		input, err := oracle.ABI.Pack("loadLocalData",
 			new(big.Int).SetBytes(wit.PreimageKey[1:]),
 			localContext,
 			tmp,
@@ -130,7 +125,7 @@ func encodePreimageOracleInput(t *testing.T, wit *StepWitness, localContext Loca
 		require.NoError(t, err)
 		return input, nil
 	case preimage.Keccak256KeyType:
-		input, err := preimageAbi.Pack(
+		input, err := oracle.ABI.Pack(
 			"loadKeccak256PreimagePart",
 			new(big.Int).SetUint64(uint64(wit.PreimageOffset)),
 			wit.PreimageValue[8:])
@@ -143,7 +138,7 @@ func encodePreimageOracleInput(t *testing.T, wit *StepWitness, localContext Loca
 		preimage := localOracle.GetPreimage(preimage.Keccak256Key(wit.PreimageKey).PreimageKey())
 		precompile := common.BytesToAddress(preimage[:20])
 		callInput := preimage[20:]
-		input, err := preimageAbi.Pack(
+		input, err := oracle.ABI.Pack(
 			"loadPrecompilePreimagePart",
 			new(big.Int).SetUint64(uint64(wit.PreimageOffset)),
 			precompile,
@@ -255,6 +250,184 @@ func TestEVMSingleStep(t *testing.T) {
 	}
 }
 
+func TestEVMSysWriteHint(t *testing.T) {
+	contracts, addrs := testContractsSetup(t)
+	var tracer vm.EVMLogger
+
+	cases := []struct {
+		name          string
+		memOffset     int      // Where the hint data is stored in memory
+		hintData      []byte   // Hint data stored in memory at memOffset
+		bytesToWrite  int      // How many bytes of hintData to write
+		lastHint      []byte   // The buffer that stores lastHint in the state
+		expectedHints [][]byte // The hints we expect to be processed
+	}{
+		{
+			name:      "write 1 full hint at beginning of page",
+			memOffset: 4096,
+			hintData: []byte{
+				0, 0, 0, 6, // Length prefix
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, // Hint data
+			},
+			bytesToWrite: 10,
+			lastHint:     nil,
+			expectedHints: [][]byte{
+				{0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB},
+			},
+		},
+		{
+			name:      "write 1 full hint across page boundary",
+			memOffset: 4092,
+			hintData: []byte{
+				0, 0, 0, 8, // Length prefix
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB, // Hint data
+			},
+			bytesToWrite: 12,
+			lastHint:     nil,
+			expectedHints: [][]byte{
+				{0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB},
+			},
+		},
+		{
+			name:      "write 2 full hints",
+			memOffset: 5012,
+			hintData: []byte{
+				0, 0, 0, 6, // Length prefix
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, // Hint data
+				0, 0, 0, 8, // Length prefix
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB, // Hint data
+			},
+			bytesToWrite: 22,
+			lastHint:     nil,
+			expectedHints: [][]byte{
+				{0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB},
+				{0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB},
+			},
+		},
+		{
+			name:      "write a single partial hint",
+			memOffset: 4092,
+			hintData: []byte{
+				0, 0, 0, 6, // Length prefix
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, // Hint data
+			},
+			bytesToWrite:  8,
+			lastHint:      nil,
+			expectedHints: nil,
+		},
+		{
+			name:      "write 1 full, 1 partial hint",
+			memOffset: 5012,
+			hintData: []byte{
+				0, 0, 0, 6, // Length prefix
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, // Hint data
+				0, 0, 0, 8, // Length prefix
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB, // Hint data
+			},
+			bytesToWrite: 16,
+			lastHint:     nil,
+			expectedHints: [][]byte{
+				{0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB},
+			},
+		},
+		{
+			name:      "write a single partial hint to large capacity lastHint buffer",
+			memOffset: 4092,
+			hintData: []byte{
+				0, 0, 0, 6, // Length prefix
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, // Hint data
+			},
+			bytesToWrite:  8,
+			lastHint:      make([]byte, 0, 4096),
+			expectedHints: nil,
+		},
+		{
+			name:      "write full hint to large capacity lastHint buffer",
+			memOffset: 5012,
+			hintData: []byte{
+				0, 0, 0, 6, // Length prefix
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, // Hint data
+			},
+			bytesToWrite: 10,
+			lastHint:     make([]byte, 0, 4096),
+			expectedHints: [][]byte{
+				{0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB},
+			},
+		},
+		{
+			name:      "write multiple hints to large capacity lastHint buffer",
+			memOffset: 4092,
+			hintData: []byte{
+				0, 0, 0, 8, // Length prefix
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xCC, // Hint data
+				0, 0, 0, 8, // Length prefix
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB, // Hint data
+			},
+			bytesToWrite: 24,
+			lastHint:     make([]byte, 0, 4096),
+			expectedHints: [][]byte{
+				{0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xCC},
+				{0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB},
+			},
+		},
+		{
+			name:      "write remaining hint data to non-empty lastHint buffer",
+			memOffset: 4092,
+			hintData: []byte{
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xCC, // Hint data
+			},
+			bytesToWrite: 8,
+			lastHint:     []byte{0, 0, 0, 8},
+			expectedHints: [][]byte{
+				{0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xCC},
+			},
+		},
+		{
+			name:      "write partial hint data to non-empty lastHint buffer",
+			memOffset: 4092,
+			hintData: []byte{
+				0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xCC, // Hint data
+			},
+			bytesToWrite:  4,
+			lastHint:      []byte{0, 0, 0, 8},
+			expectedHints: nil,
+		},
+	}
+
+	const (
+		insn = uint32(0x00_00_00_0C) // syscall instruction
+	)
+
+	for _, tt := range cases {
+		t.Run(tt.name, func(t *testing.T) {
+			oracle := hintTrackingOracle{}
+			state := &State{PC: 0, NextPC: 4, Memory: NewMemory()}
+
+			state.LastHint = tt.lastHint
+			state.Registers[2] = sysWrite
+			state.Registers[4] = fdHintWrite
+			state.Registers[5] = uint32(tt.memOffset)
+			state.Registers[6] = uint32(tt.bytesToWrite)
+
+			err := state.Memory.SetMemoryRange(uint32(tt.memOffset), bytes.NewReader(tt.hintData))
+			require.NoError(t, err)
+			state.Memory.SetMemory(0, insn)
+
+			us := NewInstrumentedState(state, &oracle, os.Stdout, os.Stderr)
+			stepWitness, err := us.Step(true)
+			require.NoError(t, err)
+			require.Equal(t, tt.expectedHints, oracle.hints)
+
+			evm := NewMIPSEVM(contracts, addrs)
+			evm.SetTracer(tracer)
+			evmPost := evm.Step(t, stepWitness)
+			goPost := us.state.EncodeWitness()
+			require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(),
+				"mipsevm produced different state than EVM")
+		})
+	}
+}
+
 func TestEVMFault(t *testing.T) {
 	contracts, addrs := testContractsSetup(t)
 	var tracer vm.EVMLogger // no-tracer by default, but see MarkdownTracer
@@ -290,10 +463,10 @@ func TestEVMFault(t *testing.T) {
 				State:    initialState.EncodeWitness(),
 				MemProof: insnProof[:],
 			}
-			input := encodeStepInput(t, stepWitness, LocalContext{})
+			input := encodeStepInput(t, stepWitness, LocalContext{}, contracts.MIPS)
 			startingGas := uint64(30_000_000)
 
-			_, _, err := env.Call(vm.AccountRef(sender), addrs.MIPS, input, startingGas, big.NewInt(0))
+			_, _, err := env.Call(vm.AccountRef(sender), addrs.MIPS, input, startingGas, common.U2560)
 			require.EqualValues(t, err, vm.ErrExecutionReverted)
 			logs := evmState.Logs()
 			require.Equal(t, 0, len(logs))
@@ -398,3 +571,15 @@ func TestClaimEVM(t *testing.T) {
 	require.Equal(t, expectedStdOut, stdOutBuf.String(), "stdout")
 	require.Equal(t, expectedStdErr, stdErrBuf.String(), "stderr")
 }
+
+type hintTrackingOracle struct {
+	hints [][]byte
+}
+
+func (t *hintTrackingOracle) Hint(v []byte) {
+	t.hints = append(t.hints, v)
+}
+
+func (t *hintTrackingOracle) GetPreimage(k [32]byte) []byte {
+	return nil
+}
diff --git a/cannon/mipsevm/fuzz_evm_test.go b/cannon/mipsevm/fuzz_evm_test.go
index 404d4e028af0..3ed3eefb7b38 100644
--- a/cannon/mipsevm/fuzz_evm_test.go
+++ b/cannon/mipsevm/fuzz_evm_test.go
@@ -1,6 +1,8 @@
 package mipsevm
 
 import (
+	"bytes"
+	"math/rand"
 	"os"
 	"testing"
 
@@ -398,7 +400,7 @@ func FuzzStatePreimageRead(f *testing.F) {
 
 func FuzzStateHintWrite(f *testing.F) {
 	contracts, addrs := testContractsSetup(f)
-	f.Fuzz(func(t *testing.T, addr uint32, count uint32) {
+	f.Fuzz(func(t *testing.T, addr uint32, count uint32, randSeed int64) {
 		preimageData := []byte("hello world")
 		state := &State{
 			PC:             0,
@@ -413,12 +415,16 @@ func FuzzStateHintWrite(f *testing.F) {
 			Step:           0,
 			PreimageKey:    preimage.Keccak256Key(crypto.Keccak256Hash(preimageData)).PreimageKey(),
 			PreimageOffset: 0,
-
-			// This is only used by mips.go. The reads a zeroed page-sized buffer when reading hint data from memory.
-			// We pre-allocate a buffer for the read hint data to be copied into.
-			LastHint: make(hexutil.Bytes, PageSize),
+			LastHint:       nil,
 		}
+		// Set random data at the target memory range
+		randBytes, err := randomBytes(randSeed, count)
+		require.NoError(t, err)
+		err = state.Memory.SetMemoryRange(addr, bytes.NewReader(randBytes))
+		require.NoError(t, err)
+		// Set syscall instruction
 		state.Memory.SetMemory(0, syscallInsn)
+
 		preStatePreimageKey := state.PreimageKey
 		preStateRoot := state.Memory.MerkleRoot()
 		expectedRegisters := state.Registers
@@ -502,3 +508,12 @@ func FuzzStatePreimageWrite(f *testing.F) {
 			"mipsevm produced different state than EVM")
 	})
 }
+
+func randomBytes(seed int64, length uint32) ([]byte, error) {
+	r := rand.New(rand.NewSource(seed))
+	randBytes := make([]byte, length)
+	if _, err := r.Read(randBytes); err != nil {
+		return nil, err
+	}
+	return randBytes, nil
+}
diff --git a/cannon/mipsevm/memory.go b/cannon/mipsevm/memory.go
index 600930bd4dce..e0ff042ed0a7 100644
--- a/cannon/mipsevm/memory.go
+++ b/cannon/mipsevm/memory.go
@@ -114,9 +114,6 @@ func (m *Memory) MerkleizeSubtree(gindex uint64) [32]byte {
 			return zeroHashes[28-l] // page does not exist
 		}
 	}
-	if l > PageKeySize+1 {
-		panic("cannot jump into intermediate node of page")
-	}
 	n, ok := m.nodes[gindex]
 	if !ok {
 		// if the node doesn't exist, the whole sub-tree is zeroed
diff --git a/cannon/mipsevm/mips.go b/cannon/mipsevm/mips.go
index 95ab8d75debf..c51d945deeaf 100644
--- a/cannon/mipsevm/mips.go
+++ b/cannon/mipsevm/mips.go
@@ -123,7 +123,7 @@ func (m *InstrumentedState) handleSyscall() error {
 			m.state.LastHint = append(m.state.LastHint, hintData...)
 			for len(m.state.LastHint) >= 4 { // process while there is enough data to check if there are any hints
 				hintLen := binary.BigEndian.Uint32(m.state.LastHint[:4])
-				if hintLen >= uint32(len(m.state.LastHint[4:])) {
+				if hintLen <= uint32(len(m.state.LastHint[4:])) {
 					hint := m.state.LastHint[4 : 4+hintLen] // without the length prefix
 					m.state.LastHint = m.state.LastHint[4+hintLen:]
 					m.preimageOracle.Hint(hint)
@@ -498,7 +498,7 @@ func execute(insn uint32, rs uint32, rt uint32, mem uint32) uint32 {
 			switch fun {
 			case 0x2: // mul
 				return uint32(int32(rs) * int32(rt))
-			case 0x20, 0x21: // clo
+			case 0x20, 0x21: // clz, clo
 				if fun == 0x20 {
 					rs = ^rs
 				}
diff --git a/cannon/mipsevm/patch.go b/cannon/mipsevm/patch.go
index 92b1de74a5b1..64a05e9611a4 100644
--- a/cannon/mipsevm/patch.go
+++ b/cannon/mipsevm/patch.go
@@ -8,13 +8,15 @@ import (
 	"io"
 )
 
+const HEAP_START = 0x05000000
+
 func LoadELF(f *elf.File) (*State, error) {
 	s := &State{
 		PC:        uint32(f.Entry),
 		NextPC:    uint32(f.Entry + 4),
 		HI:        0,
 		LO:        0,
-		Heap:      0x20000000,
+		Heap:      HEAP_START,
 		Registers: [32]uint32{},
 		Memory:    NewMemory(),
 		ExitCode:  0,
@@ -43,6 +45,9 @@ func LoadELF(f *elf.File) (*State, error) {
 		if prog.Vaddr+prog.Memsz >= uint64(1<<32) {
 			return nil, fmt.Errorf("program %d out of 32-bit mem range: %x - %x (size: %x)", i, prog.Vaddr, prog.Vaddr+prog.Memsz, prog.Memsz)
 		}
+		if prog.Vaddr+prog.Memsz >= HEAP_START {
+			return nil, fmt.Errorf("program %d overlaps with heap: %x - %x (size: %x). The heap start offset must be reconfigured", i, prog.Vaddr, prog.Vaddr+prog.Memsz, prog.Memsz)
+		}
 		if err := s.Memory.SetMemoryRange(uint32(prog.Vaddr), r); err != nil {
 			return nil, fmt.Errorf("failed to read program segment %d: %w", i, err)
 		}
diff --git a/cannon/mipsevm/state.go b/cannon/mipsevm/state.go
index fea495218a58..d8a5dcfe9ae2 100644
--- a/cannon/mipsevm/state.go
+++ b/cannon/mipsevm/state.go
@@ -38,7 +38,7 @@ type State struct {
 	// to make sure pre-image requests can be served.
 	// The first 4 bytes are a uin32 length prefix.
 	// Warning: the hint MAY NOT BE COMPLETE. I.e. this is buffered,
-	// and should only be read when len(LastHint) > 4 && uint32(LastHint[:4]) >= len(LastHint[4:])
+	// and should only be read when len(LastHint) > 4 && uint32(LastHint[:4]) <= len(LastHint[4:])
 	LastHint hexutil.Bytes `json:"lastHint,omitempty"`
 }
 
diff --git a/codecov.yml b/codecov.yml
index 52aa7ea38a88..d4aeb396dbc1 100644
--- a/codecov.yml
+++ b/codecov.yml
@@ -38,8 +38,6 @@ flag_management:
         - type: patch
           target: 100%
     - name: bedrock-go-tests
-    - name: common-ts-tests
     - name: contracts-tests
-    - name: core-utils-tests
     - name: chain-mon-tests
     - name: sdk-tests
diff --git a/docker-bake.hcl b/docker-bake.hcl
index 027f2adff683..da8f5fa60b0d 100644
--- a/docker-bake.hcl
+++ b/docker-bake.hcl
@@ -14,8 +14,10 @@ variable "GIT_DATE" {
   default = "0"
 }
 
+// The default version to embed in the built images.
+// During CI release builds this is set to <>
 variable "GIT_VERSION" {
-  default = "docker"  // original default as set in proxyd file, not used by full go stack, yet
+  default = "v0.0.0"
 }
 
 variable "IMAGE_TAGS" {
@@ -27,135 +29,187 @@ variable "PLATFORMS" {
   // Only a specify a single platform when `--load` ing into docker.
   // Multi-platform is supported when outputting to disk or pushing to a registry.
   // Multi-platform builds can be tested locally with:  --set="*.output=type=image,push=false"
-  default = "linux/amd64"
+  default = ""
 }
 
-target "op-stack-go" {
+// Each of the services can have a customized version, but defaults to the global specified version.
+variable "OP_NODE_VERSION" {
+  default = "${GIT_VERSION}"
+}
+
+variable "OP_BATCHER_VERSION" {
+  default = "${GIT_VERSION}"
+}
+
+variable "OP_PROPOSER_VERSION" {
+  default = "${GIT_VERSION}"
+}
+
+variable "OP_CHALLENGER_VERSION" {
+  default = "${GIT_VERSION}"
+}
+
+variable "OP_DISPUTE_MON_VERSION" {
+  default = "${GIT_VERSION}"
+}
+
+variable "OP_HEARTBEAT_VERSION" {
+  default = "${GIT_VERSION}"
+}
+
+variable "OP_PROGRAM_VERSION" {
+  default = "${GIT_VERSION}"
+}
+
+variable "CANNON_VERSION" {
+  default = "${GIT_VERSION}"
+}
+
+variable "OP_CONDUCTOR_VERSION" {
+  default = "${GIT_VERSION}"
+}
+
+
+target "op-node" {
   dockerfile = "ops/docker/op-stack-go/Dockerfile"
   context = "."
   args = {
     GIT_COMMIT = "${GIT_COMMIT}"
     GIT_DATE = "${GIT_DATE}"
+    OP_NODE_VERSION = "${OP_NODE_VERSION}"
   }
-  platforms = split(",", PLATFORMS)
-  tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-stack-go:${tag}"]
-}
-
-target "op-node" {
-  dockerfile = "Dockerfile"
-  context = "./op-node"
-  args = {
-    OP_STACK_GO_BUILDER = "op-stack-go"
-  }
-  contexts = {
-    op-stack-go: "target:op-stack-go"
-  }
+  target = "op-node-target"
   platforms = split(",", PLATFORMS)
   tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-node:${tag}"]
 }
 
 target "op-batcher" {
-  dockerfile = "Dockerfile"
-  context = "./op-batcher"
+  dockerfile = "ops/docker/op-stack-go/Dockerfile"
+  context = "."
   args = {
-    OP_STACK_GO_BUILDER = "op-stack-go"
-  }
-  contexts = {
-    op-stack-go: "target:op-stack-go"
+    GIT_COMMIT = "${GIT_COMMIT}"
+    GIT_DATE = "${GIT_DATE}"
+    OP_BATCHER_VERSION = "${OP_BATCHER_VERSION}"
   }
+  target = "op-batcher-target"
   platforms = split(",", PLATFORMS)
   tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-batcher:${tag}"]
 }
 
 target "op-proposer" {
-  dockerfile = "Dockerfile"
-  context = "./op-proposer"
+  dockerfile = "ops/docker/op-stack-go/Dockerfile"
+  context = "."
   args = {
-    OP_STACK_GO_BUILDER = "op-stack-go"
-  }
-  contexts = {
-    op-stack-go: "target:op-stack-go"
+    GIT_COMMIT = "${GIT_COMMIT}"
+    GIT_DATE = "${GIT_DATE}"
+    OP_PROPOSER_VERSION = "${OP_PROPOSER_VERSION}"
   }
+  target = "op-proposer-target"
   platforms = split(",", PLATFORMS)
   tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-proposer:${tag}"]
 }
 
 target "op-challenger" {
-  dockerfile = "Dockerfile"
-  context = "./op-challenger"
+  dockerfile = "ops/docker/op-stack-go/Dockerfile"
+  context = "."
   args = {
-    OP_STACK_GO_BUILDER = "op-stack-go"
-  }
-  contexts = {
-    op-stack-go: "target:op-stack-go"
+    GIT_COMMIT = "${GIT_COMMIT}"
+    GIT_DATE = "${GIT_DATE}"
+    OP_CHALLENGER_VERSION = "${OP_CHALLENGER_VERSION}"
   }
+  target = "op-challenger-target"
   platforms = split(",", PLATFORMS)
   tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-challenger:${tag}"]
 }
 
 target "op-dispute-mon" {
-  dockerfile = "Dockerfile"
-  context = "./op-dispute-mon"
+  dockerfile = "ops/docker/op-stack-go/Dockerfile"
+  context = "."
   args = {
-    OP_STACK_GO_BUILDER = "op-stack-go"
-  }
-  contexts = {
-    op-stack-go: "target:op-stack-go"
+    GIT_COMMIT = "${GIT_COMMIT}"
+    GIT_DATE = "${GIT_DATE}"
+    OP_DISPUTE_MON_VERSION = "${OP_DISPUTE_MON_VERSION}"
   }
+  target = "op-dispute-mon-target"
   platforms = split(",", PLATFORMS)
   tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-dispute-mon:${tag}"]
 }
 
 target "op-conductor" {
-  dockerfile = "Dockerfile"
-  context = "./op-conductor"
+  dockerfile = "ops/docker/op-stack-go/Dockerfile"
+  context = "."
   args = {
-    OP_STACK_GO_BUILDER = "op-stack-go"
-  }
-  contexts = {
-    op-stack-go: "target:op-stack-go"
+    GIT_COMMIT = "${GIT_COMMIT}"
+    GIT_DATE = "${GIT_DATE}"
+    OP_CONDUCTOR_VERSION = "${OP_CONDUCTOR_VERSION}"
   }
+  target = "op-conductor-target"
   platforms = split(",", PLATFORMS)
   tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-conductor:${tag}"]
 }
 
 target "op-heartbeat" {
-  dockerfile = "Dockerfile"
-  context = "./op-heartbeat"
+  dockerfile = "ops/docker/op-stack-go/Dockerfile"
+  context = "."
   args = {
-    OP_STACK_GO_BUILDER = "op-stack-go"
-  }
-  contexts = {
-    op-stack-go: "target:op-stack-go"
+    GIT_COMMIT = "${GIT_COMMIT}"
+    GIT_DATE = "${GIT_DATE}"
+    OP_HEARTBEAT_VERSION = "${OP_HEARTBEAT_VERSION}"
   }
+  target = "op-heartbeat-target"
   platforms = split(",", PLATFORMS)
   tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-heartbeat:${tag}"]
 }
 
-target "op-program" {
-  dockerfile = "Dockerfile"
-  context = "./op-program"
+target "da-server" {
+  dockerfile = "ops/docker/op-stack-go/Dockerfile"
+  context = "."
   args = {
-    OP_STACK_GO_BUILDER = "op-stack-go"
+    GIT_COMMIT = "${GIT_COMMIT}"
+    GIT_DATE = "${GIT_DATE}"
   }
-  contexts = {
-    op-stack-go: "target:op-stack-go"
+  target = "da-server-target"
+  platforms = split(",", PLATFORMS)
+  tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/da-server:${tag}"]
+}
+
+target "op-program" {
+  dockerfile = "ops/docker/op-stack-go/Dockerfile"
+  context = "."
+  args = {
+    GIT_COMMIT = "${GIT_COMMIT}"
+    GIT_DATE = "${GIT_DATE}"
+    OP_PROGRAM_VERSION = "${OP_PROGRAM_VERSION}"
   }
+  target = "op-program-target"
   platforms = split(",", PLATFORMS)
   tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-program:${tag}"]
 }
 
 target "op-ufm" {
   dockerfile = "./op-ufm/Dockerfile"
-  context = "./"
-  args = {
+  context    = "./"
+  args       = {
     // op-ufm dockerfile has no _ in the args
-    GITCOMMIT = "${GIT_COMMIT}"
-    GITDATE = "${GIT_DATE}"
+    GITCOMMIT  = "${GIT_COMMIT}"
+    GITDATE    = "${GIT_DATE}"
     GITVERSION = "${GIT_VERSION}"
   }
   platforms = split(",", PLATFORMS)
-  tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-ufm:${tag}"]
+  tags      = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-ufm:${tag}"]
+}
+
+target "cannon" {
+  dockerfile = "ops/docker/op-stack-go/Dockerfile"
+  context = "."
+  args = {
+    GIT_COMMIT = "${GIT_COMMIT}"
+    GIT_DATE = "${GIT_DATE}"
+    CANNON_VERSION = "${CANNON_VERSION}"
+  }
+  target = "cannon-target"
+  platforms = split(",", PLATFORMS)
+  tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/cannon:${tag}"]
 }
 
 target "proxyd" {
diff --git a/docs/fault-proof-alpha/run-challenger.md b/docs/fault-proof-alpha/run-challenger.md
index 93017acac84c..9c9c2ff9a487 100644
--- a/docs/fault-proof-alpha/run-challenger.md
+++ b/docs/fault-proof-alpha/run-challenger.md
@@ -45,7 +45,7 @@ make op-challenger op-program cannon
   --cannon-bin ./cannon/bin/cannon \
   --cannon-server ./op-program/bin/op-program \
   --cannon-prestate  \
-  --cannon-l2  \
+  --l2-eth-rpc  \
   --private-key 
 ```
 
diff --git a/docs/postmortems/2022-02-02-inflation-vuln.md b/docs/postmortems/2022-02-02-inflation-vuln.md
index 5b25206f55e7..11574eed70c2 100644
--- a/docs/postmortems/2022-02-02-inflation-vuln.md
+++ b/docs/postmortems/2022-02-02-inflation-vuln.md
@@ -270,7 +270,7 @@ still there are opportunities to better document the proper process internally.
 ### Public disclosure
 
 Moving forward, we will adopt a process similar to the Geth team’s
-[silent patch policy](https://geth.ethereum.org/docs/vulnerabilities/vulnerabilities#why-silent-patches).
+[silent patch policy](https://geth.ethereum.org/docs/developers/geth-developer/disclosures#why-silent-patches).
 
 This means that we reserve the right to hide the fix, and delay the public announcement. We also
 reserve the right to directly notify a subset of downstream users prior to the public announcement.
diff --git a/docs/security-reviews/2024_05_SafeLivenessExtensions-Cantina.pdf b/docs/security-reviews/2024_05_SafeLivenessExtensions-Cantina.pdf
new file mode 100644
index 000000000000..13637137a507
Binary files /dev/null and b/docs/security-reviews/2024_05_SafeLivenessExtensions-Cantina.pdf differ
diff --git a/endpoint-monitor/.env.example b/endpoint-monitor/.env.example
deleted file mode 100644
index 4eea7042985d..000000000000
--- a/endpoint-monitor/.env.example
+++ /dev/null
@@ -1,4 +0,0 @@
-export ENDPOINT_MONITOR_LOG_LEVEL=debug
-export ENDPOINT_MONITOR_PROVIDERS=goerli,mainnet
-export ENDPOINT_MONITOR_GOERLI_URL=wss://ws-goerli.optimism.io
-export ENDPOINT_MONITOR_MAINNET_URL=wss://ws-mainnet.optimism.io
diff --git a/endpoint-monitor/CHANGELOG.md b/endpoint-monitor/CHANGELOG.md
deleted file mode 100644
index bff3b3cc3a3e..000000000000
--- a/endpoint-monitor/CHANGELOG.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# @eth-optimism/endpoint-monitor
-
-## 1.0.3
-
-### Patch Changes
-
-- [#7450](https://github.com/ethereum-optimism/optimism/pull/7450) [`ac90e16a7`](https://github.com/ethereum-optimism/optimism/commit/ac90e16a7f85c4f73661ae6023135c3d00421c1e) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated dev dependencies related to testing that is causing audit tooling to report failures
-
-## 1.0.2
-
-### Patch Changes
-
-- [#6164](https://github.com/ethereum-optimism/optimism/pull/6164) [`c11039060`](https://github.com/ethereum-optimism/optimism/commit/c11039060bc037a88916c2cba602687b6d69ad1a) Thanks [@pengin7384](https://github.com/pengin7384)! - fix typo
-
-## 1.0.1
-
-### Patch Changes
-
-- f505078be: Update go-ethereum to v1.10.26
-
-## 1.0.0
-
-### Major Changes
-
-- a10c2b49: Initial release of endpoint monitor
diff --git a/endpoint-monitor/Dockerfile b/endpoint-monitor/Dockerfile
deleted file mode 100644
index 1865f1dfb78d..000000000000
--- a/endpoint-monitor/Dockerfile
+++ /dev/null
@@ -1,31 +0,0 @@
-FROM golang:1.21.1-alpine3.18 as builder
-
-RUN apk --no-cache add make jq bash git alpine-sdk
-
-COPY ./go.mod /app/go.mod
-COPY ./go.sum /app/go.sum
-
-WORKDIR /app
-
-RUN go mod download
-
-COPY ./endpoint-monitor /app/endpoint-monitor
-COPY ./op-service /app/op-service
-COPY ./op-node /app/op-node
-
-COPY ./.git /app/.git
-
-WORKDIR /app/endpoint-monitor
-
-RUN make build
-
-FROM alpine:3.18
-RUN apk --no-cache add ca-certificates
-
-RUN addgroup -S app && adduser -S app -G app
-USER app
-WORKDIR /app
-
-COPY --from=builder /app/endpoint-monitor/bin/endpoint-monitor /app
-
-ENTRYPOINT ["/app/endpoint-monitor"]
diff --git a/endpoint-monitor/README.md b/endpoint-monitor/README.md
deleted file mode 100644
index be02148f3c03..000000000000
--- a/endpoint-monitor/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# @eth-optimism/endpoint-monitor
-
-The endpoint-monitor runs websocket checks on edge-proxyd endpoints and downstream infra provider endpoints.
-
-## Setup
-
-Install go1.19
-
-```bash
-make build
-
-source .env.example # (or copy to .envrc if using direnv)
-./bin/endpoint-monitor
-```
diff --git a/endpoint-monitor/cmd/main.go b/endpoint-monitor/cmd/main.go
deleted file mode 100644
index 4a7599488f0d..000000000000
--- a/endpoint-monitor/cmd/main.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package main
-
-import (
-	"os"
-
-	opservice "github.com/ethereum-optimism/optimism/op-service"
-	oplog "github.com/ethereum-optimism/optimism/op-service/log"
-	"github.com/ethereum/go-ethereum/log"
-	"github.com/urfave/cli/v2"
-
-	endpointMonitor "github.com/ethereum-optimism/optimism/endpoint-monitor"
-)
-
-var (
-	Version   = ""
-	GitCommit = ""
-	GitDate   = ""
-)
-
-func main() {
-	oplog.SetupDefaults()
-
-	app := cli.NewApp()
-	app.Flags = endpointMonitor.CLIFlags("ENDPOINT_MONITOR")
-	app.Version = opservice.FormatVersion(Version, GitCommit, GitDate, "")
-	app.Name = "endpoint-monitor"
-	app.Usage = "Endpoint Monitoring Service"
-	app.Description = ""
-
-	app.Action = endpointMonitor.Main(Version)
-	err := app.Run(os.Args)
-	if err != nil {
-		log.Crit("Application failed", "message", err)
-	}
-}
diff --git a/endpoint-monitor/config.go b/endpoint-monitor/config.go
deleted file mode 100644
index 8f2f85c715c3..000000000000
--- a/endpoint-monitor/config.go
+++ /dev/null
@@ -1,97 +0,0 @@
-package app
-
-import (
-	"fmt"
-	"os"
-	"strings"
-	"time"
-
-	opservice "github.com/ethereum-optimism/optimism/op-service"
-	oplog "github.com/ethereum-optimism/optimism/op-service/log"
-	opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
-	"github.com/urfave/cli/v2"
-)
-
-type ProviderConfig struct {
-	Name string
-	Url  string
-}
-
-const (
-	ProvidersFlagName     = "providers"
-	CheckIntervalFlagName = "check-interval"
-	CheckDurationFlagName = "check-duration"
-)
-
-func CLIFlags(envPrefix string) []cli.Flag {
-	prefixEnvVars := func(name string) []string {
-		return opservice.PrefixEnvVar(envPrefix, name)
-	}
-	flags := []cli.Flag{
-		&cli.StringSliceFlag{
-			Name:     ProvidersFlagName,
-			Usage:    "List of providers",
-			Required: true,
-			EnvVars:  prefixEnvVars("PROVIDERS"),
-		},
-		&cli.DurationFlag{
-			Name:    CheckIntervalFlagName,
-			Usage:   "Check interval duration",
-			Value:   5 * time.Minute,
-			EnvVars: prefixEnvVars("CHECK_INTERVAL"),
-		},
-		&cli.DurationFlag{
-			Name:    CheckDurationFlagName,
-			Usage:   "Check duration",
-			Value:   4 * time.Minute,
-			EnvVars: prefixEnvVars("CHECK_DURATION"),
-		},
-	}
-	flags = append(flags, opmetrics.CLIFlags(envPrefix)...)
-	flags = append(flags, oplog.CLIFlags(envPrefix)...)
-	return flags
-}
-
-type Config struct {
-	Providers     []string
-	CheckInterval time.Duration
-	CheckDuration time.Duration
-
-	LogConfig     oplog.CLIConfig
-	MetricsConfig opmetrics.CLIConfig
-}
-
-func (c Config) Check() error {
-	if c.CheckDuration >= c.CheckInterval {
-		return fmt.Errorf("%s must be less than %s", CheckDurationFlagName, CheckIntervalFlagName)
-	}
-	if err := c.MetricsConfig.Check(); err != nil {
-		return err
-	}
-	return nil
-}
-
-func NewConfig(ctx *cli.Context) Config {
-	return Config{
-		Providers:     ctx.StringSlice(ProvidersFlagName),
-		CheckInterval: ctx.Duration(CheckIntervalFlagName),
-		CheckDuration: ctx.Duration(CheckDurationFlagName),
-		LogConfig:     oplog.ReadCLIConfig(ctx),
-		MetricsConfig: opmetrics.ReadCLIConfig(ctx),
-	}
-}
-
-// GetProviderConfigs fetches endpoint provider configurations from the environment
-// Each provider should have a corresponding env var with the url, ex: PROVIDER1_URL=
-func (c Config) GetProviderConfigs() []ProviderConfig {
-	result := make([]ProviderConfig, 0)
-	for _, provider := range c.Providers {
-		envKey := fmt.Sprintf("ENDPOINT_MONITOR_%s_URL", strings.ToUpper(provider))
-		url := os.Getenv(envKey)
-		if url == "" {
-			panic(fmt.Sprintf("%s is not set", envKey))
-		}
-		result = append(result, ProviderConfig{Name: provider, Url: url})
-	}
-	return result
-}
diff --git a/endpoint-monitor/endpoint_monitor.go b/endpoint-monitor/endpoint_monitor.go
deleted file mode 100644
index b08b8c199e59..000000000000
--- a/endpoint-monitor/endpoint_monitor.go
+++ /dev/null
@@ -1,141 +0,0 @@
-package app
-
-import (
-	"context"
-	"fmt"
-	"strings"
-	"time"
-
-	"github.com/pkg/errors"
-	"github.com/prometheus/client_golang/prometheus"
-	"github.com/urfave/cli/v2"
-
-	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/ethclient"
-	"github.com/ethereum/go-ethereum/log"
-
-	oplog "github.com/ethereum-optimism/optimism/op-service/log"
-	opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
-	"github.com/ethereum-optimism/optimism/op-service/opio"
-)
-
-var (
-	MetricWsSubscribeStatus = prometheus.NewCounterVec(
-		prometheus.CounterOpts{
-			Name: "ws_subscribe_status",
-			Help: "eth_subscribe over websocket check status"},
-		[]string{"status", "provider", "error"},
-	)
-)
-
-func Main(version string) func(cliCtx *cli.Context) error {
-	return func(cliCtx *cli.Context) error {
-		cfg := NewConfig(cliCtx)
-		if err := cfg.Check(); err != nil {
-			return fmt.Errorf("invalid CLI flags: %w", err)
-		}
-
-		l := oplog.NewLogger(oplog.AppOut(cliCtx), cfg.LogConfig)
-		oplog.SetGlobalLogHandler(l.Handler())
-
-		endpointMonitor := NewEndpointMonitor(cfg, l)
-		l.Info(fmt.Sprintf("starting endpoint monitor with checkInterval=%s checkDuration=%s", cfg.CheckInterval, cfg.CheckDuration))
-		endpointMonitor.Start()
-
-		registry := opmetrics.NewRegistry()
-		registry.MustRegister(MetricWsSubscribeStatus)
-		metricsCfg := cfg.MetricsConfig
-
-		l.Info("starting metrics server", "addr", metricsCfg.ListenAddr, "port", metricsCfg.ListenPort)
-		srv, err := opmetrics.StartServer(registry, metricsCfg.ListenAddr, metricsCfg.ListenPort)
-		if err != nil {
-			l.Error("error starting metrics server", err)
-			return err
-		}
-		defer func() {
-			if err := srv.Stop(cliCtx.Context); err != nil {
-				l.Error("failed to stop metrics server", "err", err)
-			}
-		}()
-		opio.BlockOnInterrupts()
-
-		return nil
-	}
-}
-
-type EndpointMonitor struct {
-	cfg    Config
-	logger log.Logger
-}
-
-func NewEndpointMonitor(cfg Config, l log.Logger) EndpointMonitor {
-	return EndpointMonitor{cfg: cfg, logger: l}
-}
-
-func (e EndpointMonitor) Start() {
-	for _, providerConfig := range e.cfg.GetProviderConfigs() {
-		go e.runWebsocketCheckLoop(providerConfig, e.cfg.CheckInterval, e.cfg.CheckDuration)
-	}
-}
-
-// getWrappingErrorMsg returns the most recently wrapped error message
-// it's used in this case to get the error type reported by runSubscribeCallCheck
-func getWrappingErrorMsg(err error) string {
-	cause := errors.Cause(err)
-	return strings.TrimSuffix(err.Error(), fmt.Sprintf(": %s", cause.Error()))
-}
-
-// runWebsocketCheckLoop runs subscribe call checks every checkInterval and reports status metrics to prometheus
-func (e EndpointMonitor) runWebsocketCheckLoop(p ProviderConfig, checkInterval, checkDuration time.Duration) {
-	ticker := time.NewTicker(checkInterval)
-	defer ticker.Stop()
-
-	for {
-		e.logger.Info("running websocket check", "provider", p.Name)
-		err := e.runWebsocketCheck(p, checkDuration)
-		if err != nil {
-			errType := getWrappingErrorMsg(err)
-			MetricWsSubscribeStatus.With(prometheus.Labels{"provider": p.Name, "status": "error", "error": errType}).Inc()
-			e.logger.Error("finished websocket check", "provider", p.Name, "error", errType)
-		} else {
-			MetricWsSubscribeStatus.With(prometheus.Labels{"provider": p.Name, "status": "success", "error": ""}).Inc()
-			e.logger.Info("finished websocket check", "provider", p.Name)
-		}
-		<-ticker.C
-	}
-}
-
-// runWebsocketCheck creates a client and subscribes to blockchain head notifications and returns any errors encountered for reporting
-func (e EndpointMonitor) runWebsocketCheck(p ProviderConfig, duration time.Duration) error {
-	client, err := ethclient.Dial(p.Url)
-	if err != nil {
-		return errors.Wrap(err, "dial")
-	}
-	defer client.Close()
-
-	headers := make(chan *types.Header)
-	sub, err := client.SubscribeNewHead(context.Background(), headers)
-	if err != nil {
-		return errors.Wrap(err, "eth_subscribe_failed")
-	}
-
-	receivedData := false
-	ticker := time.NewTicker(duration)
-	defer ticker.Stop()
-
-	for {
-		select {
-		case <-ticker.C:
-			sub.Unsubscribe()
-			if !receivedData {
-				return errors.New("nodata")
-			}
-			return nil
-		case err := <-sub.Err():
-			return errors.Wrap(err, "read")
-		case header := <-headers:
-			e.logger.Debug(header.Hash().Hex(), "provider", p.Name)
-			receivedData = true
-		}
-	}
-}
diff --git a/endpoint-monitor/package.json b/endpoint-monitor/package.json
deleted file mode 100644
index 9e3a4ea705a9..000000000000
--- a/endpoint-monitor/package.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "name": "@eth-optimism/endpoint-monitor",
-  "version": "1.0.3",
-  "private": true,
-  "dependencies": {}
-}
diff --git a/go.mod b/go.mod
index 720aa7f84bd7..5fab53a850c2 100644
--- a/go.mod
+++ b/go.mod
@@ -4,15 +4,17 @@ go 1.21
 
 require (
 	github.com/BurntSushi/toml v1.3.2
+	github.com/DataDog/zstd v1.5.2
+	github.com/andybalholm/brotli v1.1.0
 	github.com/btcsuite/btcd v0.24.0
 	github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0
 	github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4
 	github.com/consensys/gnark-crypto v0.12.1
 	github.com/crate-crypto/go-kzg-4844 v0.7.0
-	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0
+	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0
 	github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3
-	github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240306093353-c557df8e6f41
-	github.com/ethereum/go-ethereum v1.13.8
+	github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240522134500-19555bdbdc95
+	github.com/ethereum/go-ethereum v1.13.15
 	github.com/fsnotify/fsnotify v1.7.0
 	github.com/go-chi/chi/v5 v5.0.12
 	github.com/go-chi/docgen v1.2.0
@@ -27,15 +29,16 @@ require (
 	github.com/holiman/uint256 v1.2.4
 	github.com/ipfs/go-datastore v0.6.0
 	github.com/ipfs/go-ds-leveldb v0.5.0
-	github.com/jackc/pgtype v1.14.2
-	github.com/jackc/pgx/v5 v5.5.5
+	github.com/jackc/pgtype v1.14.3
+	github.com/jackc/pgx/v5 v5.6.0
 	github.com/libp2p/go-libp2p v0.32.0
 	github.com/libp2p/go-libp2p-mplex v0.9.0
-	github.com/libp2p/go-libp2p-pubsub v0.10.0
+	github.com/libp2p/go-libp2p-pubsub v0.10.1
 	github.com/libp2p/go-libp2p-testing v0.12.0
 	github.com/mattn/go-isatty v0.0.20
+	github.com/minio/minio-go/v7 v7.0.70
 	github.com/multiformats/go-base32 v0.1.0
-	github.com/multiformats/go-multiaddr v0.12.2
+	github.com/multiformats/go-multiaddr v0.12.4
 	github.com/multiformats/go-multiaddr-dns v0.3.1
 	github.com/olekukonko/tablewriter v0.0.5
 	github.com/onsi/gomega v1.31.1
@@ -44,17 +47,16 @@ require (
 	github.com/prometheus/client_golang v1.19.0
 	github.com/stretchr/testify v1.9.0
 	github.com/urfave/cli/v2 v2.27.1
-	golang.org/x/crypto v0.21.0
-	golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa
+	golang.org/x/crypto v0.23.0
+	golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3
 	golang.org/x/sync v0.6.0
-	golang.org/x/term v0.18.0
+	golang.org/x/term v0.20.0
 	golang.org/x/time v0.5.0
 	gorm.io/driver/postgres v1.5.7
-	gorm.io/gorm v1.25.7
+	gorm.io/gorm v1.25.10
 )
 
 require (
-	github.com/DataDog/zstd v1.5.2 // indirect
 	github.com/Microsoft/go-winio v0.6.1 // indirect
 	github.com/VictoriaMetrics/fastcache v1.12.1 // indirect
 	github.com/allegro/bigcache v1.2.1 // indirect
@@ -81,22 +83,26 @@ require (
 	github.com/deckarep/golang-set/v2 v2.1.0 // indirect
 	github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect
 	github.com/deepmap/oapi-codegen v1.8.2 // indirect
+	github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de // indirect
 	github.com/dlclark/regexp2 v1.7.0 // indirect
 	github.com/docker/go-units v0.5.0 // indirect
 	github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 // indirect
+	github.com/dustin/go-humanize v1.0.1 // indirect
 	github.com/elastic/gosigar v0.14.2 // indirect
 	github.com/ethereum/c-kzg-4844 v0.4.0 // indirect
-	github.com/fatih/color v1.13.0 // indirect
+	github.com/fatih/color v1.15.0 // indirect
 	github.com/felixge/fgprof v0.9.3 // indirect
-	github.com/fjl/memsize v0.0.1 // indirect
+	github.com/ferranbt/fastssz v0.1.2 // indirect
+	github.com/fjl/memsize v0.0.2 // indirect
 	github.com/flynn/noise v1.0.0 // indirect
 	github.com/francoispqt/gojay v1.2.13 // indirect
 	github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect
 	github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect
 	github.com/getsentry/sentry-go v0.18.0 // indirect
-	github.com/go-ole/go-ole v1.2.6 // indirect
+	github.com/go-ole/go-ole v1.3.0 // indirect
 	github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
 	github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
+	github.com/goccy/go-json v0.10.2 // indirect
 	github.com/godbus/dbus/v5 v5.1.0 // indirect
 	github.com/gofrs/flock v0.8.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
@@ -104,7 +110,7 @@ require (
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/google/gopacket v1.1.19 // indirect
 	github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b // indirect
-	github.com/gorilla/websocket v1.5.0 // indirect
+	github.com/gorilla/websocket v1.5.1 // indirect
 	github.com/graph-gophers/graphql-go v1.3.0 // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
 	github.com/hashicorp/go-bexpr v0.1.11 // indirect
@@ -114,7 +120,7 @@ require (
 	github.com/hashicorp/go-msgpack/v2 v2.1.1 // indirect
 	github.com/hashicorp/golang-lru v0.5.0 // indirect
 	github.com/hashicorp/golang-lru/arc/v2 v2.0.5 // indirect
-	github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect
+	github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect
 	github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
 	github.com/huin/goupnp v1.3.0 // indirect
 	github.com/influxdata/influxdb-client-go/v2 v2.4.0 // indirect
@@ -133,7 +139,7 @@ require (
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c // indirect
-	github.com/klauspost/compress v1.17.2 // indirect
+	github.com/klauspost/compress v1.17.6 // indirect
 	github.com/klauspost/cpuid/v2 v2.2.6 // indirect
 	github.com/koron/go-ssdp v0.0.4 // indirect
 	github.com/kr/pretty v0.3.1 // indirect
@@ -155,6 +161,7 @@ require (
 	github.com/miekg/dns v1.1.56 // indirect
 	github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
 	github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
+	github.com/minio/md5-simd v1.1.2 // indirect
 	github.com/minio/sha256-simd v1.0.1 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/mitchellh/pointerstructure v1.2.1 // indirect
@@ -169,6 +176,7 @@ require (
 	github.com/multiformats/go-varint v0.0.7 // indirect
 	github.com/naoina/go-stringutil v0.1.0 // indirect
 	github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 // indirect
+	github.com/nxadm/tail v1.4.11 // indirect
 	github.com/onsi/ginkgo/v2 v2.15.0 // indirect
 	github.com/opencontainers/runtime-spec v1.1.0 // indirect
 	github.com/opentracing/opentracing-go v1.2.0 // indirect
@@ -186,6 +194,7 @@ require (
 	github.com/rivo/uniseg v0.4.3 // indirect
 	github.com/rogpeppe/go-internal v1.10.0 // indirect
 	github.com/rs/cors v1.9.0 // indirect
+	github.com/rs/xid v1.5.0 // indirect
 	github.com/russross/blackfriday/v2 v2.1.0 // indirect
 	github.com/shirou/gopsutil v3.21.11+incompatible // indirect
 	github.com/spaolacci/murmur3 v1.1.0 // indirect
@@ -197,7 +206,7 @@ require (
 	github.com/tklauser/numcpus v0.6.1 // indirect
 	github.com/tyler-smith/go-bip39 v1.1.0 // indirect
 	github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
-	github.com/yusufpapurcu/wmi v1.2.2 // indirect
+	github.com/yusufpapurcu/wmi v1.2.3 // indirect
 	go.uber.org/automaxprocs v1.5.2 // indirect
 	go.uber.org/dig v1.17.1 // indirect
 	go.uber.org/fx v1.20.1 // indirect
@@ -205,11 +214,12 @@ require (
 	go.uber.org/multierr v1.11.0 // indirect
 	go.uber.org/zap v1.26.0 // indirect
 	golang.org/x/mod v0.14.0 // indirect
-	golang.org/x/net v0.21.0 // indirect
-	golang.org/x/sys v0.18.0 // indirect
-	golang.org/x/text v0.14.0 // indirect
-	golang.org/x/tools v0.16.1 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.20.0 // indirect
+	golang.org/x/text v0.15.0 // indirect
+	golang.org/x/tools v0.17.0 // indirect
 	google.golang.org/protobuf v1.32.0 // indirect
+	gopkg.in/ini.v1 v1.67.0 // indirect
 	gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
@@ -217,8 +227,8 @@ require (
 	rsc.io/tmplfunc v0.0.3 // indirect
 )
 
-replace github.com/ethereum/go-ethereum v1.13.8 => github.com/ethereum-optimism/op-geth v1.101308.3-rc.1
+replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101315.1-rc.5
 
-// replace github.com/ethereum-optimism/superchain-registry/superchain => ../superchain-registry/superchain
+//replace github.com/ethereum/go-ethereum v1.13.9 => ../op-geth
 
-//replace github.com/ethereum/go-ethereum v1.13.5 => ../go-ethereum
+// replace github.com/ethereum-optimism/superchain-registry/superchain => ../superchain-registry/superchain
diff --git a/go.sum b/go.sum
index c8764e56fb3e..75a080721211 100644
--- a/go.sum
+++ b/go.sum
@@ -19,6 +19,7 @@ github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwS
 github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
 github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
 github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40=
 github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o=
 github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
@@ -29,6 +30,8 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
 github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
 github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc=
 github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
+github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
+github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
 github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
 github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg=
 github.com/armon/go-metrics v0.3.8/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
@@ -141,17 +144,18 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn
 github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
 github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
 github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=
 github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M=
 github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU=
 github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw=
 github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8=
 github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE=
-github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po=
-github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
+github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA=
+github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
 github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
 github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo=
 github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
@@ -163,25 +167,29 @@ github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5R
 github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4=
 github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y=
 github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM=
-github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
 github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
 github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4=
 github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
 github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z8veEq5ZO3DfIhZ7xgRP9WTc=
 github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs=
-github.com/ethereum-optimism/op-geth v1.101308.3-rc.1 h1:mC8PrDNTZJr7sYcm+FgaWFUy/LOZ0sS8+BxkglUoPkg=
-github.com/ethereum-optimism/op-geth v1.101308.3-rc.1/go.mod h1:k0UbrLuOITLD8goCyA2xWebAL03n2BZUCfwos0rxz60=
-github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240306093353-c557df8e6f41 h1:WKJvsRyW/YNgyT0P2x5U530ITOY8Dv9TrZnbliqSXd8=
-github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240306093353-c557df8e6f41/go.mod h1:7xh2awFQqsiZxFrHKTgEd+InVfDRrkKVUIuK8SAFHp0=
+github.com/ethereum-optimism/op-geth v1.101315.1-rc.5 h1:yaBvV/GfDuZOecDsGXyzsa/g8+AEBG+Bj1+NFyZRkdw=
+github.com/ethereum-optimism/op-geth v1.101315.1-rc.5/go.mod h1:8tQ6r0e1NNJbSVHzYKafQqf62gV9BzZR+SKkXRckjLM=
+github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240522134500-19555bdbdc95 h1:GjXKQg6u6WkEIcY0dvW2IKhMRY8cVjwdw+rNKhduAo8=
+github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240522134500-19555bdbdc95/go.mod h1:7xh2awFQqsiZxFrHKTgEd+InVfDRrkKVUIuK8SAFHp0=
 github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY=
 github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
-github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
+github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
+github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
 github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=
 github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=
-github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ=
-github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
+github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk=
+github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs=
+github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA=
+github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
 github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
 github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ=
 github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
@@ -190,6 +198,7 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
+github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
 github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
 github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
 github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays=
@@ -220,8 +229,9 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
 github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
 github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
 github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
 github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
+github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
+github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
 github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU=
@@ -230,6 +240,8 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
 github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
 github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
@@ -297,8 +309,9 @@ github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk
 github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
-github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
 github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
+github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
 github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0=
 github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
@@ -334,8 +347,8 @@ github.com/hashicorp/raft v1.6.1 h1:v/jm5fcYHvVkL0akByAp+IDdDSzCNCGhdO6VdB56HIM=
 github.com/hashicorp/raft v1.6.1/go.mod h1:N1sKh6Vn47mrWvEArQgILTyng8GoDRNYlgKyK7PMjs0=
 github.com/hashicorp/raft-boltdb v0.0.0-20231211162105-6c830fa4535e h1:SK4y8oR4ZMHPvwVHryKI88kJPJda4UyWYvG5A6iEQxc=
 github.com/hashicorp/raft-boltdb v0.0.0-20231211162105-6c830fa4535e/go.mod h1:EMz/UIuG93P0MBeHh6CbXQAEe8ckVJLZjhD17lBzK5Q=
-github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw=
-github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc=
+github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4=
+github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc=
 github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
 github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
 github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU=
@@ -377,8 +390,9 @@ github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW
 github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
 github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
 github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
-github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530 h1:dUJ578zuPEsXjtzOfEF0q9zDAfljJ9oFnTHcQaNkccw=
 github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
+github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w=
+github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM=
 github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
 github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
 github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
@@ -393,8 +407,9 @@ github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod
 github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
 github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
 github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
-github.com/jackc/pgproto3/v2 v2.1.1 h1:7PQ/4gLoqnl87ZxL7xjO0DR5gYuviDCZxQJsUlFW1eI=
 github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag=
+github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
 github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
 github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
 github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
@@ -402,18 +417,21 @@ github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01C
 github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
 github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
 github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
-github.com/jackc/pgtype v1.14.2 h1:QBdZQTKpPdBlw2AdKwHEyqUcm/lrl2cwWAHjCMyln/o=
-github.com/jackc/pgtype v1.14.2/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
+github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
+github.com/jackc/pgtype v1.14.3 h1:h6W9cPuHsRWQFTWUZMAKMgG5jSwQI0Zurzdvlx3Plus=
+github.com/jackc/pgtype v1.14.3/go.mod h1:aKeozOde08iifGosdJpz9MBZonJOUJxqNpPBcMJTlVA=
 github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
 github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
 github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
-github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c h1:Dznn52SgVIVst9UyOT9brctYUgxs+CvVfPaC3jKrA50=
 github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
-github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=
-github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
+github.com/jackc/pgx/v4 v4.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU=
+github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw=
+github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY=
+github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw=
 github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
 github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
 github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
@@ -443,8 +461,9 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
-github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
-github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI=
+github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
+github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
 github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -488,8 +507,8 @@ github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLE
 github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w=
 github.com/libp2p/go-libp2p-mplex v0.9.0 h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8=
 github.com/libp2p/go-libp2p-mplex v0.9.0/go.mod h1:ro1i4kuwiFT+uMPbIDIFkcLs1KRbNp0QwnUXM+P64Og=
-github.com/libp2p/go-libp2p-pubsub v0.10.0 h1:wS0S5FlISavMaAbxyQn3dxMOe2eegMfswM471RuHJwA=
-github.com/libp2p/go-libp2p-pubsub v0.10.0/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw=
+github.com/libp2p/go-libp2p-pubsub v0.10.1 h1:/RqOZpEtAolsr8/9CC8KqROJSOZeu7lK7fPftn4MwNg=
+github.com/libp2p/go-libp2p-pubsub v0.10.1/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw=
 github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
 github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
 github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY=
@@ -545,6 +564,10 @@ github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKo
 github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc=
 github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s=
 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
+github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
+github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
+github.com/minio/minio-go/v7 v7.0.70 h1:1u9NtMgfK1U42kUxcsl5v0yj6TEOPR497OAQxpJnn2g=
+github.com/minio/minio-go/v7 v7.0.70/go.mod h1:4yBA8v80xGA30cfM3fz0DKYMXunWl/AV/6tWEs9ryzo=
 github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
 github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
 github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
@@ -569,8 +592,8 @@ github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9
 github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
 github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
 github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
-github.com/multiformats/go-multiaddr v0.12.2 h1:9G9sTY/wCYajKa9lyfWPmpZAwe6oV+Wb1zcmMS1HG24=
-github.com/multiformats/go-multiaddr v0.12.2/go.mod h1:GKyaTYjZRdcUhyOetrxTk9z0cW+jA/YrnqTOvKgi44M=
+github.com/multiformats/go-multiaddr v0.12.4 h1:rrKqpY9h+n80EwhhC/kkcunCZZ7URIF8yN1WEUt2Hvc=
+github.com/multiformats/go-multiaddr v0.12.4/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII=
 github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A=
 github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk=
 github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
@@ -595,8 +618,9 @@ github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo
 github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
 github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
+github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
 github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
 github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -668,6 +692,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
 github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
 github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
 github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
+github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw=
+github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk=
 github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
 github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
 github.com/quic-go/qtls-go1-20 v0.3.4 h1:MfFAPULvst4yoMgY9QmtpYmfij/em7O8UUi+bNVm7Cg=
@@ -689,6 +715,8 @@ github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncj
 github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE=
 github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
 github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
+github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
+github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
 github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
 github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
@@ -730,6 +758,7 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd
 github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
 github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA=
@@ -738,6 +767,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
 github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
@@ -749,6 +779,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4=
@@ -779,8 +810,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
-github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
+github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
 github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
@@ -835,11 +866,13 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm
 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
-golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
+golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
+golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
+golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ=
-golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE=
+golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=
+golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
 golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -851,6 +884,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
 golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -881,8 +915,11 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
 golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -897,6 +934,7 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
 golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -946,17 +984,23 @@ golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
-golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
+golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
-golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
+golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
+golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -966,8 +1010,11 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
+golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -995,8 +1042,9 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA=
-golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc=
+golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
 golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1040,6 +1088,8 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
 gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
@@ -1058,8 +1108,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM=
 gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA=
-gorm.io/gorm v1.25.7 h1:VsD6acwRjz2zFxGO50gPO6AkNs7KKnvfzUjHQhZDz/A=
-gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
+gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=
+gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
 grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
 honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/indexer/Dockerfile b/indexer/Dockerfile
index ac228dea8659..4c50c95944b5 100644
--- a/indexer/Dockerfile
+++ b/indexer/Dockerfile
@@ -11,7 +11,6 @@ RUN go mod download
 
 # build indexer with the shared go.mod & go.sum files
 COPY ./indexer /app/indexer
-COPY ./op-bindings /app/op-bindings
 COPY ./op-service /app/op-service
 COPY ./op-node /app/op-node
 COPY ./op-plasma /app/op-plasma
diff --git a/indexer/README.md b/indexer/README.md
index 916f5c9dfd43..34a568d6f855 100644
--- a/indexer/README.md
+++ b/indexer/README.md
@@ -54,7 +54,8 @@ The indexer service is responsible for polling and processing real-time batches
 
 #### L1 Poller
 L1 blocks are only indexed if they contain L1 contract events. This is done to reduce the amount of unnecessary data that is indexed. Because of this, the `l1_block_headers` table will not contain every L1 block header unlike L2 blocks.
-
+An **exception** to this is if no log activity has been observed over the specified `ETLAllowedInactivityWindowSeconds` value in the [chain config](https://github.com/ethereum-optimism/optimism/blob/develop/indexer/config/config.go) -- disabled by default with a zero value. Past this duration, the L1 ETL will index the latest
+observed L1 header.
 
 #### Database
 The indexer service currently supports a Postgres database for storing L1/L2 OP Stack chain data. The most up-to-date database schemas can be found in the `./migrations` directory. **Run the idempotent migrations prior to starting the indexer**
diff --git a/indexer/api-ts/CHANGELOG.md b/indexer/api-ts/CHANGELOG.md
index 42351226b331..5a611ffa12b8 100644
--- a/indexer/api-ts/CHANGELOG.md
+++ b/indexer/api-ts/CHANGELOG.md
@@ -1,5 +1,11 @@
 # @eth-optimism/indexer-api
 
+## 0.0.5
+
+### Patch Changes
+
+- [#9964](https://github.com/ethereum-optimism/optimism/pull/9964) [`8241220898128e1f61064f22dcb6fdd0a5f043c3`](https://github.com/ethereum-optimism/optimism/commit/8241220898128e1f61064f22dcb6fdd0a5f043c3) Thanks [@roninjin10](https://github.com/roninjin10)! - Removed only-allow command from package.json
+
 ## 0.0.4
 
 ### Patch Changes
diff --git a/indexer/api-ts/package.json b/indexer/api-ts/package.json
index 492e2fee3a4b..cb27cee2b59e 100644
--- a/indexer/api-ts/package.json
+++ b/indexer/api-ts/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@eth-optimism/indexer-api",
-  "version": "0.0.4",
+  "version": "0.0.5",
   "description": "[Optimism] typescript types for the indexer service",
   "main": "indexer.cjs",
   "module": "indexer.js",
diff --git a/indexer/client/client.go b/indexer/api/api_client.go
similarity index 84%
rename from indexer/client/client.go
rename to indexer/api/api_client.go
index 63fdc80a50db..3f4ff616aa16 100644
--- a/indexer/client/client.go
+++ b/indexer/api/api_client.go
@@ -1,4 +1,4 @@
-package client
+package api
 
 import (
 	"fmt"
@@ -8,9 +8,8 @@ import (
 
 	"encoding/json"
 
-	"github.com/ethereum-optimism/optimism/indexer/api"
 	"github.com/ethereum-optimism/optimism/indexer/api/models"
-	"github.com/ethereum-optimism/optimism/indexer/node"
+	"github.com/ethereum-optimism/optimism/op-service/metrics"
 	"github.com/ethereum/go-ethereum/common"
 )
 
@@ -30,7 +29,7 @@ const (
 type Option func(*Client) error
 
 // WithMetrics ... Triggers metric optionality
-func WithMetrics(m node.Metricer) Option {
+func WithMetrics(m metrics.RPCClientMetricer) Option {
 	return func(c *Client) error {
 		c.metrics = m
 		return nil
@@ -46,20 +45,20 @@ func WithTimeout(t time.Duration) Option {
 }
 
 // Config ... Indexer client config struct
-type Config struct {
+type ClientConfig struct {
 	PaginationLimit int
 	BaseURL         string
 }
 
 // Client ... Indexer client struct
 type Client struct {
-	cfg     *Config
+	cfg     *ClientConfig
 	c       *http.Client
-	metrics node.Metricer
+	metrics metrics.RPCClientMetricer
 }
 
 // NewClient ... Construct a new indexer client
-func NewClient(cfg *Config, opts ...Option) (*Client, error) {
+func NewClient(cfg *ClientConfig, opts ...Option) (*Client, error) {
 	if cfg.PaginationLimit <= 0 {
 		cfg.PaginationLimit = defaultPagingLimit
 	}
@@ -79,16 +78,15 @@ func NewClient(cfg *Config, opts ...Option) (*Client, error) {
 
 // doRecordRequest ... Performs a read request on a provided endpoint w/ telemetry
 func (c *Client) doRecordRequest(method string, endpoint string) ([]byte, error) {
-	var record func(error) = nil
+	var recordRequest func(error) = nil
 	if c.metrics != nil {
-		record = c.metrics.RecordRPCClientRequest(method)
+		recordRequest = c.metrics.RecordRPCClientRequest(method)
 	}
 
 	resp, err := c.c.Get(endpoint)
-	if record != nil {
-		record(err)
+	if recordRequest != nil {
+		recordRequest(err)
 	}
-
 	if err != nil {
 		return nil, err
 	}
@@ -98,35 +96,26 @@ func (c *Client) doRecordRequest(method string, endpoint string) ([]byte, error)
 		return nil, fmt.Errorf("failed to read response body: %w", err)
 	}
 
-	err = resp.Body.Close()
-	if err != nil {
+	if err = resp.Body.Close(); err != nil {
 		return nil, err
 	}
-
 	if resp.StatusCode != http.StatusOK {
 		return nil, fmt.Errorf("endpoint failed with status code %d", resp.StatusCode)
-
 	}
 
-	return body, resp.Body.Close()
+	return body, nil
 }
 
 // HealthCheck ... Checks the health of the indexer API
 func (c *Client) HealthCheck() error {
-
-	_, err := c.doRecordRequest(healthz, c.cfg.BaseURL+api.HealthPath)
-
-	if err != nil {
-		return err
-	}
-
-	return nil
+	_, err := c.doRecordRequest(healthz, c.cfg.BaseURL+HealthPath)
+	return err
 }
 
 // GetDepositsByAddress ... Gets a deposit response object provided an L1 address and cursor
 func (c *Client) GetDepositsByAddress(l1Address common.Address, cursor string) (*models.DepositResponse, error) {
 	var response models.DepositResponse
-	url := c.cfg.BaseURL + api.DepositsPath + l1Address.String() + urlParams
+	url := c.cfg.BaseURL + DepositsPath + l1Address.String() + urlParams
 	endpoint := fmt.Sprintf(url, cursor, c.cfg.PaginationLimit)
 
 	resp, err := c.doRecordRequest(deposits, endpoint)
@@ -153,7 +142,6 @@ func (c *Client) GetAllDepositsByAddress(l1Address common.Address) ([]models.Dep
 		}
 
 		deposits = append(deposits, dResponse.Items...)
-
 		if !dResponse.HasNextPage {
 			break
 		}
@@ -169,7 +157,7 @@ func (c *Client) GetAllDepositsByAddress(l1Address common.Address) ([]models.Dep
 // on both L1 and L2. This includes the individual sums of
 // (L1/L2) deposits and withdrawals
 func (c *Client) GetSupplyAssessment() (*models.BridgeSupplyView, error) {
-	url := c.cfg.BaseURL + api.SupplyPath
+	url := c.cfg.BaseURL + SupplyPath
 
 	resp, err := c.doRecordRequest(sum, url)
 	if err != nil {
@@ -196,7 +184,6 @@ func (c *Client) GetAllWithdrawalsByAddress(l2Address common.Address) ([]models.
 		}
 
 		withdrawals = append(withdrawals, wResponse.Items...)
-
 		if !wResponse.HasNextPage {
 			break
 		}
@@ -210,7 +197,7 @@ func (c *Client) GetAllWithdrawalsByAddress(l2Address common.Address) ([]models.
 // GetWithdrawalsByAddress ... Gets a withdrawal response object provided an L2 address and cursor
 func (c *Client) GetWithdrawalsByAddress(l2Address common.Address, cursor string) (*models.WithdrawalResponse, error) {
 	var wResponse *models.WithdrawalResponse
-	url := c.cfg.BaseURL + api.WithdrawalsPath + l2Address.String() + urlParams
+	url := c.cfg.BaseURL + WithdrawalsPath + l2Address.String() + urlParams
 
 	endpoint := fmt.Sprintf(url, cursor, c.cfg.PaginationLimit)
 	resp, err := c.doRecordRequest(withdrawals, endpoint)
diff --git a/indexer/bigint/bigint.go b/indexer/bigint/bigint.go
index 44adbb02f17e..d1caf1908cee 100644
--- a/indexer/bigint/bigint.go
+++ b/indexer/bigint/bigint.go
@@ -8,7 +8,7 @@ var (
 )
 
 // Clamp returns a new big.Int for `end` to which `end - start` <= size.
-// @note (start, end) is an inclusive range
+// @note (start, end) is an inclusive range. This function assumes that `start` is not greater than `end`.
 func Clamp(start, end *big.Int, size uint64) *big.Int {
 	temp := new(big.Int)
 	count := temp.Sub(end, start).Uint64() + 1
diff --git a/op-bindings/legacy-bindings/CanonicalTransactionChain.go b/indexer/bindings/CanonicalTransactionChain.go
similarity index 99%
rename from op-bindings/legacy-bindings/CanonicalTransactionChain.go
rename to indexer/bindings/CanonicalTransactionChain.go
index d9848e84747a..36c01c1b8d10 100644
--- a/op-bindings/legacy-bindings/CanonicalTransactionChain.go
+++ b/indexer/bindings/CanonicalTransactionChain.go
@@ -1,7 +1,7 @@
 // Code generated - DO NOT EDIT.
 // This file is a generated binding and any manual changes will be lost.
 
-package legacy_bindings
+package bindings
 
 import (
 	"errors"
diff --git a/op-bindings/legacy-bindings/StateCommitmentChain.go b/indexer/bindings/StateCommitmentChain.go
similarity index 99%
rename from op-bindings/legacy-bindings/StateCommitmentChain.go
rename to indexer/bindings/StateCommitmentChain.go
index 4da763a5d967..51e19e3a01d5 100644
--- a/op-bindings/legacy-bindings/StateCommitmentChain.go
+++ b/indexer/bindings/StateCommitmentChain.go
@@ -1,7 +1,7 @@
 // Code generated - DO NOT EDIT.
 // This file is a generated binding and any manual changes will be lost.
 
-package legacy_bindings
+package bindings
 
 import (
 	"errors"
diff --git a/op-bindings/bindings/crossdomainmessenger.go b/indexer/bindings/crossdomainmessenger.go
similarity index 100%
rename from op-bindings/bindings/crossdomainmessenger.go
rename to indexer/bindings/crossdomainmessenger.go
diff --git a/op-bindings/bindings/l1crossdomainmessenger.go b/indexer/bindings/l1crossdomainmessenger.go
similarity index 100%
rename from op-bindings/bindings/l1crossdomainmessenger.go
rename to indexer/bindings/l1crossdomainmessenger.go
diff --git a/op-bindings/bindings/l1standardbridge.go b/indexer/bindings/l1standardbridge.go
similarity index 100%
rename from op-bindings/bindings/l1standardbridge.go
rename to indexer/bindings/l1standardbridge.go
diff --git a/op-bindings/bindings/l2crossdomainmessenger.go b/indexer/bindings/l2crossdomainmessenger.go
similarity index 100%
rename from op-bindings/bindings/l2crossdomainmessenger.go
rename to indexer/bindings/l2crossdomainmessenger.go
diff --git a/op-bindings/bindings/l2outputoracle.go b/indexer/bindings/l2outputoracle.go
similarity index 100%
rename from op-bindings/bindings/l2outputoracle.go
rename to indexer/bindings/l2outputoracle.go
diff --git a/op-bindings/bindings/l2standardbridge.go b/indexer/bindings/l2standardbridge.go
similarity index 100%
rename from op-bindings/bindings/l2standardbridge.go
rename to indexer/bindings/l2standardbridge.go
diff --git a/op-bindings/bindings/l2tol1messagepasser.go b/indexer/bindings/l2tol1messagepasser.go
similarity index 100%
rename from op-bindings/bindings/l2tol1messagepasser.go
rename to indexer/bindings/l2tol1messagepasser.go
diff --git a/op-bindings/bindings/optimismportal.go b/indexer/bindings/optimismportal.go
similarity index 52%
rename from op-bindings/bindings/optimismportal.go
rename to indexer/bindings/optimismportal.go
index 2bf20f0e408c..720b42a03853 100644
--- a/op-bindings/bindings/optimismportal.go
+++ b/indexer/bindings/optimismportal.go
@@ -48,8 +48,8 @@ type TypesWithdrawalTransaction struct {
 
 // OptimismPortalMetaData contains all meta data concerning the OptimismPortal contract.
 var OptimismPortalMetaData = &bind.MetaData{
-	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GUARDIAN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SYSTEM_CONFIG\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositTransaction\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_isCreation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"donateETH\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"finalizeWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizedWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardian\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isOutputFinalized\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Oracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Sender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minimumGasLimit\",\"inputs\":[{\"name\":\"_byteCount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"params\",\"inputs\":[],\"outputs\":[{\"name\":\"prevBaseFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"prevBoughtGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"prevBlockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"paused_\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_outputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"latestBlockhash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provenWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2OutputIndex\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransactionDeposited\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"version\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"opaqueData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalFinalized\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalProven\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]",
-	Bin: "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028f565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001c160201b62001b741760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603680546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b03191661010085841602179055603254166200016a57603280546001600160a01b03191661dead1790555b62000174620001d0565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200023d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600154600160c01b90046001600160401b03166000036200028d5760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b6153ed806200029f6000396000f3fe6080604052600436106101625760003560e01c80638c3152e9116100c0578063c0c53b8b11610074578063e965084c11610059578063e965084c146104c7578063e9e05c4214610553578063f04987501461056657600080fd5b8063c0c53b8b14610406578063cff0ab961461042657600080fd5b80639bf62d82116100a55780639bf62d8214610370578063a14238e71461039d578063a35d99df146103cd57600080fd5b80638c3152e9146103235780639b5f694a1461034357600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102ee578063724c184c1461030e5780638b4c40b01461018757600080fd5b806354fd4d50146102735780635c975abb146102c957600080fd5b806335e80ab31161014857806335e80ab31461020c578063452a93201461023e5780634870496f1461025357600080fd5b80621c2ff61461018e57806333d7e2bd146101df57600080fd5b36610189576101873334620186a0600060405180602001604052806000815250610591565b005b600080fd5b34801561019a57600080fd5b5060365473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101eb57600080fd5b506037546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021857600080fd5b506035546101b590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024a57600080fd5b506101b561082c565b34801561025f57600080fd5b5061018761026e3660046149b4565b6108c4565b34801561027f57600080fd5b506102bc6040518060400160405280600581526020017f322e352e3000000000000000000000000000000000000000000000000000000081525081565b6040516101d69190614b06565b3480156102d557600080fd5b506102de610ef2565b60405190151581526020016101d6565b3480156102fa57600080fd5b506102de610309366004614b19565b610f85565b34801561031a57600080fd5b506101b5611040565b34801561032f57600080fd5b5061018761033e366004614b32565b61104c565b34801561034f57600080fd5b506036546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037c57600080fd5b506032546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a957600080fd5b506102de6103b8366004614b19565b60336020526000908152604090205460ff1681565b3480156103d957600080fd5b506103ed6103e8366004614b8c565b61190d565b60405167ffffffffffffffff90911681526020016101d6565b34801561041257600080fd5b50610187610421366004614ba7565b611926565b34801561043257600080fd5b5060015461048e906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101d6565b3480156104d357600080fd5b506105256104e2366004614b19565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101d6565b610187610561366004614c00565b610591565b34801561057257600080fd5b5060375473ffffffffffffffffffffffffffffffffffffffff166101b5565b8260005a905083156106485773ffffffffffffffffffffffffffffffffffffffff87161561064857604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b610652835161190d565b67ffffffffffffffff168567ffffffffffffffff1610156106f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4f7074696d69736d506f7274616c3a20676173206c696d697420746f6f20736d60448201527f616c6c0000000000000000000000000000000000000000000000000000000000606482015260840161063f565b6201d4c083511115610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f7074696d69736d506f7274616c3a206461746120746f6f206c617267650000604482015260640161063f565b33328114610784575033731111000000000000000000000000000000001111015b6000348888888860405160200161079f959493929190614c7d565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161080f9190614b06565b60405180910390a450506108238282611b90565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa15801561089b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190614ce2565b905090565b6108cc610ef2565b15610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161063f565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e747261637400606482015260840161063f565b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614d1f565b519050610aa0610a9b36869003860186614d84565b611ebd565b8114610b2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f660000000000000000000000000000000000000000000000606482015260840161063f565b6000610b3987611f19565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c4f5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4b9190614d1f565b5114155b610cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e000000000000000000606482015260840161063f565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610da49101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d9a888a614dea565b8a60400135611f49565b610e30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f660000000000000000000000000000606482015260840161063f565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f61573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190614e6e565b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810183905260009161103a9173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f9190614d1f565b602001516fffffffffffffffffffffffffffffffff16611f6d565b92915050565b60006108bf61082c565b565b611054610ef2565b156110bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161063f565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e00606482015260840161063f565b600061116f82611f19565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e207965740000000000000000000000000000606482015260840161063f565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112eb9190614e8b565b81602001516fffffffffffffffffffffffffffffffff1610156113b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a40161063f565b6113d581602001516fffffffffffffffffffffffffffffffff16611f6d565b611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a40161063f565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561150e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115329190614d1f565b82518151919250146115ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a40161063f565b61160b81602001516fffffffffffffffffffffffffffffffff16611f6d565b6116bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a40161063f565b60008381526033602052604090205460ff161561175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a65640000000000000000000000606482015260840161063f565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a08801516117fe93929190612013565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061186390841515815260200190565b60405180910390a2801580156118795750326001145b15611906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a207769746864726177616c206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161063f565b5050505050565b600061191a826010614ed3565b61103a90615208614f03565b600054610100900460ff16158080156119465750600054600160ff909116105b806119605750303b158015611960575060005460ff166001145b6119ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161063f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611a4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611b0357603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611b0b612071565b8015611b6e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611bc6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614f2f565b90506000611bd2612184565b90506000816020015160ff16826000015163ffffffff16611bf39190614f75565b90508215611d2a57600154600090611c2a908390700100000000000000000000000000000000900467ffffffffffffffff16614fdd565b90506000836040015160ff1683611c419190615051565b600154611c619084906fffffffffffffffffffffffffffffffff16615051565b611c6b9190614f75565b600154909150600090611cbc90611c959084906fffffffffffffffffffffffffffffffff1661510d565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612245565b90506001861115611ceb57611ce8611c9582876040015160ff1660018a611ce39190614f2f565b612264565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611d5d908490700100000000000000000000000000000000900467ffffffffffffffff16614f03565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d69740000606482015260840161063f565b600154600090611e6c906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615181565b90506000611e7e48633b9aca006122b9565b611e8890836151be565b905060005a611e979088614f2f565b905080821115611eb357611eb3611eae8284614f2f565b6122d0565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611efc949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611efc9790969591016151d2565b600080611f55866122fe565b9050611f6381868686612330565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120019190614e8b565b61200b9083615229565b421192915050565b6000806000612023866000612360565b905080612059576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16612108576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161063f565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660000361104a5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612221573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190615266565b600061225a612254858561237e565b8361238e565b90505b9392505050565b6000670de0b6b3a76400006122a561227c8583614f75565b61228e90670de0b6b3a7640000614fdd565b6122a085670de0b6b3a7640000615051565b61239d565b6122af9086615051565b61225a9190614f75565b6000818310156122c9578161225d565b5090919050565b6000805a90505b825a6122e39083614f2f565b10156122f9576122f282615305565b91506122d7565b505050565b6060818051906020012060405160200161231a91815260200190565b6040516020818303038152906040529050919050565b6000612357846123418786866123ce565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156122c9578161225d565b60008183126122c9578161225d565b600061225d670de0b6b3a7640000836123b586612e4c565b6123bf9190615051565b6123c99190614f75565b613090565b6060600084511161243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b65790000000000000000000000604482015260640161063f565b6000612446846132cf565b90506000612453866133bb565b905060008460405160200161246a91815260200190565b60405160208183030381529060405290506000805b8451811015612dc357600085828151811061249c5761249c61533d565b602002602001015190508451831115612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e677468000000000000000000000000000000000000606482015260840161063f565b826000036125f057805180516020918201206040516125859261255f92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6125eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f742068617368000000604482015260640161063f565b612747565b8051516020116126a6578051805160209182012060405161261a9261255f92910190815260200190565b6125eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c206861736800000000000000000000000000000000000000000000000000606482015260840161063f565b805184516020808701919091208251919092012014612747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f6520686173680000000000000000000000000000000000000000000000000000606482015260840161063f565b61275360106001615229565b8160200151510361292f57845183036128c75761278d81602001516010815181106127805761278061533d565b602002602001015161341e565b96506000875111612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e6368290000000000606482015260840161063f565b6001865161282e9190614f2f565b82146128bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e636829000000000000606482015260840161063f565b50505050505061225d565b60008584815181106128db576128db61533d565b602001015160f81c60f81b60f81c9050600082602001518260ff16815181106129065761290661533d565b602002602001015190506129198161357e565b9550612926600186615229565b94505050612db0565b600281602001515103612d28576000612947826135a3565b905060008160008151811061295e5761295e61533d565b016020015160f81c9050600061297560028361536c565b61298090600261538e565b90506000612991848360ff166135c7565b9050600061299f8a896135c7565b905060006129ad83836135fd565b905080835114612a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b6579000000000000606482015260840161063f565b60ff851660021480612a54575060ff85166003145b15612c435780825114612ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e646572000000606482015260840161063f565b612b0387602001516001815181106127805761278061533d565b9c5060008d5111612b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c6561662900000000000000606482015260840161063f565b60018c51612ba49190614f2f565b8814612c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c656166290000000000000000606482015260840161063f565b50505050505050505050505061225d565b60ff85161580612c56575060ff85166001145b15612c9557612c828760200151600181518110612c7557612c7561533d565b602002602001015161357e565b9950612c8e818a615229565b9850612d1d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e207072656669780000000000000000000000000000606482015260840161063f565b505050505050612db0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f6465000000000000000000000000000000000000000000000000606482015260840161063f565b5080612dbb81615305565b91505061247f565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e7473000000000000000000000000000000000000000000000000000000606482015260840161063f565b6000808213612eb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161063f565b60006060612ec4846136b1565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136130c157506000919050565b680755bf798b4a1bf1e58212613133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f570000000000000000000000000000000000000000604482015260640161063f565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156132ed576132ed6147d4565b60405190808252806020026020018201604052801561333257816020015b604080518082019091526060808252602082015281526020019060019003908161330b5790505b50915060005b818110156133b457604051806040016040528085838151811061335d5761335d61533d565b6020026020010151815260200161338c86848151811061337f5761337f61533d565b6020026020010151613787565b8152508382815181106133a1576133a161533d565b6020908102919091010152600101613338565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613413578060011b82018184015160001a8060041c8253600f8116600183015350506001016133e5565b509295945050505050565b6060600080600061342e8561379a565b919450925090506000816001811115613449576134496153b1565b146134d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d00000000000000606482015260840161063f565b6134e08284615229565b85511461356f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e646572000000000000000000000000606482015260840161063f565b61235785602001518484614207565b6060602082600001511061359a576135958261341e565b61103a565b61103a8261429b565b606061103a6135c283602001516000815181106127805761278061533d565b6133bb565b6060825182106135e6575060408051602081019091526000815261103a565b61225d83838486516135f89190614f2f565b6142b1565b6000808251845110613610578251613613565b83515b90505b808210801561369a57508282815181106136325761363261533d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106136715761367161533d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156136aa57816001019150613616565b5092915050565b600080821161371c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161063f565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606061103a61379583614489565b614572565b600080600080846000015111613858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161063f565b6020840151805160001a607f811161387d576000600160009450945094505050614200565b60b78111613a8b576000613892608083614f2f565b90508087600001511161394d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a40161063f565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806139c657507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a40161063f565b5060019550935060009250614200915050565b60bf8111613dd9576000613aa060b783614f2f565b905080876000015111613b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a40161063f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613c39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a40161063f565b600184015160088302610100031c60378111613cfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a40161063f565b613d078184615229565b895111613dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a40161063f565b613dc7836001615229565b97509550600094506142009350505050565b60f78111613eba576000613dee60c083614f2f565b905080876000015111613ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a40161063f565b600195509350849250614200915050565b6000613ec760f783614f2f565b905080876000015111613f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a40161063f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a40161063f565b600184015160088302610100031c60378111614124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a40161063f565b61412e8184615229565b8951116141e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a40161063f565b6141ee836001615229565b97509550600194506142009350505050565b9193909250565b60608167ffffffffffffffff811115614222576142226147d4565b6040519080825280601f01601f19166020018201604052801561424c576020820181803683370190505b509050811561225d5760006142618486615229565b90506020820160005b8481101561428257828101518282015260200161426a565b84811115614291576000858301525b5050509392505050565b606061103a826020015160008460000151614207565b60608182601f011015614320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161063f565b82828401101561438c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161063f565b818301845110156143f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161063f565b6060821580156144185760405191506000825260208201604052614480565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614451578051835260209283019201614439565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161063f565b50604080518082019091528151815260209182019181019190915290565b606060008060006145828561379a565b91945092509050600181600181111561459d5761459d6153b1565b1461462a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d0000000000000000606482015260840161063f565b84516146368385615229565b146146c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e6465720000000000000000000000000000606482015260840161063f565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816146da5790505093506000835b86518110156147c85760008061474d6040518060400160405280858c600001516147319190614f2f565b8152602001858c602001516147469190615229565b905261379a565b5091509150604051806040016040528083836147699190615229565b8152602001848b6020015161477e9190615229565b8152508885815181106147935761479361533d565b60209081029190910101526147a9600185615229565b93506147b58183615229565b6147bf9084615229565b92505050614707565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561484a5761484a6147d4565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461487457600080fd5b50565b600082601f83011261488857600080fd5b813567ffffffffffffffff8111156148a2576148a26147d4565b6148d360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614803565b8181528460208386010111156148e857600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561491757600080fd5b60405160c0810167ffffffffffffffff828210818311171561493b5761493b6147d4565b81604052829350843583526020850135915061495682614852565b8160208401526040850135915061496c82614852565b816040840152606085013560608401526080850135608084015260a085013591508082111561499a57600080fd5b506149a785828601614877565b60a0830152505092915050565b600080600080600085870360e08112156149cd57600080fd5b863567ffffffffffffffff808211156149e557600080fd5b6149f18a838b01614905565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614a2a57600080fd5b60408901955060c0890135925080831115614a4457600080fd5b828901925089601f840112614a5857600080fd5b8235915080821115614a6957600080fd5b508860208260051b8401011115614a7f57600080fd5b959894975092955050506020019190565b60005b83811015614aab578181015183820152602001614a93565b83811115611b6e5750506000910152565b60008151808452614ad4816020860160208601614a90565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061225d6020830184614abc565b600060208284031215614b2b57600080fd5b5035919050565b600060208284031215614b4457600080fd5b813567ffffffffffffffff811115614b5b57600080fd5b614b6784828501614905565b949350505050565b803567ffffffffffffffff81168114614b8757600080fd5b919050565b600060208284031215614b9e57600080fd5b61225d82614b6f565b600080600060608486031215614bbc57600080fd5b8335614bc781614852565b92506020840135614bd781614852565b91506040840135614be781614852565b809150509250925092565b801515811461487457600080fd5b600080600080600060a08688031215614c1857600080fd5b8535614c2381614852565b945060208601359350614c3860408701614b6f565b92506060860135614c4881614bf2565b9150608086013567ffffffffffffffff811115614c6457600080fd5b614c7088828901614877565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614cd1816049850160208701614a90565b919091016049019695505050505050565b600060208284031215614cf457600080fd5b815161225d81614852565b80516fffffffffffffffffffffffffffffffff81168114614b8757600080fd5b600060608284031215614d3157600080fd5b6040516060810181811067ffffffffffffffff82111715614d5457614d546147d4565b60405282518152614d6760208401614cff565b6020820152614d7860408401614cff565b60408201529392505050565b600060808284031215614d9657600080fd5b6040516080810181811067ffffffffffffffff82111715614db957614db96147d4565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614e0557614e056147d4565b8360051b6020614e16818301614803565b868152918501918181019036841115614e2e57600080fd5b865b84811015614e6257803586811115614e485760008081fd5b614e5436828b01614877565b845250918301918301614e30565b50979650505050505050565b600060208284031215614e8057600080fd5b815161225d81614bf2565b600060208284031215614e9d57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614efa57614efa614ea4565b02949350505050565b600067ffffffffffffffff808316818516808303821115614f2657614f26614ea4565b01949350505050565b600082821015614f4157614f41614ea4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614f8457614f84614f46565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614fd857614fd8614ea4565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561501757615017614ea4565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561504b5761504b614ea4565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561509257615092614ea4565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156150cd576150cd614ea4565b600087129250878205871284841616156150e9576150e9614ea4565b878505871281841616156150ff576150ff614ea4565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561514757615147614ea4565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561517b5761517b614ea4565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151b9576151b9614ea4565b500290565b6000826151cd576151cd614f46565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261521d60c0830184614abc565b98975050505050505050565b6000821982111561523c5761523c614ea4565b500190565b805163ffffffff81168114614b8757600080fd5b805160ff81168114614b8757600080fd5b600060c0828403121561527857600080fd5b60405160c0810181811067ffffffffffffffff8211171561529b5761529b6147d4565b6040526152a783615241565b81526152b560208401615255565b60208201526152c660408401615255565b60408201526152d760608401615241565b60608201526152e860808401615241565b60808201526152f960a08401614cff565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361533657615336614ea4565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff83168061537f5761537f614f46565b8060ff84160691505092915050565b600060ff821660ff8416808210156153a8576153a8614ea4565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositTransaction\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_isCreation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"donateETH\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"finalizeWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizedWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardian\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isOutputFinalized\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Oracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Sender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minimumGasLimit\",\"inputs\":[{\"name\":\"_byteCount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"params\",\"inputs\":[],\"outputs\":[{\"name\":\"prevBaseFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"prevBoughtGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"prevBlockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"paused_\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_outputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"latestBlockhash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provenWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2OutputIndex\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransactionDeposited\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"version\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"opaqueData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalFinalized\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalProven\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BadTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasEstimation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LargeCalldata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfGas\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SmallGasLimit\",\"inputs\":[]}]",
+	Bin: "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028f565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001c160201b6200191f1760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603680546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b03191661010085841602179055603254166200016a57603280546001600160a01b03191661dead1790555b62000174620001d0565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200023d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600154600160c01b90046001600160401b03166000036200028d5760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b615142806200029f6000396000f3fe6080604052600436106101125760003560e01c80638c3152e9116100a5578063a35d99df11610074578063cff0ab9611610059578063cff0ab961461039a578063e965084c1461043b578063e9e05c42146104c757600080fd5b8063a35d99df14610341578063c0c53b8b1461037a57600080fd5b80638c3152e9146102975780639b5f694a146102b75780639bf62d82146102e4578063a14238e71461031157600080fd5b806354fd4d50116100e157806354fd4d50146101fc5780635c975abb146102525780636dbffb78146102775780638b4c40b01461013757600080fd5b806333d7e2bd1461013e57806335e80ab314610195578063452a9320146101c75780634870496f146101dc57600080fd5b36610139576101373334620186a06000604051806020016040528060008152506104d5565b005b600080fd5b34801561014a57600080fd5b5060375461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101a157600080fd5b5060355461016b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156101d357600080fd5b5061016b610692565b3480156101e857600080fd5b506101376101f7366004614709565b61072a565b34801561020857600080fd5b506102456040518060400160405280600581526020017f322e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161018c919061485b565b34801561025e57600080fd5b50610267610d2d565b604051901515815260200161018c565b34801561028357600080fd5b5061026761029236600461486e565b610dc0565b3480156102a357600080fd5b506101376102b2366004614887565b610e7d565b3480156102c357600080fd5b5060365461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102f057600080fd5b5060325461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561031d57600080fd5b5061026761032c36600461486e565b60336020526000908152604090205460ff1681565b34801561034d57600080fd5b5061036161035c3660046148e1565b6116b8565b60405167ffffffffffffffff909116815260200161018c565b34801561038657600080fd5b506101376103953660046148fc565b6116d1565b3480156103a657600080fd5b50600154610402906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161018c565b34801561044757600080fd5b5061049961045636600461486e565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff928316602085015291169082015260600161018c565b6101376104d5366004614955565b8260005a90508380156104fd575073ffffffffffffffffffffffffffffffffffffffff871615155b15610534576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61053e83516116b8565b67ffffffffffffffff168567ffffffffffffffff16101561058b576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0835111156105c9576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146105ea575033731111000000000000000000000000000000001111015b600034888888886040516020016106059594939291906149d2565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610675919061485b565b60405180910390a45050610689828261193b565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614a37565b905090565b610732610d2d565b15610769576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff160361082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084015b60405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561089d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c19190614a74565b5190506108db6108d636869003860186614ad9565b611c12565b8114610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f6600000000000000000000000000000000000000000000006064820152608401610824565b600061097487611c6e565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610a8a5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614a74565b5114155b610b16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610824565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610bdf9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610bd5888a614b3f565b8a60400135611c9e565b610c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610824565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614bc3565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610e759173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190614a74565b602001516fffffffffffffffffffffffffffffffff16611cc2565b92915050565b565b610e85610d2d565b15610ebc576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14610f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e006064820152608401610824565b6000610f7082611c6e565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610824565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec9190614be0565b81602001516fffffffffffffffffffffffffffffffff1610156111b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610824565b6111d681602001516fffffffffffffffffffffffffffffffff16611cc2565b611288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610824565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561130f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113339190614a74565b82518151919250146113ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610824565b61140c81602001516fffffffffffffffffffffffffffffffff16611cc2565b6114be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610824565b60008381526033602052604090205460ff161561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610824565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a08801516115ff93929190611d68565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061166490841515815260200190565b60405180910390a28015801561167a5750326001145b156116b1576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60006116c5826010614c28565b610e7590615208614c58565b600054610100900460ff16158080156116f15750600054600160ff909116105b8061170b5750303b15801561170b575060005460ff166001145b611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610824565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156117f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010085841602179055603254166118ae57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b6118b6611dc6565b801561191957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611971907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614c84565b9050600061197d611ed9565b90506000816020015160ff16826000015163ffffffff1661199e9190614cca565b90508215611ad5576001546000906119d5908390700100000000000000000000000000000000900467ffffffffffffffff16614d32565b90506000836040015160ff16836119ec9190614da6565b600154611a0c9084906fffffffffffffffffffffffffffffffff16614da6565b611a169190614cca565b600154909150600090611a6790611a409084906fffffffffffffffffffffffffffffffff16614e62565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16611f9a565b90506001861115611a9657611a93611a4082876040015160ff1660018a611a8e9190614c84565b611fb9565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611b08908490700100000000000000000000000000000000900467ffffffffffffffff16614c58565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611b95576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090611bc1906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816614ed6565b90506000611bd348633b9aca0061200e565b611bdd9083614f13565b905060005a611bec9088614c84565b905080821115611c0857611c08611c038284614c84565b612025565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611c51949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611c51979096959101614f27565b600080611caa86612053565b9050611cb881868686612085565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015611d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d569190614be0565b611d609083614f7e565b421192915050565b6000806000611d788660006120b5565b905080611dae576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16611e5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610824565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003610e7b5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015611f76573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614fbb565b6000611faf611fa985856120d3565b836120e3565b90505b9392505050565b6000670de0b6b3a7640000611ffa611fd18583614cca565b611fe390670de0b6b3a7640000614d32565b611ff585670de0b6b3a7640000614da6565b6120f2565b6120049086614da6565b611faf9190614cca565b60008183101561201e5781611fb2565b5090919050565b6000805a90505b825a6120389083614c84565b101561204e576120478261505a565b915061202c565b505050565b6060818051906020012060405160200161206f91815260200190565b6040516020818303038152906040529050919050565b60006120ac84612096878686612123565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b60008183121561201e5781611fb2565b600081831261201e5781611fb2565b6000611fb2670de0b6b3a76400008361210a86612ba1565b6121149190614da6565b61211e9190614cca565b612de5565b60606000845111612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610824565b600061219b84613024565b905060006121a886613110565b90506000846040516020016121bf91815260200190565b60405160208183030381529060405290506000805b8451811015612b185760008582815181106121f1576121f1615092565b60200260200101519050845183111561228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610824565b8260000361234557805180516020918201206040516122da926122b492910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610824565b61249c565b8051516020116123fb578051805160209182012060405161236f926122b492910190815260200190565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610824565b80518451602080870191909120825191909201201461249c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610824565b6124a860106001614f7e565b81602001515103612684578451830361261c576124e281602001516010815181106124d5576124d5615092565b6020026020010151613173565b96506000875111612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610824565b600186516125839190614c84565b8214612611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610824565b505050505050611fb2565b600085848151811061263057612630615092565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061265b5761265b615092565b6020026020010151905061266e816132d3565b955061267b600186614f7e565b94505050612b05565b600281602001515103612a7d57600061269c826132f8565b90506000816000815181106126b3576126b3615092565b016020015160f81c905060006126ca6002836150c1565b6126d59060026150e3565b905060006126e6848360ff1661331c565b905060006126f48a8961331c565b905060006127028383613352565b905080835114612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610824565b60ff8516600214806127a9575060ff85166003145b15612998578082511461283e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610824565b61285887602001516001815181106124d5576124d5615092565b9c5060008d51116128eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610824565b60018c516128f99190614c84565b8814612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610824565b505050505050505050505050611fb2565b60ff851615806129ab575060ff85166001145b156129ea576129d787602001516001815181106129ca576129ca615092565b60200260200101516132d3565b99506129e3818a614f7e565b9850612a72565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610824565b505050505050612b05565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610824565b5080612b108161505a565b9150506121d4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610824565b6000808213612c0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b60006060612c1984613406565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213612e1657506000919050565b680755bf798b4a1bf1e58212612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610824565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff81111561304257613042614529565b60405190808252806020026020018201604052801561308757816020015b60408051808201909152606080825260208201528152602001906001900390816130605790505b50915060005b818110156131095760405180604001604052808583815181106130b2576130b2615092565b602002602001015181526020016130e18684815181106130d4576130d4615092565b60200260200101516134dc565b8152508382815181106130f6576130f6615092565b602090810291909101015260010161308d565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613168578060011b82018184015160001a8060041c8253600f81166001830153505060010161313a565b509295945050505050565b60606000806000613183856134ef565b91945092509050600081600181111561319e5761319e615106565b1461322b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610824565b6132358284614f7e565b8551146132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610824565b6120ac85602001518484613f5c565b606060208260000151106132ef576132ea82613173565b610e75565b610e7582613ff0565b6060610e7561331783602001516000815181106124d5576124d5615092565b613110565b60608251821061333b5750604080516020810190915260008152610e75565b611fb2838384865161334d9190614c84565b614006565b6000808251845110613365578251613368565b83515b90505b80821080156133ef575082828151811061338757613387615092565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106133c6576133c6615092565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156133ff5781600101915061336b565b5092915050565b6000808211613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060610e756134ea836141de565b6142c7565b6000806000808460000151116135ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b6020840151805160001a607f81116135d2576000600160009450945094505050613f55565b60b781116137e05760006135e7608083614c84565b9050808760000151116136a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610824565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061371b57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b6137cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610824565b5060019550935060009250613f55915050565b60bf8111613b2e5760006137f560b783614c84565b9050808760000151116138b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610824565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361398e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610824565b613a5c8184614f7e565b895111613b11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610824565b613b1c836001614f7e565b9750955060009450613f559350505050565b60f78111613c0f576000613b4360c083614c84565b905080876000015111613bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b600195509350849250613f55915050565b6000613c1c60f783614c84565b905080876000015111613cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610824565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610824565b613e838184614f7e565b895111613f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b613f43836001614f7e565b9750955060019450613f559350505050565b9193909250565b60608167ffffffffffffffff811115613f7757613f77614529565b6040519080825280601f01601f191660200182016040528015613fa1576020820181803683370190505b5090508115611fb2576000613fb68486614f7e565b90506020820160005b84811015613fd7578281015182820152602001613fbf565b84811115613fe6576000858301525b5050509392505050565b6060610e75826020015160008460000151613f5c565b60608182601f011015614075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8282840110156140e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8183018451101561414e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610824565b60608215801561416d57604051915060008252602082016040526141d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141a657805183526020928301920161418e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116142a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b50604080518082019091528151815260209182019181019190915290565b606060008060006142d7856134ef565b9194509250905060018160018111156142f2576142f2615106565b1461437f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610824565b845161438b8385614f7e565b14614418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610824565b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161442f5790505093506000835b865181101561451d576000806144a26040518060400160405280858c600001516144869190614c84565b8152602001858c6020015161449b9190614f7e565b90526134ef565b5091509150604051806040016040528083836144be9190614f7e565b8152602001848b602001516144d39190614f7e565b8152508885815181106144e8576144e8615092565b60209081029190910101526144fe600185614f7e565b935061450a8183614f7e565b6145149084614f7e565b9250505061445c565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561459f5761459f614529565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff811681146145c957600080fd5b50565b600082601f8301126145dd57600080fd5b813567ffffffffffffffff8111156145f7576145f7614529565b61462860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614558565b81815284602083860101111561463d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561466c57600080fd5b60405160c0810167ffffffffffffffff828210818311171561469057614690614529565b8160405282935084358352602085013591506146ab826145a7565b816020840152604085013591506146c1826145a7565b816040840152606085013560608401526080850135608084015260a08501359150808211156146ef57600080fd5b506146fc858286016145cc565b60a0830152505092915050565b600080600080600085870360e081121561472257600080fd5b863567ffffffffffffffff8082111561473a57600080fd5b6147468a838b0161465a565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561477f57600080fd5b60408901955060c089013592508083111561479957600080fd5b828901925089601f8401126147ad57600080fd5b82359150808211156147be57600080fd5b508860208260051b84010111156147d457600080fd5b959894975092955050506020019190565b60005b838110156148005781810151838201526020016147e8565b838111156119195750506000910152565b600081518084526148298160208601602086016147e5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fb26020830184614811565b60006020828403121561488057600080fd5b5035919050565b60006020828403121561489957600080fd5b813567ffffffffffffffff8111156148b057600080fd5b6148bc8482850161465a565b949350505050565b803567ffffffffffffffff811681146148dc57600080fd5b919050565b6000602082840312156148f357600080fd5b611fb2826148c4565b60008060006060848603121561491157600080fd5b833561491c816145a7565b9250602084013561492c816145a7565b9150604084013561493c816145a7565b809150509250925092565b80151581146145c957600080fd5b600080600080600060a0868803121561496d57600080fd5b8535614978816145a7565b94506020860135935061498d604087016148c4565b9250606086013561499d81614947565b9150608086013567ffffffffffffffff8111156149b957600080fd5b6149c5888289016145cc565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614a268160498501602087016147e5565b919091016049019695505050505050565b600060208284031215614a4957600080fd5b8151611fb2816145a7565b80516fffffffffffffffffffffffffffffffff811681146148dc57600080fd5b600060608284031215614a8657600080fd5b6040516060810181811067ffffffffffffffff82111715614aa957614aa9614529565b60405282518152614abc60208401614a54565b6020820152614acd60408401614a54565b60408201529392505050565b600060808284031215614aeb57600080fd5b6040516080810181811067ffffffffffffffff82111715614b0e57614b0e614529565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614b5a57614b5a614529565b8360051b6020614b6b818301614558565b868152918501918181019036841115614b8357600080fd5b865b84811015614bb757803586811115614b9d5760008081fd5b614ba936828b016145cc565b845250918301918301614b85565b50979650505050505050565b600060208284031215614bd557600080fd5b8151611fb281614947565b600060208284031215614bf257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614c4f57614c4f614bf9565b02949350505050565b600067ffffffffffffffff808316818516808303821115614c7b57614c7b614bf9565b01949350505050565b600082821015614c9657614c96614bf9565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614cd957614cd9614c9b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614d2d57614d2d614bf9565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615614d6c57614d6c614bf9565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614da057614da0614bf9565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614de757614de7614bf9565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614e2257614e22614bf9565b60008712925087820587128484161615614e3e57614e3e614bf9565b87850587128184161615614e5457614e54614bf9565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614e9c57614e9c614bf9565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614ed057614ed0614bf9565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f0e57614f0e614bf9565b500290565b600082614f2257614f22614c9b565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614f7260c0830184614811565b98975050505050505050565b60008219821115614f9157614f91614bf9565b500190565b805163ffffffff811681146148dc57600080fd5b805160ff811681146148dc57600080fd5b600060c08284031215614fcd57600080fd5b60405160c0810181811067ffffffffffffffff82111715614ff057614ff0614529565b604052614ffc83614f96565b815261500a60208401614faa565b602082015261501b60408401614faa565b604082015261502c60608401614f96565b606082015261503d60808401614f96565b608082015261504e60a08401614a54565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508b5761508b614bf9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff8316806150d4576150d4614c9b565b8060ff84160691505092915050565b600060ff821660ff8416808210156150fd576150fd614bf9565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
 }
 
 // OptimismPortalABI is the input ABI used to generate the binding from.
@@ -219,99 +219,6 @@ func (_OptimismPortal *OptimismPortalTransactorRaw) Transact(opts *bind.Transact
 	return _OptimismPortal.Contract.contract.Transact(opts, method, params...)
 }
 
-// GUARDIAN is a free data retrieval call binding the contract method 0x724c184c.
-//
-// Solidity: function GUARDIAN() view returns(address)
-func (_OptimismPortal *OptimismPortalCaller) GUARDIAN(opts *bind.CallOpts) (common.Address, error) {
-	var out []interface{}
-	err := _OptimismPortal.contract.Call(opts, &out, "GUARDIAN")
-
-	if err != nil {
-		return *new(common.Address), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
-	return out0, err
-
-}
-
-// GUARDIAN is a free data retrieval call binding the contract method 0x724c184c.
-//
-// Solidity: function GUARDIAN() view returns(address)
-func (_OptimismPortal *OptimismPortalSession) GUARDIAN() (common.Address, error) {
-	return _OptimismPortal.Contract.GUARDIAN(&_OptimismPortal.CallOpts)
-}
-
-// GUARDIAN is a free data retrieval call binding the contract method 0x724c184c.
-//
-// Solidity: function GUARDIAN() view returns(address)
-func (_OptimismPortal *OptimismPortalCallerSession) GUARDIAN() (common.Address, error) {
-	return _OptimismPortal.Contract.GUARDIAN(&_OptimismPortal.CallOpts)
-}
-
-// L2ORACLE is a free data retrieval call binding the contract method 0x001c2ff6.
-//
-// Solidity: function L2_ORACLE() view returns(address)
-func (_OptimismPortal *OptimismPortalCaller) L2ORACLE(opts *bind.CallOpts) (common.Address, error) {
-	var out []interface{}
-	err := _OptimismPortal.contract.Call(opts, &out, "L2_ORACLE")
-
-	if err != nil {
-		return *new(common.Address), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
-	return out0, err
-
-}
-
-// L2ORACLE is a free data retrieval call binding the contract method 0x001c2ff6.
-//
-// Solidity: function L2_ORACLE() view returns(address)
-func (_OptimismPortal *OptimismPortalSession) L2ORACLE() (common.Address, error) {
-	return _OptimismPortal.Contract.L2ORACLE(&_OptimismPortal.CallOpts)
-}
-
-// L2ORACLE is a free data retrieval call binding the contract method 0x001c2ff6.
-//
-// Solidity: function L2_ORACLE() view returns(address)
-func (_OptimismPortal *OptimismPortalCallerSession) L2ORACLE() (common.Address, error) {
-	return _OptimismPortal.Contract.L2ORACLE(&_OptimismPortal.CallOpts)
-}
-
-// SYSTEMCONFIG is a free data retrieval call binding the contract method 0xf0498750.
-//
-// Solidity: function SYSTEM_CONFIG() view returns(address)
-func (_OptimismPortal *OptimismPortalCaller) SYSTEMCONFIG(opts *bind.CallOpts) (common.Address, error) {
-	var out []interface{}
-	err := _OptimismPortal.contract.Call(opts, &out, "SYSTEM_CONFIG")
-
-	if err != nil {
-		return *new(common.Address), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
-	return out0, err
-
-}
-
-// SYSTEMCONFIG is a free data retrieval call binding the contract method 0xf0498750.
-//
-// Solidity: function SYSTEM_CONFIG() view returns(address)
-func (_OptimismPortal *OptimismPortalSession) SYSTEMCONFIG() (common.Address, error) {
-	return _OptimismPortal.Contract.SYSTEMCONFIG(&_OptimismPortal.CallOpts)
-}
-
-// SYSTEMCONFIG is a free data retrieval call binding the contract method 0xf0498750.
-//
-// Solidity: function SYSTEM_CONFIG() view returns(address)
-func (_OptimismPortal *OptimismPortalCallerSession) SYSTEMCONFIG() (common.Address, error) {
-	return _OptimismPortal.Contract.SYSTEMCONFIG(&_OptimismPortal.CallOpts)
-}
-
 // FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
 //
 // Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
diff --git a/op-bindings/bindings/standardbridge.go b/indexer/bindings/standardbridge.go
similarity index 100%
rename from op-bindings/bindings/standardbridge.go
rename to indexer/bindings/standardbridge.go
diff --git a/indexer/cmd/indexer/cli.go b/indexer/cmd/indexer/cli.go
index 3e28a681ad42..91b5798a61d9 100644
--- a/indexer/cmd/indexer/cli.go
+++ b/indexer/cmd/indexer/cli.go
@@ -7,16 +7,15 @@ import (
 
 	"github.com/urfave/cli/v2"
 
+	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/ethereum/go-ethereum/params"
 
 	"github.com/ethereum-optimism/optimism/indexer"
 	"github.com/ethereum-optimism/optimism/indexer/api"
 	"github.com/ethereum-optimism/optimism/indexer/config"
 	"github.com/ethereum-optimism/optimism/indexer/database"
-	"github.com/ethereum-optimism/optimism/indexer/node"
 	"github.com/ethereum-optimism/optimism/op-service/cliapp"
 	oplog "github.com/ethereum-optimism/optimism/op-service/log"
-	"github.com/ethereum-optimism/optimism/op-service/metrics"
 	"github.com/ethereum-optimism/optimism/op-service/opio"
 )
 
@@ -112,11 +111,11 @@ func runReorgDeletion(ctx *cli.Context) error {
 		return fmt.Errorf("failed to load config: %w", err)
 	}
 
-	l1Clnt, err := node.DialEthClient(ctx.Context, cfg.RPCs.L1RPC, node.NewMetrics(metrics.NewRegistry(), "l1"))
+	l1Clnt, err := ethclient.DialContext(ctx.Context, cfg.RPCs.L1RPC)
 	if err != nil {
 		return fmt.Errorf("failed to dial L1 client: %w", err)
 	}
-	l1Header, err := l1Clnt.BlockHeaderByNumber(big.NewInt(int64(fromL1Height)))
+	l1Header, err := l1Clnt.HeaderByNumber(ctx.Context, big.NewInt(int64(fromL1Height)))
 	if err != nil {
 		return fmt.Errorf("failed to query L1 header at height: %w", err)
 	} else if l1Header == nil {
diff --git a/indexer/config/config.go b/indexer/config/config.go
index 813e6c7c5d20..9524bb97164d 100644
--- a/indexer/config/config.go
+++ b/indexer/config/config.go
@@ -7,7 +7,7 @@ import (
 	"reflect"
 
 	"github.com/BurntSushi/toml"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 )
@@ -100,7 +100,7 @@ type ChainConfig struct {
 	L1Contracts L1Contracts `toml:"l1-contracts"`
 	L2Contracts L2Contracts `toml:"-"`
 
-	// Bedrock starting heights only applicable for OP-Mainnet & OP-Goerli
+	// Bedrock starting heights only applicable for OP-Mainnet
 	L1BedrockStartingHeight uint `toml:"-"`
 	L2BedrockStartingHeight uint `toml:"-"`
 
@@ -114,6 +114,9 @@ type ChainConfig struct {
 
 	L1HeaderBufferSize uint `toml:"l1-header-buffer-size"`
 	L2HeaderBufferSize uint `toml:"l2-header-buffer-size"`
+
+	// Inactivity allowed before a block is indexed by the ETL. Default 0 value disables this feature
+	ETLAllowedInactivityWindowSeconds uint `toml:"etl-allowed-inactivity-window-seconds"`
 }
 
 // RPCsConfig configures the RPC urls
diff --git a/indexer/config/config_test.go b/indexer/config/config_test.go
index 043016b09512..17da2a427dbf 100644
--- a/indexer/config/config_test.go
+++ b/indexer/config/config_test.go
@@ -20,7 +20,7 @@ func TestLoadConfig(t *testing.T) {
 
 	testData := `
 		[chain]
-		preset = 420
+		preset = 10
 
 		l1-polling-interval = 5000
 		l2-polling-interval = 5000
@@ -58,11 +58,11 @@ func TestLoadConfig(t *testing.T) {
 	conf, err := LoadConfig(logger, tmpfile.Name())
 	require.NoError(t, err)
 
-	require.Equal(t, conf.Chain.Preset, 420)
-	require.Equal(t, conf.Chain.L1Contracts.OptimismPortalProxy.String(), Presets[420].ChainConfig.L1Contracts.OptimismPortalProxy.String())
-	require.Equal(t, conf.Chain.L1Contracts.L1CrossDomainMessengerProxy.String(), Presets[420].ChainConfig.L1Contracts.L1CrossDomainMessengerProxy.String())
-	require.Equal(t, conf.Chain.L1Contracts.L1StandardBridgeProxy.String(), Presets[420].ChainConfig.L1Contracts.L1StandardBridgeProxy.String())
-	require.Equal(t, conf.Chain.L1Contracts.L2OutputOracleProxy.String(), Presets[420].ChainConfig.L1Contracts.L2OutputOracleProxy.String())
+	require.Equal(t, conf.Chain.Preset, 10)
+	require.Equal(t, conf.Chain.L1Contracts.OptimismPortalProxy.String(), Presets[10].ChainConfig.L1Contracts.OptimismPortalProxy.String())
+	require.Equal(t, conf.Chain.L1Contracts.L1CrossDomainMessengerProxy.String(), Presets[10].ChainConfig.L1Contracts.L1CrossDomainMessengerProxy.String())
+	require.Equal(t, conf.Chain.L1Contracts.L1StandardBridgeProxy.String(), Presets[10].ChainConfig.L1Contracts.L1StandardBridgeProxy.String())
+	require.Equal(t, conf.Chain.L1Contracts.L2OutputOracleProxy.String(), Presets[10].ChainConfig.L1Contracts.L2OutputOracleProxy.String())
 	require.Equal(t, conf.Chain.L1PollingInterval, uint(5000))
 	require.Equal(t, conf.Chain.L1HeaderBufferSize, uint(1000))
 	require.Equal(t, conf.Chain.L2PollingInterval, uint(5000))
@@ -285,15 +285,15 @@ func TestThrowsOnUnknownKeys(t *testing.T) {
 
 	testData := `
 		[chain]
-    unknown_key = 420
-		preset = 420
+        unknown_key = 420
+		preset = 10
 
 		[rpcs]
 		l1-rpc = "https://l1.example.com"
 		l2-rpc = "https://l2.example.com"
 
 		[db]
-	  another_unknownKey = 420
+	    another_unknownKey = 420
 		host = "127.0.0.1"
 		port = 5432
 		user = "postgres"
diff --git a/indexer/config/presets.go b/indexer/config/presets.go
index a812b568e1f6..1c3c994fd60d 100644
--- a/indexer/config/presets.go
+++ b/indexer/config/presets.go
@@ -38,31 +38,6 @@ var Presets = map[int]Preset{
 			L2ConfirmationDepth:     75,
 		},
 	},
-	420: {
-		Name: "Optimism Goerli",
-		ChainConfig: ChainConfig{
-			Preset: 420,
-			L1Contracts: L1Contracts{
-				AddressManager:              common.HexToAddress("0xa6f73589243a6A7a9023b1Fa0651b1d89c177111"),
-				SystemConfigProxy:           common.HexToAddress("0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60"),
-				OptimismPortalProxy:         common.HexToAddress("0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383"),
-				L2OutputOracleProxy:         common.HexToAddress("0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0"),
-				L1CrossDomainMessengerProxy: common.HexToAddress("0x5086d1eEF304eb5284A0f6720f79403b4e9bE294"),
-				L1StandardBridgeProxy:       common.HexToAddress("0x636Af16bf2f682dD3109e60102b8E1A089FedAa8"),
-				L1ERC721BridgeProxy:         common.HexToAddress("0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9"),
-				DisputeGameFactoryProxy:     common.HexToAddress("0x1111111111111111111111111111111111111111"),
-
-				// pre-bedrock
-				LegacyCanonicalTransactionChain: common.HexToAddress("0x607F755149cFEB3a14E1Dc3A4E2450Cde7dfb04D"),
-				LegacyStateCommitmentChain:      common.HexToAddress("0x9c945aC97Baf48cB784AbBB61399beB71aF7A378"),
-			},
-			L1StartingHeight:        7017096,
-			L1BedrockStartingHeight: 8300214,
-			L2BedrockStartingHeight: 4061224,
-			L1ConfirmationDepth:     10,
-			L2ConfirmationDepth:     75,
-		},
-	},
 	11155420: {
 		Name: "Optimism Sepolia",
 		ChainConfig: ChainConfig{
@@ -75,7 +50,7 @@ var Presets = map[int]Preset{
 				L1CrossDomainMessengerProxy: common.HexToAddress("0x58Cc85b8D04EA49cC6DBd3CbFFd00B4B8D6cb3ef"),
 				L1StandardBridgeProxy:       common.HexToAddress("0xFBb0621E0B23b5478B630BD55a5f21f67730B0F1"),
 				L1ERC721BridgeProxy:         common.HexToAddress("0xd83e03D576d23C9AEab8cC44Fa98d058D2176D1f"),
-				DisputeGameFactoryProxy:     common.HexToAddress("0x1111111111111111111111111111111111111111"),
+				DisputeGameFactoryProxy:     common.HexToAddress("0x05F9613aDB30026FFd634f38e5C4dFd30a197Fa1"),
 			},
 			L1StartingHeight:    4071408,
 			L1ConfirmationDepth: 10,
@@ -101,25 +76,6 @@ var Presets = map[int]Preset{
 			L2ConfirmationDepth: 75,
 		},
 	},
-	84531: {
-		Name: "Base Goerli",
-		ChainConfig: ChainConfig{
-			Preset: 84531,
-			L1Contracts: L1Contracts{
-				AddressManager:              common.HexToAddress("0x4Cf6b56b14c6CFcB72A75611080514F94624c54e"),
-				SystemConfigProxy:           common.HexToAddress("0xb15eea247eCE011C68a614e4a77AD648ff495bc1"),
-				OptimismPortalProxy:         common.HexToAddress("0xe93c8cD0D409341205A592f8c4Ac1A5fe5585cfA"),
-				L2OutputOracleProxy:         common.HexToAddress("0x2A35891ff30313CcFa6CE88dcf3858bb075A2298"),
-				L1CrossDomainMessengerProxy: common.HexToAddress("0x8e5693140eA606bcEB98761d9beB1BC87383706D"),
-				L1StandardBridgeProxy:       common.HexToAddress("0xfA6D8Ee5BE770F84FC001D098C4bD604Fe01284a"),
-				L1ERC721BridgeProxy:         common.HexToAddress("0x5E0c967457347D5175bF82E8CCCC6480FCD7e568"),
-				DisputeGameFactoryProxy:     common.HexToAddress("0x1111111111111111111111111111111111111111"),
-			},
-			L1StartingHeight:    8410981,
-			L1ConfirmationDepth: 10,
-			L2ConfirmationDepth: 75,
-		},
-	},
 	84532: {
 		Name: "Base Sepolia",
 		ChainConfig: ChainConfig{
@@ -158,25 +114,6 @@ var Presets = map[int]Preset{
 			L2ConfirmationDepth: 75,
 		},
 	},
-	999: {
-		Name: "Zora Goerli",
-		ChainConfig: ChainConfig{
-			Preset: 999,
-			L1Contracts: L1Contracts{
-				AddressManager:              common.HexToAddress("0x54f4676203dEDA6C08E0D40557A119c602bFA246"),
-				SystemConfigProxy:           common.HexToAddress("0xF66C9A5E4fE1A8a9bc44a4aF80505a4C3620Ee64"),
-				OptimismPortalProxy:         common.HexToAddress("0xDb9F51790365e7dc196e7D072728df39Be958ACe"),
-				L2OutputOracleProxy:         common.HexToAddress("0xdD292C9eEd00f6A32Ff5245d0BCd7f2a15f24e00"),
-				L1CrossDomainMessengerProxy: common.HexToAddress("0xD87342e16352D33170557A7dA1e5fB966a60FafC"),
-				L1StandardBridgeProxy:       common.HexToAddress("0x7CC09AC2452D6555d5e0C213Ab9E2d44eFbFc956"),
-				L1ERC721BridgeProxy:         common.HexToAddress("0x57C1C6b596ce90C0e010c358DD4Aa052404bB70F"),
-				DisputeGameFactoryProxy:     common.HexToAddress("0x1111111111111111111111111111111111111111"),
-			},
-			L1StartingHeight:    8942381,
-			L1ConfirmationDepth: 10,
-			L2ConfirmationDepth: 75,
-		},
-	},
 	424: {
 		Name: "PGN",
 		ChainConfig: ChainConfig{
diff --git a/indexer/database/bridge_messages.go b/indexer/database/bridge_messages.go
index 7a126635d84d..25979a8f0a0d 100644
--- a/indexer/database/bridge_messages.go
+++ b/indexer/database/bridge_messages.go
@@ -119,7 +119,7 @@ func (db bridgeMessagesDB) MarkRelayedL1BridgeMessage(messageHash common.Hash, r
 	if message.RelayedMessageEventGUID != nil && message.RelayedMessageEventGUID.ID() == relayEvent.ID() {
 		return nil
 	} else if message.RelayedMessageEventGUID != nil {
-		return fmt.Errorf("relayed message %s re-relayed with a different event %d", messageHash, relayEvent)
+		return fmt.Errorf("relayed message %s re-relayed with a different event %s", messageHash, relayEvent)
 	}
 
 	message.RelayedMessageEventGUID = &relayEvent
diff --git a/indexer/database/bridge_transfers.go b/indexer/database/bridge_transfers.go
index 51bf48d99065..8ba803d5029e 100644
--- a/indexer/database/bridge_transfers.go
+++ b/indexer/database/bridge_transfers.go
@@ -8,7 +8,7 @@ import (
 	"gorm.io/gorm"
 	"gorm.io/gorm/clause"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 )
@@ -307,7 +307,7 @@ type L2BridgeWithdrawalsResponse struct {
 	HasNextPage bool
 }
 
-// L2BridgeDepositsByAddress retrieves a list of deposits initiated by the specified address, coupled with the L1/L2 transaction hashes
+// L2BridgeWithdrawalsByAddress retrieves a list of deposits initiated by the specified address, coupled with the L1/L2 transaction hashes
 // that complete the bridge transaction. The hashes that correspond with the Bedrock multi-step withdrawal process are also surfaced
 func (db *bridgeTransfersDB) L2BridgeWithdrawalsByAddress(address common.Address, cursor string, limit int) (*L2BridgeWithdrawalsResponse, error) {
 	if limit <= 0 {
diff --git a/indexer/e2e_tests/bridge_messages_e2e_test.go b/indexer/e2e_tests/bridge_messages_e2e_test.go
index b5a2cbc38856..44914574e15a 100644
--- a/indexer/e2e_tests/bridge_messages_e2e_test.go
+++ b/indexer/e2e_tests/bridge_messages_e2e_test.go
@@ -8,12 +8,12 @@ import (
 
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions"
 
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
 	e2etest_utils "github.com/ethereum-optimism/optimism/indexer/e2e_tests/utils"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	op_e2e "github.com/ethereum-optimism/optimism/op-e2e"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
 	"github.com/ethereum-optimism/optimism/op-node/withdrawals"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/params"
diff --git a/indexer/e2e_tests/bridge_transactions_e2e_test.go b/indexer/e2e_tests/bridge_transactions_e2e_test.go
index 9a3fde152eb7..02f3eaa83b86 100644
--- a/indexer/e2e_tests/bridge_transactions_e2e_test.go
+++ b/indexer/e2e_tests/bridge_transactions_e2e_test.go
@@ -11,10 +11,10 @@ import (
 	e2etest_utils "github.com/ethereum-optimism/optimism/indexer/e2e_tests/utils"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
 	op_e2e "github.com/ethereum-optimism/optimism/op-e2e"
 	"github.com/ethereum-optimism/optimism/op-node/withdrawals"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/params"
diff --git a/indexer/e2e_tests/bridge_transfers_e2e_test.go b/indexer/e2e_tests/bridge_transfers_e2e_test.go
index 7814d7c53fc8..ac6cde917e9a 100644
--- a/indexer/e2e_tests/bridge_transfers_e2e_test.go
+++ b/indexer/e2e_tests/bridge_transfers_e2e_test.go
@@ -15,8 +15,8 @@ import (
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
 	"github.com/ethereum-optimism/optimism/op-node/withdrawals"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/types"
@@ -565,12 +565,12 @@ func TestClientBridgeFunctions(t *testing.T) {
 		actors[i].amt = l2ToL1MessagePasserWithdrawTx.Value()
 
 		// (3.d) Ensure that withdrawal and deposit txs are retrievable via API
-		deposits, err := testSuite.Client.GetAllDepositsByAddress(actor.addr)
+		deposits, err := testSuite.ApiClient.GetAllDepositsByAddress(actor.addr)
 		require.NoError(t, err)
 		require.Len(t, deposits, 1)
 		require.Equal(t, depositTx.Hash().String(), deposits[0].L1TxHash)
 
-		withdrawals, err := testSuite.Client.GetAllWithdrawalsByAddress(actor.addr)
+		withdrawals, err := testSuite.ApiClient.GetAllWithdrawalsByAddress(actor.addr)
 		require.NoError(t, err)
 		require.Len(t, withdrawals, 1)
 		require.Equal(t, l2ToL1MessagePasserWithdrawTx.Hash().String(), withdrawals[0].TransactionHash)
@@ -578,7 +578,7 @@ func TestClientBridgeFunctions(t *testing.T) {
 	}
 
 	// (4) Ensure that supply assessment is correct
-	assessment, err := testSuite.Client.GetSupplyAssessment()
+	assessment, err := testSuite.ApiClient.GetSupplyAssessment()
 	require.NoError(t, err)
 
 	mintFloat, _ := mintSum.Float64()
@@ -612,7 +612,7 @@ func TestClientBridgeFunctions(t *testing.T) {
 	}
 
 	// (6) Validate assessment for proven & finalized withdrawals
-	assessment, err = testSuite.Client.GetSupplyAssessment()
+	assessment, err = testSuite.ApiClient.GetSupplyAssessment()
 	require.NoError(t, err)
 
 	proven, acc := s.proven.Float64()
diff --git a/indexer/e2e_tests/etl_e2e_test.go b/indexer/e2e_tests/etl_e2e_test.go
index fcde8b653709..e260313c0a57 100644
--- a/indexer/e2e_tests/etl_e2e_test.go
+++ b/indexer/e2e_tests/etl_e2e_test.go
@@ -6,11 +6,12 @@ import (
 	"testing"
 	"time"
 
+	"github.com/ethereum-optimism/optimism/indexer/config"
 	"github.com/ethereum-optimism/optimism/indexer/database"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindingspreview"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
+	"github.com/ethereum-optimism/optimism/op-node/bindings"
+	bindingspreview "github.com/ethereum-optimism/optimism/op-node/bindings/preview"
 	"github.com/ethereum-optimism/optimism/op-node/withdrawals"
 
 	"github.com/ethereum/go-ethereum"
@@ -21,6 +22,33 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
+func TestE2EL1ETLInactivityWindow(t *testing.T) {
+	withInactivityWindow := func(cfg *config.Config) *config.Config {
+		cfg.Chain.ETLAllowedInactivityWindowSeconds = 1
+
+		// Passing the inactivity window will index the latest header
+		// in the batch. Make the batch size 1 so all blocks are indexed
+		cfg.Chain.L1HeaderBufferSize = 1
+		return cfg
+	}
+
+	testSuite := createE2ETestSuite(t, withInactivityWindow)
+
+	// wait for 10 L1 blocks to be posted
+	require.NoError(t, wait.For(context.Background(), time.Second, func() (bool, error) {
+		l1Header := testSuite.Indexer.BridgeProcessor.LastL1Header
+		return l1Header != nil && l1Header.Number.Uint64() >= 10, nil
+	}))
+
+	// each block is indexed
+	for height := int64(0); height < int64(10); height++ {
+		header, err := testSuite.DB.Blocks.L1BlockHeaderWithFilter(database.BlockHeader{Number: big.NewInt(height)})
+		require.NoError(t, err)
+		require.NotNil(t, header)
+		require.Equal(t, header.Number.Uint64(), uint64(height))
+	}
+}
+
 func TestE2EETL(t *testing.T) {
 	testSuite := createE2ETestSuite(t)
 
diff --git a/indexer/e2e_tests/reorg_e2e_test.go b/indexer/e2e_tests/reorg_e2e_test.go
index a6245f47426e..04dcef8f2694 100644
--- a/indexer/e2e_tests/reorg_e2e_test.go
+++ b/indexer/e2e_tests/reorg_e2e_test.go
@@ -6,10 +6,10 @@ import (
 	"testing"
 	"time"
 
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
 	"github.com/ethereum-optimism/optimism/indexer/database"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/params"
 	"github.com/stretchr/testify/require"
diff --git a/indexer/e2e_tests/setup.go b/indexer/e2e_tests/setup.go
index ae7fc445f9b6..32d1268e3343 100644
--- a/indexer/e2e_tests/setup.go
+++ b/indexer/e2e_tests/setup.go
@@ -10,7 +10,6 @@ import (
 
 	"github.com/ethereum-optimism/optimism/indexer"
 	"github.com/ethereum-optimism/optimism/indexer/api"
-	"github.com/ethereum-optimism/optimism/indexer/client"
 	"github.com/ethereum-optimism/optimism/indexer/config"
 	"github.com/ethereum-optimism/optimism/indexer/database"
 
@@ -38,8 +37,8 @@ type E2ETestSuite struct {
 	MetricsRegistry *prometheus.Registry
 
 	// API
-	Client *client.Client
-	API    *api.APIService
+	API       *api.APIService
+	ApiClient *api.Client
 
 	// Indexer
 	DB      *database.DB
@@ -54,6 +53,8 @@ type E2ETestSuite struct {
 	L2Client *ethclient.Client
 }
 
+type ConfigOpts func(*config.Config) *config.Config
+
 func init() {
 	// Disable the global logger. Ideally we'd like to dump geth
 	// logs per-test but that's possible when running tests in
@@ -62,10 +63,12 @@ func init() {
 }
 
 // createE2ETestSuite ... Create a new E2E test suite
-func createE2ETestSuite(t *testing.T) E2ETestSuite {
+func createE2ETestSuite(t *testing.T, cfgOpt ...ConfigOpts) E2ETestSuite {
 	dbUser := os.Getenv("DB_USER")
 	dbName := setupTestDatabase(t)
 
+	require.LessOrEqual(t, len(cfgOpt), 1)
+
 	// E2E tests can run on the order of magnitude of minutes.
 	// We mark the test as parallel before starting the devnet
 	// to reduce that number of idle routines when paused.
@@ -114,6 +117,11 @@ func createE2ETestSuite(t *testing.T) E2ETestSuite {
 		MetricsServer: config.ServerConfig{Host: "127.0.0.1", Port: 0},
 	}
 
+	// apply any settings
+	for _, opt := range cfgOpt {
+		indexerCfg = opt(indexerCfg)
+	}
+
 	indexerLog := testlog.Logger(t, log.LevelInfo).New("role", "indexer")
 	ix, err := indexer.NewIndexer(context.Background(), indexerLog, indexerCfg, func(cause error) {
 		if cause != nil {
@@ -147,13 +155,13 @@ func createE2ETestSuite(t *testing.T) E2ETestSuite {
 	// Wait for the API to start listening
 	time.Sleep(1 * time.Second)
 
-	client, err := client.NewClient(&client.Config{PaginationLimit: 100, BaseURL: "http://" + apiService.Addr()})
+	apiClient, err := api.NewClient(&api.ClientConfig{PaginationLimit: 100, BaseURL: "http://" + apiService.Addr()})
 	require.NoError(t, err, "must open indexer API client")
 
 	return E2ETestSuite{
 		t:               t,
 		MetricsRegistry: metrics.NewRegistry(),
-		Client:          client,
+		ApiClient:       apiClient,
 		DB:              db,
 		Indexer:         ix,
 		OpCfg:           &opCfg,
diff --git a/indexer/e2e_tests/utils/cross_domain_messages.go b/indexer/e2e_tests/utils/cross_domain_messages.go
index e36c453c7857..f3c5e72b2068 100644
--- a/indexer/e2e_tests/utils/cross_domain_messages.go
+++ b/indexer/e2e_tests/utils/cross_domain_messages.go
@@ -4,7 +4,7 @@ import (
 	"errors"
 	"math/big"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
 
 	"github.com/ethereum/go-ethereum/common"
diff --git a/indexer/e2e_tests/utils/deposits.go b/indexer/e2e_tests/utils/deposits.go
index be0ffd21f940..23d29bdbcc53 100644
--- a/indexer/e2e_tests/utils/deposits.go
+++ b/indexer/e2e_tests/utils/deposits.go
@@ -3,7 +3,7 @@ package utils
 import (
 	"errors"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 
 	"github.com/ethereum/go-ethereum/common"
diff --git a/indexer/etl/etl.go b/indexer/etl/etl.go
index 44b468087d34..380d8ed6815f 100644
--- a/indexer/etl/etl.go
+++ b/indexer/etl/etl.go
@@ -13,13 +13,21 @@ import (
 	"github.com/ethereum/go-ethereum/log"
 
 	"github.com/ethereum-optimism/optimism/indexer/node"
+	"github.com/ethereum-optimism/optimism/op-service/client"
 	"github.com/ethereum-optimism/optimism/op-service/clock"
 )
 
+var (
+	defaultRequestTimeout = 5 * time.Second
+)
+
 type Config struct {
 	LoopIntervalMsec uint
 	HeaderBufferSize uint
 
+	// Applicable only to the L1 ETL (all L2 block are indexed)
+	AllowedInactivityWindowSeconds uint
+
 	StartHeight       *big.Int
 	ConfirmationDepth *big.Int
 }
@@ -35,7 +43,7 @@ type ETL struct {
 	contracts  []common.Address
 	etlBatches chan *ETLBatch
 
-	EthClient node.EthClient
+	client client.Client
 
 	// A reference that'll stay populated between intervals
 	// in the event of failures in order to retry.
@@ -119,8 +127,12 @@ func (etl *ETL) processBatch(headers []types.Header) error {
 	}
 
 	headersWithLog := make(map[common.Hash]bool, len(headers))
+
+	ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout)
+	defer cancel()
+
 	filterQuery := ethereum.FilterQuery{FromBlock: firstHeader.Number, ToBlock: lastHeader.Number, Addresses: etl.contracts}
-	logs, err := etl.EthClient.FilterLogs(filterQuery)
+	logs, err := node.FilterLogsSafe(ctxwt, etl.client, filterQuery)
 	if err != nil {
 		batchLog.Info("failed to extract logs", "err", err)
 		return err
diff --git a/indexer/etl/l1_etl.go b/indexer/etl/l1_etl.go
index 4fcd9b020365..1fe87db42c86 100644
--- a/indexer/etl/l1_etl.go
+++ b/indexer/etl/l1_etl.go
@@ -15,13 +15,16 @@ import (
 	"github.com/ethereum-optimism/optimism/indexer/config"
 	"github.com/ethereum-optimism/optimism/indexer/database"
 	"github.com/ethereum-optimism/optimism/indexer/node"
+	"github.com/ethereum-optimism/optimism/op-service/client"
 	"github.com/ethereum-optimism/optimism/op-service/retry"
 	"github.com/ethereum-optimism/optimism/op-service/tasks"
 )
 
 type L1ETL struct {
 	ETL
-	LatestHeader *types.Header
+	latestHeader *types.Header
+
+	cfg Config
 
 	// the batch handler may do work that we can interrupt on shutdown
 	resourceCtx    context.Context
@@ -32,12 +35,12 @@ type L1ETL struct {
 	db *database.DB
 
 	mu        sync.Mutex
-	listeners []chan interface{}
+	listeners []chan *types.Header
 }
 
 // NewL1ETL creates a new L1ETL instance that will start indexing from different starting points
 // depending on the state of the database and the supplied start height.
-func NewL1ETL(cfg Config, log log.Logger, db *database.DB, metrics Metricer, client node.EthClient,
+func NewL1ETL(cfg Config, log log.Logger, db *database.DB, metrics Metricer, client client.Client,
 	contracts config.L1Contracts, shutdown context.CancelCauseFunc) (*L1ETL, error) {
 	log = log.New("etl", "l1")
 
@@ -71,7 +74,11 @@ func NewL1ETL(cfg Config, log log.Logger, db *database.DB, metrics Metricer, cli
 		fromHeader = latestHeader.RLPHeader.Header()
 	} else if cfg.StartHeight.BitLen() > 0 {
 		log.Info("no indexed state starting from supplied L1 height", "height", cfg.StartHeight.String())
-		header, err := client.BlockHeaderByNumber(cfg.StartHeight)
+
+		ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout)
+		defer cancel()
+
+		header, err := client.HeaderByNumber(ctxwt, cfg.StartHeight)
 		if err != nil {
 			return nil, fmt.Errorf("could not fetch starting block header: %w", err)
 		}
@@ -96,13 +103,15 @@ func NewL1ETL(cfg Config, log log.Logger, db *database.DB, metrics Metricer, cli
 		contracts:       l1Contracts,
 		etlBatches:      etlBatches,
 
-		EthClient: client,
+		client: client,
 	}
 
 	resCtx, resCancel := context.WithCancel(context.Background())
 	return &L1ETL{
 		ETL:          etl,
-		LatestHeader: fromHeader,
+		latestHeader: fromHeader,
+
+		cfg: cfg,
 
 		db:             db,
 		resourceCtx:    resCtx,
@@ -161,6 +170,15 @@ func (l1Etl *L1ETL) handleBatch(batch *ETLBatch) error {
 		}
 	}
 
+	// If there has been no activity and the inactivity window has elapsed since the last header, index the latest
+	// block to remediate any false-stall alerts on downstream processors that rely on indexed state.
+	if l1Etl.cfg.AllowedInactivityWindowSeconds > 0 && len(l1BlockHeaders) == 0 {
+		latestHeader := batch.Headers[len(batch.Headers)-1]
+		if l1Etl.latestHeader == nil || latestHeader.Time-l1Etl.latestHeader.Time > uint64(l1Etl.cfg.AllowedInactivityWindowSeconds) {
+			l1BlockHeaders = append(l1BlockHeaders, database.L1BlockHeader{BlockHeader: database.BlockHeaderFromHeader(&latestHeader)})
+		}
+	}
+
 	l1ContractEvents := make([]database.L1ContractEvent, len(batch.Logs))
 	for i := range batch.Logs {
 		timestamp := batch.HeaderMap[batch.Logs[i].BlockHash].Time
@@ -180,8 +198,10 @@ func (l1Etl *L1ETL) handleBatch(batch *ETLBatch) error {
 				return err
 			}
 			// we must have logs if we have l1 blocks
-			if err := tx.ContractEvents.StoreL1ContractEvents(l1ContractEvents); err != nil {
-				return err
+			if len(l1ContractEvents) > 0 {
+				if err := tx.ContractEvents.StoreL1ContractEvents(l1ContractEvents); err != nil {
+					return err
+				}
 			}
 			return nil
 		}); err != nil {
@@ -203,16 +223,16 @@ func (l1Etl *L1ETL) handleBatch(batch *ETLBatch) error {
 
 	// Since not every L1 block is indexed, we still want our metrics to cover L1 blocks
 	// that have been observed so that a false stall alert isn't triggered on low activity
-	l1Etl.LatestHeader = &batch.Headers[len(batch.Headers)-1]
+	l1Etl.latestHeader = &batch.Headers[len(batch.Headers)-1]
 	l1Etl.ETL.metrics.RecordIndexedHeaders(len(l1BlockHeaders))
-	l1Etl.ETL.metrics.RecordEtlLatestHeight(l1Etl.LatestHeader.Number)
+	l1Etl.ETL.metrics.RecordEtlLatestHeight(l1Etl.latestHeader.Number)
 
 	// Notify Listeners
 	l1Etl.mu.Lock()
 	defer l1Etl.mu.Unlock()
 	for i := range l1Etl.listeners {
 		select {
-		case l1Etl.listeners[i] <- struct{}{}:
+		case l1Etl.listeners[i] <- l1Etl.latestHeader:
 		default:
 			// do nothing if the listener hasn't picked
 			// up the previous notif
@@ -222,10 +242,9 @@ func (l1Etl *L1ETL) handleBatch(batch *ETLBatch) error {
 	return nil
 }
 
-// Notify returns a channel that'll receive a value every time new data has
-// been persisted by the L1ETL
-func (l1Etl *L1ETL) Notify() <-chan interface{} {
-	receiver := make(chan interface{})
+// Notify returns a channel that'll receive the latest header when new data has been persisted
+func (l1Etl *L1ETL) Notify() <-chan *types.Header {
+	receiver := make(chan *types.Header)
 	l1Etl.mu.Lock()
 	defer l1Etl.mu.Unlock()
 
diff --git a/indexer/etl/l1_etl_test.go b/indexer/etl/l1_etl_test.go
index e57f16f6fd92..d97909ec0f4d 100644
--- a/indexer/etl/l1_etl_test.go
+++ b/indexer/etl/l1_etl_test.go
@@ -4,19 +4,18 @@ import (
 	"math/big"
 	"testing"
 
-	"github.com/stretchr/testify/mock"
 	"github.com/stretchr/testify/require"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
 
-	"github.com/ethereum-optimism/optimism/indexer/bigint"
 	"github.com/ethereum-optimism/optimism/indexer/config"
 	"github.com/ethereum-optimism/optimism/indexer/database"
-	"github.com/ethereum-optimism/optimism/indexer/node"
+	"github.com/ethereum-optimism/optimism/op-service/client"
 	"github.com/ethereum-optimism/optimism/op-service/metrics"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
+	"github.com/ethereum-optimism/optimism/op-service/testutils"
 )
 
 func TestL1ETLConstruction(t *testing.T) {
@@ -24,7 +23,7 @@ func TestL1ETLConstruction(t *testing.T) {
 
 	type testSuite struct {
 		db        *database.MockDB
-		client    *node.MockEthClient
+		client    client.Client
 		start     *big.Int
 		contracts config.L1Contracts
 	}
@@ -37,19 +36,13 @@ func TestL1ETLConstruction(t *testing.T) {
 		{
 			name: "Start from L1 config height",
 			construction: func() *testSuite {
-				client := new(node.MockEthClient)
+				client := new(testutils.MockClient)
 				db := database.NewMockDB()
 
 				testStart := big.NewInt(100)
 				db.MockBlocks.On("L1LatestBlockHeader").Return(nil, nil)
 
-				client.On("BlockHeaderByNumber", mock.MatchedBy(
-					bigint.Matcher(100))).Return(
-					&types.Header{
-						ParentHash: common.HexToHash("0x69"),
-					}, nil)
-
-				client.On("GethEthClient").Return(nil)
+				client.ExpectHeaderByNumber(big.NewInt(100), &types.Header{ParentHash: common.HexToHash("0x69")}, nil)
 
 				return &testSuite{
 					db:     db,
@@ -68,7 +61,7 @@ func TestL1ETLConstruction(t *testing.T) {
 		{
 			name: "Start from recent height stored in DB",
 			construction: func() *testSuite {
-				client := new(node.MockEthClient)
+				client := new(testutils.MockClient)
 				db := database.NewMockDB()
 
 				testStart := big.NewInt(100)
@@ -81,8 +74,6 @@ func TestL1ETLConstruction(t *testing.T) {
 							},
 						}}, nil)
 
-				client.On("GethEthClient").Return(nil)
-
 				return &testSuite{
 					db:     db,
 					client: client,
diff --git a/indexer/etl/l2_etl.go b/indexer/etl/l2_etl.go
index b88d71bf8932..f9df6eef7297 100644
--- a/indexer/etl/l2_etl.go
+++ b/indexer/etl/l2_etl.go
@@ -14,13 +14,14 @@ import (
 	"github.com/ethereum-optimism/optimism/indexer/config"
 	"github.com/ethereum-optimism/optimism/indexer/database"
 	"github.com/ethereum-optimism/optimism/indexer/node"
+	"github.com/ethereum-optimism/optimism/op-service/client"
 	"github.com/ethereum-optimism/optimism/op-service/retry"
 	"github.com/ethereum-optimism/optimism/op-service/tasks"
 )
 
 type L2ETL struct {
 	ETL
-	LatestHeader *types.Header
+	latestHeader *types.Header
 
 	// the batch handler may do work that we can interrupt on shutdown
 	resourceCtx    context.Context
@@ -31,10 +32,10 @@ type L2ETL struct {
 	db *database.DB
 
 	mu        sync.Mutex
-	listeners []chan interface{}
+	listeners []chan *types.Header
 }
 
-func NewL2ETL(cfg Config, log log.Logger, db *database.DB, metrics Metricer, client node.EthClient,
+func NewL2ETL(cfg Config, log log.Logger, db *database.DB, metrics Metricer, client client.Client,
 	contracts config.L2Contracts, shutdown context.CancelCauseFunc) (*L2ETL, error) {
 	log = log.New("etl", "l2")
 
@@ -80,13 +81,13 @@ func NewL2ETL(cfg Config, log log.Logger, db *database.DB, metrics Metricer, cli
 		contracts:       l2Contracts,
 		etlBatches:      etlBatches,
 
-		EthClient: client,
+		client: client,
 	}
 
 	resCtx, resCancel := context.WithCancel(context.Background())
 	return &L2ETL{
 		ETL:          etl,
-		LatestHeader: fromHeader,
+		latestHeader: fromHeader,
 
 		resourceCtx:    resCtx,
 		resourceCancel: resCancel,
@@ -150,6 +151,8 @@ func (l2Etl *L2ETL) handleBatch(batch *ETLBatch) error {
 		l2Etl.ETL.metrics.RecordIndexedLog(batch.Logs[i].Address)
 	}
 
+	/** Every L2 block is indexed so the inactivity window does not apply here **/
+
 	// Continually try to persist this batch. If it fails after 10 attempts, we simply error out
 	retryStrategy := &retry.ExponentialStrategy{Min: 1000, Max: 20_000, MaxJitter: 250}
 	if _, err := retry.Do[interface{}](l2Etl.resourceCtx, 10, retryStrategy, func() (interface{}, error) {
@@ -177,16 +180,16 @@ func (l2Etl *L2ETL) handleBatch(batch *ETLBatch) error {
 	batch.Logger.Info("indexed batch")
 
 	// All L2 blocks are indexed so len(batch.Headers) == len(l2BlockHeaders)
-	l2Etl.LatestHeader = &batch.Headers[len(batch.Headers)-1]
+	l2Etl.latestHeader = &batch.Headers[len(batch.Headers)-1]
 	l2Etl.ETL.metrics.RecordIndexedHeaders(len(l2BlockHeaders))
-	l2Etl.ETL.metrics.RecordEtlLatestHeight(l2Etl.LatestHeader.Number)
+	l2Etl.ETL.metrics.RecordEtlLatestHeight(l2Etl.latestHeader.Number)
 
 	// Notify Listeners
 	l2Etl.mu.Lock()
 	defer l2Etl.mu.Unlock()
 	for i := range l2Etl.listeners {
 		select {
-		case l2Etl.listeners[i] <- struct{}{}:
+		case l2Etl.listeners[i] <- l2Etl.latestHeader:
 		default:
 			// do nothing if the listener hasn't picked
 			// up the previous notif
@@ -196,10 +199,9 @@ func (l2Etl *L2ETL) handleBatch(batch *ETLBatch) error {
 	return nil
 }
 
-// Notify returns a channel that'll receive a value every time new data has
-// been persisted by the L2ETL
-func (l2Etl *L2ETL) Notify() <-chan interface{} {
-	receiver := make(chan interface{})
+// Notify returns a channel that'll receive the latest header when new data has been persisted
+func (l2Etl *L2ETL) Notify() <-chan *types.Header {
+	receiver := make(chan *types.Header)
 	l2Etl.mu.Lock()
 	defer l2Etl.mu.Unlock()
 
diff --git a/indexer/indexer.go b/indexer/indexer.go
index 639871d018d1..631fc594b8d5 100644
--- a/indexer/indexer.go
+++ b/indexer/indexer.go
@@ -10,6 +10,7 @@ import (
 	"sync/atomic"
 
 	"github.com/ethereum/go-ethereum/log"
+	"github.com/ethereum/go-ethereum/rpc"
 
 	"github.com/go-chi/chi/v5"
 	"github.com/go-chi/chi/v5/middleware"
@@ -19,21 +20,25 @@ import (
 	"github.com/ethereum-optimism/optimism/indexer/config"
 	"github.com/ethereum-optimism/optimism/indexer/database"
 	"github.com/ethereum-optimism/optimism/indexer/etl"
-	"github.com/ethereum-optimism/optimism/indexer/node"
 	"github.com/ethereum-optimism/optimism/indexer/processors"
 	"github.com/ethereum-optimism/optimism/indexer/processors/bridge"
+	"github.com/ethereum-optimism/optimism/op-service/client"
 	"github.com/ethereum-optimism/optimism/op-service/httputil"
 	"github.com/ethereum-optimism/optimism/op-service/metrics"
 )
 
+const (
+	MetricsNamespace = "op_indexer"
+)
+
 // Indexer contains the necessary resources for
 // indexing the configured L1 and L2 chains
 type Indexer struct {
 	log log.Logger
 	DB  *database.DB
 
-	l1Client node.EthClient
-	l2Client node.EthClient
+	l1Client client.Client
+	l2Client client.Client
 
 	metricsRegistry *prometheus.Registry
 
@@ -166,17 +171,29 @@ func (ix *Indexer) initFromConfig(ctx context.Context, cfg *config.Config) error
 }
 
 func (ix *Indexer) initRPCClients(ctx context.Context, rpcsConfig config.RPCsConfig) error {
-	l1EthClient, err := node.DialEthClient(ctx, rpcsConfig.L1RPC, node.NewMetrics(ix.metricsRegistry, "l1"))
+	if !client.IsURLAvailable(rpcsConfig.L1RPC) {
+		return fmt.Errorf("l1 rpc address unavailable (%s)", rpcsConfig.L1RPC)
+	}
+	l1Rpc, err := rpc.DialContext(ctx, rpcsConfig.L1RPC)
 	if err != nil {
 		return fmt.Errorf("failed to dial L1 client: %w", err)
 	}
-	ix.l1Client = l1EthClient
 
-	l2EthClient, err := node.DialEthClient(ctx, rpcsConfig.L2RPC, node.NewMetrics(ix.metricsRegistry, "l2"))
+	if !client.IsURLAvailable(rpcsConfig.L2RPC) {
+		return fmt.Errorf("l2 rpc address unavailable (%s)", rpcsConfig.L2RPC)
+	}
+	l2Rpc, err := rpc.DialContext(ctx, rpcsConfig.L2RPC)
 	if err != nil {
 		return fmt.Errorf("failed to dial L2 client: %w", err)
 	}
-	ix.l2Client = l2EthClient
+
+	mFactory := metrics.With(ix.metricsRegistry)
+
+	l1RpcMetrics := metrics.MakeRPCClientMetrics(fmt.Sprintf("%s_%s", MetricsNamespace, "l1"), mFactory)
+	ix.l1Client = client.NewInstrumentedClient(l1Rpc, &l1RpcMetrics)
+
+	l2RpcMetrics := metrics.MakeRPCClientMetrics(fmt.Sprintf("%s_%s", MetricsNamespace, "l2"), mFactory)
+	ix.l2Client = client.NewInstrumentedClient(l2Rpc, &l2RpcMetrics)
 	return nil
 }
 
@@ -191,10 +208,11 @@ func (ix *Indexer) initDB(ctx context.Context, cfg config.DBConfig) error {
 
 func (ix *Indexer) initL1ETL(chainConfig config.ChainConfig) error {
 	l1Cfg := etl.Config{
-		LoopIntervalMsec:  chainConfig.L1PollingInterval,
-		HeaderBufferSize:  chainConfig.L1HeaderBufferSize,
-		ConfirmationDepth: big.NewInt(int64(chainConfig.L1ConfirmationDepth)),
-		StartHeight:       big.NewInt(int64(chainConfig.L1StartingHeight)),
+		LoopIntervalMsec:               chainConfig.L1PollingInterval,
+		HeaderBufferSize:               chainConfig.L1HeaderBufferSize,
+		AllowedInactivityWindowSeconds: chainConfig.ETLAllowedInactivityWindowSeconds,
+		ConfirmationDepth:              big.NewInt(int64(chainConfig.L1ConfirmationDepth)),
+		StartHeight:                    big.NewInt(int64(chainConfig.L1StartingHeight)),
 	}
 	l1Etl, err := etl.NewL1ETL(l1Cfg, ix.log, ix.DB, etl.NewMetrics(ix.metricsRegistry, "l1"),
 		ix.l1Client, chainConfig.L1Contracts, ix.shutdown)
diff --git a/indexer/migrations/20230523_create_schema.sql b/indexer/migrations/20230523_create_schema.sql
index 7176c055bc3f..7d0a99d97c12 100644
--- a/indexer/migrations/20230523_create_schema.sql
+++ b/indexer/migrations/20230523_create_schema.sql
@@ -33,7 +33,7 @@ CREATE TABLE IF NOT EXISTS l2_block_headers (
     hash        VARCHAR PRIMARY KEY,
     parent_hash VARCHAR NOT NULL UNIQUE,
     number      UINT256 NOT NULL UNIQUE,
-    timestamp   INTEGER NOT NULL,
+    timestamp   INTEGER NOT NULL CHECK (timestamp > 0),
 
     -- Raw Data
     rlp_bytes VARCHAR NOT NULL
diff --git a/indexer/node/client.go b/indexer/node/client.go
index 1ad6f0a21e0a..17bae886ae3f 100644
--- a/indexer/node/client.go
+++ b/indexer/node/client.go
@@ -5,10 +5,8 @@ import (
 	"errors"
 	"fmt"
 	"math/big"
-	"time"
 
 	"github.com/ethereum-optimism/optimism/op-service/client"
-	"github.com/ethereum-optimism/optimism/op-service/retry"
 
 	"github.com/ethereum/go-ethereum"
 	"github.com/ethereum/go-ethereum/common"
@@ -17,178 +15,57 @@ import (
 	"github.com/ethereum/go-ethereum/rpc"
 )
 
-const (
-	// defaultDialTimeout is default duration the processor will wait on
-	// startup to make a connection to the backend
-	defaultDialTimeout = 5 * time.Second
-
-	// defaultDialAttempts is the default attempts a connection will be made
-	// before failing
-	defaultDialAttempts = 5
-
-	// defaultRequestTimeout is the default duration the processor will
-	// wait for a request to be fulfilled
-	defaultRequestTimeout = 10 * time.Second
-)
-
-type EthClient interface {
-	BlockHeaderByNumber(*big.Int) (*types.Header, error)
-	BlockHeaderByHash(common.Hash) (*types.Header, error)
-	BlockHeadersByRange(*big.Int, *big.Int) ([]types.Header, error)
-
-	TxByHash(common.Hash) (*types.Transaction, error)
-
-	StorageHash(common.Address, *big.Int) (common.Hash, error)
-	FilterLogs(ethereum.FilterQuery) (Logs, error)
-
-	// Close closes the underlying RPC connection.
-	// RPC close does not return any errors, but does shut down e.g. a websocket connection.
-	Close()
-}
-
-type clnt struct {
-	rpc RPC
-}
-
-func DialEthClient(ctx context.Context, rpcUrl string, metrics Metricer) (EthClient, error) {
-	ctx, cancel := context.WithTimeout(ctx, defaultDialTimeout)
-	defer cancel()
-
-	bOff := retry.Exponential()
-	rpcClient, err := retry.Do(ctx, defaultDialAttempts, bOff, func() (*rpc.Client, error) {
-		if !client.IsURLAvailable(rpcUrl) {
-			return nil, fmt.Errorf("address unavailable (%s)", rpcUrl)
-		}
-
-		client, err := rpc.DialContext(ctx, rpcUrl)
-		if err != nil {
-			return nil, fmt.Errorf("failed to dial address (%s): %w", rpcUrl, err)
-		}
-
-		return client, nil
-	})
-
-	if err != nil {
-		return nil, err
-	}
-
-	return &clnt{rpc: NewRPC(rpcClient, metrics)}, nil
-}
-
-// BlockHeaderByHash retrieves the block header attributed to the supplied hash
-func (c *clnt) BlockHeaderByHash(hash common.Hash) (*types.Header, error) {
-	ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout)
-	defer cancel()
-
-	var header *types.Header
-	err := c.rpc.CallContext(ctxwt, &header, "eth_getBlockByHash", hash, false)
-	if err != nil {
-		return nil, err
-	} else if header == nil {
-		return nil, ethereum.NotFound
-	}
-
-	// sanity check on the data returned
-	if header.Hash() != hash {
-		return nil, errors.New("header mismatch")
-	}
-
-	return header, nil
-}
-
-// BlockHeaderByNumber retrieves the block header attributed to the supplied height
-func (c *clnt) BlockHeaderByNumber(number *big.Int) (*types.Header, error) {
-	ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout)
-	defer cancel()
-
-	var header *types.Header
-	err := c.rpc.CallContext(ctxwt, &header, "eth_getBlockByNumber", toBlockNumArg(number), false)
-	if err != nil {
-		return nil, err
-	} else if header == nil {
-		return nil, ethereum.NotFound
-	}
-
-	return header, nil
-}
-
-// BlockHeadersByRange will retrieve block headers within the specified range -- inclusive. No restrictions
+// HeadersByRange will retrieve block headers within the specified range -- inclusive. No restrictions
 // are placed on the range such as blocks in the "latest", "safe" or "finalized" states. If the specified
 // range is too large, `endHeight > latest`, the resulting list is truncated to the available headers
-func (c *clnt) BlockHeadersByRange(startHeight, endHeight *big.Int) ([]types.Header, error) {
-	// avoid the batch call if there's no range
+func HeadersByRange(ctx context.Context, c client.Client, startHeight, endHeight *big.Int) ([]types.Header, error) {
 	if startHeight.Cmp(endHeight) == 0 {
-		header, err := c.BlockHeaderByNumber(startHeight)
+		header, err := c.HeaderByNumber(ctx, startHeight)
 		if err != nil {
 			return nil, err
 		}
 		return []types.Header{*header}, nil
 	}
 
-	count := new(big.Int).Sub(endHeight, startHeight).Uint64() + 1
-	headers := make([]types.Header, count)
-	batchElems := make([]rpc.BatchElem, count)
-
-	for i := uint64(0); i < count; i++ {
-		height := new(big.Int).Add(startHeight, new(big.Int).SetUint64(i))
-		batchElems[i] = rpc.BatchElem{Method: "eth_getBlockByNumber", Args: []interface{}{toBlockNumArg(height), false}, Result: &headers[i]}
-	}
-
-	ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout)
-	defer cancel()
-	err := c.rpc.BatchCallContext(ctxwt, batchElems)
-	if err != nil {
+	// Batch the header requests
+	rpcElems := makeHeaderRpcElems(startHeight, endHeight)
+	if err := c.RPC().BatchCallContext(ctx, rpcElems); err != nil {
 		return nil, err
 	}
 
 	// Parse the headers.
 	//  - Ensure integrity that they build on top of each other
 	//  - Truncate out headers that do not exist (endHeight > "latest")
-	size := 0
-	for i, batchElem := range batchElems {
-		if batchElem.Error != nil {
-			if size == 0 {
-				return nil, batchElem.Error
+	headers := make([]types.Header, 0, len(rpcElems))
+	for i, rpcElem := range rpcElems {
+		if rpcElem.Error != nil {
+			if len(headers) == 0 {
+				return nil, rpcElem.Error // no headers
 			} else {
 				break // try return whatever headers are available
 			}
-		} else if batchElem.Result == nil {
+		} else if rpcElem.Result == nil {
 			break
 		}
 
-		if i > 0 && headers[i].ParentHash != headers[i-1].Hash() {
-			return nil, fmt.Errorf("queried header %s does not follow parent %s", headers[i].Hash(), headers[i-1].Hash())
+		header := (rpcElem.Result).(*types.Header)
+		if i > 0 {
+			prevHeader := (rpcElems[i-1].Result).(*types.Header)
+			if header.ParentHash != prevHeader.Hash() {
+				return nil, fmt.Errorf("queried header %s does not follow parent %s", header.Hash(), prevHeader.Hash())
+			}
 		}
 
-		size = size + 1
+		headers = append(headers, *header)
 	}
 
-	headers = headers[:size]
 	return headers, nil
 }
 
-func (c *clnt) TxByHash(hash common.Hash) (*types.Transaction, error) {
-	ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout)
-	defer cancel()
-
-	var tx *types.Transaction
-	err := c.rpc.CallContext(ctxwt, &tx, "eth_getTransactionByHash", hash)
-	if err != nil {
-		return nil, err
-	} else if tx == nil {
-		return nil, ethereum.NotFound
-	}
-
-	return tx, nil
-}
-
 // StorageHash returns the sha3 of the storage root for the specified account
-func (c *clnt) StorageHash(address common.Address, blockNumber *big.Int) (common.Hash, error) {
-	ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout)
-	defer cancel()
-
+func StorageHash(ctx context.Context, c client.Client, address common.Address, blockNumber *big.Int) (common.Hash, error) {
 	proof := struct{ StorageHash common.Hash }{}
-	err := c.rpc.CallContext(ctxwt, &proof, "eth_getProof", address, nil, toBlockNumArg(blockNumber))
+	err := c.RPC().CallContext(ctx, &proof, "eth_getProof", address, nil, toBlockNumArg(blockNumber))
 	if err != nil {
 		return common.Hash{}, err
 	}
@@ -196,19 +73,15 @@ func (c *clnt) StorageHash(address common.Address, blockNumber *big.Int) (common
 	return proof.StorageHash, nil
 }
 
-func (c *clnt) Close() {
-	c.rpc.Close()
-}
-
 type Logs struct {
 	Logs          []types.Log
 	ToBlockHeader *types.Header
 }
 
-// FilterLogs returns logs that fit the query parameters. The underlying request is a batch
+// FilterLogsSafe returns logs that fit the query parameters. The underlying request is a batch
 // request including `eth_getBlockByNumber` to allow the caller to check that connected
 // node has the state necessary to fulfill this request
-func (c *clnt) FilterLogs(query ethereum.FilterQuery) (Logs, error) {
+func FilterLogsSafe(ctx context.Context, c client.Client, query ethereum.FilterQuery) (Logs, error) {
 	arg, err := toFilterArg(query)
 	if err != nil {
 		return Logs{}, err
@@ -221,10 +94,7 @@ func (c *clnt) FilterLogs(query ethereum.FilterQuery) (Logs, error) {
 	batchElems[0] = rpc.BatchElem{Method: "eth_getBlockByNumber", Args: []interface{}{toBlockNumArg(query.ToBlock), false}, Result: &header}
 	batchElems[1] = rpc.BatchElem{Method: "eth_getLogs", Args: []interface{}{arg}, Result: &logs}
 
-	ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout)
-	defer cancel()
-	err = c.rpc.BatchCallContext(ctxwt, batchElems)
-	if err != nil {
+	if err := c.RPC().BatchCallContext(ctx, batchElems); err != nil {
 		return Logs{}, err
 	}
 
@@ -239,40 +109,18 @@ func (c *clnt) FilterLogs(query ethereum.FilterQuery) (Logs, error) {
 	return Logs{Logs: logs, ToBlockHeader: &header}, nil
 }
 
-// Modeled off op-service/client.go. We can refactor this once the client/metrics portion
-// of op-service/client has been generalized
-
-type RPC interface {
-	Close()
-	CallContext(ctx context.Context, result any, method string, args ...any) error
-	BatchCallContext(ctx context.Context, b []rpc.BatchElem) error
-}
-
-type rpcClient struct {
-	rpc     *rpc.Client
-	metrics Metricer
-}
-
-func NewRPC(client *rpc.Client, metrics Metricer) RPC {
-	return &rpcClient{client, metrics}
-}
-
-func (c *rpcClient) Close() {
-	c.rpc.Close()
-}
-
-func (c *rpcClient) CallContext(ctx context.Context, result any, method string, args ...any) error {
-	record := c.metrics.RecordRPCClientRequest(method)
-	err := c.rpc.CallContext(ctx, result, method, args...)
-	record(err)
-	return err
-}
-
-func (c *rpcClient) BatchCallContext(ctx context.Context, b []rpc.BatchElem) error {
-	record := c.metrics.RecordRPCClientBatchRequest(b)
-	err := c.rpc.BatchCallContext(ctx, b)
-	record(err)
-	return err
+func makeHeaderRpcElems(startHeight, endHeight *big.Int) []rpc.BatchElem {
+	count := new(big.Int).Sub(endHeight, startHeight).Uint64() + 1
+	batchElems := make([]rpc.BatchElem, count)
+	for i := uint64(0); i < count; i++ {
+		height := new(big.Int).Add(startHeight, new(big.Int).SetUint64(i))
+		batchElems[i] = rpc.BatchElem{
+			Method: "eth_getBlockByNumber",
+			Args:   []interface{}{toBlockNumArg(height), false},
+			Result: new(types.Header),
+		}
+	}
+	return batchElems
 }
 
 // Needed private utils from geth
diff --git a/indexer/node/client_test.go b/indexer/node/client_test.go
deleted file mode 100644
index 78cf5b5b82a5..000000000000
--- a/indexer/node/client_test.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package node
-
-import (
-	"context"
-	"fmt"
-	"net"
-	"strings"
-	"testing"
-
-	"github.com/stretchr/testify/require"
-)
-
-func TestDialEthClientUnavailable(t *testing.T) {
-	listener, err := net.Listen("tcp4", ":0")
-	require.NoError(t, err)
-	defer listener.Close()
-
-	a := listener.Addr().String()
-	parts := strings.Split(a, ":")
-	addr := fmt.Sprintf("http://localhost:%s", parts[1])
-
-	metrics := &clientMetrics{}
-
-	// available
-	_, err = DialEthClient(context.Background(), addr, metrics)
-	require.NoError(t, err)
-
-	// :0 requests a new unbound port
-	_, err = DialEthClient(context.Background(), "http://localhost:0", metrics)
-	require.Error(t, err)
-
-	// Fail open if we don't recognize the scheme
-	_, err = DialEthClient(context.Background(), "mailto://example.com", metrics)
-	require.Error(t, err)
-}
diff --git a/indexer/node/header_traversal.go b/indexer/node/header_traversal.go
index 3546aa8d1e46..6be52c388667 100644
--- a/indexer/node/header_traversal.go
+++ b/indexer/node/header_traversal.go
@@ -1,21 +1,27 @@
 package node
 
 import (
+	"context"
 	"errors"
 	"fmt"
 	"math/big"
+	"time"
 
 	"github.com/ethereum-optimism/optimism/indexer/bigint"
+	"github.com/ethereum-optimism/optimism/op-service/client"
+
 	"github.com/ethereum/go-ethereum/core/types"
 )
 
 var (
 	ErrHeaderTraversalAheadOfProvider            = errors.New("the HeaderTraversal's internal state is ahead of the provider")
 	ErrHeaderTraversalAndProviderMismatchedState = errors.New("the HeaderTraversal and provider have diverged in state")
+
+	defaultRequestTimeout = 5 * time.Second
 )
 
 type HeaderTraversal struct {
-	ethClient EthClient
+	client client.Client
 
 	latestHeader        *types.Header
 	lastTraversedHeader *types.Header
@@ -25,9 +31,9 @@ type HeaderTraversal struct {
 
 // NewHeaderTraversal instantiates a new instance of HeaderTraversal against the supplied rpc client.
 // The HeaderTraversal will start fetching blocks starting from the supplied header unless nil, indicating genesis.
-func NewHeaderTraversal(ethClient EthClient, fromHeader *types.Header, confDepth *big.Int) *HeaderTraversal {
+func NewHeaderTraversal(client client.Client, fromHeader *types.Header, confDepth *big.Int) *HeaderTraversal {
 	return &HeaderTraversal{
-		ethClient:              ethClient,
+		client:                 client,
 		lastTraversedHeader:    fromHeader,
 		blockConfirmationDepth: confDepth,
 	}
@@ -50,7 +56,10 @@ func (f *HeaderTraversal) LastTraversedHeader() *types.Header {
 // NextHeaders retrieves the next set of headers that have been
 // marked as finalized by the connected client, bounded by the supplied size
 func (f *HeaderTraversal) NextHeaders(maxSize uint64) ([]types.Header, error) {
-	latestHeader, err := f.ethClient.BlockHeaderByNumber(nil)
+	ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout)
+	defer cancel()
+
+	latestHeader, err := f.client.HeaderByNumber(ctxwt, nil)
 	if err != nil {
 		return nil, fmt.Errorf("unable to query latest block: %w", err)
 	} else if latestHeader == nil {
@@ -81,7 +90,11 @@ func (f *HeaderTraversal) NextHeaders(maxSize uint64) ([]types.Header, error) {
 
 	// endHeight = (nextHeight - endHeight) <= maxSize
 	endHeight = bigint.Clamp(nextHeight, endHeight, maxSize)
-	headers, err := f.ethClient.BlockHeadersByRange(nextHeight, endHeight)
+
+	ctxwt, cancel = context.WithTimeout(context.Background(), defaultRequestTimeout)
+	defer cancel()
+
+	headers, err := HeadersByRange(ctxwt, f.client, nextHeight, endHeight)
 	if err != nil {
 		return nil, fmt.Errorf("error querying blocks by range: %w", err)
 	}
diff --git a/indexer/node/header_traversal_test.go b/indexer/node/header_traversal_test.go
index 603b8fdd3a97..2b5ca0528332 100644
--- a/indexer/node/header_traversal_test.go
+++ b/indexer/node/header_traversal_test.go
@@ -5,7 +5,7 @@ import (
 	"testing"
 
 	"github.com/ethereum-optimism/optimism/indexer/bigint"
-	"github.com/stretchr/testify/mock"
+	"github.com/ethereum-optimism/optimism/op-service/testutils"
 	"github.com/stretchr/testify/require"
 
 	"github.com/ethereum/go-ethereum/core/types"
@@ -34,7 +34,8 @@ func makeHeaders(numHeaders uint64, prevHeader *types.Header) []types.Header {
 }
 
 func TestHeaderTraversalNextHeadersNoOp(t *testing.T) {
-	client := new(MockEthClient)
+	client := &testutils.MockClient{}
+	t.Cleanup(func() { client.AssertExpectations(t) })
 
 	// start from block 10 as the latest fetched block
 	LastTraversedHeader := &types.Header{Number: big.NewInt(10)}
@@ -44,7 +45,7 @@ func TestHeaderTraversalNextHeadersNoOp(t *testing.T) {
 	require.NotNil(t, headerTraversal.LastTraversedHeader())
 
 	// no new headers when matched with head
-	client.On("BlockHeaderByNumber", (*big.Int)(nil)).Return(LastTraversedHeader, nil)
+	client.ExpectHeaderByNumber(nil, LastTraversedHeader, nil)
 	headers, err := headerTraversal.NextHeaders(100)
 	require.NoError(t, err)
 	require.Empty(t, headers)
@@ -55,16 +56,25 @@ func TestHeaderTraversalNextHeadersNoOp(t *testing.T) {
 }
 
 func TestHeaderTraversalNextHeadersCursored(t *testing.T) {
-	client := new(MockEthClient)
+	client := &testutils.MockClient{}
+	t.Cleanup(func() { client.AssertExpectations(t) })
 
-	// start from genesis
+	rpc := &testutils.MockRPC{}
+	client.Mock.On("RPC").Return(rpc)
+	t.Cleanup(func() { rpc.AssertExpectations(t) })
+
+	// start from genesis, 7 available headers
 	headerTraversal := NewHeaderTraversal(client, nil, bigint.Zero)
+	client.ExpectHeaderByNumber(nil, &types.Header{Number: big.NewInt(7)}, nil)
 
 	headers := makeHeaders(10, nil)
+	rpcElems := makeHeaderRpcElems(headers[0].Number, headers[9].Number)
+	for i := 0; i < len(rpcElems); i++ {
+		rpcElems[i].Result = &headers[i]
+	}
 
-	// blocks [0..4]. Latest reported is 7
-	client.On("BlockHeaderByNumber", (*big.Int)(nil)).Return(&headers[7], nil).Times(1) // Times so that we can override next
-	client.On("BlockHeadersByRange", mock.MatchedBy(bigint.Matcher(0)), mock.MatchedBy(bigint.Matcher(4))).Return(headers[:5], nil)
+	// traverse blocks [0..4]. Latest reported is 7
+	rpc.ExpectBatchCallContext(rpcElems[:5], nil)
 	_, err := headerTraversal.NextHeaders(5)
 	require.NoError(t, err)
 
@@ -72,8 +82,8 @@ func TestHeaderTraversalNextHeadersCursored(t *testing.T) {
 	require.Equal(t, uint64(4), headerTraversal.LastTraversedHeader().Number.Uint64())
 
 	// blocks [5..9]. Latest Reported is 9
-	client.On("BlockHeaderByNumber", (*big.Int)(nil)).Return(&headers[9], nil)
-	client.On("BlockHeadersByRange", mock.MatchedBy(bigint.Matcher(5)), mock.MatchedBy(bigint.Matcher(9))).Return(headers[5:], nil)
+	client.ExpectHeaderByNumber(nil, &headers[9], nil)
+	rpc.ExpectBatchCallContext(rpcElems[5:], nil)
 	_, err = headerTraversal.NextHeaders(5)
 	require.NoError(t, err)
 
@@ -82,17 +92,25 @@ func TestHeaderTraversalNextHeadersCursored(t *testing.T) {
 }
 
 func TestHeaderTraversalNextHeadersMaxSize(t *testing.T) {
-	client := new(MockEthClient)
+	client := &testutils.MockClient{}
+	t.Cleanup(func() { client.AssertExpectations(t) })
 
-	// start from genesis
-	headerTraversal := NewHeaderTraversal(client, nil, bigint.Zero)
+	rpc := &testutils.MockRPC{}
+	client.Mock.On("RPC").Return(rpc)
+	t.Cleanup(func() { rpc.AssertExpectations(t) })
 
-	// 100 "available" headers
-	client.On("BlockHeaderByNumber", (*big.Int)(nil)).Return(&types.Header{Number: big.NewInt(100)}, nil)
+	// start from genesis, 100 available headers
+	headerTraversal := NewHeaderTraversal(client, nil, bigint.Zero)
+	client.ExpectHeaderByNumber(nil, &types.Header{Number: big.NewInt(100)}, nil)
 
-	// clamped by the supplied size
 	headers := makeHeaders(5, nil)
-	client.On("BlockHeadersByRange", mock.MatchedBy(bigint.Matcher(0)), mock.MatchedBy(bigint.Matcher(4))).Return(headers, nil)
+	rpcElems := makeHeaderRpcElems(headers[0].Number, headers[4].Number)
+	for i := 0; i < len(rpcElems); i++ {
+		rpcElems[i].Result = &headers[i]
+	}
+
+	// traverse only 5 headers [0..4]
+	rpc.ExpectBatchCallContext(rpcElems, nil)
 	headers, err := headerTraversal.NextHeaders(5)
 	require.NoError(t, err)
 	require.Len(t, headers, 5)
@@ -101,8 +119,14 @@ func TestHeaderTraversalNextHeadersMaxSize(t *testing.T) {
 	require.Equal(t, uint64(4), headerTraversal.LastTraversedHeader().Number.Uint64())
 
 	// clamped by the supplied size. FinalizedHeight == 100
+	client.ExpectHeaderByNumber(nil, &types.Header{Number: big.NewInt(100)}, nil)
 	headers = makeHeaders(10, &headers[len(headers)-1])
-	client.On("BlockHeadersByRange", mock.MatchedBy(bigint.Matcher(5)), mock.MatchedBy(bigint.Matcher(14))).Return(headers, nil)
+	rpcElems = makeHeaderRpcElems(headers[0].Number, headers[9].Number)
+	for i := 0; i < len(rpcElems); i++ {
+		rpcElems[i].Result = &headers[i]
+	}
+
+	rpc.ExpectBatchCallContext(rpcElems, nil)
 	headers, err = headerTraversal.NextHeaders(10)
 	require.NoError(t, err)
 	require.Len(t, headers, 10)
@@ -112,24 +136,43 @@ func TestHeaderTraversalNextHeadersMaxSize(t *testing.T) {
 }
 
 func TestHeaderTraversalMismatchedProviderStateError(t *testing.T) {
-	client := new(MockEthClient)
+	client := &testutils.MockClient{}
+	t.Cleanup(func() { client.AssertExpectations(t) })
+
+	rpc := &testutils.MockRPC{}
+	client.Mock.On("RPC").Return(rpc)
+	t.Cleanup(func() { rpc.AssertExpectations(t) })
 
 	// start from genesis
 	headerTraversal := NewHeaderTraversal(client, nil, bigint.Zero)
 
 	// blocks [0..4]
 	headers := makeHeaders(5, nil)
-	client.On("BlockHeaderByNumber", (*big.Int)(nil)).Return(&headers[4], nil).Times(1) // Times so that we can override next
-	client.On("BlockHeadersByRange", mock.MatchedBy(bigint.Matcher(0)), mock.MatchedBy(bigint.Matcher(4))).Return(headers, nil)
+	rpcElems := makeHeaderRpcElems(headers[0].Number, headers[4].Number)
+	for i := 0; i < len(rpcElems); i++ {
+		rpcElems[i].Result = &headers[i]
+	}
+
+	client.ExpectHeaderByNumber(nil, &headers[4], nil)
+	rpc.ExpectBatchCallContext(rpcElems, nil)
 	headers, err := headerTraversal.NextHeaders(5)
 	require.NoError(t, err)
 	require.Len(t, headers, 5)
 
-	// blocks [5..9]. Next batch is not chained correctly (starts again from genesis)
-	headers = makeHeaders(5, nil)
-	client.On("BlockHeaderByNumber", (*big.Int)(nil)).Return(&types.Header{Number: big.NewInt(9)}, nil)
-	client.On("BlockHeadersByRange", mock.MatchedBy(bigint.Matcher(5)), mock.MatchedBy(bigint.Matcher(9))).Return(headers, nil)
-	headers, err = headerTraversal.NextHeaders(5)
+	// Build on the wrong previous header, corrupting hashes
+	prevHeader := headers[len(headers)-2]
+	prevHeader.Number = headers[len(headers)-1].Number
+	headers = makeHeaders(5, &prevHeader)
+	rpcElems = makeHeaderRpcElems(headers[0].Number, headers[4].Number)
+	for i := 0; i < len(rpcElems); i++ {
+		rpcElems[i].Result = &headers[i]
+	}
+
+	// More headers are available (Latest == 9), but the mismatches will the last
+	// traversed header
+	client.ExpectHeaderByNumber(nil, &types.Header{Number: big.NewInt(9)}, nil)
+	rpc.ExpectBatchCallContext(rpcElems[:2], nil)
+	headers, err = headerTraversal.NextHeaders(2)
 	require.Nil(t, headers)
 	require.Equal(t, ErrHeaderTraversalAndProviderMismatchedState, err)
 }
diff --git a/indexer/node/metrics.go b/indexer/node/metrics.go
deleted file mode 100644
index 55da6a127e55..000000000000
--- a/indexer/node/metrics.go
+++ /dev/null
@@ -1,105 +0,0 @@
-package node
-
-import (
-	"errors"
-	"fmt"
-
-	"github.com/ethereum-optimism/optimism/op-service/metrics"
-	"github.com/ethereum/go-ethereum"
-	"github.com/ethereum/go-ethereum/rpc"
-
-	"github.com/prometheus/client_golang/prometheus"
-)
-
-var (
-	MetricsNamespace = "op_indexer_rpc"
-	batchMethod      = ""
-)
-
-type Metricer interface {
-	RecordRPCClientRequest(method string) func(err error)
-	RecordRPCClientBatchRequest(b []rpc.BatchElem) func(err error)
-}
-
-type clientMetrics struct {
-	rpcClientRequestsTotal          *prometheus.CounterVec
-	rpcClientRequestDurationSeconds *prometheus.HistogramVec
-	rpcClientResponsesTotal         *prometheus.CounterVec
-}
-
-func NewMetrics(registry *prometheus.Registry, subsystem string) Metricer {
-	factory := metrics.With(registry)
-	return &clientMetrics{
-		rpcClientRequestsTotal: factory.NewCounterVec(prometheus.CounterOpts{
-			Namespace: MetricsNamespace,
-			Subsystem: subsystem,
-			Name:      "requests_total",
-			Help:      "Total RPC requests initiated by the RPC client",
-		}, []string{
-			"method",
-		}),
-		rpcClientRequestDurationSeconds: factory.NewHistogramVec(prometheus.HistogramOpts{
-			Namespace: MetricsNamespace,
-			Subsystem: subsystem,
-			Name:      "request_duration_seconds",
-			Buckets:   []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10},
-			Help:      "Histogram of RPC client request durations",
-		}, []string{
-			"method",
-		}),
-		rpcClientResponsesTotal: factory.NewCounterVec(prometheus.CounterOpts{
-			Namespace: MetricsNamespace,
-			Subsystem: subsystem,
-			Name:      "responses_total",
-			Help:      "Total RPC request responses received by the RPC client",
-		}, []string{
-			"method",
-			"error",
-		}),
-	}
-}
-
-func (m *clientMetrics) RecordRPCClientRequest(method string) func(err error) {
-	m.rpcClientRequestsTotal.WithLabelValues(method).Inc()
-	timer := prometheus.NewTimer(m.rpcClientRequestDurationSeconds.WithLabelValues(method))
-	return func(err error) {
-		m.recordRPCClientResponse(method, err)
-		timer.ObserveDuration()
-	}
-}
-
-func (m *clientMetrics) RecordRPCClientBatchRequest(b []rpc.BatchElem) func(err error) {
-	m.rpcClientRequestsTotal.WithLabelValues(batchMethod).Add(float64(len(b)))
-	for _, elem := range b {
-		m.rpcClientRequestsTotal.WithLabelValues(elem.Method).Inc()
-	}
-
-	timer := prometheus.NewTimer(m.rpcClientRequestDurationSeconds.WithLabelValues(batchMethod))
-	return func(err error) {
-		m.recordRPCClientResponse(batchMethod, err)
-		timer.ObserveDuration()
-
-		// Record errors for individual requests
-		for _, elem := range b {
-			m.recordRPCClientResponse(elem.Method, elem.Error)
-		}
-	}
-}
-
-func (m *clientMetrics) recordRPCClientResponse(method string, err error) {
-	var errStr string
-	var rpcErr rpc.Error
-	var httpErr rpc.HTTPError
-	if err == nil {
-		errStr = ""
-	} else if errors.As(err, &rpcErr) {
-		errStr = fmt.Sprintf("rpc_%d", rpcErr.ErrorCode())
-	} else if errors.As(err, &httpErr) {
-		errStr = fmt.Sprintf("http_%d", httpErr.StatusCode)
-	} else if errors.Is(err, ethereum.NotFound) {
-		errStr = ""
-	} else {
-		errStr = ""
-	}
-	m.rpcClientResponsesTotal.WithLabelValues(method, errStr).Inc()
-}
diff --git a/indexer/node/mocks.go b/indexer/node/mocks.go
deleted file mode 100644
index e01c6fcb1bca..000000000000
--- a/indexer/node/mocks.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package node
-
-import (
-	"math/big"
-
-	"github.com/ethereum/go-ethereum"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/types"
-
-	"github.com/stretchr/testify/mock"
-)
-
-var _ EthClient = &MockEthClient{}
-
-type MockEthClient struct {
-	mock.Mock
-}
-
-func (m *MockEthClient) BlockHeaderByNumber(number *big.Int) (*types.Header, error) {
-	args := m.Called(number)
-	return args.Get(0).(*types.Header), args.Error(1)
-}
-
-func (m *MockEthClient) BlockHeaderByHash(hash common.Hash) (*types.Header, error) {
-	args := m.Called(hash)
-	return args.Get(0).(*types.Header), args.Error(1)
-}
-
-func (m *MockEthClient) BlockHeadersByRange(from, to *big.Int) ([]types.Header, error) {
-	args := m.Called(from, to)
-	return args.Get(0).([]types.Header), args.Error(1)
-}
-
-func (m *MockEthClient) TxByHash(hash common.Hash) (*types.Transaction, error) {
-	args := m.Called(hash)
-	return args.Get(0).(*types.Transaction), args.Error(1)
-}
-
-func (m *MockEthClient) StorageHash(address common.Address, blockNumber *big.Int) (common.Hash, error) {
-	args := m.Called(address, blockNumber)
-	return args.Get(0).(common.Hash), args.Error(1)
-}
-
-func (m *MockEthClient) FilterLogs(query ethereum.FilterQuery) (Logs, error) {
-	args := m.Called(query)
-	return args.Get(0).(Logs), args.Error(1)
-}
-
-func (m *MockEthClient) Close() {
-}
diff --git a/indexer/processors/bridge.go b/indexer/processors/bridge.go
index d576f6b6265f..891d1151ac13 100644
--- a/indexer/processors/bridge.go
+++ b/indexer/processors/bridge.go
@@ -92,9 +92,9 @@ func (b *BridgeProcessor) Start() error {
 	// start L1 worker
 	b.tasks.Go(func() error {
 		l1EtlUpdates := b.l1Etl.Notify()
-		for range l1EtlUpdates {
-			b.log.Info("notified of traversed L1 state", "l1_etl_block_number", b.l1Etl.LatestHeader.Number)
-			if err := b.onL1Data(b.l1Etl.LatestHeader); err != nil {
+		for latestHeader := range l1EtlUpdates {
+			b.log.Info("notified of traversed L1 state", "l1_etl_block_number", latestHeader.Number)
+			if err := b.onL1Data(latestHeader); err != nil {
 				b.log.Error("failed l1 bridge processing interval", "err", err)
 			}
 		}
@@ -104,9 +104,9 @@ func (b *BridgeProcessor) Start() error {
 	// start L2 worker
 	b.tasks.Go(func() error {
 		l2EtlUpdates := b.l2Etl.Notify()
-		for range l2EtlUpdates {
-			b.log.Info("notified of traversed L2 state", "l2_etl_block_number", b.l2Etl.LatestHeader.Number)
-			if err := b.onL2Data(b.l2Etl.LatestHeader); err != nil {
+		for latestHeader := range l2EtlUpdates {
+			b.log.Info("notified of traversed L2 state", "l2_etl_block_number", latestHeader.Number)
+			if err := b.onL2Data(latestHeader); err != nil {
 				b.log.Error("failed l2 bridge processing interval", "err", err)
 			}
 		}
@@ -226,7 +226,7 @@ func (b *BridgeProcessor) processInitiatedL1Events(latestL1Header *types.Header)
 	fromL1Height, toL1Height := new(big.Int).Add(lastL1BlockNumber, bigint.One), toL1Header.Number
 	if err := b.db.Transaction(func(tx *database.DB) error {
 		l1BedrockStartingHeight := big.NewInt(int64(b.chainConfig.L1BedrockStartingHeight))
-		if l1BedrockStartingHeight.Cmp(fromL1Height) > 0 { // OP Mainnet & OP Goerli Only.
+		if l1BedrockStartingHeight.Cmp(fromL1Height) > 0 { // OP Mainnet
 			legacyFromL1Height, legacyToL1Height := fromL1Height, toL1Height
 			if l1BedrockStartingHeight.Cmp(toL1Height) <= 0 {
 				legacyToL1Height = new(big.Int).Sub(l1BedrockStartingHeight, bigint.One)
@@ -279,7 +279,7 @@ func (b *BridgeProcessor) processInitiatedL2Events(latestL2Header *types.Header)
 	fromL2Height, toL2Height := new(big.Int).Add(lastL2BlockNumber, bigint.One), toL2Header.Number
 	if err := b.db.Transaction(func(tx *database.DB) error {
 		l2BedrockStartingHeight := big.NewInt(int64(b.chainConfig.L2BedrockStartingHeight))
-		if l2BedrockStartingHeight.Cmp(fromL2Height) > 0 { // OP Mainnet & OP Goerli Only
+		if l2BedrockStartingHeight.Cmp(fromL2Height) > 0 { // OP Mainnet
 			legacyFromL2Height, legacyToL2Height := fromL2Height, toL2Height
 			if l2BedrockStartingHeight.Cmp(toL2Height) <= 0 {
 				legacyToL2Height = new(big.Int).Sub(l2BedrockStartingHeight, bigint.One)
diff --git a/indexer/processors/bridge/legacy_bridge_processor.go b/indexer/processors/bridge/legacy_bridge_processor.go
index b9af31cf1172..be3612657a99 100644
--- a/indexer/processors/bridge/legacy_bridge_processor.go
+++ b/indexer/processors/bridge/legacy_bridge_processor.go
@@ -13,8 +13,8 @@ import (
 	"github.com/ethereum-optimism/optimism/indexer/processors/bridge/ovm1"
 	"github.com/ethereum-optimism/optimism/indexer/processors/contracts"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 )
 
 // Legacy Bridge Initiation
diff --git a/indexer/processors/bridge/legacy_bridge_processor_test.go b/indexer/processors/bridge/legacy_bridge_processor_test.go
index b85eeb477812..fd02df309acf 100644
--- a/indexer/processors/bridge/legacy_bridge_processor_test.go
+++ b/indexer/processors/bridge/legacy_bridge_processor_test.go
@@ -6,53 +6,18 @@ import (
 
 	"github.com/ethereum-optimism/optimism/indexer/bigint"
 	"github.com/ethereum-optimism/optimism/indexer/database"
-	"github.com/ethereum-optimism/optimism/indexer/processors/contracts"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 
 	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/types"
 
 	"github.com/stretchr/testify/require"
 )
 
 func TestLegacyWithdrawalAndMessageHash(t *testing.T) {
-	// Pre-Bedrock OP-Goerli withdrawal that was proven post-bedrock
-	// - L1 proven withdrawal tx: 0xa8853a3532f40052385602c66512e438bc1e3736d3cb7abde359f5b9377441c7
-	value := bigint.Zero
-	expectedWithdrawalHash := common.HexToHash("0xae99d25df3e38730f6ee6588733417e20a131923b84870be6aedb4f863b6302d")
-
-	// Ensure the L2 Tx which correlates with the above proven withdrawal results in the same computed withdrawal hash
-	//  - L2 withdrawal tx: 0x254d9c28add020404142f840ed794cea51f86c0f0a737e3e7bdd7e1e4550962e
-	abi, err := bindings.CrossDomainMessengerMetaData.GetAbi()
-	require.NoError(t, err)
-
-	var sentMessage bindings.CrossDomainMessengerSentMessage
-	sentMessageEvent := abi.Events["SentMessage"]
-	logData := common.FromHex("0x0000000000000000000000004200000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4a9f9e67500000000000000000000000007865c6e87b9f70255377e024ace6630c1eaa37f0000000000000000000000003b8e53b3ab8e01fb57d0c9e893bc4d655aa67d84000000000000000000000000b91882244f7f82540f2941a759724523c7b9a166000000000000000000000000b91882244f7f82540f2941a759724523c7b9a166000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
-	require.NoError(t, contracts.UnpackLog(&sentMessage, &types.Log{Data: logData, Topics: []common.Hash{sentMessageEvent.ID, common.HexToHash("0x000000000000000000000000636af16bf2f682dd3109e60102b8e1a089fedaa8")}}, sentMessageEvent.Name, abi))
-
-	// timestamp and message hash are filled in fields. not core to the event
-	msg := database.BridgeMessage{
-		Nonce:    sentMessage.MessageNonce,
-		GasLimit: sentMessage.GasLimit,
-		Tx:       database.Transaction{FromAddress: sentMessage.Sender, ToAddress: sentMessage.Target, Amount: value, Data: sentMessage.Message},
-	}
-
-	hash, err := LegacyBridgeMessageWithdrawalHash(420, &msg)
-	require.NoError(t, err)
-	require.Equal(t, expectedWithdrawalHash, hash)
-
-	// Ensure the relayed message hash (v1) matches
-	expectedMessageHash := common.HexToHash("0xcb16ecc1967f5d7aed909349a4351d28fbb396429ef7faf1c9d2a670e3ca906f")
-	v1MessageHash, err := LegacyBridgeMessageV1MessageHash(&msg)
-	require.NoError(t, err)
-	require.Equal(t, expectedMessageHash, v1MessageHash)
-
 	// OP Mainnet hashes to also check for
 	// - since the message hash doesn't depend on the preset, we only need to check for the withdrawal hash
 
-	expectedWithdrawalHash = common.HexToHash("0x9c0bc28a77328a405f21d51a32d32f038ebf7ce70e377ca48b2cd194ec024f15")
-	msg = database.BridgeMessage{
+	expectedWithdrawalHash := common.HexToHash("0x9c0bc28a77328a405f21d51a32d32f038ebf7ce70e377ca48b2cd194ec024f15")
+	msg := database.BridgeMessage{
 		Nonce:    big.NewInt(100180),
 		GasLimit: bigint.Zero,
 		Tx: database.Transaction{
@@ -63,7 +28,7 @@ func TestLegacyWithdrawalAndMessageHash(t *testing.T) {
 		},
 	}
 
-	hash, err = LegacyBridgeMessageWithdrawalHash(10, &msg)
+	hash, err := LegacyBridgeMessageWithdrawalHash(10, &msg)
 	require.NoError(t, err)
 	require.Equal(t, expectedWithdrawalHash, hash)
 
diff --git a/indexer/processors/contracts/cross_domain_messenger.go b/indexer/processors/contracts/cross_domain_messenger.go
index 52cf944d33a1..628822f54d55 100644
--- a/indexer/processors/contracts/cross_domain_messenger.go
+++ b/indexer/processors/contracts/cross_domain_messenger.go
@@ -7,8 +7,8 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 
 	"github.com/ethereum-optimism/optimism/indexer/bigint"
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
 	"github.com/ethereum-optimism/optimism/indexer/database"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
 )
 
diff --git a/indexer/processors/contracts/l2_to_l1_message_passer.go b/indexer/processors/contracts/l2_to_l1_message_passer.go
index 92e62767db08..a33e7860bd1a 100644
--- a/indexer/processors/contracts/l2_to_l1_message_passer.go
+++ b/indexer/processors/contracts/l2_to_l1_message_passer.go
@@ -3,8 +3,8 @@ package contracts
 import (
 	"math/big"
 
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
 	"github.com/ethereum-optimism/optimism/indexer/database"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	"github.com/ethereum/go-ethereum/common"
 )
 
diff --git a/indexer/processors/contracts/legacy_ctc.go b/indexer/processors/contracts/legacy_ctc.go
index da237f6ae2e9..130947f1a252 100644
--- a/indexer/processors/contracts/legacy_ctc.go
+++ b/indexer/processors/contracts/legacy_ctc.go
@@ -4,8 +4,8 @@ import (
 	"math/big"
 
 	"github.com/ethereum-optimism/optimism/indexer/bigint"
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
 	"github.com/ethereum-optimism/optimism/indexer/database"
-	legacy_bindings "github.com/ethereum-optimism/optimism/op-bindings/legacy-bindings"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/types"
@@ -19,7 +19,7 @@ type LegacyCTCDepositEvent struct {
 }
 
 func LegacyCTCDepositEvents(contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]LegacyCTCDepositEvent, error) {
-	ctcAbi, err := legacy_bindings.CanonicalTransactionChainMetaData.GetAbi()
+	ctcAbi, err := bindings.CanonicalTransactionChainMetaData.GetAbi()
 	if err != nil {
 		return nil, err
 	}
@@ -33,7 +33,7 @@ func LegacyCTCDepositEvents(contractAddress common.Address, db *database.DB, fro
 
 	ctcTxDeposits := make([]LegacyCTCDepositEvent, len(events))
 	for i := range events {
-		txEnqueued := legacy_bindings.CanonicalTransactionChainTransactionEnqueued{Raw: *events[i].RLPLog}
+		txEnqueued := bindings.CanonicalTransactionChainTransactionEnqueued{Raw: *events[i].RLPLog}
 		err = UnpackLog(&txEnqueued, events[i].RLPLog, transactionEnqueuedEventAbi.Name, ctcAbi)
 		if err != nil {
 			return nil, err
diff --git a/indexer/processors/contracts/legacy_standard_bridge.go b/indexer/processors/contracts/legacy_standard_bridge.go
index f9202e17217c..723aa17d748b 100644
--- a/indexer/processors/contracts/legacy_standard_bridge.go
+++ b/indexer/processors/contracts/legacy_standard_bridge.go
@@ -3,8 +3,8 @@ package contracts
 import (
 	"math/big"
 
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
 	"github.com/ethereum-optimism/optimism/indexer/database"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 
 	"github.com/ethereum/go-ethereum/common"
 )
diff --git a/indexer/processors/contracts/optimism_portal.go b/indexer/processors/contracts/optimism_portal.go
index 141001bdc004..025b2d59bc7e 100644
--- a/indexer/processors/contracts/optimism_portal.go
+++ b/indexer/processors/contracts/optimism_portal.go
@@ -5,8 +5,8 @@ import (
 	"math/big"
 
 	"github.com/ethereum-optimism/optimism/indexer/bigint"
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
 	"github.com/ethereum-optimism/optimism/indexer/database"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 
 	"github.com/ethereum/go-ethereum/common"
diff --git a/indexer/processors/contracts/standard_bridge.go b/indexer/processors/contracts/standard_bridge.go
index 5dd049fb6dc9..34f0eff7088f 100644
--- a/indexer/processors/contracts/standard_bridge.go
+++ b/indexer/processors/contracts/standard_bridge.go
@@ -3,9 +3,9 @@ package contracts
 import (
 	"math/big"
 
+	"github.com/ethereum-optimism/optimism/indexer/bindings"
 	"github.com/ethereum-optimism/optimism/indexer/database"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 
 	"github.com/ethereum/go-ethereum/common"
 )
diff --git a/op-batcher/Dockerfile b/op-batcher/Dockerfile
deleted file mode 100644
index 6732ecc65678..000000000000
--- a/op-batcher/Dockerfile
+++ /dev/null
@@ -1,9 +0,0 @@
-ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest
-FROM $OP_STACK_GO_BUILDER as builder
-# See "make golang-docker" and /ops/docker/op-stack-go
-
-FROM alpine:3.18
-
-COPY --from=builder /usr/local/bin/op-batcher /usr/local/bin/op-batcher
-
-CMD ["op-batcher"]
diff --git a/op-batcher/Dockerfile.dockerignore b/op-batcher/Dockerfile.dockerignore
deleted file mode 100644
index 4f26140750a0..000000000000
--- a/op-batcher/Dockerfile.dockerignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# ignore everything but the dockerfile, the op-stack-go base image performs the build
-*
diff --git a/op-batcher/Makefile b/op-batcher/Makefile
index 899eb16588d1..24d719c3b106 100644
--- a/op-batcher/Makefile
+++ b/op-batcher/Makefile
@@ -1,12 +1,29 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+# Find the github tag that points to this commit. If none are found, set the version string to "untagged"
+# Prioritizes release tag, if one exists, over tags suffixed with "-rc"
+VERSION ?= $(shell tags=$$(git tag --points-at $(GITCOMMIT) | grep '^op-batcher/' | sed 's/op-batcher\///' | sort -V); \
+             preferred_tag=$$(echo "$$tags" | grep -v -- '-rc' | tail -n 1); \
+             if [ -z "$$preferred_tag" ]; then \
+                 if [ -z "$$tags" ]; then \
+                     echo "untagged"; \
+                 else \
+                     echo "$$tags" | tail -n 1; \
+                 fi \
+             else \
+                 echo $$preferred_tag; \
+             fi)
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
 LDFLAGSSTRING +=-X main.Version=$(VERSION)
 LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
 
+# Use the old Apple linker to workaround broken xcode - https://github.com/golang/go/issues/65169
+ifeq ($(shell uname),Darwin)
+	FUZZLDFLAGS := -ldflags=-extldflags=-Wl,-ld_classic
+endif
+
 op-batcher:
 	env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-batcher ./cmd
 
@@ -17,14 +34,14 @@ test:
 	go test -v ./...
 
 fuzz:
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzChannelConfig_CheckTimeout ./batcher
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDurationZero ./batcher
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDurationTimeoutMaxChannelDuration ./batcher
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDurationTimeoutZeroMaxChannelDuration ./batcher
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzChannelCloseTimeout ./batcher
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzChannelZeroCloseTimeout ./batcher
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzSeqWindowClose ./batcher
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzSeqWindowZeroTimeoutClose ./batcher
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzChannelConfig_CheckTimeout ./batcher
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDurationZero ./batcher
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDurationTimeoutMaxChannelDuration ./batcher
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDurationTimeoutZeroMaxChannelDuration ./batcher
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzChannelCloseTimeout ./batcher
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzChannelZeroCloseTimeout ./batcher
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzSeqWindowClose ./batcher
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzSeqWindowZeroTimeoutClose ./batcher
 
 .PHONY: \
 	op-batcher \
diff --git a/op-batcher/batcher/channel_builder.go b/op-batcher/batcher/channel_builder.go
index 24b00ca9108c..d63e1d45b5dc 100644
--- a/op-batcher/batcher/channel_builder.go
+++ b/op-batcher/batcher/channel_builder.go
@@ -7,7 +7,6 @@ import (
 	"io"
 	"math"
 
-	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
@@ -35,81 +34,6 @@ func (e *ChannelFullError) Unwrap() error {
 	return e.Err
 }
 
-type ChannelConfig struct {
-	// Number of epochs (L1 blocks) per sequencing window, including the epoch
-	// L1 origin block itself
-	SeqWindowSize uint64
-	// The maximum number of L1 blocks that the inclusion transactions of a
-	// channel's frames can span.
-	ChannelTimeout uint64
-
-	// Builder Config
-
-	// MaxChannelDuration is the maximum duration (in #L1-blocks) to keep the
-	// channel open. This allows control over how long a channel is kept open
-	// during times of low transaction volume.
-	//
-	// If 0, duration checks are disabled.
-	MaxChannelDuration uint64
-	// The batcher tx submission safety margin (in #L1-blocks) to subtract from
-	// a channel's timeout and sequencing window, to guarantee safe inclusion of
-	// a channel on L1.
-	SubSafetyMargin uint64
-	// The maximum byte-size a frame can have.
-	MaxFrameSize uint64
-
-	// CompressorConfig contains the configuration for creating new compressors.
-	CompressorConfig compressor.Config
-
-	// BatchType indicates whether the channel uses SingularBatch or SpanBatch.
-	BatchType uint
-
-	// Whether to put all frames of a channel inside a single tx.
-	// Should only be used for blob transactions.
-	MultiFrameTxs bool
-}
-
-func (cc *ChannelConfig) MaxFramesPerTx() int {
-	if !cc.MultiFrameTxs {
-		return 1
-	}
-	return cc.CompressorConfig.TargetNumFrames
-}
-
-// Check validates the [ChannelConfig] parameters.
-func (cc *ChannelConfig) Check() error {
-	// The [ChannelTimeout] must be larger than the [SubSafetyMargin].
-	// Otherwise, new blocks would always be considered timed out.
-	if cc.ChannelTimeout < cc.SubSafetyMargin {
-		return ErrInvalidChannelTimeout
-	}
-
-	// If the [MaxFrameSize] is set to 0, the channel builder
-	// will infinitely loop when trying to create frames in the
-	// [ChannelBuilder.OutputFrames] function.
-	if cc.MaxFrameSize == 0 {
-		return errors.New("max frame size cannot be zero")
-	}
-
-	// If the [MaxFrameSize] is less than [FrameV0OverHeadSize], the channel
-	// out will underflow the maxSize variable in the [derive.ChannelOut].
-	// Since it is of type uint64, it will wrap around to a very large
-	// number, making the frame size extremely large.
-	if cc.MaxFrameSize < derive.FrameV0OverHeadSize {
-		return fmt.Errorf("max frame size %d is less than the minimum 23", cc.MaxFrameSize)
-	}
-
-	if cc.BatchType > derive.SpanBatchType {
-		return fmt.Errorf("unrecognized batch type: %d", cc.BatchType)
-	}
-
-	if nf := cc.CompressorConfig.TargetNumFrames; nf < 1 {
-		return fmt.Errorf("invalid number of frames %d", nf)
-	}
-
-	return nil
-}
-
 type frameID struct {
 	chID        derive.ChannelID
 	frameNumber uint16
@@ -154,18 +78,20 @@ type ChannelBuilder struct {
 
 // newChannelBuilder creates a new channel builder or returns an error if the
 // channel out could not be created.
+// it acts as a factory for either a span or singular channel out
 func NewChannelBuilder(cfg ChannelConfig, rollupCfg rollup.Config, latestL1OriginBlockNum uint64) (*ChannelBuilder, error) {
 	c, err := cfg.CompressorConfig.NewCompressor()
 	if err != nil {
 		return nil, err
 	}
-	var spanBatchBuilder *derive.SpanBatchBuilder
+	var co derive.ChannelOut
 	if cfg.BatchType == derive.SpanBatchType {
-		spanBatchBuilder = derive.NewSpanBatchBuilder(rollupCfg.Genesis.L2Time, rollupCfg.L2ChainID)
+		co, err = derive.NewSpanChannelOut(rollupCfg.Genesis.L2Time, rollupCfg.L2ChainID, cfg.CompressorConfig.TargetOutputSize, cfg.CompressorConfig.CompressionAlgo)
+	} else {
+		co, err = derive.NewSingularChannelOut(c)
 	}
-	co, err := derive.NewChannelOut(cfg.BatchType, c, spanBatchBuilder)
 	if err != nil {
-		return nil, err
+		return nil, fmt.Errorf("creating channel out: %w", err)
 	}
 
 	cb := &ChannelBuilder{
@@ -230,7 +156,7 @@ func (c *ChannelBuilder) AddBlock(block *types.Block) (*derive.L1BlockInfo, erro
 		return l1info, fmt.Errorf("converting block to batch: %w", err)
 	}
 
-	if _, err = c.co.AddSingularBatch(batch, l1info.SequenceNumber); errors.Is(err, derive.ErrTooManyRLPBytes) || errors.Is(err, derive.CompressorFullErr) {
+	if err = c.co.AddSingularBatch(batch, l1info.SequenceNumber); errors.Is(err, derive.ErrTooManyRLPBytes) || errors.Is(err, derive.ErrCompressorFull) {
 		c.setFullErr(err)
 		return l1info, c.FullErr()
 	} else if err != nil {
@@ -329,7 +255,7 @@ func (c *ChannelBuilder) IsFull() bool {
 //
 // It returns a ChannelFullError wrapping one of the following possible reasons
 // for the channel being full:
-//   - derive.CompressorFullErr if the compressor target has been reached,
+//   - derive.ErrCompressorFull if the compressor target has been reached,
 //   - derive.MaxRLPBytesPerChannel if the general maximum amount of input data
 //     would have been exceeded by the latest AddBlock call,
 //   - ErrMaxFrameIndex if the maximum number of frames has been generated
@@ -371,9 +297,9 @@ func (c *ChannelBuilder) OutputFrames() error {
 // This is part of an optimization to already generate frames and send them off
 // as txs while still collecting blocks in the channel builder.
 func (c *ChannelBuilder) outputReadyFrames() error {
-	// TODO: Decide whether we want to fill frames to max size and use target
-	// only for estimation, or use target size.
-	for c.co.ReadyBytes() >= int(c.cfg.MaxFrameSize) {
+	// When creating a frame from the ready compression data, the frame overhead
+	// will be added to the total output size, so we can add it in the condition.
+	for c.co.ReadyBytes()+derive.FrameV0OverHeadSize >= int(c.cfg.MaxFrameSize) {
 		if err := c.outputFrame(); err == io.EOF {
 			return nil
 		} else if err != nil {
diff --git a/op-batcher/batcher/channel_builder_test.go b/op-batcher/batcher/channel_builder_test.go
index 8da405444b99..8d1cbd8219ee 100644
--- a/op-batcher/batcher/channel_builder_test.go
+++ b/op-batcher/batcher/channel_builder_test.go
@@ -3,13 +3,12 @@ package batcher
 import (
 	"bytes"
 	"errors"
-	"fmt"
 	"math"
 	"math/big"
 	"math/rand"
 	"testing"
+	"time"
 
-	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	dtest "github.com/ethereum-optimism/optimism/op-node/rollup/derive/test"
@@ -23,100 +22,11 @@ import (
 
 const latestL1BlockOrigin = 10
 
-var defaultTestChannelConfig = ChannelConfig{
-	SeqWindowSize:      15,
-	ChannelTimeout:     40,
-	MaxChannelDuration: 1,
-	SubSafetyMargin:    4,
-	MaxFrameSize:       120000,
-	CompressorConfig: compressor.Config{
-		TargetFrameSize:  100000,
-		TargetNumFrames:  1,
-		ApproxComprRatio: 0.4,
-	},
-	BatchType: derive.SingularBatchType,
-}
-
 var defaultTestRollupConfig = rollup.Config{
 	Genesis:   rollup.Genesis{L2: eth.BlockID{Number: 0}},
 	L2ChainID: big.NewInt(1234),
 }
 
-// TestChannelConfig_Check tests the [ChannelConfig] [Check] function.
-func TestChannelConfig_Check(t *testing.T) {
-	type test struct {
-		input     ChannelConfig
-		assertion func(error)
-	}
-
-	// Construct test cases that test the boundary conditions
-	zeroChannelConfig := defaultTestChannelConfig
-	zeroChannelConfig.MaxFrameSize = 0
-	timeoutChannelConfig := defaultTestChannelConfig
-	timeoutChannelConfig.ChannelTimeout = 0
-	timeoutChannelConfig.SubSafetyMargin = 1
-	tests := []test{
-		{
-			input: defaultTestChannelConfig,
-			assertion: func(output error) {
-				require.NoError(t, output)
-			},
-		},
-		{
-			input: timeoutChannelConfig,
-			assertion: func(output error) {
-				require.ErrorIs(t, output, ErrInvalidChannelTimeout)
-			},
-		},
-		{
-			input: zeroChannelConfig,
-			assertion: func(output error) {
-				require.EqualError(t, output, "max frame size cannot be zero")
-			},
-		},
-	}
-	for i := 1; i < derive.FrameV0OverHeadSize; i++ {
-		smallChannelConfig := defaultTestChannelConfig
-		smallChannelConfig.MaxFrameSize = uint64(i)
-		expectedErr := fmt.Sprintf("max frame size %d is less than the minimum 23", i)
-		tests = append(tests, test{
-			input: smallChannelConfig,
-			assertion: func(output error) {
-				require.EqualError(t, output, expectedErr)
-			},
-		})
-	}
-
-	// Run the table tests
-	for _, test := range tests {
-		test.assertion(test.input.Check())
-	}
-}
-
-// FuzzChannelConfig_CheckTimeout tests the [ChannelConfig] [Check] function
-// with fuzzing to make sure that a [ErrInvalidChannelTimeout] is thrown when
-// the [ChannelTimeout] is less than the [SubSafetyMargin].
-func FuzzChannelConfig_CheckTimeout(f *testing.F) {
-	for i := range [10]int{} {
-		f.Add(uint64(i+1), uint64(i))
-	}
-	f.Fuzz(func(t *testing.T, channelTimeout uint64, subSafetyMargin uint64) {
-		// We only test where [ChannelTimeout] is less than the [SubSafetyMargin]
-		// So we cannot have [ChannelTimeout] be [math.MaxUint64]
-		if channelTimeout == math.MaxUint64 {
-			channelTimeout = math.MaxUint64 - 1
-		}
-		if subSafetyMargin <= channelTimeout {
-			subSafetyMargin = channelTimeout + 1
-		}
-
-		channelConfig := defaultTestChannelConfig
-		channelConfig.ChannelTimeout = channelTimeout
-		channelConfig.SubSafetyMargin = subSafetyMargin
-		require.ErrorIs(t, channelConfig.Check(), ErrInvalidChannelTimeout)
-	})
-}
-
 // addMiniBlock adds a minimal valid L2 block to the channel builder using the
 // ChannelBuilder.AddBlock method.
 func addMiniBlock(cb *ChannelBuilder) error {
@@ -174,8 +84,9 @@ func newMiniL2BlockWithNumberParentAndL1Information(numTx int, l2Number *big.Int
 // which is presumably ErrTooManyRLPBytes.
 func addTooManyBlocks(cb *ChannelBuilder) error {
 	rng := rand.New(rand.NewSource(1234))
+	t := time.Now()
 	for i := 0; i < 10_000; i++ {
-		block := dtest.RandomL2BlockWithChainId(rng, 1000, defaultTestRollupConfig.L2ChainID)
+		block := dtest.RandomL2BlockWithChainIdAndTime(rng, 1000, defaultTestRollupConfig.L2ChainID, t.Add(time.Duration(i)*time.Second))
 		_, err := cb.AddBlock(block)
 		if err != nil {
 			return err
@@ -192,7 +103,7 @@ func FuzzDurationTimeoutZeroMaxChannelDuration(f *testing.F) {
 		f.Add(uint64(i))
 	}
 	f.Fuzz(func(t *testing.T, l1BlockNum uint64) {
-		channelConfig := defaultTestChannelConfig
+		channelConfig := defaultTestChannelConfig()
 		channelConfig.MaxChannelDuration = 0
 		cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
 		require.NoError(t, err)
@@ -215,7 +126,7 @@ func FuzzChannelBuilder_DurationZero(f *testing.F) {
 		}
 
 		// Create the channel builder
-		channelConfig := defaultTestChannelConfig
+		channelConfig := defaultTestChannelConfig()
 		channelConfig.MaxChannelDuration = maxChannelDuration
 		cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
 		require.NoError(t, err)
@@ -242,7 +153,7 @@ func FuzzDurationTimeoutMaxChannelDuration(f *testing.F) {
 		}
 
 		// Create the channel builder
-		channelConfig := defaultTestChannelConfig
+		channelConfig := defaultTestChannelConfig()
 		channelConfig.MaxChannelDuration = maxChannelDuration
 		cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
 		require.NoError(t, err)
@@ -275,7 +186,7 @@ func FuzzChannelCloseTimeout(f *testing.F) {
 	}
 	f.Fuzz(func(t *testing.T, l1BlockNum uint64, channelTimeout uint64, subSafetyMargin uint64, timeout uint64) {
 		// Create the channel builder
-		channelConfig := defaultTestChannelConfig
+		channelConfig := defaultTestChannelConfig()
 		channelConfig.ChannelTimeout = channelTimeout
 		channelConfig.SubSafetyMargin = subSafetyMargin
 		cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
@@ -303,7 +214,7 @@ func FuzzChannelZeroCloseTimeout(f *testing.F) {
 	}
 	f.Fuzz(func(t *testing.T, l1BlockNum uint64, channelTimeout uint64, subSafetyMargin uint64) {
 		// Create the channel builder
-		channelConfig := defaultTestChannelConfig
+		channelConfig := defaultTestChannelConfig()
 		channelConfig.ChannelTimeout = channelTimeout
 		channelConfig.SubSafetyMargin = subSafetyMargin
 		cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
@@ -330,7 +241,7 @@ func FuzzSeqWindowClose(f *testing.F) {
 	}
 	f.Fuzz(func(t *testing.T, epochNum uint64, seqWindowSize uint64, subSafetyMargin uint64, timeout uint64) {
 		// Create the channel builder
-		channelConfig := defaultTestChannelConfig
+		channelConfig := defaultTestChannelConfig()
 		channelConfig.SeqWindowSize = seqWindowSize
 		channelConfig.SubSafetyMargin = subSafetyMargin
 		cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
@@ -358,7 +269,7 @@ func FuzzSeqWindowZeroTimeoutClose(f *testing.F) {
 	}
 	f.Fuzz(func(t *testing.T, epochNum uint64, seqWindowSize uint64, subSafetyMargin uint64) {
 		// Create the channel builder
-		channelConfig := defaultTestChannelConfig
+		channelConfig := defaultTestChannelConfig()
 		channelConfig.SeqWindowSize = seqWindowSize
 		channelConfig.SubSafetyMargin = subSafetyMargin
 		cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
@@ -404,7 +315,7 @@ func TestChannelBuilderBatchType(t *testing.T) {
 
 // TestChannelBuilder_NextFrame tests calling NextFrame on a ChannelBuilder with only one frame
 func TestChannelBuilder_NextFrame(t *testing.T) {
-	channelConfig := defaultTestChannelConfig
+	channelConfig := defaultTestChannelConfig()
 
 	// Create a new channel builder
 	cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
@@ -443,8 +354,9 @@ func TestChannelBuilder_NextFrame(t *testing.T) {
 }
 
 // TestChannelBuilder_OutputWrongFramePanic tests that a panic is thrown when a frame is pushed with an invalid frame id
-func TestChannelBuilder_OutputWrongFramePanic(t *testing.T) {
-	channelConfig := defaultTestChannelConfig
+func ChannelBuilder_OutputWrongFramePanic(t *testing.T, batchType uint) {
+	channelConfig := defaultTestChannelConfig()
+	channelConfig.BatchType = batchType
 
 	// Construct a channel builder
 	cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
@@ -452,9 +364,10 @@ func TestChannelBuilder_OutputWrongFramePanic(t *testing.T) {
 
 	// Mock the internals of `ChannelBuilder.outputFrame`
 	// to construct a single frame
+	// the type of batch does not matter here because we are using it to construct a broken frame
 	c, err := channelConfig.CompressorConfig.NewCompressor()
 	require.NoError(t, err)
-	co, err := derive.NewChannelOut(derive.SingularBatchType, c, nil)
+	co, err := derive.NewSingularChannelOut(c)
 	require.NoError(t, err)
 	var buf bytes.Buffer
 	fn, err := co.OutputFrame(&buf, channelConfig.MaxFrameSize)
@@ -474,10 +387,12 @@ func TestChannelBuilder_OutputWrongFramePanic(t *testing.T) {
 	})
 }
 
-// TestChannelBuilder_OutputFramesWorks tests the [ChannelBuilder] OutputFrames is successful.
-func TestChannelBuilder_OutputFramesWorks(t *testing.T) {
-	channelConfig := defaultTestChannelConfig
-	channelConfig.MaxFrameSize = 24
+// TestChannelBuilder_OutputFrames tests [ChannelBuilder.OutputFrames] for singular batches.
+func TestChannelBuilder_OutputFrames(t *testing.T) {
+	channelConfig := defaultTestChannelConfig()
+	channelConfig.MaxFrameSize = derive.FrameV0OverHeadSize + 1
+	channelConfig.TargetNumFrames = 1000
+	channelConfig.InitNoneCompressor()
 
 	// Construct the channel builder
 	cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
@@ -494,12 +409,11 @@ func TestChannelBuilder_OutputFramesWorks(t *testing.T) {
 
 	// Let's add a block
 	require.NoError(t, addMiniBlock(cb))
-	require.NoError(t, cb.co.Flush())
 
 	// Check how many ready bytes
-	// There should be more than the max frame size ready
-	require.Greater(t, uint64(cb.co.ReadyBytes()), channelConfig.MaxFrameSize)
-	require.Equal(t, 0, cb.PendingFrames())
+	require.Greater(t, uint64(cb.co.ReadyBytes()+derive.FrameV0OverHeadSize), channelConfig.MaxFrameSize)
+
+	require.Equal(t, 0, cb.PendingFrames()) // always 0 because non compressor
 
 	// The channel should not be full
 	// but we want to output the frames for testing anyways
@@ -515,12 +429,28 @@ func TestChannelBuilder_OutputFramesWorks(t *testing.T) {
 	}
 }
 
-// TestChannelBuilder_OutputFramesWorks tests the [ChannelBuilder] OutputFrames is successful.
-func TestChannelBuilder_OutputFramesWorks_SpanBatch(t *testing.T) {
-	channelConfig := defaultTestChannelConfig
-	channelConfig.MaxFrameSize = 24
-	channelConfig.CompressorConfig.TargetFrameSize = 50
+func TestChannelBuilder_OutputFrames_SpanBatch(t *testing.T) {
+	for _, algo := range derive.CompressionAlgos {
+		t.Run("ChannelBuilder_OutputFrames_SpanBatch_"+algo.String(), func(t *testing.T) {
+			if algo.IsBrotli() {
+				ChannelBuilder_OutputFrames_SpanBatch(t, algo) // to fill faster for brotli
+			} else {
+				ChannelBuilder_OutputFrames_SpanBatch(t, algo)
+			}
+		})
+	}
+}
+
+func ChannelBuilder_OutputFrames_SpanBatch(t *testing.T, algo derive.CompressionAlgo) {
+	channelConfig := defaultTestChannelConfig()
+	channelConfig.MaxFrameSize = 20 + derive.FrameV0OverHeadSize
+	if algo.IsBrotli() {
+		channelConfig.TargetNumFrames = 3
+	} else {
+		channelConfig.TargetNumFrames = 5
+	}
 	channelConfig.BatchType = derive.SpanBatchType
+	channelConfig.InitRatioCompressor(1, algo)
 
 	// Construct the channel builder
 	cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
@@ -539,25 +469,30 @@ func TestChannelBuilder_OutputFramesWorks_SpanBatch(t *testing.T) {
 	for {
 		err = addMiniBlock(cb)
 		if err == nil {
+			if cb.IsFull() {
+				// this happens when the data exactly fills the channel
+				break
+			}
 			require.False(t, cb.IsFull())
 			// There should be no ready bytes until the channel is full
 			require.Equal(t, cb.co.ReadyBytes(), 0)
 		} else {
-			require.ErrorIs(t, err, derive.CompressorFullErr)
+			require.ErrorIs(t, err, derive.ErrCompressorFull)
 			break
 		}
 	}
 
 	require.True(t, cb.IsFull())
 	// Check how many ready bytes
-	// There should be more than the max frame size ready
-	require.Greater(t, uint64(cb.co.ReadyBytes()), channelConfig.MaxFrameSize)
+	require.GreaterOrEqual(t,
+		cb.co.ReadyBytes()+derive.FrameV0OverHeadSize,
+		int(channelConfig.MaxFrameSize))
 	require.Equal(t, 0, cb.PendingFrames())
 
 	// We should be able to output the frames
 	require.NoError(t, cb.OutputFrames())
 
-	// There should be many frames in the channel builder now
+	// There should be several frames in the channel builder now
 	require.Greater(t, cb.PendingFrames(), 1)
 	for i := 0; i < cb.numFrames-1; i++ {
 		require.Len(t, cb.frames[i].data, int(channelConfig.MaxFrameSize))
@@ -569,10 +504,9 @@ func TestChannelBuilder_OutputFramesWorks_SpanBatch(t *testing.T) {
 // function errors when the max RLP bytes per channel is reached.
 func ChannelBuilder_MaxRLPBytesPerChannel(t *testing.T, batchType uint) {
 	t.Parallel()
-	channelConfig := defaultTestChannelConfig
-	channelConfig.MaxFrameSize = derive.MaxRLPBytesPerChannel * 2
-	channelConfig.CompressorConfig.TargetFrameSize = derive.MaxRLPBytesPerChannel * 2
-	channelConfig.CompressorConfig.ApproxComprRatio = 1
+	channelConfig := defaultTestChannelConfig()
+	channelConfig.MaxFrameSize = rollup.SafeMaxRLPBytesPerChannel * 2
+	channelConfig.InitNoneCompressor()
 	channelConfig.BatchType = batchType
 
 	// Construct the channel builder
@@ -587,11 +521,10 @@ func ChannelBuilder_MaxRLPBytesPerChannel(t *testing.T, batchType uint) {
 // ChannelBuilder_OutputFramesMaxFrameIndex tests the [ChannelBuilder.OutputFrames]
 // function errors when the max frame index is reached.
 func ChannelBuilder_OutputFramesMaxFrameIndex(t *testing.T, batchType uint) {
-	channelConfig := defaultTestChannelConfig
-	channelConfig.MaxFrameSize = 24
-	channelConfig.CompressorConfig.TargetNumFrames = 6000
-	channelConfig.CompressorConfig.TargetFrameSize = 24
-	channelConfig.CompressorConfig.ApproxComprRatio = 1
+	channelConfig := defaultTestChannelConfig()
+	channelConfig.MaxFrameSize = derive.FrameV0OverHeadSize + 1
+	channelConfig.TargetNumFrames = math.MaxUint16 + 1
+	channelConfig.InitRatioCompressor(.1, derive.Zlib)
 	channelConfig.BatchType = batchType
 
 	rng := rand.New(rand.NewSource(123))
@@ -603,12 +536,13 @@ func ChannelBuilder_OutputFramesMaxFrameIndex(t *testing.T, batchType uint) {
 	require.NoError(t, err)
 	require.False(t, cb.IsFull())
 	require.Equal(t, 0, cb.PendingFrames())
-	for {
-		a := dtest.RandomL2BlockWithChainId(rng, 1, defaultTestRollupConfig.L2ChainID)
+	ti := time.Now()
+	for i := 0; ; i++ {
+		a := dtest.RandomL2BlockWithChainIdAndTime(rng, 1000, defaultTestRollupConfig.L2ChainID, ti.Add(time.Duration(i)*time.Second))
 		_, err = cb.AddBlock(a)
 		if cb.IsFull() {
 			fullErr := cb.FullErr()
-			require.ErrorIs(t, fullErr, derive.CompressorFullErr)
+			require.ErrorIs(t, fullErr, derive.ErrCompressorFull)
 			break
 		}
 		require.NoError(t, err)
@@ -618,18 +552,52 @@ func ChannelBuilder_OutputFramesMaxFrameIndex(t *testing.T, batchType uint) {
 	require.ErrorIs(t, cb.FullErr(), ErrMaxFrameIndex)
 }
 
-// ChannelBuilder_AddBlock tests the AddBlock function
+// TestChannelBuilder_FullShadowCompressor is a regression test testing that
+// the shadow compressor is correctly marked as full if adding another block
+// would produce a leftover frame.
+//
+// This test fails in multiple places if the subtraction of
+// [derive.FrameV0OverHeadSize] in [MaxDataSize] is omitted, which has been the
+// case before it got fixed it #9887.
+func TestChannelBuilder_FullShadowCompressor(t *testing.T) {
+	require := require.New(t)
+	cfg := ChannelConfig{
+		MaxFrameSize:    752,
+		TargetNumFrames: 1,
+		BatchType:       derive.SpanBatchType,
+	}
+
+	cfg.InitShadowCompressor(derive.Zlib)
+	cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, latestL1BlockOrigin)
+	require.NoError(err)
+
+	rng := rand.New(rand.NewSource(420))
+	a := dtest.RandomL2BlockWithChainId(rng, 1, defaultTestRollupConfig.L2ChainID)
+	_, err = cb.AddBlock(a)
+	require.NoError(err)
+	_, err = cb.AddBlock(a)
+	require.ErrorIs(err, derive.ErrCompressorFull)
+	// without fix, adding the second block would succeed and then adding a
+	// third block would fail with full error and the compressor would be full.
+
+	require.NoError(cb.OutputFrames())
+
+	require.True(cb.HasFrame())
+	f := cb.NextFrame()
+	require.Less(len(f.data), int(cfg.MaxFrameSize)) // would fail without fix, full frame
+
+	require.False(cb.HasFrame(), "no leftover frame expected") // would fail without fix
+}
+
 func ChannelBuilder_AddBlock(t *testing.T, batchType uint) {
-	channelConfig := defaultTestChannelConfig
+	channelConfig := defaultTestChannelConfig()
 	channelConfig.BatchType = batchType
 
 	// Lower the max frame size so that we can batch
-	channelConfig.MaxFrameSize = 20
-
+	channelConfig.MaxFrameSize = 20 + derive.FrameV0OverHeadSize
+	channelConfig.TargetNumFrames = 2
 	// Configure the Input Threshold params so we observe a full channel
-	channelConfig.CompressorConfig.TargetFrameSize = 20
-	channelConfig.CompressorConfig.TargetNumFrames = 2
-	channelConfig.CompressorConfig.ApproxComprRatio = 1
+	channelConfig.InitRatioCompressor(1, derive.Zlib)
 
 	// Construct the channel builder
 	cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
@@ -651,12 +619,11 @@ func ChannelBuilder_AddBlock(t *testing.T, batchType uint) {
 
 	// Since the channel output is full, the next call to AddBlock
 	// should return the channel out full error
-	require.ErrorIs(t, addMiniBlock(cb), derive.CompressorFullErr)
+	require.ErrorIs(t, addMiniBlock(cb), derive.ErrCompressorFull)
 }
 
-// TestBuilderRegisterL1Block tests the CheckTimeout function
-func TestBuilder_CheckTimeout(t *testing.T) {
-	channelConfig := defaultTestChannelConfig
+func TestChannelBuilder_CheckTimeout(t *testing.T) {
+	channelConfig := defaultTestChannelConfig()
 
 	// Construct the channel builder
 	cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
@@ -677,9 +644,8 @@ func TestBuilder_CheckTimeout(t *testing.T) {
 	require.ErrorIs(t, cb.FullErr(), ErrMaxDurationReached)
 }
 
-// TestBuilder_CheckTimeoutZeroMaxChannelDuration tests the CheckTimeout function
-func TestBuilder_CheckTimeoutZeroMaxChannelDuration(t *testing.T) {
-	channelConfig := defaultTestChannelConfig
+func TestChannelBuilder_CheckTimeoutZeroMaxChannelDuration(t *testing.T) {
+	channelConfig := defaultTestChannelConfig()
 
 	// Set the max channel duration to 0
 	channelConfig.MaxChannelDuration = 0
@@ -701,11 +667,8 @@ func TestBuilder_CheckTimeoutZeroMaxChannelDuration(t *testing.T) {
 	require.Equal(t, uint64(0), cb.timeout)
 }
 
-// TestFramePublished tests the FramePublished function
-func TestFramePublished(t *testing.T) {
-	channelConfig := defaultTestChannelConfig
-
-	cfg := channelConfig
+func TestChannelBuilder_FramePublished(t *testing.T) {
+	cfg := defaultTestChannelConfig()
 	cfg.MaxChannelDuration = 10_000
 	cfg.ChannelTimeout = 1000
 	cfg.SubSafetyMargin = 100
@@ -728,7 +691,7 @@ func TestFramePublished(t *testing.T) {
 }
 
 func TestChannelBuilder_LatestL1Origin(t *testing.T) {
-	cb, err := NewChannelBuilder(defaultTestChannelConfig, defaultTestRollupConfig, latestL1BlockOrigin)
+	cb, err := NewChannelBuilder(defaultTestChannelConfig(), defaultTestRollupConfig, latestL1BlockOrigin)
 	require.NoError(t, err)
 	require.Equal(t, eth.BlockID{}, cb.LatestL1Origin())
 
@@ -753,12 +716,11 @@ func ChannelBuilder_PendingFrames_TotalFrames(t *testing.T, batchType uint) {
 	const tnf = 9
 	rng := rand.New(rand.NewSource(94572314))
 	require := require.New(t)
-	cfg := defaultTestChannelConfig
-	cfg.CompressorConfig.TargetFrameSize = 1000
+	cfg := defaultTestChannelConfig()
 	cfg.MaxFrameSize = 1000
-	cfg.CompressorConfig.TargetNumFrames = tnf
-	cfg.CompressorConfig.Kind = "shadow"
+	cfg.TargetNumFrames = tnf
 	cfg.BatchType = batchType
+	cfg.InitShadowCompressor(derive.Zlib)
 	cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, latestL1BlockOrigin)
 	require.NoError(err)
 
@@ -766,9 +728,10 @@ func ChannelBuilder_PendingFrames_TotalFrames(t *testing.T, batchType uint) {
 	require.Zero(cb.PendingFrames())
 	require.Zero(cb.TotalFrames())
 
+	ti := time.Now()
 	// fill up
-	for {
-		block := dtest.RandomL2BlockWithChainId(rng, 4, defaultTestRollupConfig.L2ChainID)
+	for i := 0; ; i++ {
+		block := dtest.RandomL2BlockWithChainIdAndTime(rng, 4, defaultTestRollupConfig.L2ChainID, ti.Add(time.Duration(i)*time.Second))
 		_, err := cb.AddBlock(block)
 		if cb.IsFull() {
 			break
@@ -796,12 +759,12 @@ func ChannelBuilder_PendingFrames_TotalFrames(t *testing.T, batchType uint) {
 func ChannelBuilder_InputBytes(t *testing.T, batchType uint) {
 	require := require.New(t)
 	rng := rand.New(rand.NewSource(4982432))
-	cfg := defaultTestChannelConfig
+	cfg := defaultTestChannelConfig()
 	cfg.BatchType = batchType
-	var spanBatchBuilder *derive.SpanBatchBuilder
+	var spanBatch *derive.SpanBatch
 	if batchType == derive.SpanBatchType {
 		chainId := big.NewInt(1234)
-		spanBatchBuilder = derive.NewSpanBatchBuilder(uint64(0), chainId)
+		spanBatch = derive.NewSpanBatch(uint64(0), chainId)
 	}
 	cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, latestL1BlockOrigin)
 	require.NoError(err)
@@ -809,15 +772,17 @@ func ChannelBuilder_InputBytes(t *testing.T, batchType uint) {
 	require.Zero(cb.InputBytes())
 
 	var l int
+	ti := time.Now()
 	for i := 0; i < 5; i++ {
-		block := dtest.RandomL2BlockWithChainId(rng, rng.Intn(32), defaultTestRollupConfig.L2ChainID)
+		block := dtest.RandomL2BlockWithChainIdAndTime(rng, rng.Intn(32), defaultTestRollupConfig.L2ChainID, ti.Add(time.Duration(i)*time.Second))
 		if batchType == derive.SingularBatchType {
 			l += blockBatchRlpSize(t, block)
 		} else {
 			singularBatch, l1Info, err := derive.BlockToSingularBatch(&defaultTestRollupConfig, block)
 			require.NoError(err)
-			spanBatchBuilder.AppendSingularBatch(singularBatch, l1Info.SequenceNumber)
-			rawSpanBatch, err := spanBatchBuilder.GetRawSpanBatch()
+			err = spanBatch.AppendSingularBatch(singularBatch, l1Info.SequenceNumber)
+			require.NoError(err)
+			rawSpanBatch, err := spanBatch.ToRawSpanBatch()
 			require.NoError(err)
 			batch := derive.NewBatchData(rawSpanBatch)
 			var buf bytes.Buffer
@@ -833,21 +798,21 @@ func ChannelBuilder_InputBytes(t *testing.T, batchType uint) {
 func ChannelBuilder_OutputBytes(t *testing.T, batchType uint) {
 	require := require.New(t)
 	rng := rand.New(rand.NewSource(9860372))
-	cfg := defaultTestChannelConfig
-	cfg.CompressorConfig.TargetFrameSize = 1000
+	cfg := defaultTestChannelConfig()
 	cfg.MaxFrameSize = 1000
-	cfg.CompressorConfig.TargetNumFrames = 16
-	cfg.CompressorConfig.ApproxComprRatio = 1.0
+	cfg.TargetNumFrames = 16
 	cfg.BatchType = batchType
+	cfg.InitRatioCompressor(1.0, derive.Zlib)
 	cb, err := NewChannelBuilder(cfg, defaultTestRollupConfig, latestL1BlockOrigin)
 	require.NoError(err, "NewChannelBuilder")
 
 	require.Zero(cb.OutputBytes())
 
-	for {
-		block := dtest.RandomL2BlockWithChainId(rng, rng.Intn(32), defaultTestRollupConfig.L2ChainID)
+	ti := time.Now()
+	for i := 0; ; i++ {
+		block := dtest.RandomL2BlockWithChainIdAndTime(rng, rng.Intn(32), defaultTestRollupConfig.L2ChainID, ti.Add(time.Duration(i)*time.Second))
 		_, err := cb.AddBlock(block)
-		if errors.Is(err, derive.CompressorFullErr) {
+		if errors.Is(err, derive.ErrCompressorFull) {
 			break
 		}
 		require.NoError(err)
diff --git a/op-batcher/batcher/channel_config.go b/op-batcher/batcher/channel_config.go
new file mode 100644
index 000000000000..b504d2480f3d
--- /dev/null
+++ b/op-batcher/batcher/channel_config.go
@@ -0,0 +1,120 @@
+package batcher
+
+import (
+	"fmt"
+
+	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
+	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
+)
+
+type ChannelConfig struct {
+	// Number of epochs (L1 blocks) per sequencing window, including the epoch
+	// L1 origin block itself
+	SeqWindowSize uint64
+	// The maximum number of L1 blocks that the inclusion transactions of a
+	// channel's frames can span.
+	ChannelTimeout uint64
+
+	// Builder Config
+
+	// MaxChannelDuration is the maximum duration (in #L1-blocks) to keep the
+	// channel open. This allows control over how long a channel is kept open
+	// during times of low transaction volume.
+	//
+	// If 0, duration checks are disabled.
+	MaxChannelDuration uint64
+	// The batcher tx submission safety margin (in #L1-blocks) to subtract from
+	// a channel's timeout and sequencing window, to guarantee safe inclusion of
+	// a channel on L1.
+	SubSafetyMargin uint64
+	// The maximum byte-size a frame can have.
+	MaxFrameSize uint64
+
+	// Target number of frames to create per channel.
+	// For blob transactions, this controls the number of blobs to target adding
+	// to each blob tx.
+	TargetNumFrames int
+
+	// CompressorConfig contains the configuration for creating new compressors.
+	// It should not be set directly, but via the Init*Compressor methods after
+	// creating the ChannelConfig to guarantee a consistent configuration.
+	CompressorConfig compressor.Config
+
+	// BatchType indicates whether the channel uses SingularBatch or SpanBatch.
+	BatchType uint
+
+	// Whether to put all frames of a channel inside a single tx.
+	// Should only be used for blob transactions.
+	MultiFrameTxs bool
+}
+
+// InitCompressorConfig (re)initializes the channel configuration's compressor
+// configuration using the given values. The TargetOutputSize will be set to a
+// value consistent with cc.TargetNumFrames and cc.MaxFrameSize.
+// comprKind can be the empty string, in which case the default compressor will
+// be used.
+func (cc *ChannelConfig) InitCompressorConfig(approxComprRatio float64, comprKind string, compressionAlgo derive.CompressionAlgo) {
+	cc.CompressorConfig = compressor.Config{
+		// Compressor output size needs to account for frame encoding overhead
+		TargetOutputSize: MaxDataSize(cc.TargetNumFrames, cc.MaxFrameSize),
+		ApproxComprRatio: approxComprRatio,
+		Kind:             comprKind,
+		CompressionAlgo:  compressionAlgo,
+	}
+}
+
+func (cc *ChannelConfig) InitRatioCompressor(approxComprRatio float64, compressionAlgo derive.CompressionAlgo) {
+	cc.InitCompressorConfig(approxComprRatio, compressor.RatioKind, compressionAlgo)
+}
+
+func (cc *ChannelConfig) InitShadowCompressor(compressionAlgo derive.CompressionAlgo) {
+	cc.InitCompressorConfig(0, compressor.ShadowKind, compressionAlgo)
+}
+
+func (cc *ChannelConfig) InitNoneCompressor() {
+	cc.InitCompressorConfig(0, compressor.NoneKind, derive.Zlib)
+}
+
+func (cc *ChannelConfig) MaxFramesPerTx() int {
+	if !cc.MultiFrameTxs {
+		return 1
+	}
+	return cc.TargetNumFrames
+}
+
+// Check validates the [ChannelConfig] parameters.
+func (cc *ChannelConfig) Check() error {
+	// The [ChannelTimeout] must be larger than the [SubSafetyMargin].
+	// Otherwise, new blocks would always be considered timed out.
+	if cc.ChannelTimeout < cc.SubSafetyMargin {
+		return ErrInvalidChannelTimeout
+	}
+
+	// The max frame size must at least be able to accommodate the constant
+	// frame overhead.
+	if cc.MaxFrameSize < derive.FrameV0OverHeadSize {
+		return fmt.Errorf("max frame size %d is less than the minimum %d",
+			cc.MaxFrameSize, derive.FrameV0OverHeadSize)
+	}
+
+	if cc.BatchType > derive.SpanBatchType {
+		return fmt.Errorf("unrecognized batch type: %d", cc.BatchType)
+	}
+
+	if nf := cc.TargetNumFrames; nf < 1 {
+		return fmt.Errorf("invalid number of frames %d", nf)
+	}
+
+	return nil
+}
+
+// MaxDataSize returns the maximum byte size of output data that can be packed
+// into a channel with numFrames frames and frames of max size maxFrameSize.
+// It accounts for the constant frame overhead. It panics if the maxFrameSize
+// is smaller than [derive.FrameV0OverHeadSize].
+func MaxDataSize(numFrames int, maxFrameSize uint64) uint64 {
+	if maxFrameSize < derive.FrameV0OverHeadSize {
+		panic("max frame size smaller than frame overhead")
+	}
+	return uint64(numFrames) * (maxFrameSize - derive.FrameV0OverHeadSize)
+}
diff --git a/op-batcher/batcher/channel_config_test.go b/op-batcher/batcher/channel_config_test.go
new file mode 100644
index 000000000000..d7f3c2cc5ea5
--- /dev/null
+++ b/op-batcher/batcher/channel_config_test.go
@@ -0,0 +1,96 @@
+package batcher
+
+import (
+	"fmt"
+	"math"
+	"testing"
+
+	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
+
+	"github.com/stretchr/testify/require"
+)
+
+func defaultTestChannelConfig() ChannelConfig {
+	c := ChannelConfig{
+		SeqWindowSize:      15,
+		ChannelTimeout:     40,
+		MaxChannelDuration: 1,
+		SubSafetyMargin:    4,
+		MaxFrameSize:       120_000,
+		TargetNumFrames:    1,
+		BatchType:          derive.SingularBatchType,
+	}
+	c.InitRatioCompressor(0.4, derive.Zlib)
+	return c
+}
+
+func TestChannelConfig_Check(t *testing.T) {
+	type test struct {
+		input     func() ChannelConfig
+		assertion func(error)
+	}
+
+	tests := []test{
+		{
+			input: defaultTestChannelConfig,
+			assertion: func(output error) {
+				require.NoError(t, output)
+			},
+		},
+		{
+			input: func() ChannelConfig {
+				cfg := defaultTestChannelConfig()
+				cfg.ChannelTimeout = 0
+				cfg.SubSafetyMargin = 1
+				return cfg
+			},
+			assertion: func(output error) {
+				require.ErrorIs(t, output, ErrInvalidChannelTimeout)
+			},
+		},
+	}
+	for i := 0; i < derive.FrameV0OverHeadSize; i++ {
+		expectedErr := fmt.Sprintf("max frame size %d is less than the minimum 23", i)
+		i := i // need to udpate Go version...
+		tests = append(tests, test{
+			input: func() ChannelConfig {
+				cfg := defaultTestChannelConfig()
+				cfg.MaxFrameSize = uint64(i)
+				return cfg
+			},
+			assertion: func(output error) {
+				require.EqualError(t, output, expectedErr)
+			},
+		})
+	}
+
+	// Run the table tests
+	for _, test := range tests {
+		cfg := test.input()
+		test.assertion(cfg.Check())
+	}
+}
+
+// FuzzChannelConfig_CheckTimeout tests the [ChannelConfig.Check] function
+// with fuzzing to make sure that a [ErrInvalidChannelTimeout] is thrown when
+// the ChannelTimeout is less than the SubSafetyMargin.
+func FuzzChannelConfig_CheckTimeout(f *testing.F) {
+	for i := range [10]int{} {
+		f.Add(uint64(i+1), uint64(i))
+	}
+	f.Fuzz(func(t *testing.T, channelTimeout uint64, subSafetyMargin uint64) {
+		// We only test where [ChannelTimeout] is less than the [SubSafetyMargin]
+		// So we cannot have [ChannelTimeout] be [math.MaxUint64]
+		if channelTimeout == math.MaxUint64 {
+			channelTimeout = math.MaxUint64 - 1
+		}
+		if subSafetyMargin <= channelTimeout {
+			subSafetyMargin = channelTimeout + 1
+		}
+
+		channelConfig := defaultTestChannelConfig()
+		channelConfig.ChannelTimeout = channelTimeout
+		channelConfig.SubSafetyMargin = subSafetyMargin
+		require.ErrorIs(t, channelConfig.Check(), ErrInvalidChannelTimeout)
+	})
+}
diff --git a/op-batcher/batcher/channel_manager.go b/op-batcher/batcher/channel_manager.go
index 491837182acb..b6f26d25fe86 100644
--- a/op-batcher/batcher/channel_manager.go
+++ b/op-batcher/batcher/channel_manager.go
@@ -204,7 +204,6 @@ func (s *channelManager) ensureChannelWithSpace(l1Head eth.BlockID) error {
 	}
 
 	pc, err := newChannel(s.log, s.metr, s.cfg, s.rollupCfg, s.l1OriginLastClosedChannel.Number)
-
 	if err != nil {
 		return fmt.Errorf("creating new channel: %w", err)
 	}
@@ -218,6 +217,8 @@ func (s *channelManager) ensureChannelWithSpace(l1Head eth.BlockID) error {
 		"l1OriginLastClosedChannel", s.l1OriginLastClosedChannel,
 		"blocks_pending", len(s.blocks),
 		"batch_type", s.cfg.BatchType,
+		"compression_algo", s.cfg.CompressorConfig.CompressionAlgo,
+		"target_num_frames", s.cfg.TargetNumFrames,
 		"max_frame_size", s.cfg.MaxFrameSize,
 	)
 	s.metr.RecordChannelOpened(pc.ID(), len(s.blocks))
diff --git a/op-batcher/batcher/channel_manager_test.go b/op-batcher/batcher/channel_manager_test.go
index 36d874265cd7..d6c3d2e9336e 100644
--- a/op-batcher/batcher/channel_manager_test.go
+++ b/op-batcher/batcher/channel_manager_test.go
@@ -7,7 +7,6 @@ import (
 	"testing"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
 	"github.com/ethereum-optimism/optimism/op-batcher/metrics"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
@@ -20,6 +19,16 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
+func channelManagerTestConfig(maxFrameSize uint64, batchType uint) ChannelConfig {
+	cfg := ChannelConfig{
+		MaxFrameSize:    maxFrameSize,
+		TargetNumFrames: 1,
+		BatchType:       batchType,
+	}
+	cfg.InitRatioCompressor(1, derive.Zlib)
+	return cfg
+}
+
 func TestChannelManagerBatchType(t *testing.T) {
 	tests := []struct {
 		name string
@@ -84,18 +93,9 @@ func ChannelManagerReturnsErrReorg(t *testing.T, batchType uint) {
 // detects a reorg even if it does not have any blocks inside it.
 func ChannelManagerReturnsErrReorgWhenDrained(t *testing.T, batchType uint) {
 	log := testlog.Logger(t, log.LevelCrit)
-	m := NewChannelManager(log, metrics.NoopMetrics,
-		ChannelConfig{
-			MaxFrameSize: 120_000,
-			CompressorConfig: compressor.Config{
-				TargetFrameSize:  1,
-				TargetNumFrames:  1,
-				ApproxComprRatio: 1.0,
-			},
-			BatchType: batchType,
-		},
-		&rollup.Config{},
-	)
+	cfg := channelManagerTestConfig(120_000, batchType)
+	cfg.CompressorConfig.TargetOutputSize = 1 // full on first block
+	m := NewChannelManager(log, metrics.NoopMetrics, cfg, &rollup.Config{})
 	m.Clear(eth.BlockID{})
 
 	a := newMiniL2Block(0)
@@ -118,23 +118,13 @@ func ChannelManager_Clear(t *testing.T, batchType uint) {
 	// Create a channel manager
 	log := testlog.Logger(t, log.LevelCrit)
 	rng := rand.New(rand.NewSource(time.Now().UnixNano()))
-	m := NewChannelManager(log, metrics.NoopMetrics, ChannelConfig{
-		// Need to set the channel timeout here so we don't clear pending
-		// channels on confirmation. This would result in [TxConfirmed]
-		// clearing confirmed transactions, and resetting the pendingChannels map
-		ChannelTimeout: 10,
-		// Have to set the max frame size here otherwise the channel builder would not
-		// be able to output any frames
-		MaxFrameSize: 24,
-		CompressorConfig: compressor.Config{
-			TargetFrameSize:  24,
-			TargetNumFrames:  1,
-			ApproxComprRatio: 1.0,
-		},
-		BatchType: batchType,
-	},
-		&defaultTestRollupConfig,
-	)
+	cfg := channelManagerTestConfig(derive.FrameV0OverHeadSize+1, batchType)
+	// Need to set the channel timeout here so we don't clear pending
+	// channels on confirmation. This would result in [TxConfirmed]
+	// clearing confirmed transactions, and resetting the pendingChannels map
+	cfg.ChannelTimeout = 10
+	cfg.InitRatioCompressor(1, derive.Zlib)
+	m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
 
 	// Channel Manager state should be empty by default
 	require.Empty(m.blocks)
@@ -203,18 +193,9 @@ func ChannelManager_TxResend(t *testing.T, batchType uint) {
 	require := require.New(t)
 	rng := rand.New(rand.NewSource(time.Now().UnixNano()))
 	log := testlog.Logger(t, log.LevelError)
-	m := NewChannelManager(log, metrics.NoopMetrics,
-		ChannelConfig{
-			MaxFrameSize: 120_000,
-			CompressorConfig: compressor.Config{
-				TargetFrameSize:  1,
-				TargetNumFrames:  1,
-				ApproxComprRatio: 1.0,
-			},
-			BatchType: batchType,
-		},
-		&defaultTestRollupConfig,
-	)
+	cfg := channelManagerTestConfig(120_000, batchType)
+	cfg.CompressorConfig.TargetOutputSize = 1 // full on first block
+	m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
 	m.Clear(eth.BlockID{})
 
 	a := derivetest.RandomL2BlockWithChainId(rng, 4, defaultTestRollupConfig.L2ChainID)
@@ -252,15 +233,7 @@ func ChannelManagerCloseBeforeFirstUse(t *testing.T, batchType uint) {
 	rng := rand.New(rand.NewSource(time.Now().UnixNano()))
 	log := testlog.Logger(t, log.LevelCrit)
 	m := NewChannelManager(log, metrics.NoopMetrics,
-		ChannelConfig{
-			MaxFrameSize:   100,
-			ChannelTimeout: 1000,
-			CompressorConfig: compressor.Config{
-				TargetFrameSize:  0,
-				ApproxComprRatio: 1.0,
-			},
-			BatchType: batchType,
-		},
+		channelManagerTestConfig(10000, batchType),
 		&defaultTestRollupConfig,
 	)
 	m.Clear(eth.BlockID{})
@@ -282,19 +255,10 @@ func ChannelManagerCloseBeforeFirstUse(t *testing.T, batchType uint) {
 func ChannelManagerCloseNoPendingChannel(t *testing.T, batchType uint) {
 	require := require.New(t)
 	log := testlog.Logger(t, log.LevelCrit)
-	m := NewChannelManager(log, metrics.NoopMetrics,
-		ChannelConfig{
-			MaxFrameSize:   100,
-			ChannelTimeout: 1000,
-			CompressorConfig: compressor.Config{
-				TargetFrameSize:  1,
-				TargetNumFrames:  1,
-				ApproxComprRatio: 1.0,
-			},
-			BatchType: batchType,
-		},
-		&defaultTestRollupConfig,
-	)
+	cfg := channelManagerTestConfig(10000, batchType)
+	cfg.CompressorConfig.TargetOutputSize = 1 // full on first block
+	cfg.ChannelTimeout = 1000
+	m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
 	m.Clear(eth.BlockID{})
 	a := newMiniL2Block(0)
 	b := newMiniL2BlockWithNumberParent(0, big.NewInt(1), a.Hash())
@@ -319,7 +283,7 @@ func ChannelManagerCloseNoPendingChannel(t *testing.T, batchType uint) {
 	require.ErrorIs(err, io.EOF, "Expected closed channel manager to return no new tx data")
 }
 
-// ChannelManagerCloseNoPendingChannel ensures that the channel manager
+// ChannelManagerClosePendingChannel ensures that the channel manager
 // can gracefully close with a pending channel, and will not produce any
 // new channel frames after this point.
 func ChannelManagerClosePendingChannel(t *testing.T, batchType uint) {
@@ -328,19 +292,9 @@ func ChannelManagerClosePendingChannel(t *testing.T, batchType uint) {
 	// Example of different RNG seed that creates less than 2 frames: 1698700588902821588
 	rng := rand.New(rand.NewSource(123))
 	log := testlog.Logger(t, log.LevelError)
-	m := NewChannelManager(log, metrics.NoopMetrics,
-		ChannelConfig{
-			MaxFrameSize:   10_000,
-			ChannelTimeout: 1_000,
-			CompressorConfig: compressor.Config{
-				TargetNumFrames:  1,
-				TargetFrameSize:  10_000,
-				ApproxComprRatio: 1.0,
-			},
-			BatchType: batchType,
-		},
-		&defaultTestRollupConfig,
-	)
+	cfg := channelManagerTestConfig(10_000, batchType)
+	cfg.ChannelTimeout = 1000
+	m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
 	m.Clear(eth.BlockID{})
 
 	numTx := 20 // Adjust number of txs to make 2 frames
@@ -386,20 +340,13 @@ func TestChannelManager_Close_PartiallyPendingChannel(t *testing.T) {
 	// Example of different RNG seed that creates less than 2 frames: 1698700588902821588
 	rng := rand.New(rand.NewSource(123))
 	log := testlog.Logger(t, log.LevelError)
-	const framesize = 2200
-	m := NewChannelManager(log, metrics.NoopMetrics,
-		ChannelConfig{
-			MaxFrameSize:   framesize,
-			ChannelTimeout: 1000,
-			CompressorConfig: compressor.Config{
-				TargetNumFrames:  100,
-				TargetFrameSize:  framesize,
-				ApproxComprRatio: 1.0,
-				Kind:             "none",
-			},
-		},
-		&defaultTestRollupConfig,
-	)
+	cfg := ChannelConfig{
+		MaxFrameSize:    2200,
+		ChannelTimeout:  1000,
+		TargetNumFrames: 100,
+	}
+	cfg.InitNoneCompressor()
+	m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
 	m.Clear(eth.BlockID{})
 
 	numTx := 3 // Adjust number of txs to make 2 frames
@@ -446,38 +393,46 @@ func TestChannelManager_Close_PartiallyPendingChannel(t *testing.T) {
 // have successfully landed on chain.
 func ChannelManagerCloseAllTxsFailed(t *testing.T, batchType uint) {
 	require := require.New(t)
-	rng := rand.New(rand.NewSource(time.Now().UnixNano()))
+	rng := rand.New(rand.NewSource(1357))
 	log := testlog.Logger(t, log.LevelCrit)
-	m := NewChannelManager(log, metrics.NoopMetrics,
-		ChannelConfig{
-			MaxFrameSize:   1000,
-			ChannelTimeout: 1000,
-			CompressorConfig: compressor.Config{
-				TargetNumFrames:  100,
-				TargetFrameSize:  1000,
-				ApproxComprRatio: 1.0,
-			},
-			BatchType: batchType,
-		}, &defaultTestRollupConfig,
-	)
+	cfg := channelManagerTestConfig(100, batchType)
+	cfg.TargetNumFrames = 1000
+	cfg.InitNoneCompressor()
+	m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig)
 	m.Clear(eth.BlockID{})
 
-	a := derivetest.RandomL2BlockWithChainId(rng, 50000, defaultTestRollupConfig.L2ChainID)
+	a := derivetest.RandomL2BlockWithChainId(rng, 1000, defaultTestRollupConfig.L2ChainID)
 
 	err := m.AddL2Block(a)
 	require.NoError(err, "Failed to add L2 block")
 
-	txdata, err := m.TxData(eth.BlockID{})
-	require.NoError(err, "Expected channel manager to produce valid tx data")
+	drainTxData := func() (txdatas []txData) {
+		for {
+			txdata, err := m.TxData(eth.BlockID{})
+			if err == io.EOF {
+				return
+			}
+			require.NoError(err, "Expected channel manager to produce valid tx data")
+			txdatas = append(txdatas, txdata)
+		}
+	}
+
+	txdatas := drainTxData()
+	require.NotEmpty(txdatas)
 
-	m.TxFailed(txdata.ID())
+	for _, txdata := range txdatas {
+		m.TxFailed(txdata.ID())
+	}
 
 	// Show that this data will continue to be emitted as long as the transaction
 	// fails and the channel manager is not closed
-	txdata, err = m.TxData(eth.BlockID{})
-	require.NoError(err, "Expected channel manager to re-attempt the failed transaction")
+	txdatas1 := drainTxData()
+	require.NotEmpty(txdatas)
+	require.ElementsMatch(txdatas, txdatas1, "expected same txdatas on re-attempt")
 
-	m.TxFailed(txdata.ID())
+	for _, txdata := range txdatas1 {
+		m.TxFailed(txdata.ID())
+	}
 
 	require.NoError(m.Close(), "Expected to close channel manager gracefully")
 
@@ -487,16 +442,10 @@ func ChannelManagerCloseAllTxsFailed(t *testing.T, batchType uint) {
 
 func TestChannelManager_ChannelCreation(t *testing.T) {
 	l := testlog.Logger(t, log.LevelCrit)
-	maxChannelDuration := uint64(15)
-	cfg := ChannelConfig{
-		MaxChannelDuration: maxChannelDuration,
-		MaxFrameSize:       1000,
-		CompressorConfig: compressor.Config{
-			TargetNumFrames:  100,
-			TargetFrameSize:  1000,
-			ApproxComprRatio: 1.0,
-		},
-	}
+	const maxChannelDuration = 15
+	cfg := channelManagerTestConfig(1000, derive.SpanBatchType)
+	cfg.MaxChannelDuration = maxChannelDuration
+	cfg.InitNoneCompressor()
 
 	for _, tt := range []struct {
 		name                   string
diff --git a/op-batcher/batcher/channel_test.go b/op-batcher/batcher/channel_test.go
index 6e139afce64d..3d3e813d0ae8 100644
--- a/op-batcher/batcher/channel_test.go
+++ b/op-batcher/batcher/channel_test.go
@@ -30,6 +30,9 @@ func TestChannelTimeout(t *testing.T) {
 	log := testlog.Logger(t, log.LevelCrit)
 	m := NewChannelManager(log, metrics.NoopMetrics, ChannelConfig{
 		ChannelTimeout: 100,
+		CompressorConfig: compressor.Config{
+			CompressionAlgo: derive.Zlib,
+		},
 	}, &rollup.Config{})
 	m.Clear(eth.BlockID{})
 
@@ -72,7 +75,9 @@ func TestChannelTimeout(t *testing.T) {
 // TestChannelManager_NextTxData tests the nextTxData function.
 func TestChannelManager_NextTxData(t *testing.T) {
 	log := testlog.Logger(t, log.LevelCrit)
-	m := NewChannelManager(log, metrics.NoopMetrics, ChannelConfig{}, &rollup.Config{})
+	m := NewChannelManager(log, metrics.NoopMetrics, ChannelConfig{CompressorConfig: compressor.Config{
+		CompressionAlgo: derive.Zlib,
+	}}, &rollup.Config{})
 	m.Clear(eth.BlockID{})
 
 	// Nil pending channel should return EOF
@@ -117,9 +122,10 @@ func TestChannel_NextTxData_singleFrameTx(t *testing.T) {
 	const n = 6
 	lgr := testlog.Logger(t, log.LevelWarn)
 	ch, err := newChannel(lgr, metrics.NoopMetrics, ChannelConfig{
-		MultiFrameTxs: false,
+		MultiFrameTxs:   false,
+		TargetNumFrames: n,
 		CompressorConfig: compressor.Config{
-			TargetNumFrames: n,
+			CompressionAlgo: derive.Zlib,
 		},
 	}, &rollup.Config{}, latestL1BlockOrigin)
 	require.NoError(err)
@@ -157,9 +163,10 @@ func TestChannel_NextTxData_multiFrameTx(t *testing.T) {
 	const n = 6
 	lgr := testlog.Logger(t, log.LevelWarn)
 	ch, err := newChannel(lgr, metrics.NoopMetrics, ChannelConfig{
-		MultiFrameTxs: true,
+		MultiFrameTxs:   true,
+		TargetNumFrames: n,
 		CompressorConfig: compressor.Config{
-			TargetNumFrames: n,
+			CompressionAlgo: derive.Zlib,
 		},
 	}, &rollup.Config{}, latestL1BlockOrigin)
 	require.NoError(err)
@@ -207,6 +214,9 @@ func TestChannelTxConfirmed(t *testing.T) {
 		// channels on confirmation. This would result in [TxConfirmed]
 		// clearing confirmed transactions, and resetting the pendingChannels map
 		ChannelTimeout: 10,
+		CompressorConfig: compressor.Config{
+			CompressionAlgo: derive.Zlib,
+		},
 	}, &rollup.Config{})
 	m.Clear(eth.BlockID{})
 
@@ -256,7 +266,9 @@ func TestChannelTxConfirmed(t *testing.T) {
 func TestChannelTxFailed(t *testing.T) {
 	// Create a channel manager
 	log := testlog.Logger(t, log.LevelCrit)
-	m := NewChannelManager(log, metrics.NoopMetrics, ChannelConfig{}, &rollup.Config{})
+	m := NewChannelManager(log, metrics.NoopMetrics, ChannelConfig{CompressorConfig: compressor.Config{
+		CompressionAlgo: derive.Zlib,
+	}}, &rollup.Config{})
 	m.Clear(eth.BlockID{})
 
 	// Let's add a valid pending transaction to the channel
diff --git a/op-batcher/batcher/config.go b/op-batcher/batcher/config.go
index 3e76aa5e9c05..5180d8434b2f 100644
--- a/op-batcher/batcher/config.go
+++ b/op-batcher/batcher/config.go
@@ -10,6 +10,7 @@ import (
 
 	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
 	"github.com/ethereum-optimism/optimism/op-batcher/flags"
+	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	plasma "github.com/ethereum-optimism/optimism/op-plasma"
 	oplog "github.com/ethereum-optimism/optimism/op-service/log"
 	opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
@@ -55,8 +56,32 @@ type CLIConfig struct {
 	// If using blobs, this setting is ignored and the max blob size is used.
 	MaxL1TxSize uint64
 
+	// The target number of frames to create per channel. Controls number of blobs
+	// per blob tx, if using Blob DA.
+	TargetNumFrames int
+
+	// ApproxComprRatio to assume (only [compressor.RatioCompressor]).
+	// Should be slightly smaller than average from experiments to avoid the
+	// chances of creating a small additional leftover frame.
+	ApproxComprRatio float64
+
+	// Type of compressor to use. Must be one of [compressor.KindKeys].
+	Compressor string
+
+	// Type of compression algorithm to use. Must be one of [zlib, brotli, brotli[9-11]]
+	CompressionAlgo derive.CompressionAlgo
+
+	// If Stopped is true, the batcher starts stopped and won't start batching right away.
+	// Batching needs to be started via an admin RPC.
 	Stopped bool
 
+	// Whether to wait for the sequencer to sync to a recent block at startup.
+	WaitNodeSync bool
+
+	// How many blocks back to look for recent batcher transactions during node sync at startup.
+	// If 0, the batcher will just use the current head.
+	CheckRecentTxsDepth int
+
 	BatchType uint
 
 	// DataAvailabilityType is one of the values defined in op-batcher/flags/types.go and dictates
@@ -70,13 +95,12 @@ type CLIConfig struct {
 	// ActiveSequencerCheckDuration is the duration between checks to determine the active sequencer endpoint.
 	ActiveSequencerCheckDuration time.Duration
 
-	TxMgrConfig      txmgr.CLIConfig
-	LogConfig        oplog.CLIConfig
-	MetricsConfig    opmetrics.CLIConfig
-	PprofConfig      oppprof.CLIConfig
-	CompressorConfig compressor.CLIConfig
-	RPC              oprpc.CLIConfig
-	PlasmaDA         plasma.CLIConfig
+	TxMgrConfig   txmgr.CLIConfig
+	LogConfig     oplog.CLIConfig
+	MetricsConfig opmetrics.CLIConfig
+	PprofConfig   oppprof.CLIConfig
+	RPC           oprpc.CLIConfig
+	PlasmaDA      plasma.CLIConfig
 }
 
 func (c *CLIConfig) Check() error {
@@ -98,13 +122,22 @@ func (c *CLIConfig) Check() error {
 	if c.MaxL1TxSize <= 1 {
 		return errors.New("MaxL1TxSize must be greater than 1")
 	}
-	if target, max := c.CompressorConfig.TargetL1TxSizeBytes, c.MaxL1TxSize; target > max {
-		return fmt.Errorf("target tx size > max, %d > %d", target, max)
+	if c.TargetNumFrames < 1 {
+		return errors.New("TargetNumFrames must be at least 1")
+	}
+	if c.Compressor == compressor.RatioKind && (c.ApproxComprRatio <= 0 || c.ApproxComprRatio > 1) {
+		return fmt.Errorf("invalid ApproxComprRatio %v for ratio compressor", c.ApproxComprRatio)
+	}
+	if !derive.ValidCompressionAlgo(c.CompressionAlgo) {
+		return fmt.Errorf("invalid compression algo %v", c.CompressionAlgo)
 	}
 	if c.BatchType > 1 {
 		return fmt.Errorf("unknown batch type: %v", c.BatchType)
 	}
-	if c.DataAvailabilityType == flags.BlobsType && c.CompressorConfig.TargetNumFrames > 6 {
+	if c.CheckRecentTxsDepth > 128 {
+		return fmt.Errorf("CheckRecentTxsDepth cannot be set higher than 128: %v", c.CheckRecentTxsDepth)
+	}
+	if c.DataAvailabilityType == flags.BlobsType && c.TargetNumFrames > 6 {
 		return errors.New("too many frames for blob transactions, max 6")
 	}
 	if !flags.ValidDataAvailabilityType(c.DataAvailabilityType) {
@@ -139,7 +172,13 @@ func NewConfig(ctx *cli.Context) *CLIConfig {
 		MaxPendingTransactions:       ctx.Uint64(flags.MaxPendingTransactionsFlag.Name),
 		MaxChannelDuration:           ctx.Uint64(flags.MaxChannelDurationFlag.Name),
 		MaxL1TxSize:                  ctx.Uint64(flags.MaxL1TxSizeBytesFlag.Name),
+		TargetNumFrames:              ctx.Int(flags.TargetNumFramesFlag.Name),
+		ApproxComprRatio:             ctx.Float64(flags.ApproxComprRatioFlag.Name),
+		Compressor:                   ctx.String(flags.CompressorFlag.Name),
+		CompressionAlgo:              derive.CompressionAlgo(ctx.String(flags.CompressionAlgoFlag.Name)),
 		Stopped:                      ctx.Bool(flags.StoppedFlag.Name),
+		WaitNodeSync:                 ctx.Bool(flags.WaitNodeSyncFlag.Name),
+		CheckRecentTxsDepth:          ctx.Int(flags.CheckRecentTxsDepthFlag.Name),
 		BatchType:                    ctx.Uint(flags.BatchTypeFlag.Name),
 		DataAvailabilityType:         flags.DataAvailabilityType(ctx.String(flags.DataAvailabilityTypeFlag.Name)),
 		ActiveSequencerCheckDuration: ctx.Duration(flags.ActiveSequencerCheckDurationFlag.Name),
@@ -147,7 +186,6 @@ func NewConfig(ctx *cli.Context) *CLIConfig {
 		LogConfig:                    oplog.ReadCLIConfig(ctx),
 		MetricsConfig:                opmetrics.ReadCLIConfig(ctx),
 		PprofConfig:                  oppprof.ReadCLIConfig(ctx),
-		CompressorConfig:             compressor.ReadCLIConfig(ctx),
 		RPC:                          oprpc.ReadCLIConfig(ctx),
 		PlasmaDA:                     plasma.ReadCLIConfig(ctx),
 	}
diff --git a/op-batcher/batcher/config_test.go b/op-batcher/batcher/config_test.go
index 247483e87fb1..f8fb08a703da 100644
--- a/op-batcher/batcher/config_test.go
+++ b/op-batcher/batcher/config_test.go
@@ -5,7 +5,9 @@ import (
 	"time"
 
 	"github.com/ethereum-optimism/optimism/op-batcher/batcher"
+	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
 	"github.com/ethereum-optimism/optimism/op-batcher/flags"
+	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	"github.com/ethereum-optimism/optimism/op-service/log"
 	"github.com/ethereum-optimism/optimism/op-service/metrics"
 	"github.com/ethereum-optimism/optimism/op-service/oppprof"
@@ -24,6 +26,8 @@ func validBatcherConfig() batcher.CLIConfig {
 		PollInterval:           time.Second,
 		MaxPendingTransactions: 0,
 		MaxL1TxSize:            10,
+		TargetNumFrames:        1,
+		Compressor:             "shadow",
 		Stopped:                false,
 		BatchType:              0,
 		DataAvailabilityType:   flags.CalldataType,
@@ -32,7 +36,8 @@ func validBatcherConfig() batcher.CLIConfig {
 		MetricsConfig:          metrics.DefaultCLIConfig(),
 		PprofConfig:            oppprof.DefaultCLIConfig(),
 		// The compressor config is not checked in config.Check()
-		RPC: rpc.DefaultCLIConfig(),
+		RPC:             rpc.DefaultCLIConfig(),
+		CompressionAlgo: derive.Zlib,
 	}
 }
 
@@ -87,6 +92,27 @@ func TestBatcherConfig(t *testing.T) {
 			override:  func(c *batcher.CLIConfig) { c.DataAvailabilityType = "foo" },
 			errString: "unknown data availability type: \"foo\"",
 		},
+		{
+			name:      "zero TargetNumFrames",
+			override:  func(c *batcher.CLIConfig) { c.TargetNumFrames = 0 },
+			errString: "TargetNumFrames must be at least 1",
+		},
+		{
+			name: "larger 6 TargetNumFrames for blobs",
+			override: func(c *batcher.CLIConfig) {
+				c.TargetNumFrames = 7
+				c.DataAvailabilityType = flags.BlobsType
+			},
+			errString: "too many frames for blob transactions, max 6",
+		},
+		{
+			name: "invalid compr ratio for ratio compressor",
+			override: func(c *batcher.CLIConfig) {
+				c.ApproxComprRatio = 4.2
+				c.Compressor = compressor.RatioKind
+			},
+			errString: "invalid ApproxComprRatio 4.2 for ratio compressor",
+		},
 	}
 
 	for _, test := range tests {
diff --git a/op-batcher/batcher/driver.go b/op-batcher/batcher/driver.go
index e879fd3ab164..ef0a2fbe15ac 100644
--- a/op-batcher/batcher/driver.go
+++ b/op-batcher/batcher/driver.go
@@ -17,6 +17,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/dial"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
+	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
@@ -26,6 +27,7 @@ var ErrBatcherNotRunning = errors.New("batcher is not running")
 
 type L1Client interface {
 	HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error)
+	NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error)
 }
 
 type L2Client interface {
@@ -252,9 +254,16 @@ func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth.
 
 func (l *BatchSubmitter) loop() {
 	defer l.wg.Done()
+	if l.Config.WaitNodeSync {
+		err := l.waitNodeSync()
+		if err != nil {
+			l.Log.Error("Error waiting for node sync", "err", err)
+			return
+		}
+	}
 
-	receiptsCh := make(chan txmgr.TxReceipt[txData])
-	queue := txmgr.NewQueue[txData](l.killCtx, l.Txmgr, l.Config.MaxPendingTransactions)
+	receiptsCh := make(chan txmgr.TxReceipt[txID])
+	queue := txmgr.NewQueue[txID](l.killCtx, l.Txmgr, l.Config.MaxPendingTransactions)
 
 	// start the receipt/result processing loop
 	receiptLoopDone := make(chan struct{})
@@ -283,6 +292,7 @@ func (l *BatchSubmitter) loop() {
 			l.Log.Info("Txmgr is closed, remaining channel data won't be sent")
 		}
 	}
+
 	for {
 		select {
 		case <-ticker.C:
@@ -324,9 +334,40 @@ func (l *BatchSubmitter) loop() {
 	}
 }
 
+// waitNodeSync Check to see if there was a batcher tx sent recently that
+// still needs more block confirmations before being considered finalized
+func (l *BatchSubmitter) waitNodeSync() error {
+	ctx, cancel := context.WithTimeout(l.shutdownCtx, l.Config.NetworkTimeout)
+	defer cancel()
+
+	rollupClient, err := l.EndpointProvider.RollupClient(ctx)
+	if err != nil {
+		return fmt.Errorf("failed to get rollup client: %w", err)
+	}
+
+	l1Tip, err := l.l1Tip(ctx)
+	if err != nil {
+		return fmt.Errorf("failed to retrieve l1 tip: %w", err)
+	}
+
+	l1TargetBlock := l1Tip.Number
+	if l.Config.CheckRecentTxsDepth != 0 {
+		l.Log.Info("Checking for recently submitted batcher transactions on L1")
+		recentBlock, found, err := eth.CheckRecentTxs(ctx, l.L1Client, l.Config.CheckRecentTxsDepth, l.Txmgr.From())
+		if err != nil {
+			return fmt.Errorf("failed checking recent batcher txs: %w", err)
+		}
+		l.Log.Info("Checked for recently submitted batcher transactions on L1",
+			"l1_head", l1Tip, "l1_recent", recentBlock, "found", found)
+		l1TargetBlock = recentBlock
+	}
+
+	return dial.WaitRollupSync(l.shutdownCtx, l.Log, rollupClient, l1TargetBlock, time.Second*12)
+}
+
 // publishStateToL1 queues up all pending TxData to be published to the L1, returning when there is
 // no more data to queue for publishing or if there was an error queing the data.
-func (l *BatchSubmitter) publishStateToL1(queue *txmgr.Queue[txData], receiptsCh chan txmgr.TxReceipt[txData]) {
+func (l *BatchSubmitter) publishStateToL1(queue *txmgr.Queue[txID], receiptsCh chan txmgr.TxReceipt[txID]) {
 	for {
 		// if the txmgr is closed, we stop the transaction sending
 		if l.Txmgr.IsClosed() {
@@ -383,7 +424,7 @@ func (l *BatchSubmitter) clearState(ctx context.Context) {
 }
 
 // publishTxToL1 submits a single state tx to the L1
-func (l *BatchSubmitter) publishTxToL1(ctx context.Context, queue *txmgr.Queue[txData], receiptsCh chan txmgr.TxReceipt[txData]) error {
+func (l *BatchSubmitter) publishTxToL1(ctx context.Context, queue *txmgr.Queue[txID], receiptsCh chan txmgr.TxReceipt[txID]) error {
 	// send all available transactions
 	l1tip, err := l.l1Tip(ctx)
 	if err != nil {
@@ -435,7 +476,7 @@ func (l *BatchSubmitter) safeL1Origin(ctx context.Context) (eth.BlockID, error)
 
 // sendTransaction creates & queues for sending a transaction to the batch inbox address with the given `txData`.
 // The method will block if the queue's MaxPendingTransactions is exceeded.
-func (l *BatchSubmitter) sendTransaction(ctx context.Context, txdata txData, queue *txmgr.Queue[txData], receiptsCh chan txmgr.TxReceipt[txData]) error {
+func (l *BatchSubmitter) sendTransaction(ctx context.Context, txdata txData, queue *txmgr.Queue[txID], receiptsCh chan txmgr.TxReceipt[txID]) error {
 	var err error
 	// Do the gas estimation offline. A value of 0 will cause the [txmgr] to estimate the gas limit.
 
@@ -460,7 +501,7 @@ func (l *BatchSubmitter) sendTransaction(ctx context.Context, txdata txData, que
 			if err != nil {
 				l.Log.Error("Failed to post input to Plasma DA", "error", err)
 				// requeue frame if we fail to post to the DA Provider so it can be retried
-				l.recordFailedTx(txdata, err)
+				l.recordFailedTx(txdata.ID(), err)
 				return nil
 			}
 			// signal plasma commitment tx with TxDataVersion1
@@ -477,7 +518,7 @@ func (l *BatchSubmitter) sendTransaction(ctx context.Context, txdata txData, que
 		candidate.GasLimit = intrinsicGas
 	}
 
-	queue.Send(txdata, *candidate, receiptsCh)
+	queue.Send(txdata.ID(), *candidate, receiptsCh)
 	return nil
 }
 
@@ -505,7 +546,7 @@ func (l *BatchSubmitter) calldataTxCandidate(data []byte) *txmgr.TxCandidate {
 	}
 }
 
-func (l *BatchSubmitter) handleReceipt(r txmgr.TxReceipt[txData]) {
+func (l *BatchSubmitter) handleReceipt(r txmgr.TxReceipt[txID]) {
 	// Record TX Status
 	if r.Err != nil {
 		l.recordFailedTx(r.ID, r.Err)
@@ -522,15 +563,15 @@ func (l *BatchSubmitter) recordL1Tip(l1tip eth.L1BlockRef) {
 	l.Metr.RecordLatestL1Block(l1tip)
 }
 
-func (l *BatchSubmitter) recordFailedTx(txd txData, err error) {
-	l.Log.Warn("Transaction failed to send", logFields(txd, err)...)
-	l.state.TxFailed(txd.ID())
+func (l *BatchSubmitter) recordFailedTx(id txID, err error) {
+	l.Log.Warn("Transaction failed to send", logFields(id, err)...)
+	l.state.TxFailed(id)
 }
 
-func (l *BatchSubmitter) recordConfirmedTx(txd txData, receipt *types.Receipt) {
-	l.Log.Info("Transaction confirmed", logFields(txd, receipt)...)
+func (l *BatchSubmitter) recordConfirmedTx(id txID, receipt *types.Receipt) {
+	l.Log.Info("Transaction confirmed", logFields(id, receipt)...)
 	l1block := eth.ReceiptBlockID(receipt)
-	l.state.TxConfirmed(txd.ID(), l1block)
+	l.state.TxConfirmed(id, l1block)
 }
 
 // l1Tip gets the current L1 tip as a L1BlockRef. The passed context is assumed
@@ -548,8 +589,8 @@ func (l *BatchSubmitter) l1Tip(ctx context.Context) (eth.L1BlockRef, error) {
 func logFields(xs ...any) (fs []any) {
 	for _, x := range xs {
 		switch v := x.(type) {
-		case txData:
-			fs = append(fs, "tx_id", v.ID(), "data_len", v.Len())
+		case txID:
+			fs = append(fs, "tx_id", v.String())
 		case *types.Receipt:
 			fs = append(fs, "tx", v.TxHash, "block", eth.ReceiptBlockID(v))
 		case error:
diff --git a/op-batcher/batcher/service.go b/op-batcher/batcher/service.go
index cf09f5e18c83..1969b2acf5fb 100644
--- a/op-batcher/batcher/service.go
+++ b/op-batcher/batcher/service.go
@@ -13,7 +13,6 @@ import (
 	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/ethereum/go-ethereum/log"
 
-	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
 	"github.com/ethereum-optimism/optimism/op-batcher/flags"
 	"github.com/ethereum-optimism/optimism/op-batcher/metrics"
 	"github.com/ethereum-optimism/optimism/op-batcher/rpc"
@@ -43,6 +42,9 @@ type BatcherConfig struct {
 	// UsePlasma is true if the rollup config has a DA challenge address so the batcher
 	// will post inputs to the Plasma DA server and post commitments to blobs or calldata.
 	UsePlasma bool
+
+	WaitNodeSync        bool
+	CheckRecentTxsDepth int
 }
 
 // BatcherService represents a full batch-submitter instance and its resources,
@@ -97,6 +99,8 @@ func (bs *BatcherService) initFromCLIConfig(ctx context.Context, version string,
 	bs.PollInterval = cfg.PollInterval
 	bs.MaxPendingTransactions = cfg.MaxPendingTransactions
 	bs.NetworkTimeout = cfg.TxMgrConfig.NetworkTimeout
+	bs.CheckRecentTxsDepth = cfg.CheckRecentTxsDepth
+	bs.WaitNodeSync = cfg.WaitNodeSync
 	if err := bs.initRPCClients(ctx, cfg); err != nil {
 		return err
 	}
@@ -187,22 +191,23 @@ func (bs *BatcherService) initRollupConfig(ctx context.Context) error {
 }
 
 func (bs *BatcherService) initChannelConfig(cfg *CLIConfig) error {
-	bs.ChannelConfig = ChannelConfig{
+	cc := ChannelConfig{
 		SeqWindowSize:      bs.RollupConfig.SeqWindowSize,
 		ChannelTimeout:     bs.RollupConfig.ChannelTimeout,
 		MaxChannelDuration: cfg.MaxChannelDuration,
-		MaxFrameSize:       cfg.MaxL1TxSize, // reset for blobs
+		MaxFrameSize:       cfg.MaxL1TxSize - 1, // account for version byte prefix; reset for blobs
+		TargetNumFrames:    cfg.TargetNumFrames,
 		SubSafetyMargin:    cfg.SubSafetyMargin,
-		CompressorConfig:   cfg.CompressorConfig.Config(),
 		BatchType:          cfg.BatchType,
 	}
 
 	switch cfg.DataAvailabilityType {
 	case flags.BlobsType:
 		if !cfg.TestUseMaxTxSizeForBlobs {
-			bs.ChannelConfig.MaxFrameSize = eth.MaxBlobDataSize
+			// account for version byte prefix
+			cc.MaxFrameSize = eth.MaxBlobDataSize - 1
 		}
-		bs.ChannelConfig.MultiFrameTxs = true
+		cc.MultiFrameTxs = true
 		bs.UseBlobs = true
 	case flags.CalldataType:
 		bs.UseBlobs = false
@@ -210,16 +215,11 @@ func (bs *BatcherService) initChannelConfig(cfg *CLIConfig) error {
 		return fmt.Errorf("unknown data availability type: %v", cfg.DataAvailabilityType)
 	}
 
-	if bs.UsePlasma && bs.ChannelConfig.MaxFrameSize > plasma.MaxInputSize {
-		return fmt.Errorf("max frame size %d exceeds plasma max input size %d", bs.ChannelConfig.MaxFrameSize, plasma.MaxInputSize)
+	if bs.UsePlasma && cc.MaxFrameSize > plasma.MaxInputSize {
+		return fmt.Errorf("max frame size %d exceeds plasma max input size %d", cc.MaxFrameSize, plasma.MaxInputSize)
 	}
 
-	bs.ChannelConfig.MaxFrameSize-- // subtract 1 byte for version
-
-	if bs.ChannelConfig.CompressorConfig.Kind == compressor.ShadowKind {
-		// shadow compressor guarantees to not go over target size, so can use max size
-		bs.ChannelConfig.CompressorConfig.TargetFrameSize = bs.ChannelConfig.MaxFrameSize
-	}
+	cc.InitCompressorConfig(cfg.ApproxComprRatio, cfg.Compressor, cfg.CompressionAlgo)
 
 	if bs.UseBlobs && !bs.RollupConfig.IsEcotone(uint64(time.Now().Unix())) {
 		bs.Log.Error("Cannot use Blob data before Ecotone!") // log only, the batcher may not be actively running.
@@ -228,16 +228,26 @@ func (bs *BatcherService) initChannelConfig(cfg *CLIConfig) error {
 		bs.Log.Warn("Ecotone upgrade is active, but batcher is not configured to use Blobs!")
 	}
 
-	if err := bs.ChannelConfig.Check(); err != nil {
+	// Checking for brotli compression only post Fjord
+	if bs.ChannelConfig.CompressorConfig.CompressionAlgo.IsBrotli() && !bs.RollupConfig.IsFjord(uint64(time.Now().Unix())) {
+		return fmt.Errorf("cannot use brotli compression before Fjord")
+	}
+
+	if err := cc.Check(); err != nil {
 		return fmt.Errorf("invalid channel configuration: %w", err)
 	}
 	bs.Log.Info("Initialized channel-config",
 		"use_blobs", bs.UseBlobs,
-		"max_frame_size", bs.ChannelConfig.MaxFrameSize,
-		"max_channel_duration", bs.ChannelConfig.MaxChannelDuration,
-		"channel_timeout", bs.ChannelConfig.ChannelTimeout,
-		"batch_type", bs.ChannelConfig.BatchType,
-		"sub_safety_margin", bs.ChannelConfig.SubSafetyMargin)
+		"use_plasma", bs.UsePlasma,
+		"max_frame_size", cc.MaxFrameSize,
+		"target_num_frames", cc.TargetNumFrames,
+		"compressor", cc.CompressorConfig.Kind,
+		"compression_algo", cc.CompressorConfig.CompressionAlgo,
+		"batch_type", cc.BatchType,
+		"max_channel_duration", cc.MaxChannelDuration,
+		"channel_timeout", cc.ChannelTimeout,
+		"sub_safety_margin", cc.SubSafetyMargin)
+	bs.ChannelConfig = cc
 	return nil
 }
 
diff --git a/op-batcher/compressor/cli.go b/op-batcher/compressor/cli.go
deleted file mode 100644
index 575662d03f21..000000000000
--- a/op-batcher/compressor/cli.go
+++ /dev/null
@@ -1,78 +0,0 @@
-package compressor
-
-import (
-	"strings"
-
-	opservice "github.com/ethereum-optimism/optimism/op-service"
-	"github.com/urfave/cli/v2"
-)
-
-const (
-	TargetL1TxSizeBytesFlagName = "target-l1-tx-size-bytes"
-	TargetNumFramesFlagName     = "target-num-frames"
-	ApproxComprRatioFlagName    = "approx-compr-ratio"
-	KindFlagName                = "compressor"
-)
-
-func CLIFlags(envPrefix string) []cli.Flag {
-	return []cli.Flag{
-		&cli.Uint64Flag{
-			Name:    TargetL1TxSizeBytesFlagName,
-			Usage:   "The target size of a batch tx submitted to L1.",
-			Value:   100_000,
-			EnvVars: opservice.PrefixEnvVar(envPrefix, "TARGET_L1_TX_SIZE_BYTES"),
-		},
-		&cli.IntFlag{
-			Name:    TargetNumFramesFlagName,
-			Usage:   "The target number of frames to create per channel",
-			Value:   1,
-			EnvVars: opservice.PrefixEnvVar(envPrefix, "TARGET_NUM_FRAMES"),
-		},
-		&cli.Float64Flag{
-			Name:    ApproxComprRatioFlagName,
-			Usage:   "The approximate compression ratio (<= 1.0)",
-			Value:   0.4,
-			EnvVars: opservice.PrefixEnvVar(envPrefix, "APPROX_COMPR_RATIO"),
-		},
-		&cli.StringFlag{
-			Name:    KindFlagName,
-			Usage:   "The type of compressor. Valid options: " + strings.Join(KindKeys, ", "),
-			EnvVars: opservice.PrefixEnvVar(envPrefix, "COMPRESSOR"),
-			Value:   ShadowKind,
-		},
-	}
-}
-
-type CLIConfig struct {
-	// TargetL1TxSizeBytes to target when creating channel frames. Note that if the
-	// realized compression ratio is worse than the approximate, more frames may
-	// actually be created. This also depends on how close the target is to the
-	// max frame size.
-	TargetL1TxSizeBytes uint64
-	// TargetNumFrames to create in this channel. If the realized compression ratio
-	// is worse than approxComprRatio, additional leftover frame(s) might get created.
-	TargetNumFrames int
-	// ApproxComprRatio to assume. Should be slightly smaller than average from
-	// experiments to avoid the chances of creating a small additional leftover frame.
-	ApproxComprRatio float64
-	// Type of compressor to use. Must be one of KindKeys.
-	Kind string
-}
-
-func (c *CLIConfig) Config() Config {
-	return Config{
-		TargetFrameSize:  c.TargetL1TxSizeBytes - 1, // subtract 1 byte for version
-		TargetNumFrames:  c.TargetNumFrames,
-		ApproxComprRatio: c.ApproxComprRatio,
-		Kind:             c.Kind,
-	}
-}
-
-func ReadCLIConfig(ctx *cli.Context) CLIConfig {
-	return CLIConfig{
-		Kind:                ctx.String(KindFlagName),
-		TargetL1TxSizeBytes: ctx.Uint64(TargetL1TxSizeBytesFlagName),
-		TargetNumFrames:     ctx.Int(TargetNumFramesFlagName),
-		ApproxComprRatio:    ctx.Float64(ApproxComprRatioFlagName),
-	}
-}
diff --git a/op-batcher/compressor/compressors.go b/op-batcher/compressor/compressors.go
index 5d2e9d0561e7..1a6d64da13e6 100644
--- a/op-batcher/compressor/compressors.go
+++ b/op-batcher/compressor/compressors.go
@@ -10,6 +10,10 @@ const (
 	RatioKind  = "ratio"
 	ShadowKind = "shadow"
 	NoneKind   = "none"
+
+	// CloseOverheadZlib is the number of final bytes a [zlib.Writer] call writes
+	// to the output buffer.
+	CloseOverheadZlib = 9
 )
 
 var Kinds = map[string]FactoryFunc{
diff --git a/op-batcher/compressor/compressors_test.go b/op-batcher/compressor/compressors_test.go
new file mode 100644
index 000000000000..ed6d852d0411
--- /dev/null
+++ b/op-batcher/compressor/compressors_test.go
@@ -0,0 +1,25 @@
+package compressor
+
+import (
+	"bytes"
+	"compress/zlib"
+	"io"
+	"math/rand"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+func TestCloseOverheadZlib(t *testing.T) {
+	var buf bytes.Buffer
+	z := zlib.NewWriter(&buf)
+	rng := rand.New(rand.NewSource(420))
+	_, err := io.CopyN(z, rng, 0xff)
+	require.NoError(t, err)
+
+	require.NoError(t, z.Flush())
+	fsize := buf.Len()
+	require.NoError(t, z.Close())
+	csize := buf.Len()
+	require.Equal(t, CloseOverheadZlib, csize-fsize)
+}
diff --git a/op-batcher/compressor/config.go b/op-batcher/compressor/config.go
index 7578062e0f62..e4078c8373a6 100644
--- a/op-batcher/compressor/config.go
+++ b/op-batcher/compressor/config.go
@@ -5,18 +5,20 @@ import (
 )
 
 type Config struct {
-	// TargetFrameSize to target when creating channel frames.
-	// It is guaranteed that a frame will never be larger.
-	TargetFrameSize uint64
-	// TargetNumFrames to create in this channel. If the first block that is added
-	// doesn't fit within a single frame, more frames might be created.
-	TargetNumFrames int
-	// ApproxComprRatio to assume. Should be slightly smaller than average from
-	// experiments to avoid the chances of creating a small additional leftover frame.
+	// TargetOutputSize is the target size that the compressed data should reach.
+	// The shadow compressor guarantees that the compressed data stays below
+	// this bound. The ratio compressor might go over.
+	TargetOutputSize uint64
+	// ApproxComprRatio to assume (only ratio compressor). Should be slightly smaller
+	// than average from experiments to avoid the chances of creating a small
+	// additional leftover frame.
 	ApproxComprRatio float64
 	// Kind of compressor to use. Must be one of KindKeys. If unset, NewCompressor
 	// will default to RatioKind.
 	Kind string
+
+	// Type of compression algorithm to use. Must be one of [zlib, brotli-(9|10|11)]
+	CompressionAlgo derive.CompressionAlgo
 }
 
 func (c Config) NewCompressor() (derive.Compressor, error) {
diff --git a/op-batcher/compressor/non_compressor.go b/op-batcher/compressor/non_compressor.go
index 6b1a9fc3376f..e4ff8bc122bd 100644
--- a/op-batcher/compressor/non_compressor.go
+++ b/op-batcher/compressor/non_compressor.go
@@ -44,8 +44,8 @@ func (t *NonCompressor) Write(p []byte) (int, error) {
 	if err != nil {
 		return 0, err
 	}
-	if uint64(t.buf.Len()) > t.config.TargetFrameSize*uint64(t.config.TargetNumFrames) {
-		t.fullErr = derive.CompressorFullErr
+	if uint64(t.buf.Len()) > t.config.TargetOutputSize {
+		t.fullErr = derive.ErrCompressorFull
 	}
 	return n, nil
 }
diff --git a/op-batcher/compressor/non_compressor_test.go b/op-batcher/compressor/non_compressor_test.go
index c6fc440b1d8a..972582469a99 100644
--- a/op-batcher/compressor/non_compressor_test.go
+++ b/op-batcher/compressor/non_compressor_test.go
@@ -10,8 +10,7 @@ import (
 func TestNonCompressor(t *testing.T) {
 	require := require.New(t)
 	c, err := NewNonCompressor(Config{
-		TargetFrameSize: 1000,
-		TargetNumFrames: 100,
+		TargetOutputSize: 100000,
 	})
 	require.NoError(err)
 
diff --git a/op-batcher/compressor/ratio_compressor.go b/op-batcher/compressor/ratio_compressor.go
index 6e726ae8a53e..516cd05f6a2c 100644
--- a/op-batcher/compressor/ratio_compressor.go
+++ b/op-batcher/compressor/ratio_compressor.go
@@ -1,9 +1,6 @@
 package compressor
 
 import (
-	"bytes"
-	"compress/zlib"
-
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 )
 
@@ -11,8 +8,7 @@ type RatioCompressor struct {
 	config Config
 
 	inputBytes int
-	buf        bytes.Buffer
-	compress   *zlib.Writer
+	compressor derive.ChannelCompressor
 }
 
 // NewRatioCompressor creates a new derive.Compressor implementation that uses the target
@@ -25,11 +21,11 @@ func NewRatioCompressor(config Config) (derive.Compressor, error) {
 		config: config,
 	}
 
-	compress, err := zlib.NewWriterLevel(&c.buf, zlib.BestCompression)
+	compressor, err := derive.NewChannelCompressor(config.CompressionAlgo)
 	if err != nil {
 		return nil, err
 	}
-	c.compress = compress
+	c.compressor = compressor
 
 	return c, nil
 }
@@ -39,34 +35,33 @@ func (t *RatioCompressor) Write(p []byte) (int, error) {
 		return 0, err
 	}
 	t.inputBytes += len(p)
-	return t.compress.Write(p)
+	return t.compressor.Write(p)
 }
 
 func (t *RatioCompressor) Close() error {
-	return t.compress.Close()
+	return t.compressor.Close()
 }
 
 func (t *RatioCompressor) Read(p []byte) (int, error) {
-	return t.buf.Read(p)
+	return t.compressor.Read(p)
 }
 
 func (t *RatioCompressor) Reset() {
-	t.buf.Reset()
-	t.compress.Reset(&t.buf)
+	t.compressor.Reset()
 	t.inputBytes = 0
 }
 
 func (t *RatioCompressor) Len() int {
-	return t.buf.Len()
+	return t.compressor.Len()
 }
 
 func (t *RatioCompressor) Flush() error {
-	return t.compress.Flush()
+	return t.compressor.Flush()
 }
 
 func (t *RatioCompressor) FullErr() error {
 	if t.inputTargetReached() {
-		return derive.CompressorFullErr
+		return derive.ErrCompressorFull
 	}
 	return nil
 }
@@ -74,7 +69,7 @@ func (t *RatioCompressor) FullErr() error {
 // InputThreshold calculates the input data threshold in bytes from the given
 // parameters.
 func (t *RatioCompressor) InputThreshold() uint64 {
-	return uint64(float64(t.config.TargetNumFrames) * float64(t.config.TargetFrameSize) / t.config.ApproxComprRatio)
+	return uint64(float64(t.config.TargetOutputSize) / t.config.ApproxComprRatio)
 }
 
 // inputTargetReached says whether the target amount of input data has been
diff --git a/op-batcher/compressor/ratio_compressor_test.go b/op-batcher/compressor/ratio_compressor_test.go
index 0691a9d5f12a..d1b0d4b936c7 100644
--- a/op-batcher/compressor/ratio_compressor_test.go
+++ b/op-batcher/compressor/ratio_compressor_test.go
@@ -1,113 +1,55 @@
 package compressor_test
 
 import (
+	"fmt"
 	"math"
 	"testing"
 
 	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
+	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	"github.com/stretchr/testify/require"
 )
 
-// TestInputThreshold tests the [ChannelConfig.InputThreshold]
-// function using a table-driven testing approach.
-func TestInputThreshold(t *testing.T) {
-	type testInput struct {
-		TargetFrameSize  uint64
-		TargetNumFrames  int
-		ApproxComprRatio float64
-	}
-
-	// Construct test cases that test the boundary conditions
+func TestChannelConfig_InputThreshold(t *testing.T) {
 	tests := []struct {
-		input     testInput
-		assertion func(uint64)
+		targetOutputSize  uint64
+		approxComprRatio  float64
+		expInputThreshold uint64
+		assertion         func(uint64) // optional, for more complex assertion
 	}{
 		{
-			input: testInput{
-				TargetFrameSize:  1,
-				TargetNumFrames:  1,
-				ApproxComprRatio: 0.4,
-			},
-			assertion: func(output uint64) {
-				require.Equal(t, uint64(2), output)
-			},
+			targetOutputSize:  1,
+			approxComprRatio:  0.4,
+			expInputThreshold: 2,
 		},
 		{
-			input: testInput{
-				TargetFrameSize:  1,
-				TargetNumFrames:  100000,
-				ApproxComprRatio: 0.4,
-			},
-			assertion: func(output uint64) {
-				require.Equal(t, uint64(250_000), output)
-			},
+			targetOutputSize:  1,
+			approxComprRatio:  1,
+			expInputThreshold: 1,
 		},
 		{
-			input: testInput{
-				TargetFrameSize:  1,
-				TargetNumFrames:  1,
-				ApproxComprRatio: 1,
-			},
-			assertion: func(output uint64) {
-				require.Equal(t, uint64(1), output)
-			},
+			targetOutputSize:  100_000,
+			approxComprRatio:  0.4,
+			expInputThreshold: 250_000,
 		},
 		{
-			input: testInput{
-				TargetFrameSize:  1,
-				TargetNumFrames:  1,
-				ApproxComprRatio: 2,
-			},
-			assertion: func(output uint64) {
-				require.Equal(t, uint64(0), output)
-			},
+			targetOutputSize:  1,
+			approxComprRatio:  0.4,
+			expInputThreshold: 2,
 		},
 		{
-			input: testInput{
-				TargetFrameSize:  100000,
-				TargetNumFrames:  1,
-				ApproxComprRatio: 0.4,
-			},
-			assertion: func(output uint64) {
-				require.Equal(t, uint64(250_000), output)
-			},
+			targetOutputSize:  100_000,
+			approxComprRatio:  0.4,
+			expInputThreshold: 250_000,
 		},
 		{
-			input: testInput{
-				TargetFrameSize:  1,
-				TargetNumFrames:  100000,
-				ApproxComprRatio: 0.4,
-			},
-			assertion: func(output uint64) {
-				require.Equal(t, uint64(250_000), output)
-			},
+			targetOutputSize:  1,
+			approxComprRatio:  0.000001,
+			expInputThreshold: 1_000_000,
 		},
 		{
-			input: testInput{
-				TargetFrameSize:  100000,
-				TargetNumFrames:  100000,
-				ApproxComprRatio: 0.4,
-			},
-			assertion: func(output uint64) {
-				require.Equal(t, uint64(25_000_000_000), output)
-			},
-		},
-		{
-			input: testInput{
-				TargetFrameSize:  1,
-				TargetNumFrames:  1,
-				ApproxComprRatio: 0.000001,
-			},
-			assertion: func(output uint64) {
-				require.Equal(t, uint64(1_000_000), output)
-			},
-		},
-		{
-			input: testInput{
-				TargetFrameSize:  0,
-				TargetNumFrames:  0,
-				ApproxComprRatio: 0,
-			},
+			targetOutputSize: 0,
+			approxComprRatio: 0,
 			assertion: func(output uint64) {
 				// Need to allow for NaN depending on the machine architecture
 				require.True(t, output == uint64(0) || output == uint64(math.NaN()))
@@ -116,14 +58,20 @@ func TestInputThreshold(t *testing.T) {
 	}
 
 	// Validate each test case
-	for _, tt := range tests {
-		comp, err := compressor.NewRatioCompressor(compressor.Config{
-			TargetFrameSize:  tt.input.TargetFrameSize,
-			TargetNumFrames:  tt.input.TargetNumFrames,
-			ApproxComprRatio: tt.input.ApproxComprRatio,
+	for i, tt := range tests {
+		t.Run(fmt.Sprintf("test-%d", i), func(t *testing.T) {
+			comp, err := compressor.NewRatioCompressor(compressor.Config{
+				TargetOutputSize: tt.targetOutputSize,
+				ApproxComprRatio: tt.approxComprRatio,
+				CompressionAlgo:  derive.Zlib,
+			})
+			require.NoError(t, err)
+			got := comp.(*compressor.RatioCompressor).InputThreshold()
+			if tt.assertion != nil {
+				tt.assertion(got)
+			} else {
+				require.Equal(t, tt.expInputThreshold, got)
+			}
 		})
-		require.NoError(t, err)
-		got := comp.(*compressor.RatioCompressor).InputThreshold()
-		tt.assertion(got)
 	}
 }
diff --git a/op-batcher/compressor/shadow_compressor.go b/op-batcher/compressor/shadow_compressor.go
index 9cd6b387015d..b5cd9fe6f199 100644
--- a/op-batcher/compressor/shadow_compressor.go
+++ b/op-batcher/compressor/shadow_compressor.go
@@ -1,9 +1,6 @@
 package compressor
 
 import (
-	"bytes"
-	"compress/zlib"
-
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 )
 
@@ -21,11 +18,8 @@ const (
 type ShadowCompressor struct {
 	config Config
 
-	buf      bytes.Buffer
-	compress *zlib.Writer
-
-	shadowBuf      bytes.Buffer
-	shadowCompress *zlib.Writer
+	compressor       derive.ChannelCompressor
+	shadowCompressor derive.ChannelCompressor
 
 	fullErr error
 
@@ -45,11 +39,11 @@ func NewShadowCompressor(config Config) (derive.Compressor, error) {
 	}
 
 	var err error
-	c.compress, err = zlib.NewWriterLevel(&c.buf, zlib.BestCompression)
+	c.compressor, err = derive.NewChannelCompressor(config.CompressionAlgo)
 	if err != nil {
 		return nil, err
 	}
-	c.shadowCompress, err = zlib.NewWriterLevel(&c.shadowBuf, zlib.BestCompression)
+	c.shadowCompressor, err = derive.NewChannelCompressor(config.CompressionAlgo)
 	if err != nil {
 		return nil, err
 	}
@@ -62,57 +56,53 @@ func (t *ShadowCompressor) Write(p []byte) (int, error) {
 	if t.fullErr != nil {
 		return 0, t.fullErr
 	}
-	_, err := t.shadowCompress.Write(p)
+	_, err := t.shadowCompressor.Write(p)
 	if err != nil {
 		return 0, err
 	}
 	newBound := t.bound + uint64(len(p))
-	cap := t.config.TargetFrameSize * uint64(t.config.TargetNumFrames)
-	if newBound > cap {
+	if newBound > t.config.TargetOutputSize {
 		// Do not flush the buffer unless there's some chance we will be over the size limit.
 		// This reduces CPU but more importantly it makes the shadow compression ratio more
 		// closely reflect the ultimate compression ratio.
-		err = t.shadowCompress.Flush()
-		if err != nil {
+		if err = t.shadowCompressor.Flush(); err != nil {
 			return 0, err
 		}
-		newBound = uint64(t.shadowBuf.Len()) + 4 // + 4 is to account for the digest written on close()
-		if newBound > cap {
-			t.fullErr = derive.CompressorFullErr
+		newBound = uint64(t.shadowCompressor.Len()) + CloseOverheadZlib
+		if newBound > t.config.TargetOutputSize {
+			t.fullErr = derive.ErrCompressorFull
 			if t.Len() > 0 {
 				// only return an error if we've already written data to this compressor before
-				// (otherwise individual blocks over the target would never be written)
+				// (otherwise single blocks over the target would never be written)
 				return 0, t.fullErr
 			}
 		}
 	}
 	t.bound = newBound
-	return t.compress.Write(p)
+	return t.compressor.Write(p)
 }
 
 func (t *ShadowCompressor) Close() error {
-	return t.compress.Close()
+	return t.compressor.Close()
 }
 
 func (t *ShadowCompressor) Read(p []byte) (int, error) {
-	return t.buf.Read(p)
+	return t.compressor.Read(p)
 }
 
 func (t *ShadowCompressor) Reset() {
-	t.buf.Reset()
-	t.compress.Reset(&t.buf)
-	t.shadowBuf.Reset()
-	t.shadowCompress.Reset(&t.shadowBuf)
+	t.compressor.Reset()
+	t.shadowCompressor.Reset()
 	t.fullErr = nil
 	t.bound = safeCompressionOverhead
 }
 
 func (t *ShadowCompressor) Len() int {
-	return t.buf.Len()
+	return t.compressor.Len()
 }
 
 func (t *ShadowCompressor) Flush() error {
-	return t.compress.Flush()
+	return t.compressor.Flush()
 }
 
 func (t *ShadowCompressor) FullErr() error {
diff --git a/op-batcher/compressor/shadow_compressor_test.go b/op-batcher/compressor/shadow_compressor_test.go
index 3d5cdb26b4d9..c29daeaad322 100644
--- a/op-batcher/compressor/shadow_compressor_test.go
+++ b/op-batcher/compressor/shadow_compressor_test.go
@@ -11,55 +11,49 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
-var r *rand.Rand
+var r = rand.New(rand.NewSource(99))
 
-func init() {
-	r = rand.New(rand.NewSource(99))
-}
-
-func randomBytes(t *testing.T, length int) []byte {
+func randomBytes(length int) []byte {
 	b := make([]byte, length)
 	_, err := r.Read(b)
-	require.NoError(t, err)
+	// Rand.Read always returns nil error
+	if err != nil {
+		panic(err)
+	}
 	return b
 }
 
 func TestShadowCompressor(t *testing.T) {
 	tests := []struct {
-		name            string
-		targetFrameSize uint64
-		targetNumFrames int
-		data            [][]byte
-		errs            []error
-		fullErr         error
+		name             string
+		targetOutputSize uint64
+		data             [][]byte
+		errs             []error
+		fullErr          error
 	}{{
-		name:            "no data",
-		targetFrameSize: 1,
-		targetNumFrames: 1,
-		data:            [][]byte{},
-		errs:            []error{},
-		fullErr:         nil,
+		name:             "no data",
+		targetOutputSize: 1 + derive.FrameV0OverHeadSize,
+		data:             [][]byte{},
+		errs:             []error{},
+		fullErr:          nil,
 	}, {
-		name:            "large first block",
-		targetFrameSize: 1,
-		targetNumFrames: 1,
-		data:            [][]byte{bytes.Repeat([]byte{0}, 1024)},
-		errs:            []error{nil},
-		fullErr:         derive.CompressorFullErr,
+		name:             "large first block",
+		targetOutputSize: 1 + derive.FrameV0OverHeadSize,
+		data:             [][]byte{bytes.Repeat([]byte{0}, 1024)},
+		errs:             []error{nil},
+		fullErr:          derive.ErrCompressorFull,
 	}, {
-		name:            "large second block",
-		targetFrameSize: 1,
-		targetNumFrames: 1,
-		data:            [][]byte{bytes.Repeat([]byte{0}, 512), bytes.Repeat([]byte{0}, 1024)},
-		errs:            []error{nil, derive.CompressorFullErr},
-		fullErr:         derive.CompressorFullErr,
+		name:             "large second block",
+		targetOutputSize: 1 + derive.FrameV0OverHeadSize,
+		data:             [][]byte{bytes.Repeat([]byte{0}, 512), bytes.Repeat([]byte{0}, 1024)},
+		errs:             []error{nil, derive.ErrCompressorFull},
+		fullErr:          derive.ErrCompressorFull,
 	}, {
-		name:            "random data",
-		targetFrameSize: 1 << 17,
-		targetNumFrames: 1,
-		data:            [][]byte{randomBytes(t, (1<<17)-1000), randomBytes(t, 512), randomBytes(t, 512)},
-		errs:            []error{nil, nil, derive.CompressorFullErr},
-		fullErr:         derive.CompressorFullErr,
+		name:             "random data",
+		targetOutputSize: 1 << 17,
+		data:             [][]byte{randomBytes((1 << 17) - 1000), randomBytes(512), randomBytes(512)},
+		errs:             []error{nil, nil, derive.ErrCompressorFull},
+		fullErr:          derive.ErrCompressorFull,
 	}}
 	for _, test := range tests {
 		test := test
@@ -68,8 +62,8 @@ func TestShadowCompressor(t *testing.T) {
 			require.Equal(t, len(test.errs), len(test.data), "invalid test case: len(data) != len(errs)")
 
 			sc, err := NewShadowCompressor(Config{
-				TargetFrameSize: test.targetFrameSize,
-				TargetNumFrames: test.targetNumFrames,
+				TargetOutputSize: test.targetOutputSize,
+				CompressionAlgo:  derive.Zlib,
 			})
 			require.NoError(t, err)
 
@@ -118,22 +112,22 @@ func TestShadowCompressor(t *testing.T) {
 // TestBoundInaccruateForLargeRandomData documents where our bounding heuristic starts to fail
 // (writing at least 128k of random data)
 func TestBoundInaccurateForLargeRandomData(t *testing.T) {
-	var sizeLimit int = 1 << 17
+	const sizeLimit = 1 << 17
 
 	sc, err := NewShadowCompressor(Config{
-		TargetFrameSize: uint64(sizeLimit + 100),
-		TargetNumFrames: 1,
+		TargetOutputSize: sizeLimit + 100,
+		CompressionAlgo:  derive.Zlib,
 	})
 	require.NoError(t, err)
 
-	_, err = sc.Write(randomBytes(t, sizeLimit+1))
+	_, err = sc.Write(randomBytes(sizeLimit + 1))
 	require.NoError(t, err)
 	err = sc.Close()
 	require.NoError(t, err)
 	require.Greater(t, uint64(sc.Len()), sc.(*ShadowCompressor).bound)
 
 	sc.Reset()
-	_, err = sc.Write(randomBytes(t, sizeLimit))
+	_, err = sc.Write(randomBytes(sizeLimit))
 	require.NoError(t, err)
 	err = sc.Close()
 	require.NoError(t, err)
diff --git a/op-batcher/flags/flags.go b/op-batcher/flags/flags.go
index 1096323181c6..5aa833b75bf7 100644
--- a/op-batcher/flags/flags.go
+++ b/op-batcher/flags/flags.go
@@ -2,11 +2,14 @@ package flags
 
 import (
 	"fmt"
+	"slices"
+	"strings"
 	"time"
 
 	"github.com/urfave/cli/v2"
 
 	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
+	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	plasma "github.com/ethereum-optimism/optimism/op-plasma"
 	opservice "github.com/ethereum-optimism/optimism/op-service"
 	openum "github.com/ethereum-optimism/optimism/op-service/enum"
@@ -69,20 +72,54 @@ var (
 	}
 	MaxL1TxSizeBytesFlag = &cli.Uint64Flag{
 		Name:    "max-l1-tx-size-bytes",
-		Usage:   "The maximum size of a batch tx submitted to L1.",
-		Value:   120_000,
+		Usage:   "The maximum size of a batch tx submitted to L1. Ignored for blobs, where max blob size will be used.",
+		Value:   120_000, // will be overwritten to max for blob da-type
 		EnvVars: prefixEnvVars("MAX_L1_TX_SIZE_BYTES"),
 	}
+	TargetNumFramesFlag = &cli.IntFlag{
+		Name:    "target-num-frames",
+		Usage:   "The target number of frames to create per channel. Controls number of blobs per blob tx, if using Blob DA.",
+		Value:   1,
+		EnvVars: prefixEnvVars("TARGET_NUM_FRAMES"),
+	}
+	ApproxComprRatioFlag = &cli.Float64Flag{
+		Name:    "approx-compr-ratio",
+		Usage:   "The approximate compression ratio (<= 1.0). Only relevant for ratio compressor.",
+		Value:   0.6,
+		EnvVars: prefixEnvVars("APPROX_COMPR_RATIO"),
+	}
+	CompressorFlag = &cli.StringFlag{
+		Name:    "compressor",
+		Usage:   "The type of compressor. Valid options: " + strings.Join(compressor.KindKeys, ", "),
+		EnvVars: prefixEnvVars("COMPRESSOR"),
+		Value:   compressor.ShadowKind,
+		Action: func(_ *cli.Context, s string) error {
+			if !slices.Contains(compressor.KindKeys, s) {
+				return fmt.Errorf("unsupported compressor: %s", s)
+			}
+			return nil
+		},
+	}
+	CompressionAlgoFlag = &cli.GenericFlag{
+		Name:    "compression-algo",
+		Usage:   "The compression algorithm to use. Valid options: " + openum.EnumString(derive.CompressionAlgos),
+		EnvVars: prefixEnvVars("COMPRESSION_ALGO"),
+		Value: func() *derive.CompressionAlgo {
+			out := derive.Zlib
+			return &out
+		}(),
+	}
 	StoppedFlag = &cli.BoolFlag{
 		Name:    "stopped",
 		Usage:   "Initialize the batcher in a stopped state. The batcher can be started using the admin_startBatcher RPC",
 		EnvVars: prefixEnvVars("STOPPED"),
 	}
 	BatchTypeFlag = &cli.UintFlag{
-		Name:    "batch-type",
-		Usage:   "The batch type. 0 for SingularBatch and 1 for SpanBatch.",
-		Value:   0,
-		EnvVars: prefixEnvVars("BATCH_TYPE"),
+		Name:        "batch-type",
+		Usage:       "The batch type. 0 for SingularBatch and 1 for SpanBatch.",
+		Value:       0,
+		EnvVars:     prefixEnvVars("BATCH_TYPE"),
+		DefaultText: "singular",
 	}
 	DataAvailabilityTypeFlag = &cli.GenericFlag{
 		Name: "data-availability-type",
@@ -100,6 +137,20 @@ var (
 		Value:   2 * time.Minute,
 		EnvVars: prefixEnvVars("ACTIVE_SEQUENCER_CHECK_DURATION"),
 	}
+	CheckRecentTxsDepthFlag = &cli.IntFlag{
+		Name: "check-recent-txs-depth",
+		Usage: "Indicates how many blocks back the batcher should look during startup for a recent batch tx on L1. This can " +
+			"speed up waiting for node sync. It should be set to the verifier confirmation depth of the sequencer (e.g. 4).",
+		Value:   0,
+		EnvVars: prefixEnvVars("CHECK_RECENT_TXS_DEPTH"),
+	}
+	WaitNodeSyncFlag = &cli.BoolFlag{
+		Name: "wait-node-sync",
+		Usage: "Indicates if, during startup, the batcher should wait for a recent batcher tx on L1 to " +
+			"finalize (via more block confirmations). This should help avoid duplicate batcher txs.",
+		Value:   false,
+		EnvVars: prefixEnvVars("WAIT_NODE_SYNC"),
+	}
 	// Legacy Flags
 	SequencerHDPathFlag = txmgr.SequencerHDPathFlag
 )
@@ -111,16 +162,22 @@ var requiredFlags = []cli.Flag{
 }
 
 var optionalFlags = []cli.Flag{
+	WaitNodeSyncFlag,
+	CheckRecentTxsDepthFlag,
 	SubSafetyMarginFlag,
 	PollIntervalFlag,
 	MaxPendingTransactionsFlag,
 	MaxChannelDurationFlag,
 	MaxL1TxSizeBytesFlag,
+	TargetNumFramesFlag,
+	ApproxComprRatioFlag,
+	CompressorFlag,
 	StoppedFlag,
 	SequencerHDPathFlag,
 	BatchTypeFlag,
 	DataAvailabilityTypeFlag,
 	ActiveSequencerCheckDurationFlag,
+	CompressionAlgoFlag,
 }
 
 func init() {
@@ -129,7 +186,6 @@ func init() {
 	optionalFlags = append(optionalFlags, opmetrics.CLIFlags(EnvVarPrefix)...)
 	optionalFlags = append(optionalFlags, oppprof.CLIFlags(EnvVarPrefix)...)
 	optionalFlags = append(optionalFlags, txmgr.CLIFlags(EnvVarPrefix)...)
-	optionalFlags = append(optionalFlags, compressor.CLIFlags(EnvVarPrefix)...)
 	optionalFlags = append(optionalFlags, plasma.CLIFlags(EnvVarPrefix, "")...)
 
 	Flags = append(requiredFlags, optionalFlags...)
diff --git a/op-batcher/metrics/metrics.go b/op-batcher/metrics/metrics.go
index 25cef0ec405f..417f927ee6f6 100644
--- a/op-batcher/metrics/metrics.go
+++ b/op-batcher/metrics/metrics.go
@@ -188,8 +188,8 @@ func NewMetrics(procName string) *Metrics {
 		blobUsedBytes: factory.NewHistogram(prometheus.HistogramOpts{
 			Namespace: ns,
 			Name:      "blob_used_bytes",
-			Help:      "Blob size in bytes being submitted.",
-			Buckets:   prometheus.LinearBuckets(0.0, eth.MaxBlobDataSize/13, 13),
+			Help:      "Blob size in bytes (of last blob only for multi-blob txs).",
+			Buckets:   prometheus.LinearBuckets(0.0, eth.MaxBlobDataSize/13, 14),
 		}),
 
 		batcherTxEvs: opmetrics.NewEventVec(factory, ns, "", "batcher_tx", "BatcherTx", []string{"stage"}),
diff --git a/op-bindings-e2e/Makefile b/op-bindings-e2e/Makefile
deleted file mode 100644
index d04035b19735..000000000000
--- a/op-bindings-e2e/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-test-bindgen-e2e:
-	go test ./... -count=1
\ No newline at end of file
diff --git a/op-bindings-e2e/fixtures_bytecode_test.go b/op-bindings-e2e/fixtures_bytecode_test.go
deleted file mode 100644
index 7360dda6b020..000000000000
--- a/op-bindings-e2e/fixtures_bytecode_test.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package bindgen
-
-const Safe_v130InitBytecode = "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5060016004819055506159ae80620000296000396000f3fe6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c63430007060033"
-const Safe_v130InitBytecodeNoSalt = "608060405234801561001057600080fd5b5060016004819055506159ae80620000296000396000f3fe6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c63430007060033"
-const Safe_v130DeployedBytecode = "0x6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c63430007060033"
-
-const Permit2InitBytecode = "0x0000000000000000000000000000000000000000d3af2663da51c1021500000060c0346100bb574660a052602081017f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a60408301524660608301523060808301526080825260a082019180831060018060401b038411176100a557826040525190206080526123c090816100c1823960805181611b47015260a05181611b210152f35b634e487b7160e01b600052604160045260246000fd5b600080fdfe6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000000003611b69577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a"
-const Permit2InitBytecodeNoSalt = "60c0346100bb574660a052602081017f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a60408301524660608301523060808301526080825260a082019180831060018060401b038411176100a557826040525190206080526123c090816100c1823960805181611b47015260a05181611b210152f35b634e487b7160e01b600052604160045260246000fd5b600080fdfe6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000000003611b69577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a"
-const Permit2Abi = "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"AllowanceExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExcessiveInvalidation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidContractSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LengthMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"signatureDeadline\",\"type\":\"uint256\"}],\"name\":\"SignatureExpired\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"Lockdown\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"newNonce\",\"type\":\"uint48\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"oldNonce\",\"type\":\"uint48\"}],\"name\":\"NonceInvalidation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"nonce\",\"type\":\"uint48\"}],\"name\":\"Permit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"word\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"mask\",\"type\":\"uint256\"}],\"name\":\"UnorderedNonceInvalidation\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"nonce\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"newNonce\",\"type\":\"uint48\"}],\"name\":\"invalidateNonces\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"wordPos\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mask\",\"type\":\"uint256\"}],\"name\":\"invalidateUnorderedNonces\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"internalType\":\"struct IAllowanceTransfer.TokenSpenderPair[]\",\"name\":\"approvals\",\"type\":\"tuple[]\"}],\"name\":\"lockdown\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"nonceBitmap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"nonce\",\"type\":\"uint48\"}],\"internalType\":\"struct IAllowanceTransfer.PermitDetails[]\",\"name\":\"details\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"sigDeadline\",\"type\":\"uint256\"}],\"internalType\":\"struct IAllowanceTransfer.PermitBatch\",\"name\":\"permitBatch\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"nonce\",\"type\":\"uint48\"}],\"internalType\":\"struct IAllowanceTransfer.PermitDetails\",\"name\":\"details\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"sigDeadline\",\"type\":\"uint256\"}],\"internalType\":\"struct IAllowanceTransfer.PermitSingle\",\"name\":\"permitSingle\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.TokenPermissions\",\"name\":\"permitted\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.PermitTransferFrom\",\"name\":\"permit\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"requestedAmount\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.SignatureTransferDetails\",\"name\":\"transferDetails\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"permitTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.TokenPermissions[]\",\"name\":\"permitted\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.PermitBatchTransferFrom\",\"name\":\"permit\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"requestedAmount\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.SignatureTransferDetails[]\",\"name\":\"transferDetails\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"permitTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.TokenPermissions\",\"name\":\"permitted\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.PermitTransferFrom\",\"name\":\"permit\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"requestedAmount\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.SignatureTransferDetails\",\"name\":\"transferDetails\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"witness\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"witnessTypeString\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"permitWitnessTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.TokenPermissions[]\",\"name\":\"permitted\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.PermitBatchTransferFrom\",\"name\":\"permit\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"requestedAmount\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureTransfer.SignatureTransferDetails[]\",\"name\":\"transferDetails\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"witness\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"witnessTypeString\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"permitWitnessTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"struct IAllowanceTransfer.AllowanceTransferDetails[]\",\"name\":\"transferDetails\",\"type\":\"tuple[]\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"
-const Permit2DeployedBytecode = "0x6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000000103611b69577f866a5aba21966af95d6c7ab78eb2b2fc913915c28be3b9aa07cc04ff903e3f2890565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a"
-
-const MultiCall3Abi = "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"returnData\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowFailure\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall3.Call3[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate3\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowFailure\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall3.Call3Value[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate3Value\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"blockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBasefee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"basefee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"chainid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockCoinbase\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"difficulty\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"gaslimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getEthBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryAggregate\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryBlockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Multicall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}]"
-const MultiCall3DeployedBytecode = "0x6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033"
-const MultiCall3InitBytecode = "0x608060405234801561001057600080fd5b50610ee0806100206000396000f3fe6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033"
-
-const SafeSingletonFactoryDeployedBytecode = "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"
-const SafeSingletonFactoryInitBytecode = "0x604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"
-
-const Create2DeployerInitBytecode = "0x608060405234801561001057600080fd5b50610630806100206000396000f3fe6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033"
-const Create2DeployerDeployedBytecode = "0x6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033"
diff --git a/op-bindings-e2e/fixtures_test.go b/op-bindings-e2e/fixtures_test.go
deleted file mode 100644
index f4e7cc30cf5e..000000000000
--- a/op-bindings-e2e/fixtures_test.go
+++ /dev/null
@@ -1,541 +0,0 @@
-package bindgen
-
-import (
-	"github.com/ethereum-optimism/optimism/op-bindings/bindgen"
-	"github.com/ethereum-optimism/optimism/op-bindings/etherscan"
-	"github.com/ethereum/go-ethereum/common"
-)
-
-var fetchContractDataTests = []struct {
-	name                 string
-	contractVerified     bool
-	chain                string
-	deploymentAddress    string
-	expectedContractData bindgen.ContractData
-}{
-	{
-		"MultiCall3 on ETH",
-		true,
-		"eth",
-		"0xcA11bde05977b3631167028862bE2a173976CA11",
-		bindgen.ContractData{
-			Abi:         MultiCall3Abi,
-			DeployedBin: MultiCall3DeployedBytecode,
-			DeploymentTx: etherscan.Transaction{
-				Input: MultiCall3InitBytecode,
-				Hash:  "0x00d9fcb7848f6f6b0aae4fb709c133d69262b902156c85a473ef23faa60760bd",
-				To:    "",
-			},
-		},
-	},
-	{
-		"MultiCall3 on OP",
-		true,
-		"op",
-		"0xcA11bde05977b3631167028862bE2a173976CA11",
-		bindgen.ContractData{
-			Abi:         MultiCall3Abi,
-			DeployedBin: MultiCall3DeployedBytecode,
-			DeploymentTx: etherscan.Transaction{
-				Input: MultiCall3InitBytecode,
-				Hash:  "0xb62f9191a2cf399c0d2afd33f5b8baf7c6b52af6dd2386e44121b1bab91b80e5",
-				To:    "",
-			},
-		},
-	},
-	{
-		"SafeSingletonFactory on ETH",
-		false,
-		"eth",
-		"0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7",
-		bindgen.ContractData{
-			Abi:         "",
-			DeployedBin: SafeSingletonFactoryDeployedBytecode,
-			DeploymentTx: etherscan.Transaction{
-				Input: SafeSingletonFactoryInitBytecode,
-				Hash:  "0x69c275b5304db980105b7a6d731f9e1157a3fe29e7ff6ff95235297df53e9928",
-				To:    "",
-			},
-		},
-	},
-	{
-		"Permit2 on ETH",
-		true,
-		"eth",
-		"0x000000000022D473030F116dDEE9F6B43aC78BA3",
-		bindgen.ContractData{
-			Abi:         Permit2Abi,
-			DeployedBin: Permit2DeployedBytecode,
-			DeploymentTx: etherscan.Transaction{
-				Input: Permit2InitBytecode,
-				Hash:  "0xf2f1fe96c16ee674bb7fcee166be52465a418927d124f5f1d231b36eae65d377",
-				To:    "0x4e59b44847b379578588920ca78fbf26c0b4956c",
-			},
-		},
-	},
-}
-
-// Not currently being tested due to complexity of test setup:
-//   - FetchDeploymentTxHash failure
-//     Not being tested because the contract would need to have deployed bytecode to
-//     pass FetchDeployedBytecode, which means Etherscan should have indexed the deployment tx
-//   - FetchDeploymentTx failure
-//     Not being tested for the same reason and there would be no way to pass FetchDeploymentTxHash,
-//     but not be able to retrieve tx details
-var fetchContractDataTestsFailures = []struct {
-	name              string
-	contractVerified  bool
-	chain             string
-	deploymentAddress string
-	expectedError     string
-}{
-	{
-		"MultiCall3 on Foo",
-		true,
-		"foo",
-		"0xcA11bde05977b3631167028862bE2a173976CA11",
-		"unknown chain, unable to retrieve a contract data client for chain: foo",
-	},
-	{
-		// This test case is covering fetching an ABI for a non-verified contract that's we're saying is verified
-		"SafeSingletonFactory on ETH",
-		true,
-		"eth",
-		"0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7",
-		"error fetching ABI: operation failed permanently after 3 attempts: there was an issue with the Etherscan request",
-	},
-	{
-		// This test case is covering fetching the deployed bytecode for a non-existent contract
-		"Nonexistent on ETH",
-		false,
-		"eth",
-		"0x914d7Fec6aaC8cd542e72Bca78B30650d455555",
-		"error fetching deployed bytecode: API response result is not expected bytecode string",
-	},
-}
-
-var compareInitBytecodeWithOpTests = []struct {
-	name                string
-	contractMetadataEth bindgen.RemoteContractMetadata
-	initCodeShouldMatch bool
-}{
-	{
-		name: "Safe_v130 Init Bytecode Should Match",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.HexToAddress("0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552"),
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     Safe_v130InitBytecodeNoSalt,
-			DeployedBin: "",
-		},
-		initCodeShouldMatch: true,
-	},
-	{
-		name: "Safe_v130 Compare Init Bytecode Only On OP",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     Safe_v130InitBytecodeNoSalt,
-			DeployedBin: "",
-		},
-		initCodeShouldMatch: true,
-	},
-	{
-		name: "Create2Deployer's Init Bytecode Should Not Match",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Create2Deployer",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.HexToAddress("0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2"),
-					Eth: common.HexToAddress("0xF49600926c7109BD66Ab97a2c036bf696e58Dbc2"),
-				},
-				Deployer:     common.Address{},
-				ABI:          "",
-				InitBytecode: "",
-			},
-			Package:     "bindings",
-			InitBin:     Create2DeployerInitBytecode,
-			DeployedBin: Create2DeployerDeployedBytecode,
-		},
-		initCodeShouldMatch: false,
-	},
-}
-
-var compareInitBytecodeWithOpTestsFailures = []struct {
-	name                string
-	contractMetadataEth bindgen.RemoteContractMetadata
-	initCodeShouldMatch bool
-	expectedError       string
-}{
-	{
-		name: "Safe_v130 Mismatch Init Bytecode",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.HexToAddress("0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552"),
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     Permit2InitBytecodeNoSalt,
-			DeployedBin: "",
-		},
-		initCodeShouldMatch: true,
-		expectedError:       "expected initialization bytecode to match on Ethereum and Optimism, but it doesn't.",
-	},
-	{
-		name: "Safe_v130 No Deployment on Optimism",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     Safe_v130InitBytecode,
-			DeployedBin: Safe_v130DeployedBytecode,
-		},
-		initCodeShouldMatch: true,
-		expectedError:       "no deployment address on Optimism provided for Safe_v130",
-	},
-	{
-		name: "MultiCall3 Expected Init Code Not to Match, but it Does",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "MultiCall3",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.HexToAddress("0xcA11bde05977b3631167028862bE2a173976CA11"),
-					Eth: common.HexToAddress("0xcA11bde05977b3631167028862bE2a173976CA11"),
-				},
-				Deployer:     common.Address{},
-				ABI:          "",
-				InitBytecode: "",
-			},
-			Package:     "bindings",
-			InitBin:     MultiCall3InitBytecode,
-			DeployedBin: MultiCall3DeployedBytecode,
-		},
-		initCodeShouldMatch: false,
-		expectedError:       "expected initialization bytecode on Ethereum to not match on Optimism, but it did.",
-	},
-	{
-		name: "Safe_v130 No Init Bytecode Provided",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.HexToAddress("0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552"),
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     "",
-			DeployedBin: Safe_v130DeployedBytecode,
-		},
-		initCodeShouldMatch: false,
-		expectedError:       "no initialization bytecode provided for ETH deployment for comparison",
-	},
-}
-
-var compareDeployedBytecodeWithOpTests = []struct {
-	name                    string
-	contractMetadataEth     bindgen.RemoteContractMetadata
-	deployedCodeShouldMatch bool
-}{
-	{
-		name: "Safe_v130 Deployed Bytecode Should Match",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.HexToAddress("0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552"),
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     "",
-			DeployedBin: Safe_v130DeployedBytecode,
-		},
-		deployedCodeShouldMatch: true,
-	},
-	{
-		name: "Safe_v130 Compare Deployed Bytecode Only On OP",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     Safe_v130InitBytecodeNoSalt,
-			DeployedBin: Safe_v130DeployedBytecode,
-		},
-		deployedCodeShouldMatch: true,
-	},
-	{
-		name: "Permit2's Deployed Bytecode Should Not Match",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Permit2",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.HexToAddress("0x000000000022D473030F116dDEE9F6B43aC78BA3"),
-					Eth: common.HexToAddress("0x000000000022D473030F116dDEE9F6B43aC78BA3"),
-				},
-				Deployer:     common.Address{},
-				ABI:          "",
-				InitBytecode: "",
-			},
-			Package:     "bindings",
-			InitBin:     Permit2InitBytecode,
-			DeployedBin: Permit2DeployedBytecode,
-		},
-		deployedCodeShouldMatch: false,
-	},
-}
-
-var compareDeployedBytecodeWithOpTestsFailures = []struct {
-	name                    string
-	contractMetadataEth     bindgen.RemoteContractMetadata
-	deployedCodeShouldMatch bool
-	expectedError           string
-}{
-	{
-		name: "Safe_v130 Mismatch Deplolyed Bytecode",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.HexToAddress("0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552"),
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     "",
-			DeployedBin: Permit2DeployedBytecode,
-		},
-		deployedCodeShouldMatch: true,
-		expectedError:           "expected deployed bytecode to match on Ethereum and Optimism, but it doesn't.",
-	},
-	{
-		name: "Safe_v130 No Deployment on Optimism",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     "",
-			DeployedBin: Permit2DeployedBytecode,
-		},
-		deployedCodeShouldMatch: true,
-		expectedError:           "no deployment address on Optimism provided for Safe_v130",
-	},
-	{
-		name: "Safe_v130 Expected Deployed Code Not to Match, but it Does",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.HexToAddress("0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552"),
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     Safe_v130InitBytecode,
-			DeployedBin: Safe_v130DeployedBytecode,
-		},
-		deployedCodeShouldMatch: false,
-		expectedError:           "expected deployed bytecode on Ethereum to not match on Optimism, but it does.",
-	},
-	{
-		name: "Safe_v130 No Deployed Bytecode Provided",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.HexToAddress("0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552"),
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     Safe_v130InitBytecode,
-			DeployedBin: "",
-		},
-		deployedCodeShouldMatch: false,
-		expectedError:           "no deployed bytecode provided for ETH deployment for comparison",
-	},
-}
-
-var compareDeployedBytecodeWithRpcTests = []struct {
-	name                string
-	contractMetadataEth bindgen.RemoteContractMetadata
-	chain               string
-}{
-	{
-		name: "Safe_v130 Compare Against ETH",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.Address{},
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     "",
-			DeployedBin: Safe_v130DeployedBytecode,
-		},
-		chain: "eth",
-	},
-	{
-		name: "Safe_v130 Compare Against OP",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.HexToAddress("0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552"),
-					Eth: common.Address{},
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     "",
-			DeployedBin: Safe_v130DeployedBytecode,
-		},
-		chain: "op",
-	},
-}
-
-var compareDeployedBytecodeWithRpcTestsFailures = []struct {
-	name                string
-	contractMetadataEth bindgen.RemoteContractMetadata
-	chain               string
-	expectedError       string
-}{
-	{
-		name: "Safe_v130 Compare Against foo",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.Address{},
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     "",
-			DeployedBin: "",
-		},
-		chain:         "foo",
-		expectedError: "unknown chain: foo, unable to retrieve a RPC client",
-	},
-	{
-		name: "Safe_v130 Bytecode Mismatch",
-		contractMetadataEth: bindgen.RemoteContractMetadata{
-			RemoteContract: bindgen.RemoteContract{
-				Name:     "Safe_v130",
-				Verified: true,
-				Deployments: bindgen.Deployments{
-					Op:  common.Address{},
-					Eth: common.HexToAddress("0x69f4D1788e39c87893C980c06EdF4b7f686e2938"),
-				},
-				DeploymentSalt: "0000000000000000000000000000000000000000000000000000000000000000",
-				Deployer:       common.Address{},
-				ABI:            "",
-				InitBytecode:   "",
-			},
-			Package:     "bindings",
-			InitBin:     "",
-			DeployedBin: Permit2DeployedBytecode,
-		},
-		chain:         "eth",
-		expectedError: "Safe_v130 deployment bytecode from RPC doesn't match bytecode from Etherscan.",
-	},
-}
diff --git a/op-bindings-e2e/remote_handlers_test.go b/op-bindings-e2e/remote_handlers_test.go
deleted file mode 100644
index b476b9381696..000000000000
--- a/op-bindings-e2e/remote_handlers_test.go
+++ /dev/null
@@ -1,177 +0,0 @@
-package bindgen
-
-import (
-	"fmt"
-	"os"
-	"reflect"
-	"strings"
-	"testing"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindgen"
-	"github.com/ethereum-optimism/optimism/op-bindings/etherscan"
-	"github.com/ethereum/go-ethereum/ethclient"
-)
-
-var generator bindgen.BindGenGeneratorRemote = bindgen.BindGenGeneratorRemote{}
-
-func configureGenerator(t *testing.T) error {
-	generator.ContractDataClients.Eth = etherscan.NewEthereumClient(os.Getenv("ETHERSCAN_APIKEY_ETH"))
-	generator.ContractDataClients.Op = etherscan.NewOptimismClient(os.Getenv("ETHERSCAN_APIKEY_OP"))
-
-	var err error
-	if generator.RpcClients.Eth, err = ethclient.Dial(os.Getenv("RPC_URL_ETH")); err != nil {
-		return fmt.Errorf("error initializing Ethereum client: %w", err)
-	}
-	if generator.RpcClients.Op, err = ethclient.Dial(os.Getenv("RPC_URL_OP")); err != nil {
-		return fmt.Errorf("error initializing Optimism client: %w", err)
-	}
-
-	return nil
-}
-
-func TestFetchContractData(t *testing.T) {
-	if err := configureGenerator(t); err != nil {
-		t.Error(err)
-	}
-
-	for _, tt := range fetchContractDataTests {
-		t.Run(tt.name, func(t *testing.T) {
-			contractData, err := generator.FetchContractData(tt.contractVerified, tt.chain, tt.deploymentAddress)
-			if err != nil {
-				t.Error(err)
-			}
-			if !reflect.DeepEqual(contractData, tt.expectedContractData) {
-				t.Errorf("Retrieved contract data doesn't match expected. Expected: %s Retrieved: %s", tt.expectedContractData, contractData)
-			}
-		})
-	}
-}
-
-func TestFetchContractDataFailures(t *testing.T) {
-	if err := configureGenerator(t); err != nil {
-		t.Error(err)
-	}
-
-	for _, tt := range fetchContractDataTestsFailures {
-		t.Run(tt.name, func(t *testing.T) {
-			_, err := generator.FetchContractData(tt.contractVerified, tt.chain, tt.deploymentAddress)
-			if err == nil {
-				t.Errorf("Expected error: %s but didn't receive it", tt.expectedError)
-				return
-			}
-
-			if !strings.Contains(err.Error(), tt.expectedError) {
-				t.Errorf("Expected error: %s Received: %s", tt.expectedError, err)
-				return
-			}
-		})
-	}
-}
-
-func TestCompareInitBytecodeWithOp(t *testing.T) {
-	if err := configureGenerator(t); err != nil {
-		t.Error(err)
-	}
-
-	for _, tt := range compareInitBytecodeWithOpTests {
-		t.Run(tt.name, func(t *testing.T) {
-			err := generator.CompareInitBytecodeWithOp(&tt.contractMetadataEth, tt.initCodeShouldMatch)
-			if err != nil {
-				t.Error(err)
-			}
-		})
-	}
-}
-
-func TestCompareInitBytecodeWithOpFailures(t *testing.T) {
-	if err := configureGenerator(t); err != nil {
-		t.Error(err)
-	}
-
-	for _, tt := range compareInitBytecodeWithOpTestsFailures {
-		t.Run(tt.name, func(t *testing.T) {
-			err := generator.CompareInitBytecodeWithOp(&tt.contractMetadataEth, tt.initCodeShouldMatch)
-			if err == nil {
-				t.Errorf("Expected error: %s but didn't receive it", tt.expectedError)
-				return
-			}
-
-			if !strings.Contains(err.Error(), tt.expectedError) {
-				t.Errorf("Expected error: %s Received: %s", tt.expectedError, err)
-				return
-			}
-		})
-	}
-}
-
-func TestCompareDeployedBytecodeWithOp(t *testing.T) {
-	if err := configureGenerator(t); err != nil {
-		t.Error(err)
-	}
-
-	for _, tt := range compareDeployedBytecodeWithOpTests {
-		t.Run(tt.name, func(t *testing.T) {
-			err := generator.CompareDeployedBytecodeWithOp(&tt.contractMetadataEth, tt.deployedCodeShouldMatch)
-			if err != nil {
-				t.Error(err)
-			}
-		})
-	}
-}
-
-func TestCompareDeployedBytecodeWithOpFailures(t *testing.T) {
-	if err := configureGenerator(t); err != nil {
-		t.Error(err)
-	}
-
-	for _, tt := range compareDeployedBytecodeWithOpTestsFailures {
-		t.Run(tt.name, func(t *testing.T) {
-			err := generator.CompareDeployedBytecodeWithOp(&tt.contractMetadataEth, tt.deployedCodeShouldMatch)
-			if err == nil {
-				t.Errorf("Expected error: %s but didn't receive it", tt.expectedError)
-				return
-			}
-
-			if !strings.Contains(err.Error(), tt.expectedError) {
-				t.Errorf("Expected error: %s Received: %s", tt.expectedError, err)
-				return
-			}
-		})
-	}
-}
-
-func TestCompareDeployedBytecodeWithRpc(t *testing.T) {
-	if err := configureGenerator(t); err != nil {
-		t.Error(err)
-	}
-
-	for _, tt := range compareDeployedBytecodeWithRpcTests {
-		t.Run(tt.name, func(t *testing.T) {
-			err := generator.CompareDeployedBytecodeWithRpc(&tt.contractMetadataEth, tt.chain)
-			if err != nil {
-				t.Error(err)
-			}
-		})
-	}
-}
-
-func TestCompareDeployedBytecodeWithRpcFailures(t *testing.T) {
-	if err := configureGenerator(t); err != nil {
-		t.Error(err)
-	}
-
-	for _, tt := range compareDeployedBytecodeWithRpcTestsFailures {
-		t.Run(tt.name, func(t *testing.T) {
-			err := generator.CompareDeployedBytecodeWithRpc(&tt.contractMetadataEth, tt.chain)
-			if err == nil {
-				t.Errorf("Expected error: %s but didn't receive it", tt.expectedError)
-				return
-			}
-
-			if !strings.Contains(err.Error(), tt.expectedError) {
-				t.Errorf("Expected error: %s Received: %s", tt.expectedError, err)
-				return
-			}
-		})
-	}
-}
diff --git a/op-bindings/Makefile b/op-bindings/Makefile
deleted file mode 100644
index 7066489f6a20..000000000000
--- a/op-bindings/Makefile
+++ /dev/null
@@ -1,94 +0,0 @@
-SHELL := /usr/bin/env bash
-
-pkg := bindings
-pkg-preview := bindingspreview
-monorepo-base := $(shell dirname $(realpath .))
-contracts-dir := $(monorepo-base)/packages/contracts-bedrock
-contracts-list := ./artifacts.json
-contracts-list-preview := ./artifacts-preview.json
-log-level := info
-ETHERSCAN_APIKEY_ETH ?=
-ETHERSCAN_APIKEY_OP ?=
-RPC_URL_ETH ?=
-RPC_URL_OP ?=
-
-all: version mkdir bindings
-
-version:
-	forge --version
-	abigen --version
-
-compile:
-	cd $(contracts-dir) && \
-		forge clean && \
-		pnpm build
-
-bindings: bindgen-local bindgen-preview
-
-bindings-build: bindgen-generate-local bindgen-generate-preview
-
-bindgen: compile bindgen-generate-all
-
-bindgen-generate-all:
-	go run ./cmd/ \
-		generate \
-		--metadata-out ./$(pkg) \
-		--bindings-package $(pkg) \
-		--contracts-list $(contracts-list) \
-		--log.level $(log-level) \
-		all \
-		--forge-artifacts $(contracts-dir)/forge-artifacts \
-		--etherscan.apikey.eth $(ETHERSCAN_APIKEY_ETH) \
-		--etherscan.apikey.op $(ETHERSCAN_APIKEY_OP) \
-		--rpc.url.eth $(RPC_URL_ETH) \
-		--rpc.url.op $(RPC_URL_OP)
-
-bindgen-local: compile bindgen-generate-local
-
-bindgen-generate-local:
-	go run ./cmd/ \
-		generate \
-		--metadata-out ./$(pkg) \
-		--bindings-package $(pkg) \
-		--contracts-list $(contracts-list) \
-		--log.level $(log-level) \
-		local \
-		--forge-artifacts $(contracts-dir)/forge-artifacts
-
-bindgen-preview: compile bindgen-generate-preview
-
-bindgen-generate-preview:
-	go run ./cmd \
-		generate \
-		--metadata-out ./$(pkg-preview) \
-		--bindings-package $(pkg-preview) \
-		--contracts-list $(contracts-list-preview) \
-		--log.level $(log-level) \
-		local \
-		--forge-artifacts $(contracts-dir)/forge-artifacts
-
-bindgen-remote:
-	go run ./cmd/ \
-		generate \
-		--metadata-out ./$(pkg) \
-		--bindings-package $(pkg) \
-		--contracts-list $(contracts-list) \
-		--log.level $(log-level) \
-		remote \
-		--etherscan.apikey.eth $(ETHERSCAN_APIKEY_ETH) \
-		--etherscan.apikey.op $(ETHERSCAN_APIKEY_OP) \
-		--rpc.url.eth $(RPC_URL_ETH) \
-		--rpc.url.op $(RPC_URL_OP)
-
-mkdir:
-	mkdir -p $(pkg)
-
-clean-contracts:
-	cd $(contracts-dir) && \
-		pnpm clean
-
-clean:
-	rm -rf $(pkg)
-
-test:
-	go test ./...
diff --git a/op-bindings/README.md b/op-bindings/README.md
deleted file mode 100644
index d765c620cc12..000000000000
--- a/op-bindings/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# op-bindings
-
-This package contains built go bindings of the smart contracts. It must be
-updated after any changes to the smart contracts to ensure that the bindings are
-up to date.
-
-The bindings include the bytecode for each contract so that go based tests
-can deploy the contracts. There are also `more` files that include the deployed
-bytecode as well as the storage layout. These are used to dynamically set
-bytecode and storage slots in state.
-
-## Usage
-
-```bash
-make
-```
-
-## Dependencies
-
-- `abigen` version 1.10.25
-- `make`
-
-To check the version of `abigen`, run the command `abigen --version`.
-
-## abigen
-
-The `abigen` tool is part of `go-ethereum` and can be used to build go bindings
-for smart contracts. It can be installed with go using the commands:
-
-```bash
-$ go get -u github.com/ethereum/go-ethereum
-$ cd $GOPATH/src/github.com/ethereum/go-ethereum/
-$ make devtools
-```
-
-The geth docs for `abigen` can be found [here](https://geth.ethereum.org/docs/dapp/native-bindings).
-
-## See also
-
-TypeScript bindings are also generated in [@eth-optimism/contracts-ts](../packages/contracts-ts/)
diff --git a/op-bindings/artifacts-preview.json b/op-bindings/artifacts-preview.json
deleted file mode 100644
index 9d1630f96d2f..000000000000
--- a/op-bindings/artifacts-preview.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "local": [
-    "OptimismPortal2"
-  ],
-  "remote": []
-}
diff --git a/op-bindings/artifacts.json b/op-bindings/artifacts.json
deleted file mode 100644
index ec22fbc34b75..000000000000
--- a/op-bindings/artifacts.json
+++ /dev/null
@@ -1,148 +0,0 @@
-{
-  "local": [
-    "SystemConfig",
-    "L1CrossDomainMessenger",
-    "L1StandardBridge",
-    "OptimismPortal",
-    "L2OutputOracle",
-    "AddressManager",
-    "L1Block",
-    "L2ToL1MessagePasser",
-    "GasPriceOracle",
-    "L2CrossDomainMessenger",
-    "L2StandardBridge",
-    "L2ERC721Bridge",
-    "L1ERC721Bridge",
-    "OptimismMintableERC721Factory",
-    "SequencerFeeVault",
-    "BaseFeeVault",
-    "L1FeeVault",
-    "OptimismMintableERC20Factory",
-    "OptimismMintableERC20",
-    "Proxy",
-    "ProxyAdmin",
-    "LegacyMessagePasser",
-    "ERC20",
-    "WETH9",
-    "DeployerWhitelist",
-    "L1BlockNumber",
-    "DelayedWETH",
-    "DisputeGameFactory",
-    "FaultDisputeGame",
-    "AlphabetVM",
-    "StandardBridge",
-    "CrossDomainMessenger",
-    "MIPS",
-    "PreimageOracle",
-    "EAS",
-    "SchemaRegistry",
-    "ProtocolVersions",
-    "Safe",
-    "SafeProxyFactory",
-    "DelayedVetoable",
-    "ISemver",
-    "StorageSetter",
-    "SuperchainConfig",
-    "DataAvailabilityChallenge"
-  ],
-  "remote": [
-    {
-      "name": "MultiCall3",
-      "verified": true,
-      "deployments": {
-        "eth": "0xcA11bde05977b3631167028862bE2a173976CA11",
-        "op": "0xcA11bde05977b3631167028862bE2a173976CA11"
-      }
-    },
-    {
-      "name": "Create2Deployer",
-      "verified": true,
-      "deployments": {
-        "eth": "0xF49600926c7109BD66Ab97a2c036bf696e58Dbc2",
-        "op": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2"
-      }
-    },
-    {
-      "name": "Safe_v130",
-      "verified": true,
-      "deployments": {
-        "eth": "0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552",
-        "op": "0x69f4D1788e39c87893C980c06EdF4b7f686e2938"
-      },
-      "deploymentSalt": "0000000000000000000000000000000000000000000000000000000000000000"
-    },
-    {
-      "name": "SafeL2_v130",
-      "verified": true,
-      "deployments": {
-        "eth": "0x3E5c63644E683549055b9Be8653de26E0B4CD36E",
-        "op": "0xfb1bffC9d739B8D520DaF37dF666da4C687191EA"
-      },
-      "deploymentSalt": "0000000000000000000000000000000000000000000000000000000000000000"
-    },
-    {
-      "name": "MultiSendCallOnly_v130",
-      "verified": true,
-      "deployments": {
-        "eth": "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D",
-        "op": "0xA1dabEF33b3B82c7814B6D82A79e50F4AC44102B"
-      },
-      "deploymentSalt": "0000000000000000000000000000000000000000000000000000000000000000"
-    },
-    {
-      "name": "SafeSingletonFactory",
-      "verified": false,
-      "deployments": {
-        "eth": "0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7",
-        "op": "0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7"
-      },
-      "abi": "[{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\",\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"creationCode\",\"type\":\"bytes\"}]}]"
-    },
-    {
-      "name": "DeterministicDeploymentProxy",
-      "verified": false,
-      "deployments": {
-        "eth": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
-        "op": "0x4e59b44847b379578588920cA78FbF26c0B4956C"
-      },
-      "abi": "[{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\",\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"creationCode\",\"type\":\"bytes\"}]}]"
-    },
-    {
-      "name": "MultiSend_v130",
-      "verified": true,
-      "deployments": {
-        "op": "0x998739BFdAAdde7C933B942a68053933098f9EDa"
-      },
-      "deploymentSalt": "0000000000000000000000000000000000000000000000000000000000000000"
-    },
-    {
-      "name": "Permit2",
-      "verified": true,
-      "deployments": {
-        "eth": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
-        "op": "0x000000000022D473030F116dDEE9F6B43aC78BA3"
-      },
-      "deploymentSalt": "0000000000000000000000000000000000000000d3af2663da51c10215000000",
-      "deployer": "0x4e59b44847b379578588920cA78FbF26c0B4956C"
-    },
-    {
-      "name": "SenderCreator",
-      "verified": false,
-      "deployments": {
-        "eth": "0x7fc98430eaedbb6070b35b39d798725049088348",
-        "op": "0x7fc98430eaedbb6070b35b39d798725049088348"
-      },
-      "initBytecode": "0x6080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033",
-      "abi": "[{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"initCode\",\"type\": \"bytes\"}],\"name\": \"createSender\",\"outputs\": [{\"internalType\": \"address\",\"name\": \"sender\",\"type\": \"address\"}],\"stateMutability\": \"nonpayable\",\"type\": \"function\"}]"
-    },
-    {
-      "name": "EntryPoint",
-      "verified": true,
-      "deployments": {
-        "eth": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
-        "op": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"
-      },
-      "deploymentSalt": "0000000000000000000000000000000000000000000000000000000000000000"
-    }
-  ]
-}
diff --git a/op-bindings/ast/canonicalize.go b/op-bindings/ast/canonicalize.go
deleted file mode 100644
index eae1a431b428..000000000000
--- a/op-bindings/ast/canonicalize.go
+++ /dev/null
@@ -1,143 +0,0 @@
-package ast
-
-import (
-	"path/filepath"
-	"regexp"
-	"sort"
-	"strconv"
-	"strings"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-var remapTypeRe = regexp.MustCompile(`^(t_[\w_]+\([\w]+\))([\d]+)(_[\w]+)?$`)
-var remapAstIdStorage = regexp.MustCompile(`(t_(struct|userDefinedValueType))\(([\w]+)\)([\d]+)_storage`)
-
-// typeRemapping represents a mapping between an a type generated by solc
-// and a canonicalized type. This is because solc inserts the ast id into
-// certain types.
-type typeRemapping struct {
-	oldType string
-	newType string
-}
-
-// CanonicalizeASTIDs canonicalizes AST IDs in storage layouts so that they
-// don't cause unnecessary conflicts/diffs. The implementation is not
-// particularly efficient, but is plenty fast enough for our purposes.
-// It works in two passes:
-//
-//  1. First, it finds all AST IDs in storage and types, and builds a
-//     map to replace them in the second pass.
-//  2. The second pass performs the replacement.
-//
-// This function returns a copy of the passed-in storage layout. The
-// inefficiency comes from replaceType, which performs a linear
-// search of all replacements when performing substring matches of
-// composite types.
-func CanonicalizeASTIDs(in *solc.StorageLayout, monorepoBase string) *solc.StorageLayout {
-	lastId := uint(1000)
-	astIDRemappings := make(map[uint]uint)
-	typeRemappings := make(map[string]string)
-
-	for _, slot := range in.Storage {
-		astIDRemappings[slot.AstId] = lastId
-		lastId++
-	}
-
-	// Go map iteration order is random, so we need to sort
-	// keys here in order to prevent non-determinism.
-	var sortedOldTypes sort.StringSlice
-	for oldType := range in.Types {
-		sortedOldTypes = append(sortedOldTypes, oldType)
-	}
-	sortedOldTypes.Sort()
-
-	seenTypes := make(map[string]bool)
-	for _, oldType := range sortedOldTypes {
-		if seenTypes[oldType] || oldType == "" {
-			continue
-		}
-
-		matches := remapTypeRe.FindAllStringSubmatch(oldType, -1)
-		if len(matches) == 0 {
-			continue
-		}
-
-		// The storage types include the size when it's a fixed size.
-		// This is subject to breaking in the future if a type with
-		// an ast id is added in a fixed storage type. We don't want
-		// to skip a type with `_storage` in it if it has a subtype
-		// with an ast id or it has an astid itself.
-		skip := len(remapAstIdStorage.FindAllStringSubmatch(oldType, -1)) == 0
-		if strings.Contains(oldType, "storage") && skip {
-			continue
-		}
-
-		replaceAstID := matches[0][2]
-		newType := strings.Replace(oldType, replaceAstID, strconv.Itoa(int(lastId)), 1)
-		typeRemappings[oldType] = newType
-		lastId++
-		seenTypes[oldType] = true
-	}
-
-	outLayout := &solc.StorageLayout{
-		Types: make(map[string]solc.StorageLayoutType),
-	}
-	for _, slot := range in.Storage {
-		contract := slot.Contract
-
-		// Normalize the name of the contract since absolute paths
-		// are used when there are 2 contracts imported with the same
-		// name
-		if filepath.IsAbs(contract) {
-			contract = strings.TrimPrefix(strings.Replace(contract, monorepoBase, "", 1), "/")
-		}
-
-		outLayout.Storage = append(outLayout.Storage, solc.StorageLayoutEntry{
-			AstId:    astIDRemappings[slot.AstId],
-			Contract: contract,
-			Label:    slot.Label,
-			Offset:   slot.Offset,
-			Slot:     slot.Slot,
-			Type:     replaceType(typeRemappings, slot.Type),
-		})
-	}
-
-	for _, oldType := range sortedOldTypes {
-		value := in.Types[oldType]
-		newType := replaceType(typeRemappings, oldType)
-		layout := solc.StorageLayoutType{
-			Encoding:      value.Encoding,
-			Label:         value.Label,
-			NumberOfBytes: value.NumberOfBytes,
-			Key:           replaceType(typeRemappings, value.Key),
-			Value:         replaceType(typeRemappings, value.Value),
-		}
-		if value.Base != "" {
-			layout.Base = replaceType(typeRemappings, value.Base)
-		}
-		outLayout.Types[newType] = layout
-
-	}
-	return outLayout
-}
-
-func replaceType(typeRemappings map[string]string, in string) string {
-	if remap := typeRemappings[in]; remap != "" {
-		return remap
-	}
-
-	// Track the number of matches
-	matches := []typeRemapping{}
-	for oldType, newType := range typeRemappings {
-		if strings.Contains(in, oldType) {
-			matches = append(matches, typeRemapping{oldType, newType})
-		}
-	}
-
-	for _, match := range matches {
-		in = strings.Replace(in, match.oldType, match.newType, 1)
-	}
-
-	return in
-}
diff --git a/op-bindings/ast/canonicalize_test.go b/op-bindings/ast/canonicalize_test.go
deleted file mode 100644
index 1e992584effc..000000000000
--- a/op-bindings/ast/canonicalize_test.go
+++ /dev/null
@@ -1,54 +0,0 @@
-package ast
-
-import (
-	"encoding/json"
-	"os"
-	"path"
-	"testing"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-	"github.com/stretchr/testify/require"
-)
-
-func TestCanonicalize(t *testing.T) {
-	tests := []struct {
-		name     string
-		filename string
-	}{
-		{
-			"simple",
-			"simple.json",
-		},
-		{
-			"remap public variables",
-			"public-variables.json",
-		},
-		{
-			"values in storage",
-			"values-in-storage.json",
-		},
-		{
-			"custom types",
-			"custom-types.json",
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			f, err := os.Open(path.Join("testdata", tt.filename))
-			require.NoError(t, err)
-			dec := json.NewDecoder(f)
-			var testData struct {
-				In  *solc.StorageLayout `json:"in"`
-				Out *solc.StorageLayout `json:"out"`
-			}
-			require.NoError(t, dec.Decode(&testData))
-			require.NoError(t, f.Close())
-
-			// Run 100 times to make sure that we aren't relying
-			// on random map iteration order.
-			for i := 0; i < 100; i++ {
-				require.Equal(t, testData.Out, CanonicalizeASTIDs(testData.In, ""))
-			}
-		})
-	}
-}
diff --git a/op-bindings/ast/testdata/custom-types.json b/op-bindings/ast/testdata/custom-types.json
deleted file mode 100644
index f70680b00b6d..000000000000
--- a/op-bindings/ast/testdata/custom-types.json
+++ /dev/null
@@ -1,286 +0,0 @@
-{
-  "in": {
-    "storage": [
-      {
-        "astId": 59243,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "_initialized",
-        "offset": 0,
-        "slot": "0",
-        "type": "t_uint8"
-      },
-      {
-        "astId": 59246,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "_initializing",
-        "offset": 1,
-        "slot": "0",
-        "type": "t_bool"
-      },
-      {
-        "astId": 59671,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "__gap",
-        "offset": 0,
-        "slot": "1",
-        "type": "t_array(t_uint256)50_storage"
-      },
-      {
-        "astId": 59115,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "_owner",
-        "offset": 0,
-        "slot": "51",
-        "type": "t_address"
-      },
-      {
-        "astId": 59235,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "__gap",
-        "offset": 0,
-        "slot": "52",
-        "type": "t_array(t_uint256)49_storage"
-      },
-      {
-        "astId": 4350,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "gameImpls",
-        "offset": 0,
-        "slot": "101",
-        "type": "t_mapping(t_userDefinedValueType(GameType)8945,t_contract(IDisputeGame)5664)"
-      },
-      {
-        "astId": 4357,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "_disputeGames",
-        "offset": 0,
-        "slot": "102",
-        "type": "t_mapping(t_userDefinedValueType(Hash)8927,t_userDefinedValueType(GameId)8939)"
-      },
-      {
-        "astId": 4362,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "_disputeGameList",
-        "offset": 0,
-        "slot": "103",
-        "type": "t_array(t_userDefinedValueType(GameId)8939)dyn_storage"
-      }
-    ],
-    "types": {
-      "t_address": {
-        "encoding": "inplace",
-        "label": "address",
-        "numberOfBytes": "20"
-      },
-      "t_array(t_uint256)49_storage": {
-        "encoding": "inplace",
-        "label": "uint256[49]",
-        "numberOfBytes": "1568",
-        "base": "t_uint256"
-      },
-      "t_array(t_uint256)50_storage": {
-        "encoding": "inplace",
-        "label": "uint256[50]",
-        "numberOfBytes": "1600",
-        "base": "t_uint256"
-      },
-      "t_array(t_userDefinedValueType(GameId)8939)dyn_storage": {
-        "encoding": "dynamic_array",
-        "label": "GameId[]",
-        "numberOfBytes": "32",
-        "base": "t_userDefinedValueType(GameId)8939"
-      },
-      "t_bool": {
-        "encoding": "inplace",
-        "label": "bool",
-        "numberOfBytes": "1"
-      },
-      "t_contract(IDisputeGame)5664": {
-        "encoding": "inplace",
-        "label": "contract IDisputeGame",
-        "numberOfBytes": "20"
-      },
-      "t_mapping(t_userDefinedValueType(GameType)8945,t_contract(IDisputeGame)5664)": {
-        "encoding": "mapping",
-        "key": "t_userDefinedValueType(GameType)8945",
-        "label": "mapping(GameType => contract IDisputeGame)",
-        "numberOfBytes": "32",
-        "value": "t_contract(IDisputeGame)5664"
-      },
-      "t_mapping(t_userDefinedValueType(Hash)8927,t_userDefinedValueType(GameId)8939)": {
-        "encoding": "mapping",
-        "key": "t_userDefinedValueType(Hash)8927",
-        "label": "mapping(Hash => GameId)",
-        "numberOfBytes": "32",
-        "value": "t_userDefinedValueType(GameId)8939"
-      },
-      "t_uint256": {
-        "encoding": "inplace",
-        "label": "uint256",
-        "numberOfBytes": "32"
-      },
-      "t_uint8": {
-        "encoding": "inplace",
-        "label": "uint8",
-        "numberOfBytes": "1"
-      },
-      "t_userDefinedValueType(GameId)8939": {
-        "encoding": "inplace",
-        "label": "GameId",
-        "numberOfBytes": "32"
-      },
-      "t_userDefinedValueType(GameType)8945": {
-        "encoding": "inplace",
-        "label": "GameType",
-        "numberOfBytes": "1"
-      },
-      "t_userDefinedValueType(Hash)8927": {
-        "encoding": "inplace",
-        "label": "Hash",
-        "numberOfBytes": "32"
-      }
-    }
-  },
-  "out": {
-    "storage": [
-      {
-        "astId": 1000,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "_initialized",
-        "offset": 0,
-        "slot": "0",
-        "type": "t_uint8"
-      },
-      {
-        "astId": 1001,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "_initializing",
-        "offset": 1,
-        "slot": "0",
-        "type": "t_bool"
-      },
-      {
-        "astId": 1002,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "__gap",
-        "offset": 0,
-        "slot": "1",
-        "type": "t_array(t_uint256)50_storage"
-      },
-      {
-        "astId": 1003,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "_owner",
-        "offset": 0,
-        "slot": "51",
-        "type": "t_address"
-      },
-      {
-        "astId": 1004,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "__gap",
-        "offset": 0,
-        "slot": "52",
-        "type": "t_array(t_uint256)49_storage"
-      },
-      {
-        "astId": 1005,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "gameImpls",
-        "offset": 0,
-        "slot": "101",
-        "type": "t_mapping(t_userDefinedValueType(GameType)1010,t_contract(IDisputeGame)1008)"
-      },
-      {
-        "astId": 1006,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "_disputeGames",
-        "offset": 0,
-        "slot": "102",
-        "type": "t_mapping(t_userDefinedValueType(Hash)1011,t_userDefinedValueType(GameId)1009)"
-      },
-      {
-        "astId": 1007,
-        "contract": "contracts/dispute/DisputeGameFactory.sol:DisputeGameFactory",
-        "label": "_disputeGameList",
-        "offset": 0,
-        "slot": "103",
-        "type": "t_array(t_userDefinedValueType(GameId)1009)dyn_storage"
-      }
-    ],
-    "types": {
-      "t_address": {
-        "encoding": "inplace",
-        "label": "address",
-        "numberOfBytes": "20"
-      },
-      "t_array(t_uint256)49_storage": {
-        "encoding": "inplace",
-        "label": "uint256[49]",
-        "numberOfBytes": "1568",
-        "base": "t_uint256"
-      },
-      "t_array(t_uint256)50_storage": {
-        "encoding": "inplace",
-        "label": "uint256[50]",
-        "numberOfBytes": "1600",
-        "base": "t_uint256"
-      },
-      "t_array(t_userDefinedValueType(GameId)1009)dyn_storage": {
-        "encoding": "dynamic_array",
-        "label": "GameId[]",
-        "numberOfBytes": "32",
-        "base": "t_userDefinedValueType(GameId)1009"
-      },
-      "t_bool": {
-        "encoding": "inplace",
-        "label": "bool",
-        "numberOfBytes": "1"
-      },
-      "t_contract(IDisputeGame)1008": {
-        "encoding": "inplace",
-        "label": "contract IDisputeGame",
-        "numberOfBytes": "20"
-      },
-      "t_mapping(t_userDefinedValueType(GameType)1010,t_contract(IDisputeGame)1008)": {
-        "encoding": "mapping",
-        "key": "t_userDefinedValueType(GameType)1010",
-        "label": "mapping(GameType => contract IDisputeGame)",
-        "numberOfBytes": "32",
-        "value": "t_contract(IDisputeGame)1008"
-      },
-      "t_mapping(t_userDefinedValueType(Hash)1011,t_userDefinedValueType(GameId)1009)": {
-        "encoding": "mapping",
-        "key": "t_userDefinedValueType(Hash)1011",
-        "label": "mapping(Hash => GameId)",
-        "numberOfBytes": "32",
-        "value": "t_userDefinedValueType(GameId)1009"
-      },
-      "t_uint256": {
-        "encoding": "inplace",
-        "label": "uint256",
-        "numberOfBytes": "32"
-      },
-      "t_uint8": {
-        "encoding": "inplace",
-        "label": "uint8",
-        "numberOfBytes": "1"
-      },
-      "t_userDefinedValueType(GameId)1009": {
-        "encoding": "inplace",
-        "label": "GameId",
-        "numberOfBytes": "32"
-      },
-      "t_userDefinedValueType(GameType)1010": {
-        "encoding": "inplace",
-        "label": "GameType",
-        "numberOfBytes": "1"
-      },
-      "t_userDefinedValueType(Hash)1011": {
-        "encoding": "inplace",
-        "label": "Hash",
-        "numberOfBytes": "32"
-      }
-    }
-  }
-}
diff --git a/op-bindings/ast/testdata/public-variables.json b/op-bindings/ast/testdata/public-variables.json
deleted file mode 100644
index b601b3543fc9..000000000000
--- a/op-bindings/ast/testdata/public-variables.json
+++ /dev/null
@@ -1,172 +0,0 @@
-{
-  "in": {
-    "storage": [
-      {
-        "astId": 37343,
-        "contract": "contracts/universal/ProxyAdmin.sol:ProxyAdmin",
-        "label": "owner",
-        "offset": 0,
-        "slot": "0",
-        "type": "t_address"
-      },
-      {
-        "astId": 27905,
-        "contract": "contracts/universal/ProxyAdmin.sol:ProxyAdmin",
-        "label": "proxyType",
-        "offset": 0,
-        "slot": "1",
-        "type": "t_mapping(t_address,t_enum(ProxyType)27899)"
-      },
-      {
-        "astId": 27910,
-        "contract": "contracts/universal/ProxyAdmin.sol:ProxyAdmin",
-        "label": "implementationName",
-        "offset": 0,
-        "slot": "2",
-        "type": "t_mapping(t_address,t_string_storage)"
-      },
-      {
-        "astId": 27914,
-        "contract": "contracts/universal/ProxyAdmin.sol:ProxyAdmin",
-        "label": "addressManager",
-        "offset": 0,
-        "slot": "3",
-        "type": "t_contract(AddressManager)4431"
-      },
-      {
-        "astId": 27918,
-        "contract": "contracts/universal/ProxyAdmin.sol:ProxyAdmin",
-        "label": "upgrading",
-        "offset": 20,
-        "slot": "3",
-        "type": "t_bool"
-      }
-    ],
-    "types": {
-      "t_address": {
-        "encoding": "inplace",
-        "label": "address",
-        "numberOfBytes": "20"
-      },
-      "t_bool": {
-        "encoding": "inplace",
-        "label": "bool",
-        "numberOfBytes": "1"
-      },
-      "t_contract(AddressManager)4431": {
-        "encoding": "inplace",
-        "label": "contract AddressManager",
-        "numberOfBytes": "20"
-      },
-      "t_enum(ProxyType)27899": {
-        "encoding": "inplace",
-        "label": "enum ProxyAdmin.ProxyType",
-        "numberOfBytes": "1"
-      },
-      "t_mapping(t_address,t_enum(ProxyType)27899)": {
-        "encoding": "mapping",
-        "key": "t_address",
-        "label": "mapping(address => enum ProxyAdmin.ProxyType)",
-        "numberOfBytes": "32",
-        "value": "t_enum(ProxyType)27899"
-      },
-      "t_mapping(t_address,t_string_storage)": {
-        "encoding": "mapping",
-        "key": "t_address",
-        "label": "mapping(address => string)",
-        "numberOfBytes": "32",
-        "value": "t_string_storage"
-      },
-      "t_string_storage": {
-        "encoding": "bytes",
-        "label": "string",
-        "numberOfBytes": "32"
-      }
-    }
-  },
-  "out": {
-    "storage": [
-      {
-        "astId": 1000,
-        "contract": "contracts/universal/ProxyAdmin.sol:ProxyAdmin",
-        "label": "owner",
-        "offset": 0,
-        "slot": "0",
-        "type": "t_address"
-      },
-      {
-        "astId": 1001,
-        "contract": "contracts/universal/ProxyAdmin.sol:ProxyAdmin",
-        "label": "proxyType",
-        "offset": 0,
-        "slot": "1",
-        "type": "t_mapping(t_address,t_enum(ProxyType)1006)"
-      },
-      {
-        "astId": 1002,
-        "contract": "contracts/universal/ProxyAdmin.sol:ProxyAdmin",
-        "label": "implementationName",
-        "offset": 0,
-        "slot": "2",
-        "type": "t_mapping(t_address,t_string_storage)"
-      },
-      {
-        "astId": 1003,
-        "contract": "contracts/universal/ProxyAdmin.sol:ProxyAdmin",
-        "label": "addressManager",
-        "offset": 0,
-        "slot": "3",
-        "type": "t_contract(AddressManager)1005"
-      },
-      {
-        "astId": 1004,
-        "contract": "contracts/universal/ProxyAdmin.sol:ProxyAdmin",
-        "label": "upgrading",
-        "offset": 20,
-        "slot": "3",
-        "type": "t_bool"
-      }
-    ],
-    "types": {
-      "t_address": {
-        "encoding": "inplace",
-        "label": "address",
-        "numberOfBytes": "20"
-      },
-      "t_bool": {
-        "encoding": "inplace",
-        "label": "bool",
-        "numberOfBytes": "1"
-      },
-      "t_contract(AddressManager)1005": {
-        "encoding": "inplace",
-        "label": "contract AddressManager",
-        "numberOfBytes": "20"
-      },
-      "t_enum(ProxyType)1006": {
-        "encoding": "inplace",
-        "label": "enum ProxyAdmin.ProxyType",
-        "numberOfBytes": "1"
-      },
-      "t_mapping(t_address,t_enum(ProxyType)1006)": {
-        "encoding": "mapping",
-        "key": "t_address",
-        "label": "mapping(address => enum ProxyAdmin.ProxyType)",
-        "numberOfBytes": "32",
-        "value": "t_enum(ProxyType)1006"
-      },
-      "t_mapping(t_address,t_string_storage)": {
-        "encoding": "mapping",
-        "key": "t_address",
-        "label": "mapping(address => string)",
-        "numberOfBytes": "32",
-        "value": "t_string_storage"
-      },
-      "t_string_storage": {
-        "encoding": "bytes",
-        "label": "string",
-        "numberOfBytes": "32"
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/op-bindings/ast/testdata/simple.json b/op-bindings/ast/testdata/simple.json
deleted file mode 100644
index e8a1b75dece3..000000000000
--- a/op-bindings/ast/testdata/simple.json
+++ /dev/null
@@ -1,172 +0,0 @@
-{
-  "in": {
-    "storage": [
-      {
-        "astId": 2533,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "number",
-        "offset": 0,
-        "slot": "0",
-        "type": "t_uint64"
-      },
-      {
-        "astId": 2536,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "timestamp",
-        "offset": 8,
-        "slot": "0",
-        "type": "t_uint64"
-      },
-      {
-        "astId": 2539,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "basefee",
-        "offset": 0,
-        "slot": "1",
-        "type": "t_uint256"
-      },
-      {
-        "astId": 2542,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "hash",
-        "offset": 0,
-        "slot": "2",
-        "type": "t_bytes32"
-      },
-      {
-        "astId": 2545,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "sequenceNumber",
-        "offset": 0,
-        "slot": "3",
-        "type": "t_uint64"
-      },
-      {
-        "astId": 2548,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "batcherHash",
-        "offset": 0,
-        "slot": "4",
-        "type": "t_bytes32"
-      },
-      {
-        "astId": 2551,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "l1FeeOverhead",
-        "offset": 0,
-        "slot": "5",
-        "type": "t_uint256"
-      },
-      {
-        "astId": 2554,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "l1FeeScalar",
-        "offset": 0,
-        "slot": "6",
-        "type": "t_uint256"
-      }
-    ],
-    "types": {
-      "t_bytes32": {
-        "encoding": "inplace",
-        "label": "bytes32",
-        "numberOfBytes": "32"
-      },
-      "t_uint256": {
-        "encoding": "inplace",
-        "label": "uint256",
-        "numberOfBytes": "32"
-      },
-      "t_uint64": {
-        "encoding": "inplace",
-        "label": "uint64",
-        "numberOfBytes": "8"
-      }
-    }
-  },
-  "out": {
-    "storage": [
-      {
-        "astId": 1000,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "number",
-        "offset": 0,
-        "slot": "0",
-        "type": "t_uint64"
-      },
-      {
-        "astId": 1001,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "timestamp",
-        "offset": 8,
-        "slot": "0",
-        "type": "t_uint64"
-      },
-      {
-        "astId": 1002,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "basefee",
-        "offset": 0,
-        "slot": "1",
-        "type": "t_uint256"
-      },
-      {
-        "astId": 1003,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "hash",
-        "offset": 0,
-        "slot": "2",
-        "type": "t_bytes32"
-      },
-      {
-        "astId": 1004,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "sequenceNumber",
-        "offset": 0,
-        "slot": "3",
-        "type": "t_uint64"
-      },
-      {
-        "astId": 1005,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "batcherHash",
-        "offset": 0,
-        "slot": "4",
-        "type": "t_bytes32"
-      },
-      {
-        "astId": 1006,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "l1FeeOverhead",
-        "offset": 0,
-        "slot": "5",
-        "type": "t_uint256"
-      },
-      {
-        "astId": 1007,
-        "contract": "contracts/L2/L1Block.sol:L1Block",
-        "label": "l1FeeScalar",
-        "offset": 0,
-        "slot": "6",
-        "type": "t_uint256"
-      }
-    ],
-    "types": {
-      "t_bytes32": {
-        "encoding": "inplace",
-        "label": "bytes32",
-        "numberOfBytes": "32"
-      },
-      "t_uint256": {
-        "encoding": "inplace",
-        "label": "uint256",
-        "numberOfBytes": "32"
-      },
-      "t_uint64": {
-        "encoding": "inplace",
-        "label": "uint64",
-        "numberOfBytes": "8"
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/op-bindings/ast/testdata/values-in-storage.json b/op-bindings/ast/testdata/values-in-storage.json
deleted file mode 100644
index 8d98cdb5129f..000000000000
--- a/op-bindings/ast/testdata/values-in-storage.json
+++ /dev/null
@@ -1,350 +0,0 @@
-{
-  "in": {
-    "storage": [
-      {
-        "astId": 1000,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_balances",
-        "offset": 0,
-        "slot": "0",
-        "type": "t_mapping(t_address,t_uint256)"
-      },
-      {
-        "astId": 1001,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_allowances",
-        "offset": 0,
-        "slot": "1",
-        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
-      },
-      {
-        "astId": 1002,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_totalSupply",
-        "offset": 0,
-        "slot": "2",
-        "type": "t_uint256"
-      },
-      {
-        "astId": 1003,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_name",
-        "offset": 0,
-        "slot": "3",
-        "type": "t_string_storage"
-      },
-      {
-        "astId": 1004,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_symbol",
-        "offset": 0,
-        "slot": "4",
-        "type": "t_string_storage"
-      },
-      {
-        "astId": 1005,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_nonces",
-        "offset": 0,
-        "slot": "5",
-        "type": "t_mapping(t_address,t_struct(Counter)1012_storage)"
-      },
-      {
-        "astId": 1006,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_PERMIT_TYPEHASH_DEPRECATED_SLOT",
-        "offset": 0,
-        "slot": "6",
-        "type": "t_bytes32"
-      },
-      {
-        "astId": 1007,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_delegates",
-        "offset": 0,
-        "slot": "7",
-        "type": "t_mapping(t_address,t_address)"
-      },
-      {
-        "astId": 1008,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_checkpoints",
-        "offset": 0,
-        "slot": "8",
-        "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)1011_storage)dyn_storage)"
-      },
-      {
-        "astId": 1009,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_totalSupplyCheckpoints",
-        "offset": 0,
-        "slot": "9",
-        "type": "t_array(t_struct(Checkpoint)1011_storage)dyn_storage"
-      },
-      {
-        "astId": 1010,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_owner",
-        "offset": 0,
-        "slot": "10",
-        "type": "t_address"
-      }
-    ],
-    "types": {
-      "t_address": {
-        "encoding": "inplace",
-        "label": "address",
-        "numberOfBytes": "20"
-      },
-      "t_array(t_struct(Checkpoint)1011_storage)dyn_storage": {
-        "encoding": "dynamic_array",
-        "label": "struct ERC20Votes.Checkpoint[]",
-        "numberOfBytes": "32"
-      },
-      "t_bytes32": {
-        "encoding": "inplace",
-        "label": "bytes32",
-        "numberOfBytes": "32"
-      },
-      "t_mapping(t_address,t_address)": {
-        "encoding": "mapping",
-        "label": "mapping(address =u003e address)",
-        "numberOfBytes": "32",
-        "key": "t_address",
-        "value": "t_address"
-      },
-      "t_mapping(t_address,t_array(t_struct(Checkpoint)1011_storage)dyn_storage)": {
-        "encoding": "mapping",
-        "label": "mapping(address =u003e struct ERC20Votes.Checkpoint[])",
-        "numberOfBytes": "32",
-        "key": "t_address",
-        "value": "t_array(t_struct(Checkpoint)1011_storage)dyn_storage"
-      },
-      "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
-        "encoding": "mapping",
-        "label": "mapping(address =u003e mapping(address =u003e uint256))",
-        "numberOfBytes": "32",
-        "key": "t_address",
-        "value": "t_mapping(t_address,t_uint256)"
-      },
-      "t_mapping(t_address,t_struct(Counter)1012_storage)": {
-        "encoding": "mapping",
-        "label": "mapping(address =u003e struct Counters.Counter)",
-        "numberOfBytes": "32",
-        "key": "t_address",
-        "value": "t_struct(Counter)1012_storage"
-      },
-      "t_mapping(t_address,t_uint256)": {
-        "encoding": "mapping",
-        "label": "mapping(address =u003e uint256)",
-        "numberOfBytes": "32",
-        "key": "t_address",
-        "value": "t_uint256"
-      },
-      "t_string_storage": {
-        "encoding": "bytes",
-        "label": "string",
-        "numberOfBytes": "32"
-      },
-      "t_struct(Checkpoint)1011_storage": {
-        "encoding": "inplace",
-        "label": "struct ERC20Votes.Checkpoint",
-        "numberOfBytes": "32"
-      },
-      "t_struct(Counter)1012_storage": {
-        "encoding": "inplace",
-        "label": "struct Counters.Counter",
-        "numberOfBytes": "32"
-      },
-      "t_uint224": {
-        "encoding": "inplace",
-        "label": "uint224",
-        "numberOfBytes": "28"
-      },
-      "t_uint256": {
-        "encoding": "inplace",
-        "label": "uint256",
-        "numberOfBytes": "32"
-      },
-      "t_uint32": {
-        "encoding": "inplace",
-        "label": "uint32",
-        "numberOfBytes": "4"
-      }
-    }
-  },
-  "out": {
-    "storage": [
-      {
-        "astId": 1000,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_balances",
-        "offset": 0,
-        "slot": "0",
-        "type": "t_mapping(t_address,t_uint256)"
-      },
-      {
-        "astId": 1001,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_allowances",
-        "offset": 0,
-        "slot": "1",
-        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
-      },
-      {
-        "astId": 1002,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_totalSupply",
-        "offset": 0,
-        "slot": "2",
-        "type": "t_uint256"
-      },
-      {
-        "astId": 1003,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_name",
-        "offset": 0,
-        "slot": "3",
-        "type": "t_string_storage"
-      },
-      {
-        "astId": 1004,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_symbol",
-        "offset": 0,
-        "slot": "4",
-        "type": "t_string_storage"
-      },
-      {
-        "astId": 1005,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_nonces",
-        "offset": 0,
-        "slot": "5",
-        "type": "t_mapping(t_address,t_struct(Counter)1012_storage)"
-      },
-      {
-        "astId": 1006,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_PERMIT_TYPEHASH_DEPRECATED_SLOT",
-        "offset": 0,
-        "slot": "6",
-        "type": "t_bytes32"
-      },
-      {
-        "astId": 1007,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_delegates",
-        "offset": 0,
-        "slot": "7",
-        "type": "t_mapping(t_address,t_address)"
-      },
-      {
-        "astId": 1008,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_checkpoints",
-        "offset": 0,
-        "slot": "8",
-        "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)1011_storage)dyn_storage)"
-      },
-      {
-        "astId": 1009,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_totalSupplyCheckpoints",
-        "offset": 0,
-        "slot": "9",
-        "type": "t_array(t_struct(Checkpoint)1011_storage)dyn_storage"
-      },
-      {
-        "astId": 1010,
-        "contract": "contracts/L2/GovernanceToken.sol:GovernanceToken",
-        "label": "_owner",
-        "offset": 0,
-        "slot": "10",
-        "type": "t_address"
-      }
-    ],
-    "types": {
-      "t_address": {
-        "encoding": "inplace",
-        "label": "address",
-        "numberOfBytes": "20"
-      },
-      "t_array(t_struct(Checkpoint)1011_storage)dyn_storage": {
-        "encoding": "dynamic_array",
-        "label": "struct ERC20Votes.Checkpoint[]",
-        "numberOfBytes": "32"
-      },
-      "t_bytes32": {
-        "encoding": "inplace",
-        "label": "bytes32",
-        "numberOfBytes": "32"
-      },
-      "t_mapping(t_address,t_address)": {
-        "encoding": "mapping",
-        "label": "mapping(address =u003e address)",
-        "numberOfBytes": "32",
-        "key": "t_address",
-        "value": "t_address"
-      },
-      "t_mapping(t_address,t_array(t_struct(Checkpoint)1011_storage)dyn_storage)": {
-        "encoding": "mapping",
-        "label": "mapping(address =u003e struct ERC20Votes.Checkpoint[])",
-        "numberOfBytes": "32",
-        "key": "t_address",
-        "value": "t_array(t_struct(Checkpoint)1011_storage)dyn_storage"
-      },
-      "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
-        "encoding": "mapping",
-        "label": "mapping(address =u003e mapping(address =u003e uint256))",
-        "numberOfBytes": "32",
-        "key": "t_address",
-        "value": "t_mapping(t_address,t_uint256)"
-      },
-      "t_mapping(t_address,t_struct(Counter)1012_storage)": {
-        "encoding": "mapping",
-        "label": "mapping(address =u003e struct Counters.Counter)",
-        "numberOfBytes": "32",
-        "key": "t_address",
-        "value": "t_struct(Counter)1012_storage"
-      },
-      "t_mapping(t_address,t_uint256)": {
-        "encoding": "mapping",
-        "label": "mapping(address =u003e uint256)",
-        "numberOfBytes": "32",
-        "key": "t_address",
-        "value": "t_uint256"
-      },
-      "t_string_storage": {
-        "encoding": "bytes",
-        "label": "string",
-        "numberOfBytes": "32"
-      },
-      "t_struct(Checkpoint)1011_storage": {
-        "encoding": "inplace",
-        "label": "struct ERC20Votes.Checkpoint",
-        "numberOfBytes": "32"
-      },
-      "t_struct(Counter)1012_storage": {
-        "encoding": "inplace",
-        "label": "struct Counters.Counter",
-        "numberOfBytes": "32"
-      },
-      "t_uint224": {
-        "encoding": "inplace",
-        "label": "uint224",
-        "numberOfBytes": "28"
-      },
-      "t_uint256": {
-        "encoding": "inplace",
-        "label": "uint256",
-        "numberOfBytes": "32"
-      },
-      "t_uint32": {
-        "encoding": "inplace",
-        "label": "uint32",
-        "numberOfBytes": "4"
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/op-bindings/bindgen/README.md b/op-bindings/bindgen/README.md
deleted file mode 100644
index 914c54df94c2..000000000000
--- a/op-bindings/bindgen/README.md
+++ /dev/null
@@ -1,338 +0,0 @@
-![BindGen Header Image](./bindgen_header.png)
-
-A CLI for generating Go bindings from Forge artifacts and API clients such as Etherscan's
-
-- [Dependencies](#dependencies)
-- [Running BindGen](#running-bindgen)
-  - [Using the Makefile Commands](#using-the-makefile-commands)
-    - [`bindgen`](#bindgen)
-      - [Required ENVs](#required-envs)
-    - [`bindgen-local`](#bindgen-local)
-    - [`bindgen-remote`](#bindgen-remote)
-      - [Required ENVs](#required-envs-1)
-  - [Using the CLI Directly](#using-the-cli-directly)
-  - [CLI Flags](#cli-flags)
-    - [Global Flags](#global-flags)
-  - [Local Flags](#local-flags)
-  - [Remote Flags](#remote-flags)
-- [Using BindGen to Add New Preinstalls to L2 Genesis](#using-bindgen-to-add-new-preinstalls-to-l2-genesis)
-  - [Anatomy of `artifacts.json`](#anatomy-of-artifactsjson)
-    - [`"local"` Contracts](#local-contracts)
-    - [`"remote"` Contracts](#remote-contracts)
-    - [Adding A New `"remote"` Contract](#adding-a-new-remote-contract)
-      - [Contracts that Don't Make Good Preinstalls](#contracts-that-dont-make-good-preinstalls)
-    - [Adding the Contract to L2 Genesis](#adding-the-contract-to-l2-genesis)
-
-# Dependencies
-
-- [Go](https://go.dev/dl/)
-- [Foundry](https://getfoundry.sh/)
-- [pnpm](https://pnpm.io/installation)
-
-If you're running the CLI inside the Optimism monorepo, please make sure you've executed `pnpm i` and `pnpm build` to install and setup all of the monorepo's dependencies.
-
-# Running BindGen
-
-BindGen can be run in one of two ways:
-
-1. Using the provided [Makefile](../Makefile) which defaults some of the required flags
-2. Executing the CLI directly with `go run`, or building a Go binary and executing it
-
-Before executing BindGen, please review the [artifacts.json](../artifacts.json) file which specifies what contracts BindGen should generate Go bindings and metadata files for. More information on how to configure `artifacts.json` can be found [here](#anatomy-of-artifactsjson).
-
-## Using the Makefile Commands
-
-### `bindgen`
-
-```bash
-ETHERSCAN_APIKEY_ETH=your_api_key \
-ETHERSCAN_APIKEY_OP=your_api_key \
-RPC_URL_ETH=your_rpc_url \
-RPC_URL_OP=your_rpc_url \
-make bindgen
-```
-
-This command will run `forge clean` to remove any existing Forge artifacts found in the [contracts-bedrock](../../packages/contracts-bedrock/) directory, re-build the Forge artifacts, then will use BindGen to generate Go bindings and metadata files for the contracts specified in [artifacts.json](../artifacts.json).
-
-#### Required ENVs
-
-- `ETHERSCAN_APIKEY_ETH` An Etherscan API key for querying Ethereum Mainnet.
-
-  - [Here's a guide](https://docs.etherscan.io/getting-started/viewing-api-usage-statistics) on how to obtain a key.
-
-- `ETHERSCAN_APIKEY_OP` An Etherscan API key for querying Optimism Mainnet.
-
-  - You can follow the above guide to obtain a key, but make sure you're on the [Optimistic Etherscan](https://optimistic.etherscan.io/)
-
-- `RPC_URL_ETH` This is any HTTP URL that can be used to query an Ethereum Mainnet RPC node.
-
-  - Expected to use API key authentication.
-
-- `RPC_URL_OP` This is any HTTP URL that can be used to query an Optimism Mainnet RPC node.
-
-  - Expected to use API key authentication.
-
-### `bindgen-local`
-
-```bash
-make bindgen-local
-```
-
-This command will run `forge clean` to remove any existing Forge artifacts found in the [contracts-bedrock](../../packages/contracts-bedrock/) directory, re-build the Forge artifacts, then will use BindGen to generate Go bindings and metadata files for the `"local"` contracts specified in [artifacts.json](../artifacts.json).
-
-### `bindgen-remote`
-
-```bash
-ETHERSCAN_APIKEY_ETH=your_api_key \
-ETHERSCAN_APIKEY_OP=your_api_key \
-RPC_URL_ETH=your_rpc_url \
-RPC_URL_OP=your_rpc_url \
-make bindgen-remote
-```
-
-This command will use BindGen to generate Go bindings and metadata files for the `"remote"` contracts specified in [artifacts.json](../artifacts.json).
-
-#### Required ENVs
-
-- `ETHERSCAN_APIKEY_ETH` An Etherscan API key for querying Ethereum Mainnet.
-
-  - [Here's a guide](https://docs.etherscan.io/getting-started/viewing-api-usage-statistics) on how to obtain a key.
-
-- `ETHERSCAN_APIKEY_OP` An Etherscan API key for querying Optimism Mainnet.
-
-  - You can follow the above guide to obtain a key, but make sure you're on the [Optimistic Etherscan](https://optimistic.etherscan.io/)
-
-- `RPC_URL_ETH` This is any HTTP URL that can be used to query an Ethereum Mainnet RPC node.
-
-  - Expected to use API key authentication.
-
-- `RPC_URL_OP` This is any HTTP URL that can be used to query an Optimism Mainnet RPC node.
-
-  - Expected to use API key authentication.
-
-## Using the CLI Directly
-
-Currently the CLI only has one command, `generate`, which expects one of the following sub-commands:
-
-Command  | Description                                                                | Flags                         | Usage
--------- | -------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------------------------------
-`all`    | Generates bindings for both local and remotely sourced contracts.          | [Global Flags](#global-flags) | `bindgen generate [global-flags] all [local-flags] [remote-flags]`
-`local`  | Generates bindings for contracts with locally available Forge artifacts.   | [Local Flags](#local-flags)   | `bindgen generate [global-flags] local [local-flags]`
-`remote` | Generates bindings for contracts whose metadata is sourced from Etherscan. | [Remote Flags](#remote-flags) | `bindgen generate [global-flags] remote [remote-flags]`
-
-The following displays how the CLI can be invoked from the monorepo root:
-
-```bash
-go run ./op-bindings/cmd/    
-```
-
-## CLI Flags
-
-### Global Flags
-
-These flags are used by all CLI commands
-
-Flag               | Type   | Description                                                                    | Required
------------------- | ------ | ------------------------------------------------------------------------------ | --------
-`metadata-out`     | String | Output directory for Go bindings contract metadata files                       | Yes
-`bindings-package` | String | Go package name used for generated Go bindings                                 | Yes
-`contracts-list`   | String | Path to the list of `local` and/or `remote` contracts                          | Yes
-`log.level`        | String | Log level (`none`, `debug`, `info`, `warn`, `error`, `crit`) (Default: `info`) | No
-
-## Local Flags
-
-These flags are used with `all` and `local` commands
-
-Flag               | Type   | Description                                                   | Required
------------------- | ------ | ------------------------------------------------------------- | --------
-`source-maps-list` | String | Comma-separated list of contracts to generate source-maps for | No
-`forge-artifacts`  | String | Path to the directory with compiled Forge artifacts           | Yes
-
-## Remote Flags
-
-These flags are used with `all` and `remote` commands
-
-Flag                   | Type   | Description                                                                 | Required
----------------------- | ------ | --------------------------------------------------------------------------- | --------
-`etherscan.apikey.eth` | String | An Etherscan API key for querying Ethereum Mainnet                          | Yes
-`etherscan.apikey.op`  | String | An Etherscan API key for querying Optimism Mainnet                          | Yes
-`rpc.url.eth`          | String | This is any HTTP URL that can be used to query an Ethereum Mainnet RPC node | Yes
-`rpc.url.op`           | String | This is any HTTP URL that can be used to query an Optimism Mainnet RPC node | Yes
-
-# Using BindGen to Add New Preinstalls to L2 Genesis
-
-**Note** While we encourage hacking on the OP stack, we are not actively looking to integrate more contracts to the official OP stack genesis.
-
-BindGen uses the provided `contracts-list` to generate Go bindings and metadata files which are used when building the L2 genesis. The first step in adding a new preinstall to L2 genesis is adding the contract to your `contracts-list` (by default this list is [artifacts.json](../artifacts.json)).
-
-## Anatomy of `artifacts.json`
-
-Below is a condensed version of the default [artifacts.json](../artifacts.json) file for reference:
-
-```json
-{
-  "local": [
-    "SystemConfig",
-    "L1CrossDomainMessenger",
-
-    ...
-
-    "StorageSetter",
-    "SuperchainConfig"
-  ],
-  "remote": [
-    {
-      "name": "MultiCall3",
-      "verified": true,
-      "deployments": {
-        "eth": "0xcA11bde05977b3631167028862bE2a173976CA11",
-        "op": "0xcA11bde05977b3631167028862bE2a173976CA11"
-      }
-    },
-
-    ...
-
-    {
-      "name": "EntryPoint",
-      "verified": true,
-      "deployments": {
-        "eth": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
-        "op": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"
-      },
-      "deploymentSalt": "0000000000000000000000000000000000000000000000000000000000000000"
-    }
-  ]
-}
-```
-
-### `"local"` Contracts
-
-The first property of this JSON object, `"local"`, specifies the name of the contracts that have locally available Forge artifacts which BindGen will use to generate Go bindings and metadata files. This property specifies an array of strings where each string corresponds to the name of the contract which is used in the name of its corresponding Forge artifact.
-
-For example, the first contract listed in the default contract list is `SystemConfig`. After running `pnpm build` in the [contract-bedrock](../../packages/contracts-bedrock/), you'll have a [forge-artifacts](../../packages/contracts-bedrock/forge-artifacts/) directory where you can find [SystemConfig.sol](../../packages/contracts-bedrock/forge-artifacts/SystemConfig.sol/). Inside is the Forge artifacts BindGen will use to generate the Go bindings and metadata file.
-
-In some cases, such as `Safe`, there will exist multiple versioned Forge artifacts (e.g. [contracts-bedrock/forge-artifacts/Safe.sol/](../../packages/contracts-bedrock/forge-artifacts/Safe.sol/) contains `Safe.0.8.15.json` and `Safe.0.8.19.json`). In this case BindGen will default to using the lesser version (`Safe.0.8.19.json` in this case), and when running BindGen you will see a warning logged to the console to notify you:
-
-```bash
-...
-WARN [12-22|13:39:19.217] Multiple versions of forge artifacts exist, using lesser version contract=Safe
-...
-INFO [12-22|13:39:20.253] Generating bindings and metadata for local contract contract=Safe
-```
-
-### `"remote"` Contracts
-
-The second property specifies a list of `RemoteContract` objects which contain metadata used to fetch the needed contract info to generate Go bindings from Etherscan; these contracts do **not** have locally available Forge artifacts.
-
-There are a couple different variations of the `RemoteContract` object, but the following is the Go struct for reference:
-
-```go
-type Deployments struct {
-    Eth common.Address `json:"eth"`
-    Op  common.Address `json:"op"`
-}
-
-type RemoteContract struct {
-    Name           string         `json:"name"`
-    Verified       bool           `json:"verified"`
-    Deployments    Deployments    `json:"deployments"`
-    DeploymentSalt string         `json:"deploymentSalt"`
-    Deployer       common.Address `json:"deployer"`
-    ABI            string         `json:"abi"`
-    InitBytecode   string         `json:"initBytecode"`
-}
-```
-
-Name                   | Description
----------------------- | -----------
-`name` | The name of the remote contract that will be used for the Go bindings and metadata files
-`verified` | Denotes whether the contract is verified on Etherscan
-`deployments` | An object that maps a network and the address the contract is deployed to on that network
-`deployments.eth` | The address the contract is deployed to on Ethereum Mainnet
-`deployments.op` | The address the contract is deployed to on Optimism Mainnet
-`deploymentSalt` | If the contract was deployed using CREATE2 or a CREATE2 proxy deployer, here is where you specify the salt that was used for creation
-`deployer` | The address used to deploy the contract, used to mimic CREATE2 deployments
-`abi` | The ABI of the contract, required if the contract is **not** verified on Etherscan
-`initBytecode` | The initialization bytecode for the contract, required if the contract is a part of the initialization of another contract (i.e. the `input` data of the deployment transaction contains initialization bytecode other than what belongs to the specific contract you're adding)
-
-### Adding A New `"remote"` Contract
-
-After adding a `RemoteContract` object to your `contracts-list`, you will need to add the `name` of your contract to the `switch` statement found in the `processContracts` function in [generator_remote.go](./generator_remote.go):
-
-```go
-...
-
-switch contract.Name {
-		case "MultiCall3", "Safe_v130", "SafeL2_v130", "MultiSendCallOnly_v130",
-			"EntryPoint", "SafeSingletonFactory", "DeterministicDeploymentProxy":
-			err = generator.standardHandler(&contractMetadata)
-		case "Create2Deployer":
-			err = generator.create2DeployerHandler(&contractMetadata)
-		case "MultiSend_v130":
-			err = generator.multiSendHandler(&contractMetadata)
-		case "SenderCreator":
-			// The SenderCreator contract is deployed by EntryPoint, so the transaction data
-			// from the deployment transaction is for the entire EntryPoint deployment.
-			// So, we're manually providing the initialization bytecode
-			contractMetadata.InitBin = contract.InitBytecode
-			err = generator.senderCreatorHandler(&contractMetadata)
-		case "Permit2":
-			// Permit2 has an immutable Solidity variable that resolves to block.chainid,
-			// so we can't use the deployed bytecode, and instead must generate it
-			// at some later point not handled by BindGen.
-			// DeployerAddress is intended to be used to help deploy Permit2 at it's deterministic address
-			// to a chain set with the required id to be able to obtain a diff minimized deployed bytecode
-			contractMetadata.Deployer = contract.Deployer
-			err = generator.permit2Handler(&contractMetadata)
-		default:
-			err = fmt.Errorf("unknown contract: %s, don't know how to handle it", contract.Name)
-		}
-
-...
-```
-
-If your contract is verified on Etherscan, doesn't contain any Solidity `immutable`s, and doesn't require any special handling, then you most likely can add your contract's `name` to the first switch case. Then will use the `standardHandler` which:
-
-1. Fetches the required contract metadata from Etherscan (i.e. initialization and deployed bytecode, ABI, deployment transaction hash, etc.)
-2. Compares the retrieved deployed bytecode from Etherscan against the response of `eth_codeAt` from an RPC node for each network specified in `RemoteContract.deployments` (this is a sanity check to verify Etherscan is returning correct data)
-3. If applicable, removes the provided `RemoteContract.deploymentSalt` from the initialization bytecode
-4. Compares the initialization bytecode retrieved from Etherscan on Ethereum Mainnet against the bytecode retrieved from Etherscan on Optimism Mainnet
-  - This is an important sanity check! If the initialization bytecode from Ethereum differs from Optimism, then there's a big chance the deployment from Ethereum may not behave as expected if preinstalled to an OP stack L2
-5. Compares the deployment bytecode retrieved from Etherscan on Ethereum Mainnet against the bytecode retrieved from Etherscan on Optimism Mainnet
-  - This has the same concern as differing initialization bytecode
-6. Lastly, the Go bindings are generated and the metadata file is written to the path provided as `metadata-out` CLI flag
-
-All other default `"remote"` contract have some variation of the above execution flow depending on the nuances of each contract. For example:
-
-- `Create2Deployer`'s initialization and deployed bytecode is expected to differ from its Optimism Mainnet deployment
-- `MultiSend_v130` has an `immutable` Solidity variable the resolves to `address(this)`, so we can't use the deployment bytecode from Ethereum Mainnet, we must get its deployment bytecode from Optimism Mainnet
-- `SenderCreator` is deployed by `EntryPoint`, so its initialization bytecode is provided in [artifacts.json](../artifacts.json) and not being fetched from Etherscan like other contracts
-
-#### Contracts that Don't Make Good Preinstalls
-
-Not every contract can be added as a preinstall, and some contracts have nuances that make them potentially dangerous or troublesome to preinstall. Below are some examples of contracts that wouldn't make good preinstalls. This is not a comprehensive list, so make sure to use judgment for each contract added as a preinstall.
-
-- Contracts that haven't been audited or stood the test of time
-  - Once a contract is preinstalled and a network is started, if a vulnerability is discovered for the contract and there is no way to easily disable the contract, the only options to "disable" the vulnerable contract are to either (A) remove it from the L2 genesis and restart the L2 network, (B) Hardfork the network to remove/replace the preinstall, or (C) Warn users not to use the vulnerable preinstall
-- Related to above, contracts that may become deprecated/unsupported relatively soon
-  - As mentioned above, you're limited to options A, B, or C
-- Upgradeable Contracts
-  - While it's certainly feasible to preinstall an upgradeable contract, great care should be taken to minimize security risks to users if the contract is upgraded to a malicious or buggy implementation. Understanding who has the ability to upgrade the contract is key to avoiding this. Additionally, users might be expecting a preinstall to do something and may be caught off guard if the implementation was upgraded without their knowledge
-- Contracts with Privileged Roles and Configuration Parameters
-  - Similar to the upgradeable contracts, simply having an owner or other privileged role with the ability to make configuration changes can present a security risk and result in unexpected different behaviors across chains.
-- Contracts that have dependencies
-  - Dependencies has many definitions, for example:
-    - Being reliant on specific Oracle contracts that may not be available on your L2
-    - Specific contract state that's set on L1 but won't be on L2
-    - Relying on specific values of block and transaction properties (e.g. `block.chainid`, `block.timestamp`, `block.number`, etc.)
-    - Contract libraries that may not be deployed on L2
-
-### Adding the Contract to L2 Genesis
-
-Once you've configured the `contracts-list` to include the contracts you'd like to add as preinstalls, the next step is utilizing the BindGen outputs to configure the L2 genesis.
-
-1. First we must update the [addresses.go](../predeploys/addresses.go) file to include the address we're preinstalling our contracts to
-1. Update the `switch` case found in [layer_two.go](../../op-chain-ops/genesis/layer_two.go) to include the `name` of your contracts
-1. Update [immutables.go](../../op-chain-ops/immutables/immutables.go) to include your added contracts
-1. Update [Predeploys.sol](../../packages/contracts-bedrock/src/libraries/Predeploys.sol) to include your added contracts at their expected addresses
-1. Update [Predeploys.t.sol](../../packages/contracts-bedrock/test/Predeploys.t.sol) to include the `name` of your contracts to avoid being tested for `Predeploys.PROXY_ADMIN`
diff --git a/op-bindings/bindgen/bindgen_header.png b/op-bindings/bindgen/bindgen_header.png
deleted file mode 100644
index b8df6378ee73..000000000000
Binary files a/op-bindings/bindgen/bindgen_header.png and /dev/null differ
diff --git a/op-bindings/bindgen/fixtures_bytecode_test.go b/op-bindings/bindgen/fixtures_bytecode_test.go
deleted file mode 100644
index c91f7ac76740..000000000000
--- a/op-bindings/bindgen/fixtures_bytecode_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package bindgen
-
-const Safe_v130InitBytecode = "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5060016004819055506159ae80620000296000396000f3fe6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c63430007060033"
-const Safe_v130InitBytecodeNoSalt = "608060405234801561001057600080fd5b5060016004819055506159ae80620000296000396000f3fe6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c63430007060033"
-
-const Permit2InitBytecode = "0x0000000000000000000000000000000000000000d3af2663da51c1021500000060c0346100bb574660a052602081017f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a60408301524660608301523060808301526080825260a082019180831060018060401b038411176100a557826040525190206080526123c090816100c1823960805181611b47015260a05181611b210152f35b634e487b7160e01b600052604160045260246000fd5b600080fdfe6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000000003611b69577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a"
-const Permit2InitBytecodeNoSalt = "60c0346100bb574660a052602081017f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a60408301524660608301523060808301526080825260a082019180831060018060401b038411176100a557826040525190206080526123c090816100c1823960805181611b47015260a05181611b210152f35b634e487b7160e01b600052604160045260246000fd5b600080fdfe6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000000003611b69577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a"
-
-const EntryPointInitBytecode = "0x000000000000000000000000000000000000000000000000000000000000000060a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033"
-const EntryPointInitBytecodeNoSalt = "60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033"
diff --git a/op-bindings/bindgen/fixtures_test.go b/op-bindings/bindgen/fixtures_test.go
deleted file mode 100644
index 8234dd3f1dda..000000000000
--- a/op-bindings/bindgen/fixtures_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package bindgen
-
-// The Init bytecode used for these tests can either be sourced
-// on-chain using the deployment tx of these contracts, or can be
-// found in the bindings output from BindGen (../bindings/)
-var removeDeploymentSaltTests = []struct {
-	name           string
-	deploymentData string
-	deploymentSalt string
-	expected       string
-}{
-	{
-		"Case #1",
-		Safe_v130InitBytecode,
-		"0000000000000000000000000000000000000000000000000000000000000000",
-		Safe_v130InitBytecodeNoSalt,
-	},
-	{
-		"Case #2",
-		Permit2InitBytecode,
-		"0000000000000000000000000000000000000000d3af2663da51c10215000000",
-		Permit2InitBytecodeNoSalt,
-	},
-	{
-		"Case #3",
-		EntryPointInitBytecode,
-		"0000000000000000000000000000000000000000000000000000000000000000",
-		EntryPointInitBytecodeNoSalt,
-	},
-}
-
-var removeDeploymentSaltTestsFailures = []struct {
-	name           string
-	deploymentData string
-	deploymentSalt string
-	expectedError  string
-}{
-	{
-		"Failure Case #1 Invalid Regex",
-		"0x1234abc",
-		"[invalid-regex",
-		"failed to compile regular expression: error parsing regexp: missing closing ]: `[invalid-regex)`",
-	},
-	{
-		"Failure Case #2 Salt Not Found",
-		"0x1234abc",
-		"4567",
-		"expected salt: 4567 to be at the beginning of the contract initialization code: 0x1234abc, but it wasn't",
-	},
-}
diff --git a/op-bindings/bindgen/generator_local.go b/op-bindings/bindgen/generator_local.go
deleted file mode 100644
index 26f69822e26e..000000000000
--- a/op-bindings/bindgen/generator_local.go
+++ /dev/null
@@ -1,253 +0,0 @@
-package bindgen
-
-import (
-	"encoding/json"
-	"errors"
-	"fmt"
-	"os"
-	"path"
-	"path/filepath"
-	"regexp"
-	"strings"
-	"text/template"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/ast"
-	"github.com/ethereum-optimism/optimism/op-bindings/foundry"
-)
-
-type BindGenGeneratorLocal struct {
-	BindGenGeneratorBase
-	SourceMapsList     string
-	ForgeArtifactsPath string
-}
-
-type localContractMetadata struct {
-	Name                   string
-	StorageLayout          string
-	DeployedBin            string
-	Package                string
-	DeployedSourceMap      string
-	HasImmutableReferences bool
-}
-
-func (generator *BindGenGeneratorLocal) GenerateBindings() error {
-	contracts, err := readContractList(generator.Logger, generator.ContractsListPath)
-	if err != nil {
-		return fmt.Errorf("error reading contract list %s: %w", generator.ContractsListPath, err)
-	}
-	if len(contracts.Local) == 0 {
-		return fmt.Errorf("no contracts parsed from given contract list: %s", generator.ContractsListPath)
-	}
-
-	return generator.processContracts(contracts.Local)
-}
-
-func (generator *BindGenGeneratorLocal) processContracts(contracts []string) error {
-	tempArtifactsDir, err := mkTempArtifactsDir(generator.Logger)
-	if err != nil {
-		return err
-	}
-	defer func() {
-		err := os.RemoveAll(tempArtifactsDir)
-		if err != nil {
-			generator.Logger.Error("Error removing temporary artifact directory", "path", tempArtifactsDir, "err", err.Error())
-		} else {
-			generator.Logger.Debug("Successfully removed temporary artifact directory")
-		}
-	}()
-
-	sourceMapsList := strings.Split(generator.SourceMapsList, ",")
-	sourceMapsSet := make(map[string]struct{})
-	for _, k := range sourceMapsList {
-		sourceMapsSet[k] = struct{}{}
-	}
-
-	contractArtifactPaths, err := generator.getContractArtifactPaths()
-	if err != nil {
-		return err
-	}
-
-	contractMetadataFileTemplate := template.Must(template.New("localContractMetadata").Parse(localContractMetadataTemplate))
-
-	for _, contractName := range contracts {
-		generator.Logger.Info("Generating bindings and metadata for local contract", "contract", contractName)
-
-		forgeArtifact, err := generator.readForgeArtifact(contractName, contractArtifactPaths)
-		if err != nil {
-			return err
-		}
-
-		abiFilePath, bytecodeFilePath, err := writeContractArtifacts(generator.Logger, tempArtifactsDir, contractName, forgeArtifact.Abi, []byte(forgeArtifact.Bytecode.Object.String()))
-		if err != nil {
-			return err
-		}
-
-		err = genContractBindings(generator.Logger, generator.MonorepoBasePath, abiFilePath, bytecodeFilePath, generator.BindingsPackageName, contractName)
-		if err != nil {
-			return err
-		}
-
-		deployedSourceMap, canonicalStorageStr, err := generator.canonicalizeStorageLayout(forgeArtifact, sourceMapsSet, contractName)
-		if err != nil {
-			return err
-		}
-
-		re := regexp.MustCompile(`\s+`)
-		immutableRefs, err := json.Marshal(re.ReplaceAllString(string(forgeArtifact.DeployedBytecode.ImmutableReferences), ""))
-		if err != nil {
-			return fmt.Errorf("error marshaling immutable references: %w", err)
-		}
-
-		hasImmutables := string(immutableRefs) != `""`
-
-		contractMetaData := localContractMetadata{
-			Name:                   contractName,
-			StorageLayout:          canonicalStorageStr,
-			DeployedBin:            forgeArtifact.DeployedBytecode.Object.String(),
-			Package:                generator.BindingsPackageName,
-			DeployedSourceMap:      deployedSourceMap,
-			HasImmutableReferences: hasImmutables,
-		}
-
-		if err := generator.writeContractMetadata(contractMetaData, contractName, contractMetadataFileTemplate); err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
-
-func (generator *BindGenGeneratorLocal) getContractArtifactPaths() (map[string]string, error) {
-	// If some contracts have the same name then the path to their
-	// artifact depends on their full import path. Scan over all artifacts
-	// and hold a mapping from the contract name to the contract path.
-	// Walk walks the directory deterministically, so the earliest instance
-	// of the contract with the same name will be used
-	artifactPaths := make(map[string]string)
-	if err := filepath.Walk(generator.ForgeArtifactsPath,
-		func(path string, info os.FileInfo, err error) error {
-			if err != nil {
-				return err
-			}
-
-			if strings.HasSuffix(path, ".json") {
-				base := filepath.Base(path)
-				name := strings.TrimSuffix(base, ".json")
-
-				// remove the compiler version from the name
-				re := regexp.MustCompile(`\.\d+\.\d+\.\d+`)
-				sanitized := re.ReplaceAllString(name, "")
-				_, ok := artifactPaths[sanitized]
-				if !ok {
-					artifactPaths[sanitized] = path
-				} else {
-					generator.Logger.Warn("Multiple versions of forge artifacts exist, using lesser version", "contract", sanitized)
-				}
-			}
-			return nil
-		}); err != nil {
-		return artifactPaths, err
-	}
-
-	return artifactPaths, nil
-}
-
-func (generator *BindGenGeneratorLocal) readForgeArtifact(contractName string, contractArtifactPaths map[string]string) (foundry.Artifact, error) {
-	var forgeArtifact foundry.Artifact
-
-	contractArtifactPath := path.Join(generator.ForgeArtifactsPath, contractName+".sol", contractName+".json")
-	forgeArtifactRaw, err := os.ReadFile(contractArtifactPath)
-	if errors.Is(err, os.ErrNotExist) {
-		generator.Logger.Debug("Cannot find forge-artifact at standard path, trying provided path", "contract", contractName, "standardPath", contractArtifactPath, "providedPath", contractArtifactPaths[contractName])
-		contractArtifactPath = contractArtifactPaths[contractName]
-		forgeArtifactRaw, err = os.ReadFile(contractArtifactPath)
-		if errors.Is(err, os.ErrNotExist) {
-			return forgeArtifact, fmt.Errorf("cannot find forge-artifact of %q", contractName)
-		}
-	}
-
-	generator.Logger.Debug("Using forge-artifact", "path", contractArtifactPath)
-	if err := json.Unmarshal(forgeArtifactRaw, &forgeArtifact); err != nil {
-		return forgeArtifact, fmt.Errorf("failed to parse forge artifact of %q: %w", contractName, err)
-	}
-
-	return forgeArtifact, nil
-}
-
-func (generator *BindGenGeneratorLocal) canonicalizeStorageLayout(forgeArtifact foundry.Artifact, sourceMapsSet map[string]struct{}, contractName string) (string, string, error) {
-	artifactStorageStruct := forgeArtifact.StorageLayout
-	canonicalStorageStruct := ast.CanonicalizeASTIDs(&artifactStorageStruct, generator.MonorepoBasePath)
-	canonicalStorageJson, err := json.Marshal(canonicalStorageStruct)
-	if err != nil {
-		return "", "", fmt.Errorf("error marshaling canonical storage: %w", err)
-	}
-	canonicalStorageStr := strings.Replace(string(canonicalStorageJson), "\"", "\\\"", -1)
-
-	deployedSourceMap := ""
-	if _, ok := sourceMapsSet[contractName]; ok {
-		deployedSourceMap = forgeArtifact.DeployedBytecode.SourceMap
-	}
-
-	return deployedSourceMap, canonicalStorageStr, nil
-}
-
-func (generator *BindGenGeneratorLocal) writeContractMetadata(contractMetaData localContractMetadata, contractName string, fileTemplate *template.Template) error {
-	metadataFilePath := filepath.Join(generator.MetadataOut, strings.ToLower(contractName)+"_more.go")
-	metadataFile, err := os.OpenFile(
-		metadataFilePath,
-		os.O_RDWR|os.O_CREATE|os.O_TRUNC,
-		0o600,
-	)
-	if err != nil {
-		return fmt.Errorf("error opening %s's metadata file at %s: %w", contractName, metadataFilePath, err)
-	}
-	defer metadataFile.Close()
-
-	if err := fileTemplate.Execute(metadataFile, contractMetaData); err != nil {
-		return fmt.Errorf("error writing %s's contract metadata at %s: %w", contractName, metadataFilePath, err)
-	}
-
-	generator.Logger.Debug("Successfully wrote contract metadata", "contract", contractName, "path", metadataFilePath)
-	return nil
-}
-
-// associated with a local Ethereum contract. This template is used to produce
-// Go code containing necessary constants and initialization logic for the contract's
-// storage layout, deployed bytecode, and optionally its deployed source map.
-//
-// The template expects the following fields to be provided:
-// - Package: The name of the Go package for the generated bindings.
-// - Name: The name of the contract.
-// - StorageLayout: Canonicalized storage layout of the contract as a JSON string.
-// - DeployedBin: The deployed bytecode of the contract.
-// - DeployedSourceMap (optional): The source map of the deployed contract.
-var localContractMetadataTemplate = `// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package {{.Package}}
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const {{.Name}}StorageLayoutJSON = "{{.StorageLayout}}"
-
-var {{.Name}}StorageLayout = new(solc.StorageLayout)
-
-var {{.Name}}DeployedBin = "{{.DeployedBin}}"
-{{if .DeployedSourceMap}}
-var {{.Name}}DeployedSourceMap = "{{.DeployedSourceMap}}"
-{{end}}
-
-func init() {
-	if err := json.Unmarshal([]byte({{.Name}}StorageLayoutJSON), {{.Name}}StorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["{{.Name}}"] = {{.Name}}StorageLayout
-	deployedBytecodes["{{.Name}}"] = {{.Name}}DeployedBin
-	immutableReferences["{{.Name}}"] = {{.HasImmutableReferences}}
-}
-`
diff --git a/op-bindings/bindgen/generator_remote.go b/op-bindings/bindgen/generator_remote.go
deleted file mode 100644
index 43c073d19b38..000000000000
--- a/op-bindings/bindgen/generator_remote.go
+++ /dev/null
@@ -1,129 +0,0 @@
-package bindgen
-
-import (
-	"context"
-	"fmt"
-	"os"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/etherscan"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/ethclient"
-)
-
-type BindGenGeneratorRemote struct {
-	BindGenGeneratorBase
-	ContractDataClients struct {
-		Eth contractDataClient
-		Op  contractDataClient
-	}
-	RpcClients struct {
-		Eth *ethclient.Client
-		Op  *ethclient.Client
-	}
-	tempArtifactsDir string
-}
-
-type contractDataClient interface {
-	FetchAbi(ctx context.Context, address string) (string, error)
-	FetchDeployedBytecode(ctx context.Context, address string) (string, error)
-	FetchDeploymentTxHash(ctx context.Context, address string) (string, error)
-	FetchDeploymentTx(ctx context.Context, txHash string) (etherscan.Transaction, error)
-}
-
-type Deployments struct {
-	Eth common.Address `json:"eth"`
-	Op  common.Address `json:"op"`
-}
-
-type RemoteContract struct {
-	Name           string         `json:"name"`
-	Verified       bool           `json:"verified"`
-	Deployments    Deployments    `json:"deployments"`
-	DeploymentSalt string         `json:"deploymentSalt"`
-	Deployer       common.Address `json:"deployer"`
-	ABI            string         `json:"abi"`
-	InitBytecode   string         `json:"initBytecode"`
-}
-
-type RemoteContractMetadata struct {
-	RemoteContract
-	Package     string
-	InitBin     string
-	DeployedBin string
-}
-
-func (generator *BindGenGeneratorRemote) GenerateBindings() error {
-	contracts, err := readContractList(generator.Logger, generator.ContractsListPath)
-	if err != nil {
-		return fmt.Errorf("error reading contract list %s: %w", generator.ContractsListPath, err)
-	}
-	if len(contracts.Remote) == 0 {
-		return fmt.Errorf("no contracts parsed from given contract list: %s", generator.ContractsListPath)
-	}
-
-	return generator.processContracts(contracts.Remote)
-}
-
-func (generator *BindGenGeneratorRemote) processContracts(contracts []RemoteContract) error {
-	var err error
-	generator.tempArtifactsDir, err = mkTempArtifactsDir(generator.Logger)
-	if err != nil {
-		return err
-	}
-	defer func() {
-		err := os.RemoveAll(generator.tempArtifactsDir)
-		if err != nil {
-			generator.Logger.Error("Error removing temporary artifact directory", "path", generator.tempArtifactsDir, "err", err.Error())
-		} else {
-			generator.Logger.Debug("Successfully removed temporary artifact directory")
-		}
-	}()
-
-	for _, contract := range contracts {
-		generator.Logger.Info("Generating bindings and metadata for remote contract", "contract", contract.Name)
-
-		contractMetadata := RemoteContractMetadata{
-			RemoteContract: RemoteContract{
-				Name:           contract.Name,
-				Deployments:    contract.Deployments,
-				DeploymentSalt: contract.DeploymentSalt,
-				ABI:            contract.ABI,
-				Verified:       contract.Verified,
-			},
-			Package: generator.BindingsPackageName,
-		}
-
-		var err error
-		switch contract.Name {
-		case "MultiCall3", "Safe_v130", "SafeL2_v130", "MultiSendCallOnly_v130",
-			"EntryPoint", "SafeSingletonFactory", "DeterministicDeploymentProxy":
-			err = generator.standardHandler(&contractMetadata)
-		case "Create2Deployer":
-			err = generator.create2DeployerHandler(&contractMetadata)
-		case "MultiSend_v130":
-			err = generator.multiSendHandler(&contractMetadata)
-		case "SenderCreator":
-			// The SenderCreator contract is deployed by EntryPoint, so the transaction data
-			// from the deployment transaction is for the entire EntryPoint deployment.
-			// So, we're manually providing the initialization bytecode
-			contractMetadata.InitBin = contract.InitBytecode
-			err = generator.senderCreatorHandler(&contractMetadata)
-		case "Permit2":
-			// Permit2 has an immutable Solidity variable that resolves to block.chainid,
-			// so we can't use the deployed bytecode, and instead must generate it
-			// at some later point not handled by BindGen.
-			// DeployerAddress is intended to be used to help deploy Permit2 at it's deterministic address
-			// to a chain set with the required id to be able to obtain a diff minimized deployed bytecode
-			contractMetadata.Deployer = contract.Deployer
-			err = generator.permit2Handler(&contractMetadata)
-		default:
-			err = fmt.Errorf("unknown contract: %s, don't know how to handle it", contract.Name)
-		}
-
-		if err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
diff --git a/op-bindings/bindgen/remote_handlers.go b/op-bindings/bindgen/remote_handlers.go
deleted file mode 100644
index 380f0d5e21b7..000000000000
--- a/op-bindings/bindgen/remote_handlers.go
+++ /dev/null
@@ -1,444 +0,0 @@
-package bindgen
-
-import (
-	"bytes"
-	"context"
-	"fmt"
-	"os"
-	"path/filepath"
-	"regexp"
-	"strings"
-	"text/template"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/etherscan"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/ethclient"
-)
-
-type ContractData struct {
-	Abi          string
-	DeployedBin  string
-	DeploymentTx etherscan.Transaction
-}
-
-func (generator *BindGenGeneratorRemote) standardHandler(contractMetadata *RemoteContractMetadata) error {
-	fetchedData, err := generator.FetchContractData(contractMetadata.Verified, "eth", contractMetadata.Deployments.Eth.Hex())
-	if err != nil {
-		return err
-	}
-
-	contractMetadata.DeployedBin = fetchedData.DeployedBin
-	if err = generator.CompareDeployedBytecodeWithRpc(contractMetadata, "eth"); err != nil {
-		return err
-	}
-	if err = generator.CompareDeployedBytecodeWithRpc(contractMetadata, "op"); err != nil {
-		return err
-	}
-
-	// If ABI was explicitly provided by config, don't overwrite
-	if contractMetadata.ABI == "" {
-		contractMetadata.ABI = fetchedData.Abi
-	} else if fetchedData.Abi != "" && contractMetadata.ABI != fetchedData.Abi {
-		generator.Logger.Debug("ABIs", "given", contractMetadata.ABI, "fetched", fetchedData.Abi)
-		return fmt.Errorf("the given ABI for %s differs from what was fetched from Etherscan", contractMetadata.Name)
-	}
-
-	if contractMetadata.InitBin, err = generator.removeDeploymentSalt(fetchedData.DeploymentTx.Input, contractMetadata.DeploymentSalt); err != nil {
-		return err
-	}
-
-	if err := generator.CompareInitBytecodeWithOp(contractMetadata, true); err != nil {
-		return fmt.Errorf("%s: %w", contractMetadata.Name, err)
-	}
-	if err := generator.CompareDeployedBytecodeWithOp(contractMetadata, true); err != nil {
-		return fmt.Errorf("%s: %w", contractMetadata.Name, err)
-	}
-
-	return generator.writeAllOutputs(contractMetadata, remoteContractMetadataTemplate)
-}
-
-func (generator *BindGenGeneratorRemote) create2DeployerHandler(contractMetadata *RemoteContractMetadata) error {
-	fetchedData, err := generator.FetchContractData(contractMetadata.Verified, "eth", contractMetadata.Deployments.Eth.Hex())
-	if err != nil {
-		return err
-	}
-
-	contractMetadata.ABI = fetchedData.Abi
-	contractMetadata.DeployedBin = fetchedData.DeployedBin
-	if contractMetadata.InitBin, err = generator.removeDeploymentSalt(fetchedData.DeploymentTx.Input, contractMetadata.DeploymentSalt); err != nil {
-		return err
-	}
-
-	// We're expecting the initialization bytecode for Create2Deployer to not match the init code on OP,
-	// because the deployment on OP has been overwritten by the Canyon hardfork, and the init code
-	// Etherscan returns for the OP deployment is from the initial outdated deployment.
-	// For context: https://github.com/ethereum-optimism/op-geth/pull/126
-	if err := generator.CompareInitBytecodeWithOp(contractMetadata, false); err != nil {
-		return fmt.Errorf("%s: %w", contractMetadata.Name, err)
-	}
-	if err := generator.CompareDeployedBytecodeWithOp(contractMetadata, true); err != nil {
-		return fmt.Errorf("%s: %w", contractMetadata.Name, err)
-	}
-
-	return generator.writeAllOutputs(contractMetadata, remoteContractMetadataTemplate)
-}
-
-func (generator *BindGenGeneratorRemote) multiSendHandler(contractMetadata *RemoteContractMetadata) error {
-	// MultiSend has an immutable that resolves to this(address).
-	// Because we're predeploying MultiSend to the same address as on OP,
-	// we can use the deployed bytecode directly for the predeploy
-	fetchedData, err := generator.FetchContractData(contractMetadata.Verified, "op", contractMetadata.Deployments.Op.Hex())
-	if err != nil {
-		return err
-	}
-
-	contractMetadata.ABI = fetchedData.Abi
-	contractMetadata.DeployedBin = fetchedData.DeployedBin
-	if err = generator.CompareDeployedBytecodeWithRpc(contractMetadata, "op"); err != nil {
-		return err
-	}
-	if contractMetadata.InitBin, err = generator.removeDeploymentSalt(fetchedData.DeploymentTx.Input, contractMetadata.DeploymentSalt); err != nil {
-		return err
-	}
-
-	return generator.writeAllOutputs(contractMetadata, remoteContractMetadataTemplate)
-}
-
-func (generator *BindGenGeneratorRemote) senderCreatorHandler(contractMetadata *RemoteContractMetadata) error {
-	var err error
-	contractMetadata.DeployedBin, err = generator.ContractDataClients.Eth.FetchDeployedBytecode(context.Background(), contractMetadata.Deployments.Eth.Hex())
-	if err != nil {
-		return fmt.Errorf("error fetching deployed bytecode: %w", err)
-	}
-	if err = generator.CompareDeployedBytecodeWithRpc(contractMetadata, "eth"); err != nil {
-		return err
-	}
-	if err = generator.CompareDeployedBytecodeWithRpc(contractMetadata, "op"); err != nil {
-		return err
-	}
-
-	// The SenderCreator contract is deployed by EntryPoint, so the transaction data
-	// from the deployment transaction is for the entire EntryPoint deployment.
-	// So, we're manually providing the initialization bytecode and therefore it isn't being compared here
-	if err := generator.CompareInitBytecodeWithOp(contractMetadata, false); err != nil {
-		return fmt.Errorf("%s: %w", contractMetadata.Name, err)
-	}
-	if err := generator.CompareDeployedBytecodeWithOp(contractMetadata, true); err != nil {
-		return fmt.Errorf("%s: %w", contractMetadata.Name, err)
-	}
-
-	return generator.writeAllOutputs(contractMetadata, remoteContractMetadataTemplate)
-}
-
-func (generator *BindGenGeneratorRemote) permit2Handler(contractMetadata *RemoteContractMetadata) error {
-	fetchedData, err := generator.FetchContractData(contractMetadata.Verified, "eth", contractMetadata.Deployments.Eth.Hex())
-	if err != nil {
-		return err
-	}
-
-	contractMetadata.ABI = fetchedData.Abi
-	contractMetadata.DeployedBin = fetchedData.DeployedBin
-	if contractMetadata.InitBin, err = generator.removeDeploymentSalt(fetchedData.DeploymentTx.Input, contractMetadata.DeploymentSalt); err != nil {
-		return err
-	}
-
-	if !strings.EqualFold(contractMetadata.Deployer.Hex(), fetchedData.DeploymentTx.To) {
-		return fmt.Errorf(
-			"expected deployer address: %s doesn't match the to address: %s for Permit2's proxy deployment transaction",
-			contractMetadata.Deployer.Hex(),
-			fetchedData.DeploymentTx.To,
-		)
-	}
-
-	if err := generator.CompareInitBytecodeWithOp(contractMetadata, true); err != nil {
-		return fmt.Errorf("%s: %w", contractMetadata.Name, err)
-	}
-	// We're asserting the deployed bytecode doesn't match, because Permit2 has immutable Solidity variables that
-	// are dependent on block.chainid
-	if err := generator.CompareDeployedBytecodeWithOp(contractMetadata, false); err != nil {
-		return fmt.Errorf("%s: %w", contractMetadata.Name, err)
-	}
-
-	return generator.writeAllOutputs(contractMetadata, permit2MetadataTemplate)
-}
-
-func (generator *BindGenGeneratorRemote) FetchContractData(contractVerified bool, chain, deploymentAddress string) (ContractData, error) {
-	var data ContractData
-	var err error
-
-	var client contractDataClient
-	switch chain {
-	case "eth":
-		client = generator.ContractDataClients.Eth
-	case "op":
-		client = generator.ContractDataClients.Op
-	default:
-		return data, fmt.Errorf("unknown chain, unable to retrieve a contract data client for chain: %s", chain)
-	}
-
-	if contractVerified {
-		data.Abi, err = client.FetchAbi(context.Background(), deploymentAddress)
-		if err != nil {
-			return ContractData{}, fmt.Errorf("error fetching ABI: %w", err)
-		}
-	}
-
-	data.DeployedBin, err = client.FetchDeployedBytecode(context.Background(), deploymentAddress)
-	if err != nil {
-		return ContractData{}, fmt.Errorf("error fetching deployed bytecode: %w", err)
-	}
-
-	deploymentTxHash, err := client.FetchDeploymentTxHash(context.Background(), deploymentAddress)
-	if err != nil {
-		return ContractData{}, fmt.Errorf("error fetching deployment transaction hash: %w", err)
-	}
-
-	data.DeploymentTx, err = client.FetchDeploymentTx(context.Background(), deploymentTxHash)
-	if err != nil {
-		return ContractData{}, fmt.Errorf("error fetching deployment transaction data: %w", err)
-	}
-
-	return data, nil
-}
-
-func (generator *BindGenGeneratorRemote) removeDeploymentSalt(deploymentData, deploymentSalt string) (string, error) {
-	if deploymentSalt == "" {
-		return deploymentData, nil
-	}
-
-	re, err := regexp.Compile(fmt.Sprintf("^0x(%s)", deploymentSalt))
-	if err != nil {
-		return "", fmt.Errorf("failed to compile regular expression: %w", err)
-	}
-	if !re.MatchString(deploymentData) {
-		return "", fmt.Errorf(
-			"expected salt: %s to be at the beginning of the contract initialization code: %s, but it wasn't",
-			deploymentSalt, deploymentData,
-		)
-	}
-	return re.ReplaceAllString(deploymentData, ""), nil
-}
-
-func (generator *BindGenGeneratorRemote) CompareInitBytecodeWithOp(contractMetadataEth *RemoteContractMetadata, initCodeShouldMatch bool) error {
-	if contractMetadataEth.InitBin == "" {
-		return fmt.Errorf("no initialization bytecode provided for ETH deployment for comparison")
-	}
-
-	var zeroAddress common.Address
-	if contractMetadataEth.Deployments.Op == zeroAddress {
-		return fmt.Errorf("no deployment address on Optimism provided for %s", contractMetadataEth.Name)
-	}
-
-	// Passing false here, because true will retrieve contract's ABI, but we don't need it for bytecode comparison
-	opContractData, err := generator.FetchContractData(false, "op", contractMetadataEth.Deployments.Op.Hex())
-	if err != nil {
-		return err
-	}
-
-	if opContractData.DeploymentTx.Input, err = generator.removeDeploymentSalt(opContractData.DeploymentTx.Input, contractMetadataEth.DeploymentSalt); err != nil {
-		return err
-	}
-
-	initCodeComparison := strings.EqualFold(contractMetadataEth.InitBin, opContractData.DeploymentTx.Input)
-	if initCodeShouldMatch && !initCodeComparison {
-		return fmt.Errorf(
-			"expected initialization bytecode to match on Ethereum and Optimism, but it doesn't. contract=%s bytecodeEth=%s bytecodeOp=%s",
-			contractMetadataEth.Name,
-			contractMetadataEth.InitBin,
-			opContractData.DeploymentTx.Input,
-		)
-	} else if !initCodeShouldMatch && initCodeComparison {
-		return fmt.Errorf(
-			"expected initialization bytecode on Ethereum to not match on Optimism, but it did. contract=%s bytecodeEth=%s bytecodeOp=%s",
-			contractMetadataEth.Name,
-			contractMetadataEth.InitBin,
-			opContractData.DeploymentTx.Input,
-		)
-	}
-
-	return nil
-}
-
-func (generator *BindGenGeneratorRemote) CompareDeployedBytecodeWithOp(contractMetadataEth *RemoteContractMetadata, deployedCodeShouldMatch bool) error {
-	if contractMetadataEth.DeployedBin == "" {
-		return fmt.Errorf("no deployed bytecode provided for ETH deployment for comparison")
-	}
-
-	var zeroAddress common.Address
-	if contractMetadataEth.Deployments.Op == zeroAddress {
-		return fmt.Errorf("no deployment address on Optimism provided for %s", contractMetadataEth.Name)
-	}
-
-	// Passing false here, because true will retrieve contract's ABI, but we don't need it for bytecode comparison
-	opContractData, err := generator.FetchContractData(false, "op", contractMetadataEth.Deployments.Op.Hex())
-	if err != nil {
-		return err
-	}
-
-	deployedCodeComparison := strings.EqualFold(contractMetadataEth.DeployedBin, opContractData.DeployedBin)
-	if deployedCodeShouldMatch && !deployedCodeComparison {
-		return fmt.Errorf(
-			"expected deployed bytecode to match on Ethereum and Optimism, but it doesn't. contract=%s bytecodeEth=%s bytecodeOp=%s",
-			contractMetadataEth.Name,
-			contractMetadataEth.DeployedBin,
-			opContractData.DeployedBin,
-		)
-	} else if !deployedCodeShouldMatch && deployedCodeComparison {
-		return fmt.Errorf(
-			"expected deployed bytecode on Ethereum to not match on Optimism, but it does. contract=%s bytecodeEth=%s bytecodeOp=%s",
-			contractMetadataEth.Name,
-			contractMetadataEth.DeployedBin,
-			opContractData.DeployedBin,
-		)
-	}
-
-	return nil
-}
-
-func (generator *BindGenGeneratorRemote) CompareDeployedBytecodeWithRpc(contractMetadata *RemoteContractMetadata, chain string) error {
-	var client *ethclient.Client
-	switch chain {
-	case "eth":
-		client = generator.RpcClients.Eth
-	case "op":
-		client = generator.RpcClients.Op
-	default:
-		return fmt.Errorf("unknown chain: %s, unable to retrieve a RPC client", chain)
-	}
-
-	var deployment common.Address
-	switch chain {
-	case "eth":
-		deployment = contractMetadata.Deployments.Eth
-	case "op":
-		deployment = contractMetadata.Deployments.Op
-	default:
-		generator.Logger.Warn("Unable to compare bytecode from Etherscan against RPC client, no deployment address provided for chain", "chain", chain)
-	}
-
-	if deployment != (common.Address{}) {
-		bytecode, err := client.CodeAt(context.Background(), common.HexToAddress(deployment.Hex()), nil)
-		if err != nil {
-			return fmt.Errorf("error getting deployed bytecode from RPC on chain: %s err: %w", chain, err)
-		}
-		bytecodeHex := common.Bytes2Hex(bytecode)
-		if !strings.EqualFold(strings.TrimPrefix(contractMetadata.DeployedBin, "0x"), bytecodeHex) {
-			return fmt.Errorf("%s deployment bytecode from RPC doesn't match bytecode from Etherscan. rpcBytecode: %s etherscanBytecode: %s", contractMetadata.Name, bytecodeHex, contractMetadata.DeployedBin)
-		}
-	}
-
-	return nil
-}
-
-func (generator *BindGenGeneratorRemote) writeAllOutputs(contractMetadata *RemoteContractMetadata, fileTemplate string) error {
-	abiFilePath, bytecodeFilePath, err := writeContractArtifacts(
-		generator.Logger, generator.tempArtifactsDir, contractMetadata.Name,
-		[]byte(contractMetadata.ABI), []byte(contractMetadata.InitBin),
-	)
-	if err != nil {
-		return err
-	}
-
-	err = genContractBindings(generator.Logger, generator.MonorepoBasePath, abiFilePath, bytecodeFilePath, generator.BindingsPackageName, contractMetadata.Name)
-	if err != nil {
-		return err
-	}
-
-	return generator.writeContractMetadata(
-		contractMetadata,
-		template.Must(template.New("RemoteContractMetadata").Parse(fileTemplate)),
-	)
-}
-
-func (generator *BindGenGeneratorRemote) writeContractMetadata(contractMetadata *RemoteContractMetadata, fileTemplate *template.Template) error {
-	metadataFilePath := filepath.Join(generator.MetadataOut, strings.ToLower(contractMetadata.Name)+"_more.go")
-
-	var existingOutput []byte
-	if _, err := os.Stat(metadataFilePath); err == nil {
-		existingOutput, err = os.ReadFile(metadataFilePath)
-		if err != nil {
-			return fmt.Errorf("error reading existing metadata output file, metadataFilePath: %s err: %w", metadataFilePath, err)
-		}
-	}
-
-	metadataFile, err := os.OpenFile(
-		metadataFilePath,
-		os.O_RDWR|os.O_CREATE|os.O_TRUNC,
-		0o600,
-	)
-	if err != nil {
-		return fmt.Errorf("error opening %s's metadata file at %s: %w", contractMetadata.Name, metadataFilePath, err)
-	}
-	defer metadataFile.Close()
-
-	if err := fileTemplate.Execute(metadataFile, contractMetadata); err != nil {
-		return fmt.Errorf("error writing %s's contract metadata at %s: %w", contractMetadata.Name, metadataFilePath, err)
-	}
-
-	if len(existingOutput) != 0 {
-		var newOutput []byte
-		newOutput, err = os.ReadFile(metadataFilePath)
-		if err != nil {
-			return fmt.Errorf("error reading new file: %w", err)
-		}
-
-		if bytes.Equal(existingOutput, newOutput) {
-			generator.Logger.Debug("No changes detected in the contract metadata", "contract", contractMetadata.Name)
-		} else {
-			generator.Logger.Warn("Changes detected in the contract metadata, old metadata has been overwritten", "contract", contractMetadata.Name)
-		}
-	} else {
-		generator.Logger.Debug("No existing contract metadata found, skipping comparison", "contract", contractMetadata.Name)
-	}
-
-	generator.Logger.Debug("Successfully wrote contract metadata", "contract", contractMetadata.Name, "path", metadataFilePath)
-	return nil
-}
-
-// remoteContractMetadataTemplate is a Go text template for generating the metadata
-// associated with a remotely sourced contracts.
-//
-// The template expects the following data to be provided:
-// - .Package: the name of the Go package.
-// - .Name: the name of the contract.
-// - .DeployedBin: the binary (hex-encoded) of the deployed contract.
-var remoteContractMetadataTemplate = `// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package {{.Package}}
-
-var {{.Name}}DeployedBin = "{{.DeployedBin}}"
-func init() {
-	deployedBytecodes["{{.Name}}"] = {{.Name}}DeployedBin
-}
-`
-
-// permit2MetadataTemplate is a Go text template used to generate metadata
-// for remotely sourced Permit2 contract. Because Permit2 has an immutable
-// Solidity variables that depends on block.chainid, we can't use the deployed
-// bytecode, but instead need to generate it specifically for each chain.
-// To help with this, the metadata contains the initialization bytecode, the
-// deployer address, and the CREATE2 salt, so that deployment can be
-// replicated as closely as possible.
-//
-// The template expects the following data to be provided:
-// - .Package: the name of the Go package.
-// - .Name: the name of the contract.
-// - .InitBin: the binary (hex-encoded) of the contract's initialization code.
-// - .DeploymentSalt: the salt used during the contract's deployment.
-// - .Deployer: the Ethereum address of the contract's deployer.
-var permit2MetadataTemplate = `// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package {{.Package}}
-
-var {{.Name}}InitBin = "{{.InitBin}}"
-var {{.Name}}DeploymentSalt = "{{.DeploymentSalt}}"
-var {{.Name}}Deployer = "{{.Deployer}}"
-
-func init() {
-	initBytecodes["{{.Name}}"] = {{.Name}}InitBin
-	deploymentSalts["{{.Name}}"] = {{.Name}}DeploymentSalt
-	deployers["{{.Name}}"] = {{.Name}}Deployer
-}
-`
diff --git a/op-bindings/bindgen/remote_handlers_test.go b/op-bindings/bindgen/remote_handlers_test.go
deleted file mode 100644
index 43248db20b57..000000000000
--- a/op-bindings/bindgen/remote_handlers_test.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package bindgen
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/require"
-)
-
-var generator BindGenGeneratorRemote = BindGenGeneratorRemote{}
-
-func TestRemoveDeploymentSalt(t *testing.T) {
-	for _, tt := range removeDeploymentSaltTests {
-		t.Run(tt.name, func(t *testing.T) {
-			got, _ := generator.removeDeploymentSalt(tt.deploymentData, tt.deploymentSalt)
-			require.Equal(t, tt.expected, got)
-		})
-	}
-}
-
-func TestRemoveDeploymentSaltFailures(t *testing.T) {
-	for _, tt := range removeDeploymentSaltTestsFailures {
-		t.Run(tt.name, func(t *testing.T) {
-			_, err := generator.removeDeploymentSalt(tt.deploymentData, tt.deploymentSalt)
-			require.Equal(t, err.Error(), tt.expectedError)
-		})
-	}
-}
diff --git a/op-bindings/bindgen/utils.go b/op-bindings/bindgen/utils.go
deleted file mode 100644
index 8ea2f99dc01f..000000000000
--- a/op-bindings/bindgen/utils.go
+++ /dev/null
@@ -1,229 +0,0 @@
-package bindgen
-
-import (
-	"bufio"
-	"bytes"
-	"encoding/json"
-	"fmt"
-	"io"
-	"os"
-	"os/exec"
-	"path"
-	"strings"
-
-	"github.com/ethereum/go-ethereum/log"
-)
-
-type BindGenGeneratorBase struct {
-	MetadataOut         string
-	BindingsPackageName string
-	MonorepoBasePath    string
-	ContractsListPath   string
-	Logger              log.Logger
-}
-
-type contractsList struct {
-	Local  []string         `json:"local"`
-	Remote []RemoteContract `json:"remote"`
-}
-
-// readContractList reads a JSON file from the given `filePath` and unmarshals
-// its content into the provided result interface. It logs the path of the file
-// being read.
-//
-// Parameters:
-// - logger: An instance of go-ethereum/log
-// - filePath: The path to the JSON file to be read.
-// - result: A pointer to the structure where the JSON data will be unmarshaled.
-//
-// Returns:
-// - An error if reading the file or unmarshaling fails, nil otherwise.
-func readContractList(logger log.Logger, filePath string) (contractsList, error) {
-	logger.Debug("Reading contract list", "filePath", filePath)
-
-	var contracts contractsList
-	contractData, err := os.ReadFile(filePath)
-	if err != nil {
-		return contracts, err
-	}
-
-	return contracts, json.Unmarshal(contractData, &contracts)
-}
-
-// mkTempArtifactsDir creates a temporary directory with a "op-bindings" prefix
-// for holding contract artifacts. The path to the created directory is logged.
-//
-// Parameters:
-// - logger: An instance of go-ethereum/log
-//
-// Returns:
-// - The path to the created temporary directory.
-// - An error if the directory creation fails, nil otherwise.
-func mkTempArtifactsDir(logger log.Logger) (string, error) {
-	dir, err := os.MkdirTemp("", "op-bindings")
-	if err != nil {
-		return "", err
-	}
-
-	logger.Debug("Created temporary artifacts directory", "dir", dir)
-	return dir, nil
-}
-
-// writeContractArtifacts writes the provided ABI and bytecode data to respective
-// files in the specified temporary directory. The naming convention for these
-// files is based on the provided contract name. The ABI data is written to a file
-// with a ".abi" extension, and the bytecode data is written to a file with a ".bin"
-// extension.
-//
-// Parameters:
-// - logger: An instance of go-ethereum/log
-// - tempDirPath: The directory path where the ABI and bytecode files will be written.
-// - contractName: The name of the contract, used to create the filenames.
-// - abi: The ABI data of the contract.
-// - bytecode: The bytecode of the contract.
-//
-// Returns:
-// - The full path to the written ABI file.
-// - The full path to the written bytecode file.
-// - An error if writing either file fails, nil otherwise.
-func writeContractArtifacts(logger log.Logger, tempDirPath, contractName string, abi, bytecode []byte) (string, string, error) {
-	logger.Debug("Writing ABI and bytecode to temporary artifacts directory", "contractName", contractName, "tempDirPath", tempDirPath)
-
-	abiFilePath := path.Join(tempDirPath, contractName+".abi")
-	if err := os.WriteFile(abiFilePath, abi, 0o600); err != nil {
-		return "", "", fmt.Errorf("error writing %s's ABI file: %w", contractName, err)
-	}
-
-	bytecodeFilePath := path.Join(tempDirPath, contractName+".bin")
-	if err := os.WriteFile(bytecodeFilePath, bytecode, 0o600); err != nil {
-		return "", "", fmt.Errorf("error writing %s's bytecode file: %w", contractName, err)
-	}
-
-	return abiFilePath, bytecodeFilePath, nil
-}
-
-// genContractBindings generates Go bindings for an Ethereum contract using
-// the provided ABI and bytecode files. The bindings are generated using the
-// `abigen` tool and are written to the specified Go package directory. The
-// generated file's name is based on the provided contract name and will have
-// a ".go" extension. The generated bindings will be part of the provided Go
-// package.
-//
-// Parameters:
-// - logger: An instance of go-ethereum/log
-// - abiFilePath: The path to the ABI file for the contract.
-// - bytecodeFilePath: The path to the bytecode file for the contract.
-// - goPackageName: The name of the Go package where the bindings will be written.
-// - contractName: The name of the contract, used for naming the output file and
-// defining the type in the generated bindings.
-//
-// Returns:
-// - An error if there's an issue during any step of the binding generation process,
-// nil otherwise.
-//
-// Note: This function relies on the external `abigen` tool, which should be
-// installed and available in the system's PATH.
-func genContractBindings(logger log.Logger, monorepoRootPath, abiFilePath, bytecodeFilePath, goPackageName, contractName string) error {
-	cwd, err := os.Getwd()
-	if err != nil {
-		return fmt.Errorf("error getting cwd: %w", err)
-	}
-
-	outFilePath := path.Join(cwd, goPackageName, strings.ToLower(contractName)+".go")
-
-	var existingOutput []byte
-	if _, err := os.Stat(outFilePath); err == nil {
-		existingOutput, err = os.ReadFile(outFilePath)
-		if err != nil {
-			return fmt.Errorf("error reading existing bindings output file, outFilePath: %s err: %w", outFilePath, err)
-		}
-	}
-
-	if monorepoRootPath != "" {
-		logger.Debug("Checking abigen version")
-
-		// Fetch installed abigen version (format: abigen version X.Y.Z--)
-		cmd := exec.Command("abigen", "--version")
-		var versionBuf bytes.Buffer
-		cmd.Stdout = bufio.NewWriter(&versionBuf)
-		if err := cmd.Run(); err != nil {
-			return fmt.Errorf("error fetching abigen version: %w", err)
-		}
-		abigenVersion := bytes.Trim(versionBuf.Bytes(), "\n")
-
-		// Fetch expected abigen version (format: vX.Y.Z)
-		expectedAbigenVersion, err := readExpectedAbigenVersion(monorepoRootPath)
-		if err != nil {
-			return fmt.Errorf("error fetching the expected abigen version: %w", err)
-		}
-
-		if !bytes.Contains(abigenVersion, []byte(expectedAbigenVersion)) {
-			return fmt.Errorf("abigen version mismatch, expected %s, got %s. Please run `pnpm install:abigen` in the monorepo root", expectedAbigenVersion, abigenVersion)
-		}
-	} else {
-		logger.Debug("No monorepo root path provided, skipping abigen version check")
-	}
-
-	logger.Debug("Generating contract bindings", "contractName", contractName, "outFilePath", outFilePath)
-	cmd := exec.Command("abigen", "--abi", abiFilePath, "--bin", bytecodeFilePath, "--pkg", goPackageName, "--type", contractName, "--out", outFilePath)
-	cmd.Stdout = os.Stdout
-	if err := cmd.Run(); err != nil {
-		return fmt.Errorf("error running abigen for %s: %w", contractName, err)
-	}
-
-	if len(existingOutput) != 0 {
-		newOutput, err := os.ReadFile(outFilePath)
-		if err != nil {
-			return fmt.Errorf("error reading new file: %w", err)
-		}
-
-		if bytes.Equal(existingOutput, newOutput) {
-			logger.Debug("No changes detected in the contract bindings", "contractName", contractName)
-		} else {
-			logger.Warn("Changes detected in the contract bindings, old bindings have been overwritten", "contractName", contractName)
-		}
-	} else {
-		logger.Debug("No existing contract bindings found, skipping comparison", "contractName", contractName)
-	}
-
-	return nil
-}
-
-// Versions is a struct for holding the versions of the tools used in the monorepo
-type Versions struct {
-	Abigen  string `json:"abigen"`
-	Foundry string `json:"foundry"`
-	Geth    string `json:"geth"`
-	Nvm     string `json:"nvm"`
-	Slither string `json:"slither"`
-	Kontrol string `json:"kontrol"`
-}
-
-// readExpectedAbigenVersion reads the expected abigen version from the monorepo's
-// versions.json file. This function will remove the 'v' prefix from the version
-// string.
-//
-// Parameters:
-// - monorepoRootPath: The path to the monorepo's root directory.
-//
-// Returns:
-// - The expected abigen version.
-// - An error if the versions.json file cannot be read or parsed, nil otherwise.
-func readExpectedAbigenVersion(monorepoRootPath string) (string, error) {
-	// Open the version control file
-	jsonFile, err := os.Open(path.Join(monorepoRootPath, "versions.json"))
-	if err != nil {
-		return "", fmt.Errorf("error reading versions.json file: %w", err)
-	}
-	defer jsonFile.Close()
-
-	// Parse the version control file
-	byteValue, _ := io.ReadAll(jsonFile)
-	var versions Versions
-	if err := json.Unmarshal(byteValue, &versions); err != nil {
-		return "", fmt.Errorf("error parsing versions.json file: %w", err)
-	}
-
-	// Trim the 'v' prefix from the version string
-	return strings.Trim(versions.Abigen, "v"), nil
-}
diff --git a/op-bindings/bindgen/utils_test.go b/op-bindings/bindgen/utils_test.go
deleted file mode 100644
index 33d511b76f23..000000000000
--- a/op-bindings/bindgen/utils_test.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package bindgen
-
-import (
-	"encoding/json"
-	"os"
-	"path"
-	"testing"
-
-	"github.com/stretchr/testify/require"
-)
-
-func TestReadExpectedAbigenVersion(t *testing.T) {
-	// Create a temporary directory for the version control file.
-	tmpDir := path.Join(os.TempDir(), "version-tests")
-	defer os.RemoveAll(tmpDir)
-	require.NoError(t, os.MkdirAll(tmpDir, 0755))
-
-	// Create a temporary version control file.
-	versionFile := path.Join(tmpDir, "versions.json")
-	versions := Versions{Abigen: "v1.2.3"}
-
-	// Marshal the versions to JSON.
-	versionsJSON, err := json.Marshal(versions)
-	require.NoError(t, err)
-
-	// Write the JSON to the version control file.
-	require.NoError(t, os.WriteFile(versionFile, versionsJSON, 0644))
-
-	// Read the expected version from the version control file.
-	// The read version should not have a "v" prefix.
-	expectedVersion, err := readExpectedAbigenVersion(tmpDir)
-	require.NoError(t, err)
-	require.Equal(t, expectedVersion, "1.2.3")
-}
diff --git a/op-bindings/bindings/addressmanager_more.go b/op-bindings/bindings/addressmanager_more.go
deleted file mode 100644
index 0bb85c7d9c85..000000000000
--- a/op-bindings/bindings/addressmanager_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const AddressManagerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/legacy/AddressManager.sol:AddressManager\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"src/legacy/AddressManager.sol:AddressManager\",\"label\":\"addresses\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_bytes32,t_address)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_address)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e address)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_address\"}}}"
-
-var AddressManagerStorageLayout = new(solc.StorageLayout)
-
-var AddressManagerDeployedBin = "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046104fa565b610106565b6100906100da366004610548565b6101d9565b6100746100ed366004610585565b610215565b6100fa6102d1565b6101046000610352565b565b61010e6102d1565b6000610119836103c7565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000008316179092559151929350169061017c9085906105a7565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006101e8846103c7565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b61021d6102d1565b73ffffffffffffffffffffffffffffffffffffffff81166102c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102ce81610352565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bc565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016103da91906105a7565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261043757600080fd5b813567ffffffffffffffff80821115610452576104526103f7565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610498576104986103f7565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b919050565b6000806040838503121561050d57600080fd5b823567ffffffffffffffff81111561052457600080fd5b61053085828601610426565b92505061053f602084016104d1565b90509250929050565b60006020828403121561055a57600080fd5b813567ffffffffffffffff81111561057157600080fd5b61057d84828501610426565b949350505050565b60006020828403121561059757600080fd5b6105a0826104d1565b9392505050565b6000825160005b818110156105c857602081860181015185830152016105ae565b818111156105d7576000828501525b50919091019291505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(AddressManagerStorageLayoutJSON), AddressManagerStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["AddressManager"] = AddressManagerStorageLayout
-	deployedBytecodes["AddressManager"] = AddressManagerDeployedBin
-	immutableReferences["AddressManager"] = false
-}
diff --git a/op-bindings/bindings/alphabetvm2_more.go b/op-bindings/bindings/alphabetvm2_more.go
deleted file mode 100644
index 50882f9f8655..000000000000
--- a/op-bindings/bindings/alphabetvm2_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const AlphabetVM2StorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"test/mocks/AlphabetVM2.sol:AlphabetVM2\",\"label\":\"oracle\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_contract(IPreimageOracle)1001\"}],\"types\":{\"t_contract(IPreimageOracle)1001\":{\"encoding\":\"inplace\",\"label\":\"contract IPreimageOracle\",\"numberOfBytes\":\"20\"}}}"
-
-var AlphabetVM2StorageLayout = new(solc.StorageLayout)
-
-var AlphabetVM2DeployedBin = "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80637dc0d1d01461003b578063e14ced3214610085575b600080fd5b60005461005b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610098610093366004610395565b6100a6565b60405190815260200161007c565b600080600060087f0000000000000000000000000000000000000000000000000000000000000000901b600889896040516100e2929190610409565b6040518091039020901b036101d9576000805473ffffffffffffffffffffffffffffffffffffffff1663e03110e161011b60048861029f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152600060248201526044016040805180830381865afa158015610175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101999190610419565b50640ffffffff0607c82901c169350905063ffffffff608082901c1660006101c38a8c018c61043d565b90506101cf8582610485565b9350505050610206565b6101e58789018961049d565b9092509050816101f4816104bf565b9250508080610202906104bf565b9150505b6040805160208101849052908101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001798975050505050505050565b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831617610345818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b60008083601f84011261035e57600080fd5b50813567ffffffffffffffff81111561037657600080fd5b60208301915083602082850101111561038e57600080fd5b9250929050565b6000806000806000606086880312156103ad57600080fd5b853567ffffffffffffffff808211156103c557600080fd5b6103d189838a0161034c565b909750955060208801359150808211156103ea57600080fd5b506103f78882890161034c565b96999598509660400135949350505050565b8183823760009101908152919050565b6000806040838503121561042c57600080fd5b505080516020909101519092909150565b60006020828403121561044f57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561049857610498610456565b500190565b600080604083850312156104b057600080fd5b50508035926020909101359150565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036104f0576104f0610456565b506001019056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(AlphabetVM2StorageLayoutJSON), AlphabetVM2StorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["AlphabetVM2"] = AlphabetVM2StorageLayout
-	deployedBytecodes["AlphabetVM2"] = AlphabetVM2DeployedBin
-	immutableReferences["AlphabetVM2"] = true
-}
diff --git a/op-bindings/bindings/alphabetvm_more.go b/op-bindings/bindings/alphabetvm_more.go
deleted file mode 100644
index 7f4302fbc669..000000000000
--- a/op-bindings/bindings/alphabetvm_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const AlphabetVMStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"test/mocks/AlphabetVM.sol:AlphabetVM\",\"label\":\"oracle\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_contract(IPreimageOracle)1001\"}],\"types\":{\"t_contract(IPreimageOracle)1001\":{\"encoding\":\"inplace\",\"label\":\"contract IPreimageOracle\",\"numberOfBytes\":\"20\"}}}"
-
-var AlphabetVMStorageLayout = new(solc.StorageLayout)
-
-var AlphabetVMDeployedBin = "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80637dc0d1d01461003b578063e14ced3214610085575b600080fd5b60005461005b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61009861009336600461039c565b6100a6565b60405190815260200161007c565b600080600060087f0000000000000000000000000000000000000000000000000000000000000000901b600889896040516100e2929190610410565b6040518091039020901b036101e0576000805473ffffffffffffffffffffffffffffffffffffffff1663e03110e161011b6004886102a6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152600060248201526044016040805180830381865afa158015610175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101999190610420565b50905060006101b3600163ffffffff608085901c16610473565b600481901b9450905060006101ca8a8c018c61048a565b90506101d685826104a3565b935050505061020d565b6101ec878901896104bb565b9092509050816101fb816104dd565b9250508080610209906104dd565b9150505b6040805160208101849052908101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001798975050505050505050565b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83161761034c818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b60008083601f84011261036557600080fd5b50813567ffffffffffffffff81111561037d57600080fd5b60208301915083602082850101111561039557600080fd5b9250929050565b6000806000806000606086880312156103b457600080fd5b853567ffffffffffffffff808211156103cc57600080fd5b6103d889838a01610353565b909750955060208801359150808211156103f157600080fd5b506103fe88828901610353565b96999598509660400135949350505050565b8183823760009101908152919050565b6000806040838503121561043357600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561048557610485610444565b500390565b60006020828403121561049c57600080fd5b5035919050565b600082198211156104b6576104b6610444565b500190565b600080604083850312156104ce57600080fd5b50508035926020909101359150565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361050e5761050e610444565b506001019056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(AlphabetVMStorageLayoutJSON), AlphabetVMStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["AlphabetVM"] = AlphabetVMStorageLayout
-	deployedBytecodes["AlphabetVM"] = AlphabetVMDeployedBin
-	immutableReferences["AlphabetVM"] = true
-}
diff --git a/op-bindings/bindings/basefeevault_more.go b/op-bindings/bindings/basefeevault_more.go
deleted file mode 100644
index 39bcd68c22c2..000000000000
--- a/op-bindings/bindings/basefeevault_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const BaseFeeVaultStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L2/BaseFeeVault.sol:BaseFeeVault\",\"label\":\"totalProcessed\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint256\"}],\"types\":{\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}"
-
-var BaseFeeVaultStorageLayout = new(solc.StorageLayout)
-
-var BaseFeeVaultDeployedBin = "0x6080604052600436106100695760003560e01c806384411d651161004357806384411d6514610140578063d0e12f9014610164578063d3e5792b146101a557600080fd5b80630d9019e1146100755780633ccfd60b146100d357806354fd4d50146100ea57600080fd5b3661007057005b600080fd5b34801561008157600080fd5b506100a97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156100df57600080fd5b506100e86101d9565b005b3480156100f657600080fd5b506101336040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b6040516100ca9190610630565b34801561014c57600080fd5b5061015660005481565b6040519081526020016100ca565b34801561017057600080fd5b506101987f000000000000000000000000000000000000000000000000000000000000000081565b6040516100ca91906106b4565b3480156101b157600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b7f00000000000000000000000000000000000000000000000000000000000000004710156102b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6000479050806000808282546102ca91906106c8565b9091555050604080518281527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166020820152338183015290517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee817f0000000000000000000000000000000000000000000000000000000000000000337f00000000000000000000000000000000000000000000000000000000000000006040516103b89493929190610707565b60405180910390a160017f000000000000000000000000000000000000000000000000000000000000000060018111156103f4576103f461064a565b0361050d5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610473576040519150601f19603f3d011682016040523d82523d6000602084013e610478565b606091505b5050905080610509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016102ab565b5050565b604080516020810182526000815290517fe11013dd0000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109163e11013dd918491610590917f0000000000000000000000000000000000000000000000000000000000000000916188b891600401610748565b6000604051808303818588803b1580156105a957600080fd5b505af11580156105bd573d6000803e3d6000fd5b505050505050565b6000815180845260005b818110156105eb576020818501810151868301820152016105cf565b818111156105fd576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061064360208301846105c5565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106106b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b602081016106c28284610679565b92915050565b60008219821115610702577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff8481166020830152831660408201526080810161073f6060830184610679565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815263ffffffff8316602082015260606040820152600061073f60608301846105c556fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(BaseFeeVaultStorageLayoutJSON), BaseFeeVaultStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["BaseFeeVault"] = BaseFeeVaultStorageLayout
-	deployedBytecodes["BaseFeeVault"] = BaseFeeVaultDeployedBin
-	immutableReferences["BaseFeeVault"] = true
-}
diff --git a/op-bindings/bindings/create2deployer_more.go b/op-bindings/bindings/create2deployer_more.go
deleted file mode 100644
index 396d0fe6ed29..000000000000
--- a/op-bindings/bindings/create2deployer_more.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-var Create2DeployerDeployedBin = "0x6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033"
-func init() {
-	deployedBytecodes["Create2Deployer"] = Create2DeployerDeployedBin
-}
diff --git a/op-bindings/bindings/crossdomainmessenger_more.go b/op-bindings/bindings/crossdomainmessenger_more.go
deleted file mode 100644
index 6e603a1fb9e5..000000000000
--- a/op-bindings/bindings/crossdomainmessenger_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const CrossDomainMessengerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"spacer_0_0_20\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"_initialized\",\"offset\":20,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1002,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"_initializing\",\"offset\":21,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1003,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"spacer_1_0_1600\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)50_storage\"},{\"astId\":1004,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"spacer_51_0_20\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1005,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"spacer_52_0_1568\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1006,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"spacer_101_0_1\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":1007,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"spacer_102_0_1568\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1008,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"spacer_151_0_32\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"spacer_152_0_1568\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1010,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"spacer_201_0_32\",\"offset\":0,\"slot\":\"201\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1011,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"spacer_202_0_32\",\"offset\":0,\"slot\":\"202\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1012,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"successfulMessages\",\"offset\":0,\"slot\":\"203\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1013,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"xDomainMsgSender\",\"offset\":0,\"slot\":\"204\",\"type\":\"t_address\"},{\"astId\":1014,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"msgNonce\",\"offset\":0,\"slot\":\"205\",\"type\":\"t_uint240\"},{\"astId\":1015,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"failedMessages\",\"offset\":0,\"slot\":\"206\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1016,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"otherMessenger\",\"offset\":0,\"slot\":\"207\",\"type\":\"t_contract(CrossDomainMessenger)1018\"},{\"astId\":1017,\"contract\":\"src/universal/CrossDomainMessenger.sol:CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"208\",\"type\":\"t_array(t_uint256)43_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)43_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[43]\",\"numberOfBytes\":\"1376\",\"base\":\"t_uint256\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_array(t_uint256)50_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_contract(CrossDomainMessenger)1018\":{\"encoding\":\"inplace\",\"label\":\"contract CrossDomainMessenger\",\"numberOfBytes\":\"20\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_uint240\":{\"encoding\":\"inplace\",\"label\":\"uint240\",\"numberOfBytes\":\"30\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var CrossDomainMessengerStorageLayout = new(solc.StorageLayout)
-
-var CrossDomainMessengerDeployedBin = "0x"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(CrossDomainMessengerStorageLayoutJSON), CrossDomainMessengerStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["CrossDomainMessenger"] = CrossDomainMessengerStorageLayout
-	deployedBytecodes["CrossDomainMessenger"] = CrossDomainMessengerDeployedBin
-	immutableReferences["CrossDomainMessenger"] = false
-}
diff --git a/op-bindings/bindings/dataavailabilitychallenge_more.go b/op-bindings/bindings/dataavailabilitychallenge_more.go
deleted file mode 100644
index 01d69710123b..000000000000
--- a/op-bindings/bindings/dataavailabilitychallenge_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const DataAvailabilityChallengeStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)50_storage\"},{\"astId\":1003,\"contract\":\"src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1005,\"contract\":\"src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge\",\"label\":\"challengeWindow\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge\",\"label\":\"resolveWindow\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_uint256\"},{\"astId\":1007,\"contract\":\"src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge\",\"label\":\"bondSize\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge\",\"label\":\"resolverRefundPercentage\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge\",\"label\":\"balances\",\"offset\":0,\"slot\":\"105\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1010,\"contract\":\"src/L1/DataAvailabilityChallenge.sol:DataAvailabilityChallenge\",\"label\":\"challenges\",\"offset\":0,\"slot\":\"106\",\"type\":\"t_mapping(t_uint256,t_mapping(t_bytes_memory_ptr,t_struct(Challenge)1011_storage))\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_array(t_uint256)50_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes_memory_ptr\":{\"encoding\":\"bytes\",\"label\":\"bytes\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_mapping(t_bytes_memory_ptr,t_struct(Challenge)1011_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes =\u003e struct Challenge)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes_memory_ptr\",\"value\":\"t_struct(Challenge)1011_storage\"},\"t_mapping(t_uint256,t_mapping(t_bytes_memory_ptr,t_struct(Challenge)1011_storage))\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e mapping(bytes =\u003e struct Challenge))\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_mapping(t_bytes_memory_ptr,t_struct(Challenge)1011_storage)\"},\"t_struct(Challenge)1011_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Challenge\",\"numberOfBytes\":\"128\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var DataAvailabilityChallengeStorageLayout = new(solc.StorageLayout)
-
-var DataAvailabilityChallengeDeployedBin = "0x6080604052600436106101845760003560e01c8063848afb3d116100d6578063956118521161007f578063d7d04e5411610059578063d7d04e5414610459578063f2fde38b14610479578063f92ad2191461049957600080fd5b80639561185214610427578063a03aafbf1461043e578063d0e30db01461045157600080fd5b80638ecb85e1116100b05780638ecb85e1146103d157806393988233146103e757806393fb19441461040757600080fd5b8063848afb3d1461031d578063861a1412146103865780638da5cb5b1461039c57600080fd5b80634ebaf3ce11610138578063715018a611610112578063715018a6146102bb57806379e8a8b3146102d05780637ae929d9146102fd57600080fd5b80634ebaf3ce1461023957806354fd4d501461024f5780637099c581146102a557600080fd5b806327e235e31161016957806327e235e3146101d7578063336409fd146102045780633ccfd60b1461022457600080fd5b806321cf39ee1461019857806323c30f59146101c157600080fd5b36610193576101916104b9565b005b600080fd5b3480156101a457600080fd5b506101ae60665481565b6040519081526020015b60405180910390f35b3480156101cd57600080fd5b506101ae61410081565b3480156101e357600080fd5b506101ae6101f2366004611539565b60696020526000908152604090205481565b34801561021057600080fd5b5061019161021f366004611554565b610527565b34801561023057600080fd5b50610191610577565b34801561024557600080fd5b506101ae6103e881565b34801561025b57600080fd5b506102986040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101b891906115d8565b3480156102b157600080fd5b506101ae60675481565b3480156102c757600080fd5b50610191610611565b3480156102dc57600080fd5b506102f06102eb366004611634565b610625565b6040516101b891906116ea565b34801561030957600080fd5b506101916103183660046116f8565b6106e8565b34801561032957600080fd5b5061033d610338366004611634565b610884565b6040516101b89190815173ffffffffffffffffffffffffffffffffffffffff16815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561039257600080fd5b506101ae60655481565b3480156103a857600080fd5b5060335460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b8565b3480156103dd57600080fd5b506101ae60685481565b3480156103f357600080fd5b50610191610402366004611634565b610940565b34801561041357600080fd5b50610191610422366004611772565b610a72565b34801561043357600080fd5b506101ae62011cdd81565b61019161044c366004611634565b610b0f565b6101916104b9565b34801561046557600080fd5b50610191610474366004611554565b610d58565b34801561048557600080fd5b50610191610494366004611539565b610d9b565b3480156104a557600080fd5b506101916104b43660046117b4565b610e52565b33600090815260696020526040812080543492906104d8908490611825565b909155505033600081815260696020908152604091829020548251938452908301527fa448afda7ea1e3a7a10fcab0c29fe9a9dd85791503bf0171f281521551c7ec05910160405180910390a1565b61052f61102a565b6064811115610572576040517f16aa4e80000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b606855565b336000818152606960209081526040808320805490849055815194855291840192909252917fa448afda7ea1e3a7a10fcab0c29fe9a9dd85791503bf0171f281521551c7ec05910160405180910390a160006105d4335a846110ab565b90508061060d576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b61061961102a565b61062360006110c1565b565b6000838152606a60205260408082209051829190610646908690869061183d565b9081526040805160209281900383018120608082018352805473ffffffffffffffffffffffffffffffffffffffff16808352600182015494830194909452600281015492820192909252600390910154606082015291506106ab5760009150506106e1565b6060810151156106bf5760029150506106e1565b6106cc8160400151611138565b156106db5760019150506106e1565b60039150505b9392505050565b6106f28484610a72565b60016106ff868686610625565b600381111561071057610710611680565b14610747576040517fbeb11d3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107538585611151565b9050606060ff82166107a15761079e84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061116992505050565b90505b85856040516107b192919061183d565b60405180910390208180519060200120146107fe578086866040517f1a0bbf9f00000000000000000000000000000000000000000000000000000000815260040161056993929190611896565b6000878152606a6020526040808220905161081c908990899061183d565b908152604051908190036020018120436003820155915088907fc5d8c630ba2fdacb1db24c4599df78c7fb8cf97b5aecde34939597f6697bb1ad90610867908a908a906002906118c6565b60405180910390a261087a81853361119c565b5050505050505050565b6108c56040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081525090565b6000848152606a60205260409081902090516108e4908590859061183d565b908152604080519182900360209081018320608084018352805473ffffffffffffffffffffffffffffffffffffffff16845260018101549184019190915260028101549183019190915260030154606082015290509392505050565b600361094d848484610625565b600381111561095e5761095e611680565b14610995576040517f151f07fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152606a602052604080822090516109b3908590859061183d565b90815260408051602092819003830190206001810154815473ffffffffffffffffffffffffffffffffffffffff16600090815260699094529183208054919450919290610a01908490611825565b9091555050600060018201819055815473ffffffffffffffffffffffffffffffffffffffff1680825260696020908152604092839020548351928352908201527fa448afda7ea1e3a7a10fcab0c29fe9a9dd85791503bf0171f281521551c7ec05910160405180910390a150505050565b6000610a7e8383611151565b905060ff8116610ad85760218214610ad3576040517ffd9a7e5b000000000000000000000000000000000000000000000000000000008152600060048201526021602482015260448101839052606401610569565b505050565b6040517f81ff071300000000000000000000000000000000000000000000000000000000815260ff82166004820152602401610569565b610b198282610a72565b610b216104b9565b606754336000908152606960205260409020541015610b895733600090815260696020526040908190205460675491517e0155b50000000000000000000000000000000000000000000000000000000081526105699290600401918252602082015260400190565b6000610b96848484610625565b6003811115610ba757610ba7611680565b14610bde576040517f9bb6c64e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610be7836113bc565b610c1d576040517ff9e0d1f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6067543360009081526069602052604081208054909190610c3f9084906118f1565b9250508190555060405180608001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160675481526020014381526020016000815250606a60008581526020019081526020016000208383604051610ca392919061183d565b9081526040805160209281900383018120845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161781559284015160018085019190915591840151600284015560609093015160039092019190915584917fc5d8c630ba2fdacb1db24c4599df78c7fb8cf97b5aecde34939597f6697bb1ad91610d4b91869186916118c6565b60405180910390a2505050565b610d6061102a565b60678190556040518181527f4468d695a0389e5f9e8ef0c9aee6d84e74cc0d0e0a28c8413badb54697d1bbae9060200160405180910390a150565b610da361102a565b73ffffffffffffffffffffffffffffffffffffffff8116610e46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610569565b610e4f816110c1565b50565b600054610100900460ff1615808015610e725750600054600160ff909116105b80610e8c5750303b158015610e8c575060005460ff166001145b610f18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610569565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f7657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610f7e6113d6565b60658590556066849055610f9183610d58565b610f9a82610527565b610fa3866110c1565b801561100657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610569565b600080600080600080868989f195945050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000606654826111489190611825565b43111592915050565b600061115d8284611908565b60f81c90505b92915050565b80516020918201206040805160009381019390935260218084019290925280518084039092018252604190920190915290565b6001830154835473ffffffffffffffffffffffffffffffffffffffff166000486103e86111cb61410088611950565b6111d5919061198d565b6111e29062011cdd611825565b6111ec9190611950565b90508083111561129e5761120081846118f1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526069602052604081208054909190611235908490611825565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152606960209081526040918290205482519384529083015291935083917fa448afda7ea1e3a7a10fcab0c29fe9a9dd85791503bf0171f281521551c7ec05910160405180910390a15b60006064606854836112b09190611950565b6112ba919061198d565b9050838111156112c75750825b80156113745773ffffffffffffffffffffffffffffffffffffffff851660009081526069602052604081208054839290611302908490611825565b90915550611312905081856118f1565b73ffffffffffffffffffffffffffffffffffffffff8616600081815260696020908152604091829020548251938452908301529195507fa448afda7ea1e3a7a10fcab0c29fe9a9dd85791503bf0171f281521551c7ec05910160405180910390a15b83156113a95760405160009085156108fc0290869083818181858288f193505050501580156113a7573d6000803e3d6000fd5b505b6000876001018190555050505050505050565b600081431015801561116357506065546111489083611825565b600054610100900460ff1661146d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610569565b610623600054610100900460ff16611507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610569565b610623336110c1565b803573ffffffffffffffffffffffffffffffffffffffff8116811461153457600080fd5b919050565b60006020828403121561154b57600080fd5b6106e182611510565b60006020828403121561156657600080fd5b5035919050565b6000815180845260005b8181101561159357602081850181015186830182015201611577565b818111156115a5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006106e1602083018461156d565b60008083601f8401126115fd57600080fd5b50813567ffffffffffffffff81111561161557600080fd5b60208301915083602082850101111561162d57600080fd5b9250929050565b60008060006040848603121561164957600080fd5b83359250602084013567ffffffffffffffff81111561166757600080fd5b611673868287016115eb565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106116e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161116382846116af565b60008060008060006060868803121561171057600080fd5b85359450602086013567ffffffffffffffff8082111561172f57600080fd5b61173b89838a016115eb565b9096509450604088013591508082111561175457600080fd5b50611761888289016115eb565b969995985093965092949392505050565b6000806020838503121561178557600080fd5b823567ffffffffffffffff81111561179c57600080fd5b6117a8858286016115eb565b90969095509350505050565b600080600080600060a086880312156117cc57600080fd5b6117d586611510565b97602087013597506040870135966060810135965060800135945092505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611838576118386117f6565b500190565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6040815260006118a9604083018661156d565b82810360208401526118bc81858761184d565b9695505050505050565b6040815260006118da60408301858761184d565b90506118e960208301846116af565b949350505050565b600082821015611903576119036117f6565b500390565b7fff0000000000000000000000000000000000000000000000000000000000000081358181169160018510156119485780818660010360031b1b83161692505b505092915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611988576119886117f6565b500290565b6000826119c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(DataAvailabilityChallengeStorageLayoutJSON), DataAvailabilityChallengeStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["DataAvailabilityChallenge"] = DataAvailabilityChallengeStorageLayout
-	deployedBytecodes["DataAvailabilityChallenge"] = DataAvailabilityChallengeDeployedBin
-	immutableReferences["DataAvailabilityChallenge"] = false
-}
diff --git a/op-bindings/bindings/delayedvetoable_more.go b/op-bindings/bindings/delayedvetoable_more.go
deleted file mode 100644
index 447987519301..000000000000
--- a/op-bindings/bindings/delayedvetoable_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const DelayedVetoableStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_delay\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint256\"},{\"astId\":1001,\"contract\":\"src/L1/DelayedVetoable.sol:DelayedVetoable\",\"label\":\"_queuedAt\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_bytes32,t_uint256)\"}],\"types\":{\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}"
-
-var DelayedVetoableStorageLayout = new(solc.StorageLayout)
-
-var DelayedVetoableDeployedBin = "0x608060405234801561001057600080fd5b50600436106100725760003560e01c8063b912de5d11610050578063b912de5d14610111578063d4b8399214610124578063d8bff4401461012c57610072565b806354fd4d501461007c5780635c39fcc1146100ce5780636a42b8f8146100fb575b61007a610134565b005b6100b86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100c591906106a7565b60405180910390f35b6100d66104fb565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100c5565b610103610532565b6040519081526020016100c5565b61010361011f36600461071a565b610540565b6100d6610567565b6100d6610593565b361580156101425750600054155b15610298573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015906101c357503373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614155b1561023d576040517f295a81c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660048201523360248201526044015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060008190556040519081527febf28bfb587e28dfffd9173cf71c32ba5d3f0544a0117b5539c9b274a5bba2a89060200160405180910390a1565b600080366040516102aa929190610733565b60405190819003902090503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480156103065750600081815260016020526040902054155b1561036c5760005460000361031e5761031e816105bf565b6000818152600160205260408082204290555182917f87a332a414acbc7da074543639ce7ae02ff1ea72e88379da9f261b080beb5a139161036191903690610743565b60405180910390a250565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480156103be575060008181526001602052604090205415155b15610406576000818152600160205260408082208290555182917fbede6852c1d97d93ff557f676de76670cd0dec861e7fe8beb13aa0ba2b0ab0409161036191903690610743565b600081815260016020526040812054900361048b576040517f295a81c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152336024820152604401610234565b60008054828252600160205260409091205442916104a891610790565b11156104e0576040517f43dc986d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600160205260408120556104f8816105bf565b50565b60003361052757507f000000000000000000000000000000000000000000000000000000000000000090565b61052f610134565b90565b600033610527575060005490565b60003361055a575060009081526001602052604090205490565b610562610134565b919050565b60003361052757507f000000000000000000000000000000000000000000000000000000000000000090565b60003361052757507f000000000000000000000000000000000000000000000000000000000000000090565b807f4c109d85bcd0bb5c735b4be850953d652afe4cd9aa2e0b1426a65a4dcb2e12296000366040516105f2929190610743565b60405180910390a26000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16600036604051610645929190610733565b6000604051808303816000865af19150503d8060008114610682576040519150601f19603f3d011682016040523d82523d6000602084013e610687565b606091505b50909250905081151560010361069f57805160208201f35b805160208201fd5b600060208083528351808285015260005b818110156106d4578581018301518582016040015282016106b8565b818111156106e6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561072c57600080fd5b5035919050565b8183823760009101908152919050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b600082198211156107ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(DelayedVetoableStorageLayoutJSON), DelayedVetoableStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["DelayedVetoable"] = DelayedVetoableStorageLayout
-	deployedBytecodes["DelayedVetoable"] = DelayedVetoableDeployedBin
-	immutableReferences["DelayedVetoable"] = true
-}
diff --git a/op-bindings/bindings/delayedweth_more.go b/op-bindings/bindings/delayedweth_more.go
deleted file mode 100644
index 6cbf6ed73f8a..000000000000
--- a/op-bindings/bindings/delayedweth_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const DelayedWETHStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)50_storage\"},{\"astId\":1003,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1005,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"balanceOf\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1006,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"allowance\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1007,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"withdrawals\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_struct(WithdrawalRequest)1010_storage))\"},{\"astId\":1008,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"config\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_contract(SuperchainConfig)1009\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_array(t_uint256)50_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_contract(SuperchainConfig)1009\":{\"encoding\":\"inplace\",\"label\":\"contract SuperchainConfig\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_struct(WithdrawalRequest)1010_storage))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e struct IDelayedWETH.WithdrawalRequest))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_struct(WithdrawalRequest)1010_storage)\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_struct(WithdrawalRequest)1010_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct IDelayedWETH.WithdrawalRequest)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(WithdrawalRequest)1010_storage\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_struct(WithdrawalRequest)1010_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IDelayedWETH.WithdrawalRequest\",\"numberOfBytes\":\"64\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var DelayedWETHStorageLayout = new(solc.StorageLayout)
-
-var DelayedWETHDeployedBin = "0x6080604052600436106101845760003560e01c8063715018a6116100d6578063a9059cbb1161007f578063dd62ed3e11610059578063dd62ed3e1461052b578063f2fde38b14610563578063f3fef3a31461058357600080fd5b8063a9059cbb146104af578063cd47bde1146104cf578063d0e30db01461052357600080fd5b80638da5cb5b116100b05780638da5cb5b1461041b57806395d89b4114610446578063977a5ec51461048f57600080fd5b8063715018a61461039457806379502c55146103a95780637eee288d146103fb57600080fd5b80632e1a7d4d1161013857806354fd4d501161011257806354fd4d50146102eb5780636a42b8f81461033457806370a082311461036757600080fd5b80632e1a7d4d14610284578063313ce567146102a4578063485cc955146102cb57600080fd5b80630ca35682116101695780630ca356821461022757806318160ddd1461024757806323b872dd1461026457600080fd5b806306fdde0314610198578063095ea7b3146101f757600080fd5b36610193576101916105a3565b005b600080fd5b3480156101a457600080fd5b506101e16040518060400160405280600d81526020017f577261707065642045746865720000000000000000000000000000000000000081525081565b6040516101ee9190611403565b60405180910390f35b34801561020357600080fd5b50610217610212366004611498565b6105fe565b60405190151581526020016101ee565b34801561023357600080fd5b506101916102423660046114c4565b610677565b34801561025357600080fd5b50475b6040519081526020016101ee565b34801561027057600080fd5b5061021761027f3660046114dd565b6107be565b34801561029057600080fd5b5061019161029f3660046114c4565b6109d5565b3480156102b057600080fd5b506102b9601281565b60405160ff90911681526020016101ee565b3480156102d757600080fd5b506101916102e636600461151e565b6109e2565b3480156102f757600080fd5b506101e16040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b34801561034057600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610256565b34801561037357600080fd5b50610256610382366004611557565b60656020526000908152604090205481565b3480156103a057600080fd5b50610191610bbf565b3480156103b557600080fd5b506068546103d69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ee565b34801561040757600080fd5b50610191610416366004611498565b610bd3565b34801561042757600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166103d6565b34801561045257600080fd5b506101e16040518060400160405280600481526020017f574554480000000000000000000000000000000000000000000000000000000081525081565b34801561049b57600080fd5b506101916104aa366004611498565b610c27565b3480156104bb57600080fd5b506102176104ca366004611498565b610d14565b3480156104db57600080fd5b5061050e6104ea36600461151e565b60676020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101ee565b6101916105a3565b34801561053757600080fd5b5061025661054636600461151e565b606660209081526000928352604080842090915290825290205481565b34801561056f57600080fd5b5061019161057e366004611557565b610d28565b34801561058f57600080fd5b5061019161059e366004611498565b610ddc565b33600090815260656020526040812080543492906105c29084906115a3565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106669086815260200190565b60405180910390a350600192915050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146106fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064015b60405180910390fd5b8047101561078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f44656c61796564574554483a20696e73756666696369656e742062616c616e6360448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016106f4565b604051339082156108fc029083906000818181858888f193505050501580156107ba573d6000803e3d6000fd5b5050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120548211156107f057600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610866575073ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156108ee5773ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020548211156108a857600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152606660209081526040808320338452909152812080548492906108e89084906115bb565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8416600090815260656020526040812080548492906109239084906115bb565b909155505073ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120805484929061095d9084906115a3565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109c391815260200190565b60405180910390a35060019392505050565b6109df3382610ddc565b50565b600054610100900460ff1615808015610a025750600054600160ff909116105b80610a1c5750303b158015610a1c575060005460ff166001145b610aa8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106f4565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b0657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b0e611126565b610b17836111c5565b606880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610bba57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610bc761123c565b610bd160006111c5565b565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120426001820155805490918391839190610c1d9084906115a3565b9091555050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064016106f4565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff871680855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050565b6000610d213384846107be565b9392505050565b610d3061123c565b73ffffffffffffffffffffffffffffffffffffffff8116610dd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106f4565b6109df816111c5565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6d91906115d2565b15610ed4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e7472616374206973207061757365640060448201526064016106f4565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290208054821115610f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44656c61796564574554483a20696e73756666696369656e7420756e6c6f636b60448201527f6564207769746864726177616c0000000000000000000000000000000000000060648201526084016106f4565b6000816001015411611028576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44656c61796564574554483a207769746864726177616c206e6f7420756e6c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106f4565b427f0000000000000000000000000000000000000000000000000000000000000000826001015461105991906115a3565b11156110e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44656c61796564574554483a207769746864726177616c2064656c6179206e6f60448201527f74206d657400000000000000000000000000000000000000000000000000000060648201526084016106f4565b818160000160008282546110fb91906115bb565b90915550610bba9050826112bd565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600054610100900460ff166111bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106f4565b610bd1611363565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610bd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106f4565b336000908152606560205260409020548111156112d957600080fd5b33600090815260656020526040812080548392906112f89084906115bb565b9091555050604051339082156108fc029083906000818181858888f1935050505015801561132a573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600054610100900460ff166113fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106f4565b610bd1336111c5565b600060208083528351808285015260005b8181101561143057858101830151858201604001528201611414565b81811115611442576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109df57600080fd5b600080604083850312156114ab57600080fd5b82356114b681611476565b946020939093013593505050565b6000602082840312156114d657600080fd5b5035919050565b6000806000606084860312156114f257600080fd5b83356114fd81611476565b9250602084013561150d81611476565b929592945050506040919091013590565b6000806040838503121561153157600080fd5b823561153c81611476565b9150602083013561154c81611476565b809150509250929050565b60006020828403121561156957600080fd5b8135610d2181611476565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156115b6576115b6611574565b500190565b6000828210156115cd576115cd611574565b500390565b6000602082840312156115e457600080fd5b81518015158114610d2157600080fdfea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(DelayedWETHStorageLayoutJSON), DelayedWETHStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["DelayedWETH"] = DelayedWETHStorageLayout
-	deployedBytecodes["DelayedWETH"] = DelayedWETHDeployedBin
-	immutableReferences["DelayedWETH"] = true
-}
diff --git a/op-bindings/bindings/deployerwhitelist_more.go b/op-bindings/bindings/deployerwhitelist_more.go
deleted file mode 100644
index f324998285dd..000000000000
--- a/op-bindings/bindings/deployerwhitelist_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const DeployerWhitelistStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/legacy/DeployerWhitelist.sol:DeployerWhitelist\",\"label\":\"owner\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"src/legacy/DeployerWhitelist.sol:DeployerWhitelist\",\"label\":\"whitelist\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_bool)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_mapping(t_address,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_bool\"}}}"
-
-var DeployerWhitelistStorageLayout = new(solc.StorageLayout)
-
-var DeployerWhitelistDeployedBin = "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80638da5cb5b1161005b5780638da5cb5b146100fc5780639b19251a14610141578063b1540a0114610174578063bdc7b54f1461018757600080fd5b806308fd63221461008257806313af40351461009757806354fd4d50146100aa575b600080fd5b6100956100903660046106de565b61018f565b005b6100956100a536600461071a565b6102ef565b6100e66040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100f3919061073c565b60405180910390f35b60005461011c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f3565b61016461014f36600461071a565b60016020526000908152604090205460ff1681565b60405190151581526020016100f3565b61016461018236600461071a565b610520565b610095610571565b60005473ffffffffffffffffffffffffffffffffffffffff163314610261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4465706c6f79657257686974656c6973743a2066756e6374696f6e2063616e2060448201527f6f6e6c792062652063616c6c656420627920746865206f776e6572206f66207460648201527f68697320636f6e74726163740000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f8daaf060c3306c38e068a75c054bf96ecd85a3db1252712c4d93632744c42e0d910160405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4465706c6f79657257686974656c6973743a2066756e6374696f6e2063616e2060448201527f6f6e6c792062652063616c6c656420627920746865206f776e6572206f66207460648201527f68697320636f6e74726163740000000000000000000000000000000000000000608482015260a401610258565b73ffffffffffffffffffffffffffffffffffffffff8116610485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4465706c6f79657257686974656c6973743a2063616e206f6e6c79206265206460448201527f697361626c65642076696120656e61626c65417262697472617279436f6e747260648201527f6163744465706c6f796d656e7400000000000000000000000000000000000000608482015260a401610258565b6000546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000805473ffffffffffffffffffffffffffffffffffffffff16158061056b575073ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff165b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461063e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4465706c6f79657257686974656c6973743a2066756e6374696f6e2063616e2060448201527f6f6e6c792062652063616c6c656420627920746865206f776e6572206f66207460648201527f68697320636f6e74726163740000000000000000000000000000000000000000608482015260a401610258565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681527fc0e106cf568e50698fdbde1eff56f5a5c966cc7958e37e276918e9e4ccdf8cd49060200160405180910390a1600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d957600080fd5b919050565b600080604083850312156106f157600080fd5b6106fa836106b5565b91506020830135801515811461070f57600080fd5b809150509250929050565b60006020828403121561072c57600080fd5b610735826106b5565b9392505050565b600060208083528351808285015260005b818110156107695785810183015185820160400152820161074d565b8181111561077b576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(DeployerWhitelistStorageLayoutJSON), DeployerWhitelistStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["DeployerWhitelist"] = DeployerWhitelistStorageLayout
-	deployedBytecodes["DeployerWhitelist"] = DeployerWhitelistDeployedBin
-	immutableReferences["DeployerWhitelist"] = false
-}
diff --git a/op-bindings/bindings/deterministicdeploymentproxy_more.go b/op-bindings/bindings/deterministicdeploymentproxy_more.go
deleted file mode 100644
index 86774b7df91e..000000000000
--- a/op-bindings/bindings/deterministicdeploymentproxy_more.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-var DeterministicDeploymentProxyDeployedBin = "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"
-func init() {
-	deployedBytecodes["DeterministicDeploymentProxy"] = DeterministicDeploymentProxyDeployedBin
-}
diff --git a/op-bindings/bindings/disputegamefactory_more.go b/op-bindings/bindings/disputegamefactory_more.go
deleted file mode 100644
index 2b84757b3efd..000000000000
--- a/op-bindings/bindings/disputegamefactory_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const DisputeGameFactoryStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/dispute/DisputeGameFactory.sol:DisputeGameFactory\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/dispute/DisputeGameFactory.sol:DisputeGameFactory\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/dispute/DisputeGameFactory.sol:DisputeGameFactory\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)50_storage\"},{\"astId\":1003,\"contract\":\"src/dispute/DisputeGameFactory.sol:DisputeGameFactory\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"src/dispute/DisputeGameFactory.sol:DisputeGameFactory\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1005,\"contract\":\"src/dispute/DisputeGameFactory.sol:DisputeGameFactory\",\"label\":\"gameImpls\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_mapping(t_userDefinedValueType(GameType)1011,t_contract(IDisputeGame)1009)\"},{\"astId\":1006,\"contract\":\"src/dispute/DisputeGameFactory.sol:DisputeGameFactory\",\"label\":\"initBonds\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_mapping(t_userDefinedValueType(GameType)1011,t_uint256)\"},{\"astId\":1007,\"contract\":\"src/dispute/DisputeGameFactory.sol:DisputeGameFactory\",\"label\":\"_disputeGames\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_mapping(t_userDefinedValueType(Hash)1012,t_userDefinedValueType(GameId)1010)\"},{\"astId\":1008,\"contract\":\"src/dispute/DisputeGameFactory.sol:DisputeGameFactory\",\"label\":\"_disputeGameList\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_array(t_userDefinedValueType(GameId)1010)dyn_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_array(t_uint256)50_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\",\"base\":\"t_uint256\"},\"t_array(t_userDefinedValueType(GameId)1010)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"GameId[]\",\"numberOfBytes\":\"32\",\"base\":\"t_userDefinedValueType(GameId)1010\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_contract(IDisputeGame)1009\":{\"encoding\":\"inplace\",\"label\":\"contract IDisputeGame\",\"numberOfBytes\":\"20\"},\"t_mapping(t_userDefinedValueType(GameType)1011,t_contract(IDisputeGame)1009)\":{\"encoding\":\"mapping\",\"label\":\"mapping(GameType =\u003e contract IDisputeGame)\",\"numberOfBytes\":\"32\",\"key\":\"t_userDefinedValueType(GameType)1011\",\"value\":\"t_contract(IDisputeGame)1009\"},\"t_mapping(t_userDefinedValueType(GameType)1011,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(GameType =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_userDefinedValueType(GameType)1011\",\"value\":\"t_uint256\"},\"t_mapping(t_userDefinedValueType(Hash)1012,t_userDefinedValueType(GameId)1010)\":{\"encoding\":\"mapping\",\"label\":\"mapping(Hash =\u003e GameId)\",\"numberOfBytes\":\"32\",\"key\":\"t_userDefinedValueType(Hash)1012\",\"value\":\"t_userDefinedValueType(GameId)1010\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"},\"t_userDefinedValueType(GameId)1010\":{\"encoding\":\"inplace\",\"label\":\"GameId\",\"numberOfBytes\":\"32\"},\"t_userDefinedValueType(GameType)1011\":{\"encoding\":\"inplace\",\"label\":\"GameType\",\"numberOfBytes\":\"4\"},\"t_userDefinedValueType(Hash)1012\":{\"encoding\":\"inplace\",\"label\":\"Hash\",\"numberOfBytes\":\"32\"}}}"
-
-var DisputeGameFactoryStorageLayout = new(solc.StorageLayout)
-
-var DisputeGameFactoryDeployedBin = "0x6080604052600436106100e85760003560e01c80636593dc6e1161008a57806396cd97201161005957806396cd972014610313578063bb8aa1fc14610333578063c4d66de814610394578063f2fde38b146103b457600080fd5b80636593dc6e14610293578063715018a6146102c057806382ecf2f6146102d55780638da5cb5b146102e857600080fd5b8063254bd683116100c6578063254bd6831461019c5780634d1975b4146101c957806354fd4d50146101e85780635f0150cb1461023e57600080fd5b806314f6b1a3146100ed5780631b685b9e1461010f5780631e3342401461017c575b600080fd5b3480156100f957600080fd5b5061010d610108366004611099565b6103d4565b005b34801561011b57600080fd5b5061015261012a3660046110d0565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061010d6101973660046110eb565b61045e565b3480156101a857600080fd5b506101bc6101b7366004611115565b6104aa565b60405161017391906111c2565b3480156101d557600080fd5b506068545b604051908152602001610173565b3480156101f457600080fd5b506102316040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610173919061127f565b34801561024a57600080fd5b5061025e610259366004611292565b6106ee565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff909116602083015201610173565b34801561029f57600080fd5b506101da6102ae3660046110d0565b60666020526000908152604090205481565b3480156102cc57600080fd5b5061010d610741565b6101526102e3366004611292565b610755565b3480156102f457600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610152565b34801561031f57600080fd5b506101da61032e366004611292565b6109ee565b34801561033f57600080fd5b5061035361034e366004611319565b610a27565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610173565b3480156103a057600080fd5b5061010d6103af366004611332565b610a89565b3480156103c057600080fd5b5061010d6103cf366004611332565b610c25565b6103dc610cf8565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610466610cf8565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806104bc575081155b6106e7575060408051600583901b8101602001909152825b8381116106e5576000606882815481106104f0576104f061134f565b600091825260209091200154905060e081901c67ffffffffffffffff60a083901c1673ffffffffffffffffffffffffffffffffffffffff831660ff808a16908416036106b6576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d091908101906113ad565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106439190611478565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a516106859190611491565b815181106106955761069561134f565b6020026020010181905250888851106106b3575050505050506106e5565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506104d49050565b505b9392505050565b60008060006106ff878787876109ee565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610749610cf8565b6107536000610d79565b565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107c5576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff8616600090815260666020526040902054341015610814576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610821600143611491565b4090506108898682878760405160200161083e94939291906114cf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff841690610df0565b92508273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108d357600080fd5b505af11580156108e7573d6000803e3d6000fd5b505050505060006108fa888888886109ee565b60008181526067602052604090205490915015610946576040517f014f6fe5000000000000000000000000000000000000000000000000000000008152600481018290526024016107bc565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610a0794939291906114f0565b604051602081830303815290604052805190602001209050949350505050565b6000806000610a7c60688581548110610a4257610a4261134f565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9196909550909350915050565b600054610100900460ff1615808015610aa95750600054600160ff909116105b80610ac35750303b158015610ac3575060005460ff166001145b610b4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bc565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bad57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bb5610f24565b610bbe82610d79565b8015610c2157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610c2d610cf8565b73ffffffffffffffffffffffffffffffffffffffff8116610cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bc565b610cd981610d79565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006002825101603f8101600a81036040518360581b8260e81b177f6100003d81600a3d39f3363d3d373d3d3d3d610000806035363936013d7300001781528660601b601e8201527f5af43d3d93803e603357fd5bf300000000000000000000000000000000000000603282015285519150603f8101602087015b60208410610ea857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09093019260209182019101610e6b565b517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602085900360031b1b16815260f085901b9083015282816000f0945084610f15577febfef1880000000000000000000000000000000000000000000000000000000060005260206000fd5b90910160405250909392505050565b600054610100900460ff16610fbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b610753600054610100900460ff16611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b61075333610d79565b803563ffffffff8116811461107257600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610cd957600080fd5b600080604083850312156110ac57600080fd5b6110b58361105e565b915060208301356110c581611077565b809150509250929050565b6000602082840312156110e257600080fd5b6106e78261105e565b600080604083850312156110fe57600080fd5b6111078361105e565b946020939093013593505050565b60008060006060848603121561112a57600080fd5b6111338461105e565b95602085013595506040909401359392505050565b60005b8381101561116357818101518382015260200161114b565b83811115611172576000848401525b50505050565b60008151808452611190816020860160208601611148565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611271578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a09185018290529061125d81860183611178565b9689019694505050908601906001016111e9565b509098975050505050505050565b6020815260006106e76020830184611178565b600080600080606085870312156112a857600080fd5b6112b18561105e565b935060208501359250604085013567ffffffffffffffff808211156112d557600080fd5b818701915087601f8301126112e957600080fd5b8135818111156112f857600080fd5b88602082850101111561130a57600080fd5b95989497505060200194505050565b60006020828403121561132b57600080fd5b5035919050565b60006020828403121561134457600080fd5b81356106e781611077565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113bf57600080fd5b815167ffffffffffffffff808211156113d757600080fd5b818401915084601f8301126113eb57600080fd5b8151818111156113fd576113fd61137e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156114435761144361137e565b8160405282815287602084870101111561145c57600080fd5b61146d836020830160208801611148565b979650505050505050565b60006020828403121561148a57600080fd5b5051919050565b6000828210156114ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b84815283602082015281836040830137600091016040019081529392505050565b63ffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(DisputeGameFactoryStorageLayoutJSON), DisputeGameFactoryStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["DisputeGameFactory"] = DisputeGameFactoryStorageLayout
-	deployedBytecodes["DisputeGameFactory"] = DisputeGameFactoryDeployedBin
-	immutableReferences["DisputeGameFactory"] = false
-}
diff --git a/op-bindings/bindings/eas_more.go b/op-bindings/bindings/eas_more.go
deleted file mode 100644
index 1ce9443c7cb4..000000000000
--- a/op-bindings/bindings/eas_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const EASStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/EAS/EAS.sol:EAS\",\"label\":\"_nonces\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1001,\"contract\":\"src/EAS/EAS.sol:EAS\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1002,\"contract\":\"src/EAS/EAS.sol:EAS\",\"label\":\"_db\",\"offset\":0,\"slot\":\"50\",\"type\":\"t_mapping(t_bytes32,t_struct(Attestation)1006_storage)\"},{\"astId\":1003,\"contract\":\"src/EAS/EAS.sol:EAS\",\"label\":\"_timestamps\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_mapping(t_bytes32,t_uint64)\"},{\"astId\":1004,\"contract\":\"src/EAS/EAS.sol:EAS\",\"label\":\"_revocationsOffchain\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_mapping(t_address,t_mapping(t_bytes32,t_uint64))\"},{\"astId\":1005,\"contract\":\"src/EAS/EAS.sol:EAS\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"53\",\"type\":\"t_array(t_uint256)47_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)47_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[47]\",\"numberOfBytes\":\"1504\",\"base\":\"t_uint256\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_bytes_storage\":{\"encoding\":\"bytes\",\"label\":\"bytes\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_mapping(t_bytes32,t_uint64))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(bytes32 =\u003e uint64))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_bytes32,t_uint64)\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_mapping(t_bytes32,t_struct(Attestation)1006_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e struct Attestation)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_struct(Attestation)1006_storage\"},\"t_mapping(t_bytes32,t_uint64)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint64)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint64\"},\"t_struct(Attestation)1006_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Attestation\",\"numberOfBytes\":\"224\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"}}}"
-
-var EASStorageLayout = new(solc.StorageLayout)
-
-var EASDeployedBin = "0x60806040526004361061018b5760003560e01c806395411525116100d6578063d45c44351161007f578063ed24911d11610059578063ed24911d146104fd578063f10b5cc814610512578063f17325e71461054157600080fd5b8063d45c443514610467578063e30bb5631461049e578063e71ff365146104dd57600080fd5b8063b469318d116100b0578063b469318d146103ba578063b83010d314610414578063cf190f341461044757600080fd5b80639541152514610367578063a3112a641461037a578063a6d4dbc7146103a757600080fd5b806344adc90e116101385780634d003070116101125780634d003070146102de57806354fd4d50146102fe57806379f7573a1461034757600080fd5b806344adc90e1461029857806346926267146102b85780634cb7e9e5146102cb57600080fd5b806317d7de7c1161016957806317d7de7c146102205780632d0335ab146102425780633c0427151461028557600080fd5b80630eabf6601461019057806312b11a17146101a557806313893f61146101e7575b600080fd5b6101a361019e3660046134c8565b610554565b005b3480156101b157600080fd5b507ffeb2925a02bae3dae48d424a0437a2b6ac939aa9230ddc55a1a76f065d9880765b6040519081526020015b60405180910390f35b3480156101f357600080fd5b506102076102023660046134c8565b6106eb565b60405167ffffffffffffffff90911681526020016101de565b34801561022c57600080fd5b50610235610730565b6040516101de9190613578565b34801561024e57600080fd5b506101d461025d3660046135bd565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101d46102933660046135da565b610760565b6102ab6102a63660046134c8565b610863565b6040516101de9190613615565b6101a36102c6366004613659565b6109e4565b6101a36102d93660046134c8565b610a68565b3480156102ea57600080fd5b506102076102f9366004613671565b610b4b565b34801561030a57600080fd5b506102356040518060400160405280600581526020017f312e342e3000000000000000000000000000000000000000000000000000000081525081565b34801561035357600080fd5b506101a3610362366004613671565b610b58565b6102ab6103753660046134c8565b610bef565b34801561038657600080fd5b5061039a610395366004613671565b610e62565b6040516101de9190613771565b6101a36103b5366004613784565b611025565b3480156103c657600080fd5b506102076103d5366004613797565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152603460209081526040808320938352929052205467ffffffffffffffff1690565b34801561042057600080fd5b507fb5d556f07587ec0f08cf386545cc4362c702a001650c2058002615ee5c9d1e756101d4565b34801561045357600080fd5b50610207610462366004613671565b6110ca565b34801561047357600080fd5b50610207610482366004613671565b60009081526033602052604090205467ffffffffffffffff1690565b3480156104aa57600080fd5b506104cd6104b9366004613671565b600090815260326020526040902054151590565b60405190151581526020016101de565b3480156104e957600080fd5b506102076104f83660046134c8565b6110d8565b34801561050957600080fd5b506101d4611110565b34801561051e57600080fd5b5060405173420000000000000000000000000000000000002081526020016101de565b6101d461054f3660046137c3565b61111a565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82018114600086868481811061059a5761059a6137fe565b90506020028101906105ac919061382d565b6105b590613ac3565b60208101518051919250908015806105d257508260400151518114155b15610609576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156106ad576106a56040518060a001604052808660000151815260200185848151811061063e5761063e6137fe565b6020026020010151815260200186604001518481518110610661576106616137fe565b60200260200101518152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015167ffffffffffffffff168152506111d8565b60010161060c565b506106c383600001518385606001518a886113e9565b6106cd9088613bed565b9650505050506106dd8160010190565b9050610559565b5050505050565b60004282825b818110156107245761071c3387878481811061070f5761070f6137fe565b9050602002013585611a18565b6001016106f1565b50909150505b92915050565b606061075b7f0000000000000000000000000000000000000000000000000000000000000000611b17565b905090565b600061077361076e83613d22565b611ca5565b604080516001808252818301909252600091816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161078a5790505090506107f86020840184613d9d565b61080190613dd1565b81600081518110610814576108146137fe565b602090810291909101015261083d83358261083560c0870160a088016135bd565b346001611e2f565b60200151600081518110610853576108536137fe565b6020026020010151915050919050565b60608160008167ffffffffffffffff8111156108815761088161386b565b6040519080825280602002602001820160405280156108b457816020015b606081526020019060019003908161089f5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85018114368989848181106108fc576108fc6137fe565b905060200281019061090e9190613ddd565b905061091d6020820182613e11565b9050600003610958576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061097d823561096c6020850185613e11565b61097591613e79565b338887611e2f565b805190915061098c9086613bed565b945080602001518785815181106109a5576109a56137fe565b6020026020010181905250806020015151860195505050506109c78160010190565b90506108bc565b506109d98383612541565b979650505050505050565b604080516001808252818301909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816109fb579050509050610a3636839003830160208401613eed565b81600081518110610a4957610a496137fe565b6020908102919091010152610a63823582333460016113e9565b505050565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201811436868684818110610aad57610aad6137fe565b9050602002810190610abf9190613ddd565b9050610b2c8135610ad36020840184613f09565b808060200260200160405190810160405280939291908181526020016000905b82821015610b1f57610b1060408302860136819003810190613eed565b81526020019060010190610af3565b50505050503388866113e9565b610b369086613bed565b94505050610b448160010190565b9050610a6d565b60004261072a838261262b565b33600090815260208190526040902054808211610ba1576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152602081815260409182902084905581518381529081018490527f57b09af877df9068fd60a69d7b21f5576b8b38955812d6ae4ac52942f1e38fb7910160405180910390a15050565b60608160008167ffffffffffffffff811115610c0d57610c0d61386b565b604051908082528060200260200182016040528015610c4057816020015b6060815260200190600190039081610c2b5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501811436898984818110610c8857610c886137fe565b9050602002810190610c9a919061382d565b9050366000610cac6020840184613e11565b909250905080801580610ccd5750610cc76040850185613f71565b90508114155b15610d04576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610de557610ddd6040518060a0016040528087600001358152602001868685818110610d3957610d396137fe565b9050602002810190610d4b9190613d9d565b610d5490613dd1565b8152602001610d666040890189613f71565b85818110610d7657610d766137fe565b905060600201803603810190610d8c9190613fd8565b8152602001610da16080890160608a016135bd565b73ffffffffffffffffffffffffffffffffffffffff168152602001610dcc60a0890160808a01613ff4565b67ffffffffffffffff169052611ca5565b600101610d07565b506000610e0e8535610df78587613e79565b610e076080890160608a016135bd565b8b8a611e2f565b8051909150610e1d9089613bed565b975080602001518a8881518110610e3657610e366137fe565b602002602001018190525080602001515189019850505050505050610e5b8160010190565b9050610c48565b604080516101408101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082019290925261012081019190915260008281526032602090815260409182902082516101408101845281548152600182015492810192909252600281015467ffffffffffffffff808216948401949094526801000000000000000081048416606084015270010000000000000000000000000000000090049092166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff16151561010082015260068201805491929161012084019190610f9c9061400f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc89061400f565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b5050505050815250509050919050565b61103c6110373683900383018361405c565b6111d8565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161105357905050905061108e36839003830160208401613eed565b816000815181106110a1576110a16137fe565b6020908102919091010152610a638235826110c260e0860160c087016135bd565b3460016113e9565b60004261072a338483611a18565b60004282825b81811015610724576111088686838181106110fb576110fb6137fe565b905060200201358461262b565b6001016110de565b600061075b6126ed565b604080516001808252818301909252600091829190816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816111345790505090506111a26020840184613d9d565b6111ab90613dd1565b816000815181106111be576111be6137fe565b602090810291909101015261083d83358233346001611e2f565b608081015167ffffffffffffffff161580159061120c57504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611243576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808201516040808401516060850151855184518587015173ffffffffffffffffffffffffffffffffffffffff84166000908152978890529487208054969794969495611337957fb5d556f07587ec0f08cf386545cc4362c702a001650c2058002615ee5c9d1e7595949392886112ba836140ca565b909155506080808c015160408051602081019990995273ffffffffffffffffffffffffffffffffffffffff9097169688019690965260608701949094529285019190915260a084015260c083015267ffffffffffffffff1660e0820152610100015b60405160208183030381529060405280519060200120612821565b90506113ad84606001518284602001518560400151866000015160405160200161139993929190928352602083019190915260f81b7fff0000000000000000000000000000000000000000000000000000000000000016604082015260410190565b604051602081830303815290604052612834565b6113e3576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081526004810186905260009081907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611457573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261149d9190810190614102565b80519091506114d8576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855160008167ffffffffffffffff8111156114f5576114f561386b565b60405190808252806020026020018201604052801561159457816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816115135790505b50905060008267ffffffffffffffff8111156115b2576115b261386b565b6040519080825280602002602001820160405280156115db578160200160208202803683370190505b50905060005b838110156119fa5760008a82815181106115fd576115fd6137fe565b6020908102919091018101518051600090815260329092526040909120805491925090611656576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8c816001015414611693576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015473ffffffffffffffffffffffffffffffffffffffff8c81169116146116e9576040517f4ca8886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015474010000000000000000000000000000000000000000900460ff1661173f576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002810154700100000000000000000000000000000000900467ffffffffffffffff1615611799576040517f905e710700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b426002820180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff811670010000000000000000000000000000000067ffffffffffffffff948516810291821793849055604080516101408101825287548152600188015460208201529386169286169290921791830191909152680100000000000000008304841660608301529091049091166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff16151561010082015260068201805483916101208401916118a59061400f565b80601f01602080910402602001604051908101604052809291908181526020018280546118d19061400f565b801561191e5780601f106118f35761010080835404028352916020019161191e565b820191906000526020600020905b81548152906001019060200180831161190157829003601f168201915b505050505081525050858481518110611939576119396137fe565b6020026020010181905250816020015184848151811061195b5761195b6137fe565b6020026020010181815250508c8b73ffffffffffffffffffffffffffffffffffffffff16868581518110611991576119916137fe565b602002602001015160c0015173ffffffffffffffffffffffffffffffffffffffff167ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f61585600001516040516119e891815260200190565b60405180910390a450506001016115e1565b50611a0a84838360018b8b612a03565b9a9950505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603460209081526040808320858452918290529091205467ffffffffffffffff1615611a8c576040517fec9d6eeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526020829052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861690811790915590519091859173ffffffffffffffffffffffffffffffffffffffff8816917f92a1f7a41a7c585a8b09e25b195e225b1d43248daca46b0faf9e0792777a222991a450505050565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b6020811015611be2576000858260208110611b5d57611b5d6137fe565b1a60f81b90507fff000000000000000000000000000000000000000000000000000000000000008116600003611b935750611be2565b80848481518110611ba657611ba66137fe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505060019182019101611b40565b5060008167ffffffffffffffff811115611bfe57611bfe61386b565b6040519080825280601f01601f191660200182016040528015611c28576020820181803683370190505b50905060005b82811015611c9c57838181518110611c4857611c486137fe565b602001015160f81c60f81b828281518110611c6557611c656137fe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611c2e565b50949350505050565b608081015167ffffffffffffffff1615801590611cd957504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611d10576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808201516040808401516060808601518651855186880151868801519488015160808901518051908b012060a08a015173ffffffffffffffffffffffffffffffffffffffff871660009081529b8c9052988b2080549a9b989a9899611337997ffeb2925a02bae3dae48d424a0437a2b6ac939aa9230ddc55a1a76f065d988076999493928c611da0836140ca565b919050558e6080015160405160200161131c9b9a999897969594939291909a8b5273ffffffffffffffffffffffffffffffffffffffff998a1660208c015260408b019890985295909716606089015267ffffffffffffffff938416608089015291151560a088015260c087015260e0860152610100850193909352610120840152166101408201526101600190565b60408051808201909152600081526060602082015284516040805180820190915260008152606060208201528167ffffffffffffffff811115611e7457611e7461386b565b604051908082528060200260200182016040528015611e9d578160200160208202803683370190505b5060208201526040517fa2ea7c6e000000000000000000000000000000000000000000000000000000008152600481018990526000907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611f0f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f559190810190614102565b8051909150611f90576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008367ffffffffffffffff811115611fab57611fab61386b565b60405190808252806020026020018201604052801561204a57816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611fc95790505b50905060008467ffffffffffffffff8111156120685761206861386b565b604051908082528060200260200182016040528015612091578160200160208202803683370190505b50905060005b858110156125205760008b82815181106120b3576120b36137fe565b60200260200101519050600067ffffffffffffffff16816020015167ffffffffffffffff16141580156120fe57504267ffffffffffffffff16816020015167ffffffffffffffff1611155b15612135576040517f08e8b93700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460400151158015612148575080604001515b1561217f576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052806000801b81526020018f81526020016121a34290565b67ffffffffffffffff168152602001836020015167ffffffffffffffff168152602001600067ffffffffffffffff16815260200183606001518152602001836000015173ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815260200183604001511515815260200183608001518152509050600080600090505b6122458382612df4565b600081815260326020526040902054909250156122645760010161223b565b81835260008281526032602090815260409182902085518155908501516001820155908401516002820180546060870151608088015167ffffffffffffffff908116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff92821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169190951617919091171691909117905560a0840151600382015560c084015160048201805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905560e0850151600583018054610100880151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff000000000000000000000000000000000000000000909116929093169190911791909117905561012084015184919060068201906123e49082614228565b50505060608401511561243b57606084015160009081526032602052604090205461243b576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8287868151811061244e5761244e6137fe565b60200260200101819052508360a00151868681518110612470576124706137fe565b6020026020010181815250508189602001518681518110612493576124936137fe565b6020026020010181815250508f8e73ffffffffffffffffffffffffffffffffffffffff16856000015173ffffffffffffffffffffffffffffffffffffffff167f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b358560405161250391815260200190565b60405180910390a4505050506125198160010190565b9050612097565b5061253083838360008c8c612a03565b845250919998505050505050505050565b606060008267ffffffffffffffff81111561255e5761255e61386b565b604051908082528060200260200182016040528015612587578160200160208202803683370190505b508451909150600090815b818110156126205760008782815181106125ae576125ae6137fe565b6020026020010151905060008151905060005b8181101561260c578281815181106125db576125db6137fe565b60200260200101518787815181106125f5576125f56137fe565b6020908102919091010152600195860195016125c1565b5050506126198160010190565b9050612592565b509195945050505050565b60008281526033602052604090205467ffffffffffffffff161561267b576040517f2e26794600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526033602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051909184917f5aafceeb1c7ad58e4a84898bdee37c02c0fc46e7d24e6b60e8209449f183459f9190a35050565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561275357507f000000000000000000000000000000000000000000000000000000000000000046145b1561277d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600061072a61282e6126ed565b83612e53565b60008060006128438585612e95565b9092509050600081600481111561285c5761285c614342565b14801561289457508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b156128a4576001925050506129fc565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b88886040516024016128d9929190614371565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129629190614392565b600060405180830381855afa9150503d806000811461299d576040519150601f19603f3d011682016040523d82523d6000602084013e6129a2565b606091505b50915091508180156129b5575080516020145b80156129f5575080517f1626ba7e00000000000000000000000000000000000000000000000000000000906129f390830160209081019084016143a4565b145b9450505050505b9392505050565b84516000906001819003612a5b57612a538888600081518110612a2857612a286137fe565b602002602001015188600081518110612a4357612a436137fe565b6020026020010151888888612eda565b915050612dea565b602088015173ffffffffffffffffffffffffffffffffffffffff8116612afc5760005b82811015612ae157878181518110612a9857612a986137fe565b6020026020010151600014612ad9576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101612a7e565b508315612af157612af1856131f9565b600092505050612dea565b6000808273ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6e91906143bd565b905060005b84811015612c2b5760008a8281518110612b8f57612b8f6137fe565b6020026020010151905080600003612ba75750612c23565b82612bde576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88811115612c18576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b978890039792909201915b600101612b73565b508715612d06576040517f88e5b2d900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906388e5b2d9908490612c88908e908e906004016143da565b60206040518083038185885af1158015612ca6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612ccb91906143bd565b612d01576040517fbf2f3a8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd5565b6040517f91db0b7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906391db0b7e908490612d5c908e908e906004016143da565b60206040518083038185885af1158015612d7a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d9f91906143bd565b612dd5576040517fe8bee83900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515612de457612de4876131f9565b50925050505b9695505050505050565b60208083015160c084015160e0850151604080870151606088015161010089015160a08a01516101208b01519451600099612e3599989796918c9101614493565b60405160208183030381529060405280519060200120905092915050565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810183905260428101829052600090606201612e35565b6000808251604103612ecb5760208301516040840151606085015160001a612ebf8782858561320c565b94509450505050612ed3565b506000905060025b9250929050565b602086015160009073ffffffffffffffffffffffffffffffffffffffff8116612f4e578515612f35576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8215612f4457612f44846131f9565b6000915050612dea565b8515613039578073ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc391906143bd565b612ff9576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83861115613033576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85840393505b8415613111576040517fe49617e100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e49617e1908890613093908b90600401613771565b60206040518083038185885af11580156130b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130d691906143bd565b61310c576040517fccf3bb2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131de565b6040517fe60c350500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e60c3505908890613165908b90600401613771565b60206040518083038185885af1158015613183573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131a891906143bd565b6131de576040517fbd8ba84d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82156131ed576131ed846131f9565b50939695505050505050565b8015613209576132093382613324565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613243575060009050600361331b565b8460ff16601b1415801561325b57508460ff16601c14155b1561326c575060009050600461331b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156132c0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166133145760006001925092505061331b565b9150600090505b94509492505050565b80471015613393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146133ed576040519150601f19603f3d011682016040523d82523d6000602084013e6133f2565b606091505b5050905080610a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161338a565b60008083601f84011261349557600080fd5b50813567ffffffffffffffff8111156134ad57600080fd5b6020830191508360208260051b8501011115612ed357600080fd5b600080602083850312156134db57600080fd5b823567ffffffffffffffff8111156134f257600080fd5b6134fe85828601613483565b90969095509350505050565b60005b8381101561352557818101518382015260200161350d565b50506000910152565b6000815180845261354681602086016020860161350a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129fc602083018461352e565b73ffffffffffffffffffffffffffffffffffffffff8116811461320957600080fd5b80356135b88161358b565b919050565b6000602082840312156135cf57600080fd5b81356129fc8161358b565b6000602082840312156135ec57600080fd5b813567ffffffffffffffff81111561360357600080fd5b820160e081850312156129fc57600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561364d57835183529284019291840191600101613631565b50909695505050505050565b60006060828403121561366b57600080fd5b50919050565b60006020828403121561368357600080fd5b5035919050565b6000610140825184526020830151602085015260408301516136b8604086018267ffffffffffffffff169052565b5060608301516136d4606086018267ffffffffffffffff169052565b5060808301516136f0608086018267ffffffffffffffff169052565b5060a083015160a085015260c083015161372260c086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e083015161374a60e086018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015115159085015261012080840151818601839052612dea8387018261352e565b6020815260006129fc602083018461368a565b6000610100828403121561366b57600080fd5b600080604083850312156137aa57600080fd5b82356137b58161358b565b946020939093013593505050565b6000602082840312156137d557600080fd5b813567ffffffffffffffff8111156137ec57600080fd5b8201604081850312156129fc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261386157600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156138bd576138bd61386b565b60405290565b60405160c0810167ffffffffffffffff811182821017156138bd576138bd61386b565b6040516080810167ffffffffffffffff811182821017156138bd576138bd61386b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139505761395061386b565b604052919050565b600067ffffffffffffffff8211156139725761397261386b565b5060051b60200190565b60006040828403121561398e57600080fd5b6040516040810181811067ffffffffffffffff821117156139b1576139b161386b565b604052823581526020928301359281019290925250919050565b6000606082840312156139dd57600080fd5b6040516060810181811067ffffffffffffffff82111715613a0057613a0061386b565b604052905080823560ff81168114613a1757600080fd5b8082525060208301356020820152604083013560408201525092915050565b600082601f830112613a4757600080fd5b81356020613a5c613a5783613958565b613909565b82815260609283028501820192828201919087851115613a7b57600080fd5b8387015b85811015613a9e57613a9189826139cb565b8452928401928101613a7f565b5090979650505050505050565b803567ffffffffffffffff811681146135b857600080fd5b600060a08236031215613ad557600080fd5b613add61389a565b8235815260208084013567ffffffffffffffff80821115613afd57600080fd5b9085019036601f830112613b1057600080fd5b8135613b1e613a5782613958565b81815260069190911b83018401908481019036831115613b3d57600080fd5b938501935b82851015613b6657613b54368661397c565b82528582019150604085019450613b42565b80868801525050506040860135925080831115613b8257600080fd5b5050613b9036828601613a36565b604083015250613ba2606084016135ad565b6060820152613bb360808401613aab565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561072a5761072a613bbe565b801515811461320957600080fd5b600067ffffffffffffffff821115613c2857613c2861386b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600060c08284031215613c6657600080fd5b613c6e6138c3565b90508135613c7b8161358b565b81526020613c8a838201613aab565b818301526040830135613c9c81613c00565b604083015260608381013590830152608083013567ffffffffffffffff811115613cc557600080fd5b8301601f81018513613cd657600080fd5b8035613ce4613a5782613c0e565b8181528684838501011115613cf857600080fd5b818484018583013760008483830101528060808601525050505060a082013560a082015292915050565b600060e08236031215613d3457600080fd5b613d3c61389a565b82358152602083013567ffffffffffffffff811115613d5a57600080fd5b613d6636828601613c54565b602083015250613d7936604085016139cb565b604082015260a0830135613d8c8161358b565b6060820152613bb360c08401613aab565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4183360301811261386157600080fd5b600061072a3683613c54565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261386157600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e4657600080fd5b83018035915067ffffffffffffffff821115613e6157600080fd5b6020019150600581901b3603821315612ed357600080fd5b6000613e87613a5784613958565b80848252602080830192508560051b850136811115613ea557600080fd5b855b81811015613ee157803567ffffffffffffffff811115613ec75760008081fd5b613ed336828a01613c54565b865250938201938201613ea7565b50919695505050505050565b600060408284031215613eff57600080fd5b6129fc838361397c565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613f3e57600080fd5b83018035915067ffffffffffffffff821115613f5957600080fd5b6020019150600681901b3603821315612ed357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613fa657600080fd5b83018035915067ffffffffffffffff821115613fc157600080fd5b6020019150606081023603821315612ed357600080fd5b600060608284031215613fea57600080fd5b6129fc83836139cb565b60006020828403121561400657600080fd5b6129fc82613aab565b600181811c9082168061402357607f821691505b60208210810361366b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000610100828403121561406f57600080fd5b61407761389a565b82358152614088846020850161397c565b602082015261409a84606085016139cb565b604082015260c08301356140ad8161358b565b60608201526140be60e08401613aab565b60808201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140fb576140fb613bbe565b5060010190565b6000602080838503121561411557600080fd5b825167ffffffffffffffff8082111561412d57600080fd5b908401906080828703121561414157600080fd5b6141496138e6565b825181528383015161415a8161358b565b81850152604083015161416c81613c00565b604082015260608301518281111561418357600080fd5b80840193505086601f84011261419857600080fd5b825191506141a8613a5783613c0e565b82815287858486010111156141bc57600080fd5b6141cb8386830187870161350a565b60608201529695505050505050565b601f821115610a6357600081815260208120601f850160051c810160208610156142015750805b601f850160051c820191505b818110156142205782815560010161420d565b505050505050565b815167ffffffffffffffff8111156142425761424261386b565b61425681614250845461400f565b846141da565b602080601f8311600181146142a957600084156142735750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614220565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142f6578886015182559484019460019091019084016142d7565b508582101561433257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82815260406020820152600061438a604083018461352e565b949350505050565b6000825161386181846020870161350a565b6000602082840312156143b657600080fd5b5051919050565b6000602082840312156143cf57600080fd5b81516129fc81613c00565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b8381101561444f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa088870301855261443d86835161368a565b95509382019390820190600101614403565b50508584038187015286518085528782019482019350915060005b828110156144865784518452938101939281019260010161446a565b5091979650505050505050565b89815260007fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808b60601b166020840152808a60601b166034840152507fffffffffffffffff000000000000000000000000000000000000000000000000808960c01b166048840152808860c01b1660508401525085151560f81b6058830152846059830152835161452c81607985016020880161350a565b80830190507fffffffff000000000000000000000000000000000000000000000000000000008460e01b166079820152607d81019150509a995050505050505050505056fea164736f6c6343000813000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(EASStorageLayoutJSON), EASStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["EAS"] = EASStorageLayout
-	deployedBytecodes["EAS"] = EASDeployedBin
-	immutableReferences["EAS"] = true
-}
diff --git a/op-bindings/bindings/entrypoint_more.go b/op-bindings/bindings/entrypoint_more.go
deleted file mode 100644
index 847b0d7d9d01..000000000000
--- a/op-bindings/bindings/entrypoint_more.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-var EntryPointDeployedBin = "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000007fc98430eaedbb6070b35b39d798725049088348165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"
-func init() {
-	deployedBytecodes["EntryPoint"] = EntryPointDeployedBin
-}
diff --git a/op-bindings/bindings/erc20_more.go b/op-bindings/bindings/erc20_more.go
deleted file mode 100644
index fa16335c9f64..000000000000
--- a/op-bindings/bindings/erc20_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const ERC20StorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:ERC20\",\"label\":\"_balances\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1001,\"contract\":\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:ERC20\",\"label\":\"_allowances\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1002,\"contract\":\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:ERC20\",\"label\":\"_totalSupply\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint256\"},{\"astId\":1003,\"contract\":\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:ERC20\",\"label\":\"_name\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_string_storage\"},{\"astId\":1004,\"contract\":\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:ERC20\",\"label\":\"_symbol\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_string_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_string_storage\":{\"encoding\":\"bytes\",\"label\":\"string\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}"
-
-var ERC20StorageLayout = new(solc.StorageLayout)
-
-var ERC20DeployedBin = "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c80633950935111610081578063a457c2d71161005b578063a457c2d714610194578063a9059cbb146101a7578063dd62ed3e146101ba57600080fd5b8063395093511461014357806370a082311461015657806395d89b411461018c57600080fd5b806318160ddd116100b257806318160ddd1461010f57806323b872dd14610121578063313ce5671461013457600080fd5b806306fdde03146100ce578063095ea7b3146100ec575b600080fd5b6100d6610200565b6040516100e3919061094a565b60405180910390f35b6100ff6100fa3660046109e6565b610292565b60405190151581526020016100e3565b6002545b6040519081526020016100e3565b6100ff61012f366004610a10565b6102aa565b604051601281526020016100e3565b6100ff6101513660046109e6565b6102ce565b610113610164366004610a4c565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100d661031a565b6100ff6101a23660046109e6565b610329565b6100ff6101b53660046109e6565b6103ff565b6101136101c8366004610a6e565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461020f90610aa1565b80601f016020809104026020016040519081016040528092919081815260200182805461023b90610aa1565b80156102885780601f1061025d57610100808354040283529160200191610288565b820191906000526020600020905b81548152906001019060200180831161026b57829003601f168201915b5050505050905090565b6000336102a081858561040d565b5060019392505050565b6000336102b88582856105c0565b6102c3858585610697565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906102a09082908690610315908790610af4565b61040d565b60606004805461020f90610aa1565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156103f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102c3828686840361040d565b6000336102a0818585610697565b73ffffffffffffffffffffffffffffffffffffffff83166104af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff8216610552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106915781811015610684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103e9565b610691848484840361040d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff831661073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff82166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152602081905260408082208585039055918516815290812080548492906108d7908490610af4565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161093d91815260200190565b60405180910390a3610691565b600060208083528351808285015260005b818110156109775785810183015185820160400152820161095b565b81811115610989576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146109e157600080fd5b919050565b600080604083850312156109f957600080fd5b610a02836109bd565b946020939093013593505050565b600080600060608486031215610a2557600080fd5b610a2e846109bd565b9250610a3c602085016109bd565b9150604084013590509250925092565b600060208284031215610a5e57600080fd5b610a67826109bd565b9392505050565b60008060408385031215610a8157600080fd5b610a8a836109bd565b9150610a98602084016109bd565b90509250929050565b600181811c90821680610ab557607f821691505b602082108103610aee577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115610b2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(ERC20StorageLayoutJSON), ERC20StorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["ERC20"] = ERC20StorageLayout
-	deployedBytecodes["ERC20"] = ERC20DeployedBin
-	immutableReferences["ERC20"] = false
-}
diff --git a/op-bindings/bindings/faultdisputegame.go b/op-bindings/bindings/faultdisputegame.go
deleted file mode 100644
index 268139c49216..000000000000
--- a/op-bindings/bindings/faultdisputegame.go
+++ /dev/null
@@ -1,1541 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"errors"
-	"math/big"
-	"strings"
-
-	ethereum "github.com/ethereum/go-ethereum"
-	"github.com/ethereum/go-ethereum/accounts/abi"
-	"github.com/ethereum/go-ethereum/accounts/abi/bind"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/event"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var (
-	_ = errors.New
-	_ = big.NewInt
-	_ = strings.NewReader
-	_ = ethereum.NotFound
-	_ = bind.Bind
-	_ = common.Big1
-	_ = types.BloomLookup
-	_ = event.NewSubscription
-)
-
-// FaultDisputeGameMetaData contains all meta data concerning the FaultDisputeGame contract.
-var FaultDisputeGameMetaData = &bind.MetaData{
-	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_absolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_genesisBlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_genesisOutputRoot\",\"type\":\"bytes32\",\"internalType\":\"Hash\"},{\"name\":\"_maxGameDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_splitDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gameDuration\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"_vm\",\"type\":\"address\",\"internalType\":\"contractIBigStepper\"},{\"name\":\"_weth\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"},{\"name\":\"_l2ChainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"absolutePrestate\",\"inputs\":[],\"outputs\":[{\"name\":\"absolutePrestate_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addLocalData\",\"inputs\":[{\"name\":\"_ident\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_execLeafIdx\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"attack\",\"inputs\":[{\"name\":\"_parentIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"claimCredit\",\"inputs\":[{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimData\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"parentIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"counteredBy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bond\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"position\",\"type\":\"uint128\",\"internalType\":\"Position\"},{\"name\":\"clock\",\"type\":\"uint128\",\"internalType\":\"Clock\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDataLen\",\"inputs\":[],\"outputs\":[{\"name\":\"len_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimedBondFlag\",\"inputs\":[],\"outputs\":[{\"name\":\"claimedBondFlag_\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"createdAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"credit\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defend\",\"inputs\":[{\"name\":\"_parentIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"extraData\",\"inputs\":[],\"outputs\":[{\"name\":\"extraData_\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"gameData\",\"inputs\":[],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"rootClaim_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"extraData_\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameDuration\",\"inputs\":[],\"outputs\":[{\"name\":\"gameDuration_\",\"type\":\"uint64\",\"internalType\":\"Duration\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameType\",\"inputs\":[],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"genesisBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"genesisBlockNumber_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"genesisOutputRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"genesisOutputRoot_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRequiredBond\",\"inputs\":[{\"name\":\"_position\",\"type\":\"uint128\",\"internalType\":\"Position\"}],\"outputs\":[{\"name\":\"requiredBond_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"l1Head\",\"inputs\":[],\"outputs\":[{\"name\":\"l1Head_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"l2BlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"l2BlockNumber_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"l2ChainId\",\"inputs\":[],\"outputs\":[{\"name\":\"l2ChainId_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxGameDepth\",\"inputs\":[],\"outputs\":[{\"name\":\"maxGameDepth_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"move\",\"inputs\":[{\"name\":\"_challengeIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_isAttack\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumGameStatus\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolveClaim\",\"inputs\":[{\"name\":\"_claimIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resolvedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rootClaim\",\"inputs\":[],\"outputs\":[{\"name\":\"rootClaim_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"splitDepth\",\"inputs\":[],\"outputs\":[{\"name\":\"splitDepth_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"status\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumGameStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"step\",\"inputs\":[{\"name\":\"_claimIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_isAttack\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_stateData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"vm\",\"inputs\":[],\"outputs\":[{\"name\":\"vm_\",\"type\":\"address\",\"internalType\":\"contractIBigStepper\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weth\",\"inputs\":[],\"outputs\":[{\"name\":\"weth_\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Move\",\"inputs\":[{\"name\":\"parentIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"claim\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"Claim\"},{\"name\":\"claimant\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Resolved\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumGameStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BondTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotDefendRootClaim\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAboveSplit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAlreadyResolved\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClockNotExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClockTimeExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicateStep\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GameDepthExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GameNotInProgress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientBond\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidLocalIdent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidParent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPrestate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSplitDepth\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoCreditToClaim\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfOrderResolution\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRootClaim\",\"inputs\":[{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}]},{\"type\":\"error\",\"name\":\"ValidStep\",\"inputs\":[]}]",
-	Bin: "0x6101c06040523480156200001257600080fd5b5060405162004808380380620048088339810160408190526200003591620000c6565b858510620000565760405163e62ccf3960e01b815260040160405180910390fd5b63ffffffff90991661016052608097909752610120959095526101409390935260a09190915260c0526001600160401b031660e0526001600160a01b039081166101005216610180526101a05262000177565b80516001600160a01b0381168114620000c157600080fd5b919050565b6000806000806000806000806000806101408b8d031215620000e757600080fd5b8a5163ffffffff81168114620000fc57600080fd5b809a505060208b0151985060408b0151975060608b0151965060808b0151955060a08b0151945060c08b015160018060401b03811681146200013d57600080fd5b93506200014d60e08c01620000a9565b92506200015e6101008c01620000a9565b91506101208b015190509295989b9194979a5092959850565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051614551620002b76000396000818161069b01526124fd01526000818161033e01528181610acb015281816113a4015281816117960152613a3b01526000818161051a015261259701526000818161044f01526136e70152600081816101ff0152818161148201526123d20152600081816102ea01528181611e4d01526121a90152600081816106ee01528181610fcf01526126f501526000818161072101528181610dbc01528181610e8501528181611ca8015281816123a801528181612b3601528181613273015281816133a1015281816134a901526135850152600081816107c301528181610e28015281816119060152818161198c01528181611b970152611cc90152600081816104df0152611d5f01526145516000f3fe6080604052600436106101e75760003560e01c80638d450a951161010e578063d6ae3cd5116100a7578063f3f7214e11610079578063fa24f74311610061578063fa24f74314610790578063fa315aa9146107b4578063fdffbb28146107e757005b8063f3f7214e14610745578063f8f43ff61461077057005b8063d6ae3cd51461068c578063d8cc1a3c146106bf578063e1f0c376146106df578063ec5e63081461071257005b8063c55cd0c7116100e0578063c55cd0c7146105a1578063c6f0308c146105b4578063cf09e0d01461063e578063d5d44d801461065f57005b80638d450a95146104d0578063bbdc02db14610503578063bcef3b5514610544578063c395e1ca1461058157005b8063609d33341161018057806368800abf1161015257806368800abf146104405780638129fc1c146104735780638980e0cc1461047b5780638b85902b1461049057005b8063609d3334146103b857806360e27464146103cd578063632247ea146103ed5780636361506d1461040057005b806335fef567116101b957806335fef567146102c85780633a768463146102db5780633fc8cef31461032f57806354fd4d501461036257005b80630356fe3a146101f057806319effeb414610232578063200d2ed2146102785780632810e1d6146102b357005b366101ee57005b005b3480156101fc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020015b60405180910390f35b34801561023e57600080fd5b5060005461025f9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610229565b34801561028457600080fd5b506000546102a690700100000000000000000000000000000000900460ff1681565b6040516102299190613e16565b3480156102bf57600080fd5b506102a66107fa565b6101ee6102d6366004613e57565b6109f7565b3480156102e757600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610229565b34801561033b57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061030a565b34801561036e57600080fd5b506103ab6040518060400160405280600581526020017f302e372e3100000000000000000000000000000000000000000000000000000081525081565b6040516102299190613ee4565b3480156103c457600080fd5b506103ab610a07565b3480156103d957600080fd5b506101ee6103e8366004613f19565b610a1a565b6101ee6103fb366004613f52565b610bc6565b34801561040c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013561021f565b34801561044c57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061021f565b6101ee61143e565b34801561048757600080fd5b5060015461021f565b34801561049c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013561021f565b3480156104dc57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061021f565b34801561050f57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610229565b34801561055057600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033561021f565b34801561058d57600080fd5b5061021f61059c366004613f87565b611859565b6101ee6105af366004613e57565b611a43565b3480156105c057600080fd5b506105d46105cf366004613fb9565b611a4f565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610229565b34801561064a57600080fd5b5060005461025f9067ffffffffffffffff1681565b34801561066b57600080fd5b5061021f61067a366004613f19565b60026020526000908152604090205481565b34801561069857600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061021f565b3480156106cb57600080fd5b506101ee6106da36600461401b565b611ae6565b3480156106eb57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061025f565b34801561071e57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061021f565b34801561075157600080fd5b506040516fffffffffffffffffffffffffffffffff8152602001610229565b34801561077c57600080fd5b506101ee61078b3660046140a5565b61211b565b34801561079c57600080fd5b506107a5612595565b604051610229939291906140d1565b3480156107c057600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061021f565b6101ee6107f5366004613fb9565b6125f2565b600080600054700100000000000000000000000000000000900460ff16600281111561082857610828613de7565b1461085f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff1661089b576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660016000815481106108c7576108c76140ff565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614610902576001610905565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156109b6576109b6613de7565b0217905560028111156109cb576109cb613de7565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b610a0382826000610bc6565b5050565b6060610a1560406020612a53565b905090565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040812080549082905590819003610a7f576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b158015610b0f57600080fd5b505af1158015610b23573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610b81576040519150601f19603f3d011682016040523d82523d6000602084013e610b86565b606091505b5050905080610bc1576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610bf257610bf2613de7565b14610c29576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610c3e57610c3e6140ff565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610d039083908690612aea16565b90506000610da3826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050861580610de55750610de27f0000000000000000000000000000000000000000000000000000000000000000600261415d565b81145b8015610def575084155b15610e26576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610e80576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eab7f0000000000000000000000000000000000000000000000000000000000000000600161415d565b8103610ebd57610ebd86888588612af2565b34610ec783611859565b1115610eff576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835160009063ffffffff90811614610f5f576001856000015163ffffffff1681548110610f2e57610f2e6140ff565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b60c0850151600090610f839067ffffffffffffffff165b67ffffffffffffffff1690565b67ffffffffffffffff1642610fad610f76856fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610fc1919061415d565b610fcb9190614175565b90507f000000000000000000000000000000000000000000000000000000000000000060011c677fffffffffffffff1667ffffffffffffffff8216111561103e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526003602052604090205490915060ff16156110bc576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008c8152602001908152602001600020600180805490506113519190614175565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b1580156113e957600080fd5b505af11580156113fd573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b600554610100900460ff1615611480576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013511611537576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560048201526024015b60405180910390fd5b606636111561154e5763c407e0256000526004601cfd5b6040805160e08101825263ffffffff808252600060208301818152328486019081526fffffffffffffffffffffffffffffffff34818116606088019081527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033560808901908152600160a08a0181815242861660c08c0190815282548084018455928a529a5160059092027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915594517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf787018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905590517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8860180549185167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909216919091179055517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9850155915195518116700100000000000000000000000000000000029516949094177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9091015583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b1580156117dc57600080fd5b505af11580156117f0573d6000803e3d6000fd5b50506000805467ffffffffffffffff42167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790555050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905550565b6000806118f8836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690507f000000000000000000000000000000000000000000000000000000000000000081111561195e576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a80630bebc200600061197983836141bb565b9050670de0b6b3a764000060006119b0827f00000000000000000000000000000000000000000000000000000000000000006141cf565b905060006119ce6119c9670de0b6b3a7640000866141cf565b612cb3565b905060006119dc8484612f0e565b905060006119ea8383612f5d565b905060006119f782612f8b565b90506000611a1682611a11670de0b6b3a76400008f6141cf565b613173565b90506000611a248b83612f5d565b9050611a30818d6141cf565b9f9e505050505050505050505050505050565b610a0382826001610bc6565b60018181548110611a5f57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115611b1257611b12613de7565b14611b49576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018781548110611b5e57611b5e6140ff565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050611bbd7f0000000000000000000000000000000000000000000000000000000000000000600161415d565b611c59826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1614611c9a576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808915611d8957611ced7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000614175565b6001901b611d0c846fffffffffffffffffffffffffffffffff166131ad565b67ffffffffffffffff16611d20919061420c565b15611d5d57611d54611d4560016fffffffffffffffffffffffffffffffff8716614220565b865463ffffffff166000613253565b60030154611d7f565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050611db3565b60038501549150611db0611d456fffffffffffffffffffffffffffffffff86166001614251565b90505b600882901b60088a8a604051611dca929190614285565b6040518091039020901b14611e0b576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e168c613337565b90506000611e25836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290611e9f908f908f908f908f908a906004016142de565b6020604051808303816000875af1158015611ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee29190614318565b600485015491149150600090600290611f8d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b612029896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6120339190614331565b61203d9190614352565b67ffffffffffffffff161590508115158103612085576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff16156120dc576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214757612147613de7565b1461217e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061218d86613366565b935093509350935060006121a385858585613793565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612212573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122369190614379565b90506001890361232e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84612292367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015612304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123289190614318565b5061258a565b6002890361235a5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489612292565b600389036123865773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487612292565b600489036124bf5760006123cc6fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000613852565b6123f6907f000000000000000000000000000000000000000000000000000000000000000061415d565b61240190600161415d565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015612494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b89190614318565b505061258a565b60058903612558576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000000060c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122e5565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560606125eb610a07565b9050909192565b60008054700100000000000000000000000000000000900460ff16600281111561261e5761261e613de7565b14612655576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001828154811061266a5761266a6140ff565b6000918252602082206005919091020160048101549092506126ac90700100000000000000000000000000000000900460401c67ffffffffffffffff16610f76565b60048301549091506000906126de90700100000000000000000000000000000000900467ffffffffffffffff16610f76565b6126e89042614331565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c166127228284614396565b67ffffffffffffffff1611612763576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600460205260409020805485158015612783575060055460ff165b156127ba576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801580156127c757508515155b1561282c578454640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156127fa5781612816565b600187015473ffffffffffffffffffffffffffffffffffffffff165b90506128228188613907565b5050505050505050565b60006fffffffffffffffffffffffffffffffff815b8381101561297257600085828154811061285d5761285d6140ff565b60009182526020808320909101548083526004909152604090912054909150156128b3576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182815481106128c8576128c86140ff565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff16158015612921575060048101546fffffffffffffffffffffffffffffffff908116908516115b1561295f576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b50508061296b906143b9565b9050612841565b506129ba73ffffffffffffffffffffffffffffffffffffffff83161561299857826129b4565b600188015473ffffffffffffffffffffffffffffffffffffffff165b88613907565b86547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8416021787556000888152600460205260408120612a1691613dad565b8760000361282257600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050505050505050565b60606000612a8a84367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900361415d565b90508267ffffffffffffffff1667ffffffffffffffff811115612aaf57612aaf6143f1565b6040519080825280601f01601f191660200182016040528015612ad9576020820181803683370190505b509150828160208401375092915050565b151760011b90565b6000612b116fffffffffffffffffffffffffffffffff84166001614251565b90506000612b2182866001613253565b9050600086901a8380612c145750612b5a60027f000000000000000000000000000000000000000000000000000000000000000061420c565b6004830154600290612bfe906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b612c089190614352565b67ffffffffffffffff16145b15612c6c5760ff811660011480612c2e575060ff81166002145b612c67576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161152e565b612caa565b60ff811615612caa576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161152e565b50505050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213612d1257631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202612f4b57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215612f7b5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213612fb957919050565b680755bf798b4a1bf1e58212612fd75763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006131a4670de0b6b3a76400008361318b86612cb3565b6131959190614420565b61319f91906144dc565b612f8b565b90505b92915050565b60008061323a837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b6000808261329c576132976fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000613a93565b6132b7565b6132b7856fffffffffffffffffffffffffffffffff16613c51565b9050600184815481106132cc576132cc6140ff565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461332f57815460018054909163ffffffff1690811061331a5761331a6140ff565b906000526020600020906005020191506132dd565b509392505050565b600080600080600061334886613366565b935093509350935061335c84848484613793565b9695505050505050565b6000806000806000859050600060018281548110613386576133866140ff565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000009061345d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161161349e576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090613565906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1692508211156135e157825463ffffffff166135ab7f0000000000000000000000000000000000000000000000000000000000000000600161415d565b83036135b5578391505b600181815481106135c8576135c86140ff565b90600052602060002090600502019350809450506134a2565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661364a613635856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561372f576000613682836fffffffffffffffffffffffffffffffff166131ad565b67ffffffffffffffff1611156136e55760006136bc6136b460016fffffffffffffffffffffffffffffffff8616614220565b896001613253565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506137099050565b7f00000000000000000000000000000000000000000000000000000000000000009a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750613785565b60006137516136b46fffffffffffffffffffffffffffffffff85166001614251565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff841681036137f95782826040516020016137dc9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b60405160208183030381529060405280519060200120905061384a565b60408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012090505b949350505050565b6000806138df847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60028101546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff000000000000000000000000000000018101613977576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280830180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff17905573ffffffffffffffffffffffffffffffffffffffff841660009081526020919091526040812080548392906139ea90849061415d565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b158015613a7f57600080fd5b505af1158015612caa573d6000803e3d6000fd5b600081613b32846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611613b73576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b7c83613c51565b905081613c1b826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff16116131a7576131a4613c3883600161415d565b6fffffffffffffffffffffffffffffffff831690613cfd565b60008119600183011681613ce5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b600080613d8a847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050808303600180821b0385821b179250505092915050565b5080546000825590600052602060002090810190613dcb9190613dce565b50565b5b80821115613de35760008155600101613dcf565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613e51577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060408385031215613e6a57600080fd5b50508035926020909101359150565b6000815180845260005b81811015613e9f57602081850181015186830182015201613e83565b81811115613eb1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131a46020830184613e79565b73ffffffffffffffffffffffffffffffffffffffff81168114613dcb57600080fd5b600060208284031215613f2b57600080fd5b8135613f3681613ef7565b9392505050565b80358015158114613f4d57600080fd5b919050565b600080600060608486031215613f6757600080fd5b8335925060208401359150613f7e60408501613f3d565b90509250925092565b600060208284031215613f9957600080fd5b81356fffffffffffffffffffffffffffffffff81168114613f3657600080fd5b600060208284031215613fcb57600080fd5b5035919050565b60008083601f840112613fe457600080fd5b50813567ffffffffffffffff811115613ffc57600080fd5b60208301915083602082850101111561401457600080fd5b9250929050565b6000806000806000806080878903121561403457600080fd5b8635955061404460208801613f3d565b9450604087013567ffffffffffffffff8082111561406157600080fd5b61406d8a838b01613fd2565b9096509450606089013591508082111561408657600080fd5b5061409389828a01613fd2565b979a9699509497509295939492505050565b6000806000606084860312156140ba57600080fd5b505081359360208301359350604090920135919050565b63ffffffff841681528260208201526060604082015260006140f66060830184613e79565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156141705761417061412e565b500190565b6000828210156141875761418761412e565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826141ca576141ca61418c565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142075761420761412e565b500290565b60008261421b5761421b61418c565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156142495761424961412e565b039392505050565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561427c5761427c61412e565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006142f2606083018789614295565b8281036020840152614305818688614295565b9150508260408301529695505050505050565b60006020828403121561432a57600080fd5b5051919050565b600067ffffffffffffffff838116908316818110156142495761424961412e565b600067ffffffffffffffff8084168061436d5761436d61418c565b92169190910692915050565b60006020828403121561438b57600080fd5b8151613f3681613ef7565b600067ffffffffffffffff80831681851680830382111561427c5761427c61412e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143ea576143ea61412e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156144615761446161412e565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561449c5761449c61412e565b600087129250878205871284841616156144b8576144b861412e565b878505871281841616156144ce576144ce61412e565b505050929093029392505050565b6000826144eb576144eb61418c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561453f5761453f61412e565b50059056fea164736f6c634300080f000a",
-}
-
-// FaultDisputeGameABI is the input ABI used to generate the binding from.
-// Deprecated: Use FaultDisputeGameMetaData.ABI instead.
-var FaultDisputeGameABI = FaultDisputeGameMetaData.ABI
-
-// FaultDisputeGameBin is the compiled bytecode used for deploying new contracts.
-// Deprecated: Use FaultDisputeGameMetaData.Bin instead.
-var FaultDisputeGameBin = FaultDisputeGameMetaData.Bin
-
-// DeployFaultDisputeGame deploys a new Ethereum contract, binding an instance of FaultDisputeGame to it.
-func DeployFaultDisputeGame(auth *bind.TransactOpts, backend bind.ContractBackend, _gameType uint32, _absolutePrestate [32]byte, _genesisBlockNumber *big.Int, _genesisOutputRoot [32]byte, _maxGameDepth *big.Int, _splitDepth *big.Int, _gameDuration uint64, _vm common.Address, _weth common.Address, _l2ChainId *big.Int) (common.Address, *types.Transaction, *FaultDisputeGame, error) {
-	parsed, err := FaultDisputeGameMetaData.GetAbi()
-	if err != nil {
-		return common.Address{}, nil, nil, err
-	}
-	if parsed == nil {
-		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
-	}
-
-	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(FaultDisputeGameBin), backend, _gameType, _absolutePrestate, _genesisBlockNumber, _genesisOutputRoot, _maxGameDepth, _splitDepth, _gameDuration, _vm, _weth, _l2ChainId)
-	if err != nil {
-		return common.Address{}, nil, nil, err
-	}
-	return address, tx, &FaultDisputeGame{FaultDisputeGameCaller: FaultDisputeGameCaller{contract: contract}, FaultDisputeGameTransactor: FaultDisputeGameTransactor{contract: contract}, FaultDisputeGameFilterer: FaultDisputeGameFilterer{contract: contract}}, nil
-}
-
-// FaultDisputeGame is an auto generated Go binding around an Ethereum contract.
-type FaultDisputeGame struct {
-	FaultDisputeGameCaller     // Read-only binding to the contract
-	FaultDisputeGameTransactor // Write-only binding to the contract
-	FaultDisputeGameFilterer   // Log filterer for contract events
-}
-
-// FaultDisputeGameCaller is an auto generated read-only Go binding around an Ethereum contract.
-type FaultDisputeGameCaller struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// FaultDisputeGameTransactor is an auto generated write-only Go binding around an Ethereum contract.
-type FaultDisputeGameTransactor struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// FaultDisputeGameFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
-type FaultDisputeGameFilterer struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// FaultDisputeGameSession is an auto generated Go binding around an Ethereum contract,
-// with pre-set call and transact options.
-type FaultDisputeGameSession struct {
-	Contract     *FaultDisputeGame // Generic contract binding to set the session for
-	CallOpts     bind.CallOpts     // Call options to use throughout this session
-	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
-
-// FaultDisputeGameCallerSession is an auto generated read-only Go binding around an Ethereum contract,
-// with pre-set call options.
-type FaultDisputeGameCallerSession struct {
-	Contract *FaultDisputeGameCaller // Generic contract caller binding to set the session for
-	CallOpts bind.CallOpts           // Call options to use throughout this session
-}
-
-// FaultDisputeGameTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
-// with pre-set transact options.
-type FaultDisputeGameTransactorSession struct {
-	Contract     *FaultDisputeGameTransactor // Generic contract transactor binding to set the session for
-	TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
-}
-
-// FaultDisputeGameRaw is an auto generated low-level Go binding around an Ethereum contract.
-type FaultDisputeGameRaw struct {
-	Contract *FaultDisputeGame // Generic contract binding to access the raw methods on
-}
-
-// FaultDisputeGameCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
-type FaultDisputeGameCallerRaw struct {
-	Contract *FaultDisputeGameCaller // Generic read-only contract binding to access the raw methods on
-}
-
-// FaultDisputeGameTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
-type FaultDisputeGameTransactorRaw struct {
-	Contract *FaultDisputeGameTransactor // Generic write-only contract binding to access the raw methods on
-}
-
-// NewFaultDisputeGame creates a new instance of FaultDisputeGame, bound to a specific deployed contract.
-func NewFaultDisputeGame(address common.Address, backend bind.ContractBackend) (*FaultDisputeGame, error) {
-	contract, err := bindFaultDisputeGame(address, backend, backend, backend)
-	if err != nil {
-		return nil, err
-	}
-	return &FaultDisputeGame{FaultDisputeGameCaller: FaultDisputeGameCaller{contract: contract}, FaultDisputeGameTransactor: FaultDisputeGameTransactor{contract: contract}, FaultDisputeGameFilterer: FaultDisputeGameFilterer{contract: contract}}, nil
-}
-
-// NewFaultDisputeGameCaller creates a new read-only instance of FaultDisputeGame, bound to a specific deployed contract.
-func NewFaultDisputeGameCaller(address common.Address, caller bind.ContractCaller) (*FaultDisputeGameCaller, error) {
-	contract, err := bindFaultDisputeGame(address, caller, nil, nil)
-	if err != nil {
-		return nil, err
-	}
-	return &FaultDisputeGameCaller{contract: contract}, nil
-}
-
-// NewFaultDisputeGameTransactor creates a new write-only instance of FaultDisputeGame, bound to a specific deployed contract.
-func NewFaultDisputeGameTransactor(address common.Address, transactor bind.ContractTransactor) (*FaultDisputeGameTransactor, error) {
-	contract, err := bindFaultDisputeGame(address, nil, transactor, nil)
-	if err != nil {
-		return nil, err
-	}
-	return &FaultDisputeGameTransactor{contract: contract}, nil
-}
-
-// NewFaultDisputeGameFilterer creates a new log filterer instance of FaultDisputeGame, bound to a specific deployed contract.
-func NewFaultDisputeGameFilterer(address common.Address, filterer bind.ContractFilterer) (*FaultDisputeGameFilterer, error) {
-	contract, err := bindFaultDisputeGame(address, nil, nil, filterer)
-	if err != nil {
-		return nil, err
-	}
-	return &FaultDisputeGameFilterer{contract: contract}, nil
-}
-
-// bindFaultDisputeGame binds a generic wrapper to an already deployed contract.
-func bindFaultDisputeGame(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
-	parsed, err := abi.JSON(strings.NewReader(FaultDisputeGameABI))
-	if err != nil {
-		return nil, err
-	}
-	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_FaultDisputeGame *FaultDisputeGameRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
-	return _FaultDisputeGame.Contract.FaultDisputeGameCaller.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_FaultDisputeGame *FaultDisputeGameRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.FaultDisputeGameTransactor.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_FaultDisputeGame *FaultDisputeGameRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.FaultDisputeGameTransactor.contract.Transact(opts, method, params...)
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_FaultDisputeGame *FaultDisputeGameCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
-	return _FaultDisputeGame.Contract.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_FaultDisputeGame *FaultDisputeGameTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_FaultDisputeGame *FaultDisputeGameTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.contract.Transact(opts, method, params...)
-}
-
-// AbsolutePrestate is a free data retrieval call binding the contract method 0x8d450a95.
-//
-// Solidity: function absolutePrestate() view returns(bytes32 absolutePrestate_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) AbsolutePrestate(opts *bind.CallOpts) ([32]byte, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "absolutePrestate")
-
-	if err != nil {
-		return *new([32]byte), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
-
-	return out0, err
-
-}
-
-// AbsolutePrestate is a free data retrieval call binding the contract method 0x8d450a95.
-//
-// Solidity: function absolutePrestate() view returns(bytes32 absolutePrestate_)
-func (_FaultDisputeGame *FaultDisputeGameSession) AbsolutePrestate() ([32]byte, error) {
-	return _FaultDisputeGame.Contract.AbsolutePrestate(&_FaultDisputeGame.CallOpts)
-}
-
-// AbsolutePrestate is a free data retrieval call binding the contract method 0x8d450a95.
-//
-// Solidity: function absolutePrestate() view returns(bytes32 absolutePrestate_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) AbsolutePrestate() ([32]byte, error) {
-	return _FaultDisputeGame.Contract.AbsolutePrestate(&_FaultDisputeGame.CallOpts)
-}
-
-// ClaimData is a free data retrieval call binding the contract method 0xc6f0308c.
-//
-// Solidity: function claimData(uint256 ) view returns(uint32 parentIndex, address counteredBy, address claimant, uint128 bond, bytes32 claim, uint128 position, uint128 clock)
-func (_FaultDisputeGame *FaultDisputeGameCaller) ClaimData(opts *bind.CallOpts, arg0 *big.Int) (struct {
-	ParentIndex uint32
-	CounteredBy common.Address
-	Claimant    common.Address
-	Bond        *big.Int
-	Claim       [32]byte
-	Position    *big.Int
-	Clock       *big.Int
-}, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "claimData", arg0)
-
-	outstruct := new(struct {
-		ParentIndex uint32
-		CounteredBy common.Address
-		Claimant    common.Address
-		Bond        *big.Int
-		Claim       [32]byte
-		Position    *big.Int
-		Clock       *big.Int
-	})
-	if err != nil {
-		return *outstruct, err
-	}
-
-	outstruct.ParentIndex = *abi.ConvertType(out[0], new(uint32)).(*uint32)
-	outstruct.CounteredBy = *abi.ConvertType(out[1], new(common.Address)).(*common.Address)
-	outstruct.Claimant = *abi.ConvertType(out[2], new(common.Address)).(*common.Address)
-	outstruct.Bond = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int)
-	outstruct.Claim = *abi.ConvertType(out[4], new([32]byte)).(*[32]byte)
-	outstruct.Position = *abi.ConvertType(out[5], new(*big.Int)).(**big.Int)
-	outstruct.Clock = *abi.ConvertType(out[6], new(*big.Int)).(**big.Int)
-
-	return *outstruct, err
-
-}
-
-// ClaimData is a free data retrieval call binding the contract method 0xc6f0308c.
-//
-// Solidity: function claimData(uint256 ) view returns(uint32 parentIndex, address counteredBy, address claimant, uint128 bond, bytes32 claim, uint128 position, uint128 clock)
-func (_FaultDisputeGame *FaultDisputeGameSession) ClaimData(arg0 *big.Int) (struct {
-	ParentIndex uint32
-	CounteredBy common.Address
-	Claimant    common.Address
-	Bond        *big.Int
-	Claim       [32]byte
-	Position    *big.Int
-	Clock       *big.Int
-}, error) {
-	return _FaultDisputeGame.Contract.ClaimData(&_FaultDisputeGame.CallOpts, arg0)
-}
-
-// ClaimData is a free data retrieval call binding the contract method 0xc6f0308c.
-//
-// Solidity: function claimData(uint256 ) view returns(uint32 parentIndex, address counteredBy, address claimant, uint128 bond, bytes32 claim, uint128 position, uint128 clock)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) ClaimData(arg0 *big.Int) (struct {
-	ParentIndex uint32
-	CounteredBy common.Address
-	Claimant    common.Address
-	Bond        *big.Int
-	Claim       [32]byte
-	Position    *big.Int
-	Clock       *big.Int
-}, error) {
-	return _FaultDisputeGame.Contract.ClaimData(&_FaultDisputeGame.CallOpts, arg0)
-}
-
-// ClaimDataLen is a free data retrieval call binding the contract method 0x8980e0cc.
-//
-// Solidity: function claimDataLen() view returns(uint256 len_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) ClaimDataLen(opts *bind.CallOpts) (*big.Int, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "claimDataLen")
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// ClaimDataLen is a free data retrieval call binding the contract method 0x8980e0cc.
-//
-// Solidity: function claimDataLen() view returns(uint256 len_)
-func (_FaultDisputeGame *FaultDisputeGameSession) ClaimDataLen() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.ClaimDataLen(&_FaultDisputeGame.CallOpts)
-}
-
-// ClaimDataLen is a free data retrieval call binding the contract method 0x8980e0cc.
-//
-// Solidity: function claimDataLen() view returns(uint256 len_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) ClaimDataLen() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.ClaimDataLen(&_FaultDisputeGame.CallOpts)
-}
-
-// ClaimedBondFlag is a free data retrieval call binding the contract method 0xf3f7214e.
-//
-// Solidity: function claimedBondFlag() pure returns(uint128 claimedBondFlag_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) ClaimedBondFlag(opts *bind.CallOpts) (*big.Int, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "claimedBondFlag")
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// ClaimedBondFlag is a free data retrieval call binding the contract method 0xf3f7214e.
-//
-// Solidity: function claimedBondFlag() pure returns(uint128 claimedBondFlag_)
-func (_FaultDisputeGame *FaultDisputeGameSession) ClaimedBondFlag() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.ClaimedBondFlag(&_FaultDisputeGame.CallOpts)
-}
-
-// ClaimedBondFlag is a free data retrieval call binding the contract method 0xf3f7214e.
-//
-// Solidity: function claimedBondFlag() pure returns(uint128 claimedBondFlag_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) ClaimedBondFlag() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.ClaimedBondFlag(&_FaultDisputeGame.CallOpts)
-}
-
-// CreatedAt is a free data retrieval call binding the contract method 0xcf09e0d0.
-//
-// Solidity: function createdAt() view returns(uint64)
-func (_FaultDisputeGame *FaultDisputeGameCaller) CreatedAt(opts *bind.CallOpts) (uint64, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "createdAt")
-
-	if err != nil {
-		return *new(uint64), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
-
-	return out0, err
-
-}
-
-// CreatedAt is a free data retrieval call binding the contract method 0xcf09e0d0.
-//
-// Solidity: function createdAt() view returns(uint64)
-func (_FaultDisputeGame *FaultDisputeGameSession) CreatedAt() (uint64, error) {
-	return _FaultDisputeGame.Contract.CreatedAt(&_FaultDisputeGame.CallOpts)
-}
-
-// CreatedAt is a free data retrieval call binding the contract method 0xcf09e0d0.
-//
-// Solidity: function createdAt() view returns(uint64)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) CreatedAt() (uint64, error) {
-	return _FaultDisputeGame.Contract.CreatedAt(&_FaultDisputeGame.CallOpts)
-}
-
-// Credit is a free data retrieval call binding the contract method 0xd5d44d80.
-//
-// Solidity: function credit(address ) view returns(uint256)
-func (_FaultDisputeGame *FaultDisputeGameCaller) Credit(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "credit", arg0)
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// Credit is a free data retrieval call binding the contract method 0xd5d44d80.
-//
-// Solidity: function credit(address ) view returns(uint256)
-func (_FaultDisputeGame *FaultDisputeGameSession) Credit(arg0 common.Address) (*big.Int, error) {
-	return _FaultDisputeGame.Contract.Credit(&_FaultDisputeGame.CallOpts, arg0)
-}
-
-// Credit is a free data retrieval call binding the contract method 0xd5d44d80.
-//
-// Solidity: function credit(address ) view returns(uint256)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) Credit(arg0 common.Address) (*big.Int, error) {
-	return _FaultDisputeGame.Contract.Credit(&_FaultDisputeGame.CallOpts, arg0)
-}
-
-// ExtraData is a free data retrieval call binding the contract method 0x609d3334.
-//
-// Solidity: function extraData() pure returns(bytes extraData_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) ExtraData(opts *bind.CallOpts) ([]byte, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "extraData")
-
-	if err != nil {
-		return *new([]byte), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
-
-	return out0, err
-
-}
-
-// ExtraData is a free data retrieval call binding the contract method 0x609d3334.
-//
-// Solidity: function extraData() pure returns(bytes extraData_)
-func (_FaultDisputeGame *FaultDisputeGameSession) ExtraData() ([]byte, error) {
-	return _FaultDisputeGame.Contract.ExtraData(&_FaultDisputeGame.CallOpts)
-}
-
-// ExtraData is a free data retrieval call binding the contract method 0x609d3334.
-//
-// Solidity: function extraData() pure returns(bytes extraData_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) ExtraData() ([]byte, error) {
-	return _FaultDisputeGame.Contract.ExtraData(&_FaultDisputeGame.CallOpts)
-}
-
-// GameData is a free data retrieval call binding the contract method 0xfa24f743.
-//
-// Solidity: function gameData() view returns(uint32 gameType_, bytes32 rootClaim_, bytes extraData_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) GameData(opts *bind.CallOpts) (struct {
-	GameType  uint32
-	RootClaim [32]byte
-	ExtraData []byte
-}, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "gameData")
-
-	outstruct := new(struct {
-		GameType  uint32
-		RootClaim [32]byte
-		ExtraData []byte
-	})
-	if err != nil {
-		return *outstruct, err
-	}
-
-	outstruct.GameType = *abi.ConvertType(out[0], new(uint32)).(*uint32)
-	outstruct.RootClaim = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte)
-	outstruct.ExtraData = *abi.ConvertType(out[2], new([]byte)).(*[]byte)
-
-	return *outstruct, err
-
-}
-
-// GameData is a free data retrieval call binding the contract method 0xfa24f743.
-//
-// Solidity: function gameData() view returns(uint32 gameType_, bytes32 rootClaim_, bytes extraData_)
-func (_FaultDisputeGame *FaultDisputeGameSession) GameData() (struct {
-	GameType  uint32
-	RootClaim [32]byte
-	ExtraData []byte
-}, error) {
-	return _FaultDisputeGame.Contract.GameData(&_FaultDisputeGame.CallOpts)
-}
-
-// GameData is a free data retrieval call binding the contract method 0xfa24f743.
-//
-// Solidity: function gameData() view returns(uint32 gameType_, bytes32 rootClaim_, bytes extraData_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) GameData() (struct {
-	GameType  uint32
-	RootClaim [32]byte
-	ExtraData []byte
-}, error) {
-	return _FaultDisputeGame.Contract.GameData(&_FaultDisputeGame.CallOpts)
-}
-
-// GameDuration is a free data retrieval call binding the contract method 0xe1f0c376.
-//
-// Solidity: function gameDuration() view returns(uint64 gameDuration_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) GameDuration(opts *bind.CallOpts) (uint64, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "gameDuration")
-
-	if err != nil {
-		return *new(uint64), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
-
-	return out0, err
-
-}
-
-// GameDuration is a free data retrieval call binding the contract method 0xe1f0c376.
-//
-// Solidity: function gameDuration() view returns(uint64 gameDuration_)
-func (_FaultDisputeGame *FaultDisputeGameSession) GameDuration() (uint64, error) {
-	return _FaultDisputeGame.Contract.GameDuration(&_FaultDisputeGame.CallOpts)
-}
-
-// GameDuration is a free data retrieval call binding the contract method 0xe1f0c376.
-//
-// Solidity: function gameDuration() view returns(uint64 gameDuration_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) GameDuration() (uint64, error) {
-	return _FaultDisputeGame.Contract.GameDuration(&_FaultDisputeGame.CallOpts)
-}
-
-// GameType is a free data retrieval call binding the contract method 0xbbdc02db.
-//
-// Solidity: function gameType() view returns(uint32 gameType_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) GameType(opts *bind.CallOpts) (uint32, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "gameType")
-
-	if err != nil {
-		return *new(uint32), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
-
-	return out0, err
-
-}
-
-// GameType is a free data retrieval call binding the contract method 0xbbdc02db.
-//
-// Solidity: function gameType() view returns(uint32 gameType_)
-func (_FaultDisputeGame *FaultDisputeGameSession) GameType() (uint32, error) {
-	return _FaultDisputeGame.Contract.GameType(&_FaultDisputeGame.CallOpts)
-}
-
-// GameType is a free data retrieval call binding the contract method 0xbbdc02db.
-//
-// Solidity: function gameType() view returns(uint32 gameType_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) GameType() (uint32, error) {
-	return _FaultDisputeGame.Contract.GameType(&_FaultDisputeGame.CallOpts)
-}
-
-// GenesisBlockNumber is a free data retrieval call binding the contract method 0x0356fe3a.
-//
-// Solidity: function genesisBlockNumber() view returns(uint256 genesisBlockNumber_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) GenesisBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "genesisBlockNumber")
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// GenesisBlockNumber is a free data retrieval call binding the contract method 0x0356fe3a.
-//
-// Solidity: function genesisBlockNumber() view returns(uint256 genesisBlockNumber_)
-func (_FaultDisputeGame *FaultDisputeGameSession) GenesisBlockNumber() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.GenesisBlockNumber(&_FaultDisputeGame.CallOpts)
-}
-
-// GenesisBlockNumber is a free data retrieval call binding the contract method 0x0356fe3a.
-//
-// Solidity: function genesisBlockNumber() view returns(uint256 genesisBlockNumber_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) GenesisBlockNumber() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.GenesisBlockNumber(&_FaultDisputeGame.CallOpts)
-}
-
-// GenesisOutputRoot is a free data retrieval call binding the contract method 0x68800abf.
-//
-// Solidity: function genesisOutputRoot() view returns(bytes32 genesisOutputRoot_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) GenesisOutputRoot(opts *bind.CallOpts) ([32]byte, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "genesisOutputRoot")
-
-	if err != nil {
-		return *new([32]byte), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
-
-	return out0, err
-
-}
-
-// GenesisOutputRoot is a free data retrieval call binding the contract method 0x68800abf.
-//
-// Solidity: function genesisOutputRoot() view returns(bytes32 genesisOutputRoot_)
-func (_FaultDisputeGame *FaultDisputeGameSession) GenesisOutputRoot() ([32]byte, error) {
-	return _FaultDisputeGame.Contract.GenesisOutputRoot(&_FaultDisputeGame.CallOpts)
-}
-
-// GenesisOutputRoot is a free data retrieval call binding the contract method 0x68800abf.
-//
-// Solidity: function genesisOutputRoot() view returns(bytes32 genesisOutputRoot_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) GenesisOutputRoot() ([32]byte, error) {
-	return _FaultDisputeGame.Contract.GenesisOutputRoot(&_FaultDisputeGame.CallOpts)
-}
-
-// GetRequiredBond is a free data retrieval call binding the contract method 0xc395e1ca.
-//
-// Solidity: function getRequiredBond(uint128 _position) view returns(uint256 requiredBond_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) GetRequiredBond(opts *bind.CallOpts, _position *big.Int) (*big.Int, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "getRequiredBond", _position)
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// GetRequiredBond is a free data retrieval call binding the contract method 0xc395e1ca.
-//
-// Solidity: function getRequiredBond(uint128 _position) view returns(uint256 requiredBond_)
-func (_FaultDisputeGame *FaultDisputeGameSession) GetRequiredBond(_position *big.Int) (*big.Int, error) {
-	return _FaultDisputeGame.Contract.GetRequiredBond(&_FaultDisputeGame.CallOpts, _position)
-}
-
-// GetRequiredBond is a free data retrieval call binding the contract method 0xc395e1ca.
-//
-// Solidity: function getRequiredBond(uint128 _position) view returns(uint256 requiredBond_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) GetRequiredBond(_position *big.Int) (*big.Int, error) {
-	return _FaultDisputeGame.Contract.GetRequiredBond(&_FaultDisputeGame.CallOpts, _position)
-}
-
-// L1Head is a free data retrieval call binding the contract method 0x6361506d.
-//
-// Solidity: function l1Head() pure returns(bytes32 l1Head_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) L1Head(opts *bind.CallOpts) ([32]byte, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "l1Head")
-
-	if err != nil {
-		return *new([32]byte), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
-
-	return out0, err
-
-}
-
-// L1Head is a free data retrieval call binding the contract method 0x6361506d.
-//
-// Solidity: function l1Head() pure returns(bytes32 l1Head_)
-func (_FaultDisputeGame *FaultDisputeGameSession) L1Head() ([32]byte, error) {
-	return _FaultDisputeGame.Contract.L1Head(&_FaultDisputeGame.CallOpts)
-}
-
-// L1Head is a free data retrieval call binding the contract method 0x6361506d.
-//
-// Solidity: function l1Head() pure returns(bytes32 l1Head_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) L1Head() ([32]byte, error) {
-	return _FaultDisputeGame.Contract.L1Head(&_FaultDisputeGame.CallOpts)
-}
-
-// L2BlockNumber is a free data retrieval call binding the contract method 0x8b85902b.
-//
-// Solidity: function l2BlockNumber() pure returns(uint256 l2BlockNumber_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) L2BlockNumber(opts *bind.CallOpts) (*big.Int, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "l2BlockNumber")
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// L2BlockNumber is a free data retrieval call binding the contract method 0x8b85902b.
-//
-// Solidity: function l2BlockNumber() pure returns(uint256 l2BlockNumber_)
-func (_FaultDisputeGame *FaultDisputeGameSession) L2BlockNumber() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.L2BlockNumber(&_FaultDisputeGame.CallOpts)
-}
-
-// L2BlockNumber is a free data retrieval call binding the contract method 0x8b85902b.
-//
-// Solidity: function l2BlockNumber() pure returns(uint256 l2BlockNumber_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) L2BlockNumber() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.L2BlockNumber(&_FaultDisputeGame.CallOpts)
-}
-
-// L2ChainId is a free data retrieval call binding the contract method 0xd6ae3cd5.
-//
-// Solidity: function l2ChainId() view returns(uint256 l2ChainId_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) L2ChainId(opts *bind.CallOpts) (*big.Int, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "l2ChainId")
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// L2ChainId is a free data retrieval call binding the contract method 0xd6ae3cd5.
-//
-// Solidity: function l2ChainId() view returns(uint256 l2ChainId_)
-func (_FaultDisputeGame *FaultDisputeGameSession) L2ChainId() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.L2ChainId(&_FaultDisputeGame.CallOpts)
-}
-
-// L2ChainId is a free data retrieval call binding the contract method 0xd6ae3cd5.
-//
-// Solidity: function l2ChainId() view returns(uint256 l2ChainId_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) L2ChainId() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.L2ChainId(&_FaultDisputeGame.CallOpts)
-}
-
-// MaxGameDepth is a free data retrieval call binding the contract method 0xfa315aa9.
-//
-// Solidity: function maxGameDepth() view returns(uint256 maxGameDepth_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) MaxGameDepth(opts *bind.CallOpts) (*big.Int, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "maxGameDepth")
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// MaxGameDepth is a free data retrieval call binding the contract method 0xfa315aa9.
-//
-// Solidity: function maxGameDepth() view returns(uint256 maxGameDepth_)
-func (_FaultDisputeGame *FaultDisputeGameSession) MaxGameDepth() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.MaxGameDepth(&_FaultDisputeGame.CallOpts)
-}
-
-// MaxGameDepth is a free data retrieval call binding the contract method 0xfa315aa9.
-//
-// Solidity: function maxGameDepth() view returns(uint256 maxGameDepth_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) MaxGameDepth() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.MaxGameDepth(&_FaultDisputeGame.CallOpts)
-}
-
-// ResolvedAt is a free data retrieval call binding the contract method 0x19effeb4.
-//
-// Solidity: function resolvedAt() view returns(uint64)
-func (_FaultDisputeGame *FaultDisputeGameCaller) ResolvedAt(opts *bind.CallOpts) (uint64, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "resolvedAt")
-
-	if err != nil {
-		return *new(uint64), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
-
-	return out0, err
-
-}
-
-// ResolvedAt is a free data retrieval call binding the contract method 0x19effeb4.
-//
-// Solidity: function resolvedAt() view returns(uint64)
-func (_FaultDisputeGame *FaultDisputeGameSession) ResolvedAt() (uint64, error) {
-	return _FaultDisputeGame.Contract.ResolvedAt(&_FaultDisputeGame.CallOpts)
-}
-
-// ResolvedAt is a free data retrieval call binding the contract method 0x19effeb4.
-//
-// Solidity: function resolvedAt() view returns(uint64)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) ResolvedAt() (uint64, error) {
-	return _FaultDisputeGame.Contract.ResolvedAt(&_FaultDisputeGame.CallOpts)
-}
-
-// RootClaim is a free data retrieval call binding the contract method 0xbcef3b55.
-//
-// Solidity: function rootClaim() pure returns(bytes32 rootClaim_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) RootClaim(opts *bind.CallOpts) ([32]byte, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "rootClaim")
-
-	if err != nil {
-		return *new([32]byte), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
-
-	return out0, err
-
-}
-
-// RootClaim is a free data retrieval call binding the contract method 0xbcef3b55.
-//
-// Solidity: function rootClaim() pure returns(bytes32 rootClaim_)
-func (_FaultDisputeGame *FaultDisputeGameSession) RootClaim() ([32]byte, error) {
-	return _FaultDisputeGame.Contract.RootClaim(&_FaultDisputeGame.CallOpts)
-}
-
-// RootClaim is a free data retrieval call binding the contract method 0xbcef3b55.
-//
-// Solidity: function rootClaim() pure returns(bytes32 rootClaim_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) RootClaim() ([32]byte, error) {
-	return _FaultDisputeGame.Contract.RootClaim(&_FaultDisputeGame.CallOpts)
-}
-
-// SplitDepth is a free data retrieval call binding the contract method 0xec5e6308.
-//
-// Solidity: function splitDepth() view returns(uint256 splitDepth_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) SplitDepth(opts *bind.CallOpts) (*big.Int, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "splitDepth")
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// SplitDepth is a free data retrieval call binding the contract method 0xec5e6308.
-//
-// Solidity: function splitDepth() view returns(uint256 splitDepth_)
-func (_FaultDisputeGame *FaultDisputeGameSession) SplitDepth() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.SplitDepth(&_FaultDisputeGame.CallOpts)
-}
-
-// SplitDepth is a free data retrieval call binding the contract method 0xec5e6308.
-//
-// Solidity: function splitDepth() view returns(uint256 splitDepth_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) SplitDepth() (*big.Int, error) {
-	return _FaultDisputeGame.Contract.SplitDepth(&_FaultDisputeGame.CallOpts)
-}
-
-// Status is a free data retrieval call binding the contract method 0x200d2ed2.
-//
-// Solidity: function status() view returns(uint8)
-func (_FaultDisputeGame *FaultDisputeGameCaller) Status(opts *bind.CallOpts) (uint8, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "status")
-
-	if err != nil {
-		return *new(uint8), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
-
-	return out0, err
-
-}
-
-// Status is a free data retrieval call binding the contract method 0x200d2ed2.
-//
-// Solidity: function status() view returns(uint8)
-func (_FaultDisputeGame *FaultDisputeGameSession) Status() (uint8, error) {
-	return _FaultDisputeGame.Contract.Status(&_FaultDisputeGame.CallOpts)
-}
-
-// Status is a free data retrieval call binding the contract method 0x200d2ed2.
-//
-// Solidity: function status() view returns(uint8)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) Status() (uint8, error) {
-	return _FaultDisputeGame.Contract.Status(&_FaultDisputeGame.CallOpts)
-}
-
-// Version is a free data retrieval call binding the contract method 0x54fd4d50.
-//
-// Solidity: function version() view returns(string)
-func (_FaultDisputeGame *FaultDisputeGameCaller) Version(opts *bind.CallOpts) (string, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "version")
-
-	if err != nil {
-		return *new(string), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(string)).(*string)
-
-	return out0, err
-
-}
-
-// Version is a free data retrieval call binding the contract method 0x54fd4d50.
-//
-// Solidity: function version() view returns(string)
-func (_FaultDisputeGame *FaultDisputeGameSession) Version() (string, error) {
-	return _FaultDisputeGame.Contract.Version(&_FaultDisputeGame.CallOpts)
-}
-
-// Version is a free data retrieval call binding the contract method 0x54fd4d50.
-//
-// Solidity: function version() view returns(string)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) Version() (string, error) {
-	return _FaultDisputeGame.Contract.Version(&_FaultDisputeGame.CallOpts)
-}
-
-// Vm is a free data retrieval call binding the contract method 0x3a768463.
-//
-// Solidity: function vm() view returns(address vm_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) Vm(opts *bind.CallOpts) (common.Address, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "vm")
-
-	if err != nil {
-		return *new(common.Address), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
-	return out0, err
-
-}
-
-// Vm is a free data retrieval call binding the contract method 0x3a768463.
-//
-// Solidity: function vm() view returns(address vm_)
-func (_FaultDisputeGame *FaultDisputeGameSession) Vm() (common.Address, error) {
-	return _FaultDisputeGame.Contract.Vm(&_FaultDisputeGame.CallOpts)
-}
-
-// Vm is a free data retrieval call binding the contract method 0x3a768463.
-//
-// Solidity: function vm() view returns(address vm_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) Vm() (common.Address, error) {
-	return _FaultDisputeGame.Contract.Vm(&_FaultDisputeGame.CallOpts)
-}
-
-// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
-//
-// Solidity: function weth() view returns(address weth_)
-func (_FaultDisputeGame *FaultDisputeGameCaller) Weth(opts *bind.CallOpts) (common.Address, error) {
-	var out []interface{}
-	err := _FaultDisputeGame.contract.Call(opts, &out, "weth")
-
-	if err != nil {
-		return *new(common.Address), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
-	return out0, err
-
-}
-
-// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
-//
-// Solidity: function weth() view returns(address weth_)
-func (_FaultDisputeGame *FaultDisputeGameSession) Weth() (common.Address, error) {
-	return _FaultDisputeGame.Contract.Weth(&_FaultDisputeGame.CallOpts)
-}
-
-// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
-//
-// Solidity: function weth() view returns(address weth_)
-func (_FaultDisputeGame *FaultDisputeGameCallerSession) Weth() (common.Address, error) {
-	return _FaultDisputeGame.Contract.Weth(&_FaultDisputeGame.CallOpts)
-}
-
-// AddLocalData is a paid mutator transaction binding the contract method 0xf8f43ff6.
-//
-// Solidity: function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactor) AddLocalData(opts *bind.TransactOpts, _ident *big.Int, _execLeafIdx *big.Int, _partOffset *big.Int) (*types.Transaction, error) {
-	return _FaultDisputeGame.contract.Transact(opts, "addLocalData", _ident, _execLeafIdx, _partOffset)
-}
-
-// AddLocalData is a paid mutator transaction binding the contract method 0xf8f43ff6.
-//
-// Solidity: function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) returns()
-func (_FaultDisputeGame *FaultDisputeGameSession) AddLocalData(_ident *big.Int, _execLeafIdx *big.Int, _partOffset *big.Int) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.AddLocalData(&_FaultDisputeGame.TransactOpts, _ident, _execLeafIdx, _partOffset)
-}
-
-// AddLocalData is a paid mutator transaction binding the contract method 0xf8f43ff6.
-//
-// Solidity: function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactorSession) AddLocalData(_ident *big.Int, _execLeafIdx *big.Int, _partOffset *big.Int) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.AddLocalData(&_FaultDisputeGame.TransactOpts, _ident, _execLeafIdx, _partOffset)
-}
-
-// Attack is a paid mutator transaction binding the contract method 0xc55cd0c7.
-//
-// Solidity: function attack(uint256 _parentIndex, bytes32 _claim) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactor) Attack(opts *bind.TransactOpts, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.contract.Transact(opts, "attack", _parentIndex, _claim)
-}
-
-// Attack is a paid mutator transaction binding the contract method 0xc55cd0c7.
-//
-// Solidity: function attack(uint256 _parentIndex, bytes32 _claim) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameSession) Attack(_parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Attack(&_FaultDisputeGame.TransactOpts, _parentIndex, _claim)
-}
-
-// Attack is a paid mutator transaction binding the contract method 0xc55cd0c7.
-//
-// Solidity: function attack(uint256 _parentIndex, bytes32 _claim) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Attack(_parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Attack(&_FaultDisputeGame.TransactOpts, _parentIndex, _claim)
-}
-
-// ClaimCredit is a paid mutator transaction binding the contract method 0x60e27464.
-//
-// Solidity: function claimCredit(address _recipient) returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactor) ClaimCredit(opts *bind.TransactOpts, _recipient common.Address) (*types.Transaction, error) {
-	return _FaultDisputeGame.contract.Transact(opts, "claimCredit", _recipient)
-}
-
-// ClaimCredit is a paid mutator transaction binding the contract method 0x60e27464.
-//
-// Solidity: function claimCredit(address _recipient) returns()
-func (_FaultDisputeGame *FaultDisputeGameSession) ClaimCredit(_recipient common.Address) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.ClaimCredit(&_FaultDisputeGame.TransactOpts, _recipient)
-}
-
-// ClaimCredit is a paid mutator transaction binding the contract method 0x60e27464.
-//
-// Solidity: function claimCredit(address _recipient) returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactorSession) ClaimCredit(_recipient common.Address) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.ClaimCredit(&_FaultDisputeGame.TransactOpts, _recipient)
-}
-
-// Defend is a paid mutator transaction binding the contract method 0x35fef567.
-//
-// Solidity: function defend(uint256 _parentIndex, bytes32 _claim) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactor) Defend(opts *bind.TransactOpts, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.contract.Transact(opts, "defend", _parentIndex, _claim)
-}
-
-// Defend is a paid mutator transaction binding the contract method 0x35fef567.
-//
-// Solidity: function defend(uint256 _parentIndex, bytes32 _claim) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameSession) Defend(_parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Defend(&_FaultDisputeGame.TransactOpts, _parentIndex, _claim)
-}
-
-// Defend is a paid mutator transaction binding the contract method 0x35fef567.
-//
-// Solidity: function defend(uint256 _parentIndex, bytes32 _claim) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Defend(_parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Defend(&_FaultDisputeGame.TransactOpts, _parentIndex, _claim)
-}
-
-// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
-//
-// Solidity: function initialize() payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactor) Initialize(opts *bind.TransactOpts) (*types.Transaction, error) {
-	return _FaultDisputeGame.contract.Transact(opts, "initialize")
-}
-
-// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
-//
-// Solidity: function initialize() payable returns()
-func (_FaultDisputeGame *FaultDisputeGameSession) Initialize() (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Initialize(&_FaultDisputeGame.TransactOpts)
-}
-
-// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
-//
-// Solidity: function initialize() payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Initialize() (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Initialize(&_FaultDisputeGame.TransactOpts)
-}
-
-// Move is a paid mutator transaction binding the contract method 0x632247ea.
-//
-// Solidity: function move(uint256 _challengeIndex, bytes32 _claim, bool _isAttack) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactor) Move(opts *bind.TransactOpts, _challengeIndex *big.Int, _claim [32]byte, _isAttack bool) (*types.Transaction, error) {
-	return _FaultDisputeGame.contract.Transact(opts, "move", _challengeIndex, _claim, _isAttack)
-}
-
-// Move is a paid mutator transaction binding the contract method 0x632247ea.
-//
-// Solidity: function move(uint256 _challengeIndex, bytes32 _claim, bool _isAttack) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameSession) Move(_challengeIndex *big.Int, _claim [32]byte, _isAttack bool) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Move(&_FaultDisputeGame.TransactOpts, _challengeIndex, _claim, _isAttack)
-}
-
-// Move is a paid mutator transaction binding the contract method 0x632247ea.
-//
-// Solidity: function move(uint256 _challengeIndex, bytes32 _claim, bool _isAttack) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Move(_challengeIndex *big.Int, _claim [32]byte, _isAttack bool) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Move(&_FaultDisputeGame.TransactOpts, _challengeIndex, _claim, _isAttack)
-}
-
-// Resolve is a paid mutator transaction binding the contract method 0x2810e1d6.
-//
-// Solidity: function resolve() returns(uint8 status_)
-func (_FaultDisputeGame *FaultDisputeGameTransactor) Resolve(opts *bind.TransactOpts) (*types.Transaction, error) {
-	return _FaultDisputeGame.contract.Transact(opts, "resolve")
-}
-
-// Resolve is a paid mutator transaction binding the contract method 0x2810e1d6.
-//
-// Solidity: function resolve() returns(uint8 status_)
-func (_FaultDisputeGame *FaultDisputeGameSession) Resolve() (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Resolve(&_FaultDisputeGame.TransactOpts)
-}
-
-// Resolve is a paid mutator transaction binding the contract method 0x2810e1d6.
-//
-// Solidity: function resolve() returns(uint8 status_)
-func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Resolve() (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Resolve(&_FaultDisputeGame.TransactOpts)
-}
-
-// ResolveClaim is a paid mutator transaction binding the contract method 0xfdffbb28.
-//
-// Solidity: function resolveClaim(uint256 _claimIndex) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactor) ResolveClaim(opts *bind.TransactOpts, _claimIndex *big.Int) (*types.Transaction, error) {
-	return _FaultDisputeGame.contract.Transact(opts, "resolveClaim", _claimIndex)
-}
-
-// ResolveClaim is a paid mutator transaction binding the contract method 0xfdffbb28.
-//
-// Solidity: function resolveClaim(uint256 _claimIndex) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameSession) ResolveClaim(_claimIndex *big.Int) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.ResolveClaim(&_FaultDisputeGame.TransactOpts, _claimIndex)
-}
-
-// ResolveClaim is a paid mutator transaction binding the contract method 0xfdffbb28.
-//
-// Solidity: function resolveClaim(uint256 _claimIndex) payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactorSession) ResolveClaim(_claimIndex *big.Int) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.ResolveClaim(&_FaultDisputeGame.TransactOpts, _claimIndex)
-}
-
-// Step is a paid mutator transaction binding the contract method 0xd8cc1a3c.
-//
-// Solidity: function step(uint256 _claimIndex, bool _isAttack, bytes _stateData, bytes _proof) returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactor) Step(opts *bind.TransactOpts, _claimIndex *big.Int, _isAttack bool, _stateData []byte, _proof []byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.contract.Transact(opts, "step", _claimIndex, _isAttack, _stateData, _proof)
-}
-
-// Step is a paid mutator transaction binding the contract method 0xd8cc1a3c.
-//
-// Solidity: function step(uint256 _claimIndex, bool _isAttack, bytes _stateData, bytes _proof) returns()
-func (_FaultDisputeGame *FaultDisputeGameSession) Step(_claimIndex *big.Int, _isAttack bool, _stateData []byte, _proof []byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Step(&_FaultDisputeGame.TransactOpts, _claimIndex, _isAttack, _stateData, _proof)
-}
-
-// Step is a paid mutator transaction binding the contract method 0xd8cc1a3c.
-//
-// Solidity: function step(uint256 _claimIndex, bool _isAttack, bytes _stateData, bytes _proof) returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Step(_claimIndex *big.Int, _isAttack bool, _stateData []byte, _proof []byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Step(&_FaultDisputeGame.TransactOpts, _claimIndex, _isAttack, _stateData, _proof)
-}
-
-// Fallback is a paid mutator transaction binding the contract fallback function.
-//
-// Solidity: fallback() payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.contract.RawTransact(opts, calldata)
-}
-
-// Fallback is a paid mutator transaction binding the contract fallback function.
-//
-// Solidity: fallback() payable returns()
-func (_FaultDisputeGame *FaultDisputeGameSession) Fallback(calldata []byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Fallback(&_FaultDisputeGame.TransactOpts, calldata)
-}
-
-// Fallback is a paid mutator transaction binding the contract fallback function.
-//
-// Solidity: fallback() payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Fallback(&_FaultDisputeGame.TransactOpts, calldata)
-}
-
-// Receive is a paid mutator transaction binding the contract receive function.
-//
-// Solidity: receive() payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
-	return _FaultDisputeGame.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
-}
-
-// Receive is a paid mutator transaction binding the contract receive function.
-//
-// Solidity: receive() payable returns()
-func (_FaultDisputeGame *FaultDisputeGameSession) Receive() (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Receive(&_FaultDisputeGame.TransactOpts)
-}
-
-// Receive is a paid mutator transaction binding the contract receive function.
-//
-// Solidity: receive() payable returns()
-func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Receive() (*types.Transaction, error) {
-	return _FaultDisputeGame.Contract.Receive(&_FaultDisputeGame.TransactOpts)
-}
-
-// FaultDisputeGameMoveIterator is returned from FilterMove and is used to iterate over the raw logs and unpacked data for Move events raised by the FaultDisputeGame contract.
-type FaultDisputeGameMoveIterator struct {
-	Event *FaultDisputeGameMove // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *FaultDisputeGameMoveIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(FaultDisputeGameMove)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(FaultDisputeGameMove)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *FaultDisputeGameMoveIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *FaultDisputeGameMoveIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// FaultDisputeGameMove represents a Move event raised by the FaultDisputeGame contract.
-type FaultDisputeGameMove struct {
-	ParentIndex *big.Int
-	Claim       [32]byte
-	Claimant    common.Address
-	Raw         types.Log // Blockchain specific contextual infos
-}
-
-// FilterMove is a free log retrieval operation binding the contract event 0x9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be.
-//
-// Solidity: event Move(uint256 indexed parentIndex, bytes32 indexed claim, address indexed claimant)
-func (_FaultDisputeGame *FaultDisputeGameFilterer) FilterMove(opts *bind.FilterOpts, parentIndex []*big.Int, claim [][32]byte, claimant []common.Address) (*FaultDisputeGameMoveIterator, error) {
-
-	var parentIndexRule []interface{}
-	for _, parentIndexItem := range parentIndex {
-		parentIndexRule = append(parentIndexRule, parentIndexItem)
-	}
-	var claimRule []interface{}
-	for _, claimItem := range claim {
-		claimRule = append(claimRule, claimItem)
-	}
-	var claimantRule []interface{}
-	for _, claimantItem := range claimant {
-		claimantRule = append(claimantRule, claimantItem)
-	}
-
-	logs, sub, err := _FaultDisputeGame.contract.FilterLogs(opts, "Move", parentIndexRule, claimRule, claimantRule)
-	if err != nil {
-		return nil, err
-	}
-	return &FaultDisputeGameMoveIterator{contract: _FaultDisputeGame.contract, event: "Move", logs: logs, sub: sub}, nil
-}
-
-// WatchMove is a free log subscription operation binding the contract event 0x9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be.
-//
-// Solidity: event Move(uint256 indexed parentIndex, bytes32 indexed claim, address indexed claimant)
-func (_FaultDisputeGame *FaultDisputeGameFilterer) WatchMove(opts *bind.WatchOpts, sink chan<- *FaultDisputeGameMove, parentIndex []*big.Int, claim [][32]byte, claimant []common.Address) (event.Subscription, error) {
-
-	var parentIndexRule []interface{}
-	for _, parentIndexItem := range parentIndex {
-		parentIndexRule = append(parentIndexRule, parentIndexItem)
-	}
-	var claimRule []interface{}
-	for _, claimItem := range claim {
-		claimRule = append(claimRule, claimItem)
-	}
-	var claimantRule []interface{}
-	for _, claimantItem := range claimant {
-		claimantRule = append(claimantRule, claimantItem)
-	}
-
-	logs, sub, err := _FaultDisputeGame.contract.WatchLogs(opts, "Move", parentIndexRule, claimRule, claimantRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(FaultDisputeGameMove)
-				if err := _FaultDisputeGame.contract.UnpackLog(event, "Move", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseMove is a log parse operation binding the contract event 0x9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be.
-//
-// Solidity: event Move(uint256 indexed parentIndex, bytes32 indexed claim, address indexed claimant)
-func (_FaultDisputeGame *FaultDisputeGameFilterer) ParseMove(log types.Log) (*FaultDisputeGameMove, error) {
-	event := new(FaultDisputeGameMove)
-	if err := _FaultDisputeGame.contract.UnpackLog(event, "Move", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
-
-// FaultDisputeGameResolvedIterator is returned from FilterResolved and is used to iterate over the raw logs and unpacked data for Resolved events raised by the FaultDisputeGame contract.
-type FaultDisputeGameResolvedIterator struct {
-	Event *FaultDisputeGameResolved // Event containing the contract specifics and raw log
-
-	contract *bind.BoundContract // Generic contract to use for unpacking event data
-	event    string              // Event name to use for unpacking event data
-
-	logs chan types.Log        // Log channel receiving the found contract events
-	sub  ethereum.Subscription // Subscription for errors, completion and termination
-	done bool                  // Whether the subscription completed delivering logs
-	fail error                 // Occurred error to stop iteration
-}
-
-// Next advances the iterator to the subsequent event, returning whether there
-// are any more events found. In case of a retrieval or parsing error, false is
-// returned and Error() can be queried for the exact failure.
-func (it *FaultDisputeGameResolvedIterator) Next() bool {
-	// If the iterator failed, stop iterating
-	if it.fail != nil {
-		return false
-	}
-	// If the iterator completed, deliver directly whatever's available
-	if it.done {
-		select {
-		case log := <-it.logs:
-			it.Event = new(FaultDisputeGameResolved)
-			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-				it.fail = err
-				return false
-			}
-			it.Event.Raw = log
-			return true
-
-		default:
-			return false
-		}
-	}
-	// Iterator still in progress, wait for either a data or an error event
-	select {
-	case log := <-it.logs:
-		it.Event = new(FaultDisputeGameResolved)
-		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
-			it.fail = err
-			return false
-		}
-		it.Event.Raw = log
-		return true
-
-	case err := <-it.sub.Err():
-		it.done = true
-		it.fail = err
-		return it.Next()
-	}
-}
-
-// Error returns any retrieval or parsing error occurred during filtering.
-func (it *FaultDisputeGameResolvedIterator) Error() error {
-	return it.fail
-}
-
-// Close terminates the iteration process, releasing any pending underlying
-// resources.
-func (it *FaultDisputeGameResolvedIterator) Close() error {
-	it.sub.Unsubscribe()
-	return nil
-}
-
-// FaultDisputeGameResolved represents a Resolved event raised by the FaultDisputeGame contract.
-type FaultDisputeGameResolved struct {
-	Status uint8
-	Raw    types.Log // Blockchain specific contextual infos
-}
-
-// FilterResolved is a free log retrieval operation binding the contract event 0x5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da60.
-//
-// Solidity: event Resolved(uint8 indexed status)
-func (_FaultDisputeGame *FaultDisputeGameFilterer) FilterResolved(opts *bind.FilterOpts, status []uint8) (*FaultDisputeGameResolvedIterator, error) {
-
-	var statusRule []interface{}
-	for _, statusItem := range status {
-		statusRule = append(statusRule, statusItem)
-	}
-
-	logs, sub, err := _FaultDisputeGame.contract.FilterLogs(opts, "Resolved", statusRule)
-	if err != nil {
-		return nil, err
-	}
-	return &FaultDisputeGameResolvedIterator{contract: _FaultDisputeGame.contract, event: "Resolved", logs: logs, sub: sub}, nil
-}
-
-// WatchResolved is a free log subscription operation binding the contract event 0x5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da60.
-//
-// Solidity: event Resolved(uint8 indexed status)
-func (_FaultDisputeGame *FaultDisputeGameFilterer) WatchResolved(opts *bind.WatchOpts, sink chan<- *FaultDisputeGameResolved, status []uint8) (event.Subscription, error) {
-
-	var statusRule []interface{}
-	for _, statusItem := range status {
-		statusRule = append(statusRule, statusItem)
-	}
-
-	logs, sub, err := _FaultDisputeGame.contract.WatchLogs(opts, "Resolved", statusRule)
-	if err != nil {
-		return nil, err
-	}
-	return event.NewSubscription(func(quit <-chan struct{}) error {
-		defer sub.Unsubscribe()
-		for {
-			select {
-			case log := <-logs:
-				// New log arrived, parse the event and forward to the user
-				event := new(FaultDisputeGameResolved)
-				if err := _FaultDisputeGame.contract.UnpackLog(event, "Resolved", log); err != nil {
-					return err
-				}
-				event.Raw = log
-
-				select {
-				case sink <- event:
-				case err := <-sub.Err():
-					return err
-				case <-quit:
-					return nil
-				}
-			case err := <-sub.Err():
-				return err
-			case <-quit:
-				return nil
-			}
-		}
-	}), nil
-}
-
-// ParseResolved is a log parse operation binding the contract event 0x5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da60.
-//
-// Solidity: event Resolved(uint8 indexed status)
-func (_FaultDisputeGame *FaultDisputeGameFilterer) ParseResolved(log types.Log) (*FaultDisputeGameResolved, error) {
-	event := new(FaultDisputeGameResolved)
-	if err := _FaultDisputeGame.contract.UnpackLog(event, "Resolved", log); err != nil {
-		return nil, err
-	}
-	event.Raw = log
-	return event, nil
-}
diff --git a/op-bindings/bindings/faultdisputegame_more.go b/op-bindings/bindings/faultdisputegame_more.go
deleted file mode 100644
index f6d3c304b6b2..000000000000
--- a/op-bindings/bindings/faultdisputegame_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const FaultDisputeGameStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"createdAt\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_userDefinedValueType(Timestamp)1015\"},{\"astId\":1001,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"resolvedAt\",\"offset\":8,\"slot\":\"0\",\"type\":\"t_userDefinedValueType(Timestamp)1015\"},{\"astId\":1002,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"status\",\"offset\":16,\"slot\":\"0\",\"type\":\"t_enum(GameStatus)1009\"},{\"astId\":1003,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"claimData\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_struct(ClaimData)1010_storage)dyn_storage\"},{\"astId\":1004,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"credit\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1005,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"claims\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_mapping(t_userDefinedValueType(ClaimHash)1012,t_bool)\"},{\"astId\":1006,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"subgames\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_mapping(t_uint256,t_array(t_uint256)dyn_storage)\"},{\"astId\":1007,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"subgameAtRootResolved\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_bool\"},{\"astId\":1008,\"contract\":\"src/dispute/FaultDisputeGame.sol:FaultDisputeGame\",\"label\":\"initialized\",\"offset\":1,\"slot\":\"5\",\"type\":\"t_bool\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_struct(ClaimData)1010_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct IFaultDisputeGame.ClaimData[]\",\"numberOfBytes\":\"32\",\"base\":\"t_struct(ClaimData)1010_storage\"},\"t_array(t_uint256)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"uint256[]\",\"numberOfBytes\":\"32\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_enum(GameStatus)1009\":{\"encoding\":\"inplace\",\"label\":\"enum GameStatus\",\"numberOfBytes\":\"1\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_mapping(t_uint256,t_array(t_uint256)dyn_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256[])\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_array(t_uint256)dyn_storage\"},\"t_mapping(t_userDefinedValueType(ClaimHash)1012,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(ClaimHash =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_userDefinedValueType(ClaimHash)1012\",\"value\":\"t_bool\"},\"t_struct(ClaimData)1010_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IFaultDisputeGame.ClaimData\",\"numberOfBytes\":\"160\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint32\":{\"encoding\":\"inplace\",\"label\":\"uint32\",\"numberOfBytes\":\"4\"},\"t_userDefinedValueType(Claim)1011\":{\"encoding\":\"inplace\",\"label\":\"Claim\",\"numberOfBytes\":\"32\"},\"t_userDefinedValueType(ClaimHash)1012\":{\"encoding\":\"inplace\",\"label\":\"ClaimHash\",\"numberOfBytes\":\"32\"},\"t_userDefinedValueType(Clock)1013\":{\"encoding\":\"inplace\",\"label\":\"Clock\",\"numberOfBytes\":\"16\"},\"t_userDefinedValueType(Position)1014\":{\"encoding\":\"inplace\",\"label\":\"Position\",\"numberOfBytes\":\"16\"},\"t_userDefinedValueType(Timestamp)1015\":{\"encoding\":\"inplace\",\"label\":\"Timestamp\",\"numberOfBytes\":\"8\"}}}"
-
-var FaultDisputeGameStorageLayout = new(solc.StorageLayout)
-
-var FaultDisputeGameDeployedBin = "0x6080604052600436106101e75760003560e01c80638d450a951161010e578063d6ae3cd5116100a7578063f3f7214e11610079578063fa24f74311610061578063fa24f74314610790578063fa315aa9146107b4578063fdffbb28146107e757005b8063f3f7214e14610745578063f8f43ff61461077057005b8063d6ae3cd51461068c578063d8cc1a3c146106bf578063e1f0c376146106df578063ec5e63081461071257005b8063c55cd0c7116100e0578063c55cd0c7146105a1578063c6f0308c146105b4578063cf09e0d01461063e578063d5d44d801461065f57005b80638d450a95146104d0578063bbdc02db14610503578063bcef3b5514610544578063c395e1ca1461058157005b8063609d33341161018057806368800abf1161015257806368800abf146104405780638129fc1c146104735780638980e0cc1461047b5780638b85902b1461049057005b8063609d3334146103b857806360e27464146103cd578063632247ea146103ed5780636361506d1461040057005b806335fef567116101b957806335fef567146102c85780633a768463146102db5780633fc8cef31461032f57806354fd4d501461036257005b80630356fe3a146101f057806319effeb414610232578063200d2ed2146102785780632810e1d6146102b357005b366101ee57005b005b3480156101fc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020015b60405180910390f35b34801561023e57600080fd5b5060005461025f9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610229565b34801561028457600080fd5b506000546102a690700100000000000000000000000000000000900460ff1681565b6040516102299190613e16565b3480156102bf57600080fd5b506102a66107fa565b6101ee6102d6366004613e57565b6109f7565b3480156102e757600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610229565b34801561033b57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061030a565b34801561036e57600080fd5b506103ab6040518060400160405280600581526020017f302e372e3100000000000000000000000000000000000000000000000000000081525081565b6040516102299190613ee4565b3480156103c457600080fd5b506103ab610a07565b3480156103d957600080fd5b506101ee6103e8366004613f19565b610a1a565b6101ee6103fb366004613f52565b610bc6565b34801561040c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013561021f565b34801561044c57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061021f565b6101ee61143e565b34801561048757600080fd5b5060015461021f565b34801561049c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013561021f565b3480156104dc57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061021f565b34801561050f57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610229565b34801561055057600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033561021f565b34801561058d57600080fd5b5061021f61059c366004613f87565b611859565b6101ee6105af366004613e57565b611a43565b3480156105c057600080fd5b506105d46105cf366004613fb9565b611a4f565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610229565b34801561064a57600080fd5b5060005461025f9067ffffffffffffffff1681565b34801561066b57600080fd5b5061021f61067a366004613f19565b60026020526000908152604090205481565b34801561069857600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061021f565b3480156106cb57600080fd5b506101ee6106da36600461401b565b611ae6565b3480156106eb57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061025f565b34801561071e57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061021f565b34801561075157600080fd5b506040516fffffffffffffffffffffffffffffffff8152602001610229565b34801561077c57600080fd5b506101ee61078b3660046140a5565b61211b565b34801561079c57600080fd5b506107a5612595565b604051610229939291906140d1565b3480156107c057600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061021f565b6101ee6107f5366004613fb9565b6125f2565b600080600054700100000000000000000000000000000000900460ff16600281111561082857610828613de7565b1461085f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff1661089b576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660016000815481106108c7576108c76140ff565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614610902576001610905565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156109b6576109b6613de7565b0217905560028111156109cb576109cb613de7565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b610a0382826000610bc6565b5050565b6060610a1560406020612a53565b905090565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040812080549082905590819003610a7f576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b158015610b0f57600080fd5b505af1158015610b23573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610b81576040519150601f19603f3d011682016040523d82523d6000602084013e610b86565b606091505b5050905080610bc1576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610bf257610bf2613de7565b14610c29576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610c3e57610c3e6140ff565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610d039083908690612aea16565b90506000610da3826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050861580610de55750610de27f0000000000000000000000000000000000000000000000000000000000000000600261415d565b81145b8015610def575084155b15610e26576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610e80576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eab7f0000000000000000000000000000000000000000000000000000000000000000600161415d565b8103610ebd57610ebd86888588612af2565b34610ec783611859565b1115610eff576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835160009063ffffffff90811614610f5f576001856000015163ffffffff1681548110610f2e57610f2e6140ff565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b60c0850151600090610f839067ffffffffffffffff165b67ffffffffffffffff1690565b67ffffffffffffffff1642610fad610f76856fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610fc1919061415d565b610fcb9190614175565b90507f000000000000000000000000000000000000000000000000000000000000000060011c677fffffffffffffff1667ffffffffffffffff8216111561103e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526003602052604090205490915060ff16156110bc576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008c8152602001908152602001600020600180805490506113519190614175565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b1580156113e957600080fd5b505af11580156113fd573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b600554610100900460ff1615611480576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013511611537576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560048201526024015b60405180910390fd5b606636111561154e5763c407e0256000526004601cfd5b6040805160e08101825263ffffffff808252600060208301818152328486019081526fffffffffffffffffffffffffffffffff34818116606088019081527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033560808901908152600160a08a0181815242861660c08c0190815282548084018455928a529a5160059092027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915594517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf787018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905590517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8860180549185167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909216919091179055517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9850155915195518116700100000000000000000000000000000000029516949094177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9091015583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b1580156117dc57600080fd5b505af11580156117f0573d6000803e3d6000fd5b50506000805467ffffffffffffffff42167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790555050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905550565b6000806118f8836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690507f000000000000000000000000000000000000000000000000000000000000000081111561195e576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a80630bebc200600061197983836141bb565b9050670de0b6b3a764000060006119b0827f00000000000000000000000000000000000000000000000000000000000000006141cf565b905060006119ce6119c9670de0b6b3a7640000866141cf565b612cb3565b905060006119dc8484612f0e565b905060006119ea8383612f5d565b905060006119f782612f8b565b90506000611a1682611a11670de0b6b3a76400008f6141cf565b613173565b90506000611a248b83612f5d565b9050611a30818d6141cf565b9f9e505050505050505050505050505050565b610a0382826001610bc6565b60018181548110611a5f57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115611b1257611b12613de7565b14611b49576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018781548110611b5e57611b5e6140ff565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050611bbd7f0000000000000000000000000000000000000000000000000000000000000000600161415d565b611c59826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1614611c9a576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808915611d8957611ced7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000614175565b6001901b611d0c846fffffffffffffffffffffffffffffffff166131ad565b67ffffffffffffffff16611d20919061420c565b15611d5d57611d54611d4560016fffffffffffffffffffffffffffffffff8716614220565b865463ffffffff166000613253565b60030154611d7f565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050611db3565b60038501549150611db0611d456fffffffffffffffffffffffffffffffff86166001614251565b90505b600882901b60088a8a604051611dca929190614285565b6040518091039020901b14611e0b576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e168c613337565b90506000611e25836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290611e9f908f908f908f908f908a906004016142de565b6020604051808303816000875af1158015611ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee29190614318565b600485015491149150600090600290611f8d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b612029896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6120339190614331565b61203d9190614352565b67ffffffffffffffff161590508115158103612085576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff16156120dc576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214757612147613de7565b1461217e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061218d86613366565b935093509350935060006121a385858585613793565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612212573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122369190614379565b90506001890361232e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84612292367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015612304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123289190614318565b5061258a565b6002890361235a5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489612292565b600389036123865773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487612292565b600489036124bf5760006123cc6fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000613852565b6123f6907f000000000000000000000000000000000000000000000000000000000000000061415d565b61240190600161415d565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015612494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b89190614318565b505061258a565b60058903612558576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000000060c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122e5565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560606125eb610a07565b9050909192565b60008054700100000000000000000000000000000000900460ff16600281111561261e5761261e613de7565b14612655576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001828154811061266a5761266a6140ff565b6000918252602082206005919091020160048101549092506126ac90700100000000000000000000000000000000900460401c67ffffffffffffffff16610f76565b60048301549091506000906126de90700100000000000000000000000000000000900467ffffffffffffffff16610f76565b6126e89042614331565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c166127228284614396565b67ffffffffffffffff1611612763576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600460205260409020805485158015612783575060055460ff165b156127ba576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801580156127c757508515155b1561282c578454640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156127fa5781612816565b600187015473ffffffffffffffffffffffffffffffffffffffff165b90506128228188613907565b5050505050505050565b60006fffffffffffffffffffffffffffffffff815b8381101561297257600085828154811061285d5761285d6140ff565b60009182526020808320909101548083526004909152604090912054909150156128b3576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182815481106128c8576128c86140ff565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff16158015612921575060048101546fffffffffffffffffffffffffffffffff908116908516115b1561295f576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b50508061296b906143b9565b9050612841565b506129ba73ffffffffffffffffffffffffffffffffffffffff83161561299857826129b4565b600188015473ffffffffffffffffffffffffffffffffffffffff165b88613907565b86547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8416021787556000888152600460205260408120612a1691613dad565b8760000361282257600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050505050505050565b60606000612a8a84367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900361415d565b90508267ffffffffffffffff1667ffffffffffffffff811115612aaf57612aaf6143f1565b6040519080825280601f01601f191660200182016040528015612ad9576020820181803683370190505b509150828160208401375092915050565b151760011b90565b6000612b116fffffffffffffffffffffffffffffffff84166001614251565b90506000612b2182866001613253565b9050600086901a8380612c145750612b5a60027f000000000000000000000000000000000000000000000000000000000000000061420c565b6004830154600290612bfe906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b612c089190614352565b67ffffffffffffffff16145b15612c6c5760ff811660011480612c2e575060ff81166002145b612c67576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161152e565b612caa565b60ff811615612caa576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161152e565b50505050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213612d1257631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202612f4b57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215612f7b5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213612fb957919050565b680755bf798b4a1bf1e58212612fd75763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006131a4670de0b6b3a76400008361318b86612cb3565b6131959190614420565b61319f91906144dc565b612f8b565b90505b92915050565b60008061323a837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b6000808261329c576132976fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000613a93565b6132b7565b6132b7856fffffffffffffffffffffffffffffffff16613c51565b9050600184815481106132cc576132cc6140ff565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461332f57815460018054909163ffffffff1690811061331a5761331a6140ff565b906000526020600020906005020191506132dd565b509392505050565b600080600080600061334886613366565b935093509350935061335c84848484613793565b9695505050505050565b6000806000806000859050600060018281548110613386576133866140ff565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000009061345d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161161349e576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090613565906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1692508211156135e157825463ffffffff166135ab7f0000000000000000000000000000000000000000000000000000000000000000600161415d565b83036135b5578391505b600181815481106135c8576135c86140ff565b90600052602060002090600502019350809450506134a2565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661364a613635856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561372f576000613682836fffffffffffffffffffffffffffffffff166131ad565b67ffffffffffffffff1611156136e55760006136bc6136b460016fffffffffffffffffffffffffffffffff8616614220565b896001613253565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506137099050565b7f00000000000000000000000000000000000000000000000000000000000000009a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750613785565b60006137516136b46fffffffffffffffffffffffffffffffff85166001614251565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff841681036137f95782826040516020016137dc9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b60405160208183030381529060405280519060200120905061384a565b60408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012090505b949350505050565b6000806138df847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60028101546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff000000000000000000000000000000018101613977576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280830180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff17905573ffffffffffffffffffffffffffffffffffffffff841660009081526020919091526040812080548392906139ea90849061415d565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b158015613a7f57600080fd5b505af1158015612caa573d6000803e3d6000fd5b600081613b32846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611613b73576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b7c83613c51565b905081613c1b826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff16116131a7576131a4613c3883600161415d565b6fffffffffffffffffffffffffffffffff831690613cfd565b60008119600183011681613ce5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b600080613d8a847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050808303600180821b0385821b179250505092915050565b5080546000825590600052602060002090810190613dcb9190613dce565b50565b5b80821115613de35760008155600101613dcf565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613e51577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060408385031215613e6a57600080fd5b50508035926020909101359150565b6000815180845260005b81811015613e9f57602081850181015186830182015201613e83565b81811115613eb1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131a46020830184613e79565b73ffffffffffffffffffffffffffffffffffffffff81168114613dcb57600080fd5b600060208284031215613f2b57600080fd5b8135613f3681613ef7565b9392505050565b80358015158114613f4d57600080fd5b919050565b600080600060608486031215613f6757600080fd5b8335925060208401359150613f7e60408501613f3d565b90509250925092565b600060208284031215613f9957600080fd5b81356fffffffffffffffffffffffffffffffff81168114613f3657600080fd5b600060208284031215613fcb57600080fd5b5035919050565b60008083601f840112613fe457600080fd5b50813567ffffffffffffffff811115613ffc57600080fd5b60208301915083602082850101111561401457600080fd5b9250929050565b6000806000806000806080878903121561403457600080fd5b8635955061404460208801613f3d565b9450604087013567ffffffffffffffff8082111561406157600080fd5b61406d8a838b01613fd2565b9096509450606089013591508082111561408657600080fd5b5061409389828a01613fd2565b979a9699509497509295939492505050565b6000806000606084860312156140ba57600080fd5b505081359360208301359350604090920135919050565b63ffffffff841681528260208201526060604082015260006140f66060830184613e79565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156141705761417061412e565b500190565b6000828210156141875761418761412e565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826141ca576141ca61418c565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142075761420761412e565b500290565b60008261421b5761421b61418c565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156142495761424961412e565b039392505050565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561427c5761427c61412e565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006142f2606083018789614295565b8281036020840152614305818688614295565b9150508260408301529695505050505050565b60006020828403121561432a57600080fd5b5051919050565b600067ffffffffffffffff838116908316818110156142495761424961412e565b600067ffffffffffffffff8084168061436d5761436d61418c565b92169190910692915050565b60006020828403121561438b57600080fd5b8151613f3681613ef7565b600067ffffffffffffffff80831681851680830382111561427c5761427c61412e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143ea576143ea61412e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156144615761446161412e565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561449c5761449c61412e565b600087129250878205871284841616156144b8576144b861412e565b878505871281841616156144ce576144ce61412e565b505050929093029392505050565b6000826144eb576144eb61418c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561453f5761453f61412e565b50059056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(FaultDisputeGameStorageLayoutJSON), FaultDisputeGameStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["FaultDisputeGame"] = FaultDisputeGameStorageLayout
-	deployedBytecodes["FaultDisputeGame"] = FaultDisputeGameDeployedBin
-	immutableReferences["FaultDisputeGame"] = true
-}
diff --git a/op-bindings/bindings/gaspriceoracle_more.go b/op-bindings/bindings/gaspriceoracle_more.go
deleted file mode 100644
index dce3d218d930..000000000000
--- a/op-bindings/bindings/gaspriceoracle_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const GasPriceOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L2/GasPriceOracle.sol:GasPriceOracle\",\"label\":\"isEcotone\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_bool\"}],\"types\":{\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"}}}"
-
-var GasPriceOracleStorageLayout = new(solc.StorageLayout)
-
-var GasPriceOracleDeployedBin = "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806354fd4d5011610097578063de26c4a111610066578063de26c4a1146101da578063f45e65d8146101ed578063f8206140146101f5578063fe173b97146101cc57600080fd5b806354fd4d501461016657806368d5dca6146101af5780636ef25c3a146101cc578063c5985918146101d257600080fd5b8063313ce567116100d3578063313ce5671461012757806349948e0e1461012e5780634ef6e22414610141578063519b4bd31461015e57600080fd5b80630c18c162146100fa57806322b90ab3146101155780632e0f26251461011f575b600080fd5b6101026101fd565b6040519081526020015b60405180910390f35b61011d61031e565b005b610102600681565b6006610102565b61010261013c366004610b73565b610541565b60005461014e9060ff1681565b604051901515815260200161010c565b610102610565565b6101a26040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610c42565b6101b76105c6565b60405163ffffffff909116815260200161010c565b48610102565b6101b761064b565b6101026101e8366004610b73565b6106ac565b610102610760565b610102610853565b6000805460ff1615610296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f47617350726963654f7261636c653a206f76657268656164282920697320646560448201527f707265636174656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103199190610cb5565b905090565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663e591b2826040518163ffffffff1660e01b8152600401602060405180830381865afa15801561037d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a19190610cce565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e2073657420697345636f746f6e6520666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a40161028d565b60005460ff1615610514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a2045636f746f6e6520616c72656164792060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161028d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000805460ff161561055c57610556826108b4565b92915050565b61055682610958565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166368d5dca66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610627573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103199190610d04565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663c59859186040518163ffffffff1660e01b8152600401602060405180830381865afa158015610627573d6000803e3d6000fd5b6000806106b883610ab4565b60005490915060ff16156106cc5792915050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190610cb5565b6107599082610d59565b9392505050565b6000805460ff16156107f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a207363616c61722829206973206465707260448201527f6563617465640000000000000000000000000000000000000000000000000000606482015260840161028d565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663f82061406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b6000806108c083610ab4565b905060006108cc610565565b6108d461064b565b6108df906010610d71565b63ffffffff166108ef9190610d9d565b905060006108fb610853565b6109036105c6565b63ffffffff166109139190610d9d565b905060006109218284610d59565b61092b9085610d9d565b90506109396006600a610efa565b610944906010610d9d565b61094e9082610f06565b9695505050505050565b60008061096483610ab4565b9050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109eb9190610cb5565b6109f3610565565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a769190610cb5565b610a809085610d59565b610a8a9190610d9d565b610a949190610d9d565b9050610aa26006600a610efa565b610aac9082610f06565b949350505050565b80516000908190815b81811015610b3757848181518110610ad757610ad7610f41565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003610b1757610b10600484610d59565b9250610b25565b610b22601084610d59565b92505b80610b2f81610f70565b915050610abd565b50610aac82610440610d59565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610b8557600080fd5b813567ffffffffffffffff80821115610b9d57600080fd5b818401915084601f830112610bb157600080fd5b813581811115610bc357610bc3610b44565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610c0957610c09610b44565b81604052828152876020848701011115610c2257600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b81811015610c6f57858101830151858201604001528201610c53565b81811115610c81576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cc757600080fd5b5051919050565b600060208284031215610ce057600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461075957600080fd5b600060208284031215610d1657600080fd5b815163ffffffff8116811461075957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610d6c57610d6c610d2a565b500190565b600063ffffffff80831681851681830481118215151615610d9457610d94610d2a565b02949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610dd557610dd5610d2a565b500290565b600181815b80851115610e3357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e1957610e19610d2a565b80851615610e2657918102915b93841c9390800290610ddf565b509250929050565b600082610e4a57506001610556565b81610e5757506000610556565b8160018114610e6d5760028114610e7757610e93565b6001915050610556565b60ff841115610e8857610e88610d2a565b50506001821b610556565b5060208310610133831016604e8410600b8410161715610eb6575081810a610556565b610ec08383610dda565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610ef257610ef2610d2a565b029392505050565b60006107598383610e3b565b600082610f3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610fa157610fa1610d2a565b506001019056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(GasPriceOracleStorageLayoutJSON), GasPriceOracleStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["GasPriceOracle"] = GasPriceOracleStorageLayout
-	deployedBytecodes["GasPriceOracle"] = GasPriceOracleDeployedBin
-	immutableReferences["GasPriceOracle"] = false
-}
diff --git a/op-bindings/bindings/governancetoken_more.go b/op-bindings/bindings/governancetoken_more.go
deleted file mode 100644
index 37b74e4145b6..000000000000
--- a/op-bindings/bindings/governancetoken_more.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const GovernanceTokenStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_balances\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1001,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_allowances\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1002,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_totalSupply\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint256\"},{\"astId\":1003,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_name\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_string_storage\"},{\"astId\":1004,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_symbol\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_string_storage\"},{\"astId\":1005,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_nonces\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_mapping(t_address,t_struct(Counter)1012_storage)\"},{\"astId\":1006,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_PERMIT_TYPEHASH_DEPRECATED_SLOT\",\"offset\":0,\"slot\":\"6\",\"type\":\"t_bytes32\"},{\"astId\":1007,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_delegates\",\"offset\":0,\"slot\":\"7\",\"type\":\"t_mapping(t_address,t_address)\"},{\"astId\":1008,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_checkpoints\",\"offset\":0,\"slot\":\"8\",\"type\":\"t_mapping(t_address,t_array(t_struct(Checkpoint)1011_storage)dyn_storage)\"},{\"astId\":1009,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_totalSupplyCheckpoints\",\"offset\":0,\"slot\":\"9\",\"type\":\"t_array(t_struct(Checkpoint)1011_storage)dyn_storage\"},{\"astId\":1010,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"10\",\"type\":\"t_address\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_struct(Checkpoint)1011_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct ERC20Votes.Checkpoint[]\",\"numberOfBytes\":\"32\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_address)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e address)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_address\"},\"t_mapping(t_address,t_array(t_struct(Checkpoint)1011_storage)dyn_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct ERC20Votes.Checkpoint[])\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_array(t_struct(Checkpoint)1011_storage)dyn_storage\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_struct(Counter)1012_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Counters.Counter)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(Counter)1012_storage\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_string_storage\":{\"encoding\":\"bytes\",\"label\":\"string\",\"numberOfBytes\":\"32\"},\"t_struct(Checkpoint)1011_storage\":{\"encoding\":\"inplace\",\"label\":\"struct ERC20Votes.Checkpoint\",\"numberOfBytes\":\"32\"},\"t_struct(Counter)1012_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Counters.Counter\",\"numberOfBytes\":\"32\"},\"t_uint224\":{\"encoding\":\"inplace\",\"label\":\"uint224\",\"numberOfBytes\":\"28\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint32\":{\"encoding\":\"inplace\",\"label\":\"uint32\",\"numberOfBytes\":\"4\"}}}"
-
-var GovernanceTokenStorageLayout = new(solc.StorageLayout)
-
-var GovernanceTokenDeployedBin = "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063a457c2d711610097578063d505accf11610071578063d505accf14610416578063dd62ed3e14610429578063f1127ed81461046f578063f2fde38b146104c157600080fd5b8063a457c2d7146103dd578063a9059cbb146103f0578063c3cda5201461040357600080fd5b80638da5cb5b116100d35780638da5cb5b146103915780638e539e8c146103af57806395d89b41146103c25780639ab24eb0146103ca57600080fd5b8063715018a61461036357806379cc67901461036b5780637ecebe001461037e57600080fd5b80633a46b1a811610166578063587cde1e11610140578063587cde1e146102945780635c19a95c146102f25780636fcfff451461030557806370a082311461032d57600080fd5b80633a46b1a81461025957806340c10f191461026c57806342966c681461028157600080fd5b806323b872dd116101a257806323b872dd1461021c578063313ce5671461022f5780633644e5151461023e578063395093511461024657600080fd5b806306fdde03146101c9578063095ea7b3146101e757806318160ddd1461020a575b600080fd5b6101d16104d4565b6040516101de919061249d565b60405180910390f35b6101fa6101f5366004612539565b610566565b60405190151581526020016101de565b6002545b6040519081526020016101de565b6101fa61022a366004612563565b61057e565b604051601281526020016101de565b61020e6105a2565b6101fa610254366004612539565b6105b1565b61020e610267366004612539565b6105fd565b61027f61027a366004612539565b6106a3565b005b61027f61028f36600461259f565b6106b9565b6102cd6102a23660046125b8565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600760205260409020541690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101de565b61027f6103003660046125b8565b6106c6565b6103186103133660046125b8565b6106d0565b60405163ffffffff90911681526020016101de565b61020e61033b3660046125b8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61027f610705565b61027f610379366004612539565b610719565b61020e61038c3660046125b8565b61072e565b600a5473ffffffffffffffffffffffffffffffffffffffff166102cd565b61020e6103bd36600461259f565b610759565b6101d16107cf565b61020e6103d83660046125b8565b6107de565b6101fa6103eb366004612539565b6108a9565b6101fa6103fe366004612539565b61097a565b61027f6104113660046125e4565b610988565b61027f61042436600461263c565b610aff565b61020e6104373660046126a6565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b61048261047d3660046126d9565b610cbe565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692810192909252016101de565b61027f6104cf3660046125b8565b610d64565b6060600380546104e390612719565b80601f016020809104026020016040519081016040528092919081815260200182805461050f90612719565b801561055c5780601f106105315761010080835404028352916020019161055c565b820191906000526020600020905b81548152906001019060200180831161053f57829003601f168201915b5050505050905090565b600033610574818585610e18565b5060019392505050565b60003361058c858285610fcb565b6105978585856110a2565b506001949350505050565b60006105ac61135b565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061057490829086906105f8908790612795565b610e18565b600043821061066d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902061069c908361148f565b9392505050565b6106ab611576565b6106b582826115f7565b5050565b6106c33382611601565b50565b6106c3338261160b565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600860205260408120546106ff906116a9565b92915050565b61070d611576565b6107176000611743565b565b610724823383610fcb565b6106b58282611601565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120546106ff565b60004382106107c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610664565b6106ff60098361148f565b6060600480546104e390612719565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604081205480156108815773ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902061083a6001836127ad565b8154811061084a5761084a6127c4565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610884565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561096d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610664565b6105978286868403610e18565b6000336105748185856110a2565b834211156109f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610664565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610a7990610a719060a001604051602081830303815290604052805190602001206117ba565b858585611823565b9050610a848161184b565b8614610aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610664565b610af6818861160b565b50505050505050565b83421115610b69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610664565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610b988c61184b565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610c00826117ba565b90506000610c1082878787611823565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ca7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610664565b610cb28a8a8a610e18565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020805463ffffffff8416908110610d0f57610d0f6127c4565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b610d6c611576565b73ffffffffffffffffffffffffffffffffffffffff8116610e0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610664565b6106c381611743565b73ffffffffffffffffffffffffffffffffffffffff8316610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610664565b73ffffffffffffffffffffffffffffffffffffffff8216610f5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610664565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461109c578181101561108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610664565b61109c8484848403610e18565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610664565b73ffffffffffffffffffffffffffffffffffffffff82166111e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610664565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610664565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152602081905260408082208585039055918516815290812080548492906112e2908490612795565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161134891815260200190565b60405180910390a361109c848484611885565b60003073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480156113c157507f000000000000000000000000000000000000000000000000000000000000000046145b156113eb57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b818110156114f35760006114aa8284611890565b9050848682815481106114bf576114bf6127c4565b60009182526020909120015463ffffffff1611156114df578092506114ed565b6114ea816001612795565b91505b50611496565b811561154c57846115056001846127ad565b81548110611515576115156127c4565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661154f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695945050505050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610664565b6106b582826118ab565b6106b58282611971565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600760208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461109c828483611989565b600063ffffffff82111561173f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610664565b5090565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006106ff6117c761135b565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061183487878787611b2e565b9150915061184181611c46565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b505050565b611880838383611e9a565b600061189f60028484186127f3565b61069c90848416612795565b6118b58282611ed9565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610664565b61109c60096120018361200d565b61197b82826121ef565b61109c60096123e38361200d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156119c55750600081115b156118805773ffffffffffffffffffffffffffffffffffffffff831615611a7a5773ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604081208190611a1a906123e38561200d565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611a6f929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff8216156118805773ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081208190611aca906120018561200d565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611b1f929190918252602082015260400190565b60405180910390a25050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611b655750600090506003611c3d565b8460ff16601b14158015611b7d57508460ff16601c14155b15611b8e5750600090506004611c3d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611be2573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611c3657600060019250925050611c3d565b9150600090505b94509492505050565b6000816004811115611c5a57611c5a61282e565b03611c625750565b6001816004811115611c7657611c7661282e565b03611cdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610664565b6002816004811115611cf157611cf161282e565b03611d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610664565b6003816004811115611d6c57611d6c61282e565b03611df9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610664565b6004816004811115611e0d57611e0d61282e565b036106c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610664565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526007602052604080822054858416835291205461188092918216911683611989565b73ffffffffffffffffffffffffffffffffffffffff8216611f56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610664565b8060026000828254611f689190612795565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290611fa2908490612795565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36106b560008383611885565b600061069c8284612795565b82546000908190801561206d57856120266001836127ad565b81548110612036576120366127c4565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612070565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061209e83858763ffffffff16565b91506000811180156120dc575043866120b86001846127ad565b815481106120c8576120c86127c4565b60009182526020909120015463ffffffff16145b15612166576120ea826123ef565b866120f66001846127ad565b81548110612106576121066127c4565b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506121e6565b85604051806040016040528061217b436116a9565b63ffffffff16815260200161218f856123ef565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b73ffffffffffffffffffffffffffffffffffffffff8216612292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610664565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015612348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610664565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906123849084906127ad565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361188083600084611885565b600061069c82846127ad565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82111561173f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610664565b600060208083528351808285015260005b818110156124ca578581018301518582016040015282016124ae565b818111156124dc576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461253457600080fd5b919050565b6000806040838503121561254c57600080fd5b61255583612510565b946020939093013593505050565b60008060006060848603121561257857600080fd5b61258184612510565b925061258f60208501612510565b9150604084013590509250925092565b6000602082840312156125b157600080fd5b5035919050565b6000602082840312156125ca57600080fd5b61069c82612510565b803560ff8116811461253457600080fd5b60008060008060008060c087890312156125fd57600080fd5b61260687612510565b95506020870135945060408701359350612622606088016125d3565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561265757600080fd5b61266088612510565b965061266e60208901612510565b9550604088013594506060880135935061268a608089016125d3565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156126b957600080fd5b6126c283612510565b91506126d060208401612510565b90509250929050565b600080604083850312156126ec57600080fd5b6126f583612510565b9150602083013563ffffffff8116811461270e57600080fd5b809150509250929050565b600181811c9082168061272d57607f821691505b60208210810361187a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156127a8576127a8612766565b500190565b6000828210156127bf576127bf612766565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082612829577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a"
-
-func init() {
-	if err := json.Unmarshal([]byte(GovernanceTokenStorageLayoutJSON), GovernanceTokenStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["GovernanceToken"] = GovernanceTokenStorageLayout
-	deployedBytecodes["GovernanceToken"] = GovernanceTokenDeployedBin
-}
diff --git a/op-bindings/bindings/isemver_more.go b/op-bindings/bindings/isemver_more.go
deleted file mode 100644
index 6951b15c91a1..000000000000
--- a/op-bindings/bindings/isemver_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const ISemverStorageLayoutJSON = "{\"storage\":null,\"types\":{}}"
-
-var ISemverStorageLayout = new(solc.StorageLayout)
-
-var ISemverDeployedBin = "0x"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(ISemverStorageLayoutJSON), ISemverStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["ISemver"] = ISemverStorageLayout
-	deployedBytecodes["ISemver"] = ISemverDeployedBin
-	immutableReferences["ISemver"] = false
-}
diff --git a/op-bindings/bindings/l1block_more.go b/op-bindings/bindings/l1block_more.go
deleted file mode 100644
index 3908246395d5..000000000000
--- a/op-bindings/bindings/l1block_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const L1BlockStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L2/L1Block.sol:L1Block\",\"label\":\"number\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint64\"},{\"astId\":1001,\"contract\":\"src/L2/L1Block.sol:L1Block\",\"label\":\"timestamp\",\"offset\":8,\"slot\":\"0\",\"type\":\"t_uint64\"},{\"astId\":1002,\"contract\":\"src/L2/L1Block.sol:L1Block\",\"label\":\"basefee\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_uint256\"},{\"astId\":1003,\"contract\":\"src/L2/L1Block.sol:L1Block\",\"label\":\"hash\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_bytes32\"},{\"astId\":1004,\"contract\":\"src/L2/L1Block.sol:L1Block\",\"label\":\"sequenceNumber\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_uint64\"},{\"astId\":1005,\"contract\":\"src/L2/L1Block.sol:L1Block\",\"label\":\"blobBaseFeeScalar\",\"offset\":8,\"slot\":\"3\",\"type\":\"t_uint32\"},{\"astId\":1006,\"contract\":\"src/L2/L1Block.sol:L1Block\",\"label\":\"baseFeeScalar\",\"offset\":12,\"slot\":\"3\",\"type\":\"t_uint32\"},{\"astId\":1007,\"contract\":\"src/L2/L1Block.sol:L1Block\",\"label\":\"batcherHash\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_bytes32\"},{\"astId\":1008,\"contract\":\"src/L2/L1Block.sol:L1Block\",\"label\":\"l1FeeOverhead\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"src/L2/L1Block.sol:L1Block\",\"label\":\"l1FeeScalar\",\"offset\":0,\"slot\":\"6\",\"type\":\"t_uint256\"},{\"astId\":1010,\"contract\":\"src/L2/L1Block.sol:L1Block\",\"label\":\"blobBaseFee\",\"offset\":0,\"slot\":\"7\",\"type\":\"t_uint256\"}],\"types\":{\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint32\":{\"encoding\":\"inplace\",\"label\":\"uint32\",\"numberOfBytes\":\"4\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"}}}"
-
-var L1BlockStorageLayout = new(solc.StorageLayout)
-
-var L1BlockDeployedBin = "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80638381f58a11610097578063c598591811610066578063c598591814610229578063e591b28214610249578063e81b2c6d14610289578063f82061401461029257600080fd5b80638381f58a146101e35780638b239f73146101f75780639e8c496614610200578063b80777ea1461020957600080fd5b806354fd4d50116100d357806354fd4d50146101335780635cf249691461017c57806364ca23ef1461018557806368d5dca6146101b257600080fd5b8063015d8eb9146100fa57806309bd5a601461010f578063440a5e201461012b575b600080fd5b61010d61010836600461044c565b61029b565b005b61011860025481565b6040519081526020015b60405180910390f35b61010d6103da565b61016f6040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161012291906104be565b61011860015481565b6003546101999067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610122565b6003546101ce9068010000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610122565b6000546101999067ffffffffffffffff1681565b61011860055481565b61011860065481565b6000546101999068010000000000000000900467ffffffffffffffff1681565b6003546101ce906c01000000000000000000000000900463ffffffff1681565b61026473deaddeaddeaddeaddeaddeaddeaddeaddead000181565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610122565b61011860045481565b61011860075481565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c7565730000000000606482015260840160405180910390fd5b6000805467ffffffffffffffff98891668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116998916999099179890981790975560019490945560029290925560038054919094167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009190911617909255600491909155600555600655565b3373deaddeaddeaddeaddeaddeaddeaddeaddead00011461040357633cc50b456000526004601cfd5b60043560801c60035560143560801c600055602435600155604435600755606435600255608435600455565b803567ffffffffffffffff8116811461044757600080fd5b919050565b600080600080600080600080610100898b03121561046957600080fd5b6104728961042f565b975061048060208a0161042f565b9650604089013595506060890135945061049c60808a0161042f565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600060208083528351808285015260005b818110156104eb578581018301518582016040015282016104cf565b818111156104fd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(L1BlockStorageLayoutJSON), L1BlockStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["L1Block"] = L1BlockStorageLayout
-	deployedBytecodes["L1Block"] = L1BlockDeployedBin
-	immutableReferences["L1Block"] = false
-}
diff --git a/op-bindings/bindings/l1blocknumber_more.go b/op-bindings/bindings/l1blocknumber_more.go
deleted file mode 100644
index ec5798b244d3..000000000000
--- a/op-bindings/bindings/l1blocknumber_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const L1BlockNumberStorageLayoutJSON = "{\"storage\":null,\"types\":{}}"
-
-var L1BlockNumberStorageLayout = new(solc.StorageLayout)
-
-var L1BlockNumberDeployedBin = "0x60806040526004361061002d5760003560e01c806354fd4d5014610052578063b9b3efe9146100b157610048565b3661004857600061003c6100d4565b90508060005260206000f35b600061003c6100d4565b34801561005e57600080fd5b5061009b6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100a89190610168565b60405180910390f35b3480156100bd57600080fd5b506100c66100d4565b6040519081526020016100a8565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638381f58a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610135573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015991906101db565b67ffffffffffffffff16905090565b600060208083528351808285015260005b8181101561019557858101830151858201604001528201610179565b818111156101a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156101ed57600080fd5b815167ffffffffffffffff8116811461020557600080fd5b939250505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(L1BlockNumberStorageLayoutJSON), L1BlockNumberStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["L1BlockNumber"] = L1BlockNumberStorageLayout
-	deployedBytecodes["L1BlockNumber"] = L1BlockNumberDeployedBin
-	immutableReferences["L1BlockNumber"] = false
-}
diff --git a/op-bindings/bindings/l1crossdomainmessenger_more.go b/op-bindings/bindings/l1crossdomainmessenger_more.go
deleted file mode 100644
index 29bf2328d28d..000000000000
--- a/op-bindings/bindings/l1crossdomainmessenger_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const L1CrossDomainMessengerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"spacer_0_0_20\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_initialized\",\"offset\":20,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1002,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_initializing\",\"offset\":21,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1003,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"spacer_1_0_1600\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)50_storage\"},{\"astId\":1004,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"spacer_51_0_20\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1005,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"spacer_52_0_1568\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1006,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"spacer_101_0_1\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":1007,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"spacer_102_0_1568\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1008,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"spacer_151_0_32\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"spacer_152_0_1568\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1010,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"spacer_201_0_32\",\"offset\":0,\"slot\":\"201\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1011,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"spacer_202_0_32\",\"offset\":0,\"slot\":\"202\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1012,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"successfulMessages\",\"offset\":0,\"slot\":\"203\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1013,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"xDomainMsgSender\",\"offset\":0,\"slot\":\"204\",\"type\":\"t_address\"},{\"astId\":1014,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"msgNonce\",\"offset\":0,\"slot\":\"205\",\"type\":\"t_uint240\"},{\"astId\":1015,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"failedMessages\",\"offset\":0,\"slot\":\"206\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1016,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"otherMessenger\",\"offset\":0,\"slot\":\"207\",\"type\":\"t_contract(CrossDomainMessenger)1020\"},{\"astId\":1017,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"208\",\"type\":\"t_array(t_uint256)43_storage\"},{\"astId\":1018,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"superchainConfig\",\"offset\":0,\"slot\":\"251\",\"type\":\"t_contract(SuperchainConfig)1022\"},{\"astId\":1019,\"contract\":\"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"portal\",\"offset\":0,\"slot\":\"252\",\"type\":\"t_contract(OptimismPortal)1021\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)43_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[43]\",\"numberOfBytes\":\"1376\",\"base\":\"t_uint256\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_array(t_uint256)50_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_contract(CrossDomainMessenger)1020\":{\"encoding\":\"inplace\",\"label\":\"contract CrossDomainMessenger\",\"numberOfBytes\":\"20\"},\"t_contract(OptimismPortal)1021\":{\"encoding\":\"inplace\",\"label\":\"contract OptimismPortal\",\"numberOfBytes\":\"20\"},\"t_contract(SuperchainConfig)1022\":{\"encoding\":\"inplace\",\"label\":\"contract SuperchainConfig\",\"numberOfBytes\":\"20\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_uint240\":{\"encoding\":\"inplace\",\"label\":\"uint240\",\"numberOfBytes\":\"30\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var L1CrossDomainMessengerStorageLayout = new(solc.StorageLayout)
-
-var L1CrossDomainMessengerDeployedBin = "0x6080604052600436106101805760003560e01c80635c975abb116100d6578063a4e7f8bd1161007f578063d764ad0b11610059578063d764ad0b14610463578063db505d8014610476578063ecc70428146104a357600080fd5b8063a4e7f8bd146103e3578063b1b1b20914610413578063b28ade251461044357600080fd5b806383a74074116100b057806383a74074146103a15780638cbeeef2146102b85780639fce812c146103b857600080fd5b80635c975abb1461033a5780636425666b1461035f5780636e296e451461038c57600080fd5b80633dbb202b116101385780634c1d6a69116101125780634c1d6a69146102b857806354fd4d50146102ce5780635644cfdf1461032457600080fd5b80633dbb202b1461025b5780633f827a5a14610270578063485cc9551461029857600080fd5b80630ff754ea116101695780630ff754ea146101cd5780632828d7e81461021957806335e80ab31461022e57600080fd5b8063028f85f7146101855780630c568498146101b8575b600080fd5b34801561019157600080fd5b5061019a601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101c457600080fd5b5061019a603f81565b3480156101d957600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101af565b34801561022557600080fd5b5061019a604081565b34801561023a57600080fd5b5060fb546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b61026e610269366004611a22565b610508565b005b34801561027c57600080fd5b50610285600181565b60405161ffff90911681526020016101af565b3480156102a457600080fd5b5061026e6102b3366004611a89565b610765565b3480156102c457600080fd5b5061019a619c4081565b3480156102da57600080fd5b506103176040518060400160405280600581526020017f322e332e3000000000000000000000000000000000000000000000000000000081525081565b6040516101af9190611b2d565b34801561033057600080fd5b5061019a61138881565b34801561034657600080fd5b5061034f6109d3565b60405190151581526020016101af565b34801561036b57600080fd5b5060fc546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039857600080fd5b506101f4610a6c565b3480156103ad57600080fd5b5061019a62030d4081565b3480156103c457600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101f4565b3480156103ef57600080fd5b5061034f6103fe366004611b47565b60ce6020526000908152604090205460ff1681565b34801561041f57600080fd5b5061034f61042e366004611b47565b60cb6020526000908152604090205460ff1681565b34801561044f57600080fd5b5061019a61045e366004611b60565b610b53565b61026e610471366004611bb4565b610bc1565b34801561048257600080fd5b5060cf546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104af57600080fd5b506104fa60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101af565b60cf5461063a9073ffffffffffffffffffffffffffffffffffffffff16610530858585610b53565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061059c60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016105b89796959493929190611c83565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526114f2565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856106bf60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516106d1959493929190611ce2565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b6000547501000000000000000000000000000000000000000000900460ff16158080156107b0575060005460017401000000000000000000000000000000000000000090910460ff16105b806107e25750303b1580156107e2575060005474010000000000000000000000000000000000000000900460ff166001145b610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905580156108f957600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc80549285169290911691909117905561096b73420000000000000000000000000000000000000761158b565b80156109ce57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a679190611d30565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f74207365740000000000000000000000606482015260840161086a565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f610b6f604063ffffffff8816611d81565b610b799190611db1565b610b84601088611d81565b610b919062030d40611dff565b610b9b9190611dff565b610ba59190611dff565b610baf9190611dff565b610bb99190611dff565b949350505050565b610bc96109d3565b15610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a2070617573656400000000604482015260640161086a565b60f087901c60028110610ceb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161086a565b8061ffff16600003610de0576000610d3c878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506116c7915050565b600081815260cb602052604090205490915060ff1615610dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161086a565b505b6000610e26898989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116e692505050565b9050610e30611709565b15610e6857853414610e4457610e44611e2b565b600081815260ce602052604090205460ff1615610e6357610e63611e2b565b610fba565b3415610f1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a40161086a565b600081815260ce602052604090205460ff16610fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161086a565b610fc3876117e5565b15611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161086a565b600081815260cb602052604090205460ff1615611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161086a565b61113685611127611388619c40611dff565b67ffffffffffffffff1661182b565b158061115c575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561127557600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b50506114cd565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061130688619c405a6112c99190611e5a565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061184992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156113bc57600082815260cb602052604090205460ff161561135957611359611e2b565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26114c9565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611553908890839089906000908990600401611e71565b6000604051808303818588803b15801561156c57600080fd5b505af1158015611580573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161086a565b60cc5473ffffffffffffffffffffffffffffffffffffffff166116805760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006116d585858585611863565b805190602001209050949350505050565b60006116f68787878787876118fc565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff1633148015610a67575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190611ec9565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611825575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60608484848460405160240161187c9493929190611ee6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161191996959493929190611f30565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146119bd57600080fd5b50565b60008083601f8401126119d257600080fd5b50813567ffffffffffffffff8111156119ea57600080fd5b602083019150836020828501011115611a0257600080fd5b9250929050565b803563ffffffff81168114611a1d57600080fd5b919050565b60008060008060608587031215611a3857600080fd5b8435611a438161199b565b9350602085013567ffffffffffffffff811115611a5f57600080fd5b611a6b878288016119c0565b9094509250611a7e905060408601611a09565b905092959194509250565b60008060408385031215611a9c57600080fd5b8235611aa78161199b565b91506020830135611ab78161199b565b809150509250929050565b6000815180845260005b81811015611ae857602081850181015186830182015201611acc565b81811115611afa576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611b406020830184611ac2565b9392505050565b600060208284031215611b5957600080fd5b5035919050565b600080600060408486031215611b7557600080fd5b833567ffffffffffffffff811115611b8c57600080fd5b611b98868287016119c0565b9094509250611bab905060208501611a09565b90509250925092565b600080600080600080600060c0888a031215611bcf57600080fd5b873596506020880135611be18161199b565b95506040880135611bf18161199b565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611c1b57600080fd5b611c278a828b016119c0565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611cd560c083018486611c3a565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611d12608083018688611c3a565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611d4257600080fd5b81518015158114611b4057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611da857611da8611d52565b02949350505050565b600067ffffffffffffffff80841680611df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611e2257611e22611d52565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611e6c57611e6c611d52565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611ebe60a0830184611ac2565b979650505050505050565b600060208284031215611edb57600080fd5b8151611b408161199b565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611f1f6080830185611ac2565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611f7b60c0830184611ac2565b9897505050505050505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(L1CrossDomainMessengerStorageLayoutJSON), L1CrossDomainMessengerStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["L1CrossDomainMessenger"] = L1CrossDomainMessengerStorageLayout
-	deployedBytecodes["L1CrossDomainMessenger"] = L1CrossDomainMessengerDeployedBin
-	immutableReferences["L1CrossDomainMessenger"] = false
-}
diff --git a/op-bindings/bindings/l1erc721bridge_more.go b/op-bindings/bindings/l1erc721bridge_more.go
deleted file mode 100644
index 522375412c14..000000000000
--- a/op-bindings/bindings/l1erc721bridge_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const L1ERC721BridgeStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge\",\"label\":\"spacer_0_2_30\",\"offset\":2,\"slot\":\"0\",\"type\":\"t_bytes30\"},{\"astId\":1003,\"contract\":\"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge\",\"label\":\"messenger\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_contract(CrossDomainMessenger)1008\"},{\"astId\":1004,\"contract\":\"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge\",\"label\":\"otherBridge\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_contract(StandardBridge)1009\"},{\"astId\":1005,\"contract\":\"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_array(t_uint256)46_storage\"},{\"astId\":1006,\"contract\":\"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge\",\"label\":\"deposits\",\"offset\":0,\"slot\":\"49\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_mapping(t_uint256,t_bool)))\"},{\"astId\":1007,\"contract\":\"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge\",\"label\":\"superchainConfig\",\"offset\":0,\"slot\":\"50\",\"type\":\"t_contract(SuperchainConfig)1010\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)46_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[46]\",\"numberOfBytes\":\"1472\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes30\":{\"encoding\":\"inplace\",\"label\":\"bytes30\",\"numberOfBytes\":\"30\"},\"t_contract(CrossDomainMessenger)1008\":{\"encoding\":\"inplace\",\"label\":\"contract CrossDomainMessenger\",\"numberOfBytes\":\"20\"},\"t_contract(StandardBridge)1009\":{\"encoding\":\"inplace\",\"label\":\"contract StandardBridge\",\"numberOfBytes\":\"20\"},\"t_contract(SuperchainConfig)1010\":{\"encoding\":\"inplace\",\"label\":\"contract SuperchainConfig\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_mapping(t_uint256,t_bool)))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e mapping(uint256 =\u003e bool)))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_mapping(t_uint256,t_bool))\"},\"t_mapping(t_address,t_mapping(t_uint256,t_bool))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(uint256 =\u003e bool))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_uint256,t_bool)\"},\"t_mapping(t_uint256,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_bool\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var L1ERC721BridgeStorageLayout = new(solc.StorageLayout)
-
-var L1ERC721BridgeDeployedBin = "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(L1ERC721BridgeStorageLayoutJSON), L1ERC721BridgeStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["L1ERC721Bridge"] = L1ERC721BridgeStorageLayout
-	deployedBytecodes["L1ERC721Bridge"] = L1ERC721BridgeDeployedBin
-	immutableReferences["L1ERC721Bridge"] = false
-}
diff --git a/op-bindings/bindings/l1feevault_more.go b/op-bindings/bindings/l1feevault_more.go
deleted file mode 100644
index c3b8cb5126fd..000000000000
--- a/op-bindings/bindings/l1feevault_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const L1FeeVaultStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L2/L1FeeVault.sol:L1FeeVault\",\"label\":\"totalProcessed\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint256\"}],\"types\":{\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}"
-
-var L1FeeVaultStorageLayout = new(solc.StorageLayout)
-
-var L1FeeVaultDeployedBin = "0x6080604052600436106100695760003560e01c806384411d651161004357806384411d6514610140578063d0e12f9014610164578063d3e5792b146101a557600080fd5b80630d9019e1146100755780633ccfd60b146100d357806354fd4d50146100ea57600080fd5b3661007057005b600080fd5b34801561008157600080fd5b506100a97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156100df57600080fd5b506100e86101d9565b005b3480156100f657600080fd5b506101336040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b6040516100ca9190610630565b34801561014c57600080fd5b5061015660005481565b6040519081526020016100ca565b34801561017057600080fd5b506101987f000000000000000000000000000000000000000000000000000000000000000081565b6040516100ca91906106b4565b3480156101b157600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b7f00000000000000000000000000000000000000000000000000000000000000004710156102b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6000479050806000808282546102ca91906106c8565b9091555050604080518281527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166020820152338183015290517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee817f0000000000000000000000000000000000000000000000000000000000000000337f00000000000000000000000000000000000000000000000000000000000000006040516103b89493929190610707565b60405180910390a160017f000000000000000000000000000000000000000000000000000000000000000060018111156103f4576103f461064a565b0361050d5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610473576040519150601f19603f3d011682016040523d82523d6000602084013e610478565b606091505b5050905080610509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016102ab565b5050565b604080516020810182526000815290517fe11013dd0000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109163e11013dd918491610590917f0000000000000000000000000000000000000000000000000000000000000000916188b891600401610748565b6000604051808303818588803b1580156105a957600080fd5b505af11580156105bd573d6000803e3d6000fd5b505050505050565b6000815180845260005b818110156105eb576020818501810151868301820152016105cf565b818111156105fd576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061064360208301846105c5565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106106b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b602081016106c28284610679565b92915050565b60008219821115610702577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff8481166020830152831660408201526080810161073f6060830184610679565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815263ffffffff8316602082015260606040820152600061073f60608301846105c556fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(L1FeeVaultStorageLayoutJSON), L1FeeVaultStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["L1FeeVault"] = L1FeeVaultStorageLayout
-	deployedBytecodes["L1FeeVault"] = L1FeeVaultDeployedBin
-	immutableReferences["L1FeeVault"] = true
-}
diff --git a/op-bindings/bindings/l1standardbridge_more.go b/op-bindings/bindings/l1standardbridge_more.go
deleted file mode 100644
index 53217f6bf028..000000000000
--- a/op-bindings/bindings/l1standardbridge_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const L1StandardBridgeStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/L1StandardBridge.sol:L1StandardBridge\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/L1/L1StandardBridge.sol:L1StandardBridge\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/L1/L1StandardBridge.sol:L1StandardBridge\",\"label\":\"spacer_0_2_30\",\"offset\":2,\"slot\":\"0\",\"type\":\"t_bytes30\"},{\"astId\":1003,\"contract\":\"src/L1/L1StandardBridge.sol:L1StandardBridge\",\"label\":\"spacer_1_0_20\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"src/L1/L1StandardBridge.sol:L1StandardBridge\",\"label\":\"deposits\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1005,\"contract\":\"src/L1/L1StandardBridge.sol:L1StandardBridge\",\"label\":\"messenger\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_contract(CrossDomainMessenger)1009\"},{\"astId\":1006,\"contract\":\"src/L1/L1StandardBridge.sol:L1StandardBridge\",\"label\":\"otherBridge\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_contract(StandardBridge)1010\"},{\"astId\":1007,\"contract\":\"src/L1/L1StandardBridge.sol:L1StandardBridge\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_array(t_uint256)45_storage\"},{\"astId\":1008,\"contract\":\"src/L1/L1StandardBridge.sol:L1StandardBridge\",\"label\":\"superchainConfig\",\"offset\":0,\"slot\":\"50\",\"type\":\"t_contract(SuperchainConfig)1011\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)45_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[45]\",\"numberOfBytes\":\"1440\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes30\":{\"encoding\":\"inplace\",\"label\":\"bytes30\",\"numberOfBytes\":\"30\"},\"t_contract(CrossDomainMessenger)1009\":{\"encoding\":\"inplace\",\"label\":\"contract CrossDomainMessenger\",\"numberOfBytes\":\"20\"},\"t_contract(StandardBridge)1010\":{\"encoding\":\"inplace\",\"label\":\"contract StandardBridge\",\"numberOfBytes\":\"20\"},\"t_contract(SuperchainConfig)1011\":{\"encoding\":\"inplace\",\"label\":\"contract SuperchainConfig\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var L1StandardBridgeStorageLayout = new(solc.StorageLayout)
-
-var L1StandardBridgeDeployedBin = "0x6080604052600436106101795760003560e01c80637f46ddb2116100cb578063927ede2d1161007f578063b1a1a88211610059578063b1a1a882146104fe578063c89701a214610511578063e11013dd1461053e57600080fd5b8063927ede2d146104a05780639a2ac6d5146104cb578063a9f9e675146104de57600080fd5b806387087623116100b0578063870876231461043a5780638f601f661461045a57806391c49bf8146103ef57600080fd5b80637f46ddb2146103ef578063838b25201461041a57600080fd5b80633cb747bf1161012d57806354fd4d501161010757806354fd4d501461035457806358a997f6146103aa5780635c975abb146103ca57600080fd5b80633cb747bf146102e7578063485cc95514610314578063540abf731461033457600080fd5b80631532ec341161015e5780631532ec341461026a5780631635f5fd1461027d57806335e80ab31461029057600080fd5b80630166a07a1461023757806309fc88431461025757600080fd5b3661023257333b15610212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b610230333362030d406040518060200160405280600081525061056d565b005b600080fd5b34801561024357600080fd5b506102306102523660046126b1565b610580565b610230610265366004612762565b61099a565b6102306102783660046127b5565b610a71565b61023061028b3660046127b5565b610a85565b34801561029c57600080fd5b506032546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102f357600080fd5b506003546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032057600080fd5b5061023061032f366004612828565b610f4e565b34801561034057600080fd5b5061023061034f366004612861565b611137565b34801561036057600080fd5b5061039d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102de919061294e565b3480156103b657600080fd5b506102306103c5366004612961565b61117c565b3480156103d657600080fd5b506103df611250565b60405190151581526020016102de565b3480156103fb57600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102bd565b34801561042657600080fd5b50610230610435366004612861565b6112e9565b34801561044657600080fd5b50610230610455366004612961565b61132e565b34801561046657600080fd5b50610492610475366004612828565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102de565b3480156104ac57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102bd565b6102306104d93660046129e4565b611402565b3480156104ea57600080fd5b506102306104f93660046126b1565b611444565b61023061050c366004612762565b611453565b34801561051d57600080fd5b506004546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b61023061054c3660046129e4565b611524565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61057a8484348585611567565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610653575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b9190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b61070d611250565b15610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b61077d87611731565b156108cb5761078c8787611793565b61083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108ae57600080fd5b505af11580156108c2573d6000803e3d6000fd5b5050505061094d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610909908490612a93565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c168352939052919091209190915561094d9085856118b3565b610991878787878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061198792505050565b50505050505050565b333b15610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c3333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b505050565b610a7e8585858585610a85565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b58575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b409190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b610c12611250565b15610c79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b823414610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610209565b3073ffffffffffffffffffffffffffffffffffffffff851603610dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610209565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610209565b610e9a85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a1592505050565b6000610eb7855a8660405180602001604052806000815250611a88565b905080610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610209565b505050505050565b600054610100900460ff1615808015610f6e5750600054600160ff909116105b80610f885750303b158015610f88575060005460ff166001145b611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610209565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556110d083734200000000000000000000000000000000000010611aa2565b8015610a6c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b333b1561120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156112c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e49190612aaa565b905090565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b333b156113bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b61057a33858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61099187878787878787610580565b333b156114e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61057a3385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b8234146115f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610209565b61160285858584611ec6565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd0000000000000000000000000000000000000000000000000000000090611665908b908b9086908a90602401612acc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526116f892918890600401612b15565b6000604051808303818588803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b50505050505050505050565b600061175d827f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b8061178d575061178d827fec4fc8e300000000000000000000000000000000000000000000000000000000611f39565b92915050565b60006117bf837f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b15611868578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118339190612a47565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905061178d565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a6c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611f5c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b38686866040516119ff93929190612b5a565b60405180910390a4610f46868686868686612068565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611a74929190612b98565b60405180910390a361057a848484846120f0565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610209565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b611b9587611731565b15611ce357611ba48787611793565b611c56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611cc657600080fd5b505af1158015611cda573d6000803e3d6000fd5b50505050611d77565b611d0573ffffffffffffffffffffffffffffffffffffffff881686308661215d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611d43908490612bb1565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611d858787878787866121bb565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611de9908b908d908c908c908c908b90602401612bc9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611e7c92918790600401612b15565b600060405180830381600087803b158015611e9657600080fd5b505af1158015611eaa573d6000803e3d6000fd5b5050505050505050505050565b61099187878787878787611b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f238484604051611f25929190612b98565b60405180910390a361057a84848484612249565b6000611f44836122a8565b8015611f555750611f55838361230c565b9392505050565b6000611fbe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123db9092919063ffffffff16565b805190915015610a6c5780806020019051810190611fdc9190612aaa565b610a6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610209565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8686866040516120e093929190612b5a565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d848460405161214f929190612b98565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261057a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611905565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161223393929190612b5a565b60405180910390a4610f468686868686866123f2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5848460405161214f929190612b98565b60006122d4827f01ffc9a70000000000000000000000000000000000000000000000000000000061230c565b801561178d5750612305827fffffffff0000000000000000000000000000000000000000000000000000000061230c565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156123c4575060208210155b80156123d05750600081115b979650505050505050565b60606123ea848460008561246a565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8686866040516120e093929190612b5a565b6060824710156124fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610209565b73ffffffffffffffffffffffffffffffffffffffff85163b61257a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610209565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125a39190612c24565b60006040518083038185875af1925050503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b50915091506123d0828286606083156125ff575081611f55565b82511561260f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610209919061294e565b73ffffffffffffffffffffffffffffffffffffffff8116811461266557600080fd5b50565b60008083601f84011261267a57600080fd5b50813567ffffffffffffffff81111561269257600080fd5b6020830191508360208285010111156126aa57600080fd5b9250929050565b600080600080600080600060c0888a0312156126cc57600080fd5b87356126d781612643565b965060208801356126e781612643565b955060408801356126f781612643565b9450606088013561270781612643565b93506080880135925060a088013567ffffffffffffffff81111561272a57600080fd5b6127368a828b01612668565b989b979a50959850939692959293505050565b803563ffffffff8116811461275d57600080fd5b919050565b60008060006040848603121561277757600080fd5b61278084612749565b9250602084013567ffffffffffffffff81111561279c57600080fd5b6127a886828701612668565b9497909650939450505050565b6000806000806000608086880312156127cd57600080fd5b85356127d881612643565b945060208601356127e881612643565b935060408601359250606086013567ffffffffffffffff81111561280b57600080fd5b61281788828901612668565b969995985093965092949392505050565b6000806040838503121561283b57600080fd5b823561284681612643565b9150602083013561285681612643565b809150509250929050565b600080600080600080600060c0888a03121561287c57600080fd5b873561288781612643565b9650602088013561289781612643565b955060408801356128a781612643565b9450606088013593506128bc60808901612749565b925060a088013567ffffffffffffffff81111561272a57600080fd5b60005b838110156128f35781810151838201526020016128db565b8381111561057a5750506000910152565b6000815180845261291c8160208601602086016128d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f556020830184612904565b60008060008060008060a0878903121561297a57600080fd5b863561298581612643565b9550602087013561299581612643565b9450604087013593506129aa60608801612749565b9250608087013567ffffffffffffffff8111156129c657600080fd5b6129d289828a01612668565b979a9699509497509295939492505050565b600080600080606085870312156129fa57600080fd5b8435612a0581612643565b9350612a1360208601612749565b9250604085013567ffffffffffffffff811115612a2f57600080fd5b612a3b87828801612668565b95989497509550505050565b600060208284031215612a5957600080fd5b8151611f5581612643565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612aa557612aa5612a64565b500390565b600060208284031215612abc57600080fd5b81518015158114611f5557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612b0b6080830184612904565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612b446060830185612904565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612b8f6060830184612904565b95945050505050565b8281526040602082015260006123ea6040830184612904565b60008219821115612bc457612bc4612a64565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612c1860c0830184612904565b98975050505050505050565b60008251612c368184602087016128d8565b919091019291505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(L1StandardBridgeStorageLayoutJSON), L1StandardBridgeStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["L1StandardBridge"] = L1StandardBridgeStorageLayout
-	deployedBytecodes["L1StandardBridge"] = L1StandardBridgeDeployedBin
-	immutableReferences["L1StandardBridge"] = false
-}
diff --git a/op-bindings/bindings/l2crossdomainmessenger_more.go b/op-bindings/bindings/l2crossdomainmessenger_more.go
deleted file mode 100644
index 743b69412ffd..000000000000
--- a/op-bindings/bindings/l2crossdomainmessenger_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const L2CrossDomainMessengerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"spacer_0_0_20\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"_initialized\",\"offset\":20,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1002,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"_initializing\",\"offset\":21,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1003,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"spacer_1_0_1600\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)50_storage\"},{\"astId\":1004,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"spacer_51_0_20\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1005,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"spacer_52_0_1568\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1006,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"spacer_101_0_1\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":1007,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"spacer_102_0_1568\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1008,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"spacer_151_0_32\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"spacer_152_0_1568\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1010,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"spacer_201_0_32\",\"offset\":0,\"slot\":\"201\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1011,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"spacer_202_0_32\",\"offset\":0,\"slot\":\"202\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1012,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"successfulMessages\",\"offset\":0,\"slot\":\"203\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1013,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"xDomainMsgSender\",\"offset\":0,\"slot\":\"204\",\"type\":\"t_address\"},{\"astId\":1014,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"msgNonce\",\"offset\":0,\"slot\":\"205\",\"type\":\"t_uint240\"},{\"astId\":1015,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"failedMessages\",\"offset\":0,\"slot\":\"206\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1016,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"otherMessenger\",\"offset\":0,\"slot\":\"207\",\"type\":\"t_contract(CrossDomainMessenger)1018\"},{\"astId\":1017,\"contract\":\"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"208\",\"type\":\"t_array(t_uint256)43_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)43_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[43]\",\"numberOfBytes\":\"1376\",\"base\":\"t_uint256\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_array(t_uint256)50_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_contract(CrossDomainMessenger)1018\":{\"encoding\":\"inplace\",\"label\":\"contract CrossDomainMessenger\",\"numberOfBytes\":\"20\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_uint240\":{\"encoding\":\"inplace\",\"label\":\"uint240\",\"numberOfBytes\":\"30\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var L2CrossDomainMessengerStorageLayout = new(solc.StorageLayout)
-
-var L2CrossDomainMessengerDeployedBin = "0x60806040526004361061016a5760003560e01c806383a74074116100cb578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b146103c7578063db505d80146103da578063ecc704281461040757600080fd5b8063b1b1b20914610357578063b28ade2514610387578063c4d66de8146103a757600080fd5b80639fce812c116100b05780639fce812c146102fc578063a4e7f8bd14610327578063a7119869146102fc57600080fd5b806383a74074146102e55780638cbeeef21461020957600080fd5b80634c1d6a69116101225780635644cfdf116101075780635644cfdf146102755780635c975abb1461028b5780636e296e45146102ab57600080fd5b80634c1d6a691461020957806354fd4d501461021f57600080fd5b80632828d7e8116101535780632828d7e8146101b75780633dbb202b146101cc5780633f827a5a146101e157600080fd5b8063028f85f71461016f5780630c568498146101a2575b600080fd5b34801561017b57600080fd5b50610184601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101ae57600080fd5b50610184603f81565b3480156101c357600080fd5b50610184604081565b6101df6101da36600461177b565b61046c565b005b3480156101ed57600080fd5b506101f6600181565b60405161ffff9091168152602001610199565b34801561021557600080fd5b50610184619c4081565b34801561022b57600080fd5b506102686040518060400160405280600581526020017f322e302e3000000000000000000000000000000000000000000000000000000081525081565b604051610199919061184d565b34801561028157600080fd5b5061018461138881565b34801561029757600080fd5b5060005b6040519015158152602001610199565b3480156102b757600080fd5b506102c06106c9565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610199565b3480156102f157600080fd5b5061018462030d4081565b34801561030857600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166102c0565b34801561033357600080fd5b5061029b610342366004611867565b60ce6020526000908152604090205460ff1681565b34801561036357600080fd5b5061029b610372366004611867565b60cb6020526000908152604090205460ff1681565b34801561039357600080fd5b506101846103a2366004611880565b6107b5565b3480156103b357600080fd5b506101df6103c23660046118d4565b610823565b6101df6103d53660046118f1565b610a22565b3480156103e657600080fd5b5060cf546102c09073ffffffffffffffffffffffffffffffffffffffff1681565b34801561041357600080fd5b5061045e60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b604051908152602001610199565b60cf5461059e9073ffffffffffffffffffffffffffffffffffffffff166104948585856107b5565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061050060cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c60405160240161051c97969594939291906119c0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611323565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561062360cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b86604051610635959493929190611a1f565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084015b60405180910390fd5b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6107d1604063ffffffff8816611a9c565b6107db9190611acc565b6107e6601088611a9c565b6107f39062030d40611b1a565b6107fd9190611b1a565b6108079190611b1a565b6108119190611b1a565b61081b9190611b1a565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff161580801561086e575060005460017401000000000000000000000000000000000000000090910460ff16105b806108a05750303b1580156108a0575060005474010000000000000000000000000000000000000000900460ff166001145b61092c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161078f565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905580156109b257600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b6109bb826113b1565b8015610a1e57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60f087901c60028110610add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161078f565b8061ffff16600003610bd2576000610b2e878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506114ed915050565b600081815260cb602052604090205490915060ff1615610bd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161078f565b505b6000610c18898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061150c92505050565b9050610c6160cf54337fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef0173ffffffffffffffffffffffffffffffffffffffff90811691161490565b15610c9957853414610c7557610c75611b46565b600081815260ce602052604090205460ff1615610c9457610c94611b46565b610deb565b3415610d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a40161078f565b600081815260ce602052604090205460ff16610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161078f565b610df48761152f565b15610ea7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161078f565b600081815260cb602052604090205460ff1615610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161078f565b610f6785610f58611388619c40611b1a565b67ffffffffffffffff16611584565b1580610f8d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b156110a657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161109f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161078f565b50506112fe565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061113788619c405a6110fa9190611b75565b8988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506115a292505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156111ed57600082815260cb602052604090205460ff161561118a5761118a611b46565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26112fa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016112fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161078f565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6040517fc2b3e5ac0000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000169063c2b3e5ac90849061137990889088908790600401611b8c565b6000604051808303818588803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff1661145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161078f565b60cc5473ffffffffffffffffffffffffffffffffffffffff166114a65760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006114fb858585856115bc565b805190602001209050949350505050565b600061151c878787878787611655565b8051906020012090509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff821630148061157e575073ffffffffffffffffffffffffffffffffffffffff8216734200000000000000000000000000000000000016145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b6060848484846040516024016115d59493929190611bd4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161167296959493929190611c1e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461171657600080fd5b50565b60008083601f84011261172b57600080fd5b50813567ffffffffffffffff81111561174357600080fd5b60208301915083602082850101111561175b57600080fd5b9250929050565b803563ffffffff8116811461177657600080fd5b919050565b6000806000806060858703121561179157600080fd5b843561179c816116f4565b9350602085013567ffffffffffffffff8111156117b857600080fd5b6117c487828801611719565b90945092506117d7905060408601611762565b905092959194509250565b6000815180845260005b81811015611808576020818501810151868301820152016117ec565b8181111561181a576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061186060208301846117e2565b9392505050565b60006020828403121561187957600080fd5b5035919050565b60008060006040848603121561189557600080fd5b833567ffffffffffffffff8111156118ac57600080fd5b6118b886828701611719565b90945092506118cb905060208501611762565b90509250925092565b6000602082840312156118e657600080fd5b8135611860816116f4565b600080600080600080600060c0888a03121561190c57600080fd5b87359650602088013561191e816116f4565b9550604088013561192e816116f4565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561195857600080fd5b6119648a828b01611719565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611a1260c083018486611977565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611a4f608083018688611977565b905083604083015263ffffffff831660608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611ac357611ac3611a6d565b02949350505050565b600067ffffffffffffffff80841680611b0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611b3d57611b3d611a6d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611b8757611b87611a6d565b500390565b73ffffffffffffffffffffffffffffffffffffffff8416815267ffffffffffffffff83166020820152606060408201526000611bcb60608301846117e2565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611c0d60808301856117e2565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611c6960c08301846117e2565b9897505050505050505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(L2CrossDomainMessengerStorageLayoutJSON), L2CrossDomainMessengerStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["L2CrossDomainMessenger"] = L2CrossDomainMessengerStorageLayout
-	deployedBytecodes["L2CrossDomainMessenger"] = L2CrossDomainMessengerDeployedBin
-	immutableReferences["L2CrossDomainMessenger"] = false
-}
diff --git a/op-bindings/bindings/l2erc721bridge_more.go b/op-bindings/bindings/l2erc721bridge_more.go
deleted file mode 100644
index 6c05fd789837..000000000000
--- a/op-bindings/bindings/l2erc721bridge_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const L2ERC721BridgeStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge\",\"label\":\"spacer_0_2_30\",\"offset\":2,\"slot\":\"0\",\"type\":\"t_bytes30\"},{\"astId\":1003,\"contract\":\"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge\",\"label\":\"messenger\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_contract(CrossDomainMessenger)1006\"},{\"astId\":1004,\"contract\":\"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge\",\"label\":\"otherBridge\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_contract(StandardBridge)1007\"},{\"astId\":1005,\"contract\":\"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_array(t_uint256)46_storage\"}],\"types\":{\"t_array(t_uint256)46_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[46]\",\"numberOfBytes\":\"1472\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes30\":{\"encoding\":\"inplace\",\"label\":\"bytes30\",\"numberOfBytes\":\"30\"},\"t_contract(CrossDomainMessenger)1006\":{\"encoding\":\"inplace\",\"label\":\"contract CrossDomainMessenger\",\"numberOfBytes\":\"20\"},\"t_contract(StandardBridge)1007\":{\"encoding\":\"inplace\",\"label\":\"contract StandardBridge\",\"numberOfBytes\":\"20\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var L2ERC721BridgeStorageLayout = new(solc.StorageLayout)
-
-var L2ERC721BridgeDeployedBin = "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c80637f46ddb211610076578063aa5574521161005b578063aa557452146101c9578063c4d66de8146101dc578063c89701a2146101ef57600080fd5b80637f46ddb21461018d578063927ede2d146101ab57600080fd5b806354fd4d50116100a757806354fd4d50146101225780635c975abb1461016b578063761f44931461017a57600080fd5b80633687011a146100c35780633cb747bf146100d8575b600080fd5b6100d66100d136600461128a565b61020f565b005b6001546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61015e6040518060400160405280600581526020017f312e372e3000000000000000000000000000000000000000000000000000000081525081565b6040516101199190611378565b60405160008152602001610119565b6100d661018836600461138b565b6102bb565b60025473ffffffffffffffffffffffffffffffffffffffff166100f8565b60015473ffffffffffffffffffffffffffffffffffffffff166100f8565b6100d66101d7366004611423565b6107d9565b6100d66101ea36600461149a565b610895565b6002546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b333b156102a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102b38686333388888888610a5a565b505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156103905750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa158015610354573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037891906114b7565b73ffffffffffffffffffffffffffffffffffffffff16145b61041c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161029a565b3073ffffffffffffffffffffffffffffffffffffffff8816036104c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c324552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161029a565b6104eb877f74259ebf00000000000000000000000000000000000000000000000000000000610fc2565b610577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324552433732314272696467653a206c6f63616c20746f6b656e20696e746560448201527f7266616365206973206e6f7420636f6d706c69616e7400000000000000000000606482015260840161029a565b8673ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e691906114b7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146106c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4c324552433732314272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433732312060648201527f6c6f63616c20746f6b656e000000000000000000000000000000000000000000608482015260a40161029a565b6040517fa144819400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301526024820185905288169063a144819490604401600060405180830381600087803b15801561073657600080fd5b505af115801561074a573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac878787876040516107c8949392919061151d565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff851661087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161029a565b61088c8787338888888888610a5a565b50505050505050565b600054610100900460ff16158080156108b55750600054600160ff909116105b806108cf5750303b1580156108cf575060005460ff166001145b61095b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161029a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156109b957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109d773420000000000000000000000000000000000000783610fe5565b8015610a3a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c324552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161029a565b6040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff891690636352211e90602401602060405180830381865afa158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c91906114b7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610c46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324552433732314272696467653a205769746864726177616c206973206e6f60448201527f74206265696e6720696e69746961746564206279204e4654206f776e65720000606482015260840161029a565b60008873ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb791906114b7565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c324552433732314272696467653a2072656d6f746520746f6b656e20646f6560448201527f73206e6f74206d6174636820676976656e2076616c7565000000000000000000606482015260840161029a565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018790528a1690639dc29fac90604401600060405180830381600087803b158015610de457600080fd5b505af1158015610df8573d6000803e3d6000fd5b50505050600063761f449360e01b828b8a8a8a8989604051602401610e23979695949392919061155d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260015460025492517f3dbb202b00000000000000000000000000000000000000000000000000000000815291935073ffffffffffffffffffffffffffffffffffffffff90811692633dbb202b92610f0292919091169085908a906004016115ba565b600060405180830381600087803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a58a8a8989604051610fae949392919061151d565b60405180910390a450505050505050505050565b6000610fcd836110cf565b8015610fde5750610fde8383611134565b9392505050565b600054610100900460ff1661107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161029a565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b60006110fb827f01ffc9a700000000000000000000000000000000000000000000000000000000611134565b801561112e575061112c827fffffffff00000000000000000000000000000000000000000000000000000000611134565b155b92915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156111ec575060208210155b80156111f85750600081115b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461122557600080fd5b50565b803563ffffffff8116811461123c57600080fd5b919050565b60008083601f84011261125357600080fd5b50813567ffffffffffffffff81111561126b57600080fd5b60208301915083602082850101111561128357600080fd5b9250929050565b60008060008060008060a087890312156112a357600080fd5b86356112ae81611203565b955060208701356112be81611203565b9450604087013593506112d360608801611228565b9250608087013567ffffffffffffffff8111156112ef57600080fd5b6112fb89828a01611241565b979a9699509497509295939492505050565b6000815180845260005b8181101561133357602081850181015186830182015201611317565b81811115611345576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610fde602083018461130d565b600080600080600080600060c0888a0312156113a657600080fd5b87356113b181611203565b965060208801356113c181611203565b955060408801356113d181611203565b945060608801356113e181611203565b93506080880135925060a088013567ffffffffffffffff81111561140457600080fd5b6114108a828b01611241565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561143e57600080fd5b873561144981611203565b9650602088013561145981611203565b9550604088013561146981611203565b94506060880135935061147e60808901611228565b925060a088013567ffffffffffffffff81111561140457600080fd5b6000602082840312156114ac57600080fd5b8135610fde81611203565b6000602082840312156114c957600080fd5b8151610fde81611203565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006115536060830184866114d4565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526115ad60c0830184866114d4565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006115e9606083018561130d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(L2ERC721BridgeStorageLayoutJSON), L2ERC721BridgeStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["L2ERC721Bridge"] = L2ERC721BridgeStorageLayout
-	deployedBytecodes["L2ERC721Bridge"] = L2ERC721BridgeDeployedBin
-	immutableReferences["L2ERC721Bridge"] = false
-}
diff --git a/op-bindings/bindings/l2outputoracle_more.go b/op-bindings/bindings/l2outputoracle_more.go
deleted file mode 100644
index 361430a161e7..000000000000
--- a/op-bindings/bindings/l2outputoracle_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const L2OutputOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"startingBlockNumber\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_uint256\"},{\"astId\":1003,\"contract\":\"src/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"startingTimestamp\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint256\"},{\"astId\":1004,\"contract\":\"src/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"l2Outputs\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_array(t_struct(OutputProposal)1010_storage)dyn_storage\"},{\"astId\":1005,\"contract\":\"src/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"submissionInterval\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"src/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"l2BlockTime\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_uint256\"},{\"astId\":1007,\"contract\":\"src/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"challenger\",\"offset\":0,\"slot\":\"6\",\"type\":\"t_address\"},{\"astId\":1008,\"contract\":\"src/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"proposer\",\"offset\":0,\"slot\":\"7\",\"type\":\"t_address\"},{\"astId\":1009,\"contract\":\"src/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"finalizationPeriodSeconds\",\"offset\":0,\"slot\":\"8\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_struct(OutputProposal)1010_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct Types.OutputProposal[]\",\"numberOfBytes\":\"32\",\"base\":\"t_struct(OutputProposal)1010_storage\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_struct(OutputProposal)1010_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.OutputProposal\",\"numberOfBytes\":\"64\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var L2OutputOracleStorageLayout = new(solc.StorageLayout)
-
-var L2OutputOracleDeployedBin = "0x60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(L2OutputOracleStorageLayoutJSON), L2OutputOracleStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["L2OutputOracle"] = L2OutputOracleStorageLayout
-	deployedBytecodes["L2OutputOracle"] = L2OutputOracleDeployedBin
-	immutableReferences["L2OutputOracle"] = false
-}
diff --git a/op-bindings/bindings/l2standardbridge_more.go b/op-bindings/bindings/l2standardbridge_more.go
deleted file mode 100644
index dc0a5f0be8ae..000000000000
--- a/op-bindings/bindings/l2standardbridge_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const L2StandardBridgeStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"spacer_0_2_30\",\"offset\":2,\"slot\":\"0\",\"type\":\"t_bytes30\"},{\"astId\":1003,\"contract\":\"src/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"spacer_1_0_20\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"src/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"deposits\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1005,\"contract\":\"src/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"messenger\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_contract(CrossDomainMessenger)1008\"},{\"astId\":1006,\"contract\":\"src/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"otherBridge\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_contract(StandardBridge)1009\"},{\"astId\":1007,\"contract\":\"src/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_array(t_uint256)45_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)45_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[45]\",\"numberOfBytes\":\"1440\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes30\":{\"encoding\":\"inplace\",\"label\":\"bytes30\",\"numberOfBytes\":\"30\"},\"t_contract(CrossDomainMessenger)1008\":{\"encoding\":\"inplace\",\"label\":\"contract CrossDomainMessenger\",\"numberOfBytes\":\"20\"},\"t_contract(StandardBridge)1009\":{\"encoding\":\"inplace\",\"label\":\"contract StandardBridge\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var L2StandardBridgeStorageLayout = new(solc.StorageLayout)
-
-var L2StandardBridgeDeployedBin = "0x60806040526004361061012d5760003560e01c8063662a633a116100a5578063927ede2d11610074578063c4d66de811610059578063c4d66de814610421578063c89701a214610441578063e11013dd1461046e57600080fd5b8063927ede2d146103e3578063a3a795481461040e57600080fd5b8063662a633a1461036a5780637f46ddb21461025a578063870876231461037d5780638f601f661461039d57600080fd5b806336c717c1116100fc578063540abf73116100e1578063540abf73146102d857806354fd4d50146102f85780635c975abb1461034e57600080fd5b806336c717c11461025a5780633cb747bf146102ab57600080fd5b80630166a07a1461020157806309fc8843146102215780631635f5fd1461023457806332b7006d1461024757600080fd5b366101fc57333b156101c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b6101fa73deaddeaddeaddeaddeaddeaddeaddeaddead000033333462030d406040518060200160405280600081525061049d565b005b600080fd5b34801561020d57600080fd5b506101fa61021c366004612476565b610578565b6101fa61022f366004612527565b61091a565b6101fa61024236600461257a565b6109f1565b6101fa6102553660046125ed565b610e43565b34801561026657600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102b757600080fd5b506003546102819073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102e457600080fd5b506101fa6102f3366004612641565b610f1d565b34801561030457600080fd5b506103416040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516102a2919061272e565b34801561035a57600080fd5b50604051600081526020016102a2565b6101fa610378366004612476565b610f62565b34801561038957600080fd5b506101fa610398366004612741565b610fd5565b3480156103a957600080fd5b506103d56103b83660046127c4565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102a2565b3480156103ef57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff16610281565b6101fa61041c366004612741565b6110a9565b34801561042d57600080fd5b506101fa61043c3660046127fd565b6110ed565b34801561044d57600080fd5b506004546102819073ffffffffffffffffffffffffffffffffffffffff1681565b6101fa61047c36600461281a565b611296565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b7fffffffffffffffffffffffff215221522152215221522152215221522153000073ffffffffffffffffffffffffffffffffffffffff8716016104ec576104e785858585856112df565b610570565b60008673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055d919061287d565b905061056e878288888888886114a9565b505b505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561064b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561060f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610633919061287d565b73ffffffffffffffffffffffffffffffffffffffff16145b6106fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b610706876117d4565b15610854576107158787611836565b6107c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b15801561083757600080fd5b505af115801561084b573d6000803e3d6000fd5b505050506108d6565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a16835292905220546108929084906128c9565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c16835293905291909120919091556108d6908585611956565b61056e878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a2a92505050565b333b156109a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b6109ec3333348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112df92505050565b505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610ac4575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac919061287d565b73ffffffffffffffffffffffffffffffffffffffff16145b610b76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b823414610c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e7420726571756972656400000000000060648201526084016101bd565b3073ffffffffffffffffffffffffffffffffffffffff851603610caa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c66000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e67657200000000000000000000000000000000000000000000000060648201526084016101bd565b610d9785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ab892505050565b6000610db4855a8660405180602001604052806000815250611b59565b905080610570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b333b15610ed2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b610f16853333878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049d92505050565b5050505050565b61056e87873388888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114a992505050565b73ffffffffffffffffffffffffffffffffffffffff8716158015610faf575073ffffffffffffffffffffffffffffffffffffffff861673deaddeaddeaddeaddeaddeaddeaddeaddead0000145b15610fc657610fc185858585856109f1565b61056e565b61056e86888787878787610578565b333b15611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b61057086863333888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114a992505050565b610570863387878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049d92505050565b600054610100900460ff161580801561110d5750600054600160ff909116105b806111275750303b158015611127575060005460ff166001145b6111b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016101bd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561121157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61122f73420000000000000000000000000000000000000783611b73565b801561129257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6112d93385348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112df92505050565b50505050565b82341461136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c7565000060648201526084016101bd565b61137a85858584611c5d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906113dd908b908b9086908a906024016128e0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261147092918890600401612929565b6000604051808303818588803b15801561148957600080fd5b505af115801561149d573d6000803e3d6000fd5b50505050505050505050565b6114b2876117d4565b15611600576114c18787611836565b611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b1580156115e357600080fd5b505af11580156115f7573d6000803e3d6000fd5b50505050611694565b61162273ffffffffffffffffffffffffffffffffffffffff8816863086611cfe565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a168352929052205461166090849061296e565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b6116a2878787878786611d5c565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611706908b908d908c908c908c908b90602401612986565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b909216825261179992918790600401612929565b600060405180830381600087803b1580156117b357600080fd5b505af11580156117c7573d6000803e3d6000fd5b5050505050505050505050565b6000611800827f1d1d8b6300000000000000000000000000000000000000000000000000000000611dea565b806118305750611830827fec4fc8e300000000000000000000000000000000000000000000000000000000611dea565b92915050565b6000611862837f1d1d8b6300000000000000000000000000000000000000000000000000000000611dea565b1561190b578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d6919061287d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611830565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109ec9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611e0d565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611aa2939291906129e1565b60405180910390a4610570868686868686611f19565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611b45939291906129e1565b60405180910390a46112d984848484611fa1565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016101bd565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611cea939291906129e1565b60405180910390a46112d98484848461200e565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526112d99085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016119a8565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611dd4939291906129e1565b60405180910390a461057086868686868661206d565b6000611df5836120e5565b8015611e065750611e068383612149565b9392505050565b6000611e6f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122189092919063ffffffff16565b8051909150156109ec5780806020019051810190611e8d9190612a1f565b6109ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101bd565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd868686604051611f91939291906129e1565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612000929190612a41565b60405180910390a350505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612000929190612a41565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf868686604051611f91939291906129e1565b6000612111827f01ffc9a700000000000000000000000000000000000000000000000000000000612149565b80156118305750612142827fffffffff00000000000000000000000000000000000000000000000000000000612149565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015612201575060208210155b801561220d5750600081115b979650505050505050565b6060612227848460008561222f565b949350505050565b6060824710156122c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101bd565b73ffffffffffffffffffffffffffffffffffffffff85163b61233f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101bd565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516123689190612a5a565b60006040518083038185875af1925050503d80600081146123a5576040519150601f19603f3d011682016040523d82523d6000602084013e6123aa565b606091505b509150915061220d828286606083156123c4575081611e06565b8251156123d45782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101bd919061272e565b73ffffffffffffffffffffffffffffffffffffffff8116811461242a57600080fd5b50565b60008083601f84011261243f57600080fd5b50813567ffffffffffffffff81111561245757600080fd5b60208301915083602082850101111561246f57600080fd5b9250929050565b600080600080600080600060c0888a03121561249157600080fd5b873561249c81612408565b965060208801356124ac81612408565b955060408801356124bc81612408565b945060608801356124cc81612408565b93506080880135925060a088013567ffffffffffffffff8111156124ef57600080fd5b6124fb8a828b0161242d565b989b979a50959850939692959293505050565b803563ffffffff8116811461252257600080fd5b919050565b60008060006040848603121561253c57600080fd5b6125458461250e565b9250602084013567ffffffffffffffff81111561256157600080fd5b61256d8682870161242d565b9497909650939450505050565b60008060008060006080868803121561259257600080fd5b853561259d81612408565b945060208601356125ad81612408565b935060408601359250606086013567ffffffffffffffff8111156125d057600080fd5b6125dc8882890161242d565b969995985093965092949392505050565b60008060008060006080868803121561260557600080fd5b853561261081612408565b9450602086013593506126256040870161250e565b9250606086013567ffffffffffffffff8111156125d057600080fd5b600080600080600080600060c0888a03121561265c57600080fd5b873561266781612408565b9650602088013561267781612408565b9550604088013561268781612408565b94506060880135935061269c6080890161250e565b925060a088013567ffffffffffffffff8111156124ef57600080fd5b60005b838110156126d35781810151838201526020016126bb565b838111156112d95750506000910152565b600081518084526126fc8160208601602086016126b8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611e0660208301846126e4565b60008060008060008060a0878903121561275a57600080fd5b863561276581612408565b9550602087013561277581612408565b94506040870135935061278a6060880161250e565b9250608087013567ffffffffffffffff8111156127a657600080fd5b6127b289828a0161242d565b979a9699509497509295939492505050565b600080604083850312156127d757600080fd5b82356127e281612408565b915060208301356127f281612408565b809150509250929050565b60006020828403121561280f57600080fd5b8135611e0681612408565b6000806000806060858703121561283057600080fd5b843561283b81612408565b93506128496020860161250e565b9250604085013567ffffffffffffffff81111561286557600080fd5b6128718782880161242d565b95989497509550505050565b60006020828403121561288f57600080fd5b8151611e0681612408565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156128db576128db61289a565b500390565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261291f60808301846126e4565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600061295860608301856126e4565b905063ffffffff83166040830152949350505050565b600082198211156129815761298161289a565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a08301526129d560c08301846126e4565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612a1660608301846126e4565b95945050505050565b600060208284031215612a3157600080fd5b81518015158114611e0657600080fd5b82815260406020820152600061222760408301846126e4565b60008251612a6c8184602087016126b8565b919091019291505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(L2StandardBridgeStorageLayoutJSON), L2StandardBridgeStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["L2StandardBridge"] = L2StandardBridgeStorageLayout
-	deployedBytecodes["L2StandardBridge"] = L2StandardBridgeDeployedBin
-	immutableReferences["L2StandardBridge"] = false
-}
diff --git a/op-bindings/bindings/l2tol1messagepasser_more.go b/op-bindings/bindings/l2tol1messagepasser_more.go
deleted file mode 100644
index 1af5727ff4d7..000000000000
--- a/op-bindings/bindings/l2tol1messagepasser_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const L2ToL1MessagePasserStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser\",\"label\":\"sentMessages\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1001,\"contract\":\"src/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser\",\"label\":\"msgNonce\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_uint240\"}],\"types\":{\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_uint240\":{\"encoding\":\"inplace\",\"label\":\"uint240\",\"numberOfBytes\":\"30\"}}}"
-
-var L2ToL1MessagePasserStorageLayout = new(solc.StorageLayout)
-
-var L2ToL1MessagePasserDeployedBin = "0x6080604052600436106100695760003560e01c806382e3702d1161004357806382e3702d1461012a578063c2b3e5ac1461016a578063ecc704281461017d57600080fd5b80633f827a5a1461009257806344df8e70146100bf57806354fd4d50146100d457600080fd5b3661008d5761008b33620186a0604051806020016040528060008152506101e2565b005b600080fd5b34801561009e57600080fd5b506100a7600181565b60405161ffff90911681526020015b60405180910390f35b3480156100cb57600080fd5b5061008b6103a6565b3480156100e057600080fd5b5061011d6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b691906104d1565b34801561013657600080fd5b5061015a6101453660046104eb565b60006020819052908152604090205460ff1681565b60405190151581526020016100b6565b61008b610178366004610533565b6101e2565b34801561018957600080fd5b506101d46001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016100b6565b60006102786040518060c0016040528061023c6001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b815233602082015273ffffffffffffffffffffffffffffffffffffffff871660408201523460608201526080810186905260a0018490526103de565b600081815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055905073ffffffffffffffffffffffffffffffffffffffff8416336103136001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b7f02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054348787876040516103489493929190610637565b60405180910390a45050600180547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082168301167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b476103b08161042b565b60405181907f7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f90600090a250565b80516020808301516040808501516060860151608087015160a0880151935160009761040e979096959101610667565b604051602081830303815290604052805190602001209050919050565b806040516104389061045a565b6040518091039082f0905080158015610455573d6000803e3d6000fd5b505050565b6008806106bf83390190565b6000815180845260005b8181101561048c57602081850181015186830182015201610470565b8181111561049e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104e46020830184610466565b9392505050565b6000602082840312156104fd57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060006060848603121561054857600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461056c57600080fd5b925060208401359150604084013567ffffffffffffffff8082111561059057600080fd5b818601915086601f8301126105a457600080fd5b8135818111156105b6576105b6610504565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156105fc576105fc610504565b8160405282815289602084870101111561061557600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b8481528360208201526080604082015260006106566080830185610466565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526106b260c0830184610466565b9897505050505050505056fe608060405230fffea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(L2ToL1MessagePasserStorageLayoutJSON), L2ToL1MessagePasserStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["L2ToL1MessagePasser"] = L2ToL1MessagePasserStorageLayout
-	deployedBytecodes["L2ToL1MessagePasser"] = L2ToL1MessagePasserDeployedBin
-	immutableReferences["L2ToL1MessagePasser"] = false
-}
diff --git a/op-bindings/bindings/legacymessagepasser_more.go b/op-bindings/bindings/legacymessagepasser_more.go
deleted file mode 100644
index 4f512661a4fb..000000000000
--- a/op-bindings/bindings/legacymessagepasser_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const LegacyMessagePasserStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/legacy/LegacyMessagePasser.sol:LegacyMessagePasser\",\"label\":\"sentMessages\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_bytes32,t_bool)\"}],\"types\":{\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"}}}"
-
-var LegacyMessagePasserStorageLayout = new(solc.StorageLayout)
-
-var LegacyMessagePasserDeployedBin = "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d501461004657806382e3702d14610098578063cafa81dc146100cb575b600080fd5b6100826040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f919061019b565b60405180910390f35b6100bb6100a63660046101ec565b60006020819052908152604090205460ff1681565b604051901515815260200161008f565b6100de6100d9366004610234565b6100e0565b005b600160008083336040516020016100f8929190610303565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301208352908201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60005b8381101561018657818101518382015260200161016e565b83811115610195576000848401525b50505050565b60208152600082518060208401526101ba81604085016020870161016b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000602082840312156101fe57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561024657600080fd5b813567ffffffffffffffff8082111561025e57600080fd5b818401915084601f83011261027257600080fd5b81358181111561028457610284610205565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102ca576102ca610205565b816040528281528760208487010111156102e357600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000835161031581846020880161016b565b60609390931b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014019291505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(LegacyMessagePasserStorageLayoutJSON), LegacyMessagePasserStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["LegacyMessagePasser"] = LegacyMessagePasserStorageLayout
-	deployedBytecodes["LegacyMessagePasser"] = LegacyMessagePasserDeployedBin
-	immutableReferences["LegacyMessagePasser"] = false
-}
diff --git a/op-bindings/bindings/mips_more.go b/op-bindings/bindings/mips_more.go
deleted file mode 100644
index 3413ca05d789..000000000000
--- a/op-bindings/bindings/mips_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const MIPSStorageLayoutJSON = "{\"storage\":null,\"types\":{}}"
-
-var MIPSStorageLayout = new(solc.StorageLayout)
-
-var MIPSDeployedBin = "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063155633fe1461005157806354fd4d50146100765780637dc0d1d0146100bf578063e14ced3214610103575b600080fd5b61005c634000000081565b60405163ffffffff90911681526020015b60405180910390f35b6100b26040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161006d9190611d39565b60405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161006d565b610116610111366004611df5565b610124565b60405190815260200161006d565b600061012e611caf565b6080811461013b57600080fd5b6040516106001461014b57600080fd5b6084871461015857600080fd5b6101a4851461016657600080fd5b8635608052602087013560a052604087013560e090811c60c09081526044890135821c82526048890135821c61010052604c890135821c610120526050890135821c61014052605489013590911c61016052605888013560f890811c610180526059890135901c6101a052605a880135901c6101c0526102006101e0819052606288019060005b602081101561021157823560e01c82526004909201916020909101906001016101ed565b5050508061012001511561022f5761022761066f565b915050610666565b6101408101805160010167ffffffffffffffff1690526060810151600090610257908261078b565b9050603f601a82901c16600281148061027657508063ffffffff166003145b156102cb5760006002836303ffffff1663ffffffff16901b846080015163f0000000161790506102c08263ffffffff166002146102b457601f6102b7565b60005b60ff1682610847565b945050505050610666565b6101608301516000908190601f601086901c81169190601587901c16602081106102f7576102f7611e69565b602002015192508063ffffffff8516158061031857508463ffffffff16601c145b1561034f578661016001518263ffffffff166020811061033a5761033a611e69565b6020020151925050601f600b86901c1661040b565b60208563ffffffff1610156103b1578463ffffffff16600c148061037957508463ffffffff16600d145b8061038a57508463ffffffff16600e145b1561039b578561ffff16925061040b565b6103aa8661ffff166010610938565b925061040b565b60288563ffffffff161015806103cd57508463ffffffff166022145b806103de57508463ffffffff166026145b1561040b578661016001518263ffffffff166020811061040057610400611e69565b602002015192508190505b60048563ffffffff1610158015610428575060088563ffffffff16105b8061043957508463ffffffff166001145b156104585761044a858784876109ab565b975050505050505050610666565b63ffffffff60006020878316106104bd576104788861ffff166010610938565b9095019463fffffffc861661048e81600161078b565b915060288863ffffffff16101580156104ae57508763ffffffff16603014155b156104bb57809250600093505b505b60006104cb89888885610bbb565b63ffffffff9081169150603f8a169089161580156104f0575060088163ffffffff1610155b80156105025750601c8163ffffffff16105b156105df578063ffffffff166008148061052257508063ffffffff166009145b15610559576105478163ffffffff1660081461053e5785610541565b60005b89610847565b9b505050505050505050505050610666565b8063ffffffff16600a0361057957610547858963ffffffff8a161561134b565b8063ffffffff16600b0361059a57610547858963ffffffff8a16151561134b565b8063ffffffff16600c036105b1576105478d611431565b60108163ffffffff16101580156105ce5750601c8163ffffffff16105b156105df5761054781898988611968565b8863ffffffff1660381480156105fa575063ffffffff861615155b1561062f5760018b61016001518763ffffffff166020811061061e5761061e611e69565b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff1461064c5761064c84600184611b62565b6106588583600161134b565b9b5050505050505050505050505b95945050505050565b60408051608051815260a051602082015260dc519181019190915260fc51604482015261011c51604882015261013c51604c82015261015c51605082015261017c5160548201526101805161019f5160588301526101a0516101bf5160598401526101d851605a840152600092610200929091606283019190855b602081101561070e57601c86015184526020909501946004909301926001016106ea565b506000835283830384a060009450806001811461072e5760039550610756565b828015610746576001811461074f5760029650610754565b60009650610754565b600196505b505b50505081900390207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f89190911b17919050565b60008061079783611c06565b905060038416156107a757600080fd5b6020810190358460051c8160005b601b81101561080d5760208501943583821c60011680156107dd57600181146107f257610803565b60008481526020839052604090209350610803565b600082815260208590526040902093505b50506001016107b5565b50608051915081811461082857630badf00d60005260206000fd5b5050601f94909416601c0360031b9390931c63ffffffff169392505050565b6000610851611caf565b60809050806060015160040163ffffffff16816080015163ffffffff16146108da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6a756d7020696e2064656c617920736c6f74000000000000000000000000000060448201526064015b60405180910390fd5b60608101805160808301805163ffffffff90811690935285831690529085161561093057806008018261016001518663ffffffff166020811061091f5761091f611e69565b63ffffffff90921660209290920201525b61066661066f565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610995576000610997565b815b90861663ffffffff16179250505092915050565b60006109b5611caf565b608090506000816060015160040163ffffffff16826080015163ffffffff1614610a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6272616e636820696e2064656c617920736c6f7400000000000000000000000060448201526064016108d1565b8663ffffffff1660041480610a5657508663ffffffff166005145b15610ad25760008261016001518663ffffffff1660208110610a7a57610a7a611e69565b602002015190508063ffffffff168563ffffffff16148015610aa257508763ffffffff166004145b80610aca57508063ffffffff168563ffffffff1614158015610aca57508763ffffffff166005145b915050610b4f565b8663ffffffff16600603610aef5760008460030b13159050610b4f565b8663ffffffff16600703610b0b5760008460030b139050610b4f565b8663ffffffff16600103610b4f57601f601087901c166000819003610b345760008560030b1291505b8063ffffffff16600103610b4d5760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b95576002610b7a8861ffff166010610938565b63ffffffff90811690911b8201600401166080840152610ba7565b60808301805160040163ffffffff1690525b610baf61066f565b98975050505050505050565b6000603f601a86901c16801580610bea575060088163ffffffff1610158015610bea5750600f8163ffffffff16105b1561104057603f86168160088114610c315760098114610c3a57600a8114610c4357600b8114610c4c57600c8114610c5557600d8114610c5e57600e8114610c6757610c6c565b60209150610c6c565b60219150610c6c565b602a9150610c6c565b602b9150610c6c565b60249150610c6c565b60259150610c6c565b602691505b508063ffffffff16600003610c935750505063ffffffff8216601f600686901c161b611343565b8063ffffffff16600203610cb95750505063ffffffff8216601f600686901c161c611343565b8063ffffffff16600303610cef57601f600688901c16610ce563ffffffff8716821c6020839003610938565b9350505050611343565b8063ffffffff16600403610d115750505063ffffffff8216601f84161b611343565b8063ffffffff16600603610d335750505063ffffffff8216601f84161c611343565b8063ffffffff16600703610d6657610d5d8663ffffffff168663ffffffff16901c87602003610938565b92505050611343565b8063ffffffff16600803610d7e578592505050611343565b8063ffffffff16600903610d96578592505050611343565b8063ffffffff16600a03610dae578592505050611343565b8063ffffffff16600b03610dc6578592505050611343565b8063ffffffff16600c03610dde578592505050611343565b8063ffffffff16600f03610df6578592505050611343565b8063ffffffff16601003610e0e578592505050611343565b8063ffffffff16601103610e26578592505050611343565b8063ffffffff16601203610e3e578592505050611343565b8063ffffffff16601303610e56578592505050611343565b8063ffffffff16601803610e6e578592505050611343565b8063ffffffff16601903610e86578592505050611343565b8063ffffffff16601a03610e9e578592505050611343565b8063ffffffff16601b03610eb6578592505050611343565b8063ffffffff16602003610ecf57505050828201611343565b8063ffffffff16602103610ee857505050828201611343565b8063ffffffff16602203610f0157505050818303611343565b8063ffffffff16602303610f1a57505050818303611343565b8063ffffffff16602403610f3357505050828216611343565b8063ffffffff16602503610f4c57505050828217611343565b8063ffffffff16602603610f6557505050828218611343565b8063ffffffff16602703610f7f5750505082821719611343565b8063ffffffff16602a03610fb0578460030b8660030b12610fa1576000610fa4565b60015b60ff1692505050611343565b8063ffffffff16602b03610fd8578463ffffffff168663ffffffff1610610fa1576000610fa4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e0000000000000000000000000060448201526064016108d1565b50610fd8565b8063ffffffff16601c036110c457603f8616600281900361106657505050828202611343565b8063ffffffff166020148061108157508063ffffffff166021145b1561103a578063ffffffff16602003611098579419945b60005b63800000008716156110ba576401fffffffe600197881b16960161109b565b9250611343915050565b8063ffffffff16600f036110e657505065ffffffff0000601083901b16611343565b8063ffffffff166020036111225761111a8560031660080260180363ffffffff168463ffffffff16901c60ff166008610938565b915050611343565b8063ffffffff166021036111575761111a8560021660080260100363ffffffff168463ffffffff16901c61ffff166010610938565b8063ffffffff1660220361118657505063ffffffff60086003851602811681811b198416918316901b17611343565b8063ffffffff1660230361119d5782915050611343565b8063ffffffff166024036111cf578460031660080260180363ffffffff168363ffffffff16901c60ff16915050611343565b8063ffffffff16602503611202578460021660080260100363ffffffff168363ffffffff16901c61ffff16915050611343565b8063ffffffff1660260361123457505063ffffffff60086003851602601803811681811c198416918316901c17611343565b8063ffffffff1660280361126a57505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17611343565b8063ffffffff166029036112a157505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17611343565b8063ffffffff16602a036112d057505063ffffffff60086003851602811681811c198316918416901c17611343565b8063ffffffff16602b036112e75783915050611343565b8063ffffffff16602e0361131957505063ffffffff60086003851602601803811681811b198316918416901b17611343565b8063ffffffff166030036113305782915050611343565b8063ffffffff16603803610fd857839150505b949350505050565b6000611355611caf565b506080602063ffffffff8616106113c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c696420726567697374657200000000000000000000000000000000000060448201526064016108d1565b63ffffffff8516158015906113da5750825b1561140e57838161016001518663ffffffff16602081106113fd576113fd611e69565b63ffffffff90921660209290920201525b60808101805163ffffffff8082166060850152600490910116905261066661066f565b600061143b611caf565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa036114b55781610fff81161561148457610fff811661100003015b8363ffffffff166000036114ab5760e08801805163ffffffff8382011690915295506114af565b8395505b50611927565b8563ffffffff16610fcd036114d05763400000009450611927565b8563ffffffff16611018036114e85760019450611927565b8563ffffffff166110960361151e57600161012088015260ff831661010088015261151161066f565b9998505050505050505050565b8563ffffffff16610fa30361178a5763ffffffff831615611927577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb63ffffffff8416016117445760006115798363fffffffc16600161078b565b60208901519091508060001a6001036115e857604080516000838152336020528d83526060902091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790505b6040808a015190517fe03110e10000000000000000000000000000000000000000000000000000000081526004810183905263ffffffff9091166024820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e03110e1906044016040805180830381865afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190611e98565b915091506003861680600403828110156116c5578092505b50818610156116d2578591505b8260088302610100031c9250826008828460040303021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119871617955050506117298663fffffffc16600186611b62565b60408b018051820163ffffffff169052975061178592505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd63ffffffff84160161177957809450611927565b63ffffffff9450600993505b611927565b8563ffffffff16610fa40361187b5763ffffffff8316600114806117b4575063ffffffff83166002145b806117c5575063ffffffff83166004145b156117d257809450611927565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa63ffffffff8416016117795760006118128363fffffffc16600161078b565b6020890151909150600384166004038381101561182d578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b17602088015260006040880152935083611927565b8563ffffffff16610fd703611927578163ffffffff1660030361191b5763ffffffff831615806118b1575063ffffffff83166005145b806118c2575063ffffffff83166003145b156118d05760009450611927565b63ffffffff8316600114806118eb575063ffffffff83166002145b806118fc575063ffffffff83166006145b8061190d575063ffffffff83166004145b156117795760019450611927565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b0152600401909116905261151161066f565b6000611972611caf565b506080600063ffffffff8716601003611990575060c0810151611af9565b8663ffffffff166011036119af5763ffffffff861660c0830152611af9565b8663ffffffff166012036119c8575060a0810151611af9565b8663ffffffff166013036119e75763ffffffff861660a0830152611af9565b8663ffffffff16601803611a1b5763ffffffff600387810b9087900b02602081901c821660c08501521660a0830152611af9565b8663ffffffff16601903611a4c5763ffffffff86811681871602602081901c821660c08501521660a0830152611af9565b8663ffffffff16601a03611aa2578460030b8660030b81611a6f57611a6f611ebc565b0763ffffffff1660c0830152600385810b9087900b81611a9157611a91611ebc565b0563ffffffff1660a0830152611af9565b8663ffffffff16601b03611af9578463ffffffff168663ffffffff1681611acb57611acb611ebc565b0663ffffffff90811660c084015285811690871681611aec57611aec611ebc565b0463ffffffff1660a08301525b63ffffffff841615611b3457808261016001518563ffffffff1660208110611b2357611b23611e69565b63ffffffff90921660209290920201525b60808201805163ffffffff80821660608601526004909101169052611b5761066f565b979650505050505050565b6000611b6d83611c06565b90506003841615611b7d57600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b811015611bfb5760208401933582821c6001168015611bcb5760018114611be057611bf1565b60008581526020839052604090209450611bf1565b600082815260208690526040902094505b5050600101611ba3565b505060805250505050565b60ff8116610380026101a4810190369061052401811015611ca9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f636865636b207468617420746865726520697320656e6f7567682063616c6c6460448201527f617461000000000000000000000000000000000000000000000000000000000060648201526084016108d1565b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611d15611d1a565b905290565b6040518061040001604052806020906020820280368337509192915050565b600060208083528351808285015260005b81811015611d6657858101830151858201604001528201611d4a565b81811115611d78576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f840112611dbe57600080fd5b50813567ffffffffffffffff811115611dd657600080fd5b602083019150836020828501011115611dee57600080fd5b9250929050565b600080600080600060608688031215611e0d57600080fd5b853567ffffffffffffffff80821115611e2557600080fd5b611e3189838a01611dac565b90975095506020880135915080821115611e4a57600080fd5b50611e5788828901611dac565b96999598509660400135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008060408385031215611eab57600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(MIPSStorageLayoutJSON), MIPSStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["MIPS"] = MIPSStorageLayout
-	deployedBytecodes["MIPS"] = MIPSDeployedBin
-	immutableReferences["MIPS"] = true
-}
diff --git a/op-bindings/bindings/multicall3_more.go b/op-bindings/bindings/multicall3_more.go
deleted file mode 100644
index aff7e0660fa5..000000000000
--- a/op-bindings/bindings/multicall3_more.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-var MultiCall3DeployedBin = "0x6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033"
-func init() {
-	deployedBytecodes["MultiCall3"] = MultiCall3DeployedBin
-}
diff --git a/op-bindings/bindings/multisend_v130_more.go b/op-bindings/bindings/multisend_v130_more.go
deleted file mode 100644
index 9e2c7fe41236..000000000000
--- a/op-bindings/bindings/multisend_v130_more.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-var MultiSend_v130DeployedBin = "0x60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b7f000000000000000000000000998739bfdaadde7c933b942a68053933098f9eda73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610183576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806102106030913960400191505060405180910390fd5b805160205b8181101561020a578083015160f81c6001820184015160601c6015830185015160358401860151605585018701600085600081146101cd57600181146101dd576101e8565b6000808585888a5af191506101e8565b6000808585895af491505b5060008114156101f757600080fd5b8260550187019650505050505050610188565b50505056fe4d756c746953656e642073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca26469706673582212205c784303626eec02b71940b551976170b500a8a36cc5adcbeb2c19751a76d05464736f6c63430007060033"
-func init() {
-	deployedBytecodes["MultiSend_v130"] = MultiSend_v130DeployedBin
-}
diff --git a/op-bindings/bindings/multisendcallonly_v130_more.go b/op-bindings/bindings/multisendcallonly_v130_more.go
deleted file mode 100644
index c4c91d9704f0..000000000000
--- a/op-bindings/bindings/multisendcallonly_v130_more.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-var MultiSendCallOnly_v130DeployedBin = "0x60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b805160205b8181101561015f578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811461012857600181146101385761013d565b6000808585888a5af1915061013d565b600080fd5b50600081141561014c57600080fd5b82605501870196505050505050506100e3565b50505056fea264697066735822122035246402746c96964495cae5b36461fd44dfb89f8e6cf6f6b8d60c0aa89f414864736f6c63430007060033"
-func init() {
-	deployedBytecodes["MultiSendCallOnly_v130"] = MultiSendCallOnly_v130DeployedBin
-}
diff --git a/op-bindings/bindings/optimismmintableerc20_more.go b/op-bindings/bindings/optimismmintableerc20_more.go
deleted file mode 100644
index 2a2d844f6112..000000000000
--- a/op-bindings/bindings/optimismmintableerc20_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const OptimismMintableERC20StorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/universal/OptimismMintableERC20.sol:OptimismMintableERC20\",\"label\":\"_balances\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1001,\"contract\":\"src/universal/OptimismMintableERC20.sol:OptimismMintableERC20\",\"label\":\"_allowances\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1002,\"contract\":\"src/universal/OptimismMintableERC20.sol:OptimismMintableERC20\",\"label\":\"_totalSupply\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint256\"},{\"astId\":1003,\"contract\":\"src/universal/OptimismMintableERC20.sol:OptimismMintableERC20\",\"label\":\"_name\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_string_storage\"},{\"astId\":1004,\"contract\":\"src/universal/OptimismMintableERC20.sol:OptimismMintableERC20\",\"label\":\"_symbol\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_string_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_string_storage\":{\"encoding\":\"bytes\",\"label\":\"string\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}"
-
-var OptimismMintableERC20StorageLayout = new(solc.StorageLayout)
-
-var OptimismMintableERC20DeployedBin = "0x608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e14610395578063e78cea9214610349578063ee9a31a2146103db57600080fd5b8063ae1f6aaf14610349578063c01e1bd61461036f578063d6c0b2c41461036f57600080fd5b80639dc29fac116100bd5780639dc29fac14610310578063a457c2d714610323578063a9059cbb1461033657600080fd5b806370a08231146102d257806395d89b411461030857600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461026e57806340c10f191461028157806354fd4d501461029657600080fd5b806323b872dd1461022a578063313ce5671461023d57600080fd5b806306fdde031161016057806306fdde03146101f0578063095ea7b31461020557806318160ddd1461021857600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a36600461117d565b610402565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f86104f3565b60405161019b91906111c6565b61018f610213366004611262565b610585565b6002545b60405190815260200161019b565b61018f61023836600461128c565b61059d565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161019b565b61018f61027c366004611262565b6105c1565b61029461028f366004611262565b61060d565b005b6101f86040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b61021c6102e03660046112c8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101f8610735565b61029461031e366004611262565b610744565b61018f610331366004611262565b61085b565b61018f610344366004611262565b61092c565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61021c6103a33660046112e3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806104bb57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b806104ea57507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461050290611316565b80601f016020809104026020016040519081016040528092919081815260200182805461052e90611316565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b60003361059381858561093a565b5060019392505050565b6000336105ab858285610aee565b6105b6858585610bc5565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105939082908690610608908790611398565b61093a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6106e18282610e78565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161072991815260200190565b60405180910390a25050565b60606004805461050290611316565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016106ce565b6108138282610f98565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161072991815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106ce565b6105b6828686840361093a565b600033610593818585610bc5565b73ffffffffffffffffffffffffffffffffffffffff83166109dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bbf5781811015610bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ce565b610bbf848484840361093a565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610e05908490611398565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e6b91815260200190565b60405180910390a3610bbf565b73ffffffffffffffffffffffffffffffffffffffff8216610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106ce565b8060026000828254610f079190611398565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f41908490611398565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061112d9084906113b0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610ae1565b60006020828403121561118f57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111bf57600080fd5b9392505050565b600060208083528351808285015260005b818110156111f3578581018301518582016040015282016111d7565b81811115611205576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461125d57600080fd5b919050565b6000806040838503121561127557600080fd5b61127e83611239565b946020939093013593505050565b6000806000606084860312156112a157600080fd5b6112aa84611239565b92506112b860208501611239565b9150604084013590509250925092565b6000602082840312156112da57600080fd5b6111bf82611239565b600080604083850312156112f657600080fd5b6112ff83611239565b915061130d60208401611239565b90509250929050565b600181811c9082168061132a57607f821691505b602082108103611363577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156113ab576113ab611369565b500190565b6000828210156113c2576113c2611369565b50039056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(OptimismMintableERC20StorageLayoutJSON), OptimismMintableERC20StorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["OptimismMintableERC20"] = OptimismMintableERC20StorageLayout
-	deployedBytecodes["OptimismMintableERC20"] = OptimismMintableERC20DeployedBin
-	immutableReferences["OptimismMintableERC20"] = true
-}
diff --git a/op-bindings/bindings/optimismmintableerc20factory_more.go b/op-bindings/bindings/optimismmintableerc20factory_more.go
deleted file mode 100644
index f7b09838fc41..000000000000
--- a/op-bindings/bindings/optimismmintableerc20factory_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const OptimismMintableERC20FactoryStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory\",\"label\":\"spacer_0_2_30\",\"offset\":2,\"slot\":\"0\",\"type\":\"t_bytes30\"},{\"astId\":1003,\"contract\":\"src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory\",\"label\":\"bridge\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_array(t_uint256)49_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes30\":{\"encoding\":\"inplace\",\"label\":\"bytes30\",\"numberOfBytes\":\"30\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var OptimismMintableERC20FactoryStorageLayout = new(solc.StorageLayout)
-
-var OptimismMintableERC20FactoryDeployedBin = "0x60806040523480156200001157600080fd5b5060043610620000875760003560e01c8063c4d66de81162000062578063c4d66de81462000135578063ce5ac90f146200014e578063e78cea921462000165578063ee9a31a2146200018657600080fd5b806354fd4d50146200008c578063896f93d114620000e15780638cf0629c146200011e575b600080fd5b620000c96040518060400160405280600581526020017f312e392e3000000000000000000000000000000000000000000000000000000081525081565b604051620000d8919062000635565b60405180910390f35b620000f8620000f23660046200075d565b620001a5565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620000d8565b620000f86200012f366004620007da565b620001bc565b6200014c6200014636600462000871565b620003ba565b005b620000f86200015f3660046200075d565b6200058c565b600154620000f89073ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16620000f8565b6000620001b48484846200058c565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff851662000267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d4d696e7461626c654552433230466163746f72793a206d7560448201527f73742070726f766964652072656d6f746520746f6b656e20616464726573730060648201526084015b60405180910390fd5b6000858585856040516020016200028294939291906200088f565b604051602081830303815290604052805190602001209050600081600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688888888604051620002d290620005b9565b620002e2959493929190620008e9565b8190604051809103906000f590508015801562000303573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf60405160405180910390a360405133815273ffffffffffffffffffffffffffffffffffffffff80891691908316907f52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb9060200160405180910390a39695505050505050565b600054610100900460ff1615808015620003db5750600054600160ff909116105b80620003f75750303b158015620003f7575060005460ff166001145b62000485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016200025e565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620004e457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905580156200058857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000620001b48484846012620001bc565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61178a806200094f83390190565b6000815180845260005b81811015620005ef57602081850181015186830182015201620005d1565b8181111562000602576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006200064a6020830184620005c7565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146200067657600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112620006bc57600080fd5b813567ffffffffffffffff80821115620006da57620006da6200067b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156200072357620007236200067b565b816040528381528660208588010111156200073d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156200077357600080fd5b6200077e8462000651565b9250602084013567ffffffffffffffff808211156200079c57600080fd5b620007aa87838801620006aa565b93506040860135915080821115620007c157600080fd5b50620007d086828701620006aa565b9150509250925092565b60008060008060808587031215620007f157600080fd5b620007fc8562000651565b9350602085013567ffffffffffffffff808211156200081a57600080fd5b6200082888838901620006aa565b945060408701359150808211156200083f57600080fd5b506200084e87828801620006aa565b925050606085013560ff811681146200086657600080fd5b939692955090935050565b6000602082840312156200088457600080fd5b6200064a8262000651565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000620008c06080830186620005c7565b8281036040840152620008d48186620005c7565b91505060ff8316606083015295945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526200092460a0830186620005c7565b8281036060840152620009388186620005c7565b91505060ff83166080830152969550505050505056fe60e06040523480156200001157600080fd5b506040516200178a3803806200178a833981016040819052620000349162000163565b828260036200004483826200029e565b5060046200005382826200029e565b5050506001600160a01b039384166080529390921660a052505060ff1660c0526200036a565b80516001600160a01b03811681146200009157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000be57600080fd5b81516001600160401b0380821115620000db57620000db62000096565b604051601f8301601f19908116603f0116810190828211818310171562000106576200010662000096565b816040528381526020925086838588010111156200012357600080fd5b600091505b8382101562000147578582018301518183018401529082019062000128565b83821115620001595760008385830101525b9695505050505050565b600080600080600060a086880312156200017c57600080fd5b620001878662000079565b9450620001976020870162000079565b60408701519094506001600160401b0380821115620001b557600080fd5b620001c389838a01620000ac565b94506060880151915080821115620001da57600080fd5b50620001e988828901620000ac565b925050608086015160ff811681146200020157600080fd5b809150509295509295909350565b600181811c908216806200022457607f821691505b6020821081036200024557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029957600081815260208120601f850160051c81016020861015620002745750805b601f850160051c820191505b81811015620002955782815560010162000280565b5050505b505050565b81516001600160401b03811115620002ba57620002ba62000096565b620002d281620002cb84546200020f565b846200024b565b602080601f8311600181146200030a5760008415620002f15750858301515b600019600386901b1c1916600185901b17855562000295565b600085815260208120601f198616915b828110156200033b578886015182559484019460019091019084016200031a565b50858210156200035a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c0516113d4620003b6600039600061024401526000818161034b015281816103e001528181610625015261075c0152600081816101a9015261037101526113d46000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e14610395578063e78cea9214610349578063ee9a31a2146103db57600080fd5b8063ae1f6aaf14610349578063c01e1bd61461036f578063d6c0b2c41461036f57600080fd5b80639dc29fac116100bd5780639dc29fac14610310578063a457c2d714610323578063a9059cbb1461033657600080fd5b806370a08231146102d257806395d89b411461030857600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461026e57806340c10f191461028157806354fd4d501461029657600080fd5b806323b872dd1461022a578063313ce5671461023d57600080fd5b806306fdde031161016057806306fdde03146101f0578063095ea7b31461020557806318160ddd1461021857600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a36600461117d565b610402565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f86104f3565b60405161019b91906111c6565b61018f610213366004611262565b610585565b6002545b60405190815260200161019b565b61018f61023836600461128c565b61059d565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161019b565b61018f61027c366004611262565b6105c1565b61029461028f366004611262565b61060d565b005b6101f86040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b61021c6102e03660046112c8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101f8610735565b61029461031e366004611262565b610744565b61018f610331366004611262565b61085b565b61018f610344366004611262565b61092c565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61021c6103a33660046112e3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806104bb57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b806104ea57507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461050290611316565b80601f016020809104026020016040519081016040528092919081815260200182805461052e90611316565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b60003361059381858561093a565b5060019392505050565b6000336105ab858285610aee565b6105b6858585610bc5565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105939082908690610608908790611398565b61093a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6106e18282610e78565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161072991815260200190565b60405180910390a25050565b60606004805461050290611316565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016106ce565b6108138282610f98565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161072991815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106ce565b6105b6828686840361093a565b600033610593818585610bc5565b73ffffffffffffffffffffffffffffffffffffffff83166109dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bbf5781811015610bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ce565b610bbf848484840361093a565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610e05908490611398565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e6b91815260200190565b60405180910390a3610bbf565b73ffffffffffffffffffffffffffffffffffffffff8216610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106ce565b8060026000828254610f079190611398565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f41908490611398565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061112d9084906113b0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610ae1565b60006020828403121561118f57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111bf57600080fd5b9392505050565b600060208083528351808285015260005b818110156111f3578581018301518582016040015282016111d7565b81811115611205576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461125d57600080fd5b919050565b6000806040838503121561127557600080fd5b61127e83611239565b946020939093013593505050565b6000806000606084860312156112a157600080fd5b6112aa84611239565b92506112b860208501611239565b9150604084013590509250925092565b6000602082840312156112da57600080fd5b6111bf82611239565b600080604083850312156112f657600080fd5b6112ff83611239565b915061130d60208401611239565b90509250929050565b600181811c9082168061132a57607f821691505b602082108103611363577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156113ab576113ab611369565b500190565b6000828210156113c2576113c2611369565b50039056fea164736f6c634300080f000aa164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(OptimismMintableERC20FactoryStorageLayoutJSON), OptimismMintableERC20FactoryStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["OptimismMintableERC20Factory"] = OptimismMintableERC20FactoryStorageLayout
-	deployedBytecodes["OptimismMintableERC20Factory"] = OptimismMintableERC20FactoryDeployedBin
-	immutableReferences["OptimismMintableERC20Factory"] = false
-}
diff --git a/op-bindings/bindings/optimismmintableerc721factory_more.go b/op-bindings/bindings/optimismmintableerc721factory_more.go
deleted file mode 100644
index 92db3f22ab30..000000000000
--- a/op-bindings/bindings/optimismmintableerc721factory_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const OptimismMintableERC721FactoryStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/universal/OptimismMintableERC721Factory.sol:OptimismMintableERC721Factory\",\"label\":\"isOptimismMintableERC721\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_address,t_bool)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_mapping(t_address,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_bool\"}}}"
-
-var OptimismMintableERC721FactoryStorageLayout = new(solc.StorageLayout)
-
-var OptimismMintableERC721FactoryDeployedBin = "0x60806040523480156200001157600080fd5b50600436106200006f5760003560e01c80637d1d0c5b11620000565780637d1d0c5b1462000100578063d97df6521462000137578063ee9a31a2146200017457600080fd5b806354fd4d5014620000745780635572acae14620000c9575b600080fd5b620000b16040518060400160405280600581526020017f312e342e3000000000000000000000000000000000000000000000000000000081525081565b604051620000c0919062000435565b60405180910390f35b620000ef620000da3660046200047b565b60006020819052908152604090205460ff1681565b6040519015158152602001620000c0565b620001287f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001620000c0565b6200014e620001483660046200057b565b6200019c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620000c0565b6200014e7f000000000000000000000000000000000000000000000000000000000000000081565b600073ffffffffffffffffffffffffffffffffffffffff84166200026d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4f7074696d69736d4d696e7461626c65455243373231466163746f72793a204c908201527f3120746f6b656e20616464726573732063616e6e6f742062652061646472657360648201527f7328302900000000000000000000000000000000000000000000000000000000608482015260a40160405180910390fd5b60008484846040516020016200028693929190620005f8565b6040516020818303038152906040528051906020012090506000817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000888888604051620002f490620003b9565b6200030495949392919062000647565b8190604051809103906000f590508015801562000325573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff8181166000818152602081815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590513381529394509189169290917fe72783bb8e0ca31286b85278da59684dd814df9762a52f0837f89edd1483b299910160405180910390a395945050505050565b6131bf80620006a983390190565b6000815180845260005b81811015620003ef57602081850181015186830182015201620003d1565b8181111562000402576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006200044a6020830184620003c7565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146200047657600080fd5b919050565b6000602082840312156200048e57600080fd5b6200044a8262000451565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112620004da57600080fd5b813567ffffffffffffffff80821115620004f857620004f862000499565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171562000541576200054162000499565b816040528381528660208588010111156200055b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156200059157600080fd5b6200059c8462000451565b9250602084013567ffffffffffffffff80821115620005ba57600080fd5b620005c887838801620004c8565b93506040860135915080821115620005df57600080fd5b50620005ee86828701620004c8565b9150509250925092565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000620006296060830185620003c7565b82810360408401526200063d8185620003c7565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835286602084015280861660408401525060a060608301526200068860a0830185620003c7565b82810360808401526200069c8185620003c7565b9897505050505050505056fe60e06040523480156200001157600080fd5b50604051620031bf380380620031bf83398101604081905262000034916200062d565b8181600062000044838262000756565b50600162000053828262000756565b5050506001600160a01b038516620000d85760405162461bcd60e51b815260206004820152603360248201527f4f7074696d69736d4d696e7461626c654552433732313a20627269646765206360448201527f616e6e6f7420626520616464726573732830290000000000000000000000000060648201526084015b60405180910390fd5b83600003620001505760405162461bcd60e51b815260206004820152603660248201527f4f7074696d69736d4d696e7461626c654552433732313a2072656d6f7465206360448201527f6861696e2069642063616e6e6f74206265207a65726f000000000000000000006064820152608401620000cf565b6001600160a01b038316620001ce5760405162461bcd60e51b815260206004820152603960248201527f4f7074696d69736d4d696e7461626c654552433732313a2072656d6f7465207460448201527f6f6b656e2063616e6e6f742062652061646472657373283029000000000000006064820152608401620000cf565b60808490526001600160a01b0383811660a081905290861660c0526200020290601462000256602090811b62000eed17901c565b62000218856200041660201b620011301760201c565b6040516020016200022b92919062000822565b604051602081830303815290604052600a90816200024a919062000756565b50505050505062000993565b6060600062000267836002620008ac565b62000274906002620008ce565b6001600160401b038111156200028e576200028e62000553565b6040519080825280601f01601f191660200182016040528015620002b9576020820181803683370190505b509050600360fc1b81600081518110620002d757620002d7620008e9565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110620003095762000309620008e9565b60200101906001600160f81b031916908160001a90535060006200032f846002620008ac565b6200033c906001620008ce565b90505b6001811115620003be576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620003745762000374620008e9565b1a60f81b8282815181106200038d576200038d620008e9565b60200101906001600160f81b031916908160001a90535060049490941c93620003b681620008ff565b90506200033f565b5083156200040f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620000cf565b9392505050565b6060816000036200043e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156200046e5780620004558162000919565b9150620004669050600a836200094b565b915062000442565b6000816001600160401b038111156200048b576200048b62000553565b6040519080825280601f01601f191660200182016040528015620004b6576020820181803683370190505b5090505b84156200052e57620004ce60018362000962565b9150620004dd600a866200097c565b620004ea906030620008ce565b60f81b818381518110620005025762000502620008e9565b60200101906001600160f81b031916908160001a90535062000526600a866200094b565b9450620004ba565b949350505050565b80516001600160a01b03811681146200054e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620005865781810151838201526020016200056c565b8381111562000596576000848401525b50505050565b600082601f830112620005ae57600080fd5b81516001600160401b0380821115620005cb57620005cb62000553565b604051601f8301601f19908116603f01168101908282118183101715620005f657620005f662000553565b816040528381528660208588010111156200061057600080fd5b6200062384602083016020890162000569565b9695505050505050565b600080600080600060a086880312156200064657600080fd5b620006518662000536565b945060208601519350620006686040870162000536565b60608701519093506001600160401b03808211156200068657600080fd5b6200069489838a016200059c565b93506080880151915080821115620006ab57600080fd5b50620006ba888289016200059c565b9150509295509295909350565b600181811c90821680620006dc57607f821691505b602082108103620006fd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200075157600081815260208120601f850160051c810160208610156200072c5750805b601f850160051c820191505b818110156200074d5782815560010162000738565b5050505b505050565b81516001600160401b0381111562000772576200077262000553565b6200078a81620007838454620006c7565b8462000703565b602080601f831160018114620007c25760008415620007a95750858301515b600019600386901b1c1916600185901b1785556200074d565b600085815260208120601f198616915b82811015620007f357888601518255948401946001909101908401620007d2565b5085821015620008125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6832ba3432b932bab69d60b91b8152600083516200084881600985016020880162000569565b600160fe1b60099184019182015283516200086b81600a84016020880162000569565b712f746f6b656e5552493f75696e743235363d60701b600a9290910191820152601c01949350505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620008c957620008c962000896565b500290565b60008219821115620008e457620008e462000896565b500190565b634e487b7160e01b600052603260045260246000fd5b60008162000911576200091162000896565b506000190190565b6000600182016200092e576200092e62000896565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826200095d576200095d62000935565b500490565b60008282101562000977576200097762000896565b500390565b6000826200098e576200098e62000935565b500690565b60805160a05160c0516127d9620009e6600039600081816103e20152818161047a01528181610b210152610c430152600081816101e001526103bc015260008181610329015261040801526127d96000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80637d1d0c5b116100ee578063c87b56dd11610097578063e78cea9211610071578063e78cea92146103e0578063e951819614610406578063e985e9c51461042c578063ee9a31a21461047557600080fd5b8063c87b56dd1461039f578063d547cfb7146103b2578063d6c0b2c4146103ba57600080fd5b8063a1448194116100c8578063a144819414610366578063a22cb46514610379578063b88d4fde1461038c57600080fd5b80637d1d0c5b1461032457806395d89b411461034b5780639dc29fac1461035357600080fd5b806323b872dd1161015b5780634f6ccce7116101355780634f6ccce7146102af57806354fd4d50146102c25780636352211e146102fe57806370a082311461031157600080fd5b806323b872dd146102765780632f745c591461028957806342842e0e1461029c57600080fd5b8063081812fc1161018c578063081812fc1461023c578063095ea7b31461024f57806318160ddd1461026457600080fd5b806301ffc9a7146101b3578063033964be146101db57806306fdde0314610227575b600080fd5b6101c66101c1366004612226565b61049c565b60405190151581526020015b60405180910390f35b6102027f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b61022f6104fa565b6040516101d291906122b9565b61020261024a3660046122cc565b61058c565b61026261025d36600461230e565b6105c0565b005b6008545b6040519081526020016101d2565b610262610284366004612338565b610751565b61026861029736600461230e565b6107f2565b6102626102aa366004612338565b6108c1565b6102686102bd3660046122cc565b6108dc565b61022f6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b61020261030c3660046122cc565b61099a565b61026861031f366004612374565b610a2c565b6102687f000000000000000000000000000000000000000000000000000000000000000081565b61022f610afa565b61026261036136600461230e565b610b09565b61026261037436600461230e565b610c2b565b61026261038736600461238f565b610d42565b61026261039a3660046123fa565b610d51565b61022f6103ad3660046122cc565b610df9565b61022f610e5f565b7f0000000000000000000000000000000000000000000000000000000000000000610202565b7f0000000000000000000000000000000000000000000000000000000000000000610202565b7f0000000000000000000000000000000000000000000000000000000000000000610268565b6101c661043a3660046124f4565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102027f000000000000000000000000000000000000000000000000000000000000000081565b60007f74259ebf000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083168114806104f357506104f38361126d565b9392505050565b60606000805461050990612527565b80601f016020809104026020016040519081016040528092919081815260200182805461053590612527565b80156105825780601f1061055757610100808354040283529160200191610582565b820191906000526020600020905b81548152906001019060200180831161056557829003601f168201915b5050505050905090565b6000610597826112c3565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006105cb8261099a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361068d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806106b657506106b6813361043a565b610742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610684565b61074c8383611351565b505050565b61075b33826113f1565b6107e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610684565b61074c8383836114b0565b60006107fd83610a2c565b821061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610684565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b61074c83838360405180602001604052806000815250610d51565b60006108e760085490565b8210610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610684565b600882815481106109885761098861257a565b90600052602060002001549050919050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610a26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610684565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8216610ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610684565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60606001805461050990612527565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610bce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d4d696e7461626c654552433732313a206f6e6c792062726960448201527f6467652063616e2063616c6c20746869732066756e6374696f6e0000000000006064820152608401610684565b610bd781611722565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca582604051610c1f91815260200190565b60405180910390a25050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610cf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d4d696e7461626c654552433732313a206f6e6c792062726960448201527f6467652063616e2063616c6c20746869732066756e6374696f6e0000000000006064820152608401610684565b610cfa82826117fb565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610c1f91815260200190565b610d4d338383611815565b5050565b610d5b33836113f1565b610de7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610684565b610df384848484611942565b50505050565b6060610e04826112c3565b6000610e0e6119e5565b90506000815111610e2e57604051806020016040528060008152506104f3565b80610e3884611130565b604051602001610e499291906125a9565b6040516020818303038152906040529392505050565b600a8054610e6c90612527565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9890612527565b8015610ee55780601f10610eba57610100808354040283529160200191610ee5565b820191906000526020600020905b815481529060010190602001808311610ec857829003601f168201915b505050505081565b60606000610efc836002612607565b610f07906002612644565b67ffffffffffffffff811115610f1f57610f1f6123cb565b6040519080825280601f01601f191660200182016040528015610f49576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110610f8057610f8061257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110610fe357610fe361257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061101f846002612607565b61102a906001612644565b90505b60018111156110c7577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061106b5761106b61257a565b1a60f81b8282815181106110815761108161257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936110c08161265c565b905061102d565b5083156104f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610684565b60608160000361117357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561119d578061118781612691565b91506111969050600a836126f8565b9150611177565b60008167ffffffffffffffff8111156111b8576111b86123cb565b6040519080825280601f01601f1916602001820160405280156111e2576020820181803683370190505b5090505b8415611265576111f760018361270c565b9150611204600a86612723565b61120f906030612644565b60f81b8183815181106112245761122461257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061125e600a866126f8565b94506111e6565b949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610a265750610a26826119f4565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1661134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610684565b50565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906113ab8261099a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806113fd8361099a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061146b575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b8061126557508373ffffffffffffffffffffffffffffffffffffffff166114918461058c565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b8273ffffffffffffffffffffffffffffffffffffffff166114d08261099a565b73ffffffffffffffffffffffffffffffffffffffff1614611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610684565b73ffffffffffffffffffffffffffffffffffffffff8216611615576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610684565b611620838383611ad7565b61162b600082611351565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546001929061166190849061270c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061169c908490612644565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061172d8261099a565b905061173b81600084611ad7565b611746600083611351565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080546001929061177c90849061270c565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555183919073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b610d4d828260405180602001604052806000815250611bdd565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610684565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61194d8484846114b0565b61195984848484611c80565b610df3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610684565b6060600a805461050990612527565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611a8757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610a2657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610a26565b73ffffffffffffffffffffffffffffffffffffffff8316611b3f57611b3a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611b7c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611b7c57611b7c8382611e73565b73ffffffffffffffffffffffffffffffffffffffff8216611ba05761074c81611f2a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461074c5761074c8282611fd9565b611be7838361202a565b611bf46000848484611c80565b61074c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610684565b600073ffffffffffffffffffffffffffffffffffffffff84163b15611e68576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611cf7903390899088908890600401612737565b6020604051808303816000875af1925050508015611d50575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611d4d91810190612780565b60015b611e1d573d808015611d7e576040519150601f19603f3d011682016040523d82523d6000602084013e611d83565b606091505b508051600003611e15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610684565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611265565b506001949350505050565b60006001611e8084610a2c565b611e8a919061270c565b600083815260076020526040902054909150808214611eea5773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b600854600090611f3c9060019061270c565b60008381526009602052604081205460088054939450909284908110611f6457611f6461257a565b906000526020600020015490508060088381548110611f8557611f8561257a565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611fbd57611fbd61279d565b6001900381819060005260206000200160009055905550505050565b6000611fe483610a2c565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b73ffffffffffffffffffffffffffffffffffffffff82166120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610684565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610684565b61213f60008383611ad7565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290612175908490612644565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461134e57600080fd5b60006020828403121561223857600080fd5b81356104f3816121f8565b60005b8381101561225e578181015183820152602001612246565b83811115610df35750506000910152565b60008151808452612287816020860160208601612243565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f3602083018461226f565b6000602082840312156122de57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461230957600080fd5b919050565b6000806040838503121561232157600080fd5b61232a836122e5565b946020939093013593505050565b60008060006060848603121561234d57600080fd5b612356846122e5565b9250612364602085016122e5565b9150604084013590509250925092565b60006020828403121561238657600080fd5b6104f3826122e5565b600080604083850312156123a257600080fd5b6123ab836122e5565b9150602083013580151581146123c057600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561241057600080fd5b612419856122e5565b9350612427602086016122e5565b925060408501359150606085013567ffffffffffffffff8082111561244b57600080fd5b818701915087601f83011261245f57600080fd5b813581811115612471576124716123cb565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156124b7576124b76123cb565b816040528281528a60208487010111156124d057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561250757600080fd5b612510836122e5565b915061251e602084016122e5565b90509250929050565b600181811c9082168061253b57607f821691505b602082108103612574577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600083516125bb818460208801612243565b8351908301906125cf818360208801612243565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561263f5761263f6125d8565b500290565b60008219821115612657576126576125d8565b500190565b60008161266b5761266b6125d8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126c2576126c26125d8565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612707576127076126c9565b500490565b60008282101561271e5761271e6125d8565b500390565b600082612732576127326126c9565b500690565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612776608083018461226f565b9695505050505050565b60006020828403121561279257600080fd5b81516104f3816121f8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c634300080f000aa164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(OptimismMintableERC721FactoryStorageLayoutJSON), OptimismMintableERC721FactoryStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["OptimismMintableERC721Factory"] = OptimismMintableERC721FactoryStorageLayout
-	deployedBytecodes["OptimismMintableERC721Factory"] = OptimismMintableERC721FactoryDeployedBin
-	immutableReferences["OptimismMintableERC721Factory"] = true
-}
diff --git a/op-bindings/bindings/optimismportal_more.go b/op-bindings/bindings/optimismportal_more.go
deleted file mode 100644
index 7610e608c68a..000000000000
--- a/op-bindings/bindings/optimismportal_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const OptimismPortalStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"params\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_struct(ResourceParams)1015_storage\"},{\"astId\":1003,\"contract\":\"src/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_array(t_uint256)48_storage\"},{\"astId\":1004,\"contract\":\"src/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"l2Sender\",\"offset\":0,\"slot\":\"50\",\"type\":\"t_address\"},{\"astId\":1005,\"contract\":\"src/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"finalizedWithdrawals\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1006,\"contract\":\"src/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"provenWithdrawals\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_mapping(t_bytes32,t_struct(ProvenWithdrawal)1014_storage)\"},{\"astId\":1007,\"contract\":\"src/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"spacer_53_0_1\",\"offset\":0,\"slot\":\"53\",\"type\":\"t_bool\"},{\"astId\":1008,\"contract\":\"src/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"superchainConfig\",\"offset\":1,\"slot\":\"53\",\"type\":\"t_contract(SuperchainConfig)1012\"},{\"astId\":1009,\"contract\":\"src/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"l2Oracle\",\"offset\":0,\"slot\":\"54\",\"type\":\"t_contract(L2OutputOracle)1011\"},{\"astId\":1010,\"contract\":\"src/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"systemConfig\",\"offset\":0,\"slot\":\"55\",\"type\":\"t_contract(SystemConfig)1013\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)48_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[48]\",\"numberOfBytes\":\"1536\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_contract(L2OutputOracle)1011\":{\"encoding\":\"inplace\",\"label\":\"contract L2OutputOracle\",\"numberOfBytes\":\"20\"},\"t_contract(SuperchainConfig)1012\":{\"encoding\":\"inplace\",\"label\":\"contract SuperchainConfig\",\"numberOfBytes\":\"20\"},\"t_contract(SystemConfig)1013\":{\"encoding\":\"inplace\",\"label\":\"contract SystemConfig\",\"numberOfBytes\":\"20\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_bytes32,t_struct(ProvenWithdrawal)1014_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e struct OptimismPortal.ProvenWithdrawal)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_struct(ProvenWithdrawal)1014_storage\"},\"t_struct(ProvenWithdrawal)1014_storage\":{\"encoding\":\"inplace\",\"label\":\"struct OptimismPortal.ProvenWithdrawal\",\"numberOfBytes\":\"64\"},\"t_struct(ResourceParams)1015_storage\":{\"encoding\":\"inplace\",\"label\":\"struct ResourceMetering.ResourceParams\",\"numberOfBytes\":\"32\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var OptimismPortalStorageLayout = new(solc.StorageLayout)
-
-var OptimismPortalDeployedBin = "0x6080604052600436106101625760003560e01c80638c3152e9116100c0578063c0c53b8b11610074578063e965084c11610059578063e965084c146104c7578063e9e05c4214610553578063f04987501461056657600080fd5b8063c0c53b8b14610406578063cff0ab961461042657600080fd5b80639bf62d82116100a55780639bf62d8214610370578063a14238e71461039d578063a35d99df146103cd57600080fd5b80638c3152e9146103235780639b5f694a1461034357600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102ee578063724c184c1461030e5780638b4c40b01461018757600080fd5b806354fd4d50146102735780635c975abb146102c957600080fd5b806335e80ab31161014857806335e80ab31461020c578063452a93201461023e5780634870496f1461025357600080fd5b80621c2ff61461018e57806333d7e2bd146101df57600080fd5b36610189576101873334620186a0600060405180602001604052806000815250610591565b005b600080fd5b34801561019a57600080fd5b5060365473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101eb57600080fd5b506037546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021857600080fd5b506035546101b590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024a57600080fd5b506101b561082c565b34801561025f57600080fd5b5061018761026e3660046149b4565b6108c4565b34801561027f57600080fd5b506102bc6040518060400160405280600581526020017f322e352e3000000000000000000000000000000000000000000000000000000081525081565b6040516101d69190614b06565b3480156102d557600080fd5b506102de610ef2565b60405190151581526020016101d6565b3480156102fa57600080fd5b506102de610309366004614b19565b610f85565b34801561031a57600080fd5b506101b5611040565b34801561032f57600080fd5b5061018761033e366004614b32565b61104c565b34801561034f57600080fd5b506036546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037c57600080fd5b506032546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a957600080fd5b506102de6103b8366004614b19565b60336020526000908152604090205460ff1681565b3480156103d957600080fd5b506103ed6103e8366004614b8c565b61190d565b60405167ffffffffffffffff90911681526020016101d6565b34801561041257600080fd5b50610187610421366004614ba7565b611926565b34801561043257600080fd5b5060015461048e906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101d6565b3480156104d357600080fd5b506105256104e2366004614b19565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101d6565b610187610561366004614c00565b610591565b34801561057257600080fd5b5060375473ffffffffffffffffffffffffffffffffffffffff166101b5565b8260005a905083156106485773ffffffffffffffffffffffffffffffffffffffff87161561064857604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b610652835161190d565b67ffffffffffffffff168567ffffffffffffffff1610156106f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4f7074696d69736d506f7274616c3a20676173206c696d697420746f6f20736d60448201527f616c6c0000000000000000000000000000000000000000000000000000000000606482015260840161063f565b6201d4c083511115610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f7074696d69736d506f7274616c3a206461746120746f6f206c617267650000604482015260640161063f565b33328114610784575033731111000000000000000000000000000000001111015b6000348888888860405160200161079f959493929190614c7d565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161080f9190614b06565b60405180910390a450506108238282611b90565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa15801561089b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190614ce2565b905090565b6108cc610ef2565b15610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161063f565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e747261637400606482015260840161063f565b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614d1f565b519050610aa0610a9b36869003860186614d84565b611ebd565b8114610b2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f660000000000000000000000000000000000000000000000606482015260840161063f565b6000610b3987611f19565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c4f5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4b9190614d1f565b5114155b610cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e000000000000000000606482015260840161063f565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610da49101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d9a888a614dea565b8a60400135611f49565b610e30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f660000000000000000000000000000606482015260840161063f565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f61573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190614e6e565b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810183905260009161103a9173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f9190614d1f565b602001516fffffffffffffffffffffffffffffffff16611f6d565b92915050565b60006108bf61082c565b565b611054610ef2565b156110bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161063f565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e00606482015260840161063f565b600061116f82611f19565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e207965740000000000000000000000000000606482015260840161063f565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112eb9190614e8b565b81602001516fffffffffffffffffffffffffffffffff1610156113b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a40161063f565b6113d581602001516fffffffffffffffffffffffffffffffff16611f6d565b611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a40161063f565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561150e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115329190614d1f565b82518151919250146115ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a40161063f565b61160b81602001516fffffffffffffffffffffffffffffffff16611f6d565b6116bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a40161063f565b60008381526033602052604090205460ff161561175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a65640000000000000000000000606482015260840161063f565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a08801516117fe93929190612013565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061186390841515815260200190565b60405180910390a2801580156118795750326001145b15611906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a207769746864726177616c206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161063f565b5050505050565b600061191a826010614ed3565b61103a90615208614f03565b600054610100900460ff16158080156119465750600054600160ff909116105b806119605750303b158015611960575060005460ff166001145b6119ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161063f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611a4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611b0357603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611b0b612071565b8015611b6e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611bc6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614f2f565b90506000611bd2612184565b90506000816020015160ff16826000015163ffffffff16611bf39190614f75565b90508215611d2a57600154600090611c2a908390700100000000000000000000000000000000900467ffffffffffffffff16614fdd565b90506000836040015160ff1683611c419190615051565b600154611c619084906fffffffffffffffffffffffffffffffff16615051565b611c6b9190614f75565b600154909150600090611cbc90611c959084906fffffffffffffffffffffffffffffffff1661510d565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612245565b90506001861115611ceb57611ce8611c9582876040015160ff1660018a611ce39190614f2f565b612264565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611d5d908490700100000000000000000000000000000000900467ffffffffffffffff16614f03565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d69740000606482015260840161063f565b600154600090611e6c906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615181565b90506000611e7e48633b9aca006122b9565b611e8890836151be565b905060005a611e979088614f2f565b905080821115611eb357611eb3611eae8284614f2f565b6122d0565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611efc949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611efc9790969591016151d2565b600080611f55866122fe565b9050611f6381868686612330565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120019190614e8b565b61200b9083615229565b421192915050565b6000806000612023866000612360565b905080612059576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16612108576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161063f565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660000361104a5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612221573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190615266565b600061225a612254858561237e565b8361238e565b90505b9392505050565b6000670de0b6b3a76400006122a561227c8583614f75565b61228e90670de0b6b3a7640000614fdd565b6122a085670de0b6b3a7640000615051565b61239d565b6122af9086615051565b61225a9190614f75565b6000818310156122c9578161225d565b5090919050565b6000805a90505b825a6122e39083614f2f565b10156122f9576122f282615305565b91506122d7565b505050565b6060818051906020012060405160200161231a91815260200190565b6040516020818303038152906040529050919050565b6000612357846123418786866123ce565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156122c9578161225d565b60008183126122c9578161225d565b600061225d670de0b6b3a7640000836123b586612e4c565b6123bf9190615051565b6123c99190614f75565b613090565b6060600084511161243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b65790000000000000000000000604482015260640161063f565b6000612446846132cf565b90506000612453866133bb565b905060008460405160200161246a91815260200190565b60405160208183030381529060405290506000805b8451811015612dc357600085828151811061249c5761249c61533d565b602002602001015190508451831115612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e677468000000000000000000000000000000000000606482015260840161063f565b826000036125f057805180516020918201206040516125859261255f92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6125eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f742068617368000000604482015260640161063f565b612747565b8051516020116126a6578051805160209182012060405161261a9261255f92910190815260200190565b6125eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c206861736800000000000000000000000000000000000000000000000000606482015260840161063f565b805184516020808701919091208251919092012014612747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f6520686173680000000000000000000000000000000000000000000000000000606482015260840161063f565b61275360106001615229565b8160200151510361292f57845183036128c75761278d81602001516010815181106127805761278061533d565b602002602001015161341e565b96506000875111612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e6368290000000000606482015260840161063f565b6001865161282e9190614f2f565b82146128bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e636829000000000000606482015260840161063f565b50505050505061225d565b60008584815181106128db576128db61533d565b602001015160f81c60f81b60f81c9050600082602001518260ff16815181106129065761290661533d565b602002602001015190506129198161357e565b9550612926600186615229565b94505050612db0565b600281602001515103612d28576000612947826135a3565b905060008160008151811061295e5761295e61533d565b016020015160f81c9050600061297560028361536c565b61298090600261538e565b90506000612991848360ff166135c7565b9050600061299f8a896135c7565b905060006129ad83836135fd565b905080835114612a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b6579000000000000606482015260840161063f565b60ff851660021480612a54575060ff85166003145b15612c435780825114612ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e646572000000606482015260840161063f565b612b0387602001516001815181106127805761278061533d565b9c5060008d5111612b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c6561662900000000000000606482015260840161063f565b60018c51612ba49190614f2f565b8814612c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c656166290000000000000000606482015260840161063f565b50505050505050505050505061225d565b60ff85161580612c56575060ff85166001145b15612c9557612c828760200151600181518110612c7557612c7561533d565b602002602001015161357e565b9950612c8e818a615229565b9850612d1d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e207072656669780000000000000000000000000000606482015260840161063f565b505050505050612db0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f6465000000000000000000000000000000000000000000000000606482015260840161063f565b5080612dbb81615305565b91505061247f565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e7473000000000000000000000000000000000000000000000000000000606482015260840161063f565b6000808213612eb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161063f565b60006060612ec4846136b1565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136130c157506000919050565b680755bf798b4a1bf1e58212613133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f570000000000000000000000000000000000000000604482015260640161063f565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156132ed576132ed6147d4565b60405190808252806020026020018201604052801561333257816020015b604080518082019091526060808252602082015281526020019060019003908161330b5790505b50915060005b818110156133b457604051806040016040528085838151811061335d5761335d61533d565b6020026020010151815260200161338c86848151811061337f5761337f61533d565b6020026020010151613787565b8152508382815181106133a1576133a161533d565b6020908102919091010152600101613338565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613413578060011b82018184015160001a8060041c8253600f8116600183015350506001016133e5565b509295945050505050565b6060600080600061342e8561379a565b919450925090506000816001811115613449576134496153b1565b146134d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d00000000000000606482015260840161063f565b6134e08284615229565b85511461356f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e646572000000000000000000000000606482015260840161063f565b61235785602001518484614207565b6060602082600001511061359a576135958261341e565b61103a565b61103a8261429b565b606061103a6135c283602001516000815181106127805761278061533d565b6133bb565b6060825182106135e6575060408051602081019091526000815261103a565b61225d83838486516135f89190614f2f565b6142b1565b6000808251845110613610578251613613565b83515b90505b808210801561369a57508282815181106136325761363261533d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106136715761367161533d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156136aa57816001019150613616565b5092915050565b600080821161371c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161063f565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606061103a61379583614489565b614572565b600080600080846000015111613858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161063f565b6020840151805160001a607f811161387d576000600160009450945094505050614200565b60b78111613a8b576000613892608083614f2f565b90508087600001511161394d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a40161063f565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806139c657507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a40161063f565b5060019550935060009250614200915050565b60bf8111613dd9576000613aa060b783614f2f565b905080876000015111613b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a40161063f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613c39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a40161063f565b600184015160088302610100031c60378111613cfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a40161063f565b613d078184615229565b895111613dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a40161063f565b613dc7836001615229565b97509550600094506142009350505050565b60f78111613eba576000613dee60c083614f2f565b905080876000015111613ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a40161063f565b600195509350849250614200915050565b6000613ec760f783614f2f565b905080876000015111613f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a40161063f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a40161063f565b600184015160088302610100031c60378111614124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a40161063f565b61412e8184615229565b8951116141e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a40161063f565b6141ee836001615229565b97509550600194506142009350505050565b9193909250565b60608167ffffffffffffffff811115614222576142226147d4565b6040519080825280601f01601f19166020018201604052801561424c576020820181803683370190505b509050811561225d5760006142618486615229565b90506020820160005b8481101561428257828101518282015260200161426a565b84811115614291576000858301525b5050509392505050565b606061103a826020015160008460000151614207565b60608182601f011015614320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161063f565b82828401101561438c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161063f565b818301845110156143f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161063f565b6060821580156144185760405191506000825260208201604052614480565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614451578051835260209283019201614439565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161063f565b50604080518082019091528151815260209182019181019190915290565b606060008060006145828561379a565b91945092509050600181600181111561459d5761459d6153b1565b1461462a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d0000000000000000606482015260840161063f565b84516146368385615229565b146146c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e6465720000000000000000000000000000606482015260840161063f565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816146da5790505093506000835b86518110156147c85760008061474d6040518060400160405280858c600001516147319190614f2f565b8152602001858c602001516147469190615229565b905261379a565b5091509150604051806040016040528083836147699190615229565b8152602001848b6020015161477e9190615229565b8152508885815181106147935761479361533d565b60209081029190910101526147a9600185615229565b93506147b58183615229565b6147bf9084615229565b92505050614707565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561484a5761484a6147d4565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461487457600080fd5b50565b600082601f83011261488857600080fd5b813567ffffffffffffffff8111156148a2576148a26147d4565b6148d360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614803565b8181528460208386010111156148e857600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561491757600080fd5b60405160c0810167ffffffffffffffff828210818311171561493b5761493b6147d4565b81604052829350843583526020850135915061495682614852565b8160208401526040850135915061496c82614852565b816040840152606085013560608401526080850135608084015260a085013591508082111561499a57600080fd5b506149a785828601614877565b60a0830152505092915050565b600080600080600085870360e08112156149cd57600080fd5b863567ffffffffffffffff808211156149e557600080fd5b6149f18a838b01614905565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614a2a57600080fd5b60408901955060c0890135925080831115614a4457600080fd5b828901925089601f840112614a5857600080fd5b8235915080821115614a6957600080fd5b508860208260051b8401011115614a7f57600080fd5b959894975092955050506020019190565b60005b83811015614aab578181015183820152602001614a93565b83811115611b6e5750506000910152565b60008151808452614ad4816020860160208601614a90565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061225d6020830184614abc565b600060208284031215614b2b57600080fd5b5035919050565b600060208284031215614b4457600080fd5b813567ffffffffffffffff811115614b5b57600080fd5b614b6784828501614905565b949350505050565b803567ffffffffffffffff81168114614b8757600080fd5b919050565b600060208284031215614b9e57600080fd5b61225d82614b6f565b600080600060608486031215614bbc57600080fd5b8335614bc781614852565b92506020840135614bd781614852565b91506040840135614be781614852565b809150509250925092565b801515811461487457600080fd5b600080600080600060a08688031215614c1857600080fd5b8535614c2381614852565b945060208601359350614c3860408701614b6f565b92506060860135614c4881614bf2565b9150608086013567ffffffffffffffff811115614c6457600080fd5b614c7088828901614877565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614cd1816049850160208701614a90565b919091016049019695505050505050565b600060208284031215614cf457600080fd5b815161225d81614852565b80516fffffffffffffffffffffffffffffffff81168114614b8757600080fd5b600060608284031215614d3157600080fd5b6040516060810181811067ffffffffffffffff82111715614d5457614d546147d4565b60405282518152614d6760208401614cff565b6020820152614d7860408401614cff565b60408201529392505050565b600060808284031215614d9657600080fd5b6040516080810181811067ffffffffffffffff82111715614db957614db96147d4565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614e0557614e056147d4565b8360051b6020614e16818301614803565b868152918501918181019036841115614e2e57600080fd5b865b84811015614e6257803586811115614e485760008081fd5b614e5436828b01614877565b845250918301918301614e30565b50979650505050505050565b600060208284031215614e8057600080fd5b815161225d81614bf2565b600060208284031215614e9d57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614efa57614efa614ea4565b02949350505050565b600067ffffffffffffffff808316818516808303821115614f2657614f26614ea4565b01949350505050565b600082821015614f4157614f41614ea4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614f8457614f84614f46565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614fd857614fd8614ea4565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561501757615017614ea4565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561504b5761504b614ea4565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561509257615092614ea4565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156150cd576150cd614ea4565b600087129250878205871284841616156150e9576150e9614ea4565b878505871281841616156150ff576150ff614ea4565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561514757615147614ea4565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561517b5761517b614ea4565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151b9576151b9614ea4565b500290565b6000826151cd576151cd614f46565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261521d60c0830184614abc565b98975050505050505050565b6000821982111561523c5761523c614ea4565b500190565b805163ffffffff81168114614b8757600080fd5b805160ff81168114614b8757600080fd5b600060c0828403121561527857600080fd5b60405160c0810181811067ffffffffffffffff8211171561529b5761529b6147d4565b6040526152a783615241565b81526152b560208401615255565b60208201526152c660408401615255565b60408201526152d760608401615241565b60608201526152e860808401615241565b60808201526152f960a08401614cff565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361533657615336614ea4565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff83168061537f5761537f614f46565b8060ff84160691505092915050565b600060ff821660ff8416808210156153a8576153a8614ea4565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(OptimismPortalStorageLayoutJSON), OptimismPortalStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["OptimismPortal"] = OptimismPortalStorageLayout
-	deployedBytecodes["OptimismPortal"] = OptimismPortalDeployedBin
-	immutableReferences["OptimismPortal"] = false
-}
diff --git a/op-bindings/bindings/permit2_more.go b/op-bindings/bindings/permit2_more.go
deleted file mode 100644
index 844bac8f9fae..000000000000
--- a/op-bindings/bindings/permit2_more.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-var Permit2InitBin = "60c0346100bb574660a052602081017f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a60408301524660608301523060808301526080825260a082019180831060018060401b038411176100a557826040525190206080526123c090816100c1823960805181611b47015260a05181611b210152f35b634e487b7160e01b600052604160045260246000fd5b600080fdfe6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000000003611b69577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a"
-var Permit2DeploymentSalt = "0000000000000000000000000000000000000000d3af2663da51c10215000000"
-var Permit2Deployer = "0x4e59b44847b379578588920cA78FbF26c0B4956C"
-
-func init() {
-	initBytecodes["Permit2"] = Permit2InitBin
-	deploymentSalts["Permit2"] = Permit2DeploymentSalt
-	deployers["Permit2"] = Permit2Deployer
-}
diff --git a/op-bindings/bindings/preimageoracle_more.go b/op-bindings/bindings/preimageoracle_more.go
deleted file mode 100644
index 8a68057bd712..000000000000
--- a/op-bindings/bindings/preimageoracle_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const PreimageOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/cannon/PreimageOracle.sol:PreimageOracle\",\"label\":\"preimageLengths\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_bytes32,t_uint256)\"},{\"astId\":1001,\"contract\":\"src/cannon/PreimageOracle.sol:PreimageOracle\",\"label\":\"preimageParts\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_bytes32,t_mapping(t_uint256,t_bytes32))\"},{\"astId\":1002,\"contract\":\"src/cannon/PreimageOracle.sol:PreimageOracle\",\"label\":\"preimagePartOk\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_bytes32,t_mapping(t_uint256,t_bool))\"},{\"astId\":1003,\"contract\":\"src/cannon/PreimageOracle.sol:PreimageOracle\",\"label\":\"zeroHashes\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_array(t_bytes32)16_storage\"},{\"astId\":1004,\"contract\":\"src/cannon/PreimageOracle.sol:PreimageOracle\",\"label\":\"proposals\",\"offset\":0,\"slot\":\"19\",\"type\":\"t_array(t_struct(LargePreimageProposalKeys)1010_storage)dyn_storage\"},{\"astId\":1005,\"contract\":\"src/cannon/PreimageOracle.sol:PreimageOracle\",\"label\":\"proposalBranches\",\"offset\":0,\"slot\":\"20\",\"type\":\"t_mapping(t_address,t_mapping(t_uint256,t_array(t_bytes32)16_storage))\"},{\"astId\":1006,\"contract\":\"src/cannon/PreimageOracle.sol:PreimageOracle\",\"label\":\"proposalMetadata\",\"offset\":0,\"slot\":\"21\",\"type\":\"t_mapping(t_address,t_mapping(t_uint256,t_userDefinedValueType(LPPMetaData)1011))\"},{\"astId\":1007,\"contract\":\"src/cannon/PreimageOracle.sol:PreimageOracle\",\"label\":\"proposalBonds\",\"offset\":0,\"slot\":\"22\",\"type\":\"t_mapping(t_address,t_mapping(t_uint256,t_uint256))\"},{\"astId\":1008,\"contract\":\"src/cannon/PreimageOracle.sol:PreimageOracle\",\"label\":\"proposalParts\",\"offset\":0,\"slot\":\"23\",\"type\":\"t_mapping(t_address,t_mapping(t_uint256,t_bytes32))\"},{\"astId\":1009,\"contract\":\"src/cannon/PreimageOracle.sol:PreimageOracle\",\"label\":\"proposalBlocks\",\"offset\":0,\"slot\":\"24\",\"type\":\"t_mapping(t_address,t_mapping(t_uint256,t_array(t_uint64)dyn_storage))\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)16_storage\":{\"encoding\":\"inplace\",\"label\":\"bytes32[16]\",\"numberOfBytes\":\"512\",\"base\":\"t_bytes32\"},\"t_array(t_struct(LargePreimageProposalKeys)1010_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct PreimageOracle.LargePreimageProposalKeys[]\",\"numberOfBytes\":\"32\",\"base\":\"t_struct(LargePreimageProposalKeys)1010_storage\"},\"t_array(t_uint64)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"uint64[]\",\"numberOfBytes\":\"32\",\"base\":\"t_uint64\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_mapping(t_uint256,t_array(t_bytes32)16_storage))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(uint256 =\u003e bytes32[16]))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_uint256,t_array(t_bytes32)16_storage)\"},\"t_mapping(t_address,t_mapping(t_uint256,t_array(t_uint64)dyn_storage))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(uint256 =\u003e uint64[]))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_uint256,t_array(t_uint64)dyn_storage)\"},\"t_mapping(t_address,t_mapping(t_uint256,t_bytes32))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(uint256 =\u003e bytes32))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_uint256,t_bytes32)\"},\"t_mapping(t_address,t_mapping(t_uint256,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(uint256 =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_uint256,t_uint256)\"},\"t_mapping(t_address,t_mapping(t_uint256,t_userDefinedValueType(LPPMetaData)1011))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(uint256 =\u003e LPPMetaData))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_uint256,t_userDefinedValueType(LPPMetaData)1011)\"},\"t_mapping(t_bytes32,t_mapping(t_uint256,t_bool))\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e mapping(uint256 =\u003e bool))\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_mapping(t_uint256,t_bool)\"},\"t_mapping(t_bytes32,t_mapping(t_uint256,t_bytes32))\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e mapping(uint256 =\u003e bytes32))\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_mapping(t_uint256,t_bytes32)\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_mapping(t_uint256,t_array(t_bytes32)16_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e bytes32[16])\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_array(t_bytes32)16_storage\"},\"t_mapping(t_uint256,t_array(t_uint64)dyn_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint64[])\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_array(t_uint64)dyn_storage\"},\"t_mapping(t_uint256,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_bool\"},\"t_mapping(t_uint256,t_bytes32)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e bytes32)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_bytes32\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_mapping(t_uint256,t_userDefinedValueType(LPPMetaData)1011)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e LPPMetaData)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_userDefinedValueType(LPPMetaData)1011\"},\"t_struct(LargePreimageProposalKeys)1010_storage\":{\"encoding\":\"inplace\",\"label\":\"struct PreimageOracle.LargePreimageProposalKeys\",\"numberOfBytes\":\"64\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_userDefinedValueType(LPPMetaData)1011\":{\"encoding\":\"inplace\",\"label\":\"LPPMetaData\",\"numberOfBytes\":\"32\"}}}"
-
-var PreimageOracleStorageLayout = new(solc.StorageLayout)
-
-var PreimageOracleDeployedBin = "0x6080604052600436106101cd5760003560e01c80638dc4be11116100f7578063dd24f9bf11610095578063ec5efcbc11610064578063ec5efcbc1461065f578063f3f480d91461067f578063faf37bc7146106b2578063fef2b4ed146106c557600080fd5b8063dd24f9bf1461059f578063ddcd58de146105d2578063e03110e11461060a578063e15926111461063f57600080fd5b8063b2e67ba8116100d1578063b2e67ba814610512578063b4801e611461054a578063d18534b51461056a578063da35c6641461058a57600080fd5b80638dc4be11146104835780639d53a648146104a35780639d7e8769146104f257600080fd5b806354fd4d501161016f5780637917de1d1161013e5780637917de1d146103bf5780637ac54767146103df5780638542cf50146103ff578063882856ef1461044a57600080fd5b806354fd4d50146102dd57806361238bde146103335780636551927b1461036b5780637051472e146103a357600080fd5b80632055b36b116101ab5780632055b36b146102735780633909af5c146102885780634d52b4c9146102a857806352f0f3ad146102bd57600080fd5b8063013cf08b146101d25780630359a5631461022357806304697c7814610251575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612d1c565b6106f2565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b34801561022f57600080fd5b5061024361023e366004612d5e565b610737565b60405190815260200161021a565b34801561025d57600080fd5b5061027161026c366004612dd1565b61086f565b005b34801561027f57600080fd5b50610243601081565b34801561029457600080fd5b506102716102a3366004612ff5565b6109a5565b3480156102b457600080fd5b50610243610bfc565b3480156102c957600080fd5b506102436102d83660046130e1565b610c17565b3480156102e957600080fd5b506103266040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161021a9190613148565b34801561033f57600080fd5b5061024361034e366004613199565b600160209081526000928352604080842090915290825290205481565b34801561037757600080fd5b50610243610386366004612d5e565b601560209081526000928352604080842090915290825290205481565b3480156103af57600080fd5b506102436703782dace9d9000081565b3480156103cb57600080fd5b506102716103da3660046131bb565b610cec565b3480156103eb57600080fd5b506102436103fa366004612d1c565b6111dc565b34801561040b57600080fd5b5061043a61041a366004613199565b600260209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161021a565b34801561045657600080fd5b5061046a610465366004613257565b6111f3565b60405167ffffffffffffffff909116815260200161021a565b34801561048f57600080fd5b5061027161049e36600461328a565b61124d565b3480156104af57600080fd5b506102436104be366004612d5e565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601860209081526040808320938352929052205490565b3480156104fe57600080fd5b5061027161050d3660046132d6565b611348565b34801561051e57600080fd5b5061024361052d366004612d5e565b601760209081526000928352604080842090915290825290205481565b34801561055657600080fd5b50610243610565366004613257565b6114ff565b34801561057657600080fd5b50610271610585366004612ff5565b611531565b34801561059657600080fd5b50601354610243565b3480156105ab57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610243565b3480156105de57600080fd5b506102436105ed366004612d5e565b601660209081526000928352604080842090915290825290205481565b34801561061657600080fd5b5061062a610625366004613199565b6118f3565b6040805192835260208301919091520161021a565b34801561064b57600080fd5b5061027161065a36600461328a565b6119e4565b34801561066b57600080fd5b5061027161067a366004613362565b611aec565b34801561068b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610243565b6102716106c03660046133fb565b611c72565b3480156106d157600080fd5b506102436106e0366004612d1c565b60006020819052908152604090205481565b6013818154811061070257600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061077a9060601c63ffffffff1690565b63ffffffff16905060005b6010811015610867578160011660010361080d5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106107da576107da613437565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925061084e565b826003826010811061082157610821613437565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c908061085f81613495565b915050610785565b505092915050565b600080600080608060146030823785878260140137601480870182207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06000000000000000000000000000000000000000000000000000000000000001794506000908190889084018b5afa94503d60010191506008820189106108fc5763fe2549876000526004601cfd5b60c082901b81526008018481533d6000600183013e88017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8015160008481526002602090815260408083208c8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915587845282528083209b83529a81528a82209290925593845283905296909120959095555050505050565b60006109b18a8a610737565b90506109d486868360208b01356109cf6109ca8d6134cd565b611edd565b611f1d565b80156109f257506109f283838360208801356109cf6109ca8a6134cd565b610a28576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866040013588604051602001610a3e919061359c565b6040516020818303038152906040528051906020012014610a8b576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836020013587602001356001610aa191906135da565b14610ad8576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b2088610ae686806135f2565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f7e92505050565b610b29886120d9565b836040013588604051602001610b3f919061359c565b6040516020818303038152906040528051906020012003610b8c576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526015602090815260408083208c8452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055610bf08a8a33612881565b50505050505050505050565b6001610c0a60106002613779565b610c149190613785565b81565b6000610c23868661293a565b9050610c308360086135da565b821180610c3d5750602083115b15610c74576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b60608115610d0557610cfe86866129e7565b9050610d3f565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610d6c57505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610ded8260601c63ffffffff1690565b63ffffffff169050333214610e2e576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3e8260801c63ffffffff1690565b63ffffffff16600003610e7d576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e878260c01c90565b67ffffffffffffffff1615610ec8576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610f01576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f0e89898d8886612a60565b83516020850160888204881415608883061715610f33576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610fe3578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610fd8576001821615610fb85782818b0152610fd8565b8981015160009081526020938452604090209260019290921c9101610f9b565b505050608801610f40565b50505050600160106002610ff79190613779565b6110019190613785565b81111561103a576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110af61104d8360401c63ffffffff1690565b61105d9063ffffffff168a6135da565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b9150841561113c5777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b1791506110e98260801c63ffffffff1690565b63ffffffff166110ff8360401c63ffffffff1690565b63ffffffff161461113c576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e8452909152902061116290846010612c92565b50503360008181526018602090815260408083208e8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055928252601581528282209c82529b909b52909920989098555050505050505050565b600381601081106111ec57600080fd5b0154905081565b6018602052826000526040600020602052816000526040600020818154811061121b57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b60443560008060088301861061126b5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa90508061129857600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b600080603087600037602060006030600060025afa806113705763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa9250826113f2576309bde3396000526004601cfd5b602886106114085763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061152757600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156115a4576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006115cf8260c01c90565b6115e39067ffffffffffffffff1642613785565b1161161a576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116268b8b610737565b905061163f87878360208c01356109cf6109ca8e6134cd565b801561165d575061165d84848360208901356109cf6109ca8b6134cd565b611693576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016116a9919061359c565b60405160208183030381529060405280519060200120146116f6576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84602001358860200135600161170c91906135da565b14158061173e575060016117268360601c63ffffffff1690565b611730919061379c565b63ffffffff16856020013514155b15611775576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61178389610ae687806135f2565b61178c896120d9565b60006117978a612bb3565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f020000000000000000000000000000000000000000000000000000000000000017905060006117ee8460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054600160008481526020019081526020016000206000838152602001908152602001600020819055506118c08460801c63ffffffff1690565b600083815260208190526040902063ffffffff9190911690556118e48d8d81612881565b50505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff1661197c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546119988160086135da565b6119a38560206135da565b106119c157836119b48260086135da565b6119be9190613785565b91505b506000938452600160209081526040808620948652939052919092205492909150565b604435600080600883018610611a025763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b6000611af88686610737565b9050611b1183838360208801356109cf6109ca8a6134cd565b611b47576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611b83576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b8b612cd0565b611b9981610ae687806135f2565b611ba2816120d9565b846040013581604051602001611bb8919061359c565b6040516020818303038152906040528051906020012003611c05576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152601560209081526040808320898452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055611c69878733612881565b50505050505050565b6703782dace9d90000341015611cb4576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611ced576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf88160086137c1565b63ffffffff168263ffffffff1610611d3c576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008163ffffffff161015611d9c576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601560209081526040808320878452825280832080547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1660a09790971b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff169690961760809590951b949094179094558251808401845282815280850186815260138054600181018255908452915160029092027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0908101805473ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090941693909317909255517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0919091015590815260168352818120938152929091529020349055565b6000816000015182602001518360400151604051602001611f00939291906137e9565b604051602081830303815290604052805190602001209050919050565b60008160005b6010811015611f71578060051b880135600186831c1660018114611f565760008481526020839052604090209350611f67565b600082815260208590526040902093505b5050600101611f23565b5090931495945050505050565b6088815114611f8c57600080fd5b602081016020830161200d565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b171717905061200781611ff2868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b61201960008383611f99565b61202560018383611f99565b61203160028383611f99565b61203d60038383611f99565b61204960048383611f99565b61205560058383611f99565b61206160068383611f99565b61206d60078383611f99565b61207960088383611f99565b61208560098383611f99565b612091600a8383611f99565b61209d600b8383611f99565b6120a9600c8383611f99565b6120b5600d8383611f99565b6120c1600e8383611f99565b6120cd600f8383611f99565b61200760108383611f99565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e00160405160208183030381529060405290506020820160208201612761565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c61228c8660011b67ffffffffffffffff1690565b18188584603f1c6122a78660011b67ffffffffffffffff1690565b18188584603f1c6122c28660011b67ffffffffffffffff1690565b181895508483603f1c6122df8560011b67ffffffffffffffff1690565b181894508387603f1c6122fc8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525b5050505050565b600582811b8201805160018501831b8401805160028701851b8601805160038901871b8801805160048b0190981b8901805167ffffffffffffffff861985168918811690995283198a16861889169096528819861683188816909352841986168818871690528419831684189095169052919391929190611c69565b6126fb600082612674565b612706600582612674565b612711600a82612674565b61271c600f82612674565b612727601482612674565b50565b612733816121cf565b61273c816126f0565b600383901b820151815160c09190911c9061200790821867ffffffffffffffff168352565b61276d6000828461272a565b6127796001828461272a565b6127856002828461272a565b6127916003828461272a565b61279d6004828461272a565b6127a96005828461272a565b6127b56006828461272a565b6127c16007828461272a565b6127cd6008828461272a565b6127d96009828461272a565b6127e5600a828461272a565b6127f1600b828461272a565b6127fd600c828461272a565b612809600d828461272a565b612815600e828461272a565b612821600f828461272a565b61282d6010828461272a565b6128396011828461272a565b6128456012828461272a565b6128516013828461272a565b61285d6014828461272a565b6128696015828461272a565b6128756016828461272a565b6120076017828461272a565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526016602090815260408083208684529091528082208054908390559051909284169083908381818185875af1925050503d80600081146128fa576040519150601f19603f3d011682016040523d82523d6000602084013e6128ff565b606091505b505090508061266d576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316176129e0818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b6060604051905081602082018181018286833760888306808015612a305760888290038501848101848103803687375060806001820353506001845160001a1784538652612a47565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b6000612a728260a01c63ffffffff1690565b67ffffffffffffffff1690506000612a908360801c63ffffffff1690565b63ffffffff1690506000612aaa8460401c63ffffffff1690565b63ffffffff169050600883108015612ac0575080155b15612af45760c082901b6000908152883560085283513382526017602090815260408084208a855290915290912055612ba9565b60088310158015612b12575080612b0c600885613785565b93508310155b8015612b265750612b2387826135da565b83105b15612ba9576000612b378285613785565b905087612b458260206135da565b10158015612b51575085155b15612b88576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526017602090815260408083208a845290915290209089013590555b5050505050505050565b6000612c36565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff00612be48360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612c118360101b67ffffffffffffffff1690565b1617905060008160201c612c2f8360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612c4e90612bba565b612bba565b6040820151612c5c90612bba565b60401b17612c74612c4960018460059190911b015190565b825160809190911b90612c8690612bba565b60c01b17179392505050565b8260108101928215612cc0579160200282015b82811115612cc0578251825591602001919060010190612ca5565b50612ccc929150612ce8565b5090565b6040518060200160405280612ce3612cfd565b905290565b5b80821115612ccc5760008155600101612ce9565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612d2e57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d5957600080fd5b919050565b60008060408385031215612d7157600080fd5b612d7a83612d35565b946020939093013593505050565b60008083601f840112612d9a57600080fd5b50813567ffffffffffffffff811115612db257600080fd5b602083019150836020828501011115612dca57600080fd5b9250929050565b60008060008060608587031215612de757600080fd5b84359350612df760208601612d35565b9250604085013567ffffffffffffffff811115612e1357600080fd5b612e1f87828801612d88565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612e7e57612e7e612e2b565b60405290565b6040516060810167ffffffffffffffff81118282101715612e7e57612e7e612e2b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612eee57612eee612e2b565b604052919050565b6000610320808385031215612f0a57600080fd5b604051602080820167ffffffffffffffff8382108183111715612f2f57612f2f612e2b565b8160405283955087601f880112612f4557600080fd5b612f4d612e5a565b9487019491508188861115612f6157600080fd5b875b86811015612f895780358381168114612f7c5760008081fd5b8452928401928401612f63565b50909352509295945050505050565b600060608284031215612faa57600080fd5b50919050565b60008083601f840112612fc257600080fd5b50813567ffffffffffffffff811115612fda57600080fd5b6020830191508360208260051b8501011115612dca57600080fd5b60008060008060008060008060006103e08a8c03121561301457600080fd5b61301d8a612d35565b985060208a013597506130338b60408c01612ef6565b96506103608a013567ffffffffffffffff8082111561305157600080fd5b61305d8d838e01612f98565b97506103808c013591508082111561307457600080fd5b6130808d838e01612fb0565b90975095506103a08c013591508082111561309a57600080fd5b6130a68d838e01612f98565b94506103c08c01359150808211156130bd57600080fd5b506130ca8c828d01612fb0565b915080935050809150509295985092959850929598565b600080600080600060a086880312156130f957600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60005b8381101561313757818101518382015260200161311f565b838111156120075750506000910152565b602081526000825180602084015261316781604085016020870161311c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600080604083850312156131ac57600080fd5b50508035926020909101359150565b600080600080600080600060a0888a0312156131d657600080fd5b8735965060208801359550604088013567ffffffffffffffff808211156131fc57600080fd5b6132088b838c01612d88565b909750955060608a013591508082111561322157600080fd5b5061322e8a828b01612fb0565b9094509250506080880135801515811461324757600080fd5b8091505092959891949750929550565b60008060006060848603121561326c57600080fd5b61327584612d35565b95602085013595506040909401359392505050565b60008060006040848603121561329f57600080fd5b83359250602084013567ffffffffffffffff8111156132bd57600080fd5b6132c986828701612d88565b9497909650939450505050565b600080600080600080600060a0888a0312156132f157600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561331757600080fd5b6133238b838c01612d88565b909750955060608a013591508082111561333c57600080fd5b506133498a828b01612d88565b989b979a50959894979596608090950135949350505050565b60008060008060006080868803121561337a57600080fd5b61338386612d35565b945060208601359350604086013567ffffffffffffffff808211156133a757600080fd5b6133b389838a01612f98565b945060608801359150808211156133c957600080fd5b506133d688828901612fb0565b969995985093965092949392505050565b803563ffffffff81168114612d5957600080fd5b60008060006060848603121561341057600080fd5b83359250613420602085016133e7565b915061342e604085016133e7565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134c6576134c6613466565b5060010190565b6000606082360312156134df57600080fd5b6134e7612e84565b823567ffffffffffffffff808211156134ff57600080fd5b9084019036601f83011261351257600080fd5b813560208282111561352657613526612e2b565b613556817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612ea7565b9250818352368183860101111561356c57600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b60198110156135d157825167ffffffffffffffff168252602092830192909101906001016135a8565b50505092915050565b600082198211156135ed576135ed613466565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261362757600080fd5b83018035915067ffffffffffffffff82111561364257600080fd5b602001915036819003821315612dca57600080fd5b600181815b808511156136b057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561369657613696613466565b808516156136a357918102915b93841c939080029061365c565b509250929050565b6000826136c757506001613773565b816136d457506000613773565b81600181146136ea57600281146136f457613710565b6001915050613773565b60ff84111561370557613705613466565b50506001821b613773565b5060208310610133831016604e8410600b8410161715613733575081810a613773565b61373d8383613657565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561376f5761376f613466565b0290505b92915050565b60006129e083836136b8565b60008282101561379757613797613466565b500390565b600063ffffffff838116908316818110156137b9576137b9613466565b039392505050565b600063ffffffff8083168185168083038211156137e0576137e0613466565b01949350505050565b600084516137fb81846020890161311c565b9190910192835250602082015260400191905056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(PreimageOracleStorageLayoutJSON), PreimageOracleStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["PreimageOracle"] = PreimageOracleStorageLayout
-	deployedBytecodes["PreimageOracle"] = PreimageOracleDeployedBin
-	immutableReferences["PreimageOracle"] = true
-}
diff --git a/op-bindings/bindings/protocolversions_more.go b/op-bindings/bindings/protocolversions_more.go
deleted file mode 100644
index 7e262a683869..000000000000
--- a/op-bindings/bindings/protocolversions_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const ProtocolVersionsStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/ProtocolVersions.sol:ProtocolVersions\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/L1/ProtocolVersions.sol:ProtocolVersions\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/L1/ProtocolVersions.sol:ProtocolVersions\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)50_storage\"},{\"astId\":1003,\"contract\":\"src/L1/ProtocolVersions.sol:ProtocolVersions\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"src/L1/ProtocolVersions.sol:ProtocolVersions\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)49_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_array(t_uint256)50_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var ProtocolVersionsStorageLayout = new(solc.StorageLayout)
-
-var ProtocolVersionsDeployedBin = "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e73660046108c3565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101009190610947565b6100ec6101603660046108c3565b61021d565b6100ec61022e565b6100ec61017b36600461098a565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103f7565b6100f6610430565b6100ec6101c63660046109bd565b610460565b6100f6610514565b6100f6600081565b6101e361055f565b6101ec816105e0565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b81565b61022561055f565b6101ec81610698565b61023661055f565b6102406000610712565b565b600054610100900460ff16158080156102625750600054600160ff909116105b8061027c5750303b15801561027c575060005460ff166001145b61030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561036b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610373610789565b61037c84610460565b610385836105e0565b61038e82610698565b80156103f157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061042b61042760017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b5490565b905090565b600061042b61042760017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b61046861055f565b73ffffffffffffffffffffffffffffffffffffffff811661050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610304565b6101ec81610712565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b61061361060e60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b829055565b60008160405160200161062891815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161068c9190610947565b60405180910390a35050565b6106c661060e60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b6000816040516020016106db91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600161065b565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240600054610100900460ff166108ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b61024033610712565b6000602082840312156108d557600080fd5b5035919050565b6000815180845260005b81811015610902576020818501810151868301820152016108e6565b81811115610914576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061095a60208301846108dc565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461098557600080fd5b919050565b60008060006060848603121561099f57600080fd5b6109a884610961565b95602085013595506040909401359392505050565b6000602082840312156109cf57600080fd5b61095a82610961565b600082821015610a11577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(ProtocolVersionsStorageLayoutJSON), ProtocolVersionsStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["ProtocolVersions"] = ProtocolVersionsStorageLayout
-	deployedBytecodes["ProtocolVersions"] = ProtocolVersionsDeployedBin
-	immutableReferences["ProtocolVersions"] = false
-}
diff --git a/op-bindings/bindings/proxy_more.go b/op-bindings/bindings/proxy_more.go
deleted file mode 100644
index 1ed30a48bd53..000000000000
--- a/op-bindings/bindings/proxy_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const ProxyStorageLayoutJSON = "{\"storage\":null,\"types\":{}}"
-
-var ProxyStorageLayout = new(solc.StorageLayout)
-
-var ProxyDeployedBin = "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(ProxyStorageLayoutJSON), ProxyStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["Proxy"] = ProxyStorageLayout
-	deployedBytecodes["Proxy"] = ProxyDeployedBin
-	immutableReferences["Proxy"] = false
-}
diff --git a/op-bindings/bindings/proxyadmin_more.go b/op-bindings/bindings/proxyadmin_more.go
deleted file mode 100644
index cbd348f21934..000000000000
--- a/op-bindings/bindings/proxyadmin_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const ProxyAdminStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/universal/ProxyAdmin.sol:ProxyAdmin\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"src/universal/ProxyAdmin.sol:ProxyAdmin\",\"label\":\"proxyType\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_enum(ProxyType)1006)\"},{\"astId\":1002,\"contract\":\"src/universal/ProxyAdmin.sol:ProxyAdmin\",\"label\":\"implementationName\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_address,t_string_storage)\"},{\"astId\":1003,\"contract\":\"src/universal/ProxyAdmin.sol:ProxyAdmin\",\"label\":\"addressManager\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_contract(AddressManager)1005\"},{\"astId\":1004,\"contract\":\"src/universal/ProxyAdmin.sol:ProxyAdmin\",\"label\":\"upgrading\",\"offset\":20,\"slot\":\"3\",\"type\":\"t_bool\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_contract(AddressManager)1005\":{\"encoding\":\"inplace\",\"label\":\"contract AddressManager\",\"numberOfBytes\":\"20\"},\"t_enum(ProxyType)1006\":{\"encoding\":\"inplace\",\"label\":\"enum ProxyAdmin.ProxyType\",\"numberOfBytes\":\"1\"},\"t_mapping(t_address,t_enum(ProxyType)1006)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e enum ProxyAdmin.ProxyType)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_enum(ProxyType)1006\"},\"t_mapping(t_address,t_string_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e string)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_string_storage\"},\"t_string_storage\":{\"encoding\":\"bytes\",\"label\":\"string\",\"numberOfBytes\":\"32\"}}}"
-
-var ProxyAdminStorageLayout = new(solc.StorageLayout)
-
-var ProxyAdminDeployedBin = "0x60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(ProxyAdminStorageLayoutJSON), ProxyAdminStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["ProxyAdmin"] = ProxyAdminStorageLayout
-	deployedBytecodes["ProxyAdmin"] = ProxyAdminDeployedBin
-	immutableReferences["ProxyAdmin"] = false
-}
diff --git a/op-bindings/bindings/registry.go b/op-bindings/bindings/registry.go
deleted file mode 100644
index 32e31e0a3f78..000000000000
--- a/op-bindings/bindings/registry.go
+++ /dev/null
@@ -1,128 +0,0 @@
-package bindings
-
-import (
-	"fmt"
-	"strings"
-
-	"github.com/ethereum-optimism/superchain-registry/superchain"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-	"github.com/ethereum/go-ethereum/common"
-)
-
-// layouts represents the set of storage layouts. It is populated in an init function.
-var layouts = make(map[string]*solc.StorageLayout)
-
-// deployedBytecodes represents the set of deployed bytecodes. It is populated
-// in an init function.
-var deployedBytecodes = make(map[string]string)
-
-var initBytecodes = make(map[string]string)
-var deploymentSalts = make(map[string]string)
-var deployers = make(map[string]string)
-
-// immutableReferences represents the set of immutable references. It is populated
-// in an init function.
-var immutableReferences = make(map[string]bool)
-
-// Create2DeployerCodeHash represents the codehash of the Create2Deployer contract.
-var Create2DeployerCodeHash = common.HexToHash("0xb0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2")
-
-func init() {
-	code, err := superchain.LoadContractBytecode(superchain.Hash(Create2DeployerCodeHash))
-	if err != nil {
-		panic(err)
-	}
-	deployedBytecodes["Create2Deployer"] = common.Bytes2Hex(code)
-}
-
-// GetStorageLayout returns the storage layout of a contract by name.
-func GetStorageLayout(name string) (*solc.StorageLayout, error) {
-	layout := layouts[name]
-	if layout == nil {
-		return nil, fmt.Errorf("%s: storage layout not found", name)
-	}
-	return layout, nil
-}
-
-// GetDeployedBytecode returns the deployed bytecode of a contract by name.
-func GetDeployedBytecode(name string) ([]byte, error) {
-	bc := deployedBytecodes[name]
-	if bc == "" {
-		return nil, fmt.Errorf("%s: deployed bytecode not found", name)
-	}
-
-	if !isHex(bc) {
-		return nil, fmt.Errorf("%s: invalid deployed bytecode", name)
-	}
-
-	return common.FromHex(bc), nil
-}
-
-// HasImmutableReferences returns the immutable references of a contract by name.
-func HasImmutableReferences(name string) (bool, error) {
-	has, ok := immutableReferences[name]
-	if !ok {
-		return false, fmt.Errorf("%s: immutable reference not found", name)
-	}
-	return has, nil
-}
-
-func GetInitBytecode(name string) ([]byte, error) {
-	bc := initBytecodes[name]
-	if bc == "" {
-		return nil, fmt.Errorf("%s: init bytecode not found", name)
-	}
-
-	if !isHex(bc) {
-		return nil, fmt.Errorf("%s: invalid init bytecode", name)
-	}
-
-	return common.FromHex(bc), nil
-}
-
-func GetDeployerAddress(name string) ([]byte, error) {
-	addr := deployers[name]
-	if addr == "" {
-		return nil, fmt.Errorf("%s: deployer address not found", name)
-	}
-
-	if !common.IsHexAddress(addr) {
-		return nil, fmt.Errorf("%s: invalid deployer address", name)
-	}
-
-	return common.FromHex(addr), nil
-}
-
-func GetDeploymentSalt(name string) ([]byte, error) {
-	salt := deploymentSalts[name]
-	if salt == "" {
-		return nil, fmt.Errorf("%s: deployment salt not found", name)
-	}
-
-	if !isHex(salt) {
-		return nil, fmt.Errorf("%s: invalid deployment salt", name)
-	}
-
-	return common.FromHex(salt), nil
-}
-
-// isHexCharacter returns bool of c being a valid hexadecimal.
-func isHexCharacter(c byte) bool {
-	return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')
-}
-
-// isHex validates whether each byte is valid hexadecimal string.
-func isHex(str string) bool {
-	if len(str)%2 != 0 {
-		return false
-	}
-	str = strings.TrimPrefix(str, "0x")
-
-	for _, c := range []byte(str) {
-		if !isHexCharacter(c) {
-			return false
-		}
-	}
-	return true
-}
diff --git a/op-bindings/bindings/safe_more.go b/op-bindings/bindings/safe_more.go
deleted file mode 100644
index b67a15791450..000000000000
--- a/op-bindings/bindings/safe_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const SafeStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"singleton\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"modules\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_address)\"},{\"astId\":1002,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"owners\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_address,t_address)\"},{\"astId\":1003,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"ownerCount\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_uint256\"},{\"astId\":1004,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"threshold\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_uint256\"},{\"astId\":1005,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"nonce\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"_deprecatedDomainSeparator\",\"offset\":0,\"slot\":\"6\",\"type\":\"t_bytes32\"},{\"astId\":1007,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"signedMessages\",\"offset\":0,\"slot\":\"7\",\"type\":\"t_mapping(t_bytes32,t_uint256)\"},{\"astId\":1008,\"contract\":\"lib/safe-contracts/contracts/Safe.sol:Safe\",\"label\":\"approvedHashes\",\"offset\":0,\"slot\":\"8\",\"type\":\"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_address)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e address)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_address\"},\"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(bytes32 =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_bytes32,t_uint256)\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}"
-
-var SafeStorageLayout = new(solc.StorageLayout)
-
-var SafeDeployedBin = "0x6080604052600436106101d15760003560e01c8063affed0e0116100f7578063e19a9dd911610095578063f08a032311610064578063f08a0323146105f5578063f698da2514610615578063f8dc5dd91461067c578063ffa1ad741461069c5761020d565b8063e19a9dd914610580578063e318b52b146105a0578063e75235b8146105c0578063e86637db146105d55761020d565b8063cc2f8452116100d1578063cc2f8452146104f2578063d4d9bdcd14610520578063d8d11f7814610540578063e009cfde146105605761020d565b8063affed0e01461049c578063b4faba09146104b2578063b63e800d146104d25761020d565b80635624b25b1161016f5780636a7612021161013e5780636a7612021461040f5780637d83297414610422578063934f3a111461045a578063a0e67e2b1461047a5761020d565b80635624b25b146103755780635ae6bd37146103a2578063610b5925146103cf578063694e80c3146103ef5761020d565b80632f54bf6e116101ab5780632f54bf6e146102ea5780633408e4701461030a578063468721a7146103275780635229073f146103475761020d565b80630d582f131461027357806312fb68e0146102955780632d9ad53d146102b55761020d565b3661020d5760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561021957600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024457005b36600080373360601b365260008060143601600080855af190503d6000803e8061026d573d6000fd5b503d6000f35b34801561027f57600080fd5b5061029361028e366004613568565b6106e5565b005b3480156102a157600080fd5b506102936102b036600461366e565b610933565b3480156102c157600080fd5b506102d56102d03660046136e3565b610ff7565b60405190151581526020015b60405180910390f35b3480156102f657600080fd5b506102d56103053660046136e3565b61104c565b34801561031657600080fd5b50465b6040519081526020016102e1565b34801561033357600080fd5b506102d561034236600461370f565b61109e565b34801561035357600080fd5b5061036761036236600461370f565b6111d4565b6040516102e19291906137e4565b34801561038157600080fd5b506103956103903660046137ff565b61120a565b6040516102e19190613821565b3480156103ae57600080fd5b506103196103bd366004613834565b60076020526000908152604090205481565b3480156103db57600080fd5b506102936103ea3660046136e3565b611290565b3480156103fb57600080fd5b5061029361040a366004613834565b611479565b6102d561041d366004613896565b611593565b34801561042e57600080fd5b5061031961043d366004613568565b600860209081526000928352604080842090915290825290205481565b34801561046657600080fd5b5061029361047536600461396f565b61198f565b34801561048657600080fd5b5061048f611a0b565b6040516102e19190613a2d565b3480156104a857600080fd5b5061031960055481565b3480156104be57600080fd5b506102936104cd366004613a40565b611b23565b3480156104de57600080fd5b506102936104ed366004613a90565b611b46565b3480156104fe57600080fd5b5061051261050d366004613568565b611c62565b6040516102e1929190613b85565b34801561052c57600080fd5b5061029361053b366004613834565b611ed0565b34801561054c57600080fd5b5061031961055b366004613bbd565b611fa4565b34801561056c57600080fd5b5061029361057b366004613c7e565b611fd1565b34801561058c57600080fd5b5061029361059b3660046136e3565b6121a3565b3480156105ac57600080fd5b506102936105bb366004613cb7565b612344565b3480156105cc57600080fd5b50600454610319565b3480156105e157600080fd5b506103956105f0366004613bbd565b6126bc565b34801561060157600080fd5b506102936106103660046136e3565b612855565b34801561062157600080fd5b5061031960007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b34801561068857600080fd5b50610293610697366004613d02565b6128aa565b3480156106a857600080fd5b506103956040518060400160405280600581526020017f312e342e3000000000000000000000000000000000000000000000000000000081525081565b6106ed612b34565b73ffffffffffffffffffffffffffffffffffffffff821615801590610729575073ffffffffffffffffffffffffffffffffffffffff8216600114155b801561074b575073ffffffffffffffffffffffffffffffffffffffff82163014155b6107b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600260205260409020541615610845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0805473ffffffffffffffffffffffffffffffffffffffff8481166000818152604081208054939094167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179093556001835283549091161790915560038054916108d783613d72565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2806004541461092f5761092f81611479565b5050565b61093e816041612b9f565b825110156109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000808060008060005b86811015610feb576041818102890160208101516040820151919092015160ff16955090935091506000849003610cf857885160208a01208a14610a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323700000000000000000000000000000000000000000000000000000060448201526064016107ad565b9193508391610a62876041612b9f565b821015610acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323100000000000000000000000000000000000000000000000000000060448201526064016107ad565b8751610ad8836020612bdb565b1115610b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323200000000000000000000000000000000000000000000000000000060448201526064016107ad565b602082890181015189519091610b63908390610b5d908790612bdb565b90612bdb565b1115610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040517f20c13b0b000000000000000000000000000000000000000000000000000000008082528a85016020019173ffffffffffffffffffffffffffffffffffffffff8916906320c13b0b90610c27908f908690600401613daa565b602060405180830381865afa158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190613dcf565b7fffffffff000000000000000000000000000000000000000000000000000000001614610cf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323400000000000000000000000000000000000000000000000000000060448201526064016107ad565b5050610eeb565b8360ff16600103610dc65791935083913373ffffffffffffffffffffffffffffffffffffffff84161480610d5b575073ffffffffffffffffffffffffffffffffffffffff851660009081526008602090815260408083208d845290915290205415155b610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323500000000000000000000000000000000000000000000000000000060448201526064016107ad565b610eeb565b601e8460ff161115610e8b576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610e2b9190613e11565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610e7a573d6000803e3d6000fd5b505050602060405103519450610eeb565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610ede573d6000803e3d6000fd5b5050506020604051035194505b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015610f4c575073ffffffffffffffffffffffffffffffffffffffff8581166000908152600260205260409020541615155b8015610f6f575073ffffffffffffffffffffffffffffffffffffffff8516600114155b610fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8495508080610fe390613d72565b9150506109b2565b50505050505050505050565b6000600173ffffffffffffffffffffffffffffffffffffffff831614801590611046575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615155b92915050565b600073ffffffffffffffffffffffffffffffffffffffff821660011480159061104657505073ffffffffffffffffffffffffffffffffffffffff90811660009081526002602052604090205416151590565b6000336001148015906110d557503360009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b61113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b611168858585857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612bf7565b905080156111a05760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a26111cc565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b600060606111e48686868661109e565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60606000611219836020613e34565b67ffffffffffffffff81111561123157611231613594565b6040519080825280601f01601f19166020018201604052801561125b576020820181803683370190505b50905060005b8381101561128857848101546020808302840101528061128081613d72565b915050611261565b509392505050565b611298612b34565b73ffffffffffffffffffffffffffffffffffffffff8116158015906112d4575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604090205416156113c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f805473ffffffffffffffffffffffffffffffffffffffff848116600081815260408082208054949095167fffffffffffffffffffffffff000000000000000000000000000000000000000094851617909455948552835490911681179092555190917fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091a250565b611481612b34565b6003548111156114ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939060200160405180910390a150565b60008060006115ad8e8e8e8e8e8e8e8e8e8e6005546126bc565b6005805491925060006115bf83613d72565b90915550508051602082012091506115d882828661198f565b5060006116037f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b905073ffffffffffffffffffffffffffffffffffffffff8116156116a3578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016116709c9b9a99989796959493929190613edb565b600060405180830381600087803b15801561168a57600080fd5b505af115801561169e573d6000803e3d6000fd5b505050505b6116cf6116b28a6109c4613ff1565b603f6116bf8c6040613e34565b6116c99190614009565b90612c3e565b6116db906101f4613ff1565b5a1015611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313000000000000000000000000000000000000000000000000000000060448201526064016107ad565b60005a90506117b58f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c6000146117a2578e612bf7565b6109c45a6117b09190614044565b612bf7565b93506117c25a8290612c55565b905083806117cf57508915155b806117d957508715155b61183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000881561185757611854828b8b8b8b612c70565b90505b841561189c57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8260405161188f91815260200190565b60405180910390a26118d7565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040516118ce91815260200190565b60405180910390a25b505073ffffffffffffffffffffffffffffffffffffffff81161561197e576040517f9327136800000000000000000000000000000000000000000000000000000000815260048101839052831515602482015273ffffffffffffffffffffffffffffffffffffffff821690639327136890604401600060405180830381600087803b15801561196557600080fd5b505af1158015611979573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b600454806119f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b611a0584848484610933565b50505050565b6060600060035467ffffffffffffffff811115611a2a57611a2a613594565b604051908082528060200260200182016040528015611a53578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff8116600114611b1b5780838381518110611ace57611ace61405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260029092526040909120541681611b1381613d72565b925050611a9d565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b611b848a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c9250612e01915050565b73ffffffffffffffffffffffffffffffffffffffff841615611ba957611ba9846131ce565b611be98787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061327192505050565b8115611c0057611bfe82600060018685612c70565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b89604051611c4e95949392919061408a565b60405180910390a250505050505050505050565b6060600073ffffffffffffffffffffffffffffffffffffffff841660011480611c8f5750611c8f84610ff7565b611cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b60008311611d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8267ffffffffffffffff811115611d7857611d78613594565b604051908082528060200260200182016040528015611da1578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff808616600090815260016020526040812054929450911691505b73ffffffffffffffffffffffffffffffffffffffff821615801590611e0d575073ffffffffffffffffffffffffffffffffffffffff8216600114155b8015611e1857508381105b15611e805781838281518110611e3057611e3061405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152928116600090815260019093526040909220549091169080611e7881613d72565b915050611dd1565b73ffffffffffffffffffffffffffffffffffffffff8216600114611ec55782611eaa600183614044565b81518110611eba57611eba61405b565b602002602001015191505b808352509250929050565b3360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16611f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333000000000000000000000000000000000000000000000000000000060448201526064016107ad565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b6000611fb98c8c8c8c8c8c8c8c8c8c8c6126bc565b8051906020012090509b9a5050505050505050505050565b611fd9612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612015575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602052604090205481169082161461210e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600081815260016020526040808220805487861684528284208054919096167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179095558383528054909416909355915190917faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691a25050565b6121ab612b34565b73ffffffffffffffffffffffffffffffffffffffff8116156122db576040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fe6d7a83a00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015612251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122759190614110565b6122db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475333303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c881815560405173ffffffffffffffffffffffffffffffffffffffff8316907f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa290600090a25050565b61234c612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612388575073ffffffffffffffffffffffffffffffffffffffff8116600114155b80156123aa575073ffffffffffffffffffffffffffffffffffffffff81163014155b612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040902054161561249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8216158015906124db575073ffffffffffffffffffffffffffffffffffffffff8216600114155b612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260205260409020548116908316146125d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805486861680855283852080549288167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790559589168452828420805482169096179095558383528054909416909355915190917ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf91a260405173ffffffffffffffffffffffffffffffffffffffff8216907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d6040516126f6929190614132565b60405190819003812061271c949392918e908e908e908e908e908e908e90602001614142565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090507f19000000000000000000000000000000000000000000000000000000000000007f01000000000000000000000000000000000000000000000000000000000000006127f060007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b61285d612b34565b612866816131ce565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b090600090a250565b6128b2612b34565b8060016003546128c29190614044565b101561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff821615801590612966575073ffffffffffffffffffffffffffffffffffffffff8216600114155b6129cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260026020526040902054811690831614612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805488861684529183208054929095167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790945591815282549091169091556003805491612ad7836141bf565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf90600090a28060045414612b2f57612b2f81611479565b505050565b333014612b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333100000000000000000000000000000000000000000000000000000060448201526064016107ad565b565b600082600003612bb157506000611046565b6000612bbd8385613e34565b905082612bca8583614009565b14612bd457600080fd5b9392505050565b600080612be88385613ff1565b905083811015612bd457600080fd5b60006001836001811115612c0d57612c0d613e71565b03612c25576000808551602087018986f49050612c35565b600080855160208701888a87f190505b95945050505050565b600081831015612c4e5781612bd4565b5090919050565b600082821115612c6457600080fd5b60006111cc8385614044565b60008073ffffffffffffffffffffffffffffffffffffffff831615612c955782612c97565b325b905073ffffffffffffffffffffffffffffffffffffffff8416612d7657612cd63a8610612cc4573a612cc6565b855b612cd08989612bdb565b90612b9f565b60405190925073ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f19350505050612d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313100000000000000000000000000000000000000000000000000000060448201526064016107ad565b612df7565b612d8485612cd08989612bdb565b9150612d91848284613469565b612df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313200000000000000000000000000000000000000000000000000000060448201526064016107ad565b5095945050505050565b60045415612e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b8151811115612ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015612f41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160005b8351811015613176576000848281518110612f6357612f6361405b565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612fc1575073ffffffffffffffffffffffffffffffffffffffff8116600114155b8015612fe3575073ffffffffffffffffffffffffffffffffffffffff81163014155b801561301b57508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b613081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600260205260409020541615613110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff928316600090815260026020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938216939093179092558061316e81613d72565b915050612f46565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790559051600355600455565b3073ffffffffffffffffffffffffffffffffffffffff82160361324d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475334303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f5473ffffffffffffffffffffffffffffffffffffffff161561331a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905573ffffffffffffffffffffffffffffffffffffffff82161561092f57813b6133f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b6134038260008360015a612bf7565b61092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040805173ffffffffffffffffffffffffffffffffffffffff841660248201526044808201849052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251600093929184919082896127105a03f13d8015613516576020811461351e5760009350613529565b819350613529565b600051158215171593505b5050509392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461355557600080fd5b50565b803561356381613533565b919050565b6000806040838503121561357b57600080fd5b823561358681613533565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126135d457600080fd5b813567ffffffffffffffff808211156135ef576135ef613594565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561363557613635613594565b8160405283815286602085880101111561364e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561368457600080fd5b84359350602085013567ffffffffffffffff808211156136a357600080fd5b6136af888389016135c3565b945060408701359150808211156136c557600080fd5b506136d2878288016135c3565b949793965093946060013593505050565b6000602082840312156136f557600080fd5b8135612bd481613533565b80356002811061356357600080fd5b6000806000806080858703121561372557600080fd5b843561373081613533565b935060208501359250604085013567ffffffffffffffff81111561375357600080fd5b61375f878288016135c3565b92505061376e60608601613700565b905092959194509250565b6000815180845260005b8181101561379f57602081850181015186830182015201613783565b818111156137b1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b82151581526040602082015260006111cc6040830184613779565b6000806040838503121561381257600080fd5b50508035926020909101359150565b602081526000612bd46020830184613779565b60006020828403121561384657600080fd5b5035919050565b60008083601f84011261385f57600080fd5b50813567ffffffffffffffff81111561387757600080fd5b60208301915083602082850101111561388f57600080fd5b9250929050565b60008060008060008060008060008060006101408c8e0312156138b857600080fd5b6138c18c613558565b9a5060208c0135995067ffffffffffffffff8060408e013511156138e457600080fd5b6138f48e60408f01358f0161384d565b909a50985061390560608e01613700565b975060808d0135965060a08d0135955060c08d0135945061392860e08e01613558565b93506139376101008e01613558565b9250806101208e0135111561394b57600080fd5b5061395d8d6101208e01358e016135c3565b90509295989b509295989b9093969950565b60008060006060848603121561398457600080fd5b83359250602084013567ffffffffffffffff808211156139a357600080fd5b6139af878388016135c3565b935060408601359150808211156139c557600080fd5b506139d2868287016135c3565b9150509250925092565b600081518084526020808501945080840160005b83811015613a2257815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016139f0565b509495945050505050565b602081526000612bd460208301846139dc565b60008060408385031215613a5357600080fd5b8235613a5e81613533565b9150602083013567ffffffffffffffff811115613a7a57600080fd5b613a86858286016135c3565b9150509250929050565b6000806000806000806000806000806101008b8d031215613ab057600080fd5b8a3567ffffffffffffffff80821115613ac857600080fd5b818d0191508d601f830112613adc57600080fd5b813581811115613aeb57600080fd5b8e60208260051b8501011115613b0057600080fd5b60208381019d50909b508d01359950613b1b60408e01613558565b985060608d0135915080821115613b3157600080fd5b50613b3e8d828e0161384d565b9097509550613b51905060808c01613558565b9350613b5f60a08c01613558565b925060c08b01359150613b7460e08c01613558565b90509295989b9194979a5092959850565b604081526000613b9860408301856139dc565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b60008060008060008060008060008060006101408c8e031215613bdf57600080fd5b8b35613bea81613533565b9a5060208c0135995060408c013567ffffffffffffffff811115613c0d57600080fd5b613c198e828f0161384d565b909a509850613c2c905060608d01613700565b965060808c0135955060a08c0135945060c08c0135935060e08c0135613c5181613533565b92506101008c0135613c6281613533565b809250506101208c013590509295989b509295989b9093969950565b60008060408385031215613c9157600080fd5b8235613c9c81613533565b91506020830135613cac81613533565b809150509250929050565b600080600060608486031215613ccc57600080fd5b8335613cd781613533565b92506020840135613ce781613533565b91506040840135613cf781613533565b809150509250925092565b600080600060608486031215613d1757600080fd5b8335613d2281613533565b92506020840135613d3281613533565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613da357613da3613d43565b5060010190565b604081526000613dbd6040830185613779565b8281036020840152612c358185613779565b600060208284031215613de157600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114612bd457600080fd5b600060ff821660ff841680821015613e2b57613e2b613d43565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e6c57613e6c613d43565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600061016073ffffffffffffffffffffffffffffffffffffffff8f1683528d60208401528060408401528b81840152506101808b8d828501376000818d850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8d01168301613f51606085018d613ea0565b8a60808501528960a08501528860c0850152613f8560e085018973ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff87166101008501528184820301610120850152613fb982820187613779565b92505050613fe061014083018473ffffffffffffffffffffffffffffffffffffffff169052565b9d9c50505050505050505050505050565b6000821982111561400457614004613d43565b500190565b60008261403f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561405657614056613d43565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6080808252810185905260008660a08301825b888110156140da5782356140b081613533565b73ffffffffffffffffffffffffffffffffffffffff1682526020928301929091019060010161409d565b506020840196909652505073ffffffffffffffffffffffffffffffffffffffff9283166040820152911660609091015292915050565b60006020828403121561412257600080fd5b81518015158114612bd457600080fd5b8183823760009101908152919050565b6000610160820190508c825273ffffffffffffffffffffffffffffffffffffffff808d1660208401528b60408401528a6060840152614184608084018b613ea0565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b6000816141ce576141ce613d43565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(SafeStorageLayoutJSON), SafeStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["Safe"] = SafeStorageLayout
-	deployedBytecodes["Safe"] = SafeDeployedBin
-	immutableReferences["Safe"] = false
-}
diff --git a/op-bindings/bindings/safe_v130_more.go b/op-bindings/bindings/safe_v130_more.go
deleted file mode 100644
index 22fcb12de9a4..000000000000
--- a/op-bindings/bindings/safe_v130_more.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-var Safe_v130DeployedBin = "0x6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c63430007060033"
-func init() {
-	deployedBytecodes["Safe_v130"] = Safe_v130DeployedBin
-}
diff --git a/op-bindings/bindings/safel2_v130_more.go b/op-bindings/bindings/safel2_v130_more.go
deleted file mode 100644
index 06887e0a8306..000000000000
--- a/op-bindings/bindings/safel2_v130_more.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-var SafeL2_v130DeployedBin = "0x6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506126fc565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b810190808035906020019092919080359060200190929190505050612732565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b81019080803590602001909291905050506127b9565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d1565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612b63565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c9d565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612edc565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612f01565b005b348015610d3457600080fd5b50610d3d612f90565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613139565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061313f565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613161565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff16906020019092919050505061331f565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613447565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613639565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506137d8565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613805565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b96565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c1a565b005b34801561148957600080fd5b5061149261428c565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614296565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061443e565b005b3480156116a457600080fd5b506116ad61449f565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061451d565b005b34801561174a57600080fd5b50611753614950565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614989565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612b63565b5b5050565b611bd2604182614a2c90919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614a66565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614a2c90919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614a9590919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614a9590919063ffffffff16565b614a9590919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b60007fb648d3644f584ed1c2232d53c46d87e693586486ad0d1175f8656013110b714e3386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183600181111561266b57fe5b8152602001828103825284818151815260200191508051906020019080838360005b838110156126a857808201518184015260208101905061268d565b50505050905090810190601f1680156126d55780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a16126f285858585614ab4565b9050949350505050565b6000606061270c868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561275057600080fd5b506040519080825280601f01601f1916602001820160405280156127835781602001600182028036833780820191505090505b50905060005b838110156127ae57808501548060208302602085010152508080600101915050612789565b508091505092915050565b60076020528060005260406000206000915090505481565b6127d9614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128435750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6128b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612b6b614989565b600354811115612be3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612c5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000606060055433600454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405160208183030381529060405290507f66753cd2356569ee081232e3be8909b950e0a76c1f8460c3a5e3c2be32b11bed8d8d8d8d8d8d8d8d8d8d8d8c604051808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612d5057fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200184810384528e8e82818152602001925080828437600081840152601f19601f820116905080830192505050848103835286818151815260200191508051906020019080838360005b83811015612e0a578082015181840152602081019050612def565b50505050905090810190601f168015612e375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612e70578082015181840152602081019050612e55565b50505050905090810190601f168015612e9d5780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390a1612eca8d8d8d8d8d8d8d8d8d8d8d614c9a565b9150509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612f7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612f8a84848484611bbe565b50505050565b6060600060035467ffffffffffffffff81118015612fad57600080fd5b50604051908082528060200260200182016040528015612fdc5781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613130578083838151811061308757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050613046565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6131ac8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050896151d7565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131ea576131e9846156d7565b5b6132388787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615706565b60008211156132525761325082600060018685615941565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a9050613376878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615b47565b61337f57600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561340c5780820151818401526020810190506133f1565b50505050905090810190601f1680156134395780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561346257600080fd5b506040519080825280602002602001820160405280156134915781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135645750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561356f57508482105b1561362a578084838151811061358157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506134fa565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006137ed8c8c8c8c8c8c8c8c8c8c8c614296565b8051906020012090509b9a5050505050505050505050565b61380d614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156138775750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6138e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613b9e614989565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613c22614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c8c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613cc457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613d36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613ea15750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614013576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561432757fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6143b361449f565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b614446614989565b61444f816156d7565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6144cd6125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b614525614989565b8060016003540310156145a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561460a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61467c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461477c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1806004541461494b5761494a81612b63565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614a3f5760009050614a60565b6000828402905082848281614a5057fe5b0414614a5b57600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614aaa57600080fd5b8091505092915050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015614b7f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b614bf1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b614bfe858585855a615b47565b90508015614c4e573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2614c92565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000806000614cb48e8e8e8e8e8e8e8e8e8e600554614296565b905060056000815480929190600101919050555080805190602001209150614cdd828286612f01565b506000614ce8615b93565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614ece578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115614d8b57fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015614e5d578082015181840152602081019050614e42565b50505050905090810190601f168015614e8a5780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015614eb557600080fd5b505af1158015614ec9573d6000803e3d6000fd5b505050505b6101f4614ef56109c48b01603f60408d0281614ee657fe5b04615bc490919063ffffffff16565b015a1015614f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a9050614fd48f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d14614fc9578e614fcf565b6109c45a035b615b47565b9350614fe95a82615bde90919063ffffffff16565b90508380614ff8575060008a14155b80615004575060008814155b615076576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156150905761508d828b8b8b8b615941565b90505b84156150da577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a161511a565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146151c6578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156151ad57600080fd5b505af11580156151c1573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b60006004541461524f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81518111156152c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600181101561533d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b835181101561564357600084828151811061535d57fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153d15750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561540957503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561544157508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b6154b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550809250508080600101915050615346565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461593d576158ca8260008360015a615b47565b61593c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461597e5782615980565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615a98576159ea3a86106159c7573a6159c9565b855b6159dc888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615b3d565b615abd85615aaf888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b9150615aca848284615bfe565b615b3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600180811115615b5557fe5b836001811115615b6157fe5b1415615b7a576000808551602087018986f49050615b8a565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015615bd45781615bd6565b825b905092915050565b600082821115615bed57600080fd5b600082840390508091505092915050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615ca55760208114615cad5760009350615cb8565b819350615cb8565b600051158215171593505b505050939250505056fea2646970667358221220047fac33099ca576d1c4f1ac6a8abdb0396e42ad6a397d2cb2f4dc1624cc0c5b64736f6c63430007060033"
-func init() {
-	deployedBytecodes["SafeL2_v130"] = SafeL2_v130DeployedBin
-}
diff --git a/op-bindings/bindings/safeproxyfactory_more.go b/op-bindings/bindings/safeproxyfactory_more.go
deleted file mode 100644
index 1c70e0b1d81f..000000000000
--- a/op-bindings/bindings/safeproxyfactory_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const SafeProxyFactoryStorageLayoutJSON = "{\"storage\":null,\"types\":{}}"
-
-var SafeProxyFactoryStorageLayout = new(solc.StorageLayout)
-
-var SafeProxyFactoryDeployedBin = "0x608060405234801561001057600080fd5b50600436106100675760003560e01c806353e5d9351161005057806353e5d935146100b7578063d18af54d146100cc578063ec9e80bb146100df57600080fd5b80631688f0b91461006c5780633408e470146100a9575b600080fd5b61007f61007a3660046105d2565b6100f2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6040514681526020016100a0565b6100bf610194565b6040516100a091906106a5565b61007f6100da3660046106bf565b6101dc565b61007f6100ed3660046105d2565b6102f8565b600080838051906020012083604051602001610118929190918252602082015260400190565b60405160208183030381529060405280519060200120905061013b85858361032a565b60405173ffffffffffffffffffffffffffffffffffffffff8781168252919350908316907f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2359060200160405180910390a2509392505050565b6060604051806020016101a6906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052919050565b600080838360405160200161022092919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b6040516020818303038152906040528051906020012060001c90506102468686836100f2565b915073ffffffffffffffffffffffffffffffffffffffff8316156102ef576040517f1e52b51800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690631e52b518906102bc9085908a908a908a9060040161072b565b600060405180830381600087803b1580156102d657600080fd5b505af11580156102ea573d6000803e3d6000fd5b505050505b50949350505050565b60008083805190602001208361030b4690565b6040805160208101949094528301919091526060820152608001610118565b6000833b610399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f7965640060448201526064015b60405180910390fd5b6000604051806020016103ab906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052610403919073ffffffffffffffffffffffffffffffffffffffff881690602001610775565b6040516020818303038152906040529050828151826020016000f5915073ffffffffffffffffffffffffffffffffffffffff821661049d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606401610390565b8351156104be5760008060008651602088016000875af1036104be57600080fd5b509392505050565b61016f8061079883390190565b73ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261053857600080fd5b813567ffffffffffffffff80821115610553576105536104f8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610599576105996104f8565b816040528381528660208588010111156105b257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156105e757600080fd5b83356105f2816104d3565b9250602084013567ffffffffffffffff81111561060e57600080fd5b61061a86828701610527565b925050604084013590509250925092565b60005b8381101561064657818101518382015260200161062e565b83811115610655576000848401525b50505050565b6000815180845261067381602086016020860161062b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006106b8602083018461065b565b9392505050565b600080600080608085870312156106d557600080fd5b84356106e0816104d3565b9350602085013567ffffffffffffffff8111156106fc57600080fd5b61070887828801610527565b935050604085013591506060850135610720816104d3565b939692955090935050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610764608083018561065b565b905082606083015295945050505050565b6000835161078781846020880161062b565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161016f38038061016f83398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b6078806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000aa164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(SafeProxyFactoryStorageLayoutJSON), SafeProxyFactoryStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["SafeProxyFactory"] = SafeProxyFactoryStorageLayout
-	deployedBytecodes["SafeProxyFactory"] = SafeProxyFactoryDeployedBin
-	immutableReferences["SafeProxyFactory"] = false
-}
diff --git a/op-bindings/bindings/safesingletonfactory_more.go b/op-bindings/bindings/safesingletonfactory_more.go
deleted file mode 100644
index d71e463ec436..000000000000
--- a/op-bindings/bindings/safesingletonfactory_more.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-var SafeSingletonFactoryDeployedBin = "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"
-func init() {
-	deployedBytecodes["SafeSingletonFactory"] = SafeSingletonFactoryDeployedBin
-}
diff --git a/op-bindings/bindings/schemaregistry_more.go b/op-bindings/bindings/schemaregistry_more.go
deleted file mode 100644
index 78e4bc9e50f6..000000000000
--- a/op-bindings/bindings/schemaregistry_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const SchemaRegistryStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/EAS/SchemaRegistry.sol:SchemaRegistry\",\"label\":\"_registry\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_bytes32,t_struct(SchemaRecord)1003_storage)\"},{\"astId\":1001,\"contract\":\"src/EAS/SchemaRegistry.sol:SchemaRegistry\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)49_storage\"}],\"types\":{\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_contract(ISchemaResolver)1002\":{\"encoding\":\"inplace\",\"label\":\"contract ISchemaResolver\",\"numberOfBytes\":\"20\"},\"t_mapping(t_bytes32,t_struct(SchemaRecord)1003_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e struct SchemaRecord)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_struct(SchemaRecord)1003_storage\"},\"t_string_storage\":{\"encoding\":\"bytes\",\"label\":\"string\",\"numberOfBytes\":\"32\"},\"t_struct(SchemaRecord)1003_storage\":{\"encoding\":\"inplace\",\"label\":\"struct SchemaRecord\",\"numberOfBytes\":\"96\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}"
-
-var SchemaRegistryStorageLayout = new(solc.StorageLayout)
-
-var SchemaRegistryDeployedBin = "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d501461004657806360d7a27814610098578063a2ea7c6e146100b9575b600080fd5b6100826040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f9190610473565b60405180910390f35b6100ab6100a636600461048d565b6100d9565b60405190815260200161008f565b6100cc6100c736600461053f565b61029d565b60405161008f9190610558565b60008060405180608001604052806000801b81526020018573ffffffffffffffffffffffffffffffffffffffff168152602001841515815260200187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250929350915061015b9050826103c5565b600081815260208190526040902054909150156101a4576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80825260008181526020818152604091829020845181559084015160018201805493860151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090941673ffffffffffffffffffffffffffffffffffffffff9092169190911792909217909155606083015183919060028201906102409082610682565b509050503373ffffffffffffffffffffffffffffffffffffffff16817fd0b86852e21f9e5fa4bc3b0cff9757ffe243d50c4b43968a42202153d651ea5e8460405161028b9190610558565b60405180910390a39695505050505050565b604080516080810182526000808252602082018190529181019190915260608082015260008281526020818152604091829020825160808101845281548152600182015473ffffffffffffffffffffffffffffffffffffffff8116938201939093527401000000000000000000000000000000000000000090920460ff1615159282019290925260028201805491929160608401919061033c906105e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610368906105e0565b80156103b55780601f1061038a576101008083540402835291602001916103b5565b820191906000526020600020905b81548152906001019060200180831161039857829003601f168201915b5050505050815250509050919050565b60008160600151826020015183604001516040516020016103e89392919061079c565b604051602081830303815290604052805190602001209050919050565b60005b83811015610420578181015183820152602001610408565b50506000910152565b60008151808452610441816020860160208601610405565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104866020830184610429565b9392505050565b600080600080606085870312156104a357600080fd5b843567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b6020928301965094505085013573ffffffffffffffffffffffffffffffffffffffff8116811461051f57600080fd5b91506040850135801515811461053457600080fd5b939692955090935050565b60006020828403121561055157600080fd5b5035919050565b602081528151602082015273ffffffffffffffffffffffffffffffffffffffff6020830151166040820152604082015115156060820152600060608301516080808401526105a960a0840182610429565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c908216806105f457607f821691505b60208210810361062d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561067d57600081815260208120601f850160051c8101602086101561065a5750805b601f850160051c820191505b8181101561067957828155600101610666565b5050505b505050565b815167ffffffffffffffff81111561069c5761069c6105b1565b6106b0816106aa84546105e0565b84610633565b602080601f83116001811461070357600084156106cd5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610679565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561075057888601518255948401946001909101908401610731565b508582101561078c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600084516107ae818460208901610405565b60609490941b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190930190815290151560f81b60148201526015019291505056fea164736f6c6343000813000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(SchemaRegistryStorageLayoutJSON), SchemaRegistryStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["SchemaRegistry"] = SchemaRegistryStorageLayout
-	deployedBytecodes["SchemaRegistry"] = SchemaRegistryDeployedBin
-	immutableReferences["SchemaRegistry"] = false
-}
diff --git a/op-bindings/bindings/sendercreator_more.go b/op-bindings/bindings/sendercreator_more.go
deleted file mode 100644
index 73717610145e..000000000000
--- a/op-bindings/bindings/sendercreator_more.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-var SenderCreatorDeployedBin = "0x6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033"
-func init() {
-	deployedBytecodes["SenderCreator"] = SenderCreatorDeployedBin
-}
diff --git a/op-bindings/bindings/sequencerfeevault_more.go b/op-bindings/bindings/sequencerfeevault_more.go
deleted file mode 100644
index 25d61dac2187..000000000000
--- a/op-bindings/bindings/sequencerfeevault_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const SequencerFeeVaultStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L2/SequencerFeeVault.sol:SequencerFeeVault\",\"label\":\"totalProcessed\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint256\"}],\"types\":{\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}"
-
-var SequencerFeeVaultStorageLayout = new(solc.StorageLayout)
-
-var SequencerFeeVaultDeployedBin = "0x6080604052600436106100745760003560e01c806384411d651161004e57806384411d651461014b578063d0e12f901461016f578063d3e5792b146101b0578063d4ff9218146101e457600080fd5b80630d9019e1146100805780633ccfd60b146100de57806354fd4d50146100f557600080fd5b3661007b57005b600080fd5b34801561008c57600080fd5b506100b47f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156100ea57600080fd5b506100f3610217565b005b34801561010157600080fd5b5061013e6040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b6040516100d5919061066e565b34801561015757600080fd5b5061016160005481565b6040519081526020016100d5565b34801561017b57600080fd5b506101a37f000000000000000000000000000000000000000000000000000000000000000081565b6040516100d591906106f2565b3480156101bc57600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b3480156101f057600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006100b4565b7f00000000000000000000000000000000000000000000000000000000000000004710156102f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6000479050806000808282546103089190610706565b9091555050604080518281527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166020820152338183015290517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee817f0000000000000000000000000000000000000000000000000000000000000000337f00000000000000000000000000000000000000000000000000000000000000006040516103f69493929190610745565b60405180910390a160017f0000000000000000000000000000000000000000000000000000000000000000600181111561043257610432610688565b0361054b5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146104b1576040519150601f19603f3d011682016040523d82523d6000602084013e6104b6565b606091505b5050905080610547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016102e9565b5050565b604080516020810182526000815290517fe11013dd0000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109163e11013dd9184916105ce917f0000000000000000000000000000000000000000000000000000000000000000916188b891600401610786565b6000604051808303818588803b1580156105e757600080fd5b505af11580156105fb573d6000803e3d6000fd5b505050505050565b6000815180845260005b818110156106295760208185018101518683018201520161060d565b8181111561063b576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006106816020830184610603565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106106ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161070082846106b7565b92915050565b60008219821115610740577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff8481166020830152831660408201526080810161077d60608301846106b7565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815263ffffffff8316602082015260606040820152600061077d606083018461060356fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(SequencerFeeVaultStorageLayoutJSON), SequencerFeeVaultStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["SequencerFeeVault"] = SequencerFeeVaultStorageLayout
-	deployedBytecodes["SequencerFeeVault"] = SequencerFeeVaultDeployedBin
-	immutableReferences["SequencerFeeVault"] = true
-}
diff --git a/op-bindings/bindings/standardbridge_more.go b/op-bindings/bindings/standardbridge_more.go
deleted file mode 100644
index e7915d5190f6..000000000000
--- a/op-bindings/bindings/standardbridge_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const StandardBridgeStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/universal/StandardBridge.sol:StandardBridge\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/universal/StandardBridge.sol:StandardBridge\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/universal/StandardBridge.sol:StandardBridge\",\"label\":\"spacer_0_2_30\",\"offset\":2,\"slot\":\"0\",\"type\":\"t_bytes30\"},{\"astId\":1003,\"contract\":\"src/universal/StandardBridge.sol:StandardBridge\",\"label\":\"spacer_1_0_20\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"src/universal/StandardBridge.sol:StandardBridge\",\"label\":\"deposits\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1005,\"contract\":\"src/universal/StandardBridge.sol:StandardBridge\",\"label\":\"messenger\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_contract(CrossDomainMessenger)1008\"},{\"astId\":1006,\"contract\":\"src/universal/StandardBridge.sol:StandardBridge\",\"label\":\"otherBridge\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_contract(StandardBridge)1009\"},{\"astId\":1007,\"contract\":\"src/universal/StandardBridge.sol:StandardBridge\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_array(t_uint256)45_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)45_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[45]\",\"numberOfBytes\":\"1440\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes30\":{\"encoding\":\"inplace\",\"label\":\"bytes30\",\"numberOfBytes\":\"30\"},\"t_contract(CrossDomainMessenger)1008\":{\"encoding\":\"inplace\",\"label\":\"contract CrossDomainMessenger\",\"numberOfBytes\":\"20\"},\"t_contract(StandardBridge)1009\":{\"encoding\":\"inplace\",\"label\":\"contract StandardBridge\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var StandardBridgeStorageLayout = new(solc.StorageLayout)
-
-var StandardBridgeDeployedBin = "0x"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(StandardBridgeStorageLayoutJSON), StandardBridgeStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["StandardBridge"] = StandardBridgeStorageLayout
-	deployedBytecodes["StandardBridge"] = StandardBridgeDeployedBin
-	immutableReferences["StandardBridge"] = false
-}
diff --git a/op-bindings/bindings/storagesetter_more.go b/op-bindings/bindings/storagesetter_more.go
deleted file mode 100644
index 8c1defd7b800..000000000000
--- a/op-bindings/bindings/storagesetter_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const StorageSetterStorageLayoutJSON = "{\"storage\":null,\"types\":{}}"
-
-var StorageSetterStorageLayout = new(solc.StorageLayout)
-
-var StorageSetterDeployedBin = "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a6ed563e11610076578063bd02d0f51161005b578063bd02d0f51461018e578063ca446dd9146101b8578063e2a4853a1461011557600080fd5b8063a6ed563e1461018e578063abfdcced146101aa57600080fd5b80634e91db08116100a75780634e91db081461011557806354fd4d50146101275780637ae1cfca1461017057600080fd5b80630528afe2146100c357806321f8a721146100d8575b600080fd5b6100d66100d1366004610239565b6101c6565b005b6100eb6100e63660046102ae565b610229565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100d66101233660046102c7565b9055565b6101636040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161010c91906102e9565b61017e6100e63660046102ae565b604051901515815260200161010c565b61019c6100e63660046102ae565b60405190815260200161010c565b6100d661012336600461035c565b6100d6610123366004610391565b8060005b81811015610223576102118484838181106101e7576101e76103cf565b90506040020160000135858584818110610203576102036103cf565b905060400201602001359055565b8061021b816103fe565b9150506101ca565b50505050565b6000610233825490565b92915050565b6000806020838503121561024c57600080fd5b823567ffffffffffffffff8082111561026457600080fd5b818501915085601f83011261027857600080fd5b81358181111561028757600080fd5b8660208260061b850101111561029c57600080fd5b60209290920196919550909350505050565b6000602082840312156102c057600080fd5b5035919050565b600080604083850312156102da57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b81811015610316578581018301518582016040015282016102fa565b81811115610328576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000806040838503121561036f57600080fd5b823591506020830135801515811461038657600080fd5b809150509250929050565b600080604083850312156103a457600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811461038657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610456577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(StorageSetterStorageLayoutJSON), StorageSetterStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["StorageSetter"] = StorageSetterStorageLayout
-	deployedBytecodes["StorageSetter"] = StorageSetterDeployedBin
-	immutableReferences["StorageSetter"] = false
-}
diff --git a/op-bindings/bindings/superchainconfig_more.go b/op-bindings/bindings/superchainconfig_more.go
deleted file mode 100644
index 681b98446961..000000000000
--- a/op-bindings/bindings/superchainconfig_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const SuperchainConfigStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/SuperchainConfig.sol:SuperchainConfig\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/L1/SuperchainConfig.sol:SuperchainConfig\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"}],\"types\":{\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var SuperchainConfigStorageLayout = new(solc.StorageLayout)
-
-var SuperchainConfigDeployedBin = "0x608060405234801561001057600080fd5b50600436106100885760003560e01c80635c975abb1161005b5780635c975abb146101255780636da663551461013d5780637fbf7b6a14610150578063c23a451a1461016657600080fd5b80633f4ba83a1461008d578063400ada7514610097578063452a9320146100aa57806354fd4d50146100dc575b600080fd5b61009561016e565b005b6100956100a5366004610746565b610294565b6100b261046d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101186040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100d39190610808565b61012d6104a6565b60405190151581526020016100d3565b61009561014b366004610851565b6104d6565b6101586105a4565b6040519081526020016100d3565b6101586105d2565b61017661046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e20756e706175736500000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61026961026360017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60009055565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156102b45750600054600160ff909116105b806102ce5750303b1580156102ce575060005460ff166001145b61035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161022c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156103b857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6103c18361061d565b8115610405576104056040518060400160405280601281526020017f496e697469616c697a65722070617573656400000000000000000000000000008152506106d8565b801561046857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006104a161049d60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b5490565b905090565b60006104a161049d60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b6104de61046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e2070617573650000000000000000000000000000000000000000000000606482015260840161022c565b6105a1816106d8565b50565b6105cf60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b81565b6105cf60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b61065061064b60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b829055565b60006040805173ffffffffffffffffffffffffffffffffffffffff841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526106cd91610808565b60405180910390a250565b61070c61070660017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60019055565b7fc32e6d5d6d1de257f64eac19ddb1f700ba13527983849c9486b1ab007ea283818160405161073b9190610808565b60405180910390a150565b6000806040838503121561075957600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461077d57600080fd5b91506020830135801515811461079257600080fd5b809150509250929050565b6000815180845260005b818110156107c3576020818501810151868301820152016107a7565b818111156107d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061081b602083018461079d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561086357600080fd5b813567ffffffffffffffff8082111561087b57600080fd5b818401915084601f83011261088f57600080fd5b8135818111156108a1576108a1610822565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108e7576108e7610822565b8160405282815287602084870101111561090057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600082821015610959577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(SuperchainConfigStorageLayoutJSON), SuperchainConfigStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["SuperchainConfig"] = SuperchainConfigStorageLayout
-	deployedBytecodes["SuperchainConfig"] = SuperchainConfigDeployedBin
-	immutableReferences["SuperchainConfig"] = false
-}
diff --git a/op-bindings/bindings/systemconfig_more.go b/op-bindings/bindings/systemconfig_more.go
deleted file mode 100644
index 1e0d4de714d5..000000000000
--- a/op-bindings/bindings/systemconfig_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const SystemConfigStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/SystemConfig.sol:SystemConfig\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/L1/SystemConfig.sol:SystemConfig\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/L1/SystemConfig.sol:SystemConfig\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)50_storage\"},{\"astId\":1003,\"contract\":\"src/L1/SystemConfig.sol:SystemConfig\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"src/L1/SystemConfig.sol:SystemConfig\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1005,\"contract\":\"src/L1/SystemConfig.sol:SystemConfig\",\"label\":\"overhead\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"src/L1/SystemConfig.sol:SystemConfig\",\"label\":\"scalar\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_uint256\"},{\"astId\":1007,\"contract\":\"src/L1/SystemConfig.sol:SystemConfig\",\"label\":\"batcherHash\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_bytes32\"},{\"astId\":1008,\"contract\":\"src/L1/SystemConfig.sol:SystemConfig\",\"label\":\"gasLimit\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_uint64\"},{\"astId\":1009,\"contract\":\"src/L1/SystemConfig.sol:SystemConfig\",\"label\":\"_resourceConfig\",\"offset\":0,\"slot\":\"105\",\"type\":\"t_struct(ResourceConfig)1010_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_array(t_uint256)50_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_struct(ResourceConfig)1010_storage\":{\"encoding\":\"inplace\",\"label\":\"struct ResourceMetering.ResourceConfig\",\"numberOfBytes\":\"32\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint32\":{\"encoding\":\"inplace\",\"label\":\"uint32\",\"numberOfBytes\":\"4\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var SystemConfigStorageLayout = new(solc.StorageLayout)
-
-var SystemConfigDeployedBin = "0x608060405234801561001057600080fd5b50600436106102415760003560e01c8063935f029e11610145578063dac6e63a116100bd578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610597578063fd32aa0f1461059f578063ffa1ad74146105a757600080fd5b8063f45e65d81461057a578063f68016b71461058357600080fd5b8063dac6e63a1461054e578063e0e2016d14610556578063e81b2c6d1461055e578063f2fde38b1461056757600080fd5b8063bc49ce5f11610114578063c71973f6116100f9578063c71973f6146103f4578063c9b26f6114610407578063cc731b021461041a57600080fd5b8063bc49ce5f146103e4578063c4e8ddfa146103ec57600080fd5b8063935f029e146103ae5780639b7d7f0a146103c1578063a7119869146103c9578063b40a817c146103d157600080fd5b806348cd4cb1116101d857806354fd4d50116101a757806361d157681161018c57806361d1576814610380578063715018a6146103885780638da5cb5b1461039057600080fd5b806354fd4d501461032f5780635d73369c1461037857600080fd5b806348cd4cb1146102d75780634add321d146102df5780634d9f1559146103005780634f16540b1461030857600080fd5b80630c18c162116102145780630c18c162146102ab57806318d13918146102b457806319f5cea8146102c75780631fd19ee1146102cf57600080fd5b806306c9265714610246578063078f29cf146102615780630a49cb031461028e5780630bbb796814610296575b600080fd5b61024e6105af565b6040519081526020015b60405180910390f35b6102696105dd565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610258565b610269610616565b6102a96102a4366004611928565b610646565b005b61024e60655481565b6102a96102c2366004611a55565b610a44565b61024e610a58565b610269610a83565b61024e610aad565b6102e7610add565b60405167ffffffffffffffff9091168152602001610258565b610269610b03565b61024e7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b61036b6040518060400160405280600681526020017f312e31322e30000000000000000000000000000000000000000000000000000081525081565b6040516102589190611ae2565b61024e610b33565b61024e610b5e565b6102a9610b89565b60335473ffffffffffffffffffffffffffffffffffffffff16610269565b6102a96103bc366004611af5565b610b9d565b610269610bb3565b610269610be3565b6102a96103df366004611b17565b610c13565b61024e610c24565b610269610c4f565b6102a9610402366004611b32565b610c7f565b6102a9610415366004611b4e565b610c90565b6104de6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102589190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b610269610ca1565b61024e610cd1565b61024e60675481565b6102a9610575366004611a55565b610cfc565b61024e60665481565b6068546102e79067ffffffffffffffff1681565b61024e610db0565b61024e610ddb565b61024e600081565b6105da60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b81565b600061061161060d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b5490565b905090565b600061061161060d60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b600054610100900460ff16158080156106665750600054600160ff909116105b806106805750303b158015610680575060005460ff166001145b610711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561076f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610777610e2a565b6107808a610cfc565b61078987610ec9565b6107938989610f2a565b61079c86610fbb565b6107c57f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b6107f86107f360017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b849055565b61082c61082660017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b83519055565b61086361085a60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b60208401519055565b61089a61089160017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b60408401519055565b6108d16108c860017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b60608401519055565b6109086108ff60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b60808401519055565b61093f61093660017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b60a08401519055565b610947611099565b61095084611101565b610958610add565b67ffffffffffffffff168667ffffffffffffffff1610156109d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b8015610a3857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b610a4c611575565b610a55816115f6565b50565b6105da60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b60006106117f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b600061061161060d60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b6069546000906106119063ffffffff6a0100000000000000000000820481169116611bad565b600061061161060d60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b6105da60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b6105da60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b610b91611575565b610b9b600061167a565b565b610ba5611575565b610baf8282610f2a565b5050565b600061061161060d60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b600061061161060d60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b610c1b611575565b610a5581610fbb565b6105da60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b600061061161060d60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b610c87611575565b610a5581611101565b610c98611575565b610a5581610ec9565b600061061161060d60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b6105da60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b610d04611575565b73ffffffffffffffffffffffffffffffffffffffff8116610da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610708565b610a558161167a565b6105da60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b6105da60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b5490565b600054610100900460ff16610ec1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610708565b610b9b6116f1565b60678190556040805160208082018490528251808303909101815290820190915260005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610f1e9190611ae2565b60405180910390a35050565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610fae9190611ae2565b60405180910390a3505050565b610fc3610add565b67ffffffffffffffff168167ffffffffffffffff161015611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002610eed565b6110c761060d60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b600003610b9b57610b9b6110fc60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b439055565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff1611156111b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610708565b6001816040015160ff1611611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610708565b6068546080820151825167ffffffffffffffff909216916112699190611bd9565b63ffffffff1611156112d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b6000816020015160ff161161136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610708565b8051602082015163ffffffff82169160ff9091169061138e908290611bf8565b6113989190611c42565b63ffffffff161461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610708565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610708565b61161f7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290506003610eed565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610708565b610b9b3361167a565b803573ffffffffffffffffffffffffffffffffffffffff811681146117b557600080fd5b919050565b803567ffffffffffffffff811681146117b557600080fd5b60405160c0810167ffffffffffffffff8111828210171561181c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b803563ffffffff811681146117b557600080fd5b803560ff811681146117b557600080fd5b600060c0828403121561185957600080fd5b60405160c0810181811067ffffffffffffffff821117156118a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806118b283611822565b81526118c060208401611836565b60208201526118d160408401611836565b60408201526118e260608401611822565b60608201526118f360808401611822565b608082015260a08301356fffffffffffffffffffffffffffffffff8116811461191b57600080fd5b60a0919091015292915050565b6000806000806000806000806000898b0361026081121561194857600080fd5b6119518b611791565b995060208b0135985060408b0135975060608b0135965061197460808c016117ba565b955061198260a08c01611791565b94506119918c60c08d01611847565b93506119a06101808c01611791565b925060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60820112156119d257600080fd5b506119db6117d2565b6119e86101a08c01611791565b81526119f76101c08c01611791565b6020820152611a096101e08c01611791565b6040820152611a1b6102008c01611791565b6060820152611a2d6102208c01611791565b6080820152611a3f6102408c01611791565b60a0820152809150509295985092959850929598565b600060208284031215611a6757600080fd5b611a7082611791565b9392505050565b6000815180845260005b81811015611a9d57602081850181015186830182015201611a81565b81811115611aaf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a706020830184611a77565b60008060408385031215611b0857600080fd5b50508035926020909101359150565b600060208284031215611b2957600080fd5b611a70826117ba565b600060c08284031215611b4457600080fd5b611a708383611847565b600060208284031215611b6057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611ba857611ba8611b67565b500390565b600067ffffffffffffffff808316818516808303821115611bd057611bd0611b67565b01949350505050565b600063ffffffff808316818516808303821115611bd057611bd0611b67565b600063ffffffff80841680611c36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff80831681851681830481118215151615611c6557611c65611b67565b0294935050505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(SystemConfigStorageLayoutJSON), SystemConfigStorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["SystemConfig"] = SystemConfigStorageLayout
-	deployedBytecodes["SystemConfig"] = SystemConfigDeployedBin
-	immutableReferences["SystemConfig"] = false
-}
diff --git a/op-bindings/bindings/weth9_more.go b/op-bindings/bindings/weth9_more.go
deleted file mode 100644
index 91efa104067d..000000000000
--- a/op-bindings/bindings/weth9_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindings
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const WETH9StorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/vendor/WETH9.sol:WETH9\",\"label\":\"name\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_string_storage\"},{\"astId\":1001,\"contract\":\"src/vendor/WETH9.sol:WETH9\",\"label\":\"symbol\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_string_storage\"},{\"astId\":1002,\"contract\":\"src/vendor/WETH9.sol:WETH9\",\"label\":\"decimals\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint8\"},{\"astId\":1003,\"contract\":\"src/vendor/WETH9.sol:WETH9\",\"label\":\"balanceOf\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1004,\"contract\":\"src/vendor/WETH9.sol:WETH9\",\"label\":\"allowance\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_string_storage\":{\"encoding\":\"bytes\",\"label\":\"string\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
-
-var WETH9StorageLayout = new(solc.StorageLayout)
-
-var WETH9DeployedBin = "0x6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a723158208cdf9e0c522e49d36150a8c7a071369551180dfcf54934aa47b2d43732920e8e64736f6c63430005110032"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(WETH9StorageLayoutJSON), WETH9StorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["WETH9"] = WETH9StorageLayout
-	deployedBytecodes["WETH9"] = WETH9DeployedBin
-	immutableReferences["WETH9"] = false
-}
diff --git a/op-bindings/bindingspreview/optimismportal2_more.go b/op-bindings/bindingspreview/optimismportal2_more.go
deleted file mode 100644
index 804704f4a982..000000000000
--- a/op-bindings/bindingspreview/optimismportal2_more.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package bindingspreview
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-const OptimismPortal2StorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"params\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_struct(ResourceParams)1021_storage\"},{\"astId\":1003,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_array(t_uint256)48_storage\"},{\"astId\":1004,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"l2Sender\",\"offset\":0,\"slot\":\"50\",\"type\":\"t_address\"},{\"astId\":1005,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"finalizedWithdrawals\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1006,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"spacer_52_0_32\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_bytes32\"},{\"astId\":1007,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"spacer_53_0_1\",\"offset\":0,\"slot\":\"53\",\"type\":\"t_bool\"},{\"astId\":1008,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"superchainConfig\",\"offset\":1,\"slot\":\"53\",\"type\":\"t_contract(SuperchainConfig)1018\"},{\"astId\":1009,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"spacer_54_0_20\",\"offset\":0,\"slot\":\"54\",\"type\":\"t_address\"},{\"astId\":1010,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"systemConfig\",\"offset\":0,\"slot\":\"55\",\"type\":\"t_contract(SystemConfig)1019\"},{\"astId\":1011,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"disputeGameFactory\",\"offset\":0,\"slot\":\"56\",\"type\":\"t_contract(DisputeGameFactory)1016\"},{\"astId\":1012,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"provenWithdrawals\",\"offset\":0,\"slot\":\"57\",\"type\":\"t_mapping(t_bytes32,t_struct(ProvenWithdrawal)1020_storage)\"},{\"astId\":1013,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"disputeGameBlacklist\",\"offset\":0,\"slot\":\"58\",\"type\":\"t_mapping(t_contract(IDisputeGame)1017,t_bool)\"},{\"astId\":1014,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"respectedGameType\",\"offset\":0,\"slot\":\"59\",\"type\":\"t_userDefinedValueType(GameType)1022\"},{\"astId\":1015,\"contract\":\"src/L1/OptimismPortal2.sol:OptimismPortal2\",\"label\":\"respectedGameTypeUpdatedAt\",\"offset\":4,\"slot\":\"59\",\"type\":\"t_uint64\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)48_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[48]\",\"numberOfBytes\":\"1536\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_contract(DisputeGameFactory)1016\":{\"encoding\":\"inplace\",\"label\":\"contract DisputeGameFactory\",\"numberOfBytes\":\"20\"},\"t_contract(IDisputeGame)1017\":{\"encoding\":\"inplace\",\"label\":\"contract IDisputeGame\",\"numberOfBytes\":\"20\"},\"t_contract(SuperchainConfig)1018\":{\"encoding\":\"inplace\",\"label\":\"contract SuperchainConfig\",\"numberOfBytes\":\"20\"},\"t_contract(SystemConfig)1019\":{\"encoding\":\"inplace\",\"label\":\"contract SystemConfig\",\"numberOfBytes\":\"20\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_bytes32,t_struct(ProvenWithdrawal)1020_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e struct OptimismPortal2.ProvenWithdrawal)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_struct(ProvenWithdrawal)1020_storage\"},\"t_mapping(t_contract(IDisputeGame)1017,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(contract IDisputeGame =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_contract(IDisputeGame)1017\",\"value\":\"t_bool\"},\"t_struct(ProvenWithdrawal)1020_storage\":{\"encoding\":\"inplace\",\"label\":\"struct OptimismPortal2.ProvenWithdrawal\",\"numberOfBytes\":\"32\"},\"t_struct(ResourceParams)1021_storage\":{\"encoding\":\"inplace\",\"label\":\"struct ResourceMetering.ResourceParams\",\"numberOfBytes\":\"32\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"},\"t_userDefinedValueType(GameType)1022\":{\"encoding\":\"inplace\",\"label\":\"GameType\",\"numberOfBytes\":\"4\"}}}"
-
-var OptimismPortal2StorageLayout = new(solc.StorageLayout)
-
-var OptimismPortal2DeployedBin = "0x6080604052600436106101a55760003560e01c80638b4c40b0116100e1578063bf653a5c1161008a578063e965084c11610064578063e965084c146105f1578063e9e05c421461068d578063f0498750146106a0578063f2b4e617146106cb57600080fd5b8063bf653a5c146104fd578063c0c53b8b14610530578063cff0ab961461055057600080fd5b80639bf62d82116100bb5780639bf62d8214610480578063a14238e7146104ad578063a35d99df146104dd57600080fd5b80638b4c40b0146101ca5780638c3152e914610423578063952b27971461044357600080fd5b80634fd0434c1161014e578063724c184c11610128578063724c184c146103ae5780637af1906d146103c35780637d6be8dc146103e35780637fc485041461040357600080fd5b80634fd0434c1461030157806354fd4d50146103435780635c975abb1461039957600080fd5b8063452a93201161017f578063452a93201461028c57806345884d32146102a15780634870496f146102e157600080fd5b806333d7e2bd146101d157806335e80ab3146102285780633c9f397c1461025a57600080fd5b366101cc576101ca3334620186a06000604051806020016040528060008152506106f8565b005b600080fd5b3480156101dd57600080fd5b506037546101fe9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023457600080fd5b506035546101fe90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561026657600080fd5b50603b546102779063ffffffff1681565b60405163ffffffff909116815260200161021f565b34801561029857600080fd5b506101fe610993565b3480156102ad57600080fd5b506102d16102bc366004614ecb565b603a6020526000908152604090205460ff1681565b604051901515815260200161021f565b3480156102ed57600080fd5b506101ca6102fc3660046150a3565b610a2b565b34801561030d57600080fd5b50603b5461032a90640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161021f565b34801561034f57600080fd5b5061038c6040518060400160405280600581526020017f332e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161021f91906151f5565b3480156103a557600080fd5b506102d161129c565b3480156103ba57600080fd5b506101fe61132f565b3480156103cf57600080fd5b506101ca6103de366004615208565b611339565b3480156103ef57600080fd5b506101ca6103fe366004614ecb565b611b61565b34801561040f57600080fd5b506101ca61041e366004615233565b611c72565b34801561042f57600080fd5b506101ca61043e366004615250565b611da8565b34801561044f57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405190815260200161021f565b34801561048c57600080fd5b506032546101fe9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104b957600080fd5b506102d16104c8366004615208565b60336020526000908152604090205460ff1681565b3480156104e957600080fd5b5061032a6104f83660046152a3565b612085565b34801561050957600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610472565b34801561053c57600080fd5b506101ca61054b3660046152c0565b6120a4565b34801561055c57600080fd5b506001546105b8906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161021f565b3480156105fd57600080fd5b5061065861060c366004615208565b60396020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301520161021f565b6101ca61069b366004615319565b6106f8565b3480156106ac57600080fd5b5060375473ffffffffffffffffffffffffffffffffffffffff166101fe565b3480156106d757600080fd5b506038546101fe9073ffffffffffffffffffffffffffffffffffffffff1681565b8260005a905083156107af5773ffffffffffffffffffffffffffffffffffffffff8716156107af57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b6107b98351612085565b67ffffffffffffffff168567ffffffffffffffff16101561085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4f7074696d69736d506f7274616c3a20676173206c696d697420746f6f20736d60448201527f616c6c000000000000000000000000000000000000000000000000000000000060648201526084016107a6565b6201d4c0835111156108ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f7074696d69736d506f7274616c3a206461746120746f6f206c61726765000060448201526064016107a6565b333281146108eb575033731111000000000000000000000000000000001111015b60003488888888604051602001610906959493929190615398565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161097691906151f5565b60405180910390a4505061098a828261230d565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2691906153fd565b905090565b610a3361129c565b15610a9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a207061757365640000000000000000000060448201526064016107a6565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610b59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016107a6565b6038546040517fbb8aa1fc00000000000000000000000000000000000000000000000000000000815260048101869052600091829173ffffffffffffffffffffffffffffffffffffffff9091169063bb8aa1fc90602401606060405180830381865afa158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf1919061541a565b925050915060008173ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c67919061545c565b603b5490915060ff848116911614610d01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016107a6565b610d18610d1336889003880188615475565b61263a565b8114610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016107a6565b6000610db189612696565b60008181526039602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff81168084527401000000000000000000000000000000000000000090910467ffffffffffffffff169183018290529293509091901580610ea0575060018573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8d919061550a565b6002811115610e9e57610e9e6154db565b145b80610ed0575073ffffffffffffffffffffffffffffffffffffffff85166000908152603a602052604090205460ff165b80610f635750603b5463ffffffff1660ff16610f5d8273ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f54919061552b565b63ffffffff1690565b60ff1614155b611015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e2c20616e642064697360648201527f707574652067616d65206973206e6f7420696e76616c69640000000000000000608482015260a4016107a6565b60408051602081018590526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506110de9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152906110d48b8d615548565b8d604001356126c6565b61116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016107a6565b60405180604001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506039600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050508b6040015173ffffffffffffffffffffffffffffffffffffffff168c6020015173ffffffffffffffffffffffffffffffffffffffff16857f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6260405160405180910390a4505050505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561130b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2691906155cc565b6000610a26610993565b600081815260396020908152604080832081518083018352905473ffffffffffffffffffffffffffffffffffffffff81168083527401000000000000000000000000000000000000000090910467ffffffffffffffff1682850152808552603a90935292205460ff161561142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652068617360448201527f206265656e20626c61636b6c697374656400000000000000000000000000000060648201526084016107a6565b816020015167ffffffffffffffff166000036114cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e20796574000000000000000000000000000060648201526084016107a6565b600061154e8273ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154191906155e9565b67ffffffffffffffff1690565b90508067ffffffffffffffff16836020015167ffffffffffffffff161161161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e20646973707574652067616d65206372656160648201527f74696f6e2074696d657374616d70000000000000000000000000000000000000608482015260a4016107a6565b7f0000000000000000000000000000000000000000000000000000000000000000836020015167ffffffffffffffff16426116589190615635565b116116e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c20686173206e6f74206d61747572656420796574000000000000000000000060648201526084016107a6565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611732573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611756919061550a565b6002811115611767576117676154db565b146117f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f686173206e6f74206265656e2066696e616c697a65642079657400000000000060648201526084016107a6565b603b5463ffffffff1660ff1661184e8373ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f30573d6000803e3d6000fd5b60ff16146118de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016107a6565b603b5467ffffffffffffffff640100000000909104811690821610156119ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652063726560448201527f61746564206265666f7265207265737065637465642067616d6520747970652060648201527f7761732075706461746564000000000000000000000000000000000000000000608482015260a4016107a6565b7f0000000000000000000000000000000000000000000000000000000000000000611a1b8373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151d573d6000803e3d6000fd5b611a2f9067ffffffffffffffff1642615635565b11611abc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f696e206169722d6761700000000000000000000000000000000000000000000060648201526084016107a6565b60008481526033602052604090205460ff1615611b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016107a6565b50505050565b611b69610993565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4f7074696d69736d506f7274616c3a206f6e6c7920746865206775617264696160448201527f6e2063616e20626c61636b6c69737420646973707574652067616d657300000060648201526084016107a6565b73ffffffffffffffffffffffffffffffffffffffff166000908152603a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611c7a610993565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4f7074696d69736d506f7274616c3a206f6e6c7920746865206775617264696160448201527f6e2063616e2073657420746865207265737065637465642067616d652074797060648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016107a6565b603b805463ffffffff929092167fffffffffffffffffffffffffffffffffffffffff000000000000000000000000909216919091176401000000004267ffffffffffffffff1602179055565b565b611db061129c565b15611e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a207061757365640000000000000000000060448201526064016107a6565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611ec0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016107a6565b6000611ecb82612696565b9050611ed681611339565b600081815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908401516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558301516080840151606085015160a0860151611f78939291906126ea565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611fdd90841515815260200190565b60405180910390a280158015611ff35750326001145b15612080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a207769746864726177616c206661696c6560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016107a6565b505050565b600061209282601061564c565b61209e9061520861567c565b92915050565b600054610100900460ff16158080156120c45750600054600160ff909116105b806120de5750303b1580156120de575060005460ff166001145b61216a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107a6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156121c857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff16610100858416021790556032541661228157603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b612289612748565b8015611b5b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090612343907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643615635565b9050600061234f61285b565b90506000816020015160ff16826000015163ffffffff1661237091906156d7565b905082156124a7576001546000906123a7908390700100000000000000000000000000000000900467ffffffffffffffff1661573f565b90506000836040015160ff16836123be91906157b3565b6001546123de9084906fffffffffffffffffffffffffffffffff166157b3565b6123e891906156d7565b600154909150600090612439906124129084906fffffffffffffffffffffffffffffffff1661586f565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff1661291c565b905060018611156124685761246561241282876040015160ff1660018a6124609190615635565b61293b565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b600180548691906010906124da908490700100000000000000000000000000000000900467ffffffffffffffff1661567c565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156125bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016107a6565b6001546000906125e9906fffffffffffffffffffffffffffffffff1667ffffffffffffffff88166158e3565b905060006125fb48633b9aca00612990565b6126059083615920565b905060005a6126149088615635565b9050808211156126305761263061262b8284615635565b6129a7565b5050505050505050565b60008160000151826020015183604001518460600151604051602001612679949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097612679979096959101615934565b6000806126d2866129d0565b90506126e081868686612a02565b9695505050505050565b60008060006126fa866000612a32565b905080612730576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff166127df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107a6565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003611da65760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa1580156128f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2691906159a1565b600061293161292b8585612a50565b83612a60565b90505b9392505050565b6000670de0b6b3a764000061297c61295385836156d7565b61296590670de0b6b3a764000061573f565b61297785670de0b6b3a76400006157b3565b612a6f565b61298690866157b3565b61293191906156d7565b6000818310156129a05781612934565b5090919050565b6000805a90505b825a6129ba9083615635565b1015612080576129c982615a5d565b91506129ae565b606081805190602001206040516020016129ec91815260200190565b6040516020818303038152906040529050919050565b6000612a2984612a13878686612aa0565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156129a05781612934565b60008183126129a05781612934565b6000612934670de0b6b3a764000083612a878661351e565b612a9191906157b3565b612a9b91906156d7565b613762565b60606000845111612b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b6579000000000000000000000060448201526064016107a6565b6000612b18846139a1565b90506000612b2586613a8d565b9050600084604051602001612b3c91815260200190565b60405160208183030381529060405290506000805b8451811015613495576000858281518110612b6e57612b6e615a95565b602002602001015190508451831115612c09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016107a6565b82600003612cc25780518051602091820120604051612c5792612c3192910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612cbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016107a6565b612e19565b805151602011612d785780518051602091820120604051612cec92612c3192910190815260200190565b612cbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016107a6565b805184516020808701919091208251919092012014612e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016107a6565b612e2560106001615ac4565b816020015151036130015784518303612f9957612e5f8160200151601081518110612e5257612e52615a95565b6020026020010151613af0565b96506000875111612ef2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016107a6565b60018651612f009190615635565b8214612f8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016107a6565b505050505050612934565b6000858481518110612fad57612fad615a95565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110612fd857612fd8615a95565b60200260200101519050612feb81613c50565b9550612ff8600186615ac4565b94505050613482565b6002816020015151036133fa57600061301982613c75565b905060008160008151811061303057613030615a95565b016020015160f81c90506000613047600283615adc565b613052906002615afe565b90506000613063848360ff16613c99565b905060006130718a89613c99565b9050600061307f8383613ccf565b905080835114613111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016107a6565b60ff851660021480613126575060ff85166003145b1561331557808251146131bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016107a6565b6131d58760200151600181518110612e5257612e52615a95565b9c5060008d5111613268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016107a6565b60018c516132769190615635565b8814613304576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016107a6565b505050505050505050505050612934565b60ff85161580613328575060ff85166001145b1561336757613354876020015160018151811061334757613347615a95565b6020026020010151613c50565b9950613360818a615ac4565b98506133ef565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016107a6565b505050505050613482565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016107a6565b508061348d81615a5d565b915050612b51565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016107a6565b6000808213613589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016107a6565b6000606061359684613d83565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361379357506000919050565b680755bf798b4a1bf1e58212613805576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016107a6565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156139bf576139bf614ee8565b604051908082528060200260200182016040528015613a0457816020015b60408051808201909152606080825260208201528152602001906001900390816139dd5790505b50915060005b81811015613a86576040518060400160405280858381518110613a2f57613a2f615a95565b60200260200101518152602001613a5e868481518110613a5157613a51615a95565b6020026020010151613e59565b815250838281518110613a7357613a73615a95565b6020908102919091010152600101613a0a565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613ae5578060011b82018184015160001a8060041c8253600f811660018301535050600101613ab7565b509295945050505050565b60606000806000613b0085613e6c565b919450925090506000816001811115613b1b57613b1b6154db565b14613ba8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016107a6565b613bb28284615ac4565b855114613c41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016107a6565b612a29856020015184846148d9565b60606020826000015110613c6c57613c6782613af0565b61209e565b61209e8261496d565b606061209e613c948360200151600081518110612e5257612e52615a95565b613a8d565b606082518210613cb8575060408051602081019091526000815261209e565b6129348383848651613cca9190615635565b614983565b6000808251845110613ce2578251613ce5565b83515b90505b8082108015613d6c5750828281518110613d0457613d04615a95565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613d4357613d43615a95565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613d7c57816001019150613ce8565b5092915050565b6000808211613dee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016107a6565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606061209e613e6783614b5b565b614c44565b600080600080846000015111613f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016107a6565b6020840151805160001a607f8111613f4f5760006001600094509450945050506148d2565b60b7811161415d576000613f64608083615635565b90508087600001511161401f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016107a6565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061409857507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b61414a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016107a6565b50600195509350600092506148d2915050565b60bf81116144ab57600061417260b783615635565b90508087600001511161422d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016107a6565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361430b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016107a6565b600184015160088302610100031c603781116143cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016107a6565b6143d98184615ac4565b89511161448e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016107a6565b614499836001615ac4565b97509550600094506148d29350505050565b60f7811161458c5760006144c060c083615635565b90508087600001511161457b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016107a6565b6001955093508492506148d2915050565b600061459960f783615635565b905080876000015111614654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016107a6565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016107a6565b600184015160088302610100031c603781116147f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016107a6565b6148008184615ac4565b8951116148b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016107a6565b6148c0836001615ac4565b97509550600194506148d29350505050565b9193909250565b60608167ffffffffffffffff8111156148f4576148f4614ee8565b6040519080825280601f01601f19166020018201604052801561491e576020820181803683370190505b50905081156129345760006149338486615ac4565b90506020820160005b8481101561495457828101518282015260200161493c565b84811115614963576000858301525b5050509392505050565b606061209e8260200151600084600001516148d9565b60608182601f0110156149f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016107a6565b828284011015614a5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016107a6565b81830184511015614acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016107a6565b606082158015614aea5760405191506000825260208201604052614b52565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614b23578051835260209283019201614b0b565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614c26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016107a6565b50604080518082019091528151815260209182019181019190915290565b60606000806000614c5485613e6c565b919450925090506001816001811115614c6f57614c6f6154db565b14614cfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016107a6565b8451614d088385615ac4565b14614d95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016107a6565b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081614dac5790505093506000835b8651811015614e9a57600080614e1f6040518060400160405280858c60000151614e039190615635565b8152602001858c60200151614e189190615ac4565b9052613e6c565b509150915060405180604001604052808383614e3b9190615ac4565b8152602001848b60200151614e509190615ac4565b815250888581518110614e6557614e65615a95565b6020908102919091010152614e7b600185615ac4565b9350614e878183615ac4565b614e919084615ac4565b92505050614dd9565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114614ec857600080fd5b50565b600060208284031215614edd57600080fd5b813561293481614ea6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614f5e57614f5e614ee8565b604052919050565b600082601f830112614f7757600080fd5b813567ffffffffffffffff811115614f9157614f91614ee8565b614fc260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614f17565b818152846020838601011115614fd757600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561500657600080fd5b60405160c0810167ffffffffffffffff828210818311171561502a5761502a614ee8565b81604052829350843583526020850135915061504582614ea6565b8160208401526040850135915061505b82614ea6565b816040840152606085013560608401526080850135608084015260a085013591508082111561508957600080fd5b5061509685828601614f66565b60a0830152505092915050565b600080600080600085870360e08112156150bc57600080fd5b863567ffffffffffffffff808211156150d457600080fd5b6150e08a838b01614ff4565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561511957600080fd5b60408901955060c089013592508083111561513357600080fd5b828901925089601f84011261514757600080fd5b823591508082111561515857600080fd5b508860208260051b840101111561516e57600080fd5b959894975092955050506020019190565b60005b8381101561519a578181015183820152602001615182565b83811115611b5b5750506000910152565b600081518084526151c381602086016020860161517f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061293460208301846151ab565b60006020828403121561521a57600080fd5b5035919050565b63ffffffff81168114614ec857600080fd5b60006020828403121561524557600080fd5b813561293481615221565b60006020828403121561526257600080fd5b813567ffffffffffffffff81111561527957600080fd5b61528584828501614ff4565b949350505050565b67ffffffffffffffff81168114614ec857600080fd5b6000602082840312156152b557600080fd5b81356129348161528d565b6000806000606084860312156152d557600080fd5b83356152e081614ea6565b925060208401356152f081614ea6565b9150604084013561530081614ea6565b809150509250925092565b8015158114614ec857600080fd5b600080600080600060a0868803121561533157600080fd5b853561533c81614ea6565b94506020860135935060408601356153538161528d565b925060608601356153638161530b565b9150608086013567ffffffffffffffff81111561537f57600080fd5b61538b88828901614f66565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516153ec81604985016020870161517f565b919091016049019695505050505050565b60006020828403121561540f57600080fd5b815161293481614ea6565b60008060006060848603121561542f57600080fd5b835161543a81615221565b602085015190935061544b8161528d565b604085015190925061530081614ea6565b60006020828403121561546e57600080fd5b5051919050565b60006080828403121561548757600080fd5b6040516080810181811067ffffffffffffffff821117156154aa576154aa614ee8565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020828403121561551c57600080fd5b81516003811061293457600080fd5b60006020828403121561553d57600080fd5b815161293481615221565b600067ffffffffffffffff8084111561556357615563614ee8565b8360051b6020615574818301614f17565b86815291850191818101903684111561558c57600080fd5b865b848110156155c0578035868111156155a65760008081fd5b6155b236828b01614f66565b84525091830191830161558e565b50979650505050505050565b6000602082840312156155de57600080fd5b81516129348161530b565b6000602082840312156155fb57600080fd5b81516129348161528d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561564757615647615606565b500390565b600067ffffffffffffffff8083168185168183048111821515161561567357615673615606565b02949350505050565b600067ffffffffffffffff80831681851680830382111561569f5761569f615606565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826156e6576156e66156a8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561573a5761573a615606565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561577957615779615606565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156157ad576157ad615606565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156157f4576157f4615606565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561582f5761582f615606565b6000871292508782058712848416161561584b5761584b615606565b8785058712818416161561586157615861615606565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156158a9576158a9615606565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156158dd576158dd615606565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561591b5761591b615606565b500290565b60008261592f5761592f6156a8565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261597f60c08301846151ab565b98975050505050505050565b805160ff8116811461599c57600080fd5b919050565b600060c082840312156159b357600080fd5b60405160c0810181811067ffffffffffffffff821117156159d6576159d6614ee8565b60405282516159e481615221565b81526159f26020840161598b565b6020820152615a036040840161598b565b60408201526060830151615a1681615221565b60608201526080830151615a2981615221565b608082015260a08301516fffffffffffffffffffffffffffffffff81168114615a5157600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a8e57615a8e615606565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115615ad757615ad7615606565b500190565b600060ff831680615aef57615aef6156a8565b8060ff84160691505092915050565b600060ff821660ff841680821015615b1857615b18615606565b9003939250505056fea164736f6c634300080f000a"
-
-
-func init() {
-	if err := json.Unmarshal([]byte(OptimismPortal2StorageLayoutJSON), OptimismPortal2StorageLayout); err != nil {
-		panic(err)
-	}
-
-	layouts["OptimismPortal2"] = OptimismPortal2StorageLayout
-	deployedBytecodes["OptimismPortal2"] = OptimismPortal2DeployedBin
-	immutableReferences["OptimismPortal2"] = true
-}
diff --git a/op-bindings/bindingspreview/registry.go b/op-bindings/bindingspreview/registry.go
deleted file mode 100644
index 179f5761f025..000000000000
--- a/op-bindings/bindingspreview/registry.go
+++ /dev/null
@@ -1,128 +0,0 @@
-package bindingspreview
-
-import (
-	"fmt"
-	"strings"
-
-	"github.com/ethereum-optimism/superchain-registry/superchain"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-	"github.com/ethereum/go-ethereum/common"
-)
-
-// layouts represents the set of storage layouts. It is populated in an init function.
-var layouts = make(map[string]*solc.StorageLayout)
-
-// deployedBytecodes represents the set of deployed bytecodes. It is populated
-// in an init function.
-var deployedBytecodes = make(map[string]string)
-
-var initBytecodes = make(map[string]string)
-var deploymentSalts = make(map[string]string)
-var deployers = make(map[string]string)
-
-// immutableReferences represents the set of immutable references. It is populated
-// in an init function.
-var immutableReferences = make(map[string]bool)
-
-// Create2DeployerCodeHash represents the codehash of the Create2Deployer contract.
-var Create2DeployerCodeHash = common.HexToHash("0xb0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2")
-
-func init() {
-	code, err := superchain.LoadContractBytecode(superchain.Hash(Create2DeployerCodeHash))
-	if err != nil {
-		panic(err)
-	}
-	deployedBytecodes["Create2Deployer"] = common.Bytes2Hex(code)
-}
-
-// GetStorageLayout returns the storage layout of a contract by name.
-func GetStorageLayout(name string) (*solc.StorageLayout, error) {
-	layout := layouts[name]
-	if layout == nil {
-		return nil, fmt.Errorf("%s: storage layout not found", name)
-	}
-	return layout, nil
-}
-
-// GetDeployedBytecode returns the deployed bytecode of a contract by name.
-func GetDeployedBytecode(name string) ([]byte, error) {
-	bc := deployedBytecodes[name]
-	if bc == "" {
-		return nil, fmt.Errorf("%s: deployed bytecode not found", name)
-	}
-
-	if !isHex(bc) {
-		return nil, fmt.Errorf("%s: invalid deployed bytecode", name)
-	}
-
-	return common.FromHex(bc), nil
-}
-
-// HasImmutableReferences returns the immutable references of a contract by name.
-func HasImmutableReferences(name string) (bool, error) {
-	has, ok := immutableReferences[name]
-	if !ok {
-		return false, fmt.Errorf("%s: immutable reference not found", name)
-	}
-	return has, nil
-}
-
-func GetInitBytecode(name string) ([]byte, error) {
-	bc := initBytecodes[name]
-	if bc == "" {
-		return nil, fmt.Errorf("%s: init bytecode not found", name)
-	}
-
-	if !isHex(bc) {
-		return nil, fmt.Errorf("%s: invalid init bytecode", name)
-	}
-
-	return common.FromHex(bc), nil
-}
-
-func GetDeployerAddress(name string) ([]byte, error) {
-	addr := deployers[name]
-	if addr == "" {
-		return nil, fmt.Errorf("%s: deployer address not found", name)
-	}
-
-	if !common.IsHexAddress(addr) {
-		return nil, fmt.Errorf("%s: invalid deployer address", name)
-	}
-
-	return common.FromHex(addr), nil
-}
-
-func GetDeploymentSalt(name string) ([]byte, error) {
-	salt := deploymentSalts[name]
-	if salt == "" {
-		return nil, fmt.Errorf("%s: deployment salt not found", name)
-	}
-
-	if !isHex(salt) {
-		return nil, fmt.Errorf("%s: invalid deployment salt", name)
-	}
-
-	return common.FromHex(salt), nil
-}
-
-// isHexCharacter returns bool of c being a valid hexadecimal.
-func isHexCharacter(c byte) bool {
-	return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')
-}
-
-// isHex validates whether each byte is valid hexadecimal string.
-func isHex(str string) bool {
-	if len(str)%2 != 0 {
-		return false
-	}
-	str = strings.TrimPrefix(str, "0x")
-
-	for _, c := range []byte(str) {
-		if !isHexCharacter(c) {
-			return false
-		}
-	}
-	return true
-}
diff --git a/op-bindings/cmd/main.go b/op-bindings/cmd/main.go
deleted file mode 100644
index 8c14f4fcda1d..000000000000
--- a/op-bindings/cmd/main.go
+++ /dev/null
@@ -1,236 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"os"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindgen"
-	"github.com/ethereum-optimism/optimism/op-bindings/etherscan"
-	op_service "github.com/ethereum-optimism/optimism/op-service"
-	oplog "github.com/ethereum-optimism/optimism/op-service/log"
-	"github.com/ethereum/go-ethereum/ethclient"
-	"github.com/ethereum/go-ethereum/log"
-	"github.com/urfave/cli/v2"
-)
-
-const (
-	// Base Flags
-	MetadataOutFlagName         = "metadata-out"
-	BindingsPackageNameFlagName = "bindings-package"
-	ContractsListFlagName       = "contracts-list"
-
-	// Local Contracts Flags
-	SourceMapsListFlagName = "source-maps-list"
-	ForgeArtifactsFlagName = "forge-artifacts"
-
-	// Remote Contracts Flags
-	EtherscanApiKeyEthFlagName = "etherscan.apikey.eth"
-	EtherscanApiKeyOpFlagName  = "etherscan.apikey.op"
-	RpcUrlEthFlagName          = "rpc.url.eth"
-	RpcUrlOpFlagName           = "rpc.url.op"
-)
-
-func main() {
-	oplog.SetupDefaults()
-
-	app := &cli.App{
-		Name:  "BindGen",
-		Usage: "Generate contract bindings using Foundry artifacts and/or remotely sourced contract data",
-		Commands: []*cli.Command{
-			{
-				Name:  "generate",
-				Usage: "Generate contract bindings",
-				Flags: baseFlags(),
-				Subcommands: []*cli.Command{
-					{
-						Name:   "all",
-						Usage:  "Generate bindings for local and remote contracts",
-						Flags:  append(localFlags(), remoteFlags()...),
-						Action: generateBindings,
-					},
-					{
-						Name:   "local",
-						Usage:  "Generate bindings for locally sourced contracts",
-						Flags:  localFlags(),
-						Action: generateBindings,
-					},
-					{
-						Name:   "remote",
-						Usage:  "Generate bindings for remotely sourced contracts",
-						Flags:  remoteFlags(),
-						Action: generateBindings,
-					},
-				},
-			},
-		},
-	}
-
-	if err := app.Run(os.Args); err != nil {
-		log.Crit("BindGen error", "error", err.Error())
-	}
-}
-
-func setupLogger(c *cli.Context) log.Logger {
-	logger := oplog.NewLogger(oplog.AppOut(c), oplog.ReadCLIConfig(c))
-	oplog.SetGlobalLogHandler(logger.Handler())
-	return logger
-}
-
-func generateBindings(c *cli.Context) error {
-	logger := setupLogger(c)
-
-	switch c.Command.Name {
-	case "all":
-		localBindingsGenerator, err := parseConfigLocal(logger, c)
-		if err != nil {
-			return err
-		}
-		if err := localBindingsGenerator.GenerateBindings(); err != nil {
-			return fmt.Errorf("error generating local bindings: %w", err)
-		}
-
-		remoteBindingsGenerator, err := parseConfigRemote(logger, c)
-		if err != nil {
-			return err
-		}
-		if err := remoteBindingsGenerator.GenerateBindings(); err != nil {
-			return fmt.Errorf("error generating remote bindings: %w", err)
-		}
-
-		return nil
-	case "local":
-		localBindingsGenerator, err := parseConfigLocal(logger, c)
-		if err != nil {
-			return err
-		}
-		if err := localBindingsGenerator.GenerateBindings(); err != nil {
-			return fmt.Errorf("error generating local bindings: %w", err)
-		}
-		return nil
-	case "remote":
-		remoteBindingsGenerator, err := parseConfigRemote(logger, c)
-		if err != nil {
-			return err
-		}
-		if err := remoteBindingsGenerator.GenerateBindings(); err != nil {
-			return fmt.Errorf("error generating remote bindings: %w", err)
-		}
-		return nil
-	default:
-		return fmt.Errorf("unknown command: %s", c.Command.Name)
-	}
-}
-
-func parseConfigBase(logger log.Logger, c *cli.Context) (bindgen.BindGenGeneratorBase, error) {
-	cwd, err := os.Getwd()
-	if err != nil {
-		return bindgen.BindGenGeneratorBase{}, err
-	}
-
-	monoRepoPath, err := op_service.FindMonorepoRoot(cwd)
-	if err != nil {
-		return bindgen.BindGenGeneratorBase{}, err
-	}
-
-	return bindgen.BindGenGeneratorBase{
-		MetadataOut:         c.String(MetadataOutFlagName),
-		BindingsPackageName: c.String(BindingsPackageNameFlagName),
-		MonorepoBasePath:    monoRepoPath,
-		ContractsListPath:   c.String(ContractsListFlagName),
-		Logger:              logger,
-	}, nil
-}
-
-func parseConfigLocal(logger log.Logger, c *cli.Context) (bindgen.BindGenGeneratorLocal, error) {
-	baseConfig, err := parseConfigBase(logger, c)
-	if err != nil {
-		return bindgen.BindGenGeneratorLocal{}, err
-	}
-	return bindgen.BindGenGeneratorLocal{
-		BindGenGeneratorBase: baseConfig,
-		SourceMapsList:       c.String(SourceMapsListFlagName),
-		ForgeArtifactsPath:   c.String(ForgeArtifactsFlagName),
-	}, nil
-}
-
-func parseConfigRemote(logger log.Logger, c *cli.Context) (bindgen.BindGenGeneratorRemote, error) {
-	baseConfig, err := parseConfigBase(logger, c)
-	if err != nil {
-		return bindgen.BindGenGeneratorRemote{}, err
-	}
-	generator := bindgen.BindGenGeneratorRemote{
-		BindGenGeneratorBase: baseConfig,
-	}
-
-	generator.ContractDataClients.Eth = etherscan.NewEthereumClient(c.String(EtherscanApiKeyEthFlagName))
-	generator.ContractDataClients.Op = etherscan.NewOptimismClient(c.String(EtherscanApiKeyOpFlagName))
-
-	if generator.RpcClients.Eth, err = ethclient.Dial(c.String(RpcUrlEthFlagName)); err != nil {
-		return bindgen.BindGenGeneratorRemote{}, fmt.Errorf("error initializing Ethereum client: %w", err)
-	}
-	if generator.RpcClients.Op, err = ethclient.Dial(c.String(RpcUrlOpFlagName)); err != nil {
-		return bindgen.BindGenGeneratorRemote{}, fmt.Errorf("error initializing Optimism client: %w", err)
-	}
-	return generator, nil
-}
-
-func baseFlags() []cli.Flag {
-	baseFlags := []cli.Flag{
-		&cli.StringFlag{
-			Name:     MetadataOutFlagName,
-			Usage:    "Output directory to put contract metadata files in",
-			Required: true,
-		},
-		&cli.StringFlag{
-			Name:     BindingsPackageNameFlagName,
-			Usage:    "Go package name given to generated bindings",
-			Required: true,
-		},
-		&cli.StringFlag{
-			Name:     ContractsListFlagName,
-			Usage:    "Path to file containing list of contract names to generate bindings for",
-			Required: true,
-		},
-	}
-
-	return append(baseFlags, oplog.CLIFlags("bindgen")...)
-}
-
-func localFlags() []cli.Flag {
-	return []cli.Flag{
-		&cli.StringFlag{
-			Name:  SourceMapsListFlagName,
-			Usage: "Comma-separated list of contracts to generate source-maps for",
-		},
-		&cli.StringFlag{
-			Name:     ForgeArtifactsFlagName,
-			Usage:    "Path to forge-artifacts directory, containing compiled contract artifacts",
-			Required: true,
-		},
-	}
-}
-
-func remoteFlags() []cli.Flag {
-	return []cli.Flag{
-		&cli.StringFlag{
-			Name:     EtherscanApiKeyEthFlagName,
-			Usage:    "API key to make queries to Etherscan for Ethereum",
-			Required: true,
-		},
-		&cli.StringFlag{
-			Name:     EtherscanApiKeyOpFlagName,
-			Usage:    "API key to make queries to Etherscan for Optimism",
-			Required: true,
-		},
-		&cli.StringFlag{
-			Name:     RpcUrlEthFlagName,
-			Usage:    "RPC URL (with API key if required) to query Ethereum",
-			Required: true,
-		},
-		&cli.StringFlag{
-			Name:     RpcUrlOpFlagName,
-			Usage:    "RPC URL (with API key if required) to query Optimism",
-			Required: true,
-		},
-	}
-}
diff --git a/op-bindings/doc.go b/op-bindings/doc.go
deleted file mode 100644
index 1e9f198168f0..000000000000
--- a/op-bindings/doc.go
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
-
-The contracts package provides Go bindings for our contracts.
-
-
-To regenerate the bindings, run `make`
-The following programs are required: `jq`, `abigen`, and `solc` (at version 0.8.10)
-*/
-
-package op_bindings
diff --git a/op-bindings/foundry/artifact.go b/op-bindings/foundry/artifact.go
deleted file mode 100644
index 6f2ca4e838ba..000000000000
--- a/op-bindings/foundry/artifact.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package foundry
-
-import (
-	"encoding/json"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-	"github.com/ethereum/go-ethereum/common/hexutil"
-)
-
-// Artifact represents a foundry compilation artifact.
-// The Abi is specifically left as a json.RawMessage because
-// round trip marshaling/unmarshalling of the abi.ABI type
-// causes issues.
-type Artifact struct {
-	Abi              json.RawMessage    `json:"abi"`
-	StorageLayout    solc.StorageLayout `json:"storageLayout"`
-	DeployedBytecode DeployedBytecode   `json:"deployedBytecode"`
-	Bytecode         Bytecode           `json:"bytecode"`
-}
-
-type DeployedBytecode struct {
-	SourceMap           string          `json:"sourceMap"`
-	Object              hexutil.Bytes   `json:"object"`
-	LinkReferences      json.RawMessage `json:"linkReferences"`
-	ImmutableReferences json.RawMessage `json:"immutableReferences"`
-}
-
-type Bytecode struct {
-	SourceMap      string          `json:"sourceMap"`
-	Object         hexutil.Bytes   `json:"object"`
-	LinkReferences json.RawMessage `json:"linkReferences"`
-}
diff --git a/op-bindings/hardhat/hardhat.go b/op-bindings/hardhat/hardhat.go
deleted file mode 100644
index 492bb0228d16..000000000000
--- a/op-bindings/hardhat/hardhat.go
+++ /dev/null
@@ -1,302 +0,0 @@
-package hardhat
-
-import (
-	"encoding/json"
-	"errors"
-	"fmt"
-	"io/fs"
-	"os"
-	"path/filepath"
-	"strings"
-	"sync"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-)
-
-var (
-	ErrCannotFindDeployment = errors.New("cannot find deployment")
-	ErrCannotFindArtifact   = errors.New("cannot find artifact")
-)
-
-// `Hardhat` encapsulates all of the functionality required to interact
-// with hardhat style artifacts.
-type Hardhat struct {
-	ArtifactPaths   []string
-	DeploymentPaths []string
-
-	network string
-
-	amu sync.Mutex
-	dmu sync.Mutex
-	bmu sync.Mutex
-
-	artifacts   []*Artifact
-	deployments []*Deployment
-	buildInfos  []*BuildInfo //nolint:unused
-}
-
-// New creates a new `Hardhat` struct and reads all of the files from
-// disk so that they are cached for the end user. A network is passed
-// that corresponds to the network that they deployments are associated
-// with. A slice of artifact paths and deployment paths are passed
-// so that a single `Hardhat` instance can operate on multiple sets
-// of artifacts and deployments. The deployments paths should be
-// the root of the deployments directory that contains additional
-// directories for each particular network.
-func New(network string, artifacts, deployments []string) (*Hardhat, error) {
-	hh := &Hardhat{
-		network:         network,
-		ArtifactPaths:   artifacts,
-		DeploymentPaths: deployments,
-	}
-
-	if err := hh.init(); err != nil {
-		return nil, err
-	}
-
-	return hh, nil
-}
-
-// init is called in the constructor and will cache required files to disk.
-func (h *Hardhat) init() error {
-	h.amu.Lock()
-	defer h.amu.Unlock()
-	h.dmu.Lock()
-	defer h.dmu.Unlock()
-
-	if err := h.initArtifacts(); err != nil {
-		return err
-	}
-	if err := h.initDeployments(); err != nil {
-		return err
-	}
-	return nil
-}
-
-// initDeployments reads all of the deployment json files from disk and then
-// caches the deserialized `Deployment` structs.
-func (h *Hardhat) initDeployments() error {
-	knownDeployments := make(map[string]string)
-	for _, deploymentPath := range h.DeploymentPaths {
-		fileSystem := os.DirFS(filepath.Join(deploymentPath, h.network))
-		err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
-			if err != nil {
-				return err
-			}
-			if d.IsDir() {
-				return nil
-			}
-			if strings.Contains(path, "solcInputs") {
-				return nil
-			}
-			if !strings.HasSuffix(path, ".json") {
-				return nil
-			}
-
-			name := filepath.Join(deploymentPath, h.network, path)
-			file, err := os.ReadFile(name)
-			if err != nil {
-				return err
-			}
-			var deployment Deployment
-			if err := json.Unmarshal(file, &deployment); err != nil {
-				return err
-			}
-
-			deployment.Name = filepath.Base(name[:len(name)-5])
-			if knownDeployments[deployment.Name] != "" {
-				return fmt.Errorf(
-					"discovered duplicate deployment %s. old: %s, new: %s",
-					deployment.Name,
-					knownDeployments[deployment.Name],
-					name,
-				)
-			}
-			h.deployments = append(h.deployments, &deployment)
-			knownDeployments[deployment.Name] = name
-			return nil
-		})
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// initArtifacts reads all of the artifact json files from disk and then caches
-// the deserialized `Artifact` structs.
-func (h *Hardhat) initArtifacts() error {
-	for _, artifactPath := range h.ArtifactPaths {
-		fileSystem := os.DirFS(artifactPath)
-		err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
-			if err != nil {
-				return err
-			}
-			if d.IsDir() {
-				return nil
-			}
-			name := filepath.Join(artifactPath, path)
-
-			if strings.Contains(name, "build-info") {
-				return nil
-			}
-			if strings.HasSuffix(name, ".dbg.json") {
-				return nil
-			}
-			file, err := os.ReadFile(name)
-			if err != nil {
-				return err
-			}
-			var artifact Artifact
-			if err := json.Unmarshal(file, &artifact); err != nil {
-				return err
-			}
-
-			h.artifacts = append(h.artifacts, &artifact)
-			return nil
-		})
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// GetArtifact returns the artifact that corresponds to the contract.
-// This method supports just the contract name and the fully qualified
-// contract name.
-func (h *Hardhat) GetArtifact(name string) (*Artifact, error) {
-	h.amu.Lock()
-	defer h.amu.Unlock()
-
-	if IsFullyQualifiedName(name) {
-		fqn := ParseFullyQualifiedName(name)
-		for _, artifact := range h.artifacts {
-			contractNameMatches := artifact.ContractName == fqn.ContractName
-			sourceNameMatches := artifact.SourceName == fqn.SourceName
-
-			if contractNameMatches && sourceNameMatches {
-				return artifact, nil
-			}
-		}
-		return nil, fmt.Errorf("%w: %s", ErrCannotFindArtifact, name)
-	}
-
-	for _, artifact := range h.artifacts {
-		if name == artifact.ContractName {
-			return artifact, nil
-		}
-	}
-
-	return nil, fmt.Errorf("%w: %s", ErrCannotFindArtifact, name)
-}
-
-// GetDeployment returns the deployment that corresponds to the contract.
-// It does not support fully qualified contract names.
-func (h *Hardhat) GetDeployment(name string) (*Deployment, error) {
-	h.dmu.Lock()
-	defer h.dmu.Unlock()
-
-	fqn := ParseFullyQualifiedName(name)
-	for _, deployment := range h.deployments {
-		if deployment.Name == fqn.ContractName {
-			return deployment, nil
-		}
-	}
-
-	return nil, fmt.Errorf("%w: %s", ErrCannotFindDeployment, name)
-}
-
-// GetBuildInfo returns the build info that corresponds to the contract.
-// It does not support fully qualified contract names.
-func (h *Hardhat) GetBuildInfo(name string) (*BuildInfo, error) {
-	h.bmu.Lock()
-	defer h.bmu.Unlock()
-
-	fqn := ParseFullyQualifiedName(name)
-	buildInfos := make([]*BuildInfo, 0)
-
-	for _, artifactPath := range h.ArtifactPaths {
-		fileSystem := os.DirFS(artifactPath)
-		err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
-			if err != nil {
-				return err
-			}
-			if d.IsDir() {
-				return nil
-			}
-			name := filepath.Join(artifactPath, path)
-
-			if !strings.HasSuffix(name, ".dbg.json") {
-				return nil
-			}
-
-			// Remove ".dbg.json"
-			target := filepath.Base(name[:len(name)-9])
-			if fqn.ContractName != target {
-				return nil
-			}
-
-			file, err := os.ReadFile(name)
-			if err != nil {
-				return err
-			}
-			var debugFile DebugFile
-			if err := json.Unmarshal(file, &debugFile); err != nil {
-				return err
-			}
-			relPath := filepath.Join(filepath.Dir(name), debugFile.BuildInfo)
-			if err != nil {
-				return err
-			}
-			debugPath, _ := filepath.Abs(relPath)
-
-			buildInfoFile, err := os.ReadFile(debugPath)
-			if err != nil {
-				return err
-			}
-
-			var buildInfo BuildInfo
-			if err := json.Unmarshal(buildInfoFile, &buildInfo); err != nil {
-				return err
-			}
-
-			buildInfos = append(buildInfos, &buildInfo)
-
-			return nil
-		})
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	// TODO(tynes): handle multiple contracts with same name when required
-	if len(buildInfos) > 1 {
-		return nil, fmt.Errorf("Multiple contracts with name %s", name)
-	}
-	if len(buildInfos) == 0 {
-		return nil, fmt.Errorf("Cannot find BuildInfo for %s", name)
-	}
-
-	return buildInfos[0], nil
-}
-
-// TODO(tynes): handle fully qualified names properly
-func (h *Hardhat) GetStorageLayout(name string) (*solc.StorageLayout, error) {
-	fqn := ParseFullyQualifiedName(name)
-
-	buildInfo, err := h.GetBuildInfo(name)
-	if err != nil {
-		return nil, err
-	}
-
-	for _, source := range buildInfo.Output.Contracts {
-		for name, contract := range source {
-			if name == fqn.ContractName {
-				return &contract.StorageLayout, nil
-			}
-		}
-	}
-
-	return nil, fmt.Errorf("contract not found for %s", fqn.ContractName)
-}
diff --git a/op-bindings/hardhat/hardhat_test.go b/op-bindings/hardhat/hardhat_test.go
deleted file mode 100644
index d111cb1d0cff..000000000000
--- a/op-bindings/hardhat/hardhat_test.go
+++ /dev/null
@@ -1,176 +0,0 @@
-package hardhat_test
-
-import (
-	"testing"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/hardhat"
-
-	"github.com/stretchr/testify/require"
-)
-
-func TestGetFullyQualifiedName(t *testing.T) {
-	t.Parallel()
-
-	cases := []struct {
-		fqn    hardhat.QualifiedName
-		expect string
-	}{
-		{
-			fqn:    hardhat.QualifiedName{"contract.sol", "C"},
-			expect: "contract.sol:C",
-		},
-		{
-			fqn:    hardhat.QualifiedName{"folder/contract.sol", "C"},
-			expect: "folder/contract.sol:C",
-		},
-		{
-			fqn:    hardhat.QualifiedName{"folder/a:b/contract.sol", "C"},
-			expect: "folder/a:b/contract.sol:C",
-		},
-	}
-
-	for _, test := range cases {
-		got := hardhat.GetFullyQualifiedName(test.fqn.SourceName, test.fqn.ContractName)
-		require.Equal(t, got, test.expect)
-	}
-}
-
-func TestParseFullyQualifiedName(t *testing.T) {
-	t.Parallel()
-
-	cases := []struct {
-		fqn    string
-		expect hardhat.QualifiedName
-	}{
-		{
-			fqn:    "contract.sol:C",
-			expect: hardhat.QualifiedName{"contract.sol", "C"},
-		},
-		{
-			fqn:    "folder/contract.sol:C",
-			expect: hardhat.QualifiedName{"folder/contract.sol", "C"},
-		},
-		{
-			fqn:    "folder/a:b/contract.sol:C",
-			expect: hardhat.QualifiedName{"folder/a:b/contract.sol", "C"},
-		},
-	}
-
-	for _, test := range cases {
-		got := hardhat.ParseFullyQualifiedName(test.fqn)
-		require.Equal(t, got, test.expect)
-	}
-}
-
-func TestIsFullyQualifiedName(t *testing.T) {
-	t.Parallel()
-
-	cases := []struct {
-		fqn    string
-		expect bool
-	}{
-		{
-			fqn:    "contract.sol:C",
-			expect: true,
-		},
-		{
-			fqn:    "folder/contract.sol:C",
-			expect: true,
-		},
-		{
-			fqn:    "folder/a:b/contract.sol:C",
-			expect: true,
-		},
-		{
-			fqn:    "C",
-			expect: false,
-		},
-		{
-			fqn:    "contract.sol",
-			expect: false,
-		},
-		{
-			fqn:    "folder/contract.sol",
-			expect: false,
-		},
-	}
-
-	for _, test := range cases {
-		got := hardhat.IsFullyQualifiedName(test.fqn)
-		require.Equal(t, got, test.expect)
-	}
-}
-
-func TestHardhatGetArtifact(t *testing.T) {
-	t.Parallel()
-
-	hh, err := hardhat.New(
-		"goerli",
-		[]string{"testdata/artifacts"},
-		[]string{"testdata/deployments"},
-	)
-	require.Nil(t, err)
-
-	artifact, err := hh.GetArtifact("HelloWorld")
-	require.Nil(t, err)
-	require.NotNil(t, artifact)
-}
-
-func TestHardhatGetBuildInfo(t *testing.T) {
-	t.Parallel()
-
-	hh, err := hardhat.New(
-		"goerli",
-		[]string{"testdata/artifacts"},
-		[]string{"testdata/deployments"},
-	)
-	require.Nil(t, err)
-
-	buildInfo, err := hh.GetBuildInfo("HelloWorld")
-	require.Nil(t, err)
-	require.NotNil(t, buildInfo)
-}
-
-func TestHardhatGetDeployments(t *testing.T) {
-	t.Parallel()
-
-	hh, err := hardhat.New(
-		"goerli",
-		[]string{"testdata/artifacts"},
-		[]string{"testdata/deployments"},
-	)
-	require.Nil(t, err)
-
-	deployment, err := hh.GetDeployment("OptimismPortal")
-	require.Nil(t, err)
-	require.NotNil(t, deployment)
-}
-
-func TestHardhatGetDeploymentsDuplicates(t *testing.T) {
-	t.Parallel()
-
-	// Set the network to an empty string to simulate
-	// an invalid network name.
-	_, err := hardhat.New(
-		"",
-		[]string{"testdata/artifacts"},
-		[]string{"testdata/deployments"},
-	)
-	require.Error(t, err)
-	require.Contains(t, err.Error(), "duplicate deployment")
-}
-
-func TestHardhatGetStorageLayout(t *testing.T) {
-	t.Parallel()
-
-	hh, err := hardhat.New(
-		"goerli",
-		[]string{"testdata/artifacts"},
-		[]string{"testdata/deployments"},
-	)
-	require.Nil(t, err)
-
-	storageLayout, err := hh.GetStorageLayout("HelloWorld")
-	require.Nil(t, err)
-	require.NotNil(t, storageLayout)
-}
diff --git a/op-bindings/hardhat/testdata/artifacts/build-info/41b5106372a301360350245ee188494f.json b/op-bindings/hardhat/testdata/artifacts/build-info/41b5106372a301360350245ee188494f.json
deleted file mode 100644
index 9d083c7431e4..000000000000
--- a/op-bindings/hardhat/testdata/artifacts/build-info/41b5106372a301360350245ee188494f.json
+++ /dev/null
@@ -1,3076 +0,0 @@
-{
-  "id": "41b5106372a301360350245ee188494f",
-  "_format": "hh-sol-build-info-1",
-  "solcVersion": "0.8.15",
-  "solcLongVersion": "0.8.15+commit.e14f2714",
-  "input": {
-    "language": "Solidity",
-    "sources": {
-      "contracts/HelloWorld.sol": {
-        "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\ncontract HelloWorld {\n    uint256 public time;\n    address public addr;\n    bool public boolean;\n    mapping(uint256 => address) public addresses;\n\n    uint8 public small;\n\n    constructor() {\n        time = block.timestamp;\n    }\n\n    function gm() external returns (uint256) {\n        uint256 prev = time;\n        time = block.timestamp;\n        return prev;\n    }\n}\n"
-      }
-    },
-    "settings": {
-      "optimizer": {
-        "enabled": true,
-        "runs": 200
-      },
-      "metadata": {
-        "bytecodeHash": "none"
-      },
-      "outputSelection": {
-        "*": {
-          "*": [
-            "*",
-            "storageLayout",
-            "abi",
-            "evm.bytecode",
-            "evm.deployedBytecode",
-            "evm.methodIdentifiers",
-            "metadata"
-          ],
-          "": [
-            "ast"
-          ]
-        }
-      }
-    }
-  },
-  "output": {
-    "contracts": {
-      "contracts/HelloWorld.sol": {
-        "HelloWorld": {
-          "abi": [
-            {
-              "inputs": [],
-              "stateMutability": "nonpayable",
-              "type": "constructor"
-            },
-            {
-              "inputs": [],
-              "name": "addr",
-              "outputs": [
-                {
-                  "internalType": "address",
-                  "name": "",
-                  "type": "address"
-                }
-              ],
-              "stateMutability": "view",
-              "type": "function"
-            },
-            {
-              "inputs": [
-                {
-                  "internalType": "uint256",
-                  "name": "",
-                  "type": "uint256"
-                }
-              ],
-              "name": "addresses",
-              "outputs": [
-                {
-                  "internalType": "address",
-                  "name": "",
-                  "type": "address"
-                }
-              ],
-              "stateMutability": "view",
-              "type": "function"
-            },
-            {
-              "inputs": [],
-              "name": "boolean",
-              "outputs": [
-                {
-                  "internalType": "bool",
-                  "name": "",
-                  "type": "bool"
-                }
-              ],
-              "stateMutability": "view",
-              "type": "function"
-            },
-            {
-              "inputs": [],
-              "name": "gm",
-              "outputs": [
-                {
-                  "internalType": "uint256",
-                  "name": "",
-                  "type": "uint256"
-                }
-              ],
-              "stateMutability": "nonpayable",
-              "type": "function"
-            },
-            {
-              "inputs": [],
-              "name": "small",
-              "outputs": [
-                {
-                  "internalType": "uint8",
-                  "name": "",
-                  "type": "uint8"
-                }
-              ],
-              "stateMutability": "view",
-              "type": "function"
-            },
-            {
-              "inputs": [],
-              "name": "time",
-              "outputs": [
-                {
-                  "internalType": "uint256",
-                  "name": "",
-                  "type": "uint256"
-                }
-              ],
-              "stateMutability": "view",
-              "type": "function"
-            }
-          ],
-          "devdoc": {
-            "kind": "dev",
-            "methods": {},
-            "version": 1
-          },
-          "evm": {
-            "assembly": "    /* \"contracts/HelloWorld.sol\":57:425  contract HelloWorld {... */\n  mstore(0x40, 0x80)\n    /* \"contracts/HelloWorld.sol\":234:287  constructor() {... */\n  callvalue\n  dup1\n  iszero\n  tag_1\n  jumpi\n  0x00\n  dup1\n  revert\ntag_1:\n  pop\n    /* \"contracts/HelloWorld.sol\":265:280  block.timestamp */\n  timestamp\n    /* \"contracts/HelloWorld.sol\":258:262  time */\n  0x00\n    /* \"contracts/HelloWorld.sol\":258:280  time = block.timestamp */\n  sstore\n    /* \"contracts/HelloWorld.sol\":57:425  contract HelloWorld {... */\n  dataSize(sub_0)\n  dup1\n  dataOffset(sub_0)\n  0x00\n  codecopy\n  0x00\n  return\nstop\n\nsub_0: assembly {\n        /* \"contracts/HelloWorld.sol\":57:425  contract HelloWorld {... */\n      mstore(0x40, 0x80)\n      callvalue\n      dup1\n      iszero\n      tag_1\n      jumpi\n      0x00\n      dup1\n      revert\n    tag_1:\n      pop\n      jumpi(tag_2, lt(calldatasize, 0x04))\n      shr(0xe0, calldataload(0x00))\n      dup1\n      0x16ada547\n      eq\n      tag_3\n      jumpi\n      dup1\n      0x6cf3c25e\n      eq\n      tag_4\n      jumpi\n      dup1\n      0x767800de\n      eq\n      tag_5\n      jumpi\n      dup1\n      0xc0129d43\n      eq\n      tag_6\n      jumpi\n      dup1\n      0xc5b57bdb\n      eq\n      tag_7\n      jumpi\n      dup1\n      0xedf26d9b\n      eq\n      tag_8\n      jumpi\n    tag_2:\n      0x00\n      dup1\n      revert\n        /* \"contracts/HelloWorld.sol\":83:102  uint256 public time */\n    tag_3:\n      tag_9\n      sload(0x00)\n      dup2\n      jump\n    tag_9:\n      mload(0x40)\n        /* \"#utility.yul\":160:185   */\n      swap1\n      dup2\n      mstore\n        /* \"#utility.yul\":148:150   */\n      0x20\n        /* \"#utility.yul\":133:151   */\n      add\n        /* \"contracts/HelloWorld.sol\":83:102  uint256 public time */\n    tag_11:\n      mload(0x40)\n      dup1\n      swap2\n      sub\n      swap1\n      return\n        /* \"contracts/HelloWorld.sol\":209:227  uint8 public small */\n    tag_4:\n      sload(0x03)\n      tag_13\n      swap1\n      0xff\n      and\n      dup2\n      jump\n    tag_13:\n      mload(0x40)\n        /* \"#utility.yul\":368:372   */\n      0xff\n        /* \"#utility.yul\":356:373   */\n      swap1\n      swap2\n      and\n        /* \"#utility.yul\":338:374   */\n      dup2\n      mstore\n        /* \"#utility.yul\":326:328   */\n      0x20\n        /* \"#utility.yul\":311:329   */\n      add\n        /* \"contracts/HelloWorld.sol\":209:227  uint8 public small */\n      tag_11\n        /* \"#utility.yul\":196:380   */\n      jump\n        /* \"contracts/HelloWorld.sol\":108:127  address public addr */\n    tag_5:\n      sload(0x01)\n      tag_17\n      swap1\n      sub(shl(0xa0, 0x01), 0x01)\n      and\n      dup2\n      jump\n    tag_17:\n      mload(0x40)\n      sub(shl(0xa0, 0x01), 0x01)\n        /* \"#utility.yul\":549:581   */\n      swap1\n      swap2\n      and\n        /* \"#utility.yul\":531:582   */\n      dup2\n      mstore\n        /* \"#utility.yul\":519:521   */\n      0x20\n        /* \"#utility.yul\":504:522   */\n      add\n        /* \"contracts/HelloWorld.sol\":108:127  address public addr */\n      tag_11\n        /* \"#utility.yul\":385:588   */\n      jump\n        /* \"contracts/HelloWorld.sol\":293:423  function gm() external returns (uint256) {... */\n    tag_6:\n        /* \"contracts/HelloWorld.sol\":325:332  uint256 */\n      0x00\n        /* \"contracts/HelloWorld.sol\":359:363  time */\n      dup1\n      sload\n        /* \"contracts/HelloWorld.sol\":380:395  block.timestamp */\n      timestamp\n        /* \"contracts/HelloWorld.sol\":373:395  time = block.timestamp */\n      swap1\n      swap2\n      sstore\n        /* \"contracts/HelloWorld.sol\":293:423  function gm() external returns (uint256) {... */\n      jump(tag_9)\n        /* \"contracts/HelloWorld.sol\":133:152  bool public boolean */\n    tag_7:\n      sload(0x01)\n      tag_24\n      swap1\n      shl(0xa0, 0x01)\n      swap1\n      div\n      0xff\n      and\n      dup2\n      jump\n    tag_24:\n      mload(0x40)\n        /* \"#utility.yul\":758:772   */\n      swap1\n      iszero\n        /* \"#utility.yul\":751:773   */\n      iszero\n        /* \"#utility.yul\":733:774   */\n      dup2\n      mstore\n        /* \"#utility.yul\":721:723   */\n      0x20\n        /* \"#utility.yul\":706:724   */\n      add\n        /* \"contracts/HelloWorld.sol\":133:152  bool public boolean */\n      tag_11\n        /* \"#utility.yul\":593:780   */\n      jump\n        /* \"contracts/HelloWorld.sol\":158:202  mapping(uint256 => address) public addresses */\n    tag_8:\n      tag_17\n      tag_29\n      calldatasize\n      0x04\n      tag_30\n      jump\t// in\n    tag_29:\n      mstore(0x20, 0x02)\n      0x00\n      swap1\n      dup2\n      mstore\n      0x40\n      swap1\n      keccak256\n      sload\n      sub(shl(0xa0, 0x01), 0x01)\n      and\n      dup2\n      jump\n        /* \"#utility.yul\":785:965   */\n    tag_30:\n        /* \"#utility.yul\":844:850   */\n      0x00\n        /* \"#utility.yul\":897:899   */\n      0x20\n        /* \"#utility.yul\":885:894   */\n      dup3\n        /* \"#utility.yul\":876:883   */\n      dup5\n        /* \"#utility.yul\":872:895   */\n      sub\n        /* \"#utility.yul\":868:900   */\n      slt\n        /* \"#utility.yul\":865:917   */\n      iszero\n      tag_40\n      jumpi\n        /* \"#utility.yul\":913:914   */\n      0x00\n        /* \"#utility.yul\":910:911   */\n      dup1\n        /* \"#utility.yul\":903:915   */\n      revert\n        /* \"#utility.yul\":865:917   */\n    tag_40:\n      pop\n        /* \"#utility.yul\":936:959   */\n      calldataload\n      swap2\n        /* \"#utility.yul\":785:965   */\n      swap1\n      pop\n      jump\t// out\n\n    auxdata: 0xa164736f6c634300080f000a\n}\n",
-            "bytecode": {
-              "functionDebugData": {
-                "@_22": {
-                  "entryPoint": null,
-                  "id": 22,
-                  "parameterSlots": 0,
-                  "returnSlots": 0
-                }
-              },
-              "generatedSources": [],
-              "linkReferences": {},
-              "object": "608060405234801561001057600080fd5b504260005561014d806100246000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806316ada547146100675780636cf3c25e14610083578063767800de146100a2578063c0129d43146100cd578063c5b57bdb146100da578063edf26d9b146100fe575b600080fd5b61007060005481565b6040519081526020015b60405180910390f35b6003546100909060ff1681565b60405160ff909116815260200161007a565b6001546100b5906001600160a01b031681565b6040516001600160a01b03909116815260200161007a565b6000805442909155610070565b6001546100ee90600160a01b900460ff1681565b604051901515815260200161007a565b6100b561010c366004610127565b6002602052600090815260409020546001600160a01b031681565b60006020828403121561013957600080fd5b503591905056fea164736f6c634300080f000a",
-              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP TIMESTAMP PUSH1 0x0 SSTORE PUSH2 0x14D DUP1 PUSH2 0x24 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x62 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x16ADA547 EQ PUSH2 0x67 JUMPI DUP1 PUSH4 0x6CF3C25E EQ PUSH2 0x83 JUMPI DUP1 PUSH4 0x767800DE EQ PUSH2 0xA2 JUMPI DUP1 PUSH4 0xC0129D43 EQ PUSH2 0xCD JUMPI DUP1 PUSH4 0xC5B57BDB EQ PUSH2 0xDA JUMPI DUP1 PUSH4 0xEDF26D9B EQ PUSH2 0xFE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x70 PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x90 SWAP1 PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x7A JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0xB5 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x7A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD TIMESTAMP SWAP1 SWAP2 SSTORE PUSH2 0x70 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0xEE SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x7A JUMP JUMPDEST PUSH2 0xB5 PUSH2 0x10C CALLDATASIZE PUSH1 0x4 PUSH2 0x127 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x139 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP INVALID LOG1 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP EXP ",
-              "sourceMap": "57:368:0:-:0;;;234:53;;;;;;;;;-1:-1:-1;265:15:0;258:4;:22;57:368;;;;;;"
-            },
-            "deployedBytecode": {
-              "functionDebugData": {
-                "@addr_5": {
-                  "entryPoint": null,
-                  "id": 5,
-                  "parameterSlots": 0,
-                  "returnSlots": 0
-                },
-                "@addresses_11": {
-                  "entryPoint": null,
-                  "id": 11,
-                  "parameterSlots": 0,
-                  "returnSlots": 0
-                },
-                "@boolean_7": {
-                  "entryPoint": null,
-                  "id": 7,
-                  "parameterSlots": 0,
-                  "returnSlots": 0
-                },
-                "@gm_39": {
-                  "entryPoint": null,
-                  "id": 39,
-                  "parameterSlots": 0,
-                  "returnSlots": 1
-                },
-                "@small_13": {
-                  "entryPoint": null,
-                  "id": 13,
-                  "parameterSlots": 0,
-                  "returnSlots": 0
-                },
-                "@time_3": {
-                  "entryPoint": null,
-                  "id": 3,
-                  "parameterSlots": 0,
-                  "returnSlots": 0
-                },
-                "abi_decode_tuple_t_uint256": {
-                  "entryPoint": 295,
-                  "id": null,
-                  "parameterSlots": 2,
-                  "returnSlots": 1
-                },
-                "abi_encode_tuple_t_address__to_t_address__fromStack_reversed": {
-                  "entryPoint": null,
-                  "id": null,
-                  "parameterSlots": 2,
-                  "returnSlots": 1
-                },
-                "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed": {
-                  "entryPoint": null,
-                  "id": null,
-                  "parameterSlots": 2,
-                  "returnSlots": 1
-                },
-                "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": {
-                  "entryPoint": null,
-                  "id": null,
-                  "parameterSlots": 2,
-                  "returnSlots": 1
-                },
-                "abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed": {
-                  "entryPoint": null,
-                  "id": null,
-                  "parameterSlots": 2,
-                  "returnSlots": 1
-                }
-              },
-              "generatedSources": [
-                {
-                  "ast": {
-                    "nodeType": "YulBlock",
-                    "src": "0:967:1",
-                    "statements": [
-                      {
-                        "nodeType": "YulBlock",
-                        "src": "6:3:1",
-                        "statements": []
-                      },
-                      {
-                        "body": {
-                          "nodeType": "YulBlock",
-                          "src": "115:76:1",
-                          "statements": [
-                            {
-                              "nodeType": "YulAssignment",
-                              "src": "125:26:1",
-                              "value": {
-                                "arguments": [
-                                  {
-                                    "name": "headStart",
-                                    "nodeType": "YulIdentifier",
-                                    "src": "137:9:1"
-                                  },
-                                  {
-                                    "kind": "number",
-                                    "nodeType": "YulLiteral",
-                                    "src": "148:2:1",
-                                    "type": "",
-                                    "value": "32"
-                                  }
-                                ],
-                                "functionName": {
-                                  "name": "add",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "133:3:1"
-                                },
-                                "nodeType": "YulFunctionCall",
-                                "src": "133:18:1"
-                              },
-                              "variableNames": [
-                                {
-                                  "name": "tail",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "125:4:1"
-                                }
-                              ]
-                            },
-                            {
-                              "expression": {
-                                "arguments": [
-                                  {
-                                    "name": "headStart",
-                                    "nodeType": "YulIdentifier",
-                                    "src": "167:9:1"
-                                  },
-                                  {
-                                    "name": "value0",
-                                    "nodeType": "YulIdentifier",
-                                    "src": "178:6:1"
-                                  }
-                                ],
-                                "functionName": {
-                                  "name": "mstore",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "160:6:1"
-                                },
-                                "nodeType": "YulFunctionCall",
-                                "src": "160:25:1"
-                              },
-                              "nodeType": "YulExpressionStatement",
-                              "src": "160:25:1"
-                            }
-                          ]
-                        },
-                        "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed",
-                        "nodeType": "YulFunctionDefinition",
-                        "parameters": [
-                          {
-                            "name": "headStart",
-                            "nodeType": "YulTypedName",
-                            "src": "84:9:1",
-                            "type": ""
-                          },
-                          {
-                            "name": "value0",
-                            "nodeType": "YulTypedName",
-                            "src": "95:6:1",
-                            "type": ""
-                          }
-                        ],
-                        "returnVariables": [
-                          {
-                            "name": "tail",
-                            "nodeType": "YulTypedName",
-                            "src": "106:4:1",
-                            "type": ""
-                          }
-                        ],
-                        "src": "14:177:1"
-                      },
-                      {
-                        "body": {
-                          "nodeType": "YulBlock",
-                          "src": "293:87:1",
-                          "statements": [
-                            {
-                              "nodeType": "YulAssignment",
-                              "src": "303:26:1",
-                              "value": {
-                                "arguments": [
-                                  {
-                                    "name": "headStart",
-                                    "nodeType": "YulIdentifier",
-                                    "src": "315:9:1"
-                                  },
-                                  {
-                                    "kind": "number",
-                                    "nodeType": "YulLiteral",
-                                    "src": "326:2:1",
-                                    "type": "",
-                                    "value": "32"
-                                  }
-                                ],
-                                "functionName": {
-                                  "name": "add",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "311:3:1"
-                                },
-                                "nodeType": "YulFunctionCall",
-                                "src": "311:18:1"
-                              },
-                              "variableNames": [
-                                {
-                                  "name": "tail",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "303:4:1"
-                                }
-                              ]
-                            },
-                            {
-                              "expression": {
-                                "arguments": [
-                                  {
-                                    "name": "headStart",
-                                    "nodeType": "YulIdentifier",
-                                    "src": "345:9:1"
-                                  },
-                                  {
-                                    "arguments": [
-                                      {
-                                        "name": "value0",
-                                        "nodeType": "YulIdentifier",
-                                        "src": "360:6:1"
-                                      },
-                                      {
-                                        "kind": "number",
-                                        "nodeType": "YulLiteral",
-                                        "src": "368:4:1",
-                                        "type": "",
-                                        "value": "0xff"
-                                      }
-                                    ],
-                                    "functionName": {
-                                      "name": "and",
-                                      "nodeType": "YulIdentifier",
-                                      "src": "356:3:1"
-                                    },
-                                    "nodeType": "YulFunctionCall",
-                                    "src": "356:17:1"
-                                  }
-                                ],
-                                "functionName": {
-                                  "name": "mstore",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "338:6:1"
-                                },
-                                "nodeType": "YulFunctionCall",
-                                "src": "338:36:1"
-                              },
-                              "nodeType": "YulExpressionStatement",
-                              "src": "338:36:1"
-                            }
-                          ]
-                        },
-                        "name": "abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed",
-                        "nodeType": "YulFunctionDefinition",
-                        "parameters": [
-                          {
-                            "name": "headStart",
-                            "nodeType": "YulTypedName",
-                            "src": "262:9:1",
-                            "type": ""
-                          },
-                          {
-                            "name": "value0",
-                            "nodeType": "YulTypedName",
-                            "src": "273:6:1",
-                            "type": ""
-                          }
-                        ],
-                        "returnVariables": [
-                          {
-                            "name": "tail",
-                            "nodeType": "YulTypedName",
-                            "src": "284:4:1",
-                            "type": ""
-                          }
-                        ],
-                        "src": "196:184:1"
-                      },
-                      {
-                        "body": {
-                          "nodeType": "YulBlock",
-                          "src": "486:102:1",
-                          "statements": [
-                            {
-                              "nodeType": "YulAssignment",
-                              "src": "496:26:1",
-                              "value": {
-                                "arguments": [
-                                  {
-                                    "name": "headStart",
-                                    "nodeType": "YulIdentifier",
-                                    "src": "508:9:1"
-                                  },
-                                  {
-                                    "kind": "number",
-                                    "nodeType": "YulLiteral",
-                                    "src": "519:2:1",
-                                    "type": "",
-                                    "value": "32"
-                                  }
-                                ],
-                                "functionName": {
-                                  "name": "add",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "504:3:1"
-                                },
-                                "nodeType": "YulFunctionCall",
-                                "src": "504:18:1"
-                              },
-                              "variableNames": [
-                                {
-                                  "name": "tail",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "496:4:1"
-                                }
-                              ]
-                            },
-                            {
-                              "expression": {
-                                "arguments": [
-                                  {
-                                    "name": "headStart",
-                                    "nodeType": "YulIdentifier",
-                                    "src": "538:9:1"
-                                  },
-                                  {
-                                    "arguments": [
-                                      {
-                                        "name": "value0",
-                                        "nodeType": "YulIdentifier",
-                                        "src": "553:6:1"
-                                      },
-                                      {
-                                        "arguments": [
-                                          {
-                                            "arguments": [
-                                              {
-                                                "kind": "number",
-                                                "nodeType": "YulLiteral",
-                                                "src": "569:3:1",
-                                                "type": "",
-                                                "value": "160"
-                                              },
-                                              {
-                                                "kind": "number",
-                                                "nodeType": "YulLiteral",
-                                                "src": "574:1:1",
-                                                "type": "",
-                                                "value": "1"
-                                              }
-                                            ],
-                                            "functionName": {
-                                              "name": "shl",
-                                              "nodeType": "YulIdentifier",
-                                              "src": "565:3:1"
-                                            },
-                                            "nodeType": "YulFunctionCall",
-                                            "src": "565:11:1"
-                                          },
-                                          {
-                                            "kind": "number",
-                                            "nodeType": "YulLiteral",
-                                            "src": "578:1:1",
-                                            "type": "",
-                                            "value": "1"
-                                          }
-                                        ],
-                                        "functionName": {
-                                          "name": "sub",
-                                          "nodeType": "YulIdentifier",
-                                          "src": "561:3:1"
-                                        },
-                                        "nodeType": "YulFunctionCall",
-                                        "src": "561:19:1"
-                                      }
-                                    ],
-                                    "functionName": {
-                                      "name": "and",
-                                      "nodeType": "YulIdentifier",
-                                      "src": "549:3:1"
-                                    },
-                                    "nodeType": "YulFunctionCall",
-                                    "src": "549:32:1"
-                                  }
-                                ],
-                                "functionName": {
-                                  "name": "mstore",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "531:6:1"
-                                },
-                                "nodeType": "YulFunctionCall",
-                                "src": "531:51:1"
-                              },
-                              "nodeType": "YulExpressionStatement",
-                              "src": "531:51:1"
-                            }
-                          ]
-                        },
-                        "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed",
-                        "nodeType": "YulFunctionDefinition",
-                        "parameters": [
-                          {
-                            "name": "headStart",
-                            "nodeType": "YulTypedName",
-                            "src": "455:9:1",
-                            "type": ""
-                          },
-                          {
-                            "name": "value0",
-                            "nodeType": "YulTypedName",
-                            "src": "466:6:1",
-                            "type": ""
-                          }
-                        ],
-                        "returnVariables": [
-                          {
-                            "name": "tail",
-                            "nodeType": "YulTypedName",
-                            "src": "477:4:1",
-                            "type": ""
-                          }
-                        ],
-                        "src": "385:203:1"
-                      },
-                      {
-                        "body": {
-                          "nodeType": "YulBlock",
-                          "src": "688:92:1",
-                          "statements": [
-                            {
-                              "nodeType": "YulAssignment",
-                              "src": "698:26:1",
-                              "value": {
-                                "arguments": [
-                                  {
-                                    "name": "headStart",
-                                    "nodeType": "YulIdentifier",
-                                    "src": "710:9:1"
-                                  },
-                                  {
-                                    "kind": "number",
-                                    "nodeType": "YulLiteral",
-                                    "src": "721:2:1",
-                                    "type": "",
-                                    "value": "32"
-                                  }
-                                ],
-                                "functionName": {
-                                  "name": "add",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "706:3:1"
-                                },
-                                "nodeType": "YulFunctionCall",
-                                "src": "706:18:1"
-                              },
-                              "variableNames": [
-                                {
-                                  "name": "tail",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "698:4:1"
-                                }
-                              ]
-                            },
-                            {
-                              "expression": {
-                                "arguments": [
-                                  {
-                                    "name": "headStart",
-                                    "nodeType": "YulIdentifier",
-                                    "src": "740:9:1"
-                                  },
-                                  {
-                                    "arguments": [
-                                      {
-                                        "arguments": [
-                                          {
-                                            "name": "value0",
-                                            "nodeType": "YulIdentifier",
-                                            "src": "765:6:1"
-                                          }
-                                        ],
-                                        "functionName": {
-                                          "name": "iszero",
-                                          "nodeType": "YulIdentifier",
-                                          "src": "758:6:1"
-                                        },
-                                        "nodeType": "YulFunctionCall",
-                                        "src": "758:14:1"
-                                      }
-                                    ],
-                                    "functionName": {
-                                      "name": "iszero",
-                                      "nodeType": "YulIdentifier",
-                                      "src": "751:6:1"
-                                    },
-                                    "nodeType": "YulFunctionCall",
-                                    "src": "751:22:1"
-                                  }
-                                ],
-                                "functionName": {
-                                  "name": "mstore",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "733:6:1"
-                                },
-                                "nodeType": "YulFunctionCall",
-                                "src": "733:41:1"
-                              },
-                              "nodeType": "YulExpressionStatement",
-                              "src": "733:41:1"
-                            }
-                          ]
-                        },
-                        "name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed",
-                        "nodeType": "YulFunctionDefinition",
-                        "parameters": [
-                          {
-                            "name": "headStart",
-                            "nodeType": "YulTypedName",
-                            "src": "657:9:1",
-                            "type": ""
-                          },
-                          {
-                            "name": "value0",
-                            "nodeType": "YulTypedName",
-                            "src": "668:6:1",
-                            "type": ""
-                          }
-                        ],
-                        "returnVariables": [
-                          {
-                            "name": "tail",
-                            "nodeType": "YulTypedName",
-                            "src": "679:4:1",
-                            "type": ""
-                          }
-                        ],
-                        "src": "593:187:1"
-                      },
-                      {
-                        "body": {
-                          "nodeType": "YulBlock",
-                          "src": "855:110:1",
-                          "statements": [
-                            {
-                              "body": {
-                                "nodeType": "YulBlock",
-                                "src": "901:16:1",
-                                "statements": [
-                                  {
-                                    "expression": {
-                                      "arguments": [
-                                        {
-                                          "kind": "number",
-                                          "nodeType": "YulLiteral",
-                                          "src": "910:1:1",
-                                          "type": "",
-                                          "value": "0"
-                                        },
-                                        {
-                                          "kind": "number",
-                                          "nodeType": "YulLiteral",
-                                          "src": "913:1:1",
-                                          "type": "",
-                                          "value": "0"
-                                        }
-                                      ],
-                                      "functionName": {
-                                        "name": "revert",
-                                        "nodeType": "YulIdentifier",
-                                        "src": "903:6:1"
-                                      },
-                                      "nodeType": "YulFunctionCall",
-                                      "src": "903:12:1"
-                                    },
-                                    "nodeType": "YulExpressionStatement",
-                                    "src": "903:12:1"
-                                  }
-                                ]
-                              },
-                              "condition": {
-                                "arguments": [
-                                  {
-                                    "arguments": [
-                                      {
-                                        "name": "dataEnd",
-                                        "nodeType": "YulIdentifier",
-                                        "src": "876:7:1"
-                                      },
-                                      {
-                                        "name": "headStart",
-                                        "nodeType": "YulIdentifier",
-                                        "src": "885:9:1"
-                                      }
-                                    ],
-                                    "functionName": {
-                                      "name": "sub",
-                                      "nodeType": "YulIdentifier",
-                                      "src": "872:3:1"
-                                    },
-                                    "nodeType": "YulFunctionCall",
-                                    "src": "872:23:1"
-                                  },
-                                  {
-                                    "kind": "number",
-                                    "nodeType": "YulLiteral",
-                                    "src": "897:2:1",
-                                    "type": "",
-                                    "value": "32"
-                                  }
-                                ],
-                                "functionName": {
-                                  "name": "slt",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "868:3:1"
-                                },
-                                "nodeType": "YulFunctionCall",
-                                "src": "868:32:1"
-                              },
-                              "nodeType": "YulIf",
-                              "src": "865:52:1"
-                            },
-                            {
-                              "nodeType": "YulAssignment",
-                              "src": "926:33:1",
-                              "value": {
-                                "arguments": [
-                                  {
-                                    "name": "headStart",
-                                    "nodeType": "YulIdentifier",
-                                    "src": "949:9:1"
-                                  }
-                                ],
-                                "functionName": {
-                                  "name": "calldataload",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "936:12:1"
-                                },
-                                "nodeType": "YulFunctionCall",
-                                "src": "936:23:1"
-                              },
-                              "variableNames": [
-                                {
-                                  "name": "value0",
-                                  "nodeType": "YulIdentifier",
-                                  "src": "926:6:1"
-                                }
-                              ]
-                            }
-                          ]
-                        },
-                        "name": "abi_decode_tuple_t_uint256",
-                        "nodeType": "YulFunctionDefinition",
-                        "parameters": [
-                          {
-                            "name": "headStart",
-                            "nodeType": "YulTypedName",
-                            "src": "821:9:1",
-                            "type": ""
-                          },
-                          {
-                            "name": "dataEnd",
-                            "nodeType": "YulTypedName",
-                            "src": "832:7:1",
-                            "type": ""
-                          }
-                        ],
-                        "returnVariables": [
-                          {
-                            "name": "value0",
-                            "nodeType": "YulTypedName",
-                            "src": "844:6:1",
-                            "type": ""
-                          }
-                        ],
-                        "src": "785:180:1"
-                      }
-                    ]
-                  },
-                  "contents": "{\n    { }\n    function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, value0)\n    }\n    function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, and(value0, 0xff))\n    }\n    function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n    }\n    function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, iszero(iszero(value0)))\n    }\n    function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        value0 := calldataload(headStart)\n    }\n}",
-                  "id": 1,
-                  "language": "Yul",
-                  "name": "#utility.yul"
-                }
-              ],
-              "immutableReferences": {},
-              "linkReferences": {},
-              "object": "608060405234801561001057600080fd5b50600436106100625760003560e01c806316ada547146100675780636cf3c25e14610083578063767800de146100a2578063c0129d43146100cd578063c5b57bdb146100da578063edf26d9b146100fe575b600080fd5b61007060005481565b6040519081526020015b60405180910390f35b6003546100909060ff1681565b60405160ff909116815260200161007a565b6001546100b5906001600160a01b031681565b6040516001600160a01b03909116815260200161007a565b6000805442909155610070565b6001546100ee90600160a01b900460ff1681565b604051901515815260200161007a565b6100b561010c366004610127565b6002602052600090815260409020546001600160a01b031681565b60006020828403121561013957600080fd5b503591905056fea164736f6c634300080f000a",
-              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x62 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x16ADA547 EQ PUSH2 0x67 JUMPI DUP1 PUSH4 0x6CF3C25E EQ PUSH2 0x83 JUMPI DUP1 PUSH4 0x767800DE EQ PUSH2 0xA2 JUMPI DUP1 PUSH4 0xC0129D43 EQ PUSH2 0xCD JUMPI DUP1 PUSH4 0xC5B57BDB EQ PUSH2 0xDA JUMPI DUP1 PUSH4 0xEDF26D9B EQ PUSH2 0xFE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x70 PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x90 SWAP1 PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x7A JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0xB5 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x7A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD TIMESTAMP SWAP1 SWAP2 SSTORE PUSH2 0x70 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0xEE SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x7A JUMP JUMPDEST PUSH2 0xB5 PUSH2 0x10C CALLDATASIZE PUSH1 0x4 PUSH2 0x127 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x139 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP INVALID LOG1 PUSH5 0x736F6C6343 STOP ADDMOD 0xF STOP EXP ",
-              "sourceMap": "57:368:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83:19;;;;;;;;;160:25:1;;;148:2;133:18;83:19:0;;;;;;;;209:18;;;;;;;;;;;;368:4:1;356:17;;;338:36;;326:2;311:18;209::0;196:184:1;108:19:0;;;;;-1:-1:-1;;;;;108:19:0;;;;;;-1:-1:-1;;;;;549:32:1;;;531:51;;519:2;504:18;108:19:0;385:203:1;293:130:0;325:7;359:4;;380:15;373:22;;;293:130;;133:19;;;;;-1:-1:-1;;;133:19:0;;;;;;;;;758:14:1;;751:22;733:41;;721:2;706:18;133:19:0;593:187:1;158:44:0;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;158:44:0;;;785:180:1;844:6;897:2;885:9;876:7;872:23;868:32;865:52;;;913:1;910;903:12;865:52;-1:-1:-1;936:23:1;;785:180;-1:-1:-1;785:180:1:o"
-            },
-            "gasEstimates": {
-              "creation": {
-                "codeDepositCost": "66600",
-                "executionCost": "22222",
-                "totalCost": "88822"
-              },
-              "external": {
-                "addr()": "2359",
-                "addresses(uint256)": "2565",
-                "boolean()": "2393",
-                "gm()": "24436",
-                "small()": "2313",
-                "time()": "2262"
-              }
-            },
-            "legacyAssembly": {
-              ".code": [
-                {
-                  "begin": 57,
-                  "end": 425,
-                  "name": "PUSH",
-                  "source": 0,
-                  "value": "80"
-                },
-                {
-                  "begin": 57,
-                  "end": 425,
-                  "name": "PUSH",
-                  "source": 0,
-                  "value": "40"
-                },
-                {
-                  "begin": 57,
-                  "end": 425,
-                  "name": "MSTORE",
-                  "source": 0
-                },
-                {
-                  "begin": 234,
-                  "end": 287,
-                  "name": "CALLVALUE",
-                  "source": 0
-                },
-                {
-                  "begin": 234,
-                  "end": 287,
-                  "name": "DUP1",
-                  "source": 0
-                },
-                {
-                  "begin": 234,
-                  "end": 287,
-                  "name": "ISZERO",
-                  "source": 0
-                },
-                {
-                  "begin": 234,
-                  "end": 287,
-                  "name": "PUSH [tag]",
-                  "source": 0,
-                  "value": "1"
-                },
-                {
-                  "begin": 234,
-                  "end": 287,
-                  "name": "JUMPI",
-                  "source": 0
-                },
-                {
-                  "begin": 234,
-                  "end": 287,
-                  "name": "PUSH",
-                  "source": 0,
-                  "value": "0"
-                },
-                {
-                  "begin": 234,
-                  "end": 287,
-                  "name": "DUP1",
-                  "source": 0
-                },
-                {
-                  "begin": 234,
-                  "end": 287,
-                  "name": "REVERT",
-                  "source": 0
-                },
-                {
-                  "begin": 234,
-                  "end": 287,
-                  "name": "tag",
-                  "source": 0,
-                  "value": "1"
-                },
-                {
-                  "begin": 234,
-                  "end": 287,
-                  "name": "JUMPDEST",
-                  "source": 0
-                },
-                {
-                  "begin": -1,
-                  "end": -1,
-                  "name": "POP",
-                  "source": -1
-                },
-                {
-                  "begin": 265,
-                  "end": 280,
-                  "name": "TIMESTAMP",
-                  "source": 0
-                },
-                {
-                  "begin": 258,
-                  "end": 262,
-                  "name": "PUSH",
-                  "source": 0,
-                  "value": "0"
-                },
-                {
-                  "begin": 258,
-                  "end": 280,
-                  "name": "SSTORE",
-                  "source": 0
-                },
-                {
-                  "begin": 57,
-                  "end": 425,
-                  "name": "PUSH #[$]",
-                  "source": 0,
-                  "value": "0000000000000000000000000000000000000000000000000000000000000000"
-                },
-                {
-                  "begin": 57,
-                  "end": 425,
-                  "name": "DUP1",
-                  "source": 0
-                },
-                {
-                  "begin": 57,
-                  "end": 425,
-                  "name": "PUSH [$]",
-                  "source": 0,
-                  "value": "0000000000000000000000000000000000000000000000000000000000000000"
-                },
-                {
-                  "begin": 57,
-                  "end": 425,
-                  "name": "PUSH",
-                  "source": 0,
-                  "value": "0"
-                },
-                {
-                  "begin": 57,
-                  "end": 425,
-                  "name": "CODECOPY",
-                  "source": 0
-                },
-                {
-                  "begin": 57,
-                  "end": 425,
-                  "name": "PUSH",
-                  "source": 0,
-                  "value": "0"
-                },
-                {
-                  "begin": 57,
-                  "end": 425,
-                  "name": "RETURN",
-                  "source": 0
-                }
-              ],
-              ".data": {
-                "0": {
-                  ".auxdata": "a164736f6c634300080f000a",
-                  ".code": [
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "80"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "40"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "MSTORE",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "CALLVALUE",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "DUP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "ISZERO",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "1"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "JUMPI",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "0"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "DUP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "REVERT",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "1"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "POP",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "4"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "CALLDATASIZE",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "LT",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "2"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "JUMPI",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "0"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "CALLDATALOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "E0"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "SHR",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "DUP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "16ADA547"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "EQ",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "3"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "JUMPI",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "DUP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "6CF3C25E"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "EQ",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "4"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "JUMPI",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "DUP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "767800DE"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "EQ",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "5"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "JUMPI",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "DUP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "C0129D43"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "EQ",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "6"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "JUMPI",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "DUP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "C5B57BDB"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "EQ",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "7"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "JUMPI",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "DUP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "EDF26D9B"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "EQ",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "8"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "JUMPI",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "2"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "0"
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "DUP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 57,
-                      "end": 425,
-                      "name": "REVERT",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "3"
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "9"
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "0"
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "SLOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "DUP2",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "JUMP",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "9"
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "40"
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "MLOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": 160,
-                      "end": 185,
-                      "name": "SWAP1",
-                      "source": 1
-                    },
-                    {
-                      "begin": 160,
-                      "end": 185,
-                      "name": "DUP2",
-                      "source": 1
-                    },
-                    {
-                      "begin": 160,
-                      "end": 185,
-                      "name": "MSTORE",
-                      "source": 1
-                    },
-                    {
-                      "begin": 148,
-                      "end": 150,
-                      "name": "PUSH",
-                      "source": 1,
-                      "value": "20"
-                    },
-                    {
-                      "begin": 133,
-                      "end": 151,
-                      "name": "ADD",
-                      "source": 1
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "11"
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "40"
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "MLOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "DUP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "SWAP2",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "SUB",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "SWAP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 83,
-                      "end": 102,
-                      "name": "RETURN",
-                      "source": 0
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "4"
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "3"
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "SLOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "13"
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "SWAP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "FF"
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "AND",
-                      "source": 0
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "DUP2",
-                      "source": 0
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "JUMP",
-                      "source": 0
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "13"
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "40"
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "MLOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": 368,
-                      "end": 372,
-                      "name": "PUSH",
-                      "source": 1,
-                      "value": "FF"
-                    },
-                    {
-                      "begin": 356,
-                      "end": 373,
-                      "name": "SWAP1",
-                      "source": 1
-                    },
-                    {
-                      "begin": 356,
-                      "end": 373,
-                      "name": "SWAP2",
-                      "source": 1
-                    },
-                    {
-                      "begin": 356,
-                      "end": 373,
-                      "name": "AND",
-                      "source": 1
-                    },
-                    {
-                      "begin": 338,
-                      "end": 374,
-                      "name": "DUP2",
-                      "source": 1
-                    },
-                    {
-                      "begin": 338,
-                      "end": 374,
-                      "name": "MSTORE",
-                      "source": 1
-                    },
-                    {
-                      "begin": 326,
-                      "end": 328,
-                      "name": "PUSH",
-                      "source": 1,
-                      "value": "20"
-                    },
-                    {
-                      "begin": 311,
-                      "end": 329,
-                      "name": "ADD",
-                      "source": 1
-                    },
-                    {
-                      "begin": 209,
-                      "end": 227,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "11"
-                    },
-                    {
-                      "begin": 196,
-                      "end": 380,
-                      "name": "JUMP",
-                      "source": 1
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "5"
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "1"
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "SLOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "17"
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "SWAP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "PUSH",
-                      "source": -1,
-                      "value": "1"
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "PUSH",
-                      "source": -1,
-                      "value": "1"
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "PUSH",
-                      "source": -1,
-                      "value": "A0"
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "SHL",
-                      "source": -1
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "SUB",
-                      "source": -1
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "AND",
-                      "source": 0
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "DUP2",
-                      "source": 0
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "JUMP",
-                      "source": 0
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "17"
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "40"
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "MLOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "PUSH",
-                      "source": -1,
-                      "value": "1"
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "PUSH",
-                      "source": -1,
-                      "value": "1"
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "PUSH",
-                      "source": -1,
-                      "value": "A0"
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "SHL",
-                      "source": -1
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "SUB",
-                      "source": -1
-                    },
-                    {
-                      "begin": 549,
-                      "end": 581,
-                      "name": "SWAP1",
-                      "source": 1
-                    },
-                    {
-                      "begin": 549,
-                      "end": 581,
-                      "name": "SWAP2",
-                      "source": 1
-                    },
-                    {
-                      "begin": 549,
-                      "end": 581,
-                      "name": "AND",
-                      "source": 1
-                    },
-                    {
-                      "begin": 531,
-                      "end": 582,
-                      "name": "DUP2",
-                      "source": 1
-                    },
-                    {
-                      "begin": 531,
-                      "end": 582,
-                      "name": "MSTORE",
-                      "source": 1
-                    },
-                    {
-                      "begin": 519,
-                      "end": 521,
-                      "name": "PUSH",
-                      "source": 1,
-                      "value": "20"
-                    },
-                    {
-                      "begin": 504,
-                      "end": 522,
-                      "name": "ADD",
-                      "source": 1
-                    },
-                    {
-                      "begin": 108,
-                      "end": 127,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "11"
-                    },
-                    {
-                      "begin": 385,
-                      "end": 588,
-                      "name": "JUMP",
-                      "source": 1
-                    },
-                    {
-                      "begin": 293,
-                      "end": 423,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "6"
-                    },
-                    {
-                      "begin": 293,
-                      "end": 423,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 325,
-                      "end": 332,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "0"
-                    },
-                    {
-                      "begin": 359,
-                      "end": 363,
-                      "name": "DUP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 359,
-                      "end": 363,
-                      "name": "SLOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": 380,
-                      "end": 395,
-                      "name": "TIMESTAMP",
-                      "source": 0
-                    },
-                    {
-                      "begin": 373,
-                      "end": 395,
-                      "name": "SWAP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 373,
-                      "end": 395,
-                      "name": "SWAP2",
-                      "source": 0
-                    },
-                    {
-                      "begin": 373,
-                      "end": 395,
-                      "name": "SSTORE",
-                      "source": 0
-                    },
-                    {
-                      "begin": 293,
-                      "end": 423,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "9"
-                    },
-                    {
-                      "begin": 293,
-                      "end": 423,
-                      "name": "JUMP",
-                      "source": 0
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "7"
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "1"
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "SLOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "24"
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "SWAP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "PUSH",
-                      "source": -1,
-                      "value": "1"
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "PUSH",
-                      "source": -1,
-                      "value": "A0"
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "SHL",
-                      "source": -1
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "SWAP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "DIV",
-                      "source": 0
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "FF"
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "AND",
-                      "source": 0
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "DUP2",
-                      "source": 0
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "JUMP",
-                      "source": 0
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "24"
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "40"
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "MLOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": 758,
-                      "end": 772,
-                      "name": "SWAP1",
-                      "source": 1
-                    },
-                    {
-                      "begin": 758,
-                      "end": 772,
-                      "name": "ISZERO",
-                      "source": 1
-                    },
-                    {
-                      "begin": 751,
-                      "end": 773,
-                      "name": "ISZERO",
-                      "source": 1
-                    },
-                    {
-                      "begin": 733,
-                      "end": 774,
-                      "name": "DUP2",
-                      "source": 1
-                    },
-                    {
-                      "begin": 733,
-                      "end": 774,
-                      "name": "MSTORE",
-                      "source": 1
-                    },
-                    {
-                      "begin": 721,
-                      "end": 723,
-                      "name": "PUSH",
-                      "source": 1,
-                      "value": "20"
-                    },
-                    {
-                      "begin": 706,
-                      "end": 724,
-                      "name": "ADD",
-                      "source": 1
-                    },
-                    {
-                      "begin": 133,
-                      "end": 152,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "11"
-                    },
-                    {
-                      "begin": 593,
-                      "end": 780,
-                      "name": "JUMP",
-                      "source": 1
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "8"
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "17"
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "29"
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "CALLDATASIZE",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "4"
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "PUSH [tag]",
-                      "source": 0,
-                      "value": "30"
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "jumpType": "[in]",
-                      "name": "JUMP",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "tag",
-                      "source": 0,
-                      "value": "29"
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "JUMPDEST",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "2"
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "20"
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "MSTORE",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "0"
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "SWAP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "DUP2",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "MSTORE",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "PUSH",
-                      "source": 0,
-                      "value": "40"
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "SWAP1",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "KECCAK256",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "SLOAD",
-                      "source": 0
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "PUSH",
-                      "source": -1,
-                      "value": "1"
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "PUSH",
-                      "source": -1,
-                      "value": "1"
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "PUSH",
-                      "source": -1,
-                      "value": "A0"
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "SHL",
-                      "source": -1
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "SUB",
-                      "source": -1
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "AND",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "DUP2",
-                      "source": 0
-                    },
-                    {
-                      "begin": 158,
-                      "end": 202,
-                      "name": "JUMP",
-                      "source": 0
-                    },
-                    {
-                      "begin": 785,
-                      "end": 965,
-                      "name": "tag",
-                      "source": 1,
-                      "value": "30"
-                    },
-                    {
-                      "begin": 785,
-                      "end": 965,
-                      "name": "JUMPDEST",
-                      "source": 1
-                    },
-                    {
-                      "begin": 844,
-                      "end": 850,
-                      "name": "PUSH",
-                      "source": 1,
-                      "value": "0"
-                    },
-                    {
-                      "begin": 897,
-                      "end": 899,
-                      "name": "PUSH",
-                      "source": 1,
-                      "value": "20"
-                    },
-                    {
-                      "begin": 885,
-                      "end": 894,
-                      "name": "DUP3",
-                      "source": 1
-                    },
-                    {
-                      "begin": 876,
-                      "end": 883,
-                      "name": "DUP5",
-                      "source": 1
-                    },
-                    {
-                      "begin": 872,
-                      "end": 895,
-                      "name": "SUB",
-                      "source": 1
-                    },
-                    {
-                      "begin": 868,
-                      "end": 900,
-                      "name": "SLT",
-                      "source": 1
-                    },
-                    {
-                      "begin": 865,
-                      "end": 917,
-                      "name": "ISZERO",
-                      "source": 1
-                    },
-                    {
-                      "begin": 865,
-                      "end": 917,
-                      "name": "PUSH [tag]",
-                      "source": 1,
-                      "value": "40"
-                    },
-                    {
-                      "begin": 865,
-                      "end": 917,
-                      "name": "JUMPI",
-                      "source": 1
-                    },
-                    {
-                      "begin": 913,
-                      "end": 914,
-                      "name": "PUSH",
-                      "source": 1,
-                      "value": "0"
-                    },
-                    {
-                      "begin": 910,
-                      "end": 911,
-                      "name": "DUP1",
-                      "source": 1
-                    },
-                    {
-                      "begin": 903,
-                      "end": 915,
-                      "name": "REVERT",
-                      "source": 1
-                    },
-                    {
-                      "begin": 865,
-                      "end": 917,
-                      "name": "tag",
-                      "source": 1,
-                      "value": "40"
-                    },
-                    {
-                      "begin": 865,
-                      "end": 917,
-                      "name": "JUMPDEST",
-                      "source": 1
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "POP",
-                      "source": -1
-                    },
-                    {
-                      "begin": 936,
-                      "end": 959,
-                      "name": "CALLDATALOAD",
-                      "source": 1
-                    },
-                    {
-                      "begin": 936,
-                      "end": 959,
-                      "name": "SWAP2",
-                      "source": 1
-                    },
-                    {
-                      "begin": 785,
-                      "end": 965,
-                      "name": "SWAP1",
-                      "source": 1
-                    },
-                    {
-                      "begin": -1,
-                      "end": -1,
-                      "name": "POP",
-                      "source": -1
-                    },
-                    {
-                      "begin": 785,
-                      "end": 965,
-                      "jumpType": "[out]",
-                      "name": "JUMP",
-                      "source": 1
-                    }
-                  ]
-                }
-              },
-              "sourceList": [
-                "contracts/HelloWorld.sol",
-                "#utility.yul"
-              ]
-            },
-            "methodIdentifiers": {
-              "addr()": "767800de",
-              "addresses(uint256)": "edf26d9b",
-              "boolean()": "c5b57bdb",
-              "gm()": "c0129d43",
-              "small()": "6cf3c25e",
-              "time()": "16ada547"
-            }
-          },
-          "ewasm": {
-            "wasm": ""
-          },
-          "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"addr\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"addresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"boolean\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gm\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"small\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"time\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/HelloWorld.sol\":\"HelloWorld\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/HelloWorld.sol\":{\"keccak256\":\"0x0299929b9cb2f54573d11c3d487e615bd508b42deb031fc8810eb5eba1aa88d8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://85ddc5bb88506abf72d8e6ba7b9d157cfcd9beae0241333f48b76faf13ccdfbc\",\"dweb:/ipfs/QmWUZuDdrkqK4SW3ee9ew2gQRxkkigLydX3pQaEXncJEjZ\"]}},\"version\":1}",
-          "storageLayout": {
-            "storage": [
-              {
-                "astId": 3,
-                "contract": "contracts/HelloWorld.sol:HelloWorld",
-                "label": "time",
-                "offset": 0,
-                "slot": "0",
-                "type": "t_uint256"
-              },
-              {
-                "astId": 5,
-                "contract": "contracts/HelloWorld.sol:HelloWorld",
-                "label": "addr",
-                "offset": 0,
-                "slot": "1",
-                "type": "t_address"
-              },
-              {
-                "astId": 7,
-                "contract": "contracts/HelloWorld.sol:HelloWorld",
-                "label": "boolean",
-                "offset": 20,
-                "slot": "1",
-                "type": "t_bool"
-              },
-              {
-                "astId": 11,
-                "contract": "contracts/HelloWorld.sol:HelloWorld",
-                "label": "addresses",
-                "offset": 0,
-                "slot": "2",
-                "type": "t_mapping(t_uint256,t_address)"
-              },
-              {
-                "astId": 13,
-                "contract": "contracts/HelloWorld.sol:HelloWorld",
-                "label": "small",
-                "offset": 0,
-                "slot": "3",
-                "type": "t_uint8"
-              }
-            ],
-            "types": {
-              "t_address": {
-                "encoding": "inplace",
-                "label": "address",
-                "numberOfBytes": "20"
-              },
-              "t_bool": {
-                "encoding": "inplace",
-                "label": "bool",
-                "numberOfBytes": "1"
-              },
-              "t_mapping(t_uint256,t_address)": {
-                "encoding": "mapping",
-                "key": "t_uint256",
-                "label": "mapping(uint256 => address)",
-                "numberOfBytes": "32",
-                "value": "t_address"
-              },
-              "t_uint256": {
-                "encoding": "inplace",
-                "label": "uint256",
-                "numberOfBytes": "32"
-              },
-              "t_uint8": {
-                "encoding": "inplace",
-                "label": "uint8",
-                "numberOfBytes": "1"
-              }
-            }
-          },
-          "userdoc": {
-            "kind": "user",
-            "methods": {},
-            "version": 1
-          }
-        }
-      }
-    },
-    "sources": {
-      "contracts/HelloWorld.sol": {
-        "ast": {
-          "absolutePath": "contracts/HelloWorld.sol",
-          "exportedSymbols": {
-            "HelloWorld": [
-              40
-            ]
-          },
-          "id": 41,
-          "license": "MIT",
-          "nodeType": "SourceUnit",
-          "nodes": [
-            {
-              "id": 1,
-              "literals": [
-                "solidity",
-                "0.8",
-                ".15"
-              ],
-              "nodeType": "PragmaDirective",
-              "src": "32:23:0"
-            },
-            {
-              "abstract": false,
-              "baseContracts": [],
-              "canonicalName": "HelloWorld",
-              "contractDependencies": [],
-              "contractKind": "contract",
-              "fullyImplemented": true,
-              "id": 40,
-              "linearizedBaseContracts": [
-                40
-              ],
-              "name": "HelloWorld",
-              "nameLocation": "66:10:0",
-              "nodeType": "ContractDefinition",
-              "nodes": [
-                {
-                  "constant": false,
-                  "functionSelector": "16ada547",
-                  "id": 3,
-                  "mutability": "mutable",
-                  "name": "time",
-                  "nameLocation": "98:4:0",
-                  "nodeType": "VariableDeclaration",
-                  "scope": 40,
-                  "src": "83:19:0",
-                  "stateVariable": true,
-                  "storageLocation": "default",
-                  "typeDescriptions": {
-                    "typeIdentifier": "t_uint256",
-                    "typeString": "uint256"
-                  },
-                  "typeName": {
-                    "id": 2,
-                    "name": "uint256",
-                    "nodeType": "ElementaryTypeName",
-                    "src": "83:7:0",
-                    "typeDescriptions": {
-                      "typeIdentifier": "t_uint256",
-                      "typeString": "uint256"
-                    }
-                  },
-                  "visibility": "public"
-                },
-                {
-                  "constant": false,
-                  "functionSelector": "767800de",
-                  "id": 5,
-                  "mutability": "mutable",
-                  "name": "addr",
-                  "nameLocation": "123:4:0",
-                  "nodeType": "VariableDeclaration",
-                  "scope": 40,
-                  "src": "108:19:0",
-                  "stateVariable": true,
-                  "storageLocation": "default",
-                  "typeDescriptions": {
-                    "typeIdentifier": "t_address",
-                    "typeString": "address"
-                  },
-                  "typeName": {
-                    "id": 4,
-                    "name": "address",
-                    "nodeType": "ElementaryTypeName",
-                    "src": "108:7:0",
-                    "stateMutability": "nonpayable",
-                    "typeDescriptions": {
-                      "typeIdentifier": "t_address",
-                      "typeString": "address"
-                    }
-                  },
-                  "visibility": "public"
-                },
-                {
-                  "constant": false,
-                  "functionSelector": "c5b57bdb",
-                  "id": 7,
-                  "mutability": "mutable",
-                  "name": "boolean",
-                  "nameLocation": "145:7:0",
-                  "nodeType": "VariableDeclaration",
-                  "scope": 40,
-                  "src": "133:19:0",
-                  "stateVariable": true,
-                  "storageLocation": "default",
-                  "typeDescriptions": {
-                    "typeIdentifier": "t_bool",
-                    "typeString": "bool"
-                  },
-                  "typeName": {
-                    "id": 6,
-                    "name": "bool",
-                    "nodeType": "ElementaryTypeName",
-                    "src": "133:4:0",
-                    "typeDescriptions": {
-                      "typeIdentifier": "t_bool",
-                      "typeString": "bool"
-                    }
-                  },
-                  "visibility": "public"
-                },
-                {
-                  "constant": false,
-                  "functionSelector": "edf26d9b",
-                  "id": 11,
-                  "mutability": "mutable",
-                  "name": "addresses",
-                  "nameLocation": "193:9:0",
-                  "nodeType": "VariableDeclaration",
-                  "scope": 40,
-                  "src": "158:44:0",
-                  "stateVariable": true,
-                  "storageLocation": "default",
-                  "typeDescriptions": {
-                    "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
-                    "typeString": "mapping(uint256 => address)"
-                  },
-                  "typeName": {
-                    "id": 10,
-                    "keyType": {
-                      "id": 8,
-                      "name": "uint256",
-                      "nodeType": "ElementaryTypeName",
-                      "src": "166:7:0",
-                      "typeDescriptions": {
-                        "typeIdentifier": "t_uint256",
-                        "typeString": "uint256"
-                      }
-                    },
-                    "nodeType": "Mapping",
-                    "src": "158:27:0",
-                    "typeDescriptions": {
-                      "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
-                      "typeString": "mapping(uint256 => address)"
-                    },
-                    "valueType": {
-                      "id": 9,
-                      "name": "address",
-                      "nodeType": "ElementaryTypeName",
-                      "src": "177:7:0",
-                      "stateMutability": "nonpayable",
-                      "typeDescriptions": {
-                        "typeIdentifier": "t_address",
-                        "typeString": "address"
-                      }
-                    }
-                  },
-                  "visibility": "public"
-                },
-                {
-                  "constant": false,
-                  "functionSelector": "6cf3c25e",
-                  "id": 13,
-                  "mutability": "mutable",
-                  "name": "small",
-                  "nameLocation": "222:5:0",
-                  "nodeType": "VariableDeclaration",
-                  "scope": 40,
-                  "src": "209:18:0",
-                  "stateVariable": true,
-                  "storageLocation": "default",
-                  "typeDescriptions": {
-                    "typeIdentifier": "t_uint8",
-                    "typeString": "uint8"
-                  },
-                  "typeName": {
-                    "id": 12,
-                    "name": "uint8",
-                    "nodeType": "ElementaryTypeName",
-                    "src": "209:5:0",
-                    "typeDescriptions": {
-                      "typeIdentifier": "t_uint8",
-                      "typeString": "uint8"
-                    }
-                  },
-                  "visibility": "public"
-                },
-                {
-                  "body": {
-                    "id": 21,
-                    "nodeType": "Block",
-                    "src": "248:39:0",
-                    "statements": [
-                      {
-                        "expression": {
-                          "id": 19,
-                          "isConstant": false,
-                          "isLValue": false,
-                          "isPure": false,
-                          "lValueRequested": false,
-                          "leftHandSide": {
-                            "id": 16,
-                            "name": "time",
-                            "nodeType": "Identifier",
-                            "overloadedDeclarations": [],
-                            "referencedDeclaration": 3,
-                            "src": "258:4:0",
-                            "typeDescriptions": {
-                              "typeIdentifier": "t_uint256",
-                              "typeString": "uint256"
-                            }
-                          },
-                          "nodeType": "Assignment",
-                          "operator": "=",
-                          "rightHandSide": {
-                            "expression": {
-                              "id": 17,
-                              "name": "block",
-                              "nodeType": "Identifier",
-                              "overloadedDeclarations": [],
-                              "referencedDeclaration": -4,
-                              "src": "265:5:0",
-                              "typeDescriptions": {
-                                "typeIdentifier": "t_magic_block",
-                                "typeString": "block"
-                              }
-                            },
-                            "id": 18,
-                            "isConstant": false,
-                            "isLValue": false,
-                            "isPure": false,
-                            "lValueRequested": false,
-                            "memberName": "timestamp",
-                            "nodeType": "MemberAccess",
-                            "src": "265:15:0",
-                            "typeDescriptions": {
-                              "typeIdentifier": "t_uint256",
-                              "typeString": "uint256"
-                            }
-                          },
-                          "src": "258:22:0",
-                          "typeDescriptions": {
-                            "typeIdentifier": "t_uint256",
-                            "typeString": "uint256"
-                          }
-                        },
-                        "id": 20,
-                        "nodeType": "ExpressionStatement",
-                        "src": "258:22:0"
-                      }
-                    ]
-                  },
-                  "id": 22,
-                  "implemented": true,
-                  "kind": "constructor",
-                  "modifiers": [],
-                  "name": "",
-                  "nameLocation": "-1:-1:-1",
-                  "nodeType": "FunctionDefinition",
-                  "parameters": {
-                    "id": 14,
-                    "nodeType": "ParameterList",
-                    "parameters": [],
-                    "src": "245:2:0"
-                  },
-                  "returnParameters": {
-                    "id": 15,
-                    "nodeType": "ParameterList",
-                    "parameters": [],
-                    "src": "248:0:0"
-                  },
-                  "scope": 40,
-                  "src": "234:53:0",
-                  "stateMutability": "nonpayable",
-                  "virtual": false,
-                  "visibility": "public"
-                },
-                {
-                  "body": {
-                    "id": 38,
-                    "nodeType": "Block",
-                    "src": "334:89:0",
-                    "statements": [
-                      {
-                        "assignments": [
-                          28
-                        ],
-                        "declarations": [
-                          {
-                            "constant": false,
-                            "id": 28,
-                            "mutability": "mutable",
-                            "name": "prev",
-                            "nameLocation": "352:4:0",
-                            "nodeType": "VariableDeclaration",
-                            "scope": 38,
-                            "src": "344:12:0",
-                            "stateVariable": false,
-                            "storageLocation": "default",
-                            "typeDescriptions": {
-                              "typeIdentifier": "t_uint256",
-                              "typeString": "uint256"
-                            },
-                            "typeName": {
-                              "id": 27,
-                              "name": "uint256",
-                              "nodeType": "ElementaryTypeName",
-                              "src": "344:7:0",
-                              "typeDescriptions": {
-                                "typeIdentifier": "t_uint256",
-                                "typeString": "uint256"
-                              }
-                            },
-                            "visibility": "internal"
-                          }
-                        ],
-                        "id": 30,
-                        "initialValue": {
-                          "id": 29,
-                          "name": "time",
-                          "nodeType": "Identifier",
-                          "overloadedDeclarations": [],
-                          "referencedDeclaration": 3,
-                          "src": "359:4:0",
-                          "typeDescriptions": {
-                            "typeIdentifier": "t_uint256",
-                            "typeString": "uint256"
-                          }
-                        },
-                        "nodeType": "VariableDeclarationStatement",
-                        "src": "344:19:0"
-                      },
-                      {
-                        "expression": {
-                          "id": 34,
-                          "isConstant": false,
-                          "isLValue": false,
-                          "isPure": false,
-                          "lValueRequested": false,
-                          "leftHandSide": {
-                            "id": 31,
-                            "name": "time",
-                            "nodeType": "Identifier",
-                            "overloadedDeclarations": [],
-                            "referencedDeclaration": 3,
-                            "src": "373:4:0",
-                            "typeDescriptions": {
-                              "typeIdentifier": "t_uint256",
-                              "typeString": "uint256"
-                            }
-                          },
-                          "nodeType": "Assignment",
-                          "operator": "=",
-                          "rightHandSide": {
-                            "expression": {
-                              "id": 32,
-                              "name": "block",
-                              "nodeType": "Identifier",
-                              "overloadedDeclarations": [],
-                              "referencedDeclaration": -4,
-                              "src": "380:5:0",
-                              "typeDescriptions": {
-                                "typeIdentifier": "t_magic_block",
-                                "typeString": "block"
-                              }
-                            },
-                            "id": 33,
-                            "isConstant": false,
-                            "isLValue": false,
-                            "isPure": false,
-                            "lValueRequested": false,
-                            "memberName": "timestamp",
-                            "nodeType": "MemberAccess",
-                            "src": "380:15:0",
-                            "typeDescriptions": {
-                              "typeIdentifier": "t_uint256",
-                              "typeString": "uint256"
-                            }
-                          },
-                          "src": "373:22:0",
-                          "typeDescriptions": {
-                            "typeIdentifier": "t_uint256",
-                            "typeString": "uint256"
-                          }
-                        },
-                        "id": 35,
-                        "nodeType": "ExpressionStatement",
-                        "src": "373:22:0"
-                      },
-                      {
-                        "expression": {
-                          "id": 36,
-                          "name": "prev",
-                          "nodeType": "Identifier",
-                          "overloadedDeclarations": [],
-                          "referencedDeclaration": 28,
-                          "src": "412:4:0",
-                          "typeDescriptions": {
-                            "typeIdentifier": "t_uint256",
-                            "typeString": "uint256"
-                          }
-                        },
-                        "functionReturnParameters": 26,
-                        "id": 37,
-                        "nodeType": "Return",
-                        "src": "405:11:0"
-                      }
-                    ]
-                  },
-                  "functionSelector": "c0129d43",
-                  "id": 39,
-                  "implemented": true,
-                  "kind": "function",
-                  "modifiers": [],
-                  "name": "gm",
-                  "nameLocation": "302:2:0",
-                  "nodeType": "FunctionDefinition",
-                  "parameters": {
-                    "id": 23,
-                    "nodeType": "ParameterList",
-                    "parameters": [],
-                    "src": "304:2:0"
-                  },
-                  "returnParameters": {
-                    "id": 26,
-                    "nodeType": "ParameterList",
-                    "parameters": [
-                      {
-                        "constant": false,
-                        "id": 25,
-                        "mutability": "mutable",
-                        "name": "",
-                        "nameLocation": "-1:-1:-1",
-                        "nodeType": "VariableDeclaration",
-                        "scope": 39,
-                        "src": "325:7:0",
-                        "stateVariable": false,
-                        "storageLocation": "default",
-                        "typeDescriptions": {
-                          "typeIdentifier": "t_uint256",
-                          "typeString": "uint256"
-                        },
-                        "typeName": {
-                          "id": 24,
-                          "name": "uint256",
-                          "nodeType": "ElementaryTypeName",
-                          "src": "325:7:0",
-                          "typeDescriptions": {
-                            "typeIdentifier": "t_uint256",
-                            "typeString": "uint256"
-                          }
-                        },
-                        "visibility": "internal"
-                      }
-                    ],
-                    "src": "324:9:0"
-                  },
-                  "scope": 40,
-                  "src": "293:130:0",
-                  "stateMutability": "nonpayable",
-                  "virtual": false,
-                  "visibility": "external"
-                }
-              ],
-              "scope": 41,
-              "src": "57:368:0",
-              "usedErrors": []
-            }
-          ],
-          "src": "32:394:0"
-        },
-        "id": 0
-      }
-    }
-  }
-}
diff --git a/op-bindings/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.dbg.json b/op-bindings/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.dbg.json
deleted file mode 100644
index b657a4331b85..000000000000
--- a/op-bindings/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.dbg.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "_format": "hh-sol-dbg-1",
-  "buildInfo": "../../build-info/41b5106372a301360350245ee188494f.json"
-}
diff --git a/op-bindings/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.json b/op-bindings/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.json
deleted file mode 100644
index 70860803a525..000000000000
--- a/op-bindings/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
-  "_format": "hh-sol-artifact-1",
-  "contractName": "HelloWorld",
-  "sourceName": "contracts/HelloWorld.sol",
-  "abi": [
-    {
-      "inputs": [],
-      "stateMutability": "nonpayable",
-      "type": "constructor"
-    },
-    {
-      "inputs": [],
-      "name": "addr",
-      "outputs": [
-        {
-          "internalType": "address",
-          "name": "",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "uint256",
-          "name": "",
-          "type": "uint256"
-        }
-      ],
-      "name": "addresses",
-      "outputs": [
-        {
-          "internalType": "address",
-          "name": "",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "boolean",
-      "outputs": [
-        {
-          "internalType": "bool",
-          "name": "",
-          "type": "bool"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "gm",
-      "outputs": [
-        {
-          "internalType": "uint256",
-          "name": "",
-          "type": "uint256"
-        }
-      ],
-      "stateMutability": "nonpayable",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "small",
-      "outputs": [
-        {
-          "internalType": "uint8",
-          "name": "",
-          "type": "uint8"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "time",
-      "outputs": [
-        {
-          "internalType": "uint256",
-          "name": "",
-          "type": "uint256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    }
-  ],
-  "bytecode": "0x608060405234801561001057600080fd5b504260005561014d806100246000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806316ada547146100675780636cf3c25e14610083578063767800de146100a2578063c0129d43146100cd578063c5b57bdb146100da578063edf26d9b146100fe575b600080fd5b61007060005481565b6040519081526020015b60405180910390f35b6003546100909060ff1681565b60405160ff909116815260200161007a565b6001546100b5906001600160a01b031681565b6040516001600160a01b03909116815260200161007a565b6000805442909155610070565b6001546100ee90600160a01b900460ff1681565b604051901515815260200161007a565b6100b561010c366004610127565b6002602052600090815260409020546001600160a01b031681565b60006020828403121561013957600080fd5b503591905056fea164736f6c634300080f000a",
-  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c806316ada547146100675780636cf3c25e14610083578063767800de146100a2578063c0129d43146100cd578063c5b57bdb146100da578063edf26d9b146100fe575b600080fd5b61007060005481565b6040519081526020015b60405180910390f35b6003546100909060ff1681565b60405160ff909116815260200161007a565b6001546100b5906001600160a01b031681565b6040516001600160a01b03909116815260200161007a565b6000805442909155610070565b6001546100ee90600160a01b900460ff1681565b604051901515815260200161007a565b6100b561010c366004610127565b6002602052600090815260409020546001600160a01b031681565b60006020828403121561013957600080fd5b503591905056fea164736f6c634300080f000a",
-  "linkReferences": {},
-  "deployedLinkReferences": {}
-}
diff --git a/op-bindings/hardhat/testdata/deployments/alpha/OptimismPortal.json b/op-bindings/hardhat/testdata/deployments/alpha/OptimismPortal.json
deleted file mode 100644
index 23e2f8ae45bb..000000000000
--- a/op-bindings/hardhat/testdata/deployments/alpha/OptimismPortal.json
+++ /dev/null
@@ -1,674 +0,0 @@
-{
-  "address": "0x79C6C6b1844e3db7C30107f189CFb095Bd2c4B5d",
-  "abi": [
-    {
-      "inputs": [
-        {
-          "internalType": "contract L2OutputOracle",
-          "name": "_l2Oracle",
-          "type": "address"
-        },
-        {
-          "internalType": "uint256",
-          "name": "_finalizationPeriodSeconds",
-          "type": "uint256"
-        }
-      ],
-      "stateMutability": "nonpayable",
-      "type": "constructor"
-    },
-    {
-      "anonymous": false,
-      "inputs": [
-        {
-          "indexed": false,
-          "internalType": "uint8",
-          "name": "version",
-          "type": "uint8"
-        }
-      ],
-      "name": "Initialized",
-      "type": "event"
-    },
-    {
-      "anonymous": false,
-      "inputs": [
-        {
-          "indexed": true,
-          "internalType": "address",
-          "name": "from",
-          "type": "address"
-        },
-        {
-          "indexed": true,
-          "internalType": "address",
-          "name": "to",
-          "type": "address"
-        },
-        {
-          "indexed": true,
-          "internalType": "uint256",
-          "name": "version",
-          "type": "uint256"
-        },
-        {
-          "indexed": false,
-          "internalType": "bytes",
-          "name": "opaqueData",
-          "type": "bytes"
-        }
-      ],
-      "name": "TransactionDeposited",
-      "type": "event"
-    },
-    {
-      "anonymous": false,
-      "inputs": [
-        {
-          "indexed": true,
-          "internalType": "bytes32",
-          "name": "withdrawalHash",
-          "type": "bytes32"
-        },
-        {
-          "indexed": false,
-          "internalType": "bool",
-          "name": "success",
-          "type": "bool"
-        }
-      ],
-      "name": "WithdrawalFinalized",
-      "type": "event"
-    },
-    {
-      "inputs": [],
-      "name": "BASE_FEE_MAX_CHANGE_DENOMINATOR",
-      "outputs": [
-        {
-          "internalType": "int256",
-          "name": "",
-          "type": "int256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "ELASTICITY_MULTIPLIER",
-      "outputs": [
-        {
-          "internalType": "int256",
-          "name": "",
-          "type": "int256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "FINALIZATION_PERIOD_SECONDS",
-      "outputs": [
-        {
-          "internalType": "uint256",
-          "name": "",
-          "type": "uint256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "INITIAL_BASE_FEE",
-      "outputs": [
-        {
-          "internalType": "uint128",
-          "name": "",
-          "type": "uint128"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "L2_ORACLE",
-      "outputs": [
-        {
-          "internalType": "contract L2OutputOracle",
-          "name": "",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "MAX_RESOURCE_LIMIT",
-      "outputs": [
-        {
-          "internalType": "int256",
-          "name": "",
-          "type": "int256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "MINIMUM_BASE_FEE",
-      "outputs": [
-        {
-          "internalType": "int256",
-          "name": "",
-          "type": "int256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "TARGET_RESOURCE_LIMIT",
-      "outputs": [
-        {
-          "internalType": "int256",
-          "name": "",
-          "type": "int256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "address",
-          "name": "_to",
-          "type": "address"
-        },
-        {
-          "internalType": "uint256",
-          "name": "_value",
-          "type": "uint256"
-        },
-        {
-          "internalType": "uint64",
-          "name": "_gasLimit",
-          "type": "uint64"
-        },
-        {
-          "internalType": "bool",
-          "name": "_isCreation",
-          "type": "bool"
-        },
-        {
-          "internalType": "bytes",
-          "name": "_data",
-          "type": "bytes"
-        }
-      ],
-      "name": "depositTransaction",
-      "outputs": [],
-      "stateMutability": "payable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "components": [
-            {
-              "internalType": "uint256",
-              "name": "nonce",
-              "type": "uint256"
-            },
-            {
-              "internalType": "address",
-              "name": "sender",
-              "type": "address"
-            },
-            {
-              "internalType": "address",
-              "name": "target",
-              "type": "address"
-            },
-            {
-              "internalType": "uint256",
-              "name": "value",
-              "type": "uint256"
-            },
-            {
-              "internalType": "uint256",
-              "name": "gasLimit",
-              "type": "uint256"
-            },
-            {
-              "internalType": "bytes",
-              "name": "data",
-              "type": "bytes"
-            }
-          ],
-          "internalType": "struct Types.WithdrawalTransaction",
-          "name": "_tx",
-          "type": "tuple"
-        },
-        {
-          "internalType": "uint256",
-          "name": "_l2BlockNumber",
-          "type": "uint256"
-        },
-        {
-          "components": [
-            {
-              "internalType": "bytes32",
-              "name": "version",
-              "type": "bytes32"
-            },
-            {
-              "internalType": "bytes32",
-              "name": "stateRoot",
-              "type": "bytes32"
-            },
-            {
-              "internalType": "bytes32",
-              "name": "withdrawerStorageRoot",
-              "type": "bytes32"
-            },
-            {
-              "internalType": "bytes32",
-              "name": "latestBlockhash",
-              "type": "bytes32"
-            }
-          ],
-          "internalType": "struct Types.OutputRootProof",
-          "name": "_outputRootProof",
-          "type": "tuple"
-        },
-        {
-          "internalType": "bytes",
-          "name": "_withdrawalProof",
-          "type": "bytes"
-        }
-      ],
-      "name": "finalizeWithdrawalTransaction",
-      "outputs": [],
-      "stateMutability": "payable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "bytes32",
-          "name": "",
-          "type": "bytes32"
-        }
-      ],
-      "name": "finalizedWithdrawals",
-      "outputs": [
-        {
-          "internalType": "bool",
-          "name": "",
-          "type": "bool"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "initialize",
-      "outputs": [],
-      "stateMutability": "nonpayable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "uint256",
-          "name": "_l2BlockNumber",
-          "type": "uint256"
-        }
-      ],
-      "name": "isBlockFinalized",
-      "outputs": [
-        {
-          "internalType": "bool",
-          "name": "",
-          "type": "bool"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "l2Sender",
-      "outputs": [
-        {
-          "internalType": "address",
-          "name": "",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "params",
-      "outputs": [
-        {
-          "internalType": "uint128",
-          "name": "prevBaseFee",
-          "type": "uint128"
-        },
-        {
-          "internalType": "uint64",
-          "name": "prevBoughtGas",
-          "type": "uint64"
-        },
-        {
-          "internalType": "uint64",
-          "name": "prevBlockNum",
-          "type": "uint64"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "version",
-      "outputs": [
-        {
-          "internalType": "string",
-          "name": "",
-          "type": "string"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "stateMutability": "payable",
-      "type": "receive"
-    }
-  ],
-  "transactionHash": "0x3ac590c822271c4ee52c3327f8154518b3a2d0ca0d4aeacbf74bc2a7a9bf0d5b",
-  "receipt": {
-    "to": null,
-    "from": "0xCFf7a9856DB3C60AB546b8F43dC5D1A4336786A0",
-    "contractAddress": "0x79C6C6b1844e3db7C30107f189CFb095Bd2c4B5d",
-    "transactionIndex": 0,
-    "gasUsed": "3481823",
-    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000",
-    "blockHash": "0xd2afc46aa8ad4b9d42ff65f9e0b2e76a9864bdda53838da89d4ecead4ef54242",
-    "transactionHash": "0x3ac590c822271c4ee52c3327f8154518b3a2d0ca0d4aeacbf74bc2a7a9bf0d5b",
-    "logs": [
-      {
-        "transactionIndex": 0,
-        "blockNumber": 7355246,
-        "transactionHash": "0x3ac590c822271c4ee52c3327f8154518b3a2d0ca0d4aeacbf74bc2a7a9bf0d5b",
-        "address": "0x79C6C6b1844e3db7C30107f189CFb095Bd2c4B5d",
-        "topics": [
-          "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"
-        ],
-        "data": "0x0000000000000000000000000000000000000000000000000000000000000001",
-        "logIndex": 0,
-        "blockHash": "0xd2afc46aa8ad4b9d42ff65f9e0b2e76a9864bdda53838da89d4ecead4ef54242"
-      }
-    ],
-    "blockNumber": 7355246,
-    "cumulativeGasUsed": "3481823",
-    "status": 1,
-    "byzantium": true
-  },
-  "args": [
-    "0x1Bf3F468e52aA31fd19BaF006B23c327c8fc7198",
-    2
-  ],
-  "numDeployments": 1,
-  "solcInputHash": "cd42cb04f3b6a78e5824c9f427d0a55d",
-  "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract L2OutputOracle\",\"name\":\"_l2Oracle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"opaqueData\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE_FEE_MAX_CHANGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ELASTICITY_MULTIPLIER\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIAL_BASE_FEE\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ORACLE\",\"outputs\":[{\"internalType\":\"contract L2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINIMUM_BASE_FEE\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TARGET_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Types.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawerStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"struct Types.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_withdrawalProof\",\"type\":\"bytes\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"isBlockFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"custom:proxied\":\"@title OptimismPortal\",\"events\":{\"TransactionDeposited(address,address,uint256,bytes)\":{\"params\":{\"from\":\"Address that triggered the deposit transaction.\",\"opaqueData\":\"ABI encoded deposit data to be parsed off-chain.\",\"to\":\"Address that the deposit transaction is directed to.\",\"version\":\"Version of this deposit transaction event.\"}},\"WithdrawalFinalized(bytes32,bool)\":{\"params\":{\"success\":\"Whether the withdrawal transaction was successful.\",\"withdrawalHash\":\"Hash of the withdrawal transaction.\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:semver\":\"0.0.1\",\"params\":{\"_finalizationPeriodSeconds\":\"Output finalization time in seconds.\",\"_l2Oracle\":\"Address of the L2OutputOracle contract.\"}},\"depositTransaction(address,uint256,uint64,bool,bytes)\":{\"params\":{\"_data\":\"Data to trigger the recipient with.\",\"_gasLimit\":\"Minimum L2 gas limit (can be greater than or equal to this value).\",\"_isCreation\":\"Whether or not the transaction is a contract creation.\",\"_to\":\"Target address on L2.\",\"_value\":\"ETH value to send to the recipient.\"}},\"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes)\":{\"params\":{\"_l2BlockNumber\":\"L2 block number of the outputRoot.\",\"_outputRootProof\":\"Inclusion proof of the withdrawer contracts storage root.\",\"_tx\":\"Withdrawal transaction to finalize.\",\"_withdrawalProof\":\"Inclusion proof for the given withdrawal in the withdrawer contract.\"}},\"isBlockFinalized(uint256)\":{\"params\":{\"_l2BlockNumber\":\"The number of the L2 block.\"}},\"version()\":{\"returns\":{\"_0\":\"Semver contract version as a string.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"TransactionDeposited(address,address,uint256,bytes)\":{\"notice\":\"Emitted when a transaction is deposited from L1 to L2. The parameters of this event         are read by the rollup node and used to derive deposit transactions on L2.\"},\"WithdrawalFinalized(bytes32,bool)\":{\"notice\":\"Emitted when a withdrawal transaction is finalized.\"}},\"kind\":\"user\",\"methods\":{\"BASE_FEE_MAX_CHANGE_DENOMINATOR()\":{\"notice\":\"Denominator that determines max change on fee per block.\"},\"ELASTICITY_MULTIPLIER()\":{\"notice\":\"Along with the resource limit, determines the target resource limit.\"},\"FINALIZATION_PERIOD_SECONDS()\":{\"notice\":\"Minimum time (in seconds) that must elapse before a withdrawal can be finalized.\"},\"INITIAL_BASE_FEE()\":{\"notice\":\"Initial base fee value.\"},\"L2_ORACLE()\":{\"notice\":\"Address of the L2OutputOracle.\"},\"MAX_RESOURCE_LIMIT()\":{\"notice\":\"Maximum amount of the resource that can be used within this block.\"},\"MINIMUM_BASE_FEE()\":{\"notice\":\"Minimum base fee value, cannot go lower than this.\"},\"TARGET_RESOURCE_LIMIT()\":{\"notice\":\"Target amount of the resource that should be used within this block.\"},\"depositTransaction(address,uint256,uint64,bool,bytes)\":{\"notice\":\"Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in         deriving deposit transactions. Note that if a deposit is made by a contract, its         address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider         using the CrossDomainMessenger contracts for a simpler developer experience.\"},\"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes)\":{\"notice\":\"Finalizes a withdrawal transaction.\"},\"finalizedWithdrawals(bytes32)\":{\"notice\":\"A list of withdrawal hashes which have been successfully finalized.\"},\"initialize()\":{\"notice\":\"Initializer;\"},\"isBlockFinalized(uint256)\":{\"notice\":\"Determine if a given block number is finalized. Reverts if the call to         L2_ORACLE.getL2Output reverts. Returns a boolean otherwise.\"},\"l2Sender()\":{\"notice\":\"Address of the L2 account which initiated a withdrawal in this transaction. If the         of this variable is the default L2 sender address, then we are NOT inside of a call         to finalizeWithdrawalTransaction.\"},\"params()\":{\"notice\":\"EIP-1559 style gas parameters.\"},\"version()\":{\"notice\":\"Returns the full semver contract version.\"}},\"notice\":\"The OptimismPortal is a low-level contract responsible for passing messages between L1         and L2. Messages sent directly to the OptimismPortal have no form of replayability.         Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/OptimismPortal.sol\":\"OptimismPortal\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@eth-optimism/contracts-periphery/=node_modules/@eth-optimism/contracts-periphery/contracts/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/=node_modules/@rari-capital/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":contracts/=contracts/\",\":ds-test/=node_modules/ds-test/src/\",\":excessively-safe-call/=node_modules/excessively-safe-call/\",\":forge-std/=node_modules/forge-std/src/\"]},\"sources\":{\"contracts/L1/L2OutputOracle.sol\":{\"keccak256\":\"0xe3242f566b5c1ae0e983e734e053552b7ef53d73f23575b5c6bbad4505aacc61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://45451a37d695b27f1e8d80f50a75d54be55b406538b24d913cb210c021a77876\",\"dweb:/ipfs/QmUqgkGNkDBZhGJQJjKdHWwuFUhg7Cu1qPpYUcRFWSi3Pr\"]},\"contracts/L1/OptimismPortal.sol\":{\"keccak256\":\"0xbdfc47a8ef7a1665d8aa25dabcc0281860ef88c5c9646a230e53af0d27248456\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0cad521349efcdd4ca4a0a937ce126cf40417f53373bf3235182f7d9a97df358\",\"dweb:/ipfs/QmbydUJzEtjR4xaPicsjFk5MunHz41peVCRrNR7GPDBEq2\"]},\"contracts/L1/ResourceMetering.sol\":{\"keccak256\":\"0xcbb34b35a67da37c07bc9ddf900012b94605491e6845a8811fd5d6d9fff8aed6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://84f801cd1c3d30f13a9a537c550898ffb170a810d640e2138ff6efe16c76a6ca\",\"dweb:/ipfs/QmYR49Qv7nJey69r726QmkpAWwqukAN7CBXj3xn5KxHUcV\"]},\"contracts/libraries/Burn.sol\":{\"keccak256\":\"0x54233b226ba6919dc46d438bc790108d8f855001002a1b9c3c37aed7a83e5f3f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4051a4baca357a9191a6c9e3aa1593a17b69dd7915966e23e4cb269e9c1d9ed4\",\"dweb:/ipfs/QmadKjGKvxm53abVHQdsxrXBc8e9jXywu6vvhkAgjsx59J\"]},\"contracts/libraries/Bytes.sol\":{\"keccak256\":\"0x90538c876448b34513ece8e91dc3d541291f17263813f2baf7a0e93b09993f31\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16bd9e3249cd8659fdfe03a4c77b4d72ff9d3abbde81054dcd37710d1e176e8f\",\"dweb:/ipfs/QmbQ9VBUJfzWUK2KneSFNjtiH4dmPKChsZSQVNFAXJrrrZ\"]},\"contracts/libraries/Encoding.sol\":{\"keccak256\":\"0xca8dce21b608bac08ae75d42879e90f5e7865fb29587df181a22a3b14ce21985\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://29b093d22061b4c499566cb35ce2755cce241ab9f02716cf9cdbdd81f9c47871\",\"dweb:/ipfs/QmdF4DHQUEeEeW67ugmEC3AHn6QrBBNYtwV7UaHaSTe2pa\"]},\"contracts/libraries/Hashing.sol\":{\"keccak256\":\"0xef5d0156a50f96bf32d34ef7a217872791b1b3c11baa9c13183a6388356a918d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7790ae2e79906d26924f7b69e8a3610031db48cef4b6e306e923431def8ba86\",\"dweb:/ipfs/QmSGJEBv5XsDtsr2QTJnwGKXAXxqZafYGeZcRKKfw1yrUc\"]},\"contracts/libraries/Types.sol\":{\"keccak256\":\"0x93045c0c97287a12e1bdde0685e26f185411b81b93b9df15c8cce90bccdcf77c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0c90b59d09f92aba5ab0862264efe2beb0f77fba750867f8d686a1f39ee6af2c\",\"dweb:/ipfs/QmW7Zj5d7NgDi5Mdv6jptJgfsUj8LvGroud9p2Z7vhcKLC\"]},\"contracts/libraries/rlp/RLPReader.sol\":{\"keccak256\":\"0xef51cf7340f3e3f6ff9f651d6b284831a38f1631635c5d72121ad9498caf15b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://034c29eee4bc5ed4f0d013162d20c17cbc0ba5d26fd0cd477bcac0235e8266f0\",\"dweb:/ipfs/QmQZ1eFbqkVKAkKc4mXUCbGrdD6rE4sgzbzbSzS8RC4SCX\"]},\"contracts/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x5aa9d21c5b41c9786f23153f819d561ae809a1d55c7b0d423dfeafdfbacedc78\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://921c44e6a0982b9a4011900fda1bda2c06b7a85894967de98b407a83fe9f90c0\",\"dweb:/ipfs/QmSsHLKDUQ82kpKdqB6VntVGKuPDb4W9VdotsubuqWBzio\"]},\"contracts/libraries/trie/MerkleTrie.sol\":{\"keccak256\":\"0xbbf5b9e6b2ea942038ca5ed5722352c499019b0a0026edbda9a70f777aa2600d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2222d31689b9a41747a0082c8c8689ca7560ca69528f3901c73ca0d2efc2985f\",\"dweb:/ipfs/QmXHEZtsUkrGLGT9R5kHETRNwPURCVnrKKvbbmHpDUUHVj\"]},\"contracts/libraries/trie/SecureMerkleTrie.sol\":{\"keccak256\":\"0xd27ad3665179493bab93a4316bcd2a780bfec524f774226420e931acf8043ebb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3ec639edab8c22e020dd7a108f69d7dc99f2e9d0bb9075e9aa41d4bd1f5cc03\",\"dweb:/ipfs/QmR9fMgKEVLNm4LPbpSEX9AepmELxX6JXNm2o8tCXceBSF\"]},\"contracts/universal/Semver.sol\":{\"keccak256\":\"0x8215e8fbaace5e06fdf0be26cd8ec224847cf03e89bd78dc8ba3ec2cb429d4fe\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cfe4869ad9a1a10aee499ed4ac74a19f9f95dd9173efa656f6b1728f6912a9ad\",\"dweb:/ipfs/QmbiKSxpNnKQv8jwEvGUJkksaLPp8UU8N1twbDimM3RhXr\"]},\"contracts/vendor/AddressAliasHelper.sol\":{\"keccak256\":\"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88\",\"dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x32c202bd28995dd20c4347b7c6467a6d3241c74c8ad3edcbb610cd9205916c45\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8179c356adb19e70d6b31a1eedc8c5c7f0c00e669e2540f4099e3844c6074d30\",\"dweb:/ipfs/QmWFbivarEobbqhS1go64ootVuHfVohBseerYy9FTEd1W2\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xc995bddbca1ae19788db9f8b61e63385edd3fddf89693b612d5abd1a275974d2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab84f13e6e6e0823854a0cddd49e96df052092d5919f95587607f0ed28a64cb6\",\"dweb:/ipfs/QmbNtqAq23ZDjCzHukQaa7B3y6rcobscm6FZF5PMQXcnVr\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"node_modules/@rari-capital/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"node_modules/excessively-safe-call/src/ExcessivelySafeCall.sol\":{\"keccak256\":\"0x7d9d432e8f02168bf3f790e3dabcf36402782acf7ffa476cabe86fc4d8962eb2\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://1adc13e7f399f500ea5f81480ad149a50408fde7990a2c6347e6377486f389dc\",\"dweb:/ipfs/QmSvm5TUBJqknsqNJLLHqNS4MLSH5k3vNrbquVg6ZKSfx9\"]}},\"version\":1}",
-  "bytecode": "0x6101206040523480156200001257600080fd5b506040516200401238038062004012833981016040819052620000359162000261565b6000608081905260a052600160c0526001600160a01b0382166101005260e08190526200006162000069565b50506200029d565b600054610100900460ff16158080156200008a5750600054600160ff909116105b80620000ba5750620000a730620001af60201b6200127e1760201c565b158015620000ba575060005460ff166001145b620001235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000147576000805461ff0019166101001790555b603380546001600160a01b03191661dead17905562000165620001be565b8015620001ac576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6001600160a01b03163b151590565b600054610100900460ff166200022b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200011a565b60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b600080604083850312156200027557600080fd5b82516001600160a01b03811681146200028d57600080fd5b6020939093015192949293505050565b60805160a05160c05160e05161010051613d1b620002f76000396000818161013401528181610b690152610d900152600081816103bd015261155701526000610918015260006108ef015260006108c60152613d1b6000f3fe6080604052600436106100f65760003560e01c8063a14238e71161008a578063cff0ab9611610059578063cff0ab96146102f7578063e9e05c4214610398578063f4daa291146103ab578063fdc9fe1d146103df57600080fd5b8063a14238e71461026d578063c4fc4798146102ad578063ca3e99ba146102cd578063cd7c9789146102e257600080fd5b80636bb0291e116100c65780636bb0291e146102005780638129fc1c14610215578063867ead131461022a5780639bf62d821461024057600080fd5b80621c2ff61461012257806313620abd1461018057806354fd4d50146101b957806364b79208146101db57600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f2565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce6108bf565b604051610177919061336e565b3480156101e757600080fd5b506101f2627a120081565b604051908152602001610177565b34801561020c57600080fd5b506101f2600481565b34801561022157600080fd5b5061011b610962565b34801561023657600080fd5b506101f261271081565b34801561024c57600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027957600080fd5b5061029d610288366004613381565b60346020526000908152604090205460ff1681565b6040519015158152602001610177565b3480156102b957600080fd5b5061029d6102c8366004613381565b610b20565b3480156102d957600080fd5b506101f2610be5565b3480156102ee57600080fd5b506101f2600881565b34801561030357600080fd5b5060015461035f906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103a63660046134c6565b6103f2565b3480156103b757600080fd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b61011b6103ed3660046135b4565b610bf6565b8260005a905083156104a95773ffffffffffffffffffffffffffffffffffffffff8716156104a957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104ca575033731111000000000000000000000000000000001111015b600034888888886040516020016104e59594939291906136a8565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610555919061336e565b60405180910390a45050600154600090610595907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361373c565b9050801561071e5760006105ad6004627a1200613782565b6001546105d89190700100000000000000000000000000000000900467ffffffffffffffff166137ea565b9050600060086105ec6004627a1200613782565b60015461060c9085906fffffffffffffffffffffffffffffffff1661385e565b6106169190613782565b6106209190613782565b60015490915060009061066c906106569061064e9085906fffffffffffffffffffffffffffffffff1661391a565b61271061129a565b6fffffffffffffffffffffffffffffffff6112b5565b905060018411156106df576106dc610656670de0b6b3a76400006106c8610694600883613782565b6106a690670de0b6b3a76400006137ea565b6106b160018a61373c565b6106c390670de0b6b3a764000061398e565b6112c4565b6106d2908561385e565b61064e9190613782565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054849190601090610751908490700100000000000000000000000000000000900467ffffffffffffffff166139cb565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016104a0565b600154600090610859906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166139f7565b6fffffffffffffffffffffffffffffffff169050600061087d48633b9aca006112f5565b6108879083613a2f565b905060005a610896908661373c565b9050808211156108b2576108b26108ad828461373c565b611305565b5050505050505050505050565b60606108ea7f0000000000000000000000000000000000000000000000000000000000000000611333565b6109137f0000000000000000000000000000000000000000000000000000000000000000611333565b61093c7f0000000000000000000000000000000000000000000000000000000000000000611333565b60405160200161094e93929190613a43565b604051602081830303815290604052905090565b600054610100900460ff16158080156109825750600054600160ff909116105b8061099c5750303b15801561099c575060005460ff166001145b610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a8657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610aba611470565b8015610b1d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa158015610baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd39190613ab9565b9050610bde81611553565b9392505050565b610bf36004627a1200613782565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a0565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610d5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a0565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190613ab9565b9050610e1a81611553565b610ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a0565b610ebd610eb836869003860186613b08565b61158d565b815114610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a0565b6000610f57876115e9565b9050610f9e81866040013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061161992505050565b61102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a0565b60008181526034602052604090205460ff16156110c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a0565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055608087015161111290614e2090613b6e565b5a10156111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a0565b8660200151603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000611206886040015189608001518a6060015160008c60a001516116e0565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061126c90841515815260200190565b60405180910390a25050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000818312156112aa57816112ac565b825b90505b92915050565b60008183126112aa57816112ac565b60006112ac670de0b6b3a7640000836112dc8661176b565b6112e6919061385e565b6112f09190613782565b6119af565b6000818310156112aa57816112ac565b6000805a90505b825a611318908361373c565b101561132e5761132782613b86565b915061130c565b505050565b60608160000361137657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156113a0578061138a81613b86565b91506113999050600a83613a2f565b915061137a565b60008167ffffffffffffffff8111156113bb576113bb6133c3565b6040519080825280601f01601f1916602001820160405280156113e5576020820181803683370190505b5090505b8415611468576113fa60018361373c565b9150611407600a86613bbe565b611412906030613b6e565b60f81b81838151811061142757611427613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611461600a86613a2f565b94506113e9565b949350505050565b600054610100900460ff16611507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a0565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b60007f000000000000000000000000000000000000000000000000000000000000000082602001516115859190613b6e565b421192915050565b600081600001518260200151836040015184606001516040516020016115cc949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a088015193516000976115cc979096959101613c01565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506116d79101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611bee565b95945050505050565b6000606060008060008661ffff1667ffffffffffffffff811115611706576117066133c3565b6040519080825280601f01601f191660200182016040528015611730576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115611751578692505b828152826000602083013e90999098509650505050505050565b60008082136117d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b600060606117e384611c12565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136119e057506000919050565b680755bf798b4a1bf1e58212611a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611bfa86611ce8565b9050611c0881868686611d1a565b9695505050505050565b6000808211611c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611d0491815260200190565b6040516020818303038152906040529050919050565b6000806000611d2a878686611d57565b91509150818015611d4c57508051602080830191909120875191880191909120145b979650505050505050565b600060606000611d6685611e72565b90506000806000611d78848a89611f6d565b81519295509093509150158080611d8c5750815b611e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2070726f76696465642070726f6f6620697320696e60448201527f76616c696400000000000000000000000000000000000000000000000000000060648201526084016104a0565b600081611e345760405180602001604052806000815250611e60565b611e6086611e4360018861373c565b81518110611e5357611e53613bd2565b60200260200101516124f6565b919b919a509098505050505050505050565b60606000611e7f83612520565b90506000815167ffffffffffffffff811115611e9d57611e9d6133c3565b604051908082528060200260200182016040528015611ee257816020015b6040805180820190915260608082526020820152815260200190600190039081611ebb5790505b50905060005b8251811015611f65576000611f15848381518110611f0857611f08613bd2565b6020026020010151612553565b90506040518060400160405280828152602001611f3183612520565b815250838381518110611f4657611f46613bd2565b6020026020010181905250508080611f5d90613b86565b915050611ee8565b509392505050565b60006060818080611f7d8761261a565b90506000869050600080611fa4604051806040016040528060608152602001606081525090565b60005b8c518110156124b2578c8181518110611fc257611fc2613bd2565b602002602001015191508284611fd89190613b6e565b9350611fe5600188613b6e565b96508360000361206657815180516020909101208514612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016104a0565b6121a2565b81515160201161210857815180516020909101208514612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016104a0565b8151859061211590613c58565b146121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016104a0565b6121ae60106001613b6e565b8260200151510361222057855184146124b25760008685815181106121d5576121d5613bd2565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061220057612200613bd2565b602002602001015190506122138161279d565b96506001945050506124a0565b600282602001515103612418576000612238836127d3565b905060008160008151811061224f5761224f613bd2565b016020015160f81c90506000612266600283613c9a565b612271906002613cbc565b90506000612282848360ff166127f7565b905060006122908b8a6127f7565b9050600061229e838361282d565b905060ff8516600214806122b5575060ff85166003145b1561230b578083511480156122ca5750808251145b156122dc576122d9818b613b6e565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506124b2945050505050565b60ff8516158061231e575060ff85166001145b15612390578251811461235a57507f800000000000000000000000000000000000000000000000000000000000000099506124b2945050505050565b612381886020015160018151811061237457612374613bd2565b602002602001015161279d565b9a5097506124a0945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016104a0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016104a0565b806124aa81613b86565b915050611fa7565b507f80000000000000000000000000000000000000000000000000000000000000008414866124e187866127f7565b909e909d50909b509950505050505050505050565b602081015180516060916112af916125109060019061373c565b81518110611f0857611f08613bd2565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906112af906128d9565b6060600080600061256385612b32565b91945092509050600081600181111561257e5761257e613cdf565b1461260b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c502062797465732076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6116d78560200151848461301d565b606060008251600261262c919061398e565b67ffffffffffffffff811115612644576126446133c3565b6040519080825280601f01601f19166020018201604052801561266e576020820181803683370190505b50905060005b835181101561279657600484828151811061269157612691613bd2565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826126c683600261398e565b815181106126d6576126d6613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061271957612719613bd2565b016020015161272b919060f81c613c9a565b60f81b8261273a83600261398e565b612745906001613b6e565b8151811061275557612755613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061278e81613b86565b915050612674565b5092915050565b600060606020836000015110156127be576127b7836130fb565b90506127ca565b6127c783612553565b90505b610bde81613c58565b60606112af6127f28360200151600081518110611f0857611f08613bd2565b61261a565b60608251821061281657506040805160208101909152600081526112af565b6112ac8383848651612828919061373c565b613106565b6000805b8084511180156128415750808351115b80156128c2575082818151811061285a5761285a613bd2565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061289957612899613bd2565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156112ac57806128d181613b86565b915050612831565b60606000806128e784612b32565b9193509091506001905081600181111561290357612903613cdf565b14612990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c50206c6973742076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816129a95790505090506000835b8651811015612b275760208210612a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2070726f766964656420524c50206c6973742065786360448201527f65656473206d6178206c697374206c656e67746800000000000000000000000060648201526084016104a0565b600080612aac6040518060400160405280858c60000151612a90919061373c565b8152602001858c60200151612aa59190613b6e565b9052612b32565b509150915060405180604001604052808383612ac89190613b6e565b8152602001848b60200151612add9190613b6e565b815250858581518110612af257612af2613bd2565b6020908102919091010152612b08600185613b6e565b9350612b148183613b6e565b612b1e9084613b6e565b925050506129d6565b508152949350505050565b600080600080846000015111612bca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20524c50206974656d2063616e6e6f74206265206e7560448201527f6c6c00000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6020840151805160001a607f8111612bef576000600160009450945094505050613016565b60b78111612cab576000612c0460808361373c565b905080876000015111612c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f524c505265616465723a20696e76616c696420524c502073686f72742073747260448201527f696e67000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b60019550935060009250613016915050565b60bf8111612e1a576000612cc060b78361373c565b905080876000015111612d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e67206c656e677468000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612d6f8183613b6e565b885111612dfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e6700000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b612e09826001613b6e565b965094506000935061301692505050565b60f78111612ed5576000612e2f60c08361373c565b905080876000015111612ec4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c502073686f7274206c697360448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b600195509350849250613016915050565b6000612ee260f78361373c565b905080876000015111612f77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201527f206c656e6774680000000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612f918183613b6e565b885111612ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201526064016104a0565b613005826001613b6e565b965094506001935061301692505050565b9193909250565b606060008267ffffffffffffffff81111561303a5761303a6133c3565b6040519080825280601f01601f191660200182016040528015613064576020820181803683370190505b5090508051600003613077579050610bde565b60006130838587613b6e565b90506020820160005b613097602087613a2f565b8110156130ce57825182526130ad602084613b6e565b92506130ba602083613b6e565b9150806130c681613b86565b91505061308c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606112af826132de565b60608182601f011015613175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8282840110156131e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8183018451101561324e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a0565b60608215801561326d57604051915060008252602082016040526132d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156132a657805183526020928301920161328e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60606112af82602001516000846000015161301d565b60005b8381101561330f5781810151838201526020016132f7565b8381111561331e576000848401525b50505050565b6000815180845261333c8160208601602086016132f4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112ac6020830184613324565b60006020828403121561339357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146133be57600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715613415576134156133c3565b60405290565b600082601f83011261342c57600080fd5b813567ffffffffffffffff80821115613447576134476133c3565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561348d5761348d6133c3565b816040528381528660208588010111156134a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156134de57600080fd5b6134e78661339a565b945060208601359350604086013567ffffffffffffffff808216821461350c57600080fd5b909350606087013590811515821461352357600080fd5b9092506080870135908082111561353957600080fd5b506135468882890161341b565b9150509295509295909350565b60006080828403121561356557600080fd5b50919050565b60008083601f84011261357d57600080fd5b50813567ffffffffffffffff81111561359557600080fd5b6020830191508360208285010111156135ad57600080fd5b9250929050565b600080600080600060e086880312156135cc57600080fd5b853567ffffffffffffffff808211156135e457600080fd5b9087019060c0828a0312156135f857600080fd5b6136006133f2565b823581526136106020840161339a565b60208201526136216040840161339a565b6040820152606083013560608201526080830135608082015260a08301358281111561364c57600080fd5b6136588b82860161341b565b60a0830152509650602088013595506136748960408a01613553565b945060c088013591508082111561368a57600080fd5b506136978882890161356b565b969995985093965092949392505050565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516136fc8160498501602087016132f4565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561374e5761374e61370d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261379157613791613753565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156137e5576137e561370d565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156138245761382461370d565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156138585761385861370d565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561389f5761389f61370d565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156138da576138da61370d565b600087129250878205871284841616156138f6576138f661370d565b8785058712818416161561390c5761390c61370d565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156139545761395461370d565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156139885761398861370d565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139c6576139c661370d565b500290565b600067ffffffffffffffff8083168185168083038211156139ee576139ee61370d565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615613a2657613a2661370d565b02949350505050565b600082613a3e57613a3e613753565b500490565b60008451613a558184602089016132f4565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551613a91816001850160208a016132f4565b60019201918201528351613aac8160028401602088016132f4565b0160020195945050505050565b600060408284031215613acb57600080fd5b6040516040810181811067ffffffffffffffff82111715613aee57613aee6133c3565b604052825181526020928301519281019290925250919050565b600060808284031215613b1a57600080fd5b6040516080810181811067ffffffffffffffff82111715613b3d57613b3d6133c3565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60008219821115613b8157613b8161370d565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bb757613bb761370d565b5060010190565b600082613bcd57613bcd613753565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613c4c60c0830184613324565b98975050505050505050565b80516020808301519190811015613565577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b600060ff831680613cad57613cad613753565b8060ff84160691505092915050565b600060ff821660ff841680821015613cd657613cd661370d565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
-  "deployedBytecode": "0x6080604052600436106100f65760003560e01c8063a14238e71161008a578063cff0ab9611610059578063cff0ab96146102f7578063e9e05c4214610398578063f4daa291146103ab578063fdc9fe1d146103df57600080fd5b8063a14238e71461026d578063c4fc4798146102ad578063ca3e99ba146102cd578063cd7c9789146102e257600080fd5b80636bb0291e116100c65780636bb0291e146102005780638129fc1c14610215578063867ead131461022a5780639bf62d821461024057600080fd5b80621c2ff61461012257806313620abd1461018057806354fd4d50146101b957806364b79208146101db57600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f2565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce6108bf565b604051610177919061336e565b3480156101e757600080fd5b506101f2627a120081565b604051908152602001610177565b34801561020c57600080fd5b506101f2600481565b34801561022157600080fd5b5061011b610962565b34801561023657600080fd5b506101f261271081565b34801561024c57600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027957600080fd5b5061029d610288366004613381565b60346020526000908152604090205460ff1681565b6040519015158152602001610177565b3480156102b957600080fd5b5061029d6102c8366004613381565b610b20565b3480156102d957600080fd5b506101f2610be5565b3480156102ee57600080fd5b506101f2600881565b34801561030357600080fd5b5060015461035f906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103a63660046134c6565b6103f2565b3480156103b757600080fd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b61011b6103ed3660046135b4565b610bf6565b8260005a905083156104a95773ffffffffffffffffffffffffffffffffffffffff8716156104a957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104ca575033731111000000000000000000000000000000001111015b600034888888886040516020016104e59594939291906136a8565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610555919061336e565b60405180910390a45050600154600090610595907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361373c565b9050801561071e5760006105ad6004627a1200613782565b6001546105d89190700100000000000000000000000000000000900467ffffffffffffffff166137ea565b9050600060086105ec6004627a1200613782565b60015461060c9085906fffffffffffffffffffffffffffffffff1661385e565b6106169190613782565b6106209190613782565b60015490915060009061066c906106569061064e9085906fffffffffffffffffffffffffffffffff1661391a565b61271061129a565b6fffffffffffffffffffffffffffffffff6112b5565b905060018411156106df576106dc610656670de0b6b3a76400006106c8610694600883613782565b6106a690670de0b6b3a76400006137ea565b6106b160018a61373c565b6106c390670de0b6b3a764000061398e565b6112c4565b6106d2908561385e565b61064e9190613782565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054849190601090610751908490700100000000000000000000000000000000900467ffffffffffffffff166139cb565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016104a0565b600154600090610859906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166139f7565b6fffffffffffffffffffffffffffffffff169050600061087d48633b9aca006112f5565b6108879083613a2f565b905060005a610896908661373c565b9050808211156108b2576108b26108ad828461373c565b611305565b5050505050505050505050565b60606108ea7f0000000000000000000000000000000000000000000000000000000000000000611333565b6109137f0000000000000000000000000000000000000000000000000000000000000000611333565b61093c7f0000000000000000000000000000000000000000000000000000000000000000611333565b60405160200161094e93929190613a43565b604051602081830303815290604052905090565b600054610100900460ff16158080156109825750600054600160ff909116105b8061099c5750303b15801561099c575060005460ff166001145b610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a8657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610aba611470565b8015610b1d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa158015610baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd39190613ab9565b9050610bde81611553565b9392505050565b610bf36004627a1200613782565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a0565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610d5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a0565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190613ab9565b9050610e1a81611553565b610ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a0565b610ebd610eb836869003860186613b08565b61158d565b815114610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a0565b6000610f57876115e9565b9050610f9e81866040013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061161992505050565b61102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a0565b60008181526034602052604090205460ff16156110c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a0565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055608087015161111290614e2090613b6e565b5a10156111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a0565b8660200151603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000611206886040015189608001518a6060015160008c60a001516116e0565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061126c90841515815260200190565b60405180910390a25050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000818312156112aa57816112ac565b825b90505b92915050565b60008183126112aa57816112ac565b60006112ac670de0b6b3a7640000836112dc8661176b565b6112e6919061385e565b6112f09190613782565b6119af565b6000818310156112aa57816112ac565b6000805a90505b825a611318908361373c565b101561132e5761132782613b86565b915061130c565b505050565b60608160000361137657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156113a0578061138a81613b86565b91506113999050600a83613a2f565b915061137a565b60008167ffffffffffffffff8111156113bb576113bb6133c3565b6040519080825280601f01601f1916602001820160405280156113e5576020820181803683370190505b5090505b8415611468576113fa60018361373c565b9150611407600a86613bbe565b611412906030613b6e565b60f81b81838151811061142757611427613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611461600a86613a2f565b94506113e9565b949350505050565b600054610100900460ff16611507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a0565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b60007f000000000000000000000000000000000000000000000000000000000000000082602001516115859190613b6e565b421192915050565b600081600001518260200151836040015184606001516040516020016115cc949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a088015193516000976115cc979096959101613c01565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506116d79101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611bee565b95945050505050565b6000606060008060008661ffff1667ffffffffffffffff811115611706576117066133c3565b6040519080825280601f01601f191660200182016040528015611730576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115611751578692505b828152826000602083013e90999098509650505050505050565b60008082136117d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b600060606117e384611c12565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136119e057506000919050565b680755bf798b4a1bf1e58212611a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611bfa86611ce8565b9050611c0881868686611d1a565b9695505050505050565b6000808211611c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611d0491815260200190565b6040516020818303038152906040529050919050565b6000806000611d2a878686611d57565b91509150818015611d4c57508051602080830191909120875191880191909120145b979650505050505050565b600060606000611d6685611e72565b90506000806000611d78848a89611f6d565b81519295509093509150158080611d8c5750815b611e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2070726f76696465642070726f6f6620697320696e60448201527f76616c696400000000000000000000000000000000000000000000000000000060648201526084016104a0565b600081611e345760405180602001604052806000815250611e60565b611e6086611e4360018861373c565b81518110611e5357611e53613bd2565b60200260200101516124f6565b919b919a509098505050505050505050565b60606000611e7f83612520565b90506000815167ffffffffffffffff811115611e9d57611e9d6133c3565b604051908082528060200260200182016040528015611ee257816020015b6040805180820190915260608082526020820152815260200190600190039081611ebb5790505b50905060005b8251811015611f65576000611f15848381518110611f0857611f08613bd2565b6020026020010151612553565b90506040518060400160405280828152602001611f3183612520565b815250838381518110611f4657611f46613bd2565b6020026020010181905250508080611f5d90613b86565b915050611ee8565b509392505050565b60006060818080611f7d8761261a565b90506000869050600080611fa4604051806040016040528060608152602001606081525090565b60005b8c518110156124b2578c8181518110611fc257611fc2613bd2565b602002602001015191508284611fd89190613b6e565b9350611fe5600188613b6e565b96508360000361206657815180516020909101208514612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016104a0565b6121a2565b81515160201161210857815180516020909101208514612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016104a0565b8151859061211590613c58565b146121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016104a0565b6121ae60106001613b6e565b8260200151510361222057855184146124b25760008685815181106121d5576121d5613bd2565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061220057612200613bd2565b602002602001015190506122138161279d565b96506001945050506124a0565b600282602001515103612418576000612238836127d3565b905060008160008151811061224f5761224f613bd2565b016020015160f81c90506000612266600283613c9a565b612271906002613cbc565b90506000612282848360ff166127f7565b905060006122908b8a6127f7565b9050600061229e838361282d565b905060ff8516600214806122b5575060ff85166003145b1561230b578083511480156122ca5750808251145b156122dc576122d9818b613b6e565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506124b2945050505050565b60ff8516158061231e575060ff85166001145b15612390578251811461235a57507f800000000000000000000000000000000000000000000000000000000000000099506124b2945050505050565b612381886020015160018151811061237457612374613bd2565b602002602001015161279d565b9a5097506124a0945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016104a0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016104a0565b806124aa81613b86565b915050611fa7565b507f80000000000000000000000000000000000000000000000000000000000000008414866124e187866127f7565b909e909d50909b509950505050505050505050565b602081015180516060916112af916125109060019061373c565b81518110611f0857611f08613bd2565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906112af906128d9565b6060600080600061256385612b32565b91945092509050600081600181111561257e5761257e613cdf565b1461260b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c502062797465732076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6116d78560200151848461301d565b606060008251600261262c919061398e565b67ffffffffffffffff811115612644576126446133c3565b6040519080825280601f01601f19166020018201604052801561266e576020820181803683370190505b50905060005b835181101561279657600484828151811061269157612691613bd2565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826126c683600261398e565b815181106126d6576126d6613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061271957612719613bd2565b016020015161272b919060f81c613c9a565b60f81b8261273a83600261398e565b612745906001613b6e565b8151811061275557612755613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061278e81613b86565b915050612674565b5092915050565b600060606020836000015110156127be576127b7836130fb565b90506127ca565b6127c783612553565b90505b610bde81613c58565b60606112af6127f28360200151600081518110611f0857611f08613bd2565b61261a565b60608251821061281657506040805160208101909152600081526112af565b6112ac8383848651612828919061373c565b613106565b6000805b8084511180156128415750808351115b80156128c2575082818151811061285a5761285a613bd2565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061289957612899613bd2565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156112ac57806128d181613b86565b915050612831565b60606000806128e784612b32565b9193509091506001905081600181111561290357612903613cdf565b14612990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c50206c6973742076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816129a95790505090506000835b8651811015612b275760208210612a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2070726f766964656420524c50206c6973742065786360448201527f65656473206d6178206c697374206c656e67746800000000000000000000000060648201526084016104a0565b600080612aac6040518060400160405280858c60000151612a90919061373c565b8152602001858c60200151612aa59190613b6e565b9052612b32565b509150915060405180604001604052808383612ac89190613b6e565b8152602001848b60200151612add9190613b6e565b815250858581518110612af257612af2613bd2565b6020908102919091010152612b08600185613b6e565b9350612b148183613b6e565b612b1e9084613b6e565b925050506129d6565b508152949350505050565b600080600080846000015111612bca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20524c50206974656d2063616e6e6f74206265206e7560448201527f6c6c00000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6020840151805160001a607f8111612bef576000600160009450945094505050613016565b60b78111612cab576000612c0460808361373c565b905080876000015111612c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f524c505265616465723a20696e76616c696420524c502073686f72742073747260448201527f696e67000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b60019550935060009250613016915050565b60bf8111612e1a576000612cc060b78361373c565b905080876000015111612d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e67206c656e677468000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612d6f8183613b6e565b885111612dfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e6700000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b612e09826001613b6e565b965094506000935061301692505050565b60f78111612ed5576000612e2f60c08361373c565b905080876000015111612ec4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c502073686f7274206c697360448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b600195509350849250613016915050565b6000612ee260f78361373c565b905080876000015111612f77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201527f206c656e6774680000000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612f918183613b6e565b885111612ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201526064016104a0565b613005826001613b6e565b965094506001935061301692505050565b9193909250565b606060008267ffffffffffffffff81111561303a5761303a6133c3565b6040519080825280601f01601f191660200182016040528015613064576020820181803683370190505b5090508051600003613077579050610bde565b60006130838587613b6e565b90506020820160005b613097602087613a2f565b8110156130ce57825182526130ad602084613b6e565b92506130ba602083613b6e565b9150806130c681613b86565b91505061308c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606112af826132de565b60608182601f011015613175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8282840110156131e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8183018451101561324e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a0565b60608215801561326d57604051915060008252602082016040526132d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156132a657805183526020928301920161328e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60606112af82602001516000846000015161301d565b60005b8381101561330f5781810151838201526020016132f7565b8381111561331e576000848401525b50505050565b6000815180845261333c8160208601602086016132f4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112ac6020830184613324565b60006020828403121561339357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146133be57600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715613415576134156133c3565b60405290565b600082601f83011261342c57600080fd5b813567ffffffffffffffff80821115613447576134476133c3565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561348d5761348d6133c3565b816040528381528660208588010111156134a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156134de57600080fd5b6134e78661339a565b945060208601359350604086013567ffffffffffffffff808216821461350c57600080fd5b909350606087013590811515821461352357600080fd5b9092506080870135908082111561353957600080fd5b506135468882890161341b565b9150509295509295909350565b60006080828403121561356557600080fd5b50919050565b60008083601f84011261357d57600080fd5b50813567ffffffffffffffff81111561359557600080fd5b6020830191508360208285010111156135ad57600080fd5b9250929050565b600080600080600060e086880312156135cc57600080fd5b853567ffffffffffffffff808211156135e457600080fd5b9087019060c0828a0312156135f857600080fd5b6136006133f2565b823581526136106020840161339a565b60208201526136216040840161339a565b6040820152606083013560608201526080830135608082015260a08301358281111561364c57600080fd5b6136588b82860161341b565b60a0830152509650602088013595506136748960408a01613553565b945060c088013591508082111561368a57600080fd5b506136978882890161356b565b969995985093965092949392505050565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516136fc8160498501602087016132f4565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561374e5761374e61370d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261379157613791613753565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156137e5576137e561370d565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156138245761382461370d565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156138585761385861370d565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561389f5761389f61370d565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156138da576138da61370d565b600087129250878205871284841616156138f6576138f661370d565b8785058712818416161561390c5761390c61370d565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156139545761395461370d565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156139885761398861370d565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139c6576139c661370d565b500290565b600067ffffffffffffffff8083168185168083038211156139ee576139ee61370d565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615613a2657613a2661370d565b02949350505050565b600082613a3e57613a3e613753565b500490565b60008451613a558184602089016132f4565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551613a91816001850160208a016132f4565b60019201918201528351613aac8160028401602088016132f4565b0160020195945050505050565b600060408284031215613acb57600080fd5b6040516040810181811067ffffffffffffffff82111715613aee57613aee6133c3565b604052825181526020928301519281019290925250919050565b600060808284031215613b1a57600080fd5b6040516080810181811067ffffffffffffffff82111715613b3d57613b3d6133c3565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60008219821115613b8157613b8161370d565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bb757613bb761370d565b5060010190565b600082613bcd57613bcd613753565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613c4c60c0830184613324565b98975050505050505050565b80516020808301519190811015613565577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b600060ff831680613cad57613cad613753565b8060ff84160691505092915050565b600060ff821660ff841680821015613cd657613cd661370d565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
-  "devdoc": {
-    "version": 1,
-    "kind": "dev",
-    "methods": {
-      "constructor": {
-        "params": {
-          "_finalizationPeriodSeconds": "Output finalization time in seconds.",
-          "_l2Oracle": "Address of the L2OutputOracle contract."
-        }
-      },
-      "depositTransaction(address,uint256,uint64,bool,bytes)": {
-        "params": {
-          "_data": "Data to trigger the recipient with.",
-          "_gasLimit": "Minimum L2 gas limit (can be greater than or equal to this value).",
-          "_isCreation": "Whether or not the transaction is a contract creation.",
-          "_to": "Target address on L2.",
-          "_value": "ETH value to send to the recipient."
-        }
-      },
-      "finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes)": {
-        "params": {
-          "_l2BlockNumber": "L2 block number of the outputRoot.",
-          "_outputRootProof": "Inclusion proof of the withdrawer contracts storage root.",
-          "_tx": "Withdrawal transaction to finalize.",
-          "_withdrawalProof": "Inclusion proof for the given withdrawal in the withdrawer contract."
-        }
-      },
-      "isBlockFinalized(uint256)": {
-        "params": {
-          "_l2BlockNumber": "The number of the L2 block."
-        }
-      },
-      "version()": {
-        "returns": {
-          "_0": "Semver contract version as a string."
-        }
-      }
-    },
-    "events": {
-      "TransactionDeposited(address,address,uint256,bytes)": {
-        "params": {
-          "from": "Address that triggered the deposit transaction.",
-          "opaqueData": "ABI encoded deposit data to be parsed off-chain.",
-          "to": "Address that the deposit transaction is directed to.",
-          "version": "Version of this deposit transaction event."
-        }
-      },
-      "WithdrawalFinalized(bytes32,bool)": {
-        "params": {
-          "success": "Whether the withdrawal transaction was successful.",
-          "withdrawalHash": "Hash of the withdrawal transaction."
-        }
-      }
-    }
-  },
-  "userdoc": {
-    "version": 1,
-    "kind": "user",
-    "methods": {
-      "BASE_FEE_MAX_CHANGE_DENOMINATOR()": {
-        "notice": "Denominator that determines max change on fee per block."
-      },
-      "ELASTICITY_MULTIPLIER()": {
-        "notice": "Along with the resource limit, determines the target resource limit."
-      },
-      "FINALIZATION_PERIOD_SECONDS()": {
-        "notice": "Minimum time (in seconds) that must elapse before a withdrawal can be finalized."
-      },
-      "INITIAL_BASE_FEE()": {
-        "notice": "Initial base fee value."
-      },
-      "L2_ORACLE()": {
-        "notice": "Address of the L2OutputOracle."
-      },
-      "MAX_RESOURCE_LIMIT()": {
-        "notice": "Maximum amount of the resource that can be used within this block."
-      },
-      "MINIMUM_BASE_FEE()": {
-        "notice": "Minimum base fee value, cannot go lower than this."
-      },
-      "TARGET_RESOURCE_LIMIT()": {
-        "notice": "Target amount of the resource that should be used within this block."
-      },
-      "depositTransaction(address,uint256,uint64,bool,bytes)": {
-        "notice": "Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in         deriving deposit transactions. Note that if a deposit is made by a contract, its         address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider         using the CrossDomainMessenger contracts for a simpler developer experience."
-      },
-      "finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes)": {
-        "notice": "Finalizes a withdrawal transaction."
-      },
-      "finalizedWithdrawals(bytes32)": {
-        "notice": "A list of withdrawal hashes which have been successfully finalized."
-      },
-      "initialize()": {
-        "notice": "Initializer;"
-      },
-      "isBlockFinalized(uint256)": {
-        "notice": "Determine if a given block number is finalized. Reverts if the call to         L2_ORACLE.getL2Output reverts. Returns a boolean otherwise."
-      },
-      "l2Sender()": {
-        "notice": "Address of the L2 account which initiated a withdrawal in this transaction. If the         of this variable is the default L2 sender address, then we are NOT inside of a call         to finalizeWithdrawalTransaction."
-      },
-      "params()": {
-        "notice": "EIP-1559 style gas parameters."
-      },
-      "version()": {
-        "notice": "Returns the full semver contract version."
-      }
-    },
-    "events": {
-      "TransactionDeposited(address,address,uint256,bytes)": {
-        "notice": "Emitted when a transaction is deposited from L1 to L2. The parameters of this event         are read by the rollup node and used to derive deposit transactions on L2."
-      },
-      "WithdrawalFinalized(bytes32,bool)": {
-        "notice": "Emitted when a withdrawal transaction is finalized."
-      }
-    },
-    "notice": "The OptimismPortal is a low-level contract responsible for passing messages between L1         and L2. Messages sent directly to the OptimismPortal have no form of replayability.         Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface."
-  },
-  "storageLayout": {
-    "storage": [
-      {
-        "astId": 25872,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "_initialized",
-        "offset": 0,
-        "slot": "0",
-        "type": "t_uint8"
-      },
-      {
-        "astId": 25875,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "_initializing",
-        "offset": 1,
-        "slot": "0",
-        "type": "t_bool"
-      },
-      {
-        "astId": 1389,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "params",
-        "offset": 0,
-        "slot": "1",
-        "type": "t_struct(ResourceParams)1359_storage"
-      },
-      {
-        "astId": 1394,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "__gap",
-        "offset": 0,
-        "slot": "2",
-        "type": "t_array(t_uint256)49_storage"
-      },
-      {
-        "astId": 961,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "l2Sender",
-        "offset": 0,
-        "slot": "51",
-        "type": "t_address"
-      },
-      {
-        "astId": 974,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "finalizedWithdrawals",
-        "offset": 0,
-        "slot": "52",
-        "type": "t_mapping(t_bytes32,t_bool)"
-      },
-      {
-        "astId": 979,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "__gap",
-        "offset": 0,
-        "slot": "53",
-        "type": "t_array(t_uint256)48_storage"
-      }
-    ],
-    "types": {
-      "t_address": {
-        "encoding": "inplace",
-        "label": "address",
-        "numberOfBytes": "20"
-      },
-      "t_array(t_uint256)48_storage": {
-        "encoding": "inplace",
-        "label": "uint256[48]",
-        "numberOfBytes": "1536"
-      },
-      "t_array(t_uint256)49_storage": {
-        "encoding": "inplace",
-        "label": "uint256[49]",
-        "numberOfBytes": "1568"
-      },
-      "t_bool": {
-        "encoding": "inplace",
-        "label": "bool",
-        "numberOfBytes": "1"
-      },
-      "t_bytes32": {
-        "encoding": "inplace",
-        "label": "bytes32",
-        "numberOfBytes": "32"
-      },
-      "t_mapping(t_bytes32,t_bool)": {
-        "encoding": "mapping",
-        "label": "mapping(bytes32 => bool)",
-        "numberOfBytes": "32"
-      },
-      "t_struct(ResourceParams)1359_storage": {
-        "encoding": "inplace",
-        "label": "struct ResourceMetering.ResourceParams",
-        "numberOfBytes": "32"
-      },
-      "t_uint128": {
-        "encoding": "inplace",
-        "label": "uint128",
-        "numberOfBytes": "16"
-      },
-      "t_uint256": {
-        "encoding": "inplace",
-        "label": "uint256",
-        "numberOfBytes": "32"
-      },
-      "t_uint64": {
-        "encoding": "inplace",
-        "label": "uint64",
-        "numberOfBytes": "8"
-      },
-      "t_uint8": {
-        "encoding": "inplace",
-        "label": "uint8",
-        "numberOfBytes": "1"
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/op-bindings/hardhat/testdata/deployments/alpha/OptimismPortalProxy.json b/op-bindings/hardhat/testdata/deployments/alpha/OptimismPortalProxy.json
deleted file mode 100644
index e2d373ed60e3..000000000000
--- a/op-bindings/hardhat/testdata/deployments/alpha/OptimismPortalProxy.json
+++ /dev/null
@@ -1,253 +0,0 @@
-{
-  "address": "0xf39Acf72E84af85b191BF03f7B9BcAb102Bd9172",
-  "abi": [
-    {
-      "inputs": [
-        {
-          "internalType": "address",
-          "name": "_admin",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "nonpayable",
-      "type": "constructor"
-    },
-    {
-      "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": "implementation",
-          "type": "address"
-        }
-      ],
-      "name": "Upgraded",
-      "type": "event"
-    },
-    {
-      "stateMutability": "payable",
-      "type": "fallback"
-    },
-    {
-      "inputs": [],
-      "name": "admin",
-      "outputs": [
-        {
-          "internalType": "address",
-          "name": "",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "nonpayable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "address",
-          "name": "_admin",
-          "type": "address"
-        }
-      ],
-      "name": "changeAdmin",
-      "outputs": [],
-      "stateMutability": "nonpayable",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "implementation",
-      "outputs": [
-        {
-          "internalType": "address",
-          "name": "",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "nonpayable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "address",
-          "name": "_implementation",
-          "type": "address"
-        }
-      ],
-      "name": "upgradeTo",
-      "outputs": [],
-      "stateMutability": "nonpayable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "address",
-          "name": "_implementation",
-          "type": "address"
-        },
-        {
-          "internalType": "bytes",
-          "name": "_data",
-          "type": "bytes"
-        }
-      ],
-      "name": "upgradeToAndCall",
-      "outputs": [
-        {
-          "internalType": "bytes",
-          "name": "",
-          "type": "bytes"
-        }
-      ],
-      "stateMutability": "payable",
-      "type": "function"
-    },
-    {
-      "stateMutability": "payable",
-      "type": "receive"
-    }
-  ],
-  "transactionHash": "0x3aa85561932d72b07ac16a88536b21fea5e8a93bf3b87c81f635b8622c634042",
-  "receipt": {
-    "to": null,
-    "from": "0xCFf7a9856DB3C60AB546b8F43dC5D1A4336786A0",
-    "contractAddress": "0xf39Acf72E84af85b191BF03f7B9BcAb102Bd9172",
-    "transactionIndex": 0,
-    "gasUsed": "523812",
-    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000020000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000004000000000",
-    "blockHash": "0x3b98b3141f805127ca40450d4feb5267fbeb61c7b81418bb97fb0488484554c4",
-    "transactionHash": "0x3aa85561932d72b07ac16a88536b21fea5e8a93bf3b87c81f635b8622c634042",
-    "logs": [
-      {
-        "transactionIndex": 0,
-        "blockNumber": 7355245,
-        "transactionHash": "0x3aa85561932d72b07ac16a88536b21fea5e8a93bf3b87c81f635b8622c634042",
-        "address": "0xf39Acf72E84af85b191BF03f7B9BcAb102Bd9172",
-        "topics": [
-          "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"
-        ],
-        "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cff7a9856db3c60ab546b8f43dc5d1a4336786a0",
-        "logIndex": 0,
-        "blockHash": "0x3b98b3141f805127ca40450d4feb5267fbeb61c7b81418bb97fb0488484554c4"
-      }
-    ],
-    "blockNumber": 7355245,
-    "cumulativeGasUsed": "523812",
-    "status": 1,
-    "byzantium": true
-  },
-  "args": [
-    "0xCFf7a9856DB3C60AB546b8F43dC5D1A4336786A0"
-  ],
-  "numDeployments": 1,
-  "solcInputHash": "cd42cb04f3b6a78e5824c9f427d0a55d",
-  "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"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\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"params\":{\"newAdmin\":\"The new owner of the contract\",\"previousAdmin\":\"The previous owner of the contract\"}},\"Upgraded(address)\":{\"params\":{\"implementation\":\"The address of the implementation contract\"}}},\"kind\":\"dev\",\"methods\":{\"admin()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"changeAdmin(address)\":{\"params\":{\"_admin\":\"New owner of the proxy contract.\"}},\"constructor\":{\"params\":{\"_admin\":\"Address of the initial contract admin. Admin as the ability to access the               transparent proxy interface.\"}},\"implementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"upgradeTo(address)\":{\"params\":{\"_implementation\":\"Address of the implementation contract.\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"Calldata to delegatecall the new implementation with.\",\"_implementation\":\"Address of the implementation contract.\"}}},\"title\":\"Proxy\",\"version\":1},\"userdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"An event that is emitted each time the owner is upgraded. This event is part of the         EIP-1967 specification.\"},\"Upgraded(address)\":{\"notice\":\"An event that is emitted each time the implementation is changed. This event is part         of the EIP-1967 specification.\"}},\"kind\":\"user\",\"methods\":{\"admin()\":{\"notice\":\"Gets the owner of the proxy contract.\"},\"changeAdmin(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"constructor\":{\"notice\":\"Sets the initial admin during contract deployment. Admin address is stored at the         EIP-1967 admin storage slot so that accidental storage collision with the         implementation is not possible.\"},\"implementation()\":{\"notice\":\"Queries the implementation address.\"},\"upgradeTo(address)\":{\"notice\":\"Set the implementation contract address. The code at the given address will execute         when this contract is called.\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Set the implementation and call a function in a single transaction. Useful to ensure         atomic execution of initialization-based upgrades.\"}},\"notice\":\"Proxy is a transparent proxy that passes through the call if the caller is the owner or         if the caller is address(0), meaning that the call originated from an off-chain         simulation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/universal/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@eth-optimism/contracts-periphery/=node_modules/@eth-optimism/contracts-periphery/contracts/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/=node_modules/@rari-capital/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":contracts/=contracts/\",\":ds-test/=node_modules/ds-test/src/\",\":excessively-safe-call/=node_modules/excessively-safe-call/\",\":forge-std/=node_modules/forge-std/src/\"]},\"sources\":{\"contracts/universal/Proxy.sol\":{\"keccak256\":\"0xfa08635f1866139673ac4fe7b07330f752f93800075b895d8fcb8484f4a3f753\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8f2247604d527f560edbb851c43b6c16b37e34972ddb305e16dd73623b8288cd\",\"dweb:/ipfs/QmfM8sLAZrxrnqyRdt1XJ5LyJh4wKbeEqk3VkvxG7BDqFj\"]}},\"version\":1}",
-  "bytecode": "0x608060405234801561001057600080fd5b5060405161091838038061091883398101604081905261002f916100b2565b6100388161003e565b506100e2565b60006100566000805160206108f88339815191525490565b6000805160206108f8833981519152839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b6000602082840312156100c457600080fd5b81516001600160a01b03811681146100db57600080fd5b9392505050565b610807806100f16000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
-  "deployedBytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a",
-  "devdoc": {
-    "version": 1,
-    "kind": "dev",
-    "methods": {
-      "admin()": {
-        "returns": {
-          "_0": "Owner address."
-        }
-      },
-      "changeAdmin(address)": {
-        "params": {
-          "_admin": "New owner of the proxy contract."
-        }
-      },
-      "constructor": {
-        "params": {
-          "_admin": "Address of the initial contract admin. Admin as the ability to access the               transparent proxy interface."
-        }
-      },
-      "implementation()": {
-        "returns": {
-          "_0": "Implementation address."
-        }
-      },
-      "upgradeTo(address)": {
-        "params": {
-          "_implementation": "Address of the implementation contract."
-        }
-      },
-      "upgradeToAndCall(address,bytes)": {
-        "params": {
-          "_data": "Calldata to delegatecall the new implementation with.",
-          "_implementation": "Address of the implementation contract."
-        }
-      }
-    },
-    "events": {
-      "AdminChanged(address,address)": {
-        "params": {
-          "newAdmin": "The new owner of the contract",
-          "previousAdmin": "The previous owner of the contract"
-        }
-      },
-      "Upgraded(address)": {
-        "params": {
-          "implementation": "The address of the implementation contract"
-        }
-      }
-    },
-    "title": "Proxy"
-  },
-  "userdoc": {
-    "version": 1,
-    "kind": "user",
-    "methods": {
-      "admin()": {
-        "notice": "Gets the owner of the proxy contract."
-      },
-      "changeAdmin(address)": {
-        "notice": "Changes the owner of the proxy contract. Only callable by the owner."
-      },
-      "constructor": {
-        "notice": "Sets the initial admin during contract deployment. Admin address is stored at the         EIP-1967 admin storage slot so that accidental storage collision with the         implementation is not possible."
-      },
-      "implementation()": {
-        "notice": "Queries the implementation address."
-      },
-      "upgradeTo(address)": {
-        "notice": "Set the implementation contract address. The code at the given address will execute         when this contract is called."
-      },
-      "upgradeToAndCall(address,bytes)": {
-        "notice": "Set the implementation and call a function in a single transaction. Useful to ensure         atomic execution of initialization-based upgrades."
-      }
-    },
-    "events": {
-      "AdminChanged(address,address)": {
-        "notice": "An event that is emitted each time the owner is upgraded. This event is part of the         EIP-1967 specification."
-      },
-      "Upgraded(address)": {
-        "notice": "An event that is emitted each time the implementation is changed. This event is part         of the EIP-1967 specification."
-      }
-    },
-    "notice": "Proxy is a transparent proxy that passes through the call if the caller is the owner or         if the caller is address(0), meaning that the call originated from an off-chain         simulation."
-  }
-}
\ No newline at end of file
diff --git a/op-bindings/hardhat/testdata/deployments/goerli/OptimismPortal.json b/op-bindings/hardhat/testdata/deployments/goerli/OptimismPortal.json
deleted file mode 100644
index 23e2f8ae45bb..000000000000
--- a/op-bindings/hardhat/testdata/deployments/goerli/OptimismPortal.json
+++ /dev/null
@@ -1,674 +0,0 @@
-{
-  "address": "0x79C6C6b1844e3db7C30107f189CFb095Bd2c4B5d",
-  "abi": [
-    {
-      "inputs": [
-        {
-          "internalType": "contract L2OutputOracle",
-          "name": "_l2Oracle",
-          "type": "address"
-        },
-        {
-          "internalType": "uint256",
-          "name": "_finalizationPeriodSeconds",
-          "type": "uint256"
-        }
-      ],
-      "stateMutability": "nonpayable",
-      "type": "constructor"
-    },
-    {
-      "anonymous": false,
-      "inputs": [
-        {
-          "indexed": false,
-          "internalType": "uint8",
-          "name": "version",
-          "type": "uint8"
-        }
-      ],
-      "name": "Initialized",
-      "type": "event"
-    },
-    {
-      "anonymous": false,
-      "inputs": [
-        {
-          "indexed": true,
-          "internalType": "address",
-          "name": "from",
-          "type": "address"
-        },
-        {
-          "indexed": true,
-          "internalType": "address",
-          "name": "to",
-          "type": "address"
-        },
-        {
-          "indexed": true,
-          "internalType": "uint256",
-          "name": "version",
-          "type": "uint256"
-        },
-        {
-          "indexed": false,
-          "internalType": "bytes",
-          "name": "opaqueData",
-          "type": "bytes"
-        }
-      ],
-      "name": "TransactionDeposited",
-      "type": "event"
-    },
-    {
-      "anonymous": false,
-      "inputs": [
-        {
-          "indexed": true,
-          "internalType": "bytes32",
-          "name": "withdrawalHash",
-          "type": "bytes32"
-        },
-        {
-          "indexed": false,
-          "internalType": "bool",
-          "name": "success",
-          "type": "bool"
-        }
-      ],
-      "name": "WithdrawalFinalized",
-      "type": "event"
-    },
-    {
-      "inputs": [],
-      "name": "BASE_FEE_MAX_CHANGE_DENOMINATOR",
-      "outputs": [
-        {
-          "internalType": "int256",
-          "name": "",
-          "type": "int256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "ELASTICITY_MULTIPLIER",
-      "outputs": [
-        {
-          "internalType": "int256",
-          "name": "",
-          "type": "int256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "FINALIZATION_PERIOD_SECONDS",
-      "outputs": [
-        {
-          "internalType": "uint256",
-          "name": "",
-          "type": "uint256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "INITIAL_BASE_FEE",
-      "outputs": [
-        {
-          "internalType": "uint128",
-          "name": "",
-          "type": "uint128"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "L2_ORACLE",
-      "outputs": [
-        {
-          "internalType": "contract L2OutputOracle",
-          "name": "",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "MAX_RESOURCE_LIMIT",
-      "outputs": [
-        {
-          "internalType": "int256",
-          "name": "",
-          "type": "int256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "MINIMUM_BASE_FEE",
-      "outputs": [
-        {
-          "internalType": "int256",
-          "name": "",
-          "type": "int256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "TARGET_RESOURCE_LIMIT",
-      "outputs": [
-        {
-          "internalType": "int256",
-          "name": "",
-          "type": "int256"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "address",
-          "name": "_to",
-          "type": "address"
-        },
-        {
-          "internalType": "uint256",
-          "name": "_value",
-          "type": "uint256"
-        },
-        {
-          "internalType": "uint64",
-          "name": "_gasLimit",
-          "type": "uint64"
-        },
-        {
-          "internalType": "bool",
-          "name": "_isCreation",
-          "type": "bool"
-        },
-        {
-          "internalType": "bytes",
-          "name": "_data",
-          "type": "bytes"
-        }
-      ],
-      "name": "depositTransaction",
-      "outputs": [],
-      "stateMutability": "payable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "components": [
-            {
-              "internalType": "uint256",
-              "name": "nonce",
-              "type": "uint256"
-            },
-            {
-              "internalType": "address",
-              "name": "sender",
-              "type": "address"
-            },
-            {
-              "internalType": "address",
-              "name": "target",
-              "type": "address"
-            },
-            {
-              "internalType": "uint256",
-              "name": "value",
-              "type": "uint256"
-            },
-            {
-              "internalType": "uint256",
-              "name": "gasLimit",
-              "type": "uint256"
-            },
-            {
-              "internalType": "bytes",
-              "name": "data",
-              "type": "bytes"
-            }
-          ],
-          "internalType": "struct Types.WithdrawalTransaction",
-          "name": "_tx",
-          "type": "tuple"
-        },
-        {
-          "internalType": "uint256",
-          "name": "_l2BlockNumber",
-          "type": "uint256"
-        },
-        {
-          "components": [
-            {
-              "internalType": "bytes32",
-              "name": "version",
-              "type": "bytes32"
-            },
-            {
-              "internalType": "bytes32",
-              "name": "stateRoot",
-              "type": "bytes32"
-            },
-            {
-              "internalType": "bytes32",
-              "name": "withdrawerStorageRoot",
-              "type": "bytes32"
-            },
-            {
-              "internalType": "bytes32",
-              "name": "latestBlockhash",
-              "type": "bytes32"
-            }
-          ],
-          "internalType": "struct Types.OutputRootProof",
-          "name": "_outputRootProof",
-          "type": "tuple"
-        },
-        {
-          "internalType": "bytes",
-          "name": "_withdrawalProof",
-          "type": "bytes"
-        }
-      ],
-      "name": "finalizeWithdrawalTransaction",
-      "outputs": [],
-      "stateMutability": "payable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "bytes32",
-          "name": "",
-          "type": "bytes32"
-        }
-      ],
-      "name": "finalizedWithdrawals",
-      "outputs": [
-        {
-          "internalType": "bool",
-          "name": "",
-          "type": "bool"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "initialize",
-      "outputs": [],
-      "stateMutability": "nonpayable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "uint256",
-          "name": "_l2BlockNumber",
-          "type": "uint256"
-        }
-      ],
-      "name": "isBlockFinalized",
-      "outputs": [
-        {
-          "internalType": "bool",
-          "name": "",
-          "type": "bool"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "l2Sender",
-      "outputs": [
-        {
-          "internalType": "address",
-          "name": "",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "params",
-      "outputs": [
-        {
-          "internalType": "uint128",
-          "name": "prevBaseFee",
-          "type": "uint128"
-        },
-        {
-          "internalType": "uint64",
-          "name": "prevBoughtGas",
-          "type": "uint64"
-        },
-        {
-          "internalType": "uint64",
-          "name": "prevBlockNum",
-          "type": "uint64"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "version",
-      "outputs": [
-        {
-          "internalType": "string",
-          "name": "",
-          "type": "string"
-        }
-      ],
-      "stateMutability": "view",
-      "type": "function"
-    },
-    {
-      "stateMutability": "payable",
-      "type": "receive"
-    }
-  ],
-  "transactionHash": "0x3ac590c822271c4ee52c3327f8154518b3a2d0ca0d4aeacbf74bc2a7a9bf0d5b",
-  "receipt": {
-    "to": null,
-    "from": "0xCFf7a9856DB3C60AB546b8F43dC5D1A4336786A0",
-    "contractAddress": "0x79C6C6b1844e3db7C30107f189CFb095Bd2c4B5d",
-    "transactionIndex": 0,
-    "gasUsed": "3481823",
-    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000",
-    "blockHash": "0xd2afc46aa8ad4b9d42ff65f9e0b2e76a9864bdda53838da89d4ecead4ef54242",
-    "transactionHash": "0x3ac590c822271c4ee52c3327f8154518b3a2d0ca0d4aeacbf74bc2a7a9bf0d5b",
-    "logs": [
-      {
-        "transactionIndex": 0,
-        "blockNumber": 7355246,
-        "transactionHash": "0x3ac590c822271c4ee52c3327f8154518b3a2d0ca0d4aeacbf74bc2a7a9bf0d5b",
-        "address": "0x79C6C6b1844e3db7C30107f189CFb095Bd2c4B5d",
-        "topics": [
-          "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"
-        ],
-        "data": "0x0000000000000000000000000000000000000000000000000000000000000001",
-        "logIndex": 0,
-        "blockHash": "0xd2afc46aa8ad4b9d42ff65f9e0b2e76a9864bdda53838da89d4ecead4ef54242"
-      }
-    ],
-    "blockNumber": 7355246,
-    "cumulativeGasUsed": "3481823",
-    "status": 1,
-    "byzantium": true
-  },
-  "args": [
-    "0x1Bf3F468e52aA31fd19BaF006B23c327c8fc7198",
-    2
-  ],
-  "numDeployments": 1,
-  "solcInputHash": "cd42cb04f3b6a78e5824c9f427d0a55d",
-  "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract L2OutputOracle\",\"name\":\"_l2Oracle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"opaqueData\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE_FEE_MAX_CHANGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ELASTICITY_MULTIPLIER\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIAL_BASE_FEE\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ORACLE\",\"outputs\":[{\"internalType\":\"contract L2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINIMUM_BASE_FEE\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TARGET_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Types.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawerStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"struct Types.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_withdrawalProof\",\"type\":\"bytes\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"isBlockFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"custom:proxied\":\"@title OptimismPortal\",\"events\":{\"TransactionDeposited(address,address,uint256,bytes)\":{\"params\":{\"from\":\"Address that triggered the deposit transaction.\",\"opaqueData\":\"ABI encoded deposit data to be parsed off-chain.\",\"to\":\"Address that the deposit transaction is directed to.\",\"version\":\"Version of this deposit transaction event.\"}},\"WithdrawalFinalized(bytes32,bool)\":{\"params\":{\"success\":\"Whether the withdrawal transaction was successful.\",\"withdrawalHash\":\"Hash of the withdrawal transaction.\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:semver\":\"0.0.1\",\"params\":{\"_finalizationPeriodSeconds\":\"Output finalization time in seconds.\",\"_l2Oracle\":\"Address of the L2OutputOracle contract.\"}},\"depositTransaction(address,uint256,uint64,bool,bytes)\":{\"params\":{\"_data\":\"Data to trigger the recipient with.\",\"_gasLimit\":\"Minimum L2 gas limit (can be greater than or equal to this value).\",\"_isCreation\":\"Whether or not the transaction is a contract creation.\",\"_to\":\"Target address on L2.\",\"_value\":\"ETH value to send to the recipient.\"}},\"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes)\":{\"params\":{\"_l2BlockNumber\":\"L2 block number of the outputRoot.\",\"_outputRootProof\":\"Inclusion proof of the withdrawer contracts storage root.\",\"_tx\":\"Withdrawal transaction to finalize.\",\"_withdrawalProof\":\"Inclusion proof for the given withdrawal in the withdrawer contract.\"}},\"isBlockFinalized(uint256)\":{\"params\":{\"_l2BlockNumber\":\"The number of the L2 block.\"}},\"version()\":{\"returns\":{\"_0\":\"Semver contract version as a string.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"TransactionDeposited(address,address,uint256,bytes)\":{\"notice\":\"Emitted when a transaction is deposited from L1 to L2. The parameters of this event         are read by the rollup node and used to derive deposit transactions on L2.\"},\"WithdrawalFinalized(bytes32,bool)\":{\"notice\":\"Emitted when a withdrawal transaction is finalized.\"}},\"kind\":\"user\",\"methods\":{\"BASE_FEE_MAX_CHANGE_DENOMINATOR()\":{\"notice\":\"Denominator that determines max change on fee per block.\"},\"ELASTICITY_MULTIPLIER()\":{\"notice\":\"Along with the resource limit, determines the target resource limit.\"},\"FINALIZATION_PERIOD_SECONDS()\":{\"notice\":\"Minimum time (in seconds) that must elapse before a withdrawal can be finalized.\"},\"INITIAL_BASE_FEE()\":{\"notice\":\"Initial base fee value.\"},\"L2_ORACLE()\":{\"notice\":\"Address of the L2OutputOracle.\"},\"MAX_RESOURCE_LIMIT()\":{\"notice\":\"Maximum amount of the resource that can be used within this block.\"},\"MINIMUM_BASE_FEE()\":{\"notice\":\"Minimum base fee value, cannot go lower than this.\"},\"TARGET_RESOURCE_LIMIT()\":{\"notice\":\"Target amount of the resource that should be used within this block.\"},\"depositTransaction(address,uint256,uint64,bool,bytes)\":{\"notice\":\"Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in         deriving deposit transactions. Note that if a deposit is made by a contract, its         address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider         using the CrossDomainMessenger contracts for a simpler developer experience.\"},\"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes)\":{\"notice\":\"Finalizes a withdrawal transaction.\"},\"finalizedWithdrawals(bytes32)\":{\"notice\":\"A list of withdrawal hashes which have been successfully finalized.\"},\"initialize()\":{\"notice\":\"Initializer;\"},\"isBlockFinalized(uint256)\":{\"notice\":\"Determine if a given block number is finalized. Reverts if the call to         L2_ORACLE.getL2Output reverts. Returns a boolean otherwise.\"},\"l2Sender()\":{\"notice\":\"Address of the L2 account which initiated a withdrawal in this transaction. If the         of this variable is the default L2 sender address, then we are NOT inside of a call         to finalizeWithdrawalTransaction.\"},\"params()\":{\"notice\":\"EIP-1559 style gas parameters.\"},\"version()\":{\"notice\":\"Returns the full semver contract version.\"}},\"notice\":\"The OptimismPortal is a low-level contract responsible for passing messages between L1         and L2. Messages sent directly to the OptimismPortal have no form of replayability.         Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/OptimismPortal.sol\":\"OptimismPortal\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@eth-optimism/contracts-periphery/=node_modules/@eth-optimism/contracts-periphery/contracts/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/=node_modules/@rari-capital/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":contracts/=contracts/\",\":ds-test/=node_modules/ds-test/src/\",\":excessively-safe-call/=node_modules/excessively-safe-call/\",\":forge-std/=node_modules/forge-std/src/\"]},\"sources\":{\"contracts/L1/L2OutputOracle.sol\":{\"keccak256\":\"0xe3242f566b5c1ae0e983e734e053552b7ef53d73f23575b5c6bbad4505aacc61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://45451a37d695b27f1e8d80f50a75d54be55b406538b24d913cb210c021a77876\",\"dweb:/ipfs/QmUqgkGNkDBZhGJQJjKdHWwuFUhg7Cu1qPpYUcRFWSi3Pr\"]},\"contracts/L1/OptimismPortal.sol\":{\"keccak256\":\"0xbdfc47a8ef7a1665d8aa25dabcc0281860ef88c5c9646a230e53af0d27248456\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0cad521349efcdd4ca4a0a937ce126cf40417f53373bf3235182f7d9a97df358\",\"dweb:/ipfs/QmbydUJzEtjR4xaPicsjFk5MunHz41peVCRrNR7GPDBEq2\"]},\"contracts/L1/ResourceMetering.sol\":{\"keccak256\":\"0xcbb34b35a67da37c07bc9ddf900012b94605491e6845a8811fd5d6d9fff8aed6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://84f801cd1c3d30f13a9a537c550898ffb170a810d640e2138ff6efe16c76a6ca\",\"dweb:/ipfs/QmYR49Qv7nJey69r726QmkpAWwqukAN7CBXj3xn5KxHUcV\"]},\"contracts/libraries/Burn.sol\":{\"keccak256\":\"0x54233b226ba6919dc46d438bc790108d8f855001002a1b9c3c37aed7a83e5f3f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4051a4baca357a9191a6c9e3aa1593a17b69dd7915966e23e4cb269e9c1d9ed4\",\"dweb:/ipfs/QmadKjGKvxm53abVHQdsxrXBc8e9jXywu6vvhkAgjsx59J\"]},\"contracts/libraries/Bytes.sol\":{\"keccak256\":\"0x90538c876448b34513ece8e91dc3d541291f17263813f2baf7a0e93b09993f31\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16bd9e3249cd8659fdfe03a4c77b4d72ff9d3abbde81054dcd37710d1e176e8f\",\"dweb:/ipfs/QmbQ9VBUJfzWUK2KneSFNjtiH4dmPKChsZSQVNFAXJrrrZ\"]},\"contracts/libraries/Encoding.sol\":{\"keccak256\":\"0xca8dce21b608bac08ae75d42879e90f5e7865fb29587df181a22a3b14ce21985\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://29b093d22061b4c499566cb35ce2755cce241ab9f02716cf9cdbdd81f9c47871\",\"dweb:/ipfs/QmdF4DHQUEeEeW67ugmEC3AHn6QrBBNYtwV7UaHaSTe2pa\"]},\"contracts/libraries/Hashing.sol\":{\"keccak256\":\"0xef5d0156a50f96bf32d34ef7a217872791b1b3c11baa9c13183a6388356a918d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7790ae2e79906d26924f7b69e8a3610031db48cef4b6e306e923431def8ba86\",\"dweb:/ipfs/QmSGJEBv5XsDtsr2QTJnwGKXAXxqZafYGeZcRKKfw1yrUc\"]},\"contracts/libraries/Types.sol\":{\"keccak256\":\"0x93045c0c97287a12e1bdde0685e26f185411b81b93b9df15c8cce90bccdcf77c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0c90b59d09f92aba5ab0862264efe2beb0f77fba750867f8d686a1f39ee6af2c\",\"dweb:/ipfs/QmW7Zj5d7NgDi5Mdv6jptJgfsUj8LvGroud9p2Z7vhcKLC\"]},\"contracts/libraries/rlp/RLPReader.sol\":{\"keccak256\":\"0xef51cf7340f3e3f6ff9f651d6b284831a38f1631635c5d72121ad9498caf15b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://034c29eee4bc5ed4f0d013162d20c17cbc0ba5d26fd0cd477bcac0235e8266f0\",\"dweb:/ipfs/QmQZ1eFbqkVKAkKc4mXUCbGrdD6rE4sgzbzbSzS8RC4SCX\"]},\"contracts/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x5aa9d21c5b41c9786f23153f819d561ae809a1d55c7b0d423dfeafdfbacedc78\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://921c44e6a0982b9a4011900fda1bda2c06b7a85894967de98b407a83fe9f90c0\",\"dweb:/ipfs/QmSsHLKDUQ82kpKdqB6VntVGKuPDb4W9VdotsubuqWBzio\"]},\"contracts/libraries/trie/MerkleTrie.sol\":{\"keccak256\":\"0xbbf5b9e6b2ea942038ca5ed5722352c499019b0a0026edbda9a70f777aa2600d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2222d31689b9a41747a0082c8c8689ca7560ca69528f3901c73ca0d2efc2985f\",\"dweb:/ipfs/QmXHEZtsUkrGLGT9R5kHETRNwPURCVnrKKvbbmHpDUUHVj\"]},\"contracts/libraries/trie/SecureMerkleTrie.sol\":{\"keccak256\":\"0xd27ad3665179493bab93a4316bcd2a780bfec524f774226420e931acf8043ebb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3ec639edab8c22e020dd7a108f69d7dc99f2e9d0bb9075e9aa41d4bd1f5cc03\",\"dweb:/ipfs/QmR9fMgKEVLNm4LPbpSEX9AepmELxX6JXNm2o8tCXceBSF\"]},\"contracts/universal/Semver.sol\":{\"keccak256\":\"0x8215e8fbaace5e06fdf0be26cd8ec224847cf03e89bd78dc8ba3ec2cb429d4fe\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cfe4869ad9a1a10aee499ed4ac74a19f9f95dd9173efa656f6b1728f6912a9ad\",\"dweb:/ipfs/QmbiKSxpNnKQv8jwEvGUJkksaLPp8UU8N1twbDimM3RhXr\"]},\"contracts/vendor/AddressAliasHelper.sol\":{\"keccak256\":\"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88\",\"dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x32c202bd28995dd20c4347b7c6467a6d3241c74c8ad3edcbb610cd9205916c45\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8179c356adb19e70d6b31a1eedc8c5c7f0c00e669e2540f4099e3844c6074d30\",\"dweb:/ipfs/QmWFbivarEobbqhS1go64ootVuHfVohBseerYy9FTEd1W2\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xc995bddbca1ae19788db9f8b61e63385edd3fddf89693b612d5abd1a275974d2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab84f13e6e6e0823854a0cddd49e96df052092d5919f95587607f0ed28a64cb6\",\"dweb:/ipfs/QmbNtqAq23ZDjCzHukQaa7B3y6rcobscm6FZF5PMQXcnVr\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"node_modules/@rari-capital/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"node_modules/excessively-safe-call/src/ExcessivelySafeCall.sol\":{\"keccak256\":\"0x7d9d432e8f02168bf3f790e3dabcf36402782acf7ffa476cabe86fc4d8962eb2\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://1adc13e7f399f500ea5f81480ad149a50408fde7990a2c6347e6377486f389dc\",\"dweb:/ipfs/QmSvm5TUBJqknsqNJLLHqNS4MLSH5k3vNrbquVg6ZKSfx9\"]}},\"version\":1}",
-  "bytecode": "0x6101206040523480156200001257600080fd5b506040516200401238038062004012833981016040819052620000359162000261565b6000608081905260a052600160c0526001600160a01b0382166101005260e08190526200006162000069565b50506200029d565b600054610100900460ff16158080156200008a5750600054600160ff909116105b80620000ba5750620000a730620001af60201b6200127e1760201c565b158015620000ba575060005460ff166001145b620001235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000147576000805461ff0019166101001790555b603380546001600160a01b03191661dead17905562000165620001be565b8015620001ac576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6001600160a01b03163b151590565b600054610100900460ff166200022b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200011a565b60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b600080604083850312156200027557600080fd5b82516001600160a01b03811681146200028d57600080fd5b6020939093015192949293505050565b60805160a05160c05160e05161010051613d1b620002f76000396000818161013401528181610b690152610d900152600081816103bd015261155701526000610918015260006108ef015260006108c60152613d1b6000f3fe6080604052600436106100f65760003560e01c8063a14238e71161008a578063cff0ab9611610059578063cff0ab96146102f7578063e9e05c4214610398578063f4daa291146103ab578063fdc9fe1d146103df57600080fd5b8063a14238e71461026d578063c4fc4798146102ad578063ca3e99ba146102cd578063cd7c9789146102e257600080fd5b80636bb0291e116100c65780636bb0291e146102005780638129fc1c14610215578063867ead131461022a5780639bf62d821461024057600080fd5b80621c2ff61461012257806313620abd1461018057806354fd4d50146101b957806364b79208146101db57600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f2565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce6108bf565b604051610177919061336e565b3480156101e757600080fd5b506101f2627a120081565b604051908152602001610177565b34801561020c57600080fd5b506101f2600481565b34801561022157600080fd5b5061011b610962565b34801561023657600080fd5b506101f261271081565b34801561024c57600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027957600080fd5b5061029d610288366004613381565b60346020526000908152604090205460ff1681565b6040519015158152602001610177565b3480156102b957600080fd5b5061029d6102c8366004613381565b610b20565b3480156102d957600080fd5b506101f2610be5565b3480156102ee57600080fd5b506101f2600881565b34801561030357600080fd5b5060015461035f906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103a63660046134c6565b6103f2565b3480156103b757600080fd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b61011b6103ed3660046135b4565b610bf6565b8260005a905083156104a95773ffffffffffffffffffffffffffffffffffffffff8716156104a957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104ca575033731111000000000000000000000000000000001111015b600034888888886040516020016104e59594939291906136a8565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610555919061336e565b60405180910390a45050600154600090610595907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361373c565b9050801561071e5760006105ad6004627a1200613782565b6001546105d89190700100000000000000000000000000000000900467ffffffffffffffff166137ea565b9050600060086105ec6004627a1200613782565b60015461060c9085906fffffffffffffffffffffffffffffffff1661385e565b6106169190613782565b6106209190613782565b60015490915060009061066c906106569061064e9085906fffffffffffffffffffffffffffffffff1661391a565b61271061129a565b6fffffffffffffffffffffffffffffffff6112b5565b905060018411156106df576106dc610656670de0b6b3a76400006106c8610694600883613782565b6106a690670de0b6b3a76400006137ea565b6106b160018a61373c565b6106c390670de0b6b3a764000061398e565b6112c4565b6106d2908561385e565b61064e9190613782565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054849190601090610751908490700100000000000000000000000000000000900467ffffffffffffffff166139cb565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016104a0565b600154600090610859906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166139f7565b6fffffffffffffffffffffffffffffffff169050600061087d48633b9aca006112f5565b6108879083613a2f565b905060005a610896908661373c565b9050808211156108b2576108b26108ad828461373c565b611305565b5050505050505050505050565b60606108ea7f0000000000000000000000000000000000000000000000000000000000000000611333565b6109137f0000000000000000000000000000000000000000000000000000000000000000611333565b61093c7f0000000000000000000000000000000000000000000000000000000000000000611333565b60405160200161094e93929190613a43565b604051602081830303815290604052905090565b600054610100900460ff16158080156109825750600054600160ff909116105b8061099c5750303b15801561099c575060005460ff166001145b610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a8657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610aba611470565b8015610b1d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa158015610baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd39190613ab9565b9050610bde81611553565b9392505050565b610bf36004627a1200613782565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a0565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610d5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a0565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190613ab9565b9050610e1a81611553565b610ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a0565b610ebd610eb836869003860186613b08565b61158d565b815114610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a0565b6000610f57876115e9565b9050610f9e81866040013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061161992505050565b61102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a0565b60008181526034602052604090205460ff16156110c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a0565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055608087015161111290614e2090613b6e565b5a10156111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a0565b8660200151603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000611206886040015189608001518a6060015160008c60a001516116e0565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061126c90841515815260200190565b60405180910390a25050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000818312156112aa57816112ac565b825b90505b92915050565b60008183126112aa57816112ac565b60006112ac670de0b6b3a7640000836112dc8661176b565b6112e6919061385e565b6112f09190613782565b6119af565b6000818310156112aa57816112ac565b6000805a90505b825a611318908361373c565b101561132e5761132782613b86565b915061130c565b505050565b60608160000361137657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156113a0578061138a81613b86565b91506113999050600a83613a2f565b915061137a565b60008167ffffffffffffffff8111156113bb576113bb6133c3565b6040519080825280601f01601f1916602001820160405280156113e5576020820181803683370190505b5090505b8415611468576113fa60018361373c565b9150611407600a86613bbe565b611412906030613b6e565b60f81b81838151811061142757611427613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611461600a86613a2f565b94506113e9565b949350505050565b600054610100900460ff16611507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a0565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b60007f000000000000000000000000000000000000000000000000000000000000000082602001516115859190613b6e565b421192915050565b600081600001518260200151836040015184606001516040516020016115cc949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a088015193516000976115cc979096959101613c01565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506116d79101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611bee565b95945050505050565b6000606060008060008661ffff1667ffffffffffffffff811115611706576117066133c3565b6040519080825280601f01601f191660200182016040528015611730576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115611751578692505b828152826000602083013e90999098509650505050505050565b60008082136117d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b600060606117e384611c12565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136119e057506000919050565b680755bf798b4a1bf1e58212611a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611bfa86611ce8565b9050611c0881868686611d1a565b9695505050505050565b6000808211611c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611d0491815260200190565b6040516020818303038152906040529050919050565b6000806000611d2a878686611d57565b91509150818015611d4c57508051602080830191909120875191880191909120145b979650505050505050565b600060606000611d6685611e72565b90506000806000611d78848a89611f6d565b81519295509093509150158080611d8c5750815b611e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2070726f76696465642070726f6f6620697320696e60448201527f76616c696400000000000000000000000000000000000000000000000000000060648201526084016104a0565b600081611e345760405180602001604052806000815250611e60565b611e6086611e4360018861373c565b81518110611e5357611e53613bd2565b60200260200101516124f6565b919b919a509098505050505050505050565b60606000611e7f83612520565b90506000815167ffffffffffffffff811115611e9d57611e9d6133c3565b604051908082528060200260200182016040528015611ee257816020015b6040805180820190915260608082526020820152815260200190600190039081611ebb5790505b50905060005b8251811015611f65576000611f15848381518110611f0857611f08613bd2565b6020026020010151612553565b90506040518060400160405280828152602001611f3183612520565b815250838381518110611f4657611f46613bd2565b6020026020010181905250508080611f5d90613b86565b915050611ee8565b509392505050565b60006060818080611f7d8761261a565b90506000869050600080611fa4604051806040016040528060608152602001606081525090565b60005b8c518110156124b2578c8181518110611fc257611fc2613bd2565b602002602001015191508284611fd89190613b6e565b9350611fe5600188613b6e565b96508360000361206657815180516020909101208514612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016104a0565b6121a2565b81515160201161210857815180516020909101208514612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016104a0565b8151859061211590613c58565b146121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016104a0565b6121ae60106001613b6e565b8260200151510361222057855184146124b25760008685815181106121d5576121d5613bd2565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061220057612200613bd2565b602002602001015190506122138161279d565b96506001945050506124a0565b600282602001515103612418576000612238836127d3565b905060008160008151811061224f5761224f613bd2565b016020015160f81c90506000612266600283613c9a565b612271906002613cbc565b90506000612282848360ff166127f7565b905060006122908b8a6127f7565b9050600061229e838361282d565b905060ff8516600214806122b5575060ff85166003145b1561230b578083511480156122ca5750808251145b156122dc576122d9818b613b6e565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506124b2945050505050565b60ff8516158061231e575060ff85166001145b15612390578251811461235a57507f800000000000000000000000000000000000000000000000000000000000000099506124b2945050505050565b612381886020015160018151811061237457612374613bd2565b602002602001015161279d565b9a5097506124a0945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016104a0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016104a0565b806124aa81613b86565b915050611fa7565b507f80000000000000000000000000000000000000000000000000000000000000008414866124e187866127f7565b909e909d50909b509950505050505050505050565b602081015180516060916112af916125109060019061373c565b81518110611f0857611f08613bd2565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906112af906128d9565b6060600080600061256385612b32565b91945092509050600081600181111561257e5761257e613cdf565b1461260b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c502062797465732076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6116d78560200151848461301d565b606060008251600261262c919061398e565b67ffffffffffffffff811115612644576126446133c3565b6040519080825280601f01601f19166020018201604052801561266e576020820181803683370190505b50905060005b835181101561279657600484828151811061269157612691613bd2565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826126c683600261398e565b815181106126d6576126d6613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061271957612719613bd2565b016020015161272b919060f81c613c9a565b60f81b8261273a83600261398e565b612745906001613b6e565b8151811061275557612755613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061278e81613b86565b915050612674565b5092915050565b600060606020836000015110156127be576127b7836130fb565b90506127ca565b6127c783612553565b90505b610bde81613c58565b60606112af6127f28360200151600081518110611f0857611f08613bd2565b61261a565b60608251821061281657506040805160208101909152600081526112af565b6112ac8383848651612828919061373c565b613106565b6000805b8084511180156128415750808351115b80156128c2575082818151811061285a5761285a613bd2565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061289957612899613bd2565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156112ac57806128d181613b86565b915050612831565b60606000806128e784612b32565b9193509091506001905081600181111561290357612903613cdf565b14612990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c50206c6973742076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816129a95790505090506000835b8651811015612b275760208210612a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2070726f766964656420524c50206c6973742065786360448201527f65656473206d6178206c697374206c656e67746800000000000000000000000060648201526084016104a0565b600080612aac6040518060400160405280858c60000151612a90919061373c565b8152602001858c60200151612aa59190613b6e565b9052612b32565b509150915060405180604001604052808383612ac89190613b6e565b8152602001848b60200151612add9190613b6e565b815250858581518110612af257612af2613bd2565b6020908102919091010152612b08600185613b6e565b9350612b148183613b6e565b612b1e9084613b6e565b925050506129d6565b508152949350505050565b600080600080846000015111612bca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20524c50206974656d2063616e6e6f74206265206e7560448201527f6c6c00000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6020840151805160001a607f8111612bef576000600160009450945094505050613016565b60b78111612cab576000612c0460808361373c565b905080876000015111612c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f524c505265616465723a20696e76616c696420524c502073686f72742073747260448201527f696e67000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b60019550935060009250613016915050565b60bf8111612e1a576000612cc060b78361373c565b905080876000015111612d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e67206c656e677468000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612d6f8183613b6e565b885111612dfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e6700000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b612e09826001613b6e565b965094506000935061301692505050565b60f78111612ed5576000612e2f60c08361373c565b905080876000015111612ec4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c502073686f7274206c697360448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b600195509350849250613016915050565b6000612ee260f78361373c565b905080876000015111612f77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201527f206c656e6774680000000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612f918183613b6e565b885111612ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201526064016104a0565b613005826001613b6e565b965094506001935061301692505050565b9193909250565b606060008267ffffffffffffffff81111561303a5761303a6133c3565b6040519080825280601f01601f191660200182016040528015613064576020820181803683370190505b5090508051600003613077579050610bde565b60006130838587613b6e565b90506020820160005b613097602087613a2f565b8110156130ce57825182526130ad602084613b6e565b92506130ba602083613b6e565b9150806130c681613b86565b91505061308c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606112af826132de565b60608182601f011015613175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8282840110156131e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8183018451101561324e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a0565b60608215801561326d57604051915060008252602082016040526132d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156132a657805183526020928301920161328e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60606112af82602001516000846000015161301d565b60005b8381101561330f5781810151838201526020016132f7565b8381111561331e576000848401525b50505050565b6000815180845261333c8160208601602086016132f4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112ac6020830184613324565b60006020828403121561339357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146133be57600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715613415576134156133c3565b60405290565b600082601f83011261342c57600080fd5b813567ffffffffffffffff80821115613447576134476133c3565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561348d5761348d6133c3565b816040528381528660208588010111156134a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156134de57600080fd5b6134e78661339a565b945060208601359350604086013567ffffffffffffffff808216821461350c57600080fd5b909350606087013590811515821461352357600080fd5b9092506080870135908082111561353957600080fd5b506135468882890161341b565b9150509295509295909350565b60006080828403121561356557600080fd5b50919050565b60008083601f84011261357d57600080fd5b50813567ffffffffffffffff81111561359557600080fd5b6020830191508360208285010111156135ad57600080fd5b9250929050565b600080600080600060e086880312156135cc57600080fd5b853567ffffffffffffffff808211156135e457600080fd5b9087019060c0828a0312156135f857600080fd5b6136006133f2565b823581526136106020840161339a565b60208201526136216040840161339a565b6040820152606083013560608201526080830135608082015260a08301358281111561364c57600080fd5b6136588b82860161341b565b60a0830152509650602088013595506136748960408a01613553565b945060c088013591508082111561368a57600080fd5b506136978882890161356b565b969995985093965092949392505050565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516136fc8160498501602087016132f4565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561374e5761374e61370d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261379157613791613753565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156137e5576137e561370d565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156138245761382461370d565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156138585761385861370d565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561389f5761389f61370d565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156138da576138da61370d565b600087129250878205871284841616156138f6576138f661370d565b8785058712818416161561390c5761390c61370d565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156139545761395461370d565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156139885761398861370d565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139c6576139c661370d565b500290565b600067ffffffffffffffff8083168185168083038211156139ee576139ee61370d565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615613a2657613a2661370d565b02949350505050565b600082613a3e57613a3e613753565b500490565b60008451613a558184602089016132f4565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551613a91816001850160208a016132f4565b60019201918201528351613aac8160028401602088016132f4565b0160020195945050505050565b600060408284031215613acb57600080fd5b6040516040810181811067ffffffffffffffff82111715613aee57613aee6133c3565b604052825181526020928301519281019290925250919050565b600060808284031215613b1a57600080fd5b6040516080810181811067ffffffffffffffff82111715613b3d57613b3d6133c3565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60008219821115613b8157613b8161370d565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bb757613bb761370d565b5060010190565b600082613bcd57613bcd613753565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613c4c60c0830184613324565b98975050505050505050565b80516020808301519190811015613565577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b600060ff831680613cad57613cad613753565b8060ff84160691505092915050565b600060ff821660ff841680821015613cd657613cd661370d565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
-  "deployedBytecode": "0x6080604052600436106100f65760003560e01c8063a14238e71161008a578063cff0ab9611610059578063cff0ab96146102f7578063e9e05c4214610398578063f4daa291146103ab578063fdc9fe1d146103df57600080fd5b8063a14238e71461026d578063c4fc4798146102ad578063ca3e99ba146102cd578063cd7c9789146102e257600080fd5b80636bb0291e116100c65780636bb0291e146102005780638129fc1c14610215578063867ead131461022a5780639bf62d821461024057600080fd5b80621c2ff61461012257806313620abd1461018057806354fd4d50146101b957806364b79208146101db57600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f2565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce6108bf565b604051610177919061336e565b3480156101e757600080fd5b506101f2627a120081565b604051908152602001610177565b34801561020c57600080fd5b506101f2600481565b34801561022157600080fd5b5061011b610962565b34801561023657600080fd5b506101f261271081565b34801561024c57600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027957600080fd5b5061029d610288366004613381565b60346020526000908152604090205460ff1681565b6040519015158152602001610177565b3480156102b957600080fd5b5061029d6102c8366004613381565b610b20565b3480156102d957600080fd5b506101f2610be5565b3480156102ee57600080fd5b506101f2600881565b34801561030357600080fd5b5060015461035f906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103a63660046134c6565b6103f2565b3480156103b757600080fd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b61011b6103ed3660046135b4565b610bf6565b8260005a905083156104a95773ffffffffffffffffffffffffffffffffffffffff8716156104a957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104ca575033731111000000000000000000000000000000001111015b600034888888886040516020016104e59594939291906136a8565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610555919061336e565b60405180910390a45050600154600090610595907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361373c565b9050801561071e5760006105ad6004627a1200613782565b6001546105d89190700100000000000000000000000000000000900467ffffffffffffffff166137ea565b9050600060086105ec6004627a1200613782565b60015461060c9085906fffffffffffffffffffffffffffffffff1661385e565b6106169190613782565b6106209190613782565b60015490915060009061066c906106569061064e9085906fffffffffffffffffffffffffffffffff1661391a565b61271061129a565b6fffffffffffffffffffffffffffffffff6112b5565b905060018411156106df576106dc610656670de0b6b3a76400006106c8610694600883613782565b6106a690670de0b6b3a76400006137ea565b6106b160018a61373c565b6106c390670de0b6b3a764000061398e565b6112c4565b6106d2908561385e565b61064e9190613782565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054849190601090610751908490700100000000000000000000000000000000900467ffffffffffffffff166139cb565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016104a0565b600154600090610859906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166139f7565b6fffffffffffffffffffffffffffffffff169050600061087d48633b9aca006112f5565b6108879083613a2f565b905060005a610896908661373c565b9050808211156108b2576108b26108ad828461373c565b611305565b5050505050505050505050565b60606108ea7f0000000000000000000000000000000000000000000000000000000000000000611333565b6109137f0000000000000000000000000000000000000000000000000000000000000000611333565b61093c7f0000000000000000000000000000000000000000000000000000000000000000611333565b60405160200161094e93929190613a43565b604051602081830303815290604052905090565b600054610100900460ff16158080156109825750600054600160ff909116105b8061099c5750303b15801561099c575060005460ff166001145b610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a8657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610aba611470565b8015610b1d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa158015610baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd39190613ab9565b9050610bde81611553565b9392505050565b610bf36004627a1200613782565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a0565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610d5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a0565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190613ab9565b9050610e1a81611553565b610ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a0565b610ebd610eb836869003860186613b08565b61158d565b815114610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a0565b6000610f57876115e9565b9050610f9e81866040013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061161992505050565b61102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a0565b60008181526034602052604090205460ff16156110c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a0565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055608087015161111290614e2090613b6e565b5a10156111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a0565b8660200151603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000611206886040015189608001518a6060015160008c60a001516116e0565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061126c90841515815260200190565b60405180910390a25050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000818312156112aa57816112ac565b825b90505b92915050565b60008183126112aa57816112ac565b60006112ac670de0b6b3a7640000836112dc8661176b565b6112e6919061385e565b6112f09190613782565b6119af565b6000818310156112aa57816112ac565b6000805a90505b825a611318908361373c565b101561132e5761132782613b86565b915061130c565b505050565b60608160000361137657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156113a0578061138a81613b86565b91506113999050600a83613a2f565b915061137a565b60008167ffffffffffffffff8111156113bb576113bb6133c3565b6040519080825280601f01601f1916602001820160405280156113e5576020820181803683370190505b5090505b8415611468576113fa60018361373c565b9150611407600a86613bbe565b611412906030613b6e565b60f81b81838151811061142757611427613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611461600a86613a2f565b94506113e9565b949350505050565b600054610100900460ff16611507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a0565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b60007f000000000000000000000000000000000000000000000000000000000000000082602001516115859190613b6e565b421192915050565b600081600001518260200151836040015184606001516040516020016115cc949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a088015193516000976115cc979096959101613c01565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506116d79101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611bee565b95945050505050565b6000606060008060008661ffff1667ffffffffffffffff811115611706576117066133c3565b6040519080825280601f01601f191660200182016040528015611730576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115611751578692505b828152826000602083013e90999098509650505050505050565b60008082136117d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b600060606117e384611c12565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136119e057506000919050565b680755bf798b4a1bf1e58212611a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611bfa86611ce8565b9050611c0881868686611d1a565b9695505050505050565b6000808211611c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611d0491815260200190565b6040516020818303038152906040529050919050565b6000806000611d2a878686611d57565b91509150818015611d4c57508051602080830191909120875191880191909120145b979650505050505050565b600060606000611d6685611e72565b90506000806000611d78848a89611f6d565b81519295509093509150158080611d8c5750815b611e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2070726f76696465642070726f6f6620697320696e60448201527f76616c696400000000000000000000000000000000000000000000000000000060648201526084016104a0565b600081611e345760405180602001604052806000815250611e60565b611e6086611e4360018861373c565b81518110611e5357611e53613bd2565b60200260200101516124f6565b919b919a509098505050505050505050565b60606000611e7f83612520565b90506000815167ffffffffffffffff811115611e9d57611e9d6133c3565b604051908082528060200260200182016040528015611ee257816020015b6040805180820190915260608082526020820152815260200190600190039081611ebb5790505b50905060005b8251811015611f65576000611f15848381518110611f0857611f08613bd2565b6020026020010151612553565b90506040518060400160405280828152602001611f3183612520565b815250838381518110611f4657611f46613bd2565b6020026020010181905250508080611f5d90613b86565b915050611ee8565b509392505050565b60006060818080611f7d8761261a565b90506000869050600080611fa4604051806040016040528060608152602001606081525090565b60005b8c518110156124b2578c8181518110611fc257611fc2613bd2565b602002602001015191508284611fd89190613b6e565b9350611fe5600188613b6e565b96508360000361206657815180516020909101208514612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016104a0565b6121a2565b81515160201161210857815180516020909101208514612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016104a0565b8151859061211590613c58565b146121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016104a0565b6121ae60106001613b6e565b8260200151510361222057855184146124b25760008685815181106121d5576121d5613bd2565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061220057612200613bd2565b602002602001015190506122138161279d565b96506001945050506124a0565b600282602001515103612418576000612238836127d3565b905060008160008151811061224f5761224f613bd2565b016020015160f81c90506000612266600283613c9a565b612271906002613cbc565b90506000612282848360ff166127f7565b905060006122908b8a6127f7565b9050600061229e838361282d565b905060ff8516600214806122b5575060ff85166003145b1561230b578083511480156122ca5750808251145b156122dc576122d9818b613b6e565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506124b2945050505050565b60ff8516158061231e575060ff85166001145b15612390578251811461235a57507f800000000000000000000000000000000000000000000000000000000000000099506124b2945050505050565b612381886020015160018151811061237457612374613bd2565b602002602001015161279d565b9a5097506124a0945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016104a0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016104a0565b806124aa81613b86565b915050611fa7565b507f80000000000000000000000000000000000000000000000000000000000000008414866124e187866127f7565b909e909d50909b509950505050505050505050565b602081015180516060916112af916125109060019061373c565b81518110611f0857611f08613bd2565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906112af906128d9565b6060600080600061256385612b32565b91945092509050600081600181111561257e5761257e613cdf565b1461260b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c502062797465732076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6116d78560200151848461301d565b606060008251600261262c919061398e565b67ffffffffffffffff811115612644576126446133c3565b6040519080825280601f01601f19166020018201604052801561266e576020820181803683370190505b50905060005b835181101561279657600484828151811061269157612691613bd2565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826126c683600261398e565b815181106126d6576126d6613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061271957612719613bd2565b016020015161272b919060f81c613c9a565b60f81b8261273a83600261398e565b612745906001613b6e565b8151811061275557612755613bd2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061278e81613b86565b915050612674565b5092915050565b600060606020836000015110156127be576127b7836130fb565b90506127ca565b6127c783612553565b90505b610bde81613c58565b60606112af6127f28360200151600081518110611f0857611f08613bd2565b61261a565b60608251821061281657506040805160208101909152600081526112af565b6112ac8383848651612828919061373c565b613106565b6000805b8084511180156128415750808351115b80156128c2575082818151811061285a5761285a613bd2565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061289957612899613bd2565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156112ac57806128d181613b86565b915050612831565b60606000806128e784612b32565b9193509091506001905081600181111561290357612903613cdf565b14612990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c50206c6973742076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816129a95790505090506000835b8651811015612b275760208210612a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2070726f766964656420524c50206c6973742065786360448201527f65656473206d6178206c697374206c656e67746800000000000000000000000060648201526084016104a0565b600080612aac6040518060400160405280858c60000151612a90919061373c565b8152602001858c60200151612aa59190613b6e565b9052612b32565b509150915060405180604001604052808383612ac89190613b6e565b8152602001848b60200151612add9190613b6e565b815250858581518110612af257612af2613bd2565b6020908102919091010152612b08600185613b6e565b9350612b148183613b6e565b612b1e9084613b6e565b925050506129d6565b508152949350505050565b600080600080846000015111612bca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20524c50206974656d2063616e6e6f74206265206e7560448201527f6c6c00000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6020840151805160001a607f8111612bef576000600160009450945094505050613016565b60b78111612cab576000612c0460808361373c565b905080876000015111612c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f524c505265616465723a20696e76616c696420524c502073686f72742073747260448201527f696e67000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b60019550935060009250613016915050565b60bf8111612e1a576000612cc060b78361373c565b905080876000015111612d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e67206c656e677468000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612d6f8183613b6e565b885111612dfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e6700000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b612e09826001613b6e565b965094506000935061301692505050565b60f78111612ed5576000612e2f60c08361373c565b905080876000015111612ec4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c502073686f7274206c697360448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b600195509350849250613016915050565b6000612ee260f78361373c565b905080876000015111612f77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201527f206c656e6774680000000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612f918183613b6e565b885111612ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201526064016104a0565b613005826001613b6e565b965094506001935061301692505050565b9193909250565b606060008267ffffffffffffffff81111561303a5761303a6133c3565b6040519080825280601f01601f191660200182016040528015613064576020820181803683370190505b5090508051600003613077579050610bde565b60006130838587613b6e565b90506020820160005b613097602087613a2f565b8110156130ce57825182526130ad602084613b6e565b92506130ba602083613b6e565b9150806130c681613b86565b91505061308c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606112af826132de565b60608182601f011015613175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8282840110156131e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8183018451101561324e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a0565b60608215801561326d57604051915060008252602082016040526132d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156132a657805183526020928301920161328e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60606112af82602001516000846000015161301d565b60005b8381101561330f5781810151838201526020016132f7565b8381111561331e576000848401525b50505050565b6000815180845261333c8160208601602086016132f4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112ac6020830184613324565b60006020828403121561339357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146133be57600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715613415576134156133c3565b60405290565b600082601f83011261342c57600080fd5b813567ffffffffffffffff80821115613447576134476133c3565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561348d5761348d6133c3565b816040528381528660208588010111156134a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156134de57600080fd5b6134e78661339a565b945060208601359350604086013567ffffffffffffffff808216821461350c57600080fd5b909350606087013590811515821461352357600080fd5b9092506080870135908082111561353957600080fd5b506135468882890161341b565b9150509295509295909350565b60006080828403121561356557600080fd5b50919050565b60008083601f84011261357d57600080fd5b50813567ffffffffffffffff81111561359557600080fd5b6020830191508360208285010111156135ad57600080fd5b9250929050565b600080600080600060e086880312156135cc57600080fd5b853567ffffffffffffffff808211156135e457600080fd5b9087019060c0828a0312156135f857600080fd5b6136006133f2565b823581526136106020840161339a565b60208201526136216040840161339a565b6040820152606083013560608201526080830135608082015260a08301358281111561364c57600080fd5b6136588b82860161341b565b60a0830152509650602088013595506136748960408a01613553565b945060c088013591508082111561368a57600080fd5b506136978882890161356b565b969995985093965092949392505050565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516136fc8160498501602087016132f4565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561374e5761374e61370d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261379157613791613753565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156137e5576137e561370d565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156138245761382461370d565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156138585761385861370d565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561389f5761389f61370d565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156138da576138da61370d565b600087129250878205871284841616156138f6576138f661370d565b8785058712818416161561390c5761390c61370d565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156139545761395461370d565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156139885761398861370d565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139c6576139c661370d565b500290565b600067ffffffffffffffff8083168185168083038211156139ee576139ee61370d565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615613a2657613a2661370d565b02949350505050565b600082613a3e57613a3e613753565b500490565b60008451613a558184602089016132f4565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551613a91816001850160208a016132f4565b60019201918201528351613aac8160028401602088016132f4565b0160020195945050505050565b600060408284031215613acb57600080fd5b6040516040810181811067ffffffffffffffff82111715613aee57613aee6133c3565b604052825181526020928301519281019290925250919050565b600060808284031215613b1a57600080fd5b6040516080810181811067ffffffffffffffff82111715613b3d57613b3d6133c3565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60008219821115613b8157613b8161370d565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bb757613bb761370d565b5060010190565b600082613bcd57613bcd613753565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613c4c60c0830184613324565b98975050505050505050565b80516020808301519190811015613565577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b600060ff831680613cad57613cad613753565b8060ff84160691505092915050565b600060ff821660ff841680821015613cd657613cd661370d565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
-  "devdoc": {
-    "version": 1,
-    "kind": "dev",
-    "methods": {
-      "constructor": {
-        "params": {
-          "_finalizationPeriodSeconds": "Output finalization time in seconds.",
-          "_l2Oracle": "Address of the L2OutputOracle contract."
-        }
-      },
-      "depositTransaction(address,uint256,uint64,bool,bytes)": {
-        "params": {
-          "_data": "Data to trigger the recipient with.",
-          "_gasLimit": "Minimum L2 gas limit (can be greater than or equal to this value).",
-          "_isCreation": "Whether or not the transaction is a contract creation.",
-          "_to": "Target address on L2.",
-          "_value": "ETH value to send to the recipient."
-        }
-      },
-      "finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes)": {
-        "params": {
-          "_l2BlockNumber": "L2 block number of the outputRoot.",
-          "_outputRootProof": "Inclusion proof of the withdrawer contracts storage root.",
-          "_tx": "Withdrawal transaction to finalize.",
-          "_withdrawalProof": "Inclusion proof for the given withdrawal in the withdrawer contract."
-        }
-      },
-      "isBlockFinalized(uint256)": {
-        "params": {
-          "_l2BlockNumber": "The number of the L2 block."
-        }
-      },
-      "version()": {
-        "returns": {
-          "_0": "Semver contract version as a string."
-        }
-      }
-    },
-    "events": {
-      "TransactionDeposited(address,address,uint256,bytes)": {
-        "params": {
-          "from": "Address that triggered the deposit transaction.",
-          "opaqueData": "ABI encoded deposit data to be parsed off-chain.",
-          "to": "Address that the deposit transaction is directed to.",
-          "version": "Version of this deposit transaction event."
-        }
-      },
-      "WithdrawalFinalized(bytes32,bool)": {
-        "params": {
-          "success": "Whether the withdrawal transaction was successful.",
-          "withdrawalHash": "Hash of the withdrawal transaction."
-        }
-      }
-    }
-  },
-  "userdoc": {
-    "version": 1,
-    "kind": "user",
-    "methods": {
-      "BASE_FEE_MAX_CHANGE_DENOMINATOR()": {
-        "notice": "Denominator that determines max change on fee per block."
-      },
-      "ELASTICITY_MULTIPLIER()": {
-        "notice": "Along with the resource limit, determines the target resource limit."
-      },
-      "FINALIZATION_PERIOD_SECONDS()": {
-        "notice": "Minimum time (in seconds) that must elapse before a withdrawal can be finalized."
-      },
-      "INITIAL_BASE_FEE()": {
-        "notice": "Initial base fee value."
-      },
-      "L2_ORACLE()": {
-        "notice": "Address of the L2OutputOracle."
-      },
-      "MAX_RESOURCE_LIMIT()": {
-        "notice": "Maximum amount of the resource that can be used within this block."
-      },
-      "MINIMUM_BASE_FEE()": {
-        "notice": "Minimum base fee value, cannot go lower than this."
-      },
-      "TARGET_RESOURCE_LIMIT()": {
-        "notice": "Target amount of the resource that should be used within this block."
-      },
-      "depositTransaction(address,uint256,uint64,bool,bytes)": {
-        "notice": "Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in         deriving deposit transactions. Note that if a deposit is made by a contract, its         address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider         using the CrossDomainMessenger contracts for a simpler developer experience."
-      },
-      "finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes)": {
-        "notice": "Finalizes a withdrawal transaction."
-      },
-      "finalizedWithdrawals(bytes32)": {
-        "notice": "A list of withdrawal hashes which have been successfully finalized."
-      },
-      "initialize()": {
-        "notice": "Initializer;"
-      },
-      "isBlockFinalized(uint256)": {
-        "notice": "Determine if a given block number is finalized. Reverts if the call to         L2_ORACLE.getL2Output reverts. Returns a boolean otherwise."
-      },
-      "l2Sender()": {
-        "notice": "Address of the L2 account which initiated a withdrawal in this transaction. If the         of this variable is the default L2 sender address, then we are NOT inside of a call         to finalizeWithdrawalTransaction."
-      },
-      "params()": {
-        "notice": "EIP-1559 style gas parameters."
-      },
-      "version()": {
-        "notice": "Returns the full semver contract version."
-      }
-    },
-    "events": {
-      "TransactionDeposited(address,address,uint256,bytes)": {
-        "notice": "Emitted when a transaction is deposited from L1 to L2. The parameters of this event         are read by the rollup node and used to derive deposit transactions on L2."
-      },
-      "WithdrawalFinalized(bytes32,bool)": {
-        "notice": "Emitted when a withdrawal transaction is finalized."
-      }
-    },
-    "notice": "The OptimismPortal is a low-level contract responsible for passing messages between L1         and L2. Messages sent directly to the OptimismPortal have no form of replayability.         Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface."
-  },
-  "storageLayout": {
-    "storage": [
-      {
-        "astId": 25872,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "_initialized",
-        "offset": 0,
-        "slot": "0",
-        "type": "t_uint8"
-      },
-      {
-        "astId": 25875,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "_initializing",
-        "offset": 1,
-        "slot": "0",
-        "type": "t_bool"
-      },
-      {
-        "astId": 1389,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "params",
-        "offset": 0,
-        "slot": "1",
-        "type": "t_struct(ResourceParams)1359_storage"
-      },
-      {
-        "astId": 1394,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "__gap",
-        "offset": 0,
-        "slot": "2",
-        "type": "t_array(t_uint256)49_storage"
-      },
-      {
-        "astId": 961,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "l2Sender",
-        "offset": 0,
-        "slot": "51",
-        "type": "t_address"
-      },
-      {
-        "astId": 974,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "finalizedWithdrawals",
-        "offset": 0,
-        "slot": "52",
-        "type": "t_mapping(t_bytes32,t_bool)"
-      },
-      {
-        "astId": 979,
-        "contract": "contracts/L1/OptimismPortal.sol:OptimismPortal",
-        "label": "__gap",
-        "offset": 0,
-        "slot": "53",
-        "type": "t_array(t_uint256)48_storage"
-      }
-    ],
-    "types": {
-      "t_address": {
-        "encoding": "inplace",
-        "label": "address",
-        "numberOfBytes": "20"
-      },
-      "t_array(t_uint256)48_storage": {
-        "encoding": "inplace",
-        "label": "uint256[48]",
-        "numberOfBytes": "1536"
-      },
-      "t_array(t_uint256)49_storage": {
-        "encoding": "inplace",
-        "label": "uint256[49]",
-        "numberOfBytes": "1568"
-      },
-      "t_bool": {
-        "encoding": "inplace",
-        "label": "bool",
-        "numberOfBytes": "1"
-      },
-      "t_bytes32": {
-        "encoding": "inplace",
-        "label": "bytes32",
-        "numberOfBytes": "32"
-      },
-      "t_mapping(t_bytes32,t_bool)": {
-        "encoding": "mapping",
-        "label": "mapping(bytes32 => bool)",
-        "numberOfBytes": "32"
-      },
-      "t_struct(ResourceParams)1359_storage": {
-        "encoding": "inplace",
-        "label": "struct ResourceMetering.ResourceParams",
-        "numberOfBytes": "32"
-      },
-      "t_uint128": {
-        "encoding": "inplace",
-        "label": "uint128",
-        "numberOfBytes": "16"
-      },
-      "t_uint256": {
-        "encoding": "inplace",
-        "label": "uint256",
-        "numberOfBytes": "32"
-      },
-      "t_uint64": {
-        "encoding": "inplace",
-        "label": "uint64",
-        "numberOfBytes": "8"
-      },
-      "t_uint8": {
-        "encoding": "inplace",
-        "label": "uint8",
-        "numberOfBytes": "1"
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/op-bindings/hardhat/testdata/deployments/goerli/OptimismPortalProxy.json b/op-bindings/hardhat/testdata/deployments/goerli/OptimismPortalProxy.json
deleted file mode 100644
index e2d373ed60e3..000000000000
--- a/op-bindings/hardhat/testdata/deployments/goerli/OptimismPortalProxy.json
+++ /dev/null
@@ -1,253 +0,0 @@
-{
-  "address": "0xf39Acf72E84af85b191BF03f7B9BcAb102Bd9172",
-  "abi": [
-    {
-      "inputs": [
-        {
-          "internalType": "address",
-          "name": "_admin",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "nonpayable",
-      "type": "constructor"
-    },
-    {
-      "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": "implementation",
-          "type": "address"
-        }
-      ],
-      "name": "Upgraded",
-      "type": "event"
-    },
-    {
-      "stateMutability": "payable",
-      "type": "fallback"
-    },
-    {
-      "inputs": [],
-      "name": "admin",
-      "outputs": [
-        {
-          "internalType": "address",
-          "name": "",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "nonpayable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "address",
-          "name": "_admin",
-          "type": "address"
-        }
-      ],
-      "name": "changeAdmin",
-      "outputs": [],
-      "stateMutability": "nonpayable",
-      "type": "function"
-    },
-    {
-      "inputs": [],
-      "name": "implementation",
-      "outputs": [
-        {
-          "internalType": "address",
-          "name": "",
-          "type": "address"
-        }
-      ],
-      "stateMutability": "nonpayable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "address",
-          "name": "_implementation",
-          "type": "address"
-        }
-      ],
-      "name": "upgradeTo",
-      "outputs": [],
-      "stateMutability": "nonpayable",
-      "type": "function"
-    },
-    {
-      "inputs": [
-        {
-          "internalType": "address",
-          "name": "_implementation",
-          "type": "address"
-        },
-        {
-          "internalType": "bytes",
-          "name": "_data",
-          "type": "bytes"
-        }
-      ],
-      "name": "upgradeToAndCall",
-      "outputs": [
-        {
-          "internalType": "bytes",
-          "name": "",
-          "type": "bytes"
-        }
-      ],
-      "stateMutability": "payable",
-      "type": "function"
-    },
-    {
-      "stateMutability": "payable",
-      "type": "receive"
-    }
-  ],
-  "transactionHash": "0x3aa85561932d72b07ac16a88536b21fea5e8a93bf3b87c81f635b8622c634042",
-  "receipt": {
-    "to": null,
-    "from": "0xCFf7a9856DB3C60AB546b8F43dC5D1A4336786A0",
-    "contractAddress": "0xf39Acf72E84af85b191BF03f7B9BcAb102Bd9172",
-    "transactionIndex": 0,
-    "gasUsed": "523812",
-    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000020000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000004000000000",
-    "blockHash": "0x3b98b3141f805127ca40450d4feb5267fbeb61c7b81418bb97fb0488484554c4",
-    "transactionHash": "0x3aa85561932d72b07ac16a88536b21fea5e8a93bf3b87c81f635b8622c634042",
-    "logs": [
-      {
-        "transactionIndex": 0,
-        "blockNumber": 7355245,
-        "transactionHash": "0x3aa85561932d72b07ac16a88536b21fea5e8a93bf3b87c81f635b8622c634042",
-        "address": "0xf39Acf72E84af85b191BF03f7B9BcAb102Bd9172",
-        "topics": [
-          "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"
-        ],
-        "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cff7a9856db3c60ab546b8f43dc5d1a4336786a0",
-        "logIndex": 0,
-        "blockHash": "0x3b98b3141f805127ca40450d4feb5267fbeb61c7b81418bb97fb0488484554c4"
-      }
-    ],
-    "blockNumber": 7355245,
-    "cumulativeGasUsed": "523812",
-    "status": 1,
-    "byzantium": true
-  },
-  "args": [
-    "0xCFf7a9856DB3C60AB546b8F43dC5D1A4336786A0"
-  ],
-  "numDeployments": 1,
-  "solcInputHash": "cd42cb04f3b6a78e5824c9f427d0a55d",
-  "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"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\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"params\":{\"newAdmin\":\"The new owner of the contract\",\"previousAdmin\":\"The previous owner of the contract\"}},\"Upgraded(address)\":{\"params\":{\"implementation\":\"The address of the implementation contract\"}}},\"kind\":\"dev\",\"methods\":{\"admin()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"changeAdmin(address)\":{\"params\":{\"_admin\":\"New owner of the proxy contract.\"}},\"constructor\":{\"params\":{\"_admin\":\"Address of the initial contract admin. Admin as the ability to access the               transparent proxy interface.\"}},\"implementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"upgradeTo(address)\":{\"params\":{\"_implementation\":\"Address of the implementation contract.\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"Calldata to delegatecall the new implementation with.\",\"_implementation\":\"Address of the implementation contract.\"}}},\"title\":\"Proxy\",\"version\":1},\"userdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"An event that is emitted each time the owner is upgraded. This event is part of the         EIP-1967 specification.\"},\"Upgraded(address)\":{\"notice\":\"An event that is emitted each time the implementation is changed. This event is part         of the EIP-1967 specification.\"}},\"kind\":\"user\",\"methods\":{\"admin()\":{\"notice\":\"Gets the owner of the proxy contract.\"},\"changeAdmin(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"constructor\":{\"notice\":\"Sets the initial admin during contract deployment. Admin address is stored at the         EIP-1967 admin storage slot so that accidental storage collision with the         implementation is not possible.\"},\"implementation()\":{\"notice\":\"Queries the implementation address.\"},\"upgradeTo(address)\":{\"notice\":\"Set the implementation contract address. The code at the given address will execute         when this contract is called.\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Set the implementation and call a function in a single transaction. Useful to ensure         atomic execution of initialization-based upgrades.\"}},\"notice\":\"Proxy is a transparent proxy that passes through the call if the caller is the owner or         if the caller is address(0), meaning that the call originated from an off-chain         simulation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/universal/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@eth-optimism/contracts-periphery/=node_modules/@eth-optimism/contracts-periphery/contracts/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/=node_modules/@rari-capital/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":contracts/=contracts/\",\":ds-test/=node_modules/ds-test/src/\",\":excessively-safe-call/=node_modules/excessively-safe-call/\",\":forge-std/=node_modules/forge-std/src/\"]},\"sources\":{\"contracts/universal/Proxy.sol\":{\"keccak256\":\"0xfa08635f1866139673ac4fe7b07330f752f93800075b895d8fcb8484f4a3f753\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8f2247604d527f560edbb851c43b6c16b37e34972ddb305e16dd73623b8288cd\",\"dweb:/ipfs/QmfM8sLAZrxrnqyRdt1XJ5LyJh4wKbeEqk3VkvxG7BDqFj\"]}},\"version\":1}",
-  "bytecode": "0x608060405234801561001057600080fd5b5060405161091838038061091883398101604081905261002f916100b2565b6100388161003e565b506100e2565b60006100566000805160206108f88339815191525490565b6000805160206108f8833981519152839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b6000602082840312156100c457600080fd5b81516001600160a01b03811681146100db57600080fd5b9392505050565b610807806100f16000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
-  "deployedBytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a",
-  "devdoc": {
-    "version": 1,
-    "kind": "dev",
-    "methods": {
-      "admin()": {
-        "returns": {
-          "_0": "Owner address."
-        }
-      },
-      "changeAdmin(address)": {
-        "params": {
-          "_admin": "New owner of the proxy contract."
-        }
-      },
-      "constructor": {
-        "params": {
-          "_admin": "Address of the initial contract admin. Admin as the ability to access the               transparent proxy interface."
-        }
-      },
-      "implementation()": {
-        "returns": {
-          "_0": "Implementation address."
-        }
-      },
-      "upgradeTo(address)": {
-        "params": {
-          "_implementation": "Address of the implementation contract."
-        }
-      },
-      "upgradeToAndCall(address,bytes)": {
-        "params": {
-          "_data": "Calldata to delegatecall the new implementation with.",
-          "_implementation": "Address of the implementation contract."
-        }
-      }
-    },
-    "events": {
-      "AdminChanged(address,address)": {
-        "params": {
-          "newAdmin": "The new owner of the contract",
-          "previousAdmin": "The previous owner of the contract"
-        }
-      },
-      "Upgraded(address)": {
-        "params": {
-          "implementation": "The address of the implementation contract"
-        }
-      }
-    },
-    "title": "Proxy"
-  },
-  "userdoc": {
-    "version": 1,
-    "kind": "user",
-    "methods": {
-      "admin()": {
-        "notice": "Gets the owner of the proxy contract."
-      },
-      "changeAdmin(address)": {
-        "notice": "Changes the owner of the proxy contract. Only callable by the owner."
-      },
-      "constructor": {
-        "notice": "Sets the initial admin during contract deployment. Admin address is stored at the         EIP-1967 admin storage slot so that accidental storage collision with the         implementation is not possible."
-      },
-      "implementation()": {
-        "notice": "Queries the implementation address."
-      },
-      "upgradeTo(address)": {
-        "notice": "Set the implementation contract address. The code at the given address will execute         when this contract is called."
-      },
-      "upgradeToAndCall(address,bytes)": {
-        "notice": "Set the implementation and call a function in a single transaction. Useful to ensure         atomic execution of initialization-based upgrades."
-      }
-    },
-    "events": {
-      "AdminChanged(address,address)": {
-        "notice": "An event that is emitted each time the owner is upgraded. This event is part of the         EIP-1967 specification."
-      },
-      "Upgraded(address)": {
-        "notice": "An event that is emitted each time the implementation is changed. This event is part         of the EIP-1967 specification."
-      }
-    },
-    "notice": "Proxy is a transparent proxy that passes through the call if the caller is the owner or         if the caller is address(0), meaning that the call originated from an off-chain         simulation."
-  }
-}
\ No newline at end of file
diff --git a/op-bindings/hardhat/types.go b/op-bindings/hardhat/types.go
deleted file mode 100644
index 9dd3a3629828..000000000000
--- a/op-bindings/hardhat/types.go
+++ /dev/null
@@ -1,159 +0,0 @@
-package hardhat
-
-import (
-	"encoding/json"
-	"strings"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-	"github.com/ethereum/go-ethereum/accounts/abi"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/common/hexutil"
-)
-
-// Deployment represents a hardhat-deploy artifact file
-type Deployment struct {
-	Name             string
-	Abi              abi.ABI            `json:"abi"`
-	Address          common.Address     `json:"address"`
-	Args             []interface{}      `json:"-"`
-	Bytecode         hexutil.Bytes      `json:"bytecode"`
-	DeployedBytecode hexutil.Bytes      `json:"deployedBytecode"`
-	Devdoc           json.RawMessage    `json:"devdoc"`
-	Metadata         string             `json:"metadata"`
-	Receipt          json.RawMessage    `json:"receipt"`
-	SolcInputHash    string             `json:"solcInputHash"`
-	StorageLayout    solc.StorageLayout `json:"storageLayout"`
-	TransactionHash  common.Hash        `json:"transactionHash"`
-	Userdoc          json.RawMessage    `json:"userdoc"`
-}
-
-// UnmarshalJSON is a custom unmarshaler for Deployment, handling the Args field. This changed recently
-// when `foundry` migrated to `alloy` types, and now the Args field within the contract artifact has
-// a different serialization format.
-//
-// This custom unmarshaller should be removed when this is fixed upstream.
-//
-// Old Example:
-// ```
-// "args": [
-//
-//	"0xCE9FeE676767A25feb9722986148Fcd87085a14e",
-//	"OVM_L1CrossDomainMessenger"
-//
-// ],
-// ```
-//
-// New Example:
-// ```
-// "args": "[\"0x45ce2021212883d655348778aC99707d63D49aBc\",\"\\OVM_L1CrossDomainMessenger\\\"]"
-// ```
-func (d *Deployment) UnmarshalJSON(data []byte) error {
-	// Create a type alias to prevent recursion
-	type DeploymentAlias Deployment
-
-	// Unmarshal all fields except for `Args`
-	var alias DeploymentAlias
-	if err := json.Unmarshal(data, &alias); err != nil {
-		return err
-	}
-
-	// Unmarshal `Args` manually.
-	tmp := struct {
-		Args json.RawMessage `json:"args"`
-	}{}
-	if err := json.Unmarshal(data, &tmp); err != nil {
-		return err
-	}
-
-	// Strip the `args` string of escapes and quotes.
-	stripped := strings.ReplaceAll(strings.Trim(string(tmp.Args), "\""), "\\", "")
-
-	// Unmarshal the stripped version of the `args` field.
-	var args []interface{}
-	if err := json.Unmarshal([]byte(stripped), &args); err != nil {
-		return err
-	}
-
-	// Set the `Args` field in the `Deployment` to the correctly unmarshaled value
-	alias.Args = args
-
-	// Assign the unmarshaled alias back to the original struct
-	*d = Deployment(alias)
-	return nil
-}
-
-// Receipt represents the receipt held in a hardhat-deploy
-// artifact file
-type Receipt struct {
-	To                *common.Address `json:"to"`
-	From              common.Address  `json:"from"`
-	ContractAddress   *common.Address `json:"contractAddress"`
-	TransactionIndex  uint            `json:"transactionIndex"`
-	GasUsed           uint            `json:"gasUsed,string"`
-	LogsBloom         hexutil.Bytes   `json:"logsBloom"`
-	BlockHash         common.Hash     `json:"blockHash"`
-	TransactionHash   common.Hash     `json:"transactionHash"`
-	Logs              []Log           `json:"logs"`
-	BlockNumber       uint            `json:"blockNumber"`
-	CumulativeGasUsed uint            `json:"cumulativeGasUsed,string"`
-	Status            uint            `json:"status"`
-	Byzantium         bool            `json:"byzantium"`
-}
-
-// Log represents the logs in the hardhat deploy artifact receipt
-type Log struct {
-	TransactionIndex uint           `json:"transactionIndex"`
-	BlockNumber      uint           `json:"blockNumber"`
-	TransactionHash  common.Hash    `json:"transactionHash"`
-	Address          common.Address `json:"address"`
-	Topics           []common.Hash  `json:"topics"`
-	Data             hexutil.Bytes  `json:"data"`
-	LogIndex         uint           `json:"logIndex"`
-	Blockhash        common.Hash    `json:"blockHash"`
-}
-
-// Artifact represents a hardhat compilation artifact
-// The Bytecode and DeployedBytecode are not guaranteed
-// to be hexutil.Bytes when there are link references.
-// In the future, custom json marshalling can be used
-// to place the link reference values in the correct location.
-type Artifact struct {
-	Format                 string         `json:"_format"`
-	ContractName           string         `json:"contractName"`
-	SourceName             string         `json:"sourceName"`
-	Abi                    abi.ABI        `json:"abi"`
-	Bytecode               hexutil.Bytes  `json:"bytecode"`
-	DeployedBytecode       hexutil.Bytes  `json:"deployedBytecode"`
-	LinkReferences         LinkReferences `json:"linkReferences"`
-	DeployedLinkReferences LinkReferences `json:"deployedLinkReferences"`
-}
-
-// LinkReferences represents the linked contracts
-type LinkReferences map[string]LinkReference
-
-// LinkReference represents a single linked contract
-type LinkReference map[string][]LinkReferenceOffset
-
-// LinkReferenceOffset represents the offsets in a link reference
-type LinkReferenceOffset struct {
-	Length uint `json:"length"`
-	Start  uint `json:"start"`
-}
-
-// DebugFile represents the debug file that contains the path
-// to the build info file
-type DebugFile struct {
-	Format    string `json:"_format"`
-	BuildInfo string `json:"buildInfo"`
-}
-
-// BuildInfo represents a hardhat build info artifact that is created
-// after compilation
-type BuildInfo struct {
-	Format          string              `json:"_format"`
-	Id              string              `json:"id"`
-	SolcVersion     string              `json:"solcVersion"`
-	SolcLongVersion string              `json:"solcLongVersion"`
-	Input           solc.CompilerInput  `json:"input"`
-	Output          solc.CompilerOutput `json:"output"`
-}
diff --git a/op-bindings/hardhat/utils.go b/op-bindings/hardhat/utils.go
deleted file mode 100644
index a59bfb2fcc5e..000000000000
--- a/op-bindings/hardhat/utils.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package hardhat
-
-import "strings"
-
-type QualifiedName struct {
-	SourceName   string
-	ContractName string
-}
-
-func ParseFullyQualifiedName(name string) QualifiedName {
-	names := strings.Split(name, ":")
-	if len(names) == 1 {
-		return QualifiedName{
-			SourceName:   "",
-			ContractName: names[0],
-		}
-	}
-
-	contractName := names[len(names)-1]
-	sourceName := strings.Join(names[0:len(names)-1], ":")
-
-	return QualifiedName{
-		ContractName: contractName,
-		SourceName:   sourceName,
-	}
-}
-
-func GetFullyQualifiedName(sourceName, contractName string) string {
-	return sourceName + ":" + contractName
-}
-
-func IsFullyQualifiedName(name string) bool {
-	return strings.Contains(name, ":")
-}
diff --git a/op-bindings/predeploys/addresses_test.go b/op-bindings/predeploys/addresses_test.go
deleted file mode 100644
index 44556e6432a8..000000000000
--- a/op-bindings/predeploys/addresses_test.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package predeploys
-
-import (
-	"math/big"
-	"testing"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/stretchr/testify/require"
-)
-
-func TestGethAddresses(t *testing.T) {
-	// We test if the addresses in geth match those in op-bindings, to avoid an import-cycle:
-	// we import geth in the monorepo, and do not want to import op-bindings into geth.
-	require.Equal(t, L1BlockAddr, types.L1BlockAddr)
-}
-
-func uintToHash(v uint) common.Hash {
-	return common.BigToHash(new(big.Int).SetUint64(uint64(v)))
-}
-
-// TestL1BlockSlots ensures that the storage layout of the L1Block
-// contract matches the hardcoded values in `op-geth`.
-func TestL1BlockSlots(t *testing.T) {
-	layout, err := bindings.GetStorageLayout("L1Block")
-	require.NoError(t, err)
-
-	var l1BaseFeeSlot, overHeadSlot, scalarSlot common.Hash
-	var l1BaseFeeScalarSlot, l1BlobBaseFeeScalarSlot, blobBaseFeeSlot common.Hash // new in Ecotone
-	var l1BaseFeeScalarOffset, l1BlobBaseFeeScalarOffset uint                     // new in Ecotone
-	for _, entry := range layout.Storage {
-		switch entry.Label {
-		case "l1FeeOverhead":
-			overHeadSlot = uintToHash(entry.Slot)
-		case "l1FeeScalar":
-			scalarSlot = uintToHash(entry.Slot)
-		case "basefee":
-			l1BaseFeeSlot = uintToHash(entry.Slot)
-		case "blobBaseFee":
-			blobBaseFeeSlot = uintToHash(entry.Slot)
-		case "baseFeeScalar":
-			l1BaseFeeScalarSlot = uintToHash(entry.Slot)
-			l1BaseFeeScalarOffset = entry.Offset
-		case "blobBaseFeeScalar":
-			l1BlobBaseFeeScalarSlot = uintToHash(entry.Slot)
-			l1BlobBaseFeeScalarOffset = entry.Offset
-		}
-	}
-
-	require.Equal(t, types.OverheadSlot, overHeadSlot)
-	require.Equal(t, types.ScalarSlot, scalarSlot)
-	require.Equal(t, types.L1BaseFeeSlot, l1BaseFeeSlot)
-	// new in Ecotone
-	require.Equal(t, types.L1BlobBaseFeeSlot, blobBaseFeeSlot)
-	require.Equal(t, types.L1FeeScalarsSlot, l1BaseFeeScalarSlot)
-	require.Equal(t, types.L1FeeScalarsSlot, l1BlobBaseFeeScalarSlot)
-	require.Equal(t, uint(types.BaseFeeScalarSlotOffset), l1BaseFeeScalarOffset)
-	require.Equal(t, uint(types.BlobBaseFeeScalarSlotOffset), l1BlobBaseFeeScalarOffset)
-}
diff --git a/op-bootnode/Makefile b/op-bootnode/Makefile
index e30dad5b1a99..f9f276e9ed11 100644
--- a/op-bootnode/Makefile
+++ b/op-bootnode/Makefile
@@ -1,6 +1,6 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+VERSION ?= v0.0.0
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
diff --git a/op-chain-ops/Makefile b/op-chain-ops/Makefile
index 1e39aca41694..1808807c7378 100644
--- a/op-chain-ops/Makefile
+++ b/op-chain-ops/Makefile
@@ -1,3 +1,8 @@
+# Use the old Apple linker to workaround broken xcode - https://github.com/golang/go/issues/65169
+ifeq ($(shell uname),Darwin)
+	FUZZLDFLAGS := -ldflags=-extldflags=-Wl,-ld_classic
+endif
+
 op-version-check:
 	go build -o ./bin/op-version-check ./cmd/op-version-check/main.go
 
@@ -7,13 +12,16 @@ ecotone-scalar:
 receipt-reference-builder:
 	go build -o ./bin/receipt-reference-builder ./cmd/receipt-reference-builder/*.go
 
+op-upgrade:
+	go build -o ./bin/op-upgrade ./cmd/op-upgrade/main.go
+
 test:
 	go test ./...
 
 fuzz:
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzEncodeDecodeWithdrawal ./crossdomain
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzEncodeDecodeLegacyWithdrawal ./crossdomain
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzAliasing ./crossdomain
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzVersionedNonce ./crossdomain
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzEncodeDecodeWithdrawal ./crossdomain
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzEncodeDecodeLegacyWithdrawal ./crossdomain
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzAliasing ./crossdomain
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz=FuzzVersionedNonce ./crossdomain
 
 .PHONY: test fuzz
diff --git a/op-bindings/bindings/gaspriceoracle.go b/op-chain-ops/cmd/check-ecotone/bindings/gaspriceoracle.go
similarity index 100%
rename from op-bindings/bindings/gaspriceoracle.go
rename to op-chain-ops/cmd/check-ecotone/bindings/gaspriceoracle.go
diff --git a/op-chain-ops/cmd/check-ecotone/main.go b/op-chain-ops/cmd/check-ecotone/main.go
index 507a20d211a3..711a090aa04f 100644
--- a/op-chain-ops/cmd/check-ecotone/main.go
+++ b/op-chain-ops/cmd/check-ecotone/main.go
@@ -26,8 +26,8 @@ import (
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/ethereum/go-ethereum/params"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/op-chain-ops/cmd/check-ecotone/bindings"
+	nbindings "github.com/ethereum-optimism/optimism/op-node/bindings"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	op_service "github.com/ethereum-optimism/optimism/op-service"
 	"github.com/ethereum-optimism/optimism/op-service/cliapp"
@@ -36,6 +36,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	oplog "github.com/ethereum-optimism/optimism/op-service/log"
 	"github.com/ethereum-optimism/optimism/op-service/opio"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum-optimism/optimism/op-service/retry"
 	"github.com/ethereum-optimism/optimism/op-service/sources"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
@@ -702,7 +703,7 @@ func checkUpgradeTxs(ctx context.Context, env *actionEnv) error {
 }
 
 func checkL1Block(ctx context.Context, env *actionEnv) error {
-	cl, err := bindings.NewL1Block(predeploys.L1BlockAddr, env.l2)
+	cl, err := nbindings.NewL1Block(predeploys.L1BlockAddr, env.l2)
 	if err != nil {
 		return fmt.Errorf("failed to create bindings around L1Block contract: %w", err)
 	}
@@ -843,7 +844,7 @@ func checkL1Fees(ctx context.Context, env *actionEnv) error {
 		return fmt.Errorf("expected %d L1 gas, but only spent %d", expectedCalldataGas, receipt.L1GasUsed)
 	}
 	if big.NewInt(0).Cmp(receipt.L1Fee) >= 0 {
-		return fmt.Errorf("calculated to low L1 fee: %d", receipt.L1Fee)
+		return fmt.Errorf("calculated too low L1 fee: %d", receipt.L1Fee)
 	}
 	env.log.Info("L1 fees test: success")
 	return nil
diff --git a/op-chain-ops/cmd/check-fjord/checks/checks.go b/op-chain-ops/cmd/check-fjord/checks/checks.go
new file mode 100644
index 000000000000..a7063bbde943
--- /dev/null
+++ b/op-chain-ops/cmd/check-fjord/checks/checks.go
@@ -0,0 +1,397 @@
+package checks
+
+import (
+	"bytes"
+	"context"
+	"crypto/ecdsa"
+	"crypto/rand"
+	"errors"
+	"fmt"
+	"math/big"
+	"strings"
+	"time"
+
+	"github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/crypto"
+	"github.com/ethereum/go-ethereum/ethclient"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/ethereum/go-ethereum/params"
+
+	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
+	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
+)
+
+type CheckFjordConfig struct {
+	Log       log.Logger
+	L2        *ethclient.Client
+	Key       *ecdsa.PrivateKey
+	Addr      common.Address
+	GasUsed   uint64
+	L1GasUsed uint64
+}
+
+func (ae *CheckFjordConfig) RecordGasUsed(rec *types.Receipt) {
+	ae.GasUsed += rec.GasUsed
+	ae.L1GasUsed += rec.L1GasUsed.Uint64()
+	ae.Log.Debug("Recorded tx receipt gas", "gas_used", rec.GasUsed, "l1_gas_used", rec.L1GasUsed)
+}
+
+var (
+	rip7212Precompile = common.HexToAddress("0x0000000000000000000000000000000000000100")
+	invalid7212Data   = []byte{0x00}
+	// This is a valid hash, r, s, x, y params for RIP-7212 taken from:
+	// https://gist.github.com/ulerdogan/8f1714895e23a54147fc529ea30517eb
+	valid7212Data = common.FromHex("4cee90eb86eaa050036147a12d49004b6b9c72bd725d39d4785011fe190f0b4da73bd4903f0ce3b639bbbf6e8e80d16931ff4bcf5993d58468e8fb19086e8cac36dbcd03009df8c59286b162af3bd7fcc0450c9aa81be5d10d312af6c66b1d604aebd3099c618202fcfe16ae7770b0c49ab5eadf74b754204a3bb6060e44eff37618b065f9832de4ca6ca971a7a1adc826d0f7c00181a5fb2ddf79ae00b4e10e")
+)
+
+func CheckRIP7212(ctx context.Context, env *CheckFjordConfig) error {
+	env.Log.Info("checking rip-7212")
+	// invalid request returns empty response, this is how the spec denotes an error.
+	response, err := env.L2.CallContract(ctx, ethereum.CallMsg{
+		To:   &rip7212Precompile,
+		Data: invalid7212Data,
+	}, nil)
+	if err != nil {
+		return err
+	}
+
+	if !bytes.Equal(response, []byte{}) {
+		return fmt.Errorf("precompile should return empty response for invalid signature, but got %s", response)
+	}
+	env.Log.Info("confirmed precompile returns empty response for invalid signature")
+
+	// valid request returns one
+	response, err = env.L2.CallContract(ctx, ethereum.CallMsg{
+		To:   &rip7212Precompile,
+		Data: valid7212Data,
+	}, nil)
+	if err != nil {
+		return err
+	}
+	if !bytes.Equal(response, common.LeftPadBytes([]byte{1}, 32)) {
+		return fmt.Errorf("precompile should return 1 for valid signature, but got %s", response)
+	}
+	env.Log.Info("confirmed precompile returns 1 for valid signature")
+
+	return nil
+}
+
+func CheckAllFastLz(ctx context.Context, env *CheckFjordConfig) error {
+	env.Log.Info("beginning all FastLz feature tests")
+	if err := CheckGasPriceOracle(ctx, env); err != nil {
+		return fmt.Errorf("gas-price-oracle: %w", err)
+	}
+	if err := CheckTxEmpty(ctx, env); err != nil {
+		return fmt.Errorf("tx-empty: %w", err)
+	}
+	if err := CheckTxAllZero(ctx, env); err != nil {
+		return fmt.Errorf("tx-all-zero: %w", err)
+	}
+	if err := CheckTxAll42(ctx, env); err != nil {
+		return fmt.Errorf("tx-all-42: %w", err)
+	}
+	if err := CheckTxRandom(ctx, env); err != nil {
+		return fmt.Errorf("tx-random: %w", err)
+	}
+	env.Log.Info("completed all FastLz feature tests successfully")
+	return nil
+}
+
+func CheckGasPriceOracle(ctx context.Context, env *CheckFjordConfig) error {
+	env.Log.Info("beginning GasPriceOracle checks")
+	expectedGasPriceOracleAddress := crypto.CreateAddress(derive.GasPriceOracleFjordDeployerAddress, 0)
+
+	// Gas Price Oracle Proxy is updated
+	updatedGasPriceOracleAddress, err := env.L2.StorageAt(context.Background(), predeploys.GasPriceOracleAddr, genesis.ImplementationSlot, nil)
+	if err != nil {
+		return err
+	}
+	if gpo := common.BytesToAddress(updatedGasPriceOracleAddress); expectedGasPriceOracleAddress != gpo {
+		return fmt.Errorf("expected GasPriceOracle address %s does not match actual address %s",
+			expectedGasPriceOracleAddress, gpo)
+	}
+	env.Log.Info("confirmed GasPriceOracle address meets expectation")
+
+	code, err := env.L2.CodeAt(context.Background(), expectedGasPriceOracleAddress, nil)
+	if err != nil {
+		return fmt.Errorf("reading codeAt expectedGasPriceOracleAddress: %w", err)
+	}
+	if len(code) == 0 {
+		return errors.New("codeAt expectedGasPriceOracleAddress is empty")
+	}
+	codeHash := crypto.Keccak256Hash(code)
+	fjordGasPriceOracleCodeHash := common.HexToHash("0xa88fa50a2745b15e6794247614b5298483070661adacb8d32d716434ed24c6b2")
+
+	if codeHash != fjordGasPriceOracleCodeHash {
+		return fmt.Errorf("GasPriceOracle codeHash (%s) does not match expectation (%s)",
+			codeHash, fjordGasPriceOracleCodeHash)
+	}
+	env.Log.Info("confirmed GasPriceOracle codeHash meets expectation")
+
+	// Get gas price from oracle
+	gasPriceOracle, err := bindings.NewGasPriceOracleCaller(predeploys.GasPriceOracleAddr, env.L2)
+	if err != nil {
+		return fmt.Errorf("creating bindings for new GaspriceOracleCaller: %w", err)
+	}
+
+	// Check that Fjord was activated
+	isFjord, err := gasPriceOracle.IsFjord(nil)
+	if err != nil {
+		return fmt.Errorf("calling GasPriceOracle.IsFjord: %w", err)
+	}
+	if !isFjord {
+		return errors.New("GasPriceOracle.IsFjord returned false")
+	}
+	env.Log.Info("confirmed GasPriceOracle reports Fjord is activated")
+	return nil
+}
+
+func sendTxAndCheckFees(ctx context.Context, env *CheckFjordConfig, to *common.Address, txData []byte) error {
+	gasPriceOracle, err := bindings.NewGasPriceOracleCaller(predeploys.GasPriceOracleAddr, env.L2)
+	if err != nil {
+		return fmt.Errorf("creating bindings for new GaspriceOracleCaller: %w", err)
+	}
+
+	tx, err := execTx(ctx, to, txData, false, env)
+	if err != nil {
+		return fmt.Errorf("executing tx: %w", err)
+	}
+	blockHash := tx.receipt.BlockHash
+	opts := &bind.CallOpts{BlockHash: blockHash}
+	txUnsigned, err := tx.unsigned.MarshalBinary()
+	if err != nil {
+		return fmt.Errorf("binary-encoding unsigned tx: %w", err)
+	}
+	txSigned, err := tx.signed.MarshalBinary()
+	if err != nil {
+		return fmt.Errorf("binary-encoding signed tx: %w", err)
+	}
+	env.Log.Info("Transaction confirmed",
+		"unsigned_len", len(txUnsigned),
+		"signed", len(txSigned),
+		"block_hash", blockHash,
+	)
+
+	gpoL1GasUsed, err := gasPriceOracle.GetL1GasUsed(opts, txUnsigned)
+	if err != nil {
+		return fmt.Errorf("calling GasPriceOracle.GetL1GasUsed: %w", err)
+	}
+
+	env.Log.Info("retrieved L1 gas used", "gpoL1GasUsed", gpoL1GasUsed.Uint64())
+
+	// Check that GetL1Fee takes into account fast LZ
+	gpoFee, err := gasPriceOracle.GetL1Fee(opts, txUnsigned)
+	if err != nil {
+		return fmt.Errorf("calling GasPriceOracle.GetL1Fee: %w", err)
+	}
+
+	gethGPOFee, err := fjordL1Cost(gasPriceOracle, blockHash, uint64(types.FlzCompressLen(txUnsigned)+68))
+	if err != nil {
+		return fmt.Errorf("calculating GPO fjordL1Cost: %w", err)
+	}
+	if gethGPOFee.Uint64() != gpoFee.Uint64() {
+		return fmt.Errorf("gethGPOFee (%s) does not match gpoFee (%s)", gethGPOFee, gpoFee)
+	}
+	env.Log.Info("gethGPOFee matches gpoFee")
+
+	gethFee, err := fjordL1Cost(gasPriceOracle, blockHash, uint64(types.FlzCompressLen(txSigned)))
+	if err != nil {
+		return fmt.Errorf("calculating receipt fjordL1Cost: %w", err)
+	}
+	if gethFee.Uint64() != tx.receipt.L1Fee.Uint64() {
+		return fmt.Errorf("gethFee (%s) does not match receipt L1Fee (%s)", gethFee, tx.receipt.L1Fee)
+	}
+	env.Log.Info("gethFee matches receipt fee")
+
+	// Check that L1FeeUpperBound works
+	upperBound, err := gasPriceOracle.GetL1FeeUpperBound(opts, big.NewInt(int64(len(txUnsigned))))
+	if err != nil {
+		return fmt.Errorf("failed when calling GasPriceOracle.GetL1FeeUpperBound function: %w", err)
+	}
+
+	txLenGPO := len(txUnsigned) + 68
+	flzUpperBound := uint64(txLenGPO + txLenGPO/255 + 16)
+	upperBoundCost, err := fjordL1Cost(gasPriceOracle, blockHash, flzUpperBound)
+	if err != nil {
+		return fmt.Errorf("failed to calculate fjordL1Cost: %w", err)
+	}
+	if upperBoundCost.Uint64() != upperBound.Uint64() {
+		return fmt.Errorf("upperBound (%s) does not meet expectation (%s)", upperBound, upperBoundCost)
+	}
+	env.Log.Info("GPO upper bound matches")
+	return nil
+}
+
+func CheckTxEmpty(ctx context.Context, env *CheckFjordConfig) error {
+	txData := []byte(nil)
+	to := &env.Addr
+	env.Log.Info("Attempting tx-empty...")
+	return sendTxAndCheckFees(ctx, env, to, txData)
+}
+
+func CheckTxAllZero(ctx context.Context, env *CheckFjordConfig) error {
+	txData := make([]byte, 256)
+	to := &env.Addr
+	env.Log.Info("Attempting tx-all-zero...")
+	return sendTxAndCheckFees(ctx, env, to, txData)
+}
+
+func CheckTxAll42(ctx context.Context, env *CheckFjordConfig) error {
+	txData := make([]byte, 256)
+	for i := range txData {
+		txData[i] = 0x42
+	}
+	to := &env.Addr
+	env.Log.Info("Attempting tx-all-42...")
+	return sendTxAndCheckFees(ctx, env, to, txData)
+}
+
+func CheckTxRandom(ctx context.Context, env *CheckFjordConfig) error {
+	txData := make([]byte, 256)
+	_, _ = rand.Read(txData)
+	to := &env.Addr
+	env.Log.Info("Attempting tx-random...")
+	return sendTxAndCheckFees(ctx, env, to, txData)
+}
+
+func fjordL1Cost(gasPriceOracle *bindings.GasPriceOracleCaller, block common.Hash, fastLzSize uint64) (*big.Int, error) {
+	opts := &bind.CallOpts{BlockHash: block}
+	baseFeeScalar, err := gasPriceOracle.BaseFeeScalar(opts)
+	if err != nil {
+		return nil, err
+	}
+	l1BaseFee, err := gasPriceOracle.L1BaseFee(opts)
+	if err != nil {
+		return nil, err
+	}
+	blobBaseFeeScalar, err := gasPriceOracle.BlobBaseFeeScalar(opts)
+	if err != nil {
+		return nil, err
+	}
+	blobBaseFee, err := gasPriceOracle.BlobBaseFee(opts)
+	if err != nil {
+		return nil, err
+	}
+
+	costFunc := types.NewL1CostFuncFjord(
+		l1BaseFee,
+		blobBaseFee,
+		new(big.Int).SetUint64(uint64(baseFeeScalar)),
+		new(big.Int).SetUint64(uint64(blobBaseFeeScalar)))
+
+	fee, _ := costFunc(types.RollupCostData{FastLzSize: fastLzSize})
+	return fee, nil
+}
+
+type txExecution struct {
+	unsigned *types.Transaction
+	signed   *types.Transaction
+	receipt  *types.Receipt
+}
+
+func execTx(ctx context.Context, to *common.Address, data []byte, expectRevert bool, env *CheckFjordConfig) (*txExecution, error) {
+	nonce, err := env.L2.PendingNonceAt(ctx, env.Addr)
+	if err != nil {
+		return nil, fmt.Errorf("pending nonce retrieval failed: %w", err)
+	}
+	head, err := env.L2.HeaderByNumber(context.Background(), nil)
+	if err != nil {
+		return nil, fmt.Errorf("failed to retrieve head header: %w", err)
+	}
+
+	tip := big.NewInt(params.GWei)
+	maxFee := new(big.Int).Mul(head.BaseFee, big.NewInt(2))
+	maxFee = maxFee.Add(maxFee, tip)
+
+	chainID, err := env.L2.ChainID(ctx)
+	if err != nil {
+		return nil, fmt.Errorf("failed to get chainID: %w", err)
+	}
+	tx := types.NewTx(&types.DynamicFeeTx{
+		ChainID:   chainID,
+		Nonce:     nonce,
+		GasTipCap: tip,
+		GasFeeCap: maxFee,
+		Gas:       500000,
+		To:        to,
+		Data:      data,
+		Value:     big.NewInt(0),
+	})
+
+	signer := types.NewCancunSigner(chainID)
+	signedTx, err := types.SignTx(tx, signer, env.Key)
+	if err != nil {
+		return nil, fmt.Errorf("failed to sign tx: %w", err)
+	}
+
+	env.Log.Info("sending tx", "txhash", signedTx.Hash(), "to", to, "data", hexutil.Bytes(data))
+	if err := env.L2.SendTransaction(ctx, signedTx); err != nil {
+		return nil, fmt.Errorf("failed to send tx: %w", err)
+	}
+	for i := 0; i < 30; i++ {
+		env.Log.Info("checking confirmation...", "txhash", signedTx.Hash())
+		receipt, err := env.L2.TransactionReceipt(context.Background(), signedTx.Hash())
+		if err != nil {
+			if strings.Contains(err.Error(), "not found") {
+				env.Log.Info("not found yet, waiting...")
+				time.Sleep(time.Second)
+				continue
+			} else {
+				return nil, fmt.Errorf("error while checking tx receipt: %w", err)
+			}
+		}
+		env.RecordGasUsed(receipt)
+		if expectRevert {
+			if receipt.Status == types.ReceiptStatusFailed {
+				env.Log.Info("tx reverted as expected", "txhash", signedTx.Hash())
+				return &txExecution{unsigned: tx, signed: signedTx, receipt: receipt}, nil
+			} else {
+				return nil, fmt.Errorf("tx %s unexpectedly completed without revert", signedTx.Hash())
+			}
+		} else {
+			if receipt.Status == types.ReceiptStatusSuccessful {
+				env.Log.Info("tx confirmed", "txhash", signedTx.Hash())
+				return &txExecution{unsigned: tx, signed: signedTx, receipt: receipt}, nil
+			} else {
+				return nil, fmt.Errorf("tx %s failed", signedTx.Hash())
+			}
+		}
+	}
+	return nil, fmt.Errorf("confirming tx: %s", signedTx.Hash())
+}
+
+func CheckAll(ctx context.Context, env *CheckFjordConfig) error {
+	bal, err := env.L2.BalanceAt(ctx, env.Addr, nil)
+	if err != nil {
+		return fmt.Errorf("failed to check balance of account: %w", err)
+	}
+	env.Log.Info("starting checks, tx account", "addr", env.Addr, "balance_wei", bal)
+
+	if err = CheckRIP7212(ctx, env); err != nil {
+		env.Log.Error("rip-7212", "err", err)
+		return fmt.Errorf("rip-7212: %w", err)
+	}
+
+	if err = CheckAllFastLz(ctx, env); err != nil {
+		env.Log.Error("fastLz", "err", err)
+		return fmt.Errorf("fastLz: %w", err)
+	}
+
+	finbal, err := env.L2.BalanceAt(ctx, env.Addr, nil)
+	if err != nil {
+		return fmt.Errorf("failed to check final balance of account: %w", err)
+	}
+	env.Log.Info("completed all tests successfully!",
+		"addr", env.Addr, "balance_wei", finbal,
+		"spent_wei", new(big.Int).Sub(bal, finbal),
+		"gas_used_total", env.GasUsed,
+		"l1_gas_used_total", env.L1GasUsed,
+	)
+	return nil
+}
diff --git a/op-chain-ops/cmd/check-fjord/main.go b/op-chain-ops/cmd/check-fjord/main.go
new file mode 100644
index 000000000000..5a2ef66fbcb9
--- /dev/null
+++ b/op-chain-ops/cmd/check-fjord/main.go
@@ -0,0 +1,111 @@
+package main
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"os"
+
+	"github.com/ethereum-optimism/optimism/op-chain-ops/cmd/check-fjord/checks"
+	op_service "github.com/ethereum-optimism/optimism/op-service"
+	"github.com/ethereum-optimism/optimism/op-service/cliapp"
+	oplog "github.com/ethereum-optimism/optimism/op-service/log"
+	"github.com/ethereum-optimism/optimism/op-service/opio"
+	"github.com/ethereum/go-ethereum/crypto"
+	"github.com/ethereum/go-ethereum/ethclient"
+	"github.com/urfave/cli/v2"
+)
+
+var (
+	prefix     = "CHECK_FJORD"
+	EndpointL2 = &cli.StringFlag{
+		Name:    "l2",
+		Usage:   "L2 execution RPC endpoint",
+		EnvVars: op_service.PrefixEnvVar(prefix, "L2"),
+		Value:   "http://localhost:9545",
+	}
+	AccountKey = &cli.StringFlag{
+		Name:    "account",
+		Usage:   "Private key (hex-formatted string) of test account to perform test txs with",
+		EnvVars: op_service.PrefixEnvVar(prefix, "ACCOUNT"),
+	}
+)
+
+type CheckAction func(ctx context.Context, env *checks.CheckFjordConfig) error
+
+func makeFlags() []cli.Flag {
+	flags := []cli.Flag{
+		EndpointL2,
+		AccountKey,
+	}
+	return append(flags, oplog.CLIFlags(prefix)...)
+}
+
+func makeCommand(name string, fn CheckAction) *cli.Command {
+	return &cli.Command{
+		Name:   name,
+		Action: makeCommandAction(fn),
+		Flags:  cliapp.ProtectFlags(makeFlags()),
+	}
+}
+
+func makeCommandAction(fn CheckAction) func(c *cli.Context) error {
+	return func(c *cli.Context) error {
+		logCfg := oplog.ReadCLIConfig(c)
+		logger := oplog.NewLogger(c.App.Writer, logCfg)
+
+		c.Context = opio.CancelOnInterrupt(c.Context)
+		l2Cl, err := ethclient.DialContext(c.Context, c.String(EndpointL2.Name))
+		if err != nil {
+			return fmt.Errorf("failed to dial L2 RPC: %w", err)
+		}
+		key, err := crypto.HexToECDSA(c.String(AccountKey.Name))
+		if err != nil {
+			return fmt.Errorf("failed to parse test private key: %w", err)
+		}
+		if err := fn(c.Context, &checks.CheckFjordConfig{
+			Log:  logger,
+			L2:   l2Cl,
+			Key:  key,
+			Addr: crypto.PubkeyToAddress(key.PublicKey),
+		}); err != nil {
+			return fmt.Errorf("command error: %w", err)
+		}
+		return nil
+	}
+}
+
+func main() {
+	app := cli.NewApp()
+	app.Name = "check-fjord"
+	app.Usage = "Check Fjord upgrade results."
+	app.Description = "Check Fjord upgrade results."
+	app.Action = func(c *cli.Context) error {
+		return errors.New("see sub-commands")
+	}
+	app.Writer = os.Stdout
+	app.ErrWriter = os.Stderr
+	app.Commands = []*cli.Command{
+		makeCommand("all", checks.CheckAll),
+		makeCommand("rip-7212", checks.CheckRIP7212),
+		{
+			Name: "fast-lz",
+			Subcommands: []*cli.Command{
+				makeCommand("gas-price-oracle", checks.CheckGasPriceOracle),
+				makeCommand("tx-empty", checks.CheckTxEmpty),
+				makeCommand("tx-all-zero", checks.CheckTxAllZero),
+				makeCommand("tx-all-42", checks.CheckTxAll42),
+				makeCommand("tx-random", checks.CheckTxRandom),
+				makeCommand("all", checks.CheckAllFastLz),
+			},
+			Flags:  makeFlags(),
+			Action: makeCommandAction(checks.CheckAllFastLz),
+		},
+	}
+
+	err := app.Run(os.Args)
+	if err != nil {
+		_, _ = fmt.Fprintf(os.Stderr, "Application failed: %v\n", err)
+		os.Exit(1)
+	}
+}
diff --git a/op-chain-ops/cmd/ecotone-scalar/README.md b/op-chain-ops/cmd/ecotone-scalar/README.md
index 2f533eea7b7f..a888f8d3f3a5 100644
--- a/op-chain-ops/cmd/ecotone-scalar/README.md
+++ b/op-chain-ops/cmd/ecotone-scalar/README.md
@@ -18,3 +18,9 @@ blob base fee parameters respectively, for example:
 ```sh
 ./bin/ecotone-scalar --scalar=7600 --blob-scalar=862000
 ```
+
+You can also use the utility to decode a versioned value into its components:
+
+```sh
+./bin/ecotone-scalar --decode=452312848583266388373324160190187140051835877600158453279134021569375896653
+```
diff --git a/op-chain-ops/cmd/ecotone-scalar/main.go b/op-chain-ops/cmd/ecotone-scalar/main.go
index 53ee823fc0bc..f512901142e8 100644
--- a/op-chain-ops/cmd/ecotone-scalar/main.go
+++ b/op-chain-ops/cmd/ecotone-scalar/main.go
@@ -1,16 +1,19 @@
 package main
 
 import (
-	"encoding/binary"
 	"flag"
 	"fmt"
 	"math"
 	"math/big"
 	"os"
+
+	"github.com/ethereum-optimism/optimism/op-service/eth"
 )
 
 func main() {
 	var scalar, blobScalar uint
+	var decode string
+	flag.StringVar(&decode, "decode", "", "uint256 post-ecotone scalar value to decode into its components")
 	flag.UintVar(&scalar, "scalar", 0, "base fee scalar value for the gas config (uint32)")
 	flag.UintVar(&blobScalar, "blob-scalar", 0, "blob base fee scalar value for the gas config (uint32)")
 	flag.Parse()
@@ -26,15 +29,46 @@ func main() {
 		os.Exit(2)
 	}
 
-	var n [32]byte
-	n[0] = 1 // version
-	binary.BigEndian.PutUint32(n[32-4:], uint32(scalar))
-	binary.BigEndian.PutUint32(n[32-8:], uint32(blobScalar))
-	i := new(big.Int).SetBytes(n[:])
+	var encoded [32]byte
+	if len(decode) > 0 {
+		if scalar != 0 || blobScalar != 0 {
+			fmt.Fprintln(flag.CommandLine.Output(), "decode parameter should not be used with scalar and blob-scalar")
+			flag.Usage()
+			os.Exit(2)
+		}
+		uint256 := new(big.Int)
+		_, ok := uint256.SetString(decode, 0)
+		if !ok {
+			fmt.Fprintln(flag.CommandLine.Output(), "failed to parse int from post-ecotone scalar")
+			flag.Usage()
+			os.Exit(2)
+		}
+		encodedSlice := uint256.Bytes()
+		if len(encodedSlice) > 32 {
+			fmt.Fprintln(flag.CommandLine.Output(), "post-ecotone scalar out of uint256 range")
+			flag.Usage()
+			os.Exit(2)
+		}
+		copy(encoded[:], encodedSlice)
+		decoded, err := eth.DecodeScalar(encoded)
+		if err != nil {
+			fmt.Fprintln(flag.CommandLine.Output(), "post-ecotone scalar could not be decoded:", err)
+			flag.Usage()
+			os.Exit(2)
+		}
+		scalar = uint(decoded.BaseFeeScalar)
+		blobScalar = uint(decoded.BlobBaseFeeScalar)
+	} else {
+		encoded = eth.EncodeScalar(eth.EcotoneScalars{
+			BlobBaseFeeScalar: uint32(blobScalar),
+			BaseFeeScalar:     uint32(scalar),
+		})
+	}
+	i := new(big.Int).SetBytes(encoded[:])
 
 	fmt.Println("# base fee scalar     :", scalar)
 	fmt.Println("# blob base fee scalar:", blobScalar)
-	fmt.Printf("# v1 hex encoding  : 0x%x\n", n[:])
+	fmt.Printf("# v1 hex encoding  : 0x%x\n", encoded[:])
 	fmt.Println("# uint value for the 'scalar' parameter in SystemConfigProxy.setGasConfig():")
 	fmt.Println(i)
 }
diff --git a/op-chain-ops/cmd/op-simulate/main.go b/op-chain-ops/cmd/op-simulate/main.go
index 04d9e5fe94f0..cec69c2454f7 100644
--- a/op-chain-ops/cmd/op-simulate/main.go
+++ b/op-chain-ops/cmd/op-simulate/main.go
@@ -11,6 +11,7 @@ import (
 	"path"
 	"time"
 
+	"github.com/holiman/uint256"
 	"github.com/pkg/profile"
 	"github.com/urfave/cli/v2"
 
@@ -257,7 +258,7 @@ func simulate(ctx context.Context, logger log.Logger, conf *params.ChainConfig,
 	}
 	for addr, acc := range dump {
 		state.CreateAccount(addr)
-		state.SetBalance(addr, new(big.Int).Set((*big.Int)(&acc.Balance)))
+		state.SetBalance(addr, uint256.MustFromBig((*big.Int)(&acc.Balance)))
 		state.SetNonce(addr, acc.Nonce)
 		state.SetCode(addr, acc.Code)
 		state.SetStorage(addr, acc.Storage)
diff --git a/op-chain-ops/cmd/op-upgrade-mcp/README.md b/op-chain-ops/cmd/op-upgrade-mcp/README.md
deleted file mode 100644
index 4d95f1e93d4a..000000000000
--- a/op-chain-ops/cmd/op-upgrade-mcp/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# op-upgrade-mcp
-
-One off CLI tooling for the mcp upgrade
diff --git a/op-chain-ops/cmd/op-upgrade-mcp/main.go b/op-chain-ops/cmd/op-upgrade-mcp/main.go
deleted file mode 100644
index 2dd2dc8ca90d..000000000000
--- a/op-chain-ops/cmd/op-upgrade-mcp/main.go
+++ /dev/null
@@ -1,225 +0,0 @@
-package main
-
-import (
-	"encoding/json"
-	"errors"
-	"fmt"
-	"os"
-
-	"github.com/ethereum/go-ethereum/log"
-	"github.com/mattn/go-isatty"
-	"github.com/urfave/cli/v2"
-
-	"github.com/ethereum-optimism/optimism/op-chain-ops/clients"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/safe"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/upgrades"
-	oplog "github.com/ethereum-optimism/optimism/op-service/log"
-
-	"github.com/ethereum-optimism/superchain-registry/superchain"
-)
-
-// deployments contains the L1 addresses of the contracts that are being upgraded to.
-// Note that the key is the L2 chain id. This is because the L1 contracts must be specific
-// for a particular OP Stack chain and cannot currently be used by multiple chains.
-var deployments = map[uint64]superchain.ImplementationList{
-	// OP Mainnet
-	10: {
-		L1CrossDomainMessenger: superchain.VersionedContract{
-			Version: "2.3.0",
-			Address: superchain.HexToAddress("0xD3494713A5cfaD3F5359379DfA074E2Ac8C6Fd65"),
-		},
-		L1ERC721Bridge: superchain.VersionedContract{
-			Version: "2.1.0",
-			Address: superchain.HexToAddress("0xAE2AF01232a6c4a4d3012C5eC5b1b35059caF10d"),
-		},
-		L1StandardBridge: superchain.VersionedContract{
-			Version: "2.1.0",
-			Address: superchain.HexToAddress("0x64B5a5Ed26DCb17370Ff4d33a8D503f0fbD06CfF"),
-		},
-		OptimismPortal: superchain.VersionedContract{
-			Version: "2.5.0",
-			Address: superchain.HexToAddress("0x2D778797049FE9259d947D1ED8e5442226dFB589"),
-		},
-		SystemConfig: superchain.VersionedContract{
-			Version: "1.12.0",
-			Address: superchain.HexToAddress("0xba2492e52F45651B60B8B38d4Ea5E2390C64Ffb1"),
-		},
-		L2OutputOracle: superchain.VersionedContract{
-			Version: "1.8.0",
-			Address: superchain.HexToAddress("0xF243BEd163251380e78068d317ae10f26042B292"),
-		},
-		OptimismMintableERC20Factory: superchain.VersionedContract{
-			Version: "1.9.0",
-			Address: superchain.HexToAddress("0xE01efbeb1089D1d1dB9c6c8b135C934C0734c846"),
-		},
-	},
-	// OP Sepolia
-	11155420: {
-		L1CrossDomainMessenger: superchain.VersionedContract{
-			Version: "2.3.0",
-			Address: superchain.HexToAddress("0xD3494713A5cfaD3F5359379DfA074E2Ac8C6Fd65"),
-		},
-		L1ERC721Bridge: superchain.VersionedContract{
-			Version: "2.1.0",
-			Address: superchain.HexToAddress("0xAE2AF01232a6c4a4d3012C5eC5b1b35059caF10d"),
-		},
-		L1StandardBridge: superchain.VersionedContract{
-			Version: "2.1.0",
-			Address: superchain.HexToAddress("0x64B5a5Ed26DCb17370Ff4d33a8D503f0fbD06CfF"),
-		},
-		OptimismPortal: superchain.VersionedContract{
-			Version: "2.5.0",
-			Address: superchain.HexToAddress("0x2D778797049FE9259d947D1ED8e5442226dFB589"),
-		},
-		SystemConfig: superchain.VersionedContract{
-			Version: "1.12.0",
-			Address: superchain.HexToAddress("0xba2492e52F45651B60B8B38d4Ea5E2390C64Ffb1"),
-		},
-		L2OutputOracle: superchain.VersionedContract{
-			Version: "1.8.0",
-			Address: superchain.HexToAddress("0xF243BEd163251380e78068d317ae10f26042B292"),
-		},
-		OptimismMintableERC20Factory: superchain.VersionedContract{
-			Version: "1.9.0",
-			Address: superchain.HexToAddress("0xE01efbeb1089D1d1dB9c6c8b135C934C0734c846"),
-		},
-	},
-}
-
-func main() {
-	color := isatty.IsTerminal(os.Stderr.Fd())
-	oplog.SetGlobalLogHandler(log.NewTerminalHandler(os.Stderr, color))
-
-	app := &cli.App{
-		Name:  "op-upgrade",
-		Usage: "Build transactions useful for upgrading the Superchain",
-		Flags: []cli.Flag{
-			&cli.StringFlag{
-				Name:     "l1-rpc-url",
-				Value:    "http://127.0.0.1:8545",
-				Usage:    "L1 RPC URL, the chain ID will be used to determine the superchain",
-				Required: true,
-				EnvVars:  []string{"L1_RPC_URL"},
-			},
-			&cli.StringFlag{
-				Name:     "l2-rpc-url",
-				Value:    "http://127.0.0.1:9545",
-				Usage:    "L2 RPC URL",
-				Required: true,
-				EnvVars:  []string{"L2_RPC_URL"},
-			},
-			&cli.PathFlag{
-				Name:     "deploy-config",
-				Usage:    "The path to the deploy config file",
-				Required: true,
-				EnvVars:  []string{"DEPLOY_CONFIG"},
-			},
-			&cli.PathFlag{
-				Name:    "outfile",
-				Usage:   "The file to write the output to. If not specified, output is written to stdout",
-				EnvVars: []string{"OUTFILE"},
-			},
-		},
-		Action: entrypoint,
-	}
-
-	if err := app.Run(os.Args); err != nil {
-		log.Crit("error op-upgrade", "err", err)
-	}
-}
-
-// entrypoint contains the main logic of the script
-func entrypoint(ctx *cli.Context) error {
-	config, err := genesis.NewDeployConfig(ctx.Path("deploy-config"))
-	if err != nil {
-		return err
-	}
-	if err := config.Check(); err != nil {
-		return fmt.Errorf("error checking deploy config: %w", err)
-	}
-
-	clients, err := clients.NewClients(ctx.String("l1-rpc-url"), ctx.String("l2-rpc-url"))
-	if err != nil {
-		return fmt.Errorf("cannot create RPC clients: %w", err)
-	}
-	if clients.L1Client == nil {
-		return errors.New("Cannot create L1 client")
-	}
-	if clients.L2Client == nil {
-		return errors.New("Cannot create L2 client")
-	}
-
-	l1ChainID, err := clients.L1Client.ChainID(ctx.Context)
-	if err != nil {
-		return fmt.Errorf("cannot fetch L1 chain ID: %w", err)
-	}
-	l2ChainID, err := clients.L2Client.ChainID(ctx.Context)
-	if err != nil {
-		return fmt.Errorf("cannot fetch L2 chain ID: %w", err)
-	}
-
-	log.Info("connected to chains", "l1-chain-id", l1ChainID, "l2-chain-id", l2ChainID)
-
-	// Create a batch of transactions
-	batch := safe.Batch{}
-
-	list, ok := deployments[l2ChainID.Uint64()]
-	if !ok {
-		return fmt.Errorf("no implementations for chain ID %d", l2ChainID)
-	}
-
-	proxyAddresses, ok := superchain.Addresses[l2ChainID.Uint64()]
-	if !ok {
-		return fmt.Errorf("no proxy addresses for chain ID %d", l2ChainID)
-	}
-
-	chainConfig, ok := superchain.OPChains[l2ChainID.Uint64()]
-	if !ok {
-		return fmt.Errorf("no chain config for chain ID %d", l2ChainID)
-	}
-
-	log.Info("Upgrading to the following versions")
-	log.Info("L1CrossDomainMessenger", "version", list.L1CrossDomainMessenger.Version, "address", list.L1CrossDomainMessenger.Address)
-	log.Info("L1ERC721Bridge", "version", list.L1ERC721Bridge.Version, "address", list.L1ERC721Bridge.Address)
-	log.Info("L1StandardBridge", "version", list.L1StandardBridge.Version, "address", list.L1StandardBridge.Address)
-	log.Info("L2OutputOracle", "version", list.L2OutputOracle.Version, "address", list.L2OutputOracle.Address)
-	log.Info("OptimismMintableERC20Factory", "version", list.OptimismMintableERC20Factory.Version, "address", list.OptimismMintableERC20Factory.Address)
-	log.Info("OptimismPortal", "version", list.OptimismPortal.Version, "address", list.OptimismPortal.Address)
-	log.Info("SystemConfig", "version", list.SystemConfig.Version, "address", list.SystemConfig.Address)
-
-	if err := upgrades.CheckL1(ctx.Context, &list, clients.L1Client); err != nil {
-		return fmt.Errorf("error checking L1 contracts: %w", err)
-	}
-
-	// Build the batch
-	if err := upgrades.L1(&batch, list, *proxyAddresses, config, chainConfig, clients.L1Client); err != nil {
-		return fmt.Errorf("cannot build L1 upgrade batch: %w", err)
-	}
-
-	// Write the batch to disk or stdout
-	if outfile := ctx.Path("outfile"); outfile != "" {
-		if err := writeJSON(outfile, batch); err != nil {
-			return err
-		}
-	} else {
-		data, err := json.MarshalIndent(batch, "", "  ")
-		if err != nil {
-			return err
-		}
-		fmt.Println(string(data))
-	}
-	return nil
-}
-
-func writeJSON(outfile string, input interface{}) error {
-	f, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o666)
-	if err != nil {
-		return err
-	}
-	defer f.Close()
-
-	enc := json.NewEncoder(f)
-	enc.SetIndent("", "  ")
-	return enc.Encode(input)
-}
diff --git a/op-chain-ops/cmd/op-upgrade/README.md b/op-chain-ops/cmd/op-upgrade/README.md
index 9e62f9c1955e..8494c83ebce2 100644
--- a/op-chain-ops/cmd/op-upgrade/README.md
+++ b/op-chain-ops/cmd/op-upgrade/README.md
@@ -36,3 +36,25 @@ be read out of the directory as needed.
 
 The file that the bundle should be written to. If omitted, the file
 will be written to stdout.
+
+#### Usage
+
+Build and run using the [Makefile](../../Makefile) `op-upgrade` target.
+Inside `/op-chain-ops`, run:
+
+```sh
+make op-upgrade
+```
+
+to create a binary in [../../bin/op-upgrade](../../bin/op-upgrade) that can
+be executed. Execute the following command inside `/op-chain-ops` to
+create the Safe transaction bundle in an output file called `input.json`.
+
+```sh
+./bin/op-upgrade \
+  --l1-rpc-url https://ethereum-rpc.publicnode.com  \
+  --chain-ids 10 \
+  --superchain-target mainnet \
+  --outfile input.json \
+  --deploy-config ../packages/contracts-bedrock/deploy-config
+```
diff --git a/op-chain-ops/cmd/op-upgrade/main.go b/op-chain-ops/cmd/op-upgrade/main.go
index 36e0d4111a01..736cd67b833b 100644
--- a/op-chain-ops/cmd/op-upgrade/main.go
+++ b/op-chain-ops/cmd/op-upgrade/main.go
@@ -24,6 +24,36 @@ import (
 	"github.com/ethereum-optimism/superchain-registry/superchain"
 )
 
+func isAllowedChainID(chainId uint64) {
+	// TODO We panic if the chain ID does not correspond to the mainnet or sepolia versions
+	// of Metal, Mode, or Zora. This is because OP Sepolia is currently on FPAC, which corresponds
+	// to OptimismPortal v3.3.0. However, we do not want to upgrade other chains to that yet. A
+	// proper fix to op-upgrade to allow specifying the targets versions of contracts is a large
+	// change, and we might end up deprecating op-upgrade anyway. Therefore, we instead hardcode
+	// the chain IDs this script can be used for and panic if the chain ID is not one of them. This
+	// way it's not possible to erroneously upgrade a chain to an unexpected version.
+	//
+	// mainnet/metal: 1750
+	// mainnet/mode: 34443
+	// mainnet/zora: 7777777
+	// mainnet/base: 8453
+	// sepolia/metal: 1740
+	// sepolia/mode: 919
+	// sepolia/zora: 999999999
+	// sepolia/base: 84532
+	allowed := chainId == 1750 ||
+		chainId == 34443 ||
+		chainId == 7777777 ||
+		chainId == 1740 ||
+		chainId == 919 ||
+		chainId == 999999999 ||
+		chainId == 8453 ||
+		chainId == 84532
+	if !allowed {
+		panic(fmt.Sprintf("Chain ID %d is not allowed. We panic if the chain ID does not correspond to the mainnet or sepolia versions of Metal, Mode, or Zora. This is because OP Sepolia is currently on FPAC, which corresponds to OptimismPortal v3.3.0. However, we do not want to upgrade other chains to that yet. A proper fix to op-upgrade to allow specifying the targets versions of contracts is a large change, and we might end up deprecating op-upgrade anyway. Therefore, we instead hardcode the chain IDs this script can be used for and panic if the chain ID is not one of them. This way it's not possible to erroneously upgrade a chain to an unexpected version.", chainId))
+	}
+}
+
 func main() {
 	color := isatty.IsTerminal(os.Stderr.Fd())
 	oplog.SetGlobalLogHandler(log.NewTerminalHandler(os.Stderr, color))
@@ -44,14 +74,13 @@ func main() {
 			},
 			&cli.StringFlag{
 				Name:    "superchain-target",
-				Usage:   "The name of the superchain to upgrade",
+				Usage:   "The name of the superchain target to upgrade. For example: mainnet or sepolia.",
 				EnvVars: []string{"SUPERCHAIN_TARGET"},
 			},
 			&cli.PathFlag{
-				Name:     "deploy-config",
-				Usage:    "The path to the deploy config file",
-				Required: true,
-				EnvVars:  []string{"DEPLOY_CONFIG"},
+				Name:    "deploy-config",
+				Usage:   "The path to the deploy config file",
+				EnvVars: []string{"DEPLOY_CONFIG"},
 			},
 			&cli.PathFlag{
 				Name:    "outfile",
@@ -94,6 +123,11 @@ func entrypoint(ctx *cli.Context) error {
 	}
 
 	chainIDs := ctx.Uint64Slice("chain-ids")
+	if len(chainIDs) != 1 {
+		// This requirement is due to the `SYSTEM_CONFIG_START_BLOCK` environment variable
+		// that we read from in `op-chain-ops/upgrades/l1.go`
+		panic("op-upgrade currently only supports upgrading a single chain at a time")
+	}
 	deployConfig := ctx.Path("deploy-config")
 
 	// If no chain IDs are specified, upgrade all chains
@@ -109,6 +143,10 @@ func entrypoint(ctx *cli.Context) error {
 		}
 	}
 
+	if len(targets) == 0 {
+		return fmt.Errorf("no chains found for superchain target %s with chain IDs %v, are you sure this chain is in the superchain registry?", superchainName, chainIDs)
+	}
+
 	slices.SortFunc(targets, func(i, j *superchain.ChainConfig) int {
 		return int(i.ChainID) - int(j.ChainID)
 	})
@@ -117,10 +155,13 @@ func entrypoint(ctx *cli.Context) error {
 	batch := safe.Batch{}
 
 	for _, chainConfig := range targets {
+		// Panic if this chain ID is not allowed. See comments in isAllowedChainID to learn more.
+		isAllowedChainID(chainConfig.ChainID)
+
 		name, _ := toDeployConfigName(chainConfig)
 		config, err := genesis.NewDeployConfigWithNetwork(name, deployConfig)
 		if err != nil {
-			log.Warn("Cannot find deploy config for network", "name", chainConfig.Name, "deploy-config-name", name, "path", deployConfig, "err", err)
+			log.Warn("Cannot find deploy config for network, so validity checks will be skipped", "name", chainConfig.Name, "deploy-config-name", name, "path", deployConfig, "err", err)
 		}
 
 		if config != nil {
@@ -177,12 +218,19 @@ func entrypoint(ctx *cli.Context) error {
 		log.Info("OptimismPortal", "version", versions.OptimismPortal, "address", addresses.OptimismPortalProxy)
 		log.Info("SystemConfig", "version", versions.SystemConfig, "address", addresses.SystemConfigProxy)
 
-		implementations, ok := superchain.Implementations[l1ChainID.Uint64()]
+		implementations, ok := superchain.Implementations[chainConfig.Superchain]
 		if !ok {
 			return fmt.Errorf("no implementations for chain ID %d", l1ChainID.Uint64())
 		}
 
-		list, err := implementations.Resolve(superchain.SuperchainSemver[superchainName])
+		// TODO This looks for the latest implementations defined for each contract, and for
+		// OptimismPortal that's the FPAC v3.3.0. However we do not want to upgrade other chains to
+		// that yet so we hardcode v2.5.0 which corresponds to the pre-FPAC op-contracts/v1.3.0 tag.
+		// See comments in isAllowedChainID to learn more.
+		targetUpgrade := superchain.SuperchainSemver[superchainName]
+		targetUpgrade.OptimismPortal = "2.5.0"
+
+		list, err := implementations.Resolve(targetUpgrade)
 		if err != nil {
 			return err
 		}
@@ -203,7 +251,8 @@ func entrypoint(ctx *cli.Context) error {
 		}
 
 		// Build the batch
-		if err := upgrades.L1(&batch, list, *addresses, config, chainConfig, clients.L1Client); err != nil {
+		// op-upgrade assumes a superchain config for L1 contract-implementations set.
+		if err := upgrades.L1(&batch, list, *addresses, config, chainConfig, sc, clients.L1Client); err != nil {
 			return err
 		}
 	}
diff --git a/op-chain-ops/cmd/receipt-reference-builder/readwrite.go b/op-chain-ops/cmd/receipt-reference-builder/readwrite.go
index d556227c245e..c4f43876b961 100644
--- a/op-chain-ops/cmd/receipt-reference-builder/readwrite.go
+++ b/op-chain-ops/cmd/receipt-reference-builder/readwrite.go
@@ -47,7 +47,7 @@ func (w jsonAggregateReaderWriter) readAggregate(f string) (aggregate, error) {
 type gobAggregateReaderWriter struct{}
 
 // writeAggregate writes the aggregate to a file in gob format
-// if the output file is not specified, it will creeate a file based on the block range
+// if the output file is not specified, it will create a file based on the block range
 func (w gobAggregateReaderWriter) writeAggregate(a aggregate, o string) error {
 	if o == "" {
 		o = fmt.Sprintf("%d.%d-%d.gob", a.ChainID, a.First, a.Last)
diff --git a/op-chain-ops/cmd/registry-data/main.go b/op-chain-ops/cmd/registry-data/main.go
index 1f33d65db8db..7992edf897dc 100644
--- a/op-chain-ops/cmd/registry-data/main.go
+++ b/op-chain-ops/cmd/registry-data/main.go
@@ -91,17 +91,19 @@ type GenesisAccount struct {
 }
 
 type Genesis struct {
-	Nonce      uint64         `json:"nonce"`
-	Timestamp  uint64         `json:"timestamp"`
-	ExtraData  []byte         `json:"extraData"`
-	GasLimit   uint64         `json:"gasLimit"`
-	Difficulty *hexutil.Big   `json:"difficulty"`
-	Mixhash    common.Hash    `json:"mixHash"`
-	Coinbase   common.Address `json:"coinbase"`
-	Number     uint64         `json:"number"`
-	GasUsed    uint64         `json:"gasUsed"`
-	ParentHash common.Hash    `json:"parentHash"`
-	BaseFee    *hexutil.Big   `json:"baseFeePerGas"`
+	Nonce         uint64         `json:"nonce"`
+	Timestamp     uint64         `json:"timestamp"`
+	ExtraData     []byte         `json:"extraData"`
+	GasLimit      uint64         `json:"gasLimit"`
+	Difficulty    *hexutil.Big   `json:"difficulty"`
+	Mixhash       common.Hash    `json:"mixHash"`
+	Coinbase      common.Address `json:"coinbase"`
+	Number        uint64         `json:"number"`
+	GasUsed       uint64         `json:"gasUsed"`
+	ParentHash    common.Hash    `json:"parentHash"`
+	BaseFee       *hexutil.Big   `json:"baseFeePerGas"`
+	ExcessBlobGas *uint64        `json:"excessBlobGas"` // EIP-4844
+	BlobGasUsed   *uint64        `json:"blobGasUsed"`   // EIP-4844
 
 	Alloc jsonutil.LazySortedJsonMap[common.Address, GenesisAccount] `json:"alloc"`
 	// For genesis definitions without full state (OP-Mainnet, OP-Goerli)
@@ -168,19 +170,21 @@ func entrypoint(ctx *cli.Context) error {
 			return errors.New("genesis-header based genesis must have no withdrawals")
 		}
 		out := Genesis{
-			Nonce:      genesisHeader.Nonce.Uint64(),
-			Timestamp:  genesisHeader.Time,
-			ExtraData:  genesisHeader.Extra,
-			GasLimit:   genesisHeader.GasLimit,
-			Difficulty: (*hexutil.Big)(genesisHeader.Difficulty),
-			Mixhash:    genesisHeader.MixDigest,
-			Coinbase:   genesisHeader.Coinbase,
-			Number:     genesisHeader.Number.Uint64(),
-			GasUsed:    genesisHeader.GasUsed,
-			ParentHash: genesisHeader.ParentHash,
-			BaseFee:    (*hexutil.Big)(genesisHeader.BaseFee),
-			Alloc:      make(jsonutil.LazySortedJsonMap[common.Address, GenesisAccount]),
-			StateHash:  &genesisHeader.Root,
+			Nonce:         genesisHeader.Nonce.Uint64(),
+			Timestamp:     genesisHeader.Time,
+			ExtraData:     genesisHeader.Extra,
+			GasLimit:      genesisHeader.GasLimit,
+			Difficulty:    (*hexutil.Big)(genesisHeader.Difficulty),
+			Mixhash:       genesisHeader.MixDigest,
+			Coinbase:      genesisHeader.Coinbase,
+			Number:        genesisHeader.Number.Uint64(),
+			GasUsed:       genesisHeader.GasUsed,
+			ParentHash:    genesisHeader.ParentHash,
+			BaseFee:       (*hexutil.Big)(genesisHeader.BaseFee),
+			ExcessBlobGas: genesisHeader.ExcessBlobGas, // EIP-4844
+			BlobGasUsed:   genesisHeader.BlobGasUsed,   // EIP-4844
+			Alloc:         make(jsonutil.LazySortedJsonMap[common.Address, GenesisAccount]),
+			StateHash:     &genesisHeader.Root,
 		}
 		if err := writeGzipJSON(ctx.Path(OutputFlag.Name), out); err != nil {
 			return fmt.Errorf("failed to write output: %w", err)
@@ -209,18 +213,20 @@ func entrypoint(ctx *cli.Context) error {
 
 	// convert into allocation data
 	out := Genesis{
-		Nonce:      genesis.Nonce,
-		Timestamp:  genesis.Timestamp,
-		ExtraData:  genesis.ExtraData,
-		GasLimit:   genesis.GasLimit,
-		Difficulty: (*hexutil.Big)(genesis.Difficulty),
-		Mixhash:    genesis.Mixhash,
-		Coinbase:   genesis.Coinbase,
-		Number:     genesis.Number,
-		GasUsed:    genesis.GasUsed,
-		ParentHash: genesis.ParentHash,
-		BaseFee:    (*hexutil.Big)(genesis.BaseFee),
-		Alloc:      make(jsonutil.LazySortedJsonMap[common.Address, GenesisAccount]),
+		Nonce:         genesis.Nonce,
+		Timestamp:     genesis.Timestamp,
+		ExtraData:     genesis.ExtraData,
+		GasLimit:      genesis.GasLimit,
+		Difficulty:    (*hexutil.Big)(genesis.Difficulty),
+		Mixhash:       genesis.Mixhash,
+		Coinbase:      genesis.Coinbase,
+		Number:        genesis.Number,
+		GasUsed:       genesis.GasUsed,
+		ParentHash:    genesis.ParentHash,
+		BaseFee:       (*hexutil.Big)(genesis.BaseFee),
+		ExcessBlobGas: genesis.ExcessBlobGas, // EIP-4844
+		BlobGasUsed:   genesis.BlobGasUsed,   // EIP-4844
+		Alloc:         make(jsonutil.LazySortedJsonMap[common.Address, GenesisAccount]),
 	}
 
 	// write genesis, but only reference code by code-hash, and don't encode the L2 predeploys to save space.
diff --git a/op-chain-ops/cmd/unclaimed-credits/main.go b/op-chain-ops/cmd/unclaimed-credits/main.go
new file mode 100644
index 000000000000..079934a1204d
--- /dev/null
+++ b/op-chain-ops/cmd/unclaimed-credits/main.go
@@ -0,0 +1,162 @@
+package main
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"math/big"
+	"os"
+	"time"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	opservice "github.com/ethereum-optimism/optimism/op-service"
+	"github.com/ethereum-optimism/optimism/op-service/clock"
+	"github.com/ethereum-optimism/optimism/op-service/dial"
+	oplog "github.com/ethereum-optimism/optimism/op-service/log"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/urfave/cli/v2"
+	"golang.org/x/exp/maps"
+)
+
+var (
+	factoryAddressFlag = &cli.StringFlag{
+		Name:     "game-factory-address",
+		Usage:    "Address of the fault game factory contract.",
+		Required: true,
+	}
+	l1EthRpcFlag = &cli.StringFlag{
+		Name:     "l1-eth-rpc",
+		Usage:    "HTTP provider URL for L1.",
+		Required: true,
+	}
+	gameAddressFlag = &cli.StringFlag{
+		Name:  "game-address",
+		Usage: "Address of the FaultDisputeGame proxy contract to limit the search to.",
+	}
+	gameWindowFlag = &cli.DurationFlag{
+		Name:  "game-window",
+		Usage: "The time window to limit the search of games containing unclaimed credit.",
+	}
+)
+
+func unclaimedCreditsApp(ctx *cli.Context) error {
+	logger := oplog.NewLogger(os.Stderr, oplog.DefaultCLIConfig())
+	oplog.SetGlobalLogHandler(logger.Handler())
+
+	rpcUrl := ctx.String(l1EthRpcFlag.Name)
+	if rpcUrl == "" {
+		return fmt.Errorf("missing %v", l1EthRpcFlag.Name)
+	}
+	factoryAddr, err := opservice.ParseAddress(ctx.String(factoryAddressFlag.Name))
+	if err != nil {
+		return err
+	}
+	gameWindow := ctx.Duration(gameWindowFlag.Name)
+	var gameAddr common.Address
+	if ctx.String(gameAddressFlag.Name) != "" {
+		gameAddr, err = opservice.ParseAddress(ctx.String(gameAddressFlag.Name))
+		if err != nil {
+			return err
+		}
+	}
+
+	l1Client, err := dial.DialEthClientWithTimeout(ctx.Context, dial.DefaultDialTimeout, logger, rpcUrl)
+	if err != nil {
+		return fmt.Errorf("failed to dial L1: %w", err)
+	}
+	defer l1Client.Close()
+
+	caller := batching.NewMultiCaller(l1Client.Client(), batching.DefaultBatchSize)
+	contract := contracts.NewDisputeGameFactoryContract(metrics.NoopContractMetrics, factoryAddr, caller)
+	head, err := l1Client.HeaderByNumber(ctx.Context, nil)
+	if err != nil {
+		return fmt.Errorf("failed to retrieve current head block: %w", err)
+	}
+	return unclaimedCredits(ctx.Context, caller, contract, head.Hash(), gameWindow, gameAddr)
+}
+
+func unclaimedCredits(ctx context.Context, caller *batching.MultiCaller, factory *contracts.DisputeGameFactoryContract, block common.Hash, gameWindow time.Duration, gameFilter common.Address) error {
+	earliestTimestamp := clock.MinCheckedTimestamp(clock.SystemClock, gameWindow)
+	games, err := factory.GetGamesAtOrAfter(ctx, block, earliestTimestamp)
+	if err != nil {
+		return fmt.Errorf("failed to retrieve games: %w", err)
+	}
+
+	unclaimedCredits := make(map[common.Address]*big.Int)
+	for _, game := range games {
+		if (gameFilter != common.Address{}) && game.Proxy != gameFilter {
+			continue
+		}
+		gameContract, err := contracts.NewFaultDisputeGameContract(ctx, metrics.NoopContractMetrics, game.Proxy, caller)
+		if err != nil {
+			return fmt.Errorf("failed to create game contract: %w", err)
+		}
+		if status, err := gameContract.GetStatus(ctx); err != nil {
+			return err
+		} else if status == types.GameStatusInProgress {
+			continue
+		}
+		err = unclaimedCreditsForGame(ctx, gameContract, block, unclaimedCredits)
+		if err != nil {
+			return fmt.Errorf("failed to retrieve unclaimed credits for game: %w", err)
+		}
+		if game.Proxy == gameFilter {
+			break
+		}
+	}
+
+	enc := json.NewEncoder(os.Stdout)
+	enc.SetIndent("", "  ")
+	return enc.Encode(unclaimedCredits)
+}
+
+func unclaimedCreditsForGame(ctx context.Context, game contracts.FaultDisputeGameContract, block common.Hash, unclaimedCredits map[common.Address]*big.Int) error {
+	claims, err := game.GetAllClaims(ctx, rpcblock.ByHash(block))
+	if err != nil {
+		return fmt.Errorf("failed to retrieve claims: %w", err)
+	}
+	players := make(map[common.Address]bool)
+	for _, claim := range claims {
+		players[claim.Claimant] = true
+		if claim.CounteredBy != (common.Address{}) {
+			players[claim.CounteredBy] = true
+		}
+	}
+	playerList := maps.Keys(players)
+	credits, err := game.GetCredits(ctx, rpcblock.Latest, playerList...)
+	if err != nil {
+		return fmt.Errorf("failed to retrieve credits: %w", err)
+	}
+	for i, credit := range credits {
+		player := playerList[i]
+		total := unclaimedCredits[player]
+		if total == nil {
+			total = new(big.Int)
+			unclaimedCredits[player] = total
+		}
+		total.Add(total, credit)
+	}
+	return nil
+}
+
+func main() {
+	app := &cli.App{
+		Name:        "unclaimed-credits",
+		Description: "Outputs a JSON containing the unclaimed credits of each player of Fault Proofs. Only resolved games are considered.",
+		Flags: []cli.Flag{
+			l1EthRpcFlag,
+			factoryAddressFlag,
+			gameWindowFlag,
+			gameAddressFlag,
+		},
+		Action: unclaimedCreditsApp,
+	}
+	if err := app.Run(os.Args); err != nil {
+		log.Crit("error unclaimed-credits", "err", err)
+	}
+}
diff --git a/op-chain-ops/crossdomain/bindings/l1crossdomainmessenger.go b/op-chain-ops/crossdomain/bindings/l1crossdomainmessenger.go
new file mode 100644
index 000000000000..bc6f35286739
--- /dev/null
+++ b/op-chain-ops/crossdomain/bindings/l1crossdomainmessenger.go
@@ -0,0 +1,1631 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L1CrossDomainMessengerMetaData contains all meta data concerning the L1CrossDomainMessenger contract.
+var L1CrossDomainMessengerMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MESSAGE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_CALLDATA_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OTHER_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PORTAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOptimismPortal\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_CALL_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_CONSTANT_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_GAS_CHECK_BUFFER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_RESERVED_GAS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"baseGas\",\"inputs\":[{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"failedMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"},{\"name\":\"_portal\",\"type\":\"address\",\"internalType\":\"contractOptimismPortal\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"messageNonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"otherMessenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"portal\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOptimismPortal\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"relayMessage\",\"inputs\":[{\"name\":\"_nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"successfulMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"xDomainMessageSender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"FailedRelayedMessage\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RelayedMessage\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SentMessage\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"messageNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SentMessageExtension1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+	Bin: "",
+}
+
+// L1CrossDomainMessengerABI is the input ABI used to generate the binding from.
+// Deprecated: Use L1CrossDomainMessengerMetaData.ABI instead.
+var L1CrossDomainMessengerABI = L1CrossDomainMessengerMetaData.ABI
+
+// L1CrossDomainMessengerBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L1CrossDomainMessengerMetaData.Bin instead.
+var L1CrossDomainMessengerBin = L1CrossDomainMessengerMetaData.Bin
+
+// DeployL1CrossDomainMessenger deploys a new Ethereum contract, binding an instance of L1CrossDomainMessenger to it.
+func DeployL1CrossDomainMessenger(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L1CrossDomainMessenger, error) {
+	parsed, err := L1CrossDomainMessengerMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L1CrossDomainMessengerBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L1CrossDomainMessenger{L1CrossDomainMessengerCaller: L1CrossDomainMessengerCaller{contract: contract}, L1CrossDomainMessengerTransactor: L1CrossDomainMessengerTransactor{contract: contract}, L1CrossDomainMessengerFilterer: L1CrossDomainMessengerFilterer{contract: contract}}, nil
+}
+
+// L1CrossDomainMessenger is an auto generated Go binding around an Ethereum contract.
+type L1CrossDomainMessenger struct {
+	L1CrossDomainMessengerCaller     // Read-only binding to the contract
+	L1CrossDomainMessengerTransactor // Write-only binding to the contract
+	L1CrossDomainMessengerFilterer   // Log filterer for contract events
+}
+
+// L1CrossDomainMessengerCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1CrossDomainMessengerTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1CrossDomainMessengerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L1CrossDomainMessengerFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1CrossDomainMessengerSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L1CrossDomainMessengerSession struct {
+	Contract     *L1CrossDomainMessenger // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts           // Call options to use throughout this session
+	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
+}
+
+// L1CrossDomainMessengerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L1CrossDomainMessengerCallerSession struct {
+	Contract *L1CrossDomainMessengerCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts                 // Call options to use throughout this session
+}
+
+// L1CrossDomainMessengerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L1CrossDomainMessengerTransactorSession struct {
+	Contract     *L1CrossDomainMessengerTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
+}
+
+// L1CrossDomainMessengerRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L1CrossDomainMessengerRaw struct {
+	Contract *L1CrossDomainMessenger // Generic contract binding to access the raw methods on
+}
+
+// L1CrossDomainMessengerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerCallerRaw struct {
+	Contract *L1CrossDomainMessengerCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L1CrossDomainMessengerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerTransactorRaw struct {
+	Contract *L1CrossDomainMessengerTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL1CrossDomainMessenger creates a new instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessenger(address common.Address, backend bind.ContractBackend) (*L1CrossDomainMessenger, error) {
+	contract, err := bindL1CrossDomainMessenger(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessenger{L1CrossDomainMessengerCaller: L1CrossDomainMessengerCaller{contract: contract}, L1CrossDomainMessengerTransactor: L1CrossDomainMessengerTransactor{contract: contract}, L1CrossDomainMessengerFilterer: L1CrossDomainMessengerFilterer{contract: contract}}, nil
+}
+
+// NewL1CrossDomainMessengerCaller creates a new read-only instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessengerCaller(address common.Address, caller bind.ContractCaller) (*L1CrossDomainMessengerCaller, error) {
+	contract, err := bindL1CrossDomainMessenger(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerCaller{contract: contract}, nil
+}
+
+// NewL1CrossDomainMessengerTransactor creates a new write-only instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessengerTransactor(address common.Address, transactor bind.ContractTransactor) (*L1CrossDomainMessengerTransactor, error) {
+	contract, err := bindL1CrossDomainMessenger(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerTransactor{contract: contract}, nil
+}
+
+// NewL1CrossDomainMessengerFilterer creates a new log filterer instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessengerFilterer(address common.Address, filterer bind.ContractFilterer) (*L1CrossDomainMessengerFilterer, error) {
+	contract, err := bindL1CrossDomainMessenger(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerFilterer{contract: contract}, nil
+}
+
+// bindL1CrossDomainMessenger binds a generic wrapper to an already deployed contract.
+func bindL1CrossDomainMessenger(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L1CrossDomainMessengerABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1CrossDomainMessenger.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MESSAGEVERSION(opts *bind.CallOpts) (uint16, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MESSAGE_VERSION")
+
+	if err != nil {
+		return *new(uint16), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
+
+	return out0, err
+
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MESSAGEVERSION() (uint16, error) {
+	return _L1CrossDomainMessenger.Contract.MESSAGEVERSION(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MESSAGEVERSION() (uint16, error) {
+	return _L1CrossDomainMessenger.Contract.MESSAGEVERSION(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASCALLDATAOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_CALLDATA_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADDENOMINATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADNUMERATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) OTHERMESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "OTHER_MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) OTHERMESSENGER() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OTHERMESSENGER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) OTHERMESSENGER() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OTHERMESSENGER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// PORTAL is a free data retrieval call binding the contract method 0x0ff754ea.
+//
+// Solidity: function PORTAL() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) PORTAL(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "PORTAL")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// PORTAL is a free data retrieval call binding the contract method 0x0ff754ea.
+//
+// Solidity: function PORTAL() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) PORTAL() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.PORTAL(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// PORTAL is a free data retrieval call binding the contract method 0x0ff754ea.
+//
+// Solidity: function PORTAL() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) PORTAL() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.PORTAL(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYCALLOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CALL_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYCONSTANTOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CONSTANT_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYGASCHECKBUFFER(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_GAS_CHECK_BUFFER")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYRESERVEDGAS(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_RESERVED_GAS")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) BaseGas(opts *bind.CallOpts, _message []byte, _minGasLimit uint32) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "baseGas", _message, _minGasLimit)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.BaseGas(&_L1CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.BaseGas(&_L1CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) FailedMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "failedMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.FailedMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.FailedMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MessageNonce(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "messageNonce")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MessageNonce() (*big.Int, error) {
+	return _L1CrossDomainMessenger.Contract.MessageNonce(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MessageNonce() (*big.Int, error) {
+	return _L1CrossDomainMessenger.Contract.MessageNonce(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) OtherMessenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "otherMessenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) OtherMessenger() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OtherMessenger(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) OtherMessenger() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OtherMessenger(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Paused() (bool, error) {
+	return _L1CrossDomainMessenger.Contract.Paused(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Paused() (bool, error) {
+	return _L1CrossDomainMessenger.Contract.Paused(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Portal is a free data retrieval call binding the contract method 0x6425666b.
+//
+// Solidity: function portal() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Portal(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "portal")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Portal is a free data retrieval call binding the contract method 0x6425666b.
+//
+// Solidity: function portal() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Portal() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.Portal(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Portal is a free data retrieval call binding the contract method 0x6425666b.
+//
+// Solidity: function portal() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Portal() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.Portal(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) SuccessfulMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "successfulMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.SuccessfulMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.SuccessfulMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SuperchainConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SuperchainConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) SuperchainConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SuperchainConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) SystemConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "systemConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SystemConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SystemConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) SystemConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SystemConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Version() (string, error) {
+	return _L1CrossDomainMessenger.Contract.Version(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Version() (string, error) {
+	return _L1CrossDomainMessenger.Contract.Version(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) XDomainMessageSender(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "xDomainMessageSender")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) XDomainMessageSender() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.XDomainMessageSender(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) XDomainMessageSender() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.XDomainMessageSender(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _superchainConfig, address _portal, address _systemConfig) returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) Initialize(opts *bind.TransactOpts, _superchainConfig common.Address, _portal common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.contract.Transact(opts, "initialize", _superchainConfig, _portal, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _superchainConfig, address _portal, address _systemConfig) returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Initialize(_superchainConfig common.Address, _portal common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.Initialize(&_L1CrossDomainMessenger.TransactOpts, _superchainConfig, _portal, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _superchainConfig, address _portal, address _systemConfig) returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) Initialize(_superchainConfig common.Address, _portal common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.Initialize(&_L1CrossDomainMessenger.TransactOpts, _superchainConfig, _portal, _systemConfig)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) RelayMessage(opts *bind.TransactOpts, _nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.contract.Transact(opts, "relayMessage", _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.RelayMessage(&_L1CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.RelayMessage(&_L1CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) SendMessage(opts *bind.TransactOpts, _target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.contract.Transact(opts, "sendMessage", _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.SendMessage(&_L1CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.SendMessage(&_L1CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// L1CrossDomainMessengerFailedRelayedMessageIterator is returned from FilterFailedRelayedMessage and is used to iterate over the raw logs and unpacked data for FailedRelayedMessage events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerFailedRelayedMessageIterator struct {
+	Event *L1CrossDomainMessengerFailedRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerFailedRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerFailedRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerFailedRelayedMessage represents a FailedRelayedMessage event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerFailedRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterFailedRelayedMessage is a free log retrieval operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterFailedRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L1CrossDomainMessengerFailedRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerFailedRelayedMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "FailedRelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchFailedRelayedMessage is a free log subscription operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchFailedRelayedMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerFailedRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerFailedRelayedMessage)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseFailedRelayedMessage is a log parse operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseFailedRelayedMessage(log types.Log) (*L1CrossDomainMessengerFailedRelayedMessage, error) {
+	event := new(L1CrossDomainMessengerFailedRelayedMessage)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerInitializedIterator struct {
+	Event *L1CrossDomainMessengerInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerInitialized represents a Initialized event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterInitialized(opts *bind.FilterOpts) (*L1CrossDomainMessengerInitializedIterator, error) {
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerInitializedIterator{contract: _L1CrossDomainMessenger.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerInitialized)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseInitialized(log types.Log) (*L1CrossDomainMessengerInitialized, error) {
+	event := new(L1CrossDomainMessengerInitialized)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerRelayedMessageIterator is returned from FilterRelayedMessage and is used to iterate over the raw logs and unpacked data for RelayedMessage events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerRelayedMessageIterator struct {
+	Event *L1CrossDomainMessengerRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerRelayedMessage represents a RelayedMessage event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterRelayedMessage is a free log retrieval operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L1CrossDomainMessengerRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerRelayedMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "RelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchRelayedMessage is a free log subscription operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchRelayedMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerRelayedMessage)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseRelayedMessage is a log parse operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseRelayedMessage(log types.Log) (*L1CrossDomainMessengerRelayedMessage, error) {
+	event := new(L1CrossDomainMessengerRelayedMessage)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerSentMessageIterator is returned from FilterSentMessage and is used to iterate over the raw logs and unpacked data for SentMessage events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessageIterator struct {
+	Event *L1CrossDomainMessengerSentMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerSentMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerSentMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerSentMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerSentMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerSentMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerSentMessage represents a SentMessage event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessage struct {
+	Target       common.Address
+	Sender       common.Address
+	Message      []byte
+	MessageNonce *big.Int
+	GasLimit     *big.Int
+	Raw          types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessage is a free log retrieval operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterSentMessage(opts *bind.FilterOpts, target []common.Address) (*L1CrossDomainMessengerSentMessageIterator, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerSentMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "SentMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessage is a free log subscription operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchSentMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerSentMessage, target []common.Address) (event.Subscription, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerSentMessage)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessage is a log parse operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseSentMessage(log types.Log) (*L1CrossDomainMessengerSentMessage, error) {
+	event := new(L1CrossDomainMessengerSentMessage)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerSentMessageExtension1Iterator is returned from FilterSentMessageExtension1 and is used to iterate over the raw logs and unpacked data for SentMessageExtension1 events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessageExtension1Iterator struct {
+	Event *L1CrossDomainMessengerSentMessageExtension1 // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerSentMessageExtension1)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerSentMessageExtension1)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerSentMessageExtension1 represents a SentMessageExtension1 event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessageExtension1 struct {
+	Sender common.Address
+	Value  *big.Int
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessageExtension1 is a free log retrieval operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterSentMessageExtension1(opts *bind.FilterOpts, sender []common.Address) (*L1CrossDomainMessengerSentMessageExtension1Iterator, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerSentMessageExtension1Iterator{contract: _L1CrossDomainMessenger.contract, event: "SentMessageExtension1", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessageExtension1 is a free log subscription operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchSentMessageExtension1(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerSentMessageExtension1, sender []common.Address) (event.Subscription, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerSentMessageExtension1)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessageExtension1 is a log parse operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseSentMessageExtension1(log types.Log) (*L1CrossDomainMessengerSentMessageExtension1, error) {
+	event := new(L1CrossDomainMessengerSentMessageExtension1)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-chain-ops/crossdomain/bindings/l1standardbridge.go b/op-chain-ops/crossdomain/bindings/l1standardbridge.go
new file mode 100644
index 000000000000..3779bd3b16da
--- /dev/null
+++ b/op-chain-ops/crossdomain/bindings/l1standardbridge.go
@@ -0,0 +1,2220 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L1StandardBridgeMetaData contains all meta data concerning the L1StandardBridge contract.
+var L1StandardBridgeMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OTHER_BRIDGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractStandardBridge\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgeERC20\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bridgeERC20To\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bridgeETH\",\"inputs\":[{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"bridgeETHTo\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositERC20\",\"inputs\":[{\"name\":\"_l1Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_l2Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositERC20To\",\"inputs\":[{\"name\":\"_l1Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_l2Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositETH\",\"inputs\":[{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositETHTo\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"finalizeBridgeERC20\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizeBridgeETH\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"finalizeERC20Withdrawal\",\"inputs\":[{\"name\":\"_l1Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_l2Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizeETHWithdrawal\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_messenger\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l2TokenBridge\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"otherBridge\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractStandardBridge\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ERC20BridgeFinalized\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"remoteToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ERC20BridgeInitiated\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"remoteToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ERC20DepositInitiated\",\"inputs\":[{\"name\":\"l1Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"l2Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ERC20WithdrawalFinalized\",\"inputs\":[{\"name\":\"l1Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"l2Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHBridgeFinalized\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHBridgeInitiated\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHDepositInitiated\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHWithdrawalFinalized\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false}]",
+	Bin: "",
+}
+
+// L1StandardBridgeABI is the input ABI used to generate the binding from.
+// Deprecated: Use L1StandardBridgeMetaData.ABI instead.
+var L1StandardBridgeABI = L1StandardBridgeMetaData.ABI
+
+// L1StandardBridgeBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L1StandardBridgeMetaData.Bin instead.
+var L1StandardBridgeBin = L1StandardBridgeMetaData.Bin
+
+// DeployL1StandardBridge deploys a new Ethereum contract, binding an instance of L1StandardBridge to it.
+func DeployL1StandardBridge(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L1StandardBridge, error) {
+	parsed, err := L1StandardBridgeMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L1StandardBridgeBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L1StandardBridge{L1StandardBridgeCaller: L1StandardBridgeCaller{contract: contract}, L1StandardBridgeTransactor: L1StandardBridgeTransactor{contract: contract}, L1StandardBridgeFilterer: L1StandardBridgeFilterer{contract: contract}}, nil
+}
+
+// L1StandardBridge is an auto generated Go binding around an Ethereum contract.
+type L1StandardBridge struct {
+	L1StandardBridgeCaller     // Read-only binding to the contract
+	L1StandardBridgeTransactor // Write-only binding to the contract
+	L1StandardBridgeFilterer   // Log filterer for contract events
+}
+
+// L1StandardBridgeCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L1StandardBridgeCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1StandardBridgeTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L1StandardBridgeTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1StandardBridgeFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L1StandardBridgeFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1StandardBridgeSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L1StandardBridgeSession struct {
+	Contract     *L1StandardBridge // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// L1StandardBridgeCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L1StandardBridgeCallerSession struct {
+	Contract *L1StandardBridgeCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts           // Call options to use throughout this session
+}
+
+// L1StandardBridgeTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L1StandardBridgeTransactorSession struct {
+	Contract     *L1StandardBridgeTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
+}
+
+// L1StandardBridgeRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L1StandardBridgeRaw struct {
+	Contract *L1StandardBridge // Generic contract binding to access the raw methods on
+}
+
+// L1StandardBridgeCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L1StandardBridgeCallerRaw struct {
+	Contract *L1StandardBridgeCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L1StandardBridgeTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L1StandardBridgeTransactorRaw struct {
+	Contract *L1StandardBridgeTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL1StandardBridge creates a new instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridge(address common.Address, backend bind.ContractBackend) (*L1StandardBridge, error) {
+	contract, err := bindL1StandardBridge(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridge{L1StandardBridgeCaller: L1StandardBridgeCaller{contract: contract}, L1StandardBridgeTransactor: L1StandardBridgeTransactor{contract: contract}, L1StandardBridgeFilterer: L1StandardBridgeFilterer{contract: contract}}, nil
+}
+
+// NewL1StandardBridgeCaller creates a new read-only instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridgeCaller(address common.Address, caller bind.ContractCaller) (*L1StandardBridgeCaller, error) {
+	contract, err := bindL1StandardBridge(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeCaller{contract: contract}, nil
+}
+
+// NewL1StandardBridgeTransactor creates a new write-only instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridgeTransactor(address common.Address, transactor bind.ContractTransactor) (*L1StandardBridgeTransactor, error) {
+	contract, err := bindL1StandardBridge(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeTransactor{contract: contract}, nil
+}
+
+// NewL1StandardBridgeFilterer creates a new log filterer instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridgeFilterer(address common.Address, filterer bind.ContractFilterer) (*L1StandardBridgeFilterer, error) {
+	contract, err := bindL1StandardBridge(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeFilterer{contract: contract}, nil
+}
+
+// bindL1StandardBridge binds a generic wrapper to an already deployed contract.
+func bindL1StandardBridge(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L1StandardBridgeABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1StandardBridge *L1StandardBridgeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1StandardBridge.Contract.L1StandardBridgeCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1StandardBridge *L1StandardBridgeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.L1StandardBridgeTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1StandardBridge *L1StandardBridgeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.L1StandardBridgeTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1StandardBridge *L1StandardBridgeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1StandardBridge.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1StandardBridge *L1StandardBridgeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1StandardBridge *L1StandardBridgeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) MESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) MESSENGER() (common.Address, error) {
+	return _L1StandardBridge.Contract.MESSENGER(&_L1StandardBridge.CallOpts)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) MESSENGER() (common.Address, error) {
+	return _L1StandardBridge.Contract.MESSENGER(&_L1StandardBridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) OTHERBRIDGE(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "OTHER_BRIDGE")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) OTHERBRIDGE() (common.Address, error) {
+	return _L1StandardBridge.Contract.OTHERBRIDGE(&_L1StandardBridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) OTHERBRIDGE() (common.Address, error) {
+	return _L1StandardBridge.Contract.OTHERBRIDGE(&_L1StandardBridge.CallOpts)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L1StandardBridge *L1StandardBridgeCaller) Deposits(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "deposits", arg0, arg1)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L1StandardBridge *L1StandardBridgeSession) Deposits(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _L1StandardBridge.Contract.Deposits(&_L1StandardBridge.CallOpts, arg0, arg1)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Deposits(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _L1StandardBridge.Contract.Deposits(&_L1StandardBridge.CallOpts, arg0, arg1)
+}
+
+// L2TokenBridge is a free data retrieval call binding the contract method 0x91c49bf8.
+//
+// Solidity: function l2TokenBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) L2TokenBridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "l2TokenBridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2TokenBridge is a free data retrieval call binding the contract method 0x91c49bf8.
+//
+// Solidity: function l2TokenBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) L2TokenBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.L2TokenBridge(&_L1StandardBridge.CallOpts)
+}
+
+// L2TokenBridge is a free data retrieval call binding the contract method 0x91c49bf8.
+//
+// Solidity: function l2TokenBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) L2TokenBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.L2TokenBridge(&_L1StandardBridge.CallOpts)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) Messenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "messenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) Messenger() (common.Address, error) {
+	return _L1StandardBridge.Contract.Messenger(&_L1StandardBridge.CallOpts)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Messenger() (common.Address, error) {
+	return _L1StandardBridge.Contract.Messenger(&_L1StandardBridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) OtherBridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "otherBridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) OtherBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.OtherBridge(&_L1StandardBridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) OtherBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.OtherBridge(&_L1StandardBridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1StandardBridge *L1StandardBridgeCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1StandardBridge *L1StandardBridgeSession) Paused() (bool, error) {
+	return _L1StandardBridge.Contract.Paused(&_L1StandardBridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Paused() (bool, error) {
+	return _L1StandardBridge.Contract.Paused(&_L1StandardBridge.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) SuperchainConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SuperchainConfig(&_L1StandardBridge.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) SuperchainConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SuperchainConfig(&_L1StandardBridge.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) SystemConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "systemConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) SystemConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SystemConfig(&_L1StandardBridge.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) SystemConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SystemConfig(&_L1StandardBridge.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1StandardBridge *L1StandardBridgeCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1StandardBridge *L1StandardBridgeSession) Version() (string, error) {
+	return _L1StandardBridge.Contract.Version(&_L1StandardBridge.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Version() (string, error) {
+	return _L1StandardBridge.Contract.Version(&_L1StandardBridge.CallOpts)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeERC20(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeERC20", _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeERC20(_localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeERC20(_localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeERC20To(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeERC20To", _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeERC20To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20To(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeERC20To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20To(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeETH(opts *bind.TransactOpts, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeETH", _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeETHTo(opts *bind.TransactOpts, _to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeETHTo", _to, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// DepositERC20 is a paid mutator transaction binding the contract method 0x58a997f6.
+//
+// Solidity: function depositERC20(address _l1Token, address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositERC20(opts *bind.TransactOpts, _l1Token common.Address, _l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositERC20", _l1Token, _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20 is a paid mutator transaction binding the contract method 0x58a997f6.
+//
+// Solidity: function depositERC20(address _l1Token, address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositERC20(_l1Token common.Address, _l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20 is a paid mutator transaction binding the contract method 0x58a997f6.
+//
+// Solidity: function depositERC20(address _l1Token, address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositERC20(_l1Token common.Address, _l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20To is a paid mutator transaction binding the contract method 0x838b2520.
+//
+// Solidity: function depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositERC20To(opts *bind.TransactOpts, _l1Token common.Address, _l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositERC20To", _l1Token, _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20To is a paid mutator transaction binding the contract method 0x838b2520.
+//
+// Solidity: function depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositERC20To(_l1Token common.Address, _l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20To(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20To is a paid mutator transaction binding the contract method 0x838b2520.
+//
+// Solidity: function depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositERC20To(_l1Token common.Address, _l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20To(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// DepositETH is a paid mutator transaction binding the contract method 0xb1a1a882.
+//
+// Solidity: function depositETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositETH(opts *bind.TransactOpts, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositETH", _minGasLimit, _extraData)
+}
+
+// DepositETH is a paid mutator transaction binding the contract method 0xb1a1a882.
+//
+// Solidity: function depositETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// DepositETH is a paid mutator transaction binding the contract method 0xb1a1a882.
+//
+// Solidity: function depositETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// DepositETHTo is a paid mutator transaction binding the contract method 0x9a2ac6d5.
+//
+// Solidity: function depositETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositETHTo(opts *bind.TransactOpts, _to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositETHTo", _to, _minGasLimit, _extraData)
+}
+
+// DepositETHTo is a paid mutator transaction binding the contract method 0x9a2ac6d5.
+//
+// Solidity: function depositETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// DepositETHTo is a paid mutator transaction binding the contract method 0x9a2ac6d5.
+//
+// Solidity: function depositETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeBridgeERC20(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeBridgeERC20", _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeBridgeERC20(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeBridgeERC20(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeBridgeETH(opts *bind.TransactOpts, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeBridgeETH", _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeBridgeETH(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeETH(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeBridgeETH(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeETH(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeERC20Withdrawal is a paid mutator transaction binding the contract method 0xa9f9e675.
+//
+// Solidity: function finalizeERC20Withdrawal(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeERC20Withdrawal(opts *bind.TransactOpts, _l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeERC20Withdrawal", _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// FinalizeERC20Withdrawal is a paid mutator transaction binding the contract method 0xa9f9e675.
+//
+// Solidity: function finalizeERC20Withdrawal(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeERC20Withdrawal(_l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeERC20Withdrawal(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// FinalizeERC20Withdrawal is a paid mutator transaction binding the contract method 0xa9f9e675.
+//
+// Solidity: function finalizeERC20Withdrawal(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeERC20Withdrawal(_l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeERC20Withdrawal(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// FinalizeETHWithdrawal is a paid mutator transaction binding the contract method 0x1532ec34.
+//
+// Solidity: function finalizeETHWithdrawal(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeETHWithdrawal(opts *bind.TransactOpts, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeETHWithdrawal", _from, _to, _amount, _extraData)
+}
+
+// FinalizeETHWithdrawal is a paid mutator transaction binding the contract method 0x1532ec34.
+//
+// Solidity: function finalizeETHWithdrawal(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeETHWithdrawal(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeETHWithdrawal(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeETHWithdrawal is a paid mutator transaction binding the contract method 0x1532ec34.
+//
+// Solidity: function finalizeETHWithdrawal(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeETHWithdrawal(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeETHWithdrawal(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig, address _systemConfig) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) Initialize(opts *bind.TransactOpts, _messenger common.Address, _superchainConfig common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "initialize", _messenger, _superchainConfig, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig, address _systemConfig) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) Initialize(_messenger common.Address, _superchainConfig common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Initialize(&_L1StandardBridge.TransactOpts, _messenger, _superchainConfig, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig, address _systemConfig) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) Initialize(_messenger common.Address, _superchainConfig common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Initialize(&_L1StandardBridge.TransactOpts, _messenger, _superchainConfig, _systemConfig)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) Receive() (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Receive(&_L1StandardBridge.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) Receive() (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Receive(&_L1StandardBridge.TransactOpts)
+}
+
+// L1StandardBridgeERC20BridgeFinalizedIterator is returned from FilterERC20BridgeFinalized and is used to iterate over the raw logs and unpacked data for ERC20BridgeFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeFinalizedIterator struct {
+	Event *L1StandardBridgeERC20BridgeFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20BridgeFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20BridgeFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20BridgeFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20BridgeFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20BridgeFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20BridgeFinalized represents a ERC20BridgeFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeFinalized struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	Amount      *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20BridgeFinalized is a free log retrieval operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20BridgeFinalized(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*L1StandardBridgeERC20BridgeFinalizedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20BridgeFinalizedIterator{contract: _L1StandardBridge.contract, event: "ERC20BridgeFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20BridgeFinalized is a free log subscription operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20BridgeFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20BridgeFinalized, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20BridgeFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20BridgeFinalized is a log parse operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20BridgeFinalized(log types.Log) (*L1StandardBridgeERC20BridgeFinalized, error) {
+	event := new(L1StandardBridgeERC20BridgeFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeERC20BridgeInitiatedIterator is returned from FilterERC20BridgeInitiated and is used to iterate over the raw logs and unpacked data for ERC20BridgeInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeInitiatedIterator struct {
+	Event *L1StandardBridgeERC20BridgeInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20BridgeInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20BridgeInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20BridgeInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20BridgeInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20BridgeInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20BridgeInitiated represents a ERC20BridgeInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeInitiated struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	Amount      *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20BridgeInitiated is a free log retrieval operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20BridgeInitiated(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*L1StandardBridgeERC20BridgeInitiatedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20BridgeInitiatedIterator{contract: _L1StandardBridge.contract, event: "ERC20BridgeInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20BridgeInitiated is a free log subscription operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20BridgeInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20BridgeInitiated, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20BridgeInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20BridgeInitiated is a log parse operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20BridgeInitiated(log types.Log) (*L1StandardBridgeERC20BridgeInitiated, error) {
+	event := new(L1StandardBridgeERC20BridgeInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeERC20DepositInitiatedIterator is returned from FilterERC20DepositInitiated and is used to iterate over the raw logs and unpacked data for ERC20DepositInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20DepositInitiatedIterator struct {
+	Event *L1StandardBridgeERC20DepositInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20DepositInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20DepositInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20DepositInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20DepositInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20DepositInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20DepositInitiated represents a ERC20DepositInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20DepositInitiated struct {
+	L1Token   common.Address
+	L2Token   common.Address
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20DepositInitiated is a free log retrieval operation binding the contract event 0x718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396.
+//
+// Solidity: event ERC20DepositInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20DepositInitiated(opts *bind.FilterOpts, l1Token []common.Address, l2Token []common.Address, from []common.Address) (*L1StandardBridgeERC20DepositInitiatedIterator, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20DepositInitiated", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20DepositInitiatedIterator{contract: _L1StandardBridge.contract, event: "ERC20DepositInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20DepositInitiated is a free log subscription operation binding the contract event 0x718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396.
+//
+// Solidity: event ERC20DepositInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20DepositInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20DepositInitiated, l1Token []common.Address, l2Token []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20DepositInitiated", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20DepositInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20DepositInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20DepositInitiated is a log parse operation binding the contract event 0x718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396.
+//
+// Solidity: event ERC20DepositInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20DepositInitiated(log types.Log) (*L1StandardBridgeERC20DepositInitiated, error) {
+	event := new(L1StandardBridgeERC20DepositInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20DepositInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeERC20WithdrawalFinalizedIterator is returned from FilterERC20WithdrawalFinalized and is used to iterate over the raw logs and unpacked data for ERC20WithdrawalFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20WithdrawalFinalizedIterator struct {
+	Event *L1StandardBridgeERC20WithdrawalFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20WithdrawalFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20WithdrawalFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20WithdrawalFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20WithdrawalFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20WithdrawalFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20WithdrawalFinalized represents a ERC20WithdrawalFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20WithdrawalFinalized struct {
+	L1Token   common.Address
+	L2Token   common.Address
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20WithdrawalFinalized is a free log retrieval operation binding the contract event 0x3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3.
+//
+// Solidity: event ERC20WithdrawalFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20WithdrawalFinalized(opts *bind.FilterOpts, l1Token []common.Address, l2Token []common.Address, from []common.Address) (*L1StandardBridgeERC20WithdrawalFinalizedIterator, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20WithdrawalFinalized", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20WithdrawalFinalizedIterator{contract: _L1StandardBridge.contract, event: "ERC20WithdrawalFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20WithdrawalFinalized is a free log subscription operation binding the contract event 0x3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3.
+//
+// Solidity: event ERC20WithdrawalFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20WithdrawalFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20WithdrawalFinalized, l1Token []common.Address, l2Token []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20WithdrawalFinalized", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20WithdrawalFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20WithdrawalFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20WithdrawalFinalized is a log parse operation binding the contract event 0x3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3.
+//
+// Solidity: event ERC20WithdrawalFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20WithdrawalFinalized(log types.Log) (*L1StandardBridgeERC20WithdrawalFinalized, error) {
+	event := new(L1StandardBridgeERC20WithdrawalFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20WithdrawalFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHBridgeFinalizedIterator is returned from FilterETHBridgeFinalized and is used to iterate over the raw logs and unpacked data for ETHBridgeFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeFinalizedIterator struct {
+	Event *L1StandardBridgeETHBridgeFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHBridgeFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHBridgeFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHBridgeFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHBridgeFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHBridgeFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHBridgeFinalized represents a ETHBridgeFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeFinalized struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHBridgeFinalized is a free log retrieval operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHBridgeFinalized(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHBridgeFinalizedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHBridgeFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHBridgeFinalizedIterator{contract: _L1StandardBridge.contract, event: "ETHBridgeFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchETHBridgeFinalized is a free log subscription operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHBridgeFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHBridgeFinalized, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHBridgeFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHBridgeFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHBridgeFinalized is a log parse operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHBridgeFinalized(log types.Log) (*L1StandardBridgeETHBridgeFinalized, error) {
+	event := new(L1StandardBridgeETHBridgeFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHBridgeInitiatedIterator is returned from FilterETHBridgeInitiated and is used to iterate over the raw logs and unpacked data for ETHBridgeInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeInitiatedIterator struct {
+	Event *L1StandardBridgeETHBridgeInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHBridgeInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHBridgeInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHBridgeInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHBridgeInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHBridgeInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHBridgeInitiated represents a ETHBridgeInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeInitiated struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHBridgeInitiated is a free log retrieval operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHBridgeInitiated(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHBridgeInitiatedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHBridgeInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHBridgeInitiatedIterator{contract: _L1StandardBridge.contract, event: "ETHBridgeInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchETHBridgeInitiated is a free log subscription operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHBridgeInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHBridgeInitiated, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHBridgeInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHBridgeInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHBridgeInitiated is a log parse operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHBridgeInitiated(log types.Log) (*L1StandardBridgeETHBridgeInitiated, error) {
+	event := new(L1StandardBridgeETHBridgeInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHDepositInitiatedIterator is returned from FilterETHDepositInitiated and is used to iterate over the raw logs and unpacked data for ETHDepositInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHDepositInitiatedIterator struct {
+	Event *L1StandardBridgeETHDepositInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHDepositInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHDepositInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHDepositInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHDepositInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHDepositInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHDepositInitiated represents a ETHDepositInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHDepositInitiated struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHDepositInitiated is a free log retrieval operation binding the contract event 0x35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23.
+//
+// Solidity: event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHDepositInitiated(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHDepositInitiatedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHDepositInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHDepositInitiatedIterator{contract: _L1StandardBridge.contract, event: "ETHDepositInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchETHDepositInitiated is a free log subscription operation binding the contract event 0x35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23.
+//
+// Solidity: event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHDepositInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHDepositInitiated, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHDepositInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHDepositInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHDepositInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHDepositInitiated is a log parse operation binding the contract event 0x35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23.
+//
+// Solidity: event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHDepositInitiated(log types.Log) (*L1StandardBridgeETHDepositInitiated, error) {
+	event := new(L1StandardBridgeETHDepositInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHDepositInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHWithdrawalFinalizedIterator is returned from FilterETHWithdrawalFinalized and is used to iterate over the raw logs and unpacked data for ETHWithdrawalFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHWithdrawalFinalizedIterator struct {
+	Event *L1StandardBridgeETHWithdrawalFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHWithdrawalFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHWithdrawalFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHWithdrawalFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHWithdrawalFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHWithdrawalFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHWithdrawalFinalized represents a ETHWithdrawalFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHWithdrawalFinalized struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHWithdrawalFinalized is a free log retrieval operation binding the contract event 0x2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631.
+//
+// Solidity: event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHWithdrawalFinalized(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHWithdrawalFinalizedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHWithdrawalFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHWithdrawalFinalizedIterator{contract: _L1StandardBridge.contract, event: "ETHWithdrawalFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchETHWithdrawalFinalized is a free log subscription operation binding the contract event 0x2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631.
+//
+// Solidity: event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHWithdrawalFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHWithdrawalFinalized, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHWithdrawalFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHWithdrawalFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHWithdrawalFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHWithdrawalFinalized is a log parse operation binding the contract event 0x2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631.
+//
+// Solidity: event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHWithdrawalFinalized(log types.Log) (*L1StandardBridgeETHWithdrawalFinalized, error) {
+	event := new(L1StandardBridgeETHWithdrawalFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHWithdrawalFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L1StandardBridge contract.
+type L1StandardBridgeInitializedIterator struct {
+	Event *L1StandardBridgeInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeInitialized represents a Initialized event raised by the L1StandardBridge contract.
+type L1StandardBridgeInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterInitialized(opts *bind.FilterOpts) (*L1StandardBridgeInitializedIterator, error) {
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeInitializedIterator{contract: _L1StandardBridge.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeInitialized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseInitialized(log types.Log) (*L1StandardBridgeInitialized, error) {
+	event := new(L1StandardBridgeInitialized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-chain-ops/crossdomain/bindings/l2crossdomainmessenger.go b/op-chain-ops/crossdomain/bindings/l2crossdomainmessenger.go
new file mode 100644
index 000000000000..169c4a13e712
--- /dev/null
+++ b/op-chain-ops/crossdomain/bindings/l2crossdomainmessenger.go
@@ -0,0 +1,1538 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L2CrossDomainMessengerMetaData contains all meta data concerning the L2CrossDomainMessenger contract.
+var L2CrossDomainMessengerMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MESSAGE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_CALLDATA_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OTHER_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_CALL_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_CONSTANT_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_GAS_CHECK_BUFFER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_RESERVED_GAS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"baseGas\",\"inputs\":[{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"failedMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_l1CrossDomainMessenger\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l1CrossDomainMessenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageNonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"otherMessenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"relayMessage\",\"inputs\":[{\"name\":\"_nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"successfulMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"xDomainMessageSender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"FailedRelayedMessage\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RelayedMessage\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SentMessage\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"messageNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SentMessageExtension1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+	Bin: "",
+}
+
+// L2CrossDomainMessengerABI is the input ABI used to generate the binding from.
+// Deprecated: Use L2CrossDomainMessengerMetaData.ABI instead.
+var L2CrossDomainMessengerABI = L2CrossDomainMessengerMetaData.ABI
+
+// L2CrossDomainMessengerBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L2CrossDomainMessengerMetaData.Bin instead.
+var L2CrossDomainMessengerBin = L2CrossDomainMessengerMetaData.Bin
+
+// DeployL2CrossDomainMessenger deploys a new Ethereum contract, binding an instance of L2CrossDomainMessenger to it.
+func DeployL2CrossDomainMessenger(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L2CrossDomainMessenger, error) {
+	parsed, err := L2CrossDomainMessengerMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2CrossDomainMessengerBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L2CrossDomainMessenger{L2CrossDomainMessengerCaller: L2CrossDomainMessengerCaller{contract: contract}, L2CrossDomainMessengerTransactor: L2CrossDomainMessengerTransactor{contract: contract}, L2CrossDomainMessengerFilterer: L2CrossDomainMessengerFilterer{contract: contract}}, nil
+}
+
+// L2CrossDomainMessenger is an auto generated Go binding around an Ethereum contract.
+type L2CrossDomainMessenger struct {
+	L2CrossDomainMessengerCaller     // Read-only binding to the contract
+	L2CrossDomainMessengerTransactor // Write-only binding to the contract
+	L2CrossDomainMessengerFilterer   // Log filterer for contract events
+}
+
+// L2CrossDomainMessengerCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L2CrossDomainMessengerCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2CrossDomainMessengerTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L2CrossDomainMessengerTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2CrossDomainMessengerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L2CrossDomainMessengerFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2CrossDomainMessengerSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L2CrossDomainMessengerSession struct {
+	Contract     *L2CrossDomainMessenger // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts           // Call options to use throughout this session
+	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
+}
+
+// L2CrossDomainMessengerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L2CrossDomainMessengerCallerSession struct {
+	Contract *L2CrossDomainMessengerCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts                 // Call options to use throughout this session
+}
+
+// L2CrossDomainMessengerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L2CrossDomainMessengerTransactorSession struct {
+	Contract     *L2CrossDomainMessengerTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
+}
+
+// L2CrossDomainMessengerRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L2CrossDomainMessengerRaw struct {
+	Contract *L2CrossDomainMessenger // Generic contract binding to access the raw methods on
+}
+
+// L2CrossDomainMessengerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L2CrossDomainMessengerCallerRaw struct {
+	Contract *L2CrossDomainMessengerCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L2CrossDomainMessengerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L2CrossDomainMessengerTransactorRaw struct {
+	Contract *L2CrossDomainMessengerTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL2CrossDomainMessenger creates a new instance of L2CrossDomainMessenger, bound to a specific deployed contract.
+func NewL2CrossDomainMessenger(address common.Address, backend bind.ContractBackend) (*L2CrossDomainMessenger, error) {
+	contract, err := bindL2CrossDomainMessenger(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessenger{L2CrossDomainMessengerCaller: L2CrossDomainMessengerCaller{contract: contract}, L2CrossDomainMessengerTransactor: L2CrossDomainMessengerTransactor{contract: contract}, L2CrossDomainMessengerFilterer: L2CrossDomainMessengerFilterer{contract: contract}}, nil
+}
+
+// NewL2CrossDomainMessengerCaller creates a new read-only instance of L2CrossDomainMessenger, bound to a specific deployed contract.
+func NewL2CrossDomainMessengerCaller(address common.Address, caller bind.ContractCaller) (*L2CrossDomainMessengerCaller, error) {
+	contract, err := bindL2CrossDomainMessenger(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerCaller{contract: contract}, nil
+}
+
+// NewL2CrossDomainMessengerTransactor creates a new write-only instance of L2CrossDomainMessenger, bound to a specific deployed contract.
+func NewL2CrossDomainMessengerTransactor(address common.Address, transactor bind.ContractTransactor) (*L2CrossDomainMessengerTransactor, error) {
+	contract, err := bindL2CrossDomainMessenger(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerTransactor{contract: contract}, nil
+}
+
+// NewL2CrossDomainMessengerFilterer creates a new log filterer instance of L2CrossDomainMessenger, bound to a specific deployed contract.
+func NewL2CrossDomainMessengerFilterer(address common.Address, filterer bind.ContractFilterer) (*L2CrossDomainMessengerFilterer, error) {
+	contract, err := bindL2CrossDomainMessenger(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerFilterer{contract: contract}, nil
+}
+
+// bindL2CrossDomainMessenger binds a generic wrapper to an already deployed contract.
+func bindL2CrossDomainMessenger(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L2CrossDomainMessengerABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2CrossDomainMessenger.Contract.L2CrossDomainMessengerCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.L2CrossDomainMessengerTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.L2CrossDomainMessengerTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2CrossDomainMessenger.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) MESSAGEVERSION(opts *bind.CallOpts) (uint16, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "MESSAGE_VERSION")
+
+	if err != nil {
+		return *new(uint16), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
+
+	return out0, err
+
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) MESSAGEVERSION() (uint16, error) {
+	return _L2CrossDomainMessenger.Contract.MESSAGEVERSION(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) MESSAGEVERSION() (uint16, error) {
+	return _L2CrossDomainMessenger.Contract.MESSAGEVERSION(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) MINGASCALLDATAOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_CALLDATA_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADDENOMINATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADNUMERATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) OTHERMESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "OTHER_MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) OTHERMESSENGER() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.OTHERMESSENGER(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) OTHERMESSENGER() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.OTHERMESSENGER(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) RELAYCALLOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CALL_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) RELAYCONSTANTOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CONSTANT_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) RELAYGASCHECKBUFFER(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "RELAY_GAS_CHECK_BUFFER")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) RELAYRESERVEDGAS(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "RELAY_RESERVED_GAS")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) BaseGas(opts *bind.CallOpts, _message []byte, _minGasLimit uint32) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "baseGas", _message, _minGasLimit)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.BaseGas(&_L2CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.BaseGas(&_L2CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) FailedMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "failedMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _L2CrossDomainMessenger.Contract.FailedMessages(&_L2CrossDomainMessenger.CallOpts, arg0)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _L2CrossDomainMessenger.Contract.FailedMessages(&_L2CrossDomainMessenger.CallOpts, arg0)
+}
+
+// L1CrossDomainMessenger is a free data retrieval call binding the contract method 0xa7119869.
+//
+// Solidity: function l1CrossDomainMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) L1CrossDomainMessenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "l1CrossDomainMessenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L1CrossDomainMessenger is a free data retrieval call binding the contract method 0xa7119869.
+//
+// Solidity: function l1CrossDomainMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) L1CrossDomainMessenger() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.L1CrossDomainMessenger(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// L1CrossDomainMessenger is a free data retrieval call binding the contract method 0xa7119869.
+//
+// Solidity: function l1CrossDomainMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) L1CrossDomainMessenger() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.L1CrossDomainMessenger(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) MessageNonce(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "messageNonce")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) MessageNonce() (*big.Int, error) {
+	return _L2CrossDomainMessenger.Contract.MessageNonce(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) MessageNonce() (*big.Int, error) {
+	return _L2CrossDomainMessenger.Contract.MessageNonce(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) OtherMessenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "otherMessenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) OtherMessenger() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.OtherMessenger(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) OtherMessenger() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.OtherMessenger(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) Paused() (bool, error) {
+	return _L2CrossDomainMessenger.Contract.Paused(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) Paused() (bool, error) {
+	return _L2CrossDomainMessenger.Contract.Paused(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) SuccessfulMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "successfulMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _L2CrossDomainMessenger.Contract.SuccessfulMessages(&_L2CrossDomainMessenger.CallOpts, arg0)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _L2CrossDomainMessenger.Contract.SuccessfulMessages(&_L2CrossDomainMessenger.CallOpts, arg0)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) Version() (string, error) {
+	return _L2CrossDomainMessenger.Contract.Version(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) Version() (string, error) {
+	return _L2CrossDomainMessenger.Contract.Version(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) XDomainMessageSender(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "xDomainMessageSender")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) XDomainMessageSender() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.XDomainMessageSender(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) XDomainMessageSender() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.XDomainMessageSender(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _l1CrossDomainMessenger) returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactor) Initialize(opts *bind.TransactOpts, _l1CrossDomainMessenger common.Address) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.contract.Transact(opts, "initialize", _l1CrossDomainMessenger)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _l1CrossDomainMessenger) returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) Initialize(_l1CrossDomainMessenger common.Address) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.Initialize(&_L2CrossDomainMessenger.TransactOpts, _l1CrossDomainMessenger)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _l1CrossDomainMessenger) returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactorSession) Initialize(_l1CrossDomainMessenger common.Address) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.Initialize(&_L2CrossDomainMessenger.TransactOpts, _l1CrossDomainMessenger)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactor) RelayMessage(opts *bind.TransactOpts, _nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.contract.Transact(opts, "relayMessage", _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.RelayMessage(&_L2CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactorSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.RelayMessage(&_L2CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactor) SendMessage(opts *bind.TransactOpts, _target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.contract.Transact(opts, "sendMessage", _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.SendMessage(&_L2CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactorSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.SendMessage(&_L2CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// L2CrossDomainMessengerFailedRelayedMessageIterator is returned from FilterFailedRelayedMessage and is used to iterate over the raw logs and unpacked data for FailedRelayedMessage events raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerFailedRelayedMessageIterator struct {
+	Event *L2CrossDomainMessengerFailedRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2CrossDomainMessengerFailedRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2CrossDomainMessengerFailedRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2CrossDomainMessengerFailedRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2CrossDomainMessengerFailedRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2CrossDomainMessengerFailedRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2CrossDomainMessengerFailedRelayedMessage represents a FailedRelayedMessage event raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerFailedRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterFailedRelayedMessage is a free log retrieval operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) FilterFailedRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L2CrossDomainMessengerFailedRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.FilterLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerFailedRelayedMessageIterator{contract: _L2CrossDomainMessenger.contract, event: "FailedRelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchFailedRelayedMessage is a free log subscription operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) WatchFailedRelayedMessage(opts *bind.WatchOpts, sink chan<- *L2CrossDomainMessengerFailedRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.WatchLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2CrossDomainMessengerFailedRelayedMessage)
+				if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseFailedRelayedMessage is a log parse operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) ParseFailedRelayedMessage(log types.Log) (*L2CrossDomainMessengerFailedRelayedMessage, error) {
+	event := new(L2CrossDomainMessengerFailedRelayedMessage)
+	if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2CrossDomainMessengerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerInitializedIterator struct {
+	Event *L2CrossDomainMessengerInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2CrossDomainMessengerInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2CrossDomainMessengerInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2CrossDomainMessengerInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2CrossDomainMessengerInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2CrossDomainMessengerInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2CrossDomainMessengerInitialized represents a Initialized event raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) FilterInitialized(opts *bind.FilterOpts) (*L2CrossDomainMessengerInitializedIterator, error) {
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerInitializedIterator{contract: _L2CrossDomainMessenger.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L2CrossDomainMessengerInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2CrossDomainMessengerInitialized)
+				if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) ParseInitialized(log types.Log) (*L2CrossDomainMessengerInitialized, error) {
+	event := new(L2CrossDomainMessengerInitialized)
+	if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2CrossDomainMessengerRelayedMessageIterator is returned from FilterRelayedMessage and is used to iterate over the raw logs and unpacked data for RelayedMessage events raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerRelayedMessageIterator struct {
+	Event *L2CrossDomainMessengerRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2CrossDomainMessengerRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2CrossDomainMessengerRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2CrossDomainMessengerRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2CrossDomainMessengerRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2CrossDomainMessengerRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2CrossDomainMessengerRelayedMessage represents a RelayedMessage event raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterRelayedMessage is a free log retrieval operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) FilterRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L2CrossDomainMessengerRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.FilterLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerRelayedMessageIterator{contract: _L2CrossDomainMessenger.contract, event: "RelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchRelayedMessage is a free log subscription operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) WatchRelayedMessage(opts *bind.WatchOpts, sink chan<- *L2CrossDomainMessengerRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.WatchLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2CrossDomainMessengerRelayedMessage)
+				if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseRelayedMessage is a log parse operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) ParseRelayedMessage(log types.Log) (*L2CrossDomainMessengerRelayedMessage, error) {
+	event := new(L2CrossDomainMessengerRelayedMessage)
+	if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2CrossDomainMessengerSentMessageIterator is returned from FilterSentMessage and is used to iterate over the raw logs and unpacked data for SentMessage events raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerSentMessageIterator struct {
+	Event *L2CrossDomainMessengerSentMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2CrossDomainMessengerSentMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2CrossDomainMessengerSentMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2CrossDomainMessengerSentMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2CrossDomainMessengerSentMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2CrossDomainMessengerSentMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2CrossDomainMessengerSentMessage represents a SentMessage event raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerSentMessage struct {
+	Target       common.Address
+	Sender       common.Address
+	Message      []byte
+	MessageNonce *big.Int
+	GasLimit     *big.Int
+	Raw          types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessage is a free log retrieval operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) FilterSentMessage(opts *bind.FilterOpts, target []common.Address) (*L2CrossDomainMessengerSentMessageIterator, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.FilterLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerSentMessageIterator{contract: _L2CrossDomainMessenger.contract, event: "SentMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessage is a free log subscription operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) WatchSentMessage(opts *bind.WatchOpts, sink chan<- *L2CrossDomainMessengerSentMessage, target []common.Address) (event.Subscription, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.WatchLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2CrossDomainMessengerSentMessage)
+				if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessage is a log parse operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) ParseSentMessage(log types.Log) (*L2CrossDomainMessengerSentMessage, error) {
+	event := new(L2CrossDomainMessengerSentMessage)
+	if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2CrossDomainMessengerSentMessageExtension1Iterator is returned from FilterSentMessageExtension1 and is used to iterate over the raw logs and unpacked data for SentMessageExtension1 events raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerSentMessageExtension1Iterator struct {
+	Event *L2CrossDomainMessengerSentMessageExtension1 // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2CrossDomainMessengerSentMessageExtension1Iterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2CrossDomainMessengerSentMessageExtension1)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2CrossDomainMessengerSentMessageExtension1)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2CrossDomainMessengerSentMessageExtension1Iterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2CrossDomainMessengerSentMessageExtension1Iterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2CrossDomainMessengerSentMessageExtension1 represents a SentMessageExtension1 event raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerSentMessageExtension1 struct {
+	Sender common.Address
+	Value  *big.Int
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessageExtension1 is a free log retrieval operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) FilterSentMessageExtension1(opts *bind.FilterOpts, sender []common.Address) (*L2CrossDomainMessengerSentMessageExtension1Iterator, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.FilterLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerSentMessageExtension1Iterator{contract: _L2CrossDomainMessenger.contract, event: "SentMessageExtension1", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessageExtension1 is a free log subscription operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) WatchSentMessageExtension1(opts *bind.WatchOpts, sink chan<- *L2CrossDomainMessengerSentMessageExtension1, sender []common.Address) (event.Subscription, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.WatchLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2CrossDomainMessengerSentMessageExtension1)
+				if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessageExtension1 is a log parse operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) ParseSentMessageExtension1(log types.Log) (*L2CrossDomainMessengerSentMessageExtension1, error) {
+	event := new(L2CrossDomainMessengerSentMessageExtension1)
+	if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-chain-ops/crossdomain/doc.go b/op-chain-ops/crossdomain/doc.go
new file mode 100644
index 000000000000..c23a8e51a8a6
--- /dev/null
+++ b/op-chain-ops/crossdomain/doc.go
@@ -0,0 +1,9 @@
+// Package crossdomain provides libraries useful for
+// managing L1 <> L2 cross domain communication. This
+// library is very low level and most users will not
+// these abstractions directly. They were used for
+// the migration to Bedrock from the legacy Optimism
+// system. The bindings subpackage will never need
+// to be updated as they are only used for the migration
+// tooling.
+package crossdomain
diff --git a/op-chain-ops/crossdomain/legacy_withdrawal.go b/op-chain-ops/crossdomain/legacy_withdrawal.go
index ac2ec3602867..a70d12deecd9 100644
--- a/op-chain-ops/crossdomain/legacy_withdrawal.go
+++ b/op-chain-ops/crossdomain/legacy_withdrawal.go
@@ -6,8 +6,8 @@ import (
 	"fmt"
 	"math/big"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain/bindings"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/accounts/abi"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
diff --git a/op-chain-ops/crossdomain/legacy_withdrawal_test.go b/op-chain-ops/crossdomain/legacy_withdrawal_test.go
index 72bd27583d5f..3402835d23c7 100644
--- a/op-chain-ops/crossdomain/legacy_withdrawal_test.go
+++ b/op-chain-ops/crossdomain/legacy_withdrawal_test.go
@@ -9,9 +9,9 @@ import (
 	"strings"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
+	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain/bindings"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/stretchr/testify/require"
 
 	"github.com/ethereum/go-ethereum/accounts/abi"
@@ -201,7 +201,7 @@ func findPassMessage(trace *callFrame) *callFrame {
 
 // findCrossDomainMessage will parse a CrossDomainMessage from a receipt
 func findCrossDomainMessage(receipt *types.Receipt) (*crossdomain.CrossDomainMessage, error) {
-	backend := backends.NewSimulatedBackend(nil, 15000000)
+	backend := backends.NewSimulatedBackend(nil, 15000000) // nolint:staticcheck
 	l2xdm, err := bindings.NewL2CrossDomainMessenger(predeploys.L2CrossDomainMessengerAddr, backend)
 	if err != nil {
 		return nil, err
diff --git a/op-chain-ops/crossdomain/migrate.go b/op-chain-ops/crossdomain/migrate.go
index b484e2685602..e542db2c4ecc 100644
--- a/op-chain-ops/crossdomain/migrate.go
+++ b/op-chain-ops/crossdomain/migrate.go
@@ -4,8 +4,8 @@ import (
 	"fmt"
 	"math/big"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain/bindings"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/params"
diff --git a/op-chain-ops/crossdomain/migrate_test.go b/op-chain-ops/crossdomain/migrate_test.go
index deac179ef055..362b129246e0 100644
--- a/op-chain-ops/crossdomain/migrate_test.go
+++ b/op-chain-ops/crossdomain/migrate_test.go
@@ -5,8 +5,8 @@ import (
 	"math/big"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/common"
 
 	"github.com/stretchr/testify/require"
diff --git a/op-chain-ops/crossdomain/withdrawal.go b/op-chain-ops/crossdomain/withdrawal.go
index bd7358768475..6aa038138d9f 100644
--- a/op-chain-ops/crossdomain/withdrawal.go
+++ b/op-chain-ops/crossdomain/withdrawal.go
@@ -5,7 +5,7 @@ import (
 	"fmt"
 	"math/big"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-node/bindings"
 	"github.com/ethereum/go-ethereum/accounts/abi"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
diff --git a/op-chain-ops/deployer/deployer.go b/op-chain-ops/deployer/deployer.go
deleted file mode 100644
index 429bf6470723..000000000000
--- a/op-chain-ops/deployer/deployer.go
+++ /dev/null
@@ -1,268 +0,0 @@
-package deployer
-
-import (
-	"context"
-	"errors"
-	"fmt"
-	"math/big"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum/go-ethereum/accounts/abi/bind"
-	"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/common/hexutil"
-	"github.com/ethereum/go-ethereum/consensus/beacon"
-	"github.com/ethereum/go-ethereum/consensus/ethash"
-	"github.com/ethereum/go-ethereum/core"
-	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/crypto"
-	"github.com/ethereum/go-ethereum/params"
-)
-
-// TestKey is the same test key that geth uses
-var TestKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
-
-// ChainID is the chain id used for simulated backends
-var ChainID = big.NewInt(1337)
-
-var TestAddress = crypto.PubkeyToAddress(TestKey.PublicKey)
-
-var thousandETH = new(big.Int).Mul(big.NewInt(params.Ether), big.NewInt(1000))
-
-type Constructor struct {
-	Name string
-	Args []interface{}
-}
-
-type SuperchainPredeploy struct {
-	Name     string
-	CodeHash common.Hash
-}
-
-type Deployment struct {
-	Name     string
-	Bytecode hexutil.Bytes
-	Address  common.Address
-}
-
-type Deployer func(*backends.SimulatedBackend, *bind.TransactOpts, Constructor) (*types.Transaction, error)
-
-// NewL1Backend returns a SimulatedBackend suitable for L1. It has
-// the latest L1 hardforks enabled.
-func NewL1Backend() (*backends.SimulatedBackend, error) {
-	backend, err := NewBackendWithGenesisTimestamp(ChainID, 0, true, nil)
-	return backend, err
-}
-
-// NewL2Backend returns a SimulatedBackend suitable for L2.
-// It has the latest L2 hardforks enabled.
-func NewL2Backend() (*backends.SimulatedBackend, error) {
-	backend, err := NewBackendWithGenesisTimestamp(ChainID, 0, false, nil)
-	return backend, err
-}
-
-// NewL2BackendWithChainIDAndPredeploys returns a SimulatedBackend suitable for L2.
-// It has the latest L2 hardforks enabled, and allows for the configuration of the network's chain ID and predeploys.
-func NewL2BackendWithChainIDAndPredeploys(chainID *big.Int, predeploys map[string]*common.Address) (*backends.SimulatedBackend, error) {
-	backend, err := NewBackendWithGenesisTimestamp(chainID, 0, false, predeploys)
-	return backend, err
-}
-
-func NewBackendWithGenesisTimestamp(chainID *big.Int, ts uint64, shanghai bool, predeploys map[string]*common.Address) (*backends.SimulatedBackend, error) {
-	chainConfig := params.ChainConfig{
-		ChainID:             chainID,
-		HomesteadBlock:      big.NewInt(0),
-		DAOForkBlock:        nil,
-		DAOForkSupport:      false,
-		EIP150Block:         big.NewInt(0),
-		EIP155Block:         big.NewInt(0),
-		EIP158Block:         big.NewInt(0),
-		ByzantiumBlock:      big.NewInt(0),
-		ConstantinopleBlock: big.NewInt(0),
-		PetersburgBlock:     big.NewInt(0),
-		IstanbulBlock:       big.NewInt(0),
-		MuirGlacierBlock:    big.NewInt(0),
-		BerlinBlock:         big.NewInt(0),
-		LondonBlock:         big.NewInt(0),
-		ArrowGlacierBlock:   big.NewInt(0),
-		GrayGlacierBlock:    big.NewInt(0),
-		// Activated proof of stake. We manually build/commit blocks in the simulator anyway,
-		// and the timestamp verification of PoS is not against the wallclock,
-		// preventing blocks from getting stuck temporarily in the future-blocks queue, decreasing setup time a lot.
-		MergeNetsplitBlock:            big.NewInt(0),
-		TerminalTotalDifficulty:       big.NewInt(0),
-		TerminalTotalDifficultyPassed: true,
-	}
-
-	if shanghai {
-		chainConfig.ShanghaiTime = u64ptr(0)
-	}
-
-	alloc := core.GenesisAlloc{
-		crypto.PubkeyToAddress(TestKey.PublicKey): core.GenesisAccount{
-			Balance: thousandETH,
-		},
-	}
-	for name, address := range predeploys {
-		bytecode, err := bindings.GetDeployedBytecode(name)
-		if err != nil {
-			return nil, err
-		}
-		alloc[*address] = core.GenesisAccount{
-			Code: bytecode,
-		}
-	}
-
-	return backends.NewSimulatedBackendWithOpts(
-		backends.WithCacheConfig(&core.CacheConfig{
-			Preimages: true,
-		}),
-		backends.WithGenesis(core.Genesis{
-			Config:     &chainConfig,
-			Timestamp:  ts,
-			Difficulty: big.NewInt(0),
-			Alloc:      alloc,
-			GasLimit:   30_000_000,
-		}),
-		backends.WithConsensus(beacon.New(ethash.NewFaker())),
-	), nil
-}
-
-func Deploy(backend *backends.SimulatedBackend, constructors []Constructor, cb Deployer) ([]Deployment, error) {
-	results := make([]Deployment, len(constructors))
-
-	opts, err := bind.NewKeyedTransactorWithChainID(TestKey, ChainID)
-	if err != nil {
-		return nil, err
-	}
-
-	opts.GasLimit = 15_000_000
-
-	ctx := context.Background()
-	for i, deployment := range constructors {
-		tx, err := cb(backend, opts, deployment)
-		if err != nil {
-			return nil, err
-		}
-
-		// The simulator performs asynchronous processing,
-		// so we need to both commit the change here as
-		// well as wait for the transaction receipt.
-		backend.Commit()
-		addr, err := bind.WaitDeployed(ctx, backend, tx)
-		if err != nil {
-			return nil, fmt.Errorf("%s: %w", deployment.Name, err)
-		}
-
-		if addr == (common.Address{}) {
-			return nil, fmt.Errorf("no address for %s", deployment.Name)
-		}
-		code, err := backend.CodeAt(context.Background(), addr, nil)
-		if len(code) == 0 {
-			return nil, fmt.Errorf("no code found for %s", deployment.Name)
-		}
-		if err != nil {
-			return nil, fmt.Errorf("cannot fetch code for %s", deployment.Name)
-		}
-		results[i] = Deployment{
-			Name:     deployment.Name,
-			Bytecode: code,
-			Address:  addr,
-		}
-	}
-
-	return results, nil
-}
-
-// DeployWithDeterministicDeployer deploys a smart contract on a simulated Ethereum blockchain using a deterministic deployment proxy (Arachnid's).
-//
-// Parameters:
-// - backend: A pointer to backends.SimulatedBackend, representing the simulated Ethereum blockchain.
-// Expected to have Arachnid's proxy deployer predeploys at 0x4e59b44847b379578588920cA78FbF26c0B4956C, NewL2BackendWithChainIDAndPredeploys handles this for you.
-// - contractName: A string representing the name of the contract to be deployed.
-//
-// Returns:
-// - []byte: The deployed bytecode of the contract.
-// - error: An error object indicating any issues encountered during the deployment process.
-//
-// The function logs a fatal error and exits if there are any issues with transaction mining, if the deployment fails,
-// or if the deployed bytecode is not found at the computed address.
-func DeployWithDeterministicDeployer(backend *backends.SimulatedBackend, contractName string) ([]byte, error) {
-	opts, err := bind.NewKeyedTransactorWithChainID(TestKey, backend.Blockchain().Config().ChainID)
-	if err != nil {
-		return nil, err
-	}
-
-	deployerAddress, err := bindings.GetDeployerAddress(contractName)
-	if err != nil {
-		return nil, err
-	}
-
-	deploymentSalt, err := bindings.GetDeploymentSalt(contractName)
-	if err != nil {
-		return nil, err
-	}
-
-	initBytecode, err := bindings.GetInitBytecode(contractName)
-	if err != nil {
-		return nil, err
-	}
-
-	transactor, err := bindings.NewDeterministicDeploymentProxyTransactor(common.BytesToAddress(deployerAddress), backend)
-	if err != nil {
-		return nil, fmt.Errorf("failed to initialize deployment proxy transactor at %s: %w", deployerAddress, err)
-	}
-
-	tx, err := transactor.Fallback(opts, append(deploymentSalt, initBytecode...))
-	if err != nil {
-		return nil, err
-	}
-
-	backend.Commit()
-
-	receipt, err := bind.WaitMined(context.Background(), backend, tx)
-	if err != nil {
-		return nil, fmt.Errorf("failed to get transaction receipt: %w", err)
-	}
-	if receipt.Status == 0 {
-		return nil, errors.New("failed to deploy contract using proxy deployer")
-	}
-
-	address := create2Address(
-		deployerAddress,
-		deploymentSalt,
-		initBytecode,
-	)
-
-	code, _ := backend.CodeAt(context.Background(), address, nil)
-	if len(code) == 0 {
-		return nil, fmt.Errorf("no code found for %s at: %s", contractName, address)
-	}
-
-	return code, nil
-}
-
-func u64ptr(n uint64) *uint64 {
-	return &n
-}
-
-// create2Address computes the Ethereum address for a contract created using the CREATE2 opcode.
-//
-// The CREATE2 opcode allows for more deterministic address generation in Ethereum, as it computes the
-// address based on the creator's address, a salt value, and the contract's initialization code.
-//
-// Parameters:
-// - creatorAddress: A byte slice representing the address of the account creating the contract.
-// - salt: A byte slice representing the salt used in the address generation process. This can be any 32-byte value.
-// - initCode: A byte slice representing the contract's initialization bytecode.
-//
-// Returns:
-// - common.Address: The Ethereum address calculated using the CREATE2 opcode logic.
-func create2Address(creatorAddress, salt, initCode []byte) common.Address {
-	payload := append([]byte{0xff}, creatorAddress...)
-	payload = append(payload, salt...)
-	initCodeHash := crypto.Keccak256(initCode)
-	payload = append(payload, initCodeHash...)
-
-	return common.BytesToAddress(crypto.Keccak256(payload)[12:])
-}
diff --git a/op-chain-ops/deployer/deployer_test.go b/op-chain-ops/deployer/deployer_test.go
deleted file mode 100644
index 0c937a768f9b..000000000000
--- a/op-chain-ops/deployer/deployer_test.go
+++ /dev/null
@@ -1,62 +0,0 @@
-package deployer
-
-import (
-	"testing"
-
-	"github.com/ethereum/go-ethereum/common"
-)
-
-func TestCreate2Address(t *testing.T) {
-	tests := []struct {
-		name            string
-		creatorAddress  []byte
-		salt            []byte
-		initCode        []byte
-		expectedAddress common.Address
-	}{
-		{
-			name:            "SafeL2",
-			creatorAddress:  common.HexToAddress("0x4e59b44847b379578588920cA78FbF26c0B4956C").Bytes(),
-			salt:            common.FromHex("0000000000000000000000000000000000000000000000000000000000000000"),
-			expectedAddress: common.HexToAddress("0x3E5c63644E683549055b9Be8653de26E0B4CD36E"),
-		},
-		{
-			name:            "MultiSendCallOnly",
-			creatorAddress:  common.HexToAddress("0x4e59b44847b379578588920cA78FbF26c0B4956C").Bytes(),
-			salt:            common.FromHex("0000000000000000000000000000000000000000000000000000000000000000"),
-			expectedAddress: common.HexToAddress("0x40A2aCCbd92BCA938b02010E17A5b8929b49130D"),
-		},
-		{
-			name:            "MultiSend",
-			creatorAddress:  common.HexToAddress("0x4e59b44847b379578588920cA78FbF26c0B4956C").Bytes(),
-			salt:            common.FromHex("0000000000000000000000000000000000000000000000000000000000000000"),
-			expectedAddress: common.HexToAddress("0xA238CBeb142c10Ef7Ad8442C6D1f9E89e07e7761"),
-		},
-		{
-			name:            "Permit2",
-			creatorAddress:  common.HexToAddress("0x4e59b44847b379578588920cA78FbF26c0B4956C").Bytes(),
-			salt:            common.FromHex("0000000000000000000000000000000000000000d3af2663da51c10215000000"),
-			expectedAddress: common.HexToAddress("0x000000000022D473030F116dDEE9F6B43aC78BA3"),
-		},
-		{
-			name:            "EntryPoint",
-			creatorAddress:  common.HexToAddress("0x4e59b44847b379578588920cA78FbF26c0B4956C").Bytes(),
-			salt:            common.FromHex("0000000000000000000000000000000000000000000000000000000000000000"),
-			expectedAddress: common.HexToAddress("0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"),
-		},
-	}
-
-	for _, test := range tests {
-		var err error
-		test.initCode, err = getInitCode(test.name)
-		if err != nil {
-			t.Error(err)
-		}
-
-		t.Run(test.name, func(t *testing.T) {
-			if got := create2Address(test.creatorAddress, test.salt, test.initCode); got != test.expectedAddress {
-				t.Errorf("expected: %x, want: %x", got, test.expectedAddress)
-			}
-		})
-	}
-}
diff --git a/op-chain-ops/deployer/testdata.go b/op-chain-ops/deployer/testdata.go
deleted file mode 100644
index c7b802a139dc..000000000000
--- a/op-chain-ops/deployer/testdata.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package deployer
-
-import (
-	"fmt"
-
-	"github.com/ethereum/go-ethereum/common"
-)
-
-func getInitCode(contractName string) ([]byte, error) {
-	switch contractName {
-	case "SafeL2":
-		return common.FromHex("608060405234801561001057600080fd5b506001600481905550615cf880620000296000396000f3fe6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506126fc565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b810190808035906020019092919080359060200190929190505050612732565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b81019080803590602001909291905050506127b9565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d1565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612b63565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c9d565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612edc565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612f01565b005b348015610d3457600080fd5b50610d3d612f90565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613139565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061313f565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613161565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff16906020019092919050505061331f565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613447565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613639565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506137d8565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613805565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b96565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c1a565b005b34801561148957600080fd5b5061149261428c565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614296565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061443e565b005b3480156116a457600080fd5b506116ad61449f565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061451d565b005b34801561174a57600080fd5b50611753614950565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614989565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612b63565b5b5050565b611bd2604182614a2c90919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614a66565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614a2c90919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614a9590919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614a9590919063ffffffff16565b614a9590919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b60007fb648d3644f584ed1c2232d53c46d87e693586486ad0d1175f8656013110b714e3386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183600181111561266b57fe5b8152602001828103825284818151815260200191508051906020019080838360005b838110156126a857808201518184015260208101905061268d565b50505050905090810190601f1680156126d55780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a16126f285858585614ab4565b9050949350505050565b6000606061270c868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561275057600080fd5b506040519080825280601f01601f1916602001820160405280156127835781602001600182028036833780820191505090505b50905060005b838110156127ae57808501548060208302602085010152508080600101915050612789565b508091505092915050565b60076020528060005260406000206000915090505481565b6127d9614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128435750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6128b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612b6b614989565b600354811115612be3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612c5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000606060055433600454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405160208183030381529060405290507f66753cd2356569ee081232e3be8909b950e0a76c1f8460c3a5e3c2be32b11bed8d8d8d8d8d8d8d8d8d8d8d8c604051808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612d5057fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200184810384528e8e82818152602001925080828437600081840152601f19601f820116905080830192505050848103835286818151815260200191508051906020019080838360005b83811015612e0a578082015181840152602081019050612def565b50505050905090810190601f168015612e375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612e70578082015181840152602081019050612e55565b50505050905090810190601f168015612e9d5780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390a1612eca8d8d8d8d8d8d8d8d8d8d8d614c9a565b9150509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612f7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612f8a84848484611bbe565b50505050565b6060600060035467ffffffffffffffff81118015612fad57600080fd5b50604051908082528060200260200182016040528015612fdc5781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613130578083838151811061308757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050613046565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6131ac8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050896151d7565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131ea576131e9846156d7565b5b6132388787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615706565b60008211156132525761325082600060018685615941565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a9050613376878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615b47565b61337f57600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561340c5780820151818401526020810190506133f1565b50505050905090810190601f1680156134395780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561346257600080fd5b506040519080825280602002602001820160405280156134915781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135645750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561356f57508482105b1561362a578084838151811061358157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506134fa565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006137ed8c8c8c8c8c8c8c8c8c8c8c614296565b8051906020012090509b9a5050505050505050505050565b61380d614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156138775750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6138e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613b9e614989565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613c22614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c8c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613cc457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613d36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613ea15750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614013576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561432757fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6143b361449f565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b614446614989565b61444f816156d7565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6144cd6125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b614525614989565b8060016003540310156145a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561460a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61467c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461477c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1806004541461494b5761494a81612b63565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614a3f5760009050614a60565b6000828402905082848281614a5057fe5b0414614a5b57600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614aaa57600080fd5b8091505092915050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015614b7f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b614bf1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b614bfe858585855a615b47565b90508015614c4e573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2614c92565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000806000614cb48e8e8e8e8e8e8e8e8e8e600554614296565b905060056000815480929190600101919050555080805190602001209150614cdd828286612f01565b506000614ce8615b93565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614ece578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115614d8b57fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015614e5d578082015181840152602081019050614e42565b50505050905090810190601f168015614e8a5780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015614eb557600080fd5b505af1158015614ec9573d6000803e3d6000fd5b505050505b6101f4614ef56109c48b01603f60408d0281614ee657fe5b04615bc490919063ffffffff16565b015a1015614f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a9050614fd48f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d14614fc9578e614fcf565b6109c45a035b615b47565b9350614fe95a82615bde90919063ffffffff16565b90508380614ff8575060008a14155b80615004575060008814155b615076576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156150905761508d828b8b8b8b615941565b90505b84156150da577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a161511a565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146151c6578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156151ad57600080fd5b505af11580156151c1573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b60006004541461524f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81518111156152c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600181101561533d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b835181101561564357600084828151811061535d57fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153d15750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561540957503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561544157508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b6154b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550809250508080600101915050615346565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461593d576158ca8260008360015a615b47565b61593c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461597e5782615980565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615a98576159ea3a86106159c7573a6159c9565b855b6159dc888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615b3d565b615abd85615aaf888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b9150615aca848284615bfe565b615b3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600180811115615b5557fe5b836001811115615b6157fe5b1415615b7a576000808551602087018986f49050615b8a565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015615bd45781615bd6565b825b905092915050565b600082821115615bed57600080fd5b600082840390508091505092915050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615ca55760208114615cad5760009350615cb8565b819350615cb8565b600051158215171593505b505050939250505056fea2646970667358221220047fac33099ca576d1c4f1ac6a8abdb0396e42ad6a397d2cb2f4dc1624cc0c5b64736f6c63430007060033"), nil
-	case "MultiSendCallOnly":
-		return common.FromHex("608060405234801561001057600080fd5b5061019a806100206000396000f3fe60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b805160205b8181101561015f578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811461012857600181146101385761013d565b6000808585888a5af1915061013d565b600080fd5b50600081141561014c57600080fd5b82605501870196505050505050506100e3565b50505056fea264697066735822122035246402746c96964495cae5b36461fd44dfb89f8e6cf6f6b8d60c0aa89f414864736f6c63430007060033"), nil
-	case "MultiSend":
-		return common.FromHex("60a060405234801561001057600080fd5b503073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060805160601c6102756100646000398060e052506102756000f3fe60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610183576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806102106030913960400191505060405180910390fd5b805160205b8181101561020a578083015160f81c6001820184015160601c6015830185015160358401860151605585018701600085600081146101cd57600181146101dd576101e8565b6000808585888a5af191506101e8565b6000808585895af491505b5060008114156101f757600080fd5b8260550187019650505050505050610188565b50505056fe4d756c746953656e642073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca26469706673582212205c784303626eec02b71940b551976170b500a8a36cc5adcbeb2c19751a76d05464736f6c63430007060033"), nil
-	case "Permit2":
-		return common.FromHex("60c0346100bb574660a052602081017f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a60408301524660608301523060808301526080825260a082019180831060018060401b038411176100a557826040525190206080526123c090816100c1823960805181611b47015260a05181611b210152f35b634e487b7160e01b600052604160045260246000fd5b600080fdfe6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000000003611b69577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a"), nil
-	case "EntryPoint":
-		return common.FromHex("60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033"), nil
-	default:
-		return nil, fmt.Errorf("no initialization byte code available for contract: %s", contractName)
-	}
-}
diff --git a/op-bindings/etherscan/client.go b/op-chain-ops/etherscan/client.go
similarity index 100%
rename from op-bindings/etherscan/client.go
rename to op-chain-ops/etherscan/client.go
diff --git a/op-chain-ops/foundry/artifact.go b/op-chain-ops/foundry/artifact.go
new file mode 100644
index 000000000000..93791ef806d0
--- /dev/null
+++ b/op-chain-ops/foundry/artifact.go
@@ -0,0 +1,88 @@
+package foundry
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"strings"
+
+	"github.com/ethereum-optimism/optimism/op-chain-ops/solc"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+)
+
+// Artifact represents a foundry compilation artifact.
+// JSON marshaling logic is implemented to maintain the ability
+// to roundtrip serialize an artifact
+type Artifact struct {
+	ABI              abi.ABI
+	abi              json.RawMessage
+	StorageLayout    solc.StorageLayout
+	DeployedBytecode DeployedBytecode
+	Bytecode         Bytecode
+}
+
+func (a *Artifact) UnmarshalJSON(data []byte) error {
+	artifact := artifactMarshaling{}
+	if err := json.Unmarshal(data, &artifact); err != nil {
+		return err
+	}
+	parsed, err := abi.JSON(strings.NewReader(string(artifact.ABI)))
+	if err != nil {
+		return err
+	}
+	a.ABI = parsed
+	a.abi = artifact.ABI
+	a.StorageLayout = artifact.StorageLayout
+	a.DeployedBytecode = artifact.DeployedBytecode
+	a.Bytecode = artifact.Bytecode
+	return nil
+}
+
+func (a Artifact) MarshalJSON() ([]byte, error) {
+	artifact := artifactMarshaling{
+		ABI:              a.abi,
+		StorageLayout:    a.StorageLayout,
+		DeployedBytecode: a.DeployedBytecode,
+		Bytecode:         a.Bytecode,
+	}
+	return json.Marshal(artifact)
+}
+
+// artifactMarshaling is a helper struct for marshaling and unmarshaling
+// foundry artifacts.
+type artifactMarshaling struct {
+	ABI              json.RawMessage    `json:"abi"`
+	StorageLayout    solc.StorageLayout `json:"storageLayout"`
+	DeployedBytecode DeployedBytecode   `json:"deployedBytecode"`
+	Bytecode         Bytecode           `json:"bytecode"`
+}
+
+// DeployedBytecode represents the deployed bytecode section of the solc compiler output.
+type DeployedBytecode struct {
+	SourceMap           string          `json:"sourceMap"`
+	Object              hexutil.Bytes   `json:"object"`
+	LinkReferences      json.RawMessage `json:"linkReferences"`
+	ImmutableReferences json.RawMessage `json:"immutableReferences,omitempty"`
+}
+
+// DeployedBytecode represents the bytecode section of the solc compiler output.
+type Bytecode struct {
+	SourceMap           string          `json:"sourceMap"`
+	Object              hexutil.Bytes   `json:"object"`
+	LinkReferences      json.RawMessage `json:"linkReferences"`
+	ImmutableReferences json.RawMessage `json:"immutableReferences,omitempty"`
+}
+
+// ReadArtifact will read an artifact from disk given a path.
+func ReadArtifact(path string) (*Artifact, error) {
+	file, err := os.ReadFile(path)
+	if err != nil {
+		return nil, fmt.Errorf("artifact at %s not found: %w", path, err)
+	}
+	artifact := Artifact{}
+	if err := json.Unmarshal(file, &artifact); err != nil {
+		return nil, err
+	}
+	return &artifact, nil
+}
diff --git a/op-chain-ops/foundry/artifact_test.go b/op-chain-ops/foundry/artifact_test.go
new file mode 100644
index 000000000000..7cb362226ae4
--- /dev/null
+++ b/op-chain-ops/foundry/artifact_test.go
@@ -0,0 +1,42 @@
+package foundry
+
+import (
+	"encoding/json"
+	"os"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+// TestArtifactJSON tests roundtrip serialization of a foundry artifact for commonly used fields.
+func TestArtifactJSON(t *testing.T) {
+	artifact, err := ReadArtifact("testdata/OptimismPortal.json")
+	require.NoError(t, err)
+
+	data, err := json.Marshal(artifact)
+	require.NoError(t, err)
+
+	file, err := os.ReadFile("testdata/OptimismPortal.json")
+	require.NoError(t, err)
+
+	got := unmarshalIntoMap(t, data)
+	expected := unmarshalIntoMap(t, file)
+
+	require.JSONEq(t, marshal(t, got["bytecode"]), marshal(t, expected["bytecode"]))
+	require.JSONEq(t, marshal(t, got["deployedBytecode"]), marshal(t, expected["deployedBytecode"]))
+	require.JSONEq(t, marshal(t, got["abi"]), marshal(t, expected["abi"]))
+	require.JSONEq(t, marshal(t, got["storageLayout"]), marshal(t, expected["storageLayout"]))
+}
+
+func unmarshalIntoMap(t *testing.T, file []byte) map[string]any {
+	var result map[string]any
+	err := json.Unmarshal(file, &result)
+	require.NoError(t, err)
+	return result
+}
+
+func marshal(t *testing.T, a any) string {
+	result, err := json.Marshal(a)
+	require.NoError(t, err)
+	return string(result)
+}
diff --git a/op-chain-ops/foundry/testdata/OptimismPortal.json b/op-chain-ops/foundry/testdata/OptimismPortal.json
new file mode 100644
index 000000000000..488fb5343069
--- /dev/null
+++ b/op-chain-ops/foundry/testdata/OptimismPortal.json
@@ -0,0 +1,10591 @@
+{
+  "abi": [
+    {
+      "type": "constructor",
+      "inputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "receive",
+      "stateMutability": "payable"
+    },
+    {
+      "type": "function",
+      "name": "depositTransaction",
+      "inputs": [
+        {
+          "name": "_to",
+          "type": "address",
+          "internalType": "address"
+        },
+        {
+          "name": "_value",
+          "type": "uint256",
+          "internalType": "uint256"
+        },
+        {
+          "name": "_gasLimit",
+          "type": "uint64",
+          "internalType": "uint64"
+        },
+        {
+          "name": "_isCreation",
+          "type": "bool",
+          "internalType": "bool"
+        },
+        {
+          "name": "_data",
+          "type": "bytes",
+          "internalType": "bytes"
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "payable"
+    },
+    {
+      "type": "function",
+      "name": "donateETH",
+      "inputs": [],
+      "outputs": [],
+      "stateMutability": "payable"
+    },
+    {
+      "type": "function",
+      "name": "finalizeWithdrawalTransaction",
+      "inputs": [
+        {
+          "name": "_tx",
+          "type": "tuple",
+          "internalType": "struct Types.WithdrawalTransaction",
+          "components": [
+            {
+              "name": "nonce",
+              "type": "uint256",
+              "internalType": "uint256"
+            },
+            {
+              "name": "sender",
+              "type": "address",
+              "internalType": "address"
+            },
+            {
+              "name": "target",
+              "type": "address",
+              "internalType": "address"
+            },
+            {
+              "name": "value",
+              "type": "uint256",
+              "internalType": "uint256"
+            },
+            {
+              "name": "gasLimit",
+              "type": "uint256",
+              "internalType": "uint256"
+            },
+            {
+              "name": "data",
+              "type": "bytes",
+              "internalType": "bytes"
+            }
+          ]
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "finalizedWithdrawals",
+      "inputs": [
+        {
+          "name": "",
+          "type": "bytes32",
+          "internalType": "bytes32"
+        }
+      ],
+      "outputs": [
+        {
+          "name": "",
+          "type": "bool",
+          "internalType": "bool"
+        }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "guardian",
+      "inputs": [],
+      "outputs": [
+        {
+          "name": "",
+          "type": "address",
+          "internalType": "address"
+        }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "initialize",
+      "inputs": [
+        {
+          "name": "_l2Oracle",
+          "type": "address",
+          "internalType": "contract L2OutputOracle"
+        },
+        {
+          "name": "_systemConfig",
+          "type": "address",
+          "internalType": "contract SystemConfig"
+        },
+        {
+          "name": "_superchainConfig",
+          "type": "address",
+          "internalType": "contract SuperchainConfig"
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "isOutputFinalized",
+      "inputs": [
+        {
+          "name": "_l2OutputIndex",
+          "type": "uint256",
+          "internalType": "uint256"
+        }
+      ],
+      "outputs": [
+        {
+          "name": "",
+          "type": "bool",
+          "internalType": "bool"
+        }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "l2Oracle",
+      "inputs": [],
+      "outputs": [
+        {
+          "name": "",
+          "type": "address",
+          "internalType": "contract L2OutputOracle"
+        }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "l2Sender",
+      "inputs": [],
+      "outputs": [
+        {
+          "name": "",
+          "type": "address",
+          "internalType": "address"
+        }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "minimumGasLimit",
+      "inputs": [
+        {
+          "name": "_byteCount",
+          "type": "uint64",
+          "internalType": "uint64"
+        }
+      ],
+      "outputs": [
+        {
+          "name": "",
+          "type": "uint64",
+          "internalType": "uint64"
+        }
+      ],
+      "stateMutability": "pure"
+    },
+    {
+      "type": "function",
+      "name": "params",
+      "inputs": [],
+      "outputs": [
+        {
+          "name": "prevBaseFee",
+          "type": "uint128",
+          "internalType": "uint128"
+        },
+        {
+          "name": "prevBoughtGas",
+          "type": "uint64",
+          "internalType": "uint64"
+        },
+        {
+          "name": "prevBlockNum",
+          "type": "uint64",
+          "internalType": "uint64"
+        }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "paused",
+      "inputs": [],
+      "outputs": [
+        {
+          "name": "paused_",
+          "type": "bool",
+          "internalType": "bool"
+        }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "proveWithdrawalTransaction",
+      "inputs": [
+        {
+          "name": "_tx",
+          "type": "tuple",
+          "internalType": "struct Types.WithdrawalTransaction",
+          "components": [
+            {
+              "name": "nonce",
+              "type": "uint256",
+              "internalType": "uint256"
+            },
+            {
+              "name": "sender",
+              "type": "address",
+              "internalType": "address"
+            },
+            {
+              "name": "target",
+              "type": "address",
+              "internalType": "address"
+            },
+            {
+              "name": "value",
+              "type": "uint256",
+              "internalType": "uint256"
+            },
+            {
+              "name": "gasLimit",
+              "type": "uint256",
+              "internalType": "uint256"
+            },
+            {
+              "name": "data",
+              "type": "bytes",
+              "internalType": "bytes"
+            }
+          ]
+        },
+        {
+          "name": "_l2OutputIndex",
+          "type": "uint256",
+          "internalType": "uint256"
+        },
+        {
+          "name": "_outputRootProof",
+          "type": "tuple",
+          "internalType": "struct Types.OutputRootProof",
+          "components": [
+            {
+              "name": "version",
+              "type": "bytes32",
+              "internalType": "bytes32"
+            },
+            {
+              "name": "stateRoot",
+              "type": "bytes32",
+              "internalType": "bytes32"
+            },
+            {
+              "name": "messagePasserStorageRoot",
+              "type": "bytes32",
+              "internalType": "bytes32"
+            },
+            {
+              "name": "latestBlockhash",
+              "type": "bytes32",
+              "internalType": "bytes32"
+            }
+          ]
+        },
+        {
+          "name": "_withdrawalProof",
+          "type": "bytes[]",
+          "internalType": "bytes[]"
+        }
+      ],
+      "outputs": [],
+      "stateMutability": "nonpayable"
+    },
+    {
+      "type": "function",
+      "name": "provenWithdrawals",
+      "inputs": [
+        {
+          "name": "",
+          "type": "bytes32",
+          "internalType": "bytes32"
+        }
+      ],
+      "outputs": [
+        {
+          "name": "outputRoot",
+          "type": "bytes32",
+          "internalType": "bytes32"
+        },
+        {
+          "name": "timestamp",
+          "type": "uint128",
+          "internalType": "uint128"
+        },
+        {
+          "name": "l2OutputIndex",
+          "type": "uint128",
+          "internalType": "uint128"
+        }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "superchainConfig",
+      "inputs": [],
+      "outputs": [
+        {
+          "name": "",
+          "type": "address",
+          "internalType": "contract SuperchainConfig"
+        }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "systemConfig",
+      "inputs": [],
+      "outputs": [
+        {
+          "name": "",
+          "type": "address",
+          "internalType": "contract SystemConfig"
+        }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "function",
+      "name": "version",
+      "inputs": [],
+      "outputs": [
+        {
+          "name": "",
+          "type": "string",
+          "internalType": "string"
+        }
+      ],
+      "stateMutability": "view"
+    },
+    {
+      "type": "event",
+      "name": "Initialized",
+      "inputs": [
+        {
+          "name": "version",
+          "type": "uint8",
+          "indexed": false,
+          "internalType": "uint8"
+        }
+      ],
+      "anonymous": false
+    },
+    {
+      "type": "event",
+      "name": "TransactionDeposited",
+      "inputs": [
+        {
+          "name": "from",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        },
+        {
+          "name": "to",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        },
+        {
+          "name": "version",
+          "type": "uint256",
+          "indexed": true,
+          "internalType": "uint256"
+        },
+        {
+          "name": "opaqueData",
+          "type": "bytes",
+          "indexed": false,
+          "internalType": "bytes"
+        }
+      ],
+      "anonymous": false
+    },
+    {
+      "type": "event",
+      "name": "WithdrawalFinalized",
+      "inputs": [
+        {
+          "name": "withdrawalHash",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        },
+        {
+          "name": "success",
+          "type": "bool",
+          "indexed": false,
+          "internalType": "bool"
+        }
+      ],
+      "anonymous": false
+    },
+    {
+      "type": "event",
+      "name": "WithdrawalProven",
+      "inputs": [
+        {
+          "name": "withdrawalHash",
+          "type": "bytes32",
+          "indexed": true,
+          "internalType": "bytes32"
+        },
+        {
+          "name": "from",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        },
+        {
+          "name": "to",
+          "type": "address",
+          "indexed": true,
+          "internalType": "address"
+        }
+      ],
+      "anonymous": false
+    },
+    {
+      "type": "error",
+      "name": "BadTarget",
+      "inputs": []
+    },
+    {
+      "type": "error",
+      "name": "CallPaused",
+      "inputs": []
+    },
+    {
+      "type": "error",
+      "name": "GasEstimation",
+      "inputs": []
+    },
+    {
+      "type": "error",
+      "name": "LargeCalldata",
+      "inputs": []
+    },
+    {
+      "type": "error",
+      "name": "OutOfGas",
+      "inputs": []
+    },
+    {
+      "type": "error",
+      "name": "SmallGasLimit",
+      "inputs": []
+    }
+  ],
+  "bytecode": {
+    "object": "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028f565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001c160201b6200191f1760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603680546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b03191661010085841602179055603254166200016a57603280546001600160a01b03191661dead1790555b62000174620001d0565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200023d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600154600160c01b90046001600160401b03166000036200028d5760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b615142806200029f6000396000f3fe6080604052600436106101125760003560e01c80638c3152e9116100a5578063a35d99df11610074578063cff0ab9611610059578063cff0ab961461039a578063e965084c1461043b578063e9e05c42146104c757600080fd5b8063a35d99df14610341578063c0c53b8b1461037a57600080fd5b80638c3152e9146102975780639b5f694a146102b75780639bf62d82146102e4578063a14238e71461031157600080fd5b806354fd4d50116100e157806354fd4d50146101fc5780635c975abb146102525780636dbffb78146102775780638b4c40b01461013757600080fd5b806333d7e2bd1461013e57806335e80ab314610195578063452a9320146101c75780634870496f146101dc57600080fd5b36610139576101373334620186a06000604051806020016040528060008152506104d5565b005b600080fd5b34801561014a57600080fd5b5060375461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101a157600080fd5b5060355461016b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156101d357600080fd5b5061016b610692565b3480156101e857600080fd5b506101376101f7366004614709565b61072a565b34801561020857600080fd5b506102456040518060400160405280600581526020017f322e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161018c919061485b565b34801561025e57600080fd5b50610267610d2d565b604051901515815260200161018c565b34801561028357600080fd5b5061026761029236600461486e565b610dc0565b3480156102a357600080fd5b506101376102b2366004614887565b610e7d565b3480156102c357600080fd5b5060365461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102f057600080fd5b5060325461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561031d57600080fd5b5061026761032c36600461486e565b60336020526000908152604090205460ff1681565b34801561034d57600080fd5b5061036161035c3660046148e1565b6116b8565b60405167ffffffffffffffff909116815260200161018c565b34801561038657600080fd5b506101376103953660046148fc565b6116d1565b3480156103a657600080fd5b50600154610402906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161018c565b34801561044757600080fd5b5061049961045636600461486e565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff928316602085015291169082015260600161018c565b6101376104d5366004614955565b8260005a90508380156104fd575073ffffffffffffffffffffffffffffffffffffffff871615155b15610534576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61053e83516116b8565b67ffffffffffffffff168567ffffffffffffffff16101561058b576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0835111156105c9576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146105ea575033731111000000000000000000000000000000001111015b600034888888886040516020016106059594939291906149d2565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610675919061485b565b60405180910390a45050610689828261193b565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614a37565b905090565b610732610d2d565b15610769576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff160361082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084015b60405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561089d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c19190614a74565b5190506108db6108d636869003860186614ad9565b611c12565b8114610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f6600000000000000000000000000000000000000000000006064820152608401610824565b600061097487611c6e565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610a8a5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614a74565b5114155b610b16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610824565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610bdf9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610bd5888a614b3f565b8a60400135611c9e565b610c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610824565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614bc3565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610e759173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190614a74565b602001516fffffffffffffffffffffffffffffffff16611cc2565b92915050565b565b610e85610d2d565b15610ebc576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14610f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e006064820152608401610824565b6000610f7082611c6e565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610824565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec9190614be0565b81602001516fffffffffffffffffffffffffffffffff1610156111b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610824565b6111d681602001516fffffffffffffffffffffffffffffffff16611cc2565b611288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610824565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561130f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113339190614a74565b82518151919250146113ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610824565b61140c81602001516fffffffffffffffffffffffffffffffff16611cc2565b6114be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610824565b60008381526033602052604090205460ff161561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610824565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a08801516115ff93929190611d68565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061166490841515815260200190565b60405180910390a28015801561167a5750326001145b156116b1576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60006116c5826010614c28565b610e7590615208614c58565b600054610100900460ff16158080156116f15750600054600160ff909116105b8061170b5750303b15801561170b575060005460ff166001145b611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610824565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156117f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010085841602179055603254166118ae57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b6118b6611dc6565b801561191957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611971907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614c84565b9050600061197d611ed9565b90506000816020015160ff16826000015163ffffffff1661199e9190614cca565b90508215611ad5576001546000906119d5908390700100000000000000000000000000000000900467ffffffffffffffff16614d32565b90506000836040015160ff16836119ec9190614da6565b600154611a0c9084906fffffffffffffffffffffffffffffffff16614da6565b611a169190614cca565b600154909150600090611a6790611a409084906fffffffffffffffffffffffffffffffff16614e62565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16611f9a565b90506001861115611a9657611a93611a4082876040015160ff1660018a611a8e9190614c84565b611fb9565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611b08908490700100000000000000000000000000000000900467ffffffffffffffff16614c58565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611b95576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090611bc1906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816614ed6565b90506000611bd348633b9aca0061200e565b611bdd9083614f13565b905060005a611bec9088614c84565b905080821115611c0857611c08611c038284614c84565b612025565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611c51949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611c51979096959101614f27565b600080611caa86612053565b9050611cb881868686612085565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015611d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d569190614be0565b611d609083614f7e565b421192915050565b6000806000611d788660006120b5565b905080611dae576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16611e5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610824565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003610e7b5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015611f76573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614fbb565b6000611faf611fa985856120d3565b836120e3565b90505b9392505050565b6000670de0b6b3a7640000611ffa611fd18583614cca565b611fe390670de0b6b3a7640000614d32565b611ff585670de0b6b3a7640000614da6565b6120f2565b6120049086614da6565b611faf9190614cca565b60008183101561201e5781611fb2565b5090919050565b6000805a90505b825a6120389083614c84565b101561204e576120478261505a565b915061202c565b505050565b6060818051906020012060405160200161206f91815260200190565b6040516020818303038152906040529050919050565b60006120ac84612096878686612123565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b60008183121561201e5781611fb2565b600081831261201e5781611fb2565b6000611fb2670de0b6b3a76400008361210a86612ba1565b6121149190614da6565b61211e9190614cca565b612de5565b60606000845111612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610824565b600061219b84613024565b905060006121a886613110565b90506000846040516020016121bf91815260200190565b60405160208183030381529060405290506000805b8451811015612b185760008582815181106121f1576121f1615092565b60200260200101519050845183111561228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610824565b8260000361234557805180516020918201206040516122da926122b492910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610824565b61249c565b8051516020116123fb578051805160209182012060405161236f926122b492910190815260200190565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610824565b80518451602080870191909120825191909201201461249c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610824565b6124a860106001614f7e565b81602001515103612684578451830361261c576124e281602001516010815181106124d5576124d5615092565b6020026020010151613173565b96506000875111612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610824565b600186516125839190614c84565b8214612611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610824565b505050505050611fb2565b600085848151811061263057612630615092565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061265b5761265b615092565b6020026020010151905061266e816132d3565b955061267b600186614f7e565b94505050612b05565b600281602001515103612a7d57600061269c826132f8565b90506000816000815181106126b3576126b3615092565b016020015160f81c905060006126ca6002836150c1565b6126d59060026150e3565b905060006126e6848360ff1661331c565b905060006126f48a8961331c565b905060006127028383613352565b905080835114612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610824565b60ff8516600214806127a9575060ff85166003145b15612998578082511461283e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610824565b61285887602001516001815181106124d5576124d5615092565b9c5060008d51116128eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610824565b60018c516128f99190614c84565b8814612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610824565b505050505050505050505050611fb2565b60ff851615806129ab575060ff85166001145b156129ea576129d787602001516001815181106129ca576129ca615092565b60200260200101516132d3565b99506129e3818a614f7e565b9850612a72565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610824565b505050505050612b05565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610824565b5080612b108161505a565b9150506121d4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610824565b6000808213612c0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b60006060612c1984613406565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213612e1657506000919050565b680755bf798b4a1bf1e58212612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610824565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff81111561304257613042614529565b60405190808252806020026020018201604052801561308757816020015b60408051808201909152606080825260208201528152602001906001900390816130605790505b50915060005b818110156131095760405180604001604052808583815181106130b2576130b2615092565b602002602001015181526020016130e18684815181106130d4576130d4615092565b60200260200101516134dc565b8152508382815181106130f6576130f6615092565b602090810291909101015260010161308d565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613168578060011b82018184015160001a8060041c8253600f81166001830153505060010161313a565b509295945050505050565b60606000806000613183856134ef565b91945092509050600081600181111561319e5761319e615106565b1461322b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610824565b6132358284614f7e565b8551146132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610824565b6120ac85602001518484613f5c565b606060208260000151106132ef576132ea82613173565b610e75565b610e7582613ff0565b6060610e7561331783602001516000815181106124d5576124d5615092565b613110565b60608251821061333b5750604080516020810190915260008152610e75565b611fb2838384865161334d9190614c84565b614006565b6000808251845110613365578251613368565b83515b90505b80821080156133ef575082828151811061338757613387615092565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106133c6576133c6615092565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156133ff5781600101915061336b565b5092915050565b6000808211613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060610e756134ea836141de565b6142c7565b6000806000808460000151116135ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b6020840151805160001a607f81116135d2576000600160009450945094505050613f55565b60b781116137e05760006135e7608083614c84565b9050808760000151116136a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610824565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061371b57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b6137cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610824565b5060019550935060009250613f55915050565b60bf8111613b2e5760006137f560b783614c84565b9050808760000151116138b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610824565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361398e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610824565b613a5c8184614f7e565b895111613b11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610824565b613b1c836001614f7e565b9750955060009450613f559350505050565b60f78111613c0f576000613b4360c083614c84565b905080876000015111613bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b600195509350849250613f55915050565b6000613c1c60f783614c84565b905080876000015111613cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610824565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610824565b613e838184614f7e565b895111613f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b613f43836001614f7e565b9750955060019450613f559350505050565b9193909250565b60608167ffffffffffffffff811115613f7757613f77614529565b6040519080825280601f01601f191660200182016040528015613fa1576020820181803683370190505b5090508115611fb2576000613fb68486614f7e565b90506020820160005b84811015613fd7578281015182820152602001613fbf565b84811115613fe6576000858301525b5050509392505050565b6060610e75826020015160008460000151613f5c565b60608182601f011015614075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8282840110156140e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8183018451101561414e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610824565b60608215801561416d57604051915060008252602082016040526141d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141a657805183526020928301920161418e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116142a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b50604080518082019091528151815260209182019181019190915290565b606060008060006142d7856134ef565b9194509250905060018160018111156142f2576142f2615106565b1461437f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610824565b845161438b8385614f7e565b14614418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610824565b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161442f5790505093506000835b865181101561451d576000806144a26040518060400160405280858c600001516144869190614c84565b8152602001858c6020015161449b9190614f7e565b90526134ef565b5091509150604051806040016040528083836144be9190614f7e565b8152602001848b602001516144d39190614f7e565b8152508885815181106144e8576144e8615092565b60209081029190910101526144fe600185614f7e565b935061450a8183614f7e565b6145149084614f7e565b9250505061445c565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561459f5761459f614529565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff811681146145c957600080fd5b50565b600082601f8301126145dd57600080fd5b813567ffffffffffffffff8111156145f7576145f7614529565b61462860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614558565b81815284602083860101111561463d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561466c57600080fd5b60405160c0810167ffffffffffffffff828210818311171561469057614690614529565b8160405282935084358352602085013591506146ab826145a7565b816020840152604085013591506146c1826145a7565b816040840152606085013560608401526080850135608084015260a08501359150808211156146ef57600080fd5b506146fc858286016145cc565b60a0830152505092915050565b600080600080600085870360e081121561472257600080fd5b863567ffffffffffffffff8082111561473a57600080fd5b6147468a838b0161465a565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561477f57600080fd5b60408901955060c089013592508083111561479957600080fd5b828901925089601f8401126147ad57600080fd5b82359150808211156147be57600080fd5b508860208260051b84010111156147d457600080fd5b959894975092955050506020019190565b60005b838110156148005781810151838201526020016147e8565b838111156119195750506000910152565b600081518084526148298160208601602086016147e5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fb26020830184614811565b60006020828403121561488057600080fd5b5035919050565b60006020828403121561489957600080fd5b813567ffffffffffffffff8111156148b057600080fd5b6148bc8482850161465a565b949350505050565b803567ffffffffffffffff811681146148dc57600080fd5b919050565b6000602082840312156148f357600080fd5b611fb2826148c4565b60008060006060848603121561491157600080fd5b833561491c816145a7565b9250602084013561492c816145a7565b9150604084013561493c816145a7565b809150509250925092565b80151581146145c957600080fd5b600080600080600060a0868803121561496d57600080fd5b8535614978816145a7565b94506020860135935061498d604087016148c4565b9250606086013561499d81614947565b9150608086013567ffffffffffffffff8111156149b957600080fd5b6149c5888289016145cc565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614a268160498501602087016147e5565b919091016049019695505050505050565b600060208284031215614a4957600080fd5b8151611fb2816145a7565b80516fffffffffffffffffffffffffffffffff811681146148dc57600080fd5b600060608284031215614a8657600080fd5b6040516060810181811067ffffffffffffffff82111715614aa957614aa9614529565b60405282518152614abc60208401614a54565b6020820152614acd60408401614a54565b60408201529392505050565b600060808284031215614aeb57600080fd5b6040516080810181811067ffffffffffffffff82111715614b0e57614b0e614529565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614b5a57614b5a614529565b8360051b6020614b6b818301614558565b868152918501918181019036841115614b8357600080fd5b865b84811015614bb757803586811115614b9d5760008081fd5b614ba936828b016145cc565b845250918301918301614b85565b50979650505050505050565b600060208284031215614bd557600080fd5b8151611fb281614947565b600060208284031215614bf257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614c4f57614c4f614bf9565b02949350505050565b600067ffffffffffffffff808316818516808303821115614c7b57614c7b614bf9565b01949350505050565b600082821015614c9657614c96614bf9565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614cd957614cd9614c9b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614d2d57614d2d614bf9565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615614d6c57614d6c614bf9565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614da057614da0614bf9565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614de757614de7614bf9565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614e2257614e22614bf9565b60008712925087820587128484161615614e3e57614e3e614bf9565b87850587128184161615614e5457614e54614bf9565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614e9c57614e9c614bf9565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614ed057614ed0614bf9565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f0e57614f0e614bf9565b500290565b600082614f2257614f22614c9b565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614f7260c0830184614811565b98975050505050505050565b60008219821115614f9157614f91614bf9565b500190565b805163ffffffff811681146148dc57600080fd5b805160ff811681146148dc57600080fd5b600060c08284031215614fcd57600080fd5b60405160c0810181811067ffffffffffffffff82111715614ff057614ff0614529565b604052614ffc83614f96565b815261500a60208401614faa565b602082015261501b60408401614faa565b604082015261502c60608401614f96565b606082015261503d60808401614f96565b608082015261504e60a08401614a54565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508b5761508b614bf9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff8316806150d4576150d4614c9b565b8060ff84160691505092915050565b600060ff821660ff8416808210156150fd576150fd614bf9565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
+    "sourceMap": "1240:19301:81:-:0;;;4633:218;;;;;;;;;-1:-1:-1;4657:187:81;4716:1;;;4657:10;:187::i;:::-;1240:19301;;5069:435;3100:19:25;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:25;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;;3209:33;3236:4;3209:18;;;;;:33;;:::i;:::-;3208:34;:55;;;;-1:-1:-1;3246:12:25;;;;;:17;3208:55;3146:190;;;;-1:-1:-1;;;3146:190:25;;216:2:144;3146:190:25;;;198:21:144;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:144;;;338:44;399:19;;3146:190:25;;;;;;;;;3346:12;:16;;-1:-1:-1;;3346:16:25;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;-1:-1:-1;;3406:20:25;;;;;3372:65;5258:8:81::1;:20:::0;;-1:-1:-1;;;;;;5258:20:81;;::::1;-1:-1:-1::0;;;;;5258:20:81;;::::1;::::0;;;::::1;::::0;;;5288:12:::1;:28:::0;;;;::::1;::::0;;::::1;;::::0;;5326:16:::1;:36:::0;;-1:-1:-1;;;;;;5326:36:81::1;5258:20;5326:36:::0;;::::1;;;::::0;;5376:8:::1;::::0;::::1;5372:91;;5414:8;:38:::0;;-1:-1:-1;;;;;;5414:38:81::1;1338:42:118;5414:38:81;::::0;;5372:91:::1;5472:25;:23;:25::i;:::-;3461:14:25::0;3457:99;;;3507:5;3491:21;;-1:-1:-1;;3491:21:25;;;3531:14;;-1:-1:-1;581:36:144;;3531:14:25;;569:2:144;554:18;3531:14:25;;;;;;;3457:99;3090:472;5069:435:81;;;:::o;1175:320:33:-;-1:-1:-1;;;;;1465:19:33;;:23;;;1175:320::o;8340:234:84:-;4888:13:25;;;;;;;4880:69;;;;-1:-1:-1;;;4880:69:25;;830:2:144;4880:69:25;;;812:21:144;869:2;849:18;;;842:30;908:34;888:18;;;881:62;-1:-1:-1;;;959:18:144;;;952:41;1010:19;;4880:69:25;628:407:144;4880:69:25;8415:6:84::1;:19:::0;-1:-1:-1;;;8415:19:84;::::1;-1:-1:-1::0;;;;;8415:19:84::1;;:24:::0;8411:157:::1;;8464:93;::::0;;::::1;::::0;::::1;::::0;;8494:6:::1;8464:93:::0;;;-1:-1:-1;8464:93:84::1;::::0;::::1;::::0;8541:12:::1;-1:-1:-1::0;;;;;8464:93:84::1;::::0;;;;;;;-1:-1:-1;;;8455:102:84::1;;:6;:102:::0;8411:157:::1;8340:234::o:0;628:407:144:-;1240:19301:81;;;;;;",
+    "linkReferences": {}
+  },
+  "deployedBytecode": {
+    "object": "0x6080604052600436106101125760003560e01c80638c3152e9116100a5578063a35d99df11610074578063cff0ab9611610059578063cff0ab961461039a578063e965084c1461043b578063e9e05c42146104c757600080fd5b8063a35d99df14610341578063c0c53b8b1461037a57600080fd5b80638c3152e9146102975780639b5f694a146102b75780639bf62d82146102e4578063a14238e71461031157600080fd5b806354fd4d50116100e157806354fd4d50146101fc5780635c975abb146102525780636dbffb78146102775780638b4c40b01461013757600080fd5b806333d7e2bd1461013e57806335e80ab314610195578063452a9320146101c75780634870496f146101dc57600080fd5b36610139576101373334620186a06000604051806020016040528060008152506104d5565b005b600080fd5b34801561014a57600080fd5b5060375461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101a157600080fd5b5060355461016b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156101d357600080fd5b5061016b610692565b3480156101e857600080fd5b506101376101f7366004614709565b61072a565b34801561020857600080fd5b506102456040518060400160405280600581526020017f322e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161018c919061485b565b34801561025e57600080fd5b50610267610d2d565b604051901515815260200161018c565b34801561028357600080fd5b5061026761029236600461486e565b610dc0565b3480156102a357600080fd5b506101376102b2366004614887565b610e7d565b3480156102c357600080fd5b5060365461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102f057600080fd5b5060325461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561031d57600080fd5b5061026761032c36600461486e565b60336020526000908152604090205460ff1681565b34801561034d57600080fd5b5061036161035c3660046148e1565b6116b8565b60405167ffffffffffffffff909116815260200161018c565b34801561038657600080fd5b506101376103953660046148fc565b6116d1565b3480156103a657600080fd5b50600154610402906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161018c565b34801561044757600080fd5b5061049961045636600461486e565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff928316602085015291169082015260600161018c565b6101376104d5366004614955565b8260005a90508380156104fd575073ffffffffffffffffffffffffffffffffffffffff871615155b15610534576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61053e83516116b8565b67ffffffffffffffff168567ffffffffffffffff16101561058b576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0835111156105c9576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146105ea575033731111000000000000000000000000000000001111015b600034888888886040516020016106059594939291906149d2565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610675919061485b565b60405180910390a45050610689828261193b565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614a37565b905090565b610732610d2d565b15610769576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff160361082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084015b60405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561089d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c19190614a74565b5190506108db6108d636869003860186614ad9565b611c12565b8114610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f6600000000000000000000000000000000000000000000006064820152608401610824565b600061097487611c6e565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610a8a5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614a74565b5114155b610b16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610824565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610bdf9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610bd5888a614b3f565b8a60400135611c9e565b610c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610824565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614bc3565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610e759173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190614a74565b602001516fffffffffffffffffffffffffffffffff16611cc2565b92915050565b565b610e85610d2d565b15610ebc576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14610f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e006064820152608401610824565b6000610f7082611c6e565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610824565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec9190614be0565b81602001516fffffffffffffffffffffffffffffffff1610156111b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610824565b6111d681602001516fffffffffffffffffffffffffffffffff16611cc2565b611288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610824565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561130f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113339190614a74565b82518151919250146113ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610824565b61140c81602001516fffffffffffffffffffffffffffffffff16611cc2565b6114be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610824565b60008381526033602052604090205460ff161561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610824565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a08801516115ff93929190611d68565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061166490841515815260200190565b60405180910390a28015801561167a5750326001145b156116b1576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60006116c5826010614c28565b610e7590615208614c58565b600054610100900460ff16158080156116f15750600054600160ff909116105b8061170b5750303b15801561170b575060005460ff166001145b611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610824565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156117f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010085841602179055603254166118ae57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b6118b6611dc6565b801561191957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611971907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614c84565b9050600061197d611ed9565b90506000816020015160ff16826000015163ffffffff1661199e9190614cca565b90508215611ad5576001546000906119d5908390700100000000000000000000000000000000900467ffffffffffffffff16614d32565b90506000836040015160ff16836119ec9190614da6565b600154611a0c9084906fffffffffffffffffffffffffffffffff16614da6565b611a169190614cca565b600154909150600090611a6790611a409084906fffffffffffffffffffffffffffffffff16614e62565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16611f9a565b90506001861115611a9657611a93611a4082876040015160ff1660018a611a8e9190614c84565b611fb9565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611b08908490700100000000000000000000000000000000900467ffffffffffffffff16614c58565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611b95576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090611bc1906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816614ed6565b90506000611bd348633b9aca0061200e565b611bdd9083614f13565b905060005a611bec9088614c84565b905080821115611c0857611c08611c038284614c84565b612025565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611c51949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611c51979096959101614f27565b600080611caa86612053565b9050611cb881868686612085565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015611d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d569190614be0565b611d609083614f7e565b421192915050565b6000806000611d788660006120b5565b905080611dae576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16611e5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610824565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003610e7b5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015611f76573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614fbb565b6000611faf611fa985856120d3565b836120e3565b90505b9392505050565b6000670de0b6b3a7640000611ffa611fd18583614cca565b611fe390670de0b6b3a7640000614d32565b611ff585670de0b6b3a7640000614da6565b6120f2565b6120049086614da6565b611faf9190614cca565b60008183101561201e5781611fb2565b5090919050565b6000805a90505b825a6120389083614c84565b101561204e576120478261505a565b915061202c565b505050565b6060818051906020012060405160200161206f91815260200190565b6040516020818303038152906040529050919050565b60006120ac84612096878686612123565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b60008183121561201e5781611fb2565b600081831261201e5781611fb2565b6000611fb2670de0b6b3a76400008361210a86612ba1565b6121149190614da6565b61211e9190614cca565b612de5565b60606000845111612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610824565b600061219b84613024565b905060006121a886613110565b90506000846040516020016121bf91815260200190565b60405160208183030381529060405290506000805b8451811015612b185760008582815181106121f1576121f1615092565b60200260200101519050845183111561228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610824565b8260000361234557805180516020918201206040516122da926122b492910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610824565b61249c565b8051516020116123fb578051805160209182012060405161236f926122b492910190815260200190565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610824565b80518451602080870191909120825191909201201461249c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610824565b6124a860106001614f7e565b81602001515103612684578451830361261c576124e281602001516010815181106124d5576124d5615092565b6020026020010151613173565b96506000875111612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610824565b600186516125839190614c84565b8214612611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610824565b505050505050611fb2565b600085848151811061263057612630615092565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061265b5761265b615092565b6020026020010151905061266e816132d3565b955061267b600186614f7e565b94505050612b05565b600281602001515103612a7d57600061269c826132f8565b90506000816000815181106126b3576126b3615092565b016020015160f81c905060006126ca6002836150c1565b6126d59060026150e3565b905060006126e6848360ff1661331c565b905060006126f48a8961331c565b905060006127028383613352565b905080835114612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610824565b60ff8516600214806127a9575060ff85166003145b15612998578082511461283e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610824565b61285887602001516001815181106124d5576124d5615092565b9c5060008d51116128eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610824565b60018c516128f99190614c84565b8814612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610824565b505050505050505050505050611fb2565b60ff851615806129ab575060ff85166001145b156129ea576129d787602001516001815181106129ca576129ca615092565b60200260200101516132d3565b99506129e3818a614f7e565b9850612a72565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610824565b505050505050612b05565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610824565b5080612b108161505a565b9150506121d4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610824565b6000808213612c0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b60006060612c1984613406565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213612e1657506000919050565b680755bf798b4a1bf1e58212612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610824565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff81111561304257613042614529565b60405190808252806020026020018201604052801561308757816020015b60408051808201909152606080825260208201528152602001906001900390816130605790505b50915060005b818110156131095760405180604001604052808583815181106130b2576130b2615092565b602002602001015181526020016130e18684815181106130d4576130d4615092565b60200260200101516134dc565b8152508382815181106130f6576130f6615092565b602090810291909101015260010161308d565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613168578060011b82018184015160001a8060041c8253600f81166001830153505060010161313a565b509295945050505050565b60606000806000613183856134ef565b91945092509050600081600181111561319e5761319e615106565b1461322b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610824565b6132358284614f7e565b8551146132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610824565b6120ac85602001518484613f5c565b606060208260000151106132ef576132ea82613173565b610e75565b610e7582613ff0565b6060610e7561331783602001516000815181106124d5576124d5615092565b613110565b60608251821061333b5750604080516020810190915260008152610e75565b611fb2838384865161334d9190614c84565b614006565b6000808251845110613365578251613368565b83515b90505b80821080156133ef575082828151811061338757613387615092565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106133c6576133c6615092565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156133ff5781600101915061336b565b5092915050565b6000808211613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060610e756134ea836141de565b6142c7565b6000806000808460000151116135ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b6020840151805160001a607f81116135d2576000600160009450945094505050613f55565b60b781116137e05760006135e7608083614c84565b9050808760000151116136a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610824565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061371b57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b6137cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610824565b5060019550935060009250613f55915050565b60bf8111613b2e5760006137f560b783614c84565b9050808760000151116138b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610824565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361398e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610824565b613a5c8184614f7e565b895111613b11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610824565b613b1c836001614f7e565b9750955060009450613f559350505050565b60f78111613c0f576000613b4360c083614c84565b905080876000015111613bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b600195509350849250613f55915050565b6000613c1c60f783614c84565b905080876000015111613cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610824565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610824565b613e838184614f7e565b895111613f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b613f43836001614f7e565b9750955060019450613f559350505050565b9193909250565b60608167ffffffffffffffff811115613f7757613f77614529565b6040519080825280601f01601f191660200182016040528015613fa1576020820181803683370190505b5090508115611fb2576000613fb68486614f7e565b90506020820160005b84811015613fd7578281015182820152602001613fbf565b84811115613fe6576000858301525b5050509392505050565b6060610e75826020015160008460000151613f5c565b60608182601f011015614075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8282840110156140e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8183018451101561414e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610824565b60608215801561416d57604051915060008252602082016040526141d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141a657805183526020928301920161418e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116142a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b50604080518082019091528151815260209182019181019190915290565b606060008060006142d7856134ef565b9194509250905060018160018111156142f2576142f2615106565b1461437f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610824565b845161438b8385614f7e565b14614418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610824565b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161442f5790505093506000835b865181101561451d576000806144a26040518060400160405280858c600001516144869190614c84565b8152602001858c6020015161449b9190614f7e565b90526134ef565b5091509150604051806040016040528083836144be9190614f7e565b8152602001848b602001516144d39190614f7e565b8152508885815181106144e8576144e8615092565b60209081029190910101526144fe600185614f7e565b935061450a8183614f7e565b6145149084614f7e565b9250505061445c565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561459f5761459f614529565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff811681146145c957600080fd5b50565b600082601f8301126145dd57600080fd5b813567ffffffffffffffff8111156145f7576145f7614529565b61462860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614558565b81815284602083860101111561463d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561466c57600080fd5b60405160c0810167ffffffffffffffff828210818311171561469057614690614529565b8160405282935084358352602085013591506146ab826145a7565b816020840152604085013591506146c1826145a7565b816040840152606085013560608401526080850135608084015260a08501359150808211156146ef57600080fd5b506146fc858286016145cc565b60a0830152505092915050565b600080600080600085870360e081121561472257600080fd5b863567ffffffffffffffff8082111561473a57600080fd5b6147468a838b0161465a565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561477f57600080fd5b60408901955060c089013592508083111561479957600080fd5b828901925089601f8401126147ad57600080fd5b82359150808211156147be57600080fd5b508860208260051b84010111156147d457600080fd5b959894975092955050506020019190565b60005b838110156148005781810151838201526020016147e8565b838111156119195750506000910152565b600081518084526148298160208601602086016147e5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fb26020830184614811565b60006020828403121561488057600080fd5b5035919050565b60006020828403121561489957600080fd5b813567ffffffffffffffff8111156148b057600080fd5b6148bc8482850161465a565b949350505050565b803567ffffffffffffffff811681146148dc57600080fd5b919050565b6000602082840312156148f357600080fd5b611fb2826148c4565b60008060006060848603121561491157600080fd5b833561491c816145a7565b9250602084013561492c816145a7565b9150604084013561493c816145a7565b809150509250925092565b80151581146145c957600080fd5b600080600080600060a0868803121561496d57600080fd5b8535614978816145a7565b94506020860135935061498d604087016148c4565b9250606086013561499d81614947565b9150608086013567ffffffffffffffff8111156149b957600080fd5b6149c5888289016145cc565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614a268160498501602087016147e5565b919091016049019695505050505050565b600060208284031215614a4957600080fd5b8151611fb2816145a7565b80516fffffffffffffffffffffffffffffffff811681146148dc57600080fd5b600060608284031215614a8657600080fd5b6040516060810181811067ffffffffffffffff82111715614aa957614aa9614529565b60405282518152614abc60208401614a54565b6020820152614acd60408401614a54565b60408201529392505050565b600060808284031215614aeb57600080fd5b6040516080810181811067ffffffffffffffff82111715614b0e57614b0e614529565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614b5a57614b5a614529565b8360051b6020614b6b818301614558565b868152918501918181019036841115614b8357600080fd5b865b84811015614bb757803586811115614b9d5760008081fd5b614ba936828b016145cc565b845250918301918301614b85565b50979650505050505050565b600060208284031215614bd557600080fd5b8151611fb281614947565b600060208284031215614bf257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614c4f57614c4f614bf9565b02949350505050565b600067ffffffffffffffff808316818516808303821115614c7b57614c7b614bf9565b01949350505050565b600082821015614c9657614c96614bf9565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614cd957614cd9614c9b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614d2d57614d2d614bf9565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615614d6c57614d6c614bf9565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614da057614da0614bf9565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614de757614de7614bf9565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614e2257614e22614bf9565b60008712925087820587128484161615614e3e57614e3e614bf9565b87850587128184161615614e5457614e54614bf9565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614e9c57614e9c614bf9565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614ed057614ed0614bf9565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f0e57614f0e614bf9565b500290565b600082614f2257614f22614c9b565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614f7260c0830184614811565b98975050505050505050565b60008219821115614f9157614f91614bf9565b500190565b805163ffffffff811681146148dc57600080fd5b805160ff811681146148dc57600080fd5b600060c08284031215614fcd57600080fd5b60405160c0810181811067ffffffffffffffff82111715614ff057614ff0614529565b604052614ffc83614f96565b815261500a60208401614faa565b602082015261501b60408401614faa565b604082015261502c60608401614f96565b606082015261503d60808401614f96565b608082015261504e60a08401614a54565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508b5761508b614bf9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff8316806150d4576150d4614c9b565b8060ff84160691505092915050565b600060ff821660ff8416808210156150fd576150fd614bf9565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
+    "sourceMap": "1240:19301:81:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7115:86;7134:10;7146:9;1971:7;7184:5;7191:9;;;;;;;;;;;;7115:18;:86::i;:::-;1240:19301;;;;;2983:32;;;;;;;;;;-1:-1:-1;2983:32:81;;;;;;;;;;;212:42:144;200:55;;;182:74;;170:2;155:18;2983:32:81;;;;;;;;2739:40;;;;;;;;;;-1:-1:-1;2739:40:81;;;;;;;;;;;5757:101;;;;;;;;;;;;;:::i;8288:3825::-;;;;;;;;;;-1:-1:-1;8288:3825:81;;;;;:::i;:::-;;:::i;4530:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5981:105::-;;;;;;;;;;;;;:::i;:::-;;;5226:14:144;;5219:22;5201:41;;5189:2;5174:18;5981:105:81;5061:187:144;19926:180:81;;;;;;;;;;-1:-1:-1;19926:180:81;;;;;:::i;:::-;;:::i;12226:4818::-;;;;;;;;;;-1:-1:-1;12226:4818:81;;;;;:::i;:::-;;:::i;2867:30::-;;;;;;;;;;-1:-1:-1;2867:30:81;;;;;;;;2234:23;;;;;;;;;;-1:-1:-1;2234:23:81;;;;;;;;2348:52;;;;;;;;;;-1:-1:-1;2348:52:81;;;;;:::i;:::-;;;;;;;;;;;;;;;;6579:120;;;;;;;;;;-1:-1:-1;6579:120:81;;;;;:::i;:::-;;:::i;:::-;;;6796:18:144;6784:31;;;6766:50;;6754:2;6739:18;6579:120:81;6622:200:144;5069:435:81;;;;;;;;;;-1:-1:-1;5069:435:81;;;;;:::i;:::-;;:::i;3093:28:84:-;;;;;;;;;;-1:-1:-1;3093:28:84;;;;;;;;;;;;;;;;;;;;;;;;;7661:34:144;7649:47;;;7631:66;;7716:18;7770:15;;;7765:2;7750:18;;7743:43;7822:15;;7802:18;;;7795:43;7619:2;7604:18;3093:28:84;7433:411:144;2482:61:81;;;;;;;;;;-1:-1:-1;2482:61:81;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8051:25:144;;;8095:34;8165:15;;;8160:2;8145:18;;8138:43;8217:15;;8197:18;;;8190:43;8039:2;8024:18;2482:61:81;7849:390:144;17774:1855:81;;;;;;:::i;:::-;17980:9;3511:18:84;3532:9;3511:30;;18134:11:81::1;:32;;;;-1:-1:-1::0;18149:17:81::1;::::0;::::1;::::0;::::1;18134:32;18130:56;;;18175:11;;;;;;;;;;;;;;18130:56;18350:37;18373:5;:12;18350:15;:37::i;:::-;18338:49;;:9;:49;;;18334:77;;;18396:15;;;;;;;;;;;;;;18334:77;18801:7;18786:5;:12;:22;18782:50;;;18817:15;;;;;;;;;;;;;;18782:50;18938:10;18976:9;18962:23:::0;::::1;18958:108;;-1:-1:-1::0;19044:10:81::1;741:42:141::0;1213:27;18958:108:81::1;19323:23;19366:9;19377:6;19385:9;19396:11;19409:5;19349:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19323:92;;1821:1;19589:3;19562:60;;19583:4;19562:60;;;19611:10;19562:60;;;;;;:::i;:::-;;;;;;;;17995:1634;;3642:29:84::0;3651:7;3660:10;3642:8;:29::i;:::-;3433:245;17774:1855:81;;;;;;:::o;5757:101::-;5798:7;5824:16;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5817:34;;5757:101;:::o;8288:3825::-;4414:8;:6;:8::i;:::-;4410:33;;;4431:12;;;;;;;;;;;;;;4410:33;8820:4:::1;8798:27;;:3;:10;;;:27;;::::0;8790:103:::1;;;::::0;::::1;::::0;;10432:2:144;8790:103:81::1;::::0;::::1;10414:21:144::0;10471:2;10451:18;;;10444:30;10510:34;10490:18;;;10483:62;10581:33;10561:18;;;10554:61;10632:19;;8790:103:81::1;;;;;;;;;9091:8;::::0;:36:::1;::::0;;;;::::1;::::0;::::1;10808:25:144::0;;;9070:18:81::1;::::0;9091:8:::1;;::::0;:20:::1;::::0;10781:18:144;;9091:36:81::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47:::0;;-1:-1:-1;9272:45:81::1;;;::::0;;::::1;::::0;::::1;9300:16:::0;9272:45:::1;:::i;:::-;:27;:45::i;:::-;9258:10;:59;9237:135;;;::::0;::::1;::::0;;12516:2:144;9237:135:81::1;::::0;::::1;12498:21:144::0;12555:2;12535:18;;;12528:30;12594:34;12574:18;;;12567:62;12665:11;12645:18;;;12638:39;12694:19;;9237:135:81::1;12314:405:144::0;9237:135:81::1;9483:22;9508:27;9531:3;9508:22;:27::i;:::-;9545:40;9588:33:::0;;;:17:::1;:33;::::0;;;;;;;;9545:76;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;;9483:52;;-1:-1:-1;9545:76:81;10175:31;;:145:::1;;-1:-1:-1::0;10293:27:81;;10226:8:::1;::::0;10247:30:::1;::::0;;::::1;::::0;10226:52;;;;;12900:34:144;12888:47;;;10226:52:81::1;::::0;::::1;12870:66:144::0;10226:8:81::1;::::0;;::::1;::::0;:20:::1;::::0;12843:18:144;;10226:52:81::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63:::0;:94:::1;;10175:145;10154:247;;;::::0;::::1;::::0;;13149:2:144;10154:247:81::1;::::0;::::1;13131:21:144::0;13188:2;13168:18;;;13161:30;13227:34;13207:18;;;13200:62;13298:25;13278:18;;;13271:53;13341:19;;10154:247:81::1;12947:419:144::0;10154:247:81::1;10681:147;::::0;;::::1;::::0;::::1;13545:25:144::0;;;10637:18:81::1;13586::144::0;;;13579:34;;;13518:18;;10681:147:81::1;::::0;;;;;::::1;::::0;;;;;;10658:180;;10681:147:::1;10658:180:::0;;::::1;::::0;11253:22;;::::1;10808:25:144::0;;;10658:180:81;-1:-1:-1;11191:240:81::1;::::0;10781:18:144;11253:22:81::1;::::0;;;;;::::1;::::0;;;11191:240;;::::1;::::0;;;::::1;::::0;;::::1;11253:22;11191:240:::0;::::1;::::0;11253:22;11191:240:::1;11334:16:::0;;11191:240:::1;:::i;:::-;11375:16;:41;;;11191:37;:240::i;:::-;11170:337;;;::::0;::::1;::::0;;14947:2:144;11170:337:81::1;::::0;::::1;14929:21:144::0;14986:2;14966:18;;;14959:30;15025:34;15005:18;;;14998:62;15096:20;15076:18;;;15069:48;15134:19;;11170:337:81::1;14745:414:144::0;11170:337:81::1;11825:165;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;11911:15;11825:165:::0;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;-1:-1:-1;11789:33:81;;;:17:::1;:33:::0;;;;;:201;;;;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;;12095:10;;::::1;::::0;12083;;::::1;::::0;12050:56;;::::1;::::0;;::::1;::::0;;;::::1;::::0;11807:14;;12050:56:::1;::::0;-1:-1:-1;12050:56:81::1;8553:3560;;;;8288:3825:::0;;;;;:::o;5981:105::-;6020:12;6054:16;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19926:180::-;20052:8;;:36;;;;;;;;10808:25:144;;;20000:4:81;;20023:76;;20052:8;;;;;:20;;10781:18:144;;20052:36:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;20023:76;;:28;:76::i;:::-;20016:83;19926:180;-1:-1:-1;;19926:180:81:o;7422:77::-;:::o;12226:4818::-;4414:8;:6;:8::i;:::-;4410:33;;;4431:12;;;;;;;;;;;;;;4410:33;12594:8:::1;::::0;:39:::1;:8;1338:42:118;12594:39:81;12573:137;;;::::0;::::1;::::0;;15616:2:144;12573:137:81::1;::::0;::::1;15598:21:144::0;15655:2;15635:18;;;15628:30;15694:34;15674:18;;;15667:62;15765:33;15745:18;;;15738:61;15816:19;;12573:137:81::1;15414:427:144::0;12573:137:81::1;12793:22;12818:27;12841:3;12818:22;:27::i;:::-;12855:40;12898:33:::0;;;:17:::1;:33;::::0;;;;;;;12855:76;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;;12793:52;;-1:-1:-1;13181:31:81;;13173:94:::1;;;::::0;::::1;::::0;;16048:2:144;13173:94:81::1;::::0;::::1;16030:21:144::0;16087:2;16067:18;;;16060:30;16126:34;16106:18;;;16099:62;16197:20;16177:18;;;16170:48;16235:19;;13173:94:81::1;15846:414:144::0;13173:94:81::1;13584:8;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13554:16;:26;;;:58;;;;13533:180;;;::::0;::::1;::::0;;16656:2:144;13533:180:81::1;::::0;::::1;16638:21:144::0;16695:2;16675:18;;;16668:30;16734:34;16714:18;;;16707:62;16805:34;16785:18;;;16778:62;16877:13;16856:19;;;16849:42;16908:19;;13533:180:81::1;16454:479:144::0;13533:180:81::1;14103:56;14132:16;:26;;;14103:56;;:28;:56::i;:::-;14082:172;;;::::0;::::1;::::0;;17140:2:144;14082:172:81::1;::::0;::::1;17122:21:144::0;17179:2;17159:18;;;17152:30;17218:34;17198:18;;;17191:62;17289:34;17269:18;;;17262:62;17361:7;17340:19;;;17333:36;17386:19;;14082:172:81::1;16938:473:144::0;14082:172:81::1;14464:8;::::0;14485:30:::1;::::0;;::::1;::::0;14464:52;;;;;12900:34:144;12888:47;;;14464:52:81::1;::::0;::::1;12870:66:144::0;14425:36:81::1;::::0;14464:8:::1;;::::0;:20:::1;::::0;12843:18:144;;14464:52:81::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14827:27:::0;;14804:19;;14425:91;;-1:-1:-1;14804:50:81::1;14783:170;;;::::0;::::1;::::0;;17618:2:144;14783:170:81::1;::::0;::::1;17600:21:144::0;17657:2;17637:18;;;17630:30;17696:34;17676:18;;;17669:62;17767:34;17747:18;;;17740:62;17839:11;17818:19;;;17811:40;17868:19;;14783:170:81::1;17416:477:144::0;14783:170:81::1;15052:48;15081:8;:18;;;15052:48;;:28;:48::i;:::-;15031:162;;;::::0;::::1;::::0;;18100:2:144;15031:162:81::1;::::0;::::1;18082:21:144::0;18139:2;18119:18;;;18112:30;18178:34;18158:18;;;18151:62;18249:34;18229:18;;;18222:62;18321:5;18300:19;;;18293:34;18344:19;;15031:162:81::1;17898:471:144::0;15031:162:81::1;15309:36;::::0;;;:20:::1;:36;::::0;;;;;::::1;;:45;15301:111;;;::::0;::::1;::::0;;18576:2:144;15301:111:81::1;::::0;::::1;18558:21:144::0;18615:2;18595:18;;;18588:30;18654:34;18634:18;;;18627:62;18725:23;18705:18;;;18698:51;18766:19;;15301:111:81::1;18374:417:144::0;15301:111:81::1;15492:36;::::0;;;:20:::1;:36;::::0;;;;;;;:43;;;::::1;15531:4;15492:43;::::0;;15640:10;;::::1;::::0;15629:8:::1;:21:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;16309:10;::::1;::::0;16321:12:::1;::::0;::::1;::::0;16335:9:::1;::::0;::::1;::::0;16346:8:::1;::::0;::::1;::::0;16285:70:::1;::::0;16309:10;16321:12;16335:9;16285:23:::1;:70::i;:::-;16423:8;:38:::0;;;::::1;1338:42:118;16423:38:81;::::0;;16620:44:::1;::::0;16270:85;;-1:-1:-1;16640:14:81;;16620:44:::1;::::0;::::1;::::0;16270:85;5226:14:144;5219:22;5201:41;;5189:2;5174:18;;5061:187;16620:44:81::1;;;;;;;;16928:16:::0;::::1;::::0;::::1;:61;;-1:-1:-1::0;16948:9:81::1;1016:1:118;16948:41:81;16928:61;16924:114;;;17012:15;;;;;;;;;;;;;;16924:114;12328:4716;;;;12226:4818:::0;:::o;6579:120::-;6644:6;6669:15;:10;6682:2;6669:15;:::i;:::-;:23;;6687:5;6669:23;:::i;5069:435::-;3100:19:25;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:25;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;-1:-1:-1;3236:4:25;1465:19:33;:23;;;3208:55:25;;-1:-1:-1;3246:12:25;;;;;:17;3208:55;3146:190;;;;;;;19703:2:144;3146:190:25;;;19685:21:144;19742:2;19722:18;;;19715:30;19781:34;19761:18;;;19754:62;19852:16;19832:18;;;19825:44;19886:19;;3146:190:25;19501:410:144;3146:190:25;3346:12;:16;;;;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;;;;;;;3372:65;5258:8:81::1;:20:::0;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;5288:12:::1;:28:::0;;;;::::1;::::0;;::::1;;::::0;;5326:16:::1;:36:::0;;;::::1;5258:20;5326:36:::0;;::::1;;;::::0;;5376:8:::1;::::0;::::1;5372:91;;5414:8;:38:::0;;;::::1;1338:42:118;5414:38:81;::::0;;5372:91:::1;5472:25;:23;:25::i;:::-;3461:14:25::0;3457:99;;;3507:5;3491:21;;;;;;3531:14;;-1:-1:-1;20068:36:144;;3531:14:25;;20056:2:144;20041:18;3531:14:25;;;;;;;3457:99;3090:472;5069:435:81;;;:::o;1175:320:33:-;1465:19;;;:23;;;1175:320::o;3911:3974:84:-;4078:6;:19;4043:17;;4063:34;;4078:19;;;;;4063:12;:34;:::i;:::-;4043:54;;4108:28;4139:17;:15;:17::i;:::-;4108:48;;4166:26;4265:6;:27;;;4257:36;;4222:6;:23;;;4214:32;;4207:87;;;;:::i;:::-;4166:128;-1:-1:-1;4309:13:84;;4305:2229;;4666:6;:20;4629:19;;4651:59;;4691:19;;4666:20;;;;;4651:59;:::i;:::-;4629:81;;4724:19;4855:6;:34;;;4847:43;;4818:19;:73;;;;:::i;:::-;4762:6;:18;4747:50;;4785:12;;4762:18;;4747:50;:::i;:::-;4746:146;;;;:::i;:::-;5111:6;:18;4724:168;;-1:-1:-1;5033:17:84;;5053:232;;5096:50;;4724:168;;5111:18;;5096:50;:::i;:::-;5185:6;:21;;;5177:30;;5247:6;:21;;;5239:30;;5053:16;:232::i;:::-;5033:252;;5562:1;5550:9;:13;5546:741;;;5835:437;5882:239;5939:10;6004:6;:34;;;5996:43;;6096:1;6084:9;:13;;;;:::i;:::-;5882:16;:239::i;5835:437::-;5822:450;;5546:741;6380:49;;6481:42;6443:24;6510:12;6481:42;;;6380:6;6481:42;-1:-1:-1;;4305:2229:84;6628:6;:31;;6652:7;;6628:6;:20;;:31;;6652:7;;6628:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6728:6;:23;;;6720:32;;6688:6;:20;;;;;;;;;;;;6680:29;;6673:80;6669:128;;;6776:10;;;;;;;;;;;;;;6669:128;6908:6;:18;6858:20;;6881:46;;6908:18;;6881:16;;;:46;:::i;:::-;6858:69;;7409:15;7442:31;7451:13;7466:6;7442:8;:31::i;:::-;7427:46;;:12;:46;:::i;:::-;7409:64;;7753:15;7785:9;7771:23;;:11;:23;:::i;:::-;7753:41;;7818:7;7808;:17;7804:75;;;7841:27;7850:17;7860:7;7850;:17;:::i;:::-;7841:8;:27::i;:::-;3975:3910;;;;;;3911:3974;;:::o;4961:384:120:-;5060:7;5137:16;:24;;;5179:16;:26;;;5223:16;:41;;;5282:16;:32;;;5109:219;;;;;;;;;;22742:25:144;;;22798:2;22783:18;;22776:34;;;;22841:2;22826:18;;22819:34;22884:2;22869:18;;22862:34;22729:3;22714:19;;22511:391;5109:219:120;;;;;;;;;;;;;5086:252;;;;;;5079:259;;4961:384;;;:::o;4456:211::-;4590:9;;4601:10;;;;;4613;;;;;4625:9;;;;4636:12;;;;4650:8;;;;4579:80;;4543:7;;4579:80;;4590:9;;4601:10;4650:8;4579:80;;:::i;1041:343:129:-;1234:11;1261:16;1280:19;1294:4;1280:13;:19::i;:::-;1261:38;;1318:59;1350:3;1355:6;1363;1371:5;1318:31;:59::i;:::-;1309:68;1041:343;-1:-1:-1;;;;;;1041:343:129:o;20359:180:81:-;20494:8;;:38;;;;;;;;20440:4;;20494:8;;;:36;;:38;;;;;;;;;;;;;;:8;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20481:51;;:10;:51;:::i;:::-;20463:15;:69;;20359:180;-1:-1:-1;;20359:180:81:o;4419:2320:123:-;4589:4;4609:13;4632:15;4650:21;4660:7;4669:1;4650:9;:21::i;:::-;4632:39;;4782:10;4772:1146;;4894:10;4891:1;4884:21;5009:2;5005;4998:14;5747:56;5743:2;5736:68;5900:3;5896:2;5889:15;4772:1146;6666:4;6630;6589:9;6583:16;6549:2;6538:9;6534:18;6491:6;6449:7;6415:5;6389:309;6361:337;4419:2320;-1:-1:-1;;;;;;;4419:2320:123:o;8340:234:84:-;4888:13:25;;;;;;;4880:69;;;;;;;23903:2:144;4880:69:25;;;23885:21:144;23942:2;23922:18;;;23915:30;23981:34;23961:18;;;23954:62;24052:13;24032:18;;;24025:41;24083:19;;4880:69:25;23701:407:144;4880:69:25;8415:6:84::1;:19:::0;;;::::1;;;;:24:::0;8411:157:::1;;8464:93;::::0;;::::1;::::0;::::1;::::0;;8494:6:::1;8464:93:::0;;;-1:-1:-1;8464:93:84::1;::::0;::::1;::::0;8541:12:::1;8464:93;;::::0;;;;;;;8455:102;::::1;;:6;:102:::0;8340:234::o;7748:152:81:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7864:12:81;;:29;;;;;;;-1:-1:-1;;7864:12:81;;;;;:27;;:29;;;;;-1:-1:-1;;7864:29:81;;;;;;:12;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;537:161:115:-;616:6;641:50;656:28;671:6;679:4;656:14;:28::i;:::-;686:4;641:14;:50::i;:::-;634:57;;537:161;;;;;;:::o;1040:228::-;1138:6;1257:4;1180:72;1213:19;1220:12;1257:4;1213:19;:::i;:::-;1205:28;;:4;:28;:::i;:::-;1235:16;:9;1247:4;1235:16;:::i;:::-;1180:24;:72::i;:::-;1164:89;;:12;:89;:::i;:::-;1163:98;;;;:::i;413:105:37:-;471:7;502:1;497;:6;;:14;;510:1;497:14;;;-1:-1:-1;506:1:37;;490:21;-1:-1:-1;413:105:37:o;407:192:116:-;461:9;484:18;505:9;484:30;;524:69;556:7;544:9;531:22;;:10;:22;:::i;:::-;:32;524:69;;;579:3;;;:::i;:::-;;;524:69;;;451:148;;407:192;:::o;2052:142:129:-;2116:18;2181:4;2171:15;;;;;;2154:33;;;;;;25672:19:144;;25716:2;25707:12;;25543:182;2154:33:129;;;;;;;;;;;;;2146:41;;2052:142;;;:::o;2253:281:128:-;2446:11;2482:45;2494:6;2502:24;2506:4;2512:6;2520:5;2502:3;:24::i;:::-;6693:17:117;;;;;;;6672;;;;;;;;;;:38;;6569:148;2482:45:128;2473:54;2253:281;-1:-1:-1;;;;;2253:281:128:o;3615:365:123:-;3696:4;3712:15;3931:2;3916:12;3909:5;3905:24;3901:33;3896:2;3887:7;3883:16;3879:56;3874:2;3867:5;3863:14;3860:76;3853:84;;3615:365;-1:-1:-1;;;;3615:365:123:o;311:102:38:-;367:6;397:1;392;:6;;:14;;405:1;392:14;;491:101;547:6;576:1;572;:5;:13;;584:1;572:13;;1208:273:62;1267:6;1391:36;491:4;1410:1;1399:8;1405:1;1399:5;:8::i;:::-;:12;;;;:::i;:::-;1398:28;;;;:::i;:::-;1391:6;:36::i;2830:6314:128:-;2923:19;2976:1;2962:4;:11;:15;2954:49;;;;;;;25932:2:144;2954:49:128;;;25914:21:144;25971:2;25951:18;;;25944:30;26010:23;25990:18;;;25983:51;26051:18;;2954:49:128;25730:345:144;2954:49:128;3014:23;3040:19;3052:6;3040:11;:19::i;:::-;3014:45;;3069:16;3088:21;3104:4;3088:15;:21::i;:::-;3069:40;;3119:26;3165:5;3148:23;;;;;;25672:19:144;;25716:2;25707:12;;25543:182;3148:23:128;;;;;;;;;;;;;3119:52;;3181:23;3295:9;3290:5790;3314:5;:12;3310:1;:16;3290:5790;;;3347:27;3377:5;3383:1;3377:8;;;;;;;;:::i;:::-;;;;;;;3347:38;;3516:3;:10;3497:15;:29;;3489:88;;;;;;;26471:2:144;3489:88:128;;;26453:21:144;26510:2;26490:18;;;26483:30;26549:34;26529:18;;;26522:62;26620:16;26600:18;;;26593:44;26654:19;;3489:88:128;26269:410:144;3489:88:128;3596:15;3615:1;3596:20;3592:837;;3768:19;;3758:30;;;;;;;3741:48;;3729:76;;3741:48;;3758:30;3741:48;25672:19:144;;;25716:2;25707:12;;25543:182;3741:48:128;;;;;;;;;;;;;3791:13;6693:17:117;;;;;;;6672;;;;;;;;;;:38;;6569:148;3729:76:128;3700:176;;;;;;;26886:2:144;3700:176:128;;;26868:21:144;26925:2;26905:18;;;26898:30;26964:31;26944:18;;;26937:59;27013:18;;3700:176:128;26684:353:144;3700:176:128;3592:837;;;3901:19;;:26;3931:2;-1:-1:-1;3897:532:128;;4097:19;;4087:30;;;;;;;4070:48;;4058:76;;4070:48;;4087:30;4070:48;25672:19:144;;;25716:2;25707:12;;25543:182;4058:76:128;4029:186;;;;;;;27244:2:144;4029:186:128;;;27226:21:144;27283:2;27263:18;;;27256:30;27322:34;27302:18;;;27295:62;27393:9;27373:18;;;27366:37;27420:19;;4029:186:128;27042:403:144;3897:532:128;4336:19;;6693:17:117;;;;;;;;;;6672;;;;;;;:38;4316:98:128;;;;;;;27652:2:144;4316:98:128;;;27634:21:144;27691:2;27671:18;;;27664:30;27730:34;27710:18;;;27703:62;27801:8;27781:18;;;27774:36;27827:19;;4316:98:128;27450:402:144;4316:98:128;936:14;803:2;949:1;936:14;:::i;:::-;4447:11;:19;;;:26;:48;4443:4627;;4538:3;:10;4519:15;:29;4515:1346;;5047:52;5067:11;:19;;;803:2;5067:31;;;;;;;;:::i;:::-;;;;;;;5047:19;:52::i;:::-;5038:61;;5145:1;5129:6;:13;:17;5121:89;;;;;;;28059:2:144;5121:89:128;;;28041:21:144;28098:2;28078:18;;;28071:30;28137:34;28117:18;;;28110:62;28208:29;28188:18;;;28181:57;28255:19;;5121:89:128;27857:423:144;5121:89:128;5322:1;5307:5;:12;:16;;;;:::i;:::-;5302:1;:21;5294:92;;;;;;;28487:2:144;5294:92:128;;;28469:21:144;28526:2;28506:18;;;28499:30;28565:34;28545:18;;;28538:62;28636:28;28616:18;;;28609:56;28682:19;;5294:92:128;28285:422:144;5294:92:128;5409:13;;;;;;;;4515:1346;5609:15;5633:3;5637:15;5633:20;;;;;;;;:::i;:::-;;;;;;;;;5627:27;;5609:45;;5676:33;5712:11;:19;;;5732:9;5712:30;;;;;;;;;;:::i;:::-;;;;;;;5676:66;;5780:20;5791:8;5780:10;:20::i;:::-;5764:36;-1:-1:-1;5822:20:128;5841:1;5822:20;;:::i;:::-;;;5447:414;;4443:4627;;;1105:1;5885:11;:19;;;:26;:59;5881:3189;;5964:17;5984:25;5997:11;5984:12;:25::i;:::-;5964:45;;6027:12;6048:4;6053:1;6048:7;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;6074:12:128;6094:10;6103:1;6048:7;6094:10;:::i;:::-;6089:16;;:1;:16;:::i;:::-;6074:31;;6123:26;6152:25;6164:4;6170:6;6152:25;;:11;:25::i;:::-;6123:54;;6195:25;6223:33;6235:3;6240:15;6223:11;:33::i;:::-;6195:61;;6274:26;6303:51;6326:13;6341:12;6303:22;:51::i;:::-;6274:80;;6661:18;6637:13;:20;:42;6608:171;;;;;;;29276:2:144;6608:171:128;;;29258:21:144;29315:2;29295:18;;;29288:30;29354:34;29334:18;;;29327:62;29425:28;29405:18;;;29398:56;29471:19;;6608:171:128;29074:422:144;6608:171:128;6802:26;;;1447:1;6802:26;;:55;;-1:-1:-1;6832:25:128;;;1553:1;6832:25;6802:55;6798:2169;;;7498:18;7475:12;:19;:41;7442:185;;;;;;;29703:2:144;7442:185:128;;;29685:21:144;29742:2;29722:18;;;29715:30;29781:34;29761:18;;;29754:62;29852:31;29832:18;;;29825:59;29901:19;;7442:185:128;29501:425:144;7442:185:128;7985:43;8005:11;:19;;;8025:1;8005:22;;;;;;;;:::i;7985:43::-;7976:52;;8074:1;8058:6;:13;:17;8050:87;;;;;;;30133:2:144;8050:87:128;;;30115:21:144;30172:2;30152:18;;;30145:30;30211:34;30191:18;;;30184:62;30282:27;30262:18;;;30255:55;30327:19;;8050:87:128;29931:421:144;8050:87:128;8249:1;8234:5;:12;:16;;;;:::i;:::-;8229:1;:21;8221:90;;;;;;;30559:2:144;8221:90:128;;;30541:21:144;30598:2;30578:18;;;30571:30;30637:34;30617:18;;;30610:62;30708:26;30688:18;;;30681:54;30752:19;;8221:90:128;30357:420:144;8221:90:128;8334:13;;;;;;;;;;;;;;6798:2169;8376:31;;;;;:65;;-1:-1:-1;8411:30:128;;;1339:1;8411:30;8376:65;8372:595;;;8748:34;8759:11;:19;;;8779:1;8759:22;;;;;;;;:::i;:::-;;;;;;;8748:10;:34::i;:::-;8732:50;-1:-1:-1;8804:37:128;8823:18;8804:37;;:::i;:::-;;;8372:595;;;8888:60;;;;;30984:2:144;8888:60:128;;;30966:21:144;31023:2;31003:18;;;30996:30;31062:34;31042:18;;;31035:62;31133:20;31113:18;;;31106:48;31171:19;;8888:60:128;30782:414:144;8372:595:128;5946:3035;;;;;;5881:3189;;;9005:50;;;;;31403:2:144;9005:50:128;;;31385:21:144;31442:2;31422:18;;;31415:30;31481:34;31461:18;;;31454:62;31552:10;31532:18;;;31525:38;31580:19;;9005:50:128;31201:404:144;5881:3189:128;-1:-1:-1;3328:3:128;;;;:::i;:::-;;;;3290:5790;;;-1:-1:-1;9090:47:128;;;;;31812:2:144;9090:47:128;;;31794:21:144;31851:2;31831:18;;;31824:30;31890:34;31870:18;;;31863:62;31961:7;31941:18;;;31934:35;31986:19;;9090:47:128;31610:401:144;4596:2947:62;4644:8;4700:1;4696;:5;4688:27;;;;;;;32218:2:144;4688:27:62;;;32200:21:144;32257:1;32237:18;;;32230:29;32295:11;32275:18;;;32268:39;32324:18;;4688:27:62;32016:332:144;4688:27:62;5107:8;5145:2;5125:16;5138:1;5125:4;:16::i;:::-;5118:29;5175:3;:7;;;5161:22;;;;5208:17;;;6001:31;5997:35;;6052:5;;5459:2;6051:13;;;6068:32;6050:50;6120:5;;6119:13;;6136:33;6118:51;6189:5;;6188:13;;6205:33;6187:51;6258:5;;6257:13;;6274:33;6256:51;6327:5;;6326:13;;6343:32;6325:50;6395:5;;6394:13;;6411:30;6393:48;5398:31;5394:35;;5449:5;;5448:13;;5465:32;5447:50;5517:5;;5516:13;;5533:32;5515:50;5585:5;;5584:13;;5583:50;;5653:5;;5652:13;;5651:50;;5721:5;;5720:13;;;5719:50;;5787:5;;;:46;;6735:10;7125:43;7120:48;7232:71;:75;;;;7227:80;;;;7380:72;7375:77;7523:3;7517:9;;;-1:-1:-1;;4596:2947:62:o;1487:3103::-;1536:8;1718:21;1713:1;:26;1709:40;;-1:-1:-1;1748:1:62;;1487:3103;-1:-1:-1;1487:3103:62:o;1709:40::-;1948:21;1943:1;:26;1939:54;;1971:22;;;;;32555:2:144;1971:22:62;;;32537:21:144;32594:2;32574:18;;;32567:30;32633:14;32613:18;;;32606:42;32665:18;;1971:22:62;32353:336:144;1939:54:62;2266:5;2260:2;2255:7;;;2254:17;;-1:-1:-1;2535:8:62;2601:2;2559:29;2548:7;;;2547:41;2591:5;2547:49;2546:57;;2629:29;2625:33;;2621:37;;;3300:35;;;3355:5;;2935:2;3354:13;;;3371:32;3353:50;3423:5;;3422:13;;3421:51;;3492:5;;3491:13;;3508:34;3490:52;3562:5;;3561:13;;3560:53;;3633:5;;3632:13;;3649:35;3631:53;2941:32;2874:31;2870:35;;2925:5;;2924:13;;2923:50;;;2998:5;;;:40;;3058:5;3057:13;;;3074:35;3056:53;3127:5;;;3136:40;3127:50;4002:10;4502:49;4489:62;4564:3;:7;;;;4488:84;;;;;;-1:-1:-1;;1487:3103:62:o;9434:390:128:-;9553:13;;9500:24;;9553:13;9585:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;9585:22:128;;;;;;;;;;;;;;;;9576:31;;9622:9;9617:201;9641:6;9637:1;:10;9617:201;;;9676:72;;;;;;;;9696:6;9703:1;9696:9;;;;;;;;:::i;:::-;;;;;;;9676:72;;;;9716:29;9735:6;9742:1;9735:9;;;;;;;;:::i;:::-;;;;;;;9716:18;:29::i;:::-;9676:72;;;9664:6;9671:1;9664:9;;;;;;;;:::i;:::-;;;;;;;;;;:84;9790:3;;9617:201;;;;9526:298;9434:390;;;:::o;4332:1978:117:-;4395:12;4419:21;4550:4;4544:11;4532:23;;4663:6;4657:13;4836:11;4830:4;4826:22;5195:4;5180:13;5176:24;5169:4;5165:9;5161:40;5151:8;5147:55;5141:4;5134:69;5293:13;5283:8;5276:31;;5434:4;5426:6;5422:17;5571:4;5561:8;5557:19;5662:4;5647:622;5675:11;5672:1;5669:18;5647:622;;;5854:1;5848:4;5844:12;5830;5826:31;5996:1;5984:10;5980:18;5974:25;5968:4;5963:37;6119:1;6113:4;6109:12;6101:6;6093:29;6249:4;6246:1;6242:12;6235:4;6227:6;6223:17;6215:40;-1:-1:-1;;5702:4:117;5695:12;5647:622;;;-1:-1:-1;6295:8:117;;4332:1978;-1:-1:-1;;;;;4332:1978:117:o;3993:464:126:-;4055:17;4085:18;4105;4125:20;4149:18;4163:3;4149:13;:18::i;:::-;4084:83;;-1:-1:-1;4084:83:126;-1:-1:-1;4084:83:126;-1:-1:-1;4198:21:126;4186:8;:33;;;;;;;;:::i;:::-;;4178:103;;;;;;;33085:2:144;4178:103:126;;;33067:21:144;33124:2;33104:18;;;33097:30;33163:34;33143:18;;;33136:62;33234:27;33214:18;;;33207:55;33279:19;;4178:103:126;32883:421:144;4178:103:126;4314:23;4327:10;4314;:23;:::i;:::-;4300:10;;:37;4292:102;;;;;;;33511:2:144;4292:102:126;;;33493:21:144;33550:2;33530:18;;;33523:30;33589:34;33569:18;;;33562:62;33660:22;33640:18;;;33633:50;33700:19;;4292:102:126;33309:416:144;4292:102:126;4412:38;4418:3;:7;;;4427:10;4439;4412:5;:38::i;10121:193:128:-;10195:16;10244:2;10229:5;:12;;;:17;:78;;10281:26;10301:5;10281:19;:26::i;:::-;10229:78;;;10249:29;10272:5;10249:22;:29::i;10495:172::-;10562:21;10606:54;10622:37;10642:5;:13;;;10656:1;10642:16;;;;;;;;:::i;10622:37::-;10606:15;:54::i;3805:237:117:-;3880:12;3918:6;:13;3908:6;:23;3904:70;;-1:-1:-1;3954:9:117;;;;;;;;;-1:-1:-1;3954:9:117;;3947:16;;3904:70;3990:45;3996:6;4004;4028;4012;:13;:22;;;;:::i;:::-;3990:5;:45::i;10892:321:128:-;10980:15;11007:11;11034:2;:9;11022:2;:9;:21;11021:47;;11059:2;:9;11021:47;;;11047:2;:9;11021:47;11007:61;;11078:129;11095:3;11085:7;:13;:43;;;;;11117:2;11120:7;11117:11;;;;;;;;:::i;:::-;;;;;;;;;11102:26;;;:2;11105:7;11102:11;;;;;;;;:::i;:::-;;;;;;;:26;11085:43;11078:129;;;11173:9;;;;;11078:129;;;10997:216;10892:321;;;;:::o;15328:575:62:-;15376:9;15409:1;15405;:5;15397:27;;;;;;;32218:2:144;15397:27:62;;;32200:21:144;32257:1;32237:18;;;32230:29;32295:11;32275:18;;;32268:39;32324:18;;15397:27:62;32016:332:144;15397:27:62;-1:-1:-1;15821:1:62;15473:34;-1:-1:-1;;15467:1:62;15463:49;15566:9;;;15546:18;15543:33;15540:1;15536:41;15530:48;15624:9;;;15612:10;15609:25;15606:1;15602:33;15596:40;15678:9;;;15670:6;15667:21;15664:1;15660:29;15654:36;15730:9;;;15724:4;15721:19;15718:1;15714:27;;;15708:34;;;15781:9;;;15776:3;15773:18;15770:1;15766:26;15760:33;15832:9;;;15824:18;;;15817:26;;15811:33;15876:9;;;-1:-1:-1;15862:25:62;;15328:575::o;3732:130:126:-;3791:21;3831:24;3840:14;3850:3;3840:9;:14::i;:::-;3831:8;:24::i;5246:4079::-;5335:15;5352;5369:17;5705:1;5692:3;:10;;;:14;5684:101;;;;;;;33932:2:144;5684:101:126;;;33914:21:144;33971:2;33951:18;;;33944:30;34010:34;33990:18;;;33983:62;34081:34;34061:18;;;34054:62;34153:12;34132:19;;;34125:41;34183:19;;5684:101:126;33730:478:144;5684:101:126;5816:7;;;;5898:10;;5796:17;5890:19;5943:4;5933:14;;5929:3390;;5999:1;6002;6005:21;5991:36;;;;;;;;;;5929:3390;6058:4;6048:6;:14;6044:3275;;6164:14;6181:13;6190:4;6181:6;:13;:::i;:::-;6164:30;;6247:6;6234:3;:10;;;:19;6209:140;;;;;;;34415:2:144;6209:140:126;;;34397:21:144;34454:2;34434:18;;;34427:30;34493:34;34473:18;;;34466:62;34564:34;34544:18;;;34537:62;34636:16;34615:19;;;34608:45;34670:19;;6209:140:126;34213:482:144;6209:140:126;6471:1;6462:11;;;6456:18;6476:14;6452:39;;6544:11;;;;:41;;-1:-1:-1;6559:26:126;;;;;;6544:41;6519:177;;;;;;;34902:2:144;6519:177:126;;;34884:21:144;34941:2;34921:18;;;34914:30;34980:34;34960:18;;;34953:62;35051:34;35031:18;;;35024:62;35123:15;35102:19;;;35095:44;35156:19;;6519:177:126;34700:481:144;6519:177:126;-1:-1:-1;6719:1:126;;-1:-1:-1;6722:6:126;-1:-1:-1;6730:21:126;;-1:-1:-1;6711:41:126;;-1:-1:-1;;6711:41:126;6044:3275;6783:4;6773:6;:14;6769:2550;;6831:19;6853:13;6862:4;6853:6;:13;:::i;:::-;6831:35;;6919:11;6906:3;:10;;;:24;6881:164;;;;;;;35388:2:144;6881:164:126;;;35370:21:144;35427:2;35407:18;;;35400:30;35466:34;35446:18;;;35439:62;35537:34;35517:18;;;35510:62;35609:19;35588;;;35581:48;35646:19;;6881:164:126;35186:485:144;6881:164:126;7167:1;7158:11;;7152:18;7172:14;7148:39;7060:25;7240:26;;;7215:143;;;;;;;35878:2:144;7215:143:126;;;35860:21:144;35917:2;35897:18;;;35890:30;35956:34;35936:18;;;35929:62;36027:34;36007:18;;;36000:62;36099:12;36078:19;;;36071:41;36129:19;;7215:143:126;35676:478:144;7215:143:126;7488:1;7479:11;;7473:18;7455:1;7451:19;;7446:3;7442:29;7438:54;7537:2;7528:11;;7520:96;;;;;;;36361:2:144;7520:96:126;;;36343:21:144;36400:2;36380:18;;;36373:30;36439:34;36419:18;;;36412:62;36510:34;36490:18;;;36483:62;36582:10;36561:19;;;36554:39;36610:19;;7520:96:126;36159:476:144;7520:96:126;7669:20;7683:6;7669:11;:20;:::i;:::-;7656:10;;:33;7631:168;;;;;;;36842:2:144;7631:168:126;;;36824:21:144;36881:2;36861:18;;;36854:30;36920:34;36900:18;;;36893:62;36991:34;36971:18;;;36964:62;37063:14;37042:19;;;37035:43;37095:19;;7631:168:126;36640:480:144;7631:168:126;7822:15;7826:11;7822:1;:15;:::i;:::-;7814:55;-1:-1:-1;7839:6:126;-1:-1:-1;7847:21:126;;-1:-1:-1;7814:55:126;;-1:-1:-1;;;;7814:55:126;6769:2550;7900:4;7890:6;:14;7886:1433;;8003:15;8021:13;8030:4;8021:6;:13;:::i;:::-;8003:31;;8070:7;8057:3;:10;;;:20;8049:107;;;;;;;37327:2:144;8049:107:126;;;37309:21:144;37366:2;37346:18;;;37339:30;37405:34;37385:18;;;37378:62;37476:34;37456:18;;;37449:62;37548:12;37527:19;;;37520:41;37578:19;;8049:107:126;37125:478:144;8049:107:126;8179:1;;-1:-1:-1;8182:7:126;-1:-1:-1;8179:1:126;;-1:-1:-1;8171:42:126;;-1:-1:-1;;8171:42:126;7886:1433;8270:20;8293:13;8302:4;8293:6;:13;:::i;:::-;8270:36;;8359:12;8346:3;:10;;;:25;8321:161;;;;;;;37810:2:144;8321:161:126;;;37792:21:144;37849:2;37829:18;;;37822:30;37888:34;37868:18;;;37861:62;37959:34;37939:18;;;37932:62;38031:15;38010:19;;;38003:44;38064:19;;8321:161:126;37608:481:144;8321:161:126;8604:1;8595:11;;8589:18;8609:14;8585:39;8497:25;8677:26;;;8652:141;;;;;;;38296:2:144;8652:141:126;;;38278:21:144;38335:2;38315:18;;;38308:30;38374:34;38354:18;;;38347:62;38445:34;38425:18;;;38418:62;38517:10;38496:19;;;38489:39;38545:19;;8652:141:126;38094:476:144;8652:141:126;8926:1;8917:11;;8911:18;8892:1;8888:20;;8883:3;8879:30;8875:55;8976:2;8966:12;;8958:95;;;;;;;38777:2:144;8958:95:126;;;38759:21:144;38816:2;38796:18;;;38789:30;38855:34;38835:18;;;38828:62;38926:34;38906:18;;;38899:62;38998:8;38977:19;;;38970:37;39024:19;;8958:95:126;38575:474:144;8958:95:126;9106:22;9121:7;9106:12;:22;:::i;:::-;9093:10;;:35;9068:168;;;;;;;39256:2:144;9068:168:126;;;39238:21:144;39295:2;39275:18;;;39268:30;39334:34;39314:18;;;39307:62;39405:34;39385:18;;;39378:62;39477:12;39456:19;;;39449:41;39507:19;;9068:168:126;39054:478:144;9068:168:126;9259:16;9263:12;9259:1;:16;:::i;:::-;9251:57;-1:-1:-1;9277:7:126;-1:-1:-1;9286:21:126;;-1:-1:-1;9251:57:126;;-1:-1:-1;;;;9251:57:126;5246:4079;;;;;;:::o;9585:737::-;9676:17;9722:7;9712:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9712:18:126;-1:-1:-1;9705:25:126;-1:-1:-1;9740:54:126;;9772:11;9740:54;10010:11;10024:36;10053:7;10045:4;10024:36;:::i;:::-;10010:50;;10115:2;10109:4;10105:13;10140:1;10154:87;10168:7;10165:1;10162:14;10154:87;;;10226:11;;;10220:18;10206:12;;;10199:40;10191:2;10184:10;10154:87;;;10264:7;10261:1;10258:14;10255:51;;;10302:1;10292:7;10286:4;10282:18;10275:29;10255:51;;;10079:237;9585:737;;;;;:::o;4847:137::-;4912:17;4948:29;4954:3;:7;;;4963:1;4966:3;:10;;;4948:5;:29::i;660:2816:117:-;752:12;824:7;808;818:2;808:12;:23;;800:50;;;;;;;39739:2:144;800:50:117;;;39721:21:144;39778:2;39758:18;;;39751:30;39817:16;39797:18;;;39790:44;39851:18;;800:50:117;39537:338:144;800:50:117;892:6;881:7;872:6;:16;:26;;864:53;;;;;;;39739:2:144;864:53:117;;;39721:21:144;39778:2;39758:18;;;39751:30;39817:16;39797:18;;;39790:44;39851:18;;864:53:117;39537:338:144;864:53:117;965:7;956:6;:16;939:6;:13;:33;;931:63;;;;;;;40082:2:144;931:63:117;;;40064:21:144;40121:2;40101:18;;;40094:30;40160:19;40140:18;;;40133:47;40197:18;;931:63:117;39880:341:144;931:63:117;1015:22;1078:15;;1106:1931;;;;3178:4;3172:11;3159:24;;3365:1;3354:9;3347:20;3413:4;3402:9;3398:20;3392:4;3385:34;1071:2362;;1106:1931;1288:4;1282:11;1269:24;;1947:2;1938:7;1934:16;2329:9;2322:17;2316:4;2312:28;2300:9;2289;2285:25;2281:60;2377:7;2373:2;2369:16;2629:6;2615:9;2608:17;2602:4;2598:28;2586:9;2578:6;2574:22;2570:57;2566:70;2403:389;2662:3;2658:2;2655:11;2403:389;;;2780:9;;2769:21;;2703:4;2695:13;;;;2735;2403:389;;;-1:-1:-1;;2810:26:117;;;3018:2;3001:11;3014:7;2997:25;2991:4;2984:39;-1:-1:-1;1071:2362:117;-1:-1:-1;3460:9:117;660:2816;-1:-1:-1;;;;660:2816:117:o;1298:390:126:-;-1:-1:-1;;;;;;;;;;;;;;;;;1453:1:126;1440:3;:10;:14;1432:101;;;;;;;33932:2:144;1432:101:126;;;33914:21:144;33971:2;33951:18;;;33944:30;34010:34;33990:18;;;33983:62;34081:34;34061:18;;;34054:62;34153:12;34132:19;;;34125:41;34183:19;;1432:101:126;33730:478:144;1432:101:126;-1:-1:-1;1640:41:126;;;;;;;;;1658:10;;1640:41;;1610:2;1601:12;;;1640:41;;;;;;;;1298:390::o;1840:1740::-;1901:21;1935:18;1955;1975:20;1999:18;2013:3;1999:13;:18::i;:::-;1934:83;;-1:-1:-1;1934:83:126;-1:-1:-1;1934:83:126;-1:-1:-1;2048:21:126;2036:8;:33;;;;;;;;:::i;:::-;;2028:102;;;;;;;40428:2:144;2028:102:126;;;40410:21:144;40467:2;40447:18;;;40440:30;40506:34;40486:18;;;40479:62;40577:26;40557:18;;;40550:54;40621:19;;2028:102:126;40226:420:144;2028:102:126;2176:10;;2149:23;2162:10;2149;:23;:::i;:::-;:37;2141:100;;;;;;;40853:2:144;2141:100:126;;;40835:21:144;40892:2;40872:18;;;40865:30;40931:34;40911:18;;;40904:62;41002:20;40982:18;;;40975:48;41040:19;;2141:100:126;40651:414:144;2141:100:126;2651:30;;;1123:2;2651:30;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;2651:30:126;;;;;;;;;;;;;;-1:-1:-1;2644:37:126;-1:-1:-1;2692:17:126;2740:10;2760:681;2776:10;;2767:19;;2760:681;;;2803:18;2823;2846:150;2877:105;;;;;;;;2908:6;2895:3;:10;;;:19;;;;:::i;:::-;2877:105;;;;2972:6;2961:3;:7;;;2940:38;;;;:::i;:::-;2877:105;;2846:13;:150::i;:::-;2802:194;;;;;3201:153;;;;;;;;3248:10;3235;:23;;;;:::i;:::-;3201:153;;;;3332:6;3321:3;:7;;;3300:38;;;;:::i;:::-;3201:153;;;3183:4;3188:9;3183:15;;;;;;;;:::i;:::-;;;;;;;;;;:171;3369:14;3382:1;3369:14;;:::i;:::-;;-1:-1:-1;3407:23:126;3420:10;3407;:23;:::i;:::-;3397:33;;;;:::i;:::-;;;2788:653;;2760:681;;;-1:-1:-1;3541:23:126;;-1:-1:-1;3548:4:126;;1840:1740;-1:-1:-1;;;1840:1740:126:o;755:184:144:-;807:77;804:1;797:88;904:4;901:1;894:15;928:4;925:1;918:15;944:334;1015:2;1009:9;1071:2;1061:13;;1076:66;1057:86;1045:99;;1174:18;1159:34;;1195:22;;;1156:62;1153:88;;;1221:18;;:::i;:::-;1257:2;1250:22;944:334;;-1:-1:-1;944:334:144:o;1283:154::-;1369:42;1362:5;1358:54;1351:5;1348:65;1338:93;;1427:1;1424;1417:12;1338:93;1283:154;:::o;1442:589::-;1484:5;1537:3;1530:4;1522:6;1518:17;1514:27;1504:55;;1555:1;1552;1545:12;1504:55;1591:6;1578:20;1617:18;1613:2;1610:26;1607:52;;;1639:18;;:::i;:::-;1683:114;1791:4;1722:66;1715:4;1711:2;1707:13;1703:86;1699:97;1683:114;:::i;:::-;1822:2;1813:7;1806:19;1868:3;1861:4;1856:2;1848:6;1844:15;1840:26;1837:35;1834:55;;;1885:1;1882;1875:12;1834:55;1950:2;1943:4;1935:6;1931:17;1924:4;1915:7;1911:18;1898:55;1998:1;1973:16;;;1991:4;1969:27;1962:38;;;;1977:7;1442:589;-1:-1:-1;;;1442:589:144:o;2036:1032::-;2104:5;2152:4;2140:9;2135:3;2131:19;2127:30;2124:50;;;2170:1;2167;2160:12;2124:50;2203:2;2197:9;2245:4;2237:6;2233:17;2269:18;2337:6;2325:10;2322:22;2317:2;2305:10;2302:18;2299:46;2296:72;;;2348:18;;:::i;:::-;2388:10;2384:2;2377:22;2417:6;2408:15;;2460:9;2447:23;2439:6;2432:39;2523:2;2512:9;2508:18;2495:32;2480:47;;2536:33;2561:7;2536:33;:::i;:::-;2602:7;2597:2;2589:6;2585:15;2578:32;2662:2;2651:9;2647:18;2634:32;2619:47;;2675:33;2700:7;2675:33;:::i;:::-;2741:7;2736:2;2728:6;2724:15;2717:32;2810:2;2799:9;2795:18;2782:32;2777:2;2769:6;2765:15;2758:57;2877:3;2866:9;2862:19;2849:33;2843:3;2835:6;2831:16;2824:59;2934:3;2923:9;2919:19;2906:33;2892:47;;2962:2;2954:6;2951:14;2948:34;;;2978:1;2975;2968:12;2948:34;;3016:45;3057:3;3048:6;3037:9;3033:22;3016:45;:::i;:::-;3010:3;3002:6;2998:16;2991:71;;;2036:1032;;;;:::o;3073:1173::-;3273:6;3281;3289;3297;3305;3349:9;3340:7;3336:23;3379:3;3375:2;3371:12;3368:32;;;3396:1;3393;3386:12;3368:32;3436:9;3423:23;3465:18;3506:2;3498:6;3495:14;3492:34;;;3522:1;3519;3512:12;3492:34;3545:72;3609:7;3600:6;3589:9;3585:22;3545:72;:::i;:::-;3535:82;;3664:2;3653:9;3649:18;3636:32;3626:42;;3761:3;3692:66;3688:2;3684:75;3680:85;3677:105;;;3778:1;3775;3768:12;3677:105;3816:2;3805:9;3801:18;3791:28;;3872:3;3861:9;3857:19;3844:33;3828:49;;3902:2;3892:8;3889:16;3886:36;;;3918:1;3915;3908:12;3886:36;3956:8;3945:9;3941:24;3931:34;;4003:7;3996:4;3992:2;3988:13;3984:27;3974:55;;4025:1;4022;4015:12;3974:55;4065:2;4052:16;4038:30;;4091:2;4083:6;4080:14;4077:34;;;4107:1;4104;4097:12;4077:34;;4160:7;4155:2;4145:6;4142:1;4138:14;4134:2;4130:23;4126:32;4123:45;4120:65;;;4181:1;4178;4171:12;4120:65;3073:1173;;;;-1:-1:-1;3073:1173:144;;-1:-1:-1;;;4212:2:144;4204:11;;4234:6;3073:1173::o;4251:258::-;4323:1;4333:113;4347:6;4344:1;4341:13;4333:113;;;4423:11;;;4417:18;4404:11;;;4397:39;4369:2;4362:10;4333:113;;;4464:6;4461:1;4458:13;4455:48;;;-1:-1:-1;;4499:1:144;4481:16;;4474:27;4251:258::o;4514:317::-;4556:3;4594:5;4588:12;4621:6;4616:3;4609:19;4637:63;4693:6;4686:4;4681:3;4677:14;4670:4;4663:5;4659:16;4637:63;:::i;:::-;4745:2;4733:15;4750:66;4729:88;4720:98;;;;4820:4;4716:109;;4514:317;-1:-1:-1;;4514:317:144:o;4836:220::-;4985:2;4974:9;4967:21;4948:4;5005:45;5046:2;5035:9;5031:18;5023:6;5005:45;:::i;5253:180::-;5312:6;5365:2;5353:9;5344:7;5340:23;5336:32;5333:52;;;5381:1;5378;5371:12;5333:52;-1:-1:-1;5404:23:144;;5253:180;-1:-1:-1;5253:180:144:o;5438:374::-;5537:6;5590:2;5578:9;5569:7;5565:23;5561:32;5558:52;;;5606:1;5603;5596:12;5558:52;5646:9;5633:23;5679:18;5671:6;5668:30;5665:50;;;5711:1;5708;5701:12;5665:50;5734:72;5798:7;5789:6;5778:9;5774:22;5734:72;:::i;:::-;5724:82;5438:374;-1:-1:-1;;;;5438:374:144:o;6257:171::-;6324:20;;6384:18;6373:30;;6363:41;;6353:69;;6418:1;6415;6408:12;6353:69;6257:171;;;:::o;6433:184::-;6491:6;6544:2;6532:9;6523:7;6519:23;6515:32;6512:52;;;6560:1;6557;6550:12;6512:52;6583:28;6601:9;6583:28;:::i;6827:601::-;6976:6;6984;6992;7045:2;7033:9;7024:7;7020:23;7016:32;7013:52;;;7061:1;7058;7051:12;7013:52;7100:9;7087:23;7119:31;7144:5;7119:31;:::i;:::-;7169:5;-1:-1:-1;7226:2:144;7211:18;;7198:32;7239:33;7198:32;7239:33;:::i;:::-;7291:7;-1:-1:-1;7350:2:144;7335:18;;7322:32;7363:33;7322:32;7363:33;:::i;:::-;7415:7;7405:17;;;6827:601;;;;;:::o;8244:118::-;8330:5;8323:13;8316:21;8309:5;8306:32;8296:60;;8352:1;8349;8342:12;8367:732;8467:6;8475;8483;8491;8499;8552:3;8540:9;8531:7;8527:23;8523:33;8520:53;;;8569:1;8566;8559:12;8520:53;8608:9;8595:23;8627:31;8652:5;8627:31;:::i;:::-;8677:5;-1:-1:-1;8729:2:144;8714:18;;8701:32;;-1:-1:-1;8752:37:144;8785:2;8770:18;;8752:37;:::i;:::-;8742:47;;8841:2;8830:9;8826:18;8813:32;8854:30;8876:7;8854:30;:::i;:::-;8903:7;-1:-1:-1;8961:3:144;8946:19;;8933:33;8989:18;8978:30;;8975:50;;;9021:1;9018;9011:12;8975:50;9044:49;9085:7;9076:6;9065:9;9061:22;9044:49;:::i;:::-;9034:59;;;8367:732;;;;;;;;:::o;9104:642::-;9367:6;9362:3;9355:19;9404:6;9399:2;9394:3;9390:12;9383:28;9463:66;9454:6;9449:3;9445:16;9441:89;9436:2;9431:3;9427:12;9420:111;9584:6;9577:14;9570:22;9565:3;9561:32;9556:2;9551:3;9547:12;9540:54;9337:3;9623:6;9617:13;9639:60;9692:6;9687:2;9682:3;9678:12;9673:2;9665:6;9661:15;9639:60;:::i;:::-;9719:16;;;;9737:2;9715:25;;9104:642;-1:-1:-1;;;;;;9104:642:144:o;9974:251::-;10044:6;10097:2;10085:9;10076:7;10072:23;10068:32;10065:52;;;10113:1;10110;10103:12;10065:52;10145:9;10139:16;10164:31;10189:5;10164:31;:::i;10844:192::-;10923:13;;10976:34;10965:46;;10955:57;;10945:85;;11026:1;11023;11016:12;11041:616;11144:6;11197:2;11185:9;11176:7;11172:23;11168:32;11165:52;;;11213:1;11210;11203:12;11165:52;11246:2;11240:9;11288:2;11280:6;11276:15;11357:6;11345:10;11342:22;11321:18;11309:10;11306:34;11303:62;11300:88;;;11368:18;;:::i;:::-;11404:2;11397:22;11443:16;;11428:32;;11493:49;11538:2;11523:18;;11493:49;:::i;:::-;11488:2;11480:6;11476:15;11469:74;11576:49;11621:2;11610:9;11606:18;11576:49;:::i;:::-;11571:2;11559:15;;11552:74;11563:6;11041:616;-1:-1:-1;;;11041:616:144:o;11662:647::-;11755:6;11808:3;11796:9;11787:7;11783:23;11779:33;11776:53;;;11825:1;11822;11815:12;11776:53;11858:2;11852:9;11900:3;11892:6;11888:16;11970:6;11958:10;11955:22;11934:18;11922:10;11919:34;11916:62;11913:88;;;11981:18;;:::i;:::-;12021:10;12017:2;12010:22;;12069:9;12056:23;12048:6;12041:39;12141:2;12130:9;12126:18;12113:32;12108:2;12100:6;12096:15;12089:57;12207:2;12196:9;12192:18;12179:32;12174:2;12166:6;12162:15;12155:57;12273:2;12262:9;12258:18;12245:32;12240:2;12232:6;12228:15;12221:57;12297:6;12287:16;;;11662:647;;;;:::o;13806:934::-;13942:9;13976:18;14017:2;14009:6;14006:14;14003:40;;;14023:18;;:::i;:::-;14069:6;14066:1;14062:14;14095:4;14119:28;14143:2;14139;14135:11;14119:28;:::i;:::-;14181:19;;;14251:14;;;;14216:12;;;;14288:14;14277:26;;14274:46;;;14316:1;14313;14306:12;14274:46;14340:5;14354:353;14370:6;14365:3;14362:15;14354:353;;;14456:3;14443:17;14492:2;14479:11;14476:19;14473:109;;;14536:1;14565:2;14561;14554:14;14473:109;14607:57;14649:14;14635:11;14628:5;14624:23;14607:57;:::i;:::-;14595:70;;-1:-1:-1;14685:12:144;;;;14387;;14354:353;;;-1:-1:-1;14729:5:144;13806:934;-1:-1:-1;;;;;;;13806:934:144:o;15164:245::-;15231:6;15284:2;15272:9;15263:7;15259:23;15255:32;15252:52;;;15300:1;15297;15290:12;15252:52;15332:9;15326:16;15351:28;15373:5;15351:28;:::i;16265:184::-;16335:6;16388:2;16376:9;16367:7;16363:23;16359:32;16356:52;;;16404:1;16401;16394:12;16356:52;-1:-1:-1;16427:16:144;;16265:184;-1:-1:-1;16265:184:144:o;18796:::-;18848:77;18845:1;18838:88;18945:4;18942:1;18935:15;18969:4;18966:1;18959:15;18985:270;19024:7;19056:18;19101:2;19098:1;19094:10;19131:2;19128:1;19124:10;19187:3;19183:2;19179:12;19174:3;19171:21;19164:3;19157:11;19150:19;19146:47;19143:73;;;19196:18;;:::i;:::-;19236:13;;18985:270;-1:-1:-1;;;;18985:270:144:o;19260:236::-;19299:3;19327:18;19372:2;19369:1;19365:10;19402:2;19399:1;19395:10;19433:3;19429:2;19425:12;19420:3;19417:21;19414:47;;;19441:18;;:::i;:::-;19477:13;;19260:236;-1:-1:-1;;;;19260:236:144:o;20115:125::-;20155:4;20183:1;20180;20177:8;20174:34;;;20188:18;;:::i;:::-;-1:-1:-1;20225:9:144;;20115:125::o;20245:184::-;20297:77;20294:1;20287:88;20394:4;20391:1;20384:15;20418:4;20415:1;20408:15;20434:308;20473:1;20499;20489:35;;20504:18;;:::i;:::-;20621:66;20618:1;20615:73;20546:66;20543:1;20540:73;20536:153;20533:179;;;20692:18;;:::i;:::-;-1:-1:-1;20726:10:144;;20434:308::o;20747:369::-;20786:4;20822:1;20819;20815:9;20931:1;20863:66;20859:74;20856:1;20852:82;20847:2;20840:10;20836:99;20833:125;;;20938:18;;:::i;:::-;21057:1;20989:66;20985:74;20982:1;20978:82;20974:2;20970:91;20967:117;;;21064:18;;:::i;:::-;-1:-1:-1;;21101:9:144;;20747:369::o;21121:655::-;21160:7;21192:66;21284:1;21281;21277:9;21312:1;21309;21305:9;21357:1;21353:2;21349:10;21346:1;21343:17;21338:2;21334;21330:11;21326:35;21323:61;;;21364:18;;:::i;:::-;21403:66;21495:1;21492;21488:9;21542:1;21538:2;21533:11;21530:1;21526:19;21521:2;21517;21513:11;21509:37;21506:63;;;21549:18;;:::i;:::-;21595:1;21592;21588:9;21578:19;;21642:1;21638:2;21633:11;21630:1;21626:19;21621:2;21617;21613:11;21609:37;21606:63;;;21649:18;;:::i;:::-;21714:1;21710:2;21705:11;21702:1;21698:19;21693:2;21689;21685:11;21681:37;21678:63;;;21721:18;;:::i;:::-;-1:-1:-1;;;21761:9:144;;;;;21121:655;-1:-1:-1;;;21121:655:144:o;21781:367::-;21820:3;21855:1;21852;21848:9;21964:1;21896:66;21892:74;21889:1;21885:82;21880:2;21873:10;21869:99;21866:125;;;21971:18;;:::i;:::-;22090:1;22022:66;22018:74;22015:1;22011:82;22007:2;22003:91;22000:117;;;22097:18;;:::i;:::-;-1:-1:-1;;22133:9:144;;21781:367::o;22153:228::-;22193:7;22319:1;22251:66;22247:74;22244:1;22241:81;22236:1;22229:9;22222:17;22218:105;22215:131;;;22326:18;;:::i;:::-;-1:-1:-1;22366:9:144;;22153:228::o;22386:120::-;22426:1;22452;22442:35;;22457:18;;:::i;:::-;-1:-1:-1;22491:9:144;;22386:120::o;22907:656::-;23194:6;23183:9;23176:25;23157:4;23220:42;23310:2;23302:6;23298:15;23293:2;23282:9;23278:18;23271:43;23362:2;23354:6;23350:15;23345:2;23334:9;23330:18;23323:43;;23402:6;23397:2;23386:9;23382:18;23375:34;23446:6;23440:3;23429:9;23425:19;23418:35;23490:3;23484;23473:9;23469:19;23462:32;23511:46;23552:3;23541:9;23537:19;23529:6;23511:46;:::i;:::-;23503:54;22907:656;-1:-1:-1;;;;;;;;22907:656:144:o;23568:128::-;23608:3;23639:1;23635:6;23632:1;23629:13;23626:39;;;23645:18;;:::i;:::-;-1:-1:-1;23681:9:144;;23568:128::o;24113:167::-;24191:13;;24244:10;24233:22;;24223:33;;24213:61;;24270:1;24267;24260:12;24285:160;24362:13;;24415:4;24404:16;;24394:27;;24384:55;;24435:1;24432;24425:12;24450:888;24553:6;24606:3;24594:9;24585:7;24581:23;24577:33;24574:53;;;24623:1;24620;24613:12;24574:53;24656:2;24650:9;24698:3;24690:6;24686:16;24768:6;24756:10;24753:22;24732:18;24720:10;24717:34;24714:62;24711:88;;;24779:18;;:::i;:::-;24815:2;24808:22;24854:39;24883:9;24854:39;:::i;:::-;24846:6;24839:55;24927:47;24970:2;24959:9;24955:18;24927:47;:::i;:::-;24922:2;24914:6;24910:15;24903:72;25008:47;25051:2;25040:9;25036:18;25008:47;:::i;:::-;25003:2;24995:6;24991:15;24984:72;25089:48;25133:2;25122:9;25118:18;25089:48;:::i;:::-;25084:2;25076:6;25072:15;25065:73;25172:49;25216:3;25205:9;25201:19;25172:49;:::i;:::-;25166:3;25158:6;25154:16;25147:75;25256:50;25301:3;25290:9;25286:19;25256:50;:::i;:::-;25250:3;25238:16;;25231:76;25242:6;24450:888;-1:-1:-1;;;24450:888:144:o;25343:195::-;25382:3;25413:66;25406:5;25403:77;25400:103;;25483:18;;:::i;:::-;-1:-1:-1;25530:1:144;25519:13;;25343:195::o;26080:184::-;26132:77;26129:1;26122:88;26229:4;26226:1;26219:15;26253:4;26250:1;26243:15;28712:157;28742:1;28776:4;28773:1;28769:12;28800:3;28790:37;;28807:18;;:::i;:::-;28859:3;28852:4;28849:1;28845:12;28841:22;28836:27;;;28712:157;;;;:::o;28874:195::-;28912:4;28949;28946:1;28942:12;28981:4;28978:1;28974:12;29006:3;29001;28998:12;28995:38;;;29013:18;;:::i;:::-;29050:13;;;28874:195;-1:-1:-1;;;28874:195:144:o;32694:184::-;32746:77;32743:1;32736:88;32843:4;32840:1;32833:15;32867:4;32864:1;32857:15",
+    "linkReferences": {}
+  },
+  "methodIdentifiers": {
+    "depositTransaction(address,uint256,uint64,bool,bytes)": "e9e05c42",
+    "donateETH()": "8b4c40b0",
+    "finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))": "8c3152e9",
+    "finalizedWithdrawals(bytes32)": "a14238e7",
+    "guardian()": "452a9320",
+    "initialize(address,address,address)": "c0c53b8b",
+    "isOutputFinalized(uint256)": "6dbffb78",
+    "l2Oracle()": "9b5f694a",
+    "l2Sender()": "9bf62d82",
+    "minimumGasLimit(uint64)": "a35d99df",
+    "params()": "cff0ab96",
+    "paused()": "5c975abb",
+    "proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])": "4870496f",
+    "provenWithdrawals(bytes32)": "e965084c",
+    "superchainConfig()": "35e80ab3",
+    "systemConfig()": "33d7e2bd",
+    "version()": "54fd4d50"
+  },
+  "rawMetadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadTarget\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CallPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasEstimation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LargeCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfGas\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SmallGasLimit\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"opaqueData\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"WithdrawalProven\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"donateETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Types.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"guardian\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract L2OutputOracle\",\"name\":\"_l2Oracle\",\"type\":\"address\"},{\"internalType\":\"contract SystemConfig\",\"name\":\"_systemConfig\",\"type\":\"address\"},{\"internalType\":\"contract SuperchainConfig\",\"name\":\"_superchainConfig\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"}],\"name\":\"isOutputFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Oracle\",\"outputs\":[{\"internalType\":\"contract L2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_byteCount\",\"type\":\"uint64\"}],\"name\":\"minimumGasLimit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"paused_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Types.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"struct Types.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\"}],\"name\":\"proveWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"provenWithdrawals\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2OutputIndex\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superchainConfig\",\"outputs\":[{\"internalType\":\"contract SuperchainConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"systemConfig\",\"outputs\":[{\"internalType\":\"contract SystemConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"custom:proxied\":\"@title OptimismPortal\",\"events\":{\"TransactionDeposited(address,address,uint256,bytes)\":{\"params\":{\"from\":\"Address that triggered the deposit transaction.\",\"opaqueData\":\"ABI encoded deposit data to be parsed off-chain.\",\"to\":\"Address that the deposit transaction is directed to.\",\"version\":\"Version of this deposit transaction event.\"}},\"WithdrawalFinalized(bytes32,bool)\":{\"params\":{\"success\":\"Whether the withdrawal transaction was successful.\",\"withdrawalHash\":\"Hash of the withdrawal transaction.\"}},\"WithdrawalProven(bytes32,address,address)\":{\"params\":{\"from\":\"Address that triggered the withdrawal transaction.\",\"to\":\"Address that the withdrawal transaction is directed to.\",\"withdrawalHash\":\"Hash of the withdrawal transaction.\"}}},\"kind\":\"dev\",\"methods\":{\"depositTransaction(address,uint256,uint64,bool,bytes)\":{\"params\":{\"_data\":\"Data to trigger the recipient with.\",\"_gasLimit\":\"Amount of L2 gas to purchase by burning gas on L1.\",\"_isCreation\":\"Whether or not the transaction is a contract creation.\",\"_to\":\"Target address on L2.\",\"_value\":\"ETH value to send to the recipient.\"}},\"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))\":{\"params\":{\"_tx\":\"Withdrawal transaction to finalize.\"}},\"guardian()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Address of the guardian.\"}},\"initialize(address,address,address)\":{\"params\":{\"_l2Oracle\":\"Contract of the L2OutputOracle.\",\"_superchainConfig\":\"Contract of the SuperchainConfig.\",\"_systemConfig\":\"Contract of the SystemConfig.\"}},\"isOutputFinalized(uint256)\":{\"params\":{\"_l2OutputIndex\":\"Index of the L2 output to check.\"},\"returns\":{\"_0\":\"Whether or not the output is finalized.\"}},\"minimumGasLimit(uint64)\":{\"params\":{\"_byteCount\":\"Number of bytes in the calldata.\"},\"returns\":{\"_0\":\"The minimum gas limit for a deposit.\"}},\"paused()\":{\"returns\":{\"paused_\":\"Whether or not the contract is paused.\"}},\"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])\":{\"params\":{\"_l2OutputIndex\":\"L2 output index to prove against.\",\"_outputRootProof\":\"Inclusion proof of the L2ToL1MessagePasser contract's storage root.\",\"_tx\":\"Withdrawal transaction to finalize.\",\"_withdrawalProof\":\"Inclusion proof of the withdrawal in L2ToL1MessagePasser contract.\"}}},\"stateVariables\":{\"l2Oracle\":{\"custom:network-specific\":\"\"},\"spacer_53_0_1\":{\"custom:legacy\":\"@custom:spacer paused\"},\"systemConfig\":{\"custom:network-specific\":\"\"},\"version\":{\"custom:semver\":\"2.6.0\"}},\"version\":1},\"userdoc\":{\"errors\":{\"BadTarget()\":[{\"notice\":\"Error for when a deposit or withdrawal is to a bad target.\"}],\"CallPaused()\":[{\"notice\":\"Error for when a method cannot be called when paused. This could be renamed         to `Paused` in the future, but it collides with the `Paused` event.\"}],\"GasEstimation()\":[{\"notice\":\"Error for special gas estimation.\"}],\"LargeCalldata()\":[{\"notice\":\"Error for when a deposit has too much calldata.\"}],\"OutOfGas()\":[{\"notice\":\"Error returned when too much gas resource is consumed.\"}],\"SmallGasLimit()\":[{\"notice\":\"Error for when a deposit has too small of a gas limit.\"}]},\"events\":{\"TransactionDeposited(address,address,uint256,bytes)\":{\"notice\":\"Emitted when a transaction is deposited from L1 to L2.         The parameters of this event are read by the rollup node and used to derive deposit         transactions on L2.\"},\"WithdrawalFinalized(bytes32,bool)\":{\"notice\":\"Emitted when a withdrawal transaction is finalized.\"},\"WithdrawalProven(bytes32,address,address)\":{\"notice\":\"Emitted when a withdrawal transaction is proven.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Constructs the OptimismPortal contract.\"},\"depositTransaction(address,uint256,uint64,bool,bytes)\":{\"notice\":\"Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in         deriving deposit transactions. Note that if a deposit is made by a contract, its         address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider         using the CrossDomainMessenger contracts for a simpler developer experience.\"},\"donateETH()\":{\"notice\":\"Accepts ETH value without triggering a deposit to L2.         This function mainly exists for the sake of the migration between the legacy         Optimism system and Bedrock.\"},\"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))\":{\"notice\":\"Finalizes a withdrawal transaction.\"},\"finalizedWithdrawals(bytes32)\":{\"notice\":\"A list of withdrawal hashes which have been successfully finalized.\"},\"guardian()\":{\"notice\":\"Getter function for the address of the guardian.         Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead.\"},\"initialize(address,address,address)\":{\"notice\":\"Initializer.\"},\"isOutputFinalized(uint256)\":{\"notice\":\"Determine if a given output is finalized.         Reverts if the call to l2Oracle.getL2Output reverts.         Returns a boolean otherwise.\"},\"l2Oracle()\":{\"notice\":\"Contract of the L2OutputOracle.\"},\"l2Sender()\":{\"notice\":\"Address of the L2 account which initiated a withdrawal in this transaction.         If the of this variable is the default L2 sender address, then we are NOT inside of         a call to finalizeWithdrawalTransaction.\"},\"minimumGasLimit(uint64)\":{\"notice\":\"Computes the minimum gas limit for a deposit.         The minimum gas limit linearly increases based on the size of the calldata.         This is to prevent users from creating L2 resource usage without paying for it.         This function can be used when interacting with the portal to ensure forwards         compatibility.\"},\"params()\":{\"notice\":\"EIP-1559 style gas parameters.\"},\"paused()\":{\"notice\":\"Getter for the current paused status.\"},\"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])\":{\"notice\":\"Proves a withdrawal transaction.\"},\"provenWithdrawals(bytes32)\":{\"notice\":\"A mapping of withdrawal hashes to `ProvenWithdrawal` data.\"},\"superchainConfig()\":{\"notice\":\"Contract of the Superchain Config.\"},\"systemConfig()\":{\"notice\":\"Contract of the SystemConfig.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"The OptimismPortal is a low-level contract responsible for passing messages between L1         and L2. Messages sent directly to the OptimismPortal have no form of replayability.         Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L1/OptimismPortal.sol\":\"OptimismPortal\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"src/L1/L2OutputOracle.sol\":{\"keccak256\":\"0x342c5084f3c640c90530122bd78372c011d6162e698dd8c8daec9496fef01d42\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8700a3d486bd62cbb861ff80175b8040336940515791073af6a036db7c2df303\",\"dweb:/ipfs/QmSGKTH84rVHWgMg4d6GQZCmCJ16KuUuTsMwPMDdJxCsww\"]},\"src/L1/OptimismPortal.sol\":{\"keccak256\":\"0xf46a1158e86edcbb157d0b06a32db37867c0bc9d2aeeed6a8110547c7537201a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0aeb33d425db200953063e3576403b78c50e3a5e7b4f56ef4bead28919406ee2\",\"dweb:/ipfs/QmUFb1rEQnCFrGRZQPHgFFWJQ48SR7wodiSFLgQKu8Jx6k\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409\",\"dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM\"]},\"src/L1/SuperchainConfig.sol\":{\"keccak256\":\"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f\",\"dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB\"]},\"src/L1/SystemConfig.sol\":{\"keccak256\":\"0x9fc3eea49452ba145bb53cb20e43ab84f5963fc909ca3c2904d1e3642500cf14\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0dde5981a89741badca37053cdda5bfdbe549e7ada4d983794290d1a80e45071\",\"dweb:/ipfs/QmNo8SHsx89SZrUqLcyUEbgw34SS4LEDZ4qXTZxzhuBV7M\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72\",\"dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Bytes.sol\":{\"keccak256\":\"0x827f47d123b0fdf3b08816d5b33831811704dbf4e554e53f2269354f6bba8859\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3137ac7204d30a245a8b0d67aa6da5286f1bd8c90379daab561f84963b6db782\",\"dweb:/ipfs/QmWRhisw3axJK833gUScs23ETh2MLFbVzzqzYVMKSDN3S9\"]},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b\",\"dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp\"]},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0x5586d9715d8fbdd48245220f13a96573555fd847a333869e862ae186802e0311\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f34dbd5a0a8918120e226f549a8337bd6fc7176653159a85929ce6fe3d66e11\",\"dweb:/ipfs/QmQKnhRPMnhKBRLmV2C1BqAsPpQg8xVFXi7ZLuHU9XQ1BE\"]},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12\",\"dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF\"]},\"src/libraries/PortalErrors.sol\":{\"keccak256\":\"0x57adcaa45a1ce9c5af04d0fe4ecbc86e6ff3f947f7957ab55bdade129adcf558\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3cf485f11085ad6d1ba1386fdb340f65eb1048187692ad3d9eb8816e290140c1\",\"dweb:/ipfs/Qmb423b45TLV8PdhFa8Hs72eom5D2C5q4gVcYGNzDh4EMU\"]},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"]},\"src/libraries/Storage.sol\":{\"keccak256\":\"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269\",\"dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/libraries/rlp/RLPReader.sol\":{\"keccak256\":\"0x99731a39bc10203719d448117b0e6ef47771890440d595d118084d7988d59afb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1dbeb75d0cc8de58350cc15df8867bf97d8492e0617b1c62733ace6155c6915a\",\"dweb:/ipfs/QmNiXzskPE72h93F8EXT8wAXKzEh2EERLbubdVMfwTQbtj\"]},\"src/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b\",\"dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV\"]},\"src/libraries/trie/MerkleTrie.sol\":{\"keccak256\":\"0xf8ba770ee6666e73ae43184c700e9c704b2c4ace71f9e3c2227ddc11a8148b4c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4702ccee1fe44aea3ee01d59e6152eb755da083f786f00947fec4437c064fe74\",\"dweb:/ipfs/QmQjFj5J7hrEM1dxJjFszzW2Cs7g7eMhYNBXonF2DXBstE\"]},\"src/libraries/trie/SecureMerkleTrie.sol\":{\"keccak256\":\"0xeaff8315cfd21197bc6bc859c2decf5d4f4838c9c357c502cdf2b1eac863d288\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://79dcdcaa560aea51d138da4f5dc553a1808b6de090b2dc1629f18375edbff681\",\"dweb:/ipfs/QmbE4pUPhf5fLKW4W6cEjhQs55gEDvHmbmoBqkW1yz3bnw\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"src/vendor/AddressAliasHelper.sol\":{\"keccak256\":\"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88\",\"dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR\"]}},\"version\":1}",
+  "metadata": {
+    "compiler": {
+      "version": "0.8.15+commit.e14f2714"
+    },
+    "language": "Solidity",
+    "output": {
+      "abi": [
+        {
+          "inputs": [],
+          "stateMutability": "nonpayable",
+          "type": "constructor"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "BadTarget"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "CallPaused"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "GasEstimation"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "LargeCalldata"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "OutOfGas"
+        },
+        {
+          "inputs": [],
+          "type": "error",
+          "name": "SmallGasLimit"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "uint8",
+              "name": "version",
+              "type": "uint8",
+              "indexed": false
+            }
+          ],
+          "type": "event",
+          "name": "Initialized",
+          "anonymous": false
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address",
+              "name": "from",
+              "type": "address",
+              "indexed": true
+            },
+            {
+              "internalType": "address",
+              "name": "to",
+              "type": "address",
+              "indexed": true
+            },
+            {
+              "internalType": "uint256",
+              "name": "version",
+              "type": "uint256",
+              "indexed": true
+            },
+            {
+              "internalType": "bytes",
+              "name": "opaqueData",
+              "type": "bytes",
+              "indexed": false
+            }
+          ],
+          "type": "event",
+          "name": "TransactionDeposited",
+          "anonymous": false
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes32",
+              "name": "withdrawalHash",
+              "type": "bytes32",
+              "indexed": true
+            },
+            {
+              "internalType": "bool",
+              "name": "success",
+              "type": "bool",
+              "indexed": false
+            }
+          ],
+          "type": "event",
+          "name": "WithdrawalFinalized",
+          "anonymous": false
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes32",
+              "name": "withdrawalHash",
+              "type": "bytes32",
+              "indexed": true
+            },
+            {
+              "internalType": "address",
+              "name": "from",
+              "type": "address",
+              "indexed": true
+            },
+            {
+              "internalType": "address",
+              "name": "to",
+              "type": "address",
+              "indexed": true
+            }
+          ],
+          "type": "event",
+          "name": "WithdrawalProven",
+          "anonymous": false
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "address",
+              "name": "_to",
+              "type": "address"
+            },
+            {
+              "internalType": "uint256",
+              "name": "_value",
+              "type": "uint256"
+            },
+            {
+              "internalType": "uint64",
+              "name": "_gasLimit",
+              "type": "uint64"
+            },
+            {
+              "internalType": "bool",
+              "name": "_isCreation",
+              "type": "bool"
+            },
+            {
+              "internalType": "bytes",
+              "name": "_data",
+              "type": "bytes"
+            }
+          ],
+          "stateMutability": "payable",
+          "type": "function",
+          "name": "depositTransaction"
+        },
+        {
+          "inputs": [],
+          "stateMutability": "payable",
+          "type": "function",
+          "name": "donateETH"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "struct Types.WithdrawalTransaction",
+              "name": "_tx",
+              "type": "tuple",
+              "components": [
+                {
+                  "internalType": "uint256",
+                  "name": "nonce",
+                  "type": "uint256"
+                },
+                {
+                  "internalType": "address",
+                  "name": "sender",
+                  "type": "address"
+                },
+                {
+                  "internalType": "address",
+                  "name": "target",
+                  "type": "address"
+                },
+                {
+                  "internalType": "uint256",
+                  "name": "value",
+                  "type": "uint256"
+                },
+                {
+                  "internalType": "uint256",
+                  "name": "gasLimit",
+                  "type": "uint256"
+                },
+                {
+                  "internalType": "bytes",
+                  "name": "data",
+                  "type": "bytes"
+                }
+              ]
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "finalizeWithdrawalTransaction"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes32",
+              "name": "",
+              "type": "bytes32"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "finalizedWithdrawals",
+          "outputs": [
+            {
+              "internalType": "bool",
+              "name": "",
+              "type": "bool"
+            }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "guardian",
+          "outputs": [
+            {
+              "internalType": "address",
+              "name": "",
+              "type": "address"
+            }
+          ]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "contract L2OutputOracle",
+              "name": "_l2Oracle",
+              "type": "address"
+            },
+            {
+              "internalType": "contract SystemConfig",
+              "name": "_systemConfig",
+              "type": "address"
+            },
+            {
+              "internalType": "contract SuperchainConfig",
+              "name": "_superchainConfig",
+              "type": "address"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "initialize"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "uint256",
+              "name": "_l2OutputIndex",
+              "type": "uint256"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "isOutputFinalized",
+          "outputs": [
+            {
+              "internalType": "bool",
+              "name": "",
+              "type": "bool"
+            }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "l2Oracle",
+          "outputs": [
+            {
+              "internalType": "contract L2OutputOracle",
+              "name": "",
+              "type": "address"
+            }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "l2Sender",
+          "outputs": [
+            {
+              "internalType": "address",
+              "name": "",
+              "type": "address"
+            }
+          ]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "uint64",
+              "name": "_byteCount",
+              "type": "uint64"
+            }
+          ],
+          "stateMutability": "pure",
+          "type": "function",
+          "name": "minimumGasLimit",
+          "outputs": [
+            {
+              "internalType": "uint64",
+              "name": "",
+              "type": "uint64"
+            }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "params",
+          "outputs": [
+            {
+              "internalType": "uint128",
+              "name": "prevBaseFee",
+              "type": "uint128"
+            },
+            {
+              "internalType": "uint64",
+              "name": "prevBoughtGas",
+              "type": "uint64"
+            },
+            {
+              "internalType": "uint64",
+              "name": "prevBlockNum",
+              "type": "uint64"
+            }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "paused",
+          "outputs": [
+            {
+              "internalType": "bool",
+              "name": "paused_",
+              "type": "bool"
+            }
+          ]
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "struct Types.WithdrawalTransaction",
+              "name": "_tx",
+              "type": "tuple",
+              "components": [
+                {
+                  "internalType": "uint256",
+                  "name": "nonce",
+                  "type": "uint256"
+                },
+                {
+                  "internalType": "address",
+                  "name": "sender",
+                  "type": "address"
+                },
+                {
+                  "internalType": "address",
+                  "name": "target",
+                  "type": "address"
+                },
+                {
+                  "internalType": "uint256",
+                  "name": "value",
+                  "type": "uint256"
+                },
+                {
+                  "internalType": "uint256",
+                  "name": "gasLimit",
+                  "type": "uint256"
+                },
+                {
+                  "internalType": "bytes",
+                  "name": "data",
+                  "type": "bytes"
+                }
+              ]
+            },
+            {
+              "internalType": "uint256",
+              "name": "_l2OutputIndex",
+              "type": "uint256"
+            },
+            {
+              "internalType": "struct Types.OutputRootProof",
+              "name": "_outputRootProof",
+              "type": "tuple",
+              "components": [
+                {
+                  "internalType": "bytes32",
+                  "name": "version",
+                  "type": "bytes32"
+                },
+                {
+                  "internalType": "bytes32",
+                  "name": "stateRoot",
+                  "type": "bytes32"
+                },
+                {
+                  "internalType": "bytes32",
+                  "name": "messagePasserStorageRoot",
+                  "type": "bytes32"
+                },
+                {
+                  "internalType": "bytes32",
+                  "name": "latestBlockhash",
+                  "type": "bytes32"
+                }
+              ]
+            },
+            {
+              "internalType": "bytes[]",
+              "name": "_withdrawalProof",
+              "type": "bytes[]"
+            }
+          ],
+          "stateMutability": "nonpayable",
+          "type": "function",
+          "name": "proveWithdrawalTransaction"
+        },
+        {
+          "inputs": [
+            {
+              "internalType": "bytes32",
+              "name": "",
+              "type": "bytes32"
+            }
+          ],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "provenWithdrawals",
+          "outputs": [
+            {
+              "internalType": "bytes32",
+              "name": "outputRoot",
+              "type": "bytes32"
+            },
+            {
+              "internalType": "uint128",
+              "name": "timestamp",
+              "type": "uint128"
+            },
+            {
+              "internalType": "uint128",
+              "name": "l2OutputIndex",
+              "type": "uint128"
+            }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "superchainConfig",
+          "outputs": [
+            {
+              "internalType": "contract SuperchainConfig",
+              "name": "",
+              "type": "address"
+            }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "systemConfig",
+          "outputs": [
+            {
+              "internalType": "contract SystemConfig",
+              "name": "",
+              "type": "address"
+            }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "view",
+          "type": "function",
+          "name": "version",
+          "outputs": [
+            {
+              "internalType": "string",
+              "name": "",
+              "type": "string"
+            }
+          ]
+        },
+        {
+          "inputs": [],
+          "stateMutability": "payable",
+          "type": "receive"
+        }
+      ],
+      "devdoc": {
+        "kind": "dev",
+        "methods": {
+          "depositTransaction(address,uint256,uint64,bool,bytes)": {
+            "params": {
+              "_data": "Data to trigger the recipient with.",
+              "_gasLimit": "Amount of L2 gas to purchase by burning gas on L1.",
+              "_isCreation": "Whether or not the transaction is a contract creation.",
+              "_to": "Target address on L2.",
+              "_value": "ETH value to send to the recipient."
+            }
+          },
+          "finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))": {
+            "params": {
+              "_tx": "Withdrawal transaction to finalize."
+            }
+          },
+          "guardian()": {
+            "custom:legacy": "",
+            "returns": {
+              "_0": "Address of the guardian."
+            }
+          },
+          "initialize(address,address,address)": {
+            "params": {
+              "_l2Oracle": "Contract of the L2OutputOracle.",
+              "_superchainConfig": "Contract of the SuperchainConfig.",
+              "_systemConfig": "Contract of the SystemConfig."
+            }
+          },
+          "isOutputFinalized(uint256)": {
+            "params": {
+              "_l2OutputIndex": "Index of the L2 output to check."
+            },
+            "returns": {
+              "_0": "Whether or not the output is finalized."
+            }
+          },
+          "minimumGasLimit(uint64)": {
+            "params": {
+              "_byteCount": "Number of bytes in the calldata."
+            },
+            "returns": {
+              "_0": "The minimum gas limit for a deposit."
+            }
+          },
+          "paused()": {
+            "returns": {
+              "paused_": "Whether or not the contract is paused."
+            }
+          },
+          "proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])": {
+            "params": {
+              "_l2OutputIndex": "L2 output index to prove against.",
+              "_outputRootProof": "Inclusion proof of the L2ToL1MessagePasser contract's storage root.",
+              "_tx": "Withdrawal transaction to finalize.",
+              "_withdrawalProof": "Inclusion proof of the withdrawal in L2ToL1MessagePasser contract."
+            }
+          }
+        },
+        "version": 1
+      },
+      "userdoc": {
+        "kind": "user",
+        "methods": {
+          "constructor": {
+            "notice": "Constructs the OptimismPortal contract."
+          },
+          "depositTransaction(address,uint256,uint64,bool,bytes)": {
+            "notice": "Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in         deriving deposit transactions. Note that if a deposit is made by a contract, its         address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider         using the CrossDomainMessenger contracts for a simpler developer experience."
+          },
+          "donateETH()": {
+            "notice": "Accepts ETH value without triggering a deposit to L2.         This function mainly exists for the sake of the migration between the legacy         Optimism system and Bedrock."
+          },
+          "finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))": {
+            "notice": "Finalizes a withdrawal transaction."
+          },
+          "finalizedWithdrawals(bytes32)": {
+            "notice": "A list of withdrawal hashes which have been successfully finalized."
+          },
+          "guardian()": {
+            "notice": "Getter function for the address of the guardian.         Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead."
+          },
+          "initialize(address,address,address)": {
+            "notice": "Initializer."
+          },
+          "isOutputFinalized(uint256)": {
+            "notice": "Determine if a given output is finalized.         Reverts if the call to l2Oracle.getL2Output reverts.         Returns a boolean otherwise."
+          },
+          "l2Oracle()": {
+            "notice": "Contract of the L2OutputOracle."
+          },
+          "l2Sender()": {
+            "notice": "Address of the L2 account which initiated a withdrawal in this transaction.         If the of this variable is the default L2 sender address, then we are NOT inside of         a call to finalizeWithdrawalTransaction."
+          },
+          "minimumGasLimit(uint64)": {
+            "notice": "Computes the minimum gas limit for a deposit.         The minimum gas limit linearly increases based on the size of the calldata.         This is to prevent users from creating L2 resource usage without paying for it.         This function can be used when interacting with the portal to ensure forwards         compatibility."
+          },
+          "params()": {
+            "notice": "EIP-1559 style gas parameters."
+          },
+          "paused()": {
+            "notice": "Getter for the current paused status."
+          },
+          "proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])": {
+            "notice": "Proves a withdrawal transaction."
+          },
+          "provenWithdrawals(bytes32)": {
+            "notice": "A mapping of withdrawal hashes to `ProvenWithdrawal` data."
+          },
+          "superchainConfig()": {
+            "notice": "Contract of the Superchain Config."
+          },
+          "systemConfig()": {
+            "notice": "Contract of the SystemConfig."
+          },
+          "version()": {
+            "notice": "Semantic version."
+          }
+        },
+        "version": 1
+      }
+    },
+    "settings": {
+      "remappings": [
+        "@lib-keccak/=lib/lib-keccak/contracts/lib/",
+        "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
+        "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
+        "@rari-capital/solmate/=lib/solmate/",
+        "@solady-test/=lib/lib-keccak/lib/solady/test/",
+        "@solady/=lib/solady/src/",
+        "ds-test/=lib/forge-std/lib/ds-test/src/",
+        "forge-std/=lib/forge-std/src/",
+        "kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/",
+        "lib-keccak/=lib/lib-keccak/contracts/",
+        "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
+        "openzeppelin-contracts/=lib/openzeppelin-contracts/",
+        "safe-contracts/=lib/safe-contracts/contracts/",
+        "solady/=lib/solady/",
+        "solmate/=lib/solmate/src/"
+      ],
+      "optimizer": {
+        "enabled": true,
+        "runs": 999999
+      },
+      "metadata": {
+        "bytecodeHash": "none"
+      },
+      "compilationTarget": {
+        "src/L1/OptimismPortal.sol": "OptimismPortal"
+      },
+      "evmVersion": "london",
+      "libraries": {}
+    },
+    "sources": {
+      "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol": {
+        "keccak256": "0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888",
+        "urls": [
+          "bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a",
+          "dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol": {
+        "keccak256": "0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e",
+        "urls": [
+          "bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497",
+          "dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol": {
+        "keccak256": "0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3",
+        "urls": [
+          "bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4",
+          "dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol": {
+        "keccak256": "0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149",
+        "urls": [
+          "bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c",
+          "dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol": {
+        "keccak256": "0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66",
+        "urls": [
+          "bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f",
+          "dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/utils/Address.sol": {
+        "keccak256": "0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10",
+        "urls": [
+          "bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487",
+          "dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": {
+        "keccak256": "0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0",
+        "urls": [
+          "bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929",
+          "dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC"
+        ],
+        "license": "MIT"
+      },
+      "lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol": {
+        "keccak256": "0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7",
+        "urls": [
+          "bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689",
+          "dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy"
+        ],
+        "license": "MIT"
+      },
+      "lib/solmate/src/utils/FixedPointMathLib.sol": {
+        "keccak256": "0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d",
+        "urls": [
+          "bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c",
+          "dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8"
+        ],
+        "license": "MIT"
+      },
+      "src/L1/L2OutputOracle.sol": {
+        "keccak256": "0x342c5084f3c640c90530122bd78372c011d6162e698dd8c8daec9496fef01d42",
+        "urls": [
+          "bzz-raw://8700a3d486bd62cbb861ff80175b8040336940515791073af6a036db7c2df303",
+          "dweb:/ipfs/QmSGKTH84rVHWgMg4d6GQZCmCJ16KuUuTsMwPMDdJxCsww"
+        ],
+        "license": "MIT"
+      },
+      "src/L1/OptimismPortal.sol": {
+        "keccak256": "0xf46a1158e86edcbb157d0b06a32db37867c0bc9d2aeeed6a8110547c7537201a",
+        "urls": [
+          "bzz-raw://0aeb33d425db200953063e3576403b78c50e3a5e7b4f56ef4bead28919406ee2",
+          "dweb:/ipfs/QmUFb1rEQnCFrGRZQPHgFFWJQ48SR7wodiSFLgQKu8Jx6k"
+        ],
+        "license": "MIT"
+      },
+      "src/L1/ResourceMetering.sol": {
+        "keccak256": "0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408",
+        "urls": [
+          "bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409",
+          "dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM"
+        ],
+        "license": "MIT"
+      },
+      "src/L1/SuperchainConfig.sol": {
+        "keccak256": "0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d",
+        "urls": [
+          "bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f",
+          "dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB"
+        ],
+        "license": "MIT"
+      },
+      "src/L1/SystemConfig.sol": {
+        "keccak256": "0x9fc3eea49452ba145bb53cb20e43ab84f5963fc909ca3c2904d1e3642500cf14",
+        "urls": [
+          "bzz-raw://0dde5981a89741badca37053cdda5bfdbe549e7ada4d983794290d1a80e45071",
+          "dweb:/ipfs/QmNo8SHsx89SZrUqLcyUEbgw34SS4LEDZ4qXTZxzhuBV7M"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/Arithmetic.sol": {
+        "keccak256": "0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db",
+        "urls": [
+          "bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72",
+          "dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/Burn.sol": {
+        "keccak256": "0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010",
+        "urls": [
+          "bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f",
+          "dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/Bytes.sol": {
+        "keccak256": "0x827f47d123b0fdf3b08816d5b33831811704dbf4e554e53f2269354f6bba8859",
+        "urls": [
+          "bzz-raw://3137ac7204d30a245a8b0d67aa6da5286f1bd8c90379daab561f84963b6db782",
+          "dweb:/ipfs/QmWRhisw3axJK833gUScs23ETh2MLFbVzzqzYVMKSDN3S9"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/Constants.sol": {
+        "keccak256": "0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132",
+        "urls": [
+          "bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b",
+          "dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/Encoding.sol": {
+        "keccak256": "0x5586d9715d8fbdd48245220f13a96573555fd847a333869e862ae186802e0311",
+        "urls": [
+          "bzz-raw://3f34dbd5a0a8918120e226f549a8337bd6fc7176653159a85929ce6fe3d66e11",
+          "dweb:/ipfs/QmQKnhRPMnhKBRLmV2C1BqAsPpQg8xVFXi7ZLuHU9XQ1BE"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/Hashing.sol": {
+        "keccak256": "0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8",
+        "urls": [
+          "bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12",
+          "dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/PortalErrors.sol": {
+        "keccak256": "0x57adcaa45a1ce9c5af04d0fe4ecbc86e6ff3f947f7957ab55bdade129adcf558",
+        "urls": [
+          "bzz-raw://3cf485f11085ad6d1ba1386fdb340f65eb1048187692ad3d9eb8816e290140c1",
+          "dweb:/ipfs/Qmb423b45TLV8PdhFa8Hs72eom5D2C5q4gVcYGNzDh4EMU"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/SafeCall.sol": {
+        "keccak256": "0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f",
+        "urls": [
+          "bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a",
+          "dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/Storage.sol": {
+        "keccak256": "0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f",
+        "urls": [
+          "bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269",
+          "dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/Types.sol": {
+        "keccak256": "0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4",
+        "urls": [
+          "bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e",
+          "dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/rlp/RLPReader.sol": {
+        "keccak256": "0x99731a39bc10203719d448117b0e6ef47771890440d595d118084d7988d59afb",
+        "urls": [
+          "bzz-raw://1dbeb75d0cc8de58350cc15df8867bf97d8492e0617b1c62733ace6155c6915a",
+          "dweb:/ipfs/QmNiXzskPE72h93F8EXT8wAXKzEh2EERLbubdVMfwTQbtj"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/rlp/RLPWriter.sol": {
+        "keccak256": "0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6",
+        "urls": [
+          "bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b",
+          "dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/trie/MerkleTrie.sol": {
+        "keccak256": "0xf8ba770ee6666e73ae43184c700e9c704b2c4ace71f9e3c2227ddc11a8148b4c",
+        "urls": [
+          "bzz-raw://4702ccee1fe44aea3ee01d59e6152eb755da083f786f00947fec4437c064fe74",
+          "dweb:/ipfs/QmQjFj5J7hrEM1dxJjFszzW2Cs7g7eMhYNBXonF2DXBstE"
+        ],
+        "license": "MIT"
+      },
+      "src/libraries/trie/SecureMerkleTrie.sol": {
+        "keccak256": "0xeaff8315cfd21197bc6bc859c2decf5d4f4838c9c357c502cdf2b1eac863d288",
+        "urls": [
+          "bzz-raw://79dcdcaa560aea51d138da4f5dc553a1808b6de090b2dc1629f18375edbff681",
+          "dweb:/ipfs/QmbE4pUPhf5fLKW4W6cEjhQs55gEDvHmbmoBqkW1yz3bnw"
+        ],
+        "license": "MIT"
+      },
+      "src/universal/ISemver.sol": {
+        "keccak256": "0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44",
+        "urls": [
+          "bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a",
+          "dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"
+        ],
+        "license": "MIT"
+      },
+      "src/vendor/AddressAliasHelper.sol": {
+        "keccak256": "0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237",
+        "urls": [
+          "bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88",
+          "dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR"
+        ],
+        "license": "Apache-2.0"
+      }
+    },
+    "version": 1
+  },
+  "storageLayout": {
+    "storage": [
+      {
+        "astId": 43796,
+        "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+        "label": "_initialized",
+        "offset": 0,
+        "slot": "0",
+        "type": "t_uint8"
+      },
+      {
+        "astId": 43799,
+        "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+        "label": "_initializing",
+        "offset": 1,
+        "slot": "0",
+        "type": "t_bool"
+      },
+      {
+        "astId": 68030,
+        "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+        "label": "params",
+        "offset": 0,
+        "slot": "1",
+        "type": "t_struct(ResourceParams)68013_storage"
+      },
+      {
+        "astId": 68035,
+        "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+        "label": "__gap",
+        "offset": 0,
+        "slot": "2",
+        "type": "t_array(t_uint256)48_storage"
+      },
+      {
+        "astId": 66241,
+        "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+        "label": "l2Sender",
+        "offset": 0,
+        "slot": "50",
+        "type": "t_address"
+      },
+      {
+        "astId": 66246,
+        "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+        "label": "finalizedWithdrawals",
+        "offset": 0,
+        "slot": "51",
+        "type": "t_mapping(t_bytes32,t_bool)"
+      },
+      {
+        "astId": 66252,
+        "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+        "label": "provenWithdrawals",
+        "offset": 0,
+        "slot": "52",
+        "type": "t_mapping(t_bytes32,t_struct(ProvenWithdrawal)66230_storage)"
+      },
+      {
+        "astId": 66255,
+        "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+        "label": "spacer_53_0_1",
+        "offset": 0,
+        "slot": "53",
+        "type": "t_bool"
+      },
+      {
+        "astId": 66259,
+        "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+        "label": "superchainConfig",
+        "offset": 1,
+        "slot": "53",
+        "type": "t_contract(SuperchainConfig)68561"
+      },
+      {
+        "astId": 66263,
+        "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+        "label": "l2Oracle",
+        "offset": 0,
+        "slot": "54",
+        "type": "t_contract(L2OutputOracle)66187"
+      },
+      {
+        "astId": 66267,
+        "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+        "label": "systemConfig",
+        "offset": 0,
+        "slot": "55",
+        "type": "t_contract(SystemConfig)69375"
+      }
+    ],
+    "types": {
+      "t_address": {
+        "encoding": "inplace",
+        "label": "address",
+        "numberOfBytes": "20"
+      },
+      "t_array(t_uint256)48_storage": {
+        "encoding": "inplace",
+        "label": "uint256[48]",
+        "numberOfBytes": "1536",
+        "base": "t_uint256"
+      },
+      "t_bool": {
+        "encoding": "inplace",
+        "label": "bool",
+        "numberOfBytes": "1"
+      },
+      "t_bytes32": {
+        "encoding": "inplace",
+        "label": "bytes32",
+        "numberOfBytes": "32"
+      },
+      "t_contract(L2OutputOracle)66187": {
+        "encoding": "inplace",
+        "label": "contract L2OutputOracle",
+        "numberOfBytes": "20"
+      },
+      "t_contract(SuperchainConfig)68561": {
+        "encoding": "inplace",
+        "label": "contract SuperchainConfig",
+        "numberOfBytes": "20"
+      },
+      "t_contract(SystemConfig)69375": {
+        "encoding": "inplace",
+        "label": "contract SystemConfig",
+        "numberOfBytes": "20"
+      },
+      "t_mapping(t_bytes32,t_bool)": {
+        "encoding": "mapping",
+        "key": "t_bytes32",
+        "label": "mapping(bytes32 => bool)",
+        "numberOfBytes": "32",
+        "value": "t_bool"
+      },
+      "t_mapping(t_bytes32,t_struct(ProvenWithdrawal)66230_storage)": {
+        "encoding": "mapping",
+        "key": "t_bytes32",
+        "label": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal)",
+        "numberOfBytes": "32",
+        "value": "t_struct(ProvenWithdrawal)66230_storage"
+      },
+      "t_struct(ProvenWithdrawal)66230_storage": {
+        "encoding": "inplace",
+        "label": "struct OptimismPortal.ProvenWithdrawal",
+        "numberOfBytes": "64",
+        "members": [
+          {
+            "astId": 66225,
+            "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+            "label": "outputRoot",
+            "offset": 0,
+            "slot": "0",
+            "type": "t_bytes32"
+          },
+          {
+            "astId": 66227,
+            "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+            "label": "timestamp",
+            "offset": 0,
+            "slot": "1",
+            "type": "t_uint128"
+          },
+          {
+            "astId": 66229,
+            "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+            "label": "l2OutputIndex",
+            "offset": 16,
+            "slot": "1",
+            "type": "t_uint128"
+          }
+        ]
+      },
+      "t_struct(ResourceParams)68013_storage": {
+        "encoding": "inplace",
+        "label": "struct ResourceMetering.ResourceParams",
+        "numberOfBytes": "32",
+        "members": [
+          {
+            "astId": 68008,
+            "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+            "label": "prevBaseFee",
+            "offset": 0,
+            "slot": "0",
+            "type": "t_uint128"
+          },
+          {
+            "astId": 68010,
+            "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+            "label": "prevBoughtGas",
+            "offset": 16,
+            "slot": "0",
+            "type": "t_uint64"
+          },
+          {
+            "astId": 68012,
+            "contract": "src/L1/OptimismPortal.sol:OptimismPortal",
+            "label": "prevBlockNum",
+            "offset": 24,
+            "slot": "0",
+            "type": "t_uint64"
+          }
+        ]
+      },
+      "t_uint128": {
+        "encoding": "inplace",
+        "label": "uint128",
+        "numberOfBytes": "16"
+      },
+      "t_uint256": {
+        "encoding": "inplace",
+        "label": "uint256",
+        "numberOfBytes": "32"
+      },
+      "t_uint64": {
+        "encoding": "inplace",
+        "label": "uint64",
+        "numberOfBytes": "8"
+      },
+      "t_uint8": {
+        "encoding": "inplace",
+        "label": "uint8",
+        "numberOfBytes": "1"
+      }
+    }
+  },
+  "userdoc": {
+    "version": 1,
+    "kind": "user",
+    "methods": {
+      "constructor": {
+        "notice": "Constructs the OptimismPortal contract."
+      },
+      "depositTransaction(address,uint256,uint64,bool,bytes)": {
+        "notice": "Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in         deriving deposit transactions. Note that if a deposit is made by a contract, its         address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider         using the CrossDomainMessenger contracts for a simpler developer experience."
+      },
+      "donateETH()": {
+        "notice": "Accepts ETH value without triggering a deposit to L2.         This function mainly exists for the sake of the migration between the legacy         Optimism system and Bedrock."
+      },
+      "finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))": {
+        "notice": "Finalizes a withdrawal transaction."
+      },
+      "finalizedWithdrawals(bytes32)": {
+        "notice": "A list of withdrawal hashes which have been successfully finalized."
+      },
+      "guardian()": {
+        "notice": "Getter function for the address of the guardian.         Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead."
+      },
+      "initialize(address,address,address)": {
+        "notice": "Initializer."
+      },
+      "isOutputFinalized(uint256)": {
+        "notice": "Determine if a given output is finalized.         Reverts if the call to l2Oracle.getL2Output reverts.         Returns a boolean otherwise."
+      },
+      "l2Oracle()": {
+        "notice": "Contract of the L2OutputOracle."
+      },
+      "l2Sender()": {
+        "notice": "Address of the L2 account which initiated a withdrawal in this transaction.         If the of this variable is the default L2 sender address, then we are NOT inside of         a call to finalizeWithdrawalTransaction."
+      },
+      "minimumGasLimit(uint64)": {
+        "notice": "Computes the minimum gas limit for a deposit.         The minimum gas limit linearly increases based on the size of the calldata.         This is to prevent users from creating L2 resource usage without paying for it.         This function can be used when interacting with the portal to ensure forwards         compatibility."
+      },
+      "params()": {
+        "notice": "EIP-1559 style gas parameters."
+      },
+      "paused()": {
+        "notice": "Getter for the current paused status."
+      },
+      "proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])": {
+        "notice": "Proves a withdrawal transaction."
+      },
+      "provenWithdrawals(bytes32)": {
+        "notice": "A mapping of withdrawal hashes to `ProvenWithdrawal` data."
+      },
+      "superchainConfig()": {
+        "notice": "Contract of the Superchain Config."
+      },
+      "systemConfig()": {
+        "notice": "Contract of the SystemConfig."
+      },
+      "version()": {
+        "notice": "Semantic version."
+      }
+    },
+    "events": {
+      "TransactionDeposited(address,address,uint256,bytes)": {
+        "notice": "Emitted when a transaction is deposited from L1 to L2.         The parameters of this event are read by the rollup node and used to derive deposit         transactions on L2."
+      },
+      "WithdrawalFinalized(bytes32,bool)": {
+        "notice": "Emitted when a withdrawal transaction is finalized."
+      },
+      "WithdrawalProven(bytes32,address,address)": {
+        "notice": "Emitted when a withdrawal transaction is proven."
+      }
+    },
+    "errors": {
+      "BadTarget()": [
+        {
+          "notice": "Error for when a deposit or withdrawal is to a bad target."
+        }
+      ],
+      "CallPaused()": [
+        {
+          "notice": "Error for when a method cannot be called when paused. This could be renamed         to `Paused` in the future, but it collides with the `Paused` event."
+        }
+      ],
+      "GasEstimation()": [
+        {
+          "notice": "Error for special gas estimation."
+        }
+      ],
+      "LargeCalldata()": [
+        {
+          "notice": "Error for when a deposit has too much calldata."
+        }
+      ],
+      "OutOfGas()": [
+        {
+          "notice": "Error returned when too much gas resource is consumed."
+        }
+      ],
+      "SmallGasLimit()": [
+        {
+          "notice": "Error for when a deposit has too small of a gas limit."
+        }
+      ]
+    },
+    "notice": "The OptimismPortal is a low-level contract responsible for passing messages between L1         and L2. Messages sent directly to the OptimismPortal have no form of replayability.         Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface."
+  },
+  "devdoc": {
+    "version": 1,
+    "kind": "dev",
+    "methods": {
+      "depositTransaction(address,uint256,uint64,bool,bytes)": {
+        "params": {
+          "_data": "Data to trigger the recipient with.",
+          "_gasLimit": "Amount of L2 gas to purchase by burning gas on L1.",
+          "_isCreation": "Whether or not the transaction is a contract creation.",
+          "_to": "Target address on L2.",
+          "_value": "ETH value to send to the recipient."
+        }
+      },
+      "finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))": {
+        "params": {
+          "_tx": "Withdrawal transaction to finalize."
+        }
+      },
+      "guardian()": {
+        "returns": {
+          "_0": "Address of the guardian."
+        }
+      },
+      "initialize(address,address,address)": {
+        "params": {
+          "_l2Oracle": "Contract of the L2OutputOracle.",
+          "_superchainConfig": "Contract of the SuperchainConfig.",
+          "_systemConfig": "Contract of the SystemConfig."
+        }
+      },
+      "isOutputFinalized(uint256)": {
+        "params": {
+          "_l2OutputIndex": "Index of the L2 output to check."
+        },
+        "returns": {
+          "_0": "Whether or not the output is finalized."
+        }
+      },
+      "minimumGasLimit(uint64)": {
+        "params": {
+          "_byteCount": "Number of bytes in the calldata."
+        },
+        "returns": {
+          "_0": "The minimum gas limit for a deposit."
+        }
+      },
+      "paused()": {
+        "returns": {
+          "paused_": "Whether or not the contract is paused."
+        }
+      },
+      "proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])": {
+        "params": {
+          "_l2OutputIndex": "L2 output index to prove against.",
+          "_outputRootProof": "Inclusion proof of the L2ToL1MessagePasser contract's storage root.",
+          "_tx": "Withdrawal transaction to finalize.",
+          "_withdrawalProof": "Inclusion proof of the withdrawal in L2ToL1MessagePasser contract."
+        }
+      }
+    },
+    "events": {
+      "TransactionDeposited(address,address,uint256,bytes)": {
+        "params": {
+          "from": "Address that triggered the deposit transaction.",
+          "opaqueData": "ABI encoded deposit data to be parsed off-chain.",
+          "to": "Address that the deposit transaction is directed to.",
+          "version": "Version of this deposit transaction event."
+        }
+      },
+      "WithdrawalFinalized(bytes32,bool)": {
+        "params": {
+          "success": "Whether the withdrawal transaction was successful.",
+          "withdrawalHash": "Hash of the withdrawal transaction."
+        }
+      },
+      "WithdrawalProven(bytes32,address,address)": {
+        "params": {
+          "from": "Address that triggered the withdrawal transaction.",
+          "to": "Address that the withdrawal transaction is directed to.",
+          "withdrawalHash": "Hash of the withdrawal transaction."
+        }
+      }
+    }
+  },
+  "ast": {
+    "absolutePath": "src/L1/OptimismPortal.sol",
+    "id": 66857,
+    "exportedSymbols": {
+      "AddressAliasHelper": [
+        85854
+      ],
+      "BadTarget": [
+        80411
+      ],
+      "CallPaused": [
+        80432
+      ],
+      "Constants": [
+        79758
+      ],
+      "GasEstimation": [
+        80435
+      ],
+      "Hashing": [
+        80406
+      ],
+      "ISemver": [
+        83714
+      ],
+      "Initializable": [
+        43940
+      ],
+      "L2OutputOracle": [
+        66187
+      ],
+      "LargeCalldata": [
+        80414
+      ],
+      "NoValue": [
+        80426
+      ],
+      "OnlyCustomGasToken": [
+        80423
+      ],
+      "OptimismPortal": [
+        66856
+      ],
+      "ResourceMetering": [
+        68349
+      ],
+      "SafeCall": [
+        80945
+      ],
+      "SecureMerkleTrie": [
+        82765
+      ],
+      "SmallGasLimit": [
+        80417
+      ],
+      "SuperchainConfig": [
+        68561
+      ],
+      "SystemConfig": [
+        69375
+      ],
+      "TransferFailed": [
+        80420
+      ],
+      "Types": [
+        81081
+      ],
+      "Unauthorized": [
+        80429
+      ]
+    },
+    "nodeType": "SourceUnit",
+    "src": "32:20510:81",
+    "nodes": [
+      {
+        "id": 66189,
+        "nodeType": "PragmaDirective",
+        "src": "32:23:81",
+        "nodes": [],
+        "literals": [
+          "solidity",
+          "0.8",
+          ".15"
+        ]
+      },
+      {
+        "id": 66191,
+        "nodeType": "ImportDirective",
+        "src": "57:86:81",
+        "nodes": [],
+        "absolutePath": "lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol",
+        "file": "@openzeppelin/contracts/proxy/utils/Initializable.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 43941,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66190,
+              "name": "Initializable",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 43940,
+              "src": "66:13:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66193,
+        "nodeType": "ImportDirective",
+        "src": "144:54:81",
+        "nodes": [],
+        "absolutePath": "src/libraries/SafeCall.sol",
+        "file": "src/libraries/SafeCall.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 80946,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66192,
+              "name": "SafeCall",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 80945,
+              "src": "153:8:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66195,
+        "nodeType": "ImportDirective",
+        "src": "199:59:81",
+        "nodes": [],
+        "absolutePath": "src/L1/L2OutputOracle.sol",
+        "file": "src/L1/L2OutputOracle.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 66188,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66194,
+              "name": "L2OutputOracle",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 66187,
+              "src": "208:14:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66197,
+        "nodeType": "ImportDirective",
+        "src": "259:55:81",
+        "nodes": [],
+        "absolutePath": "src/L1/SystemConfig.sol",
+        "file": "src/L1/SystemConfig.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 69376,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66196,
+              "name": "SystemConfig",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 69375,
+              "src": "268:12:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66199,
+        "nodeType": "ImportDirective",
+        "src": "315:63:81",
+        "nodes": [],
+        "absolutePath": "src/L1/SuperchainConfig.sol",
+        "file": "src/L1/SuperchainConfig.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 68562,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66198,
+              "name": "SuperchainConfig",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 68561,
+              "src": "324:16:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66201,
+        "nodeType": "ImportDirective",
+        "src": "379:56:81",
+        "nodes": [],
+        "absolutePath": "src/libraries/Constants.sol",
+        "file": "src/libraries/Constants.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 79759,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66200,
+              "name": "Constants",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 79758,
+              "src": "388:9:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66203,
+        "nodeType": "ImportDirective",
+        "src": "436:48:81",
+        "nodes": [],
+        "absolutePath": "src/libraries/Types.sol",
+        "file": "src/libraries/Types.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 81082,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66202,
+              "name": "Types",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 81081,
+              "src": "445:5:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66205,
+        "nodeType": "ImportDirective",
+        "src": "485:52:81",
+        "nodes": [],
+        "absolutePath": "src/libraries/Hashing.sol",
+        "file": "src/libraries/Hashing.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 80407,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66204,
+              "name": "Hashing",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 80406,
+              "src": "494:7:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66207,
+        "nodeType": "ImportDirective",
+        "src": "538:75:81",
+        "nodes": [],
+        "absolutePath": "src/libraries/trie/SecureMerkleTrie.sol",
+        "file": "src/libraries/trie/SecureMerkleTrie.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 82766,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66206,
+              "name": "SecureMerkleTrie",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 82765,
+              "src": "547:16:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66209,
+        "nodeType": "ImportDirective",
+        "src": "614:71:81",
+        "nodes": [],
+        "absolutePath": "src/vendor/AddressAliasHelper.sol",
+        "file": "src/vendor/AddressAliasHelper.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 85855,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66208,
+              "name": "AddressAliasHelper",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 85854,
+              "src": "623:18:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66211,
+        "nodeType": "ImportDirective",
+        "src": "686:63:81",
+        "nodes": [],
+        "absolutePath": "src/L1/ResourceMetering.sol",
+        "file": "src/L1/ResourceMetering.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 68350,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66210,
+              "name": "ResourceMetering",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 68349,
+              "src": "695:16:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66213,
+        "nodeType": "ImportDirective",
+        "src": "750:52:81",
+        "nodes": [],
+        "absolutePath": "src/universal/ISemver.sol",
+        "file": "src/universal/ISemver.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 83715,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66212,
+              "name": "ISemver",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 83714,
+              "src": "759:7:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66215,
+        "nodeType": "ImportDirective",
+        "src": "803:56:81",
+        "nodes": [],
+        "absolutePath": "src/libraries/Constants.sol",
+        "file": "src/libraries/Constants.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 79759,
+        "symbolAliases": [
+          {
+            "foreign": {
+              "id": 66214,
+              "name": "Constants",
+              "nodeType": "Identifier",
+              "overloadedDeclarations": [],
+              "referencedDeclaration": 79758,
+              "src": "812:9:81",
+              "typeDescriptions": {}
+            },
+            "nameLocation": "-1:-1:-1"
+          }
+        ],
+        "unitAlias": ""
+      },
+      {
+        "id": 66216,
+        "nodeType": "ImportDirective",
+        "src": "860:40:81",
+        "nodes": [],
+        "absolutePath": "src/libraries/PortalErrors.sol",
+        "file": "src/libraries/PortalErrors.sol",
+        "nameLocation": "-1:-1:-1",
+        "scope": 66857,
+        "sourceUnit": 80436,
+        "symbolAliases": [],
+        "unitAlias": ""
+      },
+      {
+        "id": 66856,
+        "nodeType": "ContractDefinition",
+        "src": "1240:19301:81",
+        "nodes": [
+          {
+            "id": 66230,
+            "nodeType": "StructDefinition",
+            "src": "1608:117:81",
+            "nodes": [],
+            "canonicalName": "OptimismPortal.ProvenWithdrawal",
+            "members": [
+              {
+                "constant": false,
+                "id": 66225,
+                "mutability": "mutable",
+                "name": "outputRoot",
+                "nameLocation": "1650:10:81",
+                "nodeType": "VariableDeclaration",
+                "scope": 66230,
+                "src": "1642:18:81",
+                "stateVariable": false,
+                "storageLocation": "default",
+                "typeDescriptions": {
+                  "typeIdentifier": "t_bytes32",
+                  "typeString": "bytes32"
+                },
+                "typeName": {
+                  "id": 66224,
+                  "name": "bytes32",
+                  "nodeType": "ElementaryTypeName",
+                  "src": "1642:7:81",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_bytes32",
+                    "typeString": "bytes32"
+                  }
+                },
+                "visibility": "internal"
+              },
+              {
+                "constant": false,
+                "id": 66227,
+                "mutability": "mutable",
+                "name": "timestamp",
+                "nameLocation": "1678:9:81",
+                "nodeType": "VariableDeclaration",
+                "scope": 66230,
+                "src": "1670:17:81",
+                "stateVariable": false,
+                "storageLocation": "default",
+                "typeDescriptions": {
+                  "typeIdentifier": "t_uint128",
+                  "typeString": "uint128"
+                },
+                "typeName": {
+                  "id": 66226,
+                  "name": "uint128",
+                  "nodeType": "ElementaryTypeName",
+                  "src": "1670:7:81",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_uint128",
+                    "typeString": "uint128"
+                  }
+                },
+                "visibility": "internal"
+              },
+              {
+                "constant": false,
+                "id": 66229,
+                "mutability": "mutable",
+                "name": "l2OutputIndex",
+                "nameLocation": "1705:13:81",
+                "nodeType": "VariableDeclaration",
+                "scope": 66230,
+                "src": "1697:21:81",
+                "stateVariable": false,
+                "storageLocation": "default",
+                "typeDescriptions": {
+                  "typeIdentifier": "t_uint128",
+                  "typeString": "uint128"
+                },
+                "typeName": {
+                  "id": 66228,
+                  "name": "uint128",
+                  "nodeType": "ElementaryTypeName",
+                  "src": "1697:7:81",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_uint128",
+                    "typeString": "uint128"
+                  }
+                },
+                "visibility": "internal"
+              }
+            ],
+            "name": "ProvenWithdrawal",
+            "nameLocation": "1615:16:81",
+            "scope": 66856,
+            "visibility": "public"
+          },
+          {
+            "id": 66234,
+            "nodeType": "VariableDeclaration",
+            "src": "1777:45:81",
+            "nodes": [],
+            "constant": true,
+            "documentation": {
+              "id": 66231,
+              "nodeType": "StructuredDocumentation",
+              "src": "1731:41:81",
+              "text": "@notice Version of the deposit event."
+            },
+            "mutability": "constant",
+            "name": "DEPOSIT_VERSION",
+            "nameLocation": "1803:15:81",
+            "scope": 66856,
+            "stateVariable": true,
+            "storageLocation": "default",
+            "typeDescriptions": {
+              "typeIdentifier": "t_uint256",
+              "typeString": "uint256"
+            },
+            "typeName": {
+              "id": 66232,
+              "name": "uint256",
+              "nodeType": "ElementaryTypeName",
+              "src": "1777:7:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_uint256",
+                "typeString": "uint256"
+              }
+            },
+            "value": {
+              "hexValue": "30",
+              "id": 66233,
+              "isConstant": false,
+              "isLValue": false,
+              "isPure": true,
+              "kind": "number",
+              "lValueRequested": false,
+              "nodeType": "Literal",
+              "src": "1821:1:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_rational_0_by_1",
+                "typeString": "int_const 0"
+              },
+              "value": "0"
+            },
+            "visibility": "internal"
+          },
+          {
+            "id": 66238,
+            "nodeType": "VariableDeclaration",
+            "src": "1918:60:81",
+            "nodes": [],
+            "constant": true,
+            "documentation": {
+              "id": 66235,
+              "nodeType": "StructuredDocumentation",
+              "src": "1829:84:81",
+              "text": "@notice The L2 gas limit set when eth is deposited using the receive() function."
+            },
+            "mutability": "constant",
+            "name": "RECEIVE_DEFAULT_GAS_LIMIT",
+            "nameLocation": "1943:25:81",
+            "scope": 66856,
+            "stateVariable": true,
+            "storageLocation": "default",
+            "typeDescriptions": {
+              "typeIdentifier": "t_uint64",
+              "typeString": "uint64"
+            },
+            "typeName": {
+              "id": 66236,
+              "name": "uint64",
+              "nodeType": "ElementaryTypeName",
+              "src": "1918:6:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_uint64",
+                "typeString": "uint64"
+              }
+            },
+            "value": {
+              "hexValue": "3130305f303030",
+              "id": 66237,
+              "isConstant": false,
+              "isLValue": false,
+              "isPure": true,
+              "kind": "number",
+              "lValueRequested": false,
+              "nodeType": "Literal",
+              "src": "1971:7:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_rational_100000_by_1",
+                "typeString": "int_const 100000"
+              },
+              "value": "100_000"
+            },
+            "visibility": "internal"
+          },
+          {
+            "id": 66241,
+            "nodeType": "VariableDeclaration",
+            "src": "2234:23:81",
+            "nodes": [],
+            "constant": false,
+            "documentation": {
+              "id": 66239,
+              "nodeType": "StructuredDocumentation",
+              "src": "1985:244:81",
+              "text": "@notice Address of the L2 account which initiated a withdrawal in this transaction.\n         If the of this variable is the default L2 sender address, then we are NOT inside of\n         a call to finalizeWithdrawalTransaction."
+            },
+            "functionSelector": "9bf62d82",
+            "mutability": "mutable",
+            "name": "l2Sender",
+            "nameLocation": "2249:8:81",
+            "scope": 66856,
+            "stateVariable": true,
+            "storageLocation": "default",
+            "typeDescriptions": {
+              "typeIdentifier": "t_address",
+              "typeString": "address"
+            },
+            "typeName": {
+              "id": 66240,
+              "name": "address",
+              "nodeType": "ElementaryTypeName",
+              "src": "2234:7:81",
+              "stateMutability": "nonpayable",
+              "typeDescriptions": {
+                "typeIdentifier": "t_address",
+                "typeString": "address"
+              }
+            },
+            "visibility": "public"
+          },
+          {
+            "id": 66246,
+            "nodeType": "VariableDeclaration",
+            "src": "2348:52:81",
+            "nodes": [],
+            "constant": false,
+            "documentation": {
+              "id": 66242,
+              "nodeType": "StructuredDocumentation",
+              "src": "2264:79:81",
+              "text": "@notice A list of withdrawal hashes which have been successfully finalized."
+            },
+            "functionSelector": "a14238e7",
+            "mutability": "mutable",
+            "name": "finalizedWithdrawals",
+            "nameLocation": "2380:20:81",
+            "scope": 66856,
+            "stateVariable": true,
+            "storageLocation": "default",
+            "typeDescriptions": {
+              "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$",
+              "typeString": "mapping(bytes32 => bool)"
+            },
+            "typeName": {
+              "id": 66245,
+              "keyType": {
+                "id": 66243,
+                "name": "bytes32",
+                "nodeType": "ElementaryTypeName",
+                "src": "2356:7:81",
+                "typeDescriptions": {
+                  "typeIdentifier": "t_bytes32",
+                  "typeString": "bytes32"
+                }
+              },
+              "nodeType": "Mapping",
+              "src": "2348:24:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$",
+                "typeString": "mapping(bytes32 => bool)"
+              },
+              "valueType": {
+                "id": 66244,
+                "name": "bool",
+                "nodeType": "ElementaryTypeName",
+                "src": "2367:4:81",
+                "typeDescriptions": {
+                  "typeIdentifier": "t_bool",
+                  "typeString": "bool"
+                }
+              }
+            },
+            "visibility": "public"
+          },
+          {
+            "id": 66252,
+            "nodeType": "VariableDeclaration",
+            "src": "2482:61:81",
+            "nodes": [],
+            "constant": false,
+            "documentation": {
+              "id": 66247,
+              "nodeType": "StructuredDocumentation",
+              "src": "2407:70:81",
+              "text": "@notice A mapping of withdrawal hashes to `ProvenWithdrawal` data."
+            },
+            "functionSelector": "e965084c",
+            "mutability": "mutable",
+            "name": "provenWithdrawals",
+            "nameLocation": "2526:17:81",
+            "scope": 66856,
+            "stateVariable": true,
+            "storageLocation": "default",
+            "typeDescriptions": {
+              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$66230_storage_$",
+              "typeString": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal)"
+            },
+            "typeName": {
+              "id": 66251,
+              "keyType": {
+                "id": 66248,
+                "name": "bytes32",
+                "nodeType": "ElementaryTypeName",
+                "src": "2490:7:81",
+                "typeDescriptions": {
+                  "typeIdentifier": "t_bytes32",
+                  "typeString": "bytes32"
+                }
+              },
+              "nodeType": "Mapping",
+              "src": "2482:36:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$66230_storage_$",
+                "typeString": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal)"
+              },
+              "valueType": {
+                "id": 66250,
+                "nodeType": "UserDefinedTypeName",
+                "pathNode": {
+                  "id": 66249,
+                  "name": "ProvenWithdrawal",
+                  "nodeType": "IdentifierPath",
+                  "referencedDeclaration": 66230,
+                  "src": "2501:16:81"
+                },
+                "referencedDeclaration": 66230,
+                "src": "2501:16:81",
+                "typeDescriptions": {
+                  "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_storage_ptr",
+                  "typeString": "struct OptimismPortal.ProvenWithdrawal"
+                }
+              }
+            },
+            "visibility": "public"
+          },
+          {
+            "id": 66255,
+            "nodeType": "VariableDeclaration",
+            "src": "2655:26:81",
+            "nodes": [],
+            "constant": false,
+            "documentation": {
+              "id": 66253,
+              "nodeType": "StructuredDocumentation",
+              "src": "2550:100:81",
+              "text": "@custom:legacy\n @custom:spacer paused\n @notice Spacer for backwards compatibility."
+            },
+            "mutability": "mutable",
+            "name": "spacer_53_0_1",
+            "nameLocation": "2668:13:81",
+            "scope": 66856,
+            "stateVariable": true,
+            "storageLocation": "default",
+            "typeDescriptions": {
+              "typeIdentifier": "t_bool",
+              "typeString": "bool"
+            },
+            "typeName": {
+              "id": 66254,
+              "name": "bool",
+              "nodeType": "ElementaryTypeName",
+              "src": "2655:4:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_bool",
+                "typeString": "bool"
+              }
+            },
+            "visibility": "private"
+          },
+          {
+            "id": 66259,
+            "nodeType": "VariableDeclaration",
+            "src": "2739:40:81",
+            "nodes": [],
+            "constant": false,
+            "documentation": {
+              "id": 66256,
+              "nodeType": "StructuredDocumentation",
+              "src": "2688:46:81",
+              "text": "@notice Contract of the Superchain Config."
+            },
+            "functionSelector": "35e80ab3",
+            "mutability": "mutable",
+            "name": "superchainConfig",
+            "nameLocation": "2763:16:81",
+            "scope": 66856,
+            "stateVariable": true,
+            "storageLocation": "default",
+            "typeDescriptions": {
+              "typeIdentifier": "t_contract$_SuperchainConfig_$68561",
+              "typeString": "contract SuperchainConfig"
+            },
+            "typeName": {
+              "id": 66258,
+              "nodeType": "UserDefinedTypeName",
+              "pathNode": {
+                "id": 66257,
+                "name": "SuperchainConfig",
+                "nodeType": "IdentifierPath",
+                "referencedDeclaration": 68561,
+                "src": "2739:16:81"
+              },
+              "referencedDeclaration": 68561,
+              "src": "2739:16:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_contract$_SuperchainConfig_$68561",
+                "typeString": "contract SuperchainConfig"
+              }
+            },
+            "visibility": "public"
+          },
+          {
+            "id": 66263,
+            "nodeType": "VariableDeclaration",
+            "src": "2867:30:81",
+            "nodes": [],
+            "constant": false,
+            "documentation": {
+              "id": 66260,
+              "nodeType": "StructuredDocumentation",
+              "src": "2786:76:81",
+              "text": "@notice Contract of the L2OutputOracle.\n @custom:network-specific"
+            },
+            "functionSelector": "9b5f694a",
+            "mutability": "mutable",
+            "name": "l2Oracle",
+            "nameLocation": "2889:8:81",
+            "scope": 66856,
+            "stateVariable": true,
+            "storageLocation": "default",
+            "typeDescriptions": {
+              "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+              "typeString": "contract L2OutputOracle"
+            },
+            "typeName": {
+              "id": 66262,
+              "nodeType": "UserDefinedTypeName",
+              "pathNode": {
+                "id": 66261,
+                "name": "L2OutputOracle",
+                "nodeType": "IdentifierPath",
+                "referencedDeclaration": 66187,
+                "src": "2867:14:81"
+              },
+              "referencedDeclaration": 66187,
+              "src": "2867:14:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                "typeString": "contract L2OutputOracle"
+              }
+            },
+            "visibility": "public"
+          },
+          {
+            "id": 66267,
+            "nodeType": "VariableDeclaration",
+            "src": "2983:32:81",
+            "nodes": [],
+            "constant": false,
+            "documentation": {
+              "id": 66264,
+              "nodeType": "StructuredDocumentation",
+              "src": "2904:74:81",
+              "text": "@notice Contract of the SystemConfig.\n @custom:network-specific"
+            },
+            "functionSelector": "33d7e2bd",
+            "mutability": "mutable",
+            "name": "systemConfig",
+            "nameLocation": "3003:12:81",
+            "scope": 66856,
+            "stateVariable": true,
+            "storageLocation": "default",
+            "typeDescriptions": {
+              "typeIdentifier": "t_contract$_SystemConfig_$69375",
+              "typeString": "contract SystemConfig"
+            },
+            "typeName": {
+              "id": 66266,
+              "nodeType": "UserDefinedTypeName",
+              "pathNode": {
+                "id": 66265,
+                "name": "SystemConfig",
+                "nodeType": "IdentifierPath",
+                "referencedDeclaration": 69375,
+                "src": "2983:12:81"
+              },
+              "referencedDeclaration": 69375,
+              "src": "2983:12:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_contract$_SystemConfig_$69375",
+                "typeString": "contract SystemConfig"
+              }
+            },
+            "visibility": "public"
+          },
+          {
+            "id": 66278,
+            "nodeType": "EventDefinition",
+            "src": "3526:112:81",
+            "nodes": [],
+            "anonymous": false,
+            "documentation": {
+              "id": 66268,
+              "nodeType": "StructuredDocumentation",
+              "src": "3022:499:81",
+              "text": "@notice Emitted when a transaction is deposited from L1 to L2.\n         The parameters of this event are read by the rollup node and used to derive deposit\n         transactions on L2.\n @param from       Address that triggered the deposit transaction.\n @param to         Address that the deposit transaction is directed to.\n @param version    Version of this deposit transaction event.\n @param opaqueData ABI encoded deposit data to be parsed off-chain."
+            },
+            "eventSelector": "b3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32",
+            "name": "TransactionDeposited",
+            "nameLocation": "3532:20:81",
+            "parameters": {
+              "id": 66277,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66270,
+                  "indexed": true,
+                  "mutability": "mutable",
+                  "name": "from",
+                  "nameLocation": "3569:4:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66278,
+                  "src": "3553:20:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_address",
+                    "typeString": "address"
+                  },
+                  "typeName": {
+                    "id": 66269,
+                    "name": "address",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "3553:7:81",
+                    "stateMutability": "nonpayable",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66272,
+                  "indexed": true,
+                  "mutability": "mutable",
+                  "name": "to",
+                  "nameLocation": "3591:2:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66278,
+                  "src": "3575:18:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_address",
+                    "typeString": "address"
+                  },
+                  "typeName": {
+                    "id": 66271,
+                    "name": "address",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "3575:7:81",
+                    "stateMutability": "nonpayable",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66274,
+                  "indexed": true,
+                  "mutability": "mutable",
+                  "name": "version",
+                  "nameLocation": "3611:7:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66278,
+                  "src": "3595:23:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_uint256",
+                    "typeString": "uint256"
+                  },
+                  "typeName": {
+                    "id": 66273,
+                    "name": "uint256",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "3595:7:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_uint256",
+                      "typeString": "uint256"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66276,
+                  "indexed": false,
+                  "mutability": "mutable",
+                  "name": "opaqueData",
+                  "nameLocation": "3626:10:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66278,
+                  "src": "3620:16:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_bytes_memory_ptr",
+                    "typeString": "bytes"
+                  },
+                  "typeName": {
+                    "id": 66275,
+                    "name": "bytes",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "3620:5:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bytes_storage_ptr",
+                      "typeString": "bytes"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "3552:85:81"
+            }
+          },
+          {
+            "id": 66287,
+            "nodeType": "EventDefinition",
+            "src": "3942:97:81",
+            "nodes": [],
+            "anonymous": false,
+            "documentation": {
+              "id": 66279,
+              "nodeType": "StructuredDocumentation",
+              "src": "3644:293:81",
+              "text": "@notice Emitted when a withdrawal transaction is proven.\n @param withdrawalHash Hash of the withdrawal transaction.\n @param from           Address that triggered the withdrawal transaction.\n @param to             Address that the withdrawal transaction is directed to."
+            },
+            "eventSelector": "67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62",
+            "name": "WithdrawalProven",
+            "nameLocation": "3948:16:81",
+            "parameters": {
+              "id": 66286,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66281,
+                  "indexed": true,
+                  "mutability": "mutable",
+                  "name": "withdrawalHash",
+                  "nameLocation": "3981:14:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66287,
+                  "src": "3965:30:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_bytes32",
+                    "typeString": "bytes32"
+                  },
+                  "typeName": {
+                    "id": 66280,
+                    "name": "bytes32",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "3965:7:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bytes32",
+                      "typeString": "bytes32"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66283,
+                  "indexed": true,
+                  "mutability": "mutable",
+                  "name": "from",
+                  "nameLocation": "4013:4:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66287,
+                  "src": "3997:20:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_address",
+                    "typeString": "address"
+                  },
+                  "typeName": {
+                    "id": 66282,
+                    "name": "address",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "3997:7:81",
+                    "stateMutability": "nonpayable",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66285,
+                  "indexed": true,
+                  "mutability": "mutable",
+                  "name": "to",
+                  "nameLocation": "4035:2:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66287,
+                  "src": "4019:18:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_address",
+                    "typeString": "address"
+                  },
+                  "typeName": {
+                    "id": 66284,
+                    "name": "address",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "4019:7:81",
+                    "stateMutability": "nonpayable",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "3964:74:81"
+            }
+          },
+          {
+            "id": 66294,
+            "nodeType": "EventDefinition",
+            "src": "4260:72:81",
+            "nodes": [],
+            "anonymous": false,
+            "documentation": {
+              "id": 66288,
+              "nodeType": "StructuredDocumentation",
+              "src": "4045:210:81",
+              "text": "@notice Emitted when a withdrawal transaction is finalized.\n @param withdrawalHash Hash of the withdrawal transaction.\n @param success        Whether the withdrawal transaction was successful."
+            },
+            "eventSelector": "db5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b",
+            "name": "WithdrawalFinalized",
+            "nameLocation": "4266:19:81",
+            "parameters": {
+              "id": 66293,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66290,
+                  "indexed": true,
+                  "mutability": "mutable",
+                  "name": "withdrawalHash",
+                  "nameLocation": "4302:14:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66294,
+                  "src": "4286:30:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_bytes32",
+                    "typeString": "bytes32"
+                  },
+                  "typeName": {
+                    "id": 66289,
+                    "name": "bytes32",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "4286:7:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bytes32",
+                      "typeString": "bytes32"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66292,
+                  "indexed": false,
+                  "mutability": "mutable",
+                  "name": "success",
+                  "nameLocation": "4323:7:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66294,
+                  "src": "4318:12:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_bool",
+                    "typeString": "bool"
+                  },
+                  "typeName": {
+                    "id": 66291,
+                    "name": "bool",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "4318:4:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "4285:46:81"
+            }
+          },
+          {
+            "id": 66305,
+            "nodeType": "ModifierDefinition",
+            "src": "4375:86:81",
+            "nodes": [],
+            "body": {
+              "id": 66304,
+              "nodeType": "Block",
+              "src": "4400:61:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "condition": {
+                    "arguments": [],
+                    "expression": {
+                      "argumentTypes": [],
+                      "id": 66297,
+                      "name": "paused",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66403,
+                      "src": "4414:6:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
+                        "typeString": "function () view returns (bool)"
+                      }
+                    },
+                    "id": 66298,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "4414:8:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "id": 66302,
+                  "nodeType": "IfStatement",
+                  "src": "4410:33:81",
+                  "trueBody": {
+                    "errorCall": {
+                      "arguments": [],
+                      "expression": {
+                        "argumentTypes": [],
+                        "id": 66299,
+                        "name": "CallPaused",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 80432,
+                        "src": "4431:10:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
+                          "typeString": "function () pure"
+                        }
+                      },
+                      "id": 66300,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "kind": "functionCall",
+                      "lValueRequested": false,
+                      "names": [],
+                      "nodeType": "FunctionCall",
+                      "src": "4431:12:81",
+                      "tryCall": false,
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_tuple$__$",
+                        "typeString": "tuple()"
+                      }
+                    },
+                    "id": 66301,
+                    "nodeType": "RevertStatement",
+                    "src": "4424:19:81"
+                  }
+                },
+                {
+                  "id": 66303,
+                  "nodeType": "PlaceholderStatement",
+                  "src": "4453:1:81"
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66295,
+              "nodeType": "StructuredDocumentation",
+              "src": "4338:32:81",
+              "text": "@notice Reverts when paused."
+            },
+            "name": "whenNotPaused",
+            "nameLocation": "4384:13:81",
+            "parameters": {
+              "id": 66296,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "4397:2:81"
+            },
+            "virtual": false,
+            "visibility": "internal"
+          },
+          {
+            "id": 66309,
+            "nodeType": "VariableDeclaration",
+            "src": "4530:40:81",
+            "nodes": [],
+            "baseFunctions": [
+              83713
+            ],
+            "constant": true,
+            "documentation": {
+              "id": 66306,
+              "nodeType": "StructuredDocumentation",
+              "src": "4467:58:81",
+              "text": "@notice Semantic version.\n @custom:semver 2.6.0"
+            },
+            "functionSelector": "54fd4d50",
+            "mutability": "constant",
+            "name": "version",
+            "nameLocation": "4553:7:81",
+            "scope": 66856,
+            "stateVariable": true,
+            "storageLocation": "default",
+            "typeDescriptions": {
+              "typeIdentifier": "t_string_memory_ptr",
+              "typeString": "string"
+            },
+            "typeName": {
+              "id": 66307,
+              "name": "string",
+              "nodeType": "ElementaryTypeName",
+              "src": "4530:6:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_string_storage_ptr",
+                "typeString": "string"
+              }
+            },
+            "value": {
+              "hexValue": "322e362e30",
+              "id": 66308,
+              "isConstant": false,
+              "isLValue": false,
+              "isPure": true,
+              "kind": "string",
+              "lValueRequested": false,
+              "nodeType": "Literal",
+              "src": "4563:7:81",
+              "typeDescriptions": {
+                "typeIdentifier": "t_stringliteral_ad12b1ea91991aacd9b7a7ba82f559ec1ebe6024b70cee19177a7d0d7932dda1",
+                "typeString": "literal_string \"2.6.0\""
+              },
+              "value": "2.6.0"
+            },
+            "visibility": "public"
+          },
+          {
+            "id": 66335,
+            "nodeType": "FunctionDefinition",
+            "src": "4633:218:81",
+            "nodes": [],
+            "body": {
+              "id": 66334,
+              "nodeType": "Block",
+              "src": "4647:204:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "arguments": [
+                          {
+                            "arguments": [
+                              {
+                                "hexValue": "30",
+                                "id": 66317,
+                                "isConstant": false,
+                                "isLValue": false,
+                                "isPure": true,
+                                "kind": "number",
+                                "lValueRequested": false,
+                                "nodeType": "Literal",
+                                "src": "4716:1:81",
+                                "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": 66316,
+                              "isConstant": false,
+                              "isLValue": false,
+                              "isPure": true,
+                              "lValueRequested": false,
+                              "nodeType": "ElementaryTypeNameExpression",
+                              "src": "4708:7:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_type$_t_address_$",
+                                "typeString": "type(address)"
+                              },
+                              "typeName": {
+                                "id": 66315,
+                                "name": "address",
+                                "nodeType": "ElementaryTypeName",
+                                "src": "4708:7:81",
+                                "typeDescriptions": {}
+                              }
+                            },
+                            "id": 66318,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "kind": "typeConversion",
+                            "lValueRequested": false,
+                            "names": [],
+                            "nodeType": "FunctionCall",
+                            "src": "4708:10:81",
+                            "tryCall": false,
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_address",
+                              "typeString": "address"
+                            }
+                          }
+                        ],
+                        "expression": {
+                          "argumentTypes": [
+                            {
+                              "typeIdentifier": "t_address",
+                              "typeString": "address"
+                            }
+                          ],
+                          "id": 66314,
+                          "name": "L2OutputOracle",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66187,
+                          "src": "4693:14:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_type$_t_contract$_L2OutputOracle_$66187_$",
+                            "typeString": "type(contract L2OutputOracle)"
+                          }
+                        },
+                        "id": 66319,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "typeConversion",
+                        "lValueRequested": false,
+                        "names": [],
+                        "nodeType": "FunctionCall",
+                        "src": "4693:26:81",
+                        "tryCall": false,
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                          "typeString": "contract L2OutputOracle"
+                        }
+                      },
+                      {
+                        "arguments": [
+                          {
+                            "arguments": [
+                              {
+                                "hexValue": "30",
+                                "id": 66323,
+                                "isConstant": false,
+                                "isLValue": false,
+                                "isPure": true,
+                                "kind": "number",
+                                "lValueRequested": false,
+                                "nodeType": "Literal",
+                                "src": "4769:1:81",
+                                "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": 66322,
+                              "isConstant": false,
+                              "isLValue": false,
+                              "isPure": true,
+                              "lValueRequested": false,
+                              "nodeType": "ElementaryTypeNameExpression",
+                              "src": "4761:7:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_type$_t_address_$",
+                                "typeString": "type(address)"
+                              },
+                              "typeName": {
+                                "id": 66321,
+                                "name": "address",
+                                "nodeType": "ElementaryTypeName",
+                                "src": "4761:7:81",
+                                "typeDescriptions": {}
+                              }
+                            },
+                            "id": 66324,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "kind": "typeConversion",
+                            "lValueRequested": false,
+                            "names": [],
+                            "nodeType": "FunctionCall",
+                            "src": "4761:10:81",
+                            "tryCall": false,
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_address",
+                              "typeString": "address"
+                            }
+                          }
+                        ],
+                        "expression": {
+                          "argumentTypes": [
+                            {
+                              "typeIdentifier": "t_address",
+                              "typeString": "address"
+                            }
+                          ],
+                          "id": 66320,
+                          "name": "SystemConfig",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 69375,
+                          "src": "4748:12:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_type$_t_contract$_SystemConfig_$69375_$",
+                            "typeString": "type(contract SystemConfig)"
+                          }
+                        },
+                        "id": 66325,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "typeConversion",
+                        "lValueRequested": false,
+                        "names": [],
+                        "nodeType": "FunctionCall",
+                        "src": "4748:24:81",
+                        "tryCall": false,
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_contract$_SystemConfig_$69375",
+                          "typeString": "contract SystemConfig"
+                        }
+                      },
+                      {
+                        "arguments": [
+                          {
+                            "arguments": [
+                              {
+                                "hexValue": "30",
+                                "id": 66329,
+                                "isConstant": false,
+                                "isLValue": false,
+                                "isPure": true,
+                                "kind": "number",
+                                "lValueRequested": false,
+                                "nodeType": "Literal",
+                                "src": "4830:1:81",
+                                "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": 66328,
+                              "isConstant": false,
+                              "isLValue": false,
+                              "isPure": true,
+                              "lValueRequested": false,
+                              "nodeType": "ElementaryTypeNameExpression",
+                              "src": "4822:7:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_type$_t_address_$",
+                                "typeString": "type(address)"
+                              },
+                              "typeName": {
+                                "id": 66327,
+                                "name": "address",
+                                "nodeType": "ElementaryTypeName",
+                                "src": "4822:7:81",
+                                "typeDescriptions": {}
+                              }
+                            },
+                            "id": 66330,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "kind": "typeConversion",
+                            "lValueRequested": false,
+                            "names": [],
+                            "nodeType": "FunctionCall",
+                            "src": "4822:10:81",
+                            "tryCall": false,
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_address",
+                              "typeString": "address"
+                            }
+                          }
+                        ],
+                        "expression": {
+                          "argumentTypes": [
+                            {
+                              "typeIdentifier": "t_address",
+                              "typeString": "address"
+                            }
+                          ],
+                          "id": 66326,
+                          "name": "SuperchainConfig",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 68561,
+                          "src": "4805:16:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_type$_t_contract$_SuperchainConfig_$68561_$",
+                            "typeString": "type(contract SuperchainConfig)"
+                          }
+                        },
+                        "id": 66331,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "typeConversion",
+                        "lValueRequested": false,
+                        "names": [],
+                        "nodeType": "FunctionCall",
+                        "src": "4805:28:81",
+                        "tryCall": false,
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_contract$_SuperchainConfig_$68561",
+                          "typeString": "contract SuperchainConfig"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                          "typeString": "contract L2OutputOracle"
+                        },
+                        {
+                          "typeIdentifier": "t_contract$_SystemConfig_$69375",
+                          "typeString": "contract SystemConfig"
+                        },
+                        {
+                          "typeIdentifier": "t_contract$_SuperchainConfig_$68561",
+                          "typeString": "contract SuperchainConfig"
+                        }
+                      ],
+                      "id": 66313,
+                      "name": "initialize",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66379,
+                      "src": "4657:10:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_L2OutputOracle_$66187_$_t_contract$_SystemConfig_$69375_$_t_contract$_SuperchainConfig_$68561_$returns$__$",
+                        "typeString": "function (contract L2OutputOracle,contract SystemConfig,contract SuperchainConfig)"
+                      }
+                    },
+                    "id": 66332,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [
+                      "_l2Oracle",
+                      "_systemConfig",
+                      "_superchainConfig"
+                    ],
+                    "nodeType": "FunctionCall",
+                    "src": "4657:187:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66333,
+                  "nodeType": "ExpressionStatement",
+                  "src": "4657:187:81"
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66310,
+              "nodeType": "StructuredDocumentation",
+              "src": "4577:51:81",
+              "text": "@notice Constructs the OptimismPortal contract."
+            },
+            "implemented": true,
+            "kind": "constructor",
+            "modifiers": [],
+            "name": "",
+            "nameLocation": "-1:-1:-1",
+            "parameters": {
+              "id": 66311,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "4644:2:81"
+            },
+            "returnParameters": {
+              "id": 66312,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "4647:0:81"
+            },
+            "scope": 66856,
+            "stateMutability": "nonpayable",
+            "virtual": false,
+            "visibility": "public"
+          },
+          {
+            "id": 66379,
+            "nodeType": "FunctionDefinition",
+            "src": "5069:435:81",
+            "nodes": [],
+            "body": {
+              "id": 66378,
+              "nodeType": "Block",
+              "src": "5248:256:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "expression": {
+                    "id": 66352,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftHandSide": {
+                      "id": 66350,
+                      "name": "l2Oracle",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66263,
+                      "src": "5258:8:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                        "typeString": "contract L2OutputOracle"
+                      }
+                    },
+                    "nodeType": "Assignment",
+                    "operator": "=",
+                    "rightHandSide": {
+                      "id": 66351,
+                      "name": "_l2Oracle",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66339,
+                      "src": "5269:9:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                        "typeString": "contract L2OutputOracle"
+                      }
+                    },
+                    "src": "5258:20:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                      "typeString": "contract L2OutputOracle"
+                    }
+                  },
+                  "id": 66353,
+                  "nodeType": "ExpressionStatement",
+                  "src": "5258:20:81"
+                },
+                {
+                  "expression": {
+                    "id": 66356,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftHandSide": {
+                      "id": 66354,
+                      "name": "systemConfig",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66267,
+                      "src": "5288:12:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_contract$_SystemConfig_$69375",
+                        "typeString": "contract SystemConfig"
+                      }
+                    },
+                    "nodeType": "Assignment",
+                    "operator": "=",
+                    "rightHandSide": {
+                      "id": 66355,
+                      "name": "_systemConfig",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66342,
+                      "src": "5303:13:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_contract$_SystemConfig_$69375",
+                        "typeString": "contract SystemConfig"
+                      }
+                    },
+                    "src": "5288:28:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_contract$_SystemConfig_$69375",
+                      "typeString": "contract SystemConfig"
+                    }
+                  },
+                  "id": 66357,
+                  "nodeType": "ExpressionStatement",
+                  "src": "5288:28:81"
+                },
+                {
+                  "expression": {
+                    "id": 66360,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftHandSide": {
+                      "id": 66358,
+                      "name": "superchainConfig",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66259,
+                      "src": "5326:16:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_contract$_SuperchainConfig_$68561",
+                        "typeString": "contract SuperchainConfig"
+                      }
+                    },
+                    "nodeType": "Assignment",
+                    "operator": "=",
+                    "rightHandSide": {
+                      "id": 66359,
+                      "name": "_superchainConfig",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66345,
+                      "src": "5345:17:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_contract$_SuperchainConfig_$68561",
+                        "typeString": "contract SuperchainConfig"
+                      }
+                    },
+                    "src": "5326:36:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_contract$_SuperchainConfig_$68561",
+                      "typeString": "contract SuperchainConfig"
+                    }
+                  },
+                  "id": 66361,
+                  "nodeType": "ExpressionStatement",
+                  "src": "5326:36:81"
+                },
+                {
+                  "condition": {
+                    "commonType": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    },
+                    "id": 66367,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftExpression": {
+                      "id": 66362,
+                      "name": "l2Sender",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66241,
+                      "src": "5376:8:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_address",
+                        "typeString": "address"
+                      }
+                    },
+                    "nodeType": "BinaryOperation",
+                    "operator": "==",
+                    "rightExpression": {
+                      "arguments": [
+                        {
+                          "hexValue": "30",
+                          "id": 66365,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": true,
+                          "kind": "number",
+                          "lValueRequested": false,
+                          "nodeType": "Literal",
+                          "src": "5396:1:81",
+                          "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": 66364,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "lValueRequested": false,
+                        "nodeType": "ElementaryTypeNameExpression",
+                        "src": "5388:7:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_type$_t_address_$",
+                          "typeString": "type(address)"
+                        },
+                        "typeName": {
+                          "id": 66363,
+                          "name": "address",
+                          "nodeType": "ElementaryTypeName",
+                          "src": "5388:7:81",
+                          "typeDescriptions": {}
+                        }
+                      },
+                      "id": 66366,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": true,
+                      "kind": "typeConversion",
+                      "lValueRequested": false,
+                      "names": [],
+                      "nodeType": "FunctionCall",
+                      "src": "5388:10:81",
+                      "tryCall": false,
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_address",
+                        "typeString": "address"
+                      }
+                    },
+                    "src": "5376:22:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "id": 66374,
+                  "nodeType": "IfStatement",
+                  "src": "5372:91:81",
+                  "trueBody": {
+                    "id": 66373,
+                    "nodeType": "Block",
+                    "src": "5400:63:81",
+                    "statements": [
+                      {
+                        "expression": {
+                          "id": 66371,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "leftHandSide": {
+                            "id": 66368,
+                            "name": "l2Sender",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66241,
+                            "src": "5414:8:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_address",
+                              "typeString": "address"
+                            }
+                          },
+                          "nodeType": "Assignment",
+                          "operator": "=",
+                          "rightHandSide": {
+                            "expression": {
+                              "id": 66369,
+                              "name": "Constants",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 79758,
+                              "src": "5425:9:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_type$_t_contract$_Constants_$79758_$",
+                                "typeString": "type(library Constants)"
+                              }
+                            },
+                            "id": 66370,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": false,
+                            "lValueRequested": false,
+                            "memberName": "DEFAULT_L2_SENDER",
+                            "nodeType": "MemberAccess",
+                            "referencedDeclaration": 79720,
+                            "src": "5425:27:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_address",
+                              "typeString": "address"
+                            }
+                          },
+                          "src": "5414:38:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_address",
+                            "typeString": "address"
+                          }
+                        },
+                        "id": 66372,
+                        "nodeType": "ExpressionStatement",
+                        "src": "5414:38:81"
+                      }
+                    ]
+                  }
+                },
+                {
+                  "expression": {
+                    "arguments": [],
+                    "expression": {
+                      "argumentTypes": [],
+                      "id": 66375,
+                      "name": "__ResourceMetering_init",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 68348,
+                      "src": "5472:23:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
+                        "typeString": "function ()"
+                      }
+                    },
+                    "id": 66376,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "5472:25:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66377,
+                  "nodeType": "ExpressionStatement",
+                  "src": "5472:25:81"
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66336,
+              "nodeType": "StructuredDocumentation",
+              "src": "4857:207:81",
+              "text": "@notice Initializer.\n @param _l2Oracle Contract of the L2OutputOracle.\n @param _systemConfig Contract of the SystemConfig.\n @param _superchainConfig Contract of the SuperchainConfig."
+            },
+            "functionSelector": "c0c53b8b",
+            "implemented": true,
+            "kind": "function",
+            "modifiers": [
+              {
+                "id": 66348,
+                "kind": "modifierInvocation",
+                "modifierName": {
+                  "id": 66347,
+                  "name": "initializer",
+                  "nodeType": "IdentifierPath",
+                  "referencedDeclaration": 43860,
+                  "src": "5232:11:81"
+                },
+                "nodeType": "ModifierInvocation",
+                "src": "5232:11:81"
+              }
+            ],
+            "name": "initialize",
+            "nameLocation": "5078:10:81",
+            "parameters": {
+              "id": 66346,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66339,
+                  "mutability": "mutable",
+                  "name": "_l2Oracle",
+                  "nameLocation": "5113:9:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66379,
+                  "src": "5098:24:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                    "typeString": "contract L2OutputOracle"
+                  },
+                  "typeName": {
+                    "id": 66338,
+                    "nodeType": "UserDefinedTypeName",
+                    "pathNode": {
+                      "id": 66337,
+                      "name": "L2OutputOracle",
+                      "nodeType": "IdentifierPath",
+                      "referencedDeclaration": 66187,
+                      "src": "5098:14:81"
+                    },
+                    "referencedDeclaration": 66187,
+                    "src": "5098:14:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                      "typeString": "contract L2OutputOracle"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66342,
+                  "mutability": "mutable",
+                  "name": "_systemConfig",
+                  "nameLocation": "5145:13:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66379,
+                  "src": "5132:26:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_contract$_SystemConfig_$69375",
+                    "typeString": "contract SystemConfig"
+                  },
+                  "typeName": {
+                    "id": 66341,
+                    "nodeType": "UserDefinedTypeName",
+                    "pathNode": {
+                      "id": 66340,
+                      "name": "SystemConfig",
+                      "nodeType": "IdentifierPath",
+                      "referencedDeclaration": 69375,
+                      "src": "5132:12:81"
+                    },
+                    "referencedDeclaration": 69375,
+                    "src": "5132:12:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_contract$_SystemConfig_$69375",
+                      "typeString": "contract SystemConfig"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66345,
+                  "mutability": "mutable",
+                  "name": "_superchainConfig",
+                  "nameLocation": "5185:17:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66379,
+                  "src": "5168:34:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_contract$_SuperchainConfig_$68561",
+                    "typeString": "contract SuperchainConfig"
+                  },
+                  "typeName": {
+                    "id": 66344,
+                    "nodeType": "UserDefinedTypeName",
+                    "pathNode": {
+                      "id": 66343,
+                      "name": "SuperchainConfig",
+                      "nodeType": "IdentifierPath",
+                      "referencedDeclaration": 68561,
+                      "src": "5168:16:81"
+                    },
+                    "referencedDeclaration": 68561,
+                    "src": "5168:16:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_contract$_SuperchainConfig_$68561",
+                      "typeString": "contract SuperchainConfig"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "5088:120:81"
+            },
+            "returnParameters": {
+              "id": 66349,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "5248:0:81"
+            },
+            "scope": 66856,
+            "stateMutability": "nonpayable",
+            "virtual": false,
+            "visibility": "public"
+          },
+          {
+            "id": 66390,
+            "nodeType": "FunctionDefinition",
+            "src": "5757:101:81",
+            "nodes": [],
+            "body": {
+              "id": 66389,
+              "nodeType": "Block",
+              "src": "5807:51:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "expression": {
+                    "arguments": [],
+                    "expression": {
+                      "argumentTypes": [],
+                      "expression": {
+                        "id": 66385,
+                        "name": "superchainConfig",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66259,
+                        "src": "5824:16:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_contract$_SuperchainConfig_$68561",
+                          "typeString": "contract SuperchainConfig"
+                        }
+                      },
+                      "id": 66386,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "guardian",
+                      "nodeType": "MemberAccess",
+                      "referencedDeclaration": 68461,
+                      "src": "5824:25:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
+                        "typeString": "function () view external returns (address)"
+                      }
+                    },
+                    "id": 66387,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "5824:27:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    }
+                  },
+                  "functionReturnParameters": 66384,
+                  "id": 66388,
+                  "nodeType": "Return",
+                  "src": "5817:34:81"
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66380,
+              "nodeType": "StructuredDocumentation",
+              "src": "5510:242:81",
+              "text": "@notice Getter function for the address of the guardian.\n         Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead.\n @return Address of the guardian.\n @custom:legacy"
+            },
+            "functionSelector": "452a9320",
+            "implemented": true,
+            "kind": "function",
+            "modifiers": [],
+            "name": "guardian",
+            "nameLocation": "5766:8:81",
+            "parameters": {
+              "id": 66381,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "5774:2:81"
+            },
+            "returnParameters": {
+              "id": 66384,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66383,
+                  "mutability": "mutable",
+                  "name": "",
+                  "nameLocation": "-1:-1:-1",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66390,
+                  "src": "5798:7:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_address",
+                    "typeString": "address"
+                  },
+                  "typeName": {
+                    "id": 66382,
+                    "name": "address",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "5798:7:81",
+                    "stateMutability": "nonpayable",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "5797:9:81"
+            },
+            "scope": 66856,
+            "stateMutability": "view",
+            "virtual": false,
+            "visibility": "public"
+          },
+          {
+            "id": 66403,
+            "nodeType": "FunctionDefinition",
+            "src": "5981:105:81",
+            "nodes": [],
+            "body": {
+              "id": 66402,
+              "nodeType": "Block",
+              "src": "6034:52:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "expression": {
+                    "id": 66400,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftHandSide": {
+                      "id": 66396,
+                      "name": "paused_",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66394,
+                      "src": "6044:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bool",
+                        "typeString": "bool"
+                      }
+                    },
+                    "nodeType": "Assignment",
+                    "operator": "=",
+                    "rightHandSide": {
+                      "arguments": [],
+                      "expression": {
+                        "argumentTypes": [],
+                        "expression": {
+                          "id": 66397,
+                          "name": "superchainConfig",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66259,
+                          "src": "6054:16:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_contract$_SuperchainConfig_$68561",
+                            "typeString": "contract SuperchainConfig"
+                          }
+                        },
+                        "id": 66398,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "paused",
+                        "nodeType": "MemberAccess",
+                        "referencedDeclaration": 68475,
+                        "src": "6054:23:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_function_external_view$__$returns$_t_bool_$",
+                          "typeString": "function () view external returns (bool)"
+                        }
+                      },
+                      "id": 66399,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "kind": "functionCall",
+                      "lValueRequested": false,
+                      "names": [],
+                      "nodeType": "FunctionCall",
+                      "src": "6054:25:81",
+                      "tryCall": false,
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bool",
+                        "typeString": "bool"
+                      }
+                    },
+                    "src": "6044:35:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "id": 66401,
+                  "nodeType": "ExpressionStatement",
+                  "src": "6044:35:81"
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66391,
+              "nodeType": "StructuredDocumentation",
+              "src": "5864:112:81",
+              "text": "@notice Getter for the current paused status.\n @return paused_ Whether or not the contract is paused."
+            },
+            "functionSelector": "5c975abb",
+            "implemented": true,
+            "kind": "function",
+            "modifiers": [],
+            "name": "paused",
+            "nameLocation": "5990:6:81",
+            "parameters": {
+              "id": 66392,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "5996:2:81"
+            },
+            "returnParameters": {
+              "id": 66395,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66394,
+                  "mutability": "mutable",
+                  "name": "paused_",
+                  "nameLocation": "6025:7:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66403,
+                  "src": "6020:12:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_bool",
+                    "typeString": "bool"
+                  },
+                  "typeName": {
+                    "id": 66393,
+                    "name": "bool",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "6020:4:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "6019:14:81"
+            },
+            "scope": 66856,
+            "stateMutability": "view",
+            "virtual": false,
+            "visibility": "public"
+          },
+          {
+            "id": 66418,
+            "nodeType": "FunctionDefinition",
+            "src": "6579:120:81",
+            "nodes": [],
+            "body": {
+              "id": 66417,
+              "nodeType": "Block",
+              "src": "6652:47:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "expression": {
+                    "commonType": {
+                      "typeIdentifier": "t_uint64",
+                      "typeString": "uint64"
+                    },
+                    "id": 66415,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftExpression": {
+                      "commonType": {
+                        "typeIdentifier": "t_uint64",
+                        "typeString": "uint64"
+                      },
+                      "id": 66413,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "leftExpression": {
+                        "id": 66411,
+                        "name": "_byteCount",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66406,
+                        "src": "6669:10:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint64",
+                          "typeString": "uint64"
+                        }
+                      },
+                      "nodeType": "BinaryOperation",
+                      "operator": "*",
+                      "rightExpression": {
+                        "hexValue": "3136",
+                        "id": 66412,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "number",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "6682:2:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_rational_16_by_1",
+                          "typeString": "int_const 16"
+                        },
+                        "value": "16"
+                      },
+                      "src": "6669:15:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_uint64",
+                        "typeString": "uint64"
+                      }
+                    },
+                    "nodeType": "BinaryOperation",
+                    "operator": "+",
+                    "rightExpression": {
+                      "hexValue": "3231303030",
+                      "id": 66414,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": true,
+                      "kind": "number",
+                      "lValueRequested": false,
+                      "nodeType": "Literal",
+                      "src": "6687:5:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_rational_21000_by_1",
+                        "typeString": "int_const 21000"
+                      },
+                      "value": "21000"
+                    },
+                    "src": "6669:23:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_uint64",
+                      "typeString": "uint64"
+                    }
+                  },
+                  "functionReturnParameters": 66410,
+                  "id": 66416,
+                  "nodeType": "Return",
+                  "src": "6662:30:81"
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66404,
+              "nodeType": "StructuredDocumentation",
+              "src": "6092:482:81",
+              "text": "@notice Computes the minimum gas limit for a deposit.\n         The minimum gas limit linearly increases based on the size of the calldata.\n         This is to prevent users from creating L2 resource usage without paying for it.\n         This function can be used when interacting with the portal to ensure forwards\n         compatibility.\n @param _byteCount Number of bytes in the calldata.\n @return The minimum gas limit for a deposit."
+            },
+            "functionSelector": "a35d99df",
+            "implemented": true,
+            "kind": "function",
+            "modifiers": [],
+            "name": "minimumGasLimit",
+            "nameLocation": "6588:15:81",
+            "parameters": {
+              "id": 66407,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66406,
+                  "mutability": "mutable",
+                  "name": "_byteCount",
+                  "nameLocation": "6611:10:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66418,
+                  "src": "6604:17:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_uint64",
+                    "typeString": "uint64"
+                  },
+                  "typeName": {
+                    "id": 66405,
+                    "name": "uint64",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "6604:6:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_uint64",
+                      "typeString": "uint64"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "6603:19:81"
+            },
+            "returnParameters": {
+              "id": 66410,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66409,
+                  "mutability": "mutable",
+                  "name": "",
+                  "nameLocation": "-1:-1:-1",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66418,
+                  "src": "6644:6:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_uint64",
+                    "typeString": "uint64"
+                  },
+                  "typeName": {
+                    "id": 66408,
+                    "name": "uint64",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "6644:6:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_uint64",
+                      "typeString": "uint64"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "6643:8:81"
+            },
+            "scope": 66856,
+            "stateMutability": "pure",
+            "virtual": false,
+            "visibility": "public"
+          },
+          {
+            "id": 66436,
+            "nodeType": "FunctionDefinition",
+            "src": "7078:130:81",
+            "nodes": [],
+            "body": {
+              "id": 66435,
+              "nodeType": "Block",
+              "src": "7105:103:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "expression": {
+                          "id": 66423,
+                          "name": "msg",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": -15,
+                          "src": "7134:3:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_magic_message",
+                            "typeString": "msg"
+                          }
+                        },
+                        "id": 66424,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "sender",
+                        "nodeType": "MemberAccess",
+                        "src": "7134:10:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      },
+                      {
+                        "expression": {
+                          "id": 66425,
+                          "name": "msg",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": -15,
+                          "src": "7146:3:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_magic_message",
+                            "typeString": "msg"
+                          }
+                        },
+                        "id": 66426,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "value",
+                        "nodeType": "MemberAccess",
+                        "src": "7146:9:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        }
+                      },
+                      {
+                        "id": 66427,
+                        "name": "RECEIVE_DEFAULT_GAS_LIMIT",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66238,
+                        "src": "7157:25:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint64",
+                          "typeString": "uint64"
+                        }
+                      },
+                      {
+                        "hexValue": "66616c7365",
+                        "id": 66428,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "bool",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "7184:5:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        "value": "false"
+                      },
+                      {
+                        "arguments": [
+                          {
+                            "hexValue": "",
+                            "id": 66431,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "kind": "string",
+                            "lValueRequested": false,
+                            "nodeType": "Literal",
+                            "src": "7197:2:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+                              "typeString": "literal_string \"\""
+                            },
+                            "value": ""
+                          }
+                        ],
+                        "expression": {
+                          "argumentTypes": [
+                            {
+                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+                              "typeString": "literal_string \"\""
+                            }
+                          ],
+                          "id": 66430,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": true,
+                          "lValueRequested": false,
+                          "nodeType": "ElementaryTypeNameExpression",
+                          "src": "7191:5:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
+                            "typeString": "type(bytes storage pointer)"
+                          },
+                          "typeName": {
+                            "id": 66429,
+                            "name": "bytes",
+                            "nodeType": "ElementaryTypeName",
+                            "src": "7191:5:81",
+                            "typeDescriptions": {}
+                          }
+                        },
+                        "id": 66432,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "typeConversion",
+                        "lValueRequested": false,
+                        "names": [],
+                        "nodeType": "FunctionCall",
+                        "src": "7191:9:81",
+                        "tryCall": false,
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes_memory_ptr",
+                          "typeString": "bytes memory"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        },
+                        {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        },
+                        {
+                          "typeIdentifier": "t_uint64",
+                          "typeString": "uint64"
+                        },
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_bytes_memory_ptr",
+                          "typeString": "bytes memory"
+                        }
+                      ],
+                      "id": 66422,
+                      "name": "depositTransaction",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66820,
+                      "src": "7115:18:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint64_$_t_bool_$_t_bytes_memory_ptr_$returns$__$",
+                        "typeString": "function (address,uint256,uint64,bool,bytes memory)"
+                      }
+                    },
+                    "id": 66433,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "7115:86:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66434,
+                  "nodeType": "ExpressionStatement",
+                  "src": "7115:86:81"
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66419,
+              "nodeType": "StructuredDocumentation",
+              "src": "6705:368:81",
+              "text": "@notice Accepts value so that users can send ETH directly to this contract and have the\n         funds be deposited to their address on L2. This is intended as a convenience\n         function for EOAs. Contracts should call the depositTransaction() function directly\n         otherwise any deposited funds will be lost due to address aliasing."
+            },
+            "implemented": true,
+            "kind": "receive",
+            "modifiers": [],
+            "name": "",
+            "nameLocation": "-1:-1:-1",
+            "parameters": {
+              "id": 66420,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "7085:2:81"
+            },
+            "returnParameters": {
+              "id": 66421,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "7105:0:81"
+            },
+            "scope": 66856,
+            "stateMutability": "payable",
+            "virtual": false,
+            "visibility": "external"
+          },
+          {
+            "id": 66441,
+            "nodeType": "FunctionDefinition",
+            "src": "7422:77:81",
+            "nodes": [],
+            "body": {
+              "id": 66440,
+              "nodeType": "Block",
+              "src": "7460:39:81",
+              "nodes": [],
+              "statements": []
+            },
+            "documentation": {
+              "id": 66437,
+              "nodeType": "StructuredDocumentation",
+              "src": "7214:203:81",
+              "text": "@notice Accepts ETH value without triggering a deposit to L2.\n         This function mainly exists for the sake of the migration between the legacy\n         Optimism system and Bedrock."
+            },
+            "functionSelector": "8b4c40b0",
+            "implemented": true,
+            "kind": "function",
+            "modifiers": [],
+            "name": "donateETH",
+            "nameLocation": "7431:9:81",
+            "parameters": {
+              "id": 66438,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "7440:2:81"
+            },
+            "returnParameters": {
+              "id": 66439,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "7460:0:81"
+            },
+            "scope": 66856,
+            "stateMutability": "payable",
+            "virtual": false,
+            "visibility": "external"
+          },
+          {
+            "id": 66454,
+            "nodeType": "FunctionDefinition",
+            "src": "7748:152:81",
+            "nodes": [],
+            "body": {
+              "id": 66453,
+              "nodeType": "Block",
+              "src": "7847:53:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "expression": {
+                    "arguments": [],
+                    "expression": {
+                      "argumentTypes": [],
+                      "expression": {
+                        "id": 66449,
+                        "name": "systemConfig",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66267,
+                        "src": "7864:12:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_contract$_SystemConfig_$69375",
+                          "typeString": "contract SystemConfig"
+                        }
+                      },
+                      "id": 66450,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "resourceConfig",
+                      "nodeType": "MemberAccess",
+                      "referencedDeclaration": 69295,
+                      "src": "7864:27:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_external_view$__$returns$_t_struct$_ResourceConfig_$68026_memory_ptr_$",
+                        "typeString": "function () view external returns (struct ResourceMetering.ResourceConfig memory)"
+                      }
+                    },
+                    "id": 66451,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "7864:29:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_struct$_ResourceConfig_$68026_memory_ptr",
+                      "typeString": "struct ResourceMetering.ResourceConfig memory"
+                    }
+                  },
+                  "functionReturnParameters": 66448,
+                  "id": 66452,
+                  "nodeType": "Return",
+                  "src": "7857:36:81"
+                }
+              ]
+            },
+            "baseFunctions": [
+              68323
+            ],
+            "documentation": {
+              "id": 66442,
+              "nodeType": "StructuredDocumentation",
+              "src": "7505:238:81",
+              "text": "@notice Getter for the resource config.\n         Used internally by the ResourceMetering contract.\n         The SystemConfig is the source of truth for the resource config.\n @return ResourceMetering ResourceConfig"
+            },
+            "implemented": true,
+            "kind": "function",
+            "modifiers": [],
+            "name": "_resourceConfig",
+            "nameLocation": "7757:15:81",
+            "overrides": {
+              "id": 66444,
+              "nodeType": "OverrideSpecifier",
+              "overrides": [],
+              "src": "7789:8:81"
+            },
+            "parameters": {
+              "id": 66443,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "7772:2:81"
+            },
+            "returnParameters": {
+              "id": 66448,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66447,
+                  "mutability": "mutable",
+                  "name": "",
+                  "nameLocation": "-1:-1:-1",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66454,
+                  "src": "7807:38:81",
+                  "stateVariable": false,
+                  "storageLocation": "memory",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_struct$_ResourceConfig_$68026_memory_ptr",
+                    "typeString": "struct ResourceMetering.ResourceConfig"
+                  },
+                  "typeName": {
+                    "id": 66446,
+                    "nodeType": "UserDefinedTypeName",
+                    "pathNode": {
+                      "id": 66445,
+                      "name": "ResourceMetering.ResourceConfig",
+                      "nodeType": "IdentifierPath",
+                      "referencedDeclaration": 68026,
+                      "src": "7807:31:81"
+                    },
+                    "referencedDeclaration": 68026,
+                    "src": "7807:31:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_struct$_ResourceConfig_$68026_storage_ptr",
+                      "typeString": "struct ResourceMetering.ResourceConfig"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "7806:40:81"
+            },
+            "scope": 66856,
+            "stateMutability": "view",
+            "virtual": false,
+            "visibility": "internal"
+          },
+          {
+            "id": 66586,
+            "nodeType": "FunctionDefinition",
+            "src": "8288:3825:81",
+            "nodes": [],
+            "body": {
+              "id": 66585,
+              "nodeType": "Block",
+              "src": "8553:3560:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "commonType": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        },
+                        "id": 66478,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "leftExpression": {
+                          "expression": {
+                            "id": 66472,
+                            "name": "_tx",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66458,
+                            "src": "8798:3:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                              "typeString": "struct Types.WithdrawalTransaction memory"
+                            }
+                          },
+                          "id": 66473,
+                          "isConstant": false,
+                          "isLValue": true,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "memberName": "target",
+                          "nodeType": "MemberAccess",
+                          "referencedDeclaration": 81073,
+                          "src": "8798:10:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_address",
+                            "typeString": "address"
+                          }
+                        },
+                        "nodeType": "BinaryOperation",
+                        "operator": "!=",
+                        "rightExpression": {
+                          "arguments": [
+                            {
+                              "id": 66476,
+                              "name": "this",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": -28,
+                              "src": "8820:4:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_contract$_OptimismPortal_$66856",
+                                "typeString": "contract OptimismPortal"
+                              }
+                            }
+                          ],
+                          "expression": {
+                            "argumentTypes": [
+                              {
+                                "typeIdentifier": "t_contract$_OptimismPortal_$66856",
+                                "typeString": "contract OptimismPortal"
+                              }
+                            ],
+                            "id": 66475,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "lValueRequested": false,
+                            "nodeType": "ElementaryTypeNameExpression",
+                            "src": "8812:7:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_type$_t_address_$",
+                              "typeString": "type(address)"
+                            },
+                            "typeName": {
+                              "id": 66474,
+                              "name": "address",
+                              "nodeType": "ElementaryTypeName",
+                              "src": "8812:7:81",
+                              "typeDescriptions": {}
+                            }
+                          },
+                          "id": 66477,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "kind": "typeConversion",
+                          "lValueRequested": false,
+                          "names": [],
+                          "nodeType": "FunctionCall",
+                          "src": "8812:13:81",
+                          "tryCall": false,
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_address",
+                            "typeString": "address"
+                          }
+                        },
+                        "src": "8798:27:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "hexValue": "4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e64206d6573736167657320746f2074686520706f7274616c20636f6e7472616374",
+                        "id": 66479,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "string",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "8827:65:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_stringliteral_57e41062e2e7b97ddf730827f5249d28f602a3846dfe107ce36292fb1c029eb8",
+                          "typeString": "literal_string \"OptimismPortal: you cannot send messages to the portal contract\""
+                        },
+                        "value": "OptimismPortal: you cannot send messages to the portal contract"
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_stringliteral_57e41062e2e7b97ddf730827f5249d28f602a3846dfe107ce36292fb1c029eb8",
+                          "typeString": "literal_string \"OptimismPortal: you cannot send messages to the portal contract\""
+                        }
+                      ],
+                      "id": 66471,
+                      "name": "require",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [
+                        -18,
+                        -18
+                      ],
+                      "referencedDeclaration": -18,
+                      "src": "8790:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
+                        "typeString": "function (bool,string memory) pure"
+                      }
+                    },
+                    "id": 66480,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "8790:103:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66481,
+                  "nodeType": "ExpressionStatement",
+                  "src": "8790:103:81"
+                },
+                {
+                  "assignments": [
+                    66483
+                  ],
+                  "declarations": [
+                    {
+                      "constant": false,
+                      "id": 66483,
+                      "mutability": "mutable",
+                      "name": "outputRoot",
+                      "nameLocation": "9078:10:81",
+                      "nodeType": "VariableDeclaration",
+                      "scope": 66585,
+                      "src": "9070:18:81",
+                      "stateVariable": false,
+                      "storageLocation": "default",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bytes32",
+                        "typeString": "bytes32"
+                      },
+                      "typeName": {
+                        "id": 66482,
+                        "name": "bytes32",
+                        "nodeType": "ElementaryTypeName",
+                        "src": "9070:7:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        }
+                      },
+                      "visibility": "internal"
+                    }
+                  ],
+                  "id": 66489,
+                  "initialValue": {
+                    "expression": {
+                      "arguments": [
+                        {
+                          "id": 66486,
+                          "name": "_l2OutputIndex",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66460,
+                          "src": "9112:14:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_uint256",
+                            "typeString": "uint256"
+                          }
+                        }
+                      ],
+                      "expression": {
+                        "argumentTypes": [
+                          {
+                            "typeIdentifier": "t_uint256",
+                            "typeString": "uint256"
+                          }
+                        ],
+                        "expression": {
+                          "id": 66484,
+                          "name": "l2Oracle",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66263,
+                          "src": "9091:8:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                            "typeString": "contract L2OutputOracle"
+                          }
+                        },
+                        "id": 66485,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "getL2Output",
+                        "nodeType": "MemberAccess",
+                        "referencedDeclaration": 66027,
+                        "src": "9091:20:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$81039_memory_ptr_$",
+                          "typeString": "function (uint256) view external returns (struct Types.OutputProposal memory)"
+                        }
+                      },
+                      "id": 66487,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "kind": "functionCall",
+                      "lValueRequested": false,
+                      "names": [],
+                      "nodeType": "FunctionCall",
+                      "src": "9091:36:81",
+                      "tryCall": false,
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_struct$_OutputProposal_$81039_memory_ptr",
+                        "typeString": "struct Types.OutputProposal memory"
+                      }
+                    },
+                    "id": 66488,
+                    "isConstant": false,
+                    "isLValue": true,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "memberName": "outputRoot",
+                    "nodeType": "MemberAccess",
+                    "referencedDeclaration": 81034,
+                    "src": "9091:47:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bytes32",
+                      "typeString": "bytes32"
+                    }
+                  },
+                  "nodeType": "VariableDeclarationStatement",
+                  "src": "9070:68:81"
+                },
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "commonType": {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        },
+                        "id": 66496,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "leftExpression": {
+                          "id": 66491,
+                          "name": "outputRoot",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66483,
+                          "src": "9258:10:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_bytes32",
+                            "typeString": "bytes32"
+                          }
+                        },
+                        "nodeType": "BinaryOperation",
+                        "operator": "==",
+                        "rightExpression": {
+                          "arguments": [
+                            {
+                              "id": 66494,
+                              "name": "_outputRootProof",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 66463,
+                              "src": "9300:16:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_struct$_OutputRootProof_$81048_calldata_ptr",
+                                "typeString": "struct Types.OutputRootProof calldata"
+                              }
+                            }
+                          ],
+                          "expression": {
+                            "argumentTypes": [
+                              {
+                                "typeIdentifier": "t_struct$_OutputRootProof_$81048_calldata_ptr",
+                                "typeString": "struct Types.OutputRootProof calldata"
+                              }
+                            ],
+                            "expression": {
+                              "id": 66492,
+                              "name": "Hashing",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 80406,
+                              "src": "9272:7:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_type$_t_contract$_Hashing_$80406_$",
+                                "typeString": "type(library Hashing)"
+                              }
+                            },
+                            "id": 66493,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": false,
+                            "lValueRequested": false,
+                            "memberName": "hashOutputRootProof",
+                            "nodeType": "MemberAccess",
+                            "referencedDeclaration": 80405,
+                            "src": "9272:27:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_function_internal_pure$_t_struct$_OutputRootProof_$81048_memory_ptr_$returns$_t_bytes32_$",
+                              "typeString": "function (struct Types.OutputRootProof memory) pure returns (bytes32)"
+                            }
+                          },
+                          "id": 66495,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "kind": "functionCall",
+                          "lValueRequested": false,
+                          "names": [],
+                          "nodeType": "FunctionCall",
+                          "src": "9272:45:81",
+                          "tryCall": false,
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_bytes32",
+                            "typeString": "bytes32"
+                          }
+                        },
+                        "src": "9258:59:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "hexValue": "4f7074696d69736d506f7274616c3a20696e76616c6964206f757470757420726f6f742070726f6f66",
+                        "id": 66497,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "string",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "9319:43:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_stringliteral_490ec653897228799e7e4c4af8b1fd3b4a0688df98d026b46afa352ce9876996",
+                          "typeString": "literal_string \"OptimismPortal: invalid output root proof\""
+                        },
+                        "value": "OptimismPortal: invalid output root proof"
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_stringliteral_490ec653897228799e7e4c4af8b1fd3b4a0688df98d026b46afa352ce9876996",
+                          "typeString": "literal_string \"OptimismPortal: invalid output root proof\""
+                        }
+                      ],
+                      "id": 66490,
+                      "name": "require",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [
+                        -18,
+                        -18
+                      ],
+                      "referencedDeclaration": -18,
+                      "src": "9237:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
+                        "typeString": "function (bool,string memory) pure"
+                      }
+                    },
+                    "id": 66498,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "9237:135:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66499,
+                  "nodeType": "ExpressionStatement",
+                  "src": "9237:135:81"
+                },
+                {
+                  "assignments": [
+                    66501
+                  ],
+                  "declarations": [
+                    {
+                      "constant": false,
+                      "id": 66501,
+                      "mutability": "mutable",
+                      "name": "withdrawalHash",
+                      "nameLocation": "9491:14:81",
+                      "nodeType": "VariableDeclaration",
+                      "scope": 66585,
+                      "src": "9483:22:81",
+                      "stateVariable": false,
+                      "storageLocation": "default",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bytes32",
+                        "typeString": "bytes32"
+                      },
+                      "typeName": {
+                        "id": 66500,
+                        "name": "bytes32",
+                        "nodeType": "ElementaryTypeName",
+                        "src": "9483:7:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        }
+                      },
+                      "visibility": "internal"
+                    }
+                  ],
+                  "id": 66506,
+                  "initialValue": {
+                    "arguments": [
+                      {
+                        "id": 66504,
+                        "name": "_tx",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66458,
+                        "src": "9531:3:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                          "typeString": "struct Types.WithdrawalTransaction memory"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                          "typeString": "struct Types.WithdrawalTransaction memory"
+                        }
+                      ],
+                      "expression": {
+                        "id": 66502,
+                        "name": "Hashing",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 80406,
+                        "src": "9508:7:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_type$_t_contract$_Hashing_$80406_$",
+                          "typeString": "type(library Hashing)"
+                        }
+                      },
+                      "id": 66503,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "hashWithdrawal",
+                      "nodeType": "MemberAccess",
+                      "referencedDeclaration": 80381,
+                      "src": "9508:22:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_internal_pure$_t_struct$_WithdrawalTransaction_$81080_memory_ptr_$returns$_t_bytes32_$",
+                        "typeString": "function (struct Types.WithdrawalTransaction memory) pure returns (bytes32)"
+                      }
+                    },
+                    "id": 66505,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "9508:27:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bytes32",
+                      "typeString": "bytes32"
+                    }
+                  },
+                  "nodeType": "VariableDeclarationStatement",
+                  "src": "9483:52:81"
+                },
+                {
+                  "assignments": [
+                    66509
+                  ],
+                  "declarations": [
+                    {
+                      "constant": false,
+                      "id": 66509,
+                      "mutability": "mutable",
+                      "name": "provenWithdrawal",
+                      "nameLocation": "9569:16:81",
+                      "nodeType": "VariableDeclaration",
+                      "scope": 66585,
+                      "src": "9545:40:81",
+                      "stateVariable": false,
+                      "storageLocation": "memory",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_memory_ptr",
+                        "typeString": "struct OptimismPortal.ProvenWithdrawal"
+                      },
+                      "typeName": {
+                        "id": 66508,
+                        "nodeType": "UserDefinedTypeName",
+                        "pathNode": {
+                          "id": 66507,
+                          "name": "ProvenWithdrawal",
+                          "nodeType": "IdentifierPath",
+                          "referencedDeclaration": 66230,
+                          "src": "9545:16:81"
+                        },
+                        "referencedDeclaration": 66230,
+                        "src": "9545:16:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_storage_ptr",
+                          "typeString": "struct OptimismPortal.ProvenWithdrawal"
+                        }
+                      },
+                      "visibility": "internal"
+                    }
+                  ],
+                  "id": 66513,
+                  "initialValue": {
+                    "baseExpression": {
+                      "id": 66510,
+                      "name": "provenWithdrawals",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66252,
+                      "src": "9588:17:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$66230_storage_$",
+                        "typeString": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal storage ref)"
+                      }
+                    },
+                    "id": 66512,
+                    "indexExpression": {
+                      "id": 66511,
+                      "name": "withdrawalHash",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66501,
+                      "src": "9606:14:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bytes32",
+                        "typeString": "bytes32"
+                      }
+                    },
+                    "isConstant": false,
+                    "isLValue": true,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "nodeType": "IndexAccess",
+                    "src": "9588:33:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_storage",
+                      "typeString": "struct OptimismPortal.ProvenWithdrawal storage ref"
+                    }
+                  },
+                  "nodeType": "VariableDeclarationStatement",
+                  "src": "9545:76:81"
+                },
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "commonType": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        "id": 66528,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "leftExpression": {
+                          "commonType": {
+                            "typeIdentifier": "t_uint128",
+                            "typeString": "uint128"
+                          },
+                          "id": 66518,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "leftExpression": {
+                            "expression": {
+                              "id": 66515,
+                              "name": "provenWithdrawal",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 66509,
+                              "src": "10175:16:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_memory_ptr",
+                                "typeString": "struct OptimismPortal.ProvenWithdrawal memory"
+                              }
+                            },
+                            "id": 66516,
+                            "isConstant": false,
+                            "isLValue": true,
+                            "isPure": false,
+                            "lValueRequested": false,
+                            "memberName": "timestamp",
+                            "nodeType": "MemberAccess",
+                            "referencedDeclaration": 66227,
+                            "src": "10175:26:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_uint128",
+                              "typeString": "uint128"
+                            }
+                          },
+                          "nodeType": "BinaryOperation",
+                          "operator": "==",
+                          "rightExpression": {
+                            "hexValue": "30",
+                            "id": 66517,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "kind": "number",
+                            "lValueRequested": false,
+                            "nodeType": "Literal",
+                            "src": "10205:1:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_rational_0_by_1",
+                              "typeString": "int_const 0"
+                            },
+                            "value": "0"
+                          },
+                          "src": "10175:31:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_bool",
+                            "typeString": "bool"
+                          }
+                        },
+                        "nodeType": "BinaryOperation",
+                        "operator": "||",
+                        "rightExpression": {
+                          "commonType": {
+                            "typeIdentifier": "t_bytes32",
+                            "typeString": "bytes32"
+                          },
+                          "id": 66527,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "leftExpression": {
+                            "expression": {
+                              "arguments": [
+                                {
+                                  "expression": {
+                                    "id": 66521,
+                                    "name": "provenWithdrawal",
+                                    "nodeType": "Identifier",
+                                    "overloadedDeclarations": [],
+                                    "referencedDeclaration": 66509,
+                                    "src": "10247:16:81",
+                                    "typeDescriptions": {
+                                      "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_memory_ptr",
+                                      "typeString": "struct OptimismPortal.ProvenWithdrawal memory"
+                                    }
+                                  },
+                                  "id": 66522,
+                                  "isConstant": false,
+                                  "isLValue": true,
+                                  "isPure": false,
+                                  "lValueRequested": false,
+                                  "memberName": "l2OutputIndex",
+                                  "nodeType": "MemberAccess",
+                                  "referencedDeclaration": 66229,
+                                  "src": "10247:30:81",
+                                  "typeDescriptions": {
+                                    "typeIdentifier": "t_uint128",
+                                    "typeString": "uint128"
+                                  }
+                                }
+                              ],
+                              "expression": {
+                                "argumentTypes": [
+                                  {
+                                    "typeIdentifier": "t_uint128",
+                                    "typeString": "uint128"
+                                  }
+                                ],
+                                "expression": {
+                                  "id": 66519,
+                                  "name": "l2Oracle",
+                                  "nodeType": "Identifier",
+                                  "overloadedDeclarations": [],
+                                  "referencedDeclaration": 66263,
+                                  "src": "10226:8:81",
+                                  "typeDescriptions": {
+                                    "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                                    "typeString": "contract L2OutputOracle"
+                                  }
+                                },
+                                "id": 66520,
+                                "isConstant": false,
+                                "isLValue": false,
+                                "isPure": false,
+                                "lValueRequested": false,
+                                "memberName": "getL2Output",
+                                "nodeType": "MemberAccess",
+                                "referencedDeclaration": 66027,
+                                "src": "10226:20:81",
+                                "typeDescriptions": {
+                                  "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$81039_memory_ptr_$",
+                                  "typeString": "function (uint256) view external returns (struct Types.OutputProposal memory)"
+                                }
+                              },
+                              "id": 66523,
+                              "isConstant": false,
+                              "isLValue": false,
+                              "isPure": false,
+                              "kind": "functionCall",
+                              "lValueRequested": false,
+                              "names": [],
+                              "nodeType": "FunctionCall",
+                              "src": "10226:52:81",
+                              "tryCall": false,
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_struct$_OutputProposal_$81039_memory_ptr",
+                                "typeString": "struct Types.OutputProposal memory"
+                              }
+                            },
+                            "id": 66524,
+                            "isConstant": false,
+                            "isLValue": true,
+                            "isPure": false,
+                            "lValueRequested": false,
+                            "memberName": "outputRoot",
+                            "nodeType": "MemberAccess",
+                            "referencedDeclaration": 81034,
+                            "src": "10226:63:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_bytes32",
+                              "typeString": "bytes32"
+                            }
+                          },
+                          "nodeType": "BinaryOperation",
+                          "operator": "!=",
+                          "rightExpression": {
+                            "expression": {
+                              "id": 66525,
+                              "name": "provenWithdrawal",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 66509,
+                              "src": "10293:16:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_memory_ptr",
+                                "typeString": "struct OptimismPortal.ProvenWithdrawal memory"
+                              }
+                            },
+                            "id": 66526,
+                            "isConstant": false,
+                            "isLValue": true,
+                            "isPure": false,
+                            "lValueRequested": false,
+                            "memberName": "outputRoot",
+                            "nodeType": "MemberAccess",
+                            "referencedDeclaration": 66225,
+                            "src": "10293:27:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_bytes32",
+                              "typeString": "bytes32"
+                            }
+                          },
+                          "src": "10226:94:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_bool",
+                            "typeString": "bool"
+                          }
+                        },
+                        "src": "10175:145:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "hexValue": "4f7074696d69736d506f7274616c3a207769746864726177616c20686173682068617320616c7265616479206265656e2070726f76656e",
+                        "id": 66529,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "string",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "10334:57:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_stringliteral_5238e365e021f6fd781c2264a5a09100f0670031b56dacfc224b453789ac1dd0",
+                          "typeString": "literal_string \"OptimismPortal: withdrawal hash has already been proven\""
+                        },
+                        "value": "OptimismPortal: withdrawal hash has already been proven"
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_stringliteral_5238e365e021f6fd781c2264a5a09100f0670031b56dacfc224b453789ac1dd0",
+                          "typeString": "literal_string \"OptimismPortal: withdrawal hash has already been proven\""
+                        }
+                      ],
+                      "id": 66514,
+                      "name": "require",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [
+                        -18,
+                        -18
+                      ],
+                      "referencedDeclaration": -18,
+                      "src": "10154:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
+                        "typeString": "function (bool,string memory) pure"
+                      }
+                    },
+                    "id": 66530,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "10154:247:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66531,
+                  "nodeType": "ExpressionStatement",
+                  "src": "10154:247:81"
+                },
+                {
+                  "assignments": [
+                    66533
+                  ],
+                  "declarations": [
+                    {
+                      "constant": false,
+                      "id": 66533,
+                      "mutability": "mutable",
+                      "name": "storageKey",
+                      "nameLocation": "10645:10:81",
+                      "nodeType": "VariableDeclaration",
+                      "scope": 66585,
+                      "src": "10637:18:81",
+                      "stateVariable": false,
+                      "storageLocation": "default",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bytes32",
+                        "typeString": "bytes32"
+                      },
+                      "typeName": {
+                        "id": 66532,
+                        "name": "bytes32",
+                        "nodeType": "ElementaryTypeName",
+                        "src": "10637:7:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        }
+                      },
+                      "visibility": "internal"
+                    }
+                  ],
+                  "id": 66544,
+                  "initialValue": {
+                    "arguments": [
+                      {
+                        "arguments": [
+                          {
+                            "id": 66537,
+                            "name": "withdrawalHash",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66501,
+                            "src": "10709:14:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_bytes32",
+                              "typeString": "bytes32"
+                            }
+                          },
+                          {
+                            "arguments": [
+                              {
+                                "hexValue": "30",
+                                "id": 66540,
+                                "isConstant": false,
+                                "isLValue": false,
+                                "isPure": true,
+                                "kind": "number",
+                                "lValueRequested": false,
+                                "nodeType": "Literal",
+                                "src": "10749:1:81",
+                                "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": 66539,
+                              "isConstant": false,
+                              "isLValue": false,
+                              "isPure": true,
+                              "lValueRequested": false,
+                              "nodeType": "ElementaryTypeNameExpression",
+                              "src": "10741:7:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_type$_t_uint256_$",
+                                "typeString": "type(uint256)"
+                              },
+                              "typeName": {
+                                "id": 66538,
+                                "name": "uint256",
+                                "nodeType": "ElementaryTypeName",
+                                "src": "10741:7:81",
+                                "typeDescriptions": {}
+                              }
+                            },
+                            "id": 66541,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "kind": "typeConversion",
+                            "lValueRequested": false,
+                            "names": [],
+                            "nodeType": "FunctionCall",
+                            "src": "10741:10:81",
+                            "tryCall": false,
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_uint256",
+                              "typeString": "uint256"
+                            }
+                          }
+                        ],
+                        "expression": {
+                          "argumentTypes": [
+                            {
+                              "typeIdentifier": "t_bytes32",
+                              "typeString": "bytes32"
+                            },
+                            {
+                              "typeIdentifier": "t_uint256",
+                              "typeString": "uint256"
+                            }
+                          ],
+                          "expression": {
+                            "id": 66535,
+                            "name": "abi",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": -1,
+                            "src": "10681:3:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_magic_abi",
+                              "typeString": "abi"
+                            }
+                          },
+                          "id": 66536,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": true,
+                          "lValueRequested": false,
+                          "memberName": "encode",
+                          "nodeType": "MemberAccess",
+                          "src": "10681:10:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
+                            "typeString": "function () pure returns (bytes memory)"
+                          }
+                        },
+                        "id": 66542,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "kind": "functionCall",
+                        "lValueRequested": false,
+                        "names": [],
+                        "nodeType": "FunctionCall",
+                        "src": "10681:147:81",
+                        "tryCall": false,
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes_memory_ptr",
+                          "typeString": "bytes memory"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bytes_memory_ptr",
+                          "typeString": "bytes memory"
+                        }
+                      ],
+                      "id": 66534,
+                      "name": "keccak256",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": -8,
+                      "src": "10658:9:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
+                        "typeString": "function (bytes memory) pure returns (bytes32)"
+                      }
+                    },
+                    "id": 66543,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "10658:180:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bytes32",
+                      "typeString": "bytes32"
+                    }
+                  },
+                  "nodeType": "VariableDeclarationStatement",
+                  "src": "10637:201:81"
+                },
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "arguments": [
+                          {
+                            "arguments": [
+                              {
+                                "id": 66550,
+                                "name": "storageKey",
+                                "nodeType": "Identifier",
+                                "overloadedDeclarations": [],
+                                "referencedDeclaration": 66533,
+                                "src": "11264:10:81",
+                                "typeDescriptions": {
+                                  "typeIdentifier": "t_bytes32",
+                                  "typeString": "bytes32"
+                                }
+                              }
+                            ],
+                            "expression": {
+                              "argumentTypes": [
+                                {
+                                  "typeIdentifier": "t_bytes32",
+                                  "typeString": "bytes32"
+                                }
+                              ],
+                              "expression": {
+                                "id": 66548,
+                                "name": "abi",
+                                "nodeType": "Identifier",
+                                "overloadedDeclarations": [],
+                                "referencedDeclaration": -1,
+                                "src": "11253:3:81",
+                                "typeDescriptions": {
+                                  "typeIdentifier": "t_magic_abi",
+                                  "typeString": "abi"
+                                }
+                              },
+                              "id": 66549,
+                              "isConstant": false,
+                              "isLValue": false,
+                              "isPure": true,
+                              "lValueRequested": false,
+                              "memberName": "encode",
+                              "nodeType": "MemberAccess",
+                              "src": "11253:10:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
+                                "typeString": "function () pure returns (bytes memory)"
+                              }
+                            },
+                            "id": 66551,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": false,
+                            "kind": "functionCall",
+                            "lValueRequested": false,
+                            "names": [],
+                            "nodeType": "FunctionCall",
+                            "src": "11253:22:81",
+                            "tryCall": false,
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_bytes_memory_ptr",
+                              "typeString": "bytes memory"
+                            }
+                          },
+                          {
+                            "hexValue": "01",
+                            "id": 66552,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "kind": "hexString",
+                            "lValueRequested": false,
+                            "nodeType": "Literal",
+                            "src": "11301:7:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_stringliteral_5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2",
+                              "typeString": "literal_string hex\"01\""
+                            },
+                            "value": "\u0001"
+                          },
+                          {
+                            "id": 66553,
+                            "name": "_withdrawalProof",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66466,
+                            "src": "11334:16:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
+                              "typeString": "bytes calldata[] calldata"
+                            }
+                          },
+                          {
+                            "expression": {
+                              "id": 66554,
+                              "name": "_outputRootProof",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 66463,
+                              "src": "11375:16:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_struct$_OutputRootProof_$81048_calldata_ptr",
+                                "typeString": "struct Types.OutputRootProof calldata"
+                              }
+                            },
+                            "id": 66555,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": false,
+                            "lValueRequested": false,
+                            "memberName": "messagePasserStorageRoot",
+                            "nodeType": "MemberAccess",
+                            "referencedDeclaration": 81045,
+                            "src": "11375:41:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_bytes32",
+                              "typeString": "bytes32"
+                            }
+                          }
+                        ],
+                        "expression": {
+                          "argumentTypes": [
+                            {
+                              "typeIdentifier": "t_bytes_memory_ptr",
+                              "typeString": "bytes memory"
+                            },
+                            {
+                              "typeIdentifier": "t_stringliteral_5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2",
+                              "typeString": "literal_string hex\"01\""
+                            },
+                            {
+                              "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
+                              "typeString": "bytes calldata[] calldata"
+                            },
+                            {
+                              "typeIdentifier": "t_bytes32",
+                              "typeString": "bytes32"
+                            }
+                          ],
+                          "expression": {
+                            "id": 66546,
+                            "name": "SecureMerkleTrie",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 82765,
+                            "src": "11191:16:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_type$_t_contract$_SecureMerkleTrie_$82765_$",
+                              "typeString": "type(library SecureMerkleTrie)"
+                            }
+                          },
+                          "id": 66547,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "memberName": "verifyInclusionProof",
+                          "nodeType": "MemberAccess",
+                          "referencedDeclaration": 82717,
+                          "src": "11191:37:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_$_t_bytes32_$returns$_t_bool_$",
+                            "typeString": "function (bytes memory,bytes memory,bytes memory[] memory,bytes32) pure returns (bool)"
+                          }
+                        },
+                        "id": 66556,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "kind": "functionCall",
+                        "lValueRequested": false,
+                        "names": [
+                          "_key",
+                          "_value",
+                          "_proof",
+                          "_root"
+                        ],
+                        "nodeType": "FunctionCall",
+                        "src": "11191:240:81",
+                        "tryCall": false,
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "hexValue": "4f7074696d69736d506f7274616c3a20696e76616c6964207769746864726177616c20696e636c7573696f6e2070726f6f66",
+                        "id": 66557,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "string",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "11445:52:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_stringliteral_11b666636981dad70da1c1a9e87589eb7d9c042eacd4d25e887aac557f6cd6b9",
+                          "typeString": "literal_string \"OptimismPortal: invalid withdrawal inclusion proof\""
+                        },
+                        "value": "OptimismPortal: invalid withdrawal inclusion proof"
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_stringliteral_11b666636981dad70da1c1a9e87589eb7d9c042eacd4d25e887aac557f6cd6b9",
+                          "typeString": "literal_string \"OptimismPortal: invalid withdrawal inclusion proof\""
+                        }
+                      ],
+                      "id": 66545,
+                      "name": "require",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [
+                        -18,
+                        -18
+                      ],
+                      "referencedDeclaration": -18,
+                      "src": "11170:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
+                        "typeString": "function (bool,string memory) pure"
+                      }
+                    },
+                    "id": 66558,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "11170:337:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66559,
+                  "nodeType": "ExpressionStatement",
+                  "src": "11170:337:81"
+                },
+                {
+                  "expression": {
+                    "id": 66575,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftHandSide": {
+                      "baseExpression": {
+                        "id": 66560,
+                        "name": "provenWithdrawals",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66252,
+                        "src": "11789:17:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$66230_storage_$",
+                          "typeString": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal storage ref)"
+                        }
+                      },
+                      "id": 66562,
+                      "indexExpression": {
+                        "id": 66561,
+                        "name": "withdrawalHash",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66501,
+                        "src": "11807:14:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        }
+                      },
+                      "isConstant": false,
+                      "isLValue": true,
+                      "isPure": false,
+                      "lValueRequested": true,
+                      "nodeType": "IndexAccess",
+                      "src": "11789:33:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_storage",
+                        "typeString": "struct OptimismPortal.ProvenWithdrawal storage ref"
+                      }
+                    },
+                    "nodeType": "Assignment",
+                    "operator": "=",
+                    "rightHandSide": {
+                      "arguments": [
+                        {
+                          "id": 66564,
+                          "name": "outputRoot",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66483,
+                          "src": "11868:10:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_bytes32",
+                            "typeString": "bytes32"
+                          }
+                        },
+                        {
+                          "arguments": [
+                            {
+                              "expression": {
+                                "id": 66567,
+                                "name": "block",
+                                "nodeType": "Identifier",
+                                "overloadedDeclarations": [],
+                                "referencedDeclaration": -4,
+                                "src": "11911:5:81",
+                                "typeDescriptions": {
+                                  "typeIdentifier": "t_magic_block",
+                                  "typeString": "block"
+                                }
+                              },
+                              "id": 66568,
+                              "isConstant": false,
+                              "isLValue": false,
+                              "isPure": false,
+                              "lValueRequested": false,
+                              "memberName": "timestamp",
+                              "nodeType": "MemberAccess",
+                              "src": "11911:15:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_uint256",
+                                "typeString": "uint256"
+                              }
+                            }
+                          ],
+                          "expression": {
+                            "argumentTypes": [
+                              {
+                                "typeIdentifier": "t_uint256",
+                                "typeString": "uint256"
+                              }
+                            ],
+                            "id": 66566,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "lValueRequested": false,
+                            "nodeType": "ElementaryTypeNameExpression",
+                            "src": "11903:7:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_type$_t_uint128_$",
+                              "typeString": "type(uint128)"
+                            },
+                            "typeName": {
+                              "id": 66565,
+                              "name": "uint128",
+                              "nodeType": "ElementaryTypeName",
+                              "src": "11903:7:81",
+                              "typeDescriptions": {}
+                            }
+                          },
+                          "id": 66569,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "kind": "typeConversion",
+                          "lValueRequested": false,
+                          "names": [],
+                          "nodeType": "FunctionCall",
+                          "src": "11903:24:81",
+                          "tryCall": false,
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_uint128",
+                            "typeString": "uint128"
+                          }
+                        },
+                        {
+                          "arguments": [
+                            {
+                              "id": 66572,
+                              "name": "_l2OutputIndex",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 66460,
+                              "src": "11964:14:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_uint256",
+                                "typeString": "uint256"
+                              }
+                            }
+                          ],
+                          "expression": {
+                            "argumentTypes": [
+                              {
+                                "typeIdentifier": "t_uint256",
+                                "typeString": "uint256"
+                              }
+                            ],
+                            "id": 66571,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "lValueRequested": false,
+                            "nodeType": "ElementaryTypeNameExpression",
+                            "src": "11956:7:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_type$_t_uint128_$",
+                              "typeString": "type(uint128)"
+                            },
+                            "typeName": {
+                              "id": 66570,
+                              "name": "uint128",
+                              "nodeType": "ElementaryTypeName",
+                              "src": "11956:7:81",
+                              "typeDescriptions": {}
+                            }
+                          },
+                          "id": 66573,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "kind": "typeConversion",
+                          "lValueRequested": false,
+                          "names": [],
+                          "nodeType": "FunctionCall",
+                          "src": "11956:23:81",
+                          "tryCall": false,
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_uint128",
+                            "typeString": "uint128"
+                          }
+                        }
+                      ],
+                      "expression": {
+                        "argumentTypes": [
+                          {
+                            "typeIdentifier": "t_bytes32",
+                            "typeString": "bytes32"
+                          },
+                          {
+                            "typeIdentifier": "t_uint128",
+                            "typeString": "uint128"
+                          },
+                          {
+                            "typeIdentifier": "t_uint128",
+                            "typeString": "uint128"
+                          }
+                        ],
+                        "id": 66563,
+                        "name": "ProvenWithdrawal",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66230,
+                        "src": "11825:16:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_type$_t_struct$_ProvenWithdrawal_$66230_storage_ptr_$",
+                          "typeString": "type(struct OptimismPortal.ProvenWithdrawal storage pointer)"
+                        }
+                      },
+                      "id": 66574,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "kind": "structConstructorCall",
+                      "lValueRequested": false,
+                      "names": [
+                        "outputRoot",
+                        "timestamp",
+                        "l2OutputIndex"
+                      ],
+                      "nodeType": "FunctionCall",
+                      "src": "11825:165:81",
+                      "tryCall": false,
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_memory_ptr",
+                        "typeString": "struct OptimismPortal.ProvenWithdrawal memory"
+                      }
+                    },
+                    "src": "11789:201:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_storage",
+                      "typeString": "struct OptimismPortal.ProvenWithdrawal storage ref"
+                    }
+                  },
+                  "id": 66576,
+                  "nodeType": "ExpressionStatement",
+                  "src": "11789:201:81"
+                },
+                {
+                  "eventCall": {
+                    "arguments": [
+                      {
+                        "id": 66578,
+                        "name": "withdrawalHash",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66501,
+                        "src": "12067:14:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        }
+                      },
+                      {
+                        "expression": {
+                          "id": 66579,
+                          "name": "_tx",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66458,
+                          "src": "12083:3:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                            "typeString": "struct Types.WithdrawalTransaction memory"
+                          }
+                        },
+                        "id": 66580,
+                        "isConstant": false,
+                        "isLValue": true,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "sender",
+                        "nodeType": "MemberAccess",
+                        "referencedDeclaration": 81071,
+                        "src": "12083:10:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      },
+                      {
+                        "expression": {
+                          "id": 66581,
+                          "name": "_tx",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66458,
+                          "src": "12095:3:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                            "typeString": "struct Types.WithdrawalTransaction memory"
+                          }
+                        },
+                        "id": 66582,
+                        "isConstant": false,
+                        "isLValue": true,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "target",
+                        "nodeType": "MemberAccess",
+                        "referencedDeclaration": 81073,
+                        "src": "12095:10:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        },
+                        {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        },
+                        {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      ],
+                      "id": 66577,
+                      "name": "WithdrawalProven",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66287,
+                      "src": "12050:16:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$",
+                        "typeString": "function (bytes32,address,address)"
+                      }
+                    },
+                    "id": 66583,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "12050:56:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66584,
+                  "nodeType": "EmitStatement",
+                  "src": "12045:61:81"
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66455,
+              "nodeType": "StructuredDocumentation",
+              "src": "7906:377:81",
+              "text": "@notice Proves a withdrawal transaction.\n @param _tx              Withdrawal transaction to finalize.\n @param _l2OutputIndex   L2 output index to prove against.\n @param _outputRootProof Inclusion proof of the L2ToL1MessagePasser contract's storage root.\n @param _withdrawalProof Inclusion proof of the withdrawal in L2ToL1MessagePasser contract."
+            },
+            "functionSelector": "4870496f",
+            "implemented": true,
+            "kind": "function",
+            "modifiers": [
+              {
+                "id": 66469,
+                "kind": "modifierInvocation",
+                "modifierName": {
+                  "id": 66468,
+                  "name": "whenNotPaused",
+                  "nodeType": "IdentifierPath",
+                  "referencedDeclaration": 66305,
+                  "src": "8535:13:81"
+                },
+                "nodeType": "ModifierInvocation",
+                "src": "8535:13:81"
+              }
+            ],
+            "name": "proveWithdrawalTransaction",
+            "nameLocation": "8297:26:81",
+            "parameters": {
+              "id": 66467,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66458,
+                  "mutability": "mutable",
+                  "name": "_tx",
+                  "nameLocation": "8368:3:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66586,
+                  "src": "8333:38:81",
+                  "stateVariable": false,
+                  "storageLocation": "memory",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                    "typeString": "struct Types.WithdrawalTransaction"
+                  },
+                  "typeName": {
+                    "id": 66457,
+                    "nodeType": "UserDefinedTypeName",
+                    "pathNode": {
+                      "id": 66456,
+                      "name": "Types.WithdrawalTransaction",
+                      "nodeType": "IdentifierPath",
+                      "referencedDeclaration": 81080,
+                      "src": "8333:27:81"
+                    },
+                    "referencedDeclaration": 81080,
+                    "src": "8333:27:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_storage_ptr",
+                      "typeString": "struct Types.WithdrawalTransaction"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66460,
+                  "mutability": "mutable",
+                  "name": "_l2OutputIndex",
+                  "nameLocation": "8389:14:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66586,
+                  "src": "8381:22:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_uint256",
+                    "typeString": "uint256"
+                  },
+                  "typeName": {
+                    "id": 66459,
+                    "name": "uint256",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "8381:7:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_uint256",
+                      "typeString": "uint256"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66463,
+                  "mutability": "mutable",
+                  "name": "_outputRootProof",
+                  "nameLocation": "8444:16:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66586,
+                  "src": "8413:47:81",
+                  "stateVariable": false,
+                  "storageLocation": "calldata",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_struct$_OutputRootProof_$81048_calldata_ptr",
+                    "typeString": "struct Types.OutputRootProof"
+                  },
+                  "typeName": {
+                    "id": 66462,
+                    "nodeType": "UserDefinedTypeName",
+                    "pathNode": {
+                      "id": 66461,
+                      "name": "Types.OutputRootProof",
+                      "nodeType": "IdentifierPath",
+                      "referencedDeclaration": 81048,
+                      "src": "8413:21:81"
+                    },
+                    "referencedDeclaration": 81048,
+                    "src": "8413:21:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_struct$_OutputRootProof_$81048_storage_ptr",
+                      "typeString": "struct Types.OutputRootProof"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66466,
+                  "mutability": "mutable",
+                  "name": "_withdrawalProof",
+                  "nameLocation": "8487:16:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66586,
+                  "src": "8470:33:81",
+                  "stateVariable": false,
+                  "storageLocation": "calldata",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
+                    "typeString": "bytes[]"
+                  },
+                  "typeName": {
+                    "baseType": {
+                      "id": 66464,
+                      "name": "bytes",
+                      "nodeType": "ElementaryTypeName",
+                      "src": "8470:5:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bytes_storage_ptr",
+                        "typeString": "bytes"
+                      }
+                    },
+                    "id": 66465,
+                    "nodeType": "ArrayTypeName",
+                    "src": "8470:7:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
+                      "typeString": "bytes[]"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "8323:186:81"
+            },
+            "returnParameters": {
+              "id": 66470,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "8553:0:81"
+            },
+            "scope": 66856,
+            "stateMutability": "nonpayable",
+            "virtual": false,
+            "visibility": "external"
+          },
+          {
+            "id": 66730,
+            "nodeType": "FunctionDefinition",
+            "src": "12226:4818:81",
+            "nodes": [],
+            "body": {
+              "id": 66729,
+              "nodeType": "Block",
+              "src": "12328:4716:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "commonType": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        },
+                        "id": 66599,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "leftExpression": {
+                          "id": 66596,
+                          "name": "l2Sender",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66241,
+                          "src": "12594:8:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_address",
+                            "typeString": "address"
+                          }
+                        },
+                        "nodeType": "BinaryOperation",
+                        "operator": "==",
+                        "rightExpression": {
+                          "expression": {
+                            "id": 66597,
+                            "name": "Constants",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 79758,
+                            "src": "12606:9:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_type$_t_contract$_Constants_$79758_$",
+                              "typeString": "type(library Constants)"
+                            }
+                          },
+                          "id": 66598,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "memberName": "DEFAULT_L2_SENDER",
+                          "nodeType": "MemberAccess",
+                          "referencedDeclaration": 79720,
+                          "src": "12606:27:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_address",
+                            "typeString": "address"
+                          }
+                        },
+                        "src": "12594:39:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "hexValue": "4f7074696d69736d506f7274616c3a2063616e206f6e6c792074726967676572206f6e65207769746864726177616c20706572207472616e73616374696f6e",
+                        "id": 66600,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "string",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "12635:65:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_stringliteral_452e6500a4013b85635a7a9b231d68a5197c7f7579d0b96d0b2f2e5fe6b5995b",
+                          "typeString": "literal_string \"OptimismPortal: can only trigger one withdrawal per transaction\""
+                        },
+                        "value": "OptimismPortal: can only trigger one withdrawal per transaction"
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_stringliteral_452e6500a4013b85635a7a9b231d68a5197c7f7579d0b96d0b2f2e5fe6b5995b",
+                          "typeString": "literal_string \"OptimismPortal: can only trigger one withdrawal per transaction\""
+                        }
+                      ],
+                      "id": 66595,
+                      "name": "require",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [
+                        -18,
+                        -18
+                      ],
+                      "referencedDeclaration": -18,
+                      "src": "12573:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
+                        "typeString": "function (bool,string memory) pure"
+                      }
+                    },
+                    "id": 66601,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "12573:137:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66602,
+                  "nodeType": "ExpressionStatement",
+                  "src": "12573:137:81"
+                },
+                {
+                  "assignments": [
+                    66604
+                  ],
+                  "declarations": [
+                    {
+                      "constant": false,
+                      "id": 66604,
+                      "mutability": "mutable",
+                      "name": "withdrawalHash",
+                      "nameLocation": "12801:14:81",
+                      "nodeType": "VariableDeclaration",
+                      "scope": 66729,
+                      "src": "12793:22:81",
+                      "stateVariable": false,
+                      "storageLocation": "default",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bytes32",
+                        "typeString": "bytes32"
+                      },
+                      "typeName": {
+                        "id": 66603,
+                        "name": "bytes32",
+                        "nodeType": "ElementaryTypeName",
+                        "src": "12793:7:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        }
+                      },
+                      "visibility": "internal"
+                    }
+                  ],
+                  "id": 66609,
+                  "initialValue": {
+                    "arguments": [
+                      {
+                        "id": 66607,
+                        "name": "_tx",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66590,
+                        "src": "12841:3:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                          "typeString": "struct Types.WithdrawalTransaction memory"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                          "typeString": "struct Types.WithdrawalTransaction memory"
+                        }
+                      ],
+                      "expression": {
+                        "id": 66605,
+                        "name": "Hashing",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 80406,
+                        "src": "12818:7:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_type$_t_contract$_Hashing_$80406_$",
+                          "typeString": "type(library Hashing)"
+                        }
+                      },
+                      "id": 66606,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "hashWithdrawal",
+                      "nodeType": "MemberAccess",
+                      "referencedDeclaration": 80381,
+                      "src": "12818:22:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_internal_pure$_t_struct$_WithdrawalTransaction_$81080_memory_ptr_$returns$_t_bytes32_$",
+                        "typeString": "function (struct Types.WithdrawalTransaction memory) pure returns (bytes32)"
+                      }
+                    },
+                    "id": 66608,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "12818:27:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bytes32",
+                      "typeString": "bytes32"
+                    }
+                  },
+                  "nodeType": "VariableDeclarationStatement",
+                  "src": "12793:52:81"
+                },
+                {
+                  "assignments": [
+                    66612
+                  ],
+                  "declarations": [
+                    {
+                      "constant": false,
+                      "id": 66612,
+                      "mutability": "mutable",
+                      "name": "provenWithdrawal",
+                      "nameLocation": "12879:16:81",
+                      "nodeType": "VariableDeclaration",
+                      "scope": 66729,
+                      "src": "12855:40:81",
+                      "stateVariable": false,
+                      "storageLocation": "memory",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_memory_ptr",
+                        "typeString": "struct OptimismPortal.ProvenWithdrawal"
+                      },
+                      "typeName": {
+                        "id": 66611,
+                        "nodeType": "UserDefinedTypeName",
+                        "pathNode": {
+                          "id": 66610,
+                          "name": "ProvenWithdrawal",
+                          "nodeType": "IdentifierPath",
+                          "referencedDeclaration": 66230,
+                          "src": "12855:16:81"
+                        },
+                        "referencedDeclaration": 66230,
+                        "src": "12855:16:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_storage_ptr",
+                          "typeString": "struct OptimismPortal.ProvenWithdrawal"
+                        }
+                      },
+                      "visibility": "internal"
+                    }
+                  ],
+                  "id": 66616,
+                  "initialValue": {
+                    "baseExpression": {
+                      "id": 66613,
+                      "name": "provenWithdrawals",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66252,
+                      "src": "12898:17:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$66230_storage_$",
+                        "typeString": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal storage ref)"
+                      }
+                    },
+                    "id": 66615,
+                    "indexExpression": {
+                      "id": 66614,
+                      "name": "withdrawalHash",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66604,
+                      "src": "12916:14:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bytes32",
+                        "typeString": "bytes32"
+                      }
+                    },
+                    "isConstant": false,
+                    "isLValue": true,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "nodeType": "IndexAccess",
+                    "src": "12898:33:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_storage",
+                      "typeString": "struct OptimismPortal.ProvenWithdrawal storage ref"
+                    }
+                  },
+                  "nodeType": "VariableDeclarationStatement",
+                  "src": "12855:76:81"
+                },
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "commonType": {
+                          "typeIdentifier": "t_uint128",
+                          "typeString": "uint128"
+                        },
+                        "id": 66621,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "leftExpression": {
+                          "expression": {
+                            "id": 66618,
+                            "name": "provenWithdrawal",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66612,
+                            "src": "13181:16:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_memory_ptr",
+                              "typeString": "struct OptimismPortal.ProvenWithdrawal memory"
+                            }
+                          },
+                          "id": 66619,
+                          "isConstant": false,
+                          "isLValue": true,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "memberName": "timestamp",
+                          "nodeType": "MemberAccess",
+                          "referencedDeclaration": 66227,
+                          "src": "13181:26:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_uint128",
+                            "typeString": "uint128"
+                          }
+                        },
+                        "nodeType": "BinaryOperation",
+                        "operator": "!=",
+                        "rightExpression": {
+                          "hexValue": "30",
+                          "id": 66620,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": true,
+                          "kind": "number",
+                          "lValueRequested": false,
+                          "nodeType": "Literal",
+                          "src": "13211:1:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_rational_0_by_1",
+                            "typeString": "int_const 0"
+                          },
+                          "value": "0"
+                        },
+                        "src": "13181:31:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "hexValue": "4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e6f74206265656e2070726f76656e20796574",
+                        "id": 66622,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "string",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "13214:52:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_stringliteral_bc94f9f4f2ecd47ddd807efca122bcc34325481f7fe9d60687e25c709aff1610",
+                          "typeString": "literal_string \"OptimismPortal: withdrawal has not been proven yet\""
+                        },
+                        "value": "OptimismPortal: withdrawal has not been proven yet"
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_stringliteral_bc94f9f4f2ecd47ddd807efca122bcc34325481f7fe9d60687e25c709aff1610",
+                          "typeString": "literal_string \"OptimismPortal: withdrawal has not been proven yet\""
+                        }
+                      ],
+                      "id": 66617,
+                      "name": "require",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [
+                        -18,
+                        -18
+                      ],
+                      "referencedDeclaration": -18,
+                      "src": "13173:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
+                        "typeString": "function (bool,string memory) pure"
+                      }
+                    },
+                    "id": 66623,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "13173:94:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66624,
+                  "nodeType": "ExpressionStatement",
+                  "src": "13173:94:81"
+                },
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "commonType": {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        },
+                        "id": 66631,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "leftExpression": {
+                          "expression": {
+                            "id": 66626,
+                            "name": "provenWithdrawal",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66612,
+                            "src": "13554:16:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_memory_ptr",
+                              "typeString": "struct OptimismPortal.ProvenWithdrawal memory"
+                            }
+                          },
+                          "id": 66627,
+                          "isConstant": false,
+                          "isLValue": true,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "memberName": "timestamp",
+                          "nodeType": "MemberAccess",
+                          "referencedDeclaration": 66227,
+                          "src": "13554:26:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_uint128",
+                            "typeString": "uint128"
+                          }
+                        },
+                        "nodeType": "BinaryOperation",
+                        "operator": ">=",
+                        "rightExpression": {
+                          "arguments": [],
+                          "expression": {
+                            "argumentTypes": [],
+                            "expression": {
+                              "id": 66628,
+                              "name": "l2Oracle",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 66263,
+                              "src": "13584:8:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                                "typeString": "contract L2OutputOracle"
+                              }
+                            },
+                            "id": 66629,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": false,
+                            "lValueRequested": false,
+                            "memberName": "startingTimestamp",
+                            "nodeType": "MemberAccess",
+                            "referencedDeclaration": 65694,
+                            "src": "13584:26:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
+                              "typeString": "function () view external returns (uint256)"
+                            }
+                          },
+                          "id": 66630,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "kind": "functionCall",
+                          "lValueRequested": false,
+                          "names": [],
+                          "nodeType": "FunctionCall",
+                          "src": "13584:28:81",
+                          "tryCall": false,
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_uint256",
+                            "typeString": "uint256"
+                          }
+                        },
+                        "src": "13554:58:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "hexValue": "4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657374616d70206c657373207468616e204c32204f7261636c65207374617274696e672074696d657374616d70",
+                        "id": 66632,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "string",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "13626:77:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_stringliteral_5c7c78dd7f8d5d79f2ff5ac1a4442209661a78fffa24392f88331b760a60bedd",
+                          "typeString": "literal_string \"OptimismPortal: withdrawal timestamp less than L2 Oracle starting timestamp\""
+                        },
+                        "value": "OptimismPortal: withdrawal timestamp less than L2 Oracle starting timestamp"
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_stringliteral_5c7c78dd7f8d5d79f2ff5ac1a4442209661a78fffa24392f88331b760a60bedd",
+                          "typeString": "literal_string \"OptimismPortal: withdrawal timestamp less than L2 Oracle starting timestamp\""
+                        }
+                      ],
+                      "id": 66625,
+                      "name": "require",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [
+                        -18,
+                        -18
+                      ],
+                      "referencedDeclaration": -18,
+                      "src": "13533:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
+                        "typeString": "function (bool,string memory) pure"
+                      }
+                    },
+                    "id": 66633,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "13533:180:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66634,
+                  "nodeType": "ExpressionStatement",
+                  "src": "13533:180:81"
+                },
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "arguments": [
+                          {
+                            "expression": {
+                              "id": 66637,
+                              "name": "provenWithdrawal",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 66612,
+                              "src": "14132:16:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_memory_ptr",
+                                "typeString": "struct OptimismPortal.ProvenWithdrawal memory"
+                              }
+                            },
+                            "id": 66638,
+                            "isConstant": false,
+                            "isLValue": true,
+                            "isPure": false,
+                            "lValueRequested": false,
+                            "memberName": "timestamp",
+                            "nodeType": "MemberAccess",
+                            "referencedDeclaration": 66227,
+                            "src": "14132:26:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_uint128",
+                              "typeString": "uint128"
+                            }
+                          }
+                        ],
+                        "expression": {
+                          "argumentTypes": [
+                            {
+                              "typeIdentifier": "t_uint128",
+                              "typeString": "uint128"
+                            }
+                          ],
+                          "id": 66636,
+                          "name": "_isFinalizationPeriodElapsed",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66855,
+                          "src": "14103:28:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$",
+                            "typeString": "function (uint256) view returns (bool)"
+                          }
+                        },
+                        "id": 66639,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "kind": "functionCall",
+                        "lValueRequested": false,
+                        "names": [],
+                        "nodeType": "FunctionCall",
+                        "src": "14103:56:81",
+                        "tryCall": false,
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "hexValue": "4f7074696d69736d506f7274616c3a2070726f76656e207769746864726177616c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c6170736564",
+                        "id": 66640,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "string",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "14173:71:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_stringliteral_98a66ca0d4a8e5a839585f0aa5b4b8fc94a946382443fc5580ee1ed6e6237f70",
+                          "typeString": "literal_string \"OptimismPortal: proven withdrawal finalization period has not elapsed\""
+                        },
+                        "value": "OptimismPortal: proven withdrawal finalization period has not elapsed"
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_stringliteral_98a66ca0d4a8e5a839585f0aa5b4b8fc94a946382443fc5580ee1ed6e6237f70",
+                          "typeString": "literal_string \"OptimismPortal: proven withdrawal finalization period has not elapsed\""
+                        }
+                      ],
+                      "id": 66635,
+                      "name": "require",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [
+                        -18,
+                        -18
+                      ],
+                      "referencedDeclaration": -18,
+                      "src": "14082:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
+                        "typeString": "function (bool,string memory) pure"
+                      }
+                    },
+                    "id": 66641,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "14082:172:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66642,
+                  "nodeType": "ExpressionStatement",
+                  "src": "14082:172:81"
+                },
+                {
+                  "assignments": [
+                    66647
+                  ],
+                  "declarations": [
+                    {
+                      "constant": false,
+                      "id": 66647,
+                      "mutability": "mutable",
+                      "name": "proposal",
+                      "nameLocation": "14453:8:81",
+                      "nodeType": "VariableDeclaration",
+                      "scope": 66729,
+                      "src": "14425:36:81",
+                      "stateVariable": false,
+                      "storageLocation": "memory",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_struct$_OutputProposal_$81039_memory_ptr",
+                        "typeString": "struct Types.OutputProposal"
+                      },
+                      "typeName": {
+                        "id": 66646,
+                        "nodeType": "UserDefinedTypeName",
+                        "pathNode": {
+                          "id": 66645,
+                          "name": "Types.OutputProposal",
+                          "nodeType": "IdentifierPath",
+                          "referencedDeclaration": 81039,
+                          "src": "14425:20:81"
+                        },
+                        "referencedDeclaration": 81039,
+                        "src": "14425:20:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_struct$_OutputProposal_$81039_storage_ptr",
+                          "typeString": "struct Types.OutputProposal"
+                        }
+                      },
+                      "visibility": "internal"
+                    }
+                  ],
+                  "id": 66653,
+                  "initialValue": {
+                    "arguments": [
+                      {
+                        "expression": {
+                          "id": 66650,
+                          "name": "provenWithdrawal",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66612,
+                          "src": "14485:16:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_memory_ptr",
+                            "typeString": "struct OptimismPortal.ProvenWithdrawal memory"
+                          }
+                        },
+                        "id": 66651,
+                        "isConstant": false,
+                        "isLValue": true,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "l2OutputIndex",
+                        "nodeType": "MemberAccess",
+                        "referencedDeclaration": 66229,
+                        "src": "14485:30:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint128",
+                          "typeString": "uint128"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_uint128",
+                          "typeString": "uint128"
+                        }
+                      ],
+                      "expression": {
+                        "id": 66648,
+                        "name": "l2Oracle",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66263,
+                        "src": "14464:8:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                          "typeString": "contract L2OutputOracle"
+                        }
+                      },
+                      "id": 66649,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "getL2Output",
+                      "nodeType": "MemberAccess",
+                      "referencedDeclaration": 66027,
+                      "src": "14464:20:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$81039_memory_ptr_$",
+                        "typeString": "function (uint256) view external returns (struct Types.OutputProposal memory)"
+                      }
+                    },
+                    "id": 66652,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "14464:52:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_struct$_OutputProposal_$81039_memory_ptr",
+                      "typeString": "struct Types.OutputProposal memory"
+                    }
+                  },
+                  "nodeType": "VariableDeclarationStatement",
+                  "src": "14425:91:81"
+                },
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "commonType": {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        },
+                        "id": 66659,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "leftExpression": {
+                          "expression": {
+                            "id": 66655,
+                            "name": "proposal",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66647,
+                            "src": "14804:8:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_struct$_OutputProposal_$81039_memory_ptr",
+                              "typeString": "struct Types.OutputProposal memory"
+                            }
+                          },
+                          "id": 66656,
+                          "isConstant": false,
+                          "isLValue": true,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "memberName": "outputRoot",
+                          "nodeType": "MemberAccess",
+                          "referencedDeclaration": 81034,
+                          "src": "14804:19:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_bytes32",
+                            "typeString": "bytes32"
+                          }
+                        },
+                        "nodeType": "BinaryOperation",
+                        "operator": "==",
+                        "rightExpression": {
+                          "expression": {
+                            "id": 66657,
+                            "name": "provenWithdrawal",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66612,
+                            "src": "14827:16:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_struct$_ProvenWithdrawal_$66230_memory_ptr",
+                              "typeString": "struct OptimismPortal.ProvenWithdrawal memory"
+                            }
+                          },
+                          "id": 66658,
+                          "isConstant": false,
+                          "isLValue": true,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "memberName": "outputRoot",
+                          "nodeType": "MemberAccess",
+                          "referencedDeclaration": 66225,
+                          "src": "14827:27:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_bytes32",
+                            "typeString": "bytes32"
+                          }
+                        },
+                        "src": "14804:50:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "hexValue": "4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f76656e206973206e6f74207468652073616d652061732063757272656e74206f757470757420726f6f74",
+                        "id": 66660,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "string",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "14868:75:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_stringliteral_2bee9e90a055fc3fdea28727a1d039ffb281ae00c8962ca3262d0dabb187a280",
+                          "typeString": "literal_string \"OptimismPortal: output root proven is not the same as current output root\""
+                        },
+                        "value": "OptimismPortal: output root proven is not the same as current output root"
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_stringliteral_2bee9e90a055fc3fdea28727a1d039ffb281ae00c8962ca3262d0dabb187a280",
+                          "typeString": "literal_string \"OptimismPortal: output root proven is not the same as current output root\""
+                        }
+                      ],
+                      "id": 66654,
+                      "name": "require",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [
+                        -18,
+                        -18
+                      ],
+                      "referencedDeclaration": -18,
+                      "src": "14783:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
+                        "typeString": "function (bool,string memory) pure"
+                      }
+                    },
+                    "id": 66661,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "14783:170:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66662,
+                  "nodeType": "ExpressionStatement",
+                  "src": "14783:170:81"
+                },
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "arguments": [
+                          {
+                            "expression": {
+                              "id": 66665,
+                              "name": "proposal",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 66647,
+                              "src": "15081:8:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_struct$_OutputProposal_$81039_memory_ptr",
+                                "typeString": "struct Types.OutputProposal memory"
+                              }
+                            },
+                            "id": 66666,
+                            "isConstant": false,
+                            "isLValue": true,
+                            "isPure": false,
+                            "lValueRequested": false,
+                            "memberName": "timestamp",
+                            "nodeType": "MemberAccess",
+                            "referencedDeclaration": 81036,
+                            "src": "15081:18:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_uint128",
+                              "typeString": "uint128"
+                            }
+                          }
+                        ],
+                        "expression": {
+                          "argumentTypes": [
+                            {
+                              "typeIdentifier": "t_uint128",
+                              "typeString": "uint128"
+                            }
+                          ],
+                          "id": 66664,
+                          "name": "_isFinalizationPeriodElapsed",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66855,
+                          "src": "15052:28:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$",
+                            "typeString": "function (uint256) view returns (bool)"
+                          }
+                        },
+                        "id": 66667,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "kind": "functionCall",
+                        "lValueRequested": false,
+                        "names": [],
+                        "nodeType": "FunctionCall",
+                        "src": "15052:48:81",
+                        "tryCall": false,
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "hexValue": "4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c6170736564",
+                        "id": 66668,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "string",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "15114:69:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_stringliteral_e2e53e5f2e5c146290963511529e48aa3e1570a42475ccc1fb3eba5190175c74",
+                          "typeString": "literal_string \"OptimismPortal: output proposal finalization period has not elapsed\""
+                        },
+                        "value": "OptimismPortal: output proposal finalization period has not elapsed"
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_stringliteral_e2e53e5f2e5c146290963511529e48aa3e1570a42475ccc1fb3eba5190175c74",
+                          "typeString": "literal_string \"OptimismPortal: output proposal finalization period has not elapsed\""
+                        }
+                      ],
+                      "id": 66663,
+                      "name": "require",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [
+                        -18,
+                        -18
+                      ],
+                      "referencedDeclaration": -18,
+                      "src": "15031:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
+                        "typeString": "function (bool,string memory) pure"
+                      }
+                    },
+                    "id": 66669,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "15031:162:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66670,
+                  "nodeType": "ExpressionStatement",
+                  "src": "15031:162:81"
+                },
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "commonType": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        "id": 66676,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "leftExpression": {
+                          "baseExpression": {
+                            "id": 66672,
+                            "name": "finalizedWithdrawals",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66246,
+                            "src": "15309:20:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$",
+                              "typeString": "mapping(bytes32 => bool)"
+                            }
+                          },
+                          "id": 66674,
+                          "indexExpression": {
+                            "id": 66673,
+                            "name": "withdrawalHash",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66604,
+                            "src": "15330:14:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_bytes32",
+                              "typeString": "bytes32"
+                            }
+                          },
+                          "isConstant": false,
+                          "isLValue": true,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "nodeType": "IndexAccess",
+                          "src": "15309:36:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_bool",
+                            "typeString": "bool"
+                          }
+                        },
+                        "nodeType": "BinaryOperation",
+                        "operator": "==",
+                        "rightExpression": {
+                          "hexValue": "66616c7365",
+                          "id": 66675,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": true,
+                          "kind": "bool",
+                          "lValueRequested": false,
+                          "nodeType": "Literal",
+                          "src": "15349:5:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_bool",
+                            "typeString": "bool"
+                          },
+                          "value": "false"
+                        },
+                        "src": "15309:45:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "hexValue": "4f7074696d69736d506f7274616c3a207769746864726177616c2068617320616c7265616479206265656e2066696e616c697a6564",
+                        "id": 66677,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "string",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "15356:55:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_stringliteral_2a1157cbf4171a399f26106a5211324151853c78d2faca1fb1d3acbf755aa485",
+                          "typeString": "literal_string \"OptimismPortal: withdrawal has already been finalized\""
+                        },
+                        "value": "OptimismPortal: withdrawal has already been finalized"
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_stringliteral_2a1157cbf4171a399f26106a5211324151853c78d2faca1fb1d3acbf755aa485",
+                          "typeString": "literal_string \"OptimismPortal: withdrawal has already been finalized\""
+                        }
+                      ],
+                      "id": 66671,
+                      "name": "require",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [
+                        -18,
+                        -18
+                      ],
+                      "referencedDeclaration": -18,
+                      "src": "15301:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
+                        "typeString": "function (bool,string memory) pure"
+                      }
+                    },
+                    "id": 66678,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "15301:111:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66679,
+                  "nodeType": "ExpressionStatement",
+                  "src": "15301:111:81"
+                },
+                {
+                  "expression": {
+                    "id": 66684,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftHandSide": {
+                      "baseExpression": {
+                        "id": 66680,
+                        "name": "finalizedWithdrawals",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66246,
+                        "src": "15492:20:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$",
+                          "typeString": "mapping(bytes32 => bool)"
+                        }
+                      },
+                      "id": 66682,
+                      "indexExpression": {
+                        "id": 66681,
+                        "name": "withdrawalHash",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66604,
+                        "src": "15513:14:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        }
+                      },
+                      "isConstant": false,
+                      "isLValue": true,
+                      "isPure": false,
+                      "lValueRequested": true,
+                      "nodeType": "IndexAccess",
+                      "src": "15492:36:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bool",
+                        "typeString": "bool"
+                      }
+                    },
+                    "nodeType": "Assignment",
+                    "operator": "=",
+                    "rightHandSide": {
+                      "hexValue": "74727565",
+                      "id": 66683,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": true,
+                      "kind": "bool",
+                      "lValueRequested": false,
+                      "nodeType": "Literal",
+                      "src": "15531:4:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bool",
+                        "typeString": "bool"
+                      },
+                      "value": "true"
+                    },
+                    "src": "15492:43:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "id": 66685,
+                  "nodeType": "ExpressionStatement",
+                  "src": "15492:43:81"
+                },
+                {
+                  "expression": {
+                    "id": 66689,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftHandSide": {
+                      "id": 66686,
+                      "name": "l2Sender",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66241,
+                      "src": "15629:8:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_address",
+                        "typeString": "address"
+                      }
+                    },
+                    "nodeType": "Assignment",
+                    "operator": "=",
+                    "rightHandSide": {
+                      "expression": {
+                        "id": 66687,
+                        "name": "_tx",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66590,
+                        "src": "15640:3:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                          "typeString": "struct Types.WithdrawalTransaction memory"
+                        }
+                      },
+                      "id": 66688,
+                      "isConstant": false,
+                      "isLValue": true,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "sender",
+                      "nodeType": "MemberAccess",
+                      "referencedDeclaration": 81071,
+                      "src": "15640:10:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_address",
+                        "typeString": "address"
+                      }
+                    },
+                    "src": "15629:21:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    }
+                  },
+                  "id": 66690,
+                  "nodeType": "ExpressionStatement",
+                  "src": "15629:21:81"
+                },
+                {
+                  "assignments": [
+                    66692
+                  ],
+                  "declarations": [
+                    {
+                      "constant": false,
+                      "id": 66692,
+                      "mutability": "mutable",
+                      "name": "success",
+                      "nameLocation": "16275:7:81",
+                      "nodeType": "VariableDeclaration",
+                      "scope": 66729,
+                      "src": "16270:12:81",
+                      "stateVariable": false,
+                      "storageLocation": "default",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bool",
+                        "typeString": "bool"
+                      },
+                      "typeName": {
+                        "id": 66691,
+                        "name": "bool",
+                        "nodeType": "ElementaryTypeName",
+                        "src": "16270:4:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      "visibility": "internal"
+                    }
+                  ],
+                  "id": 66704,
+                  "initialValue": {
+                    "arguments": [
+                      {
+                        "expression": {
+                          "id": 66695,
+                          "name": "_tx",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66590,
+                          "src": "16309:3:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                            "typeString": "struct Types.WithdrawalTransaction memory"
+                          }
+                        },
+                        "id": 66696,
+                        "isConstant": false,
+                        "isLValue": true,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "target",
+                        "nodeType": "MemberAccess",
+                        "referencedDeclaration": 81073,
+                        "src": "16309:10:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      },
+                      {
+                        "expression": {
+                          "id": 66697,
+                          "name": "_tx",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66590,
+                          "src": "16321:3:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                            "typeString": "struct Types.WithdrawalTransaction memory"
+                          }
+                        },
+                        "id": 66698,
+                        "isConstant": false,
+                        "isLValue": true,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "gasLimit",
+                        "nodeType": "MemberAccess",
+                        "referencedDeclaration": 81077,
+                        "src": "16321:12:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        }
+                      },
+                      {
+                        "expression": {
+                          "id": 66699,
+                          "name": "_tx",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66590,
+                          "src": "16335:3:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                            "typeString": "struct Types.WithdrawalTransaction memory"
+                          }
+                        },
+                        "id": 66700,
+                        "isConstant": false,
+                        "isLValue": true,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "value",
+                        "nodeType": "MemberAccess",
+                        "referencedDeclaration": 81075,
+                        "src": "16335:9:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        }
+                      },
+                      {
+                        "expression": {
+                          "id": 66701,
+                          "name": "_tx",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 66590,
+                          "src": "16346:3:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                            "typeString": "struct Types.WithdrawalTransaction memory"
+                          }
+                        },
+                        "id": 66702,
+                        "isConstant": false,
+                        "isLValue": true,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "data",
+                        "nodeType": "MemberAccess",
+                        "referencedDeclaration": 81079,
+                        "src": "16346:8:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes_memory_ptr",
+                          "typeString": "bytes memory"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        },
+                        {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        },
+                        {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        },
+                        {
+                          "typeIdentifier": "t_bytes_memory_ptr",
+                          "typeString": "bytes memory"
+                        }
+                      ],
+                      "expression": {
+                        "id": 66693,
+                        "name": "SafeCall",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 80945,
+                        "src": "16285:8:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_type$_t_contract$_SafeCall_$80945_$",
+                          "typeString": "type(library SafeCall)"
+                        }
+                      },
+                      "id": 66694,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "callWithMinGas",
+                      "nodeType": "MemberAccess",
+                      "referencedDeclaration": 80944,
+                      "src": "16285:23:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bool_$",
+                        "typeString": "function (address,uint256,uint256,bytes memory) returns (bool)"
+                      }
+                    },
+                    "id": 66703,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "16285:70:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "nodeType": "VariableDeclarationStatement",
+                  "src": "16270:85:81"
+                },
+                {
+                  "expression": {
+                    "id": 66708,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftHandSide": {
+                      "id": 66705,
+                      "name": "l2Sender",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66241,
+                      "src": "16423:8:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_address",
+                        "typeString": "address"
+                      }
+                    },
+                    "nodeType": "Assignment",
+                    "operator": "=",
+                    "rightHandSide": {
+                      "expression": {
+                        "id": 66706,
+                        "name": "Constants",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 79758,
+                        "src": "16434:9:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_type$_t_contract$_Constants_$79758_$",
+                          "typeString": "type(library Constants)"
+                        }
+                      },
+                      "id": 66707,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "DEFAULT_L2_SENDER",
+                      "nodeType": "MemberAccess",
+                      "referencedDeclaration": 79720,
+                      "src": "16434:27:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_address",
+                        "typeString": "address"
+                      }
+                    },
+                    "src": "16423:38:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    }
+                  },
+                  "id": 66709,
+                  "nodeType": "ExpressionStatement",
+                  "src": "16423:38:81"
+                },
+                {
+                  "eventCall": {
+                    "arguments": [
+                      {
+                        "id": 66711,
+                        "name": "withdrawalHash",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66604,
+                        "src": "16640:14:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        }
+                      },
+                      {
+                        "id": 66712,
+                        "name": "success",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66692,
+                        "src": "16656:7:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_bytes32",
+                          "typeString": "bytes32"
+                        },
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      ],
+                      "id": 66710,
+                      "name": "WithdrawalFinalized",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66294,
+                      "src": "16620:19:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_bool_$returns$__$",
+                        "typeString": "function (bytes32,bool)"
+                      }
+                    },
+                    "id": 66713,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "16620:44:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66714,
+                  "nodeType": "EmitStatement",
+                  "src": "16615:49:81"
+                },
+                {
+                  "condition": {
+                    "commonType": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    },
+                    "id": 66723,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftExpression": {
+                      "commonType": {
+                        "typeIdentifier": "t_bool",
+                        "typeString": "bool"
+                      },
+                      "id": 66717,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "leftExpression": {
+                        "id": 66715,
+                        "name": "success",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66692,
+                        "src": "16928:7:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      "nodeType": "BinaryOperation",
+                      "operator": "==",
+                      "rightExpression": {
+                        "hexValue": "66616c7365",
+                        "id": 66716,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "bool",
+                        "lValueRequested": false,
+                        "nodeType": "Literal",
+                        "src": "16939:5:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        "value": "false"
+                      },
+                      "src": "16928:16:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bool",
+                        "typeString": "bool"
+                      }
+                    },
+                    "nodeType": "BinaryOperation",
+                    "operator": "&&",
+                    "rightExpression": {
+                      "commonType": {
+                        "typeIdentifier": "t_address",
+                        "typeString": "address"
+                      },
+                      "id": 66722,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "leftExpression": {
+                        "expression": {
+                          "id": 66718,
+                          "name": "tx",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": -26,
+                          "src": "16948:2:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_magic_transaction",
+                            "typeString": "tx"
+                          }
+                        },
+                        "id": 66719,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "origin",
+                        "nodeType": "MemberAccess",
+                        "src": "16948:9:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      },
+                      "nodeType": "BinaryOperation",
+                      "operator": "==",
+                      "rightExpression": {
+                        "expression": {
+                          "id": 66720,
+                          "name": "Constants",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": 79758,
+                          "src": "16961:9:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_type$_t_contract$_Constants_$79758_$",
+                            "typeString": "type(library Constants)"
+                          }
+                        },
+                        "id": 66721,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "ESTIMATION_ADDRESS",
+                        "nodeType": "MemberAccess",
+                        "referencedDeclaration": 79716,
+                        "src": "16961:28:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      },
+                      "src": "16948:41:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bool",
+                        "typeString": "bool"
+                      }
+                    },
+                    "src": "16928:61:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "id": 66728,
+                  "nodeType": "IfStatement",
+                  "src": "16924:114:81",
+                  "trueBody": {
+                    "id": 66727,
+                    "nodeType": "Block",
+                    "src": "16991:47:81",
+                    "statements": [
+                      {
+                        "errorCall": {
+                          "arguments": [],
+                          "expression": {
+                            "argumentTypes": [],
+                            "id": 66724,
+                            "name": "GasEstimation",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 80435,
+                            "src": "17012:13:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_function_error_pure$__$returns$__$",
+                              "typeString": "function () pure"
+                            }
+                          },
+                          "id": 66725,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "kind": "functionCall",
+                          "lValueRequested": false,
+                          "names": [],
+                          "nodeType": "FunctionCall",
+                          "src": "17012:15:81",
+                          "tryCall": false,
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_tuple$__$",
+                            "typeString": "tuple()"
+                          }
+                        },
+                        "id": 66726,
+                        "nodeType": "RevertStatement",
+                        "src": "17005:22:81"
+                      }
+                    ]
+                  }
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66587,
+              "nodeType": "StructuredDocumentation",
+              "src": "12119:102:81",
+              "text": "@notice Finalizes a withdrawal transaction.\n @param _tx Withdrawal transaction to finalize."
+            },
+            "functionSelector": "8c3152e9",
+            "implemented": true,
+            "kind": "function",
+            "modifiers": [
+              {
+                "id": 66593,
+                "kind": "modifierInvocation",
+                "modifierName": {
+                  "id": 66592,
+                  "name": "whenNotPaused",
+                  "nodeType": "IdentifierPath",
+                  "referencedDeclaration": 66305,
+                  "src": "12314:13:81"
+                },
+                "nodeType": "ModifierInvocation",
+                "src": "12314:13:81"
+              }
+            ],
+            "name": "finalizeWithdrawalTransaction",
+            "nameLocation": "12235:29:81",
+            "parameters": {
+              "id": 66591,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66590,
+                  "mutability": "mutable",
+                  "name": "_tx",
+                  "nameLocation": "12300:3:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66730,
+                  "src": "12265:38:81",
+                  "stateVariable": false,
+                  "storageLocation": "memory",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_memory_ptr",
+                    "typeString": "struct Types.WithdrawalTransaction"
+                  },
+                  "typeName": {
+                    "id": 66589,
+                    "nodeType": "UserDefinedTypeName",
+                    "pathNode": {
+                      "id": 66588,
+                      "name": "Types.WithdrawalTransaction",
+                      "nodeType": "IdentifierPath",
+                      "referencedDeclaration": 81080,
+                      "src": "12265:27:81"
+                    },
+                    "referencedDeclaration": 81080,
+                    "src": "12265:27:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_struct$_WithdrawalTransaction_$81080_storage_ptr",
+                      "typeString": "struct Types.WithdrawalTransaction"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "12264:40:81"
+            },
+            "returnParameters": {
+              "id": 66594,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "12328:0:81"
+            },
+            "scope": 66856,
+            "stateMutability": "nonpayable",
+            "virtual": false,
+            "visibility": "external"
+          },
+          {
+            "id": 66820,
+            "nodeType": "FunctionDefinition",
+            "src": "17774:1855:81",
+            "nodes": [],
+            "body": {
+              "id": 66819,
+              "nodeType": "Block",
+              "src": "17995:1634:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "condition": {
+                    "commonType": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    },
+                    "id": 66754,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftExpression": {
+                      "id": 66747,
+                      "name": "_isCreation",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66739,
+                      "src": "18134:11:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bool",
+                        "typeString": "bool"
+                      }
+                    },
+                    "nodeType": "BinaryOperation",
+                    "operator": "&&",
+                    "rightExpression": {
+                      "commonType": {
+                        "typeIdentifier": "t_address",
+                        "typeString": "address"
+                      },
+                      "id": 66753,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "leftExpression": {
+                        "id": 66748,
+                        "name": "_to",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66733,
+                        "src": "18149:3:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      },
+                      "nodeType": "BinaryOperation",
+                      "operator": "!=",
+                      "rightExpression": {
+                        "arguments": [
+                          {
+                            "hexValue": "30",
+                            "id": 66751,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "kind": "number",
+                            "lValueRequested": false,
+                            "nodeType": "Literal",
+                            "src": "18164:1:81",
+                            "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": 66750,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": true,
+                          "lValueRequested": false,
+                          "nodeType": "ElementaryTypeNameExpression",
+                          "src": "18156:7:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_type$_t_address_$",
+                            "typeString": "type(address)"
+                          },
+                          "typeName": {
+                            "id": 66749,
+                            "name": "address",
+                            "nodeType": "ElementaryTypeName",
+                            "src": "18156:7:81",
+                            "typeDescriptions": {}
+                          }
+                        },
+                        "id": 66752,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": true,
+                        "kind": "typeConversion",
+                        "lValueRequested": false,
+                        "names": [],
+                        "nodeType": "FunctionCall",
+                        "src": "18156:10:81",
+                        "tryCall": false,
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      },
+                      "src": "18149:17:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bool",
+                        "typeString": "bool"
+                      }
+                    },
+                    "src": "18134:32:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "id": 66758,
+                  "nodeType": "IfStatement",
+                  "src": "18130:56:81",
+                  "trueBody": {
+                    "errorCall": {
+                      "arguments": [],
+                      "expression": {
+                        "argumentTypes": [],
+                        "id": 66755,
+                        "name": "BadTarget",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 80411,
+                        "src": "18175:9:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
+                          "typeString": "function () pure"
+                        }
+                      },
+                      "id": 66756,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "kind": "functionCall",
+                      "lValueRequested": false,
+                      "names": [],
+                      "nodeType": "FunctionCall",
+                      "src": "18175:11:81",
+                      "tryCall": false,
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_tuple$__$",
+                        "typeString": "tuple()"
+                      }
+                    },
+                    "id": 66757,
+                    "nodeType": "RevertStatement",
+                    "src": "18168:18:81"
+                  }
+                },
+                {
+                  "condition": {
+                    "commonType": {
+                      "typeIdentifier": "t_uint64",
+                      "typeString": "uint64"
+                    },
+                    "id": 66767,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftExpression": {
+                      "id": 66759,
+                      "name": "_gasLimit",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66737,
+                      "src": "18338:9:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_uint64",
+                        "typeString": "uint64"
+                      }
+                    },
+                    "nodeType": "BinaryOperation",
+                    "operator": "<",
+                    "rightExpression": {
+                      "arguments": [
+                        {
+                          "arguments": [
+                            {
+                              "expression": {
+                                "id": 66763,
+                                "name": "_data",
+                                "nodeType": "Identifier",
+                                "overloadedDeclarations": [],
+                                "referencedDeclaration": 66741,
+                                "src": "18373:5:81",
+                                "typeDescriptions": {
+                                  "typeIdentifier": "t_bytes_memory_ptr",
+                                  "typeString": "bytes memory"
+                                }
+                              },
+                              "id": 66764,
+                              "isConstant": false,
+                              "isLValue": false,
+                              "isPure": false,
+                              "lValueRequested": false,
+                              "memberName": "length",
+                              "nodeType": "MemberAccess",
+                              "src": "18373:12:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_uint256",
+                                "typeString": "uint256"
+                              }
+                            }
+                          ],
+                          "expression": {
+                            "argumentTypes": [
+                              {
+                                "typeIdentifier": "t_uint256",
+                                "typeString": "uint256"
+                              }
+                            ],
+                            "id": 66762,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": true,
+                            "lValueRequested": false,
+                            "nodeType": "ElementaryTypeNameExpression",
+                            "src": "18366:6:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_type$_t_uint64_$",
+                              "typeString": "type(uint64)"
+                            },
+                            "typeName": {
+                              "id": 66761,
+                              "name": "uint64",
+                              "nodeType": "ElementaryTypeName",
+                              "src": "18366:6:81",
+                              "typeDescriptions": {}
+                            }
+                          },
+                          "id": 66765,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "kind": "typeConversion",
+                          "lValueRequested": false,
+                          "names": [],
+                          "nodeType": "FunctionCall",
+                          "src": "18366:20:81",
+                          "tryCall": false,
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_uint64",
+                            "typeString": "uint64"
+                          }
+                        }
+                      ],
+                      "expression": {
+                        "argumentTypes": [
+                          {
+                            "typeIdentifier": "t_uint64",
+                            "typeString": "uint64"
+                          }
+                        ],
+                        "id": 66760,
+                        "name": "minimumGasLimit",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66418,
+                        "src": "18350:15:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_function_internal_pure$_t_uint64_$returns$_t_uint64_$",
+                          "typeString": "function (uint64) pure returns (uint64)"
+                        }
+                      },
+                      "id": 66766,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "kind": "functionCall",
+                      "lValueRequested": false,
+                      "names": [],
+                      "nodeType": "FunctionCall",
+                      "src": "18350:37:81",
+                      "tryCall": false,
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_uint64",
+                        "typeString": "uint64"
+                      }
+                    },
+                    "src": "18338:49:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "id": 66771,
+                  "nodeType": "IfStatement",
+                  "src": "18334:77:81",
+                  "trueBody": {
+                    "errorCall": {
+                      "arguments": [],
+                      "expression": {
+                        "argumentTypes": [],
+                        "id": 66768,
+                        "name": "SmallGasLimit",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 80417,
+                        "src": "18396:13:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
+                          "typeString": "function () pure"
+                        }
+                      },
+                      "id": 66769,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "kind": "functionCall",
+                      "lValueRequested": false,
+                      "names": [],
+                      "nodeType": "FunctionCall",
+                      "src": "18396:15:81",
+                      "tryCall": false,
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_tuple$__$",
+                        "typeString": "tuple()"
+                      }
+                    },
+                    "id": 66770,
+                    "nodeType": "RevertStatement",
+                    "src": "18389:22:81"
+                  }
+                },
+                {
+                  "condition": {
+                    "commonType": {
+                      "typeIdentifier": "t_uint256",
+                      "typeString": "uint256"
+                    },
+                    "id": 66775,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftExpression": {
+                      "expression": {
+                        "id": 66772,
+                        "name": "_data",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66741,
+                        "src": "18786:5:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes_memory_ptr",
+                          "typeString": "bytes memory"
+                        }
+                      },
+                      "id": 66773,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "length",
+                      "nodeType": "MemberAccess",
+                      "src": "18786:12:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_uint256",
+                        "typeString": "uint256"
+                      }
+                    },
+                    "nodeType": "BinaryOperation",
+                    "operator": ">",
+                    "rightExpression": {
+                      "hexValue": "3132305f303030",
+                      "id": 66774,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": true,
+                      "kind": "number",
+                      "lValueRequested": false,
+                      "nodeType": "Literal",
+                      "src": "18801:7:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_rational_120000_by_1",
+                        "typeString": "int_const 120000"
+                      },
+                      "value": "120_000"
+                    },
+                    "src": "18786:22:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "id": 66779,
+                  "nodeType": "IfStatement",
+                  "src": "18782:50:81",
+                  "trueBody": {
+                    "errorCall": {
+                      "arguments": [],
+                      "expression": {
+                        "argumentTypes": [],
+                        "id": 66776,
+                        "name": "LargeCalldata",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 80414,
+                        "src": "18817:13:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
+                          "typeString": "function () pure"
+                        }
+                      },
+                      "id": 66777,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "kind": "functionCall",
+                      "lValueRequested": false,
+                      "names": [],
+                      "nodeType": "FunctionCall",
+                      "src": "18817:15:81",
+                      "tryCall": false,
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_tuple$__$",
+                        "typeString": "tuple()"
+                      }
+                    },
+                    "id": 66778,
+                    "nodeType": "RevertStatement",
+                    "src": "18810:22:81"
+                  }
+                },
+                {
+                  "assignments": [
+                    66781
+                  ],
+                  "declarations": [
+                    {
+                      "constant": false,
+                      "id": 66781,
+                      "mutability": "mutable",
+                      "name": "from",
+                      "nameLocation": "18931:4:81",
+                      "nodeType": "VariableDeclaration",
+                      "scope": 66819,
+                      "src": "18923:12:81",
+                      "stateVariable": false,
+                      "storageLocation": "default",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_address",
+                        "typeString": "address"
+                      },
+                      "typeName": {
+                        "id": 66780,
+                        "name": "address",
+                        "nodeType": "ElementaryTypeName",
+                        "src": "18923:7:81",
+                        "stateMutability": "nonpayable",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      },
+                      "visibility": "internal"
+                    }
+                  ],
+                  "id": 66784,
+                  "initialValue": {
+                    "expression": {
+                      "id": 66782,
+                      "name": "msg",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": -15,
+                      "src": "18938:3:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_magic_message",
+                        "typeString": "msg"
+                      }
+                    },
+                    "id": 66783,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "memberName": "sender",
+                    "nodeType": "MemberAccess",
+                    "src": "18938:10:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    }
+                  },
+                  "nodeType": "VariableDeclarationStatement",
+                  "src": "18923:25:81"
+                },
+                {
+                  "condition": {
+                    "commonType": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    },
+                    "id": 66789,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftExpression": {
+                      "expression": {
+                        "id": 66785,
+                        "name": "msg",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": -15,
+                        "src": "18962:3:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_magic_message",
+                          "typeString": "msg"
+                        }
+                      },
+                      "id": 66786,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "sender",
+                      "nodeType": "MemberAccess",
+                      "src": "18962:10:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_address",
+                        "typeString": "address"
+                      }
+                    },
+                    "nodeType": "BinaryOperation",
+                    "operator": "!=",
+                    "rightExpression": {
+                      "expression": {
+                        "id": 66787,
+                        "name": "tx",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": -26,
+                        "src": "18976:2:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_magic_transaction",
+                          "typeString": "tx"
+                        }
+                      },
+                      "id": 66788,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "origin",
+                      "nodeType": "MemberAccess",
+                      "src": "18976:9:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_address",
+                        "typeString": "address"
+                      }
+                    },
+                    "src": "18962:23:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "id": 66799,
+                  "nodeType": "IfStatement",
+                  "src": "18958:108:81",
+                  "trueBody": {
+                    "id": 66798,
+                    "nodeType": "Block",
+                    "src": "18987:79:81",
+                    "statements": [
+                      {
+                        "expression": {
+                          "id": 66796,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "leftHandSide": {
+                            "id": 66790,
+                            "name": "from",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66781,
+                            "src": "19001:4:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_address",
+                              "typeString": "address"
+                            }
+                          },
+                          "nodeType": "Assignment",
+                          "operator": "=",
+                          "rightHandSide": {
+                            "arguments": [
+                              {
+                                "expression": {
+                                  "id": 66793,
+                                  "name": "msg",
+                                  "nodeType": "Identifier",
+                                  "overloadedDeclarations": [],
+                                  "referencedDeclaration": -15,
+                                  "src": "19044:3:81",
+                                  "typeDescriptions": {
+                                    "typeIdentifier": "t_magic_message",
+                                    "typeString": "msg"
+                                  }
+                                },
+                                "id": 66794,
+                                "isConstant": false,
+                                "isLValue": false,
+                                "isPure": false,
+                                "lValueRequested": false,
+                                "memberName": "sender",
+                                "nodeType": "MemberAccess",
+                                "src": "19044:10:81",
+                                "typeDescriptions": {
+                                  "typeIdentifier": "t_address",
+                                  "typeString": "address"
+                                }
+                              }
+                            ],
+                            "expression": {
+                              "argumentTypes": [
+                                {
+                                  "typeIdentifier": "t_address",
+                                  "typeString": "address"
+                                }
+                              ],
+                              "expression": {
+                                "id": 66791,
+                                "name": "AddressAliasHelper",
+                                "nodeType": "Identifier",
+                                "overloadedDeclarations": [],
+                                "referencedDeclaration": 85854,
+                                "src": "19008:18:81",
+                                "typeDescriptions": {
+                                  "typeIdentifier": "t_type$_t_contract$_AddressAliasHelper_$85854_$",
+                                  "typeString": "type(library AddressAliasHelper)"
+                                }
+                              },
+                              "id": 66792,
+                              "isConstant": false,
+                              "isLValue": false,
+                              "isPure": false,
+                              "lValueRequested": false,
+                              "memberName": "applyL1ToL2Alias",
+                              "nodeType": "MemberAccess",
+                              "referencedDeclaration": 85831,
+                              "src": "19008:35:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_function_internal_pure$_t_address_$returns$_t_address_$",
+                                "typeString": "function (address) pure returns (address)"
+                              }
+                            },
+                            "id": 66795,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": false,
+                            "kind": "functionCall",
+                            "lValueRequested": false,
+                            "names": [],
+                            "nodeType": "FunctionCall",
+                            "src": "19008:47:81",
+                            "tryCall": false,
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_address",
+                              "typeString": "address"
+                            }
+                          },
+                          "src": "19001:54:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_address",
+                            "typeString": "address"
+                          }
+                        },
+                        "id": 66797,
+                        "nodeType": "ExpressionStatement",
+                        "src": "19001:54:81"
+                      }
+                    ]
+                  }
+                },
+                {
+                  "assignments": [
+                    66801
+                  ],
+                  "declarations": [
+                    {
+                      "constant": false,
+                      "id": 66801,
+                      "mutability": "mutable",
+                      "name": "opaqueData",
+                      "nameLocation": "19336:10:81",
+                      "nodeType": "VariableDeclaration",
+                      "scope": 66819,
+                      "src": "19323:23:81",
+                      "stateVariable": false,
+                      "storageLocation": "memory",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_bytes_memory_ptr",
+                        "typeString": "bytes"
+                      },
+                      "typeName": {
+                        "id": 66800,
+                        "name": "bytes",
+                        "nodeType": "ElementaryTypeName",
+                        "src": "19323:5:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes_storage_ptr",
+                          "typeString": "bytes"
+                        }
+                      },
+                      "visibility": "internal"
+                    }
+                  ],
+                  "id": 66811,
+                  "initialValue": {
+                    "arguments": [
+                      {
+                        "expression": {
+                          "id": 66804,
+                          "name": "msg",
+                          "nodeType": "Identifier",
+                          "overloadedDeclarations": [],
+                          "referencedDeclaration": -15,
+                          "src": "19366:3:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_magic_message",
+                            "typeString": "msg"
+                          }
+                        },
+                        "id": 66805,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "value",
+                        "nodeType": "MemberAccess",
+                        "src": "19366:9:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        }
+                      },
+                      {
+                        "id": 66806,
+                        "name": "_value",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66735,
+                        "src": "19377:6:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        }
+                      },
+                      {
+                        "id": 66807,
+                        "name": "_gasLimit",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66737,
+                        "src": "19385:9:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint64",
+                          "typeString": "uint64"
+                        }
+                      },
+                      {
+                        "id": 66808,
+                        "name": "_isCreation",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66739,
+                        "src": "19396:11:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        }
+                      },
+                      {
+                        "id": 66809,
+                        "name": "_data",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66741,
+                        "src": "19409:5:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes_memory_ptr",
+                          "typeString": "bytes memory"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        },
+                        {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        },
+                        {
+                          "typeIdentifier": "t_uint64",
+                          "typeString": "uint64"
+                        },
+                        {
+                          "typeIdentifier": "t_bool",
+                          "typeString": "bool"
+                        },
+                        {
+                          "typeIdentifier": "t_bytes_memory_ptr",
+                          "typeString": "bytes memory"
+                        }
+                      ],
+                      "expression": {
+                        "id": 66802,
+                        "name": "abi",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": -1,
+                        "src": "19349:3:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_magic_abi",
+                          "typeString": "abi"
+                        }
+                      },
+                      "id": 66803,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": true,
+                      "lValueRequested": false,
+                      "memberName": "encodePacked",
+                      "nodeType": "MemberAccess",
+                      "src": "19349:16:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
+                        "typeString": "function () pure returns (bytes memory)"
+                      }
+                    },
+                    "id": 66810,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "19349:66:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bytes_memory_ptr",
+                      "typeString": "bytes memory"
+                    }
+                  },
+                  "nodeType": "VariableDeclarationStatement",
+                  "src": "19323:92:81"
+                },
+                {
+                  "eventCall": {
+                    "arguments": [
+                      {
+                        "id": 66813,
+                        "name": "from",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66781,
+                        "src": "19583:4:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      },
+                      {
+                        "id": 66814,
+                        "name": "_to",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66733,
+                        "src": "19589:3:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        }
+                      },
+                      {
+                        "id": 66815,
+                        "name": "DEPOSIT_VERSION",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66234,
+                        "src": "19594:15:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        }
+                      },
+                      {
+                        "id": 66816,
+                        "name": "opaqueData",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66801,
+                        "src": "19611:10:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_bytes_memory_ptr",
+                          "typeString": "bytes memory"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        },
+                        {
+                          "typeIdentifier": "t_address",
+                          "typeString": "address"
+                        },
+                        {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        },
+                        {
+                          "typeIdentifier": "t_bytes_memory_ptr",
+                          "typeString": "bytes memory"
+                        }
+                      ],
+                      "id": 66812,
+                      "name": "TransactionDeposited",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66278,
+                      "src": "19562:20:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$",
+                        "typeString": "function (address,address,uint256,bytes memory)"
+                      }
+                    },
+                    "id": 66817,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "19562:60:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_tuple$__$",
+                      "typeString": "tuple()"
+                    }
+                  },
+                  "id": 66818,
+                  "nodeType": "EmitStatement",
+                  "src": "19557:65:81"
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66731,
+              "nodeType": "StructuredDocumentation",
+              "src": "17050:719:81",
+              "text": "@notice Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in\n         deriving deposit transactions. Note that if a deposit is made by a contract, its\n         address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider\n         using the CrossDomainMessenger contracts for a simpler developer experience.\n @param _to         Target address on L2.\n @param _value      ETH value to send to the recipient.\n @param _gasLimit   Amount of L2 gas to purchase by burning gas on L1.\n @param _isCreation Whether or not the transaction is a contract creation.\n @param _data       Data to trigger the recipient with."
+            },
+            "functionSelector": "e9e05c42",
+            "implemented": true,
+            "kind": "function",
+            "modifiers": [
+              {
+                "arguments": [
+                  {
+                    "id": 66744,
+                    "name": "_gasLimit",
+                    "nodeType": "Identifier",
+                    "overloadedDeclarations": [],
+                    "referencedDeclaration": 66737,
+                    "src": "17980:9:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_uint64",
+                      "typeString": "uint64"
+                    }
+                  }
+                ],
+                "id": 66745,
+                "kind": "modifierInvocation",
+                "modifierName": {
+                  "id": 66743,
+                  "name": "metered",
+                  "nodeType": "IdentifierPath",
+                  "referencedDeclaration": 68052,
+                  "src": "17972:7:81"
+                },
+                "nodeType": "ModifierInvocation",
+                "src": "17972:18:81"
+              }
+            ],
+            "name": "depositTransaction",
+            "nameLocation": "17783:18:81",
+            "parameters": {
+              "id": 66742,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66733,
+                  "mutability": "mutable",
+                  "name": "_to",
+                  "nameLocation": "17819:3:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66820,
+                  "src": "17811:11:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_address",
+                    "typeString": "address"
+                  },
+                  "typeName": {
+                    "id": 66732,
+                    "name": "address",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "17811:7:81",
+                    "stateMutability": "nonpayable",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_address",
+                      "typeString": "address"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66735,
+                  "mutability": "mutable",
+                  "name": "_value",
+                  "nameLocation": "17840:6:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66820,
+                  "src": "17832:14:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_uint256",
+                    "typeString": "uint256"
+                  },
+                  "typeName": {
+                    "id": 66734,
+                    "name": "uint256",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "17832:7:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_uint256",
+                      "typeString": "uint256"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66737,
+                  "mutability": "mutable",
+                  "name": "_gasLimit",
+                  "nameLocation": "17863:9:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66820,
+                  "src": "17856:16:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_uint64",
+                    "typeString": "uint64"
+                  },
+                  "typeName": {
+                    "id": 66736,
+                    "name": "uint64",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "17856:6:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_uint64",
+                      "typeString": "uint64"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66739,
+                  "mutability": "mutable",
+                  "name": "_isCreation",
+                  "nameLocation": "17887:11:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66820,
+                  "src": "17882:16:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_bool",
+                    "typeString": "bool"
+                  },
+                  "typeName": {
+                    "id": 66738,
+                    "name": "bool",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "17882:4:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "visibility": "internal"
+                },
+                {
+                  "constant": false,
+                  "id": 66741,
+                  "mutability": "mutable",
+                  "name": "_data",
+                  "nameLocation": "17921:5:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66820,
+                  "src": "17908:18:81",
+                  "stateVariable": false,
+                  "storageLocation": "memory",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_bytes_memory_ptr",
+                    "typeString": "bytes"
+                  },
+                  "typeName": {
+                    "id": 66740,
+                    "name": "bytes",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "17908:5:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bytes_storage_ptr",
+                      "typeString": "bytes"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "17801:131:81"
+            },
+            "returnParameters": {
+              "id": 66746,
+              "nodeType": "ParameterList",
+              "parameters": [],
+              "src": "17995:0:81"
+            },
+            "scope": 66856,
+            "stateMutability": "payable",
+            "virtual": false,
+            "visibility": "public"
+          },
+          {
+            "id": 66837,
+            "nodeType": "FunctionDefinition",
+            "src": "19926:180:81",
+            "nodes": [],
+            "body": {
+              "id": 66836,
+              "nodeType": "Block",
+              "src": "20006:100:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "expression": {
+                    "arguments": [
+                      {
+                        "expression": {
+                          "arguments": [
+                            {
+                              "id": 66831,
+                              "name": "_l2OutputIndex",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 66823,
+                              "src": "20073:14:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_uint256",
+                                "typeString": "uint256"
+                              }
+                            }
+                          ],
+                          "expression": {
+                            "argumentTypes": [
+                              {
+                                "typeIdentifier": "t_uint256",
+                                "typeString": "uint256"
+                              }
+                            ],
+                            "expression": {
+                              "id": 66829,
+                              "name": "l2Oracle",
+                              "nodeType": "Identifier",
+                              "overloadedDeclarations": [],
+                              "referencedDeclaration": 66263,
+                              "src": "20052:8:81",
+                              "typeDescriptions": {
+                                "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                                "typeString": "contract L2OutputOracle"
+                              }
+                            },
+                            "id": 66830,
+                            "isConstant": false,
+                            "isLValue": false,
+                            "isPure": false,
+                            "lValueRequested": false,
+                            "memberName": "getL2Output",
+                            "nodeType": "MemberAccess",
+                            "referencedDeclaration": 66027,
+                            "src": "20052:20:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$81039_memory_ptr_$",
+                              "typeString": "function (uint256) view external returns (struct Types.OutputProposal memory)"
+                            }
+                          },
+                          "id": 66832,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "kind": "functionCall",
+                          "lValueRequested": false,
+                          "names": [],
+                          "nodeType": "FunctionCall",
+                          "src": "20052:36:81",
+                          "tryCall": false,
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_struct$_OutputProposal_$81039_memory_ptr",
+                            "typeString": "struct Types.OutputProposal memory"
+                          }
+                        },
+                        "id": 66833,
+                        "isConstant": false,
+                        "isLValue": true,
+                        "isPure": false,
+                        "lValueRequested": false,
+                        "memberName": "timestamp",
+                        "nodeType": "MemberAccess",
+                        "referencedDeclaration": 81036,
+                        "src": "20052:46:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint128",
+                          "typeString": "uint128"
+                        }
+                      }
+                    ],
+                    "expression": {
+                      "argumentTypes": [
+                        {
+                          "typeIdentifier": "t_uint128",
+                          "typeString": "uint128"
+                        }
+                      ],
+                      "id": 66828,
+                      "name": "_isFinalizationPeriodElapsed",
+                      "nodeType": "Identifier",
+                      "overloadedDeclarations": [],
+                      "referencedDeclaration": 66855,
+                      "src": "20023:28:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$",
+                        "typeString": "function (uint256) view returns (bool)"
+                      }
+                    },
+                    "id": 66834,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "kind": "functionCall",
+                    "lValueRequested": false,
+                    "names": [],
+                    "nodeType": "FunctionCall",
+                    "src": "20023:76:81",
+                    "tryCall": false,
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "functionReturnParameters": 66827,
+                  "id": 66835,
+                  "nodeType": "Return",
+                  "src": "20016:83:81"
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66821,
+              "nodeType": "StructuredDocumentation",
+              "src": "19635:286:81",
+              "text": "@notice Determine if a given output is finalized.\n         Reverts if the call to l2Oracle.getL2Output reverts.\n         Returns a boolean otherwise.\n @param _l2OutputIndex Index of the L2 output to check.\n @return Whether or not the output is finalized."
+            },
+            "functionSelector": "6dbffb78",
+            "implemented": true,
+            "kind": "function",
+            "modifiers": [],
+            "name": "isOutputFinalized",
+            "nameLocation": "19935:17:81",
+            "parameters": {
+              "id": 66824,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66823,
+                  "mutability": "mutable",
+                  "name": "_l2OutputIndex",
+                  "nameLocation": "19961:14:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66837,
+                  "src": "19953:22:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_uint256",
+                    "typeString": "uint256"
+                  },
+                  "typeName": {
+                    "id": 66822,
+                    "name": "uint256",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "19953:7:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_uint256",
+                      "typeString": "uint256"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "19952:24:81"
+            },
+            "returnParameters": {
+              "id": 66827,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66826,
+                  "mutability": "mutable",
+                  "name": "",
+                  "nameLocation": "-1:-1:-1",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66837,
+                  "src": "20000:4:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_bool",
+                    "typeString": "bool"
+                  },
+                  "typeName": {
+                    "id": 66825,
+                    "name": "bool",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "20000:4:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "19999:6:81"
+            },
+            "scope": 66856,
+            "stateMutability": "view",
+            "virtual": false,
+            "visibility": "external"
+          },
+          {
+            "id": 66855,
+            "nodeType": "FunctionDefinition",
+            "src": "20359:180:81",
+            "nodes": [],
+            "body": {
+              "id": 66854,
+              "nodeType": "Block",
+              "src": "20446:93:81",
+              "nodes": [],
+              "statements": [
+                {
+                  "expression": {
+                    "commonType": {
+                      "typeIdentifier": "t_uint256",
+                      "typeString": "uint256"
+                    },
+                    "id": 66852,
+                    "isConstant": false,
+                    "isLValue": false,
+                    "isPure": false,
+                    "lValueRequested": false,
+                    "leftExpression": {
+                      "expression": {
+                        "id": 66845,
+                        "name": "block",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": -4,
+                        "src": "20463:5:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_magic_block",
+                          "typeString": "block"
+                        }
+                      },
+                      "id": 66846,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "memberName": "timestamp",
+                      "nodeType": "MemberAccess",
+                      "src": "20463:15:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_uint256",
+                        "typeString": "uint256"
+                      }
+                    },
+                    "nodeType": "BinaryOperation",
+                    "operator": ">",
+                    "rightExpression": {
+                      "commonType": {
+                        "typeIdentifier": "t_uint256",
+                        "typeString": "uint256"
+                      },
+                      "id": 66851,
+                      "isConstant": false,
+                      "isLValue": false,
+                      "isPure": false,
+                      "lValueRequested": false,
+                      "leftExpression": {
+                        "id": 66847,
+                        "name": "_timestamp",
+                        "nodeType": "Identifier",
+                        "overloadedDeclarations": [],
+                        "referencedDeclaration": 66840,
+                        "src": "20481:10:81",
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        }
+                      },
+                      "nodeType": "BinaryOperation",
+                      "operator": "+",
+                      "rightExpression": {
+                        "arguments": [],
+                        "expression": {
+                          "argumentTypes": [],
+                          "expression": {
+                            "id": 66848,
+                            "name": "l2Oracle",
+                            "nodeType": "Identifier",
+                            "overloadedDeclarations": [],
+                            "referencedDeclaration": 66263,
+                            "src": "20494:8:81",
+                            "typeDescriptions": {
+                              "typeIdentifier": "t_contract$_L2OutputOracle_$66187",
+                              "typeString": "contract L2OutputOracle"
+                            }
+                          },
+                          "id": 66849,
+                          "isConstant": false,
+                          "isLValue": false,
+                          "isPure": false,
+                          "lValueRequested": false,
+                          "memberName": "FINALIZATION_PERIOD_SECONDS",
+                          "nodeType": "MemberAccess",
+                          "referencedDeclaration": 65873,
+                          "src": "20494:36:81",
+                          "typeDescriptions": {
+                            "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
+                            "typeString": "function () view external returns (uint256)"
+                          }
+                        },
+                        "id": 66850,
+                        "isConstant": false,
+                        "isLValue": false,
+                        "isPure": false,
+                        "kind": "functionCall",
+                        "lValueRequested": false,
+                        "names": [],
+                        "nodeType": "FunctionCall",
+                        "src": "20494:38:81",
+                        "tryCall": false,
+                        "typeDescriptions": {
+                          "typeIdentifier": "t_uint256",
+                          "typeString": "uint256"
+                        }
+                      },
+                      "src": "20481:51:81",
+                      "typeDescriptions": {
+                        "typeIdentifier": "t_uint256",
+                        "typeString": "uint256"
+                      }
+                    },
+                    "src": "20463:69:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "functionReturnParameters": 66844,
+                  "id": 66853,
+                  "nodeType": "Return",
+                  "src": "20456:76:81"
+                }
+              ]
+            },
+            "documentation": {
+              "id": 66838,
+              "nodeType": "StructuredDocumentation",
+              "src": "20112:242:81",
+              "text": "@notice Determines whether the finalization period has elapsed with respect to\n         the provided block timestamp.\n @param _timestamp Timestamp to check.\n @return Whether or not the finalization period has elapsed."
+            },
+            "implemented": true,
+            "kind": "function",
+            "modifiers": [],
+            "name": "_isFinalizationPeriodElapsed",
+            "nameLocation": "20368:28:81",
+            "parameters": {
+              "id": 66841,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66840,
+                  "mutability": "mutable",
+                  "name": "_timestamp",
+                  "nameLocation": "20405:10:81",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66855,
+                  "src": "20397:18:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_uint256",
+                    "typeString": "uint256"
+                  },
+                  "typeName": {
+                    "id": 66839,
+                    "name": "uint256",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "20397:7:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_uint256",
+                      "typeString": "uint256"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "20396:20:81"
+            },
+            "returnParameters": {
+              "id": 66844,
+              "nodeType": "ParameterList",
+              "parameters": [
+                {
+                  "constant": false,
+                  "id": 66843,
+                  "mutability": "mutable",
+                  "name": "",
+                  "nameLocation": "-1:-1:-1",
+                  "nodeType": "VariableDeclaration",
+                  "scope": 66855,
+                  "src": "20440:4:81",
+                  "stateVariable": false,
+                  "storageLocation": "default",
+                  "typeDescriptions": {
+                    "typeIdentifier": "t_bool",
+                    "typeString": "bool"
+                  },
+                  "typeName": {
+                    "id": 66842,
+                    "name": "bool",
+                    "nodeType": "ElementaryTypeName",
+                    "src": "20440:4:81",
+                    "typeDescriptions": {
+                      "typeIdentifier": "t_bool",
+                      "typeString": "bool"
+                    }
+                  },
+                  "visibility": "internal"
+                }
+              ],
+              "src": "20439:6:81"
+            },
+            "scope": 66856,
+            "stateMutability": "view",
+            "virtual": false,
+            "visibility": "internal"
+          }
+        ],
+        "abstract": false,
+        "baseContracts": [
+          {
+            "baseName": {
+              "id": 66218,
+              "name": "Initializable",
+              "nodeType": "IdentifierPath",
+              "referencedDeclaration": 43940,
+              "src": "1267:13:81"
+            },
+            "id": 66219,
+            "nodeType": "InheritanceSpecifier",
+            "src": "1267:13:81"
+          },
+          {
+            "baseName": {
+              "id": 66220,
+              "name": "ResourceMetering",
+              "nodeType": "IdentifierPath",
+              "referencedDeclaration": 68349,
+              "src": "1282:16:81"
+            },
+            "id": 66221,
+            "nodeType": "InheritanceSpecifier",
+            "src": "1282:16:81"
+          },
+          {
+            "baseName": {
+              "id": 66222,
+              "name": "ISemver",
+              "nodeType": "IdentifierPath",
+              "referencedDeclaration": 83714,
+              "src": "1300:7:81"
+            },
+            "id": 66223,
+            "nodeType": "InheritanceSpecifier",
+            "src": "1300:7:81"
+          }
+        ],
+        "canonicalName": "OptimismPortal",
+        "contractDependencies": [],
+        "contractKind": "contract",
+        "documentation": {
+          "id": 66217,
+          "nodeType": "StructuredDocumentation",
+          "src": "902:338:81",
+          "text": "@custom:proxied\n @title OptimismPortal\n @notice The OptimismPortal is a low-level contract responsible for passing messages between L1\n         and L2. Messages sent directly to the OptimismPortal have no form of replayability.\n         Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface."
+        },
+        "fullyImplemented": true,
+        "linearizedBaseContracts": [
+          66856,
+          83714,
+          68349,
+          43940
+        ],
+        "name": "OptimismPortal",
+        "nameLocation": "1249:14:81",
+        "scope": 66857,
+        "usedErrors": [
+          68006,
+          80411,
+          80414,
+          80417,
+          80432,
+          80435
+        ]
+      }
+    ],
+    "license": "MIT"
+  },
+  "id": 81
+}
diff --git a/op-chain-ops/genesis/config.go b/op-chain-ops/genesis/config.go
index badf461d21c2..14fa59f5a9a3 100644
--- a/op-chain-ops/genesis/config.go
+++ b/op-chain-ops/genesis/config.go
@@ -10,24 +10,42 @@ import (
 	"path/filepath"
 	"reflect"
 
+	"github.com/holiman/uint256"
+	"golang.org/x/exp/maps"
+
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
-	gstate "github.com/ethereum/go-ethereum/core/state"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/ethereum/go-ethereum/params"
 	"github.com/ethereum/go-ethereum/rpc"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/immutables"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/state"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
+	plasma "github.com/ethereum-optimism/optimism/op-plasma"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 )
 
 var (
 	ErrInvalidDeployConfig     = errors.New("invalid deploy config")
 	ErrInvalidImmutablesConfig = errors.New("invalid immutables config")
+	// MaximumBaseFee represents the max base fee for deposits, since
+	// there is an on chain EIP-1559 curve for deposits purchasing L2 gas.
+	// It is type(uint128).max in solidity.
+	MaximumBaseFee, _ = new(big.Int).SetString("ffffffffffffffffffffffffffffffff", 16)
+)
+
+const (
+	// MaxResourceLimit represents the maximum amount of L2 gas that a single deposit can use.
+	MaxResourceLimit = 20_000_000
+	// ElasticityMultiplier represents the elasticity of the deposit EIP-1559 fee market.
+	ElasticityMultiplier = 10
+	// BaseFeeMaxChangeDenominator represents the maximum change in base fee per block.
+	BaseFeeMaxChangeDenominator = 8
+	// MinimumBaseFee represents the minimum base fee for deposits.
+	MinimumBaseFee = params.GWei
+	// SystemTxMaxGas represents the maximum gas that a system transaction can use
+	// when it is included with user deposits.
+	SystemTxMaxGas = 1_000_000
 )
 
 // DeployConfig represents the deployment configuration for an OP Stack chain.
@@ -169,9 +187,15 @@ type DeployConfig struct {
 	// as part of the derivation pipeline.
 	OptimismPortalProxy common.Address `json:"optimismPortalProxy"`
 	// GasPriceOracleOverhead represents the initial value of the gas overhead in the GasPriceOracle predeploy.
+	// Deprecated: Since Ecotone, this field is superseded by GasPriceOracleBaseFeeScalar and GasPriceOracleBlobBaseFeeScalar.
 	GasPriceOracleOverhead uint64 `json:"gasPriceOracleOverhead"`
 	// GasPriceOracleScalar represents the initial value of the gas scalar in the GasPriceOracle predeploy.
+	// Deprecated: Since Ecotone, this field is superseded by GasPriceOracleBaseFeeScalar and GasPriceOracleBlobBaseFeeScalar.
 	GasPriceOracleScalar uint64 `json:"gasPriceOracleScalar"`
+	// GasPriceOracleBaseFeeScalar represents the value of the base fee scalar used for fee calculations.
+	GasPriceOracleBaseFeeScalar uint32 `json:"gasPriceOracleBaseFeeScalar"`
+	// GasPriceOracleBlobBaseFeeScalar represents the value of the blob base fee scalar used for fee calculations.
+	GasPriceOracleBlobBaseFeeScalar uint32 `json:"gasPriceOracleBlobBaseFeeScalar"`
 	// EnableGovernance configures whether or not include governance token predeploy.
 	EnableGovernance bool `json:"enableGovernance"`
 	// GovernanceTokenSymbol represents the  ERC20 symbol of the GovernanceToken.
@@ -203,10 +227,12 @@ type DeployConfig struct {
 	// supports. Ideally, this should be conservatively set so that there is always enough
 	// room for a full Cannon trace.
 	FaultGameMaxDepth uint64 `json:"faultGameMaxDepth"`
-	// FaultGameMaxDuration is the maximum amount of time (in seconds) that the fault dispute
-	// game can run for before it is ready to be resolved. Each side receives half of this value
-	// on their chess clock at the inception of the dispute.
-	FaultGameMaxDuration uint64 `json:"faultGameMaxDuration"`
+	// FaultGameClockExtension is the amount of time that the dispute game will set the potential grandchild claim's,
+	// clock to, if the remaining time is less than this value at the time of a claim's creation.
+	FaultGameClockExtension uint64 `json:"faultGameClockExtension"`
+	// FaultGameMaxClockDuration is the maximum amount of time that may accumulate on a team's chess clock before they
+	// may no longer respond.
+	FaultGameMaxClockDuration uint64 `json:"faultGameMaxClockDuration"`
 	// FaultGameGenesisBlock is the block number for genesis.
 	FaultGameGenesisBlock uint64 `json:"faultGameGenesisBlock"`
 	// FaultGameGenesisOutputRoot is the output root for the genesis block.
@@ -240,9 +266,14 @@ type DeployConfig struct {
 	// UseFaultProofs is a flag that indicates if the system is using fault
 	// proofs instead of the older output oracle mechanism.
 	UseFaultProofs bool `json:"useFaultProofs"`
-
+	// UseCustomGasToken is a flag to indicate that a custom gas token should be used
+	UseCustomGasToken bool `json:"useCustomGasToken"`
+	// CustomGasTokenAddress is the address of the ERC20 token to be used to pay for gas on L2.
+	CustomGasTokenAddress common.Address `json:"customGasTokenAddress"`
 	// UsePlasma is a flag that indicates if the system is using op-plasma
 	UsePlasma bool `json:"usePlasma"`
+	// DACommitmentType specifies the allowed commitment
+	DACommitmentType string `json:"daCommitmentType"`
 	// DAChallengeWindow represents the block interval during which the availability of a data commitment can be challenged.
 	DAChallengeWindow uint64 `json:"daChallengeWindow"`
 	// DAResolveWindow represents the block interval during which a data availability challenge can be resolved.
@@ -258,6 +289,9 @@ type DeployConfig struct {
 
 	// When Cancun activates. Relative to L1 genesis.
 	L1CancunTimeOffset *hexutil.Uint64 `json:"l1CancunTimeOffset,omitempty"`
+
+	// UseInterop is a flag that indicates if the system is using interop
+	UseInterop bool `json:"useInterop,omitempty"`
 }
 
 // Copy will deeply copy the DeployConfig. This does a JSON roundtrip to copy
@@ -352,11 +386,11 @@ func (d *DeployConfig) Check() error {
 	if !d.SequencerFeeVaultWithdrawalNetwork.Valid() {
 		return fmt.Errorf("%w: SequencerFeeVaultWithdrawalNetwork can only be 0 (L1) or 1 (L2)", ErrInvalidDeployConfig)
 	}
-	if d.GasPriceOracleOverhead == 0 {
-		log.Warn("GasPriceOracleOverhead is 0")
+	if d.GasPriceOracleBaseFeeScalar == 0 {
+		log.Warn("GasPriceOracleBaseFeeScalar is 0")
 	}
-	if d.GasPriceOracleScalar == 0 {
-		return fmt.Errorf("%w: GasPriceOracleScalar cannot be 0", ErrInvalidDeployConfig)
+	if d.GasPriceOracleBlobBaseFeeScalar == 0 {
+		log.Warn("GasPriceOracleBlobBaseFeeScalar is 0")
 	}
 	if d.EIP1559Denominator == 0 {
 		return fmt.Errorf("%w: EIP1559Denominator cannot be 0", ErrInvalidDeployConfig)
@@ -372,7 +406,7 @@ func (d *DeployConfig) Check() error {
 	}
 	// When the initial resource config is made to be configurable by the DeployConfig, ensure
 	// that this check is updated to use the values from the DeployConfig instead of the defaults.
-	if uint64(d.L2GenesisBlockGasLimit) < uint64(DefaultResourceConfig.MaxResourceLimit+DefaultResourceConfig.SystemTxMaxGas) {
+	if uint64(d.L2GenesisBlockGasLimit) < uint64(MaxResourceLimit+SystemTxMaxGas) {
 		return fmt.Errorf("%w: L2 genesis block gas limit is too small", ErrInvalidDeployConfig)
 	}
 	if d.L2GenesisBlockBaseFeePerGas == nil {
@@ -412,10 +446,16 @@ func (d *DeployConfig) Check() error {
 		if d.DAResolveWindow == 0 {
 			return fmt.Errorf("%w: DAResolveWindow cannot be 0 when using plasma mode", ErrInvalidDeployConfig)
 		}
-		if d.DAChallengeProxy == (common.Address{}) {
-			return fmt.Errorf("%w: DAChallengeContract cannot be empty when using plasma mode", ErrInvalidDeployConfig)
+		if !(d.DACommitmentType == plasma.KeccakCommitmentString || d.DACommitmentType == plasma.GenericCommitmentString) {
+			return fmt.Errorf("%w: DACommitmentType must be either KeccakCommtiment or GenericCommitment", ErrInvalidDeployConfig)
 		}
 	}
+	if d.UseCustomGasToken {
+		if d.CustomGasTokenAddress == (common.Address{}) {
+			return fmt.Errorf("%w: CustomGasTokenAddress cannot be address(0)", ErrInvalidDeployConfig)
+		}
+		log.Info("Using custom gas token", "address", d.CustomGasTokenAddress)
+	}
 	// checkFork checks that fork A is before or at the same time as fork B
 	checkFork := func(a, b *hexutil.Uint64, aName, bName string) error {
 		if a == nil && b == nil {
@@ -447,6 +487,18 @@ func (d *DeployConfig) Check() error {
 	return nil
 }
 
+// FeeScalar returns the raw serialized fee scalar. Uses pre-Ecotone if legacy config is present,
+// otherwise uses the post-Ecotone scalar serialization.
+func (d *DeployConfig) FeeScalar() [32]byte {
+	if d.GasPriceOracleScalar != 0 {
+		return common.BigToHash(big.NewInt(int64(d.GasPriceOracleScalar)))
+	}
+	return eth.EncodeScalar(eth.EcotoneScalars{
+		BlobBaseFeeScalar: d.GasPriceOracleBlobBaseFeeScalar,
+		BaseFeeScalar:     d.GasPriceOracleBaseFeeScalar,
+	})
+}
+
 // CheckAddresses will return an error if the addresses are not set.
 // These values are required to create the L2 genesis state and are present in the deploy config
 // even though the deploy config is required to deploy the contracts on L1. This creates a
@@ -467,6 +519,11 @@ func (d *DeployConfig) CheckAddresses() error {
 	if d.OptimismPortalProxy == (common.Address{}) {
 		return fmt.Errorf("%w: OptimismPortalProxy cannot be address(0)", ErrInvalidDeployConfig)
 	}
+	if d.UsePlasma && d.DACommitmentType == plasma.KeccakCommitmentString && d.DAChallengeProxy == (common.Address{}) {
+		return fmt.Errorf("%w: DAChallengeContract cannot be address(0) when using plasma mode", ErrInvalidDeployConfig)
+	} else if d.UsePlasma && d.DACommitmentType == plasma.GenericCommitmentString && d.DAChallengeProxy != (common.Address{}) {
+		return fmt.Errorf("%w: DAChallengeContract must be address(0) when using generic commitments in plasma mode", ErrInvalidDeployConfig)
+	}
 	return nil
 }
 
@@ -550,7 +607,8 @@ func (d *DeployConfig) InteropTime(genesisTime uint64) *uint64 {
 	return &v
 }
 
-// RollupConfig converts a DeployConfig to a rollup.Config
+// RollupConfig converts a DeployConfig to a rollup.Config. If Ecotone is active at genesis, the
+// Overhead value is considered a noop.
 func (d *DeployConfig) RollupConfig(l1StartBlock *types.Block, l2GenesisBlockHash common.Hash, l2GenesisBlockNumber uint64) (*rollup.Config, error) {
 	if d.OptimismPortalProxy == (common.Address{}) {
 		return nil, errors.New("OptimismPortalProxy cannot be address(0)")
@@ -558,6 +616,15 @@ func (d *DeployConfig) RollupConfig(l1StartBlock *types.Block, l2GenesisBlockHas
 	if d.SystemConfigProxy == (common.Address{}) {
 		return nil, errors.New("SystemConfigProxy cannot be address(0)")
 	}
+	var plasma *rollup.PlasmaConfig
+	if d.UsePlasma {
+		plasma = &rollup.PlasmaConfig{
+			CommitmentType:     d.DACommitmentType,
+			DAChallengeAddress: d.DAChallengeProxy,
+			DAChallengeWindow:  d.DAChallengeWindow,
+			DAResolveWindow:    d.DAResolveWindow,
+		}
+	}
 
 	return &rollup.Config{
 		Genesis: rollup.Genesis{
@@ -573,7 +640,7 @@ func (d *DeployConfig) RollupConfig(l1StartBlock *types.Block, l2GenesisBlockHas
 			SystemConfig: eth.SystemConfig{
 				BatcherAddr: d.BatchSenderAddress,
 				Overhead:    eth.Bytes32(common.BigToHash(new(big.Int).SetUint64(d.GasPriceOracleOverhead))),
-				Scalar:      eth.Bytes32(common.BigToHash(new(big.Int).SetUint64(d.GasPriceOracleScalar))),
+				Scalar:      eth.Bytes32(d.FeeScalar()),
 				GasLimit:    uint64(d.L2GenesisBlockGasLimit),
 			},
 		},
@@ -592,10 +659,7 @@ func (d *DeployConfig) RollupConfig(l1StartBlock *types.Block, l2GenesisBlockHas
 		EcotoneTime:            d.EcotoneTime(l1StartBlock.Time()),
 		FjordTime:              d.FjordTime(l1StartBlock.Time()),
 		InteropTime:            d.InteropTime(l1StartBlock.Time()),
-		UsePlasma:              d.UsePlasma,
-		DAChallengeAddress:     d.DAChallengeProxy,
-		DAChallengeWindow:      d.DAChallengeWindow,
-		DAResolveWindow:        d.DAResolveWindow,
+		PlasmaConfig:           plasma,
 	}, nil
 }
 
@@ -733,215 +797,40 @@ func NewL1Deployments(path string) (*L1Deployments, error) {
 	return &deployments, nil
 }
 
-// NewStateDump will read a Dump JSON file from disk
-func NewStateDump(path string) (*gstate.Dump, error) {
-	file, err := os.ReadFile(path)
-	if err != nil {
-		return nil, fmt.Errorf("dump at %s not found: %w", path, err)
-	}
-
-	var fdump ForgeDump
-	if err := json.Unmarshal(file, &fdump); err != nil {
-		return nil, fmt.Errorf("cannot unmarshal dump: %w", err)
-	}
-	dump := (gstate.Dump)(fdump)
-	return &dump, nil
+type ForgeAllocs struct {
+	Accounts types.GenesisAlloc
 }
 
-// ForgeDump is a simple alias for state.Dump that can read "nonce" as a hex string.
-// It appears as if updates to foundry have changed the serialization of the state dump.
-type ForgeDump gstate.Dump
-
-func (d *ForgeDump) UnmarshalJSON(b []byte) error {
-	type forgeDumpAccount struct {
-		Balance     string                 `json:"balance"`
-		Nonce       hexutil.Uint64         `json:"nonce"`
-		Root        hexutil.Bytes          `json:"root"`
-		CodeHash    hexutil.Bytes          `json:"codeHash"`
-		Code        hexutil.Bytes          `json:"code,omitempty"`
-		Storage     map[common.Hash]string `json:"storage,omitempty"`
-		Address     *common.Address        `json:"address,omitempty"`
-		AddressHash hexutil.Bytes          `json:"key,omitempty"`
-	}
-	type forgeDump struct {
-		Root     string                              `json:"root"`
-		Accounts map[common.Address]forgeDumpAccount `json:"accounts"`
-	}
-	var dump forgeDump
-	if err := json.Unmarshal(b, &dump); err != nil {
-		return err
-	}
-
-	d.Root = dump.Root
-	d.Accounts = make(map[string]gstate.DumpAccount)
-	for addr, acc := range dump.Accounts {
-		d.Accounts[addr.String()] = gstate.DumpAccount{
-			Balance:     acc.Balance,
-			Nonce:       (uint64)(acc.Nonce),
-			Root:        acc.Root,
-			CodeHash:    acc.CodeHash,
-			Code:        acc.Code,
-			Storage:     acc.Storage,
-			Address:     acc.Address,
-			AddressHash: acc.AddressHash,
-		}
-	}
-	return nil
+func (d *ForgeAllocs) Copy() *ForgeAllocs {
+	out := make(types.GenesisAlloc, len(d.Accounts))
+	maps.Copy(out, d.Accounts)
+	return &ForgeAllocs{Accounts: out}
 }
 
-// NewL2ImmutableConfig will create an ImmutableConfig given an instance of a
-// DeployConfig and a block.
-func NewL2ImmutableConfig(config *DeployConfig, block *types.Block) (*immutables.PredeploysImmutableConfig, error) {
-	if config.L1StandardBridgeProxy == (common.Address{}) {
-		return nil, fmt.Errorf("L1StandardBridgeProxy cannot be address(0): %w", ErrInvalidImmutablesConfig)
-	}
-	if config.L1CrossDomainMessengerProxy == (common.Address{}) {
-		return nil, fmt.Errorf("L1CrossDomainMessengerProxy cannot be address(0): %w", ErrInvalidImmutablesConfig)
-	}
-	if config.L1ERC721BridgeProxy == (common.Address{}) {
-		return nil, fmt.Errorf("L1ERC721BridgeProxy cannot be address(0): %w", ErrInvalidImmutablesConfig)
-	}
-	if config.SequencerFeeVaultRecipient == (common.Address{}) {
-		return nil, fmt.Errorf("SequencerFeeVaultRecipient cannot be address(0): %w", ErrInvalidImmutablesConfig)
-	}
-	if config.BaseFeeVaultRecipient == (common.Address{}) {
-		return nil, fmt.Errorf("BaseFeeVaultRecipient cannot be address(0): %w", ErrInvalidImmutablesConfig)
-	}
-	if config.L1FeeVaultRecipient == (common.Address{}) {
-		return nil, fmt.Errorf("L1FeeVaultRecipient cannot be address(0): %w", ErrInvalidImmutablesConfig)
-	}
-
-	cfg := immutables.PredeploysImmutableConfig{
-		L2ToL1MessagePasser:    struct{}{},
-		DeployerWhitelist:      struct{}{},
-		WETH9:                  struct{}{},
-		L2CrossDomainMessenger: struct{}{},
-		L2StandardBridge:       struct{}{},
-		SequencerFeeVault: struct {
-			Recipient           common.Address
-			MinWithdrawalAmount *big.Int
-			WithdrawalNetwork   uint8
-		}{
-			Recipient:           config.SequencerFeeVaultRecipient,
-			MinWithdrawalAmount: (*big.Int)(config.SequencerFeeVaultMinimumWithdrawalAmount),
-			WithdrawalNetwork:   config.SequencerFeeVaultWithdrawalNetwork.ToUint8(),
-		},
-		L1BlockNumber:       struct{}{},
-		GasPriceOracle:      struct{}{},
-		L1Block:             struct{}{},
-		GovernanceToken:     struct{}{},
-		LegacyMessagePasser: struct{}{},
-		L2ERC721Bridge:      struct{}{},
-		OptimismMintableERC721Factory: struct {
-			Bridge        common.Address
-			RemoteChainId *big.Int
-		}{
-			Bridge:        predeploys.L2ERC721BridgeAddr,
-			RemoteChainId: new(big.Int).SetUint64(config.L1ChainID),
-		},
-		OptimismMintableERC20Factory: struct{}{},
-		ProxyAdmin:                   struct{}{},
-		BaseFeeVault: struct {
-			Recipient           common.Address
-			MinWithdrawalAmount *big.Int
-			WithdrawalNetwork   uint8
-		}{
-			Recipient:           config.BaseFeeVaultRecipient,
-			MinWithdrawalAmount: (*big.Int)(config.BaseFeeVaultMinimumWithdrawalAmount),
-			WithdrawalNetwork:   config.BaseFeeVaultWithdrawalNetwork.ToUint8(),
-		},
-		L1FeeVault: struct {
-			Recipient           common.Address
-			MinWithdrawalAmount *big.Int
-			WithdrawalNetwork   uint8
-		}{
-			Recipient:           config.L1FeeVaultRecipient,
-			MinWithdrawalAmount: (*big.Int)(config.L1FeeVaultMinimumWithdrawalAmount),
-			WithdrawalNetwork:   config.L1FeeVaultWithdrawalNetwork.ToUint8(),
-		},
-		SchemaRegistry: struct{}{},
-		EAS: struct {
-			Name string
-		}{
-			Name: "EAS",
-		},
-		Create2Deployer: struct{}{},
+func (d *ForgeAllocs) UnmarshalJSON(b []byte) error {
+	// forge, since integrating Alloy, likes to hex-encode everything.
+	type forgeAllocAccount struct {
+		Balance hexutil.U256                `json:"balance"`
+		Nonce   hexutil.Uint64              `json:"nonce"`
+		Code    hexutil.Bytes               `json:"code,omitempty"`
+		Storage map[common.Hash]common.Hash `json:"storage,omitempty"`
 	}
-
-	if err := cfg.Check(); err != nil {
-		return nil, err
+	var allocs map[common.Address]forgeAllocAccount
+	if err := json.Unmarshal(b, &allocs); err != nil {
+		return err
 	}
-	return &cfg, nil
-}
-
-// NewL2StorageConfig will create a StorageConfig given an instance of a DeployConfig and genesis block.
-func NewL2StorageConfig(config *DeployConfig, block *types.Block) (state.StorageConfig, error) {
-	storage := make(state.StorageConfig)
-
-	if block.Number() == nil {
-		return storage, errors.New("block number not set")
-	}
-	if block.BaseFee() == nil {
-		return storage, errors.New("block base fee not set")
-	}
-
-	storage["L2ToL1MessagePasser"] = state.StorageValues{
-		"msgNonce": 0,
-	}
-	storage["L2CrossDomainMessenger"] = state.StorageValues{
-		"_initialized":     1,
-		"_initializing":    false,
-		"xDomainMsgSender": "0x000000000000000000000000000000000000dEaD",
-		"msgNonce":         0,
-		"otherMessenger":   config.L1CrossDomainMessengerProxy,
-	}
-	storage["L2StandardBridge"] = state.StorageValues{
-		"_initialized":  1,
-		"_initializing": false,
-		"otherBridge":   config.L1StandardBridgeProxy,
-		"messenger":     predeploys.L2CrossDomainMessengerAddr,
-	}
-	storage["L2ERC721Bridge"] = state.StorageValues{
-		"_initialized":  1,
-		"_initializing": false,
-		"otherBridge":   config.L1ERC721BridgeProxy,
-		"messenger":     predeploys.L2CrossDomainMessengerAddr,
-	}
-	storage["OptimismMintableERC20Factory"] = state.StorageValues{
-		"_initialized":  1,
-		"_initializing": false,
-		"bridge":        predeploys.L2StandardBridgeAddr,
-	}
-	storage["L1Block"] = state.StorageValues{
-		"number":         block.Number(),
-		"timestamp":      block.Time(),
-		"basefee":        block.BaseFee(),
-		"hash":           block.Hash(),
-		"sequenceNumber": 0,
-		"batcherHash":    eth.AddressAsLeftPaddedHash(config.BatchSenderAddress),
-		"l1FeeOverhead":  config.GasPriceOracleOverhead,
-		"l1FeeScalar":    config.GasPriceOracleScalar,
-	}
-	storage["LegacyERC20ETH"] = state.StorageValues{
-		"_name":   "Ether",
-		"_symbol": "ETH",
-	}
-	storage["WETH9"] = state.StorageValues{
-		"name":     "Wrapped Ether",
-		"symbol":   "WETH",
-		"decimals": 18,
-	}
-	if config.EnableGovernance {
-		storage["GovernanceToken"] = state.StorageValues{
-			"_name":   config.GovernanceTokenName,
-			"_symbol": config.GovernanceTokenSymbol,
-			"_owner":  config.GovernanceTokenOwner,
+	d.Accounts = make(types.GenesisAlloc, len(allocs))
+	for addr, acc := range allocs {
+		acc := acc
+		d.Accounts[addr] = types.Account{
+			Code:       acc.Code,
+			Storage:    acc.Storage,
+			Balance:    (*uint256.Int)(&acc.Balance).ToBig(),
+			Nonce:      (uint64)(acc.Nonce),
+			PrivateKey: nil,
 		}
 	}
-	storage["ProxyAdmin"] = state.StorageValues{
-		"_owner": config.ProxyAdminOwner,
-	}
-	return storage, nil
+	return nil
 }
 
 type MarshalableRPCBlockNumberOrHash rpc.BlockNumberOrHash
diff --git a/op-chain-ops/genesis/genesis.go b/op-chain-ops/genesis/genesis.go
index 1919aac1f7e7..bbfb15c34649 100644
--- a/op-chain-ops/genesis/genesis.go
+++ b/op-chain-ops/genesis/genesis.go
@@ -6,7 +6,7 @@ import (
 	"math/big"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/core"
@@ -66,6 +66,7 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro
 		ShanghaiTime:                  config.CanyonTime(block.Time()),
 		CancunTime:                    config.EcotoneTime(block.Time()),
 		EcotoneTime:                   config.EcotoneTime(block.Time()),
+		FjordTime:                     config.FjordTime(block.Time()),
 		InteropTime:                   config.InteropTime(block.Time()),
 		Optimism: ¶ms.OptimismConfig{
 			EIP1559Denominator:       eip1559Denom,
@@ -110,7 +111,7 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro
 		GasUsed:    uint64(config.L2GenesisBlockGasUsed),
 		ParentHash: config.L2GenesisBlockParentHash,
 		BaseFee:    baseFee.ToInt(),
-		Alloc:      map[common.Address]core.GenesisAccount{},
+		Alloc:      map[common.Address]types.Account{},
 	}
 
 	if optimismChainConfig.IsEcotone(genesis.Timestamp) {
@@ -199,7 +200,7 @@ func NewL1Genesis(config *DeployConfig) (*core.Genesis, error) {
 		GasUsed:    uint64(config.L1GenesisBlockGasUsed),
 		ParentHash: config.L1GenesisBlockParentHash,
 		BaseFee:    baseFee.ToInt(),
-		Alloc:      map[common.Address]core.GenesisAccount{},
+		Alloc:      map[common.Address]types.Account{},
 	}, nil
 }
 
diff --git a/op-chain-ops/genesis/helpers.go b/op-chain-ops/genesis/helpers.go
index 475b597cccb3..4e66579e70c3 100644
--- a/op-chain-ops/genesis/helpers.go
+++ b/op-chain-ops/genesis/helpers.go
@@ -1,7 +1,6 @@
 package genesis
 
 import (
-	"bytes"
 	"context"
 	"fmt"
 	"math/big"
@@ -14,18 +13,12 @@ import (
 )
 
 var (
-	// codeNamespace represents the namespace of implementations of predeploys
-	codeNamespace = common.HexToAddress("0xc0D3C0d3C0d3C0D3c0d3C0d3c0D3C0d3c0d30000")
-	// l2PredeployNamespace represents the namespace of L2 predeploys
-	l2PredeployNamespace = common.HexToAddress("0x4200000000000000000000000000000000000000")
-	// BigL2PredeployNamespace represents the predeploy namespace as a big.Int
-	BigL2PredeployNamespace = new(big.Int).SetBytes(l2PredeployNamespace.Bytes())
-	// bigCodeNamespace represents the predeploy namespace as a big.Int
-	bigCodeNamespace = new(big.Int).SetBytes(codeNamespace.Bytes())
 	// ImplementationSlot represents the EIP 1967 implementation storage slot
 	ImplementationSlot = common.HexToHash("0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc")
 	// AdminSlot represents the EIP 1967 admin storage slot
 	AdminSlot = common.HexToHash("0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103")
+	// The devBalance is the amount of wei that a dev account is funded with.
+	devBalance = hexutil.MustDecodeBig("0x200000000000000000000000000000000000000000000000000000000000000")
 )
 
 // DevAccounts represent the standard hardhat development accounts.
@@ -51,7 +44,7 @@ var DevAccounts = []common.Address{
 	common.HexToAddress("0xcd3B766CCDd6AE721141F452C550Ca635964ce71"),
 	common.HexToAddress("0xdD2FD4581271e230360230F9337D5c0430Bf44C0"),
 	common.HexToAddress("0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097"),
-	common.HexToAddress("0xde3829a23df1479438622a08a116e8eb3f620bb5"),
+	common.HexToAddress("0xDe3829A23DF1479438622a08a116E8Eb3f620BB5"),
 	common.HexToAddress("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"),
 	// Test account used by geth tests
 	common.HexToAddress("0x71562b71999873DB5b286dF957af199Ec94617F7"),
@@ -59,24 +52,6 @@ var DevAccounts = []common.Address{
 	common.HexToAddress("0x3fab184622dc19b6109349b94811493bf2a45362"),
 }
 
-// The devBalance is the amount of wei that a dev account is funded with.
-var devBalance = hexutil.MustDecodeBig("0x200000000000000000000000000000000000000000000000000000000000000")
-
-// AddressToCodeNamespace takes a predeploy address and computes
-// the implementation address that the implementation should be deployed at
-func AddressToCodeNamespace(addr common.Address) (common.Address, error) {
-	if !IsL2DevPredeploy(addr) {
-		return common.Address{}, fmt.Errorf("cannot handle non predeploy: %s", addr)
-	}
-	bigAddress := new(big.Int).SetBytes(addr[18:])
-	num := new(big.Int).Or(bigCodeNamespace, bigAddress)
-	return common.BigToAddress(num), nil
-}
-
-func IsL2DevPredeploy(addr common.Address) bool {
-	return bytes.Equal(addr[0:2], []byte{0x42, 0x00})
-}
-
 // GetBlockFromTag will resolve a Block given an rpc block tag
 func GetBlockFromTag(chain ethereum.ChainReader, tag *rpc.BlockNumberOrHash) (*types.Block, error) {
 	if hash, ok := tag.Hash(); ok {
diff --git a/op-chain-ops/genesis/layer_one.go b/op-chain-ops/genesis/layer_one.go
index f697fdbc0a4d..ee9d408212a9 100644
--- a/op-chain-ops/genesis/layer_one.go
+++ b/op-chain-ops/genesis/layer_one.go
@@ -4,90 +4,71 @@ import (
 	"fmt"
 	"math/big"
 
-	"github.com/ethereum/go-ethereum/log"
-	"github.com/ethereum/go-ethereum/params"
-
 	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/common/math"
 	"github.com/ethereum/go-ethereum/core"
-	gstate "github.com/ethereum/go-ethereum/core/state"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/state"
-)
-
-var (
-	// uint128Max is type(uint128).max and is set in the init function.
-	uint128Max = new(big.Int)
-	// The default values for the ResourceConfig, used as part of
-	// an EIP-1559 curve for deposit gas.
-	DefaultResourceConfig = bindings.ResourceMeteringResourceConfig{
-		MaxResourceLimit:            20_000_000,
-		ElasticityMultiplier:        10,
-		BaseFeeMaxChangeDenominator: 8,
-		MinimumBaseFee:              params.GWei,
-		SystemTxMaxGas:              1_000_000,
-	}
+	"github.com/ethereum/go-ethereum/log"
 )
 
-func init() {
-	var ok bool
-	uint128Max, ok = new(big.Int).SetString("ffffffffffffffffffffffffffffffff", 16)
-	if !ok {
-		panic("bad uint128Max")
-	}
-	// Set the maximum base fee on the default config.
-	DefaultResourceConfig.MaximumBaseFee = uint128Max
-}
+// PrecompileCount represents the number of precompile addresses
+// starting from `address(0)` to PrecompileCount that are funded
+// with a single wei in the genesis state.
+const PrecompileCount = 256
 
 // BuildL1DeveloperGenesis will create a L1 genesis block after creating
 // all of the state required for an Optimism network to function.
 // It is expected that the dump contains all of the required state to bootstrap
 // the L1 chain.
-func BuildL1DeveloperGenesis(config *DeployConfig, dump *gstate.Dump, l1Deployments *L1Deployments) (*core.Genesis, error) {
+func BuildL1DeveloperGenesis(config *DeployConfig, dump *ForgeAllocs, l1Deployments *L1Deployments) (*core.Genesis, error) {
 	log.Info("Building developer L1 genesis block")
 	genesis, err := NewL1Genesis(config)
 	if err != nil {
 		return nil, fmt.Errorf("cannot create L1 developer genesis: %w", err)
 	}
 
-	memDB := state.NewMemoryStateDB(genesis)
-	FundDevAccounts(memDB)
-	SetPrecompileBalances(memDB)
+	if genesis.Alloc != nil && len(genesis.Alloc) != 0 {
+		panic("Did not expect NewL1Genesis to generate non-empty state") // sanity check for dev purposes.
+	}
+	// copy, for safety when the dump is reused (like in e2e testing)
+	genesis.Alloc = dump.Copy().Accounts
+	if config.FundDevAccounts {
+		FundDevAccounts(genesis)
+	}
+	SetPrecompileBalances(genesis)
+
+	l1Deployments.ForEach(func(name string, addr common.Address) {
+		acc, ok := genesis.Alloc[addr]
+		if ok {
+			log.Info("Included L1 deployment", "name", name, "address", addr, "balance", acc.Balance, "storage", len(acc.Storage), "nonce", acc.Nonce)
+		} else {
+			log.Info("Excluded L1 deployment", "name", name, "address", addr)
+		}
+	})
 
-	if dump != nil {
-		for addrstr, account := range dump.Accounts {
-			if !common.IsHexAddress(addrstr) {
-				// Changes in https://github.com/ethereum/go-ethereum/pull/28504
-				// add accounts to the Dump with "pre()" as key
-				// if the address itself is nil.
-				// So depending on how `dump` was created, this might be a
-				// pre-image key, which we skip.
-				continue
-			}
-			address := common.HexToAddress(addrstr)
-			name := ""
-			if l1Deployments != nil {
-				if n := l1Deployments.GetName(address); n != "" {
-					name = n
-				}
-			}
-			log.Info("Setting account", "name", name, "address", address.Hex())
-			memDB.CreateAccount(address)
-			memDB.SetNonce(address, account.Nonce)
+	return genesis, nil
+}
 
-			balance, ok := math.ParseBig256(account.Balance)
-			if !ok {
-				return nil, fmt.Errorf("failed to parse balance for %s", address)
-			}
-			memDB.AddBalance(address, balance)
-			memDB.SetCode(address, account.Code)
-			for key, value := range account.Storage {
-				log.Info("Setting storage", "name", name, "key", key.Hex(), "value", value)
-				memDB.SetState(address, key, common.HexToHash(value))
-			}
+// FundDevAccounts will fund each of the development accounts.
+func FundDevAccounts(gen *core.Genesis) {
+	for _, account := range DevAccounts {
+		acc := gen.Alloc[account]
+		if acc.Balance == nil {
+			acc.Balance = new(big.Int)
 		}
+		acc.Balance = acc.Balance.Add(acc.Balance, devBalance)
+		gen.Alloc[account] = acc
 	}
+}
 
-	return memDB.Genesis(), nil
+// SetPrecompileBalances will set a single wei at each precompile address.
+// This is an optimization to make calling them cheaper.
+func SetPrecompileBalances(gen *core.Genesis) {
+	for i := 0; i < PrecompileCount; i++ {
+		addr := common.BytesToAddress([]byte{byte(i)})
+		acc := gen.Alloc[addr]
+		if acc.Balance == nil {
+			acc.Balance = new(big.Int)
+		}
+		acc.Balance = acc.Balance.Add(acc.Balance, big.NewInt(1))
+		gen.Alloc[addr] = acc
+	}
 }
diff --git a/op-chain-ops/genesis/layer_one_test.go b/op-chain-ops/genesis/layer_one_test.go
index ba8a8f0c0fa1..cacb9b5efff5 100644
--- a/op-chain-ops/genesis/layer_one_test.go
+++ b/op-chain-ops/genesis/layer_one_test.go
@@ -1,140 +1,36 @@
 package genesis
 
 import (
-	"bytes"
-	"encoding/json"
 	"math/big"
-	"os"
 	"testing"
-	"time"
 
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/common/hexutil"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/deployer"
-	"github.com/ethereum-optimism/optimism/op-service/eth"
-	"github.com/ethereum/go-ethereum/accounts/abi/bind"
-	"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
-	"github.com/ethereum/go-ethereum/core/state"
-	"github.com/ethereum/go-ethereum/crypto"
-	"github.com/ethereum/go-ethereum/params"
+	"github.com/ethereum/go-ethereum/core"
+	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/stretchr/testify/require"
 )
 
-// TestBuildL1DeveloperGenesis tests that the L1 genesis block can be built
-// given a deploy config and an l1-allocs.json and a deploy.json that
-// are generated from a deploy config. If new contracts are added, these
-// mocks will need to be regenerated.
-func TestBuildL1DeveloperGenesis(t *testing.T) {
-	b, err := os.ReadFile("testdata/test-deploy-config-full.json")
-	require.NoError(t, err)
-	dec := json.NewDecoder(bytes.NewReader(b))
-	config := new(DeployConfig)
-	require.NoError(t, dec.Decode(config))
-	config.L1GenesisBlockTimestamp = hexutil.Uint64(time.Now().Unix() - 100)
-
-	c, err := os.ReadFile("testdata/allocs-l1.json")
-	require.NoError(t, err)
-	dump := new(state.Dump)
-	require.NoError(t, json.NewDecoder(bytes.NewReader(c)).Decode(dump))
-
-	deployments, err := NewL1Deployments("testdata/deploy.json")
-	require.NoError(t, err)
-
-	genesis, err := BuildL1DeveloperGenesis(config, dump, nil)
-	require.NoError(t, err)
-
-	sim := backends.NewSimulatedBackend(
-		genesis.Alloc,
-		15000000,
-	)
-	callOpts := &bind.CallOpts{}
-
-	oracle, err := bindings.NewL2OutputOracle(deployments.L2OutputOracleProxy, sim)
-	require.NoError(t, err)
-	portal, err := bindings.NewOptimismPortal(deployments.OptimismPortalProxy, sim)
-	require.NoError(t, err)
-
-	proposer, err := oracle.PROPOSER(callOpts)
-	require.NoError(t, err)
-	require.Equal(t, config.L2OutputOracleProposer, proposer)
-
-	owner, err := oracle.CHALLENGER(callOpts)
-	require.NoError(t, err)
-	require.Equal(t, config.L2OutputOracleChallenger, owner)
-
-	// Same set of tests as exist in the deployment scripts
-	interval, err := oracle.SUBMISSIONINTERVAL(callOpts)
-	require.NoError(t, err)
-	require.EqualValues(t, config.L2OutputOracleSubmissionInterval, interval.Uint64())
-
-	startBlock, err := oracle.StartingBlockNumber(callOpts)
-	require.NoError(t, err)
-	require.EqualValues(t, 0, startBlock.Uint64())
-
-	l2BlockTime, err := oracle.L2BLOCKTIME(callOpts)
-	require.NoError(t, err)
-	require.EqualValues(t, 2, l2BlockTime.Uint64())
-
-	oracleAddr, err := portal.L2ORACLE(callOpts)
-	require.NoError(t, err)
-	require.EqualValues(t, deployments.L2OutputOracleProxy, oracleAddr)
-
-	msgr, err := bindings.NewL1CrossDomainMessenger(deployments.L1CrossDomainMessengerProxy, sim)
-	require.NoError(t, err)
-	portalAddr, err := msgr.PORTAL(callOpts)
-	require.NoError(t, err)
-	require.Equal(t, deployments.OptimismPortalProxy, portalAddr)
-
-	bridge, err := bindings.NewL1StandardBridge(deployments.L1StandardBridgeProxy, sim)
-	require.NoError(t, err)
-	msgrAddr, err := bridge.Messenger(callOpts)
-	require.NoError(t, err)
-	require.Equal(t, deployments.L1CrossDomainMessengerProxy, msgrAddr)
-	otherBridge, err := bridge.OTHERBRIDGE(callOpts)
-	require.NoError(t, err)
-	require.Equal(t, predeploys.L2StandardBridgeAddr, otherBridge)
-
-	factory, err := bindings.NewOptimismMintableERC20(deployments.OptimismMintableERC20Factory, sim)
-	require.NoError(t, err)
-	bridgeAddr, err := factory.BRIDGE(callOpts)
-	require.NoError(t, err)
-	require.Equal(t, deployments.L1StandardBridgeProxy, bridgeAddr)
-
-	sysCfg, err := bindings.NewSystemConfig(deployments.SystemConfigProxy, sim)
-	require.NoError(t, err)
-	cfg, err := sysCfg.ResourceConfig(&bind.CallOpts{})
-	require.NoError(t, err)
-	require.Equal(t, cfg, DefaultResourceConfig)
-	owner, err = sysCfg.Owner(&bind.CallOpts{})
-	require.NoError(t, err)
-	require.Equal(t, owner, config.FinalSystemOwner)
-	overhead, err := sysCfg.Overhead(&bind.CallOpts{})
-	require.NoError(t, err)
-	require.Equal(t, overhead.Uint64(), config.GasPriceOracleOverhead)
-	scalar, err := sysCfg.Scalar(&bind.CallOpts{})
-	require.NoError(t, err)
-	require.Equal(t, scalar.Uint64(), config.GasPriceOracleScalar)
-	batcherHash, err := sysCfg.BatcherHash(&bind.CallOpts{})
-	require.NoError(t, err)
-	require.Equal(t, common.Hash(batcherHash), eth.AddressAsLeftPaddedHash(config.BatchSenderAddress))
-	gasLimit, err := sysCfg.GasLimit(&bind.CallOpts{})
-	require.NoError(t, err)
-	require.Equal(t, gasLimit, uint64(config.L2GenesisBlockGasLimit))
-	unsafeBlockSigner, err := sysCfg.UnsafeBlockSigner(&bind.CallOpts{})
-	require.NoError(t, err)
-	require.Equal(t, unsafeBlockSigner, config.P2PSequencerAddress)
-
-	// test that we can do deposits, etc.
-	priv, err := crypto.HexToECDSA("ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80")
-	require.NoError(t, err)
+// TestFundDevAccounts ensures that the developer accounts are
+// added to the genesis state correctly.
+func TestFundDevAccounts(t *testing.T) {
+	gen := core.Genesis{
+		Alloc: make(types.GenesisAlloc),
+	}
+	FundDevAccounts(&gen)
+	require.Equal(t, len(gen.Alloc), len(DevAccounts))
+	for _, account := range gen.Alloc {
+		require.Equal(t, devBalance, account.Balance)
+	}
+}
 
-	tOpts, err := bind.NewKeyedTransactorWithChainID(priv, deployer.ChainID)
-	require.NoError(t, err)
-	tOpts.Value = big.NewInt(0.001 * params.Ether)
-	tOpts.GasLimit = 1_000_000
-	_, err = bridge.DepositETH(tOpts, 200000, nil)
-	require.NoError(t, err)
+// TestSetPrecompileBalances ensures that the precompiles are
+// initialized with a balance of 1.
+func TestSetPrecompileBalances(t *testing.T) {
+	gen := core.Genesis{
+		Alloc: make(types.GenesisAlloc),
+	}
+	SetPrecompileBalances(&gen)
+	require.Equal(t, len(gen.Alloc), PrecompileCount)
+	for _, account := range gen.Alloc {
+		require.Equal(t, big.NewInt(1), account.Balance)
+	}
 }
diff --git a/op-chain-ops/genesis/layer_two.go b/op-chain-ops/genesis/layer_two.go
index 3b2bf85e1a3b..a534957243bd 100644
--- a/op-chain-ops/genesis/layer_two.go
+++ b/op-chain-ops/genesis/layer_two.go
@@ -1,138 +1,110 @@
 package genesis
 
 import (
+	"encoding/json"
 	"fmt"
 	"math/big"
+	"os"
+	"path/filepath"
 
+	hdwallet "github.com/ethereum-optimism/go-ethereum-hdwallet"
+	"github.com/holiman/uint256"
+
+	"github.com/ethereum/go-ethereum/accounts"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core"
 	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/log"
+	"github.com/ethereum/go-ethereum/crypto"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/deployer"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/immutables"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/squash"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/state"
-	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
-	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 )
 
-// BuildL2Genesis will build the L2 genesis block.
-func BuildL2Genesis(config *DeployConfig, l1StartBlock *types.Block) (*core.Genesis, error) {
-	genspec, err := NewL2Genesis(config, l1StartBlock)
-	if err != nil {
-		return nil, err
-	}
+type L2AllocsMode string
 
-	db := state.NewMemoryStateDB(genspec)
-	if config.FundDevAccounts {
-		log.Info("Funding developer accounts in L2 genesis")
-		FundDevAccounts(db)
-	}
+const (
+	L2AllocsDelta   L2AllocsMode = "delta"
+	L2AllocsEcotone L2AllocsMode = "ecotone"
+	L2AllocsFjord   L2AllocsMode = "" // the default in solidity scripting / testing
+)
 
-	SetPrecompileBalances(db)
+var (
+	// l2PredeployNamespace is the namespace for L2 predeploys
+	l2PredeployNamespace = common.HexToAddress("0x4200000000000000000000000000000000000000")
+	// mnemonic for the test accounts in hardhat/foundry
+	testMnemonic = "test test test test test test test test test test test junk"
+)
 
-	storage, err := NewL2StorageConfig(config, l1StartBlock)
-	if err != nil {
-		return nil, err
-	}
+type AllocsLoader func(mode L2AllocsMode) *ForgeAllocs
 
-	immutableConfig, err := NewL2ImmutableConfig(config, l1StartBlock)
+// BuildL2Genesis will build the L2 genesis block.
+func BuildL2Genesis(config *DeployConfig, dump *ForgeAllocs, l1StartBlock *types.Block) (*core.Genesis, error) {
+	genspec, err := NewL2Genesis(config, l1StartBlock)
 	if err != nil {
 		return nil, err
 	}
-
-	// Set up the proxies
-	err = setProxies(db, predeploys.ProxyAdminAddr, BigL2PredeployNamespace, 2048)
-	if err != nil {
-		return nil, err
+	genspec.Alloc = dump.Copy().Accounts
+	// ensure the dev accounts are not funded unintentionally
+	if hasDevAccounts, err := HasAnyDevAccounts(genspec.Alloc); err != nil {
+		return nil, fmt.Errorf("failed to check dev accounts: %w", err)
+	} else if hasDevAccounts != config.FundDevAccounts {
+		return nil, fmt.Errorf("deploy config mismatch with allocs. Deploy config fundDevAccounts: %v, actual allocs: %v", config.FundDevAccounts, hasDevAccounts)
 	}
-
-	// Set up the implementations that contain immutables
-	deployResults, err := immutables.Deploy(immutableConfig)
-	if err != nil {
-		return nil, err
+	// sanity check the permit2 immutable, to verify we using the allocs for the right chain.
+	if permit2 := genspec.Alloc[predeploys.Permit2Addr].Code; len(permit2) != 0 {
+		if len(permit2) < 6945+32 {
+			return nil, fmt.Errorf("permit2 code is too short (%d)", len(permit2))
+		}
+		chainID := [32]byte(permit2[6945 : 6945+32])
+		expected := uint256.MustFromBig(genspec.Config.ChainID).Bytes32()
+		if chainID != expected {
+			return nil, fmt.Errorf("allocs were generated for chain ID %x, but expected chain %x (%d)", chainID, expected, genspec.Config.ChainID)
+		}
 	}
-	for name, predeploy := range predeploys.Predeploys {
-		if predeploy.Enabled != nil && !predeploy.Enabled(config) {
-			log.Warn("Skipping disabled predeploy.", "name", name, "address", predeploy.Address)
+	// sanity check that all predeploys are present
+	for i := 0; i < 2048; i++ {
+		addr := common.BigToAddress(new(big.Int).Or(l2PredeployNamespace.Big(), big.NewInt(int64(i))))
+		if !config.GovernanceEnabled() && addr == predeploys.GovernanceTokenAddr {
 			continue
 		}
-
-		codeAddr := predeploy.Address
-		switch name {
-		case "Permit2":
-			deployerAddressBytes, err := bindings.GetDeployerAddress(name)
-			if err != nil {
-				return nil, err
-			}
-			deployerAddress := common.BytesToAddress(deployerAddressBytes)
-			predeploys := map[string]*common.Address{
-				"DeterministicDeploymentProxy": &deployerAddress,
-			}
-			backend, err := deployer.NewL2BackendWithChainIDAndPredeploys(
-				new(big.Int).SetUint64(config.L2ChainID),
-				predeploys,
-			)
-			if err != nil {
-				return nil, err
-			}
-			deployedBin, err := deployer.DeployWithDeterministicDeployer(backend, name)
-			if err != nil {
-				return nil, err
-			}
-			deployResults[name] = deployedBin
-			fallthrough
-		case "MultiCall3", "Create2Deployer", "Safe_v130",
-			"SafeL2_v130", "MultiSendCallOnly_v130", "SafeSingletonFactory",
-			"DeterministicDeploymentProxy", "MultiSend_v130", "SenderCreator", "EntryPoint":
-			db.CreateAccount(codeAddr)
-		default:
-			if !predeploy.ProxyDisabled {
-				codeAddr, err = AddressToCodeNamespace(predeploy.Address)
-				if err != nil {
-					return nil, fmt.Errorf("error converting to code namespace: %w", err)
-				}
-				db.CreateAccount(codeAddr)
-				db.SetState(predeploy.Address, ImplementationSlot, eth.AddressAsLeftPaddedHash(codeAddr))
-				log.Info("Set proxy", "name", name, "address", predeploy.Address, "implementation", codeAddr)
-			}
+		if len(genspec.Alloc[addr].Code) == 0 {
+			return nil, fmt.Errorf("predeploy %x is missing from L2 genesis allocs", addr)
 		}
+	}
 
-		if predeploy.ProxyDisabled && db.Exist(predeploy.Address) {
-			db.DeleteState(predeploy.Address, AdminSlot)
-		}
+	return genspec, nil
+}
 
-		if err := setupPredeploy(db, deployResults, storage, name, predeploy.Address, codeAddr); err != nil {
-			return nil, err
+func HasAnyDevAccounts(allocs types.GenesisAlloc) (bool, error) {
+	wallet, err := hdwallet.NewFromMnemonic(testMnemonic)
+	if err != nil {
+		return false, fmt.Errorf("failed to create wallet: %w", err)
+	}
+	account := func(path string) accounts.Account {
+		return accounts.Account{URL: accounts.URL{Path: path}}
+	}
+	for i := 0; i < 30; i++ {
+		key, err := wallet.PrivateKey(account(fmt.Sprintf("m/44'/60'/0'/0/%d", i)))
+		if err != nil {
+			return false, err
 		}
-		code := db.GetCode(codeAddr)
-		if len(code) == 0 {
-			return nil, fmt.Errorf("code not set for %s", name)
+		addr := crypto.PubkeyToAddress(key.PublicKey)
+		if _, ok := allocs[addr]; ok {
+			return true, nil
 		}
 	}
-
-	if err := PerformUpgradeTxs(db); err != nil {
-		return nil, fmt.Errorf("failed to perform upgrade txs: %w", err)
-	}
-
-	return db.Genesis(), nil
+	return false, nil
 }
 
-func PerformUpgradeTxs(db *state.MemoryStateDB) error {
-	// Only the Ecotone upgrade is performed with upgrade-txs.
-	if !db.Genesis().Config.IsEcotone(db.Genesis().Timestamp) {
-		return nil
-	}
-	sim := squash.NewSimulator(db)
-	ecotone, err := derive.EcotoneNetworkUpgradeTransactions()
+func LoadForgeAllocs(allocsPath string) (*ForgeAllocs, error) {
+	path := filepath.Join(allocsPath)
+	f, err := os.OpenFile(path, os.O_RDONLY, 0644)
 	if err != nil {
-		return fmt.Errorf("failed to build ecotone upgrade txs: %w", err)
+		return nil, fmt.Errorf("failed to open forge allocs %q: %w", path, err)
 	}
-	if err := sim.AddUpgradeTxs(ecotone); err != nil {
-		return fmt.Errorf("failed to apply ecotone upgrade txs: %w", err)
+	defer f.Close()
+	var out ForgeAllocs
+	if err := json.NewDecoder(f).Decode(&out); err != nil {
+		return nil, fmt.Errorf("failed to json-decode forge allocs %q: %w", path, err)
 	}
-	return nil
+	return &out, nil
 }
diff --git a/op-chain-ops/genesis/layer_two_test.go b/op-chain-ops/genesis/layer_two_test.go
deleted file mode 100644
index 2dcf835d3126..000000000000
--- a/op-chain-ops/genesis/layer_two_test.go
+++ /dev/null
@@ -1,103 +0,0 @@
-package genesis_test
-
-import (
-	"context"
-	"encoding/json"
-	"flag"
-	"math/big"
-	"os"
-	"testing"
-
-	"github.com/stretchr/testify/require"
-
-	"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core"
-	"github.com/ethereum/go-ethereum/crypto"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
-	"github.com/ethereum-optimism/optimism/op-service/eth"
-)
-
-var writeFile bool
-
-func init() {
-	flag.BoolVar(&writeFile, "write-file", false, "write the genesis file to disk")
-}
-
-var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
-
-// Tests the BuildL2MainnetGenesis factory with the provided config.
-func testBuildL2Genesis(t *testing.T, config *genesis.DeployConfig) *core.Genesis {
-	backend := backends.NewSimulatedBackend(
-		core.GenesisAlloc{
-			crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(10000000000000000)},
-		},
-		15000000,
-	)
-	block, err := backend.BlockByNumber(context.Background(), common.Big0)
-	require.NoError(t, err)
-
-	gen, err := genesis.BuildL2Genesis(config, block)
-	require.Nil(t, err)
-	require.NotNil(t, gen)
-
-	proxyBytecode, err := bindings.GetDeployedBytecode("Proxy")
-	require.NoError(t, err)
-
-	for name, predeploy := range predeploys.Predeploys {
-		addr := predeploy.Address
-
-		account, ok := gen.Alloc[addr]
-		require.Equal(t, true, ok, name)
-		require.Greater(t, len(account.Code), 0)
-
-		adminSlot, ok := account.Storage[genesis.AdminSlot]
-		isProxy := !predeploy.ProxyDisabled ||
-			(!config.EnableGovernance && addr == predeploys.GovernanceTokenAddr)
-		if isProxy {
-			require.Equal(t, true, ok, name)
-			require.Equal(t, eth.AddressAsLeftPaddedHash(predeploys.ProxyAdminAddr), adminSlot)
-			require.Equal(t, proxyBytecode, account.Code)
-		} else {
-			require.Equal(t, false, ok, name)
-			require.NotEqual(t, proxyBytecode, account.Code, name)
-		}
-	}
-
-	// All of the precompile addresses should be funded with a single wei
-	for i := 0; i < genesis.PrecompileCount; i++ {
-		addr := common.BytesToAddress([]byte{byte(i)})
-		require.Equal(t, common.Big1, gen.Alloc[addr].Balance)
-	}
-
-	create2Deployer := gen.Alloc[predeploys.Create2DeployerAddr]
-	codeHash := crypto.Keccak256Hash(create2Deployer.Code)
-	require.Equal(t, codeHash, bindings.Create2DeployerCodeHash)
-
-	if writeFile {
-		file, _ := json.MarshalIndent(gen, "", " ")
-		_ = os.WriteFile("genesis.json", file, 0644)
-	}
-	return gen
-}
-
-func TestBuildL2MainnetGenesis(t *testing.T) {
-	config, err := genesis.NewDeployConfig("./testdata/test-deploy-config-devnet-l1.json")
-	require.Nil(t, err)
-	config.EnableGovernance = true
-	config.FundDevAccounts = false
-	gen := testBuildL2Genesis(t, config)
-	require.Equal(t, 2333, len(gen.Alloc))
-}
-
-func TestBuildL2MainnetNoGovernanceGenesis(t *testing.T) {
-	config, err := genesis.NewDeployConfig("./testdata/test-deploy-config-devnet-l1.json")
-	require.Nil(t, err)
-	config.EnableGovernance = false
-	config.FundDevAccounts = false
-	gen := testBuildL2Genesis(t, config)
-	require.Equal(t, 2333, len(gen.Alloc))
-}
diff --git a/op-chain-ops/genesis/setters.go b/op-chain-ops/genesis/setters.go
deleted file mode 100644
index 5b17a2bbbb9a..000000000000
--- a/op-chain-ops/genesis/setters.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package genesis
-
-import (
-	"errors"
-	"math/big"
-
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/vm"
-	"github.com/ethereum/go-ethereum/log"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/immutables"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/state"
-	"github.com/ethereum-optimism/optimism/op-service/eth"
-)
-
-// PrecompileCount represents the number of precompile addresses
-// starting from `address(0)` to PrecompileCount that are funded
-// with a single wei in the genesis state.
-const PrecompileCount = 256
-
-// FundDevAccounts will fund each of the development accounts.
-func FundDevAccounts(db vm.StateDB) {
-	for _, account := range DevAccounts {
-		if !db.Exist(account) {
-			db.CreateAccount(account)
-		}
-		db.AddBalance(account, devBalance)
-	}
-}
-
-func setProxies(db vm.StateDB, proxyAdminAddr common.Address, namespace *big.Int, count uint64) error {
-	depBytecode, err := bindings.GetDeployedBytecode("Proxy")
-	if err != nil {
-		return err
-	}
-	if len(depBytecode) == 0 {
-		return errors.New("Proxy has empty bytecode")
-	}
-
-	for i := uint64(0); i <= count; i++ {
-		bigAddr := new(big.Int).Or(namespace, new(big.Int).SetUint64(i))
-		addr := common.BigToAddress(bigAddr)
-
-		if !db.Exist(addr) {
-			db.CreateAccount(addr)
-		}
-
-		db.SetCode(addr, depBytecode)
-		db.SetState(addr, AdminSlot, eth.AddressAsLeftPaddedHash(proxyAdminAddr))
-		log.Trace("Set proxy", "address", addr, "admin", proxyAdminAddr)
-	}
-
-	return nil
-}
-
-// SetPrecompileBalances will set a single wei at each precompile address.
-// This is an optimization to make calling them cheaper.
-func SetPrecompileBalances(db vm.StateDB) {
-	for i := 0; i < PrecompileCount; i++ {
-		addr := common.BytesToAddress([]byte{byte(i)})
-		db.CreateAccount(addr)
-		db.AddBalance(addr, common.Big1)
-	}
-}
-
-func setupPredeploy(db vm.StateDB, deployResults immutables.DeploymentResults, storage state.StorageConfig, name string, proxyAddr common.Address, implAddr common.Address) error {
-	// Use the generated bytecode when there are immutables
-	// otherwise use the artifact deployed bytecode
-	if bytecode, ok := deployResults[name]; ok {
-		log.Info("Setting deployed bytecode with immutables", "name", name, "address", implAddr)
-		db.SetCode(implAddr, bytecode)
-	} else {
-		depBytecode, err := bindings.GetDeployedBytecode(name)
-		if err != nil {
-			return err
-		}
-		log.Info("Setting deployed bytecode from solc compiler output", "name", name, "address", implAddr)
-		db.SetCode(implAddr, depBytecode)
-	}
-
-	// Set the storage values
-	if storageConfig, ok := storage[name]; ok {
-		log.Info("Setting storage", "name", name, "address", proxyAddr)
-		if err := state.SetStorage(name, proxyAddr, storageConfig, db); err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
diff --git a/op-chain-ops/genesis/testdata/allocs-l1.json b/op-chain-ops/genesis/testdata/allocs-l1.json
deleted file mode 100644
index b103f8a387f1..000000000000
--- a/op-chain-ops/genesis/testdata/allocs-l1.json
+++ /dev/null
@@ -1,279 +0,0 @@
-{
-  "root": "c09d26bbbfff36314c8d562387f54768cc0d82b1ad5d2f8544c45e9a1b73cd82",
-  "accounts": {
-    "0x0000000000000000000000000000000000000001": {
-      "balance": "0x1",
-      "nonce": 0,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
-      "key": "0x1468288056310c82aa4c01a7e12a10f8111a0560e72b700555479031b86c357d"
-    },
-    "0x0000000000000000000000000000000000000002": {
-      "balance": "0x1",
-      "nonce": 0,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
-      "key": "0xd52688a8f926c816ca1e079067caba944f158e764817b83fc43594370ca9cf62"
-    },
-    "0x0000000000000000000000000000000000000003": {
-      "balance": "0x1",
-      "nonce": 0,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
-      "key": "0x5b70e80538acdabd6137353b0f9d8d149f4dba91e8be2e7946e409bfdbe685b9"
-    },
-    "0x0000000000000000000000000000000000000004": {
-      "balance": "0x1",
-      "nonce": 0,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
-      "key": "0xa876da518a393dbd067dc72abfa08d475ed6447fca96d92ec3f9e7eba503ca61"
-    },
-    "0x0000000000000000000000000000000000000005": {
-      "balance": "0x1",
-      "nonce": 0,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
-      "key": "0x421df1fa259221d02aa4956eb0d35ace318ca24c0a33a64c1af96cf67cf245b6"
-    },
-    "0x0000000000000000000000000000000000000006": {
-      "balance": "0x1",
-      "nonce": 0,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
-      "key": "0x689802d6ed1a28b049e9d4fe5334c5902fd9bc00c42821c82f82ee2da10be908"
-    },
-    "0x0000000000000000000000000000000000000007": {
-      "balance": "0x1",
-      "nonce": 0,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
-      "key": "0x8c3ab0970b73895b8c9959bae685c3a19f45eb5ad89d42b52a340ec4ac204d19"
-    },
-    "0x0000000000000000000000000000000000000008": {
-      "balance": "0x1",
-      "nonce": 0,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
-      "key": "0x471703c5eda8644a64cec152c58f5aacec93d72fb0bfa705f0473f9043a8357c"
-    },
-    "0x0000000000000000000000000000000000000009": {
-      "balance": "0x1",
-      "nonce": 0,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
-      "key": "0xe690b239ba3aaf993e443ae14aeffc44cf8d9931a79baed9fa141d0e4506e131"
-    },
-    "0x1b57a644b92f2ce01a24c7963c56a3bb534d45e3": {
-      "balance": "115792089237316195423570985008687907853269984665640564039457567184297689500124",
-      "nonce": 34,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
-      "key": "0x5e0651590c81426aa5f87b57e050b06ca0e3d1c7506a54ace1e923c08eda1d62"
-    },
-    "0x36f4e85652236f9edaeba78bbe9d8c2b55ac5809": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0xaab9666c577be40942a2a1b7db7f1ef1e1a208ea6b7e33c906221efb78cc11c5",
-      "codeHash": "0xaebd68b2a785d0af4b7e1f3e600efde438efa83b08f2ad8bcd9287322f396e5f",
-      "code": "0x60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a",
-      "storage": {
-        "0x0000000000000000000000000000000000000000000000000000000000000000": "bcd4042de499d14e55001ccbb24a551f3b954096",
-        "0x0000000000000000000000000000000000000000000000000000000000000003": "7aeb97910d4070426c00e820de4137d6d2adf0ad",
-        "0x3169b0a85a62f04de9279f66b623844e1e542a1a44bb9f25f4000f3f2b5d71b2": "01",
-        "0x929e83c085f29efb1559cc14f2ec57c3b2106bd7f88984815b0d4ac8b8226039": "02",
-        "0xf937eef8f1f5925a5e3716665bcb6651d39ff31801cef302b0c2216f9a8f51f3": "4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"
-      },
-      "key": "0xc5cde3f9919e46021264f96610e62970e8aa910e6457059ce4bfb1c48b16b59a"
-    },
-    "0x4562938d6831437f37dd1bf5bbb7fe7a5f080eac": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x3e8b25f39fd713daed2a41f440a2ffecf3e7a153bd7a230d053f36740f656433",
-      "codeHash": "0x3f41be62f844a58153179eed8f6e351351a8a0b293f01383671e7ec136b3e40e",
-      "code": "0x6080604052600436106101445760003560e01c80636e296e45116100c0578063a4e7f8bd11610074578063b28ade2511610059578063b28ade251461036f578063d764ad0b1461038f578063ecc70428146103a257600080fd5b8063a4e7f8bd146102ff578063b1b1b2091461033f57600080fd5b806383a74074116100a557806383a74074146102b45780638cbeeef21461023c5780639fce812c146102cb57600080fd5b80636e296e451461028a5780638129fc1c1461029f57600080fd5b80633dbb202b116101175780634c1d6a69116100fc5780634c1d6a691461023c57806354fd4d50146102525780635644cfdf1461027457600080fd5b80633dbb202b146101ff5780633f827a5a1461021457600080fd5b8063028f85f7146101495780630c5684981461017c5780630ff754ea146101915780632828d7e8146101ea575b600080fd5b34801561015557600080fd5b5061015e601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061015e603f81565b34801561019d57600080fd5b506101c57f000000000000000000000000cf1a8a7f273da1bd3112750cc3691b46c541e8b781565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610173565b3480156101f657600080fd5b5061015e604081565b61021261020d3660046119a1565b610407565b005b34801561022057600080fd5b50610229600181565b60405161ffff9091168152602001610173565b34801561024857600080fd5b5061015e619c4081565b34801561025e57600080fd5b5061026761066b565b6040516101739190611a82565b34801561028057600080fd5b5061015e61138881565b34801561029657600080fd5b506101c561070e565b3480156102ab57600080fd5b506102126107fa565b3480156102c057600080fd5b5061015e62030d4081565b3480156102d757600080fd5b506101c57f000000000000000000000000420000000000000000000000000000000000000781565b34801561030b57600080fd5b5061032f61031a366004611a9c565b60ce6020526000908152604090205460ff1681565b6040519015158152602001610173565b34801561034b57600080fd5b5061032f61035a366004611a9c565b60cb6020526000908152604090205460ff1681565b34801561037b57600080fd5b5061015e61038a366004611ab5565b6109f7565b61021261039d366004611b09565b610a65565b3480156103ae57600080fd5b506103f960cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b604051908152602001610173565b6105407f00000000000000000000000042000000000000000000000000000000000000076104368585856109f7565b347fd764ad0b000000000000000000000000000000000000000000000000000000006104a260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016104be9796959493929190611bd8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261130d565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856105c560cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516105d7959493929190611c37565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60606106967f00000000000000000000000000000000000000000000000000000000000000016113c2565b6106bf7f00000000000000000000000000000000000000000000000000000000000000046113c2565b6106e87f00000000000000000000000000000000000000000000000000000000000000016113c2565b6040516020016106fa93929190611c85565b604051602081830303815290604052905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084015b60405180910390fd5b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000547501000000000000000000000000000000000000000000900460ff1615808015610845575060005460017401000000000000000000000000000000000000000090910460ff16105b806108775750303b158015610877575060005474010000000000000000000000000000000000000000900460ff166001145b610903576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107d4565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055801561098957600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b6109916114f7565b80156109f457600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6000611388619c4080603f610a13604063ffffffff8816611d2a565b610a1d9190611d89565b610a28601088611d2a565b610a359062030d40611db0565b610a3f9190611db0565b610a499190611db0565b610a539190611db0565b610a5d9190611db0565b949350505050565b60f087901c60028110610b20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016107d4565b8061ffff16600003610c15576000610b71878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506115d0915050565b600081815260cb602052604090205490915060ff1615610c13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016107d4565b505b6000610c5b898989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506115ef92505050565b9050610c65611612565b15610c9d57853414610c7957610c79611ddc565b600081815260ce602052604090205460ff1615610c9857610c98611ddc565b610def565b3415610d51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016107d4565b600081815260ce602052604090205460ff16610def576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016107d4565b610df887611736565b15610eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016107d4565b600081815260cb602052604090205460ff1615610f4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016107d4565b610f6b85610f5c611388619c40611db0565b67ffffffffffffffff166117ad565b1580610f91575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b156110aa57600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016107d4565b50506112e3565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061113b88619c405a6110fe9190611e0b565b8988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506117cb92505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156111d257600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26112df565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016112df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016107d4565b5050505b50505050505050565b905090565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf1a8a7f273da1bd3112750cc3691b46c541e8b7169063e9e05c4290849061138a908890839089906000908990600401611e22565b6000604051808303818588803b1580156113a357600080fd5b505af11580156113b7573d6000803e3d6000fd5b505050505050505050565b60608160000361140557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561142f578061141981611e7a565b91506114289050600a83611eb2565b9150611409565b60008167ffffffffffffffff81111561144a5761144a611ec6565b6040519080825280601f01601f191660200182016040528015611474576020820181803683370190505b5090505b8415610a5d57611489600183611e0b565b9150611496600a86611ef5565b6114a1906030611f09565b60f81b8183815181106114b6576114b6611f21565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506114f0600a86611eb2565b9450611478565b6000547501000000000000000000000000000000000000000000900460ff166115a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107d4565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055565b60006115de858585856117e5565b805190602001209050949350505050565b60006115ff87878787878761187e565b8051906020012090509695505050505050565b60003373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf1a8a7f273da1bd3112750cc3691b46c541e8b7161480156112ec57507f000000000000000000000000420000000000000000000000000000000000000773ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000cf1a8a7f273da1bd3112750cc3691b46c541e8b773ffffffffffffffffffffffffffffffffffffffff16639bf62d826040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171a9190611f50565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff82163014806117a757507f000000000000000000000000cf1a8a7f273da1bd3112750cc3691b46c541e8b773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b6060848484846040516024016117fe9493929190611f6d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161189b96959493929190611fb7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109f457600080fd5b60008083601f84011261195157600080fd5b50813567ffffffffffffffff81111561196957600080fd5b60208301915083602082850101111561198157600080fd5b9250929050565b803563ffffffff8116811461199c57600080fd5b919050565b600080600080606085870312156119b757600080fd5b84356119c28161191d565b9350602085013567ffffffffffffffff8111156119de57600080fd5b6119ea8782880161193f565b90945092506119fd905060408601611988565b905092959194509250565b60005b83811015611a23578181015183820152602001611a0b565b83811115611a32576000848401525b50505050565b60008151808452611a50816020860160208601611a08565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a956020830184611a38565b9392505050565b600060208284031215611aae57600080fd5b5035919050565b600080600060408486031215611aca57600080fd5b833567ffffffffffffffff811115611ae157600080fd5b611aed8682870161193f565b9094509250611b00905060208501611988565b90509250925092565b600080600080600080600060c0888a031215611b2457600080fd5b873596506020880135611b368161191d565b95506040880135611b468161191d565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611b7057600080fd5b611b7c8a828b0161193f565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611c2a60c083018486611b8f565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611c67608083018688611b8f565b905083604083015263ffffffff831660608301529695505050505050565b60008451611c97818460208901611a08565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611cd3816001850160208a01611a08565b60019201918201528351611cee816002840160208801611a08565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611d5157611d51611cfb565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680611da457611da4611d5a565b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611dd357611dd3611cfb565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611e1d57611e1d611cfb565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611e6f60a0830184611a38565b979650505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611eab57611eab611cfb565b5060010190565b600082611ec157611ec1611d5a565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082611f0457611f04611d5a565b500690565b60008219821115611f1c57611f1c611cfb565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611f6257600080fd5b8151611a958161191d565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611fa66080830185611a38565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261200260c0830184611a38565b9897505050505050505056fea164736f6c634300080f000a",
-      "storage": {
-        "0x0000000000000000000000000000000000000000000000000000000000000000": "010000000000000000000000000000000000000000",
-        "0x00000000000000000000000000000000000000000000000000000000000000cc": "dead"
-      },
-      "key": "0xf16b24c51b2548da7804641166342e8b8662bebf66987ef3eb12dd7950821b74"
-    },
-    "0x48204903b06a64e3c44b0260f875497ea5316a02": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x408e9cd8a46cccdf81d7735aa9c93b5a97608fcc38000c6c8311e6d614c9cfc6",
-      "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35",
-      "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a",
-      "storage": {
-        "0x0000000000000000000000000000000000000000000000000000000000000000": "01",
-        "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "7f325df611b236ee3ef469da4a74f776c787d1b3",
-        "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "36f4e85652236f9edaeba78bbe9d8c2b55ac5809"
-      },
-      "key": "0x2c94e39eab7e93ae2c81f6d3b7d4b3d6a6ffeb09b6493d7bb1642b2d00c2cf60"
-    },
-    "0x6fb1869d7141c97cf28668fa0a338bdc892f53c0": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x4c966b8eb461b1db77f4842a16a91b766d03a7f2699edfa8f25d23028b511260",
-      "codeHash": "0xc7b46fc754979c0fd29ec7105b045a5705d172da4364b24a72e42e586906056f",
-      "code": "0x60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a",
-      "storage": {
-        "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "9a7ecb1c67f88396d252725f3259e9d8027f1562",
-        "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "36f4e85652236f9edaeba78bbe9d8c2b55ac5809"
-      },
-      "key": "0xe1a3b9b8f8403a487cd74384f01166a39e6b0740fb9cf546795fa82c12e0a716"
-    },
-    "0x73317009f4fadafcda357f3a082c7b68f5f8732f": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0xdc2d8e78c5f46669754c0498c50471e7944dd5787b3acdbcb53858469ad4e1d3",
-      "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35",
-      "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a",
-      "storage": {
-        "0x0000000000000000000000000000000000000000000000000000000000000000": "01",
-        "0x0000000000000000000000000000000000000000000000000000000000000033": "bcd4042de499d14e55001ccbb24a551f3b954096",
-        "0x0000000000000000000000000000000000000000000000000000000000000065": "0834",
-        "0x0000000000000000000000000000000000000000000000000000000000000066": "0f4240",
-        "0x0000000000000000000000000000000000000000000000000000000000000067": "3c44cdddb6a900fa2b585dd299e03d12fa4293bc",
-        "0x0000000000000000000000000000000000000000000000000000000000000068": "01c9c380",
-        "0x0000000000000000000000000000000000000000000000000000000000000069": "ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00",
-        "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "ec466e9a46914507c484dcc5caba1db787e34913",
-        "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08": "9965507d1a55bcc2695c58ba16fb37d819b0a4dc",
-        "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "36f4e85652236f9edaeba78bbe9d8c2b55ac5809"
-      },
-      "key": "0xfbb20b1dbf403bf022cfca8b23242ebe79dc06744e9d5233cb6db43454746315"
-    },
-    "0x7aeb97910d4070426c00e820de4137d6d2adf0ad": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x5577b03f1a10efe1b976be229362e61ffc19859e866c7ca0d9e4887bc87b0800",
-      "codeHash": "0x23ff3128727914b22a2753aafff02d897826166b869a027a11b851863d379ddf",
-      "code": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046104fa565b610106565b6100906100da366004610548565b6101d9565b6100746100ed366004610585565b610215565b6100fa6102d1565b6101046000610352565b565b61010e6102d1565b6000610119836103c7565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000008316179092559151929350169061017c9085906105a7565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006101e8846103c7565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b61021d6102d1565b73ffffffffffffffffffffffffffffffffffffffff81166102c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102ce81610352565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bc565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016103da91906105a7565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261043757600080fd5b813567ffffffffffffffff80821115610452576104526103f7565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610498576104986103f7565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b919050565b6000806040838503121561050d57600080fd5b823567ffffffffffffffff81111561052457600080fd5b61053085828601610426565b92505061053f602084016104d1565b90509250929050565b60006020828403121561055a57600080fd5b813567ffffffffffffffff81111561057157600080fd5b61057d84828501610426565b949350505050565b60006020828403121561059757600080fd5b6105a0826104d1565b9392505050565b6000825160005b818110156105c857602081860181015185830152016105ae565b818111156105d7576000828501525b50919091019291505056fea164736f6c634300080f000a",
-      "storage": {
-        "0x0000000000000000000000000000000000000000000000000000000000000000": "36f4e85652236f9edaeba78bbe9d8c2b55ac5809",
-        "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e": "4562938d6831437f37dd1bf5bbb7fe7a5f080eac"
-      },
-      "key": "0xd0a446c0ce66b5c711436c39fbeae531a05e9d698f32ddc8cd48d17fbe95feb0"
-    },
-    "0x7ec3b539c97c98d503fb4fee3dd4ee885dc192cd": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0x0d625098e698c6d3b38ed38c3f00ea28361dc94fbf0e6cfd4c1ebc121cd9daac",
-      "code": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c8063761f449311610076578063927ede2d1161005b578063927ede2d1461019c578063aa557452146101c3578063c89701a2146101d657600080fd5b8063761f4493146101625780637f46ddb21461017557600080fd5b80633687011a146100a85780633cb747bf146100bd57806354fd4d50146101095780635d93a3fc1461011e575b600080fd5b6100bb6100b6366004610dc3565b6101fc565b005b7f000000000000000000000000a88b2060478401a52532814edde6819d101802e25b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101116102a8565b6040516101009190610ec0565b61015261012c366004610eda565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b6040519015158152602001610100565b6100bb610170366004610f1b565b61034b565b6100df7f000000000000000000000000420000000000000000000000000000000000001481565b6100df7f000000000000000000000000a88b2060478401a52532814edde6819d101802e281565b6100bb6101d1366004610fb3565b6107cc565b7f00000000000000000000000042000000000000000000000000000000000000146100df565b333b15610290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102a08686333388888888610888565b505050505050565b60606102d37f0000000000000000000000000000000000000000000000000000000000000001610bff565b6102fc7f0000000000000000000000000000000000000000000000000000000000000001610bff565b6103257f0000000000000000000000000000000000000000000000000000000000000002610bff565b6040516020016103379392919061102a565b604051602081830303815290604052905090565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a88b2060478401a52532814edde6819d101802e21614801561046957507f000000000000000000000000420000000000000000000000000000000000001473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000a88b2060478401a52532814edde6819d101802e273ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa15801561042d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045191906110a0565b73ffffffffffffffffffffffffffffffffffffffff16145b6104f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f7468657220627269646765006064820152608401610287565b3073ffffffffffffffffffffffffffffffffffffffff88160361059a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c66000000000000000000000000000000000000000000006064820152608401610287565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff161515600114610669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c3120427269646765000000000000006064820152608401610287565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b15801561072957600080fd5b505af115801561073d573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac878787876040516107bb9493929190611106565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff851661086f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f742062652061646472657373283029000000000000000000000000000000006064820152608401610287565b61087f8787338888888888610888565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff871661092b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f7420626520616464726573732830290000000000000000000000000000006064820152608401610287565b600063761f449360e01b888a89898988886040516024016109529796959493929190611146565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610a9257600080fd5b505af1158015610aa6573d6000803e3d6000fd5b50506040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a88b2060478401a52532814edde6819d101802e2169250633dbb202b9150610b40907f000000000000000000000000420000000000000000000000000000000000001490859089906004016111a3565b600060405180830381600087803b158015610b5a57600080fd5b505af1158015610b6e573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610bec9493929190611106565b60405180910390a4505050505050505050565b606081600003610c4257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610c6c5780610c5681611217565b9150610c659050600a8361127e565b9150610c46565b60008167ffffffffffffffff811115610c8757610c87611292565b6040519080825280601f01601f191660200182016040528015610cb1576020820181803683370190505b5090505b8415610d3457610cc66001836112c1565b9150610cd3600a866112d8565b610cde9060306112ec565b60f81b818381518110610cf357610cf3611304565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610d2d600a8661127e565b9450610cb5565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610d5e57600080fd5b50565b803563ffffffff81168114610d7557600080fd5b919050565b60008083601f840112610d8c57600080fd5b50813567ffffffffffffffff811115610da457600080fd5b602083019150836020828501011115610dbc57600080fd5b9250929050565b60008060008060008060a08789031215610ddc57600080fd5b8635610de781610d3c565b95506020870135610df781610d3c565b945060408701359350610e0c60608801610d61565b9250608087013567ffffffffffffffff811115610e2857600080fd5b610e3489828a01610d7a565b979a9699509497509295939492505050565b60005b83811015610e61578181015183820152602001610e49565b83811115610e70576000848401525b50505050565b60008151808452610e8e816020860160208601610e46565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ed36020830184610e76565b9392505050565b600080600060608486031215610eef57600080fd5b8335610efa81610d3c565b92506020840135610f0a81610d3c565b929592945050506040919091013590565b600080600080600080600060c0888a031215610f3657600080fd5b8735610f4181610d3c565b96506020880135610f5181610d3c565b95506040880135610f6181610d3c565b94506060880135610f7181610d3c565b93506080880135925060a088013567ffffffffffffffff811115610f9457600080fd5b610fa08a828b01610d7a565b989b979a50959850939692959293505050565b600080600080600080600060c0888a031215610fce57600080fd5b8735610fd981610d3c565b96506020880135610fe981610d3c565b95506040880135610ff981610d3c565b94506060880135935061100e60808901610d61565b925060a088013567ffffffffffffffff811115610f9457600080fd5b6000845161103c818460208901610e46565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611078816001850160208a01610e46565b60019201918201528351611093816002840160208801610e46565b0160020195945050505050565b6000602082840312156110b257600080fd5b8151610ed381610d3c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061113c6060830184866110bd565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261119660c0830184866110bd565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006111d26060830185610e76565b905063ffffffff83166040830152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611248576112486111e8565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261128d5761128d61124f565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000828210156112d3576112d36111e8565b500390565b6000826112e7576112e761124f565b500690565b600082198211156112ff576112ff6111e8565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a",
-      "key": "0xd409335fac8e9e86a7a66c3720b403889062892385e5f09b7af7c5bee4f326fd"
-    },
-    "0x7f325df611b236ee3ef469da4a74f776c787d1b3": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x821e2556a290c86405f8160a2d662042a431ba456b9db265c79bb837c04be5f0",
-      "codeHash": "0x8e91bdb75050d4b44b5fc5c557c6f3455bfc4b76686fd72d9087b51a3200aecf",
-      "code": "0x6080604052600436106101435760003560e01c806388786272116100c0578063cf8e5cf011610074578063dcec334811610059578063dcec3348146103ce578063e4a30116146103e3578063f4daa2911461040357600080fd5b8063cf8e5cf01461038e578063d1de856c146103ae57600080fd5b80639aaab648116100a55780639aaab648146102eb578063a25ae557146102fe578063bffa7f0f1461035a57600080fd5b806388786272146102b357806389c44cbb146102c957600080fd5b806369f16eec116101175780636b4d98dd116100fc5780636b4d98dd1461022457806370872aa51461027d5780637f0064201461029357600080fd5b806369f16eec146101fa5780636abcf5631461020f57600080fd5b80622134cc146101485780634599c7881461018f578063529933df146101a457806354fd4d50146101d8575b600080fd5b34801561015457600080fd5b5061017c7f000000000000000000000000000000000000000000000000000000000000000281565b6040519081526020015b60405180910390f35b34801561019b57600080fd5b5061017c610437565b3480156101b057600080fd5b5061017c7f000000000000000000000000000000000000000000000000000000000000001481565b3480156101e457600080fd5b506101ed6104aa565b60405161018691906113f2565b34801561020657600080fd5b5061017c61054d565b34801561021b57600080fd5b5060035461017c565b34801561023057600080fd5b506102587f00000000000000000000000015d34aaf54267db7d7c367839aaf71a00a2c6a6581565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610186565b34801561028957600080fd5b5061017c60015481565b34801561029f57600080fd5b5061017c6102ae366004611443565b61055f565b3480156102bf57600080fd5b5061017c60025481565b3480156102d557600080fd5b506102e96102e4366004611443565b610778565b005b6102e96102f936600461145c565b610a4e565b34801561030a57600080fd5b5061031e610319366004611443565b610ecd565b60408051825181526020808401516fffffffffffffffffffffffffffffffff908116918301919091529282015190921690820152606001610186565b34801561036657600080fd5b506102587f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c881565b34801561039a57600080fd5b5061031e6103a9366004611443565b610f61565b3480156103ba57600080fd5b5061017c6103c9366004611443565b610f99565b3480156103da57600080fd5b5061017c610fe7565b3480156103ef57600080fd5b506102e96103fe36600461148e565b61101c565b34801561040f57600080fd5b5061017c7f000000000000000000000000000000000000000000000000000000000000000281565b600354600090156104a15760038054610452906001906114df565b81548110610462576104626114f6565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b60606104d57f0000000000000000000000000000000000000000000000000000000000000001611285565b6104fe7f0000000000000000000000000000000000000000000000000000000000000003611285565b6105277f0000000000000000000000000000000000000000000000000000000000000001611285565b60405160200161053993929190611525565b604051602081830303815290604052905090565b6003546000906104a5906001906114df565b6000610569610437565b821115610623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6003546106d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161061a565b6003546000905b8082101561077157600060026106f5838561159b565b6106ff91906115e2565b90508460038281548110610715576107156114f6565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1610156107675761076081600161159b565b925061076b565b8091505b506106df565b5092915050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000015d34aaf54267db7d7c367839aaf71a00a2c6a65161461083d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161061a565b60035481106108f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161061a565b7f000000000000000000000000000000000000000000000000000000000000000260038281548110610928576109286114f6565b6000918252602090912060016002909202010154610958906fffffffffffffffffffffffffffffffff16426114df565b10610a0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161061a565b6000610a1660035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614610b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161061a565b610b41610fe7565b8314610bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161061a565b42610bff84610f99565b10610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161061a565b83610d19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161061a565b8115610dd55781814014610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161061a565b82610ddf60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e242604051610e1191815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b604080516060810182526000808252602082018190529181019190915260038281548110610efd57610efd6114f6565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b60408051606081018252600080825260208201819052918101919091526003610f898361055f565b81548110610efd57610efd6114f6565b60007f000000000000000000000000000000000000000000000000000000000000000260015483610fca91906114df565b610fd491906115f6565b600254610fe1919061159b565b92915050565b60007f0000000000000000000000000000000000000000000000000000000000000014611012610437565b6104a5919061159b565b600054610100900460ff161580801561103c5750600054600160ff909116105b806110565750303b158015611056575060005460ff166001145b6110e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161061a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561114057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b428211156111f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161061a565b60028290556001839055801561126457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6060816000036112c857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156112f257806112dc81611633565b91506112eb9050600a836115e2565b91506112cc565b60008167ffffffffffffffff81111561130d5761130d61166b565b6040519080825280601f01601f191660200182016040528015611337576020820181803683370190505b5090505b84156113ba5761134c6001836114df565b9150611359600a8661169a565b61136490603061159b565b60f81b818381518110611379576113796114f6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506113b3600a866115e2565b945061133b565b949350505050565b60005b838110156113dd5781810151838201526020016113c5565b838111156113ec576000848401525b50505050565b60208152600082518060208401526114118160408501602087016113c2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561145557600080fd5b5035919050565b6000806000806080858703121561147257600080fd5b5050823594602084013594506040840135936060013592509050565b600080604083850312156114a157600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156114f1576114f16114b0565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600084516115378184602089016113c2565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611573816001850160208a016113c2565b6001920191820152835161158e8160028401602088016113c2565b0160020195945050505050565b600082198211156115ae576115ae6114b0565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826115f1576115f16115b3565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561162e5761162e6114b0565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611664576116646114b0565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000826116a9576116a96115b3565b50069056fea164736f6c634300080f000a",
-      "storage": {
-        "0x0000000000000000000000000000000000000000000000000000000000000000": "01"
-      },
-      "key": "0x7a0724a3db73dfc6e99d843345c7746c79a0f615a36e22824ad91209feb9cf81"
-    },
-    "0x87658463f96977fc95a068f1a206d2c0cf2db575": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0x3bb571c9d6063b9c50dcf6f602d428dfd633dca39aba9ec607d4ce0505a362d5",
-      "code": "0x60806040523480156200001157600080fd5b5060043610620000525760003560e01c806354fd4d501462000057578063896f93d11462000079578063ce5ac90f14620000b6578063ee9a31a214620000cd575b600080fd5b62000061620000f5565b60405162000070919062000550565b60405180910390f35b620000906200008a3660046200064e565b620001a0565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000070565b62000090620000c73660046200064e565b620001b7565b620000907f0000000000000000000000006fb1869d7141c97cf28668fa0a338bdc892f53c081565b6060620001227f000000000000000000000000000000000000000000000000000000000000000162000376565b6200014d7f000000000000000000000000000000000000000000000000000000000000000162000376565b620001787f000000000000000000000000000000000000000000000000000000000000000162000376565b6040516020016200018c93929190620006e5565b604051602081830303815290604052905090565b6000620001af848484620001b7565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff841662000261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d4d696e7461626c654552433230466163746f72793a206d7560448201527f73742070726f766964652072656d6f746520746f6b656e206164647265737300606482015260840160405180910390fd5b60007f0000000000000000000000006fb1869d7141c97cf28668fa0a338bdc892f53c08585856040516200029590620004c3565b620002a4949392919062000761565b604051809103906000f080158015620002c1573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf60405160405180910390a360405133815273ffffffffffffffffffffffffffffffffffffffff80871691908316907f52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb9060200160405180910390a3949350505050565b606081600003620003ba57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115620003ea5780620003d181620007ea565b9150620003e29050600a8362000854565b9150620003be565b60008167ffffffffffffffff8111156200040857620004086200056c565b6040519080825280601f01601f19166020018201604052801562000433576020820181803683370190505b5090505b8415620001af576200044b6001836200086b565b91506200045a600a8662000885565b620004679060306200089c565b60f81b8183815181106200047f576200047f620008b7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350620004bb600a8662000854565b945062000437565b611a8580620008e783390190565b60005b83811015620004ee578181015183820152602001620004d4565b83811115620004fe576000848401525b50505050565b600081518084526200051e816020860160208601620004d1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600062000565602083018462000504565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112620005ad57600080fd5b813567ffffffffffffffff80821115620005cb57620005cb6200056c565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156200061457620006146200056c565b816040528381528660208588010111156200062e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156200066457600080fd5b833573ffffffffffffffffffffffffffffffffffffffff811681146200068957600080fd5b9250602084013567ffffffffffffffff80821115620006a757600080fd5b620006b5878388016200059b565b93506040860135915080821115620006cc57600080fd5b50620006db868287016200059b565b9150509250925092565b60008451620006f9818460208901620004d1565b80830190507f2e00000000000000000000000000000000000000000000000000000000000000808252855162000737816001850160208a01620004d1565b6001920191820152835162000754816002840160208801620004d1565b0160020195945050505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526200079c608083018562000504565b8281036060840152620007b0818562000504565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200081e576200081e620007bb565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008262000866576200086662000825565b500490565b600082821015620008805762000880620007bb565b500390565b60008262000897576200089762000825565b500690565b60008219821115620008b257620008b2620007bb565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfe6101206040523480156200001257600080fd5b5060405162001a8538038062001a8583398101604081905262000035916200016e565b600160006002848460036200004b83826200028d565b5060046200005a82826200028d565b50505060809290925260a05260c05250506001600160a01b0390811660e052166101005262000359565b80516001600160a01b03811681146200009c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000c957600080fd5b81516001600160401b0380821115620000e657620000e6620000a1565b604051601f8301601f19908116603f01168101908282118183101715620001115762000111620000a1565b816040528381526020925086838588010111156200012e57600080fd5b600091505b8382101562000152578582018301518183018401529082019062000133565b83821115620001645760008385830101525b9695505050505050565b600080600080608085870312156200018557600080fd5b620001908562000084565b9350620001a06020860162000084565b60408601519093506001600160401b0380821115620001be57600080fd5b620001cc88838901620000b7565b93506060870151915080821115620001e357600080fd5b50620001f287828801620000b7565b91505092959194509250565b600181811c908216806200021357607f821691505b6020821081036200023457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028857600081815260208120601f850160051c81016020861015620002635750805b601f850160051c820191505b8181101562000284578281556001016200026f565b5050505b505050565b81516001600160401b03811115620002a957620002a9620000a1565b620002c181620002ba8454620001fe565b846200023a565b602080601f831160018114620002f95760008415620002e05750858301515b600019600386901b1c1916600185901b17855562000284565b600085815260208120601f198616915b828110156200032a5788860151825594840194600190910190840162000309565b5085821015620003495787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e051610100516116cb620003ba600039600081816102f50152818161038a015281816105cf01526107a90152600081816101a9015261031b015260006107380152600061070f015260006106e601526116cb6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e1461033f578063e78cea92146102f3578063ee9a31a21461038557600080fd5b8063ae1f6aaf146102f3578063c01e1bd614610319578063d6c0b2c41461031957600080fd5b80639dc29fac116100bd5780639dc29fac146102ba578063a457c2d7146102cd578063a9059cbb146102e057600080fd5b806370a082311461027c57806395d89b41146102b257600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461024c57806340c10f191461025f57806354fd4d501461027457600080fd5b806323b872dd1461022a578063313ce5671461023d57600080fd5b806306fdde031161016057806306fdde03146101f0578063095ea7b31461020557806318160ddd1461021857600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a366004611307565b6103ac565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f861049d565b60405161019b919061137c565b61018f6102133660046113f6565b61052f565b6002545b60405190815260200161019b565b61018f610238366004611420565b610547565b6040516012815260200161019b565b61018f61025a3660046113f6565b61056b565b61027261026d3660046113f6565b6105b7565b005b6101f86106df565b61021c61028a36600461145c565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101f8610782565b6102726102c83660046113f6565b610791565b61018f6102db3660046113f6565b6108a8565b61018f6102ee3660046113f6565b610979565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61021c61034d366004611477565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000851683148061046557507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b8061049457507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b6060600380546104ac906114aa565b80601f01602080910402602001604051908101604052809291908181526020018280546104d8906114aa565b80156105255780601f106104fa57610100808354040283529160200191610525565b820191906000526020600020905b81548152906001019060200180831161050857829003601f168201915b5050505050905090565b60003361053d818585610987565b5060019392505050565b600033610555858285610b3b565b610560858585610c12565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061053d90829086906105b290879061152c565b610987565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b61068b8282610ec5565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516106d391815260200190565b60405180910390a25050565b606061070a7f0000000000000000000000000000000000000000000000000000000000000000610fe5565b6107337f0000000000000000000000000000000000000000000000000000000000000000610fe5565b61075c7f0000000000000000000000000000000000000000000000000000000000000000610fe5565b60405160200161076e93929190611544565b604051602081830303815290604052905090565b6060600480546104ac906114aa565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e0000000000000000000000006064820152608401610678565b6108608282611122565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516106d391815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561096c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610678565b6105608286868403610987565b60003361053d818585610c12565b73ffffffffffffffffffffffffffffffffffffffff8316610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610678565b73ffffffffffffffffffffffffffffffffffffffff8216610acc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610678565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c0c5781811015610bff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610678565b610c0c8484848403610987565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610cb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610678565b73ffffffffffffffffffffffffffffffffffffffff8216610d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610678565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610e0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610678565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610e5290849061152c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610eb891815260200190565b60405180910390a3610c0c565b73ffffffffffffffffffffffffffffffffffffffff8216610f42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610678565b8060026000828254610f54919061152c565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f8e90849061152c565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60608160000361102857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611052578061103c816115ba565b915061104b9050600a83611621565b915061102c565b60008167ffffffffffffffff81111561106d5761106d611635565b6040519080825280601f01601f191660200182016040528015611097576020820181803683370190505b5090505b841561111a576110ac600183611664565b91506110b9600a8661167b565b6110c490603061152c565b60f81b8183815181106110d9576110d961168f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611113600a86611621565b945061109b565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff82166111c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610678565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610678565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906112b7908490611664565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610b2e565b60006020828403121561131957600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461134957600080fd5b9392505050565b60005b8381101561136b578181015183820152602001611353565b83811115610c0c5750506000910152565b602081526000825180602084015261139b816040850160208701611350565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146113f157600080fd5b919050565b6000806040838503121561140957600080fd5b611412836113cd565b946020939093013593505050565b60008060006060848603121561143557600080fd5b61143e846113cd565b925061144c602085016113cd565b9150604084013590509250925092565b60006020828403121561146e57600080fd5b611349826113cd565b6000806040838503121561148a57600080fd5b611493836113cd565b91506114a1602084016113cd565b90509250929050565b600181811c908216806114be57607f821691505b6020821081036114f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561153f5761153f6114fd565b500190565b60008451611556818460208901611350565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611592816001850160208a01611350565b600192019182015283516115ad816002840160208801611350565b0160020195945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115eb576115eb6114fd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611630576116306115f2565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082821015611676576116766114fd565b500390565b60008261168a5761168a6115f2565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000aa164736f6c634300080f000a",
-      "key": "0xbd5530d2a017fd01a7edb9efa8656fd9c2d34523524628fdfd649f3222cec07c"
-    },
-    "0x9a7ecb1c67f88396d252725f3259e9d8027f1562": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
-      "codeHash": "0x8b9df5a9eb6bb3280671bbc79f735d9d7009f8c0590c5cd0bc75a8e928068606",
-      "code": "0x60806040526004361061012d5760003560e01c8063838b2520116100a5578063927ede2d11610074578063a9f9e67511610059578063a9f9e67514610433578063b1a1a88214610453578063e11013dd1461046657600080fd5b8063927ede2d146103ec5780639a2ac6d51461042057600080fd5b8063838b25201461033357806387087623146103535780638f601f661461037357806391c49bf8146103b957600080fd5b80633cb747bf116100fc57806354fd4d50116100e157806354fd4d50146102bd57806358a997f6146102df5780637f46ddb2146102ff57600080fd5b80633cb747bf14610244578063540abf731461029d57600080fd5b80630166a07a146101eb57806309fc88431461020b5780631532ec341461021e5780631635f5fd1461023157600080fd5b366101e657333b156101c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b6101e4333362030d4060405180602001604052806000815250610479565b005b600080fd5b3480156101f757600080fd5b506101e4610206366004612447565b61048c565b6101e46102193660046124f8565b610882565b6101e461022c36600461254b565b610959565b6101e461023f36600461254b565b61096d565b34801561025057600080fd5b507f000000000000000000000000a88b2060478401a52532814edde6819d101802e25b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102a957600080fd5b506101e46102b83660046125be565b610e42565b3480156102c957600080fd5b506102d2610e87565b60405161029491906126ab565b3480156102eb57600080fd5b506101e46102fa3660046126be565b610f2a565b34801561030b57600080fd5b506102737f000000000000000000000000420000000000000000000000000000000000001081565b34801561033f57600080fd5b506101e461034e3660046125be565b610ffe565b34801561035f57600080fd5b506101e461036e3660046126be565b611043565b34801561037f57600080fd5b506103ab61038e366004612741565b600260209081526000928352604080842090915290825290205481565b604051908152602001610294565b3480156103c557600080fd5b507f0000000000000000000000004200000000000000000000000000000000000010610273565b3480156103f857600080fd5b506102737f000000000000000000000000a88b2060478401a52532814edde6819d101802e281565b6101e461042e36600461277a565b611117565b34801561043f57600080fd5b506101e461044e366004612447565b611159565b6101e46104613660046124f8565b611168565b6101e461047436600461277a565b611239565b610486848434858561127c565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a88b2060478401a52532814edde6819d101802e2161480156105aa57507f000000000000000000000000420000000000000000000000000000000000001073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000a88b2060478401a52532814edde6819d101802e273ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa15801561056e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059291906127dd565b73ffffffffffffffffffffffffffffffffffffffff16145b61065c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b61066587611460565b156107b35761067487876114c2565b610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b15801561079657600080fd5b505af11580156107aa573d6000803e3d6000fd5b50505050610835565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a16835292905220546107f1908490612829565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c16835293905291909120919091556108359085856115e2565b610879878787878787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116b692505050565b50505050505050565b333b15610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b6109543333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061127c92505050565b505050565b610966858585858561096d565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a88b2060478401a52532814edde6819d101802e216148015610a8b57507f000000000000000000000000420000000000000000000000000000000000001073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000a88b2060478401a52532814edde6819d101802e273ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7391906127dd565b73ffffffffffffffffffffffffffffffffffffffff16145b610b3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b823414610bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e7420726571756972656400000000000060648201526084016101bd565b3073ffffffffffffffffffffffffffffffffffffffff851603610c71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c66000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b7f000000000000000000000000a88b2060478401a52532814edde6819d101802e273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610d4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e67657200000000000000000000000000000000000000000000000060648201526084016101bd565b610d8e85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061174492505050565b6000610dab855a86604051806020016040528060008152506117b7565b905080610e3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b505050505050565b61087987873388888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506117d192505050565b6060610eb27f0000000000000000000000000000000000000000000000000000000000000001611b18565b610edb7f0000000000000000000000000000000000000000000000000000000000000001611b18565b610f047f0000000000000000000000000000000000000000000000000000000000000001611b18565b604051602001610f1693929190612840565b604051602081830303815290604052905090565b333b15610fb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b610e3a86863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5592505050565b61087987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5592505050565b333b156110d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b610e3a86863333888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506117d192505050565b61048633858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061047992505050565b6108798787878787878761048c565b333b156111f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b61095433338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061047992505050565b6104863385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061127c92505050565b82341461130b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c7565000060648201526084016101bd565b61131785858584611c64565b7f000000000000000000000000a88b2060478401a52532814edde6819d101802e273ffffffffffffffffffffffffffffffffffffffff16633dbb202b847f0000000000000000000000004200000000000000000000000000000000000010631635f5fd60e01b8989898860405160240161139494939291906128b6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b9092168252611427929188906004016128ff565b6000604051808303818588803b15801561144057600080fd5b505af1158015611454573d6000803e3d6000fd5b50505050505050505050565b600061148c827f1d1d8b6300000000000000000000000000000000000000000000000000000000611cd7565b806114bc57506114bc827fec4fc8e300000000000000000000000000000000000000000000000000000000611cd7565b92915050565b60006114ee837f1d1d8b6300000000000000000000000000000000000000000000000000000000611cd7565b15611597578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561153e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156291906127dd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161490506114bc565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561153e573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109549084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611cfa565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b386868660405161172e93929190612944565b60405180910390a4610e3a868686868686611e06565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e63184846040516117a3929190612982565b60405180910390a361048684848484611e8e565b600080600080845160208601878a8af19695505050505050565b6117da87611460565b15611928576117e987876114c2565b61189b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b15801561190b57600080fd5b505af115801561191f573d6000803e3d6000fd5b505050506119bc565b61194a73ffffffffffffffffffffffffffffffffffffffff8816863086611efb565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a168352929052205461198890849061299b565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b6119ca878787878786611f59565b7f000000000000000000000000a88b2060478401a52532814edde6819d101802e273ffffffffffffffffffffffffffffffffffffffff16633dbb202b7f0000000000000000000000004200000000000000000000000000000000000010630166a07a60e01b898b8a8a8a89604051602401611a4a969594939291906129b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611add929187906004016128ff565b600060405180830381600087803b158015611af757600080fd5b505af1158015611b0b573d6000803e3d6000fd5b5050505050505050505050565b606081600003611b5b57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611b855780611b6f81612a0e565b9150611b7e9050600a83612a75565b9150611b5f565b60008167ffffffffffffffff811115611ba057611ba0612a89565b6040519080825280601f01601f191660200182016040528015611bca576020820181803683370190505b5090505b8415611c4d57611bdf600183612829565b9150611bec600a86612ab8565b611bf790603061299b565b60f81b818381518110611c0c57611c0c612acc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611c46600a86612a75565b9450611bce565b949350505050565b610879878787878787876117d1565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f238484604051611cc3929190612982565b60405180910390a361048684848484611fe7565b6000611ce283612046565b8015611cf35750611cf383836120aa565b9392505050565b6000611d5c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121799092919063ffffffff16565b8051909150156109545780806020019051810190611d7a9190612afb565b610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101bd565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd868686604051611e7e93929190612944565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051611eed929190612982565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526104869085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611634565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396868686604051611fd193929190612944565b60405180910390a4610e3a868686868686612188565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051611eed929190612982565b6000612072827f01ffc9a7000000000000000000000000000000000000000000000000000000006120aa565b80156114bc57506120a3827fffffffff000000000000000000000000000000000000000000000000000000006120aa565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015612162575060208210155b801561216e5750600081115b979650505050505050565b6060611c4d8484600085612200565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf868686604051611e7e93929190612944565b606082471015612292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101bd565b73ffffffffffffffffffffffffffffffffffffffff85163b612310576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101bd565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516123399190612b1d565b60006040518083038185875af1925050503d8060008114612376576040519150601f19603f3d011682016040523d82523d6000602084013e61237b565b606091505b509150915061216e82828660608315612395575081611cf3565b8251156123a55782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101bd91906126ab565b73ffffffffffffffffffffffffffffffffffffffff811681146123fb57600080fd5b50565b60008083601f84011261241057600080fd5b50813567ffffffffffffffff81111561242857600080fd5b60208301915083602082850101111561244057600080fd5b9250929050565b600080600080600080600060c0888a03121561246257600080fd5b873561246d816123d9565b9650602088013561247d816123d9565b9550604088013561248d816123d9565b9450606088013561249d816123d9565b93506080880135925060a088013567ffffffffffffffff8111156124c057600080fd5b6124cc8a828b016123fe565b989b979a50959850939692959293505050565b803563ffffffff811681146124f357600080fd5b919050565b60008060006040848603121561250d57600080fd5b612516846124df565b9250602084013567ffffffffffffffff81111561253257600080fd5b61253e868287016123fe565b9497909650939450505050565b60008060008060006080868803121561256357600080fd5b853561256e816123d9565b9450602086013561257e816123d9565b935060408601359250606086013567ffffffffffffffff8111156125a157600080fd5b6125ad888289016123fe565b969995985093965092949392505050565b600080600080600080600060c0888a0312156125d957600080fd5b87356125e4816123d9565b965060208801356125f4816123d9565b95506040880135612604816123d9565b945060608801359350612619608089016124df565b925060a088013567ffffffffffffffff8111156124c057600080fd5b60005b83811015612650578181015183820152602001612638565b838111156104865750506000910152565b60008151808452612679816020860160208601612635565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cf36020830184612661565b60008060008060008060a087890312156126d757600080fd5b86356126e2816123d9565b955060208701356126f2816123d9565b945060408701359350612707606088016124df565b9250608087013567ffffffffffffffff81111561272357600080fd5b61272f89828a016123fe565b979a9699509497509295939492505050565b6000806040838503121561275457600080fd5b823561275f816123d9565b9150602083013561276f816123d9565b809150509250929050565b6000806000806060858703121561279057600080fd5b843561279b816123d9565b93506127a9602086016124df565b9250604085013567ffffffffffffffff8111156127c557600080fd5b6127d1878288016123fe565b95989497509550505050565b6000602082840312156127ef57600080fd5b8151611cf3816123d9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561283b5761283b6127fa565b500390565b60008451612852818460208901612635565b80830190507f2e00000000000000000000000000000000000000000000000000000000000000808252855161288e816001850160208a01612635565b600192019182015283516128a9816002840160208801612635565b0160020195945050505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526128f56080830184612661565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600061292e6060830185612661565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff841681528260208201526060604082015260006129796060830184612661565b95945050505050565b828152604060208201526000611c4d6040830184612661565b600082198211156129ae576129ae6127fa565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612a0260c0830184612661565b98975050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a3f57612a3f6127fa565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612a8457612a84612a46565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082612ac757612ac7612a46565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612b0d57600080fd5b81518015158114611cf357600080fd5b60008251612b2f818460208701612635565b919091019291505056fea164736f6c634300080f000a",
-      "key": "0x26ac7e215c5b48eb9f6162a5e7022d185b54b55d6d706b30e2777e9c6e06d565"
-    },
-    "0xa051f227da1f5f1eecbfcdcd7316ce299a233760": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x4bed30661c4ccc61a7009910d1386ad6903216e2275b55589afb851dcb70c294",
-      "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35",
-      "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a",
-      "storage": {
-        "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "87658463f96977fc95a068f1a206d2c0cf2db575",
-        "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "36f4e85652236f9edaeba78bbe9d8c2b55ac5809"
-      },
-      "key": "0xd8522a36052aeae781dd8c38910969dc4f51b91541455ac64a0936b69d848e6e"
-    },
-    "0xa88b2060478401a52532814edde6819d101802e2": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x68f4106f36ca6cb79380dcf1851f76be5dca9c34a9223a82032ccbba38eeb51a",
-      "codeHash": "0x06643e7d44538ba353995b6b77634e1c5bd1282ae7902f2b1aceaec97cf572ed",
-      "code": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a",
-      "storage": {
-        "0x0000000000000000000000000000000000000000000000000000000000000000": "010000000000000000000000000000000000000000",
-        "0x00000000000000000000000000000000000000000000000000000000000000cc": "dead",
-        "0x929e83c085f29efb1559cc14f2ec57c3b2106bd7f88984815b0d4ac8b8226039": "7aeb97910d4070426c00e820de4137d6d2adf0ad",
-        "0xcb6a12cdb49191b07ddd0a0f9f72bd4f365631564b5953360881e2d7812dbde4": "4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"
-      },
-      "key": "0xdc2621e436cbec9ae124870f5ab25b65494a5accb952b75a94fda87636f6cd14"
-    },
-    "0xb8d5d0fa6e413b5de72c38a0a187731171b4f341": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x0ad3da5fea1ef359038ec861ffa336c2364bc170d36b136f0e8535f6cd29e283",
-      "codeHash": "0x3921774d36fd85d9e41c25a60635dfe0f0e5d2162afb93292db8bb80c81ece78",
-      "code": "0x60806040526004361061012c5760003560e01c80638c3152e9116100a5578063cff0ab9611610074578063e965084c11610059578063e965084c14610417578063e9e05c42146104a3578063f0498750146104b657600080fd5b8063cff0ab9614610356578063d53a822f146103f757600080fd5b80638c3152e9146102a05780639bf62d82146102c0578063a14238e7146102ed578063a35d99df1461031d57600080fd5b80635c975abb116100fc578063724c184c116100e1578063724c184c146102575780638456cb591461028b5780638b4c40b01461015157600080fd5b80635c975abb1461020d5780636dbffb781461023757600080fd5b80621c2ff6146101585780633f4ba83a146101b65780634870496f146101cb57806354fd4d50146101eb57600080fd5b36610153576101513334620186a06000604051806020016040528060008152506104ea565b005b600080fd5b34801561016457600080fd5b5061018c7f00000000000000000000000048204903b06a64e3c44b0260f875497ea5316a0281565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101c257600080fd5b50610151610785565b3480156101d757600080fd5b506101516101e6366004614bd2565b6108a8565b3480156101f757600080fd5b50610200610f0e565b6040516101ad9190614d28565b34801561021957600080fd5b506035546102279060ff1681565b60405190151581526020016101ad565b34801561024357600080fd5b50610227610252366004614d3b565b610fb1565b34801561026357600080fd5b5061018c7f000000000000000000000000bcd4042de499d14e55001ccbb24a551f3b95409681565b34801561029757600080fd5b50610151611088565b3480156102ac57600080fd5b506101516102bb366004614d54565b6111a8565b3480156102cc57600080fd5b5060325461018c9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102f957600080fd5b50610227610308366004614d3b565b60336020526000908152604090205460ff1681565b34801561032957600080fd5b5061033d610338366004614da1565b611a83565b60405167ffffffffffffffff90911681526020016101ad565b34801561036257600080fd5b506001546103be906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101ad565b34801561040357600080fd5b50610151610412366004614dcc565b611a9c565b34801561042357600080fd5b50610475610432366004614d3b565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101ad565b6101516104b1366004614de7565b6104ea565b3480156104c257600080fd5b5061018c7f00000000000000000000000073317009f4fadafcda357f3a082c7b68f5f8732f81565b8260005a905083156105a15773ffffffffffffffffffffffffffffffffffffffff8716156105a157604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b6105ab8351611a83565b67ffffffffffffffff168567ffffffffffffffff16101561064e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4f7074696d69736d506f7274616c3a20676173206c696d697420746f6f20736d60448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610598565b6201d4c0835111156106bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f7074696d69736d506f7274616c3a206461746120746f6f206c6172676500006044820152606401610598565b333281146106dd575033731111000000000000000000000000000000001111015b600034888888886040516020016106f8959493929190614e60565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516107689190614d28565b60405180910390a4505061077c8282611ca5565b50505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000bcd4042de499d14e55001ccbb24a551f3b954096161461084a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a206f6e6c7920677561726469616e20636160448201527f6e20756e706175736500000000000000000000000000000000000000000000006064820152608401610598565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b60355460ff1615610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a20706175736564000000000000000000006044820152606401610598565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e7472616374006064820152608401610598565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f00000000000000000000000048204903b06a64e3c44b0260f875497ea5316a0273ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614ee5565b519050610aa0610a9b36869003860186614f4a565b611fd2565b8114610b2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f6600000000000000000000000000000000000000000000006064820152608401610598565b6000610b398761202e565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c6b5750805160408083015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201527f00000000000000000000000048204903b06a64e3c44b0260f875497ea5316a0273ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c679190614ee5565b5114155b610cf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610598565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610dc09101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610db6888a614fb0565b8a6040013561205e565b610e4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610598565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6060610f397f0000000000000000000000000000000000000000000000000000000000000001612082565b610f627f0000000000000000000000000000000000000000000000000000000000000007612082565b610f8b7f0000000000000000000000000000000000000000000000000000000000000002612082565b604051602001610f9d93929190615034565b604051602081830303815290604052905090565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000906110829073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000048204903b06a64e3c44b0260f875497ea5316a02169063a25ae55790602401606060405180830381865afa158015611043573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110679190614ee5565b602001516fffffffffffffffffffffffffffffffff166121bf565b92915050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000bcd4042de499d14e55001ccbb24a551f3b954096161461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7074696d69736d506f7274616c3a206f6e6c7920677561726469616e20636160448201527f6e207061757365000000000000000000000000000000000000000000000000006064820152608401610598565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589060200161089e565b60355460ff1615611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a20706175736564000000000000000000006044820152606401610598565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead146112be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e006064820152608401610598565b60006112c98261202e565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff808216948301859052700100000000000000000000000000000000909104169181019190915292935090036113b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610598565b7f00000000000000000000000048204903b06a64e3c44b0260f875497ea5316a0273ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa15801561141f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144391906150aa565b81602001516fffffffffffffffffffffffffffffffff16101561150e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610598565b61152d81602001516fffffffffffffffffffffffffffffffff166121bf565b6115df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610598565b60408181015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201526000907f00000000000000000000000048204903b06a64e3c44b0260f875497ea5316a0273ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a89190614ee5565b8251815191925014611762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610598565b61178181602001516fffffffffffffffffffffffffffffffff166121bf565b611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610598565b60008381526033602052604090205460ff16156118d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610598565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a088015161197493929190612262565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906119d990841515815260200190565b60405180910390a2801580156119ef5750326001145b15611a7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a207769746864726177616c206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610598565b5050505050565b6000611a908260106150f2565b61108290615208615122565b600054610100900460ff1615808015611abc5750600054600160ff909116105b80611ad65750303b158015611ad6575060005460ff166001145b611b62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610598565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611bc057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055603580548315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116179055611c226122c0565b8015611c8557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611cdb907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361514e565b90506000611ce76123a3565b90506000816020015160ff16826000015163ffffffff16611d089190615194565b90508215611e3f57600154600090611d3f908390700100000000000000000000000000000000900467ffffffffffffffff166151fc565b90506000836040015160ff1683611d569190615270565b600154611d769084906fffffffffffffffffffffffffffffffff16615270565b611d809190615194565b600154909150600090611dd190611daa9084906fffffffffffffffffffffffffffffffff1661532c565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612469565b90506001861115611e0057611dfd611daa82876040015160ff1660018a611df8919061514e565b612488565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611e72908490700100000000000000000000000000000000900467ffffffffffffffff16615122565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611f55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d697400006064820152608401610598565b600154600090611f81906fffffffffffffffffffffffffffffffff1667ffffffffffffffff88166153a0565b90506000611f9348633b9aca006124dd565b611f9d90836153dd565b905060005a611fac908861514e565b905080821115611fc857611fc8611fc3828461514e565b6124f4565b5050505050505050565b60008160000151826020015183604001518460600151604051602001612011949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a088015193516000976120119790969591016153f1565b60008061206a86612522565b905061207881868686612554565b9695505050505050565b6060816000036120c557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120ef57806120d981615448565b91506120e89050600a836153dd565b91506120c9565b60008167ffffffffffffffff81111561210a5761210a6149f8565b6040519080825280601f01601f191660200182016040528015612134576020820181803683370190505b5090505b84156121b75761214960018361514e565b9150612156600a86615480565b612161906030615494565b60f81b818381518110612176576121766154ac565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506121b0600a866153dd565b9450612138565b949350505050565b60007f00000000000000000000000048204903b06a64e3c44b0260f875497ea5316a0273ffffffffffffffffffffffffffffffffffffffff1663f4daa2916040518163ffffffff1660e01b8152600401602060405180830381865afa15801561222c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225091906150aa565b61225a9083615494565b421192915050565b6000806000612272866000612584565b9050806122a8576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610598565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091527f00000000000000000000000073317009f4fadafcda357f3a082c7b68f5f8732f73ffffffffffffffffffffffffffffffffffffffff1663cc731b026040518163ffffffff1660e01b815260040160c060405180830381865afa158015612440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124649190615500565b905090565b600061247e61247885856125a2565b836125b2565b90505b9392505050565b6000670de0b6b3a76400006124c96124a08583615194565b6124b290670de0b6b3a76400006151fc565b6124c485670de0b6b3a7640000615270565b6125c1565b6124d39086615270565b61247e9190615194565b6000818310156124ed5781612481565b5090919050565b6000805a90505b825a612507908361514e565b101561251d5761251682615448565b91506124fb565b505050565b6060818051906020012060405160200161253e91815260200190565b6040516020818303038152906040529050919050565b600061257b846125658786866125f2565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156124ed5781612481565b60008183126124ed5781612481565b6000612481670de0b6b3a7640000836125d986613070565b6125e39190615270565b6125ed9190615194565b6132b4565b6060600084511161265f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610598565b600061266a846134f3565b90506000612677866135df565b905060008460405160200161268e91815260200190565b60405160208183030381529060405290506000805b8451811015612fe75760008582815181106126c0576126c06154ac565b60200260200101519050845183111561275b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610598565b8260000361281457805180516020918201206040516127a99261278392910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b61280f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610598565b61296b565b8051516020116128ca578051805160209182012060405161283e9261278392910190815260200190565b61280f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610598565b80518451602080870191909120825191909201201461296b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610598565b61297760106001615494565b81602001515103612b535784518303612aeb576129b181602001516010815181106129a4576129a46154ac565b6020026020010151613642565b96506000875111612a44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610598565b60018651612a52919061514e565b8214612ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610598565b505050505050612481565b6000858481518110612aff57612aff6154ac565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110612b2a57612b2a6154ac565b60200260200101519050612b3d816137a2565b9550612b4a600186615494565b94505050612fd4565b600281602001515103612f4c576000612b6b826137c7565b9050600081600081518110612b8257612b826154ac565b016020015160f81c90506000612b9960028361559f565b612ba49060026155c1565b90506000612bb5848360ff166137eb565b90506000612bc38a896137eb565b90506000612bd18383613821565b905080835114612c63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610598565b60ff851660021480612c78575060ff85166003145b15612e675780825114612d0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610598565b612d2787602001516001815181106129a4576129a46154ac565b9c5060008d5111612dba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610598565b60018c51612dc8919061514e565b8814612e56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610598565b505050505050505050505050612481565b60ff85161580612e7a575060ff85166001145b15612eb957612ea68760200151600181518110612e9957612e996154ac565b60200260200101516137a2565b9950612eb2818a615494565b9850612f41565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610598565b505050505050612fd4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610598565b5080612fdf81615448565b9150506126a3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610598565b60008082136130db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610598565b600060606130e8846138d5565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136132e557506000919050565b680755bf798b4a1bf1e58212613357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610598565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff811115613511576135116149f8565b60405190808252806020026020018201604052801561355657816020015b604080518082019091526060808252602082015281526020019060019003908161352f5790505b50915060005b818110156135d8576040518060400160405280858381518110613581576135816154ac565b602002602001015181526020016135b08684815181106135a3576135a36154ac565b60200260200101516139ab565b8152508382815181106135c5576135c56154ac565b602090810291909101015260010161355c565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613637578060011b82018184015160001a8060041c8253600f811660018301535050600101613609565b509295945050505050565b60606000806000613652856139be565b91945092509050600081600181111561366d5761366d6155e4565b146136fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610598565b6137048284615494565b855114613793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610598565b61257b8560200151848461442b565b606060208260000151106137be576137b982613642565b611082565b611082826144bf565b60606110826137e683602001516000815181106129a4576129a46154ac565b6135df565b60608251821061380a5750604080516020810190915260008152611082565b612481838384865161381c919061514e565b6144d5565b6000808251845110613834578251613837565b83515b90505b80821080156138be5750828281518110613856576138566154ac565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613895576138956154ac565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156138ce5781600101915061383a565b5092915050565b6000808211613940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610598565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60606110826139b9836146ad565b614796565b600080600080846000015111613a7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610598565b6020840151805160001a607f8111613aa1576000600160009450945094505050614424565b60b78111613caf576000613ab660808361514e565b905080876000015111613b71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610598565b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082141580613bea57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613c9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610598565b5060019550935060009250614424915050565b60bf8111613ffd576000613cc460b78361514e565b905080876000015111613d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610598565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613e5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610598565b600184015160088302610100031c60378111613f21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610598565b613f2b8184615494565b895111613fe0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610598565b613feb836001615494565b97509550600094506144249350505050565b60f781116140de57600061401260c08361514e565b9050808760000151116140cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610598565b600195509350849250614424915050565b60006140eb60f78361514e565b9050808760000151116141a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610598565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610598565b600184015160088302610100031c60378111614348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610598565b6143528184615494565b895111614407576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610598565b614412836001615494565b97509550600194506144249350505050565b9193909250565b60608167ffffffffffffffff811115614446576144466149f8565b6040519080825280601f01601f191660200182016040528015614470576020820181803683370190505b50905081156124815760006144858486615494565b90506020820160005b848110156144a657828101518282015260200161448e565b848111156144b5576000858301525b5050509392505050565b606061108282602001516000846000015161442b565b60608182601f011015614544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610598565b8282840110156145b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610598565b8183018451101561461d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610598565b60608215801561463c57604051915060008252602082016040526146a4565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561467557805183526020928301920161465d565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610598565b50604080518082019091528151815260209182019181019190915290565b606060008060006147a6856139be565b9194509250905060018160018111156147c1576147c16155e4565b1461484e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610598565b845161485a8385615494565b146148e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610598565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816148fe5790505093506000835b86518110156149ec576000806149716040518060400160405280858c60000151614955919061514e565b8152602001858c6020015161496a9190615494565b90526139be565b50915091506040518060400160405280838361498d9190615494565b8152602001848b602001516149a29190615494565b8152508885815181106149b7576149b76154ac565b60209081029190910101526149cd600185615494565b93506149d98183615494565b6149e39084615494565b9250505061492b565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614a6e57614a6e6149f8565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114614a9a57600080fd5b919050565b600082601f830112614ab057600080fd5b813567ffffffffffffffff811115614aca57614aca6149f8565b614afb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614a27565b818152846020838601011115614b1057600080fd5b816020850160208301376000918101602001919091529392505050565b600060c08284031215614b3f57600080fd5b60405160c0810167ffffffffffffffff8282108183111715614b6357614b636149f8565b8160405282935084358352614b7a60208601614a76565b6020840152614b8b60408601614a76565b6040840152606085013560608401526080850135608084015260a0850135915080821115614bb857600080fd5b50614bc585828601614a9f565b60a0830152505092915050565b600080600080600085870360e0811215614beb57600080fd5b863567ffffffffffffffff80821115614c0357600080fd5b614c0f8a838b01614b2d565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614c4857600080fd5b60408901955060c0890135925080831115614c6257600080fd5b828901925089601f840112614c7657600080fd5b8235915080821115614c8757600080fd5b508860208260051b8401011115614c9d57600080fd5b959894975092955050506020019190565b60005b83811015614cc9578181015183820152602001614cb1565b83811115614cd8576000848401525b50505050565b60008151808452614cf6816020860160208601614cae565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006124816020830184614cde565b600060208284031215614d4d57600080fd5b5035919050565b600060208284031215614d6657600080fd5b813567ffffffffffffffff811115614d7d57600080fd5b6121b784828501614b2d565b803567ffffffffffffffff81168114614a9a57600080fd5b600060208284031215614db357600080fd5b61248182614d89565b80358015158114614a9a57600080fd5b600060208284031215614dde57600080fd5b61248182614dbc565b600080600080600060a08688031215614dff57600080fd5b614e0886614a76565b945060208601359350614e1d60408701614d89565b9250614e2b60608701614dbc565b9150608086013567ffffffffffffffff811115614e4757600080fd5b614e5388828901614a9f565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614eb4816049850160208701614cae565b919091016049019695505050505050565b80516fffffffffffffffffffffffffffffffff81168114614a9a57600080fd5b600060608284031215614ef757600080fd5b6040516060810181811067ffffffffffffffff82111715614f1a57614f1a6149f8565b60405282518152614f2d60208401614ec5565b6020820152614f3e60408401614ec5565b60408201529392505050565b600060808284031215614f5c57600080fd5b6040516080810181811067ffffffffffffffff82111715614f7f57614f7f6149f8565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614fcb57614fcb6149f8565b8360051b6020614fdc818301614a27565b868152918501918181019036841115614ff457600080fd5b865b848110156150285780358681111561500e5760008081fd5b61501a36828b01614a9f565b845250918301918301614ff6565b50979650505050505050565b60008451615046818460208901614cae565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551615082816001850160208a01614cae565b6001920191820152835161509d816002840160208801614cae565b0160020195945050505050565b6000602082840312156150bc57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615615119576151196150c3565b02949350505050565b600067ffffffffffffffff808316818516808303821115615145576151456150c3565b01949350505050565b600082821015615160576151606150c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826151a3576151a3615165565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156151f7576151f76150c3565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615615236576152366150c3565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561526a5761526a6150c3565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156152b1576152b16150c3565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156152ec576152ec6150c3565b60008712925087820587128484161615615308576153086150c3565b8785058712818416161561531e5761531e6150c3565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615366576153666150c3565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561539a5761539a6150c3565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153d8576153d86150c3565b500290565b6000826153ec576153ec615165565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261543c60c0830184614cde565b98975050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615479576154796150c3565b5060010190565b60008261548f5761548f615165565b500690565b600082198211156154a7576154a76150c3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b805163ffffffff81168114614a9a57600080fd5b805160ff81168114614a9a57600080fd5b600060c0828403121561551257600080fd5b60405160c0810181811067ffffffffffffffff82111715615535576155356149f8565b604052615541836154db565b815261554f602084016154ef565b6020820152615560604084016154ef565b6040820152615571606084016154db565b6060820152615582608084016154db565b608082015261559360a08401614ec5565b60a08201529392505050565b600060ff8316806155b2576155b2615165565b8060ff84160691505092915050565b600060ff821660ff8416808210156155db576155db6150c3565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
-      "storage": {
-        "0x0000000000000000000000000000000000000000000000000000000000000000": "01",
-        "0x0000000000000000000000000000000000000000000000000000000000000001": "0300000000000000000000000000000000000000003b9aca00",
-        "0x0000000000000000000000000000000000000000000000000000000000000032": "dead",
-        "0x0000000000000000000000000000000000000000000000000000000000000035": "01"
-      },
-      "key": "0x212f20473e051f38a3e883e04c615db86c000c11b7afcc5d9736f30c2a634a78"
-    },
-    "0xcf1a8a7f273da1bd3112750cc3691b46c541e8b7": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0xa67b52462cb55b02cdc3b77317c72ba356565052daa741c56db173834086bf29",
-      "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35",
-      "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a",
-      "storage": {
-        "0x0000000000000000000000000000000000000000000000000000000000000000": "01",
-        "0x0000000000000000000000000000000000000000000000000000000000000001": "0500000000000000000000000000000000000000003b9aca00",
-        "0x0000000000000000000000000000000000000000000000000000000000000032": "dead",
-        "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "b8d5d0fa6e413b5de72c38a0a187731171b4f341",
-        "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "36f4e85652236f9edaeba78bbe9d8c2b55ac5809"
-      },
-      "key": "0x81f151b659eee15d57be7e42c54519f089683a2663c2d73e920317ec91831100"
-    },
-    "0xd16dba9f860146f08c9ee83b891c138667021ec9": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0xd71f41c241891e04095a92d2faafea7012de6d509ce9b855c4aad8523d3abe94",
-      "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35",
-      "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a",
-      "storage": {
-        "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "7ec3b539c97c98d503fb4fee3dd4ee885dc192cd",
-        "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "36f4e85652236f9edaeba78bbe9d8c2b55ac5809"
-      },
-      "key": "0x3c75634c38fdffac6bd90c0b6feb19aef829f6f952f8331c21b7694d21c185de"
-    },
-    "0xec466e9a46914507c484dcc5caba1db787e34913": {
-      "balance": "0x0",
-      "nonce": 1,
-      "root": "0x82c7f6f047f8e47468199468dab7c7bff9e01ed86ddf466e930363f12781776e",
-      "codeHash": "0x30dd4c41053621e6ecb9d600526b682dcce4370e8c206f016e2ad0ff4ea6b6c8",
-      "code": "0x608060405234801561001057600080fd5b50600436106101515760003560e01c8063b40a817c116100cd578063f2fde38b11610081578063f68016b711610066578063f68016b7146103f7578063f975e9251461040b578063ffa1ad741461041e57600080fd5b8063f2fde38b146103db578063f45e65d8146103ee57600080fd5b8063c9b26f61116100b2578063c9b26f611461028b578063cc731b021461029e578063e81b2c6d146103d257600080fd5b8063b40a817c14610265578063c71973f61461027857600080fd5b80634f16540b11610124578063715018a611610109578063715018a61461022c5780638da5cb5b14610234578063935f029e1461025257600080fd5b80634f16540b146101f057806354fd4d501461021757600080fd5b80630c18c1621461015657806318d13918146101725780631fd19ee1146101875780634add321d146101cf575b600080fd5b61015f60655481565b6040519081526020015b60405180910390f35b610185610180366004611307565b610426565b005b7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08545b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610169565b6101d76104ea565b60405167ffffffffffffffff9091168152602001610169565b61015f7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b61021f610515565b60405161016991906113a3565b6101856105b8565b60335473ffffffffffffffffffffffffffffffffffffffff166101aa565b6101856102603660046113b6565b6105cc565b6101856102733660046113f0565b610665565b610185610286366004611548565b610750565b610185610299366004611564565b610764565b6103626040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516101699190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61015f60675481565b6101856103e9366004611307565b610794565b61015f60665481565b6068546101d79067ffffffffffffffff1681565b61018561041936600461157d565b610848565b61015f600081565b61042e610afb565b610456817f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0855565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516104de91906113a3565b60405180910390a35050565b6069546000906105109063ffffffff6a010000000000000000000082048116911661161f565b905090565b60606105407f0000000000000000000000000000000000000000000000000000000000000001610b7c565b6105697f0000000000000000000000000000000000000000000000000000000000000003610b7c565b6105927f0000000000000000000000000000000000000000000000000000000000000001610b7c565b6040516020016105a49392919061164b565b604051602081830303815290604052905090565b6105c0610afb565b6105ca6000610cb9565b565b6105d4610afb565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161065891906113a3565b60405180910390a3505050565b61066d610afb565b6106756104ea565b67ffffffffffffffff168167ffffffffffffffff1610156106f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064015b60405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff831690811790915560408051602080820193909352815180820390930183528101905260026104ad565b610758610afb565b61076181610d30565b50565b61076c610afb565b60678190556040805160208082018490528251808303909101815290820190915260006104ad565b61079c610afb565b73ffffffffffffffffffffffffffffffffffffffff811661083f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106ee565b61076181610cb9565b600054610100900460ff16158080156108685750600054600160ff909116105b806108825750303b158015610882575060005460ff166001145b61090e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106ee565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561096c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109746111a4565b61097d88610794565b606587905560668690556067859055606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86161790557f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c088390556109ed82610d30565b6109f56104ea565b67ffffffffffffffff168467ffffffffffffffff161015610a72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016106ee565b8015610ad557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff1633146105ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ee565b606081600003610bbf57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610be95780610bd3816116c1565b9150610be29050600a83611728565b9150610bc3565b60008167ffffffffffffffff811115610c0457610c0461140b565b6040519080825280601f01601f191660200182016040528015610c2e576020820181803683370190505b5090505b8415610cb157610c4360018361173c565b9150610c50600a86611753565b610c5b906030611767565b60f81b818381518110610c7057610c7061177f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610caa600a86611728565b9450610c32565b949350505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115610de0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d61782062617365000000000000000000000060648201526084016106ee565b6001816040015160ff1611610e77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e2031000000000000000000000000000000000060648201526084016106ee565b6068546080820151825167ffffffffffffffff90921691610e9891906117ae565b63ffffffff161115610f06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016106ee565b6000816020015160ff1611610f9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f742062652030000000000000000000000000000000000060648201526084016106ee565b8051602082015163ffffffff82169160ff90911690610fbd9082906117cd565b610fc791906117f0565b63ffffffff161461105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d697400000000000000000060648201526084016106ee565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b600054610100900460ff1661123b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106ee565b6105ca600054610100900460ff166112d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106ee565b6105ca33610cb9565b803573ffffffffffffffffffffffffffffffffffffffff8116811461130257600080fd5b919050565b60006020828403121561131957600080fd5b611322826112de565b9392505050565b60005b8381101561134457818101518382015260200161132c565b83811115611353576000848401525b50505050565b60008151808452611371816020860160208601611329565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006113226020830184611359565b600080604083850312156113c957600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461130257600080fd5b60006020828403121561140257600080fd5b611322826113d8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b803563ffffffff8116811461130257600080fd5b803560ff8116811461130257600080fd5b80356fffffffffffffffffffffffffffffffff8116811461130257600080fd5b600060c0828403121561149157600080fd5b60405160c0810181811067ffffffffffffffff821117156114db577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806114ea8361143a565b81526114f86020840161144e565b60208201526115096040840161144e565b604082015261151a6060840161143a565b606082015261152b6080840161143a565b608082015261153c60a0840161145f565b60a08201525092915050565b600060c0828403121561155a57600080fd5b611322838361147f565b60006020828403121561157657600080fd5b5035919050565b6000806000806000806000610180888a03121561159957600080fd5b6115a2886112de565b96506020880135955060408801359450606088013593506115c5608089016113d8565b92506115d360a089016112de565b91506115e28960c08a0161147f565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff808316818516808303821115611642576116426115f0565b01949350505050565b6000845161165d818460208901611329565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611699816001850160208a01611329565b600192019182015283516116b4816002840160208801611329565b0160020195945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116f2576116f26115f0565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611737576117376116f9565b500490565b60008282101561174e5761174e6115f0565b500390565b600082611762576117626116f9565b500690565b6000821982111561177a5761177a6115f0565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff808316818516808303821115611642576116426115f0565b600063ffffffff808416806117e4576117e46116f9565b92169190910492915050565b600063ffffffff80831681851681830481118215151615611813576118136115f0565b0294935050505056fea164736f6c634300080f000a",
-      "storage": {
-        "0x0000000000000000000000000000000000000000000000000000000000000000": "01",
-        "0x0000000000000000000000000000000000000000000000000000000000000033": "bcd4042de499d14e55001ccbb24a551f3b954096",
-        "0x0000000000000000000000000000000000000000000000000000000000000065": "0834",
-        "0x0000000000000000000000000000000000000000000000000000000000000066": "0f4240",
-        "0x0000000000000000000000000000000000000000000000000000000000000067": "3c44cdddb6a900fa2b585dd299e03d12fa4293bc",
-        "0x0000000000000000000000000000000000000000000000000000000000000068": "01c9c380",
-        "0x0000000000000000000000000000000000000000000000000000000000000069": "ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00",
-        "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08": "9965507d1a55bcc2695c58ba16fb37d819b0a4dc"
-      },
-      "key": "0xb4791e53424376e737591737af96068778ec34c34df6df5bb044678dee3a2887"
-    }
-  }
-}
diff --git a/op-chain-ops/genesis/testdata/deploy.json b/op-chain-ops/genesis/testdata/deploy.json
deleted file mode 100644
index 79a80a68247e..000000000000
--- a/op-chain-ops/genesis/testdata/deploy.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "AddressManager": "0x7aeb97910d4070426C00e820De4137D6d2ADf0AD",
-  "L1CrossDomainMessenger": "0x4562938D6831437F37Dd1BF5BBb7fe7a5F080eac",
-  "L1CrossDomainMessengerProxy": "0xa88B2060478401a52532814eddE6819d101802E2",
-  "L1ERC721Bridge": "0x7eC3b539C97c98D503Fb4FeE3dd4ee885DC192cd",
-  "L1ERC721BridgeProxy": "0xD16dbA9f860146F08C9EE83B891c138667021eC9",
-  "L1StandardBridge": "0x9a7EcB1c67f88396D252725F3259e9d8027F1562",
-  "L1StandardBridgeProxy": "0x6fB1869D7141C97Cf28668fA0A338BDC892F53c0",
-  "L2OutputOracle": "0x7F325Df611b236EE3EF469Da4a74f776c787d1B3",
-  "L2OutputOracleProxy": "0x48204903b06a64e3c44B0260F875497EA5316A02",
-  "OptimismMintableERC20Factory": "0x87658463F96977Fc95a068F1A206D2C0CF2db575",
-  "OptimismMintableERC20FactoryProxy": "0xA051F227dA1f5F1eEcbfCdcd7316cE299A233760",
-  "OptimismPortal": "0xb8D5D0Fa6E413b5de72C38a0a187731171b4F341",
-  "OptimismPortalProxy": "0xCF1a8a7F273DA1bd3112750Cc3691B46C541e8B7",
-  "ProxyAdmin": "0x36F4e85652236f9EdAeba78bBE9d8C2B55Ac5809",
-  "SystemConfig": "0xEc466e9A46914507c484DCC5cabA1Db787e34913",
-  "SystemConfigProxy": "0x73317009F4FadAfcDA357F3a082C7B68F5f8732F"
-}
\ No newline at end of file
diff --git a/op-chain-ops/genesis/testdata/test-deploy-config-devnet-l1.json b/op-chain-ops/genesis/testdata/test-deploy-config-devnet-l1.json
deleted file mode 100644
index b1a11aee2948..000000000000
--- a/op-chain-ops/genesis/testdata/test-deploy-config-devnet-l1.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
-  "l1StartingBlockTag": "earliest",
-  "l1ChainID": 900,
-  "l2ChainID": 901,
-  "l2BlockTime": 2,
-
-  "maxSequencerDrift": 100,
-  "sequencerWindowSize": 4,
-  "channelTimeout": 40,
-  "p2pSequencerAddress": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc",
-  "batchInboxAddress": "0xff00000000000000000000000000000000000000",
-  "batchSenderAddress": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
-
-  "l2OutputOracleSubmissionInterval": 20,
-  "l2OutputOracleStartingBlockNumber": 0,
-  "l2OutputOracleStartingTimestamp": -1,
-  "l2OutputOracleProposer": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
-  "l2OutputOracleChallenger": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
-
-  "l1BlockTime": 15,
-  "cliqueSignerAddress": "0xca062b0fd91172d89bcd4bb084ac4e21972cc467",
-
-  "baseFeeVaultRecipient": "0xBcd4042DE499D14e55001CcbB24a551F3b954096",
-  "l1FeeVaultRecipient": "0x71bE63f3384f5fb98995898A86B02Fb2426c5788",
-  "sequencerFeeVaultRecipient": "0x71bE63f3384f5fb98995898A86B02Fb2426c5788",
-
-  "baseFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "l1FeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "sequencerFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "baseFeeVaultWithdrawalNetwork": "local",
-  "l1FeeVaultWithdrawalNetwork": "local",
-  "sequencerFeeVaultWithdrawalNetwork": "local",
-
-  "l1ERC721BridgeProxy": "0xff000000000000000000000000000000000000ff",
-  "l1StandardBridgeProxy": "0xff000000000000000000000000000000000000fd",
-  "l1CrossDomainMessengerProxy": "0xff000000000000000000000000000000000000dd",
-
-  "deploymentWaitConfirmations": 1,
-  "fundDevAccounts": true,
-
-  "enableGovernance": true,
-  "governanceTokenSymbol": "OP",
-  "governanceTokenName": "Optimism",
-  "governanceTokenOwner": "0x0000000000000000000000000000000000000333",
-
-  "l2GenesisRegolithTimeOffset": "0x0",
-  "l2GenesisCanyonTimeOffset": "0x0"
-}
diff --git a/op-chain-ops/genesis/testdata/test-deploy-config-full.json b/op-chain-ops/genesis/testdata/test-deploy-config-full.json
index 65390c661acc..c0aefac625ff 100644
--- a/op-chain-ops/genesis/testdata/test-deploy-config-full.json
+++ b/op-chain-ops/genesis/testdata/test-deploy-config-full.json
@@ -8,6 +8,7 @@
   "channelTimeout": 30,
   "l1UseClique": false,
   "cliqueSignerAddress": "0x0000000000000000000000000000000000000000",
+  "customGasTokenAddress": "0x0000000000000000000000000000000000000000",
   "p2pSequencerAddress": "0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc",
   "batchInboxAddress": "0x42000000000000000000000000000000000000ff",
   "batchSenderAddress": "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc",
@@ -54,6 +55,8 @@
   "systemConfigProxy": "0x4200000000000000000000000000000000000061",
   "optimismPortalProxy": "0x4200000000000000000000000000000000000062",
   "proxyAdminOwner": "0x0000000000000000000000000000000000000222",
+  "gasPriceOracleBaseFeeScalar": 0,
+  "gasPriceOracleBlobBaseFeeScalar": 0,
   "gasPriceOracleOverhead": 2100,
   "gasPriceOracleScalar": 1000000,
   "enableGovernance": true,
@@ -67,7 +70,8 @@
   "fundDevAccounts": true,
   "faultGameAbsolutePrestate": "0x0000000000000000000000000000000000000000000000000000000000000000",
   "faultGameMaxDepth": 63,
-  "faultGameMaxDuration": 604800,
+  "faultGameClockExtension": 10800,
+  "faultGameMaxClockDuration": 302400,
   "faultGameGenesisBlock": 0,
   "faultGameGenesisOutputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
   "faultGameSplitDepth": 0,
@@ -80,9 +84,11 @@
   "proofMaturityDelaySeconds": 12,
   "disputeGameFinalityDelaySeconds": 6,
   "respectedGameType": 0,
+  "useCustomGasToken": false,
   "useFaultProofs": false,
   "usePlasma": false,
   "daBondSize": 0,
+  "daCommitmentType": "KeccakCommtiment",
   "daChallengeProxy": "0x0000000000000000000000000000000000000000",
   "daChallengeWindow": 0,
   "daResolveWindow": 0,
diff --git a/op-chain-ops/immutables/immutables.go b/op-chain-ops/immutables/immutables.go
deleted file mode 100644
index ac945b77a337..000000000000
--- a/op-chain-ops/immutables/immutables.go
+++ /dev/null
@@ -1,247 +0,0 @@
-package immutables
-
-import (
-	"fmt"
-	"math/big"
-	"reflect"
-
-	"github.com/ethereum/go-ethereum/accounts/abi/bind"
-	"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/common/hexutil"
-	"github.com/ethereum/go-ethereum/core/types"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/deployer"
-)
-
-// PredeploysImmutableConfig represents the set of L2 predeploys. It includes all
-// L2 predeploys - not just ones with immutable values. This is to be very explicit
-// about the configuration of the predeploys. It is important that the inner struct
-// fields are in the same order as the constructor arguments in the solidity code.
-type PredeploysImmutableConfig struct {
-	L2ToL1MessagePasser    struct{}
-	DeployerWhitelist      struct{}
-	WETH9                  struct{}
-	L2CrossDomainMessenger struct{}
-	L2StandardBridge       struct{}
-	SequencerFeeVault      struct {
-		Recipient           common.Address
-		MinWithdrawalAmount *big.Int
-		WithdrawalNetwork   uint8
-	}
-	OptimismMintableERC20Factory  struct{}
-	L1BlockNumber                 struct{}
-	GasPriceOracle                struct{}
-	L1Block                       struct{}
-	GovernanceToken               struct{}
-	LegacyMessagePasser           struct{}
-	L2ERC721Bridge                struct{}
-	OptimismMintableERC721Factory struct {
-		Bridge        common.Address
-		RemoteChainId *big.Int
-	}
-	ProxyAdmin   struct{}
-	BaseFeeVault struct {
-		Recipient           common.Address
-		MinWithdrawalAmount *big.Int
-		WithdrawalNetwork   uint8
-	}
-	L1FeeVault struct {
-		Recipient           common.Address
-		MinWithdrawalAmount *big.Int
-		WithdrawalNetwork   uint8
-	}
-	SchemaRegistry struct{}
-	EAS            struct {
-		Name string
-	}
-	Create2Deployer              struct{}
-	MultiCall3                   struct{}
-	Safe_v130                    struct{}
-	SafeL2_v130                  struct{}
-	MultiSendCallOnly_v130       struct{}
-	SafeSingletonFactory         struct{}
-	DeterministicDeploymentProxy struct{}
-	MultiSend_v130               struct{}
-	Permit2                      struct{}
-	SenderCreator                struct{}
-	EntryPoint                   struct{}
-}
-
-// Check will ensure that the required fields are set on the config.
-// An error returned by `GetImmutableReferences` means that the solc compiler
-// output for the contract has no immutables in it.
-func (c *PredeploysImmutableConfig) Check() error {
-	return c.ForEach(func(name string, values any) error {
-		val := reflect.ValueOf(values)
-		if val.NumField() == 0 {
-			return nil
-		}
-
-		has, err := bindings.HasImmutableReferences(name)
-		exists := err == nil && has
-		isZero := val.IsZero()
-
-		// There are immutables defined in the solc output and
-		// the config is not empty.
-		if exists && !isZero {
-			return nil
-		}
-		// There are no immutables defined in the solc output and
-		// the config is empty
-		if !exists && isZero {
-			return nil
-		}
-
-		return fmt.Errorf("invalid immutables config: field %s: %w", name, err)
-	})
-}
-
-// ForEach will iterate over each of the fields in the config and call the callback
-// with the value of the field as well as the field's name.
-func (c *PredeploysImmutableConfig) ForEach(cb func(string, any) error) error {
-	val := reflect.ValueOf(c).Elem()
-	typ := val.Type()
-
-	for i := 0; i < val.NumField(); i++ {
-		field := val.Field(i)
-		internalVal := reflect.ValueOf(field.Interface())
-		if err := cb(typ.Field(i).Name, internalVal.Interface()); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// DeploymentResults represents the output of deploying each of the
-// contracts so that the immutables can be set properly in the bytecode.
-type DeploymentResults map[string]hexutil.Bytes
-
-// Deploy will deploy L2 predeploys that include immutables. This is to prevent the need
-// for parsing the solc output to find the correct immutable offsets and splicing in the values.
-// Skip any predeploys that do not have immutables as their bytecode will be directly inserted
-// into the state. This does not currently support recursive structs.
-func Deploy(config *PredeploysImmutableConfig) (DeploymentResults, error) {
-	if err := config.Check(); err != nil {
-		return DeploymentResults{}, err
-	}
-	deployments := make([]deployer.Constructor, 0)
-
-	val := reflect.ValueOf(config).Elem()
-	typ := val.Type()
-
-	for i := 0; i < val.NumField(); i++ {
-		field := val.Field(i)
-		if reflect.ValueOf(field.Interface()).IsZero() {
-			continue
-		}
-
-		deployment := deployer.Constructor{
-			Name: typ.Field(i).Name,
-			Args: []any{},
-		}
-
-		internalVal := reflect.ValueOf(field.Interface())
-		for j := 0; j < internalVal.NumField(); j++ {
-			internalField := internalVal.Field(j)
-			deployment.Args = append(deployment.Args, internalField.Interface())
-		}
-
-		deployments = append(deployments, deployment)
-	}
-
-	results, err := deployContractsWithImmutables(deployments)
-	if err != nil {
-		return nil, fmt.Errorf("cannot deploy contracts with immutables: %w", err)
-	}
-	return results, nil
-}
-
-// deployContractsWithImmutables will deploy contracts to a simulated backend so that their immutables
-// can be properly set. The bytecode returned in the results is suitable to be
-// inserted into the state via state surgery.
-func deployContractsWithImmutables(constructors []deployer.Constructor) (DeploymentResults, error) {
-	backend, err := deployer.NewL2Backend()
-	if err != nil {
-		return nil, err
-	}
-	deployments, err := deployer.Deploy(backend, constructors, l2ImmutableDeployer)
-	if err != nil {
-		return nil, err
-	}
-	results := make(DeploymentResults)
-	for _, dep := range deployments {
-		results[dep.Name] = dep.Bytecode
-	}
-	return results, nil
-}
-
-// l2ImmutableDeployer will deploy L2 predeploys that contain immutables to the simulated backend.
-// It only needs to care about the predeploys that have immutables so that the deployed bytecode
-// has the dynamic value set at the correct location in the bytecode.
-func l2ImmutableDeployer(backend *backends.SimulatedBackend, opts *bind.TransactOpts, deployment deployer.Constructor) (*types.Transaction, error) {
-	var tx *types.Transaction
-	var recipient common.Address
-	var minimumWithdrawalAmount *big.Int
-	var withdrawalNetwork uint8
-	var err error
-
-	if has, err := bindings.HasImmutableReferences(deployment.Name); err != nil || !has {
-		return nil, fmt.Errorf("%s does not have immutables: %w", deployment.Name, err)
-	}
-
-	switch deployment.Name {
-	case "SequencerFeeVault":
-		recipient, minimumWithdrawalAmount, withdrawalNetwork, err = prepareFeeVaultArguments(deployment)
-		if err != nil {
-			return nil, err
-		}
-		_, tx, _, err = bindings.DeploySequencerFeeVault(opts, backend, recipient, minimumWithdrawalAmount, withdrawalNetwork)
-	case "BaseFeeVault":
-		recipient, minimumWithdrawalAmount, withdrawalNetwork, err = prepareFeeVaultArguments(deployment)
-		if err != nil {
-			return nil, err
-		}
-		_, tx, _, err = bindings.DeployBaseFeeVault(opts, backend, recipient, minimumWithdrawalAmount, withdrawalNetwork)
-	case "L1FeeVault":
-		recipient, minimumWithdrawalAmount, withdrawalNetwork, err = prepareFeeVaultArguments(deployment)
-		if err != nil {
-			return nil, err
-		}
-		_, tx, _, err = bindings.DeployL1FeeVault(opts, backend, recipient, minimumWithdrawalAmount, withdrawalNetwork)
-	case "OptimismMintableERC721Factory":
-		bridge, ok := deployment.Args[0].(common.Address)
-		if !ok {
-			return nil, fmt.Errorf("invalid type for bridge")
-		}
-		remoteChainId, ok := deployment.Args[1].(*big.Int)
-		if !ok {
-			return nil, fmt.Errorf("invalid type for remoteChainId")
-		}
-		_, tx, _, err = bindings.DeployOptimismMintableERC721Factory(opts, backend, bridge, remoteChainId)
-	case "EAS":
-		_, tx, _, err = bindings.DeployEAS(opts, backend)
-	default:
-		return tx, fmt.Errorf("unknown contract: %s", deployment.Name)
-	}
-
-	return tx, err
-}
-
-// prepareFeeVaultArguments is a helper function that parses the arguments for the fee vault contracts.
-func prepareFeeVaultArguments(deployment deployer.Constructor) (common.Address, *big.Int, uint8, error) {
-	recipient, ok := deployment.Args[0].(common.Address)
-	if !ok {
-		return common.Address{}, nil, 0, fmt.Errorf("invalid type for recipient")
-	}
-	minimumWithdrawalAmountHex, ok := deployment.Args[1].(*big.Int)
-	if !ok {
-		return common.Address{}, nil, 0, fmt.Errorf("invalid type for minimumWithdrawalAmount")
-	}
-	withdrawalNetwork, ok := deployment.Args[2].(uint8)
-	if !ok {
-		return common.Address{}, nil, 0, fmt.Errorf("invalid type for withdrawalNetwork")
-	}
-	return recipient, minimumWithdrawalAmountHex, withdrawalNetwork, nil
-}
diff --git a/op-chain-ops/immutables/immutables_test.go b/op-chain-ops/immutables/immutables_test.go
deleted file mode 100644
index 37a5f99bcc5a..000000000000
--- a/op-chain-ops/immutables/immutables_test.go
+++ /dev/null
@@ -1,132 +0,0 @@
-package immutables_test
-
-import (
-	"math/big"
-	"reflect"
-	"testing"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/immutables"
-
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/stretchr/testify/require"
-)
-
-func TestBuildOptimism(t *testing.T) {
-	cfg := immutables.PredeploysImmutableConfig{
-		L2ToL1MessagePasser:    struct{}{},
-		DeployerWhitelist:      struct{}{},
-		WETH9:                  struct{}{},
-		L2CrossDomainMessenger: struct{}{},
-		L2StandardBridge:       struct{}{},
-		SequencerFeeVault: struct {
-			Recipient           common.Address
-			MinWithdrawalAmount *big.Int
-			WithdrawalNetwork   uint8
-		}{
-			Recipient:           common.HexToAddress("0x1234567890123456789012345678901234567890"),
-			MinWithdrawalAmount: big.NewInt(100),
-			WithdrawalNetwork:   0,
-		},
-		L1BlockNumber:       struct{}{},
-		GasPriceOracle:      struct{}{},
-		L1Block:             struct{}{},
-		GovernanceToken:     struct{}{},
-		LegacyMessagePasser: struct{}{},
-		L2ERC721Bridge:      struct{}{},
-		OptimismMintableERC721Factory: struct {
-			Bridge        common.Address
-			RemoteChainId *big.Int
-		}{
-			Bridge:        predeploys.L2StandardBridgeAddr,
-			RemoteChainId: big.NewInt(1),
-		},
-		OptimismMintableERC20Factory: struct{}{},
-		ProxyAdmin:                   struct{}{},
-		BaseFeeVault: struct {
-			Recipient           common.Address
-			MinWithdrawalAmount *big.Int
-			WithdrawalNetwork   uint8
-		}{
-			Recipient:           common.HexToAddress("0x1234567890123456789012345678901234567890"),
-			MinWithdrawalAmount: big.NewInt(200),
-			WithdrawalNetwork:   0,
-		},
-		L1FeeVault: struct {
-			Recipient           common.Address
-			MinWithdrawalAmount *big.Int
-			WithdrawalNetwork   uint8
-		}{
-			Recipient:           common.HexToAddress("0x1234567890123456789012345678901234567890"),
-			MinWithdrawalAmount: big.NewInt(200),
-			WithdrawalNetwork:   1,
-		},
-		SchemaRegistry: struct{}{},
-		EAS: struct{ Name string }{
-			Name: "EAS",
-		},
-		Create2Deployer:              struct{}{},
-		MultiCall3:                   struct{}{},
-		Safe_v130:                    struct{}{},
-		SafeL2_v130:                  struct{}{},
-		MultiSendCallOnly_v130:       struct{}{},
-		SafeSingletonFactory:         struct{}{},
-		DeterministicDeploymentProxy: struct{}{},
-		MultiSend_v130:               struct{}{},
-		Permit2:                      struct{}{},
-		SenderCreator:                struct{}{},
-		EntryPoint:                   struct{}{},
-	}
-
-	require.NoError(t, cfg.Check())
-	results, err := immutables.Deploy(&cfg)
-	require.NoError(t, err)
-	require.NotNil(t, results)
-
-	// Build a mapping of all of the predeploys
-	all := map[string]bool{}
-	// Build a mapping of the predeploys with immutable config
-	withConfig := map[string]bool{}
-
-	require.NoError(t, cfg.ForEach(func(name string, predeployConfig any) error {
-		all[name] = true
-
-		// If a predeploy has no config, it needs to have no immutable references in the solc output.
-		if reflect.ValueOf(predeployConfig).IsZero() {
-			ref, _ := bindings.HasImmutableReferences(name)
-			require.Zero(t, ref, "found immutable reference for %s", name)
-			return nil
-		}
-		withConfig[name] = true
-		return nil
-	}))
-
-	// Ensure that the PredeploysImmutableConfig is kept up to date
-	for name := range predeploys.Predeploys {
-		require.Truef(t, all[name], "predeploy %s not in set of predeploys", name)
-
-		ref, err := bindings.HasImmutableReferences(name)
-		// If there is predeploy config, there should be an immutable reference
-		if withConfig[name] {
-			require.NoErrorf(t, err, "error getting immutable reference for %s", name)
-			require.NotZerof(t, ref, "no immutable reference for %s", name)
-		} else {
-			require.Zero(t, ref, "found immutable reference for %s", name)
-		}
-	}
-
-	// Only the exact contracts that we care about are being modified
-	require.Equal(t, len(results), len(withConfig))
-
-	for name, bytecode := range results {
-		// There is bytecode there
-		require.Greater(t, len(bytecode), 0)
-		// It is in the set of contracts that we care about
-		require.Truef(t, withConfig[name], "contract %s not in set of contracts", name)
-		// The immutable reference is present
-		ref, err := bindings.HasImmutableReferences(name)
-		require.NoErrorf(t, err, "cannot get immutable reference for %s", name)
-		require.NotZerof(t, ref, "contract %s has no immutable reference", name)
-	}
-}
diff --git a/op-chain-ops/justfile b/op-chain-ops/justfile
new file mode 100644
index 000000000000..9775f535d227
--- /dev/null
+++ b/op-chain-ops/justfile
@@ -0,0 +1,25 @@
+abis := '../packages/contracts-bedrock/snapshots/abi'
+
+bindings-upgrades:
+  #!/usr/bin/env bash
+  set -euxo pipefail
+
+  build_abi() {
+    local lowercase=$(echo "$1" | awk '{print tolower($0)}')
+    abigen \
+      --abi "{{abis}}/$1.json" \
+      --pkg bindings \
+      --out "upgrades/bindings/$lowercase.go" \
+      --type $1
+  }
+
+  build_abi L1CrossDomainMessenger
+  build_abi L1ERC721Bridge
+  build_abi L1StandardBridge
+  build_abi L2OutputOracle
+  build_abi OptimismMintableERC20Factory
+  build_abi OptimismPortal
+  build_abi SystemConfig
+  #build_abi ISemver
+  build_abi ProxyAdmin
+  build_abi StorageSetter
diff --git a/op-chain-ops/safe/batch_test.go b/op-chain-ops/safe/batch_test.go
index b34654480f7e..e92019b1ed2b 100644
--- a/op-chain-ops/safe/batch_test.go
+++ b/op-chain-ops/safe/batch_test.go
@@ -8,7 +8,7 @@ import (
 	"os"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-chain-ops/upgrades/bindings"
 
 	"github.com/ethereum/go-ethereum/accounts/abi"
 	"github.com/ethereum/go-ethereum/common"
@@ -70,8 +70,8 @@ func TestBatchAddCallFinalizeWithdrawalTransaction(t *testing.T) {
 	require.JSONEq(t, string(expected), string(serialized))
 }
 
-// TestBatchAddCallDespostTransaction ensures that simple calls can be serialized correctly.
-func TestBatchAddCallDespositTransaction(t *testing.T) {
+// TestBatchAddCallDepositTransaction ensures that simple calls can be serialized correctly.
+func TestBatchAddCallDepositTransaction(t *testing.T) {
 	file, err := os.ReadFile("testdata/portal-abi.json")
 	require.NoError(t, err)
 	portalABI, err := abi.JSON(bytes.NewReader(file))
diff --git a/op-bindings/solc/types.go b/op-chain-ops/solc/types.go
similarity index 90%
rename from op-bindings/solc/types.go
rename to op-chain-ops/solc/types.go
index 13c6c9ecff49..de6edb90d231 100644
--- a/op-bindings/solc/types.go
+++ b/op-chain-ops/solc/types.go
@@ -83,12 +83,13 @@ type StorageLayoutEntry struct {
 }
 
 type StorageLayoutType struct {
-	Encoding      string `json:"encoding"`
-	Label         string `json:"label"`
-	NumberOfBytes uint   `json:"numberOfBytes,string"`
-	Key           string `json:"key,omitempty"`
-	Value         string `json:"value,omitempty"`
-	Base          string `json:"base,omitempty"`
+	Encoding      string               `json:"encoding"`
+	Label         string               `json:"label"`
+	NumberOfBytes uint                 `json:"numberOfBytes,string"`
+	Key           string               `json:"key,omitempty"`
+	Value         string               `json:"value,omitempty"`
+	Base          string               `json:"base,omitempty"`
+	Members       []StorageLayoutEntry `json:"members,omitempty"`
 }
 
 type CompilerOutputEvm struct {
diff --git a/op-chain-ops/squash/sim.go b/op-chain-ops/squash/sim.go
deleted file mode 100644
index ae612dbc0d4f..000000000000
--- a/op-chain-ops/squash/sim.go
+++ /dev/null
@@ -1,200 +0,0 @@
-package squash
-
-import (
-	"encoding/binary"
-	"fmt"
-	"math/big"
-
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/common/hexutil"
-	"github.com/ethereum/go-ethereum/consensus"
-	"github.com/ethereum/go-ethereum/consensus/ethash"
-	"github.com/ethereum/go-ethereum/core"
-	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/core/vm"
-	"github.com/ethereum/go-ethereum/params"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/state"
-)
-
-type staticChain struct {
-	startTime uint64
-	blockTime uint64
-}
-
-func (d *staticChain) Engine() consensus.Engine {
-	return ethash.NewFullFaker()
-}
-
-func (d *staticChain) GetHeader(h common.Hash, n uint64) *types.Header {
-	parentHash := common.Hash{0: 0xff}
-	binary.BigEndian.PutUint64(parentHash[1:], n-1)
-	return &types.Header{
-		ParentHash:      parentHash,
-		UncleHash:       types.EmptyUncleHash,
-		Coinbase:        common.Address{},
-		Root:            common.Hash{},
-		TxHash:          types.EmptyTxsHash,
-		ReceiptHash:     types.EmptyReceiptsHash,
-		Bloom:           types.Bloom{},
-		Difficulty:      big.NewInt(0),
-		Number:          new(big.Int).SetUint64(n),
-		GasLimit:        30_000_000,
-		GasUsed:         0,
-		Time:            d.startTime + n*d.blockTime,
-		Extra:           nil,
-		MixDigest:       common.Hash{},
-		Nonce:           types.BlockNonce{},
-		BaseFee:         big.NewInt(7),
-		WithdrawalsHash: &types.EmptyWithdrawalsHash,
-	}
-}
-
-type simState struct {
-	*state.MemoryStateDB
-	snapshotIndex  int
-	tempAccessList map[common.Address]map[common.Hash]struct{}
-}
-
-var _ vm.StateDB = (*simState)(nil)
-
-func (db *simState) AddressInAccessList(addr common.Address) bool {
-	_, ok := db.tempAccessList[addr]
-	return ok
-}
-
-func (db *simState) AddLog(log *types.Log) {
-	// no-op
-}
-
-func (db *simState) GetCommittedState(addr common.Address, hash common.Hash) common.Hash {
-	// return the latest state, instead of the pre-tx state.
-	acc, ok := db.Genesis().Alloc[addr]
-	if !ok {
-		return common.Hash{}
-	}
-	return acc.Storage[hash]
-}
-
-func (db *simState) AddSlotToAccessList(addr common.Address, slot common.Hash) {
-	// things like the fee-vault-address get marked as warm
-	m, ok := db.tempAccessList[addr]
-	if !ok {
-		m = make(map[common.Hash]struct{})
-		db.tempAccessList[addr] = m
-	}
-	m[slot] = struct{}{}
-}
-
-func (db *simState) SlotInAccessList(addr common.Address, slot common.Hash) (addressOk bool, slotOk bool) {
-	m, addressOk := db.tempAccessList[addr]
-	if !addressOk {
-		return false, false
-	}
-	_, slotOk = m[slot]
-	return true, slotOk
-}
-
-func (db *simState) GetRefund() uint64 {
-	return 0
-}
-
-func (db *simState) AddAddressToAccessList(addr common.Address) {
-	if _, ok := db.tempAccessList[addr]; !ok {
-		db.tempAccessList[addr] = make(map[common.Hash]struct{})
-	}
-}
-
-func (db *simState) RevertToSnapshot(int) {
-	panic("RevertToSnapshot not supported")
-}
-
-func (db *simState) Snapshot() int {
-	db.snapshotIndex += 1
-	return db.snapshotIndex
-}
-
-// SquashSim wraps an op-chain-ops MemporyStateDB,
-// and applies EVM-messages as if they all exist in the same infinite EVM block.
-// The result is squashing all the EVM execution changes into the state.
-type SquashSim struct {
-	chainConfig *params.ChainConfig
-	state       *simState
-	evm         *vm.EVM
-	signer      types.Signer
-}
-
-// AddMessage processes a message on top of the chain-state that is squashed into a genesis state allocation.
-func (sim *SquashSim) AddMessage(msg *core.Message) (res *core.ExecutionResult, err error) {
-	defer func() {
-		if rErr := recover(); rErr != nil {
-			err = fmt.Errorf("critical error: %v", rErr)
-		}
-	}()
-
-	// reset access-list
-	sim.state.tempAccessList = make(map[common.Address]map[common.Hash]struct{})
-
-	gp := new(core.GasPool)
-	gp.AddGas(30_000_000)
-
-	rules := sim.evm.ChainConfig().Rules(sim.evm.Context.BlockNumber, true, sim.evm.Context.Time)
-	sim.evm.StateDB.Prepare(rules, msg.From, predeploys.SequencerFeeVaultAddr, msg.To, vm.ActivePrecompiles(rules), msg.AccessList)
-	if !sim.state.Exist(msg.From) {
-		sim.state.CreateAccount(msg.From)
-	}
-	return core.ApplyMessage(sim.evm, msg, gp)
-}
-
-func (sim *SquashSim) BlockContext() *vm.BlockContext {
-	return &sim.evm.Context
-}
-
-// AddUpgradeTxs traverses a list of encoded deposit transactions.
-// These transactions should match what would be included in the live system upgrade.
-// The resulting state changes are squashed together, such that the final state can then be used as genesis state.
-func (sim *SquashSim) AddUpgradeTxs(txs []hexutil.Bytes) error {
-	for i, otx := range txs {
-		var tx types.Transaction
-		if err := tx.UnmarshalBinary(otx); err != nil {
-			return fmt.Errorf("failed to decode upgrade tx %d: %w", i, err)
-		}
-		msg, err := core.TransactionToMessage(&tx, sim.signer, sim.BlockContext().BaseFee)
-		if err != nil {
-			return fmt.Errorf("failed to turn upgrade tx %d into message: %w", i, err)
-		}
-		if !msg.IsDepositTx {
-			return fmt.Errorf("upgrade tx %d is not a depost", i)
-		}
-		if res, err := sim.AddMessage(msg); err != nil {
-			return fmt.Errorf("invalid upgrade tx %d, EVM invocation failed: %w", i, err)
-		} else {
-			if res.Err != nil {
-				return fmt.Errorf("failed to successfully execute upgrade tx %d: %w", i, err)
-			}
-		}
-	}
-	return nil
-}
-
-func NewSimulator(db *state.MemoryStateDB) *SquashSim {
-	offsetBlocks := uint64(0)
-	genesisTime := uint64(17_000_000)
-	blockTime := uint64(2)
-	bc := &staticChain{startTime: genesisTime, blockTime: blockTime}
-	header := bc.GetHeader(common.Hash{}, genesisTime+offsetBlocks)
-	chainCfg := db.Genesis().Config
-	blockContext := core.NewEVMBlockContext(header, bc, nil, chainCfg, db)
-	vmCfg := vm.Config{}
-	signer := types.LatestSigner(db.Genesis().Config)
-	simDB := &simState{MemoryStateDB: db}
-	env := vm.NewEVM(blockContext, vm.TxContext{}, simDB, chainCfg, vmCfg)
-
-	return &SquashSim{
-		chainConfig: chainCfg,
-		state:       simDB,
-		evm:         env,
-		signer:      signer,
-	}
-}
diff --git a/op-chain-ops/state/encoding.go b/op-chain-ops/state/encoding.go
deleted file mode 100644
index 041599bf4232..000000000000
--- a/op-chain-ops/state/encoding.go
+++ /dev/null
@@ -1,466 +0,0 @@
-package state
-
-import (
-	"errors"
-	"fmt"
-	"math/big"
-	"reflect"
-	"regexp"
-	"strings"
-
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/common/hexutil"
-	"github.com/ethereum/go-ethereum/crypto"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-	"github.com/ethereum-optimism/optimism/op-service/eth"
-)
-
-// EncodeStorageKeyValue encodes the key value pair that is stored in state
-// given a StorageLayoutEntry and StorageLayoutType. A single input may result
-// in multiple outputs. Unknown or unimplemented types will return an error.
-// Note that encoding uints is *not* overflow safe, so be sure to check
-// the ABI before setting very large values
-func EncodeStorageKeyValue(value any, entry solc.StorageLayoutEntry, storageType solc.StorageLayoutType) ([]*EncodedStorage, error) {
-	label := storageType.Label
-	encoded := make([]*EncodedStorage, 0)
-
-	key := encodeSlotKey(entry)
-	switch storageType.Encoding {
-	case "inplace":
-		switch label {
-		case "bool":
-			val, err := EncodeBoolValue(value, entry.Offset)
-			if err != nil {
-				return nil, fmt.Errorf("cannot encode %s: %w", storageType.Encoding, err)
-			}
-			encoded = append(encoded, &EncodedStorage{key, val})
-		case "address":
-			val, err := EncodeAddressValue(value, entry.Offset)
-			if err != nil {
-				return nil, fmt.Errorf("cannot encode %s: %w", storageType.Encoding, err)
-			}
-			encoded = append(encoded, &EncodedStorage{key, val})
-		case "bytes":
-			return nil, fmt.Errorf("%w: %s", errUnimplemented, label)
-		case "bytes32":
-			val, err := EncodeBytes32Value(value, entry.Offset)
-			if err != nil {
-				return nil, fmt.Errorf("cannot encode %s: %w", storageType.Encoding, err)
-			}
-			encoded = append(encoded, &EncodedStorage{key, val})
-		default:
-			switch true {
-			case strings.HasPrefix(label, "contract"):
-				val, err := EncodeAddressValue(value, entry.Offset)
-				if err != nil {
-					return nil, fmt.Errorf("cannot encode %s: %w", storageType.Encoding, err)
-				}
-				encoded = append(encoded, &EncodedStorage{key, val})
-			case strings.HasPrefix(label, "uint"):
-				val, err := EncodeUintValue(value, entry.Offset)
-				if err != nil {
-					return nil, fmt.Errorf("cannot encode %s: %w", storageType.Encoding, err)
-				}
-				encoded = append(encoded, &EncodedStorage{key, val})
-			default:
-				// structs are not supported
-				return nil, fmt.Errorf("cannot encode %s: %w", storageType.Encoding, errUnimplemented)
-			}
-		}
-	case "dynamic_array":
-	case "bytes":
-		switch label {
-		case "string":
-			val, err := EncodeStringValue(value, entry.Offset)
-			if err != nil {
-				return nil, fmt.Errorf("cannot encode %s: %w", storageType.Encoding, errUnimplemented)
-			}
-			encoded = append(encoded, &EncodedStorage{key, val})
-		default:
-			return nil, fmt.Errorf("%w: %s", errUnimplemented, label)
-		}
-	case "mapping":
-		if strings.HasPrefix(storageType.Value, "mapping") {
-			return nil, fmt.Errorf("%w: %s", errUnimplemented, "nested mappings")
-		}
-
-		values, ok := value.(map[any]any)
-		if !ok {
-			return nil, fmt.Errorf("mapping must be map[any]any")
-		}
-
-		keyEncoder, err := getElementEncoder(storageType, "key")
-		if err != nil {
-			return nil, err
-		}
-		valueEncoder, err := getElementEncoder(storageType, "value")
-		if err != nil {
-			return nil, err
-		}
-
-		// Mapping values have 0 offset
-		for rawKey, rawVal := range values {
-			encodedKey, err := keyEncoder(rawKey, 0)
-			if err != nil {
-				return nil, err
-			}
-
-			encodedSlot := encodeSlotKey(entry)
-
-			preimage := [64]byte{}
-			copy(preimage[0:32], encodedKey.Bytes())
-			copy(preimage[32:64], encodedSlot.Bytes())
-
-			hash := crypto.Keccak256(preimage[:])
-			key := common.BytesToHash(hash)
-
-			val, err := valueEncoder(rawVal, 0)
-			if err != nil {
-				return nil, err
-			}
-			encoded = append(encoded, &EncodedStorage{key, val})
-		}
-	default:
-		return nil, fmt.Errorf("unknown encoding %s: %w", storageType.Encoding, errUnimplemented)
-	}
-	return encoded, nil
-}
-
-// encodeSlotKey will encode the storage slot key. This does not
-// support mappings.
-func encodeSlotKey(entry solc.StorageLayoutEntry) common.Hash {
-	slot := new(big.Int).SetUint64(uint64(entry.Slot))
-	return common.BigToHash(slot)
-}
-
-// ElementEncoder is a function that can encode an element
-// based on a solidity type
-type ElementEncoder func(value any, offset uint) (common.Hash, error)
-
-// getElementEncoder will return the correct ElementEncoder
-// given a solidity type. The kind refers to the key or the value
-// when getting an encoder for a mapping. This is only useful
-// if the key itself is not populated for some reason.
-func getElementEncoder(storageType solc.StorageLayoutType, kind string) (ElementEncoder, error) {
-	var target string
-	if kind == "key" {
-		target = storageType.Key
-	} else if kind == "value" {
-		target = storageType.Value
-	} else {
-		return nil, fmt.Errorf("unknown storage %s", kind)
-	}
-
-	switch target {
-	case "t_address":
-		return EncodeAddressValue, nil
-	case "t_bool":
-		return EncodeBoolValue, nil
-	case "t_bytes32":
-		return EncodeBytes32Value, nil
-	default:
-		if strings.HasPrefix(target, "t_uint") {
-			return EncodeUintValue, nil
-		}
-	}
-
-	// Special case fallback if the target is empty, pull it
-	// from the label. This requires knowledge of whether we want
-	// the key or the value in the label.
-	if target == "" {
-		r := regexp.MustCompile(`mapping\((?P[[:alnum:]]*) => (?P[[:alnum:]]*)\)`)
-		result := r.FindStringSubmatch(storageType.Label)
-
-		for i, key := range r.SubexpNames() {
-			if kind == key {
-				res := "t_" + result[i]
-				layout := solc.StorageLayoutType{}
-				if kind == "key" {
-					layout.Key = res
-				} else if kind == "value" {
-					layout.Value = res
-				} else {
-					return nil, fmt.Errorf("unknown storage %s", kind)
-				}
-				return getElementEncoder(layout, kind)
-			}
-		}
-	}
-	return nil, fmt.Errorf("unsupported type: %s", target)
-}
-
-// EncodeBytes32Value will encode a bytes32 value. The offset
-// is included so that it can implement the ElementEncoder
-// interface, but the offset must always be 0.
-func EncodeBytes32Value(value any, offset uint) (common.Hash, error) {
-	if offset != 0 {
-		return common.Hash{}, errors.New("offset must be 0")
-	}
-	return encodeBytes32Value(value)
-}
-
-// encodeBytes32Value implements the encoding of a bytes32
-// value into a common.Hash that is suitable for storage.
-func encodeBytes32Value(value any) (common.Hash, error) {
-	name := reflect.TypeOf(value).Name()
-	switch name {
-	case "string":
-		str, ok := value.(string)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		val, err := hexutil.Decode(str)
-		if err != nil {
-			return common.Hash{}, err
-		}
-		return common.BytesToHash(val), nil
-	case "Hash":
-		hash, ok := value.(common.Hash)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		return hash, nil
-	default:
-		return common.Hash{}, errInvalidType
-	}
-}
-
-// EncodeStringValue will encode a string to a type suitable
-// for storage in state. The offset must be 0.
-func EncodeStringValue(value any, offset uint) (common.Hash, error) {
-	if offset != 0 {
-		return common.Hash{}, errors.New("offset must be 0")
-	}
-	return encodeStringValue(value)
-}
-
-// encodeStringValue implements the string encoding. Values larger
-// than 31 bytes are not supported because they will be stored
-// in multiple storage slots.
-func encodeStringValue(value any) (common.Hash, error) {
-	name := reflect.TypeOf(value).Name()
-
-	switch name {
-	case "string":
-		str, ok := value.(string)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-
-		data := []byte(str)
-		// Values that are 32 bytes or longer are not supported
-		if len(data) >= 32 {
-			return common.Hash{}, errors.New("string value too long")
-		}
-		// The data is right padded with 2 * the length
-		// of the data in the final byte
-		padded := common.RightPadBytes(data, 32)
-		padded[len(padded)-1] = byte(len(data) * 2)
-
-		return common.BytesToHash(padded), nil
-
-	default:
-		return common.Hash{}, errInvalidType
-	}
-}
-
-// EncodeBoolValue will encode a boolean value given a storage
-// offset.
-func EncodeBoolValue(value any, offset uint) (common.Hash, error) {
-	val, err := encodeBoolValue(value)
-	if err != nil {
-		return common.Hash{}, fmt.Errorf("invalid bool: %w", err)
-	}
-	return handleOffset(val, offset), nil
-}
-
-// encodeBoolValue will encode a boolean value into a type
-// suitable for solidity storage.
-func encodeBoolValue(value any) (common.Hash, error) {
-	name := reflect.TypeOf(value).Name()
-	switch name {
-	case "bool":
-		boolean, ok := value.(bool)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		if boolean {
-			return common.BigToHash(common.Big1), nil
-		} else {
-			return common.Hash{}, nil
-		}
-	case "string":
-		boolean, ok := value.(string)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		if boolean == "true" {
-			return common.BigToHash(common.Big1), nil
-		} else {
-			return common.Hash{}, nil
-		}
-	default:
-		return common.Hash{}, errInvalidType
-	}
-}
-
-// EncodeAddressValue will encode an address like value given a
-// storage offset.
-func EncodeAddressValue(value any, offset uint) (common.Hash, error) {
-	val, err := encodeAddressValue(value)
-	if err != nil {
-		return common.Hash{}, fmt.Errorf("invalid address: %w", err)
-	}
-	return handleOffset(val, offset), nil
-}
-
-// encodeAddressValue will encode an address value into
-// a type suitable for solidity storage.
-func encodeAddressValue(value any) (common.Hash, error) {
-	typ := reflect.TypeOf(value)
-	if typ.Kind() == reflect.Ptr {
-		typ = typ.Elem()
-	}
-
-	name := typ.Name()
-	switch name {
-	case "Address":
-		if reflect.TypeOf(value).Kind() == reflect.Ptr {
-			address, ok := value.(*common.Address)
-			if !ok {
-				return common.Hash{}, errInvalidType
-			}
-			return eth.AddressAsLeftPaddedHash(*address), nil
-		} else {
-			address, ok := value.(common.Address)
-			if !ok {
-				return common.Hash{}, errInvalidType
-			}
-			return eth.AddressAsLeftPaddedHash(address), nil
-		}
-	case "string":
-		address, ok := value.(string)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		return eth.AddressAsLeftPaddedHash(common.HexToAddress(address)), nil
-	default:
-		return common.Hash{}, errInvalidType
-	}
-}
-
-// EncodeUintValue will encode a uint value given a storage offset
-func EncodeUintValue(value any, offset uint) (common.Hash, error) {
-	val, err := encodeUintValue(value)
-	if err != nil {
-		return common.Hash{}, fmt.Errorf("invalid uint: %w", err)
-	}
-	return handleOffset(val, offset), nil
-}
-
-// encodeUintValue will encode a uint like type into a
-// type suitable for solidity storage.
-func encodeUintValue(value any) (common.Hash, error) {
-	val := reflect.ValueOf(value)
-
-	if val.Kind() == reflect.Ptr {
-		val = val.Elem()
-	}
-
-	name := val.Type().Name()
-	switch name {
-	case "uint":
-		val, ok := value.(uint)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		result := new(big.Int).SetUint64((uint64(val)))
-		return common.BigToHash(result), nil
-	case "int":
-		val, ok := value.(int)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		result := new(big.Int).SetUint64(uint64(val))
-		return common.BigToHash(result), nil
-	case "uint64":
-		val, ok := value.(uint64)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		result := new(big.Int).SetUint64(val)
-		return common.BigToHash(result), nil
-	case "uint32":
-		val, ok := value.(uint32)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		result := new(big.Int).SetUint64(uint64(val))
-		return common.BigToHash(result), nil
-	case "uint16":
-		val, ok := value.(uint16)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		result := new(big.Int).SetUint64(uint64(val))
-		return common.BigToHash(result), nil
-	case "uint8":
-		val, ok := value.(uint8)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		result := new(big.Int).SetUint64(uint64(val))
-		return common.BigToHash(result), nil
-	case "string":
-		val, ok := value.(string)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		number, err := hexutil.DecodeBig(val)
-		if err != nil {
-			if errors.Is(err, hexutil.ErrMissingPrefix) {
-				number, ok = new(big.Int).SetString(val, 10)
-				if !ok {
-					return common.Hash{}, errInvalidType
-				}
-			} else if errors.Is(err, hexutil.ErrLeadingZero) {
-				number, ok = new(big.Int).SetString(val[2:], 16)
-				if !ok {
-					return common.Hash{}, errInvalidType
-				}
-			}
-		}
-		return common.BigToHash(number), nil
-	case "bool":
-		val, ok := value.(bool)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		if val {
-			return common.Hash{31: 0x01}, nil
-		} else {
-			return common.Hash{}, nil
-		}
-	case "Int":
-		val, ok := value.(*big.Int)
-		if !ok {
-			return common.Hash{}, errInvalidType
-		}
-		return common.BigToHash(val), nil
-	default:
-		return common.Hash{}, errInvalidType
-	}
-}
-
-// handleOffset will offset a value in storage by shifting
-// it to the left. This is useful for when multiple variables
-// are tightly packed in a storage slot.
-func handleOffset(hash common.Hash, offset uint) common.Hash {
-	if offset == 0 {
-		return hash
-	}
-	number := hash.Big()
-	shifted := new(big.Int).Lsh(number, offset*8)
-	return common.BigToHash(shifted)
-}
diff --git a/op-chain-ops/state/memory_db.go b/op-chain-ops/state/memory_db.go
deleted file mode 100644
index 2e8c8470f839..000000000000
--- a/op-chain-ops/state/memory_db.go
+++ /dev/null
@@ -1,351 +0,0 @@
-package state
-
-import (
-	"bytes"
-	"fmt"
-	"math/big"
-	"sync"
-
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core"
-	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/core/vm"
-	"github.com/ethereum/go-ethereum/crypto"
-	"github.com/ethereum/go-ethereum/params"
-)
-
-var _ vm.StateDB = (*MemoryStateDB)(nil)
-
-var (
-	emptyCodeHash = crypto.Keccak256(nil)
-	zeroAddr      = common.Address{}
-)
-
-// MemoryStateDB implements geth's StateDB interface
-// but operates on a core.Genesis so that a genesis.json
-// can easily be created.
-type MemoryStateDB struct {
-	rw      sync.RWMutex
-	genesis *core.Genesis
-}
-
-func NewMemoryStateDB(genesis *core.Genesis) *MemoryStateDB {
-	if genesis == nil {
-		genesis = core.DeveloperGenesisBlock(15_000_000, &zeroAddr)
-	}
-
-	return &MemoryStateDB{
-		genesis: genesis,
-		rw:      sync.RWMutex{},
-	}
-}
-
-// Genesis is a getter for the underlying core.Genesis
-func (db *MemoryStateDB) Genesis() *core.Genesis {
-	return db.genesis
-}
-
-// GetAccount is a getter for a core.GenesisAccount found in
-// the core.Genesis
-func (db *MemoryStateDB) GetAccount(addr common.Address) *core.GenesisAccount {
-	db.rw.RLock()
-	defer db.rw.RUnlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		return nil
-	}
-	return &account
-}
-
-// StateDB interface implemented below
-
-func (db *MemoryStateDB) CreateAccount(addr common.Address) {
-	db.rw.Lock()
-	defer db.rw.Unlock()
-
-	db.createAccount(addr)
-}
-
-func (db *MemoryStateDB) createAccount(addr common.Address) {
-	if _, ok := db.genesis.Alloc[addr]; !ok {
-		db.genesis.Alloc[addr] = core.GenesisAccount{
-			Code:    []byte{},
-			Storage: make(map[common.Hash]common.Hash),
-			Balance: big.NewInt(0),
-			Nonce:   0,
-		}
-	}
-}
-
-func (db *MemoryStateDB) SubBalance(addr common.Address, amount *big.Int) {
-	db.rw.Lock()
-	defer db.rw.Unlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		panic(fmt.Sprintf("%s not in state", addr))
-	}
-	if account.Balance.Sign() == 0 {
-		return
-	}
-	account.Balance = new(big.Int).Sub(account.Balance, amount)
-	db.genesis.Alloc[addr] = account
-}
-
-func (db *MemoryStateDB) AddBalance(addr common.Address, amount *big.Int) {
-	db.rw.Lock()
-	defer db.rw.Unlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		panic(fmt.Sprintf("%s not in state", addr))
-	}
-	account.Balance = new(big.Int).Add(account.Balance, amount)
-	db.genesis.Alloc[addr] = account
-}
-
-func (db *MemoryStateDB) GetBalance(addr common.Address) *big.Int {
-	db.rw.RLock()
-	defer db.rw.RUnlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		return common.Big0
-	}
-	return account.Balance
-}
-
-func (db *MemoryStateDB) GetNonce(addr common.Address) uint64 {
-	db.rw.RLock()
-	defer db.rw.RUnlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		return 0
-	}
-	return account.Nonce
-}
-
-func (db *MemoryStateDB) SetNonce(addr common.Address, value uint64) {
-	db.rw.Lock()
-	defer db.rw.Unlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		return
-	}
-	account.Nonce = value
-	db.genesis.Alloc[addr] = account
-}
-
-func (db *MemoryStateDB) GetCodeHash(addr common.Address) common.Hash {
-	db.rw.RLock()
-	defer db.rw.RUnlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		return common.Hash{}
-	}
-	if len(account.Code) == 0 {
-		return common.BytesToHash(emptyCodeHash)
-	}
-	return common.BytesToHash(crypto.Keccak256(account.Code))
-}
-
-func (db *MemoryStateDB) GetCode(addr common.Address) []byte {
-	db.rw.RLock()
-	defer db.rw.RUnlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		return nil
-	}
-	if bytes.Equal(crypto.Keccak256(account.Code), emptyCodeHash) {
-		return nil
-	}
-	return account.Code
-}
-
-func (db *MemoryStateDB) SetCode(addr common.Address, code []byte) {
-	db.rw.Lock()
-	defer db.rw.Unlock()
-
-	db.createAccount(addr)
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		return
-	}
-	account.Code = code
-	db.genesis.Alloc[addr] = account
-}
-
-func (db *MemoryStateDB) GetCodeSize(addr common.Address) int {
-	db.rw.RLock()
-	defer db.rw.RUnlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		return 0
-	}
-	if bytes.Equal(crypto.Keccak256(account.Code), emptyCodeHash) {
-		return 0
-	}
-	return len(account.Code)
-}
-
-func (db *MemoryStateDB) AddRefund(uint64) {
-	panic("AddRefund unimplemented")
-}
-
-func (db *MemoryStateDB) SubRefund(uint64) {
-	panic("SubRefund unimplemented")
-}
-
-func (db *MemoryStateDB) GetRefund() uint64 {
-	panic("GetRefund unimplemented")
-}
-
-func (db *MemoryStateDB) GetCommittedState(common.Address, common.Hash) common.Hash {
-	panic("GetCommittedState unimplemented")
-}
-
-func (db *MemoryStateDB) GetState(addr common.Address, key common.Hash) common.Hash {
-	db.rw.RLock()
-	defer db.rw.RUnlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		return common.Hash{}
-	}
-	return account.Storage[key]
-}
-
-func (db *MemoryStateDB) SetState(addr common.Address, key, value common.Hash) {
-	db.rw.Lock()
-	defer db.rw.Unlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		panic(fmt.Sprintf("%s not in state", addr))
-	}
-	account.Storage[key] = value
-	db.genesis.Alloc[addr] = account
-}
-
-func (db *MemoryStateDB) DeleteState(addr common.Address, key common.Hash) {
-	db.rw.Lock()
-	defer db.rw.Unlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		panic(fmt.Sprintf("%s not in state", addr))
-	}
-	delete(account.Storage, key)
-	db.genesis.Alloc[addr] = account
-}
-
-func (db *MemoryStateDB) SelfDestruct(common.Address) {
-	panic("SelfDestruct unimplemented")
-}
-
-func (db *MemoryStateDB) HasSelfDestructed(common.Address) bool {
-	panic("HasSelfDestructed unimplemented")
-}
-
-func (db *MemoryStateDB) Selfdestruct6780(common.Address) {
-	panic("Selfdestruct6780 unimplemented")
-}
-
-// Exist reports whether the given account exists in state.
-// Notably this should also return true for suicided accounts.
-func (db *MemoryStateDB) Exist(addr common.Address) bool {
-	db.rw.RLock()
-	defer db.rw.RUnlock()
-
-	_, ok := db.genesis.Alloc[addr]
-	return ok
-}
-
-// Empty returns whether the given account is empty. Empty
-// is defined according to EIP161 (balance = nonce = code = 0).
-func (db *MemoryStateDB) Empty(addr common.Address) bool {
-	db.rw.RLock()
-	defer db.rw.RUnlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	isZeroNonce := account.Nonce == 0
-	isZeroValue := account.Balance.Sign() == 0
-	isEmptyCode := bytes.Equal(crypto.Keccak256(account.Code), emptyCodeHash)
-
-	return ok || (isZeroNonce && isZeroValue && isEmptyCode)
-}
-
-func (db *MemoryStateDB) PrepareAccessList(sender common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) {
-	panic("PrepareAccessList unimplemented")
-}
-
-func (db *MemoryStateDB) AddressInAccessList(addr common.Address) bool {
-	panic("AddressInAccessList unimplemented")
-}
-
-func (db *MemoryStateDB) SlotInAccessList(addr common.Address, slot common.Hash) (addressOk bool, slotOk bool) {
-	panic("SlotInAccessList unimplemented")
-}
-
-// AddAddressToAccessList adds the given address to the access list. This operation is safe to perform
-// even if the feature/fork is not active yet
-func (db *MemoryStateDB) AddAddressToAccessList(addr common.Address) {
-	panic("AddAddressToAccessList unimplemented")
-}
-
-// AddSlotToAccessList adds the given (address,slot) to the access list. This operation is safe to perform
-// even if the feature/fork is not active yet
-func (db *MemoryStateDB) AddSlotToAccessList(addr common.Address, slot common.Hash) {
-	panic("AddSlotToAccessList unimplemented")
-}
-
-func (db *MemoryStateDB) RevertToSnapshot(int) {
-	panic("RevertToSnapshot unimplemented")
-}
-
-func (db *MemoryStateDB) Snapshot() int {
-	panic("Snapshot unimplemented")
-}
-
-func (db *MemoryStateDB) AddLog(*types.Log) {
-	panic("AddLog unimplemented")
-}
-
-func (db *MemoryStateDB) AddPreimage(common.Hash, []byte) {
-	panic("AddPreimage unimplemented")
-}
-
-func (db *MemoryStateDB) ForEachStorage(addr common.Address, cb func(common.Hash, common.Hash) bool) error {
-	db.rw.RLock()
-	defer db.rw.RUnlock()
-
-	account, ok := db.genesis.Alloc[addr]
-	if !ok {
-		return nil
-	}
-	for key, value := range account.Storage {
-		if !cb(key, value) {
-			return nil
-		}
-	}
-	return nil
-}
-
-func (db *MemoryStateDB) GetTransientState(addr common.Address, key common.Hash) common.Hash {
-	panic("transient state is unsupported")
-}
-
-func (db *MemoryStateDB) SetTransientState(addr common.Address, key, value common.Hash) {
-	panic("transient state is unsupported")
-}
-
-func (db *MemoryStateDB) Prepare(rules params.Rules, sender, coinbase common.Address, dest *common.Address, precompiles []common.Address, txAccesses types.AccessList) {
-	// no-op, no transient state to prepare, nor any access-list to set/prepare
-}
diff --git a/op-chain-ops/state/memory_db_test.go b/op-chain-ops/state/memory_db_test.go
deleted file mode 100644
index 271a625a21f0..000000000000
--- a/op-chain-ops/state/memory_db_test.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package state_test
-
-import (
-	crand "crypto/rand"
-	"math/big"
-	"math/rand"
-	"testing"
-	"time"
-
-	"github.com/ethereum-optimism/optimism/op-chain-ops/state"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/crypto"
-	"github.com/stretchr/testify/require"
-)
-
-func TestAddBalance(t *testing.T) {
-	t.Parallel()
-
-	rng := rand.New(rand.NewSource(time.Now().UnixNano()))
-	db := state.NewMemoryStateDB(nil)
-
-	for i := 0; i < 100; i++ {
-		key, _ := crypto.GenerateKey()
-		addr := crypto.PubkeyToAddress(key.PublicKey)
-		value := new(big.Int).Rand(rng, big.NewInt(1000))
-
-		db.CreateAccount(addr)
-		db.AddBalance(addr, value)
-
-		account := db.GetAccount(addr)
-		require.NotNil(t, account)
-		require.True(t, BigEqual(account.Balance, value))
-	}
-}
-
-func TestCode(t *testing.T) {
-	t.Parallel()
-
-	db := state.NewMemoryStateDB(nil)
-
-	for i := 0; i < 100; i++ {
-		key, _ := crypto.GenerateKey()
-		addr := crypto.PubkeyToAddress(key.PublicKey)
-
-		db.CreateAccount(addr)
-
-		pre := db.GetCode(addr)
-		require.Nil(t, pre)
-
-		code := make([]byte, rand.Intn(1024))
-		_, err := crand.Read(code)
-		require.NoError(t, err)
-
-		db.SetCode(addr, code)
-
-		post := db.GetCode(addr)
-		if len(code) == 0 {
-			require.Nil(t, post)
-		} else {
-			require.Equal(t, post, code)
-		}
-
-		size := db.GetCodeSize(addr)
-		require.Equal(t, size, len(code))
-
-		codeHash := db.GetCodeHash(addr)
-		require.Equal(t, codeHash, common.BytesToHash(crypto.Keccak256(code)))
-	}
-}
-
-func BigEqual(a, b *big.Int) bool {
-	if a == nil || b == nil {
-		return a == b
-	} else {
-		return a.Cmp(b) == 0
-	}
-}
diff --git a/op-chain-ops/state/state.go b/op-chain-ops/state/state.go
deleted file mode 100644
index b3788081c0cf..000000000000
--- a/op-chain-ops/state/state.go
+++ /dev/null
@@ -1,125 +0,0 @@
-package state
-
-import (
-	"errors"
-	"fmt"
-	"math/big"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/vm"
-	"github.com/ethereum/go-ethereum/log"
-)
-
-var (
-	errInvalidType   = errors.New("invalid type")
-	errUnimplemented = errors.New("type unimplemented")
-)
-
-// StorageValues represents the values to be set in storage.
-// The key is the name of the storage variable and the value
-// is the value to set in storage.
-type StorageValues map[string]any
-
-// StorageConfig represents the storage configuration for the L2 predeploy
-// contracts.
-type StorageConfig map[string]StorageValues
-
-// EncodedStorage represents the storage key and value serialized
-// to be placed in Ethereum state.
-type EncodedStorage struct {
-	Key   common.Hash
-	Value common.Hash
-}
-
-// EncodeStorage will encode a storage layout
-func EncodeStorage(entry solc.StorageLayoutEntry, value any, storageType solc.StorageLayoutType) ([]*EncodedStorage, error) {
-	if storageType.NumberOfBytes > 32 {
-		return nil, fmt.Errorf("%s is larger than 32 bytes", storageType.Encoding)
-	}
-
-	encoded, err := EncodeStorageKeyValue(value, entry, storageType)
-	if err != nil {
-		return nil, err
-	}
-	return encoded, nil
-}
-
-// SetStorage will set the storage values in a db given a contract name,
-// address and the storage values
-func SetStorage(name string, address common.Address, values StorageValues, db vm.StateDB) error {
-	layout, err := bindings.GetStorageLayout(name)
-	if err != nil {
-		return fmt.Errorf("cannot set storage: %w", err)
-	}
-	slots, err := ComputeStorageSlots(layout, values)
-	if err != nil {
-		return fmt.Errorf("%s: %w", name, err)
-	}
-	for _, slot := range slots {
-		db.SetState(address, slot.Key, slot.Value)
-		log.Trace("setting storage", "address", address.Hex(), "key", slot.Key.Hex(), "value", slot.Value.Hex())
-	}
-	return nil
-}
-
-// ComputeStorageSlots will compute the storage slots for a given contract.
-func ComputeStorageSlots(layout *solc.StorageLayout, values StorageValues) ([]*EncodedStorage, error) {
-	encodedStorage := make([]*EncodedStorage, 0)
-
-	for label, value := range values {
-		var target solc.StorageLayoutEntry
-		for _, entry := range layout.Storage {
-			if label == entry.Label {
-				target = entry
-				break
-			}
-		}
-		if target.Label == "" {
-			return nil, fmt.Errorf("storage layout entry for %s not found", label)
-		}
-
-		storageType := layout.Types[target.Type]
-		if storageType.Label == "" {
-			return nil, fmt.Errorf("storage type for %s not found", label)
-
-		}
-
-		storage, err := EncodeStorage(target, value, storageType)
-		if err != nil {
-			return nil, fmt.Errorf("cannot encode storage for %s: %w", target.Label, err)
-		}
-
-		encodedStorage = append(encodedStorage, storage...)
-	}
-
-	results := MergeStorage(encodedStorage)
-
-	return results, nil
-}
-
-// MergeStorage will combine any overlapping storage slots for
-// when values are tightly packed. Do this by checking to see if any
-// of the produced storage slots have a matching key, if so use a
-// binary or to add the storage values together
-func MergeStorage(storage []*EncodedStorage) []*EncodedStorage {
-	encodedKV := make(map[common.Hash]common.Hash)
-	var encodedKeys []common.Hash // for deterministic result order
-	for _, storage := range storage {
-		if prev, ok := encodedKV[storage.Key]; ok {
-			combined := new(big.Int).Or(prev.Big(), storage.Value.Big())
-			encodedKV[storage.Key] = common.BigToHash(combined)
-		} else {
-			encodedKV[storage.Key] = storage.Value
-			encodedKeys = append(encodedKeys, storage.Key)
-		}
-	}
-
-	results := make([]*EncodedStorage, 0)
-	for _, key := range encodedKeys {
-		val := encodedKV[key]
-		results = append(results, &EncodedStorage{key, val})
-	}
-	return results
-}
diff --git a/op-chain-ops/state/state_test.go b/op-chain-ops/state/state_test.go
deleted file mode 100644
index f596d30276f0..000000000000
--- a/op-chain-ops/state/state_test.go
+++ /dev/null
@@ -1,475 +0,0 @@
-package state_test
-
-import (
-	"encoding/json"
-	"fmt"
-	"math/big"
-	"os"
-	"testing"
-
-	"github.com/ethereum/go-ethereum/accounts/abi/bind"
-	"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core"
-	"github.com/ethereum/go-ethereum/crypto"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/solc"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/state"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/state/testdata"
-
-	"github.com/stretchr/testify/require"
-)
-
-var (
-	// layout is the storage layout used in tests
-	layout solc.StorageLayout
-	// testKey is the same test key that geth uses
-	testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
-	// chainID is the chain id used for simulated backends
-	chainID = big.NewInt(1337)
-)
-
-// Read the test data from disk asap
-func init() {
-	data, err := os.ReadFile("./testdata/layout.json")
-	if err != nil {
-		panic("layout.json not found")
-
-	}
-	if err := json.Unmarshal(data, &layout); err != nil {
-		panic("cannot unmarshal storage layout")
-	}
-}
-
-func TestSetAndGetStorageSlots(t *testing.T) {
-	values := state.StorageValues{}
-	values["_uint256"] = new(big.Int).SetUint64(0xafff_ffff_ffff_ffff)
-	values["_address"] = common.HexToAddress("0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8")
-	values["_bool"] = true
-	values["offset0"] = uint8(0xaa)
-	values["offset1"] = uint8(0xbb)
-	values["offset2"] = uint16(0x0c0c)
-	values["offset3"] = uint32(0xf33d35)
-	values["offset4"] = uint64(0xd34dd34d00)
-	values["offset5"] = new(big.Int).SetUint64(0x43ad0043ad0043ad)
-	values["_bytes32"] = common.Hash{0xff}
-	values["_string"] = "foobar"
-
-	addresses := make(map[any]any)
-	addresses[big.NewInt(1)] = common.Address{19: 0xff}
-
-	values["addresses"] = addresses
-
-	slots, err := state.ComputeStorageSlots(&layout, values)
-	require.Nil(t, err)
-
-	backend := backends.NewSimulatedBackend(
-		core.GenesisAlloc{
-			crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(10000000000000000)},
-		},
-		15000000,
-	)
-	opts, err := bind.NewKeyedTransactorWithChainID(testKey, chainID)
-	require.Nil(t, err)
-
-	_, _, contract, err := testdata.DeployTestdata(opts, backend)
-	require.Nil(t, err)
-	backend.Commit()
-
-	// Call each of the methods to make sure that they are set to their 0 values
-	testContractStateValuesAreEmpty(t, contract)
-
-	// Send transactions through the set storage API on the contract
-	for _, slot := range slots {
-		_, err := contract.SetStorage(opts, slot.Key, slot.Value)
-		require.Nil(t, err)
-	}
-	backend.Commit()
-
-	testContractStateValuesAreSet(t, contract, values)
-
-	// Call the get storage API on the contract to double check
-	// that the storage slots have been set correctly
-	for _, slot := range slots {
-		value, err := contract.GetStorage(&bind.CallOpts{}, slot.Key)
-		require.Nil(t, err)
-		require.Equal(t, value[:], slot.Value.Bytes())
-	}
-}
-
-// Ensure that all the storage variables are set after setting storage
-// through the contract
-func testContractStateValuesAreSet(t *testing.T, contract *testdata.Testdata, values state.StorageValues) {
-OUTER:
-	for key, value := range values {
-		var res any
-		var err error
-		switch key {
-		case "_uint256":
-			res, err = contract.Uint256(&bind.CallOpts{})
-		case "_address":
-			res, err = contract.Address(&bind.CallOpts{})
-		case "_bool":
-			res, err = contract.Bool(&bind.CallOpts{})
-		case "offset0":
-			res, err = contract.Offset0(&bind.CallOpts{})
-		case "offset1":
-			res, err = contract.Offset1(&bind.CallOpts{})
-		case "offset2":
-			res, err = contract.Offset2(&bind.CallOpts{})
-		case "offset3":
-			res, err = contract.Offset3(&bind.CallOpts{})
-		case "offset4":
-			res, err = contract.Offset4(&bind.CallOpts{})
-		case "offset5":
-			res, err = contract.Offset5(&bind.CallOpts{})
-		case "_bytes32":
-			res, err = contract.Bytes32(&bind.CallOpts{})
-			result, ok := res.([32]uint8)
-			require.Equal(t, ok, true)
-			require.Nil(t, err)
-			require.Equal(t, common.BytesToHash(result[:]), value)
-			continue OUTER
-		case "_string":
-			res, err = contract.String(&bind.CallOpts{})
-		case "addresses":
-			addrs, ok := value.(map[any]any)
-			require.Equal(t, ok, true)
-			for mapKey, mapVal := range addrs {
-				res, err = contract.Addresses(&bind.CallOpts{}, mapKey.(*big.Int))
-				require.Nil(t, err)
-				require.Equal(t, mapVal, res)
-				continue OUTER
-			}
-		default:
-			require.Fail(t, fmt.Sprintf("Unknown variable label: %s", key))
-		}
-		require.Nil(t, err)
-		require.Equal(t, res, value)
-	}
-}
-
-func testContractStateValuesAreEmpty(t *testing.T, contract *testdata.Testdata) {
-	addr, err := contract.Address(&bind.CallOpts{})
-	require.Nil(t, err)
-	require.Equal(t, addr, common.Address{})
-
-	boolean, err := contract.Bool(&bind.CallOpts{})
-	require.Nil(t, err)
-	require.Equal(t, boolean, false)
-
-	uint256, err := contract.Uint256(&bind.CallOpts{})
-	require.Nil(t, err)
-	require.Equal(t, uint256.Uint64(), uint64(0))
-
-	offset0, err := contract.Offset0(&bind.CallOpts{})
-	require.Nil(t, err)
-	require.Equal(t, offset0, uint8(0))
-
-	offset1, err := contract.Offset1(&bind.CallOpts{})
-	require.Nil(t, err)
-	require.Equal(t, offset1, uint8(0))
-
-	offset2, err := contract.Offset2(&bind.CallOpts{})
-	require.Nil(t, err)
-	require.Equal(t, offset2, uint16(0))
-
-	offset3, err := contract.Offset3(&bind.CallOpts{})
-	require.Nil(t, err)
-	require.Equal(t, offset3, uint32(0))
-
-	offset4, err := contract.Offset4(&bind.CallOpts{})
-	require.Nil(t, err)
-	require.Equal(t, offset4, uint64(0))
-
-	offset5, err := contract.Offset5(&bind.CallOpts{})
-	require.Nil(t, err)
-	require.Equal(t, offset5.Uint64(), uint64(0))
-
-	bytes32, err := contract.Bytes32(&bind.CallOpts{})
-	require.Nil(t, err)
-	require.Equal(t, common.BytesToHash(bytes32[:]), common.Hash{})
-}
-
-func TestMergeStorage(t *testing.T) {
-	cases := []struct {
-		input  []*state.EncodedStorage
-		expect []*state.EncodedStorage
-	}{
-		{
-			// One input should be the same result
-			input: []*state.EncodedStorage{
-				{
-					Key:   common.Hash{},
-					Value: common.Hash{},
-				},
-			},
-			expect: []*state.EncodedStorage{
-				{
-					Key:   common.Hash{},
-					Value: common.Hash{},
-				},
-			},
-		},
-		{
-			// Two duplicate inputs should be merged
-			input: []*state.EncodedStorage{
-				{
-					Key:   common.Hash{1},
-					Value: common.Hash{},
-				},
-				{
-					Key:   common.Hash{1},
-					Value: common.Hash{},
-				},
-			},
-			expect: []*state.EncodedStorage{
-				{
-					Key:   common.Hash{1},
-					Value: common.Hash{},
-				},
-			},
-		},
-		{
-			// Two different inputs should be the same result
-			input: []*state.EncodedStorage{
-				{
-					Key:   common.Hash{1},
-					Value: common.Hash{},
-				},
-				{
-					Key:   common.Hash{2},
-					Value: common.Hash{},
-				},
-			},
-			expect: []*state.EncodedStorage{
-				{
-					Key:   common.Hash{1},
-					Value: common.Hash{},
-				},
-				{
-					Key:   common.Hash{2},
-					Value: common.Hash{},
-				},
-			},
-		},
-		{
-			// Two matching keys should be merged bitwise
-			input: []*state.EncodedStorage{
-				{
-					Key:   common.Hash{},
-					Value: common.Hash{0x00, 0x01},
-				},
-				{
-					Key:   common.Hash{},
-					Value: common.Hash{0x02, 0x00},
-				},
-			},
-			expect: []*state.EncodedStorage{
-				{
-					Key:   common.Hash{},
-					Value: common.Hash{0x02, 0x01},
-				},
-			},
-		},
-	}
-
-	for _, test := range cases {
-		got := state.MergeStorage(test.input)
-		require.Equal(t, test.expect, got)
-	}
-}
-
-func TestEncodeUintValue(t *testing.T) {
-	cases := []struct {
-		number any
-		offset uint
-		expect common.Hash
-	}{
-		{
-			number: 0,
-			offset: 0,
-			expect: common.Hash{},
-		},
-		{
-			number: big.NewInt(1),
-			offset: 0,
-			expect: common.Hash{31: 0x01},
-		},
-		{
-			number: uint64(2),
-			offset: 0,
-			expect: common.Hash{31: 0x02},
-		},
-		{
-			number: uint8(3),
-			offset: 0,
-			expect: common.Hash{31: 0x03},
-		},
-		{
-			number: uint16(4),
-			offset: 0,
-			expect: common.Hash{31: 0x04},
-		},
-		{
-			number: uint32(5),
-			offset: 0,
-			expect: common.Hash{31: 0x05},
-		},
-		{
-			number: int(6),
-			offset: 0,
-			expect: common.Hash{31: 0x06},
-		},
-		{
-			number: 1,
-			offset: 1,
-			expect: common.Hash{30: 0x01},
-		},
-		{
-			number: 1,
-			offset: 10,
-			expect: common.Hash{21: 0x01},
-		},
-	}
-
-	for _, test := range cases {
-		got, err := state.EncodeUintValue(test.number, test.offset)
-		require.Nil(t, err)
-		require.Equal(t, got, test.expect)
-	}
-}
-
-func TestEncodeBoolValue(t *testing.T) {
-	cases := []struct {
-		boolean any
-		offset  uint
-		expect  common.Hash
-	}{
-		{
-			boolean: true,
-			offset:  0,
-			expect:  common.Hash{31: 0x01},
-		},
-		{
-			boolean: false,
-			offset:  0,
-			expect:  common.Hash{},
-		},
-		{
-			boolean: true,
-			offset:  1,
-			expect:  common.Hash{30: 0x01},
-		},
-		{
-			boolean: false,
-			offset:  1,
-			expect:  common.Hash{},
-		},
-		{
-			boolean: "true",
-			offset:  0,
-			expect:  common.Hash{31: 0x01},
-		},
-		{
-			boolean: "false",
-			offset:  0,
-			expect:  common.Hash{},
-		},
-	}
-
-	for _, test := range cases {
-		got, err := state.EncodeBoolValue(test.boolean, test.offset)
-		require.Nil(t, err)
-		require.Equal(t, got, test.expect)
-	}
-}
-
-func TestEncodeAddressValue(t *testing.T) {
-	cases := []struct {
-		addr   any
-		offset uint
-		expect common.Hash
-	}{
-		{
-			addr:   common.Address{},
-			offset: 0,
-			expect: common.Hash{},
-		},
-		{
-			addr:   common.Address{0x01},
-			offset: 0,
-			expect: common.Hash{12: 0x01},
-		},
-		{
-			addr:   "0x829BD824B016326A401d083B33D092293333A830",
-			offset: 0,
-			expect: common.HexToHash("0x829BD824B016326A401d083B33D092293333A830"),
-		},
-		{
-			addr:   common.Address{19: 0x01},
-			offset: 1,
-			expect: common.Hash{30: 0x01},
-		},
-		{
-			addr:   &common.Address{},
-			offset: 0,
-			expect: common.Hash{},
-		},
-	}
-
-	for _, test := range cases {
-		got, err := state.EncodeAddressValue(test.addr, test.offset)
-		require.Nil(t, err)
-		require.Equal(t, got, test.expect)
-	}
-}
-
-func TestEncodeBytes32Value(t *testing.T) {
-	cases := []struct {
-		bytes32 any
-		expect  common.Hash
-	}{
-		{
-			bytes32: common.Hash{0xff},
-			expect:  common.Hash{0xff},
-		},
-		{
-			bytes32: "0x11ffffff00000000000000000000000000000000000000000000000000000000",
-			expect:  common.HexToHash("0x11ffffff00000000000000000000000000000000000000000000000000000000"),
-		},
-	}
-
-	for _, test := range cases {
-		got, err := state.EncodeBytes32Value(test.bytes32, 0)
-		require.Nil(t, err)
-		require.Equal(t, got, test.expect)
-	}
-}
-
-func TestEncodeStringValue(t *testing.T) {
-	cases := []struct {
-		str    any
-		expect common.Hash
-	}{
-		{
-			str:    "foo",
-			expect: common.Hash{0x66, 0x6f, 0x6f, 31: 6},
-		},
-		// Taken from mainnet WETH at 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-		{
-			str:    "Wrapped Ether",
-			expect: common.HexToHash("0x577261707065642045746865720000000000000000000000000000000000001a"),
-		},
-		{
-			str:    "WETH",
-			expect: common.HexToHash("0x5745544800000000000000000000000000000000000000000000000000000008"),
-		},
-	}
-
-	for _, test := range cases {
-		got, err := state.EncodeStringValue(test.str, 0)
-		require.Nil(t, err)
-		require.Equal(t, got, test.expect)
-	}
-}
diff --git a/op-chain-ops/state/testdata/contract.go b/op-chain-ops/state/testdata/contract.go
deleted file mode 100644
index 8c526591b794..000000000000
--- a/op-chain-ops/state/testdata/contract.go
+++ /dev/null
@@ -1,626 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package testdata
-
-import (
-	"errors"
-	"math/big"
-	"strings"
-
-	ethereum "github.com/ethereum/go-ethereum"
-	"github.com/ethereum/go-ethereum/accounts/abi"
-	"github.com/ethereum/go-ethereum/accounts/abi/bind"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/event"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var (
-	_ = errors.New
-	_ = big.NewInt
-	_ = strings.NewReader
-	_ = ethereum.NotFound
-	_ = bind.Bind
-	_ = common.Big1
-	_ = types.BloomLookup
-	_ = event.NewSubscription
-)
-
-// TestdataMetaData contains all meta data concerning the Testdata contract.
-var TestdataMetaData = &bind.MetaData{
-	ABI: "[{\"inputs\":[],\"name\":\"_address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_bool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_bytes32\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_string\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"_uint256\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"addresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"getStorage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"offset0\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"offset1\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"offset2\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"offset3\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"offset4\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"offset5\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
-	Bin: "0x608060405234801561001057600080fd5b50610415806100206000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80635e0068591161008c5780639b267f09116100665780639b267f09146102285780639e6ba9c21461023d578063a753307d1461025a578063edf26d9b1461028757600080fd5b80635e0068591461020257806393f2b3981461020b5780639b0b0fda1461021457600080fd5b806332da25e1116100c857806332da25e114610150578063350e81cc146101895780634ba664e7146101b0578063502a6c5e146101d057600080fd5b8063099ea180146100ef57806309f395f11461011357806318bad21714610125575b600080fd5b6004546100fc9060ff1681565b60405160ff90911681526020015b60405180910390f35b6004546100fc90610100900460ff1681565b600054610138906001600160a01b031681565b6040516001600160a01b03909116815260200161010a565b6004546101709068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161010a565b60045461019d9062010000900461ffff1681565b60405161ffff909116815260200161010a565b6101c26101be36600461033e565b5490565b60405190815260200161010a565b6004546101ea90600160801b90046001600160801b031681565b6040516001600160801b03909116815260200161010a565b6101c260035481565b6101c260055481565b610226610222366004610357565b9055565b005b6102306102b0565b60405161010a9190610379565b60025461024a9060ff1681565b604051901515815260200161010a565b60045461027290640100000000900463ffffffff1681565b60405163ffffffff909116815260200161010a565b61013861029536600461033e565b6001602052600090815260409020546001600160a01b031681565b600680546102bd906103ce565b80601f01602080910402602001604051908101604052809291908181526020018280546102e9906103ce565b80156103365780601f1061030b57610100808354040283529160200191610336565b820191906000526020600020905b81548152906001019060200180831161031957829003601f168201915b505050505081565b60006020828403121561035057600080fd5b5035919050565b6000806040838503121561036a57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b818110156103a65785810183015185820160400152820161038a565b818111156103b8576000604083870101525b50601f01601f1916929092016040019392505050565b600181811c908216806103e257607f821691505b60208210810361040257634e487b7160e01b600052602260045260246000fd5b5091905056fea164736f6c634300080f000a",
-}
-
-// TestdataABI is the input ABI used to generate the binding from.
-// Deprecated: Use TestdataMetaData.ABI instead.
-var TestdataABI = TestdataMetaData.ABI
-
-// TestdataBin is the compiled bytecode used for deploying new contracts.
-// Deprecated: Use TestdataMetaData.Bin instead.
-var TestdataBin = TestdataMetaData.Bin
-
-// DeployTestdata deploys a new Ethereum contract, binding an instance of Testdata to it.
-func DeployTestdata(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Testdata, error) {
-	parsed, err := TestdataMetaData.GetAbi()
-	if err != nil {
-		return common.Address{}, nil, nil, err
-	}
-	if parsed == nil {
-		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
-	}
-
-	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(TestdataBin), backend)
-	if err != nil {
-		return common.Address{}, nil, nil, err
-	}
-	return address, tx, &Testdata{TestdataCaller: TestdataCaller{contract: contract}, TestdataTransactor: TestdataTransactor{contract: contract}, TestdataFilterer: TestdataFilterer{contract: contract}}, nil
-}
-
-// Testdata is an auto generated Go binding around an Ethereum contract.
-type Testdata struct {
-	TestdataCaller     // Read-only binding to the contract
-	TestdataTransactor // Write-only binding to the contract
-	TestdataFilterer   // Log filterer for contract events
-}
-
-// TestdataCaller is an auto generated read-only Go binding around an Ethereum contract.
-type TestdataCaller struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// TestdataTransactor is an auto generated write-only Go binding around an Ethereum contract.
-type TestdataTransactor struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// TestdataFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
-type TestdataFilterer struct {
-	contract *bind.BoundContract // Generic contract wrapper for the low level calls
-}
-
-// TestdataSession is an auto generated Go binding around an Ethereum contract,
-// with pre-set call and transact options.
-type TestdataSession struct {
-	Contract     *Testdata         // Generic contract binding to set the session for
-	CallOpts     bind.CallOpts     // Call options to use throughout this session
-	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
-}
-
-// TestdataCallerSession is an auto generated read-only Go binding around an Ethereum contract,
-// with pre-set call options.
-type TestdataCallerSession struct {
-	Contract *TestdataCaller // Generic contract caller binding to set the session for
-	CallOpts bind.CallOpts   // Call options to use throughout this session
-}
-
-// TestdataTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
-// with pre-set transact options.
-type TestdataTransactorSession struct {
-	Contract     *TestdataTransactor // Generic contract transactor binding to set the session for
-	TransactOpts bind.TransactOpts   // Transaction auth options to use throughout this session
-}
-
-// TestdataRaw is an auto generated low-level Go binding around an Ethereum contract.
-type TestdataRaw struct {
-	Contract *Testdata // Generic contract binding to access the raw methods on
-}
-
-// TestdataCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
-type TestdataCallerRaw struct {
-	Contract *TestdataCaller // Generic read-only contract binding to access the raw methods on
-}
-
-// TestdataTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
-type TestdataTransactorRaw struct {
-	Contract *TestdataTransactor // Generic write-only contract binding to access the raw methods on
-}
-
-// NewTestdata creates a new instance of Testdata, bound to a specific deployed contract.
-func NewTestdata(address common.Address, backend bind.ContractBackend) (*Testdata, error) {
-	contract, err := bindTestdata(address, backend, backend, backend)
-	if err != nil {
-		return nil, err
-	}
-	return &Testdata{TestdataCaller: TestdataCaller{contract: contract}, TestdataTransactor: TestdataTransactor{contract: contract}, TestdataFilterer: TestdataFilterer{contract: contract}}, nil
-}
-
-// NewTestdataCaller creates a new read-only instance of Testdata, bound to a specific deployed contract.
-func NewTestdataCaller(address common.Address, caller bind.ContractCaller) (*TestdataCaller, error) {
-	contract, err := bindTestdata(address, caller, nil, nil)
-	if err != nil {
-		return nil, err
-	}
-	return &TestdataCaller{contract: contract}, nil
-}
-
-// NewTestdataTransactor creates a new write-only instance of Testdata, bound to a specific deployed contract.
-func NewTestdataTransactor(address common.Address, transactor bind.ContractTransactor) (*TestdataTransactor, error) {
-	contract, err := bindTestdata(address, nil, transactor, nil)
-	if err != nil {
-		return nil, err
-	}
-	return &TestdataTransactor{contract: contract}, nil
-}
-
-// NewTestdataFilterer creates a new log filterer instance of Testdata, bound to a specific deployed contract.
-func NewTestdataFilterer(address common.Address, filterer bind.ContractFilterer) (*TestdataFilterer, error) {
-	contract, err := bindTestdata(address, nil, nil, filterer)
-	if err != nil {
-		return nil, err
-	}
-	return &TestdataFilterer{contract: contract}, nil
-}
-
-// bindTestdata binds a generic wrapper to an already deployed contract.
-func bindTestdata(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
-	parsed, err := abi.JSON(strings.NewReader(TestdataABI))
-	if err != nil {
-		return nil, err
-	}
-	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_Testdata *TestdataRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
-	return _Testdata.Contract.TestdataCaller.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_Testdata *TestdataRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
-	return _Testdata.Contract.TestdataTransactor.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_Testdata *TestdataRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
-	return _Testdata.Contract.TestdataTransactor.contract.Transact(opts, method, params...)
-}
-
-// Call invokes the (constant) contract method with params as input values and
-// sets the output to result. The result type might be a single field for simple
-// returns, a slice of interfaces for anonymous returns and a struct for named
-// returns.
-func (_Testdata *TestdataCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
-	return _Testdata.Contract.contract.Call(opts, result, method, params...)
-}
-
-// Transfer initiates a plain transaction to move funds to the contract, calling
-// its default method if one is available.
-func (_Testdata *TestdataTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
-	return _Testdata.Contract.contract.Transfer(opts)
-}
-
-// Transact invokes the (paid) contract method with params as input values.
-func (_Testdata *TestdataTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
-	return _Testdata.Contract.contract.Transact(opts, method, params...)
-}
-
-// Address is a free data retrieval call binding the contract method 0x18bad217.
-//
-// Solidity: function _address() view returns(address)
-func (_Testdata *TestdataCaller) Address(opts *bind.CallOpts) (common.Address, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "_address")
-
-	if err != nil {
-		return *new(common.Address), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
-	return out0, err
-
-}
-
-// Address is a free data retrieval call binding the contract method 0x18bad217.
-//
-// Solidity: function _address() view returns(address)
-func (_Testdata *TestdataSession) Address() (common.Address, error) {
-	return _Testdata.Contract.Address(&_Testdata.CallOpts)
-}
-
-// Address is a free data retrieval call binding the contract method 0x18bad217.
-//
-// Solidity: function _address() view returns(address)
-func (_Testdata *TestdataCallerSession) Address() (common.Address, error) {
-	return _Testdata.Contract.Address(&_Testdata.CallOpts)
-}
-
-// Bool is a free data retrieval call binding the contract method 0x9e6ba9c2.
-//
-// Solidity: function _bool() view returns(bool)
-func (_Testdata *TestdataCaller) Bool(opts *bind.CallOpts) (bool, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "_bool")
-
-	if err != nil {
-		return *new(bool), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
-
-	return out0, err
-
-}
-
-// Bool is a free data retrieval call binding the contract method 0x9e6ba9c2.
-//
-// Solidity: function _bool() view returns(bool)
-func (_Testdata *TestdataSession) Bool() (bool, error) {
-	return _Testdata.Contract.Bool(&_Testdata.CallOpts)
-}
-
-// Bool is a free data retrieval call binding the contract method 0x9e6ba9c2.
-//
-// Solidity: function _bool() view returns(bool)
-func (_Testdata *TestdataCallerSession) Bool() (bool, error) {
-	return _Testdata.Contract.Bool(&_Testdata.CallOpts)
-}
-
-// Bytes32 is a free data retrieval call binding the contract method 0x93f2b398.
-//
-// Solidity: function _bytes32() view returns(bytes32)
-func (_Testdata *TestdataCaller) Bytes32(opts *bind.CallOpts) ([32]byte, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "_bytes32")
-
-	if err != nil {
-		return *new([32]byte), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
-
-	return out0, err
-
-}
-
-// Bytes32 is a free data retrieval call binding the contract method 0x93f2b398.
-//
-// Solidity: function _bytes32() view returns(bytes32)
-func (_Testdata *TestdataSession) Bytes32() ([32]byte, error) {
-	return _Testdata.Contract.Bytes32(&_Testdata.CallOpts)
-}
-
-// Bytes32 is a free data retrieval call binding the contract method 0x93f2b398.
-//
-// Solidity: function _bytes32() view returns(bytes32)
-func (_Testdata *TestdataCallerSession) Bytes32() ([32]byte, error) {
-	return _Testdata.Contract.Bytes32(&_Testdata.CallOpts)
-}
-
-// String is a free data retrieval call binding the contract method 0x9b267f09.
-//
-// Solidity: function _string() view returns(string)
-func (_Testdata *TestdataCaller) String(opts *bind.CallOpts) (string, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "_string")
-
-	if err != nil {
-		return *new(string), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(string)).(*string)
-
-	return out0, err
-
-}
-
-// String is a free data retrieval call binding the contract method 0x9b267f09.
-//
-// Solidity: function _string() view returns(string)
-func (_Testdata *TestdataSession) String() (string, error) {
-	return _Testdata.Contract.String(&_Testdata.CallOpts)
-}
-
-// String is a free data retrieval call binding the contract method 0x9b267f09.
-//
-// Solidity: function _string() view returns(string)
-func (_Testdata *TestdataCallerSession) String() (string, error) {
-	return _Testdata.Contract.String(&_Testdata.CallOpts)
-}
-
-// Uint256 is a free data retrieval call binding the contract method 0x5e006859.
-//
-// Solidity: function _uint256() view returns(uint256)
-func (_Testdata *TestdataCaller) Uint256(opts *bind.CallOpts) (*big.Int, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "_uint256")
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// Uint256 is a free data retrieval call binding the contract method 0x5e006859.
-//
-// Solidity: function _uint256() view returns(uint256)
-func (_Testdata *TestdataSession) Uint256() (*big.Int, error) {
-	return _Testdata.Contract.Uint256(&_Testdata.CallOpts)
-}
-
-// Uint256 is a free data retrieval call binding the contract method 0x5e006859.
-//
-// Solidity: function _uint256() view returns(uint256)
-func (_Testdata *TestdataCallerSession) Uint256() (*big.Int, error) {
-	return _Testdata.Contract.Uint256(&_Testdata.CallOpts)
-}
-
-// Addresses is a free data retrieval call binding the contract method 0xedf26d9b.
-//
-// Solidity: function addresses(uint256 ) view returns(address)
-func (_Testdata *TestdataCaller) Addresses(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "addresses", arg0)
-
-	if err != nil {
-		return *new(common.Address), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
-	return out0, err
-
-}
-
-// Addresses is a free data retrieval call binding the contract method 0xedf26d9b.
-//
-// Solidity: function addresses(uint256 ) view returns(address)
-func (_Testdata *TestdataSession) Addresses(arg0 *big.Int) (common.Address, error) {
-	return _Testdata.Contract.Addresses(&_Testdata.CallOpts, arg0)
-}
-
-// Addresses is a free data retrieval call binding the contract method 0xedf26d9b.
-//
-// Solidity: function addresses(uint256 ) view returns(address)
-func (_Testdata *TestdataCallerSession) Addresses(arg0 *big.Int) (common.Address, error) {
-	return _Testdata.Contract.Addresses(&_Testdata.CallOpts, arg0)
-}
-
-// GetStorage is a free data retrieval call binding the contract method 0x4ba664e7.
-//
-// Solidity: function getStorage(bytes32 key) view returns(bytes32)
-func (_Testdata *TestdataCaller) GetStorage(opts *bind.CallOpts, key [32]byte) ([32]byte, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "getStorage", key)
-
-	if err != nil {
-		return *new([32]byte), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
-
-	return out0, err
-
-}
-
-// GetStorage is a free data retrieval call binding the contract method 0x4ba664e7.
-//
-// Solidity: function getStorage(bytes32 key) view returns(bytes32)
-func (_Testdata *TestdataSession) GetStorage(key [32]byte) ([32]byte, error) {
-	return _Testdata.Contract.GetStorage(&_Testdata.CallOpts, key)
-}
-
-// GetStorage is a free data retrieval call binding the contract method 0x4ba664e7.
-//
-// Solidity: function getStorage(bytes32 key) view returns(bytes32)
-func (_Testdata *TestdataCallerSession) GetStorage(key [32]byte) ([32]byte, error) {
-	return _Testdata.Contract.GetStorage(&_Testdata.CallOpts, key)
-}
-
-// Offset0 is a free data retrieval call binding the contract method 0x099ea180.
-//
-// Solidity: function offset0() view returns(uint8)
-func (_Testdata *TestdataCaller) Offset0(opts *bind.CallOpts) (uint8, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "offset0")
-
-	if err != nil {
-		return *new(uint8), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
-
-	return out0, err
-
-}
-
-// Offset0 is a free data retrieval call binding the contract method 0x099ea180.
-//
-// Solidity: function offset0() view returns(uint8)
-func (_Testdata *TestdataSession) Offset0() (uint8, error) {
-	return _Testdata.Contract.Offset0(&_Testdata.CallOpts)
-}
-
-// Offset0 is a free data retrieval call binding the contract method 0x099ea180.
-//
-// Solidity: function offset0() view returns(uint8)
-func (_Testdata *TestdataCallerSession) Offset0() (uint8, error) {
-	return _Testdata.Contract.Offset0(&_Testdata.CallOpts)
-}
-
-// Offset1 is a free data retrieval call binding the contract method 0x09f395f1.
-//
-// Solidity: function offset1() view returns(uint8)
-func (_Testdata *TestdataCaller) Offset1(opts *bind.CallOpts) (uint8, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "offset1")
-
-	if err != nil {
-		return *new(uint8), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
-
-	return out0, err
-
-}
-
-// Offset1 is a free data retrieval call binding the contract method 0x09f395f1.
-//
-// Solidity: function offset1() view returns(uint8)
-func (_Testdata *TestdataSession) Offset1() (uint8, error) {
-	return _Testdata.Contract.Offset1(&_Testdata.CallOpts)
-}
-
-// Offset1 is a free data retrieval call binding the contract method 0x09f395f1.
-//
-// Solidity: function offset1() view returns(uint8)
-func (_Testdata *TestdataCallerSession) Offset1() (uint8, error) {
-	return _Testdata.Contract.Offset1(&_Testdata.CallOpts)
-}
-
-// Offset2 is a free data retrieval call binding the contract method 0x350e81cc.
-//
-// Solidity: function offset2() view returns(uint16)
-func (_Testdata *TestdataCaller) Offset2(opts *bind.CallOpts) (uint16, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "offset2")
-
-	if err != nil {
-		return *new(uint16), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
-
-	return out0, err
-
-}
-
-// Offset2 is a free data retrieval call binding the contract method 0x350e81cc.
-//
-// Solidity: function offset2() view returns(uint16)
-func (_Testdata *TestdataSession) Offset2() (uint16, error) {
-	return _Testdata.Contract.Offset2(&_Testdata.CallOpts)
-}
-
-// Offset2 is a free data retrieval call binding the contract method 0x350e81cc.
-//
-// Solidity: function offset2() view returns(uint16)
-func (_Testdata *TestdataCallerSession) Offset2() (uint16, error) {
-	return _Testdata.Contract.Offset2(&_Testdata.CallOpts)
-}
-
-// Offset3 is a free data retrieval call binding the contract method 0xa753307d.
-//
-// Solidity: function offset3() view returns(uint32)
-func (_Testdata *TestdataCaller) Offset3(opts *bind.CallOpts) (uint32, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "offset3")
-
-	if err != nil {
-		return *new(uint32), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
-
-	return out0, err
-
-}
-
-// Offset3 is a free data retrieval call binding the contract method 0xa753307d.
-//
-// Solidity: function offset3() view returns(uint32)
-func (_Testdata *TestdataSession) Offset3() (uint32, error) {
-	return _Testdata.Contract.Offset3(&_Testdata.CallOpts)
-}
-
-// Offset3 is a free data retrieval call binding the contract method 0xa753307d.
-//
-// Solidity: function offset3() view returns(uint32)
-func (_Testdata *TestdataCallerSession) Offset3() (uint32, error) {
-	return _Testdata.Contract.Offset3(&_Testdata.CallOpts)
-}
-
-// Offset4 is a free data retrieval call binding the contract method 0x32da25e1.
-//
-// Solidity: function offset4() view returns(uint64)
-func (_Testdata *TestdataCaller) Offset4(opts *bind.CallOpts) (uint64, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "offset4")
-
-	if err != nil {
-		return *new(uint64), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
-
-	return out0, err
-
-}
-
-// Offset4 is a free data retrieval call binding the contract method 0x32da25e1.
-//
-// Solidity: function offset4() view returns(uint64)
-func (_Testdata *TestdataSession) Offset4() (uint64, error) {
-	return _Testdata.Contract.Offset4(&_Testdata.CallOpts)
-}
-
-// Offset4 is a free data retrieval call binding the contract method 0x32da25e1.
-//
-// Solidity: function offset4() view returns(uint64)
-func (_Testdata *TestdataCallerSession) Offset4() (uint64, error) {
-	return _Testdata.Contract.Offset4(&_Testdata.CallOpts)
-}
-
-// Offset5 is a free data retrieval call binding the contract method 0x502a6c5e.
-//
-// Solidity: function offset5() view returns(uint128)
-func (_Testdata *TestdataCaller) Offset5(opts *bind.CallOpts) (*big.Int, error) {
-	var out []interface{}
-	err := _Testdata.contract.Call(opts, &out, "offset5")
-
-	if err != nil {
-		return *new(*big.Int), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
-	return out0, err
-
-}
-
-// Offset5 is a free data retrieval call binding the contract method 0x502a6c5e.
-//
-// Solidity: function offset5() view returns(uint128)
-func (_Testdata *TestdataSession) Offset5() (*big.Int, error) {
-	return _Testdata.Contract.Offset5(&_Testdata.CallOpts)
-}
-
-// Offset5 is a free data retrieval call binding the contract method 0x502a6c5e.
-//
-// Solidity: function offset5() view returns(uint128)
-func (_Testdata *TestdataCallerSession) Offset5() (*big.Int, error) {
-	return _Testdata.Contract.Offset5(&_Testdata.CallOpts)
-}
-
-// SetStorage is a paid mutator transaction binding the contract method 0x9b0b0fda.
-//
-// Solidity: function setStorage(bytes32 key, bytes32 value) returns()
-func (_Testdata *TestdataTransactor) SetStorage(opts *bind.TransactOpts, key [32]byte, value [32]byte) (*types.Transaction, error) {
-	return _Testdata.contract.Transact(opts, "setStorage", key, value)
-}
-
-// SetStorage is a paid mutator transaction binding the contract method 0x9b0b0fda.
-//
-// Solidity: function setStorage(bytes32 key, bytes32 value) returns()
-func (_Testdata *TestdataSession) SetStorage(key [32]byte, value [32]byte) (*types.Transaction, error) {
-	return _Testdata.Contract.SetStorage(&_Testdata.TransactOpts, key, value)
-}
-
-// SetStorage is a paid mutator transaction binding the contract method 0x9b0b0fda.
-//
-// Solidity: function setStorage(bytes32 key, bytes32 value) returns()
-func (_Testdata *TestdataTransactorSession) SetStorage(key [32]byte, value [32]byte) (*types.Transaction, error) {
-	return _Testdata.Contract.SetStorage(&_Testdata.TransactOpts, key, value)
-}
diff --git a/op-chain-ops/state/testdata/layout.json b/op-chain-ops/state/testdata/layout.json
deleted file mode 100644
index 09f2971f0c5c..000000000000
--- a/op-chain-ops/state/testdata/layout.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
-  "storage": [
-    {
-      "astId": 3,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "_address",
-      "offset": 0,
-      "slot": "0",
-      "type": "t_address"
-    },
-    {
-      "astId": 7,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "addresses",
-      "offset": 0,
-      "slot": "1",
-      "type": "t_mapping(t_uint256,t_address)"
-    },
-    {
-      "astId": 9,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "_bool",
-      "offset": 0,
-      "slot": "2",
-      "type": "t_bool"
-    },
-    {
-      "astId": 11,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "_uint256",
-      "offset": 0,
-      "slot": "3",
-      "type": "t_uint256"
-    },
-    {
-      "astId": 13,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "offset0",
-      "offset": 0,
-      "slot": "4",
-      "type": "t_uint8"
-    },
-    {
-      "astId": 15,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "offset1",
-      "offset": 1,
-      "slot": "4",
-      "type": "t_uint8"
-    },
-    {
-      "astId": 17,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "offset2",
-      "offset": 2,
-      "slot": "4",
-      "type": "t_uint16"
-    },
-    {
-      "astId": 19,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "offset3",
-      "offset": 4,
-      "slot": "4",
-      "type": "t_uint32"
-    },
-    {
-      "astId": 21,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "offset4",
-      "offset": 8,
-      "slot": "4",
-      "type": "t_uint64"
-    },
-    {
-      "astId": 23,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "offset5",
-      "offset": 16,
-      "slot": "4",
-      "type": "t_uint128"
-    },
-    {
-      "astId": 25,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "_bytes32",
-      "offset": 0,
-      "slot": "5",
-      "type": "t_bytes32"
-    },
-    {
-      "astId": 27,
-      "contract": "contracts/HelloWorld.sol:HelloWorld",
-      "label": "_string",
-      "offset": 0,
-      "slot": "6",
-      "type": "t_string_storage"
-    }
-  ],
-  "types": {
-    "t_address": {
-      "encoding": "inplace",
-      "label": "address",
-      "numberOfBytes": "20"
-    },
-    "t_bool": {
-      "encoding": "inplace",
-      "label": "bool",
-      "numberOfBytes": "1"
-    },
-    "t_bytes32": {
-      "encoding": "inplace",
-      "label": "bytes32",
-      "numberOfBytes": "32"
-    },
-    "t_mapping(t_uint256,t_address)": {
-      "encoding": "mapping",
-      "key": "t_uint256",
-      "label": "mapping(uint256 => address)",
-      "numberOfBytes": "32",
-      "value": "t_address"
-    },
-    "t_string_storage": {
-      "encoding": "bytes",
-      "label": "string",
-      "numberOfBytes": "32"
-    },
-    "t_uint128": {
-      "encoding": "inplace",
-      "label": "uint128",
-      "numberOfBytes": "16"
-    },
-    "t_uint16": {
-      "encoding": "inplace",
-      "label": "uint16",
-      "numberOfBytes": "2"
-    },
-    "t_uint256": {
-      "encoding": "inplace",
-      "label": "uint256",
-      "numberOfBytes": "32"
-    },
-    "t_uint32": {
-      "encoding": "inplace",
-      "label": "uint32",
-      "numberOfBytes": "4"
-    },
-    "t_uint64": {
-      "encoding": "inplace",
-      "label": "uint64",
-      "numberOfBytes": "8"
-    },
-    "t_uint8": {
-      "encoding": "inplace",
-      "label": "uint8",
-      "numberOfBytes": "1"
-    }
-  }
-}
diff --git a/op-bindings/bindings/isemver.go b/op-chain-ops/upgrades/bindings/isemver.go
similarity index 100%
rename from op-bindings/bindings/isemver.go
rename to op-chain-ops/upgrades/bindings/isemver.go
diff --git a/op-chain-ops/upgrades/bindings/l1crossdomainmessenger.go b/op-chain-ops/upgrades/bindings/l1crossdomainmessenger.go
new file mode 100644
index 000000000000..7f0d35fc5ce5
--- /dev/null
+++ b/op-chain-ops/upgrades/bindings/l1crossdomainmessenger.go
@@ -0,0 +1,1609 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L1CrossDomainMessengerMetaData contains all meta data concerning the L1CrossDomainMessenger contract.
+var L1CrossDomainMessengerMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"MESSAGE_VERSION\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_CALLDATA_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_MESSENGER\",\"outputs\":[{\"internalType\":\"contractCrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PORTAL\",\"outputs\":[{\"internalType\":\"contractOptimismPortal\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_CALL_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_CONSTANT_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_GAS_CHECK_BUFFER\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_RESERVED_GAS\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"}],\"name\":\"baseGas\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractSuperchainConfig\",\"name\":\"_superchainConfig\",\"type\":\"address\"},{\"internalType\":\"contractOptimismPortal\",\"name\":\"_portal\",\"type\":\"address\"},{\"internalType\":\"contractSystemConfig\",\"name\":\"_systemConfig\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"otherMessenger\",\"outputs\":[{\"internalType\":\"contractCrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"portal\",\"outputs\":[{\"internalType\":\"contractOptimismPortal\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superchainConfig\",\"outputs\":[{\"internalType\":\"contractSuperchainConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"systemConfig\",\"outputs\":[{\"internalType\":\"contractSystemConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SentMessageExtension1\",\"type\":\"event\"}]",
+}
+
+// L1CrossDomainMessengerABI is the input ABI used to generate the binding from.
+// Deprecated: Use L1CrossDomainMessengerMetaData.ABI instead.
+var L1CrossDomainMessengerABI = L1CrossDomainMessengerMetaData.ABI
+
+// L1CrossDomainMessenger is an auto generated Go binding around an Ethereum contract.
+type L1CrossDomainMessenger struct {
+	L1CrossDomainMessengerCaller     // Read-only binding to the contract
+	L1CrossDomainMessengerTransactor // Write-only binding to the contract
+	L1CrossDomainMessengerFilterer   // Log filterer for contract events
+}
+
+// L1CrossDomainMessengerCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1CrossDomainMessengerTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1CrossDomainMessengerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L1CrossDomainMessengerFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1CrossDomainMessengerSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L1CrossDomainMessengerSession struct {
+	Contract     *L1CrossDomainMessenger // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts           // Call options to use throughout this session
+	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
+}
+
+// L1CrossDomainMessengerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L1CrossDomainMessengerCallerSession struct {
+	Contract *L1CrossDomainMessengerCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts                 // Call options to use throughout this session
+}
+
+// L1CrossDomainMessengerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L1CrossDomainMessengerTransactorSession struct {
+	Contract     *L1CrossDomainMessengerTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
+}
+
+// L1CrossDomainMessengerRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L1CrossDomainMessengerRaw struct {
+	Contract *L1CrossDomainMessenger // Generic contract binding to access the raw methods on
+}
+
+// L1CrossDomainMessengerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerCallerRaw struct {
+	Contract *L1CrossDomainMessengerCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L1CrossDomainMessengerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerTransactorRaw struct {
+	Contract *L1CrossDomainMessengerTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL1CrossDomainMessenger creates a new instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessenger(address common.Address, backend bind.ContractBackend) (*L1CrossDomainMessenger, error) {
+	contract, err := bindL1CrossDomainMessenger(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessenger{L1CrossDomainMessengerCaller: L1CrossDomainMessengerCaller{contract: contract}, L1CrossDomainMessengerTransactor: L1CrossDomainMessengerTransactor{contract: contract}, L1CrossDomainMessengerFilterer: L1CrossDomainMessengerFilterer{contract: contract}}, nil
+}
+
+// NewL1CrossDomainMessengerCaller creates a new read-only instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessengerCaller(address common.Address, caller bind.ContractCaller) (*L1CrossDomainMessengerCaller, error) {
+	contract, err := bindL1CrossDomainMessenger(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerCaller{contract: contract}, nil
+}
+
+// NewL1CrossDomainMessengerTransactor creates a new write-only instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessengerTransactor(address common.Address, transactor bind.ContractTransactor) (*L1CrossDomainMessengerTransactor, error) {
+	contract, err := bindL1CrossDomainMessenger(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerTransactor{contract: contract}, nil
+}
+
+// NewL1CrossDomainMessengerFilterer creates a new log filterer instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessengerFilterer(address common.Address, filterer bind.ContractFilterer) (*L1CrossDomainMessengerFilterer, error) {
+	contract, err := bindL1CrossDomainMessenger(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerFilterer{contract: contract}, nil
+}
+
+// bindL1CrossDomainMessenger binds a generic wrapper to an already deployed contract.
+func bindL1CrossDomainMessenger(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L1CrossDomainMessengerABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1CrossDomainMessenger.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MESSAGEVERSION(opts *bind.CallOpts) (uint16, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MESSAGE_VERSION")
+
+	if err != nil {
+		return *new(uint16), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
+
+	return out0, err
+
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MESSAGEVERSION() (uint16, error) {
+	return _L1CrossDomainMessenger.Contract.MESSAGEVERSION(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MESSAGEVERSION() (uint16, error) {
+	return _L1CrossDomainMessenger.Contract.MESSAGEVERSION(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASCALLDATAOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_CALLDATA_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADDENOMINATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADNUMERATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) OTHERMESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "OTHER_MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) OTHERMESSENGER() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OTHERMESSENGER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) OTHERMESSENGER() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OTHERMESSENGER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// PORTAL is a free data retrieval call binding the contract method 0x0ff754ea.
+//
+// Solidity: function PORTAL() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) PORTAL(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "PORTAL")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// PORTAL is a free data retrieval call binding the contract method 0x0ff754ea.
+//
+// Solidity: function PORTAL() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) PORTAL() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.PORTAL(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// PORTAL is a free data retrieval call binding the contract method 0x0ff754ea.
+//
+// Solidity: function PORTAL() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) PORTAL() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.PORTAL(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYCALLOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CALL_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYCONSTANTOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CONSTANT_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYGASCHECKBUFFER(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_GAS_CHECK_BUFFER")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYRESERVEDGAS(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_RESERVED_GAS")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) BaseGas(opts *bind.CallOpts, _message []byte, _minGasLimit uint32) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "baseGas", _message, _minGasLimit)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.BaseGas(&_L1CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.BaseGas(&_L1CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) FailedMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "failedMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.FailedMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.FailedMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MessageNonce(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "messageNonce")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MessageNonce() (*big.Int, error) {
+	return _L1CrossDomainMessenger.Contract.MessageNonce(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MessageNonce() (*big.Int, error) {
+	return _L1CrossDomainMessenger.Contract.MessageNonce(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) OtherMessenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "otherMessenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) OtherMessenger() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OtherMessenger(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) OtherMessenger() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OtherMessenger(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Paused() (bool, error) {
+	return _L1CrossDomainMessenger.Contract.Paused(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Paused() (bool, error) {
+	return _L1CrossDomainMessenger.Contract.Paused(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Portal is a free data retrieval call binding the contract method 0x6425666b.
+//
+// Solidity: function portal() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Portal(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "portal")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Portal is a free data retrieval call binding the contract method 0x6425666b.
+//
+// Solidity: function portal() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Portal() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.Portal(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Portal is a free data retrieval call binding the contract method 0x6425666b.
+//
+// Solidity: function portal() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Portal() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.Portal(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) SuccessfulMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "successfulMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.SuccessfulMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.SuccessfulMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SuperchainConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SuperchainConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) SuperchainConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SuperchainConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) SystemConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "systemConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SystemConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SystemConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) SystemConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SystemConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Version() (string, error) {
+	return _L1CrossDomainMessenger.Contract.Version(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Version() (string, error) {
+	return _L1CrossDomainMessenger.Contract.Version(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) XDomainMessageSender(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "xDomainMessageSender")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) XDomainMessageSender() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.XDomainMessageSender(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) XDomainMessageSender() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.XDomainMessageSender(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _superchainConfig, address _portal, address _systemConfig) returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) Initialize(opts *bind.TransactOpts, _superchainConfig common.Address, _portal common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.contract.Transact(opts, "initialize", _superchainConfig, _portal, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _superchainConfig, address _portal, address _systemConfig) returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Initialize(_superchainConfig common.Address, _portal common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.Initialize(&_L1CrossDomainMessenger.TransactOpts, _superchainConfig, _portal, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _superchainConfig, address _portal, address _systemConfig) returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) Initialize(_superchainConfig common.Address, _portal common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.Initialize(&_L1CrossDomainMessenger.TransactOpts, _superchainConfig, _portal, _systemConfig)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) RelayMessage(opts *bind.TransactOpts, _nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.contract.Transact(opts, "relayMessage", _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.RelayMessage(&_L1CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.RelayMessage(&_L1CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) SendMessage(opts *bind.TransactOpts, _target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.contract.Transact(opts, "sendMessage", _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.SendMessage(&_L1CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.SendMessage(&_L1CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// L1CrossDomainMessengerFailedRelayedMessageIterator is returned from FilterFailedRelayedMessage and is used to iterate over the raw logs and unpacked data for FailedRelayedMessage events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerFailedRelayedMessageIterator struct {
+	Event *L1CrossDomainMessengerFailedRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerFailedRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerFailedRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerFailedRelayedMessage represents a FailedRelayedMessage event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerFailedRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterFailedRelayedMessage is a free log retrieval operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterFailedRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L1CrossDomainMessengerFailedRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerFailedRelayedMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "FailedRelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchFailedRelayedMessage is a free log subscription operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchFailedRelayedMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerFailedRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerFailedRelayedMessage)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseFailedRelayedMessage is a log parse operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseFailedRelayedMessage(log types.Log) (*L1CrossDomainMessengerFailedRelayedMessage, error) {
+	event := new(L1CrossDomainMessengerFailedRelayedMessage)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerInitializedIterator struct {
+	Event *L1CrossDomainMessengerInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerInitialized represents a Initialized event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterInitialized(opts *bind.FilterOpts) (*L1CrossDomainMessengerInitializedIterator, error) {
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerInitializedIterator{contract: _L1CrossDomainMessenger.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerInitialized)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseInitialized(log types.Log) (*L1CrossDomainMessengerInitialized, error) {
+	event := new(L1CrossDomainMessengerInitialized)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerRelayedMessageIterator is returned from FilterRelayedMessage and is used to iterate over the raw logs and unpacked data for RelayedMessage events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerRelayedMessageIterator struct {
+	Event *L1CrossDomainMessengerRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerRelayedMessage represents a RelayedMessage event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterRelayedMessage is a free log retrieval operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L1CrossDomainMessengerRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerRelayedMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "RelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchRelayedMessage is a free log subscription operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchRelayedMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerRelayedMessage)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseRelayedMessage is a log parse operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseRelayedMessage(log types.Log) (*L1CrossDomainMessengerRelayedMessage, error) {
+	event := new(L1CrossDomainMessengerRelayedMessage)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerSentMessageIterator is returned from FilterSentMessage and is used to iterate over the raw logs and unpacked data for SentMessage events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessageIterator struct {
+	Event *L1CrossDomainMessengerSentMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerSentMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerSentMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerSentMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerSentMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerSentMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerSentMessage represents a SentMessage event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessage struct {
+	Target       common.Address
+	Sender       common.Address
+	Message      []byte
+	MessageNonce *big.Int
+	GasLimit     *big.Int
+	Raw          types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessage is a free log retrieval operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterSentMessage(opts *bind.FilterOpts, target []common.Address) (*L1CrossDomainMessengerSentMessageIterator, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerSentMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "SentMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessage is a free log subscription operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchSentMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerSentMessage, target []common.Address) (event.Subscription, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerSentMessage)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessage is a log parse operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseSentMessage(log types.Log) (*L1CrossDomainMessengerSentMessage, error) {
+	event := new(L1CrossDomainMessengerSentMessage)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerSentMessageExtension1Iterator is returned from FilterSentMessageExtension1 and is used to iterate over the raw logs and unpacked data for SentMessageExtension1 events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessageExtension1Iterator struct {
+	Event *L1CrossDomainMessengerSentMessageExtension1 // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerSentMessageExtension1)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerSentMessageExtension1)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerSentMessageExtension1 represents a SentMessageExtension1 event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessageExtension1 struct {
+	Sender common.Address
+	Value  *big.Int
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessageExtension1 is a free log retrieval operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterSentMessageExtension1(opts *bind.FilterOpts, sender []common.Address) (*L1CrossDomainMessengerSentMessageExtension1Iterator, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerSentMessageExtension1Iterator{contract: _L1CrossDomainMessenger.contract, event: "SentMessageExtension1", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessageExtension1 is a free log subscription operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchSentMessageExtension1(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerSentMessageExtension1, sender []common.Address) (event.Subscription, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerSentMessageExtension1)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessageExtension1 is a log parse operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseSentMessageExtension1(log types.Log) (*L1CrossDomainMessengerSentMessageExtension1, error) {
+	event := new(L1CrossDomainMessengerSentMessageExtension1)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-chain-ops/upgrades/bindings/l1erc721bridge.go b/op-chain-ops/upgrades/bindings/l1erc721bridge.go
new file mode 100644
index 000000000000..4e847b8de95d
--- /dev/null
+++ b/op-chain-ops/upgrades/bindings/l1erc721bridge.go
@@ -0,0 +1,976 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L1ERC721BridgeMetaData contains all meta data concerning the L1ERC721Bridge contract.
+var L1ERC721BridgeMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"contractCrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_BRIDGE\",\"outputs\":[{\"internalType\":\"contractStandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC721To\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeBridgeERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractCrossDomainMessenger\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"contractSuperchainConfig\",\"name\":\"_superchainConfig\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"contractCrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"otherBridge\",\"outputs\":[{\"internalType\":\"contractStandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superchainConfig\",\"outputs\":[{\"internalType\":\"contractSuperchainConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC721BridgeFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC721BridgeInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"}]",
+}
+
+// L1ERC721BridgeABI is the input ABI used to generate the binding from.
+// Deprecated: Use L1ERC721BridgeMetaData.ABI instead.
+var L1ERC721BridgeABI = L1ERC721BridgeMetaData.ABI
+
+// L1ERC721Bridge is an auto generated Go binding around an Ethereum contract.
+type L1ERC721Bridge struct {
+	L1ERC721BridgeCaller     // Read-only binding to the contract
+	L1ERC721BridgeTransactor // Write-only binding to the contract
+	L1ERC721BridgeFilterer   // Log filterer for contract events
+}
+
+// L1ERC721BridgeCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L1ERC721BridgeCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1ERC721BridgeTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L1ERC721BridgeTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1ERC721BridgeFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L1ERC721BridgeFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1ERC721BridgeSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L1ERC721BridgeSession struct {
+	Contract     *L1ERC721Bridge   // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// L1ERC721BridgeCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L1ERC721BridgeCallerSession struct {
+	Contract *L1ERC721BridgeCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts         // Call options to use throughout this session
+}
+
+// L1ERC721BridgeTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L1ERC721BridgeTransactorSession struct {
+	Contract     *L1ERC721BridgeTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
+}
+
+// L1ERC721BridgeRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L1ERC721BridgeRaw struct {
+	Contract *L1ERC721Bridge // Generic contract binding to access the raw methods on
+}
+
+// L1ERC721BridgeCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L1ERC721BridgeCallerRaw struct {
+	Contract *L1ERC721BridgeCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L1ERC721BridgeTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L1ERC721BridgeTransactorRaw struct {
+	Contract *L1ERC721BridgeTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL1ERC721Bridge creates a new instance of L1ERC721Bridge, bound to a specific deployed contract.
+func NewL1ERC721Bridge(address common.Address, backend bind.ContractBackend) (*L1ERC721Bridge, error) {
+	contract, err := bindL1ERC721Bridge(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L1ERC721Bridge{L1ERC721BridgeCaller: L1ERC721BridgeCaller{contract: contract}, L1ERC721BridgeTransactor: L1ERC721BridgeTransactor{contract: contract}, L1ERC721BridgeFilterer: L1ERC721BridgeFilterer{contract: contract}}, nil
+}
+
+// NewL1ERC721BridgeCaller creates a new read-only instance of L1ERC721Bridge, bound to a specific deployed contract.
+func NewL1ERC721BridgeCaller(address common.Address, caller bind.ContractCaller) (*L1ERC721BridgeCaller, error) {
+	contract, err := bindL1ERC721Bridge(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1ERC721BridgeCaller{contract: contract}, nil
+}
+
+// NewL1ERC721BridgeTransactor creates a new write-only instance of L1ERC721Bridge, bound to a specific deployed contract.
+func NewL1ERC721BridgeTransactor(address common.Address, transactor bind.ContractTransactor) (*L1ERC721BridgeTransactor, error) {
+	contract, err := bindL1ERC721Bridge(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1ERC721BridgeTransactor{contract: contract}, nil
+}
+
+// NewL1ERC721BridgeFilterer creates a new log filterer instance of L1ERC721Bridge, bound to a specific deployed contract.
+func NewL1ERC721BridgeFilterer(address common.Address, filterer bind.ContractFilterer) (*L1ERC721BridgeFilterer, error) {
+	contract, err := bindL1ERC721Bridge(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L1ERC721BridgeFilterer{contract: contract}, nil
+}
+
+// bindL1ERC721Bridge binds a generic wrapper to an already deployed contract.
+func bindL1ERC721Bridge(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L1ERC721BridgeABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1ERC721Bridge *L1ERC721BridgeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1ERC721Bridge.Contract.L1ERC721BridgeCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1ERC721Bridge *L1ERC721BridgeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.L1ERC721BridgeTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1ERC721Bridge *L1ERC721BridgeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.L1ERC721BridgeTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1ERC721Bridge *L1ERC721BridgeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1ERC721Bridge.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1ERC721Bridge *L1ERC721BridgeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1ERC721Bridge *L1ERC721BridgeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeCaller) MESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1ERC721Bridge.contract.Call(opts, &out, "MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeSession) MESSENGER() (common.Address, error) {
+	return _L1ERC721Bridge.Contract.MESSENGER(&_L1ERC721Bridge.CallOpts)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeCallerSession) MESSENGER() (common.Address, error) {
+	return _L1ERC721Bridge.Contract.MESSENGER(&_L1ERC721Bridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeCaller) OTHERBRIDGE(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1ERC721Bridge.contract.Call(opts, &out, "OTHER_BRIDGE")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeSession) OTHERBRIDGE() (common.Address, error) {
+	return _L1ERC721Bridge.Contract.OTHERBRIDGE(&_L1ERC721Bridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeCallerSession) OTHERBRIDGE() (common.Address, error) {
+	return _L1ERC721Bridge.Contract.OTHERBRIDGE(&_L1ERC721Bridge.CallOpts)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x5d93a3fc.
+//
+// Solidity: function deposits(address , address , uint256 ) view returns(bool)
+func (_L1ERC721Bridge *L1ERC721BridgeCaller) Deposits(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address, arg2 *big.Int) (bool, error) {
+	var out []interface{}
+	err := _L1ERC721Bridge.contract.Call(opts, &out, "deposits", arg0, arg1, arg2)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x5d93a3fc.
+//
+// Solidity: function deposits(address , address , uint256 ) view returns(bool)
+func (_L1ERC721Bridge *L1ERC721BridgeSession) Deposits(arg0 common.Address, arg1 common.Address, arg2 *big.Int) (bool, error) {
+	return _L1ERC721Bridge.Contract.Deposits(&_L1ERC721Bridge.CallOpts, arg0, arg1, arg2)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x5d93a3fc.
+//
+// Solidity: function deposits(address , address , uint256 ) view returns(bool)
+func (_L1ERC721Bridge *L1ERC721BridgeCallerSession) Deposits(arg0 common.Address, arg1 common.Address, arg2 *big.Int) (bool, error) {
+	return _L1ERC721Bridge.Contract.Deposits(&_L1ERC721Bridge.CallOpts, arg0, arg1, arg2)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeCaller) Messenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1ERC721Bridge.contract.Call(opts, &out, "messenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeSession) Messenger() (common.Address, error) {
+	return _L1ERC721Bridge.Contract.Messenger(&_L1ERC721Bridge.CallOpts)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeCallerSession) Messenger() (common.Address, error) {
+	return _L1ERC721Bridge.Contract.Messenger(&_L1ERC721Bridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeCaller) OtherBridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1ERC721Bridge.contract.Call(opts, &out, "otherBridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeSession) OtherBridge() (common.Address, error) {
+	return _L1ERC721Bridge.Contract.OtherBridge(&_L1ERC721Bridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeCallerSession) OtherBridge() (common.Address, error) {
+	return _L1ERC721Bridge.Contract.OtherBridge(&_L1ERC721Bridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1ERC721Bridge *L1ERC721BridgeCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _L1ERC721Bridge.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1ERC721Bridge *L1ERC721BridgeSession) Paused() (bool, error) {
+	return _L1ERC721Bridge.Contract.Paused(&_L1ERC721Bridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1ERC721Bridge *L1ERC721BridgeCallerSession) Paused() (bool, error) {
+	return _L1ERC721Bridge.Contract.Paused(&_L1ERC721Bridge.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeCaller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1ERC721Bridge.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeSession) SuperchainConfig() (common.Address, error) {
+	return _L1ERC721Bridge.Contract.SuperchainConfig(&_L1ERC721Bridge.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1ERC721Bridge *L1ERC721BridgeCallerSession) SuperchainConfig() (common.Address, error) {
+	return _L1ERC721Bridge.Contract.SuperchainConfig(&_L1ERC721Bridge.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1ERC721Bridge *L1ERC721BridgeCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L1ERC721Bridge.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1ERC721Bridge *L1ERC721BridgeSession) Version() (string, error) {
+	return _L1ERC721Bridge.Contract.Version(&_L1ERC721Bridge.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1ERC721Bridge *L1ERC721BridgeCallerSession) Version() (string, error) {
+	return _L1ERC721Bridge.Contract.Version(&_L1ERC721Bridge.CallOpts)
+}
+
+// BridgeERC721 is a paid mutator transaction binding the contract method 0x3687011a.
+//
+// Solidity: function bridgeERC721(address _localToken, address _remoteToken, uint256 _tokenId, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeTransactor) BridgeERC721(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _tokenId *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1ERC721Bridge.contract.Transact(opts, "bridgeERC721", _localToken, _remoteToken, _tokenId, _minGasLimit, _extraData)
+}
+
+// BridgeERC721 is a paid mutator transaction binding the contract method 0x3687011a.
+//
+// Solidity: function bridgeERC721(address _localToken, address _remoteToken, uint256 _tokenId, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeSession) BridgeERC721(_localToken common.Address, _remoteToken common.Address, _tokenId *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.BridgeERC721(&_L1ERC721Bridge.TransactOpts, _localToken, _remoteToken, _tokenId, _minGasLimit, _extraData)
+}
+
+// BridgeERC721 is a paid mutator transaction binding the contract method 0x3687011a.
+//
+// Solidity: function bridgeERC721(address _localToken, address _remoteToken, uint256 _tokenId, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeTransactorSession) BridgeERC721(_localToken common.Address, _remoteToken common.Address, _tokenId *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.BridgeERC721(&_L1ERC721Bridge.TransactOpts, _localToken, _remoteToken, _tokenId, _minGasLimit, _extraData)
+}
+
+// BridgeERC721To is a paid mutator transaction binding the contract method 0xaa557452.
+//
+// Solidity: function bridgeERC721To(address _localToken, address _remoteToken, address _to, uint256 _tokenId, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeTransactor) BridgeERC721To(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _to common.Address, _tokenId *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1ERC721Bridge.contract.Transact(opts, "bridgeERC721To", _localToken, _remoteToken, _to, _tokenId, _minGasLimit, _extraData)
+}
+
+// BridgeERC721To is a paid mutator transaction binding the contract method 0xaa557452.
+//
+// Solidity: function bridgeERC721To(address _localToken, address _remoteToken, address _to, uint256 _tokenId, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeSession) BridgeERC721To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _tokenId *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.BridgeERC721To(&_L1ERC721Bridge.TransactOpts, _localToken, _remoteToken, _to, _tokenId, _minGasLimit, _extraData)
+}
+
+// BridgeERC721To is a paid mutator transaction binding the contract method 0xaa557452.
+//
+// Solidity: function bridgeERC721To(address _localToken, address _remoteToken, address _to, uint256 _tokenId, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeTransactorSession) BridgeERC721To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _tokenId *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.BridgeERC721To(&_L1ERC721Bridge.TransactOpts, _localToken, _remoteToken, _to, _tokenId, _minGasLimit, _extraData)
+}
+
+// FinalizeBridgeERC721 is a paid mutator transaction binding the contract method 0x761f4493.
+//
+// Solidity: function finalizeBridgeERC721(address _localToken, address _remoteToken, address _from, address _to, uint256 _tokenId, bytes _extraData) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeTransactor) FinalizeBridgeERC721(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _tokenId *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1ERC721Bridge.contract.Transact(opts, "finalizeBridgeERC721", _localToken, _remoteToken, _from, _to, _tokenId, _extraData)
+}
+
+// FinalizeBridgeERC721 is a paid mutator transaction binding the contract method 0x761f4493.
+//
+// Solidity: function finalizeBridgeERC721(address _localToken, address _remoteToken, address _from, address _to, uint256 _tokenId, bytes _extraData) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeSession) FinalizeBridgeERC721(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _tokenId *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.FinalizeBridgeERC721(&_L1ERC721Bridge.TransactOpts, _localToken, _remoteToken, _from, _to, _tokenId, _extraData)
+}
+
+// FinalizeBridgeERC721 is a paid mutator transaction binding the contract method 0x761f4493.
+//
+// Solidity: function finalizeBridgeERC721(address _localToken, address _remoteToken, address _from, address _to, uint256 _tokenId, bytes _extraData) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeTransactorSession) FinalizeBridgeERC721(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _tokenId *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.FinalizeBridgeERC721(&_L1ERC721Bridge.TransactOpts, _localToken, _remoteToken, _from, _to, _tokenId, _extraData)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x485cc955.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeTransactor) Initialize(opts *bind.TransactOpts, _messenger common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _L1ERC721Bridge.contract.Transact(opts, "initialize", _messenger, _superchainConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x485cc955.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeSession) Initialize(_messenger common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.Initialize(&_L1ERC721Bridge.TransactOpts, _messenger, _superchainConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x485cc955.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig) returns()
+func (_L1ERC721Bridge *L1ERC721BridgeTransactorSession) Initialize(_messenger common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _L1ERC721Bridge.Contract.Initialize(&_L1ERC721Bridge.TransactOpts, _messenger, _superchainConfig)
+}
+
+// L1ERC721BridgeERC721BridgeFinalizedIterator is returned from FilterERC721BridgeFinalized and is used to iterate over the raw logs and unpacked data for ERC721BridgeFinalized events raised by the L1ERC721Bridge contract.
+type L1ERC721BridgeERC721BridgeFinalizedIterator struct {
+	Event *L1ERC721BridgeERC721BridgeFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1ERC721BridgeERC721BridgeFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1ERC721BridgeERC721BridgeFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1ERC721BridgeERC721BridgeFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1ERC721BridgeERC721BridgeFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1ERC721BridgeERC721BridgeFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1ERC721BridgeERC721BridgeFinalized represents a ERC721BridgeFinalized event raised by the L1ERC721Bridge contract.
+type L1ERC721BridgeERC721BridgeFinalized struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	TokenId     *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC721BridgeFinalized is a free log retrieval operation binding the contract event 0x1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac.
+//
+// Solidity: event ERC721BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 tokenId, bytes extraData)
+func (_L1ERC721Bridge *L1ERC721BridgeFilterer) FilterERC721BridgeFinalized(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*L1ERC721BridgeERC721BridgeFinalizedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1ERC721Bridge.contract.FilterLogs(opts, "ERC721BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1ERC721BridgeERC721BridgeFinalizedIterator{contract: _L1ERC721Bridge.contract, event: "ERC721BridgeFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchERC721BridgeFinalized is a free log subscription operation binding the contract event 0x1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac.
+//
+// Solidity: event ERC721BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 tokenId, bytes extraData)
+func (_L1ERC721Bridge *L1ERC721BridgeFilterer) WatchERC721BridgeFinalized(opts *bind.WatchOpts, sink chan<- *L1ERC721BridgeERC721BridgeFinalized, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1ERC721Bridge.contract.WatchLogs(opts, "ERC721BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1ERC721BridgeERC721BridgeFinalized)
+				if err := _L1ERC721Bridge.contract.UnpackLog(event, "ERC721BridgeFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC721BridgeFinalized is a log parse operation binding the contract event 0x1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac.
+//
+// Solidity: event ERC721BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 tokenId, bytes extraData)
+func (_L1ERC721Bridge *L1ERC721BridgeFilterer) ParseERC721BridgeFinalized(log types.Log) (*L1ERC721BridgeERC721BridgeFinalized, error) {
+	event := new(L1ERC721BridgeERC721BridgeFinalized)
+	if err := _L1ERC721Bridge.contract.UnpackLog(event, "ERC721BridgeFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1ERC721BridgeERC721BridgeInitiatedIterator is returned from FilterERC721BridgeInitiated and is used to iterate over the raw logs and unpacked data for ERC721BridgeInitiated events raised by the L1ERC721Bridge contract.
+type L1ERC721BridgeERC721BridgeInitiatedIterator struct {
+	Event *L1ERC721BridgeERC721BridgeInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1ERC721BridgeERC721BridgeInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1ERC721BridgeERC721BridgeInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1ERC721BridgeERC721BridgeInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1ERC721BridgeERC721BridgeInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1ERC721BridgeERC721BridgeInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1ERC721BridgeERC721BridgeInitiated represents a ERC721BridgeInitiated event raised by the L1ERC721Bridge contract.
+type L1ERC721BridgeERC721BridgeInitiated struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	TokenId     *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC721BridgeInitiated is a free log retrieval operation binding the contract event 0xb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a5.
+//
+// Solidity: event ERC721BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 tokenId, bytes extraData)
+func (_L1ERC721Bridge *L1ERC721BridgeFilterer) FilterERC721BridgeInitiated(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*L1ERC721BridgeERC721BridgeInitiatedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1ERC721Bridge.contract.FilterLogs(opts, "ERC721BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1ERC721BridgeERC721BridgeInitiatedIterator{contract: _L1ERC721Bridge.contract, event: "ERC721BridgeInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchERC721BridgeInitiated is a free log subscription operation binding the contract event 0xb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a5.
+//
+// Solidity: event ERC721BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 tokenId, bytes extraData)
+func (_L1ERC721Bridge *L1ERC721BridgeFilterer) WatchERC721BridgeInitiated(opts *bind.WatchOpts, sink chan<- *L1ERC721BridgeERC721BridgeInitiated, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1ERC721Bridge.contract.WatchLogs(opts, "ERC721BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1ERC721BridgeERC721BridgeInitiated)
+				if err := _L1ERC721Bridge.contract.UnpackLog(event, "ERC721BridgeInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC721BridgeInitiated is a log parse operation binding the contract event 0xb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a5.
+//
+// Solidity: event ERC721BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 tokenId, bytes extraData)
+func (_L1ERC721Bridge *L1ERC721BridgeFilterer) ParseERC721BridgeInitiated(log types.Log) (*L1ERC721BridgeERC721BridgeInitiated, error) {
+	event := new(L1ERC721BridgeERC721BridgeInitiated)
+	if err := _L1ERC721Bridge.contract.UnpackLog(event, "ERC721BridgeInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1ERC721BridgeInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L1ERC721Bridge contract.
+type L1ERC721BridgeInitializedIterator struct {
+	Event *L1ERC721BridgeInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1ERC721BridgeInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1ERC721BridgeInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1ERC721BridgeInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1ERC721BridgeInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1ERC721BridgeInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1ERC721BridgeInitialized represents a Initialized event raised by the L1ERC721Bridge contract.
+type L1ERC721BridgeInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1ERC721Bridge *L1ERC721BridgeFilterer) FilterInitialized(opts *bind.FilterOpts) (*L1ERC721BridgeInitializedIterator, error) {
+
+	logs, sub, err := _L1ERC721Bridge.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L1ERC721BridgeInitializedIterator{contract: _L1ERC721Bridge.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1ERC721Bridge *L1ERC721BridgeFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L1ERC721BridgeInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L1ERC721Bridge.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1ERC721BridgeInitialized)
+				if err := _L1ERC721Bridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1ERC721Bridge *L1ERC721BridgeFilterer) ParseInitialized(log types.Log) (*L1ERC721BridgeInitialized, error) {
+	event := new(L1ERC721BridgeInitialized)
+	if err := _L1ERC721Bridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-chain-ops/upgrades/bindings/l1standardbridge.go b/op-chain-ops/upgrades/bindings/l1standardbridge.go
new file mode 100644
index 000000000000..bbdbcd0bb9c5
--- /dev/null
+++ b/op-chain-ops/upgrades/bindings/l1standardbridge.go
@@ -0,0 +1,2198 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L1StandardBridgeMetaData contains all meta data concerning the L1StandardBridge contract.
+var L1StandardBridgeMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"contractCrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_BRIDGE\",\"outputs\":[{\"internalType\":\"contractStandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC20To\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeETHTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"depositERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"depositERC20To\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"depositETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"depositETHTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeBridgeERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeBridgeETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeERC20Withdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeETHWithdrawal\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractCrossDomainMessenger\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"contractSuperchainConfig\",\"name\":\"_superchainConfig\",\"type\":\"address\"},{\"internalType\":\"contractSystemConfig\",\"name\":\"_systemConfig\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2TokenBridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"contractCrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"otherBridge\",\"outputs\":[{\"internalType\":\"contractStandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superchainConfig\",\"outputs\":[{\"internalType\":\"contractSuperchainConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"systemConfig\",\"outputs\":[{\"internalType\":\"contractSystemConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC20BridgeFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC20BridgeInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC20DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC20WithdrawalFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ETHBridgeFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ETHBridgeInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ETHDepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ETHWithdrawalFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"}]",
+}
+
+// L1StandardBridgeABI is the input ABI used to generate the binding from.
+// Deprecated: Use L1StandardBridgeMetaData.ABI instead.
+var L1StandardBridgeABI = L1StandardBridgeMetaData.ABI
+
+// L1StandardBridge is an auto generated Go binding around an Ethereum contract.
+type L1StandardBridge struct {
+	L1StandardBridgeCaller     // Read-only binding to the contract
+	L1StandardBridgeTransactor // Write-only binding to the contract
+	L1StandardBridgeFilterer   // Log filterer for contract events
+}
+
+// L1StandardBridgeCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L1StandardBridgeCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1StandardBridgeTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L1StandardBridgeTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1StandardBridgeFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L1StandardBridgeFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1StandardBridgeSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L1StandardBridgeSession struct {
+	Contract     *L1StandardBridge // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// L1StandardBridgeCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L1StandardBridgeCallerSession struct {
+	Contract *L1StandardBridgeCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts           // Call options to use throughout this session
+}
+
+// L1StandardBridgeTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L1StandardBridgeTransactorSession struct {
+	Contract     *L1StandardBridgeTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
+}
+
+// L1StandardBridgeRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L1StandardBridgeRaw struct {
+	Contract *L1StandardBridge // Generic contract binding to access the raw methods on
+}
+
+// L1StandardBridgeCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L1StandardBridgeCallerRaw struct {
+	Contract *L1StandardBridgeCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L1StandardBridgeTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L1StandardBridgeTransactorRaw struct {
+	Contract *L1StandardBridgeTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL1StandardBridge creates a new instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridge(address common.Address, backend bind.ContractBackend) (*L1StandardBridge, error) {
+	contract, err := bindL1StandardBridge(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridge{L1StandardBridgeCaller: L1StandardBridgeCaller{contract: contract}, L1StandardBridgeTransactor: L1StandardBridgeTransactor{contract: contract}, L1StandardBridgeFilterer: L1StandardBridgeFilterer{contract: contract}}, nil
+}
+
+// NewL1StandardBridgeCaller creates a new read-only instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridgeCaller(address common.Address, caller bind.ContractCaller) (*L1StandardBridgeCaller, error) {
+	contract, err := bindL1StandardBridge(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeCaller{contract: contract}, nil
+}
+
+// NewL1StandardBridgeTransactor creates a new write-only instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridgeTransactor(address common.Address, transactor bind.ContractTransactor) (*L1StandardBridgeTransactor, error) {
+	contract, err := bindL1StandardBridge(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeTransactor{contract: contract}, nil
+}
+
+// NewL1StandardBridgeFilterer creates a new log filterer instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridgeFilterer(address common.Address, filterer bind.ContractFilterer) (*L1StandardBridgeFilterer, error) {
+	contract, err := bindL1StandardBridge(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeFilterer{contract: contract}, nil
+}
+
+// bindL1StandardBridge binds a generic wrapper to an already deployed contract.
+func bindL1StandardBridge(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L1StandardBridgeABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1StandardBridge *L1StandardBridgeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1StandardBridge.Contract.L1StandardBridgeCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1StandardBridge *L1StandardBridgeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.L1StandardBridgeTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1StandardBridge *L1StandardBridgeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.L1StandardBridgeTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1StandardBridge *L1StandardBridgeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1StandardBridge.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1StandardBridge *L1StandardBridgeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1StandardBridge *L1StandardBridgeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) MESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) MESSENGER() (common.Address, error) {
+	return _L1StandardBridge.Contract.MESSENGER(&_L1StandardBridge.CallOpts)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) MESSENGER() (common.Address, error) {
+	return _L1StandardBridge.Contract.MESSENGER(&_L1StandardBridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) OTHERBRIDGE(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "OTHER_BRIDGE")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) OTHERBRIDGE() (common.Address, error) {
+	return _L1StandardBridge.Contract.OTHERBRIDGE(&_L1StandardBridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) OTHERBRIDGE() (common.Address, error) {
+	return _L1StandardBridge.Contract.OTHERBRIDGE(&_L1StandardBridge.CallOpts)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L1StandardBridge *L1StandardBridgeCaller) Deposits(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "deposits", arg0, arg1)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L1StandardBridge *L1StandardBridgeSession) Deposits(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _L1StandardBridge.Contract.Deposits(&_L1StandardBridge.CallOpts, arg0, arg1)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Deposits(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _L1StandardBridge.Contract.Deposits(&_L1StandardBridge.CallOpts, arg0, arg1)
+}
+
+// L2TokenBridge is a free data retrieval call binding the contract method 0x91c49bf8.
+//
+// Solidity: function l2TokenBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) L2TokenBridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "l2TokenBridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2TokenBridge is a free data retrieval call binding the contract method 0x91c49bf8.
+//
+// Solidity: function l2TokenBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) L2TokenBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.L2TokenBridge(&_L1StandardBridge.CallOpts)
+}
+
+// L2TokenBridge is a free data retrieval call binding the contract method 0x91c49bf8.
+//
+// Solidity: function l2TokenBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) L2TokenBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.L2TokenBridge(&_L1StandardBridge.CallOpts)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) Messenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "messenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) Messenger() (common.Address, error) {
+	return _L1StandardBridge.Contract.Messenger(&_L1StandardBridge.CallOpts)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Messenger() (common.Address, error) {
+	return _L1StandardBridge.Contract.Messenger(&_L1StandardBridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) OtherBridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "otherBridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) OtherBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.OtherBridge(&_L1StandardBridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) OtherBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.OtherBridge(&_L1StandardBridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1StandardBridge *L1StandardBridgeCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1StandardBridge *L1StandardBridgeSession) Paused() (bool, error) {
+	return _L1StandardBridge.Contract.Paused(&_L1StandardBridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Paused() (bool, error) {
+	return _L1StandardBridge.Contract.Paused(&_L1StandardBridge.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) SuperchainConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SuperchainConfig(&_L1StandardBridge.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) SuperchainConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SuperchainConfig(&_L1StandardBridge.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) SystemConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "systemConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) SystemConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SystemConfig(&_L1StandardBridge.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) SystemConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SystemConfig(&_L1StandardBridge.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1StandardBridge *L1StandardBridgeCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1StandardBridge *L1StandardBridgeSession) Version() (string, error) {
+	return _L1StandardBridge.Contract.Version(&_L1StandardBridge.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Version() (string, error) {
+	return _L1StandardBridge.Contract.Version(&_L1StandardBridge.CallOpts)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeERC20(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeERC20", _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeERC20(_localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeERC20(_localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeERC20To(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeERC20To", _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeERC20To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20To(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeERC20To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20To(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeETH(opts *bind.TransactOpts, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeETH", _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeETHTo(opts *bind.TransactOpts, _to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeETHTo", _to, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// DepositERC20 is a paid mutator transaction binding the contract method 0x58a997f6.
+//
+// Solidity: function depositERC20(address _l1Token, address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositERC20(opts *bind.TransactOpts, _l1Token common.Address, _l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositERC20", _l1Token, _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20 is a paid mutator transaction binding the contract method 0x58a997f6.
+//
+// Solidity: function depositERC20(address _l1Token, address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositERC20(_l1Token common.Address, _l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20 is a paid mutator transaction binding the contract method 0x58a997f6.
+//
+// Solidity: function depositERC20(address _l1Token, address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositERC20(_l1Token common.Address, _l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20To is a paid mutator transaction binding the contract method 0x838b2520.
+//
+// Solidity: function depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositERC20To(opts *bind.TransactOpts, _l1Token common.Address, _l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositERC20To", _l1Token, _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20To is a paid mutator transaction binding the contract method 0x838b2520.
+//
+// Solidity: function depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositERC20To(_l1Token common.Address, _l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20To(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20To is a paid mutator transaction binding the contract method 0x838b2520.
+//
+// Solidity: function depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositERC20To(_l1Token common.Address, _l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20To(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// DepositETH is a paid mutator transaction binding the contract method 0xb1a1a882.
+//
+// Solidity: function depositETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositETH(opts *bind.TransactOpts, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositETH", _minGasLimit, _extraData)
+}
+
+// DepositETH is a paid mutator transaction binding the contract method 0xb1a1a882.
+//
+// Solidity: function depositETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// DepositETH is a paid mutator transaction binding the contract method 0xb1a1a882.
+//
+// Solidity: function depositETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// DepositETHTo is a paid mutator transaction binding the contract method 0x9a2ac6d5.
+//
+// Solidity: function depositETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositETHTo(opts *bind.TransactOpts, _to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositETHTo", _to, _minGasLimit, _extraData)
+}
+
+// DepositETHTo is a paid mutator transaction binding the contract method 0x9a2ac6d5.
+//
+// Solidity: function depositETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// DepositETHTo is a paid mutator transaction binding the contract method 0x9a2ac6d5.
+//
+// Solidity: function depositETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeBridgeERC20(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeBridgeERC20", _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeBridgeERC20(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeBridgeERC20(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeBridgeETH(opts *bind.TransactOpts, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeBridgeETH", _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeBridgeETH(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeETH(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeBridgeETH(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeETH(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeERC20Withdrawal is a paid mutator transaction binding the contract method 0xa9f9e675.
+//
+// Solidity: function finalizeERC20Withdrawal(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeERC20Withdrawal(opts *bind.TransactOpts, _l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeERC20Withdrawal", _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// FinalizeERC20Withdrawal is a paid mutator transaction binding the contract method 0xa9f9e675.
+//
+// Solidity: function finalizeERC20Withdrawal(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeERC20Withdrawal(_l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeERC20Withdrawal(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// FinalizeERC20Withdrawal is a paid mutator transaction binding the contract method 0xa9f9e675.
+//
+// Solidity: function finalizeERC20Withdrawal(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeERC20Withdrawal(_l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeERC20Withdrawal(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// FinalizeETHWithdrawal is a paid mutator transaction binding the contract method 0x1532ec34.
+//
+// Solidity: function finalizeETHWithdrawal(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeETHWithdrawal(opts *bind.TransactOpts, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeETHWithdrawal", _from, _to, _amount, _extraData)
+}
+
+// FinalizeETHWithdrawal is a paid mutator transaction binding the contract method 0x1532ec34.
+//
+// Solidity: function finalizeETHWithdrawal(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeETHWithdrawal(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeETHWithdrawal(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeETHWithdrawal is a paid mutator transaction binding the contract method 0x1532ec34.
+//
+// Solidity: function finalizeETHWithdrawal(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeETHWithdrawal(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeETHWithdrawal(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig, address _systemConfig) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) Initialize(opts *bind.TransactOpts, _messenger common.Address, _superchainConfig common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "initialize", _messenger, _superchainConfig, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig, address _systemConfig) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) Initialize(_messenger common.Address, _superchainConfig common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Initialize(&_L1StandardBridge.TransactOpts, _messenger, _superchainConfig, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig, address _systemConfig) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) Initialize(_messenger common.Address, _superchainConfig common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Initialize(&_L1StandardBridge.TransactOpts, _messenger, _superchainConfig, _systemConfig)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) Receive() (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Receive(&_L1StandardBridge.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) Receive() (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Receive(&_L1StandardBridge.TransactOpts)
+}
+
+// L1StandardBridgeERC20BridgeFinalizedIterator is returned from FilterERC20BridgeFinalized and is used to iterate over the raw logs and unpacked data for ERC20BridgeFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeFinalizedIterator struct {
+	Event *L1StandardBridgeERC20BridgeFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20BridgeFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20BridgeFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20BridgeFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20BridgeFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20BridgeFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20BridgeFinalized represents a ERC20BridgeFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeFinalized struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	Amount      *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20BridgeFinalized is a free log retrieval operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20BridgeFinalized(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*L1StandardBridgeERC20BridgeFinalizedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20BridgeFinalizedIterator{contract: _L1StandardBridge.contract, event: "ERC20BridgeFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20BridgeFinalized is a free log subscription operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20BridgeFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20BridgeFinalized, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20BridgeFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20BridgeFinalized is a log parse operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20BridgeFinalized(log types.Log) (*L1StandardBridgeERC20BridgeFinalized, error) {
+	event := new(L1StandardBridgeERC20BridgeFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeERC20BridgeInitiatedIterator is returned from FilterERC20BridgeInitiated and is used to iterate over the raw logs and unpacked data for ERC20BridgeInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeInitiatedIterator struct {
+	Event *L1StandardBridgeERC20BridgeInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20BridgeInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20BridgeInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20BridgeInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20BridgeInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20BridgeInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20BridgeInitiated represents a ERC20BridgeInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeInitiated struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	Amount      *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20BridgeInitiated is a free log retrieval operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20BridgeInitiated(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*L1StandardBridgeERC20BridgeInitiatedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20BridgeInitiatedIterator{contract: _L1StandardBridge.contract, event: "ERC20BridgeInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20BridgeInitiated is a free log subscription operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20BridgeInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20BridgeInitiated, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20BridgeInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20BridgeInitiated is a log parse operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20BridgeInitiated(log types.Log) (*L1StandardBridgeERC20BridgeInitiated, error) {
+	event := new(L1StandardBridgeERC20BridgeInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeERC20DepositInitiatedIterator is returned from FilterERC20DepositInitiated and is used to iterate over the raw logs and unpacked data for ERC20DepositInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20DepositInitiatedIterator struct {
+	Event *L1StandardBridgeERC20DepositInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20DepositInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20DepositInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20DepositInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20DepositInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20DepositInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20DepositInitiated represents a ERC20DepositInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20DepositInitiated struct {
+	L1Token   common.Address
+	L2Token   common.Address
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20DepositInitiated is a free log retrieval operation binding the contract event 0x718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396.
+//
+// Solidity: event ERC20DepositInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20DepositInitiated(opts *bind.FilterOpts, l1Token []common.Address, l2Token []common.Address, from []common.Address) (*L1StandardBridgeERC20DepositInitiatedIterator, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20DepositInitiated", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20DepositInitiatedIterator{contract: _L1StandardBridge.contract, event: "ERC20DepositInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20DepositInitiated is a free log subscription operation binding the contract event 0x718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396.
+//
+// Solidity: event ERC20DepositInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20DepositInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20DepositInitiated, l1Token []common.Address, l2Token []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20DepositInitiated", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20DepositInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20DepositInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20DepositInitiated is a log parse operation binding the contract event 0x718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396.
+//
+// Solidity: event ERC20DepositInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20DepositInitiated(log types.Log) (*L1StandardBridgeERC20DepositInitiated, error) {
+	event := new(L1StandardBridgeERC20DepositInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20DepositInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeERC20WithdrawalFinalizedIterator is returned from FilterERC20WithdrawalFinalized and is used to iterate over the raw logs and unpacked data for ERC20WithdrawalFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20WithdrawalFinalizedIterator struct {
+	Event *L1StandardBridgeERC20WithdrawalFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20WithdrawalFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20WithdrawalFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20WithdrawalFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20WithdrawalFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20WithdrawalFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20WithdrawalFinalized represents a ERC20WithdrawalFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20WithdrawalFinalized struct {
+	L1Token   common.Address
+	L2Token   common.Address
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20WithdrawalFinalized is a free log retrieval operation binding the contract event 0x3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3.
+//
+// Solidity: event ERC20WithdrawalFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20WithdrawalFinalized(opts *bind.FilterOpts, l1Token []common.Address, l2Token []common.Address, from []common.Address) (*L1StandardBridgeERC20WithdrawalFinalizedIterator, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20WithdrawalFinalized", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20WithdrawalFinalizedIterator{contract: _L1StandardBridge.contract, event: "ERC20WithdrawalFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20WithdrawalFinalized is a free log subscription operation binding the contract event 0x3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3.
+//
+// Solidity: event ERC20WithdrawalFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20WithdrawalFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20WithdrawalFinalized, l1Token []common.Address, l2Token []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20WithdrawalFinalized", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20WithdrawalFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20WithdrawalFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20WithdrawalFinalized is a log parse operation binding the contract event 0x3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3.
+//
+// Solidity: event ERC20WithdrawalFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20WithdrawalFinalized(log types.Log) (*L1StandardBridgeERC20WithdrawalFinalized, error) {
+	event := new(L1StandardBridgeERC20WithdrawalFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20WithdrawalFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHBridgeFinalizedIterator is returned from FilterETHBridgeFinalized and is used to iterate over the raw logs and unpacked data for ETHBridgeFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeFinalizedIterator struct {
+	Event *L1StandardBridgeETHBridgeFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHBridgeFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHBridgeFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHBridgeFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHBridgeFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHBridgeFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHBridgeFinalized represents a ETHBridgeFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeFinalized struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHBridgeFinalized is a free log retrieval operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHBridgeFinalized(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHBridgeFinalizedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHBridgeFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHBridgeFinalizedIterator{contract: _L1StandardBridge.contract, event: "ETHBridgeFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchETHBridgeFinalized is a free log subscription operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHBridgeFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHBridgeFinalized, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHBridgeFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHBridgeFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHBridgeFinalized is a log parse operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHBridgeFinalized(log types.Log) (*L1StandardBridgeETHBridgeFinalized, error) {
+	event := new(L1StandardBridgeETHBridgeFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHBridgeInitiatedIterator is returned from FilterETHBridgeInitiated and is used to iterate over the raw logs and unpacked data for ETHBridgeInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeInitiatedIterator struct {
+	Event *L1StandardBridgeETHBridgeInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHBridgeInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHBridgeInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHBridgeInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHBridgeInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHBridgeInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHBridgeInitiated represents a ETHBridgeInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeInitiated struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHBridgeInitiated is a free log retrieval operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHBridgeInitiated(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHBridgeInitiatedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHBridgeInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHBridgeInitiatedIterator{contract: _L1StandardBridge.contract, event: "ETHBridgeInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchETHBridgeInitiated is a free log subscription operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHBridgeInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHBridgeInitiated, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHBridgeInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHBridgeInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHBridgeInitiated is a log parse operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHBridgeInitiated(log types.Log) (*L1StandardBridgeETHBridgeInitiated, error) {
+	event := new(L1StandardBridgeETHBridgeInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHDepositInitiatedIterator is returned from FilterETHDepositInitiated and is used to iterate over the raw logs and unpacked data for ETHDepositInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHDepositInitiatedIterator struct {
+	Event *L1StandardBridgeETHDepositInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHDepositInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHDepositInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHDepositInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHDepositInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHDepositInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHDepositInitiated represents a ETHDepositInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHDepositInitiated struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHDepositInitiated is a free log retrieval operation binding the contract event 0x35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23.
+//
+// Solidity: event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHDepositInitiated(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHDepositInitiatedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHDepositInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHDepositInitiatedIterator{contract: _L1StandardBridge.contract, event: "ETHDepositInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchETHDepositInitiated is a free log subscription operation binding the contract event 0x35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23.
+//
+// Solidity: event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHDepositInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHDepositInitiated, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHDepositInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHDepositInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHDepositInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHDepositInitiated is a log parse operation binding the contract event 0x35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23.
+//
+// Solidity: event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHDepositInitiated(log types.Log) (*L1StandardBridgeETHDepositInitiated, error) {
+	event := new(L1StandardBridgeETHDepositInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHDepositInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHWithdrawalFinalizedIterator is returned from FilterETHWithdrawalFinalized and is used to iterate over the raw logs and unpacked data for ETHWithdrawalFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHWithdrawalFinalizedIterator struct {
+	Event *L1StandardBridgeETHWithdrawalFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHWithdrawalFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHWithdrawalFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHWithdrawalFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHWithdrawalFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHWithdrawalFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHWithdrawalFinalized represents a ETHWithdrawalFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHWithdrawalFinalized struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHWithdrawalFinalized is a free log retrieval operation binding the contract event 0x2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631.
+//
+// Solidity: event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHWithdrawalFinalized(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHWithdrawalFinalizedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHWithdrawalFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHWithdrawalFinalizedIterator{contract: _L1StandardBridge.contract, event: "ETHWithdrawalFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchETHWithdrawalFinalized is a free log subscription operation binding the contract event 0x2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631.
+//
+// Solidity: event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHWithdrawalFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHWithdrawalFinalized, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHWithdrawalFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHWithdrawalFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHWithdrawalFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHWithdrawalFinalized is a log parse operation binding the contract event 0x2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631.
+//
+// Solidity: event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHWithdrawalFinalized(log types.Log) (*L1StandardBridgeETHWithdrawalFinalized, error) {
+	event := new(L1StandardBridgeETHWithdrawalFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHWithdrawalFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L1StandardBridge contract.
+type L1StandardBridgeInitializedIterator struct {
+	Event *L1StandardBridgeInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeInitialized represents a Initialized event raised by the L1StandardBridge contract.
+type L1StandardBridgeInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterInitialized(opts *bind.FilterOpts) (*L1StandardBridgeInitializedIterator, error) {
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeInitializedIterator{contract: _L1StandardBridge.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeInitialized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseInitialized(log types.Log) (*L1StandardBridgeInitialized, error) {
+	event := new(L1StandardBridgeInitialized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-chain-ops/upgrades/bindings/l2outputoracle.go b/op-chain-ops/upgrades/bindings/l2outputoracle.go
new file mode 100644
index 000000000000..b6a5b649b4d9
--- /dev/null
+++ b/op-chain-ops/upgrades/bindings/l2outputoracle.go
@@ -0,0 +1,1351 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// TypesOutputProposal is an auto generated low-level Go binding around an user-defined struct.
+type TypesOutputProposal struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2BlockNumber *big.Int
+}
+
+// L2OutputOracleMetaData contains all meta data concerning the L2OutputOracle contract.
+var L2OutputOracleMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CHALLENGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_BLOCK_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROPOSER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUBMISSION_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"challenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"computeL2Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"}],\"name\":\"deleteL2Outputs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"}],\"name\":\"getL2Output\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"}],\"internalType\":\"structTypes.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2OutputAfter\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"}],\"internalType\":\"structTypes.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2OutputIndexAfter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionInterval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BlockTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestOutputIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextOutputIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_l1BlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l1BlockNumber\",\"type\":\"uint256\"}],\"name\":\"proposeL2Output\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"submissionInterval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2OutputIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\"}],\"name\":\"OutputProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"prevNextOutputIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newNextOutputIndex\",\"type\":\"uint256\"}],\"name\":\"OutputsDeleted\",\"type\":\"event\"}]",
+}
+
+// L2OutputOracleABI is the input ABI used to generate the binding from.
+// Deprecated: Use L2OutputOracleMetaData.ABI instead.
+var L2OutputOracleABI = L2OutputOracleMetaData.ABI
+
+// L2OutputOracle is an auto generated Go binding around an Ethereum contract.
+type L2OutputOracle struct {
+	L2OutputOracleCaller     // Read-only binding to the contract
+	L2OutputOracleTransactor // Write-only binding to the contract
+	L2OutputOracleFilterer   // Log filterer for contract events
+}
+
+// L2OutputOracleCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L2OutputOracleCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L2OutputOracleTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L2OutputOracleFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L2OutputOracleSession struct {
+	Contract     *L2OutputOracle   // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// L2OutputOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L2OutputOracleCallerSession struct {
+	Contract *L2OutputOracleCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts         // Call options to use throughout this session
+}
+
+// L2OutputOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L2OutputOracleTransactorSession struct {
+	Contract     *L2OutputOracleTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
+}
+
+// L2OutputOracleRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L2OutputOracleRaw struct {
+	Contract *L2OutputOracle // Generic contract binding to access the raw methods on
+}
+
+// L2OutputOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L2OutputOracleCallerRaw struct {
+	Contract *L2OutputOracleCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L2OutputOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L2OutputOracleTransactorRaw struct {
+	Contract *L2OutputOracleTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL2OutputOracle creates a new instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracle(address common.Address, backend bind.ContractBackend) (*L2OutputOracle, error) {
+	contract, err := bindL2OutputOracle(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracle{L2OutputOracleCaller: L2OutputOracleCaller{contract: contract}, L2OutputOracleTransactor: L2OutputOracleTransactor{contract: contract}, L2OutputOracleFilterer: L2OutputOracleFilterer{contract: contract}}, nil
+}
+
+// NewL2OutputOracleCaller creates a new read-only instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleCaller(address common.Address, caller bind.ContractCaller) (*L2OutputOracleCaller, error) {
+	contract, err := bindL2OutputOracle(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleCaller{contract: contract}, nil
+}
+
+// NewL2OutputOracleTransactor creates a new write-only instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*L2OutputOracleTransactor, error) {
+	contract, err := bindL2OutputOracle(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleTransactor{contract: contract}, nil
+}
+
+// NewL2OutputOracleFilterer creates a new log filterer instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleFilterer(address common.Address, filterer bind.ContractFilterer) (*L2OutputOracleFilterer, error) {
+	contract, err := bindL2OutputOracle(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleFilterer{contract: contract}, nil
+}
+
+// bindL2OutputOracle binds a generic wrapper to an already deployed contract.
+func bindL2OutputOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L2OutputOracleABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2OutputOracle *L2OutputOracleRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2OutputOracle.Contract.L2OutputOracleCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2OutputOracle *L2OutputOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.L2OutputOracleTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2OutputOracle *L2OutputOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.L2OutputOracleTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2OutputOracle *L2OutputOracleCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2OutputOracle.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2OutputOracle *L2OutputOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2OutputOracle *L2OutputOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.contract.Transact(opts, method, params...)
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) CHALLENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "CHALLENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) CHALLENGER() (common.Address, error) {
+	return _L2OutputOracle.Contract.CHALLENGER(&_L2OutputOracle.CallOpts)
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) CHALLENGER() (common.Address, error) {
+	return _L2OutputOracle.Contract.CHALLENGER(&_L2OutputOracle.CallOpts)
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) FINALIZATIONPERIODSECONDS(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "FINALIZATION_PERIOD_SECONDS")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) FINALIZATIONPERIODSECONDS() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FINALIZATIONPERIODSECONDS(&_L2OutputOracle.CallOpts)
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) FINALIZATIONPERIODSECONDS() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FINALIZATIONPERIODSECONDS(&_L2OutputOracle.CallOpts)
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) L2BLOCKTIME(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "L2_BLOCK_TIME")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) L2BLOCKTIME() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BLOCKTIME(&_L2OutputOracle.CallOpts)
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) L2BLOCKTIME() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BLOCKTIME(&_L2OutputOracle.CallOpts)
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) PROPOSER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "PROPOSER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) PROPOSER() (common.Address, error) {
+	return _L2OutputOracle.Contract.PROPOSER(&_L2OutputOracle.CallOpts)
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) PROPOSER() (common.Address, error) {
+	return _L2OutputOracle.Contract.PROPOSER(&_L2OutputOracle.CallOpts)
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) SUBMISSIONINTERVAL(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "SUBMISSION_INTERVAL")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) SUBMISSIONINTERVAL() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SUBMISSIONINTERVAL(&_L2OutputOracle.CallOpts)
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) SUBMISSIONINTERVAL() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SUBMISSIONINTERVAL(&_L2OutputOracle.CallOpts)
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) Challenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "challenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) Challenger() (common.Address, error) {
+	return _L2OutputOracle.Contract.Challenger(&_L2OutputOracle.CallOpts)
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Challenger() (common.Address, error) {
+	return _L2OutputOracle.Contract.Challenger(&_L2OutputOracle.CallOpts)
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) ComputeL2Timestamp(opts *bind.CallOpts, _l2BlockNumber *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "computeL2Timestamp", _l2BlockNumber)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) ComputeL2Timestamp(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.ComputeL2Timestamp(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) ComputeL2Timestamp(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.ComputeL2Timestamp(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) FinalizationPeriodSeconds(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "finalizationPeriodSeconds")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) FinalizationPeriodSeconds() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FinalizationPeriodSeconds(&_L2OutputOracle.CallOpts)
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) FinalizationPeriodSeconds() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FinalizationPeriodSeconds(&_L2OutputOracle.CallOpts)
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2Output(opts *bind.CallOpts, _l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2Output", _l2OutputIndex)
+
+	if err != nil {
+		return *new(TypesOutputProposal), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(TypesOutputProposal)).(*TypesOutputProposal)
+
+	return out0, err
+
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleSession) GetL2Output(_l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2Output(&_L2OutputOracle.CallOpts, _l2OutputIndex)
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2Output(_l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2Output(&_L2OutputOracle.CallOpts, _l2OutputIndex)
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2OutputAfter(opts *bind.CallOpts, _l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2OutputAfter", _l2BlockNumber)
+
+	if err != nil {
+		return *new(TypesOutputProposal), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(TypesOutputProposal)).(*TypesOutputProposal)
+
+	return out0, err
+
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleSession) GetL2OutputAfter(_l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2OutputAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2OutputAfter(_l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2OutputAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2OutputIndexAfter(opts *bind.CallOpts, _l2BlockNumber *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2OutputIndexAfter", _l2BlockNumber)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) GetL2OutputIndexAfter(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.GetL2OutputIndexAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2OutputIndexAfter(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.GetL2OutputIndexAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) L2BlockTime(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "l2BlockTime")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) L2BlockTime() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BlockTime(&_L2OutputOracle.CallOpts)
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) L2BlockTime() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BlockTime(&_L2OutputOracle.CallOpts)
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) LatestBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "latestBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) LatestBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) LatestBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) LatestOutputIndex(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "latestOutputIndex")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) LatestOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) LatestOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) NextBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "nextBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) NextBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) NextBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) NextOutputIndex(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "nextOutputIndex")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) NextOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) NextOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) Proposer(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "proposer")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) Proposer() (common.Address, error) {
+	return _L2OutputOracle.Contract.Proposer(&_L2OutputOracle.CallOpts)
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Proposer() (common.Address, error) {
+	return _L2OutputOracle.Contract.Proposer(&_L2OutputOracle.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) StartingBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "startingBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) StartingBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) StartingBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) StartingTimestamp(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "startingTimestamp")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) StartingTimestamp() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingTimestamp(&_L2OutputOracle.CallOpts)
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) StartingTimestamp() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingTimestamp(&_L2OutputOracle.CallOpts)
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) SubmissionInterval(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "submissionInterval")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) SubmissionInterval() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SubmissionInterval(&_L2OutputOracle.CallOpts)
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) SubmissionInterval() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SubmissionInterval(&_L2OutputOracle.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleSession) Version() (string, error) {
+	return _L2OutputOracle.Contract.Version(&_L2OutputOracle.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Version() (string, error) {
+	return _L2OutputOracle.Contract.Version(&_L2OutputOracle.CallOpts)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) DeleteL2Outputs(opts *bind.TransactOpts, _l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "deleteL2Outputs", _l2OutputIndex)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleSession) DeleteL2Outputs(_l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.DeleteL2Outputs(&_L2OutputOracle.TransactOpts, _l2OutputIndex)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) DeleteL2Outputs(_l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.DeleteL2Outputs(&_L2OutputOracle.TransactOpts, _l2OutputIndex)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) Initialize(opts *bind.TransactOpts, _submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "initialize", _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleSession) Initialize(_submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) Initialize(_submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) ProposeL2Output(opts *bind.TransactOpts, _outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "proposeL2Output", _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleSession) ProposeL2Output(_outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.ProposeL2Output(&_L2OutputOracle.TransactOpts, _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) ProposeL2Output(_outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.ProposeL2Output(&_L2OutputOracle.TransactOpts, _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// L2OutputOracleInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L2OutputOracle contract.
+type L2OutputOracleInitializedIterator struct {
+	Event *L2OutputOracleInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleInitialized represents a Initialized event raised by the L2OutputOracle contract.
+type L2OutputOracleInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterInitialized(opts *bind.FilterOpts) (*L2OutputOracleInitializedIterator, error) {
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleInitializedIterator{contract: _L2OutputOracle.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L2OutputOracleInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleInitialized)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseInitialized(log types.Log) (*L2OutputOracleInitialized, error) {
+	event := new(L2OutputOracleInitialized)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2OutputOracleOutputProposedIterator is returned from FilterOutputProposed and is used to iterate over the raw logs and unpacked data for OutputProposed events raised by the L2OutputOracle contract.
+type L2OutputOracleOutputProposedIterator struct {
+	Event *L2OutputOracleOutputProposed // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleOutputProposedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleOutputProposed)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleOutputProposed)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleOutputProposedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleOutputProposedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleOutputProposed represents a OutputProposed event raised by the L2OutputOracle contract.
+type L2OutputOracleOutputProposed struct {
+	OutputRoot    [32]byte
+	L2OutputIndex *big.Int
+	L2BlockNumber *big.Int
+	L1Timestamp   *big.Int
+	Raw           types.Log // Blockchain specific contextual infos
+}
+
+// FilterOutputProposed is a free log retrieval operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputProposed(opts *bind.FilterOpts, outputRoot [][32]byte, l2OutputIndex []*big.Int, l2BlockNumber []*big.Int) (*L2OutputOracleOutputProposedIterator, error) {
+
+	var outputRootRule []interface{}
+	for _, outputRootItem := range outputRoot {
+		outputRootRule = append(outputRootRule, outputRootItem)
+	}
+	var l2OutputIndexRule []interface{}
+	for _, l2OutputIndexItem := range l2OutputIndex {
+		l2OutputIndexRule = append(l2OutputIndexRule, l2OutputIndexItem)
+	}
+	var l2BlockNumberRule []interface{}
+	for _, l2BlockNumberItem := range l2BlockNumber {
+		l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputProposed", outputRootRule, l2OutputIndexRule, l2BlockNumberRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleOutputProposedIterator{contract: _L2OutputOracle.contract, event: "OutputProposed", logs: logs, sub: sub}, nil
+}
+
+// WatchOutputProposed is a free log subscription operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputProposed(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputProposed, outputRoot [][32]byte, l2OutputIndex []*big.Int, l2BlockNumber []*big.Int) (event.Subscription, error) {
+
+	var outputRootRule []interface{}
+	for _, outputRootItem := range outputRoot {
+		outputRootRule = append(outputRootRule, outputRootItem)
+	}
+	var l2OutputIndexRule []interface{}
+	for _, l2OutputIndexItem := range l2OutputIndex {
+		l2OutputIndexRule = append(l2OutputIndexRule, l2OutputIndexItem)
+	}
+	var l2BlockNumberRule []interface{}
+	for _, l2BlockNumberItem := range l2BlockNumber {
+		l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputProposed", outputRootRule, l2OutputIndexRule, l2BlockNumberRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleOutputProposed)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "OutputProposed", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOutputProposed is a log parse operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseOutputProposed(log types.Log) (*L2OutputOracleOutputProposed, error) {
+	event := new(L2OutputOracleOutputProposed)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "OutputProposed", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2OutputOracleOutputsDeletedIterator is returned from FilterOutputsDeleted and is used to iterate over the raw logs and unpacked data for OutputsDeleted events raised by the L2OutputOracle contract.
+type L2OutputOracleOutputsDeletedIterator struct {
+	Event *L2OutputOracleOutputsDeleted // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleOutputsDeletedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleOutputsDeleted)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleOutputsDeleted)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleOutputsDeletedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleOutputsDeletedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleOutputsDeleted represents a OutputsDeleted event raised by the L2OutputOracle contract.
+type L2OutputOracleOutputsDeleted struct {
+	PrevNextOutputIndex *big.Int
+	NewNextOutputIndex  *big.Int
+	Raw                 types.Log // Blockchain specific contextual infos
+}
+
+// FilterOutputsDeleted is a free log retrieval operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputsDeleted(opts *bind.FilterOpts, prevNextOutputIndex []*big.Int, newNextOutputIndex []*big.Int) (*L2OutputOracleOutputsDeletedIterator, error) {
+
+	var prevNextOutputIndexRule []interface{}
+	for _, prevNextOutputIndexItem := range prevNextOutputIndex {
+		prevNextOutputIndexRule = append(prevNextOutputIndexRule, prevNextOutputIndexItem)
+	}
+	var newNextOutputIndexRule []interface{}
+	for _, newNextOutputIndexItem := range newNextOutputIndex {
+		newNextOutputIndexRule = append(newNextOutputIndexRule, newNextOutputIndexItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputsDeleted", prevNextOutputIndexRule, newNextOutputIndexRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleOutputsDeletedIterator{contract: _L2OutputOracle.contract, event: "OutputsDeleted", logs: logs, sub: sub}, nil
+}
+
+// WatchOutputsDeleted is a free log subscription operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputsDeleted(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputsDeleted, prevNextOutputIndex []*big.Int, newNextOutputIndex []*big.Int) (event.Subscription, error) {
+
+	var prevNextOutputIndexRule []interface{}
+	for _, prevNextOutputIndexItem := range prevNextOutputIndex {
+		prevNextOutputIndexRule = append(prevNextOutputIndexRule, prevNextOutputIndexItem)
+	}
+	var newNextOutputIndexRule []interface{}
+	for _, newNextOutputIndexItem := range newNextOutputIndex {
+		newNextOutputIndexRule = append(newNextOutputIndexRule, newNextOutputIndexItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputsDeleted", prevNextOutputIndexRule, newNextOutputIndexRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleOutputsDeleted)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "OutputsDeleted", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOutputsDeleted is a log parse operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseOutputsDeleted(log types.Log) (*L2OutputOracleOutputsDeleted, error) {
+	event := new(L2OutputOracleOutputsDeleted)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "OutputsDeleted", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-chain-ops/upgrades/bindings/optimismmintableerc20factory.go b/op-chain-ops/upgrades/bindings/optimismmintableerc20factory.go
new file mode 100644
index 000000000000..35db648e678e
--- /dev/null
+++ b/op-chain-ops/upgrades/bindings/optimismmintableerc20factory.go
@@ -0,0 +1,798 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// OptimismMintableERC20FactoryMetaData contains all meta data concerning the OptimismMintableERC20Factory contract.
+var OptimismMintableERC20FactoryMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BRIDGE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"createOptimismMintableERC20\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"name\":\"createOptimismMintableERC20WithDecimals\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"createStandardL2Token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridge\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"deployer\",\"type\":\"address\"}],\"name\":\"OptimismMintableERC20Created\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"name\":\"StandardL2TokenCreated\",\"type\":\"event\"}]",
+}
+
+// OptimismMintableERC20FactoryABI is the input ABI used to generate the binding from.
+// Deprecated: Use OptimismMintableERC20FactoryMetaData.ABI instead.
+var OptimismMintableERC20FactoryABI = OptimismMintableERC20FactoryMetaData.ABI
+
+// OptimismMintableERC20Factory is an auto generated Go binding around an Ethereum contract.
+type OptimismMintableERC20Factory struct {
+	OptimismMintableERC20FactoryCaller     // Read-only binding to the contract
+	OptimismMintableERC20FactoryTransactor // Write-only binding to the contract
+	OptimismMintableERC20FactoryFilterer   // Log filterer for contract events
+}
+
+// OptimismMintableERC20FactoryCaller is an auto generated read-only Go binding around an Ethereum contract.
+type OptimismMintableERC20FactoryCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismMintableERC20FactoryTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type OptimismMintableERC20FactoryTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismMintableERC20FactoryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type OptimismMintableERC20FactoryFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismMintableERC20FactorySession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type OptimismMintableERC20FactorySession struct {
+	Contract     *OptimismMintableERC20Factory // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts                 // Call options to use throughout this session
+	TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
+}
+
+// OptimismMintableERC20FactoryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type OptimismMintableERC20FactoryCallerSession struct {
+	Contract *OptimismMintableERC20FactoryCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts                       // Call options to use throughout this session
+}
+
+// OptimismMintableERC20FactoryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type OptimismMintableERC20FactoryTransactorSession struct {
+	Contract     *OptimismMintableERC20FactoryTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts                       // Transaction auth options to use throughout this session
+}
+
+// OptimismMintableERC20FactoryRaw is an auto generated low-level Go binding around an Ethereum contract.
+type OptimismMintableERC20FactoryRaw struct {
+	Contract *OptimismMintableERC20Factory // Generic contract binding to access the raw methods on
+}
+
+// OptimismMintableERC20FactoryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type OptimismMintableERC20FactoryCallerRaw struct {
+	Contract *OptimismMintableERC20FactoryCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// OptimismMintableERC20FactoryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type OptimismMintableERC20FactoryTransactorRaw struct {
+	Contract *OptimismMintableERC20FactoryTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewOptimismMintableERC20Factory creates a new instance of OptimismMintableERC20Factory, bound to a specific deployed contract.
+func NewOptimismMintableERC20Factory(address common.Address, backend bind.ContractBackend) (*OptimismMintableERC20Factory, error) {
+	contract, err := bindOptimismMintableERC20Factory(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismMintableERC20Factory{OptimismMintableERC20FactoryCaller: OptimismMintableERC20FactoryCaller{contract: contract}, OptimismMintableERC20FactoryTransactor: OptimismMintableERC20FactoryTransactor{contract: contract}, OptimismMintableERC20FactoryFilterer: OptimismMintableERC20FactoryFilterer{contract: contract}}, nil
+}
+
+// NewOptimismMintableERC20FactoryCaller creates a new read-only instance of OptimismMintableERC20Factory, bound to a specific deployed contract.
+func NewOptimismMintableERC20FactoryCaller(address common.Address, caller bind.ContractCaller) (*OptimismMintableERC20FactoryCaller, error) {
+	contract, err := bindOptimismMintableERC20Factory(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismMintableERC20FactoryCaller{contract: contract}, nil
+}
+
+// NewOptimismMintableERC20FactoryTransactor creates a new write-only instance of OptimismMintableERC20Factory, bound to a specific deployed contract.
+func NewOptimismMintableERC20FactoryTransactor(address common.Address, transactor bind.ContractTransactor) (*OptimismMintableERC20FactoryTransactor, error) {
+	contract, err := bindOptimismMintableERC20Factory(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismMintableERC20FactoryTransactor{contract: contract}, nil
+}
+
+// NewOptimismMintableERC20FactoryFilterer creates a new log filterer instance of OptimismMintableERC20Factory, bound to a specific deployed contract.
+func NewOptimismMintableERC20FactoryFilterer(address common.Address, filterer bind.ContractFilterer) (*OptimismMintableERC20FactoryFilterer, error) {
+	contract, err := bindOptimismMintableERC20Factory(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismMintableERC20FactoryFilterer{contract: contract}, nil
+}
+
+// bindOptimismMintableERC20Factory binds a generic wrapper to an already deployed contract.
+func bindOptimismMintableERC20Factory(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(OptimismMintableERC20FactoryABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismMintableERC20Factory.Contract.OptimismMintableERC20FactoryCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.OptimismMintableERC20FactoryTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.OptimismMintableERC20FactoryTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismMintableERC20Factory.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.contract.Transact(opts, method, params...)
+}
+
+// BRIDGE is a free data retrieval call binding the contract method 0xee9a31a2.
+//
+// Solidity: function BRIDGE() view returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryCaller) BRIDGE(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismMintableERC20Factory.contract.Call(opts, &out, "BRIDGE")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// BRIDGE is a free data retrieval call binding the contract method 0xee9a31a2.
+//
+// Solidity: function BRIDGE() view returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactorySession) BRIDGE() (common.Address, error) {
+	return _OptimismMintableERC20Factory.Contract.BRIDGE(&_OptimismMintableERC20Factory.CallOpts)
+}
+
+// BRIDGE is a free data retrieval call binding the contract method 0xee9a31a2.
+//
+// Solidity: function BRIDGE() view returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryCallerSession) BRIDGE() (common.Address, error) {
+	return _OptimismMintableERC20Factory.Contract.BRIDGE(&_OptimismMintableERC20Factory.CallOpts)
+}
+
+// Bridge is a free data retrieval call binding the contract method 0xe78cea92.
+//
+// Solidity: function bridge() view returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryCaller) Bridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismMintableERC20Factory.contract.Call(opts, &out, "bridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Bridge is a free data retrieval call binding the contract method 0xe78cea92.
+//
+// Solidity: function bridge() view returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactorySession) Bridge() (common.Address, error) {
+	return _OptimismMintableERC20Factory.Contract.Bridge(&_OptimismMintableERC20Factory.CallOpts)
+}
+
+// Bridge is a free data retrieval call binding the contract method 0xe78cea92.
+//
+// Solidity: function bridge() view returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryCallerSession) Bridge() (common.Address, error) {
+	return _OptimismMintableERC20Factory.Contract.Bridge(&_OptimismMintableERC20Factory.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _OptimismMintableERC20Factory.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactorySession) Version() (string, error) {
+	return _OptimismMintableERC20Factory.Contract.Version(&_OptimismMintableERC20Factory.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryCallerSession) Version() (string, error) {
+	return _OptimismMintableERC20Factory.Contract.Version(&_OptimismMintableERC20Factory.CallOpts)
+}
+
+// CreateOptimismMintableERC20 is a paid mutator transaction binding the contract method 0xce5ac90f.
+//
+// Solidity: function createOptimismMintableERC20(address _remoteToken, string _name, string _symbol) returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryTransactor) CreateOptimismMintableERC20(opts *bind.TransactOpts, _remoteToken common.Address, _name string, _symbol string) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.contract.Transact(opts, "createOptimismMintableERC20", _remoteToken, _name, _symbol)
+}
+
+// CreateOptimismMintableERC20 is a paid mutator transaction binding the contract method 0xce5ac90f.
+//
+// Solidity: function createOptimismMintableERC20(address _remoteToken, string _name, string _symbol) returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactorySession) CreateOptimismMintableERC20(_remoteToken common.Address, _name string, _symbol string) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.CreateOptimismMintableERC20(&_OptimismMintableERC20Factory.TransactOpts, _remoteToken, _name, _symbol)
+}
+
+// CreateOptimismMintableERC20 is a paid mutator transaction binding the contract method 0xce5ac90f.
+//
+// Solidity: function createOptimismMintableERC20(address _remoteToken, string _name, string _symbol) returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryTransactorSession) CreateOptimismMintableERC20(_remoteToken common.Address, _name string, _symbol string) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.CreateOptimismMintableERC20(&_OptimismMintableERC20Factory.TransactOpts, _remoteToken, _name, _symbol)
+}
+
+// CreateOptimismMintableERC20WithDecimals is a paid mutator transaction binding the contract method 0x8cf0629c.
+//
+// Solidity: function createOptimismMintableERC20WithDecimals(address _remoteToken, string _name, string _symbol, uint8 _decimals) returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryTransactor) CreateOptimismMintableERC20WithDecimals(opts *bind.TransactOpts, _remoteToken common.Address, _name string, _symbol string, _decimals uint8) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.contract.Transact(opts, "createOptimismMintableERC20WithDecimals", _remoteToken, _name, _symbol, _decimals)
+}
+
+// CreateOptimismMintableERC20WithDecimals is a paid mutator transaction binding the contract method 0x8cf0629c.
+//
+// Solidity: function createOptimismMintableERC20WithDecimals(address _remoteToken, string _name, string _symbol, uint8 _decimals) returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactorySession) CreateOptimismMintableERC20WithDecimals(_remoteToken common.Address, _name string, _symbol string, _decimals uint8) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.CreateOptimismMintableERC20WithDecimals(&_OptimismMintableERC20Factory.TransactOpts, _remoteToken, _name, _symbol, _decimals)
+}
+
+// CreateOptimismMintableERC20WithDecimals is a paid mutator transaction binding the contract method 0x8cf0629c.
+//
+// Solidity: function createOptimismMintableERC20WithDecimals(address _remoteToken, string _name, string _symbol, uint8 _decimals) returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryTransactorSession) CreateOptimismMintableERC20WithDecimals(_remoteToken common.Address, _name string, _symbol string, _decimals uint8) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.CreateOptimismMintableERC20WithDecimals(&_OptimismMintableERC20Factory.TransactOpts, _remoteToken, _name, _symbol, _decimals)
+}
+
+// CreateStandardL2Token is a paid mutator transaction binding the contract method 0x896f93d1.
+//
+// Solidity: function createStandardL2Token(address _remoteToken, string _name, string _symbol) returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryTransactor) CreateStandardL2Token(opts *bind.TransactOpts, _remoteToken common.Address, _name string, _symbol string) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.contract.Transact(opts, "createStandardL2Token", _remoteToken, _name, _symbol)
+}
+
+// CreateStandardL2Token is a paid mutator transaction binding the contract method 0x896f93d1.
+//
+// Solidity: function createStandardL2Token(address _remoteToken, string _name, string _symbol) returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactorySession) CreateStandardL2Token(_remoteToken common.Address, _name string, _symbol string) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.CreateStandardL2Token(&_OptimismMintableERC20Factory.TransactOpts, _remoteToken, _name, _symbol)
+}
+
+// CreateStandardL2Token is a paid mutator transaction binding the contract method 0x896f93d1.
+//
+// Solidity: function createStandardL2Token(address _remoteToken, string _name, string _symbol) returns(address)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryTransactorSession) CreateStandardL2Token(_remoteToken common.Address, _name string, _symbol string) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.CreateStandardL2Token(&_OptimismMintableERC20Factory.TransactOpts, _remoteToken, _name, _symbol)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _bridge) returns()
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryTransactor) Initialize(opts *bind.TransactOpts, _bridge common.Address) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.contract.Transact(opts, "initialize", _bridge)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _bridge) returns()
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactorySession) Initialize(_bridge common.Address) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.Initialize(&_OptimismMintableERC20Factory.TransactOpts, _bridge)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _bridge) returns()
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryTransactorSession) Initialize(_bridge common.Address) (*types.Transaction, error) {
+	return _OptimismMintableERC20Factory.Contract.Initialize(&_OptimismMintableERC20Factory.TransactOpts, _bridge)
+}
+
+// OptimismMintableERC20FactoryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the OptimismMintableERC20Factory contract.
+type OptimismMintableERC20FactoryInitializedIterator struct {
+	Event *OptimismMintableERC20FactoryInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismMintableERC20FactoryInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismMintableERC20FactoryInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismMintableERC20FactoryInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismMintableERC20FactoryInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismMintableERC20FactoryInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismMintableERC20FactoryInitialized represents a Initialized event raised by the OptimismMintableERC20Factory contract.
+type OptimismMintableERC20FactoryInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryFilterer) FilterInitialized(opts *bind.FilterOpts) (*OptimismMintableERC20FactoryInitializedIterator, error) {
+
+	logs, sub, err := _OptimismMintableERC20Factory.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismMintableERC20FactoryInitializedIterator{contract: _OptimismMintableERC20Factory.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *OptimismMintableERC20FactoryInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _OptimismMintableERC20Factory.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismMintableERC20FactoryInitialized)
+				if err := _OptimismMintableERC20Factory.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryFilterer) ParseInitialized(log types.Log) (*OptimismMintableERC20FactoryInitialized, error) {
+	event := new(OptimismMintableERC20FactoryInitialized)
+	if err := _OptimismMintableERC20Factory.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismMintableERC20FactoryOptimismMintableERC20CreatedIterator is returned from FilterOptimismMintableERC20Created and is used to iterate over the raw logs and unpacked data for OptimismMintableERC20Created events raised by the OptimismMintableERC20Factory contract.
+type OptimismMintableERC20FactoryOptimismMintableERC20CreatedIterator struct {
+	Event *OptimismMintableERC20FactoryOptimismMintableERC20Created // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismMintableERC20FactoryOptimismMintableERC20CreatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismMintableERC20FactoryOptimismMintableERC20Created)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismMintableERC20FactoryOptimismMintableERC20Created)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismMintableERC20FactoryOptimismMintableERC20CreatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismMintableERC20FactoryOptimismMintableERC20CreatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismMintableERC20FactoryOptimismMintableERC20Created represents a OptimismMintableERC20Created event raised by the OptimismMintableERC20Factory contract.
+type OptimismMintableERC20FactoryOptimismMintableERC20Created struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	Deployer    common.Address
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterOptimismMintableERC20Created is a free log retrieval operation binding the contract event 0x52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb.
+//
+// Solidity: event OptimismMintableERC20Created(address indexed localToken, address indexed remoteToken, address deployer)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryFilterer) FilterOptimismMintableERC20Created(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address) (*OptimismMintableERC20FactoryOptimismMintableERC20CreatedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+
+	logs, sub, err := _OptimismMintableERC20Factory.contract.FilterLogs(opts, "OptimismMintableERC20Created", localTokenRule, remoteTokenRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismMintableERC20FactoryOptimismMintableERC20CreatedIterator{contract: _OptimismMintableERC20Factory.contract, event: "OptimismMintableERC20Created", logs: logs, sub: sub}, nil
+}
+
+// WatchOptimismMintableERC20Created is a free log subscription operation binding the contract event 0x52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb.
+//
+// Solidity: event OptimismMintableERC20Created(address indexed localToken, address indexed remoteToken, address deployer)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryFilterer) WatchOptimismMintableERC20Created(opts *bind.WatchOpts, sink chan<- *OptimismMintableERC20FactoryOptimismMintableERC20Created, localToken []common.Address, remoteToken []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+
+	logs, sub, err := _OptimismMintableERC20Factory.contract.WatchLogs(opts, "OptimismMintableERC20Created", localTokenRule, remoteTokenRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismMintableERC20FactoryOptimismMintableERC20Created)
+				if err := _OptimismMintableERC20Factory.contract.UnpackLog(event, "OptimismMintableERC20Created", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOptimismMintableERC20Created is a log parse operation binding the contract event 0x52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb.
+//
+// Solidity: event OptimismMintableERC20Created(address indexed localToken, address indexed remoteToken, address deployer)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryFilterer) ParseOptimismMintableERC20Created(log types.Log) (*OptimismMintableERC20FactoryOptimismMintableERC20Created, error) {
+	event := new(OptimismMintableERC20FactoryOptimismMintableERC20Created)
+	if err := _OptimismMintableERC20Factory.contract.UnpackLog(event, "OptimismMintableERC20Created", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismMintableERC20FactoryStandardL2TokenCreatedIterator is returned from FilterStandardL2TokenCreated and is used to iterate over the raw logs and unpacked data for StandardL2TokenCreated events raised by the OptimismMintableERC20Factory contract.
+type OptimismMintableERC20FactoryStandardL2TokenCreatedIterator struct {
+	Event *OptimismMintableERC20FactoryStandardL2TokenCreated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismMintableERC20FactoryStandardL2TokenCreatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismMintableERC20FactoryStandardL2TokenCreated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismMintableERC20FactoryStandardL2TokenCreated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismMintableERC20FactoryStandardL2TokenCreatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismMintableERC20FactoryStandardL2TokenCreatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismMintableERC20FactoryStandardL2TokenCreated represents a StandardL2TokenCreated event raised by the OptimismMintableERC20Factory contract.
+type OptimismMintableERC20FactoryStandardL2TokenCreated struct {
+	RemoteToken common.Address
+	LocalToken  common.Address
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterStandardL2TokenCreated is a free log retrieval operation binding the contract event 0xceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf.
+//
+// Solidity: event StandardL2TokenCreated(address indexed remoteToken, address indexed localToken)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryFilterer) FilterStandardL2TokenCreated(opts *bind.FilterOpts, remoteToken []common.Address, localToken []common.Address) (*OptimismMintableERC20FactoryStandardL2TokenCreatedIterator, error) {
+
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+
+	logs, sub, err := _OptimismMintableERC20Factory.contract.FilterLogs(opts, "StandardL2TokenCreated", remoteTokenRule, localTokenRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismMintableERC20FactoryStandardL2TokenCreatedIterator{contract: _OptimismMintableERC20Factory.contract, event: "StandardL2TokenCreated", logs: logs, sub: sub}, nil
+}
+
+// WatchStandardL2TokenCreated is a free log subscription operation binding the contract event 0xceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf.
+//
+// Solidity: event StandardL2TokenCreated(address indexed remoteToken, address indexed localToken)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryFilterer) WatchStandardL2TokenCreated(opts *bind.WatchOpts, sink chan<- *OptimismMintableERC20FactoryStandardL2TokenCreated, remoteToken []common.Address, localToken []common.Address) (event.Subscription, error) {
+
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+
+	logs, sub, err := _OptimismMintableERC20Factory.contract.WatchLogs(opts, "StandardL2TokenCreated", remoteTokenRule, localTokenRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismMintableERC20FactoryStandardL2TokenCreated)
+				if err := _OptimismMintableERC20Factory.contract.UnpackLog(event, "StandardL2TokenCreated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseStandardL2TokenCreated is a log parse operation binding the contract event 0xceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf.
+//
+// Solidity: event StandardL2TokenCreated(address indexed remoteToken, address indexed localToken)
+func (_OptimismMintableERC20Factory *OptimismMintableERC20FactoryFilterer) ParseStandardL2TokenCreated(log types.Log) (*OptimismMintableERC20FactoryStandardL2TokenCreated, error) {
+	event := new(OptimismMintableERC20FactoryStandardL2TokenCreated)
+	if err := _OptimismMintableERC20Factory.contract.UnpackLog(event, "StandardL2TokenCreated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-chain-ops/upgrades/bindings/optimismportal.go b/op-chain-ops/upgrades/bindings/optimismportal.go
new file mode 100644
index 000000000000..55907ecff109
--- /dev/null
+++ b/op-chain-ops/upgrades/bindings/optimismportal.go
@@ -0,0 +1,1411 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// TypesOutputRootProof is an auto generated low-level Go binding around an user-defined struct.
+type TypesOutputRootProof struct {
+	Version                  [32]byte
+	StateRoot                [32]byte
+	MessagePasserStorageRoot [32]byte
+	LatestBlockhash          [32]byte
+}
+
+// TypesWithdrawalTransaction is an auto generated low-level Go binding around an user-defined struct.
+type TypesWithdrawalTransaction struct {
+	Nonce    *big.Int
+	Sender   common.Address
+	Target   common.Address
+	Value    *big.Int
+	GasLimit *big.Int
+	Data     []byte
+}
+
+// OptimismPortalMetaData contains all meta data concerning the OptimismPortal contract.
+var OptimismPortalMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"},{\"inputs\":[],\"name\":\"balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_mint\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositERC20Transaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"donateETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"structTypes.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"guardian\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"_l2Oracle\",\"type\":\"address\"},{\"internalType\":\"contractSystemConfig\",\"name\":\"_systemConfig\",\"type\":\"address\"},{\"internalType\":\"contractSuperchainConfig\",\"name\":\"_superchainConfig\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"}],\"name\":\"isOutputFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Oracle\",\"outputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_byteCount\",\"type\":\"uint64\"}],\"name\":\"minimumGasLimit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"paused_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"structTypes.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structTypes.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\"}],\"name\":\"proveWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"provenWithdrawals\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2OutputIndex\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_name\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_symbol\",\"type\":\"bytes32\"}],\"name\":\"setGasPayingToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superchainConfig\",\"outputs\":[{\"internalType\":\"contractSuperchainConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"systemConfig\",\"outputs\":[{\"internalType\":\"contractSystemConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"opaqueData\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"WithdrawalProven\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BadTarget\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CallPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasEstimation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LargeCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonReentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCustomGasToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfGas\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SmallGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unauthorized\",\"type\":\"error\"}]",
+}
+
+// OptimismPortalABI is the input ABI used to generate the binding from.
+// Deprecated: Use OptimismPortalMetaData.ABI instead.
+var OptimismPortalABI = OptimismPortalMetaData.ABI
+
+// OptimismPortal is an auto generated Go binding around an Ethereum contract.
+type OptimismPortal struct {
+	OptimismPortalCaller     // Read-only binding to the contract
+	OptimismPortalTransactor // Write-only binding to the contract
+	OptimismPortalFilterer   // Log filterer for contract events
+}
+
+// OptimismPortalCaller is an auto generated read-only Go binding around an Ethereum contract.
+type OptimismPortalCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type OptimismPortalTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type OptimismPortalFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type OptimismPortalSession struct {
+	Contract     *OptimismPortal   // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// OptimismPortalCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type OptimismPortalCallerSession struct {
+	Contract *OptimismPortalCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts         // Call options to use throughout this session
+}
+
+// OptimismPortalTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type OptimismPortalTransactorSession struct {
+	Contract     *OptimismPortalTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
+}
+
+// OptimismPortalRaw is an auto generated low-level Go binding around an Ethereum contract.
+type OptimismPortalRaw struct {
+	Contract *OptimismPortal // Generic contract binding to access the raw methods on
+}
+
+// OptimismPortalCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type OptimismPortalCallerRaw struct {
+	Contract *OptimismPortalCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// OptimismPortalTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type OptimismPortalTransactorRaw struct {
+	Contract *OptimismPortalTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewOptimismPortal creates a new instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortal(address common.Address, backend bind.ContractBackend) (*OptimismPortal, error) {
+	contract, err := bindOptimismPortal(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal{OptimismPortalCaller: OptimismPortalCaller{contract: contract}, OptimismPortalTransactor: OptimismPortalTransactor{contract: contract}, OptimismPortalFilterer: OptimismPortalFilterer{contract: contract}}, nil
+}
+
+// NewOptimismPortalCaller creates a new read-only instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalCaller(address common.Address, caller bind.ContractCaller) (*OptimismPortalCaller, error) {
+	contract, err := bindOptimismPortal(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalCaller{contract: contract}, nil
+}
+
+// NewOptimismPortalTransactor creates a new write-only instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalTransactor(address common.Address, transactor bind.ContractTransactor) (*OptimismPortalTransactor, error) {
+	contract, err := bindOptimismPortal(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalTransactor{contract: contract}, nil
+}
+
+// NewOptimismPortalFilterer creates a new log filterer instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalFilterer(address common.Address, filterer bind.ContractFilterer) (*OptimismPortalFilterer, error) {
+	contract, err := bindOptimismPortal(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalFilterer{contract: contract}, nil
+}
+
+// bindOptimismPortal binds a generic wrapper to an already deployed contract.
+func bindOptimismPortal(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(OptimismPortalABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismPortal *OptimismPortalRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismPortal.Contract.OptimismPortalCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismPortal *OptimismPortalRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.OptimismPortalTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismPortal *OptimismPortalRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.OptimismPortalTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismPortal *OptimismPortalCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismPortal.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismPortal *OptimismPortalTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismPortal *OptimismPortalTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.contract.Transact(opts, method, params...)
+}
+
+// Balance is a free data retrieval call binding the contract method 0xb69ef8a8.
+//
+// Solidity: function balance() view returns(uint256)
+func (_OptimismPortal *OptimismPortalCaller) Balance(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "balance")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Balance is a free data retrieval call binding the contract method 0xb69ef8a8.
+//
+// Solidity: function balance() view returns(uint256)
+func (_OptimismPortal *OptimismPortalSession) Balance() (*big.Int, error) {
+	return _OptimismPortal.Contract.Balance(&_OptimismPortal.CallOpts)
+}
+
+// Balance is a free data retrieval call binding the contract method 0xb69ef8a8.
+//
+// Solidity: function balance() view returns(uint256)
+func (_OptimismPortal *OptimismPortalCallerSession) Balance() (*big.Int, error) {
+	return _OptimismPortal.Contract.Balance(&_OptimismPortal.CallOpts)
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalCaller) FinalizedWithdrawals(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "finalizedWithdrawals", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalSession) FinalizedWithdrawals(arg0 [32]byte) (bool, error) {
+	return _OptimismPortal.Contract.FinalizedWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalCallerSession) FinalizedWithdrawals(arg0 [32]byte) (bool, error) {
+	return _OptimismPortal.Contract.FinalizedWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) Guardian(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "guardian")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) Guardian() (common.Address, error) {
+	return _OptimismPortal.Contract.Guardian(&_OptimismPortal.CallOpts)
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) Guardian() (common.Address, error) {
+	return _OptimismPortal.Contract.Guardian(&_OptimismPortal.CallOpts)
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalCaller) IsOutputFinalized(opts *bind.CallOpts, _l2OutputIndex *big.Int) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "isOutputFinalized", _l2OutputIndex)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalSession) IsOutputFinalized(_l2OutputIndex *big.Int) (bool, error) {
+	return _OptimismPortal.Contract.IsOutputFinalized(&_OptimismPortal.CallOpts, _l2OutputIndex)
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalCallerSession) IsOutputFinalized(_l2OutputIndex *big.Int) (bool, error) {
+	return _OptimismPortal.Contract.IsOutputFinalized(&_OptimismPortal.CallOpts, _l2OutputIndex)
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) L2Oracle(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "l2Oracle")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) L2Oracle() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Oracle(&_OptimismPortal.CallOpts)
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) L2Oracle() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Oracle(&_OptimismPortal.CallOpts)
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) L2Sender(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "l2Sender")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) L2Sender() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Sender(&_OptimismPortal.CallOpts)
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) L2Sender() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Sender(&_OptimismPortal.CallOpts)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalCaller) MinimumGasLimit(opts *bind.CallOpts, _byteCount uint64) (uint64, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "minimumGasLimit", _byteCount)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalSession) MinimumGasLimit(_byteCount uint64) (uint64, error) {
+	return _OptimismPortal.Contract.MinimumGasLimit(&_OptimismPortal.CallOpts, _byteCount)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalCallerSession) MinimumGasLimit(_byteCount uint64) (uint64, error) {
+	return _OptimismPortal.Contract.MinimumGasLimit(&_OptimismPortal.CallOpts, _byteCount)
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalCaller) Params(opts *bind.CallOpts) (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "params")
+
+	outstruct := new(struct {
+		PrevBaseFee   *big.Int
+		PrevBoughtGas uint64
+		PrevBlockNum  uint64
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.PrevBaseFee = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+	outstruct.PrevBoughtGas = *abi.ConvertType(out[1], new(uint64)).(*uint64)
+	outstruct.PrevBlockNum = *abi.ConvertType(out[2], new(uint64)).(*uint64)
+
+	return *outstruct, err
+
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalSession) Params() (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	return _OptimismPortal.Contract.Params(&_OptimismPortal.CallOpts)
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalCallerSession) Params() (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	return _OptimismPortal.Contract.Params(&_OptimismPortal.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalSession) Paused() (bool, error) {
+	return _OptimismPortal.Contract.Paused(&_OptimismPortal.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalCallerSession) Paused() (bool, error) {
+	return _OptimismPortal.Contract.Paused(&_OptimismPortal.CallOpts)
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalCaller) ProvenWithdrawals(opts *bind.CallOpts, arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "provenWithdrawals", arg0)
+
+	outstruct := new(struct {
+		OutputRoot    [32]byte
+		Timestamp     *big.Int
+		L2OutputIndex *big.Int
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.OutputRoot = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+	outstruct.Timestamp = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
+	outstruct.L2OutputIndex = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int)
+
+	return *outstruct, err
+
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalSession) ProvenWithdrawals(arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	return _OptimismPortal.Contract.ProvenWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalCallerSession) ProvenWithdrawals(arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	return _OptimismPortal.Contract.ProvenWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) SuperchainConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SuperchainConfig(&_OptimismPortal.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) SuperchainConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SuperchainConfig(&_OptimismPortal.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) SystemConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "systemConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) SystemConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SystemConfig(&_OptimismPortal.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) SystemConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SystemConfig(&_OptimismPortal.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalSession) Version() (string, error) {
+	return _OptimismPortal.Contract.Version(&_OptimismPortal.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalCallerSession) Version() (string, error) {
+	return _OptimismPortal.Contract.Version(&_OptimismPortal.CallOpts)
+}
+
+// DepositERC20Transaction is a paid mutator transaction binding the contract method 0x149f2f22.
+//
+// Solidity: function depositERC20Transaction(address _to, uint256 _mint, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) returns()
+func (_OptimismPortal *OptimismPortalTransactor) DepositERC20Transaction(opts *bind.TransactOpts, _to common.Address, _mint *big.Int, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "depositERC20Transaction", _to, _mint, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositERC20Transaction is a paid mutator transaction binding the contract method 0x149f2f22.
+//
+// Solidity: function depositERC20Transaction(address _to, uint256 _mint, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) returns()
+func (_OptimismPortal *OptimismPortalSession) DepositERC20Transaction(_to common.Address, _mint *big.Int, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositERC20Transaction(&_OptimismPortal.TransactOpts, _to, _mint, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositERC20Transaction is a paid mutator transaction binding the contract method 0x149f2f22.
+//
+// Solidity: function depositERC20Transaction(address _to, uint256 _mint, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) DepositERC20Transaction(_to common.Address, _mint *big.Int, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositERC20Transaction(&_OptimismPortal.TransactOpts, _to, _mint, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) DepositTransaction(opts *bind.TransactOpts, _to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "depositTransaction", _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalSession) DepositTransaction(_to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositTransaction(&_OptimismPortal.TransactOpts, _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) DepositTransaction(_to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositTransaction(&_OptimismPortal.TransactOpts, _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) DonateETH(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "donateETH")
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalSession) DonateETH() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DonateETH(&_OptimismPortal.TransactOpts)
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) DonateETH() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DonateETH(&_OptimismPortal.TransactOpts)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalTransactor) FinalizeWithdrawalTransaction(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "finalizeWithdrawalTransaction", _tx)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalSession) FinalizeWithdrawalTransaction(_tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) FinalizeWithdrawalTransaction(_tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalTransactor) Initialize(opts *bind.TransactOpts, _l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "initialize", _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalSession) Initialize(_l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Initialize(&_OptimismPortal.TransactOpts, _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) Initialize(_l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Initialize(&_OptimismPortal.TransactOpts, _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalTransactor) ProveWithdrawalTransaction(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "proveWithdrawalTransaction", _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalSession) ProveWithdrawalTransaction(_tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.ProveWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) ProveWithdrawalTransaction(_tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.ProveWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_OptimismPortal *OptimismPortalTransactor) SetGasPayingToken(opts *bind.TransactOpts, _token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "setGasPayingToken", _token, _decimals, _name, _symbol)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_OptimismPortal *OptimismPortalSession) SetGasPayingToken(_token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.SetGasPayingToken(&_OptimismPortal.TransactOpts, _token, _decimals, _name, _symbol)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) SetGasPayingToken(_token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.SetGasPayingToken(&_OptimismPortal.TransactOpts, _token, _decimals, _name, _symbol)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalSession) Receive() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Receive(&_OptimismPortal.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) Receive() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Receive(&_OptimismPortal.TransactOpts)
+}
+
+// OptimismPortalInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the OptimismPortal contract.
+type OptimismPortalInitializedIterator struct {
+	Event *OptimismPortalInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalInitialized represents a Initialized event raised by the OptimismPortal contract.
+type OptimismPortalInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) FilterInitialized(opts *bind.FilterOpts) (*OptimismPortalInitializedIterator, error) {
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalInitializedIterator{contract: _OptimismPortal.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *OptimismPortalInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalInitialized)
+				if err := _OptimismPortal.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) ParseInitialized(log types.Log) (*OptimismPortalInitialized, error) {
+	event := new(OptimismPortalInitialized)
+	if err := _OptimismPortal.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalTransactionDepositedIterator is returned from FilterTransactionDeposited and is used to iterate over the raw logs and unpacked data for TransactionDeposited events raised by the OptimismPortal contract.
+type OptimismPortalTransactionDepositedIterator struct {
+	Event *OptimismPortalTransactionDeposited // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalTransactionDepositedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalTransactionDeposited)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalTransactionDeposited)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalTransactionDepositedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalTransactionDepositedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalTransactionDeposited represents a TransactionDeposited event raised by the OptimismPortal contract.
+type OptimismPortalTransactionDeposited struct {
+	From       common.Address
+	To         common.Address
+	Version    *big.Int
+	OpaqueData []byte
+	Raw        types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransactionDeposited is a free log retrieval operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) FilterTransactionDeposited(opts *bind.FilterOpts, from []common.Address, to []common.Address, version []*big.Int) (*OptimismPortalTransactionDepositedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "TransactionDeposited", fromRule, toRule, versionRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalTransactionDepositedIterator{contract: _OptimismPortal.contract, event: "TransactionDeposited", logs: logs, sub: sub}, nil
+}
+
+// WatchTransactionDeposited is a free log subscription operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) WatchTransactionDeposited(opts *bind.WatchOpts, sink chan<- *OptimismPortalTransactionDeposited, from []common.Address, to []common.Address, version []*big.Int) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "TransactionDeposited", fromRule, toRule, versionRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalTransactionDeposited)
+				if err := _OptimismPortal.contract.UnpackLog(event, "TransactionDeposited", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseTransactionDeposited is a log parse operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) ParseTransactionDeposited(log types.Log) (*OptimismPortalTransactionDeposited, error) {
+	event := new(OptimismPortalTransactionDeposited)
+	if err := _OptimismPortal.contract.UnpackLog(event, "TransactionDeposited", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalWithdrawalFinalizedIterator is returned from FilterWithdrawalFinalized and is used to iterate over the raw logs and unpacked data for WithdrawalFinalized events raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalFinalizedIterator struct {
+	Event *OptimismPortalWithdrawalFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalWithdrawalFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalWithdrawalFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalWithdrawalFinalized represents a WithdrawalFinalized event raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalFinalized struct {
+	WithdrawalHash [32]byte
+	Success        bool
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawalFinalized is a free log retrieval operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) FilterWithdrawalFinalized(opts *bind.FilterOpts, withdrawalHash [][32]byte) (*OptimismPortalWithdrawalFinalizedIterator, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "WithdrawalFinalized", withdrawalHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalWithdrawalFinalizedIterator{contract: _OptimismPortal.contract, event: "WithdrawalFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawalFinalized is a free log subscription operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) WatchWithdrawalFinalized(opts *bind.WatchOpts, sink chan<- *OptimismPortalWithdrawalFinalized, withdrawalHash [][32]byte) (event.Subscription, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "WithdrawalFinalized", withdrawalHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalWithdrawalFinalized)
+				if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawalFinalized is a log parse operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) ParseWithdrawalFinalized(log types.Log) (*OptimismPortalWithdrawalFinalized, error) {
+	event := new(OptimismPortalWithdrawalFinalized)
+	if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalWithdrawalProvenIterator is returned from FilterWithdrawalProven and is used to iterate over the raw logs and unpacked data for WithdrawalProven events raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalProvenIterator struct {
+	Event *OptimismPortalWithdrawalProven // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalWithdrawalProvenIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalWithdrawalProven)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalWithdrawalProven)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalWithdrawalProvenIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalWithdrawalProvenIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalWithdrawalProven represents a WithdrawalProven event raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalProven struct {
+	WithdrawalHash [32]byte
+	From           common.Address
+	To             common.Address
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawalProven is a free log retrieval operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) FilterWithdrawalProven(opts *bind.FilterOpts, withdrawalHash [][32]byte, from []common.Address, to []common.Address) (*OptimismPortalWithdrawalProvenIterator, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "WithdrawalProven", withdrawalHashRule, fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalWithdrawalProvenIterator{contract: _OptimismPortal.contract, event: "WithdrawalProven", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawalProven is a free log subscription operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) WatchWithdrawalProven(opts *bind.WatchOpts, sink chan<- *OptimismPortalWithdrawalProven, withdrawalHash [][32]byte, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "WithdrawalProven", withdrawalHashRule, fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalWithdrawalProven)
+				if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalProven", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawalProven is a log parse operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) ParseWithdrawalProven(log types.Log) (*OptimismPortalWithdrawalProven, error) {
+	event := new(OptimismPortalWithdrawalProven)
+	if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalProven", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-chain-ops/upgrades/bindings/proxyadmin.go b/op-chain-ops/upgrades/bindings/proxyadmin.go
new file mode 100644
index 000000000000..942c71c3000c
--- /dev/null
+++ b/op-chain-ops/upgrades/bindings/proxyadmin.go
@@ -0,0 +1,760 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// ProxyAdminMetaData contains all meta data concerning the ProxyAdmin contract.
+var ProxyAdminMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"contractAddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_proxy\",\"type\":\"address\"}],\"name\":\"getProxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_proxy\",\"type\":\"address\"}],\"name\":\"getProxyImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"implementationName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isUpgrading\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"proxyType\",\"outputs\":[{\"internalType\":\"enumProxyAdmin.ProxyType\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractAddressManager\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddressManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"setImplementationName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"enumProxyAdmin.ProxyType\",\"name\":\"_type\",\"type\":\"uint8\"}],\"name\":\"setProxyType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_upgrading\",\"type\":\"bool\"}],\"name\":\"setUpgrading\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"name\":\"upgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"upgradeAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"}]",
+}
+
+// ProxyAdminABI is the input ABI used to generate the binding from.
+// Deprecated: Use ProxyAdminMetaData.ABI instead.
+var ProxyAdminABI = ProxyAdminMetaData.ABI
+
+// ProxyAdmin is an auto generated Go binding around an Ethereum contract.
+type ProxyAdmin struct {
+	ProxyAdminCaller     // Read-only binding to the contract
+	ProxyAdminTransactor // Write-only binding to the contract
+	ProxyAdminFilterer   // Log filterer for contract events
+}
+
+// ProxyAdminCaller is an auto generated read-only Go binding around an Ethereum contract.
+type ProxyAdminCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ProxyAdminTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type ProxyAdminTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ProxyAdminFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type ProxyAdminFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ProxyAdminSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type ProxyAdminSession struct {
+	Contract     *ProxyAdmin       // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ProxyAdminCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type ProxyAdminCallerSession struct {
+	Contract *ProxyAdminCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts     // Call options to use throughout this session
+}
+
+// ProxyAdminTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type ProxyAdminTransactorSession struct {
+	Contract     *ProxyAdminTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts     // Transaction auth options to use throughout this session
+}
+
+// ProxyAdminRaw is an auto generated low-level Go binding around an Ethereum contract.
+type ProxyAdminRaw struct {
+	Contract *ProxyAdmin // Generic contract binding to access the raw methods on
+}
+
+// ProxyAdminCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type ProxyAdminCallerRaw struct {
+	Contract *ProxyAdminCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// ProxyAdminTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type ProxyAdminTransactorRaw struct {
+	Contract *ProxyAdminTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewProxyAdmin creates a new instance of ProxyAdmin, bound to a specific deployed contract.
+func NewProxyAdmin(address common.Address, backend bind.ContractBackend) (*ProxyAdmin, error) {
+	contract, err := bindProxyAdmin(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &ProxyAdmin{ProxyAdminCaller: ProxyAdminCaller{contract: contract}, ProxyAdminTransactor: ProxyAdminTransactor{contract: contract}, ProxyAdminFilterer: ProxyAdminFilterer{contract: contract}}, nil
+}
+
+// NewProxyAdminCaller creates a new read-only instance of ProxyAdmin, bound to a specific deployed contract.
+func NewProxyAdminCaller(address common.Address, caller bind.ContractCaller) (*ProxyAdminCaller, error) {
+	contract, err := bindProxyAdmin(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &ProxyAdminCaller{contract: contract}, nil
+}
+
+// NewProxyAdminTransactor creates a new write-only instance of ProxyAdmin, bound to a specific deployed contract.
+func NewProxyAdminTransactor(address common.Address, transactor bind.ContractTransactor) (*ProxyAdminTransactor, error) {
+	contract, err := bindProxyAdmin(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &ProxyAdminTransactor{contract: contract}, nil
+}
+
+// NewProxyAdminFilterer creates a new log filterer instance of ProxyAdmin, bound to a specific deployed contract.
+func NewProxyAdminFilterer(address common.Address, filterer bind.ContractFilterer) (*ProxyAdminFilterer, error) {
+	contract, err := bindProxyAdmin(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &ProxyAdminFilterer{contract: contract}, nil
+}
+
+// bindProxyAdmin binds a generic wrapper to an already deployed contract.
+func bindProxyAdmin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(ProxyAdminABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ProxyAdmin *ProxyAdminRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _ProxyAdmin.Contract.ProxyAdminCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ProxyAdmin *ProxyAdminRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.ProxyAdminTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ProxyAdmin *ProxyAdminRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.ProxyAdminTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ProxyAdmin *ProxyAdminCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _ProxyAdmin.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ProxyAdmin *ProxyAdminTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ProxyAdmin *ProxyAdminTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.contract.Transact(opts, method, params...)
+}
+
+// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f.
+//
+// Solidity: function addressManager() view returns(address)
+func (_ProxyAdmin *ProxyAdminCaller) AddressManager(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _ProxyAdmin.contract.Call(opts, &out, "addressManager")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f.
+//
+// Solidity: function addressManager() view returns(address)
+func (_ProxyAdmin *ProxyAdminSession) AddressManager() (common.Address, error) {
+	return _ProxyAdmin.Contract.AddressManager(&_ProxyAdmin.CallOpts)
+}
+
+// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f.
+//
+// Solidity: function addressManager() view returns(address)
+func (_ProxyAdmin *ProxyAdminCallerSession) AddressManager() (common.Address, error) {
+	return _ProxyAdmin.Contract.AddressManager(&_ProxyAdmin.CallOpts)
+}
+
+// GetProxyAdmin is a free data retrieval call binding the contract method 0xf3b7dead.
+//
+// Solidity: function getProxyAdmin(address _proxy) view returns(address)
+func (_ProxyAdmin *ProxyAdminCaller) GetProxyAdmin(opts *bind.CallOpts, _proxy common.Address) (common.Address, error) {
+	var out []interface{}
+	err := _ProxyAdmin.contract.Call(opts, &out, "getProxyAdmin", _proxy)
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// GetProxyAdmin is a free data retrieval call binding the contract method 0xf3b7dead.
+//
+// Solidity: function getProxyAdmin(address _proxy) view returns(address)
+func (_ProxyAdmin *ProxyAdminSession) GetProxyAdmin(_proxy common.Address) (common.Address, error) {
+	return _ProxyAdmin.Contract.GetProxyAdmin(&_ProxyAdmin.CallOpts, _proxy)
+}
+
+// GetProxyAdmin is a free data retrieval call binding the contract method 0xf3b7dead.
+//
+// Solidity: function getProxyAdmin(address _proxy) view returns(address)
+func (_ProxyAdmin *ProxyAdminCallerSession) GetProxyAdmin(_proxy common.Address) (common.Address, error) {
+	return _ProxyAdmin.Contract.GetProxyAdmin(&_ProxyAdmin.CallOpts, _proxy)
+}
+
+// GetProxyImplementation is a free data retrieval call binding the contract method 0x204e1c7a.
+//
+// Solidity: function getProxyImplementation(address _proxy) view returns(address)
+func (_ProxyAdmin *ProxyAdminCaller) GetProxyImplementation(opts *bind.CallOpts, _proxy common.Address) (common.Address, error) {
+	var out []interface{}
+	err := _ProxyAdmin.contract.Call(opts, &out, "getProxyImplementation", _proxy)
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// GetProxyImplementation is a free data retrieval call binding the contract method 0x204e1c7a.
+//
+// Solidity: function getProxyImplementation(address _proxy) view returns(address)
+func (_ProxyAdmin *ProxyAdminSession) GetProxyImplementation(_proxy common.Address) (common.Address, error) {
+	return _ProxyAdmin.Contract.GetProxyImplementation(&_ProxyAdmin.CallOpts, _proxy)
+}
+
+// GetProxyImplementation is a free data retrieval call binding the contract method 0x204e1c7a.
+//
+// Solidity: function getProxyImplementation(address _proxy) view returns(address)
+func (_ProxyAdmin *ProxyAdminCallerSession) GetProxyImplementation(_proxy common.Address) (common.Address, error) {
+	return _ProxyAdmin.Contract.GetProxyImplementation(&_ProxyAdmin.CallOpts, _proxy)
+}
+
+// ImplementationName is a free data retrieval call binding the contract method 0x238181ae.
+//
+// Solidity: function implementationName(address ) view returns(string)
+func (_ProxyAdmin *ProxyAdminCaller) ImplementationName(opts *bind.CallOpts, arg0 common.Address) (string, error) {
+	var out []interface{}
+	err := _ProxyAdmin.contract.Call(opts, &out, "implementationName", arg0)
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// ImplementationName is a free data retrieval call binding the contract method 0x238181ae.
+//
+// Solidity: function implementationName(address ) view returns(string)
+func (_ProxyAdmin *ProxyAdminSession) ImplementationName(arg0 common.Address) (string, error) {
+	return _ProxyAdmin.Contract.ImplementationName(&_ProxyAdmin.CallOpts, arg0)
+}
+
+// ImplementationName is a free data retrieval call binding the contract method 0x238181ae.
+//
+// Solidity: function implementationName(address ) view returns(string)
+func (_ProxyAdmin *ProxyAdminCallerSession) ImplementationName(arg0 common.Address) (string, error) {
+	return _ProxyAdmin.Contract.ImplementationName(&_ProxyAdmin.CallOpts, arg0)
+}
+
+// IsUpgrading is a free data retrieval call binding the contract method 0xb7947262.
+//
+// Solidity: function isUpgrading() view returns(bool)
+func (_ProxyAdmin *ProxyAdminCaller) IsUpgrading(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _ProxyAdmin.contract.Call(opts, &out, "isUpgrading")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// IsUpgrading is a free data retrieval call binding the contract method 0xb7947262.
+//
+// Solidity: function isUpgrading() view returns(bool)
+func (_ProxyAdmin *ProxyAdminSession) IsUpgrading() (bool, error) {
+	return _ProxyAdmin.Contract.IsUpgrading(&_ProxyAdmin.CallOpts)
+}
+
+// IsUpgrading is a free data retrieval call binding the contract method 0xb7947262.
+//
+// Solidity: function isUpgrading() view returns(bool)
+func (_ProxyAdmin *ProxyAdminCallerSession) IsUpgrading() (bool, error) {
+	return _ProxyAdmin.Contract.IsUpgrading(&_ProxyAdmin.CallOpts)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_ProxyAdmin *ProxyAdminCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _ProxyAdmin.contract.Call(opts, &out, "owner")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_ProxyAdmin *ProxyAdminSession) Owner() (common.Address, error) {
+	return _ProxyAdmin.Contract.Owner(&_ProxyAdmin.CallOpts)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_ProxyAdmin *ProxyAdminCallerSession) Owner() (common.Address, error) {
+	return _ProxyAdmin.Contract.Owner(&_ProxyAdmin.CallOpts)
+}
+
+// ProxyType is a free data retrieval call binding the contract method 0x6bd9f516.
+//
+// Solidity: function proxyType(address ) view returns(uint8)
+func (_ProxyAdmin *ProxyAdminCaller) ProxyType(opts *bind.CallOpts, arg0 common.Address) (uint8, error) {
+	var out []interface{}
+	err := _ProxyAdmin.contract.Call(opts, &out, "proxyType", arg0)
+
+	if err != nil {
+		return *new(uint8), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
+
+	return out0, err
+
+}
+
+// ProxyType is a free data retrieval call binding the contract method 0x6bd9f516.
+//
+// Solidity: function proxyType(address ) view returns(uint8)
+func (_ProxyAdmin *ProxyAdminSession) ProxyType(arg0 common.Address) (uint8, error) {
+	return _ProxyAdmin.Contract.ProxyType(&_ProxyAdmin.CallOpts, arg0)
+}
+
+// ProxyType is a free data retrieval call binding the contract method 0x6bd9f516.
+//
+// Solidity: function proxyType(address ) view returns(uint8)
+func (_ProxyAdmin *ProxyAdminCallerSession) ProxyType(arg0 common.Address) (uint8, error) {
+	return _ProxyAdmin.Contract.ProxyType(&_ProxyAdmin.CallOpts, arg0)
+}
+
+// ChangeProxyAdmin is a paid mutator transaction binding the contract method 0x7eff275e.
+//
+// Solidity: function changeProxyAdmin(address _proxy, address _newAdmin) returns()
+func (_ProxyAdmin *ProxyAdminTransactor) ChangeProxyAdmin(opts *bind.TransactOpts, _proxy common.Address, _newAdmin common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.contract.Transact(opts, "changeProxyAdmin", _proxy, _newAdmin)
+}
+
+// ChangeProxyAdmin is a paid mutator transaction binding the contract method 0x7eff275e.
+//
+// Solidity: function changeProxyAdmin(address _proxy, address _newAdmin) returns()
+func (_ProxyAdmin *ProxyAdminSession) ChangeProxyAdmin(_proxy common.Address, _newAdmin common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.ChangeProxyAdmin(&_ProxyAdmin.TransactOpts, _proxy, _newAdmin)
+}
+
+// ChangeProxyAdmin is a paid mutator transaction binding the contract method 0x7eff275e.
+//
+// Solidity: function changeProxyAdmin(address _proxy, address _newAdmin) returns()
+func (_ProxyAdmin *ProxyAdminTransactorSession) ChangeProxyAdmin(_proxy common.Address, _newAdmin common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.ChangeProxyAdmin(&_ProxyAdmin.TransactOpts, _proxy, _newAdmin)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_ProxyAdmin *ProxyAdminTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _ProxyAdmin.contract.Transact(opts, "renounceOwnership")
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_ProxyAdmin *ProxyAdminSession) RenounceOwnership() (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.RenounceOwnership(&_ProxyAdmin.TransactOpts)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_ProxyAdmin *ProxyAdminTransactorSession) RenounceOwnership() (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.RenounceOwnership(&_ProxyAdmin.TransactOpts)
+}
+
+// SetAddress is a paid mutator transaction binding the contract method 0x9b2ea4bd.
+//
+// Solidity: function setAddress(string _name, address _address) returns()
+func (_ProxyAdmin *ProxyAdminTransactor) SetAddress(opts *bind.TransactOpts, _name string, _address common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.contract.Transact(opts, "setAddress", _name, _address)
+}
+
+// SetAddress is a paid mutator transaction binding the contract method 0x9b2ea4bd.
+//
+// Solidity: function setAddress(string _name, address _address) returns()
+func (_ProxyAdmin *ProxyAdminSession) SetAddress(_name string, _address common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.SetAddress(&_ProxyAdmin.TransactOpts, _name, _address)
+}
+
+// SetAddress is a paid mutator transaction binding the contract method 0x9b2ea4bd.
+//
+// Solidity: function setAddress(string _name, address _address) returns()
+func (_ProxyAdmin *ProxyAdminTransactorSession) SetAddress(_name string, _address common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.SetAddress(&_ProxyAdmin.TransactOpts, _name, _address)
+}
+
+// SetAddressManager is a paid mutator transaction binding the contract method 0x0652b57a.
+//
+// Solidity: function setAddressManager(address _address) returns()
+func (_ProxyAdmin *ProxyAdminTransactor) SetAddressManager(opts *bind.TransactOpts, _address common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.contract.Transact(opts, "setAddressManager", _address)
+}
+
+// SetAddressManager is a paid mutator transaction binding the contract method 0x0652b57a.
+//
+// Solidity: function setAddressManager(address _address) returns()
+func (_ProxyAdmin *ProxyAdminSession) SetAddressManager(_address common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.SetAddressManager(&_ProxyAdmin.TransactOpts, _address)
+}
+
+// SetAddressManager is a paid mutator transaction binding the contract method 0x0652b57a.
+//
+// Solidity: function setAddressManager(address _address) returns()
+func (_ProxyAdmin *ProxyAdminTransactorSession) SetAddressManager(_address common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.SetAddressManager(&_ProxyAdmin.TransactOpts, _address)
+}
+
+// SetImplementationName is a paid mutator transaction binding the contract method 0x860f7cda.
+//
+// Solidity: function setImplementationName(address _address, string _name) returns()
+func (_ProxyAdmin *ProxyAdminTransactor) SetImplementationName(opts *bind.TransactOpts, _address common.Address, _name string) (*types.Transaction, error) {
+	return _ProxyAdmin.contract.Transact(opts, "setImplementationName", _address, _name)
+}
+
+// SetImplementationName is a paid mutator transaction binding the contract method 0x860f7cda.
+//
+// Solidity: function setImplementationName(address _address, string _name) returns()
+func (_ProxyAdmin *ProxyAdminSession) SetImplementationName(_address common.Address, _name string) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.SetImplementationName(&_ProxyAdmin.TransactOpts, _address, _name)
+}
+
+// SetImplementationName is a paid mutator transaction binding the contract method 0x860f7cda.
+//
+// Solidity: function setImplementationName(address _address, string _name) returns()
+func (_ProxyAdmin *ProxyAdminTransactorSession) SetImplementationName(_address common.Address, _name string) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.SetImplementationName(&_ProxyAdmin.TransactOpts, _address, _name)
+}
+
+// SetProxyType is a paid mutator transaction binding the contract method 0x8d52d4a0.
+//
+// Solidity: function setProxyType(address _address, uint8 _type) returns()
+func (_ProxyAdmin *ProxyAdminTransactor) SetProxyType(opts *bind.TransactOpts, _address common.Address, _type uint8) (*types.Transaction, error) {
+	return _ProxyAdmin.contract.Transact(opts, "setProxyType", _address, _type)
+}
+
+// SetProxyType is a paid mutator transaction binding the contract method 0x8d52d4a0.
+//
+// Solidity: function setProxyType(address _address, uint8 _type) returns()
+func (_ProxyAdmin *ProxyAdminSession) SetProxyType(_address common.Address, _type uint8) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.SetProxyType(&_ProxyAdmin.TransactOpts, _address, _type)
+}
+
+// SetProxyType is a paid mutator transaction binding the contract method 0x8d52d4a0.
+//
+// Solidity: function setProxyType(address _address, uint8 _type) returns()
+func (_ProxyAdmin *ProxyAdminTransactorSession) SetProxyType(_address common.Address, _type uint8) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.SetProxyType(&_ProxyAdmin.TransactOpts, _address, _type)
+}
+
+// SetUpgrading is a paid mutator transaction binding the contract method 0x07c8f7b0.
+//
+// Solidity: function setUpgrading(bool _upgrading) returns()
+func (_ProxyAdmin *ProxyAdminTransactor) SetUpgrading(opts *bind.TransactOpts, _upgrading bool) (*types.Transaction, error) {
+	return _ProxyAdmin.contract.Transact(opts, "setUpgrading", _upgrading)
+}
+
+// SetUpgrading is a paid mutator transaction binding the contract method 0x07c8f7b0.
+//
+// Solidity: function setUpgrading(bool _upgrading) returns()
+func (_ProxyAdmin *ProxyAdminSession) SetUpgrading(_upgrading bool) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.SetUpgrading(&_ProxyAdmin.TransactOpts, _upgrading)
+}
+
+// SetUpgrading is a paid mutator transaction binding the contract method 0x07c8f7b0.
+//
+// Solidity: function setUpgrading(bool _upgrading) returns()
+func (_ProxyAdmin *ProxyAdminTransactorSession) SetUpgrading(_upgrading bool) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.SetUpgrading(&_ProxyAdmin.TransactOpts, _upgrading)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_ProxyAdmin *ProxyAdminTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.contract.Transact(opts, "transferOwnership", newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_ProxyAdmin *ProxyAdminSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.TransferOwnership(&_ProxyAdmin.TransactOpts, newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_ProxyAdmin *ProxyAdminTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.TransferOwnership(&_ProxyAdmin.TransactOpts, newOwner)
+}
+
+// Upgrade is a paid mutator transaction binding the contract method 0x99a88ec4.
+//
+// Solidity: function upgrade(address _proxy, address _implementation) returns()
+func (_ProxyAdmin *ProxyAdminTransactor) Upgrade(opts *bind.TransactOpts, _proxy common.Address, _implementation common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.contract.Transact(opts, "upgrade", _proxy, _implementation)
+}
+
+// Upgrade is a paid mutator transaction binding the contract method 0x99a88ec4.
+//
+// Solidity: function upgrade(address _proxy, address _implementation) returns()
+func (_ProxyAdmin *ProxyAdminSession) Upgrade(_proxy common.Address, _implementation common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.Upgrade(&_ProxyAdmin.TransactOpts, _proxy, _implementation)
+}
+
+// Upgrade is a paid mutator transaction binding the contract method 0x99a88ec4.
+//
+// Solidity: function upgrade(address _proxy, address _implementation) returns()
+func (_ProxyAdmin *ProxyAdminTransactorSession) Upgrade(_proxy common.Address, _implementation common.Address) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.Upgrade(&_ProxyAdmin.TransactOpts, _proxy, _implementation)
+}
+
+// UpgradeAndCall is a paid mutator transaction binding the contract method 0x9623609d.
+//
+// Solidity: function upgradeAndCall(address _proxy, address _implementation, bytes _data) payable returns()
+func (_ProxyAdmin *ProxyAdminTransactor) UpgradeAndCall(opts *bind.TransactOpts, _proxy common.Address, _implementation common.Address, _data []byte) (*types.Transaction, error) {
+	return _ProxyAdmin.contract.Transact(opts, "upgradeAndCall", _proxy, _implementation, _data)
+}
+
+// UpgradeAndCall is a paid mutator transaction binding the contract method 0x9623609d.
+//
+// Solidity: function upgradeAndCall(address _proxy, address _implementation, bytes _data) payable returns()
+func (_ProxyAdmin *ProxyAdminSession) UpgradeAndCall(_proxy common.Address, _implementation common.Address, _data []byte) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.UpgradeAndCall(&_ProxyAdmin.TransactOpts, _proxy, _implementation, _data)
+}
+
+// UpgradeAndCall is a paid mutator transaction binding the contract method 0x9623609d.
+//
+// Solidity: function upgradeAndCall(address _proxy, address _implementation, bytes _data) payable returns()
+func (_ProxyAdmin *ProxyAdminTransactorSession) UpgradeAndCall(_proxy common.Address, _implementation common.Address, _data []byte) (*types.Transaction, error) {
+	return _ProxyAdmin.Contract.UpgradeAndCall(&_ProxyAdmin.TransactOpts, _proxy, _implementation, _data)
+}
+
+// ProxyAdminOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the ProxyAdmin contract.
+type ProxyAdminOwnershipTransferredIterator struct {
+	Event *ProxyAdminOwnershipTransferred // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *ProxyAdminOwnershipTransferredIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(ProxyAdminOwnershipTransferred)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(ProxyAdminOwnershipTransferred)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *ProxyAdminOwnershipTransferredIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ProxyAdminOwnershipTransferredIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// ProxyAdminOwnershipTransferred represents a OwnershipTransferred event raised by the ProxyAdmin contract.
+type ProxyAdminOwnershipTransferred struct {
+	PreviousOwner common.Address
+	NewOwner      common.Address
+	Raw           types.Log // Blockchain specific contextual infos
+}
+
+// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_ProxyAdmin *ProxyAdminFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ProxyAdminOwnershipTransferredIterator, error) {
+
+	var previousOwnerRule []interface{}
+	for _, previousOwnerItem := range previousOwner {
+		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+	}
+	var newOwnerRule []interface{}
+	for _, newOwnerItem := range newOwner {
+		newOwnerRule = append(newOwnerRule, newOwnerItem)
+	}
+
+	logs, sub, err := _ProxyAdmin.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+	if err != nil {
+		return nil, err
+	}
+	return &ProxyAdminOwnershipTransferredIterator{contract: _ProxyAdmin.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_ProxyAdmin *ProxyAdminFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ProxyAdminOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) {
+
+	var previousOwnerRule []interface{}
+	for _, previousOwnerItem := range previousOwner {
+		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+	}
+	var newOwnerRule []interface{}
+	for _, newOwnerItem := range newOwner {
+		newOwnerRule = append(newOwnerRule, newOwnerItem)
+	}
+
+	logs, sub, err := _ProxyAdmin.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(ProxyAdminOwnershipTransferred)
+				if err := _ProxyAdmin.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_ProxyAdmin *ProxyAdminFilterer) ParseOwnershipTransferred(log types.Log) (*ProxyAdminOwnershipTransferred, error) {
+	event := new(ProxyAdminOwnershipTransferred)
+	if err := _ProxyAdmin.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-chain-ops/upgrades/bindings/storagesetter.go b/op-chain-ops/upgrades/bindings/storagesetter.go
new file mode 100644
index 000000000000..c1d45928b476
--- /dev/null
+++ b/op-chain-ops/upgrades/bindings/storagesetter.go
@@ -0,0 +1,446 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// StorageSetterSlot is an auto generated low-level Go binding around an user-defined struct.
+type StorageSetterSlot struct {
+	Key   [32]byte
+	Value [32]byte
+}
+
+// StorageSetterMetaData contains all meta data concerning the StorageSetter contract.
+var StorageSetterMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_slot\",\"type\":\"bytes32\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_slot\",\"type\":\"bytes32\"}],\"name\":\"getBool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"value_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_slot\",\"type\":\"bytes32\"}],\"name\":\"getBytes32\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"value_\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_slot\",\"type\":\"bytes32\"}],\"name\":\"getUint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_slot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_slot\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_value\",\"type\":\"bool\"}],\"name\":\"setBool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"value\",\"type\":\"bytes32\"}],\"internalType\":\"structStorageSetter.Slot[]\",\"name\":\"slots\",\"type\":\"tuple[]\"}],\"name\":\"setBytes32\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_slot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setBytes32\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_slot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"setUint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+}
+
+// StorageSetterABI is the input ABI used to generate the binding from.
+// Deprecated: Use StorageSetterMetaData.ABI instead.
+var StorageSetterABI = StorageSetterMetaData.ABI
+
+// StorageSetter is an auto generated Go binding around an Ethereum contract.
+type StorageSetter struct {
+	StorageSetterCaller     // Read-only binding to the contract
+	StorageSetterTransactor // Write-only binding to the contract
+	StorageSetterFilterer   // Log filterer for contract events
+}
+
+// StorageSetterCaller is an auto generated read-only Go binding around an Ethereum contract.
+type StorageSetterCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// StorageSetterTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type StorageSetterTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// StorageSetterFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type StorageSetterFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// StorageSetterSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type StorageSetterSession struct {
+	Contract     *StorageSetter    // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// StorageSetterCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type StorageSetterCallerSession struct {
+	Contract *StorageSetterCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts        // Call options to use throughout this session
+}
+
+// StorageSetterTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type StorageSetterTransactorSession struct {
+	Contract     *StorageSetterTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
+}
+
+// StorageSetterRaw is an auto generated low-level Go binding around an Ethereum contract.
+type StorageSetterRaw struct {
+	Contract *StorageSetter // Generic contract binding to access the raw methods on
+}
+
+// StorageSetterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type StorageSetterCallerRaw struct {
+	Contract *StorageSetterCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// StorageSetterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type StorageSetterTransactorRaw struct {
+	Contract *StorageSetterTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewStorageSetter creates a new instance of StorageSetter, bound to a specific deployed contract.
+func NewStorageSetter(address common.Address, backend bind.ContractBackend) (*StorageSetter, error) {
+	contract, err := bindStorageSetter(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &StorageSetter{StorageSetterCaller: StorageSetterCaller{contract: contract}, StorageSetterTransactor: StorageSetterTransactor{contract: contract}, StorageSetterFilterer: StorageSetterFilterer{contract: contract}}, nil
+}
+
+// NewStorageSetterCaller creates a new read-only instance of StorageSetter, bound to a specific deployed contract.
+func NewStorageSetterCaller(address common.Address, caller bind.ContractCaller) (*StorageSetterCaller, error) {
+	contract, err := bindStorageSetter(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &StorageSetterCaller{contract: contract}, nil
+}
+
+// NewStorageSetterTransactor creates a new write-only instance of StorageSetter, bound to a specific deployed contract.
+func NewStorageSetterTransactor(address common.Address, transactor bind.ContractTransactor) (*StorageSetterTransactor, error) {
+	contract, err := bindStorageSetter(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &StorageSetterTransactor{contract: contract}, nil
+}
+
+// NewStorageSetterFilterer creates a new log filterer instance of StorageSetter, bound to a specific deployed contract.
+func NewStorageSetterFilterer(address common.Address, filterer bind.ContractFilterer) (*StorageSetterFilterer, error) {
+	contract, err := bindStorageSetter(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &StorageSetterFilterer{contract: contract}, nil
+}
+
+// bindStorageSetter binds a generic wrapper to an already deployed contract.
+func bindStorageSetter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(StorageSetterABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_StorageSetter *StorageSetterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _StorageSetter.Contract.StorageSetterCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_StorageSetter *StorageSetterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _StorageSetter.Contract.StorageSetterTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_StorageSetter *StorageSetterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _StorageSetter.Contract.StorageSetterTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_StorageSetter *StorageSetterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _StorageSetter.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_StorageSetter *StorageSetterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _StorageSetter.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_StorageSetter *StorageSetterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _StorageSetter.Contract.contract.Transact(opts, method, params...)
+}
+
+// GetAddress is a free data retrieval call binding the contract method 0x21f8a721.
+//
+// Solidity: function getAddress(bytes32 _slot) view returns(address addr_)
+func (_StorageSetter *StorageSetterCaller) GetAddress(opts *bind.CallOpts, _slot [32]byte) (common.Address, error) {
+	var out []interface{}
+	err := _StorageSetter.contract.Call(opts, &out, "getAddress", _slot)
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// GetAddress is a free data retrieval call binding the contract method 0x21f8a721.
+//
+// Solidity: function getAddress(bytes32 _slot) view returns(address addr_)
+func (_StorageSetter *StorageSetterSession) GetAddress(_slot [32]byte) (common.Address, error) {
+	return _StorageSetter.Contract.GetAddress(&_StorageSetter.CallOpts, _slot)
+}
+
+// GetAddress is a free data retrieval call binding the contract method 0x21f8a721.
+//
+// Solidity: function getAddress(bytes32 _slot) view returns(address addr_)
+func (_StorageSetter *StorageSetterCallerSession) GetAddress(_slot [32]byte) (common.Address, error) {
+	return _StorageSetter.Contract.GetAddress(&_StorageSetter.CallOpts, _slot)
+}
+
+// GetBool is a free data retrieval call binding the contract method 0x7ae1cfca.
+//
+// Solidity: function getBool(bytes32 _slot) view returns(bool value_)
+func (_StorageSetter *StorageSetterCaller) GetBool(opts *bind.CallOpts, _slot [32]byte) (bool, error) {
+	var out []interface{}
+	err := _StorageSetter.contract.Call(opts, &out, "getBool", _slot)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// GetBool is a free data retrieval call binding the contract method 0x7ae1cfca.
+//
+// Solidity: function getBool(bytes32 _slot) view returns(bool value_)
+func (_StorageSetter *StorageSetterSession) GetBool(_slot [32]byte) (bool, error) {
+	return _StorageSetter.Contract.GetBool(&_StorageSetter.CallOpts, _slot)
+}
+
+// GetBool is a free data retrieval call binding the contract method 0x7ae1cfca.
+//
+// Solidity: function getBool(bytes32 _slot) view returns(bool value_)
+func (_StorageSetter *StorageSetterCallerSession) GetBool(_slot [32]byte) (bool, error) {
+	return _StorageSetter.Contract.GetBool(&_StorageSetter.CallOpts, _slot)
+}
+
+// GetBytes32 is a free data retrieval call binding the contract method 0xa6ed563e.
+//
+// Solidity: function getBytes32(bytes32 _slot) view returns(bytes32 value_)
+func (_StorageSetter *StorageSetterCaller) GetBytes32(opts *bind.CallOpts, _slot [32]byte) ([32]byte, error) {
+	var out []interface{}
+	err := _StorageSetter.contract.Call(opts, &out, "getBytes32", _slot)
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// GetBytes32 is a free data retrieval call binding the contract method 0xa6ed563e.
+//
+// Solidity: function getBytes32(bytes32 _slot) view returns(bytes32 value_)
+func (_StorageSetter *StorageSetterSession) GetBytes32(_slot [32]byte) ([32]byte, error) {
+	return _StorageSetter.Contract.GetBytes32(&_StorageSetter.CallOpts, _slot)
+}
+
+// GetBytes32 is a free data retrieval call binding the contract method 0xa6ed563e.
+//
+// Solidity: function getBytes32(bytes32 _slot) view returns(bytes32 value_)
+func (_StorageSetter *StorageSetterCallerSession) GetBytes32(_slot [32]byte) ([32]byte, error) {
+	return _StorageSetter.Contract.GetBytes32(&_StorageSetter.CallOpts, _slot)
+}
+
+// GetUint is a free data retrieval call binding the contract method 0xbd02d0f5.
+//
+// Solidity: function getUint(bytes32 _slot) view returns(uint256 value_)
+func (_StorageSetter *StorageSetterCaller) GetUint(opts *bind.CallOpts, _slot [32]byte) (*big.Int, error) {
+	var out []interface{}
+	err := _StorageSetter.contract.Call(opts, &out, "getUint", _slot)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetUint is a free data retrieval call binding the contract method 0xbd02d0f5.
+//
+// Solidity: function getUint(bytes32 _slot) view returns(uint256 value_)
+func (_StorageSetter *StorageSetterSession) GetUint(_slot [32]byte) (*big.Int, error) {
+	return _StorageSetter.Contract.GetUint(&_StorageSetter.CallOpts, _slot)
+}
+
+// GetUint is a free data retrieval call binding the contract method 0xbd02d0f5.
+//
+// Solidity: function getUint(bytes32 _slot) view returns(uint256 value_)
+func (_StorageSetter *StorageSetterCallerSession) GetUint(_slot [32]byte) (*big.Int, error) {
+	return _StorageSetter.Contract.GetUint(&_StorageSetter.CallOpts, _slot)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StorageSetter *StorageSetterCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _StorageSetter.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StorageSetter *StorageSetterSession) Version() (string, error) {
+	return _StorageSetter.Contract.Version(&_StorageSetter.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_StorageSetter *StorageSetterCallerSession) Version() (string, error) {
+	return _StorageSetter.Contract.Version(&_StorageSetter.CallOpts)
+}
+
+// SetAddress is a paid mutator transaction binding the contract method 0xca446dd9.
+//
+// Solidity: function setAddress(bytes32 _slot, address _address) returns()
+func (_StorageSetter *StorageSetterTransactor) SetAddress(opts *bind.TransactOpts, _slot [32]byte, _address common.Address) (*types.Transaction, error) {
+	return _StorageSetter.contract.Transact(opts, "setAddress", _slot, _address)
+}
+
+// SetAddress is a paid mutator transaction binding the contract method 0xca446dd9.
+//
+// Solidity: function setAddress(bytes32 _slot, address _address) returns()
+func (_StorageSetter *StorageSetterSession) SetAddress(_slot [32]byte, _address common.Address) (*types.Transaction, error) {
+	return _StorageSetter.Contract.SetAddress(&_StorageSetter.TransactOpts, _slot, _address)
+}
+
+// SetAddress is a paid mutator transaction binding the contract method 0xca446dd9.
+//
+// Solidity: function setAddress(bytes32 _slot, address _address) returns()
+func (_StorageSetter *StorageSetterTransactorSession) SetAddress(_slot [32]byte, _address common.Address) (*types.Transaction, error) {
+	return _StorageSetter.Contract.SetAddress(&_StorageSetter.TransactOpts, _slot, _address)
+}
+
+// SetBool is a paid mutator transaction binding the contract method 0xabfdcced.
+//
+// Solidity: function setBool(bytes32 _slot, bool _value) returns()
+func (_StorageSetter *StorageSetterTransactor) SetBool(opts *bind.TransactOpts, _slot [32]byte, _value bool) (*types.Transaction, error) {
+	return _StorageSetter.contract.Transact(opts, "setBool", _slot, _value)
+}
+
+// SetBool is a paid mutator transaction binding the contract method 0xabfdcced.
+//
+// Solidity: function setBool(bytes32 _slot, bool _value) returns()
+func (_StorageSetter *StorageSetterSession) SetBool(_slot [32]byte, _value bool) (*types.Transaction, error) {
+	return _StorageSetter.Contract.SetBool(&_StorageSetter.TransactOpts, _slot, _value)
+}
+
+// SetBool is a paid mutator transaction binding the contract method 0xabfdcced.
+//
+// Solidity: function setBool(bytes32 _slot, bool _value) returns()
+func (_StorageSetter *StorageSetterTransactorSession) SetBool(_slot [32]byte, _value bool) (*types.Transaction, error) {
+	return _StorageSetter.Contract.SetBool(&_StorageSetter.TransactOpts, _slot, _value)
+}
+
+// SetBytes32 is a paid mutator transaction binding the contract method 0x0528afe2.
+//
+// Solidity: function setBytes32((bytes32,bytes32)[] slots) returns()
+func (_StorageSetter *StorageSetterTransactor) SetBytes32(opts *bind.TransactOpts, slots []StorageSetterSlot) (*types.Transaction, error) {
+	return _StorageSetter.contract.Transact(opts, "setBytes32", slots)
+}
+
+// SetBytes32 is a paid mutator transaction binding the contract method 0x0528afe2.
+//
+// Solidity: function setBytes32((bytes32,bytes32)[] slots) returns()
+func (_StorageSetter *StorageSetterSession) SetBytes32(slots []StorageSetterSlot) (*types.Transaction, error) {
+	return _StorageSetter.Contract.SetBytes32(&_StorageSetter.TransactOpts, slots)
+}
+
+// SetBytes32 is a paid mutator transaction binding the contract method 0x0528afe2.
+//
+// Solidity: function setBytes32((bytes32,bytes32)[] slots) returns()
+func (_StorageSetter *StorageSetterTransactorSession) SetBytes32(slots []StorageSetterSlot) (*types.Transaction, error) {
+	return _StorageSetter.Contract.SetBytes32(&_StorageSetter.TransactOpts, slots)
+}
+
+// SetBytes320 is a paid mutator transaction binding the contract method 0x4e91db08.
+//
+// Solidity: function setBytes32(bytes32 _slot, bytes32 _value) returns()
+func (_StorageSetter *StorageSetterTransactor) SetBytes320(opts *bind.TransactOpts, _slot [32]byte, _value [32]byte) (*types.Transaction, error) {
+	return _StorageSetter.contract.Transact(opts, "setBytes320", _slot, _value)
+}
+
+// SetBytes320 is a paid mutator transaction binding the contract method 0x4e91db08.
+//
+// Solidity: function setBytes32(bytes32 _slot, bytes32 _value) returns()
+func (_StorageSetter *StorageSetterSession) SetBytes320(_slot [32]byte, _value [32]byte) (*types.Transaction, error) {
+	return _StorageSetter.Contract.SetBytes320(&_StorageSetter.TransactOpts, _slot, _value)
+}
+
+// SetBytes320 is a paid mutator transaction binding the contract method 0x4e91db08.
+//
+// Solidity: function setBytes32(bytes32 _slot, bytes32 _value) returns()
+func (_StorageSetter *StorageSetterTransactorSession) SetBytes320(_slot [32]byte, _value [32]byte) (*types.Transaction, error) {
+	return _StorageSetter.Contract.SetBytes320(&_StorageSetter.TransactOpts, _slot, _value)
+}
+
+// SetUint is a paid mutator transaction binding the contract method 0xe2a4853a.
+//
+// Solidity: function setUint(bytes32 _slot, uint256 _value) returns()
+func (_StorageSetter *StorageSetterTransactor) SetUint(opts *bind.TransactOpts, _slot [32]byte, _value *big.Int) (*types.Transaction, error) {
+	return _StorageSetter.contract.Transact(opts, "setUint", _slot, _value)
+}
+
+// SetUint is a paid mutator transaction binding the contract method 0xe2a4853a.
+//
+// Solidity: function setUint(bytes32 _slot, uint256 _value) returns()
+func (_StorageSetter *StorageSetterSession) SetUint(_slot [32]byte, _value *big.Int) (*types.Transaction, error) {
+	return _StorageSetter.Contract.SetUint(&_StorageSetter.TransactOpts, _slot, _value)
+}
+
+// SetUint is a paid mutator transaction binding the contract method 0xe2a4853a.
+//
+// Solidity: function setUint(bytes32 _slot, uint256 _value) returns()
+func (_StorageSetter *StorageSetterTransactorSession) SetUint(_slot [32]byte, _value *big.Int) (*types.Transaction, error) {
+	return _StorageSetter.Contract.SetUint(&_StorageSetter.TransactOpts, _slot, _value)
+}
diff --git a/op-bindings/bindings/systemconfig.go b/op-chain-ops/upgrades/bindings/systemconfig.go
similarity index 64%
rename from op-bindings/bindings/systemconfig.go
rename to op-chain-ops/upgrades/bindings/systemconfig.go
index 7a8b5b34772f..c8de0bad583e 100644
--- a/op-bindings/bindings/systemconfig.go
+++ b/op-chain-ops/upgrades/bindings/systemconfig.go
@@ -43,42 +43,21 @@ type SystemConfigAddresses struct {
 	L1CrossDomainMessenger       common.Address
 	L1ERC721Bridge               common.Address
 	L1StandardBridge             common.Address
-	L2OutputOracle               common.Address
+	DisputeGameFactory           common.Address
 	OptimismPortal               common.Address
 	OptimismMintableERC20Factory common.Address
+	GasPayingToken               common.Address
 }
 
 // SystemConfigMetaData contains all meta data concerning the SystemConfig contract.
 var SystemConfigMetaData = &bind.MetaData{
-	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BATCH_INBOX_SLOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L1_CROSS_DOMAIN_MESSENGER_SLOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L1_ERC_721_BRIDGE_SLOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L1_STANDARD_BRIDGE_SLOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_OUTPUT_ORACLE_SLOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPTIMISM_PORTAL_SLOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"START_BLOCK_SLOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UNSAFE_BLOCK_SIGNER_SLOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"batchInbox\",\"inputs\":[],\"outputs\":[{\"name\":\"addr_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"batcherHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gasLimit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_overhead\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_scalar\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_batcherHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_unsafeBlockSigner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_config\",\"type\":\"tuple\",\"internalType\":\"structResourceMetering.ResourceConfig\",\"components\":[{\"name\":\"maxResourceLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"elasticityMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeMaxChangeDenominator\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"minimumBaseFee\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"systemTxMaxGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maximumBaseFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"_batchInbox\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addresses\",\"type\":\"tuple\",\"internalType\":\"structSystemConfig.Addresses\",\"components\":[{\"name\":\"l1CrossDomainMessenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"l1ERC721Bridge\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"l1StandardBridge\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"l2OutputOracle\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"optimismPortal\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"optimismMintableERC20Factory\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l1CrossDomainMessenger\",\"inputs\":[],\"outputs\":[{\"name\":\"addr_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l1ERC721Bridge\",\"inputs\":[],\"outputs\":[{\"name\":\"addr_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l1StandardBridge\",\"inputs\":[],\"outputs\":[{\"name\":\"addr_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2OutputOracle\",\"inputs\":[],\"outputs\":[{\"name\":\"addr_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minimumGasLimit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"optimismMintableERC20Factory\",\"inputs\":[],\"outputs\":[{\"name\":\"addr_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"optimismPortal\",\"inputs\":[],\"outputs\":[{\"name\":\"addr_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"overhead\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resourceConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structResourceMetering.ResourceConfig\",\"components\":[{\"name\":\"maxResourceLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"elasticityMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeMaxChangeDenominator\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"minimumBaseFee\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"systemTxMaxGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maximumBaseFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"scalar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setBatcherHash\",\"inputs\":[{\"name\":\"_batcherHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGasConfig\",\"inputs\":[{\"name\":\"_overhead\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_scalar\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGasLimit\",\"inputs\":[{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setResourceConfig\",\"inputs\":[{\"name\":\"_config\",\"type\":\"tuple\",\"internalType\":\"structResourceMetering.ResourceConfig\",\"components\":[{\"name\":\"maxResourceLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"elasticityMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeMaxChangeDenominator\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"minimumBaseFee\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"systemTxMaxGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maximumBaseFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnsafeBlockSigner\",\"inputs\":[{\"name\":\"_unsafeBlockSigner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"startBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"startBlock_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unsafeBlockSigner\",\"inputs\":[],\"outputs\":[{\"name\":\"addr_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ConfigUpdate\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"updateType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumSystemConfig.UpdateType\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"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}]",
-	Bin: "0x60806040523480156200001157600080fd5b506200004962000032600160008051602062002a4783398151915262000c39565b60001b600019620000c960201b62000e061760201c565b6040805160c080820183526001808352602080840182905260028486015260006060808601829052608080870183905260a08088018490528851968701895283875293860183905296850182905284018190529483018590528201849052620000c39361dead9390928392839290918391908290620000cd565b62000d5c565b9055565b600054610100900460ff1615808015620000ee5750600054600160ff909116105b806200011e57506200010b30620004df60201b62000e0a1760201c565b1580156200011e575060005460ff166001145b620001875760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620001ab576000805461ff0019166101001790555b620001b5620004ee565b620001c08a62000556565b620001cb87620005d5565b620001d7898962000627565b620001e2866200068b565b620002197f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0886620000c960201b62000e061760201c565b6200025f6200024a60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59862000c39565b60001b84620000c960201b62000e061760201c565b620002a96200029060017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063762000c39565b60001b8360000151620000c960201b62000e061760201c565b620002f3620002da60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a862000c39565b60001b8360200151620000c960201b62000e061760201c565b6200033d6200032460017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637762000c39565b60001b8360400151620000c960201b62000e061760201c565b620003876200036e60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a687181662000c39565b60001b8360600151620000c960201b62000e061760201c565b620003d1620003b860017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad62000c39565b60001b8360800151620000c960201b62000e061760201c565b6200041b6200040260017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d62000c39565b60001b8360a00151620000c960201b62000e061760201c565b6200042562000728565b620004308462000799565b6200043a62000add565b6001600160401b0316866001600160401b031610156200048c5760405162461bcd60e51b815260206004820152601f6024820152600080516020620029e783398151915260448201526064016200017e565b8015620004d3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b03163b151590565b600054610100900460ff166200054a5760405162461bcd60e51b815260206004820152602b602482015260008051602062002a2783398151915260448201526a6e697469616c697a696e6760a81b60648201526084016200017e565b6200055462000b0a565b565b6200056062000b71565b6001600160a01b038116620005c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200017e565b620005d28162000bcd565b50565b60678190556040805160208082018490528251808303909101815290820190915260005b600060008051602062002a07833981519152836040516200061b919062000c53565b60405180910390a35050565b60658290556066819055604080516020810184905290810182905260009060600160408051601f1981840301815291905290506001600060008051602062002a07833981519152836040516200067e919062000c53565b60405180910390a3505050565b6200069562000add565b6001600160401b0316816001600160401b03161015620006e75760405162461bcd60e51b815260206004820152601f6024820152600080516020620029e783398151915260448201526064016200017e565b606880546001600160401b0319166001600160401b0383169081179091556040805160208082019390935281518082039093018352810190526002620005f9565b6200075c62000748600160008051602062002a4783398151915262000c39565b60001b62000c1f60201b62000e261760201c565b60000362000554576200055462000784600160008051602062002a4783398151915262000c39565b60001b43620000c960201b62000e061760201c565b8060a001516001600160801b0316816060015163ffffffff161115620008285760405162461bcd60e51b815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d61782062617365000000000000000000000060648201526084016200017e565b6001816040015160ff1611620008995760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201526e65206c6172676572207468616e203160881b60648201526084016200017e565b606854608082015182516001600160401b0390921691620008bb919062000cab565b63ffffffff161115620009005760405162461bcd60e51b815260206004820152601f6024820152600080516020620029e783398151915260448201526064016200017e565b6000816020015160ff1611620009715760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201526e06965722063616e6e6f74206265203608c1b60648201526084016200017e565b8051602082015163ffffffff82169160ff909116906200099390829062000cd6565b6200099f919062000d08565b63ffffffff161462000a1a5760405162461bcd60e51b815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d697400000000000000000060648201526084016200017e565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff96871664ffffffffff199095169490941764010000000060ff948516021764ffffffffff60281b191665010000000000939092169290920263ffffffff60301b19161766010000000000009185169190910217600160501b600160f01b0319166a01000000000000000000009390941692909202600160701b600160f01b03191692909217600160701b6001600160801b0390921691909102179055565b60695460009062000b059063ffffffff6a010000000000000000000082048116911662000d37565b905090565b600054610100900460ff1662000b665760405162461bcd60e51b815260206004820152602b602482015260008051602062002a2783398151915260448201526a6e697469616c697a696e6760a81b60648201526084016200017e565b620005543362000bcd565b6033546001600160a01b03163314620005545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200017e565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b5490565b634e487b7160e01b600052601160045260246000fd5b60008282101562000c4e5762000c4e62000c23565b500390565b600060208083528351808285015260005b8181101562000c825785810183015185820160400152820162000c64565b8181111562000c95576000604083870101525b50601f01601f1916929092016040019392505050565b600063ffffffff80831681851680830382111562000ccd5762000ccd62000c23565b01949350505050565b600063ffffffff8084168062000cfc57634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600063ffffffff8083168185168183048111821515161562000d2e5762000d2e62000c23565b02949350505050565b60006001600160401b0382811684821680830382111562000ccd5762000ccd62000c23565b611c7b8062000d6c6000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c8063935f029e11610145578063dac6e63a116100bd578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610597578063fd32aa0f1461059f578063ffa1ad74146105a757600080fd5b8063f45e65d81461057a578063f68016b71461058357600080fd5b8063dac6e63a1461054e578063e0e2016d14610556578063e81b2c6d1461055e578063f2fde38b1461056757600080fd5b8063bc49ce5f11610114578063c71973f6116100f9578063c71973f6146103f4578063c9b26f6114610407578063cc731b021461041a57600080fd5b8063bc49ce5f146103e4578063c4e8ddfa146103ec57600080fd5b8063935f029e146103ae5780639b7d7f0a146103c1578063a7119869146103c9578063b40a817c146103d157600080fd5b806348cd4cb1116101d857806354fd4d50116101a757806361d157681161018c57806361d1576814610380578063715018a6146103885780638da5cb5b1461039057600080fd5b806354fd4d501461032f5780635d73369c1461037857600080fd5b806348cd4cb1146102d75780634add321d146102df5780634d9f1559146103005780634f16540b1461030857600080fd5b80630c18c162116102145780630c18c162146102ab57806318d13918146102b457806319f5cea8146102c75780631fd19ee1146102cf57600080fd5b806306c9265714610246578063078f29cf146102615780630a49cb031461028e5780630bbb796814610296575b600080fd5b61024e6105af565b6040519081526020015b60405180910390f35b6102696105dd565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610258565b610269610616565b6102a96102a4366004611928565b610646565b005b61024e60655481565b6102a96102c2366004611a55565b610a44565b61024e610a58565b610269610a83565b61024e610aad565b6102e7610add565b60405167ffffffffffffffff9091168152602001610258565b610269610b03565b61024e7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b61036b6040518060400160405280600681526020017f312e31322e30000000000000000000000000000000000000000000000000000081525081565b6040516102589190611ae2565b61024e610b33565b61024e610b5e565b6102a9610b89565b60335473ffffffffffffffffffffffffffffffffffffffff16610269565b6102a96103bc366004611af5565b610b9d565b610269610bb3565b610269610be3565b6102a96103df366004611b17565b610c13565b61024e610c24565b610269610c4f565b6102a9610402366004611b32565b610c7f565b6102a9610415366004611b4e565b610c90565b6104de6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102589190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b610269610ca1565b61024e610cd1565b61024e60675481565b6102a9610575366004611a55565b610cfc565b61024e60665481565b6068546102e79067ffffffffffffffff1681565b61024e610db0565b61024e610ddb565b61024e600081565b6105da60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b81565b600061061161060d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b5490565b905090565b600061061161060d60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b600054610100900460ff16158080156106665750600054600160ff909116105b806106805750303b158015610680575060005460ff166001145b610711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561076f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610777610e2a565b6107808a610cfc565b61078987610ec9565b6107938989610f2a565b61079c86610fbb565b6107c57f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b6107f86107f360017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b849055565b61082c61082660017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b83519055565b61086361085a60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b60208401519055565b61089a61089160017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b60408401519055565b6108d16108c860017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b60608401519055565b6109086108ff60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b60808401519055565b61093f61093660017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b60a08401519055565b610947611099565b61095084611101565b610958610add565b67ffffffffffffffff168667ffffffffffffffff1610156109d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b8015610a3857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b610a4c611575565b610a55816115f6565b50565b6105da60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b60006106117f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b600061061161060d60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b6069546000906106119063ffffffff6a0100000000000000000000820481169116611bad565b600061061161060d60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b6105da60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b6105da60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b610b91611575565b610b9b600061167a565b565b610ba5611575565b610baf8282610f2a565b5050565b600061061161060d60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b600061061161060d60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b610c1b611575565b610a5581610fbb565b6105da60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b600061061161060d60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b610c87611575565b610a5581611101565b610c98611575565b610a5581610ec9565b600061061161060d60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b6105da60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b610d04611575565b73ffffffffffffffffffffffffffffffffffffffff8116610da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610708565b610a558161167a565b6105da60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b6105da60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b5490565b600054610100900460ff16610ec1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610708565b610b9b6116f1565b60678190556040805160208082018490528251808303909101815290820190915260005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610f1e9190611ae2565b60405180910390a35050565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610fae9190611ae2565b60405180910390a3505050565b610fc3610add565b67ffffffffffffffff168167ffffffffffffffff161015611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002610eed565b6110c761060d60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b600003610b9b57610b9b6110fc60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b439055565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff1611156111b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610708565b6001816040015160ff1611611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610708565b6068546080820151825167ffffffffffffffff909216916112699190611bd9565b63ffffffff1611156112d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b6000816020015160ff161161136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610708565b8051602082015163ffffffff82169160ff9091169061138e908290611bf8565b6113989190611c42565b63ffffffff161461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610708565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610708565b61161f7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290506003610eed565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610708565b610b9b3361167a565b803573ffffffffffffffffffffffffffffffffffffffff811681146117b557600080fd5b919050565b803567ffffffffffffffff811681146117b557600080fd5b60405160c0810167ffffffffffffffff8111828210171561181c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b803563ffffffff811681146117b557600080fd5b803560ff811681146117b557600080fd5b600060c0828403121561185957600080fd5b60405160c0810181811067ffffffffffffffff821117156118a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806118b283611822565b81526118c060208401611836565b60208201526118d160408401611836565b60408201526118e260608401611822565b60608201526118f360808401611822565b608082015260a08301356fffffffffffffffffffffffffffffffff8116811461191b57600080fd5b60a0919091015292915050565b6000806000806000806000806000898b0361026081121561194857600080fd5b6119518b611791565b995060208b0135985060408b0135975060608b0135965061197460808c016117ba565b955061198260a08c01611791565b94506119918c60c08d01611847565b93506119a06101808c01611791565b925060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60820112156119d257600080fd5b506119db6117d2565b6119e86101a08c01611791565b81526119f76101c08c01611791565b6020820152611a096101e08c01611791565b6040820152611a1b6102008c01611791565b6060820152611a2d6102208c01611791565b6080820152611a3f6102408c01611791565b60a0820152809150509295985092959850929598565b600060208284031215611a6757600080fd5b611a7082611791565b9392505050565b6000815180845260005b81811015611a9d57602081850181015186830182015201611a81565b81811115611aaf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a706020830184611a77565b60008060408385031215611b0857600080fd5b50508035926020909101359150565b600060208284031215611b2957600080fd5b611a70826117ba565b600060c08284031215611b4457600080fd5b611a708383611847565b600060208284031215611b6057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611ba857611ba8611b67565b500390565b600067ffffffffffffffff808316818516808303821115611bd057611bd0611b67565b01949350505050565b600063ffffffff808316818516808303821115611bd057611bd0611b67565b600063ffffffff80841680611c36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff80831681851681830481118215151615611c6557611c65611b67565b0294935050505056fea164736f6c634300080f000a53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77001d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0",
+	ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BATCH_INBOX_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DISPUTE_GAME_FACTORY_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L1_CROSS_DOMAIN_MESSENGER_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L1_ERC_721_BRIDGE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L1_STANDARD_BRIDGE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OPTIMISM_PORTAL_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"START_BLOCK_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UNSAFE_BLOCK_SIGNER_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchInbox\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batcherHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disputeGameFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasLimit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasPayingToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasPayingTokenName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasPayingTokenSymbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_overhead\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_scalar\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_batcherHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"_unsafeBlockSigner\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"maxResourceLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"elasticityMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"baseFeeMaxChangeDenominator\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"minimumBaseFee\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"systemTxMaxGas\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"maximumBaseFee\",\"type\":\"uint128\"}],\"internalType\":\"structResourceMetering.ResourceConfig\",\"name\":\"_config\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_batchInbox\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"l1CrossDomainMessenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l1ERC721Bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l1StandardBridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"disputeGameFactory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"optimismPortal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"optimismMintableERC20Factory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"gasPayingToken\",\"type\":\"address\"}],\"internalType\":\"structSystemConfig.Addresses\",\"name\":\"_addresses\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isCustomGasToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1CrossDomainMessenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1ERC721Bridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StandardBridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minimumGasLimit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"optimismMintableERC20Factory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"optimismPortal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"overhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resourceConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"maxResourceLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"elasticityMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"baseFeeMaxChangeDenominator\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"minimumBaseFee\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"systemTxMaxGas\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"maximumBaseFee\",\"type\":\"uint128\"}],\"internalType\":\"structResourceMetering.ResourceConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"scalar\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_batcherHash\",\"type\":\"bytes32\"}],\"name\":\"setBatcherHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_overhead\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_scalar\",\"type\":\"uint256\"}],\"name\":\"setGasConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"}],\"name\":\"setGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"maxResourceLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"elasticityMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"baseFeeMaxChangeDenominator\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"minimumBaseFee\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"systemTxMaxGas\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"maximumBaseFee\",\"type\":\"uint128\"}],\"internalType\":\"structResourceMetering.ResourceConfig\",\"name\":\"_config\",\"type\":\"tuple\"}],\"name\":\"setResourceConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_unsafeBlockSigner\",\"type\":\"address\"}],\"name\":\"setUnsafeBlockSigner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startBlock_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unsafeBlockSigner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enumSystemConfig.UpdateType\",\"name\":\"updateType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ConfigUpdate\",\"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\":\"OwnershipTransferred\",\"type\":\"event\"}]",
 }
 
 // SystemConfigABI is the input ABI used to generate the binding from.
 // Deprecated: Use SystemConfigMetaData.ABI instead.
 var SystemConfigABI = SystemConfigMetaData.ABI
 
-// SystemConfigBin is the compiled bytecode used for deploying new contracts.
-// Deprecated: Use SystemConfigMetaData.Bin instead.
-var SystemConfigBin = SystemConfigMetaData.Bin
-
-// DeploySystemConfig deploys a new Ethereum contract, binding an instance of SystemConfig to it.
-func DeploySystemConfig(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SystemConfig, error) {
-	parsed, err := SystemConfigMetaData.GetAbi()
-	if err != nil {
-		return common.Address{}, nil, nil, err
-	}
-	if parsed == nil {
-		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
-	}
-
-	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(SystemConfigBin), backend)
-	if err != nil {
-		return common.Address{}, nil, nil, err
-	}
-	return address, tx, &SystemConfig{SystemConfigCaller: SystemConfigCaller{contract: contract}, SystemConfigTransactor: SystemConfigTransactor{contract: contract}, SystemConfigFilterer: SystemConfigFilterer{contract: contract}}, nil
-}
-
 // SystemConfig is an auto generated Go binding around an Ethereum contract.
 type SystemConfig struct {
 	SystemConfigCaller     // Read-only binding to the contract
@@ -252,6 +231,37 @@ func (_SystemConfig *SystemConfigCallerSession) BATCHINBOXSLOT() ([32]byte, erro
 	return _SystemConfig.Contract.BATCHINBOXSLOT(&_SystemConfig.CallOpts)
 }
 
+// DISPUTEGAMEFACTORYSLOT is a free data retrieval call binding the contract method 0xe2a3285c.
+//
+// Solidity: function DISPUTE_GAME_FACTORY_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCaller) DISPUTEGAMEFACTORYSLOT(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "DISPUTE_GAME_FACTORY_SLOT")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// DISPUTEGAMEFACTORYSLOT is a free data retrieval call binding the contract method 0xe2a3285c.
+//
+// Solidity: function DISPUTE_GAME_FACTORY_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigSession) DISPUTEGAMEFACTORYSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.DISPUTEGAMEFACTORYSLOT(&_SystemConfig.CallOpts)
+}
+
+// DISPUTEGAMEFACTORYSLOT is a free data retrieval call binding the contract method 0xe2a3285c.
+//
+// Solidity: function DISPUTE_GAME_FACTORY_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCallerSession) DISPUTEGAMEFACTORYSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.DISPUTEGAMEFACTORYSLOT(&_SystemConfig.CallOpts)
+}
+
 // L1CROSSDOMAINMESSENGERSLOT is a free data retrieval call binding the contract method 0x5d73369c.
 //
 // Solidity: function L1_CROSS_DOMAIN_MESSENGER_SLOT() view returns(bytes32)
@@ -345,37 +355,6 @@ func (_SystemConfig *SystemConfigCallerSession) L1STANDARDBRIDGESLOT() ([32]byte
 	return _SystemConfig.Contract.L1STANDARDBRIDGESLOT(&_SystemConfig.CallOpts)
 }
 
-// L2OUTPUTORACLESLOT is a free data retrieval call binding the contract method 0x61d15768.
-//
-// Solidity: function L2_OUTPUT_ORACLE_SLOT() view returns(bytes32)
-func (_SystemConfig *SystemConfigCaller) L2OUTPUTORACLESLOT(opts *bind.CallOpts) ([32]byte, error) {
-	var out []interface{}
-	err := _SystemConfig.contract.Call(opts, &out, "L2_OUTPUT_ORACLE_SLOT")
-
-	if err != nil {
-		return *new([32]byte), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
-
-	return out0, err
-
-}
-
-// L2OUTPUTORACLESLOT is a free data retrieval call binding the contract method 0x61d15768.
-//
-// Solidity: function L2_OUTPUT_ORACLE_SLOT() view returns(bytes32)
-func (_SystemConfig *SystemConfigSession) L2OUTPUTORACLESLOT() ([32]byte, error) {
-	return _SystemConfig.Contract.L2OUTPUTORACLESLOT(&_SystemConfig.CallOpts)
-}
-
-// L2OUTPUTORACLESLOT is a free data retrieval call binding the contract method 0x61d15768.
-//
-// Solidity: function L2_OUTPUT_ORACLE_SLOT() view returns(bytes32)
-func (_SystemConfig *SystemConfigCallerSession) L2OUTPUTORACLESLOT() ([32]byte, error) {
-	return _SystemConfig.Contract.L2OUTPUTORACLESLOT(&_SystemConfig.CallOpts)
-}
-
 // OPTIMISMMINTABLEERC20FACTORYSLOT is a free data retrieval call binding the contract method 0x06c92657.
 //
 // Solidity: function OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT() view returns(bytes32)
@@ -593,6 +572,37 @@ func (_SystemConfig *SystemConfigCallerSession) BatcherHash() ([32]byte, error)
 	return _SystemConfig.Contract.BatcherHash(&_SystemConfig.CallOpts)
 }
 
+// DisputeGameFactory is a free data retrieval call binding the contract method 0xf2b4e617.
+//
+// Solidity: function disputeGameFactory() view returns(address addr_)
+func (_SystemConfig *SystemConfigCaller) DisputeGameFactory(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "disputeGameFactory")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// DisputeGameFactory is a free data retrieval call binding the contract method 0xf2b4e617.
+//
+// Solidity: function disputeGameFactory() view returns(address addr_)
+func (_SystemConfig *SystemConfigSession) DisputeGameFactory() (common.Address, error) {
+	return _SystemConfig.Contract.DisputeGameFactory(&_SystemConfig.CallOpts)
+}
+
+// DisputeGameFactory is a free data retrieval call binding the contract method 0xf2b4e617.
+//
+// Solidity: function disputeGameFactory() view returns(address addr_)
+func (_SystemConfig *SystemConfigCallerSession) DisputeGameFactory() (common.Address, error) {
+	return _SystemConfig.Contract.DisputeGameFactory(&_SystemConfig.CallOpts)
+}
+
 // GasLimit is a free data retrieval call binding the contract method 0xf68016b7.
 //
 // Solidity: function gasLimit() view returns(uint64)
@@ -624,6 +634,144 @@ func (_SystemConfig *SystemConfigCallerSession) GasLimit() (uint64, error) {
 	return _SystemConfig.Contract.GasLimit(&_SystemConfig.CallOpts)
 }
 
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_SystemConfig *SystemConfigCaller) GasPayingToken(opts *bind.CallOpts) (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "gasPayingToken")
+
+	outstruct := new(struct {
+		Addr     common.Address
+		Decimals uint8
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.Addr = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+	outstruct.Decimals = *abi.ConvertType(out[1], new(uint8)).(*uint8)
+
+	return *outstruct, err
+
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_SystemConfig *SystemConfigSession) GasPayingToken() (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	return _SystemConfig.Contract.GasPayingToken(&_SystemConfig.CallOpts)
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_SystemConfig *SystemConfigCallerSession) GasPayingToken() (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	return _SystemConfig.Contract.GasPayingToken(&_SystemConfig.CallOpts)
+}
+
+// GasPayingTokenName is a free data retrieval call binding the contract method 0xd8444715.
+//
+// Solidity: function gasPayingTokenName() view returns(string name_)
+func (_SystemConfig *SystemConfigCaller) GasPayingTokenName(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "gasPayingTokenName")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// GasPayingTokenName is a free data retrieval call binding the contract method 0xd8444715.
+//
+// Solidity: function gasPayingTokenName() view returns(string name_)
+func (_SystemConfig *SystemConfigSession) GasPayingTokenName() (string, error) {
+	return _SystemConfig.Contract.GasPayingTokenName(&_SystemConfig.CallOpts)
+}
+
+// GasPayingTokenName is a free data retrieval call binding the contract method 0xd8444715.
+//
+// Solidity: function gasPayingTokenName() view returns(string name_)
+func (_SystemConfig *SystemConfigCallerSession) GasPayingTokenName() (string, error) {
+	return _SystemConfig.Contract.GasPayingTokenName(&_SystemConfig.CallOpts)
+}
+
+// GasPayingTokenSymbol is a free data retrieval call binding the contract method 0x550fcdc9.
+//
+// Solidity: function gasPayingTokenSymbol() view returns(string symbol_)
+func (_SystemConfig *SystemConfigCaller) GasPayingTokenSymbol(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "gasPayingTokenSymbol")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// GasPayingTokenSymbol is a free data retrieval call binding the contract method 0x550fcdc9.
+//
+// Solidity: function gasPayingTokenSymbol() view returns(string symbol_)
+func (_SystemConfig *SystemConfigSession) GasPayingTokenSymbol() (string, error) {
+	return _SystemConfig.Contract.GasPayingTokenSymbol(&_SystemConfig.CallOpts)
+}
+
+// GasPayingTokenSymbol is a free data retrieval call binding the contract method 0x550fcdc9.
+//
+// Solidity: function gasPayingTokenSymbol() view returns(string symbol_)
+func (_SystemConfig *SystemConfigCallerSession) GasPayingTokenSymbol() (string, error) {
+	return _SystemConfig.Contract.GasPayingTokenSymbol(&_SystemConfig.CallOpts)
+}
+
+// IsCustomGasToken is a free data retrieval call binding the contract method 0x21326849.
+//
+// Solidity: function isCustomGasToken() view returns(bool)
+func (_SystemConfig *SystemConfigCaller) IsCustomGasToken(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "isCustomGasToken")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// IsCustomGasToken is a free data retrieval call binding the contract method 0x21326849.
+//
+// Solidity: function isCustomGasToken() view returns(bool)
+func (_SystemConfig *SystemConfigSession) IsCustomGasToken() (bool, error) {
+	return _SystemConfig.Contract.IsCustomGasToken(&_SystemConfig.CallOpts)
+}
+
+// IsCustomGasToken is a free data retrieval call binding the contract method 0x21326849.
+//
+// Solidity: function isCustomGasToken() view returns(bool)
+func (_SystemConfig *SystemConfigCallerSession) IsCustomGasToken() (bool, error) {
+	return _SystemConfig.Contract.IsCustomGasToken(&_SystemConfig.CallOpts)
+}
+
 // L1CrossDomainMessenger is a free data retrieval call binding the contract method 0xa7119869.
 //
 // Solidity: function l1CrossDomainMessenger() view returns(address addr_)
@@ -717,37 +865,6 @@ func (_SystemConfig *SystemConfigCallerSession) L1StandardBridge() (common.Addre
 	return _SystemConfig.Contract.L1StandardBridge(&_SystemConfig.CallOpts)
 }
 
-// L2OutputOracle is a free data retrieval call binding the contract method 0x4d9f1559.
-//
-// Solidity: function l2OutputOracle() view returns(address addr_)
-func (_SystemConfig *SystemConfigCaller) L2OutputOracle(opts *bind.CallOpts) (common.Address, error) {
-	var out []interface{}
-	err := _SystemConfig.contract.Call(opts, &out, "l2OutputOracle")
-
-	if err != nil {
-		return *new(common.Address), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
-	return out0, err
-
-}
-
-// L2OutputOracle is a free data retrieval call binding the contract method 0x4d9f1559.
-//
-// Solidity: function l2OutputOracle() view returns(address addr_)
-func (_SystemConfig *SystemConfigSession) L2OutputOracle() (common.Address, error) {
-	return _SystemConfig.Contract.L2OutputOracle(&_SystemConfig.CallOpts)
-}
-
-// L2OutputOracle is a free data retrieval call binding the contract method 0x4d9f1559.
-//
-// Solidity: function l2OutputOracle() view returns(address addr_)
-func (_SystemConfig *SystemConfigCallerSession) L2OutputOracle() (common.Address, error) {
-	return _SystemConfig.Contract.L2OutputOracle(&_SystemConfig.CallOpts)
-}
-
 // MinimumGasLimit is a free data retrieval call binding the contract method 0x4add321d.
 //
 // Solidity: function minimumGasLimit() view returns(uint64)
@@ -1058,23 +1175,23 @@ func (_SystemConfig *SystemConfigCallerSession) Version() (string, error) {
 	return _SystemConfig.Contract.Version(&_SystemConfig.CallOpts)
 }
 
-// Initialize is a paid mutator transaction binding the contract method 0x0bbb7968.
+// Initialize is a paid mutator transaction binding the contract method 0x4c1e843d.
 //
-// Solidity: function initialize(address _owner, uint256 _overhead, uint256 _scalar, bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, (uint32,uint8,uint8,uint32,uint32,uint128) _config, address _batchInbox, (address,address,address,address,address,address) _addresses) returns()
+// Solidity: function initialize(address _owner, uint256 _overhead, uint256 _scalar, bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, (uint32,uint8,uint8,uint32,uint32,uint128) _config, address _batchInbox, (address,address,address,address,address,address,address) _addresses) returns()
 func (_SystemConfig *SystemConfigTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address, _overhead *big.Int, _scalar *big.Int, _batcherHash [32]byte, _gasLimit uint64, _unsafeBlockSigner common.Address, _config ResourceMeteringResourceConfig, _batchInbox common.Address, _addresses SystemConfigAddresses) (*types.Transaction, error) {
 	return _SystemConfig.contract.Transact(opts, "initialize", _owner, _overhead, _scalar, _batcherHash, _gasLimit, _unsafeBlockSigner, _config, _batchInbox, _addresses)
 }
 
-// Initialize is a paid mutator transaction binding the contract method 0x0bbb7968.
+// Initialize is a paid mutator transaction binding the contract method 0x4c1e843d.
 //
-// Solidity: function initialize(address _owner, uint256 _overhead, uint256 _scalar, bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, (uint32,uint8,uint8,uint32,uint32,uint128) _config, address _batchInbox, (address,address,address,address,address,address) _addresses) returns()
+// Solidity: function initialize(address _owner, uint256 _overhead, uint256 _scalar, bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, (uint32,uint8,uint8,uint32,uint32,uint128) _config, address _batchInbox, (address,address,address,address,address,address,address) _addresses) returns()
 func (_SystemConfig *SystemConfigSession) Initialize(_owner common.Address, _overhead *big.Int, _scalar *big.Int, _batcherHash [32]byte, _gasLimit uint64, _unsafeBlockSigner common.Address, _config ResourceMeteringResourceConfig, _batchInbox common.Address, _addresses SystemConfigAddresses) (*types.Transaction, error) {
 	return _SystemConfig.Contract.Initialize(&_SystemConfig.TransactOpts, _owner, _overhead, _scalar, _batcherHash, _gasLimit, _unsafeBlockSigner, _config, _batchInbox, _addresses)
 }
 
-// Initialize is a paid mutator transaction binding the contract method 0x0bbb7968.
+// Initialize is a paid mutator transaction binding the contract method 0x4c1e843d.
 //
-// Solidity: function initialize(address _owner, uint256 _overhead, uint256 _scalar, bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, (uint32,uint8,uint8,uint32,uint32,uint128) _config, address _batchInbox, (address,address,address,address,address,address) _addresses) returns()
+// Solidity: function initialize(address _owner, uint256 _overhead, uint256 _scalar, bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, (uint32,uint8,uint8,uint32,uint32,uint128) _config, address _batchInbox, (address,address,address,address,address,address,address) _addresses) returns()
 func (_SystemConfig *SystemConfigTransactorSession) Initialize(_owner common.Address, _overhead *big.Int, _scalar *big.Int, _batcherHash [32]byte, _gasLimit uint64, _unsafeBlockSigner common.Address, _config ResourceMeteringResourceConfig, _batchInbox common.Address, _addresses SystemConfigAddresses) (*types.Transaction, error) {
 	return _SystemConfig.Contract.Initialize(&_SystemConfig.TransactOpts, _owner, _overhead, _scalar, _batcherHash, _gasLimit, _unsafeBlockSigner, _config, _batchInbox, _addresses)
 }
diff --git a/op-chain-ops/upgrades/check.go b/op-chain-ops/upgrades/check.go
index 5eb4fc79c4b9..c773df18d5d6 100644
--- a/op-chain-ops/upgrades/check.go
+++ b/op-chain-ops/upgrades/check.go
@@ -5,13 +5,27 @@ import (
 	"fmt"
 	"strings"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
+	"github.com/ethereum-optimism/optimism/op-chain-ops/upgrades/bindings"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/common"
 
 	"github.com/ethereum-optimism/superchain-registry/superchain"
 )
 
+var (
+	// The default values for the ResourceConfig, used as part of
+	// an EIP-1559 curve for deposit gas.
+	DefaultResourceConfig = bindings.ResourceMeteringResourceConfig{
+		MaxResourceLimit:            genesis.MaxResourceLimit,
+		ElasticityMultiplier:        genesis.ElasticityMultiplier,
+		BaseFeeMaxChangeDenominator: genesis.BaseFeeMaxChangeDenominator,
+		MinimumBaseFee:              genesis.MinimumBaseFee,
+		SystemTxMaxGas:              genesis.SystemTxMaxGas,
+		MaximumBaseFee:              genesis.MaximumBaseFee,
+	}
+)
+
 // CheckL1 will check that the versions of the contracts on L1 match the versions
 // in the superchain registry.
 func CheckL1(ctx context.Context, list *superchain.ImplementationList, backend bind.ContractBackend) error {
diff --git a/op-chain-ops/upgrades/doc.go b/op-chain-ops/upgrades/doc.go
new file mode 100644
index 000000000000..571c450e2e10
--- /dev/null
+++ b/op-chain-ops/upgrades/doc.go
@@ -0,0 +1,7 @@
+// Package upgrades contains upgrade related tooling.
+//
+// JSON files that follow the Safe UI batch call format
+// can be generated using this package. A bindings subpackage
+// exists to decouple versioning of bindings with other packages.
+// A just recipe exists to easily regenerate the bindings.
+package upgrades
diff --git a/op-chain-ops/upgrades/l1.go b/op-chain-ops/upgrades/l1.go
index 56383710e919..2f5e638113be 100644
--- a/op-chain-ops/upgrades/l1.go
+++ b/op-chain-ops/upgrades/l1.go
@@ -1,16 +1,19 @@
 package upgrades
 
 import (
+	"errors"
 	"fmt"
 	"math/big"
+	"os"
+	"strconv"
 
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/common"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/safe"
+	"github.com/ethereum-optimism/optimism/op-chain-ops/upgrades/bindings"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 
 	"github.com/ethereum-optimism/superchain-registry/superchain"
 )
@@ -26,41 +29,36 @@ const (
 var (
 	// storageSetterAddr represents the address of the StorageSetter contract.
 	storageSetterAddr = common.HexToAddress("0xd81f43eDBCAcb4c29a9bA38a13Ee5d79278270cC")
-
-	// superchainConfigProxy refers to the address of the Sepolia superchain config proxy.
-	// NOTE: this is currently hardcoded and we will need to move this to the superchain-registry
-	// and have 1 deployed for each superchain target.
-	superchainConfigProxy = common.HexToAddress("0xC2Be75506d5724086DEB7245bd260Cc9753911Be")
 )
 
 // L1 will add calls for upgrading each of the L1 contracts.
-func L1(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, backend bind.ContractBackend) error {
-	if err := L1CrossDomainMessenger(batch, implementations, list, config, chainConfig, backend); err != nil {
+func L1(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error {
+	if err := L1CrossDomainMessenger(batch, implementations, list, config, chainConfig, superchainConfig, backend); err != nil {
 		return fmt.Errorf("upgrading L1CrossDomainMessenger: %w", err)
 	}
-	if err := L1ERC721Bridge(batch, implementations, list, config, chainConfig, backend); err != nil {
+	if err := L1ERC721Bridge(batch, implementations, list, config, chainConfig, superchainConfig, backend); err != nil {
 		return fmt.Errorf("upgrading L1ERC721Bridge: %w", err)
 	}
-	if err := L1StandardBridge(batch, implementations, list, config, chainConfig, backend); err != nil {
+	if err := L1StandardBridge(batch, implementations, list, config, chainConfig, superchainConfig, backend); err != nil {
 		return fmt.Errorf("upgrading L1StandardBridge: %w", err)
 	}
-	if err := L2OutputOracle(batch, implementations, list, config, chainConfig, backend); err != nil {
+	if err := L2OutputOracle(batch, implementations, list, config, chainConfig, superchainConfig, backend); err != nil {
 		return fmt.Errorf("upgrading L2OutputOracle: %w", err)
 	}
-	if err := OptimismMintableERC20Factory(batch, implementations, list, config, chainConfig, backend); err != nil {
+	if err := OptimismMintableERC20Factory(batch, implementations, list, config, chainConfig, superchainConfig, backend); err != nil {
 		return fmt.Errorf("upgrading OptimismMintableERC20Factory: %w", err)
 	}
-	if err := OptimismPortal(batch, implementations, list, config, chainConfig, backend); err != nil {
+	if err := OptimismPortal(batch, implementations, list, config, chainConfig, superchainConfig, backend); err != nil {
 		return fmt.Errorf("upgrading OptimismPortal: %w", err)
 	}
-	if err := SystemConfig(batch, implementations, list, config, chainConfig, backend); err != nil {
+	if err := SystemConfig(batch, implementations, list, config, chainConfig, superchainConfig, backend); err != nil {
 		return fmt.Errorf("upgrading SystemConfig: %w", err)
 	}
 	return nil
 }
 
 // L1CrossDomainMessenger will add a call to the batch that upgrades the L1CrossDomainMessenger.
-func L1CrossDomainMessenger(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, backend bind.ContractBackend) error {
+func L1CrossDomainMessenger(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error {
 	proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi()
 	if err != nil {
 		return err
@@ -122,7 +120,7 @@ func L1CrossDomainMessenger(batch *safe.Batch, implementations superchain.Implem
 		return fmt.Errorf("OtherMessenger address doesn't match config")
 	}
 
-	calldata, err := l1CrossDomainMessengerABI.Pack("initialize", superchainConfigProxy, optimismPortal)
+	calldata, err := l1CrossDomainMessengerABI.Pack("initialize", common.Address(*superchainConfig.Config.SuperchainConfigAddr), optimismPortal)
 	if err != nil {
 		return err
 	}
@@ -142,7 +140,7 @@ func L1CrossDomainMessenger(batch *safe.Batch, implementations superchain.Implem
 }
 
 // L1ERC721Bridge will add a call to the batch that upgrades the L1ERC721Bridge.
-func L1ERC721Bridge(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, backend bind.ContractBackend) error {
+func L1ERC721Bridge(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error {
 	proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi()
 	if err != nil {
 		return err
@@ -204,7 +202,7 @@ func L1ERC721Bridge(batch *safe.Batch, implementations superchain.Implementation
 		return fmt.Errorf("OtherBridge address doesn't match config")
 	}
 
-	calldata, err := l1ERC721BridgeABI.Pack("initialize", messenger, superchainConfigProxy)
+	calldata, err := l1ERC721BridgeABI.Pack("initialize", messenger, common.Address(*(superchainConfig.Config.SuperchainConfigAddr)))
 	if err != nil {
 		return err
 	}
@@ -224,7 +222,7 @@ func L1ERC721Bridge(batch *safe.Batch, implementations superchain.Implementation
 }
 
 // L1StandardBridge will add a call to the batch that upgrades the L1StandardBridge.
-func L1StandardBridge(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, backend bind.ContractBackend) error {
+func L1StandardBridge(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error {
 	proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi()
 	if err != nil {
 		return err
@@ -288,7 +286,7 @@ func L1StandardBridge(batch *safe.Batch, implementations superchain.Implementati
 		return fmt.Errorf("OtherBridge address doesn't match config")
 	}
 
-	calldata, err := l1StandardBridgeABI.Pack("initialize", messenger, superchainConfigProxy)
+	calldata, err := l1StandardBridgeABI.Pack("initialize", messenger, common.Address(*(superchainConfig.Config.SuperchainConfigAddr)))
 	if err != nil {
 		return err
 	}
@@ -308,7 +306,7 @@ func L1StandardBridge(batch *safe.Batch, implementations superchain.Implementati
 }
 
 // L2OutputOracle will add a call to the batch that upgrades the L2OutputOracle.
-func L2OutputOracle(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, backend bind.ContractBackend) error {
+func L2OutputOracle(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error {
 	proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi()
 	if err != nil {
 		return err
@@ -452,7 +450,7 @@ func L2OutputOracle(batch *safe.Batch, implementations superchain.Implementation
 }
 
 // OptimismMintableERC20Factory will add a call to the batch that upgrades the OptimismMintableERC20Factory.
-func OptimismMintableERC20Factory(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, backend bind.ContractBackend) error {
+func OptimismMintableERC20Factory(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error {
 	proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi()
 	if err != nil {
 		return err
@@ -527,7 +525,7 @@ func OptimismMintableERC20Factory(batch *safe.Batch, implementations superchain.
 }
 
 // OptimismPortal will add a call to the batch that upgrades the OptimismPortal.
-func OptimismPortal(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, backend bind.ContractBackend) error {
+func OptimismPortal(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error {
 	proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi()
 	if err != nil {
 		return err
@@ -572,11 +570,11 @@ func OptimismPortal(batch *safe.Batch, implementations superchain.Implementation
 	if err != nil {
 		return err
 	}
-	l2OutputOracle, err := optimismPortal.L2ORACLE(&bind.CallOpts{})
+	l2OutputOracle, err := optimismPortal.L2Oracle(&bind.CallOpts{})
 	if err != nil {
 		return err
 	}
-	systemConfig, err := optimismPortal.SYSTEMCONFIG(&bind.CallOpts{})
+	systemConfig, err := optimismPortal.SystemConfig(&bind.CallOpts{})
 	if err != nil {
 		return err
 	}
@@ -589,7 +587,7 @@ func OptimismPortal(batch *safe.Batch, implementations superchain.Implementation
 		return fmt.Errorf("SystemConfig address doesn't match config")
 	}
 
-	calldata, err := optimismPortalABI.Pack("initialize", l2OutputOracle, systemConfig, superchainConfigProxy)
+	calldata, err := optimismPortalABI.Pack("initialize", l2OutputOracle, systemConfig, common.Address(*superchainConfig.Config.SuperchainConfigAddr))
 	if err != nil {
 		return err
 	}
@@ -609,7 +607,7 @@ func OptimismPortal(batch *safe.Batch, implementations superchain.Implementation
 }
 
 // SystemConfig will add a call to the batch that upgrades the SystemConfig.
-func SystemConfig(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, backend bind.ContractBackend) error {
+func SystemConfig(batch *safe.Batch, implementations superchain.ImplementationList, list superchain.AddressList, config *genesis.DeployConfig, chainConfig *superchain.ChainConfig, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error {
 	proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi()
 	if err != nil {
 		return err
@@ -622,10 +620,15 @@ func SystemConfig(batch *safe.Batch, implementations superchain.ImplementationLi
 			return err
 		}
 
-		startBlock := common.Hash{}
-
+		var startBlock common.Hash
 		if config != nil {
 			startBlock = common.BigToHash(new(big.Int).SetUint64(config.SystemConfigStartBlock))
+		} else {
+			val, err := strconv.ParseUint(os.Getenv("SYSTEM_CONFIG_START_BLOCK"), 10, 64)
+			if err != nil {
+				return err
+			}
+			startBlock = common.BigToHash(new(big.Int).SetUint64(val))
 		}
 
 		input := []bindings.StorageSetterSlot{
@@ -696,23 +699,19 @@ func SystemConfig(batch *safe.Batch, implementations superchain.ImplementationLi
 		return err
 	}
 
-	if gasPriceOracleOverhead.Uint64() != config.GasPriceOracleOverhead {
-		return fmt.Errorf("GasPriceOracleOverhead address doesn't match config")
-	}
-	if gasPriceOracleScalar.Uint64() != config.GasPriceOracleScalar {
-		return fmt.Errorf("GasPriceOracleScalar address doesn't match config")
-	}
-	if batcherHash != common.BytesToHash(config.BatchSenderAddress.Bytes()) {
-		return fmt.Errorf("BatchSenderAddress address doesn't match config")
-	}
-	if l2GenesisBlockGasLimit != uint64(config.L2GenesisBlockGasLimit) {
-		return fmt.Errorf("L2GenesisBlockGasLimit address doesn't match config")
-	}
-	if p2pSequencerAddress != config.P2PSequencerAddress {
-		return fmt.Errorf("P2PSequencerAddress address doesn't match config")
-	}
-	if finalSystemOwner != config.FinalSystemOwner {
-		return fmt.Errorf("FinalSystemOwner address doesn't match config")
+	if config != nil {
+		if batcherHash != common.BytesToHash(config.BatchSenderAddress.Bytes()) {
+			return fmt.Errorf("BatchSenderAddress address doesn't match config")
+		}
+		if l2GenesisBlockGasLimit != uint64(config.L2GenesisBlockGasLimit) {
+			return fmt.Errorf("L2GenesisBlockGasLimit address doesn't match config")
+		}
+		if p2pSequencerAddress != config.P2PSequencerAddress {
+			return fmt.Errorf("P2PSequencerAddress address doesn't match config")
+		}
+		if finalSystemOwner != config.FinalSystemOwner {
+			return fmt.Errorf("FinalSystemOwner address doesn't match config")
+		}
 	}
 
 	resourceConfig, err := systemConfig.ResourceConfig(&bind.CallOpts{})
@@ -720,25 +719,29 @@ func SystemConfig(batch *safe.Batch, implementations superchain.ImplementationLi
 		return err
 	}
 
-	if resourceConfig.MaxResourceLimit != genesis.DefaultResourceConfig.MaxResourceLimit {
+	if resourceConfig.MaxResourceLimit != DefaultResourceConfig.MaxResourceLimit {
 		return fmt.Errorf("DefaultResourceConfig MaxResourceLimit doesn't match contract MaxResourceLimit")
 	}
-	if resourceConfig.ElasticityMultiplier != genesis.DefaultResourceConfig.ElasticityMultiplier {
+	if resourceConfig.ElasticityMultiplier != DefaultResourceConfig.ElasticityMultiplier {
 		return fmt.Errorf("DefaultResourceConfig ElasticityMultiplier doesn't match contract ElasticityMultiplier")
 	}
-	if resourceConfig.BaseFeeMaxChangeDenominator != genesis.DefaultResourceConfig.BaseFeeMaxChangeDenominator {
+	if resourceConfig.BaseFeeMaxChangeDenominator != DefaultResourceConfig.BaseFeeMaxChangeDenominator {
 		return fmt.Errorf("DefaultResourceConfig BaseFeeMaxChangeDenominator doesn't match contract BaseFeeMaxChangeDenominator")
 	}
-	if resourceConfig.MinimumBaseFee != genesis.DefaultResourceConfig.MinimumBaseFee {
+	if resourceConfig.MinimumBaseFee != DefaultResourceConfig.MinimumBaseFee {
 		return fmt.Errorf("DefaultResourceConfig MinimumBaseFee doesn't match contract MinimumBaseFee")
 	}
-	if resourceConfig.SystemTxMaxGas != genesis.DefaultResourceConfig.SystemTxMaxGas {
+	if resourceConfig.SystemTxMaxGas != DefaultResourceConfig.SystemTxMaxGas {
 		return fmt.Errorf("DefaultResourceConfig SystemTxMaxGas doesn't match contract SystemTxMaxGas")
 	}
-	if resourceConfig.MaximumBaseFee.Cmp(genesis.DefaultResourceConfig.MaximumBaseFee) != 0 {
+	if resourceConfig.MaximumBaseFee.Cmp(DefaultResourceConfig.MaximumBaseFee) != 0 {
 		return fmt.Errorf("DefaultResourceConfig MaximumBaseFee doesn't match contract MaximumBaseFee")
 	}
 
+	if true {
+		return errors.New("Update superchain-registry dependency to include DisputeGameFactory and GasPayingToken addresses")
+	}
+
 	calldata, err := systemConfigABI.Pack(
 		"initialize",
 		finalSystemOwner,
@@ -747,15 +750,16 @@ func SystemConfig(batch *safe.Batch, implementations superchain.ImplementationLi
 		batcherHash,
 		l2GenesisBlockGasLimit,
 		p2pSequencerAddress,
-		genesis.DefaultResourceConfig,
+		DefaultResourceConfig,
 		chainConfig.BatchInboxAddr,
 		bindings.SystemConfigAddresses{
 			L1CrossDomainMessenger:       common.Address(list.L1CrossDomainMessengerProxy),
 			L1ERC721Bridge:               common.Address(list.L1ERC721BridgeProxy),
 			L1StandardBridge:             common.Address(list.L1StandardBridgeProxy),
-			L2OutputOracle:               common.Address(list.L2OutputOracleProxy),
+			DisputeGameFactory:           common.Address{},
 			OptimismPortal:               common.Address(list.OptimismPortalProxy),
 			OptimismMintableERC20Factory: common.Address(list.OptimismMintableERC20FactoryProxy),
+			GasPayingToken:               common.Address{},
 		},
 	)
 	if err != nil {
diff --git a/op-challenger/Dockerfile b/op-challenger/Dockerfile
deleted file mode 100644
index ad57e2b52b6f..000000000000
--- a/op-challenger/Dockerfile
+++ /dev/null
@@ -1,17 +0,0 @@
-ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest
-FROM $OP_STACK_GO_BUILDER as builder
-# See "make golang-docker" and /ops/docker/op-stack-go
-
-FROM alpine:3.18
-
-# Make the bundled op-program the default cannon server
-COPY --from=builder /usr/local/bin/op-program /usr/local/bin/op-program
-ENV OP_CHALLENGER_CANNON_SERVER /usr/local/bin/op-program
-
-# Make the bundled cannon the default cannon executable
-COPY --from=builder /usr/local/bin/cannon /usr/local/bin/cannon
-ENV OP_CHALLENGER_CANNON_BIN /usr/local/bin/cannon
-
-COPY --from=builder /usr/local/bin/op-challenger /usr/local/bin/op-challenger
-
-CMD ["op-challenger"]
diff --git a/op-challenger/Dockerfile.dockerignore b/op-challenger/Dockerfile.dockerignore
deleted file mode 100644
index 4f26140750a0..000000000000
--- a/op-challenger/Dockerfile.dockerignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# ignore everything but the dockerfile, the op-stack-go base image performs the build
-*
diff --git a/op-challenger/Makefile b/op-challenger/Makefile
index ef58c35a728b..2c663ac00f6c 100644
--- a/op-challenger/Makefile
+++ b/op-challenger/Makefile
@@ -1,17 +1,22 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+VERSION ?= v0.0.0
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
 LDFLAGSSTRING +=-X main.Version=$(VERSION)
 LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
 
+# Use the old Apple linker to workaround broken xcode - https://github.com/golang/go/issues/65169
+ifeq ($(shell uname),Darwin)
+	FUZZLDFLAGS := -ldflags=-extldflags=-Wl,-ld_classic
+endif
+
 op-challenger:
 	env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-challenger ./cmd
 
 fuzz:
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzKeccak ./game/keccak/matrix
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzKeccak ./game/keccak/matrix
 
 clean:
 	rm bin/op-challenger
diff --git a/op-challenger/README.md b/op-challenger/README.md
index 3d740dc5703e..a8452ad768ec 100644
--- a/op-challenger/README.md
+++ b/op-challenger/README.md
@@ -44,7 +44,7 @@ DISPUTE_GAME_FACTORY=$(jq -r .DisputeGameFactoryProxy .devnet/addresses.json)
   --cannon-bin ./cannon/bin/cannon \
   --cannon-server ./op-program/bin/op-program \
   --cannon-prestate ./op-program/bin/prestate.json \
-  --cannon-l2 http://localhost:9545 \
+  --l2-eth-rpc http://localhost:9545 \
   --mnemonic "test test test test test test test test test test test junk" \
   --hd-path "m/44'/60'/0'/0/8" \
   --num-confirmations 1
@@ -70,7 +70,7 @@ used in production and are intended to provide convenient manual testing.
   --game-address  \
   --output-root  \
   --l2-block-num  \
-  ...
+  
 ```
 
 Starts a new fault dispute game that disputes the latest output proposal
@@ -80,9 +80,7 @@ in the L2 output oracle.
 * `GAME_FACTORY_ADDRESS` - the address of the dispute game factory contract on L1.
 * `OUTPUT_ROOT` a hex encoded 32 byte hash that is used as the proposed output root.
 * `L2_BLOCK_NUM` the L2 block number the proposed output root is from.
-* `SIGNER_ARGS` the remaining args are past as arguments to `cast` when sending
-  transactions. These arguments must specify a way for `cast` to sign the transactions.
-  See `cast send --help` for supported options.
+* `SIGNER_ARGS` arguments to specify the key to sign transactions with (e.g `--private-key`)
 
 Optionally, you may specify the game type (aka "trace type") using the `--trace-type`
 flag, which is set to the cannon trace type by default.
@@ -99,7 +97,7 @@ but not both.
   --attack \
   --parent-index  \
   --claim  \
-  ...
+  
 ```
 
 Performs a move to either attack or defend the latest claim in the specified game.
@@ -114,9 +112,25 @@ Performs a move to either attack or defend the latest claim in the specified gam
 * `PARENT_INDEX` - the index of the parent claim that will be countered by this new claim.
   The special value of `latest` will counter the latest claim added to the game.
 * `CLAIM` - the state hash to include in the counter-claim you are posting.
-* `SIGNER_ARGS` the remaining args are past as arguments to `cast` when sending transactions.
-  These arguments must specify a way for `cast` to sign the transactions.
-  See `cast send --help` for supported options.
+* `SIGNER_ARGS` arguments to specify the key to sign transactions with (e.g `--private-key`)
+
+### resolve-claim
+
+```shell
+./bin/op-challenger resolve-claim \
+  --l1-eth-rpc  \
+  --game-address  \
+  --claim  \
+  
+```
+
+Resolves a claim in a dispute game. Note that this will fail if the claim has already been resolved or if the claim is
+not yet resolvable. If the claim is resolved successfully, the result is printed.
+
+* `L1_ETH_RPC` - the RPC endpoint of the L1 endpoint to use (e.g. `http://localhost:8545`).
+* `GAME_ADDRESS` - the address of the dispute game to resolve.
+* `CLAIM_INDEX` - the index of the claim to resolve.
+* `SIGNER_ARGS` arguments to specify the key to sign transactions with (e.g `--private-key`).
 
 ### resolve
 
@@ -124,7 +138,7 @@ Performs a move to either attack or defend the latest claim in the specified gam
 ./bin/op-challenger resolve \
   --l1-eth-rpc  \
   --game-address  \
-  ...
+  
 ```
 
 Resolves a dispute game. Note that this will fail if the dispute game has already
@@ -133,9 +147,7 @@ If the game is resolved successfully, the result is printed.
 
 * `L1_ETH_RPC` - the RPC endpoint of the L1 endpoint to use (e.g. `http://localhost:8545`).
 * `GAME_ADDRESS` - the address of the dispute game to resolve.
-* `SIGNER_ARGS` the remaining args are past as arguments to `cast` when sending transactions.
-  These arguments must specify a way for `cast` to sign the transactions.
-  See `cast send --help` for supported options.
+* `SIGNER_ARGS` arguments to specify the key to sign transactions with (e.g `--private-key`).
 
 ### list-games
 
diff --git a/op-challenger/challenger.go b/op-challenger/challenger.go
index 574f27fc74ec..909a42725313 100644
--- a/op-challenger/challenger.go
+++ b/op-challenger/challenger.go
@@ -3,6 +3,7 @@ package op_challenger
 import (
 	"context"
 
+	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
 	"github.com/ethereum/go-ethereum/log"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/config"
@@ -11,9 +12,9 @@ import (
 )
 
 // Main is the programmatic entry-point for running op-challenger with a given configuration.
-func Main(ctx context.Context, logger log.Logger, cfg *config.Config) (cliapp.Lifecycle, error) {
+func Main(ctx context.Context, logger log.Logger, cfg *config.Config, m metrics.Metricer) (cliapp.Lifecycle, error) {
 	if err := cfg.Check(); err != nil {
 		return nil, err
 	}
-	return game.NewService(ctx, logger, cfg)
+	return game.NewService(ctx, logger, cfg, m)
 }
diff --git a/op-challenger/challenger_test.go b/op-challenger/challenger_test.go
index 666e656e2c0f..873fb9c78f9c 100644
--- a/op-challenger/challenger_test.go
+++ b/op-challenger/challenger_test.go
@@ -5,6 +5,7 @@ import (
 	"testing"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/config"
+	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
@@ -12,7 +13,7 @@ import (
 
 func TestMainShouldReturnErrorWhenConfigInvalid(t *testing.T) {
 	cfg := &config.Config{}
-	app, err := Main(context.Background(), testlog.Logger(t, log.LevelInfo), cfg)
+	app, err := Main(context.Background(), testlog.Logger(t, log.LevelInfo), cfg, metrics.NoopMetrics)
 	require.ErrorIs(t, err, cfg.Check())
 	require.Nil(t, app)
 }
diff --git a/op-challenger/cmd/create_game.go b/op-challenger/cmd/create_game.go
index 7053b4eee3a8..0ef1a83d8404 100644
--- a/op-challenger/cmd/create_game.go
+++ b/op-challenger/cmd/create_game.go
@@ -7,8 +7,11 @@ import (
 	"github.com/ethereum-optimism/optimism/op-challenger/config"
 	"github.com/ethereum-optimism/optimism/op-challenger/flags"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
+	contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
+	"github.com/ethereum-optimism/optimism/op-challenger/tools"
 	opservice "github.com/ethereum-optimism/optimism/op-service"
 	oplog "github.com/ethereum-optimism/optimism/op-service/log"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/urfave/cli/v2"
@@ -38,28 +41,20 @@ func CreateGame(ctx *cli.Context) error {
 	traceType := ctx.Uint64(TraceTypeFlag.Name)
 	l2BlockNum := ctx.Uint64(L2BlockNumFlag.Name)
 
-	contract, txMgr, err := NewContractWithTxMgr[*contracts.DisputeGameFactoryContract](ctx, flags.FactoryAddressFlag.Name, contracts.NewDisputeGameFactoryContract)
+	contract, txMgr, err := NewContractWithTxMgr[*contracts.DisputeGameFactoryContract](ctx, flags.FactoryAddressFlag.Name,
+		func(ctx context.Context, metricer contractMetrics.ContractMetricer, address common.Address, caller *batching.MultiCaller) (*contracts.DisputeGameFactoryContract, error) {
+			return contracts.NewDisputeGameFactoryContract(metricer, address, caller), nil
+		})
 	if err != nil {
 		return fmt.Errorf("failed to create dispute game factory bindings: %w", err)
 	}
 
-	txCandidate, err := contract.CreateTx(uint32(traceType), outputRoot, l2BlockNum)
+	creator := tools.NewGameCreator(contract, txMgr)
+	gameAddr, err := creator.CreateGame(ctx.Context, outputRoot, traceType, l2BlockNum)
 	if err != nil {
-		return fmt.Errorf("failed to create tx: %w", err)
+		return fmt.Errorf("failed to create game: %w", err)
 	}
-
-	rct, err := txMgr.Send(context.Background(), txCandidate)
-	if err != nil {
-		return fmt.Errorf("failed to send tx: %w", err)
-	}
-	fmt.Printf("Sent create transaction with status %v, tx_hash: %s\n", rct.Status, rct.TxHash.String())
-
-	fetchedGameAddr, err := contract.GetGameFromParameters(context.Background(), uint32(traceType), outputRoot, l2BlockNum)
-	if err != nil {
-		return fmt.Errorf("failed to call games: %w", err)
-	}
-	fmt.Printf("Fetched Game Address: %s\n", fetchedGameAddr.String())
-
+	fmt.Printf("Fetched Game Address: %s\n", gameAddr.String())
 	return nil
 }
 
@@ -67,6 +62,7 @@ func createGameFlags() []cli.Flag {
 	cliFlags := []cli.Flag{
 		flags.L1EthRpcFlag,
 		flags.FactoryAddressFlag,
+		TraceTypeFlag,
 		OutputRootFlag,
 		L2BlockNumFlag,
 	}
@@ -81,5 +77,4 @@ var CreateGameCommand = &cli.Command{
 	Description: "Creates a dispute game via the factory",
 	Action:      CreateGame,
 	Flags:       createGameFlags(),
-	Hidden:      true,
 }
diff --git a/op-challenger/cmd/list_claims.go b/op-challenger/cmd/list_claims.go
index 6fb51a7e1bb7..a66da959e576 100644
--- a/op-challenger/cmd/list_claims.go
+++ b/op-challenger/cmd/list_claims.go
@@ -3,14 +3,21 @@ package main
 import (
 	"context"
 	"fmt"
+	"math/big"
+	"strconv"
+	"time"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/flags"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	opservice "github.com/ethereum-optimism/optimism/op-service"
 	"github.com/ethereum-optimism/optimism/op-service/dial"
+	"github.com/ethereum-optimism/optimism/op-service/eth"
 	oplog "github.com/ethereum-optimism/optimism/op-service/log"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	"github.com/ethereum/go-ethereum/common"
 	"github.com/urfave/cli/v2"
 )
 
@@ -20,6 +27,12 @@ var (
 		Usage:   "Address of the fault game contract.",
 		EnvVars: opservice.PrefixEnvVar(flags.EnvVarPrefix, "GAME_ADDRESS"),
 	}
+	VerboseFlag = &cli.BoolFlag{
+		Name:    "verbose",
+		Aliases: []string{"v"},
+		Usage:   "Verbose output",
+		EnvVars: opservice.PrefixEnvVar(flags.EnvVarPrefix, "VERBOSE"),
+	}
 )
 
 func ListClaims(ctx *cli.Context) error {
@@ -43,27 +56,32 @@ func ListClaims(ctx *cli.Context) error {
 	defer l1Client.Close()
 
 	caller := batching.NewMultiCaller(l1Client.Client(), batching.DefaultBatchSize)
-	contract, err := contracts.NewFaultDisputeGameContract(gameAddr, caller)
+	contract, err := contracts.NewFaultDisputeGameContract(ctx.Context, metrics.NoopContractMetrics, gameAddr, caller)
 	if err != nil {
-		return fmt.Errorf("failed to create dispute game bindings: %w", err)
+		return err
 	}
-	return listClaims(ctx.Context, contract)
+	return listClaims(ctx.Context, contract, ctx.Bool(VerboseFlag.Name))
 }
 
-func listClaims(ctx context.Context, game *contracts.FaultDisputeGameContract) error {
+func listClaims(ctx context.Context, game contracts.FaultDisputeGameContract, verbose bool) error {
+	metadata, err := game.GetGameMetadata(ctx, rpcblock.Latest)
+	if err != nil {
+		return fmt.Errorf("failed to retrieve metadata: %w", err)
+	}
 	maxDepth, err := game.GetMaxGameDepth(ctx)
 	if err != nil {
 		return fmt.Errorf("failed to retrieve max depth: %w", err)
 	}
-	splitDepth, err := game.GetSplitDepth(ctx)
+	maxClockDuration, err := game.GetMaxClockDuration(ctx)
 	if err != nil {
-		return fmt.Errorf("failed to retrieve split depth: %w", err)
+		return fmt.Errorf("failed to retrieve max clock duration: %w", err)
 	}
-	status, err := game.GetStatus(ctx)
+	splitDepth, err := game.GetSplitDepth(ctx)
 	if err != nil {
-		return fmt.Errorf("failed to retrieve status: %w", err)
+		return fmt.Errorf("failed to retrieve split depth: %w", err)
 	}
-	_, l2BlockNum, err := game.GetBlockRange(ctx)
+	status := metadata.Status
+	l2StartBlockNum, l2BlockNum, err := game.GetBlockRange(ctx)
 	if err != nil {
 		return fmt.Errorf("failed to retrieve status: %w", err)
 	}
@@ -73,14 +91,83 @@ func listClaims(ctx context.Context, game *contracts.FaultDisputeGameContract) e
 		return fmt.Errorf("failed to retrieve claims: %w", err)
 	}
 
-	info := fmt.Sprintf("Claim count: %v\n", len(claims))
+	// The top game runs from depth 0 to split depth *inclusive*.
+	// The - 1 here accounts for the fact that the split depth is included in the top game.
+	bottomDepth := maxDepth - splitDepth - 1
+
+	resolved, err := game.IsResolved(ctx, rpcblock.Latest, claims...)
+	if err != nil {
+		return fmt.Errorf("failed to retrieve claim resolution: %w", err)
+	}
+
+	gameState := types.NewGameState(claims, maxDepth)
+	valueFormat := "%-14v"
+	if verbose {
+		valueFormat = "%-66v"
+	}
+	now := time.Now()
+	lineFormat := "%3v %-7v %6v %5v %14v " + valueFormat + " %-42v %12v %-19v %10v %v\n"
+	info := fmt.Sprintf(lineFormat, "Idx", "Move", "Parent", "Depth", "Index", "Value", "Claimant", "Bond (ETH)", "Time", "Clock Used", "Resolution")
 	for i, claim := range claims {
 		pos := claim.Position
-		info = info + fmt.Sprintf("%v - Position: %v, Depth: %v, IndexAtDepth: %v Trace Index: %v, Value: %v, Countered: %v, ParentIndex: %v\n",
-			i, pos.ToGIndex(), pos.Depth(), pos.IndexAtDepth(), pos.TraceIndex(maxDepth), claim.Value.Hex(), claim.CounteredBy, claim.ParentContractIndex)
+		parent := strconv.Itoa(claim.ParentContractIndex)
+		var elapsed time.Duration // Root claim does not accumulate any time on its team's chess clock
+		if claim.IsRoot() {
+			parent = ""
+		} else {
+			parentClaim, err := gameState.GetParent(claim)
+			if err != nil {
+				return fmt.Errorf("failed to retrieve parent claim: %w", err)
+			}
+			// Get the total chess clock time accumulated by the team that posted this claim at the time of the claim.
+			elapsed = gameState.ChessClock(claim.Clock.Timestamp, parentClaim)
+		}
+		var countered string
+		if !resolved[i] {
+			clock := gameState.ChessClock(now, claim)
+			resolvableAt := now.Add(maxClockDuration - clock).Format(time.DateTime)
+			countered = fmt.Sprintf("⏱️  %v", resolvableAt)
+		} else if claim.IsRoot() && metadata.L2BlockNumberChallenged {
+			countered = "❌ " + metadata.L2BlockNumberChallenger.Hex()
+		} else if claim.CounteredBy != (common.Address{}) {
+			countered = "❌ " + claim.CounteredBy.Hex()
+		} else {
+			countered = "✅"
+		}
+		move := "Attack"
+		if gameState.DefendsParent(claim) {
+			move = "Defend"
+		}
+		var traceIdx *big.Int
+		if claim.Depth() <= splitDepth {
+			traceIdx = claim.TraceIndex(splitDepth)
+		} else {
+			relativePos, err := claim.Position.RelativeToAncestorAtDepth(splitDepth + 1)
+			if err != nil {
+				fmt.Printf("Error calculating relative position for claim %v: %v", claim.ContractIndex, err)
+				traceIdx = big.NewInt(-1)
+			} else {
+				traceIdx = relativePos.TraceIndex(bottomDepth)
+			}
+		}
+		value := claim.Value.TerminalString()
+		if verbose {
+			value = claim.Value.Hex()
+		}
+		timestamp := claim.Clock.Timestamp.Format(time.DateTime)
+		bond := fmt.Sprintf("%12.8f", eth.WeiToEther(claim.Bond))
+		if verbose {
+			bond = fmt.Sprintf("%f", eth.WeiToEther(claim.Bond))
+		}
+		info = info + fmt.Sprintf(lineFormat,
+			i, move, parent, pos.Depth(), traceIdx, value, claim.Claimant, bond, timestamp, elapsed, countered)
+	}
+	blockNumChallenger := "L2 Block: Unchallenged"
+	if metadata.L2BlockNumberChallenged {
+		blockNumChallenger = "L2 Block: ❌ " + metadata.L2BlockNumberChallenger.Hex()
 	}
-	fmt.Printf("Status: %v - L2 Block: %v - Split Depth: %v - Max Depth: %v:\n%v\n",
-		status, l2BlockNum, splitDepth, maxDepth, info)
+	fmt.Printf("Status: %v • L2 Blocks: %v to %v • Split Depth: %v • Max Depth: %v • %v • Claim Count: %v\n%v\n",
+		status, l2StartBlockNum, l2BlockNum, splitDepth, maxDepth, blockNumChallenger, len(claims), info)
 	return nil
 }
 
@@ -88,8 +175,9 @@ func listClaimsFlags() []cli.Flag {
 	cliFlags := []cli.Flag{
 		flags.L1EthRpcFlag,
 		GameAddressFlag,
+		VerboseFlag,
 	}
-	cliFlags = append(cliFlags, oplog.CLIFlags("OP_CHALLENGER")...)
+	cliFlags = append(cliFlags, oplog.CLIFlags(flags.EnvVarPrefix)...)
 	return cliFlags
 }
 
@@ -99,5 +187,4 @@ var ListClaimsCommand = &cli.Command{
 	Description: "Lists the claims in a dispute game",
 	Action:      ListClaims,
 	Flags:       listClaimsFlags(),
-	Hidden:      true,
 }
diff --git a/op-challenger/cmd/list_games.go b/op-challenger/cmd/list_games.go
index ce7ddb13cde9..c718002fb771 100644
--- a/op-challenger/cmd/list_games.go
+++ b/op-challenger/cmd/list_games.go
@@ -1,22 +1,45 @@
 package main
 
 import (
+	"cmp"
 	"context"
 	"fmt"
+	"slices"
 	"sync"
 	"time"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/flags"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	opservice "github.com/ethereum-optimism/optimism/op-service"
+	"github.com/ethereum-optimism/optimism/op-service/clock"
 	"github.com/ethereum-optimism/optimism/op-service/dial"
+	openum "github.com/ethereum-optimism/optimism/op-service/enum"
 	oplog "github.com/ethereum-optimism/optimism/op-service/log"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/urfave/cli/v2"
 )
 
+var ColumnTypes = []string{"time", "claimCount", "l2BlockNum"}
+
+var (
+	SortByFlag = &cli.StringFlag{
+		Name:    "sort-by",
+		Usage:   "Sort games by column. Valid options: " + openum.EnumString(ColumnTypes),
+		Value:   "time",
+		EnvVars: opservice.PrefixEnvVar(flags.EnvVarPrefix, "SORT_BY"),
+	}
+	SortOrderFlag = &cli.StringFlag{
+		Name:    "sort-order",
+		Usage:   "Sort order for games. Valid options: 'asc' or 'desc'.",
+		Value:   "asc",
+		EnvVars: opservice.PrefixEnvVar(flags.EnvVarPrefix, "SORT_ORDER"),
+	}
+)
+
 func ListGames(ctx *cli.Context) error {
 	logger, err := setupLogging(ctx)
 	if err != nil {
@@ -30,6 +53,16 @@ func ListGames(ctx *cli.Context) error {
 	if err != nil {
 		return err
 	}
+	sortBy := ctx.String(SortByFlag.Name)
+	if sortBy != "" && !slices.Contains(ColumnTypes, sortBy) {
+		return fmt.Errorf("invalid sort-by value: %v", sortBy)
+	}
+	sortOrder := ctx.String(SortOrderFlag.Name)
+	if sortOrder != "" && sortOrder != "asc" && sortOrder != "desc" {
+		return fmt.Errorf("invalid sort-order value: %v", sortOrder)
+	}
+
+	gameWindow := ctx.Duration(flags.GameWindowFlag.Name)
 
 	l1Client, err := dial.DialEthClientWithTimeout(ctx.Context, dial.DefaultDialTimeout, logger, rpcUrl)
 	if err != nil {
@@ -38,74 +71,110 @@ func ListGames(ctx *cli.Context) error {
 	defer l1Client.Close()
 
 	caller := batching.NewMultiCaller(l1Client.Client(), batching.DefaultBatchSize)
-	contract, err := contracts.NewDisputeGameFactoryContract(factoryAddr, caller)
-	if err != nil {
-		return fmt.Errorf("failed to create dispute game bindings: %w", err)
-	}
+	contract := contracts.NewDisputeGameFactoryContract(metrics.NoopContractMetrics, factoryAddr, caller)
 	head, err := l1Client.HeaderByNumber(ctx.Context, nil)
 	if err != nil {
 		return fmt.Errorf("failed to retrieve current head block: %w", err)
 	}
-	return listGames(ctx.Context, caller, contract, head.Hash())
+	return listGames(ctx.Context, caller, contract, head.Hash(), gameWindow, sortBy, sortOrder)
 }
 
 type gameInfo struct {
 	types.GameMetadata
 	claimCount uint64
+	l2BlockNum uint64
+	rootClaim  common.Hash
 	status     types.GameStatus
 	err        error
 }
 
-func listGames(ctx context.Context, caller *batching.MultiCaller, factory *contracts.DisputeGameFactoryContract, block common.Hash) error {
-	games, err := factory.GetAllGames(ctx, block)
+func listGames(ctx context.Context, caller *batching.MultiCaller, factory *contracts.DisputeGameFactoryContract, block common.Hash, gameWindow time.Duration, sortBy, sortOrder string) error {
+	earliestTimestamp := clock.MinCheckedTimestamp(clock.SystemClock, gameWindow)
+	games, err := factory.GetGamesAtOrAfter(ctx, block, earliestTimestamp)
 	if err != nil {
 		return fmt.Errorf("failed to retrieve games: %w", err)
 	}
+	slices.Reverse(games)
 
-	infos := make([]*gameInfo, len(games))
+	infos := make([]gameInfo, len(games))
 	var wg sync.WaitGroup
 	for idx, game := range games {
-		gameContract, err := contracts.NewFaultDisputeGameContract(game.Proxy, caller)
+		gameContract, err := contracts.NewFaultDisputeGameContract(ctx, metrics.NoopContractMetrics, game.Proxy, caller)
 		if err != nil {
-			return fmt.Errorf("failed to bind game contract at %v: %w", game.Proxy, err)
+			return fmt.Errorf("failed to create dispute game contract: %w", err)
 		}
 		info := gameInfo{GameMetadata: game}
-		infos[idx] = &info
+		infos[idx] = info
 		gameProxy := game.Proxy
+		currIndex := idx
 		wg.Add(1)
 		go func() {
 			defer wg.Done()
-			claimCount, err := gameContract.GetClaimCount(ctx)
+			metadata, err := gameContract.GetGameMetadata(ctx, rpcblock.ByHash(block))
 			if err != nil {
-				info.err = fmt.Errorf("failed to retrieve claim count for game %v: %w", gameProxy, err)
+				info.err = fmt.Errorf("failed to retrieve metadata for game %v: %w", gameProxy, err)
 				return
 			}
-			info.claimCount = claimCount
-			status, err := gameContract.GetStatus(ctx)
+			infos[currIndex].status = metadata.Status
+			infos[currIndex].l2BlockNum = metadata.L2BlockNum
+			infos[currIndex].rootClaim = metadata.RootClaim
+			claimCount, err := gameContract.GetClaimCount(ctx)
 			if err != nil {
-				info.err = fmt.Errorf("failed to retrieve status for game %v: %w", gameProxy, err)
+				info.err = fmt.Errorf("failed to retrieve claim count for game %v: %w", gameProxy, err)
 				return
 			}
-			info.status = status
+			infos[currIndex].claimCount = claimCount
 		}()
 	}
 	wg.Wait()
-	for idx, game := range infos {
+	lineFormat := "%3v %-42v %4v %-21v %14v %-66v %6v %-14v\n"
+	fmt.Printf(lineFormat, "Idx", "Game", "Type", "Created (Local)", "L2 Block", "Output Root", "Claims", "Status")
+
+	// Sort infos by the specified column
+	switch sortBy {
+	case "time":
+		slices.SortFunc(infos, func(i, j gameInfo) int {
+			if sortOrder == "desc" {
+				return cmp.Compare(j.Timestamp, i.Timestamp)
+			}
+			return cmp.Compare(i.Timestamp, j.Timestamp)
+		})
+	case "claimCount":
+		slices.SortFunc(infos, func(i, j gameInfo) int {
+			if sortOrder == "desc" {
+				return cmp.Compare(j.claimCount, i.claimCount)
+			}
+			return cmp.Compare(i.claimCount, j.claimCount)
+		})
+	case "l2BlockNum":
+		slices.SortFunc(infos, func(i, j gameInfo) int {
+			if sortOrder == "desc" {
+				return cmp.Compare(j.l2BlockNum, i.l2BlockNum)
+			}
+			return cmp.Compare(i.l2BlockNum, j.l2BlockNum)
+		})
+	}
+
+	for _, game := range infos {
 		if game.err != nil {
-			return err
+			return game.err
 		}
-		fmt.Printf("%v Game: %v Type: %v Created: %v Claims: %v Status: %v\n",
-			idx, game.Proxy, game.GameType, time.Unix(int64(game.Timestamp), 0), game.claimCount, game.status)
+		created := time.Unix(int64(game.Timestamp), 0).Format(time.DateTime)
+		fmt.Printf(lineFormat,
+			game.Index, game.Proxy, game.GameType, created, game.l2BlockNum, game.rootClaim, game.claimCount, game.status)
 	}
 	return nil
 }
 
 func listGamesFlags() []cli.Flag {
 	cliFlags := []cli.Flag{
+		SortByFlag,
+		SortOrderFlag,
 		flags.L1EthRpcFlag,
 		flags.FactoryAddressFlag,
+		flags.GameWindowFlag,
 	}
-	cliFlags = append(cliFlags, oplog.CLIFlags("OP_CHALLENGER")...)
+	cliFlags = append(cliFlags, oplog.CLIFlags(flags.EnvVarPrefix)...)
 	return cliFlags
 }
 
@@ -115,5 +184,4 @@ var ListGamesCommand = &cli.Command{
 	Description: "Lists the games created by a dispute game factory",
 	Action:      ListGames,
 	Flags:       listGamesFlags(),
-	Hidden:      true,
 }
diff --git a/op-challenger/cmd/main.go b/op-challenger/cmd/main.go
index 292959049dbd..1d64ed42460b 100644
--- a/op-challenger/cmd/main.go
+++ b/op-challenger/cmd/main.go
@@ -4,6 +4,7 @@ import (
 	"context"
 	"os"
 
+	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
 	"github.com/urfave/cli/v2"
 
 	"github.com/ethereum/go-ethereum/log"
@@ -29,7 +30,9 @@ var VersionWithMeta = opservice.FormatVersion(version.Version, GitCommit, GitDat
 func main() {
 	args := os.Args
 	ctx := opio.WithInterruptBlocker(context.Background())
-	if err := run(ctx, args, challenger.Main); err != nil {
+	if err := run(ctx, args, func(ctx context.Context, l log.Logger, config *config.Config) (cliapp.Lifecycle, error) {
+		return challenger.Main(ctx, l, config, metrics.NewMetrics())
+	}); err != nil {
 		log.Crit("Application failed", "err", err)
 	}
 }
@@ -51,6 +54,7 @@ func run(ctx context.Context, args []string, action ConfiguredLifecycle) error {
 		CreateGameCommand,
 		MoveCommand,
 		ResolveCommand,
+		ResolveClaimCommand,
 	}
 	app.Action = cliapp.LifecycleCmd(func(ctx *cli.Context, close context.CancelCauseFunc) (cliapp.Lifecycle, error) {
 		logger, err := setupLogging(ctx)
@@ -59,7 +63,7 @@ func run(ctx context.Context, args []string, action ConfiguredLifecycle) error {
 		}
 		logger.Info("Starting op-challenger", "version", VersionWithMeta)
 
-		cfg, err := flags.NewConfigFromCLI(ctx)
+		cfg, err := flags.NewConfigFromCLI(ctx, logger)
 		if err != nil {
 			return nil, err
 		}
diff --git a/op-challenger/cmd/main_test.go b/op-challenger/cmd/main_test.go
index d8d5e0d4bce0..23ba4230b5f6 100644
--- a/op-challenger/cmd/main_test.go
+++ b/op-challenger/cmd/main_test.go
@@ -22,13 +22,17 @@ var (
 	l1Beacon                = "http://example.com:9000"
 	gameFactoryAddressValue = "0xbb00000000000000000000000000000000000000"
 	cannonNetwork           = "op-mainnet"
-	otherCannonNetwork      = "op-goerli"
+	testNetwork             = "op-sepolia"
+	l2EthRpc                = "http://example.com:9545"
 	cannonBin               = "./bin/cannon"
 	cannonServer            = "./bin/op-program"
 	cannonPreState          = "./pre.json"
 	datadir                 = "./test_data"
-	cannonL2                = "http://example.com:9545"
 	rollupRpc               = "http://example.com:8555"
+	asteriscNetwork         = "op-mainnet"
+	asteriscBin             = "./bin/asterisc"
+	asteriscServer          = "./bin/op-program"
+	asteriscPreState        = "./pre.json"
 )
 
 func TestLogLevel(t *testing.T) {
@@ -48,17 +52,12 @@ func TestLogLevel(t *testing.T) {
 
 func TestDefaultCLIOptionsMatchDefaultConfig(t *testing.T) {
 	cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet))
-	defaultCfg := config.NewConfig(common.HexToAddress(gameFactoryAddressValue), l1EthRpc, l1Beacon, datadir, config.TraceTypeAlphabet)
-	// Add in the extra CLI options required when using alphabet trace type
-	defaultCfg.RollupRpc = rollupRpc
+	defaultCfg := config.NewConfig(common.HexToAddress(gameFactoryAddressValue), l1EthRpc, l1Beacon, rollupRpc, l2EthRpc, datadir, config.TraceTypeAlphabet)
 	require.Equal(t, defaultCfg, cfg)
 }
 
 func TestDefaultConfigIsValid(t *testing.T) {
-	cfg := config.NewConfig(common.HexToAddress(gameFactoryAddressValue), l1EthRpc, l1Beacon, datadir, config.TraceTypeAlphabet)
-	// Add in options that are required based on the specific trace type
-	// To avoid needing to specify unused options, these aren't included in the params for NewConfig
-	cfg.RollupRpc = rollupRpc
+	cfg := config.NewConfig(common.HexToAddress(gameFactoryAddressValue), l1EthRpc, l1Beacon, rollupRpc, l2EthRpc, datadir, config.TraceTypeAlphabet)
 	require.NoError(t, cfg.Check())
 }
 
@@ -110,19 +109,21 @@ func TestTraceType(t *testing.T) {
 func TestMultipleTraceTypes(t *testing.T) {
 	t.Run("WithAllOptions", func(t *testing.T) {
 		argsMap := requiredArgs(config.TraceTypeCannon)
-		addRequiredOutputArgs(argsMap)
+		// Add Asterisc required flags
+		addRequiredAsteriscArgs(argsMap)
 		args := toArgList(argsMap)
 		// Add extra trace types (cannon is already specified)
 		args = append(args,
 			"--trace-type", config.TraceTypeAlphabet.String())
 		args = append(args,
 			"--trace-type", config.TraceTypePermissioned.String())
+		args = append(args,
+			"--trace-type", config.TraceTypeAsterisc.String())
 		cfg := configForArgs(t, args)
-		require.Equal(t, []config.TraceType{config.TraceTypeCannon, config.TraceTypeAlphabet, config.TraceTypePermissioned}, cfg.TraceTypes)
+		require.Equal(t, []config.TraceType{config.TraceTypeCannon, config.TraceTypeAlphabet, config.TraceTypePermissioned, config.TraceTypeAsterisc}, cfg.TraceTypes)
 	})
 	t.Run("WithSomeOptions", func(t *testing.T) {
 		argsMap := requiredArgs(config.TraceTypeCannon)
-		addRequiredOutputArgs(argsMap)
 		args := toArgList(argsMap)
 		// Add extra trace types (cannon is already specified)
 		args = append(args,
@@ -243,6 +244,204 @@ func TestPollInterval(t *testing.T) {
 	})
 }
 
+func TestAsteriscRequiredArgs(t *testing.T) {
+	for _, traceType := range []config.TraceType{config.TraceTypeAsterisc} {
+		traceType := traceType
+		t.Run(fmt.Sprintf("TestAsteriscBin-%v", traceType), func(t *testing.T) {
+			t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
+				configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--asterisc-bin"))
+			})
+
+			t.Run("Required", func(t *testing.T) {
+				verifyArgsInvalid(t, "flag asterisc-bin is required", addRequiredArgsExcept(traceType, "--asterisc-bin"))
+			})
+
+			t.Run("Valid", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-bin", "--asterisc-bin=./asterisc"))
+				require.Equal(t, "./asterisc", cfg.AsteriscBin)
+			})
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscServer-%v", traceType), func(t *testing.T) {
+			t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
+				configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--asterisc-server"))
+			})
+
+			t.Run("Required", func(t *testing.T) {
+				verifyArgsInvalid(t, "flag asterisc-server is required", addRequiredArgsExcept(traceType, "--asterisc-server"))
+			})
+
+			t.Run("Valid", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-server", "--asterisc-server=./op-program"))
+				require.Equal(t, "./op-program", cfg.AsteriscServer)
+			})
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscAbsolutePrestate-%v", traceType), func(t *testing.T) {
+			t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
+				configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--asterisc-prestate"))
+			})
+
+			t.Run("Required", func(t *testing.T) {
+				verifyArgsInvalid(t, "flag asterisc-prestates-url or asterisc-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-prestate"))
+			})
+
+			t.Run("Valid", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-prestate", "--asterisc-prestate=./pre.json"))
+				require.Equal(t, "./pre.json", cfg.AsteriscAbsolutePreState)
+			})
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscAbsolutePrestateBaseURL-%v", traceType), func(t *testing.T) {
+			t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
+				configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--asterisc-prestates-url"))
+			})
+
+			t.Run("Required", func(t *testing.T) {
+				verifyArgsInvalid(t, "flag asterisc-prestates-url or asterisc-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-prestate"))
+			})
+
+			t.Run("Valid", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-prestates-url", "--asterisc-prestates-url=http://localhost/bar"))
+				require.Equal(t, "http://localhost/bar", cfg.AsteriscAbsolutePreStateBaseURL.String())
+			})
+		})
+
+		t.Run(fmt.Sprintf("TestL2Rpc-%v", traceType), func(t *testing.T) {
+			t.Run("RequiredForAsteriscTrace", func(t *testing.T) {
+				verifyArgsInvalid(t, "flag l2-eth-rpc is required", addRequiredArgsExcept(traceType, "--l2-eth-rpc"))
+			})
+
+			t.Run("ValidLegacy", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--l2-eth-rpc", fmt.Sprintf("--cannon-l2=%s", l2EthRpc)))
+				require.Equal(t, l2EthRpc, cfg.L2Rpc)
+			})
+
+			t.Run("Valid", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgs(traceType))
+				require.Equal(t, l2EthRpc, cfg.L2Rpc)
+			})
+
+			t.Run("InvalidUsingBothFlags", func(t *testing.T) {
+				verifyArgsInvalid(t, "flag cannon-l2 and l2-eth-rpc must not be both set", addRequiredArgsExcept(traceType, "", fmt.Sprintf("--cannon-l2=%s", l2EthRpc)))
+			})
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscSnapshotFreq-%v", traceType), func(t *testing.T) {
+			t.Run("UsesDefault", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgs(traceType))
+				require.Equal(t, config.DefaultAsteriscSnapshotFreq, cfg.AsteriscSnapshotFreq)
+			})
+
+			t.Run("Valid", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgs(traceType, "--asterisc-snapshot-freq=1234"))
+				require.Equal(t, uint(1234), cfg.AsteriscSnapshotFreq)
+			})
+
+			t.Run("Invalid", func(t *testing.T) {
+				verifyArgsInvalid(t, "invalid value \"abc\" for flag -asterisc-snapshot-freq",
+					addRequiredArgs(traceType, "--asterisc-snapshot-freq=abc"))
+			})
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscInfoFreq-%v", traceType), func(t *testing.T) {
+			t.Run("UsesDefault", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgs(traceType))
+				require.Equal(t, config.DefaultAsteriscInfoFreq, cfg.AsteriscInfoFreq)
+			})
+
+			t.Run("Valid", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgs(traceType, "--asterisc-info-freq=1234"))
+				require.Equal(t, uint(1234), cfg.AsteriscInfoFreq)
+			})
+
+			t.Run("Invalid", func(t *testing.T) {
+				verifyArgsInvalid(t, "invalid value \"abc\" for flag -asterisc-info-freq",
+					addRequiredArgs(traceType, "--asterisc-info-freq=abc"))
+			})
+		})
+
+		t.Run(fmt.Sprintf("TestRequireEitherAsteriscNetworkOrRollupAndGenesis-%v", traceType), func(t *testing.T) {
+			verifyArgsInvalid(
+				t,
+				"flag asterisc-network or asterisc-rollup-config and asterisc-l2-genesis is required",
+				addRequiredArgsExcept(traceType, "--asterisc-network"))
+			verifyArgsInvalid(
+				t,
+				"flag asterisc-network or asterisc-rollup-config and asterisc-l2-genesis is required",
+				addRequiredArgsExcept(traceType, "--asterisc-network", "--asterisc-rollup-config=rollup.json"))
+			verifyArgsInvalid(
+				t,
+				"flag asterisc-network or asterisc-rollup-config and asterisc-l2-genesis is required",
+				addRequiredArgsExcept(traceType, "--asterisc-network", "--asterisc-l2-genesis=gensis.json"))
+		})
+
+		t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) {
+			verifyArgsInvalid(
+				t,
+				"flag asterisc-network can not be used with asterisc-rollup-config and asterisc-l2-genesis",
+				addRequiredArgsExcept(traceType, "--asterisc-network",
+					"--asterisc-network", asteriscNetwork, "--asterisc-rollup-config=rollup.json"))
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscNetwork-%v", traceType), func(t *testing.T) {
+			t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
+				configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--asterisc-network"))
+			})
+
+			t.Run("NotRequiredWhenRollupAndGenesIsSpecified", func(t *testing.T) {
+				configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-network",
+					"--asterisc-rollup-config=rollup.json", "--asterisc-l2-genesis=genesis.json"))
+			})
+
+			t.Run("Valid", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-network", "--asterisc-network", testNetwork))
+				require.Equal(t, testNetwork, cfg.AsteriscNetwork)
+			})
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscRollupConfig-%v", traceType), func(t *testing.T) {
+			t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
+				configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--asterisc-rollup-config"))
+			})
+
+			t.Run("Valid", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-network", "--asterisc-rollup-config=rollup.json", "--asterisc-l2-genesis=genesis.json"))
+				require.Equal(t, "rollup.json", cfg.AsteriscRollupConfigPath)
+			})
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscL2Genesis-%v", traceType), func(t *testing.T) {
+			t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
+				configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--asterisc-l2-genesis"))
+			})
+
+			t.Run("Valid", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-network", "--asterisc-rollup-config=rollup.json", "--asterisc-l2-genesis=genesis.json"))
+				require.Equal(t, "genesis.json", cfg.AsteriscL2GenesisPath)
+			})
+		})
+	}
+}
+
+func TestAlphabetRequiredArgs(t *testing.T) {
+	t.Run(fmt.Sprintf("TestL2Rpc-%v", config.TraceTypeAlphabet), func(t *testing.T) {
+		t.Run("RequiredForAlphabetTrace", func(t *testing.T) {
+			verifyArgsInvalid(t, "flag l2-eth-rpc is required", addRequiredArgsExcept(config.TraceTypeAlphabet, "--l2-eth-rpc"))
+		})
+
+		t.Run("ValidLegacy", func(t *testing.T) {
+			cfg := configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--l2-eth-rpc", fmt.Sprintf("--cannon-l2=%s", l2EthRpc)))
+			require.Equal(t, l2EthRpc, cfg.L2Rpc)
+		})
+
+		t.Run("Valid", func(t *testing.T) {
+			cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet))
+			require.Equal(t, l2EthRpc, cfg.L2Rpc)
+		})
+	})
+}
+
 func TestCannonRequiredArgs(t *testing.T) {
 	for _, traceType := range []config.TraceType{config.TraceTypeCannon, config.TraceTypePermissioned} {
 		traceType := traceType
@@ -282,7 +481,7 @@ func TestCannonRequiredArgs(t *testing.T) {
 			})
 
 			t.Run("Required", func(t *testing.T) {
-				verifyArgsInvalid(t, "flag cannon-prestate is required", addRequiredArgsExcept(traceType, "--cannon-prestate"))
+				verifyArgsInvalid(t, "flag cannon-prestates-url or cannon-prestate is required", addRequiredArgsExcept(traceType, "--cannon-prestate"))
 			})
 
 			t.Run("Valid", func(t *testing.T) {
@@ -291,18 +490,34 @@ func TestCannonRequiredArgs(t *testing.T) {
 			})
 		})
 
-		t.Run(fmt.Sprintf("TestCannonL2-%v", traceType), func(t *testing.T) {
+		t.Run(fmt.Sprintf("TestCannonAbsolutePrestateBaseURL-%v", traceType), func(t *testing.T) {
 			t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
-				configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--cannon-l2"))
+				configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--cannon-prestates-url"))
+			})
+
+			t.Run("Required", func(t *testing.T) {
+				verifyArgsInvalid(t, "flag cannon-prestates-url or cannon-prestate is required", addRequiredArgsExcept(traceType, "--cannon-prestate"))
+			})
+
+			t.Run("Valid", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--cannon-prestates-url", "--cannon-prestates-url=http://localhost/foo"))
+				require.Equal(t, "http://localhost/foo", cfg.CannonAbsolutePreStateBaseURL.String())
 			})
+		})
 
+		t.Run(fmt.Sprintf("TestL2Rpc-%v", traceType), func(t *testing.T) {
 			t.Run("RequiredForCannonTrace", func(t *testing.T) {
-				verifyArgsInvalid(t, "flag cannon-l2 is required", addRequiredArgsExcept(traceType, "--cannon-l2"))
+				verifyArgsInvalid(t, "flag l2-eth-rpc is required", addRequiredArgsExcept(traceType, "--l2-eth-rpc"))
+			})
+
+			t.Run("ValidLegacy", func(t *testing.T) {
+				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--l2-eth-rpc", fmt.Sprintf("--cannon-l2=%s", l2EthRpc)))
+				require.Equal(t, l2EthRpc, cfg.L2Rpc)
 			})
 
 			t.Run("Valid", func(t *testing.T) {
 				cfg := configForArgs(t, addRequiredArgs(traceType))
-				require.Equal(t, cannonL2, cfg.CannonL2)
+				require.Equal(t, l2EthRpc, cfg.L2Rpc)
 			})
 		})
 
@@ -374,8 +589,8 @@ func TestCannonRequiredArgs(t *testing.T) {
 			})
 
 			t.Run("Valid", func(t *testing.T) {
-				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--cannon-network", "--cannon-network", otherCannonNetwork))
-				require.Equal(t, otherCannonNetwork, cfg.CannonNetwork)
+				cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--cannon-network", "--cannon-network", testNetwork))
+				require.Equal(t, testNetwork, cfg.CannonNetwork)
 			})
 		})
 
@@ -390,7 +605,7 @@ func TestCannonRequiredArgs(t *testing.T) {
 			})
 		})
 
-		t.Run(fmt.Sprintf("TestCannonL2Genesis-%v", traceType), func(t *testing.T) {
+		t.Run(fmt.Sprintf("TestCannonL2qGenesis-%v", traceType), func(t *testing.T) {
 			t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
 				configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--cannon-l2-genesis"))
 			})
@@ -445,7 +660,7 @@ func TestGameWindow(t *testing.T) {
 	})
 
 	t.Run("ParsesDefault", func(t *testing.T) {
-		cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet, "--game-window=360h"))
+		cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet, "--game-window=672h"))
 		require.Equal(t, config.DefaultGameWindow, cfg.GameWindow)
 	})
 }
@@ -553,6 +768,8 @@ func requiredArgs(traceType config.TraceType) map[string]string {
 	args := map[string]string{
 		"--l1-eth-rpc":           l1EthRpc,
 		"--l1-beacon":            l1Beacon,
+		"--rollup-rpc":           rollupRpc,
+		"--l2-eth-rpc":           l2EthRpc,
 		"--game-factory-address": gameFactoryAddressValue,
 		"--trace-type":           traceType.String(),
 		"--datadir":              datadir,
@@ -560,8 +777,8 @@ func requiredArgs(traceType config.TraceType) map[string]string {
 	switch traceType {
 	case config.TraceTypeCannon, config.TraceTypePermissioned:
 		addRequiredCannonArgs(args)
-	case config.TraceTypeAlphabet:
-		addRequiredOutputArgs(args)
+	case config.TraceTypeAsterisc:
+		addRequiredAsteriscArgs(args)
 	}
 	return args
 }
@@ -571,12 +788,15 @@ func addRequiredCannonArgs(args map[string]string) {
 	args["--cannon-bin"] = cannonBin
 	args["--cannon-server"] = cannonServer
 	args["--cannon-prestate"] = cannonPreState
-	args["--cannon-l2"] = cannonL2
-	addRequiredOutputArgs(args)
+	args["--l2-eth-rpc"] = l2EthRpc
 }
 
-func addRequiredOutputArgs(args map[string]string) {
-	args["--rollup-rpc"] = rollupRpc
+func addRequiredAsteriscArgs(args map[string]string) {
+	args["--asterisc-network"] = asteriscNetwork
+	args["--asterisc-bin"] = asteriscBin
+	args["--asterisc-server"] = asteriscServer
+	args["--asterisc-prestate"] = asteriscPreState
+	args["--l2-eth-rpc"] = l2EthRpc
 }
 
 func toArgList(req map[string]string) []string {
diff --git a/op-challenger/cmd/move.go b/op-challenger/cmd/move.go
index a0854319ee7c..e7cf2587aa4f 100644
--- a/op-challenger/cmd/move.go
+++ b/op-challenger/cmd/move.go
@@ -46,19 +46,23 @@ func Move(ctx *cli.Context) error {
 		return fmt.Errorf("both attack and defense flags cannot be set")
 	}
 
-	contract, txMgr, err := NewContractWithTxMgr[*contracts.FaultDisputeGameContract](ctx, GameAddressFlag.Name, contracts.NewFaultDisputeGameContract)
+	contract, txMgr, err := NewContractWithTxMgr[contracts.FaultDisputeGameContract](ctx, GameAddressFlag.Name, contracts.NewFaultDisputeGameContract)
 	if err != nil {
 		return fmt.Errorf("failed to create dispute game bindings: %w", err)
 	}
 
+	parentClaim, err := contract.GetClaim(ctx.Context, parentIndex)
+	if err != nil {
+		return fmt.Errorf("failed to get parent claim: %w", err)
+	}
 	var tx txmgr.TxCandidate
 	if attack {
-		tx, err = contract.AttackTx(parentIndex, claim)
+		tx, err = contract.AttackTx(ctx.Context, parentClaim, claim)
 		if err != nil {
 			return fmt.Errorf("failed to create attack tx: %w", err)
 		}
 	} else if defend {
-		tx, err = contract.DefendTx(parentIndex, claim)
+		tx, err = contract.DefendTx(ctx.Context, parentClaim, claim)
 		if err != nil {
 			return fmt.Errorf("failed to create defense tx: %w", err)
 		}
@@ -95,5 +99,4 @@ var MoveCommand = &cli.Command{
 	Description: "Creates and sends a move transaction to the dispute game",
 	Action:      Move,
 	Flags:       moveFlags(),
-	Hidden:      true,
 }
diff --git a/op-challenger/cmd/resolve.go b/op-challenger/cmd/resolve.go
index 5cbddffcbed3..0e5dfb8f3878 100644
--- a/op-challenger/cmd/resolve.go
+++ b/op-challenger/cmd/resolve.go
@@ -12,7 +12,7 @@ import (
 )
 
 func Resolve(ctx *cli.Context) error {
-	contract, txMgr, err := NewContractWithTxMgr[*contracts.FaultDisputeGameContract](ctx, GameAddressFlag.Name, contracts.NewFaultDisputeGameContract)
+	contract, txMgr, err := NewContractWithTxMgr[contracts.FaultDisputeGameContract](ctx, GameAddressFlag.Name, contracts.NewFaultDisputeGameContract)
 	if err != nil {
 		return fmt.Errorf("failed to create dispute game bindings: %w", err)
 	}
@@ -48,5 +48,4 @@ var ResolveCommand = &cli.Command{
 	Description: "Resolves the specified dispute game if possible",
 	Action:      Resolve,
 	Flags:       resolveFlags(),
-	Hidden:      true,
 }
diff --git a/op-challenger/cmd/resolve_claim.go b/op-challenger/cmd/resolve_claim.go
new file mode 100644
index 000000000000..103aa2c7a7d7
--- /dev/null
+++ b/op-challenger/cmd/resolve_claim.go
@@ -0,0 +1,71 @@
+package main
+
+import (
+	"context"
+	"fmt"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/flags"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
+	opservice "github.com/ethereum-optimism/optimism/op-service"
+	oplog "github.com/ethereum-optimism/optimism/op-service/log"
+	"github.com/ethereum-optimism/optimism/op-service/txmgr"
+	"github.com/urfave/cli/v2"
+)
+
+var (
+	ClaimIdxFlag = &cli.Uint64Flag{
+		Name:    "claim",
+		Usage:   "Index of the claim to resolve.",
+		EnvVars: opservice.PrefixEnvVar(flags.EnvVarPrefix, "CLAIM"),
+	}
+)
+
+func ResolveClaim(ctx *cli.Context) error {
+	if !ctx.IsSet(ClaimIdxFlag.Name) {
+		return fmt.Errorf("must specify %v flag", ClaimIdxFlag.Name)
+	}
+	idx := ctx.Uint64(ClaimIdxFlag.Name)
+
+	contract, txMgr, err := NewContractWithTxMgr[contracts.FaultDisputeGameContract](ctx, GameAddressFlag.Name, contracts.NewFaultDisputeGameContract)
+	if err != nil {
+		return fmt.Errorf("failed to create dispute game bindings: %w", err)
+	}
+
+	err = contract.CallResolveClaim(ctx.Context, idx)
+	if err != nil {
+		return fmt.Errorf("claim is not resolvable: %w", err)
+	}
+
+	tx, err := contract.ResolveClaimTx(idx)
+	if err != nil {
+		return fmt.Errorf("failed to create resolve claim tx: %w", err)
+	}
+
+	rct, err := txMgr.Send(context.Background(), tx)
+	if err != nil {
+		return fmt.Errorf("failed to send tx: %w", err)
+	}
+
+	fmt.Printf("Sent resolve claim tx with status: %v, hash: %s\n", rct.Status, rct.TxHash.String())
+
+	return nil
+}
+
+func resolveClaimFlags() []cli.Flag {
+	cliFlags := []cli.Flag{
+		flags.L1EthRpcFlag,
+		GameAddressFlag,
+		ClaimIdxFlag,
+	}
+	cliFlags = append(cliFlags, txmgr.CLIFlagsWithDefaults(flags.EnvVarPrefix, txmgr.DefaultChallengerFlagValues)...)
+	cliFlags = append(cliFlags, oplog.CLIFlags(flags.EnvVarPrefix)...)
+	return cliFlags
+}
+
+var ResolveClaimCommand = &cli.Command{
+	Name:        "resolve-claim",
+	Usage:       "Resolves the specified claim if possible",
+	Description: "Resolves the specified claim if possible",
+	Action:      ResolveClaim,
+	Flags:       resolveClaimFlags(),
+}
diff --git a/op-challenger/cmd/utils.go b/op-challenger/cmd/utils.go
index e15a8bbd260d..ad5d30a8d41d 100644
--- a/op-challenger/cmd/utils.go
+++ b/op-challenger/cmd/utils.go
@@ -1,9 +1,11 @@
 package main
 
 import (
+	"context"
 	"fmt"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/flags"
+	contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	opservice "github.com/ethereum-optimism/optimism/op-service"
 	"github.com/ethereum-optimism/optimism/op-service/dial"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
@@ -13,7 +15,7 @@ import (
 	"github.com/urfave/cli/v2"
 )
 
-type ContractCreator[T any] func(common.Address, *batching.MultiCaller) (T, error)
+type ContractCreator[T any] func(context.Context, contractMetrics.ContractMetricer, common.Address, *batching.MultiCaller) (T, error)
 
 // NewContractWithTxMgr creates a new contract and a transaction manager.
 func NewContractWithTxMgr[T any](ctx *cli.Context, flagName string, creator ContractCreator[T]) (T, txmgr.TxManager, error) {
@@ -39,9 +41,9 @@ func newContractFromCLI[T any](ctx *cli.Context, flagName string, caller *batchi
 		return contract, err
 	}
 
-	created, err := creator(gameAddr, caller)
+	created, err := creator(ctx.Context, contractMetrics.NoopContractMetrics, gameAddr, caller)
 	if err != nil {
-		return contract, fmt.Errorf("failed to create dispute game bindings: %w", err)
+		return contract, fmt.Errorf("failed to create contract bindings: %w", err)
 	}
 
 	return created, nil
diff --git a/op-challenger/config/config.go b/op-challenger/config/config.go
index d13c716b803f..6128e33328a6 100644
--- a/op-challenger/config/config.go
+++ b/op-challenger/config/config.go
@@ -3,6 +3,7 @@ package config
 import (
 	"errors"
 	"fmt"
+	"net/url"
 	"runtime"
 	"slices"
 	"time"
@@ -16,24 +17,37 @@ import (
 )
 
 var (
-	ErrMissingTraceType              = errors.New("no supported trace types specified")
-	ErrMissingDatadir                = errors.New("missing datadir")
-	ErrMaxConcurrencyZero            = errors.New("max concurrency must not be 0")
-	ErrMissingCannonL2               = errors.New("missing cannon L2")
-	ErrMissingCannonBin              = errors.New("missing cannon bin")
-	ErrMissingCannonServer           = errors.New("missing cannon server")
-	ErrMissingCannonAbsolutePreState = errors.New("missing cannon absolute pre-state")
-	ErrMissingL1EthRPC               = errors.New("missing l1 eth rpc url")
-	ErrMissingL1Beacon               = errors.New("missing l1 beacon url")
-	ErrMissingGameFactoryAddress     = errors.New("missing game factory address")
-	ErrMissingCannonSnapshotFreq     = errors.New("missing cannon snapshot freq")
-	ErrMissingCannonInfoFreq         = errors.New("missing cannon info freq")
-	ErrMissingCannonRollupConfig     = errors.New("missing cannon network or rollup config path")
-	ErrMissingCannonL2Genesis        = errors.New("missing cannon network or l2 genesis path")
-	ErrCannonNetworkAndRollupConfig  = errors.New("only specify one of network or rollup config path")
-	ErrCannonNetworkAndL2Genesis     = errors.New("only specify one of network or l2 genesis path")
-	ErrCannonNetworkUnknown          = errors.New("unknown cannon network")
-	ErrMissingRollupRpc              = errors.New("missing rollup rpc url")
+	ErrMissingTraceType                 = errors.New("no supported trace types specified")
+	ErrMissingDatadir                   = errors.New("missing datadir")
+	ErrMaxConcurrencyZero               = errors.New("max concurrency must not be 0")
+	ErrMissingL2Rpc                     = errors.New("missing L2 rpc url")
+	ErrMissingCannonBin                 = errors.New("missing cannon bin")
+	ErrMissingCannonServer              = errors.New("missing cannon server")
+	ErrMissingCannonAbsolutePreState    = errors.New("missing cannon absolute pre-state")
+	ErrCannonAbsolutePreStateAndBaseURL = errors.New("only specify one of cannon absolute pre-state and cannon absolute pre-state base URL")
+	ErrMissingL1EthRPC                  = errors.New("missing l1 eth rpc url")
+	ErrMissingL1Beacon                  = errors.New("missing l1 beacon url")
+	ErrMissingGameFactoryAddress        = errors.New("missing game factory address")
+	ErrMissingCannonSnapshotFreq        = errors.New("missing cannon snapshot freq")
+	ErrMissingCannonInfoFreq            = errors.New("missing cannon info freq")
+	ErrMissingCannonRollupConfig        = errors.New("missing cannon network or rollup config path")
+	ErrMissingCannonL2Genesis           = errors.New("missing cannon network or l2 genesis path")
+	ErrCannonNetworkAndRollupConfig     = errors.New("only specify one of network or rollup config path")
+	ErrCannonNetworkAndL2Genesis        = errors.New("only specify one of network or l2 genesis path")
+	ErrCannonNetworkUnknown             = errors.New("unknown cannon network")
+	ErrMissingRollupRpc                 = errors.New("missing rollup rpc url")
+
+	ErrMissingAsteriscBin                 = errors.New("missing asterisc bin")
+	ErrMissingAsteriscServer              = errors.New("missing asterisc server")
+	ErrMissingAsteriscAbsolutePreState    = errors.New("missing asterisc absolute pre-state")
+	ErrAsteriscAbsolutePreStateAndBaseURL = errors.New("only specify one of asterisc absolute pre-state and asterisc absolute pre-state base URL")
+	ErrMissingAsteriscSnapshotFreq        = errors.New("missing asterisc snapshot freq")
+	ErrMissingAsteriscInfoFreq            = errors.New("missing asterisc info freq")
+	ErrMissingAsteriscRollupConfig        = errors.New("missing asterisc network or rollup config path")
+	ErrMissingAsteriscL2Genesis           = errors.New("missing asterisc network or l2 genesis path")
+	ErrAsteriscNetworkAndRollupConfig     = errors.New("only specify one of network or rollup config path")
+	ErrAsteriscNetworkAndL2Genesis        = errors.New("only specify one of network or l2 genesis path")
+	ErrAsteriscNetworkUnknown             = errors.New("unknown asterisc network")
 )
 
 type TraceType string
@@ -41,10 +55,11 @@ type TraceType string
 const (
 	TraceTypeAlphabet     TraceType = "alphabet"
 	TraceTypeCannon       TraceType = "cannon"
+	TraceTypeAsterisc     TraceType = "asterisc"
 	TraceTypePermissioned TraceType = "permissioned"
 )
 
-var TraceTypes = []TraceType{TraceTypeAlphabet, TraceTypeCannon, TraceTypePermissioned}
+var TraceTypes = []TraceType{TraceTypeAlphabet, TraceTypeCannon, TraceTypePermissioned, TraceTypeAsterisc}
 
 func (t TraceType) String() string {
 	return string(t)
@@ -74,14 +89,17 @@ func ValidTraceType(value TraceType) bool {
 }
 
 const (
-	DefaultPollInterval       = time.Second * 12
-	DefaultCannonSnapshotFreq = uint(1_000_000_000)
-	DefaultCannonInfoFreq     = uint(10_000_000)
+	DefaultPollInterval         = time.Second * 12
+	DefaultCannonSnapshotFreq   = uint(1_000_000_000)
+	DefaultCannonInfoFreq       = uint(10_000_000)
+	DefaultAsteriscSnapshotFreq = uint(1_000_000_000)
+	DefaultAsteriscInfoFreq     = uint(10_000_000)
 	// DefaultGameWindow is the default maximum time duration in the past
 	// that the challenger will look for games to progress.
-	// The default value is 15 days, which is an 8 day resolution buffer
-	// and bond claiming buffer plus the 7 day game finalization window.
-	DefaultGameWindow   = time.Duration(15 * 24 * time.Hour)
+	// The default value is 28 days. The worst case duration for a game is 16 days
+	// (due to clock extension), plus 7 days WETH withdrawal delay leaving a 5 day
+	// buffer to monitor games to ensure bonds are claimed.
+	DefaultGameWindow   = time.Duration(28 * 24 * time.Hour)
 	DefaultMaxPendingTx = 10
 )
 
@@ -105,19 +123,31 @@ type Config struct {
 
 	TraceTypes []TraceType // Type of traces supported
 
-	// Specific to the output cannon trace type
-	RollupRpc string
+	RollupRpc string // L2 Rollup RPC Url
+
+	L2Rpc string // L2 RPC Url
 
 	// Specific to the cannon trace provider
-	CannonBin              string // Path to the cannon executable to run when generating trace data
-	CannonServer           string // Path to the op-program executable that provides the pre-image oracle server
-	CannonAbsolutePreState string // File to load the absolute pre-state for Cannon traces from
-	CannonNetwork          string
-	CannonRollupConfigPath string
-	CannonL2GenesisPath    string
-	CannonL2               string // L2 RPC Url
-	CannonSnapshotFreq     uint   // Frequency of snapshots to create when executing cannon (in VM instructions)
-	CannonInfoFreq         uint   // Frequency of cannon progress log messages (in VM instructions)
+	CannonBin                     string   // Path to the cannon executable to run when generating trace data
+	CannonServer                  string   // Path to the op-program executable that provides the pre-image oracle server
+	CannonAbsolutePreState        string   // File to load the absolute pre-state for Cannon traces from
+	CannonAbsolutePreStateBaseURL *url.URL // Base URL to retrieve absolute pre-states for Cannon traces from
+	CannonNetwork                 string
+	CannonRollupConfigPath        string
+	CannonL2GenesisPath           string
+	CannonSnapshotFreq            uint // Frequency of snapshots to create when executing cannon (in VM instructions)
+	CannonInfoFreq                uint // Frequency of cannon progress log messages (in VM instructions)
+
+	// Specific to the asterisc trace provider
+	AsteriscBin                     string   // Path to the asterisc executable to run when generating trace data
+	AsteriscServer                  string   // Path to the op-program executable that provides the pre-image oracle server
+	AsteriscAbsolutePreState        string   // File to load the absolute pre-state for Asterisc traces from
+	AsteriscAbsolutePreStateBaseURL *url.URL // Base URL to retrieve absolute pre-states for Asterisc traces from
+	AsteriscNetwork                 string
+	AsteriscRollupConfigPath        string
+	AsteriscL2GenesisPath           string
+	AsteriscSnapshotFreq            uint // Frequency of snapshots to create when executing asterisc (in VM instructions)
+	AsteriscInfoFreq                uint // Frequency of asterisc progress log messages (in VM instructions)
 
 	MaxPendingTx uint64 // Maximum number of pending transactions (0 == no limit)
 
@@ -130,12 +160,16 @@ func NewConfig(
 	gameFactoryAddress common.Address,
 	l1EthRpc string,
 	l1BeaconApi string,
+	l2RollupRpc string,
+	l2EthRpc string,
 	datadir string,
 	supportedTraceTypes ...TraceType,
 ) Config {
 	return Config{
 		L1EthRpc:           l1EthRpc,
 		L1Beacon:           l1BeaconApi,
+		RollupRpc:          l2RollupRpc,
+		L2Rpc:              l2EthRpc,
 		GameFactoryAddress: gameFactoryAddress,
 		MaxConcurrency:     uint(runtime.NumCPU()),
 		PollInterval:       DefaultPollInterval,
@@ -150,9 +184,11 @@ func NewConfig(
 
 		Datadir: datadir,
 
-		CannonSnapshotFreq: DefaultCannonSnapshotFreq,
-		CannonInfoFreq:     DefaultCannonInfoFreq,
-		GameWindow:         DefaultGameWindow,
+		CannonSnapshotFreq:   DefaultCannonSnapshotFreq,
+		CannonInfoFreq:       DefaultCannonInfoFreq,
+		AsteriscSnapshotFreq: DefaultAsteriscSnapshotFreq,
+		AsteriscInfoFreq:     DefaultAsteriscInfoFreq,
+		GameWindow:           DefaultGameWindow,
 	}
 }
 
@@ -170,6 +206,9 @@ func (c Config) Check() error {
 	if c.RollupRpc == "" {
 		return ErrMissingRollupRpc
 	}
+	if c.L2Rpc == "" {
+		return ErrMissingL2Rpc
+	}
 	if c.GameFactoryAddress == (common.Address{}) {
 		return ErrMissingGameFactoryAddress
 	}
@@ -207,11 +246,11 @@ func (c Config) Check() error {
 				return fmt.Errorf("%w: %v", ErrCannonNetworkUnknown, c.CannonNetwork)
 			}
 		}
-		if c.CannonAbsolutePreState == "" {
+		if c.CannonAbsolutePreState == "" && c.CannonAbsolutePreStateBaseURL == nil {
 			return ErrMissingCannonAbsolutePreState
 		}
-		if c.CannonL2 == "" {
-			return ErrMissingCannonL2
+		if c.CannonAbsolutePreState != "" && c.CannonAbsolutePreStateBaseURL != nil {
+			return ErrCannonAbsolutePreStateAndBaseURL
 		}
 		if c.CannonSnapshotFreq == 0 {
 			return ErrMissingCannonSnapshotFreq
@@ -220,6 +259,44 @@ func (c Config) Check() error {
 			return ErrMissingCannonInfoFreq
 		}
 	}
+	if c.TraceTypeEnabled(TraceTypeAsterisc) {
+		if c.AsteriscBin == "" {
+			return ErrMissingAsteriscBin
+		}
+		if c.AsteriscServer == "" {
+			return ErrMissingAsteriscServer
+		}
+		if c.AsteriscNetwork == "" {
+			if c.AsteriscRollupConfigPath == "" {
+				return ErrMissingAsteriscRollupConfig
+			}
+			if c.AsteriscL2GenesisPath == "" {
+				return ErrMissingAsteriscL2Genesis
+			}
+		} else {
+			if c.AsteriscRollupConfigPath != "" {
+				return ErrAsteriscNetworkAndRollupConfig
+			}
+			if c.AsteriscL2GenesisPath != "" {
+				return ErrAsteriscNetworkAndL2Genesis
+			}
+			if ch := chaincfg.ChainByName(c.AsteriscNetwork); ch == nil {
+				return fmt.Errorf("%w: %v", ErrAsteriscNetworkUnknown, c.AsteriscNetwork)
+			}
+		}
+		if c.AsteriscAbsolutePreState == "" && c.AsteriscAbsolutePreStateBaseURL == nil {
+			return ErrMissingAsteriscAbsolutePreState
+		}
+		if c.AsteriscAbsolutePreState != "" && c.AsteriscAbsolutePreStateBaseURL != nil {
+			return ErrAsteriscAbsolutePreStateAndBaseURL
+		}
+		if c.AsteriscSnapshotFreq == 0 {
+			return ErrMissingAsteriscSnapshotFreq
+		}
+		if c.AsteriscInfoFreq == 0 {
+			return ErrMissingAsteriscInfoFreq
+		}
+	}
 	if err := c.TxMgrConfig.Check(); err != nil {
 		return err
 	}
diff --git a/op-challenger/config/config_test.go b/op-challenger/config/config_test.go
index 01210557c60d..dc2949e41d20 100644
--- a/op-challenger/config/config_test.go
+++ b/op-challenger/config/config_test.go
@@ -2,6 +2,7 @@ package config
 
 import (
 	"fmt"
+	"net/url"
 	"runtime"
 	"testing"
 
@@ -12,30 +13,50 @@ import (
 )
 
 var (
-	validL1EthRpc              = "http://localhost:8545"
-	validL1BeaconUrl           = "http://localhost:9000"
-	validGameFactoryAddress    = common.Address{0x23}
-	validCannonBin             = "./bin/cannon"
-	validCannonOpProgramBin    = "./bin/op-program"
-	validCannonNetwork         = "mainnet"
-	validCannonAbsolutPreState = "pre.json"
-	validDatadir               = "/tmp/data"
-	validCannonL2              = "http://localhost:9545"
-	validRollupRpc             = "http://localhost:8555"
+	validL1EthRpc                        = "http://localhost:8545"
+	validL1BeaconUrl                     = "http://localhost:9000"
+	validGameFactoryAddress              = common.Address{0x23}
+	validCannonBin                       = "./bin/cannon"
+	validCannonOpProgramBin              = "./bin/op-program"
+	validCannonNetwork                   = "mainnet"
+	validCannonAbsolutPreState           = "pre.json"
+	validCannonAbsolutPreStateBaseURL, _ = url.Parse("http://localhost/foo/")
+	validDatadir                         = "/tmp/data"
+	validL2Rpc                           = "http://localhost:9545"
+	validRollupRpc                       = "http://localhost:8555"
+
+	validAsteriscBin                       = "./bin/asterisc"
+	validAsteriscOpProgramBin              = "./bin/op-program"
+	validAsteriscNetwork                   = "mainnet"
+	validAsteriscAbsolutPreState           = "pre.json"
+	validAsteriscAbsolutPreStateBaseURL, _ = url.Parse("http://localhost/bar/")
 )
 
 var cannonTraceTypes = []TraceType{TraceTypeCannon, TraceTypePermissioned}
+var asteriscTraceTypes = []TraceType{TraceTypeAsterisc}
+
+func applyValidConfigForCannon(cfg *Config) {
+	cfg.CannonBin = validCannonBin
+	cfg.CannonServer = validCannonOpProgramBin
+	cfg.CannonAbsolutePreStateBaseURL = validCannonAbsolutPreStateBaseURL
+	cfg.CannonNetwork = validCannonNetwork
+}
+
+func applyValidConfigForAsterisc(cfg *Config) {
+	cfg.AsteriscBin = validAsteriscBin
+	cfg.AsteriscServer = validAsteriscOpProgramBin
+	cfg.AsteriscAbsolutePreStateBaseURL = validAsteriscAbsolutPreStateBaseURL
+	cfg.AsteriscNetwork = validAsteriscNetwork
+}
 
 func validConfig(traceType TraceType) Config {
-	cfg := NewConfig(validGameFactoryAddress, validL1EthRpc, validL1BeaconUrl, validDatadir, traceType)
+	cfg := NewConfig(validGameFactoryAddress, validL1EthRpc, validL1BeaconUrl, validRollupRpc, validL2Rpc, validDatadir, traceType)
 	if traceType == TraceTypeCannon || traceType == TraceTypePermissioned {
-		cfg.CannonBin = validCannonBin
-		cfg.CannonServer = validCannonOpProgramBin
-		cfg.CannonAbsolutePreState = validCannonAbsolutPreState
-		cfg.CannonL2 = validCannonL2
-		cfg.CannonNetwork = validCannonNetwork
+		applyValidConfigForCannon(&cfg)
+	}
+	if traceType == TraceTypeAsterisc {
+		applyValidConfigForAsterisc(&cfg)
 	}
-	cfg.RollupRpc = validRollupRpc
 	return cfg
 }
 
@@ -104,16 +125,38 @@ func TestCannonRequiredArgs(t *testing.T) {
 			require.ErrorIs(t, config.Check(), ErrMissingCannonServer)
 		})
 
-		t.Run(fmt.Sprintf("TestCannonAbsolutePreStateRequired-%v", traceType), func(t *testing.T) {
+		t.Run(fmt.Sprintf("TestCannonAbsolutePreStateOrBaseURLRequired-%v", traceType), func(t *testing.T) {
 			config := validConfig(traceType)
 			config.CannonAbsolutePreState = ""
+			config.CannonAbsolutePreStateBaseURL = nil
 			require.ErrorIs(t, config.Check(), ErrMissingCannonAbsolutePreState)
 		})
 
-		t.Run(fmt.Sprintf("TestCannonL2Required-%v", traceType), func(t *testing.T) {
+		t.Run(fmt.Sprintf("TestCannonAbsolutePreState-%v", traceType), func(t *testing.T) {
 			config := validConfig(traceType)
-			config.CannonL2 = ""
-			require.ErrorIs(t, config.Check(), ErrMissingCannonL2)
+			config.CannonAbsolutePreState = validCannonAbsolutPreState
+			config.CannonAbsolutePreStateBaseURL = nil
+			require.NoError(t, config.Check())
+		})
+
+		t.Run(fmt.Sprintf("TestCannonAbsolutePreStateBaseURL-%v", traceType), func(t *testing.T) {
+			config := validConfig(traceType)
+			config.CannonAbsolutePreState = ""
+			config.CannonAbsolutePreStateBaseURL = validCannonAbsolutPreStateBaseURL
+			require.NoError(t, config.Check())
+		})
+
+		t.Run(fmt.Sprintf("TestMustNotSupplyBothCannonAbsolutePreStateAndBaseURL-%v", traceType), func(t *testing.T) {
+			config := validConfig(traceType)
+			config.CannonAbsolutePreState = validCannonAbsolutPreState
+			config.CannonAbsolutePreStateBaseURL = validCannonAbsolutPreStateBaseURL
+			require.ErrorIs(t, config.Check(), ErrCannonAbsolutePreStateAndBaseURL)
+		})
+
+		t.Run(fmt.Sprintf("TestL2RpcRequired-%v", traceType), func(t *testing.T) {
+			config := validConfig(traceType)
+			config.L2Rpc = ""
+			require.ErrorIs(t, config.Check(), ErrMissingL2Rpc)
 		})
 
 		t.Run(fmt.Sprintf("TestCannonSnapshotFreq-%v", traceType), func(t *testing.T) {
@@ -172,6 +215,112 @@ func TestCannonRequiredArgs(t *testing.T) {
 	}
 }
 
+func TestAsteriscRequiredArgs(t *testing.T) {
+	for _, traceType := range asteriscTraceTypes {
+		traceType := traceType
+
+		t.Run(fmt.Sprintf("TestAsteriscBinRequired-%v", traceType), func(t *testing.T) {
+			config := validConfig(traceType)
+			config.AsteriscBin = ""
+			require.ErrorIs(t, config.Check(), ErrMissingAsteriscBin)
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscServerRequired-%v", traceType), func(t *testing.T) {
+			config := validConfig(traceType)
+			config.AsteriscServer = ""
+			require.ErrorIs(t, config.Check(), ErrMissingAsteriscServer)
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscAbsolutePreStateOrBaseURLRequired-%v", traceType), func(t *testing.T) {
+			config := validConfig(traceType)
+			config.AsteriscAbsolutePreState = ""
+			config.AsteriscAbsolutePreStateBaseURL = nil
+			require.ErrorIs(t, config.Check(), ErrMissingAsteriscAbsolutePreState)
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscAbsolutePreState-%v", traceType), func(t *testing.T) {
+			config := validConfig(traceType)
+			config.AsteriscAbsolutePreState = validAsteriscAbsolutPreState
+			config.AsteriscAbsolutePreStateBaseURL = nil
+			require.NoError(t, config.Check())
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscAbsolutePreStateBaseURL-%v", traceType), func(t *testing.T) {
+			config := validConfig(traceType)
+			config.AsteriscAbsolutePreState = ""
+			config.AsteriscAbsolutePreStateBaseURL = validAsteriscAbsolutPreStateBaseURL
+			require.NoError(t, config.Check())
+		})
+
+		t.Run(fmt.Sprintf("TestMustNotSupplyBothAsteriscAbsolutePreStateAndBaseURL-%v", traceType), func(t *testing.T) {
+			config := validConfig(traceType)
+			config.AsteriscAbsolutePreState = validAsteriscAbsolutPreState
+			config.AsteriscAbsolutePreStateBaseURL = validAsteriscAbsolutPreStateBaseURL
+			require.ErrorIs(t, config.Check(), ErrAsteriscAbsolutePreStateAndBaseURL)
+		})
+
+		t.Run(fmt.Sprintf("TestL2RpcRequired-%v", traceType), func(t *testing.T) {
+			config := validConfig(traceType)
+			config.L2Rpc = ""
+			require.ErrorIs(t, config.Check(), ErrMissingL2Rpc)
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscSnapshotFreq-%v", traceType), func(t *testing.T) {
+			t.Run("MustNotBeZero", func(t *testing.T) {
+				cfg := validConfig(traceType)
+				cfg.AsteriscSnapshotFreq = 0
+				require.ErrorIs(t, cfg.Check(), ErrMissingAsteriscSnapshotFreq)
+			})
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscInfoFreq-%v", traceType), func(t *testing.T) {
+			t.Run("MustNotBeZero", func(t *testing.T) {
+				cfg := validConfig(traceType)
+				cfg.AsteriscInfoFreq = 0
+				require.ErrorIs(t, cfg.Check(), ErrMissingAsteriscInfoFreq)
+			})
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscNetworkOrRollupConfigRequired-%v", traceType), func(t *testing.T) {
+			cfg := validConfig(traceType)
+			cfg.AsteriscNetwork = ""
+			cfg.AsteriscRollupConfigPath = ""
+			cfg.AsteriscL2GenesisPath = "genesis.json"
+			require.ErrorIs(t, cfg.Check(), ErrMissingAsteriscRollupConfig)
+		})
+
+		t.Run(fmt.Sprintf("TestAsteriscNetworkOrL2GenesisRequired-%v", traceType), func(t *testing.T) {
+			cfg := validConfig(traceType)
+			cfg.AsteriscNetwork = ""
+			cfg.AsteriscRollupConfigPath = "foo.json"
+			cfg.AsteriscL2GenesisPath = ""
+			require.ErrorIs(t, cfg.Check(), ErrMissingAsteriscL2Genesis)
+		})
+
+		t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) {
+			cfg := validConfig(traceType)
+			cfg.AsteriscNetwork = validAsteriscNetwork
+			cfg.AsteriscRollupConfigPath = "foo.json"
+			cfg.AsteriscL2GenesisPath = ""
+			require.ErrorIs(t, cfg.Check(), ErrAsteriscNetworkAndRollupConfig)
+		})
+
+		t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndL2Genesis-%v", traceType), func(t *testing.T) {
+			cfg := validConfig(traceType)
+			cfg.AsteriscNetwork = validAsteriscNetwork
+			cfg.AsteriscRollupConfigPath = ""
+			cfg.AsteriscL2GenesisPath = "foo.json"
+			require.ErrorIs(t, cfg.Check(), ErrAsteriscNetworkAndL2Genesis)
+		})
+
+		t.Run(fmt.Sprintf("TestNetworkMustBeValid-%v", traceType), func(t *testing.T) {
+			cfg := validConfig(traceType)
+			cfg.AsteriscNetwork = "unknown"
+			require.ErrorIs(t, cfg.Check(), ErrAsteriscNetworkUnknown)
+		})
+	}
+}
+
 func TestDatadirRequired(t *testing.T) {
 	config := validConfig(TraceTypeAlphabet)
 	config.Datadir = ""
@@ -209,7 +358,7 @@ func TestRollupRpcRequired(t *testing.T) {
 	}
 }
 
-func TestRequireConfigForMultipleTraceTypes(t *testing.T) {
+func TestRequireConfigForMultipleTraceTypesForCannon(t *testing.T) {
 	cfg := validConfig(TraceTypeCannon)
 	cfg.TraceTypes = []TraceType{TraceTypeCannon, TraceTypeAlphabet}
 	// Set all required options and check its valid
@@ -217,11 +366,59 @@ func TestRequireConfigForMultipleTraceTypes(t *testing.T) {
 	require.NoError(t, cfg.Check())
 
 	// Require cannon specific args
-	cfg.CannonL2 = ""
-	require.ErrorIs(t, cfg.Check(), ErrMissingCannonL2)
-	cfg.CannonL2 = validCannonL2
+	cfg.CannonAbsolutePreState = ""
+	cfg.CannonAbsolutePreStateBaseURL = nil
+	require.ErrorIs(t, cfg.Check(), ErrMissingCannonAbsolutePreState)
+	cfg.CannonAbsolutePreState = validCannonAbsolutPreState
 
 	// Require output cannon specific args
 	cfg.RollupRpc = ""
 	require.ErrorIs(t, cfg.Check(), ErrMissingRollupRpc)
 }
+
+func TestRequireConfigForMultipleTraceTypesForAsterisc(t *testing.T) {
+	cfg := validConfig(TraceTypeAsterisc)
+	cfg.TraceTypes = []TraceType{TraceTypeAsterisc, TraceTypeAlphabet}
+	// Set all required options and check its valid
+	cfg.RollupRpc = validRollupRpc
+	require.NoError(t, cfg.Check())
+
+	// Require asterisc specific args
+	cfg.AsteriscAbsolutePreState = ""
+	cfg.AsteriscAbsolutePreStateBaseURL = nil
+	require.ErrorIs(t, cfg.Check(), ErrMissingAsteriscAbsolutePreState)
+	cfg.AsteriscAbsolutePreState = validAsteriscAbsolutPreState
+
+	// Require output asterisc specific args
+	cfg.RollupRpc = ""
+	require.ErrorIs(t, cfg.Check(), ErrMissingRollupRpc)
+}
+
+func TestRequireConfigForMultipleTraceTypesForCannonAndAsterisc(t *testing.T) {
+	cfg := validConfig(TraceTypeCannon)
+	applyValidConfigForAsterisc(&cfg)
+
+	cfg.TraceTypes = []TraceType{TraceTypeCannon, TraceTypeAsterisc, TraceTypeAlphabet}
+	// Set all required options and check its valid
+	cfg.RollupRpc = validRollupRpc
+	require.NoError(t, cfg.Check())
+
+	// Require cannon specific args
+	cfg.CannonBin = ""
+	require.ErrorIs(t, cfg.Check(), ErrMissingCannonBin)
+	cfg.CannonBin = validCannonBin
+
+	// Require asterisc specific args
+	cfg.AsteriscAbsolutePreState = ""
+	cfg.AsteriscAbsolutePreStateBaseURL = nil
+	require.ErrorIs(t, cfg.Check(), ErrMissingAsteriscAbsolutePreState)
+	cfg.AsteriscAbsolutePreState = validAsteriscAbsolutPreState
+
+	// Require cannon specific args
+	cfg.AsteriscServer = ""
+	require.ErrorIs(t, cfg.Check(), ErrMissingAsteriscServer)
+	cfg.AsteriscServer = validAsteriscOpProgramBin
+
+	// Check final config is valid
+	require.NoError(t, cfg.Check())
+}
diff --git a/op-challenger/flags/flags.go b/op-challenger/flags/flags.go
index 718cd5c00b20..2ff53840623d 100644
--- a/op-challenger/flags/flags.go
+++ b/op-challenger/flags/flags.go
@@ -2,11 +2,13 @@ package flags
 
 import (
 	"fmt"
+	"net/url"
 	"runtime"
 	"slices"
 	"strings"
 
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/log"
 	"github.com/urfave/cli/v2"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/config"
@@ -71,6 +73,11 @@ var (
 		EnvVars: prefixEnvVars("MAX_CONCURRENCY"),
 		Value:   uint(runtime.NumCPU()),
 	}
+	L2EthRpcFlag = &cli.StringFlag{
+		Name:    "l2-eth-rpc",
+		Usage:   "L2 Address of L2 JSON-RPC endpoint to use (eth and debug namespace required)  (cannon/asterisc trace type only)",
+		EnvVars: prefixEnvVars("L2_ETH_RPC"),
+	}
 	MaxPendingTransactionsFlag = &cli.Uint64Flag{
 		Name:    "max-pending-tx",
 		Usage:   "The maximum number of pending transactions. 0 for no limit.",
@@ -121,9 +128,15 @@ var (
 		Usage:   "Path to absolute prestate to use when generating trace data (cannon trace type only)",
 		EnvVars: prefixEnvVars("CANNON_PRESTATE"),
 	}
+	CannonPreStatesURLFlag = &cli.StringFlag{
+		Name: "cannon-prestates-url",
+		Usage: "Base URL to absolute prestates to use when generating trace data. " +
+			"Prestates in this directory should be name as .json (cannon trace type only)",
+		EnvVars: prefixEnvVars("CANNON_PRESTATES_URL"),
+	}
 	CannonL2Flag = &cli.StringFlag{
 		Name:    "cannon-l2",
-		Usage:   "L2 Address of L2 JSON-RPC endpoint to use (eth and debug namespace required)  (cannon trace type only)",
+		Usage:   fmt.Sprintf("Deprecated: Use %v instead", L2EthRpcFlag.Name),
 		EnvVars: prefixEnvVars("CANNON_L2"),
 	}
 	CannonSnapshotFreqFlag = &cli.UintFlag{
@@ -138,6 +151,57 @@ var (
 		EnvVars: prefixEnvVars("CANNON_INFO_FREQ"),
 		Value:   config.DefaultCannonInfoFreq,
 	}
+	AsteriscNetworkFlag = &cli.StringFlag{
+		Name: "asterisc-network",
+		Usage: fmt.Sprintf(
+			"Predefined network selection. Available networks: %s (asterisc trace type only)",
+			strings.Join(chaincfg.AvailableNetworks(), ", "),
+		),
+		EnvVars: prefixEnvVars("ASTERISC_NETWORK"),
+	}
+	AsteriscRollupConfigFlag = &cli.StringFlag{
+		Name:    "asterisc-rollup-config",
+		Usage:   "Rollup chain parameters (asterisc trace type only)",
+		EnvVars: prefixEnvVars("ASTERISC_ROLLUP_CONFIG"),
+	}
+	AsteriscL2GenesisFlag = &cli.StringFlag{
+		Name:    "asterisc-l2-genesis",
+		Usage:   "Path to the op-geth genesis file (asterisc trace type only)",
+		EnvVars: prefixEnvVars("ASTERISC_L2_GENESIS"),
+	}
+	AsteriscBinFlag = &cli.StringFlag{
+		Name:    "asterisc-bin",
+		Usage:   "Path to asterisc executable to use when generating trace data (asterisc trace type only)",
+		EnvVars: prefixEnvVars("ASTERISC_BIN"),
+	}
+	AsteriscServerFlag = &cli.StringFlag{
+		Name:    "asterisc-server",
+		Usage:   "Path to executable to use as pre-image oracle server when generating trace data (asterisc trace type only)",
+		EnvVars: prefixEnvVars("ASTERISC_SERVER"),
+	}
+	AsteriscPreStateFlag = &cli.StringFlag{
+		Name:    "asterisc-prestate",
+		Usage:   "Path to absolute prestate to use when generating trace data (asterisc trace type only)",
+		EnvVars: prefixEnvVars("ASTERISC_PRESTATE"),
+	}
+	AsteriscPreStatesURLFlag = &cli.StringFlag{
+		Name: "asterisc-prestates-url",
+		Usage: "Base URL to absolute prestates to use when generating trace data. " +
+			"Prestates in this directory should be name as .json (asterisc trace type only)",
+		EnvVars: prefixEnvVars("ASTERISC_PRESTATES_URL"),
+	}
+	AsteriscSnapshotFreqFlag = &cli.UintFlag{
+		Name:    "asterisc-snapshot-freq",
+		Usage:   "Frequency of asterisc snapshots to generate in VM steps (asterisc trace type only)",
+		EnvVars: prefixEnvVars("ASTERISC_SNAPSHOT_FREQ"),
+		Value:   config.DefaultAsteriscSnapshotFreq,
+	}
+	AsteriscInfoFreqFlag = &cli.UintFlag{
+		Name:    "asterisc-info-freq",
+		Usage:   "Frequency of asterisc info log messages to generate in VM steps (asterisc trace type only)",
+		EnvVars: prefixEnvVars("ASTERISC_INFO_FREQ"),
+		Value:   config.DefaultAsteriscInfoFreq,
+	}
 	GameWindowFlag = &cli.DurationFlag{
 		Name: "game-window",
 		Usage: "The time window which the challenger will look for games to progress and claim bonds. " +
@@ -171,6 +235,7 @@ var requiredFlags = []cli.Flag{
 var optionalFlags = []cli.Flag{
 	TraceTypeFlag,
 	MaxConcurrencyFlag,
+	L2EthRpcFlag,
 	MaxPendingTransactionsFlag,
 	HTTPPollInterval,
 	AdditionalBondClaimants,
@@ -181,9 +246,19 @@ var optionalFlags = []cli.Flag{
 	CannonBinFlag,
 	CannonServerFlag,
 	CannonPreStateFlag,
+	CannonPreStatesURLFlag,
 	CannonL2Flag,
 	CannonSnapshotFreqFlag,
 	CannonInfoFreqFlag,
+	AsteriscNetworkFlag,
+	AsteriscRollupConfigFlag,
+	AsteriscL2GenesisFlag,
+	AsteriscBinFlag,
+	AsteriscServerFlag,
+	AsteriscPreStateFlag,
+	AsteriscPreStatesURLFlag,
+	AsteriscSnapshotFreqFlag,
+	AsteriscInfoFreqFlag,
 	GameWindowFlag,
 	SelectiveClaimResolutionFlag,
 	UnsafeAllowInvalidPrestate,
@@ -218,11 +293,31 @@ func CheckCannonFlags(ctx *cli.Context) error {
 	if !ctx.IsSet(CannonServerFlag.Name) {
 		return fmt.Errorf("flag %s is required", CannonServerFlag.Name)
 	}
-	if !ctx.IsSet(CannonPreStateFlag.Name) {
-		return fmt.Errorf("flag %s is required", CannonPreStateFlag.Name)
+	if !ctx.IsSet(CannonPreStateFlag.Name) && !ctx.IsSet(CannonPreStatesURLFlag.Name) {
+		return fmt.Errorf("flag %s or %s is required", CannonPreStatesURLFlag.Name, CannonPreStateFlag.Name)
+	}
+	return nil
+}
+
+func CheckAsteriscFlags(ctx *cli.Context) error {
+	if !ctx.IsSet(AsteriscNetworkFlag.Name) &&
+		!(ctx.IsSet(AsteriscRollupConfigFlag.Name) && ctx.IsSet(AsteriscL2GenesisFlag.Name)) {
+		return fmt.Errorf("flag %v or %v and %v is required",
+			AsteriscNetworkFlag.Name, AsteriscRollupConfigFlag.Name, AsteriscL2GenesisFlag.Name)
+	}
+	if ctx.IsSet(AsteriscNetworkFlag.Name) &&
+		(ctx.IsSet(AsteriscRollupConfigFlag.Name) || ctx.IsSet(AsteriscL2GenesisFlag.Name)) {
+		return fmt.Errorf("flag %v can not be used with %v and %v",
+			AsteriscNetworkFlag.Name, AsteriscRollupConfigFlag.Name, AsteriscL2GenesisFlag.Name)
+	}
+	if !ctx.IsSet(AsteriscBinFlag.Name) {
+		return fmt.Errorf("flag %s is required", AsteriscBinFlag.Name)
+	}
+	if !ctx.IsSet(AsteriscServerFlag.Name) {
+		return fmt.Errorf("flag %s is required", AsteriscServerFlag.Name)
 	}
-	if !ctx.IsSet(CannonL2Flag.Name) {
-		return fmt.Errorf("flag %s is required", CannonL2Flag.Name)
+	if !ctx.IsSet(AsteriscPreStateFlag.Name) && !ctx.IsSet(AsteriscPreStatesURLFlag.Name) {
+		return fmt.Errorf("flag %s or %s is required", AsteriscPreStatesURLFlag.Name, AsteriscPreStateFlag.Name)
 	}
 	return nil
 }
@@ -233,12 +328,20 @@ func CheckRequired(ctx *cli.Context, traceTypes []config.TraceType) error {
 			return fmt.Errorf("flag %s is required", f.Names()[0])
 		}
 	}
+	// CannonL2Flag is checked because it is an alias with L2EthRpcFlag
+	if !ctx.IsSet(CannonL2Flag.Name) && !ctx.IsSet(L2EthRpcFlag.Name) {
+		return fmt.Errorf("flag %s is required", L2EthRpcFlag.Name)
+	}
 	for _, traceType := range traceTypes {
 		switch traceType {
 		case config.TraceTypeCannon, config.TraceTypePermissioned:
 			if err := CheckCannonFlags(ctx); err != nil {
 				return err
 			}
+		case config.TraceTypeAsterisc:
+			if err := CheckAsteriscFlags(ctx); err != nil {
+				return err
+			}
 		case config.TraceTypeAlphabet:
 		default:
 			return fmt.Errorf("invalid trace type. must be one of %v", config.TraceTypes)
@@ -261,8 +364,23 @@ func parseTraceTypes(ctx *cli.Context) ([]config.TraceType, error) {
 	return traceTypes, nil
 }
 
+func getL2Rpc(ctx *cli.Context, logger log.Logger) (string, error) {
+	if ctx.IsSet(CannonL2Flag.Name) && ctx.IsSet(L2EthRpcFlag.Name) {
+		return "", fmt.Errorf("flag %v and %v must not be both set", CannonL2Flag.Name, L2EthRpcFlag.Name)
+	}
+	l2Rpc := ""
+	if ctx.IsSet(CannonL2Flag.Name) {
+		logger.Warn(fmt.Sprintf("flag %v is deprecated, please use %v", CannonL2Flag.Name, L2EthRpcFlag.Name))
+		l2Rpc = ctx.String(CannonL2Flag.Name)
+	}
+	if ctx.IsSet(L2EthRpcFlag.Name) {
+		l2Rpc = ctx.String(L2EthRpcFlag.Name)
+	}
+	return l2Rpc, nil
+}
+
 // NewConfigFromCLI parses the Config from the provided flags or environment variables.
-func NewConfigFromCLI(ctx *cli.Context) (*config.Config, error) {
+func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, error) {
 	traceTypes, err := parseTraceTypes(ctx)
 	if err != nil {
 		return nil, err
@@ -303,33 +421,63 @@ func NewConfigFromCLI(ctx *cli.Context) (*config.Config, error) {
 			claimants = append(claimants, claimant)
 		}
 	}
+	var cannonPrestatesURL *url.URL
+	if ctx.IsSet(CannonPreStatesURLFlag.Name) {
+		parsed, err := url.Parse(ctx.String(CannonPreStatesURLFlag.Name))
+		if err != nil {
+			return nil, fmt.Errorf("invalid cannon pre states url (%v): %w", ctx.String(CannonPreStatesURLFlag.Name), err)
+		}
+		cannonPrestatesURL = parsed
+	}
+	var asteriscPreStatesURL *url.URL
+	if ctx.IsSet(AsteriscPreStatesURLFlag.Name) {
+		parsed, err := url.Parse(ctx.String(AsteriscPreStatesURLFlag.Name))
+		if err != nil {
+			return nil, fmt.Errorf("invalid asterisc pre states url (%v): %w", ctx.String(AsteriscPreStatesURLFlag.Name), err)
+		}
+		asteriscPreStatesURL = parsed
+	}
+	l2Rpc, err := getL2Rpc(ctx, logger)
+	if err != nil {
+		return nil, err
+	}
 	return &config.Config{
 		// Required Flags
-		L1EthRpc:                 ctx.String(L1EthRpcFlag.Name),
-		L1Beacon:                 ctx.String(L1BeaconFlag.Name),
-		TraceTypes:               traceTypes,
-		GameFactoryAddress:       gameFactoryAddress,
-		GameAllowlist:            allowedGames,
-		GameWindow:               ctx.Duration(GameWindowFlag.Name),
-		MaxConcurrency:           maxConcurrency,
-		MaxPendingTx:             ctx.Uint64(MaxPendingTransactionsFlag.Name),
-		PollInterval:             ctx.Duration(HTTPPollInterval.Name),
-		AdditionalBondClaimants:  claimants,
-		RollupRpc:                ctx.String(RollupRpcFlag.Name),
-		CannonNetwork:            ctx.String(CannonNetworkFlag.Name),
-		CannonRollupConfigPath:   ctx.String(CannonRollupConfigFlag.Name),
-		CannonL2GenesisPath:      ctx.String(CannonL2GenesisFlag.Name),
-		CannonBin:                ctx.String(CannonBinFlag.Name),
-		CannonServer:             ctx.String(CannonServerFlag.Name),
-		CannonAbsolutePreState:   ctx.String(CannonPreStateFlag.Name),
-		Datadir:                  ctx.String(DatadirFlag.Name),
-		CannonL2:                 ctx.String(CannonL2Flag.Name),
-		CannonSnapshotFreq:       ctx.Uint(CannonSnapshotFreqFlag.Name),
-		CannonInfoFreq:           ctx.Uint(CannonInfoFreqFlag.Name),
-		TxMgrConfig:              txMgrConfig,
-		MetricsConfig:            metricsConfig,
-		PprofConfig:              pprofConfig,
-		SelectiveClaimResolution: ctx.Bool(SelectiveClaimResolutionFlag.Name),
-		AllowInvalidPrestate:     ctx.Bool(UnsafeAllowInvalidPrestate.Name),
+		L1EthRpc:                        ctx.String(L1EthRpcFlag.Name),
+		L1Beacon:                        ctx.String(L1BeaconFlag.Name),
+		TraceTypes:                      traceTypes,
+		GameFactoryAddress:              gameFactoryAddress,
+		GameAllowlist:                   allowedGames,
+		GameWindow:                      ctx.Duration(GameWindowFlag.Name),
+		MaxConcurrency:                  maxConcurrency,
+		L2Rpc:                           l2Rpc,
+		MaxPendingTx:                    ctx.Uint64(MaxPendingTransactionsFlag.Name),
+		PollInterval:                    ctx.Duration(HTTPPollInterval.Name),
+		AdditionalBondClaimants:         claimants,
+		RollupRpc:                       ctx.String(RollupRpcFlag.Name),
+		CannonNetwork:                   ctx.String(CannonNetworkFlag.Name),
+		CannonRollupConfigPath:          ctx.String(CannonRollupConfigFlag.Name),
+		CannonL2GenesisPath:             ctx.String(CannonL2GenesisFlag.Name),
+		CannonBin:                       ctx.String(CannonBinFlag.Name),
+		CannonServer:                    ctx.String(CannonServerFlag.Name),
+		CannonAbsolutePreState:          ctx.String(CannonPreStateFlag.Name),
+		CannonAbsolutePreStateBaseURL:   cannonPrestatesURL,
+		Datadir:                         ctx.String(DatadirFlag.Name),
+		CannonSnapshotFreq:              ctx.Uint(CannonSnapshotFreqFlag.Name),
+		CannonInfoFreq:                  ctx.Uint(CannonInfoFreqFlag.Name),
+		AsteriscNetwork:                 ctx.String(AsteriscNetworkFlag.Name),
+		AsteriscRollupConfigPath:        ctx.String(AsteriscRollupConfigFlag.Name),
+		AsteriscL2GenesisPath:           ctx.String(AsteriscL2GenesisFlag.Name),
+		AsteriscBin:                     ctx.String(AsteriscBinFlag.Name),
+		AsteriscServer:                  ctx.String(AsteriscServerFlag.Name),
+		AsteriscAbsolutePreState:        ctx.String(AsteriscPreStateFlag.Name),
+		AsteriscAbsolutePreStateBaseURL: asteriscPreStatesURL,
+		AsteriscSnapshotFreq:            ctx.Uint(AsteriscSnapshotFreqFlag.Name),
+		AsteriscInfoFreq:                ctx.Uint(AsteriscInfoFreqFlag.Name),
+		TxMgrConfig:                     txMgrConfig,
+		MetricsConfig:                   metricsConfig,
+		PprofConfig:                     pprofConfig,
+		SelectiveClaimResolution:        ctx.Bool(SelectiveClaimResolutionFlag.Name),
+		AllowInvalidPrestate:            ctx.Bool(UnsafeAllowInvalidPrestate.Name),
 	}, nil
 }
diff --git a/op-challenger/game/disk.go b/op-challenger/game/disk.go
index 1590448fc7c5..7385400860b4 100644
--- a/op-challenger/game/disk.go
+++ b/op-challenger/game/disk.go
@@ -5,10 +5,10 @@ import (
 	"fmt"
 	"os"
 	"path/filepath"
+	"slices"
 	"strings"
 
 	"github.com/ethereum/go-ethereum/common"
-	"golang.org/x/exp/slices"
 )
 
 const gameDirPrefix = "game-"
diff --git a/op-challenger/game/fault/agent.go b/op-challenger/game/fault/agent.go
index f67ef57336ce..46951d23e776 100644
--- a/op-challenger/game/fault/agent.go
+++ b/op-challenger/game/fault/agent.go
@@ -6,11 +6,13 @@ import (
 	"fmt"
 	"slices"
 	"sync"
+	"time"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/solver"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
+	"github.com/ethereum-optimism/optimism/op-service/clock"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
@@ -22,29 +24,36 @@ type Responder interface {
 	CallResolve(ctx context.Context) (gameTypes.GameStatus, error)
 	Resolve() error
 	CallResolveClaim(ctx context.Context, claimIdx uint64) error
-	ResolveClaim(claimIdx uint64) error
+	ResolveClaims(claimIdx ...uint64) error
 	PerformAction(ctx context.Context, action types.Action) error
 }
 
 type ClaimLoader interface {
 	GetAllClaims(ctx context.Context, block rpcblock.Block) ([]types.Claim, error)
+	IsL2BlockNumberChallenged(ctx context.Context, block rpcblock.Block) (bool, error)
 }
 
 type Agent struct {
-	metrics   metrics.Metricer
-	solver    *solver.GameSolver
-	loader    ClaimLoader
-	responder Responder
-	selective bool
-	claimants []common.Address
-	maxDepth  types.Depth
-	log       log.Logger
+	metrics          metrics.Metricer
+	systemClock      clock.Clock
+	l1Clock          types.ClockReader
+	solver           *solver.GameSolver
+	loader           ClaimLoader
+	responder        Responder
+	selective        bool
+	claimants        []common.Address
+	maxDepth         types.Depth
+	maxClockDuration time.Duration
+	log              log.Logger
 }
 
 func NewAgent(
 	m metrics.Metricer,
+	systemClock clock.Clock,
+	l1Clock types.ClockReader,
 	loader ClaimLoader,
 	maxDepth types.Depth,
+	maxClockDuration time.Duration,
 	trace types.TraceAccessor,
 	responder Responder,
 	log log.Logger,
@@ -52,14 +61,17 @@ func NewAgent(
 	claimants []common.Address,
 ) *Agent {
 	return &Agent{
-		metrics:   m,
-		solver:    solver.NewGameSolver(maxDepth, trace),
-		loader:    loader,
-		responder: responder,
-		selective: selective,
-		claimants: claimants,
-		maxDepth:  maxDepth,
-		log:       log,
+		metrics:          m,
+		systemClock:      systemClock,
+		l1Clock:          l1Clock,
+		solver:           solver.NewGameSolver(maxDepth, trace),
+		loader:           loader,
+		responder:        responder,
+		selective:        selective,
+		claimants:        claimants,
+		maxDepth:         maxDepth,
+		maxClockDuration: maxClockDuration,
+		log:              log,
 	}
 }
 
@@ -69,6 +81,18 @@ func (a *Agent) Act(ctx context.Context) error {
 		return nil
 	}
 
+	start := a.systemClock.Now()
+	defer func() {
+		a.metrics.RecordGameActTime(a.systemClock.Since(start).Seconds())
+	}()
+
+	if challenged, err := a.loader.IsL2BlockNumberChallenged(ctx, rpcblock.Latest); err != nil {
+		return fmt.Errorf("failed to check if L2 block number already challenged: %w", err)
+	} else if challenged {
+		a.log.Debug("Skipping game with already challenged L2 block number")
+		return nil
+	}
+
 	game, err := a.newGameFromContracts(ctx)
 	if err != nil {
 		return fmt.Errorf("create game from contracts: %w", err)
@@ -90,11 +114,13 @@ func (a *Agent) Act(ctx context.Context) error {
 
 func (a *Agent) performAction(ctx context.Context, wg *sync.WaitGroup, action types.Action) {
 	defer wg.Done()
-	actionLog := a.log.New("action", action.Type, "is_attack", action.IsAttack, "parent", action.ParentIdx)
+	actionLog := a.log.New("action", action.Type)
 	if action.Type == types.ActionTypeStep {
 		containsOracleData := action.OracleData != nil
 		isLocal := containsOracleData && action.OracleData.IsLocal
 		actionLog = actionLog.New(
+			"is_attack", action.IsAttack,
+			"parent", action.ParentClaim.ContractIndex,
 			"prestate", common.Bytes2Hex(action.PreState),
 			"proof", common.Bytes2Hex(action.ProofData),
 			"containsOracleData", containsOracleData,
@@ -103,8 +129,8 @@ func (a *Agent) performAction(ctx context.Context, wg *sync.WaitGroup, action ty
 		if action.OracleData != nil {
 			actionLog = actionLog.New("oracleKey", common.Bytes2Hex(action.OracleData.OracleKey))
 		}
-	} else {
-		actionLog = actionLog.New("value", action.Value)
+	} else if action.Type == types.ActionTypeMove {
+		actionLog = actionLog.New("is_attack", action.IsAttack, "parent", action.ParentClaim.ContractIndex, "value", action.Value)
 	}
 
 	switch action.Type {
@@ -112,6 +138,8 @@ func (a *Agent) performAction(ctx context.Context, wg *sync.WaitGroup, action ty
 		a.metrics.RecordGameMove()
 	case types.ActionTypeStep:
 		a.metrics.RecordGameStep()
+	case types.ActionTypeChallengeL2BlockNumber:
+		a.metrics.RecordGameL2Challenge()
 	}
 	actionLog.Info("Performing action")
 	err := a.responder.PerformAction(ctx, action)
@@ -149,8 +177,15 @@ func (a *Agent) tryResolveClaims(ctx context.Context) error {
 		return errNoResolvableClaims
 	}
 
-	var resolvableClaims []int64
+	var resolvableClaims []uint64
 	for _, claim := range claims {
+		var parent types.Claim
+		if !claim.IsRootPosition() {
+			parent = claims[claim.ParentContractIndex]
+		}
+		if types.ChessClock(a.l1Clock.Now(), claim, parent) <= a.maxClockDuration {
+			continue
+		}
 		if a.selective {
 			a.log.Trace("Selective claim resolution, checking if claim is incentivized", "claimIdx", claim.ContractIndex)
 			isUncounteredClaim := slices.Contains(a.claimants, claim.Claimant) && claim.CounteredBy == common.Address{}
@@ -163,7 +198,7 @@ func (a *Agent) tryResolveClaims(ctx context.Context) error {
 		a.log.Trace("Checking if claim is resolvable", "claimIdx", claim.ContractIndex)
 		if err := a.responder.CallResolveClaim(ctx, uint64(claim.ContractIndex)); err == nil {
 			a.log.Info("Resolving claim", "claimIdx", claim.ContractIndex)
-			resolvableClaims = append(resolvableClaims, int64(claim.ContractIndex))
+			resolvableClaims = append(resolvableClaims, uint64(claim.ContractIndex))
 		}
 	}
 	if len(resolvableClaims) == 0 {
@@ -171,23 +206,17 @@ func (a *Agent) tryResolveClaims(ctx context.Context) error {
 	}
 	a.log.Info("Resolving claims", "numClaims", len(resolvableClaims))
 
-	var wg sync.WaitGroup
-	wg.Add(len(resolvableClaims))
-	for _, claimIdx := range resolvableClaims {
-		claimIdx := claimIdx
-		go func() {
-			defer wg.Done()
-			err := a.responder.ResolveClaim(uint64(claimIdx))
-			if err != nil {
-				a.log.Error("Failed to resolve claim", "err", err)
-			}
-		}()
+	if err := a.responder.ResolveClaims(resolvableClaims...); err != nil {
+		a.log.Error("Failed to resolve claims", "err", err)
 	}
-	wg.Wait()
 	return nil
 }
 
 func (a *Agent) resolveClaims(ctx context.Context) error {
+	start := a.systemClock.Now()
+	defer func() {
+		a.metrics.RecordClaimResolutionTime(a.systemClock.Since(start).Seconds())
+	}()
 	for {
 		err := a.tryResolveClaims(ctx)
 		switch err {
diff --git a/op-challenger/game/fault/agent_test.go b/op-challenger/game/fault/agent_test.go
index c1c3d22636b2..415edcd9977c 100644
--- a/op-challenger/game/fault/agent_test.go
+++ b/op-challenger/game/fault/agent_test.go
@@ -6,8 +6,10 @@ import (
 	"math/big"
 	"sync"
 	"testing"
+	"time"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace"
+	"github.com/ethereum-optimism/optimism/op-service/clock"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/stretchr/testify/require"
 
@@ -22,6 +24,8 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 )
 
+var l1Time = time.UnixMilli(100)
+
 func TestDoNotMakeMovesWhenGameIsResolvable(t *testing.T) {
 	ctx := context.Background()
 
@@ -55,6 +59,18 @@ func TestDoNotMakeMovesWhenGameIsResolvable(t *testing.T) {
 	}
 }
 
+func TestDoNotMakeMovesWhenL2BlockNumberChallenged(t *testing.T) {
+	ctx := context.Background()
+
+	agent, claimLoader, responder := setupTestAgent(t)
+	claimLoader.blockNumChallenged = true
+
+	require.NoError(t, agent.Act(ctx))
+
+	require.Equal(t, 1, responder.callResolveCount, "should check if game is resolvable")
+	require.Equal(t, 1, claimLoader.callCount, "should fetch claims only once for resolveClaim")
+}
+
 func createClaimsWithClaimants(t *testing.T, d types.Depth) []types.Claim {
 	claimBuilder := test.NewClaimBuilder(t, d, alphabet.NewTraceProvider(big.NewInt(0), d))
 	rootClaim := claimBuilder.CreateRootClaim()
@@ -129,6 +145,28 @@ func TestAgent_SelectiveClaimResolution(t *testing.T) {
 	}
 }
 
+func TestSkipAttemptingToResolveClaimsWhenClockNotExpired(t *testing.T) {
+	agent, claimLoader, responder := setupTestAgent(t)
+	responder.callResolveErr = errors.New("game is not resolvable")
+	responder.callResolveClaimErr = errors.New("claim is not resolvable")
+	depth := types.Depth(4)
+	claimBuilder := test.NewClaimBuilder(t, depth, alphabet.NewTraceProvider(big.NewInt(0), depth))
+
+	rootTime := l1Time.Add(-agent.maxClockDuration - 5*time.Minute)
+	gameBuilder := claimBuilder.GameBuilder(test.WithClock(rootTime, 0))
+	gameBuilder.Seq().
+		Attack(test.WithClock(rootTime.Add(5*time.Minute), 5*time.Minute)).
+		Defend(test.WithClock(rootTime.Add(7*time.Minute), 2*time.Minute)).
+		Attack(test.WithClock(rootTime.Add(11*time.Minute), 4*time.Minute))
+	claimLoader.claims = gameBuilder.Game.Claims()
+
+	require.NoError(t, agent.Act(context.Background()))
+
+	// Currently tries to resolve the first two claims because their clock's have expired, but doesn't detect that
+	// they have unresolvable children.
+	require.Equal(t, 2, responder.callResolveClaimCount)
+}
+
 func TestLoadClaimsWhenGameNotResolvable(t *testing.T) {
 	// Checks that if the game isn't resolvable, that the agent continues on to start checking claims
 	agent, claimLoader, responder := setupTestAgent(t)
@@ -152,16 +190,24 @@ func setupTestAgent(t *testing.T) (*Agent, *stubClaimLoader, *stubResponder) {
 	logger := testlog.Logger(t, log.LevelInfo)
 	claimLoader := &stubClaimLoader{}
 	depth := types.Depth(4)
+	gameDuration := 3 * time.Minute
 	provider := alphabet.NewTraceProvider(big.NewInt(0), depth)
 	responder := &stubResponder{}
-	agent := NewAgent(metrics.NoopMetrics, claimLoader, depth, trace.NewSimpleTraceAccessor(provider), responder, logger, false, []common.Address{})
+	systemClock := clock.NewDeterministicClock(time.UnixMilli(120200))
+	l1Clock := clock.NewDeterministicClock(l1Time)
+	agent := NewAgent(metrics.NoopMetrics, systemClock, l1Clock, claimLoader, depth, gameDuration, trace.NewSimpleTraceAccessor(provider), responder, logger, false, []common.Address{})
 	return agent, claimLoader, responder
 }
 
 type stubClaimLoader struct {
-	callCount int
-	maxLoads  int
-	claims    []types.Claim
+	callCount          int
+	maxLoads           int
+	claims             []types.Claim
+	blockNumChallenged bool
+}
+
+func (s *stubClaimLoader) IsL2BlockNumberChallenged(_ context.Context, _ rpcblock.Block) (bool, error) {
+	return s.blockNumChallenged, nil
 }
 
 func (s *stubClaimLoader) GetAllClaims(_ context.Context, _ rpcblock.Block) ([]types.Claim, error) {
@@ -186,7 +232,7 @@ type stubResponder struct {
 	resolveClaimCount     int
 }
 
-func (s *stubResponder) CallResolve(ctx context.Context) (gameTypes.GameStatus, error) {
+func (s *stubResponder) CallResolve(_ context.Context) (gameTypes.GameStatus, error) {
 	s.l.Lock()
 	defer s.l.Unlock()
 	s.callResolveCount++
@@ -200,20 +246,20 @@ func (s *stubResponder) Resolve() error {
 	return s.resolveErr
 }
 
-func (s *stubResponder) CallResolveClaim(ctx context.Context, clainIdx uint64) error {
+func (s *stubResponder) CallResolveClaim(_ context.Context, _ uint64) error {
 	s.l.Lock()
 	defer s.l.Unlock()
 	s.callResolveClaimCount++
 	return s.callResolveClaimErr
 }
 
-func (s *stubResponder) ResolveClaim(clainIdx uint64) error {
+func (s *stubResponder) ResolveClaims(claims ...uint64) error {
 	s.l.Lock()
 	defer s.l.Unlock()
-	s.resolveClaimCount++
+	s.resolveClaimCount += len(claims)
 	return nil
 }
 
-func (s *stubResponder) PerformAction(ctx context.Context, response types.Action) error {
+func (s *stubResponder) PerformAction(_ context.Context, _ types.Action) error {
 	return nil
 }
diff --git a/op-challenger/game/fault/claims/claimer.go b/op-challenger/game/fault/claims/claimer.go
index 7e8fbd037ccf..052dc016ca03 100644
--- a/op-challenger/game/fault/claims/claimer.go
+++ b/op-challenger/game/fault/claims/claimer.go
@@ -6,19 +6,24 @@ import (
 	"fmt"
 	"math/big"
 
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 )
 
+type TxSender interface {
+	SendAndWaitSimple(txPurpose string, txs ...txmgr.TxCandidate) error
+}
+
 type BondClaimMetrics interface {
 	RecordBondClaimed(amount uint64)
 }
 
 type BondContract interface {
-	GetCredit(ctx context.Context, receipient common.Address) (*big.Int, types.GameStatus, error)
-	ClaimCredit(receipient common.Address) (txmgr.TxCandidate, error)
+	GetCredit(ctx context.Context, recipient common.Address) (*big.Int, types.GameStatus, error)
+	ClaimCreditTx(ctx context.Context, recipient common.Address) (txmgr.TxCandidate, error)
 }
 
 type BondContractCreator func(game types.GameMetadata) (BondContract, error)
@@ -27,13 +32,13 @@ type Claimer struct {
 	logger          log.Logger
 	metrics         BondClaimMetrics
 	contractCreator BondContractCreator
-	txSender        types.TxSender
+	txSender        TxSender
 	claimants       []common.Address
 }
 
 var _ BondClaimer = (*Claimer)(nil)
 
-func NewBondClaimer(l log.Logger, m BondClaimMetrics, contractCreator BondContractCreator, txSender types.TxSender, claimants ...common.Address) *Claimer {
+func NewBondClaimer(l log.Logger, m BondClaimMetrics, contractCreator BondContractCreator, txSender TxSender, claimants ...common.Address) *Claimer {
 	return &Claimer{
 		logger:          l,
 		metrics:         m,
@@ -57,8 +62,9 @@ func (c *Claimer) claimBond(ctx context.Context, game types.GameMetadata, addr c
 
 	contract, err := c.contractCreator(game)
 	if err != nil {
-		return fmt.Errorf("failed to create bond contract bindings: %w", err)
+		return fmt.Errorf("failed to create bond contract: %w", err)
 	}
+
 	credit, status, err := contract.GetCredit(ctx, addr)
 	if err != nil {
 		return fmt.Errorf("failed to get credit: %w", err)
@@ -73,12 +79,15 @@ func (c *Claimer) claimBond(ctx context.Context, game types.GameMetadata, addr c
 		return nil
 	}
 
-	candidate, err := contract.ClaimCredit(addr)
-	if err != nil {
+	candidate, err := contract.ClaimCreditTx(ctx, addr)
+	if errors.Is(err, contracts.ErrSimulationFailed) {
+		c.logger.Debug("Credit still locked", "game", game.Proxy, "addr", addr)
+		return nil
+	} else if err != nil {
 		return fmt.Errorf("failed to create credit claim tx: %w", err)
 	}
 
-	if _, err = c.txSender.SendAndWait("claim credit", candidate); err != nil {
+	if err = c.txSender.SendAndWaitSimple("claim credit", candidate); err != nil {
 		return fmt.Errorf("failed to claim credit: %w", err)
 	}
 
diff --git a/op-challenger/game/fault/claims/claimer_test.go b/op-challenger/game/fault/claims/claimer_test.go
index 8d157d16c9a3..e0762d050daf 100644
--- a/op-challenger/game/fault/claims/claimer_test.go
+++ b/op-challenger/game/fault/claims/claimer_test.go
@@ -3,14 +3,15 @@ package claims
 import (
 	"context"
 	"errors"
+	"fmt"
 	"math/big"
 	"testing"
 
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/common"
-	ethtypes "github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
 )
@@ -77,6 +78,17 @@ func TestClaimer_ClaimBonds(t *testing.T) {
 		require.Equal(t, 0, m.RecordBondClaimedCalls)
 	})
 
+	t.Run("BondStillLocked", func(t *testing.T) {
+		gameAddr := common.HexToAddress("0x1234")
+		c, m, contract, txSender := newTestClaimer(t)
+		contract.claimSimulationFails = true
+		contract.credit[txSender.From()] = 1
+		err := c.ClaimBonds(context.Background(), []types.GameMetadata{{Proxy: gameAddr}})
+		require.NoError(t, err)
+		require.Equal(t, 0, txSender.sends)
+		require.Equal(t, 0, m.RecordBondClaimedCalls)
+	})
+
 	t.Run("ZeroCreditReturnsNil", func(t *testing.T) {
 		gameAddr := common.HexToAddress("0x1234")
 		c, m, contract, txSender := newTestClaimer(t)
@@ -132,26 +144,30 @@ func (s *mockTxSender) From() common.Address {
 	return common.HexToAddress("0x33333")
 }
 
-func (s *mockTxSender) SendAndWait(_ string, _ ...txmgr.TxCandidate) ([]*ethtypes.Receipt, error) {
+func (s *mockTxSender) SendAndWaitSimple(_ string, _ ...txmgr.TxCandidate) error {
 	s.sends++
 	if s.sendFails {
-		return nil, mockTxMgrSendError
+		return mockTxMgrSendError
 	}
 	if s.statusFail {
-		return []*ethtypes.Receipt{{Status: ethtypes.ReceiptStatusFailed}}, nil
+		return errors.New("transaction reverted")
 	}
-	return []*ethtypes.Receipt{{Status: ethtypes.ReceiptStatusSuccessful}}, nil
+	return nil
 }
 
 type stubBondContract struct {
-	credit map[common.Address]int64
-	status types.GameStatus
+	credit               map[common.Address]int64
+	status               types.GameStatus
+	claimSimulationFails bool
 }
 
 func (s *stubBondContract) GetCredit(_ context.Context, addr common.Address) (*big.Int, types.GameStatus, error) {
 	return big.NewInt(s.credit[addr]), s.status, nil
 }
 
-func (s *stubBondContract) ClaimCredit(_ common.Address) (txmgr.TxCandidate, error) {
+func (s *stubBondContract) ClaimCreditTx(_ context.Context, _ common.Address) (txmgr.TxCandidate, error) {
+	if s.claimSimulationFails {
+		return txmgr.TxCandidate{}, fmt.Errorf("failed: %w", contracts.ErrSimulationFailed)
+	}
 	return txmgr.TxCandidate{}, nil
 }
diff --git a/op-challenger/game/fault/contracts/abis/FaultDisputeGame-0.18.1.json b/op-challenger/game/fault/contracts/abis/FaultDisputeGame-0.18.1.json
new file mode 100644
index 000000000000..e8c4133bb317
--- /dev/null
+++ b/op-challenger/game/fault/contracts/abis/FaultDisputeGame-0.18.1.json
@@ -0,0 +1,926 @@
+[
+  {
+    "inputs": [
+      {
+        "internalType": "GameType",
+        "name": "_gameType",
+        "type": "uint32"
+      },
+      {
+        "internalType": "Claim",
+        "name": "_absolutePrestate",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_maxGameDepth",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_splitDepth",
+        "type": "uint256"
+      },
+      {
+        "internalType": "Duration",
+        "name": "_clockExtension",
+        "type": "uint64"
+      },
+      {
+        "internalType": "Duration",
+        "name": "_maxClockDuration",
+        "type": "uint64"
+      },
+      {
+        "internalType": "contract IBigStepper",
+        "name": "_vm",
+        "type": "address"
+      },
+      {
+        "internalType": "contract IDelayedWETH",
+        "name": "_weth",
+        "type": "address"
+      },
+      {
+        "internalType": "contract IAnchorStateRegistry",
+        "name": "_anchorStateRegistry",
+        "type": "address"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_l2ChainId",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "nonpayable",
+    "type": "constructor"
+  },
+  {
+    "inputs": [],
+    "name": "absolutePrestate",
+    "outputs": [
+      {
+        "internalType": "Claim",
+        "name": "absolutePrestate_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_ident",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_execLeafIdx",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_partOffset",
+        "type": "uint256"
+      }
+    ],
+    "name": "addLocalData",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "anchorStateRegistry",
+    "outputs": [
+      {
+        "internalType": "contract IAnchorStateRegistry",
+        "name": "registry_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_parentIndex",
+        "type": "uint256"
+      },
+      {
+        "internalType": "Claim",
+        "name": "_claim",
+        "type": "bytes32"
+      }
+    ],
+    "name": "attack",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "_recipient",
+        "type": "address"
+      }
+    ],
+    "name": "claimCredit",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "claimData",
+    "outputs": [
+      {
+        "internalType": "uint32",
+        "name": "parentIndex",
+        "type": "uint32"
+      },
+      {
+        "internalType": "address",
+        "name": "counteredBy",
+        "type": "address"
+      },
+      {
+        "internalType": "address",
+        "name": "claimant",
+        "type": "address"
+      },
+      {
+        "internalType": "uint128",
+        "name": "bond",
+        "type": "uint128"
+      },
+      {
+        "internalType": "Claim",
+        "name": "claim",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "Position",
+        "name": "position",
+        "type": "uint128"
+      },
+      {
+        "internalType": "Clock",
+        "name": "clock",
+        "type": "uint128"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "claimDataLen",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "len_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "Hash",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "name": "claims",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "clockExtension",
+    "outputs": [
+      {
+        "internalType": "Duration",
+        "name": "clockExtension_",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "createdAt",
+    "outputs": [
+      {
+        "internalType": "Timestamp",
+        "name": "",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "name": "credit",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_parentIndex",
+        "type": "uint256"
+      },
+      {
+        "internalType": "Claim",
+        "name": "_claim",
+        "type": "bytes32"
+      }
+    ],
+    "name": "defend",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "extraData",
+    "outputs": [
+      {
+        "internalType": "bytes",
+        "name": "extraData_",
+        "type": "bytes"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gameCreator",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "creator_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gameData",
+    "outputs": [
+      {
+        "internalType": "GameType",
+        "name": "gameType_",
+        "type": "uint32"
+      },
+      {
+        "internalType": "Claim",
+        "name": "rootClaim_",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "bytes",
+        "name": "extraData_",
+        "type": "bytes"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gameType",
+    "outputs": [
+      {
+        "internalType": "GameType",
+        "name": "gameType_",
+        "type": "uint32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_claimIndex",
+        "type": "uint256"
+      }
+    ],
+    "name": "getChallengerDuration",
+    "outputs": [
+      {
+        "internalType": "Duration",
+        "name": "duration_",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_claimIndex",
+        "type": "uint256"
+      }
+    ],
+    "name": "getNumToResolve",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "numRemainingChildren_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "Position",
+        "name": "_position",
+        "type": "uint128"
+      }
+    ],
+    "name": "getRequiredBond",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "requiredBond_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "initialize",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l1Head",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "l1Head_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l2BlockNumber",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "l2BlockNumber_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l2ChainId",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "l2ChainId_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "maxClockDuration",
+    "outputs": [
+      {
+        "internalType": "Duration",
+        "name": "maxClockDuration_",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "maxGameDepth",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "maxGameDepth_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_challengeIndex",
+        "type": "uint256"
+      },
+      {
+        "internalType": "Claim",
+        "name": "_claim",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "bool",
+        "name": "_isAttack",
+        "type": "bool"
+      }
+    ],
+    "name": "move",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "resolutionCheckpoints",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "initialCheckpointComplete",
+        "type": "bool"
+      },
+      {
+        "internalType": "uint32",
+        "name": "subgameIndex",
+        "type": "uint32"
+      },
+      {
+        "internalType": "Position",
+        "name": "leftmostPosition",
+        "type": "uint128"
+      },
+      {
+        "internalType": "address",
+        "name": "counteredBy",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "resolve",
+    "outputs": [
+      {
+        "internalType": "enum GameStatus",
+        "name": "status_",
+        "type": "uint8"
+      }
+    ],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_claimIndex",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_numToResolve",
+        "type": "uint256"
+      }
+    ],
+    "name": "resolveClaim",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "resolvedAt",
+    "outputs": [
+      {
+        "internalType": "Timestamp",
+        "name": "",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "resolvedSubgames",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "rootClaim",
+    "outputs": [
+      {
+        "internalType": "Claim",
+        "name": "rootClaim_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "splitDepth",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "splitDepth_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingBlockNumber",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "startingBlockNumber_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingOutputRoot",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "root",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint256",
+        "name": "l2BlockNumber",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingRootHash",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "startingRootHash_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "status",
+    "outputs": [
+      {
+        "internalType": "enum GameStatus",
+        "name": "",
+        "type": "uint8"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_claimIndex",
+        "type": "uint256"
+      },
+      {
+        "internalType": "bool",
+        "name": "_isAttack",
+        "type": "bool"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_stateData",
+        "type": "bytes"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_proof",
+        "type": "bytes"
+      }
+    ],
+    "name": "step",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "subgames",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "version",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "vm",
+    "outputs": [
+      {
+        "internalType": "contract IBigStepper",
+        "name": "vm_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "weth",
+    "outputs": [
+      {
+        "internalType": "contract IDelayedWETH",
+        "name": "weth_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "uint256",
+        "name": "parentIndex",
+        "type": "uint256"
+      },
+      {
+        "indexed": true,
+        "internalType": "Claim",
+        "name": "claim",
+        "type": "bytes32"
+      },
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "claimant",
+        "type": "address"
+      }
+    ],
+    "name": "Move",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "enum GameStatus",
+        "name": "status",
+        "type": "uint8"
+      }
+    ],
+    "name": "Resolved",
+    "type": "event"
+  },
+  {
+    "inputs": [],
+    "name": "AlreadyInitialized",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "AnchorRootNotFound",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "BondTransferFailed",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "CannotDefendRootClaim",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ClaimAboveSplit",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ClaimAlreadyExists",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ClaimAlreadyResolved",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ClockNotExpired",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ClockTimeExceeded",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "DuplicateStep",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "GameDepthExceeded",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "GameNotInProgress",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "IncorrectBondAmount",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidClockExtension",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidLocalIdent",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidParent",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidPrestate",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidSplitDepth",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "MaxDepthTooLarge",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "NoCreditToClaim",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "OutOfOrderResolution",
+    "type": "error"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "Claim",
+        "name": "rootClaim",
+        "type": "bytes32"
+      }
+    ],
+    "name": "UnexpectedRootClaim",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ValidStep",
+    "type": "error"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/LegacyFaultDisputeGame.json b/op-challenger/game/fault/contracts/abis/FaultDisputeGame-0.8.0.json
similarity index 71%
rename from packages/contracts-bedrock/snapshots/abi/LegacyFaultDisputeGame.json
rename to op-challenger/game/fault/contracts/abis/FaultDisputeGame-0.8.0.json
index f6090b4efff5..8bd94969b07c 100644
--- a/packages/contracts-bedrock/snapshots/abi/LegacyFaultDisputeGame.json
+++ b/op-challenger/game/fault/contracts/abis/FaultDisputeGame-0.8.0.json
@@ -4,7 +4,7 @@
       {
         "internalType": "GameType",
         "name": "_gameType",
-        "type": "uint8"
+        "type": "uint32"
       },
       {
         "internalType": "Claim",
@@ -16,6 +16,11 @@
         "name": "_maxGameDepth",
         "type": "uint256"
       },
+      {
+        "internalType": "uint256",
+        "name": "_splitDepth",
+        "type": "uint256"
+      },
       {
         "internalType": "Duration",
         "name": "_gameDuration",
@@ -27,92 +32,40 @@
         "type": "address"
       },
       {
-        "internalType": "contract L2OutputOracle",
-        "name": "_l2oo",
+        "internalType": "contract IDelayedWETH",
+        "name": "_weth",
         "type": "address"
       },
       {
-        "internalType": "contract BlockOracle",
-        "name": "_blockOracle",
+        "internalType": "contract IAnchorStateRegistry",
+        "name": "_anchorStateRegistry",
         "type": "address"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_l2ChainId",
+        "type": "uint256"
       }
     ],
     "stateMutability": "nonpayable",
     "type": "constructor"
   },
   {
-    "inputs": [],
-    "name": "ABSOLUTE_PRESTATE",
-    "outputs": [
-      {
-        "internalType": "Claim",
-        "name": "",
-        "type": "bytes32"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
-  {
-    "inputs": [],
-    "name": "BLOCK_ORACLE",
-    "outputs": [
-      {
-        "internalType": "contract BlockOracle",
-        "name": "",
-        "type": "address"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
-  {
-    "inputs": [],
-    "name": "GAME_DURATION",
-    "outputs": [
-      {
-        "internalType": "Duration",
-        "name": "",
-        "type": "uint64"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
-  {
-    "inputs": [],
-    "name": "L2_OUTPUT_ORACLE",
-    "outputs": [
-      {
-        "internalType": "contract L2OutputOracle",
-        "name": "",
-        "type": "address"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
+    "stateMutability": "payable",
+    "type": "fallback"
   },
   {
-    "inputs": [],
-    "name": "MAX_GAME_DEPTH",
-    "outputs": [
-      {
-        "internalType": "uint256",
-        "name": "",
-        "type": "uint256"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
+    "stateMutability": "payable",
+    "type": "receive"
   },
   {
     "inputs": [],
-    "name": "VM",
+    "name": "absolutePrestate",
     "outputs": [
       {
-        "internalType": "contract IBigStepper",
-        "name": "",
-        "type": "address"
+        "internalType": "Claim",
+        "name": "absolutePrestate_",
+        "type": "bytes32"
       }
     ],
     "stateMutability": "view",
@@ -126,9 +79,9 @@
         "type": "uint256"
       },
       {
-        "internalType": "bytes32",
-        "name": "_localContext",
-        "type": "bytes32"
+        "internalType": "uint256",
+        "name": "_execLeafIdx",
+        "type": "uint256"
       },
       {
         "internalType": "uint256",
@@ -159,6 +112,19 @@
     "stateMutability": "payable",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "_recipient",
+        "type": "address"
+      }
+    ],
+    "name": "claimCredit",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
   {
     "inputs": [
       {
@@ -175,9 +141,19 @@
         "type": "uint32"
       },
       {
-        "internalType": "bool",
-        "name": "countered",
-        "type": "bool"
+        "internalType": "address",
+        "name": "counteredBy",
+        "type": "address"
+      },
+      {
+        "internalType": "address",
+        "name": "claimant",
+        "type": "address"
+      },
+      {
+        "internalType": "uint128",
+        "name": "bond",
+        "type": "uint128"
       },
       {
         "internalType": "Claim",
@@ -224,6 +200,25 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "name": "credit",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [
       {
@@ -262,7 +257,7 @@
       {
         "internalType": "GameType",
         "name": "gameType_",
-        "type": "uint8"
+        "type": "uint32"
       },
       {
         "internalType": "Claim",
@@ -278,6 +273,19 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "gameDuration",
+    "outputs": [
+      {
+        "internalType": "Duration",
+        "name": "gameDuration_",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "gameType",
@@ -285,7 +293,26 @@
       {
         "internalType": "GameType",
         "name": "gameType_",
-        "type": "uint8"
+        "type": "uint32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "Position",
+        "name": "_position",
+        "type": "uint128"
+      }
+    ],
+    "name": "getRequiredBond",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "requiredBond_",
+        "type": "uint256"
       }
     ],
     "stateMutability": "view",
@@ -295,16 +322,29 @@
     "inputs": [],
     "name": "initialize",
     "outputs": [],
-    "stateMutability": "nonpayable",
+    "stateMutability": "payable",
     "type": "function"
   },
   {
     "inputs": [],
-    "name": "l1BlockNumber",
+    "name": "l1Head",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "l1Head_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l2BlockNumber",
     "outputs": [
       {
         "internalType": "uint256",
-        "name": "l1BlockNumber_",
+        "name": "l2BlockNumber_",
         "type": "uint256"
       }
     ],
@@ -313,12 +353,12 @@
   },
   {
     "inputs": [],
-    "name": "l1Head",
+    "name": "l2ChainId",
     "outputs": [
       {
-        "internalType": "Hash",
-        "name": "",
-        "type": "bytes32"
+        "internalType": "uint256",
+        "name": "l2ChainId_",
+        "type": "uint256"
       }
     ],
     "stateMutability": "view",
@@ -326,15 +366,15 @@
   },
   {
     "inputs": [],
-    "name": "l2BlockNumber",
+    "name": "maxGameDepth",
     "outputs": [
       {
         "internalType": "uint256",
-        "name": "l2BlockNumber_",
+        "name": "maxGameDepth_",
         "type": "uint256"
       }
     ],
-    "stateMutability": "pure",
+    "stateMutability": "view",
     "type": "function"
   },
   {
@@ -360,58 +400,6 @@
     "stateMutability": "payable",
     "type": "function"
   },
-  {
-    "inputs": [],
-    "name": "proposals",
-    "outputs": [
-      {
-        "components": [
-          {
-            "internalType": "uint128",
-            "name": "index",
-            "type": "uint128"
-          },
-          {
-            "internalType": "uint128",
-            "name": "l2BlockNumber",
-            "type": "uint128"
-          },
-          {
-            "internalType": "Hash",
-            "name": "outputRoot",
-            "type": "bytes32"
-          }
-        ],
-        "internalType": "struct ILegacyFaultDisputeGame.OutputProposal",
-        "name": "starting",
-        "type": "tuple"
-      },
-      {
-        "components": [
-          {
-            "internalType": "uint128",
-            "name": "index",
-            "type": "uint128"
-          },
-          {
-            "internalType": "uint128",
-            "name": "l2BlockNumber",
-            "type": "uint128"
-          },
-          {
-            "internalType": "Hash",
-            "name": "outputRoot",
-            "type": "bytes32"
-          }
-        ],
-        "internalType": "struct ILegacyFaultDisputeGame.OutputProposal",
-        "name": "disputed",
-        "type": "tuple"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
   {
     "inputs": [],
     "name": "resolve",
@@ -438,6 +426,19 @@
     "stateMutability": "payable",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "resolvedAt",
+    "outputs": [
+      {
+        "internalType": "Timestamp",
+        "name": "",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "rootClaim",
@@ -451,6 +452,63 @@
     "stateMutability": "pure",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "splitDepth",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "splitDepth_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingBlockNumber",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "startingBlockNumber_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingOutputRoot",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "root",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint256",
+        "name": "l2BlockNumber",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingRootHash",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "startingRootHash_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "status",
@@ -505,6 +563,32 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "vm",
+    "outputs": [
+      {
+        "internalType": "contract IBigStepper",
+        "name": "vm_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "weth",
+    "outputs": [
+      {
+        "internalType": "contract IDelayedWETH",
+        "name": "weth_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "anonymous": false,
     "inputs": [
@@ -543,11 +627,31 @@
     "name": "Resolved",
     "type": "event"
   },
+  {
+    "inputs": [],
+    "name": "AlreadyInitialized",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "AnchorRootNotFound",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "BondTransferFailed",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "CannotDefendRootClaim",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "ClaimAboveSplit",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "ClaimAlreadyExists",
@@ -568,6 +672,11 @@
     "name": "ClockTimeExceeded",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "DuplicateStep",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "GameDepthExceeded",
@@ -578,6 +687,16 @@
     "name": "GameNotInProgress",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "IncorrectBondAmount",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidLocalIdent",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "InvalidParent",
@@ -590,7 +709,12 @@
   },
   {
     "inputs": [],
-    "name": "L1HeadTooOld",
+    "name": "InvalidSplitDepth",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "NoCreditToClaim",
     "type": "error"
   },
   {
diff --git a/op-challenger/game/fault/contracts/abis/FaultDisputeGame-1.1.1.json b/op-challenger/game/fault/contracts/abis/FaultDisputeGame-1.1.1.json
new file mode 100644
index 000000000000..f0558ad5961b
--- /dev/null
+++ b/op-challenger/game/fault/contracts/abis/FaultDisputeGame-1.1.1.json
@@ -0,0 +1,1042 @@
+[
+  {
+    "inputs": [
+      {
+        "internalType": "GameType",
+        "name": "_gameType",
+        "type": "uint32"
+      },
+      {
+        "internalType": "Claim",
+        "name": "_absolutePrestate",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_maxGameDepth",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_splitDepth",
+        "type": "uint256"
+      },
+      {
+        "internalType": "Duration",
+        "name": "_clockExtension",
+        "type": "uint64"
+      },
+      {
+        "internalType": "Duration",
+        "name": "_maxClockDuration",
+        "type": "uint64"
+      },
+      {
+        "internalType": "contract IBigStepper",
+        "name": "_vm",
+        "type": "address"
+      },
+      {
+        "internalType": "contract IDelayedWETH",
+        "name": "_weth",
+        "type": "address"
+      },
+      {
+        "internalType": "contract IAnchorStateRegistry",
+        "name": "_anchorStateRegistry",
+        "type": "address"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_l2ChainId",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "nonpayable",
+    "type": "constructor"
+  },
+  {
+    "inputs": [],
+    "name": "absolutePrestate",
+    "outputs": [
+      {
+        "internalType": "Claim",
+        "name": "absolutePrestate_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_ident",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_execLeafIdx",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_partOffset",
+        "type": "uint256"
+      }
+    ],
+    "name": "addLocalData",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "anchorStateRegistry",
+    "outputs": [
+      {
+        "internalType": "contract IAnchorStateRegistry",
+        "name": "registry_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_parentIndex",
+        "type": "uint256"
+      },
+      {
+        "internalType": "Claim",
+        "name": "_claim",
+        "type": "bytes32"
+      }
+    ],
+    "name": "attack",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "components": [
+          {
+            "internalType": "bytes32",
+            "name": "version",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "stateRoot",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "messagePasserStorageRoot",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "latestBlockhash",
+            "type": "bytes32"
+          }
+        ],
+        "internalType": "struct Types.OutputRootProof",
+        "name": "_outputRootProof",
+        "type": "tuple"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_headerRLP",
+        "type": "bytes"
+      }
+    ],
+    "name": "challengeRootL2Block",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "_recipient",
+        "type": "address"
+      }
+    ],
+    "name": "claimCredit",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "claimData",
+    "outputs": [
+      {
+        "internalType": "uint32",
+        "name": "parentIndex",
+        "type": "uint32"
+      },
+      {
+        "internalType": "address",
+        "name": "counteredBy",
+        "type": "address"
+      },
+      {
+        "internalType": "address",
+        "name": "claimant",
+        "type": "address"
+      },
+      {
+        "internalType": "uint128",
+        "name": "bond",
+        "type": "uint128"
+      },
+      {
+        "internalType": "Claim",
+        "name": "claim",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "Position",
+        "name": "position",
+        "type": "uint128"
+      },
+      {
+        "internalType": "Clock",
+        "name": "clock",
+        "type": "uint128"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "claimDataLen",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "len_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "Hash",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "name": "claims",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "clockExtension",
+    "outputs": [
+      {
+        "internalType": "Duration",
+        "name": "clockExtension_",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "createdAt",
+    "outputs": [
+      {
+        "internalType": "Timestamp",
+        "name": "",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "name": "credit",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_parentIndex",
+        "type": "uint256"
+      },
+      {
+        "internalType": "Claim",
+        "name": "_claim",
+        "type": "bytes32"
+      }
+    ],
+    "name": "defend",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "extraData",
+    "outputs": [
+      {
+        "internalType": "bytes",
+        "name": "extraData_",
+        "type": "bytes"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gameCreator",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "creator_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gameData",
+    "outputs": [
+      {
+        "internalType": "GameType",
+        "name": "gameType_",
+        "type": "uint32"
+      },
+      {
+        "internalType": "Claim",
+        "name": "rootClaim_",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "bytes",
+        "name": "extraData_",
+        "type": "bytes"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gameType",
+    "outputs": [
+      {
+        "internalType": "GameType",
+        "name": "gameType_",
+        "type": "uint32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_claimIndex",
+        "type": "uint256"
+      }
+    ],
+    "name": "getChallengerDuration",
+    "outputs": [
+      {
+        "internalType": "Duration",
+        "name": "duration_",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_claimIndex",
+        "type": "uint256"
+      }
+    ],
+    "name": "getNumToResolve",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "numRemainingChildren_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "Position",
+        "name": "_position",
+        "type": "uint128"
+      }
+    ],
+    "name": "getRequiredBond",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "requiredBond_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "initialize",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l1Head",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "l1Head_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l2BlockNumber",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "l2BlockNumber_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l2BlockNumberChallenged",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l2BlockNumberChallenger",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l2ChainId",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "l2ChainId_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "maxClockDuration",
+    "outputs": [
+      {
+        "internalType": "Duration",
+        "name": "maxClockDuration_",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "maxGameDepth",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "maxGameDepth_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_challengeIndex",
+        "type": "uint256"
+      },
+      {
+        "internalType": "Claim",
+        "name": "_claim",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "bool",
+        "name": "_isAttack",
+        "type": "bool"
+      }
+    ],
+    "name": "move",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "resolutionCheckpoints",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "initialCheckpointComplete",
+        "type": "bool"
+      },
+      {
+        "internalType": "uint32",
+        "name": "subgameIndex",
+        "type": "uint32"
+      },
+      {
+        "internalType": "Position",
+        "name": "leftmostPosition",
+        "type": "uint128"
+      },
+      {
+        "internalType": "address",
+        "name": "counteredBy",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "resolve",
+    "outputs": [
+      {
+        "internalType": "enum GameStatus",
+        "name": "status_",
+        "type": "uint8"
+      }
+    ],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_claimIndex",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_numToResolve",
+        "type": "uint256"
+      }
+    ],
+    "name": "resolveClaim",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "resolvedAt",
+    "outputs": [
+      {
+        "internalType": "Timestamp",
+        "name": "",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "resolvedSubgames",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "rootClaim",
+    "outputs": [
+      {
+        "internalType": "Claim",
+        "name": "rootClaim_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "splitDepth",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "splitDepth_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingBlockNumber",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "startingBlockNumber_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingOutputRoot",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "root",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint256",
+        "name": "l2BlockNumber",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingRootHash",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "startingRootHash_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "status",
+    "outputs": [
+      {
+        "internalType": "enum GameStatus",
+        "name": "",
+        "type": "uint8"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_claimIndex",
+        "type": "uint256"
+      },
+      {
+        "internalType": "bool",
+        "name": "_isAttack",
+        "type": "bool"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_stateData",
+        "type": "bytes"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_proof",
+        "type": "bytes"
+      }
+    ],
+    "name": "step",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "subgames",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "version",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "vm",
+    "outputs": [
+      {
+        "internalType": "contract IBigStepper",
+        "name": "vm_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "weth",
+    "outputs": [
+      {
+        "internalType": "contract IDelayedWETH",
+        "name": "weth_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "uint256",
+        "name": "parentIndex",
+        "type": "uint256"
+      },
+      {
+        "indexed": true,
+        "internalType": "Claim",
+        "name": "claim",
+        "type": "bytes32"
+      },
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "claimant",
+        "type": "address"
+      }
+    ],
+    "name": "Move",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "enum GameStatus",
+        "name": "status",
+        "type": "uint8"
+      }
+    ],
+    "name": "Resolved",
+    "type": "event"
+  },
+  {
+    "inputs": [],
+    "name": "AlreadyInitialized",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "AnchorRootNotFound",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "BlockNumberMatches",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "BondTransferFailed",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "CannotDefendRootClaim",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ClaimAboveSplit",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ClaimAlreadyExists",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ClaimAlreadyResolved",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ClockNotExpired",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ClockTimeExceeded",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ContentLengthMismatch",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "DuplicateStep",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "EmptyItem",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "GameDepthExceeded",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "GameNotInProgress",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "IncorrectBondAmount",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidClockExtension",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidDataRemainder",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidHeader",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidHeaderRLP",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidLocalIdent",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidOutputRootProof",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidParent",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidPrestate",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidSplitDepth",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "L2BlockNumberChallenged",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "MaxDepthTooLarge",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "NoCreditToClaim",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "OutOfOrderResolution",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "UnexpectedList",
+    "type": "error"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "Claim",
+        "name": "rootClaim",
+        "type": "bytes32"
+      }
+    ],
+    "name": "UnexpectedRootClaim",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "UnexpectedString",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ValidStep",
+    "type": "error"
+  }
+]
\ No newline at end of file
diff --git a/op-challenger/game/fault/contracts/delayed_weth.go b/op-challenger/game/fault/contracts/delayed_weth.go
new file mode 100644
index 000000000000..f093ecb3ff3b
--- /dev/null
+++ b/op-challenger/game/fault/contracts/delayed_weth.go
@@ -0,0 +1,58 @@
+package contracts
+
+import (
+	"context"
+	"fmt"
+	"math/big"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	"github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots"
+	"github.com/ethereum/go-ethereum/common"
+)
+
+var (
+	methodWithdrawals = "withdrawals"
+)
+
+type DelayedWETHContract struct {
+	metrics     metrics.ContractMetricer
+	multiCaller *batching.MultiCaller
+	contract    *batching.BoundContract
+}
+
+type WithdrawalRequest struct {
+	Amount    *big.Int
+	Timestamp *big.Int
+}
+
+func NewDelayedWETHContract(metrics metrics.ContractMetricer, addr common.Address, caller *batching.MultiCaller) *DelayedWETHContract {
+	contractAbi := snapshots.LoadDelayedWETHABI()
+	return &DelayedWETHContract{
+		metrics:     metrics,
+		multiCaller: caller,
+		contract:    batching.NewBoundContract(contractAbi, addr),
+	}
+}
+
+// GetWithdrawals returns all withdrawals made from the contract since the given block.
+func (d *DelayedWETHContract) GetWithdrawals(ctx context.Context, block rpcblock.Block, gameAddr common.Address, recipients ...common.Address) ([]*WithdrawalRequest, error) {
+	defer d.metrics.StartContractRequest("GetWithdrawals")()
+	calls := make([]batching.Call, 0, len(recipients))
+	for _, recipient := range recipients {
+		calls = append(calls, d.contract.Call(methodWithdrawals, gameAddr, recipient))
+	}
+	results, err := d.multiCaller.Call(ctx, block, calls...)
+	if err != nil {
+		return nil, fmt.Errorf("failed to fetch withdrawals: %w", err)
+	}
+	withdrawals := make([]*WithdrawalRequest, len(recipients))
+	for i, result := range results {
+		withdrawals[i] = &WithdrawalRequest{
+			Amount:    result.GetBigInt(0),
+			Timestamp: result.GetBigInt(1),
+		}
+	}
+	return withdrawals, nil
+}
diff --git a/op-challenger/game/fault/contracts/delayed_weth_test.go b/op-challenger/game/fault/contracts/delayed_weth_test.go
new file mode 100644
index 000000000000..020189c031ae
--- /dev/null
+++ b/op-challenger/game/fault/contracts/delayed_weth_test.go
@@ -0,0 +1,50 @@
+package contracts
+
+import (
+	"context"
+	"math/big"
+	"testing"
+
+	contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	batchingTest "github.com/ethereum-optimism/optimism/op-service/sources/batching/test"
+	"github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/stretchr/testify/require"
+)
+
+var (
+	delayedWeth = common.HexToAddress("0x24112842371dFC380576ebb09Ae16Cb6B6caD7CB")
+)
+
+func TestDelayedWeth_GetWithdrawals(t *testing.T) {
+	stubRpc, weth := setupDelayedWethTest(t)
+	block := rpcblock.ByNumber(482)
+
+	addrs := []common.Address{{0x01}, {0x02}}
+	expected := [][]*big.Int{
+		[]*big.Int{big.NewInt(123), big.NewInt(456)},
+		[]*big.Int{big.NewInt(123), big.NewInt(456)},
+	}
+
+	for i, addr := range addrs {
+		stubRpc.SetResponse(delayedWeth, methodWithdrawals, block, []interface{}{fdgAddr, addr}, []interface{}{expected[i][0], expected[i][1]})
+	}
+
+	actual, err := weth.GetWithdrawals(context.Background(), block, fdgAddr, addrs...)
+	require.NoError(t, err)
+	require.Equal(t, len(expected), len(actual))
+	for i := range expected {
+		require.Zerof(t, expected[i][0].Cmp(actual[i].Amount), "expected: %v actual: %v", expected[i][1], actual[i].Amount)
+		require.Zerof(t, expected[i][1].Cmp(actual[i].Timestamp), "expected: %v actual: %v", expected[i][0], actual[i].Timestamp)
+	}
+}
+
+func setupDelayedWethTest(t *testing.T) (*batchingTest.AbiBasedRpc, *DelayedWETHContract) {
+	delayedWethAbi := snapshots.LoadDelayedWETHABI()
+	stubRpc := batchingTest.NewAbiBasedRpc(t, delayedWeth, delayedWethAbi)
+	caller := batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize)
+	weth := NewDelayedWETHContract(contractMetrics.NoopContractMetrics, delayedWeth, caller)
+	return stubRpc, weth
+}
diff --git a/op-challenger/game/fault/contracts/faultdisputegame.go b/op-challenger/game/fault/contracts/faultdisputegame.go
index ecc07277b1d4..e48f06549dfb 100644
--- a/op-challenger/game/fault/contracts/faultdisputegame.go
+++ b/op-challenger/game/fault/contracts/faultdisputegame.go
@@ -1,47 +1,68 @@
 package contracts
 
 import (
+	"bytes"
 	"context"
+	"errors"
 	"fmt"
 	"math"
 	"math/big"
+	"strings"
+	"time"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
+	"github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots"
+	"github.com/ethereum/go-ethereum/accounts/abi"
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/rlp"
+)
+
+// The maximum number of children that will be processed during a call to `resolveClaim`
+var maxChildChecks = big.NewInt(512)
+
+var (
+	methodVersion                 = "version"
+	methodMaxClockDuration        = "maxClockDuration"
+	methodMaxGameDepth            = "maxGameDepth"
+	methodAbsolutePrestate        = "absolutePrestate"
+	methodStatus                  = "status"
+	methodRootClaim               = "rootClaim"
+	methodClaimCount              = "claimDataLen"
+	methodClaim                   = "claimData"
+	methodL1Head                  = "l1Head"
+	methodResolvedSubgames        = "resolvedSubgames"
+	methodResolve                 = "resolve"
+	methodResolveClaim            = "resolveClaim"
+	methodAttack                  = "attack"
+	methodDefend                  = "defend"
+	methodStep                    = "step"
+	methodAddLocalData            = "addLocalData"
+	methodVM                      = "vm"
+	methodStartingBlockNumber     = "startingBlockNumber"
+	methodStartingRootHash        = "startingRootHash"
+	methodSplitDepth              = "splitDepth"
+	methodL2BlockNumber           = "l2BlockNumber"
+	methodRequiredBond            = "getRequiredBond"
+	methodClaimCredit             = "claimCredit"
+	methodCredit                  = "credit"
+	methodWETH                    = "weth"
+	methodL2BlockNumberChallenged = "l2BlockNumberChallenged"
+	methodL2BlockNumberChallenger = "l2BlockNumberChallenger"
+	methodChallengeRootL2Block    = "challengeRootL2Block"
 )
 
 var (
-	methodGameDuration       = "gameDuration"
-	methodMaxGameDepth       = "maxGameDepth"
-	methodAbsolutePrestate   = "absolutePrestate"
-	methodStatus             = "status"
-	methodRootClaim          = "rootClaim"
-	methodClaimCount         = "claimDataLen"
-	methodClaim              = "claimData"
-	methodL1Head             = "l1Head"
-	methodResolve            = "resolve"
-	methodResolveClaim       = "resolveClaim"
-	methodAttack             = "attack"
-	methodDefend             = "defend"
-	methodStep               = "step"
-	methodAddLocalData       = "addLocalData"
-	methodVM                 = "vm"
-	methodGenesisBlockNumber = "genesisBlockNumber"
-	methodGenesisOutputRoot  = "genesisOutputRoot"
-	methodSplitDepth         = "splitDepth"
-	methodL2BlockNumber      = "l2BlockNumber"
-	methodRequiredBond       = "getRequiredBond"
-	methodClaimCredit        = "claimCredit"
-	methodCredit             = "credit"
-	methodWETH               = "weth"
+	ErrSimulationFailed             = errors.New("tx simulation failed")
+	ErrChallengeL2BlockNotSupported = errors.New("contract version does not support challenging L2 block number")
 )
 
-type FaultDisputeGameContract struct {
+type FaultDisputeGameContractLatest struct {
+	metrics     metrics.ContractMetricer
 	multiCaller *batching.MultiCaller
 	contract    *batching.BoundContract
 }
@@ -51,22 +72,75 @@ type Proposal struct {
 	OutputRoot    common.Hash
 }
 
-func NewFaultDisputeGameContract(addr common.Address, caller *batching.MultiCaller) (*FaultDisputeGameContract, error) {
-	contractAbi, err := bindings.FaultDisputeGameMetaData.GetAbi()
+// outputRootProof is designed to match the solidity OutputRootProof struct.
+type outputRootProof struct {
+	Version                  [32]byte
+	StateRoot                [32]byte
+	MessagePasserStorageRoot [32]byte
+	LatestBlockhash          [32]byte
+}
+
+func NewFaultDisputeGameContract(ctx context.Context, metrics metrics.ContractMetricer, addr common.Address, caller *batching.MultiCaller) (FaultDisputeGameContract, error) {
+	contractAbi := snapshots.LoadFaultDisputeGameABI()
+
+	result, err := caller.SingleCall(ctx, rpcblock.Latest, batching.NewContractCall(contractAbi, addr, methodVersion))
+	if err != nil {
+		return nil, fmt.Errorf("failed to retrieve version of dispute game %v: %w", addr, err)
+	}
+	version := result.GetString(0)
+
+	if strings.HasPrefix(version, "0.8.") {
+		// Detected an older version of contracts, use a compatibility shim.
+		legacyAbi := mustParseAbi(faultDisputeGameAbi020)
+		return &FaultDisputeGameContract080{
+			FaultDisputeGameContractLatest: FaultDisputeGameContractLatest{
+				metrics:     metrics,
+				multiCaller: caller,
+				contract:    batching.NewBoundContract(legacyAbi, addr),
+			},
+		}, nil
+	} else if strings.HasPrefix(version, "0.18.") || strings.HasPrefix(version, "1.0.") {
+		// Detected an older version of contracts, use a compatibility shim.
+		legacyAbi := mustParseAbi(faultDisputeGameAbi0180)
+		return &FaultDisputeGameContract0180{
+			FaultDisputeGameContractLatest: FaultDisputeGameContractLatest{
+				metrics:     metrics,
+				multiCaller: caller,
+				contract:    batching.NewBoundContract(legacyAbi, addr),
+			},
+		}, nil
+	} else if strings.HasPrefix(version, "1.1.") {
+		// Detected an older version of contracts, use a compatibility shim.
+		legacyAbi := mustParseAbi(faultDisputeGameAbi111)
+		return &FaultDisputeGameContract111{
+			FaultDisputeGameContractLatest: FaultDisputeGameContractLatest{
+				metrics:     metrics,
+				multiCaller: caller,
+				contract:    batching.NewBoundContract(legacyAbi, addr),
+			},
+		}, nil
+	} else {
+		return &FaultDisputeGameContractLatest{
+			metrics:     metrics,
+			multiCaller: caller,
+			contract:    batching.NewBoundContract(contractAbi, addr),
+		}, nil
+	}
+}
+
+func mustParseAbi(json []byte) *abi.ABI {
+	loaded, err := abi.JSON(bytes.NewReader(json))
 	if err != nil {
-		return nil, fmt.Errorf("failed to load fault dispute game ABI: %w", err)
+		panic(err)
 	}
-
-	return &FaultDisputeGameContract{
-		multiCaller: caller,
-		contract:    batching.NewBoundContract(contractAbi, addr),
-	}, nil
+	return &loaded
 }
 
 // GetBalance returns the total amount of ETH controlled by this contract.
 // Note that the ETH is actually held by the DelayedWETH contract which may be shared by multiple games.
 // Returns the balance and the address of the contract that actually holds the balance.
-func (f *FaultDisputeGameContract) GetBalance(ctx context.Context, block rpcblock.Block) (*big.Int, common.Address, error) {
+func (f *FaultDisputeGameContractLatest) GetBalance(ctx context.Context, block rpcblock.Block) (*big.Int, common.Address, error) {
+	defer f.metrics.StartContractRequest("GetBalance")()
 	result, err := f.multiCaller.SingleCall(ctx, block, f.contract.Call(methodWETH))
 	if err != nil {
 		return nil, common.Address{}, fmt.Errorf("failed to load weth address: %w", err)
@@ -81,9 +155,10 @@ func (f *FaultDisputeGameContract) GetBalance(ctx context.Context, block rpcbloc
 
 // GetBlockRange returns the block numbers of the absolute pre-state block (typically genesis or the bedrock activation block)
 // and the post-state block (that the proposed output root is for).
-func (f *FaultDisputeGameContract) GetBlockRange(ctx context.Context) (prestateBlock uint64, poststateBlock uint64, retErr error) {
+func (f *FaultDisputeGameContractLatest) GetBlockRange(ctx context.Context) (prestateBlock uint64, poststateBlock uint64, retErr error) {
+	defer f.metrics.StartContractRequest("GetBlockRange")()
 	results, err := f.multiCaller.Call(ctx, rpcblock.Latest,
-		f.contract.Call(methodGenesisBlockNumber),
+		f.contract.Call(methodStartingBlockNumber),
 		f.contract.Call(methodL2BlockNumber))
 	if err != nil {
 		retErr = fmt.Errorf("failed to retrieve game block range: %w", err)
@@ -98,40 +173,66 @@ func (f *FaultDisputeGameContract) GetBlockRange(ctx context.Context) (prestateB
 	return
 }
 
-// GetGameMetadata returns the game's L1 head, L2 block number, root claim, status, and game duration.
-func (f *FaultDisputeGameContract) GetGameMetadata(ctx context.Context, block rpcblock.Block) (common.Hash, uint64, common.Hash, gameTypes.GameStatus, uint64, error) {
+type GameMetadata struct {
+	L1Head                  common.Hash
+	L2BlockNum              uint64
+	RootClaim               common.Hash
+	Status                  gameTypes.GameStatus
+	MaxClockDuration        uint64
+	L2BlockNumberChallenged bool
+	L2BlockNumberChallenger common.Address
+}
+
+// GetGameMetadata returns the game's L1 head, L2 block number, root claim, status, max clock duration, and is l2 block number challenged.
+func (f *FaultDisputeGameContractLatest) GetGameMetadata(ctx context.Context, block rpcblock.Block) (GameMetadata, error) {
+	defer f.metrics.StartContractRequest("GetGameMetadata")()
 	results, err := f.multiCaller.Call(ctx, block,
 		f.contract.Call(methodL1Head),
 		f.contract.Call(methodL2BlockNumber),
 		f.contract.Call(methodRootClaim),
 		f.contract.Call(methodStatus),
-		f.contract.Call(methodGameDuration))
+		f.contract.Call(methodMaxClockDuration),
+		f.contract.Call(methodL2BlockNumberChallenged),
+		f.contract.Call(methodL2BlockNumberChallenger),
+	)
 	if err != nil {
-		return common.Hash{}, 0, common.Hash{}, 0, 0, fmt.Errorf("failed to retrieve game metadata: %w", err)
+		return GameMetadata{}, fmt.Errorf("failed to retrieve game metadata: %w", err)
 	}
-	if len(results) != 5 {
-		return common.Hash{}, 0, common.Hash{}, 0, 0, fmt.Errorf("expected 3 results but got %v", len(results))
+	if len(results) != 7 {
+		return GameMetadata{}, fmt.Errorf("expected 6 results but got %v", len(results))
 	}
 	l1Head := results[0].GetHash(0)
 	l2BlockNumber := results[1].GetBigInt(0).Uint64()
 	rootClaim := results[2].GetHash(0)
 	status, err := gameTypes.GameStatusFromUint8(results[3].GetUint8(0))
 	if err != nil {
-		return common.Hash{}, 0, common.Hash{}, 0, 0, fmt.Errorf("failed to convert game status: %w", err)
+		return GameMetadata{}, fmt.Errorf("failed to convert game status: %w", err)
 	}
 	duration := results[4].GetUint64(0)
-	return l1Head, l2BlockNumber, rootClaim, status, duration, nil
+	blockChallenged := results[5].GetBool(0)
+	blockChallenger := results[6].GetAddress(0)
+	return GameMetadata{
+		L1Head:                  l1Head,
+		L2BlockNum:              l2BlockNumber,
+		RootClaim:               rootClaim,
+		Status:                  status,
+		MaxClockDuration:        duration,
+		L2BlockNumberChallenged: blockChallenged,
+		L2BlockNumberChallenger: blockChallenger,
+	}, nil
 }
 
-func (f *FaultDisputeGameContract) GetGenesisOutputRoot(ctx context.Context) (common.Hash, error) {
-	genesisOutputRoot, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodGenesisOutputRoot))
+func (f *FaultDisputeGameContractLatest) GetStartingRootHash(ctx context.Context) (common.Hash, error) {
+	defer f.metrics.StartContractRequest("GetStartingRootHash")()
+	startingRootHash, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodStartingRootHash))
 	if err != nil {
 		return common.Hash{}, fmt.Errorf("failed to retrieve genesis output root: %w", err)
 	}
-	return genesisOutputRoot.GetHash(0), nil
+	return startingRootHash.GetHash(0), nil
 }
 
-func (f *FaultDisputeGameContract) GetSplitDepth(ctx context.Context) (types.Depth, error) {
+func (f *FaultDisputeGameContractLatest) GetSplitDepth(ctx context.Context) (types.Depth, error) {
+	defer f.metrics.StartContractRequest("GetSplitDepth")()
 	splitDepth, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodSplitDepth))
 	if err != nil {
 		return 0, fmt.Errorf("failed to retrieve split depth: %w", err)
@@ -139,7 +240,8 @@ func (f *FaultDisputeGameContract) GetSplitDepth(ctx context.Context) (types.Dep
 	return types.Depth(splitDepth.GetBigInt(0).Uint64()), nil
 }
 
-func (f *FaultDisputeGameContract) GetCredit(ctx context.Context, recipient common.Address) (*big.Int, gameTypes.GameStatus, error) {
+func (f *FaultDisputeGameContractLatest) GetCredit(ctx context.Context, recipient common.Address) (*big.Int, gameTypes.GameStatus, error) {
+	defer f.metrics.StartContractRequest("GetCredit")()
 	results, err := f.multiCaller.Call(ctx, rpcblock.Latest,
 		f.contract.Call(methodCredit, recipient),
 		f.contract.Call(methodStatus))
@@ -157,7 +259,24 @@ func (f *FaultDisputeGameContract) GetCredit(ctx context.Context, recipient comm
 	return credit, status, nil
 }
 
-func (f *FaultDisputeGameContract) GetCredits(ctx context.Context, block rpcblock.Block, recipients ...common.Address) ([]*big.Int, error) {
+func (f *FaultDisputeGameContractLatest) GetRequiredBonds(ctx context.Context, block rpcblock.Block, positions ...*big.Int) ([]*big.Int, error) {
+	calls := make([]batching.Call, 0, len(positions))
+	for _, position := range positions {
+		calls = append(calls, f.contract.Call(methodRequiredBond, position))
+	}
+	results, err := f.multiCaller.Call(ctx, block, calls...)
+	if err != nil {
+		return nil, fmt.Errorf("failed to retrieve required bonds: %w", err)
+	}
+	requiredBonds := make([]*big.Int, 0, len(positions))
+	for _, result := range results {
+		requiredBonds = append(requiredBonds, result.GetBigInt(0))
+	}
+	return requiredBonds, nil
+}
+
+func (f *FaultDisputeGameContractLatest) GetCredits(ctx context.Context, block rpcblock.Block, recipients ...common.Address) ([]*big.Int, error) {
+	defer f.metrics.StartContractRequest("GetCredits")()
 	calls := make([]batching.Call, 0, len(recipients))
 	for _, recipient := range recipients {
 		calls = append(calls, f.contract.Call(methodCredit, recipient))
@@ -173,12 +292,18 @@ func (f *FaultDisputeGameContract) GetCredits(ctx context.Context, block rpcbloc
 	return credits, nil
 }
 
-func (f *FaultDisputeGameContract) ClaimCredit(recipient common.Address) (txmgr.TxCandidate, error) {
+func (f *FaultDisputeGameContractLatest) ClaimCreditTx(ctx context.Context, recipient common.Address) (txmgr.TxCandidate, error) {
+	defer f.metrics.StartContractRequest("ClaimCredit")()
 	call := f.contract.Call(methodClaimCredit, recipient)
+	_, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, call)
+	if err != nil {
+		return txmgr.TxCandidate{}, fmt.Errorf("%w: %v", ErrSimulationFailed, err.Error())
+	}
 	return call.ToTxCandidate()
 }
 
-func (f *FaultDisputeGameContract) GetRequiredBond(ctx context.Context, position types.Position) (*big.Int, error) {
+func (f *FaultDisputeGameContractLatest) GetRequiredBond(ctx context.Context, position types.Position) (*big.Int, error) {
+	defer f.metrics.StartContractRequest("GetRequiredBond")()
 	bond, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodRequiredBond, position.ToGIndex()))
 	if err != nil {
 		return nil, fmt.Errorf("failed to retrieve required bond: %w", err)
@@ -186,14 +311,14 @@ func (f *FaultDisputeGameContract) GetRequiredBond(ctx context.Context, position
 	return bond.GetBigInt(0), nil
 }
 
-func (f *FaultDisputeGameContract) UpdateOracleTx(ctx context.Context, claimIdx uint64, data *types.PreimageOracleData) (txmgr.TxCandidate, error) {
+func (f *FaultDisputeGameContractLatest) UpdateOracleTx(ctx context.Context, claimIdx uint64, data *types.PreimageOracleData) (txmgr.TxCandidate, error) {
 	if data.IsLocal {
 		return f.addLocalDataTx(claimIdx, data)
 	}
 	return f.addGlobalDataTx(ctx, data)
 }
 
-func (f *FaultDisputeGameContract) addLocalDataTx(claimIdx uint64, data *types.PreimageOracleData) (txmgr.TxCandidate, error) {
+func (f *FaultDisputeGameContractLatest) addLocalDataTx(claimIdx uint64, data *types.PreimageOracleData) (txmgr.TxCandidate, error) {
 	call := f.contract.Call(
 		methodAddLocalData,
 		data.GetIdent(),
@@ -203,7 +328,7 @@ func (f *FaultDisputeGameContract) addLocalDataTx(claimIdx uint64, data *types.P
 	return call.ToTxCandidate()
 }
 
-func (f *FaultDisputeGameContract) addGlobalDataTx(ctx context.Context, data *types.PreimageOracleData) (txmgr.TxCandidate, error) {
+func (f *FaultDisputeGameContractLatest) addGlobalDataTx(ctx context.Context, data *types.PreimageOracleData) (txmgr.TxCandidate, error) {
 	oracle, err := f.GetOracle(ctx)
 	if err != nil {
 		return txmgr.TxCandidate{}, err
@@ -211,7 +336,26 @@ func (f *FaultDisputeGameContract) addGlobalDataTx(ctx context.Context, data *ty
 	return oracle.AddGlobalDataTx(data)
 }
 
-func (f *FaultDisputeGameContract) GetOracle(ctx context.Context) (*PreimageOracleContract, error) {
+func (f *FaultDisputeGameContractLatest) GetWithdrawals(ctx context.Context, block rpcblock.Block, gameAddr common.Address, recipients ...common.Address) ([]*WithdrawalRequest, error) {
+	defer f.metrics.StartContractRequest("GetWithdrawals")()
+	delayedWETH, err := f.getDelayedWETH(ctx)
+	if err != nil {
+		return nil, err
+	}
+	return delayedWETH.GetWithdrawals(ctx, block, gameAddr, recipients...)
+}
+
+func (f *FaultDisputeGameContractLatest) getDelayedWETH(ctx context.Context) (*DelayedWETHContract, error) {
+	defer f.metrics.StartContractRequest("GetDelayedWETH")()
+	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodWETH))
+	if err != nil {
+		return nil, fmt.Errorf("failed to fetch WETH addr: %w", err)
+	}
+	return NewDelayedWETHContract(f.metrics, result.GetAddress(0), f.multiCaller), nil
+}
+
+func (f *FaultDisputeGameContractLatest) GetOracle(ctx context.Context) (*PreimageOracleContract, error) {
+	defer f.metrics.StartContractRequest("GetOracle")()
 	vm, err := f.vm(ctx)
 	if err != nil {
 		return nil, err
@@ -219,15 +363,17 @@ func (f *FaultDisputeGameContract) GetOracle(ctx context.Context) (*PreimageOrac
 	return vm.Oracle(ctx)
 }
 
-func (f *FaultDisputeGameContract) GetGameDuration(ctx context.Context) (uint64, error) {
-	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodGameDuration))
+func (f *FaultDisputeGameContractLatest) GetMaxClockDuration(ctx context.Context) (time.Duration, error) {
+	defer f.metrics.StartContractRequest("GetMaxClockDuration")()
+	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodMaxClockDuration))
 	if err != nil {
-		return 0, fmt.Errorf("failed to fetch game duration: %w", err)
+		return 0, fmt.Errorf("failed to fetch max clock duration: %w", err)
 	}
-	return result.GetUint64(0), nil
+	return time.Duration(result.GetUint64(0)) * time.Second, nil
 }
 
-func (f *FaultDisputeGameContract) GetMaxGameDepth(ctx context.Context) (types.Depth, error) {
+func (f *FaultDisputeGameContractLatest) GetMaxGameDepth(ctx context.Context) (types.Depth, error) {
+	defer f.metrics.StartContractRequest("GetMaxGameDepth")()
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodMaxGameDepth))
 	if err != nil {
 		return 0, fmt.Errorf("failed to fetch max game depth: %w", err)
@@ -235,7 +381,8 @@ func (f *FaultDisputeGameContract) GetMaxGameDepth(ctx context.Context) (types.D
 	return types.Depth(result.GetBigInt(0).Uint64()), nil
 }
 
-func (f *FaultDisputeGameContract) GetAbsolutePrestateHash(ctx context.Context) (common.Hash, error) {
+func (f *FaultDisputeGameContractLatest) GetAbsolutePrestateHash(ctx context.Context) (common.Hash, error) {
+	defer f.metrics.StartContractRequest("GetAbsolutePrestateHash")()
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodAbsolutePrestate))
 	if err != nil {
 		return common.Hash{}, fmt.Errorf("failed to fetch absolute prestate hash: %w", err)
@@ -243,7 +390,8 @@ func (f *FaultDisputeGameContract) GetAbsolutePrestateHash(ctx context.Context)
 	return result.GetHash(0), nil
 }
 
-func (f *FaultDisputeGameContract) GetL1Head(ctx context.Context) (common.Hash, error) {
+func (f *FaultDisputeGameContractLatest) GetL1Head(ctx context.Context) (common.Hash, error) {
+	defer f.metrics.StartContractRequest("GetL1Head")()
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodL1Head))
 	if err != nil {
 		return common.Hash{}, fmt.Errorf("failed to fetch L1 head: %w", err)
@@ -251,7 +399,8 @@ func (f *FaultDisputeGameContract) GetL1Head(ctx context.Context) (common.Hash,
 	return result.GetHash(0), nil
 }
 
-func (f *FaultDisputeGameContract) GetStatus(ctx context.Context) (gameTypes.GameStatus, error) {
+func (f *FaultDisputeGameContractLatest) GetStatus(ctx context.Context) (gameTypes.GameStatus, error) {
+	defer f.metrics.StartContractRequest("GetStatus")()
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodStatus))
 	if err != nil {
 		return 0, fmt.Errorf("failed to fetch status: %w", err)
@@ -259,7 +408,8 @@ func (f *FaultDisputeGameContract) GetStatus(ctx context.Context) (gameTypes.Gam
 	return gameTypes.GameStatusFromUint8(result.GetUint8(0))
 }
 
-func (f *FaultDisputeGameContract) GetClaimCount(ctx context.Context) (uint64, error) {
+func (f *FaultDisputeGameContractLatest) GetClaimCount(ctx context.Context) (uint64, error) {
+	defer f.metrics.StartContractRequest("GetClaimCount")()
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodClaimCount))
 	if err != nil {
 		return 0, fmt.Errorf("failed to fetch claim count: %w", err)
@@ -267,7 +417,8 @@ func (f *FaultDisputeGameContract) GetClaimCount(ctx context.Context) (uint64, e
 	return result.GetBigInt(0).Uint64(), nil
 }
 
-func (f *FaultDisputeGameContract) GetClaim(ctx context.Context, idx uint64) (types.Claim, error) {
+func (f *FaultDisputeGameContractLatest) GetClaim(ctx context.Context, idx uint64) (types.Claim, error) {
+	defer f.metrics.StartContractRequest("GetClaim")()
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodClaim, new(big.Int).SetUint64(idx)))
 	if err != nil {
 		return types.Claim{}, fmt.Errorf("failed to fetch claim %v: %w", idx, err)
@@ -275,7 +426,8 @@ func (f *FaultDisputeGameContract) GetClaim(ctx context.Context, idx uint64) (ty
 	return f.decodeClaim(result, int(idx)), nil
 }
 
-func (f *FaultDisputeGameContract) GetAllClaims(ctx context.Context, block rpcblock.Block) ([]types.Claim, error) {
+func (f *FaultDisputeGameContractLatest) GetAllClaims(ctx context.Context, block rpcblock.Block) ([]types.Claim, error) {
+	defer f.metrics.StartContractRequest("GetAllClaims")()
 	results, err := batching.ReadArray(ctx, f.multiCaller, block, f.contract.Call(methodClaimCount), func(i *big.Int) *batching.ContractCall {
 		return f.contract.Call(methodClaim, i)
 	})
@@ -290,31 +442,83 @@ func (f *FaultDisputeGameContract) GetAllClaims(ctx context.Context, block rpcbl
 	return claims, nil
 }
 
-func (f *FaultDisputeGameContract) vm(ctx context.Context) (*VMContract, error) {
+func (f *FaultDisputeGameContractLatest) IsResolved(ctx context.Context, block rpcblock.Block, claims ...types.Claim) ([]bool, error) {
+	defer f.metrics.StartContractRequest("IsResolved")()
+	calls := make([]batching.Call, 0, len(claims))
+	for _, claim := range claims {
+		calls = append(calls, f.contract.Call(methodResolvedSubgames, big.NewInt(int64(claim.ContractIndex))))
+	}
+	results, err := f.multiCaller.Call(ctx, block, calls...)
+	if err != nil {
+		return nil, fmt.Errorf("failed to retrieve resolved subgames: %w", err)
+	}
+	resolved := make([]bool, 0, len(claims))
+	for _, result := range results {
+		resolved = append(resolved, result.GetBool(0))
+	}
+	return resolved, nil
+}
+
+func (f *FaultDisputeGameContractLatest) vm(ctx context.Context) (*VMContract, error) {
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodVM))
 	if err != nil {
 		return nil, fmt.Errorf("failed to fetch VM addr: %w", err)
 	}
 	vmAddr := result.GetAddress(0)
-	return NewVMContract(vmAddr, f.multiCaller)
+	return NewVMContract(vmAddr, f.multiCaller), nil
 }
 
-func (f *FaultDisputeGameContract) AttackTx(parentContractIndex uint64, pivot common.Hash) (txmgr.TxCandidate, error) {
-	call := f.contract.Call(methodAttack, new(big.Int).SetUint64(parentContractIndex), pivot)
-	return call.ToTxCandidate()
+func (f *FaultDisputeGameContractLatest) IsL2BlockNumberChallenged(ctx context.Context, block rpcblock.Block) (bool, error) {
+	defer f.metrics.StartContractRequest("IsL2BlockNumberChallenged")()
+	result, err := f.multiCaller.SingleCall(ctx, block, f.contract.Call(methodL2BlockNumberChallenged))
+	if err != nil {
+		return false, fmt.Errorf("failed to fetch block number challenged: %w", err)
+	}
+	return result.GetBool(0), nil
 }
 
-func (f *FaultDisputeGameContract) DefendTx(parentContractIndex uint64, pivot common.Hash) (txmgr.TxCandidate, error) {
-	call := f.contract.Call(methodDefend, new(big.Int).SetUint64(parentContractIndex), pivot)
-	return call.ToTxCandidate()
+func (f *FaultDisputeGameContractLatest) ChallengeL2BlockNumberTx(challenge *types.InvalidL2BlockNumberChallenge) (txmgr.TxCandidate, error) {
+	headerRlp, err := rlp.EncodeToBytes(challenge.Header)
+	if err != nil {
+		return txmgr.TxCandidate{}, fmt.Errorf("failed to serialize header: %w", err)
+	}
+	return f.contract.Call(methodChallengeRootL2Block, outputRootProof{
+		Version:                  challenge.Output.Version,
+		StateRoot:                challenge.Output.StateRoot,
+		MessagePasserStorageRoot: challenge.Output.WithdrawalStorageRoot,
+		LatestBlockhash:          challenge.Output.BlockRef.Hash,
+	}, headerRlp).ToTxCandidate()
+}
+
+func (f *FaultDisputeGameContractLatest) AttackTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error) {
+	call := f.contract.Call(methodAttack, parent.Value, big.NewInt(int64(parent.ContractIndex)), pivot)
+	return f.txWithBond(ctx, parent.Position.Attack(), call)
+}
+
+func (f *FaultDisputeGameContractLatest) DefendTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error) {
+	call := f.contract.Call(methodDefend, parent.Value, big.NewInt(int64(parent.ContractIndex)), pivot)
+	return f.txWithBond(ctx, parent.Position.Defend(), call)
 }
 
-func (f *FaultDisputeGameContract) StepTx(claimIdx uint64, isAttack bool, stateData []byte, proof []byte) (txmgr.TxCandidate, error) {
+func (f *FaultDisputeGameContractLatest) txWithBond(ctx context.Context, position types.Position, call *batching.ContractCall) (txmgr.TxCandidate, error) {
+	tx, err := call.ToTxCandidate()
+	if err != nil {
+		return txmgr.TxCandidate{}, fmt.Errorf("failed to create transaction: %w", err)
+	}
+	tx.Value, err = f.GetRequiredBond(ctx, position)
+	if err != nil {
+		return txmgr.TxCandidate{}, fmt.Errorf("failed to fetch required bond: %w", err)
+	}
+	return tx, nil
+}
+
+func (f *FaultDisputeGameContractLatest) StepTx(claimIdx uint64, isAttack bool, stateData []byte, proof []byte) (txmgr.TxCandidate, error) {
 	call := f.contract.Call(methodStep, new(big.Int).SetUint64(claimIdx), isAttack, stateData, proof)
 	return call.ToTxCandidate()
 }
 
-func (f *FaultDisputeGameContract) CallResolveClaim(ctx context.Context, claimIdx uint64) error {
+func (f *FaultDisputeGameContractLatest) CallResolveClaim(ctx context.Context, claimIdx uint64) error {
+	defer f.metrics.StartContractRequest("CallResolveClaim")()
 	call := f.resolveClaimCall(claimIdx)
 	_, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, call)
 	if err != nil {
@@ -323,16 +527,17 @@ func (f *FaultDisputeGameContract) CallResolveClaim(ctx context.Context, claimId
 	return nil
 }
 
-func (f *FaultDisputeGameContract) ResolveClaimTx(claimIdx uint64) (txmgr.TxCandidate, error) {
+func (f *FaultDisputeGameContractLatest) ResolveClaimTx(claimIdx uint64) (txmgr.TxCandidate, error) {
 	call := f.resolveClaimCall(claimIdx)
 	return call.ToTxCandidate()
 }
 
-func (f *FaultDisputeGameContract) resolveClaimCall(claimIdx uint64) *batching.ContractCall {
-	return f.contract.Call(methodResolveClaim, new(big.Int).SetUint64(claimIdx))
+func (f *FaultDisputeGameContractLatest) resolveClaimCall(claimIdx uint64) *batching.ContractCall {
+	return f.contract.Call(methodResolveClaim, new(big.Int).SetUint64(claimIdx), maxChildChecks)
 }
 
-func (f *FaultDisputeGameContract) CallResolve(ctx context.Context) (gameTypes.GameStatus, error) {
+func (f *FaultDisputeGameContractLatest) CallResolve(ctx context.Context) (gameTypes.GameStatus, error) {
+	defer f.metrics.StartContractRequest("CallResolve")()
 	call := f.resolveCall()
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, call)
 	if err != nil {
@@ -341,31 +546,31 @@ func (f *FaultDisputeGameContract) CallResolve(ctx context.Context) (gameTypes.G
 	return gameTypes.GameStatusFromUint8(result.GetUint8(0))
 }
 
-func (f *FaultDisputeGameContract) ResolveTx() (txmgr.TxCandidate, error) {
+func (f *FaultDisputeGameContractLatest) ResolveTx() (txmgr.TxCandidate, error) {
 	call := f.resolveCall()
 	return call.ToTxCandidate()
 }
 
-func (f *FaultDisputeGameContract) resolveCall() *batching.ContractCall {
+func (f *FaultDisputeGameContractLatest) resolveCall() *batching.ContractCall {
 	return f.contract.Call(methodResolve)
 }
 
 // decodeClock decodes a uint128 into a Clock duration and timestamp.
-func decodeClock(clock *big.Int) *types.Clock {
+func decodeClock(clock *big.Int) types.Clock {
 	maxUint64 := new(big.Int).Add(new(big.Int).SetUint64(math.MaxUint64), big.NewInt(1))
 	remainder := new(big.Int)
 	quotient, _ := new(big.Int).QuoRem(clock, maxUint64, remainder)
-	return types.NewClock(quotient.Uint64(), remainder.Uint64())
+	return types.NewClock(time.Duration(quotient.Int64())*time.Second, time.Unix(remainder.Int64(), 0))
 }
 
 // packClock packs the Clock duration and timestamp into a uint128.
-func packClock(c *types.Clock) *big.Int {
-	duration := new(big.Int).SetUint64(c.Duration)
+func packClock(c types.Clock) *big.Int {
+	duration := big.NewInt(int64(c.Duration.Seconds()))
 	encoded := new(big.Int).Lsh(duration, 64)
-	return new(big.Int).Or(encoded, new(big.Int).SetUint64(c.Timestamp))
+	return new(big.Int).Or(encoded, big.NewInt(c.Timestamp.Unix()))
 }
 
-func (f *FaultDisputeGameContract) decodeClaim(result *batching.CallResult, contractIndex int) types.Claim {
+func (f *FaultDisputeGameContractLatest) decodeClaim(result *batching.CallResult, contractIndex int) types.Claim {
 	parentIndex := result.GetUint32(0)
 	counteredBy := result.GetAddress(1)
 	claimant := result.GetAddress(2)
@@ -386,3 +591,37 @@ func (f *FaultDisputeGameContract) decodeClaim(result *batching.CallResult, cont
 		ParentContractIndex: int(parentIndex),
 	}
 }
+
+type FaultDisputeGameContract interface {
+	GetBalance(ctx context.Context, block rpcblock.Block) (*big.Int, common.Address, error)
+	GetBlockRange(ctx context.Context) (prestateBlock uint64, poststateBlock uint64, retErr error)
+	GetGameMetadata(ctx context.Context, block rpcblock.Block) (GameMetadata, error)
+	GetStartingRootHash(ctx context.Context) (common.Hash, error)
+	GetSplitDepth(ctx context.Context) (types.Depth, error)
+	GetCredit(ctx context.Context, recipient common.Address) (*big.Int, gameTypes.GameStatus, error)
+	GetRequiredBonds(ctx context.Context, block rpcblock.Block, positions ...*big.Int) ([]*big.Int, error)
+	GetCredits(ctx context.Context, block rpcblock.Block, recipients ...common.Address) ([]*big.Int, error)
+	ClaimCreditTx(ctx context.Context, recipient common.Address) (txmgr.TxCandidate, error)
+	GetRequiredBond(ctx context.Context, position types.Position) (*big.Int, error)
+	UpdateOracleTx(ctx context.Context, claimIdx uint64, data *types.PreimageOracleData) (txmgr.TxCandidate, error)
+	GetWithdrawals(ctx context.Context, block rpcblock.Block, gameAddr common.Address, recipients ...common.Address) ([]*WithdrawalRequest, error)
+	GetOracle(ctx context.Context) (*PreimageOracleContract, error)
+	GetMaxClockDuration(ctx context.Context) (time.Duration, error)
+	GetMaxGameDepth(ctx context.Context) (types.Depth, error)
+	GetAbsolutePrestateHash(ctx context.Context) (common.Hash, error)
+	GetL1Head(ctx context.Context) (common.Hash, error)
+	GetStatus(ctx context.Context) (gameTypes.GameStatus, error)
+	GetClaimCount(ctx context.Context) (uint64, error)
+	GetClaim(ctx context.Context, idx uint64) (types.Claim, error)
+	GetAllClaims(ctx context.Context, block rpcblock.Block) ([]types.Claim, error)
+	IsResolved(ctx context.Context, block rpcblock.Block, claims ...types.Claim) ([]bool, error)
+	IsL2BlockNumberChallenged(ctx context.Context, block rpcblock.Block) (bool, error)
+	ChallengeL2BlockNumberTx(challenge *types.InvalidL2BlockNumberChallenge) (txmgr.TxCandidate, error)
+	AttackTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error)
+	DefendTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error)
+	StepTx(claimIdx uint64, isAttack bool, stateData []byte, proof []byte) (txmgr.TxCandidate, error)
+	CallResolveClaim(ctx context.Context, claimIdx uint64) error
+	ResolveClaimTx(claimIdx uint64) (txmgr.TxCandidate, error)
+	CallResolve(ctx context.Context) (gameTypes.GameStatus, error)
+	ResolveTx() (txmgr.TxCandidate, error)
+}
diff --git a/op-challenger/game/fault/contracts/faultdisputegame0180.go b/op-challenger/game/fault/contracts/faultdisputegame0180.go
new file mode 100644
index 000000000000..3fad2aec75a4
--- /dev/null
+++ b/op-challenger/game/fault/contracts/faultdisputegame0180.go
@@ -0,0 +1,73 @@
+package contracts
+
+import (
+	"context"
+	_ "embed"
+	"fmt"
+	"math/big"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	"github.com/ethereum-optimism/optimism/op-service/txmgr"
+	"github.com/ethereum/go-ethereum/common"
+)
+
+//go:embed abis/FaultDisputeGame-0.18.1.json
+var faultDisputeGameAbi0180 []byte
+
+type FaultDisputeGameContract0180 struct {
+	FaultDisputeGameContractLatest
+}
+
+// GetGameMetadata returns the game's L1 head, L2 block number, root claim, status, and max clock duration.
+func (f *FaultDisputeGameContract0180) GetGameMetadata(ctx context.Context, block rpcblock.Block) (GameMetadata, error) {
+	defer f.metrics.StartContractRequest("GetGameMetadata")()
+	results, err := f.multiCaller.Call(ctx, block,
+		f.contract.Call(methodL1Head),
+		f.contract.Call(methodL2BlockNumber),
+		f.contract.Call(methodRootClaim),
+		f.contract.Call(methodStatus),
+		f.contract.Call(methodMaxClockDuration),
+	)
+	if err != nil {
+		return GameMetadata{}, fmt.Errorf("failed to retrieve game metadata: %w", err)
+	}
+	if len(results) != 5 {
+		return GameMetadata{}, fmt.Errorf("expected 5 results but got %v", len(results))
+	}
+	l1Head := results[0].GetHash(0)
+	l2BlockNumber := results[1].GetBigInt(0).Uint64()
+	rootClaim := results[2].GetHash(0)
+	status, err := gameTypes.GameStatusFromUint8(results[3].GetUint8(0))
+	if err != nil {
+		return GameMetadata{}, fmt.Errorf("failed to convert game status: %w", err)
+	}
+	duration := results[4].GetUint64(0)
+	return GameMetadata{
+		L1Head:                  l1Head,
+		L2BlockNum:              l2BlockNumber,
+		RootClaim:               rootClaim,
+		Status:                  status,
+		MaxClockDuration:        duration,
+		L2BlockNumberChallenged: false,
+	}, nil
+}
+
+func (f *FaultDisputeGameContract0180) IsL2BlockNumberChallenged(_ context.Context, _ rpcblock.Block) (bool, error) {
+	return false, nil
+}
+
+func (f *FaultDisputeGameContract0180) ChallengeL2BlockNumberTx(_ *types.InvalidL2BlockNumberChallenge) (txmgr.TxCandidate, error) {
+	return txmgr.TxCandidate{}, ErrChallengeL2BlockNotSupported
+}
+
+func (f *FaultDisputeGameContract0180) AttackTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error) {
+	call := f.contract.Call(methodAttack, big.NewInt(int64(parent.ContractIndex)), pivot)
+	return f.txWithBond(ctx, parent.Position.Attack(), call)
+}
+
+func (f *FaultDisputeGameContract0180) DefendTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error) {
+	call := f.contract.Call(methodDefend, big.NewInt(int64(parent.ContractIndex)), pivot)
+	return f.txWithBond(ctx, parent.Position.Defend(), call)
+}
diff --git a/op-challenger/game/fault/contracts/faultdisputegame080.go b/op-challenger/game/fault/contracts/faultdisputegame080.go
new file mode 100644
index 000000000000..eb7d707e3d71
--- /dev/null
+++ b/op-challenger/game/fault/contracts/faultdisputegame080.go
@@ -0,0 +1,159 @@
+package contracts
+
+import (
+	"context"
+	_ "embed"
+	"fmt"
+	"math/big"
+	"time"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	"github.com/ethereum-optimism/optimism/op-service/txmgr"
+	"github.com/ethereum/go-ethereum/common"
+)
+
+//go:embed abis/FaultDisputeGame-0.8.0.json
+var faultDisputeGameAbi020 []byte
+
+var resolvedBondAmount = new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 128), big.NewInt(1))
+
+var (
+	methodGameDuration = "gameDuration"
+)
+
+type FaultDisputeGameContract080 struct {
+	FaultDisputeGameContractLatest
+}
+
+// GetGameMetadata returns the game's L1 head, L2 block number, root claim, status, and max clock duration.
+func (f *FaultDisputeGameContract080) GetGameMetadata(ctx context.Context, block rpcblock.Block) (GameMetadata, error) {
+	defer f.metrics.StartContractRequest("GetGameMetadata")()
+	results, err := f.multiCaller.Call(ctx, block,
+		f.contract.Call(methodL1Head),
+		f.contract.Call(methodL2BlockNumber),
+		f.contract.Call(methodRootClaim),
+		f.contract.Call(methodStatus),
+		f.contract.Call(methodGameDuration))
+	if err != nil {
+		return GameMetadata{}, fmt.Errorf("failed to retrieve game metadata: %w", err)
+	}
+	if len(results) != 5 {
+		return GameMetadata{}, fmt.Errorf("expected 5 results but got %v", len(results))
+	}
+	l1Head := results[0].GetHash(0)
+	l2BlockNumber := results[1].GetBigInt(0).Uint64()
+	rootClaim := results[2].GetHash(0)
+	status, err := gameTypes.GameStatusFromUint8(results[3].GetUint8(0))
+	if err != nil {
+		return GameMetadata{}, fmt.Errorf("failed to convert game status: %w", err)
+	}
+	duration := results[4].GetUint64(0)
+	return GameMetadata{
+		L1Head:                  l1Head,
+		L2BlockNum:              l2BlockNumber,
+		RootClaim:               rootClaim,
+		Status:                  status,
+		MaxClockDuration:        duration / 2,
+		L2BlockNumberChallenged: false,
+	}, nil
+}
+
+func (f *FaultDisputeGameContract080) GetMaxClockDuration(ctx context.Context) (time.Duration, error) {
+	defer f.metrics.StartContractRequest("GetMaxClockDuration")()
+	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodGameDuration))
+	if err != nil {
+		return 0, fmt.Errorf("failed to fetch game duration: %w", err)
+	}
+	return time.Duration(result.GetUint64(0)) * time.Second / 2, nil
+}
+
+func (f *FaultDisputeGameContract080) GetClaim(ctx context.Context, idx uint64) (types.Claim, error) {
+	claim, err := f.FaultDisputeGameContractLatest.GetClaim(ctx, idx)
+	if err != nil {
+		return types.Claim{}, err
+	}
+	// Replace the resolved sentinel with what the bond would have been
+	if claim.Bond.Cmp(resolvedBondAmount) == 0 {
+		bond, err := f.GetRequiredBond(ctx, claim.Position)
+		if err != nil {
+			return types.Claim{}, err
+		}
+		claim.Bond = bond
+	}
+	return claim, nil
+}
+
+func (f *FaultDisputeGameContract080) GetAllClaims(ctx context.Context, block rpcblock.Block) ([]types.Claim, error) {
+	claims, err := f.FaultDisputeGameContractLatest.GetAllClaims(ctx, block)
+	if err != nil {
+		return nil, err
+	}
+	resolvedClaims := make([]*types.Claim, 0, len(claims))
+	positions := make([]*big.Int, 0, len(claims))
+	for i, claim := range claims {
+		if claim.Bond.Cmp(resolvedBondAmount) == 0 {
+			resolvedClaims = append(resolvedClaims, &claims[i])
+			positions = append(positions, claim.Position.ToGIndex())
+		}
+	}
+	bonds, err := f.GetRequiredBonds(ctx, block, positions...)
+	if err != nil {
+		return nil, fmt.Errorf("failed to get required bonds for resolved claims: %w", err)
+	}
+	for i, bond := range bonds {
+		resolvedClaims[i].Bond = bond
+	}
+	return claims, nil
+}
+
+func (f *FaultDisputeGameContract080) IsResolved(ctx context.Context, block rpcblock.Block, claims ...types.Claim) ([]bool, error) {
+	rawClaims, err := f.FaultDisputeGameContractLatest.GetAllClaims(ctx, block)
+	if err != nil {
+		return nil, fmt.Errorf("failed to get raw claim data: %w", err)
+	}
+	results := make([]bool, len(claims))
+	for i, claim := range claims {
+		results[i] = rawClaims[claim.ContractIndex].Bond.Cmp(resolvedBondAmount) == 0
+	}
+	return results, nil
+}
+
+func (f *FaultDisputeGameContract080) CallResolveClaim(ctx context.Context, claimIdx uint64) error {
+	defer f.metrics.StartContractRequest("CallResolveClaim")()
+	call := f.resolveClaimCall(claimIdx)
+	_, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, call)
+	if err != nil {
+		return fmt.Errorf("failed to call resolve claim: %w", err)
+	}
+	return nil
+}
+
+func (f *FaultDisputeGameContract080) ResolveClaimTx(claimIdx uint64) (txmgr.TxCandidate, error) {
+	call := f.resolveClaimCall(claimIdx)
+	return call.ToTxCandidate()
+}
+
+func (f *FaultDisputeGameContract080) resolveClaimCall(claimIdx uint64) *batching.ContractCall {
+	return f.contract.Call(methodResolveClaim, new(big.Int).SetUint64(claimIdx))
+}
+
+func (f *FaultDisputeGameContract080) IsL2BlockNumberChallenged(_ context.Context, _ rpcblock.Block) (bool, error) {
+	return false, nil
+}
+
+func (f *FaultDisputeGameContract080) ChallengeL2BlockNumberTx(_ *types.InvalidL2BlockNumberChallenge) (txmgr.TxCandidate, error) {
+	return txmgr.TxCandidate{}, ErrChallengeL2BlockNotSupported
+}
+
+func (f *FaultDisputeGameContract080) AttackTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error) {
+	call := f.contract.Call(methodAttack, big.NewInt(int64(parent.ContractIndex)), pivot)
+	return f.txWithBond(ctx, parent.Position.Attack(), call)
+}
+
+func (f *FaultDisputeGameContract080) DefendTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error) {
+	call := f.contract.Call(methodDefend, big.NewInt(int64(parent.ContractIndex)), pivot)
+	return f.txWithBond(ctx, parent.Position.Defend(), call)
+}
diff --git a/op-challenger/game/fault/contracts/faultdisputegame111.go b/op-challenger/game/fault/contracts/faultdisputegame111.go
new file mode 100644
index 000000000000..6e46bfdc1230
--- /dev/null
+++ b/op-challenger/game/fault/contracts/faultdisputegame111.go
@@ -0,0 +1,28 @@
+package contracts
+
+import (
+	"context"
+	_ "embed"
+	"math/big"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum-optimism/optimism/op-service/txmgr"
+	"github.com/ethereum/go-ethereum/common"
+)
+
+//go:embed abis/FaultDisputeGame-1.1.1.json
+var faultDisputeGameAbi111 []byte
+
+type FaultDisputeGameContract111 struct {
+	FaultDisputeGameContractLatest
+}
+
+func (f *FaultDisputeGameContract111) AttackTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error) {
+	call := f.contract.Call(methodAttack, big.NewInt(int64(parent.ContractIndex)), pivot)
+	return f.txWithBond(ctx, parent.Position.Attack(), call)
+}
+
+func (f *FaultDisputeGameContract111) DefendTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error) {
+	call := f.contract.Call(methodDefend, big.NewInt(int64(parent.ContractIndex)), pivot)
+	return f.txWithBond(ctx, parent.Position.Defend(), call)
+}
diff --git a/op-challenger/game/fault/contracts/faultdisputegame_test.go b/op-challenger/game/fault/contracts/faultdisputegame_test.go
index 4636af044cce..4ea7d9c3d0bf 100644
--- a/op-challenger/game/fault/contracts/faultdisputegame_test.go
+++ b/op-challenger/game/fault/contracts/faultdisputegame_test.go
@@ -2,17 +2,28 @@ package contracts
 
 import (
 	"context"
+	"errors"
+	"fmt"
 	"math"
 	"math/big"
+	"math/rand"
+	"slices"
 	"testing"
+	"time"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	batchingTest "github.com/ethereum-optimism/optimism/op-service/sources/batching/test"
+	"github.com/ethereum-optimism/optimism/op-service/testutils"
+	"github.com/ethereum-optimism/optimism/op-service/txmgr"
+	"github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots"
+	"github.com/ethereum/go-ethereum/accounts/abi"
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/rlp"
 	"github.com/stretchr/testify/require"
 )
 
@@ -22,6 +33,47 @@ var (
 	oracleAddr = common.HexToAddress("0x44442842371dFC380576ebb09Ae16Cb6B6ca4444")
 )
 
+type contractVersion struct {
+	version string
+	loadAbi func() *abi.ABI
+}
+
+func (c contractVersion) Is(versions ...string) bool {
+	return slices.Contains(versions, c.version)
+}
+
+const (
+	vers080    = "0.8.0"
+	vers0180   = "0.18.0"
+	vers111    = "1.1.1"
+	versLatest = "1.2.0"
+)
+
+var versions = []contractVersion{
+	{
+		version: vers080,
+		loadAbi: func() *abi.ABI {
+			return mustParseAbi(faultDisputeGameAbi020)
+		},
+	},
+	{
+		version: vers0180,
+		loadAbi: func() *abi.ABI {
+			return mustParseAbi(faultDisputeGameAbi0180)
+		},
+	},
+	{
+		version: vers111,
+		loadAbi: func() *abi.ABI {
+			return mustParseAbi(faultDisputeGameAbi111)
+		},
+	},
+	{
+		version: versLatest,
+		loadAbi: snapshots.LoadFaultDisputeGameABI,
+	},
+}
+
 func TestSimpleGetters(t *testing.T) {
 	tests := []struct {
 		methodAlias string
@@ -29,22 +81,39 @@ func TestSimpleGetters(t *testing.T) {
 		args        []interface{}
 		result      interface{}
 		expected    interface{} // Defaults to expecting the same as result
-		call        func(game *FaultDisputeGameContract) (any, error)
+		call        func(game FaultDisputeGameContract) (any, error)
+		applies     func(version contractVersion) bool
 	}{
 		{
 			methodAlias: "status",
 			method:      methodStatus,
 			result:      types.GameStatusChallengerWon,
-			call: func(game *FaultDisputeGameContract) (any, error) {
+			call: func(game FaultDisputeGameContract) (any, error) {
 				return game.GetStatus(context.Background())
 			},
 		},
+		{
+			methodAlias: "maxClockDuration",
+			method:      methodMaxClockDuration,
+			result:      uint64(5566),
+			expected:    5566 * time.Second,
+			call: func(game FaultDisputeGameContract) (any, error) {
+				return game.GetMaxClockDuration(context.Background())
+			},
+			applies: func(version contractVersion) bool {
+				return version.version != vers080
+			},
+		},
 		{
 			methodAlias: "gameDuration",
 			method:      methodGameDuration,
-			result:      uint64(5566),
-			call: func(game *FaultDisputeGameContract) (any, error) {
-				return game.GetGameDuration(context.Background())
+			result:      uint64(5566) * 2,
+			expected:    5566 * time.Second,
+			call: func(game FaultDisputeGameContract) (any, error) {
+				return game.GetMaxClockDuration(context.Background())
+			},
+			applies: func(version contractVersion) bool {
+				return version.version == vers080
 			},
 		},
 		{
@@ -52,7 +121,7 @@ func TestSimpleGetters(t *testing.T) {
 			method:      methodMaxGameDepth,
 			result:      big.NewInt(128),
 			expected:    faultTypes.Depth(128),
-			call: func(game *FaultDisputeGameContract) (any, error) {
+			call: func(game FaultDisputeGameContract) (any, error) {
 				return game.GetMaxGameDepth(context.Background())
 			},
 		},
@@ -60,7 +129,7 @@ func TestSimpleGetters(t *testing.T) {
 			methodAlias: "absolutePrestate",
 			method:      methodAbsolutePrestate,
 			result:      common.Hash{0xab},
-			call: func(game *FaultDisputeGameContract) (any, error) {
+			call: func(game FaultDisputeGameContract) (any, error) {
 				return game.GetAbsolutePrestateHash(context.Background())
 			},
 		},
@@ -69,7 +138,7 @@ func TestSimpleGetters(t *testing.T) {
 			method:      methodClaimCount,
 			result:      big.NewInt(9876),
 			expected:    uint64(9876),
-			call: func(game *FaultDisputeGameContract) (any, error) {
+			call: func(game FaultDisputeGameContract) (any, error) {
 				return game.GetClaimCount(context.Background())
 			},
 		},
@@ -77,7 +146,7 @@ func TestSimpleGetters(t *testing.T) {
 			methodAlias: "l1Head",
 			method:      methodL1Head,
 			result:      common.Hash{0xdd, 0xbb},
-			call: func(game *FaultDisputeGameContract) (any, error) {
+			call: func(game FaultDisputeGameContract) (any, error) {
 				return game.GetL1Head(context.Background())
 			},
 		},
@@ -85,213 +154,295 @@ func TestSimpleGetters(t *testing.T) {
 			methodAlias: "resolve",
 			method:      methodResolve,
 			result:      types.GameStatusInProgress,
-			call: func(game *FaultDisputeGameContract) (any, error) {
+			call: func(game FaultDisputeGameContract) (any, error) {
 				return game.CallResolve(context.Background())
 			},
 		},
 	}
-	for _, test := range tests {
-		test := test
-		t.Run(test.methodAlias, func(t *testing.T) {
-			stubRpc, game := setupFaultDisputeGameTest(t)
-			stubRpc.SetResponse(fdgAddr, test.method, rpcblock.Latest, nil, []interface{}{test.result})
-			status, err := test.call(game)
-			require.NoError(t, err)
-			expected := test.expected
-			if expected == nil {
-				expected = test.result
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			for _, test := range tests {
+				test := test
+				t.Run(test.methodAlias, func(t *testing.T) {
+					if test.applies != nil && !test.applies(version) {
+						t.Skip("Skipping for this version")
+					}
+					stubRpc, game := setupFaultDisputeGameTest(t, version)
+					stubRpc.SetResponse(fdgAddr, test.method, rpcblock.Latest, nil, []interface{}{test.result})
+					status, err := test.call(game)
+					require.NoError(t, err)
+					expected := test.expected
+					if expected == nil {
+						expected = test.result
+					}
+					require.Equal(t, expected, status)
+				})
 			}
-			require.Equal(t, expected, status)
 		})
 	}
 }
 
 func TestClock_EncodingDecoding(t *testing.T) {
 	t.Run("DurationAndTimestamp", func(t *testing.T) {
-		by := common.Hex2Bytes("00000000000000050000000000000002")
+		by := common.FromHex("00000000000000050000000000000002")
 		encoded := new(big.Int).SetBytes(by)
 		clock := decodeClock(encoded)
-		require.Equal(t, uint64(5), clock.Duration)
-		require.Equal(t, uint64(2), clock.Timestamp)
+		require.Equal(t, 5*time.Second, clock.Duration)
+		require.Equal(t, time.Unix(2, 0), clock.Timestamp)
 		require.Equal(t, encoded, packClock(clock))
 	})
 
 	t.Run("ZeroDuration", func(t *testing.T) {
-		by := common.Hex2Bytes("00000000000000000000000000000002")
+		by := common.FromHex("00000000000000000000000000000002")
 		encoded := new(big.Int).SetBytes(by)
 		clock := decodeClock(encoded)
-		require.Equal(t, uint64(0), clock.Duration)
-		require.Equal(t, uint64(2), clock.Timestamp)
+		require.Equal(t, 0*time.Second, clock.Duration)
+		require.Equal(t, time.Unix(2, 0), clock.Timestamp)
 		require.Equal(t, encoded, packClock(clock))
 	})
 
 	t.Run("ZeroTimestamp", func(t *testing.T) {
-		by := common.Hex2Bytes("00000000000000050000000000000000")
+		by := common.FromHex("00000000000000050000000000000000")
 		encoded := new(big.Int).SetBytes(by)
 		clock := decodeClock(encoded)
-		require.Equal(t, uint64(5), clock.Duration)
-		require.Equal(t, uint64(0), clock.Timestamp)
+		require.Equal(t, 5*time.Second, clock.Duration)
+		require.Equal(t, time.Unix(0, 0), clock.Timestamp)
 		require.Equal(t, encoded, packClock(clock))
 	})
 
 	t.Run("ZeroClock", func(t *testing.T) {
-		by := common.Hex2Bytes("00000000000000000000000000000000")
+		by := common.FromHex("00000000000000000000000000000000")
 		encoded := new(big.Int).SetBytes(by)
 		clock := decodeClock(encoded)
-		require.Equal(t, uint64(0), clock.Duration)
-		require.Equal(t, uint64(0), clock.Timestamp)
+		require.Equal(t, 0*time.Second, clock.Duration)
+		require.Equal(t, time.Unix(0, 0), clock.Timestamp)
 		require.Equal(t, encoded.Uint64(), packClock(clock).Uint64())
 	})
 }
 
 func TestGetOracleAddr(t *testing.T) {
-	stubRpc, game := setupFaultDisputeGameTest(t)
-	stubRpc.SetResponse(fdgAddr, methodVM, rpcblock.Latest, nil, []interface{}{vmAddr})
-	stubRpc.SetResponse(vmAddr, methodOracle, rpcblock.Latest, nil, []interface{}{oracleAddr})
-
-	actual, err := game.GetOracle(context.Background())
-	require.NoError(t, err)
-	require.Equal(t, oracleAddr, actual.Addr())
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			stubRpc.SetResponse(fdgAddr, methodVM, rpcblock.Latest, nil, []interface{}{vmAddr})
+			stubRpc.SetResponse(vmAddr, methodOracle, rpcblock.Latest, nil, []interface{}{oracleAddr})
+
+			actual, err := game.GetOracle(context.Background())
+			require.NoError(t, err)
+			require.Equal(t, oracleAddr, actual.Addr())
+		})
+	}
 }
 
 func TestGetClaim(t *testing.T) {
-	stubRpc, game := setupFaultDisputeGameTest(t)
-	idx := big.NewInt(2)
-	parentIndex := uint32(1)
-	counteredBy := common.Address{0x01}
-	claimant := common.Address{0x02}
-	bond := big.NewInt(5)
-	value := common.Hash{0xab}
-	position := big.NewInt(2)
-	clock := big.NewInt(1234)
-	stubRpc.SetResponse(fdgAddr, methodClaim, rpcblock.Latest, []interface{}{idx}, []interface{}{parentIndex, counteredBy, claimant, bond, value, position, clock})
-	status, err := game.GetClaim(context.Background(), idx.Uint64())
-	require.NoError(t, err)
-	require.Equal(t, faultTypes.Claim{
-		ClaimData: faultTypes.ClaimData{
-			Value:    value,
-			Position: faultTypes.NewPositionFromGIndex(position),
-			Bond:     bond,
-		},
-		CounteredBy:         counteredBy,
-		Claimant:            claimant,
-		Clock:               decodeClock(big.NewInt(1234)),
-		ContractIndex:       int(idx.Uint64()),
-		ParentContractIndex: 1,
-	}, status)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			idx := big.NewInt(2)
+			parentIndex := uint32(1)
+			counteredBy := common.Address{0x01}
+			claimant := common.Address{0x02}
+			bond := big.NewInt(5)
+			value := common.Hash{0xab}
+			position := big.NewInt(2)
+			clock := big.NewInt(1234)
+			stubRpc.SetResponse(fdgAddr, methodClaim, rpcblock.Latest, []interface{}{idx}, []interface{}{parentIndex, counteredBy, claimant, bond, value, position, clock})
+			status, err := game.GetClaim(context.Background(), idx.Uint64())
+			require.NoError(t, err)
+			require.Equal(t, faultTypes.Claim{
+				ClaimData: faultTypes.ClaimData{
+					Value:    value,
+					Position: faultTypes.NewPositionFromGIndex(position),
+					Bond:     bond,
+				},
+				CounteredBy:         counteredBy,
+				Claimant:            claimant,
+				Clock:               decodeClock(big.NewInt(1234)),
+				ContractIndex:       int(idx.Uint64()),
+				ParentContractIndex: 1,
+			}, status)
+		})
+	}
 }
 
 func TestGetAllClaims(t *testing.T) {
-	stubRpc, game := setupFaultDisputeGameTest(t)
-	claim0 := faultTypes.Claim{
-		ClaimData: faultTypes.ClaimData{
-			Value:    common.Hash{0xaa},
-			Position: faultTypes.NewPositionFromGIndex(big.NewInt(1)),
-			Bond:     big.NewInt(5),
-		},
-		CounteredBy:         common.Address{0x01},
-		Claimant:            common.Address{0x02},
-		Clock:               decodeClock(big.NewInt(1234)),
-		ContractIndex:       0,
-		ParentContractIndex: math.MaxUint32,
-	}
-	claim1 := faultTypes.Claim{
-		ClaimData: faultTypes.ClaimData{
-			Value:    common.Hash{0xab},
-			Position: faultTypes.NewPositionFromGIndex(big.NewInt(2)),
-			Bond:     big.NewInt(5),
-		},
-		CounteredBy:         common.Address{0x02},
-		Claimant:            common.Address{0x01},
-		Clock:               decodeClock(big.NewInt(4455)),
-		ContractIndex:       1,
-		ParentContractIndex: 0,
-	}
-	claim2 := faultTypes.Claim{
-		ClaimData: faultTypes.ClaimData{
-			Value:    common.Hash{0xbb},
-			Position: faultTypes.NewPositionFromGIndex(big.NewInt(6)),
-			Bond:     big.NewInt(5),
-		},
-		Claimant:            common.Address{0x02},
-		Clock:               decodeClock(big.NewInt(7777)),
-		ContractIndex:       2,
-		ParentContractIndex: 1,
-	}
-	expectedClaims := []faultTypes.Claim{claim0, claim1, claim2}
-	block := rpcblock.ByNumber(42)
-	stubRpc.SetResponse(fdgAddr, methodClaimCount, block, nil, []interface{}{big.NewInt(int64(len(expectedClaims)))})
-	for _, claim := range expectedClaims {
-		expectGetClaim(stubRpc, block, claim)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			claim0 := faultTypes.Claim{
+				ClaimData: faultTypes.ClaimData{
+					Value:    common.Hash{0xaa},
+					Position: faultTypes.NewPositionFromGIndex(big.NewInt(1)),
+					Bond:     big.NewInt(5),
+				},
+				CounteredBy:         common.Address{0x01},
+				Claimant:            common.Address{0x02},
+				Clock:               decodeClock(big.NewInt(1234)),
+				ContractIndex:       0,
+				ParentContractIndex: math.MaxUint32,
+			}
+			claim1 := faultTypes.Claim{
+				ClaimData: faultTypes.ClaimData{
+					Value:    common.Hash{0xab},
+					Position: faultTypes.NewPositionFromGIndex(big.NewInt(2)),
+					Bond:     big.NewInt(5),
+				},
+				CounteredBy:         common.Address{0x02},
+				Claimant:            common.Address{0x01},
+				Clock:               decodeClock(big.NewInt(4455)),
+				ContractIndex:       1,
+				ParentContractIndex: 0,
+			}
+			claim2 := faultTypes.Claim{
+				ClaimData: faultTypes.ClaimData{
+					Value:    common.Hash{0xbb},
+					Position: faultTypes.NewPositionFromGIndex(big.NewInt(6)),
+					Bond:     big.NewInt(5),
+				},
+				Claimant:            common.Address{0x02},
+				Clock:               decodeClock(big.NewInt(7777)),
+				ContractIndex:       2,
+				ParentContractIndex: 1,
+			}
+			expectedClaims := []faultTypes.Claim{claim0, claim1, claim2}
+			block := rpcblock.ByNumber(42)
+			stubRpc.SetResponse(fdgAddr, methodClaimCount, block, nil, []interface{}{big.NewInt(int64(len(expectedClaims)))})
+			for _, claim := range expectedClaims {
+				expectGetClaim(stubRpc, block, claim)
+			}
+			claims, err := game.GetAllClaims(context.Background(), block)
+			require.NoError(t, err)
+			require.Equal(t, expectedClaims, claims)
+		})
 	}
-	claims, err := game.GetAllClaims(context.Background(), block)
-	require.NoError(t, err)
-	require.Equal(t, expectedClaims, claims)
 }
 
 func TestGetBalance(t *testing.T) {
-	wethAddr := common.Address{0x11, 0x55, 0x66}
-	balance := big.NewInt(9995877)
-	block := rpcblock.ByNumber(424)
-	stubRpc, game := setupFaultDisputeGameTest(t)
-	stubRpc.SetResponse(fdgAddr, methodWETH, block, nil, []interface{}{wethAddr})
-	stubRpc.AddExpectedCall(batchingTest.NewGetBalanceCall(wethAddr, block, balance))
-
-	actualBalance, actualAddr, err := game.GetBalance(context.Background(), block)
-	require.NoError(t, err)
-	require.Equal(t, wethAddr, actualAddr)
-	require.Truef(t, balance.Cmp(actualBalance) == 0, "Expected balance %v but was %v", balance, actualBalance)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			wethAddr := common.Address{0x11, 0x55, 0x66}
+			balance := big.NewInt(9995877)
+			block := rpcblock.ByNumber(424)
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			stubRpc.SetResponse(fdgAddr, methodWETH, block, nil, []interface{}{wethAddr})
+			stubRpc.AddExpectedCall(batchingTest.NewGetBalanceCall(wethAddr, block, balance))
+
+			actualBalance, actualAddr, err := game.GetBalance(context.Background(), block)
+			require.NoError(t, err)
+			require.Equal(t, wethAddr, actualAddr)
+			require.Truef(t, balance.Cmp(actualBalance) == 0, "Expected balance %v but was %v", balance, actualBalance)
+		})
+	}
 }
 
 func TestCallResolveClaim(t *testing.T) {
-	stubRpc, game := setupFaultDisputeGameTest(t)
-	stubRpc.SetResponse(fdgAddr, methodResolveClaim, rpcblock.Latest, []interface{}{big.NewInt(123)}, nil)
-	err := game.CallResolveClaim(context.Background(), 123)
-	require.NoError(t, err)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			if version.version == vers080 {
+				stubRpc.SetResponse(fdgAddr, methodResolveClaim, rpcblock.Latest, []interface{}{big.NewInt(123)}, nil)
+			} else {
+				stubRpc.SetResponse(fdgAddr, methodResolveClaim, rpcblock.Latest, []interface{}{big.NewInt(123), maxChildChecks}, nil)
+			}
+			err := game.CallResolveClaim(context.Background(), 123)
+			require.NoError(t, err)
+		})
+	}
 }
 
 func TestResolveClaimTxTest(t *testing.T) {
-	stubRpc, game := setupFaultDisputeGameTest(t)
-	stubRpc.SetResponse(fdgAddr, methodResolveClaim, rpcblock.Latest, []interface{}{big.NewInt(123)}, nil)
-	tx, err := game.ResolveClaimTx(123)
-	require.NoError(t, err)
-	stubRpc.VerifyTxCandidate(tx)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			if version.version == vers080 {
+				stubRpc.SetResponse(fdgAddr, methodResolveClaim, rpcblock.Latest, []interface{}{big.NewInt(123)}, nil)
+			} else {
+				stubRpc.SetResponse(fdgAddr, methodResolveClaim, rpcblock.Latest, []interface{}{big.NewInt(123), maxChildChecks}, nil)
+			}
+			tx, err := game.ResolveClaimTx(123)
+			require.NoError(t, err)
+			stubRpc.VerifyTxCandidate(tx)
+		})
+	}
 }
 
 func TestResolveTx(t *testing.T) {
-	stubRpc, game := setupFaultDisputeGameTest(t)
-	stubRpc.SetResponse(fdgAddr, methodResolve, rpcblock.Latest, nil, nil)
-	tx, err := game.ResolveTx()
-	require.NoError(t, err)
-	stubRpc.VerifyTxCandidate(tx)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			stubRpc.SetResponse(fdgAddr, methodResolve, rpcblock.Latest, nil, nil)
+			tx, err := game.ResolveTx()
+			require.NoError(t, err)
+			stubRpc.VerifyTxCandidate(tx)
+		})
+	}
 }
 
 func TestAttackTx(t *testing.T) {
-	stubRpc, game := setupFaultDisputeGameTest(t)
-	value := common.Hash{0xaa}
-	stubRpc.SetResponse(fdgAddr, methodAttack, rpcblock.Latest, []interface{}{big.NewInt(111), value}, nil)
-	tx, err := game.AttackTx(111, value)
-	require.NoError(t, err)
-	stubRpc.VerifyTxCandidate(tx)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			bond := big.NewInt(1044)
+			value := common.Hash{0xaa}
+			parent := faultTypes.Claim{ClaimData: faultTypes.ClaimData{Value: common.Hash{0xbb}}, ContractIndex: 111}
+			stubRpc.SetResponse(fdgAddr, methodRequiredBond, rpcblock.Latest, []interface{}{parent.Position.Attack().ToGIndex()}, []interface{}{bond})
+			if version.Is(vers080, vers0180, vers111) {
+				stubRpc.SetResponse(fdgAddr, methodAttack, rpcblock.Latest, []interface{}{big.NewInt(111), value}, nil)
+			} else {
+				stubRpc.SetResponse(fdgAddr, methodAttack, rpcblock.Latest, []interface{}{parent.Value, big.NewInt(111), value}, nil)
+			}
+			tx, err := game.AttackTx(context.Background(), parent, value)
+			require.NoError(t, err)
+			stubRpc.VerifyTxCandidate(tx)
+			require.Equal(t, bond, tx.Value)
+		})
+	}
 }
 
 func TestDefendTx(t *testing.T) {
-	stubRpc, game := setupFaultDisputeGameTest(t)
-	value := common.Hash{0xaa}
-	stubRpc.SetResponse(fdgAddr, methodDefend, rpcblock.Latest, []interface{}{big.NewInt(111), value}, nil)
-	tx, err := game.DefendTx(111, value)
-	require.NoError(t, err)
-	stubRpc.VerifyTxCandidate(tx)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			bond := big.NewInt(1044)
+			value := common.Hash{0xaa}
+			parent := faultTypes.Claim{ClaimData: faultTypes.ClaimData{Value: common.Hash{0xbb}}, ContractIndex: 111}
+			stubRpc.SetResponse(fdgAddr, methodRequiredBond, rpcblock.Latest, []interface{}{parent.Position.Defend().ToGIndex()}, []interface{}{bond})
+			if version.Is(vers080, vers0180, vers111) {
+				stubRpc.SetResponse(fdgAddr, methodDefend, rpcblock.Latest, []interface{}{big.NewInt(111), value}, nil)
+			} else {
+				stubRpc.SetResponse(fdgAddr, methodDefend, rpcblock.Latest, []interface{}{parent.Value, big.NewInt(111), value}, nil)
+			}
+			tx, err := game.DefendTx(context.Background(), parent, value)
+			require.NoError(t, err)
+			stubRpc.VerifyTxCandidate(tx)
+			require.Equal(t, bond, tx.Value)
+		})
+	}
 }
 
 func TestStepTx(t *testing.T) {
-	stubRpc, game := setupFaultDisputeGameTest(t)
-	stateData := []byte{1, 2, 3}
-	proofData := []byte{4, 5, 6, 7, 8, 9}
-	stubRpc.SetResponse(fdgAddr, methodStep, rpcblock.Latest, []interface{}{big.NewInt(111), true, stateData, proofData}, nil)
-	tx, err := game.StepTx(111, true, stateData, proofData)
-	require.NoError(t, err)
-	stubRpc.VerifyTxCandidate(tx)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			stateData := []byte{1, 2, 3}
+			proofData := []byte{4, 5, 6, 7, 8, 9}
+			stubRpc.SetResponse(fdgAddr, methodStep, rpcblock.Latest, []interface{}{big.NewInt(111), true, stateData, proofData}, nil)
+			tx, err := game.StepTx(111, true, stateData, proofData)
+			require.NoError(t, err)
+			stubRpc.VerifyTxCandidate(tx)
+		})
+	}
 }
 
 func expectGetClaim(stubRpc *batchingTest.AbiBasedRpc, block rpcblock.Block, claim faultTypes.Claim) {
@@ -312,136 +463,327 @@ func expectGetClaim(stubRpc *batchingTest.AbiBasedRpc, block rpcblock.Block, cla
 }
 
 func TestGetBlockRange(t *testing.T) {
-	stubRpc, contract := setupFaultDisputeGameTest(t)
-	expectedStart := uint64(65)
-	expectedEnd := uint64(102)
-	stubRpc.SetResponse(fdgAddr, methodGenesisBlockNumber, rpcblock.Latest, nil, []interface{}{new(big.Int).SetUint64(expectedStart)})
-	stubRpc.SetResponse(fdgAddr, methodL2BlockNumber, rpcblock.Latest, nil, []interface{}{new(big.Int).SetUint64(expectedEnd)})
-	start, end, err := contract.GetBlockRange(context.Background())
-	require.NoError(t, err)
-	require.Equal(t, expectedStart, start)
-	require.Equal(t, expectedEnd, end)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, contract := setupFaultDisputeGameTest(t, version)
+			expectedStart := uint64(65)
+			expectedEnd := uint64(102)
+			stubRpc.SetResponse(fdgAddr, methodStartingBlockNumber, rpcblock.Latest, nil, []interface{}{new(big.Int).SetUint64(expectedStart)})
+			stubRpc.SetResponse(fdgAddr, methodL2BlockNumber, rpcblock.Latest, nil, []interface{}{new(big.Int).SetUint64(expectedEnd)})
+			start, end, err := contract.GetBlockRange(context.Background())
+			require.NoError(t, err)
+			require.Equal(t, expectedStart, start)
+			require.Equal(t, expectedEnd, end)
+		})
+	}
 }
 
 func TestGetSplitDepth(t *testing.T) {
-	stubRpc, contract := setupFaultDisputeGameTest(t)
-	expectedSplitDepth := faultTypes.Depth(15)
-	stubRpc.SetResponse(fdgAddr, methodSplitDepth, rpcblock.Latest, nil, []interface{}{new(big.Int).SetUint64(uint64(expectedSplitDepth))})
-	splitDepth, err := contract.GetSplitDepth(context.Background())
-	require.NoError(t, err)
-	require.Equal(t, expectedSplitDepth, splitDepth)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, contract := setupFaultDisputeGameTest(t, version)
+			expectedSplitDepth := faultTypes.Depth(15)
+			stubRpc.SetResponse(fdgAddr, methodSplitDepth, rpcblock.Latest, nil, []interface{}{new(big.Int).SetUint64(uint64(expectedSplitDepth))})
+			splitDepth, err := contract.GetSplitDepth(context.Background())
+			require.NoError(t, err)
+			require.Equal(t, expectedSplitDepth, splitDepth)
+		})
+	}
 }
 
 func TestGetGameMetadata(t *testing.T) {
-	stubRpc, contract := setupFaultDisputeGameTest(t)
-	expectedL1Head := common.Hash{0x0a, 0x0b}
-	expectedL2BlockNumber := uint64(123)
-	expectedGameDuration := uint64(456)
-	expectedRootClaim := common.Hash{0x01, 0x02}
-	expectedStatus := types.GameStatusChallengerWon
-	block := rpcblock.ByNumber(889)
-	stubRpc.SetResponse(fdgAddr, methodL1Head, block, nil, []interface{}{expectedL1Head})
-	stubRpc.SetResponse(fdgAddr, methodL2BlockNumber, block, nil, []interface{}{new(big.Int).SetUint64(expectedL2BlockNumber)})
-	stubRpc.SetResponse(fdgAddr, methodRootClaim, block, nil, []interface{}{expectedRootClaim})
-	stubRpc.SetResponse(fdgAddr, methodStatus, block, nil, []interface{}{expectedStatus})
-	stubRpc.SetResponse(fdgAddr, methodGameDuration, block, nil, []interface{}{expectedGameDuration})
-	l1Head, l2BlockNumber, rootClaim, status, duration, err := contract.GetGameMetadata(context.Background(), block)
-	require.NoError(t, err)
-	require.Equal(t, expectedL1Head, l1Head)
-	require.Equal(t, expectedL2BlockNumber, l2BlockNumber)
-	require.Equal(t, expectedRootClaim, rootClaim)
-	require.Equal(t, expectedStatus, status)
-	require.Equal(t, expectedGameDuration, duration)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, contract := setupFaultDisputeGameTest(t, version)
+			expectedL1Head := common.Hash{0x0a, 0x0b}
+			expectedL2BlockNumber := uint64(123)
+			expectedMaxClockDuration := uint64(456)
+			expectedRootClaim := common.Hash{0x01, 0x02}
+			expectedStatus := types.GameStatusChallengerWon
+			expectedL2BlockNumberChallenged := true
+			expectedL2BlockNumberChallenger := common.Address{0xee}
+			block := rpcblock.ByNumber(889)
+			stubRpc.SetResponse(fdgAddr, methodL1Head, block, nil, []interface{}{expectedL1Head})
+			stubRpc.SetResponse(fdgAddr, methodL2BlockNumber, block, nil, []interface{}{new(big.Int).SetUint64(expectedL2BlockNumber)})
+			stubRpc.SetResponse(fdgAddr, methodRootClaim, block, nil, []interface{}{expectedRootClaim})
+			stubRpc.SetResponse(fdgAddr, methodStatus, block, nil, []interface{}{expectedStatus})
+			if version.version == vers080 {
+				expectedL2BlockNumberChallenged = false
+				expectedL2BlockNumberChallenger = common.Address{}
+				stubRpc.SetResponse(fdgAddr, methodGameDuration, block, nil, []interface{}{expectedMaxClockDuration * 2})
+			} else if version.version == vers0180 {
+				expectedL2BlockNumberChallenged = false
+				expectedL2BlockNumberChallenger = common.Address{}
+				stubRpc.SetResponse(fdgAddr, methodMaxClockDuration, block, nil, []interface{}{expectedMaxClockDuration})
+			} else {
+				stubRpc.SetResponse(fdgAddr, methodMaxClockDuration, block, nil, []interface{}{expectedMaxClockDuration})
+				stubRpc.SetResponse(fdgAddr, methodL2BlockNumberChallenged, block, nil, []interface{}{expectedL2BlockNumberChallenged})
+				stubRpc.SetResponse(fdgAddr, methodL2BlockNumberChallenger, block, nil, []interface{}{expectedL2BlockNumberChallenger})
+			}
+			actual, err := contract.GetGameMetadata(context.Background(), block)
+			expected := GameMetadata{
+				L1Head:                  expectedL1Head,
+				L2BlockNum:              expectedL2BlockNumber,
+				RootClaim:               expectedRootClaim,
+				Status:                  expectedStatus,
+				MaxClockDuration:        expectedMaxClockDuration,
+				L2BlockNumberChallenged: expectedL2BlockNumberChallenged,
+				L2BlockNumberChallenger: expectedL2BlockNumberChallenger,
+			}
+			require.NoError(t, err)
+			require.Equal(t, expected, actual)
+		})
+	}
 }
 
-func TestGetGenesisOutputRoot(t *testing.T) {
-	stubRpc, contract := setupFaultDisputeGameTest(t)
-	expectedOutputRoot := common.HexToHash("0x1234")
-	stubRpc.SetResponse(fdgAddr, methodGenesisOutputRoot, rpcblock.Latest, nil, []interface{}{expectedOutputRoot})
-	genesisOutputRoot, err := contract.GetGenesisOutputRoot(context.Background())
-	require.NoError(t, err)
-	require.Equal(t, expectedOutputRoot, genesisOutputRoot)
+func TestGetStartingRootHash(t *testing.T) {
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, contract := setupFaultDisputeGameTest(t, version)
+			expectedOutputRoot := common.HexToHash("0x1234")
+			stubRpc.SetResponse(fdgAddr, methodStartingRootHash, rpcblock.Latest, nil, []interface{}{expectedOutputRoot})
+			startingOutputRoot, err := contract.GetStartingRootHash(context.Background())
+			require.NoError(t, err)
+			require.Equal(t, expectedOutputRoot, startingOutputRoot)
+		})
+	}
 }
 
 func TestFaultDisputeGame_UpdateOracleTx(t *testing.T) {
-	t.Run("Local", func(t *testing.T) {
-		stubRpc, game := setupFaultDisputeGameTest(t)
-		data := faultTypes.NewPreimageOracleData(common.Hash{0x01, 0xbc}.Bytes(), []byte{1, 2, 3, 4, 5, 6, 7}, 16)
-		claimIdx := uint64(6)
-		stubRpc.SetResponse(fdgAddr, methodAddLocalData, rpcblock.Latest, []interface{}{
-			data.GetIdent(),
-			new(big.Int).SetUint64(claimIdx),
-			new(big.Int).SetUint64(uint64(data.OracleOffset)),
-		}, nil)
-		tx, err := game.UpdateOracleTx(context.Background(), claimIdx, data)
-		require.NoError(t, err)
-		stubRpc.VerifyTxCandidate(tx)
-	})
-
-	t.Run("Global", func(t *testing.T) {
-		stubRpc, game := setupFaultDisputeGameTest(t)
-		data := faultTypes.NewPreimageOracleData(common.Hash{0x02, 0xbc}.Bytes(), []byte{1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15}, 16)
-		claimIdx := uint64(6)
-		stubRpc.SetResponse(fdgAddr, methodVM, rpcblock.Latest, nil, []interface{}{vmAddr})
-		stubRpc.SetResponse(vmAddr, methodOracle, rpcblock.Latest, nil, []interface{}{oracleAddr})
-		stubRpc.SetResponse(oracleAddr, methodLoadKeccak256PreimagePart, rpcblock.Latest, []interface{}{
-			new(big.Int).SetUint64(uint64(data.OracleOffset)),
-			data.GetPreimageWithoutSize(),
-		}, nil)
-		tx, err := game.UpdateOracleTx(context.Background(), claimIdx, data)
-		require.NoError(t, err)
-		stubRpc.VerifyTxCandidate(tx)
-	})
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			t.Run("Local", func(t *testing.T) {
+				stubRpc, game := setupFaultDisputeGameTest(t, version)
+				data := faultTypes.NewPreimageOracleData(common.Hash{0x01, 0xbc}.Bytes(), []byte{1, 2, 3, 4, 5, 6, 7}, 16)
+				claimIdx := uint64(6)
+				stubRpc.SetResponse(fdgAddr, methodAddLocalData, rpcblock.Latest, []interface{}{
+					data.GetIdent(),
+					new(big.Int).SetUint64(claimIdx),
+					new(big.Int).SetUint64(uint64(data.OracleOffset)),
+				}, nil)
+				tx, err := game.UpdateOracleTx(context.Background(), claimIdx, data)
+				require.NoError(t, err)
+				stubRpc.VerifyTxCandidate(tx)
+			})
+
+			t.Run("Global", func(t *testing.T) {
+				stubRpc, game := setupFaultDisputeGameTest(t, version)
+				data := faultTypes.NewPreimageOracleData(common.Hash{0x02, 0xbc}.Bytes(), []byte{1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15}, 16)
+				claimIdx := uint64(6)
+				stubRpc.SetResponse(fdgAddr, methodVM, rpcblock.Latest, nil, []interface{}{vmAddr})
+				stubRpc.SetResponse(vmAddr, methodOracle, rpcblock.Latest, nil, []interface{}{oracleAddr})
+				stubRpc.SetResponse(oracleAddr, methodLoadKeccak256PreimagePart, rpcblock.Latest, []interface{}{
+					new(big.Int).SetUint64(uint64(data.OracleOffset)),
+					data.GetPreimageWithoutSize(),
+				}, nil)
+				tx, err := game.UpdateOracleTx(context.Background(), claimIdx, data)
+				require.NoError(t, err)
+				stubRpc.VerifyTxCandidate(tx)
+			})
+		})
+	}
 }
 
 func TestFaultDisputeGame_GetCredit(t *testing.T) {
-	stubRpc, game := setupFaultDisputeGameTest(t)
-	addr := common.Address{0x01}
-	expectedCredit := big.NewInt(4284)
-	expectedStatus := types.GameStatusChallengerWon
-	stubRpc.SetResponse(fdgAddr, methodCredit, rpcblock.Latest, []interface{}{addr}, []interface{}{expectedCredit})
-	stubRpc.SetResponse(fdgAddr, methodStatus, rpcblock.Latest, nil, []interface{}{expectedStatus})
-
-	actualCredit, actualStatus, err := game.GetCredit(context.Background(), addr)
-	require.NoError(t, err)
-	require.Equal(t, expectedCredit, actualCredit)
-	require.Equal(t, expectedStatus, actualStatus)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			addr := common.Address{0x01}
+			expectedCredit := big.NewInt(4284)
+			expectedStatus := types.GameStatusChallengerWon
+			stubRpc.SetResponse(fdgAddr, methodCredit, rpcblock.Latest, []interface{}{addr}, []interface{}{expectedCredit})
+			stubRpc.SetResponse(fdgAddr, methodStatus, rpcblock.Latest, nil, []interface{}{expectedStatus})
+
+			actualCredit, actualStatus, err := game.GetCredit(context.Background(), addr)
+			require.NoError(t, err)
+			require.Equal(t, expectedCredit, actualCredit)
+			require.Equal(t, expectedStatus, actualStatus)
+		})
+	}
 }
 
 func TestFaultDisputeGame_GetCredits(t *testing.T) {
-	stubRpc, game := setupFaultDisputeGameTest(t)
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
 
-	block := rpcblock.ByNumber(482)
+			block := rpcblock.ByNumber(482)
 
-	addrs := []common.Address{{0x01}, {0x02}, {0x03}}
-	expected := []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(0)}
+			addrs := []common.Address{{0x01}, {0x02}, {0x03}}
+			expected := []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(0)}
 
-	for i, addr := range addrs {
-		stubRpc.SetResponse(fdgAddr, methodCredit, block, []interface{}{addr}, []interface{}{expected[i]})
+			for i, addr := range addrs {
+				stubRpc.SetResponse(fdgAddr, methodCredit, block, []interface{}{addr}, []interface{}{expected[i]})
+			}
+
+			actual, err := game.GetCredits(context.Background(), block, addrs...)
+			require.NoError(t, err)
+			require.Equal(t, len(expected), len(actual))
+			for i := range expected {
+				require.Zerof(t, expected[i].Cmp(actual[i]), "expected: %v actual: %v", expected[i], actual[i])
+			}
+		})
 	}
+}
 
-	actual, err := game.GetCredits(context.Background(), block, addrs...)
-	require.NoError(t, err)
-	require.Equal(t, len(expected), len(actual))
-	for i := range expected {
-		require.Zerof(t, expected[i].Cmp(actual[i]), "expected: %v actual: %v", expected[i], actual[i])
+func TestFaultDisputeGame_ClaimCreditTx(t *testing.T) {
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			t.Run("Success", func(t *testing.T) {
+				stubRpc, game := setupFaultDisputeGameTest(t, version)
+				addr := common.Address{0xaa}
+
+				stubRpc.SetResponse(fdgAddr, methodClaimCredit, rpcblock.Latest, []interface{}{addr}, nil)
+				tx, err := game.ClaimCreditTx(context.Background(), addr)
+				require.NoError(t, err)
+				stubRpc.VerifyTxCandidate(tx)
+			})
+
+			t.Run("SimulationFails", func(t *testing.T) {
+				stubRpc, game := setupFaultDisputeGameTest(t, version)
+				addr := common.Address{0xaa}
+
+				stubRpc.SetError(fdgAddr, methodClaimCredit, rpcblock.Latest, []interface{}{addr}, errors.New("still locked"))
+				tx, err := game.ClaimCreditTx(context.Background(), addr)
+				require.ErrorIs(t, err, ErrSimulationFailed)
+				require.Equal(t, txmgr.TxCandidate{}, tx)
+			})
+		})
 	}
 }
 
-func setupFaultDisputeGameTest(t *testing.T) (*batchingTest.AbiBasedRpc, *FaultDisputeGameContract) {
-	fdgAbi, err := bindings.FaultDisputeGameMetaData.GetAbi()
-	require.NoError(t, err)
+func TestFaultDisputeGame_IsResolved(t *testing.T) {
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
 
-	vmAbi, err := bindings.MIPSMetaData.GetAbi()
-	require.NoError(t, err)
-	oracleAbi, err := bindings.PreimageOracleMetaData.GetAbi()
-	require.NoError(t, err)
+			block := rpcblock.ByNumber(482)
+
+			claims := []faultTypes.Claim{
+				{ContractIndex: 1},
+				{ContractIndex: 5},
+				{ContractIndex: 13},
+			}
+			claimIdxs := []*big.Int{big.NewInt(1), big.NewInt(5), big.NewInt(13)}
+			expected := []bool{false, true, true}
+
+			if version.version == vers080 {
+				claimCount := 14
+				stubRpc.SetResponse(fdgAddr, methodClaimCount, block, nil, []interface{}{big.NewInt(int64(claimCount))})
+				for idx := 0; idx < claimCount; idx++ {
+					bond := big.NewInt(42)
+					if idx == 5 || idx == 13 { // The two claims expected to be resolved
+						bond = resolvedBondAmount
+					}
+					expectGetClaim(stubRpc, block, faultTypes.Claim{
+						ContractIndex: idx,
+						ClaimData: faultTypes.ClaimData{
+							Bond: bond,
+						},
+					})
+				}
+			} else {
+				for i, idx := range claimIdxs {
+					stubRpc.SetResponse(fdgAddr, methodResolvedSubgames, block, []interface{}{idx}, []interface{}{expected[i]})
+				}
+			}
+
+			actual, err := game.IsResolved(context.Background(), block, claims...)
+			require.NoError(t, err)
+			require.Equal(t, len(expected), len(actual))
+			for i := range expected {
+				require.Equal(t, expected[i], actual[i])
+			}
+		})
+	}
+}
+
+func TestFaultDisputeGameContractLatest_IsL2BlockNumberChallenged(t *testing.T) {
+	for _, version := range versions {
+		version := version
+		for _, expected := range []bool{true, false} {
+			expected := expected
+			t.Run(fmt.Sprintf("%v-%v", version.version, expected), func(t *testing.T) {
+				block := rpcblock.ByHash(common.Hash{0x43})
+				stubRpc, game := setupFaultDisputeGameTest(t, version)
+				supportsL2BlockNumChallenge := version.version != vers080 && version.version != vers0180
+				if supportsL2BlockNumChallenge {
+					stubRpc.SetResponse(fdgAddr, methodL2BlockNumberChallenged, block, nil, []interface{}{expected})
+				} else if expected {
+					t.Skip("Can't have challenged L2 block number on this contract version")
+				}
+				challenged, err := game.IsL2BlockNumberChallenged(context.Background(), block)
+				require.NoError(t, err)
+				require.Equal(t, expected, challenged)
+			})
+		}
+	}
+}
+
+func TestFaultDisputeGameContractLatest_ChallengeL2BlockNumberTx(t *testing.T) {
+	for _, version := range versions {
+		version := version
+		t.Run(version.version, func(t *testing.T) {
+			rng := rand.New(rand.NewSource(0))
+			stubRpc, game := setupFaultDisputeGameTest(t, version)
+			challenge := &faultTypes.InvalidL2BlockNumberChallenge{
+				Output: ð.OutputResponse{
+					Version:               eth.Bytes32{},
+					OutputRoot:            eth.Bytes32{0xaa},
+					BlockRef:              eth.L2BlockRef{Hash: common.Hash{0xbb}},
+					WithdrawalStorageRoot: common.Hash{0xcc},
+					StateRoot:             common.Hash{0xdd},
+				},
+				Header: testutils.RandomHeader(rng),
+			}
+			supportsL2BlockNumChallenge := version.version != vers080 && version.version != vers0180
+			if supportsL2BlockNumChallenge {
+				headerRlp, err := rlp.EncodeToBytes(challenge.Header)
+				require.NoError(t, err)
+				stubRpc.SetResponse(fdgAddr, methodChallengeRootL2Block, rpcblock.Latest, []interface{}{
+					outputRootProof{
+						Version:                  challenge.Output.Version,
+						StateRoot:                challenge.Output.StateRoot,
+						MessagePasserStorageRoot: challenge.Output.WithdrawalStorageRoot,
+						LatestBlockhash:          challenge.Output.BlockRef.Hash,
+					},
+					headerRlp,
+				}, nil)
+			}
+			tx, err := game.ChallengeL2BlockNumberTx(challenge)
+			if supportsL2BlockNumChallenge {
+				require.NoError(t, err)
+				stubRpc.VerifyTxCandidate(tx)
+			} else {
+				require.ErrorIs(t, err, ErrChallengeL2BlockNotSupported)
+				require.Equal(t, txmgr.TxCandidate{}, tx)
+			}
+		})
+	}
+}
+
+func setupFaultDisputeGameTest(t *testing.T, version contractVersion) (*batchingTest.AbiBasedRpc, FaultDisputeGameContract) {
+	fdgAbi := version.loadAbi()
+
+	vmAbi := snapshots.LoadMIPSABI()
+	oracleAbi := snapshots.LoadPreimageOracleABI()
 
 	stubRpc := batchingTest.NewAbiBasedRpc(t, fdgAddr, fdgAbi)
 	stubRpc.AddContract(vmAddr, vmAbi)
 	stubRpc.AddContract(oracleAddr, oracleAbi)
 	caller := batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize)
-	game, err := NewFaultDisputeGameContract(fdgAddr, caller)
+
+	stubRpc.SetResponse(fdgAddr, methodVersion, rpcblock.Latest, nil, []interface{}{version.version})
+	game, err := NewFaultDisputeGameContract(context.Background(), contractMetrics.NoopContractMetrics, fdgAddr, caller)
 	require.NoError(t, err)
 	return stubRpc, game
 }
diff --git a/op-challenger/game/fault/contracts/gamefactory.go b/op-challenger/game/fault/contracts/gamefactory.go
index 346a0eea7390..d67a4688c422 100644
--- a/op-challenger/game/fault/contracts/gamefactory.go
+++ b/op-challenger/game/fault/contracts/gamefactory.go
@@ -2,42 +2,55 @@ package contracts
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"math/big"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
+	"github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots"
+	"github.com/ethereum/go-ethereum/accounts/abi"
 	"github.com/ethereum/go-ethereum/common"
+	ethTypes "github.com/ethereum/go-ethereum/core/types"
 )
 
 const (
 	methodGameCount   = "gameCount"
 	methodGameAtIndex = "gameAtIndex"
 	methodGameImpls   = "gameImpls"
+	methodInitBonds   = "initBonds"
 	methodCreateGame  = "create"
 	methodGames       = "games"
+
+	eventDisputeGameCreated = "DisputeGameCreated"
+)
+
+var (
+	ErrEventNotFound = errors.New("event not found")
 )
 
 type DisputeGameFactoryContract struct {
+	metrics     metrics.ContractMetricer
 	multiCaller *batching.MultiCaller
 	contract    *batching.BoundContract
+	abi         *abi.ABI
 }
 
-func NewDisputeGameFactoryContract(addr common.Address, caller *batching.MultiCaller) (*DisputeGameFactoryContract, error) {
-	factoryAbi, err := bindings.DisputeGameFactoryMetaData.GetAbi()
-	if err != nil {
-		return nil, fmt.Errorf("failed to load dispute game factory ABI: %w", err)
-	}
+func NewDisputeGameFactoryContract(m metrics.ContractMetricer, addr common.Address, caller *batching.MultiCaller) *DisputeGameFactoryContract {
+	factoryAbi := snapshots.LoadDisputeGameFactoryABI()
 	return &DisputeGameFactoryContract{
+		metrics:     m,
 		multiCaller: caller,
 		contract:    batching.NewBoundContract(factoryAbi, addr),
-	}, nil
+		abi:         factoryAbi,
+	}
 }
 
 func (f *DisputeGameFactoryContract) GetGameFromParameters(ctx context.Context, traceType uint32, outputRoot common.Hash, l2BlockNum uint64) (common.Address, error) {
+	defer f.metrics.StartContractRequest("GetGameFromParameters")()
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodGames, traceType, outputRoot, common.BigToHash(big.NewInt(int64(l2BlockNum))).Bytes()))
 	if err != nil {
 		return common.Address{}, fmt.Errorf("failed to fetch game from parameters: %w", err)
@@ -46,6 +59,7 @@ func (f *DisputeGameFactoryContract) GetGameFromParameters(ctx context.Context,
 }
 
 func (f *DisputeGameFactoryContract) GetGameCount(ctx context.Context, blockHash common.Hash) (uint64, error) {
+	defer f.metrics.StartContractRequest("GetGameCount")()
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.ByHash(blockHash), f.contract.Call(methodGameCount))
 	if err != nil {
 		return 0, fmt.Errorf("failed to load game count: %w", err)
@@ -54,14 +68,16 @@ func (f *DisputeGameFactoryContract) GetGameCount(ctx context.Context, blockHash
 }
 
 func (f *DisputeGameFactoryContract) GetGame(ctx context.Context, idx uint64, blockHash common.Hash) (types.GameMetadata, error) {
+	defer f.metrics.StartContractRequest("GetGame")()
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.ByHash(blockHash), f.contract.Call(methodGameAtIndex, new(big.Int).SetUint64(idx)))
 	if err != nil {
 		return types.GameMetadata{}, fmt.Errorf("failed to load game %v: %w", idx, err)
 	}
-	return f.decodeGame(result), nil
+	return f.decodeGame(idx, result), nil
 }
 
 func (f *DisputeGameFactoryContract) GetGameImpl(ctx context.Context, gameType uint32) (common.Address, error) {
+	defer f.metrics.StartContractRequest("GetGameImpl")()
 	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodGameImpls, gameType))
 	if err != nil {
 		return common.Address{}, fmt.Errorf("failed to load game impl for type %v: %w", gameType, err)
@@ -70,6 +86,7 @@ func (f *DisputeGameFactoryContract) GetGameImpl(ctx context.Context, gameType u
 }
 
 func (f *DisputeGameFactoryContract) GetGamesAtOrAfter(ctx context.Context, blockHash common.Hash, earliestTimestamp uint64) ([]types.GameMetadata, error) {
+	defer f.metrics.StartContractRequest("GetGamesAtOrAfter")()
 	count, err := f.GetGameCount(ctx, blockHash)
 	if err != nil {
 		return nil, err
@@ -101,8 +118,9 @@ func (f *DisputeGameFactoryContract) GetGamesAtOrAfter(ctx context.Context, bloc
 			return nil, fmt.Errorf("failed to fetch games: %w", err)
 		}
 
-		for _, result := range results {
-			game := f.decodeGame(result)
+		for i, result := range results {
+			idx := rangeEnd - uint64(i) - 1
+			game := f.decodeGame(idx, result)
 			if game.Timestamp < earliestTimestamp {
 				return games, nil
 			}
@@ -113,6 +131,7 @@ func (f *DisputeGameFactoryContract) GetGamesAtOrAfter(ctx context.Context, bloc
 }
 
 func (f *DisputeGameFactoryContract) GetAllGames(ctx context.Context, blockHash common.Hash) ([]types.GameMetadata, error) {
+	defer f.metrics.StartContractRequest("GetAllGames")()
 	count, err := f.GetGameCount(ctx, blockHash)
 	if err != nil {
 		return nil, err
@@ -129,22 +148,54 @@ func (f *DisputeGameFactoryContract) GetAllGames(ctx context.Context, blockHash
 	}
 
 	var games []types.GameMetadata
-	for _, result := range results {
-		games = append(games, f.decodeGame(result))
+	for i, result := range results {
+		games = append(games, f.decodeGame(uint64(i), result))
 	}
 	return games, nil
 }
 
-func (f *DisputeGameFactoryContract) CreateTx(traceType uint32, outputRoot common.Hash, l2BlockNum uint64) (txmgr.TxCandidate, error) {
+func (f *DisputeGameFactoryContract) CreateTx(ctx context.Context, traceType uint32, outputRoot common.Hash, l2BlockNum uint64) (txmgr.TxCandidate, error) {
+	result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodInitBonds, traceType))
+	if err != nil {
+		return txmgr.TxCandidate{}, fmt.Errorf("failed to fetch init bond: %w", err)
+	}
+	initBond := result.GetBigInt(0)
 	call := f.contract.Call(methodCreateGame, traceType, outputRoot, common.BigToHash(big.NewInt(int64(l2BlockNum))).Bytes())
-	return call.ToTxCandidate()
+	candidate, err := call.ToTxCandidate()
+	if err != nil {
+		return txmgr.TxCandidate{}, err
+	}
+	candidate.Value = initBond
+	return candidate, err
+}
+
+func (f *DisputeGameFactoryContract) DecodeDisputeGameCreatedLog(rcpt *ethTypes.Receipt) (common.Address, uint32, common.Hash, error) {
+	for _, log := range rcpt.Logs {
+		if log.Address != f.contract.Addr() {
+			// Not from this contract
+			continue
+		}
+		name, result, err := f.contract.DecodeEvent(log)
+		if err != nil {
+			// Not a valid event
+			continue
+		}
+		if name != eventDisputeGameCreated {
+			// Not the event we're looking for
+			continue
+		}
+
+		return result.GetAddress(0), result.GetUint32(1), result.GetHash(2), nil
+	}
+	return common.Address{}, 0, common.Hash{}, fmt.Errorf("%w: %v", ErrEventNotFound, eventDisputeGameCreated)
 }
 
-func (f *DisputeGameFactoryContract) decodeGame(result *batching.CallResult) types.GameMetadata {
+func (f *DisputeGameFactoryContract) decodeGame(idx uint64, result *batching.CallResult) types.GameMetadata {
 	gameType := result.GetUint32(0)
 	timestamp := result.GetUint64(1)
 	proxy := result.GetAddress(2)
 	return types.GameMetadata{
+		Index:     idx,
 		GameType:  gameType,
 		Timestamp: timestamp,
 		Proxy:     proxy,
diff --git a/op-challenger/game/fault/contracts/gamefactory_test.go b/op-challenger/game/fault/contracts/gamefactory_test.go
index f7f98760eebb..aa5af39b4fe4 100644
--- a/op-challenger/game/fault/contracts/gamefactory_test.go
+++ b/op-challenger/game/fault/contracts/gamefactory_test.go
@@ -7,12 +7,14 @@ import (
 	"slices"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	batchingTest "github.com/ethereum-optimism/optimism/op-service/sources/batching/test"
+	"github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots"
 	"github.com/ethereum/go-ethereum/common"
+	ethTypes "github.com/ethereum/go-ethereum/core/types"
 	"github.com/stretchr/testify/require"
 )
 
@@ -59,16 +61,19 @@ func TestLoadGame(t *testing.T) {
 	blockHash := common.Hash{0xbb, 0xce}
 	stubRpc, factory := setupDisputeGameFactoryTest(t)
 	game0 := types.GameMetadata{
+		Index:     0,
 		GameType:  0,
 		Timestamp: 1234,
 		Proxy:     common.Address{0xaa},
 	}
 	game1 := types.GameMetadata{
+		Index:     1,
 		GameType:  1,
 		Timestamp: 5678,
 		Proxy:     common.Address{0xbb},
 	}
 	game2 := types.GameMetadata{
+		Index:     2,
 		GameType:  99,
 		Timestamp: 9988,
 		Proxy:     common.Address{0xcc},
@@ -86,16 +91,19 @@ func TestGetAllGames(t *testing.T) {
 	blockHash := common.Hash{0xbb, 0xce}
 	stubRpc, factory := setupDisputeGameFactoryTest(t)
 	game0 := types.GameMetadata{
+		Index:     0,
 		GameType:  0,
 		Timestamp: 1234,
 		Proxy:     common.Address{0xaa},
 	}
 	game1 := types.GameMetadata{
+		Index:     1,
 		GameType:  1,
 		Timestamp: 5678,
 		Proxy:     common.Address{0xbb},
 	}
 	game2 := types.GameMetadata{
+		Index:     2,
 		GameType:  99,
 		Timestamp: 9988,
 		Proxy:     common.Address{0xcc},
@@ -133,6 +141,7 @@ func TestGetAllGamesAtOrAfter(t *testing.T) {
 			var allGames []types.GameMetadata
 			for i := 0; i < test.gameCount; i++ {
 				allGames = append(allGames, types.GameMetadata{
+					Index:     uint64(i),
 					GameType:  uint32(i),
 					Timestamp: uint64(i),
 					Proxy:     common.Address{byte(i)},
@@ -194,6 +203,73 @@ func TestGetGameImpl(t *testing.T) {
 	require.Equal(t, gameImplAddr, actual)
 }
 
+func TestDecodeDisputeGameCreatedLog(t *testing.T) {
+	_, factory := setupDisputeGameFactoryTest(t)
+	fdgAbi := snapshots.LoadDisputeGameFactoryABI()
+	eventAbi := fdgAbi.Events[eventDisputeGameCreated]
+	gameAddr := common.Address{0x11}
+	gameType := uint32(4)
+	rootClaim := common.Hash{0xaa, 0xbb, 0xcc}
+
+	createValidReceipt := func() *ethTypes.Receipt {
+		return ðTypes.Receipt{
+			Status:          ethTypes.ReceiptStatusSuccessful,
+			ContractAddress: fdgAddr,
+			Logs: []*ethTypes.Log{
+				{
+					Address: fdgAddr,
+					Topics: []common.Hash{
+						eventAbi.ID,
+						common.BytesToHash(gameAddr.Bytes()),
+						common.BytesToHash(big.NewInt(int64(gameType)).Bytes()),
+						rootClaim,
+					},
+				},
+			},
+		}
+	}
+
+	t.Run("IgnoreIncorrectContract", func(t *testing.T) {
+		rcpt := createValidReceipt()
+		rcpt.Logs[0].Address = common.Address{0xff}
+		_, _, _, err := factory.DecodeDisputeGameCreatedLog(rcpt)
+		require.ErrorIs(t, err, ErrEventNotFound)
+	})
+
+	t.Run("IgnoreInvalidEvent", func(t *testing.T) {
+		rcpt := createValidReceipt()
+		rcpt.Logs[0].Topics = rcpt.Logs[0].Topics[0:2]
+		_, _, _, err := factory.DecodeDisputeGameCreatedLog(rcpt)
+		require.ErrorIs(t, err, ErrEventNotFound)
+	})
+
+	t.Run("IgnoreWrongEvent", func(t *testing.T) {
+		rcpt := createValidReceipt()
+		rcpt.Logs[0].Topics = []common.Hash{
+			fdgAbi.Events["ImplementationSet"].ID,
+			common.BytesToHash(common.Address{0x11}.Bytes()), // Implementation addr
+			common.BytesToHash(big.NewInt(4).Bytes()),        // Game type
+
+		}
+		// Check the log is a valid ImplementationSet
+		name, _, err := factory.contract.DecodeEvent(rcpt.Logs[0])
+		require.NoError(t, err)
+		require.Equal(t, "ImplementationSet", name)
+
+		_, _, _, err = factory.DecodeDisputeGameCreatedLog(rcpt)
+		require.ErrorIs(t, err, ErrEventNotFound)
+	})
+
+	t.Run("ValidEvent", func(t *testing.T) {
+		rcpt := createValidReceipt()
+		actualGameAddr, actualGameType, actualRootClaim, err := factory.DecodeDisputeGameCreatedLog(rcpt)
+		require.NoError(t, err)
+		require.Equal(t, gameAddr, actualGameAddr)
+		require.Equal(t, gameType, actualGameType)
+		require.Equal(t, rootClaim, actualRootClaim)
+	})
+}
+
 func expectGetGame(stubRpc *batchingTest.AbiBasedRpc, idx int, blockHash common.Hash, game types.GameMetadata) {
 	stubRpc.SetResponse(
 		factoryAddr,
@@ -212,19 +288,21 @@ func TestCreateTx(t *testing.T) {
 	traceType := uint32(123)
 	outputRoot := common.Hash{0x01}
 	l2BlockNum := common.BigToHash(big.NewInt(456)).Bytes()
+	bond := big.NewInt(49284294829)
+	stubRpc.SetResponse(factoryAddr, methodInitBonds, rpcblock.Latest, []interface{}{traceType}, []interface{}{bond})
 	stubRpc.SetResponse(factoryAddr, methodCreateGame, rpcblock.Latest, []interface{}{traceType, outputRoot, l2BlockNum}, nil)
-	tx, err := factory.CreateTx(traceType, outputRoot, uint64(456))
+	tx, err := factory.CreateTx(context.Background(), traceType, outputRoot, uint64(456))
 	require.NoError(t, err)
 	stubRpc.VerifyTxCandidate(tx)
+	require.NotNil(t, tx.Value)
+	require.Truef(t, bond.Cmp(tx.Value) == 0, "Expected bond %v but was %v", bond, tx.Value)
 }
 
 func setupDisputeGameFactoryTest(t *testing.T) (*batchingTest.AbiBasedRpc, *DisputeGameFactoryContract) {
-	fdgAbi, err := bindings.DisputeGameFactoryMetaData.GetAbi()
-	require.NoError(t, err)
+	fdgAbi := snapshots.LoadDisputeGameFactoryABI()
 
 	stubRpc := batchingTest.NewAbiBasedRpc(t, factoryAddr, fdgAbi)
 	caller := batching.NewMultiCaller(stubRpc, batchSize)
-	factory, err := NewDisputeGameFactoryContract(factoryAddr, caller)
-	require.NoError(t, err)
+	factory := NewDisputeGameFactoryContract(metrics.NoopContractMetrics, factoryAddr, caller)
 	return stubRpc, factory
 }
diff --git a/op-challenger/game/fault/contracts/metrics/metrics.go b/op-challenger/game/fault/contracts/metrics/metrics.go
new file mode 100644
index 000000000000..9a47a0669517
--- /dev/null
+++ b/op-challenger/game/fault/contracts/metrics/metrics.go
@@ -0,0 +1,54 @@
+package metrics
+
+import (
+	"github.com/prometheus/client_golang/prometheus"
+)
+
+const ConstractSubsystem = "contracts"
+
+type EndTimer func()
+
+type Factory interface {
+	NewCounterVec(opts prometheus.CounterOpts, labelNames []string) *prometheus.CounterVec
+	NewHistogramVec(opts prometheus.HistogramOpts, labelNames []string) *prometheus.HistogramVec
+}
+
+type ContractMetricer interface {
+	StartContractRequest(name string) EndTimer
+}
+
+type ContractMetrics struct {
+	ContractRequestsTotal          *prometheus.CounterVec
+	ContractRequestDurationSeconds *prometheus.HistogramVec
+}
+
+var _ ContractMetricer = (*ContractMetrics)(nil)
+
+func MakeContractMetrics(ns string, factory Factory) *ContractMetrics {
+	return &ContractMetrics{
+		ContractRequestsTotal: factory.NewCounterVec(prometheus.CounterOpts{
+			Namespace: ns,
+			Subsystem: ConstractSubsystem,
+			Name:      "requests_total",
+			Help:      "Total requests to the contracts",
+		}, []string{
+			"method",
+		}),
+		ContractRequestDurationSeconds: factory.NewHistogramVec(prometheus.HistogramOpts{
+			Namespace: ns,
+			Subsystem: ConstractSubsystem,
+			Name:      "requests_duration_seconds",
+			Help:      "Histogram of contract request durations",
+		}, []string{
+			"method",
+		}),
+	}
+}
+
+func (m *ContractMetrics) StartContractRequest(method string) EndTimer {
+	m.ContractRequestsTotal.WithLabelValues(method).Inc()
+	timer := prometheus.NewTimer(m.ContractRequestDurationSeconds.WithLabelValues(method))
+	return func() {
+		timer.ObserveDuration()
+	}
+}
diff --git a/op-challenger/game/fault/contracts/metrics/noop.go b/op-challenger/game/fault/contracts/metrics/noop.go
new file mode 100644
index 000000000000..fae673e46d96
--- /dev/null
+++ b/op-challenger/game/fault/contracts/metrics/noop.go
@@ -0,0 +1,12 @@
+package metrics
+
+type NoopMetrics struct {
+}
+
+func (n *NoopMetrics) StartContractRequest(_ string) EndTimer {
+	return func() {}
+}
+
+var _ ContractMetricer = (*NoopMetrics)(nil)
+
+var NoopContractMetrics = &NoopMetrics{}
diff --git a/op-challenger/game/fault/contracts/oracle.go b/op-challenger/game/fault/contracts/oracle.go
index 4524034cffe9..be2520bef8b5 100644
--- a/op-challenger/game/fault/contracts/oracle.go
+++ b/op-challenger/game/fault/contracts/oracle.go
@@ -9,7 +9,6 @@ import (
 	"math/big"
 	"sync/atomic"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/keccak/merkle"
 	keccakTypes "github.com/ethereum-optimism/optimism/op-challenger/game/keccak/types"
@@ -17,6 +16,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
+	"github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots"
 	"github.com/ethereum/go-ethereum/common"
 )
 
@@ -48,6 +48,18 @@ var (
 	ErrUnsupportedKeyType   = errors.New("unsupported preimage key type")
 )
 
+// preimageOracleLeaf matches the contract representation of a large preimage leaf
+type preimageOracleLeaf struct {
+	Input           []byte
+	Index           *big.Int
+	StateCommitment [32]byte
+}
+
+// libKeccakStateMatrix matches the contract representation of a keccak state matrix
+type libKeccakStateMatrix struct {
+	State [25]uint64
+}
+
 // PreimageOracleContract is a binding that works with contracts implementing the IPreimageOracle interface
 type PreimageOracleContract struct {
 	addr        common.Address
@@ -62,26 +74,23 @@ type PreimageOracleContract struct {
 	minBondSizeLPP atomic.Uint64
 }
 
-// toPreimageOracleLeaf converts a Leaf to the contract [bindings.PreimageOracleLeaf] type.
-func toPreimageOracleLeaf(l keccakTypes.Leaf) bindings.PreimageOracleLeaf {
-	return bindings.PreimageOracleLeaf{
+// toPreimageOracleLeaf converts a Leaf to the contract format.
+func toPreimageOracleLeaf(l keccakTypes.Leaf) preimageOracleLeaf {
+	return preimageOracleLeaf{
 		Input:           l.Input[:],
 		Index:           new(big.Int).SetUint64(l.Index),
 		StateCommitment: l.StateCommitment,
 	}
 }
 
-func NewPreimageOracleContract(addr common.Address, caller *batching.MultiCaller) (*PreimageOracleContract, error) {
-	oracleAbi, err := bindings.PreimageOracleMetaData.GetAbi()
-	if err != nil {
-		return nil, fmt.Errorf("failed to load preimage oracle ABI: %w", err)
-	}
+func NewPreimageOracleContract(addr common.Address, caller *batching.MultiCaller) *PreimageOracleContract {
+	oracleAbi := snapshots.LoadPreimageOracleABI()
 
 	return &PreimageOracleContract{
 		addr:        addr,
 		multiCaller: caller,
 		contract:    batching.NewBoundContract(oracleAbi, addr),
-	}, nil
+	}
 }
 
 func (c *PreimageOracleContract) Addr() common.Address {
@@ -192,8 +201,8 @@ func (c *PreimageOracleContract) Squeeze(
 	return call.ToTxCandidate()
 }
 
-func abiEncodeSnapshot(packedState keccakTypes.StateSnapshot) bindings.LibKeccakStateMatrix {
-	return bindings.LibKeccakStateMatrix{State: packedState}
+func abiEncodeSnapshot(packedState keccakTypes.StateSnapshot) libKeccakStateMatrix {
+	return libKeccakStateMatrix{State: packedState}
 }
 
 func (c *PreimageOracleContract) GetActivePreimages(ctx context.Context, blockHash common.Hash) ([]keccakTypes.LargePreimageMetaData, error) {
diff --git a/op-challenger/game/fault/contracts/oracle_test.go b/op-challenger/game/fault/contracts/oracle_test.go
index 0a65b239aef4..480d738bd478 100644
--- a/op-challenger/game/fault/contracts/oracle_test.go
+++ b/op-challenger/game/fault/contracts/oracle_test.go
@@ -8,7 +8,6 @@ import (
 	"math/rand"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/keccak/merkle"
 	keccakTypes "github.com/ethereum-optimism/optimism/op-challenger/game/keccak/types"
@@ -17,6 +16,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	batchingTest "github.com/ethereum-optimism/optimism/op-service/sources/batching/test"
 	"github.com/ethereum-optimism/optimism/op-service/testutils"
+	"github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/stretchr/testify/require"
 )
@@ -355,12 +355,10 @@ func setupPreimageOracleTestWithProposals(t *testing.T, block rpcblock.Block) (*
 }
 
 func setupPreimageOracleTest(t *testing.T) (*batchingTest.AbiBasedRpc, *PreimageOracleContract) {
-	oracleAbi, err := bindings.PreimageOracleMetaData.GetAbi()
-	require.NoError(t, err)
+	oracleAbi := snapshots.LoadPreimageOracleABI()
 
 	stubRpc := batchingTest.NewAbiBasedRpc(t, oracleAddr, oracleAbi)
-	oracleContract, err := NewPreimageOracleContract(oracleAddr, batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize))
-	require.NoError(t, err)
+	oracleContract := NewPreimageOracleContract(oracleAddr, batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize))
 
 	return stubRpc, oracleContract
 }
@@ -593,7 +591,7 @@ func TestChallenge_First(t *testing.T) {
 	stubRpc.SetResponse(oracleAddr, methodChallengeFirstLPP, rpcblock.Latest,
 		[]interface{}{
 			ident.Claimant, ident.UUID,
-			bindings.PreimageOracleLeaf{
+			preimageOracleLeaf{
 				Input:           challenge.Poststate.Input[:],
 				Index:           new(big.Int).SetUint64(challenge.Poststate.Index),
 				StateCommitment: challenge.Poststate.StateCommitment,
@@ -631,14 +629,14 @@ func TestChallenge_NotFirst(t *testing.T) {
 	stubRpc.SetResponse(oracleAddr, methodChallengeLPP, rpcblock.Latest,
 		[]interface{}{
 			ident.Claimant, ident.UUID,
-			bindings.LibKeccakStateMatrix{State: challenge.StateMatrix},
-			bindings.PreimageOracleLeaf{
+			libKeccakStateMatrix{State: challenge.StateMatrix},
+			preimageOracleLeaf{
 				Input:           challenge.Prestate.Input[:],
 				Index:           new(big.Int).SetUint64(challenge.Prestate.Index),
 				StateCommitment: challenge.Prestate.StateCommitment,
 			},
 			challenge.PrestateProof,
-			bindings.PreimageOracleLeaf{
+			preimageOracleLeaf{
 				Input:           challenge.Poststate.Input[:],
 				Index:           new(big.Int).SetUint64(challenge.Poststate.Index),
 				StateCommitment: challenge.Poststate.StateCommitment,
diff --git a/op-challenger/game/fault/contracts/vm.go b/op-challenger/game/fault/contracts/vm.go
index 2fb354d89bd8..1d1e22632cfe 100644
--- a/op-challenger/game/fault/contracts/vm.go
+++ b/op-challenger/game/fault/contracts/vm.go
@@ -4,9 +4,9 @@ import (
 	"context"
 	"fmt"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	"github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots"
 	"github.com/ethereum/go-ethereum/common"
 )
 
@@ -20,16 +20,13 @@ type VMContract struct {
 	contract    *batching.BoundContract
 }
 
-func NewVMContract(addr common.Address, caller *batching.MultiCaller) (*VMContract, error) {
-	mipsAbi, err := bindings.MIPSMetaData.GetAbi()
-	if err != nil {
-		return nil, fmt.Errorf("failed to load VM ABI: %w", err)
-	}
+func NewVMContract(addr common.Address, caller *batching.MultiCaller) *VMContract {
+	mipsAbi := snapshots.LoadMIPSABI()
 
 	return &VMContract{
 		multiCaller: caller,
 		contract:    batching.NewBoundContract(mipsAbi, addr),
-	}, nil
+	}
 }
 
 func (c *VMContract) Oracle(ctx context.Context) (*PreimageOracleContract, error) {
@@ -37,5 +34,5 @@ func (c *VMContract) Oracle(ctx context.Context) (*PreimageOracleContract, error
 	if err != nil {
 		return nil, fmt.Errorf("failed to load oracle address: %w", err)
 	}
-	return NewPreimageOracleContract(results.GetAddress(0), c.multiCaller)
+	return NewPreimageOracleContract(results.GetAddress(0), c.multiCaller), nil
 }
diff --git a/op-challenger/game/fault/contracts/vm_test.go b/op-challenger/game/fault/contracts/vm_test.go
index 13758ccd6500..4800fcead191 100644
--- a/op-challenger/game/fault/contracts/vm_test.go
+++ b/op-challenger/game/fault/contracts/vm_test.go
@@ -4,23 +4,21 @@ import (
 	"context"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	preimage "github.com/ethereum-optimism/optimism/op-preimage"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	batchingTest "github.com/ethereum-optimism/optimism/op-service/sources/batching/test"
+	"github.com/ethereum-optimism/optimism/packages/contracts-bedrock/snapshots"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/stretchr/testify/require"
 )
 
 func TestVMContract_Oracle(t *testing.T) {
-	vmAbi, err := bindings.MIPSMetaData.GetAbi()
-	require.NoError(t, err)
+	vmAbi := snapshots.LoadMIPSABI()
 
 	stubRpc := batchingTest.NewAbiBasedRpc(t, vmAddr, vmAbi)
-	vmContract, err := NewVMContract(vmAddr, batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize))
-	require.NoError(t, err)
+	vmContract := NewVMContract(vmAddr, batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize))
 
 	stubRpc.SetResponse(vmAddr, methodOracle, rpcblock.Latest, nil, []interface{}{oracleAddr})
 
diff --git a/op-challenger/game/fault/player.go b/op-challenger/game/fault/player.go
index bba42d8bc89d..6bb061277460 100644
--- a/op-challenger/game/fault/player.go
+++ b/op-challenger/game/fault/player.go
@@ -4,6 +4,7 @@ import (
 	"context"
 	"errors"
 	"fmt"
+	"time"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/claims"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
@@ -12,7 +13,9 @@ import (
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
+	"github.com/ethereum-optimism/optimism/op-service/clock"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/common"
 	gethTypes "github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
@@ -33,6 +36,11 @@ type L1HeaderSource interface {
 	HeaderByHash(context.Context, common.Hash) (*gethTypes.Header, error)
 }
 
+type TxSender interface {
+	From() common.Address
+	SendAndWaitSimple(txPurpose string, txs ...txmgr.TxCandidate) error
+}
+
 type GamePlayer struct {
 	act                actor
 	loader             GameInfo
@@ -51,6 +59,7 @@ type GameContract interface {
 	ClaimLoader
 	GetStatus(ctx context.Context) (gameTypes.GameStatus, error)
 	GetMaxGameDepth(ctx context.Context) (types.Depth, error)
+	GetMaxClockDuration(ctx context.Context) (time.Duration, error)
 	GetOracle(ctx context.Context) (*contracts.PreimageOracleContract, error)
 	GetL1Head(ctx context.Context) (common.Hash, error)
 }
@@ -59,12 +68,13 @@ type resourceCreator func(ctx context.Context, logger log.Logger, gameDepth type
 
 func NewGamePlayer(
 	ctx context.Context,
-	cl types.ClockReader,
+	systemClock clock.Clock,
+	l1Clock types.ClockReader,
 	logger log.Logger,
 	m metrics.Metricer,
 	dir string,
 	addr common.Address,
-	txSender gameTypes.TxSender,
+	txSender TxSender,
 	loader GameContract,
 	syncValidator SyncValidator,
 	validators []Validator,
@@ -94,6 +104,11 @@ func NewGamePlayer(
 		}, nil
 	}
 
+	maxClockDuration, err := loader.GetMaxClockDuration(ctx)
+	if err != nil {
+		return nil, fmt.Errorf("failed to fetch the game duration: %w", err)
+	}
+
 	gameDepth, err := loader.GetMaxGameDepth(ctx)
 	if err != nil {
 		return nil, fmt.Errorf("failed to fetch the game depth: %w", err)
@@ -124,14 +139,14 @@ func NewGamePlayer(
 		return nil, fmt.Errorf("failed to load min large preimage size: %w", err)
 	}
 	direct := preimages.NewDirectPreimageUploader(logger, txSender, loader)
-	large := preimages.NewLargePreimageUploader(logger, cl, txSender, oracle)
+	large := preimages.NewLargePreimageUploader(logger, l1Clock, txSender, oracle)
 	uploader := preimages.NewSplitPreimageUploader(direct, large, minLargePreimageSize)
 	responder, err := responder.NewFaultResponder(logger, txSender, loader, uploader, oracle)
 	if err != nil {
 		return nil, fmt.Errorf("failed to create the responder: %w", err)
 	}
 
-	agent := NewAgent(m, loader, gameDepth, accessor, responder, logger, selective, claimants)
+	agent := NewAgent(m, systemClock, l1Clock, loader, gameDepth, maxClockDuration, accessor, responder, logger, selective, claimants)
 	return &GamePlayer{
 		act:                agent.Act,
 		loader:             loader,
diff --git a/op-challenger/game/fault/preimages/direct.go b/op-challenger/game/fault/preimages/direct.go
index 24c1f51e25fd..3c3e5af54f5e 100644
--- a/op-challenger/game/fault/preimages/direct.go
+++ b/op-challenger/game/fault/preimages/direct.go
@@ -5,7 +5,6 @@ import (
 	"fmt"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
-	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/log"
 )
@@ -21,11 +20,11 @@ type PreimageGameContract interface {
 type DirectPreimageUploader struct {
 	log log.Logger
 
-	txSender gameTypes.TxSender
+	txSender TxSender
 	contract PreimageGameContract
 }
 
-func NewDirectPreimageUploader(logger log.Logger, txSender gameTypes.TxSender, contract PreimageGameContract) *DirectPreimageUploader {
+func NewDirectPreimageUploader(logger log.Logger, txSender TxSender, contract PreimageGameContract) *DirectPreimageUploader {
 	return &DirectPreimageUploader{logger, txSender, contract}
 }
 
@@ -38,7 +37,7 @@ func (d *DirectPreimageUploader) UploadPreimage(ctx context.Context, claimIdx ui
 	if err != nil {
 		return fmt.Errorf("failed to create pre-image oracle tx: %w", err)
 	}
-	if _, err := d.txSender.SendAndWait("populate pre-image oracle", candidate); err != nil {
+	if err := d.txSender.SendAndWaitSimple("populate pre-image oracle", candidate); err != nil {
 		return fmt.Errorf("failed to populate pre-image oracle: %w", err)
 	}
 	return nil
diff --git a/op-challenger/game/fault/preimages/direct_test.go b/op-challenger/game/fault/preimages/direct_test.go
index 473334237fc7..fdb360a6708e 100644
--- a/op-challenger/game/fault/preimages/direct_test.go
+++ b/op-challenger/game/fault/preimages/direct_test.go
@@ -9,7 +9,6 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/common"
-	ethtypes "github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
 )
@@ -83,13 +82,13 @@ func (s *mockTxSender) From() common.Address {
 	return common.Address{}
 }
 
-func (s *mockTxSender) SendAndWait(_ string, _ ...txmgr.TxCandidate) ([]*ethtypes.Receipt, error) {
+func (s *mockTxSender) SendAndWaitSimple(_ string, _ ...txmgr.TxCandidate) error {
 	s.sends++
 	if s.sendFails {
-		return nil, mockTxMgrSendError
+		return mockTxMgrSendError
 	}
 	if s.statusFail {
-		return []*ethtypes.Receipt{{Status: ethtypes.ReceiptStatusFailed}}, nil
+		return errors.New("transaction reverted")
 	}
-	return []*ethtypes.Receipt{{Status: ethtypes.ReceiptStatusSuccessful}}, nil
+	return nil
 }
diff --git a/op-challenger/game/fault/preimages/large.go b/op-challenger/game/fault/preimages/large.go
index 47fa47e804f7..da28fdcf16fd 100644
--- a/op-challenger/game/fault/preimages/large.go
+++ b/op-challenger/game/fault/preimages/large.go
@@ -12,7 +12,6 @@ import (
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/keccak/matrix"
 	keccakTypes "github.com/ethereum-optimism/optimism/op-challenger/game/keccak/types"
-	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/common"
@@ -41,11 +40,11 @@ type LargePreimageUploader struct {
 	log log.Logger
 
 	clock    types.ClockReader
-	txSender gameTypes.TxSender
+	txSender TxSender
 	contract PreimageOracleContract
 }
 
-func NewLargePreimageUploader(logger log.Logger, cl types.ClockReader, txSender gameTypes.TxSender, contract PreimageOracleContract) *LargePreimageUploader {
+func NewLargePreimageUploader(logger log.Logger, cl types.ClockReader, txSender TxSender, contract PreimageOracleContract) *LargePreimageUploader {
 	return &LargePreimageUploader{logger, cl, txSender, contract}
 }
 
@@ -151,7 +150,7 @@ func (p *LargePreimageUploader) Squeeze(ctx context.Context, uuid *big.Int, stat
 	if err != nil {
 		return fmt.Errorf("failed to create pre-image oracle tx: %w", err)
 	}
-	if _, err := p.txSender.SendAndWait("squeeze large preimage", tx); err != nil {
+	if err := p.txSender.SendAndWaitSimple("squeeze large preimage", tx); err != nil {
 		return fmt.Errorf("failed to populate pre-image oracle: %w", err)
 	}
 	return nil
@@ -170,7 +169,7 @@ func (p *LargePreimageUploader) initLargePreimage(uuid *big.Int, partOffset uint
 		return fmt.Errorf("failed to get min bond for large preimage proposal: %w", err)
 	}
 	candidate.Value = bond
-	if _, err := p.txSender.SendAndWait("init large preimage", candidate); err != nil {
+	if err := p.txSender.SendAndWaitSimple("init large preimage", candidate); err != nil {
 		return fmt.Errorf("failed to populate pre-image oracle: %w", err)
 	}
 	return nil
@@ -191,6 +190,5 @@ func (p *LargePreimageUploader) addLargePreimageData(uuid *big.Int, chunks []kec
 		txs[i] = tx
 	}
 	p.log.Info("Adding large preimage leaves", "uuid", uuid, "blocksProcessed", blocksProcessed, "txs", len(txs))
-	_, err := p.txSender.SendAndWait("add leaf to large preimage", txs...)
-	return err
+	return p.txSender.SendAndWaitSimple("add leaf to large preimage", txs...)
 }
diff --git a/op-challenger/game/fault/preimages/types.go b/op-challenger/game/fault/preimages/types.go
index 45665d5fc94e..8f799ad5213b 100644
--- a/op-challenger/game/fault/preimages/types.go
+++ b/op-challenger/game/fault/preimages/types.go
@@ -21,6 +21,11 @@ type PreimageUploader interface {
 	UploadPreimage(ctx context.Context, claimIdx uint64, data *types.PreimageOracleData) error
 }
 
+type TxSender interface {
+	From() common.Address
+	SendAndWaitSimple(txPurpose string, txs ...txmgr.TxCandidate) error
+}
+
 // PreimageOracleContract is the interface for interacting with the PreimageOracle contract.
 type PreimageOracleContract interface {
 	InitLargePreimage(uuid *big.Int, partOffset uint32, claimedSize uint32) (txmgr.TxCandidate, error)
diff --git a/op-challenger/game/fault/register.go b/op-challenger/game/fault/register.go
index 6cd34ec1ed84..d52725dd6272 100644
--- a/op-challenger/game/fault/register.go
+++ b/op-challenger/game/fault/register.go
@@ -3,18 +3,23 @@ package fault
 import (
 	"context"
 	"fmt"
+	"path/filepath"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/config"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/claims"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/alphabet"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/asterisc"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/cannon"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/outputs"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/prestates"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
 	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	keccakTypes "github.com/ethereum-optimism/optimism/op-challenger/game/keccak/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/scheduler"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
+	"github.com/ethereum-optimism/optimism/op-service/clock"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum/go-ethereum/common"
@@ -33,6 +38,13 @@ type OracleRegistry interface {
 	RegisterOracle(oracle keccakTypes.LargePreimageOracle)
 }
 
+type PrestateSource interface {
+	// PrestatePath returns the path to the prestate file to use for the game.
+	// The provided prestateHash may be used to differentiate between different states but no guarantee is made that
+	// the returned prestate matches the supplied hash.
+	PrestatePath(prestateHash common.Hash) (string, error)
+}
+
 type RollupClient interface {
 	outputs.OutputRollupClient
 	SyncStatusProvider
@@ -40,60 +52,62 @@ type RollupClient interface {
 
 func RegisterGameTypes(
 	ctx context.Context,
-	cl faultTypes.ClockReader,
+	systemClock clock.Clock,
+	l1Clock faultTypes.ClockReader,
 	logger log.Logger,
 	m metrics.Metricer,
 	cfg *config.Config,
 	registry Registry,
 	oracles OracleRegistry,
 	rollupClient RollupClient,
-	txSender types.TxSender,
+	txSender TxSender,
 	gameFactory *contracts.DisputeGameFactoryContract,
 	caller *batching.MultiCaller,
 	l1HeaderSource L1HeaderSource,
 	selective bool,
 	claimants []common.Address,
 ) (CloseFunc, error) {
-	var closer CloseFunc
-	var l2Client *ethclient.Client
-	if cfg.TraceTypeEnabled(config.TraceTypeCannon) || cfg.TraceTypeEnabled(config.TraceTypePermissioned) {
-		l2, err := ethclient.DialContext(ctx, cfg.CannonL2)
-		if err != nil {
-			return nil, fmt.Errorf("dial l2 client %v: %w", cfg.CannonL2, err)
-		}
-		l2Client = l2
-		closer = l2Client.Close
+	l2Client, err := ethclient.DialContext(ctx, cfg.L2Rpc)
+	if err != nil {
+		return nil, fmt.Errorf("dial l2 client %v: %w", cfg.L2Rpc, err)
 	}
 	syncValidator := newSyncStatusValidator(rollupClient)
 
 	if cfg.TraceTypeEnabled(config.TraceTypeCannon) {
-		if err := registerCannon(faultTypes.CannonGameType, registry, oracles, ctx, cl, logger, m, cfg, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil {
+		if err := registerCannon(faultTypes.CannonGameType, registry, oracles, ctx, systemClock, l1Clock, logger, m, cfg, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil {
 			return nil, fmt.Errorf("failed to register cannon game type: %w", err)
 		}
 	}
 	if cfg.TraceTypeEnabled(config.TraceTypePermissioned) {
-		if err := registerCannon(faultTypes.PermissionedGameType, registry, oracles, ctx, cl, logger, m, cfg, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil {
+		if err := registerCannon(faultTypes.PermissionedGameType, registry, oracles, ctx, systemClock, l1Clock, logger, m, cfg, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil {
 			return nil, fmt.Errorf("failed to register permissioned cannon game type: %w", err)
 		}
 	}
+	if cfg.TraceTypeEnabled(config.TraceTypeAsterisc) {
+		if err := registerAsterisc(faultTypes.AsteriscGameType, registry, oracles, ctx, systemClock, l1Clock, logger, m, cfg, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil {
+			return nil, fmt.Errorf("failed to register asterisc game type: %w", err)
+		}
+	}
 	if cfg.TraceTypeEnabled(config.TraceTypeAlphabet) {
-		if err := registerAlphabet(registry, oracles, ctx, cl, logger, m, syncValidator, rollupClient, txSender, gameFactory, caller, l1HeaderSource, selective, claimants); err != nil {
+		if err := registerAlphabet(registry, oracles, ctx, systemClock, l1Clock, logger, m, syncValidator, rollupClient, l2Client, txSender, gameFactory, caller, l1HeaderSource, selective, claimants); err != nil {
 			return nil, fmt.Errorf("failed to register alphabet game type: %w", err)
 		}
 	}
-	return closer, nil
+	return l2Client.Close, nil
 }
 
 func registerAlphabet(
 	registry Registry,
 	oracles OracleRegistry,
 	ctx context.Context,
-	cl faultTypes.ClockReader,
+	systemClock clock.Clock,
+	l1Clock faultTypes.ClockReader,
 	logger log.Logger,
 	m metrics.Metricer,
 	syncValidator SyncValidator,
 	rollupClient RollupClient,
-	txSender types.TxSender,
+	l2Client utils.L2HeaderSource,
+	txSender TxSender,
 	gameFactory *contracts.DisputeGameFactoryContract,
 	caller *batching.MultiCaller,
 	l1HeaderSource L1HeaderSource,
@@ -101,9 +115,9 @@ func registerAlphabet(
 	claimants []common.Address,
 ) error {
 	playerCreator := func(game types.GameMetadata, dir string) (scheduler.GamePlayer, error) {
-		contract, err := contracts.NewFaultDisputeGameContract(game.Proxy, caller)
+		contract, err := contracts.NewFaultDisputeGameContract(ctx, m, game.Proxy, caller)
 		if err != nil {
-			return nil, err
+			return nil, fmt.Errorf("failed to create fault dispute game contract: %w", err)
 		}
 		oracle, err := contract.GetOracle(ctx)
 		if err != nil {
@@ -124,37 +138,37 @@ func registerAlphabet(
 		}
 		prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock)
 		creator := func(ctx context.Context, logger log.Logger, gameDepth faultTypes.Depth, dir string) (faultTypes.TraceAccessor, error) {
-			accessor, err := outputs.NewOutputAlphabetTraceAccessor(logger, m, prestateProvider, rollupClient, l1Head, splitDepth, prestateBlock, poststateBlock)
+			accessor, err := outputs.NewOutputAlphabetTraceAccessor(logger, m, prestateProvider, rollupClient, l2Client, l1Head, splitDepth, prestateBlock, poststateBlock)
 			if err != nil {
 				return nil, err
 			}
 			return accessor, nil
 		}
 		prestateValidator := NewPrestateValidator("alphabet", contract.GetAbsolutePrestateHash, alphabet.PrestateProvider)
-		genesisValidator := NewPrestateValidator("output root", contract.GetGenesisOutputRoot, prestateProvider)
-		return NewGamePlayer(ctx, cl, logger, m, dir, game.Proxy, txSender, contract, syncValidator, []Validator{prestateValidator, genesisValidator}, creator, l1HeaderSource, selective, claimants)
+		startingValidator := NewPrestateValidator("output root", contract.GetStartingRootHash, prestateProvider)
+		return NewGamePlayer(ctx, systemClock, l1Clock, logger, m, dir, game.Proxy, txSender, contract, syncValidator, []Validator{prestateValidator, startingValidator}, creator, l1HeaderSource, selective, claimants)
 	}
-	err := registerOracle(ctx, oracles, gameFactory, caller, faultTypes.AlphabetGameType)
+	err := registerOracle(ctx, m, oracles, gameFactory, caller, faultTypes.AlphabetGameType)
 	if err != nil {
 		return err
 	}
 	registry.RegisterGameType(faultTypes.AlphabetGameType, playerCreator)
 
 	contractCreator := func(game types.GameMetadata) (claims.BondContract, error) {
-		return contracts.NewFaultDisputeGameContract(game.Proxy, caller)
+		return contracts.NewFaultDisputeGameContract(ctx, m, game.Proxy, caller)
 	}
 	registry.RegisterBondContract(faultTypes.AlphabetGameType, contractCreator)
 	return nil
 }
 
-func registerOracle(ctx context.Context, oracles OracleRegistry, gameFactory *contracts.DisputeGameFactoryContract, caller *batching.MultiCaller, gameType uint32) error {
+func registerOracle(ctx context.Context, m metrics.Metricer, oracles OracleRegistry, gameFactory *contracts.DisputeGameFactoryContract, caller *batching.MultiCaller, gameType uint32) error {
 	implAddr, err := gameFactory.GetGameImpl(ctx, gameType)
 	if err != nil {
 		return fmt.Errorf("failed to load implementation for game type %v: %w", gameType, err)
 	}
-	contract, err := contracts.NewFaultDisputeGameContract(implAddr, caller)
+	contract, err := contracts.NewFaultDisputeGameContract(ctx, m, implAddr, caller)
 	if err != nil {
-		return err
+		return fmt.Errorf("failed to create fault dispute game contracts: %w", err)
 	}
 	oracle, err := contract.GetOracle(ctx)
 	if err != nil {
@@ -164,31 +178,148 @@ func registerOracle(ctx context.Context, oracles OracleRegistry, gameFactory *co
 	return nil
 }
 
-func registerCannon(
+func registerAsterisc(
 	gameType uint32,
 	registry Registry,
 	oracles OracleRegistry,
 	ctx context.Context,
-	cl faultTypes.ClockReader,
+	systemClock clock.Clock,
+	l1Clock faultTypes.ClockReader,
 	logger log.Logger,
 	m metrics.Metricer,
 	cfg *config.Config,
 	syncValidator SyncValidator,
 	rollupClient outputs.OutputRollupClient,
-	txSender types.TxSender,
+	txSender TxSender,
 	gameFactory *contracts.DisputeGameFactoryContract,
 	caller *batching.MultiCaller,
-	l2Client cannon.L2HeaderSource,
+	l2Client utils.L2HeaderSource,
 	l1HeaderSource L1HeaderSource,
 	selective bool,
 	claimants []common.Address,
 ) error {
-	cannonPrestateProvider := cannon.NewPrestateProvider(cfg.CannonAbsolutePreState)
+	var prestateSource PrestateSource
+	if cfg.AsteriscAbsolutePreStateBaseURL != nil {
+		prestateSource = prestates.NewMultiPrestateProvider(cfg.AsteriscAbsolutePreStateBaseURL, filepath.Join(cfg.Datadir, "asterisc-prestates"))
+	} else {
+		prestateSource = prestates.NewSinglePrestateSource(cfg.AsteriscAbsolutePreState)
+	}
+	prestateProviderCache := prestates.NewPrestateProviderCache(m, fmt.Sprintf("prestates-%v", gameType), func(prestateHash common.Hash) (faultTypes.PrestateProvider, error) {
+		prestatePath, err := prestateSource.PrestatePath(prestateHash)
+		if err != nil {
+			return nil, fmt.Errorf("required prestate %v not available: %w", prestateHash, err)
+		}
+		return asterisc.NewPrestateProvider(prestatePath), nil
+	})
 	playerCreator := func(game types.GameMetadata, dir string) (scheduler.GamePlayer, error) {
-		contract, err := contracts.NewFaultDisputeGameContract(game.Proxy, caller)
+		contract, err := contracts.NewFaultDisputeGameContract(ctx, m, game.Proxy, caller)
+		if err != nil {
+			return nil, fmt.Errorf("failed to create fault dispute game contracts: %w", err)
+		}
+		requiredPrestatehash, err := contract.GetAbsolutePrestateHash(ctx)
+		if err != nil {
+			return nil, fmt.Errorf("failed to load prestate hash for game %v: %w", game.Proxy, err)
+		}
+		asteriscPrestateProvider, err := prestateProviderCache.GetOrCreate(requiredPrestatehash)
+		if err != nil {
+			return nil, fmt.Errorf("required prestate %v not available for game %v: %w", requiredPrestatehash, game.Proxy, err)
+		}
+
+		oracle, err := contract.GetOracle(ctx)
+		if err != nil {
+			return nil, fmt.Errorf("failed to load oracle for game %v: %w", game.Proxy, err)
+		}
+		oracles.RegisterOracle(oracle)
+		prestateBlock, poststateBlock, err := contract.GetBlockRange(ctx)
 		if err != nil {
 			return nil, err
 		}
+		splitDepth, err := contract.GetSplitDepth(ctx)
+		if err != nil {
+			return nil, fmt.Errorf("failed to load split depth: %w", err)
+		}
+		l1HeadID, err := loadL1Head(contract, ctx, l1HeaderSource)
+		if err != nil {
+			return nil, err
+		}
+		prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock)
+		creator := func(ctx context.Context, logger log.Logger, gameDepth faultTypes.Depth, dir string) (faultTypes.TraceAccessor, error) {
+			asteriscPrestate, err := prestateSource.PrestatePath(requiredPrestatehash)
+			if err != nil {
+				return nil, fmt.Errorf("failed to get asterisc prestate: %w", err)
+			}
+			accessor, err := outputs.NewOutputAsteriscTraceAccessor(logger, m, cfg, l2Client, prestateProvider, asteriscPrestate, rollupClient, dir, l1HeadID, splitDepth, prestateBlock, poststateBlock)
+			if err != nil {
+				return nil, err
+			}
+			return accessor, nil
+		}
+		prestateValidator := NewPrestateValidator("asterisc", contract.GetAbsolutePrestateHash, asteriscPrestateProvider)
+		genesisValidator := NewPrestateValidator("output root", contract.GetStartingRootHash, prestateProvider)
+		return NewGamePlayer(ctx, systemClock, l1Clock, logger, m, dir, game.Proxy, txSender, contract, syncValidator, []Validator{prestateValidator, genesisValidator}, creator, l1HeaderSource, selective, claimants)
+	}
+	err := registerOracle(ctx, m, oracles, gameFactory, caller, gameType)
+	if err != nil {
+		return err
+	}
+	registry.RegisterGameType(gameType, playerCreator)
+
+	contractCreator := func(game types.GameMetadata) (claims.BondContract, error) {
+		return contracts.NewFaultDisputeGameContract(ctx, m, game.Proxy, caller)
+	}
+	registry.RegisterBondContract(gameType, contractCreator)
+	return nil
+}
+
+func registerCannon(
+	gameType uint32,
+	registry Registry,
+	oracles OracleRegistry,
+	ctx context.Context,
+	systemClock clock.Clock,
+	l1Clock faultTypes.ClockReader,
+	logger log.Logger,
+	m metrics.Metricer,
+	cfg *config.Config,
+	syncValidator SyncValidator,
+	rollupClient outputs.OutputRollupClient,
+	txSender TxSender,
+	gameFactory *contracts.DisputeGameFactoryContract,
+	caller *batching.MultiCaller,
+	l2Client utils.L2HeaderSource,
+	l1HeaderSource L1HeaderSource,
+	selective bool,
+	claimants []common.Address,
+) error {
+	var prestateSource PrestateSource
+	if cfg.CannonAbsolutePreStateBaseURL != nil {
+		prestateSource = prestates.NewMultiPrestateProvider(cfg.CannonAbsolutePreStateBaseURL, filepath.Join(cfg.Datadir, "cannon-prestates"))
+	} else {
+		prestateSource = prestates.NewSinglePrestateSource(cfg.CannonAbsolutePreState)
+	}
+	prestateProviderCache := prestates.NewPrestateProviderCache(m, fmt.Sprintf("prestates-%v", gameType), func(prestateHash common.Hash) (faultTypes.PrestateProvider, error) {
+		prestatePath, err := prestateSource.PrestatePath(prestateHash)
+		if err != nil {
+			return nil, fmt.Errorf("required prestate %v not available: %w", prestateHash, err)
+		}
+		return cannon.NewPrestateProvider(prestatePath), nil
+	})
+	playerCreator := func(game types.GameMetadata, dir string) (scheduler.GamePlayer, error) {
+		contract, err := contracts.NewFaultDisputeGameContract(ctx, m, game.Proxy, caller)
+		if err != nil {
+			return nil, fmt.Errorf("failed to create fault dispute game contracts: %w", err)
+		}
+		requiredPrestatehash, err := contract.GetAbsolutePrestateHash(ctx)
+		if err != nil {
+			return nil, fmt.Errorf("failed to load prestate hash for game %v: %w", game.Proxy, err)
+		}
+
+		cannonPrestateProvider, err := prestateProviderCache.GetOrCreate(requiredPrestatehash)
+
+		if err != nil {
+			return nil, fmt.Errorf("required prestate %v not available for game %v: %w", requiredPrestatehash, game.Proxy, err)
+		}
+
 		oracle, err := contract.GetOracle(ctx)
 		if err != nil {
 			return nil, fmt.Errorf("failed to load oracle for game %v: %w", game.Proxy, err)
@@ -208,30 +339,34 @@ func registerCannon(
 		}
 		prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock)
 		creator := func(ctx context.Context, logger log.Logger, gameDepth faultTypes.Depth, dir string) (faultTypes.TraceAccessor, error) {
-			accessor, err := outputs.NewOutputCannonTraceAccessor(logger, m, cfg, l2Client, prestateProvider, rollupClient, dir, l1HeadID, splitDepth, prestateBlock, poststateBlock)
+			cannonPrestate, err := prestateSource.PrestatePath(requiredPrestatehash)
+			if err != nil {
+				return nil, fmt.Errorf("failed to get cannon prestate: %w", err)
+			}
+			accessor, err := outputs.NewOutputCannonTraceAccessor(logger, m, cfg, l2Client, prestateProvider, cannonPrestate, rollupClient, dir, l1HeadID, splitDepth, prestateBlock, poststateBlock)
 			if err != nil {
 				return nil, err
 			}
 			return accessor, nil
 		}
 		prestateValidator := NewPrestateValidator("cannon", contract.GetAbsolutePrestateHash, cannonPrestateProvider)
-		genesisValidator := NewPrestateValidator("output root", contract.GetGenesisOutputRoot, prestateProvider)
-		return NewGamePlayer(ctx, cl, logger, m, dir, game.Proxy, txSender, contract, syncValidator, []Validator{prestateValidator, genesisValidator}, creator, l1HeaderSource, selective, claimants)
+		startingValidator := NewPrestateValidator("output root", contract.GetStartingRootHash, prestateProvider)
+		return NewGamePlayer(ctx, systemClock, l1Clock, logger, m, dir, game.Proxy, txSender, contract, syncValidator, []Validator{prestateValidator, startingValidator}, creator, l1HeaderSource, selective, claimants)
 	}
-	err := registerOracle(ctx, oracles, gameFactory, caller, gameType)
+	err := registerOracle(ctx, m, oracles, gameFactory, caller, gameType)
 	if err != nil {
 		return err
 	}
 	registry.RegisterGameType(gameType, playerCreator)
 
 	contractCreator := func(game types.GameMetadata) (claims.BondContract, error) {
-		return contracts.NewFaultDisputeGameContract(game.Proxy, caller)
+		return contracts.NewFaultDisputeGameContract(ctx, m, game.Proxy, caller)
 	}
 	registry.RegisterBondContract(gameType, contractCreator)
 	return nil
 }
 
-func loadL1Head(contract *contracts.FaultDisputeGameContract, ctx context.Context, l1HeaderSource L1HeaderSource) (eth.BlockID, error) {
+func loadL1Head(contract contracts.FaultDisputeGameContract, ctx context.Context, l1HeaderSource L1HeaderSource) (eth.BlockID, error) {
 	l1Head, err := contract.GetL1Head(ctx)
 	if err != nil {
 		return eth.BlockID{}, fmt.Errorf("failed to load L1 head: %w", err)
diff --git a/op-challenger/game/fault/responder/responder.go b/op-challenger/game/fault/responder/responder.go
index fbeddc5b622c..8d0b257c5d6f 100644
--- a/op-challenger/game/fault/responder/responder.go
+++ b/op-challenger/game/fault/responder/responder.go
@@ -4,14 +4,12 @@ import (
 	"context"
 	"errors"
 	"fmt"
-	"math/big"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/preimages"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/common"
-
 	"github.com/ethereum/go-ethereum/log"
 )
 
@@ -20,27 +18,31 @@ type GameContract interface {
 	ResolveTx() (txmgr.TxCandidate, error)
 	CallResolveClaim(ctx context.Context, claimIdx uint64) error
 	ResolveClaimTx(claimIdx uint64) (txmgr.TxCandidate, error)
-	AttackTx(parentContractIndex uint64, pivot common.Hash) (txmgr.TxCandidate, error)
-	DefendTx(parentContractIndex uint64, pivot common.Hash) (txmgr.TxCandidate, error)
+	AttackTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error)
+	DefendTx(ctx context.Context, parent types.Claim, pivot common.Hash) (txmgr.TxCandidate, error)
 	StepTx(claimIdx uint64, isAttack bool, stateData []byte, proof []byte) (txmgr.TxCandidate, error)
-	GetRequiredBond(ctx context.Context, position types.Position) (*big.Int, error)
+	ChallengeL2BlockNumberTx(challenge *types.InvalidL2BlockNumberChallenge) (txmgr.TxCandidate, error)
 }
 
 type Oracle interface {
 	GlobalDataExists(ctx context.Context, data *types.PreimageOracleData) (bool, error)
 }
 
+type TxSender interface {
+	SendAndWaitSimple(txPurpose string, txs ...txmgr.TxCandidate) error
+}
+
 // FaultResponder implements the [Responder] interface to send onchain transactions.
 type FaultResponder struct {
 	log      log.Logger
-	sender   gameTypes.TxSender
+	sender   TxSender
 	contract GameContract
 	uploader preimages.PreimageUploader
 	oracle   Oracle
 }
 
 // NewFaultResponder returns a new [FaultResponder].
-func NewFaultResponder(logger log.Logger, sender gameTypes.TxSender, contract GameContract, uploader preimages.PreimageUploader, oracle Oracle) (*FaultResponder, error) {
+func NewFaultResponder(logger log.Logger, sender TxSender, contract GameContract, uploader preimages.PreimageUploader, oracle Oracle) (*FaultResponder, error) {
 	return &FaultResponder{
 		log:      logger,
 		sender:   sender,
@@ -63,7 +65,7 @@ func (r *FaultResponder) Resolve() error {
 		return err
 	}
 
-	return r.sendTxAndWait("resolve game", candidate)
+	return r.sender.SendAndWaitSimple("resolve game", candidate)
 }
 
 // CallResolveClaim determines if the resolveClaim function on the fault dispute game contract
@@ -72,13 +74,17 @@ func (r *FaultResponder) CallResolveClaim(ctx context.Context, claimIdx uint64)
 	return r.contract.CallResolveClaim(ctx, claimIdx)
 }
 
-// ResolveClaim executes a resolveClaim transaction to resolve a fault dispute game.
-func (r *FaultResponder) ResolveClaim(claimIdx uint64) error {
-	candidate, err := r.contract.ResolveClaimTx(claimIdx)
-	if err != nil {
-		return err
+// ResolveClaims executes resolveClaim transactions to resolve claims in a dispute game.
+func (r *FaultResponder) ResolveClaims(claimIdxs ...uint64) error {
+	txs := make([]txmgr.TxCandidate, 0, len(claimIdxs))
+	for _, claimIdx := range claimIdxs {
+		candidate, err := r.contract.ResolveClaimTx(claimIdx)
+		if err != nil {
+			return err
+		}
+		txs = append(txs, candidate)
 	}
-	return r.sendTxAndWait("resolve claim", candidate)
+	return r.sender.SendAndWaitSimple("resolve claim", txs...)
 }
 
 func (r *FaultResponder) PerformAction(ctx context.Context, action types.Action) error {
@@ -93,7 +99,7 @@ func (r *FaultResponder) PerformAction(ctx context.Context, action types.Action)
 		}
 		// Always upload local preimages
 		if !preimageExists {
-			err := r.uploader.UploadPreimage(ctx, uint64(action.ParentIdx), action.OracleData)
+			err := r.uploader.UploadPreimage(ctx, uint64(action.ParentClaim.ContractIndex), action.OracleData)
 			if errors.Is(err, preimages.ErrChallengePeriodNotOver) {
 				r.log.Debug("Large Preimage Squeeze failed, challenge period not over")
 				return nil
@@ -106,32 +112,18 @@ func (r *FaultResponder) PerformAction(ctx context.Context, action types.Action)
 	var err error
 	switch action.Type {
 	case types.ActionTypeMove:
-		var movePos types.Position
 		if action.IsAttack {
-			movePos = action.ParentPosition.Attack()
-			candidate, err = r.contract.AttackTx(uint64(action.ParentIdx), action.Value)
+			candidate, err = r.contract.AttackTx(ctx, action.ParentClaim, action.Value)
 		} else {
-			movePos = action.ParentPosition.Defend()
-			candidate, err = r.contract.DefendTx(uint64(action.ParentIdx), action.Value)
+			candidate, err = r.contract.DefendTx(ctx, action.ParentClaim, action.Value)
 		}
-
-		bondValue, err := r.contract.GetRequiredBond(ctx, movePos)
-		if err != nil {
-			return err
-		}
-		candidate.Value = bondValue
 	case types.ActionTypeStep:
-		candidate, err = r.contract.StepTx(uint64(action.ParentIdx), action.IsAttack, action.PreState, action.ProofData)
+		candidate, err = r.contract.StepTx(uint64(action.ParentClaim.ContractIndex), action.IsAttack, action.PreState, action.ProofData)
+	case types.ActionTypeChallengeL2BlockNumber:
+		candidate, err = r.contract.ChallengeL2BlockNumberTx(action.InvalidL2BlockNumberChallenge)
 	}
 	if err != nil {
 		return err
 	}
-	return r.sendTxAndWait("perform action", candidate)
-}
-
-// sendTxAndWait sends a transaction through the [txmgr] and waits for a receipt.
-// This sets the tx GasLimit to 0, performing gas estimation online through the [txmgr].
-func (r *FaultResponder) sendTxAndWait(purpose string, candidate txmgr.TxCandidate) error {
-	_, err := r.sender.SendAndWait(purpose, candidate)
-	return err
+	return r.sender.SendAndWaitSimple("perform action", candidate)
 }
diff --git a/op-challenger/game/fault/responder/responder_test.go b/op-challenger/game/fault/responder/responder_test.go
index a2be0bab9ad3..35ed1e55916f 100644
--- a/op-challenger/game/fault/responder/responder_test.go
+++ b/op-challenger/game/fault/responder/responder_test.go
@@ -12,7 +12,6 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 
 	"github.com/ethereum/go-ethereum/common"
-	ethtypes "github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
 
 	"github.com/stretchr/testify/require"
@@ -84,17 +83,24 @@ func TestResolveClaim(t *testing.T) {
 	t.Run("SendFails", func(t *testing.T) {
 		responder, mockTxMgr, _, _, _ := newTestFaultResponder(t)
 		mockTxMgr.sendFails = true
-		err := responder.ResolveClaim(0)
+		err := responder.ResolveClaims(0)
 		require.ErrorIs(t, err, mockSendError)
 		require.Equal(t, 0, mockTxMgr.sends)
 	})
 
 	t.Run("Success", func(t *testing.T) {
 		responder, mockTxMgr, _, _, _ := newTestFaultResponder(t)
-		err := responder.ResolveClaim(0)
+		err := responder.ResolveClaims(0)
 		require.NoError(t, err)
 		require.Equal(t, 1, mockTxMgr.sends)
 	})
+
+	t.Run("Multiple", func(t *testing.T) {
+		responder, mockTxMgr, _, _, _ := newTestFaultResponder(t)
+		err := responder.ResolveClaims(0, 1, 2, 3)
+		require.NoError(t, err)
+		require.Equal(t, 4, mockTxMgr.sends)
+	})
 }
 
 // TestRespond tests the [Responder.Respond] method.
@@ -103,10 +109,10 @@ func TestPerformAction(t *testing.T) {
 		responder, mockTxMgr, _, _, _ := newTestFaultResponder(t)
 		mockTxMgr.sendFails = true
 		err := responder.PerformAction(context.Background(), types.Action{
-			Type:      types.ActionTypeMove,
-			ParentIdx: 123,
-			IsAttack:  true,
-			Value:     common.Hash{0xaa},
+			Type:        types.ActionTypeMove,
+			ParentClaim: types.Claim{ContractIndex: 123},
+			IsAttack:    true,
+			Value:       common.Hash{0xaa},
 		})
 		require.ErrorIs(t, err, mockSendError)
 		require.Equal(t, 0, mockTxMgr.sends)
@@ -115,10 +121,10 @@ func TestPerformAction(t *testing.T) {
 	t.Run("sends response", func(t *testing.T) {
 		responder, mockTxMgr, _, _, _ := newTestFaultResponder(t)
 		err := responder.PerformAction(context.Background(), types.Action{
-			Type:      types.ActionTypeMove,
-			ParentIdx: 123,
-			IsAttack:  true,
-			Value:     common.Hash{0xaa},
+			Type:        types.ActionTypeMove,
+			ParentClaim: types.Claim{ContractIndex: 123},
+			IsAttack:    true,
+			Value:       common.Hash{0xaa},
 		})
 		require.NoError(t, err)
 		require.Equal(t, 1, mockTxMgr.sends)
@@ -127,60 +133,60 @@ func TestPerformAction(t *testing.T) {
 	t.Run("attack", func(t *testing.T) {
 		responder, mockTxMgr, contract, _, _ := newTestFaultResponder(t)
 		action := types.Action{
-			Type:      types.ActionTypeMove,
-			ParentIdx: 123,
-			IsAttack:  true,
-			Value:     common.Hash{0xaa},
+			Type:        types.ActionTypeMove,
+			ParentClaim: types.Claim{ContractIndex: 123},
+			IsAttack:    true,
+			Value:       common.Hash{0xaa},
 		}
 		err := responder.PerformAction(context.Background(), action)
 		require.NoError(t, err)
 
 		require.Len(t, mockTxMgr.sent, 1)
-		require.EqualValues(t, []interface{}{uint64(action.ParentIdx), action.Value}, contract.attackArgs)
+		require.EqualValues(t, []interface{}{action.ParentClaim, action.Value}, contract.attackArgs)
 		require.Equal(t, ([]byte)("attack"), mockTxMgr.sent[0].TxData)
 	})
 
 	t.Run("defend", func(t *testing.T) {
 		responder, mockTxMgr, contract, _, _ := newTestFaultResponder(t)
 		action := types.Action{
-			Type:      types.ActionTypeMove,
-			ParentIdx: 123,
-			IsAttack:  false,
-			Value:     common.Hash{0xaa},
+			Type:        types.ActionTypeMove,
+			ParentClaim: types.Claim{ContractIndex: 123},
+			IsAttack:    false,
+			Value:       common.Hash{0xaa},
 		}
 		err := responder.PerformAction(context.Background(), action)
 		require.NoError(t, err)
 
 		require.Len(t, mockTxMgr.sent, 1)
-		require.EqualValues(t, []interface{}{uint64(action.ParentIdx), action.Value}, contract.defendArgs)
+		require.EqualValues(t, []interface{}{action.ParentClaim, action.Value}, contract.defendArgs)
 		require.Equal(t, ([]byte)("defend"), mockTxMgr.sent[0].TxData)
 	})
 
 	t.Run("step", func(t *testing.T) {
 		responder, mockTxMgr, contract, _, _ := newTestFaultResponder(t)
 		action := types.Action{
-			Type:      types.ActionTypeStep,
-			ParentIdx: 123,
-			IsAttack:  true,
-			PreState:  []byte{1, 2, 3},
-			ProofData: []byte{4, 5, 6},
+			Type:        types.ActionTypeStep,
+			ParentClaim: types.Claim{ContractIndex: 123},
+			IsAttack:    true,
+			PreState:    []byte{1, 2, 3},
+			ProofData:   []byte{4, 5, 6},
 		}
 		err := responder.PerformAction(context.Background(), action)
 		require.NoError(t, err)
 
 		require.Len(t, mockTxMgr.sent, 1)
-		require.EqualValues(t, []interface{}{uint64(action.ParentIdx), action.IsAttack, action.PreState, action.ProofData}, contract.stepArgs)
+		require.EqualValues(t, []interface{}{uint64(123), action.IsAttack, action.PreState, action.ProofData}, contract.stepArgs)
 		require.Equal(t, ([]byte)("step"), mockTxMgr.sent[0].TxData)
 	})
 
 	t.Run("stepWithLocalOracleData", func(t *testing.T) {
 		responder, mockTxMgr, contract, uploader, oracle := newTestFaultResponder(t)
 		action := types.Action{
-			Type:      types.ActionTypeStep,
-			ParentIdx: 123,
-			IsAttack:  true,
-			PreState:  []byte{1, 2, 3},
-			ProofData: []byte{4, 5, 6},
+			Type:        types.ActionTypeStep,
+			ParentClaim: types.Claim{ContractIndex: 123},
+			IsAttack:    true,
+			PreState:    []byte{1, 2, 3},
+			ProofData:   []byte{4, 5, 6},
 			OracleData: &types.PreimageOracleData{
 				IsLocal: true,
 			},
@@ -198,11 +204,11 @@ func TestPerformAction(t *testing.T) {
 	t.Run("stepWithGlobalOracleData", func(t *testing.T) {
 		responder, mockTxMgr, contract, uploader, oracle := newTestFaultResponder(t)
 		action := types.Action{
-			Type:      types.ActionTypeStep,
-			ParentIdx: 123,
-			IsAttack:  true,
-			PreState:  []byte{1, 2, 3},
-			ProofData: []byte{4, 5, 6},
+			Type:        types.ActionTypeStep,
+			ParentClaim: types.Claim{ContractIndex: 123},
+			IsAttack:    true,
+			PreState:    []byte{1, 2, 3},
+			ProofData:   []byte{4, 5, 6},
 			OracleData: &types.PreimageOracleData{
 				IsLocal: false,
 			},
@@ -221,11 +227,11 @@ func TestPerformAction(t *testing.T) {
 		responder, mockTxMgr, contract, uploader, _ := newTestFaultResponder(t)
 		uploader.uploadFails = true
 		action := types.Action{
-			Type:      types.ActionTypeStep,
-			ParentIdx: 123,
-			IsAttack:  true,
-			PreState:  []byte{1, 2, 3},
-			ProofData: []byte{4, 5, 6},
+			Type:        types.ActionTypeStep,
+			ParentClaim: types.Claim{ContractIndex: 123},
+			IsAttack:    true,
+			PreState:    []byte{1, 2, 3},
+			ProofData:   []byte{4, 5, 6},
 			OracleData: &types.PreimageOracleData{
 				IsLocal: true,
 			},
@@ -241,11 +247,11 @@ func TestPerformAction(t *testing.T) {
 		responder, mockTxMgr, contract, uploader, oracle := newTestFaultResponder(t)
 		oracle.existsResult = true
 		action := types.Action{
-			Type:      types.ActionTypeStep,
-			ParentIdx: 123,
-			IsAttack:  true,
-			PreState:  []byte{1, 2, 3},
-			ProofData: []byte{4, 5, 6},
+			Type:        types.ActionTypeStep,
+			ParentClaim: types.Claim{ContractIndex: 123},
+			IsAttack:    true,
+			PreState:    []byte{1, 2, 3},
+			ProofData:   []byte{4, 5, 6},
 			OracleData: &types.PreimageOracleData{
 				IsLocal: false,
 			},
@@ -262,11 +268,11 @@ func TestPerformAction(t *testing.T) {
 		responder, mockTxMgr, contract, uploader, oracle := newTestFaultResponder(t)
 		oracle.existsFails = true
 		action := types.Action{
-			Type:      types.ActionTypeStep,
-			ParentIdx: 123,
-			IsAttack:  true,
-			PreState:  []byte{1, 2, 3},
-			ProofData: []byte{4, 5, 6},
+			Type:        types.ActionTypeStep,
+			ParentClaim: types.Claim{ContractIndex: 123},
+			IsAttack:    true,
+			PreState:    []byte{1, 2, 3},
+			ProofData:   []byte{4, 5, 6},
 			OracleData: &types.PreimageOracleData{
 				IsLocal: false,
 			},
@@ -278,6 +284,19 @@ func TestPerformAction(t *testing.T) {
 		require.Equal(t, 0, uploader.updates)
 		require.Equal(t, 1, oracle.existCalls)
 	})
+
+	t.Run("challengeL2Block", func(t *testing.T) {
+		responder, mockTxMgr, contract, _, _ := newTestFaultResponder(t)
+		challenge := &types.InvalidL2BlockNumberChallenge{}
+		action := types.Action{
+			Type:                          types.ActionTypeChallengeL2BlockNumber,
+			InvalidL2BlockNumberChallenge: challenge,
+		}
+		err := responder.PerformAction(context.Background(), action)
+		require.NoError(t, err)
+		require.Len(t, mockTxMgr.sent, 1)
+		require.Equal(t, []interface{}{challenge}, contract.challengeArgs)
+	})
 }
 
 func newTestFaultResponder(t *testing.T) (*FaultResponder, *mockTxManager, *mockContract, *mockPreimageUploader, *mockOracle) {
@@ -325,21 +344,15 @@ type mockTxManager struct {
 	sendFails bool
 }
 
-func (m *mockTxManager) SendAndWait(_ string, txs ...txmgr.TxCandidate) ([]*ethtypes.Receipt, error) {
-	rcpts := make([]*ethtypes.Receipt, 0, len(txs))
+func (m *mockTxManager) SendAndWaitSimple(_ string, txs ...txmgr.TxCandidate) error {
 	for _, tx := range txs {
 		if m.sendFails {
-			return nil, mockSendError
+			return mockSendError
 		}
 		m.sends++
 		m.sent = append(m.sent, tx)
-		rcpts = append(rcpts, ethtypes.NewReceipt(
-			[]byte{},
-			false,
-			0,
-		))
 	}
-	return rcpts, nil
+	return nil
 }
 
 func (m *mockTxManager) BlockNumber(_ context.Context) (uint64, error) {
@@ -359,6 +372,7 @@ type mockContract struct {
 	attackArgs           []interface{}
 	defendArgs           []interface{}
 	stepArgs             []interface{}
+	challengeArgs        []interface{}
 	updateOracleClaimIdx uint64
 	updateOracleArgs     *types.PreimageOracleData
 }
@@ -387,13 +401,18 @@ func (m *mockContract) ResolveClaimTx(_ uint64) (txmgr.TxCandidate, error) {
 	return txmgr.TxCandidate{}, nil
 }
 
-func (m *mockContract) AttackTx(parentClaimId uint64, claim common.Hash) (txmgr.TxCandidate, error) {
-	m.attackArgs = []interface{}{parentClaimId, claim}
+func (m *mockContract) ChallengeL2BlockNumberTx(challenge *types.InvalidL2BlockNumberChallenge) (txmgr.TxCandidate, error) {
+	m.challengeArgs = []interface{}{challenge}
+	return txmgr.TxCandidate{TxData: ([]byte)("challenge")}, nil
+}
+
+func (m *mockContract) AttackTx(_ context.Context, parent types.Claim, claim common.Hash) (txmgr.TxCandidate, error) {
+	m.attackArgs = []interface{}{parent, claim}
 	return txmgr.TxCandidate{TxData: ([]byte)("attack")}, nil
 }
 
-func (m *mockContract) DefendTx(parentClaimId uint64, claim common.Hash) (txmgr.TxCandidate, error) {
-	m.defendArgs = []interface{}{parentClaimId, claim}
+func (m *mockContract) DefendTx(_ context.Context, parent types.Claim, claim common.Hash) (txmgr.TxCandidate, error) {
+	m.defendArgs = []interface{}{parent, claim}
 	return txmgr.TxCandidate{TxData: ([]byte)("defend")}, nil
 }
 
@@ -408,10 +427,6 @@ func (m *mockContract) UpdateOracleTx(_ context.Context, claimIdx uint64, data *
 	return txmgr.TxCandidate{TxData: ([]byte)("updateOracle")}, nil
 }
 
-func (m *mockContract) GetRequiredBond(_ context.Context, position types.Position) (*big.Int, error) {
-	return big.NewInt(5), nil
-}
-
 func (m *mockContract) GetCredit(_ context.Context, _ common.Address) (*big.Int, error) {
 	return big.NewInt(5), nil
 }
diff --git a/op-challenger/game/fault/solver/game_rules_test.go b/op-challenger/game/fault/solver/game_rules_test.go
index 44eb998ef3c6..d1d634fe0629 100644
--- a/op-challenger/game/fault/solver/game_rules_test.go
+++ b/op-challenger/game/fault/solver/game_rules_test.go
@@ -5,7 +5,7 @@ import (
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
-	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/resolution"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon"
 	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/transform"
 	disputeTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
 	"github.com/ethereum/go-ethereum/common"
@@ -80,9 +80,17 @@ func verifyChallengerNeverCountersAClaimTwice(t *testing.T, tree *disputeTypes.B
 	}
 }
 
+func enrichClaims(claims []types.Claim) []disputeTypes.EnrichedClaim {
+	enriched := make([]disputeTypes.EnrichedClaim, len(claims))
+	for i, claim := range claims {
+		enriched[i] = disputeTypes.EnrichedClaim{Claim: claim}
+	}
+	return enriched
+}
+
 func gameResult(game types.Game) (gameTypes.GameStatus, *disputeTypes.BidirectionalTree, types.Game) {
-	tree := transform.CreateBidirectionalTree(game.Claims())
-	result := resolution.Resolve(tree)
+	tree := transform.CreateBidirectionalTree(enrichClaims(game.Claims()))
+	result := mon.Resolve(tree)
 	resolvedClaims := make([]types.Claim, 0, len(tree.Claims))
 	for _, claim := range tree.Claims {
 		resolvedClaims = append(resolvedClaims, *claim.Claim)
diff --git a/op-challenger/game/fault/solver/game_solver.go b/op-challenger/game/fault/solver/game_solver.go
index 7c10d005c2e3..9ba77c895b17 100644
--- a/op-challenger/game/fault/solver/game_solver.go
+++ b/op-challenger/game/fault/solver/game_solver.go
@@ -2,6 +2,7 @@ package solver
 
 import (
 	"context"
+	"errors"
 	"fmt"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
@@ -27,6 +28,25 @@ func (s *GameSolver) CalculateNextActions(ctx context.Context, game types.Game)
 	if err != nil {
 		return nil, fmt.Errorf("failed to determine if root claim is correct: %w", err)
 	}
+
+	// Challenging the L2 block number will only work if we have the same output root as the claim
+	// Otherwise our output root preimage won't match. We can just proceed and invalidate the output root by disputing claims instead.
+	if agreeWithRootClaim {
+		if challenge, err := s.claimSolver.trace.GetL2BlockNumberChallenge(ctx, game); errors.Is(err, types.ErrL2BlockNumberValid) {
+			// We agree with the L2 block number, proceed to processing claims
+		} else if err != nil {
+			// Failed to check L2 block validity
+			return nil, fmt.Errorf("failed to determine L2 block validity: %w", err)
+		} else {
+			return []types.Action{
+				{
+					Type:                          types.ActionTypeChallengeL2BlockNumber,
+					InvalidL2BlockNumberChallenge: challenge,
+				},
+			}, nil
+		}
+	}
+
 	var actions []types.Action
 	agreedClaims := newHonestClaimTracker()
 	if agreeWithRootClaim {
@@ -65,13 +85,12 @@ func (s *GameSolver) calculateStep(ctx context.Context, game types.Game, claim t
 		return nil, nil
 	}
 	return &types.Action{
-		Type:           types.ActionTypeStep,
-		ParentIdx:      step.LeafClaim.ContractIndex,
-		ParentPosition: step.LeafClaim.Position,
-		IsAttack:       step.IsAttack,
-		PreState:       step.PreState,
-		ProofData:      step.ProofData,
-		OracleData:     step.OracleData,
+		Type:        types.ActionTypeStep,
+		ParentClaim: step.LeafClaim,
+		IsAttack:    step.IsAttack,
+		PreState:    step.PreState,
+		ProofData:   step.ProofData,
+		OracleData:  step.OracleData,
 	}, nil
 }
 
@@ -88,10 +107,9 @@ func (s *GameSolver) calculateMove(ctx context.Context, game types.Game, claim t
 		return nil, nil
 	}
 	return &types.Action{
-		Type:           types.ActionTypeMove,
-		IsAttack:       !game.DefendsParent(*move),
-		ParentIdx:      move.ParentContractIndex,
-		ParentPosition: claim.Position,
-		Value:          move.Value,
+		Type:        types.ActionTypeMove,
+		IsAttack:    !game.DefendsParent(*move),
+		ParentClaim: game.Claims()[move.ParentContractIndex],
+		Value:       move.Value,
 	}, nil
 }
diff --git a/op-challenger/game/fault/solver/game_solver_test.go b/op-challenger/game/fault/solver/game_solver_test.go
index 49a808c685db..cde0420eda86 100644
--- a/op-challenger/game/fault/solver/game_solver_test.go
+++ b/op-challenger/game/fault/solver/game_solver_test.go
@@ -10,10 +10,36 @@ import (
 	faulttest "github.com/ethereum-optimism/optimism/op-challenger/game/fault/test"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/stretchr/testify/require"
 )
 
+func TestCalculateNextActions_ChallengeL2BlockNumber(t *testing.T) {
+	startingBlock := big.NewInt(5)
+	maxDepth := types.Depth(6)
+	challenge := &types.InvalidL2BlockNumberChallenge{
+		Output: ð.OutputResponse{OutputRoot: eth.Bytes32{0xbb}},
+	}
+	claimBuilder := faulttest.NewAlphabetClaimBuilder(t, startingBlock, maxDepth)
+	traceProvider := faulttest.NewAlphabetWithProofProvider(t, startingBlock, maxDepth, nil)
+	solver := NewGameSolver(maxDepth, trace.NewSimpleTraceAccessor(traceProvider))
+
+	// Do not challenge when provider returns error indicating l2 block is valid
+	actions, err := solver.CalculateNextActions(context.Background(), claimBuilder.GameBuilder().Game)
+	require.NoError(t, err)
+	require.Len(t, actions, 0)
+
+	// Do challenge when the provider returns a challenge
+	traceProvider.L2BlockChallenge = challenge
+	actions, err = solver.CalculateNextActions(context.Background(), claimBuilder.GameBuilder().Game)
+	require.NoError(t, err)
+	require.Len(t, actions, 1)
+	action := actions[0]
+	require.Equal(t, types.ActionTypeChallengeL2BlockNumber, action.Type)
+	require.Equal(t, challenge, action.InvalidL2BlockNumberChallenge)
+}
+
 func TestCalculateNextActions(t *testing.T) {
 	maxDepth := types.Depth(6)
 	startingL2BlockNumber := big.NewInt(0)
@@ -31,8 +57,6 @@ func TestCalculateNextActions(t *testing.T) {
 			},
 		},
 		{
-			// Note: The fault dispute game contract should prevent a correct root claim from actually being posted
-			// But for completeness, test we ignore it so we don't get sucked into playing an unwinnable game.
 			name:             "DoNotAttackCorrectRootClaim_AgreeWithOutputRoot",
 			rootClaimCorrect: true,
 			setupGame:        func(builder *faulttest.GameBuilder) {},
@@ -185,7 +209,7 @@ func TestCalculateNextActions(t *testing.T) {
 			postState, actions := runStep(t, solver, game, claimBuilder.CorrectTraceProvider())
 			for i, action := range builder.ExpectedActions {
 				t.Logf("Expect %v: Type: %v, ParentIdx: %v, Attack: %v, Value: %v, PreState: %v, ProofData: %v",
-					i, action.Type, action.ParentIdx, action.IsAttack, action.Value, hex.EncodeToString(action.PreState), hex.EncodeToString(action.ProofData))
+					i, action.Type, action.ParentClaim.ContractIndex, action.IsAttack, action.Value, hex.EncodeToString(action.PreState), hex.EncodeToString(action.ProofData))
 				require.Containsf(t, actions, action, "Expected claim %v missing", i)
 			}
 			require.Len(t, actions, len(builder.ExpectedActions), "Incorrect number of actions")
@@ -203,7 +227,7 @@ func runStep(t *testing.T, solver *GameSolver, game types.Game, correctTraceProv
 
 	for i, action := range actions {
 		t.Logf("Move %v: Type: %v, ParentIdx: %v, Attack: %v, Value: %v, PreState: %v, ProofData: %v",
-			i, action.Type, action.ParentIdx, action.IsAttack, action.Value, hex.EncodeToString(action.PreState), hex.EncodeToString(action.ProofData))
+			i, action.Type, action.ParentClaim.ContractIndex, action.IsAttack, action.Value, hex.EncodeToString(action.PreState), hex.EncodeToString(action.ProofData))
 		// Check that every move the solver returns meets the generic validation rules
 		require.NoError(t, checkRules(game, action, correctTraceProvider), "Attempting to perform invalid action")
 	}
@@ -309,9 +333,9 @@ func applyActions(game types.Game, claimant common.Address, actions []types.Acti
 	for _, action := range actions {
 		switch action.Type {
 		case types.ActionTypeMove:
-			newPosition := action.ParentPosition.Attack()
+			newPosition := action.ParentClaim.Position.Attack()
 			if !action.IsAttack {
-				newPosition = action.ParentPosition.Defend()
+				newPosition = action.ParentClaim.Position.Defend()
 			}
 			claim := types.Claim{
 				ClaimData: types.ClaimData{
@@ -320,15 +344,14 @@ func applyActions(game types.Game, claimant common.Address, actions []types.Acti
 					Position: newPosition,
 				},
 				Claimant:            claimant,
-				Clock:               nil,
 				ContractIndex:       len(claims),
-				ParentContractIndex: action.ParentIdx,
+				ParentContractIndex: action.ParentClaim.ContractIndex,
 			}
 			claims = append(claims, claim)
 		case types.ActionTypeStep:
-			counteredClaim := claims[action.ParentIdx]
+			counteredClaim := claims[action.ParentClaim.ContractIndex]
 			counteredClaim.CounteredBy = claimant
-			claims[action.ParentIdx] = counteredClaim
+			claims[action.ParentClaim.ContractIndex] = counteredClaim
 		default:
 			panic(fmt.Errorf("unknown move type: %v", action.Type))
 		}
diff --git a/op-challenger/game/fault/solver/rules.go b/op-challenger/game/fault/solver/rules.go
index 5a77ca5869a5..5a6dba60b29c 100644
--- a/op-challenger/game/fault/solver/rules.go
+++ b/op-challenger/game/fault/solver/rules.go
@@ -46,8 +46,8 @@ func checkRules(game types.Game, action types.Action, correctTrace types.TracePr
 // parentMustExist checks that every action performed has a valid parent claim
 // Rationale: The action would be rejected by the contracts
 func parentMustExist(game types.Game, action types.Action, _ types.TraceProvider) error {
-	if len(game.Claims()) <= action.ParentIdx || action.ParentIdx < 0 {
-		return fmt.Errorf("parent claim %v does not exist in game with %v claims", action.ParentIdx, len(game.Claims()))
+	if len(game.Claims()) <= action.ParentClaim.ContractIndex || action.ParentClaim.ContractIndex < 0 {
+		return fmt.Errorf("parent claim %v does not exist in game with %v claims", action.ParentClaim.ContractIndex, len(game.Claims()))
 	}
 	return nil
 }
@@ -58,7 +58,7 @@ func onlyStepAtMaxDepth(game types.Game, action types.Action, _ types.TraceProvi
 	if action.Type == types.ActionTypeStep {
 		return nil
 	}
-	parentDepth := game.Claims()[action.ParentIdx].Position.Depth()
+	parentDepth := game.Claims()[action.ParentClaim.ContractIndex].Position.Depth()
 	if parentDepth >= game.MaxDepth() {
 		return fmt.Errorf("parent at max depth (%v) but attempting to perform %v action instead of step",
 			parentDepth, action.Type)
@@ -72,7 +72,7 @@ func onlyMoveBeforeMaxDepth(game types.Game, action types.Action, _ types.TraceP
 	if action.Type == types.ActionTypeMove {
 		return nil
 	}
-	parentDepth := game.Claims()[action.ParentIdx].Position.Depth()
+	parentDepth := game.Claims()[action.ParentClaim.ContractIndex].Position.Depth()
 	if parentDepth < game.MaxDepth() {
 		return fmt.Errorf("parent (%v) not at max depth (%v) but attempting to perform %v action instead of move",
 			parentDepth, game.MaxDepth(), action.Type)
@@ -87,7 +87,7 @@ func doNotDuplicateExistingMoves(game types.Game, action types.Action, _ types.T
 		Value:    action.Value,
 		Position: resultingPosition(game, action),
 	}
-	if game.IsDuplicate(types.Claim{ClaimData: newClaimData, ParentContractIndex: action.ParentIdx}) {
+	if game.IsDuplicate(types.Claim{ClaimData: newClaimData, ParentContractIndex: action.ParentClaim.ContractIndex}) {
 		return fmt.Errorf("creating duplicate claim at %v with value %v", newClaimData.Position.ToGIndex(), newClaimData.Value)
 	}
 	return nil
@@ -96,7 +96,7 @@ func doNotDuplicateExistingMoves(game types.Game, action types.Action, _ types.T
 // doNotStepAlreadyCounteredClaims checks the challenger does not attempt to call step on already countered claims
 // Rationale: The step call is redundant and a waste of gas
 func doNotStepAlreadyCounteredClaims(game types.Game, action types.Action, _ types.TraceProvider) error {
-	claim := game.Claims()[action.ParentIdx]
+	claim := game.Claims()[action.ParentClaim.ContractIndex]
 	if claim.CounteredBy != (common.Address{}) {
 		return fmt.Errorf("attempting to step already countered claim: %v", claim.ContractIndex)
 	}
@@ -106,8 +106,8 @@ func doNotStepAlreadyCounteredClaims(game types.Game, action types.Action, _ typ
 // doNotDefendRootClaim checks the challenger doesn't attempt to defend the root claim
 // Rationale: The action would be rejected by the contracts
 func doNotDefendRootClaim(game types.Game, action types.Action, _ types.TraceProvider) error {
-	if game.Claims()[action.ParentIdx].IsRootPosition() && !action.IsAttack {
-		return fmt.Errorf("defending the root claim at idx %v", action.ParentIdx)
+	if game.Claims()[action.ParentClaim.ContractIndex].IsRootPosition() && !action.IsAttack {
+		return fmt.Errorf("defending the root claim at idx %v", action.ParentClaim.ContractIndex)
 	}
 	return nil
 }
@@ -115,9 +115,9 @@ func doNotDefendRootClaim(game types.Game, action types.Action, _ types.TracePro
 // doNotCounterSelf checks the challenger doesn't counter its own claims
 // Rationale: The challenger should not disagree with itself
 func doNotCounterSelf(game types.Game, action types.Action, _ types.TraceProvider) error {
-	claim := game.Claims()[action.ParentIdx]
+	claim := game.Claims()[action.ParentClaim.ContractIndex]
 	if claim.Claimant == challengerAddr {
-		return fmt.Errorf("countering own claim at idx %v", action.ParentIdx)
+		return fmt.Errorf("countering own claim at idx %v", action.ParentClaim.ContractIndex)
 	}
 	return nil
 }
@@ -136,7 +136,7 @@ func avoidPoisonedPrestate(game types.Game, action types.Action, correctTrace ty
 	movePosition := resultingPosition(game, action)
 	honestTraceIndex := movePosition.TraceIndex(game.MaxDepth())
 	// Walk back up the claims and find the claim with highest trace index < honestTraceIndex
-	claim := game.Claims()[action.ParentIdx]
+	claim := game.Claims()[action.ParentClaim.ContractIndex]
 	var preStateClaim types.Claim
 	for {
 		ancestors += printClaim(claim, game) + "\n"
@@ -164,7 +164,7 @@ func avoidPoisonedPrestate(game types.Game, action types.Action, correctTrace ty
 		return fmt.Errorf("failed to get correct trace at position %v: %w", preStateClaim.Position, err)
 	}
 	if correctValue != preStateClaim.Value {
-		err = fmt.Errorf("prestate poisoned claim %v has invalid prestate and is left of honest claim countering %v at trace index %v", preStateClaim.ContractIndex, action.ParentIdx, honestTraceIndex)
+		err = fmt.Errorf("prestate poisoned claim %v has invalid prestate and is left of honest claim countering %v at trace index %v", preStateClaim.ContractIndex, action.ParentClaim.ContractIndex, honestTraceIndex)
 		return err
 	}
 	return nil
@@ -199,10 +199,10 @@ func detectFailedStep(game types.Game, action types.Action, correctTrace types.T
 		poststateIndex = new(big.Int).Add(honestTraceIndex, big.NewInt(1))
 	}
 	// Walk back up the claims and find the claim required post state index
-	claim := game.Claims()[action.ParentIdx]
+	claim := game.Claims()[action.ParentClaim.ContractIndex]
 	poststateClaim, ok := game.AncestorWithTraceIndex(claim, poststateIndex)
 	if !ok {
-		return fmt.Errorf("did not find required poststate at %v to counter claim %v", poststateIndex, action.ParentIdx)
+		return fmt.Errorf("did not find required poststate at %v to counter claim %v", poststateIndex, action.ParentClaim.ContractIndex)
 	}
 	correctValue, err := correctTrace.Get(context.Background(), poststateClaim.Position)
 	if err != nil {
@@ -212,7 +212,7 @@ func detectFailedStep(game types.Game, action types.Action, correctTrace types.T
 	parentPostAgree := (claim.Depth()-poststateClaim.Depth())%2 == 0
 	if parentPostAgree == validStep {
 		return fmt.Errorf("failed step against claim at %v using poststate from claim %v post state is correct? %v parentPostAgree? %v",
-			action.ParentIdx, poststateClaim.ContractIndex, validStep, parentPostAgree)
+			action.ParentClaim.ContractIndex, poststateClaim.ContractIndex, validStep, parentPostAgree)
 	}
 	return nil
 }
@@ -242,7 +242,7 @@ func detectPoisonedStepPrestate(game types.Game, action types.Action, correctTra
 		return nil
 	}
 	// Walk back up the claims and find the claim with highest trace index < honestTraceIndex
-	claim := game.Claims()[action.ParentIdx]
+	claim := game.Claims()[action.ParentClaim.ContractIndex]
 	preStateClaim, ok := game.AncestorWithTraceIndex(claim, prestateIndex)
 	if !ok {
 		return fmt.Errorf("performing step against claim %v with no prestate available at %v", claim.ContractIndex, prestateIndex)
@@ -253,9 +253,9 @@ func detectPoisonedStepPrestate(game types.Game, action types.Action, correctTra
 	}
 	if correctValue != preStateClaim.Value {
 		if action.Type == types.ActionTypeStep {
-			return fmt.Errorf("stepping from poisoned prestate at claim %v when countering %v", preStateClaim.ContractIndex, action.ParentIdx)
+			return fmt.Errorf("stepping from poisoned prestate at claim %v when countering %v", preStateClaim.ContractIndex, action.ParentClaim.ContractIndex)
 		} else {
-			return fmt.Errorf("posting leaf claim with poisoned prestate from claim %v when countering %v", preStateClaim.ContractIndex, action.ParentIdx)
+			return fmt.Errorf("posting leaf claim with poisoned prestate from claim %v when countering %v", preStateClaim.ContractIndex, action.ParentClaim.ContractIndex)
 		}
 	}
 	if action.Type == types.ActionTypeStep {
@@ -268,7 +268,7 @@ func detectPoisonedStepPrestate(game types.Game, action types.Action, correctTra
 }
 
 func resultingPosition(game types.Game, action types.Action) types.Position {
-	parentPos := game.Claims()[action.ParentIdx].Position
+	parentPos := game.Claims()[action.ParentClaim.ContractIndex].Position
 	if action.Type == types.ActionTypeStep {
 		return parentPos
 	}
diff --git a/op-challenger/game/fault/test/alphabet.go b/op-challenger/game/fault/test/alphabet.go
index 9aa129d221c8..96e00e90c654 100644
--- a/op-challenger/game/fault/test/alphabet.go
+++ b/op-challenger/game/fault/test/alphabet.go
@@ -9,11 +9,12 @@ import (
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 )
 
-func NewAlphabetWithProofProvider(t *testing.T, startingL2BlockNumber *big.Int, maxDepth types.Depth, oracleError error) *alphabetWithProofProvider {
-	return &alphabetWithProofProvider{
+func NewAlphabetWithProofProvider(t *testing.T, startingL2BlockNumber *big.Int, maxDepth types.Depth, oracleError error) *AlphabetWithProofProvider {
+	return &AlphabetWithProofProvider{
 		alphabet.NewTraceProvider(startingL2BlockNumber, maxDepth),
 		maxDepth,
 		oracleError,
+		nil,
 	}
 }
 
@@ -22,13 +23,14 @@ func NewAlphabetClaimBuilder(t *testing.T, startingL2BlockNumber *big.Int, maxDe
 	return NewClaimBuilder(t, maxDepth, alphabetProvider)
 }
 
-type alphabetWithProofProvider struct {
+type AlphabetWithProofProvider struct {
 	*alphabet.AlphabetTraceProvider
-	depth       types.Depth
-	OracleError error
+	depth            types.Depth
+	OracleError      error
+	L2BlockChallenge *types.InvalidL2BlockNumberChallenge
 }
 
-func (a *alphabetWithProofProvider) GetStepData(ctx context.Context, i types.Position) ([]byte, []byte, *types.PreimageOracleData, error) {
+func (a *AlphabetWithProofProvider) GetStepData(ctx context.Context, i types.Position) ([]byte, []byte, *types.PreimageOracleData, error) {
 	preimage, _, _, err := a.AlphabetTraceProvider.GetStepData(ctx, i)
 	if err != nil {
 		return nil, nil, nil, err
@@ -37,3 +39,11 @@ func (a *alphabetWithProofProvider) GetStepData(ctx context.Context, i types.Pos
 	data := types.NewPreimageOracleData([]byte{byte(traceIndex)}, []byte{byte(traceIndex - 1)}, uint32(traceIndex-1))
 	return preimage, []byte{byte(traceIndex - 1)}, data, nil
 }
+
+func (c *AlphabetWithProofProvider) GetL2BlockNumberChallenge(_ context.Context) (*types.InvalidL2BlockNumberChallenge, error) {
+	if c.L2BlockChallenge != nil {
+		return c.L2BlockChallenge, nil
+	} else {
+		return nil, types.ErrL2BlockNumberValid
+	}
+}
diff --git a/op-challenger/game/fault/test/claim_builder.go b/op-challenger/game/fault/test/claim_builder.go
index 36bfd1b4d8fc..982f001fb44d 100644
--- a/op-challenger/game/fault/test/claim_builder.go
+++ b/op-challenger/game/fault/test/claim_builder.go
@@ -2,8 +2,10 @@ package test
 
 import (
 	"context"
+	"math"
 	"math/big"
 	"testing"
+	"time"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum/go-ethereum/common"
@@ -13,14 +15,18 @@ import (
 var DefaultClaimant = common.Address{0xba, 0xdb, 0xad, 0xba, 0xdb, 0xad}
 
 type claimCfg struct {
-	value        common.Hash
-	invalidValue bool
-	claimant     common.Address
-	parentIdx    int
+	value          common.Hash
+	invalidValue   bool
+	claimant       common.Address
+	parentIdx      int
+	clockTimestamp time.Time
+	clockDuration  time.Duration
 }
 
 func newClaimCfg(opts ...ClaimOpt) *claimCfg {
-	cfg := &claimCfg{}
+	cfg := &claimCfg{
+		clockTimestamp: time.Unix(math.MaxInt64-1, 0),
+	}
 	for _, opt := range opts {
 		opt.Apply(cfg)
 	}
@@ -61,6 +67,13 @@ func WithParent(claim types.Claim) ClaimOpt {
 	})
 }
 
+func WithClock(timestamp time.Time, duration time.Duration) ClaimOpt {
+	return claimOptFn(func(cfg *claimCfg) {
+		cfg.clockTimestamp = timestamp
+		cfg.clockDuration = duration
+	})
+}
+
 // ClaimBuilder is a test utility to enable creating claims in a wide range of situations
 type ClaimBuilder struct {
 	require  *require.Assertions
@@ -123,6 +136,10 @@ func (c *ClaimBuilder) claim(pos types.Position, opts ...ClaimOpt) types.Claim {
 			Position: pos,
 		},
 		Claimant: DefaultClaimant,
+		Clock: types.Clock{
+			Duration:  cfg.clockDuration,
+			Timestamp: cfg.clockTimestamp,
+		},
 	}
 	if cfg.claimant != (common.Address{}) {
 		claim.Claimant = cfg.claimant
diff --git a/op-challenger/game/fault/test/game_builder.go b/op-challenger/game/fault/test/game_builder.go
index 331d59c60be0..d55d650c2e2c 100644
--- a/op-challenger/game/fault/test/game_builder.go
+++ b/op-challenger/game/fault/test/game_builder.go
@@ -102,11 +102,10 @@ func (s *GameBuilderSeq) ExpectAttack() *GameBuilderSeq {
 	newPos := s.lastClaim.Position.Attack()
 	value := s.builder.CorrectClaimAtPosition(newPos)
 	s.gameBuilder.ExpectedActions = append(s.gameBuilder.ExpectedActions, types.Action{
-		Type:           types.ActionTypeMove,
-		ParentIdx:      s.lastClaim.ContractIndex,
-		ParentPosition: s.lastClaim.Position,
-		IsAttack:       true,
-		Value:          value,
+		Type:        types.ActionTypeMove,
+		ParentClaim: s.lastClaim,
+		IsAttack:    true,
+		Value:       value,
 	})
 	return s
 }
@@ -115,11 +114,10 @@ func (s *GameBuilderSeq) ExpectDefend() *GameBuilderSeq {
 	newPos := s.lastClaim.Position.Defend()
 	value := s.builder.CorrectClaimAtPosition(newPos)
 	s.gameBuilder.ExpectedActions = append(s.gameBuilder.ExpectedActions, types.Action{
-		Type:           types.ActionTypeMove,
-		ParentIdx:      s.lastClaim.ContractIndex,
-		ParentPosition: s.lastClaim.Position,
-		IsAttack:       false,
-		Value:          value,
+		Type:        types.ActionTypeMove,
+		ParentClaim: s.lastClaim,
+		IsAttack:    false,
+		Value:       value,
 	})
 	return s
 }
@@ -127,13 +125,12 @@ func (s *GameBuilderSeq) ExpectDefend() *GameBuilderSeq {
 func (s *GameBuilderSeq) ExpectStepAttack() *GameBuilderSeq {
 	traceIdx := s.lastClaim.TraceIndex(s.builder.maxDepth)
 	s.gameBuilder.ExpectedActions = append(s.gameBuilder.ExpectedActions, types.Action{
-		Type:           types.ActionTypeStep,
-		ParentIdx:      s.lastClaim.ContractIndex,
-		ParentPosition: s.lastClaim.Position,
-		IsAttack:       true,
-		PreState:       s.builder.CorrectPreState(traceIdx),
-		ProofData:      s.builder.CorrectProofData(traceIdx),
-		OracleData:     s.builder.CorrectOracleData(traceIdx),
+		Type:        types.ActionTypeStep,
+		ParentClaim: s.lastClaim,
+		IsAttack:    true,
+		PreState:    s.builder.CorrectPreState(traceIdx),
+		ProofData:   s.builder.CorrectProofData(traceIdx),
+		OracleData:  s.builder.CorrectOracleData(traceIdx),
 	})
 	return s
 }
@@ -141,13 +138,12 @@ func (s *GameBuilderSeq) ExpectStepAttack() *GameBuilderSeq {
 func (s *GameBuilderSeq) ExpectStepDefend() *GameBuilderSeq {
 	traceIdx := new(big.Int).Add(s.lastClaim.TraceIndex(s.builder.maxDepth), big.NewInt(1))
 	s.gameBuilder.ExpectedActions = append(s.gameBuilder.ExpectedActions, types.Action{
-		Type:           types.ActionTypeStep,
-		ParentIdx:      s.lastClaim.ContractIndex,
-		ParentPosition: s.lastClaim.Position,
-		IsAttack:       false,
-		PreState:       s.builder.CorrectPreState(traceIdx),
-		ProofData:      s.builder.CorrectProofData(traceIdx),
-		OracleData:     s.builder.CorrectOracleData(traceIdx),
+		Type:        types.ActionTypeStep,
+		ParentClaim: s.lastClaim,
+		IsAttack:    false,
+		PreState:    s.builder.CorrectPreState(traceIdx),
+		ProofData:   s.builder.CorrectProofData(traceIdx),
+		OracleData:  s.builder.CorrectOracleData(traceIdx),
 	})
 	return s
 }
diff --git a/op-challenger/game/fault/trace/access.go b/op-challenger/game/fault/trace/access.go
index be42b6d81232..4afe6d5f9b6d 100644
--- a/op-challenger/game/fault/trace/access.go
+++ b/op-challenger/game/fault/trace/access.go
@@ -40,4 +40,12 @@ func (t *Accessor) GetStepData(ctx context.Context, game types.Game, ref types.C
 	return provider.GetStepData(ctx, pos)
 }
 
+func (t *Accessor) GetL2BlockNumberChallenge(ctx context.Context, game types.Game) (*types.InvalidL2BlockNumberChallenge, error) {
+	provider, err := t.selector(ctx, game, game.Claims()[0], types.RootPosition)
+	if err != nil {
+		return nil, err
+	}
+	return provider.GetL2BlockNumberChallenge(ctx)
+}
+
 var _ types.TraceAccessor = (*Accessor)(nil)
diff --git a/op-challenger/game/fault/trace/access_test.go b/op-challenger/game/fault/trace/access_test.go
index df63cabcf587..04c3ea3e6e7c 100644
--- a/op-challenger/game/fault/trace/access_test.go
+++ b/op-challenger/game/fault/trace/access_test.go
@@ -9,6 +9,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/test"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/alphabet"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/stretchr/testify/require"
 )
 
@@ -67,4 +68,32 @@ func TestAccessor_UsesSelector(t *testing.T) {
 		require.Equal(t, expectedProofData, actualProofData)
 		require.Equal(t, expectedPreimageData, actualPreimageData)
 	})
+
+	t.Run("GetL2BlockNumberChallenge", func(t *testing.T) {
+		provider := &ChallengeTraceProvider{
+			TraceProvider: provider1,
+		}
+		accessor := &Accessor{
+			selector: func(ctx context.Context, actualGame types.Game, ref types.Claim, pos types.Position) (types.TraceProvider, error) {
+				require.Equal(t, game, actualGame)
+				require.Equal(t, game.Claims()[0], ref)
+				require.Equal(t, types.RootPosition, pos)
+				return provider, nil
+			},
+		}
+		challenge, err := accessor.GetL2BlockNumberChallenge(ctx, game)
+		require.NoError(t, err)
+		require.NotNil(t, challenge)
+		require.Equal(t, eth.Bytes32{0xaa, 0xbb}, challenge.Output.OutputRoot)
+	})
+}
+
+type ChallengeTraceProvider struct {
+	types.TraceProvider
+}
+
+func (c *ChallengeTraceProvider) GetL2BlockNumberChallenge(_ context.Context) (*types.InvalidL2BlockNumberChallenge, error) {
+	return &types.InvalidL2BlockNumberChallenge{
+		Output: ð.OutputResponse{OutputRoot: eth.Bytes32{0xaa, 0xbb}},
+	}, nil
 }
diff --git a/op-challenger/game/fault/trace/alphabet/provider.go b/op-challenger/game/fault/trace/alphabet/provider.go
index 6cae7154ed76..f14a8e94f48a 100644
--- a/op-challenger/game/fault/trace/alphabet/provider.go
+++ b/op-challenger/game/fault/trace/alphabet/provider.go
@@ -75,6 +75,10 @@ func (ap *AlphabetTraceProvider) Get(ctx context.Context, i types.Position) (com
 	return alphabetStateHash(claimBytes), nil
 }
 
+func (ap *AlphabetTraceProvider) GetL2BlockNumberChallenge(_ context.Context) (*types.InvalidL2BlockNumberChallenge, error) {
+	return nil, types.ErrL2BlockNumberValid
+}
+
 // BuildAlphabetPreimage constructs the claim bytes for the index and claim.
 func BuildAlphabetPreimage(traceIndex *big.Int, claim *big.Int) []byte {
 	return append(traceIndex.FillBytes(make([]byte, 32)), claim.FillBytes(make([]byte, 32))...)
diff --git a/op-challenger/game/fault/trace/asterisc/executor.go b/op-challenger/game/fault/trace/asterisc/executor.go
new file mode 100644
index 000000000000..b84d5e444568
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/executor.go
@@ -0,0 +1,127 @@
+package asterisc
+
+import (
+	"context"
+	"fmt"
+	"math"
+	"os"
+	"path/filepath"
+	"strconv"
+	"strings"
+	"time"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/config"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
+	"github.com/ethereum/go-ethereum/log"
+)
+
+type Executor struct {
+	logger           log.Logger
+	metrics          AsteriscMetricer
+	l1               string
+	l1Beacon         string
+	l2               string
+	inputs           utils.LocalGameInputs
+	asterisc         string
+	server           string
+	network          string
+	rollupConfig     string
+	l2Genesis        string
+	absolutePreState string
+	snapshotFreq     uint
+	infoFreq         uint
+	selectSnapshot   utils.SnapshotSelect
+	cmdExecutor      utils.CmdExecutor
+}
+
+func NewExecutor(logger log.Logger, m AsteriscMetricer, cfg *config.Config, prestate string, inputs utils.LocalGameInputs) *Executor {
+	return &Executor{
+		logger:           logger,
+		metrics:          m,
+		l1:               cfg.L1EthRpc,
+		l1Beacon:         cfg.L1Beacon,
+		l2:               cfg.L2Rpc,
+		inputs:           inputs,
+		asterisc:         cfg.AsteriscBin,
+		server:           cfg.AsteriscServer,
+		network:          cfg.AsteriscNetwork,
+		rollupConfig:     cfg.AsteriscRollupConfigPath,
+		l2Genesis:        cfg.AsteriscL2GenesisPath,
+		absolutePreState: prestate,
+		snapshotFreq:     cfg.AsteriscSnapshotFreq,
+		infoFreq:         cfg.AsteriscInfoFreq,
+		selectSnapshot:   utils.FindStartingSnapshot,
+		cmdExecutor:      utils.RunCmd,
+	}
+}
+
+// GenerateProof executes asterisc to generate a proof at the specified trace index.
+// The proof is stored at the specified directory.
+func (e *Executor) GenerateProof(ctx context.Context, dir string, i uint64) error {
+	return e.generateProof(ctx, dir, i, i)
+}
+
+// generateProof executes asterisc from the specified starting trace index until the end trace index.
+// The proof is stored at the specified directory.
+func (e *Executor) generateProof(ctx context.Context, dir string, begin uint64, end uint64, extraAsteriscArgs ...string) error {
+	snapshotDir := filepath.Join(dir, utils.SnapsDir)
+	start, err := e.selectSnapshot(e.logger, snapshotDir, e.absolutePreState, begin)
+	if err != nil {
+		return fmt.Errorf("find starting snapshot: %w", err)
+	}
+	proofDir := filepath.Join(dir, proofsDir)
+	dataDir := utils.PreimageDir(dir)
+	lastGeneratedState := filepath.Join(dir, utils.FinalState)
+	args := []string{
+		"run",
+		"--input", start,
+		"--output", lastGeneratedState,
+		"--meta", "",
+		"--info-at", "%" + strconv.FormatUint(uint64(e.infoFreq), 10),
+		"--proof-at", "=" + strconv.FormatUint(end, 10),
+		"--proof-fmt", filepath.Join(proofDir, "%d.json.gz"),
+		"--snapshot-at", "%" + strconv.FormatUint(uint64(e.snapshotFreq), 10),
+		"--snapshot-fmt", filepath.Join(snapshotDir, "%d.json.gz"),
+	}
+	if end < math.MaxUint64 {
+		args = append(args, "--stop-at", "="+strconv.FormatUint(end+1, 10))
+	}
+	args = append(args, extraAsteriscArgs...)
+	args = append(args,
+		"--",
+		e.server, "--server",
+		"--l1", e.l1,
+		"--l1.beacon", e.l1Beacon,
+		"--l2", e.l2,
+		"--datadir", dataDir,
+		"--l1.head", e.inputs.L1Head.Hex(),
+		"--l2.head", e.inputs.L2Head.Hex(),
+		"--l2.outputroot", e.inputs.L2OutputRoot.Hex(),
+		"--l2.claim", e.inputs.L2Claim.Hex(),
+		"--l2.blocknumber", e.inputs.L2BlockNumber.Text(10),
+	)
+	if e.network != "" {
+		args = append(args, "--network", e.network)
+	}
+	if e.rollupConfig != "" {
+		args = append(args, "--rollup.config", e.rollupConfig)
+	}
+	if e.l2Genesis != "" {
+		args = append(args, "--l2.genesis", e.l2Genesis)
+	}
+
+	if err := os.MkdirAll(snapshotDir, 0755); err != nil {
+		return fmt.Errorf("could not create snapshot directory %v: %w", snapshotDir, err)
+	}
+	if err := os.MkdirAll(dataDir, 0755); err != nil {
+		return fmt.Errorf("could not create preimage cache directory %v: %w", dataDir, err)
+	}
+	if err := os.MkdirAll(proofDir, 0755); err != nil {
+		return fmt.Errorf("could not create proofs directory %v: %w", proofDir, err)
+	}
+	e.logger.Info("Generating trace", "proof", end, "cmd", e.asterisc, "args", strings.Join(args, ", "))
+	execStart := time.Now()
+	err = e.cmdExecutor(ctx, e.logger.New("proof", end), e.asterisc, args...)
+	e.metrics.RecordAsteriscExecutionTime(time.Since(execStart).Seconds())
+	return err
+}
diff --git a/op-challenger/game/fault/trace/asterisc/executor_test.go b/op-challenger/game/fault/trace/asterisc/executor_test.go
new file mode 100644
index 000000000000..7ce44f304375
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/executor_test.go
@@ -0,0 +1,135 @@
+package asterisc
+
+import (
+	"context"
+	"math"
+	"math/big"
+	"path/filepath"
+	"testing"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/config"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
+	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/stretchr/testify/require"
+)
+
+func TestGenerateProof(t *testing.T) {
+	input := "starting.json"
+	tempDir := t.TempDir()
+	dir := filepath.Join(tempDir, "gameDir")
+	cfg := config.NewConfig(common.Address{0xbb}, "http://localhost:8888", "http://localhost:9000", "http://localhost:9096", "http://localhost:9095", tempDir, config.TraceTypeAsterisc)
+	cfg.L2Rpc = "http://localhost:9999"
+	prestate := "pre.json"
+	cfg.AsteriscBin = "./bin/asterisc"
+	cfg.AsteriscServer = "./bin/op-program"
+	cfg.AsteriscSnapshotFreq = 500
+	cfg.AsteriscInfoFreq = 900
+
+	inputs := utils.LocalGameInputs{
+		L1Head:        common.Hash{0x11},
+		L2Head:        common.Hash{0x22},
+		L2OutputRoot:  common.Hash{0x33},
+		L2Claim:       common.Hash{0x44},
+		L2BlockNumber: big.NewInt(3333),
+	}
+	captureExec := func(t *testing.T, cfg config.Config, proofAt uint64) (string, string, map[string]string) {
+		m := &asteriscDurationMetrics{}
+		executor := NewExecutor(testlog.Logger(t, log.LevelInfo), m, &cfg, prestate, inputs)
+		executor.selectSnapshot = func(logger log.Logger, dir string, absolutePreState string, i uint64) (string, error) {
+			return input, nil
+		}
+		var binary string
+		var subcommand string
+		args := make(map[string]string)
+		executor.cmdExecutor = func(ctx context.Context, l log.Logger, b string, a ...string) error {
+			binary = b
+			subcommand = a[0]
+			for i := 1; i < len(a); {
+				if a[i] == "--" {
+					// Skip over the divider between asterisc and server program
+					i += 1
+					continue
+				}
+				args[a[i]] = a[i+1]
+				i += 2
+			}
+			return nil
+		}
+		err := executor.GenerateProof(context.Background(), dir, proofAt)
+		require.NoError(t, err)
+		require.Equal(t, 1, m.executionTimeRecordCount, "Should record asterisc execution time")
+		return binary, subcommand, args
+	}
+
+	t.Run("Network", func(t *testing.T) {
+		cfg.AsteriscNetwork = "mainnet"
+		cfg.AsteriscRollupConfigPath = ""
+		cfg.AsteriscL2GenesisPath = ""
+		binary, subcommand, args := captureExec(t, cfg, 150_000_000)
+		require.DirExists(t, filepath.Join(dir, utils.PreimagesDir))
+		require.DirExists(t, filepath.Join(dir, proofsDir))
+		require.DirExists(t, filepath.Join(dir, utils.SnapsDir))
+		require.Equal(t, cfg.AsteriscBin, binary)
+		require.Equal(t, "run", subcommand)
+		require.Equal(t, input, args["--input"])
+		require.Contains(t, args, "--meta")
+		require.Equal(t, "", args["--meta"])
+		require.Equal(t, filepath.Join(dir, utils.FinalState), args["--output"])
+		require.Equal(t, "=150000000", args["--proof-at"])
+		require.Equal(t, "=150000001", args["--stop-at"])
+		require.Equal(t, "%500", args["--snapshot-at"])
+		require.Equal(t, "%900", args["--info-at"])
+		// Slight quirk of how we pair off args
+		// The server binary winds up as the key and the first arg --server as the value which has no value
+		// Then everything else pairs off correctly again
+		require.Equal(t, "--server", args[cfg.AsteriscServer])
+		require.Equal(t, cfg.L1EthRpc, args["--l1"])
+		require.Equal(t, cfg.L1Beacon, args["--l1.beacon"])
+		require.Equal(t, cfg.L2Rpc, args["--l2"])
+		require.Equal(t, filepath.Join(dir, utils.PreimagesDir), args["--datadir"])
+		require.Equal(t, filepath.Join(dir, proofsDir, "%d.json.gz"), args["--proof-fmt"])
+		require.Equal(t, filepath.Join(dir, utils.SnapsDir, "%d.json.gz"), args["--snapshot-fmt"])
+		require.Equal(t, cfg.AsteriscNetwork, args["--network"])
+		require.NotContains(t, args, "--rollup.config")
+		require.NotContains(t, args, "--l2.genesis")
+
+		// Local game inputs
+		require.Equal(t, inputs.L1Head.Hex(), args["--l1.head"])
+		require.Equal(t, inputs.L2Head.Hex(), args["--l2.head"])
+		require.Equal(t, inputs.L2OutputRoot.Hex(), args["--l2.outputroot"])
+		require.Equal(t, inputs.L2Claim.Hex(), args["--l2.claim"])
+		require.Equal(t, "3333", args["--l2.blocknumber"])
+	})
+
+	t.Run("RollupAndGenesis", func(t *testing.T) {
+		cfg.AsteriscNetwork = ""
+		cfg.AsteriscRollupConfigPath = "rollup.json"
+		cfg.AsteriscL2GenesisPath = "genesis.json"
+		_, _, args := captureExec(t, cfg, 150_000_000)
+		require.NotContains(t, args, "--network")
+		require.Equal(t, cfg.AsteriscRollupConfigPath, args["--rollup.config"])
+		require.Equal(t, cfg.AsteriscL2GenesisPath, args["--l2.genesis"])
+	})
+
+	t.Run("NoStopAtWhenProofIsMaxUInt", func(t *testing.T) {
+		cfg.AsteriscNetwork = "mainnet"
+		cfg.AsteriscRollupConfigPath = "rollup.json"
+		cfg.AsteriscL2GenesisPath = "genesis.json"
+		_, _, args := captureExec(t, cfg, math.MaxUint64)
+		// stop-at would need to be one more than the proof step which would overflow back to 0
+		// so expect that it will be omitted. We'll ultimately want asterisc to execute until the program exits.
+		require.NotContains(t, args, "--stop-at")
+	})
+}
+
+type asteriscDurationMetrics struct {
+	metrics.NoopMetricsImpl
+	executionTimeRecordCount int
+}
+
+func (c *asteriscDurationMetrics) RecordAsteriscExecutionTime(_ float64) {
+	c.executionTimeRecordCount++
+}
diff --git a/op-challenger/game/fault/trace/asterisc/prestate.go b/op-challenger/game/fault/trace/asterisc/prestate.go
new file mode 100644
index 000000000000..64165edabc5d
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/prestate.go
@@ -0,0 +1,41 @@
+package asterisc
+
+import (
+	"context"
+	"fmt"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum/go-ethereum/common"
+)
+
+var _ types.PrestateProvider = (*AsteriscPreStateProvider)(nil)
+
+type AsteriscPreStateProvider struct {
+	prestate string
+
+	prestateCommitment common.Hash
+}
+
+func NewPrestateProvider(prestate string) *AsteriscPreStateProvider {
+	return &AsteriscPreStateProvider{prestate: prestate}
+}
+
+func (p *AsteriscPreStateProvider) absolutePreState() (*VMState, error) {
+	state, err := parseState(p.prestate)
+	if err != nil {
+		return nil, fmt.Errorf("cannot load absolute pre-state: %w", err)
+	}
+	return state, nil
+}
+
+func (p *AsteriscPreStateProvider) AbsolutePreStateCommitment(_ context.Context) (common.Hash, error) {
+	if p.prestateCommitment != (common.Hash{}) {
+		return p.prestateCommitment, nil
+	}
+	state, err := p.absolutePreState()
+	if err != nil {
+		return common.Hash{}, fmt.Errorf("cannot load absolute pre-state: %w", err)
+	}
+	p.prestateCommitment = state.StateHash
+	return state.StateHash, nil
+}
diff --git a/op-challenger/game/fault/trace/asterisc/prestate_test.go b/op-challenger/game/fault/trace/asterisc/prestate_test.go
new file mode 100644
index 000000000000..38bc6d360e7b
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/prestate_test.go
@@ -0,0 +1,59 @@
+package asterisc
+
+import (
+	"context"
+	"os"
+	"path/filepath"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+func newAsteriscPrestateProvider(dataDir string, prestate string) *AsteriscPreStateProvider {
+	return &AsteriscPreStateProvider{
+		prestate: filepath.Join(dataDir, prestate),
+	}
+}
+
+func TestAbsolutePreStateCommitment(t *testing.T) {
+	dataDir := t.TempDir()
+
+	prestate := "state.json"
+
+	t.Run("StateUnavailable", func(t *testing.T) {
+		provider := newAsteriscPrestateProvider("/dir/does/not/exist", prestate)
+		_, err := provider.AbsolutePreStateCommitment(context.Background())
+		require.ErrorIs(t, err, os.ErrNotExist)
+	})
+
+	t.Run("InvalidStateFile", func(t *testing.T) {
+		setupPreState(t, dataDir, "invalid.json")
+		provider := newAsteriscPrestateProvider(dataDir, prestate)
+		_, err := provider.AbsolutePreStateCommitment(context.Background())
+		require.ErrorContains(t, err, "invalid asterisc VM state")
+	})
+
+	t.Run("CacheAbsolutePreState", func(t *testing.T) {
+		setupPreState(t, dataDir, prestate)
+		provider := newAsteriscPrestateProvider(dataDir, prestate)
+		first, err := provider.AbsolutePreStateCommitment(context.Background())
+		require.NoError(t, err)
+
+		// Remove the prestate from disk
+		require.NoError(t, os.Remove(provider.prestate))
+
+		// Value should still be available from cache
+		cached, err := provider.AbsolutePreStateCommitment(context.Background())
+		require.NoError(t, err)
+		require.Equal(t, first, cached)
+	})
+}
+
+func setupPreState(t *testing.T, dataDir string, filename string) {
+	srcDir := filepath.Join("test_data")
+	path := filepath.Join(srcDir, filename)
+	file, err := testData.ReadFile(path)
+	require.NoErrorf(t, err, "reading %v", path)
+	err = os.WriteFile(filepath.Join(dataDir, "state.json"), file, 0o644)
+	require.NoErrorf(t, err, "writing %v", path)
+}
diff --git a/op-challenger/game/fault/trace/asterisc/provider.go b/op-challenger/game/fault/trace/asterisc/provider.go
new file mode 100644
index 000000000000..cc64ff654719
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/provider.go
@@ -0,0 +1,211 @@
+package asterisc
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"math"
+	"os"
+	"path/filepath"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/config"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
+	"github.com/ethereum-optimism/optimism/op-service/ioutil"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/log"
+)
+
+const (
+	proofsDir      = "proofs"
+	diskStateCache = "state.json.gz"
+)
+
+type AsteriscMetricer interface {
+	RecordAsteriscExecutionTime(t float64)
+}
+
+type AsteriscTraceProvider struct {
+	logger         log.Logger
+	dir            string
+	prestate       string
+	generator      utils.ProofGenerator
+	gameDepth      types.Depth
+	preimageLoader *utils.PreimageLoader
+
+	types.PrestateProvider
+
+	// lastStep stores the last step in the actual trace if known. 0 indicates unknown.
+	// Cached as an optimisation to avoid repeatedly attempting to execute beyond the end of the trace.
+	lastStep uint64
+}
+
+func NewTraceProvider(logger log.Logger, m AsteriscMetricer, cfg *config.Config, prestateProvider types.PrestateProvider, asteriscPrestate string, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *AsteriscTraceProvider {
+	return &AsteriscTraceProvider{
+		logger:           logger,
+		dir:              dir,
+		prestate:         asteriscPrestate,
+		generator:        NewExecutor(logger, m, cfg, asteriscPrestate, localInputs),
+		gameDepth:        gameDepth,
+		preimageLoader:   utils.NewPreimageLoader(kvstore.NewDiskKV(utils.PreimageDir(dir)).Get),
+		PrestateProvider: prestateProvider,
+	}
+}
+
+func (p *AsteriscTraceProvider) Get(ctx context.Context, pos types.Position) (common.Hash, error) {
+	traceIndex := pos.TraceIndex(p.gameDepth)
+	if !traceIndex.IsUint64() {
+		return common.Hash{}, errors.New("trace index out of bounds")
+	}
+	proof, err := p.loadProof(ctx, traceIndex.Uint64())
+	if err != nil {
+		return common.Hash{}, err
+	}
+	value := proof.ClaimValue
+
+	if value == (common.Hash{}) {
+		return common.Hash{}, errors.New("proof missing post hash")
+	}
+	return value, nil
+}
+
+func (p *AsteriscTraceProvider) GetStepData(ctx context.Context, pos types.Position) ([]byte, []byte, *types.PreimageOracleData, error) {
+	traceIndex := pos.TraceIndex(p.gameDepth)
+	if !traceIndex.IsUint64() {
+		return nil, nil, nil, errors.New("trace index out of bounds")
+	}
+	proof, err := p.loadProof(ctx, traceIndex.Uint64())
+	if err != nil {
+		return nil, nil, nil, err
+	}
+	value := ([]byte)(proof.StateData)
+	if len(value) == 0 {
+		return nil, nil, nil, errors.New("proof missing state data")
+	}
+	data := ([]byte)(proof.ProofData)
+	if data == nil {
+		return nil, nil, nil, errors.New("proof missing proof data")
+	}
+	oracleData, err := p.preimageLoader.LoadPreimage(proof)
+	if err != nil {
+		return nil, nil, nil, fmt.Errorf("failed to load preimage: %w", err)
+	}
+	return value, data, oracleData, nil
+}
+
+func (p *AsteriscTraceProvider) GetL2BlockNumberChallenge(_ context.Context) (*types.InvalidL2BlockNumberChallenge, error) {
+	return nil, types.ErrL2BlockNumberValid
+}
+
+// loadProof will attempt to load or generate the proof data at the specified index
+// If the requested index is beyond the end of the actual trace it is extended with no-op instructions.
+func (p *AsteriscTraceProvider) loadProof(ctx context.Context, i uint64) (*utils.ProofData, error) {
+	// Attempt to read the last step from disk cache
+	if p.lastStep == 0 {
+		step, err := utils.ReadLastStep(p.dir)
+		if err != nil {
+			p.logger.Warn("Failed to read last step from disk cache", "err", err)
+		} else {
+			p.lastStep = step
+		}
+	}
+	// If the last step is tracked, set i to the last step to generate or load the final proof
+	if p.lastStep != 0 && i > p.lastStep {
+		i = p.lastStep
+	}
+	path := filepath.Join(p.dir, proofsDir, fmt.Sprintf("%d.json.gz", i))
+	file, err := ioutil.OpenDecompressed(path)
+	if errors.Is(err, os.ErrNotExist) {
+		if err := p.generator.GenerateProof(ctx, p.dir, i); err != nil {
+			return nil, fmt.Errorf("generate asterisc trace with proof at %v: %w", i, err)
+		}
+		// Try opening the file again now and it should exist.
+		file, err = ioutil.OpenDecompressed(path)
+		if errors.Is(err, os.ErrNotExist) {
+			// Expected proof wasn't generated, check if we reached the end of execution
+			state, err := p.finalState()
+			if err != nil {
+				return nil, err
+			}
+			if state.Exited && state.Step <= i {
+				p.logger.Warn("Requested proof was after the program exited", "proof", i, "last", state.Step)
+				// The final instruction has already been applied to this state, so the last step we can execute
+				// is one before its Step value.
+				p.lastStep = state.Step - 1
+				// Extend the trace out to the full length using a no-op instruction that doesn't change any state
+				// No execution is done, so no proof-data or oracle values are required.
+				proof := &utils.ProofData{
+					ClaimValue:   state.StateHash,
+					StateData:    state.Witness,
+					ProofData:    []byte{},
+					OracleKey:    nil,
+					OracleValue:  nil,
+					OracleOffset: 0,
+				}
+				if err := utils.WriteLastStep(p.dir, proof, p.lastStep); err != nil {
+					p.logger.Warn("Failed to write last step to disk cache", "step", p.lastStep)
+				}
+				return proof, nil
+			} else {
+				return nil, fmt.Errorf("expected proof not generated but final state was not exited, requested step %v, final state at step %v", i, state.Step)
+			}
+		}
+	}
+	if err != nil {
+		return nil, fmt.Errorf("cannot open proof file (%v): %w", path, err)
+	}
+	defer file.Close()
+	var proof utils.ProofData
+	err = json.NewDecoder(file).Decode(&proof)
+	if err != nil {
+		return nil, fmt.Errorf("failed to read proof (%v): %w", path, err)
+	}
+	return &proof, nil
+}
+
+func (c *AsteriscTraceProvider) finalState() (*VMState, error) {
+	state, err := parseState(filepath.Join(c.dir, utils.FinalState))
+	if err != nil {
+		return nil, fmt.Errorf("cannot read final state: %w", err)
+	}
+	return state, nil
+}
+
+// AsteriscTraceProviderForTest is a AsteriscTraceProvider that can find the step referencing the preimage read
+// Only to be used for testing
+type AsteriscTraceProviderForTest struct {
+	*AsteriscTraceProvider
+}
+
+func NewTraceProviderForTest(logger log.Logger, m AsteriscMetricer, cfg *config.Config, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *AsteriscTraceProviderForTest {
+	p := &AsteriscTraceProvider{
+		logger:         logger,
+		dir:            dir,
+		prestate:       cfg.AsteriscAbsolutePreState,
+		generator:      NewExecutor(logger, m, cfg, cfg.AsteriscNetwork, localInputs),
+		gameDepth:      gameDepth,
+		preimageLoader: utils.NewPreimageLoader(kvstore.NewDiskKV(utils.PreimageDir(dir)).Get),
+	}
+	return &AsteriscTraceProviderForTest{p}
+}
+
+func (p *AsteriscTraceProviderForTest) FindStep(ctx context.Context, start uint64, preimage utils.PreimageOpt) (uint64, error) {
+	// Run asterisc to find the step that meets the preimage conditions
+	if err := p.generator.(*Executor).generateProof(ctx, p.dir, start, math.MaxUint64, preimage()...); err != nil {
+		return 0, fmt.Errorf("generate asterisc trace (until preimage read): %w", err)
+	}
+	// Load the step from the state asterisc finished with
+	state, err := p.finalState()
+	if err != nil {
+		return 0, fmt.Errorf("failed to load final state: %w", err)
+	}
+	// Check we didn't get to the end of the trace without finding the preimage read we were looking for
+	if state.Exited {
+		return 0, fmt.Errorf("preimage read not found: %w", io.EOF)
+	}
+	// The state is the post-state so the step we want to execute to read the preimage is step - 1.
+	return state.Step - 1, nil
+}
diff --git a/op-challenger/game/fault/trace/asterisc/provider_test.go b/op-challenger/game/fault/trace/asterisc/provider_test.go
new file mode 100644
index 000000000000..950a5ad70375
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/provider_test.go
@@ -0,0 +1,260 @@
+package asterisc
+
+import (
+	"context"
+	"embed"
+	"encoding/json"
+	"fmt"
+	"math"
+	"math/big"
+	"os"
+	"path/filepath"
+	"testing"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum-optimism/optimism/op-service/ioutil"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/stretchr/testify/require"
+)
+
+//go:embed test_data
+var testData embed.FS
+
+func PositionFromTraceIndex(provider *AsteriscTraceProvider, idx *big.Int) types.Position {
+	return types.NewPosition(provider.gameDepth, idx)
+}
+
+func TestGet(t *testing.T) {
+	dataDir, prestate := setupTestData(t)
+	t.Run("ExistingProof", func(t *testing.T) {
+		provider, generator := setupWithTestData(t, dataDir, prestate)
+		value, err := provider.Get(context.Background(), PositionFromTraceIndex(provider, common.Big0))
+		require.NoError(t, err)
+		require.Equal(t, common.HexToHash("0x034689707b571db46b32c9e433def18e648f4e1fa9e5abd4012e7913031bfc10"), value)
+		require.Empty(t, generator.generated)
+	})
+
+	t.Run("ErrorsTraceIndexOutOfBounds", func(t *testing.T) {
+		provider, generator := setupWithTestData(t, dataDir, prestate)
+		largePosition := PositionFromTraceIndex(provider, new(big.Int).Mul(new(big.Int).SetUint64(math.MaxUint64), big.NewInt(2)))
+		_, err := provider.Get(context.Background(), largePosition)
+		require.ErrorContains(t, err, "trace index out of bounds")
+		require.Empty(t, generator.generated)
+	})
+
+	t.Run("MissingPostHash", func(t *testing.T) {
+		provider, generator := setupWithTestData(t, dataDir, prestate)
+		_, err := provider.Get(context.Background(), PositionFromTraceIndex(provider, big.NewInt(1)))
+		require.ErrorContains(t, err, "missing post hash")
+		require.Empty(t, generator.generated)
+	})
+
+	t.Run("IgnoreUnknownFields", func(t *testing.T) {
+		provider, generator := setupWithTestData(t, dataDir, prestate)
+		value, err := provider.Get(context.Background(), PositionFromTraceIndex(provider, big.NewInt(2)))
+		require.NoError(t, err)
+		expected := common.HexToHash("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
+		require.Equal(t, expected, value)
+		require.Empty(t, generator.generated)
+	})
+}
+
+func TestGetStepData(t *testing.T) {
+	t.Run("ExistingProof", func(t *testing.T) {
+		dataDir, prestate := setupTestData(t)
+		provider, generator := setupWithTestData(t, dataDir, prestate)
+		value, proof, data, err := provider.GetStepData(context.Background(), PositionFromTraceIndex(provider, common.Big0))
+		require.NoError(t, err)
+		expected := common.FromHex("0x354cfaf28a5b60c3f64f22f9f171b64aa067f90c6de6c96f725f44c5cf9f8ac1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080e080000000000000000000000007f0000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
+		require.Equal(t, expected, value)
+		expectedProof := common.FromHex("0x000000000000000003350100930581006f00800100000000970f000067800f01000000000000000097c2ffff938282676780020000000000032581009308e0050e1893682c323d6695396f1122b3cb562af8c65cab19978c9246434fda0536c90ca1cfabf684ebce3ad9fbd54000a2b258f8d0e447c1bb6f7e97de47aadfc12cd7b6f466bfd024daa905886c5f638f4692d843709e6c1c0d9eb2e251c626d53d15e04b59735fe0781bc4357a4243fbc28e6981902a8c2669a2d6456f7a964423db5d1585da978861f8b84067654b29490275c82b54083ee09c82eb7aa9ae693911226bb8297ad82c0963ae943f22d0c6086f4f14437e4d1c87ceb17e68caf5eaec77f14b46225b417d2191ca7b49564c896836a95ad4e9c383bd1c8ff9d8e888c64fb3836daa9535e58372e9646b7b144219980a4389aca5da241c3ec11fbc9297bd7a94ac671ccec288604c23a0072b0c1ed069198959cacdc2574aff65b7eceffc391e21778a1775deceb3ec0990836df98d98a4f3f0dc854587230fbf59e4daa60e8240d74caf90f7e2cd014c1d5d707b2e44269d9a9caf133882fe1ebb2f4237f6282abe89639b357e9231418d0c41373229ae9edfa6815bec484cb79772c9e2a7d80912123558f79b539bb45d435f2a4446970f1e2123494740285cec3491b0a41a9fd7403bdc8cd239a87508039a77b48ee39a951a8bd196b583de2b93444aafd456d0cd92050fa6a816d5183c1d75e96df540c8ac3bb8638b971f0cf3fb5b4a321487a1c8992b921de110f3d5bbb87369b25fe743ad7e789ca52d9f9fe62ccb103b78fe65eaa2cd47895022c590639c8f0c6a3999d8a5c71ed94d355815851b479f8d93eae90822294c96b39724b33491f8497b0bf7e1b995b37e4d759ff8a7958d194da6e00c475a6ddcf6efcb5fb4bb383c9b273da18d01e000dbe9c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd95a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3774df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618db8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea32293237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d7358448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a927ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757bf558bebd2ceec7f3c5dce04a4782f88c2c6036ae78ee206d0bc5289d20461a2e21908c2968c0699040a6fd866a577a99a9d2ec88745c815fd4a472c789244daae824d72ddc272aab68a8c3022e36f10454437c1886f3ff9927b64f232df414f27e429a4bef3083bc31a671d046ea5c1f5b8c3094d72868d9dfdc12c7334ac5f743cc5c365a9a6a15c1f240ac25880c7a9d1de290696cb766074a1d83d9278164adcf616c3bfabf63999a01966c998b7bb572774035a63ead49da73b5987f34775786645d0c5dd7c04a2f8a75dcae085213652f5bce3ea8b9b9bedd1cab3c5e9b88b152c9b8a7b79637d35911848b0c41e7cc7cca2ab4fe9a15f9c38bb4bb9390c4e2d8ce834ffd7a6cd85d7113d4521abb857774845c4291e6f6d010d97e3185bc799d83e3bb31501b3da786680df30fbc18eb41cbce611e8c0e9c72f69571ca10d3ef857d04d9c03ead7c6317d797a090fa1271ad9c7addfbcb412e9643d4fb33b1809c42623f474055fa9400a2027a7a885c8dfa4efe20666b4ee27d7529c134d7f28d53f175f6bf4b62faa2110d5b76f0f770c15e628181c1fcc18f970a9c34d24b2fc8c50ca9c07a7156ef4e5ff4bdf002eda0b11c1d359d0b59a54680704dbb9db631457879b27e0dfdbe50158fd9cf9b4cf77605c4ac4c95bd65fc9f6f9295a686647cb999090819cda700820c282c613cedcd218540bbc6f37b01c6567c4a1ea624f092a3a5cca2d6f0f0db231972fce627f0ecca0dee60f17551c5f8fdaeb5ab560b2ceb781cdb339361a0fbee1b9dffad59115138c8d6a70dda9ccc1bf0bbdd7fee15764845db875f6432559ff8dbc9055324431bc34e5b93d15da307317849eccd90c0c7b98870b9317c15a5959dcfb84c76dcc908c4fe6ba92126339bf06e458f6646df5e83ba7c3d35bc263b3222c8e9040068847749ca8e8f95045e4342aeb521eb3a5587ec268ed3aa6faf32b62b0bc41a9d549521f406fc3ec7d4dabb75e0d3e144d7cc882372d13746b6dcd481b1b229bcaec9f7422cdfb84e35c5d92171376cae5c86300822d729cd3a8479583bef09527027dba5f11263c5cbbeb3834b7a5c1cba9aa5fee0c95ec3f17a33ec3d8047fff799187f5ae2040bbe913c226c34c9fbe4389dd728984257a816892b3cae3e43191dd291f0eb50000000000000000420000000000000035000000000000000000000000000000060000000000000000100000000000001900000000000000480000000000001050edbc06b4bfc3ee108b66f7a8f772ca4d90e1a085f4a8398505920f7465bb44b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3021ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a193440eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f839867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756afcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8923490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99cc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8beccda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d22733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd95a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3774df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618db8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea32293237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d7358448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a927ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757bf558bebd2ceec7f3c5dce04a4782f88c2c6036ae78ee206d0bc5289d20461a2e21908c2968c0699040a6fd866a577a99a9d2ec88745c815fd4a472c789244daae824d72ddc272aab68a8c3022e36f10454437c1886f3ff9927b64f232df414f27e429a4bef3083bc31a671d046ea5c1f5b8c3094d72868d9dfdc12c7334ac5f743cc5c365a9a6a15c1f240ac25880c7a9d1de290696cb766074a1d83d9278164adcf616c3bfabf63999a01966c998b7bb572774035a63ead49da73b5987f34775786645d0c5dd7c04a2f8a75dcae085213652f5bce3ea8b9b9bedd1cab3c5e9b88b152c9b8a7b79637d35911848b0c41e7cc7cca2ab4fe9a15f9c38bb4bb9390c4e2d8ce834ffd7a6cd85d7113d4521abb857774845c4291e6f6d010d97e3185bc799d83e3bb31501b3da786680df30fbc18eb41cbce611e8c0e9c72f69571ca10d3ef857d04d9c03ead7c6317d797a090fa1271ad9c7addfbcb412e9643d4fb33b1809c42623f474055fa9400a2027a7a885c8dfa4efe20666b4ee27d7529c134d7f28d53f175f6bf4b62faa2110d5b76f0f770c15e628181c1fcc18f970a9c34d24b2fc8c50ca9c07a7156ef4e5ff4bdf002eda0b11c1d359d0b59a54680704dbb9db631457879b27e0dfdbe50158fd9cf9b4cf77605c4ac4c95bd65fc9f6f9295a686647cb999090819cda700820c282c613cedcd218540bbc6f37b01c6567c4a1ea624f092a3a5cca2d6f0f0db231972fce627f0ecca0dee60f17551c5f8fdaeb5ab560b2ceb781cdb339361a0fbee1b9dffad59115138c8d6a70dda9ccc1bf0bbdd7fee15764845db875f6432559ff8dbc9055324431bc34e5b93d15da307317849eccd90c0c7b98870b9317c15a5959dcfb84c76dcc908c4fe6ba92126339bf06e458f6646df5e83ba7c3d35bc263b3222c8e9040068847749ca8e8f95045e4342aeb521eb3a5587ec268ed3aa6faf32b62b0bc41a9d549521f406fc30f3e39c5412c30550d1d07fb07ff0e546fbeea1988f6658f04a9b19693e5b99d84e35c5d92171376cae5c86300822d729cd3a8479583bef09527027dba5f11263c5cbbeb3834b7a5c1cba9aa5fee0c95ec3f17a33ec3d8047fff799187f5ae2040bbe913c226c34c9fbe4389dd728984257a816892b3cae3e43191dd291f0eb5")
+		require.Equal(t, expectedProof, proof)
+		// TODO: Need to add some oracle data
+		require.Nil(t, data)
+		require.Empty(t, generator.generated)
+	})
+
+	t.Run("ErrorsTraceIndexOutOfBounds", func(t *testing.T) {
+		dataDir, prestate := setupTestData(t)
+		provider, generator := setupWithTestData(t, dataDir, prestate)
+		largePosition := PositionFromTraceIndex(provider, new(big.Int).Mul(new(big.Int).SetUint64(math.MaxUint64), big.NewInt(2)))
+		_, _, _, err := provider.GetStepData(context.Background(), largePosition)
+		require.ErrorContains(t, err, "trace index out of bounds")
+		require.Empty(t, generator.generated)
+	})
+
+	t.Run("GenerateProof", func(t *testing.T) {
+		dataDir, prestate := setupTestData(t)
+		provider, generator := setupWithTestData(t, dataDir, prestate)
+		generator.finalState = &VMState{
+			Step:    10,
+			Exited:  true,
+			Witness: make([]byte, asteriscWitnessLen),
+		}
+		generator.proof = &utils.ProofData{
+			ClaimValue:   common.Hash{0xaa},
+			StateData:    []byte{0xbb},
+			ProofData:    []byte{0xcc},
+			OracleKey:    common.Hash{0xdd}.Bytes(),
+			OracleValue:  []byte{0xdd},
+			OracleOffset: 10,
+		}
+		preimage, proof, data, err := provider.GetStepData(context.Background(), PositionFromTraceIndex(provider, big.NewInt(4)))
+		require.NoError(t, err)
+		require.Contains(t, generator.generated, 4, "should have tried to generate the proof")
+
+		require.EqualValues(t, generator.proof.StateData, preimage)
+		require.EqualValues(t, generator.proof.ProofData, proof)
+		expectedData := types.NewPreimageOracleData(generator.proof.OracleKey, generator.proof.OracleValue, generator.proof.OracleOffset)
+		require.EqualValues(t, expectedData, data)
+	})
+
+	t.Run("ProofAfterEndOfTrace", func(t *testing.T) {
+		dataDir, prestate := setupTestData(t)
+		provider, generator := setupWithTestData(t, dataDir, prestate)
+		generator.finalState = &VMState{
+			Step:    10,
+			Exited:  true,
+			Witness: make([]byte, asteriscWitnessLen),
+		}
+		generator.proof = &utils.ProofData{
+			ClaimValue:   common.Hash{0xaa},
+			StateData:    []byte{0xbb},
+			ProofData:    []byte{0xcc},
+			OracleKey:    common.Hash{0xdd}.Bytes(),
+			OracleValue:  []byte{0xdd},
+			OracleOffset: 10,
+		}
+		preimage, proof, data, err := provider.GetStepData(context.Background(), PositionFromTraceIndex(provider, big.NewInt(7000)))
+		require.NoError(t, err)
+		require.Contains(t, generator.generated, 7000, "should have tried to generate the proof")
+
+		witness := generator.finalState.Witness
+		require.EqualValues(t, witness, preimage)
+		require.Equal(t, []byte{}, proof)
+		require.Nil(t, data)
+	})
+
+	t.Run("ReadLastStepFromDisk", func(t *testing.T) {
+		dataDir, prestate := setupTestData(t)
+		provider, initGenerator := setupWithTestData(t, dataDir, prestate)
+		initGenerator.finalState = &VMState{
+			Step:    10,
+			Exited:  true,
+			Witness: make([]byte, asteriscWitnessLen),
+		}
+		initGenerator.proof = &utils.ProofData{
+			ClaimValue:   common.Hash{0xaa},
+			StateData:    []byte{0xbb},
+			ProofData:    []byte{0xcc},
+			OracleKey:    common.Hash{0xdd}.Bytes(),
+			OracleValue:  []byte{0xdd},
+			OracleOffset: 10,
+		}
+		_, _, _, err := provider.GetStepData(context.Background(), PositionFromTraceIndex(provider, big.NewInt(7000)))
+		require.NoError(t, err)
+		require.Contains(t, initGenerator.generated, 7000, "should have tried to generate the proof")
+
+		provider, generator := setupWithTestData(t, dataDir, prestate)
+		generator.finalState = &VMState{
+			Step:    10,
+			Exited:  true,
+			Witness: make([]byte, asteriscWitnessLen),
+		}
+		generator.proof = &utils.ProofData{
+			ClaimValue: common.Hash{0xaa},
+			StateData:  []byte{0xbb},
+			ProofData:  []byte{0xcc},
+		}
+		preimage, proof, data, err := provider.GetStepData(context.Background(), PositionFromTraceIndex(provider, big.NewInt(7000)))
+		require.NoError(t, err)
+		require.Empty(t, generator.generated, "should not have to generate the proof again")
+
+		require.EqualValues(t, initGenerator.finalState.Witness, preimage)
+		require.Empty(t, proof)
+		require.Nil(t, data)
+	})
+
+	t.Run("MissingStateData", func(t *testing.T) {
+		dataDir, prestate := setupTestData(t)
+		provider, generator := setupWithTestData(t, dataDir, prestate)
+		_, _, _, err := provider.GetStepData(context.Background(), PositionFromTraceIndex(provider, big.NewInt(1)))
+		require.ErrorContains(t, err, "missing state data")
+		require.Empty(t, generator.generated)
+	})
+
+	t.Run("IgnoreUnknownFields", func(t *testing.T) {
+		dataDir, prestate := setupTestData(t)
+		provider, generator := setupWithTestData(t, dataDir, prestate)
+		value, proof, data, err := provider.GetStepData(context.Background(), PositionFromTraceIndex(provider, big.NewInt(2)))
+		require.NoError(t, err)
+		expected := common.FromHex("cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc")
+		require.Equal(t, expected, value)
+		expectedProof := common.FromHex("dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd")
+		require.Equal(t, expectedProof, proof)
+		require.Empty(t, generator.generated)
+		require.Nil(t, data)
+	})
+}
+
+func setupTestData(t *testing.T) (string, string) {
+	srcDir := filepath.Join("test_data", "proofs")
+	entries, err := testData.ReadDir(srcDir)
+	require.NoError(t, err)
+	dataDir := t.TempDir()
+	require.NoError(t, os.Mkdir(filepath.Join(dataDir, proofsDir), 0o777))
+	for _, entry := range entries {
+		path := filepath.Join(srcDir, entry.Name())
+		file, err := testData.ReadFile(path)
+		require.NoErrorf(t, err, "reading %v", path)
+		proofFile := filepath.Join(dataDir, proofsDir, entry.Name()+".gz")
+		err = ioutil.WriteCompressedBytes(proofFile, file, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0o644)
+		require.NoErrorf(t, err, "writing %v", path)
+	}
+	return dataDir, "state.json"
+}
+
+func setupWithTestData(t *testing.T, dataDir string, prestate string) (*AsteriscTraceProvider, *stubGenerator) {
+	generator := &stubGenerator{}
+	return &AsteriscTraceProvider{
+		logger:    testlog.Logger(t, log.LevelInfo),
+		dir:       dataDir,
+		generator: generator,
+		prestate:  filepath.Join(dataDir, prestate),
+		gameDepth: 63,
+	}, generator
+}
+
+type stubGenerator struct {
+	generated  []int // Using int makes assertions easier
+	finalState *VMState
+	proof      *utils.ProofData
+}
+
+func (e *stubGenerator) GenerateProof(ctx context.Context, dir string, i uint64) error {
+	e.generated = append(e.generated, int(i))
+	var proofFile string
+	var data []byte
+	var err error
+	if e.finalState != nil && e.finalState.Step <= i {
+		// Requesting a trace index past the end of the trace
+		proofFile = filepath.Join(dir, utils.FinalState)
+		data, err = json.Marshal(e.finalState)
+		if err != nil {
+			return err
+		}
+		return ioutil.WriteCompressedBytes(proofFile, data, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0o644)
+	}
+	if e.proof != nil {
+		proofFile = filepath.Join(dir, proofsDir, fmt.Sprintf("%d.json.gz", i))
+		data, err = json.Marshal(e.proof)
+		if err != nil {
+			return err
+		}
+		return ioutil.WriteCompressedBytes(proofFile, data, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0o644)
+	}
+	return nil
+}
diff --git a/op-challenger/game/fault/trace/asterisc/state.go b/op-challenger/game/fault/trace/asterisc/state.go
new file mode 100644
index 000000000000..b766cda6f50c
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/state.go
@@ -0,0 +1,74 @@
+package asterisc
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+
+	"github.com/ethereum-optimism/optimism/cannon/mipsevm"
+	"github.com/ethereum-optimism/optimism/op-service/ioutil"
+)
+
+var asteriscWitnessLen = 362
+
+// The state struct will be read from json.
+// other fields included in json are specific to FPVM implementation, and not required for trace provider.
+type VMState struct {
+	PC        uint64   `json:"pc"`
+	Exited    bool     `json:"exited"`
+	Step      uint64   `json:"step"`
+	Witness   []byte   `json:"witness"`
+	StateHash [32]byte `json:"stateHash"`
+}
+
+func (state *VMState) validateStateHash() error {
+	exitCode := state.StateHash[0]
+	if exitCode >= 4 {
+		return fmt.Errorf("invalid stateHash: unknown exitCode %d", exitCode)
+	}
+	if (state.Exited && exitCode == mipsevm.VMStatusUnfinished) || (!state.Exited && exitCode != mipsevm.VMStatusUnfinished) {
+		return fmt.Errorf("invalid stateHash: invalid exitCode %d", exitCode)
+	}
+	return nil
+}
+
+func (state *VMState) validateWitness() error {
+	witnessLen := len(state.Witness)
+	if witnessLen != asteriscWitnessLen {
+		return fmt.Errorf("invalid witness: Length must be 362 but got %d", witnessLen)
+	}
+	return nil
+}
+
+// validateState performs verification of state; it is not perfect.
+// It does not recalculate whether witness nor stateHash is correctly set from state.
+func (state *VMState) validateState() error {
+	if err := state.validateStateHash(); err != nil {
+		return err
+	}
+	if err := state.validateWitness(); err != nil {
+		return err
+	}
+	return nil
+}
+
+// parseState parses state from json and goes on state validation
+func parseState(path string) (*VMState, error) {
+	file, err := ioutil.OpenDecompressed(path)
+	if err != nil {
+		return nil, fmt.Errorf("cannot open state file (%v): %w", path, err)
+	}
+	return parseStateFromReader(file)
+}
+
+func parseStateFromReader(in io.ReadCloser) (*VMState, error) {
+	defer in.Close()
+	var state VMState
+	if err := json.NewDecoder(in).Decode(&state); err != nil {
+		return nil, fmt.Errorf("invalid asterisc VM state %w", err)
+	}
+	if err := state.validateState(); err != nil {
+		return nil, fmt.Errorf("invalid asterisc VM state %w", err)
+	}
+	return &state, nil
+}
diff --git a/op-challenger/game/fault/trace/asterisc/state_test.go b/op-challenger/game/fault/trace/asterisc/state_test.go
new file mode 100644
index 000000000000..02b38eb41565
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/state_test.go
@@ -0,0 +1,83 @@
+package asterisc
+
+import (
+	"compress/gzip"
+	_ "embed"
+	"encoding/json"
+	"os"
+	"path/filepath"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+//go:embed test_data/state.json
+var testState []byte
+
+func TestLoadState(t *testing.T) {
+	t.Run("Uncompressed", func(t *testing.T) {
+		dir := t.TempDir()
+		path := filepath.Join(dir, "state.json")
+		require.NoError(t, os.WriteFile(path, testState, 0644))
+
+		state, err := parseState(path)
+		require.NoError(t, err)
+
+		var expected VMState
+		require.NoError(t, json.Unmarshal(testState, &expected))
+		require.Equal(t, &expected, state)
+	})
+
+	t.Run("Gzipped", func(t *testing.T) {
+		dir := t.TempDir()
+		path := filepath.Join(dir, "state.json.gz")
+		f, err := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
+		require.NoError(t, err)
+		defer f.Close()
+		writer := gzip.NewWriter(f)
+		_, err = writer.Write(testState)
+		require.NoError(t, err)
+		require.NoError(t, writer.Close())
+
+		state, err := parseState(path)
+		require.NoError(t, err)
+
+		var expected VMState
+		require.NoError(t, json.Unmarshal(testState, &expected))
+		require.Equal(t, &expected, state)
+	})
+
+	t.Run("InvalidStateWitness", func(t *testing.T) {
+		invalidWitnessLen := asteriscWitnessLen - 1
+		state := &VMState{
+			Step:    10,
+			Exited:  true,
+			Witness: make([]byte, invalidWitnessLen),
+		}
+		err := state.validateState()
+		require.ErrorContains(t, err, "invalid witness")
+	})
+
+	t.Run("InvalidStateHash", func(t *testing.T) {
+		state := &VMState{
+			Step:    10,
+			Exited:  true,
+			Witness: make([]byte, asteriscWitnessLen),
+		}
+		// Unknown exit code
+		state.StateHash[0] = 37
+		err := state.validateState()
+		require.ErrorContains(t, err, "invalid stateHash: unknown exitCode")
+		// Exited but ExitCode is VMStatusUnfinished
+		state.StateHash[0] = 3
+		err = state.validateState()
+		require.ErrorContains(t, err, "invalid stateHash: invalid exitCode")
+		// Not Exited but ExitCode is not VMStatusUnfinished
+		state.Exited = false
+		for exitCode := 0; exitCode < 3; exitCode++ {
+			state.StateHash[0] = byte(exitCode)
+			err = state.validateState()
+			require.ErrorContains(t, err, "invalid stateHash: invalid exitCode")
+		}
+	})
+}
diff --git a/op-challenger/game/fault/trace/asterisc/test_data/invalid.json b/op-challenger/game/fault/trace/asterisc/test_data/invalid.json
new file mode 100644
index 000000000000..06a76bf5b23d
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/test_data/invalid.json
@@ -0,0 +1,3 @@
+{
+  "preimageKey": 1
+}
diff --git a/op-challenger/game/fault/trace/asterisc/test_data/proofs/0.json b/op-challenger/game/fault/trace/asterisc/test_data/proofs/0.json
new file mode 100644
index 000000000000..e5838ddfc5ab
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/test_data/proofs/0.json
@@ -0,0 +1,7 @@
+{
+  "step": 0,
+  "pre": "0x03abd5c535c08bae7c4ad48fcae39b65f9c25239f65b4376c58638d262c97381",
+  "post": "0x034689707b571db46b32c9e433def18e648f4e1fa9e5abd4012e7913031bfc10",
+  "state-data": "0x354cfaf28a5b60c3f64f22f9f171b64aa067f90c6de6c96f725f44c5cf9f8ac1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080e080000000000000000000000007f0000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+  "proof-data": "0x000000000000000003350100930581006f00800100000000970f000067800f01000000000000000097c2ffff938282676780020000000000032581009308e0050e1893682c323d6695396f1122b3cb562af8c65cab19978c9246434fda0536c90ca1cfabf684ebce3ad9fbd54000a2b258f8d0e447c1bb6f7e97de47aadfc12cd7b6f466bfd024daa905886c5f638f4692d843709e6c1c0d9eb2e251c626d53d15e04b59735fe0781bc4357a4243fbc28e6981902a8c2669a2d6456f7a964423db5d1585da978861f8b84067654b29490275c82b54083ee09c82eb7aa9ae693911226bb8297ad82c0963ae943f22d0c6086f4f14437e4d1c87ceb17e68caf5eaec77f14b46225b417d2191ca7b49564c896836a95ad4e9c383bd1c8ff9d8e888c64fb3836daa9535e58372e9646b7b144219980a4389aca5da241c3ec11fbc9297bd7a94ac671ccec288604c23a0072b0c1ed069198959cacdc2574aff65b7eceffc391e21778a1775deceb3ec0990836df98d98a4f3f0dc854587230fbf59e4daa60e8240d74caf90f7e2cd014c1d5d707b2e44269d9a9caf133882fe1ebb2f4237f6282abe89639b357e9231418d0c41373229ae9edfa6815bec484cb79772c9e2a7d80912123558f79b539bb45d435f2a4446970f1e2123494740285cec3491b0a41a9fd7403bdc8cd239a87508039a77b48ee39a951a8bd196b583de2b93444aafd456d0cd92050fa6a816d5183c1d75e96df540c8ac3bb8638b971f0cf3fb5b4a321487a1c8992b921de110f3d5bbb87369b25fe743ad7e789ca52d9f9fe62ccb103b78fe65eaa2cd47895022c590639c8f0c6a3999d8a5c71ed94d355815851b479f8d93eae90822294c96b39724b33491f8497b0bf7e1b995b37e4d759ff8a7958d194da6e00c475a6ddcf6efcb5fb4bb383c9b273da18d01e000dbe9c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd95a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3774df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618db8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea32293237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d7358448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a927ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757bf558bebd2ceec7f3c5dce04a4782f88c2c6036ae78ee206d0bc5289d20461a2e21908c2968c0699040a6fd866a577a99a9d2ec88745c815fd4a472c789244daae824d72ddc272aab68a8c3022e36f10454437c1886f3ff9927b64f232df414f27e429a4bef3083bc31a671d046ea5c1f5b8c3094d72868d9dfdc12c7334ac5f743cc5c365a9a6a15c1f240ac25880c7a9d1de290696cb766074a1d83d9278164adcf616c3bfabf63999a01966c998b7bb572774035a63ead49da73b5987f34775786645d0c5dd7c04a2f8a75dcae085213652f5bce3ea8b9b9bedd1cab3c5e9b88b152c9b8a7b79637d35911848b0c41e7cc7cca2ab4fe9a15f9c38bb4bb9390c4e2d8ce834ffd7a6cd85d7113d4521abb857774845c4291e6f6d010d97e3185bc799d83e3bb31501b3da786680df30fbc18eb41cbce611e8c0e9c72f69571ca10d3ef857d04d9c03ead7c6317d797a090fa1271ad9c7addfbcb412e9643d4fb33b1809c42623f474055fa9400a2027a7a885c8dfa4efe20666b4ee27d7529c134d7f28d53f175f6bf4b62faa2110d5b76f0f770c15e628181c1fcc18f970a9c34d24b2fc8c50ca9c07a7156ef4e5ff4bdf002eda0b11c1d359d0b59a54680704dbb9db631457879b27e0dfdbe50158fd9cf9b4cf77605c4ac4c95bd65fc9f6f9295a686647cb999090819cda700820c282c613cedcd218540bbc6f37b01c6567c4a1ea624f092a3a5cca2d6f0f0db231972fce627f0ecca0dee60f17551c5f8fdaeb5ab560b2ceb781cdb339361a0fbee1b9dffad59115138c8d6a70dda9ccc1bf0bbdd7fee15764845db875f6432559ff8dbc9055324431bc34e5b93d15da307317849eccd90c0c7b98870b9317c15a5959dcfb84c76dcc908c4fe6ba92126339bf06e458f6646df5e83ba7c3d35bc263b3222c8e9040068847749ca8e8f95045e4342aeb521eb3a5587ec268ed3aa6faf32b62b0bc41a9d549521f406fc3ec7d4dabb75e0d3e144d7cc882372d13746b6dcd481b1b229bcaec9f7422cdfb84e35c5d92171376cae5c86300822d729cd3a8479583bef09527027dba5f11263c5cbbeb3834b7a5c1cba9aa5fee0c95ec3f17a33ec3d8047fff799187f5ae2040bbe913c226c34c9fbe4389dd728984257a816892b3cae3e43191dd291f0eb50000000000000000420000000000000035000000000000000000000000000000060000000000000000100000000000001900000000000000480000000000001050edbc06b4bfc3ee108b66f7a8f772ca4d90e1a085f4a8398505920f7465bb44b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3021ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a193440eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f839867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756afcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8923490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99cc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8beccda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d22733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd95a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3774df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618db8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea32293237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d7358448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a927ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757bf558bebd2ceec7f3c5dce04a4782f88c2c6036ae78ee206d0bc5289d20461a2e21908c2968c0699040a6fd866a577a99a9d2ec88745c815fd4a472c789244daae824d72ddc272aab68a8c3022e36f10454437c1886f3ff9927b64f232df414f27e429a4bef3083bc31a671d046ea5c1f5b8c3094d72868d9dfdc12c7334ac5f743cc5c365a9a6a15c1f240ac25880c7a9d1de290696cb766074a1d83d9278164adcf616c3bfabf63999a01966c998b7bb572774035a63ead49da73b5987f34775786645d0c5dd7c04a2f8a75dcae085213652f5bce3ea8b9b9bedd1cab3c5e9b88b152c9b8a7b79637d35911848b0c41e7cc7cca2ab4fe9a15f9c38bb4bb9390c4e2d8ce834ffd7a6cd85d7113d4521abb857774845c4291e6f6d010d97e3185bc799d83e3bb31501b3da786680df30fbc18eb41cbce611e8c0e9c72f69571ca10d3ef857d04d9c03ead7c6317d797a090fa1271ad9c7addfbcb412e9643d4fb33b1809c42623f474055fa9400a2027a7a885c8dfa4efe20666b4ee27d7529c134d7f28d53f175f6bf4b62faa2110d5b76f0f770c15e628181c1fcc18f970a9c34d24b2fc8c50ca9c07a7156ef4e5ff4bdf002eda0b11c1d359d0b59a54680704dbb9db631457879b27e0dfdbe50158fd9cf9b4cf77605c4ac4c95bd65fc9f6f9295a686647cb999090819cda700820c282c613cedcd218540bbc6f37b01c6567c4a1ea624f092a3a5cca2d6f0f0db231972fce627f0ecca0dee60f17551c5f8fdaeb5ab560b2ceb781cdb339361a0fbee1b9dffad59115138c8d6a70dda9ccc1bf0bbdd7fee15764845db875f6432559ff8dbc9055324431bc34e5b93d15da307317849eccd90c0c7b98870b9317c15a5959dcfb84c76dcc908c4fe6ba92126339bf06e458f6646df5e83ba7c3d35bc263b3222c8e9040068847749ca8e8f95045e4342aeb521eb3a5587ec268ed3aa6faf32b62b0bc41a9d549521f406fc30f3e39c5412c30550d1d07fb07ff0e546fbeea1988f6658f04a9b19693e5b99d84e35c5d92171376cae5c86300822d729cd3a8479583bef09527027dba5f11263c5cbbeb3834b7a5c1cba9aa5fee0c95ec3f17a33ec3d8047fff799187f5ae2040bbe913c226c34c9fbe4389dd728984257a816892b3cae3e43191dd291f0eb5"
+}
diff --git a/op-challenger/game/fault/trace/asterisc/test_data/proofs/1.json b/op-challenger/game/fault/trace/asterisc/test_data/proofs/1.json
new file mode 100644
index 000000000000..311847daa5a0
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/test_data/proofs/1.json
@@ -0,0 +1,2 @@
+{}
+
diff --git a/op-challenger/game/fault/trace/asterisc/test_data/proofs/2.json b/op-challenger/game/fault/trace/asterisc/test_data/proofs/2.json
new file mode 100644
index 000000000000..96f58c8e8cb3
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/test_data/proofs/2.json
@@ -0,0 +1,9 @@
+{
+  "foo": 0,
+  "bar": "0x71f9eb93ff904e5c03c3425228ef75766db0c906ad239df9a7a7f0d9c6a89705",
+  "step": 0,
+  "pre": "0x03abd5c535c08bae7c4ad48fcae39b65f9c25239f65b4376c58638d262c97381",
+  "post": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+  "state-data": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
+  "proof-data": "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
+}
diff --git a/op-challenger/game/fault/trace/asterisc/test_data/state.json b/op-challenger/game/fault/trace/asterisc/test_data/state.json
new file mode 100644
index 000000000000..a1bf2e5b412e
--- /dev/null
+++ b/op-challenger/game/fault/trace/asterisc/test_data/state.json
@@ -0,0 +1,40 @@
+{
+  "pc": 0,
+  "exited": false,
+  "step": 0,
+  "witness": "wOSi8Cm62dDmKt1OGwxlLrSznk6zE4ghp7evP1rfrXYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGCAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
+  "stateHash": [
+    3,
+    33,
+    111,
+    220,
+    74,
+    123,
+    253,
+    76,
+    113,
+    96,
+    250,
+    148,
+    109,
+    27,
+    254,
+    69,
+    29,
+    19,
+    255,
+    50,
+    218,
+    73,
+    102,
+    9,
+    254,
+    24,
+    53,
+    82,
+    130,
+    185,
+    16,
+    198
+  ]
+}
diff --git a/op-challenger/game/fault/trace/cannon/executor.go b/op-challenger/game/fault/trace/cannon/executor.go
index e2aaf7693cfc..688fd87d7fa2 100644
--- a/op-challenger/game/fault/trace/cannon/executor.go
+++ b/op-challenger/game/fault/trace/cannon/executor.go
@@ -2,40 +2,26 @@ package cannon
 
 import (
 	"context"
-	"errors"
 	"fmt"
 	"math"
 	"os"
-	"os/exec"
 	"path/filepath"
-	"regexp"
 	"strconv"
 	"strings"
 	"time"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/config"
-	oplog "github.com/ethereum-optimism/optimism/op-service/log"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
 	"github.com/ethereum/go-ethereum/log"
 )
 
-const (
-	snapsDir     = "snapshots"
-	preimagesDir = "preimages"
-	finalState   = "final.json.gz"
-)
-
-var snapshotNameRegexp = regexp.MustCompile(`^[0-9]+\.json.gz$`)
-
-type snapshotSelect func(logger log.Logger, dir string, absolutePreState string, i uint64) (string, error)
-type cmdExecutor func(ctx context.Context, l log.Logger, binary string, args ...string) error
-
 type Executor struct {
 	logger           log.Logger
 	metrics          CannonMetricer
 	l1               string
 	l1Beacon         string
 	l2               string
-	inputs           LocalGameInputs
+	inputs           utils.LocalGameInputs
 	cannon           string
 	server           string
 	network          string
@@ -44,28 +30,28 @@ type Executor struct {
 	absolutePreState string
 	snapshotFreq     uint
 	infoFreq         uint
-	selectSnapshot   snapshotSelect
-	cmdExecutor      cmdExecutor
+	selectSnapshot   utils.SnapshotSelect
+	cmdExecutor      utils.CmdExecutor
 }
 
-func NewExecutor(logger log.Logger, m CannonMetricer, cfg *config.Config, inputs LocalGameInputs) *Executor {
+func NewExecutor(logger log.Logger, m CannonMetricer, cfg *config.Config, prestate string, inputs utils.LocalGameInputs) *Executor {
 	return &Executor{
 		logger:           logger,
 		metrics:          m,
 		l1:               cfg.L1EthRpc,
 		l1Beacon:         cfg.L1Beacon,
-		l2:               cfg.CannonL2,
+		l2:               cfg.L2Rpc,
 		inputs:           inputs,
 		cannon:           cfg.CannonBin,
 		server:           cfg.CannonServer,
 		network:          cfg.CannonNetwork,
 		rollupConfig:     cfg.CannonRollupConfigPath,
 		l2Genesis:        cfg.CannonL2GenesisPath,
-		absolutePreState: cfg.CannonAbsolutePreState,
+		absolutePreState: prestate,
 		snapshotFreq:     cfg.CannonSnapshotFreq,
 		infoFreq:         cfg.CannonInfoFreq,
-		selectSnapshot:   findStartingSnapshot,
-		cmdExecutor:      runCmd,
+		selectSnapshot:   utils.FindStartingSnapshot,
+		cmdExecutor:      utils.RunCmd,
 	}
 }
 
@@ -75,18 +61,17 @@ func (e *Executor) GenerateProof(ctx context.Context, dir string, i uint64) erro
 	return e.generateProof(ctx, dir, i, i)
 }
 
-// generateProofOrUntilPreimageRead executes cannon to generate a proof at the specified trace index,
-// or until a non-local preimage read is encountered if untilPreimageRead is true.
+// generateProof executes cannon from the specified starting trace index until the end trace index.
 // The proof is stored at the specified directory.
 func (e *Executor) generateProof(ctx context.Context, dir string, begin uint64, end uint64, extraCannonArgs ...string) error {
-	snapshotDir := filepath.Join(dir, snapsDir)
+	snapshotDir := filepath.Join(dir, utils.SnapsDir)
 	start, err := e.selectSnapshot(e.logger, snapshotDir, e.absolutePreState, begin)
 	if err != nil {
 		return fmt.Errorf("find starting snapshot: %w", err)
 	}
-	proofDir := filepath.Join(dir, proofsDir)
-	dataDir := preimageDir(dir)
-	lastGeneratedState := filepath.Join(dir, finalState)
+	proofDir := filepath.Join(dir, utils.ProofsDir)
+	dataDir := utils.PreimageDir(dir)
+	lastGeneratedState := filepath.Join(dir, utils.FinalState)
 	args := []string{
 		"run",
 		"--input", start,
@@ -140,58 +125,3 @@ func (e *Executor) generateProof(ctx context.Context, dir string, begin uint64,
 	e.metrics.RecordCannonExecutionTime(time.Since(execStart).Seconds())
 	return err
 }
-
-func preimageDir(dir string) string {
-	return filepath.Join(dir, preimagesDir)
-}
-
-func runCmd(ctx context.Context, l log.Logger, binary string, args ...string) error {
-	cmd := exec.CommandContext(ctx, binary, args...)
-	stdOut := oplog.NewWriter(l, log.LevelInfo)
-	defer stdOut.Close()
-	// Keep stdErr at info level because cannon uses stderr for progress messages
-	stdErr := oplog.NewWriter(l, log.LevelInfo)
-	defer stdErr.Close()
-	cmd.Stdout = stdOut
-	cmd.Stderr = stdErr
-	return cmd.Run()
-}
-
-// findStartingSnapshot finds the closest snapshot before the specified traceIndex in snapDir.
-// If no suitable snapshot can be found it returns absolutePreState.
-func findStartingSnapshot(logger log.Logger, snapDir string, absolutePreState string, traceIndex uint64) (string, error) {
-	// Find the closest snapshot to start from
-	entries, err := os.ReadDir(snapDir)
-	if err != nil {
-		if errors.Is(err, os.ErrNotExist) {
-			return absolutePreState, nil
-		}
-		return "", fmt.Errorf("list snapshots in %v: %w", snapDir, err)
-	}
-	bestSnap := uint64(0)
-	for _, entry := range entries {
-		if entry.IsDir() {
-			logger.Warn("Unexpected directory in snapshots dir", "parent", snapDir, "child", entry.Name())
-			continue
-		}
-		name := entry.Name()
-		if !snapshotNameRegexp.MatchString(name) {
-			logger.Warn("Unexpected file in snapshots dir", "parent", snapDir, "child", entry.Name())
-			continue
-		}
-		index, err := strconv.ParseUint(name[0:len(name)-len(".json.gz")], 10, 64)
-		if err != nil {
-			logger.Error("Unable to parse trace index of snapshot file", "parent", snapDir, "child", entry.Name())
-			continue
-		}
-		if index > bestSnap && index < traceIndex {
-			bestSnap = index
-		}
-	}
-	if bestSnap == 0 {
-		return absolutePreState, nil
-	}
-	startFrom := fmt.Sprintf("%v/%v.json.gz", snapDir, bestSnap)
-
-	return startFrom, nil
-}
diff --git a/op-challenger/game/fault/trace/cannon/executor_test.go b/op-challenger/game/fault/trace/cannon/executor_test.go
index 9ac7db834bd7..4f20c426e778 100644
--- a/op-challenger/game/fault/trace/cannon/executor_test.go
+++ b/op-challenger/game/fault/trace/cannon/executor_test.go
@@ -11,6 +11,7 @@ import (
 	"time"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/config"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
 	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum/go-ethereum/common"
@@ -24,15 +25,15 @@ func TestGenerateProof(t *testing.T) {
 	input := "starting.json"
 	tempDir := t.TempDir()
 	dir := filepath.Join(tempDir, "gameDir")
-	cfg := config.NewConfig(common.Address{0xbb}, "http://localhost:8888", "http://localhost:9000", tempDir, config.TraceTypeCannon)
-	cfg.CannonAbsolutePreState = "pre.json"
+	cfg := config.NewConfig(common.Address{0xbb}, "http://localhost:8888", "http://localhost:9000", "http://localhost:9096", "http://localhost:9095", tempDir, config.TraceTypeCannon)
+	cfg.L2Rpc = "http://localhost:9999"
+	prestate := "pre.json"
 	cfg.CannonBin = "./bin/cannon"
 	cfg.CannonServer = "./bin/op-program"
-	cfg.CannonL2 = "http://localhost:9999"
 	cfg.CannonSnapshotFreq = 500
 	cfg.CannonInfoFreq = 900
 
-	inputs := LocalGameInputs{
+	inputs := utils.LocalGameInputs{
 		L1Head:        common.Hash{0x11},
 		L2Head:        common.Hash{0x22},
 		L2OutputRoot:  common.Hash{0x33},
@@ -41,7 +42,7 @@ func TestGenerateProof(t *testing.T) {
 	}
 	captureExec := func(t *testing.T, cfg config.Config, proofAt uint64) (string, string, map[string]string) {
 		m := &cannonDurationMetrics{}
-		executor := NewExecutor(testlog.Logger(t, log.LevelInfo), m, &cfg, inputs)
+		executor := NewExecutor(testlog.Logger(t, log.LevelInfo), m, &cfg, prestate, inputs)
 		executor.selectSnapshot = func(logger log.Logger, dir string, absolutePreState string, i uint64) (string, error) {
 			return input, nil
 		}
@@ -73,15 +74,15 @@ func TestGenerateProof(t *testing.T) {
 		cfg.CannonRollupConfigPath = ""
 		cfg.CannonL2GenesisPath = ""
 		binary, subcommand, args := captureExec(t, cfg, 150_000_000)
-		require.DirExists(t, filepath.Join(dir, preimagesDir))
-		require.DirExists(t, filepath.Join(dir, proofsDir))
-		require.DirExists(t, filepath.Join(dir, snapsDir))
+		require.DirExists(t, filepath.Join(dir, utils.PreimagesDir))
+		require.DirExists(t, filepath.Join(dir, utils.ProofsDir))
+		require.DirExists(t, filepath.Join(dir, utils.SnapsDir))
 		require.Equal(t, cfg.CannonBin, binary)
 		require.Equal(t, "run", subcommand)
 		require.Equal(t, input, args["--input"])
 		require.Contains(t, args, "--meta")
 		require.Equal(t, "", args["--meta"])
-		require.Equal(t, filepath.Join(dir, finalState), args["--output"])
+		require.Equal(t, filepath.Join(dir, utils.FinalState), args["--output"])
 		require.Equal(t, "=150000000", args["--proof-at"])
 		require.Equal(t, "=150000001", args["--stop-at"])
 		require.Equal(t, "%500", args["--snapshot-at"])
@@ -92,10 +93,10 @@ func TestGenerateProof(t *testing.T) {
 		require.Equal(t, "--server", args[cfg.CannonServer])
 		require.Equal(t, cfg.L1EthRpc, args["--l1"])
 		require.Equal(t, cfg.L1Beacon, args["--l1.beacon"])
-		require.Equal(t, cfg.CannonL2, args["--l2"])
-		require.Equal(t, filepath.Join(dir, preimagesDir), args["--datadir"])
-		require.Equal(t, filepath.Join(dir, proofsDir, "%d.json.gz"), args["--proof-fmt"])
-		require.Equal(t, filepath.Join(dir, snapsDir, "%d.json.gz"), args["--snapshot-fmt"])
+		require.Equal(t, cfg.L2Rpc, args["--l2"])
+		require.Equal(t, filepath.Join(dir, utils.PreimagesDir), args["--datadir"])
+		require.Equal(t, filepath.Join(dir, utils.ProofsDir, "%d.json.gz"), args["--proof-fmt"])
+		require.Equal(t, filepath.Join(dir, utils.SnapsDir, "%d.json.gz"), args["--snapshot-fmt"])
 		require.Equal(t, cfg.CannonNetwork, args["--network"])
 		require.NotContains(t, args, "--rollup.config")
 		require.NotContains(t, args, "--l2.genesis")
@@ -137,7 +138,7 @@ func TestRunCmdLogsOutput(t *testing.T) {
 	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 	defer cancel()
 	logger, logs := testlog.CaptureLogger(t, log.LevelInfo)
-	err := runCmd(ctx, logger, bin, "Hello World")
+	err := utils.RunCmd(ctx, logger, bin, "Hello World")
 	require.NoError(t, err)
 	levelFilter := testlog.NewLevelFilter(log.LevelInfo)
 	msgFilter := testlog.NewMessageFilter("Hello World")
@@ -157,25 +158,25 @@ func TestFindStartingSnapshot(t *testing.T) {
 
 	t.Run("UsePrestateWhenSnapshotsDirDoesNotExist", func(t *testing.T) {
 		dir := t.TempDir()
-		snapshot, err := findStartingSnapshot(logger, filepath.Join(dir, "doesNotExist"), execTestCannonPrestate, 1200)
+		snapshot, err := utils.FindStartingSnapshot(logger, filepath.Join(dir, "doesNotExist"), execTestCannonPrestate, 1200)
 		require.NoError(t, err)
 		require.Equal(t, execTestCannonPrestate, snapshot)
 	})
 
 	t.Run("UsePrestateWhenSnapshotsDirEmpty", func(t *testing.T) {
 		dir := withSnapshots(t)
-		snapshot, err := findStartingSnapshot(logger, dir, execTestCannonPrestate, 1200)
+		snapshot, err := utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 1200)
 		require.NoError(t, err)
 		require.Equal(t, execTestCannonPrestate, snapshot)
 	})
 
 	t.Run("UsePrestateWhenNoSnapshotBeforeTraceIndex", func(t *testing.T) {
 		dir := withSnapshots(t, "100.json", "200.json")
-		snapshot, err := findStartingSnapshot(logger, dir, execTestCannonPrestate, 99)
+		snapshot, err := utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 99)
 		require.NoError(t, err)
 		require.Equal(t, execTestCannonPrestate, snapshot)
 
-		snapshot, err = findStartingSnapshot(logger, dir, execTestCannonPrestate, 100)
+		snapshot, err = utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 100)
 		require.NoError(t, err)
 		require.Equal(t, execTestCannonPrestate, snapshot)
 	})
@@ -183,19 +184,19 @@ func TestFindStartingSnapshot(t *testing.T) {
 	t.Run("UseClosestAvailableSnapshot", func(t *testing.T) {
 		dir := withSnapshots(t, "100.json.gz", "123.json.gz", "250.json.gz")
 
-		snapshot, err := findStartingSnapshot(logger, dir, execTestCannonPrestate, 101)
+		snapshot, err := utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 101)
 		require.NoError(t, err)
 		require.Equal(t, filepath.Join(dir, "100.json.gz"), snapshot)
 
-		snapshot, err = findStartingSnapshot(logger, dir, execTestCannonPrestate, 123)
+		snapshot, err = utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 123)
 		require.NoError(t, err)
 		require.Equal(t, filepath.Join(dir, "100.json.gz"), snapshot)
 
-		snapshot, err = findStartingSnapshot(logger, dir, execTestCannonPrestate, 124)
+		snapshot, err = utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 124)
 		require.NoError(t, err)
 		require.Equal(t, filepath.Join(dir, "123.json.gz"), snapshot)
 
-		snapshot, err = findStartingSnapshot(logger, dir, execTestCannonPrestate, 256)
+		snapshot, err = utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 256)
 		require.NoError(t, err)
 		require.Equal(t, filepath.Join(dir, "250.json.gz"), snapshot)
 	})
@@ -203,14 +204,14 @@ func TestFindStartingSnapshot(t *testing.T) {
 	t.Run("IgnoreDirectories", func(t *testing.T) {
 		dir := withSnapshots(t, "100.json.gz")
 		require.NoError(t, os.Mkdir(filepath.Join(dir, "120.json.gz"), 0o777))
-		snapshot, err := findStartingSnapshot(logger, dir, execTestCannonPrestate, 150)
+		snapshot, err := utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 150)
 		require.NoError(t, err)
 		require.Equal(t, filepath.Join(dir, "100.json.gz"), snapshot)
 	})
 
 	t.Run("IgnoreUnexpectedFiles", func(t *testing.T) {
 		dir := withSnapshots(t, ".file", "100.json.gz", "foo", "bar.json.gz")
-		snapshot, err := findStartingSnapshot(logger, dir, execTestCannonPrestate, 150)
+		snapshot, err := utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 150)
 		require.NoError(t, err)
 		require.Equal(t, filepath.Join(dir, "100.json.gz"), snapshot)
 	})
diff --git a/op-challenger/game/fault/trace/cannon/prestate_test.go b/op-challenger/game/fault/trace/cannon/prestate_test.go
index 1f14ebac118e..1297da54bd88 100644
--- a/op-challenger/game/fault/trace/cannon/prestate_test.go
+++ b/op-challenger/game/fault/trace/cannon/prestate_test.go
@@ -60,7 +60,7 @@ func TestAbsolutePreStateCommitment(t *testing.T) {
 	})
 
 	t.Run("CacheAbsolutePreState", func(t *testing.T) {
-		setupPreState(t, dataDir, "state.json")
+		setupPreState(t, dataDir, prestate)
 		provider := newCannonPrestateProvider(dataDir, prestate)
 		first, err := provider.AbsolutePreStateCommitment(context.Background())
 		require.NoError(t, err)
diff --git a/op-challenger/game/fault/trace/cannon/provider.go b/op-challenger/game/fault/trace/cannon/provider.go
index bd71ce2a4db5..704d88e2e6a4 100644
--- a/op-challenger/game/fault/trace/cannon/provider.go
+++ b/op-challenger/game/fault/trace/cannon/provider.go
@@ -9,11 +9,10 @@ import (
 	"math"
 	"os"
 	"path/filepath"
-	"strconv"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/config"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
-	preimage "github.com/ethereum-optimism/optimism/op-preimage"
 	"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
 	"github.com/ethereum-optimism/optimism/op-service/ioutil"
 	"github.com/ethereum/go-ethereum/common"
@@ -23,57 +22,37 @@ import (
 	"github.com/ethereum-optimism/optimism/cannon/mipsevm"
 )
 
-const (
-	proofsDir      = "proofs"
-	diskStateCache = "state.json.gz"
-)
-
-type proofData struct {
-	ClaimValue   common.Hash   `json:"post"`
-	StateData    hexutil.Bytes `json:"state-data"`
-	ProofData    hexutil.Bytes `json:"proof-data"`
-	OracleKey    hexutil.Bytes `json:"oracle-key,omitempty"`
-	OracleValue  hexutil.Bytes `json:"oracle-value,omitempty"`
-	OracleOffset uint32        `json:"oracle-offset,omitempty"`
-}
-
 type CannonMetricer interface {
 	RecordCannonExecutionTime(t float64)
 }
 
-type ProofGenerator interface {
-	// GenerateProof executes cannon to generate a proof at the specified trace index in dataDir.
-	GenerateProof(ctx context.Context, dataDir string, proofAt uint64) error
-}
-
 type CannonTraceProvider struct {
 	logger         log.Logger
 	dir            string
 	prestate       string
-	generator      ProofGenerator
+	generator      utils.ProofGenerator
 	gameDepth      types.Depth
-	preimageLoader *preimageLoader
+	preimageLoader *utils.PreimageLoader
+
+	types.PrestateProvider
 
 	// lastStep stores the last step in the actual trace if known. 0 indicates unknown.
 	// Cached as an optimisation to avoid repeatedly attempting to execute beyond the end of the trace.
 	lastStep uint64
 }
 
-func NewTraceProvider(logger log.Logger, m CannonMetricer, cfg *config.Config, localInputs LocalGameInputs, dir string, gameDepth types.Depth) *CannonTraceProvider {
+func NewTraceProvider(logger log.Logger, m CannonMetricer, cfg *config.Config, prestateProvider types.PrestateProvider, prestate string, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *CannonTraceProvider {
 	return &CannonTraceProvider{
-		logger:         logger,
-		dir:            dir,
-		prestate:       cfg.CannonAbsolutePreState,
-		generator:      NewExecutor(logger, m, cfg, localInputs),
-		gameDepth:      gameDepth,
-		preimageLoader: newPreimageLoader(kvstore.NewDiskKV(preimageDir(dir)).Get),
+		logger:           logger,
+		dir:              dir,
+		prestate:         prestate,
+		generator:        NewExecutor(logger, m, cfg, prestate, localInputs),
+		gameDepth:        gameDepth,
+		preimageLoader:   utils.NewPreimageLoader(kvstore.NewDiskKV(utils.PreimageDir(dir)).Get),
+		PrestateProvider: prestateProvider,
 	}
 }
 
-func (p *CannonTraceProvider) SetMaxDepth(gameDepth types.Depth) {
-	p.gameDepth = gameDepth
-}
-
 func (p *CannonTraceProvider) Get(ctx context.Context, pos types.Position) (common.Hash, error) {
 	traceIndex := pos.TraceIndex(p.gameDepth)
 	if !traceIndex.IsUint64() {
@@ -115,32 +94,16 @@ func (p *CannonTraceProvider) GetStepData(ctx context.Context, pos types.Positio
 	return value, data, oracleData, nil
 }
 
-func (p *CannonTraceProvider) absolutePreState() ([]byte, error) {
-	state, err := parseState(p.prestate)
-	if err != nil {
-		return nil, fmt.Errorf("cannot load absolute pre-state: %w", err)
-	}
-	return state.EncodeWitness(), nil
-}
-
-func (p *CannonTraceProvider) AbsolutePreStateCommitment(_ context.Context) (common.Hash, error) {
-	state, err := p.absolutePreState()
-	if err != nil {
-		return common.Hash{}, fmt.Errorf("cannot load absolute pre-state: %w", err)
-	}
-	hash, err := mipsevm.StateWitness(state).StateHash()
-	if err != nil {
-		return common.Hash{}, fmt.Errorf("cannot hash absolute pre-state: %w", err)
-	}
-	return hash, nil
+func (p *CannonTraceProvider) GetL2BlockNumberChallenge(_ context.Context) (*types.InvalidL2BlockNumberChallenge, error) {
+	return nil, types.ErrL2BlockNumberValid
 }
 
 // loadProof will attempt to load or generate the proof data at the specified index
 // If the requested index is beyond the end of the actual trace it is extended with no-op instructions.
-func (p *CannonTraceProvider) loadProof(ctx context.Context, i uint64) (*proofData, error) {
+func (p *CannonTraceProvider) loadProof(ctx context.Context, i uint64) (*utils.ProofData, error) {
 	// Attempt to read the last step from disk cache
 	if p.lastStep == 0 {
-		step, err := readLastStep(p.dir)
+		step, err := utils.ReadLastStep(p.dir)
 		if err != nil {
 			p.logger.Warn("Failed to read last step from disk cache", "err", err)
 		} else {
@@ -151,7 +114,7 @@ func (p *CannonTraceProvider) loadProof(ctx context.Context, i uint64) (*proofDa
 	if p.lastStep != 0 && i > p.lastStep {
 		i = p.lastStep
 	}
-	path := filepath.Join(p.dir, proofsDir, fmt.Sprintf("%d.json.gz", i))
+	path := filepath.Join(p.dir, utils.ProofsDir, fmt.Sprintf("%d.json.gz", i))
 	file, err := ioutil.OpenDecompressed(path)
 	if errors.Is(err, os.ErrNotExist) {
 		if err := p.generator.GenerateProof(ctx, p.dir, i); err != nil {
@@ -177,7 +140,7 @@ func (p *CannonTraceProvider) loadProof(ctx context.Context, i uint64) (*proofDa
 				if err != nil {
 					return nil, fmt.Errorf("cannot hash witness: %w", err)
 				}
-				proof := &proofData{
+				proof := &utils.ProofData{
 					ClaimValue:   witnessHash,
 					StateData:    hexutil.Bytes(witness),
 					ProofData:    []byte{},
@@ -185,7 +148,7 @@ func (p *CannonTraceProvider) loadProof(ctx context.Context, i uint64) (*proofDa
 					OracleValue:  nil,
 					OracleOffset: 0,
 				}
-				if err := writeLastStep(p.dir, proof, p.lastStep); err != nil {
+				if err := utils.WriteLastStep(p.dir, proof, p.lastStep); err != nil {
 					p.logger.Warn("Failed to write last step to disk cache", "step", p.lastStep)
 				}
 				return proof, nil
@@ -198,7 +161,7 @@ func (p *CannonTraceProvider) loadProof(ctx context.Context, i uint64) (*proofDa
 		return nil, fmt.Errorf("cannot open proof file (%v): %w", path, err)
 	}
 	defer file.Close()
-	var proof proofData
+	var proof utils.ProofData
 	err = json.NewDecoder(file).Decode(&proof)
 	if err != nil {
 		return nil, fmt.Errorf("failed to read proof (%v): %w", path, err)
@@ -207,94 +170,32 @@ func (p *CannonTraceProvider) loadProof(ctx context.Context, i uint64) (*proofDa
 }
 
 func (c *CannonTraceProvider) finalState() (*mipsevm.State, error) {
-	state, err := parseState(filepath.Join(c.dir, finalState))
+	state, err := parseState(filepath.Join(c.dir, utils.FinalState))
 	if err != nil {
 		return nil, fmt.Errorf("cannot read final state: %w", err)
 	}
 	return state, nil
 }
 
-type diskStateCacheObj struct {
-	Step uint64 `json:"step"`
-}
-
-// readLastStep reads the tracked last step from disk.
-func readLastStep(dir string) (uint64, error) {
-	state := diskStateCacheObj{}
-	file, err := ioutil.OpenDecompressed(filepath.Join(dir, diskStateCache))
-	if err != nil {
-		return 0, err
-	}
-	defer file.Close()
-	err = json.NewDecoder(file).Decode(&state)
-	if err != nil {
-		return 0, err
-	}
-	return state.Step, nil
-}
-
-// writeLastStep writes the last step and proof to disk as a persistent cache.
-func writeLastStep(dir string, proof *proofData, step uint64) error {
-	state := diskStateCacheObj{Step: step}
-	lastStepFile := filepath.Join(dir, diskStateCache)
-	if err := ioutil.WriteCompressedJson(lastStepFile, state); err != nil {
-		return fmt.Errorf("failed to write last step to %v: %w", lastStepFile, err)
-	}
-	if err := ioutil.WriteCompressedJson(filepath.Join(dir, proofsDir, fmt.Sprintf("%d.json.gz", step)), proof); err != nil {
-		return fmt.Errorf("failed to write proof: %w", err)
-	}
-	return nil
-}
-
 // CannonTraceProviderForTest is a CannonTraceProvider that can find the step referencing the preimage read
 // Only to be used for testing
 type CannonTraceProviderForTest struct {
 	*CannonTraceProvider
 }
 
-type preimageOpts []string
-
-type PreimageOpt func() preimageOpts
-
-func PreimageLoad(key preimage.Key, offset uint32) PreimageOpt {
-	return func() preimageOpts {
-		return []string{"--stop-at-preimage", fmt.Sprintf("%v@%v", common.Hash(key.PreimageKey()).Hex(), offset)}
-	}
-}
-
-func FirstPreimageLoadOfType(preimageType string) PreimageOpt {
-	return func() preimageOpts {
-		return []string{"--stop-at-preimage-type", preimageType}
-	}
-}
-
-func FirstKeccakPreimageLoad() PreimageOpt {
-	return FirstPreimageLoadOfType("keccak")
-}
-
-func FirstPrecompilePreimageLoad() PreimageOpt {
-	return FirstPreimageLoadOfType("precompile")
-}
-
-func PreimageLargerThan(size int) PreimageOpt {
-	return func() preimageOpts {
-		return []string{"--stop-at-preimage-larger-than", strconv.Itoa(size)}
-	}
-}
-
-func NewTraceProviderForTest(logger log.Logger, m CannonMetricer, cfg *config.Config, localInputs LocalGameInputs, dir string, gameDepth types.Depth) *CannonTraceProviderForTest {
+func NewTraceProviderForTest(logger log.Logger, m CannonMetricer, cfg *config.Config, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *CannonTraceProviderForTest {
 	p := &CannonTraceProvider{
 		logger:         logger,
 		dir:            dir,
 		prestate:       cfg.CannonAbsolutePreState,
-		generator:      NewExecutor(logger, m, cfg, localInputs),
+		generator:      NewExecutor(logger, m, cfg, cfg.CannonAbsolutePreState, localInputs),
 		gameDepth:      gameDepth,
-		preimageLoader: newPreimageLoader(kvstore.NewDiskKV(preimageDir(dir)).Get),
+		preimageLoader: utils.NewPreimageLoader(kvstore.NewDiskKV(utils.PreimageDir(dir)).Get),
 	}
 	return &CannonTraceProviderForTest{p}
 }
 
-func (p *CannonTraceProviderForTest) FindStep(ctx context.Context, start uint64, preimage PreimageOpt) (uint64, error) {
+func (p *CannonTraceProviderForTest) FindStep(ctx context.Context, start uint64, preimage utils.PreimageOpt) (uint64, error) {
 	// Run cannon to find the step that meets the preimage conditions
 	if err := p.generator.(*Executor).generateProof(ctx, p.dir, start, math.MaxUint64, preimage()...); err != nil {
 		return 0, fmt.Errorf("generate cannon trace (until preimage read): %w", err)
diff --git a/op-challenger/game/fault/trace/cannon/provider_test.go b/op-challenger/game/fault/trace/cannon/provider_test.go
index a98b59adf6e8..388bd151991b 100644
--- a/op-challenger/game/fault/trace/cannon/provider_test.go
+++ b/op-challenger/game/fault/trace/cannon/provider_test.go
@@ -3,7 +3,6 @@ package cannon
 import (
 	"context"
 	"embed"
-	_ "embed"
 	"encoding/json"
 	"fmt"
 	"math"
@@ -13,6 +12,7 @@ import (
 	"testing"
 
 	"github.com/ethereum-optimism/optimism/cannon/mipsevm"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-service/ioutil"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
@@ -110,7 +110,7 @@ func TestGetStepData(t *testing.T) {
 			Step:   10,
 			Exited: true,
 		}
-		generator.proof = &proofData{
+		generator.proof = &utils.ProofData{
 			ClaimValue:   common.Hash{0xaa},
 			StateData:    []byte{0xbb},
 			ProofData:    []byte{0xcc},
@@ -136,7 +136,7 @@ func TestGetStepData(t *testing.T) {
 			Step:   10,
 			Exited: true,
 		}
-		generator.proof = &proofData{
+		generator.proof = &utils.ProofData{
 			ClaimValue:   common.Hash{0xaa},
 			StateData:    []byte{0xbb},
 			ProofData:    []byte{0xcc},
@@ -162,7 +162,7 @@ func TestGetStepData(t *testing.T) {
 			Step:   10,
 			Exited: true,
 		}
-		initGenerator.proof = &proofData{
+		initGenerator.proof = &utils.ProofData{
 			ClaimValue:   common.Hash{0xaa},
 			StateData:    []byte{0xbb},
 			ProofData:    []byte{0xcc},
@@ -180,7 +180,7 @@ func TestGetStepData(t *testing.T) {
 			Step:   10,
 			Exited: true,
 		}
-		generator.proof = &proofData{
+		generator.proof = &utils.ProofData{
 			ClaimValue: common.Hash{0xaa},
 			StateData:  []byte{0xbb},
 			ProofData:  []byte{0xcc},
@@ -221,12 +221,13 @@ func setupTestData(t *testing.T) (string, string) {
 	entries, err := testData.ReadDir(srcDir)
 	require.NoError(t, err)
 	dataDir := t.TempDir()
-	require.NoError(t, os.Mkdir(filepath.Join(dataDir, proofsDir), 0o777))
+	require.NoError(t, os.Mkdir(filepath.Join(dataDir, utils.ProofsDir), 0o777))
 	for _, entry := range entries {
 		path := filepath.Join(srcDir, entry.Name())
 		file, err := testData.ReadFile(path)
 		require.NoErrorf(t, err, "reading %v", path)
-		err = writeGzip(filepath.Join(dataDir, proofsDir, entry.Name()+".gz"), file)
+		proofFile := filepath.Join(dataDir, utils.ProofsDir, entry.Name()+".gz")
+		err = ioutil.WriteCompressedBytes(proofFile, file, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0o644)
 		require.NoErrorf(t, err, "writing %v", path)
 	}
 	return dataDir, "state.json"
@@ -246,36 +247,30 @@ func setupWithTestData(t *testing.T, dataDir string, prestate string) (*CannonTr
 type stubGenerator struct {
 	generated  []int // Using int makes assertions easier
 	finalState *mipsevm.State
-	proof      *proofData
+	proof      *utils.ProofData
 }
 
 func (e *stubGenerator) GenerateProof(ctx context.Context, dir string, i uint64) error {
 	e.generated = append(e.generated, int(i))
+	var proofFile string
+	var data []byte
+	var err error
 	if e.finalState != nil && e.finalState.Step <= i {
 		// Requesting a trace index past the end of the trace
-		data, err := json.Marshal(e.finalState)
+		proofFile = filepath.Join(dir, utils.FinalState)
+		data, err = json.Marshal(e.finalState)
 		if err != nil {
 			return err
 		}
-		return writeGzip(filepath.Join(dir, finalState), data)
+		return ioutil.WriteCompressedBytes(proofFile, data, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0o644)
 	}
 	if e.proof != nil {
-		proofFile := filepath.Join(dir, proofsDir, fmt.Sprintf("%d.json.gz", i))
-		data, err := json.Marshal(e.proof)
+		proofFile = filepath.Join(dir, utils.ProofsDir, fmt.Sprintf("%d.json.gz", i))
+		data, err = json.Marshal(e.proof)
 		if err != nil {
 			return err
 		}
-		return writeGzip(proofFile, data)
+		return ioutil.WriteCompressedBytes(proofFile, data, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0o644)
 	}
 	return nil
 }
-
-func writeGzip(path string, data []byte) error {
-	writer, err := ioutil.OpenCompressed(path, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0o644)
-	if err != nil {
-		return err
-	}
-	defer writer.Close()
-	_, err = writer.Write(data)
-	return err
-}
diff --git a/op-challenger/game/fault/trace/cannon/cannon_state.go b/op-challenger/game/fault/trace/cannon/state.go
similarity index 61%
rename from op-challenger/game/fault/trace/cannon/cannon_state.go
rename to op-challenger/game/fault/trace/cannon/state.go
index cccc6e56806b..db0c9c50a94c 100644
--- a/op-challenger/game/fault/trace/cannon/cannon_state.go
+++ b/op-challenger/game/fault/trace/cannon/state.go
@@ -3,6 +3,7 @@ package cannon
 import (
 	"encoding/json"
 	"fmt"
+	"io"
 
 	"github.com/ethereum-optimism/optimism/cannon/mipsevm"
 	"github.com/ethereum-optimism/optimism/op-service/ioutil"
@@ -13,11 +14,14 @@ func parseState(path string) (*mipsevm.State, error) {
 	if err != nil {
 		return nil, fmt.Errorf("cannot open state file (%v): %w", path, err)
 	}
-	defer file.Close()
+	return parseStateFromReader(file)
+}
+
+func parseStateFromReader(in io.ReadCloser) (*mipsevm.State, error) {
+	defer in.Close()
 	var state mipsevm.State
-	err = json.NewDecoder(file).Decode(&state)
-	if err != nil {
-		return nil, fmt.Errorf("invalid mipsevm state (%v): %w", path, err)
+	if err := json.NewDecoder(in).Decode(&state); err != nil {
+		return nil, fmt.Errorf("invalid mipsevm state: %w", err)
 	}
 	return &state, nil
 }
diff --git a/op-challenger/game/fault/trace/cannon/cannon_state_test.go b/op-challenger/game/fault/trace/cannon/state_test.go
similarity index 100%
rename from op-challenger/game/fault/trace/cannon/cannon_state_test.go
rename to op-challenger/game/fault/trace/cannon/state_test.go
diff --git a/op-challenger/game/fault/trace/outputs/output_alphabet.go b/op-challenger/game/fault/trace/outputs/output_alphabet.go
index 22b0fc762f83..72fdad7e0b80 100644
--- a/op-challenger/game/fault/trace/outputs/output_alphabet.go
+++ b/op-challenger/game/fault/trace/outputs/output_alphabet.go
@@ -7,6 +7,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/alphabet"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/split"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
@@ -19,12 +20,13 @@ func NewOutputAlphabetTraceAccessor(
 	m metrics.Metricer,
 	prestateProvider types.PrestateProvider,
 	rollupClient OutputRollupClient,
+	l2Client utils.L2HeaderSource,
 	l1Head eth.BlockID,
 	splitDepth types.Depth,
 	prestateBlock uint64,
 	poststateBlock uint64,
 ) (*trace.Accessor, error) {
-	outputProvider := NewTraceProvider(logger, prestateProvider, rollupClient, l1Head, splitDepth, prestateBlock, poststateBlock)
+	outputProvider := NewTraceProvider(logger, prestateProvider, rollupClient, l2Client, l1Head, splitDepth, prestateBlock, poststateBlock)
 	alphabetCreator := func(ctx context.Context, localContext common.Hash, depth types.Depth, agreed contracts.Proposal, claimed contracts.Proposal) (types.TraceProvider, error) {
 		provider := alphabet.NewTraceProvider(agreed.L2BlockNumber, depth)
 		return provider, nil
diff --git a/op-challenger/game/fault/trace/outputs/output_asterisc.go b/op-challenger/game/fault/trace/outputs/output_asterisc.go
new file mode 100644
index 000000000000..a6bbf39e7288
--- /dev/null
+++ b/op-challenger/game/fault/trace/outputs/output_asterisc.go
@@ -0,0 +1,50 @@
+package outputs
+
+import (
+	"context"
+	"fmt"
+	"path/filepath"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/config"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/asterisc"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/split"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
+	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/log"
+)
+
+func NewOutputAsteriscTraceAccessor(
+	logger log.Logger,
+	m metrics.Metricer,
+	cfg *config.Config,
+	l2Client utils.L2HeaderSource,
+	prestateProvider types.PrestateProvider,
+	asteriscPrestate string,
+	rollupClient OutputRollupClient,
+	dir string,
+	l1Head eth.BlockID,
+	splitDepth types.Depth,
+	prestateBlock uint64,
+	poststateBlock uint64,
+) (*trace.Accessor, error) {
+	outputProvider := NewTraceProvider(logger, prestateProvider, rollupClient, l2Client, l1Head, splitDepth, prestateBlock, poststateBlock)
+	asteriscCreator := func(ctx context.Context, localContext common.Hash, depth types.Depth, agreed contracts.Proposal, claimed contracts.Proposal) (types.TraceProvider, error) {
+		logger := logger.New("pre", agreed.OutputRoot, "post", claimed.OutputRoot, "localContext", localContext)
+		subdir := filepath.Join(dir, localContext.Hex())
+		localInputs, err := utils.FetchLocalInputsFromProposals(ctx, l1Head.Hash, l2Client, agreed, claimed)
+		if err != nil {
+			return nil, fmt.Errorf("failed to fetch asterisc local inputs: %w", err)
+		}
+		provider := asterisc.NewTraceProvider(logger, m, cfg, prestateProvider, asteriscPrestate, localInputs, subdir, depth)
+		return provider, nil
+	}
+
+	cache := NewProviderCache(m, "output_asterisc_provider", asteriscCreator)
+	selector := split.NewSplitProviderSelector(outputProvider, splitDepth, OutputRootSplitAdapter(outputProvider, cache.GetOrCreate))
+	return trace.NewAccessor(selector), nil
+}
diff --git a/op-challenger/game/fault/trace/outputs/output_cannon.go b/op-challenger/game/fault/trace/outputs/output_cannon.go
index 03c2bfb902e5..7a2b3d36a975 100644
--- a/op-challenger/game/fault/trace/outputs/output_cannon.go
+++ b/op-challenger/game/fault/trace/outputs/output_cannon.go
@@ -10,6 +10,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/cannon"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/split"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
@@ -21,8 +22,9 @@ func NewOutputCannonTraceAccessor(
 	logger log.Logger,
 	m metrics.Metricer,
 	cfg *config.Config,
-	l2Client cannon.L2HeaderSource,
+	l2Client utils.L2HeaderSource,
 	prestateProvider types.PrestateProvider,
+	cannonPrestate string,
 	rollupClient OutputRollupClient,
 	dir string,
 	l1Head eth.BlockID,
@@ -30,15 +32,15 @@ func NewOutputCannonTraceAccessor(
 	prestateBlock uint64,
 	poststateBlock uint64,
 ) (*trace.Accessor, error) {
-	outputProvider := NewTraceProvider(logger, prestateProvider, rollupClient, l1Head, splitDepth, prestateBlock, poststateBlock)
+	outputProvider := NewTraceProvider(logger, prestateProvider, rollupClient, l2Client, l1Head, splitDepth, prestateBlock, poststateBlock)
 	cannonCreator := func(ctx context.Context, localContext common.Hash, depth types.Depth, agreed contracts.Proposal, claimed contracts.Proposal) (types.TraceProvider, error) {
 		logger := logger.New("pre", agreed.OutputRoot, "post", claimed.OutputRoot, "localContext", localContext)
 		subdir := filepath.Join(dir, localContext.Hex())
-		localInputs, err := cannon.FetchLocalInputsFromProposals(ctx, l1Head.Hash, l2Client, agreed, claimed)
+		localInputs, err := utils.FetchLocalInputsFromProposals(ctx, l1Head.Hash, l2Client, agreed, claimed)
 		if err != nil {
 			return nil, fmt.Errorf("failed to fetch cannon local inputs: %w", err)
 		}
-		provider := cannon.NewTraceProvider(logger, m, cfg, localInputs, subdir, depth)
+		provider := cannon.NewTraceProvider(logger, m, cfg, prestateProvider, cannonPrestate, localInputs, subdir, depth)
 		return provider, nil
 	}
 
diff --git a/op-challenger/game/fault/trace/outputs/provider.go b/op-challenger/game/fault/trace/outputs/provider.go
index d2da7fd45a52..410b7b15d02d 100644
--- a/op-challenger/game/fault/trace/outputs/provider.go
+++ b/op-challenger/game/fault/trace/outputs/provider.go
@@ -4,7 +4,9 @@ import (
 	"context"
 	"errors"
 	"fmt"
+	"math/big"
 
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum/go-ethereum/common"
@@ -29,17 +31,19 @@ type OutputTraceProvider struct {
 	types.PrestateProvider
 	logger         log.Logger
 	rollupProvider OutputRollupClient
+	l2Client       utils.L2HeaderSource
 	prestateBlock  uint64
 	poststateBlock uint64
 	l1Head         eth.BlockID
 	gameDepth      types.Depth
 }
 
-func NewTraceProvider(logger log.Logger, prestateProvider types.PrestateProvider, rollupProvider OutputRollupClient, l1Head eth.BlockID, gameDepth types.Depth, prestateBlock, poststateBlock uint64) *OutputTraceProvider {
+func NewTraceProvider(logger log.Logger, prestateProvider types.PrestateProvider, rollupProvider OutputRollupClient, l2Client utils.L2HeaderSource, l1Head eth.BlockID, gameDepth types.Depth, prestateBlock, poststateBlock uint64) *OutputTraceProvider {
 	return &OutputTraceProvider{
 		PrestateProvider: prestateProvider,
 		logger:           logger,
 		rollupProvider:   rollupProvider,
+		l2Client:         l2Client,
 		prestateBlock:    prestateBlock,
 		poststateBlock:   poststateBlock,
 		l1Head:           l1Head,
@@ -94,6 +98,29 @@ func (o *OutputTraceProvider) GetStepData(_ context.Context, _ types.Position) (
 	return nil, nil, nil, ErrGetStepData
 }
 
+func (o *OutputTraceProvider) GetL2BlockNumberChallenge(ctx context.Context) (*types.InvalidL2BlockNumberChallenge, error) {
+	outputBlock, err := o.HonestBlockNumber(ctx, types.RootPosition)
+	if err != nil {
+		return nil, err
+	}
+	claimedBlock, err := o.ClaimedBlockNumber(types.RootPosition)
+	if err != nil {
+		return nil, err
+	}
+	if claimedBlock == outputBlock {
+		return nil, types.ErrL2BlockNumberValid
+	}
+	output, err := o.rollupProvider.OutputAtBlock(ctx, outputBlock)
+	if err != nil {
+		return nil, err
+	}
+	header, err := o.l2Client.HeaderByNumber(ctx, new(big.Int).SetUint64(outputBlock))
+	if err != nil {
+		return nil, fmt.Errorf("failed to retrieve L2 block header %v: %w", outputBlock, err)
+	}
+	return types.NewInvalidL2BlockNumberProof(output, header), nil
+}
+
 func (o *OutputTraceProvider) outputAtBlock(ctx context.Context, block uint64) (common.Hash, error) {
 	output, err := o.rollupProvider.OutputAtBlock(ctx, block)
 	if err != nil {
diff --git a/op-challenger/game/fault/trace/outputs/provider_test.go b/op-challenger/game/fault/trace/outputs/provider_test.go
index c4e154ff17c3..daaddaaad4ab 100644
--- a/op-challenger/game/fault/trace/outputs/provider_test.go
+++ b/op-challenger/game/fault/trace/outputs/provider_test.go
@@ -11,7 +11,9 @@ import (
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
+	"github.com/ethereum/go-ethereum"
 	"github.com/ethereum/go-ethereum/common"
+	ethTypes "github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
 )
@@ -29,34 +31,34 @@ var (
 func TestGet(t *testing.T) {
 	t.Run("ErrorsTraceIndexOutOfBounds", func(t *testing.T) {
 		deepGame := types.Depth(164)
-		provider, _ := setupWithTestData(t, prestateBlock, poststateBlock, deepGame)
+		provider, _, _ := setupWithTestData(t, prestateBlock, poststateBlock, deepGame)
 		pos := types.NewPosition(0, big.NewInt(0))
 		_, err := provider.Get(context.Background(), pos)
 		require.ErrorIs(t, err, ErrIndexTooBig)
 	})
 
 	t.Run("FirstBlockAfterPrestate", func(t *testing.T) {
-		provider, _ := setupWithTestData(t, prestateBlock, poststateBlock)
+		provider, _, _ := setupWithTestData(t, prestateBlock, poststateBlock)
 		value, err := provider.Get(context.Background(), types.NewPosition(gameDepth, big.NewInt(0)))
 		require.NoError(t, err)
 		require.Equal(t, firstOutputRoot, value)
 	})
 
 	t.Run("MissingOutputAtBlock", func(t *testing.T) {
-		provider, _ := setupWithTestData(t, prestateBlock, poststateBlock)
+		provider, _, _ := setupWithTestData(t, prestateBlock, poststateBlock)
 		_, err := provider.Get(context.Background(), types.NewPosition(gameDepth, big.NewInt(1)))
 		require.ErrorIs(t, err, errNoOutputAtBlock)
 	})
 
 	t.Run("PostStateBlock", func(t *testing.T) {
-		provider, _ := setupWithTestData(t, prestateBlock, poststateBlock)
+		provider, _, _ := setupWithTestData(t, prestateBlock, poststateBlock)
 		value, err := provider.Get(context.Background(), types.NewPositionFromGIndex(big.NewInt(228)))
 		require.NoError(t, err)
 		require.Equal(t, value, poststateOutputRoot)
 	})
 
 	t.Run("AfterPostStateBlock", func(t *testing.T) {
-		provider, _ := setupWithTestData(t, prestateBlock, poststateBlock)
+		provider, _, _ := setupWithTestData(t, prestateBlock, poststateBlock)
 		value, err := provider.Get(context.Background(), types.NewPositionFromGIndex(big.NewInt(229)))
 		require.NoError(t, err)
 		require.Equal(t, value, poststateOutputRoot)
@@ -87,7 +89,7 @@ func TestHonestBlockNumber(t *testing.T) {
 	for _, test := range tests {
 		test := test
 		t.Run(test.name, func(t *testing.T) {
-			provider, stubRollupClient := setupWithTestData(t, prestateBlock, poststateBlock)
+			provider, stubRollupClient, _ := setupWithTestData(t, prestateBlock, poststateBlock)
 			stubRollupClient.maxSafeHead = test.maxSafeHead
 			actual, err := provider.HonestBlockNumber(context.Background(), test.pos)
 			require.NoError(t, err)
@@ -97,13 +99,55 @@ func TestHonestBlockNumber(t *testing.T) {
 
 	t.Run("ErrorsTraceIndexOutOfBounds", func(t *testing.T) {
 		deepGame := types.Depth(164)
-		provider, _ := setupWithTestData(t, prestateBlock, poststateBlock, deepGame)
+		provider, _, _ := setupWithTestData(t, prestateBlock, poststateBlock, deepGame)
 		pos := types.NewPosition(0, big.NewInt(0))
 		_, err := provider.HonestBlockNumber(context.Background(), pos)
 		require.ErrorIs(t, err, ErrIndexTooBig)
 	})
 }
 
+func TestGetL2BlockNumberChallenge(t *testing.T) {
+	tests := []struct {
+		name            string
+		maxSafeHead     uint64
+		expectChallenge bool
+	}{
+		{"NoChallengeWhenMaxHeadNotLimited", math.MaxUint64, false},
+		{"NoChallengeWhenBeforeMaxHead", poststateBlock + 1, false},
+		{"NoChallengeWhenAtMaxHead", poststateBlock, false},
+		{"ChallengeWhenBeforeMaxHead", poststateBlock - 1, true},
+	}
+	for _, test := range tests {
+		test := test
+		t.Run(test.name, func(t *testing.T) {
+			provider, stubRollupClient, stubL2Client := setupWithTestData(t, prestateBlock, poststateBlock)
+			stubRollupClient.maxSafeHead = test.maxSafeHead
+			if test.expectChallenge {
+				stubRollupClient.outputs[test.maxSafeHead] = ð.OutputResponse{
+					OutputRoot: eth.Bytes32{0xaa},
+					BlockRef: eth.L2BlockRef{
+						Number: test.maxSafeHead,
+					},
+				}
+				stubL2Client.headers[test.maxSafeHead] = ðTypes.Header{
+					Number: new(big.Int).SetUint64(test.maxSafeHead),
+					Root:   common.Hash{0xcc},
+				}
+			}
+			actual, err := provider.GetL2BlockNumberChallenge(context.Background())
+			if test.expectChallenge {
+				require.NoError(t, err)
+				require.Equal(t, &types.InvalidL2BlockNumberChallenge{
+					Output: stubRollupClient.outputs[test.maxSafeHead],
+					Header: stubL2Client.headers[test.maxSafeHead],
+				}, actual)
+			} else {
+				require.ErrorIs(t, err, types.ErrL2BlockNumberValid)
+			}
+		})
+	}
+}
+
 func TestClaimedBlockNumber(t *testing.T) {
 	tests := []struct {
 		name        string
@@ -128,7 +172,7 @@ func TestClaimedBlockNumber(t *testing.T) {
 	for _, test := range tests {
 		test := test
 		t.Run(test.name, func(t *testing.T) {
-			provider, stubRollupClient := setupWithTestData(t, prestateBlock, poststateBlock)
+			provider, stubRollupClient, _ := setupWithTestData(t, prestateBlock, poststateBlock)
 			stubRollupClient.maxSafeHead = test.maxSafeHead
 			actual, err := provider.ClaimedBlockNumber(test.pos)
 			require.NoError(t, err)
@@ -138,7 +182,7 @@ func TestClaimedBlockNumber(t *testing.T) {
 
 	t.Run("ErrorsTraceIndexOutOfBounds", func(t *testing.T) {
 		deepGame := types.Depth(164)
-		provider, _ := setupWithTestData(t, prestateBlock, poststateBlock, deepGame)
+		provider, _, _ := setupWithTestData(t, prestateBlock, poststateBlock, deepGame)
 		pos := types.NewPosition(0, big.NewInt(0))
 		_, err := provider.ClaimedBlockNumber(pos)
 		require.ErrorIs(t, err, ErrIndexTooBig)
@@ -146,12 +190,12 @@ func TestClaimedBlockNumber(t *testing.T) {
 }
 
 func TestGetStepData(t *testing.T) {
-	provider, _ := setupWithTestData(t, prestateBlock, poststateBlock)
+	provider, _, _ := setupWithTestData(t, prestateBlock, poststateBlock)
 	_, _, _, err := provider.GetStepData(context.Background(), types.NewPosition(1, common.Big0))
 	require.ErrorIs(t, err, ErrGetStepData)
 }
 
-func setupWithTestData(t *testing.T, prestateBlock, poststateBlock uint64, customGameDepth ...types.Depth) (*OutputTraceProvider, *stubRollupClient) {
+func setupWithTestData(t *testing.T, prestateBlock, poststateBlock uint64, customGameDepth ...types.Depth) (*OutputTraceProvider, *stubRollupClient, *stubL2HeaderSource) {
 	rollupClient := &stubRollupClient{
 		outputs: map[uint64]*eth.OutputResponse{
 			prestateBlock: {
@@ -166,6 +210,9 @@ func setupWithTestData(t *testing.T, prestateBlock, poststateBlock uint64, custo
 		},
 		maxSafeHead: math.MaxUint64,
 	}
+	l2Client := &stubL2HeaderSource{
+		headers: make(map[uint64]*ethTypes.Header),
+	}
 	inputGameDepth := gameDepth
 	if len(customGameDepth) > 0 {
 		inputGameDepth = customGameDepth[0]
@@ -173,10 +220,11 @@ func setupWithTestData(t *testing.T, prestateBlock, poststateBlock uint64, custo
 	return &OutputTraceProvider{
 		logger:         testlog.Logger(t, log.LevelInfo),
 		rollupProvider: rollupClient,
+		l2Client:       l2Client,
 		prestateBlock:  prestateBlock,
 		poststateBlock: poststateBlock,
 		gameDepth:      inputGameDepth,
-	}, rollupClient
+	}, rollupClient, l2Client
 }
 
 type stubRollupClient struct {
@@ -201,3 +249,15 @@ func (s *stubRollupClient) SafeHeadAtL1Block(_ context.Context, l1BlockNum uint6
 		},
 	}, nil
 }
+
+type stubL2HeaderSource struct {
+	headers map[uint64]*ethTypes.Header
+}
+
+func (s *stubL2HeaderSource) HeaderByNumber(_ context.Context, num *big.Int) (*ethTypes.Header, error) {
+	header, ok := s.headers[num.Uint64()]
+	if !ok {
+		return nil, ethereum.NotFound
+	}
+	return header, nil
+}
diff --git a/op-challenger/game/fault/trace/outputs/split_adapter_test.go b/op-challenger/game/fault/trace/outputs/split_adapter_test.go
index 8eabc520def7..b791df7ee63f 100644
--- a/op-challenger/game/fault/trace/outputs/split_adapter_test.go
+++ b/op-challenger/game/fault/trace/outputs/split_adapter_test.go
@@ -139,7 +139,7 @@ func setupAdapterTest(t *testing.T, topDepth types.Depth) (split.ProviderCreator
 	prestateProvider := &stubPrestateProvider{
 		absolutePrestate: prestateOutputRoot,
 	}
-	topProvider := NewTraceProvider(testlog.Logger(t, log.LevelInfo), prestateProvider, rollupClient, l1Head, topDepth, prestateBlock, poststateBlock)
+	topProvider := NewTraceProvider(testlog.Logger(t, log.LevelInfo), prestateProvider, rollupClient, nil, l1Head, topDepth, prestateBlock, poststateBlock)
 	adapter := OutputRootSplitAdapter(topProvider, creator.Create)
 	return adapter, creator
 }
diff --git a/op-challenger/game/fault/trace/prestates/cache.go b/op-challenger/game/fault/trace/prestates/cache.go
new file mode 100644
index 000000000000..03915477f19c
--- /dev/null
+++ b/op-challenger/game/fault/trace/prestates/cache.go
@@ -0,0 +1,39 @@
+package prestates
+
+import (
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum-optimism/optimism/op-service/sources/caching"
+	"github.com/ethereum/go-ethereum/common"
+)
+
+type PrestateSource interface {
+	// PrestatePath returns the path to the prestate file to use for the game.
+	// The provided prestateHash may be used to differentiate between different states but no guarantee is made that
+	// the returned prestate matches the supplied hash.
+	PrestatePath(prestateHash common.Hash) (string, error)
+}
+
+type PrestateProviderCache struct {
+	createProvider func(prestateHash common.Hash) (types.PrestateProvider, error)
+	cache          *caching.LRUCache[common.Hash, types.PrestateProvider]
+}
+
+func NewPrestateProviderCache(m caching.Metrics, label string, createProvider func(prestateHash common.Hash) (types.PrestateProvider, error)) *PrestateProviderCache {
+	return &PrestateProviderCache{
+		createProvider: createProvider,
+		cache:          caching.NewLRUCache[common.Hash, types.PrestateProvider](m, label, 5),
+	}
+}
+
+func (p *PrestateProviderCache) GetOrCreate(prestateHash common.Hash) (types.PrestateProvider, error) {
+	provider, ok := p.cache.Get(prestateHash)
+	if ok {
+		return provider, nil
+	}
+	provider, err := p.createProvider(prestateHash)
+	if err != nil {
+		return nil, err
+	}
+	p.cache.Add(prestateHash, provider)
+	return provider, nil
+}
diff --git a/op-challenger/game/fault/trace/prestates/cache_test.go b/op-challenger/game/fault/trace/prestates/cache_test.go
new file mode 100644
index 000000000000..820418eb4bda
--- /dev/null
+++ b/op-challenger/game/fault/trace/prestates/cache_test.go
@@ -0,0 +1,58 @@
+package prestates
+
+import (
+	"context"
+	"errors"
+	"testing"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/stretchr/testify/require"
+)
+
+func TestPrestateProviderCache_CreateAndCache(t *testing.T) {
+	cache := NewPrestateProviderCache(nil, "", func(prestateHash common.Hash) (types.PrestateProvider, error) {
+		return &stubPrestateProvider{commitment: prestateHash}, nil
+	})
+
+	hash1 := common.Hash{0xaa}
+	hash2 := common.Hash{0xbb}
+	provider1a, err := cache.GetOrCreate(hash1)
+	require.NoError(t, err)
+	commitment, err := provider1a.AbsolutePreStateCommitment(context.Background())
+	require.NoError(t, err)
+	require.Equal(t, hash1, commitment)
+
+	provider1b, err := cache.GetOrCreate(hash1)
+	require.NoError(t, err)
+	require.Same(t, provider1a, provider1b)
+	commitment, err = provider1b.AbsolutePreStateCommitment(context.Background())
+	require.NoError(t, err)
+	require.Equal(t, hash1, commitment)
+
+	provider2, err := cache.GetOrCreate(hash2)
+	require.NoError(t, err)
+	require.NotSame(t, provider1a, provider2)
+	commitment, err = provider2.AbsolutePreStateCommitment(context.Background())
+	require.NoError(t, err)
+	require.Equal(t, hash2, commitment)
+}
+
+func TestPrestateProviderCache_CreateFails(t *testing.T) {
+	hash1 := common.Hash{0xaa}
+	expectedErr := errors.New("boom")
+	cache := NewPrestateProviderCache(nil, "", func(prestateHash common.Hash) (types.PrestateProvider, error) {
+		return nil, expectedErr
+	})
+	provider, err := cache.GetOrCreate(hash1)
+	require.ErrorIs(t, err, expectedErr)
+	require.Nil(t, provider)
+}
+
+type stubPrestateProvider struct {
+	commitment common.Hash
+}
+
+func (s *stubPrestateProvider) AbsolutePreStateCommitment(_ context.Context) (common.Hash, error) {
+	return s.commitment, nil
+}
diff --git a/op-challenger/game/fault/trace/prestates/multi.go b/op-challenger/game/fault/trace/prestates/multi.go
new file mode 100644
index 000000000000..ccc22c6d5d4a
--- /dev/null
+++ b/op-challenger/game/fault/trace/prestates/multi.go
@@ -0,0 +1,72 @@
+package prestates
+
+import (
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"os"
+	"path/filepath"
+
+	"github.com/ethereum-optimism/optimism/op-service/ioutil"
+	"github.com/ethereum/go-ethereum/common"
+)
+
+var (
+	ErrPrestateUnavailable = errors.New("prestate unavailable")
+)
+
+type MultiPrestateProvider struct {
+	baseUrl *url.URL
+	dataDir string
+}
+
+func NewMultiPrestateProvider(baseUrl *url.URL, dataDir string) *MultiPrestateProvider {
+	return &MultiPrestateProvider{
+		baseUrl: baseUrl,
+		dataDir: dataDir,
+	}
+}
+
+func (m *MultiPrestateProvider) PrestatePath(hash common.Hash) (string, error) {
+	path := filepath.Join(m.dataDir, hash.Hex()+".json.gz")
+	if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) {
+		if err := m.fetchPrestate(hash, path); err != nil {
+			return "", fmt.Errorf("failed to fetch prestate: %w", err)
+		}
+	} else if err != nil {
+		return "", fmt.Errorf("error checking for existing prestate %v: %w", hash, err)
+	}
+	return path, nil
+}
+
+func (m *MultiPrestateProvider) fetchPrestate(hash common.Hash, dest string) error {
+	if err := os.MkdirAll(m.dataDir, 0755); err != nil {
+		return fmt.Errorf("error creating prestate dir: %w", err)
+	}
+	prestateUrl := m.baseUrl.JoinPath(hash.Hex() + ".json")
+	resp, err := http.Get(prestateUrl.String())
+	if err != nil {
+		return fmt.Errorf("failed to fetch prestate from %v: %w", prestateUrl, err)
+	}
+	defer resp.Body.Close()
+	if resp.StatusCode != http.StatusOK {
+		return fmt.Errorf("%w from url %v: status %v", ErrPrestateUnavailable, prestateUrl, resp.StatusCode)
+	}
+	out, err := ioutil.NewAtomicWriterCompressed(dest, 0o644)
+	if err != nil {
+		return fmt.Errorf("failed to open atomic writer for %v: %w", dest, err)
+	}
+	defer func() {
+		// If errors occur, try to clean up without renaming the file into its final destination as Close() would do
+		_ = out.Abort()
+	}()
+	if _, err := io.Copy(out, resp.Body); err != nil {
+		return fmt.Errorf("failed to write file %v: %w", dest, err)
+	}
+	if err := out.Close(); err != nil {
+		return fmt.Errorf("failed to close file %v: %w", dest, err)
+	}
+	return nil
+}
diff --git a/op-challenger/game/fault/trace/prestates/multi_test.go b/op-challenger/game/fault/trace/prestates/multi_test.go
new file mode 100644
index 000000000000..2f825d98da4e
--- /dev/null
+++ b/op-challenger/game/fault/trace/prestates/multi_test.go
@@ -0,0 +1,91 @@
+package prestates
+
+import (
+	"io"
+	"net/http"
+	"net/http/httptest"
+	"net/url"
+	"os"
+	"path/filepath"
+	"testing"
+
+	"github.com/ethereum-optimism/optimism/op-service/ioutil"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/stretchr/testify/require"
+)
+
+func TestDownloadPrestate(t *testing.T) {
+	dir := t.TempDir()
+	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		_, _ = w.Write([]byte(r.URL.Path))
+	}))
+	defer server.Close()
+	provider := NewMultiPrestateProvider(parseURL(t, server.URL), dir)
+	hash := common.Hash{0xaa}
+	path, err := provider.PrestatePath(hash)
+	require.NoError(t, err)
+	in, err := ioutil.OpenDecompressed(path)
+	require.NoError(t, err)
+	defer in.Close()
+	content, err := io.ReadAll(in)
+	require.NoError(t, err)
+	require.Equal(t, "/"+hash.Hex()+".json", string(content))
+}
+
+func TestCreateDirectory(t *testing.T) {
+	dir := t.TempDir()
+	dir = filepath.Join(dir, "test")
+	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		_, _ = w.Write([]byte(r.URL.Path))
+	}))
+	defer server.Close()
+	provider := NewMultiPrestateProvider(parseURL(t, server.URL), dir)
+	hash := common.Hash{0xaa}
+	path, err := provider.PrestatePath(hash)
+	require.NoError(t, err)
+	in, err := ioutil.OpenDecompressed(path)
+	require.NoError(t, err)
+	defer in.Close()
+	content, err := io.ReadAll(in)
+	require.NoError(t, err)
+	require.Equal(t, "/"+hash.Hex()+".json", string(content))
+}
+
+func TestExistingPrestate(t *testing.T) {
+	dir := t.TempDir()
+	provider := NewMultiPrestateProvider(parseURL(t, "http://127.0.0.1:1"), dir)
+	hash := common.Hash{0xaa}
+	expectedFile := filepath.Join(dir, hash.Hex()+".json.gz")
+	err := ioutil.WriteCompressedBytes(expectedFile, []byte("expected content"), os.O_WRONLY|os.O_CREATE, 0o644)
+	require.NoError(t, err)
+
+	path, err := provider.PrestatePath(hash)
+	require.NoError(t, err)
+	require.Equal(t, expectedFile, path)
+	in, err := ioutil.OpenDecompressed(path)
+	require.NoError(t, err)
+	defer in.Close()
+	content, err := io.ReadAll(in)
+	require.NoError(t, err)
+	require.Equal(t, "expected content", string(content))
+}
+
+func TestMissingPrestate(t *testing.T) {
+	dir := t.TempDir()
+	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		w.WriteHeader(404)
+	}))
+	defer server.Close()
+	provider := NewMultiPrestateProvider(parseURL(t, server.URL), dir)
+	hash := common.Hash{0xaa}
+	path, err := provider.PrestatePath(hash)
+	require.ErrorIs(t, err, ErrPrestateUnavailable)
+	_, err = os.Stat(path)
+	require.ErrorIs(t, err, os.ErrNotExist)
+}
+
+func parseURL(t *testing.T, str string) *url.URL {
+	parsed, err := url.Parse(str)
+	require.NoError(t, err)
+	return parsed
+}
diff --git a/op-challenger/game/fault/trace/prestates/single.go b/op-challenger/game/fault/trace/prestates/single.go
new file mode 100644
index 000000000000..978f17f55d4d
--- /dev/null
+++ b/op-challenger/game/fault/trace/prestates/single.go
@@ -0,0 +1,15 @@
+package prestates
+
+import "github.com/ethereum/go-ethereum/common"
+
+type SinglePrestateSource struct {
+	path string
+}
+
+func NewSinglePrestateSource(path string) *SinglePrestateSource {
+	return &SinglePrestateSource{path: path}
+}
+
+func (s *SinglePrestateSource) PrestatePath(_ common.Hash) (string, error) {
+	return s.path, nil
+}
diff --git a/op-challenger/game/fault/trace/translate.go b/op-challenger/game/fault/trace/translate.go
index 38d0435b6dc1..0295e10db4c1 100644
--- a/op-challenger/game/fault/trace/translate.go
+++ b/op-challenger/game/fault/trace/translate.go
@@ -46,4 +46,8 @@ func (p *TranslatingProvider) AbsolutePreStateCommitment(ctx context.Context) (h
 	return p.provider.AbsolutePreStateCommitment(ctx)
 }
 
+func (p *TranslatingProvider) GetL2BlockNumberChallenge(ctx context.Context) (*types.InvalidL2BlockNumberChallenge, error) {
+	return p.provider.GetL2BlockNumberChallenge(ctx)
+}
+
 var _ types.TraceProvider = (*TranslatingProvider)(nil)
diff --git a/op-challenger/game/fault/trace/utils/executor.go b/op-challenger/game/fault/trace/utils/executor.go
new file mode 100644
index 000000000000..f3c5feac8311
--- /dev/null
+++ b/op-challenger/game/fault/trace/utils/executor.go
@@ -0,0 +1,81 @@
+package utils
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"regexp"
+	"strconv"
+
+	oplog "github.com/ethereum-optimism/optimism/op-service/log"
+	"github.com/ethereum/go-ethereum/log"
+)
+
+type SnapshotSelect func(logger log.Logger, dir string, absolutePreState string, i uint64) (string, error)
+type CmdExecutor func(ctx context.Context, l log.Logger, binary string, args ...string) error
+
+const (
+	SnapsDir     = "snapshots"
+	PreimagesDir = "preimages"
+	FinalState   = "final.json.gz"
+)
+
+var snapshotNameRegexp = regexp.MustCompile(`^[0-9]+\.json.gz$`)
+
+func PreimageDir(dir string) string {
+	return filepath.Join(dir, PreimagesDir)
+}
+
+func RunCmd(ctx context.Context, l log.Logger, binary string, args ...string) error {
+	cmd := exec.CommandContext(ctx, binary, args...)
+	stdOut := oplog.NewWriter(l, log.LevelInfo)
+	defer stdOut.Close()
+	// Keep stdErr at info level because FPVM uses stderr for progress messages
+	stdErr := oplog.NewWriter(l, log.LevelInfo)
+	defer stdErr.Close()
+	cmd.Stdout = stdOut
+	cmd.Stderr = stdErr
+	return cmd.Run()
+}
+
+// FindStartingSnapshot finds the closest snapshot before the specified traceIndex in snapDir.
+// If no suitable snapshot can be found it returns absolutePreState.
+func FindStartingSnapshot(logger log.Logger, snapDir string, absolutePreState string, traceIndex uint64) (string, error) {
+	// Find the closest snapshot to start from
+	entries, err := os.ReadDir(snapDir)
+	if err != nil {
+		if errors.Is(err, os.ErrNotExist) {
+			return absolutePreState, nil
+		}
+		return "", fmt.Errorf("list snapshots in %v: %w", snapDir, err)
+	}
+	bestSnap := uint64(0)
+	for _, entry := range entries {
+		if entry.IsDir() {
+			logger.Warn("Unexpected directory in snapshots dir", "parent", snapDir, "child", entry.Name())
+			continue
+		}
+		name := entry.Name()
+		if !snapshotNameRegexp.MatchString(name) {
+			logger.Warn("Unexpected file in snapshots dir", "parent", snapDir, "child", entry.Name())
+			continue
+		}
+		index, err := strconv.ParseUint(name[0:len(name)-len(".json.gz")], 10, 64)
+		if err != nil {
+			logger.Error("Unable to parse trace index of snapshot file", "parent", snapDir, "child", entry.Name())
+			continue
+		}
+		if index > bestSnap && index < traceIndex {
+			bestSnap = index
+		}
+	}
+	if bestSnap == 0 {
+		return absolutePreState, nil
+	}
+	startFrom := fmt.Sprintf("%v/%v.json.gz", snapDir, bestSnap)
+
+	return startFrom, nil
+}
diff --git a/op-challenger/game/fault/trace/cannon/local.go b/op-challenger/game/fault/trace/utils/local.go
similarity index 99%
rename from op-challenger/game/fault/trace/cannon/local.go
rename to op-challenger/game/fault/trace/utils/local.go
index 7f44886fd387..c84087b4c631 100644
--- a/op-challenger/game/fault/trace/cannon/local.go
+++ b/op-challenger/game/fault/trace/utils/local.go
@@ -1,4 +1,4 @@
-package cannon
+package utils
 
 import (
 	"context"
diff --git a/op-challenger/game/fault/trace/cannon/local_test.go b/op-challenger/game/fault/trace/utils/local_test.go
similarity index 99%
rename from op-challenger/game/fault/trace/cannon/local_test.go
rename to op-challenger/game/fault/trace/utils/local_test.go
index 4248b4dc6226..66fb40352fe6 100644
--- a/op-challenger/game/fault/trace/cannon/local_test.go
+++ b/op-challenger/game/fault/trace/utils/local_test.go
@@ -1,4 +1,4 @@
-package cannon
+package utils
 
 import (
 	"context"
diff --git a/op-challenger/game/fault/trace/cannon/preimage.go b/op-challenger/game/fault/trace/utils/preimage.go
similarity index 92%
rename from op-challenger/game/fault/trace/cannon/preimage.go
rename to op-challenger/game/fault/trace/utils/preimage.go
index 60bb6ec6fad2..b13333a566f6 100644
--- a/op-challenger/game/fault/trace/cannon/preimage.go
+++ b/op-challenger/game/fault/trace/utils/preimage.go
@@ -1,4 +1,4 @@
-package cannon
+package utils
 
 import (
 	"bytes"
@@ -29,17 +29,17 @@ var (
 
 type preimageSource func(key common.Hash) ([]byte, error)
 
-type preimageLoader struct {
+type PreimageLoader struct {
 	getPreimage preimageSource
 }
 
-func newPreimageLoader(getPreimage preimageSource) *preimageLoader {
-	return &preimageLoader{
+func NewPreimageLoader(getPreimage preimageSource) *PreimageLoader {
+	return &PreimageLoader{
 		getPreimage: getPreimage,
 	}
 }
 
-func (l *preimageLoader) LoadPreimage(proof *proofData) (*types.PreimageOracleData, error) {
+func (l *PreimageLoader) LoadPreimage(proof *ProofData) (*types.PreimageOracleData, error) {
 	if len(proof.OracleKey) == 0 {
 		return nil, nil
 	}
@@ -53,7 +53,7 @@ func (l *preimageLoader) LoadPreimage(proof *proofData) (*types.PreimageOracleDa
 	}
 }
 
-func (l *preimageLoader) loadBlobPreimage(proof *proofData) (*types.PreimageOracleData, error) {
+func (l *PreimageLoader) loadBlobPreimage(proof *ProofData) (*types.PreimageOracleData, error) {
 	// The key for a blob field element is a keccak hash of commitment++fieldElementIndex.
 	// First retrieve the preimage of the key as a keccak hash so we have the commitment and required field element
 	inputsKey := preimage.Keccak256Key(proof.OracleKey).PreimageKey()
@@ -102,7 +102,7 @@ func (l *preimageLoader) loadBlobPreimage(proof *proofData) (*types.PreimageOrac
 	return types.NewPreimageOracleBlobData(proof.OracleKey, claimWithLength, proof.OracleOffset, requiredFieldElement, commitment, kzgProof[:]), nil
 }
 
-func (l *preimageLoader) loadPrecompilePreimage(proof *proofData) (*types.PreimageOracleData, error) {
+func (l *PreimageLoader) loadPrecompilePreimage(proof *ProofData) (*types.PreimageOracleData, error) {
 	inputKey := preimage.Keccak256Key(proof.OracleKey).PreimageKey()
 	input, err := l.getPreimage(inputKey)
 	if err != nil {
diff --git a/op-challenger/game/fault/trace/cannon/preimage_test.go b/op-challenger/game/fault/trace/utils/preimage_test.go
similarity index 91%
rename from op-challenger/game/fault/trace/cannon/preimage_test.go
rename to op-challenger/game/fault/trace/utils/preimage_test.go
index 94fbbc35bc88..e2c9e87ede75 100644
--- a/op-challenger/game/fault/trace/cannon/preimage_test.go
+++ b/op-challenger/game/fault/trace/utils/preimage_test.go
@@ -1,4 +1,4 @@
-package cannon
+package utils
 
 import (
 	"crypto/sha256"
@@ -20,15 +20,15 @@ import (
 )
 
 func TestPreimageLoader_NoPreimage(t *testing.T) {
-	loader := newPreimageLoader(kvstore.NewMemKV().Get)
-	actual, err := loader.LoadPreimage(&proofData{})
+	loader := NewPreimageLoader(kvstore.NewMemKV().Get)
+	actual, err := loader.LoadPreimage(&ProofData{})
 	require.NoError(t, err)
 	require.Nil(t, actual)
 }
 
 func TestPreimageLoader_LocalPreimage(t *testing.T) {
-	loader := newPreimageLoader(kvstore.NewMemKV().Get)
-	proof := &proofData{
+	loader := NewPreimageLoader(kvstore.NewMemKV().Get)
+	proof := &ProofData{
 		OracleKey:    common.Hash{byte(preimage.LocalKeyType), 0xaa, 0xbb}.Bytes(),
 		OracleValue:  nil,
 		OracleOffset: 4,
@@ -48,8 +48,8 @@ func TestPreimageLoader_SimpleTypes(t *testing.T) {
 	for _, keyType := range tests {
 		keyType := keyType
 		t.Run(fmt.Sprintf("type-%v", keyType), func(t *testing.T) {
-			loader := newPreimageLoader(kvstore.NewMemKV().Get)
-			proof := &proofData{
+			loader := NewPreimageLoader(kvstore.NewMemKV().Get)
+			proof := &ProofData{
 				OracleKey:    common.Hash{byte(keyType), 0xaa, 0xbb}.Bytes(),
 				OracleValue:  []byte{1, 2, 3, 4, 5, 6},
 				OracleOffset: 3,
@@ -82,7 +82,7 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) {
 	binary.BigEndian.PutUint64(keyBuf[72:], fieldIndex)
 	key := preimage.BlobKey(crypto.Keccak256Hash(keyBuf)).PreimageKey()
 
-	proof := &proofData{
+	proof := &ProofData{
 		OracleKey:    key[:],
 		OracleValue:  elementDataWithLengthPrefix,
 		OracleOffset: 4,
@@ -90,8 +90,8 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) {
 
 	t.Run("NoKeyPreimage", func(t *testing.T) {
 		kv := kvstore.NewMemKV()
-		loader := newPreimageLoader(kv.Get)
-		proof := &proofData{
+		loader := NewPreimageLoader(kv.Get)
+		proof := &ProofData{
 			OracleKey:    common.Hash{byte(preimage.BlobKeyType), 0xaf}.Bytes(),
 			OracleValue:  proof.OracleValue,
 			OracleOffset: proof.OracleOffset,
@@ -102,8 +102,8 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) {
 
 	t.Run("InvalidKeyPreimage", func(t *testing.T) {
 		kv := kvstore.NewMemKV()
-		loader := newPreimageLoader(kv.Get)
-		proof := &proofData{
+		loader := NewPreimageLoader(kv.Get)
+		proof := &ProofData{
 			OracleKey:    common.Hash{byte(preimage.BlobKeyType), 0xad}.Bytes(),
 			OracleValue:  proof.OracleValue,
 			OracleOffset: proof.OracleOffset,
@@ -115,8 +115,8 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) {
 
 	t.Run("MissingBlobs", func(t *testing.T) {
 		kv := kvstore.NewMemKV()
-		loader := newPreimageLoader(kv.Get)
-		proof := &proofData{
+		loader := NewPreimageLoader(kv.Get)
+		proof := &ProofData{
 			OracleKey:    common.Hash{byte(preimage.BlobKeyType), 0xae}.Bytes(),
 			OracleValue:  proof.OracleValue,
 			OracleOffset: proof.OracleOffset,
@@ -128,7 +128,7 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) {
 
 	t.Run("Valid", func(t *testing.T) {
 		kv := kvstore.NewMemKV()
-		loader := newPreimageLoader(kv.Get)
+		loader := NewPreimageLoader(kv.Get)
 		storeBlob(t, kv, gokzg4844.KZGCommitment(commitment), blob)
 		actual, err := loader.LoadPreimage(proof)
 		require.NoError(t, err)
@@ -155,19 +155,19 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) {
 func TestPreimageLoader_PrecompilePreimage(t *testing.T) {
 	input := []byte("test input")
 	key := preimage.PrecompileKey(crypto.Keccak256Hash(input)).PreimageKey()
-	proof := &proofData{
+	proof := &ProofData{
 		OracleKey: key[:],
 	}
 
 	t.Run("NoInputPreimage", func(t *testing.T) {
 		kv := kvstore.NewMemKV()
-		loader := newPreimageLoader(kv.Get)
+		loader := NewPreimageLoader(kv.Get)
 		_, err := loader.LoadPreimage(proof)
 		require.ErrorIs(t, err, kvstore.ErrNotFound)
 	})
 	t.Run("Valid", func(t *testing.T) {
 		kv := kvstore.NewMemKV()
-		loader := newPreimageLoader(kv.Get)
+		loader := NewPreimageLoader(kv.Get)
 		require.NoError(t, kv.Put(preimage.Keccak256Key(proof.OracleKey).PreimageKey(), input))
 		actual, err := loader.LoadPreimage(proof)
 		require.NoError(t, err)
diff --git a/op-challenger/game/fault/trace/utils/provider.go b/op-challenger/game/fault/trace/utils/provider.go
new file mode 100644
index 000000000000..3417b8386318
--- /dev/null
+++ b/op-challenger/game/fault/trace/utils/provider.go
@@ -0,0 +1,96 @@
+package utils
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"path/filepath"
+	"strconv"
+
+	preimage "github.com/ethereum-optimism/optimism/op-preimage"
+	"github.com/ethereum-optimism/optimism/op-service/ioutil"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+)
+
+const (
+	ProofsDir      = "proofs"
+	diskStateCache = "state.json.gz"
+)
+
+type ProofData struct {
+	ClaimValue   common.Hash   `json:"post"`
+	StateData    hexutil.Bytes `json:"state-data"`
+	ProofData    hexutil.Bytes `json:"proof-data"`
+	OracleKey    hexutil.Bytes `json:"oracle-key,omitempty"`
+	OracleValue  hexutil.Bytes `json:"oracle-value,omitempty"`
+	OracleOffset uint32        `json:"oracle-offset,omitempty"`
+}
+
+type ProofGenerator interface {
+	// GenerateProof executes FPVM binary to generate a proof at the specified trace index in dataDir.
+	GenerateProof(ctx context.Context, dataDir string, proofAt uint64) error
+}
+
+type diskStateCacheObj struct {
+	Step uint64 `json:"step"`
+}
+
+// ReadLastStep reads the tracked last step from disk.
+func ReadLastStep(dir string) (uint64, error) {
+	state := diskStateCacheObj{}
+	file, err := ioutil.OpenDecompressed(filepath.Join(dir, diskStateCache))
+	if err != nil {
+		return 0, err
+	}
+	defer file.Close()
+	err = json.NewDecoder(file).Decode(&state)
+	if err != nil {
+		return 0, err
+	}
+	return state.Step, nil
+}
+
+// WriteLastStep writes the last step and proof to disk as a persistent cache.
+func WriteLastStep(dir string, proof *ProofData, step uint64) error {
+	state := diskStateCacheObj{Step: step}
+	lastStepFile := filepath.Join(dir, diskStateCache)
+	if err := ioutil.WriteCompressedJson(lastStepFile, state); err != nil {
+		return fmt.Errorf("failed to write last step to %v: %w", lastStepFile, err)
+	}
+	if err := ioutil.WriteCompressedJson(filepath.Join(dir, ProofsDir, fmt.Sprintf("%d.json.gz", step)), proof); err != nil {
+		return fmt.Errorf("failed to write proof: %w", err)
+	}
+	return nil
+}
+
+// below methods and definitions are only to be used for testing
+type preimageOpts []string
+
+type PreimageOpt func() preimageOpts
+
+func PreimageLoad(key preimage.Key, offset uint32) PreimageOpt {
+	return func() preimageOpts {
+		return []string{"--stop-at-preimage", fmt.Sprintf("%v@%v", common.Hash(key.PreimageKey()).Hex(), offset)}
+	}
+}
+
+func FirstPreimageLoadOfType(preimageType string) PreimageOpt {
+	return func() preimageOpts {
+		return []string{"--stop-at-preimage-type", preimageType}
+	}
+}
+
+func FirstKeccakPreimageLoad() PreimageOpt {
+	return FirstPreimageLoadOfType("keccak")
+}
+
+func FirstPrecompilePreimageLoad() PreimageOpt {
+	return FirstPreimageLoadOfType("precompile")
+}
+
+func PreimageLargerThan(size int) PreimageOpt {
+	return func() preimageOpts {
+		return []string{"--stop-at-preimage-larger-than", strconv.Itoa(size)}
+	}
+}
diff --git a/op-challenger/game/fault/types/actions.go b/op-challenger/game/fault/types/actions.go
index c6631f80e40a..e5093d6ac553 100644
--- a/op-challenger/game/fault/types/actions.go
+++ b/op-challenger/game/fault/types/actions.go
@@ -9,15 +9,17 @@ func (a ActionType) String() string {
 }
 
 const (
-	ActionTypeMove ActionType = "move"
-	ActionTypeStep ActionType = "step"
+	ActionTypeMove                   ActionType = "move"
+	ActionTypeStep                   ActionType = "step"
+	ActionTypeChallengeL2BlockNumber ActionType = "challenge-l2-block-number"
 )
 
 type Action struct {
-	Type           ActionType
-	ParentIdx      int
-	ParentPosition Position
-	IsAttack       bool
+	Type ActionType
+
+	// Moves and Steps
+	ParentClaim Claim
+	IsAttack    bool
 
 	// Moves
 	Value common.Hash
@@ -26,4 +28,7 @@ type Action struct {
 	PreState   []byte
 	ProofData  []byte
 	OracleData *PreimageOracleData
+
+	// Challenge L2 Block Number
+	InvalidL2BlockNumberChallenge *InvalidL2BlockNumberChallenge
 }
diff --git a/op-challenger/game/fault/types/game.go b/op-challenger/game/fault/types/game.go
index 20bd6e2bff00..dd0394e69a82 100644
--- a/op-challenger/game/fault/types/game.go
+++ b/op-challenger/game/fault/types/game.go
@@ -3,6 +3,7 @@ package types
 import (
 	"errors"
 	"math/big"
+	"time"
 )
 
 var (
@@ -22,6 +23,10 @@ type Game interface {
 	// its parent.
 	DefendsParent(claim Claim) bool
 
+	// ChessClock returns the amount of time elapsed on the chess clock of the potential challenger to the supplied claim.
+	// Specifically, this returns the chess clock of the team that *disagrees* with the supplied claim.
+	ChessClock(now time.Time, claim Claim) time.Duration
+
 	// IsDuplicate returns true if the provided [Claim] already exists in the game state
 	// referencing the same parent claim
 	IsDuplicate(claim Claim) bool
@@ -100,6 +105,27 @@ func (g *gameState) DefendsParent(claim Claim) bool {
 	return claim.RightOf(parent.Position)
 }
 
+// ChessClock returns the amount of time elapsed on the chess clock of the potential challenger to the supplied claim.
+// Specifically, this returns the chess clock of the team that *disagrees* with the supplied claim.
+func (g *gameState) ChessClock(now time.Time, claim Claim) time.Duration {
+	parentRef := g.getParent(claim)
+	var parent Claim
+	if parentRef != nil {
+		parent = *parentRef
+	}
+	return ChessClock(now, claim, parent)
+}
+
+func ChessClock(now time.Time, claim Claim, parent Claim) time.Duration {
+	// Calculate the time elapsed since the claim was created
+	duration := now.Sub(claim.Clock.Timestamp)
+	if parent != (Claim{}) {
+		// Add total time elapsed from previous turns
+		duration = parent.Clock.Duration + duration
+	}
+	return duration
+}
+
 func (g *gameState) getParent(claim Claim) *Claim {
 	if claim.IsRoot() {
 		return nil
diff --git a/op-challenger/game/fault/types/game_test.go b/op-challenger/game/fault/types/game_test.go
index cad4b5c856bd..a53dd7c7b673 100644
--- a/op-challenger/game/fault/types/game_test.go
+++ b/op-challenger/game/fault/types/game_test.go
@@ -3,6 +3,7 @@ package types
 import (
 	"math/big"
 	"testing"
+	"time"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/stretchr/testify/require"
@@ -217,6 +218,43 @@ func TestAncestorWithTraceIndex(t *testing.T) {
 	require.Equal(t, claims[3], actual)
 }
 
+func TestChessClock(t *testing.T) {
+	rootTime := time.UnixMilli(42978249)
+	defenderRootClaim, challengerFirstClaim, defenderSecondClaim, challengerSecondClaim := createTestClaims()
+	defenderRootClaim.Clock = Clock{Timestamp: rootTime, Duration: 0}
+	challengerFirstClaim.Clock = Clock{Timestamp: rootTime.Add(5 * time.Minute), Duration: 5 * time.Minute}
+	defenderSecondClaim.Clock = Clock{Timestamp: challengerFirstClaim.Clock.Timestamp.Add(2 * time.Minute), Duration: 2 * time.Minute}
+	challengerSecondClaim.Clock = Clock{Timestamp: defenderSecondClaim.Clock.Timestamp.Add(3 * time.Minute), Duration: 8 * time.Minute}
+	claims := []Claim{defenderRootClaim, challengerFirstClaim, defenderSecondClaim, challengerSecondClaim}
+	game := NewGameState(claims, 10)
+
+	// At the time the root claim is posted, both defender and challenger have no time on their chess clock
+	// The root claim starts the chess clock for the challenger
+	require.Equal(t, time.Duration(0), game.ChessClock(rootTime, game.Claims()[0]))
+	// As time progresses, the challenger's chess clock increases
+	require.Equal(t, 2*time.Minute, game.ChessClock(rootTime.Add(2*time.Minute), game.Claims()[0]))
+
+	// The challenger's first claim arrives 5 minutes after the root claim and starts the clock for the defender
+	// This is the defender's first turn so at the time the claim is posted, the defender's chess clock is 0
+	require.Equal(t, time.Duration(0), game.ChessClock(challengerFirstClaim.Clock.Timestamp, challengerFirstClaim))
+	// As time progresses, the defender's chess clock increases
+	require.Equal(t, 3*time.Minute, game.ChessClock(challengerFirstClaim.Clock.Timestamp.Add(3*time.Minute), challengerFirstClaim))
+
+	// The defender's second claim arrives 2 minutes after the challenger's first claim.
+	// This starts the challenger's clock again. At the time of the claim it already has 5 minutes on the clock
+	// from the challenger's previous turn
+	require.Equal(t, 5*time.Minute, game.ChessClock(defenderSecondClaim.Clock.Timestamp, defenderSecondClaim))
+	// As time progresses the challenger's chess clock increases
+	require.Equal(t, 5*time.Minute+30*time.Second, game.ChessClock(defenderSecondClaim.Clock.Timestamp.Add(30*time.Second), defenderSecondClaim))
+
+	// The challenger's second claim arrives 3 minutes after the defender's second claim.
+	// This starts the defender's clock again. At the time of the claim it already has 2 minutes on the clock
+	// from the defenders previous turn
+	require.Equal(t, 2*time.Minute, game.ChessClock(challengerSecondClaim.Clock.Timestamp, challengerSecondClaim))
+	// As time progresses, the defender's chess clock increases
+	require.Equal(t, 2*time.Minute+45*time.Minute, game.ChessClock(challengerSecondClaim.Clock.Timestamp.Add(45*time.Minute), challengerSecondClaim))
+}
+
 func buildGameWithClaim(claimGIndex *big.Int, parentGIndex *big.Int) *gameState {
 	parentClaim := Claim{
 		ClaimData: ClaimData{
diff --git a/op-challenger/game/fault/types/position.go b/op-challenger/game/fault/types/position.go
index 85d1b1ccd750..86d10730f721 100644
--- a/op-challenger/game/fault/types/position.go
+++ b/op-challenger/game/fault/types/position.go
@@ -10,6 +10,8 @@ import (
 
 var (
 	ErrPositionDepthTooSmall = errors.New("position depth is too small")
+
+	RootPosition = NewPositionFromGIndex(big.NewInt(1))
 )
 
 // Depth is the depth of a position in a game tree where the root level has
@@ -39,13 +41,13 @@ func NewPositionFromGIndex(x *big.Int) Position {
 }
 
 func (p Position) String() string {
-	return fmt.Sprintf("Position(depth: %v, indexAtDepth: %v)", p.depth, p.indexAtDepth)
+	return fmt.Sprintf("Position(depth: %v, indexAtDepth: %v)", p.depth, p.IndexAtDepth())
 }
 
 func (p Position) MoveRight() Position {
 	return Position{
 		depth:        p.depth,
-		indexAtDepth: new(big.Int).Add(p.indexAtDepth, big.NewInt(1)),
+		indexAtDepth: new(big.Int).Add(p.IndexAtDepth(), big.NewInt(1)),
 	}
 }
 
@@ -57,7 +59,7 @@ func (p Position) RelativeToAncestorAtDepth(ancestor Depth) (Position, error) {
 	}
 	newPosDepth := p.depth - ancestor
 	nodesAtDepth := 1 << newPosDepth
-	newIndexAtDepth := new(big.Int).Mod(p.indexAtDepth, big.NewInt(int64(nodesAtDepth)))
+	newIndexAtDepth := new(big.Int).Mod(p.IndexAtDepth(), big.NewInt(int64(nodesAtDepth)))
 	return NewPosition(newPosDepth, newIndexAtDepth), nil
 }
 
@@ -73,7 +75,7 @@ func (p Position) IndexAtDepth() *big.Int {
 }
 
 func (p Position) IsRootPosition() bool {
-	return p.depth == 0 && common.Big0.Cmp(p.indexAtDepth) == 0
+	return p.depth == 0 && common.Big0.Cmp(p.IndexAtDepth()) == 0
 }
 
 func (p Position) lshIndex(amount Depth) *big.Int {
@@ -82,9 +84,13 @@ func (p Position) lshIndex(amount Depth) *big.Int {
 
 // TraceIndex calculates the what the index of the claim value would be inside the trace.
 // It is equivalent to going right until the final depth has been reached.
+// Note: this method will panic if maxDepth < p.depth
 func (p Position) TraceIndex(maxDepth Depth) *big.Int {
 	// When we go right, we do a shift left and set the bottom bit to be 1.
 	// To do this in a single step, do all the shifts at once & or in all 1s for the bottom bits.
+	if maxDepth < p.depth {
+		panic(fmt.Sprintf("maxDepth(%d) < p.depth(%d)", maxDepth, p.depth))
+	}
 	rd := maxDepth - p.depth
 	rhs := new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), uint(rd)), big.NewInt(1))
 	ti := new(big.Int).Or(p.lshIndex(rd), rhs)
@@ -134,7 +140,7 @@ func (p Position) Defend() Position {
 }
 
 func (p Position) Print(maxDepth Depth) {
-	fmt.Printf("GIN: %4b\tTrace Position is %4b\tTrace Depth is: %d\tTrace Index is: %d\n", p.ToGIndex(), p.indexAtDepth, p.depth, p.TraceIndex(maxDepth))
+	fmt.Printf("GIN: %4b\tTrace Position is %4b\tTrace Depth is: %d\tTrace Index is: %d\n", p.ToGIndex(), p.IndexAtDepth(), p.depth, p.TraceIndex(maxDepth))
 }
 
 func (p Position) ToGIndex() *big.Int {
@@ -146,9 +152,5 @@ func bigMSB(x *big.Int) Depth {
 	if x.Cmp(big.NewInt(0)) == 0 {
 		return 0
 	}
-	out := Depth(0)
-	for ; x.Cmp(big.NewInt(0)) != 0; out++ {
-		x = new(big.Int).Rsh(x, 1)
-	}
-	return out - 1
+	return Depth(x.BitLen() - 1)
 }
diff --git a/op-challenger/game/fault/types/position_test.go b/op-challenger/game/fault/types/position_test.go
index c7bb210a6202..535c01a7e6bf 100644
--- a/op-challenger/game/fault/types/position_test.go
+++ b/op-challenger/game/fault/types/position_test.go
@@ -13,6 +13,10 @@ func bi(i int) *big.Int {
 	return big.NewInt(int64(i))
 }
 
+func TestRootPosition(t *testing.T) {
+	require.True(t, RootPosition.IsRootPosition())
+}
+
 func TestBigMSB(t *testing.T) {
 	large, ok := new(big.Int).SetString("18446744073709551615", 10)
 	require.True(t, ok)
diff --git a/op-challenger/game/fault/types/types.go b/op-challenger/game/fault/types/types.go
index 2e3d2c42f391..fc81911effa9 100644
--- a/op-challenger/game/fault/types/types.go
+++ b/op-challenger/game/fault/types/types.go
@@ -7,17 +7,21 @@ import (
 	"time"
 
 	preimage "github.com/ethereum-optimism/optimism/op-preimage"
+	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum/go-ethereum/common"
+	ethTypes "github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/crypto"
 )
 
 var (
-	ErrGameDepthReached = errors.New("game depth reached")
+	ErrGameDepthReached   = errors.New("game depth reached")
+	ErrL2BlockNumberValid = errors.New("l2 block number is valid")
 )
 
 const (
 	CannonGameType       uint32 = 0
 	PermissionedGameType uint32 = 1
+	AsteriscGameType     uint32 = 2
 	AlphabetGameType     uint32 = 255
 )
 
@@ -102,6 +106,10 @@ type TraceAccessor interface {
 	// GetStepData returns the data required to execute the step at the specified position,
 	// evaluated in the context of the specified claim (ref).
 	GetStepData(ctx context.Context, game Game, ref Claim, pos Position) (prestate []byte, proofData []byte, preimageData *PreimageOracleData, err error)
+
+	// GetL2BlockNumberChallenge returns the data required to prove the correct L2 block number of the root claim.
+	// Returns ErrL2BlockNumberValid if the root claim is known to come from the same block as the claimed L2 block.
+	GetL2BlockNumberChallenge(ctx context.Context, game Game) (*InvalidL2BlockNumberChallenge, error)
 }
 
 // PrestateProvider defines an interface to request the absolute prestate.
@@ -123,6 +131,10 @@ type TraceProvider interface {
 	// and any pre-image data that needs to be loaded into the oracle prior to execution (may be nil)
 	// The prestate returned from GetStepData for trace 10 should be the pre-image of the claim from trace 9
 	GetStepData(ctx context.Context, i Position) (prestate []byte, proofData []byte, preimageData *PreimageOracleData, err error)
+
+	// GetL2BlockNumberChallenge returns the data required to prove the correct L2 block number of the root claim.
+	// Returns ErrL2BlockNumberValid if the root claim is known to come from the same block as the claimed L2 block.
+	GetL2BlockNumberChallenge(ctx context.Context) (*InvalidL2BlockNumberChallenge, error)
 }
 
 // ClaimData is the core of a claim. It must be unique inside a specific game.
@@ -153,7 +165,7 @@ type Claim struct {
 	//       to be changed/removed to avoid invalid/stale contract state.
 	CounteredBy common.Address
 	Claimant    common.Address
-	Clock       *Clock
+	Clock       Clock
 	// Location of the claim & it's parent inside the contract. Does not exist
 	// for claims that have not made it to the contract.
 	ContractIndex       int
@@ -169,38 +181,35 @@ func (c Claim) ID() ClaimID {
 }
 
 // IsRoot returns true if this claim is the root claim.
-func (c *Claim) IsRoot() bool {
+func (c Claim) IsRoot() bool {
 	return c.Position.IsRootPosition()
 }
 
-// ChessTime returns the amount of time accumulated in the chess clock.
-// Does not assume the claim is countered and uses the specified time
-// to calculate the time since the claim was posted.
-func (c *Claim) ChessTime(now time.Time) time.Duration {
-	timeSince := int64(0)
-	if now.Unix() > int64(c.Clock.Timestamp) {
-		timeSince = now.Unix() - int64(c.Clock.Timestamp)
-	}
-	return time.Duration(c.Clock.Duration) + time.Duration(timeSince)
-}
-
-// Clock is a packed uint128 with the upper 64 bits being the
-// duration and the lower 64 bits being the timestamp.
-// ┌────────────┬────────────────┐
-// │    Bits    │     Value      │
-// ├────────────┼────────────────┤
-// │ [0, 64)    │ Duration       │
-// │ [64, 128)  │ Timestamp      │
-// └────────────┴────────────────┘
+// Clock tracks the chess clock for a claim.
 type Clock struct {
-	Duration  uint64
-	Timestamp uint64
+	// Duration is the time elapsed on the chess clock at the last update.
+	Duration time.Duration
+
+	// Timestamp is the time that the clock was last updated.
+	Timestamp time.Time
 }
 
 // NewClock creates a new Clock instance.
-func NewClock(duration uint64, timestamp uint64) *Clock {
-	return &Clock{
+func NewClock(duration time.Duration, timestamp time.Time) Clock {
+	return Clock{
 		Duration:  duration,
 		Timestamp: timestamp,
 	}
 }
+
+type InvalidL2BlockNumberChallenge struct {
+	Output *eth.OutputResponse
+	Header *ethTypes.Header
+}
+
+func NewInvalidL2BlockNumberProof(output *eth.OutputResponse, header *ethTypes.Header) *InvalidL2BlockNumberChallenge {
+	return &InvalidL2BlockNumberChallenge{
+		Output: output,
+		Header: header,
+	}
+}
diff --git a/op-challenger/game/fault/types/types_test.go b/op-challenger/game/fault/types/types_test.go
index 8ea40ab67790..ca3e25b7e4b7 100644
--- a/op-challenger/game/fault/types/types_test.go
+++ b/op-challenger/game/fault/types/types_test.go
@@ -3,67 +3,10 @@ package types
 import (
 	"math/big"
 	"testing"
-	"time"
 
 	"github.com/stretchr/testify/require"
 )
 
-func TestClaim_RemainingDuration(t *testing.T) {
-	tests := []struct {
-		name      string
-		duration  uint64
-		timestamp uint64
-		now       int64
-		expected  uint64
-	}{
-		{
-			name:      "AllZeros",
-			duration:  0,
-			timestamp: 0,
-			now:       0,
-			expected:  0,
-		},
-		{
-			name:      "ZeroTimestamp",
-			duration:  5,
-			timestamp: 0,
-			now:       0,
-			expected:  5,
-		},
-		{
-			name:      "ZeroTimestampWithNow",
-			duration:  5,
-			timestamp: 0,
-			now:       10,
-			expected:  15,
-		},
-		{
-			name:      "ZeroNow",
-			duration:  5,
-			timestamp: 10,
-			now:       0,
-			expected:  5,
-		},
-		{
-			name:      "ValidTimeSinze",
-			duration:  20,
-			timestamp: 10,
-			now:       15,
-			expected:  25,
-		},
-	}
-
-	for _, test := range tests {
-		test := test
-		t.Run(test.name, func(t *testing.T) {
-			claim := &Claim{
-				Clock: NewClock(test.duration, test.timestamp),
-			}
-			require.Equal(t, time.Duration(test.expected), claim.ChessTime(time.Unix(test.now, 0)))
-		})
-	}
-}
-
 func TestNewPreimageOracleData(t *testing.T) {
 	t.Run("LocalData", func(t *testing.T) {
 		data := NewPreimageOracleData([]byte{1, 2, 3}, []byte{4, 5, 6}, 7)
@@ -103,6 +46,12 @@ func TestIsRootPosition(t *testing.T) {
 			position: NewPositionFromGIndex(big.NewInt(2)),
 			expected: false,
 		},
+		{
+			// Mostly to avoid nil dereferences in tests which may not set a real Position
+			name:     "DefaultValue",
+			position: Position{},
+			expected: true,
+		},
 	}
 
 	for _, test := range tests {
diff --git a/op-challenger/game/keccak/challenger.go b/op-challenger/game/keccak/challenger.go
index 362c432e3150..9a0a2593704b 100644
--- a/op-challenger/game/keccak/challenger.go
+++ b/op-challenger/game/keccak/challenger.go
@@ -10,7 +10,6 @@ import (
 	keccakTypes "github.com/ethereum-optimism/optimism/op-challenger/game/keccak/types"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
 )
 
@@ -29,7 +28,7 @@ type Verifier interface {
 }
 
 type Sender interface {
-	SendAndWait(txPurpose string, txs ...txmgr.TxCandidate) ([]*types.Receipt, error)
+	SendAndWaitSimple(txPurpose string, txs ...txmgr.TxCandidate) error
 }
 
 type PreimageChallenger struct {
@@ -80,7 +79,7 @@ func (c *PreimageChallenger) Challenge(ctx context.Context, blockHash common.Has
 	wg.Wait()
 	c.log.Debug("Created preimage challenge transactions", "count", len(txs))
 	if len(txs) > 0 {
-		_, err := c.sender.SendAndWait("challenge preimages", txs...)
+		err := c.sender.SendAndWaitSimple("challenge preimages", txs...)
 		if err != nil {
 			c.metrics.RecordPreimageChallengeFailed()
 			return fmt.Errorf("failed to send challenge txs: %w", err)
diff --git a/op-challenger/game/keccak/challenger_test.go b/op-challenger/game/keccak/challenger_test.go
index 0c9c0424034a..e7eada57d70e 100644
--- a/op-challenger/game/keccak/challenger_test.go
+++ b/op-challenger/game/keccak/challenger_test.go
@@ -11,7 +11,6 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
 )
@@ -151,12 +150,12 @@ type stubSender struct {
 	sent [][]txmgr.TxCandidate
 }
 
-func (s *stubSender) SendAndWait(_ string, txs ...txmgr.TxCandidate) ([]*types.Receipt, error) {
+func (s *stubSender) SendAndWaitSimple(_ string, txs ...txmgr.TxCandidate) error {
 	if s.err != nil {
-		return nil, s.err
+		return s.err
 	}
 	s.sent = append(s.sent, txs)
-	return nil, nil
+	return nil
 }
 
 type stubChallengerOracle struct {
diff --git a/op-challenger/game/keccak/fetcher/fetcher.go b/op-challenger/game/keccak/fetcher/fetcher.go
index 755f96b164f3..589bca09d9f1 100644
--- a/op-challenger/game/keccak/fetcher/fetcher.go
+++ b/op-challenger/game/keccak/fetcher/fetcher.go
@@ -40,11 +40,6 @@ func (f *InputFetcher) FetchInputs(ctx context.Context, blockHash common.Hash, o
 	if err != nil {
 		return nil, fmt.Errorf("failed to retrieve leaf block nums: %w", err)
 	}
-	chainID, err := f.source.ChainID(ctx)
-	if err != nil {
-		return nil, fmt.Errorf("failed to retrieve L1 chain ID: %w", err)
-	}
-	signer := types.LatestSignerForChainID(chainID)
 	var inputs []keccakTypes.InputData
 	for _, blockNum := range blockNums {
 		foundRelevantTx := false
@@ -53,13 +48,13 @@ func (f *InputFetcher) FetchInputs(ctx context.Context, blockHash common.Hash, o
 			return nil, fmt.Errorf("failed getting tx for block %v: %w", blockNum, err)
 		}
 		for _, tx := range block.Transactions() {
-			inputData, err := f.extractRelevantLeavesFromTx(ctx, oracle, signer, tx, ident)
+			inputData, err := f.extractRelevantLeavesFromTx(ctx, oracle, tx, ident)
 			if err != nil {
 				return nil, err
 			}
-			if inputData != nil {
+			if len(inputData) > 0 {
 				foundRelevantTx = true
-				inputs = append(inputs, *inputData)
+				inputs = append(inputs, inputData...)
 			}
 		}
 		if !foundRelevantTx {
@@ -72,31 +67,7 @@ func (f *InputFetcher) FetchInputs(ctx context.Context, blockHash common.Hash, o
 	return inputs, nil
 }
 
-func (f *InputFetcher) extractRelevantLeavesFromTx(ctx context.Context, oracle Oracle, signer types.Signer, tx *types.Transaction, ident keccakTypes.LargePreimageIdent) (*keccakTypes.InputData, error) {
-	if tx.To() == nil || *tx.To() != oracle.Addr() {
-		f.log.Trace("Skip tx with incorrect to addr", "tx", tx.Hash(), "expected", oracle.Addr(), "actual", tx.To())
-		return nil, nil
-	}
-	uuid, inputData, err := oracle.DecodeInputData(tx.Data())
-	if errors.Is(err, contracts.ErrInvalidAddLeavesCall) {
-		f.log.Trace("Skip tx with invalid call data", "tx", tx.Hash(), "err", err)
-		return nil, nil
-	} else if err != nil {
-		return nil, err
-	}
-	if uuid.Cmp(ident.UUID) != 0 {
-		f.log.Trace("Skip tx with incorrect UUID", "tx", tx.Hash(), "expected", ident.UUID, "actual", uuid)
-		return nil, nil
-	}
-	sender, err := signer.Sender(tx)
-	if err != nil {
-		f.log.Trace("Skipping transaction with invalid sender", "tx", tx.Hash(), "err", err)
-		return nil, nil
-	}
-	if sender != ident.Claimant {
-		f.log.Trace("Skipping transaction with incorrect sender", "tx", tx.Hash(), "expected", ident.Claimant, "actual", sender)
-		return nil, nil
-	}
+func (f *InputFetcher) extractRelevantLeavesFromTx(ctx context.Context, oracle Oracle, tx *types.Transaction, ident keccakTypes.LargePreimageIdent) ([]keccakTypes.InputData, error) {
 	rcpt, err := f.source.TransactionReceipt(ctx, tx.Hash())
 	if err != nil {
 		return nil, fmt.Errorf("failed to retrieve receipt for tx %v: %w", tx.Hash(), err)
@@ -105,7 +76,40 @@ func (f *InputFetcher) extractRelevantLeavesFromTx(ctx context.Context, oracle O
 		f.log.Trace("Skipping transaction with failed receipt status", "tx", tx.Hash(), "status", rcpt.Status)
 		return nil, nil
 	}
-	return &inputData, nil
+
+	// Iterate over the logs from in this receipt, looking for relevant logs emitted from the oracle contract
+	var inputs []keccakTypes.InputData
+	for i, txLog := range rcpt.Logs {
+		if txLog.Address != oracle.Addr() {
+			f.log.Trace("Skip tx log not emitted by the oracle contract", "tx", tx.Hash(), "logIndex", i, "targetContract", oracle.Addr(), "actualContract", txLog.Address)
+			continue
+		}
+		if len(txLog.Data) < 20 {
+			f.log.Trace("Skip tx log with insufficient data (less than 20 bytes)", "tx", tx.Hash(), "logIndex", i, "dataLength", len(txLog.Data))
+			continue
+		}
+		caller := common.Address(txLog.Data[0:20])
+		callData := txLog.Data[20:]
+
+		if caller != ident.Claimant {
+			f.log.Trace("Skip tx log from irrelevant claimant", "tx", tx.Hash(), "logIndex", i, "targetClaimant", ident.Claimant, "actualClaimant", caller)
+			continue
+		}
+		uuid, inputData, err := oracle.DecodeInputData(callData)
+		if errors.Is(err, contracts.ErrInvalidAddLeavesCall) {
+			f.log.Trace("Skip tx log with call data not targeting expected method", "tx", tx.Hash(), "logIndex", i, "err", err)
+			continue
+		} else if err != nil {
+			return nil, err
+		}
+		if uuid.Cmp(ident.UUID) != 0 {
+			f.log.Trace("Skip tx log with irrelevant UUID", "tx", tx.Hash(), "logIndex", i, "targetUUID", ident.UUID, "actualUUID", uuid)
+			continue
+		}
+		inputs = append(inputs, inputData)
+	}
+
+	return inputs, nil
 }
 
 func NewPreimageFetcher(logger log.Logger, source L1Source) *InputFetcher {
diff --git a/op-challenger/game/keccak/fetcher/fetcher_test.go b/op-challenger/game/keccak/fetcher/fetcher_test.go
index c236712c8466..cedff735e9f9 100644
--- a/op-challenger/game/keccak/fetcher/fetcher_test.go
+++ b/op-challenger/game/keccak/fetcher/fetcher_test.go
@@ -4,6 +4,8 @@ import (
 	"context"
 	"crypto/ecdsa"
 	"errors"
+	"fmt"
+	"math"
 	"math/big"
 	"testing"
 
@@ -18,11 +20,18 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
+const (
+	// Signal to indicate a receipt should be considered missing
+	MissingReceiptStatus = math.MaxUint64
+)
+
 var (
-	oracleAddr = common.Address{0x99, 0x98}
-	privKey, _ = crypto.GenerateKey()
-	ident      = keccakTypes.LargePreimageIdent{
-		Claimant: crypto.PubkeyToAddress(privKey.PublicKey),
+	oracleAddr     = common.Address{0x99, 0x98}
+	otherAddr      = common.Address{0x12, 0x34}
+	claimantKey, _ = crypto.GenerateKey()
+	otherKey, _    = crypto.GenerateKey()
+	ident          = keccakTypes.LargePreimageIdent{
+		Claimant: crypto.PubkeyToAddress(claimantKey.PublicKey),
 		UUID:     big.NewInt(888),
 	}
 	chainID   = big.NewInt(123)
@@ -54,86 +63,211 @@ func TestFetchLeaves_NoBlocks(t *testing.T) {
 	require.Empty(t, leaves)
 }
 
-func TestFetchLeaves_SingleTx(t *testing.T) {
+func TestFetchLeaves_ErrorOnUnavailableInputBlocks(t *testing.T) {
+	fetcher, oracle, _ := setupFetcherTest(t)
+	mockErr := fmt.Errorf("oops")
+	oracle.inputDataBlocksError = mockErr
+
+	leaves, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
+	require.ErrorContains(t, err, "failed to retrieve leaf block nums")
+	require.Empty(t, leaves)
+}
+
+func TestFetchLeaves_ErrorOnUnavailableL1Block(t *testing.T) {
+	blockNum := uint64(7)
+	fetcher, oracle, _ := setupFetcherTest(t)
+	oracle.leafBlocks = []uint64{blockNum}
+
+	// No txs means stubL1Source will return an error when we try to fetch the block
+	leaves, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
+	require.ErrorContains(t, err, fmt.Sprintf("failed getting tx for block %v", blockNum))
+	require.Empty(t, leaves)
+}
+
+func TestFetchLeaves_SingleTxSingleLog(t *testing.T) {
+	cases := []struct {
+		name       string
+		txSender   *ecdsa.PrivateKey
+		txModifier TxModifier
+	}{
+		{"from EOA claimant address", claimantKey, ValidTx},
+		{"from contract call", otherKey, WithToAddr(otherAddr)},
+		{"from contract creation", otherKey, WithoutToAddr()},
+	}
+
+	for _, tc := range cases {
+		t.Run(tc.name, func(t *testing.T) {
+			fetcher, oracle, l1Source := setupFetcherTest(t)
+			blockNum := uint64(7)
+			oracle.leafBlocks = []uint64{blockNum}
+
+			proposal := oracle.createProposal(input1)
+			tx := l1Source.createTx(blockNum, tc.txSender, tc.txModifier)
+			l1Source.createLog(tx, proposal)
+
+			inputs, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
+			require.NoError(t, err)
+			require.Equal(t, []keccakTypes.InputData{input1}, inputs)
+		})
+	}
+}
+
+func TestFetchLeaves_SingleTxMultipleLogs(t *testing.T) {
 	fetcher, oracle, l1Source := setupFetcherTest(t)
 	blockNum := uint64(7)
 	oracle.leafBlocks = []uint64{blockNum}
-	l1Source.txs[blockNum] = types.Transactions{oracle.txForInput(ValidTx, input1)}
+
+	proposal1 := oracle.createProposal(input1)
+	proposal2 := oracle.createProposal(input2)
+	tx := l1Source.createTx(blockNum, otherKey, WithToAddr(otherAddr))
+	l1Source.createLog(tx, proposal1)
+	l1Source.createLog(tx, proposal2)
+
 	inputs, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
 	require.NoError(t, err)
-	require.Equal(t, []keccakTypes.InputData{input1}, inputs)
+	require.Equal(t, []keccakTypes.InputData{input1, input2}, inputs)
 }
 
 func TestFetchLeaves_MultipleBlocksAndLeaves(t *testing.T) {
 	fetcher, oracle, l1Source := setupFetcherTest(t)
 	block1 := uint64(7)
 	block2 := uint64(15)
-	block3 := uint64(20)
-	oracle.leafBlocks = []uint64{block1, block2, block3}
-	l1Source.txs[block1] = types.Transactions{oracle.txForInput(ValidTx, input1)}
-	l1Source.txs[block2] = types.Transactions{oracle.txForInput(ValidTx, input2)}
-	l1Source.txs[block3] = types.Transactions{oracle.txForInput(ValidTx, input3), oracle.txForInput(ValidTx, input4)}
+	oracle.leafBlocks = []uint64{block1, block2}
+
+	proposal1 := oracle.createProposal(input1)
+	proposal2 := oracle.createProposal(input2)
+	proposal3 := oracle.createProposal(input3)
+	proposal4 := oracle.createProposal(input4)
+	block1Tx := l1Source.createTx(block1, claimantKey, ValidTx)
+	block2TxA := l1Source.createTx(block2, claimantKey, ValidTx)
+	l1Source.createTx(block2, claimantKey, ValidTx) // Add tx with no logs
+	block2TxB := l1Source.createTx(block2, otherKey, WithoutToAddr())
+	l1Source.createLog(block1Tx, proposal1)
+	l1Source.createLog(block2TxA, proposal2)
+	l1Source.createLog(block2TxB, proposal3)
+	l1Source.createLog(block2TxB, proposal4)
+
 	inputs, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
 	require.NoError(t, err)
 	require.Equal(t, []keccakTypes.InputData{input1, input2, input3, input4}, inputs)
 }
 
-func TestFetchLeaves_SkipTxToWrongContract(t *testing.T) {
+func TestFetchLeaves_SkipLogFromWrongContract(t *testing.T) {
 	fetcher, oracle, l1Source := setupFetcherTest(t)
 	blockNum := uint64(7)
 	oracle.leafBlocks = []uint64{blockNum}
-	// Valid tx but to a different contract
-	tx1 := oracle.txForInput(WithToAddr(common.Address{0x88, 0x99, 0x11}), input2)
-	// Valid tx but without a to addr
-	tx2 := oracle.txForInput(WithoutToAddr(), input2)
-	// Valid tx to the correct contract
-	tx3 := oracle.txForInput(ValidTx, input1)
-	l1Source.txs[blockNum] = types.Transactions{tx1, tx2, tx3}
+
+	// Emit log from an irrelevant contract address
+	proposal1 := oracle.createProposal(input2)
+	tx1 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	log1 := l1Source.createLog(tx1, proposal1)
+	log1.Address = otherAddr
+	// Valid tx
+	proposal2 := oracle.createProposal(input1)
+	tx2 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx2, proposal2)
+
 	inputs, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
 	require.NoError(t, err)
 	require.Equal(t, []keccakTypes.InputData{input1}, inputs)
 }
 
-func TestFetchLeaves_SkipTxWithDifferentUUID(t *testing.T) {
+func TestFetchLeaves_SkipProposalWithWrongUUID(t *testing.T) {
 	fetcher, oracle, l1Source := setupFetcherTest(t)
 	blockNum := uint64(7)
 	oracle.leafBlocks = []uint64{blockNum}
+
 	// Valid tx but with a different UUID
-	tx1 := oracle.txForInput(WithUUID(big.NewInt(874927294)), input2)
+	proposal1 := oracle.createProposal(input2)
+	proposal1.uuid = big.NewInt(874927294)
+	tx1 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx1, proposal1)
+	// Valid tx
+	proposal2 := oracle.createProposal(input1)
+	tx2 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx2, proposal2)
+
+	inputs, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
+	require.NoError(t, err)
+	require.Equal(t, []keccakTypes.InputData{input1}, inputs)
+}
+
+func TestFetchLeaves_SkipProposalWithWrongClaimant(t *testing.T) {
+	fetcher, oracle, l1Source := setupFetcherTest(t)
+	blockNum := uint64(7)
+	oracle.leafBlocks = []uint64{blockNum}
+
+	// Valid tx but with a different claimant
+	proposal1 := oracle.createProposal(input2)
+	proposal1.claimantAddr = otherAddr
+	tx1 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx1, proposal1)
+	// Valid tx
+	proposal2 := oracle.createProposal(input1)
+	tx2 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx2, proposal2)
+
+	inputs, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
+	require.NoError(t, err)
+	require.Equal(t, []keccakTypes.InputData{input1}, inputs)
+}
+
+func TestFetchLeaves_SkipInvalidProposal(t *testing.T) {
+	fetcher, oracle, l1Source := setupFetcherTest(t)
+	blockNum := uint64(7)
+	oracle.leafBlocks = []uint64{blockNum}
+
+	// Set up proposal decoding to fail
+	proposal1 := oracle.createProposal(input2)
+	proposal1.valid = false
+	tx1 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx1, proposal1)
 	// Valid tx
-	tx2 := oracle.txForInput(ValidTx, input1)
-	l1Source.txs[blockNum] = types.Transactions{tx1, tx2}
+	proposal2 := oracle.createProposal(input1)
+	tx2 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx2, proposal2)
+
 	inputs, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
 	require.NoError(t, err)
 	require.Equal(t, []keccakTypes.InputData{input1}, inputs)
 }
 
-func TestFetchLeaves_SkipTxWithInvalidCall(t *testing.T) {
+func TestFetchLeaves_SkipProposalWithInsufficientData(t *testing.T) {
 	fetcher, oracle, l1Source := setupFetcherTest(t)
 	blockNum := uint64(7)
 	oracle.leafBlocks = []uint64{blockNum}
-	// Call to preimage oracle but fails to decode
-	tx1 := oracle.txForInput(WithInvalidData(), input2)
+
+	// Log contains insufficient data
+	// It should hold a 20 byte address followed by the proposal payload
+	proposal1 := oracle.createProposal(input2)
+	tx1 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	log1 := l1Source.createLog(tx1, proposal1)
+	log1.Data = proposal1.claimantAddr[:19]
 	// Valid tx
-	tx2 := oracle.txForInput(ValidTx, input1)
-	l1Source.txs[blockNum] = types.Transactions{tx1, tx2}
+	proposal2 := oracle.createProposal(input1)
+	tx2 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx2, proposal2)
+
 	inputs, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
 	require.NoError(t, err)
 	require.Equal(t, []keccakTypes.InputData{input1}, inputs)
 }
 
-func TestFetchLeaves_SkipTxWithInvalidSender(t *testing.T) {
+func TestFetchLeaves_SkipProposalMissingCallData(t *testing.T) {
 	fetcher, oracle, l1Source := setupFetcherTest(t)
 	blockNum := uint64(7)
 	oracle.leafBlocks = []uint64{blockNum}
-	// Call to preimage oracle with different Chain ID
-	tx1 := oracle.txForInput(WithChainID(big.NewInt(992)), input3)
-	// Call to preimage oracle with wrong sender
-	wrongKey, _ := crypto.GenerateKey()
-	tx2 := oracle.txForInput(WithPrivKey(wrongKey), input4)
+
+	// Truncate call data from log so that is only contains an address
+	proposal1 := oracle.createProposal(input2)
+	tx1 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	log1 := l1Source.createLog(tx1, proposal1)
+	log1.Data = log1.Data[0:20]
 	// Valid tx
-	tx3 := oracle.txForInput(ValidTx, input1)
-	l1Source.txs[blockNum] = types.Transactions{tx1, tx2, tx3}
+	proposal2 := oracle.createProposal(input1)
+	tx2 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx2, proposal2)
+
 	inputs, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
 	require.NoError(t, err)
 	require.Equal(t, []keccakTypes.InputData{input1}, inputs)
@@ -143,45 +277,87 @@ func TestFetchLeaves_SkipTxWithReceiptStatusFail(t *testing.T) {
 	fetcher, oracle, l1Source := setupFetcherTest(t)
 	blockNum := uint64(7)
 	oracle.leafBlocks = []uint64{blockNum}
-	// Valid call to the preimage oracle but that reverted
-	tx1 := oracle.txForInput(ValidTx, input2)
+
+	// Valid proposal, but tx reverted
+	proposal1 := oracle.createProposal(input2)
+	tx1 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx1, proposal1)
 	l1Source.rcptStatus[tx1.Hash()] = types.ReceiptStatusFailed
 	// Valid tx
-	tx2 := oracle.txForInput(ValidTx, input1)
-	l1Source.txs[blockNum] = types.Transactions{tx1, tx2}
+	proposal2 := oracle.createProposal(input1)
+	tx2 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx2, proposal2)
+
 	inputs, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
 	require.NoError(t, err)
 	require.Equal(t, []keccakTypes.InputData{input1}, inputs)
 }
 
+func TestFetchLeaves_ErrorsOnMissingReceipt(t *testing.T) {
+	fetcher, oracle, l1Source := setupFetcherTest(t)
+	blockNum := uint64(7)
+	oracle.leafBlocks = []uint64{blockNum}
+
+	// Valid tx
+	proposal1 := oracle.createProposal(input1)
+	tx1 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx1, proposal1)
+	// Valid proposal, but tx receipt is missing
+	proposal2 := oracle.createProposal(input2)
+	tx2 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx2, proposal2)
+	l1Source.rcptStatus[tx2.Hash()] = MissingReceiptStatus
+
+	input, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
+	require.ErrorContains(t, err, fmt.Sprintf("failed to retrieve receipt for tx %v", tx2.Hash()))
+	require.Nil(t, input)
+}
+
 func TestFetchLeaves_ErrorsWhenNoValidLeavesInBlock(t *testing.T) {
 	fetcher, oracle, l1Source := setupFetcherTest(t)
 	blockNum := uint64(7)
 	oracle.leafBlocks = []uint64{blockNum}
-	// Irrelevant call
-	tx1 := oracle.txForInput(WithUUID(big.NewInt(492)), input2)
+
+	// Irrelevant tx - reverted
+	proposal1 := oracle.createProposal(input2)
+	tx1 := l1Source.createTx(blockNum, claimantKey, ValidTx)
+	l1Source.createLog(tx1, proposal1)
 	l1Source.rcptStatus[tx1.Hash()] = types.ReceiptStatusFailed
-	l1Source.txs[blockNum] = types.Transactions{tx1}
-	_, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
+	// Irrelevant tx - no logs are emitted
+	l1Source.createTx(blockNum, claimantKey, ValidTx)
+
+	inputs, err := fetcher.FetchInputs(context.Background(), blockHash, oracle, ident)
 	require.ErrorIs(t, err, ErrNoLeavesFound)
+	require.Nil(t, inputs)
 }
 
 func setupFetcherTest(t *testing.T) (*InputFetcher, *stubOracle, *stubL1Source) {
 	oracle := &stubOracle{
-		txInputs: make(map[byte]keccakTypes.InputData),
+		proposals: make(map[byte]*proposalConfig),
 	}
 	l1Source := &stubL1Source{
 		txs:        make(map[uint64]types.Transactions),
 		rcptStatus: make(map[common.Hash]uint64),
+		logs:       make(map[common.Hash][]*types.Log),
 	}
 	fetcher := NewPreimageFetcher(testlog.Logger(t, log.LevelTrace), l1Source)
 	return fetcher, oracle, l1Source
 }
 
+type proposalConfig struct {
+	id           byte
+	claimantAddr common.Address
+	inputData    keccakTypes.InputData
+	uuid         *big.Int
+	valid        bool
+}
+
 type stubOracle struct {
-	nextTxId   byte
-	leafBlocks []uint64
-	txInputs   map[byte]keccakTypes.InputData
+	leafBlocks     []uint64
+	nextProposalId byte
+	proposals      map[byte]*proposalConfig
+	// Add a field to allow for mocking of errors
+	inputDataBlocksError error
 }
 
 func (o *stubOracle) Addr() common.Address {
@@ -189,6 +365,9 @@ func (o *stubOracle) Addr() common.Address {
 }
 
 func (o *stubOracle) GetInputDataBlocks(_ context.Context, _ rpcblock.Block, _ keccakTypes.LargePreimageIdent) ([]uint64, error) {
+	if o.inputDataBlocksError != nil {
+		return nil, o.inputDataBlocksError
+	}
 	return o.leafBlocks, nil
 }
 
@@ -196,105 +375,131 @@ func (o *stubOracle) DecodeInputData(data []byte) (*big.Int, keccakTypes.InputDa
 	if len(data) == 0 {
 		return nil, keccakTypes.InputData{}, contracts.ErrInvalidAddLeavesCall
 	}
-	input, ok := o.txInputs[data[0]]
-	if !ok {
+	proposalId := data[0]
+	proposal, ok := o.proposals[proposalId]
+	if !ok || !proposal.valid {
 		return nil, keccakTypes.InputData{}, contracts.ErrInvalidAddLeavesCall
 	}
-	uuid := ident.UUID
-	// WithUUID appends custom UUIDs to the tx data
-	if len(data) > 1 {
-		uuid = new(big.Int).SetBytes(data[1:])
-	}
-	return uuid, input, nil
+
+	return proposal.uuid, proposal.inputData, nil
 }
 
-type TxModifier func(tx *types.DynamicFeeTx) *ecdsa.PrivateKey
+type TxModifier func(tx *types.DynamicFeeTx)
 
-var ValidTx TxModifier = func(_ *types.DynamicFeeTx) *ecdsa.PrivateKey {
-	return privKey
+var ValidTx TxModifier = func(_ *types.DynamicFeeTx) {
+	// no-op
 }
 
 func WithToAddr(addr common.Address) TxModifier {
-	return func(tx *types.DynamicFeeTx) *ecdsa.PrivateKey {
+	return func(tx *types.DynamicFeeTx) {
 		tx.To = &addr
-		return privKey
 	}
 }
 
 func WithoutToAddr() TxModifier {
-	return func(tx *types.DynamicFeeTx) *ecdsa.PrivateKey {
+	return func(tx *types.DynamicFeeTx) {
 		tx.To = nil
-		return privKey
 	}
 }
 
-func WithUUID(uuid *big.Int) TxModifier {
-	return func(tx *types.DynamicFeeTx) *ecdsa.PrivateKey {
-		tx.Data = append(tx.Data, uuid.Bytes()...)
-		return privKey
+func (o *stubOracle) createProposal(input keccakTypes.InputData) *proposalConfig {
+	id := o.nextProposalId
+	o.nextProposalId++
+
+	proposal := &proposalConfig{
+		id:           id,
+		claimantAddr: ident.Claimant,
+		inputData:    input,
+		uuid:         ident.UUID,
+		valid:        true,
 	}
+	o.proposals[id] = proposal
+
+	return proposal
 }
 
-func WithInvalidData() TxModifier {
-	return func(tx *types.DynamicFeeTx) *ecdsa.PrivateKey {
-		tx.Data = []byte{}
-		return privKey
-	}
+type stubL1Source struct {
+	nextTxId uint64
+	// Map block number to tx
+	txs map[uint64]types.Transactions
+	// Map txHash to receipt
+	rcptStatus map[common.Hash]uint64
+	// Map txHash to logs
+	logs map[common.Hash][]*types.Log
 }
 
-func WithChainID(id *big.Int) TxModifier {
-	return func(tx *types.DynamicFeeTx) *ecdsa.PrivateKey {
-		tx.ChainID = id
-		return privKey
+func (s *stubL1Source) ChainID(_ context.Context) (*big.Int, error) {
+	return chainID, nil
+}
+
+func (s *stubL1Source) BlockByNumber(_ context.Context, number *big.Int) (*types.Block, error) {
+	txs, ok := s.txs[number.Uint64()]
+	if !ok {
+		return nil, errors.New("not found")
 	}
+	return (&types.Block{}).WithBody(txs, nil), nil
 }
 
-func WithPrivKey(key *ecdsa.PrivateKey) TxModifier {
-	return func(tx *types.DynamicFeeTx) *ecdsa.PrivateKey {
-		return key
+func (s *stubL1Source) TransactionReceipt(_ context.Context, txHash common.Hash) (*types.Receipt, error) {
+	rcptStatus, ok := s.rcptStatus[txHash]
+	if !ok {
+		rcptStatus = types.ReceiptStatusSuccessful
+	} else if rcptStatus == MissingReceiptStatus {
+		return nil, errors.New("not found")
 	}
+
+	logs := s.logs[txHash]
+	return &types.Receipt{Status: rcptStatus, Logs: logs}, nil
 }
 
-func (o *stubOracle) txForInput(txMod TxModifier, input keccakTypes.InputData) *types.Transaction {
-	id := o.nextTxId
-	o.nextTxId++
-	o.txInputs[id] = input
+func (s *stubL1Source) createTx(blockNum uint64, key *ecdsa.PrivateKey, txMod TxModifier) *types.Transaction {
+	txId := s.nextTxId
+	s.nextTxId++
+
 	inner := &types.DynamicFeeTx{
 		ChainID:   chainID,
-		Nonce:     1,
+		Nonce:     txId,
 		To:        &oracleAddr,
 		Value:     big.NewInt(0),
 		GasTipCap: big.NewInt(1),
 		GasFeeCap: big.NewInt(2),
 		Gas:       3,
-		Data:      []byte{id},
+		Data:      []byte{},
 	}
-	key := txMod(inner)
+	txMod(inner)
 	tx := types.MustSignNewTx(key, types.LatestSignerForChainID(inner.ChainID), inner)
+
+	// Track tx internally
+	txSet := s.txs[blockNum]
+	txSet = append(txSet, tx)
+	s.txs[blockNum] = txSet
+
 	return tx
 }
 
-type stubL1Source struct {
-	txs        map[uint64]types.Transactions
-	rcptStatus map[common.Hash]uint64
-}
+func (s *stubL1Source) createLog(tx *types.Transaction, proposal *proposalConfig) *types.Log {
+	// Concat the claimant address and the proposal id
+	// These will be split back into address and id in fetcher.extractRelevantLeavesFromTx
+	data := append(proposal.claimantAddr[:], proposal.id)
 
-func (s *stubL1Source) ChainID(_ context.Context) (*big.Int, error) {
-	return chainID, nil
-}
+	txLog := &types.Log{
+		Address: oracleAddr,
+		Data:    data,
+		Topics:  []common.Hash{},
 
-func (s *stubL1Source) BlockByNumber(_ context.Context, number *big.Int) (*types.Block, error) {
-	txs, ok := s.txs[number.Uint64()]
-	if !ok {
-		return nil, errors.New("not found")
+		// ignored (zeroed):
+		BlockNumber: 0,
+		TxHash:      common.Hash{},
+		TxIndex:     0,
+		BlockHash:   common.Hash{},
+		Index:       0,
+		Removed:     false,
 	}
-	return (&types.Block{}).WithBody(txs, nil), nil
-}
 
-func (s *stubL1Source) TransactionReceipt(_ context.Context, txHash common.Hash) (*types.Receipt, error) {
-	rcptStatus, ok := s.rcptStatus[txHash]
-	if !ok {
-		rcptStatus = types.ReceiptStatusSuccessful
-	}
-	return &types.Receipt{Status: rcptStatus}, nil
+	// Track tx log
+	logSet := s.logs[tx.Hash()]
+	logSet = append(logSet, txLog)
+	s.logs[tx.Hash()] = logSet
+
+	return txLog
 }
diff --git a/op-challenger/game/monitor.go b/op-challenger/game/monitor.go
index 16d19639d476..fe263a661692 100644
--- a/op-challenger/game/monitor.go
+++ b/op-challenger/game/monitor.go
@@ -9,6 +9,7 @@ import (
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/scheduler"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-service/clock"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 
 	"github.com/ethereum/go-ethereum"
@@ -107,20 +108,9 @@ func (m *gameMonitor) allowedGame(game common.Address) bool {
 	return false
 }
 
-func (m *gameMonitor) minGameTimestamp() uint64 {
-	if m.gameWindow.Seconds() == 0 {
-		return 0
-	}
-	// time: "To compute t-d for a duration d, use t.Add(-d)."
-	// https://pkg.go.dev/time#Time.Sub
-	if m.clock.Now().Unix() > int64(m.gameWindow.Seconds()) {
-		return uint64(m.clock.Now().Add(-m.gameWindow).Unix())
-	}
-	return 0
-}
-
 func (m *gameMonitor) progressGames(ctx context.Context, blockHash common.Hash, blockNumber uint64) error {
-	games, err := m.source.GetGamesAtOrAfter(ctx, blockHash, m.minGameTimestamp())
+	minGameTimestamp := clock.MinCheckedTimestamp(m.clock, m.gameWindow)
+	games, err := m.source.GetGamesAtOrAfter(ctx, blockHash, minGameTimestamp)
 	if err != nil {
 		return fmt.Errorf("failed to load games: %w", err)
 	}
diff --git a/op-challenger/game/monitor_test.go b/op-challenger/game/monitor_test.go
index 376c94844220..7a3da241aa24 100644
--- a/op-challenger/game/monitor_test.go
+++ b/op-challenger/game/monitor_test.go
@@ -20,34 +20,6 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/clock"
 )
 
-func TestMonitorMinGameTimestamp(t *testing.T) {
-	t.Parallel()
-
-	t.Run("zero game window returns zero", func(t *testing.T) {
-		monitor, _, _, _, _, _ := setupMonitorTest(t, []common.Address{})
-		monitor.gameWindow = time.Duration(0)
-		require.Equal(t, monitor.minGameTimestamp(), uint64(0))
-	})
-
-	t.Run("non-zero game window with zero clock", func(t *testing.T) {
-		monitor, _, _, _, _, _ := setupMonitorTest(t, []common.Address{})
-		monitor.gameWindow = time.Minute
-		monitor.clock = clock.NewSimpleClock()
-		monitor.clock.SetTime(0)
-		require.Equal(t, uint64(0), monitor.minGameTimestamp())
-	})
-
-	t.Run("minimum computed correctly", func(t *testing.T) {
-		monitor, _, _, _, _, _ := setupMonitorTest(t, []common.Address{})
-		monitor.gameWindow = time.Minute
-		monitor.clock = clock.NewSimpleClock()
-		frozen := uint64(time.Hour.Seconds())
-		monitor.clock.SetTime(frozen)
-		expected := uint64(time.Unix(int64(frozen), 0).Add(-time.Minute).Unix())
-		require.Equal(t, monitor.minGameTimestamp(), expected)
-	})
-}
-
 // TestMonitorGames tests that the monitor can handle a new head event
 // and resubscribe to new heads if the subscription errors.
 func TestMonitorGames(t *testing.T) {
@@ -77,7 +49,7 @@ func TestMonitorGames(t *testing.T) {
 					}:
 						headerNotSent = false
 					case <-ctx.Done():
-						break
+						return
 					default:
 					}
 				}
@@ -125,13 +97,12 @@ func TestMonitorGames(t *testing.T) {
 					Number: big.NewInt(1),
 				}:
 				case <-ctx.Done():
-					break
+					return
 				default:
 				}
 				// Just to avoid a tight loop
 				time.Sleep(100 * time.Millisecond)
 			}
-			require.NoError(t, waitErr)
 			mockHeadSource.SetErr(fmt.Errorf("eth subscribe test error"))
 			cancel()
 		}()
diff --git a/op-challenger/game/registry/registry_test.go b/op-challenger/game/registry/registry_test.go
index 0c6fbd9870c0..69e33f739687 100644
--- a/op-challenger/game/registry/registry_test.go
+++ b/op-challenger/game/registry/registry_test.go
@@ -75,10 +75,10 @@ func TestBondContracts(t *testing.T) {
 
 type stubBondContract struct{}
 
-func (s *stubBondContract) GetCredit(ctx context.Context, receipient common.Address) (*big.Int, types.GameStatus, error) {
+func (s *stubBondContract) GetCredit(_ context.Context, _ common.Address) (*big.Int, types.GameStatus, error) {
 	panic("not supported")
 }
 
-func (s *stubBondContract) ClaimCredit(receipient common.Address) (txmgr.TxCandidate, error) {
+func (s *stubBondContract) ClaimCreditTx(_ context.Context, _ common.Address) (txmgr.TxCandidate, error) {
 	panic("not supported")
 }
diff --git a/op-challenger/game/scheduler/coordinator.go b/op-challenger/game/scheduler/coordinator.go
index 63a2dd74f2fe..fcd4c1d4cc67 100644
--- a/op-challenger/game/scheduler/coordinator.go
+++ b/op-challenger/game/scheduler/coordinator.go
@@ -4,12 +4,12 @@ import (
 	"context"
 	"errors"
 	"fmt"
+	"slices"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
-	"golang.org/x/exp/slices"
 )
 
 var errUnknownGame = errors.New("unknown game")
@@ -143,11 +143,12 @@ func (c *coordinator) createJob(ctx context.Context, game types.GameMetadata, bl
 		state.player = player
 		state.status = player.Status()
 	}
-	state.inflight = true
 	if state.status != types.GameStatusInProgress {
 		c.logger.Debug("Not rescheduling resolved game", "game", game.Proxy, "status", state.status)
+		state.lastProcessedBlockNum = blockNumber
 		return nil, nil
 	}
+	state.inflight = true
 	return newJob(blockNumber, game.Proxy, state.player, state.status), nil
 }
 
diff --git a/op-challenger/game/scheduler/coordinator_test.go b/op-challenger/game/scheduler/coordinator_test.go
index 5686b1dae9a4..4c9ee7083f18 100644
--- a/op-challenger/game/scheduler/coordinator_test.go
+++ b/op-challenger/game/scheduler/coordinator_test.go
@@ -3,6 +3,7 @@ package scheduler
 import (
 	"context"
 	"fmt"
+	"slices"
 	"testing"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/scheduler/test"
@@ -11,7 +12,6 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 )
 
 func TestScheduleNewGames(t *testing.T) {
@@ -204,28 +204,63 @@ func TestDeleteDataForResolvedGames(t *testing.T) {
 
 	require.True(t, disk.gameDirExists[gameAddr1], "game 1 data should be preserved (not resolved)")
 	require.False(t, disk.gameDirExists[gameAddr2], "game 2 data should be deleted")
-	require.True(t, disk.gameDirExists[gameAddr3], "game 3 data should be preserved (inflight)")
+	// Game 3 never got marked as in-flight because it was already resolved so got skipped.
+	// We shouldn't be able to have a known-resolved game that is also in-flight because we always skip processing it.
+	require.False(t, disk.gameDirExists[gameAddr3], "game 3 data should be deleted")
 }
 
 func TestSchedule_RecordActedL1Block(t *testing.T) {
 	c, workQueue, _, _, _, _ := setupCoordinatorTest(t, 10)
-	gameAddr3 := common.Address{0xcc}
+	gameAddr1 := common.Address{0xaa}
+	gameAddr2 := common.Address{0xcc}
 	ctx := context.Background()
 
 	// The first game should be tracked
-	require.NoError(t, c.schedule(ctx, asGames(gameAddr3), 1))
+	require.NoError(t, c.schedule(ctx, asGames(gameAddr1, gameAddr2), 1))
 
 	// Process the result
-	require.Len(t, workQueue, 1)
+	require.Len(t, workQueue, 2)
 	j := <-workQueue
+	require.Equal(t, gameAddr1, j.addr)
 	j.status = types.GameStatusDefenderWon
 	require.NoError(t, c.processResult(j))
+	j = <-workQueue
+	require.Equal(t, gameAddr2, j.addr)
+	j.status = types.GameStatusInProgress
+	require.NoError(t, c.processResult(j))
+
+	// Schedule another block
+	require.NoError(t, c.schedule(ctx, asGames(gameAddr1, gameAddr2), 2))
+
+	// Process the result (only the in-progress game gets rescheduled)
+	require.Len(t, workQueue, 1)
+	j = <-workQueue
+	require.Equal(t, gameAddr2, j.addr)
+	require.Equal(t, uint64(2), j.block)
+	j.status = types.GameStatusInProgress
+	require.NoError(t, c.processResult(j))
+
+	// Schedule a third block
+	require.NoError(t, c.schedule(ctx, asGames(gameAddr1, gameAddr2), 3))
+
+	// Process the result (only the in-progress game gets rescheduled)
+	// This is deliberately done a third time, because there was actually a bug where it worked for the first two
+	// cycles and failed on the third. This was because the first cycle the game status was unknown so it was processed
+	// the second cycle was the first time the game was known to be complete so was skipped but crucially it left it
+	// marked as in-flight.  On the third update the was incorrectly skipped as in-flight and the l1 block number
+	// wasn't updated. From then on the block number would never be updated.
+	require.Len(t, workQueue, 1)
+	j = <-workQueue
+	require.Equal(t, gameAddr2, j.addr)
+	require.Equal(t, uint64(3), j.block)
+	j.status = types.GameStatusInProgress
+	require.NoError(t, c.processResult(j))
 
 	// Schedule so that the metric is updated
-	require.NoError(t, c.schedule(ctx, asGames(gameAddr3), 2))
+	require.NoError(t, c.schedule(ctx, asGames(gameAddr1, gameAddr2), 4))
 
 	// Verify that the block number is recorded by the metricer as acted upon
-	require.Equal(t, uint64(1), c.m.(*stubSchedulerMetrics).actedL1Blocks)
+	require.Equal(t, uint64(3), c.m.(*stubSchedulerMetrics).actedL1Blocks)
 }
 
 func TestSchedule_RecordActedL1BlockMultipleGames(t *testing.T) {
diff --git a/op-challenger/game/service.go b/op-challenger/game/service.go
index 34d51261b733..587de9a366ab 100644
--- a/op-challenger/game/service.go
+++ b/op-challenger/game/service.go
@@ -46,7 +46,8 @@ type Service struct {
 	txMgr    *txmgr.SimpleTxManager
 	txSender *sender.TxSender
 
-	cl *clock.SimpleClock
+	systemClock clock.Clock
+	l1Clock     *clock.SimpleClock
 
 	claimants []common.Address
 	claimer   *claims.BondClaimScheduler
@@ -68,11 +69,12 @@ type Service struct {
 }
 
 // NewService creates a new Service.
-func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*Service, error) {
+func NewService(ctx context.Context, logger log.Logger, cfg *config.Config, m metrics.Metricer) (*Service, error) {
 	s := &Service{
-		cl:      clock.NewSimpleClock(),
-		logger:  logger,
-		metrics: metrics.NewMetrics(),
+		systemClock: clock.SystemClock,
+		l1Clock:     clock.NewSimpleClock(),
+		logger:      logger,
+		metrics:     m,
 	}
 
 	if err := s.initFromConfig(ctx, cfg); err != nil {
@@ -196,11 +198,8 @@ func (s *Service) initMetricsServer(cfg *opmetrics.CLIConfig) error {
 }
 
 func (s *Service) initFactoryContract(cfg *config.Config) error {
-	factoryContract, err := contracts.NewDisputeGameFactoryContract(cfg.GameFactoryAddress,
+	factoryContract := contracts.NewDisputeGameFactoryContract(s.metrics, cfg.GameFactoryAddress,
 		batching.NewMultiCaller(s.l1Client.Client(), batching.DefaultBatchSize))
-	if err != nil {
-		return fmt.Errorf("failed to bind the fault dispute game factory contract: %w", err)
-	}
 	s.factoryContract = factoryContract
 	return nil
 }
@@ -227,7 +226,7 @@ func (s *Service) registerGameTypes(ctx context.Context, cfg *config.Config) err
 	gameTypeRegistry := registry.NewGameTypeRegistry()
 	oracles := registry.NewOracleRegistry()
 	caller := batching.NewMultiCaller(s.l1Client.Client(), batching.DefaultBatchSize)
-	closer, err := fault.RegisterGameTypes(ctx, s.cl, s.logger, s.metrics, cfg, gameTypeRegistry, oracles, s.rollupClient, s.txSender, s.factoryContract, caller, s.l1Client, cfg.SelectiveClaimResolution, s.claimants)
+	closer, err := fault.RegisterGameTypes(ctx, s.systemClock, s.l1Clock, s.logger, s.metrics, cfg, gameTypeRegistry, oracles, s.rollupClient, s.txSender, s.factoryContract, caller, s.l1Client, cfg.SelectiveClaimResolution, s.claimants)
 	if err != nil {
 		return err
 	}
@@ -247,12 +246,12 @@ func (s *Service) initLargePreimages() error {
 	fetcher := fetcher.NewPreimageFetcher(s.logger, s.l1Client)
 	verifier := keccak.NewPreimageVerifier(s.logger, fetcher)
 	challenger := keccak.NewPreimageChallenger(s.logger, s.metrics, verifier, s.txSender)
-	s.preimages = keccak.NewLargePreimageScheduler(s.logger, s.cl, s.oracles, challenger)
+	s.preimages = keccak.NewLargePreimageScheduler(s.logger, s.l1Clock, s.oracles, challenger)
 	return nil
 }
 
 func (s *Service) initMonitor(cfg *config.Config) {
-	s.monitor = newGameMonitor(s.logger, s.cl, s.factoryContract, s.sched, s.preimages, cfg.GameWindow, s.claimer, s.l1Client.BlockNumber, cfg.GameAllowlist, s.pollClient)
+	s.monitor = newGameMonitor(s.logger, s.l1Clock, s.factoryContract, s.sched, s.preimages, cfg.GameWindow, s.claimer, s.l1Client.BlockNumber, cfg.GameAllowlist, s.pollClient)
 }
 
 func (s *Service) Start(ctx context.Context) error {
diff --git a/op-challenger/game/types/types.go b/op-challenger/game/types/types.go
index 5e831e73f9ca..4579e5476c1e 100644
--- a/op-challenger/game/types/types.go
+++ b/op-challenger/game/types/types.go
@@ -4,9 +4,7 @@ import (
 	"errors"
 	"fmt"
 
-	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/common"
-	ethtypes "github.com/ethereum/go-ethereum/core/types"
 )
 
 var ErrInvalidPrestate = errors.New("absolute prestate does not match")
@@ -42,12 +40,8 @@ func GameStatusFromUint8(i uint8) (GameStatus, error) {
 }
 
 type GameMetadata struct {
+	Index     uint64
 	GameType  uint32
 	Timestamp uint64
 	Proxy     common.Address
 }
-
-type TxSender interface {
-	From() common.Address
-	SendAndWait(txPurpose string, txs ...txmgr.TxCandidate) ([]*ethtypes.Receipt, error)
-}
diff --git a/op-challenger/metrics/metrics.go b/op-challenger/metrics/metrics.go
index 9383a45fedc2..9253f26cc631 100644
--- a/op-challenger/metrics/metrics.go
+++ b/op-challenger/metrics/metrics.go
@@ -3,13 +3,14 @@ package metrics
 import (
 	"io"
 
+	"github.com/ethereum-optimism/optimism/op-service/httputil"
 	"github.com/ethereum-optimism/optimism/op-service/sources/caching"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/prometheus/client_golang/prometheus"
 
-	"github.com/ethereum-optimism/optimism/op-service/httputil"
+	contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
 	txmetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics"
 )
@@ -28,11 +29,18 @@ type Metricer interface {
 	// Record cache metrics
 	caching.Metrics
 
+	// Record contract metrics
+	contractMetrics.ContractMetricer
+
 	RecordActedL1Block(n uint64)
 
 	RecordGameStep()
 	RecordGameMove()
+	RecordGameL2Challenge()
 	RecordCannonExecutionTime(t float64)
+	RecordAsteriscExecutionTime(t float64)
+	RecordClaimResolutionTime(t float64)
+	RecordGameActTime(t float64)
 
 	RecordPreimageChallenged()
 	RecordPreimageChallengeFailed()
@@ -60,8 +68,8 @@ type Metrics struct {
 	factory  opmetrics.Factory
 
 	txmetrics.TxMetrics
-
 	*opmetrics.CacheMetrics
+	*contractMetrics.ContractMetrics
 
 	info prometheus.GaugeVec
 	up   prometheus.Gauge
@@ -76,10 +84,14 @@ type Metrics struct {
 
 	highestActedL1Block prometheus.Gauge
 
-	moves prometheus.Counter
-	steps prometheus.Counter
+	moves        prometheus.Counter
+	steps        prometheus.Counter
+	l2Challenges prometheus.Counter
 
-	cannonExecutionTime prometheus.Histogram
+	claimResolutionTime   prometheus.Histogram
+	gameActTime           prometheus.Histogram
+	cannonExecutionTime   prometheus.Histogram
+	asteriscExecutionTime prometheus.Histogram
 
 	trackedGames  prometheus.GaugeVec
 	inflightGames prometheus.Gauge
@@ -104,6 +116,8 @@ func NewMetrics() *Metrics {
 
 		CacheMetrics: opmetrics.NewCacheMetrics(factory, Namespace, "provider_cache", "Provider cache"),
 
+		ContractMetrics: contractMetrics.MakeContractMetrics(Namespace, factory),
+
 		info: *factory.NewGaugeVec(prometheus.GaugeOpts{
 			Namespace: Namespace,
 			Name:      "info",
@@ -133,6 +147,11 @@ func NewMetrics() *Metrics {
 			Name:      "steps",
 			Help:      "Number of game steps made by the challenge agent",
 		}),
+		l2Challenges: factory.NewCounter(prometheus.CounterOpts{
+			Namespace: Namespace,
+			Name:      "l2_challenges",
+			Help:      "Number of L2 challenges made by the challenge agent",
+		}),
 		cannonExecutionTime: factory.NewHistogram(prometheus.HistogramOpts{
 			Namespace: Namespace,
 			Name:      "cannon_execution_time",
@@ -141,6 +160,28 @@ func NewMetrics() *Metrics {
 				[]float64{1.0, 10.0},
 				prometheus.ExponentialBuckets(30.0, 2.0, 14)...),
 		}),
+		claimResolutionTime: factory.NewHistogram(prometheus.HistogramOpts{
+			Namespace: Namespace,
+			Name:      "claim_resolution_time",
+			Help:      "Time (in seconds) spent trying to resolve claims",
+			Buckets:   []float64{.05, .1, .25, .5, 1, 2.5, 5, 7.5, 10},
+		}),
+		gameActTime: factory.NewHistogram(prometheus.HistogramOpts{
+			Namespace: Namespace,
+			Name:      "game_act_time",
+			Help:      "Time (in seconds) spent acting on a game",
+			Buckets: append(
+				[]float64{1.0, 2.0, 5.0, 10.0},
+				prometheus.ExponentialBuckets(30.0, 2.0, 14)...),
+		}),
+		asteriscExecutionTime: factory.NewHistogram(prometheus.HistogramOpts{
+			Namespace: Namespace,
+			Name:      "asterisc_execution_time",
+			Help:      "Time (in seconds) to execute asterisc",
+			Buckets: append(
+				[]float64{1.0, 10.0},
+				prometheus.ExponentialBuckets(30.0, 2.0, 14)...),
+		}),
 		bondClaimFailures: factory.NewCounter(prometheus.CounterOpts{
 			Namespace: Namespace,
 			Name:      "claim_failures",
@@ -217,6 +258,10 @@ func (m *Metrics) RecordGameStep() {
 	m.steps.Add(1)
 }
 
+func (m *Metrics) RecordGameL2Challenge() {
+	m.l2Challenges.Add(1)
+}
+
 func (m *Metrics) RecordPreimageChallenged() {
 	m.preimageChallenged.Add(1)
 }
@@ -237,6 +282,18 @@ func (m *Metrics) RecordCannonExecutionTime(t float64) {
 	m.cannonExecutionTime.Observe(t)
 }
 
+func (m *Metrics) RecordAsteriscExecutionTime(t float64) {
+	m.asteriscExecutionTime.Observe(t)
+}
+
+func (m *Metrics) RecordClaimResolutionTime(t float64) {
+	m.claimResolutionTime.Observe(t)
+}
+
+func (m *Metrics) RecordGameActTime(t float64) {
+	m.gameActTime.Observe(t)
+}
+
 func (m *Metrics) IncActiveExecutors() {
 	m.executors.WithLabelValues("active").Inc()
 }
diff --git a/op-challenger/metrics/noop.go b/op-challenger/metrics/noop.go
index e14620ef320d..c238f03fcb73 100644
--- a/op-challenger/metrics/noop.go
+++ b/op-challenger/metrics/noop.go
@@ -3,6 +3,7 @@ package metrics
 import (
 	"io"
 
+	contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/ethereum/go-ethereum/log"
@@ -12,6 +13,7 @@ import (
 
 type NoopMetricsImpl struct {
 	txmetrics.NoopTxMetrics
+	contractMetrics.NoopMetrics
 }
 
 func (i *NoopMetricsImpl) StartBalanceMetrics(l log.Logger, client *ethclient.Client, account common.Address) io.Closer {
@@ -23,8 +25,9 @@ var NoopMetrics Metricer = new(NoopMetricsImpl)
 func (*NoopMetricsImpl) RecordInfo(version string) {}
 func (*NoopMetricsImpl) RecordUp()                 {}
 
-func (*NoopMetricsImpl) RecordGameMove() {}
-func (*NoopMetricsImpl) RecordGameStep() {}
+func (*NoopMetricsImpl) RecordGameMove()        {}
+func (*NoopMetricsImpl) RecordGameStep()        {}
+func (*NoopMetricsImpl) RecordGameL2Challenge() {}
 
 func (*NoopMetricsImpl) RecordActedL1Block(_ uint64) {}
 
@@ -34,7 +37,10 @@ func (*NoopMetricsImpl) RecordPreimageChallengeFailed() {}
 func (*NoopMetricsImpl) RecordBondClaimFailed()   {}
 func (*NoopMetricsImpl) RecordBondClaimed(uint64) {}
 
-func (*NoopMetricsImpl) RecordCannonExecutionTime(t float64) {}
+func (*NoopMetricsImpl) RecordCannonExecutionTime(t float64)   {}
+func (*NoopMetricsImpl) RecordAsteriscExecutionTime(t float64) {}
+func (*NoopMetricsImpl) RecordClaimResolutionTime(t float64)   {}
+func (*NoopMetricsImpl) RecordGameActTime(t float64)           {}
 
 func (*NoopMetricsImpl) RecordGamesStatus(inProgress, defenderWon, challengerWon int) {}
 
diff --git a/op-challenger/sender/sender.go b/op-challenger/sender/sender.go
index 01f77c6b9780..8774a2beae3c 100644
--- a/op-challenger/sender/sender.go
+++ b/op-challenger/sender/sender.go
@@ -3,6 +3,7 @@ package sender
 import (
 	"context"
 	"errors"
+	"fmt"
 
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
 	"github.com/ethereum/go-ethereum/common"
@@ -10,6 +11,8 @@ import (
 	"github.com/ethereum/go-ethereum/log"
 )
 
+var ErrTransactionReverted = errors.New("transaction published but reverted")
+
 type TxSender struct {
 	log log.Logger
 
@@ -30,27 +33,30 @@ func (s *TxSender) From() common.Address {
 	return s.txMgr.From()
 }
 
-func (s *TxSender) SendAndWait(txPurpose string, txs ...txmgr.TxCandidate) ([]*types.Receipt, error) {
+func (s *TxSender) SendAndWaitDetailed(txPurpose string, txs ...txmgr.TxCandidate) []error {
 	receiptsCh := make(chan txmgr.TxReceipt[int], len(txs))
 	for i, tx := range txs {
 		s.queue.Send(i, tx, receiptsCh)
 	}
-	receipts := make([]*types.Receipt, len(txs))
 	completed := 0
-	var errs []error
+	errs := make([]error, len(txs))
 	for completed < len(txs) {
 		rcpt := <-receiptsCh
-		receipts[rcpt.ID] = rcpt.Receipt
 		completed++
 		if rcpt.Err != nil {
-			errs = append(errs, rcpt.Err)
+			errs[rcpt.ID] = rcpt.Err
 		} else if rcpt.Receipt != nil {
 			if rcpt.Receipt.Status != types.ReceiptStatusSuccessful {
-				s.log.Error("Transaction published but reverted", "tx_hash", rcpt.Receipt.TxHash, "purpose", txPurpose)
+				errs[rcpt.ID] = fmt.Errorf("%w purpose: %v hash: %v", ErrTransactionReverted, txPurpose, rcpt.Receipt.TxHash)
 			} else {
 				s.log.Debug("Transaction successfully published", "tx_hash", rcpt.Receipt.TxHash, "purpose", txPurpose)
 			}
 		}
 	}
-	return receipts, errors.Join(errs...)
+	return errs
+}
+
+func (s *TxSender) SendAndWaitSimple(txPurpose string, txs ...txmgr.TxCandidate) error {
+	errs := s.SendAndWaitDetailed(txPurpose, txs...)
+	return errors.Join(errs...)
 }
diff --git a/op-challenger/sender/sender_test.go b/op-challenger/sender/sender_test.go
index 16dacf6173af..e83f2416d93f 100644
--- a/op-challenger/sender/sender_test.go
+++ b/op-challenger/sender/sender_test.go
@@ -16,7 +16,7 @@ import (
 	"golang.org/x/exp/maps"
 )
 
-func TestSendAndWait(t *testing.T) {
+func TestSendAndWaitQueueWithMaxPending(t *testing.T) {
 	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
 	defer cancel()
 	txMgr := &stubTxMgr{sending: make(map[byte]chan *types.Receipt)}
@@ -26,18 +26,18 @@ func TestSendAndWait(t *testing.T) {
 		return txmgr.TxCandidate{TxData: []byte{i}}
 	}
 
-	sendAsync := func(txs ...txmgr.TxCandidate) chan []*types.Receipt {
-		ch := make(chan []*types.Receipt, 1)
+	sendAsync := func(txs ...txmgr.TxCandidate) chan []txmgr.TxCandidate {
+		ch := make(chan []txmgr.TxCandidate, 1)
 		go func() {
-			rcpts, err := sender.SendAndWait("testing", txs...)
+			err := sender.SendAndWaitSimple("testing", txs...)
 			require.NoError(t, err)
-			ch <- rcpts
+			ch <- txs
 			close(ch)
 		}()
 		return ch
 	}
 
-	wait := func(ch chan []*types.Receipt) []*types.Receipt {
+	wait := func(ch chan []txmgr.TxCandidate) []txmgr.TxCandidate {
 		select {
 		case rcpts := <-ch:
 			return rcpts
@@ -88,9 +88,34 @@ func TestSendAndWait(t *testing.T) {
 	require.Len(t, wait(batch2), 2, "Batch2 should complete")
 }
 
+func TestSendAndWaitReturnIndividualErrors(t *testing.T) {
+	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
+	defer cancel()
+	txMgr := &stubTxMgr{
+		sending: make(map[byte]chan *types.Receipt),
+		syncStatus: map[byte]uint64{
+			0: types.ReceiptStatusSuccessful,
+			1: types.ReceiptStatusFailed,
+			2: types.ReceiptStatusSuccessful,
+		},
+	}
+	sender := NewTxSender(ctx, testlog.Logger(t, log.LevelInfo), txMgr, 500)
+
+	tx := func(i byte) txmgr.TxCandidate {
+		return txmgr.TxCandidate{TxData: []byte{i}}
+	}
+
+	errs := sender.SendAndWaitDetailed("testing", tx(0), tx(1), tx(2))
+	require.Len(t, errs, 3)
+	require.NoError(t, errs[0])
+	require.ErrorIs(t, errs[1], ErrTransactionReverted)
+	require.NoError(t, errs[2])
+}
+
 type stubTxMgr struct {
-	m       sync.Mutex
-	sending map[byte]chan *types.Receipt
+	m          sync.Mutex
+	sending    map[byte]chan *types.Receipt
+	syncStatus map[byte]uint64
 }
 
 func (s *stubTxMgr) IsClosed() bool {
@@ -111,7 +136,11 @@ func (s *stubTxMgr) recordTx(candidate txmgr.TxCandidate) chan *types.Receipt {
 		panic("Sending duplicate transaction")
 	}
 	ch := make(chan *types.Receipt, 1)
-	s.sending[id] = ch
+	if status, ok := s.syncStatus[id]; ok {
+		ch <- &types.Receipt{Status: status}
+	} else {
+		s.sending[id] = ch
+	}
 	return ch
 }
 
diff --git a/op-challenger/tools/create_game.go b/op-challenger/tools/create_game.go
new file mode 100644
index 000000000000..4453a195e1dc
--- /dev/null
+++ b/op-challenger/tools/create_game.go
@@ -0,0 +1,44 @@
+package tools
+
+import (
+	"context"
+	"fmt"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
+	"github.com/ethereum-optimism/optimism/op-service/txmgr"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+)
+
+type GameCreator struct {
+	contract *contracts.DisputeGameFactoryContract
+	txMgr    txmgr.TxManager
+}
+
+func NewGameCreator(contract *contracts.DisputeGameFactoryContract, txMgr txmgr.TxManager) *GameCreator {
+	return &GameCreator{
+		contract: contract,
+		txMgr:    txMgr,
+	}
+}
+
+func (g *GameCreator) CreateGame(ctx context.Context, outputRoot common.Hash, traceType uint64, l2BlockNum uint64) (common.Address, error) {
+	txCandidate, err := g.contract.CreateTx(ctx, uint32(traceType), outputRoot, l2BlockNum)
+	if err != nil {
+		return common.Address{}, fmt.Errorf("failed to create tx: %w", err)
+	}
+
+	rct, err := g.txMgr.Send(ctx, txCandidate)
+	if err != nil {
+		return common.Address{}, fmt.Errorf("failed to send tx: %w", err)
+	}
+	if rct.Status != types.ReceiptStatusSuccessful {
+		return common.Address{}, fmt.Errorf("game creation transaction (%v) reverted", rct.TxHash.Hex())
+	}
+
+	gameAddr, _, _, err := g.contract.DecodeDisputeGameCreatedLog(rct)
+	if err != nil {
+		return common.Address{}, fmt.Errorf("failed to decode game created: %w", err)
+	}
+	return gameAddr, nil
+}
diff --git a/op-conductor/Dockerfile b/op-conductor/Dockerfile
deleted file mode 100644
index 5423628ea75e..000000000000
--- a/op-conductor/Dockerfile
+++ /dev/null
@@ -1,9 +0,0 @@
-ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest
-FROM $OP_STACK_GO_BUILDER as builder
-# See "make golang-docker" and /ops/docker/op-stack-go
-
-FROM alpine:3.18
-
-COPY --from=builder /usr/local/bin/op-conductor /usr/local/bin/op-conductor
-
-CMD ["op-conductor"]
diff --git a/op-conductor/Makefile b/op-conductor/Makefile
index e858cfb594ba..5021e5706af5 100644
--- a/op-conductor/Makefile
+++ b/op-conductor/Makefile
@@ -1,6 +1,6 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+VERSION ?= v0.0.0
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
diff --git a/op-conductor/conductor/config.go b/op-conductor/conductor/config.go
index ad65a0e34cc3..2d356a6553e1 100644
--- a/op-conductor/conductor/config.go
+++ b/op-conductor/conductor/config.go
@@ -118,6 +118,7 @@ func NewConfig(ctx *cli.Context, log log.Logger) (*Config, error) {
 		HealthCheck: HealthCheckConfig{
 			Interval:       ctx.Uint64(flags.HealthCheckInterval.Name),
 			UnsafeInterval: ctx.Uint64(flags.HealthCheckUnsafeInterval.Name),
+			SafeEnabled:    ctx.Bool(flags.HealthCheckSafeEnabled.Name),
 			SafeInterval:   ctx.Uint64(flags.HealthCheckSafeInterval.Name),
 			MinPeerCount:   ctx.Uint64(flags.HealthCheckMinPeerCount.Name),
 		},
@@ -138,6 +139,9 @@ type HealthCheckConfig struct {
 	// UnsafeInterval is the interval allowed between unsafe head and now in seconds.
 	UnsafeInterval uint64
 
+	// SafeEnabled is whether to enable safe head progression checks.
+	SafeEnabled bool
+
 	// SafeInterval is the interval between safe head progression measured in seconds.
 	SafeInterval uint64
 
diff --git a/op-conductor/conductor/service.go b/op-conductor/conductor/service.go
index 4775d8a48836..0617718efbe8 100644
--- a/op-conductor/conductor/service.go
+++ b/op-conductor/conductor/service.go
@@ -18,6 +18,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-conductor/client"
 	"github.com/ethereum-optimism/optimism/op-conductor/consensus"
 	"github.com/ethereum-optimism/optimism/op-conductor/health"
+	"github.com/ethereum-optimism/optimism/op-conductor/metrics"
 	conductorrpc "github.com/ethereum-optimism/optimism/op-conductor/rpc"
 	opp2p "github.com/ethereum-optimism/optimism/op-node/p2p"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/driver"
@@ -25,20 +26,22 @@ import (
 	opclient "github.com/ethereum-optimism/optimism/op-service/client"
 	"github.com/ethereum-optimism/optimism/op-service/dial"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/httputil"
+	opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
 	oprpc "github.com/ethereum-optimism/optimism/op-service/rpc"
 	"github.com/ethereum-optimism/optimism/op-service/sources"
 )
 
 var (
-	ErrResumeTimeout                           = errors.New("timeout to resume conductor")
-	ErrPauseTimeout                            = errors.New("timeout to pause conductor")
-	ErrUnsafeHeadMismarch                      = errors.New("unsafe head mismatch")
-	ErrUnableToRetrieveUnsafeHeadFromConsensus = errors.New("unable to retrieve unsafe head from consensus")
+	ErrResumeTimeout      = errors.New("timeout to resume conductor")
+	ErrPauseTimeout       = errors.New("timeout to pause conductor")
+	ErrUnsafeHeadMismatch = errors.New("unsafe head mismatch")
+	ErrNoUnsafeHead       = errors.New("no unsafe head")
 )
 
 // New creates a new OpConductor instance.
 func New(ctx context.Context, cfg *Config, log log.Logger, version string) (*OpConductor, error) {
-	return NewOpConductor(ctx, cfg, log, version, nil, nil, nil)
+	return NewOpConductor(ctx, cfg, log, metrics.NewMetrics(), version, nil, nil, nil)
 }
 
 // NewOpConductor creates a new OpConductor instance.
@@ -46,6 +49,7 @@ func NewOpConductor(
 	ctx context.Context,
 	cfg *Config,
 	log log.Logger,
+	m metrics.Metricer,
 	version string,
 	ctrl client.SequencerControl,
 	cons consensus.Consensus,
@@ -59,6 +63,7 @@ func NewOpConductor(
 		log:          log,
 		version:      version,
 		cfg:          cfg,
+		metrics:      m,
 		pauseCh:      make(chan struct{}),
 		pauseDoneCh:  make(chan struct{}),
 		resumeCh:     make(chan struct{}),
@@ -172,10 +177,12 @@ func (c *OpConductor) initHealthMonitor(ctx context.Context) error {
 
 	c.hmon = health.NewSequencerHealthMonitor(
 		c.log,
+		c.metrics,
 		c.cfg.HealthCheck.Interval,
 		c.cfg.HealthCheck.UnsafeInterval,
 		c.cfg.HealthCheck.SafeInterval,
 		c.cfg.HealthCheck.MinPeerCount,
+		c.cfg.HealthCheck.SafeEnabled,
 		&c.cfg.RollupCfg,
 		node,
 		p2p,
@@ -244,6 +251,7 @@ type OpConductor struct {
 	log     log.Logger
 	version string
 	cfg     *Config
+	metrics metrics.Metricer
 
 	ctrl client.SequencerControl
 	cons consensus.Consensus
@@ -270,7 +278,8 @@ type OpConductor struct {
 	shutdownCtx    context.Context
 	shutdownCancel context.CancelFunc
 
-	rpcServer *oprpc.Server
+	rpcServer     *oprpc.Server
+	metricsServer *httputil.HTTPServer
 }
 
 type state struct {
@@ -290,6 +299,10 @@ func (s *state) Equal(other *state) bool {
 	return s.leader == other.leader && s.healthy == other.healthy && s.active == other.active
 }
 
+func (s *state) String() string {
+	return fmt.Sprintf("leader: %t, healthy: %t, active: %t", s.leader, s.healthy, s.active)
+}
+
 var _ cliapp.Lifecycle = (*OpConductor)(nil)
 
 // Start implements cliapp.Lifecycle.
@@ -305,9 +318,25 @@ func (oc *OpConductor) Start(ctx context.Context) error {
 		return errors.Wrap(err, "failed to start JSON-RPC server")
 	}
 
+	if oc.cfg.MetricsConfig.Enabled {
+		oc.log.Info("starting metrics server")
+		m, ok := oc.metrics.(opmetrics.RegistryMetricer)
+		if !ok {
+			return fmt.Errorf("metrics were enabled, but metricer %T does not expose registry for metrics-server", oc.metrics)
+		}
+		metricsServer, err := opmetrics.StartServer(m.Registry(), oc.cfg.MetricsConfig.ListenAddr, oc.cfg.MetricsConfig.ListenPort)
+		if err != nil {
+			return errors.Wrap(err, "failed to start metrics server")
+		}
+		oc.metricsServer = metricsServer
+	}
+
 	oc.wg.Add(1)
 	go oc.loop()
 
+	oc.metrics.RecordInfo(oc.version)
+	oc.metrics.RecordUp()
+
 	oc.log.Info("OpConductor started")
 	return nil
 }
@@ -345,6 +374,12 @@ func (oc *OpConductor) Stop(ctx context.Context) error {
 		}
 	}
 
+	if oc.metricsServer != nil {
+		if err := oc.metricsServer.Shutdown(ctx); err != nil {
+			result = multierror.Append(result, errors.Wrap(err, "failed to stop metrics server"))
+		}
+	}
+
 	if result.ErrorOrNil() != nil {
 		oc.log.Error("failed to stop OpConductor", "err", result.ErrorOrNil())
 		return result.ErrorOrNil()
@@ -365,6 +400,7 @@ func (oc *OpConductor) Pause(ctx context.Context) error {
 	select {
 	case oc.pauseCh <- struct{}{}:
 		<-oc.pauseDoneCh
+		oc.log.Info("OpConductor has been paused")
 		return nil
 	case <-ctx.Done():
 		return ErrPauseTimeout
@@ -381,6 +417,7 @@ func (oc *OpConductor) Resume(ctx context.Context) error {
 	select {
 	case oc.resumeCh <- struct{}{}:
 		<-oc.resumeDoneCh
+		oc.log.Info("OpConductor has been resumed")
 		return nil
 	case <-ctx.Done():
 		return ErrResumeTimeout
@@ -434,7 +471,7 @@ func (oc *OpConductor) TransferLeaderToServer(_ context.Context, id string, addr
 	return oc.cons.TransferLeaderTo(id, addr)
 }
 
-// CommitUnsafePayload commits a unsafe payload (latest head) to the cluster FSM.
+// CommitUnsafePayload commits an unsafe payload (latest head) to the cluster FSM ensuring strong consistency by leveraging Raft consensus mechanisms.
 func (oc *OpConductor) CommitUnsafePayload(_ context.Context, payload *eth.ExecutionPayloadEnvelope) error {
 	return oc.cons.CommitUnsafePayload(payload)
 }
@@ -449,8 +486,8 @@ func (oc *OpConductor) ClusterMembership(_ context.Context) ([]*consensus.Server
 	return oc.cons.ClusterMembership()
 }
 
-// LatestUnsafePayload returns the latest unsafe payload envelope from FSM.
-func (oc *OpConductor) LatestUnsafePayload(_ context.Context) *eth.ExecutionPayloadEnvelope {
+// LatestUnsafePayload returns the latest unsafe payload envelope from FSM in a strongly consistent fashion.
+func (oc *OpConductor) LatestUnsafePayload(_ context.Context) (*eth.ExecutionPayloadEnvelope, error) {
 	return oc.cons.LatestUnsafePayload()
 }
 
@@ -458,12 +495,14 @@ func (oc *OpConductor) loop() {
 	defer oc.wg.Done()
 
 	for {
+		startTime := time.Now()
 		select {
 		case <-oc.shutdownCtx.Done():
 			return
 		default:
 			oc.loopActionFn()
 		}
+		oc.metrics.RecordLoopExecutionTime(time.Since(startTime).Seconds())
 	}
 }
 
@@ -515,12 +554,11 @@ func (oc *OpConductor) handleHealthUpdate(hcerr error) {
 		oc.queueAction()
 	}
 
-	if healthy != oc.healthy.Load() {
+	if oc.healthy.Swap(healthy) != healthy {
 		// queue an action if health status changed.
 		oc.queueAction()
 	}
 
-	oc.healthy.Store(healthy)
 	oc.hcerr = hcerr
 }
 
@@ -575,7 +613,7 @@ func (oc *OpConductor) action() {
 			break
 		}
 
-		// 2. we're here becasuse an healthy leader became unhealthy itself
+		// 2. we're here because an healthy leader became unhealthy itself
 		//    then we should try to stop sequencing locally and transfer leadership.
 		var result *multierror.Error
 		// Try to stop sequencer first, but since sequencer is not healthy, we may not be able to stop it.
@@ -603,7 +641,7 @@ func (oc *OpConductor) action() {
 
 	oc.log.Debug("exiting action with status and error", "status", status, "err", err)
 	if err != nil {
-		oc.log.Error("failed to execute step, queueing another one to retry", "err", err)
+		oc.log.Error("failed to execute step, queueing another one to retry", "err", err, "status", status)
 		// randomly sleep for 0-200ms to avoid excessive retry
 		time.Sleep(time.Duration(rand.Intn(200)) * time.Millisecond)
 		oc.queueAction()
@@ -613,6 +651,7 @@ func (oc *OpConductor) action() {
 	if !status.Equal(oc.prevState) {
 		oc.log.Info("state changed", "prev_state", oc.prevState, "new_state", status)
 		oc.prevState = status
+		oc.metrics.RecordStateChange(status.leader, status.healthy, status.active)
 	}
 }
 
@@ -621,6 +660,7 @@ func (oc *OpConductor) transferLeader() error {
 	// TransferLeader here will do round robin to try to transfer leadership to the next healthy node.
 	oc.log.Info("transferring leadership", "server", oc.cons.ServerID())
 	err := oc.cons.TransferLeader()
+	oc.metrics.RecordLeaderTransfer(err == nil)
 	if err == nil {
 		oc.leader.Store(false)
 		return nil // success
@@ -648,6 +688,7 @@ func (oc *OpConductor) stopSequencer() error {
 			return errors.Wrap(err, "failed to stop sequencer")
 		}
 	}
+	oc.metrics.RecordStopSequencer(err == nil)
 
 	oc.seqActive.Store(false)
 	return nil
@@ -661,8 +702,15 @@ func (oc *OpConductor) startSequencer() error {
 	unsafeInCons, unsafeInNode, err := oc.compareUnsafeHead(ctx)
 	// if there's a mismatch, try to post the unsafe head to op-node
 	if err != nil {
-		if errors.Is(err, ErrUnsafeHeadMismarch) && uint64(unsafeInCons.ExecutionPayload.BlockNumber)-unsafeInNode.NumberU64() == 1 {
+		if errors.Is(err, ErrUnsafeHeadMismatch) && uint64(unsafeInCons.ExecutionPayload.BlockNumber)-unsafeInNode.NumberU64() == 1 {
 			// tries to post the unsafe head to op-node when head is only 1 block behind (most likely due to gossip delay)
+			oc.log.Debug(
+				"posting unsafe head to op-node",
+				"consensus_num", uint64(unsafeInCons.ExecutionPayload.BlockNumber),
+				"consensus_hash", unsafeInCons.ExecutionPayload.BlockHash.Hex(),
+				"node_num", unsafeInNode.NumberU64(),
+				"node_hash", unsafeInNode.Hash().Hex(),
+			)
 			if innerErr := oc.ctrl.PostUnsafePayload(ctx, unsafeInCons); innerErr != nil {
 				oc.log.Error("failed to post unsafe head payload envelope to op-node", "err", innerErr)
 			}
@@ -671,7 +719,8 @@ func (oc *OpConductor) startSequencer() error {
 	}
 
 	oc.log.Info("starting sequencer", "server", oc.cons.ServerID(), "leader", oc.leader.Load(), "healthy", oc.healthy.Load(), "active", oc.seqActive.Load())
-	if err = oc.ctrl.StartSequencer(ctx, unsafeInCons.ExecutionPayload.BlockHash); err != nil {
+	err = oc.ctrl.StartSequencer(ctx, unsafeInCons.ExecutionPayload.BlockHash)
+	if err != nil {
 		// cannot directly compare using Errors.Is because the error is returned from an JSON RPC server which lost its type.
 		if !strings.Contains(err.Error(), driver.ErrSequencerAlreadyStarted.Error()) {
 			return fmt.Errorf("failed to start sequencer: %w", err)
@@ -679,15 +728,19 @@ func (oc *OpConductor) startSequencer() error {
 			oc.log.Warn("sequencer already started.", "err", err)
 		}
 	}
+	oc.metrics.RecordStartSequencer(err == nil)
 
 	oc.seqActive.Store(true)
 	return nil
 }
 
 func (oc *OpConductor) compareUnsafeHead(ctx context.Context) (*eth.ExecutionPayloadEnvelope, eth.BlockInfo, error) {
-	unsafeInCons := oc.cons.LatestUnsafePayload()
+	unsafeInCons, err := oc.cons.LatestUnsafePayload()
+	if err != nil {
+		return nil, nil, errors.Wrap(err, "unable to retrieve unsafe head from consensus")
+	}
 	if unsafeInCons == nil {
-		return nil, nil, ErrUnableToRetrieveUnsafeHeadFromConsensus
+		return nil, nil, ErrNoUnsafeHead
 	}
 
 	unsafeInNode, err := oc.ctrl.LatestUnsafeBlock(ctx)
@@ -695,17 +748,17 @@ func (oc *OpConductor) compareUnsafeHead(ctx context.Context) (*eth.ExecutionPay
 		return unsafeInCons, nil, errors.Wrap(err, "failed to get latest unsafe block from EL during compareUnsafeHead phase")
 	}
 
-	oc.log.Debug("comparing unsafe head", "consensus", unsafeInCons.ExecutionPayload.BlockNumber, "node", unsafeInNode.NumberU64())
+	oc.log.Debug("comparing unsafe head", "consensus", uint64(unsafeInCons.ExecutionPayload.BlockNumber), "node", unsafeInNode.NumberU64())
 	if unsafeInCons.ExecutionPayload.BlockHash != unsafeInNode.Hash() {
 		oc.log.Warn(
 			"latest unsafe block in consensus is not the same as the one in op-node",
 			"consensus_hash", unsafeInCons.ExecutionPayload.BlockHash,
-			"consensus_block_num", unsafeInCons.ExecutionPayload.BlockNumber,
+			"consensus_num", uint64(unsafeInCons.ExecutionPayload.BlockNumber),
 			"node_hash", unsafeInNode.Hash(),
-			"node_block_num", unsafeInNode.NumberU64(),
+			"node_num", unsafeInNode.NumberU64(),
 		)
 
-		return unsafeInCons, unsafeInNode, ErrUnsafeHeadMismarch
+		return unsafeInCons, unsafeInNode, ErrUnsafeHeadMismatch
 	}
 
 	return unsafeInCons, unsafeInNode, nil
diff --git a/op-conductor/conductor/service_test.go b/op-conductor/conductor/service_test.go
index 9f61ed90ba18..c0062bd6b1fd 100644
--- a/op-conductor/conductor/service_test.go
+++ b/op-conductor/conductor/service_test.go
@@ -19,6 +19,7 @@ import (
 	consensusmocks "github.com/ethereum-optimism/optimism/op-conductor/consensus/mocks"
 	"github.com/ethereum-optimism/optimism/op-conductor/health"
 	healthmocks "github.com/ethereum-optimism/optimism/op-conductor/health/mocks"
+	"github.com/ethereum-optimism/optimism/op-conductor/metrics"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
@@ -88,6 +89,7 @@ type OpConductorTestSuite struct {
 	err     error
 	log     log.Logger
 	cfg     Config
+	metrics metrics.Metricer
 	version string
 	ctrl    *clientmocks.SequencerControl
 	cons    *consensusmocks.Consensus
@@ -101,6 +103,7 @@ type OpConductorTestSuite struct {
 func (s *OpConductorTestSuite) SetupSuite() {
 	s.ctx = context.Background()
 	s.log = testlog.Logger(s.T(), log.LevelDebug)
+	s.metrics = &metrics.NoopMetricsImpl{}
 	s.cfg = mockConfig(s.T())
 	s.version = "v0.0.1"
 	s.next = make(chan struct{}, 1)
@@ -113,7 +116,7 @@ func (s *OpConductorTestSuite) SetupTest() {
 	s.hmon = &healthmocks.HealthMonitor{}
 	s.cons.EXPECT().ServerID().Return("SequencerA")
 
-	conductor, err := NewOpConductor(s.ctx, &s.cfg, s.log, s.version, s.ctrl, s.cons, s.hmon)
+	conductor, err := NewOpConductor(s.ctx, &s.cfg, s.log, s.metrics, s.version, s.ctrl, s.cons, s.hmon)
 	s.NoError(err)
 	s.conductor = conductor
 
@@ -298,7 +301,7 @@ func (s *OpConductorTestSuite) TestScenario1() {
 		InfoHash: [32]byte{1, 2, 3},
 	}
 	s.cons.EXPECT().TransferLeader().Return(nil)
-	s.cons.EXPECT().LatestUnsafePayload().Return(mockPayload).Times(1)
+	s.cons.EXPECT().LatestUnsafePayload().Return(mockPayload, nil).Times(1)
 	s.ctrl.EXPECT().LatestUnsafeBlock(mock.Anything).Return(mockBlockInfo, nil).Times(1)
 
 	// become leader
@@ -317,6 +320,42 @@ func (s *OpConductorTestSuite) TestScenario1() {
 	s.cons.AssertNumberOfCalls(s.T(), "TransferLeader", 1)
 }
 
+// In this test, we have a follower that is not healthy and not sequencing, it becomes leader through election.
+// But since it fails to compare the unsafe head to the value stored in consensus, we expect it to transfer leadership to another node.
+// [follower, not healthy, not sequencing] -- become leader --> [leader, not healthy, not sequencing] -- transfer leadership --> [follower, not healthy, not sequencing]
+func (s *OpConductorTestSuite) TestScenario1Err() {
+	s.enableSynchronization()
+
+	// set initial state
+	s.conductor.leader.Store(false)
+	s.conductor.healthy.Store(false)
+	s.conductor.seqActive.Store(false)
+	s.conductor.hcerr = health.ErrSequencerNotHealthy
+	s.conductor.prevState = &state{
+		leader:  false,
+		healthy: false,
+		active:  false,
+	}
+
+	s.cons.EXPECT().LatestUnsafePayload().Return(nil, errors.New("fake connection error")).Times(1)
+	s.cons.EXPECT().TransferLeader().Return(nil)
+
+	// become leader
+	s.updateLeaderStatusAndExecuteAction(true)
+
+	// expect to transfer leadership, go back to [follower, not healthy, not sequencing]
+	s.False(s.conductor.leader.Load())
+	s.False(s.conductor.healthy.Load())
+	s.False(s.conductor.seqActive.Load())
+	s.Equal(health.ErrSequencerNotHealthy, s.conductor.hcerr)
+	s.Equal(&state{
+		leader:  true,
+		healthy: false,
+		active:  false,
+	}, s.conductor.prevState)
+	s.cons.AssertNumberOfCalls(s.T(), "TransferLeader", 1)
+}
+
 // In this test, we have a follower that is not healthy and not sequencing. it becomes healthy and we expect it to stay as follower and not start sequencing.
 // [follower, not healthy, not sequencing] -- become healthy --> [follower, healthy, not sequencing]
 func (s *OpConductorTestSuite) TestScenario2() {
@@ -353,7 +392,7 @@ func (s *OpConductorTestSuite) TestScenario3() {
 		InfoNum:  1,
 		InfoHash: [32]byte{1, 2, 3},
 	}
-	s.cons.EXPECT().LatestUnsafePayload().Return(mockPayload).Times(1)
+	s.cons.EXPECT().LatestUnsafePayload().Return(mockPayload, nil).Times(1)
 	s.ctrl.EXPECT().LatestUnsafeBlock(mock.Anything).Return(mockBlockInfo, nil).Times(1)
 	s.ctrl.EXPECT().StartSequencer(mock.Anything, mock.Anything).Return(nil).Times(1)
 
@@ -392,7 +431,7 @@ func (s *OpConductorTestSuite) TestScenario4() {
 		InfoNum:  1,
 		InfoHash: [32]byte{2, 3, 4},
 	}
-	s.cons.EXPECT().LatestUnsafePayload().Return(mockPayload).Times(1)
+	s.cons.EXPECT().LatestUnsafePayload().Return(mockPayload, nil).Times(1)
 	s.ctrl.EXPECT().LatestUnsafeBlock(mock.Anything).Return(mockBlockInfo, nil).Times(1)
 	s.ctrl.EXPECT().PostUnsafePayload(mock.Anything, mock.Anything).Return(nil).Times(1)
 
@@ -410,7 +449,7 @@ func (s *OpConductorTestSuite) TestScenario4() {
 	// unsafe caught up, we try to start sequencer at specified block and succeeds
 	mockBlockInfo.InfoNum = 2
 	mockBlockInfo.InfoHash = [32]byte{1, 2, 3}
-	s.cons.EXPECT().LatestUnsafePayload().Return(mockPayload).Times(1)
+	s.cons.EXPECT().LatestUnsafePayload().Return(mockPayload, nil).Times(1)
 	s.ctrl.EXPECT().LatestUnsafeBlock(mock.Anything).Return(mockBlockInfo, nil).Times(1)
 	s.ctrl.EXPECT().StartSequencer(mock.Anything, mockBlockInfo.InfoHash).Return(nil).Times(1)
 
@@ -664,7 +703,7 @@ func (s *OpConductorTestSuite) TestFailureAndRetry3() {
 		InfoNum:  1,
 		InfoHash: [32]byte{1, 2, 3},
 	}
-	s.cons.EXPECT().LatestUnsafePayload().Return(mockPayload).Times(2)
+	s.cons.EXPECT().LatestUnsafePayload().Return(mockPayload, nil).Times(2)
 	s.ctrl.EXPECT().LatestUnsafeBlock(mock.Anything).Return(mockBlockInfo, nil).Times(2)
 	s.ctrl.EXPECT().StartSequencer(mock.Anything, mockBlockInfo.InfoHash).Return(nil).Times(1)
 
diff --git a/op-conductor/consensus/iface.go b/op-conductor/consensus/iface.go
index 7134eef5a273..15096c2e8ae1 100644
--- a/op-conductor/consensus/iface.go
+++ b/op-conductor/consensus/iface.go
@@ -59,10 +59,10 @@ type Consensus interface {
 	// ClusterMembership returns the current cluster membership configuration.
 	ClusterMembership() ([]*ServerInfo, error)
 
-	// CommitPayload commits latest unsafe payload to the FSM.
+	// CommitPayload commits latest unsafe payload to the FSM in a strongly consistent fashion.
 	CommitUnsafePayload(payload *eth.ExecutionPayloadEnvelope) error
-	// LatestUnsafeBlock returns the latest unsafe payload from FSM.
-	LatestUnsafePayload() *eth.ExecutionPayloadEnvelope
+	// LatestUnsafeBlock returns the latest unsafe payload from FSM in a strongly consistent fashion.
+	LatestUnsafePayload() (*eth.ExecutionPayloadEnvelope, error)
 
 	// Shutdown shuts down the consensus protocol client.
 	Shutdown() error
diff --git a/op-conductor/consensus/mocks/Consensus.go b/op-conductor/consensus/mocks/Consensus.go
index e85ad0410013..02d65869c06a 100644
--- a/op-conductor/consensus/mocks/Consensus.go
+++ b/op-conductor/consensus/mocks/Consensus.go
@@ -266,7 +266,7 @@ func (_c *Consensus_DemoteVoter_Call) RunAndReturn(run func(string) error) *Cons
 }
 
 // LatestUnsafePayload provides a mock function with given fields:
-func (_m *Consensus) LatestUnsafePayload() *eth.ExecutionPayloadEnvelope {
+func (_m *Consensus) LatestUnsafePayload() (*eth.ExecutionPayloadEnvelope, error) {
 	ret := _m.Called()
 
 	if len(ret) == 0 {
@@ -274,6 +274,10 @@ func (_m *Consensus) LatestUnsafePayload() *eth.ExecutionPayloadEnvelope {
 	}
 
 	var r0 *eth.ExecutionPayloadEnvelope
+	var r1 error
+	if rf, ok := ret.Get(0).(func() (*eth.ExecutionPayloadEnvelope, error)); ok {
+		return rf()
+	}
 	if rf, ok := ret.Get(0).(func() *eth.ExecutionPayloadEnvelope); ok {
 		r0 = rf()
 	} else {
@@ -282,7 +286,13 @@ func (_m *Consensus) LatestUnsafePayload() *eth.ExecutionPayloadEnvelope {
 		}
 	}
 
-	return r0
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
 }
 
 // Consensus_LatestUnsafePayload_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LatestUnsafePayload'
@@ -302,12 +312,12 @@ func (_c *Consensus_LatestUnsafePayload_Call) Run(run func()) *Consensus_LatestU
 	return _c
 }
 
-func (_c *Consensus_LatestUnsafePayload_Call) Return(_a0 *eth.ExecutionPayloadEnvelope) *Consensus_LatestUnsafePayload_Call {
-	_c.Call.Return(_a0)
+func (_c *Consensus_LatestUnsafePayload_Call) Return(_a0 *eth.ExecutionPayloadEnvelope, _a1 error) *Consensus_LatestUnsafePayload_Call {
+	_c.Call.Return(_a0, _a1)
 	return _c
 }
 
-func (_c *Consensus_LatestUnsafePayload_Call) RunAndReturn(run func() *eth.ExecutionPayloadEnvelope) *Consensus_LatestUnsafePayload_Call {
+func (_c *Consensus_LatestUnsafePayload_Call) RunAndReturn(run func() (*eth.ExecutionPayloadEnvelope, error)) *Consensus_LatestUnsafePayload_Call {
 	_c.Call.Return(run)
 	return _c
 }
diff --git a/op-conductor/consensus/raft.go b/op-conductor/consensus/raft.go
index 37d9ac69d70a..2c3f79fe2946 100644
--- a/op-conductor/consensus/raft.go
+++ b/op-conductor/consensus/raft.go
@@ -75,7 +75,7 @@ func NewRaftConsensus(log log.Logger, serverID, serverAddr, storageDir string, b
 		return nil, errors.Wrap(err, "failed to create raft tcp transport")
 	}
 
-	fsm := &unsafeHeadTracker{}
+	fsm := NewUnsafeHeadTracker(log)
 
 	r, err := raft.NewRaft(rc, fsm, logStore, stableStore, snapshotStore, transport)
 	if err != nil {
@@ -140,8 +140,7 @@ func (rc *RaftConsensus) DemoteVoter(id string) error {
 
 // Leader implements Consensus, it returns true if it is the leader of the cluster.
 func (rc *RaftConsensus) Leader() bool {
-	_, id := rc.r.LeaderWithID()
-	return id == rc.serverID
+	return rc.r.State() == raft.Leader
 }
 
 // LeaderWithID implements Consensus, it returns the leader's server ID and address.
@@ -205,8 +204,10 @@ func (rc *RaftConsensus) Shutdown() error {
 	return nil
 }
 
-// CommitUnsafePayload implements Consensus, it commits latest unsafe payload to the cluster FSM.
+// CommitUnsafePayload implements Consensus, it commits latest unsafe payload to the cluster FSM in a strongly consistent fashion.
 func (rc *RaftConsensus) CommitUnsafePayload(payload *eth.ExecutionPayloadEnvelope) error {
+	rc.log.Debug("committing unsafe payload", "number", uint64(payload.ExecutionPayload.BlockNumber), "hash", payload.ExecutionPayload.BlockHash.Hex())
+
 	var buf bytes.Buffer
 	if _, err := payload.MarshalSSZ(&buf); err != nil {
 		return errors.Wrap(err, "failed to marshal payload envelope")
@@ -216,14 +217,18 @@ func (rc *RaftConsensus) CommitUnsafePayload(payload *eth.ExecutionPayloadEnvelo
 	if err := f.Error(); err != nil {
 		return errors.Wrap(err, "failed to apply payload envelope")
 	}
+	rc.log.Debug("unsafe payload committed", "number", uint64(payload.ExecutionPayload.BlockNumber), "hash", payload.ExecutionPayload.BlockHash.Hex())
 
 	return nil
 }
 
-// LatestUnsafePayload implements Consensus, it returns the latest unsafe payload from FSM.
-func (rc *RaftConsensus) LatestUnsafePayload() *eth.ExecutionPayloadEnvelope {
-	payload := rc.unsafeTracker.UnsafeHead()
-	return payload
+// LatestUnsafePayload implements Consensus, it returns the latest unsafe payload from FSM in a strongly consistent fashion.
+func (rc *RaftConsensus) LatestUnsafePayload() (*eth.ExecutionPayloadEnvelope, error) {
+	if err := rc.r.Barrier(defaultTimeout).Error(); err != nil {
+		return nil, errors.Wrap(err, "failed to apply barrier")
+	}
+
+	return rc.unsafeTracker.UnsafeHead(), nil
 }
 
 // ClusterMembership implements Consensus, it returns the current cluster membership configuration.
diff --git a/op-conductor/consensus/raft_fsm.go b/op-conductor/consensus/raft_fsm.go
index 7333fb8f2a44..31631d2c91e6 100644
--- a/op-conductor/consensus/raft_fsm.go
+++ b/op-conductor/consensus/raft_fsm.go
@@ -16,10 +16,17 @@ var _ raft.FSM = (*unsafeHeadTracker)(nil)
 
 // unsafeHeadTracker implements raft.FSM for storing unsafe head payload into raft consensus layer.
 type unsafeHeadTracker struct {
+	log        log.Logger
 	mtx        sync.RWMutex
 	unsafeHead *eth.ExecutionPayloadEnvelope
 }
 
+func NewUnsafeHeadTracker(log log.Logger) *unsafeHeadTracker {
+	return &unsafeHeadTracker{
+		log: log,
+	}
+}
+
 // Apply implements raft.FSM, it applies the latest change (latest unsafe head payload) to FSM.
 func (t *unsafeHeadTracker) Apply(l *raft.Log) interface{} {
 	if l.Data == nil || len(l.Data) == 0 {
@@ -33,6 +40,7 @@ func (t *unsafeHeadTracker) Apply(l *raft.Log) interface{} {
 
 	t.mtx.Lock()
 	defer t.mtx.Unlock()
+	t.log.Debug("applying new unsafe head", "number", uint64(data.ExecutionPayload.BlockNumber), "hash", data.ExecutionPayload.BlockHash.Hex())
 	if t.unsafeHead == nil || t.unsafeHead.ExecutionPayload.BlockNumber < data.ExecutionPayload.BlockNumber {
 		t.unsafeHead = data
 	}
diff --git a/op-conductor/consensus/raft_fsm_test.go b/op-conductor/consensus/raft_fsm_test.go
index 4f390d17e555..3b154ceded28 100644
--- a/op-conductor/consensus/raft_fsm_test.go
+++ b/op-conductor/consensus/raft_fsm_test.go
@@ -8,22 +8,24 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/log"
 	"github.com/hashicorp/raft"
 	"github.com/pkg/errors"
 	"github.com/stretchr/testify/require"
 
 	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
 )
 
 type Bytes32 [32]byte
 
-func createPayloadEnvelope() *eth.ExecutionPayloadEnvelope {
+func createPayloadEnvelope(blockNum uint64) *eth.ExecutionPayloadEnvelope {
 	hash := common.HexToHash("0x12345")
 	one := hexutil.Uint64(1)
 	return ð.ExecutionPayloadEnvelope{
 		ParentBeaconBlockRoot: &hash,
 		ExecutionPayload: ð.ExecutionPayload{
-			BlockNumber:   eth.Uint64Quantity(222),
+			BlockNumber:   eth.Uint64Quantity(blockNum),
 			BlockHash:     common.HexToHash("0x888"),
 			Withdrawals:   &types.Withdrawals{{Index: 1, Validator: 2, Address: common.HexToAddress("0x123"), Amount: 3}},
 			ExcessBlobGas: &one,
@@ -32,11 +34,12 @@ func createPayloadEnvelope() *eth.ExecutionPayloadEnvelope {
 }
 func TestUnsafeHeadTracker(t *testing.T) {
 	tracker := &unsafeHeadTracker{
-		unsafeHead: createPayloadEnvelope(),
+		log:        testlog.Logger(t, log.LevelDebug),
+		unsafeHead: createPayloadEnvelope(222),
 	}
 
 	t.Run("Apply", func(t *testing.T) {
-		data := createPayloadEnvelope()
+		data := createPayloadEnvelope(333)
 
 		var buf bytes.Buffer
 		_, err := data.MarshalSSZ(&buf)
@@ -44,17 +47,27 @@ func TestUnsafeHeadTracker(t *testing.T) {
 
 		l := raft.Log{Data: buf.Bytes()}
 		require.Nil(t, tracker.Apply(&l))
-		require.Equal(t, hexutil.Uint64(222), tracker.unsafeHead.ExecutionPayload.BlockNumber)
+		require.Equal(t, hexutil.Uint64(333), tracker.unsafeHead.ExecutionPayload.BlockNumber)
+	})
+
+	t.Run("Snapshot", func(t *testing.T) {
+		snapshot, err := tracker.Snapshot()
+		require.NoError(t, err)
+
+		sink := new(raft.DiscardSnapshotSink)
+
+		err = snapshot.Persist(sink)
+		require.NoError(t, err)
 	})
 
 	t.Run("Restore", func(t *testing.T) {
-		data := createPayloadEnvelope()
+		data := createPayloadEnvelope(333)
 
 		mrc, err := NewMockReadCloser(data)
 		require.NoError(t, err)
 		err = tracker.Restore(mrc)
 		require.NoError(t, err)
-		require.Equal(t, hexutil.Uint64(222), tracker.unsafeHead.ExecutionPayload.BlockNumber)
+		require.Equal(t, hexutil.Uint64(333), tracker.unsafeHead.ExecutionPayload.BlockNumber)
 	})
 }
 
diff --git a/op-conductor/consensus/raft_test.go b/op-conductor/consensus/raft_test.go
index 775e0a77847f..332bbd203e7e 100644
--- a/op-conductor/consensus/raft_test.go
+++ b/op-conductor/consensus/raft_test.go
@@ -70,6 +70,7 @@ func TestCommitAndRead(t *testing.T) {
 	// ExecutionPayloadEnvelope is expected to succeed when unmarshalling a blockV3
 	require.NoError(t, err)
 
-	unsafeHead := cons.LatestUnsafePayload()
+	unsafeHead, err := cons.LatestUnsafePayload()
+	require.NoError(t, err)
 	require.Equal(t, payload, unsafeHead)
 }
diff --git a/op-conductor/flags/flags.go b/op-conductor/flags/flags.go
index c16de5c645db..4870ba4a3ab0 100644
--- a/op-conductor/flags/flags.go
+++ b/op-conductor/flags/flags.go
@@ -64,10 +64,17 @@ var (
 		Usage:   "Interval allowed between unsafe head and now measured in seconds",
 		EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "HEALTHCHECK_UNSAFE_INTERVAL"),
 	}
+	HealthCheckSafeEnabled = &cli.BoolFlag{
+		Name:    "healthcheck.safe-enabled",
+		Usage:   "Whether to enable safe head progression checks",
+		EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "HEALTHCHECK_SAFE_ENABLED"),
+		Value:   false,
+	}
 	HealthCheckSafeInterval = &cli.Uint64Flag{
 		Name:    "healthcheck.safe-interval",
 		Usage:   "Interval between safe head progression measured in seconds",
 		EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "HEALTHCHECK_SAFE_INTERVAL"),
+		Value:   1200,
 	}
 	HealthCheckMinPeerCount = &cli.Uint64Flag{
 		Name:    "healthcheck.min-peer-count",
@@ -97,7 +104,6 @@ var requiredFlags = []cli.Flag{
 	ExecutionRPC,
 	HealthCheckInterval,
 	HealthCheckUnsafeInterval,
-	HealthCheckSafeInterval,
 	HealthCheckMinPeerCount,
 }
 
@@ -105,6 +111,8 @@ var optionalFlags = []cli.Flag{
 	Paused,
 	RPCEnableProxy,
 	RaftBootstrap,
+	HealthCheckSafeEnabled,
+	HealthCheckSafeInterval,
 }
 
 func init() {
diff --git a/op-conductor/health/monitor.go b/op-conductor/health/monitor.go
index 7a541e7b3876..829b6490bf68 100644
--- a/op-conductor/health/monitor.go
+++ b/op-conductor/health/monitor.go
@@ -8,6 +8,7 @@ import (
 
 	"github.com/ethereum/go-ethereum/log"
 
+	"github.com/ethereum-optimism/optimism/op-conductor/metrics"
 	"github.com/ethereum-optimism/optimism/op-node/p2p"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-service/dial"
@@ -34,14 +35,16 @@ type HealthMonitor interface {
 // interval is the interval between health checks measured in seconds.
 // safeInterval is the interval between safe head progress measured in seconds.
 // minPeerCount is the minimum number of peers required for the sequencer to be healthy.
-func NewSequencerHealthMonitor(log log.Logger, interval, unsafeInterval, safeInterval, minPeerCount uint64, rollupCfg *rollup.Config, node dial.RollupClientInterface, p2p p2p.API) HealthMonitor {
+func NewSequencerHealthMonitor(log log.Logger, metrics metrics.Metricer, interval, unsafeInterval, safeInterval, minPeerCount uint64, safeEnabled bool, rollupCfg *rollup.Config, node dial.RollupClientInterface, p2p p2p.API) HealthMonitor {
 	return &SequencerHealthMonitor{
 		log:            log,
+		metrics:        metrics,
 		done:           make(chan struct{}),
 		interval:       interval,
 		healthUpdateCh: make(chan error),
 		rollupCfg:      rollupCfg,
 		unsafeInterval: unsafeInterval,
+		safeEnabled:    safeEnabled,
 		safeInterval:   safeInterval,
 		minPeerCount:   minPeerCount,
 		timeProviderFn: currentTimeProvicer,
@@ -52,12 +55,14 @@ func NewSequencerHealthMonitor(log log.Logger, interval, unsafeInterval, safeInt
 
 // SequencerHealthMonitor monitors sequencer health.
 type SequencerHealthMonitor struct {
-	log  log.Logger
-	done chan struct{}
-	wg   sync.WaitGroup
+	log     log.Logger
+	metrics metrics.Metricer
+	done    chan struct{}
+	wg      sync.WaitGroup
 
 	rollupCfg          *rollup.Config
 	unsafeInterval     uint64
+	safeEnabled        bool
 	safeInterval       uint64
 	minPeerCount       uint64
 	interval           uint64
@@ -110,7 +115,9 @@ func (hm *SequencerHealthMonitor) loop() {
 		case <-hm.done:
 			return
 		case <-ticker.C:
-			hm.healthUpdateCh <- hm.healthCheck()
+			err := hm.healthCheck()
+			hm.metrics.RecordHealthCheck(err == nil, err)
+			hm.healthUpdateCh <- err
 		}
 	}
 }
@@ -132,7 +139,7 @@ func (hm *SequencerHealthMonitor) healthCheck() error {
 
 	var timeDiff, blockDiff, expectedBlocks uint64
 	if hm.lastSeenUnsafeNum != 0 {
-		timeDiff = now - hm.lastSeenUnsafeTime
+		timeDiff = calculateTimeDiff(now, hm.lastSeenUnsafeTime)
 		blockDiff = status.UnsafeL2.Number - hm.lastSeenUnsafeNum
 		// how many blocks do we expect to see, minus 1 to account for edge case with respect to time.
 		// for example, if diff = 2.001s and block time = 2s, expecting to see 1 block could potentially cause sequencer to be considered unhealthy.
@@ -154,22 +161,27 @@ func (hm *SequencerHealthMonitor) healthCheck() error {
 			"last_seen_unsafe_num", hm.lastSeenUnsafeNum,
 			"last_seen_unsafe_time", hm.lastSeenUnsafeTime,
 			"unsafe_interval", hm.unsafeInterval,
+			"time_diff", timeDiff,
+			"block_diff", blockDiff,
+			"expected_blocks", expectedBlocks,
 		)
 		return ErrSequencerNotHealthy
 	}
 
-	if now-status.UnsafeL2.Time > hm.unsafeInterval {
+	curUnsafeTimeDiff := calculateTimeDiff(now, status.UnsafeL2.Time)
+	if curUnsafeTimeDiff > hm.unsafeInterval {
 		hm.log.Error(
-			"unsafe head is not progressing as expected",
+			"unsafe head is falling behind the unsafe interval",
 			"now", now,
 			"unsafe_head_num", status.UnsafeL2.Number,
 			"unsafe_head_time", status.UnsafeL2.Time,
 			"unsafe_interval", hm.unsafeInterval,
+			"cur_unsafe_time_diff", curUnsafeTimeDiff,
 		)
 		return ErrSequencerNotHealthy
 	}
 
-	if now-status.SafeL2.Time > hm.safeInterval {
+	if hm.safeEnabled && calculateTimeDiff(now, status.SafeL2.Time) > hm.safeInterval {
 		hm.log.Error(
 			"safe head is not progressing as expected",
 			"now", now,
@@ -190,9 +202,17 @@ func (hm *SequencerHealthMonitor) healthCheck() error {
 		return ErrSequencerNotHealthy
 	}
 
+	hm.log.Info("sequencer is healthy")
 	return nil
 }
 
+func calculateTimeDiff(now, then uint64) uint64 {
+	if now < then {
+		return 0
+	}
+	return now - then
+}
+
 func currentTimeProvicer() uint64 {
 	return uint64(time.Now().Unix())
 }
diff --git a/op-conductor/health/monitor_test.go b/op-conductor/health/monitor_test.go
index 0384e5b4b0b5..1533e98a360c 100644
--- a/op-conductor/health/monitor_test.go
+++ b/op-conductor/health/monitor_test.go
@@ -8,6 +8,7 @@ import (
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/suite"
 
+	"github.com/ethereum-optimism/optimism/op-conductor/metrics"
 	"github.com/ethereum-optimism/optimism/op-node/p2p"
 	p2pMocks "github.com/ethereum-optimism/optimism/op-node/p2p/mocks"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
@@ -58,10 +59,12 @@ func (s *HealthMonitorTestSuite) SetupMonitor(
 		log:            s.log,
 		done:           make(chan struct{}),
 		interval:       s.interval,
+		metrics:        &metrics.NoopMetricsImpl{},
 		healthUpdateCh: make(chan error),
 		rollupCfg:      s.rollupCfg,
 		unsafeInterval: unsafeInterval,
 		safeInterval:   safeInterval,
+		safeEnabled:    true,
 		minPeerCount:   s.minPeerCount,
 		timeProviderFn: tp.Now,
 		node:           mockRollupClient,
@@ -102,7 +105,7 @@ func (s *HealthMonitorTestSuite) TestUnhealthyUnsafeHeadNotProgressing() {
 
 	rc := &testutils.MockRollupClient{}
 	ss1 := mockSyncStatus(now, 5, now-8, 1)
-	for i := 0; i < 6; i++ {
+	for i := 0; i < 5; i++ {
 		rc.ExpectSyncStatus(ss1, nil)
 	}
 
@@ -147,6 +150,13 @@ func (s *HealthMonitorTestSuite) TestUnhealthySafeHeadNotProgressing() {
 		}
 	}
 
+	// test that the safeEnabled flag works
+	monitor.safeEnabled = false
+	rc.ExpectSyncStatus(mockSyncStatus(now+6, 4, now, 1), nil)
+	rc.ExpectSyncStatus(mockSyncStatus(now+6, 4, now, 1), nil)
+	healthy := <-healthUpdateCh
+	s.Nil(healthy)
+
 	s.NoError(monitor.Stop())
 }
 
@@ -160,7 +170,8 @@ func (s *HealthMonitorTestSuite) TestHealthyWithUnsafeLag() {
 	rc.ExpectSyncStatus(mockSyncStatus(now-10, 1, now, 1), nil)
 	rc.ExpectSyncStatus(mockSyncStatus(now-10, 1, now, 1), nil)
 	rc.ExpectSyncStatus(mockSyncStatus(now-8, 2, now, 1), nil)
-	rc.ExpectSyncStatus(mockSyncStatus(now-8, 2, now, 1), nil)
+	// in this case now time is behind unsafe head time, this should still be considered healthy.
+	rc.ExpectSyncStatus(mockSyncStatus(now+5, 2, now, 1), nil)
 
 	monitor := s.SetupMonitor(now, 60, 60, rc, nil)
 	healthUpdateCh := monitor.Subscribe()
@@ -186,6 +197,11 @@ func (s *HealthMonitorTestSuite) TestHealthyWithUnsafeLag() {
 	s.Equal(lastSeenUnsafeTime+2, monitor.lastSeenUnsafeTime)
 	s.Equal(uint64(2), monitor.lastSeenUnsafeNum)
 
+	healthy = <-healthUpdateCh
+	s.Nil(healthy)
+	s.Equal(lastSeenUnsafeTime+2, monitor.lastSeenUnsafeTime)
+	s.Equal(uint64(2), monitor.lastSeenUnsafeNum)
+
 	s.NoError(monitor.Stop())
 }
 
diff --git a/op-conductor/metrics/metrics.go b/op-conductor/metrics/metrics.go
new file mode 100644
index 000000000000..4ac5e6847433
--- /dev/null
+++ b/op-conductor/metrics/metrics.go
@@ -0,0 +1,157 @@
+package metrics
+
+import (
+	"strconv"
+
+	"github.com/ethereum-optimism/optimism/op-service/httputil"
+	opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
+	"github.com/prometheus/client_golang/prometheus"
+)
+
+const Namespace = "op_conductor"
+
+type Metricer interface {
+	RecordInfo(version string)
+	RecordUp()
+	RecordStateChange(leader bool, healthy bool, active bool)
+	RecordLeaderTransfer(success bool)
+	RecordStartSequencer(success bool)
+	RecordStopSequencer(success bool)
+	RecordHealthCheck(success bool, err error)
+	RecordLoopExecutionTime(duration float64)
+}
+
+// Metrics implementation must implement RegistryMetricer to allow the metrics server to work.
+var _ opmetrics.RegistryMetricer = (*Metrics)(nil)
+
+type Metrics struct {
+	ns       string
+	registry *prometheus.Registry
+	factory  opmetrics.Factory
+
+	info prometheus.GaugeVec
+	up   prometheus.Gauge
+
+	healthChecks    *prometheus.CounterVec
+	leaderTransfers *prometheus.CounterVec
+	sequencerStarts *prometheus.CounterVec
+	sequencerStops  *prometheus.CounterVec
+	stateChanges    *prometheus.CounterVec
+
+	loopExecutionTime prometheus.Histogram
+}
+
+func (m *Metrics) Registry() *prometheus.Registry {
+	return m.registry
+}
+
+var _ Metricer = (*Metrics)(nil)
+
+func NewMetrics() *Metrics {
+	registry := opmetrics.NewRegistry()
+	factory := opmetrics.With(registry)
+
+	return &Metrics{
+		ns:       Namespace,
+		registry: registry,
+		factory:  factory,
+
+		info: *factory.NewGaugeVec(prometheus.GaugeOpts{
+			Namespace: Namespace,
+			Name:      "info",
+			Help:      "Pseudo-metric tracking version and config info",
+		}, []string{
+			"version",
+		}),
+		up: factory.NewGauge(prometheus.GaugeOpts{
+			Namespace: Namespace,
+			Name:      "up",
+			Help:      "1 if the op-conductor has finished starting up",
+		}),
+		healthChecks: factory.NewCounterVec(prometheus.CounterOpts{
+			Namespace: Namespace,
+			Name:      "healthchecks_count",
+			Help:      "Number of healthchecks",
+		}, []string{"success", "error"}),
+		leaderTransfers: factory.NewCounterVec(prometheus.CounterOpts{
+			Namespace: Namespace,
+			Name:      "leader_transfers_count",
+			Help:      "Number of leader transfers",
+		}, []string{"success"}),
+		sequencerStarts: factory.NewCounterVec(prometheus.CounterOpts{
+			Namespace: Namespace,
+			Name:      "sequencer_starts_count",
+			Help:      "Number of sequencer starts",
+		}, []string{"success"}),
+		sequencerStops: factory.NewCounterVec(prometheus.CounterOpts{
+			Namespace: Namespace,
+			Name:      "sequencer_stops_count",
+			Help:      "Number of sequencer stops",
+		}, []string{"success"}),
+		stateChanges: factory.NewCounterVec(prometheus.CounterOpts{
+			Namespace: Namespace,
+			Name:      "state_changes_count",
+			Help:      "Number of state changes",
+		}, []string{
+			"leader",
+			"healthy",
+			"active",
+		}),
+		loopExecutionTime: factory.NewHistogram(prometheus.HistogramOpts{
+			Namespace: Namespace,
+			Name:      "loop_execution_time",
+			Help:      "Time (in seconds) to execute conductor loop iteration",
+			Buckets:   []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10},
+		}),
+	}
+}
+
+func (m *Metrics) Start(host string, port int) (*httputil.HTTPServer, error) {
+	return opmetrics.StartServer(m.registry, host, port)
+}
+
+// RecordInfo sets a pseudo-metric that contains versioning and
+// config info for the op-proposer.
+func (m *Metrics) RecordInfo(version string) {
+	m.info.WithLabelValues(version).Set(1)
+}
+
+// RecordUp sets the up metric to 1.
+func (m *Metrics) RecordUp() {
+	prometheus.MustRegister()
+	m.up.Set(1)
+}
+
+// RecordHealthCheck increments the healthChecks counter.
+func (m *Metrics) RecordHealthCheck(success bool, err error) {
+	errStr := ""
+	if err != nil {
+		errStr = err.Error()
+	}
+	m.healthChecks.WithLabelValues(strconv.FormatBool(success), errStr).Inc()
+}
+
+// RecordLeaderTransfer increments the leaderTransfers counter.
+func (m *Metrics) RecordLeaderTransfer(success bool) {
+	m.leaderTransfers.WithLabelValues(strconv.FormatBool(success)).Inc()
+}
+
+// RecordStateChange increments the stateChanges counter.
+func (m *Metrics) RecordStateChange(leader bool, healthy bool, active bool) {
+	m.stateChanges.WithLabelValues(strconv.FormatBool(leader), strconv.FormatBool(healthy), strconv.FormatBool(active)).Inc()
+}
+
+// RecordStartSequencer increments the sequencerStarts counter.
+func (m *Metrics) RecordStartSequencer(success bool) {
+	m.sequencerStarts.WithLabelValues(strconv.FormatBool(success)).Inc()
+}
+
+// RecordStopSequencer increments the sequencerStops counter.
+func (m *Metrics) RecordStopSequencer(success bool) {
+	m.sequencerStops.WithLabelValues(strconv.FormatBool(success)).Inc()
+}
+
+// RecordLoopExecutionTime records the time it took to execute the conductor loop.
+func (m *Metrics) RecordLoopExecutionTime(duration float64) {
+	m.loopExecutionTime.Observe(duration)
+}
diff --git a/op-conductor/metrics/noop.go b/op-conductor/metrics/noop.go
new file mode 100644
index 000000000000..c5c2ffc70d4d
--- /dev/null
+++ b/op-conductor/metrics/noop.go
@@ -0,0 +1,14 @@
+package metrics
+
+type NoopMetricsImpl struct{}
+
+var NoopMetrics Metricer = new(NoopMetricsImpl)
+
+func (*NoopMetricsImpl) RecordInfo(version string)                                {}
+func (*NoopMetricsImpl) RecordUp()                                                {}
+func (*NoopMetricsImpl) RecordStateChange(leader bool, healthy bool, active bool) {}
+func (*NoopMetricsImpl) RecordLeaderTransfer(success bool)                        {}
+func (*NoopMetricsImpl) RecordStartSequencer(success bool)                        {}
+func (*NoopMetricsImpl) RecordStopSequencer(success bool)                         {}
+func (*NoopMetricsImpl) RecordHealthCheck(success bool, err error)                {}
+func (*NoopMetricsImpl) RecordLoopExecutionTime(duration float64)                 {}
diff --git a/op-conductor/rpc/api.go b/op-conductor/rpc/api.go
index 4d85d6fe17fd..b5d954f5ceb0 100644
--- a/op-conductor/rpc/api.go
+++ b/op-conductor/rpc/api.go
@@ -19,6 +19,10 @@ type API interface {
 	Pause(ctx context.Context) error
 	// Resume resumes op-conductor.
 	Resume(ctx context.Context) error
+	// Paused returns true if op-conductor is paused.
+	Paused(ctx context.Context) (bool, error)
+	// Stopped returns true if op-conductor is stopped.
+	Stopped(ctx context.Context) (bool, error)
 	// SequencerHealthy returns true if the sequencer is healthy.
 	SequencerHealthy(ctx context.Context) (bool, error)
 
@@ -41,9 +45,9 @@ type API interface {
 	ClusterMembership(ctx context.Context) ([]*consensus.ServerInfo, error)
 
 	// APIs called by op-node
-	// Active returns true if op-conductor is active.
+	// Active returns true if op-conductor is active (not paused or stopped).
 	Active(ctx context.Context) (bool, error)
-	// CommitUnsafePayload commits a unsafe payload (latest head) to the consensus layer.
+	// CommitUnsafePayload commits an unsafe payload (latest head) to the consensus layer.
 	CommitUnsafePayload(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) error
 }
 
@@ -56,7 +60,7 @@ type ExecutionProxyAPI interface {
 // NodeProxyAPI defines the methods proxied to the node rpc backend
 // This should include all methods that are called by op-batcher or op-proposer
 type NodeProxyAPI interface {
-	OutputAtBlock(ctx context.Context, blockNum uint64) (*eth.OutputResponse, error)
+	OutputAtBlock(ctx context.Context, blockNumString string) (*eth.OutputResponse, error)
 	SyncStatus(ctx context.Context) (*eth.SyncStatus, error)
 	RollupConfig(ctx context.Context) (*rollup.Config, error)
 }
diff --git a/op-conductor/rpc/backend.go b/op-conductor/rpc/backend.go
index 64c2635da9c6..96fab2c90d28 100644
--- a/op-conductor/rpc/backend.go
+++ b/op-conductor/rpc/backend.go
@@ -45,6 +45,16 @@ func NewAPIBackend(log log.Logger, con conductor) *APIBackend {
 
 var _ API = (*APIBackend)(nil)
 
+// Paused implements API.
+func (api *APIBackend) Paused(ctx context.Context) (bool, error) {
+	return api.con.Paused(), nil
+}
+
+// Stopped implements API.
+func (api *APIBackend) Stopped(ctx context.Context) (bool, error) {
+	return api.con.Stopped(), nil
+}
+
 // Active implements API.
 func (api *APIBackend) Active(_ context.Context) (bool, error) {
 	return !api.con.Stopped() && !api.con.Paused(), nil
diff --git a/op-conductor/rpc/client.go b/op-conductor/rpc/client.go
index 6a20b02a4215..f8aac005cdd7 100644
--- a/op-conductor/rpc/client.go
+++ b/op-conductor/rpc/client.go
@@ -27,6 +27,20 @@ func prefixRPC(method string) string {
 	return RPCNamespace + "_" + method
 }
 
+// Paused implements API.
+func (c *APIClient) Paused(ctx context.Context) (bool, error) {
+	var paused bool
+	err := c.c.CallContext(ctx, &paused, prefixRPC("paused"))
+	return paused, err
+}
+
+// Stopped implements API.
+func (c *APIClient) Stopped(ctx context.Context) (bool, error) {
+	var stopped bool
+	err := c.c.CallContext(ctx, &stopped, prefixRPC("stopped"))
+	return stopped, err
+}
+
 // Active implements API.
 func (c *APIClient) Active(ctx context.Context) (bool, error) {
 	var active bool
diff --git a/op-conductor/rpc/node_proxy.go b/op-conductor/rpc/node_proxy.go
index 786167812b11..0aedb2b1f0b4 100644
--- a/op-conductor/rpc/node_proxy.go
+++ b/op-conductor/rpc/node_proxy.go
@@ -2,7 +2,9 @@ package rpc
 
 import (
 	"context"
+	"fmt"
 
+	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/log"
 
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
@@ -40,7 +42,11 @@ func (api *NodeProxyBackend) SyncStatus(ctx context.Context) (*eth.SyncStatus, e
 	return status, err
 }
 
-func (api *NodeProxyBackend) OutputAtBlock(ctx context.Context, blockNum uint64) (*eth.OutputResponse, error) {
+func (api *NodeProxyBackend) OutputAtBlock(ctx context.Context, blockNumString string) (*eth.OutputResponse, error) {
+	blockNum, err := hexutil.DecodeUint64(blockNumString)
+	if err != nil {
+		return nil, fmt.Errorf("failed to decode block number: %w", err)
+	}
 	output, err := api.client.OutputAtBlock(ctx, blockNum)
 	if err != nil {
 		return nil, err
diff --git a/op-dispute-mon/Makefile b/op-dispute-mon/Makefile
index e7b8edfa0d41..479f20ae7555 100644
--- a/op-dispute-mon/Makefile
+++ b/op-dispute-mon/Makefile
@@ -1,6 +1,6 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+VERSION ?= v0.0.0
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
diff --git a/op-dispute-mon/bindings/faultdisputegame.go b/op-dispute-mon/bindings/faultdisputegame.go
new file mode 100644
index 000000000000..d43287d3da6a
--- /dev/null
+++ b/op-dispute-mon/bindings/faultdisputegame.go
@@ -0,0 +1,1877 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// FaultDisputeGameMetaData contains all meta data concerning the FaultDisputeGame contract.
+var FaultDisputeGameMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint32\"},{\"internalType\":\"Claim\",\"name\":\"_absolutePrestate\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_maxGameDepth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_splitDepth\",\"type\":\"uint256\"},{\"internalType\":\"Duration\",\"name\":\"_clockExtension\",\"type\":\"uint64\"},{\"internalType\":\"Duration\",\"name\":\"_maxClockDuration\",\"type\":\"uint64\"},{\"internalType\":\"contractIBigStepper\",\"name\":\"_vm\",\"type\":\"address\"},{\"internalType\":\"contractIDelayedWETH\",\"name\":\"_weth\",\"type\":\"address\"},{\"internalType\":\"contractIAnchorStateRegistry\",\"name\":\"_anchorStateRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_l2ChainId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"absolutePrestate\",\"outputs\":[{\"internalType\":\"Claim\",\"name\":\"absolutePrestate_\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ident\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_execLeafIdx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_partOffset\",\"type\":\"uint256\"}],\"name\":\"addLocalData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"anchorStateRegistry\",\"outputs\":[{\"internalType\":\"contractIAnchorStateRegistry\",\"name\":\"registry_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Claim\",\"name\":\"_disputed\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_parentIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"}],\"name\":\"attack\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structTypes.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_headerRLP\",\"type\":\"bytes\"}],\"name\":\"challengeRootL2Block\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"}],\"name\":\"claimCredit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claimData\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"parentIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"counteredBy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"bond\",\"type\":\"uint128\"},{\"internalType\":\"Claim\",\"name\":\"claim\",\"type\":\"bytes32\"},{\"internalType\":\"Position\",\"name\":\"position\",\"type\":\"uint128\"},{\"internalType\":\"Clock\",\"name\":\"clock\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimDataLen\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"len_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Hash\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"claims\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clockExtension\",\"outputs\":[{\"internalType\":\"Duration\",\"name\":\"clockExtension_\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createdAt\",\"outputs\":[{\"internalType\":\"Timestamp\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"credit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Claim\",\"name\":\"_disputed\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_parentIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"}],\"name\":\"defend\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"extraData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"extraData_\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameCreator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"creator_\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameData\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType_\",\"type\":\"uint32\"},{\"internalType\":\"Claim\",\"name\":\"rootClaim_\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"extraData_\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameType\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType_\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"}],\"name\":\"getChallengerDuration\",\"outputs\":[{\"internalType\":\"Duration\",\"name\":\"duration_\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"}],\"name\":\"getNumToResolve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"numRemainingChildren_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Position\",\"name\":\"_position\",\"type\":\"uint128\"}],\"name\":\"getRequiredBond\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requiredBond_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1Head\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"l1Head_\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"l2BlockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BlockNumberChallenged\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BlockNumberChallenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2ChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"l2ChainId_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxClockDuration\",\"outputs\":[{\"internalType\":\"Duration\",\"name\":\"maxClockDuration_\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxGameDepth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"maxGameDepth_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Claim\",\"name\":\"_disputed\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_challengeIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_isAttack\",\"type\":\"bool\"}],\"name\":\"move\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"resolutionCheckpoints\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"initialCheckpointComplete\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"subgameIndex\",\"type\":\"uint32\"},{\"internalType\":\"Position\",\"name\":\"leftmostPosition\",\"type\":\"uint128\"},{\"internalType\":\"address\",\"name\":\"counteredBy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"enumGameStatus\",\"name\":\"status_\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_numToResolve\",\"type\":\"uint256\"}],\"name\":\"resolveClaim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resolvedAt\",\"outputs\":[{\"internalType\":\"Timestamp\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"resolvedSubgames\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rootClaim\",\"outputs\":[{\"internalType\":\"Claim\",\"name\":\"rootClaim_\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"splitDepth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"splitDepth_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startingBlockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingOutputRoot\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"root\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingRootHash\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"startingRootHash_\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"status\",\"outputs\":[{\"internalType\":\"enumGameStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_isAttack\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_stateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"}],\"name\":\"step\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"subgames\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vm\",\"outputs\":[{\"internalType\":\"contractIBigStepper\",\"name\":\"vm_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weth\",\"outputs\":[{\"internalType\":\"contractIDelayedWETH\",\"name\":\"weth_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"parentIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"Claim\",\"name\":\"claim\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"}],\"name\":\"Move\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enumGameStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"Resolved\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AnchorRootNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMatches\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotDefendRootClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAboveSplit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAlreadyResolved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClockNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClockTimeExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContentLengthMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateStep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyItem\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameDepthExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameNotInProgress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectBondAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClockExtension\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDataRemainder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDisputedClaimIndex\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeader\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidLocalIdent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidOutputRootProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidParent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPrestate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSplitDepth\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2BlockNumberChallenged\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxDepthTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCreditToClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfOrderResolution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedList\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"Claim\",\"name\":\"rootClaim\",\"type\":\"bytes32\"}],\"name\":\"UnexpectedRootClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedString\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValidStep\",\"type\":\"error\"}]",
+}
+
+// FaultDisputeGameABI is the input ABI used to generate the binding from.
+// Deprecated: Use FaultDisputeGameMetaData.ABI instead.
+var FaultDisputeGameABI = FaultDisputeGameMetaData.ABI
+
+// FaultDisputeGame is an auto generated Go binding around an Ethereum contract.
+type FaultDisputeGame struct {
+	FaultDisputeGameCaller     // Read-only binding to the contract
+	FaultDisputeGameTransactor // Write-only binding to the contract
+	FaultDisputeGameFilterer   // Log filterer for contract events
+}
+
+// FaultDisputeGameCaller is an auto generated read-only Go binding around an Ethereum contract.
+type FaultDisputeGameCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// FaultDisputeGameTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type FaultDisputeGameTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// FaultDisputeGameFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type FaultDisputeGameFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// FaultDisputeGameSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type FaultDisputeGameSession struct {
+	Contract     *FaultDisputeGame // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// FaultDisputeGameCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type FaultDisputeGameCallerSession struct {
+	Contract *FaultDisputeGameCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts           // Call options to use throughout this session
+}
+
+// FaultDisputeGameTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type FaultDisputeGameTransactorSession struct {
+	Contract     *FaultDisputeGameTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
+}
+
+// FaultDisputeGameRaw is an auto generated low-level Go binding around an Ethereum contract.
+type FaultDisputeGameRaw struct {
+	Contract *FaultDisputeGame // Generic contract binding to access the raw methods on
+}
+
+// FaultDisputeGameCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type FaultDisputeGameCallerRaw struct {
+	Contract *FaultDisputeGameCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// FaultDisputeGameTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type FaultDisputeGameTransactorRaw struct {
+	Contract *FaultDisputeGameTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewFaultDisputeGame creates a new instance of FaultDisputeGame, bound to a specific deployed contract.
+func NewFaultDisputeGame(address common.Address, backend bind.ContractBackend) (*FaultDisputeGame, error) {
+	contract, err := bindFaultDisputeGame(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGame{FaultDisputeGameCaller: FaultDisputeGameCaller{contract: contract}, FaultDisputeGameTransactor: FaultDisputeGameTransactor{contract: contract}, FaultDisputeGameFilterer: FaultDisputeGameFilterer{contract: contract}}, nil
+}
+
+// NewFaultDisputeGameCaller creates a new read-only instance of FaultDisputeGame, bound to a specific deployed contract.
+func NewFaultDisputeGameCaller(address common.Address, caller bind.ContractCaller) (*FaultDisputeGameCaller, error) {
+	contract, err := bindFaultDisputeGame(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGameCaller{contract: contract}, nil
+}
+
+// NewFaultDisputeGameTransactor creates a new write-only instance of FaultDisputeGame, bound to a specific deployed contract.
+func NewFaultDisputeGameTransactor(address common.Address, transactor bind.ContractTransactor) (*FaultDisputeGameTransactor, error) {
+	contract, err := bindFaultDisputeGame(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGameTransactor{contract: contract}, nil
+}
+
+// NewFaultDisputeGameFilterer creates a new log filterer instance of FaultDisputeGame, bound to a specific deployed contract.
+func NewFaultDisputeGameFilterer(address common.Address, filterer bind.ContractFilterer) (*FaultDisputeGameFilterer, error) {
+	contract, err := bindFaultDisputeGame(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGameFilterer{contract: contract}, nil
+}
+
+// bindFaultDisputeGame binds a generic wrapper to an already deployed contract.
+func bindFaultDisputeGame(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(FaultDisputeGameABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_FaultDisputeGame *FaultDisputeGameRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _FaultDisputeGame.Contract.FaultDisputeGameCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_FaultDisputeGame *FaultDisputeGameRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.FaultDisputeGameTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_FaultDisputeGame *FaultDisputeGameRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.FaultDisputeGameTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_FaultDisputeGame *FaultDisputeGameCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _FaultDisputeGame.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_FaultDisputeGame *FaultDisputeGameTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_FaultDisputeGame *FaultDisputeGameTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.contract.Transact(opts, method, params...)
+}
+
+// AbsolutePrestate is a free data retrieval call binding the contract method 0x8d450a95.
+//
+// Solidity: function absolutePrestate() view returns(bytes32 absolutePrestate_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) AbsolutePrestate(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "absolutePrestate")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// AbsolutePrestate is a free data retrieval call binding the contract method 0x8d450a95.
+//
+// Solidity: function absolutePrestate() view returns(bytes32 absolutePrestate_)
+func (_FaultDisputeGame *FaultDisputeGameSession) AbsolutePrestate() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.AbsolutePrestate(&_FaultDisputeGame.CallOpts)
+}
+
+// AbsolutePrestate is a free data retrieval call binding the contract method 0x8d450a95.
+//
+// Solidity: function absolutePrestate() view returns(bytes32 absolutePrestate_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) AbsolutePrestate() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.AbsolutePrestate(&_FaultDisputeGame.CallOpts)
+}
+
+// AnchorStateRegistry is a free data retrieval call binding the contract method 0x5c0cba33.
+//
+// Solidity: function anchorStateRegistry() view returns(address registry_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) AnchorStateRegistry(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "anchorStateRegistry")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// AnchorStateRegistry is a free data retrieval call binding the contract method 0x5c0cba33.
+//
+// Solidity: function anchorStateRegistry() view returns(address registry_)
+func (_FaultDisputeGame *FaultDisputeGameSession) AnchorStateRegistry() (common.Address, error) {
+	return _FaultDisputeGame.Contract.AnchorStateRegistry(&_FaultDisputeGame.CallOpts)
+}
+
+// AnchorStateRegistry is a free data retrieval call binding the contract method 0x5c0cba33.
+//
+// Solidity: function anchorStateRegistry() view returns(address registry_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) AnchorStateRegistry() (common.Address, error) {
+	return _FaultDisputeGame.Contract.AnchorStateRegistry(&_FaultDisputeGame.CallOpts)
+}
+
+// ClaimData is a free data retrieval call binding the contract method 0xc6f0308c.
+//
+// Solidity: function claimData(uint256 ) view returns(uint32 parentIndex, address counteredBy, address claimant, uint128 bond, bytes32 claim, uint128 position, uint128 clock)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ClaimData(opts *bind.CallOpts, arg0 *big.Int) (struct {
+	ParentIndex uint32
+	CounteredBy common.Address
+	Claimant    common.Address
+	Bond        *big.Int
+	Claim       [32]byte
+	Position    *big.Int
+	Clock       *big.Int
+}, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "claimData", arg0)
+
+	outstruct := new(struct {
+		ParentIndex uint32
+		CounteredBy common.Address
+		Claimant    common.Address
+		Bond        *big.Int
+		Claim       [32]byte
+		Position    *big.Int
+		Clock       *big.Int
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.ParentIndex = *abi.ConvertType(out[0], new(uint32)).(*uint32)
+	outstruct.CounteredBy = *abi.ConvertType(out[1], new(common.Address)).(*common.Address)
+	outstruct.Claimant = *abi.ConvertType(out[2], new(common.Address)).(*common.Address)
+	outstruct.Bond = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int)
+	outstruct.Claim = *abi.ConvertType(out[4], new([32]byte)).(*[32]byte)
+	outstruct.Position = *abi.ConvertType(out[5], new(*big.Int)).(**big.Int)
+	outstruct.Clock = *abi.ConvertType(out[6], new(*big.Int)).(**big.Int)
+
+	return *outstruct, err
+
+}
+
+// ClaimData is a free data retrieval call binding the contract method 0xc6f0308c.
+//
+// Solidity: function claimData(uint256 ) view returns(uint32 parentIndex, address counteredBy, address claimant, uint128 bond, bytes32 claim, uint128 position, uint128 clock)
+func (_FaultDisputeGame *FaultDisputeGameSession) ClaimData(arg0 *big.Int) (struct {
+	ParentIndex uint32
+	CounteredBy common.Address
+	Claimant    common.Address
+	Bond        *big.Int
+	Claim       [32]byte
+	Position    *big.Int
+	Clock       *big.Int
+}, error) {
+	return _FaultDisputeGame.Contract.ClaimData(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ClaimData is a free data retrieval call binding the contract method 0xc6f0308c.
+//
+// Solidity: function claimData(uint256 ) view returns(uint32 parentIndex, address counteredBy, address claimant, uint128 bond, bytes32 claim, uint128 position, uint128 clock)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ClaimData(arg0 *big.Int) (struct {
+	ParentIndex uint32
+	CounteredBy common.Address
+	Claimant    common.Address
+	Bond        *big.Int
+	Claim       [32]byte
+	Position    *big.Int
+	Clock       *big.Int
+}, error) {
+	return _FaultDisputeGame.Contract.ClaimData(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ClaimDataLen is a free data retrieval call binding the contract method 0x8980e0cc.
+//
+// Solidity: function claimDataLen() view returns(uint256 len_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ClaimDataLen(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "claimDataLen")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// ClaimDataLen is a free data retrieval call binding the contract method 0x8980e0cc.
+//
+// Solidity: function claimDataLen() view returns(uint256 len_)
+func (_FaultDisputeGame *FaultDisputeGameSession) ClaimDataLen() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.ClaimDataLen(&_FaultDisputeGame.CallOpts)
+}
+
+// ClaimDataLen is a free data retrieval call binding the contract method 0x8980e0cc.
+//
+// Solidity: function claimDataLen() view returns(uint256 len_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ClaimDataLen() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.ClaimDataLen(&_FaultDisputeGame.CallOpts)
+}
+
+// Claims is a free data retrieval call binding the contract method 0xeff0f592.
+//
+// Solidity: function claims(bytes32 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Claims(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "claims", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Claims is a free data retrieval call binding the contract method 0xeff0f592.
+//
+// Solidity: function claims(bytes32 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameSession) Claims(arg0 [32]byte) (bool, error) {
+	return _FaultDisputeGame.Contract.Claims(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// Claims is a free data retrieval call binding the contract method 0xeff0f592.
+//
+// Solidity: function claims(bytes32 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Claims(arg0 [32]byte) (bool, error) {
+	return _FaultDisputeGame.Contract.Claims(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ClockExtension is a free data retrieval call binding the contract method 0x6b6716c0.
+//
+// Solidity: function clockExtension() view returns(uint64 clockExtension_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ClockExtension(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "clockExtension")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// ClockExtension is a free data retrieval call binding the contract method 0x6b6716c0.
+//
+// Solidity: function clockExtension() view returns(uint64 clockExtension_)
+func (_FaultDisputeGame *FaultDisputeGameSession) ClockExtension() (uint64, error) {
+	return _FaultDisputeGame.Contract.ClockExtension(&_FaultDisputeGame.CallOpts)
+}
+
+// ClockExtension is a free data retrieval call binding the contract method 0x6b6716c0.
+//
+// Solidity: function clockExtension() view returns(uint64 clockExtension_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ClockExtension() (uint64, error) {
+	return _FaultDisputeGame.Contract.ClockExtension(&_FaultDisputeGame.CallOpts)
+}
+
+// CreatedAt is a free data retrieval call binding the contract method 0xcf09e0d0.
+//
+// Solidity: function createdAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameCaller) CreatedAt(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "createdAt")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// CreatedAt is a free data retrieval call binding the contract method 0xcf09e0d0.
+//
+// Solidity: function createdAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameSession) CreatedAt() (uint64, error) {
+	return _FaultDisputeGame.Contract.CreatedAt(&_FaultDisputeGame.CallOpts)
+}
+
+// CreatedAt is a free data retrieval call binding the contract method 0xcf09e0d0.
+//
+// Solidity: function createdAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) CreatedAt() (uint64, error) {
+	return _FaultDisputeGame.Contract.CreatedAt(&_FaultDisputeGame.CallOpts)
+}
+
+// Credit is a free data retrieval call binding the contract method 0xd5d44d80.
+//
+// Solidity: function credit(address ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Credit(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "credit", arg0)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Credit is a free data retrieval call binding the contract method 0xd5d44d80.
+//
+// Solidity: function credit(address ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameSession) Credit(arg0 common.Address) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.Credit(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// Credit is a free data retrieval call binding the contract method 0xd5d44d80.
+//
+// Solidity: function credit(address ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Credit(arg0 common.Address) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.Credit(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ExtraData is a free data retrieval call binding the contract method 0x609d3334.
+//
+// Solidity: function extraData() pure returns(bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ExtraData(opts *bind.CallOpts) ([]byte, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "extraData")
+
+	if err != nil {
+		return *new([]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
+
+	return out0, err
+
+}
+
+// ExtraData is a free data retrieval call binding the contract method 0x609d3334.
+//
+// Solidity: function extraData() pure returns(bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameSession) ExtraData() ([]byte, error) {
+	return _FaultDisputeGame.Contract.ExtraData(&_FaultDisputeGame.CallOpts)
+}
+
+// ExtraData is a free data retrieval call binding the contract method 0x609d3334.
+//
+// Solidity: function extraData() pure returns(bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ExtraData() ([]byte, error) {
+	return _FaultDisputeGame.Contract.ExtraData(&_FaultDisputeGame.CallOpts)
+}
+
+// GameCreator is a free data retrieval call binding the contract method 0x37b1b229.
+//
+// Solidity: function gameCreator() pure returns(address creator_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GameCreator(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "gameCreator")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// GameCreator is a free data retrieval call binding the contract method 0x37b1b229.
+//
+// Solidity: function gameCreator() pure returns(address creator_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GameCreator() (common.Address, error) {
+	return _FaultDisputeGame.Contract.GameCreator(&_FaultDisputeGame.CallOpts)
+}
+
+// GameCreator is a free data retrieval call binding the contract method 0x37b1b229.
+//
+// Solidity: function gameCreator() pure returns(address creator_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GameCreator() (common.Address, error) {
+	return _FaultDisputeGame.Contract.GameCreator(&_FaultDisputeGame.CallOpts)
+}
+
+// GameData is a free data retrieval call binding the contract method 0xfa24f743.
+//
+// Solidity: function gameData() view returns(uint32 gameType_, bytes32 rootClaim_, bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GameData(opts *bind.CallOpts) (struct {
+	GameType  uint32
+	RootClaim [32]byte
+	ExtraData []byte
+}, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "gameData")
+
+	outstruct := new(struct {
+		GameType  uint32
+		RootClaim [32]byte
+		ExtraData []byte
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.GameType = *abi.ConvertType(out[0], new(uint32)).(*uint32)
+	outstruct.RootClaim = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte)
+	outstruct.ExtraData = *abi.ConvertType(out[2], new([]byte)).(*[]byte)
+
+	return *outstruct, err
+
+}
+
+// GameData is a free data retrieval call binding the contract method 0xfa24f743.
+//
+// Solidity: function gameData() view returns(uint32 gameType_, bytes32 rootClaim_, bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GameData() (struct {
+	GameType  uint32
+	RootClaim [32]byte
+	ExtraData []byte
+}, error) {
+	return _FaultDisputeGame.Contract.GameData(&_FaultDisputeGame.CallOpts)
+}
+
+// GameData is a free data retrieval call binding the contract method 0xfa24f743.
+//
+// Solidity: function gameData() view returns(uint32 gameType_, bytes32 rootClaim_, bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GameData() (struct {
+	GameType  uint32
+	RootClaim [32]byte
+	ExtraData []byte
+}, error) {
+	return _FaultDisputeGame.Contract.GameData(&_FaultDisputeGame.CallOpts)
+}
+
+// GameType is a free data retrieval call binding the contract method 0xbbdc02db.
+//
+// Solidity: function gameType() view returns(uint32 gameType_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GameType(opts *bind.CallOpts) (uint32, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "gameType")
+
+	if err != nil {
+		return *new(uint32), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+	return out0, err
+
+}
+
+// GameType is a free data retrieval call binding the contract method 0xbbdc02db.
+//
+// Solidity: function gameType() view returns(uint32 gameType_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GameType() (uint32, error) {
+	return _FaultDisputeGame.Contract.GameType(&_FaultDisputeGame.CallOpts)
+}
+
+// GameType is a free data retrieval call binding the contract method 0xbbdc02db.
+//
+// Solidity: function gameType() view returns(uint32 gameType_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GameType() (uint32, error) {
+	return _FaultDisputeGame.Contract.GameType(&_FaultDisputeGame.CallOpts)
+}
+
+// GetChallengerDuration is a free data retrieval call binding the contract method 0xbd8da956.
+//
+// Solidity: function getChallengerDuration(uint256 _claimIndex) view returns(uint64 duration_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GetChallengerDuration(opts *bind.CallOpts, _claimIndex *big.Int) (uint64, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "getChallengerDuration", _claimIndex)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// GetChallengerDuration is a free data retrieval call binding the contract method 0xbd8da956.
+//
+// Solidity: function getChallengerDuration(uint256 _claimIndex) view returns(uint64 duration_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GetChallengerDuration(_claimIndex *big.Int) (uint64, error) {
+	return _FaultDisputeGame.Contract.GetChallengerDuration(&_FaultDisputeGame.CallOpts, _claimIndex)
+}
+
+// GetChallengerDuration is a free data retrieval call binding the contract method 0xbd8da956.
+//
+// Solidity: function getChallengerDuration(uint256 _claimIndex) view returns(uint64 duration_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GetChallengerDuration(_claimIndex *big.Int) (uint64, error) {
+	return _FaultDisputeGame.Contract.GetChallengerDuration(&_FaultDisputeGame.CallOpts, _claimIndex)
+}
+
+// GetNumToResolve is a free data retrieval call binding the contract method 0x5a5fa2d9.
+//
+// Solidity: function getNumToResolve(uint256 _claimIndex) view returns(uint256 numRemainingChildren_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GetNumToResolve(opts *bind.CallOpts, _claimIndex *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "getNumToResolve", _claimIndex)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetNumToResolve is a free data retrieval call binding the contract method 0x5a5fa2d9.
+//
+// Solidity: function getNumToResolve(uint256 _claimIndex) view returns(uint256 numRemainingChildren_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GetNumToResolve(_claimIndex *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.GetNumToResolve(&_FaultDisputeGame.CallOpts, _claimIndex)
+}
+
+// GetNumToResolve is a free data retrieval call binding the contract method 0x5a5fa2d9.
+//
+// Solidity: function getNumToResolve(uint256 _claimIndex) view returns(uint256 numRemainingChildren_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GetNumToResolve(_claimIndex *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.GetNumToResolve(&_FaultDisputeGame.CallOpts, _claimIndex)
+}
+
+// GetRequiredBond is a free data retrieval call binding the contract method 0xc395e1ca.
+//
+// Solidity: function getRequiredBond(uint128 _position) view returns(uint256 requiredBond_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GetRequiredBond(opts *bind.CallOpts, _position *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "getRequiredBond", _position)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetRequiredBond is a free data retrieval call binding the contract method 0xc395e1ca.
+//
+// Solidity: function getRequiredBond(uint128 _position) view returns(uint256 requiredBond_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GetRequiredBond(_position *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.GetRequiredBond(&_FaultDisputeGame.CallOpts, _position)
+}
+
+// GetRequiredBond is a free data retrieval call binding the contract method 0xc395e1ca.
+//
+// Solidity: function getRequiredBond(uint128 _position) view returns(uint256 requiredBond_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GetRequiredBond(_position *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.GetRequiredBond(&_FaultDisputeGame.CallOpts, _position)
+}
+
+// L1Head is a free data retrieval call binding the contract method 0x6361506d.
+//
+// Solidity: function l1Head() pure returns(bytes32 l1Head_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) L1Head(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "l1Head")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// L1Head is a free data retrieval call binding the contract method 0x6361506d.
+//
+// Solidity: function l1Head() pure returns(bytes32 l1Head_)
+func (_FaultDisputeGame *FaultDisputeGameSession) L1Head() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.L1Head(&_FaultDisputeGame.CallOpts)
+}
+
+// L1Head is a free data retrieval call binding the contract method 0x6361506d.
+//
+// Solidity: function l1Head() pure returns(bytes32 l1Head_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) L1Head() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.L1Head(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumber is a free data retrieval call binding the contract method 0x8b85902b.
+//
+// Solidity: function l2BlockNumber() pure returns(uint256 l2BlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) L2BlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "l2BlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2BlockNumber is a free data retrieval call binding the contract method 0x8b85902b.
+//
+// Solidity: function l2BlockNumber() pure returns(uint256 l2BlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameSession) L2BlockNumber() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumber(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumber is a free data retrieval call binding the contract method 0x8b85902b.
+//
+// Solidity: function l2BlockNumber() pure returns(uint256 l2BlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) L2BlockNumber() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumber(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumberChallenged is a free data retrieval call binding the contract method 0x3e3ac912.
+//
+// Solidity: function l2BlockNumberChallenged() view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCaller) L2BlockNumberChallenged(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "l2BlockNumberChallenged")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// L2BlockNumberChallenged is a free data retrieval call binding the contract method 0x3e3ac912.
+//
+// Solidity: function l2BlockNumberChallenged() view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameSession) L2BlockNumberChallenged() (bool, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumberChallenged(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumberChallenged is a free data retrieval call binding the contract method 0x3e3ac912.
+//
+// Solidity: function l2BlockNumberChallenged() view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) L2BlockNumberChallenged() (bool, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumberChallenged(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumberChallenger is a free data retrieval call binding the contract method 0x30dbe570.
+//
+// Solidity: function l2BlockNumberChallenger() view returns(address)
+func (_FaultDisputeGame *FaultDisputeGameCaller) L2BlockNumberChallenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "l2BlockNumberChallenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2BlockNumberChallenger is a free data retrieval call binding the contract method 0x30dbe570.
+//
+// Solidity: function l2BlockNumberChallenger() view returns(address)
+func (_FaultDisputeGame *FaultDisputeGameSession) L2BlockNumberChallenger() (common.Address, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumberChallenger(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumberChallenger is a free data retrieval call binding the contract method 0x30dbe570.
+//
+// Solidity: function l2BlockNumberChallenger() view returns(address)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) L2BlockNumberChallenger() (common.Address, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumberChallenger(&_FaultDisputeGame.CallOpts)
+}
+
+// L2ChainId is a free data retrieval call binding the contract method 0xd6ae3cd5.
+//
+// Solidity: function l2ChainId() view returns(uint256 l2ChainId_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) L2ChainId(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "l2ChainId")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2ChainId is a free data retrieval call binding the contract method 0xd6ae3cd5.
+//
+// Solidity: function l2ChainId() view returns(uint256 l2ChainId_)
+func (_FaultDisputeGame *FaultDisputeGameSession) L2ChainId() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.L2ChainId(&_FaultDisputeGame.CallOpts)
+}
+
+// L2ChainId is a free data retrieval call binding the contract method 0xd6ae3cd5.
+//
+// Solidity: function l2ChainId() view returns(uint256 l2ChainId_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) L2ChainId() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.L2ChainId(&_FaultDisputeGame.CallOpts)
+}
+
+// MaxClockDuration is a free data retrieval call binding the contract method 0xdabd396d.
+//
+// Solidity: function maxClockDuration() view returns(uint64 maxClockDuration_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) MaxClockDuration(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "maxClockDuration")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MaxClockDuration is a free data retrieval call binding the contract method 0xdabd396d.
+//
+// Solidity: function maxClockDuration() view returns(uint64 maxClockDuration_)
+func (_FaultDisputeGame *FaultDisputeGameSession) MaxClockDuration() (uint64, error) {
+	return _FaultDisputeGame.Contract.MaxClockDuration(&_FaultDisputeGame.CallOpts)
+}
+
+// MaxClockDuration is a free data retrieval call binding the contract method 0xdabd396d.
+//
+// Solidity: function maxClockDuration() view returns(uint64 maxClockDuration_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) MaxClockDuration() (uint64, error) {
+	return _FaultDisputeGame.Contract.MaxClockDuration(&_FaultDisputeGame.CallOpts)
+}
+
+// MaxGameDepth is a free data retrieval call binding the contract method 0xfa315aa9.
+//
+// Solidity: function maxGameDepth() view returns(uint256 maxGameDepth_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) MaxGameDepth(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "maxGameDepth")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// MaxGameDepth is a free data retrieval call binding the contract method 0xfa315aa9.
+//
+// Solidity: function maxGameDepth() view returns(uint256 maxGameDepth_)
+func (_FaultDisputeGame *FaultDisputeGameSession) MaxGameDepth() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.MaxGameDepth(&_FaultDisputeGame.CallOpts)
+}
+
+// MaxGameDepth is a free data retrieval call binding the contract method 0xfa315aa9.
+//
+// Solidity: function maxGameDepth() view returns(uint256 maxGameDepth_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) MaxGameDepth() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.MaxGameDepth(&_FaultDisputeGame.CallOpts)
+}
+
+// ResolutionCheckpoints is a free data retrieval call binding the contract method 0xa445ece6.
+//
+// Solidity: function resolutionCheckpoints(uint256 ) view returns(bool initialCheckpointComplete, uint32 subgameIndex, uint128 leftmostPosition, address counteredBy)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ResolutionCheckpoints(opts *bind.CallOpts, arg0 *big.Int) (struct {
+	InitialCheckpointComplete bool
+	SubgameIndex              uint32
+	LeftmostPosition          *big.Int
+	CounteredBy               common.Address
+}, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "resolutionCheckpoints", arg0)
+
+	outstruct := new(struct {
+		InitialCheckpointComplete bool
+		SubgameIndex              uint32
+		LeftmostPosition          *big.Int
+		CounteredBy               common.Address
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.InitialCheckpointComplete = *abi.ConvertType(out[0], new(bool)).(*bool)
+	outstruct.SubgameIndex = *abi.ConvertType(out[1], new(uint32)).(*uint32)
+	outstruct.LeftmostPosition = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int)
+	outstruct.CounteredBy = *abi.ConvertType(out[3], new(common.Address)).(*common.Address)
+
+	return *outstruct, err
+
+}
+
+// ResolutionCheckpoints is a free data retrieval call binding the contract method 0xa445ece6.
+//
+// Solidity: function resolutionCheckpoints(uint256 ) view returns(bool initialCheckpointComplete, uint32 subgameIndex, uint128 leftmostPosition, address counteredBy)
+func (_FaultDisputeGame *FaultDisputeGameSession) ResolutionCheckpoints(arg0 *big.Int) (struct {
+	InitialCheckpointComplete bool
+	SubgameIndex              uint32
+	LeftmostPosition          *big.Int
+	CounteredBy               common.Address
+}, error) {
+	return _FaultDisputeGame.Contract.ResolutionCheckpoints(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ResolutionCheckpoints is a free data retrieval call binding the contract method 0xa445ece6.
+//
+// Solidity: function resolutionCheckpoints(uint256 ) view returns(bool initialCheckpointComplete, uint32 subgameIndex, uint128 leftmostPosition, address counteredBy)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ResolutionCheckpoints(arg0 *big.Int) (struct {
+	InitialCheckpointComplete bool
+	SubgameIndex              uint32
+	LeftmostPosition          *big.Int
+	CounteredBy               common.Address
+}, error) {
+	return _FaultDisputeGame.Contract.ResolutionCheckpoints(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ResolvedAt is a free data retrieval call binding the contract method 0x19effeb4.
+//
+// Solidity: function resolvedAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ResolvedAt(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "resolvedAt")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// ResolvedAt is a free data retrieval call binding the contract method 0x19effeb4.
+//
+// Solidity: function resolvedAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameSession) ResolvedAt() (uint64, error) {
+	return _FaultDisputeGame.Contract.ResolvedAt(&_FaultDisputeGame.CallOpts)
+}
+
+// ResolvedAt is a free data retrieval call binding the contract method 0x19effeb4.
+//
+// Solidity: function resolvedAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ResolvedAt() (uint64, error) {
+	return _FaultDisputeGame.Contract.ResolvedAt(&_FaultDisputeGame.CallOpts)
+}
+
+// ResolvedSubgames is a free data retrieval call binding the contract method 0xfe2bbeb2.
+//
+// Solidity: function resolvedSubgames(uint256 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ResolvedSubgames(opts *bind.CallOpts, arg0 *big.Int) (bool, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "resolvedSubgames", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// ResolvedSubgames is a free data retrieval call binding the contract method 0xfe2bbeb2.
+//
+// Solidity: function resolvedSubgames(uint256 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameSession) ResolvedSubgames(arg0 *big.Int) (bool, error) {
+	return _FaultDisputeGame.Contract.ResolvedSubgames(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ResolvedSubgames is a free data retrieval call binding the contract method 0xfe2bbeb2.
+//
+// Solidity: function resolvedSubgames(uint256 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ResolvedSubgames(arg0 *big.Int) (bool, error) {
+	return _FaultDisputeGame.Contract.ResolvedSubgames(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// RootClaim is a free data retrieval call binding the contract method 0xbcef3b55.
+//
+// Solidity: function rootClaim() pure returns(bytes32 rootClaim_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) RootClaim(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "rootClaim")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// RootClaim is a free data retrieval call binding the contract method 0xbcef3b55.
+//
+// Solidity: function rootClaim() pure returns(bytes32 rootClaim_)
+func (_FaultDisputeGame *FaultDisputeGameSession) RootClaim() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.RootClaim(&_FaultDisputeGame.CallOpts)
+}
+
+// RootClaim is a free data retrieval call binding the contract method 0xbcef3b55.
+//
+// Solidity: function rootClaim() pure returns(bytes32 rootClaim_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) RootClaim() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.RootClaim(&_FaultDisputeGame.CallOpts)
+}
+
+// SplitDepth is a free data retrieval call binding the contract method 0xec5e6308.
+//
+// Solidity: function splitDepth() view returns(uint256 splitDepth_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) SplitDepth(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "splitDepth")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// SplitDepth is a free data retrieval call binding the contract method 0xec5e6308.
+//
+// Solidity: function splitDepth() view returns(uint256 splitDepth_)
+func (_FaultDisputeGame *FaultDisputeGameSession) SplitDepth() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.SplitDepth(&_FaultDisputeGame.CallOpts)
+}
+
+// SplitDepth is a free data retrieval call binding the contract method 0xec5e6308.
+//
+// Solidity: function splitDepth() view returns(uint256 splitDepth_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) SplitDepth() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.SplitDepth(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256 startingBlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) StartingBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "startingBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256 startingBlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameSession) StartingBlockNumber() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.StartingBlockNumber(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256 startingBlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) StartingBlockNumber() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.StartingBlockNumber(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingOutputRoot is a free data retrieval call binding the contract method 0x57da950e.
+//
+// Solidity: function startingOutputRoot() view returns(bytes32 root, uint256 l2BlockNumber)
+func (_FaultDisputeGame *FaultDisputeGameCaller) StartingOutputRoot(opts *bind.CallOpts) (struct {
+	Root          [32]byte
+	L2BlockNumber *big.Int
+}, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "startingOutputRoot")
+
+	outstruct := new(struct {
+		Root          [32]byte
+		L2BlockNumber *big.Int
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.Root = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+	outstruct.L2BlockNumber = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
+
+	return *outstruct, err
+
+}
+
+// StartingOutputRoot is a free data retrieval call binding the contract method 0x57da950e.
+//
+// Solidity: function startingOutputRoot() view returns(bytes32 root, uint256 l2BlockNumber)
+func (_FaultDisputeGame *FaultDisputeGameSession) StartingOutputRoot() (struct {
+	Root          [32]byte
+	L2BlockNumber *big.Int
+}, error) {
+	return _FaultDisputeGame.Contract.StartingOutputRoot(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingOutputRoot is a free data retrieval call binding the contract method 0x57da950e.
+//
+// Solidity: function startingOutputRoot() view returns(bytes32 root, uint256 l2BlockNumber)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) StartingOutputRoot() (struct {
+	Root          [32]byte
+	L2BlockNumber *big.Int
+}, error) {
+	return _FaultDisputeGame.Contract.StartingOutputRoot(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingRootHash is a free data retrieval call binding the contract method 0x25fc2ace.
+//
+// Solidity: function startingRootHash() view returns(bytes32 startingRootHash_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) StartingRootHash(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "startingRootHash")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// StartingRootHash is a free data retrieval call binding the contract method 0x25fc2ace.
+//
+// Solidity: function startingRootHash() view returns(bytes32 startingRootHash_)
+func (_FaultDisputeGame *FaultDisputeGameSession) StartingRootHash() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.StartingRootHash(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingRootHash is a free data retrieval call binding the contract method 0x25fc2ace.
+//
+// Solidity: function startingRootHash() view returns(bytes32 startingRootHash_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) StartingRootHash() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.StartingRootHash(&_FaultDisputeGame.CallOpts)
+}
+
+// Status is a free data retrieval call binding the contract method 0x200d2ed2.
+//
+// Solidity: function status() view returns(uint8)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Status(opts *bind.CallOpts) (uint8, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "status")
+
+	if err != nil {
+		return *new(uint8), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
+
+	return out0, err
+
+}
+
+// Status is a free data retrieval call binding the contract method 0x200d2ed2.
+//
+// Solidity: function status() view returns(uint8)
+func (_FaultDisputeGame *FaultDisputeGameSession) Status() (uint8, error) {
+	return _FaultDisputeGame.Contract.Status(&_FaultDisputeGame.CallOpts)
+}
+
+// Status is a free data retrieval call binding the contract method 0x200d2ed2.
+//
+// Solidity: function status() view returns(uint8)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Status() (uint8, error) {
+	return _FaultDisputeGame.Contract.Status(&_FaultDisputeGame.CallOpts)
+}
+
+// Subgames is a free data retrieval call binding the contract method 0x2ad69aeb.
+//
+// Solidity: function subgames(uint256 , uint256 ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Subgames(opts *bind.CallOpts, arg0 *big.Int, arg1 *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "subgames", arg0, arg1)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Subgames is a free data retrieval call binding the contract method 0x2ad69aeb.
+//
+// Solidity: function subgames(uint256 , uint256 ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameSession) Subgames(arg0 *big.Int, arg1 *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.Subgames(&_FaultDisputeGame.CallOpts, arg0, arg1)
+}
+
+// Subgames is a free data retrieval call binding the contract method 0x2ad69aeb.
+//
+// Solidity: function subgames(uint256 , uint256 ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Subgames(arg0 *big.Int, arg1 *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.Subgames(&_FaultDisputeGame.CallOpts, arg0, arg1)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_FaultDisputeGame *FaultDisputeGameSession) Version() (string, error) {
+	return _FaultDisputeGame.Contract.Version(&_FaultDisputeGame.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Version() (string, error) {
+	return _FaultDisputeGame.Contract.Version(&_FaultDisputeGame.CallOpts)
+}
+
+// Vm is a free data retrieval call binding the contract method 0x3a768463.
+//
+// Solidity: function vm() view returns(address vm_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Vm(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "vm")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Vm is a free data retrieval call binding the contract method 0x3a768463.
+//
+// Solidity: function vm() view returns(address vm_)
+func (_FaultDisputeGame *FaultDisputeGameSession) Vm() (common.Address, error) {
+	return _FaultDisputeGame.Contract.Vm(&_FaultDisputeGame.CallOpts)
+}
+
+// Vm is a free data retrieval call binding the contract method 0x3a768463.
+//
+// Solidity: function vm() view returns(address vm_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Vm() (common.Address, error) {
+	return _FaultDisputeGame.Contract.Vm(&_FaultDisputeGame.CallOpts)
+}
+
+// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
+//
+// Solidity: function weth() view returns(address weth_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Weth(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "weth")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
+//
+// Solidity: function weth() view returns(address weth_)
+func (_FaultDisputeGame *FaultDisputeGameSession) Weth() (common.Address, error) {
+	return _FaultDisputeGame.Contract.Weth(&_FaultDisputeGame.CallOpts)
+}
+
+// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
+//
+// Solidity: function weth() view returns(address weth_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Weth() (common.Address, error) {
+	return _FaultDisputeGame.Contract.Weth(&_FaultDisputeGame.CallOpts)
+}
+
+// AddLocalData is a paid mutator transaction binding the contract method 0xf8f43ff6.
+//
+// Solidity: function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) AddLocalData(opts *bind.TransactOpts, _ident *big.Int, _execLeafIdx *big.Int, _partOffset *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "addLocalData", _ident, _execLeafIdx, _partOffset)
+}
+
+// AddLocalData is a paid mutator transaction binding the contract method 0xf8f43ff6.
+//
+// Solidity: function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) AddLocalData(_ident *big.Int, _execLeafIdx *big.Int, _partOffset *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.AddLocalData(&_FaultDisputeGame.TransactOpts, _ident, _execLeafIdx, _partOffset)
+}
+
+// AddLocalData is a paid mutator transaction binding the contract method 0xf8f43ff6.
+//
+// Solidity: function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) AddLocalData(_ident *big.Int, _execLeafIdx *big.Int, _partOffset *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.AddLocalData(&_FaultDisputeGame.TransactOpts, _ident, _execLeafIdx, _partOffset)
+}
+
+// Attack is a paid mutator transaction binding the contract method 0x472777c6.
+//
+// Solidity: function attack(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Attack(opts *bind.TransactOpts, _disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "attack", _disputed, _parentIndex, _claim)
+}
+
+// Attack is a paid mutator transaction binding the contract method 0x472777c6.
+//
+// Solidity: function attack(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) Attack(_disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Attack(&_FaultDisputeGame.TransactOpts, _disputed, _parentIndex, _claim)
+}
+
+// Attack is a paid mutator transaction binding the contract method 0x472777c6.
+//
+// Solidity: function attack(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Attack(_disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Attack(&_FaultDisputeGame.TransactOpts, _disputed, _parentIndex, _claim)
+}
+
+// ChallengeRootL2Block is a paid mutator transaction binding the contract method 0x01935130.
+//
+// Solidity: function challengeRootL2Block((bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes _headerRLP) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) ChallengeRootL2Block(opts *bind.TransactOpts, _outputRootProof TypesOutputRootProof, _headerRLP []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "challengeRootL2Block", _outputRootProof, _headerRLP)
+}
+
+// ChallengeRootL2Block is a paid mutator transaction binding the contract method 0x01935130.
+//
+// Solidity: function challengeRootL2Block((bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes _headerRLP) returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) ChallengeRootL2Block(_outputRootProof TypesOutputRootProof, _headerRLP []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ChallengeRootL2Block(&_FaultDisputeGame.TransactOpts, _outputRootProof, _headerRLP)
+}
+
+// ChallengeRootL2Block is a paid mutator transaction binding the contract method 0x01935130.
+//
+// Solidity: function challengeRootL2Block((bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes _headerRLP) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) ChallengeRootL2Block(_outputRootProof TypesOutputRootProof, _headerRLP []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ChallengeRootL2Block(&_FaultDisputeGame.TransactOpts, _outputRootProof, _headerRLP)
+}
+
+// ClaimCredit is a paid mutator transaction binding the contract method 0x60e27464.
+//
+// Solidity: function claimCredit(address _recipient) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) ClaimCredit(opts *bind.TransactOpts, _recipient common.Address) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "claimCredit", _recipient)
+}
+
+// ClaimCredit is a paid mutator transaction binding the contract method 0x60e27464.
+//
+// Solidity: function claimCredit(address _recipient) returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) ClaimCredit(_recipient common.Address) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ClaimCredit(&_FaultDisputeGame.TransactOpts, _recipient)
+}
+
+// ClaimCredit is a paid mutator transaction binding the contract method 0x60e27464.
+//
+// Solidity: function claimCredit(address _recipient) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) ClaimCredit(_recipient common.Address) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ClaimCredit(&_FaultDisputeGame.TransactOpts, _recipient)
+}
+
+// Defend is a paid mutator transaction binding the contract method 0x7b0f0adc.
+//
+// Solidity: function defend(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Defend(opts *bind.TransactOpts, _disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "defend", _disputed, _parentIndex, _claim)
+}
+
+// Defend is a paid mutator transaction binding the contract method 0x7b0f0adc.
+//
+// Solidity: function defend(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) Defend(_disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Defend(&_FaultDisputeGame.TransactOpts, _disputed, _parentIndex, _claim)
+}
+
+// Defend is a paid mutator transaction binding the contract method 0x7b0f0adc.
+//
+// Solidity: function defend(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Defend(_disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Defend(&_FaultDisputeGame.TransactOpts, _disputed, _parentIndex, _claim)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
+//
+// Solidity: function initialize() payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Initialize(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "initialize")
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
+//
+// Solidity: function initialize() payable returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) Initialize() (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Initialize(&_FaultDisputeGame.TransactOpts)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
+//
+// Solidity: function initialize() payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Initialize() (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Initialize(&_FaultDisputeGame.TransactOpts)
+}
+
+// Move is a paid mutator transaction binding the contract method 0x6f034409.
+//
+// Solidity: function move(bytes32 _disputed, uint256 _challengeIndex, bytes32 _claim, bool _isAttack) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Move(opts *bind.TransactOpts, _disputed [32]byte, _challengeIndex *big.Int, _claim [32]byte, _isAttack bool) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "move", _disputed, _challengeIndex, _claim, _isAttack)
+}
+
+// Move is a paid mutator transaction binding the contract method 0x6f034409.
+//
+// Solidity: function move(bytes32 _disputed, uint256 _challengeIndex, bytes32 _claim, bool _isAttack) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) Move(_disputed [32]byte, _challengeIndex *big.Int, _claim [32]byte, _isAttack bool) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Move(&_FaultDisputeGame.TransactOpts, _disputed, _challengeIndex, _claim, _isAttack)
+}
+
+// Move is a paid mutator transaction binding the contract method 0x6f034409.
+//
+// Solidity: function move(bytes32 _disputed, uint256 _challengeIndex, bytes32 _claim, bool _isAttack) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Move(_disputed [32]byte, _challengeIndex *big.Int, _claim [32]byte, _isAttack bool) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Move(&_FaultDisputeGame.TransactOpts, _disputed, _challengeIndex, _claim, _isAttack)
+}
+
+// Resolve is a paid mutator transaction binding the contract method 0x2810e1d6.
+//
+// Solidity: function resolve() returns(uint8 status_)
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Resolve(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "resolve")
+}
+
+// Resolve is a paid mutator transaction binding the contract method 0x2810e1d6.
+//
+// Solidity: function resolve() returns(uint8 status_)
+func (_FaultDisputeGame *FaultDisputeGameSession) Resolve() (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Resolve(&_FaultDisputeGame.TransactOpts)
+}
+
+// Resolve is a paid mutator transaction binding the contract method 0x2810e1d6.
+//
+// Solidity: function resolve() returns(uint8 status_)
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Resolve() (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Resolve(&_FaultDisputeGame.TransactOpts)
+}
+
+// ResolveClaim is a paid mutator transaction binding the contract method 0x03c2924d.
+//
+// Solidity: function resolveClaim(uint256 _claimIndex, uint256 _numToResolve) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) ResolveClaim(opts *bind.TransactOpts, _claimIndex *big.Int, _numToResolve *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "resolveClaim", _claimIndex, _numToResolve)
+}
+
+// ResolveClaim is a paid mutator transaction binding the contract method 0x03c2924d.
+//
+// Solidity: function resolveClaim(uint256 _claimIndex, uint256 _numToResolve) returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) ResolveClaim(_claimIndex *big.Int, _numToResolve *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ResolveClaim(&_FaultDisputeGame.TransactOpts, _claimIndex, _numToResolve)
+}
+
+// ResolveClaim is a paid mutator transaction binding the contract method 0x03c2924d.
+//
+// Solidity: function resolveClaim(uint256 _claimIndex, uint256 _numToResolve) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) ResolveClaim(_claimIndex *big.Int, _numToResolve *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ResolveClaim(&_FaultDisputeGame.TransactOpts, _claimIndex, _numToResolve)
+}
+
+// Step is a paid mutator transaction binding the contract method 0xd8cc1a3c.
+//
+// Solidity: function step(uint256 _claimIndex, bool _isAttack, bytes _stateData, bytes _proof) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Step(opts *bind.TransactOpts, _claimIndex *big.Int, _isAttack bool, _stateData []byte, _proof []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "step", _claimIndex, _isAttack, _stateData, _proof)
+}
+
+// Step is a paid mutator transaction binding the contract method 0xd8cc1a3c.
+//
+// Solidity: function step(uint256 _claimIndex, bool _isAttack, bytes _stateData, bytes _proof) returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) Step(_claimIndex *big.Int, _isAttack bool, _stateData []byte, _proof []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Step(&_FaultDisputeGame.TransactOpts, _claimIndex, _isAttack, _stateData, _proof)
+}
+
+// Step is a paid mutator transaction binding the contract method 0xd8cc1a3c.
+//
+// Solidity: function step(uint256 _claimIndex, bool _isAttack, bytes _stateData, bytes _proof) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Step(_claimIndex *big.Int, _isAttack bool, _stateData []byte, _proof []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Step(&_FaultDisputeGame.TransactOpts, _claimIndex, _isAttack, _stateData, _proof)
+}
+
+// FaultDisputeGameMoveIterator is returned from FilterMove and is used to iterate over the raw logs and unpacked data for Move events raised by the FaultDisputeGame contract.
+type FaultDisputeGameMoveIterator struct {
+	Event *FaultDisputeGameMove // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *FaultDisputeGameMoveIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(FaultDisputeGameMove)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(FaultDisputeGameMove)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *FaultDisputeGameMoveIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *FaultDisputeGameMoveIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// FaultDisputeGameMove represents a Move event raised by the FaultDisputeGame contract.
+type FaultDisputeGameMove struct {
+	ParentIndex *big.Int
+	Claim       [32]byte
+	Claimant    common.Address
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterMove is a free log retrieval operation binding the contract event 0x9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be.
+//
+// Solidity: event Move(uint256 indexed parentIndex, bytes32 indexed claim, address indexed claimant)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) FilterMove(opts *bind.FilterOpts, parentIndex []*big.Int, claim [][32]byte, claimant []common.Address) (*FaultDisputeGameMoveIterator, error) {
+
+	var parentIndexRule []interface{}
+	for _, parentIndexItem := range parentIndex {
+		parentIndexRule = append(parentIndexRule, parentIndexItem)
+	}
+	var claimRule []interface{}
+	for _, claimItem := range claim {
+		claimRule = append(claimRule, claimItem)
+	}
+	var claimantRule []interface{}
+	for _, claimantItem := range claimant {
+		claimantRule = append(claimantRule, claimantItem)
+	}
+
+	logs, sub, err := _FaultDisputeGame.contract.FilterLogs(opts, "Move", parentIndexRule, claimRule, claimantRule)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGameMoveIterator{contract: _FaultDisputeGame.contract, event: "Move", logs: logs, sub: sub}, nil
+}
+
+// WatchMove is a free log subscription operation binding the contract event 0x9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be.
+//
+// Solidity: event Move(uint256 indexed parentIndex, bytes32 indexed claim, address indexed claimant)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) WatchMove(opts *bind.WatchOpts, sink chan<- *FaultDisputeGameMove, parentIndex []*big.Int, claim [][32]byte, claimant []common.Address) (event.Subscription, error) {
+
+	var parentIndexRule []interface{}
+	for _, parentIndexItem := range parentIndex {
+		parentIndexRule = append(parentIndexRule, parentIndexItem)
+	}
+	var claimRule []interface{}
+	for _, claimItem := range claim {
+		claimRule = append(claimRule, claimItem)
+	}
+	var claimantRule []interface{}
+	for _, claimantItem := range claimant {
+		claimantRule = append(claimantRule, claimantItem)
+	}
+
+	logs, sub, err := _FaultDisputeGame.contract.WatchLogs(opts, "Move", parentIndexRule, claimRule, claimantRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(FaultDisputeGameMove)
+				if err := _FaultDisputeGame.contract.UnpackLog(event, "Move", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseMove is a log parse operation binding the contract event 0x9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be.
+//
+// Solidity: event Move(uint256 indexed parentIndex, bytes32 indexed claim, address indexed claimant)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) ParseMove(log types.Log) (*FaultDisputeGameMove, error) {
+	event := new(FaultDisputeGameMove)
+	if err := _FaultDisputeGame.contract.UnpackLog(event, "Move", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// FaultDisputeGameResolvedIterator is returned from FilterResolved and is used to iterate over the raw logs and unpacked data for Resolved events raised by the FaultDisputeGame contract.
+type FaultDisputeGameResolvedIterator struct {
+	Event *FaultDisputeGameResolved // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *FaultDisputeGameResolvedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(FaultDisputeGameResolved)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(FaultDisputeGameResolved)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *FaultDisputeGameResolvedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *FaultDisputeGameResolvedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// FaultDisputeGameResolved represents a Resolved event raised by the FaultDisputeGame contract.
+type FaultDisputeGameResolved struct {
+	Status uint8
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterResolved is a free log retrieval operation binding the contract event 0x5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da60.
+//
+// Solidity: event Resolved(uint8 indexed status)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) FilterResolved(opts *bind.FilterOpts, status []uint8) (*FaultDisputeGameResolvedIterator, error) {
+
+	var statusRule []interface{}
+	for _, statusItem := range status {
+		statusRule = append(statusRule, statusItem)
+	}
+
+	logs, sub, err := _FaultDisputeGame.contract.FilterLogs(opts, "Resolved", statusRule)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGameResolvedIterator{contract: _FaultDisputeGame.contract, event: "Resolved", logs: logs, sub: sub}, nil
+}
+
+// WatchResolved is a free log subscription operation binding the contract event 0x5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da60.
+//
+// Solidity: event Resolved(uint8 indexed status)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) WatchResolved(opts *bind.WatchOpts, sink chan<- *FaultDisputeGameResolved, status []uint8) (event.Subscription, error) {
+
+	var statusRule []interface{}
+	for _, statusItem := range status {
+		statusRule = append(statusRule, statusItem)
+	}
+
+	logs, sub, err := _FaultDisputeGame.contract.WatchLogs(opts, "Resolved", statusRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(FaultDisputeGameResolved)
+				if err := _FaultDisputeGame.contract.UnpackLog(event, "Resolved", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseResolved is a log parse operation binding the contract event 0x5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da60.
+//
+// Solidity: event Resolved(uint8 indexed status)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) ParseResolved(log types.Log) (*FaultDisputeGameResolved, error) {
+	event := new(FaultDisputeGameResolved)
+	if err := _FaultDisputeGame.contract.UnpackLog(event, "Resolved", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-dispute-mon/bindings/optimismportal.go b/op-dispute-mon/bindings/optimismportal.go
new file mode 100644
index 000000000000..3fb3ed0cd59a
--- /dev/null
+++ b/op-dispute-mon/bindings/optimismportal.go
@@ -0,0 +1,1478 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// TypesOutputRootProof is an auto generated low-level Go binding around an user-defined struct.
+type TypesOutputRootProof struct {
+	Version                  [32]byte
+	StateRoot                [32]byte
+	MessagePasserStorageRoot [32]byte
+	LatestBlockhash          [32]byte
+}
+
+// TypesWithdrawalTransaction is an auto generated low-level Go binding around an user-defined struct.
+type TypesWithdrawalTransaction struct {
+	Nonce    *big.Int
+	Sender   common.Address
+	Target   common.Address
+	Value    *big.Int
+	GasLimit *big.Int
+	Data     []byte
+}
+
+// OptimismPortalMetaData contains all meta data concerning the OptimismPortal contract.
+var OptimismPortalMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"balance\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositERC20Transaction\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_mint\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_isCreation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositTransaction\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_isCreation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"donateETH\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"finalizeWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizedWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gasPayingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"addr_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"decimals_\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardian\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isOutputFinalized\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Oracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Sender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minimumGasLimit\",\"inputs\":[{\"name\":\"_byteCount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"params\",\"inputs\":[],\"outputs\":[{\"name\":\"prevBaseFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"prevBoughtGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"prevBlockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"paused_\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_outputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"latestBlockhash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provenWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2OutputIndex\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setGasPayingToken\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_symbol\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransactionDeposited\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"version\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"opaqueData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalFinalized\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalProven\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BadTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasEstimation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LargeCalldata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonReentrant\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCustomGasToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfGas\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SmallGasLimit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[]}]",
+	Bin: "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028f565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001c160201b62001ff31760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603680546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b03191661010085841602179055603254166200016a57603280546001600160a01b03191661dead1790555b62000174620001d0565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200023d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600154600160c01b90046001600160401b03166000036200028d5760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b615f6d806200029f6000396000f3fe60806040526004361061016e5760003560e01c80638b4c40b0116100cb578063a35d99df1161007f578063cff0ab9611610059578063cff0ab961461049c578063e965084c1461053d578063e9e05c42146105c957600080fd5b8063a35d99df14610420578063b69ef8a814610459578063c0c53b8b1461047c57600080fd5b80639b5f694a116100b05780639b5f694a146103965780639bf62d82146103c3578063a14238e7146103f057600080fd5b80638b4c40b0146101935780638c3152e91461037657600080fd5b80634870496f116101225780635c975abb116101075780635c975abb146103115780636dbffb781461033657806371cfaa3f1461035657600080fd5b80634870496f1461029b57806354fd4d50146102bb57600080fd5b806335e80ab31161015357806335e80ab3146102115780634397dfef14610243578063452a93201461028657600080fd5b8063149f2f221461019a57806333d7e2bd146101ba57600080fd5b36610195576101933334620186a06000604051806020016040528060008152506105d7565b005b600080fd5b3480156101a657600080fd5b506101936101b536600461538d565b61067c565b3480156101c657600080fd5b506037546101e79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021d57600080fd5b506035546101e790610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024f57600080fd5b506102586108be565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff909116602083015201610208565b34801561029257600080fd5b506101e761095b565b3480156102a757600080fd5b506101936102b63660046154c1565b6109f3565b3480156102c757600080fd5b506103046040518060400160405280601b81526020017f322e372e302d626574612b637573746f6d2d6761732d746f6b656e000000000081525081565b6040516102089190615613565b34801561031d57600080fd5b50610326610fa0565b6040519015158152602001610208565b34801561034257600080fd5b50610326610351366004615626565b611033565b34801561036257600080fd5b5061019361037136600461564e565b6110ee565b34801561038257600080fd5b50610193610391366004615694565b6112b0565b3480156103a257600080fd5b506036546101e79073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103cf57600080fd5b506032546101e79073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103fc57600080fd5b5061032661040b366004615626565b60336020526000908152604090205460ff1681565b34801561042c57600080fd5b5061044061043b3660046156d1565b611d32565b60405167ffffffffffffffff9091168152602001610208565b34801561046557600080fd5b5061046e611d4b565b604051908152602001610208565b34801561048857600080fd5b506101936104973660046156ec565b611da5565b3480156104a857600080fd5b50600154610504906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610208565b34801561054957600080fd5b5061059b610558366004615626565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff9283166020850152911690820152606001610208565b6101936105d7366004615737565b8260005a905060006105e76108be565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1480159061062357503415155b1561065a576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61066888348989898961200f565b5061067382826121bb565b50505050505050565b8260005a9050600061068c6108be565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016106fe576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561076b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078f91906157b4565b90506107b373ffffffffffffffffffffffffffffffffffffffff831633308c612488565b6107bd89826157fc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084b91906157b4565b14610882576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88603d600082825461089491906157fc565b909155506108a890508a8a8a8a8a8a61200f565b50506108b482826121bb565b5050505050505050565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa15801561092e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109529190615814565b90939092509050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee919061584e565b905090565b6109fb610fa0565b15610a32576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a9b576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2f919061588b565b519050610b49610b44368690038601866158f0565b612564565b8114610bdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610be7876125c0565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610cfd5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf9919061588b565b5114155b610d89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610bd3565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610e529101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610e48888a615956565b8a604001356125f0565b610ede576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610bd3565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee91906159da565b6036546040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018390526000916110e89173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa1580156110a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cd919061588b565b602001516fffffffffffffffffffffffffffffffff16612614565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff16331461113f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61114b620138806126ba565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3290849081906201388090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f000000000000000000000000000000000000000000000000000000001790529051611268969594939291016159f7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526112a091615613565b60405180910390a450505050565b565b6112b8610fa0565b156112ef576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611342576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061134d826125c0565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610bd3565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c991906157b4565b81602001516fffffffffffffffffffffffffffffffff161015611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610bd3565b6115b381602001516fffffffffffffffffffffffffffffffff16612614565b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610bd3565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa1580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611710919061588b565b82518151919250146117ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610bd3565b6117e981602001516fffffffffffffffffffffffffffffffff16612614565b61189b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610bd3565b60008381526033602052604090205460ff161561193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610bd3565b6000838152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055806119c56108be565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611a2857611a218660400151876080015188606001518960a00151612716565b9150611c7b565b8073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff1603611a91576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086015115611c52578560600151603d6000828254611ab19190615a5c565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4791906157b4565b9050611b7c876040015188606001518473ffffffffffffffffffffffffffffffffffffffff166127749092919063ffffffff16565b6060870151611b8b9082615a5c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1991906157b4565b14611c50576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08601515115611c7657611a218660400151876080015160008960a00151612716565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405185907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611cdd90851515815260200190565b60405180910390a281158015611cf35750326001145b15611d2a576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000611d3f826010615a73565b6110e890615208615aa3565b600080611d566108be565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611d9d574791505090565b5050603d5490565b600054610100900460ff1615808015611dc55750600054600160ff909116105b80611ddf5750303b158015611ddf575060005460ff166001145b611e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610bd3565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611ec957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611f8257603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611f8a6127cf565b8015611fed57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b818015612031575073ffffffffffffffffffffffffffffffffffffffff861615155b15612068576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120728151611d32565b67ffffffffffffffff168367ffffffffffffffff1610156120bf576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0815111156120fd576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3332811461211e575033731111000000000000000000000000000000001111015b600086868686866040516020016121399594939291906159f7565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516121a99190615613565b60405180910390a45050505050505050565b6001546000906121f1907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643615a5c565b905060006121fd6128e2565b90506000816020015160ff16826000015163ffffffff1661221e9190615afe565b9050821561235557600154600090612255908390700100000000000000000000000000000000900467ffffffffffffffff16615b66565b90506000836040015160ff168361226c9190615bda565b60015461228c9084906fffffffffffffffffffffffffffffffff16615bda565b6122969190615afe565b6001549091506000906122e7906122c09084906fffffffffffffffffffffffffffffffff16615c96565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff166129a3565b90506001861115612316576123136122c082876040015160ff1660018a61230e9190615a5c565b6129c2565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090612388908490700100000000000000000000000000000000900467ffffffffffffffff16615aa3565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315612415576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090612441906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615d0a565b9050600061245348633b9aca00612a17565b61245d9083615d47565b905060005a61246c9088615a5c565b9050808211156108b4576108b46124838284615a5c565b612a2e565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611fed9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a57565b600081600001518260200151836040015184606001516040516020016125a3949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a088015193516000976125a3979096959101615d5b565b6000806125fc86612b63565b905061260a81868686612b95565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015612684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a891906157b4565b6126b290836157fc565b421192915050565b600180548291906010906126ed908490700100000000000000000000000000000000900467ffffffffffffffff16615aa3565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b6000806000612726866000612bc5565b90508061275c576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127ca9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016124e2565b505050565b600054610100900460ff16612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610bd3565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036112ae5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa15801561297f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190615dc6565b60006129b86129b28585612be3565b83612bf3565b90505b9392505050565b6000670de0b6b3a7640000612a036129da8583615afe565b6129ec90670de0b6b3a7640000615b66565b6129fe85670de0b6b3a7640000615bda565b612c02565b612a0d9086615bda565b6129b89190615afe565b600081831015612a2757816129bb565b5090919050565b6000805a90505b825a612a419083615a5c565b10156127ca57612a5082615e69565b9150612a35565b6000612ab9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c339092919063ffffffff16565b8051909150156127ca5780806020019051810190612ad791906159da565b6127ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bd3565b60608180519060200120604051602001612b7f91815260200190565b6040516020818303038152906040529050919050565b6000612bbc84612ba6878686612c42565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b600081831215612a2757816129bb565b6000818312612a2757816129bb565b60006129bb670de0b6b3a764000083612c1a866136c0565b612c249190615bda565b612c2e9190615afe565b613904565b60606129b88484600085613b43565b60606000845111612caf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610bd3565b6000612cba84613cd9565b90506000612cc786613dc5565b9050600084604051602001612cde91815260200190565b60405160208183030381529060405290506000805b8451811015613637576000858281518110612d1057612d10615ea1565b602002602001015190508451831115612dab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610bd3565b82600003612e645780518051602091820120604051612df992612dd392910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612e5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610bd3565b612fbb565b805151602011612f1a5780518051602091820120604051612e8e92612dd392910190815260200190565b612e5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610bd3565b805184516020808701919091208251919092012014612fbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610bd3565b612fc7601060016157fc565b816020015151036131a3578451830361313b576130018160200151601081518110612ff457612ff4615ea1565b6020026020010151613e28565b96506000875111613094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610bd3565b600186516130a29190615a5c565b8214613130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610bd3565b5050505050506129bb565b600085848151811061314f5761314f615ea1565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061317a5761317a615ea1565b6020026020010151905061318d81613f88565b955061319a6001866157fc565b94505050613624565b60028160200151510361359c5760006131bb82613fad565b90506000816000815181106131d2576131d2615ea1565b016020015160f81c905060006131e9600283615ed0565b6131f4906002615ef2565b90506000613205848360ff16613fd1565b905060006132138a89613fd1565b905060006132218383614007565b9050808351146132b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610bd3565b60ff8516600214806132c8575060ff85166003145b156134b7578082511461335d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610bd3565b6133778760200151600181518110612ff457612ff4615ea1565b9c5060008d511161340a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610bd3565b60018c516134189190615a5c565b88146134a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610bd3565b5050505050505050505050506129bb565b60ff851615806134ca575060ff85166001145b15613509576134f687602001516001815181106134e9576134e9615ea1565b6020026020010151613f88565b9950613502818a6157fc565b9850613591565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610bd3565b505050505050613624565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610bd3565b508061362f81615e69565b915050612cf3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610bd3565b600080821361372b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610bd3565b60006060613738846140bb565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361393557506000919050565b680755bf798b4a1bf1e582126139a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610bd3565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613bd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bd3565b73ffffffffffffffffffffffffffffffffffffffff85163b613c53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bd3565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c7c9190615f15565b60006040518083038185875af1925050503d8060008114613cb9576040519150601f19603f3d011682016040523d82523d6000602084013e613cbe565b606091505b5091509150613cce828286614191565b979650505050505050565b80516060908067ffffffffffffffff811115613cf757613cf7615281565b604051908082528060200260200182016040528015613d3c57816020015b6040805180820190915260608082526020820152815260200190600190039081613d155790505b50915060005b81811015613dbe576040518060400160405280858381518110613d6757613d67615ea1565b60200260200101518152602001613d96868481518110613d8957613d89615ea1565b60200260200101516141e4565b815250838281518110613dab57613dab615ea1565b6020908102919091010152600101613d42565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613e1d578060011b82018184015160001a8060041c8253600f811660018301535050600101613def565b509295945050505050565b60606000806000613e38856141f7565b919450925090506000816001811115613e5357613e53615f31565b14613ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610bd3565b613eea82846157fc565b855114613f79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610bd3565b612bbc85602001518484614c64565b60606020826000015110613fa457613f9f82613e28565b6110e8565b6110e882614cf8565b60606110e8613fcc8360200151600081518110612ff457612ff4615ea1565b613dc5565b606082518210613ff057506040805160208101909152600081526110e8565b6129bb83838486516140029190615a5c565b614d0e565b600080825184511061401a57825161401d565b83515b90505b80821080156140a4575082828151811061403c5761403c615ea1565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684838151811061407b5761407b615ea1565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156140b457816001019150614020565b5092915050565b6000808211614126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610bd3565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606083156141a05750816129bb565b8251156141b05782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd39190615613565b60606110e86141f283614ee6565b614fcf565b6000806000808460000151116142b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610bd3565b6020840151805160001a607f81116142da576000600160009450945094505050614c5d565b60b781116144e85760006142ef608083615a5c565b9050808760000151116143aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610bd3565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061442357507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b6144d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610bd3565b5060019550935060009250614c5d915050565b60bf81116148365760006144fd60b783615a5c565b9050808760000151116145b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610bd3565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610bd3565b600184015160088302610100031c6037811161475a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610bd3565b61476481846157fc565b895111614819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610bd3565b6148248360016157fc565b9750955060009450614c5d9350505050565b60f7811161491757600061484b60c083615a5c565b905080876000015111614906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610bd3565b600195509350849250614c5d915050565b600061492460f783615a5c565b9050808760000151116149df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610bd3565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610bd3565b600184015160088302610100031c60378111614b81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610bd3565b614b8b81846157fc565b895111614c40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610bd3565b614c4b8360016157fc565b9750955060019450614c5d9350505050565b9193909250565b60608167ffffffffffffffff811115614c7f57614c7f615281565b6040519080825280601f01601f191660200182016040528015614ca9576020820181803683370190505b50905081156129bb576000614cbe84866157fc565b90506020820160005b84811015614cdf578281015182820152602001614cc7565b84811115614cee576000858301525b5050509392505050565b60606110e8826020015160008460000151614c64565b60608182601f011015614d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610bd3565b828284011015614de9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610bd3565b81830184511015614e56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610bd3565b606082158015614e755760405191506000825260208201604052614edd565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614eae578051835260209283019201614e96565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610bd3565b50604080518082019091528151815260209182019181019190915290565b60606000806000614fdf856141f7565b919450925090506001816001811115614ffa57614ffa615f31565b14615087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610bd3565b845161509383856157fc565b14615120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610bd3565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816151375790505093506000835b8651811015615225576000806151aa6040518060400160405280858c6000015161518e9190615a5c565b8152602001858c602001516151a391906157fc565b90526141f7565b5091509150604051806040016040528083836151c691906157fc565b8152602001848b602001516151db91906157fc565b8152508885815181106151f0576151f0615ea1565b60209081029190910101526152066001856157fc565b935061521281836157fc565b61521c90846157fc565b92505050615164565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461525357600080fd5b50565b803567ffffffffffffffff8116811461526e57600080fd5b919050565b801515811461525357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156152f7576152f7615281565b604052919050565b600082601f83011261531057600080fd5b813567ffffffffffffffff81111561532a5761532a615281565b61535b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016152b0565b81815284602083860101111561537057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156153a657600080fd5b86356153b181615231565b955060208701359450604087013593506153cd60608801615256565b925060808701356153dd81615273565b915060a087013567ffffffffffffffff8111156153f957600080fd5b61540589828a016152ff565b9150509295509295509295565b600060c0828403121561542457600080fd5b60405160c0810167ffffffffffffffff828210818311171561544857615448615281565b81604052829350843583526020850135915061546382615231565b8160208401526040850135915061547982615231565b816040840152606085013560608401526080850135608084015260a08501359150808211156154a757600080fd5b506154b4858286016152ff565b60a0830152505092915050565b600080600080600085870360e08112156154da57600080fd5b863567ffffffffffffffff808211156154f257600080fd5b6154fe8a838b01615412565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561553757600080fd5b60408901955060c089013592508083111561555157600080fd5b828901925089601f84011261556557600080fd5b823591508082111561557657600080fd5b508860208260051b840101111561558c57600080fd5b959894975092955050506020019190565b60005b838110156155b85781810151838201526020016155a0565b83811115611fed5750506000910152565b600081518084526155e181602086016020860161559d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129bb60208301846155c9565b60006020828403121561563857600080fd5b5035919050565b60ff8116811461525357600080fd5b6000806000806080858703121561566457600080fd5b843561566f81615231565b9350602085013561567f8161563f565b93969395505050506040820135916060013590565b6000602082840312156156a657600080fd5b813567ffffffffffffffff8111156156bd57600080fd5b6156c984828501615412565b949350505050565b6000602082840312156156e357600080fd5b6129bb82615256565b60008060006060848603121561570157600080fd5b833561570c81615231565b9250602084013561571c81615231565b9150604084013561572c81615231565b809150509250925092565b600080600080600060a0868803121561574f57600080fd5b853561575a81615231565b94506020860135935061576f60408701615256565b9250606086013561577f81615273565b9150608086013567ffffffffffffffff81111561579b57600080fd5b6157a7888289016152ff565b9150509295509295909350565b6000602082840312156157c657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561580f5761580f6157cd565b500190565b6000806040838503121561582757600080fd5b825161583281615231565b60208401519092506158438161563f565b809150509250929050565b60006020828403121561586057600080fd5b81516129bb81615231565b80516fffffffffffffffffffffffffffffffff8116811461526e57600080fd5b60006060828403121561589d57600080fd5b6040516060810181811067ffffffffffffffff821117156158c0576158c0615281565b604052825181526158d36020840161586b565b60208201526158e46040840161586b565b60408201529392505050565b60006080828403121561590257600080fd5b6040516080810181811067ffffffffffffffff8211171561592557615925615281565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff8084111561597157615971615281565b8360051b60206159828183016152b0565b86815291850191818101903684111561599a57600080fd5b865b848110156159ce578035868111156159b45760008081fd5b6159c036828b016152ff565b84525091830191830161599c565b50979650505050505050565b6000602082840312156159ec57600080fd5b81516129bb81615273565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251615a4b81604985016020870161559d565b919091016049019695505050505050565b600082821015615a6e57615a6e6157cd565b500390565b600067ffffffffffffffff80831681851681830481118215151615615a9a57615a9a6157cd565b02949350505050565b600067ffffffffffffffff808316818516808303821115615ac657615ac66157cd565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615b0d57615b0d615acf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b6157615b616157cd565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615615ba057615ba06157cd565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615615bd457615bd46157cd565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615c1b57615c1b6157cd565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c5657615c566157cd565b60008712925087820587128484161615615c7257615c726157cd565b87850587128184161615615c8857615c886157cd565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615cd057615cd06157cd565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615615d0457615d046157cd565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615d4257615d426157cd565b500290565b600082615d5657615d56615acf565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152615da660c08301846155c9565b98975050505050505050565b805163ffffffff8116811461526e57600080fd5b600060c08284031215615dd857600080fd5b60405160c0810181811067ffffffffffffffff82111715615dfb57615dfb615281565b604052615e0783615db2565b81526020830151615e178161563f565b60208201526040830151615e2a8161563f565b6040820152615e3b60608401615db2565b6060820152615e4c60808401615db2565b6080820152615e5d60a0840161586b565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615e9a57615e9a6157cd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680615ee357615ee3615acf565b8060ff84160691505092915050565b600060ff821660ff841680821015615f0c57615f0c6157cd565b90039392505050565b60008251615f2781846020870161559d565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
+}
+
+// OptimismPortalABI is the input ABI used to generate the binding from.
+// Deprecated: Use OptimismPortalMetaData.ABI instead.
+var OptimismPortalABI = OptimismPortalMetaData.ABI
+
+// OptimismPortalBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use OptimismPortalMetaData.Bin instead.
+var OptimismPortalBin = OptimismPortalMetaData.Bin
+
+// DeployOptimismPortal deploys a new Ethereum contract, binding an instance of OptimismPortal to it.
+func DeployOptimismPortal(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *OptimismPortal, error) {
+	parsed, err := OptimismPortalMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(OptimismPortalBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &OptimismPortal{OptimismPortalCaller: OptimismPortalCaller{contract: contract}, OptimismPortalTransactor: OptimismPortalTransactor{contract: contract}, OptimismPortalFilterer: OptimismPortalFilterer{contract: contract}}, nil
+}
+
+// OptimismPortal is an auto generated Go binding around an Ethereum contract.
+type OptimismPortal struct {
+	OptimismPortalCaller     // Read-only binding to the contract
+	OptimismPortalTransactor // Write-only binding to the contract
+	OptimismPortalFilterer   // Log filterer for contract events
+}
+
+// OptimismPortalCaller is an auto generated read-only Go binding around an Ethereum contract.
+type OptimismPortalCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type OptimismPortalTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type OptimismPortalFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type OptimismPortalSession struct {
+	Contract     *OptimismPortal   // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// OptimismPortalCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type OptimismPortalCallerSession struct {
+	Contract *OptimismPortalCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts         // Call options to use throughout this session
+}
+
+// OptimismPortalTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type OptimismPortalTransactorSession struct {
+	Contract     *OptimismPortalTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
+}
+
+// OptimismPortalRaw is an auto generated low-level Go binding around an Ethereum contract.
+type OptimismPortalRaw struct {
+	Contract *OptimismPortal // Generic contract binding to access the raw methods on
+}
+
+// OptimismPortalCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type OptimismPortalCallerRaw struct {
+	Contract *OptimismPortalCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// OptimismPortalTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type OptimismPortalTransactorRaw struct {
+	Contract *OptimismPortalTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewOptimismPortal creates a new instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortal(address common.Address, backend bind.ContractBackend) (*OptimismPortal, error) {
+	contract, err := bindOptimismPortal(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal{OptimismPortalCaller: OptimismPortalCaller{contract: contract}, OptimismPortalTransactor: OptimismPortalTransactor{contract: contract}, OptimismPortalFilterer: OptimismPortalFilterer{contract: contract}}, nil
+}
+
+// NewOptimismPortalCaller creates a new read-only instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalCaller(address common.Address, caller bind.ContractCaller) (*OptimismPortalCaller, error) {
+	contract, err := bindOptimismPortal(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalCaller{contract: contract}, nil
+}
+
+// NewOptimismPortalTransactor creates a new write-only instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalTransactor(address common.Address, transactor bind.ContractTransactor) (*OptimismPortalTransactor, error) {
+	contract, err := bindOptimismPortal(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalTransactor{contract: contract}, nil
+}
+
+// NewOptimismPortalFilterer creates a new log filterer instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalFilterer(address common.Address, filterer bind.ContractFilterer) (*OptimismPortalFilterer, error) {
+	contract, err := bindOptimismPortal(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalFilterer{contract: contract}, nil
+}
+
+// bindOptimismPortal binds a generic wrapper to an already deployed contract.
+func bindOptimismPortal(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(OptimismPortalABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismPortal *OptimismPortalRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismPortal.Contract.OptimismPortalCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismPortal *OptimismPortalRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.OptimismPortalTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismPortal *OptimismPortalRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.OptimismPortalTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismPortal *OptimismPortalCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismPortal.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismPortal *OptimismPortalTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismPortal *OptimismPortalTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.contract.Transact(opts, method, params...)
+}
+
+// Balance is a free data retrieval call binding the contract method 0xb69ef8a8.
+//
+// Solidity: function balance() view returns(uint256)
+func (_OptimismPortal *OptimismPortalCaller) Balance(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "balance")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Balance is a free data retrieval call binding the contract method 0xb69ef8a8.
+//
+// Solidity: function balance() view returns(uint256)
+func (_OptimismPortal *OptimismPortalSession) Balance() (*big.Int, error) {
+	return _OptimismPortal.Contract.Balance(&_OptimismPortal.CallOpts)
+}
+
+// Balance is a free data retrieval call binding the contract method 0xb69ef8a8.
+//
+// Solidity: function balance() view returns(uint256)
+func (_OptimismPortal *OptimismPortalCallerSession) Balance() (*big.Int, error) {
+	return _OptimismPortal.Contract.Balance(&_OptimismPortal.CallOpts)
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalCaller) FinalizedWithdrawals(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "finalizedWithdrawals", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalSession) FinalizedWithdrawals(arg0 [32]byte) (bool, error) {
+	return _OptimismPortal.Contract.FinalizedWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalCallerSession) FinalizedWithdrawals(arg0 [32]byte) (bool, error) {
+	return _OptimismPortal.Contract.FinalizedWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_OptimismPortal *OptimismPortalCaller) GasPayingToken(opts *bind.CallOpts) (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "gasPayingToken")
+
+	outstruct := new(struct {
+		Addr     common.Address
+		Decimals uint8
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.Addr = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+	outstruct.Decimals = *abi.ConvertType(out[1], new(uint8)).(*uint8)
+
+	return *outstruct, err
+
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_OptimismPortal *OptimismPortalSession) GasPayingToken() (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	return _OptimismPortal.Contract.GasPayingToken(&_OptimismPortal.CallOpts)
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_OptimismPortal *OptimismPortalCallerSession) GasPayingToken() (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	return _OptimismPortal.Contract.GasPayingToken(&_OptimismPortal.CallOpts)
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) Guardian(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "guardian")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) Guardian() (common.Address, error) {
+	return _OptimismPortal.Contract.Guardian(&_OptimismPortal.CallOpts)
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) Guardian() (common.Address, error) {
+	return _OptimismPortal.Contract.Guardian(&_OptimismPortal.CallOpts)
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalCaller) IsOutputFinalized(opts *bind.CallOpts, _l2OutputIndex *big.Int) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "isOutputFinalized", _l2OutputIndex)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalSession) IsOutputFinalized(_l2OutputIndex *big.Int) (bool, error) {
+	return _OptimismPortal.Contract.IsOutputFinalized(&_OptimismPortal.CallOpts, _l2OutputIndex)
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalCallerSession) IsOutputFinalized(_l2OutputIndex *big.Int) (bool, error) {
+	return _OptimismPortal.Contract.IsOutputFinalized(&_OptimismPortal.CallOpts, _l2OutputIndex)
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) L2Oracle(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "l2Oracle")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) L2Oracle() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Oracle(&_OptimismPortal.CallOpts)
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) L2Oracle() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Oracle(&_OptimismPortal.CallOpts)
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) L2Sender(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "l2Sender")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) L2Sender() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Sender(&_OptimismPortal.CallOpts)
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) L2Sender() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Sender(&_OptimismPortal.CallOpts)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalCaller) MinimumGasLimit(opts *bind.CallOpts, _byteCount uint64) (uint64, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "minimumGasLimit", _byteCount)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalSession) MinimumGasLimit(_byteCount uint64) (uint64, error) {
+	return _OptimismPortal.Contract.MinimumGasLimit(&_OptimismPortal.CallOpts, _byteCount)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalCallerSession) MinimumGasLimit(_byteCount uint64) (uint64, error) {
+	return _OptimismPortal.Contract.MinimumGasLimit(&_OptimismPortal.CallOpts, _byteCount)
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalCaller) Params(opts *bind.CallOpts) (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "params")
+
+	outstruct := new(struct {
+		PrevBaseFee   *big.Int
+		PrevBoughtGas uint64
+		PrevBlockNum  uint64
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.PrevBaseFee = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+	outstruct.PrevBoughtGas = *abi.ConvertType(out[1], new(uint64)).(*uint64)
+	outstruct.PrevBlockNum = *abi.ConvertType(out[2], new(uint64)).(*uint64)
+
+	return *outstruct, err
+
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalSession) Params() (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	return _OptimismPortal.Contract.Params(&_OptimismPortal.CallOpts)
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalCallerSession) Params() (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	return _OptimismPortal.Contract.Params(&_OptimismPortal.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalSession) Paused() (bool, error) {
+	return _OptimismPortal.Contract.Paused(&_OptimismPortal.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalCallerSession) Paused() (bool, error) {
+	return _OptimismPortal.Contract.Paused(&_OptimismPortal.CallOpts)
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalCaller) ProvenWithdrawals(opts *bind.CallOpts, arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "provenWithdrawals", arg0)
+
+	outstruct := new(struct {
+		OutputRoot    [32]byte
+		Timestamp     *big.Int
+		L2OutputIndex *big.Int
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.OutputRoot = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+	outstruct.Timestamp = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
+	outstruct.L2OutputIndex = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int)
+
+	return *outstruct, err
+
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalSession) ProvenWithdrawals(arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	return _OptimismPortal.Contract.ProvenWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalCallerSession) ProvenWithdrawals(arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	return _OptimismPortal.Contract.ProvenWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) SuperchainConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SuperchainConfig(&_OptimismPortal.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) SuperchainConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SuperchainConfig(&_OptimismPortal.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) SystemConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "systemConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) SystemConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SystemConfig(&_OptimismPortal.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) SystemConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SystemConfig(&_OptimismPortal.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalSession) Version() (string, error) {
+	return _OptimismPortal.Contract.Version(&_OptimismPortal.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalCallerSession) Version() (string, error) {
+	return _OptimismPortal.Contract.Version(&_OptimismPortal.CallOpts)
+}
+
+// DepositERC20Transaction is a paid mutator transaction binding the contract method 0x149f2f22.
+//
+// Solidity: function depositERC20Transaction(address _to, uint256 _mint, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) returns()
+func (_OptimismPortal *OptimismPortalTransactor) DepositERC20Transaction(opts *bind.TransactOpts, _to common.Address, _mint *big.Int, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "depositERC20Transaction", _to, _mint, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositERC20Transaction is a paid mutator transaction binding the contract method 0x149f2f22.
+//
+// Solidity: function depositERC20Transaction(address _to, uint256 _mint, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) returns()
+func (_OptimismPortal *OptimismPortalSession) DepositERC20Transaction(_to common.Address, _mint *big.Int, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositERC20Transaction(&_OptimismPortal.TransactOpts, _to, _mint, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositERC20Transaction is a paid mutator transaction binding the contract method 0x149f2f22.
+//
+// Solidity: function depositERC20Transaction(address _to, uint256 _mint, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) DepositERC20Transaction(_to common.Address, _mint *big.Int, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositERC20Transaction(&_OptimismPortal.TransactOpts, _to, _mint, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) DepositTransaction(opts *bind.TransactOpts, _to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "depositTransaction", _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalSession) DepositTransaction(_to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositTransaction(&_OptimismPortal.TransactOpts, _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) DepositTransaction(_to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositTransaction(&_OptimismPortal.TransactOpts, _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) DonateETH(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "donateETH")
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalSession) DonateETH() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DonateETH(&_OptimismPortal.TransactOpts)
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) DonateETH() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DonateETH(&_OptimismPortal.TransactOpts)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalTransactor) FinalizeWithdrawalTransaction(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "finalizeWithdrawalTransaction", _tx)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalSession) FinalizeWithdrawalTransaction(_tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) FinalizeWithdrawalTransaction(_tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalTransactor) Initialize(opts *bind.TransactOpts, _l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "initialize", _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalSession) Initialize(_l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Initialize(&_OptimismPortal.TransactOpts, _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) Initialize(_l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Initialize(&_OptimismPortal.TransactOpts, _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalTransactor) ProveWithdrawalTransaction(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "proveWithdrawalTransaction", _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalSession) ProveWithdrawalTransaction(_tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.ProveWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) ProveWithdrawalTransaction(_tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.ProveWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_OptimismPortal *OptimismPortalTransactor) SetGasPayingToken(opts *bind.TransactOpts, _token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "setGasPayingToken", _token, _decimals, _name, _symbol)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_OptimismPortal *OptimismPortalSession) SetGasPayingToken(_token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.SetGasPayingToken(&_OptimismPortal.TransactOpts, _token, _decimals, _name, _symbol)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) SetGasPayingToken(_token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.SetGasPayingToken(&_OptimismPortal.TransactOpts, _token, _decimals, _name, _symbol)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalSession) Receive() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Receive(&_OptimismPortal.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) Receive() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Receive(&_OptimismPortal.TransactOpts)
+}
+
+// OptimismPortalInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the OptimismPortal contract.
+type OptimismPortalInitializedIterator struct {
+	Event *OptimismPortalInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalInitialized represents a Initialized event raised by the OptimismPortal contract.
+type OptimismPortalInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) FilterInitialized(opts *bind.FilterOpts) (*OptimismPortalInitializedIterator, error) {
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalInitializedIterator{contract: _OptimismPortal.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *OptimismPortalInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalInitialized)
+				if err := _OptimismPortal.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) ParseInitialized(log types.Log) (*OptimismPortalInitialized, error) {
+	event := new(OptimismPortalInitialized)
+	if err := _OptimismPortal.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalTransactionDepositedIterator is returned from FilterTransactionDeposited and is used to iterate over the raw logs and unpacked data for TransactionDeposited events raised by the OptimismPortal contract.
+type OptimismPortalTransactionDepositedIterator struct {
+	Event *OptimismPortalTransactionDeposited // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalTransactionDepositedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalTransactionDeposited)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalTransactionDeposited)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalTransactionDepositedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalTransactionDepositedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalTransactionDeposited represents a TransactionDeposited event raised by the OptimismPortal contract.
+type OptimismPortalTransactionDeposited struct {
+	From       common.Address
+	To         common.Address
+	Version    *big.Int
+	OpaqueData []byte
+	Raw        types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransactionDeposited is a free log retrieval operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) FilterTransactionDeposited(opts *bind.FilterOpts, from []common.Address, to []common.Address, version []*big.Int) (*OptimismPortalTransactionDepositedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "TransactionDeposited", fromRule, toRule, versionRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalTransactionDepositedIterator{contract: _OptimismPortal.contract, event: "TransactionDeposited", logs: logs, sub: sub}, nil
+}
+
+// WatchTransactionDeposited is a free log subscription operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) WatchTransactionDeposited(opts *bind.WatchOpts, sink chan<- *OptimismPortalTransactionDeposited, from []common.Address, to []common.Address, version []*big.Int) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "TransactionDeposited", fromRule, toRule, versionRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalTransactionDeposited)
+				if err := _OptimismPortal.contract.UnpackLog(event, "TransactionDeposited", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseTransactionDeposited is a log parse operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) ParseTransactionDeposited(log types.Log) (*OptimismPortalTransactionDeposited, error) {
+	event := new(OptimismPortalTransactionDeposited)
+	if err := _OptimismPortal.contract.UnpackLog(event, "TransactionDeposited", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalWithdrawalFinalizedIterator is returned from FilterWithdrawalFinalized and is used to iterate over the raw logs and unpacked data for WithdrawalFinalized events raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalFinalizedIterator struct {
+	Event *OptimismPortalWithdrawalFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalWithdrawalFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalWithdrawalFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalWithdrawalFinalized represents a WithdrawalFinalized event raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalFinalized struct {
+	WithdrawalHash [32]byte
+	Success        bool
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawalFinalized is a free log retrieval operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) FilterWithdrawalFinalized(opts *bind.FilterOpts, withdrawalHash [][32]byte) (*OptimismPortalWithdrawalFinalizedIterator, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "WithdrawalFinalized", withdrawalHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalWithdrawalFinalizedIterator{contract: _OptimismPortal.contract, event: "WithdrawalFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawalFinalized is a free log subscription operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) WatchWithdrawalFinalized(opts *bind.WatchOpts, sink chan<- *OptimismPortalWithdrawalFinalized, withdrawalHash [][32]byte) (event.Subscription, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "WithdrawalFinalized", withdrawalHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalWithdrawalFinalized)
+				if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawalFinalized is a log parse operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) ParseWithdrawalFinalized(log types.Log) (*OptimismPortalWithdrawalFinalized, error) {
+	event := new(OptimismPortalWithdrawalFinalized)
+	if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalWithdrawalProvenIterator is returned from FilterWithdrawalProven and is used to iterate over the raw logs and unpacked data for WithdrawalProven events raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalProvenIterator struct {
+	Event *OptimismPortalWithdrawalProven // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalWithdrawalProvenIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalWithdrawalProven)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalWithdrawalProven)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalWithdrawalProvenIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalWithdrawalProvenIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalWithdrawalProven represents a WithdrawalProven event raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalProven struct {
+	WithdrawalHash [32]byte
+	From           common.Address
+	To             common.Address
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawalProven is a free log retrieval operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) FilterWithdrawalProven(opts *bind.FilterOpts, withdrawalHash [][32]byte, from []common.Address, to []common.Address) (*OptimismPortalWithdrawalProvenIterator, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "WithdrawalProven", withdrawalHashRule, fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalWithdrawalProvenIterator{contract: _OptimismPortal.contract, event: "WithdrawalProven", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawalProven is a free log subscription operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) WatchWithdrawalProven(opts *bind.WatchOpts, sink chan<- *OptimismPortalWithdrawalProven, withdrawalHash [][32]byte, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "WithdrawalProven", withdrawalHashRule, fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalWithdrawalProven)
+				if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalProven", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawalProven is a log parse operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) ParseWithdrawalProven(log types.Log) (*OptimismPortalWithdrawalProven, error) {
+	event := new(OptimismPortalWithdrawalProven)
+	if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalProven", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-dispute-mon/config/config.go b/op-dispute-mon/config/config.go
index 5dc0f62408af..9484558fbe08 100644
--- a/op-dispute-mon/config/config.go
+++ b/op-dispute-mon/config/config.go
@@ -15,16 +15,21 @@ var (
 	ErrMissingL1EthRPC           = errors.New("missing l1 eth rpc url")
 	ErrMissingGameFactoryAddress = errors.New("missing game factory address")
 	ErrMissingRollupRpc          = errors.New("missing rollup rpc url")
+	ErrMissingMaxConcurrency     = errors.New("missing max concurrency")
 )
 
 const (
 	// DefaultGameWindow is the default maximum time duration in the past
-	// to look for games to monitor. The default value is 11 days, which
-	// is a 4 day resolution buffer plus the 7 day game finalization window.
-	DefaultGameWindow = time.Duration(11 * 24 * time.Hour)
+	// to look for games to monitor. The default value is 28 days. The worst case duration
+	// for a game is 16 days (due to clock extension), plus 7 days WETH withdrawal delay
+	// leaving a 5 day buffer to monitor games after they should be fully resolved.
+	DefaultGameWindow = 28 * 24 * time.Hour
 	// DefaultMonitorInterval is the default interval at which the dispute
 	// monitor will check for new games to monitor.
 	DefaultMonitorInterval = time.Second * 30
+
+	//DefaultMaxConcurrency is the default number of threads to use when fetching game data
+	DefaultMaxConcurrency = uint(5)
 )
 
 // Config is a well typed config that is parsed from the CLI params.
@@ -32,10 +37,13 @@ const (
 type Config struct {
 	L1EthRpc           string         // L1 RPC Url
 	GameFactoryAddress common.Address // Address of the dispute game factory
-	RollupRpc          string         // The rollup node RPC URL.
 
-	MonitorInterval time.Duration // Frequency to check for new games to monitor.
-	GameWindow      time.Duration // Maximum window to look for games to monitor.
+	HonestActors    []common.Address // List of honest actors to monitor claims for.
+	RollupRpc       string           // The rollup node RPC URL.
+	MonitorInterval time.Duration    // Frequency to check for new games to monitor.
+	GameWindow      time.Duration    // Maximum window to look for games to monitor.
+	IgnoredGames    []common.Address // Games to exclude from monitoring
+	MaxConcurrency  uint             // Maximum number of threads to use when fetching game data
 
 	MetricsConfig opmetrics.CLIConfig
 	PprofConfig   oppprof.CLIConfig
@@ -46,8 +54,10 @@ func NewConfig(gameFactoryAddress common.Address, l1EthRpc string) Config {
 		L1EthRpc:           l1EthRpc,
 		GameFactoryAddress: gameFactoryAddress,
 
+		HonestActors:    []common.Address{},
 		MonitorInterval: DefaultMonitorInterval,
 		GameWindow:      DefaultGameWindow,
+		MaxConcurrency:  DefaultMaxConcurrency,
 
 		MetricsConfig: opmetrics.DefaultCLIConfig(),
 		PprofConfig:   oppprof.DefaultCLIConfig(),
@@ -64,6 +74,9 @@ func (c Config) Check() error {
 	if c.GameFactoryAddress == (common.Address{}) {
 		return ErrMissingGameFactoryAddress
 	}
+	if c.MaxConcurrency == 0 {
+		return ErrMissingMaxConcurrency
+	}
 	if err := c.MetricsConfig.Check(); err != nil {
 		return fmt.Errorf("metrics config: %w", err)
 	}
diff --git a/op-dispute-mon/config/config_test.go b/op-dispute-mon/config/config_test.go
index d2d2ffbbdc6b..944f12918fe0 100644
--- a/op-dispute-mon/config/config_test.go
+++ b/op-dispute-mon/config/config_test.go
@@ -41,3 +41,9 @@ func TestRollupRpcRequired(t *testing.T) {
 	config.RollupRpc = ""
 	require.ErrorIs(t, config.Check(), ErrMissingRollupRpc)
 }
+
+func TestMaxConcurrencyRequired(t *testing.T) {
+	config := validConfig()
+	config.MaxConcurrency = 0
+	require.ErrorIs(t, config.Check(), ErrMissingMaxConcurrency)
+}
diff --git a/op-dispute-mon/flags/flags.go b/op-dispute-mon/flags/flags.go
index e314c7acd1f4..6e88260c0923 100644
--- a/op-dispute-mon/flags/flags.go
+++ b/op-dispute-mon/flags/flags.go
@@ -10,6 +10,7 @@ import (
 	oplog "github.com/ethereum-optimism/optimism/op-service/log"
 	opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
 	"github.com/ethereum-optimism/optimism/op-service/oppprof"
+	"github.com/ethereum/go-ethereum/common"
 )
 
 const (
@@ -33,6 +34,11 @@ var (
 		EnvVars: prefixEnvVars("GAME_FACTORY_ADDRESS"),
 	}
 	// Optional Flags
+	HonestActorsFlag = &cli.StringSliceFlag{
+		Name:    "honest-actors",
+		Usage:   "List of honest actors that are monitored for any claims that are resolved against them.",
+		EnvVars: prefixEnvVars("HONEST_ACTORS"),
+	}
 	RollupRpcFlag = &cli.StringFlag{
 		Name:    "rollup-rpc",
 		Usage:   "HTTP provider URL for the rollup node",
@@ -51,6 +57,17 @@ var (
 		EnvVars: prefixEnvVars("GAME_WINDOW"),
 		Value:   config.DefaultGameWindow,
 	}
+	IgnoredGamesFlag = &cli.StringSliceFlag{
+		Name:    "ignored-games",
+		Usage:   "List of game addresses to exclude from monitoring.",
+		EnvVars: prefixEnvVars("IGNORED_GAMES"),
+	}
+	MaxConcurrencyFlag = &cli.UintFlag{
+		Name:    "max-concurrency",
+		Usage:   "Maximum number of threads to use when fetching game data",
+		EnvVars: prefixEnvVars("MAX_CONCURRENCY"),
+		Value:   config.DefaultMaxConcurrency,
+	}
 )
 
 // requiredFlags are checked by [CheckRequired]
@@ -62,8 +79,11 @@ var requiredFlags = []cli.Flag{
 // optionalFlags is a list of unchecked cli flags
 var optionalFlags = []cli.Flag{
 	RollupRpcFlag,
+	HonestActorsFlag,
 	MonitorIntervalFlag,
 	GameWindowFlag,
+	IgnoredGamesFlag,
+	MaxConcurrencyFlag,
 }
 
 func init() {
@@ -96,6 +116,28 @@ func NewConfigFromCLI(ctx *cli.Context) (*config.Config, error) {
 		return nil, err
 	}
 
+	var actors []common.Address
+	if ctx.IsSet(HonestActorsFlag.Name) {
+		for _, addrStr := range ctx.StringSlice(HonestActorsFlag.Name) {
+			actor, err := opservice.ParseAddress(addrStr)
+			if err != nil {
+				return nil, fmt.Errorf("invalid honest actor address: %w", err)
+			}
+			actors = append(actors, actor)
+		}
+	}
+
+	var ignoredGames []common.Address
+	if ctx.IsSet(IgnoredGamesFlag.Name) {
+		for _, addrStr := range ctx.StringSlice(IgnoredGamesFlag.Name) {
+			game, err := opservice.ParseAddress(addrStr)
+			if err != nil {
+				return nil, fmt.Errorf("invalid ignored game address: %w", err)
+			}
+			ignoredGames = append(ignoredGames, game)
+		}
+	}
+
 	metricsConfig := opmetrics.ReadCLIConfig(ctx)
 	pprofConfig := oppprof.ReadCLIConfig(ctx)
 
@@ -103,9 +145,12 @@ func NewConfigFromCLI(ctx *cli.Context) (*config.Config, error) {
 		L1EthRpc:           ctx.String(L1EthRpcFlag.Name),
 		GameFactoryAddress: gameFactoryAddress,
 
+		HonestActors:    actors,
 		RollupRpc:       ctx.String(RollupRpcFlag.Name),
 		MonitorInterval: ctx.Duration(MonitorIntervalFlag.Name),
 		GameWindow:      ctx.Duration(GameWindowFlag.Name),
+		IgnoredGames:    ignoredGames,
+		MaxConcurrency:  ctx.Uint(MaxConcurrencyFlag.Name),
 
 		MetricsConfig: metricsConfig,
 		PprofConfig:   pprofConfig,
diff --git a/op-dispute-mon/metrics/metrics.go b/op-dispute-mon/metrics/metrics.go
index 0491df5933bb..417084f32874 100644
--- a/op-dispute-mon/metrics/metrics.go
+++ b/op-dispute-mon/metrics/metrics.go
@@ -4,7 +4,10 @@ import (
 	"fmt"
 	"io"
 	"math/big"
+	"strings"
+	"time"
 
+	contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	"github.com/ethereum-optimism/optimism/op-service/sources/caching"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/ethclient"
@@ -18,6 +21,36 @@ import (
 
 const Namespace = "op_dispute_mon"
 
+type ResolutionStatus uint8
+
+const (
+	// In progress
+	CompleteMaxDuration ResolutionStatus = iota
+	CompleteBeforeMaxDuration
+
+	// Resolvable
+	ResolvableMaxDuration
+	ResolvableBeforeMaxDuration
+
+	// Not resolvable
+	InProgressMaxDuration
+	InProgressBeforeMaxDuration
+)
+
+type CreditExpectation uint8
+
+const (
+	// Max Duration reached
+	CreditBelowMaxDuration CreditExpectation = iota
+	CreditEqualMaxDuration
+	CreditAboveMaxDuration
+
+	// Max Duration not reached
+	CreditBelowNonMaxDuration
+	CreditEqualNonMaxDuration
+	CreditAboveNonMaxDuration
+)
+
 type GameAgreementStatus uint8
 
 const (
@@ -34,19 +67,120 @@ const (
 	DisagreeChallengerWins
 )
 
+type ClaimStatus struct {
+	resolved     bool
+	clockExpired bool
+	firstHalf    bool
+	resolvable   bool
+}
+
+func (s ClaimStatus) AsLabels() []string {
+	labels := make([]string, 4)
+	if s.resolved {
+		labels[0] = "resolved"
+	} else {
+		labels[0] = "unresolved"
+	}
+	if s.clockExpired {
+		labels[1] = "expired"
+	} else {
+		labels[1] = "not_expired"
+	}
+	if s.firstHalf {
+		labels[2] = "first_half"
+	} else {
+		labels[2] = "second_half"
+	}
+	if s.resolvable {
+		labels[3] = "resolvable"
+	} else {
+		labels[3] = "unresolvable"
+	}
+	return labels
+}
+
+func (s ClaimStatus) String() string {
+	return strings.Join(s.AsLabels(), ", ")
+}
+
+type ClaimStatuses struct {
+	statuses map[ClaimStatus]int
+}
+
+func (c *ClaimStatuses) RecordClaim(firstHalf bool, clockExpired bool, resolvable bool, resolved bool) {
+	if c.statuses == nil {
+		c.statuses = make(map[ClaimStatus]int)
+	}
+	c.statuses[NewClaimStatus(firstHalf, clockExpired, resolvable, resolved)]++
+}
+
+// ForEachStatus iterates through all possible statuses and calls the callback function with the status and count of
+// claims. This ensures that statuses that have no claims counted against them are still considered to have 0 claims.
+func (c *ClaimStatuses) ForEachStatus(callback func(status ClaimStatus, count int)) {
+	allBools := []bool{true, false}
+	for _, firstHalf := range allBools {
+		for _, clockExpired := range allBools {
+			for _, resolvable := range allBools {
+				for _, resolved := range allBools {
+					status := NewClaimStatus(firstHalf, clockExpired, resolvable, resolved)
+					count := c.statuses[status]
+					callback(status, count)
+				}
+			}
+		}
+	}
+}
+
+func NewClaimStatus(firstHalf bool, clockExpired bool, resolvable bool, resolved bool) ClaimStatus {
+	return ClaimStatus{
+		firstHalf:    firstHalf,
+		clockExpired: clockExpired,
+		resolvable:   resolvable,
+		resolved:     resolved,
+	}
+}
+
+type HonestActorData struct {
+	PendingClaimCount int
+	ValidClaimCount   int
+	InvalidClaimCount int
+	PendingBonds      *big.Int
+	LostBonds         *big.Int
+	WonBonds          *big.Int
+}
+
 type Metricer interface {
 	RecordInfo(version string)
 	RecordUp()
 
-	RecordClaimResolutionDelayMax(delay float64)
+	RecordMonitorDuration(dur time.Duration)
+
+	RecordFailedGames(count int)
+
+	RecordHonestActorClaims(address common.Address, stats *HonestActorData)
+
+	RecordGameResolutionStatus(status ResolutionStatus, count int)
+
+	RecordCredit(expectation CreditExpectation, count int)
+
+	RecordClaims(statuses *ClaimStatuses)
+
+	RecordWithdrawalRequests(delayedWeth common.Address, matches bool, count int)
 
 	RecordOutputFetchTime(timestamp float64)
 
 	RecordGameAgreement(status GameAgreementStatus, count int)
 
+	RecordLatestProposals(latestValid, latestInvalid uint64)
+
+	RecordIgnoredGames(count int)
+
 	RecordBondCollateral(addr common.Address, required *big.Int, available *big.Int)
 
+	RecordL2Challenges(agreement bool, count int)
+
 	caching.Metrics
+	contractMetrics.ContractMetricer
 }
 
 // Metrics implementation must implement RegistryMetricer to allow the metrics server to work.
@@ -58,15 +192,31 @@ type Metrics struct {
 	factory  opmetrics.Factory
 
 	*opmetrics.CacheMetrics
+	*contractMetrics.ContractMetrics
+
+	monitorDuration prometheus.Histogram
+
+	resolutionStatus prometheus.GaugeVec
+
+	claims prometheus.GaugeVec
+
+	honestActorClaims prometheus.GaugeVec
+	honestActorBonds  prometheus.GaugeVec
+
+	withdrawalRequests prometheus.GaugeVec
 
 	info prometheus.GaugeVec
 	up   prometheus.Gauge
 
-	lastOutputFetch prometheus.Gauge
+	credits prometheus.GaugeVec
 
-	claimResolutionDelayMax prometheus.Gauge
+	lastOutputFetch prometheus.Gauge
 
-	gamesAgreement prometheus.GaugeVec
+	gamesAgreement  prometheus.GaugeVec
+	latestProposals prometheus.GaugeVec
+	ignoredGames    prometheus.Gauge
+	failedGames     prometheus.Gauge
+	l2Challenges    prometheus.GaugeVec
 
 	requiredCollateral  prometheus.GaugeVec
 	availableCollateral prometheus.GaugeVec
@@ -87,7 +237,8 @@ func NewMetrics() *Metrics {
 		registry: registry,
 		factory:  factory,
 
-		CacheMetrics: opmetrics.NewCacheMetrics(factory, Namespace, "provider_cache", "Provider cache"),
+		CacheMetrics:    opmetrics.NewCacheMetrics(factory, Namespace, "provider_cache", "Provider cache"),
+		ContractMetrics: contractMetrics.MakeContractMetrics(Namespace, factory),
 
 		info: *factory.NewGaugeVec(prometheus.GaugeOpts{
 			Namespace: Namespace,
@@ -101,15 +252,66 @@ func NewMetrics() *Metrics {
 			Name:      "up",
 			Help:      "1 if the op-challenger has finished starting up",
 		}),
+		monitorDuration: factory.NewHistogram(prometheus.HistogramOpts{
+			Namespace: Namespace,
+			Name:      "monitor_duration_seconds",
+			Help:      "Time taken to complete a cycle of updating metrics for all games",
+			Buckets:   []float64{10, 30, 60, 120, 180, 300, 600},
+		}),
 		lastOutputFetch: factory.NewGauge(prometheus.GaugeOpts{
 			Namespace: Namespace,
 			Name:      "last_output_fetch",
 			Help:      "Timestamp of the last output fetch",
 		}),
-		claimResolutionDelayMax: factory.NewGauge(prometheus.GaugeOpts{
+		honestActorClaims: *factory.NewGaugeVec(prometheus.GaugeOpts{
 			Namespace: Namespace,
-			Name:      "claim_resolution_delay_max",
-			Help:      "Maximum claim resolution delay in seconds",
+			Name:      "honest_actor_claims",
+			Help:      "Total number of claims from an honest actor",
+		}, []string{
+			"honest_actor_address",
+			"state",
+		}),
+		honestActorBonds: *factory.NewGaugeVec(prometheus.GaugeOpts{
+			Namespace: Namespace,
+			Name:      "honest_actor_bonds",
+			Help:      "Sum of bonds posted, won and lost by an honest actor",
+		}, []string{
+			"honest_actor_address",
+			"state",
+		}),
+		resolutionStatus: *factory.NewGaugeVec(prometheus.GaugeOpts{
+			Namespace: Namespace,
+			Name:      "resolution_status",
+			Help:      "Number of games categorised by whether the game is complete and whether the maximum duration has been reached",
+		}, []string{
+			"completion",
+			"max_duration",
+		}),
+		credits: *factory.NewGaugeVec(prometheus.GaugeOpts{
+			Namespace: Namespace,
+			Name:      "credits",
+			Help:      "Cumulative credits",
+		}, []string{
+			"credit",
+			"max_duration",
+		}),
+		claims: *factory.NewGaugeVec(prometheus.GaugeOpts{
+			Namespace: Namespace,
+			Name:      "claims",
+			Help:      "Claims broken down by whether they were resolved, whether the clock expired, and the game time period",
+		}, []string{
+			"resolved",
+			"clock",
+			"game_time_period",
+			"resolvable",
+		}),
+		withdrawalRequests: *factory.NewGaugeVec(prometheus.GaugeOpts{
+			Namespace: Namespace,
+			Name:      "withdrawal_requests",
+			Help:      "Number of withdrawal requests categorised by the source DelayedWETH contract and whether the withdrawal request amount matches or diverges from its fault dispute game credits",
+		}, []string{
+			"delayedWETH",
+			"credits",
 		}),
 		gamesAgreement: *factory.NewGaugeVec(prometheus.GaugeOpts{
 			Namespace: Namespace,
@@ -121,6 +323,17 @@ func NewMetrics() *Metrics {
 			"result_correctness",
 			"root_agreement",
 		}),
+		latestProposals: *factory.NewGaugeVec(prometheus.GaugeOpts{
+			Namespace: Namespace,
+			Name:      "latest_proposal",
+			Help:      "Timestamp of the most recent game with a valid or invalid root claim in unix seconds",
+		},
+			[]string{"root_agreement"}),
+		ignoredGames: factory.NewGauge(prometheus.GaugeOpts{
+			Namespace: Namespace,
+			Name:      "ignored_games",
+			Help:      "Number of games present in the game window but ignored via config",
+		}),
 		requiredCollateral: *factory.NewGaugeVec(prometheus.GaugeOpts{
 			Namespace: Namespace,
 			Name:      "bond_collateral_required",
@@ -131,6 +344,11 @@ func NewMetrics() *Metrics {
 			"delayedWETH",
 			"balance",
 		}),
+		failedGames: factory.NewGauge(prometheus.GaugeOpts{
+			Namespace: Namespace,
+			Name:      "failed_games",
+			Help:      "Number of games present in the game window but failed to be monitored",
+		}),
 		availableCollateral: *factory.NewGaugeVec(prometheus.GaugeOpts{
 			Namespace: Namespace,
 			Name:      "bond_collateral_available",
@@ -141,6 +359,15 @@ func NewMetrics() *Metrics {
 			"delayedWETH",
 			"balance",
 		}),
+		l2Challenges: *factory.NewGaugeVec(prometheus.GaugeOpts{
+			Namespace: Namespace,
+			Name:      "l2_block_challenges",
+			Help:      "Number of games where the L2 block number has been successfully challenged",
+		}, []string{
+			// Agreement with the root claim, not the actual l2 block number challenge.
+			// An l2 block number challenge with an agreement means the challenge was invalid.
+			"root_agreement",
+		}),
 	}
 }
 
@@ -168,8 +395,76 @@ func (m *Metrics) RecordUp() {
 	m.up.Set(1)
 }
 
-func (m *Metrics) RecordClaimResolutionDelayMax(delay float64) {
-	m.claimResolutionDelayMax.Set(delay)
+func (m *Metrics) RecordMonitorDuration(dur time.Duration) {
+	m.monitorDuration.Observe(dur.Seconds())
+}
+
+func (m *Metrics) RecordHonestActorClaims(address common.Address, stats *HonestActorData) {
+	m.honestActorClaims.WithLabelValues(address.Hex(), "pending").Set(float64(stats.PendingClaimCount))
+	m.honestActorClaims.WithLabelValues(address.Hex(), "invalid").Set(float64(stats.InvalidClaimCount))
+	m.honestActorClaims.WithLabelValues(address.Hex(), "valid").Set(float64(stats.ValidClaimCount))
+
+	m.honestActorBonds.WithLabelValues(address.Hex(), "pending").Set(weiToEther(stats.PendingBonds))
+	m.honestActorBonds.WithLabelValues(address.Hex(), "lost").Set(weiToEther(stats.LostBonds))
+	m.honestActorBonds.WithLabelValues(address.Hex(), "won").Set(weiToEther(stats.WonBonds))
+}
+
+func (m *Metrics) RecordGameResolutionStatus(status ResolutionStatus, count int) {
+	asLabels := func(status ResolutionStatus) []string {
+		switch status {
+		case CompleteMaxDuration:
+			return []string{"complete", "max_duration"}
+		case CompleteBeforeMaxDuration:
+			return []string{"complete", "before_max_duration"}
+		case ResolvableMaxDuration:
+			return []string{"resolvable", "max_duration"}
+		case ResolvableBeforeMaxDuration:
+			return []string{"resolvable", "before_max_duration"}
+		case InProgressMaxDuration:
+			return []string{"in_progress", "max_duration"}
+		case InProgressBeforeMaxDuration:
+			return []string{"in_progress", "before_max_duration"}
+		default:
+			panic(fmt.Errorf("unknown resolution status: %v", status))
+		}
+	}
+	m.resolutionStatus.WithLabelValues(asLabels(status)...).Set(float64(count))
+}
+
+func (m *Metrics) RecordCredit(expectation CreditExpectation, count int) {
+	asLabels := func(expectation CreditExpectation) []string {
+		switch expectation {
+		case CreditBelowMaxDuration:
+			return []string{"below", "max_duration"}
+		case CreditEqualMaxDuration:
+			return []string{"expected", "max_duration"}
+		case CreditAboveMaxDuration:
+			return []string{"above", "max_duration"}
+		case CreditBelowNonMaxDuration:
+			return []string{"below", "non_max_duration"}
+		case CreditEqualNonMaxDuration:
+			return []string{"expected", "non_max_duration"}
+		case CreditAboveNonMaxDuration:
+			return []string{"above", "non_max_duration"}
+		default:
+			panic(fmt.Errorf("unknown credit expectation: %v", expectation))
+		}
+	}
+	m.credits.WithLabelValues(asLabels(expectation)...).Set(float64(count))
+}
+
+func (m *Metrics) RecordClaims(statuses *ClaimStatuses) {
+	statuses.ForEachStatus(func(status ClaimStatus, count int) {
+		m.claims.WithLabelValues(status.AsLabels()...).Set(float64(count))
+	})
+}
+
+func (m *Metrics) RecordWithdrawalRequests(delayedWeth common.Address, matches bool, count int) {
+	credits := "matching"
+	if !matches {
+		credits = "divergent"
+	}
+	m.withdrawalRequests.WithLabelValues(delayedWeth.Hex(), credits).Set(float64(count))
 }
 
 func (m *Metrics) Document() []opmetrics.DocumentedMetric {
@@ -184,13 +479,40 @@ func (m *Metrics) RecordGameAgreement(status GameAgreementStatus, count int) {
 	m.gamesAgreement.WithLabelValues(labelValuesFor(status)...).Set(float64(count))
 }
 
+func (m *Metrics) RecordLatestProposals(latestValid, latestInvalid uint64) {
+	m.latestProposals.WithLabelValues("agree").Set(float64(latestValid))
+	m.latestProposals.WithLabelValues("disagree").Set(float64(latestInvalid))
+}
+
+func (m *Metrics) RecordIgnoredGames(count int) {
+	m.ignoredGames.Set(float64(count))
+}
+
+func (m *Metrics) RecordFailedGames(count int) {
+	m.failedGames.Set(float64(count))
+}
+
 func (m *Metrics) RecordBondCollateral(addr common.Address, required *big.Int, available *big.Int) {
-	balance := "sufficient"
+	balanceLabel := "sufficient"
+	zeroBalanceLabel := "insufficient"
 	if required.Cmp(available) > 0 {
-		balance = "insufficient"
+		balanceLabel = "insufficient"
+		zeroBalanceLabel = "sufficient"
+	}
+	m.requiredCollateral.WithLabelValues(addr.Hex(), balanceLabel).Set(weiToEther(required))
+	m.availableCollateral.WithLabelValues(addr.Hex(), balanceLabel).Set(weiToEther(available))
+
+	// If the balance is sufficient, make sure the insufficient label is zeroed out and vice versa.
+	m.requiredCollateral.WithLabelValues(addr.Hex(), zeroBalanceLabel).Set(0)
+	m.availableCollateral.WithLabelValues(addr.Hex(), zeroBalanceLabel).Set(0)
+}
+
+func (m *Metrics) RecordL2Challenges(agreement bool, count int) {
+	agree := "disagree"
+	if agreement {
+		agree = "agree"
 	}
-	m.requiredCollateral.WithLabelValues(addr.Hex(), balance).Set(weiToEther(required))
-	m.availableCollateral.WithLabelValues(addr.Hex(), balance).Set(weiToEther(available))
+	m.l2Challenges.WithLabelValues(agree).Set(float64(count))
 }
 
 const (
@@ -234,6 +556,7 @@ func labelValuesFor(status GameAgreementStatus) []string {
 		return asStrings("agree_challenger_wins", !inProgress, !correct, agree)
 	case DisagreeChallengerWins:
 		return asStrings("disagree_challenger_wins", !inProgress, correct, !agree)
+
 	default:
 		panic(fmt.Errorf("unknown game agreement status: %v", status))
 	}
diff --git a/op-dispute-mon/metrics/noop.go b/op-dispute-mon/metrics/noop.go
index 9a3625610140..237ae9d6fa2b 100644
--- a/op-dispute-mon/metrics/noop.go
+++ b/op-dispute-mon/metrics/noop.go
@@ -2,24 +2,46 @@ package metrics
 
 import (
 	"math/big"
+	"time"
 
+	contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	"github.com/ethereum/go-ethereum/common"
 )
 
-type NoopMetricsImpl struct{}
+type NoopMetricsImpl struct {
+	contractMetrics.NoopMetrics
+}
 
 var NoopMetrics Metricer = new(NoopMetricsImpl)
 
-func (*NoopMetricsImpl) RecordInfo(version string) {}
-func (*NoopMetricsImpl) RecordUp()                 {}
+func (*NoopMetricsImpl) RecordInfo(_ string) {}
+func (*NoopMetricsImpl) RecordUp()           {}
+
+func (*NoopMetricsImpl) RecordMonitorDuration(_ time.Duration) {}
 
 func (*NoopMetricsImpl) CacheAdd(_ string, _ int, _ bool) {}
 func (*NoopMetricsImpl) CacheGet(_ string, _ bool)        {}
 
-func (*NoopMetricsImpl) RecordClaimResolutionDelayMax(delay float64) {}
+func (*NoopMetricsImpl) RecordHonestActorClaims(_ common.Address, _ *HonestActorData) {}
+
+func (*NoopMetricsImpl) RecordGameResolutionStatus(_ ResolutionStatus, _ int) {}
+
+func (*NoopMetricsImpl) RecordCredit(_ CreditExpectation, _ int) {}
+
+func (*NoopMetricsImpl) RecordClaims(_ *ClaimStatuses) {}
+
+func (*NoopMetricsImpl) RecordWithdrawalRequests(_ common.Address, _ bool, _ int) {}
+
+func (*NoopMetricsImpl) RecordOutputFetchTime(_ float64) {}
+
+func (*NoopMetricsImpl) RecordGameAgreement(_ GameAgreementStatus, _ int) {}
+
+func (*NoopMetricsImpl) RecordLatestProposals(_ uint64, _ uint64) {}
+
+func (*NoopMetricsImpl) RecordIgnoredGames(_ int) {}
 
-func (*NoopMetricsImpl) RecordOutputFetchTime(timestamp float64) {}
+func (*NoopMetricsImpl) RecordFailedGames(_ int) {}
 
-func (*NoopMetricsImpl) RecordGameAgreement(status GameAgreementStatus, count int) {}
+func (*NoopMetricsImpl) RecordBondCollateral(_ common.Address, _ *big.Int, _ *big.Int) {}
 
-func (i *NoopMetricsImpl) RecordBondCollateral(_ common.Address, _ *big.Int, _ *big.Int) {}
+func (*NoopMetricsImpl) RecordL2Challenges(_ bool, _ int) {}
diff --git a/op-dispute-mon/mon/bonds/collateral.go b/op-dispute-mon/mon/bonds/collateral.go
index 67d15cbe1f10..d25112fecd05 100644
--- a/op-dispute-mon/mon/bonds/collateral.go
+++ b/op-dispute-mon/mon/bonds/collateral.go
@@ -1,43 +1,50 @@
 package bonds
 
 import (
-	"context"
-	"fmt"
 	"math/big"
 
-	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
-	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum/go-ethereum/common"
-	"golang.org/x/exp/maps"
 )
 
-type BondContract interface {
-	GetCredits(ctx context.Context, block rpcblock.Block, recipients ...common.Address) ([]*big.Int, error)
+type Collateral struct {
+	// Required is the amount of collateral required to pay out bonds.
+	Required *big.Int
+
+	// Actual is the amount of collateral actually head by the DelayedWETH contract
+	Actual *big.Int
 }
 
-// CalculateRequiredCollateral determines the minimum balance required for a fault dispute game contract in order
-// to pay the outstanding bonds and credits.
-// It returns the sum of unpaid bonds from claims, plus the sum of allocated but unclaimed credits.
-func CalculateRequiredCollateral(ctx context.Context, contract BondContract, blockHash common.Hash, claims []faultTypes.Claim) (*big.Int, error) {
-	unpaidBonds := big.NewInt(0)
-	recipients := make(map[common.Address]bool)
-	for _, claim := range claims {
-		if monTypes.ResolvedBondAmount.Cmp(claim.Bond) != 0 {
-			unpaidBonds = new(big.Int).Add(unpaidBonds, claim.Bond)
-		}
-		recipients[claim.Claimant] = true
-		if claim.CounteredBy != (common.Address{}) {
-			recipients[claim.CounteredBy] = true
+// CalculateRequiredCollateral determines the minimum balance required for each DelayedWETH contract used by a set
+// of dispute games.
+// Returns a map of DelayedWETH contract address to collateral data (required and actual amounts)
+func CalculateRequiredCollateral(games []*monTypes.EnrichedGameData) map[common.Address]Collateral {
+	result := make(map[common.Address]Collateral)
+	for _, game := range games {
+		collateral, ok := result[game.WETHContract]
+		if !ok {
+			collateral = Collateral{
+				Required: big.NewInt(0),
+				Actual:   game.ETHCollateral,
+			}
 		}
+		gameRequired := requiredCollateralForGame(game)
+		collateral.Required = new(big.Int).Add(collateral.Required, gameRequired)
+		result[game.WETHContract] = collateral
 	}
+	return result
+}
 
-	credits, err := contract.GetCredits(ctx, rpcblock.ByHash(blockHash), maps.Keys(recipients)...)
-	if err != nil {
-		return nil, fmt.Errorf("failed to load credits: %w", err)
+func requiredCollateralForGame(game *monTypes.EnrichedGameData) *big.Int {
+	required := big.NewInt(0)
+	for _, claim := range game.Claims {
+		if !claim.Resolved {
+			required = new(big.Int).Add(required, claim.Bond)
+		}
 	}
-	for _, credit := range credits {
-		unpaidBonds = new(big.Int).Add(unpaidBonds, credit)
+
+	for _, unclaimedCredit := range game.Credits {
+		required = new(big.Int).Add(required, unclaimedCredit)
 	}
-	return unpaidBonds, nil
+	return required
 }
diff --git a/op-dispute-mon/mon/bonds/collateral_test.go b/op-dispute-mon/mon/bonds/collateral_test.go
index 7445a6076315..b31bc73393bb 100644
--- a/op-dispute-mon/mon/bonds/collateral_test.go
+++ b/op-dispute-mon/mon/bonds/collateral_test.go
@@ -1,64 +1,120 @@
 package bonds
 
 import (
-	"context"
 	"math/big"
 	"testing"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
-	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/stretchr/testify/require"
 )
 
 func TestCalculateRequiredCollateral(t *testing.T) {
-	claims := []types.Claim{
-		{
-			ClaimData: types.ClaimData{
-				Bond: monTypes.ResolvedBondAmount,
+	weth1 := common.Address{0x1a}
+	weth1Balance := big.NewInt(4200)
+	weth2 := common.Address{0x2b}
+	weth2Balance := big.NewInt(6000)
+	game1 := &monTypes.EnrichedGameData{
+		Claims: []monTypes.EnrichedClaim{
+			{
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond: big.NewInt(17),
+					},
+					Claimant:    common.Address{0x01},
+					CounteredBy: common.Address{0x02},
+				},
+				Resolved: true,
 			},
-			Claimant:    common.Address{0x01},
-			CounteredBy: common.Address{0x02},
-		},
-		{
-			ClaimData: types.ClaimData{
-				Bond: big.NewInt(5),
+			{
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond: big.NewInt(5),
+					},
+					Claimant:    common.Address{0x03},
+					CounteredBy: common.Address{},
+				},
 			},
-			Claimant:    common.Address{0x03},
-			CounteredBy: common.Address{},
-		},
-		{
-			ClaimData: types.ClaimData{
-				Bond: big.NewInt(7),
+			{
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond: big.NewInt(7),
+					},
+					Claimant:    common.Address{0x03},
+					CounteredBy: common.Address{},
+				},
 			},
-			Claimant:    common.Address{0x03},
-			CounteredBy: common.Address{},
 		},
+		Credits: map[common.Address]*big.Int{
+			common.Address{0x01}: big.NewInt(2),
+			common.Address{0x04}: big.NewInt(3),
+		},
+		WETHContract:  weth1,
+		ETHCollateral: weth1Balance,
 	}
-	contract := &stubBondContract{
-		credits: map[common.Address]*big.Int{
-			{0x01}: big.NewInt(3),
-			{0x03}: big.NewInt(8),
+	game2 := &monTypes.EnrichedGameData{
+		Claims: []monTypes.EnrichedClaim{
+			{
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond: big.NewInt(10),
+					},
+					Claimant:    common.Address{0x01},
+					CounteredBy: common.Address{0x02},
+				},
+				Resolved: true,
+			},
+			{
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond: big.NewInt(6),
+					},
+					Claimant:    common.Address{0x03},
+					CounteredBy: common.Address{},
+				},
+			},
+			{
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond: big.NewInt(9),
+					},
+					Claimant:    common.Address{0x03},
+					CounteredBy: common.Address{},
+				},
+			},
+		},
+		Credits: map[common.Address]*big.Int{
+			common.Address{0x01}: big.NewInt(4),
+			common.Address{0x04}: big.NewInt(1),
 		},
+		WETHContract:  weth1,
+		ETHCollateral: weth1Balance,
 	}
-	collateral, err := CalculateRequiredCollateral(context.Background(), contract, common.Hash{0xab}, claims)
-	require.NoError(t, err)
-	require.Equal(t, collateral.Int64(), int64(5+7+3+8))
-}
-
-type stubBondContract struct {
-	credits map[common.Address]*big.Int
-}
-
-func (s *stubBondContract) GetCredits(_ context.Context, _ rpcblock.Block, recipients ...common.Address) ([]*big.Int, error) {
-	results := make([]*big.Int, len(recipients))
-	for i, recipient := range recipients {
-		credit, ok := s.credits[recipient]
-		if !ok {
-			credit = big.NewInt(0)
-		}
-		results[i] = credit
+	game3 := &monTypes.EnrichedGameData{
+		Claims: []monTypes.EnrichedClaim{
+			{
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond: big.NewInt(23),
+					},
+					Claimant:    common.Address{0x03},
+					CounteredBy: common.Address{},
+				},
+			},
+		},
+		Credits: map[common.Address]*big.Int{
+			common.Address{0x01}: big.NewInt(46),
+		},
+		WETHContract:  weth2,
+		ETHCollateral: weth2Balance,
 	}
-	return results, nil
+	actual := CalculateRequiredCollateral([]*monTypes.EnrichedGameData{game1, game2, game3})
+	require.Len(t, actual, 2)
+	require.Contains(t, actual, weth1)
+	require.Contains(t, actual, weth2)
+	require.Equal(t, actual[weth1].Required.Uint64(), uint64(5+7+2+3+6+9+4+1))
+	require.Equal(t, actual[weth1].Actual.Uint64(), weth1Balance.Uint64())
+	require.Equal(t, actual[weth2].Required.Uint64(), uint64(23+46))
+	require.Equal(t, actual[weth2].Actual.Uint64(), weth2Balance.Uint64())
 }
diff --git a/op-dispute-mon/mon/bonds/monitor.go b/op-dispute-mon/mon/bonds/monitor.go
index a84d8a4f62ee..befe914de77b 100644
--- a/op-dispute-mon/mon/bonds/monitor.go
+++ b/op-dispute-mon/mon/bonds/monitor.go
@@ -2,32 +2,125 @@ package bonds
 
 import (
 	"math/big"
+	"time"
 
-	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/transform"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/metrics"
 	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 )
 
+type RClock interface {
+	Now() time.Time
+}
+
 type BondMetrics interface {
+	RecordCredit(expectation metrics.CreditExpectation, count int)
 	RecordBondCollateral(addr common.Address, required *big.Int, available *big.Int)
 }
 
 type Bonds struct {
 	logger  log.Logger
+	clock   RClock
 	metrics BondMetrics
 }
 
-func NewBonds(logger log.Logger, metrics BondMetrics) *Bonds {
+func NewBonds(logger log.Logger, metrics BondMetrics, clock RClock) *Bonds {
 	return &Bonds{
 		logger:  logger,
+		clock:   clock,
 		metrics: metrics,
 	}
 }
 
 func (b *Bonds) CheckBonds(games []*types.EnrichedGameData) {
-	data := transform.CalculateRequiredCollateral(games)
+	data := CalculateRequiredCollateral(games)
 	for addr, collateral := range data {
+		if collateral.Required.Cmp(collateral.Actual) > 0 {
+			b.logger.Error("Insufficient collateral", "delayedWETH", addr, "required", collateral.Required, "actual", collateral.Actual)
+		}
 		b.metrics.RecordBondCollateral(addr, collateral.Required, collateral.Actual)
 	}
+
+	b.checkCredits(games)
+}
+
+func (b *Bonds) checkCredits(games []*types.EnrichedGameData) {
+	creditMetrics := make(map[metrics.CreditExpectation]int)
+
+	for _, game := range games {
+		// Check if the max duration has been reached for this game
+		duration := uint64(b.clock.Now().Unix()) - game.Timestamp
+		maxDurationReached := duration >= game.MaxClockDuration*2
+
+		// Iterate over claims, filter out resolved ones and sum up expected credits per recipient
+		expectedCredits := make(map[common.Address]*big.Int)
+		for _, claim := range game.Claims {
+			// Skip unresolved claims since these bonds will not appear in the credits.
+			if !claim.Resolved {
+				continue
+			}
+			// The recipient of a resolved claim is the claimant unless it's been countered.
+			recipient := claim.Claimant
+			if claim.IsRoot() && game.BlockNumberChallenged {
+				// The bond for the root claim is paid to the block number challenger if present
+				recipient = game.BlockNumberChallenger
+			} else if claim.CounteredBy != (common.Address{}) {
+				recipient = claim.CounteredBy
+			}
+			current := expectedCredits[recipient]
+			if current == nil {
+				current = big.NewInt(0)
+			}
+			expectedCredits[recipient] = new(big.Int).Add(current, claim.Bond)
+		}
+
+		allRecipients := make(map[common.Address]bool)
+		for address := range expectedCredits {
+			allRecipients[address] = true
+		}
+		for address := range game.Credits {
+			allRecipients[address] = true
+		}
+
+		for recipient := range allRecipients {
+			actual := game.Credits[recipient]
+			if actual == nil {
+				actual = big.NewInt(0)
+			}
+			expected := expectedCredits[recipient]
+			if expected == nil {
+				expected = big.NewInt(0)
+			}
+			comparison := actual.Cmp(expected)
+			if maxDurationReached {
+				if comparison > 0 {
+					creditMetrics[metrics.CreditAboveMaxDuration] += 1
+					b.logger.Warn("Credit above expected amount", "recipient", recipient, "expected", expected, "actual", actual, "game", game.Proxy, "duration", "reached")
+				} else if comparison == 0 {
+					creditMetrics[metrics.CreditEqualMaxDuration] += 1
+				} else {
+					creditMetrics[metrics.CreditBelowMaxDuration] += 1
+				}
+			} else {
+				if comparison > 0 {
+					creditMetrics[metrics.CreditAboveNonMaxDuration] += 1
+					b.logger.Warn("Credit above expected amount", "recipient", recipient, "expected", expected, "actual", actual, "game", game.Proxy, "duration", "unreached")
+				} else if comparison == 0 {
+					creditMetrics[metrics.CreditEqualNonMaxDuration] += 1
+				} else {
+					creditMetrics[metrics.CreditBelowNonMaxDuration] += 1
+					b.logger.Warn("Credit withdrawn early", "recipient", recipient, "expected", expected, "actual", actual, "game", game.Proxy, "duration", "unreached")
+				}
+			}
+		}
+	}
+
+	b.metrics.RecordCredit(metrics.CreditBelowMaxDuration, creditMetrics[metrics.CreditBelowMaxDuration])
+	b.metrics.RecordCredit(metrics.CreditEqualMaxDuration, creditMetrics[metrics.CreditEqualMaxDuration])
+	b.metrics.RecordCredit(metrics.CreditAboveMaxDuration, creditMetrics[metrics.CreditAboveMaxDuration])
+
+	b.metrics.RecordCredit(metrics.CreditBelowNonMaxDuration, creditMetrics[metrics.CreditBelowNonMaxDuration])
+	b.metrics.RecordCredit(metrics.CreditEqualNonMaxDuration, creditMetrics[metrics.CreditEqualNonMaxDuration])
+	b.metrics.RecordCredit(metrics.CreditAboveNonMaxDuration, creditMetrics[metrics.CreditAboveNonMaxDuration])
 }
diff --git a/op-dispute-mon/mon/bonds/monitor_test.go b/op-dispute-mon/mon/bonds/monitor_test.go
index 1cf5f65a7cff..c671458b16e7 100644
--- a/op-dispute-mon/mon/bonds/monitor_test.go
+++ b/op-dispute-mon/mon/bonds/monitor_test.go
@@ -3,20 +3,28 @@ package bonds
 import (
 	"math/big"
 	"testing"
+	"time"
 
-	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/transform"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/metrics"
 	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-service/clock"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
 )
 
+var (
+	frozen = time.Unix(int64(time.Hour.Seconds()), 0)
+)
+
 func TestCheckBonds(t *testing.T) {
 	weth1 := common.Address{0x1a}
 	weth1Balance := big.NewInt(4200)
 	weth2 := common.Address{0x2b}
-	weth2Balance := big.NewInt(6000)
+	weth2Balance := big.NewInt(10) // Insufficient
 	game1 := &monTypes.EnrichedGameData{
 		Credits: map[common.Address]*big.Int{
 			common.Address{0x01}: big.NewInt(2),
@@ -32,10 +40,7 @@ func TestCheckBonds(t *testing.T) {
 		ETHCollateral: weth2Balance,
 	}
 
-	logger := testlog.Logger(t, log.LvlInfo)
-	metrics := &stubBondMetrics{recorded: make(map[common.Address]transform.Collateral)}
-	bonds := NewBonds(logger, metrics)
-
+	bonds, metrics, logs := setupBondMetricsTest(t)
 	bonds.CheckBonds([]*monTypes.EnrichedGameData{game1, game2})
 
 	require.Len(t, metrics.recorded, 2)
@@ -45,15 +50,387 @@ func TestCheckBonds(t *testing.T) {
 	require.Equal(t, metrics.recorded[weth1].Actual.Uint64(), weth1Balance.Uint64())
 	require.Equal(t, metrics.recorded[weth2].Required.Uint64(), uint64(46))
 	require.Equal(t, metrics.recorded[weth2].Actual.Uint64(), weth2Balance.Uint64())
+
+	require.NotNil(t, logs.FindLog(
+		testlog.NewMessageFilter("Insufficient collateral"),
+		testlog.NewAttributesFilter("delayedWETH", weth2.Hex()),
+		testlog.NewAttributesFilter("required", "46"),
+		testlog.NewAttributesFilter("actual", weth2Balance.String())))
+	// No messages about weth1 since it has sufficient collateral
+	require.Nil(t, logs.FindLog(testlog.NewAttributesFilter("delayedWETH", weth1.Hex())))
+}
+
+func TestCheckRecipientCredit(t *testing.T) {
+	addr1 := common.Address{0x1a}
+	addr2 := common.Address{0x2b}
+	addr3 := common.Address{0x3c}
+	addr4 := common.Address{0x4d}
+	notRootPosition := types.NewPositionFromGIndex(big.NewInt(2))
+	// Game has not reached max duration
+	game1 := &monTypes.EnrichedGameData{
+		MaxClockDuration: 50000,
+		GameMetadata: gameTypes.GameMetadata{
+			Proxy:     common.Address{0x11},
+			Timestamp: uint64(frozen.Unix()),
+		},
+		Claims: []monTypes.EnrichedClaim{
+			{ // Expect 10 credits for addr1
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(10),
+						Position: types.RootPosition,
+					},
+					Claimant: addr1,
+				},
+				Resolved: true,
+			},
+			{ // No expected credits as not resolved
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(15),
+						Position: notRootPosition,
+					},
+					Claimant: addr1,
+				},
+				Resolved: false,
+			},
+			{ // Expect 5 credits for addr1
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(5),
+						Position: notRootPosition,
+					},
+					Claimant: addr1,
+				},
+				Resolved: true,
+			},
+			{ // Expect 7 credits for addr2
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(7),
+						Position: notRootPosition,
+					},
+					Claimant:    addr3,
+					CounteredBy: addr2,
+				},
+				Resolved: true,
+			},
+			{ // Expect 3 credits for addr4
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(3),
+						Position: notRootPosition,
+					},
+					Claimant: addr4,
+				},
+				Resolved: true,
+			},
+		},
+		Credits: map[common.Address]*big.Int{
+			// addr1 has correct credits
+			addr1: big.NewInt(10 + 5),
+			// addr2 has too few credits
+			addr2: big.NewInt(2),
+			// addr3 has too many credits
+			addr3: big.NewInt(1),
+			// addr4 has too few (no) credits
+		},
+		WETHContract:  common.Address{0xff},
+		ETHCollateral: big.NewInt(6000),
+	}
+	// Max duration has been reached
+	game2 := &monTypes.EnrichedGameData{
+		MaxClockDuration: 5,
+		GameMetadata: gameTypes.GameMetadata{
+			Proxy:     common.Address{0x22},
+			Timestamp: uint64(frozen.Unix()) - 11,
+		},
+		Claims: []monTypes.EnrichedClaim{
+			{ // Expect 11 credits for addr1
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(11),
+						Position: types.RootPosition,
+					},
+					Claimant: addr1,
+				},
+				Resolved: true,
+			},
+			{ // No expected credits as not resolved
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(15),
+						Position: notRootPosition,
+					},
+					Claimant: addr1,
+				},
+				Resolved: false,
+			},
+			{ // Expect 6 credits for addr1
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(6),
+						Position: notRootPosition,
+					},
+					Claimant: addr1,
+				},
+				Resolved: true,
+			},
+			{ // Expect 8 credits for addr2
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(8),
+						Position: notRootPosition,
+					},
+					Claimant:    addr3,
+					CounteredBy: addr2,
+				},
+				Resolved: true,
+			},
+			{ // Expect 4 credits for addr4
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(4),
+						Position: notRootPosition,
+					},
+					Claimant: addr4,
+				},
+				Resolved: true,
+			},
+		},
+		Credits: map[common.Address]*big.Int{
+			// addr1 has too few credits
+			addr1: big.NewInt(10),
+			// addr2 has correct credits
+			addr2: big.NewInt(8),
+			// addr3 has too many credits
+			addr3: big.NewInt(1),
+			// addr4 has correct credits
+			addr4: big.NewInt(4),
+		},
+		WETHContract:  common.Address{0xff},
+		ETHCollateral: big.NewInt(6000),
+	}
+
+	// Game has not reached max duration
+	game3 := &monTypes.EnrichedGameData{
+		MaxClockDuration: 50000,
+		GameMetadata: gameTypes.GameMetadata{
+			Proxy:     common.Address{0x33},
+			Timestamp: uint64(frozen.Unix()) - 11,
+		},
+		Claims: []monTypes.EnrichedClaim{
+			{ // Expect 9 credits for addr1
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(9),
+						Position: types.RootPosition,
+					},
+					Claimant: addr1,
+				},
+				Resolved: true,
+			},
+			{ // Expect 6 credits for addr2
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(6),
+						Position: notRootPosition,
+					},
+					Claimant:    addr4,
+					CounteredBy: addr2,
+				},
+				Resolved: true,
+			},
+			{ // Expect 2 credits for addr4
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(2),
+						Position: notRootPosition,
+					},
+					Claimant: addr4,
+				},
+				Resolved: true,
+			},
+		},
+		Credits: map[common.Address]*big.Int{
+			// addr1 has correct credits
+			addr1: big.NewInt(9),
+			// addr2 has too few credits
+			addr2: big.NewInt(5),
+			// addr3 is not involved in this game
+			// addr4 has too many credits
+			addr4: big.NewInt(3),
+		},
+		WETHContract:  common.Address{0xff},
+		ETHCollateral: big.NewInt(6000),
+	}
+
+	// Game has not reached max duration
+	game4 := &monTypes.EnrichedGameData{
+		MaxClockDuration: 10,
+		GameMetadata: gameTypes.GameMetadata{
+			Proxy:     common.Address{44},
+			Timestamp: uint64(frozen.Unix()) - 22,
+		},
+		BlockNumberChallenged: true,
+		BlockNumberChallenger: addr1,
+		Claims: []monTypes.EnrichedClaim{
+			{ // Expect 9 credits for addr1 as the block number challenger
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(9),
+						Position: types.RootPosition,
+					},
+					Claimant:    addr2,
+					CounteredBy: addr3,
+				},
+				Resolved: true,
+			},
+			{ // Expect 6 credits for addr2
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(6),
+						Position: notRootPosition,
+					},
+					Claimant:    addr4,
+					CounteredBy: addr2,
+				},
+				Resolved: true,
+			},
+			{ // Expect 2 credits for addr4
+				Claim: types.Claim{
+					ClaimData: types.ClaimData{
+						Bond:     big.NewInt(2),
+						Position: notRootPosition,
+					},
+					Claimant: addr4,
+				},
+				Resolved: true,
+			},
+		},
+		Credits: map[common.Address]*big.Int{
+			// addr1 has correct credits
+			addr1: big.NewInt(9),
+			// addr2 has too few credits
+			addr2: big.NewInt(5),
+			// addr3 is not involved in this game
+			// addr4 has too many credits
+			addr4: big.NewInt(3),
+		},
+		WETHContract:  common.Address{0xff},
+		ETHCollateral: big.NewInt(6000),
+	}
+
+	bonds, m, logs := setupBondMetricsTest(t)
+	bonds.CheckBonds([]*monTypes.EnrichedGameData{game1, game2, game3, game4})
+
+	require.Len(t, m.credits, 6)
+	require.Contains(t, m.credits, metrics.CreditBelowMaxDuration)
+	require.Contains(t, m.credits, metrics.CreditEqualMaxDuration)
+	require.Contains(t, m.credits, metrics.CreditAboveMaxDuration)
+	require.Contains(t, m.credits, metrics.CreditBelowNonMaxDuration)
+	require.Contains(t, m.credits, metrics.CreditEqualNonMaxDuration)
+	require.Contains(t, m.credits, metrics.CreditAboveNonMaxDuration)
+
+	// Game 2 and 4 recipients added here as it has reached max duration
+	require.Equal(t, 2, m.credits[metrics.CreditBelowMaxDuration], "CreditBelowMaxDuration")
+	require.Equal(t, 3, m.credits[metrics.CreditEqualMaxDuration], "CreditEqualMaxDuration")
+	require.Equal(t, 2, m.credits[metrics.CreditAboveMaxDuration], "CreditAboveMaxDuration")
+
+	// Game 1 and 3 recipients added here as it hasn't reached max duration
+	require.Equal(t, 3, m.credits[metrics.CreditBelowNonMaxDuration], "CreditBelowNonMaxDuration")
+	require.Equal(t, 2, m.credits[metrics.CreditEqualNonMaxDuration], "CreditEqualNonMaxDuration")
+	require.Equal(t, 2, m.credits[metrics.CreditAboveNonMaxDuration], "CreditAboveNonMaxDuration")
+
+	// Logs from game1
+	// addr1 is correct so has no logs
+	// addr2 is below expected before max duration, so warn about early withdrawal
+	require.NotNil(t, logs.FindLog(
+		testlog.NewLevelFilter(log.LevelWarn),
+		testlog.NewMessageFilter("Credit withdrawn early"),
+		testlog.NewAttributesFilter("game", game1.Proxy.Hex()),
+		testlog.NewAttributesFilter("recipient", addr2.Hex()),
+		testlog.NewAttributesFilter("duration", "unreached")))
+	// addr3 is above expected
+	require.NotNil(t, logs.FindLog(
+		testlog.NewLevelFilter(log.LevelWarn),
+		testlog.NewMessageFilter("Credit above expected amount"),
+		testlog.NewAttributesFilter("game", game1.Proxy.Hex()),
+		testlog.NewAttributesFilter("recipient", addr3.Hex()),
+		testlog.NewAttributesFilter("duration", "unreached")))
+	// addr4 is below expected before max duration, so warn about early withdrawal
+	require.NotNil(t, logs.FindLog(
+		testlog.NewLevelFilter(log.LevelWarn),
+		testlog.NewMessageFilter("Credit withdrawn early"),
+		testlog.NewAttributesFilter("game", game1.Proxy.Hex()),
+		testlog.NewAttributesFilter("recipient", addr4.Hex()),
+		testlog.NewAttributesFilter("duration", "unreached")))
+
+	// Logs from game 2
+	// addr1 is below expected - no warning as withdrawals may now be possible
+	// addr2 is correct
+	// addr3 is above expected - warn
+	require.NotNil(t, logs.FindLog(
+		testlog.NewLevelFilter(log.LevelWarn),
+		testlog.NewMessageFilter("Credit above expected amount"),
+		testlog.NewAttributesFilter("game", game2.Proxy.Hex()),
+		testlog.NewAttributesFilter("recipient", addr3.Hex()),
+		testlog.NewAttributesFilter("duration", "reached")))
+	// addr4 is correct
+
+	// Logs from game 3
+	// addr1 is correct so has no logs
+	// addr2 is below expected before max duration, so warn about early withdrawal
+	require.NotNil(t, logs.FindLog(
+		testlog.NewLevelFilter(log.LevelWarn),
+		testlog.NewMessageFilter("Credit withdrawn early"),
+		testlog.NewAttributesFilter("game", game3.Proxy.Hex()),
+		testlog.NewAttributesFilter("recipient", addr2.Hex()),
+		testlog.NewAttributesFilter("duration", "unreached")))
+	// addr3 is not involved so no logs
+	// addr4 is above expected before max duration, so warn
+	require.NotNil(t, logs.FindLog(
+		testlog.NewLevelFilter(log.LevelWarn),
+		testlog.NewMessageFilter("Credit above expected amount"),
+		testlog.NewAttributesFilter("game", game3.Proxy.Hex()),
+		testlog.NewAttributesFilter("recipient", addr4.Hex()),
+		testlog.NewAttributesFilter("duration", "unreached")))
+
+	// Logs from game 4
+	// addr1 is correct so has no logs
+	// addr2 is below expected before max duration, no long because withdrawals may be possible
+	// addr3 is not involved so no logs
+	// addr4 is above expected before max duration, so warn
+	require.NotNil(t, logs.FindLog(
+		testlog.NewLevelFilter(log.LevelWarn),
+		testlog.NewMessageFilter("Credit above expected amount"),
+		testlog.NewAttributesFilter("game", game4.Proxy.Hex()),
+		testlog.NewAttributesFilter("recipient", addr4.Hex()),
+		testlog.NewAttributesFilter("duration", "reached")))
+}
+
+func setupBondMetricsTest(t *testing.T) (*Bonds, *stubBondMetrics, *testlog.CapturingHandler) {
+	logger, logs := testlog.CaptureLogger(t, log.LvlInfo)
+	metrics := &stubBondMetrics{
+		credits:  make(map[metrics.CreditExpectation]int),
+		recorded: make(map[common.Address]Collateral),
+	}
+	bonds := NewBonds(logger, metrics, clock.NewDeterministicClock(frozen))
+	return bonds, metrics, logs
 }
 
 type stubBondMetrics struct {
-	recorded map[common.Address]transform.Collateral
+	credits  map[metrics.CreditExpectation]int
+	recorded map[common.Address]Collateral
 }
 
 func (s *stubBondMetrics) RecordBondCollateral(addr common.Address, required *big.Int, available *big.Int) {
-	s.recorded[addr] = transform.Collateral{
+	s.recorded[addr] = Collateral{
 		Required: required,
 		Actual:   available,
 	}
 }
+
+func (s *stubBondMetrics) RecordCredit(expectation metrics.CreditExpectation, count int) {
+	s.credits[expectation] = count
+}
diff --git a/op-dispute-mon/mon/claims.go b/op-dispute-mon/mon/claims.go
new file mode 100644
index 000000000000..2789ef4e6dc9
--- /dev/null
+++ b/op-dispute-mon/mon/claims.go
@@ -0,0 +1,138 @@
+package mon
+
+import (
+	"math/big"
+	"time"
+
+	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/metrics"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/log"
+)
+
+const MaximumResolutionResponseBuffer = time.Minute
+
+type RClock interface {
+	Now() time.Time
+}
+
+type ClaimMetrics interface {
+	RecordClaims(statuses *metrics.ClaimStatuses)
+	RecordHonestActorClaims(address common.Address, data *metrics.HonestActorData)
+}
+
+type ClaimMonitor struct {
+	logger       log.Logger
+	clock        RClock
+	honestActors map[common.Address]bool // Map for efficient lookup
+	metrics      ClaimMetrics
+}
+
+func NewClaimMonitor(logger log.Logger, clock RClock, honestActors []common.Address, metrics ClaimMetrics) *ClaimMonitor {
+	actors := make(map[common.Address]bool)
+	for _, actor := range honestActors {
+		actors[actor] = true
+	}
+	return &ClaimMonitor{logger, clock, actors, metrics}
+}
+
+func (c *ClaimMonitor) CheckClaims(games []*types.EnrichedGameData) {
+	claimStatuses := &metrics.ClaimStatuses{}
+	honest := make(map[common.Address]*metrics.HonestActorData)
+	for actor := range c.honestActors {
+		honest[actor] = &metrics.HonestActorData{
+			PendingBonds: big.NewInt(0),
+			LostBonds:    big.NewInt(0),
+			WonBonds:     big.NewInt(0),
+		}
+	}
+	for _, game := range games {
+		c.checkGameClaims(game, claimStatuses, honest)
+	}
+	c.metrics.RecordClaims(claimStatuses)
+	for actor := range c.honestActors {
+		c.metrics.RecordHonestActorClaims(actor, honest[actor])
+	}
+}
+
+func (c *ClaimMonitor) checkUpdateHonestActorStats(proxy common.Address, claim *types.EnrichedClaim, honest map[common.Address]*metrics.HonestActorData) {
+	if !claim.Resolved {
+		if c.honestActors[claim.Claimant] {
+			honest[claim.Claimant].PendingClaimCount++
+			honest[claim.Claimant].PendingBonds = new(big.Int).Add(honest[claim.Claimant].PendingBonds, claim.Bond)
+		}
+		return
+	}
+	if c.honestActors[claim.Claimant] {
+		actor := claim.Claimant
+		if claim.CounteredBy != (common.Address{}) {
+			honest[actor].InvalidClaimCount++
+			honest[actor].LostBonds = new(big.Int).Add(honest[actor].LostBonds, claim.Bond)
+			c.logger.Error("Claim resolved against honest actor", "game", proxy, "honestActor", actor, "counteredBy", claim.CounteredBy, "claimContractIndex", claim.ContractIndex, "bondAmount", claim.Bond)
+		} else {
+			honest[actor].ValidClaimCount++
+			// Note that we don't count refunded bonds as won
+		}
+	}
+	if c.honestActors[claim.CounteredBy] {
+		honest[claim.CounteredBy].WonBonds = new(big.Int).Add(honest[claim.CounteredBy].WonBonds, claim.Bond)
+	}
+}
+
+func (c *ClaimMonitor) checkGameClaims(
+	game *types.EnrichedGameData,
+	claimStatuses *metrics.ClaimStatuses,
+	honest map[common.Address]*metrics.HonestActorData,
+) {
+	// Check if the game is in the first half
+	now := c.clock.Now()
+	duration := uint64(now.Unix()) - game.Timestamp
+	firstHalf := duration <= game.MaxClockDuration
+
+	minDescendantAccumulatedTimeByIndex := make(map[int]time.Duration)
+
+	// Iterate over the game's claims
+	// Reverse order so we can track whether the claim has unresolvable children
+	for i := len(game.Claims) - 1; i >= 0; i-- {
+		claim := game.Claims[i]
+		c.checkUpdateHonestActorStats(game.Proxy, &claim, honest)
+
+		// Check if the clock has expired
+		if firstHalf && claim.Resolved {
+			c.logger.Error("Claim resolved in the first half of the game duration", "game", game.Proxy, "claimContractIndex", claim.ContractIndex, "clock", duration)
+		}
+
+		maxChessTime := time.Duration(game.MaxClockDuration) * time.Second
+		var parent faultTypes.Claim
+		if !claim.IsRoot() {
+			parent = game.Claims[claim.ParentContractIndex].Claim
+		}
+		accumulatedTime := faultTypes.ChessClock(now, claim.Claim, parent)
+
+		// Calculate the minimum accumulated time of this claim or any of its descendants
+		minAccumulatedTime, ok := minDescendantAccumulatedTimeByIndex[claim.ContractIndex]
+		if !ok || accumulatedTime < minAccumulatedTime {
+			minAccumulatedTime = accumulatedTime
+		}
+		// Update the minimum accumulated time for the parent claim to include this claim's time.
+		curr, ok := minDescendantAccumulatedTimeByIndex[claim.ParentContractIndex]
+		if !ok || minAccumulatedTime < curr {
+			minDescendantAccumulatedTimeByIndex[claim.ParentContractIndex] = minAccumulatedTime
+		}
+
+		// Our clock is expired based on this claim accumulated time (can any more counter claims be posted)
+		clockExpired := accumulatedTime >= maxChessTime
+		// This claim is only resolvable if it and all it's descendants have expired clocks
+		resolvable := minAccumulatedTime >= maxChessTime
+
+		claimStatuses.RecordClaim(firstHalf, clockExpired, resolvable, claim.Resolved)
+		if !claim.Resolved && resolvable {
+			// SAFETY: minAccumulatedTime must be larger than or equal to maxChessTime since the claim is resolvable
+			overflow := minAccumulatedTime - maxChessTime
+			if overflow >= MaximumResolutionResponseBuffer {
+				c.logger.Warn("Claim unresolved after clock expiration", "game", game.Proxy, "claimContractIndex", claim.ContractIndex, "delay", overflow)
+			}
+		}
+	}
+}
diff --git a/op-dispute-mon/mon/claims_test.go b/op-dispute-mon/mon/claims_test.go
new file mode 100644
index 000000000000..d5e9578e4f05
--- /dev/null
+++ b/op-dispute-mon/mon/claims_test.go
@@ -0,0 +1,292 @@
+package mon
+
+import (
+	"fmt"
+	"math/big"
+	"testing"
+	"time"
+
+	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/metrics"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-service/clock"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/stretchr/testify/require"
+)
+
+var frozen = time.Unix(int64(time.Hour.Seconds()), 0)
+
+func TestClaimMonitor_CheckClaims(t *testing.T) {
+	t.Run("RecordsClaims", func(t *testing.T) {
+		monitor, cl, cMetrics, _ := newTestClaimMonitor(t)
+		games := makeMultipleTestGames(uint64(cl.Now().Unix()))
+		monitor.CheckClaims(games)
+
+		for status, count := range cMetrics.calls {
+			fmt.Printf("%v: %v \n", status, count)
+		}
+
+		// Test data is a bit weird and has unresolvable claims that have been resolved
+		require.Equal(t, 2, cMetrics.calls[metrics.NewClaimStatus(true, true, false, true)])
+		require.Equal(t, 1, cMetrics.calls[metrics.NewClaimStatus(true, true, true, false)])
+		require.Equal(t, 1, cMetrics.calls[metrics.NewClaimStatus(true, false, false, true)])
+		require.Equal(t, 1, cMetrics.calls[metrics.NewClaimStatus(true, false, false, false)])
+
+		// Test data is a bit weird and has unresolvable claims that have been resolved
+		require.Equal(t, 2, cMetrics.calls[metrics.NewClaimStatus(false, true, false, true)])
+		require.Equal(t, 1, cMetrics.calls[metrics.NewClaimStatus(false, true, true, false)])
+		require.Equal(t, 1, cMetrics.calls[metrics.NewClaimStatus(false, false, false, true)])
+		require.Equal(t, 1, cMetrics.calls[metrics.NewClaimStatus(false, false, false, false)])
+	})
+
+	t.Run("ZeroRecordsClaims", func(t *testing.T) {
+		monitor, _, cMetrics, _ := newTestClaimMonitor(t)
+		var games []*types.EnrichedGameData
+		monitor.CheckClaims(games)
+		// Should record 0 values for true and false variants of the four fields in ClaimStatus
+		require.Len(t, cMetrics.calls, 2*2*2*2)
+	})
+
+	t.Run("ConsiderChildResolvability", func(t *testing.T) {
+		monitor, _, cMetrics, logs := newTestClaimMonitor(t)
+		chessClockDuration := 10 * time.Minute
+		// Game started long enough ago that the root chess clock has now expired
+		gameStart := frozen.Add(-chessClockDuration - 15*time.Minute)
+		games := []*types.EnrichedGameData{
+			{
+				MaxClockDuration: uint64(chessClockDuration.Seconds()),
+				GameMetadata: gameTypes.GameMetadata{
+					Proxy:     common.Address{0xaa},
+					Timestamp: 50,
+				},
+				Claims: []types.EnrichedClaim{
+					{
+						Claim: faultTypes.Claim{
+							ContractIndex: 0,
+							ClaimData: faultTypes.ClaimData{
+								Position: faultTypes.RootPosition,
+							},
+							Clock: faultTypes.NewClock(time.Duration(0), gameStart),
+						},
+						Resolved: false,
+					},
+					{
+						Claim: faultTypes.Claim{ // Fast challenge, clock has expired
+							ContractIndex:       1,
+							ParentContractIndex: 0,
+							ClaimData: faultTypes.ClaimData{
+								Position: faultTypes.RootPosition,
+							},
+							Clock: faultTypes.NewClock(1*time.Minute, gameStart.Add(1*time.Minute)),
+						},
+						Resolved: false,
+					},
+					{
+						Claim: faultTypes.Claim{ // Fast counter to fast challenge, clock has expired, resolved
+							ContractIndex:       2,
+							ParentContractIndex: 1,
+							ClaimData: faultTypes.ClaimData{
+								Position: faultTypes.RootPosition,
+							},
+							Clock: faultTypes.NewClock(1*time.Minute, gameStart.Add((1+1)*time.Minute)),
+						},
+						Resolved: true,
+					},
+					{
+						Claim: faultTypes.Claim{ // Second fast counter to fast challenge, clock has expired, not resolved
+							ContractIndex:       3,
+							ParentContractIndex: 1,
+							ClaimData: faultTypes.ClaimData{
+								Position: faultTypes.RootPosition,
+							},
+							Clock: faultTypes.NewClock(1*time.Minute, gameStart.Add((1+1)*time.Minute)),
+						},
+						Resolved: false,
+					},
+					{
+						Claim: faultTypes.Claim{ // Challenge, clock has not yet expired
+							ContractIndex:       4,
+							ParentContractIndex: 0,
+							ClaimData: faultTypes.ClaimData{
+								Position: faultTypes.RootPosition,
+							},
+							Clock: faultTypes.NewClock(20*time.Minute, gameStart.Add(20*time.Minute)),
+						},
+						Resolved: false,
+					},
+					{
+						Claim: faultTypes.Claim{ // Counter to challenge, clock hasn't expired yet
+							ContractIndex:       5,
+							ParentContractIndex: 4,
+							ClaimData: faultTypes.ClaimData{
+								Position: faultTypes.RootPosition,
+							},
+							Clock: faultTypes.NewClock(1*time.Minute, gameStart.Add((20+1)*time.Minute)),
+						},
+						Resolved: false,
+					},
+				},
+			},
+		}
+		monitor.CheckClaims(games)
+		expected := &metrics.ClaimStatuses{}
+		// Root claim - clock expired, but not resolvable because of child claims
+		expected.RecordClaim(false, true, false, false)
+		// Claim 1 - clock expired, resolvable as both children are resolvable even though only one is resolved
+		expected.RecordClaim(false, true, true, false)
+		// Claim 2 - clock expired, resolvable and resolved
+		expected.RecordClaim(false, true, true, true)
+		// Claim 3 - clock expired, resolvable but not resolved
+		expected.RecordClaim(false, true, true, false)
+		// Claim 4 - clock not expired
+		expected.RecordClaim(false, false, false, false)
+		// Claim 5 - clock not expired
+		expected.RecordClaim(false, false, false, false)
+
+		expected.ForEachStatus(func(status metrics.ClaimStatus, count int) {
+			require.Equalf(t, count, cMetrics.calls[status], "status %v", status)
+		})
+
+		unresolvedClaimMsg := testlog.NewMessageFilter("Claim unresolved after clock expiration")
+		claim1Warn := logs.FindLog(unresolvedClaimMsg, testlog.NewAttributesFilter("claimContractIndex", "1"))
+		require.NotNil(t, claim1Warn, "Should warn about claim 1 being unresolved")
+		claim3Warn := logs.FindLog(unresolvedClaimMsg, testlog.NewAttributesFilter("claimContractIndex", "3"))
+		require.NotNil(t, claim3Warn, "Should warn about claim 3 being unresolved")
+
+		require.Equal(t, claim3Warn.AttrValue("delay"), claim1Warn.AttrValue("delay"),
+			"Claim 1 should have same delay as claim 3 as it could not be resolved before claim 3 clock expired")
+	})
+
+	t.Run("RecordsUnexpectedClaimResolution", func(t *testing.T) {
+		monitor, cl, cMetrics, _ := newTestClaimMonitor(t)
+		games := makeMultipleTestGames(uint64(cl.Now().Unix()))
+		monitor.CheckClaims(games)
+
+		// Should only have entries for honest actors
+		require.Contains(t, cMetrics.honest, common.Address{0x01})
+		require.Contains(t, cMetrics.honest, common.Address{0x02})
+		require.NotContains(t, cMetrics.honest, common.Address{0x03})
+		require.NotContains(t, cMetrics.honest, common.Address{0x04})
+
+		actor1 := cMetrics.honest[common.Address{0x01}]
+		actor2 := cMetrics.honest[common.Address{0x02}]
+		// Our honest actors 0x01 has claims resolved against them (1 per game)
+		require.Equal(t, 2, actor1.InvalidClaimCount)
+		require.Equal(t, 0, actor1.ValidClaimCount)
+		require.Equal(t, 2, actor1.PendingClaimCount)
+		require.EqualValues(t, 4, actor1.LostBonds.Int64())
+		require.EqualValues(t, 0, actor1.WonBonds.Int64())
+		require.EqualValues(t, 10, actor1.PendingBonds.Int64())
+
+		require.Equal(t, 0, actor2.InvalidClaimCount)
+		require.Equal(t, 2, actor2.ValidClaimCount)
+		require.Equal(t, 0, actor2.PendingClaimCount)
+		require.EqualValues(t, 0, actor2.LostBonds.Int64())
+		require.EqualValues(t, 6, actor2.WonBonds.Int64())
+		require.EqualValues(t, 0, actor2.PendingBonds.Int64())
+	})
+}
+
+func newTestClaimMonitor(t *testing.T) (*ClaimMonitor, *clock.DeterministicClock, *stubClaimMetrics, *testlog.CapturingHandler) {
+	logger, handler := testlog.CaptureLogger(t, log.LvlInfo)
+	cl := clock.NewDeterministicClock(frozen)
+	metrics := &stubClaimMetrics{}
+	honestActors := []common.Address{
+		{0x01},
+		{0x02},
+	}
+	monitor := NewClaimMonitor(logger, cl, honestActors, metrics)
+	return monitor, cl, metrics, handler
+}
+
+type stubClaimMetrics struct {
+	calls  map[metrics.ClaimStatus]int
+	honest map[common.Address]metrics.HonestActorData
+}
+
+func (s *stubClaimMetrics) RecordClaims(statuses *metrics.ClaimStatuses) {
+	if s.calls == nil {
+		s.calls = make(map[metrics.ClaimStatus]int)
+	}
+	statuses.ForEachStatus(func(status metrics.ClaimStatus, count int) {
+		s.calls[status] = count
+	})
+}
+
+func (s *stubClaimMetrics) RecordHonestActorClaims(address common.Address, data *metrics.HonestActorData) {
+	if s.honest == nil {
+		s.honest = make(map[common.Address]metrics.HonestActorData)
+	}
+	s.honest[address] = *data
+}
+
+func makeMultipleTestGames(duration uint64) []*types.EnrichedGameData {
+	return []*types.EnrichedGameData{
+		makeTestGame(duration),      // first half
+		makeTestGame(duration * 10), // second half
+	}
+}
+
+func makeTestGame(duration uint64) *types.EnrichedGameData {
+	return &types.EnrichedGameData{
+		MaxClockDuration: duration / 2,
+		Recipients: map[common.Address]bool{
+			{0x02}: true,
+			{0x03}: true,
+			{0x04}: true,
+		},
+		Claims: []types.EnrichedClaim{
+			{
+				Claim: faultTypes.Claim{
+					Clock:    faultTypes.NewClock(time.Duration(0), frozen),
+					Claimant: common.Address{0x02},
+					ClaimData: faultTypes.ClaimData{
+						Bond: big.NewInt(1),
+					},
+				},
+				Resolved: true,
+			},
+			{
+				Claim: faultTypes.Claim{
+					Claimant:    common.Address{0x01},
+					CounteredBy: common.Address{0x03},
+					ClaimData: faultTypes.ClaimData{
+						Bond: big.NewInt(2),
+					},
+				},
+				Resolved: true,
+			},
+			{
+				Claim: faultTypes.Claim{
+					Claimant:    common.Address{0x04},
+					CounteredBy: common.Address{0x02},
+					ClaimData: faultTypes.ClaimData{
+						Bond: big.NewInt(3),
+					},
+				},
+				Resolved: true,
+			},
+			{
+				Claim: faultTypes.Claim{
+					Claimant:    common.Address{0x04},
+					CounteredBy: common.Address{0x02},
+					Clock:       faultTypes.NewClock(time.Duration(0), frozen),
+					ClaimData: faultTypes.ClaimData{
+						Bond: big.NewInt(4),
+					},
+				},
+			},
+			{
+				Claim: faultTypes.Claim{
+					Claimant: common.Address{0x01},
+					ClaimData: faultTypes.ClaimData{
+						Bond: big.NewInt(5),
+					},
+				},
+			},
+		},
+	}
+}
diff --git a/op-dispute-mon/mon/validator.go b/op-dispute-mon/mon/extract/agreement_enricher.go
similarity index 51%
rename from op-dispute-mon/mon/validator.go
rename to op-dispute-mon/mon/extract/agreement_enricher.go
index 32e1e879db5d..dafa09cba938 100644
--- a/op-dispute-mon/mon/validator.go
+++ b/op-dispute-mon/mon/extract/agreement_enricher.go
@@ -1,4 +1,4 @@
-package mon
+package extract
 
 import (
 	"context"
@@ -6,6 +6,8 @@ import (
 	"strings"
 	"time"
 
+	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 
@@ -21,47 +23,49 @@ type OutputMetrics interface {
 	RecordOutputFetchTime(float64)
 }
 
-type outputValidator struct {
+type AgreementEnricher struct {
 	log     log.Logger
 	metrics OutputMetrics
 	client  OutputRollupClient
 }
 
-func newOutputValidator(logger log.Logger, metrics OutputMetrics, client OutputRollupClient) *outputValidator {
-	return &outputValidator{
+func NewAgreementEnricher(logger log.Logger, metrics OutputMetrics, client OutputRollupClient) *AgreementEnricher {
+	return &AgreementEnricher{
 		log:     logger,
 		metrics: metrics,
 		client:  client,
 	}
 }
 
-// CheckRootAgreement validates the specified root claim against the output at the given block number.
-func (o *outputValidator) CheckRootAgreement(ctx context.Context, l1HeadNum uint64, l2BlockNum uint64, rootClaim common.Hash) (bool, common.Hash, error) {
-	output, err := o.client.OutputAtBlock(ctx, l2BlockNum)
+// Enrich validates the specified root claim against the output at the given block number.
+func (o *AgreementEnricher) Enrich(ctx context.Context, block rpcblock.Block, caller GameCaller, game *monTypes.EnrichedGameData) error {
+	output, err := o.client.OutputAtBlock(ctx, game.L2BlockNumber)
 	if err != nil {
 		// string match as the error comes from the remote server so we can't use Errors.Is sadly.
 		if strings.Contains(err.Error(), "not found") {
 			// Output root doesn't exist, so we must disagree with it.
-			return false, common.Hash{}, nil
+			game.AgreeWithClaim = false
+			return nil
 		}
-		return false, common.Hash{}, fmt.Errorf("failed to get output at block: %w", err)
+		return fmt.Errorf("failed to get output at block: %w", err)
 	}
 	o.metrics.RecordOutputFetchTime(float64(time.Now().Unix()))
-	expected := common.Hash(output.OutputRoot)
-	rootMatches := rootClaim == expected
+	game.ExpectedRootClaim = common.Hash(output.OutputRoot)
+	rootMatches := game.RootClaim == game.ExpectedRootClaim
 	if !rootMatches {
-		return false, expected, nil
+		game.AgreeWithClaim = false
+		return nil
 	}
 
 	// If the root matches, also check that l2 block is safe at the L1 head
-	safeHead, err := o.client.SafeHeadAtL1Block(ctx, l1HeadNum)
+	safeHead, err := o.client.SafeHeadAtL1Block(ctx, game.L1HeadNum)
 	if err != nil {
-		o.log.Warn("Unable to verify proposed block was safe", "l1HeadNum", l1HeadNum, "l2BlockNum", l2BlockNum, "err", err)
+		o.log.Warn("Unable to verify proposed block was safe", "l1HeadNum", game.L1HeadNum, "l2BlockNum", game.L2BlockNumber, "err", err)
 		// If safe head data isn't available, assume the output root was safe
 		// Avoids making the dispute mon dependent on safe head db being available
-		//
-		return true, expected, nil
+		game.AgreeWithClaim = true
+		return nil
 	}
-	isSafe := safeHead.SafeHead.Number >= l2BlockNum
-	return isSafe, expected, nil
+	game.AgreeWithClaim = safeHead.SafeHead.Number >= game.L2BlockNumber
+	return nil
 }
diff --git a/op-dispute-mon/mon/validator_test.go b/op-dispute-mon/mon/extract/agreement_enricher_test.go
similarity index 51%
rename from op-dispute-mon/mon/validator_test.go
rename to op-dispute-mon/mon/extract/agreement_enricher_test.go
index 5b395bee98f9..bd9d3853e790 100644
--- a/op-dispute-mon/mon/validator_test.go
+++ b/op-dispute-mon/mon/extract/agreement_enricher_test.go
@@ -1,89 +1,121 @@
-package mon
+package extract
 
 import (
 	"context"
 	"errors"
 	"testing"
 
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
 )
 
-var (
-	mockRootClaim = common.HexToHash("0x10")
-)
-
 func TestDetector_CheckRootAgreement(t *testing.T) {
 	t.Parallel()
 
 	t.Run("OutputFetchFails", func(t *testing.T) {
 		validator, rollup, metrics := setupOutputValidatorTest(t)
 		rollup.outputErr = errors.New("boom")
-		agree, fetched, err := validator.CheckRootAgreement(context.Background(), 100, 0, mockRootClaim)
+		game := &types.EnrichedGameData{
+			L1HeadNum:     100,
+			L2BlockNumber: 0,
+			RootClaim:     mockRootClaim,
+		}
+		err := validator.Enrich(context.Background(), rpcblock.Latest, nil, game)
 		require.ErrorIs(t, err, rollup.outputErr)
-		require.Equal(t, common.Hash{}, fetched)
-		require.False(t, agree)
+		require.Equal(t, common.Hash{}, game.ExpectedRootClaim)
+		require.False(t, game.AgreeWithClaim)
 		require.Zero(t, metrics.fetchTime)
 	})
 
 	t.Run("OutputMismatch_Safe", func(t *testing.T) {
 		validator, _, metrics := setupOutputValidatorTest(t)
-		agree, fetched, err := validator.CheckRootAgreement(context.Background(), 100, 0, common.Hash{})
+		game := &types.EnrichedGameData{
+			L1HeadNum:     100,
+			L2BlockNumber: 0,
+			RootClaim:     common.Hash{},
+		}
+		err := validator.Enrich(context.Background(), rpcblock.Latest, nil, game)
 		require.NoError(t, err)
-		require.Equal(t, mockRootClaim, fetched)
-		require.False(t, agree)
+		require.Equal(t, mockRootClaim, game.ExpectedRootClaim)
+		require.False(t, game.AgreeWithClaim)
 		require.NotZero(t, metrics.fetchTime)
 	})
 
 	t.Run("OutputMatches_Safe", func(t *testing.T) {
 		validator, _, metrics := setupOutputValidatorTest(t)
-		agree, fetched, err := validator.CheckRootAgreement(context.Background(), 200, 0, mockRootClaim)
+		game := &types.EnrichedGameData{
+			L1HeadNum:     200,
+			L2BlockNumber: 0,
+			RootClaim:     mockRootClaim,
+		}
+		err := validator.Enrich(context.Background(), rpcblock.Latest, nil, game)
 		require.NoError(t, err)
-		require.Equal(t, mockRootClaim, fetched)
-		require.True(t, agree)
+		require.Equal(t, mockRootClaim, game.ExpectedRootClaim)
+		require.True(t, game.AgreeWithClaim)
 		require.NotZero(t, metrics.fetchTime)
 	})
 
 	t.Run("OutputMismatch_NotSafe", func(t *testing.T) {
 		validator, client, metrics := setupOutputValidatorTest(t)
 		client.safeHeadNum = 99
-		agree, fetched, err := validator.CheckRootAgreement(context.Background(), 100, 0, common.Hash{})
+		game := &types.EnrichedGameData{
+			L1HeadNum:     100,
+			L2BlockNumber: 0,
+			RootClaim:     common.Hash{},
+		}
+		err := validator.Enrich(context.Background(), rpcblock.Latest, nil, game)
 		require.NoError(t, err)
-		require.Equal(t, mockRootClaim, fetched)
-		require.False(t, agree)
+		require.Equal(t, mockRootClaim, game.ExpectedRootClaim)
+		require.False(t, game.AgreeWithClaim)
 		require.NotZero(t, metrics.fetchTime)
 	})
 
 	t.Run("OutputMatches_SafeHeadError", func(t *testing.T) {
 		validator, client, metrics := setupOutputValidatorTest(t)
 		client.safeHeadErr = errors.New("boom")
-		agree, fetched, err := validator.CheckRootAgreement(context.Background(), 200, 0, mockRootClaim)
+		game := &types.EnrichedGameData{
+			L1HeadNum:     200,
+			L2BlockNumber: 0,
+			RootClaim:     mockRootClaim,
+		}
+		err := validator.Enrich(context.Background(), rpcblock.Latest, nil, game)
 		require.NoError(t, err)
-		require.Equal(t, mockRootClaim, fetched)
-		require.True(t, agree) // Assume safe if we can't retrieve the safe head so monitoring isn't dependent on safe head db
+		require.Equal(t, mockRootClaim, game.ExpectedRootClaim)
+		require.True(t, game.AgreeWithClaim) // Assume safe if we can't retrieve the safe head so monitoring isn't dependent on safe head db
 		require.NotZero(t, metrics.fetchTime)
 	})
 
 	t.Run("OutputMismatch_SafeHeadError", func(t *testing.T) {
 		validator, client, metrics := setupOutputValidatorTest(t)
 		client.safeHeadErr = errors.New("boom")
-		agree, fetched, err := validator.CheckRootAgreement(context.Background(), 100, 0, common.Hash{})
+		game := &types.EnrichedGameData{
+			L1HeadNum:     100,
+			L2BlockNumber: 0,
+		}
+		err := validator.Enrich(context.Background(), rpcblock.Latest, nil, game)
 		require.NoError(t, err)
-		require.Equal(t, mockRootClaim, fetched)
-		require.False(t, agree) // Not agreed because the root doesn't match
+		require.Equal(t, mockRootClaim, game.ExpectedRootClaim)
+		require.False(t, game.AgreeWithClaim) // Not agreed because the root doesn't match
 		require.NotZero(t, metrics.fetchTime)
 	})
 
 	t.Run("OutputMatches_NotSafe", func(t *testing.T) {
 		validator, client, metrics := setupOutputValidatorTest(t)
 		client.safeHeadNum = 99
-		agree, fetched, err := validator.CheckRootAgreement(context.Background(), 200, 100, mockRootClaim)
+		game := &types.EnrichedGameData{
+			L1HeadNum:     200,
+			L2BlockNumber: 100,
+			RootClaim:     mockRootClaim,
+		}
+		err := validator.Enrich(context.Background(), rpcblock.Latest, nil, game)
 		require.NoError(t, err)
-		require.Equal(t, mockRootClaim, fetched)
-		require.False(t, agree)
+		require.Equal(t, mockRootClaim, game.ExpectedRootClaim)
+		require.False(t, game.AgreeWithClaim)
 		require.NotZero(t, metrics.fetchTime)
 	})
 
@@ -91,19 +123,24 @@ func TestDetector_CheckRootAgreement(t *testing.T) {
 		validator, rollup, metrics := setupOutputValidatorTest(t)
 		// This crazy error is what we actually get back from the API
 		rollup.outputErr = errors.New("failed to get L2 block ref with sync status: failed to determine L2BlockRef of height 42984924, could not get payload: not found")
-		agree, fetched, err := validator.CheckRootAgreement(context.Background(), 100, 42984924, mockRootClaim)
+		game := &types.EnrichedGameData{
+			L1HeadNum:     100,
+			L2BlockNumber: 42984924,
+			RootClaim:     mockRootClaim,
+		}
+		err := validator.Enrich(context.Background(), rpcblock.Latest, nil, game)
 		require.NoError(t, err)
-		require.Equal(t, common.Hash{}, fetched)
-		require.False(t, agree)
+		require.Equal(t, common.Hash{}, game.ExpectedRootClaim)
+		require.False(t, game.AgreeWithClaim)
 		require.Zero(t, metrics.fetchTime)
 	})
 }
 
-func setupOutputValidatorTest(t *testing.T) (*outputValidator, *stubRollupClient, *stubOutputMetrics) {
+func setupOutputValidatorTest(t *testing.T) (*AgreementEnricher, *stubRollupClient, *stubOutputMetrics) {
 	logger := testlog.Logger(t, log.LvlInfo)
 	client := &stubRollupClient{safeHeadNum: 99999999999}
 	metrics := &stubOutputMetrics{}
-	validator := newOutputValidator(logger, metrics, client)
+	validator := NewAgreementEnricher(logger, metrics, client)
 	return validator, client, metrics
 }
 
@@ -122,7 +159,7 @@ type stubRollupClient struct {
 	safeHeadNum uint64
 }
 
-func (s *stubRollupClient) OutputAtBlock(ctx context.Context, blockNum uint64) (*eth.OutputResponse, error) {
+func (s *stubRollupClient) OutputAtBlock(_ context.Context, blockNum uint64) (*eth.OutputResponse, error) {
 	s.blockNum = blockNum
 	return ð.OutputResponse{OutputRoot: eth.Bytes32(mockRootClaim)}, s.outputErr
 }
diff --git a/op-dispute-mon/mon/extract/balance_enricher.go b/op-dispute-mon/mon/extract/balance_enricher.go
index 3c6ee63a3c2a..42cc5b8ccafe 100644
--- a/op-dispute-mon/mon/extract/balance_enricher.go
+++ b/op-dispute-mon/mon/extract/balance_enricher.go
@@ -10,12 +10,13 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 )
 
+var _ Enricher = (*BalanceEnricher)(nil)
+
 type BalanceCaller interface {
 	GetBalance(context.Context, rpcblock.Block) (*big.Int, common.Address, error)
 }
 
-type BalanceEnricher struct {
-}
+type BalanceEnricher struct{}
 
 func NewBalanceEnricher() *BalanceEnricher {
 	return &BalanceEnricher{}
diff --git a/op-dispute-mon/mon/extract/bond_enricher.go b/op-dispute-mon/mon/extract/bond_enricher.go
index c194f8cc8414..2bc7fa99e482 100644
--- a/op-dispute-mon/mon/extract/bond_enricher.go
+++ b/op-dispute-mon/mon/extract/bond_enricher.go
@@ -12,28 +12,22 @@ import (
 	"golang.org/x/exp/maps"
 )
 
+var _ Enricher = (*BondEnricher)(nil)
+
 var ErrIncorrectCreditCount = errors.New("incorrect credit count")
 
 type BondCaller interface {
 	GetCredits(context.Context, rpcblock.Block, ...common.Address) ([]*big.Int, error)
 }
-type BondEnricher struct {
-}
+
+type BondEnricher struct{}
 
 func NewBondEnricher() *BondEnricher {
 	return &BondEnricher{}
 }
 
 func (b *BondEnricher) Enrich(ctx context.Context, block rpcblock.Block, caller GameCaller, game *monTypes.EnrichedGameData) error {
-	recipients := make(map[common.Address]bool)
-	for _, claim := range game.Claims {
-		recipients[claim.Claimant] = true
-		if claim.CounteredBy != (common.Address{}) {
-			recipients[claim.CounteredBy] = true
-		}
-	}
-
-	recipientAddrs := maps.Keys(recipients)
+	recipientAddrs := maps.Keys(game.Recipients)
 	credits, err := caller.GetCredits(ctx, block, recipientAddrs...)
 	if err != nil {
 		return err
diff --git a/op-dispute-mon/mon/extract/bond_enricher_test.go b/op-dispute-mon/mon/extract/bond_enricher_test.go
index 29daecb8bade..77330525b94f 100644
--- a/op-dispute-mon/mon/extract/bond_enricher_test.go
+++ b/op-dispute-mon/mon/extract/bond_enricher_test.go
@@ -13,39 +13,60 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
-func TestBondEnricher(t *testing.T) {
-	makeGame := func() *monTypes.EnrichedGameData {
-		return &monTypes.EnrichedGameData{
-			Claims: []faultTypes.Claim{
-				{
+// makeTestGame returns an enriched game with 3 claims and a list of expected recipients.
+func makeTestGame() (*monTypes.EnrichedGameData, []common.Address) {
+	game := &monTypes.EnrichedGameData{
+		Recipients: map[common.Address]bool{
+			common.Address{0x02}: true,
+			common.Address{0x03}: true,
+			common.Address{0x04}: true,
+		},
+		Claims: []monTypes.EnrichedClaim{
+			{
+				Claim: faultTypes.Claim{
 					ClaimData: faultTypes.ClaimData{
-						Bond: monTypes.ResolvedBondAmount,
+						Position: faultTypes.NewPositionFromGIndex(big.NewInt(1)),
 					},
 					Claimant:    common.Address{0x01},
 					CounteredBy: common.Address{0x02},
 				},
-				{
+				Resolved: true,
+			},
+			{
+				Claim: faultTypes.Claim{
 					ClaimData: faultTypes.ClaimData{
-						Bond: big.NewInt(5),
+						Bond:     big.NewInt(5),
+						Position: faultTypes.NewPositionFromGIndex(big.NewInt(2)),
 					},
 					Claimant:    common.Address{0x03},
 					CounteredBy: common.Address{},
 				},
-				{
+			},
+			{
+				Claim: faultTypes.Claim{
 					ClaimData: faultTypes.ClaimData{
-						Bond: big.NewInt(7),
+						Bond:     big.NewInt(7),
+						Position: faultTypes.NewPositionFromGIndex(big.NewInt(3)),
 					},
 					Claimant:    common.Address{0x03},
-					CounteredBy: common.Address{},
+					CounteredBy: common.Address{0x04},
 				},
 			},
-		}
+		},
 	}
+	recipients := []common.Address{
+		game.Claims[0].CounteredBy,
+		game.Claims[1].Claimant,
+		game.Claims[2].CounteredBy,
+	}
+	return game, recipients
+}
 
+func TestBondEnricher(t *testing.T) {
 	t.Run("GetCreditsFails", func(t *testing.T) {
 		enricher := NewBondEnricher()
 		caller := &mockGameCaller{creditsErr: errors.New("nope")}
-		game := makeGame()
+		game, _ := makeTestGame()
 		err := enricher.Enrich(context.Background(), rpcblock.Latest, caller, game)
 		require.ErrorIs(t, err, caller.creditsErr)
 	})
@@ -53,33 +74,25 @@ func TestBondEnricher(t *testing.T) {
 	t.Run("GetCreditsWrongNumberOfResults", func(t *testing.T) {
 		enricher := NewBondEnricher()
 		caller := &mockGameCaller{extraCredit: []*big.Int{big.NewInt(4)}}
-		game := makeGame()
+		game, _ := makeTestGame()
 		err := enricher.Enrich(context.Background(), rpcblock.Latest, caller, game)
 		require.ErrorIs(t, err, ErrIncorrectCreditCount)
 	})
 
 	t.Run("GetCreditsSuccess", func(t *testing.T) {
-		game := makeGame()
-		expectedRecipients := []common.Address{
-			game.Claims[0].Claimant,
-			game.Claims[0].CounteredBy,
-			game.Claims[1].Claimant,
-			// Claim 1 CounteredBy is unset
-			// Claim 2 Claimant is same as claim 1 Claimant
-			// Claim 2 CounteredBy is unset
-		}
+		game, recipients := makeTestGame()
 		enricher := NewBondEnricher()
 		expectedCredits := map[common.Address]*big.Int{
-			expectedRecipients[0]: big.NewInt(10),
-			expectedRecipients[1]: big.NewInt(20),
-			expectedRecipients[2]: big.NewInt(30),
+			recipients[0]: big.NewInt(20),
+			recipients[1]: big.NewInt(30),
+			recipients[2]: big.NewInt(40),
 		}
 		caller := &mockGameCaller{credits: expectedCredits}
 		err := enricher.Enrich(context.Background(), rpcblock.Latest, caller, game)
 		require.NoError(t, err)
 
-		require.Equal(t, len(expectedRecipients), len(caller.requestedCredits))
-		for _, recipient := range expectedRecipients {
+		require.Equal(t, len(recipients), len(caller.requestedCredits))
+		for _, recipient := range recipients {
 			require.Contains(t, caller.requestedCredits, recipient)
 		}
 		require.Equal(t, expectedCredits, game.Credits)
diff --git a/op-dispute-mon/mon/extract/caller.go b/op-dispute-mon/mon/extract/caller.go
index caa92ae90902..c353bc724b3d 100644
--- a/op-dispute-mon/mon/extract/caller.go
+++ b/op-dispute-mon/mon/extract/caller.go
@@ -4,46 +4,57 @@ import (
 	"context"
 	"fmt"
 
+	contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum/go-ethereum/common"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
-	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
-	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/sources/caching"
+
+	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
 )
 
 const metricsLabel = "game_caller_creator"
 
+type GameCallerMetrics interface {
+	caching.Metrics
+	contractMetrics.ContractMetricer
+}
+
 type GameCaller interface {
-	GetGameMetadata(context.Context, rpcblock.Block) (common.Hash, uint64, common.Hash, types.GameStatus, uint64, error)
+	GetWithdrawals(context.Context, rpcblock.Block, common.Address, ...common.Address) ([]*contracts.WithdrawalRequest, error)
+	GetGameMetadata(context.Context, rpcblock.Block) (contracts.GameMetadata, error)
 	GetAllClaims(context.Context, rpcblock.Block) ([]faultTypes.Claim, error)
 	BondCaller
 	BalanceCaller
+	ClaimCaller
 }
 
 type GameCallerCreator struct {
-	cache  *caching.LRUCache[common.Address, *contracts.FaultDisputeGameContract]
+	m      GameCallerMetrics
+	cache  *caching.LRUCache[common.Address, contracts.FaultDisputeGameContract]
 	caller *batching.MultiCaller
 }
 
-func NewGameCallerCreator(m caching.Metrics, caller *batching.MultiCaller) *GameCallerCreator {
+func NewGameCallerCreator(m GameCallerMetrics, caller *batching.MultiCaller) *GameCallerCreator {
 	return &GameCallerCreator{
+		m:      m,
 		caller: caller,
-		cache:  caching.NewLRUCache[common.Address, *contracts.FaultDisputeGameContract](m, metricsLabel, 100),
+		cache:  caching.NewLRUCache[common.Address, contracts.FaultDisputeGameContract](m, metricsLabel, 100),
 	}
 }
 
-func (g *GameCallerCreator) CreateContract(game types.GameMetadata) (GameCaller, error) {
+func (g *GameCallerCreator) CreateContract(ctx context.Context, game gameTypes.GameMetadata) (GameCaller, error) {
 	if fdg, ok := g.cache.Get(game.Proxy); ok {
 		return fdg, nil
 	}
 	switch game.GameType {
-	case faultTypes.CannonGameType, faultTypes.AlphabetGameType:
-		fdg, err := contracts.NewFaultDisputeGameContract(game.Proxy, g.caller)
+	case faultTypes.CannonGameType, faultTypes.PermissionedGameType, faultTypes.AsteriscGameType, faultTypes.AlphabetGameType:
+		fdg, err := contracts.NewFaultDisputeGameContract(ctx, g.m, game.Proxy, g.caller)
 		if err != nil {
-			return nil, fmt.Errorf("failed to create FaultDisputeGameContract: %w", err)
+			return nil, fmt.Errorf("failed to create fault dispute game contract: %w", err)
 		}
 		g.cache.Add(game.Proxy, fdg)
 		return fdg, nil
diff --git a/op-dispute-mon/mon/extract/caller_test.go b/op-dispute-mon/mon/extract/caller_test.go
index ffd0ba924bc3..9ac263155786 100644
--- a/op-dispute-mon/mon/extract/caller_test.go
+++ b/op-dispute-mon/mon/extract/caller_test.go
@@ -1,14 +1,17 @@
 package extract
 
 import (
+	"context"
 	"fmt"
 	"testing"
 
+	contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum/go-ethereum/common"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/bindings"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	batchingTest "github.com/ethereum-optimism/optimism/op-service/sources/batching/test"
 	"github.com/stretchr/testify/require"
@@ -28,14 +31,18 @@ func TestMetadataCreator_CreateContract(t *testing.T) {
 			name: "validCannonGameType",
 			game: types.GameMetadata{GameType: faultTypes.CannonGameType, Proxy: fdgAddr},
 		},
+		{
+			name: "validAsteriscGameType",
+			game: types.GameMetadata{GameType: faultTypes.AsteriscGameType, Proxy: fdgAddr},
+		},
 		{
 			name: "validAlphabetGameType",
 			game: types.GameMetadata{GameType: faultTypes.AlphabetGameType, Proxy: fdgAddr},
 		},
 		{
 			name:        "InvalidGameType",
-			game:        types.GameMetadata{GameType: 2, Proxy: fdgAddr},
-			expectedErr: fmt.Errorf("unsupported game type: 2"),
+			game:        types.GameMetadata{GameType: 3, Proxy: fdgAddr},
+			expectedErr: fmt.Errorf("unsupported game type: 3"),
 		},
 	}
 
@@ -44,13 +51,13 @@ func TestMetadataCreator_CreateContract(t *testing.T) {
 		t.Run(test.name, func(t *testing.T) {
 			caller, metrics := setupMetadataLoaderTest(t)
 			creator := NewGameCallerCreator(metrics, caller)
-			_, err := creator.CreateContract(test.game)
+			_, err := creator.CreateContract(context.Background(), test.game)
 			require.Equal(t, test.expectedErr, err)
 			if test.expectedErr == nil {
 				require.Equal(t, 1, metrics.cacheAddCalls)
 				require.Equal(t, 1, metrics.cacheGetCalls)
 			}
-			_, err = creator.CreateContract(test.game)
+			_, err = creator.CreateContract(context.Background(), test.game)
 			require.Equal(t, test.expectedErr, err)
 			if test.expectedErr == nil {
 				require.Equal(t, 1, metrics.cacheAddCalls)
@@ -65,12 +72,14 @@ func setupMetadataLoaderTest(t *testing.T) (*batching.MultiCaller, *mockCacheMet
 	require.NoError(t, err)
 	stubRpc := batchingTest.NewAbiBasedRpc(t, fdgAddr, fdgAbi)
 	caller := batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize)
+	stubRpc.SetResponse(fdgAddr, "version", rpcblock.Latest, nil, []interface{}{"0.18.0"})
 	return caller, &mockCacheMetrics{}
 }
 
 type mockCacheMetrics struct {
 	cacheAddCalls int
 	cacheGetCalls int
+	*contractMetrics.NoopMetrics
 }
 
 func (m *mockCacheMetrics) CacheAdd(_ string, _ int, _ bool) {
diff --git a/op-dispute-mon/mon/extract/claim_enricher.go b/op-dispute-mon/mon/extract/claim_enricher.go
new file mode 100644
index 000000000000..3d1664e909dc
--- /dev/null
+++ b/op-dispute-mon/mon/extract/claim_enricher.go
@@ -0,0 +1,37 @@
+package extract
+
+import (
+	"context"
+	"fmt"
+
+	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+)
+
+var _ Enricher = (*ClaimEnricher)(nil)
+
+type ClaimCaller interface {
+	IsResolved(ctx context.Context, block rpcblock.Block, claim ...faultTypes.Claim) ([]bool, error)
+}
+
+type ClaimEnricher struct{}
+
+func NewClaimEnricher() *ClaimEnricher {
+	return &ClaimEnricher{}
+}
+
+func (e *ClaimEnricher) Enrich(ctx context.Context, block rpcblock.Block, caller GameCaller, game *types.EnrichedGameData) error {
+	claims := make([]faultTypes.Claim, 0, len(game.Claims))
+	for _, claim := range game.Claims {
+		claims = append(claims, claim.Claim)
+	}
+	resolved, err := caller.IsResolved(ctx, block, claims...)
+	if err != nil {
+		return fmt.Errorf("failed to retrieve resolved status: %w", err)
+	}
+	for i := range game.Claims {
+		game.Claims[i].Resolved = resolved[i]
+	}
+	return nil
+}
diff --git a/op-dispute-mon/mon/extract/claim_enricher_test.go b/op-dispute-mon/mon/extract/claim_enricher_test.go
new file mode 100644
index 000000000000..3bda6313fea0
--- /dev/null
+++ b/op-dispute-mon/mon/extract/claim_enricher_test.go
@@ -0,0 +1,46 @@
+package extract
+
+import (
+	"context"
+	"errors"
+	"testing"
+
+	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	"github.com/stretchr/testify/require"
+)
+
+func TestClaimEnricher(t *testing.T) {
+	caller := &mockGameCaller{resolved: make(map[int]bool)}
+	enricher := NewClaimEnricher()
+	expected := []bool{true, false, false, false, false}
+	game := &types.EnrichedGameData{
+		Claims: claimsWithResolvedSubgames(caller, expected...),
+	}
+	err := enricher.Enrich(context.Background(), rpcblock.Latest, caller, game)
+	require.NoError(t, err)
+	for i, claim := range game.Claims {
+		require.Equal(t, expected[i], claim.Resolved)
+	}
+}
+
+func TestClaimEnricherError(t *testing.T) {
+	expectedErr := errors.New("boom")
+	caller := &mockGameCaller{resolved: make(map[int]bool), resolvedErr: expectedErr}
+	enricher := NewClaimEnricher()
+	game := &types.EnrichedGameData{
+		Claims: claimsWithResolvedSubgames(caller, true, false),
+	}
+	err := enricher.Enrich(context.Background(), rpcblock.Latest, caller, game)
+	require.ErrorIs(t, err, expectedErr)
+}
+
+func claimsWithResolvedSubgames(caller *mockGameCaller, resolved ...bool) []types.EnrichedClaim {
+	claims := make([]types.EnrichedClaim, len(resolved))
+	for i, r := range resolved {
+		claims[i] = types.EnrichedClaim{Claim: faultTypes.Claim{ContractIndex: i}}
+		caller.resolved[i] = r
+	}
+	return claims
+}
diff --git a/op-dispute-mon/mon/extract/extractor.go b/op-dispute-mon/mon/extract/extractor.go
index fa211a32a1eb..d19cab340b66 100644
--- a/op-dispute-mon/mon/extract/extractor.go
+++ b/op-dispute-mon/mon/extract/extractor.go
@@ -2,18 +2,26 @@ package extract
 
 import (
 	"context"
+	"errors"
 	"fmt"
+	"sync"
+	"sync/atomic"
 
+	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
+)
 
-	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
-	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+var (
+	ErrIgnored = errors.New("ignored")
 )
 
-type CreateGameCaller func(game gameTypes.GameMetadata) (GameCaller, error)
-type FactoryGameFetcher func(ctx context.Context, blockHash common.Hash, earliestTimestamp uint64) ([]gameTypes.GameMetadata, error)
+type (
+	CreateGameCaller   func(ctx context.Context, game gameTypes.GameMetadata) (GameCaller, error)
+	FactoryGameFetcher func(ctx context.Context, blockHash common.Hash, earliestTimestamp uint64) ([]gameTypes.GameMetadata, error)
+)
 
 type Enricher interface {
 	Enrich(ctx context.Context, block rpcblock.Block, caller GameCaller, game *monTypes.EnrichedGameData) error
@@ -23,60 +31,127 @@ type Extractor struct {
 	logger         log.Logger
 	createContract CreateGameCaller
 	fetchGames     FactoryGameFetcher
+	maxConcurrency int
 	enrichers      []Enricher
+	ignoredGames   map[common.Address]bool
 }
 
-func NewExtractor(logger log.Logger, creator CreateGameCaller, fetchGames FactoryGameFetcher, enrichers ...Enricher) *Extractor {
+func NewExtractor(logger log.Logger, creator CreateGameCaller, fetchGames FactoryGameFetcher, ignoredGames []common.Address, maxConcurrency uint, enrichers ...Enricher) *Extractor {
+	ignored := make(map[common.Address]bool)
+	for _, game := range ignoredGames {
+		ignored[game] = true
+	}
 	return &Extractor{
 		logger:         logger,
 		createContract: creator,
 		fetchGames:     fetchGames,
+		maxConcurrency: int(maxConcurrency),
 		enrichers:      enrichers,
+		ignoredGames:   ignored,
 	}
 }
 
-func (e *Extractor) Extract(ctx context.Context, blockHash common.Hash, minTimestamp uint64) ([]*monTypes.EnrichedGameData, error) {
+func (e *Extractor) Extract(ctx context.Context, blockHash common.Hash, minTimestamp uint64) ([]*monTypes.EnrichedGameData, int, int, error) {
 	games, err := e.fetchGames(ctx, blockHash, minTimestamp)
 	if err != nil {
-		return nil, fmt.Errorf("failed to load games: %w", err)
+		return nil, 0, 0, fmt.Errorf("failed to load games: %w", err)
 	}
-	return e.enrichGames(ctx, blockHash, games), nil
+	enriched, ignored, failed := e.enrichGames(ctx, blockHash, games)
+	return enriched, ignored, failed, nil
 }
 
-func (e *Extractor) enrichGames(ctx context.Context, blockHash common.Hash, games []gameTypes.GameMetadata) []*monTypes.EnrichedGameData {
+func (e *Extractor) enrichGames(ctx context.Context, blockHash common.Hash, games []gameTypes.GameMetadata) ([]*monTypes.EnrichedGameData, int, int) {
 	var enrichedGames []*monTypes.EnrichedGameData
+	var ignored atomic.Int32
+	var failed atomic.Int32
+
+	var wg sync.WaitGroup
+	wg.Add(e.maxConcurrency)
+	gameCh := make(chan gameTypes.GameMetadata, e.maxConcurrency)
+	// Create a channel for enriched games. Must have enough capacity to hold all games.
+	enrichedCh := make(chan *monTypes.EnrichedGameData, len(games))
+	// Spin up multiple goroutines to enrich game data
+	for i := 0; i < e.maxConcurrency; i++ {
+		go func() {
+			defer wg.Done()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case game, ok := <-gameCh:
+					if !ok {
+						e.logger.Debug("Enriching complete")
+						// Channel closed
+						return
+					}
+					e.logger.Trace("Enriching game", "game", game.Proxy)
+					enrichedGame, err := e.enrichGame(ctx, blockHash, game)
+					if errors.Is(err, ErrIgnored) {
+						ignored.Add(1)
+						e.logger.Warn("Ignoring game", "game", game.Proxy)
+						continue
+					} else if err != nil {
+						failed.Add(1)
+						e.logger.Error("Failed to fetch game data", "game", game.Proxy, "err", err)
+						continue
+					}
+					enrichedCh <- enrichedGame
+				}
+			}
+		}()
+	}
+
+	// Push each game into the channel
 	for _, game := range games {
-		caller, err := e.createContract(game)
-		if err != nil {
-			e.logger.Error("Failed to create game caller", "err", err)
-			continue
-		}
-		l1Head, l2BlockNum, rootClaim, status, duration, err := caller.GetGameMetadata(ctx, rpcblock.ByHash(blockHash))
-		if err != nil {
-			e.logger.Error("Failed to fetch game metadata", "err", err)
-			continue
-		}
-		claims, err := caller.GetAllClaims(ctx, rpcblock.ByHash(blockHash))
-		if err != nil {
-			e.logger.Error("Failed to fetch game claims", "err", err)
-			continue
-		}
-		enrichedGame := &monTypes.EnrichedGameData{
-			GameMetadata:  game,
-			L1Head:        l1Head,
-			L2BlockNumber: l2BlockNum,
-			RootClaim:     rootClaim,
-			Status:        status,
-			Duration:      duration,
-			Claims:        claims,
-		}
-		if err := e.applyEnrichers(ctx, blockHash, caller, enrichedGame); err != nil {
-			e.logger.Error("Failed to enrich game", "err", err)
-			continue
-		}
+		gameCh <- game
+	}
+	close(gameCh)
+	// Wait for games to finish being enriched then close enrichedCh since no future results will be published
+	wg.Wait()
+	close(enrichedCh)
+
+	// Read the results
+	for enrichedGame := range enrichedCh {
 		enrichedGames = append(enrichedGames, enrichedGame)
 	}
-	return enrichedGames
+	return enrichedGames, int(ignored.Load()), int(failed.Load())
+}
+
+func (e *Extractor) enrichGame(ctx context.Context, blockHash common.Hash, game gameTypes.GameMetadata) (*monTypes.EnrichedGameData, error) {
+	if e.ignoredGames[game.Proxy] {
+		return nil, ErrIgnored
+	}
+	caller, err := e.createContract(ctx, game)
+	if err != nil {
+		return nil, fmt.Errorf("failed to create contracts: %w", err)
+	}
+	meta, err := caller.GetGameMetadata(ctx, rpcblock.ByHash(blockHash))
+	if err != nil {
+		return nil, fmt.Errorf("failed to fetch game metadata: %w", err)
+	}
+	claims, err := caller.GetAllClaims(ctx, rpcblock.ByHash(blockHash))
+	if err != nil {
+		return nil, fmt.Errorf("failed to fetch game claims: %w", err)
+	}
+	enrichedClaims := make([]monTypes.EnrichedClaim, len(claims))
+	for i, claim := range claims {
+		enrichedClaims[i] = monTypes.EnrichedClaim{Claim: claim}
+	}
+	enrichedGame := &monTypes.EnrichedGameData{
+		GameMetadata:          game,
+		L1Head:                meta.L1Head,
+		L2BlockNumber:         meta.L2BlockNum,
+		RootClaim:             meta.RootClaim,
+		Status:                meta.Status,
+		MaxClockDuration:      meta.MaxClockDuration,
+		BlockNumberChallenged: meta.L2BlockNumberChallenged,
+		BlockNumberChallenger: meta.L2BlockNumberChallenger,
+		Claims:                enrichedClaims,
+	}
+	if err := e.applyEnrichers(ctx, blockHash, caller, enrichedGame); err != nil {
+		return nil, fmt.Errorf("failed to enrich game: %w", err)
+	}
+	return enrichedGame, nil
 }
 
 func (e *Extractor) applyEnrichers(ctx context.Context, blockHash common.Hash, caller GameCaller, game *monTypes.EnrichedGameData) error {
diff --git a/op-dispute-mon/mon/extract/extractor_test.go b/op-dispute-mon/mon/extract/extractor_test.go
index 83264baa4b9e..311775610697 100644
--- a/op-dispute-mon/mon/extract/extractor_test.go
+++ b/op-dispute-mon/mon/extract/extractor_test.go
@@ -6,25 +6,28 @@ import (
 	"math/big"
 	"testing"
 
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
 	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/stretchr/testify/require"
 
 	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
-	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 )
 
-var mockRootClaim = common.HexToHash("0x1234")
+var (
+	mockRootClaim = common.HexToHash("0x1234")
+	ignoredGames  = []common.Address{common.HexToAddress("0xdeadbeef")}
+)
 
 func TestExtractor_Extract(t *testing.T) {
 	t.Run("FetchGamesError", func(t *testing.T) {
 		extractor, _, games, _ := setupExtractorTest(t)
 		games.err = errors.New("boom")
-		_, err := extractor.Extract(context.Background(), common.Hash{}, 0)
+		_, _, _, err := extractor.Extract(context.Background(), common.Hash{}, 0)
 		require.ErrorIs(t, err, games.err)
 		require.Equal(t, 1, games.calls)
 	})
@@ -33,8 +36,10 @@ func TestExtractor_Extract(t *testing.T) {
 		extractor, creator, games, logs := setupExtractorTest(t)
 		games.games = []gameTypes.GameMetadata{{}}
 		creator.err = errors.New("boom")
-		enriched, err := extractor.Extract(context.Background(), common.Hash{}, 0)
+		enriched, ignored, failed, err := extractor.Extract(context.Background(), common.Hash{}, 0)
 		require.NoError(t, err)
+		require.Equal(t, 1, failed)
+		require.Zero(t, ignored)
 		require.Len(t, enriched, 0)
 		require.Equal(t, 1, games.calls)
 		require.Equal(t, 1, creator.calls)
@@ -47,8 +52,10 @@ func TestExtractor_Extract(t *testing.T) {
 		extractor, creator, games, logs := setupExtractorTest(t)
 		games.games = []gameTypes.GameMetadata{{}}
 		creator.caller.metadataErr = errors.New("boom")
-		enriched, err := extractor.Extract(context.Background(), common.Hash{}, 0)
+		enriched, ignored, failed, err := extractor.Extract(context.Background(), common.Hash{}, 0)
 		require.NoError(t, err)
+		require.Zero(t, ignored)
+		require.Equal(t, 1, failed)
 		require.Len(t, enriched, 0)
 		require.Equal(t, 1, games.calls)
 		require.Equal(t, 1, creator.calls)
@@ -61,8 +68,10 @@ func TestExtractor_Extract(t *testing.T) {
 		extractor, creator, games, logs := setupExtractorTest(t)
 		games.games = []gameTypes.GameMetadata{{}}
 		creator.caller.claimsErr = errors.New("boom")
-		enriched, err := extractor.Extract(context.Background(), common.Hash{}, 0)
+		enriched, ignored, failed, err := extractor.Extract(context.Background(), common.Hash{}, 0)
 		require.NoError(t, err)
+		require.Zero(t, ignored)
+		require.Equal(t, 1, failed)
 		require.Len(t, enriched, 0)
 		require.Equal(t, 1, games.calls)
 		require.Equal(t, 1, creator.calls)
@@ -74,8 +83,10 @@ func TestExtractor_Extract(t *testing.T) {
 	t.Run("Success", func(t *testing.T) {
 		extractor, creator, games, _ := setupExtractorTest(t)
 		games.games = []gameTypes.GameMetadata{{}}
-		enriched, err := extractor.Extract(context.Background(), common.Hash{}, 0)
+		enriched, ignored, failed, err := extractor.Extract(context.Background(), common.Hash{}, 0)
 		require.NoError(t, err)
+		require.Zero(t, ignored)
+		require.Zero(t, failed)
 		require.Len(t, enriched, 1)
 		require.Equal(t, 1, games.calls)
 		require.Equal(t, 1, creator.calls)
@@ -87,9 +98,11 @@ func TestExtractor_Extract(t *testing.T) {
 		enricher := &mockEnricher{err: errors.New("whoops")}
 		extractor, _, games, logs := setupExtractorTest(t, enricher)
 		games.games = []gameTypes.GameMetadata{{}}
-		enriched, err := extractor.Extract(context.Background(), common.Hash{}, 0)
+		enriched, ignored, failed, err := extractor.Extract(context.Background(), common.Hash{}, 0)
 		require.NoError(t, err)
-		l := logs.FindLogs(testlog.NewMessageFilter("Failed to enrich game"))
+		require.Zero(t, ignored)
+		require.Equal(t, 1, failed)
+		l := logs.FindLogs(testlog.NewAttributesContainsFilter("err", "failed to enrich game"))
 		require.Len(t, l, 1, "Should have logged error")
 		require.Len(t, enriched, 0, "Should not return games that failed to enrich")
 	})
@@ -98,8 +111,10 @@ func TestExtractor_Extract(t *testing.T) {
 		enricher := &mockEnricher{}
 		extractor, _, games, _ := setupExtractorTest(t, enricher)
 		games.games = []gameTypes.GameMetadata{{}}
-		enriched, err := extractor.Extract(context.Background(), common.Hash{}, 0)
+		enriched, ignored, failed, err := extractor.Extract(context.Background(), common.Hash{}, 0)
 		require.NoError(t, err)
+		require.Zero(t, ignored)
+		require.Zero(t, failed)
 		require.Len(t, enriched, 1)
 		require.Equal(t, 1, enricher.calls)
 	})
@@ -109,26 +124,47 @@ func TestExtractor_Extract(t *testing.T) {
 		enricher2 := &mockEnricher{}
 		extractor, _, games, _ := setupExtractorTest(t, enricher1, enricher2)
 		games.games = []gameTypes.GameMetadata{{}, {}}
-		enriched, err := extractor.Extract(context.Background(), common.Hash{}, 0)
+		enriched, ignored, failed, err := extractor.Extract(context.Background(), common.Hash{}, 0)
 		require.NoError(t, err)
+		require.Zero(t, ignored)
+		require.Zero(t, failed)
 		require.Len(t, enriched, 2)
 		require.Equal(t, 2, enricher1.calls)
 		require.Equal(t, 2, enricher2.calls)
 	})
+
+	t.Run("IgnoreGames", func(t *testing.T) {
+		enricher1 := &mockEnricher{}
+		extractor, _, games, logs := setupExtractorTest(t, enricher1)
+		// Two games, one of which is ignored
+		games.games = []gameTypes.GameMetadata{{Proxy: ignoredGames[0]}, {Proxy: common.Address{0xaa}}}
+		enriched, ignored, failed, err := extractor.Extract(context.Background(), common.Hash{}, 0)
+		require.NoError(t, err)
+		// Should ignore one and enrich the other
+		require.Equal(t, 1, ignored)
+		require.Zero(t, failed)
+		require.Len(t, enriched, 1)
+		require.Equal(t, 1, enricher1.calls)
+		require.Equal(t, enriched[0].Proxy, common.Address{0xaa})
+		require.NotNil(t, logs.FindLog(
+			testlog.NewLevelFilter(log.LevelWarn),
+			testlog.NewMessageFilter("Ignoring game"),
+			testlog.NewAttributesFilter("game", ignoredGames[0].Hex())))
+	})
 }
 
-func verifyLogs(t *testing.T, logs *testlog.CapturingHandler, createErr int, metadataErr int, claimsErr int, durationErr int) {
+func verifyLogs(t *testing.T, logs *testlog.CapturingHandler, createErr, metadataErr, claimsErr, durationErr int) {
 	errorLevelFilter := testlog.NewLevelFilter(log.LevelError)
-	createMessageFilter := testlog.NewMessageFilter("Failed to create game caller")
+	createMessageFilter := testlog.NewAttributesContainsFilter("err", "failed to create contracts")
 	l := logs.FindLogs(errorLevelFilter, createMessageFilter)
 	require.Len(t, l, createErr)
-	fetchMessageFilter := testlog.NewMessageFilter("Failed to fetch game metadata")
+	fetchMessageFilter := testlog.NewAttributesContainsFilter("err", "failed to fetch game metadata")
 	l = logs.FindLogs(errorLevelFilter, fetchMessageFilter)
 	require.Len(t, l, metadataErr)
-	claimsMessageFilter := testlog.NewMessageFilter("Failed to fetch game claims")
+	claimsMessageFilter := testlog.NewAttributesContainsFilter("err", "failed to fetch game claims")
 	l = logs.FindLogs(errorLevelFilter, claimsMessageFilter)
 	require.Len(t, l, claimsErr)
-	durationMessageFilter := testlog.NewMessageFilter("Failed to fetch game duration")
+	durationMessageFilter := testlog.NewAttributesContainsFilter("err", "failed to fetch game duration")
 	l = logs.FindLogs(errorLevelFilter, durationMessageFilter)
 	require.Len(t, l, durationErr)
 }
@@ -142,6 +178,8 @@ func setupExtractorTest(t *testing.T, enrichers ...Enricher) (*Extractor, *mockG
 		logger,
 		creator.CreateGameCaller,
 		games.FetchGames,
+		ignoredGames,
+		5,
 		enrichers...,
 	)
 	return extractor, creator, games, capturedLogs
@@ -167,7 +205,7 @@ type mockGameCallerCreator struct {
 	caller *mockGameCaller
 }
 
-func (m *mockGameCallerCreator) CreateGameCaller(_ gameTypes.GameMetadata) (GameCaller, error) {
+func (m *mockGameCallerCreator) CreateGameCaller(_ context.Context, _ gameTypes.GameMetadata) (GameCaller, error) {
 	m.calls++
 	if m.err != nil {
 		return nil, m.err
@@ -189,14 +227,42 @@ type mockGameCaller struct {
 	balanceErr       error
 	balance          *big.Int
 	balanceAddr      common.Address
+	withdrawalsCalls int
+	withdrawalsErr   error
+	withdrawals      []*contracts.WithdrawalRequest
+	resolvedErr      error
+	resolved         map[int]bool
+}
+
+func (m *mockGameCaller) GetWithdrawals(_ context.Context, _ rpcblock.Block, _ common.Address, _ ...common.Address) ([]*contracts.WithdrawalRequest, error) {
+	m.withdrawalsCalls++
+	if m.withdrawalsErr != nil {
+		return nil, m.withdrawalsErr
+	}
+	if m.withdrawals != nil {
+		return m.withdrawals, nil
+	}
+	return []*contracts.WithdrawalRequest{
+		{
+			Timestamp: big.NewInt(1),
+			Amount:    big.NewInt(2),
+		},
+		{
+			Timestamp: big.NewInt(3),
+			Amount:    big.NewInt(4),
+		},
+	}, nil
 }
 
-func (m *mockGameCaller) GetGameMetadata(_ context.Context, _ rpcblock.Block) (common.Hash, uint64, common.Hash, types.GameStatus, uint64, error) {
+func (m *mockGameCaller) GetGameMetadata(_ context.Context, _ rpcblock.Block) (contracts.GameMetadata, error) {
 	m.metadataCalls++
 	if m.metadataErr != nil {
-		return common.Hash{}, 0, common.Hash{}, 0, 0, m.metadataErr
+		return contracts.GameMetadata{}, m.metadataErr
 	}
-	return common.Hash{0xaa}, 0, mockRootClaim, 0, 0, nil
+	return contracts.GameMetadata{
+		L1Head:    common.Hash{0xaa},
+		RootClaim: mockRootClaim,
+	}, nil
 }
 
 func (m *mockGameCaller) GetAllClaims(_ context.Context, _ rpcblock.Block) ([]faultTypes.Claim, error) {
@@ -231,6 +297,17 @@ func (m *mockGameCaller) GetBalance(_ context.Context, _ rpcblock.Block) (*big.I
 	return m.balance, m.balanceAddr, nil
 }
 
+func (m *mockGameCaller) IsResolved(_ context.Context, _ rpcblock.Block, claims ...faultTypes.Claim) ([]bool, error) {
+	if m.resolvedErr != nil {
+		return nil, m.resolvedErr
+	}
+	resolved := make([]bool, len(claims))
+	for i, claim := range claims {
+		resolved[i] = m.resolved[claim.ContractIndex]
+	}
+	return resolved, nil
+}
+
 type mockEnricher struct {
 	err   error
 	calls int
diff --git a/op-dispute-mon/mon/extract/head_enricher.go b/op-dispute-mon/mon/extract/head_enricher.go
index f1a304be6c8b..943e648f771d 100644
--- a/op-dispute-mon/mon/extract/head_enricher.go
+++ b/op-dispute-mon/mon/extract/head_enricher.go
@@ -10,6 +10,8 @@ import (
 	"github.com/ethereum/go-ethereum/core/types"
 )
 
+var _ Enricher = (*L1HeadBlockNumEnricher)(nil)
+
 type BlockFetcher interface {
 	HeaderByHash(ctx context.Context, block common.Hash) (*types.Header, error)
 }
diff --git a/op-dispute-mon/mon/extract/recipient_enricher.go b/op-dispute-mon/mon/extract/recipient_enricher.go
new file mode 100644
index 000000000000..5bbb9ca0eaa6
--- /dev/null
+++ b/op-dispute-mon/mon/extract/recipient_enricher.go
@@ -0,0 +1,33 @@
+package extract
+
+import (
+	"context"
+
+	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	"github.com/ethereum/go-ethereum/common"
+)
+
+var _ Enricher = (*RecipientEnricher)(nil)
+
+type RecipientEnricher struct{}
+
+func NewRecipientEnricher() *RecipientEnricher {
+	return &RecipientEnricher{}
+}
+
+func (w *RecipientEnricher) Enrich(_ context.Context, _ rpcblock.Block, _ GameCaller, game *monTypes.EnrichedGameData) error {
+	recipients := make(map[common.Address]bool)
+	for _, claim := range game.Claims {
+		if claim.CounteredBy != (common.Address{}) {
+			recipients[claim.CounteredBy] = true
+		} else {
+			recipients[claim.Claimant] = true
+		}
+	}
+	if game.BlockNumberChallenger != (common.Address{}) {
+		recipients[game.BlockNumberChallenger] = true
+	}
+	game.Recipients = recipients
+	return nil
+}
diff --git a/op-dispute-mon/mon/extract/recipient_enricher_test.go b/op-dispute-mon/mon/extract/recipient_enricher_test.go
new file mode 100644
index 000000000000..46e6973f8e98
--- /dev/null
+++ b/op-dispute-mon/mon/extract/recipient_enricher_test.go
@@ -0,0 +1,25 @@
+package extract
+
+import (
+	"context"
+	"testing"
+
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/stretchr/testify/require"
+)
+
+func TestRecipientEnricher(t *testing.T) {
+	game, recipients := makeTestGame()
+	game.Recipients = make(map[common.Address]bool)
+	game.BlockNumberChallenger = common.Address{0xff, 0xee, 0xdd}
+	enricher := NewRecipientEnricher()
+	caller := &mockGameCaller{}
+	ctx := context.Background()
+	err := enricher.Enrich(ctx, rpcblock.Latest, caller, game)
+	require.NoError(t, err)
+	for _, recipient := range recipients {
+		require.Contains(t, game.Recipients, recipient)
+	}
+	require.Contains(t, game.Recipients, game.BlockNumberChallenger)
+}
diff --git a/op-dispute-mon/mon/extract/withdrawals_enricher.go b/op-dispute-mon/mon/extract/withdrawals_enricher.go
new file mode 100644
index 000000000000..23b1fe759a61
--- /dev/null
+++ b/op-dispute-mon/mon/extract/withdrawals_enricher.go
@@ -0,0 +1,41 @@
+package extract
+
+import (
+	"context"
+	"errors"
+	"fmt"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
+	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	"github.com/ethereum/go-ethereum/common"
+	"golang.org/x/exp/maps"
+)
+
+var ErrIncorrectWithdrawalsCount = errors.New("incorrect withdrawals count")
+
+var _ Enricher = (*WithdrawalsEnricher)(nil)
+
+type WithdrawalsEnricher struct{}
+
+func NewWithdrawalsEnricher() *WithdrawalsEnricher {
+	return &WithdrawalsEnricher{}
+}
+
+func (w *WithdrawalsEnricher) Enrich(ctx context.Context, block rpcblock.Block, caller GameCaller, game *monTypes.EnrichedGameData) error {
+	recipients := maps.Keys(game.Recipients)
+	withdrawals, err := caller.GetWithdrawals(ctx, block, game.Proxy, recipients...)
+	if err != nil {
+		return fmt.Errorf("failed to fetch withdrawals: %w", err)
+	}
+	if len(withdrawals) != len(recipients) {
+		return fmt.Errorf("%w, requested %v values but got %v", ErrIncorrectWithdrawalsCount, len(recipients), len(withdrawals))
+	}
+	if game.WithdrawalRequests == nil {
+		game.WithdrawalRequests = make(map[common.Address]*contracts.WithdrawalRequest)
+	}
+	for i, recipient := range recipients {
+		game.WithdrawalRequests[recipient] = withdrawals[i]
+	}
+	return nil
+}
diff --git a/op-dispute-mon/mon/extract/withdrawals_enricher_test.go b/op-dispute-mon/mon/extract/withdrawals_enricher_test.go
new file mode 100644
index 000000000000..bcd3882beea0
--- /dev/null
+++ b/op-dispute-mon/mon/extract/withdrawals_enricher_test.go
@@ -0,0 +1,81 @@
+package extract
+
+import (
+	"context"
+	"errors"
+	"math/big"
+	"testing"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
+	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/stretchr/testify/require"
+)
+
+func TestWithdrawalsEnricher(t *testing.T) {
+	makeGame := func() *monTypes.EnrichedGameData {
+		return &monTypes.EnrichedGameData{
+			Recipients: map[common.Address]bool{
+				common.Address{0x02}: true,
+				common.Address{0x03}: true,
+			},
+			Claims: []monTypes.EnrichedClaim{
+				{
+					Claim: faultTypes.Claim{
+						ClaimData: faultTypes.ClaimData{
+							Bond: big.NewInt(10),
+						},
+						Claimant:    common.Address{0x01},
+						CounteredBy: common.Address{0x02},
+					},
+					Resolved: true,
+				},
+				{
+					Claim: faultTypes.Claim{
+						ClaimData: faultTypes.ClaimData{
+							Bond: big.NewInt(5),
+						},
+						Claimant:    common.Address{0x03},
+						CounteredBy: common.Address{},
+					},
+				},
+				{
+					Claim: faultTypes.Claim{
+						ClaimData: faultTypes.ClaimData{
+							Bond: big.NewInt(7),
+						},
+						Claimant:    common.Address{0x03},
+						CounteredBy: common.Address{},
+					},
+				},
+			},
+		}
+	}
+
+	t.Run("GetWithdrawalsFails", func(t *testing.T) {
+		enricher := NewWithdrawalsEnricher()
+		caller := &mockGameCaller{withdrawalsErr: errors.New("nope")}
+		game := makeGame()
+		err := enricher.Enrich(context.Background(), rpcblock.Latest, caller, game)
+		require.ErrorIs(t, err, caller.withdrawalsErr)
+	})
+
+	t.Run("GetWithdrawalsWrongNumberOfResults", func(t *testing.T) {
+		enricher := NewWithdrawalsEnricher()
+		caller := &mockGameCaller{withdrawals: []*contracts.WithdrawalRequest{{}}}
+		game := makeGame()
+		err := enricher.Enrich(context.Background(), rpcblock.Latest, caller, game)
+		require.ErrorIs(t, err, ErrIncorrectWithdrawalsCount)
+	})
+
+	t.Run("GetWithdrawalsSuccess", func(t *testing.T) {
+		game := makeGame()
+		enricher := NewWithdrawalsEnricher()
+		caller := &mockGameCaller{}
+		err := enricher.Enrich(context.Background(), rpcblock.Latest, caller, game)
+		require.NoError(t, err)
+		require.Equal(t, 2, len(game.WithdrawalRequests))
+	})
+}
diff --git a/op-dispute-mon/mon/forecast.go b/op-dispute-mon/mon/forecast.go
index b82a27a0129d..7124b8d02b33 100644
--- a/op-dispute-mon/mon/forecast.go
+++ b/op-dispute-mon/mon/forecast.go
@@ -1,17 +1,12 @@
 package mon
 
 import (
-	"context"
 	"errors"
-	"fmt"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum-optimism/optimism/op-dispute-mon/metrics"
-	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/resolution"
 	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/transform"
 	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
-	"github.com/ethereum/go-ethereum/common"
-
 	"github.com/ethereum/go-ethereum/log"
 )
 
@@ -19,40 +14,51 @@ var (
 	ErrRootAgreement = errors.New("failed to check root agreement")
 )
 
-type OutputValidator interface {
-	CheckRootAgreement(ctx context.Context, l1HeadNum uint64, l2BlockNum uint64, root common.Hash) (bool, common.Hash, error)
-}
-
 type ForecastMetrics interface {
-	RecordClaimResolutionDelayMax(delay float64)
 	RecordGameAgreement(status metrics.GameAgreementStatus, count int)
+	RecordLatestProposals(validTimestamp, invalidTimestamp uint64)
+	RecordIgnoredGames(count int)
+	RecordFailedGames(count int)
+}
+
+type forecastBatch struct {
+	AgreeDefenderAhead      int
+	DisagreeDefenderAhead   int
+	AgreeChallengerAhead    int
+	DisagreeChallengerAhead int
+
+	AgreeDefenderWins      int
+	DisagreeDefenderWins   int
+	AgreeChallengerWins    int
+	DisagreeChallengerWins int
+
+	LatestInvalidProposal uint64
+	LatestValidProposal   uint64
 }
 
-type forecast struct {
-	logger    log.Logger
-	metrics   ForecastMetrics
-	validator OutputValidator
+type Forecast struct {
+	logger  log.Logger
+	metrics ForecastMetrics
 }
 
-func newForecast(logger log.Logger, metrics ForecastMetrics, validator OutputValidator) *forecast {
-	return &forecast{
-		logger:    logger,
-		metrics:   metrics,
-		validator: validator,
+func NewForecast(logger log.Logger, metrics ForecastMetrics) *Forecast {
+	return &Forecast{
+		logger:  logger,
+		metrics: metrics,
 	}
 }
 
-func (f *forecast) Forecast(ctx context.Context, games []*monTypes.EnrichedGameData) {
-	batch := monTypes.ForecastBatch{}
+func (f *Forecast) Forecast(games []*monTypes.EnrichedGameData, ignoredCount, failedCount int) {
+	batch := forecastBatch{}
 	for _, game := range games {
-		if err := f.forecastGame(ctx, game, &batch); err != nil {
+		if err := f.forecastGame(game, &batch); err != nil {
 			f.logger.Error("Failed to forecast game", "err", err)
 		}
 	}
-	f.recordBatch(batch)
+	f.recordBatch(batch, ignoredCount, failedCount)
 }
 
-func (f *forecast) recordBatch(batch monTypes.ForecastBatch) {
+func (f *Forecast) recordBatch(batch forecastBatch, ignoredCount, failedCount int) {
 	f.metrics.RecordGameAgreement(metrics.AgreeDefenderWins, batch.AgreeDefenderWins)
 	f.metrics.RecordGameAgreement(metrics.DisagreeDefenderWins, batch.DisagreeDefenderWins)
 	f.metrics.RecordGameAgreement(metrics.AgreeChallengerWins, batch.AgreeChallengerWins)
@@ -62,18 +68,28 @@ func (f *forecast) recordBatch(batch monTypes.ForecastBatch) {
 	f.metrics.RecordGameAgreement(metrics.DisagreeChallengerAhead, batch.DisagreeChallengerAhead)
 	f.metrics.RecordGameAgreement(metrics.AgreeDefenderAhead, batch.AgreeDefenderAhead)
 	f.metrics.RecordGameAgreement(metrics.DisagreeDefenderAhead, batch.DisagreeDefenderAhead)
+
+	f.metrics.RecordLatestProposals(batch.LatestValidProposal, batch.LatestInvalidProposal)
+
+	f.metrics.RecordIgnoredGames(ignoredCount)
+	f.metrics.RecordFailedGames(failedCount)
 }
 
-func (f *forecast) forecastGame(ctx context.Context, game *monTypes.EnrichedGameData, metrics *monTypes.ForecastBatch) error {
+func (f *Forecast) forecastGame(game *monTypes.EnrichedGameData, metrics *forecastBatch) error {
 	// Check the root agreement.
-	agreement, expected, err := f.validator.CheckRootAgreement(ctx, game.L1HeadNum, game.L2BlockNumber, game.RootClaim)
-	if err != nil {
-		return fmt.Errorf("%w: %w", ErrRootAgreement, err)
-	}
+	agreement := game.AgreeWithClaim
+	expected := game.ExpectedRootClaim
 
 	expectedResult := types.GameStatusDefenderWon
 	if !agreement {
 		expectedResult = types.GameStatusChallengerWon
+		if metrics.LatestInvalidProposal < game.Timestamp {
+			metrics.LatestInvalidProposal = game.Timestamp
+		}
+	} else {
+		if metrics.LatestValidProposal < game.Timestamp {
+			metrics.LatestValidProposal = game.Timestamp
+		}
 	}
 
 	if game.Status != types.GameStatusInProgress {
@@ -100,11 +116,19 @@ func (f *forecast) forecastGame(ctx context.Context, game *monTypes.EnrichedGame
 		return nil
 	}
 
-	// Create the bidirectional tree of claims.
-	tree := transform.CreateBidirectionalTree(game.Claims)
-
-	// Compute the resolution status of the game.
-	forecastStatus := resolution.Resolve(tree)
+	var forecastStatus types.GameStatus
+	// Games that have their block number challenged are won
+	// by the challenger since the counter is proven on-chain.
+	if game.BlockNumberChallenged {
+		f.logger.Debug("Found game with challenged block number",
+			"game", game.Proxy, "blockNum", game.L2BlockNumber, "agreement", agreement)
+		// If the block number is challenged the challenger will always win
+		forecastStatus = types.GameStatusChallengerWon
+	} else {
+		// Otherwise we go through the resolution process to determine who would win based on the current claims
+		tree := transform.CreateBidirectionalTree(game.Claims)
+		forecastStatus = Resolve(tree)
+	}
 
 	if agreement {
 		// If we agree with the output root proposal, the Defender should win, defending that claim.
diff --git a/op-dispute-mon/mon/forecast_test.go b/op-dispute-mon/mon/forecast_test.go
index 16a97f0fee1a..dfae2d45a103 100644
--- a/op-dispute-mon/mon/forecast_test.go
+++ b/op-dispute-mon/mon/forecast_test.go
@@ -1,9 +1,6 @@
 package mon
 
 import (
-	"context"
-	"errors"
-	"fmt"
 	"math"
 	"math/big"
 	"testing"
@@ -19,6 +16,7 @@ import (
 )
 
 var (
+	mockRootClaim       = common.Hash{0x11}
 	failedForecastLog   = "Failed to forecast game"
 	lostGameLog         = "Unexpected game result"
 	unexpectedResultLog = "Forecasting unexpected game result"
@@ -29,32 +27,17 @@ func TestForecast_Forecast_BasicTests(t *testing.T) {
 	t.Parallel()
 
 	t.Run("NoGames", func(t *testing.T) {
-		forecast, _, rollup, logs := setupForecastTest(t)
-		forecast.Forecast(context.Background(), []*monTypes.EnrichedGameData{})
-		require.Equal(t, 0, rollup.calls)
+		forecast, _, logs := setupForecastTest(t)
+		forecast.Forecast([]*monTypes.EnrichedGameData{}, 0, 0)
 		levelFilter := testlog.NewLevelFilter(log.LevelError)
 		messageFilter := testlog.NewMessageFilter(failedForecastLog)
 		require.Nil(t, logs.FindLog(levelFilter, messageFilter))
 	})
 
-	t.Run("RollupFetchFails", func(t *testing.T) {
-		forecast, _, rollup, logs := setupForecastTest(t)
-		rollup.err = errors.New("boom")
-		forecast.Forecast(context.Background(), []*monTypes.EnrichedGameData{{}})
-		require.Equal(t, 1, rollup.calls)
-		levelFilter := testlog.NewLevelFilter(log.LevelError)
-		messageFilter := testlog.NewMessageFilter(failedForecastLog)
-		l := logs.FindLog(levelFilter, messageFilter)
-		require.NotNil(t, l)
-		err := l.AttrValue("err")
-		expectedErr := fmt.Errorf("%w: %w", ErrRootAgreement, rollup.err)
-		require.Equal(t, expectedErr, err)
-	})
-
 	t.Run("ChallengerWonGame_Agree", func(t *testing.T) {
-		forecast, m, _, logs := setupForecastTest(t)
-		expectedGame := monTypes.EnrichedGameData{Status: types.GameStatusChallengerWon, RootClaim: mockRootClaim}
-		forecast.Forecast(context.Background(), []*monTypes.EnrichedGameData{&expectedGame})
+		forecast, m, logs := setupForecastTest(t)
+		expectedGame := monTypes.EnrichedGameData{Status: types.GameStatusChallengerWon, RootClaim: mockRootClaim, AgreeWithClaim: true}
+		forecast.Forecast([]*monTypes.EnrichedGameData{&expectedGame}, 0, 0)
 		l := logs.FindLog(testlog.NewLevelFilter(log.LevelError), testlog.NewMessageFilter(lostGameLog))
 		require.NotNil(t, l)
 		require.Equal(t, expectedGame.Proxy, l.AttrValue("game"))
@@ -67,9 +50,9 @@ func TestForecast_Forecast_BasicTests(t *testing.T) {
 	})
 
 	t.Run("ChallengerWonGame_Disagree", func(t *testing.T) {
-		forecast, m, _, logs := setupForecastTest(t)
-		expectedGame := monTypes.EnrichedGameData{Status: types.GameStatusChallengerWon, RootClaim: common.Hash{0xbb}}
-		forecast.Forecast(context.Background(), []*monTypes.EnrichedGameData{&expectedGame})
+		forecast, m, logs := setupForecastTest(t)
+		expectedGame := monTypes.EnrichedGameData{Status: types.GameStatusChallengerWon, RootClaim: common.Hash{0xbb}, AgreeWithClaim: false}
+		forecast.Forecast([]*monTypes.EnrichedGameData{&expectedGame}, 0, 0)
 		l := logs.FindLog(testlog.NewLevelFilter(log.LevelError), testlog.NewMessageFilter(lostGameLog))
 		require.Nil(t, l)
 
@@ -79,9 +62,9 @@ func TestForecast_Forecast_BasicTests(t *testing.T) {
 	})
 
 	t.Run("DefenderWonGame_Agree", func(t *testing.T) {
-		forecast, m, _, logs := setupForecastTest(t)
-		expectedGame := monTypes.EnrichedGameData{Status: types.GameStatusDefenderWon, RootClaim: mockRootClaim}
-		forecast.Forecast(context.Background(), []*monTypes.EnrichedGameData{&expectedGame})
+		forecast, m, logs := setupForecastTest(t)
+		expectedGame := monTypes.EnrichedGameData{Status: types.GameStatusDefenderWon, RootClaim: mockRootClaim, AgreeWithClaim: true}
+		forecast.Forecast([]*monTypes.EnrichedGameData{&expectedGame}, 0, 0)
 		l := logs.FindLog(testlog.NewLevelFilter(log.LevelError), testlog.NewMessageFilter(lostGameLog))
 		require.Nil(t, l)
 
@@ -91,9 +74,9 @@ func TestForecast_Forecast_BasicTests(t *testing.T) {
 	})
 
 	t.Run("DefenderWonGame_Disagree", func(t *testing.T) {
-		forecast, m, _, logs := setupForecastTest(t)
-		expectedGame := monTypes.EnrichedGameData{Status: types.GameStatusDefenderWon, RootClaim: common.Hash{0xbb}}
-		forecast.Forecast(context.Background(), []*monTypes.EnrichedGameData{&expectedGame})
+		forecast, m, logs := setupForecastTest(t)
+		expectedGame := monTypes.EnrichedGameData{Status: types.GameStatusDefenderWon, RootClaim: common.Hash{0xbb}, AgreeWithClaim: false}
+		forecast.Forecast([]*monTypes.EnrichedGameData{&expectedGame}, 0, 0)
 		l := logs.FindLog(testlog.NewLevelFilter(log.LevelError), testlog.NewMessageFilter(lostGameLog))
 		require.NotNil(t, l)
 		require.Equal(t, expectedGame.Proxy, l.AttrValue("game"))
@@ -106,16 +89,14 @@ func TestForecast_Forecast_BasicTests(t *testing.T) {
 	})
 
 	t.Run("SingleGame", func(t *testing.T) {
-		forecast, _, rollup, logs := setupForecastTest(t)
-		forecast.Forecast(context.Background(), []*monTypes.EnrichedGameData{{}})
-		require.Equal(t, 1, rollup.calls)
+		forecast, _, logs := setupForecastTest(t)
+		forecast.Forecast([]*monTypes.EnrichedGameData{{}}, 0, 0)
 		require.Nil(t, logs.FindLog(testlog.NewLevelFilter(log.LevelError), testlog.NewMessageFilter(failedForecastLog)))
 	})
 
 	t.Run("MultipleGames", func(t *testing.T) {
-		forecast, _, rollup, logs := setupForecastTest(t)
-		forecast.Forecast(context.Background(), []*monTypes.EnrichedGameData{{}, {}, {}})
-		require.Equal(t, 3, rollup.calls)
+		forecast, _, logs := setupForecastTest(t)
+		forecast.Forecast([]*monTypes.EnrichedGameData{{}, {}, {}}, 0, 0)
 		require.Nil(t, logs.FindLog(testlog.NewLevelFilter(log.LevelError), testlog.NewMessageFilter(failedForecastLog)))
 	})
 }
@@ -123,15 +104,58 @@ func TestForecast_Forecast_BasicTests(t *testing.T) {
 func TestForecast_Forecast_EndLogs(t *testing.T) {
 	t.Parallel()
 
+	t.Run("BlockNumberChallenged_AgreeWithChallenge", func(t *testing.T) {
+		forecast, m, logs := setupForecastTest(t)
+		expectedGame := monTypes.EnrichedGameData{
+			Status:                types.GameStatusInProgress,
+			BlockNumberChallenged: true,
+			L2BlockNumber:         6,
+			AgreeWithClaim:        false,
+		}
+		forecast.Forecast([]*monTypes.EnrichedGameData{&expectedGame}, 0, 0)
+		l := logs.FindLog(testlog.NewLevelFilter(log.LevelDebug), testlog.NewMessageFilter("Found game with challenged block number"))
+		require.NotNil(t, l)
+		require.Equal(t, expectedGame.Proxy, l.AttrValue("game"))
+		require.Equal(t, expectedGame.L2BlockNumber, l.AttrValue("blockNum"))
+		require.Equal(t, false, l.AttrValue("agreement"))
+
+		expectedMetrics := zeroGameAgreement()
+		// We disagree with the root claim and the challenger is ahead
+		expectedMetrics[metrics.DisagreeChallengerAhead] = 1
+		require.Equal(t, expectedMetrics, m.gameAgreement)
+	})
+
+	t.Run("BlockNumberChallenged_DisagreeWithChallenge", func(t *testing.T) {
+		forecast, m, logs := setupForecastTest(t)
+		expectedGame := monTypes.EnrichedGameData{
+			Status:                types.GameStatusInProgress,
+			BlockNumberChallenged: true,
+			L2BlockNumber:         6,
+			AgreeWithClaim:        true,
+		}
+		forecast.Forecast([]*monTypes.EnrichedGameData{&expectedGame}, 0, 0)
+		l := logs.FindLog(testlog.NewLevelFilter(log.LevelDebug), testlog.NewMessageFilter("Found game with challenged block number"))
+		require.NotNil(t, l)
+		require.Equal(t, expectedGame.Proxy, l.AttrValue("game"))
+		require.Equal(t, expectedGame.L2BlockNumber, l.AttrValue("blockNum"))
+		require.Equal(t, true, l.AttrValue("agreement"))
+
+		expectedMetrics := zeroGameAgreement()
+		// We agree with the root claim and the challenger is ahead
+		expectedMetrics[metrics.AgreeChallengerAhead] = 1
+		require.Equal(t, expectedMetrics, m.gameAgreement)
+	})
+
 	t.Run("AgreeDefenderWins", func(t *testing.T) {
-		forecast, _, rollup, logs := setupForecastTest(t)
+		forecast, _, logs := setupForecastTest(t)
 		games := []*monTypes.EnrichedGameData{{
-			Status:    types.GameStatusInProgress,
-			RootClaim: mockRootClaim,
-			Claims:    createDeepClaimList()[:1],
+			Status:            types.GameStatusInProgress,
+			RootClaim:         mockRootClaim,
+			Claims:            createDeepClaimList()[:1],
+			AgreeWithClaim:    true,
+			ExpectedRootClaim: mockRootClaim,
 		}}
-		forecast.Forecast(context.Background(), games)
-		require.Equal(t, 1, rollup.calls)
+		forecast.Forecast(games, 0, 0)
 		levelFilter := testlog.NewLevelFilter(log.LevelError)
 		messageFilter := testlog.NewMessageFilter(failedForecastLog)
 		require.Nil(t, logs.FindLog(levelFilter, messageFilter))
@@ -145,14 +169,15 @@ func TestForecast_Forecast_EndLogs(t *testing.T) {
 	})
 
 	t.Run("AgreeChallengerWins", func(t *testing.T) {
-		forecast, _, rollup, logs := setupForecastTest(t)
+		forecast, _, logs := setupForecastTest(t)
 		games := []*monTypes.EnrichedGameData{{
-			Status:    types.GameStatusInProgress,
-			RootClaim: mockRootClaim,
-			Claims:    createDeepClaimList()[:2],
+			Status:            types.GameStatusInProgress,
+			RootClaim:         mockRootClaim,
+			Claims:            createDeepClaimList()[:2],
+			AgreeWithClaim:    true,
+			ExpectedRootClaim: mockRootClaim,
 		}}
-		forecast.Forecast(context.Background(), games)
-		require.Equal(t, 1, rollup.calls)
+		forecast.Forecast(games, 0, 0)
 		levelFilter := testlog.NewLevelFilter(log.LevelError)
 		messageFilter := testlog.NewMessageFilter(failedForecastLog)
 		require.Nil(t, logs.FindLog(levelFilter, messageFilter))
@@ -166,12 +191,13 @@ func TestForecast_Forecast_EndLogs(t *testing.T) {
 	})
 
 	t.Run("DisagreeChallengerWins", func(t *testing.T) {
-		forecast, _, rollup, logs := setupForecastTest(t)
-		forecast.Forecast(context.Background(), []*monTypes.EnrichedGameData{{
-			Status: types.GameStatusInProgress,
-			Claims: createDeepClaimList()[:2],
-		}})
-		require.Equal(t, 1, rollup.calls)
+		forecast, _, logs := setupForecastTest(t)
+		forecast.Forecast([]*monTypes.EnrichedGameData{{
+			Status:            types.GameStatusInProgress,
+			Claims:            createDeepClaimList()[:2],
+			AgreeWithClaim:    false,
+			ExpectedRootClaim: mockRootClaim,
+		}}, 0, 0)
 		levelFilter := testlog.NewLevelFilter(log.LevelError)
 		messageFilter := testlog.NewMessageFilter(failedForecastLog)
 		require.Nil(t, logs.FindLog(levelFilter, messageFilter))
@@ -185,12 +211,13 @@ func TestForecast_Forecast_EndLogs(t *testing.T) {
 	})
 
 	t.Run("DisagreeDefenderWins", func(t *testing.T) {
-		forecast, _, rollup, logs := setupForecastTest(t)
-		forecast.Forecast(context.Background(), []*monTypes.EnrichedGameData{{
-			Status: types.GameStatusInProgress,
-			Claims: createDeepClaimList()[:1],
-		}})
-		require.Equal(t, 1, rollup.calls)
+		forecast, _, logs := setupForecastTest(t)
+		forecast.Forecast([]*monTypes.EnrichedGameData{{
+			Status:            types.GameStatusInProgress,
+			Claims:            createDeepClaimList()[:1],
+			AgreeWithClaim:    false,
+			ExpectedRootClaim: mockRootClaim,
+		}}, 0, 0)
 		levelFilter := testlog.NewLevelFilter(log.LevelError)
 		messageFilter := testlog.NewMessageFilter(failedForecastLog)
 		require.Nil(t, logs.FindLog(levelFilter, messageFilter))
@@ -205,7 +232,7 @@ func TestForecast_Forecast_EndLogs(t *testing.T) {
 }
 
 func TestForecast_Forecast_MultipleGames(t *testing.T) {
-	forecast, _, rollup, logs := setupForecastTest(t)
+	forecast, m, logs := setupForecastTest(t)
 	gameStatus := []types.GameStatus{
 		types.GameStatusChallengerWon,
 		types.GameStatusInProgress,
@@ -217,7 +244,7 @@ func TestForecast_Forecast_MultipleGames(t *testing.T) {
 		types.GameStatusChallengerWon,
 		types.GameStatusChallengerWon,
 	}
-	claims := [][]faultTypes.Claim{
+	claims := [][]monTypes.EnrichedClaim{
 		createDeepClaimList()[:1],
 		createDeepClaimList()[:2],
 		createDeepClaimList()[:2],
@@ -236,8 +263,8 @@ func TestForecast_Forecast_MultipleGames(t *testing.T) {
 		{},
 		mockRootClaim,
 		{},
-		{},
-		{},
+		{},            // Expected latest invalid proposal (will have timestamp 7)
+		mockRootClaim, // Expected latest valid proposal (will have timestamp 8)
 	}
 	games := make([]*monTypes.EnrichedGameData, 9)
 	for i := range games {
@@ -245,22 +272,36 @@ func TestForecast_Forecast_MultipleGames(t *testing.T) {
 			Status:    gameStatus[i],
 			Claims:    claims[i],
 			RootClaim: rootClaims[i],
+			GameMetadata: types.GameMetadata{
+				Timestamp: uint64(i),
+			},
+			AgreeWithClaim:    rootClaims[i] == mockRootClaim,
+			ExpectedRootClaim: mockRootClaim,
 		}
 	}
-	forecast.Forecast(context.Background(), games)
-	require.Equal(t, len(games), rollup.calls)
-	levelFilter := testlog.NewLevelFilter(log.LevelError)
-	messageFilter := testlog.NewMessageFilter(failedForecastLog)
-	require.Nil(t, logs.FindLog(levelFilter, messageFilter))
+	forecast.Forecast(games, 3, 4)
+	require.Nil(t, logs.FindLog(testlog.NewLevelFilter(log.LevelError), testlog.NewMessageFilter(failedForecastLog)))
+	expectedMetrics := zeroGameAgreement()
+	expectedMetrics[metrics.AgreeChallengerAhead] = 1
+	expectedMetrics[metrics.DisagreeChallengerAhead] = 1
+	expectedMetrics[metrics.AgreeDefenderAhead] = 1
+	expectedMetrics[metrics.DisagreeDefenderAhead] = 1
+	expectedMetrics[metrics.AgreeChallengerWins] = 1
+	expectedMetrics[metrics.DisagreeDefenderWins] = 2
+	expectedMetrics[metrics.DisagreeChallengerWins] = 2
+	require.Equal(t, expectedMetrics, m.gameAgreement)
+	require.Equal(t, 3, m.ignoredGames)
+	require.Equal(t, 4, m.contractCreationFails)
+	require.EqualValues(t, 7, m.latestInvalidProposal)
+	require.EqualValues(t, 8, m.latestValidProposal)
 }
 
-func setupForecastTest(t *testing.T) (*forecast, *mockForecastMetrics, *stubOutputValidator, *testlog.CapturingHandler) {
+func setupForecastTest(t *testing.T) (*Forecast, *mockForecastMetrics, *testlog.CapturingHandler) {
 	logger, capturedLogs := testlog.CaptureLogger(t, log.LvlDebug)
-	validator := &stubOutputValidator{}
-	metrics := &mockForecastMetrics{
+	m := &mockForecastMetrics{
 		gameAgreement: zeroGameAgreement(),
 	}
-	return newForecast(logger, metrics, validator), metrics, validator, capturedLogs
+	return NewForecast(logger, m), m, capturedLogs
 }
 
 func zeroGameAgreement() map[metrics.GameAgreementStatus]int {
@@ -277,56 +318,61 @@ func zeroGameAgreement() map[metrics.GameAgreementStatus]int {
 }
 
 type mockForecastMetrics struct {
-	gameAgreement           map[metrics.GameAgreementStatus]int
-	claimResolutionDelayMax float64
+	gameAgreement         map[metrics.GameAgreementStatus]int
+	ignoredGames          int
+	latestInvalidProposal uint64
+	latestValidProposal   uint64
+	contractCreationFails int
+}
+
+func (m *mockForecastMetrics) RecordFailedGames(count int) {
+	m.contractCreationFails = count
 }
 
 func (m *mockForecastMetrics) RecordGameAgreement(status metrics.GameAgreementStatus, count int) {
 	m.gameAgreement[status] = count
 }
 
-func (m *mockForecastMetrics) RecordClaimResolutionDelayMax(delay float64) {
-	m.claimResolutionDelayMax = delay
+func (m *mockForecastMetrics) RecordLatestProposals(valid, invalid uint64) {
+	m.latestValidProposal = valid
+	m.latestInvalidProposal = invalid
+}
+
+func (m *mockForecastMetrics) RecordIgnoredGames(count int) {
+	m.ignoredGames = count
 }
 
-func createDeepClaimList() []faultTypes.Claim {
-	return []faultTypes.Claim{
+func createDeepClaimList() []monTypes.EnrichedClaim {
+	return []monTypes.EnrichedClaim{
 		{
-			ClaimData: faultTypes.ClaimData{
-				Position: faultTypes.NewPosition(0, big.NewInt(0)),
+			Claim: faultTypes.Claim{
+				ClaimData: faultTypes.ClaimData{
+					Position: faultTypes.NewPosition(0, big.NewInt(0)),
+				},
+				ContractIndex:       0,
+				ParentContractIndex: math.MaxInt64,
+				Claimant:            common.HexToAddress("0x111111"),
 			},
-			ContractIndex:       0,
-			ParentContractIndex: math.MaxInt64,
-			Claimant:            common.HexToAddress("0x111111"),
 		},
 		{
-			ClaimData: faultTypes.ClaimData{
-				Position: faultTypes.NewPosition(1, big.NewInt(0)),
+			Claim: faultTypes.Claim{
+				ClaimData: faultTypes.ClaimData{
+					Position: faultTypes.NewPosition(1, big.NewInt(0)),
+				},
+				ContractIndex:       1,
+				ParentContractIndex: 0,
+				Claimant:            common.HexToAddress("0x222222"),
 			},
-			ContractIndex:       1,
-			ParentContractIndex: 0,
-			Claimant:            common.HexToAddress("0x222222"),
 		},
 		{
-			ClaimData: faultTypes.ClaimData{
-				Position: faultTypes.NewPosition(2, big.NewInt(0)),
+			Claim: faultTypes.Claim{
+				ClaimData: faultTypes.ClaimData{
+					Position: faultTypes.NewPosition(2, big.NewInt(0)),
+				},
+				ContractIndex:       2,
+				ParentContractIndex: 1,
+				Claimant:            common.HexToAddress("0x111111"),
 			},
-			ContractIndex:       2,
-			ParentContractIndex: 1,
-			Claimant:            common.HexToAddress("0x111111"),
 		},
 	}
 }
-
-type stubOutputValidator struct {
-	calls int
-	err   error
-}
-
-func (s *stubOutputValidator) CheckRootAgreement(_ context.Context, _ uint64, _ uint64, rootClaim common.Hash) (bool, common.Hash, error) {
-	s.calls++
-	if s.err != nil {
-		return false, common.Hash{}, s.err
-	}
-	return rootClaim == mockRootClaim, mockRootClaim, nil
-}
diff --git a/op-dispute-mon/mon/l2_challenges.go b/op-dispute-mon/mon/l2_challenges.go
new file mode 100644
index 000000000000..84b4fd7a7ed0
--- /dev/null
+++ b/op-dispute-mon/mon/l2_challenges.go
@@ -0,0 +1,42 @@
+package mon
+
+import (
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum/go-ethereum/log"
+)
+
+type L2ChallengesMetrics interface {
+	RecordL2Challenges(agreement bool, count int)
+}
+
+type L2ChallengesMonitor struct {
+	logger  log.Logger
+	metrics L2ChallengesMetrics
+}
+
+func NewL2ChallengesMonitor(logger log.Logger, metrics L2ChallengesMetrics) *L2ChallengesMonitor {
+	return &L2ChallengesMonitor{
+		logger:  logger,
+		metrics: metrics,
+	}
+}
+
+func (m *L2ChallengesMonitor) CheckL2Challenges(games []*types.EnrichedGameData) {
+	agreeChallengeCount := 0
+	disagreeChallengeCount := 0
+	for _, game := range games {
+		if game.BlockNumberChallenged {
+			if game.AgreeWithClaim {
+				m.logger.Warn("Found game with valid block number challenged",
+					"game", game.Proxy, "blockNum", game.L2BlockNumber, "agreement", game.AgreeWithClaim, "challenger", game.BlockNumberChallenger)
+				agreeChallengeCount++
+			} else {
+				m.logger.Debug("Found game with invalid block number challenged",
+					"game", game.Proxy, "blockNum", game.L2BlockNumber, "agreement", game.AgreeWithClaim, "challenger", game.BlockNumberChallenger)
+				disagreeChallengeCount++
+			}
+		}
+	}
+	m.metrics.RecordL2Challenges(true, agreeChallengeCount)
+	m.metrics.RecordL2Challenges(false, disagreeChallengeCount)
+}
diff --git a/op-dispute-mon/mon/l2_challenges_test.go b/op-dispute-mon/mon/l2_challenges_test.go
new file mode 100644
index 000000000000..9940126b464a
--- /dev/null
+++ b/op-dispute-mon/mon/l2_challenges_test.go
@@ -0,0 +1,60 @@
+package mon
+
+import (
+	"testing"
+
+	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/stretchr/testify/require"
+)
+
+func TestMonitorL2Challenges(t *testing.T) {
+	games := []*types.EnrichedGameData{
+		{GameMetadata: gameTypes.GameMetadata{Proxy: common.Address{0x44}}, BlockNumberChallenged: true, AgreeWithClaim: true, L2BlockNumber: 44, BlockNumberChallenger: common.Address{0x55}},
+		{BlockNumberChallenged: false, AgreeWithClaim: true},
+		{GameMetadata: gameTypes.GameMetadata{Proxy: common.Address{0x22}}, BlockNumberChallenged: true, AgreeWithClaim: false, L2BlockNumber: 22, BlockNumberChallenger: common.Address{0x33}},
+		{BlockNumberChallenged: false, AgreeWithClaim: false},
+		{BlockNumberChallenged: false, AgreeWithClaim: false},
+		{BlockNumberChallenged: false, AgreeWithClaim: true},
+	}
+	metrics := &stubL2ChallengeMetrics{}
+	logger, capturedLogs := testlog.CaptureLogger(t, log.LvlDebug)
+	monitor := NewL2ChallengesMonitor(logger, metrics)
+	monitor.CheckL2Challenges(games)
+	require.Equal(t, 1, metrics.challengeCount[true])
+	require.Equal(t, 1, metrics.challengeCount[false])
+
+	// Warn log for challenged and agreement
+	levelFilter := testlog.NewLevelFilter(log.LevelWarn)
+	messageFilter := testlog.NewMessageFilter("Found game with valid block number challenged")
+	l := capturedLogs.FindLog(levelFilter, messageFilter)
+	require.NotNil(t, l)
+	require.Equal(t, common.Address{0x44}, l.AttrValue("game"))
+	require.Equal(t, uint64(44), l.AttrValue("blockNum"))
+	require.Equal(t, true, l.AttrValue("agreement"))
+	require.Equal(t, common.Address{0x55}, l.AttrValue("challenger"))
+
+	// Debug log for challenged but disagreement
+	levelFilter = testlog.NewLevelFilter(log.LevelDebug)
+	messageFilter = testlog.NewMessageFilter("Found game with invalid block number challenged")
+	l = capturedLogs.FindLog(levelFilter, messageFilter)
+	require.NotNil(t, l)
+	require.Equal(t, common.Address{0x22}, l.AttrValue("game"))
+	require.Equal(t, uint64(22), l.AttrValue("blockNum"))
+	require.Equal(t, false, l.AttrValue("agreement"))
+	require.Equal(t, common.Address{0x33}, l.AttrValue("challenger"))
+}
+
+type stubL2ChallengeMetrics struct {
+	challengeCount map[bool]int
+}
+
+func (s *stubL2ChallengeMetrics) RecordL2Challenges(agreement bool, count int) {
+	if s.challengeCount == nil {
+		s.challengeCount = make(map[bool]int)
+	}
+	s.challengeCount[agreement] = count
+}
diff --git a/op-dispute-mon/mon/monitor.go b/op-dispute-mon/mon/monitor.go
index 1c83fdd6a519..039255608c73 100644
--- a/op-dispute-mon/mon/monitor.go
+++ b/op-dispute-mon/mon/monitor.go
@@ -13,16 +13,22 @@ import (
 	"github.com/ethereum/go-ethereum/log"
 )
 
-type Forecast func(ctx context.Context, games []*types.EnrichedGameData)
+type ForecastResolution func(games []*types.EnrichedGameData, ignoredCount, failedCount int)
 type Bonds func(games []*types.EnrichedGameData)
+type Resolutions func(games []*types.EnrichedGameData)
+type Monitor func(games []*types.EnrichedGameData)
 type BlockHashFetcher func(ctx context.Context, number *big.Int) (common.Hash, error)
 type BlockNumberFetcher func(ctx context.Context) (uint64, error)
-type Extract func(ctx context.Context, blockHash common.Hash, minTimestamp uint64) ([]*types.EnrichedGameData, error)
-type RecordClaimResolutionDelayMax func([]*types.EnrichedGameData)
+type Extract func(ctx context.Context, blockHash common.Hash, minTimestamp uint64) ([]*types.EnrichedGameData, int, int, error)
+
+type MonitorMetrics interface {
+	RecordMonitorDuration(dur time.Duration)
+}
 
 type gameMonitor struct {
-	logger log.Logger
-	clock  clock.Clock
+	logger  log.Logger
+	clock   clock.Clock
+	metrics MonitorMetrics
 
 	done   chan struct{}
 	ctx    context.Context
@@ -31,9 +37,12 @@ type gameMonitor struct {
 	gameWindow      time.Duration
 	monitorInterval time.Duration
 
-	delays           RecordClaimResolutionDelayMax
-	forecast         Forecast
+	forecast         ForecastResolution
 	bonds            Bonds
+	resolutions      Resolutions
+	claims           Monitor
+	withdrawals      Monitor
+	l2Challenges     Monitor
 	extract          Extract
 	fetchBlockHash   BlockHashFetcher
 	fetchBlockNumber BlockNumberFetcher
@@ -43,11 +52,15 @@ func newGameMonitor(
 	ctx context.Context,
 	logger log.Logger,
 	cl clock.Clock,
+	metrics MonitorMetrics,
 	monitorInterval time.Duration,
 	gameWindow time.Duration,
-	delays RecordClaimResolutionDelayMax,
-	forecast Forecast,
+	forecast ForecastResolution,
 	bonds Bonds,
+	resolutions Resolutions,
+	claims Monitor,
+	withdrawals Monitor,
+	l2Challenges Monitor,
 	extract Extract,
 	fetchBlockNumber BlockNumberFetcher,
 	fetchBlockHash BlockHashFetcher,
@@ -57,30 +70,23 @@ func newGameMonitor(
 		clock:            cl,
 		ctx:              ctx,
 		done:             make(chan struct{}),
+		metrics:          metrics,
 		monitorInterval:  monitorInterval,
 		gameWindow:       gameWindow,
-		delays:           delays,
 		forecast:         forecast,
 		bonds:            bonds,
+		resolutions:      resolutions,
+		claims:           claims,
+		withdrawals:      withdrawals,
+		l2Challenges:     l2Challenges,
 		extract:          extract,
 		fetchBlockNumber: fetchBlockNumber,
 		fetchBlockHash:   fetchBlockHash,
 	}
 }
 
-func (m *gameMonitor) minGameTimestamp() uint64 {
-	if m.gameWindow.Seconds() == 0 {
-		return 0
-	}
-	// time: "To compute t-d for a duration d, use t.Add(-d)."
-	// https://pkg.go.dev/time#Time.Sub
-	if m.clock.Now().Unix() > int64(m.gameWindow.Seconds()) {
-		return uint64(m.clock.Now().Add(-m.gameWindow).Unix())
-	}
-	return 0
-}
-
 func (m *gameMonitor) monitorGames() error {
+	start := m.clock.Now()
 	blockNumber, err := m.fetchBlockNumber(m.ctx)
 	if err != nil {
 		return fmt.Errorf("failed to fetch block number: %w", err)
@@ -90,13 +96,20 @@ func (m *gameMonitor) monitorGames() error {
 	if err != nil {
 		return fmt.Errorf("failed to fetch block hash: %w", err)
 	}
-	enrichedGames, err := m.extract(m.ctx, blockHash, m.minGameTimestamp())
+	minGameTimestamp := clock.MinCheckedTimestamp(m.clock, m.gameWindow)
+	enrichedGames, ignored, failed, err := m.extract(m.ctx, blockHash, minGameTimestamp)
 	if err != nil {
 		return fmt.Errorf("failed to load games: %w", err)
 	}
-	m.delays(enrichedGames)
-	m.forecast(m.ctx, enrichedGames)
+	m.resolutions(enrichedGames)
+	m.forecast(enrichedGames, ignored, failed)
 	m.bonds(enrichedGames)
+	m.claims(enrichedGames)
+	m.withdrawals(enrichedGames)
+	m.l2Challenges(enrichedGames)
+	timeTaken := m.clock.Since(start)
+	m.metrics.RecordMonitorDuration(timeTaken)
+	m.logger.Info("Completed monitoring update", "blockNumber", blockNumber, "blockHash", blockHash, "duration", timeTaken, "games", len(enrichedGames), "ignored", ignored, "failed", failed)
 	return nil
 }
 
diff --git a/op-dispute-mon/mon/monitor_test.go b/op-dispute-mon/mon/monitor_test.go
index 68ef62d0312a..180c29bb26ce 100644
--- a/op-dispute-mon/mon/monitor_test.go
+++ b/op-dispute-mon/mon/monitor_test.go
@@ -8,6 +8,7 @@ import (
 	"time"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/metrics"
 	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
 	"github.com/ethereum-optimism/optimism/op-service/clock"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
@@ -20,37 +21,11 @@ var (
 	mockErr = errors.New("mock error")
 )
 
-func TestMonitor_MinGameTimestamp(t *testing.T) {
-	t.Parallel()
-
-	t.Run("ZeroGameWindow", func(t *testing.T) {
-		monitor, _, _, _, _ := setupMonitorTest(t)
-		monitor.gameWindow = time.Duration(0)
-		require.Equal(t, monitor.minGameTimestamp(), uint64(0))
-	})
-
-	t.Run("ZeroClock", func(t *testing.T) {
-		monitor, _, _, _, _ := setupMonitorTest(t)
-		monitor.gameWindow = time.Minute
-		monitor.clock = clock.NewDeterministicClock(time.Unix(0, 0))
-		require.Equal(t, uint64(0), monitor.minGameTimestamp())
-	})
-
-	t.Run("ValidArithmetic", func(t *testing.T) {
-		monitor, _, _, _, _ := setupMonitorTest(t)
-		monitor.gameWindow = time.Minute
-		frozen := time.Unix(int64(time.Hour.Seconds()), 0)
-		monitor.clock = clock.NewDeterministicClock(frozen)
-		expected := uint64(frozen.Add(-time.Minute).Unix())
-		require.Equal(t, monitor.minGameTimestamp(), expected)
-	})
-}
-
 func TestMonitor_MonitorGames(t *testing.T) {
 	t.Parallel()
 
 	t.Run("FailedFetchBlocknumber", func(t *testing.T) {
-		monitor, _, _, _, _ := setupMonitorTest(t)
+		monitor, _, _, _, _, _, _, _ := setupMonitorTest(t)
 		boom := errors.New("boom")
 		monitor.fetchBlockNumber = func(ctx context.Context) (uint64, error) {
 			return 0, boom
@@ -60,7 +35,7 @@ func TestMonitor_MonitorGames(t *testing.T) {
 	})
 
 	t.Run("FailedFetchBlockHash", func(t *testing.T) {
-		monitor, _, _, _, _ := setupMonitorTest(t)
+		monitor, _, _, _, _, _, _, _ := setupMonitorTest(t)
 		boom := errors.New("boom")
 		monitor.fetchBlockHash = func(ctx context.Context, number *big.Int) (common.Hash, error) {
 			return common.Hash{}, boom
@@ -70,23 +45,29 @@ func TestMonitor_MonitorGames(t *testing.T) {
 	})
 
 	t.Run("MonitorsWithNoGames", func(t *testing.T) {
-		monitor, factory, forecast, delays, bonds := setupMonitorTest(t)
+		monitor, factory, forecast, bonds, withdrawals, resolutions, claims, l2Challenges := setupMonitorTest(t)
 		factory.games = []*monTypes.EnrichedGameData{}
 		err := monitor.monitorGames()
 		require.NoError(t, err)
 		require.Equal(t, 1, forecast.calls)
-		require.Equal(t, 1, delays.calls)
 		require.Equal(t, 1, bonds.calls)
+		require.Equal(t, 1, resolutions.calls)
+		require.Equal(t, 1, claims.calls)
+		require.Equal(t, 1, withdrawals.calls)
+		require.Equal(t, 1, l2Challenges.calls)
 	})
 
 	t.Run("MonitorsMultipleGames", func(t *testing.T) {
-		monitor, factory, forecast, delays, bonds := setupMonitorTest(t)
+		monitor, factory, forecast, bonds, withdrawals, resolutions, claims, l2Challenges := setupMonitorTest(t)
 		factory.games = []*monTypes.EnrichedGameData{{}, {}, {}}
 		err := monitor.monitorGames()
 		require.NoError(t, err)
 		require.Equal(t, 1, forecast.calls)
-		require.Equal(t, 1, delays.calls)
 		require.Equal(t, 1, bonds.calls)
+		require.Equal(t, 1, resolutions.calls)
+		require.Equal(t, 1, claims.calls)
+		require.Equal(t, 1, withdrawals.calls)
+		require.Equal(t, 1, l2Challenges.calls)
 	})
 }
 
@@ -94,7 +75,7 @@ func TestMonitor_StartMonitoring(t *testing.T) {
 	t.Run("MonitorsGames", func(t *testing.T) {
 		addr1 := common.Address{0xaa}
 		addr2 := common.Address{0xbb}
-		monitor, factory, forecaster, _, _ := setupMonitorTest(t)
+		monitor, factory, forecaster, _, _, _, _, _ := setupMonitorTest(t)
 		factory.games = []*monTypes.EnrichedGameData{newEnrichedGameData(addr1, 9999), newEnrichedGameData(addr2, 9999)}
 		factory.maxSuccess = len(factory.games) // Only allow two successful fetches
 
@@ -107,7 +88,7 @@ func TestMonitor_StartMonitoring(t *testing.T) {
 	})
 
 	t.Run("FailsToFetchGames", func(t *testing.T) {
-		monitor, factory, forecaster, _, _ := setupMonitorTest(t)
+		monitor, factory, forecaster, _, _, _, _, _ := setupMonitorTest(t)
 		factory.fetchErr = errors.New("boom")
 
 		monitor.StartMonitoring()
@@ -129,7 +110,7 @@ func newEnrichedGameData(proxy common.Address, timestamp uint64) *monTypes.Enric
 	}
 }
 
-func setupMonitorTest(t *testing.T) (*gameMonitor, *mockExtractor, *mockForecast, *mockDelayCalculator, *mockBonds) {
+func setupMonitorTest(t *testing.T) (*gameMonitor, *mockExtractor, *mockForecast, *mockBonds, *mockMonitor, *mockResolutionMonitor, *mockMonitor, *mockMonitor) {
 	logger := testlog.Logger(t, log.LvlDebug)
 	fetchBlockNum := func(ctx context.Context) (uint64, error) {
 		return 1, nil
@@ -143,28 +124,43 @@ func setupMonitorTest(t *testing.T) (*gameMonitor, *mockExtractor, *mockForecast
 	extractor := &mockExtractor{}
 	forecast := &mockForecast{}
 	bonds := &mockBonds{}
-	delays := &mockDelayCalculator{}
+	resolutions := &mockResolutionMonitor{}
+	claims := &mockMonitor{}
+	withdrawals := &mockMonitor{}
+	l2Challenges := &mockMonitor{}
 	monitor := newGameMonitor(
 		context.Background(),
 		logger,
 		cl,
+		metrics.NoopMetrics,
 		monitorInterval,
 		10*time.Second,
-		delays.RecordClaimResolutionDelayMax,
 		forecast.Forecast,
 		bonds.CheckBonds,
+		resolutions.CheckResolutions,
+		claims.Check,
+		withdrawals.Check,
+		l2Challenges.Check,
 		extractor.Extract,
 		fetchBlockNum,
 		fetchBlockHash,
 	)
-	return monitor, extractor, forecast, delays, bonds
+	return monitor, extractor, forecast, bonds, withdrawals, resolutions, claims, l2Challenges
+}
+
+type mockResolutionMonitor struct {
+	calls int
+}
+
+func (m *mockResolutionMonitor) CheckResolutions(games []*monTypes.EnrichedGameData) {
+	m.calls++
 }
 
-type mockDelayCalculator struct {
+type mockMonitor struct {
 	calls int
 }
 
-func (m *mockDelayCalculator) RecordClaimResolutionDelayMax(games []*monTypes.EnrichedGameData) {
+func (m *mockMonitor) Check(games []*monTypes.EnrichedGameData) {
 	m.calls++
 }
 
@@ -172,7 +168,7 @@ type mockForecast struct {
 	calls int
 }
 
-func (m *mockForecast) Forecast(ctx context.Context, games []*monTypes.EnrichedGameData) {
+func (m *mockForecast) Forecast(_ []*monTypes.EnrichedGameData, _, _ int) {
 	m.calls++
 }
 
@@ -185,23 +181,25 @@ func (m *mockBonds) CheckBonds(_ []*monTypes.EnrichedGameData) {
 }
 
 type mockExtractor struct {
-	fetchErr   error
-	calls      int
-	maxSuccess int
-	games      []*monTypes.EnrichedGameData
+	fetchErr     error
+	calls        int
+	maxSuccess   int
+	games        []*monTypes.EnrichedGameData
+	ignoredCount int
+	failedCount  int
 }
 
 func (m *mockExtractor) Extract(
 	_ context.Context,
 	_ common.Hash,
 	_ uint64,
-) ([]*monTypes.EnrichedGameData, error) {
+) ([]*monTypes.EnrichedGameData, int, int, error) {
 	m.calls++
 	if m.fetchErr != nil {
-		return nil, m.fetchErr
+		return nil, 0, 0, m.fetchErr
 	}
 	if m.calls > m.maxSuccess && m.maxSuccess != 0 {
-		return nil, mockErr
+		return nil, 0, 0, mockErr
 	}
-	return m.games, nil
+	return m.games, m.ignoredCount, m.failedCount, nil
 }
diff --git a/op-dispute-mon/mon/resolution/delay.go b/op-dispute-mon/mon/resolution/delay.go
deleted file mode 100644
index 5067f3aa7f95..000000000000
--- a/op-dispute-mon/mon/resolution/delay.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package resolution
-
-import (
-	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
-	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
-	"github.com/ethereum-optimism/optimism/op-service/clock"
-)
-
-type DelayMetrics interface {
-	RecordClaimResolutionDelayMax(delay float64)
-}
-
-type DelayCalculator struct {
-	metrics DelayMetrics
-	clock   clock.Clock
-}
-
-func NewDelayCalculator(metrics DelayMetrics, clock clock.Clock) *DelayCalculator {
-	return &DelayCalculator{
-		metrics: metrics,
-		clock:   clock,
-	}
-}
-
-func (d *DelayCalculator) RecordClaimResolutionDelayMax(games []*monTypes.EnrichedGameData) {
-	var maxDelay uint64 = 0
-	for _, game := range games {
-		maxDelay = max(d.getMaxResolutionDelay(game), maxDelay)
-	}
-	d.metrics.RecordClaimResolutionDelayMax(float64(maxDelay))
-}
-
-func (d *DelayCalculator) getMaxResolutionDelay(game *monTypes.EnrichedGameData) uint64 {
-	var maxDelay uint64 = 0
-	for _, claim := range game.Claims {
-		maxDelay = max(d.getOverflowTime(game.Duration, &claim), maxDelay)
-	}
-	return maxDelay
-}
-
-func (d *DelayCalculator) getOverflowTime(maxGameDuration uint64, claim *types.Claim) uint64 {
-	// If the bond amount is the max uint128 value, the claim is resolved.
-	if monTypes.ResolvedBondAmount.Cmp(claim.ClaimData.Bond) == 0 {
-		return 0
-	}
-	maxChessTime := maxGameDuration / 2
-	accumulatedTime := uint64(claim.ChessTime(d.clock.Now()))
-	if accumulatedTime < maxChessTime {
-		return 0
-	}
-	return accumulatedTime - maxChessTime
-}
diff --git a/op-dispute-mon/mon/resolution/delay_test.go b/op-dispute-mon/mon/resolution/delay_test.go
deleted file mode 100644
index 355a846e7c9d..000000000000
--- a/op-dispute-mon/mon/resolution/delay_test.go
+++ /dev/null
@@ -1,181 +0,0 @@
-package resolution
-
-import (
-	"math/big"
-	"testing"
-	"time"
-
-	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
-	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
-	"github.com/ethereum-optimism/optimism/op-service/clock"
-	"github.com/stretchr/testify/require"
-)
-
-var (
-	maxGameDuration = uint64(960)
-	frozen          = time.Unix(int64(time.Hour.Seconds()), 0)
-)
-
-func TestDelayCalculator_getOverflowTime(t *testing.T) {
-	t.Run("NoClock", func(t *testing.T) {
-		d, metrics, _ := setupDelayCalculatorTest(t)
-		claim := &types.Claim{
-			ClaimData: types.ClaimData{
-				Bond: monTypes.ResolvedBondAmount,
-			},
-		}
-		delay := d.getOverflowTime(maxGameDuration, claim)
-		require.Equal(t, uint64(0), delay)
-		require.Equal(t, 0, metrics.calls)
-	})
-
-	t.Run("RemainingTime", func(t *testing.T) {
-		d, metrics, cl := setupDelayCalculatorTest(t)
-		duration := uint64(3 * 60)
-		timestamp := uint64(cl.Now().Add(-time.Minute).Unix())
-		claim := &types.Claim{
-			ClaimData: types.ClaimData{
-				Bond: big.NewInt(5),
-			},
-			Clock: types.NewClock(duration, timestamp),
-		}
-		delay := d.getOverflowTime(maxGameDuration, claim)
-		require.Equal(t, uint64(0), delay)
-		require.Equal(t, 0, metrics.calls)
-	})
-
-	t.Run("OverflowTime", func(t *testing.T) {
-		d, metrics, cl := setupDelayCalculatorTest(t)
-		duration := maxGameDuration / 2
-		timestamp := uint64(cl.Now().Add(4 * -time.Minute).Unix())
-		claim := &types.Claim{
-			ClaimData: types.ClaimData{
-				Bond: big.NewInt(5),
-			},
-			Clock: types.NewClock(duration, timestamp),
-		}
-		delay := d.getOverflowTime(maxGameDuration, claim)
-		require.Equal(t, uint64(240), delay)
-		require.Equal(t, 0, metrics.calls)
-	})
-}
-
-func TestDelayCalculator_getMaxResolutionDelay(t *testing.T) {
-	tests := []struct {
-		name   string
-		claims []types.Claim
-		want   uint64
-	}{
-		{"NoClaims", []types.Claim{}, 0},
-		{"SingleClaim", createClaimList()[:1], 180},
-		{"MultipleClaims", createClaimList()[:2], 300},
-		{"ClaimsWithMaxUint128", createClaimList(), 300},
-	}
-
-	for _, test := range tests {
-		test := test
-		t.Run(test.name, func(t *testing.T) {
-			d, metrics, _ := setupDelayCalculatorTest(t)
-			game := &monTypes.EnrichedGameData{
-				Claims:   test.claims,
-				Duration: maxGameDuration,
-			}
-			got := d.getMaxResolutionDelay(game)
-			require.Equal(t, 0, metrics.calls)
-			require.Equal(t, test.want, got)
-		})
-	}
-}
-
-func TestDelayCalculator_RecordClaimResolutionDelayMax(t *testing.T) {
-	tests := []struct {
-		name  string
-		games []*monTypes.EnrichedGameData
-		want  float64
-	}{
-		{"NoGames", createGameWithClaimsList()[:0], 0},
-		{"SingleGame", createGameWithClaimsList()[:1], 180},
-		{"MultipleGames", createGameWithClaimsList()[:2], 300},
-		{"ClaimsWithMaxUint128", createGameWithClaimsList(), 300},
-	}
-
-	for _, test := range tests {
-		test := test
-		t.Run(test.name, func(t *testing.T) {
-			d, metrics, _ := setupDelayCalculatorTest(t)
-			d.RecordClaimResolutionDelayMax(test.games)
-			require.Equal(t, 1, metrics.calls)
-			require.Equal(t, test.want, metrics.maxDelay)
-		})
-	}
-}
-
-func setupDelayCalculatorTest(t *testing.T) (*DelayCalculator, *mockDelayMetrics, *clock.DeterministicClock) {
-	metrics := &mockDelayMetrics{}
-	cl := clock.NewDeterministicClock(frozen)
-	return NewDelayCalculator(metrics, cl), metrics, cl
-}
-
-func createGameWithClaimsList() []*monTypes.EnrichedGameData {
-	return []*monTypes.EnrichedGameData{
-		{
-			Claims:   createClaimList()[:1],
-			Duration: maxGameDuration,
-		},
-		{
-			Claims:   createClaimList()[:2],
-			Duration: maxGameDuration,
-		},
-		{
-			Claims:   createClaimList(),
-			Duration: maxGameDuration,
-		},
-	}
-}
-
-func createClaimList() []types.Claim {
-	newClock := func(multiplier int) *types.Clock {
-		duration := maxGameDuration / 2
-		timestamp := uint64(frozen.Add(-time.Minute * time.Duration(multiplier)).Unix())
-		return types.NewClock(duration, timestamp)
-	}
-	return []types.Claim{
-		{
-			ClaimData: types.ClaimData{
-				Bond: big.NewInt(5),
-			},
-			Clock: newClock(3),
-		},
-		{
-			ClaimData: types.ClaimData{
-				Bond: big.NewInt(10),
-			},
-			Clock: newClock(5),
-		},
-		{
-			ClaimData: types.ClaimData{
-				Bond: big.NewInt(100),
-			},
-			Clock: newClock(2),
-		},
-		{
-			// This claim should be skipped because it's resolved.
-			ClaimData: types.ClaimData{
-				Bond: monTypes.ResolvedBondAmount,
-			},
-			Clock: newClock(10),
-		},
-	}
-}
-
-type mockDelayMetrics struct {
-	calls    int
-	maxDelay float64
-}
-
-func (m *mockDelayMetrics) RecordClaimResolutionDelayMax(delay float64) {
-	m.calls++
-	if delay > m.maxDelay {
-		m.maxDelay = delay
-	}
-}
diff --git a/op-dispute-mon/mon/resolutions.go b/op-dispute-mon/mon/resolutions.go
new file mode 100644
index 000000000000..9e195e520e5e
--- /dev/null
+++ b/op-dispute-mon/mon/resolutions.go
@@ -0,0 +1,76 @@
+package mon
+
+import (
+	"time"
+
+	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/metrics"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum/go-ethereum/log"
+)
+
+const MaxResolveDelay = time.Minute
+
+type ResolutionMetrics interface {
+	RecordGameResolutionStatus(status metrics.ResolutionStatus, count int)
+}
+
+type ResolutionMonitor struct {
+	logger  log.Logger
+	clock   RClock
+	metrics ResolutionMetrics
+}
+
+func NewResolutionMonitor(logger log.Logger, metrics ResolutionMetrics, clock RClock) *ResolutionMonitor {
+	return &ResolutionMonitor{
+		logger:  logger,
+		clock:   clock,
+		metrics: metrics,
+	}
+}
+
+func (r *ResolutionMonitor) CheckResolutions(games []*types.EnrichedGameData) {
+	statusMetrics := make(map[metrics.ResolutionStatus]int)
+	for _, game := range games {
+		complete := game.Status != gameTypes.GameStatusInProgress
+		duration := uint64(r.clock.Now().Unix()) - game.Timestamp
+		maxDurationReached := duration >= (2 * game.MaxClockDuration)
+		resolvable := true
+		for _, claim := range game.Claims {
+			// If any claim is not resolved, the game is not resolvable
+			resolvable = resolvable && claim.Resolved
+		}
+		if complete {
+			if maxDurationReached {
+				statusMetrics[metrics.CompleteMaxDuration]++
+			} else {
+				statusMetrics[metrics.CompleteBeforeMaxDuration]++
+			}
+		} else if resolvable {
+			if maxDurationReached {
+				// SAFETY: since maxDurationReached is true, this cannot underflow
+				delay := duration - (2 * game.MaxClockDuration)
+				if delay > uint64(MaxResolveDelay.Seconds()) {
+					r.logger.Warn("Resolvable game has taken too long to resolve", "game", game.Proxy, "delay", delay)
+				}
+				statusMetrics[metrics.ResolvableMaxDuration]++
+			} else {
+				statusMetrics[metrics.ResolvableBeforeMaxDuration]++
+			}
+		} else {
+			if maxDurationReached {
+				// Note: we don't need to log here since unresolved claims are logged and metriced in claims.go
+				statusMetrics[metrics.InProgressMaxDuration]++
+			} else {
+				statusMetrics[metrics.InProgressBeforeMaxDuration]++
+			}
+		}
+	}
+
+	r.metrics.RecordGameResolutionStatus(metrics.CompleteMaxDuration, statusMetrics[metrics.CompleteMaxDuration])
+	r.metrics.RecordGameResolutionStatus(metrics.CompleteBeforeMaxDuration, statusMetrics[metrics.CompleteBeforeMaxDuration])
+	r.metrics.RecordGameResolutionStatus(metrics.ResolvableMaxDuration, statusMetrics[metrics.ResolvableMaxDuration])
+	r.metrics.RecordGameResolutionStatus(metrics.ResolvableBeforeMaxDuration, statusMetrics[metrics.ResolvableBeforeMaxDuration])
+	r.metrics.RecordGameResolutionStatus(metrics.InProgressMaxDuration, statusMetrics[metrics.InProgressMaxDuration])
+	r.metrics.RecordGameResolutionStatus(metrics.InProgressBeforeMaxDuration, statusMetrics[metrics.InProgressBeforeMaxDuration])
+}
diff --git a/op-dispute-mon/mon/resolutions_test.go b/op-dispute-mon/mon/resolutions_test.go
new file mode 100644
index 000000000000..a7144d2f8e64
--- /dev/null
+++ b/op-dispute-mon/mon/resolutions_test.go
@@ -0,0 +1,70 @@
+package mon
+
+import (
+	"testing"
+	"time"
+
+	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/metrics"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-service/clock"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/stretchr/testify/require"
+)
+
+func TestResolutionMonitor_CheckResolutions(t *testing.T) {
+	r, cl, m := newTestResolutionMonitor(t)
+	games := newTestGames(uint64(cl.Now().Unix()))
+	r.CheckResolutions(games)
+
+	require.Equal(t, 1, m.calls[metrics.CompleteMaxDuration])
+	require.Equal(t, 1, m.calls[metrics.CompleteBeforeMaxDuration])
+	require.Equal(t, 1, m.calls[metrics.ResolvableMaxDuration])
+	require.Equal(t, 1, m.calls[metrics.ResolvableBeforeMaxDuration])
+	require.Equal(t, 1, m.calls[metrics.InProgressMaxDuration])
+	require.Equal(t, 1, m.calls[metrics.InProgressBeforeMaxDuration])
+}
+
+func newTestResolutionMonitor(t *testing.T) (*ResolutionMonitor, *clock.DeterministicClock, *stubResolutionMetrics) {
+	logger := testlog.Logger(t, log.LvlInfo)
+	cl := clock.NewDeterministicClock(time.Unix(int64(time.Hour.Seconds()), 0))
+	metrics := &stubResolutionMetrics{}
+	return NewResolutionMonitor(logger, metrics, cl), cl, metrics
+}
+
+type stubResolutionMetrics struct {
+	calls map[metrics.ResolutionStatus]int
+}
+
+func (s *stubResolutionMetrics) RecordGameResolutionStatus(status metrics.ResolutionStatus, count int) {
+	if s.calls == nil {
+		s.calls = make(map[metrics.ResolutionStatus]int)
+	}
+	s.calls[status] += count
+}
+
+func newTestGames(duration uint64) []*types.EnrichedGameData {
+	newTestGame := func(duration uint64, status gameTypes.GameStatus, resolvable bool) *types.EnrichedGameData {
+		game := &types.EnrichedGameData{
+			MaxClockDuration: duration,
+			Status:           status,
+		}
+		if !resolvable {
+			game.Claims = []types.EnrichedClaim{
+				{
+					Resolved: false,
+				},
+			}
+		}
+		return game
+	}
+	return []*types.EnrichedGameData{
+		newTestGame(duration/2, gameTypes.GameStatusInProgress, false),
+		newTestGame(duration*5, gameTypes.GameStatusInProgress, false),
+		newTestGame(duration/2, gameTypes.GameStatusInProgress, true),
+		newTestGame(duration*5, gameTypes.GameStatusInProgress, true),
+		newTestGame(duration/2, gameTypes.GameStatusDefenderWon, false),
+		newTestGame(duration*5, gameTypes.GameStatusChallengerWon, false),
+	}
+}
diff --git a/op-dispute-mon/mon/resolution/resolver.go b/op-dispute-mon/mon/resolve.go
similarity index 98%
rename from op-dispute-mon/mon/resolution/resolver.go
rename to op-dispute-mon/mon/resolve.go
index a27ebaadac63..af7087366c53 100644
--- a/op-dispute-mon/mon/resolution/resolver.go
+++ b/op-dispute-mon/mon/resolve.go
@@ -1,4 +1,4 @@
-package resolution
+package mon
 
 import (
 	"math/big"
diff --git a/op-dispute-mon/mon/resolution/resolver_test.go b/op-dispute-mon/mon/resolve_test.go
similarity index 86%
rename from op-dispute-mon/mon/resolution/resolver_test.go
rename to op-dispute-mon/mon/resolve_test.go
index d949b2285ce5..b7c08487f687 100644
--- a/op-dispute-mon/mon/resolution/resolver_test.go
+++ b/op-dispute-mon/mon/resolve_test.go
@@ -1,4 +1,4 @@
-package resolution
+package mon
 
 import (
 	"math/big"
@@ -11,18 +11,19 @@ import (
 
 	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
 )
 
 func TestResolver_Resolve(t *testing.T) {
 	t.Run("NoClaims", func(t *testing.T) {
-		tree := transform.CreateBidirectionalTree([]faultTypes.Claim{})
+		tree := transform.CreateBidirectionalTree([]monTypes.EnrichedClaim{})
 		status := Resolve(tree)
 		require.Equal(t, gameTypes.GameStatusDefenderWon, status)
 	})
 
 	t.Run("SingleRootClaim", func(t *testing.T) {
 		builder := test.NewAlphabetClaimBuilder(t, big.NewInt(10), 4).GameBuilder()
-		tree := transform.CreateBidirectionalTree(builder.Game.Claims())
+		tree := transform.CreateBidirectionalTree(enrichClaims(builder.Game.Claims()))
 		tree.Claims[0].Claim.CounteredBy = common.Address{}
 		status := Resolve(tree)
 		require.Equal(t, gameTypes.GameStatusDefenderWon, status)
@@ -36,7 +37,7 @@ func TestResolver_Resolve(t *testing.T) {
 				Defend(). // Challenger winning
 				Defend(). // Defender winning
 				Attack()  // Challenger winning
-		tree := transform.CreateBidirectionalTree(builder.Game.Claims())
+		tree := transform.CreateBidirectionalTree(enrichClaims(builder.Game.Claims()))
 		status := Resolve(tree)
 		require.Equal(t, gameTypes.GameStatusChallengerWon, status)
 	})
@@ -48,7 +49,7 @@ func TestResolver_Resolve(t *testing.T) {
 				Attack(). // Defender winning
 				Defend(). // Challenger winning
 				Defend()  // Defender winning
-		tree := transform.CreateBidirectionalTree(builder.Game.Claims())
+		tree := transform.CreateBidirectionalTree(enrichClaims(builder.Game.Claims()))
 		status := Resolve(tree)
 		require.Equal(t, gameTypes.GameStatusDefenderWon, status)
 	})
@@ -68,7 +69,7 @@ func TestResolver_Resolve(t *testing.T) {
 									Step()    // Defender winning
 		forkPoint.Defend(test.WithValue(common.Hash{0xcc})). // Challenger winning
 									Defend() // Defender winning
-		tree := transform.CreateBidirectionalTree(builder.Game.Claims())
+		tree := transform.CreateBidirectionalTree(enrichClaims(builder.Game.Claims()))
 		status := Resolve(tree)
 		// First fork has an uncountered claim with challenger winning so that invalidates the parent and wins the game
 		require.Equal(t, gameTypes.GameStatusChallengerWon, status)
@@ -89,7 +90,7 @@ func TestResolver_Resolve(t *testing.T) {
 		forkPoint.Defend(test.WithValue(common.Hash{0xcc})). // Challenger winning
 									Defend() // Defender winning
 
-		tree := transform.CreateBidirectionalTree(builder.Game.Claims())
+		tree := transform.CreateBidirectionalTree(enrichClaims(builder.Game.Claims()))
 		status := Resolve(tree)
 		// Defender won all forks
 		require.Equal(t, gameTypes.GameStatusDefenderWon, status)
@@ -125,7 +126,7 @@ func TestResolver_Resolve(t *testing.T) {
 			Defend(test.WithClaimant(common.Address{0xee})). // Challenger winning
 			Defend().                                        // Defender winning
 			Defend()                                         // Challenger winning
-		tree := transform.CreateBidirectionalTree(builder.Game.Claims())
+		tree := transform.CreateBidirectionalTree(enrichClaims(builder.Game.Claims()))
 		status := Resolve(tree)
 		// Defender won all forks
 		require.Equal(t, gameTypes.GameStatusChallengerWon, status)
@@ -145,7 +146,7 @@ func TestResolver_Resolve(t *testing.T) {
 		claims := builder.Game.Claims()
 		// Successful step so mark as countered
 		claims[len(claims)-1].CounteredBy = common.Address{0xaa}
-		tree := transform.CreateBidirectionalTree(claims)
+		tree := transform.CreateBidirectionalTree(enrichClaims(claims))
 		status := Resolve(tree)
 		require.Equal(t, gameTypes.GameStatusChallengerWon, status)
 	})
@@ -162,8 +163,16 @@ func TestResolver_Resolve(t *testing.T) {
 		claims := builder.Game.Claims()
 		// Successful step so mark as countered
 		claims[len(claims)-1].CounteredBy = common.Address{0xaa}
-		tree := transform.CreateBidirectionalTree(claims)
+		tree := transform.CreateBidirectionalTree(enrichClaims(claims))
 		status := Resolve(tree)
 		require.Equal(t, gameTypes.GameStatusDefenderWon, status)
 	})
 }
+
+func enrichClaims(claims []faultTypes.Claim) []monTypes.EnrichedClaim {
+	enriched := make([]monTypes.EnrichedClaim, len(claims))
+	for i, claim := range claims {
+		enriched[i] = monTypes.EnrichedClaim{Claim: claim}
+	}
+	return enriched
+}
diff --git a/op-dispute-mon/mon/service.go b/op-dispute-mon/mon/service.go
index 593917781e35..f8df6132f095 100644
--- a/op-dispute-mon/mon/service.go
+++ b/op-dispute-mon/mon/service.go
@@ -15,7 +15,6 @@ import (
 	"github.com/ethereum-optimism/optimism/op-dispute-mon/config"
 	"github.com/ethereum-optimism/optimism/op-dispute-mon/metrics"
 	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/extract"
-	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/resolution"
 	"github.com/ethereum-optimism/optimism/op-dispute-mon/version"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
@@ -37,13 +36,14 @@ type Service struct {
 
 	cl clock.Clock
 
-	delays       *resolution.DelayCalculator
 	extractor    *extract.Extractor
-	forecast     *forecast
+	forecast     *Forecast
 	bonds        *bonds.Bonds
 	game         *extract.GameCallerCreator
+	resolutions  *ResolutionMonitor
+	claims       *ClaimMonitor
+	withdrawals  *WithdrawalMonitor
 	rollupClient *sources.RollupClient
-	validator    *outputValidator
 
 	l1Client *ethclient.Client
 
@@ -85,11 +85,13 @@ func (s *Service) initFromConfig(ctx context.Context, cfg *config.Config) error
 		return fmt.Errorf("failed to init rollup client: %w", err)
 	}
 
-	s.initOutputValidator()   // Must be called before initForecast
+	s.initClaimMonitor(cfg)
+	s.initResolutionMonitor()
+	s.initWithdrawalMonitor()
+
 	s.initGameCallerCreator() // Must be called before initForecast
 
-	s.initDelayCalculator()
-	s.initExtractor()
+	s.initExtractor(cfg)
 
 	s.initForecast(cfg)
 	s.initBonds()
@@ -102,32 +104,45 @@ func (s *Service) initFromConfig(ctx context.Context, cfg *config.Config) error
 	return nil
 }
 
-func (s *Service) initOutputValidator() {
-	s.validator = newOutputValidator(s.logger, s.metrics, s.rollupClient)
+func (s *Service) initClaimMonitor(cfg *config.Config) {
+	s.claims = NewClaimMonitor(s.logger, s.cl, cfg.HonestActors, s.metrics)
 }
 
-func (s *Service) initGameCallerCreator() {
-	s.game = extract.NewGameCallerCreator(s.metrics, batching.NewMultiCaller(s.l1Client.Client(), batching.DefaultBatchSize))
+func (s *Service) initResolutionMonitor() {
+	s.resolutions = NewResolutionMonitor(s.logger, s.metrics, s.cl)
+}
+
+func (s *Service) initWithdrawalMonitor() {
+	s.withdrawals = NewWithdrawalMonitor(s.logger, s.metrics)
 }
 
-func (s *Service) initDelayCalculator() {
-	s.delays = resolution.NewDelayCalculator(s.metrics, s.cl)
+func (s *Service) initGameCallerCreator() {
+	s.game = extract.NewGameCallerCreator(s.metrics, batching.NewMultiCaller(s.l1Client.Client(), batching.DefaultBatchSize))
 }
 
-func (s *Service) initExtractor() {
-	s.extractor = extract.NewExtractor(s.logger, s.game.CreateContract, s.factoryContract.GetGamesAtOrAfter,
+func (s *Service) initExtractor(cfg *config.Config) {
+	s.extractor = extract.NewExtractor(
+		s.logger,
+		s.game.CreateContract,
+		s.factoryContract.GetGamesAtOrAfter,
+		cfg.IgnoredGames,
+		cfg.MaxConcurrency,
+		extract.NewClaimEnricher(),
+		extract.NewRecipientEnricher(), // Must be called before WithdrawalsEnricher and BondEnricher
+		extract.NewWithdrawalsEnricher(),
 		extract.NewBondEnricher(),
 		extract.NewBalanceEnricher(),
 		extract.NewL1HeadBlockNumEnricher(s.l1Client),
+		extract.NewAgreementEnricher(s.logger, s.metrics, s.rollupClient),
 	)
 }
 
 func (s *Service) initForecast(cfg *config.Config) {
-	s.forecast = newForecast(s.logger, s.metrics, s.validator)
+	s.forecast = NewForecast(s.logger, s.metrics)
 }
 
 func (s *Service) initBonds() {
-	s.bonds = bonds.NewBonds(s.logger, s.metrics)
+	s.bonds = bonds.NewBonds(s.logger, s.metrics, s.cl)
 }
 
 func (s *Service) initOutputRollupClient(ctx context.Context, cfg *config.Config) error {
@@ -184,11 +199,8 @@ func (s *Service) initMetricsServer(cfg *opmetrics.CLIConfig) error {
 }
 
 func (s *Service) initFactoryContract(cfg *config.Config) error {
-	factoryContract, err := contracts.NewDisputeGameFactoryContract(cfg.GameFactoryAddress,
+	factoryContract := contracts.NewDisputeGameFactoryContract(s.metrics, cfg.GameFactoryAddress,
 		batching.NewMultiCaller(s.l1Client.Client(), batching.DefaultBatchSize))
-	if err != nil {
-		return fmt.Errorf("failed to bind the fault dispute game factory contract: %w", err)
-	}
 	s.factoryContract = factoryContract
 	return nil
 }
@@ -201,15 +213,20 @@ func (s *Service) initMonitor(ctx context.Context, cfg *config.Config) {
 		}
 		return block.Hash(), nil
 	}
+	l2ChallengesMonitor := NewL2ChallengesMonitor(s.logger, s.metrics)
 	s.monitor = newGameMonitor(
 		ctx,
 		s.logger,
 		s.cl,
+		s.metrics,
 		cfg.MonitorInterval,
 		cfg.GameWindow,
-		s.delays.RecordClaimResolutionDelayMax,
 		s.forecast.Forecast,
 		s.bonds.CheckBonds,
+		s.resolutions.CheckResolutions,
+		s.claims.CheckClaims,
+		s.withdrawals.CheckWithdrawals,
+		l2ChallengesMonitor.CheckL2Challenges,
 		s.extractor.Extract,
 		s.l1Client.BlockNumber,
 		blockHashFetcher,
diff --git a/op-dispute-mon/mon/transform/collateral.go b/op-dispute-mon/mon/transform/collateral.go
deleted file mode 100644
index 14263f2641f8..000000000000
--- a/op-dispute-mon/mon/transform/collateral.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package transform
-
-import (
-	"math/big"
-
-	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
-	"github.com/ethereum/go-ethereum/common"
-)
-
-type Collateral struct {
-	// Required is the amount of collateral required to pay out bonds.
-	Required *big.Int
-
-	// Actual is the amount of collateral actually head by the DelayedWETH contract
-	Actual *big.Int
-}
-
-// CalculateRequiredCollateral determines the minimum balance required for each DelayedWETH contract used by a set
-// of dispute games.
-// Returns a map of DelayedWETH contract address to collateral data (required and actual amounts)
-func CalculateRequiredCollateral(games []*monTypes.EnrichedGameData) map[common.Address]Collateral {
-	result := make(map[common.Address]Collateral)
-	for _, game := range games {
-		collateral, ok := result[game.WETHContract]
-		if !ok {
-			collateral = Collateral{
-				Required: big.NewInt(0),
-				Actual:   game.ETHCollateral,
-			}
-		}
-		gameRequired := requiredCollateralForGame(game)
-		collateral.Required = new(big.Int).Add(collateral.Required, gameRequired)
-		result[game.WETHContract] = collateral
-	}
-	return result
-}
-
-func requiredCollateralForGame(game *monTypes.EnrichedGameData) *big.Int {
-	required := big.NewInt(0)
-	for _, claim := range game.Claims {
-		if monTypes.ResolvedBondAmount.Cmp(claim.Bond) != 0 {
-			required = new(big.Int).Add(required, claim.Bond)
-		}
-	}
-
-	for _, unclaimedCredit := range game.Credits {
-		required = new(big.Int).Add(required, unclaimedCredit)
-	}
-	return required
-}
diff --git a/op-dispute-mon/mon/transform/collateral_test.go b/op-dispute-mon/mon/transform/collateral_test.go
deleted file mode 100644
index 96dc64967765..000000000000
--- a/op-dispute-mon/mon/transform/collateral_test.go
+++ /dev/null
@@ -1,104 +0,0 @@
-package transform
-
-import (
-	"math/big"
-	"testing"
-
-	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
-	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
-	"github.com/ethereum/go-ethereum/common"
-	"github.com/stretchr/testify/require"
-)
-
-func TestCalculateRequiredCollateral(t *testing.T) {
-	weth1 := common.Address{0x1a}
-	weth1Balance := big.NewInt(4200)
-	weth2 := common.Address{0x2b}
-	weth2Balance := big.NewInt(6000)
-	game1 := &monTypes.EnrichedGameData{
-		Claims: []types.Claim{
-			{
-				ClaimData: types.ClaimData{
-					Bond: monTypes.ResolvedBondAmount,
-				},
-				Claimant:    common.Address{0x01},
-				CounteredBy: common.Address{0x02},
-			},
-			{
-				ClaimData: types.ClaimData{
-					Bond: big.NewInt(5),
-				},
-				Claimant:    common.Address{0x03},
-				CounteredBy: common.Address{},
-			},
-			{
-				ClaimData: types.ClaimData{
-					Bond: big.NewInt(7),
-				},
-				Claimant:    common.Address{0x03},
-				CounteredBy: common.Address{},
-			},
-		},
-		Credits: map[common.Address]*big.Int{
-			common.Address{0x01}: big.NewInt(2),
-			common.Address{0x04}: big.NewInt(3),
-		},
-		WETHContract:  weth1,
-		ETHCollateral: weth1Balance,
-	}
-	game2 := &monTypes.EnrichedGameData{
-		Claims: []types.Claim{
-			{
-				ClaimData: types.ClaimData{
-					Bond: monTypes.ResolvedBondAmount,
-				},
-				Claimant:    common.Address{0x01},
-				CounteredBy: common.Address{0x02},
-			},
-			{
-				ClaimData: types.ClaimData{
-					Bond: big.NewInt(6),
-				},
-				Claimant:    common.Address{0x03},
-				CounteredBy: common.Address{},
-			},
-			{
-				ClaimData: types.ClaimData{
-					Bond: big.NewInt(9),
-				},
-				Claimant:    common.Address{0x03},
-				CounteredBy: common.Address{},
-			},
-		},
-		Credits: map[common.Address]*big.Int{
-			common.Address{0x01}: big.NewInt(4),
-			common.Address{0x04}: big.NewInt(1),
-		},
-		WETHContract:  weth1,
-		ETHCollateral: weth1Balance,
-	}
-	game3 := &monTypes.EnrichedGameData{
-		Claims: []types.Claim{
-			{
-				ClaimData: types.ClaimData{
-					Bond: big.NewInt(23),
-				},
-				Claimant:    common.Address{0x03},
-				CounteredBy: common.Address{},
-			},
-		},
-		Credits: map[common.Address]*big.Int{
-			common.Address{0x01}: big.NewInt(46),
-		},
-		WETHContract:  weth2,
-		ETHCollateral: weth2Balance,
-	}
-	actual := CalculateRequiredCollateral([]*monTypes.EnrichedGameData{game1, game2, game3})
-	require.Len(t, actual, 2)
-	require.Contains(t, actual, weth1)
-	require.Contains(t, actual, weth2)
-	require.Equal(t, actual[weth1].Required.Uint64(), uint64(5+7+2+3+6+9+4+1))
-	require.Equal(t, actual[weth1].Actual.Uint64(), weth1Balance.Uint64())
-	require.Equal(t, actual[weth2].Required.Uint64(), uint64(23+46))
-	require.Equal(t, actual[weth2].Actual.Uint64(), weth2Balance.Uint64())
-}
diff --git a/op-dispute-mon/mon/transform/tree.go b/op-dispute-mon/mon/transform/tree.go
index e9bcff71c50a..b8757ebacc36 100644
--- a/op-dispute-mon/mon/transform/tree.go
+++ b/op-dispute-mon/mon/transform/tree.go
@@ -1,20 +1,19 @@
 package transform
 
 import (
-	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
-	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
 )
 
 // CreateBidirectionalTree walks backwards through the list of claims and creates a bidirectional
 // tree of claims. The root claim must be at index 0. The tree is returned as a flat array so it
 // can be easily traversed following the resolution process.
-func CreateBidirectionalTree(claims []types.Claim) *monTypes.BidirectionalTree {
-	claimMap := make(map[int]*monTypes.BidirectionalClaim)
-	res := make([]*monTypes.BidirectionalClaim, 0, len(claims))
+func CreateBidirectionalTree(claims []types.EnrichedClaim) *types.BidirectionalTree {
+	claimMap := make(map[int]*types.BidirectionalClaim)
+	res := make([]*types.BidirectionalClaim, 0, len(claims))
 	for _, claim := range claims {
 		claim := claim
-		bidirectionalClaim := &monTypes.BidirectionalClaim{
-			Claim: &claim,
+		bidirectionalClaim := &types.BidirectionalClaim{
+			Claim: &claim.Claim,
 		}
 		claimMap[claim.ContractIndex] = bidirectionalClaim
 		if !claim.IsRoot() {
@@ -24,5 +23,5 @@ func CreateBidirectionalTree(claims []types.Claim) *monTypes.BidirectionalTree {
 		}
 		res = append(res, bidirectionalClaim)
 	}
-	return &monTypes.BidirectionalTree{Claims: res}
+	return &types.BidirectionalTree{Claims: res}
 }
diff --git a/op-dispute-mon/mon/transform/tree_test.go b/op-dispute-mon/mon/transform/tree_test.go
index dba36ec25608..7583628e3cb3 100644
--- a/op-dispute-mon/mon/transform/tree_test.go
+++ b/op-dispute-mon/mon/transform/tree_test.go
@@ -9,6 +9,7 @@ import (
 	"github.com/stretchr/testify/require"
 
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
 )
 
 func TestResolver_CreateBidirectionalTree(t *testing.T) {
@@ -17,7 +18,7 @@ func TestResolver_CreateBidirectionalTree(t *testing.T) {
 		claims[0].CounteredBy = common.Address{}
 		tree := CreateBidirectionalTree(claims)
 		require.Len(t, tree.Claims, 1)
-		require.Equal(t, claims[0], *tree.Claims[0].Claim)
+		require.Equal(t, claims[0].Claim, *tree.Claims[0].Claim)
 		require.Empty(t, tree.Claims[0].Children)
 	})
 
@@ -26,10 +27,10 @@ func TestResolver_CreateBidirectionalTree(t *testing.T) {
 		claims[1].CounteredBy = common.Address{}
 		tree := CreateBidirectionalTree(claims)
 		require.Len(t, tree.Claims, 2)
-		require.Equal(t, claims[0], *tree.Claims[0].Claim)
+		require.Equal(t, claims[0].Claim, *tree.Claims[0].Claim)
 		require.Len(t, tree.Claims[0].Children, 1)
-		require.Equal(t, claims[1], *tree.Claims[0].Children[0].Claim)
-		require.Equal(t, claims[1], *tree.Claims[1].Claim)
+		require.Equal(t, claims[1].Claim, *tree.Claims[0].Children[0].Claim)
+		require.Equal(t, claims[1].Claim, *tree.Claims[1].Claim)
 		require.Empty(t, tree.Claims[1].Children)
 	})
 
@@ -37,44 +38,50 @@ func TestResolver_CreateBidirectionalTree(t *testing.T) {
 		claims := createDeepClaimList()
 		tree := CreateBidirectionalTree(claims)
 		require.Len(t, tree.Claims, 3)
-		require.Equal(t, claims[0], *tree.Claims[0].Claim)
+		require.Equal(t, claims[0].Claim, *tree.Claims[0].Claim)
 		require.Len(t, tree.Claims[0].Children, 1)
 		require.Equal(t, tree.Claims[0].Children[0], tree.Claims[1])
-		require.Equal(t, claims[1], *tree.Claims[1].Claim)
+		require.Equal(t, claims[1].Claim, *tree.Claims[1].Claim)
 		require.Len(t, tree.Claims[1].Children, 1)
 		require.Equal(t, tree.Claims[1].Children[0], tree.Claims[2])
-		require.Equal(t, claims[2], *tree.Claims[2].Claim)
+		require.Equal(t, claims[2].Claim, *tree.Claims[2].Claim)
 		require.Empty(t, tree.Claims[2].Children)
 	})
 }
 
-func createDeepClaimList() []types.Claim {
-	return []types.Claim{
+func createDeepClaimList() []monTypes.EnrichedClaim {
+	return []monTypes.EnrichedClaim{
 		{
-			ClaimData: types.ClaimData{
-				Position: types.NewPosition(0, big.NewInt(0)),
+			Claim: types.Claim{
+				ClaimData: types.ClaimData{
+					Position: types.NewPosition(0, big.NewInt(0)),
+				},
+				ContractIndex:       0,
+				CounteredBy:         common.HexToAddress("0x222222"),
+				ParentContractIndex: math.MaxInt64,
+				Claimant:            common.HexToAddress("0x111111"),
 			},
-			ContractIndex:       0,
-			CounteredBy:         common.HexToAddress("0x222222"),
-			ParentContractIndex: math.MaxInt64,
-			Claimant:            common.HexToAddress("0x111111"),
 		},
 		{
-			ClaimData: types.ClaimData{
-				Position: types.NewPosition(1, big.NewInt(0)),
+			Claim: types.Claim{
+				ClaimData: types.ClaimData{
+					Position: types.NewPosition(1, big.NewInt(0)),
+				},
+				CounteredBy:         common.HexToAddress("0x111111"),
+				ContractIndex:       1,
+				ParentContractIndex: 0,
+				Claimant:            common.HexToAddress("0x222222"),
 			},
-			CounteredBy:         common.HexToAddress("0x111111"),
-			ContractIndex:       1,
-			ParentContractIndex: 0,
-			Claimant:            common.HexToAddress("0x222222"),
 		},
 		{
-			ClaimData: types.ClaimData{
-				Position: types.NewPosition(2, big.NewInt(0)),
+			Claim: types.Claim{
+				ClaimData: types.ClaimData{
+					Position: types.NewPosition(2, big.NewInt(0)),
+				},
+				ContractIndex:       2,
+				ParentContractIndex: 1,
+				Claimant:            common.HexToAddress("0x111111"),
 			},
-			ContractIndex:       2,
-			ParentContractIndex: 1,
-			Claimant:            common.HexToAddress("0x111111"),
 		},
 	}
 }
diff --git a/op-dispute-mon/mon/types/types.go b/op-dispute-mon/mon/types/types.go
index c7232cc8f18b..21abe0fc19df 100644
--- a/op-dispute-mon/mon/types/types.go
+++ b/op-dispute-mon/mon/types/types.go
@@ -3,33 +3,49 @@ package types
 import (
 	"math/big"
 
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
 	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	"github.com/ethereum/go-ethereum/common"
 )
 
-// ResolvedBondAmount is the uint128 value where a bond is considered claimed.
-var ResolvedBondAmount = new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 128), big.NewInt(1))
+// EnrichedClaim extends the faultTypes.Claim with additional context.
+type EnrichedClaim struct {
+	faultTypes.Claim
+	Resolved bool
+}
 
 type EnrichedGameData struct {
 	types.GameMetadata
-	L1Head        common.Hash
-	L1HeadNum     uint64
-	L2BlockNumber uint64
-	RootClaim     common.Hash
-	Status        types.GameStatus
-	Duration      uint64
-	Claims        []faultTypes.Claim
+	L1Head                common.Hash
+	L1HeadNum             uint64
+	L2BlockNumber         uint64
+	RootClaim             common.Hash
+	Status                types.GameStatus
+	MaxClockDuration      uint64
+	BlockNumberChallenged bool
+	BlockNumberChallenger common.Address
+	Claims                []EnrichedClaim
+
+	AgreeWithClaim    bool
+	ExpectedRootClaim common.Hash
+
+	// Recipients maps addresses to true if they are a bond recipient in the game.
+	Recipients map[common.Address]bool
 
 	// Credits records the paid out bonds for the game, keyed by recipient.
 	Credits map[common.Address]*big.Int
 
+	// WithdrawalRequests maps recipients with withdrawal requests in DelayedWETH for this game.
+	WithdrawalRequests map[common.Address]*contracts.WithdrawalRequest
+
 	// WETHContract is the address of the DelayedWETH contract used by this game
 	// The contract is potentially shared by multiple games.
 	WETHContract common.Address
 
 	// ETHCollateral is the ETH balance of the (potentially shared) WETHContract
-	// This ETH balance will be used to pay out any bonds required by the games that use the same DelayedWETH contract.
+	// This ETH balance will be used to pay out any bonds required by the games
+	// that use the same DelayedWETH contract.
 	ETHCollateral *big.Int
 }
 
@@ -43,15 +59,3 @@ type BidirectionalClaim struct {
 	Claim    *faultTypes.Claim
 	Children []*BidirectionalClaim
 }
-
-type ForecastBatch struct {
-	AgreeDefenderAhead      int
-	DisagreeDefenderAhead   int
-	AgreeChallengerAhead    int
-	DisagreeChallengerAhead int
-
-	AgreeDefenderWins      int
-	DisagreeDefenderWins   int
-	AgreeChallengerWins    int
-	DisagreeChallengerWins int
-}
diff --git a/op-dispute-mon/mon/types/types_test.go b/op-dispute-mon/mon/types/types_test.go
deleted file mode 100644
index 1958be239954..000000000000
--- a/op-dispute-mon/mon/types/types_test.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package types
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/require"
-)
-
-func TestMaxValue(t *testing.T) {
-	require.Equal(t, ResolvedBondAmount.String(), "340282366920938463463374607431768211455")
-}
diff --git a/op-dispute-mon/mon/withdrawals.go b/op-dispute-mon/mon/withdrawals.go
new file mode 100644
index 000000000000..5563b099afe5
--- /dev/null
+++ b/op-dispute-mon/mon/withdrawals.go
@@ -0,0 +1,53 @@
+package mon
+
+import (
+	"github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/log"
+)
+
+type WithdrawalMetrics interface {
+	RecordWithdrawalRequests(delayedWeth common.Address, matches bool, count int)
+}
+
+type WithdrawalMonitor struct {
+	logger  log.Logger
+	metrics WithdrawalMetrics
+}
+
+func NewWithdrawalMonitor(logger log.Logger, metrics WithdrawalMetrics) *WithdrawalMonitor {
+	return &WithdrawalMonitor{
+		logger:  logger,
+		metrics: metrics,
+	}
+}
+
+func (w *WithdrawalMonitor) CheckWithdrawals(games []*types.EnrichedGameData) {
+	matching := make(map[common.Address]int)
+	divergent := make(map[common.Address]int)
+	for _, game := range games {
+		matches, diverges := w.validateGameWithdrawals(game)
+		matching[game.WETHContract] += matches
+		divergent[game.WETHContract] += diverges
+	}
+	for contract, count := range matching {
+		w.metrics.RecordWithdrawalRequests(contract, true, count)
+	}
+	for contract, count := range divergent {
+		w.metrics.RecordWithdrawalRequests(contract, false, count)
+	}
+}
+
+func (w *WithdrawalMonitor) validateGameWithdrawals(game *types.EnrichedGameData) (int, int) {
+	matching := 0
+	divergent := 0
+	for recipient, withdrawalAmount := range game.WithdrawalRequests {
+		if withdrawalAmount.Amount != nil && withdrawalAmount.Amount.Cmp(game.Credits[recipient]) == 0 {
+			matching++
+		} else {
+			divergent++
+			w.logger.Error("Withdrawal request amount does not match credit", "game", game.Proxy, "recipient", recipient, "credit", game.Credits[recipient], "withdrawal", game.WithdrawalRequests[recipient].Amount)
+		}
+	}
+	return matching, divergent
+}
diff --git a/op-dispute-mon/mon/withdrawals_test.go b/op-dispute-mon/mon/withdrawals_test.go
new file mode 100644
index 000000000000..f598ea38df97
--- /dev/null
+++ b/op-dispute-mon/mon/withdrawals_test.go
@@ -0,0 +1,100 @@
+package mon
+
+import (
+	"math/big"
+	"testing"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
+	monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/stretchr/testify/require"
+)
+
+var (
+	weth1 = common.Address{0x1a}
+	weth2 = common.Address{0x2b}
+)
+
+func makeGames() []*monTypes.EnrichedGameData {
+	weth1Balance := big.NewInt(4200)
+	weth2Balance := big.NewInt(6000)
+	game1 := &monTypes.EnrichedGameData{
+		Credits: map[common.Address]*big.Int{
+			common.Address{0x01}: big.NewInt(3),
+			common.Address{0x02}: big.NewInt(1),
+		},
+		WithdrawalRequests: map[common.Address]*contracts.WithdrawalRequest{
+			common.Address{0x01}: &contracts.WithdrawalRequest{Amount: big.NewInt(3)},
+			common.Address{0x02}: &contracts.WithdrawalRequest{Amount: big.NewInt(1)},
+		},
+		WETHContract:  weth1,
+		ETHCollateral: weth1Balance,
+	}
+	game2 := &monTypes.EnrichedGameData{
+		Credits: map[common.Address]*big.Int{
+			common.Address{0x01}: big.NewInt(46),
+			common.Address{0x02}: big.NewInt(1),
+		},
+		WithdrawalRequests: map[common.Address]*contracts.WithdrawalRequest{
+			common.Address{0x01}: &contracts.WithdrawalRequest{Amount: big.NewInt(3)},
+			common.Address{0x02}: &contracts.WithdrawalRequest{Amount: big.NewInt(1)},
+		},
+		WETHContract:  weth2,
+		ETHCollateral: weth2Balance,
+	}
+	game3 := &monTypes.EnrichedGameData{
+		Credits: map[common.Address]*big.Int{
+			common.Address{0x03}: big.NewInt(2),
+			common.Address{0x04}: big.NewInt(4),
+		},
+		WithdrawalRequests: map[common.Address]*contracts.WithdrawalRequest{
+			common.Address{0x03}: &contracts.WithdrawalRequest{Amount: big.NewInt(2)},
+			common.Address{0x04}: &contracts.WithdrawalRequest{Amount: big.NewInt(4)},
+		},
+		WETHContract:  weth2,
+		ETHCollateral: weth2Balance,
+	}
+	return []*monTypes.EnrichedGameData{game1, game2, game3}
+}
+
+func TestCheckWithdrawals(t *testing.T) {
+	logger := testlog.Logger(t, log.LvlInfo)
+	metrics := &stubWithdrawalsMetrics{
+		matching:  make(map[common.Address]int),
+		divergent: make(map[common.Address]int),
+	}
+	withdrawals := NewWithdrawalMonitor(logger, metrics)
+	withdrawals.CheckWithdrawals(makeGames())
+
+	require.Equal(t, metrics.matchCalls, 2)
+	require.Equal(t, metrics.divergeCalls, 2)
+	require.Len(t, metrics.matching, 2)
+	require.Len(t, metrics.divergent, 2)
+	require.Contains(t, metrics.matching, weth1)
+	require.Contains(t, metrics.matching, weth2)
+	require.Contains(t, metrics.divergent, weth1)
+	require.Contains(t, metrics.divergent, weth2)
+	require.Equal(t, metrics.matching[weth1], 2)
+	require.Equal(t, metrics.matching[weth2], 3)
+	require.Equal(t, metrics.divergent[weth1], 0)
+	require.Equal(t, metrics.divergent[weth2], 1)
+}
+
+type stubWithdrawalsMetrics struct {
+	matchCalls   int
+	divergeCalls int
+	matching     map[common.Address]int
+	divergent    map[common.Address]int
+}
+
+func (s *stubWithdrawalsMetrics) RecordWithdrawalRequests(addr common.Address, matches bool, count int) {
+	if matches {
+		s.matchCalls++
+		s.matching[addr] = count
+	} else {
+		s.divergeCalls++
+		s.divergent[addr] = count
+	}
+}
diff --git a/op-e2e/Makefile b/op-e2e/Makefile
index 5d1876dfb120..707227f14dac 100644
--- a/op-e2e/Makefile
+++ b/op-e2e/Makefile
@@ -1,6 +1,7 @@
 # Generally, JUNIT_FILE is set in CI but may be specified to an arbitrary file location to emulate CI locally
+# If JUNIT_FILE is set, JSON_LOG_FILE should also be set
 ifdef JUNIT_FILE
-	go_test = OP_TESTLOG_DISABLE_COLOR=true OP_E2E_DISABLE_PARALLEL=false gotestsum --format=standard-verbose --junitfile=$(JUNIT_FILE) -- -failfast
+	go_test = OP_TESTLOG_DISABLE_COLOR=true OP_E2E_DISABLE_PARALLEL=false gotestsum --format=testname --junitfile=$(JUNIT_FILE) --jsonfile=$(JSON_LOG_FILE) -- -failfast
   # Note: -parallel must be set to match the number of cores in the resource class
 	go_test_flags = -timeout=60m -parallel=8
 else
@@ -63,3 +64,9 @@ clean:
 	rm -r ../.devnet
 	rm -r ../op-program/bin
 .PHONY: clean
+
+fuzz:
+	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzFjordCostFunction ./
+	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzFastLzGethSolidity ./
+	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzFastLzCgo ./
+
diff --git a/op-e2e/actions/ecotone_fork_test.go b/op-e2e/actions/ecotone_fork_test.go
index 4cadbdafce08..b8154f49882b 100644
--- a/op-e2e/actions/ecotone_fork_test.go
+++ b/op-e2e/actions/ecotone_fork_test.go
@@ -14,11 +14,11 @@ import (
 	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/ethereum/go-ethereum/log"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 )
 
@@ -43,7 +43,7 @@ func TestEcotoneNetworkUpgradeTransactions(gt *testing.T) {
 	t := NewDefaultTesting(gt)
 	dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams)
 	genesisBlock := hexutil.Uint64(0)
-	ecotoneOffset := hexutil.Uint64(2)
+	ecotoneOffset := hexutil.Uint64(4)
 
 	dp.DeployConfig.L1CancunTimeOffset = &genesisBlock // can be removed once Cancun on L1 is the default
 
@@ -59,6 +59,10 @@ func TestEcotoneNetworkUpgradeTransactions(gt *testing.T) {
 	_, _, miner, sequencer, engine, verifier, _, _ := setupReorgTestActors(t, dp, sd, log)
 	ethCl := engine.EthClient()
 
+	// build a single block to move away from the genesis with 0-values in L1Block contract
+	sequencer.ActL2StartBlock(t)
+	sequencer.ActL2EndBlock(t)
+
 	// start op-nodes
 	sequencer.ActL2PipelineFull(t)
 	verifier.ActL2PipelineFull(t)
@@ -70,7 +74,8 @@ func TestEcotoneNetworkUpgradeTransactions(gt *testing.T) {
 	scalar, err := gasPriceOracle.Scalar(nil)
 	require.NoError(t, err)
 	require.True(t, scalar.Cmp(big.NewInt(0)) > 0, "scalar must start non-zero")
-	require.True(t, scalar.Cmp(new(big.Int).SetUint64(dp.DeployConfig.GasPriceOracleScalar)) == 0, "must match deploy config")
+	feeScalar := dp.DeployConfig.FeeScalar()
+	require.Equal(t, scalar, new(big.Int).SetBytes(feeScalar[:]), "must match deploy config")
 
 	// Get current implementations addresses (by slot) for L1Block + GasPriceOracle
 	initialGasPriceOracleAddress, err := ethCl.StorageAt(context.Background(), predeploys.GasPriceOracleAddr, genesis.ImplementationSlot, nil)
@@ -101,7 +106,7 @@ func TestEcotoneNetworkUpgradeTransactions(gt *testing.T) {
 		txn := transactions[i]
 		receipt, err := ethCl.TransactionReceipt(context.Background(), txn.Hash())
 		require.NoError(t, err)
-		require.Equal(t, types.ReceiptStatusSuccessful, receipt.Status)
+		require.Equal(t, types.ReceiptStatusSuccessful, receipt.Status, "tx %d must pass", i)
 		require.NotEmpty(t, txn.Data(), "upgrade tx must provide input data")
 	}
 
@@ -162,11 +167,14 @@ func TestEcotoneNetworkUpgradeTransactions(gt *testing.T) {
 	require.NotNil(t, latestBlock.BeaconRoot())
 	require.Equal(t, *latestBlock.BeaconRoot(), common.Hash{},
 		"L1 genesis block has zeroed parent-beacon-block-root, since it has no parent block, and that propagates into L2")
-	// The first block is an exception in upgrade-networks,
-	// since the beacon-block root contract isn't there at Ecotone activation,
-	// and the beacon-block-root insertion is processed at the start of the block before deposit txs.
-	// If the contract was permissionlessly deployed before, the contract storage will be updated however.
-	checkBeaconBlockRoot(latestBlock.Time(), common.Hash{}, 0, "ecotone activation block has no data yet (since contract wasn't there)")
+	// Legacy check:
+	// > The first block is an exception in upgrade-networks,
+	// > since the beacon-block root contract isn't there at Ecotone activation,
+	// > and the beacon-block-root insertion is processed at the start of the block before deposit txs.
+	// > If the contract was permissionlessly deployed before, the contract storage will be updated however.
+	// > checkBeaconBlockRoot(latestBlock.Time(), common.Hash{}, 0, "ecotone activation block has no data yet (since contract wasn't there)")
+	// Note: 4788 is now installed as preinstall, and thus always there.
+	checkBeaconBlockRoot(latestBlock.Time(), common.Hash{}, latestBlock.Time(), "4788 lookup of first cancun block is 0 hash")
 
 	// Build empty L2 block, to pass ecotone activation
 	sequencer.ActL2StartBlock(t)
@@ -186,7 +194,7 @@ func TestEcotoneNetworkUpgradeTransactions(gt *testing.T) {
 	// test if the migrated scalar matches the deploy config
 	basefeeScalar, err := gasPriceOracle.BaseFeeScalar(nil)
 	require.NoError(t, err)
-	require.True(t, uint64(basefeeScalar) == dp.DeployConfig.GasPriceOracleScalar, "must match deploy config")
+	require.Equal(t, uint64(basefeeScalar), dp.DeployConfig.GasPriceOracleScalar, "must match deploy config")
 
 	cost, err = gasPriceOracle.GetL1Fee(nil, []byte{0, 1, 2, 3, 4})
 	require.NoError(t, err)
diff --git a/op-e2e/actions/fjord_fork_test.go b/op-e2e/actions/fjord_fork_test.go
new file mode 100644
index 000000000000..0dee40e39d50
--- /dev/null
+++ b/op-e2e/actions/fjord_fork_test.go
@@ -0,0 +1,145 @@
+package actions
+
+import (
+	"context"
+	"encoding/hex"
+	"math/big"
+	"testing"
+
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/crypto"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/stretchr/testify/require"
+
+	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
+	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
+	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
+)
+
+var (
+	fjordGasPriceOracleCodeHash = common.HexToHash("0xa88fa50a2745b15e6794247614b5298483070661adacb8d32d716434ed24c6b2")
+	// https://basescan.org/tx/0x8debb2fe54200183fb8baa3c6dbd8e6ec2e4f7a4add87416cd60336b8326d16a
+	txHex = "02f875822105819b8405709fb884057d460082e97f94273ca93a52b817294830ed7572aa591ccfa647fd80881249c58b0021fb3fc080a05bb08ccfd68f83392e446dac64d88a2d28e7072c06502dfabc4a77e77b5c7913a05878d53dd4ebba4f6367e572d524dffcabeec3abb1d8725ee3ac5dc32e1852e3"
+)
+
+func TestFjordNetworkUpgradeTransactions(gt *testing.T) {
+	t := NewDefaultTesting(gt)
+	dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams)
+	genesisBlock := hexutil.Uint64(0)
+	fjordOffset := hexutil.Uint64(2)
+
+	dp.DeployConfig.L1CancunTimeOffset = &genesisBlock // can be removed once Cancun on L1 is the default
+
+	// Activate all forks at genesis, and schedule Fjord the block after
+	dp.DeployConfig.L2GenesisRegolithTimeOffset = &genesisBlock
+	dp.DeployConfig.L2GenesisCanyonTimeOffset = &genesisBlock
+	dp.DeployConfig.L2GenesisDeltaTimeOffset = &genesisBlock
+	dp.DeployConfig.L2GenesisEcotoneTimeOffset = &genesisBlock
+	dp.DeployConfig.L2GenesisFjordTimeOffset = &fjordOffset
+	require.NoError(t, dp.DeployConfig.Check(), "must have valid config")
+
+	sd := e2eutils.Setup(t, dp, defaultAlloc)
+	log := testlog.Logger(t, log.LvlDebug)
+	_, _, _, sequencer, engine, verifier, _, _ := setupReorgTestActors(t, dp, sd, log)
+	ethCl := engine.EthClient()
+
+	// start op-nodes
+	sequencer.ActL2PipelineFull(t)
+	verifier.ActL2PipelineFull(t)
+
+	// Get gas price from oracle
+	gasPriceOracle, err := bindings.NewGasPriceOracleCaller(predeploys.GasPriceOracleAddr, ethCl)
+	require.NoError(t, err)
+
+	// Get current implementations addresses (by slot) for L1Block + GasPriceOracle
+	initialGasPriceOracleAddress, err := ethCl.StorageAt(context.Background(), predeploys.GasPriceOracleAddr, genesis.ImplementationSlot, nil)
+	require.NoError(t, err)
+
+	sequencer.ActBuildL2ToFjord(t)
+
+	// get latest block
+	latestBlock, err := ethCl.BlockByNumber(context.Background(), nil)
+	require.NoError(t, err)
+	require.Equal(t, sequencer.L2Unsafe().Number, latestBlock.Number().Uint64())
+
+	transactions := latestBlock.Transactions()
+	// L1Block: 1 set-L1-info + 1 deploys + 1 upgradeTo + 1 enable fjord on GPO
+	// See [derive.FjordNetworkUpgradeTransactions]
+	require.Equal(t, 4, len(transactions))
+
+	// All transactions are successful
+	for i := 1; i < 4; i++ {
+		txn := transactions[i]
+		receipt, err := ethCl.TransactionReceipt(context.Background(), txn.Hash())
+		require.NoError(t, err)
+		require.Equal(t, types.ReceiptStatusSuccessful, receipt.Status)
+		require.NotEmpty(t, txn.Data(), "upgrade tx must provide input data")
+	}
+
+	expectedGasPriceOracleAddress := crypto.CreateAddress(derive.GasPriceOracleFjordDeployerAddress, 0)
+
+	// Gas Price Oracle Proxy is updated
+	updatedGasPriceOracleAddress, err := ethCl.StorageAt(context.Background(), predeploys.GasPriceOracleAddr, genesis.ImplementationSlot, latestBlock.Number())
+	require.NoError(t, err)
+	require.Equal(t, expectedGasPriceOracleAddress, common.BytesToAddress(updatedGasPriceOracleAddress))
+	require.NotEqualf(t, initialGasPriceOracleAddress, updatedGasPriceOracleAddress, "Gas Price Oracle Proxy address should have changed")
+	verifyCodeHashMatches(t, ethCl, expectedGasPriceOracleAddress, fjordGasPriceOracleCodeHash)
+
+	// Check that Fjord was activated
+	isFjord, err := gasPriceOracle.IsFjord(nil)
+	require.NoError(t, err)
+	require.True(t, isFjord)
+
+	// Check GetL1GasUsed is updated
+	txData, err := hex.DecodeString(txHex)
+	require.NoError(t, err)
+
+	gpoL1GasUsed, err := gasPriceOracle.GetL1GasUsed(&bind.CallOpts{}, txData)
+	require.NoError(t, err)
+	require.Equal(gt, uint64(1_888), gpoL1GasUsed.Uint64())
+
+	// Check that GetL1Fee takes into account fast LZ
+	gpoFee, err := gasPriceOracle.GetL1Fee(&bind.CallOpts{}, txData)
+	require.NoError(t, err)
+
+	gethFee := fjordL1Cost(t, gasPriceOracle, types.RollupCostData{
+		FastLzSize: uint64(types.FlzCompressLen(txData) + 68),
+	})
+	require.Equal(t, gethFee.Uint64(), gpoFee.Uint64())
+
+	// Check that L1FeeUpperBound works
+	upperBound, err := gasPriceOracle.GetL1FeeUpperBound(&bind.CallOpts{}, big.NewInt(int64(len(txData))))
+	require.NoError(t, err)
+
+	txLen := len(txData) + 68
+	flzUpperBound := uint64(txLen + txLen/255 + 16)
+
+	upperBoundCost := fjordL1Cost(t, gasPriceOracle, types.RollupCostData{FastLzSize: flzUpperBound})
+	require.Equal(t, upperBoundCost.Uint64(), upperBound.Uint64())
+}
+
+func fjordL1Cost(t require.TestingT, gasPriceOracle *bindings.GasPriceOracleCaller, rollupCostData types.RollupCostData) *big.Int {
+	baseFeeScalar, err := gasPriceOracle.BaseFeeScalar(nil)
+	require.NoError(t, err)
+	l1BaseFee, err := gasPriceOracle.L1BaseFee(nil)
+	require.NoError(t, err)
+	blobBaseFeeScalar, err := gasPriceOracle.BlobBaseFeeScalar(nil)
+	require.NoError(t, err)
+	blobBaseFee, err := gasPriceOracle.BlobBaseFee(nil)
+	require.NoError(t, err)
+
+	costFunc := types.NewL1CostFuncFjord(
+		l1BaseFee,
+		blobBaseFee,
+		new(big.Int).SetUint64(uint64(baseFeeScalar)),
+		new(big.Int).SetUint64(uint64(blobBaseFeeScalar)))
+
+	fee, _ := costFunc(rollupCostData)
+	return fee
+}
diff --git a/op-e2e/actions/garbage_channel_out.go b/op-e2e/actions/garbage_channel_out.go
index 41a290570ea9..0dad1438a991 100644
--- a/op-e2e/actions/garbage_channel_out.go
+++ b/op-e2e/actions/garbage_channel_out.go
@@ -54,7 +54,7 @@ type Writer interface {
 type ChannelOutIface interface {
 	ID() derive.ChannelID
 	Reset() error
-	AddBlock(rollupCfg *rollup.Config, block *types.Block) (uint64, error)
+	AddBlock(rollupCfg *rollup.Config, block *types.Block) error
 	ReadyBytes() int
 	Flush() error
 	Close() error
@@ -138,19 +138,19 @@ func (co *GarbageChannelOut) Reset() error {
 // error that it returns is ErrTooManyRLPBytes. If this error
 // is returned, the channel should be closed and a new one
 // should be made.
-func (co *GarbageChannelOut) AddBlock(rollupCfg *rollup.Config, block *types.Block) (uint64, error) {
+func (co *GarbageChannelOut) AddBlock(rollupCfg *rollup.Config, block *types.Block) error {
 	if co.closed {
-		return 0, errors.New("already closed")
+		return errors.New("already closed")
 	}
 	batch, err := blockToBatch(rollupCfg, block)
 	if err != nil {
-		return 0, err
+		return err
 	}
 	// We encode to a temporary buffer to determine the encoded length to
 	// ensure that the total size of all RLP elements is less than or equal to MAX_RLP_BYTES_PER_CHANNEL
 	var buf bytes.Buffer
 	if err := rlp.Encode(&buf, batch); err != nil {
-		return 0, err
+		return err
 	}
 	if co.cfg.malformRLP {
 		// Malform the RLP by incrementing the length prefix by 1.
@@ -159,14 +159,14 @@ func (co *GarbageChannelOut) AddBlock(rollupCfg *rollup.Config, block *types.Blo
 		buf.Reset()
 		buf.Write(bufBytes)
 	}
-	if co.rlpLength+buf.Len() > derive.MaxRLPBytesPerChannel {
-		return 0, fmt.Errorf("could not add %d bytes to channel of %d bytes, max is %d. err: %w",
-			buf.Len(), co.rlpLength, derive.MaxRLPBytesPerChannel, derive.ErrTooManyRLPBytes)
+	if co.rlpLength+buf.Len() > rollup.SafeMaxRLPBytesPerChannel {
+		return fmt.Errorf("could not add %d bytes to channel of %d bytes, max is %d. err: %w",
+			buf.Len(), co.rlpLength, rollup.SafeMaxRLPBytesPerChannel, derive.ErrTooManyRLPBytes)
 	}
 	co.rlpLength += buf.Len()
 
-	written, err := io.Copy(co.compress, &buf)
-	return uint64(written), err
+	_, err = io.Copy(co.compress, &buf)
+	return err
 }
 
 // ReadyBytes returns the number of bytes that the channel out can immediately output into a frame.
diff --git a/op-e2e/actions/l1_replica_test.go b/op-e2e/actions/l1_replica_test.go
index 7e9b65cfac86..727638255eb4 100644
--- a/op-e2e/actions/l1_replica_test.go
+++ b/op-e2e/actions/l1_replica_test.go
@@ -10,8 +10,8 @@ import (
 	"github.com/ethereum/go-ethereum/core/rawdb"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
-	"github.com/ethereum/go-ethereum/trie"
-	"github.com/ethereum/go-ethereum/trie/triedb/hashdb"
+	"github.com/ethereum/go-ethereum/triedb"
+	"github.com/ethereum/go-ethereum/triedb/hashdb"
 	"github.com/stretchr/testify/require"
 
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
@@ -60,7 +60,7 @@ func TestL1Replica_ActL1Sync(gt *testing.T) {
 	genesisBlock := sd.L1Cfg.ToBlock()
 	consensus := beacon.New(ethash.NewFaker())
 	db := rawdb.NewMemoryDatabase()
-	tdb := trie.NewDatabase(db, &trie.Config{HashDB: hashdb.Defaults})
+	tdb := triedb.NewDatabase(db, &triedb.Config{HashDB: hashdb.Defaults})
 	sd.L1Cfg.MustCommit(db, tdb)
 
 	chainA, _ := core.GenerateChain(sd.L1Cfg.Config, genesisBlock, consensus, db, 10, func(n int, g *core.BlockGen) {
diff --git a/op-e2e/actions/l2_batcher.go b/op-e2e/actions/l2_batcher.go
index b6415974d351..310a6cade951 100644
--- a/op-e2e/actions/l2_batcher.go
+++ b/op-e2e/actions/l2_batcher.go
@@ -19,6 +19,7 @@ import (
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/ethereum/go-ethereum/params"
 
+	"github.com/ethereum-optimism/optimism/op-batcher/batcher"
 	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
 	batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
@@ -44,7 +45,7 @@ type L1TxAPI interface {
 }
 
 type PlasmaInputSetter interface {
-	SetInput(ctx context.Context, img []byte) (plasma.Keccak256Commitment, error)
+	SetInput(ctx context.Context, img []byte) (plasma.CommitmentData, error)
 }
 
 type BatcherCfg struct {
@@ -188,31 +189,29 @@ func (s *L2Batcher) Buffer(t Testing) error {
 		if s.l2BatcherCfg.GarbageCfg != nil {
 			ch, err = NewGarbageChannelOut(s.l2BatcherCfg.GarbageCfg)
 		} else {
-			c, e := compressor.NewRatioCompressor(compressor.Config{
-				TargetFrameSize:  s.l2BatcherCfg.MaxL1TxSize,
-				TargetNumFrames:  1,
-				ApproxComprRatio: 1,
+			target := batcher.MaxDataSize(1, s.l2BatcherCfg.MaxL1TxSize)
+			c, e := compressor.NewShadowCompressor(compressor.Config{
+				TargetOutputSize: target,
+				CompressionAlgo:  derive.Zlib,
 			})
 			require.NoError(t, e, "failed to create compressor")
 
-			var batchType uint = derive.SingularBatchType
-			var spanBatchBuilder *derive.SpanBatchBuilder = nil
-
 			if s.l2BatcherCfg.ForceSubmitSingularBatch && s.l2BatcherCfg.ForceSubmitSpanBatch {
 				t.Fatalf("ForceSubmitSingularBatch and ForceSubmitSpanBatch cannot be set to true at the same time")
-			} else if s.l2BatcherCfg.ForceSubmitSingularBatch {
-				// use SingularBatchType
-			} else if s.l2BatcherCfg.ForceSubmitSpanBatch || s.rollupCfg.IsDelta(block.Time()) {
-				// If both ForceSubmitSingularBatch and ForceSubmitSpanbatch are false, use SpanBatch automatically if Delta HF is activated.
-				batchType = derive.SpanBatchType
-				spanBatchBuilder = derive.NewSpanBatchBuilder(s.rollupCfg.Genesis.L2Time, s.rollupCfg.L2ChainID)
+			} else {
+				// use span batch if we're forcing it or if we're at/beyond delta
+				if s.l2BatcherCfg.ForceSubmitSpanBatch || s.rollupCfg.IsDelta(block.Time()) {
+					ch, err = derive.NewSpanChannelOut(s.rollupCfg.Genesis.L2Time, s.rollupCfg.L2ChainID, target, derive.Zlib)
+					// use singular batches in all other cases
+				} else {
+					ch, err = derive.NewSingularChannelOut(c)
+				}
 			}
-			ch, err = derive.NewChannelOut(batchType, c, spanBatchBuilder)
 		}
 		require.NoError(t, err, "failed to create channel")
 		s.l2ChannelOut = ch
 	}
-	if _, err := s.l2ChannelOut.AddBlock(s.rollupCfg, block); err != nil { // should always succeed
+	if err := s.l2ChannelOut.AddBlock(s.rollupCfg, block); err != nil {
 		return err
 	}
 	ref, err := s.engCl.L2BlockRefByHash(t.Ctx(), block.Hash())
diff --git a/op-e2e/actions/l2_batcher_test.go b/op-e2e/actions/l2_batcher_test.go
index 82dd4bccacec..5d1d40925803 100644
--- a/op-e2e/actions/l2_batcher_test.go
+++ b/op-e2e/actions/l2_batcher_test.go
@@ -515,7 +515,7 @@ func BigL2Txs(gt *testing.T, deltaTimeOffset *hexutil.Uint64) {
 		sequencer.ActL2EndBlock(t)
 		for batcher.l2BufferedBlock.Number < sequencer.SyncStatus().UnsafeL2.Number {
 			// if we run out of space, close the channel and submit all the txs
-			if err := batcher.Buffer(t); errors.Is(err, derive.ErrTooManyRLPBytes) || errors.Is(err, derive.CompressorFullErr) {
+			if err := batcher.Buffer(t); errors.Is(err, derive.ErrTooManyRLPBytes) || errors.Is(err, derive.ErrCompressorFull) {
 				log.Info("flushing filled channel to batch txs", "id", batcher.l2ChannelOut.ID())
 				batcher.ActL2ChannelClose(t)
 				for batcher.l2ChannelOut != nil {
diff --git a/op-e2e/actions/l2_engine_test.go b/op-e2e/actions/l2_engine_test.go
index 36e146c282a6..6a113e086940 100644
--- a/op-e2e/actions/l2_engine_test.go
+++ b/op-e2e/actions/l2_engine_test.go
@@ -14,8 +14,8 @@ import (
 	"github.com/ethereum/go-ethereum/core/rawdb"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/params"
-	"github.com/ethereum/go-ethereum/trie"
-	"github.com/ethereum/go-ethereum/trie/triedb/hashdb"
+	"github.com/ethereum/go-ethereum/triedb"
+	"github.com/ethereum/go-ethereum/triedb/hashdb"
 	"github.com/stretchr/testify/require"
 
 	"github.com/ethereum/go-ethereum/log"
@@ -35,7 +35,7 @@ func TestL2EngineAPI(gt *testing.T) {
 	genesisBlock := sd.L2Cfg.ToBlock()
 	consensus := beacon.New(ethash.NewFaker())
 	db := rawdb.NewMemoryDatabase()
-	tdb := trie.NewDatabase(db, &trie.Config{HashDB: hashdb.Defaults})
+	tdb := triedb.NewDatabase(db, &triedb.Config{HashDB: hashdb.Defaults})
 	sd.L2Cfg.MustCommit(db, tdb)
 
 	engine := NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath)
@@ -98,7 +98,7 @@ func TestL2EngineAPIBlockBuilding(gt *testing.T) {
 	log := testlog.Logger(t, log.LevelDebug)
 	genesisBlock := sd.L2Cfg.ToBlock()
 	db := rawdb.NewMemoryDatabase()
-	tdb := trie.NewDatabase(db, &trie.Config{HashDB: hashdb.Defaults})
+	tdb := triedb.NewDatabase(db, &triedb.Config{HashDB: hashdb.Defaults})
 	sd.L2Cfg.MustCommit(db, tdb)
 
 	engine := NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath)
diff --git a/op-e2e/actions/l2_proposer.go b/op-e2e/actions/l2_proposer.go
index 660bc71b4b20..d5c1fe384ca5 100644
--- a/op-e2e/actions/l2_proposer.go
+++ b/op-e2e/actions/l2_proposer.go
@@ -17,7 +17,7 @@ import (
 	"github.com/ethereum/go-ethereum/params"
 	"github.com/stretchr/testify/require"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
 	"github.com/ethereum-optimism/optimism/op-proposer/metrics"
 	"github.com/ethereum-optimism/optimism/op-proposer/proposer"
diff --git a/op-e2e/actions/l2_proposer_test.go b/op-e2e/actions/l2_proposer_test.go
index 5143b58e7c5f..fe31c2fa6824 100644
--- a/op-e2e/actions/l2_proposer_test.go
+++ b/op-e2e/actions/l2_proposer_test.go
@@ -12,8 +12,8 @@ import (
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindingspreview"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindingspreview"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
diff --git a/op-e2e/actions/l2_sequencer.go b/op-e2e/actions/l2_sequencer.go
index c1c93cf74dec..dfd4c80c4062 100644
--- a/op-e2e/actions/l2_sequencer.go
+++ b/op-e2e/actions/l2_sequencer.go
@@ -175,3 +175,10 @@ func (s *L2Sequencer) ActBuildL2ToEcotone(t Testing) {
 		s.ActL2EndBlock(t)
 	}
 }
+func (s *L2Sequencer) ActBuildL2ToFjord(t Testing) {
+	require.NotNil(t, s.rollupCfg.FjordTime, "cannot activate FjordTime when it is not scheduled")
+	for s.L2Unsafe().Time < *s.rollupCfg.FjordTime {
+		s.ActL2StartBlock(t)
+		s.ActL2EndBlock(t)
+	}
+}
diff --git a/op-e2e/actions/l2_sequencer_test.go b/op-e2e/actions/l2_sequencer_test.go
index 1bcf4c4d0cff..05fa0242d16a 100644
--- a/op-e2e/actions/l2_sequencer_test.go
+++ b/op-e2e/actions/l2_sequencer_test.go
@@ -111,7 +111,7 @@ func TestL2Sequencer_SequencerDrift(gt *testing.T) {
 	sequencer.ActL1HeadSignal(t)
 
 	// Make blocks up till the sequencer drift is about to surpass, but keep the old L1 origin
-	for sequencer.SyncStatus().UnsafeL2.Time+sd.RollupCfg.BlockTime <= origin.Time+sd.RollupCfg.MaxSequencerDrift {
+	for sequencer.SyncStatus().UnsafeL2.Time+sd.RollupCfg.BlockTime <= origin.Time+sd.ChainSpec.MaxSequencerDrift(origin.Time) {
 		sequencer.ActL2KeepL1Origin(t)
 		makeL2BlockWithAliceTx()
 		require.Equal(t, uint64(1), sequencer.SyncStatus().UnsafeL2.L1Origin.Number, "expected to keep old L1 origin")
diff --git a/op-e2e/actions/plasma_test.go b/op-e2e/actions/plasma_test.go
index d863283b23a9..4307cab18677 100644
--- a/op-e2e/actions/plasma_test.go
+++ b/op-e2e/actions/plasma_test.go
@@ -5,12 +5,11 @@ import (
 	"math/rand"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
 	"github.com/ethereum-optimism/optimism/op-node/node/safedb"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/sync"
 	plasma "github.com/ethereum-optimism/optimism/op-plasma"
-	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-plasma/bindings"
 	"github.com/ethereum-optimism/optimism/op-service/sources"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
@@ -45,10 +44,10 @@ type PlasmaParam func(p *e2eutils.TestParams)
 
 func NewL2PlasmaDA(t Testing, params ...PlasmaParam) *L2PlasmaDA {
 	p := &e2eutils.TestParams{
-		MaxSequencerDrift:   2,
-		SequencerWindowSize: 4,
-		ChannelTimeout:      4,
-		L1BlockTime:         3,
+		MaxSequencerDrift:   40,
+		SequencerWindowSize: 120,
+		ChannelTimeout:      120,
+		L1BlockTime:         12,
 		UsePlasma:           true,
 	}
 	for _, apply := range params {
@@ -59,7 +58,7 @@ func NewL2PlasmaDA(t Testing, params ...PlasmaParam) *L2PlasmaDA {
 	dp := e2eutils.MakeDeployParams(t, p)
 	sd := e2eutils.Setup(t, dp, defaultAlloc)
 
-	require.True(t, sd.RollupCfg.UsePlasma)
+	require.True(t, sd.RollupCfg.PlasmaEnabled())
 
 	miner := NewL1Miner(t, log, sd.L1Cfg)
 	l1Client := miner.EthClient()
@@ -73,7 +72,7 @@ func NewL2PlasmaDA(t Testing, params ...PlasmaParam) *L2PlasmaDA {
 	l1F, err := sources.NewL1Client(miner.RPCClient(), log, nil, sources.L1ClientDefaultConfig(sd.RollupCfg, false, sources.RPCKindBasic))
 	require.NoError(t, err)
 
-	plasmaCfg, err := sd.RollupCfg.PlasmaConfig()
+	plasmaCfg, err := sd.RollupCfg.GetOPPlasmaConfig()
 	require.NoError(t, err)
 
 	daMgr := plasma.NewPlasmaDAWithStorage(log, plasmaCfg, storage, &plasma.NoopMetrics{})
@@ -95,7 +94,7 @@ func NewL2PlasmaDA(t Testing, params ...PlasmaParam) *L2PlasmaDA {
 	alice := NewCrossLayerUser(log, dp.Secrets.Alice, rand.New(rand.NewSource(0xa57b)))
 	alice.L2.SetUserEnv(l2UserEnv)
 
-	contract, err := bindings.NewDataAvailabilityChallenge(sd.RollupCfg.DAChallengeAddress, l1Client)
+	contract, err := bindings.NewDataAvailabilityChallenge(sd.RollupCfg.PlasmaConfig.DAChallengeAddress, l1Client)
 	require.NoError(t, err)
 
 	challengeWindow, err := contract.ChallengeWindow(nil)
@@ -163,7 +162,7 @@ func (a *L2PlasmaDA) ActNewL2Tx(t Testing) {
 		a.lastComm = tx.Data[1:]
 	})
 
-	a.miner.ActL1StartBlock(3)(t)
+	a.miner.ActL1StartBlock(12)(t)
 	a.miner.ActL1IncludeTx(a.dp.Addresses.Batcher)(t)
 	a.miner.ActL1EndBlock(t)
 
@@ -191,7 +190,7 @@ func (a *L2PlasmaDA) ActChallengeInput(t Testing, comm []byte, bn uint64) {
 	_, err = a.contract.Deposit(txOpts)
 	require.NoError(t, err)
 
-	a.miner.ActL1StartBlock(3)(t)
+	a.miner.ActL1StartBlock(12)(t)
 	a.miner.ActL1IncludeTx(a.alice.Address())(t)
 	a.miner.ActL1EndBlock(t)
 
@@ -201,7 +200,7 @@ func (a *L2PlasmaDA) ActChallengeInput(t Testing, comm []byte, bn uint64) {
 	_, err = a.contract.Challenge(txOpts, big.NewInt(int64(bn)), comm)
 	require.NoError(t, err)
 
-	a.miner.ActL1StartBlock(3)(t)
+	a.miner.ActL1StartBlock(12)(t)
 	a.miner.ActL1IncludeTx(a.alice.Address())(t)
 	a.miner.ActL1EndBlock(t)
 }
@@ -209,30 +208,34 @@ func (a *L2PlasmaDA) ActChallengeInput(t Testing, comm []byte, bn uint64) {
 func (a *L2PlasmaDA) ActExpireLastInput(t Testing) {
 	reorgWindow := a.plasmaCfg.ResolveWindow + a.plasmaCfg.ChallengeWindow
 	for a.miner.l1Chain.CurrentBlock().Number.Uint64() <= a.lastCommBn+reorgWindow {
-		a.miner.ActL1StartBlock(3)(t)
+		a.miner.ActL1StartBlock(12)(t)
 		a.miner.ActL1EndBlock(t)
 	}
 }
 
-func (a *L2PlasmaDA) ActResolveLastChallenge(t Testing) {
-	// remove commitment byte prefix
-	input, err := a.storage.GetInput(t.Ctx(), a.lastComm[1:])
-	require.NoError(t, err)
-
+func (a *L2PlasmaDA) ActResolveInput(t Testing, comm []byte, input []byte, bn uint64) {
 	txOpts, err := bind.NewKeyedTransactorWithChainID(a.dp.Secrets.Alice, a.sd.L1Cfg.Config.ChainID)
 	require.NoError(t, err)
 
-	_, err = a.contract.Resolve(txOpts, big.NewInt(int64(a.lastCommBn)), a.lastComm, input)
+	_, err = a.contract.Resolve(txOpts, big.NewInt(int64(bn)), comm, input)
 	require.NoError(t, err)
 
-	a.miner.ActL1StartBlock(3)(t)
+	a.miner.ActL1StartBlock(12)(t)
 	a.miner.ActL1IncludeTx(a.alice.Address())(t)
 	a.miner.ActL1EndBlock(t)
 }
 
+func (a *L2PlasmaDA) ActResolveLastChallenge(t Testing) {
+	// remove derivation byte prefix
+	input, err := a.storage.GetInput(t.Ctx(), plasma.Keccak256Commitment(a.lastComm[1:]))
+	require.NoError(t, err)
+
+	a.ActResolveInput(t, a.lastComm, input, a.lastCommBn)
+}
+
 func (a *L2PlasmaDA) ActL1Blocks(t Testing, n uint64) {
 	for i := uint64(0); i < n; i++ {
-		a.miner.ActL1StartBlock(3)(t)
+		a.miner.ActL1StartBlock(12)(t)
 		a.miner.ActL1EndBlock(t)
 	}
 }
@@ -288,11 +291,7 @@ func TestPlasma_ChallengeExpired(gt *testing.T) {
 	harness.ActL1Blocks(t, 1)
 	harness.sequencer.ActL2PipelineFull(t)
 
-	// make sure that the finalized head was correctly updated on the engine.
-	l2Finalized, err := harness.engCl.L2BlockRefByLabel(t.Ctx(), eth.Finalized)
-	require.NoError(t, err)
-	require.Equal(t, uint64(8), l2Finalized.Number)
-
+	// get new block with same number to compare
 	newBlk, err := harness.engine.EthClient().BlockByNumber(t.Ctx(), blk.Number())
 	require.NoError(t, err)
 
@@ -439,3 +438,187 @@ func TestPlasma_ChallengeReorg(gt *testing.T) {
 	// confirm the reorg did happen
 	require.NotEqual(t, blk.Hash(), newBlk.Hash())
 }
+
+// Sequencer stalls as data is not available, batcher keeps posting, untracked commitments are
+// challenged and resolved, then sequencer resumes and catches up.
+func TestPlasma_SequencerStalledMultiChallenges(gt *testing.T) {
+	if !e2eutils.UsePlasma() {
+		gt.Skip("Plasma is not enabled")
+	}
+
+	t := NewDefaultTesting(gt)
+	a := NewL2PlasmaDA(t)
+
+	// generate some initial L1 blocks.
+	a.ActL1Blocks(t, 5)
+	a.sequencer.ActL1HeadSignal(t)
+
+	// create a new tx on l2 and commit it to l1
+	a.ActNewL2Tx(t)
+
+	// keep track of the related commitment
+	comm1 := a.lastComm
+	input1, err := a.storage.GetInput(t.Ctx(), plasma.Keccak256Commitment(comm1[1:]))
+	bn1 := a.lastCommBn
+	require.NoError(t, err)
+
+	// delete it from the DA provider so the pipeline cannot verify it
+	a.ActDeleteLastInput(t)
+
+	// build more empty l2 unsafe blocks as the l1 origin progresses
+	a.ActL1Blocks(t, 10)
+	a.sequencer.ActBuildToL1HeadUnsafe(t)
+
+	// build another L2 block without advancing derivation
+	a.alice.L2.ActResetTxOpts(t)
+	a.alice.L2.ActSetTxToAddr(&a.dp.Addresses.Bob)(t)
+	a.alice.L2.ActMakeTx(t)
+
+	a.sequencer.ActL2StartBlock(t)
+	a.engine.ActL2IncludeTx(a.alice.Address())(t)
+	a.sequencer.ActL2EndBlock(t)
+
+	a.batcher.ActL2BatchBuffer(t)
+	a.batcher.ActL2ChannelClose(t)
+	a.batcher.ActL2BatchSubmit(t, func(tx *types.DynamicFeeTx) {
+		a.lastComm = tx.Data[1:]
+	})
+
+	// include it in L1
+	a.miner.ActL1StartBlock(120)(t)
+	a.miner.ActL1IncludeTx(a.dp.Addresses.Batcher)(t)
+	a.miner.ActL1EndBlock(t)
+
+	a.sequencer.ActL1HeadSignal(t)
+
+	unsafe := a.sequencer.L2Unsafe()
+	unsafeBlk, err := a.engine.EthClient().BlockByHash(t.Ctx(), unsafe.Hash)
+	require.NoError(t, err)
+
+	// advance the pipeline until it errors out as it is still stuck
+	// on deriving the first commitment
+	for i := 0; i < 3; i++ {
+		a.sequencer.ActL2PipelineStep(t)
+	}
+
+	// keep track of the second commitment
+	comm2 := a.lastComm
+	_, err = a.storage.GetInput(t.Ctx(), plasma.Keccak256Commitment(comm2[1:]))
+	require.NoError(t, err)
+	a.lastCommBn = a.miner.l1Chain.CurrentBlock().Number.Uint64()
+
+	// ensure the second commitment is distinct from the first
+	require.NotEqual(t, comm1, comm2)
+
+	// challenge the last commitment while the pipeline is stuck on the first
+	a.ActChallengeLastInput(t)
+
+	// resolve the latest commitment before the first one is event challenged.
+	a.ActResolveLastChallenge(t)
+
+	// now we delete it to force the pipeline to resolve the second commitment
+	// from the challenge data.
+	a.ActDeleteLastInput(t)
+
+	// finally challenge the first commitment
+	a.ActChallengeInput(t, comm1, bn1)
+
+	// resolve it immediately so we can resume derivation
+	a.ActResolveInput(t, comm1, input1, bn1)
+
+	// pipeline can go on
+	a.sequencer.ActL2PipelineFull(t)
+
+	// verify that the chain did not reorg out
+	safeBlk, err := a.engine.EthClient().BlockByNumber(t.Ctx(), unsafeBlk.Number())
+	require.NoError(t, err)
+	require.Equal(t, unsafeBlk.Hash(), safeBlk.Hash())
+}
+
+// Verify that finalization happens based on plasma DA windows.
+// based on l2_batcher_test.go L2Finalization
+func TestPlasma_Finalization(gt *testing.T) {
+	if !e2eutils.UsePlasma() {
+		gt.Skip("Plasma is not enabled")
+	}
+	t := NewDefaultTesting(gt)
+	a := NewL2PlasmaDA(t)
+
+	// build L1 block #1
+	a.ActL1Blocks(t, 1)
+	a.miner.ActL1SafeNext(t)
+
+	// Fill with l2 blocks up to the L1 head
+	a.sequencer.ActL1HeadSignal(t)
+	a.sequencer.ActBuildToL1Head(t)
+
+	a.sequencer.ActL2PipelineFull(t)
+	a.sequencer.ActL1SafeSignal(t)
+	require.Equal(t, uint64(1), a.sequencer.SyncStatus().SafeL1.Number)
+
+	// add L1 block #2
+	a.ActL1Blocks(t, 1)
+	a.miner.ActL1SafeNext(t)
+	a.miner.ActL1FinalizeNext(t)
+	a.sequencer.ActL1HeadSignal(t)
+	a.sequencer.ActBuildToL1Head(t)
+
+	// Catch up derivation
+	a.sequencer.ActL2PipelineFull(t)
+	a.sequencer.ActL1FinalizedSignal(t)
+	a.sequencer.ActL1SafeSignal(t)
+
+	// commit all the l2 blocks to L1
+	a.batcher.ActSubmitAll(t)
+	a.miner.ActL1StartBlock(12)(t)
+	a.miner.ActL1IncludeTx(a.dp.Addresses.Batcher)(t)
+	a.miner.ActL1EndBlock(t)
+
+	// verify
+	a.sequencer.ActL2PipelineFull(t)
+
+	// fill with more unsafe L2 blocks
+	a.sequencer.ActL1HeadSignal(t)
+	a.sequencer.ActBuildToL1Head(t)
+
+	// submit those blocks too, block #4
+	a.batcher.ActSubmitAll(t)
+	a.miner.ActL1StartBlock(12)(t)
+	a.miner.ActL1IncludeTx(a.dp.Addresses.Batcher)(t)
+	a.miner.ActL1EndBlock(t)
+
+	// add some more L1 blocks #5, #6
+	a.miner.ActEmptyBlock(t)
+	a.miner.ActEmptyBlock(t)
+
+	// and more unsafe L2 blocks
+	a.sequencer.ActL1HeadSignal(t)
+	a.sequencer.ActBuildToL1Head(t)
+
+	// move safe/finalize markers: finalize the L1 chain block with the first batch, but not the second
+	a.miner.ActL1SafeNext(t)     // #2 -> #3
+	a.miner.ActL1SafeNext(t)     // #3 -> #4
+	a.miner.ActL1FinalizeNext(t) // #1 -> #2
+	a.miner.ActL1FinalizeNext(t) // #2 -> #3
+
+	// L1 safe and finalized as expected
+	a.sequencer.ActL2PipelineFull(t)
+	a.sequencer.ActL1FinalizedSignal(t)
+	a.sequencer.ActL1SafeSignal(t)
+	a.sequencer.ActL1HeadSignal(t)
+	require.Equal(t, uint64(6), a.sequencer.SyncStatus().HeadL1.Number)
+	require.Equal(t, uint64(4), a.sequencer.SyncStatus().SafeL1.Number)
+	require.Equal(t, uint64(3), a.sequencer.SyncStatus().FinalizedL1.Number)
+	// l2 cannot finalize yet as the challenge window is not passed
+	require.Equal(t, uint64(0), a.sequencer.SyncStatus().FinalizedL2.Number)
+
+	// expire the challenge window so these blocks can no longer be challenged
+	a.ActL1Blocks(t, a.plasmaCfg.ChallengeWindow)
+
+	// advance derivation and finalize plasma via the L1 signal
+	a.sequencer.ActL2PipelineFull(t)
+	a.ActL1Finalized(t)
+
+	// given 12s l1 time and 1s l2 time, l2 should be 12 * 3 = 36 blocks finalized
+	require.Equal(t, uint64(36), a.sequencer.SyncStatus().FinalizedL2.Number)
+}
diff --git a/op-e2e/actions/span_batch_test.go b/op-e2e/actions/span_batch_test.go
index ce3a48fd2386..6ccb76a461bd 100644
--- a/op-e2e/actions/span_batch_test.go
+++ b/op-e2e/actions/span_batch_test.go
@@ -1,6 +1,7 @@
 package actions
 
 import (
+	"context"
 	"crypto/ecdsa"
 	crand "crypto/rand"
 	"fmt"
@@ -501,6 +502,10 @@ func TestSpanBatchLowThroughputChain(gt *testing.T) {
 		addr := crypto.PubkeyToAddress(privateKey.PublicKey)
 		require.NoError(t, err)
 		addrs[i] = addr
+
+		bal, err := cl.BalanceAt(context.Background(), addr, nil)
+		require.NoError(gt, err)
+		require.Equal(gt, 1, bal.Cmp(common.Big0), "account %d must have non-zero balance, address: %s, balance: %d", i, addr, bal)
 	}
 
 	sequencer.ActL2PipelineFull(t)
diff --git a/op-e2e/actions/sync_test.go b/op-e2e/actions/sync_test.go
index 309b10489ec2..e7521bdd8c94 100644
--- a/op-e2e/actions/sync_test.go
+++ b/op-e2e/actions/sync_test.go
@@ -7,7 +7,6 @@ import (
 	"testing"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/sync"
@@ -26,6 +25,12 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
+func newSpanChannelOut(t StatefulTesting, e e2eutils.SetupData) derive.ChannelOut {
+	channelOut, err := derive.NewSpanChannelOut(e.RollupCfg.Genesis.L2Time, e.RollupCfg.L2ChainID, 128_000, derive.Zlib)
+	require.NoError(t, err)
+	return channelOut
+}
+
 // TestSyncBatchType run each sync test case in singular batch mode and span batch mode.
 func TestSyncBatchType(t *testing.T) {
 	tests := []struct {
@@ -211,16 +216,7 @@ func TestBackupUnsafe(gt *testing.T) {
 	require.Equal(t, verifier.L2Unsafe().Number, uint64(5))
 	require.Equal(t, verifier.L2Safe().Number, uint64(0))
 
-	c, e := compressor.NewRatioCompressor(compressor.Config{
-		TargetFrameSize:  128_000,
-		TargetNumFrames:  1,
-		ApproxComprRatio: 1,
-	})
-	require.NoError(t, e)
-	spanBatchBuilder := derive.NewSpanBatchBuilder(sd.RollupCfg.Genesis.L2Time, sd.RollupCfg.L2ChainID)
-	// Create new span batch channel
-	channelOut, err := derive.NewChannelOut(derive.SpanBatchType, c, spanBatchBuilder)
-	require.NoError(t, err)
+	channelOut := newSpanChannelOut(t, *sd)
 
 	for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ {
 		block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i))
@@ -247,7 +243,7 @@ func TestBackupUnsafe(gt *testing.T) {
 			block = block.WithBody([]*types.Transaction{block.Transactions()[0], invalidTx}, []*types.Header{})
 		}
 		// Add A1, B2, B3, B4, B5 into the channel
-		_, err = channelOut.AddBlock(sd.RollupCfg, block)
+		err = channelOut.AddBlock(sd.RollupCfg, block)
 		require.NoError(t, err)
 	}
 
@@ -383,16 +379,7 @@ func TestBackupUnsafeReorgForkChoiceInputError(gt *testing.T) {
 	require.Equal(t, verifier.L2Unsafe().Number, uint64(5))
 	require.Equal(t, verifier.L2Safe().Number, uint64(0))
 
-	c, e := compressor.NewRatioCompressor(compressor.Config{
-		TargetFrameSize:  128_000,
-		TargetNumFrames:  1,
-		ApproxComprRatio: 1,
-	})
-	require.NoError(t, e)
-	spanBatchBuilder := derive.NewSpanBatchBuilder(sd.RollupCfg.Genesis.L2Time, sd.RollupCfg.L2ChainID)
-	// Create new span batch channel
-	channelOut, err := derive.NewChannelOut(derive.SpanBatchType, c, spanBatchBuilder)
-	require.NoError(t, err)
+	channelOut := newSpanChannelOut(t, *sd)
 
 	for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ {
 		block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i))
@@ -419,7 +406,7 @@ func TestBackupUnsafeReorgForkChoiceInputError(gt *testing.T) {
 			block = block.WithBody([]*types.Transaction{block.Transactions()[0], invalidTx}, []*types.Header{})
 		}
 		// Add A1, B2, B3, B4, B5 into the channel
-		_, err = channelOut.AddBlock(sd.RollupCfg, block)
+		err = channelOut.AddBlock(sd.RollupCfg, block)
 		require.NoError(t, err)
 	}
 
@@ -531,16 +518,7 @@ func TestBackupUnsafeReorgForkChoiceNotInputError(gt *testing.T) {
 	require.Equal(t, verifier.L2Unsafe().Number, uint64(5))
 	require.Equal(t, verifier.L2Safe().Number, uint64(0))
 
-	c, e := compressor.NewRatioCompressor(compressor.Config{
-		TargetFrameSize:  128_000,
-		TargetNumFrames:  1,
-		ApproxComprRatio: 1,
-	})
-	require.NoError(t, e)
-	spanBatchBuilder := derive.NewSpanBatchBuilder(sd.RollupCfg.Genesis.L2Time, sd.RollupCfg.L2ChainID)
-	// Create new span batch channel
-	channelOut, err := derive.NewChannelOut(derive.SpanBatchType, c, spanBatchBuilder)
-	require.NoError(t, err)
+	channelOut := newSpanChannelOut(t, *sd)
 
 	for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ {
 		block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i))
@@ -567,7 +545,7 @@ func TestBackupUnsafeReorgForkChoiceNotInputError(gt *testing.T) {
 			block = block.WithBody([]*types.Transaction{block.Transactions()[0], invalidTx}, []*types.Header{})
 		}
 		// Add A1, B2, B3, B4, B5 into the channel
-		_, err = channelOut.AddBlock(sd.RollupCfg, block)
+		err = channelOut.AddBlock(sd.RollupCfg, block)
 		require.NoError(t, err)
 	}
 
@@ -869,16 +847,7 @@ func TestInvalidPayloadInSpanBatch(gt *testing.T) {
 	sequencer.ActL2PipelineFull(t)
 	verifier.ActL2PipelineFull(t)
 
-	c, e := compressor.NewRatioCompressor(compressor.Config{
-		TargetFrameSize:  128_000,
-		TargetNumFrames:  1,
-		ApproxComprRatio: 1,
-	})
-	require.NoError(t, e)
-	spanBatchBuilder := derive.NewSpanBatchBuilder(sd.RollupCfg.Genesis.L2Time, sd.RollupCfg.L2ChainID)
-	// Create new span batch channel
-	channelOut, err := derive.NewChannelOut(derive.SpanBatchType, c, spanBatchBuilder)
-	require.NoError(t, err)
+	channelOut := newSpanChannelOut(t, *sd)
 
 	// Create block A1 ~ A12 for L1 block #0 ~ #2
 	miner.ActEmptyBlock(t)
@@ -895,7 +864,7 @@ func TestInvalidPayloadInSpanBatch(gt *testing.T) {
 			block = block.WithBody([]*types.Transaction{block.Transactions()[0], invalidTx}, []*types.Header{})
 		}
 		// Add A1 ~ A12 into the channel
-		_, err = channelOut.AddBlock(sd.RollupCfg, block)
+		err = channelOut.AddBlock(sd.RollupCfg, block)
 		require.NoError(t, err)
 	}
 
@@ -917,16 +886,7 @@ func TestInvalidPayloadInSpanBatch(gt *testing.T) {
 	require.Equal(t, verifier.L2Unsafe().Number, uint64(7))
 	require.Equal(t, verifier.L2Safe().Number, uint64(0))
 
-	// Create new span batch channel
-	c, e = compressor.NewRatioCompressor(compressor.Config{
-		TargetFrameSize:  128_000,
-		TargetNumFrames:  1,
-		ApproxComprRatio: 1,
-	})
-	require.NoError(t, e)
-	spanBatchBuilder = derive.NewSpanBatchBuilder(sd.RollupCfg.Genesis.L2Time, sd.RollupCfg.L2ChainID)
-	channelOut, err = derive.NewChannelOut(derive.SpanBatchType, c, spanBatchBuilder)
-	require.NoError(t, err)
+	channelOut = newSpanChannelOut(t, *sd)
 
 	for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ {
 		block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i))
@@ -953,7 +913,7 @@ func TestInvalidPayloadInSpanBatch(gt *testing.T) {
 			block = block.WithBody([]*types.Transaction{block.Transactions()[0], tx}, []*types.Header{})
 		}
 		// Add B1, A2 ~ A12 into the channel
-		_, err = channelOut.AddBlock(sd.RollupCfg, block)
+		err = channelOut.AddBlock(sd.RollupCfg, block)
 		require.NoError(t, err)
 	}
 	// Submit span batch(B1, A2, ... A12)
diff --git a/op-e2e/actions/system_config_test.go b/op-e2e/actions/system_config_test.go
index c9f32d1ea9f0..df634a2ef678 100644
--- a/op-e2e/actions/system_config_test.go
+++ b/op-e2e/actions/system_config_test.go
@@ -12,7 +12,7 @@ import (
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/sync"
diff --git a/op-e2e/actions/user.go b/op-e2e/actions/user.go
index 726f53ad472c..674a27fdcac2 100644
--- a/op-e2e/actions/user.go
+++ b/op-e2e/actions/user.go
@@ -18,15 +18,16 @@ import (
 	"github.com/ethereum/go-ethereum/params"
 	"github.com/stretchr/testify/require"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindingspreview"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
 	e2e "github.com/ethereum-optimism/optimism/op-e2e"
+	legacybindings "github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/config"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
+	"github.com/ethereum-optimism/optimism/op-node/bindings"
+	bindingspreview "github.com/ethereum-optimism/optimism/op-node/bindings/preview"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	"github.com/ethereum-optimism/optimism/op-node/withdrawals"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 )
 
 type L1Bindings struct {
@@ -449,7 +450,7 @@ func (s *CrossLayerUser) getLatestWithdrawalParams(t Testing) (*withdrawals.Prov
 	return ¶ms, nil
 }
 
-func (s *CrossLayerUser) getDisputeGame(t Testing, params withdrawals.ProvenWithdrawalParameters) (*bindings.FaultDisputeGame, error) {
+func (s *CrossLayerUser) getDisputeGame(t Testing, params withdrawals.ProvenWithdrawalParameters) (*legacybindings.FaultDisputeGame, error) {
 	wd := crossdomain.Withdrawal{
 		Nonce:    params.Nonce,
 		Sender:   ¶ms.Sender,
@@ -465,11 +466,11 @@ func (s *CrossLayerUser) getDisputeGame(t Testing, params withdrawals.ProvenWith
 	wdHash, err := wd.Hash()
 	require.Nil(t, err)
 
-	game, err := portal2.ProvenWithdrawals(&bind.CallOpts{}, wdHash)
+	game, err := portal2.ProvenWithdrawals(&bind.CallOpts{}, wdHash, s.L1.address)
 	require.Nil(t, err)
 	require.NotNil(t, game, "withdrawal should be proven")
 
-	proxy, err := bindings.NewFaultDisputeGame(game.DisputeGameProxy, s.L1.env.EthCl)
+	proxy, err := legacybindings.NewFaultDisputeGame(game.DisputeGameProxy, s.L1.env.EthCl)
 	require.Nil(t, err)
 
 	return proxy, nil
@@ -564,11 +565,11 @@ func (s *CrossLayerUser) ResolveClaim(t Testing, l2TxHash common.Hash) common.Ha
 	game, err := s.getDisputeGame(t, *params)
 	require.NoError(t, err)
 
-	expiry, err := game.GameDuration(&bind.CallOpts{})
+	expiry, err := game.MaxClockDuration(&bind.CallOpts{})
 	require.Nil(t, err)
 
 	time.Sleep(time.Duration(expiry) * time.Second)
-	resolveClaimTx, err := game.ResolveClaim(&s.L1.txOpts, common.Big0)
+	resolveClaimTx, err := game.ResolveClaim(&s.L1.txOpts, common.Big0, common.Big0)
 	require.Nil(t, err)
 
 	err = s.L1.env.EthCl.SendTransaction(t.Ctx(), resolveClaimTx)
diff --git a/op-bindings/bindings/addressmanager.go b/op-e2e/bindings/addressmanager.go
similarity index 100%
rename from op-bindings/bindings/addressmanager.go
rename to op-e2e/bindings/addressmanager.go
diff --git a/op-bindings/bindings/alphabetvm.go b/op-e2e/bindings/alphabetvm.go
similarity index 100%
rename from op-bindings/bindings/alphabetvm.go
rename to op-e2e/bindings/alphabetvm.go
diff --git a/op-bindings/bindings/alphabetvm2.go b/op-e2e/bindings/alphabetvm2.go
similarity index 100%
rename from op-bindings/bindings/alphabetvm2.go
rename to op-e2e/bindings/alphabetvm2.go
diff --git a/op-bindings/bindings/basefeevault.go b/op-e2e/bindings/basefeevault.go
similarity index 100%
rename from op-bindings/bindings/basefeevault.go
rename to op-e2e/bindings/basefeevault.go
diff --git a/op-bindings/bindings/create2deployer.go b/op-e2e/bindings/create2deployer.go
similarity index 100%
rename from op-bindings/bindings/create2deployer.go
rename to op-e2e/bindings/create2deployer.go
diff --git a/op-e2e/bindings/crossdomainmessenger.go b/op-e2e/bindings/crossdomainmessenger.go
new file mode 100644
index 000000000000..516b49cbffab
--- /dev/null
+++ b/op-e2e/bindings/crossdomainmessenger.go
@@ -0,0 +1,1433 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// CrossDomainMessengerMetaData contains all meta data concerning the CrossDomainMessenger contract.
+var CrossDomainMessengerMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"function\",\"name\":\"MESSAGE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_CALLDATA_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OTHER_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_CALL_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_CONSTANT_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_GAS_CHECK_BUFFER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_RESERVED_GAS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"baseGas\",\"inputs\":[{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"failedMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageNonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"otherMessenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"relayMessage\",\"inputs\":[{\"name\":\"_nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"successfulMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"xDomainMessageSender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"FailedRelayedMessage\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RelayedMessage\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SentMessage\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"messageNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SentMessageExtension1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+}
+
+// CrossDomainMessengerABI is the input ABI used to generate the binding from.
+// Deprecated: Use CrossDomainMessengerMetaData.ABI instead.
+var CrossDomainMessengerABI = CrossDomainMessengerMetaData.ABI
+
+// CrossDomainMessenger is an auto generated Go binding around an Ethereum contract.
+type CrossDomainMessenger struct {
+	CrossDomainMessengerCaller     // Read-only binding to the contract
+	CrossDomainMessengerTransactor // Write-only binding to the contract
+	CrossDomainMessengerFilterer   // Log filterer for contract events
+}
+
+// CrossDomainMessengerCaller is an auto generated read-only Go binding around an Ethereum contract.
+type CrossDomainMessengerCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// CrossDomainMessengerTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type CrossDomainMessengerTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// CrossDomainMessengerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type CrossDomainMessengerFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// CrossDomainMessengerSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type CrossDomainMessengerSession struct {
+	Contract     *CrossDomainMessenger // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts         // Call options to use throughout this session
+	TransactOpts bind.TransactOpts     // Transaction auth options to use throughout this session
+}
+
+// CrossDomainMessengerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type CrossDomainMessengerCallerSession struct {
+	Contract *CrossDomainMessengerCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts               // Call options to use throughout this session
+}
+
+// CrossDomainMessengerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type CrossDomainMessengerTransactorSession struct {
+	Contract     *CrossDomainMessengerTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts               // Transaction auth options to use throughout this session
+}
+
+// CrossDomainMessengerRaw is an auto generated low-level Go binding around an Ethereum contract.
+type CrossDomainMessengerRaw struct {
+	Contract *CrossDomainMessenger // Generic contract binding to access the raw methods on
+}
+
+// CrossDomainMessengerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type CrossDomainMessengerCallerRaw struct {
+	Contract *CrossDomainMessengerCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// CrossDomainMessengerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type CrossDomainMessengerTransactorRaw struct {
+	Contract *CrossDomainMessengerTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewCrossDomainMessenger creates a new instance of CrossDomainMessenger, bound to a specific deployed contract.
+func NewCrossDomainMessenger(address common.Address, backend bind.ContractBackend) (*CrossDomainMessenger, error) {
+	contract, err := bindCrossDomainMessenger(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &CrossDomainMessenger{CrossDomainMessengerCaller: CrossDomainMessengerCaller{contract: contract}, CrossDomainMessengerTransactor: CrossDomainMessengerTransactor{contract: contract}, CrossDomainMessengerFilterer: CrossDomainMessengerFilterer{contract: contract}}, nil
+}
+
+// NewCrossDomainMessengerCaller creates a new read-only instance of CrossDomainMessenger, bound to a specific deployed contract.
+func NewCrossDomainMessengerCaller(address common.Address, caller bind.ContractCaller) (*CrossDomainMessengerCaller, error) {
+	contract, err := bindCrossDomainMessenger(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &CrossDomainMessengerCaller{contract: contract}, nil
+}
+
+// NewCrossDomainMessengerTransactor creates a new write-only instance of CrossDomainMessenger, bound to a specific deployed contract.
+func NewCrossDomainMessengerTransactor(address common.Address, transactor bind.ContractTransactor) (*CrossDomainMessengerTransactor, error) {
+	contract, err := bindCrossDomainMessenger(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &CrossDomainMessengerTransactor{contract: contract}, nil
+}
+
+// NewCrossDomainMessengerFilterer creates a new log filterer instance of CrossDomainMessenger, bound to a specific deployed contract.
+func NewCrossDomainMessengerFilterer(address common.Address, filterer bind.ContractFilterer) (*CrossDomainMessengerFilterer, error) {
+	contract, err := bindCrossDomainMessenger(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &CrossDomainMessengerFilterer{contract: contract}, nil
+}
+
+// bindCrossDomainMessenger binds a generic wrapper to an already deployed contract.
+func bindCrossDomainMessenger(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(CrossDomainMessengerABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_CrossDomainMessenger *CrossDomainMessengerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _CrossDomainMessenger.Contract.CrossDomainMessengerCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_CrossDomainMessenger *CrossDomainMessengerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _CrossDomainMessenger.Contract.CrossDomainMessengerTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_CrossDomainMessenger *CrossDomainMessengerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _CrossDomainMessenger.Contract.CrossDomainMessengerTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_CrossDomainMessenger *CrossDomainMessengerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _CrossDomainMessenger.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_CrossDomainMessenger *CrossDomainMessengerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _CrossDomainMessenger.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_CrossDomainMessenger *CrossDomainMessengerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _CrossDomainMessenger.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) MESSAGEVERSION(opts *bind.CallOpts) (uint16, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "MESSAGE_VERSION")
+
+	if err != nil {
+		return *new(uint16), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
+
+	return out0, err
+
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) MESSAGEVERSION() (uint16, error) {
+	return _CrossDomainMessenger.Contract.MESSAGEVERSION(&_CrossDomainMessenger.CallOpts)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) MESSAGEVERSION() (uint16, error) {
+	return _CrossDomainMessenger.Contract.MESSAGEVERSION(&_CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) MINGASCALLDATAOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_CALLDATA_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADDENOMINATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADNUMERATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) OTHERMESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "OTHER_MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) OTHERMESSENGER() (common.Address, error) {
+	return _CrossDomainMessenger.Contract.OTHERMESSENGER(&_CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) OTHERMESSENGER() (common.Address, error) {
+	return _CrossDomainMessenger.Contract.OTHERMESSENGER(&_CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) RELAYCALLOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CALL_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) RELAYCONSTANTOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CONSTANT_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) RELAYGASCHECKBUFFER(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "RELAY_GAS_CHECK_BUFFER")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) RELAYRESERVEDGAS(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "RELAY_RESERVED_GAS")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_CrossDomainMessenger.CallOpts)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) BaseGas(opts *bind.CallOpts, _message []byte, _minGasLimit uint32) (uint64, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "baseGas", _message, _minGasLimit)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _CrossDomainMessenger.Contract.BaseGas(&_CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _CrossDomainMessenger.Contract.BaseGas(&_CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) FailedMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "failedMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _CrossDomainMessenger.Contract.FailedMessages(&_CrossDomainMessenger.CallOpts, arg0)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _CrossDomainMessenger.Contract.FailedMessages(&_CrossDomainMessenger.CallOpts, arg0)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) MessageNonce(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "messageNonce")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) MessageNonce() (*big.Int, error) {
+	return _CrossDomainMessenger.Contract.MessageNonce(&_CrossDomainMessenger.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) MessageNonce() (*big.Int, error) {
+	return _CrossDomainMessenger.Contract.MessageNonce(&_CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) OtherMessenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "otherMessenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) OtherMessenger() (common.Address, error) {
+	return _CrossDomainMessenger.Contract.OtherMessenger(&_CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) OtherMessenger() (common.Address, error) {
+	return _CrossDomainMessenger.Contract.OtherMessenger(&_CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) Paused() (bool, error) {
+	return _CrossDomainMessenger.Contract.Paused(&_CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) Paused() (bool, error) {
+	return _CrossDomainMessenger.Contract.Paused(&_CrossDomainMessenger.CallOpts)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) SuccessfulMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "successfulMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _CrossDomainMessenger.Contract.SuccessfulMessages(&_CrossDomainMessenger.CallOpts, arg0)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _CrossDomainMessenger.Contract.SuccessfulMessages(&_CrossDomainMessenger.CallOpts, arg0)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_CrossDomainMessenger *CrossDomainMessengerCaller) XDomainMessageSender(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _CrossDomainMessenger.contract.Call(opts, &out, "xDomainMessageSender")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_CrossDomainMessenger *CrossDomainMessengerSession) XDomainMessageSender() (common.Address, error) {
+	return _CrossDomainMessenger.Contract.XDomainMessageSender(&_CrossDomainMessenger.CallOpts)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_CrossDomainMessenger *CrossDomainMessengerCallerSession) XDomainMessageSender() (common.Address, error) {
+	return _CrossDomainMessenger.Contract.XDomainMessageSender(&_CrossDomainMessenger.CallOpts)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_CrossDomainMessenger *CrossDomainMessengerTransactor) RelayMessage(opts *bind.TransactOpts, _nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _CrossDomainMessenger.contract.Transact(opts, "relayMessage", _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_CrossDomainMessenger *CrossDomainMessengerSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _CrossDomainMessenger.Contract.RelayMessage(&_CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_CrossDomainMessenger *CrossDomainMessengerTransactorSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _CrossDomainMessenger.Contract.RelayMessage(&_CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_CrossDomainMessenger *CrossDomainMessengerTransactor) SendMessage(opts *bind.TransactOpts, _target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _CrossDomainMessenger.contract.Transact(opts, "sendMessage", _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_CrossDomainMessenger *CrossDomainMessengerSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _CrossDomainMessenger.Contract.SendMessage(&_CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_CrossDomainMessenger *CrossDomainMessengerTransactorSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _CrossDomainMessenger.Contract.SendMessage(&_CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// CrossDomainMessengerFailedRelayedMessageIterator is returned from FilterFailedRelayedMessage and is used to iterate over the raw logs and unpacked data for FailedRelayedMessage events raised by the CrossDomainMessenger contract.
+type CrossDomainMessengerFailedRelayedMessageIterator struct {
+	Event *CrossDomainMessengerFailedRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *CrossDomainMessengerFailedRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(CrossDomainMessengerFailedRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(CrossDomainMessengerFailedRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *CrossDomainMessengerFailedRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *CrossDomainMessengerFailedRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// CrossDomainMessengerFailedRelayedMessage represents a FailedRelayedMessage event raised by the CrossDomainMessenger contract.
+type CrossDomainMessengerFailedRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterFailedRelayedMessage is a free log retrieval operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) FilterFailedRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*CrossDomainMessengerFailedRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _CrossDomainMessenger.contract.FilterLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &CrossDomainMessengerFailedRelayedMessageIterator{contract: _CrossDomainMessenger.contract, event: "FailedRelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchFailedRelayedMessage is a free log subscription operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) WatchFailedRelayedMessage(opts *bind.WatchOpts, sink chan<- *CrossDomainMessengerFailedRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _CrossDomainMessenger.contract.WatchLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(CrossDomainMessengerFailedRelayedMessage)
+				if err := _CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseFailedRelayedMessage is a log parse operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) ParseFailedRelayedMessage(log types.Log) (*CrossDomainMessengerFailedRelayedMessage, error) {
+	event := new(CrossDomainMessengerFailedRelayedMessage)
+	if err := _CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// CrossDomainMessengerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the CrossDomainMessenger contract.
+type CrossDomainMessengerInitializedIterator struct {
+	Event *CrossDomainMessengerInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *CrossDomainMessengerInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(CrossDomainMessengerInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(CrossDomainMessengerInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *CrossDomainMessengerInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *CrossDomainMessengerInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// CrossDomainMessengerInitialized represents a Initialized event raised by the CrossDomainMessenger contract.
+type CrossDomainMessengerInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) FilterInitialized(opts *bind.FilterOpts) (*CrossDomainMessengerInitializedIterator, error) {
+
+	logs, sub, err := _CrossDomainMessenger.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &CrossDomainMessengerInitializedIterator{contract: _CrossDomainMessenger.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *CrossDomainMessengerInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _CrossDomainMessenger.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(CrossDomainMessengerInitialized)
+				if err := _CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) ParseInitialized(log types.Log) (*CrossDomainMessengerInitialized, error) {
+	event := new(CrossDomainMessengerInitialized)
+	if err := _CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// CrossDomainMessengerRelayedMessageIterator is returned from FilterRelayedMessage and is used to iterate over the raw logs and unpacked data for RelayedMessage events raised by the CrossDomainMessenger contract.
+type CrossDomainMessengerRelayedMessageIterator struct {
+	Event *CrossDomainMessengerRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *CrossDomainMessengerRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(CrossDomainMessengerRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(CrossDomainMessengerRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *CrossDomainMessengerRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *CrossDomainMessengerRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// CrossDomainMessengerRelayedMessage represents a RelayedMessage event raised by the CrossDomainMessenger contract.
+type CrossDomainMessengerRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterRelayedMessage is a free log retrieval operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) FilterRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*CrossDomainMessengerRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _CrossDomainMessenger.contract.FilterLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &CrossDomainMessengerRelayedMessageIterator{contract: _CrossDomainMessenger.contract, event: "RelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchRelayedMessage is a free log subscription operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) WatchRelayedMessage(opts *bind.WatchOpts, sink chan<- *CrossDomainMessengerRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _CrossDomainMessenger.contract.WatchLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(CrossDomainMessengerRelayedMessage)
+				if err := _CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseRelayedMessage is a log parse operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) ParseRelayedMessage(log types.Log) (*CrossDomainMessengerRelayedMessage, error) {
+	event := new(CrossDomainMessengerRelayedMessage)
+	if err := _CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// CrossDomainMessengerSentMessageIterator is returned from FilterSentMessage and is used to iterate over the raw logs and unpacked data for SentMessage events raised by the CrossDomainMessenger contract.
+type CrossDomainMessengerSentMessageIterator struct {
+	Event *CrossDomainMessengerSentMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *CrossDomainMessengerSentMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(CrossDomainMessengerSentMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(CrossDomainMessengerSentMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *CrossDomainMessengerSentMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *CrossDomainMessengerSentMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// CrossDomainMessengerSentMessage represents a SentMessage event raised by the CrossDomainMessenger contract.
+type CrossDomainMessengerSentMessage struct {
+	Target       common.Address
+	Sender       common.Address
+	Message      []byte
+	MessageNonce *big.Int
+	GasLimit     *big.Int
+	Raw          types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessage is a free log retrieval operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) FilterSentMessage(opts *bind.FilterOpts, target []common.Address) (*CrossDomainMessengerSentMessageIterator, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _CrossDomainMessenger.contract.FilterLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return &CrossDomainMessengerSentMessageIterator{contract: _CrossDomainMessenger.contract, event: "SentMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessage is a free log subscription operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) WatchSentMessage(opts *bind.WatchOpts, sink chan<- *CrossDomainMessengerSentMessage, target []common.Address) (event.Subscription, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _CrossDomainMessenger.contract.WatchLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(CrossDomainMessengerSentMessage)
+				if err := _CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessage is a log parse operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) ParseSentMessage(log types.Log) (*CrossDomainMessengerSentMessage, error) {
+	event := new(CrossDomainMessengerSentMessage)
+	if err := _CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// CrossDomainMessengerSentMessageExtension1Iterator is returned from FilterSentMessageExtension1 and is used to iterate over the raw logs and unpacked data for SentMessageExtension1 events raised by the CrossDomainMessenger contract.
+type CrossDomainMessengerSentMessageExtension1Iterator struct {
+	Event *CrossDomainMessengerSentMessageExtension1 // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *CrossDomainMessengerSentMessageExtension1Iterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(CrossDomainMessengerSentMessageExtension1)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(CrossDomainMessengerSentMessageExtension1)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *CrossDomainMessengerSentMessageExtension1Iterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *CrossDomainMessengerSentMessageExtension1Iterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// CrossDomainMessengerSentMessageExtension1 represents a SentMessageExtension1 event raised by the CrossDomainMessenger contract.
+type CrossDomainMessengerSentMessageExtension1 struct {
+	Sender common.Address
+	Value  *big.Int
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessageExtension1 is a free log retrieval operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) FilterSentMessageExtension1(opts *bind.FilterOpts, sender []common.Address) (*CrossDomainMessengerSentMessageExtension1Iterator, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _CrossDomainMessenger.contract.FilterLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &CrossDomainMessengerSentMessageExtension1Iterator{contract: _CrossDomainMessenger.contract, event: "SentMessageExtension1", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessageExtension1 is a free log subscription operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) WatchSentMessageExtension1(opts *bind.WatchOpts, sink chan<- *CrossDomainMessengerSentMessageExtension1, sender []common.Address) (event.Subscription, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _CrossDomainMessenger.contract.WatchLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(CrossDomainMessengerSentMessageExtension1)
+				if err := _CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessageExtension1 is a log parse operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_CrossDomainMessenger *CrossDomainMessengerFilterer) ParseSentMessageExtension1(log types.Log) (*CrossDomainMessengerSentMessageExtension1, error) {
+	event := new(CrossDomainMessengerSentMessageExtension1)
+	if err := _CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-bindings/bindings/delayedvetoable.go b/op-e2e/bindings/delayedvetoable.go
similarity index 100%
rename from op-bindings/bindings/delayedvetoable.go
rename to op-e2e/bindings/delayedvetoable.go
diff --git a/op-bindings/bindings/delayedweth.go b/op-e2e/bindings/delayedweth.go
similarity index 79%
rename from op-bindings/bindings/delayedweth.go
rename to op-e2e/bindings/delayedweth.go
index 017806a8d523..0b1c69a953df 100644
--- a/op-bindings/bindings/delayedweth.go
+++ b/op-e2e/bindings/delayedweth.go
@@ -30,8 +30,8 @@ var (
 
 // DelayedWETHMetaData contains all meta data concerning the DelayedWETH contract.
 var DelayedWETHMetaData = &bind.MetaData{
-	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"config\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"hold\",\"inputs\":[{\"name\":\"_guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_config\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recover\",\"inputs\":[{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlock\",\"inputs\":[{\"name\":\"_guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"guy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"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\":\"Transfer\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unwrap\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawal\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
-	Bin: "0x60a06040523480156200001157600080fd5b5060405162001935380380620019358339810160408190526200003491620002d7565b6080819052620000466000806200004d565b50620002f1565b600054610100900460ff16158080156200006e5750600054600160ff909116105b806200009e57506200008b30620001a760201b6200110a1760201c565b1580156200009e575060005460ff166001145b620001075760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156200012b576000805461ff0019166101001790555b62000135620001b6565b62000140836200021e565b606880546001600160a01b0319166001600160a01b0384161790558015620001a2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054610100900460ff16620002125760405162461bcd60e51b815260206004820152602b60248201526000805160206200191583398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000fe565b6200021c62000270565b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16620002cc5760405162461bcd60e51b815260206004820152602b60248201526000805160206200191583398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000fe565b6200021c336200021e565b600060208284031215620002ea57600080fd5b5051919050565b6080516116016200031460003960008181610343015261102b01526116016000f3fe6080604052600436106101845760003560e01c8063715018a6116100d6578063a9059cbb1161007f578063dd62ed3e11610059578063dd62ed3e1461052b578063f2fde38b14610563578063f3fef3a31461058357600080fd5b8063a9059cbb146104af578063cd47bde1146104cf578063d0e30db01461052357600080fd5b80638da5cb5b116100b05780638da5cb5b1461041b57806395d89b4114610446578063977a5ec51461048f57600080fd5b8063715018a61461039457806379502c55146103a95780637eee288d146103fb57600080fd5b80632e1a7d4d1161013857806354fd4d501161011257806354fd4d50146102eb5780636a42b8f81461033457806370a082311461036757600080fd5b80632e1a7d4d14610284578063313ce567146102a4578063485cc955146102cb57600080fd5b80630ca35682116101695780630ca356821461022757806318160ddd1461024757806323b872dd1461026457600080fd5b806306fdde0314610198578063095ea7b3146101f757600080fd5b36610193576101916105a3565b005b600080fd5b3480156101a457600080fd5b506101e16040518060400160405280600d81526020017f577261707065642045746865720000000000000000000000000000000000000081525081565b6040516101ee9190611403565b60405180910390f35b34801561020357600080fd5b50610217610212366004611498565b6105fe565b60405190151581526020016101ee565b34801561023357600080fd5b506101916102423660046114c4565b610677565b34801561025357600080fd5b50475b6040519081526020016101ee565b34801561027057600080fd5b5061021761027f3660046114dd565b6107be565b34801561029057600080fd5b5061019161029f3660046114c4565b6109d5565b3480156102b057600080fd5b506102b9601281565b60405160ff90911681526020016101ee565b3480156102d757600080fd5b506101916102e636600461151e565b6109e2565b3480156102f757600080fd5b506101e16040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b34801561034057600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610256565b34801561037357600080fd5b50610256610382366004611557565b60656020526000908152604090205481565b3480156103a057600080fd5b50610191610bbf565b3480156103b557600080fd5b506068546103d69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ee565b34801561040757600080fd5b50610191610416366004611498565b610bd3565b34801561042757600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166103d6565b34801561045257600080fd5b506101e16040518060400160405280600481526020017f574554480000000000000000000000000000000000000000000000000000000081525081565b34801561049b57600080fd5b506101916104aa366004611498565b610c27565b3480156104bb57600080fd5b506102176104ca366004611498565b610d14565b3480156104db57600080fd5b5061050e6104ea36600461151e565b60676020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101ee565b6101916105a3565b34801561053757600080fd5b5061025661054636600461151e565b606660209081526000928352604080842090915290825290205481565b34801561056f57600080fd5b5061019161057e366004611557565b610d28565b34801561058f57600080fd5b5061019161059e366004611498565b610ddc565b33600090815260656020526040812080543492906105c29084906115a3565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106669086815260200190565b60405180910390a350600192915050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146106fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064015b60405180910390fd5b8047101561078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f44656c61796564574554483a20696e73756666696369656e742062616c616e6360448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016106f4565b604051339082156108fc029083906000818181858888f193505050501580156107ba573d6000803e3d6000fd5b5050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120548211156107f057600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610866575073ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156108ee5773ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020548211156108a857600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152606660209081526040808320338452909152812080548492906108e89084906115bb565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8416600090815260656020526040812080548492906109239084906115bb565b909155505073ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120805484929061095d9084906115a3565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109c391815260200190565b60405180910390a35060019392505050565b6109df3382610ddc565b50565b600054610100900460ff1615808015610a025750600054600160ff909116105b80610a1c5750303b158015610a1c575060005460ff166001145b610aa8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106f4565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b0657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b0e611126565b610b17836111c5565b606880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610bba57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610bc761123c565b610bd160006111c5565b565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120426001820155805490918391839190610c1d9084906115a3565b9091555050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064016106f4565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff871680855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050565b6000610d213384846107be565b9392505050565b610d3061123c565b73ffffffffffffffffffffffffffffffffffffffff8116610dd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106f4565b6109df816111c5565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6d91906115d2565b15610ed4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e7472616374206973207061757365640060448201526064016106f4565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290208054821115610f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44656c61796564574554483a20696e73756666696369656e7420756e6c6f636b60448201527f6564207769746864726177616c0000000000000000000000000000000000000060648201526084016106f4565b6000816001015411611028576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44656c61796564574554483a207769746864726177616c206e6f7420756e6c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106f4565b427f0000000000000000000000000000000000000000000000000000000000000000826001015461105991906115a3565b11156110e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44656c61796564574554483a207769746864726177616c2064656c6179206e6f60448201527f74206d657400000000000000000000000000000000000000000000000000000060648201526084016106f4565b818160000160008282546110fb91906115bb565b90915550610bba9050826112bd565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600054610100900460ff166111bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106f4565b610bd1611363565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610bd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106f4565b336000908152606560205260409020548111156112d957600080fd5b33600090815260656020526040812080548392906112f89084906115bb565b9091555050604051339082156108fc029083906000818181858888f1935050505015801561132a573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600054610100900460ff166113fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106f4565b610bd1336111c5565b600060208083528351808285015260005b8181101561143057858101830151858201604001528201611414565b81811115611442576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109df57600080fd5b600080604083850312156114ab57600080fd5b82356114b681611476565b946020939093013593505050565b6000602082840312156114d657600080fd5b5035919050565b6000806000606084860312156114f257600080fd5b83356114fd81611476565b9250602084013561150d81611476565b929592945050506040919091013590565b6000806040838503121561153157600080fd5b823561153c81611476565b9150602083013561154c81611476565b809150509250929050565b60006020828403121561156957600080fd5b8135610d2181611476565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156115b6576115b6611574565b500190565b6000828210156115cd576115cd611574565b500390565b6000602082840312156115e457600080fd5b81518015158114610d2157600080fdfea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"config\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"hold\",\"inputs\":[{\"name\":\"_guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_config\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recover\",\"inputs\":[{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlock\",\"inputs\":[{\"name\":\"_guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"guy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"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\":\"Transfer\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unwrap\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawal\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+	Bin: "0x60a06040523480156200001157600080fd5b50604051620018aa380380620018aa8339810160408190526200003491620002d7565b6080819052620000466000806200004d565b50620002f1565b600054610100900460ff16158080156200006e5750600054600160ff909116105b806200009e57506200008b30620001a760201b6200107f1760201c565b1580156200009e575060005460ff166001145b620001075760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156200012b576000805461ff0019166101001790555b62000135620001b6565b62000140836200021e565b606880546001600160a01b0319166001600160a01b0384161790558015620001a2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054610100900460ff16620002125760405162461bcd60e51b815260206004820152602b60248201526000805160206200188a83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000fe565b6200021c62000270565b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16620002cc5760405162461bcd60e51b815260206004820152602b60248201526000805160206200188a83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000fe565b6200021c336200021e565b600060208284031215620002ea57600080fd5b5051919050565b608051611576620003146000396000818161033f0152610fa001526115766000f3fe6080604052600436106101845760003560e01c8063715018a6116100d6578063a9059cbb1161007f578063dd62ed3e11610059578063dd62ed3e1461051c578063f2fde38b14610554578063f3fef3a31461057457610193565b8063a9059cbb146104a8578063cd47bde1146104c8578063d0e30db01461019357610193565b80638da5cb5b116100b05780638da5cb5b1461041757806395d89b4114610442578063977a5ec51461048857610193565b8063715018a61461039057806379502c55146103a55780637eee288d146103f757610193565b80632e1a7d4d1161013857806354fd4d501161011257806354fd4d50146102e75780636a42b8f81461033057806370a082311461036357610193565b80632e1a7d4d14610280578063313ce567146102a0578063485cc955146102c757610193565b80630ca35682116101695780630ca356821461022357806318160ddd1461024357806323b872dd1461026057610193565b806306fdde031461019b578063095ea7b3146101f357610193565b3661019357610191610594565b005b610191610594565b3480156101a757600080fd5b5060408051808201909152600d81527f577261707065642045746865720000000000000000000000000000000000000060208201525b6040516101ea9190611378565b60405180910390f35b3480156101ff57600080fd5b5061021361020e36600461140d565b6105ef565b60405190151581526020016101ea565b34801561022f57600080fd5b5061019161023e366004611439565b610668565b34801561024f57600080fd5b50475b6040519081526020016101ea565b34801561026c57600080fd5b5061021361027b366004611452565b610734565b34801561028c57600080fd5b5061019161029b366004611439565b61094b565b3480156102ac57600080fd5b506102b5601281565b60405160ff90911681526020016101ea565b3480156102d357600080fd5b506101916102e2366004611493565b610958565b3480156102f357600080fd5b506101dd6040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b34801561033c57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610252565b34801561036f57600080fd5b5061025261037e3660046114cc565b60656020526000908152604090205481565b34801561039c57600080fd5b50610191610b34565b3480156103b157600080fd5b506068546103d29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ea565b34801561040357600080fd5b5061019161041236600461140d565b610b48565b34801561042357600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166103d2565b34801561044e57600080fd5b5060408051808201909152600481527f574554480000000000000000000000000000000000000000000000000000000060208201526101dd565b34801561049457600080fd5b506101916104a336600461140d565b610b9c565b3480156104b457600080fd5b506102136104c336600461140d565b610c89565b3480156104d457600080fd5b506105076104e3366004611493565b60676020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101ea565b34801561052857600080fd5b50610252610537366004611493565b606660209081526000928352604080842090915290825290205481565b34801561056057600080fd5b5061019161056f3660046114cc565b610c9d565b34801561058057600080fd5b5061019161058f36600461140d565b610d51565b33600090815260656020526040812080543492906105b3908490611518565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106579086815260200190565b60405180910390a350600192915050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146106ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064015b60405180910390fd5b60004782106106fd57476106ff565b815b604051909150339082156108fc029083906000818181858888f1935050505015801561072f573d6000803e3d6000fd5b505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526065602052604081205482111561076657600080fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906107dc575073ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156108645773ffffffffffffffffffffffffffffffffffffffff8416600090815260666020908152604080832033845290915290205482111561081e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091528120805484929061085e908490611530565b90915550505b73ffffffffffffffffffffffffffffffffffffffff841660009081526065602052604081208054849290610899908490611530565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600090815260656020526040812080548492906108d3908490611518565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161093991815260200190565b60405180910390a35060019392505050565b6109553382610d51565b50565b600054610100900460ff16158080156109785750600054600160ff909116105b806109925750303b158015610992575060005460ff166001145b610a1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106e5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a7c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610a8461109b565b610a8d8361113a565b606880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055801561072f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b610b3c6111b1565b610b46600061113a565b565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120426001820155805490918391839190610b92908490611518565b9091555050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064016106e5565b73ffffffffffffffffffffffffffffffffffffffff821660008181526066602090815260408083203380855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050565b6000610c96338484610734565b9392505050565b610ca56111b1565b73ffffffffffffffffffffffffffffffffffffffff8116610d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106e5565b6109558161113a565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de29190611547565b15610e49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e7472616374206973207061757365640060448201526064016106e5565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290208054821115610f0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44656c61796564574554483a20696e73756666696369656e7420756e6c6f636b60448201527f6564207769746864726177616c0000000000000000000000000000000000000060648201526084016106e5565b6000816001015411610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44656c61796564574554483a207769746864726177616c206e6f7420756e6c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106e5565b427f00000000000000000000000000000000000000000000000000000000000000008260010154610fce9190611518565b111561105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44656c61796564574554483a207769746864726177616c2064656c6179206e6f60448201527f74206d657400000000000000000000000000000000000000000000000000000060648201526084016106e5565b818160000160008282546110709190611530565b9091555061072f905082611232565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600054610100900460ff16611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106e5565b610b466112d8565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e5565b3360009081526065602052604090205481111561124e57600080fd5b336000908152606560205260408120805483929061126d908490611530565b9091555050604051339082156108fc029083906000818181858888f1935050505015801561129f573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600054610100900460ff1661136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106e5565b610b463361113a565b600060208083528351808285015260005b818110156113a557858101830151858201604001528201611389565b818111156113b7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461095557600080fd5b6000806040838503121561142057600080fd5b823561142b816113eb565b946020939093013593505050565b60006020828403121561144b57600080fd5b5035919050565b60008060006060848603121561146757600080fd5b8335611472816113eb565b92506020840135611482816113eb565b929592945050506040919091013590565b600080604083850312156114a657600080fd5b82356114b1816113eb565b915060208301356114c1816113eb565b809150509250929050565b6000602082840312156114de57600080fd5b8135610c96816113eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561152b5761152b6114e9565b500190565b600082821015611542576115426114e9565b500390565b60006020828403121561155957600080fd5b81518015158114610c9657600080fdfea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
 }
 
 // DelayedWETHABI is the input ABI used to generate the binding from.
@@ -808,6 +808,27 @@ func (_DelayedWETH *DelayedWETHTransactorSession) Withdraw0(_guy common.Address,
 	return _DelayedWETH.Contract.Withdraw0(&_DelayedWETH.TransactOpts, _guy, _wad)
 }
 
+// Fallback is a paid mutator transaction binding the contract fallback function.
+//
+// Solidity: fallback() payable returns()
+func (_DelayedWETH *DelayedWETHTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) {
+	return _DelayedWETH.contract.RawTransact(opts, calldata)
+}
+
+// Fallback is a paid mutator transaction binding the contract fallback function.
+//
+// Solidity: fallback() payable returns()
+func (_DelayedWETH *DelayedWETHSession) Fallback(calldata []byte) (*types.Transaction, error) {
+	return _DelayedWETH.Contract.Fallback(&_DelayedWETH.TransactOpts, calldata)
+}
+
+// Fallback is a paid mutator transaction binding the contract fallback function.
+//
+// Solidity: fallback() payable returns()
+func (_DelayedWETH *DelayedWETHTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) {
+	return _DelayedWETH.Contract.Fallback(&_DelayedWETH.TransactOpts, calldata)
+}
+
 // Receive is a paid mutator transaction binding the contract receive function.
 //
 // Solidity: receive() payable returns()
diff --git a/op-bindings/bindings/deployerwhitelist.go b/op-e2e/bindings/deployerwhitelist.go
similarity index 100%
rename from op-bindings/bindings/deployerwhitelist.go
rename to op-e2e/bindings/deployerwhitelist.go
diff --git a/op-bindings/bindings/deterministicdeploymentproxy.go b/op-e2e/bindings/deterministicdeploymentproxy.go
similarity index 100%
rename from op-bindings/bindings/deterministicdeploymentproxy.go
rename to op-e2e/bindings/deterministicdeploymentproxy.go
diff --git a/op-bindings/bindings/disputegamefactory.go b/op-e2e/bindings/disputegamefactory.go
similarity index 88%
rename from op-bindings/bindings/disputegamefactory.go
rename to op-e2e/bindings/disputegamefactory.go
index acf988458001..1bfb6a73da2b 100644
--- a/op-bindings/bindings/disputegamefactory.go
+++ b/op-e2e/bindings/disputegamefactory.go
@@ -39,8 +39,8 @@ type IDisputeGameFactoryGameSearchResult struct {
 
 // DisputeGameFactoryMetaData contains all meta data concerning the DisputeGameFactory contract.
 var DisputeGameFactoryMetaData = &bind.MetaData{
-	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"create\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"findLatestGames\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_n\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"games_\",\"type\":\"tuple[]\",\"internalType\":\"structIDisputeGameFactory.GameSearchResult[]\",\"components\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"metadata\",\"type\":\"bytes32\",\"internalType\":\"GameId\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"},{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameAtIndex\",\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"timestamp_\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"},{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameCount\",\"inputs\":[],\"outputs\":[{\"name\":\"gameCount_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameImpls\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"games\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"},{\"name\":\"timestamp_\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGameUUID\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"uuid_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initBonds\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setImplementation\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_impl\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setInitBond\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_initBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DisputeGameCreated\",\"inputs\":[{\"name\":\"disputeProxy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"},{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"Claim\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ImplementationSet\",\"inputs\":[{\"name\":\"impl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitBondUpdated\",\"inputs\":[{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"},{\"name\":\"newBond\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"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\":\"error\",\"name\":\"GameAlreadyExists\",\"inputs\":[{\"name\":\"uuid\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}]},{\"type\":\"error\",\"name\":\"InsufficientBond\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoImplementation\",\"inputs\":[{\"name\":\"gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"}]}]",
-	Bin: "0x60806040523480156200001157600080fd5b506200001e600062000024565b62000292565b600054610100900460ff1615808015620000455750600054600160ff909116105b8062000075575062000062306200016260201b62000cdc1760201c565b15801562000075575060005460ff166001145b620000de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000102576000805461ff0019166101001790555b6200010c62000171565b6200011782620001d9565b80156200015e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054610100900460ff16620001cd5760405162461bcd60e51b815260206004820152602b60248201526000805160206200180083398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b620001d76200022b565b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16620002875760405162461bcd60e51b815260206004820152602b60248201526000805160206200180083398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b620001d733620001d9565b61155e80620002a26000396000f3fe6080604052600436106100e85760003560e01c80636593dc6e1161008a57806396cd97201161005957806396cd972014610313578063bb8aa1fc14610333578063c4d66de814610394578063f2fde38b146103b457600080fd5b80636593dc6e14610293578063715018a6146102c057806382ecf2f6146102d55780638da5cb5b146102e857600080fd5b8063254bd683116100c6578063254bd6831461019c5780634d1975b4146101c957806354fd4d50146101e85780635f0150cb1461023e57600080fd5b806314f6b1a3146100ed5780631b685b9e1461010f5780631e3342401461017c575b600080fd5b3480156100f957600080fd5b5061010d610108366004611099565b6103d4565b005b34801561011b57600080fd5b5061015261012a3660046110d0565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061010d6101973660046110eb565b61045e565b3480156101a857600080fd5b506101bc6101b7366004611115565b6104aa565b60405161017391906111c2565b3480156101d557600080fd5b506068545b604051908152602001610173565b3480156101f457600080fd5b506102316040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610173919061127f565b34801561024a57600080fd5b5061025e610259366004611292565b6106ee565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff909116602083015201610173565b34801561029f57600080fd5b506101da6102ae3660046110d0565b60666020526000908152604090205481565b3480156102cc57600080fd5b5061010d610741565b6101526102e3366004611292565b610755565b3480156102f457600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610152565b34801561031f57600080fd5b506101da61032e366004611292565b6109ee565b34801561033f57600080fd5b5061035361034e366004611319565b610a27565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610173565b3480156103a057600080fd5b5061010d6103af366004611332565b610a89565b3480156103c057600080fd5b5061010d6103cf366004611332565b610c25565b6103dc610cf8565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610466610cf8565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806104bc575081155b6106e7575060408051600583901b8101602001909152825b8381116106e5576000606882815481106104f0576104f061134f565b600091825260209091200154905060e081901c67ffffffffffffffff60a083901c1673ffffffffffffffffffffffffffffffffffffffff831660ff808a16908416036106b6576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d091908101906113ad565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106439190611478565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a516106859190611491565b815181106106955761069561134f565b6020026020010181905250888851106106b3575050505050506106e5565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506104d49050565b505b9392505050565b60008060006106ff878787876109ee565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610749610cf8565b6107536000610d79565b565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107c5576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff8616600090815260666020526040902054341015610814576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610821600143611491565b4090506108898682878760405160200161083e94939291906114cf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff841690610df0565b92508273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108d357600080fd5b505af11580156108e7573d6000803e3d6000fd5b505050505060006108fa888888886109ee565b60008181526067602052604090205490915015610946576040517f014f6fe5000000000000000000000000000000000000000000000000000000008152600481018290526024016107bc565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610a0794939291906114f0565b604051602081830303815290604052805190602001209050949350505050565b6000806000610a7c60688581548110610a4257610a4261134f565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9196909550909350915050565b600054610100900460ff1615808015610aa95750600054600160ff909116105b80610ac35750303b158015610ac3575060005460ff166001145b610b4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bc565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bad57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bb5610f24565b610bbe82610d79565b8015610c2157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610c2d610cf8565b73ffffffffffffffffffffffffffffffffffffffff8116610cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bc565b610cd981610d79565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006002825101603f8101600a81036040518360581b8260e81b177f6100003d81600a3d39f3363d3d373d3d3d3d610000806035363936013d7300001781528660601b601e8201527f5af43d3d93803e603357fd5bf300000000000000000000000000000000000000603282015285519150603f8101602087015b60208410610ea857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09093019260209182019101610e6b565b517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602085900360031b1b16815260f085901b9083015282816000f0945084610f15577febfef1880000000000000000000000000000000000000000000000000000000060005260206000fd5b90910160405250909392505050565b600054610100900460ff16610fbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b610753600054610100900460ff16611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b61075333610d79565b803563ffffffff8116811461107257600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610cd957600080fd5b600080604083850312156110ac57600080fd5b6110b58361105e565b915060208301356110c581611077565b809150509250929050565b6000602082840312156110e257600080fd5b6106e78261105e565b600080604083850312156110fe57600080fd5b6111078361105e565b946020939093013593505050565b60008060006060848603121561112a57600080fd5b6111338461105e565b95602085013595506040909401359392505050565b60005b8381101561116357818101518382015260200161114b565b83811115611172576000848401525b50505050565b60008151808452611190816020860160208601611148565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611271578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a09185018290529061125d81860183611178565b9689019694505050908601906001016111e9565b509098975050505050505050565b6020815260006106e76020830184611178565b600080600080606085870312156112a857600080fd5b6112b18561105e565b935060208501359250604085013567ffffffffffffffff808211156112d557600080fd5b818701915087601f8301126112e957600080fd5b8135818111156112f857600080fd5b88602082850101111561130a57600080fd5b95989497505060200194505050565b60006020828403121561132b57600080fd5b5035919050565b60006020828403121561134457600080fd5b81356106e781611077565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113bf57600080fd5b815167ffffffffffffffff808211156113d757600080fd5b818401915084601f8301126113eb57600080fd5b8151818111156113fd576113fd61137e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156114435761144361137e565b8160405282815287602084870101111561145c57600080fd5b61146d836020830160208801611148565b979650505050505050565b60006020828403121561148a57600080fd5b5051919050565b6000828210156114ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b84815283602082015281836040830137600091016040019081529392505050565b63ffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"create\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"findLatestGames\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_n\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"games_\",\"type\":\"tuple[]\",\"internalType\":\"structIDisputeGameFactory.GameSearchResult[]\",\"components\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"metadata\",\"type\":\"bytes32\",\"internalType\":\"GameId\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"},{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameAtIndex\",\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"timestamp_\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"},{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameCount\",\"inputs\":[],\"outputs\":[{\"name\":\"gameCount_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameImpls\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"games\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"},{\"name\":\"timestamp_\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGameUUID\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"uuid_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initBonds\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setImplementation\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_impl\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setInitBond\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_initBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DisputeGameCreated\",\"inputs\":[{\"name\":\"disputeProxy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"},{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"Claim\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ImplementationSet\",\"inputs\":[{\"name\":\"impl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitBondUpdated\",\"inputs\":[{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"},{\"name\":\"newBond\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"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\":\"error\",\"name\":\"GameAlreadyExists\",\"inputs\":[{\"name\":\"uuid\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}]},{\"type\":\"error\",\"name\":\"IncorrectBondAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoImplementation\",\"inputs\":[{\"name\":\"gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"}]}]",
+	Bin: "0x60806040523480156200001157600080fd5b506200001e600062000024565b62000292565b600054610100900460ff1615808015620000455750600054600160ff909116105b8062000075575062000062306200016260201b62000cdd1760201c565b15801562000075575060005460ff166001145b620000de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000102576000805461ff0019166101001790555b6200010c62000171565b6200011782620001d9565b80156200015e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054610100900460ff16620001cd5760405162461bcd60e51b815260206004820152602b60248201526000805160206200185283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b620001d76200022b565b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16620002875760405162461bcd60e51b815260206004820152602b60248201526000805160206200185283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b620001d733620001d9565b6115b080620002a26000396000f3fe6080604052600436106100e85760003560e01c80636593dc6e1161008a57806396cd97201161005957806396cd972014610313578063bb8aa1fc14610333578063c4d66de814610394578063f2fde38b146103b457600080fd5b80636593dc6e14610293578063715018a6146102c057806382ecf2f6146102d55780638da5cb5b146102e857600080fd5b8063254bd683116100c6578063254bd6831461019c5780634d1975b4146101c957806354fd4d50146101e85780635f0150cb1461023e57600080fd5b806314f6b1a3146100ed5780631b685b9e1461010f5780631e3342401461017c575b600080fd5b3480156100f957600080fd5b5061010d6101083660046110bf565b6103d4565b005b34801561011b57600080fd5b5061015261012a3660046110f6565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061010d610197366004611111565b61045e565b3480156101a857600080fd5b506101bc6101b736600461113b565b6104aa565b60405161017391906111e8565b3480156101d557600080fd5b506068545b604051908152602001610173565b3480156101f457600080fd5b506102316040518060400160405280600581526020017f302e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161017391906112a5565b34801561024a57600080fd5b5061025e6102593660046112b8565b6106ee565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff909116602083015201610173565b34801561029f57600080fd5b506101da6102ae3660046110f6565b60666020526000908152604090205481565b3480156102cc57600080fd5b5061010d610741565b6101526102e33660046112b8565b610755565b3480156102f457600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610152565b34801561031f57600080fd5b506101da61032e3660046112b8565b6109ef565b34801561033f57600080fd5b5061035361034e36600461133f565b610a28565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610173565b3480156103a057600080fd5b5061010d6103af366004611358565b610a8a565b3480156103c057600080fd5b5061010d6103cf366004611358565b610c26565b6103dc610cf9565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610466610cf9565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806104bc575081155b6106e7575060408051600583901b8101602001909152825b8381116106e5576000606882815481106104f0576104f0611375565b600091825260209091200154905060e081901c60a082901c67ffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff831663ffffffff891683036106b6576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d091908101906113d3565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610643919061149e565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a5161068591906114b7565b8151811061069557610695611375565b6020026020010181905250888851106106b3575050505050506106e5565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506104d49050565b505b9392505050565b60008060006106ff878787876109ef565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610749610cf9565b6107536000610d7a565b565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107c5576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff86166000908152606660205260409020543414610813576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108206001436114b7565b40905061088a338783888860405160200161083f9594939291906114f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff841690610df1565b92508273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108d457600080fd5b505af11580156108e8573d6000803e3d6000fd5b505050505060006108fb888888886109ef565b60008181526067602052604090205490915015610947576040517f014f6fe5000000000000000000000000000000000000000000000000000000008152600481018290526024016107bc565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610a089493929190611542565b604051602081830303815290604052805190602001209050949350505050565b6000806000610a7d60688581548110610a4357610a43611375565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9196909550909350915050565b600054610100900460ff1615808015610aaa5750600054600160ff909116105b80610ac45750303b158015610ac4575060005460ff166001145b610b50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bc565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bae57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bb6610dff565b610bbf82610d7a565b8015610c2257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610c2e610cf9565b73ffffffffffffffffffffffffffffffffffffffff8116610cd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bc565b610cda81610d7a565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006106e760008484610e9e565b600054610100900460ff16610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b610753610fe4565b600060608203516040830351602084035184518060208701018051600283016c5af43d3d93803e606057fd5bf3895289600d8a035278593da1005b363d3d373d3d3d3d610000806062363936013d738160481b1760218a03527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff603a8a035272fd6100003d81600a3d39f336602c57343d527f6062820160781b1761ff9e82106059018a03528060f01b8352606c8101604c8a038cf097505086610f6a5763301164256000526004601cfd5b905285527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09092019190915292915050565b600054610100900460ff1661107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b61075333610d7a565b803563ffffffff8116811461109857600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610cda57600080fd5b600080604083850312156110d257600080fd5b6110db83611084565b915060208301356110eb8161109d565b809150509250929050565b60006020828403121561110857600080fd5b6106e782611084565b6000806040838503121561112457600080fd5b61112d83611084565b946020939093013593505050565b60008060006060848603121561115057600080fd5b61115984611084565b95602085013595506040909401359392505050565b60005b83811015611189578181015183820152602001611171565b83811115611198576000848401525b50505050565b600081518084526111b681602086016020860161116e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611297578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a0918501829052906112838186018361119e565b96890196945050509086019060010161120f565b509098975050505050505050565b6020815260006106e7602083018461119e565b600080600080606085870312156112ce57600080fd5b6112d785611084565b935060208501359250604085013567ffffffffffffffff808211156112fb57600080fd5b818701915087601f83011261130f57600080fd5b81358181111561131e57600080fd5b88602082850101111561133057600080fd5b95989497505060200194505050565b60006020828403121561135157600080fd5b5035919050565b60006020828403121561136a57600080fd5b81356106e78161109d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113e557600080fd5b815167ffffffffffffffff808211156113fd57600080fd5b818401915084601f83011261141157600080fd5b815181811115611423576114236113a4565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611469576114696113a4565b8160405282815287602084870101111561148257600080fd5b61149383602083016020880161116e565b979650505050505050565b6000602082840312156114b057600080fd5b5051919050565b6000828210156114f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1681528460148201528360348201528183605483013760009101605401908152949350505050565b63ffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
 }
 
 // DisputeGameFactoryABI is the input ABI used to generate the binding from.
diff --git a/op-bindings/bindings/eas.go b/op-e2e/bindings/eas.go
similarity index 100%
rename from op-bindings/bindings/eas.go
rename to op-e2e/bindings/eas.go
diff --git a/op-bindings/bindings/entrypoint.go b/op-e2e/bindings/entrypoint.go
similarity index 100%
rename from op-bindings/bindings/entrypoint.go
rename to op-e2e/bindings/entrypoint.go
diff --git a/op-bindings/bindings/erc20.go b/op-e2e/bindings/erc20.go
similarity index 61%
rename from op-bindings/bindings/erc20.go
rename to op-e2e/bindings/erc20.go
index e2ca076125b7..8cf32f869c3c 100644
--- a/op-bindings/bindings/erc20.go
+++ b/op-e2e/bindings/erc20.go
@@ -30,35 +30,13 @@ var (
 
 // ERC20MetaData contains all meta data concerning the ERC20 contract.
 var ERC20MetaData = &bind.MetaData{
-	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"name_\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"symbol_\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
-	Bin: "0x60806040523480156200001157600080fd5b5060405162000e3c38038062000e3c833981016040819052620000349162000127565b600362000042838262000220565b50600462000051828262000220565b505050620002ec565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200008257600080fd5b81516001600160401b03808211156200009f576200009f6200005a565b604051601f8301601f19908116603f01168101908282118183101715620000ca57620000ca6200005a565b81604052838152602092508683858801011115620000e757600080fd5b600091505b838210156200010b5785820183015181830184015290820190620000ec565b838211156200011d5760008385830101525b9695505050505050565b600080604083850312156200013b57600080fd5b82516001600160401b03808211156200015357600080fd5b620001618683870162000070565b935060208501519150808211156200017857600080fd5b50620001878582860162000070565b9150509250929050565b600181811c90821680620001a657607f821691505b602082108103620001c757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200021b57600081815260208120601f850160051c81016020861015620001f65750805b601f850160051c820191505b81811015620002175782815560010162000202565b5050505b505050565b81516001600160401b038111156200023c576200023c6200005a565b62000254816200024d845462000191565b84620001cd565b602080601f8311600181146200028c5760008415620002735750858301515b600019600386901b1c1916600185901b17855562000217565b600085815260208120601f198616915b82811015620002bd578886015182559484019460019091019084016200029c565b5085821015620002dc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610b4080620002fc6000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80633950935111610081578063a457c2d71161005b578063a457c2d714610194578063a9059cbb146101a7578063dd62ed3e146101ba57600080fd5b8063395093511461014357806370a082311461015657806395d89b411461018c57600080fd5b806318160ddd116100b257806318160ddd1461010f57806323b872dd14610121578063313ce5671461013457600080fd5b806306fdde03146100ce578063095ea7b3146100ec575b600080fd5b6100d6610200565b6040516100e3919061094a565b60405180910390f35b6100ff6100fa3660046109e6565b610292565b60405190151581526020016100e3565b6002545b6040519081526020016100e3565b6100ff61012f366004610a10565b6102aa565b604051601281526020016100e3565b6100ff6101513660046109e6565b6102ce565b610113610164366004610a4c565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100d661031a565b6100ff6101a23660046109e6565b610329565b6100ff6101b53660046109e6565b6103ff565b6101136101c8366004610a6e565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461020f90610aa1565b80601f016020809104026020016040519081016040528092919081815260200182805461023b90610aa1565b80156102885780601f1061025d57610100808354040283529160200191610288565b820191906000526020600020905b81548152906001019060200180831161026b57829003601f168201915b5050505050905090565b6000336102a081858561040d565b5060019392505050565b6000336102b88582856105c0565b6102c3858585610697565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906102a09082908690610315908790610af4565b61040d565b60606004805461020f90610aa1565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156103f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102c3828686840361040d565b6000336102a0818585610697565b73ffffffffffffffffffffffffffffffffffffffff83166104af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff8216610552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106915781811015610684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103e9565b610691848484840361040d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff831661073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff82166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152602081905260408082208585039055918516815290812080548492906108d7908490610af4565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161093d91815260200190565b60405180910390a3610691565b600060208083528351808285015260005b818110156109775785810183015185820160400152820161095b565b81811115610989576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146109e157600080fd5b919050565b600080604083850312156109f957600080fd5b610a02836109bd565b946020939093013593505050565b600080600060608486031215610a2557600080fd5b610a2e846109bd565b9250610a3c602085016109bd565b9150604084013590509250925092565b600060208284031215610a5e57600080fd5b610a67826109bd565b9392505050565b60008060408385031215610a8157600080fd5b610a8a836109bd565b9150610a98602084016109bd565b90509250929050565b600181811c90821680610ab557607f821691505b602082108103610aee577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115610b2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080f000a",
+	ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
 }
 
 // ERC20ABI is the input ABI used to generate the binding from.
 // Deprecated: Use ERC20MetaData.ABI instead.
 var ERC20ABI = ERC20MetaData.ABI
 
-// ERC20Bin is the compiled bytecode used for deploying new contracts.
-// Deprecated: Use ERC20MetaData.Bin instead.
-var ERC20Bin = ERC20MetaData.Bin
-
-// DeployERC20 deploys a new Ethereum contract, binding an instance of ERC20 to it.
-func DeployERC20(auth *bind.TransactOpts, backend bind.ContractBackend, name_ string, symbol_ string) (common.Address, *types.Transaction, *ERC20, error) {
-	parsed, err := ERC20MetaData.GetAbi()
-	if err != nil {
-		return common.Address{}, nil, nil, err
-	}
-	if parsed == nil {
-		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
-	}
-
-	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ERC20Bin), backend, name_, symbol_)
-	if err != nil {
-		return common.Address{}, nil, nil, err
-	}
-	return address, tx, &ERC20{ERC20Caller: ERC20Caller{contract: contract}, ERC20Transactor: ERC20Transactor{contract: contract}, ERC20Filterer: ERC20Filterer{contract: contract}}, nil
-}
-
 // ERC20 is an auto generated Go binding around an Ethereum contract.
 type ERC20 struct {
 	ERC20Caller     // Read-only binding to the contract
@@ -201,12 +179,43 @@ func (_ERC20 *ERC20TransactorRaw) Transact(opts *bind.TransactOpts, method strin
 	return _ERC20.Contract.contract.Transact(opts, method, params...)
 }
 
+// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
+//
+// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32)
+func (_ERC20 *ERC20Caller) DOMAINSEPARATOR(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _ERC20.contract.Call(opts, &out, "DOMAIN_SEPARATOR")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
+//
+// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32)
+func (_ERC20 *ERC20Session) DOMAINSEPARATOR() ([32]byte, error) {
+	return _ERC20.Contract.DOMAINSEPARATOR(&_ERC20.CallOpts)
+}
+
+// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
+//
+// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32)
+func (_ERC20 *ERC20CallerSession) DOMAINSEPARATOR() ([32]byte, error) {
+	return _ERC20.Contract.DOMAINSEPARATOR(&_ERC20.CallOpts)
+}
+
 // Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
 //
-// Solidity: function allowance(address owner, address spender) view returns(uint256)
-func (_ERC20 *ERC20Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) {
+// Solidity: function allowance(address , address ) view returns(uint256)
+func (_ERC20 *ERC20Caller) Allowance(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (*big.Int, error) {
 	var out []interface{}
-	err := _ERC20.contract.Call(opts, &out, "allowance", owner, spender)
+	err := _ERC20.contract.Call(opts, &out, "allowance", arg0, arg1)
 
 	if err != nil {
 		return *new(*big.Int), err
@@ -220,24 +229,24 @@ func (_ERC20 *ERC20Caller) Allowance(opts *bind.CallOpts, owner common.Address,
 
 // Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
 //
-// Solidity: function allowance(address owner, address spender) view returns(uint256)
-func (_ERC20 *ERC20Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
-	return _ERC20.Contract.Allowance(&_ERC20.CallOpts, owner, spender)
+// Solidity: function allowance(address , address ) view returns(uint256)
+func (_ERC20 *ERC20Session) Allowance(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.Allowance(&_ERC20.CallOpts, arg0, arg1)
 }
 
 // Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
 //
-// Solidity: function allowance(address owner, address spender) view returns(uint256)
-func (_ERC20 *ERC20CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
-	return _ERC20.Contract.Allowance(&_ERC20.CallOpts, owner, spender)
+// Solidity: function allowance(address , address ) view returns(uint256)
+func (_ERC20 *ERC20CallerSession) Allowance(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.Allowance(&_ERC20.CallOpts, arg0, arg1)
 }
 
 // BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
 //
-// Solidity: function balanceOf(address account) view returns(uint256)
-func (_ERC20 *ERC20Caller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error) {
+// Solidity: function balanceOf(address ) view returns(uint256)
+func (_ERC20 *ERC20Caller) BalanceOf(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
 	var out []interface{}
-	err := _ERC20.contract.Call(opts, &out, "balanceOf", account)
+	err := _ERC20.contract.Call(opts, &out, "balanceOf", arg0)
 
 	if err != nil {
 		return *new(*big.Int), err
@@ -251,16 +260,16 @@ func (_ERC20 *ERC20Caller) BalanceOf(opts *bind.CallOpts, account common.Address
 
 // BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
 //
-// Solidity: function balanceOf(address account) view returns(uint256)
-func (_ERC20 *ERC20Session) BalanceOf(account common.Address) (*big.Int, error) {
-	return _ERC20.Contract.BalanceOf(&_ERC20.CallOpts, account)
+// Solidity: function balanceOf(address ) view returns(uint256)
+func (_ERC20 *ERC20Session) BalanceOf(arg0 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.BalanceOf(&_ERC20.CallOpts, arg0)
 }
 
 // BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
 //
-// Solidity: function balanceOf(address account) view returns(uint256)
-func (_ERC20 *ERC20CallerSession) BalanceOf(account common.Address) (*big.Int, error) {
-	return _ERC20.Contract.BalanceOf(&_ERC20.CallOpts, account)
+// Solidity: function balanceOf(address ) view returns(uint256)
+func (_ERC20 *ERC20CallerSession) BalanceOf(arg0 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.BalanceOf(&_ERC20.CallOpts, arg0)
 }
 
 // Decimals is a free data retrieval call binding the contract method 0x313ce567.
@@ -325,6 +334,37 @@ func (_ERC20 *ERC20CallerSession) Name() (string, error) {
 	return _ERC20.Contract.Name(&_ERC20.CallOpts)
 }
 
+// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
+//
+// Solidity: function nonces(address ) view returns(uint256)
+func (_ERC20 *ERC20Caller) Nonces(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _ERC20.contract.Call(opts, &out, "nonces", arg0)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
+//
+// Solidity: function nonces(address ) view returns(uint256)
+func (_ERC20 *ERC20Session) Nonces(arg0 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.Nonces(&_ERC20.CallOpts, arg0)
+}
+
+// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
+//
+// Solidity: function nonces(address ) view returns(uint256)
+func (_ERC20 *ERC20CallerSession) Nonces(arg0 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.Nonces(&_ERC20.CallOpts, arg0)
+}
+
 // Symbol is a free data retrieval call binding the contract method 0x95d89b41.
 //
 // Solidity: function symbol() view returns(string)
@@ -408,46 +448,25 @@ func (_ERC20 *ERC20TransactorSession) Approve(spender common.Address, amount *bi
 	return _ERC20.Contract.Approve(&_ERC20.TransactOpts, spender, amount)
 }
 
-// DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7.
-//
-// Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool)
-func (_ERC20 *ERC20Transactor) DecreaseAllowance(opts *bind.TransactOpts, spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) {
-	return _ERC20.contract.Transact(opts, "decreaseAllowance", spender, subtractedValue)
-}
-
-// DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7.
-//
-// Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool)
-func (_ERC20 *ERC20Session) DecreaseAllowance(spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) {
-	return _ERC20.Contract.DecreaseAllowance(&_ERC20.TransactOpts, spender, subtractedValue)
-}
-
-// DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7.
-//
-// Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool)
-func (_ERC20 *ERC20TransactorSession) DecreaseAllowance(spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) {
-	return _ERC20.Contract.DecreaseAllowance(&_ERC20.TransactOpts, spender, subtractedValue)
-}
-
-// IncreaseAllowance is a paid mutator transaction binding the contract method 0x39509351.
+// Permit is a paid mutator transaction binding the contract method 0xd505accf.
 //
-// Solidity: function increaseAllowance(address spender, uint256 addedValue) returns(bool)
-func (_ERC20 *ERC20Transactor) IncreaseAllowance(opts *bind.TransactOpts, spender common.Address, addedValue *big.Int) (*types.Transaction, error) {
-	return _ERC20.contract.Transact(opts, "increaseAllowance", spender, addedValue)
+// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
+func (_ERC20 *ERC20Transactor) Permit(opts *bind.TransactOpts, owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
+	return _ERC20.contract.Transact(opts, "permit", owner, spender, value, deadline, v, r, s)
 }
 
-// IncreaseAllowance is a paid mutator transaction binding the contract method 0x39509351.
+// Permit is a paid mutator transaction binding the contract method 0xd505accf.
 //
-// Solidity: function increaseAllowance(address spender, uint256 addedValue) returns(bool)
-func (_ERC20 *ERC20Session) IncreaseAllowance(spender common.Address, addedValue *big.Int) (*types.Transaction, error) {
-	return _ERC20.Contract.IncreaseAllowance(&_ERC20.TransactOpts, spender, addedValue)
+// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
+func (_ERC20 *ERC20Session) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
+	return _ERC20.Contract.Permit(&_ERC20.TransactOpts, owner, spender, value, deadline, v, r, s)
 }
 
-// IncreaseAllowance is a paid mutator transaction binding the contract method 0x39509351.
+// Permit is a paid mutator transaction binding the contract method 0xd505accf.
 //
-// Solidity: function increaseAllowance(address spender, uint256 addedValue) returns(bool)
-func (_ERC20 *ERC20TransactorSession) IncreaseAllowance(spender common.Address, addedValue *big.Int) (*types.Transaction, error) {
-	return _ERC20.Contract.IncreaseAllowance(&_ERC20.TransactOpts, spender, addedValue)
+// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
+func (_ERC20 *ERC20TransactorSession) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
+	return _ERC20.Contract.Permit(&_ERC20.TransactOpts, owner, spender, value, deadline, v, r, s)
 }
 
 // Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
@@ -563,13 +582,13 @@ func (it *ERC20ApprovalIterator) Close() error {
 type ERC20Approval struct {
 	Owner   common.Address
 	Spender common.Address
-	Value   *big.Int
+	Amount  *big.Int
 	Raw     types.Log // Blockchain specific contextual infos
 }
 
 // FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
 //
-// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value)
+// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
 func (_ERC20 *ERC20Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*ERC20ApprovalIterator, error) {
 
 	var ownerRule []interface{}
@@ -590,7 +609,7 @@ func (_ERC20 *ERC20Filterer) FilterApproval(opts *bind.FilterOpts, owner []commo
 
 // WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
 //
-// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value)
+// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
 func (_ERC20 *ERC20Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *ERC20Approval, owner []common.Address, spender []common.Address) (event.Subscription, error) {
 
 	var ownerRule []interface{}
@@ -636,7 +655,7 @@ func (_ERC20 *ERC20Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *ER
 
 // ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
 //
-// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value)
+// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
 func (_ERC20 *ERC20Filterer) ParseApproval(log types.Log) (*ERC20Approval, error) {
 	event := new(ERC20Approval)
 	if err := _ERC20.contract.UnpackLog(event, "Approval", log); err != nil {
@@ -715,15 +734,15 @@ func (it *ERC20TransferIterator) Close() error {
 
 // ERC20Transfer represents a Transfer event raised by the ERC20 contract.
 type ERC20Transfer struct {
-	From  common.Address
-	To    common.Address
-	Value *big.Int
-	Raw   types.Log // Blockchain specific contextual infos
+	From   common.Address
+	To     common.Address
+	Amount *big.Int
+	Raw    types.Log // Blockchain specific contextual infos
 }
 
 // FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
 //
-// Solidity: event Transfer(address indexed from, address indexed to, uint256 value)
+// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
 func (_ERC20 *ERC20Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ERC20TransferIterator, error) {
 
 	var fromRule []interface{}
@@ -744,7 +763,7 @@ func (_ERC20 *ERC20Filterer) FilterTransfer(opts *bind.FilterOpts, from []common
 
 // WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
 //
-// Solidity: event Transfer(address indexed from, address indexed to, uint256 value)
+// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
 func (_ERC20 *ERC20Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ERC20Transfer, from []common.Address, to []common.Address) (event.Subscription, error) {
 
 	var fromRule []interface{}
@@ -790,7 +809,7 @@ func (_ERC20 *ERC20Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ER
 
 // ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
 //
-// Solidity: event Transfer(address indexed from, address indexed to, uint256 value)
+// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
 func (_ERC20 *ERC20Filterer) ParseTransfer(log types.Log) (*ERC20Transfer, error) {
 	event := new(ERC20Transfer)
 	if err := _ERC20.contract.UnpackLog(event, "Transfer", log); err != nil {
diff --git a/op-e2e/bindings/faultdisputegame.go b/op-e2e/bindings/faultdisputegame.go
new file mode 100644
index 000000000000..d43287d3da6a
--- /dev/null
+++ b/op-e2e/bindings/faultdisputegame.go
@@ -0,0 +1,1877 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// FaultDisputeGameMetaData contains all meta data concerning the FaultDisputeGame contract.
+var FaultDisputeGameMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint32\"},{\"internalType\":\"Claim\",\"name\":\"_absolutePrestate\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_maxGameDepth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_splitDepth\",\"type\":\"uint256\"},{\"internalType\":\"Duration\",\"name\":\"_clockExtension\",\"type\":\"uint64\"},{\"internalType\":\"Duration\",\"name\":\"_maxClockDuration\",\"type\":\"uint64\"},{\"internalType\":\"contractIBigStepper\",\"name\":\"_vm\",\"type\":\"address\"},{\"internalType\":\"contractIDelayedWETH\",\"name\":\"_weth\",\"type\":\"address\"},{\"internalType\":\"contractIAnchorStateRegistry\",\"name\":\"_anchorStateRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_l2ChainId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"absolutePrestate\",\"outputs\":[{\"internalType\":\"Claim\",\"name\":\"absolutePrestate_\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ident\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_execLeafIdx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_partOffset\",\"type\":\"uint256\"}],\"name\":\"addLocalData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"anchorStateRegistry\",\"outputs\":[{\"internalType\":\"contractIAnchorStateRegistry\",\"name\":\"registry_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Claim\",\"name\":\"_disputed\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_parentIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"}],\"name\":\"attack\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structTypes.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_headerRLP\",\"type\":\"bytes\"}],\"name\":\"challengeRootL2Block\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"}],\"name\":\"claimCredit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claimData\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"parentIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"counteredBy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"bond\",\"type\":\"uint128\"},{\"internalType\":\"Claim\",\"name\":\"claim\",\"type\":\"bytes32\"},{\"internalType\":\"Position\",\"name\":\"position\",\"type\":\"uint128\"},{\"internalType\":\"Clock\",\"name\":\"clock\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimDataLen\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"len_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Hash\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"claims\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clockExtension\",\"outputs\":[{\"internalType\":\"Duration\",\"name\":\"clockExtension_\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createdAt\",\"outputs\":[{\"internalType\":\"Timestamp\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"credit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Claim\",\"name\":\"_disputed\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_parentIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"}],\"name\":\"defend\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"extraData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"extraData_\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameCreator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"creator_\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameData\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType_\",\"type\":\"uint32\"},{\"internalType\":\"Claim\",\"name\":\"rootClaim_\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"extraData_\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameType\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType_\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"}],\"name\":\"getChallengerDuration\",\"outputs\":[{\"internalType\":\"Duration\",\"name\":\"duration_\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"}],\"name\":\"getNumToResolve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"numRemainingChildren_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Position\",\"name\":\"_position\",\"type\":\"uint128\"}],\"name\":\"getRequiredBond\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requiredBond_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1Head\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"l1Head_\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"l2BlockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BlockNumberChallenged\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BlockNumberChallenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2ChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"l2ChainId_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxClockDuration\",\"outputs\":[{\"internalType\":\"Duration\",\"name\":\"maxClockDuration_\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxGameDepth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"maxGameDepth_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Claim\",\"name\":\"_disputed\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_challengeIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_isAttack\",\"type\":\"bool\"}],\"name\":\"move\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"resolutionCheckpoints\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"initialCheckpointComplete\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"subgameIndex\",\"type\":\"uint32\"},{\"internalType\":\"Position\",\"name\":\"leftmostPosition\",\"type\":\"uint128\"},{\"internalType\":\"address\",\"name\":\"counteredBy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"enumGameStatus\",\"name\":\"status_\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_numToResolve\",\"type\":\"uint256\"}],\"name\":\"resolveClaim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resolvedAt\",\"outputs\":[{\"internalType\":\"Timestamp\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"resolvedSubgames\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rootClaim\",\"outputs\":[{\"internalType\":\"Claim\",\"name\":\"rootClaim_\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"splitDepth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"splitDepth_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startingBlockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingOutputRoot\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"root\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingRootHash\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"startingRootHash_\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"status\",\"outputs\":[{\"internalType\":\"enumGameStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_isAttack\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_stateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"}],\"name\":\"step\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"subgames\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vm\",\"outputs\":[{\"internalType\":\"contractIBigStepper\",\"name\":\"vm_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weth\",\"outputs\":[{\"internalType\":\"contractIDelayedWETH\",\"name\":\"weth_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"parentIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"Claim\",\"name\":\"claim\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"}],\"name\":\"Move\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enumGameStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"Resolved\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AnchorRootNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMatches\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotDefendRootClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAboveSplit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAlreadyResolved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClockNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClockTimeExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContentLengthMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateStep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyItem\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameDepthExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameNotInProgress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectBondAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClockExtension\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDataRemainder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDisputedClaimIndex\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeader\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidLocalIdent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidOutputRootProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidParent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPrestate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSplitDepth\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2BlockNumberChallenged\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxDepthTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCreditToClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfOrderResolution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedList\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"Claim\",\"name\":\"rootClaim\",\"type\":\"bytes32\"}],\"name\":\"UnexpectedRootClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedString\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValidStep\",\"type\":\"error\"}]",
+}
+
+// FaultDisputeGameABI is the input ABI used to generate the binding from.
+// Deprecated: Use FaultDisputeGameMetaData.ABI instead.
+var FaultDisputeGameABI = FaultDisputeGameMetaData.ABI
+
+// FaultDisputeGame is an auto generated Go binding around an Ethereum contract.
+type FaultDisputeGame struct {
+	FaultDisputeGameCaller     // Read-only binding to the contract
+	FaultDisputeGameTransactor // Write-only binding to the contract
+	FaultDisputeGameFilterer   // Log filterer for contract events
+}
+
+// FaultDisputeGameCaller is an auto generated read-only Go binding around an Ethereum contract.
+type FaultDisputeGameCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// FaultDisputeGameTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type FaultDisputeGameTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// FaultDisputeGameFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type FaultDisputeGameFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// FaultDisputeGameSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type FaultDisputeGameSession struct {
+	Contract     *FaultDisputeGame // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// FaultDisputeGameCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type FaultDisputeGameCallerSession struct {
+	Contract *FaultDisputeGameCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts           // Call options to use throughout this session
+}
+
+// FaultDisputeGameTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type FaultDisputeGameTransactorSession struct {
+	Contract     *FaultDisputeGameTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
+}
+
+// FaultDisputeGameRaw is an auto generated low-level Go binding around an Ethereum contract.
+type FaultDisputeGameRaw struct {
+	Contract *FaultDisputeGame // Generic contract binding to access the raw methods on
+}
+
+// FaultDisputeGameCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type FaultDisputeGameCallerRaw struct {
+	Contract *FaultDisputeGameCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// FaultDisputeGameTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type FaultDisputeGameTransactorRaw struct {
+	Contract *FaultDisputeGameTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewFaultDisputeGame creates a new instance of FaultDisputeGame, bound to a specific deployed contract.
+func NewFaultDisputeGame(address common.Address, backend bind.ContractBackend) (*FaultDisputeGame, error) {
+	contract, err := bindFaultDisputeGame(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGame{FaultDisputeGameCaller: FaultDisputeGameCaller{contract: contract}, FaultDisputeGameTransactor: FaultDisputeGameTransactor{contract: contract}, FaultDisputeGameFilterer: FaultDisputeGameFilterer{contract: contract}}, nil
+}
+
+// NewFaultDisputeGameCaller creates a new read-only instance of FaultDisputeGame, bound to a specific deployed contract.
+func NewFaultDisputeGameCaller(address common.Address, caller bind.ContractCaller) (*FaultDisputeGameCaller, error) {
+	contract, err := bindFaultDisputeGame(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGameCaller{contract: contract}, nil
+}
+
+// NewFaultDisputeGameTransactor creates a new write-only instance of FaultDisputeGame, bound to a specific deployed contract.
+func NewFaultDisputeGameTransactor(address common.Address, transactor bind.ContractTransactor) (*FaultDisputeGameTransactor, error) {
+	contract, err := bindFaultDisputeGame(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGameTransactor{contract: contract}, nil
+}
+
+// NewFaultDisputeGameFilterer creates a new log filterer instance of FaultDisputeGame, bound to a specific deployed contract.
+func NewFaultDisputeGameFilterer(address common.Address, filterer bind.ContractFilterer) (*FaultDisputeGameFilterer, error) {
+	contract, err := bindFaultDisputeGame(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGameFilterer{contract: contract}, nil
+}
+
+// bindFaultDisputeGame binds a generic wrapper to an already deployed contract.
+func bindFaultDisputeGame(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(FaultDisputeGameABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_FaultDisputeGame *FaultDisputeGameRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _FaultDisputeGame.Contract.FaultDisputeGameCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_FaultDisputeGame *FaultDisputeGameRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.FaultDisputeGameTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_FaultDisputeGame *FaultDisputeGameRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.FaultDisputeGameTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_FaultDisputeGame *FaultDisputeGameCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _FaultDisputeGame.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_FaultDisputeGame *FaultDisputeGameTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_FaultDisputeGame *FaultDisputeGameTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.contract.Transact(opts, method, params...)
+}
+
+// AbsolutePrestate is a free data retrieval call binding the contract method 0x8d450a95.
+//
+// Solidity: function absolutePrestate() view returns(bytes32 absolutePrestate_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) AbsolutePrestate(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "absolutePrestate")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// AbsolutePrestate is a free data retrieval call binding the contract method 0x8d450a95.
+//
+// Solidity: function absolutePrestate() view returns(bytes32 absolutePrestate_)
+func (_FaultDisputeGame *FaultDisputeGameSession) AbsolutePrestate() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.AbsolutePrestate(&_FaultDisputeGame.CallOpts)
+}
+
+// AbsolutePrestate is a free data retrieval call binding the contract method 0x8d450a95.
+//
+// Solidity: function absolutePrestate() view returns(bytes32 absolutePrestate_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) AbsolutePrestate() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.AbsolutePrestate(&_FaultDisputeGame.CallOpts)
+}
+
+// AnchorStateRegistry is a free data retrieval call binding the contract method 0x5c0cba33.
+//
+// Solidity: function anchorStateRegistry() view returns(address registry_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) AnchorStateRegistry(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "anchorStateRegistry")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// AnchorStateRegistry is a free data retrieval call binding the contract method 0x5c0cba33.
+//
+// Solidity: function anchorStateRegistry() view returns(address registry_)
+func (_FaultDisputeGame *FaultDisputeGameSession) AnchorStateRegistry() (common.Address, error) {
+	return _FaultDisputeGame.Contract.AnchorStateRegistry(&_FaultDisputeGame.CallOpts)
+}
+
+// AnchorStateRegistry is a free data retrieval call binding the contract method 0x5c0cba33.
+//
+// Solidity: function anchorStateRegistry() view returns(address registry_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) AnchorStateRegistry() (common.Address, error) {
+	return _FaultDisputeGame.Contract.AnchorStateRegistry(&_FaultDisputeGame.CallOpts)
+}
+
+// ClaimData is a free data retrieval call binding the contract method 0xc6f0308c.
+//
+// Solidity: function claimData(uint256 ) view returns(uint32 parentIndex, address counteredBy, address claimant, uint128 bond, bytes32 claim, uint128 position, uint128 clock)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ClaimData(opts *bind.CallOpts, arg0 *big.Int) (struct {
+	ParentIndex uint32
+	CounteredBy common.Address
+	Claimant    common.Address
+	Bond        *big.Int
+	Claim       [32]byte
+	Position    *big.Int
+	Clock       *big.Int
+}, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "claimData", arg0)
+
+	outstruct := new(struct {
+		ParentIndex uint32
+		CounteredBy common.Address
+		Claimant    common.Address
+		Bond        *big.Int
+		Claim       [32]byte
+		Position    *big.Int
+		Clock       *big.Int
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.ParentIndex = *abi.ConvertType(out[0], new(uint32)).(*uint32)
+	outstruct.CounteredBy = *abi.ConvertType(out[1], new(common.Address)).(*common.Address)
+	outstruct.Claimant = *abi.ConvertType(out[2], new(common.Address)).(*common.Address)
+	outstruct.Bond = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int)
+	outstruct.Claim = *abi.ConvertType(out[4], new([32]byte)).(*[32]byte)
+	outstruct.Position = *abi.ConvertType(out[5], new(*big.Int)).(**big.Int)
+	outstruct.Clock = *abi.ConvertType(out[6], new(*big.Int)).(**big.Int)
+
+	return *outstruct, err
+
+}
+
+// ClaimData is a free data retrieval call binding the contract method 0xc6f0308c.
+//
+// Solidity: function claimData(uint256 ) view returns(uint32 parentIndex, address counteredBy, address claimant, uint128 bond, bytes32 claim, uint128 position, uint128 clock)
+func (_FaultDisputeGame *FaultDisputeGameSession) ClaimData(arg0 *big.Int) (struct {
+	ParentIndex uint32
+	CounteredBy common.Address
+	Claimant    common.Address
+	Bond        *big.Int
+	Claim       [32]byte
+	Position    *big.Int
+	Clock       *big.Int
+}, error) {
+	return _FaultDisputeGame.Contract.ClaimData(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ClaimData is a free data retrieval call binding the contract method 0xc6f0308c.
+//
+// Solidity: function claimData(uint256 ) view returns(uint32 parentIndex, address counteredBy, address claimant, uint128 bond, bytes32 claim, uint128 position, uint128 clock)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ClaimData(arg0 *big.Int) (struct {
+	ParentIndex uint32
+	CounteredBy common.Address
+	Claimant    common.Address
+	Bond        *big.Int
+	Claim       [32]byte
+	Position    *big.Int
+	Clock       *big.Int
+}, error) {
+	return _FaultDisputeGame.Contract.ClaimData(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ClaimDataLen is a free data retrieval call binding the contract method 0x8980e0cc.
+//
+// Solidity: function claimDataLen() view returns(uint256 len_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ClaimDataLen(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "claimDataLen")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// ClaimDataLen is a free data retrieval call binding the contract method 0x8980e0cc.
+//
+// Solidity: function claimDataLen() view returns(uint256 len_)
+func (_FaultDisputeGame *FaultDisputeGameSession) ClaimDataLen() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.ClaimDataLen(&_FaultDisputeGame.CallOpts)
+}
+
+// ClaimDataLen is a free data retrieval call binding the contract method 0x8980e0cc.
+//
+// Solidity: function claimDataLen() view returns(uint256 len_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ClaimDataLen() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.ClaimDataLen(&_FaultDisputeGame.CallOpts)
+}
+
+// Claims is a free data retrieval call binding the contract method 0xeff0f592.
+//
+// Solidity: function claims(bytes32 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Claims(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "claims", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Claims is a free data retrieval call binding the contract method 0xeff0f592.
+//
+// Solidity: function claims(bytes32 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameSession) Claims(arg0 [32]byte) (bool, error) {
+	return _FaultDisputeGame.Contract.Claims(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// Claims is a free data retrieval call binding the contract method 0xeff0f592.
+//
+// Solidity: function claims(bytes32 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Claims(arg0 [32]byte) (bool, error) {
+	return _FaultDisputeGame.Contract.Claims(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ClockExtension is a free data retrieval call binding the contract method 0x6b6716c0.
+//
+// Solidity: function clockExtension() view returns(uint64 clockExtension_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ClockExtension(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "clockExtension")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// ClockExtension is a free data retrieval call binding the contract method 0x6b6716c0.
+//
+// Solidity: function clockExtension() view returns(uint64 clockExtension_)
+func (_FaultDisputeGame *FaultDisputeGameSession) ClockExtension() (uint64, error) {
+	return _FaultDisputeGame.Contract.ClockExtension(&_FaultDisputeGame.CallOpts)
+}
+
+// ClockExtension is a free data retrieval call binding the contract method 0x6b6716c0.
+//
+// Solidity: function clockExtension() view returns(uint64 clockExtension_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ClockExtension() (uint64, error) {
+	return _FaultDisputeGame.Contract.ClockExtension(&_FaultDisputeGame.CallOpts)
+}
+
+// CreatedAt is a free data retrieval call binding the contract method 0xcf09e0d0.
+//
+// Solidity: function createdAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameCaller) CreatedAt(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "createdAt")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// CreatedAt is a free data retrieval call binding the contract method 0xcf09e0d0.
+//
+// Solidity: function createdAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameSession) CreatedAt() (uint64, error) {
+	return _FaultDisputeGame.Contract.CreatedAt(&_FaultDisputeGame.CallOpts)
+}
+
+// CreatedAt is a free data retrieval call binding the contract method 0xcf09e0d0.
+//
+// Solidity: function createdAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) CreatedAt() (uint64, error) {
+	return _FaultDisputeGame.Contract.CreatedAt(&_FaultDisputeGame.CallOpts)
+}
+
+// Credit is a free data retrieval call binding the contract method 0xd5d44d80.
+//
+// Solidity: function credit(address ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Credit(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "credit", arg0)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Credit is a free data retrieval call binding the contract method 0xd5d44d80.
+//
+// Solidity: function credit(address ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameSession) Credit(arg0 common.Address) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.Credit(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// Credit is a free data retrieval call binding the contract method 0xd5d44d80.
+//
+// Solidity: function credit(address ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Credit(arg0 common.Address) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.Credit(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ExtraData is a free data retrieval call binding the contract method 0x609d3334.
+//
+// Solidity: function extraData() pure returns(bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ExtraData(opts *bind.CallOpts) ([]byte, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "extraData")
+
+	if err != nil {
+		return *new([]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
+
+	return out0, err
+
+}
+
+// ExtraData is a free data retrieval call binding the contract method 0x609d3334.
+//
+// Solidity: function extraData() pure returns(bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameSession) ExtraData() ([]byte, error) {
+	return _FaultDisputeGame.Contract.ExtraData(&_FaultDisputeGame.CallOpts)
+}
+
+// ExtraData is a free data retrieval call binding the contract method 0x609d3334.
+//
+// Solidity: function extraData() pure returns(bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ExtraData() ([]byte, error) {
+	return _FaultDisputeGame.Contract.ExtraData(&_FaultDisputeGame.CallOpts)
+}
+
+// GameCreator is a free data retrieval call binding the contract method 0x37b1b229.
+//
+// Solidity: function gameCreator() pure returns(address creator_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GameCreator(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "gameCreator")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// GameCreator is a free data retrieval call binding the contract method 0x37b1b229.
+//
+// Solidity: function gameCreator() pure returns(address creator_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GameCreator() (common.Address, error) {
+	return _FaultDisputeGame.Contract.GameCreator(&_FaultDisputeGame.CallOpts)
+}
+
+// GameCreator is a free data retrieval call binding the contract method 0x37b1b229.
+//
+// Solidity: function gameCreator() pure returns(address creator_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GameCreator() (common.Address, error) {
+	return _FaultDisputeGame.Contract.GameCreator(&_FaultDisputeGame.CallOpts)
+}
+
+// GameData is a free data retrieval call binding the contract method 0xfa24f743.
+//
+// Solidity: function gameData() view returns(uint32 gameType_, bytes32 rootClaim_, bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GameData(opts *bind.CallOpts) (struct {
+	GameType  uint32
+	RootClaim [32]byte
+	ExtraData []byte
+}, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "gameData")
+
+	outstruct := new(struct {
+		GameType  uint32
+		RootClaim [32]byte
+		ExtraData []byte
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.GameType = *abi.ConvertType(out[0], new(uint32)).(*uint32)
+	outstruct.RootClaim = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte)
+	outstruct.ExtraData = *abi.ConvertType(out[2], new([]byte)).(*[]byte)
+
+	return *outstruct, err
+
+}
+
+// GameData is a free data retrieval call binding the contract method 0xfa24f743.
+//
+// Solidity: function gameData() view returns(uint32 gameType_, bytes32 rootClaim_, bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GameData() (struct {
+	GameType  uint32
+	RootClaim [32]byte
+	ExtraData []byte
+}, error) {
+	return _FaultDisputeGame.Contract.GameData(&_FaultDisputeGame.CallOpts)
+}
+
+// GameData is a free data retrieval call binding the contract method 0xfa24f743.
+//
+// Solidity: function gameData() view returns(uint32 gameType_, bytes32 rootClaim_, bytes extraData_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GameData() (struct {
+	GameType  uint32
+	RootClaim [32]byte
+	ExtraData []byte
+}, error) {
+	return _FaultDisputeGame.Contract.GameData(&_FaultDisputeGame.CallOpts)
+}
+
+// GameType is a free data retrieval call binding the contract method 0xbbdc02db.
+//
+// Solidity: function gameType() view returns(uint32 gameType_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GameType(opts *bind.CallOpts) (uint32, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "gameType")
+
+	if err != nil {
+		return *new(uint32), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+	return out0, err
+
+}
+
+// GameType is a free data retrieval call binding the contract method 0xbbdc02db.
+//
+// Solidity: function gameType() view returns(uint32 gameType_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GameType() (uint32, error) {
+	return _FaultDisputeGame.Contract.GameType(&_FaultDisputeGame.CallOpts)
+}
+
+// GameType is a free data retrieval call binding the contract method 0xbbdc02db.
+//
+// Solidity: function gameType() view returns(uint32 gameType_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GameType() (uint32, error) {
+	return _FaultDisputeGame.Contract.GameType(&_FaultDisputeGame.CallOpts)
+}
+
+// GetChallengerDuration is a free data retrieval call binding the contract method 0xbd8da956.
+//
+// Solidity: function getChallengerDuration(uint256 _claimIndex) view returns(uint64 duration_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GetChallengerDuration(opts *bind.CallOpts, _claimIndex *big.Int) (uint64, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "getChallengerDuration", _claimIndex)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// GetChallengerDuration is a free data retrieval call binding the contract method 0xbd8da956.
+//
+// Solidity: function getChallengerDuration(uint256 _claimIndex) view returns(uint64 duration_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GetChallengerDuration(_claimIndex *big.Int) (uint64, error) {
+	return _FaultDisputeGame.Contract.GetChallengerDuration(&_FaultDisputeGame.CallOpts, _claimIndex)
+}
+
+// GetChallengerDuration is a free data retrieval call binding the contract method 0xbd8da956.
+//
+// Solidity: function getChallengerDuration(uint256 _claimIndex) view returns(uint64 duration_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GetChallengerDuration(_claimIndex *big.Int) (uint64, error) {
+	return _FaultDisputeGame.Contract.GetChallengerDuration(&_FaultDisputeGame.CallOpts, _claimIndex)
+}
+
+// GetNumToResolve is a free data retrieval call binding the contract method 0x5a5fa2d9.
+//
+// Solidity: function getNumToResolve(uint256 _claimIndex) view returns(uint256 numRemainingChildren_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GetNumToResolve(opts *bind.CallOpts, _claimIndex *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "getNumToResolve", _claimIndex)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetNumToResolve is a free data retrieval call binding the contract method 0x5a5fa2d9.
+//
+// Solidity: function getNumToResolve(uint256 _claimIndex) view returns(uint256 numRemainingChildren_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GetNumToResolve(_claimIndex *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.GetNumToResolve(&_FaultDisputeGame.CallOpts, _claimIndex)
+}
+
+// GetNumToResolve is a free data retrieval call binding the contract method 0x5a5fa2d9.
+//
+// Solidity: function getNumToResolve(uint256 _claimIndex) view returns(uint256 numRemainingChildren_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GetNumToResolve(_claimIndex *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.GetNumToResolve(&_FaultDisputeGame.CallOpts, _claimIndex)
+}
+
+// GetRequiredBond is a free data retrieval call binding the contract method 0xc395e1ca.
+//
+// Solidity: function getRequiredBond(uint128 _position) view returns(uint256 requiredBond_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) GetRequiredBond(opts *bind.CallOpts, _position *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "getRequiredBond", _position)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetRequiredBond is a free data retrieval call binding the contract method 0xc395e1ca.
+//
+// Solidity: function getRequiredBond(uint128 _position) view returns(uint256 requiredBond_)
+func (_FaultDisputeGame *FaultDisputeGameSession) GetRequiredBond(_position *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.GetRequiredBond(&_FaultDisputeGame.CallOpts, _position)
+}
+
+// GetRequiredBond is a free data retrieval call binding the contract method 0xc395e1ca.
+//
+// Solidity: function getRequiredBond(uint128 _position) view returns(uint256 requiredBond_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) GetRequiredBond(_position *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.GetRequiredBond(&_FaultDisputeGame.CallOpts, _position)
+}
+
+// L1Head is a free data retrieval call binding the contract method 0x6361506d.
+//
+// Solidity: function l1Head() pure returns(bytes32 l1Head_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) L1Head(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "l1Head")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// L1Head is a free data retrieval call binding the contract method 0x6361506d.
+//
+// Solidity: function l1Head() pure returns(bytes32 l1Head_)
+func (_FaultDisputeGame *FaultDisputeGameSession) L1Head() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.L1Head(&_FaultDisputeGame.CallOpts)
+}
+
+// L1Head is a free data retrieval call binding the contract method 0x6361506d.
+//
+// Solidity: function l1Head() pure returns(bytes32 l1Head_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) L1Head() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.L1Head(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumber is a free data retrieval call binding the contract method 0x8b85902b.
+//
+// Solidity: function l2BlockNumber() pure returns(uint256 l2BlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) L2BlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "l2BlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2BlockNumber is a free data retrieval call binding the contract method 0x8b85902b.
+//
+// Solidity: function l2BlockNumber() pure returns(uint256 l2BlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameSession) L2BlockNumber() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumber(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumber is a free data retrieval call binding the contract method 0x8b85902b.
+//
+// Solidity: function l2BlockNumber() pure returns(uint256 l2BlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) L2BlockNumber() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumber(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumberChallenged is a free data retrieval call binding the contract method 0x3e3ac912.
+//
+// Solidity: function l2BlockNumberChallenged() view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCaller) L2BlockNumberChallenged(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "l2BlockNumberChallenged")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// L2BlockNumberChallenged is a free data retrieval call binding the contract method 0x3e3ac912.
+//
+// Solidity: function l2BlockNumberChallenged() view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameSession) L2BlockNumberChallenged() (bool, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumberChallenged(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumberChallenged is a free data retrieval call binding the contract method 0x3e3ac912.
+//
+// Solidity: function l2BlockNumberChallenged() view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) L2BlockNumberChallenged() (bool, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumberChallenged(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumberChallenger is a free data retrieval call binding the contract method 0x30dbe570.
+//
+// Solidity: function l2BlockNumberChallenger() view returns(address)
+func (_FaultDisputeGame *FaultDisputeGameCaller) L2BlockNumberChallenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "l2BlockNumberChallenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2BlockNumberChallenger is a free data retrieval call binding the contract method 0x30dbe570.
+//
+// Solidity: function l2BlockNumberChallenger() view returns(address)
+func (_FaultDisputeGame *FaultDisputeGameSession) L2BlockNumberChallenger() (common.Address, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumberChallenger(&_FaultDisputeGame.CallOpts)
+}
+
+// L2BlockNumberChallenger is a free data retrieval call binding the contract method 0x30dbe570.
+//
+// Solidity: function l2BlockNumberChallenger() view returns(address)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) L2BlockNumberChallenger() (common.Address, error) {
+	return _FaultDisputeGame.Contract.L2BlockNumberChallenger(&_FaultDisputeGame.CallOpts)
+}
+
+// L2ChainId is a free data retrieval call binding the contract method 0xd6ae3cd5.
+//
+// Solidity: function l2ChainId() view returns(uint256 l2ChainId_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) L2ChainId(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "l2ChainId")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2ChainId is a free data retrieval call binding the contract method 0xd6ae3cd5.
+//
+// Solidity: function l2ChainId() view returns(uint256 l2ChainId_)
+func (_FaultDisputeGame *FaultDisputeGameSession) L2ChainId() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.L2ChainId(&_FaultDisputeGame.CallOpts)
+}
+
+// L2ChainId is a free data retrieval call binding the contract method 0xd6ae3cd5.
+//
+// Solidity: function l2ChainId() view returns(uint256 l2ChainId_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) L2ChainId() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.L2ChainId(&_FaultDisputeGame.CallOpts)
+}
+
+// MaxClockDuration is a free data retrieval call binding the contract method 0xdabd396d.
+//
+// Solidity: function maxClockDuration() view returns(uint64 maxClockDuration_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) MaxClockDuration(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "maxClockDuration")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MaxClockDuration is a free data retrieval call binding the contract method 0xdabd396d.
+//
+// Solidity: function maxClockDuration() view returns(uint64 maxClockDuration_)
+func (_FaultDisputeGame *FaultDisputeGameSession) MaxClockDuration() (uint64, error) {
+	return _FaultDisputeGame.Contract.MaxClockDuration(&_FaultDisputeGame.CallOpts)
+}
+
+// MaxClockDuration is a free data retrieval call binding the contract method 0xdabd396d.
+//
+// Solidity: function maxClockDuration() view returns(uint64 maxClockDuration_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) MaxClockDuration() (uint64, error) {
+	return _FaultDisputeGame.Contract.MaxClockDuration(&_FaultDisputeGame.CallOpts)
+}
+
+// MaxGameDepth is a free data retrieval call binding the contract method 0xfa315aa9.
+//
+// Solidity: function maxGameDepth() view returns(uint256 maxGameDepth_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) MaxGameDepth(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "maxGameDepth")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// MaxGameDepth is a free data retrieval call binding the contract method 0xfa315aa9.
+//
+// Solidity: function maxGameDepth() view returns(uint256 maxGameDepth_)
+func (_FaultDisputeGame *FaultDisputeGameSession) MaxGameDepth() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.MaxGameDepth(&_FaultDisputeGame.CallOpts)
+}
+
+// MaxGameDepth is a free data retrieval call binding the contract method 0xfa315aa9.
+//
+// Solidity: function maxGameDepth() view returns(uint256 maxGameDepth_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) MaxGameDepth() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.MaxGameDepth(&_FaultDisputeGame.CallOpts)
+}
+
+// ResolutionCheckpoints is a free data retrieval call binding the contract method 0xa445ece6.
+//
+// Solidity: function resolutionCheckpoints(uint256 ) view returns(bool initialCheckpointComplete, uint32 subgameIndex, uint128 leftmostPosition, address counteredBy)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ResolutionCheckpoints(opts *bind.CallOpts, arg0 *big.Int) (struct {
+	InitialCheckpointComplete bool
+	SubgameIndex              uint32
+	LeftmostPosition          *big.Int
+	CounteredBy               common.Address
+}, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "resolutionCheckpoints", arg0)
+
+	outstruct := new(struct {
+		InitialCheckpointComplete bool
+		SubgameIndex              uint32
+		LeftmostPosition          *big.Int
+		CounteredBy               common.Address
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.InitialCheckpointComplete = *abi.ConvertType(out[0], new(bool)).(*bool)
+	outstruct.SubgameIndex = *abi.ConvertType(out[1], new(uint32)).(*uint32)
+	outstruct.LeftmostPosition = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int)
+	outstruct.CounteredBy = *abi.ConvertType(out[3], new(common.Address)).(*common.Address)
+
+	return *outstruct, err
+
+}
+
+// ResolutionCheckpoints is a free data retrieval call binding the contract method 0xa445ece6.
+//
+// Solidity: function resolutionCheckpoints(uint256 ) view returns(bool initialCheckpointComplete, uint32 subgameIndex, uint128 leftmostPosition, address counteredBy)
+func (_FaultDisputeGame *FaultDisputeGameSession) ResolutionCheckpoints(arg0 *big.Int) (struct {
+	InitialCheckpointComplete bool
+	SubgameIndex              uint32
+	LeftmostPosition          *big.Int
+	CounteredBy               common.Address
+}, error) {
+	return _FaultDisputeGame.Contract.ResolutionCheckpoints(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ResolutionCheckpoints is a free data retrieval call binding the contract method 0xa445ece6.
+//
+// Solidity: function resolutionCheckpoints(uint256 ) view returns(bool initialCheckpointComplete, uint32 subgameIndex, uint128 leftmostPosition, address counteredBy)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ResolutionCheckpoints(arg0 *big.Int) (struct {
+	InitialCheckpointComplete bool
+	SubgameIndex              uint32
+	LeftmostPosition          *big.Int
+	CounteredBy               common.Address
+}, error) {
+	return _FaultDisputeGame.Contract.ResolutionCheckpoints(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ResolvedAt is a free data retrieval call binding the contract method 0x19effeb4.
+//
+// Solidity: function resolvedAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ResolvedAt(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "resolvedAt")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// ResolvedAt is a free data retrieval call binding the contract method 0x19effeb4.
+//
+// Solidity: function resolvedAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameSession) ResolvedAt() (uint64, error) {
+	return _FaultDisputeGame.Contract.ResolvedAt(&_FaultDisputeGame.CallOpts)
+}
+
+// ResolvedAt is a free data retrieval call binding the contract method 0x19effeb4.
+//
+// Solidity: function resolvedAt() view returns(uint64)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ResolvedAt() (uint64, error) {
+	return _FaultDisputeGame.Contract.ResolvedAt(&_FaultDisputeGame.CallOpts)
+}
+
+// ResolvedSubgames is a free data retrieval call binding the contract method 0xfe2bbeb2.
+//
+// Solidity: function resolvedSubgames(uint256 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCaller) ResolvedSubgames(opts *bind.CallOpts, arg0 *big.Int) (bool, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "resolvedSubgames", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// ResolvedSubgames is a free data retrieval call binding the contract method 0xfe2bbeb2.
+//
+// Solidity: function resolvedSubgames(uint256 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameSession) ResolvedSubgames(arg0 *big.Int) (bool, error) {
+	return _FaultDisputeGame.Contract.ResolvedSubgames(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// ResolvedSubgames is a free data retrieval call binding the contract method 0xfe2bbeb2.
+//
+// Solidity: function resolvedSubgames(uint256 ) view returns(bool)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) ResolvedSubgames(arg0 *big.Int) (bool, error) {
+	return _FaultDisputeGame.Contract.ResolvedSubgames(&_FaultDisputeGame.CallOpts, arg0)
+}
+
+// RootClaim is a free data retrieval call binding the contract method 0xbcef3b55.
+//
+// Solidity: function rootClaim() pure returns(bytes32 rootClaim_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) RootClaim(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "rootClaim")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// RootClaim is a free data retrieval call binding the contract method 0xbcef3b55.
+//
+// Solidity: function rootClaim() pure returns(bytes32 rootClaim_)
+func (_FaultDisputeGame *FaultDisputeGameSession) RootClaim() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.RootClaim(&_FaultDisputeGame.CallOpts)
+}
+
+// RootClaim is a free data retrieval call binding the contract method 0xbcef3b55.
+//
+// Solidity: function rootClaim() pure returns(bytes32 rootClaim_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) RootClaim() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.RootClaim(&_FaultDisputeGame.CallOpts)
+}
+
+// SplitDepth is a free data retrieval call binding the contract method 0xec5e6308.
+//
+// Solidity: function splitDepth() view returns(uint256 splitDepth_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) SplitDepth(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "splitDepth")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// SplitDepth is a free data retrieval call binding the contract method 0xec5e6308.
+//
+// Solidity: function splitDepth() view returns(uint256 splitDepth_)
+func (_FaultDisputeGame *FaultDisputeGameSession) SplitDepth() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.SplitDepth(&_FaultDisputeGame.CallOpts)
+}
+
+// SplitDepth is a free data retrieval call binding the contract method 0xec5e6308.
+//
+// Solidity: function splitDepth() view returns(uint256 splitDepth_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) SplitDepth() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.SplitDepth(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256 startingBlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) StartingBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "startingBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256 startingBlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameSession) StartingBlockNumber() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.StartingBlockNumber(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256 startingBlockNumber_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) StartingBlockNumber() (*big.Int, error) {
+	return _FaultDisputeGame.Contract.StartingBlockNumber(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingOutputRoot is a free data retrieval call binding the contract method 0x57da950e.
+//
+// Solidity: function startingOutputRoot() view returns(bytes32 root, uint256 l2BlockNumber)
+func (_FaultDisputeGame *FaultDisputeGameCaller) StartingOutputRoot(opts *bind.CallOpts) (struct {
+	Root          [32]byte
+	L2BlockNumber *big.Int
+}, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "startingOutputRoot")
+
+	outstruct := new(struct {
+		Root          [32]byte
+		L2BlockNumber *big.Int
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.Root = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+	outstruct.L2BlockNumber = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
+
+	return *outstruct, err
+
+}
+
+// StartingOutputRoot is a free data retrieval call binding the contract method 0x57da950e.
+//
+// Solidity: function startingOutputRoot() view returns(bytes32 root, uint256 l2BlockNumber)
+func (_FaultDisputeGame *FaultDisputeGameSession) StartingOutputRoot() (struct {
+	Root          [32]byte
+	L2BlockNumber *big.Int
+}, error) {
+	return _FaultDisputeGame.Contract.StartingOutputRoot(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingOutputRoot is a free data retrieval call binding the contract method 0x57da950e.
+//
+// Solidity: function startingOutputRoot() view returns(bytes32 root, uint256 l2BlockNumber)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) StartingOutputRoot() (struct {
+	Root          [32]byte
+	L2BlockNumber *big.Int
+}, error) {
+	return _FaultDisputeGame.Contract.StartingOutputRoot(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingRootHash is a free data retrieval call binding the contract method 0x25fc2ace.
+//
+// Solidity: function startingRootHash() view returns(bytes32 startingRootHash_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) StartingRootHash(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "startingRootHash")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// StartingRootHash is a free data retrieval call binding the contract method 0x25fc2ace.
+//
+// Solidity: function startingRootHash() view returns(bytes32 startingRootHash_)
+func (_FaultDisputeGame *FaultDisputeGameSession) StartingRootHash() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.StartingRootHash(&_FaultDisputeGame.CallOpts)
+}
+
+// StartingRootHash is a free data retrieval call binding the contract method 0x25fc2ace.
+//
+// Solidity: function startingRootHash() view returns(bytes32 startingRootHash_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) StartingRootHash() ([32]byte, error) {
+	return _FaultDisputeGame.Contract.StartingRootHash(&_FaultDisputeGame.CallOpts)
+}
+
+// Status is a free data retrieval call binding the contract method 0x200d2ed2.
+//
+// Solidity: function status() view returns(uint8)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Status(opts *bind.CallOpts) (uint8, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "status")
+
+	if err != nil {
+		return *new(uint8), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
+
+	return out0, err
+
+}
+
+// Status is a free data retrieval call binding the contract method 0x200d2ed2.
+//
+// Solidity: function status() view returns(uint8)
+func (_FaultDisputeGame *FaultDisputeGameSession) Status() (uint8, error) {
+	return _FaultDisputeGame.Contract.Status(&_FaultDisputeGame.CallOpts)
+}
+
+// Status is a free data retrieval call binding the contract method 0x200d2ed2.
+//
+// Solidity: function status() view returns(uint8)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Status() (uint8, error) {
+	return _FaultDisputeGame.Contract.Status(&_FaultDisputeGame.CallOpts)
+}
+
+// Subgames is a free data retrieval call binding the contract method 0x2ad69aeb.
+//
+// Solidity: function subgames(uint256 , uint256 ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Subgames(opts *bind.CallOpts, arg0 *big.Int, arg1 *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "subgames", arg0, arg1)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Subgames is a free data retrieval call binding the contract method 0x2ad69aeb.
+//
+// Solidity: function subgames(uint256 , uint256 ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameSession) Subgames(arg0 *big.Int, arg1 *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.Subgames(&_FaultDisputeGame.CallOpts, arg0, arg1)
+}
+
+// Subgames is a free data retrieval call binding the contract method 0x2ad69aeb.
+//
+// Solidity: function subgames(uint256 , uint256 ) view returns(uint256)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Subgames(arg0 *big.Int, arg1 *big.Int) (*big.Int, error) {
+	return _FaultDisputeGame.Contract.Subgames(&_FaultDisputeGame.CallOpts, arg0, arg1)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_FaultDisputeGame *FaultDisputeGameSession) Version() (string, error) {
+	return _FaultDisputeGame.Contract.Version(&_FaultDisputeGame.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Version() (string, error) {
+	return _FaultDisputeGame.Contract.Version(&_FaultDisputeGame.CallOpts)
+}
+
+// Vm is a free data retrieval call binding the contract method 0x3a768463.
+//
+// Solidity: function vm() view returns(address vm_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Vm(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "vm")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Vm is a free data retrieval call binding the contract method 0x3a768463.
+//
+// Solidity: function vm() view returns(address vm_)
+func (_FaultDisputeGame *FaultDisputeGameSession) Vm() (common.Address, error) {
+	return _FaultDisputeGame.Contract.Vm(&_FaultDisputeGame.CallOpts)
+}
+
+// Vm is a free data retrieval call binding the contract method 0x3a768463.
+//
+// Solidity: function vm() view returns(address vm_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Vm() (common.Address, error) {
+	return _FaultDisputeGame.Contract.Vm(&_FaultDisputeGame.CallOpts)
+}
+
+// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
+//
+// Solidity: function weth() view returns(address weth_)
+func (_FaultDisputeGame *FaultDisputeGameCaller) Weth(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _FaultDisputeGame.contract.Call(opts, &out, "weth")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
+//
+// Solidity: function weth() view returns(address weth_)
+func (_FaultDisputeGame *FaultDisputeGameSession) Weth() (common.Address, error) {
+	return _FaultDisputeGame.Contract.Weth(&_FaultDisputeGame.CallOpts)
+}
+
+// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
+//
+// Solidity: function weth() view returns(address weth_)
+func (_FaultDisputeGame *FaultDisputeGameCallerSession) Weth() (common.Address, error) {
+	return _FaultDisputeGame.Contract.Weth(&_FaultDisputeGame.CallOpts)
+}
+
+// AddLocalData is a paid mutator transaction binding the contract method 0xf8f43ff6.
+//
+// Solidity: function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) AddLocalData(opts *bind.TransactOpts, _ident *big.Int, _execLeafIdx *big.Int, _partOffset *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "addLocalData", _ident, _execLeafIdx, _partOffset)
+}
+
+// AddLocalData is a paid mutator transaction binding the contract method 0xf8f43ff6.
+//
+// Solidity: function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) AddLocalData(_ident *big.Int, _execLeafIdx *big.Int, _partOffset *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.AddLocalData(&_FaultDisputeGame.TransactOpts, _ident, _execLeafIdx, _partOffset)
+}
+
+// AddLocalData is a paid mutator transaction binding the contract method 0xf8f43ff6.
+//
+// Solidity: function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) AddLocalData(_ident *big.Int, _execLeafIdx *big.Int, _partOffset *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.AddLocalData(&_FaultDisputeGame.TransactOpts, _ident, _execLeafIdx, _partOffset)
+}
+
+// Attack is a paid mutator transaction binding the contract method 0x472777c6.
+//
+// Solidity: function attack(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Attack(opts *bind.TransactOpts, _disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "attack", _disputed, _parentIndex, _claim)
+}
+
+// Attack is a paid mutator transaction binding the contract method 0x472777c6.
+//
+// Solidity: function attack(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) Attack(_disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Attack(&_FaultDisputeGame.TransactOpts, _disputed, _parentIndex, _claim)
+}
+
+// Attack is a paid mutator transaction binding the contract method 0x472777c6.
+//
+// Solidity: function attack(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Attack(_disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Attack(&_FaultDisputeGame.TransactOpts, _disputed, _parentIndex, _claim)
+}
+
+// ChallengeRootL2Block is a paid mutator transaction binding the contract method 0x01935130.
+//
+// Solidity: function challengeRootL2Block((bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes _headerRLP) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) ChallengeRootL2Block(opts *bind.TransactOpts, _outputRootProof TypesOutputRootProof, _headerRLP []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "challengeRootL2Block", _outputRootProof, _headerRLP)
+}
+
+// ChallengeRootL2Block is a paid mutator transaction binding the contract method 0x01935130.
+//
+// Solidity: function challengeRootL2Block((bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes _headerRLP) returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) ChallengeRootL2Block(_outputRootProof TypesOutputRootProof, _headerRLP []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ChallengeRootL2Block(&_FaultDisputeGame.TransactOpts, _outputRootProof, _headerRLP)
+}
+
+// ChallengeRootL2Block is a paid mutator transaction binding the contract method 0x01935130.
+//
+// Solidity: function challengeRootL2Block((bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes _headerRLP) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) ChallengeRootL2Block(_outputRootProof TypesOutputRootProof, _headerRLP []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ChallengeRootL2Block(&_FaultDisputeGame.TransactOpts, _outputRootProof, _headerRLP)
+}
+
+// ClaimCredit is a paid mutator transaction binding the contract method 0x60e27464.
+//
+// Solidity: function claimCredit(address _recipient) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) ClaimCredit(opts *bind.TransactOpts, _recipient common.Address) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "claimCredit", _recipient)
+}
+
+// ClaimCredit is a paid mutator transaction binding the contract method 0x60e27464.
+//
+// Solidity: function claimCredit(address _recipient) returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) ClaimCredit(_recipient common.Address) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ClaimCredit(&_FaultDisputeGame.TransactOpts, _recipient)
+}
+
+// ClaimCredit is a paid mutator transaction binding the contract method 0x60e27464.
+//
+// Solidity: function claimCredit(address _recipient) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) ClaimCredit(_recipient common.Address) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ClaimCredit(&_FaultDisputeGame.TransactOpts, _recipient)
+}
+
+// Defend is a paid mutator transaction binding the contract method 0x7b0f0adc.
+//
+// Solidity: function defend(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Defend(opts *bind.TransactOpts, _disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "defend", _disputed, _parentIndex, _claim)
+}
+
+// Defend is a paid mutator transaction binding the contract method 0x7b0f0adc.
+//
+// Solidity: function defend(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) Defend(_disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Defend(&_FaultDisputeGame.TransactOpts, _disputed, _parentIndex, _claim)
+}
+
+// Defend is a paid mutator transaction binding the contract method 0x7b0f0adc.
+//
+// Solidity: function defend(bytes32 _disputed, uint256 _parentIndex, bytes32 _claim) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Defend(_disputed [32]byte, _parentIndex *big.Int, _claim [32]byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Defend(&_FaultDisputeGame.TransactOpts, _disputed, _parentIndex, _claim)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
+//
+// Solidity: function initialize() payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Initialize(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "initialize")
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
+//
+// Solidity: function initialize() payable returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) Initialize() (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Initialize(&_FaultDisputeGame.TransactOpts)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
+//
+// Solidity: function initialize() payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Initialize() (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Initialize(&_FaultDisputeGame.TransactOpts)
+}
+
+// Move is a paid mutator transaction binding the contract method 0x6f034409.
+//
+// Solidity: function move(bytes32 _disputed, uint256 _challengeIndex, bytes32 _claim, bool _isAttack) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Move(opts *bind.TransactOpts, _disputed [32]byte, _challengeIndex *big.Int, _claim [32]byte, _isAttack bool) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "move", _disputed, _challengeIndex, _claim, _isAttack)
+}
+
+// Move is a paid mutator transaction binding the contract method 0x6f034409.
+//
+// Solidity: function move(bytes32 _disputed, uint256 _challengeIndex, bytes32 _claim, bool _isAttack) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) Move(_disputed [32]byte, _challengeIndex *big.Int, _claim [32]byte, _isAttack bool) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Move(&_FaultDisputeGame.TransactOpts, _disputed, _challengeIndex, _claim, _isAttack)
+}
+
+// Move is a paid mutator transaction binding the contract method 0x6f034409.
+//
+// Solidity: function move(bytes32 _disputed, uint256 _challengeIndex, bytes32 _claim, bool _isAttack) payable returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Move(_disputed [32]byte, _challengeIndex *big.Int, _claim [32]byte, _isAttack bool) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Move(&_FaultDisputeGame.TransactOpts, _disputed, _challengeIndex, _claim, _isAttack)
+}
+
+// Resolve is a paid mutator transaction binding the contract method 0x2810e1d6.
+//
+// Solidity: function resolve() returns(uint8 status_)
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Resolve(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "resolve")
+}
+
+// Resolve is a paid mutator transaction binding the contract method 0x2810e1d6.
+//
+// Solidity: function resolve() returns(uint8 status_)
+func (_FaultDisputeGame *FaultDisputeGameSession) Resolve() (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Resolve(&_FaultDisputeGame.TransactOpts)
+}
+
+// Resolve is a paid mutator transaction binding the contract method 0x2810e1d6.
+//
+// Solidity: function resolve() returns(uint8 status_)
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Resolve() (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Resolve(&_FaultDisputeGame.TransactOpts)
+}
+
+// ResolveClaim is a paid mutator transaction binding the contract method 0x03c2924d.
+//
+// Solidity: function resolveClaim(uint256 _claimIndex, uint256 _numToResolve) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) ResolveClaim(opts *bind.TransactOpts, _claimIndex *big.Int, _numToResolve *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "resolveClaim", _claimIndex, _numToResolve)
+}
+
+// ResolveClaim is a paid mutator transaction binding the contract method 0x03c2924d.
+//
+// Solidity: function resolveClaim(uint256 _claimIndex, uint256 _numToResolve) returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) ResolveClaim(_claimIndex *big.Int, _numToResolve *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ResolveClaim(&_FaultDisputeGame.TransactOpts, _claimIndex, _numToResolve)
+}
+
+// ResolveClaim is a paid mutator transaction binding the contract method 0x03c2924d.
+//
+// Solidity: function resolveClaim(uint256 _claimIndex, uint256 _numToResolve) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) ResolveClaim(_claimIndex *big.Int, _numToResolve *big.Int) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.ResolveClaim(&_FaultDisputeGame.TransactOpts, _claimIndex, _numToResolve)
+}
+
+// Step is a paid mutator transaction binding the contract method 0xd8cc1a3c.
+//
+// Solidity: function step(uint256 _claimIndex, bool _isAttack, bytes _stateData, bytes _proof) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactor) Step(opts *bind.TransactOpts, _claimIndex *big.Int, _isAttack bool, _stateData []byte, _proof []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.contract.Transact(opts, "step", _claimIndex, _isAttack, _stateData, _proof)
+}
+
+// Step is a paid mutator transaction binding the contract method 0xd8cc1a3c.
+//
+// Solidity: function step(uint256 _claimIndex, bool _isAttack, bytes _stateData, bytes _proof) returns()
+func (_FaultDisputeGame *FaultDisputeGameSession) Step(_claimIndex *big.Int, _isAttack bool, _stateData []byte, _proof []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Step(&_FaultDisputeGame.TransactOpts, _claimIndex, _isAttack, _stateData, _proof)
+}
+
+// Step is a paid mutator transaction binding the contract method 0xd8cc1a3c.
+//
+// Solidity: function step(uint256 _claimIndex, bool _isAttack, bytes _stateData, bytes _proof) returns()
+func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Step(_claimIndex *big.Int, _isAttack bool, _stateData []byte, _proof []byte) (*types.Transaction, error) {
+	return _FaultDisputeGame.Contract.Step(&_FaultDisputeGame.TransactOpts, _claimIndex, _isAttack, _stateData, _proof)
+}
+
+// FaultDisputeGameMoveIterator is returned from FilterMove and is used to iterate over the raw logs and unpacked data for Move events raised by the FaultDisputeGame contract.
+type FaultDisputeGameMoveIterator struct {
+	Event *FaultDisputeGameMove // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *FaultDisputeGameMoveIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(FaultDisputeGameMove)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(FaultDisputeGameMove)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *FaultDisputeGameMoveIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *FaultDisputeGameMoveIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// FaultDisputeGameMove represents a Move event raised by the FaultDisputeGame contract.
+type FaultDisputeGameMove struct {
+	ParentIndex *big.Int
+	Claim       [32]byte
+	Claimant    common.Address
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterMove is a free log retrieval operation binding the contract event 0x9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be.
+//
+// Solidity: event Move(uint256 indexed parentIndex, bytes32 indexed claim, address indexed claimant)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) FilterMove(opts *bind.FilterOpts, parentIndex []*big.Int, claim [][32]byte, claimant []common.Address) (*FaultDisputeGameMoveIterator, error) {
+
+	var parentIndexRule []interface{}
+	for _, parentIndexItem := range parentIndex {
+		parentIndexRule = append(parentIndexRule, parentIndexItem)
+	}
+	var claimRule []interface{}
+	for _, claimItem := range claim {
+		claimRule = append(claimRule, claimItem)
+	}
+	var claimantRule []interface{}
+	for _, claimantItem := range claimant {
+		claimantRule = append(claimantRule, claimantItem)
+	}
+
+	logs, sub, err := _FaultDisputeGame.contract.FilterLogs(opts, "Move", parentIndexRule, claimRule, claimantRule)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGameMoveIterator{contract: _FaultDisputeGame.contract, event: "Move", logs: logs, sub: sub}, nil
+}
+
+// WatchMove is a free log subscription operation binding the contract event 0x9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be.
+//
+// Solidity: event Move(uint256 indexed parentIndex, bytes32 indexed claim, address indexed claimant)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) WatchMove(opts *bind.WatchOpts, sink chan<- *FaultDisputeGameMove, parentIndex []*big.Int, claim [][32]byte, claimant []common.Address) (event.Subscription, error) {
+
+	var parentIndexRule []interface{}
+	for _, parentIndexItem := range parentIndex {
+		parentIndexRule = append(parentIndexRule, parentIndexItem)
+	}
+	var claimRule []interface{}
+	for _, claimItem := range claim {
+		claimRule = append(claimRule, claimItem)
+	}
+	var claimantRule []interface{}
+	for _, claimantItem := range claimant {
+		claimantRule = append(claimantRule, claimantItem)
+	}
+
+	logs, sub, err := _FaultDisputeGame.contract.WatchLogs(opts, "Move", parentIndexRule, claimRule, claimantRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(FaultDisputeGameMove)
+				if err := _FaultDisputeGame.contract.UnpackLog(event, "Move", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseMove is a log parse operation binding the contract event 0x9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be.
+//
+// Solidity: event Move(uint256 indexed parentIndex, bytes32 indexed claim, address indexed claimant)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) ParseMove(log types.Log) (*FaultDisputeGameMove, error) {
+	event := new(FaultDisputeGameMove)
+	if err := _FaultDisputeGame.contract.UnpackLog(event, "Move", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// FaultDisputeGameResolvedIterator is returned from FilterResolved and is used to iterate over the raw logs and unpacked data for Resolved events raised by the FaultDisputeGame contract.
+type FaultDisputeGameResolvedIterator struct {
+	Event *FaultDisputeGameResolved // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *FaultDisputeGameResolvedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(FaultDisputeGameResolved)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(FaultDisputeGameResolved)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *FaultDisputeGameResolvedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *FaultDisputeGameResolvedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// FaultDisputeGameResolved represents a Resolved event raised by the FaultDisputeGame contract.
+type FaultDisputeGameResolved struct {
+	Status uint8
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterResolved is a free log retrieval operation binding the contract event 0x5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da60.
+//
+// Solidity: event Resolved(uint8 indexed status)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) FilterResolved(opts *bind.FilterOpts, status []uint8) (*FaultDisputeGameResolvedIterator, error) {
+
+	var statusRule []interface{}
+	for _, statusItem := range status {
+		statusRule = append(statusRule, statusItem)
+	}
+
+	logs, sub, err := _FaultDisputeGame.contract.FilterLogs(opts, "Resolved", statusRule)
+	if err != nil {
+		return nil, err
+	}
+	return &FaultDisputeGameResolvedIterator{contract: _FaultDisputeGame.contract, event: "Resolved", logs: logs, sub: sub}, nil
+}
+
+// WatchResolved is a free log subscription operation binding the contract event 0x5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da60.
+//
+// Solidity: event Resolved(uint8 indexed status)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) WatchResolved(opts *bind.WatchOpts, sink chan<- *FaultDisputeGameResolved, status []uint8) (event.Subscription, error) {
+
+	var statusRule []interface{}
+	for _, statusItem := range status {
+		statusRule = append(statusRule, statusItem)
+	}
+
+	logs, sub, err := _FaultDisputeGame.contract.WatchLogs(opts, "Resolved", statusRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(FaultDisputeGameResolved)
+				if err := _FaultDisputeGame.contract.UnpackLog(event, "Resolved", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseResolved is a log parse operation binding the contract event 0x5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da60.
+//
+// Solidity: event Resolved(uint8 indexed status)
+func (_FaultDisputeGame *FaultDisputeGameFilterer) ParseResolved(log types.Log) (*FaultDisputeGameResolved, error) {
+	event := new(FaultDisputeGameResolved)
+	if err := _FaultDisputeGame.contract.UnpackLog(event, "Resolved", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-e2e/bindings/gaspriceoracle.go b/op-e2e/bindings/gaspriceoracle.go
new file mode 100644
index 000000000000..00f3194cb6a4
--- /dev/null
+++ b/op-e2e/bindings/gaspriceoracle.go
@@ -0,0 +1,740 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// GasPriceOracleMetaData contains all meta data concerning the GasPriceOracle contract.
+var GasPriceOracleMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"function\",\"name\":\"DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"baseFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"baseFeeScalar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blobBaseFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blobBaseFeeScalar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"gasPrice\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL1Fee\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL1FeeUpperBound\",\"inputs\":[{\"name\":\"_unsignedTxSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL1GasUsed\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isEcotone\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isFjord\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l1BaseFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"overhead\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"scalar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setEcotone\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFjord\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"}]",
+	Bin: "0x608060405234801561001057600080fd5b506117f6806100206000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80636ef25c3a116100b2578063de26c4a111610081578063f45e65d811610066578063f45e65d81461025b578063f820614014610263578063fe173b971461020d57600080fd5b8063de26c4a114610235578063f1c7a58b1461024857600080fd5b80636ef25c3a1461020d5780638e98b10614610213578063960e3a231461021b578063c59859181461022d57600080fd5b806349948e0e11610109578063519b4bd3116100ee578063519b4bd31461019f57806354fd4d50146101a757806368d5dca6146101f057600080fd5b806349948e0e1461016f5780634ef6e2241461018257600080fd5b80630c18c1621461013b57806322b90ab3146101565780632e0f262514610160578063313ce56714610168575b600080fd5b61014361026b565b6040519081526020015b60405180910390f35b61015e61038c565b005b610143600681565b6006610143565b61014361017d3660046112a1565b610515565b60005461018f9060ff1681565b604051901515815260200161014d565b610143610552565b6101e36040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b60405161014d9190611370565b6101f86105b3565b60405163ffffffff909116815260200161014d565b48610143565b61015e610638565b60005461018f90610100900460ff1681565b6101f8610832565b6101436102433660046112a1565b610893565b6101436102563660046113e3565b61098d565b610143610a69565b610143610b5c565b6000805460ff1615610304576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f47617350726963654f7261636c653a206f76657268656164282920697320646560448201527f707265636174656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038791906113fc565b905090565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e2073657420697345636f746f6e6520666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a4016102fb565b60005460ff16156104e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a2045636f746f6e6520616c72656164792060448201527f616374697665000000000000000000000000000000000000000000000000000060648201526084016102fb565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60008054610100900460ff16156105355761052f82610bbd565b92915050565b60005460ff16156105495761052f82610bdc565b61052f82610c80565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166368d5dca66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103879190611415565b3373deaddeaddeaddeaddeaddeaddeaddeaddead0001146106db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973466a6f726420666c61670060648201526084016102fb565b60005460ff1661076d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20466a6f72642063616e206f6e6c79206260448201527f65206163746976617465642061667465722045636f746f6e650000000000000060648201526084016102fb565b600054610100900460ff1615610804576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f47617350726963654f7261636c653a20466a6f726420616c726561647920616360448201527f746976650000000000000000000000000000000000000000000000000000000060648201526084016102fb565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663c59859186040518163ffffffff1660e01b8152600401602060405180830381865afa158015610614573d6000803e3d6000fd5b60008054610100900460ff16156108da57620f42406108c56108b484610dd4565b516108c090604461146a565b6110f1565b6108d0906010611482565b61052f91906114bf565b60006108e583611150565b60005490915060ff16156108f95792915050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097c91906113fc565b610986908261146a565b9392505050565b60008054610100900460ff16610a25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f47617350726963654f7261636c653a206765744c314665655570706572426f7560448201527f6e64206f6e6c7920737570706f72747320466a6f72640000000000000000000060648201526084016102fb565b6000610a3283604461146a565b90506000610a4160ff836114bf565b610a4b908361146a565b610a5690601061146a565b9050610a61816111e0565b949350505050565b6000805460ff1615610afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a207363616c61722829206973206465707260448201527f656361746564000000000000000000000000000000000000000000000000000060648201526084016102fb565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663f82061406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b600061052f610bcb83610dd4565b51610bd790604461146a565b6111e0565b600080610be883611150565b90506000610bf4610552565b610bfc610832565b610c079060106114fa565b63ffffffff16610c179190611482565b90506000610c23610b5c565b610c2b6105b3565b63ffffffff16610c3b9190611482565b90506000610c49828461146a565b610c539085611482565b9050610c616006600a611646565b610c6c906010611482565b610c7690826114bf565b9695505050505050565b600080610c8c83611150565b9050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1391906113fc565b610d1b610552565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9e91906113fc565b610da8908561146a565b610db29190611482565b610dbc9190611482565b9050610dca6006600a611646565b610a6190826114bf565b6060610f63565b818153600101919050565b600082840393505b838110156109865782810151828201511860001a1590930292600101610dee565b825b60208210610e5b578251610e26601f83610ddb565b52602092909201917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090910190602101610e11565b8115610986578251610e706001840383610ddb565b520160010192915050565b60006001830392505b6101078210610ebc57610eae8360ff16610ea960fd610ea98760081c60e00189610ddb565b610ddb565b935061010682039150610e84565b60078210610ee957610ee28360ff16610ea960078503610ea98760081c60e00189610ddb565b9050610986565b610a618360ff16610ea98560081c8560051b0187610ddb565b610f5b828203610f3f610f2f84600081518060001a8160011a60081b178160021a60101b17915050919050565b639e3779b90260131c611fff1690565b8060021b6040510182815160e01c1860e01b8151188152505050565b600101919050565b6180003860405139618000604051016020830180600d8551820103826002015b81811015611096576000805b50508051604051600082901a600183901a60081b1760029290921a60101b91909117639e3779b9810260111c617ffc16909101805160e081811c878603811890911b90911890915284019081830390848410610feb5750611026565b600184019350611fff8211611020578251600081901a600182901a60081b1760029190911a60101b1781036110205750611026565b50610f8f565b838310611034575050611096565b600183039250858311156110525761104f8787888603610e0f565b96505b611066600985016003850160038501610de6565b9150611073878284610e7b565b96505061108b8461108686848601610f02565b610f02565b915050809350610f83565b50506110a88383848851850103610e0f565b925050506040519150618000820180820391508183526020830160005b838110156110dd5782810151828201526020016110c5565b506000920191825250602001604052919050565b60008061110183620cc394611482565b61112b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd763200611652565b905061113b6064620f42406116c6565b81121561052f576109866064620f42406116c6565b80516000908190815b818110156111d35784818151811061117357611173611782565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166000036111b3576111ac60048461146a565b92506111c1565b6111be60108461146a565b92505b806111cb816117b1565b915050611159565b50610a618261044061146a565b6000806111ec836110f1565b905060006111f8610b5c565b6112006105b3565b63ffffffff166112109190611482565b611218610552565b611220610832565b61122b9060106114fa565b63ffffffff1661123b9190611482565b611245919061146a565b905061125360066002611482565b61125e90600a611646565b6112688284611482565b610a6191906114bf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156112b357600080fd5b813567ffffffffffffffff808211156112cb57600080fd5b818401915084601f8301126112df57600080fd5b8135818111156112f1576112f1611272565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561133757611337611272565b8160405282815287602084870101111561135057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561139d57858101830151858201604001528201611381565b818111156113af576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156113f557600080fd5b5035919050565b60006020828403121561140e57600080fd5b5051919050565b60006020828403121561142757600080fd5b815163ffffffff8116811461098657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561147d5761147d61143b565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156114ba576114ba61143b565b500290565b6000826114f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600063ffffffff8083168185168183048111821515161561151d5761151d61143b565b02949350505050565b600181815b8085111561157f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156115655761156561143b565b8085161561157257918102915b93841c939080029061152b565b509250929050565b6000826115965750600161052f565b816115a35750600061052f565b81600181146115b957600281146115c3576115df565b600191505061052f565b60ff8411156115d4576115d461143b565b50506001821b61052f565b5060208310610133831016604e8410600b8410161715611602575081810a61052f565b61160c8383611526565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561163e5761163e61143b565b029392505050565b60006109868383611587565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561168c5761168c61143b565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156116c0576116c061143b565b50500190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156117075761170761143b565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156117425761174261143b565b6000871292508782058712848416161561175e5761175e61143b565b878505871281841616156117745761177461143b565b505050929093029392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036117e2576117e261143b565b506001019056fea164736f6c634300080f000a",
+}
+
+// GasPriceOracleABI is the input ABI used to generate the binding from.
+// Deprecated: Use GasPriceOracleMetaData.ABI instead.
+var GasPriceOracleABI = GasPriceOracleMetaData.ABI
+
+// GasPriceOracleBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use GasPriceOracleMetaData.Bin instead.
+var GasPriceOracleBin = GasPriceOracleMetaData.Bin
+
+// DeployGasPriceOracle deploys a new Ethereum contract, binding an instance of GasPriceOracle to it.
+func DeployGasPriceOracle(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *GasPriceOracle, error) {
+	parsed, err := GasPriceOracleMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(GasPriceOracleBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &GasPriceOracle{GasPriceOracleCaller: GasPriceOracleCaller{contract: contract}, GasPriceOracleTransactor: GasPriceOracleTransactor{contract: contract}, GasPriceOracleFilterer: GasPriceOracleFilterer{contract: contract}}, nil
+}
+
+// GasPriceOracle is an auto generated Go binding around an Ethereum contract.
+type GasPriceOracle struct {
+	GasPriceOracleCaller     // Read-only binding to the contract
+	GasPriceOracleTransactor // Write-only binding to the contract
+	GasPriceOracleFilterer   // Log filterer for contract events
+}
+
+// GasPriceOracleCaller is an auto generated read-only Go binding around an Ethereum contract.
+type GasPriceOracleCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// GasPriceOracleTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type GasPriceOracleTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// GasPriceOracleFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type GasPriceOracleFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// GasPriceOracleSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type GasPriceOracleSession struct {
+	Contract     *GasPriceOracle   // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// GasPriceOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type GasPriceOracleCallerSession struct {
+	Contract *GasPriceOracleCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts         // Call options to use throughout this session
+}
+
+// GasPriceOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type GasPriceOracleTransactorSession struct {
+	Contract     *GasPriceOracleTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
+}
+
+// GasPriceOracleRaw is an auto generated low-level Go binding around an Ethereum contract.
+type GasPriceOracleRaw struct {
+	Contract *GasPriceOracle // Generic contract binding to access the raw methods on
+}
+
+// GasPriceOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type GasPriceOracleCallerRaw struct {
+	Contract *GasPriceOracleCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// GasPriceOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type GasPriceOracleTransactorRaw struct {
+	Contract *GasPriceOracleTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewGasPriceOracle creates a new instance of GasPriceOracle, bound to a specific deployed contract.
+func NewGasPriceOracle(address common.Address, backend bind.ContractBackend) (*GasPriceOracle, error) {
+	contract, err := bindGasPriceOracle(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &GasPriceOracle{GasPriceOracleCaller: GasPriceOracleCaller{contract: contract}, GasPriceOracleTransactor: GasPriceOracleTransactor{contract: contract}, GasPriceOracleFilterer: GasPriceOracleFilterer{contract: contract}}, nil
+}
+
+// NewGasPriceOracleCaller creates a new read-only instance of GasPriceOracle, bound to a specific deployed contract.
+func NewGasPriceOracleCaller(address common.Address, caller bind.ContractCaller) (*GasPriceOracleCaller, error) {
+	contract, err := bindGasPriceOracle(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &GasPriceOracleCaller{contract: contract}, nil
+}
+
+// NewGasPriceOracleTransactor creates a new write-only instance of GasPriceOracle, bound to a specific deployed contract.
+func NewGasPriceOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*GasPriceOracleTransactor, error) {
+	contract, err := bindGasPriceOracle(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &GasPriceOracleTransactor{contract: contract}, nil
+}
+
+// NewGasPriceOracleFilterer creates a new log filterer instance of GasPriceOracle, bound to a specific deployed contract.
+func NewGasPriceOracleFilterer(address common.Address, filterer bind.ContractFilterer) (*GasPriceOracleFilterer, error) {
+	contract, err := bindGasPriceOracle(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &GasPriceOracleFilterer{contract: contract}, nil
+}
+
+// bindGasPriceOracle binds a generic wrapper to an already deployed contract.
+func bindGasPriceOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(GasPriceOracleABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_GasPriceOracle *GasPriceOracleRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _GasPriceOracle.Contract.GasPriceOracleCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_GasPriceOracle *GasPriceOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _GasPriceOracle.Contract.GasPriceOracleTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_GasPriceOracle *GasPriceOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _GasPriceOracle.Contract.GasPriceOracleTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_GasPriceOracle *GasPriceOracleCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _GasPriceOracle.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_GasPriceOracle *GasPriceOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _GasPriceOracle.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_GasPriceOracle *GasPriceOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _GasPriceOracle.Contract.contract.Transact(opts, method, params...)
+}
+
+// DECIMALS is a free data retrieval call binding the contract method 0x2e0f2625.
+//
+// Solidity: function DECIMALS() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) DECIMALS(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "DECIMALS")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// DECIMALS is a free data retrieval call binding the contract method 0x2e0f2625.
+//
+// Solidity: function DECIMALS() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) DECIMALS() (*big.Int, error) {
+	return _GasPriceOracle.Contract.DECIMALS(&_GasPriceOracle.CallOpts)
+}
+
+// DECIMALS is a free data retrieval call binding the contract method 0x2e0f2625.
+//
+// Solidity: function DECIMALS() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) DECIMALS() (*big.Int, error) {
+	return _GasPriceOracle.Contract.DECIMALS(&_GasPriceOracle.CallOpts)
+}
+
+// BaseFee is a free data retrieval call binding the contract method 0x6ef25c3a.
+//
+// Solidity: function baseFee() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) BaseFee(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "baseFee")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// BaseFee is a free data retrieval call binding the contract method 0x6ef25c3a.
+//
+// Solidity: function baseFee() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) BaseFee() (*big.Int, error) {
+	return _GasPriceOracle.Contract.BaseFee(&_GasPriceOracle.CallOpts)
+}
+
+// BaseFee is a free data retrieval call binding the contract method 0x6ef25c3a.
+//
+// Solidity: function baseFee() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) BaseFee() (*big.Int, error) {
+	return _GasPriceOracle.Contract.BaseFee(&_GasPriceOracle.CallOpts)
+}
+
+// BaseFeeScalar is a free data retrieval call binding the contract method 0xc5985918.
+//
+// Solidity: function baseFeeScalar() view returns(uint32)
+func (_GasPriceOracle *GasPriceOracleCaller) BaseFeeScalar(opts *bind.CallOpts) (uint32, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "baseFeeScalar")
+
+	if err != nil {
+		return *new(uint32), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+	return out0, err
+
+}
+
+// BaseFeeScalar is a free data retrieval call binding the contract method 0xc5985918.
+//
+// Solidity: function baseFeeScalar() view returns(uint32)
+func (_GasPriceOracle *GasPriceOracleSession) BaseFeeScalar() (uint32, error) {
+	return _GasPriceOracle.Contract.BaseFeeScalar(&_GasPriceOracle.CallOpts)
+}
+
+// BaseFeeScalar is a free data retrieval call binding the contract method 0xc5985918.
+//
+// Solidity: function baseFeeScalar() view returns(uint32)
+func (_GasPriceOracle *GasPriceOracleCallerSession) BaseFeeScalar() (uint32, error) {
+	return _GasPriceOracle.Contract.BaseFeeScalar(&_GasPriceOracle.CallOpts)
+}
+
+// BlobBaseFee is a free data retrieval call binding the contract method 0xf8206140.
+//
+// Solidity: function blobBaseFee() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) BlobBaseFee(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "blobBaseFee")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// BlobBaseFee is a free data retrieval call binding the contract method 0xf8206140.
+//
+// Solidity: function blobBaseFee() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) BlobBaseFee() (*big.Int, error) {
+	return _GasPriceOracle.Contract.BlobBaseFee(&_GasPriceOracle.CallOpts)
+}
+
+// BlobBaseFee is a free data retrieval call binding the contract method 0xf8206140.
+//
+// Solidity: function blobBaseFee() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) BlobBaseFee() (*big.Int, error) {
+	return _GasPriceOracle.Contract.BlobBaseFee(&_GasPriceOracle.CallOpts)
+}
+
+// BlobBaseFeeScalar is a free data retrieval call binding the contract method 0x68d5dca6.
+//
+// Solidity: function blobBaseFeeScalar() view returns(uint32)
+func (_GasPriceOracle *GasPriceOracleCaller) BlobBaseFeeScalar(opts *bind.CallOpts) (uint32, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "blobBaseFeeScalar")
+
+	if err != nil {
+		return *new(uint32), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+	return out0, err
+
+}
+
+// BlobBaseFeeScalar is a free data retrieval call binding the contract method 0x68d5dca6.
+//
+// Solidity: function blobBaseFeeScalar() view returns(uint32)
+func (_GasPriceOracle *GasPriceOracleSession) BlobBaseFeeScalar() (uint32, error) {
+	return _GasPriceOracle.Contract.BlobBaseFeeScalar(&_GasPriceOracle.CallOpts)
+}
+
+// BlobBaseFeeScalar is a free data retrieval call binding the contract method 0x68d5dca6.
+//
+// Solidity: function blobBaseFeeScalar() view returns(uint32)
+func (_GasPriceOracle *GasPriceOracleCallerSession) BlobBaseFeeScalar() (uint32, error) {
+	return _GasPriceOracle.Contract.BlobBaseFeeScalar(&_GasPriceOracle.CallOpts)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() pure returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) Decimals(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "decimals")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() pure returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) Decimals() (*big.Int, error) {
+	return _GasPriceOracle.Contract.Decimals(&_GasPriceOracle.CallOpts)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() pure returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) Decimals() (*big.Int, error) {
+	return _GasPriceOracle.Contract.Decimals(&_GasPriceOracle.CallOpts)
+}
+
+// GasPrice is a free data retrieval call binding the contract method 0xfe173b97.
+//
+// Solidity: function gasPrice() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) GasPrice(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "gasPrice")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GasPrice is a free data retrieval call binding the contract method 0xfe173b97.
+//
+// Solidity: function gasPrice() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) GasPrice() (*big.Int, error) {
+	return _GasPriceOracle.Contract.GasPrice(&_GasPriceOracle.CallOpts)
+}
+
+// GasPrice is a free data retrieval call binding the contract method 0xfe173b97.
+//
+// Solidity: function gasPrice() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) GasPrice() (*big.Int, error) {
+	return _GasPriceOracle.Contract.GasPrice(&_GasPriceOracle.CallOpts)
+}
+
+// GetL1Fee is a free data retrieval call binding the contract method 0x49948e0e.
+//
+// Solidity: function getL1Fee(bytes _data) view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) GetL1Fee(opts *bind.CallOpts, _data []byte) (*big.Int, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "getL1Fee", _data)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetL1Fee is a free data retrieval call binding the contract method 0x49948e0e.
+//
+// Solidity: function getL1Fee(bytes _data) view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) GetL1Fee(_data []byte) (*big.Int, error) {
+	return _GasPriceOracle.Contract.GetL1Fee(&_GasPriceOracle.CallOpts, _data)
+}
+
+// GetL1Fee is a free data retrieval call binding the contract method 0x49948e0e.
+//
+// Solidity: function getL1Fee(bytes _data) view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) GetL1Fee(_data []byte) (*big.Int, error) {
+	return _GasPriceOracle.Contract.GetL1Fee(&_GasPriceOracle.CallOpts, _data)
+}
+
+// GetL1FeeUpperBound is a free data retrieval call binding the contract method 0xf1c7a58b.
+//
+// Solidity: function getL1FeeUpperBound(uint256 _unsignedTxSize) view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) GetL1FeeUpperBound(opts *bind.CallOpts, _unsignedTxSize *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "getL1FeeUpperBound", _unsignedTxSize)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetL1FeeUpperBound is a free data retrieval call binding the contract method 0xf1c7a58b.
+//
+// Solidity: function getL1FeeUpperBound(uint256 _unsignedTxSize) view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) GetL1FeeUpperBound(_unsignedTxSize *big.Int) (*big.Int, error) {
+	return _GasPriceOracle.Contract.GetL1FeeUpperBound(&_GasPriceOracle.CallOpts, _unsignedTxSize)
+}
+
+// GetL1FeeUpperBound is a free data retrieval call binding the contract method 0xf1c7a58b.
+//
+// Solidity: function getL1FeeUpperBound(uint256 _unsignedTxSize) view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) GetL1FeeUpperBound(_unsignedTxSize *big.Int) (*big.Int, error) {
+	return _GasPriceOracle.Contract.GetL1FeeUpperBound(&_GasPriceOracle.CallOpts, _unsignedTxSize)
+}
+
+// GetL1GasUsed is a free data retrieval call binding the contract method 0xde26c4a1.
+//
+// Solidity: function getL1GasUsed(bytes _data) view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) GetL1GasUsed(opts *bind.CallOpts, _data []byte) (*big.Int, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "getL1GasUsed", _data)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetL1GasUsed is a free data retrieval call binding the contract method 0xde26c4a1.
+//
+// Solidity: function getL1GasUsed(bytes _data) view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) GetL1GasUsed(_data []byte) (*big.Int, error) {
+	return _GasPriceOracle.Contract.GetL1GasUsed(&_GasPriceOracle.CallOpts, _data)
+}
+
+// GetL1GasUsed is a free data retrieval call binding the contract method 0xde26c4a1.
+//
+// Solidity: function getL1GasUsed(bytes _data) view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) GetL1GasUsed(_data []byte) (*big.Int, error) {
+	return _GasPriceOracle.Contract.GetL1GasUsed(&_GasPriceOracle.CallOpts, _data)
+}
+
+// IsEcotone is a free data retrieval call binding the contract method 0x4ef6e224.
+//
+// Solidity: function isEcotone() view returns(bool)
+func (_GasPriceOracle *GasPriceOracleCaller) IsEcotone(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "isEcotone")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// IsEcotone is a free data retrieval call binding the contract method 0x4ef6e224.
+//
+// Solidity: function isEcotone() view returns(bool)
+func (_GasPriceOracle *GasPriceOracleSession) IsEcotone() (bool, error) {
+	return _GasPriceOracle.Contract.IsEcotone(&_GasPriceOracle.CallOpts)
+}
+
+// IsEcotone is a free data retrieval call binding the contract method 0x4ef6e224.
+//
+// Solidity: function isEcotone() view returns(bool)
+func (_GasPriceOracle *GasPriceOracleCallerSession) IsEcotone() (bool, error) {
+	return _GasPriceOracle.Contract.IsEcotone(&_GasPriceOracle.CallOpts)
+}
+
+// IsFjord is a free data retrieval call binding the contract method 0x960e3a23.
+//
+// Solidity: function isFjord() view returns(bool)
+func (_GasPriceOracle *GasPriceOracleCaller) IsFjord(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "isFjord")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// IsFjord is a free data retrieval call binding the contract method 0x960e3a23.
+//
+// Solidity: function isFjord() view returns(bool)
+func (_GasPriceOracle *GasPriceOracleSession) IsFjord() (bool, error) {
+	return _GasPriceOracle.Contract.IsFjord(&_GasPriceOracle.CallOpts)
+}
+
+// IsFjord is a free data retrieval call binding the contract method 0x960e3a23.
+//
+// Solidity: function isFjord() view returns(bool)
+func (_GasPriceOracle *GasPriceOracleCallerSession) IsFjord() (bool, error) {
+	return _GasPriceOracle.Contract.IsFjord(&_GasPriceOracle.CallOpts)
+}
+
+// L1BaseFee is a free data retrieval call binding the contract method 0x519b4bd3.
+//
+// Solidity: function l1BaseFee() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) L1BaseFee(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "l1BaseFee")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L1BaseFee is a free data retrieval call binding the contract method 0x519b4bd3.
+//
+// Solidity: function l1BaseFee() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) L1BaseFee() (*big.Int, error) {
+	return _GasPriceOracle.Contract.L1BaseFee(&_GasPriceOracle.CallOpts)
+}
+
+// L1BaseFee is a free data retrieval call binding the contract method 0x519b4bd3.
+//
+// Solidity: function l1BaseFee() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) L1BaseFee() (*big.Int, error) {
+	return _GasPriceOracle.Contract.L1BaseFee(&_GasPriceOracle.CallOpts)
+}
+
+// Overhead is a free data retrieval call binding the contract method 0x0c18c162.
+//
+// Solidity: function overhead() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) Overhead(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "overhead")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Overhead is a free data retrieval call binding the contract method 0x0c18c162.
+//
+// Solidity: function overhead() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) Overhead() (*big.Int, error) {
+	return _GasPriceOracle.Contract.Overhead(&_GasPriceOracle.CallOpts)
+}
+
+// Overhead is a free data retrieval call binding the contract method 0x0c18c162.
+//
+// Solidity: function overhead() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) Overhead() (*big.Int, error) {
+	return _GasPriceOracle.Contract.Overhead(&_GasPriceOracle.CallOpts)
+}
+
+// Scalar is a free data retrieval call binding the contract method 0xf45e65d8.
+//
+// Solidity: function scalar() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCaller) Scalar(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "scalar")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Scalar is a free data retrieval call binding the contract method 0xf45e65d8.
+//
+// Solidity: function scalar() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleSession) Scalar() (*big.Int, error) {
+	return _GasPriceOracle.Contract.Scalar(&_GasPriceOracle.CallOpts)
+}
+
+// Scalar is a free data retrieval call binding the contract method 0xf45e65d8.
+//
+// Solidity: function scalar() view returns(uint256)
+func (_GasPriceOracle *GasPriceOracleCallerSession) Scalar() (*big.Int, error) {
+	return _GasPriceOracle.Contract.Scalar(&_GasPriceOracle.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_GasPriceOracle *GasPriceOracleCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _GasPriceOracle.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_GasPriceOracle *GasPriceOracleSession) Version() (string, error) {
+	return _GasPriceOracle.Contract.Version(&_GasPriceOracle.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_GasPriceOracle *GasPriceOracleCallerSession) Version() (string, error) {
+	return _GasPriceOracle.Contract.Version(&_GasPriceOracle.CallOpts)
+}
+
+// SetEcotone is a paid mutator transaction binding the contract method 0x22b90ab3.
+//
+// Solidity: function setEcotone() returns()
+func (_GasPriceOracle *GasPriceOracleTransactor) SetEcotone(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _GasPriceOracle.contract.Transact(opts, "setEcotone")
+}
+
+// SetEcotone is a paid mutator transaction binding the contract method 0x22b90ab3.
+//
+// Solidity: function setEcotone() returns()
+func (_GasPriceOracle *GasPriceOracleSession) SetEcotone() (*types.Transaction, error) {
+	return _GasPriceOracle.Contract.SetEcotone(&_GasPriceOracle.TransactOpts)
+}
+
+// SetEcotone is a paid mutator transaction binding the contract method 0x22b90ab3.
+//
+// Solidity: function setEcotone() returns()
+func (_GasPriceOracle *GasPriceOracleTransactorSession) SetEcotone() (*types.Transaction, error) {
+	return _GasPriceOracle.Contract.SetEcotone(&_GasPriceOracle.TransactOpts)
+}
+
+// SetFjord is a paid mutator transaction binding the contract method 0x8e98b106.
+//
+// Solidity: function setFjord() returns()
+func (_GasPriceOracle *GasPriceOracleTransactor) SetFjord(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _GasPriceOracle.contract.Transact(opts, "setFjord")
+}
+
+// SetFjord is a paid mutator transaction binding the contract method 0x8e98b106.
+//
+// Solidity: function setFjord() returns()
+func (_GasPriceOracle *GasPriceOracleSession) SetFjord() (*types.Transaction, error) {
+	return _GasPriceOracle.Contract.SetFjord(&_GasPriceOracle.TransactOpts)
+}
+
+// SetFjord is a paid mutator transaction binding the contract method 0x8e98b106.
+//
+// Solidity: function setFjord() returns()
+func (_GasPriceOracle *GasPriceOracleTransactorSession) SetFjord() (*types.Transaction, error) {
+	return _GasPriceOracle.Contract.SetFjord(&_GasPriceOracle.TransactOpts)
+}
diff --git a/op-bindings/bindings/governancetoken.go b/op-e2e/bindings/governancetoken.go
similarity index 100%
rename from op-bindings/bindings/governancetoken.go
rename to op-e2e/bindings/governancetoken.go
diff --git a/op-e2e/bindings/isemver.go b/op-e2e/bindings/isemver.go
new file mode 100644
index 000000000000..66a940654d05
--- /dev/null
+++ b/op-e2e/bindings/isemver.go
@@ -0,0 +1,211 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// ISemverMetaData contains all meta data concerning the ISemver contract.
+var ISemverMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"}]",
+}
+
+// ISemverABI is the input ABI used to generate the binding from.
+// Deprecated: Use ISemverMetaData.ABI instead.
+var ISemverABI = ISemverMetaData.ABI
+
+// ISemver is an auto generated Go binding around an Ethereum contract.
+type ISemver struct {
+	ISemverCaller     // Read-only binding to the contract
+	ISemverTransactor // Write-only binding to the contract
+	ISemverFilterer   // Log filterer for contract events
+}
+
+// ISemverCaller is an auto generated read-only Go binding around an Ethereum contract.
+type ISemverCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ISemverTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type ISemverTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ISemverFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type ISemverFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ISemverSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type ISemverSession struct {
+	Contract     *ISemver          // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ISemverCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type ISemverCallerSession struct {
+	Contract *ISemverCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts  // Call options to use throughout this session
+}
+
+// ISemverTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type ISemverTransactorSession struct {
+	Contract     *ISemverTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts  // Transaction auth options to use throughout this session
+}
+
+// ISemverRaw is an auto generated low-level Go binding around an Ethereum contract.
+type ISemverRaw struct {
+	Contract *ISemver // Generic contract binding to access the raw methods on
+}
+
+// ISemverCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type ISemverCallerRaw struct {
+	Contract *ISemverCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// ISemverTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type ISemverTransactorRaw struct {
+	Contract *ISemverTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewISemver creates a new instance of ISemver, bound to a specific deployed contract.
+func NewISemver(address common.Address, backend bind.ContractBackend) (*ISemver, error) {
+	contract, err := bindISemver(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &ISemver{ISemverCaller: ISemverCaller{contract: contract}, ISemverTransactor: ISemverTransactor{contract: contract}, ISemverFilterer: ISemverFilterer{contract: contract}}, nil
+}
+
+// NewISemverCaller creates a new read-only instance of ISemver, bound to a specific deployed contract.
+func NewISemverCaller(address common.Address, caller bind.ContractCaller) (*ISemverCaller, error) {
+	contract, err := bindISemver(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &ISemverCaller{contract: contract}, nil
+}
+
+// NewISemverTransactor creates a new write-only instance of ISemver, bound to a specific deployed contract.
+func NewISemverTransactor(address common.Address, transactor bind.ContractTransactor) (*ISemverTransactor, error) {
+	contract, err := bindISemver(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &ISemverTransactor{contract: contract}, nil
+}
+
+// NewISemverFilterer creates a new log filterer instance of ISemver, bound to a specific deployed contract.
+func NewISemverFilterer(address common.Address, filterer bind.ContractFilterer) (*ISemverFilterer, error) {
+	contract, err := bindISemver(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &ISemverFilterer{contract: contract}, nil
+}
+
+// bindISemver binds a generic wrapper to an already deployed contract.
+func bindISemver(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(ISemverABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ISemver *ISemverRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _ISemver.Contract.ISemverCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ISemver *ISemverRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _ISemver.Contract.ISemverTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ISemver *ISemverRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _ISemver.Contract.ISemverTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ISemver *ISemverCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _ISemver.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ISemver *ISemverTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _ISemver.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ISemver *ISemverTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _ISemver.Contract.contract.Transact(opts, method, params...)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_ISemver *ISemverCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _ISemver.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_ISemver *ISemverSession) Version() (string, error) {
+	return _ISemver.Contract.Version(&_ISemver.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_ISemver *ISemverCallerSession) Version() (string, error) {
+	return _ISemver.Contract.Version(&_ISemver.CallOpts)
+}
diff --git a/op-e2e/bindings/l1block.go b/op-e2e/bindings/l1block.go
new file mode 100644
index 000000000000..e44c262c7dae
--- /dev/null
+++ b/op-e2e/bindings/l1block.go
@@ -0,0 +1,961 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L1BlockMetaData contains all meta data concerning the L1Block contract.
+var L1BlockMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"function\",\"name\":\"DEPOSITOR_ACCOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"baseFeeScalar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"basefee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"batcherHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blobBaseFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blobBaseFeeScalar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gasPayingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"addr_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"decimals_\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gasPayingTokenName\",\"inputs\":[],\"outputs\":[{\"name\":\"name_\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gasPayingTokenSymbol\",\"inputs\":[],\"outputs\":[{\"name\":\"symbol_\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isCustomGasToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l1FeeOverhead\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l1FeeScalar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"number\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setGasPayingToken\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_symbol\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setL1BlockValues\",\"inputs\":[{\"name\":\"_number\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_basefee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_batcherHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1FeeOverhead\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l1FeeScalar\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setL1BlockValuesEcotone\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"timestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"GasPayingTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"uint8\"},{\"name\":\"name\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"symbol\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"NotDepositor\",\"inputs\":[]}]",
+	Bin: "0x608060405234801561001057600080fd5b50610ae8806100206000396000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806371cfaa3f116100cd578063c598591811610081578063e591b28211610066578063e591b28214610331578063e81b2c6d14610371578063f82061401461037a57600080fd5b8063c598591814610309578063d84447151461032957600080fd5b80638b239f73116100b25780638b239f73146102d75780639e8c4966146102e0578063b80777ea146102e957600080fd5b806371cfaa3f146102b05780638381f58a146102c357600080fd5b806354fd4d50116101245780635cf24969116101095780635cf249691461024957806364ca23ef1461025257806368d5dca61461027f57600080fd5b806354fd4d50146101f8578063550fcdc91461024157600080fd5b8063213268491161015557806321326849146101a25780634397dfef146101ba578063440a5e20146101f057600080fd5b8063015d8eb91461017157806309bd5a6014610186575b600080fd5b61018461017f366004610953565b610383565b005b61018f60025481565b6040519081526020015b60405180910390f35b6101aa6104c2565b6040519015158152602001610199565b6101c2610501565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff909116602083015201610199565b610184610515565b6102346040518060400160405280601b81526020017f312e332e302d626574612b637573746f6d2d6761732d746f6b656e000000000081525081565b60405161019991906109c5565b61023461056a565b61018f60015481565b6003546102669067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610199565b60035461029b9068010000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610199565b6101846102be366004610a38565b610579565b6000546102669067ffffffffffffffff1681565b61018f60055481565b61018f60065481565b6000546102669068010000000000000000900467ffffffffffffffff1681565b60035461029b906c01000000000000000000000000900463ffffffff1681565b61023461062e565b61034c73deaddeaddeaddeaddeaddeaddeaddeaddead000181565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610199565b61018f60045481565b61018f60075481565b3373deaddeaddeaddeaddeaddeaddeaddeaddead00011461042a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c7565730000000000606482015260840160405180910390fd5b6000805467ffffffffffffffff98891668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116998916999099179890981790975560019490945560029290925560038054919094167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009190911617909255600491909155600555600655565b6000806104cd610501565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60008061050c610638565b90939092509050565b3373deaddeaddeaddeaddeaddeaddeaddeaddead00011461053e57633cc50b456000526004601cfd5b60043560801c60035560143560801c600055602435600155604435600755606435600255608435600455565b60606105746106b9565b905090565b3373deaddeaddeaddeaddeaddeaddeaddeaddead0001146105c6576040517f3cc50b4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105d28484848461077a565b604080518381526020810183905260ff85169173ffffffffffffffffffffffffffffffffffffffff8716917f10e43c4d58f3ef4edae7c1ca2e7f02d46b2cadbcc046737038527ed8486ffeb0910160405180910390a350505050565b606061057461084c565b6000808061066e61066a60017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec610a9d565b5490565b73ffffffffffffffffffffffffffffffffffffffff811693509050826106ad575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b606060006106c5610638565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161073e57505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b61077461076f61066a60017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd05764610a9d565b610902565b91505090565b6107e06107a860017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec610a9d565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b61081361080e60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d610a9d565b839055565b61084661084160017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd05764610a9d565b829055565b50505050565b60606000610858610638565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016108d157505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b61077461076f61066a60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d610a9d565b60405160005b82811a1561091857600101610908565b80825260208201838152600082820152505060408101604052919050565b803567ffffffffffffffff8116811461094e57600080fd5b919050565b600080600080600080600080610100898b03121561097057600080fd5b61097989610936565b975061098760208a01610936565b965060408901359550606089013594506109a360808a01610936565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600060208083528351808285015260005b818110156109f2578581018301518582016040015282016109d6565b81811115610a04576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008060008060808587031215610a4e57600080fd5b843573ffffffffffffffffffffffffffffffffffffffff81168114610a7257600080fd5b9350602085013560ff81168114610a8857600080fd5b93969395505050506040820135916060013590565b600082821015610ad6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a",
+}
+
+// L1BlockABI is the input ABI used to generate the binding from.
+// Deprecated: Use L1BlockMetaData.ABI instead.
+var L1BlockABI = L1BlockMetaData.ABI
+
+// L1BlockBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L1BlockMetaData.Bin instead.
+var L1BlockBin = L1BlockMetaData.Bin
+
+// DeployL1Block deploys a new Ethereum contract, binding an instance of L1Block to it.
+func DeployL1Block(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L1Block, error) {
+	parsed, err := L1BlockMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L1BlockBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L1Block{L1BlockCaller: L1BlockCaller{contract: contract}, L1BlockTransactor: L1BlockTransactor{contract: contract}, L1BlockFilterer: L1BlockFilterer{contract: contract}}, nil
+}
+
+// L1Block is an auto generated Go binding around an Ethereum contract.
+type L1Block struct {
+	L1BlockCaller     // Read-only binding to the contract
+	L1BlockTransactor // Write-only binding to the contract
+	L1BlockFilterer   // Log filterer for contract events
+}
+
+// L1BlockCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L1BlockCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1BlockTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L1BlockTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1BlockFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L1BlockFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1BlockSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L1BlockSession struct {
+	Contract     *L1Block          // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// L1BlockCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L1BlockCallerSession struct {
+	Contract *L1BlockCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts  // Call options to use throughout this session
+}
+
+// L1BlockTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L1BlockTransactorSession struct {
+	Contract     *L1BlockTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts  // Transaction auth options to use throughout this session
+}
+
+// L1BlockRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L1BlockRaw struct {
+	Contract *L1Block // Generic contract binding to access the raw methods on
+}
+
+// L1BlockCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L1BlockCallerRaw struct {
+	Contract *L1BlockCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L1BlockTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L1BlockTransactorRaw struct {
+	Contract *L1BlockTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL1Block creates a new instance of L1Block, bound to a specific deployed contract.
+func NewL1Block(address common.Address, backend bind.ContractBackend) (*L1Block, error) {
+	contract, err := bindL1Block(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L1Block{L1BlockCaller: L1BlockCaller{contract: contract}, L1BlockTransactor: L1BlockTransactor{contract: contract}, L1BlockFilterer: L1BlockFilterer{contract: contract}}, nil
+}
+
+// NewL1BlockCaller creates a new read-only instance of L1Block, bound to a specific deployed contract.
+func NewL1BlockCaller(address common.Address, caller bind.ContractCaller) (*L1BlockCaller, error) {
+	contract, err := bindL1Block(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1BlockCaller{contract: contract}, nil
+}
+
+// NewL1BlockTransactor creates a new write-only instance of L1Block, bound to a specific deployed contract.
+func NewL1BlockTransactor(address common.Address, transactor bind.ContractTransactor) (*L1BlockTransactor, error) {
+	contract, err := bindL1Block(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1BlockTransactor{contract: contract}, nil
+}
+
+// NewL1BlockFilterer creates a new log filterer instance of L1Block, bound to a specific deployed contract.
+func NewL1BlockFilterer(address common.Address, filterer bind.ContractFilterer) (*L1BlockFilterer, error) {
+	contract, err := bindL1Block(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L1BlockFilterer{contract: contract}, nil
+}
+
+// bindL1Block binds a generic wrapper to an already deployed contract.
+func bindL1Block(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L1BlockABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1Block *L1BlockRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1Block.Contract.L1BlockCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1Block *L1BlockRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1Block.Contract.L1BlockTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1Block *L1BlockRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1Block.Contract.L1BlockTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1Block *L1BlockCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1Block.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1Block *L1BlockTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1Block.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1Block *L1BlockTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1Block.Contract.contract.Transact(opts, method, params...)
+}
+
+// DEPOSITORACCOUNT is a free data retrieval call binding the contract method 0xe591b282.
+//
+// Solidity: function DEPOSITOR_ACCOUNT() view returns(address)
+func (_L1Block *L1BlockCaller) DEPOSITORACCOUNT(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "DEPOSITOR_ACCOUNT")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// DEPOSITORACCOUNT is a free data retrieval call binding the contract method 0xe591b282.
+//
+// Solidity: function DEPOSITOR_ACCOUNT() view returns(address)
+func (_L1Block *L1BlockSession) DEPOSITORACCOUNT() (common.Address, error) {
+	return _L1Block.Contract.DEPOSITORACCOUNT(&_L1Block.CallOpts)
+}
+
+// DEPOSITORACCOUNT is a free data retrieval call binding the contract method 0xe591b282.
+//
+// Solidity: function DEPOSITOR_ACCOUNT() view returns(address)
+func (_L1Block *L1BlockCallerSession) DEPOSITORACCOUNT() (common.Address, error) {
+	return _L1Block.Contract.DEPOSITORACCOUNT(&_L1Block.CallOpts)
+}
+
+// BaseFeeScalar is a free data retrieval call binding the contract method 0xc5985918.
+//
+// Solidity: function baseFeeScalar() view returns(uint32)
+func (_L1Block *L1BlockCaller) BaseFeeScalar(opts *bind.CallOpts) (uint32, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "baseFeeScalar")
+
+	if err != nil {
+		return *new(uint32), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+	return out0, err
+
+}
+
+// BaseFeeScalar is a free data retrieval call binding the contract method 0xc5985918.
+//
+// Solidity: function baseFeeScalar() view returns(uint32)
+func (_L1Block *L1BlockSession) BaseFeeScalar() (uint32, error) {
+	return _L1Block.Contract.BaseFeeScalar(&_L1Block.CallOpts)
+}
+
+// BaseFeeScalar is a free data retrieval call binding the contract method 0xc5985918.
+//
+// Solidity: function baseFeeScalar() view returns(uint32)
+func (_L1Block *L1BlockCallerSession) BaseFeeScalar() (uint32, error) {
+	return _L1Block.Contract.BaseFeeScalar(&_L1Block.CallOpts)
+}
+
+// Basefee is a free data retrieval call binding the contract method 0x5cf24969.
+//
+// Solidity: function basefee() view returns(uint256)
+func (_L1Block *L1BlockCaller) Basefee(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "basefee")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Basefee is a free data retrieval call binding the contract method 0x5cf24969.
+//
+// Solidity: function basefee() view returns(uint256)
+func (_L1Block *L1BlockSession) Basefee() (*big.Int, error) {
+	return _L1Block.Contract.Basefee(&_L1Block.CallOpts)
+}
+
+// Basefee is a free data retrieval call binding the contract method 0x5cf24969.
+//
+// Solidity: function basefee() view returns(uint256)
+func (_L1Block *L1BlockCallerSession) Basefee() (*big.Int, error) {
+	return _L1Block.Contract.Basefee(&_L1Block.CallOpts)
+}
+
+// BatcherHash is a free data retrieval call binding the contract method 0xe81b2c6d.
+//
+// Solidity: function batcherHash() view returns(bytes32)
+func (_L1Block *L1BlockCaller) BatcherHash(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "batcherHash")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// BatcherHash is a free data retrieval call binding the contract method 0xe81b2c6d.
+//
+// Solidity: function batcherHash() view returns(bytes32)
+func (_L1Block *L1BlockSession) BatcherHash() ([32]byte, error) {
+	return _L1Block.Contract.BatcherHash(&_L1Block.CallOpts)
+}
+
+// BatcherHash is a free data retrieval call binding the contract method 0xe81b2c6d.
+//
+// Solidity: function batcherHash() view returns(bytes32)
+func (_L1Block *L1BlockCallerSession) BatcherHash() ([32]byte, error) {
+	return _L1Block.Contract.BatcherHash(&_L1Block.CallOpts)
+}
+
+// BlobBaseFee is a free data retrieval call binding the contract method 0xf8206140.
+//
+// Solidity: function blobBaseFee() view returns(uint256)
+func (_L1Block *L1BlockCaller) BlobBaseFee(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "blobBaseFee")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// BlobBaseFee is a free data retrieval call binding the contract method 0xf8206140.
+//
+// Solidity: function blobBaseFee() view returns(uint256)
+func (_L1Block *L1BlockSession) BlobBaseFee() (*big.Int, error) {
+	return _L1Block.Contract.BlobBaseFee(&_L1Block.CallOpts)
+}
+
+// BlobBaseFee is a free data retrieval call binding the contract method 0xf8206140.
+//
+// Solidity: function blobBaseFee() view returns(uint256)
+func (_L1Block *L1BlockCallerSession) BlobBaseFee() (*big.Int, error) {
+	return _L1Block.Contract.BlobBaseFee(&_L1Block.CallOpts)
+}
+
+// BlobBaseFeeScalar is a free data retrieval call binding the contract method 0x68d5dca6.
+//
+// Solidity: function blobBaseFeeScalar() view returns(uint32)
+func (_L1Block *L1BlockCaller) BlobBaseFeeScalar(opts *bind.CallOpts) (uint32, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "blobBaseFeeScalar")
+
+	if err != nil {
+		return *new(uint32), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+	return out0, err
+
+}
+
+// BlobBaseFeeScalar is a free data retrieval call binding the contract method 0x68d5dca6.
+//
+// Solidity: function blobBaseFeeScalar() view returns(uint32)
+func (_L1Block *L1BlockSession) BlobBaseFeeScalar() (uint32, error) {
+	return _L1Block.Contract.BlobBaseFeeScalar(&_L1Block.CallOpts)
+}
+
+// BlobBaseFeeScalar is a free data retrieval call binding the contract method 0x68d5dca6.
+//
+// Solidity: function blobBaseFeeScalar() view returns(uint32)
+func (_L1Block *L1BlockCallerSession) BlobBaseFeeScalar() (uint32, error) {
+	return _L1Block.Contract.BlobBaseFeeScalar(&_L1Block.CallOpts)
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_L1Block *L1BlockCaller) GasPayingToken(opts *bind.CallOpts) (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "gasPayingToken")
+
+	outstruct := new(struct {
+		Addr     common.Address
+		Decimals uint8
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.Addr = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+	outstruct.Decimals = *abi.ConvertType(out[1], new(uint8)).(*uint8)
+
+	return *outstruct, err
+
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_L1Block *L1BlockSession) GasPayingToken() (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	return _L1Block.Contract.GasPayingToken(&_L1Block.CallOpts)
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_L1Block *L1BlockCallerSession) GasPayingToken() (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	return _L1Block.Contract.GasPayingToken(&_L1Block.CallOpts)
+}
+
+// GasPayingTokenName is a free data retrieval call binding the contract method 0xd8444715.
+//
+// Solidity: function gasPayingTokenName() view returns(string name_)
+func (_L1Block *L1BlockCaller) GasPayingTokenName(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "gasPayingTokenName")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// GasPayingTokenName is a free data retrieval call binding the contract method 0xd8444715.
+//
+// Solidity: function gasPayingTokenName() view returns(string name_)
+func (_L1Block *L1BlockSession) GasPayingTokenName() (string, error) {
+	return _L1Block.Contract.GasPayingTokenName(&_L1Block.CallOpts)
+}
+
+// GasPayingTokenName is a free data retrieval call binding the contract method 0xd8444715.
+//
+// Solidity: function gasPayingTokenName() view returns(string name_)
+func (_L1Block *L1BlockCallerSession) GasPayingTokenName() (string, error) {
+	return _L1Block.Contract.GasPayingTokenName(&_L1Block.CallOpts)
+}
+
+// GasPayingTokenSymbol is a free data retrieval call binding the contract method 0x550fcdc9.
+//
+// Solidity: function gasPayingTokenSymbol() view returns(string symbol_)
+func (_L1Block *L1BlockCaller) GasPayingTokenSymbol(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "gasPayingTokenSymbol")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// GasPayingTokenSymbol is a free data retrieval call binding the contract method 0x550fcdc9.
+//
+// Solidity: function gasPayingTokenSymbol() view returns(string symbol_)
+func (_L1Block *L1BlockSession) GasPayingTokenSymbol() (string, error) {
+	return _L1Block.Contract.GasPayingTokenSymbol(&_L1Block.CallOpts)
+}
+
+// GasPayingTokenSymbol is a free data retrieval call binding the contract method 0x550fcdc9.
+//
+// Solidity: function gasPayingTokenSymbol() view returns(string symbol_)
+func (_L1Block *L1BlockCallerSession) GasPayingTokenSymbol() (string, error) {
+	return _L1Block.Contract.GasPayingTokenSymbol(&_L1Block.CallOpts)
+}
+
+// Hash is a free data retrieval call binding the contract method 0x09bd5a60.
+//
+// Solidity: function hash() view returns(bytes32)
+func (_L1Block *L1BlockCaller) Hash(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "hash")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// Hash is a free data retrieval call binding the contract method 0x09bd5a60.
+//
+// Solidity: function hash() view returns(bytes32)
+func (_L1Block *L1BlockSession) Hash() ([32]byte, error) {
+	return _L1Block.Contract.Hash(&_L1Block.CallOpts)
+}
+
+// Hash is a free data retrieval call binding the contract method 0x09bd5a60.
+//
+// Solidity: function hash() view returns(bytes32)
+func (_L1Block *L1BlockCallerSession) Hash() ([32]byte, error) {
+	return _L1Block.Contract.Hash(&_L1Block.CallOpts)
+}
+
+// IsCustomGasToken is a free data retrieval call binding the contract method 0x21326849.
+//
+// Solidity: function isCustomGasToken() view returns(bool)
+func (_L1Block *L1BlockCaller) IsCustomGasToken(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "isCustomGasToken")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// IsCustomGasToken is a free data retrieval call binding the contract method 0x21326849.
+//
+// Solidity: function isCustomGasToken() view returns(bool)
+func (_L1Block *L1BlockSession) IsCustomGasToken() (bool, error) {
+	return _L1Block.Contract.IsCustomGasToken(&_L1Block.CallOpts)
+}
+
+// IsCustomGasToken is a free data retrieval call binding the contract method 0x21326849.
+//
+// Solidity: function isCustomGasToken() view returns(bool)
+func (_L1Block *L1BlockCallerSession) IsCustomGasToken() (bool, error) {
+	return _L1Block.Contract.IsCustomGasToken(&_L1Block.CallOpts)
+}
+
+// L1FeeOverhead is a free data retrieval call binding the contract method 0x8b239f73.
+//
+// Solidity: function l1FeeOverhead() view returns(uint256)
+func (_L1Block *L1BlockCaller) L1FeeOverhead(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "l1FeeOverhead")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L1FeeOverhead is a free data retrieval call binding the contract method 0x8b239f73.
+//
+// Solidity: function l1FeeOverhead() view returns(uint256)
+func (_L1Block *L1BlockSession) L1FeeOverhead() (*big.Int, error) {
+	return _L1Block.Contract.L1FeeOverhead(&_L1Block.CallOpts)
+}
+
+// L1FeeOverhead is a free data retrieval call binding the contract method 0x8b239f73.
+//
+// Solidity: function l1FeeOverhead() view returns(uint256)
+func (_L1Block *L1BlockCallerSession) L1FeeOverhead() (*big.Int, error) {
+	return _L1Block.Contract.L1FeeOverhead(&_L1Block.CallOpts)
+}
+
+// L1FeeScalar is a free data retrieval call binding the contract method 0x9e8c4966.
+//
+// Solidity: function l1FeeScalar() view returns(uint256)
+func (_L1Block *L1BlockCaller) L1FeeScalar(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "l1FeeScalar")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L1FeeScalar is a free data retrieval call binding the contract method 0x9e8c4966.
+//
+// Solidity: function l1FeeScalar() view returns(uint256)
+func (_L1Block *L1BlockSession) L1FeeScalar() (*big.Int, error) {
+	return _L1Block.Contract.L1FeeScalar(&_L1Block.CallOpts)
+}
+
+// L1FeeScalar is a free data retrieval call binding the contract method 0x9e8c4966.
+//
+// Solidity: function l1FeeScalar() view returns(uint256)
+func (_L1Block *L1BlockCallerSession) L1FeeScalar() (*big.Int, error) {
+	return _L1Block.Contract.L1FeeScalar(&_L1Block.CallOpts)
+}
+
+// Number is a free data retrieval call binding the contract method 0x8381f58a.
+//
+// Solidity: function number() view returns(uint64)
+func (_L1Block *L1BlockCaller) Number(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "number")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// Number is a free data retrieval call binding the contract method 0x8381f58a.
+//
+// Solidity: function number() view returns(uint64)
+func (_L1Block *L1BlockSession) Number() (uint64, error) {
+	return _L1Block.Contract.Number(&_L1Block.CallOpts)
+}
+
+// Number is a free data retrieval call binding the contract method 0x8381f58a.
+//
+// Solidity: function number() view returns(uint64)
+func (_L1Block *L1BlockCallerSession) Number() (uint64, error) {
+	return _L1Block.Contract.Number(&_L1Block.CallOpts)
+}
+
+// SequenceNumber is a free data retrieval call binding the contract method 0x64ca23ef.
+//
+// Solidity: function sequenceNumber() view returns(uint64)
+func (_L1Block *L1BlockCaller) SequenceNumber(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "sequenceNumber")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// SequenceNumber is a free data retrieval call binding the contract method 0x64ca23ef.
+//
+// Solidity: function sequenceNumber() view returns(uint64)
+func (_L1Block *L1BlockSession) SequenceNumber() (uint64, error) {
+	return _L1Block.Contract.SequenceNumber(&_L1Block.CallOpts)
+}
+
+// SequenceNumber is a free data retrieval call binding the contract method 0x64ca23ef.
+//
+// Solidity: function sequenceNumber() view returns(uint64)
+func (_L1Block *L1BlockCallerSession) SequenceNumber() (uint64, error) {
+	return _L1Block.Contract.SequenceNumber(&_L1Block.CallOpts)
+}
+
+// Timestamp is a free data retrieval call binding the contract method 0xb80777ea.
+//
+// Solidity: function timestamp() view returns(uint64)
+func (_L1Block *L1BlockCaller) Timestamp(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "timestamp")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// Timestamp is a free data retrieval call binding the contract method 0xb80777ea.
+//
+// Solidity: function timestamp() view returns(uint64)
+func (_L1Block *L1BlockSession) Timestamp() (uint64, error) {
+	return _L1Block.Contract.Timestamp(&_L1Block.CallOpts)
+}
+
+// Timestamp is a free data retrieval call binding the contract method 0xb80777ea.
+//
+// Solidity: function timestamp() view returns(uint64)
+func (_L1Block *L1BlockCallerSession) Timestamp() (uint64, error) {
+	return _L1Block.Contract.Timestamp(&_L1Block.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1Block *L1BlockCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L1Block.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1Block *L1BlockSession) Version() (string, error) {
+	return _L1Block.Contract.Version(&_L1Block.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1Block *L1BlockCallerSession) Version() (string, error) {
+	return _L1Block.Contract.Version(&_L1Block.CallOpts)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_L1Block *L1BlockTransactor) SetGasPayingToken(opts *bind.TransactOpts, _token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _L1Block.contract.Transact(opts, "setGasPayingToken", _token, _decimals, _name, _symbol)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_L1Block *L1BlockSession) SetGasPayingToken(_token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _L1Block.Contract.SetGasPayingToken(&_L1Block.TransactOpts, _token, _decimals, _name, _symbol)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_L1Block *L1BlockTransactorSession) SetGasPayingToken(_token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _L1Block.Contract.SetGasPayingToken(&_L1Block.TransactOpts, _token, _decimals, _name, _symbol)
+}
+
+// SetL1BlockValues is a paid mutator transaction binding the contract method 0x015d8eb9.
+//
+// Solidity: function setL1BlockValues(uint64 _number, uint64 _timestamp, uint256 _basefee, bytes32 _hash, uint64 _sequenceNumber, bytes32 _batcherHash, uint256 _l1FeeOverhead, uint256 _l1FeeScalar) returns()
+func (_L1Block *L1BlockTransactor) SetL1BlockValues(opts *bind.TransactOpts, _number uint64, _timestamp uint64, _basefee *big.Int, _hash [32]byte, _sequenceNumber uint64, _batcherHash [32]byte, _l1FeeOverhead *big.Int, _l1FeeScalar *big.Int) (*types.Transaction, error) {
+	return _L1Block.contract.Transact(opts, "setL1BlockValues", _number, _timestamp, _basefee, _hash, _sequenceNumber, _batcherHash, _l1FeeOverhead, _l1FeeScalar)
+}
+
+// SetL1BlockValues is a paid mutator transaction binding the contract method 0x015d8eb9.
+//
+// Solidity: function setL1BlockValues(uint64 _number, uint64 _timestamp, uint256 _basefee, bytes32 _hash, uint64 _sequenceNumber, bytes32 _batcherHash, uint256 _l1FeeOverhead, uint256 _l1FeeScalar) returns()
+func (_L1Block *L1BlockSession) SetL1BlockValues(_number uint64, _timestamp uint64, _basefee *big.Int, _hash [32]byte, _sequenceNumber uint64, _batcherHash [32]byte, _l1FeeOverhead *big.Int, _l1FeeScalar *big.Int) (*types.Transaction, error) {
+	return _L1Block.Contract.SetL1BlockValues(&_L1Block.TransactOpts, _number, _timestamp, _basefee, _hash, _sequenceNumber, _batcherHash, _l1FeeOverhead, _l1FeeScalar)
+}
+
+// SetL1BlockValues is a paid mutator transaction binding the contract method 0x015d8eb9.
+//
+// Solidity: function setL1BlockValues(uint64 _number, uint64 _timestamp, uint256 _basefee, bytes32 _hash, uint64 _sequenceNumber, bytes32 _batcherHash, uint256 _l1FeeOverhead, uint256 _l1FeeScalar) returns()
+func (_L1Block *L1BlockTransactorSession) SetL1BlockValues(_number uint64, _timestamp uint64, _basefee *big.Int, _hash [32]byte, _sequenceNumber uint64, _batcherHash [32]byte, _l1FeeOverhead *big.Int, _l1FeeScalar *big.Int) (*types.Transaction, error) {
+	return _L1Block.Contract.SetL1BlockValues(&_L1Block.TransactOpts, _number, _timestamp, _basefee, _hash, _sequenceNumber, _batcherHash, _l1FeeOverhead, _l1FeeScalar)
+}
+
+// SetL1BlockValuesEcotone is a paid mutator transaction binding the contract method 0x440a5e20.
+//
+// Solidity: function setL1BlockValuesEcotone() returns()
+func (_L1Block *L1BlockTransactor) SetL1BlockValuesEcotone(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1Block.contract.Transact(opts, "setL1BlockValuesEcotone")
+}
+
+// SetL1BlockValuesEcotone is a paid mutator transaction binding the contract method 0x440a5e20.
+//
+// Solidity: function setL1BlockValuesEcotone() returns()
+func (_L1Block *L1BlockSession) SetL1BlockValuesEcotone() (*types.Transaction, error) {
+	return _L1Block.Contract.SetL1BlockValuesEcotone(&_L1Block.TransactOpts)
+}
+
+// SetL1BlockValuesEcotone is a paid mutator transaction binding the contract method 0x440a5e20.
+//
+// Solidity: function setL1BlockValuesEcotone() returns()
+func (_L1Block *L1BlockTransactorSession) SetL1BlockValuesEcotone() (*types.Transaction, error) {
+	return _L1Block.Contract.SetL1BlockValuesEcotone(&_L1Block.TransactOpts)
+}
+
+// L1BlockGasPayingTokenSetIterator is returned from FilterGasPayingTokenSet and is used to iterate over the raw logs and unpacked data for GasPayingTokenSet events raised by the L1Block contract.
+type L1BlockGasPayingTokenSetIterator struct {
+	Event *L1BlockGasPayingTokenSet // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1BlockGasPayingTokenSetIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1BlockGasPayingTokenSet)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1BlockGasPayingTokenSet)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1BlockGasPayingTokenSetIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1BlockGasPayingTokenSetIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1BlockGasPayingTokenSet represents a GasPayingTokenSet event raised by the L1Block contract.
+type L1BlockGasPayingTokenSet struct {
+	Token    common.Address
+	Decimals uint8
+	Name     [32]byte
+	Symbol   [32]byte
+	Raw      types.Log // Blockchain specific contextual infos
+}
+
+// FilterGasPayingTokenSet is a free log retrieval operation binding the contract event 0x10e43c4d58f3ef4edae7c1ca2e7f02d46b2cadbcc046737038527ed8486ffeb0.
+//
+// Solidity: event GasPayingTokenSet(address indexed token, uint8 indexed decimals, bytes32 name, bytes32 symbol)
+func (_L1Block *L1BlockFilterer) FilterGasPayingTokenSet(opts *bind.FilterOpts, token []common.Address, decimals []uint8) (*L1BlockGasPayingTokenSetIterator, error) {
+
+	var tokenRule []interface{}
+	for _, tokenItem := range token {
+		tokenRule = append(tokenRule, tokenItem)
+	}
+	var decimalsRule []interface{}
+	for _, decimalsItem := range decimals {
+		decimalsRule = append(decimalsRule, decimalsItem)
+	}
+
+	logs, sub, err := _L1Block.contract.FilterLogs(opts, "GasPayingTokenSet", tokenRule, decimalsRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1BlockGasPayingTokenSetIterator{contract: _L1Block.contract, event: "GasPayingTokenSet", logs: logs, sub: sub}, nil
+}
+
+// WatchGasPayingTokenSet is a free log subscription operation binding the contract event 0x10e43c4d58f3ef4edae7c1ca2e7f02d46b2cadbcc046737038527ed8486ffeb0.
+//
+// Solidity: event GasPayingTokenSet(address indexed token, uint8 indexed decimals, bytes32 name, bytes32 symbol)
+func (_L1Block *L1BlockFilterer) WatchGasPayingTokenSet(opts *bind.WatchOpts, sink chan<- *L1BlockGasPayingTokenSet, token []common.Address, decimals []uint8) (event.Subscription, error) {
+
+	var tokenRule []interface{}
+	for _, tokenItem := range token {
+		tokenRule = append(tokenRule, tokenItem)
+	}
+	var decimalsRule []interface{}
+	for _, decimalsItem := range decimals {
+		decimalsRule = append(decimalsRule, decimalsItem)
+	}
+
+	logs, sub, err := _L1Block.contract.WatchLogs(opts, "GasPayingTokenSet", tokenRule, decimalsRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1BlockGasPayingTokenSet)
+				if err := _L1Block.contract.UnpackLog(event, "GasPayingTokenSet", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseGasPayingTokenSet is a log parse operation binding the contract event 0x10e43c4d58f3ef4edae7c1ca2e7f02d46b2cadbcc046737038527ed8486ffeb0.
+//
+// Solidity: event GasPayingTokenSet(address indexed token, uint8 indexed decimals, bytes32 name, bytes32 symbol)
+func (_L1Block *L1BlockFilterer) ParseGasPayingTokenSet(log types.Log) (*L1BlockGasPayingTokenSet, error) {
+	event := new(L1BlockGasPayingTokenSet)
+	if err := _L1Block.contract.UnpackLog(event, "GasPayingTokenSet", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-bindings/bindings/l1blocknumber.go b/op-e2e/bindings/l1blocknumber.go
similarity index 100%
rename from op-bindings/bindings/l1blocknumber.go
rename to op-e2e/bindings/l1blocknumber.go
diff --git a/op-e2e/bindings/l1crossdomainmessenger.go b/op-e2e/bindings/l1crossdomainmessenger.go
new file mode 100644
index 000000000000..d8901d85eccd
--- /dev/null
+++ b/op-e2e/bindings/l1crossdomainmessenger.go
@@ -0,0 +1,1631 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L1CrossDomainMessengerMetaData contains all meta data concerning the L1CrossDomainMessenger contract.
+var L1CrossDomainMessengerMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MESSAGE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_CALLDATA_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OTHER_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PORTAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOptimismPortal\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_CALL_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_CONSTANT_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_GAS_CHECK_BUFFER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_RESERVED_GAS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"baseGas\",\"inputs\":[{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"failedMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"},{\"name\":\"_portal\",\"type\":\"address\",\"internalType\":\"contractOptimismPortal\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"messageNonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"otherMessenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"portal\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractOptimismPortal\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"relayMessage\",\"inputs\":[{\"name\":\"_nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"successfulMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"xDomainMessageSender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"FailedRelayedMessage\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RelayedMessage\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SentMessage\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"messageNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SentMessageExtension1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+	Bin: "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028e565b600054600160a81b900460ff16158080156200004f57506000546001600160a01b90910460ff16105b806200008657506200006c30620001c860201b620015b71760201c565b158015620000865750600054600160a01b900460ff166001145b620000ef5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a01b1916600160a01b17905580156200011d576000805460ff60a81b1916600160a81b1790555b60fb80546001600160a01b038087166001600160a01b03199283161790925560fc805486841690831617905560fd80549285169290911691909117905562000179734200000000000000000000000000000000000007620001d7565b8015620001c2576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054600160a81b900460ff16620002465760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000e6565b60cc546001600160a01b03166200026c5760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b6121a3806200029e6000396000f3fe60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdf565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280601b81526020017f322e342e302d626574612b637573746f6d2d6761732d746f6b656e000000000081525081565b6040516101ba9190611cb1565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611ccb565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611ccb565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce4565b6109bd565b34801561048757600080fd5b506102a6610496366004611d38565b610a2b565b6102a66104a9366004611d83565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eb1565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611eff565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f50565b6109e39190611f80565b6109ee601088611f50565b6109fb9062030d40611fce565b610a059190611fce565b610a0f9190611fce565b610a199190611fce565b610a239190611fce565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ffa565b600081815260ce602052604090205460ff1615610f4457610f44611ffa565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fce565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612029565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ffa565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611983565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611673908890839089906000908990600401612040565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a20565b805190602001209050949350505050565b6000611816878787878787611ab9565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612098565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906120b5565b90939092509050565b606084848484604051602401611a3994939291906120f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad69695949392919061213f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7a57600080fd5b50565b60008083601f840112611b8f57600080fd5b50813567ffffffffffffffff811115611ba757600080fd5b602083019150836020828501011115611bbf57600080fd5b9250929050565b803563ffffffff81168114611bda57600080fd5b919050565b60008060008060608587031215611bf557600080fd5b8435611c0081611b58565b9350602085013567ffffffffffffffff811115611c1c57600080fd5b611c2887828801611b7d565b9094509250611c3b905060408601611bc6565b905092959194509250565b6000815180845260005b81811015611c6c57602081850181015186830182015201611c50565b81811115611c7e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc46020830184611c46565b9392505050565b600060208284031215611cdd57600080fd5b5035919050565b600080600060408486031215611cf957600080fd5b833567ffffffffffffffff811115611d1057600080fd5b611d1c86828701611b7d565b9094509250611d2f905060208501611bc6565b90509250925092565b600080600060608486031215611d4d57600080fd5b8335611d5881611b58565b92506020840135611d6881611b58565b91506040840135611d7881611b58565b809150509250925092565b600080600080600080600060c0888a031215611d9e57600080fd5b873596506020880135611db081611b58565b95506040880135611dc081611b58565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611dea57600080fd5b611df68a828b01611b7d565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea460c083018486611e09565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611ee1608083018688611e09565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f1157600080fd5b81518015158114611cc457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7757611f77611f21565b02949350505050565b600067ffffffffffffffff80841680611fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ff157611ff1611f21565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203b5761203b611f21565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208d60a0830184611c46565b979650505050505050565b6000602082840312156120aa57600080fd5b8151611cc481611b58565b600080604083850312156120c857600080fd5b82516120d381611b58565b602084015190925060ff811681146120ea57600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212e6080830185611c46565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218a60c0830184611c46565b9897505050505050505056fea164736f6c634300080f000a",
+}
+
+// L1CrossDomainMessengerABI is the input ABI used to generate the binding from.
+// Deprecated: Use L1CrossDomainMessengerMetaData.ABI instead.
+var L1CrossDomainMessengerABI = L1CrossDomainMessengerMetaData.ABI
+
+// L1CrossDomainMessengerBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L1CrossDomainMessengerMetaData.Bin instead.
+var L1CrossDomainMessengerBin = L1CrossDomainMessengerMetaData.Bin
+
+// DeployL1CrossDomainMessenger deploys a new Ethereum contract, binding an instance of L1CrossDomainMessenger to it.
+func DeployL1CrossDomainMessenger(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L1CrossDomainMessenger, error) {
+	parsed, err := L1CrossDomainMessengerMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L1CrossDomainMessengerBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L1CrossDomainMessenger{L1CrossDomainMessengerCaller: L1CrossDomainMessengerCaller{contract: contract}, L1CrossDomainMessengerTransactor: L1CrossDomainMessengerTransactor{contract: contract}, L1CrossDomainMessengerFilterer: L1CrossDomainMessengerFilterer{contract: contract}}, nil
+}
+
+// L1CrossDomainMessenger is an auto generated Go binding around an Ethereum contract.
+type L1CrossDomainMessenger struct {
+	L1CrossDomainMessengerCaller     // Read-only binding to the contract
+	L1CrossDomainMessengerTransactor // Write-only binding to the contract
+	L1CrossDomainMessengerFilterer   // Log filterer for contract events
+}
+
+// L1CrossDomainMessengerCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1CrossDomainMessengerTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1CrossDomainMessengerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L1CrossDomainMessengerFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1CrossDomainMessengerSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L1CrossDomainMessengerSession struct {
+	Contract     *L1CrossDomainMessenger // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts           // Call options to use throughout this session
+	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
+}
+
+// L1CrossDomainMessengerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L1CrossDomainMessengerCallerSession struct {
+	Contract *L1CrossDomainMessengerCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts                 // Call options to use throughout this session
+}
+
+// L1CrossDomainMessengerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L1CrossDomainMessengerTransactorSession struct {
+	Contract     *L1CrossDomainMessengerTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
+}
+
+// L1CrossDomainMessengerRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L1CrossDomainMessengerRaw struct {
+	Contract *L1CrossDomainMessenger // Generic contract binding to access the raw methods on
+}
+
+// L1CrossDomainMessengerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerCallerRaw struct {
+	Contract *L1CrossDomainMessengerCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L1CrossDomainMessengerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L1CrossDomainMessengerTransactorRaw struct {
+	Contract *L1CrossDomainMessengerTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL1CrossDomainMessenger creates a new instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessenger(address common.Address, backend bind.ContractBackend) (*L1CrossDomainMessenger, error) {
+	contract, err := bindL1CrossDomainMessenger(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessenger{L1CrossDomainMessengerCaller: L1CrossDomainMessengerCaller{contract: contract}, L1CrossDomainMessengerTransactor: L1CrossDomainMessengerTransactor{contract: contract}, L1CrossDomainMessengerFilterer: L1CrossDomainMessengerFilterer{contract: contract}}, nil
+}
+
+// NewL1CrossDomainMessengerCaller creates a new read-only instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessengerCaller(address common.Address, caller bind.ContractCaller) (*L1CrossDomainMessengerCaller, error) {
+	contract, err := bindL1CrossDomainMessenger(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerCaller{contract: contract}, nil
+}
+
+// NewL1CrossDomainMessengerTransactor creates a new write-only instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessengerTransactor(address common.Address, transactor bind.ContractTransactor) (*L1CrossDomainMessengerTransactor, error) {
+	contract, err := bindL1CrossDomainMessenger(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerTransactor{contract: contract}, nil
+}
+
+// NewL1CrossDomainMessengerFilterer creates a new log filterer instance of L1CrossDomainMessenger, bound to a specific deployed contract.
+func NewL1CrossDomainMessengerFilterer(address common.Address, filterer bind.ContractFilterer) (*L1CrossDomainMessengerFilterer, error) {
+	contract, err := bindL1CrossDomainMessenger(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerFilterer{contract: contract}, nil
+}
+
+// bindL1CrossDomainMessenger binds a generic wrapper to an already deployed contract.
+func bindL1CrossDomainMessenger(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L1CrossDomainMessengerABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1CrossDomainMessenger.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MESSAGEVERSION(opts *bind.CallOpts) (uint16, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MESSAGE_VERSION")
+
+	if err != nil {
+		return *new(uint16), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
+
+	return out0, err
+
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MESSAGEVERSION() (uint16, error) {
+	return _L1CrossDomainMessenger.Contract.MESSAGEVERSION(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MESSAGEVERSION() (uint16, error) {
+	return _L1CrossDomainMessenger.Contract.MESSAGEVERSION(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASCALLDATAOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_CALLDATA_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADDENOMINATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADNUMERATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) OTHERMESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "OTHER_MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) OTHERMESSENGER() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OTHERMESSENGER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) OTHERMESSENGER() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OTHERMESSENGER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// PORTAL is a free data retrieval call binding the contract method 0x0ff754ea.
+//
+// Solidity: function PORTAL() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) PORTAL(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "PORTAL")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// PORTAL is a free data retrieval call binding the contract method 0x0ff754ea.
+//
+// Solidity: function PORTAL() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) PORTAL() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.PORTAL(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// PORTAL is a free data retrieval call binding the contract method 0x0ff754ea.
+//
+// Solidity: function PORTAL() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) PORTAL() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.PORTAL(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYCALLOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CALL_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYCONSTANTOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CONSTANT_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYGASCHECKBUFFER(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_GAS_CHECK_BUFFER")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) RELAYRESERVEDGAS(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "RELAY_RESERVED_GAS")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) BaseGas(opts *bind.CallOpts, _message []byte, _minGasLimit uint32) (uint64, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "baseGas", _message, _minGasLimit)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.BaseGas(&_L1CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _L1CrossDomainMessenger.Contract.BaseGas(&_L1CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) FailedMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "failedMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.FailedMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.FailedMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MessageNonce(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "messageNonce")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MessageNonce() (*big.Int, error) {
+	return _L1CrossDomainMessenger.Contract.MessageNonce(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MessageNonce() (*big.Int, error) {
+	return _L1CrossDomainMessenger.Contract.MessageNonce(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) OtherMessenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "otherMessenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) OtherMessenger() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OtherMessenger(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) OtherMessenger() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.OtherMessenger(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Paused() (bool, error) {
+	return _L1CrossDomainMessenger.Contract.Paused(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Paused() (bool, error) {
+	return _L1CrossDomainMessenger.Contract.Paused(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Portal is a free data retrieval call binding the contract method 0x6425666b.
+//
+// Solidity: function portal() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Portal(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "portal")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Portal is a free data retrieval call binding the contract method 0x6425666b.
+//
+// Solidity: function portal() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Portal() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.Portal(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Portal is a free data retrieval call binding the contract method 0x6425666b.
+//
+// Solidity: function portal() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Portal() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.Portal(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) SuccessfulMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "successfulMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.SuccessfulMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _L1CrossDomainMessenger.Contract.SuccessfulMessages(&_L1CrossDomainMessenger.CallOpts, arg0)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SuperchainConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SuperchainConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) SuperchainConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SuperchainConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) SystemConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "systemConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SystemConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SystemConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) SystemConfig() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.SystemConfig(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Version() (string, error) {
+	return _L1CrossDomainMessenger.Contract.Version(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Version() (string, error) {
+	return _L1CrossDomainMessenger.Contract.Version(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) XDomainMessageSender(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1CrossDomainMessenger.contract.Call(opts, &out, "xDomainMessageSender")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) XDomainMessageSender() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.XDomainMessageSender(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) XDomainMessageSender() (common.Address, error) {
+	return _L1CrossDomainMessenger.Contract.XDomainMessageSender(&_L1CrossDomainMessenger.CallOpts)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _superchainConfig, address _portal, address _systemConfig) returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) Initialize(opts *bind.TransactOpts, _superchainConfig common.Address, _portal common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.contract.Transact(opts, "initialize", _superchainConfig, _portal, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _superchainConfig, address _portal, address _systemConfig) returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Initialize(_superchainConfig common.Address, _portal common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.Initialize(&_L1CrossDomainMessenger.TransactOpts, _superchainConfig, _portal, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _superchainConfig, address _portal, address _systemConfig) returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) Initialize(_superchainConfig common.Address, _portal common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.Initialize(&_L1CrossDomainMessenger.TransactOpts, _superchainConfig, _portal, _systemConfig)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) RelayMessage(opts *bind.TransactOpts, _nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.contract.Transact(opts, "relayMessage", _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.RelayMessage(&_L1CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.RelayMessage(&_L1CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) SendMessage(opts *bind.TransactOpts, _target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.contract.Transact(opts, "sendMessage", _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.SendMessage(&_L1CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L1CrossDomainMessenger.Contract.SendMessage(&_L1CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// L1CrossDomainMessengerFailedRelayedMessageIterator is returned from FilterFailedRelayedMessage and is used to iterate over the raw logs and unpacked data for FailedRelayedMessage events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerFailedRelayedMessageIterator struct {
+	Event *L1CrossDomainMessengerFailedRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerFailedRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerFailedRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerFailedRelayedMessage represents a FailedRelayedMessage event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerFailedRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterFailedRelayedMessage is a free log retrieval operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterFailedRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L1CrossDomainMessengerFailedRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerFailedRelayedMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "FailedRelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchFailedRelayedMessage is a free log subscription operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchFailedRelayedMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerFailedRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerFailedRelayedMessage)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseFailedRelayedMessage is a log parse operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseFailedRelayedMessage(log types.Log) (*L1CrossDomainMessengerFailedRelayedMessage, error) {
+	event := new(L1CrossDomainMessengerFailedRelayedMessage)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerInitializedIterator struct {
+	Event *L1CrossDomainMessengerInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerInitialized represents a Initialized event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterInitialized(opts *bind.FilterOpts) (*L1CrossDomainMessengerInitializedIterator, error) {
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerInitializedIterator{contract: _L1CrossDomainMessenger.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerInitialized)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseInitialized(log types.Log) (*L1CrossDomainMessengerInitialized, error) {
+	event := new(L1CrossDomainMessengerInitialized)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerRelayedMessageIterator is returned from FilterRelayedMessage and is used to iterate over the raw logs and unpacked data for RelayedMessage events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerRelayedMessageIterator struct {
+	Event *L1CrossDomainMessengerRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerRelayedMessage represents a RelayedMessage event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterRelayedMessage is a free log retrieval operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L1CrossDomainMessengerRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerRelayedMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "RelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchRelayedMessage is a free log subscription operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchRelayedMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerRelayedMessage)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseRelayedMessage is a log parse operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseRelayedMessage(log types.Log) (*L1CrossDomainMessengerRelayedMessage, error) {
+	event := new(L1CrossDomainMessengerRelayedMessage)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerSentMessageIterator is returned from FilterSentMessage and is used to iterate over the raw logs and unpacked data for SentMessage events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessageIterator struct {
+	Event *L1CrossDomainMessengerSentMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerSentMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerSentMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerSentMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerSentMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerSentMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerSentMessage represents a SentMessage event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessage struct {
+	Target       common.Address
+	Sender       common.Address
+	Message      []byte
+	MessageNonce *big.Int
+	GasLimit     *big.Int
+	Raw          types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessage is a free log retrieval operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterSentMessage(opts *bind.FilterOpts, target []common.Address) (*L1CrossDomainMessengerSentMessageIterator, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerSentMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "SentMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessage is a free log subscription operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchSentMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerSentMessage, target []common.Address) (event.Subscription, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerSentMessage)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessage is a log parse operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseSentMessage(log types.Log) (*L1CrossDomainMessengerSentMessage, error) {
+	event := new(L1CrossDomainMessengerSentMessage)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1CrossDomainMessengerSentMessageExtension1Iterator is returned from FilterSentMessageExtension1 and is used to iterate over the raw logs and unpacked data for SentMessageExtension1 events raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessageExtension1Iterator struct {
+	Event *L1CrossDomainMessengerSentMessageExtension1 // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1CrossDomainMessengerSentMessageExtension1)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1CrossDomainMessengerSentMessageExtension1)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1CrossDomainMessengerSentMessageExtension1 represents a SentMessageExtension1 event raised by the L1CrossDomainMessenger contract.
+type L1CrossDomainMessengerSentMessageExtension1 struct {
+	Sender common.Address
+	Value  *big.Int
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessageExtension1 is a free log retrieval operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterSentMessageExtension1(opts *bind.FilterOpts, sender []common.Address) (*L1CrossDomainMessengerSentMessageExtension1Iterator, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1CrossDomainMessengerSentMessageExtension1Iterator{contract: _L1CrossDomainMessenger.contract, event: "SentMessageExtension1", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessageExtension1 is a free log subscription operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchSentMessageExtension1(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerSentMessageExtension1, sender []common.Address) (event.Subscription, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1CrossDomainMessengerSentMessageExtension1)
+				if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessageExtension1 is a log parse operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseSentMessageExtension1(log types.Log) (*L1CrossDomainMessengerSentMessageExtension1, error) {
+	event := new(L1CrossDomainMessengerSentMessageExtension1)
+	if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-bindings/bindings/l1erc721bridge.go b/op-e2e/bindings/l1erc721bridge.go
similarity index 100%
rename from op-bindings/bindings/l1erc721bridge.go
rename to op-e2e/bindings/l1erc721bridge.go
diff --git a/op-bindings/bindings/l1feevault.go b/op-e2e/bindings/l1feevault.go
similarity index 100%
rename from op-bindings/bindings/l1feevault.go
rename to op-e2e/bindings/l1feevault.go
diff --git a/op-e2e/bindings/l1standardbridge.go b/op-e2e/bindings/l1standardbridge.go
new file mode 100644
index 000000000000..33708d8ad779
--- /dev/null
+++ b/op-e2e/bindings/l1standardbridge.go
@@ -0,0 +1,2220 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L1StandardBridgeMetaData contains all meta data concerning the L1StandardBridge contract.
+var L1StandardBridgeMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OTHER_BRIDGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractStandardBridge\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgeERC20\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bridgeERC20To\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bridgeETH\",\"inputs\":[{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"bridgeETHTo\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositERC20\",\"inputs\":[{\"name\":\"_l1Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_l2Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositERC20To\",\"inputs\":[{\"name\":\"_l1Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_l2Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositETH\",\"inputs\":[{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositETHTo\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"finalizeBridgeERC20\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizeBridgeETH\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"finalizeERC20Withdrawal\",\"inputs\":[{\"name\":\"_l1Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_l2Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizeETHWithdrawal\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_messenger\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l2TokenBridge\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"otherBridge\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractStandardBridge\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ERC20BridgeFinalized\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"remoteToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ERC20BridgeInitiated\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"remoteToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ERC20DepositInitiated\",\"inputs\":[{\"name\":\"l1Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"l2Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ERC20WithdrawalFinalized\",\"inputs\":[{\"name\":\"l1Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"l2Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHBridgeFinalized\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHBridgeInitiated\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHDepositInitiated\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHWithdrawalFinalized\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false}]",
+	Bin: "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200024b565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001a160201b620005891760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603280546001600160a01b038086166001600160a01b03199283161790925560338054928516929091169190911790556200015484734200000000000000000000000000000000000010620001b0565b80156200019b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200021d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b612f21806200025b6000396000f3fe6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612905565b6105b8565b61023b6102703660046129b6565b6109d2565b61023b610283366004612a09565b610aa9565b61023b610296366004612a09565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612a7c565b61101b565b34801561037857600080fd5b506103b56040518060400160405280601b81526020017f322e322e302d626574612b637573746f6d2d6761732d746f6b656e000000000081525081565b6040516102e99190612b69565b3480156103ce57600080fd5b5061023b6103dd366004612b7c565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612a7c565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612b7c565b611212565b34801561047e57600080fd5b506104aa61048d366004612bff565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612c38565b6112e6565b34801561050257600080fd5b5061023b610511366004612905565b611328565b61023b6105243660046129b6565b611337565b34801561053557600080fd5b5061023b610544366004612c9b565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612c38565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612ce6565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612d32565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612ce6565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f8492505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612d49565b905090565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f8492505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f84734200000000000000000000000000000000000010611f93565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a8585858461207d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612d6b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612db4565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b63000000000000000000000000000000000000000000000000000000006120f0565b806119055750611905827fec4fc8e3000000000000000000000000000000000000000000000000000000006120f0565b92915050565b6000611937837f1d1d8b63000000000000000000000000000000000000000000000000000000006120f0565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612ce6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612113565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612df9565b60405180910390a461101386868686868661221f565b600080611b986122a7565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612e37565b60405180910390a36105b284848484612344565b600080600080845160208601878a8af19695505050505050565b611c62876118a9565b15611db057611c71878761190b565b611d23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611d9357600080fd5b505af1158015611da7573d6000803e3d6000fd5b50505050611e44565b611dd273ffffffffffffffffffffffffffffffffffffffff88168630866123b1565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e10908490612e50565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611e5287878787878661240f565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611eb6908b908d908c908c908c908b90602401612e68565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611f4992918790600401612db4565b600060405180830381600087803b158015611f6357600080fd5b505af1158015611f77573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c59565b600054610100900460ff1661202a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f2384846040516120dc929190612e37565b60405180910390a36105b28484848461249d565b60006120fb836124fc565b801561210c575061210c8383612560565b9392505050565b6000612175826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661262f9092919063ffffffff16565b805190915015610aa457808060200190518101906121939190612d49565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161229793929190612df9565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015612317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233b9190612ec3565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d84846040516123a3929190612e37565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161248793929190612df9565b60405180910390a4611013868686868686612646565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af584846040516123a3929190612e37565b6000612528827f01ffc9a700000000000000000000000000000000000000000000000000000000612560565b80156119055750612559827fffffffff00000000000000000000000000000000000000000000000000000000612560565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015612618575060208210155b80156126245750600081115b979650505050505050565b606061263e84846000856126be565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161229793929190612df9565b606082471015612750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b6127ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516127f79190612ef8565b60006040518083038185875af1925050503d8060008114612834576040519150601f19603f3d011682016040523d82523d6000602084013e612839565b606091505b50915091506126248282866060831561285357508161210c565b8251156128635782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612b69565b73ffffffffffffffffffffffffffffffffffffffff811681146128b957600080fd5b50565b60008083601f8401126128ce57600080fd5b50813567ffffffffffffffff8111156128e657600080fd5b6020830191508360208285010111156128fe57600080fd5b9250929050565b600080600080600080600060c0888a03121561292057600080fd5b873561292b81612897565b9650602088013561293b81612897565b9550604088013561294b81612897565b9450606088013561295b81612897565b93506080880135925060a088013567ffffffffffffffff81111561297e57600080fd5b61298a8a828b016128bc565b989b979a50959850939692959293505050565b803563ffffffff811681146129b157600080fd5b919050565b6000806000604084860312156129cb57600080fd5b6129d48461299d565b9250602084013567ffffffffffffffff8111156129f057600080fd5b6129fc868287016128bc565b9497909650939450505050565b600080600080600060808688031215612a2157600080fd5b8535612a2c81612897565b94506020860135612a3c81612897565b935060408601359250606086013567ffffffffffffffff811115612a5f57600080fd5b612a6b888289016128bc565b969995985093965092949392505050565b600080600080600080600060c0888a031215612a9757600080fd5b8735612aa281612897565b96506020880135612ab281612897565b95506040880135612ac281612897565b945060608801359350612ad76080890161299d565b925060a088013567ffffffffffffffff81111561297e57600080fd5b60005b83811015612b0e578181015183820152602001612af6565b838111156105b25750506000910152565b60008151808452612b37816020860160208601612af3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061210c6020830184612b1f565b60008060008060008060a08789031215612b9557600080fd5b8635612ba081612897565b95506020870135612bb081612897565b945060408701359350612bc56060880161299d565b9250608087013567ffffffffffffffff811115612be157600080fd5b612bed89828a016128bc565b979a9699509497509295939492505050565b60008060408385031215612c1257600080fd5b8235612c1d81612897565b91506020830135612c2d81612897565b809150509250929050565b60008060008060608587031215612c4e57600080fd5b8435612c5981612897565b9350612c676020860161299d565b9250604085013567ffffffffffffffff811115612c8357600080fd5b612c8f878288016128bc565b95989497509550505050565b600080600060608486031215612cb057600080fd5b8335612cbb81612897565b92506020840135612ccb81612897565b91506040840135612cdb81612897565b809150509250925092565b600060208284031215612cf857600080fd5b815161210c81612897565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612d4457612d44612d03565b500390565b600060208284031215612d5b57600080fd5b8151801515811461210c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612daa6080830184612b1f565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612de36060830185612b1f565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612e2e6060830184612b1f565b95945050505050565b82815260406020820152600061263e6040830184612b1f565b60008219821115612e6357612e63612d03565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612eb760c0830184612b1f565b98975050505050505050565b60008060408385031215612ed657600080fd5b8251612ee181612897565b602084015190925060ff81168114612c2d57600080fd5b60008251612f0a818460208701612af3565b919091019291505056fea164736f6c634300080f000a",
+}
+
+// L1StandardBridgeABI is the input ABI used to generate the binding from.
+// Deprecated: Use L1StandardBridgeMetaData.ABI instead.
+var L1StandardBridgeABI = L1StandardBridgeMetaData.ABI
+
+// L1StandardBridgeBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L1StandardBridgeMetaData.Bin instead.
+var L1StandardBridgeBin = L1StandardBridgeMetaData.Bin
+
+// DeployL1StandardBridge deploys a new Ethereum contract, binding an instance of L1StandardBridge to it.
+func DeployL1StandardBridge(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L1StandardBridge, error) {
+	parsed, err := L1StandardBridgeMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L1StandardBridgeBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L1StandardBridge{L1StandardBridgeCaller: L1StandardBridgeCaller{contract: contract}, L1StandardBridgeTransactor: L1StandardBridgeTransactor{contract: contract}, L1StandardBridgeFilterer: L1StandardBridgeFilterer{contract: contract}}, nil
+}
+
+// L1StandardBridge is an auto generated Go binding around an Ethereum contract.
+type L1StandardBridge struct {
+	L1StandardBridgeCaller     // Read-only binding to the contract
+	L1StandardBridgeTransactor // Write-only binding to the contract
+	L1StandardBridgeFilterer   // Log filterer for contract events
+}
+
+// L1StandardBridgeCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L1StandardBridgeCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1StandardBridgeTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L1StandardBridgeTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1StandardBridgeFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L1StandardBridgeFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L1StandardBridgeSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L1StandardBridgeSession struct {
+	Contract     *L1StandardBridge // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// L1StandardBridgeCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L1StandardBridgeCallerSession struct {
+	Contract *L1StandardBridgeCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts           // Call options to use throughout this session
+}
+
+// L1StandardBridgeTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L1StandardBridgeTransactorSession struct {
+	Contract     *L1StandardBridgeTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
+}
+
+// L1StandardBridgeRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L1StandardBridgeRaw struct {
+	Contract *L1StandardBridge // Generic contract binding to access the raw methods on
+}
+
+// L1StandardBridgeCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L1StandardBridgeCallerRaw struct {
+	Contract *L1StandardBridgeCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L1StandardBridgeTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L1StandardBridgeTransactorRaw struct {
+	Contract *L1StandardBridgeTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL1StandardBridge creates a new instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridge(address common.Address, backend bind.ContractBackend) (*L1StandardBridge, error) {
+	contract, err := bindL1StandardBridge(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridge{L1StandardBridgeCaller: L1StandardBridgeCaller{contract: contract}, L1StandardBridgeTransactor: L1StandardBridgeTransactor{contract: contract}, L1StandardBridgeFilterer: L1StandardBridgeFilterer{contract: contract}}, nil
+}
+
+// NewL1StandardBridgeCaller creates a new read-only instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridgeCaller(address common.Address, caller bind.ContractCaller) (*L1StandardBridgeCaller, error) {
+	contract, err := bindL1StandardBridge(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeCaller{contract: contract}, nil
+}
+
+// NewL1StandardBridgeTransactor creates a new write-only instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridgeTransactor(address common.Address, transactor bind.ContractTransactor) (*L1StandardBridgeTransactor, error) {
+	contract, err := bindL1StandardBridge(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeTransactor{contract: contract}, nil
+}
+
+// NewL1StandardBridgeFilterer creates a new log filterer instance of L1StandardBridge, bound to a specific deployed contract.
+func NewL1StandardBridgeFilterer(address common.Address, filterer bind.ContractFilterer) (*L1StandardBridgeFilterer, error) {
+	contract, err := bindL1StandardBridge(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeFilterer{contract: contract}, nil
+}
+
+// bindL1StandardBridge binds a generic wrapper to an already deployed contract.
+func bindL1StandardBridge(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L1StandardBridgeABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1StandardBridge *L1StandardBridgeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1StandardBridge.Contract.L1StandardBridgeCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1StandardBridge *L1StandardBridgeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.L1StandardBridgeTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1StandardBridge *L1StandardBridgeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.L1StandardBridgeTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L1StandardBridge *L1StandardBridgeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L1StandardBridge.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L1StandardBridge *L1StandardBridgeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L1StandardBridge *L1StandardBridgeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) MESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) MESSENGER() (common.Address, error) {
+	return _L1StandardBridge.Contract.MESSENGER(&_L1StandardBridge.CallOpts)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) MESSENGER() (common.Address, error) {
+	return _L1StandardBridge.Contract.MESSENGER(&_L1StandardBridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) OTHERBRIDGE(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "OTHER_BRIDGE")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) OTHERBRIDGE() (common.Address, error) {
+	return _L1StandardBridge.Contract.OTHERBRIDGE(&_L1StandardBridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) OTHERBRIDGE() (common.Address, error) {
+	return _L1StandardBridge.Contract.OTHERBRIDGE(&_L1StandardBridge.CallOpts)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L1StandardBridge *L1StandardBridgeCaller) Deposits(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "deposits", arg0, arg1)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L1StandardBridge *L1StandardBridgeSession) Deposits(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _L1StandardBridge.Contract.Deposits(&_L1StandardBridge.CallOpts, arg0, arg1)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Deposits(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _L1StandardBridge.Contract.Deposits(&_L1StandardBridge.CallOpts, arg0, arg1)
+}
+
+// L2TokenBridge is a free data retrieval call binding the contract method 0x91c49bf8.
+//
+// Solidity: function l2TokenBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) L2TokenBridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "l2TokenBridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2TokenBridge is a free data retrieval call binding the contract method 0x91c49bf8.
+//
+// Solidity: function l2TokenBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) L2TokenBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.L2TokenBridge(&_L1StandardBridge.CallOpts)
+}
+
+// L2TokenBridge is a free data retrieval call binding the contract method 0x91c49bf8.
+//
+// Solidity: function l2TokenBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) L2TokenBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.L2TokenBridge(&_L1StandardBridge.CallOpts)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) Messenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "messenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) Messenger() (common.Address, error) {
+	return _L1StandardBridge.Contract.Messenger(&_L1StandardBridge.CallOpts)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Messenger() (common.Address, error) {
+	return _L1StandardBridge.Contract.Messenger(&_L1StandardBridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) OtherBridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "otherBridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) OtherBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.OtherBridge(&_L1StandardBridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) OtherBridge() (common.Address, error) {
+	return _L1StandardBridge.Contract.OtherBridge(&_L1StandardBridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1StandardBridge *L1StandardBridgeCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1StandardBridge *L1StandardBridgeSession) Paused() (bool, error) {
+	return _L1StandardBridge.Contract.Paused(&_L1StandardBridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Paused() (bool, error) {
+	return _L1StandardBridge.Contract.Paused(&_L1StandardBridge.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) SuperchainConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SuperchainConfig(&_L1StandardBridge.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) SuperchainConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SuperchainConfig(&_L1StandardBridge.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCaller) SystemConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "systemConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeSession) SystemConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SystemConfig(&_L1StandardBridge.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) SystemConfig() (common.Address, error) {
+	return _L1StandardBridge.Contract.SystemConfig(&_L1StandardBridge.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1StandardBridge *L1StandardBridgeCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L1StandardBridge.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1StandardBridge *L1StandardBridgeSession) Version() (string, error) {
+	return _L1StandardBridge.Contract.Version(&_L1StandardBridge.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L1StandardBridge *L1StandardBridgeCallerSession) Version() (string, error) {
+	return _L1StandardBridge.Contract.Version(&_L1StandardBridge.CallOpts)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeERC20(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeERC20", _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeERC20(_localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeERC20(_localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeERC20To(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeERC20To", _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeERC20To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20To(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeERC20To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeERC20To(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeETH(opts *bind.TransactOpts, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeETH", _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) BridgeETHTo(opts *bind.TransactOpts, _to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "bridgeETHTo", _to, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) BridgeETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) BridgeETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.BridgeETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// DepositERC20 is a paid mutator transaction binding the contract method 0x58a997f6.
+//
+// Solidity: function depositERC20(address _l1Token, address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositERC20(opts *bind.TransactOpts, _l1Token common.Address, _l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositERC20", _l1Token, _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20 is a paid mutator transaction binding the contract method 0x58a997f6.
+//
+// Solidity: function depositERC20(address _l1Token, address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositERC20(_l1Token common.Address, _l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20 is a paid mutator transaction binding the contract method 0x58a997f6.
+//
+// Solidity: function depositERC20(address _l1Token, address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositERC20(_l1Token common.Address, _l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20To is a paid mutator transaction binding the contract method 0x838b2520.
+//
+// Solidity: function depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositERC20To(opts *bind.TransactOpts, _l1Token common.Address, _l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositERC20To", _l1Token, _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20To is a paid mutator transaction binding the contract method 0x838b2520.
+//
+// Solidity: function depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositERC20To(_l1Token common.Address, _l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20To(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// DepositERC20To is a paid mutator transaction binding the contract method 0x838b2520.
+//
+// Solidity: function depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositERC20To(_l1Token common.Address, _l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositERC20To(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// DepositETH is a paid mutator transaction binding the contract method 0xb1a1a882.
+//
+// Solidity: function depositETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositETH(opts *bind.TransactOpts, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositETH", _minGasLimit, _extraData)
+}
+
+// DepositETH is a paid mutator transaction binding the contract method 0xb1a1a882.
+//
+// Solidity: function depositETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// DepositETH is a paid mutator transaction binding the contract method 0xb1a1a882.
+//
+// Solidity: function depositETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETH(&_L1StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// DepositETHTo is a paid mutator transaction binding the contract method 0x9a2ac6d5.
+//
+// Solidity: function depositETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) DepositETHTo(opts *bind.TransactOpts, _to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "depositETHTo", _to, _minGasLimit, _extraData)
+}
+
+// DepositETHTo is a paid mutator transaction binding the contract method 0x9a2ac6d5.
+//
+// Solidity: function depositETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) DepositETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// DepositETHTo is a paid mutator transaction binding the contract method 0x9a2ac6d5.
+//
+// Solidity: function depositETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) DepositETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.DepositETHTo(&_L1StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeBridgeERC20(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeBridgeERC20", _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeBridgeERC20(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeBridgeERC20(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeERC20(&_L1StandardBridge.TransactOpts, _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeBridgeETH(opts *bind.TransactOpts, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeBridgeETH", _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeBridgeETH(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeETH(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeBridgeETH(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeBridgeETH(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeERC20Withdrawal is a paid mutator transaction binding the contract method 0xa9f9e675.
+//
+// Solidity: function finalizeERC20Withdrawal(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeERC20Withdrawal(opts *bind.TransactOpts, _l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeERC20Withdrawal", _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// FinalizeERC20Withdrawal is a paid mutator transaction binding the contract method 0xa9f9e675.
+//
+// Solidity: function finalizeERC20Withdrawal(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeERC20Withdrawal(_l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeERC20Withdrawal(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// FinalizeERC20Withdrawal is a paid mutator transaction binding the contract method 0xa9f9e675.
+//
+// Solidity: function finalizeERC20Withdrawal(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeERC20Withdrawal(_l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeERC20Withdrawal(&_L1StandardBridge.TransactOpts, _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// FinalizeETHWithdrawal is a paid mutator transaction binding the contract method 0x1532ec34.
+//
+// Solidity: function finalizeETHWithdrawal(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) FinalizeETHWithdrawal(opts *bind.TransactOpts, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "finalizeETHWithdrawal", _from, _to, _amount, _extraData)
+}
+
+// FinalizeETHWithdrawal is a paid mutator transaction binding the contract method 0x1532ec34.
+//
+// Solidity: function finalizeETHWithdrawal(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) FinalizeETHWithdrawal(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeETHWithdrawal(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeETHWithdrawal is a paid mutator transaction binding the contract method 0x1532ec34.
+//
+// Solidity: function finalizeETHWithdrawal(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) FinalizeETHWithdrawal(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.FinalizeETHWithdrawal(&_L1StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig, address _systemConfig) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) Initialize(opts *bind.TransactOpts, _messenger common.Address, _superchainConfig common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.Transact(opts, "initialize", _messenger, _superchainConfig, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig, address _systemConfig) returns()
+func (_L1StandardBridge *L1StandardBridgeSession) Initialize(_messenger common.Address, _superchainConfig common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Initialize(&_L1StandardBridge.TransactOpts, _messenger, _superchainConfig, _systemConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _messenger, address _superchainConfig, address _systemConfig) returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) Initialize(_messenger common.Address, _superchainConfig common.Address, _systemConfig common.Address) (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Initialize(&_L1StandardBridge.TransactOpts, _messenger, _superchainConfig, _systemConfig)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L1StandardBridge.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L1StandardBridge *L1StandardBridgeSession) Receive() (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Receive(&_L1StandardBridge.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L1StandardBridge *L1StandardBridgeTransactorSession) Receive() (*types.Transaction, error) {
+	return _L1StandardBridge.Contract.Receive(&_L1StandardBridge.TransactOpts)
+}
+
+// L1StandardBridgeERC20BridgeFinalizedIterator is returned from FilterERC20BridgeFinalized and is used to iterate over the raw logs and unpacked data for ERC20BridgeFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeFinalizedIterator struct {
+	Event *L1StandardBridgeERC20BridgeFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20BridgeFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20BridgeFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20BridgeFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20BridgeFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20BridgeFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20BridgeFinalized represents a ERC20BridgeFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeFinalized struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	Amount      *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20BridgeFinalized is a free log retrieval operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20BridgeFinalized(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*L1StandardBridgeERC20BridgeFinalizedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20BridgeFinalizedIterator{contract: _L1StandardBridge.contract, event: "ERC20BridgeFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20BridgeFinalized is a free log subscription operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20BridgeFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20BridgeFinalized, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20BridgeFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20BridgeFinalized is a log parse operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20BridgeFinalized(log types.Log) (*L1StandardBridgeERC20BridgeFinalized, error) {
+	event := new(L1StandardBridgeERC20BridgeFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeERC20BridgeInitiatedIterator is returned from FilterERC20BridgeInitiated and is used to iterate over the raw logs and unpacked data for ERC20BridgeInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeInitiatedIterator struct {
+	Event *L1StandardBridgeERC20BridgeInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20BridgeInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20BridgeInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20BridgeInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20BridgeInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20BridgeInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20BridgeInitiated represents a ERC20BridgeInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20BridgeInitiated struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	Amount      *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20BridgeInitiated is a free log retrieval operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20BridgeInitiated(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*L1StandardBridgeERC20BridgeInitiatedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20BridgeInitiatedIterator{contract: _L1StandardBridge.contract, event: "ERC20BridgeInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20BridgeInitiated is a free log subscription operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20BridgeInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20BridgeInitiated, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20BridgeInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20BridgeInitiated is a log parse operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20BridgeInitiated(log types.Log) (*L1StandardBridgeERC20BridgeInitiated, error) {
+	event := new(L1StandardBridgeERC20BridgeInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20BridgeInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeERC20DepositInitiatedIterator is returned from FilterERC20DepositInitiated and is used to iterate over the raw logs and unpacked data for ERC20DepositInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20DepositInitiatedIterator struct {
+	Event *L1StandardBridgeERC20DepositInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20DepositInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20DepositInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20DepositInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20DepositInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20DepositInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20DepositInitiated represents a ERC20DepositInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20DepositInitiated struct {
+	L1Token   common.Address
+	L2Token   common.Address
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20DepositInitiated is a free log retrieval operation binding the contract event 0x718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396.
+//
+// Solidity: event ERC20DepositInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20DepositInitiated(opts *bind.FilterOpts, l1Token []common.Address, l2Token []common.Address, from []common.Address) (*L1StandardBridgeERC20DepositInitiatedIterator, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20DepositInitiated", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20DepositInitiatedIterator{contract: _L1StandardBridge.contract, event: "ERC20DepositInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20DepositInitiated is a free log subscription operation binding the contract event 0x718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396.
+//
+// Solidity: event ERC20DepositInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20DepositInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20DepositInitiated, l1Token []common.Address, l2Token []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20DepositInitiated", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20DepositInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20DepositInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20DepositInitiated is a log parse operation binding the contract event 0x718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396.
+//
+// Solidity: event ERC20DepositInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20DepositInitiated(log types.Log) (*L1StandardBridgeERC20DepositInitiated, error) {
+	event := new(L1StandardBridgeERC20DepositInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20DepositInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeERC20WithdrawalFinalizedIterator is returned from FilterERC20WithdrawalFinalized and is used to iterate over the raw logs and unpacked data for ERC20WithdrawalFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20WithdrawalFinalizedIterator struct {
+	Event *L1StandardBridgeERC20WithdrawalFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeERC20WithdrawalFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeERC20WithdrawalFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeERC20WithdrawalFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeERC20WithdrawalFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeERC20WithdrawalFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeERC20WithdrawalFinalized represents a ERC20WithdrawalFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeERC20WithdrawalFinalized struct {
+	L1Token   common.Address
+	L2Token   common.Address
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20WithdrawalFinalized is a free log retrieval operation binding the contract event 0x3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3.
+//
+// Solidity: event ERC20WithdrawalFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterERC20WithdrawalFinalized(opts *bind.FilterOpts, l1Token []common.Address, l2Token []common.Address, from []common.Address) (*L1StandardBridgeERC20WithdrawalFinalizedIterator, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ERC20WithdrawalFinalized", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeERC20WithdrawalFinalizedIterator{contract: _L1StandardBridge.contract, event: "ERC20WithdrawalFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20WithdrawalFinalized is a free log subscription operation binding the contract event 0x3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3.
+//
+// Solidity: event ERC20WithdrawalFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchERC20WithdrawalFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeERC20WithdrawalFinalized, l1Token []common.Address, l2Token []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ERC20WithdrawalFinalized", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeERC20WithdrawalFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20WithdrawalFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20WithdrawalFinalized is a log parse operation binding the contract event 0x3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3.
+//
+// Solidity: event ERC20WithdrawalFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseERC20WithdrawalFinalized(log types.Log) (*L1StandardBridgeERC20WithdrawalFinalized, error) {
+	event := new(L1StandardBridgeERC20WithdrawalFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ERC20WithdrawalFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHBridgeFinalizedIterator is returned from FilterETHBridgeFinalized and is used to iterate over the raw logs and unpacked data for ETHBridgeFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeFinalizedIterator struct {
+	Event *L1StandardBridgeETHBridgeFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHBridgeFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHBridgeFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHBridgeFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHBridgeFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHBridgeFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHBridgeFinalized represents a ETHBridgeFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeFinalized struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHBridgeFinalized is a free log retrieval operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHBridgeFinalized(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHBridgeFinalizedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHBridgeFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHBridgeFinalizedIterator{contract: _L1StandardBridge.contract, event: "ETHBridgeFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchETHBridgeFinalized is a free log subscription operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHBridgeFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHBridgeFinalized, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHBridgeFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHBridgeFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHBridgeFinalized is a log parse operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHBridgeFinalized(log types.Log) (*L1StandardBridgeETHBridgeFinalized, error) {
+	event := new(L1StandardBridgeETHBridgeFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHBridgeInitiatedIterator is returned from FilterETHBridgeInitiated and is used to iterate over the raw logs and unpacked data for ETHBridgeInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeInitiatedIterator struct {
+	Event *L1StandardBridgeETHBridgeInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHBridgeInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHBridgeInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHBridgeInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHBridgeInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHBridgeInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHBridgeInitiated represents a ETHBridgeInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHBridgeInitiated struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHBridgeInitiated is a free log retrieval operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHBridgeInitiated(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHBridgeInitiatedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHBridgeInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHBridgeInitiatedIterator{contract: _L1StandardBridge.contract, event: "ETHBridgeInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchETHBridgeInitiated is a free log subscription operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHBridgeInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHBridgeInitiated, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHBridgeInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHBridgeInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHBridgeInitiated is a log parse operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHBridgeInitiated(log types.Log) (*L1StandardBridgeETHBridgeInitiated, error) {
+	event := new(L1StandardBridgeETHBridgeInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHBridgeInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHDepositInitiatedIterator is returned from FilterETHDepositInitiated and is used to iterate over the raw logs and unpacked data for ETHDepositInitiated events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHDepositInitiatedIterator struct {
+	Event *L1StandardBridgeETHDepositInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHDepositInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHDepositInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHDepositInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHDepositInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHDepositInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHDepositInitiated represents a ETHDepositInitiated event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHDepositInitiated struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHDepositInitiated is a free log retrieval operation binding the contract event 0x35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23.
+//
+// Solidity: event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHDepositInitiated(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHDepositInitiatedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHDepositInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHDepositInitiatedIterator{contract: _L1StandardBridge.contract, event: "ETHDepositInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchETHDepositInitiated is a free log subscription operation binding the contract event 0x35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23.
+//
+// Solidity: event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHDepositInitiated(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHDepositInitiated, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHDepositInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHDepositInitiated)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHDepositInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHDepositInitiated is a log parse operation binding the contract event 0x35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23.
+//
+// Solidity: event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHDepositInitiated(log types.Log) (*L1StandardBridgeETHDepositInitiated, error) {
+	event := new(L1StandardBridgeETHDepositInitiated)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHDepositInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeETHWithdrawalFinalizedIterator is returned from FilterETHWithdrawalFinalized and is used to iterate over the raw logs and unpacked data for ETHWithdrawalFinalized events raised by the L1StandardBridge contract.
+type L1StandardBridgeETHWithdrawalFinalizedIterator struct {
+	Event *L1StandardBridgeETHWithdrawalFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeETHWithdrawalFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeETHWithdrawalFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeETHWithdrawalFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeETHWithdrawalFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeETHWithdrawalFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeETHWithdrawalFinalized represents a ETHWithdrawalFinalized event raised by the L1StandardBridge contract.
+type L1StandardBridgeETHWithdrawalFinalized struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHWithdrawalFinalized is a free log retrieval operation binding the contract event 0x2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631.
+//
+// Solidity: event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterETHWithdrawalFinalized(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L1StandardBridgeETHWithdrawalFinalizedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "ETHWithdrawalFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeETHWithdrawalFinalizedIterator{contract: _L1StandardBridge.contract, event: "ETHWithdrawalFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchETHWithdrawalFinalized is a free log subscription operation binding the contract event 0x2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631.
+//
+// Solidity: event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchETHWithdrawalFinalized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeETHWithdrawalFinalized, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "ETHWithdrawalFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeETHWithdrawalFinalized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "ETHWithdrawalFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHWithdrawalFinalized is a log parse operation binding the contract event 0x2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631.
+//
+// Solidity: event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseETHWithdrawalFinalized(log types.Log) (*L1StandardBridgeETHWithdrawalFinalized, error) {
+	event := new(L1StandardBridgeETHWithdrawalFinalized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "ETHWithdrawalFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L1StandardBridgeInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L1StandardBridge contract.
+type L1StandardBridgeInitializedIterator struct {
+	Event *L1StandardBridgeInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L1StandardBridgeInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L1StandardBridgeInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L1StandardBridgeInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L1StandardBridgeInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L1StandardBridgeInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L1StandardBridgeInitialized represents a Initialized event raised by the L1StandardBridge contract.
+type L1StandardBridgeInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1StandardBridge *L1StandardBridgeFilterer) FilterInitialized(opts *bind.FilterOpts) (*L1StandardBridgeInitializedIterator, error) {
+
+	logs, sub, err := _L1StandardBridge.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L1StandardBridgeInitializedIterator{contract: _L1StandardBridge.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1StandardBridge *L1StandardBridgeFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L1StandardBridgeInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L1StandardBridge.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L1StandardBridgeInitialized)
+				if err := _L1StandardBridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L1StandardBridge *L1StandardBridgeFilterer) ParseInitialized(log types.Log) (*L1StandardBridgeInitialized, error) {
+	event := new(L1StandardBridgeInitialized)
+	if err := _L1StandardBridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-e2e/bindings/l2crossdomainmessenger.go b/op-e2e/bindings/l2crossdomainmessenger.go
new file mode 100644
index 000000000000..f907dc053af6
--- /dev/null
+++ b/op-e2e/bindings/l2crossdomainmessenger.go
@@ -0,0 +1,1538 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L2CrossDomainMessengerMetaData contains all meta data concerning the L2CrossDomainMessenger contract.
+var L2CrossDomainMessengerMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MESSAGE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_CALLDATA_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OTHER_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_CALL_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_CONSTANT_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_GAS_CHECK_BUFFER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAY_RESERVED_GAS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"baseGas\",\"inputs\":[{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"failedMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_l1CrossDomainMessenger\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l1CrossDomainMessenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageNonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"otherMessenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"relayMessage\",\"inputs\":[{\"name\":\"_nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"successfulMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"xDomainMessageSender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"FailedRelayedMessage\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RelayedMessage\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SentMessage\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"messageNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SentMessageExtension1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+	Bin: "0x60806040523480156200001157600080fd5b506200001e600062000024565b62000239565b600054600160a81b900460ff16158080156200004d57506000546001600160a01b90910460ff16105b806200008457506200006a306200017360201b620013a21760201c565b158015620000845750600054600160a01b900460ff166001145b620000ed5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a01b1916600160a01b17905580156200011b576000805460ff60a81b1916600160a81b1790555b620001268262000182565b80156200016f576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054600160a81b900460ff16620001f15760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000e4565b60cc546001600160a01b0316620002175760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b611e2a80620002496000396000f3fe60806040526004361061016a5760003560e01c806383a74074116100cb578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b146103c7578063db505d80146103da578063ecc704281461040757600080fd5b8063b1b1b20914610357578063b28ade2514610387578063c4d66de8146103a757600080fd5b80639fce812c116100b05780639fce812c146102fc578063a4e7f8bd14610327578063a7119869146102fc57600080fd5b806383a74074146102e55780638cbeeef21461020957600080fd5b80634c1d6a69116101225780635644cfdf116101075780635644cfdf146102755780635c975abb1461028b5780636e296e45146102ab57600080fd5b80634c1d6a691461020957806354fd4d501461021f57600080fd5b80632828d7e8116101535780632828d7e8146101b75780633dbb202b146101cc5780633f827a5a146101e157600080fd5b8063028f85f71461016f5780630c568498146101a2575b600080fd5b34801561017b57600080fd5b50610184601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101ae57600080fd5b50610184603f81565b3480156101c357600080fd5b50610184604081565b6101df6101da3660046118e3565b61046c565b005b3480156101ed57600080fd5b506101f6600181565b60405161ffff9091168152602001610199565b34801561021557600080fd5b50610184619c4081565b34801561022b57600080fd5b506102686040518060400160405280601b81526020017f322e312e302d626574612b637573746f6d2d6761732d746f6b656e000000000081525081565b60405161019991906119b5565b34801561028157600080fd5b5061018461138881565b34801561029757600080fd5b5060005b6040519015158152602001610199565b3480156102b757600080fd5b506102c0610769565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610199565b3480156102f157600080fd5b5061018462030d4081565b34801561030857600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166102c0565b34801561033357600080fd5b5061029b6103423660046119cf565b60ce6020526000908152604090205460ff1681565b34801561036357600080fd5b5061029b6103723660046119cf565b60cb6020526000908152604090205460ff1681565b34801561039357600080fd5b506101846103a23660046119e8565b610850565b3480156103b357600080fd5b506101df6103c2366004611a3c565b6108be565b6101df6103d5366004611a59565b610abd565b3480156103e657600080fd5b5060cf546102c09073ffffffffffffffffffffffffffffffffffffffff1681565b34801561041357600080fd5b5061045e60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b604051908152602001610199565b6104746113be565b1561050c57341561050c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf5461063e9073ffffffffffffffffffffffffffffffffffffffff16610534858585610850565b347fd764ad0b000000000000000000000000000000000000000000000000000000006105a060cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016105bc9796959493929190611b28565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526113fd565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856106c360cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516106d5959493929190611b87565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f742073657400000000000000000000006064820152608401610503565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f61086c604063ffffffff8816611c04565b6108769190611c34565b610881601088611c04565b61088e9062030d40611c82565b6108989190611c82565b6108a29190611c82565b6108ac9190611c82565b6108b69190611c82565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610909575060005460017401000000000000000000000000000000000000000090910460ff16105b8061093b5750303b15801561093b575060005474010000000000000000000000000000000000000000900460ff166001145b6109c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610503565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610a4d57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b610a568261148b565b8015610ab957600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60f087901c60028110610b78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a401610503565b8061ffff16600003610c6d576000610bc9878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506115c7915050565b600081815260cb602052604090205490915060ff1615610c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c617965640000000000000000006064820152608401610503565b505b6000610cb3898989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506115e692505050565b9050610cfc60cf54337fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef0173ffffffffffffffffffffffffffffffffffffffff90811691161490565b15610d3457853414610d1057610d10611cae565b600081815260ce602052604090205460ff1615610d2f57610d2f611cae565b610e86565b3415610de8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a401610503565b600081815260ce602052604090205460ff16610e86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c61796564000000000000000000000000000000006064820152608401610503565b610e8f87611609565b15610f42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a401610503565b600081815260cb602052604090205460ff1615610fe1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c61796564000000000000000000006064820152608401610503565b61100285610ff3611388619c40611c82565b67ffffffffffffffff1661165e565b1580611028575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561114157600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d657373616765000000000000000000000000000000000000006064820152608401610503565b5050611399565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006111d288619c405a6111959190611cdd565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061167c92505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561128857600082815260cb602052604090205460ff161561122557611225611cae565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611395565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3201611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d657373616765000000000000000000000000000000000000006064820152608401610503565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806113c9611696565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b6040517fc2b3e5ac0000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000169063c2b3e5ac90849061145390889088908790600401611cf4565b6000604051808303818588803b15801561146c57600080fd5b505af1158015611480573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610503565b60cc5473ffffffffffffffffffffffffffffffffffffffff166115805760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006115d585858585611724565b805190602001209050949350505050565b60006115f68787878787876117bd565b8051906020012090509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611658575073ffffffffffffffffffffffffffffffffffffffff8216734200000000000000000000000000000000000016145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60008073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16634397dfef6040518163ffffffff1660e01b81526004016040805180830381865afa1580156116f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171b9190611d3c565b90939092509050565b60608484848460405160240161173d9493929190611d7c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b60608686868686866040516024016117da96959493929190611dc6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461187e57600080fd5b50565b60008083601f84011261189357600080fd5b50813567ffffffffffffffff8111156118ab57600080fd5b6020830191508360208285010111156118c357600080fd5b9250929050565b803563ffffffff811681146118de57600080fd5b919050565b600080600080606085870312156118f957600080fd5b84356119048161185c565b9350602085013567ffffffffffffffff81111561192057600080fd5b61192c87828801611881565b909450925061193f9050604086016118ca565b905092959194509250565b6000815180845260005b8181101561197057602081850181015186830182015201611954565b81811115611982576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006119c8602083018461194a565b9392505050565b6000602082840312156119e157600080fd5b5035919050565b6000806000604084860312156119fd57600080fd5b833567ffffffffffffffff811115611a1457600080fd5b611a2086828701611881565b9094509250611a339050602085016118ca565b90509250925092565b600060208284031215611a4e57600080fd5b81356119c88161185c565b600080600080600080600060c0888a031215611a7457600080fd5b873596506020880135611a868161185c565b95506040880135611a968161185c565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611ac057600080fd5b611acc8a828b01611881565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611b7a60c083018486611adf565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611bb7608083018688611adf565b905083604083015263ffffffff831660608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611c2b57611c2b611bd5565b02949350505050565b600067ffffffffffffffff80841680611c76577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ca557611ca5611bd5565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611cef57611cef611bd5565b500390565b73ffffffffffffffffffffffffffffffffffffffff8416815267ffffffffffffffff83166020820152606060408201526000611d33606083018461194a565b95945050505050565b60008060408385031215611d4f57600080fd5b8251611d5a8161185c565b602084015190925060ff81168114611d7157600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611db5608083018561194a565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611e1160c083018461194a565b9897505050505050505056fea164736f6c634300080f000a",
+}
+
+// L2CrossDomainMessengerABI is the input ABI used to generate the binding from.
+// Deprecated: Use L2CrossDomainMessengerMetaData.ABI instead.
+var L2CrossDomainMessengerABI = L2CrossDomainMessengerMetaData.ABI
+
+// L2CrossDomainMessengerBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L2CrossDomainMessengerMetaData.Bin instead.
+var L2CrossDomainMessengerBin = L2CrossDomainMessengerMetaData.Bin
+
+// DeployL2CrossDomainMessenger deploys a new Ethereum contract, binding an instance of L2CrossDomainMessenger to it.
+func DeployL2CrossDomainMessenger(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L2CrossDomainMessenger, error) {
+	parsed, err := L2CrossDomainMessengerMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2CrossDomainMessengerBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L2CrossDomainMessenger{L2CrossDomainMessengerCaller: L2CrossDomainMessengerCaller{contract: contract}, L2CrossDomainMessengerTransactor: L2CrossDomainMessengerTransactor{contract: contract}, L2CrossDomainMessengerFilterer: L2CrossDomainMessengerFilterer{contract: contract}}, nil
+}
+
+// L2CrossDomainMessenger is an auto generated Go binding around an Ethereum contract.
+type L2CrossDomainMessenger struct {
+	L2CrossDomainMessengerCaller     // Read-only binding to the contract
+	L2CrossDomainMessengerTransactor // Write-only binding to the contract
+	L2CrossDomainMessengerFilterer   // Log filterer for contract events
+}
+
+// L2CrossDomainMessengerCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L2CrossDomainMessengerCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2CrossDomainMessengerTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L2CrossDomainMessengerTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2CrossDomainMessengerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L2CrossDomainMessengerFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2CrossDomainMessengerSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L2CrossDomainMessengerSession struct {
+	Contract     *L2CrossDomainMessenger // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts           // Call options to use throughout this session
+	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
+}
+
+// L2CrossDomainMessengerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L2CrossDomainMessengerCallerSession struct {
+	Contract *L2CrossDomainMessengerCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts                 // Call options to use throughout this session
+}
+
+// L2CrossDomainMessengerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L2CrossDomainMessengerTransactorSession struct {
+	Contract     *L2CrossDomainMessengerTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
+}
+
+// L2CrossDomainMessengerRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L2CrossDomainMessengerRaw struct {
+	Contract *L2CrossDomainMessenger // Generic contract binding to access the raw methods on
+}
+
+// L2CrossDomainMessengerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L2CrossDomainMessengerCallerRaw struct {
+	Contract *L2CrossDomainMessengerCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L2CrossDomainMessengerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L2CrossDomainMessengerTransactorRaw struct {
+	Contract *L2CrossDomainMessengerTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL2CrossDomainMessenger creates a new instance of L2CrossDomainMessenger, bound to a specific deployed contract.
+func NewL2CrossDomainMessenger(address common.Address, backend bind.ContractBackend) (*L2CrossDomainMessenger, error) {
+	contract, err := bindL2CrossDomainMessenger(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessenger{L2CrossDomainMessengerCaller: L2CrossDomainMessengerCaller{contract: contract}, L2CrossDomainMessengerTransactor: L2CrossDomainMessengerTransactor{contract: contract}, L2CrossDomainMessengerFilterer: L2CrossDomainMessengerFilterer{contract: contract}}, nil
+}
+
+// NewL2CrossDomainMessengerCaller creates a new read-only instance of L2CrossDomainMessenger, bound to a specific deployed contract.
+func NewL2CrossDomainMessengerCaller(address common.Address, caller bind.ContractCaller) (*L2CrossDomainMessengerCaller, error) {
+	contract, err := bindL2CrossDomainMessenger(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerCaller{contract: contract}, nil
+}
+
+// NewL2CrossDomainMessengerTransactor creates a new write-only instance of L2CrossDomainMessenger, bound to a specific deployed contract.
+func NewL2CrossDomainMessengerTransactor(address common.Address, transactor bind.ContractTransactor) (*L2CrossDomainMessengerTransactor, error) {
+	contract, err := bindL2CrossDomainMessenger(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerTransactor{contract: contract}, nil
+}
+
+// NewL2CrossDomainMessengerFilterer creates a new log filterer instance of L2CrossDomainMessenger, bound to a specific deployed contract.
+func NewL2CrossDomainMessengerFilterer(address common.Address, filterer bind.ContractFilterer) (*L2CrossDomainMessengerFilterer, error) {
+	contract, err := bindL2CrossDomainMessenger(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerFilterer{contract: contract}, nil
+}
+
+// bindL2CrossDomainMessenger binds a generic wrapper to an already deployed contract.
+func bindL2CrossDomainMessenger(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L2CrossDomainMessengerABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2CrossDomainMessenger.Contract.L2CrossDomainMessengerCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.L2CrossDomainMessengerTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.L2CrossDomainMessengerTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2CrossDomainMessenger.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) MESSAGEVERSION(opts *bind.CallOpts) (uint16, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "MESSAGE_VERSION")
+
+	if err != nil {
+		return *new(uint16), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
+
+	return out0, err
+
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) MESSAGEVERSION() (uint16, error) {
+	return _L2CrossDomainMessenger.Contract.MESSAGEVERSION(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) MESSAGEVERSION() (uint16, error) {
+	return _L2CrossDomainMessenger.Contract.MESSAGEVERSION(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) MINGASCALLDATAOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_CALLDATA_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7.
+//
+// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) MINGASCALLDATAOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADDENOMINATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADNUMERATOR(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8.
+//
+// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) OTHERMESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "OTHER_MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) OTHERMESSENGER() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.OTHERMESSENGER(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// OTHERMESSENGER is a free data retrieval call binding the contract method 0x9fce812c.
+//
+// Solidity: function OTHER_MESSENGER() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) OTHERMESSENGER() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.OTHERMESSENGER(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) RELAYCALLOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CALL_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCALLOVERHEAD is a free data retrieval call binding the contract method 0x4c1d6a69.
+//
+// Solidity: function RELAY_CALL_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) RELAYCALLOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYCALLOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) RELAYCONSTANTOVERHEAD(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "RELAY_CONSTANT_OVERHEAD")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x83a74074.
+//
+// Solidity: function RELAY_CONSTANT_OVERHEAD() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) RELAYCONSTANTOVERHEAD() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYCONSTANTOVERHEAD(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) RELAYGASCHECKBUFFER(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "RELAY_GAS_CHECK_BUFFER")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYGASCHECKBUFFER is a free data retrieval call binding the contract method 0x5644cfdf.
+//
+// Solidity: function RELAY_GAS_CHECK_BUFFER() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) RELAYGASCHECKBUFFER() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYGASCHECKBUFFER(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) RELAYRESERVEDGAS(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "RELAY_RESERVED_GAS")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// RELAYRESERVEDGAS is a free data retrieval call binding the contract method 0x8cbeeef2.
+//
+// Solidity: function RELAY_RESERVED_GAS() view returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) RELAYRESERVEDGAS() (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.RELAYRESERVEDGAS(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) BaseGas(opts *bind.CallOpts, _message []byte, _minGasLimit uint32) (uint64, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "baseGas", _message, _minGasLimit)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.BaseGas(&_L2CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// BaseGas is a free data retrieval call binding the contract method 0xb28ade25.
+//
+// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint64)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint64, error) {
+	return _L2CrossDomainMessenger.Contract.BaseGas(&_L2CrossDomainMessenger.CallOpts, _message, _minGasLimit)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) FailedMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "failedMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _L2CrossDomainMessenger.Contract.FailedMessages(&_L2CrossDomainMessenger.CallOpts, arg0)
+}
+
+// FailedMessages is a free data retrieval call binding the contract method 0xa4e7f8bd.
+//
+// Solidity: function failedMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) FailedMessages(arg0 [32]byte) (bool, error) {
+	return _L2CrossDomainMessenger.Contract.FailedMessages(&_L2CrossDomainMessenger.CallOpts, arg0)
+}
+
+// L1CrossDomainMessenger is a free data retrieval call binding the contract method 0xa7119869.
+//
+// Solidity: function l1CrossDomainMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) L1CrossDomainMessenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "l1CrossDomainMessenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L1CrossDomainMessenger is a free data retrieval call binding the contract method 0xa7119869.
+//
+// Solidity: function l1CrossDomainMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) L1CrossDomainMessenger() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.L1CrossDomainMessenger(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// L1CrossDomainMessenger is a free data retrieval call binding the contract method 0xa7119869.
+//
+// Solidity: function l1CrossDomainMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) L1CrossDomainMessenger() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.L1CrossDomainMessenger(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) MessageNonce(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "messageNonce")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) MessageNonce() (*big.Int, error) {
+	return _L2CrossDomainMessenger.Contract.MessageNonce(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) MessageNonce() (*big.Int, error) {
+	return _L2CrossDomainMessenger.Contract.MessageNonce(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) OtherMessenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "otherMessenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) OtherMessenger() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.OtherMessenger(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80.
+//
+// Solidity: function otherMessenger() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) OtherMessenger() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.OtherMessenger(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) Paused() (bool, error) {
+	return _L2CrossDomainMessenger.Contract.Paused(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) Paused() (bool, error) {
+	return _L2CrossDomainMessenger.Contract.Paused(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) SuccessfulMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "successfulMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _L2CrossDomainMessenger.Contract.SuccessfulMessages(&_L2CrossDomainMessenger.CallOpts, arg0)
+}
+
+// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209.
+//
+// Solidity: function successfulMessages(bytes32 ) view returns(bool)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) {
+	return _L2CrossDomainMessenger.Contract.SuccessfulMessages(&_L2CrossDomainMessenger.CallOpts, arg0)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) Version() (string, error) {
+	return _L2CrossDomainMessenger.Contract.Version(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) Version() (string, error) {
+	return _L2CrossDomainMessenger.Contract.Version(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCaller) XDomainMessageSender(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2CrossDomainMessenger.contract.Call(opts, &out, "xDomainMessageSender")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) XDomainMessageSender() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.XDomainMessageSender(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45.
+//
+// Solidity: function xDomainMessageSender() view returns(address)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerCallerSession) XDomainMessageSender() (common.Address, error) {
+	return _L2CrossDomainMessenger.Contract.XDomainMessageSender(&_L2CrossDomainMessenger.CallOpts)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _l1CrossDomainMessenger) returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactor) Initialize(opts *bind.TransactOpts, _l1CrossDomainMessenger common.Address) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.contract.Transact(opts, "initialize", _l1CrossDomainMessenger)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _l1CrossDomainMessenger) returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) Initialize(_l1CrossDomainMessenger common.Address) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.Initialize(&_L2CrossDomainMessenger.TransactOpts, _l1CrossDomainMessenger)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _l1CrossDomainMessenger) returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactorSession) Initialize(_l1CrossDomainMessenger common.Address) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.Initialize(&_L2CrossDomainMessenger.TransactOpts, _l1CrossDomainMessenger)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactor) RelayMessage(opts *bind.TransactOpts, _nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.contract.Transact(opts, "relayMessage", _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.RelayMessage(&_L2CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b.
+//
+// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactorSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.RelayMessage(&_L2CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactor) SendMessage(opts *bind.TransactOpts, _target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.contract.Transact(opts, "sendMessage", _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.SendMessage(&_L2CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b.
+//
+// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns()
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerTransactorSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) {
+	return _L2CrossDomainMessenger.Contract.SendMessage(&_L2CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit)
+}
+
+// L2CrossDomainMessengerFailedRelayedMessageIterator is returned from FilterFailedRelayedMessage and is used to iterate over the raw logs and unpacked data for FailedRelayedMessage events raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerFailedRelayedMessageIterator struct {
+	Event *L2CrossDomainMessengerFailedRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2CrossDomainMessengerFailedRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2CrossDomainMessengerFailedRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2CrossDomainMessengerFailedRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2CrossDomainMessengerFailedRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2CrossDomainMessengerFailedRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2CrossDomainMessengerFailedRelayedMessage represents a FailedRelayedMessage event raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerFailedRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterFailedRelayedMessage is a free log retrieval operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) FilterFailedRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L2CrossDomainMessengerFailedRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.FilterLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerFailedRelayedMessageIterator{contract: _L2CrossDomainMessenger.contract, event: "FailedRelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchFailedRelayedMessage is a free log subscription operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) WatchFailedRelayedMessage(opts *bind.WatchOpts, sink chan<- *L2CrossDomainMessengerFailedRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.WatchLogs(opts, "FailedRelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2CrossDomainMessengerFailedRelayedMessage)
+				if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseFailedRelayedMessage is a log parse operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f.
+//
+// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) ParseFailedRelayedMessage(log types.Log) (*L2CrossDomainMessengerFailedRelayedMessage, error) {
+	event := new(L2CrossDomainMessengerFailedRelayedMessage)
+	if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2CrossDomainMessengerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerInitializedIterator struct {
+	Event *L2CrossDomainMessengerInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2CrossDomainMessengerInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2CrossDomainMessengerInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2CrossDomainMessengerInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2CrossDomainMessengerInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2CrossDomainMessengerInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2CrossDomainMessengerInitialized represents a Initialized event raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) FilterInitialized(opts *bind.FilterOpts) (*L2CrossDomainMessengerInitializedIterator, error) {
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerInitializedIterator{contract: _L2CrossDomainMessenger.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L2CrossDomainMessengerInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2CrossDomainMessengerInitialized)
+				if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) ParseInitialized(log types.Log) (*L2CrossDomainMessengerInitialized, error) {
+	event := new(L2CrossDomainMessengerInitialized)
+	if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2CrossDomainMessengerRelayedMessageIterator is returned from FilterRelayedMessage and is used to iterate over the raw logs and unpacked data for RelayedMessage events raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerRelayedMessageIterator struct {
+	Event *L2CrossDomainMessengerRelayedMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2CrossDomainMessengerRelayedMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2CrossDomainMessengerRelayedMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2CrossDomainMessengerRelayedMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2CrossDomainMessengerRelayedMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2CrossDomainMessengerRelayedMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2CrossDomainMessengerRelayedMessage represents a RelayedMessage event raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerRelayedMessage struct {
+	MsgHash [32]byte
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterRelayedMessage is a free log retrieval operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) FilterRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L2CrossDomainMessengerRelayedMessageIterator, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.FilterLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerRelayedMessageIterator{contract: _L2CrossDomainMessenger.contract, event: "RelayedMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchRelayedMessage is a free log subscription operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) WatchRelayedMessage(opts *bind.WatchOpts, sink chan<- *L2CrossDomainMessengerRelayedMessage, msgHash [][32]byte) (event.Subscription, error) {
+
+	var msgHashRule []interface{}
+	for _, msgHashItem := range msgHash {
+		msgHashRule = append(msgHashRule, msgHashItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.WatchLogs(opts, "RelayedMessage", msgHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2CrossDomainMessengerRelayedMessage)
+				if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseRelayedMessage is a log parse operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c.
+//
+// Solidity: event RelayedMessage(bytes32 indexed msgHash)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) ParseRelayedMessage(log types.Log) (*L2CrossDomainMessengerRelayedMessage, error) {
+	event := new(L2CrossDomainMessengerRelayedMessage)
+	if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2CrossDomainMessengerSentMessageIterator is returned from FilterSentMessage and is used to iterate over the raw logs and unpacked data for SentMessage events raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerSentMessageIterator struct {
+	Event *L2CrossDomainMessengerSentMessage // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2CrossDomainMessengerSentMessageIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2CrossDomainMessengerSentMessage)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2CrossDomainMessengerSentMessage)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2CrossDomainMessengerSentMessageIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2CrossDomainMessengerSentMessageIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2CrossDomainMessengerSentMessage represents a SentMessage event raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerSentMessage struct {
+	Target       common.Address
+	Sender       common.Address
+	Message      []byte
+	MessageNonce *big.Int
+	GasLimit     *big.Int
+	Raw          types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessage is a free log retrieval operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) FilterSentMessage(opts *bind.FilterOpts, target []common.Address) (*L2CrossDomainMessengerSentMessageIterator, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.FilterLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerSentMessageIterator{contract: _L2CrossDomainMessenger.contract, event: "SentMessage", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessage is a free log subscription operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) WatchSentMessage(opts *bind.WatchOpts, sink chan<- *L2CrossDomainMessengerSentMessage, target []common.Address) (event.Subscription, error) {
+
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.WatchLogs(opts, "SentMessage", targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2CrossDomainMessengerSentMessage)
+				if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessage is a log parse operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a.
+//
+// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) ParseSentMessage(log types.Log) (*L2CrossDomainMessengerSentMessage, error) {
+	event := new(L2CrossDomainMessengerSentMessage)
+	if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2CrossDomainMessengerSentMessageExtension1Iterator is returned from FilterSentMessageExtension1 and is used to iterate over the raw logs and unpacked data for SentMessageExtension1 events raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerSentMessageExtension1Iterator struct {
+	Event *L2CrossDomainMessengerSentMessageExtension1 // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2CrossDomainMessengerSentMessageExtension1Iterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2CrossDomainMessengerSentMessageExtension1)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2CrossDomainMessengerSentMessageExtension1)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2CrossDomainMessengerSentMessageExtension1Iterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2CrossDomainMessengerSentMessageExtension1Iterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2CrossDomainMessengerSentMessageExtension1 represents a SentMessageExtension1 event raised by the L2CrossDomainMessenger contract.
+type L2CrossDomainMessengerSentMessageExtension1 struct {
+	Sender common.Address
+	Value  *big.Int
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterSentMessageExtension1 is a free log retrieval operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) FilterSentMessageExtension1(opts *bind.FilterOpts, sender []common.Address) (*L2CrossDomainMessengerSentMessageExtension1Iterator, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.FilterLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2CrossDomainMessengerSentMessageExtension1Iterator{contract: _L2CrossDomainMessenger.contract, event: "SentMessageExtension1", logs: logs, sub: sub}, nil
+}
+
+// WatchSentMessageExtension1 is a free log subscription operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) WatchSentMessageExtension1(opts *bind.WatchOpts, sink chan<- *L2CrossDomainMessengerSentMessageExtension1, sender []common.Address) (event.Subscription, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _L2CrossDomainMessenger.contract.WatchLogs(opts, "SentMessageExtension1", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2CrossDomainMessengerSentMessageExtension1)
+				if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseSentMessageExtension1 is a log parse operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546.
+//
+// Solidity: event SentMessageExtension1(address indexed sender, uint256 value)
+func (_L2CrossDomainMessenger *L2CrossDomainMessengerFilterer) ParseSentMessageExtension1(log types.Log) (*L2CrossDomainMessengerSentMessageExtension1, error) {
+	event := new(L2CrossDomainMessengerSentMessageExtension1)
+	if err := _L2CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-bindings/bindings/l2erc721bridge.go b/op-e2e/bindings/l2erc721bridge.go
similarity index 100%
rename from op-bindings/bindings/l2erc721bridge.go
rename to op-e2e/bindings/l2erc721bridge.go
diff --git a/op-e2e/bindings/l2outputoracle.go b/op-e2e/bindings/l2outputoracle.go
new file mode 100644
index 000000000000..1d8934c7c838
--- /dev/null
+++ b/op-e2e/bindings/l2outputoracle.go
@@ -0,0 +1,1373 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// TypesOutputProposal is an auto generated low-level Go binding around an user-defined struct.
+type TypesOutputProposal struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2BlockNumber *big.Int
+}
+
+// L2OutputOracleMetaData contains all meta data concerning the L2OutputOracle contract.
+var L2OutputOracleMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CHALLENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_BLOCK_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PROPOSER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SUBMISSION_INTERVAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"challenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"computeL2Timestamp\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteL2Outputs\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizationPeriodSeconds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2Output\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputProposal\",\"components\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2OutputAfter\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputProposal\",\"components\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2OutputIndexAfter\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_submissionInterval\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l2BlockTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingBlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l2BlockTime\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestOutputIndex\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextOutputIndex\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeL2Output\",\"inputs\":[{\"name\":\"_outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proposer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"startingBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"startingTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionInterval\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputProposed\",\"inputs\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"l2OutputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"l1Timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputsDeleted\",\"inputs\":[{\"name\":\"prevNextOutputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"newNextOutputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+	Bin: "0x60806040523480156200001157600080fd5b50620000256001806000808080806200002b565b62000328565b600054610100900460ff16158080156200004c5750600054600160ff909116105b806200007c575062000069306200031960201b6200135d1760201c565b1580156200007c575060005460ff166001145b620000e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000109576000805461ff0019166101001790555b60008811620001815760405162461bcd60e51b815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e20300000000000006064820152608401620000dc565b60008711620001f95760405162461bcd60e51b815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e20300000000000000000000000006064820152608401620000dc565b428511156200027f5760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201526374696d6560e01b608482015260a401620000dc565b6004889055600587905560018690556002859055600780546001600160a01b038087166001600160a01b0319928316179092556006805492861692909116919091179055600882905580156200030f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6001600160a01b03163b151590565b6115d580620003386000396000f3fe60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a",
+}
+
+// L2OutputOracleABI is the input ABI used to generate the binding from.
+// Deprecated: Use L2OutputOracleMetaData.ABI instead.
+var L2OutputOracleABI = L2OutputOracleMetaData.ABI
+
+// L2OutputOracleBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L2OutputOracleMetaData.Bin instead.
+var L2OutputOracleBin = L2OutputOracleMetaData.Bin
+
+// DeployL2OutputOracle deploys a new Ethereum contract, binding an instance of L2OutputOracle to it.
+func DeployL2OutputOracle(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L2OutputOracle, error) {
+	parsed, err := L2OutputOracleMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2OutputOracleBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L2OutputOracle{L2OutputOracleCaller: L2OutputOracleCaller{contract: contract}, L2OutputOracleTransactor: L2OutputOracleTransactor{contract: contract}, L2OutputOracleFilterer: L2OutputOracleFilterer{contract: contract}}, nil
+}
+
+// L2OutputOracle is an auto generated Go binding around an Ethereum contract.
+type L2OutputOracle struct {
+	L2OutputOracleCaller     // Read-only binding to the contract
+	L2OutputOracleTransactor // Write-only binding to the contract
+	L2OutputOracleFilterer   // Log filterer for contract events
+}
+
+// L2OutputOracleCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L2OutputOracleCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L2OutputOracleTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L2OutputOracleFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L2OutputOracleSession struct {
+	Contract     *L2OutputOracle   // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// L2OutputOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L2OutputOracleCallerSession struct {
+	Contract *L2OutputOracleCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts         // Call options to use throughout this session
+}
+
+// L2OutputOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L2OutputOracleTransactorSession struct {
+	Contract     *L2OutputOracleTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
+}
+
+// L2OutputOracleRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L2OutputOracleRaw struct {
+	Contract *L2OutputOracle // Generic contract binding to access the raw methods on
+}
+
+// L2OutputOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L2OutputOracleCallerRaw struct {
+	Contract *L2OutputOracleCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L2OutputOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L2OutputOracleTransactorRaw struct {
+	Contract *L2OutputOracleTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL2OutputOracle creates a new instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracle(address common.Address, backend bind.ContractBackend) (*L2OutputOracle, error) {
+	contract, err := bindL2OutputOracle(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracle{L2OutputOracleCaller: L2OutputOracleCaller{contract: contract}, L2OutputOracleTransactor: L2OutputOracleTransactor{contract: contract}, L2OutputOracleFilterer: L2OutputOracleFilterer{contract: contract}}, nil
+}
+
+// NewL2OutputOracleCaller creates a new read-only instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleCaller(address common.Address, caller bind.ContractCaller) (*L2OutputOracleCaller, error) {
+	contract, err := bindL2OutputOracle(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleCaller{contract: contract}, nil
+}
+
+// NewL2OutputOracleTransactor creates a new write-only instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*L2OutputOracleTransactor, error) {
+	contract, err := bindL2OutputOracle(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleTransactor{contract: contract}, nil
+}
+
+// NewL2OutputOracleFilterer creates a new log filterer instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleFilterer(address common.Address, filterer bind.ContractFilterer) (*L2OutputOracleFilterer, error) {
+	contract, err := bindL2OutputOracle(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleFilterer{contract: contract}, nil
+}
+
+// bindL2OutputOracle binds a generic wrapper to an already deployed contract.
+func bindL2OutputOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L2OutputOracleABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2OutputOracle *L2OutputOracleRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2OutputOracle.Contract.L2OutputOracleCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2OutputOracle *L2OutputOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.L2OutputOracleTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2OutputOracle *L2OutputOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.L2OutputOracleTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2OutputOracle *L2OutputOracleCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2OutputOracle.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2OutputOracle *L2OutputOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2OutputOracle *L2OutputOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.contract.Transact(opts, method, params...)
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) CHALLENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "CHALLENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) CHALLENGER() (common.Address, error) {
+	return _L2OutputOracle.Contract.CHALLENGER(&_L2OutputOracle.CallOpts)
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) CHALLENGER() (common.Address, error) {
+	return _L2OutputOracle.Contract.CHALLENGER(&_L2OutputOracle.CallOpts)
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) FINALIZATIONPERIODSECONDS(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "FINALIZATION_PERIOD_SECONDS")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) FINALIZATIONPERIODSECONDS() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FINALIZATIONPERIODSECONDS(&_L2OutputOracle.CallOpts)
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) FINALIZATIONPERIODSECONDS() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FINALIZATIONPERIODSECONDS(&_L2OutputOracle.CallOpts)
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) L2BLOCKTIME(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "L2_BLOCK_TIME")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) L2BLOCKTIME() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BLOCKTIME(&_L2OutputOracle.CallOpts)
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) L2BLOCKTIME() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BLOCKTIME(&_L2OutputOracle.CallOpts)
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) PROPOSER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "PROPOSER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) PROPOSER() (common.Address, error) {
+	return _L2OutputOracle.Contract.PROPOSER(&_L2OutputOracle.CallOpts)
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) PROPOSER() (common.Address, error) {
+	return _L2OutputOracle.Contract.PROPOSER(&_L2OutputOracle.CallOpts)
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) SUBMISSIONINTERVAL(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "SUBMISSION_INTERVAL")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) SUBMISSIONINTERVAL() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SUBMISSIONINTERVAL(&_L2OutputOracle.CallOpts)
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) SUBMISSIONINTERVAL() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SUBMISSIONINTERVAL(&_L2OutputOracle.CallOpts)
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) Challenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "challenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) Challenger() (common.Address, error) {
+	return _L2OutputOracle.Contract.Challenger(&_L2OutputOracle.CallOpts)
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Challenger() (common.Address, error) {
+	return _L2OutputOracle.Contract.Challenger(&_L2OutputOracle.CallOpts)
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) ComputeL2Timestamp(opts *bind.CallOpts, _l2BlockNumber *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "computeL2Timestamp", _l2BlockNumber)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) ComputeL2Timestamp(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.ComputeL2Timestamp(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) ComputeL2Timestamp(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.ComputeL2Timestamp(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) FinalizationPeriodSeconds(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "finalizationPeriodSeconds")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) FinalizationPeriodSeconds() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FinalizationPeriodSeconds(&_L2OutputOracle.CallOpts)
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) FinalizationPeriodSeconds() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FinalizationPeriodSeconds(&_L2OutputOracle.CallOpts)
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2Output(opts *bind.CallOpts, _l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2Output", _l2OutputIndex)
+
+	if err != nil {
+		return *new(TypesOutputProposal), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(TypesOutputProposal)).(*TypesOutputProposal)
+
+	return out0, err
+
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleSession) GetL2Output(_l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2Output(&_L2OutputOracle.CallOpts, _l2OutputIndex)
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2Output(_l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2Output(&_L2OutputOracle.CallOpts, _l2OutputIndex)
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2OutputAfter(opts *bind.CallOpts, _l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2OutputAfter", _l2BlockNumber)
+
+	if err != nil {
+		return *new(TypesOutputProposal), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(TypesOutputProposal)).(*TypesOutputProposal)
+
+	return out0, err
+
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleSession) GetL2OutputAfter(_l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2OutputAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2OutputAfter(_l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2OutputAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2OutputIndexAfter(opts *bind.CallOpts, _l2BlockNumber *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2OutputIndexAfter", _l2BlockNumber)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) GetL2OutputIndexAfter(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.GetL2OutputIndexAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2OutputIndexAfter(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.GetL2OutputIndexAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) L2BlockTime(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "l2BlockTime")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) L2BlockTime() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BlockTime(&_L2OutputOracle.CallOpts)
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) L2BlockTime() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BlockTime(&_L2OutputOracle.CallOpts)
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) LatestBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "latestBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) LatestBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) LatestBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) LatestOutputIndex(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "latestOutputIndex")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) LatestOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) LatestOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) NextBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "nextBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) NextBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) NextBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) NextOutputIndex(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "nextOutputIndex")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) NextOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) NextOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) Proposer(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "proposer")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) Proposer() (common.Address, error) {
+	return _L2OutputOracle.Contract.Proposer(&_L2OutputOracle.CallOpts)
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Proposer() (common.Address, error) {
+	return _L2OutputOracle.Contract.Proposer(&_L2OutputOracle.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) StartingBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "startingBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) StartingBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) StartingBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) StartingTimestamp(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "startingTimestamp")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) StartingTimestamp() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingTimestamp(&_L2OutputOracle.CallOpts)
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) StartingTimestamp() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingTimestamp(&_L2OutputOracle.CallOpts)
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) SubmissionInterval(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "submissionInterval")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) SubmissionInterval() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SubmissionInterval(&_L2OutputOracle.CallOpts)
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) SubmissionInterval() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SubmissionInterval(&_L2OutputOracle.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleSession) Version() (string, error) {
+	return _L2OutputOracle.Contract.Version(&_L2OutputOracle.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Version() (string, error) {
+	return _L2OutputOracle.Contract.Version(&_L2OutputOracle.CallOpts)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) DeleteL2Outputs(opts *bind.TransactOpts, _l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "deleteL2Outputs", _l2OutputIndex)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleSession) DeleteL2Outputs(_l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.DeleteL2Outputs(&_L2OutputOracle.TransactOpts, _l2OutputIndex)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) DeleteL2Outputs(_l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.DeleteL2Outputs(&_L2OutputOracle.TransactOpts, _l2OutputIndex)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) Initialize(opts *bind.TransactOpts, _submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "initialize", _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleSession) Initialize(_submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) Initialize(_submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) ProposeL2Output(opts *bind.TransactOpts, _outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "proposeL2Output", _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleSession) ProposeL2Output(_outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.ProposeL2Output(&_L2OutputOracle.TransactOpts, _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) ProposeL2Output(_outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.ProposeL2Output(&_L2OutputOracle.TransactOpts, _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// L2OutputOracleInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L2OutputOracle contract.
+type L2OutputOracleInitializedIterator struct {
+	Event *L2OutputOracleInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleInitialized represents a Initialized event raised by the L2OutputOracle contract.
+type L2OutputOracleInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterInitialized(opts *bind.FilterOpts) (*L2OutputOracleInitializedIterator, error) {
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleInitializedIterator{contract: _L2OutputOracle.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L2OutputOracleInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleInitialized)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseInitialized(log types.Log) (*L2OutputOracleInitialized, error) {
+	event := new(L2OutputOracleInitialized)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2OutputOracleOutputProposedIterator is returned from FilterOutputProposed and is used to iterate over the raw logs and unpacked data for OutputProposed events raised by the L2OutputOracle contract.
+type L2OutputOracleOutputProposedIterator struct {
+	Event *L2OutputOracleOutputProposed // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleOutputProposedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleOutputProposed)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleOutputProposed)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleOutputProposedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleOutputProposedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleOutputProposed represents a OutputProposed event raised by the L2OutputOracle contract.
+type L2OutputOracleOutputProposed struct {
+	OutputRoot    [32]byte
+	L2OutputIndex *big.Int
+	L2BlockNumber *big.Int
+	L1Timestamp   *big.Int
+	Raw           types.Log // Blockchain specific contextual infos
+}
+
+// FilterOutputProposed is a free log retrieval operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputProposed(opts *bind.FilterOpts, outputRoot [][32]byte, l2OutputIndex []*big.Int, l2BlockNumber []*big.Int) (*L2OutputOracleOutputProposedIterator, error) {
+
+	var outputRootRule []interface{}
+	for _, outputRootItem := range outputRoot {
+		outputRootRule = append(outputRootRule, outputRootItem)
+	}
+	var l2OutputIndexRule []interface{}
+	for _, l2OutputIndexItem := range l2OutputIndex {
+		l2OutputIndexRule = append(l2OutputIndexRule, l2OutputIndexItem)
+	}
+	var l2BlockNumberRule []interface{}
+	for _, l2BlockNumberItem := range l2BlockNumber {
+		l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputProposed", outputRootRule, l2OutputIndexRule, l2BlockNumberRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleOutputProposedIterator{contract: _L2OutputOracle.contract, event: "OutputProposed", logs: logs, sub: sub}, nil
+}
+
+// WatchOutputProposed is a free log subscription operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputProposed(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputProposed, outputRoot [][32]byte, l2OutputIndex []*big.Int, l2BlockNumber []*big.Int) (event.Subscription, error) {
+
+	var outputRootRule []interface{}
+	for _, outputRootItem := range outputRoot {
+		outputRootRule = append(outputRootRule, outputRootItem)
+	}
+	var l2OutputIndexRule []interface{}
+	for _, l2OutputIndexItem := range l2OutputIndex {
+		l2OutputIndexRule = append(l2OutputIndexRule, l2OutputIndexItem)
+	}
+	var l2BlockNumberRule []interface{}
+	for _, l2BlockNumberItem := range l2BlockNumber {
+		l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputProposed", outputRootRule, l2OutputIndexRule, l2BlockNumberRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleOutputProposed)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "OutputProposed", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOutputProposed is a log parse operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseOutputProposed(log types.Log) (*L2OutputOracleOutputProposed, error) {
+	event := new(L2OutputOracleOutputProposed)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "OutputProposed", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2OutputOracleOutputsDeletedIterator is returned from FilterOutputsDeleted and is used to iterate over the raw logs and unpacked data for OutputsDeleted events raised by the L2OutputOracle contract.
+type L2OutputOracleOutputsDeletedIterator struct {
+	Event *L2OutputOracleOutputsDeleted // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleOutputsDeletedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleOutputsDeleted)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleOutputsDeleted)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleOutputsDeletedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleOutputsDeletedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleOutputsDeleted represents a OutputsDeleted event raised by the L2OutputOracle contract.
+type L2OutputOracleOutputsDeleted struct {
+	PrevNextOutputIndex *big.Int
+	NewNextOutputIndex  *big.Int
+	Raw                 types.Log // Blockchain specific contextual infos
+}
+
+// FilterOutputsDeleted is a free log retrieval operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputsDeleted(opts *bind.FilterOpts, prevNextOutputIndex []*big.Int, newNextOutputIndex []*big.Int) (*L2OutputOracleOutputsDeletedIterator, error) {
+
+	var prevNextOutputIndexRule []interface{}
+	for _, prevNextOutputIndexItem := range prevNextOutputIndex {
+		prevNextOutputIndexRule = append(prevNextOutputIndexRule, prevNextOutputIndexItem)
+	}
+	var newNextOutputIndexRule []interface{}
+	for _, newNextOutputIndexItem := range newNextOutputIndex {
+		newNextOutputIndexRule = append(newNextOutputIndexRule, newNextOutputIndexItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputsDeleted", prevNextOutputIndexRule, newNextOutputIndexRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleOutputsDeletedIterator{contract: _L2OutputOracle.contract, event: "OutputsDeleted", logs: logs, sub: sub}, nil
+}
+
+// WatchOutputsDeleted is a free log subscription operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputsDeleted(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputsDeleted, prevNextOutputIndex []*big.Int, newNextOutputIndex []*big.Int) (event.Subscription, error) {
+
+	var prevNextOutputIndexRule []interface{}
+	for _, prevNextOutputIndexItem := range prevNextOutputIndex {
+		prevNextOutputIndexRule = append(prevNextOutputIndexRule, prevNextOutputIndexItem)
+	}
+	var newNextOutputIndexRule []interface{}
+	for _, newNextOutputIndexItem := range newNextOutputIndex {
+		newNextOutputIndexRule = append(newNextOutputIndexRule, newNextOutputIndexItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputsDeleted", prevNextOutputIndexRule, newNextOutputIndexRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleOutputsDeleted)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "OutputsDeleted", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOutputsDeleted is a log parse operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseOutputsDeleted(log types.Log) (*L2OutputOracleOutputsDeleted, error) {
+	event := new(L2OutputOracleOutputsDeleted)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "OutputsDeleted", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-e2e/bindings/l2standardbridge.go b/op-e2e/bindings/l2standardbridge.go
new file mode 100644
index 000000000000..f303cfb1eaba
--- /dev/null
+++ b/op-e2e/bindings/l2standardbridge.go
@@ -0,0 +1,1785 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L2StandardBridgeMetaData contains all meta data concerning the L2StandardBridge contract.
+var L2StandardBridgeMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OTHER_BRIDGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractStandardBridge\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgeERC20\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bridgeERC20To\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bridgeETH\",\"inputs\":[{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"bridgeETHTo\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"finalizeBridgeERC20\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizeBridgeETH\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"finalizeDeposit\",\"inputs\":[{\"name\":\"_l1Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_l2Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_otherBridge\",\"type\":\"address\",\"internalType\":\"contractStandardBridge\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l1TokenBridge\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"otherBridge\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractStandardBridge\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_l2Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawTo\",\"inputs\":[{\"name\":\"_l2Token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"DepositFinalized\",\"inputs\":[{\"name\":\"l1Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"l2Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ERC20BridgeFinalized\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"remoteToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ERC20BridgeInitiated\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"remoteToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHBridgeFinalized\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHBridgeInitiated\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalInitiated\",\"inputs\":[{\"name\":\"l1Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"l2Token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false}]",
+	Bin: "0x60806040523480156200001157600080fd5b506200001e600062000024565b62000217565b600054610100900460ff1615808015620000455750600054600160ff909116105b8062000075575062000062306200016d60201b620004811760201c565b15801562000075575060005460ff166001145b620000de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000102576000805461ff0019166101001790555b62000122734200000000000000000000000000000000000007836200017c565b801562000169576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054610100900460ff16620001e95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b612caf80620002276000396000f3fe60806040526004361061012d5760003560e01c8063662a633a116100a5578063927ede2d11610074578063c4d66de811610059578063c4d66de814610421578063c89701a214610441578063e11013dd1461046e57600080fd5b8063927ede2d146103e3578063a3a795481461040e57600080fd5b8063662a633a1461036a5780637f46ddb21461025a578063870876231461037d5780638f601f661461039d57600080fd5b806336c717c1116100fc578063540abf73116100e1578063540abf73146102d857806354fd4d50146102f85780635c975abb1461034e57600080fd5b806336c717c11461025a5780633cb747bf146102ab57600080fd5b80630166a07a1461020157806309fc8843146102215780631635f5fd1461023457806332b7006d1461024757600080fd5b366101fc57333b156101c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b6101fa73deaddeaddeaddeaddeaddeaddeaddeaddead000033333462030d406040518060200160405280600081525061049d565b005b600080fd5b34801561020d57600080fd5b506101fa61021c36600461266d565b610578565b6101fa61022f36600461271e565b61091a565b6101fa610242366004612771565b6109f1565b6101fa6102553660046127e4565b610ed8565b34801561026657600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102b757600080fd5b506003546102819073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102e457600080fd5b506101fa6102f3366004612838565b610fb2565b34801561030457600080fd5b506103416040518060400160405280601b81526020017f312e392e302d626574612b637573746f6d2d6761732d746f6b656e000000000081525081565b6040516102a29190612925565b34801561035a57600080fd5b50604051600081526020016102a2565b6101fa61037836600461266d565b610ff7565b34801561038957600080fd5b506101fa610398366004612938565b61106a565b3480156103a957600080fd5b506103d56103b83660046129bb565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102a2565b3480156103ef57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff16610281565b6101fa61041c366004612938565b61113e565b34801561042d57600080fd5b506101fa61043c3660046129f4565b611182565b34801561044d57600080fd5b506004546102819073ffffffffffffffffffffffffffffffffffffffff1681565b6101fa61047c366004612a11565b61132b565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b7fffffffffffffffffffffffff215221522152215221522152215221522153000073ffffffffffffffffffffffffffffffffffffffff8716016104ec576104e78585858585611374565b610570565b60008673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055d9190612a74565b905061056e878288888888886115d3565b505b505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561064b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561060f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106339190612a74565b73ffffffffffffffffffffffffffffffffffffffff16145b6106fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b610706876118fe565b15610854576107158787611960565b6107c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b15801561083757600080fd5b505af115801561084b573d6000803e3d6000fd5b505050506108d6565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610892908490612ac0565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c16835293905291909120919091556108d6908585611a80565b61056e878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b5492505050565b333b156109a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b6109ec3333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061137492505050565b505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610ac4575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac9190612a74565b73ffffffffffffffffffffffffffffffffffffffff16145b610b76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b610b7e611be2565b15610c0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e00000000000000000060648201526084016101bd565b823414610c9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e7420726571756972656400000000000060648201526084016101bd565b3073ffffffffffffffffffffffffffffffffffffffff851603610d3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c66000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610dea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e67657200000000000000000000000000000000000000000000000060648201526084016101bd565b610e2c85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c2192505050565b6000610e49855a8660405180602001604052806000815250611cc2565b905080610570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b333b15610f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b610fab853333878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049d92505050565b5050505050565b61056e87873388888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506115d392505050565b73ffffffffffffffffffffffffffffffffffffffff8716158015611044575073ffffffffffffffffffffffffffffffffffffffff861673deaddeaddeaddeaddeaddeaddeaddeaddead0000145b1561105b5761105685858585856109f1565b61056e565b61056e86888787878787610578565b333b156110f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b61057086863333888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506115d392505050565b610570863387878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049d92505050565b600054610100900460ff16158080156111a25750600054600160ff909116105b806111bc5750303b1580156111bc575060005460ff166001145b611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016101bd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156112a657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6112c473420000000000000000000000000000000000000783611cdc565b801561132757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b61136e3385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061137492505050565b50505050565b61137c611be2565b15611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e00000000000000000060648201526084016101bd565b823414611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c7565000060648201526084016101bd565b6114a485858584611dc6565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd0000000000000000000000000000000000000000000000000000000090611507908b908b9086908a90602401612ad7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261159a92918890600401612b20565b6000604051808303818588803b1580156115b357600080fd5b505af11580156115c7573d6000803e3d6000fd5b50505050505050505050565b6115dc876118fe565b1561172a576115eb8787611960565b61169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b15801561170d57600080fd5b505af1158015611721573d6000803e3d6000fd5b505050506117be565b61174c73ffffffffffffffffffffffffffffffffffffffff8816863086611e67565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a168352929052205461178a908490612b65565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b6117cc878787878786611ec5565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611830908b908d908c908c908c908b90602401612b7d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b90921682526118c392918790600401612b20565b600060405180830381600087803b1580156118dd57600080fd5b505af11580156118f1573d6000803e3d6000fd5b5050505050505050505050565b600061192a827f1d1d8b6300000000000000000000000000000000000000000000000000000000611f53565b8061195a575061195a827fec4fc8e300000000000000000000000000000000000000000000000000000000611f53565b92915050565b600061198c837f1d1d8b6300000000000000000000000000000000000000000000000000000000611f53565b15611a35578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a009190612a74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905061195a565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119dc573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109ec9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611f76565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611bcc93929190612bd8565b60405180910390a4610570868686868686612082565b600080611bed61210a565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611cae93929190612bd8565b60405180910390a461136e84848484612198565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611d73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016101bd565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611e5393929190612bd8565b60405180910390a461136e84848484612205565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261136e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611ad2565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611f3d93929190612bd8565b60405180910390a4610570868686868686612264565b6000611f5e836122dc565b8015611f6f5750611f6f8383612340565b9392505050565b6000611fd8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661240f9092919063ffffffff16565b8051909150156109ec5780806020019051810190611ff69190612c16565b6109ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101bd565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8686866040516120fa93929190612bd8565b60405180910390a4505050505050565b60008073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16634397dfef6040518163ffffffff1660e01b81526004016040805180830381865afa15801561216b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218f9190612c38565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d84846040516121f7929190612c6d565b60405180910390a350505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af584846040516121f7929190612c6d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8686866040516120fa93929190612bd8565b6000612308827f01ffc9a700000000000000000000000000000000000000000000000000000000612340565b801561195a5750612339827fffffffff00000000000000000000000000000000000000000000000000000000612340565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156123f8575060208210155b80156124045750600081115b979650505050505050565b606061241e8484600085612426565b949350505050565b6060824710156124b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101bd565b73ffffffffffffffffffffffffffffffffffffffff85163b612536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101bd565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161255f9190612c86565b60006040518083038185875af1925050503d806000811461259c576040519150601f19603f3d011682016040523d82523d6000602084013e6125a1565b606091505b5091509150612404828286606083156125bb575081611f6f565b8251156125cb5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101bd9190612925565b73ffffffffffffffffffffffffffffffffffffffff8116811461262157600080fd5b50565b60008083601f84011261263657600080fd5b50813567ffffffffffffffff81111561264e57600080fd5b60208301915083602082850101111561266657600080fd5b9250929050565b600080600080600080600060c0888a03121561268857600080fd5b8735612693816125ff565b965060208801356126a3816125ff565b955060408801356126b3816125ff565b945060608801356126c3816125ff565b93506080880135925060a088013567ffffffffffffffff8111156126e657600080fd5b6126f28a828b01612624565b989b979a50959850939692959293505050565b803563ffffffff8116811461271957600080fd5b919050565b60008060006040848603121561273357600080fd5b61273c84612705565b9250602084013567ffffffffffffffff81111561275857600080fd5b61276486828701612624565b9497909650939450505050565b60008060008060006080868803121561278957600080fd5b8535612794816125ff565b945060208601356127a4816125ff565b935060408601359250606086013567ffffffffffffffff8111156127c757600080fd5b6127d388828901612624565b969995985093965092949392505050565b6000806000806000608086880312156127fc57600080fd5b8535612807816125ff565b94506020860135935061281c60408701612705565b9250606086013567ffffffffffffffff8111156127c757600080fd5b600080600080600080600060c0888a03121561285357600080fd5b873561285e816125ff565b9650602088013561286e816125ff565b9550604088013561287e816125ff565b94506060880135935061289360808901612705565b925060a088013567ffffffffffffffff8111156126e657600080fd5b60005b838110156128ca5781810151838201526020016128b2565b8381111561136e5750506000910152565b600081518084526128f38160208601602086016128af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f6f60208301846128db565b60008060008060008060a0878903121561295157600080fd5b863561295c816125ff565b9550602087013561296c816125ff565b94506040870135935061298160608801612705565b9250608087013567ffffffffffffffff81111561299d57600080fd5b6129a989828a01612624565b979a9699509497509295939492505050565b600080604083850312156129ce57600080fd5b82356129d9816125ff565b915060208301356129e9816125ff565b809150509250929050565b600060208284031215612a0657600080fd5b8135611f6f816125ff565b60008060008060608587031215612a2757600080fd5b8435612a32816125ff565b9350612a4060208601612705565b9250604085013567ffffffffffffffff811115612a5c57600080fd5b612a6887828801612624565b95989497509550505050565b600060208284031215612a8657600080fd5b8151611f6f816125ff565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612ad257612ad2612a91565b500390565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612b1660808301846128db565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612b4f60608301856128db565b905063ffffffff83166040830152949350505050565b60008219821115612b7857612b78612a91565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612bcc60c08301846128db565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612c0d60608301846128db565b95945050505050565b600060208284031215612c2857600080fd5b81518015158114611f6f57600080fd5b60008060408385031215612c4b57600080fd5b8251612c56816125ff565b602084015190925060ff811681146129e957600080fd5b82815260406020820152600061241e60408301846128db565b60008251612c988184602087016128af565b919091019291505056fea164736f6c634300080f000a",
+}
+
+// L2StandardBridgeABI is the input ABI used to generate the binding from.
+// Deprecated: Use L2StandardBridgeMetaData.ABI instead.
+var L2StandardBridgeABI = L2StandardBridgeMetaData.ABI
+
+// L2StandardBridgeBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L2StandardBridgeMetaData.Bin instead.
+var L2StandardBridgeBin = L2StandardBridgeMetaData.Bin
+
+// DeployL2StandardBridge deploys a new Ethereum contract, binding an instance of L2StandardBridge to it.
+func DeployL2StandardBridge(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L2StandardBridge, error) {
+	parsed, err := L2StandardBridgeMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2StandardBridgeBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L2StandardBridge{L2StandardBridgeCaller: L2StandardBridgeCaller{contract: contract}, L2StandardBridgeTransactor: L2StandardBridgeTransactor{contract: contract}, L2StandardBridgeFilterer: L2StandardBridgeFilterer{contract: contract}}, nil
+}
+
+// L2StandardBridge is an auto generated Go binding around an Ethereum contract.
+type L2StandardBridge struct {
+	L2StandardBridgeCaller     // Read-only binding to the contract
+	L2StandardBridgeTransactor // Write-only binding to the contract
+	L2StandardBridgeFilterer   // Log filterer for contract events
+}
+
+// L2StandardBridgeCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L2StandardBridgeCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2StandardBridgeTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L2StandardBridgeTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2StandardBridgeFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L2StandardBridgeFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2StandardBridgeSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L2StandardBridgeSession struct {
+	Contract     *L2StandardBridge // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// L2StandardBridgeCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L2StandardBridgeCallerSession struct {
+	Contract *L2StandardBridgeCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts           // Call options to use throughout this session
+}
+
+// L2StandardBridgeTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L2StandardBridgeTransactorSession struct {
+	Contract     *L2StandardBridgeTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
+}
+
+// L2StandardBridgeRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L2StandardBridgeRaw struct {
+	Contract *L2StandardBridge // Generic contract binding to access the raw methods on
+}
+
+// L2StandardBridgeCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L2StandardBridgeCallerRaw struct {
+	Contract *L2StandardBridgeCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L2StandardBridgeTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L2StandardBridgeTransactorRaw struct {
+	Contract *L2StandardBridgeTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL2StandardBridge creates a new instance of L2StandardBridge, bound to a specific deployed contract.
+func NewL2StandardBridge(address common.Address, backend bind.ContractBackend) (*L2StandardBridge, error) {
+	contract, err := bindL2StandardBridge(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L2StandardBridge{L2StandardBridgeCaller: L2StandardBridgeCaller{contract: contract}, L2StandardBridgeTransactor: L2StandardBridgeTransactor{contract: contract}, L2StandardBridgeFilterer: L2StandardBridgeFilterer{contract: contract}}, nil
+}
+
+// NewL2StandardBridgeCaller creates a new read-only instance of L2StandardBridge, bound to a specific deployed contract.
+func NewL2StandardBridgeCaller(address common.Address, caller bind.ContractCaller) (*L2StandardBridgeCaller, error) {
+	contract, err := bindL2StandardBridge(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2StandardBridgeCaller{contract: contract}, nil
+}
+
+// NewL2StandardBridgeTransactor creates a new write-only instance of L2StandardBridge, bound to a specific deployed contract.
+func NewL2StandardBridgeTransactor(address common.Address, transactor bind.ContractTransactor) (*L2StandardBridgeTransactor, error) {
+	contract, err := bindL2StandardBridge(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2StandardBridgeTransactor{contract: contract}, nil
+}
+
+// NewL2StandardBridgeFilterer creates a new log filterer instance of L2StandardBridge, bound to a specific deployed contract.
+func NewL2StandardBridgeFilterer(address common.Address, filterer bind.ContractFilterer) (*L2StandardBridgeFilterer, error) {
+	contract, err := bindL2StandardBridge(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L2StandardBridgeFilterer{contract: contract}, nil
+}
+
+// bindL2StandardBridge binds a generic wrapper to an already deployed contract.
+func bindL2StandardBridge(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L2StandardBridgeABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2StandardBridge *L2StandardBridgeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2StandardBridge.Contract.L2StandardBridgeCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2StandardBridge *L2StandardBridgeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.L2StandardBridgeTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2StandardBridge *L2StandardBridgeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.L2StandardBridgeTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2StandardBridge *L2StandardBridgeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2StandardBridge.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2StandardBridge *L2StandardBridgeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2StandardBridge *L2StandardBridgeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeCaller) MESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2StandardBridge.contract.Call(opts, &out, "MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeSession) MESSENGER() (common.Address, error) {
+	return _L2StandardBridge.Contract.MESSENGER(&_L2StandardBridge.CallOpts)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeCallerSession) MESSENGER() (common.Address, error) {
+	return _L2StandardBridge.Contract.MESSENGER(&_L2StandardBridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeCaller) OTHERBRIDGE(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2StandardBridge.contract.Call(opts, &out, "OTHER_BRIDGE")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeSession) OTHERBRIDGE() (common.Address, error) {
+	return _L2StandardBridge.Contract.OTHERBRIDGE(&_L2StandardBridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeCallerSession) OTHERBRIDGE() (common.Address, error) {
+	return _L2StandardBridge.Contract.OTHERBRIDGE(&_L2StandardBridge.CallOpts)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L2StandardBridge *L2StandardBridgeCaller) Deposits(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _L2StandardBridge.contract.Call(opts, &out, "deposits", arg0, arg1)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L2StandardBridge *L2StandardBridgeSession) Deposits(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _L2StandardBridge.Contract.Deposits(&_L2StandardBridge.CallOpts, arg0, arg1)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_L2StandardBridge *L2StandardBridgeCallerSession) Deposits(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _L2StandardBridge.Contract.Deposits(&_L2StandardBridge.CallOpts, arg0, arg1)
+}
+
+// L1TokenBridge is a free data retrieval call binding the contract method 0x36c717c1.
+//
+// Solidity: function l1TokenBridge() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeCaller) L1TokenBridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2StandardBridge.contract.Call(opts, &out, "l1TokenBridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L1TokenBridge is a free data retrieval call binding the contract method 0x36c717c1.
+//
+// Solidity: function l1TokenBridge() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeSession) L1TokenBridge() (common.Address, error) {
+	return _L2StandardBridge.Contract.L1TokenBridge(&_L2StandardBridge.CallOpts)
+}
+
+// L1TokenBridge is a free data retrieval call binding the contract method 0x36c717c1.
+//
+// Solidity: function l1TokenBridge() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeCallerSession) L1TokenBridge() (common.Address, error) {
+	return _L2StandardBridge.Contract.L1TokenBridge(&_L2StandardBridge.CallOpts)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeCaller) Messenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2StandardBridge.contract.Call(opts, &out, "messenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeSession) Messenger() (common.Address, error) {
+	return _L2StandardBridge.Contract.Messenger(&_L2StandardBridge.CallOpts)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeCallerSession) Messenger() (common.Address, error) {
+	return _L2StandardBridge.Contract.Messenger(&_L2StandardBridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeCaller) OtherBridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2StandardBridge.contract.Call(opts, &out, "otherBridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeSession) OtherBridge() (common.Address, error) {
+	return _L2StandardBridge.Contract.OtherBridge(&_L2StandardBridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_L2StandardBridge *L2StandardBridgeCallerSession) OtherBridge() (common.Address, error) {
+	return _L2StandardBridge.Contract.OtherBridge(&_L2StandardBridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L2StandardBridge *L2StandardBridgeCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _L2StandardBridge.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L2StandardBridge *L2StandardBridgeSession) Paused() (bool, error) {
+	return _L2StandardBridge.Contract.Paused(&_L2StandardBridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_L2StandardBridge *L2StandardBridgeCallerSession) Paused() (bool, error) {
+	return _L2StandardBridge.Contract.Paused(&_L2StandardBridge.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2StandardBridge *L2StandardBridgeCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L2StandardBridge.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2StandardBridge *L2StandardBridgeSession) Version() (string, error) {
+	return _L2StandardBridge.Contract.Version(&_L2StandardBridge.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2StandardBridge *L2StandardBridgeCallerSession) Version() (string, error) {
+	return _L2StandardBridge.Contract.Version(&_L2StandardBridge.CallOpts)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L2StandardBridge *L2StandardBridgeTransactor) BridgeERC20(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.contract.Transact(opts, "bridgeERC20", _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L2StandardBridge *L2StandardBridgeSession) BridgeERC20(_localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.BridgeERC20(&_L2StandardBridge.TransactOpts, _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L2StandardBridge *L2StandardBridgeTransactorSession) BridgeERC20(_localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.BridgeERC20(&_L2StandardBridge.TransactOpts, _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L2StandardBridge *L2StandardBridgeTransactor) BridgeERC20To(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.contract.Transact(opts, "bridgeERC20To", _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L2StandardBridge *L2StandardBridgeSession) BridgeERC20To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.BridgeERC20To(&_L2StandardBridge.TransactOpts, _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_L2StandardBridge *L2StandardBridgeTransactorSession) BridgeERC20To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.BridgeERC20To(&_L2StandardBridge.TransactOpts, _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactor) BridgeETH(opts *bind.TransactOpts, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.contract.Transact(opts, "bridgeETH", _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeSession) BridgeETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.BridgeETH(&_L2StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactorSession) BridgeETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.BridgeETH(&_L2StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactor) BridgeETHTo(opts *bind.TransactOpts, _to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.contract.Transact(opts, "bridgeETHTo", _to, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeSession) BridgeETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.BridgeETHTo(&_L2StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactorSession) BridgeETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.BridgeETHTo(&_L2StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L2StandardBridge *L2StandardBridgeTransactor) FinalizeBridgeERC20(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.contract.Transact(opts, "finalizeBridgeERC20", _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L2StandardBridge *L2StandardBridgeSession) FinalizeBridgeERC20(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.FinalizeBridgeERC20(&_L2StandardBridge.TransactOpts, _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_L2StandardBridge *L2StandardBridgeTransactorSession) FinalizeBridgeERC20(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.FinalizeBridgeERC20(&_L2StandardBridge.TransactOpts, _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactor) FinalizeBridgeETH(opts *bind.TransactOpts, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.contract.Transact(opts, "finalizeBridgeETH", _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeSession) FinalizeBridgeETH(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.FinalizeBridgeETH(&_L2StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactorSession) FinalizeBridgeETH(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.FinalizeBridgeETH(&_L2StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeDeposit is a paid mutator transaction binding the contract method 0x662a633a.
+//
+// Solidity: function finalizeDeposit(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactor) FinalizeDeposit(opts *bind.TransactOpts, _l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.contract.Transact(opts, "finalizeDeposit", _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// FinalizeDeposit is a paid mutator transaction binding the contract method 0x662a633a.
+//
+// Solidity: function finalizeDeposit(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeSession) FinalizeDeposit(_l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.FinalizeDeposit(&_L2StandardBridge.TransactOpts, _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// FinalizeDeposit is a paid mutator transaction binding the contract method 0x662a633a.
+//
+// Solidity: function finalizeDeposit(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactorSession) FinalizeDeposit(_l1Token common.Address, _l2Token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.FinalizeDeposit(&_L2StandardBridge.TransactOpts, _l1Token, _l2Token, _from, _to, _amount, _extraData)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _otherBridge) returns()
+func (_L2StandardBridge *L2StandardBridgeTransactor) Initialize(opts *bind.TransactOpts, _otherBridge common.Address) (*types.Transaction, error) {
+	return _L2StandardBridge.contract.Transact(opts, "initialize", _otherBridge)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _otherBridge) returns()
+func (_L2StandardBridge *L2StandardBridgeSession) Initialize(_otherBridge common.Address) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.Initialize(&_L2StandardBridge.TransactOpts, _otherBridge)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _otherBridge) returns()
+func (_L2StandardBridge *L2StandardBridgeTransactorSession) Initialize(_otherBridge common.Address) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.Initialize(&_L2StandardBridge.TransactOpts, _otherBridge)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0x32b7006d.
+//
+// Solidity: function withdraw(address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactor) Withdraw(opts *bind.TransactOpts, _l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.contract.Transact(opts, "withdraw", _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0x32b7006d.
+//
+// Solidity: function withdraw(address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeSession) Withdraw(_l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.Withdraw(&_L2StandardBridge.TransactOpts, _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0x32b7006d.
+//
+// Solidity: function withdraw(address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactorSession) Withdraw(_l2Token common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.Withdraw(&_L2StandardBridge.TransactOpts, _l2Token, _amount, _minGasLimit, _extraData)
+}
+
+// WithdrawTo is a paid mutator transaction binding the contract method 0xa3a79548.
+//
+// Solidity: function withdrawTo(address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactor) WithdrawTo(opts *bind.TransactOpts, _l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.contract.Transact(opts, "withdrawTo", _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// WithdrawTo is a paid mutator transaction binding the contract method 0xa3a79548.
+//
+// Solidity: function withdrawTo(address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeSession) WithdrawTo(_l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.WithdrawTo(&_L2StandardBridge.TransactOpts, _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// WithdrawTo is a paid mutator transaction binding the contract method 0xa3a79548.
+//
+// Solidity: function withdrawTo(address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactorSession) WithdrawTo(_l2Token common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.WithdrawTo(&_L2StandardBridge.TransactOpts, _l2Token, _to, _amount, _minGasLimit, _extraData)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2StandardBridge.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L2StandardBridge *L2StandardBridgeSession) Receive() (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.Receive(&_L2StandardBridge.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L2StandardBridge *L2StandardBridgeTransactorSession) Receive() (*types.Transaction, error) {
+	return _L2StandardBridge.Contract.Receive(&_L2StandardBridge.TransactOpts)
+}
+
+// L2StandardBridgeDepositFinalizedIterator is returned from FilterDepositFinalized and is used to iterate over the raw logs and unpacked data for DepositFinalized events raised by the L2StandardBridge contract.
+type L2StandardBridgeDepositFinalizedIterator struct {
+	Event *L2StandardBridgeDepositFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2StandardBridgeDepositFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2StandardBridgeDepositFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2StandardBridgeDepositFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2StandardBridgeDepositFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2StandardBridgeDepositFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2StandardBridgeDepositFinalized represents a DepositFinalized event raised by the L2StandardBridge contract.
+type L2StandardBridgeDepositFinalized struct {
+	L1Token   common.Address
+	L2Token   common.Address
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterDepositFinalized is a free log retrieval operation binding the contract event 0xb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89.
+//
+// Solidity: event DepositFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) FilterDepositFinalized(opts *bind.FilterOpts, l1Token []common.Address, l2Token []common.Address, from []common.Address) (*L2StandardBridgeDepositFinalizedIterator, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.FilterLogs(opts, "DepositFinalized", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2StandardBridgeDepositFinalizedIterator{contract: _L2StandardBridge.contract, event: "DepositFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchDepositFinalized is a free log subscription operation binding the contract event 0xb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89.
+//
+// Solidity: event DepositFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) WatchDepositFinalized(opts *bind.WatchOpts, sink chan<- *L2StandardBridgeDepositFinalized, l1Token []common.Address, l2Token []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.WatchLogs(opts, "DepositFinalized", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2StandardBridgeDepositFinalized)
+				if err := _L2StandardBridge.contract.UnpackLog(event, "DepositFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseDepositFinalized is a log parse operation binding the contract event 0xb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89.
+//
+// Solidity: event DepositFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) ParseDepositFinalized(log types.Log) (*L2StandardBridgeDepositFinalized, error) {
+	event := new(L2StandardBridgeDepositFinalized)
+	if err := _L2StandardBridge.contract.UnpackLog(event, "DepositFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2StandardBridgeERC20BridgeFinalizedIterator is returned from FilterERC20BridgeFinalized and is used to iterate over the raw logs and unpacked data for ERC20BridgeFinalized events raised by the L2StandardBridge contract.
+type L2StandardBridgeERC20BridgeFinalizedIterator struct {
+	Event *L2StandardBridgeERC20BridgeFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2StandardBridgeERC20BridgeFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2StandardBridgeERC20BridgeFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2StandardBridgeERC20BridgeFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2StandardBridgeERC20BridgeFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2StandardBridgeERC20BridgeFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2StandardBridgeERC20BridgeFinalized represents a ERC20BridgeFinalized event raised by the L2StandardBridge contract.
+type L2StandardBridgeERC20BridgeFinalized struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	Amount      *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20BridgeFinalized is a free log retrieval operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) FilterERC20BridgeFinalized(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*L2StandardBridgeERC20BridgeFinalizedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.FilterLogs(opts, "ERC20BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2StandardBridgeERC20BridgeFinalizedIterator{contract: _L2StandardBridge.contract, event: "ERC20BridgeFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20BridgeFinalized is a free log subscription operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) WatchERC20BridgeFinalized(opts *bind.WatchOpts, sink chan<- *L2StandardBridgeERC20BridgeFinalized, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.WatchLogs(opts, "ERC20BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2StandardBridgeERC20BridgeFinalized)
+				if err := _L2StandardBridge.contract.UnpackLog(event, "ERC20BridgeFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20BridgeFinalized is a log parse operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) ParseERC20BridgeFinalized(log types.Log) (*L2StandardBridgeERC20BridgeFinalized, error) {
+	event := new(L2StandardBridgeERC20BridgeFinalized)
+	if err := _L2StandardBridge.contract.UnpackLog(event, "ERC20BridgeFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2StandardBridgeERC20BridgeInitiatedIterator is returned from FilterERC20BridgeInitiated and is used to iterate over the raw logs and unpacked data for ERC20BridgeInitiated events raised by the L2StandardBridge contract.
+type L2StandardBridgeERC20BridgeInitiatedIterator struct {
+	Event *L2StandardBridgeERC20BridgeInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2StandardBridgeERC20BridgeInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2StandardBridgeERC20BridgeInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2StandardBridgeERC20BridgeInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2StandardBridgeERC20BridgeInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2StandardBridgeERC20BridgeInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2StandardBridgeERC20BridgeInitiated represents a ERC20BridgeInitiated event raised by the L2StandardBridge contract.
+type L2StandardBridgeERC20BridgeInitiated struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	Amount      *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20BridgeInitiated is a free log retrieval operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) FilterERC20BridgeInitiated(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*L2StandardBridgeERC20BridgeInitiatedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.FilterLogs(opts, "ERC20BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2StandardBridgeERC20BridgeInitiatedIterator{contract: _L2StandardBridge.contract, event: "ERC20BridgeInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20BridgeInitiated is a free log subscription operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) WatchERC20BridgeInitiated(opts *bind.WatchOpts, sink chan<- *L2StandardBridgeERC20BridgeInitiated, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.WatchLogs(opts, "ERC20BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2StandardBridgeERC20BridgeInitiated)
+				if err := _L2StandardBridge.contract.UnpackLog(event, "ERC20BridgeInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20BridgeInitiated is a log parse operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) ParseERC20BridgeInitiated(log types.Log) (*L2StandardBridgeERC20BridgeInitiated, error) {
+	event := new(L2StandardBridgeERC20BridgeInitiated)
+	if err := _L2StandardBridge.contract.UnpackLog(event, "ERC20BridgeInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2StandardBridgeETHBridgeFinalizedIterator is returned from FilterETHBridgeFinalized and is used to iterate over the raw logs and unpacked data for ETHBridgeFinalized events raised by the L2StandardBridge contract.
+type L2StandardBridgeETHBridgeFinalizedIterator struct {
+	Event *L2StandardBridgeETHBridgeFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2StandardBridgeETHBridgeFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2StandardBridgeETHBridgeFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2StandardBridgeETHBridgeFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2StandardBridgeETHBridgeFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2StandardBridgeETHBridgeFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2StandardBridgeETHBridgeFinalized represents a ETHBridgeFinalized event raised by the L2StandardBridge contract.
+type L2StandardBridgeETHBridgeFinalized struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHBridgeFinalized is a free log retrieval operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) FilterETHBridgeFinalized(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L2StandardBridgeETHBridgeFinalizedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.FilterLogs(opts, "ETHBridgeFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2StandardBridgeETHBridgeFinalizedIterator{contract: _L2StandardBridge.contract, event: "ETHBridgeFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchETHBridgeFinalized is a free log subscription operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) WatchETHBridgeFinalized(opts *bind.WatchOpts, sink chan<- *L2StandardBridgeETHBridgeFinalized, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.WatchLogs(opts, "ETHBridgeFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2StandardBridgeETHBridgeFinalized)
+				if err := _L2StandardBridge.contract.UnpackLog(event, "ETHBridgeFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHBridgeFinalized is a log parse operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) ParseETHBridgeFinalized(log types.Log) (*L2StandardBridgeETHBridgeFinalized, error) {
+	event := new(L2StandardBridgeETHBridgeFinalized)
+	if err := _L2StandardBridge.contract.UnpackLog(event, "ETHBridgeFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2StandardBridgeETHBridgeInitiatedIterator is returned from FilterETHBridgeInitiated and is used to iterate over the raw logs and unpacked data for ETHBridgeInitiated events raised by the L2StandardBridge contract.
+type L2StandardBridgeETHBridgeInitiatedIterator struct {
+	Event *L2StandardBridgeETHBridgeInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2StandardBridgeETHBridgeInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2StandardBridgeETHBridgeInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2StandardBridgeETHBridgeInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2StandardBridgeETHBridgeInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2StandardBridgeETHBridgeInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2StandardBridgeETHBridgeInitiated represents a ETHBridgeInitiated event raised by the L2StandardBridge contract.
+type L2StandardBridgeETHBridgeInitiated struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHBridgeInitiated is a free log retrieval operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) FilterETHBridgeInitiated(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*L2StandardBridgeETHBridgeInitiatedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.FilterLogs(opts, "ETHBridgeInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2StandardBridgeETHBridgeInitiatedIterator{contract: _L2StandardBridge.contract, event: "ETHBridgeInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchETHBridgeInitiated is a free log subscription operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) WatchETHBridgeInitiated(opts *bind.WatchOpts, sink chan<- *L2StandardBridgeETHBridgeInitiated, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.WatchLogs(opts, "ETHBridgeInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2StandardBridgeETHBridgeInitiated)
+				if err := _L2StandardBridge.contract.UnpackLog(event, "ETHBridgeInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHBridgeInitiated is a log parse operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) ParseETHBridgeInitiated(log types.Log) (*L2StandardBridgeETHBridgeInitiated, error) {
+	event := new(L2StandardBridgeETHBridgeInitiated)
+	if err := _L2StandardBridge.contract.UnpackLog(event, "ETHBridgeInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2StandardBridgeInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L2StandardBridge contract.
+type L2StandardBridgeInitializedIterator struct {
+	Event *L2StandardBridgeInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2StandardBridgeInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2StandardBridgeInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2StandardBridgeInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2StandardBridgeInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2StandardBridgeInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2StandardBridgeInitialized represents a Initialized event raised by the L2StandardBridge contract.
+type L2StandardBridgeInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2StandardBridge *L2StandardBridgeFilterer) FilterInitialized(opts *bind.FilterOpts) (*L2StandardBridgeInitializedIterator, error) {
+
+	logs, sub, err := _L2StandardBridge.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L2StandardBridgeInitializedIterator{contract: _L2StandardBridge.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2StandardBridge *L2StandardBridgeFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L2StandardBridgeInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L2StandardBridge.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2StandardBridgeInitialized)
+				if err := _L2StandardBridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2StandardBridge *L2StandardBridgeFilterer) ParseInitialized(log types.Log) (*L2StandardBridgeInitialized, error) {
+	event := new(L2StandardBridgeInitialized)
+	if err := _L2StandardBridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2StandardBridgeWithdrawalInitiatedIterator is returned from FilterWithdrawalInitiated and is used to iterate over the raw logs and unpacked data for WithdrawalInitiated events raised by the L2StandardBridge contract.
+type L2StandardBridgeWithdrawalInitiatedIterator struct {
+	Event *L2StandardBridgeWithdrawalInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2StandardBridgeWithdrawalInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2StandardBridgeWithdrawalInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2StandardBridgeWithdrawalInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2StandardBridgeWithdrawalInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2StandardBridgeWithdrawalInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2StandardBridgeWithdrawalInitiated represents a WithdrawalInitiated event raised by the L2StandardBridge contract.
+type L2StandardBridgeWithdrawalInitiated struct {
+	L1Token   common.Address
+	L2Token   common.Address
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawalInitiated is a free log retrieval operation binding the contract event 0x73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e.
+//
+// Solidity: event WithdrawalInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) FilterWithdrawalInitiated(opts *bind.FilterOpts, l1Token []common.Address, l2Token []common.Address, from []common.Address) (*L2StandardBridgeWithdrawalInitiatedIterator, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.FilterLogs(opts, "WithdrawalInitiated", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2StandardBridgeWithdrawalInitiatedIterator{contract: _L2StandardBridge.contract, event: "WithdrawalInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawalInitiated is a free log subscription operation binding the contract event 0x73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e.
+//
+// Solidity: event WithdrawalInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) WatchWithdrawalInitiated(opts *bind.WatchOpts, sink chan<- *L2StandardBridgeWithdrawalInitiated, l1Token []common.Address, l2Token []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var l1TokenRule []interface{}
+	for _, l1TokenItem := range l1Token {
+		l1TokenRule = append(l1TokenRule, l1TokenItem)
+	}
+	var l2TokenRule []interface{}
+	for _, l2TokenItem := range l2Token {
+		l2TokenRule = append(l2TokenRule, l2TokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _L2StandardBridge.contract.WatchLogs(opts, "WithdrawalInitiated", l1TokenRule, l2TokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2StandardBridgeWithdrawalInitiated)
+				if err := _L2StandardBridge.contract.UnpackLog(event, "WithdrawalInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawalInitiated is a log parse operation binding the contract event 0x73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e.
+//
+// Solidity: event WithdrawalInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)
+func (_L2StandardBridge *L2StandardBridgeFilterer) ParseWithdrawalInitiated(log types.Log) (*L2StandardBridgeWithdrawalInitiated, error) {
+	event := new(L2StandardBridgeWithdrawalInitiated)
+	if err := _L2StandardBridge.contract.UnpackLog(event, "WithdrawalInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-e2e/bindings/l2tol1messagepasser.go b/op-e2e/bindings/l2tol1messagepasser.go
new file mode 100644
index 000000000000..cc419d057adf
--- /dev/null
+++ b/op-e2e/bindings/l2tol1messagepasser.go
@@ -0,0 +1,699 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L2ToL1MessagePasserMetaData contains all meta data concerning the L2ToL1MessagePasser contract.
+var L2ToL1MessagePasserMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"MESSAGE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initiateWithdrawal\",\"inputs\":[{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"messageNonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sentMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"MessagePassed\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawerBalanceBurnt\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+	Bin: "0x608060405234801561001057600080fd5b506106d3806100206000396000f3fe6080604052600436106100695760003560e01c806382e3702d1161004357806382e3702d1461012a578063c2b3e5ac1461016a578063ecc704281461017d57600080fd5b80633f827a5a1461009257806344df8e70146100bf57806354fd4d50146100d457600080fd5b3661008d5761008b33620186a0604051806020016040528060008152506101e2565b005b600080fd5b34801561009e57600080fd5b506100a7600181565b60405161ffff90911681526020015b60405180910390f35b3480156100cb57600080fd5b5061008b6103a6565b3480156100e057600080fd5b5061011d6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b691906104d1565b34801561013657600080fd5b5061015a6101453660046104eb565b60006020819052908152604090205460ff1681565b60405190151581526020016100b6565b61008b610178366004610533565b6101e2565b34801561018957600080fd5b506101d46001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016100b6565b60006102786040518060c0016040528061023c6001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b815233602082015273ffffffffffffffffffffffffffffffffffffffff871660408201523460608201526080810186905260a0018490526103de565b600081815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055905073ffffffffffffffffffffffffffffffffffffffff8416336103136001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b7f02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054348787876040516103489493929190610637565b60405180910390a45050600180547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082168301167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b476103b08161042b565b60405181907f7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f90600090a250565b80516020808301516040808501516060860151608087015160a0880151935160009761040e979096959101610667565b604051602081830303815290604052805190602001209050919050565b806040516104389061045a565b6040518091039082f0905080158015610455573d6000803e3d6000fd5b505050565b6008806106bf83390190565b6000815180845260005b8181101561048c57602081850181015186830182015201610470565b8181111561049e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104e46020830184610466565b9392505050565b6000602082840312156104fd57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060006060848603121561054857600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461056c57600080fd5b925060208401359150604084013567ffffffffffffffff8082111561059057600080fd5b818601915086601f8301126105a457600080fd5b8135818111156105b6576105b6610504565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156105fc576105fc610504565b8160405282815289602084870101111561061557600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b8481528360208201526080604082015260006106566080830185610466565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526106b260c0830184610466565b9897505050505050505056fe608060405230fffea164736f6c634300080f000a",
+}
+
+// L2ToL1MessagePasserABI is the input ABI used to generate the binding from.
+// Deprecated: Use L2ToL1MessagePasserMetaData.ABI instead.
+var L2ToL1MessagePasserABI = L2ToL1MessagePasserMetaData.ABI
+
+// L2ToL1MessagePasserBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L2ToL1MessagePasserMetaData.Bin instead.
+var L2ToL1MessagePasserBin = L2ToL1MessagePasserMetaData.Bin
+
+// DeployL2ToL1MessagePasser deploys a new Ethereum contract, binding an instance of L2ToL1MessagePasser to it.
+func DeployL2ToL1MessagePasser(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L2ToL1MessagePasser, error) {
+	parsed, err := L2ToL1MessagePasserMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2ToL1MessagePasserBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L2ToL1MessagePasser{L2ToL1MessagePasserCaller: L2ToL1MessagePasserCaller{contract: contract}, L2ToL1MessagePasserTransactor: L2ToL1MessagePasserTransactor{contract: contract}, L2ToL1MessagePasserFilterer: L2ToL1MessagePasserFilterer{contract: contract}}, nil
+}
+
+// L2ToL1MessagePasser is an auto generated Go binding around an Ethereum contract.
+type L2ToL1MessagePasser struct {
+	L2ToL1MessagePasserCaller     // Read-only binding to the contract
+	L2ToL1MessagePasserTransactor // Write-only binding to the contract
+	L2ToL1MessagePasserFilterer   // Log filterer for contract events
+}
+
+// L2ToL1MessagePasserCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L2ToL1MessagePasserCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2ToL1MessagePasserTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L2ToL1MessagePasserTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2ToL1MessagePasserFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L2ToL1MessagePasserFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2ToL1MessagePasserSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L2ToL1MessagePasserSession struct {
+	Contract     *L2ToL1MessagePasser // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts        // Call options to use throughout this session
+	TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
+}
+
+// L2ToL1MessagePasserCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L2ToL1MessagePasserCallerSession struct {
+	Contract *L2ToL1MessagePasserCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts              // Call options to use throughout this session
+}
+
+// L2ToL1MessagePasserTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L2ToL1MessagePasserTransactorSession struct {
+	Contract     *L2ToL1MessagePasserTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
+}
+
+// L2ToL1MessagePasserRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L2ToL1MessagePasserRaw struct {
+	Contract *L2ToL1MessagePasser // Generic contract binding to access the raw methods on
+}
+
+// L2ToL1MessagePasserCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L2ToL1MessagePasserCallerRaw struct {
+	Contract *L2ToL1MessagePasserCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L2ToL1MessagePasserTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L2ToL1MessagePasserTransactorRaw struct {
+	Contract *L2ToL1MessagePasserTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL2ToL1MessagePasser creates a new instance of L2ToL1MessagePasser, bound to a specific deployed contract.
+func NewL2ToL1MessagePasser(address common.Address, backend bind.ContractBackend) (*L2ToL1MessagePasser, error) {
+	contract, err := bindL2ToL1MessagePasser(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasser{L2ToL1MessagePasserCaller: L2ToL1MessagePasserCaller{contract: contract}, L2ToL1MessagePasserTransactor: L2ToL1MessagePasserTransactor{contract: contract}, L2ToL1MessagePasserFilterer: L2ToL1MessagePasserFilterer{contract: contract}}, nil
+}
+
+// NewL2ToL1MessagePasserCaller creates a new read-only instance of L2ToL1MessagePasser, bound to a specific deployed contract.
+func NewL2ToL1MessagePasserCaller(address common.Address, caller bind.ContractCaller) (*L2ToL1MessagePasserCaller, error) {
+	contract, err := bindL2ToL1MessagePasser(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasserCaller{contract: contract}, nil
+}
+
+// NewL2ToL1MessagePasserTransactor creates a new write-only instance of L2ToL1MessagePasser, bound to a specific deployed contract.
+func NewL2ToL1MessagePasserTransactor(address common.Address, transactor bind.ContractTransactor) (*L2ToL1MessagePasserTransactor, error) {
+	contract, err := bindL2ToL1MessagePasser(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasserTransactor{contract: contract}, nil
+}
+
+// NewL2ToL1MessagePasserFilterer creates a new log filterer instance of L2ToL1MessagePasser, bound to a specific deployed contract.
+func NewL2ToL1MessagePasserFilterer(address common.Address, filterer bind.ContractFilterer) (*L2ToL1MessagePasserFilterer, error) {
+	contract, err := bindL2ToL1MessagePasser(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasserFilterer{contract: contract}, nil
+}
+
+// bindL2ToL1MessagePasser binds a generic wrapper to an already deployed contract.
+func bindL2ToL1MessagePasser(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L2ToL1MessagePasserABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2ToL1MessagePasser.Contract.L2ToL1MessagePasserCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.L2ToL1MessagePasserTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.L2ToL1MessagePasserTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2ToL1MessagePasser.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCaller) MESSAGEVERSION(opts *bind.CallOpts) (uint16, error) {
+	var out []interface{}
+	err := _L2ToL1MessagePasser.contract.Call(opts, &out, "MESSAGE_VERSION")
+
+	if err != nil {
+		return *new(uint16), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
+
+	return out0, err
+
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) MESSAGEVERSION() (uint16, error) {
+	return _L2ToL1MessagePasser.Contract.MESSAGEVERSION(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCallerSession) MESSAGEVERSION() (uint16, error) {
+	return _L2ToL1MessagePasser.Contract.MESSAGEVERSION(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCaller) MessageNonce(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2ToL1MessagePasser.contract.Call(opts, &out, "messageNonce")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) MessageNonce() (*big.Int, error) {
+	return _L2ToL1MessagePasser.Contract.MessageNonce(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCallerSession) MessageNonce() (*big.Int, error) {
+	return _L2ToL1MessagePasser.Contract.MessageNonce(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// SentMessages is a free data retrieval call binding the contract method 0x82e3702d.
+//
+// Solidity: function sentMessages(bytes32 ) view returns(bool)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCaller) SentMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L2ToL1MessagePasser.contract.Call(opts, &out, "sentMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// SentMessages is a free data retrieval call binding the contract method 0x82e3702d.
+//
+// Solidity: function sentMessages(bytes32 ) view returns(bool)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) SentMessages(arg0 [32]byte) (bool, error) {
+	return _L2ToL1MessagePasser.Contract.SentMessages(&_L2ToL1MessagePasser.CallOpts, arg0)
+}
+
+// SentMessages is a free data retrieval call binding the contract method 0x82e3702d.
+//
+// Solidity: function sentMessages(bytes32 ) view returns(bool)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCallerSession) SentMessages(arg0 [32]byte) (bool, error) {
+	return _L2ToL1MessagePasser.Contract.SentMessages(&_L2ToL1MessagePasser.CallOpts, arg0)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L2ToL1MessagePasser.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) Version() (string, error) {
+	return _L2ToL1MessagePasser.Contract.Version(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCallerSession) Version() (string, error) {
+	return _L2ToL1MessagePasser.Contract.Version(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// Burn is a paid mutator transaction binding the contract method 0x44df8e70.
+//
+// Solidity: function burn() returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactor) Burn(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.contract.Transact(opts, "burn")
+}
+
+// Burn is a paid mutator transaction binding the contract method 0x44df8e70.
+//
+// Solidity: function burn() returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) Burn() (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.Burn(&_L2ToL1MessagePasser.TransactOpts)
+}
+
+// Burn is a paid mutator transaction binding the contract method 0x44df8e70.
+//
+// Solidity: function burn() returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactorSession) Burn() (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.Burn(&_L2ToL1MessagePasser.TransactOpts)
+}
+
+// InitiateWithdrawal is a paid mutator transaction binding the contract method 0xc2b3e5ac.
+//
+// Solidity: function initiateWithdrawal(address _target, uint256 _gasLimit, bytes _data) payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactor) InitiateWithdrawal(opts *bind.TransactOpts, _target common.Address, _gasLimit *big.Int, _data []byte) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.contract.Transact(opts, "initiateWithdrawal", _target, _gasLimit, _data)
+}
+
+// InitiateWithdrawal is a paid mutator transaction binding the contract method 0xc2b3e5ac.
+//
+// Solidity: function initiateWithdrawal(address _target, uint256 _gasLimit, bytes _data) payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) InitiateWithdrawal(_target common.Address, _gasLimit *big.Int, _data []byte) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.InitiateWithdrawal(&_L2ToL1MessagePasser.TransactOpts, _target, _gasLimit, _data)
+}
+
+// InitiateWithdrawal is a paid mutator transaction binding the contract method 0xc2b3e5ac.
+//
+// Solidity: function initiateWithdrawal(address _target, uint256 _gasLimit, bytes _data) payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactorSession) InitiateWithdrawal(_target common.Address, _gasLimit *big.Int, _data []byte) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.InitiateWithdrawal(&_L2ToL1MessagePasser.TransactOpts, _target, _gasLimit, _data)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) Receive() (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.Receive(&_L2ToL1MessagePasser.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactorSession) Receive() (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.Receive(&_L2ToL1MessagePasser.TransactOpts)
+}
+
+// L2ToL1MessagePasserMessagePassedIterator is returned from FilterMessagePassed and is used to iterate over the raw logs and unpacked data for MessagePassed events raised by the L2ToL1MessagePasser contract.
+type L2ToL1MessagePasserMessagePassedIterator struct {
+	Event *L2ToL1MessagePasserMessagePassed // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2ToL1MessagePasserMessagePassedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2ToL1MessagePasserMessagePassed)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2ToL1MessagePasserMessagePassed)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2ToL1MessagePasserMessagePassedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2ToL1MessagePasserMessagePassedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2ToL1MessagePasserMessagePassed represents a MessagePassed event raised by the L2ToL1MessagePasser contract.
+type L2ToL1MessagePasserMessagePassed struct {
+	Nonce          *big.Int
+	Sender         common.Address
+	Target         common.Address
+	Value          *big.Int
+	GasLimit       *big.Int
+	Data           []byte
+	WithdrawalHash [32]byte
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterMessagePassed is a free log retrieval operation binding the contract event 0x02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054.
+//
+// Solidity: event MessagePassed(uint256 indexed nonce, address indexed sender, address indexed target, uint256 value, uint256 gasLimit, bytes data, bytes32 withdrawalHash)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) FilterMessagePassed(opts *bind.FilterOpts, nonce []*big.Int, sender []common.Address, target []common.Address) (*L2ToL1MessagePasserMessagePassedIterator, error) {
+
+	var nonceRule []interface{}
+	for _, nonceItem := range nonce {
+		nonceRule = append(nonceRule, nonceItem)
+	}
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L2ToL1MessagePasser.contract.FilterLogs(opts, "MessagePassed", nonceRule, senderRule, targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasserMessagePassedIterator{contract: _L2ToL1MessagePasser.contract, event: "MessagePassed", logs: logs, sub: sub}, nil
+}
+
+// WatchMessagePassed is a free log subscription operation binding the contract event 0x02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054.
+//
+// Solidity: event MessagePassed(uint256 indexed nonce, address indexed sender, address indexed target, uint256 value, uint256 gasLimit, bytes data, bytes32 withdrawalHash)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) WatchMessagePassed(opts *bind.WatchOpts, sink chan<- *L2ToL1MessagePasserMessagePassed, nonce []*big.Int, sender []common.Address, target []common.Address) (event.Subscription, error) {
+
+	var nonceRule []interface{}
+	for _, nonceItem := range nonce {
+		nonceRule = append(nonceRule, nonceItem)
+	}
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L2ToL1MessagePasser.contract.WatchLogs(opts, "MessagePassed", nonceRule, senderRule, targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2ToL1MessagePasserMessagePassed)
+				if err := _L2ToL1MessagePasser.contract.UnpackLog(event, "MessagePassed", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseMessagePassed is a log parse operation binding the contract event 0x02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054.
+//
+// Solidity: event MessagePassed(uint256 indexed nonce, address indexed sender, address indexed target, uint256 value, uint256 gasLimit, bytes data, bytes32 withdrawalHash)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) ParseMessagePassed(log types.Log) (*L2ToL1MessagePasserMessagePassed, error) {
+	event := new(L2ToL1MessagePasserMessagePassed)
+	if err := _L2ToL1MessagePasser.contract.UnpackLog(event, "MessagePassed", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2ToL1MessagePasserWithdrawerBalanceBurntIterator is returned from FilterWithdrawerBalanceBurnt and is used to iterate over the raw logs and unpacked data for WithdrawerBalanceBurnt events raised by the L2ToL1MessagePasser contract.
+type L2ToL1MessagePasserWithdrawerBalanceBurntIterator struct {
+	Event *L2ToL1MessagePasserWithdrawerBalanceBurnt // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2ToL1MessagePasserWithdrawerBalanceBurntIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2ToL1MessagePasserWithdrawerBalanceBurnt)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2ToL1MessagePasserWithdrawerBalanceBurnt)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2ToL1MessagePasserWithdrawerBalanceBurntIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2ToL1MessagePasserWithdrawerBalanceBurntIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2ToL1MessagePasserWithdrawerBalanceBurnt represents a WithdrawerBalanceBurnt event raised by the L2ToL1MessagePasser contract.
+type L2ToL1MessagePasserWithdrawerBalanceBurnt struct {
+	Amount *big.Int
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawerBalanceBurnt is a free log retrieval operation binding the contract event 0x7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f.
+//
+// Solidity: event WithdrawerBalanceBurnt(uint256 indexed amount)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) FilterWithdrawerBalanceBurnt(opts *bind.FilterOpts, amount []*big.Int) (*L2ToL1MessagePasserWithdrawerBalanceBurntIterator, error) {
+
+	var amountRule []interface{}
+	for _, amountItem := range amount {
+		amountRule = append(amountRule, amountItem)
+	}
+
+	logs, sub, err := _L2ToL1MessagePasser.contract.FilterLogs(opts, "WithdrawerBalanceBurnt", amountRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasserWithdrawerBalanceBurntIterator{contract: _L2ToL1MessagePasser.contract, event: "WithdrawerBalanceBurnt", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawerBalanceBurnt is a free log subscription operation binding the contract event 0x7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f.
+//
+// Solidity: event WithdrawerBalanceBurnt(uint256 indexed amount)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) WatchWithdrawerBalanceBurnt(opts *bind.WatchOpts, sink chan<- *L2ToL1MessagePasserWithdrawerBalanceBurnt, amount []*big.Int) (event.Subscription, error) {
+
+	var amountRule []interface{}
+	for _, amountItem := range amount {
+		amountRule = append(amountRule, amountItem)
+	}
+
+	logs, sub, err := _L2ToL1MessagePasser.contract.WatchLogs(opts, "WithdrawerBalanceBurnt", amountRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2ToL1MessagePasserWithdrawerBalanceBurnt)
+				if err := _L2ToL1MessagePasser.contract.UnpackLog(event, "WithdrawerBalanceBurnt", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawerBalanceBurnt is a log parse operation binding the contract event 0x7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f.
+//
+// Solidity: event WithdrawerBalanceBurnt(uint256 indexed amount)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) ParseWithdrawerBalanceBurnt(log types.Log) (*L2ToL1MessagePasserWithdrawerBalanceBurnt, error) {
+	event := new(L2ToL1MessagePasserWithdrawerBalanceBurnt)
+	if err := _L2ToL1MessagePasser.contract.UnpackLog(event, "WithdrawerBalanceBurnt", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-bindings/bindings/legacymessagepasser.go b/op-e2e/bindings/legacymessagepasser.go
similarity index 100%
rename from op-bindings/bindings/legacymessagepasser.go
rename to op-e2e/bindings/legacymessagepasser.go
diff --git a/op-bindings/bindings/mips.go b/op-e2e/bindings/mips.go
similarity index 100%
rename from op-bindings/bindings/mips.go
rename to op-e2e/bindings/mips.go
diff --git a/op-bindings/bindings/multicall3.go b/op-e2e/bindings/multicall3.go
similarity index 100%
rename from op-bindings/bindings/multicall3.go
rename to op-e2e/bindings/multicall3.go
diff --git a/op-bindings/bindings/multisend_v130.go b/op-e2e/bindings/multisend_v130.go
similarity index 100%
rename from op-bindings/bindings/multisend_v130.go
rename to op-e2e/bindings/multisend_v130.go
diff --git a/op-bindings/bindings/multisendcallonly_v130.go b/op-e2e/bindings/multisendcallonly_v130.go
similarity index 100%
rename from op-bindings/bindings/multisendcallonly_v130.go
rename to op-e2e/bindings/multisendcallonly_v130.go
diff --git a/op-bindings/bindings/optimismmintableerc20.go b/op-e2e/bindings/optimismmintableerc20.go
similarity index 100%
rename from op-bindings/bindings/optimismmintableerc20.go
rename to op-e2e/bindings/optimismmintableerc20.go
diff --git a/op-bindings/bindings/optimismmintableerc20factory.go b/op-e2e/bindings/optimismmintableerc20factory.go
similarity index 100%
rename from op-bindings/bindings/optimismmintableerc20factory.go
rename to op-e2e/bindings/optimismmintableerc20factory.go
diff --git a/op-bindings/bindings/optimismmintableerc721factory.go b/op-e2e/bindings/optimismmintableerc721factory.go
similarity index 100%
rename from op-bindings/bindings/optimismmintableerc721factory.go
rename to op-e2e/bindings/optimismmintableerc721factory.go
diff --git a/op-e2e/bindings/optimismportal.go b/op-e2e/bindings/optimismportal.go
new file mode 100644
index 000000000000..3fb3ed0cd59a
--- /dev/null
+++ b/op-e2e/bindings/optimismportal.go
@@ -0,0 +1,1478 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// TypesOutputRootProof is an auto generated low-level Go binding around an user-defined struct.
+type TypesOutputRootProof struct {
+	Version                  [32]byte
+	StateRoot                [32]byte
+	MessagePasserStorageRoot [32]byte
+	LatestBlockhash          [32]byte
+}
+
+// TypesWithdrawalTransaction is an auto generated low-level Go binding around an user-defined struct.
+type TypesWithdrawalTransaction struct {
+	Nonce    *big.Int
+	Sender   common.Address
+	Target   common.Address
+	Value    *big.Int
+	GasLimit *big.Int
+	Data     []byte
+}
+
+// OptimismPortalMetaData contains all meta data concerning the OptimismPortal contract.
+var OptimismPortalMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"balance\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositERC20Transaction\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_mint\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_isCreation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositTransaction\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_isCreation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"donateETH\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"finalizeWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizedWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gasPayingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"addr_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"decimals_\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardian\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isOutputFinalized\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Oracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Sender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minimumGasLimit\",\"inputs\":[{\"name\":\"_byteCount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"params\",\"inputs\":[],\"outputs\":[{\"name\":\"prevBaseFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"prevBoughtGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"prevBlockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"paused_\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_outputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"latestBlockhash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provenWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2OutputIndex\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setGasPayingToken\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_symbol\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransactionDeposited\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"version\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"opaqueData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalFinalized\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalProven\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BadTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasEstimation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LargeCalldata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonReentrant\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCustomGasToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfGas\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SmallGasLimit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[]}]",
+	Bin: "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028f565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001c160201b62001ff31760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603680546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b03191661010085841602179055603254166200016a57603280546001600160a01b03191661dead1790555b62000174620001d0565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200023d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600154600160c01b90046001600160401b03166000036200028d5760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b615f6d806200029f6000396000f3fe60806040526004361061016e5760003560e01c80638b4c40b0116100cb578063a35d99df1161007f578063cff0ab9611610059578063cff0ab961461049c578063e965084c1461053d578063e9e05c42146105c957600080fd5b8063a35d99df14610420578063b69ef8a814610459578063c0c53b8b1461047c57600080fd5b80639b5f694a116100b05780639b5f694a146103965780639bf62d82146103c3578063a14238e7146103f057600080fd5b80638b4c40b0146101935780638c3152e91461037657600080fd5b80634870496f116101225780635c975abb116101075780635c975abb146103115780636dbffb781461033657806371cfaa3f1461035657600080fd5b80634870496f1461029b57806354fd4d50146102bb57600080fd5b806335e80ab31161015357806335e80ab3146102115780634397dfef14610243578063452a93201461028657600080fd5b8063149f2f221461019a57806333d7e2bd146101ba57600080fd5b36610195576101933334620186a06000604051806020016040528060008152506105d7565b005b600080fd5b3480156101a657600080fd5b506101936101b536600461538d565b61067c565b3480156101c657600080fd5b506037546101e79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021d57600080fd5b506035546101e790610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024f57600080fd5b506102586108be565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff909116602083015201610208565b34801561029257600080fd5b506101e761095b565b3480156102a757600080fd5b506101936102b63660046154c1565b6109f3565b3480156102c757600080fd5b506103046040518060400160405280601b81526020017f322e372e302d626574612b637573746f6d2d6761732d746f6b656e000000000081525081565b6040516102089190615613565b34801561031d57600080fd5b50610326610fa0565b6040519015158152602001610208565b34801561034257600080fd5b50610326610351366004615626565b611033565b34801561036257600080fd5b5061019361037136600461564e565b6110ee565b34801561038257600080fd5b50610193610391366004615694565b6112b0565b3480156103a257600080fd5b506036546101e79073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103cf57600080fd5b506032546101e79073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103fc57600080fd5b5061032661040b366004615626565b60336020526000908152604090205460ff1681565b34801561042c57600080fd5b5061044061043b3660046156d1565b611d32565b60405167ffffffffffffffff9091168152602001610208565b34801561046557600080fd5b5061046e611d4b565b604051908152602001610208565b34801561048857600080fd5b506101936104973660046156ec565b611da5565b3480156104a857600080fd5b50600154610504906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610208565b34801561054957600080fd5b5061059b610558366004615626565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff9283166020850152911690820152606001610208565b6101936105d7366004615737565b8260005a905060006105e76108be565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1480159061062357503415155b1561065a576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61066888348989898961200f565b5061067382826121bb565b50505050505050565b8260005a9050600061068c6108be565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016106fe576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561076b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078f91906157b4565b90506107b373ffffffffffffffffffffffffffffffffffffffff831633308c612488565b6107bd89826157fc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084b91906157b4565b14610882576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88603d600082825461089491906157fc565b909155506108a890508a8a8a8a8a8a61200f565b50506108b482826121bb565b5050505050505050565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa15801561092e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109529190615814565b90939092509050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee919061584e565b905090565b6109fb610fa0565b15610a32576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a9b576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2f919061588b565b519050610b49610b44368690038601866158f0565b612564565b8114610bdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610be7876125c0565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610cfd5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf9919061588b565b5114155b610d89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610bd3565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610e529101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610e48888a615956565b8a604001356125f0565b610ede576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610bd3565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee91906159da565b6036546040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018390526000916110e89173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa1580156110a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cd919061588b565b602001516fffffffffffffffffffffffffffffffff16612614565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff16331461113f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61114b620138806126ba565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3290849081906201388090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f000000000000000000000000000000000000000000000000000000001790529051611268969594939291016159f7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526112a091615613565b60405180910390a450505050565b565b6112b8610fa0565b156112ef576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611342576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061134d826125c0565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610bd3565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c991906157b4565b81602001516fffffffffffffffffffffffffffffffff161015611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610bd3565b6115b381602001516fffffffffffffffffffffffffffffffff16612614565b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610bd3565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa1580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611710919061588b565b82518151919250146117ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610bd3565b6117e981602001516fffffffffffffffffffffffffffffffff16612614565b61189b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610bd3565b60008381526033602052604090205460ff161561193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610bd3565b6000838152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055806119c56108be565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611a2857611a218660400151876080015188606001518960a00151612716565b9150611c7b565b8073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff1603611a91576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086015115611c52578560600151603d6000828254611ab19190615a5c565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4791906157b4565b9050611b7c876040015188606001518473ffffffffffffffffffffffffffffffffffffffff166127749092919063ffffffff16565b6060870151611b8b9082615a5c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1991906157b4565b14611c50576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08601515115611c7657611a218660400151876080015160008960a00151612716565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405185907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611cdd90851515815260200190565b60405180910390a281158015611cf35750326001145b15611d2a576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000611d3f826010615a73565b6110e890615208615aa3565b600080611d566108be565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611d9d574791505090565b5050603d5490565b600054610100900460ff1615808015611dc55750600054600160ff909116105b80611ddf5750303b158015611ddf575060005460ff166001145b611e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610bd3565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611ec957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611f8257603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611f8a6127cf565b8015611fed57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b818015612031575073ffffffffffffffffffffffffffffffffffffffff861615155b15612068576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120728151611d32565b67ffffffffffffffff168367ffffffffffffffff1610156120bf576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0815111156120fd576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3332811461211e575033731111000000000000000000000000000000001111015b600086868686866040516020016121399594939291906159f7565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516121a99190615613565b60405180910390a45050505050505050565b6001546000906121f1907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643615a5c565b905060006121fd6128e2565b90506000816020015160ff16826000015163ffffffff1661221e9190615afe565b9050821561235557600154600090612255908390700100000000000000000000000000000000900467ffffffffffffffff16615b66565b90506000836040015160ff168361226c9190615bda565b60015461228c9084906fffffffffffffffffffffffffffffffff16615bda565b6122969190615afe565b6001549091506000906122e7906122c09084906fffffffffffffffffffffffffffffffff16615c96565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff166129a3565b90506001861115612316576123136122c082876040015160ff1660018a61230e9190615a5c565b6129c2565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090612388908490700100000000000000000000000000000000900467ffffffffffffffff16615aa3565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315612415576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090612441906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615d0a565b9050600061245348633b9aca00612a17565b61245d9083615d47565b905060005a61246c9088615a5c565b9050808211156108b4576108b46124838284615a5c565b612a2e565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611fed9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a57565b600081600001518260200151836040015184606001516040516020016125a3949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a088015193516000976125a3979096959101615d5b565b6000806125fc86612b63565b905061260a81868686612b95565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015612684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a891906157b4565b6126b290836157fc565b421192915050565b600180548291906010906126ed908490700100000000000000000000000000000000900467ffffffffffffffff16615aa3565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b6000806000612726866000612bc5565b90508061275c576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127ca9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016124e2565b505050565b600054610100900460ff16612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610bd3565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036112ae5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa15801561297f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190615dc6565b60006129b86129b28585612be3565b83612bf3565b90505b9392505050565b6000670de0b6b3a7640000612a036129da8583615afe565b6129ec90670de0b6b3a7640000615b66565b6129fe85670de0b6b3a7640000615bda565b612c02565b612a0d9086615bda565b6129b89190615afe565b600081831015612a2757816129bb565b5090919050565b6000805a90505b825a612a419083615a5c565b10156127ca57612a5082615e69565b9150612a35565b6000612ab9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c339092919063ffffffff16565b8051909150156127ca5780806020019051810190612ad791906159da565b6127ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bd3565b60608180519060200120604051602001612b7f91815260200190565b6040516020818303038152906040529050919050565b6000612bbc84612ba6878686612c42565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b600081831215612a2757816129bb565b6000818312612a2757816129bb565b60006129bb670de0b6b3a764000083612c1a866136c0565b612c249190615bda565b612c2e9190615afe565b613904565b60606129b88484600085613b43565b60606000845111612caf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610bd3565b6000612cba84613cd9565b90506000612cc786613dc5565b9050600084604051602001612cde91815260200190565b60405160208183030381529060405290506000805b8451811015613637576000858281518110612d1057612d10615ea1565b602002602001015190508451831115612dab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610bd3565b82600003612e645780518051602091820120604051612df992612dd392910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612e5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610bd3565b612fbb565b805151602011612f1a5780518051602091820120604051612e8e92612dd392910190815260200190565b612e5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610bd3565b805184516020808701919091208251919092012014612fbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610bd3565b612fc7601060016157fc565b816020015151036131a3578451830361313b576130018160200151601081518110612ff457612ff4615ea1565b6020026020010151613e28565b96506000875111613094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610bd3565b600186516130a29190615a5c565b8214613130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610bd3565b5050505050506129bb565b600085848151811061314f5761314f615ea1565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061317a5761317a615ea1565b6020026020010151905061318d81613f88565b955061319a6001866157fc565b94505050613624565b60028160200151510361359c5760006131bb82613fad565b90506000816000815181106131d2576131d2615ea1565b016020015160f81c905060006131e9600283615ed0565b6131f4906002615ef2565b90506000613205848360ff16613fd1565b905060006132138a89613fd1565b905060006132218383614007565b9050808351146132b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610bd3565b60ff8516600214806132c8575060ff85166003145b156134b7578082511461335d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610bd3565b6133778760200151600181518110612ff457612ff4615ea1565b9c5060008d511161340a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610bd3565b60018c516134189190615a5c565b88146134a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610bd3565b5050505050505050505050506129bb565b60ff851615806134ca575060ff85166001145b15613509576134f687602001516001815181106134e9576134e9615ea1565b6020026020010151613f88565b9950613502818a6157fc565b9850613591565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610bd3565b505050505050613624565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610bd3565b508061362f81615e69565b915050612cf3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610bd3565b600080821361372b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610bd3565b60006060613738846140bb565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361393557506000919050565b680755bf798b4a1bf1e582126139a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610bd3565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613bd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bd3565b73ffffffffffffffffffffffffffffffffffffffff85163b613c53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bd3565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c7c9190615f15565b60006040518083038185875af1925050503d8060008114613cb9576040519150601f19603f3d011682016040523d82523d6000602084013e613cbe565b606091505b5091509150613cce828286614191565b979650505050505050565b80516060908067ffffffffffffffff811115613cf757613cf7615281565b604051908082528060200260200182016040528015613d3c57816020015b6040805180820190915260608082526020820152815260200190600190039081613d155790505b50915060005b81811015613dbe576040518060400160405280858381518110613d6757613d67615ea1565b60200260200101518152602001613d96868481518110613d8957613d89615ea1565b60200260200101516141e4565b815250838281518110613dab57613dab615ea1565b6020908102919091010152600101613d42565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613e1d578060011b82018184015160001a8060041c8253600f811660018301535050600101613def565b509295945050505050565b60606000806000613e38856141f7565b919450925090506000816001811115613e5357613e53615f31565b14613ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610bd3565b613eea82846157fc565b855114613f79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610bd3565b612bbc85602001518484614c64565b60606020826000015110613fa457613f9f82613e28565b6110e8565b6110e882614cf8565b60606110e8613fcc8360200151600081518110612ff457612ff4615ea1565b613dc5565b606082518210613ff057506040805160208101909152600081526110e8565b6129bb83838486516140029190615a5c565b614d0e565b600080825184511061401a57825161401d565b83515b90505b80821080156140a4575082828151811061403c5761403c615ea1565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684838151811061407b5761407b615ea1565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156140b457816001019150614020565b5092915050565b6000808211614126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610bd3565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606083156141a05750816129bb565b8251156141b05782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd39190615613565b60606110e86141f283614ee6565b614fcf565b6000806000808460000151116142b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610bd3565b6020840151805160001a607f81116142da576000600160009450945094505050614c5d565b60b781116144e85760006142ef608083615a5c565b9050808760000151116143aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610bd3565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061442357507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b6144d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610bd3565b5060019550935060009250614c5d915050565b60bf81116148365760006144fd60b783615a5c565b9050808760000151116145b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610bd3565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610bd3565b600184015160088302610100031c6037811161475a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610bd3565b61476481846157fc565b895111614819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610bd3565b6148248360016157fc565b9750955060009450614c5d9350505050565b60f7811161491757600061484b60c083615a5c565b905080876000015111614906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610bd3565b600195509350849250614c5d915050565b600061492460f783615a5c565b9050808760000151116149df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610bd3565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610bd3565b600184015160088302610100031c60378111614b81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610bd3565b614b8b81846157fc565b895111614c40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610bd3565b614c4b8360016157fc565b9750955060019450614c5d9350505050565b9193909250565b60608167ffffffffffffffff811115614c7f57614c7f615281565b6040519080825280601f01601f191660200182016040528015614ca9576020820181803683370190505b50905081156129bb576000614cbe84866157fc565b90506020820160005b84811015614cdf578281015182820152602001614cc7565b84811115614cee576000858301525b5050509392505050565b60606110e8826020015160008460000151614c64565b60608182601f011015614d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610bd3565b828284011015614de9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610bd3565b81830184511015614e56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610bd3565b606082158015614e755760405191506000825260208201604052614edd565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614eae578051835260209283019201614e96565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610bd3565b50604080518082019091528151815260209182019181019190915290565b60606000806000614fdf856141f7565b919450925090506001816001811115614ffa57614ffa615f31565b14615087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610bd3565b845161509383856157fc565b14615120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610bd3565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816151375790505093506000835b8651811015615225576000806151aa6040518060400160405280858c6000015161518e9190615a5c565b8152602001858c602001516151a391906157fc565b90526141f7565b5091509150604051806040016040528083836151c691906157fc565b8152602001848b602001516151db91906157fc565b8152508885815181106151f0576151f0615ea1565b60209081029190910101526152066001856157fc565b935061521281836157fc565b61521c90846157fc565b92505050615164565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461525357600080fd5b50565b803567ffffffffffffffff8116811461526e57600080fd5b919050565b801515811461525357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156152f7576152f7615281565b604052919050565b600082601f83011261531057600080fd5b813567ffffffffffffffff81111561532a5761532a615281565b61535b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016152b0565b81815284602083860101111561537057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156153a657600080fd5b86356153b181615231565b955060208701359450604087013593506153cd60608801615256565b925060808701356153dd81615273565b915060a087013567ffffffffffffffff8111156153f957600080fd5b61540589828a016152ff565b9150509295509295509295565b600060c0828403121561542457600080fd5b60405160c0810167ffffffffffffffff828210818311171561544857615448615281565b81604052829350843583526020850135915061546382615231565b8160208401526040850135915061547982615231565b816040840152606085013560608401526080850135608084015260a08501359150808211156154a757600080fd5b506154b4858286016152ff565b60a0830152505092915050565b600080600080600085870360e08112156154da57600080fd5b863567ffffffffffffffff808211156154f257600080fd5b6154fe8a838b01615412565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561553757600080fd5b60408901955060c089013592508083111561555157600080fd5b828901925089601f84011261556557600080fd5b823591508082111561557657600080fd5b508860208260051b840101111561558c57600080fd5b959894975092955050506020019190565b60005b838110156155b85781810151838201526020016155a0565b83811115611fed5750506000910152565b600081518084526155e181602086016020860161559d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129bb60208301846155c9565b60006020828403121561563857600080fd5b5035919050565b60ff8116811461525357600080fd5b6000806000806080858703121561566457600080fd5b843561566f81615231565b9350602085013561567f8161563f565b93969395505050506040820135916060013590565b6000602082840312156156a657600080fd5b813567ffffffffffffffff8111156156bd57600080fd5b6156c984828501615412565b949350505050565b6000602082840312156156e357600080fd5b6129bb82615256565b60008060006060848603121561570157600080fd5b833561570c81615231565b9250602084013561571c81615231565b9150604084013561572c81615231565b809150509250925092565b600080600080600060a0868803121561574f57600080fd5b853561575a81615231565b94506020860135935061576f60408701615256565b9250606086013561577f81615273565b9150608086013567ffffffffffffffff81111561579b57600080fd5b6157a7888289016152ff565b9150509295509295909350565b6000602082840312156157c657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561580f5761580f6157cd565b500190565b6000806040838503121561582757600080fd5b825161583281615231565b60208401519092506158438161563f565b809150509250929050565b60006020828403121561586057600080fd5b81516129bb81615231565b80516fffffffffffffffffffffffffffffffff8116811461526e57600080fd5b60006060828403121561589d57600080fd5b6040516060810181811067ffffffffffffffff821117156158c0576158c0615281565b604052825181526158d36020840161586b565b60208201526158e46040840161586b565b60408201529392505050565b60006080828403121561590257600080fd5b6040516080810181811067ffffffffffffffff8211171561592557615925615281565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff8084111561597157615971615281565b8360051b60206159828183016152b0565b86815291850191818101903684111561599a57600080fd5b865b848110156159ce578035868111156159b45760008081fd5b6159c036828b016152ff565b84525091830191830161599c565b50979650505050505050565b6000602082840312156159ec57600080fd5b81516129bb81615273565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251615a4b81604985016020870161559d565b919091016049019695505050505050565b600082821015615a6e57615a6e6157cd565b500390565b600067ffffffffffffffff80831681851681830481118215151615615a9a57615a9a6157cd565b02949350505050565b600067ffffffffffffffff808316818516808303821115615ac657615ac66157cd565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615b0d57615b0d615acf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b6157615b616157cd565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615615ba057615ba06157cd565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615615bd457615bd46157cd565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615c1b57615c1b6157cd565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c5657615c566157cd565b60008712925087820587128484161615615c7257615c726157cd565b87850587128184161615615c8857615c886157cd565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615cd057615cd06157cd565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615615d0457615d046157cd565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615d4257615d426157cd565b500290565b600082615d5657615d56615acf565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152615da660c08301846155c9565b98975050505050505050565b805163ffffffff8116811461526e57600080fd5b600060c08284031215615dd857600080fd5b60405160c0810181811067ffffffffffffffff82111715615dfb57615dfb615281565b604052615e0783615db2565b81526020830151615e178161563f565b60208201526040830151615e2a8161563f565b6040820152615e3b60608401615db2565b6060820152615e4c60808401615db2565b6080820152615e5d60a0840161586b565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615e9a57615e9a6157cd565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680615ee357615ee3615acf565b8060ff84160691505092915050565b600060ff821660ff841680821015615f0c57615f0c6157cd565b90039392505050565b60008251615f2781846020870161559d565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
+}
+
+// OptimismPortalABI is the input ABI used to generate the binding from.
+// Deprecated: Use OptimismPortalMetaData.ABI instead.
+var OptimismPortalABI = OptimismPortalMetaData.ABI
+
+// OptimismPortalBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use OptimismPortalMetaData.Bin instead.
+var OptimismPortalBin = OptimismPortalMetaData.Bin
+
+// DeployOptimismPortal deploys a new Ethereum contract, binding an instance of OptimismPortal to it.
+func DeployOptimismPortal(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *OptimismPortal, error) {
+	parsed, err := OptimismPortalMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(OptimismPortalBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &OptimismPortal{OptimismPortalCaller: OptimismPortalCaller{contract: contract}, OptimismPortalTransactor: OptimismPortalTransactor{contract: contract}, OptimismPortalFilterer: OptimismPortalFilterer{contract: contract}}, nil
+}
+
+// OptimismPortal is an auto generated Go binding around an Ethereum contract.
+type OptimismPortal struct {
+	OptimismPortalCaller     // Read-only binding to the contract
+	OptimismPortalTransactor // Write-only binding to the contract
+	OptimismPortalFilterer   // Log filterer for contract events
+}
+
+// OptimismPortalCaller is an auto generated read-only Go binding around an Ethereum contract.
+type OptimismPortalCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type OptimismPortalTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type OptimismPortalFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type OptimismPortalSession struct {
+	Contract     *OptimismPortal   // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// OptimismPortalCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type OptimismPortalCallerSession struct {
+	Contract *OptimismPortalCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts         // Call options to use throughout this session
+}
+
+// OptimismPortalTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type OptimismPortalTransactorSession struct {
+	Contract     *OptimismPortalTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
+}
+
+// OptimismPortalRaw is an auto generated low-level Go binding around an Ethereum contract.
+type OptimismPortalRaw struct {
+	Contract *OptimismPortal // Generic contract binding to access the raw methods on
+}
+
+// OptimismPortalCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type OptimismPortalCallerRaw struct {
+	Contract *OptimismPortalCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// OptimismPortalTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type OptimismPortalTransactorRaw struct {
+	Contract *OptimismPortalTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewOptimismPortal creates a new instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortal(address common.Address, backend bind.ContractBackend) (*OptimismPortal, error) {
+	contract, err := bindOptimismPortal(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal{OptimismPortalCaller: OptimismPortalCaller{contract: contract}, OptimismPortalTransactor: OptimismPortalTransactor{contract: contract}, OptimismPortalFilterer: OptimismPortalFilterer{contract: contract}}, nil
+}
+
+// NewOptimismPortalCaller creates a new read-only instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalCaller(address common.Address, caller bind.ContractCaller) (*OptimismPortalCaller, error) {
+	contract, err := bindOptimismPortal(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalCaller{contract: contract}, nil
+}
+
+// NewOptimismPortalTransactor creates a new write-only instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalTransactor(address common.Address, transactor bind.ContractTransactor) (*OptimismPortalTransactor, error) {
+	contract, err := bindOptimismPortal(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalTransactor{contract: contract}, nil
+}
+
+// NewOptimismPortalFilterer creates a new log filterer instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalFilterer(address common.Address, filterer bind.ContractFilterer) (*OptimismPortalFilterer, error) {
+	contract, err := bindOptimismPortal(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalFilterer{contract: contract}, nil
+}
+
+// bindOptimismPortal binds a generic wrapper to an already deployed contract.
+func bindOptimismPortal(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(OptimismPortalABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismPortal *OptimismPortalRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismPortal.Contract.OptimismPortalCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismPortal *OptimismPortalRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.OptimismPortalTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismPortal *OptimismPortalRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.OptimismPortalTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismPortal *OptimismPortalCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismPortal.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismPortal *OptimismPortalTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismPortal *OptimismPortalTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.contract.Transact(opts, method, params...)
+}
+
+// Balance is a free data retrieval call binding the contract method 0xb69ef8a8.
+//
+// Solidity: function balance() view returns(uint256)
+func (_OptimismPortal *OptimismPortalCaller) Balance(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "balance")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Balance is a free data retrieval call binding the contract method 0xb69ef8a8.
+//
+// Solidity: function balance() view returns(uint256)
+func (_OptimismPortal *OptimismPortalSession) Balance() (*big.Int, error) {
+	return _OptimismPortal.Contract.Balance(&_OptimismPortal.CallOpts)
+}
+
+// Balance is a free data retrieval call binding the contract method 0xb69ef8a8.
+//
+// Solidity: function balance() view returns(uint256)
+func (_OptimismPortal *OptimismPortalCallerSession) Balance() (*big.Int, error) {
+	return _OptimismPortal.Contract.Balance(&_OptimismPortal.CallOpts)
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalCaller) FinalizedWithdrawals(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "finalizedWithdrawals", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalSession) FinalizedWithdrawals(arg0 [32]byte) (bool, error) {
+	return _OptimismPortal.Contract.FinalizedWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalCallerSession) FinalizedWithdrawals(arg0 [32]byte) (bool, error) {
+	return _OptimismPortal.Contract.FinalizedWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_OptimismPortal *OptimismPortalCaller) GasPayingToken(opts *bind.CallOpts) (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "gasPayingToken")
+
+	outstruct := new(struct {
+		Addr     common.Address
+		Decimals uint8
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.Addr = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+	outstruct.Decimals = *abi.ConvertType(out[1], new(uint8)).(*uint8)
+
+	return *outstruct, err
+
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_OptimismPortal *OptimismPortalSession) GasPayingToken() (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	return _OptimismPortal.Contract.GasPayingToken(&_OptimismPortal.CallOpts)
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_OptimismPortal *OptimismPortalCallerSession) GasPayingToken() (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	return _OptimismPortal.Contract.GasPayingToken(&_OptimismPortal.CallOpts)
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) Guardian(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "guardian")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) Guardian() (common.Address, error) {
+	return _OptimismPortal.Contract.Guardian(&_OptimismPortal.CallOpts)
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) Guardian() (common.Address, error) {
+	return _OptimismPortal.Contract.Guardian(&_OptimismPortal.CallOpts)
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalCaller) IsOutputFinalized(opts *bind.CallOpts, _l2OutputIndex *big.Int) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "isOutputFinalized", _l2OutputIndex)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalSession) IsOutputFinalized(_l2OutputIndex *big.Int) (bool, error) {
+	return _OptimismPortal.Contract.IsOutputFinalized(&_OptimismPortal.CallOpts, _l2OutputIndex)
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalCallerSession) IsOutputFinalized(_l2OutputIndex *big.Int) (bool, error) {
+	return _OptimismPortal.Contract.IsOutputFinalized(&_OptimismPortal.CallOpts, _l2OutputIndex)
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) L2Oracle(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "l2Oracle")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) L2Oracle() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Oracle(&_OptimismPortal.CallOpts)
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) L2Oracle() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Oracle(&_OptimismPortal.CallOpts)
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) L2Sender(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "l2Sender")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) L2Sender() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Sender(&_OptimismPortal.CallOpts)
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) L2Sender() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Sender(&_OptimismPortal.CallOpts)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalCaller) MinimumGasLimit(opts *bind.CallOpts, _byteCount uint64) (uint64, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "minimumGasLimit", _byteCount)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalSession) MinimumGasLimit(_byteCount uint64) (uint64, error) {
+	return _OptimismPortal.Contract.MinimumGasLimit(&_OptimismPortal.CallOpts, _byteCount)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalCallerSession) MinimumGasLimit(_byteCount uint64) (uint64, error) {
+	return _OptimismPortal.Contract.MinimumGasLimit(&_OptimismPortal.CallOpts, _byteCount)
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalCaller) Params(opts *bind.CallOpts) (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "params")
+
+	outstruct := new(struct {
+		PrevBaseFee   *big.Int
+		PrevBoughtGas uint64
+		PrevBlockNum  uint64
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.PrevBaseFee = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+	outstruct.PrevBoughtGas = *abi.ConvertType(out[1], new(uint64)).(*uint64)
+	outstruct.PrevBlockNum = *abi.ConvertType(out[2], new(uint64)).(*uint64)
+
+	return *outstruct, err
+
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalSession) Params() (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	return _OptimismPortal.Contract.Params(&_OptimismPortal.CallOpts)
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalCallerSession) Params() (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	return _OptimismPortal.Contract.Params(&_OptimismPortal.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalSession) Paused() (bool, error) {
+	return _OptimismPortal.Contract.Paused(&_OptimismPortal.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalCallerSession) Paused() (bool, error) {
+	return _OptimismPortal.Contract.Paused(&_OptimismPortal.CallOpts)
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalCaller) ProvenWithdrawals(opts *bind.CallOpts, arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "provenWithdrawals", arg0)
+
+	outstruct := new(struct {
+		OutputRoot    [32]byte
+		Timestamp     *big.Int
+		L2OutputIndex *big.Int
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.OutputRoot = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+	outstruct.Timestamp = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
+	outstruct.L2OutputIndex = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int)
+
+	return *outstruct, err
+
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalSession) ProvenWithdrawals(arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	return _OptimismPortal.Contract.ProvenWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalCallerSession) ProvenWithdrawals(arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	return _OptimismPortal.Contract.ProvenWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) SuperchainConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SuperchainConfig(&_OptimismPortal.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) SuperchainConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SuperchainConfig(&_OptimismPortal.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) SystemConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "systemConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) SystemConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SystemConfig(&_OptimismPortal.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) SystemConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SystemConfig(&_OptimismPortal.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalSession) Version() (string, error) {
+	return _OptimismPortal.Contract.Version(&_OptimismPortal.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalCallerSession) Version() (string, error) {
+	return _OptimismPortal.Contract.Version(&_OptimismPortal.CallOpts)
+}
+
+// DepositERC20Transaction is a paid mutator transaction binding the contract method 0x149f2f22.
+//
+// Solidity: function depositERC20Transaction(address _to, uint256 _mint, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) returns()
+func (_OptimismPortal *OptimismPortalTransactor) DepositERC20Transaction(opts *bind.TransactOpts, _to common.Address, _mint *big.Int, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "depositERC20Transaction", _to, _mint, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositERC20Transaction is a paid mutator transaction binding the contract method 0x149f2f22.
+//
+// Solidity: function depositERC20Transaction(address _to, uint256 _mint, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) returns()
+func (_OptimismPortal *OptimismPortalSession) DepositERC20Transaction(_to common.Address, _mint *big.Int, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositERC20Transaction(&_OptimismPortal.TransactOpts, _to, _mint, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositERC20Transaction is a paid mutator transaction binding the contract method 0x149f2f22.
+//
+// Solidity: function depositERC20Transaction(address _to, uint256 _mint, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) DepositERC20Transaction(_to common.Address, _mint *big.Int, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositERC20Transaction(&_OptimismPortal.TransactOpts, _to, _mint, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) DepositTransaction(opts *bind.TransactOpts, _to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "depositTransaction", _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalSession) DepositTransaction(_to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositTransaction(&_OptimismPortal.TransactOpts, _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) DepositTransaction(_to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositTransaction(&_OptimismPortal.TransactOpts, _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) DonateETH(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "donateETH")
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalSession) DonateETH() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DonateETH(&_OptimismPortal.TransactOpts)
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) DonateETH() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DonateETH(&_OptimismPortal.TransactOpts)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalTransactor) FinalizeWithdrawalTransaction(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "finalizeWithdrawalTransaction", _tx)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalSession) FinalizeWithdrawalTransaction(_tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) FinalizeWithdrawalTransaction(_tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalTransactor) Initialize(opts *bind.TransactOpts, _l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "initialize", _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalSession) Initialize(_l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Initialize(&_OptimismPortal.TransactOpts, _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) Initialize(_l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Initialize(&_OptimismPortal.TransactOpts, _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalTransactor) ProveWithdrawalTransaction(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "proveWithdrawalTransaction", _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalSession) ProveWithdrawalTransaction(_tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.ProveWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) ProveWithdrawalTransaction(_tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.ProveWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_OptimismPortal *OptimismPortalTransactor) SetGasPayingToken(opts *bind.TransactOpts, _token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "setGasPayingToken", _token, _decimals, _name, _symbol)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_OptimismPortal *OptimismPortalSession) SetGasPayingToken(_token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.SetGasPayingToken(&_OptimismPortal.TransactOpts, _token, _decimals, _name, _symbol)
+}
+
+// SetGasPayingToken is a paid mutator transaction binding the contract method 0x71cfaa3f.
+//
+// Solidity: function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) SetGasPayingToken(_token common.Address, _decimals uint8, _name [32]byte, _symbol [32]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.SetGasPayingToken(&_OptimismPortal.TransactOpts, _token, _decimals, _name, _symbol)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalSession) Receive() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Receive(&_OptimismPortal.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) Receive() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Receive(&_OptimismPortal.TransactOpts)
+}
+
+// OptimismPortalInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the OptimismPortal contract.
+type OptimismPortalInitializedIterator struct {
+	Event *OptimismPortalInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalInitialized represents a Initialized event raised by the OptimismPortal contract.
+type OptimismPortalInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) FilterInitialized(opts *bind.FilterOpts) (*OptimismPortalInitializedIterator, error) {
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalInitializedIterator{contract: _OptimismPortal.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *OptimismPortalInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalInitialized)
+				if err := _OptimismPortal.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) ParseInitialized(log types.Log) (*OptimismPortalInitialized, error) {
+	event := new(OptimismPortalInitialized)
+	if err := _OptimismPortal.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalTransactionDepositedIterator is returned from FilterTransactionDeposited and is used to iterate over the raw logs and unpacked data for TransactionDeposited events raised by the OptimismPortal contract.
+type OptimismPortalTransactionDepositedIterator struct {
+	Event *OptimismPortalTransactionDeposited // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalTransactionDepositedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalTransactionDeposited)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalTransactionDeposited)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalTransactionDepositedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalTransactionDepositedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalTransactionDeposited represents a TransactionDeposited event raised by the OptimismPortal contract.
+type OptimismPortalTransactionDeposited struct {
+	From       common.Address
+	To         common.Address
+	Version    *big.Int
+	OpaqueData []byte
+	Raw        types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransactionDeposited is a free log retrieval operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) FilterTransactionDeposited(opts *bind.FilterOpts, from []common.Address, to []common.Address, version []*big.Int) (*OptimismPortalTransactionDepositedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "TransactionDeposited", fromRule, toRule, versionRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalTransactionDepositedIterator{contract: _OptimismPortal.contract, event: "TransactionDeposited", logs: logs, sub: sub}, nil
+}
+
+// WatchTransactionDeposited is a free log subscription operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) WatchTransactionDeposited(opts *bind.WatchOpts, sink chan<- *OptimismPortalTransactionDeposited, from []common.Address, to []common.Address, version []*big.Int) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "TransactionDeposited", fromRule, toRule, versionRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalTransactionDeposited)
+				if err := _OptimismPortal.contract.UnpackLog(event, "TransactionDeposited", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseTransactionDeposited is a log parse operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) ParseTransactionDeposited(log types.Log) (*OptimismPortalTransactionDeposited, error) {
+	event := new(OptimismPortalTransactionDeposited)
+	if err := _OptimismPortal.contract.UnpackLog(event, "TransactionDeposited", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalWithdrawalFinalizedIterator is returned from FilterWithdrawalFinalized and is used to iterate over the raw logs and unpacked data for WithdrawalFinalized events raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalFinalizedIterator struct {
+	Event *OptimismPortalWithdrawalFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalWithdrawalFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalWithdrawalFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalWithdrawalFinalized represents a WithdrawalFinalized event raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalFinalized struct {
+	WithdrawalHash [32]byte
+	Success        bool
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawalFinalized is a free log retrieval operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) FilterWithdrawalFinalized(opts *bind.FilterOpts, withdrawalHash [][32]byte) (*OptimismPortalWithdrawalFinalizedIterator, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "WithdrawalFinalized", withdrawalHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalWithdrawalFinalizedIterator{contract: _OptimismPortal.contract, event: "WithdrawalFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawalFinalized is a free log subscription operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) WatchWithdrawalFinalized(opts *bind.WatchOpts, sink chan<- *OptimismPortalWithdrawalFinalized, withdrawalHash [][32]byte) (event.Subscription, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "WithdrawalFinalized", withdrawalHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalWithdrawalFinalized)
+				if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawalFinalized is a log parse operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) ParseWithdrawalFinalized(log types.Log) (*OptimismPortalWithdrawalFinalized, error) {
+	event := new(OptimismPortalWithdrawalFinalized)
+	if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalWithdrawalProvenIterator is returned from FilterWithdrawalProven and is used to iterate over the raw logs and unpacked data for WithdrawalProven events raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalProvenIterator struct {
+	Event *OptimismPortalWithdrawalProven // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalWithdrawalProvenIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalWithdrawalProven)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalWithdrawalProven)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalWithdrawalProvenIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalWithdrawalProvenIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalWithdrawalProven represents a WithdrawalProven event raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalProven struct {
+	WithdrawalHash [32]byte
+	From           common.Address
+	To             common.Address
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawalProven is a free log retrieval operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) FilterWithdrawalProven(opts *bind.FilterOpts, withdrawalHash [][32]byte, from []common.Address, to []common.Address) (*OptimismPortalWithdrawalProvenIterator, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "WithdrawalProven", withdrawalHashRule, fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalWithdrawalProvenIterator{contract: _OptimismPortal.contract, event: "WithdrawalProven", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawalProven is a free log subscription operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) WatchWithdrawalProven(opts *bind.WatchOpts, sink chan<- *OptimismPortalWithdrawalProven, withdrawalHash [][32]byte, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "WithdrawalProven", withdrawalHashRule, fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalWithdrawalProven)
+				if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalProven", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawalProven is a log parse operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) ParseWithdrawalProven(log types.Log) (*OptimismPortalWithdrawalProven, error) {
+	event := new(OptimismPortalWithdrawalProven)
+	if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalProven", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-bindings/bindings/permit2.go b/op-e2e/bindings/permit2.go
similarity index 100%
rename from op-bindings/bindings/permit2.go
rename to op-e2e/bindings/permit2.go
diff --git a/op-bindings/bindings/preimageoracle.go b/op-e2e/bindings/preimageoracle.go
similarity index 75%
rename from op-bindings/bindings/preimageoracle.go
rename to op-e2e/bindings/preimageoracle.go
index 32744870529f..12e34f4a9a30 100644
--- a/op-bindings/bindings/preimageoracle.go
+++ b/op-e2e/bindings/preimageoracle.go
@@ -43,7 +43,7 @@ type PreimageOracleLeaf struct {
 // PreimageOracleMetaData contains all meta data concerning the PreimageOracle contract.
 var PreimageOracleMetaData = &bind.MetaData{
 	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_minProposalSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challengePeriod\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"KECCAK_TREE_DEPTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_LEAF_COUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_BOND_SIZE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addLeavesLPP\",\"inputs\":[{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_inputStartBlock\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_stateCommitments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"_finalize\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengeFirstLPP\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_postState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_postStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengeLPP\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_stateMatrix\",\"type\":\"tuple\",\"internalType\":\"structLibKeccak.StateMatrix\",\"components\":[{\"name\":\"state\",\"type\":\"uint64[25]\",\"internalType\":\"uint64[25]\"}]},{\"name\":\"_preState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_preStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"_postState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_postStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengePeriod\",\"inputs\":[],\"outputs\":[{\"name\":\"challengePeriod_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTreeRootLPP\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"treeRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initLPP\",\"inputs\":[{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_partOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_claimedSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"loadBlobPreimagePart\",\"inputs\":[{\"name\":\"_z\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_y\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_commitment\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadKeccak256PreimagePart\",\"inputs\":[{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_preimage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadLocalData\",\"inputs\":[{\"name\":\"_ident\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_localContext\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_word\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_size\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"key_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadPrecompilePreimagePart\",\"inputs\":[{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_precompile\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"loadSha256PreimagePart\",\"inputs\":[{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_preimage\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"minProposalSize\",\"inputs\":[],\"outputs\":[{\"name\":\"minProposalSize_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preimageLengths\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preimagePartOk\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"preimageParts\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalBlocksLen\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"len_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalBonds\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalBranches\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalCount\",\"inputs\":[],\"outputs\":[{\"name\":\"count_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalMetadata\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"LPPMetaData\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposalParts\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposals\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"readPreimage\",\"inputs\":[{\"name\":\"_key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_offset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"dat_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"datLen_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"squeezeLPP\",\"inputs\":[{\"name\":\"_claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_uuid\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_stateMatrix\",\"type\":\"tuple\",\"internalType\":\"structLibKeccak.StateMatrix\",\"components\":[{\"name\":\"state\",\"type\":\"uint64[25]\",\"internalType\":\"uint64[25]\"}]},{\"name\":\"_preState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_preStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"_postState\",\"type\":\"tuple\",\"internalType\":\"structPreimageOracle.Leaf\",\"components\":[{\"name\":\"input\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateCommitment\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_postStateProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"zeroHashes\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"ActiveProposal\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AlreadyFinalized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BadProposal\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BondTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientBond\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInputSize\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPreimage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PartOffsetOOB\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PostStateMatches\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StatesNotContiguous\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TreeSizeOverflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongStartingBlock\",\"inputs\":[]}]",
-	Bin: "0x60c06040523480156200001157600080fd5b50604051620039e6380380620039e68339810160408190526200003491620000f3565b60a0829052608081905260005b6200004f600160106200012e565b811015620000ea57600381601081106200006d576200006d62000148565b01546003826010811062000085576200008562000148565b0154604080516020810193909352820152606001604051602081830303815290604052805190602001206003826001620000c091906200015e565b60108110620000d357620000d362000148565b015580620000e18162000179565b91505062000041565b50505062000195565b600080604083850312156200010757600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601160045260246000fd5b60008282101562000143576200014362000118565b500390565b634e487b7160e01b600052603260045260246000fd5b6000821982111562000174576200017462000118565b500190565b6000600182016200018e576200018e62000118565b5060010190565b60805160a05161381d620001c9600039600081816105ae0152611d3e01526000818161068e01526115a6015261381d6000f3fe6080604052600436106101cd5760003560e01c80638dc4be11116100f7578063dd24f9bf11610095578063ec5efcbc11610064578063ec5efcbc1461065f578063f3f480d91461067f578063faf37bc7146106b2578063fef2b4ed146106c557600080fd5b8063dd24f9bf1461059f578063ddcd58de146105d2578063e03110e11461060a578063e15926111461063f57600080fd5b8063b2e67ba8116100d1578063b2e67ba814610512578063b4801e611461054a578063d18534b51461056a578063da35c6641461058a57600080fd5b80638dc4be11146104835780639d53a648146104a35780639d7e8769146104f257600080fd5b806354fd4d501161016f5780637917de1d1161013e5780637917de1d146103bf5780637ac54767146103df5780638542cf50146103ff578063882856ef1461044a57600080fd5b806354fd4d50146102dd57806361238bde146103335780636551927b1461036b5780637051472e146103a357600080fd5b80632055b36b116101ab5780632055b36b146102735780633909af5c146102885780634d52b4c9146102a857806352f0f3ad146102bd57600080fd5b8063013cf08b146101d25780630359a5631461022357806304697c7814610251575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612d1c565b6106f2565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b34801561022f57600080fd5b5061024361023e366004612d5e565b610737565b60405190815260200161021a565b34801561025d57600080fd5b5061027161026c366004612dd1565b61086f565b005b34801561027f57600080fd5b50610243601081565b34801561029457600080fd5b506102716102a3366004612ff5565b6109a5565b3480156102b457600080fd5b50610243610bfc565b3480156102c957600080fd5b506102436102d83660046130e1565b610c17565b3480156102e957600080fd5b506103266040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161021a9190613148565b34801561033f57600080fd5b5061024361034e366004613199565b600160209081526000928352604080842090915290825290205481565b34801561037757600080fd5b50610243610386366004612d5e565b601560209081526000928352604080842090915290825290205481565b3480156103af57600080fd5b506102436703782dace9d9000081565b3480156103cb57600080fd5b506102716103da3660046131bb565b610cec565b3480156103eb57600080fd5b506102436103fa366004612d1c565b6111dc565b34801561040b57600080fd5b5061043a61041a366004613199565b600260209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161021a565b34801561045657600080fd5b5061046a610465366004613257565b6111f3565b60405167ffffffffffffffff909116815260200161021a565b34801561048f57600080fd5b5061027161049e36600461328a565b61124d565b3480156104af57600080fd5b506102436104be366004612d5e565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601860209081526040808320938352929052205490565b3480156104fe57600080fd5b5061027161050d3660046132d6565b611348565b34801561051e57600080fd5b5061024361052d366004612d5e565b601760209081526000928352604080842090915290825290205481565b34801561055657600080fd5b50610243610565366004613257565b6114ff565b34801561057657600080fd5b50610271610585366004612ff5565b611531565b34801561059657600080fd5b50601354610243565b3480156105ab57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610243565b3480156105de57600080fd5b506102436105ed366004612d5e565b601660209081526000928352604080842090915290825290205481565b34801561061657600080fd5b5061062a610625366004613199565b6118f3565b6040805192835260208301919091520161021a565b34801561064b57600080fd5b5061027161065a36600461328a565b6119e4565b34801561066b57600080fd5b5061027161067a366004613362565b611aec565b34801561068b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610243565b6102716106c03660046133fb565b611c72565b3480156106d157600080fd5b506102436106e0366004612d1c565b60006020819052908152604090205481565b6013818154811061070257600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061077a9060601c63ffffffff1690565b63ffffffff16905060005b6010811015610867578160011660010361080d5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106107da576107da613437565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925061084e565b826003826010811061082157610821613437565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c908061085f81613495565b915050610785565b505092915050565b600080600080608060146030823785878260140137601480870182207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06000000000000000000000000000000000000000000000000000000000000001794506000908190889084018b5afa94503d60010191506008820189106108fc5763fe2549876000526004601cfd5b60c082901b81526008018481533d6000600183013e88017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8015160008481526002602090815260408083208c8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915587845282528083209b83529a81528a82209290925593845283905296909120959095555050505050565b60006109b18a8a610737565b90506109d486868360208b01356109cf6109ca8d6134cd565b611edd565b611f1d565b80156109f257506109f283838360208801356109cf6109ca8a6134cd565b610a28576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866040013588604051602001610a3e919061359c565b6040516020818303038152906040528051906020012014610a8b576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836020013587602001356001610aa191906135da565b14610ad8576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b2088610ae686806135f2565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f7e92505050565b610b29886120d9565b836040013588604051602001610b3f919061359c565b6040516020818303038152906040528051906020012003610b8c576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526015602090815260408083208c8452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055610bf08a8a33612881565b50505050505050505050565b6001610c0a60106002613779565b610c149190613785565b81565b6000610c23868661293a565b9050610c308360086135da565b821180610c3d5750602083115b15610c74576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b60608115610d0557610cfe86866129e7565b9050610d3f565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610d6c57505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610ded8260601c63ffffffff1690565b63ffffffff169050333214610e2e576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3e8260801c63ffffffff1690565b63ffffffff16600003610e7d576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e878260c01c90565b67ffffffffffffffff1615610ec8576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610f01576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f0e89898d8886612a60565b83516020850160888204881415608883061715610f33576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610fe3578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610fd8576001821615610fb85782818b0152610fd8565b8981015160009081526020938452604090209260019290921c9101610f9b565b505050608801610f40565b50505050600160106002610ff79190613779565b6110019190613785565b81111561103a576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110af61104d8360401c63ffffffff1690565b61105d9063ffffffff168a6135da565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b9150841561113c5777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b1791506110e98260801c63ffffffff1690565b63ffffffff166110ff8360401c63ffffffff1690565b63ffffffff161461113c576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e8452909152902061116290846010612c92565b50503360008181526018602090815260408083208e8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055928252601581528282209c82529b909b52909920989098555050505050505050565b600381601081106111ec57600080fd5b0154905081565b6018602052826000526040600020602052816000526040600020818154811061121b57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b60443560008060088301861061126b5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa90508061129857600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b600080603087600037602060006030600060025afa806113705763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa9250826113f2576309bde3396000526004601cfd5b602886106114085763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061152757600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156115a4576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006115cf8260c01c90565b6115e39067ffffffffffffffff1642613785565b1161161a576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116268b8b610737565b905061163f87878360208c01356109cf6109ca8e6134cd565b801561165d575061165d84848360208901356109cf6109ca8b6134cd565b611693576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016116a9919061359c565b60405160208183030381529060405280519060200120146116f6576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84602001358860200135600161170c91906135da565b14158061173e575060016117268360601c63ffffffff1690565b611730919061379c565b63ffffffff16856020013514155b15611775576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61178389610ae687806135f2565b61178c896120d9565b60006117978a612bb3565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f020000000000000000000000000000000000000000000000000000000000000017905060006117ee8460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054600160008481526020019081526020016000206000838152602001908152602001600020819055506118c08460801c63ffffffff1690565b600083815260208190526040902063ffffffff9190911690556118e48d8d81612881565b50505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff1661197c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546119988160086135da565b6119a38560206135da565b106119c157836119b48260086135da565b6119be9190613785565b91505b506000938452600160209081526040808620948652939052919092205492909150565b604435600080600883018610611a025763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b6000611af88686610737565b9050611b1183838360208801356109cf6109ca8a6134cd565b611b47576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611b83576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b8b612cd0565b611b9981610ae687806135f2565b611ba2816120d9565b846040013581604051602001611bb8919061359c565b6040516020818303038152906040528051906020012003611c05576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152601560209081526040808320898452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055611c69878733612881565b50505050505050565b6703782dace9d90000341015611cb4576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611ced576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf88160086137c1565b63ffffffff168263ffffffff1610611d3c576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008163ffffffff161015611d9c576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601560209081526040808320878452825280832080547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1660a09790971b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff169690961760809590951b949094179094558251808401845282815280850186815260138054600181018255908452915160029092027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0908101805473ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090941693909317909255517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0919091015590815260168352818120938152929091529020349055565b6000816000015182602001518360400151604051602001611f00939291906137e9565b604051602081830303815290604052805190602001209050919050565b60008160005b6010811015611f71578060051b880135600186831c1660018114611f565760008481526020839052604090209350611f67565b600082815260208590526040902093505b5050600101611f23565b5090931495945050505050565b6088815114611f8c57600080fd5b602081016020830161200d565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b171717905061200781611ff2868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b61201960008383611f99565b61202560018383611f99565b61203160028383611f99565b61203d60038383611f99565b61204960048383611f99565b61205560058383611f99565b61206160068383611f99565b61206d60078383611f99565b61207960088383611f99565b61208560098383611f99565b612091600a8383611f99565b61209d600b8383611f99565b6120a9600c8383611f99565b6120b5600d8383611f99565b6120c1600e8383611f99565b6120cd600f8383611f99565b61200760108383611f99565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e00160405160208183030381529060405290506020820160208201612761565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c61228c8660011b67ffffffffffffffff1690565b18188584603f1c6122a78660011b67ffffffffffffffff1690565b18188584603f1c6122c28660011b67ffffffffffffffff1690565b181895508483603f1c6122df8560011b67ffffffffffffffff1690565b181894508387603f1c6122fc8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525b5050505050565b600582811b8201805160018501831b8401805160028701851b8601805160038901871b8801805160048b0190981b8901805167ffffffffffffffff861985168918811690995283198a16861889169096528819861683188816909352841986168818871690528419831684189095169052919391929190611c69565b6126fb600082612674565b612706600582612674565b612711600a82612674565b61271c600f82612674565b612727601482612674565b50565b612733816121cf565b61273c816126f0565b600383901b820151815160c09190911c9061200790821867ffffffffffffffff168352565b61276d6000828461272a565b6127796001828461272a565b6127856002828461272a565b6127916003828461272a565b61279d6004828461272a565b6127a96005828461272a565b6127b56006828461272a565b6127c16007828461272a565b6127cd6008828461272a565b6127d96009828461272a565b6127e5600a828461272a565b6127f1600b828461272a565b6127fd600c828461272a565b612809600d828461272a565b612815600e828461272a565b612821600f828461272a565b61282d6010828461272a565b6128396011828461272a565b6128456012828461272a565b6128516013828461272a565b61285d6014828461272a565b6128696015828461272a565b6128756016828461272a565b6120076017828461272a565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526016602090815260408083208684529091528082208054908390559051909284169083908381818185875af1925050503d80600081146128fa576040519150601f19603f3d011682016040523d82523d6000602084013e6128ff565b606091505b505090508061266d576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316176129e0818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b6060604051905081602082018181018286833760888306808015612a305760888290038501848101848103803687375060806001820353506001845160001a1784538652612a47565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b6000612a728260a01c63ffffffff1690565b67ffffffffffffffff1690506000612a908360801c63ffffffff1690565b63ffffffff1690506000612aaa8460401c63ffffffff1690565b63ffffffff169050600883108015612ac0575080155b15612af45760c082901b6000908152883560085283513382526017602090815260408084208a855290915290912055612ba9565b60088310158015612b12575080612b0c600885613785565b93508310155b8015612b265750612b2387826135da565b83105b15612ba9576000612b378285613785565b905087612b458260206135da565b10158015612b51575085155b15612b88576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526017602090815260408083208a845290915290209089013590555b5050505050505050565b6000612c36565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff00612be48360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612c118360101b67ffffffffffffffff1690565b1617905060008160201c612c2f8360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612c4e90612bba565b612bba565b6040820151612c5c90612bba565b60401b17612c74612c4960018460059190911b015190565b825160809190911b90612c8690612bba565b60c01b17179392505050565b8260108101928215612cc0579160200282015b82811115612cc0578251825591602001919060010190612ca5565b50612ccc929150612ce8565b5090565b6040518060200160405280612ce3612cfd565b905290565b5b80821115612ccc5760008155600101612ce9565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612d2e57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d5957600080fd5b919050565b60008060408385031215612d7157600080fd5b612d7a83612d35565b946020939093013593505050565b60008083601f840112612d9a57600080fd5b50813567ffffffffffffffff811115612db257600080fd5b602083019150836020828501011115612dca57600080fd5b9250929050565b60008060008060608587031215612de757600080fd5b84359350612df760208601612d35565b9250604085013567ffffffffffffffff811115612e1357600080fd5b612e1f87828801612d88565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612e7e57612e7e612e2b565b60405290565b6040516060810167ffffffffffffffff81118282101715612e7e57612e7e612e2b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612eee57612eee612e2b565b604052919050565b6000610320808385031215612f0a57600080fd5b604051602080820167ffffffffffffffff8382108183111715612f2f57612f2f612e2b565b8160405283955087601f880112612f4557600080fd5b612f4d612e5a565b9487019491508188861115612f6157600080fd5b875b86811015612f895780358381168114612f7c5760008081fd5b8452928401928401612f63565b50909352509295945050505050565b600060608284031215612faa57600080fd5b50919050565b60008083601f840112612fc257600080fd5b50813567ffffffffffffffff811115612fda57600080fd5b6020830191508360208260051b8501011115612dca57600080fd5b60008060008060008060008060006103e08a8c03121561301457600080fd5b61301d8a612d35565b985060208a013597506130338b60408c01612ef6565b96506103608a013567ffffffffffffffff8082111561305157600080fd5b61305d8d838e01612f98565b97506103808c013591508082111561307457600080fd5b6130808d838e01612fb0565b90975095506103a08c013591508082111561309a57600080fd5b6130a68d838e01612f98565b94506103c08c01359150808211156130bd57600080fd5b506130ca8c828d01612fb0565b915080935050809150509295985092959850929598565b600080600080600060a086880312156130f957600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60005b8381101561313757818101518382015260200161311f565b838111156120075750506000910152565b602081526000825180602084015261316781604085016020870161311c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600080604083850312156131ac57600080fd5b50508035926020909101359150565b600080600080600080600060a0888a0312156131d657600080fd5b8735965060208801359550604088013567ffffffffffffffff808211156131fc57600080fd5b6132088b838c01612d88565b909750955060608a013591508082111561322157600080fd5b5061322e8a828b01612fb0565b9094509250506080880135801515811461324757600080fd5b8091505092959891949750929550565b60008060006060848603121561326c57600080fd5b61327584612d35565b95602085013595506040909401359392505050565b60008060006040848603121561329f57600080fd5b83359250602084013567ffffffffffffffff8111156132bd57600080fd5b6132c986828701612d88565b9497909650939450505050565b600080600080600080600060a0888a0312156132f157600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561331757600080fd5b6133238b838c01612d88565b909750955060608a013591508082111561333c57600080fd5b506133498a828b01612d88565b989b979a50959894979596608090950135949350505050565b60008060008060006080868803121561337a57600080fd5b61338386612d35565b945060208601359350604086013567ffffffffffffffff808211156133a757600080fd5b6133b389838a01612f98565b945060608801359150808211156133c957600080fd5b506133d688828901612fb0565b969995985093965092949392505050565b803563ffffffff81168114612d5957600080fd5b60008060006060848603121561341057600080fd5b83359250613420602085016133e7565b915061342e604085016133e7565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134c6576134c6613466565b5060010190565b6000606082360312156134df57600080fd5b6134e7612e84565b823567ffffffffffffffff808211156134ff57600080fd5b9084019036601f83011261351257600080fd5b813560208282111561352657613526612e2b565b613556817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612ea7565b9250818352368183860101111561356c57600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b60198110156135d157825167ffffffffffffffff168252602092830192909101906001016135a8565b50505092915050565b600082198211156135ed576135ed613466565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261362757600080fd5b83018035915067ffffffffffffffff82111561364257600080fd5b602001915036819003821315612dca57600080fd5b600181815b808511156136b057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561369657613696613466565b808516156136a357918102915b93841c939080029061365c565b509250929050565b6000826136c757506001613773565b816136d457506000613773565b81600181146136ea57600281146136f457613710565b6001915050613773565b60ff84111561370557613705613466565b50506001821b613773565b5060208310610133831016604e8410600b8410161715613733575081810a613773565b61373d8383613657565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561376f5761376f613466565b0290505b92915050565b60006129e083836136b8565b60008282101561379757613797613466565b500390565b600063ffffffff838116908316818110156137b9576137b9613466565b039392505050565b600063ffffffff8083168185168083038211156137e0576137e0613466565b01949350505050565b600084516137fb81846020890161311c565b9190910192835250602082015260400191905056fea164736f6c634300080f000a",
+	Bin: "0x60c06040523480156200001157600080fd5b50604051620039f9380380620039f98339810160408190526200003491620000f3565b60a0829052608081905260005b6200004f600160106200012e565b811015620000ea57600381601081106200006d576200006d62000148565b01546003826010811062000085576200008562000148565b0154604080516020810193909352820152606001604051602081830303815290604052805190602001206003826001620000c091906200015e565b60108110620000d357620000d362000148565b015580620000e18162000179565b91505062000041565b50505062000195565b600080604083850312156200010757600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601160045260246000fd5b60008282101562000143576200014362000118565b500390565b634e487b7160e01b600052603260045260246000fd5b6000821982111562000174576200017462000118565b500190565b6000600182016200018e576200018e62000118565b5060010190565b60805160a051613830620001c9600039600081816105ae0152611d5101526000818161068e01526115b901526138306000f3fe6080604052600436106101cd5760003560e01c80638dc4be11116100f7578063dd24f9bf11610095578063ec5efcbc11610064578063ec5efcbc1461065f578063f3f480d91461067f578063faf37bc7146106b2578063fef2b4ed146106c557600080fd5b8063dd24f9bf1461059f578063ddcd58de146105d2578063e03110e11461060a578063e15926111461063f57600080fd5b8063b2e67ba8116100d1578063b2e67ba814610512578063b4801e611461054a578063d18534b51461056a578063da35c6641461058a57600080fd5b80638dc4be11146104835780639d53a648146104a35780639d7e8769146104f257600080fd5b806354fd4d501161016f5780637917de1d1161013e5780637917de1d146103bf5780637ac54767146103df5780638542cf50146103ff578063882856ef1461044a57600080fd5b806354fd4d50146102dd57806361238bde146103335780636551927b1461036b5780637051472e146103a357600080fd5b80632055b36b116101ab5780632055b36b146102735780633909af5c146102885780634d52b4c9146102a857806352f0f3ad146102bd57600080fd5b8063013cf08b146101d25780630359a5631461022357806304697c7814610251575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612d2f565b6106f2565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b34801561022f57600080fd5b5061024361023e366004612d71565b610737565b60405190815260200161021a565b34801561025d57600080fd5b5061027161026c366004612de4565b61086f565b005b34801561027f57600080fd5b50610243601081565b34801561029457600080fd5b506102716102a3366004613008565b6109a5565b3480156102b457600080fd5b50610243610bfc565b3480156102c957600080fd5b506102436102d83660046130f4565b610c17565b3480156102e957600080fd5b506103266040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161021a919061315b565b34801561033f57600080fd5b5061024361034e3660046131ac565b600160209081526000928352604080842090915290825290205481565b34801561037757600080fd5b50610243610386366004612d71565b601560209081526000928352604080842090915290825290205481565b3480156103af57600080fd5b506102436703782dace9d9000081565b3480156103cb57600080fd5b506102716103da3660046131ce565b610cec565b3480156103eb57600080fd5b506102436103fa366004612d2f565b6111ef565b34801561040b57600080fd5b5061043a61041a3660046131ac565b600260209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161021a565b34801561045657600080fd5b5061046a61046536600461326a565b611206565b60405167ffffffffffffffff909116815260200161021a565b34801561048f57600080fd5b5061027161049e36600461329d565b611260565b3480156104af57600080fd5b506102436104be366004612d71565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601860209081526040808320938352929052205490565b3480156104fe57600080fd5b5061027161050d3660046132e9565b61135b565b34801561051e57600080fd5b5061024361052d366004612d71565b601760209081526000928352604080842090915290825290205481565b34801561055657600080fd5b5061024361056536600461326a565b611512565b34801561057657600080fd5b50610271610585366004613008565b611544565b34801561059657600080fd5b50601354610243565b3480156105ab57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610243565b3480156105de57600080fd5b506102436105ed366004612d71565b601660209081526000928352604080842090915290825290205481565b34801561061657600080fd5b5061062a6106253660046131ac565b611906565b6040805192835260208301919091520161021a565b34801561064b57600080fd5b5061027161065a36600461329d565b6119f7565b34801561066b57600080fd5b5061027161067a366004613375565b611aff565b34801561068b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610243565b6102716106c036600461340e565b611c85565b3480156106d157600080fd5b506102436106e0366004612d2f565b60006020819052908152604090205481565b6013818154811061070257600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061077a9060601c63ffffffff1690565b63ffffffff16905060005b6010811015610867578160011660010361080d5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106107da576107da61344a565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925061084e565b82600382601081106108215761082161344a565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c908061085f816134a8565b915050610785565b505092915050565b600080600080608060146030823785878260140137601480870182207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06000000000000000000000000000000000000000000000000000000000000001794506000908190889084018b5afa94503d60010191506008820189106108fc5763fe2549876000526004601cfd5b60c082901b81526008018481533d6000600183013e88017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8015160008481526002602090815260408083208c8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915587845282528083209b83529a81528a82209290925593845283905296909120959095555050505050565b60006109b18a8a610737565b90506109d486868360208b01356109cf6109ca8d6134e0565b611ef0565b611f30565b80156109f257506109f283838360208801356109cf6109ca8a6134e0565b610a28576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866040013588604051602001610a3e91906135af565b6040516020818303038152906040528051906020012014610a8b576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836020013587602001356001610aa191906135ed565b14610ad8576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b2088610ae68680613605565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f9192505050565b610b29886120ec565b836040013588604051602001610b3f91906135af565b6040516020818303038152906040528051906020012003610b8c576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526015602090815260408083208c8452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055610bf08a8a33612894565b50505050505050505050565b6001610c0a6010600261378c565b610c149190613798565b81565b6000610c23868661294d565b9050610c308360086135ed565b821180610c3d5750602083115b15610c74576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b60608115610d0557610cfe86866129fa565b9050610d3f565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610d6c57505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610ded8260601c63ffffffff1690565b63ffffffff169050333214610e2e576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3e8260801c63ffffffff1690565b63ffffffff16600003610e7d576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e878260c01c90565b67ffffffffffffffff1615610ec8576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610f01576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f0e89898d8886612a73565b83516020850160888204881415608883061715610f33576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610fe3578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610fd8576001821615610fb85782818b0152610fd8565b8981015160009081526020938452604090209260019290921c9101610f9b565b505050608801610f40565b50505050600160106002610ff7919061378c565b6110019190613798565b81111561103a576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110af61104d8360401c63ffffffff1690565b61105d9063ffffffff168a6135ed565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b9150841561113c5777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b1791506110e98260801c63ffffffff1690565b63ffffffff166110ff8360401c63ffffffff1690565b63ffffffff161461113c576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e8452909152902061116290846010612ca5565b503360008181526018602090815260408083208f8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055838352601582528083208f8452909152812084905560609190911b81523690601437366014016000a05050505050505050505050565b600381601081106111ff57600080fd5b0154905081565b6018602052826000526040600020602052816000526040600020818154811061122e57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b60443560008060088301861061127e5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa9050806112ab57600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b600080603087600037602060006030600060025afa806113835763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa925082611405576309bde3396000526004601cfd5b6028861061141b5763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061153a57600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156115b7576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006115e28260c01c90565b6115f69067ffffffffffffffff1642613798565b1161162d576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116398b8b610737565b905061165287878360208c01356109cf6109ca8e6134e0565b8015611670575061167084848360208901356109cf6109ca8b6134e0565b6116a6576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016116bc91906135af565b6040516020818303038152906040528051906020012014611709576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84602001358860200135600161171f91906135ed565b141580611751575060016117398360601c63ffffffff1690565b61174391906137af565b63ffffffff16856020013514155b15611788576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61179689610ae68780613605565b61179f896120ec565b60006117aa8a612bc6565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f020000000000000000000000000000000000000000000000000000000000000017905060006118018460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054600160008481526020019081526020016000206000838152602001908152602001600020819055506118d38460801c63ffffffff1690565b600083815260208190526040902063ffffffff9190911690556118f78d8d81612894565b50505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff1661198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546119ab8160086135ed565b6119b68560206135ed565b106119d457836119c78260086135ed565b6119d19190613798565b91505b506000938452600160209081526040808620948652939052919092205492909150565b604435600080600883018610611a155763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b6000611b0b8686610737565b9050611b2483838360208801356109cf6109ca8a6134e0565b611b5a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611b96576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b9e612ce3565b611bac81610ae68780613605565b611bb5816120ec565b846040013581604051602001611bcb91906135af565b6040516020818303038152906040528051906020012003611c18576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152601560209081526040808320898452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055611c7c878733612894565b50505050505050565b6703782dace9d90000341015611cc7576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611d00576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d0b8160086137d4565b63ffffffff168263ffffffff1610611d4f576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008163ffffffff161015611daf576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601560209081526040808320878452825280832080547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1660a09790971b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff169690961760809590951b949094179094558251808401845282815280850186815260138054600181018255908452915160029092027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0908101805473ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090941693909317909255517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0919091015590815260168352818120938152929091529020349055565b6000816000015182602001518360400151604051602001611f13939291906137fc565b604051602081830303815290604052805190602001209050919050565b60008160005b6010811015611f84578060051b880135600186831c1660018114611f695760008481526020839052604090209350611f7a565b600082815260208590526040902093505b5050600101611f36565b5090931495945050505050565b6088815114611f9f57600080fd5b6020810160208301612020565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b171717905061201a81612005868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b61202c60008383611fac565b61203860018383611fac565b61204460028383611fac565b61205060038383611fac565b61205c60048383611fac565b61206860058383611fac565b61207460068383611fac565b61208060078383611fac565b61208c60088383611fac565b61209860098383611fac565b6120a4600a8383611fac565b6120b0600b8383611fac565b6120bc600c8383611fac565b6120c8600d8383611fac565b6120d4600e8383611fac565b6120e0600f8383611fac565b61201a60108383611fac565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e00160405160208183030381529060405290506020820160208201612774565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c61229f8660011b67ffffffffffffffff1690565b18188584603f1c6122ba8660011b67ffffffffffffffff1690565b18188584603f1c6122d58660011b67ffffffffffffffff1690565b181895508483603f1c6122f28560011b67ffffffffffffffff1690565b181894508387603f1c61230f8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525b5050505050565b600582811b8201805160018501831b8401805160028701851b8601805160038901871b8801805160048b0190981b8901805167ffffffffffffffff861985168918811690995283198a16861889169096528819861683188816909352841986168818871690528419831684189095169052919391929190611c7c565b61270e600082612687565b612719600582612687565b612724600a82612687565b61272f600f82612687565b61273a601482612687565b50565b612746816121e2565b61274f81612703565b600383901b820151815160c09190911c9061201a90821867ffffffffffffffff168352565b6127806000828461273d565b61278c6001828461273d565b6127986002828461273d565b6127a46003828461273d565b6127b06004828461273d565b6127bc6005828461273d565b6127c86006828461273d565b6127d46007828461273d565b6127e06008828461273d565b6127ec6009828461273d565b6127f8600a828461273d565b612804600b828461273d565b612810600c828461273d565b61281c600d828461273d565b612828600e828461273d565b612834600f828461273d565b6128406010828461273d565b61284c6011828461273d565b6128586012828461273d565b6128646013828461273d565b6128706014828461273d565b61287c6015828461273d565b6128886016828461273d565b61201a6017828461273d565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526016602090815260408083208684529091528082208054908390559051909284169083908381818185875af1925050503d806000811461290d576040519150601f19603f3d011682016040523d82523d6000602084013e612912565b606091505b5050905080612680576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316176129f3818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b6060604051905081602082018181018286833760888306808015612a435760888290038501848101848103803687375060806001820353506001845160001a1784538652612a5a565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b6000612a858260a01c63ffffffff1690565b67ffffffffffffffff1690506000612aa38360801c63ffffffff1690565b63ffffffff1690506000612abd8460401c63ffffffff1690565b63ffffffff169050600883108015612ad3575080155b15612b075760c082901b6000908152883560085283513382526017602090815260408084208a855290915290912055612bbc565b60088310158015612b25575080612b1f600885613798565b93508310155b8015612b395750612b3687826135ed565b83105b15612bbc576000612b4a8285613798565b905087612b588260206135ed565b10158015612b64575085155b15612b9b576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526017602090815260408083208a845290915290209089013590555b5050505050505050565b6000612c49565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff00612bf78360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612c248360101b67ffffffffffffffff1690565b1617905060008160201c612c428360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612c6190612bcd565b612bcd565b6040820151612c6f90612bcd565b60401b17612c87612c5c60018460059190911b015190565b825160809190911b90612c9990612bcd565b60c01b17179392505050565b8260108101928215612cd3579160200282015b82811115612cd3578251825591602001919060010190612cb8565b50612cdf929150612cfb565b5090565b6040518060200160405280612cf6612d10565b905290565b5b80821115612cdf5760008155600101612cfc565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612d4157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d6c57600080fd5b919050565b60008060408385031215612d8457600080fd5b612d8d83612d48565b946020939093013593505050565b60008083601f840112612dad57600080fd5b50813567ffffffffffffffff811115612dc557600080fd5b602083019150836020828501011115612ddd57600080fd5b9250929050565b60008060008060608587031215612dfa57600080fd5b84359350612e0a60208601612d48565b9250604085013567ffffffffffffffff811115612e2657600080fd5b612e3287828801612d9b565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612e9157612e91612e3e565b60405290565b6040516060810167ffffffffffffffff81118282101715612e9157612e91612e3e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f0157612f01612e3e565b604052919050565b6000610320808385031215612f1d57600080fd5b604051602080820167ffffffffffffffff8382108183111715612f4257612f42612e3e565b8160405283955087601f880112612f5857600080fd5b612f60612e6d565b9487019491508188861115612f7457600080fd5b875b86811015612f9c5780358381168114612f8f5760008081fd5b8452928401928401612f76565b50909352509295945050505050565b600060608284031215612fbd57600080fd5b50919050565b60008083601f840112612fd557600080fd5b50813567ffffffffffffffff811115612fed57600080fd5b6020830191508360208260051b8501011115612ddd57600080fd5b60008060008060008060008060006103e08a8c03121561302757600080fd5b6130308a612d48565b985060208a013597506130468b60408c01612f09565b96506103608a013567ffffffffffffffff8082111561306457600080fd5b6130708d838e01612fab565b97506103808c013591508082111561308757600080fd5b6130938d838e01612fc3565b90975095506103a08c01359150808211156130ad57600080fd5b6130b98d838e01612fab565b94506103c08c01359150808211156130d057600080fd5b506130dd8c828d01612fc3565b915080935050809150509295985092959850929598565b600080600080600060a0868803121561310c57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60005b8381101561314a578181015183820152602001613132565b8381111561201a5750506000910152565b602081526000825180602084015261317a81604085016020870161312f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600080604083850312156131bf57600080fd5b50508035926020909101359150565b600080600080600080600060a0888a0312156131e957600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561320f57600080fd5b61321b8b838c01612d9b565b909750955060608a013591508082111561323457600080fd5b506132418a828b01612fc3565b9094509250506080880135801515811461325a57600080fd5b8091505092959891949750929550565b60008060006060848603121561327f57600080fd5b61328884612d48565b95602085013595506040909401359392505050565b6000806000604084860312156132b257600080fd5b83359250602084013567ffffffffffffffff8111156132d057600080fd5b6132dc86828701612d9b565b9497909650939450505050565b600080600080600080600060a0888a03121561330457600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561332a57600080fd5b6133368b838c01612d9b565b909750955060608a013591508082111561334f57600080fd5b5061335c8a828b01612d9b565b989b979a50959894979596608090950135949350505050565b60008060008060006080868803121561338d57600080fd5b61339686612d48565b945060208601359350604086013567ffffffffffffffff808211156133ba57600080fd5b6133c689838a01612fab565b945060608801359150808211156133dc57600080fd5b506133e988828901612fc3565b969995985093965092949392505050565b803563ffffffff81168114612d6c57600080fd5b60008060006060848603121561342357600080fd5b83359250613433602085016133fa565b9150613441604085016133fa565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134d9576134d9613479565b5060010190565b6000606082360312156134f257600080fd5b6134fa612e97565b823567ffffffffffffffff8082111561351257600080fd5b9084019036601f83011261352557600080fd5b813560208282111561353957613539612e3e565b613569817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612eba565b9250818352368183860101111561357f57600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b60198110156135e457825167ffffffffffffffff168252602092830192909101906001016135bb565b50505092915050565b6000821982111561360057613600613479565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261363a57600080fd5b83018035915067ffffffffffffffff82111561365557600080fd5b602001915036819003821315612ddd57600080fd5b600181815b808511156136c357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156136a9576136a9613479565b808516156136b657918102915b93841c939080029061366f565b509250929050565b6000826136da57506001613786565b816136e757506000613786565b81600181146136fd576002811461370757613723565b6001915050613786565b60ff84111561371857613718613479565b50506001821b613786565b5060208310610133831016604e8410600b8410161715613746575081810a613786565b613750838361366a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561378257613782613479565b0290505b92915050565b60006129f383836136cb565b6000828210156137aa576137aa613479565b500390565b600063ffffffff838116908316818110156137cc576137cc613479565b039392505050565b600063ffffffff8083168185168083038211156137f3576137f3613479565b01949350505050565b6000845161380e81846020890161312f565b9190910192835250602082015260400191905056fea164736f6c634300080f000a",
 }
 
 // PreimageOracleABI is the input ABI used to generate the binding from.
diff --git a/op-bindings/bindings/protocolversions.go b/op-e2e/bindings/protocolversions.go
similarity index 100%
rename from op-bindings/bindings/protocolversions.go
rename to op-e2e/bindings/protocolversions.go
diff --git a/op-bindings/bindings/proxy.go b/op-e2e/bindings/proxy.go
similarity index 100%
rename from op-bindings/bindings/proxy.go
rename to op-e2e/bindings/proxy.go
diff --git a/op-bindings/bindings/proxyadmin.go b/op-e2e/bindings/proxyadmin.go
similarity index 100%
rename from op-bindings/bindings/proxyadmin.go
rename to op-e2e/bindings/proxyadmin.go
diff --git a/op-bindings/bindings/safe.go b/op-e2e/bindings/safe.go
similarity index 100%
rename from op-bindings/bindings/safe.go
rename to op-e2e/bindings/safe.go
diff --git a/op-bindings/bindings/safe_v130.go b/op-e2e/bindings/safe_v130.go
similarity index 100%
rename from op-bindings/bindings/safe_v130.go
rename to op-e2e/bindings/safe_v130.go
diff --git a/op-bindings/bindings/safel2_v130.go b/op-e2e/bindings/safel2_v130.go
similarity index 100%
rename from op-bindings/bindings/safel2_v130.go
rename to op-e2e/bindings/safel2_v130.go
diff --git a/op-bindings/bindings/safeproxyfactory.go b/op-e2e/bindings/safeproxyfactory.go
similarity index 100%
rename from op-bindings/bindings/safeproxyfactory.go
rename to op-e2e/bindings/safeproxyfactory.go
diff --git a/op-bindings/bindings/safesingletonfactory.go b/op-e2e/bindings/safesingletonfactory.go
similarity index 100%
rename from op-bindings/bindings/safesingletonfactory.go
rename to op-e2e/bindings/safesingletonfactory.go
diff --git a/op-bindings/bindings/schemaregistry.go b/op-e2e/bindings/schemaregistry.go
similarity index 100%
rename from op-bindings/bindings/schemaregistry.go
rename to op-e2e/bindings/schemaregistry.go
diff --git a/op-bindings/bindings/sendercreator.go b/op-e2e/bindings/sendercreator.go
similarity index 100%
rename from op-bindings/bindings/sendercreator.go
rename to op-e2e/bindings/sendercreator.go
diff --git a/op-bindings/bindings/sequencerfeevault.go b/op-e2e/bindings/sequencerfeevault.go
similarity index 100%
rename from op-bindings/bindings/sequencerfeevault.go
rename to op-e2e/bindings/sequencerfeevault.go
diff --git a/op-e2e/bindings/standardbridge.go b/op-e2e/bindings/standardbridge.go
new file mode 100644
index 000000000000..eb5866bb7254
--- /dev/null
+++ b/op-e2e/bindings/standardbridge.go
@@ -0,0 +1,1287 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// StandardBridgeMetaData contains all meta data concerning the StandardBridge contract.
+var StandardBridgeMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OTHER_BRIDGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractStandardBridge\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgeERC20\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bridgeERC20To\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bridgeETH\",\"inputs\":[{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"bridgeETHTo\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"deposits\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"finalizeBridgeERC20\",\"inputs\":[{\"name\":\"_localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizeBridgeETH\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"messenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractCrossDomainMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"otherBridge\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractStandardBridge\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ERC20BridgeFinalized\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"remoteToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ERC20BridgeInitiated\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"remoteToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHBridgeFinalized\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ETHBridgeInitiated\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false}]",
+}
+
+// StandardBridgeABI is the input ABI used to generate the binding from.
+// Deprecated: Use StandardBridgeMetaData.ABI instead.
+var StandardBridgeABI = StandardBridgeMetaData.ABI
+
+// StandardBridge is an auto generated Go binding around an Ethereum contract.
+type StandardBridge struct {
+	StandardBridgeCaller     // Read-only binding to the contract
+	StandardBridgeTransactor // Write-only binding to the contract
+	StandardBridgeFilterer   // Log filterer for contract events
+}
+
+// StandardBridgeCaller is an auto generated read-only Go binding around an Ethereum contract.
+type StandardBridgeCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// StandardBridgeTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type StandardBridgeTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// StandardBridgeFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type StandardBridgeFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// StandardBridgeSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type StandardBridgeSession struct {
+	Contract     *StandardBridge   // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// StandardBridgeCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type StandardBridgeCallerSession struct {
+	Contract *StandardBridgeCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts         // Call options to use throughout this session
+}
+
+// StandardBridgeTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type StandardBridgeTransactorSession struct {
+	Contract     *StandardBridgeTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
+}
+
+// StandardBridgeRaw is an auto generated low-level Go binding around an Ethereum contract.
+type StandardBridgeRaw struct {
+	Contract *StandardBridge // Generic contract binding to access the raw methods on
+}
+
+// StandardBridgeCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type StandardBridgeCallerRaw struct {
+	Contract *StandardBridgeCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// StandardBridgeTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type StandardBridgeTransactorRaw struct {
+	Contract *StandardBridgeTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewStandardBridge creates a new instance of StandardBridge, bound to a specific deployed contract.
+func NewStandardBridge(address common.Address, backend bind.ContractBackend) (*StandardBridge, error) {
+	contract, err := bindStandardBridge(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &StandardBridge{StandardBridgeCaller: StandardBridgeCaller{contract: contract}, StandardBridgeTransactor: StandardBridgeTransactor{contract: contract}, StandardBridgeFilterer: StandardBridgeFilterer{contract: contract}}, nil
+}
+
+// NewStandardBridgeCaller creates a new read-only instance of StandardBridge, bound to a specific deployed contract.
+func NewStandardBridgeCaller(address common.Address, caller bind.ContractCaller) (*StandardBridgeCaller, error) {
+	contract, err := bindStandardBridge(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &StandardBridgeCaller{contract: contract}, nil
+}
+
+// NewStandardBridgeTransactor creates a new write-only instance of StandardBridge, bound to a specific deployed contract.
+func NewStandardBridgeTransactor(address common.Address, transactor bind.ContractTransactor) (*StandardBridgeTransactor, error) {
+	contract, err := bindStandardBridge(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &StandardBridgeTransactor{contract: contract}, nil
+}
+
+// NewStandardBridgeFilterer creates a new log filterer instance of StandardBridge, bound to a specific deployed contract.
+func NewStandardBridgeFilterer(address common.Address, filterer bind.ContractFilterer) (*StandardBridgeFilterer, error) {
+	contract, err := bindStandardBridge(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &StandardBridgeFilterer{contract: contract}, nil
+}
+
+// bindStandardBridge binds a generic wrapper to an already deployed contract.
+func bindStandardBridge(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(StandardBridgeABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_StandardBridge *StandardBridgeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _StandardBridge.Contract.StandardBridgeCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_StandardBridge *StandardBridgeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _StandardBridge.Contract.StandardBridgeTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_StandardBridge *StandardBridgeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _StandardBridge.Contract.StandardBridgeTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_StandardBridge *StandardBridgeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _StandardBridge.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_StandardBridge *StandardBridgeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _StandardBridge.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_StandardBridge *StandardBridgeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _StandardBridge.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_StandardBridge *StandardBridgeCaller) MESSENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _StandardBridge.contract.Call(opts, &out, "MESSENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_StandardBridge *StandardBridgeSession) MESSENGER() (common.Address, error) {
+	return _StandardBridge.Contract.MESSENGER(&_StandardBridge.CallOpts)
+}
+
+// MESSENGER is a free data retrieval call binding the contract method 0x927ede2d.
+//
+// Solidity: function MESSENGER() view returns(address)
+func (_StandardBridge *StandardBridgeCallerSession) MESSENGER() (common.Address, error) {
+	return _StandardBridge.Contract.MESSENGER(&_StandardBridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_StandardBridge *StandardBridgeCaller) OTHERBRIDGE(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _StandardBridge.contract.Call(opts, &out, "OTHER_BRIDGE")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_StandardBridge *StandardBridgeSession) OTHERBRIDGE() (common.Address, error) {
+	return _StandardBridge.Contract.OTHERBRIDGE(&_StandardBridge.CallOpts)
+}
+
+// OTHERBRIDGE is a free data retrieval call binding the contract method 0x7f46ddb2.
+//
+// Solidity: function OTHER_BRIDGE() view returns(address)
+func (_StandardBridge *StandardBridgeCallerSession) OTHERBRIDGE() (common.Address, error) {
+	return _StandardBridge.Contract.OTHERBRIDGE(&_StandardBridge.CallOpts)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_StandardBridge *StandardBridgeCaller) Deposits(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _StandardBridge.contract.Call(opts, &out, "deposits", arg0, arg1)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_StandardBridge *StandardBridgeSession) Deposits(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _StandardBridge.Contract.Deposits(&_StandardBridge.CallOpts, arg0, arg1)
+}
+
+// Deposits is a free data retrieval call binding the contract method 0x8f601f66.
+//
+// Solidity: function deposits(address , address ) view returns(uint256)
+func (_StandardBridge *StandardBridgeCallerSession) Deposits(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _StandardBridge.Contract.Deposits(&_StandardBridge.CallOpts, arg0, arg1)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_StandardBridge *StandardBridgeCaller) Messenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _StandardBridge.contract.Call(opts, &out, "messenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_StandardBridge *StandardBridgeSession) Messenger() (common.Address, error) {
+	return _StandardBridge.Contract.Messenger(&_StandardBridge.CallOpts)
+}
+
+// Messenger is a free data retrieval call binding the contract method 0x3cb747bf.
+//
+// Solidity: function messenger() view returns(address)
+func (_StandardBridge *StandardBridgeCallerSession) Messenger() (common.Address, error) {
+	return _StandardBridge.Contract.Messenger(&_StandardBridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_StandardBridge *StandardBridgeCaller) OtherBridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _StandardBridge.contract.Call(opts, &out, "otherBridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_StandardBridge *StandardBridgeSession) OtherBridge() (common.Address, error) {
+	return _StandardBridge.Contract.OtherBridge(&_StandardBridge.CallOpts)
+}
+
+// OtherBridge is a free data retrieval call binding the contract method 0xc89701a2.
+//
+// Solidity: function otherBridge() view returns(address)
+func (_StandardBridge *StandardBridgeCallerSession) OtherBridge() (common.Address, error) {
+	return _StandardBridge.Contract.OtherBridge(&_StandardBridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_StandardBridge *StandardBridgeCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _StandardBridge.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_StandardBridge *StandardBridgeSession) Paused() (bool, error) {
+	return _StandardBridge.Contract.Paused(&_StandardBridge.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_StandardBridge *StandardBridgeCallerSession) Paused() (bool, error) {
+	return _StandardBridge.Contract.Paused(&_StandardBridge.CallOpts)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_StandardBridge *StandardBridgeTransactor) BridgeERC20(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.contract.Transact(opts, "bridgeERC20", _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_StandardBridge *StandardBridgeSession) BridgeERC20(_localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.BridgeERC20(&_StandardBridge.TransactOpts, _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20 is a paid mutator transaction binding the contract method 0x87087623.
+//
+// Solidity: function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_StandardBridge *StandardBridgeTransactorSession) BridgeERC20(_localToken common.Address, _remoteToken common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.BridgeERC20(&_StandardBridge.TransactOpts, _localToken, _remoteToken, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_StandardBridge *StandardBridgeTransactor) BridgeERC20To(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.contract.Transact(opts, "bridgeERC20To", _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_StandardBridge *StandardBridgeSession) BridgeERC20To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.BridgeERC20To(&_StandardBridge.TransactOpts, _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeERC20To is a paid mutator transaction binding the contract method 0x540abf73.
+//
+// Solidity: function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) returns()
+func (_StandardBridge *StandardBridgeTransactorSession) BridgeERC20To(_localToken common.Address, _remoteToken common.Address, _to common.Address, _amount *big.Int, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.BridgeERC20To(&_StandardBridge.TransactOpts, _localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_StandardBridge *StandardBridgeTransactor) BridgeETH(opts *bind.TransactOpts, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.contract.Transact(opts, "bridgeETH", _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_StandardBridge *StandardBridgeSession) BridgeETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.BridgeETH(&_StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// BridgeETH is a paid mutator transaction binding the contract method 0x09fc8843.
+//
+// Solidity: function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_StandardBridge *StandardBridgeTransactorSession) BridgeETH(_minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.BridgeETH(&_StandardBridge.TransactOpts, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_StandardBridge *StandardBridgeTransactor) BridgeETHTo(opts *bind.TransactOpts, _to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.contract.Transact(opts, "bridgeETHTo", _to, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_StandardBridge *StandardBridgeSession) BridgeETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.BridgeETHTo(&_StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// BridgeETHTo is a paid mutator transaction binding the contract method 0xe11013dd.
+//
+// Solidity: function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable returns()
+func (_StandardBridge *StandardBridgeTransactorSession) BridgeETHTo(_to common.Address, _minGasLimit uint32, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.BridgeETHTo(&_StandardBridge.TransactOpts, _to, _minGasLimit, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_StandardBridge *StandardBridgeTransactor) FinalizeBridgeERC20(opts *bind.TransactOpts, _localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.contract.Transact(opts, "finalizeBridgeERC20", _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_StandardBridge *StandardBridgeSession) FinalizeBridgeERC20(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.FinalizeBridgeERC20(&_StandardBridge.TransactOpts, _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeERC20 is a paid mutator transaction binding the contract method 0x0166a07a.
+//
+// Solidity: function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData) returns()
+func (_StandardBridge *StandardBridgeTransactorSession) FinalizeBridgeERC20(_localToken common.Address, _remoteToken common.Address, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.FinalizeBridgeERC20(&_StandardBridge.TransactOpts, _localToken, _remoteToken, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_StandardBridge *StandardBridgeTransactor) FinalizeBridgeETH(opts *bind.TransactOpts, _from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.contract.Transact(opts, "finalizeBridgeETH", _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_StandardBridge *StandardBridgeSession) FinalizeBridgeETH(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.FinalizeBridgeETH(&_StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// FinalizeBridgeETH is a paid mutator transaction binding the contract method 0x1635f5fd.
+//
+// Solidity: function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable returns()
+func (_StandardBridge *StandardBridgeTransactorSession) FinalizeBridgeETH(_from common.Address, _to common.Address, _amount *big.Int, _extraData []byte) (*types.Transaction, error) {
+	return _StandardBridge.Contract.FinalizeBridgeETH(&_StandardBridge.TransactOpts, _from, _to, _amount, _extraData)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_StandardBridge *StandardBridgeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _StandardBridge.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_StandardBridge *StandardBridgeSession) Receive() (*types.Transaction, error) {
+	return _StandardBridge.Contract.Receive(&_StandardBridge.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_StandardBridge *StandardBridgeTransactorSession) Receive() (*types.Transaction, error) {
+	return _StandardBridge.Contract.Receive(&_StandardBridge.TransactOpts)
+}
+
+// StandardBridgeERC20BridgeFinalizedIterator is returned from FilterERC20BridgeFinalized and is used to iterate over the raw logs and unpacked data for ERC20BridgeFinalized events raised by the StandardBridge contract.
+type StandardBridgeERC20BridgeFinalizedIterator struct {
+	Event *StandardBridgeERC20BridgeFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *StandardBridgeERC20BridgeFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(StandardBridgeERC20BridgeFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(StandardBridgeERC20BridgeFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *StandardBridgeERC20BridgeFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *StandardBridgeERC20BridgeFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// StandardBridgeERC20BridgeFinalized represents a ERC20BridgeFinalized event raised by the StandardBridge contract.
+type StandardBridgeERC20BridgeFinalized struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	Amount      *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20BridgeFinalized is a free log retrieval operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) FilterERC20BridgeFinalized(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*StandardBridgeERC20BridgeFinalizedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _StandardBridge.contract.FilterLogs(opts, "ERC20BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &StandardBridgeERC20BridgeFinalizedIterator{contract: _StandardBridge.contract, event: "ERC20BridgeFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20BridgeFinalized is a free log subscription operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) WatchERC20BridgeFinalized(opts *bind.WatchOpts, sink chan<- *StandardBridgeERC20BridgeFinalized, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _StandardBridge.contract.WatchLogs(opts, "ERC20BridgeFinalized", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(StandardBridgeERC20BridgeFinalized)
+				if err := _StandardBridge.contract.UnpackLog(event, "ERC20BridgeFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20BridgeFinalized is a log parse operation binding the contract event 0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd.
+//
+// Solidity: event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) ParseERC20BridgeFinalized(log types.Log) (*StandardBridgeERC20BridgeFinalized, error) {
+	event := new(StandardBridgeERC20BridgeFinalized)
+	if err := _StandardBridge.contract.UnpackLog(event, "ERC20BridgeFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// StandardBridgeERC20BridgeInitiatedIterator is returned from FilterERC20BridgeInitiated and is used to iterate over the raw logs and unpacked data for ERC20BridgeInitiated events raised by the StandardBridge contract.
+type StandardBridgeERC20BridgeInitiatedIterator struct {
+	Event *StandardBridgeERC20BridgeInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *StandardBridgeERC20BridgeInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(StandardBridgeERC20BridgeInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(StandardBridgeERC20BridgeInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *StandardBridgeERC20BridgeInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *StandardBridgeERC20BridgeInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// StandardBridgeERC20BridgeInitiated represents a ERC20BridgeInitiated event raised by the StandardBridge contract.
+type StandardBridgeERC20BridgeInitiated struct {
+	LocalToken  common.Address
+	RemoteToken common.Address
+	From        common.Address
+	To          common.Address
+	Amount      *big.Int
+	ExtraData   []byte
+	Raw         types.Log // Blockchain specific contextual infos
+}
+
+// FilterERC20BridgeInitiated is a free log retrieval operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) FilterERC20BridgeInitiated(opts *bind.FilterOpts, localToken []common.Address, remoteToken []common.Address, from []common.Address) (*StandardBridgeERC20BridgeInitiatedIterator, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _StandardBridge.contract.FilterLogs(opts, "ERC20BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return &StandardBridgeERC20BridgeInitiatedIterator{contract: _StandardBridge.contract, event: "ERC20BridgeInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchERC20BridgeInitiated is a free log subscription operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) WatchERC20BridgeInitiated(opts *bind.WatchOpts, sink chan<- *StandardBridgeERC20BridgeInitiated, localToken []common.Address, remoteToken []common.Address, from []common.Address) (event.Subscription, error) {
+
+	var localTokenRule []interface{}
+	for _, localTokenItem := range localToken {
+		localTokenRule = append(localTokenRule, localTokenItem)
+	}
+	var remoteTokenRule []interface{}
+	for _, remoteTokenItem := range remoteToken {
+		remoteTokenRule = append(remoteTokenRule, remoteTokenItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+
+	logs, sub, err := _StandardBridge.contract.WatchLogs(opts, "ERC20BridgeInitiated", localTokenRule, remoteTokenRule, fromRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(StandardBridgeERC20BridgeInitiated)
+				if err := _StandardBridge.contract.UnpackLog(event, "ERC20BridgeInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseERC20BridgeInitiated is a log parse operation binding the contract event 0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf.
+//
+// Solidity: event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) ParseERC20BridgeInitiated(log types.Log) (*StandardBridgeERC20BridgeInitiated, error) {
+	event := new(StandardBridgeERC20BridgeInitiated)
+	if err := _StandardBridge.contract.UnpackLog(event, "ERC20BridgeInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// StandardBridgeETHBridgeFinalizedIterator is returned from FilterETHBridgeFinalized and is used to iterate over the raw logs and unpacked data for ETHBridgeFinalized events raised by the StandardBridge contract.
+type StandardBridgeETHBridgeFinalizedIterator struct {
+	Event *StandardBridgeETHBridgeFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *StandardBridgeETHBridgeFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(StandardBridgeETHBridgeFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(StandardBridgeETHBridgeFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *StandardBridgeETHBridgeFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *StandardBridgeETHBridgeFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// StandardBridgeETHBridgeFinalized represents a ETHBridgeFinalized event raised by the StandardBridge contract.
+type StandardBridgeETHBridgeFinalized struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHBridgeFinalized is a free log retrieval operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) FilterETHBridgeFinalized(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*StandardBridgeETHBridgeFinalizedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _StandardBridge.contract.FilterLogs(opts, "ETHBridgeFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &StandardBridgeETHBridgeFinalizedIterator{contract: _StandardBridge.contract, event: "ETHBridgeFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchETHBridgeFinalized is a free log subscription operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) WatchETHBridgeFinalized(opts *bind.WatchOpts, sink chan<- *StandardBridgeETHBridgeFinalized, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _StandardBridge.contract.WatchLogs(opts, "ETHBridgeFinalized", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(StandardBridgeETHBridgeFinalized)
+				if err := _StandardBridge.contract.UnpackLog(event, "ETHBridgeFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHBridgeFinalized is a log parse operation binding the contract event 0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d.
+//
+// Solidity: event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) ParseETHBridgeFinalized(log types.Log) (*StandardBridgeETHBridgeFinalized, error) {
+	event := new(StandardBridgeETHBridgeFinalized)
+	if err := _StandardBridge.contract.UnpackLog(event, "ETHBridgeFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// StandardBridgeETHBridgeInitiatedIterator is returned from FilterETHBridgeInitiated and is used to iterate over the raw logs and unpacked data for ETHBridgeInitiated events raised by the StandardBridge contract.
+type StandardBridgeETHBridgeInitiatedIterator struct {
+	Event *StandardBridgeETHBridgeInitiated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *StandardBridgeETHBridgeInitiatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(StandardBridgeETHBridgeInitiated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(StandardBridgeETHBridgeInitiated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *StandardBridgeETHBridgeInitiatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *StandardBridgeETHBridgeInitiatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// StandardBridgeETHBridgeInitiated represents a ETHBridgeInitiated event raised by the StandardBridge contract.
+type StandardBridgeETHBridgeInitiated struct {
+	From      common.Address
+	To        common.Address
+	Amount    *big.Int
+	ExtraData []byte
+	Raw       types.Log // Blockchain specific contextual infos
+}
+
+// FilterETHBridgeInitiated is a free log retrieval operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) FilterETHBridgeInitiated(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*StandardBridgeETHBridgeInitiatedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _StandardBridge.contract.FilterLogs(opts, "ETHBridgeInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &StandardBridgeETHBridgeInitiatedIterator{contract: _StandardBridge.contract, event: "ETHBridgeInitiated", logs: logs, sub: sub}, nil
+}
+
+// WatchETHBridgeInitiated is a free log subscription operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) WatchETHBridgeInitiated(opts *bind.WatchOpts, sink chan<- *StandardBridgeETHBridgeInitiated, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _StandardBridge.contract.WatchLogs(opts, "ETHBridgeInitiated", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(StandardBridgeETHBridgeInitiated)
+				if err := _StandardBridge.contract.UnpackLog(event, "ETHBridgeInitiated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseETHBridgeInitiated is a log parse operation binding the contract event 0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5.
+//
+// Solidity: event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)
+func (_StandardBridge *StandardBridgeFilterer) ParseETHBridgeInitiated(log types.Log) (*StandardBridgeETHBridgeInitiated, error) {
+	event := new(StandardBridgeETHBridgeInitiated)
+	if err := _StandardBridge.contract.UnpackLog(event, "ETHBridgeInitiated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// StandardBridgeInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the StandardBridge contract.
+type StandardBridgeInitializedIterator struct {
+	Event *StandardBridgeInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *StandardBridgeInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(StandardBridgeInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(StandardBridgeInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *StandardBridgeInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *StandardBridgeInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// StandardBridgeInitialized represents a Initialized event raised by the StandardBridge contract.
+type StandardBridgeInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_StandardBridge *StandardBridgeFilterer) FilterInitialized(opts *bind.FilterOpts) (*StandardBridgeInitializedIterator, error) {
+
+	logs, sub, err := _StandardBridge.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &StandardBridgeInitializedIterator{contract: _StandardBridge.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_StandardBridge *StandardBridgeFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *StandardBridgeInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _StandardBridge.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(StandardBridgeInitialized)
+				if err := _StandardBridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_StandardBridge *StandardBridgeFilterer) ParseInitialized(log types.Log) (*StandardBridgeInitialized, error) {
+	event := new(StandardBridgeInitialized)
+	if err := _StandardBridge.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-bindings/bindings/storagesetter.go b/op-e2e/bindings/storagesetter.go
similarity index 100%
rename from op-bindings/bindings/storagesetter.go
rename to op-e2e/bindings/storagesetter.go
diff --git a/op-bindings/bindings/superchainconfig.go b/op-e2e/bindings/superchainconfig.go
similarity index 100%
rename from op-bindings/bindings/superchainconfig.go
rename to op-e2e/bindings/superchainconfig.go
diff --git a/op-e2e/bindings/systemconfig.go b/op-e2e/bindings/systemconfig.go
new file mode 100644
index 000000000000..28b7ff6beace
--- /dev/null
+++ b/op-e2e/bindings/systemconfig.go
@@ -0,0 +1,1878 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// ResourceMeteringResourceConfig is an auto generated low-level Go binding around an user-defined struct.
+type ResourceMeteringResourceConfig struct {
+	MaxResourceLimit            uint32
+	ElasticityMultiplier        uint8
+	BaseFeeMaxChangeDenominator uint8
+	MinimumBaseFee              uint32
+	SystemTxMaxGas              uint32
+	MaximumBaseFee              *big.Int
+}
+
+// SystemConfigAddresses is an auto generated low-level Go binding around an user-defined struct.
+type SystemConfigAddresses struct {
+	L1CrossDomainMessenger       common.Address
+	L1ERC721Bridge               common.Address
+	L1StandardBridge             common.Address
+	DisputeGameFactory           common.Address
+	OptimismPortal               common.Address
+	OptimismMintableERC20Factory common.Address
+	GasPayingToken               common.Address
+}
+
+// SystemConfigMetaData contains all meta data concerning the SystemConfig contract.
+var SystemConfigMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BATCH_INBOX_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DISPUTE_GAME_FACTORY_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L1_CROSS_DOMAIN_MESSENGER_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L1_ERC_721_BRIDGE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L1_STANDARD_BRIDGE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OPTIMISM_PORTAL_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"START_BLOCK_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UNSAFE_BLOCK_SIGNER_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"basefeeScalar\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchInbox\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batcherHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blobbasefeeScalar\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disputeGameFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasLimit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasPayingToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasPayingTokenName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasPayingTokenSymbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_basefeeScalar\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_blobbasefeeScalar\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"_batcherHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"_unsafeBlockSigner\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"maxResourceLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"elasticityMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"baseFeeMaxChangeDenominator\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"minimumBaseFee\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"systemTxMaxGas\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"maximumBaseFee\",\"type\":\"uint128\"}],\"internalType\":\"structResourceMetering.ResourceConfig\",\"name\":\"_config\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_batchInbox\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"l1CrossDomainMessenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l1ERC721Bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l1StandardBridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"disputeGameFactory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"optimismPortal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"optimismMintableERC20Factory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"gasPayingToken\",\"type\":\"address\"}],\"internalType\":\"structSystemConfig.Addresses\",\"name\":\"_addresses\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isCustomGasToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1CrossDomainMessenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1ERC721Bridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StandardBridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maximumGasLimit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minimumGasLimit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"optimismMintableERC20Factory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"optimismPortal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"overhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resourceConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"maxResourceLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"elasticityMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"baseFeeMaxChangeDenominator\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"minimumBaseFee\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"systemTxMaxGas\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"maximumBaseFee\",\"type\":\"uint128\"}],\"internalType\":\"structResourceMetering.ResourceConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"scalar\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_batcherHash\",\"type\":\"bytes32\"}],\"name\":\"setBatcherHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_overhead\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_scalar\",\"type\":\"uint256\"}],\"name\":\"setGasConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_basefeeScalar\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_blobbasefeeScalar\",\"type\":\"uint32\"}],\"name\":\"setGasConfigEcotone\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"}],\"name\":\"setGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_unsafeBlockSigner\",\"type\":\"address\"}],\"name\":\"setUnsafeBlockSigner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startBlock_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unsafeBlockSigner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enumSystemConfig.UpdateType\",\"name\":\"updateType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ConfigUpdate\",\"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\":\"OwnershipTransferred\",\"type\":\"event\"}]",
+}
+
+// SystemConfigABI is the input ABI used to generate the binding from.
+// Deprecated: Use SystemConfigMetaData.ABI instead.
+var SystemConfigABI = SystemConfigMetaData.ABI
+
+// SystemConfig is an auto generated Go binding around an Ethereum contract.
+type SystemConfig struct {
+	SystemConfigCaller     // Read-only binding to the contract
+	SystemConfigTransactor // Write-only binding to the contract
+	SystemConfigFilterer   // Log filterer for contract events
+}
+
+// SystemConfigCaller is an auto generated read-only Go binding around an Ethereum contract.
+type SystemConfigCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SystemConfigTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type SystemConfigTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SystemConfigFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type SystemConfigFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SystemConfigSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type SystemConfigSession struct {
+	Contract     *SystemConfig     // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// SystemConfigCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type SystemConfigCallerSession struct {
+	Contract *SystemConfigCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts       // Call options to use throughout this session
+}
+
+// SystemConfigTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type SystemConfigTransactorSession struct {
+	Contract     *SystemConfigTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
+}
+
+// SystemConfigRaw is an auto generated low-level Go binding around an Ethereum contract.
+type SystemConfigRaw struct {
+	Contract *SystemConfig // Generic contract binding to access the raw methods on
+}
+
+// SystemConfigCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type SystemConfigCallerRaw struct {
+	Contract *SystemConfigCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// SystemConfigTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type SystemConfigTransactorRaw struct {
+	Contract *SystemConfigTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewSystemConfig creates a new instance of SystemConfig, bound to a specific deployed contract.
+func NewSystemConfig(address common.Address, backend bind.ContractBackend) (*SystemConfig, error) {
+	contract, err := bindSystemConfig(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &SystemConfig{SystemConfigCaller: SystemConfigCaller{contract: contract}, SystemConfigTransactor: SystemConfigTransactor{contract: contract}, SystemConfigFilterer: SystemConfigFilterer{contract: contract}}, nil
+}
+
+// NewSystemConfigCaller creates a new read-only instance of SystemConfig, bound to a specific deployed contract.
+func NewSystemConfigCaller(address common.Address, caller bind.ContractCaller) (*SystemConfigCaller, error) {
+	contract, err := bindSystemConfig(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &SystemConfigCaller{contract: contract}, nil
+}
+
+// NewSystemConfigTransactor creates a new write-only instance of SystemConfig, bound to a specific deployed contract.
+func NewSystemConfigTransactor(address common.Address, transactor bind.ContractTransactor) (*SystemConfigTransactor, error) {
+	contract, err := bindSystemConfig(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &SystemConfigTransactor{contract: contract}, nil
+}
+
+// NewSystemConfigFilterer creates a new log filterer instance of SystemConfig, bound to a specific deployed contract.
+func NewSystemConfigFilterer(address common.Address, filterer bind.ContractFilterer) (*SystemConfigFilterer, error) {
+	contract, err := bindSystemConfig(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &SystemConfigFilterer{contract: contract}, nil
+}
+
+// bindSystemConfig binds a generic wrapper to an already deployed contract.
+func bindSystemConfig(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(SystemConfigABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_SystemConfig *SystemConfigRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _SystemConfig.Contract.SystemConfigCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_SystemConfig *SystemConfigRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SystemConfigTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SystemConfig *SystemConfigRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SystemConfigTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_SystemConfig *SystemConfigCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _SystemConfig.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_SystemConfig *SystemConfigTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _SystemConfig.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SystemConfig *SystemConfigTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _SystemConfig.Contract.contract.Transact(opts, method, params...)
+}
+
+// BATCHINBOXSLOT is a free data retrieval call binding the contract method 0xbc49ce5f.
+//
+// Solidity: function BATCH_INBOX_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCaller) BATCHINBOXSLOT(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "BATCH_INBOX_SLOT")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// BATCHINBOXSLOT is a free data retrieval call binding the contract method 0xbc49ce5f.
+//
+// Solidity: function BATCH_INBOX_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigSession) BATCHINBOXSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.BATCHINBOXSLOT(&_SystemConfig.CallOpts)
+}
+
+// BATCHINBOXSLOT is a free data retrieval call binding the contract method 0xbc49ce5f.
+//
+// Solidity: function BATCH_INBOX_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCallerSession) BATCHINBOXSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.BATCHINBOXSLOT(&_SystemConfig.CallOpts)
+}
+
+// DISPUTEGAMEFACTORYSLOT is a free data retrieval call binding the contract method 0xe2a3285c.
+//
+// Solidity: function DISPUTE_GAME_FACTORY_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCaller) DISPUTEGAMEFACTORYSLOT(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "DISPUTE_GAME_FACTORY_SLOT")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// DISPUTEGAMEFACTORYSLOT is a free data retrieval call binding the contract method 0xe2a3285c.
+//
+// Solidity: function DISPUTE_GAME_FACTORY_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigSession) DISPUTEGAMEFACTORYSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.DISPUTEGAMEFACTORYSLOT(&_SystemConfig.CallOpts)
+}
+
+// DISPUTEGAMEFACTORYSLOT is a free data retrieval call binding the contract method 0xe2a3285c.
+//
+// Solidity: function DISPUTE_GAME_FACTORY_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCallerSession) DISPUTEGAMEFACTORYSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.DISPUTEGAMEFACTORYSLOT(&_SystemConfig.CallOpts)
+}
+
+// L1CROSSDOMAINMESSENGERSLOT is a free data retrieval call binding the contract method 0x5d73369c.
+//
+// Solidity: function L1_CROSS_DOMAIN_MESSENGER_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCaller) L1CROSSDOMAINMESSENGERSLOT(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "L1_CROSS_DOMAIN_MESSENGER_SLOT")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// L1CROSSDOMAINMESSENGERSLOT is a free data retrieval call binding the contract method 0x5d73369c.
+//
+// Solidity: function L1_CROSS_DOMAIN_MESSENGER_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigSession) L1CROSSDOMAINMESSENGERSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.L1CROSSDOMAINMESSENGERSLOT(&_SystemConfig.CallOpts)
+}
+
+// L1CROSSDOMAINMESSENGERSLOT is a free data retrieval call binding the contract method 0x5d73369c.
+//
+// Solidity: function L1_CROSS_DOMAIN_MESSENGER_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCallerSession) L1CROSSDOMAINMESSENGERSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.L1CROSSDOMAINMESSENGERSLOT(&_SystemConfig.CallOpts)
+}
+
+// L1ERC721BRIDGESLOT is a free data retrieval call binding the contract method 0x19f5cea8.
+//
+// Solidity: function L1_ERC_721_BRIDGE_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCaller) L1ERC721BRIDGESLOT(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "L1_ERC_721_BRIDGE_SLOT")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// L1ERC721BRIDGESLOT is a free data retrieval call binding the contract method 0x19f5cea8.
+//
+// Solidity: function L1_ERC_721_BRIDGE_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigSession) L1ERC721BRIDGESLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.L1ERC721BRIDGESLOT(&_SystemConfig.CallOpts)
+}
+
+// L1ERC721BRIDGESLOT is a free data retrieval call binding the contract method 0x19f5cea8.
+//
+// Solidity: function L1_ERC_721_BRIDGE_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCallerSession) L1ERC721BRIDGESLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.L1ERC721BRIDGESLOT(&_SystemConfig.CallOpts)
+}
+
+// L1STANDARDBRIDGESLOT is a free data retrieval call binding the contract method 0xf8c68de0.
+//
+// Solidity: function L1_STANDARD_BRIDGE_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCaller) L1STANDARDBRIDGESLOT(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "L1_STANDARD_BRIDGE_SLOT")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// L1STANDARDBRIDGESLOT is a free data retrieval call binding the contract method 0xf8c68de0.
+//
+// Solidity: function L1_STANDARD_BRIDGE_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigSession) L1STANDARDBRIDGESLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.L1STANDARDBRIDGESLOT(&_SystemConfig.CallOpts)
+}
+
+// L1STANDARDBRIDGESLOT is a free data retrieval call binding the contract method 0xf8c68de0.
+//
+// Solidity: function L1_STANDARD_BRIDGE_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCallerSession) L1STANDARDBRIDGESLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.L1STANDARDBRIDGESLOT(&_SystemConfig.CallOpts)
+}
+
+// OPTIMISMMINTABLEERC20FACTORYSLOT is a free data retrieval call binding the contract method 0x06c92657.
+//
+// Solidity: function OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCaller) OPTIMISMMINTABLEERC20FACTORYSLOT(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// OPTIMISMMINTABLEERC20FACTORYSLOT is a free data retrieval call binding the contract method 0x06c92657.
+//
+// Solidity: function OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigSession) OPTIMISMMINTABLEERC20FACTORYSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.OPTIMISMMINTABLEERC20FACTORYSLOT(&_SystemConfig.CallOpts)
+}
+
+// OPTIMISMMINTABLEERC20FACTORYSLOT is a free data retrieval call binding the contract method 0x06c92657.
+//
+// Solidity: function OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCallerSession) OPTIMISMMINTABLEERC20FACTORYSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.OPTIMISMMINTABLEERC20FACTORYSLOT(&_SystemConfig.CallOpts)
+}
+
+// OPTIMISMPORTALSLOT is a free data retrieval call binding the contract method 0xfd32aa0f.
+//
+// Solidity: function OPTIMISM_PORTAL_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCaller) OPTIMISMPORTALSLOT(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "OPTIMISM_PORTAL_SLOT")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// OPTIMISMPORTALSLOT is a free data retrieval call binding the contract method 0xfd32aa0f.
+//
+// Solidity: function OPTIMISM_PORTAL_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigSession) OPTIMISMPORTALSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.OPTIMISMPORTALSLOT(&_SystemConfig.CallOpts)
+}
+
+// OPTIMISMPORTALSLOT is a free data retrieval call binding the contract method 0xfd32aa0f.
+//
+// Solidity: function OPTIMISM_PORTAL_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCallerSession) OPTIMISMPORTALSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.OPTIMISMPORTALSLOT(&_SystemConfig.CallOpts)
+}
+
+// STARTBLOCKSLOT is a free data retrieval call binding the contract method 0xe0e2016d.
+//
+// Solidity: function START_BLOCK_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCaller) STARTBLOCKSLOT(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "START_BLOCK_SLOT")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// STARTBLOCKSLOT is a free data retrieval call binding the contract method 0xe0e2016d.
+//
+// Solidity: function START_BLOCK_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigSession) STARTBLOCKSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.STARTBLOCKSLOT(&_SystemConfig.CallOpts)
+}
+
+// STARTBLOCKSLOT is a free data retrieval call binding the contract method 0xe0e2016d.
+//
+// Solidity: function START_BLOCK_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCallerSession) STARTBLOCKSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.STARTBLOCKSLOT(&_SystemConfig.CallOpts)
+}
+
+// UNSAFEBLOCKSIGNERSLOT is a free data retrieval call binding the contract method 0x4f16540b.
+//
+// Solidity: function UNSAFE_BLOCK_SIGNER_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCaller) UNSAFEBLOCKSIGNERSLOT(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "UNSAFE_BLOCK_SIGNER_SLOT")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// UNSAFEBLOCKSIGNERSLOT is a free data retrieval call binding the contract method 0x4f16540b.
+//
+// Solidity: function UNSAFE_BLOCK_SIGNER_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigSession) UNSAFEBLOCKSIGNERSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.UNSAFEBLOCKSIGNERSLOT(&_SystemConfig.CallOpts)
+}
+
+// UNSAFEBLOCKSIGNERSLOT is a free data retrieval call binding the contract method 0x4f16540b.
+//
+// Solidity: function UNSAFE_BLOCK_SIGNER_SLOT() view returns(bytes32)
+func (_SystemConfig *SystemConfigCallerSession) UNSAFEBLOCKSIGNERSLOT() ([32]byte, error) {
+	return _SystemConfig.Contract.UNSAFEBLOCKSIGNERSLOT(&_SystemConfig.CallOpts)
+}
+
+// VERSION is a free data retrieval call binding the contract method 0xffa1ad74.
+//
+// Solidity: function VERSION() view returns(uint256)
+func (_SystemConfig *SystemConfigCaller) VERSION(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "VERSION")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// VERSION is a free data retrieval call binding the contract method 0xffa1ad74.
+//
+// Solidity: function VERSION() view returns(uint256)
+func (_SystemConfig *SystemConfigSession) VERSION() (*big.Int, error) {
+	return _SystemConfig.Contract.VERSION(&_SystemConfig.CallOpts)
+}
+
+// VERSION is a free data retrieval call binding the contract method 0xffa1ad74.
+//
+// Solidity: function VERSION() view returns(uint256)
+func (_SystemConfig *SystemConfigCallerSession) VERSION() (*big.Int, error) {
+	return _SystemConfig.Contract.VERSION(&_SystemConfig.CallOpts)
+}
+
+// BasefeeScalar is a free data retrieval call binding the contract method 0xbfb14fb7.
+//
+// Solidity: function basefeeScalar() view returns(uint32)
+func (_SystemConfig *SystemConfigCaller) BasefeeScalar(opts *bind.CallOpts) (uint32, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "basefeeScalar")
+
+	if err != nil {
+		return *new(uint32), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+	return out0, err
+
+}
+
+// BasefeeScalar is a free data retrieval call binding the contract method 0xbfb14fb7.
+//
+// Solidity: function basefeeScalar() view returns(uint32)
+func (_SystemConfig *SystemConfigSession) BasefeeScalar() (uint32, error) {
+	return _SystemConfig.Contract.BasefeeScalar(&_SystemConfig.CallOpts)
+}
+
+// BasefeeScalar is a free data retrieval call binding the contract method 0xbfb14fb7.
+//
+// Solidity: function basefeeScalar() view returns(uint32)
+func (_SystemConfig *SystemConfigCallerSession) BasefeeScalar() (uint32, error) {
+	return _SystemConfig.Contract.BasefeeScalar(&_SystemConfig.CallOpts)
+}
+
+// BatchInbox is a free data retrieval call binding the contract method 0xdac6e63a.
+//
+// Solidity: function batchInbox() view returns(address addr_)
+func (_SystemConfig *SystemConfigCaller) BatchInbox(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "batchInbox")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// BatchInbox is a free data retrieval call binding the contract method 0xdac6e63a.
+//
+// Solidity: function batchInbox() view returns(address addr_)
+func (_SystemConfig *SystemConfigSession) BatchInbox() (common.Address, error) {
+	return _SystemConfig.Contract.BatchInbox(&_SystemConfig.CallOpts)
+}
+
+// BatchInbox is a free data retrieval call binding the contract method 0xdac6e63a.
+//
+// Solidity: function batchInbox() view returns(address addr_)
+func (_SystemConfig *SystemConfigCallerSession) BatchInbox() (common.Address, error) {
+	return _SystemConfig.Contract.BatchInbox(&_SystemConfig.CallOpts)
+}
+
+// BatcherHash is a free data retrieval call binding the contract method 0xe81b2c6d.
+//
+// Solidity: function batcherHash() view returns(bytes32)
+func (_SystemConfig *SystemConfigCaller) BatcherHash(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "batcherHash")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// BatcherHash is a free data retrieval call binding the contract method 0xe81b2c6d.
+//
+// Solidity: function batcherHash() view returns(bytes32)
+func (_SystemConfig *SystemConfigSession) BatcherHash() ([32]byte, error) {
+	return _SystemConfig.Contract.BatcherHash(&_SystemConfig.CallOpts)
+}
+
+// BatcherHash is a free data retrieval call binding the contract method 0xe81b2c6d.
+//
+// Solidity: function batcherHash() view returns(bytes32)
+func (_SystemConfig *SystemConfigCallerSession) BatcherHash() ([32]byte, error) {
+	return _SystemConfig.Contract.BatcherHash(&_SystemConfig.CallOpts)
+}
+
+// BlobbasefeeScalar is a free data retrieval call binding the contract method 0xec707517.
+//
+// Solidity: function blobbasefeeScalar() view returns(uint32)
+func (_SystemConfig *SystemConfigCaller) BlobbasefeeScalar(opts *bind.CallOpts) (uint32, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "blobbasefeeScalar")
+
+	if err != nil {
+		return *new(uint32), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+	return out0, err
+
+}
+
+// BlobbasefeeScalar is a free data retrieval call binding the contract method 0xec707517.
+//
+// Solidity: function blobbasefeeScalar() view returns(uint32)
+func (_SystemConfig *SystemConfigSession) BlobbasefeeScalar() (uint32, error) {
+	return _SystemConfig.Contract.BlobbasefeeScalar(&_SystemConfig.CallOpts)
+}
+
+// BlobbasefeeScalar is a free data retrieval call binding the contract method 0xec707517.
+//
+// Solidity: function blobbasefeeScalar() view returns(uint32)
+func (_SystemConfig *SystemConfigCallerSession) BlobbasefeeScalar() (uint32, error) {
+	return _SystemConfig.Contract.BlobbasefeeScalar(&_SystemConfig.CallOpts)
+}
+
+// DisputeGameFactory is a free data retrieval call binding the contract method 0xf2b4e617.
+//
+// Solidity: function disputeGameFactory() view returns(address addr_)
+func (_SystemConfig *SystemConfigCaller) DisputeGameFactory(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "disputeGameFactory")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// DisputeGameFactory is a free data retrieval call binding the contract method 0xf2b4e617.
+//
+// Solidity: function disputeGameFactory() view returns(address addr_)
+func (_SystemConfig *SystemConfigSession) DisputeGameFactory() (common.Address, error) {
+	return _SystemConfig.Contract.DisputeGameFactory(&_SystemConfig.CallOpts)
+}
+
+// DisputeGameFactory is a free data retrieval call binding the contract method 0xf2b4e617.
+//
+// Solidity: function disputeGameFactory() view returns(address addr_)
+func (_SystemConfig *SystemConfigCallerSession) DisputeGameFactory() (common.Address, error) {
+	return _SystemConfig.Contract.DisputeGameFactory(&_SystemConfig.CallOpts)
+}
+
+// GasLimit is a free data retrieval call binding the contract method 0xf68016b7.
+//
+// Solidity: function gasLimit() view returns(uint64)
+func (_SystemConfig *SystemConfigCaller) GasLimit(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "gasLimit")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// GasLimit is a free data retrieval call binding the contract method 0xf68016b7.
+//
+// Solidity: function gasLimit() view returns(uint64)
+func (_SystemConfig *SystemConfigSession) GasLimit() (uint64, error) {
+	return _SystemConfig.Contract.GasLimit(&_SystemConfig.CallOpts)
+}
+
+// GasLimit is a free data retrieval call binding the contract method 0xf68016b7.
+//
+// Solidity: function gasLimit() view returns(uint64)
+func (_SystemConfig *SystemConfigCallerSession) GasLimit() (uint64, error) {
+	return _SystemConfig.Contract.GasLimit(&_SystemConfig.CallOpts)
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_SystemConfig *SystemConfigCaller) GasPayingToken(opts *bind.CallOpts) (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "gasPayingToken")
+
+	outstruct := new(struct {
+		Addr     common.Address
+		Decimals uint8
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.Addr = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+	outstruct.Decimals = *abi.ConvertType(out[1], new(uint8)).(*uint8)
+
+	return *outstruct, err
+
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_SystemConfig *SystemConfigSession) GasPayingToken() (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	return _SystemConfig.Contract.GasPayingToken(&_SystemConfig.CallOpts)
+}
+
+// GasPayingToken is a free data retrieval call binding the contract method 0x4397dfef.
+//
+// Solidity: function gasPayingToken() view returns(address addr_, uint8 decimals_)
+func (_SystemConfig *SystemConfigCallerSession) GasPayingToken() (struct {
+	Addr     common.Address
+	Decimals uint8
+}, error) {
+	return _SystemConfig.Contract.GasPayingToken(&_SystemConfig.CallOpts)
+}
+
+// GasPayingTokenName is a free data retrieval call binding the contract method 0xd8444715.
+//
+// Solidity: function gasPayingTokenName() view returns(string name_)
+func (_SystemConfig *SystemConfigCaller) GasPayingTokenName(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "gasPayingTokenName")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// GasPayingTokenName is a free data retrieval call binding the contract method 0xd8444715.
+//
+// Solidity: function gasPayingTokenName() view returns(string name_)
+func (_SystemConfig *SystemConfigSession) GasPayingTokenName() (string, error) {
+	return _SystemConfig.Contract.GasPayingTokenName(&_SystemConfig.CallOpts)
+}
+
+// GasPayingTokenName is a free data retrieval call binding the contract method 0xd8444715.
+//
+// Solidity: function gasPayingTokenName() view returns(string name_)
+func (_SystemConfig *SystemConfigCallerSession) GasPayingTokenName() (string, error) {
+	return _SystemConfig.Contract.GasPayingTokenName(&_SystemConfig.CallOpts)
+}
+
+// GasPayingTokenSymbol is a free data retrieval call binding the contract method 0x550fcdc9.
+//
+// Solidity: function gasPayingTokenSymbol() view returns(string symbol_)
+func (_SystemConfig *SystemConfigCaller) GasPayingTokenSymbol(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "gasPayingTokenSymbol")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// GasPayingTokenSymbol is a free data retrieval call binding the contract method 0x550fcdc9.
+//
+// Solidity: function gasPayingTokenSymbol() view returns(string symbol_)
+func (_SystemConfig *SystemConfigSession) GasPayingTokenSymbol() (string, error) {
+	return _SystemConfig.Contract.GasPayingTokenSymbol(&_SystemConfig.CallOpts)
+}
+
+// GasPayingTokenSymbol is a free data retrieval call binding the contract method 0x550fcdc9.
+//
+// Solidity: function gasPayingTokenSymbol() view returns(string symbol_)
+func (_SystemConfig *SystemConfigCallerSession) GasPayingTokenSymbol() (string, error) {
+	return _SystemConfig.Contract.GasPayingTokenSymbol(&_SystemConfig.CallOpts)
+}
+
+// IsCustomGasToken is a free data retrieval call binding the contract method 0x21326849.
+//
+// Solidity: function isCustomGasToken() view returns(bool)
+func (_SystemConfig *SystemConfigCaller) IsCustomGasToken(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "isCustomGasToken")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// IsCustomGasToken is a free data retrieval call binding the contract method 0x21326849.
+//
+// Solidity: function isCustomGasToken() view returns(bool)
+func (_SystemConfig *SystemConfigSession) IsCustomGasToken() (bool, error) {
+	return _SystemConfig.Contract.IsCustomGasToken(&_SystemConfig.CallOpts)
+}
+
+// IsCustomGasToken is a free data retrieval call binding the contract method 0x21326849.
+//
+// Solidity: function isCustomGasToken() view returns(bool)
+func (_SystemConfig *SystemConfigCallerSession) IsCustomGasToken() (bool, error) {
+	return _SystemConfig.Contract.IsCustomGasToken(&_SystemConfig.CallOpts)
+}
+
+// L1CrossDomainMessenger is a free data retrieval call binding the contract method 0xa7119869.
+//
+// Solidity: function l1CrossDomainMessenger() view returns(address addr_)
+func (_SystemConfig *SystemConfigCaller) L1CrossDomainMessenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "l1CrossDomainMessenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L1CrossDomainMessenger is a free data retrieval call binding the contract method 0xa7119869.
+//
+// Solidity: function l1CrossDomainMessenger() view returns(address addr_)
+func (_SystemConfig *SystemConfigSession) L1CrossDomainMessenger() (common.Address, error) {
+	return _SystemConfig.Contract.L1CrossDomainMessenger(&_SystemConfig.CallOpts)
+}
+
+// L1CrossDomainMessenger is a free data retrieval call binding the contract method 0xa7119869.
+//
+// Solidity: function l1CrossDomainMessenger() view returns(address addr_)
+func (_SystemConfig *SystemConfigCallerSession) L1CrossDomainMessenger() (common.Address, error) {
+	return _SystemConfig.Contract.L1CrossDomainMessenger(&_SystemConfig.CallOpts)
+}
+
+// L1ERC721Bridge is a free data retrieval call binding the contract method 0xc4e8ddfa.
+//
+// Solidity: function l1ERC721Bridge() view returns(address addr_)
+func (_SystemConfig *SystemConfigCaller) L1ERC721Bridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "l1ERC721Bridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L1ERC721Bridge is a free data retrieval call binding the contract method 0xc4e8ddfa.
+//
+// Solidity: function l1ERC721Bridge() view returns(address addr_)
+func (_SystemConfig *SystemConfigSession) L1ERC721Bridge() (common.Address, error) {
+	return _SystemConfig.Contract.L1ERC721Bridge(&_SystemConfig.CallOpts)
+}
+
+// L1ERC721Bridge is a free data retrieval call binding the contract method 0xc4e8ddfa.
+//
+// Solidity: function l1ERC721Bridge() view returns(address addr_)
+func (_SystemConfig *SystemConfigCallerSession) L1ERC721Bridge() (common.Address, error) {
+	return _SystemConfig.Contract.L1ERC721Bridge(&_SystemConfig.CallOpts)
+}
+
+// L1StandardBridge is a free data retrieval call binding the contract method 0x078f29cf.
+//
+// Solidity: function l1StandardBridge() view returns(address addr_)
+func (_SystemConfig *SystemConfigCaller) L1StandardBridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "l1StandardBridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L1StandardBridge is a free data retrieval call binding the contract method 0x078f29cf.
+//
+// Solidity: function l1StandardBridge() view returns(address addr_)
+func (_SystemConfig *SystemConfigSession) L1StandardBridge() (common.Address, error) {
+	return _SystemConfig.Contract.L1StandardBridge(&_SystemConfig.CallOpts)
+}
+
+// L1StandardBridge is a free data retrieval call binding the contract method 0x078f29cf.
+//
+// Solidity: function l1StandardBridge() view returns(address addr_)
+func (_SystemConfig *SystemConfigCallerSession) L1StandardBridge() (common.Address, error) {
+	return _SystemConfig.Contract.L1StandardBridge(&_SystemConfig.CallOpts)
+}
+
+// MaximumGasLimit is a free data retrieval call binding the contract method 0x0ae14b1b.
+//
+// Solidity: function maximumGasLimit() pure returns(uint64)
+func (_SystemConfig *SystemConfigCaller) MaximumGasLimit(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "maximumGasLimit")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MaximumGasLimit is a free data retrieval call binding the contract method 0x0ae14b1b.
+//
+// Solidity: function maximumGasLimit() pure returns(uint64)
+func (_SystemConfig *SystemConfigSession) MaximumGasLimit() (uint64, error) {
+	return _SystemConfig.Contract.MaximumGasLimit(&_SystemConfig.CallOpts)
+}
+
+// MaximumGasLimit is a free data retrieval call binding the contract method 0x0ae14b1b.
+//
+// Solidity: function maximumGasLimit() pure returns(uint64)
+func (_SystemConfig *SystemConfigCallerSession) MaximumGasLimit() (uint64, error) {
+	return _SystemConfig.Contract.MaximumGasLimit(&_SystemConfig.CallOpts)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0x4add321d.
+//
+// Solidity: function minimumGasLimit() view returns(uint64)
+func (_SystemConfig *SystemConfigCaller) MinimumGasLimit(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "minimumGasLimit")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0x4add321d.
+//
+// Solidity: function minimumGasLimit() view returns(uint64)
+func (_SystemConfig *SystemConfigSession) MinimumGasLimit() (uint64, error) {
+	return _SystemConfig.Contract.MinimumGasLimit(&_SystemConfig.CallOpts)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0x4add321d.
+//
+// Solidity: function minimumGasLimit() view returns(uint64)
+func (_SystemConfig *SystemConfigCallerSession) MinimumGasLimit() (uint64, error) {
+	return _SystemConfig.Contract.MinimumGasLimit(&_SystemConfig.CallOpts)
+}
+
+// OptimismMintableERC20Factory is a free data retrieval call binding the contract method 0x9b7d7f0a.
+//
+// Solidity: function optimismMintableERC20Factory() view returns(address addr_)
+func (_SystemConfig *SystemConfigCaller) OptimismMintableERC20Factory(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "optimismMintableERC20Factory")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OptimismMintableERC20Factory is a free data retrieval call binding the contract method 0x9b7d7f0a.
+//
+// Solidity: function optimismMintableERC20Factory() view returns(address addr_)
+func (_SystemConfig *SystemConfigSession) OptimismMintableERC20Factory() (common.Address, error) {
+	return _SystemConfig.Contract.OptimismMintableERC20Factory(&_SystemConfig.CallOpts)
+}
+
+// OptimismMintableERC20Factory is a free data retrieval call binding the contract method 0x9b7d7f0a.
+//
+// Solidity: function optimismMintableERC20Factory() view returns(address addr_)
+func (_SystemConfig *SystemConfigCallerSession) OptimismMintableERC20Factory() (common.Address, error) {
+	return _SystemConfig.Contract.OptimismMintableERC20Factory(&_SystemConfig.CallOpts)
+}
+
+// OptimismPortal is a free data retrieval call binding the contract method 0x0a49cb03.
+//
+// Solidity: function optimismPortal() view returns(address addr_)
+func (_SystemConfig *SystemConfigCaller) OptimismPortal(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "optimismPortal")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// OptimismPortal is a free data retrieval call binding the contract method 0x0a49cb03.
+//
+// Solidity: function optimismPortal() view returns(address addr_)
+func (_SystemConfig *SystemConfigSession) OptimismPortal() (common.Address, error) {
+	return _SystemConfig.Contract.OptimismPortal(&_SystemConfig.CallOpts)
+}
+
+// OptimismPortal is a free data retrieval call binding the contract method 0x0a49cb03.
+//
+// Solidity: function optimismPortal() view returns(address addr_)
+func (_SystemConfig *SystemConfigCallerSession) OptimismPortal() (common.Address, error) {
+	return _SystemConfig.Contract.OptimismPortal(&_SystemConfig.CallOpts)
+}
+
+// Overhead is a free data retrieval call binding the contract method 0x0c18c162.
+//
+// Solidity: function overhead() view returns(uint256)
+func (_SystemConfig *SystemConfigCaller) Overhead(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "overhead")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Overhead is a free data retrieval call binding the contract method 0x0c18c162.
+//
+// Solidity: function overhead() view returns(uint256)
+func (_SystemConfig *SystemConfigSession) Overhead() (*big.Int, error) {
+	return _SystemConfig.Contract.Overhead(&_SystemConfig.CallOpts)
+}
+
+// Overhead is a free data retrieval call binding the contract method 0x0c18c162.
+//
+// Solidity: function overhead() view returns(uint256)
+func (_SystemConfig *SystemConfigCallerSession) Overhead() (*big.Int, error) {
+	return _SystemConfig.Contract.Overhead(&_SystemConfig.CallOpts)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_SystemConfig *SystemConfigCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "owner")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_SystemConfig *SystemConfigSession) Owner() (common.Address, error) {
+	return _SystemConfig.Contract.Owner(&_SystemConfig.CallOpts)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_SystemConfig *SystemConfigCallerSession) Owner() (common.Address, error) {
+	return _SystemConfig.Contract.Owner(&_SystemConfig.CallOpts)
+}
+
+// ResourceConfig is a free data retrieval call binding the contract method 0xcc731b02.
+//
+// Solidity: function resourceConfig() view returns((uint32,uint8,uint8,uint32,uint32,uint128))
+func (_SystemConfig *SystemConfigCaller) ResourceConfig(opts *bind.CallOpts) (ResourceMeteringResourceConfig, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "resourceConfig")
+
+	if err != nil {
+		return *new(ResourceMeteringResourceConfig), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(ResourceMeteringResourceConfig)).(*ResourceMeteringResourceConfig)
+
+	return out0, err
+
+}
+
+// ResourceConfig is a free data retrieval call binding the contract method 0xcc731b02.
+//
+// Solidity: function resourceConfig() view returns((uint32,uint8,uint8,uint32,uint32,uint128))
+func (_SystemConfig *SystemConfigSession) ResourceConfig() (ResourceMeteringResourceConfig, error) {
+	return _SystemConfig.Contract.ResourceConfig(&_SystemConfig.CallOpts)
+}
+
+// ResourceConfig is a free data retrieval call binding the contract method 0xcc731b02.
+//
+// Solidity: function resourceConfig() view returns((uint32,uint8,uint8,uint32,uint32,uint128))
+func (_SystemConfig *SystemConfigCallerSession) ResourceConfig() (ResourceMeteringResourceConfig, error) {
+	return _SystemConfig.Contract.ResourceConfig(&_SystemConfig.CallOpts)
+}
+
+// Scalar is a free data retrieval call binding the contract method 0xf45e65d8.
+//
+// Solidity: function scalar() view returns(uint256)
+func (_SystemConfig *SystemConfigCaller) Scalar(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "scalar")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Scalar is a free data retrieval call binding the contract method 0xf45e65d8.
+//
+// Solidity: function scalar() view returns(uint256)
+func (_SystemConfig *SystemConfigSession) Scalar() (*big.Int, error) {
+	return _SystemConfig.Contract.Scalar(&_SystemConfig.CallOpts)
+}
+
+// Scalar is a free data retrieval call binding the contract method 0xf45e65d8.
+//
+// Solidity: function scalar() view returns(uint256)
+func (_SystemConfig *SystemConfigCallerSession) Scalar() (*big.Int, error) {
+	return _SystemConfig.Contract.Scalar(&_SystemConfig.CallOpts)
+}
+
+// StartBlock is a free data retrieval call binding the contract method 0x48cd4cb1.
+//
+// Solidity: function startBlock() view returns(uint256 startBlock_)
+func (_SystemConfig *SystemConfigCaller) StartBlock(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "startBlock")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// StartBlock is a free data retrieval call binding the contract method 0x48cd4cb1.
+//
+// Solidity: function startBlock() view returns(uint256 startBlock_)
+func (_SystemConfig *SystemConfigSession) StartBlock() (*big.Int, error) {
+	return _SystemConfig.Contract.StartBlock(&_SystemConfig.CallOpts)
+}
+
+// StartBlock is a free data retrieval call binding the contract method 0x48cd4cb1.
+//
+// Solidity: function startBlock() view returns(uint256 startBlock_)
+func (_SystemConfig *SystemConfigCallerSession) StartBlock() (*big.Int, error) {
+	return _SystemConfig.Contract.StartBlock(&_SystemConfig.CallOpts)
+}
+
+// UnsafeBlockSigner is a free data retrieval call binding the contract method 0x1fd19ee1.
+//
+// Solidity: function unsafeBlockSigner() view returns(address addr_)
+func (_SystemConfig *SystemConfigCaller) UnsafeBlockSigner(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "unsafeBlockSigner")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// UnsafeBlockSigner is a free data retrieval call binding the contract method 0x1fd19ee1.
+//
+// Solidity: function unsafeBlockSigner() view returns(address addr_)
+func (_SystemConfig *SystemConfigSession) UnsafeBlockSigner() (common.Address, error) {
+	return _SystemConfig.Contract.UnsafeBlockSigner(&_SystemConfig.CallOpts)
+}
+
+// UnsafeBlockSigner is a free data retrieval call binding the contract method 0x1fd19ee1.
+//
+// Solidity: function unsafeBlockSigner() view returns(address addr_)
+func (_SystemConfig *SystemConfigCallerSession) UnsafeBlockSigner() (common.Address, error) {
+	return _SystemConfig.Contract.UnsafeBlockSigner(&_SystemConfig.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SystemConfig *SystemConfigCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _SystemConfig.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SystemConfig *SystemConfigSession) Version() (string, error) {
+	return _SystemConfig.Contract.Version(&_SystemConfig.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_SystemConfig *SystemConfigCallerSession) Version() (string, error) {
+	return _SystemConfig.Contract.Version(&_SystemConfig.CallOpts)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xdb9040fa.
+//
+// Solidity: function initialize(address _owner, uint32 _basefeeScalar, uint32 _blobbasefeeScalar, bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, (uint32,uint8,uint8,uint32,uint32,uint128) _config, address _batchInbox, (address,address,address,address,address,address,address) _addresses) returns()
+func (_SystemConfig *SystemConfigTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address, _basefeeScalar uint32, _blobbasefeeScalar uint32, _batcherHash [32]byte, _gasLimit uint64, _unsafeBlockSigner common.Address, _config ResourceMeteringResourceConfig, _batchInbox common.Address, _addresses SystemConfigAddresses) (*types.Transaction, error) {
+	return _SystemConfig.contract.Transact(opts, "initialize", _owner, _basefeeScalar, _blobbasefeeScalar, _batcherHash, _gasLimit, _unsafeBlockSigner, _config, _batchInbox, _addresses)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xdb9040fa.
+//
+// Solidity: function initialize(address _owner, uint32 _basefeeScalar, uint32 _blobbasefeeScalar, bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, (uint32,uint8,uint8,uint32,uint32,uint128) _config, address _batchInbox, (address,address,address,address,address,address,address) _addresses) returns()
+func (_SystemConfig *SystemConfigSession) Initialize(_owner common.Address, _basefeeScalar uint32, _blobbasefeeScalar uint32, _batcherHash [32]byte, _gasLimit uint64, _unsafeBlockSigner common.Address, _config ResourceMeteringResourceConfig, _batchInbox common.Address, _addresses SystemConfigAddresses) (*types.Transaction, error) {
+	return _SystemConfig.Contract.Initialize(&_SystemConfig.TransactOpts, _owner, _basefeeScalar, _blobbasefeeScalar, _batcherHash, _gasLimit, _unsafeBlockSigner, _config, _batchInbox, _addresses)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xdb9040fa.
+//
+// Solidity: function initialize(address _owner, uint32 _basefeeScalar, uint32 _blobbasefeeScalar, bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, (uint32,uint8,uint8,uint32,uint32,uint128) _config, address _batchInbox, (address,address,address,address,address,address,address) _addresses) returns()
+func (_SystemConfig *SystemConfigTransactorSession) Initialize(_owner common.Address, _basefeeScalar uint32, _blobbasefeeScalar uint32, _batcherHash [32]byte, _gasLimit uint64, _unsafeBlockSigner common.Address, _config ResourceMeteringResourceConfig, _batchInbox common.Address, _addresses SystemConfigAddresses) (*types.Transaction, error) {
+	return _SystemConfig.Contract.Initialize(&_SystemConfig.TransactOpts, _owner, _basefeeScalar, _blobbasefeeScalar, _batcherHash, _gasLimit, _unsafeBlockSigner, _config, _batchInbox, _addresses)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_SystemConfig *SystemConfigTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _SystemConfig.contract.Transact(opts, "renounceOwnership")
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_SystemConfig *SystemConfigSession) RenounceOwnership() (*types.Transaction, error) {
+	return _SystemConfig.Contract.RenounceOwnership(&_SystemConfig.TransactOpts)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_SystemConfig *SystemConfigTransactorSession) RenounceOwnership() (*types.Transaction, error) {
+	return _SystemConfig.Contract.RenounceOwnership(&_SystemConfig.TransactOpts)
+}
+
+// SetBatcherHash is a paid mutator transaction binding the contract method 0xc9b26f61.
+//
+// Solidity: function setBatcherHash(bytes32 _batcherHash) returns()
+func (_SystemConfig *SystemConfigTransactor) SetBatcherHash(opts *bind.TransactOpts, _batcherHash [32]byte) (*types.Transaction, error) {
+	return _SystemConfig.contract.Transact(opts, "setBatcherHash", _batcherHash)
+}
+
+// SetBatcherHash is a paid mutator transaction binding the contract method 0xc9b26f61.
+//
+// Solidity: function setBatcherHash(bytes32 _batcherHash) returns()
+func (_SystemConfig *SystemConfigSession) SetBatcherHash(_batcherHash [32]byte) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SetBatcherHash(&_SystemConfig.TransactOpts, _batcherHash)
+}
+
+// SetBatcherHash is a paid mutator transaction binding the contract method 0xc9b26f61.
+//
+// Solidity: function setBatcherHash(bytes32 _batcherHash) returns()
+func (_SystemConfig *SystemConfigTransactorSession) SetBatcherHash(_batcherHash [32]byte) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SetBatcherHash(&_SystemConfig.TransactOpts, _batcherHash)
+}
+
+// SetGasConfig is a paid mutator transaction binding the contract method 0x935f029e.
+//
+// Solidity: function setGasConfig(uint256 _overhead, uint256 _scalar) returns()
+func (_SystemConfig *SystemConfigTransactor) SetGasConfig(opts *bind.TransactOpts, _overhead *big.Int, _scalar *big.Int) (*types.Transaction, error) {
+	return _SystemConfig.contract.Transact(opts, "setGasConfig", _overhead, _scalar)
+}
+
+// SetGasConfig is a paid mutator transaction binding the contract method 0x935f029e.
+//
+// Solidity: function setGasConfig(uint256 _overhead, uint256 _scalar) returns()
+func (_SystemConfig *SystemConfigSession) SetGasConfig(_overhead *big.Int, _scalar *big.Int) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SetGasConfig(&_SystemConfig.TransactOpts, _overhead, _scalar)
+}
+
+// SetGasConfig is a paid mutator transaction binding the contract method 0x935f029e.
+//
+// Solidity: function setGasConfig(uint256 _overhead, uint256 _scalar) returns()
+func (_SystemConfig *SystemConfigTransactorSession) SetGasConfig(_overhead *big.Int, _scalar *big.Int) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SetGasConfig(&_SystemConfig.TransactOpts, _overhead, _scalar)
+}
+
+// SetGasConfigEcotone is a paid mutator transaction binding the contract method 0x21d7fde5.
+//
+// Solidity: function setGasConfigEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) returns()
+func (_SystemConfig *SystemConfigTransactor) SetGasConfigEcotone(opts *bind.TransactOpts, _basefeeScalar uint32, _blobbasefeeScalar uint32) (*types.Transaction, error) {
+	return _SystemConfig.contract.Transact(opts, "setGasConfigEcotone", _basefeeScalar, _blobbasefeeScalar)
+}
+
+// SetGasConfigEcotone is a paid mutator transaction binding the contract method 0x21d7fde5.
+//
+// Solidity: function setGasConfigEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) returns()
+func (_SystemConfig *SystemConfigSession) SetGasConfigEcotone(_basefeeScalar uint32, _blobbasefeeScalar uint32) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SetGasConfigEcotone(&_SystemConfig.TransactOpts, _basefeeScalar, _blobbasefeeScalar)
+}
+
+// SetGasConfigEcotone is a paid mutator transaction binding the contract method 0x21d7fde5.
+//
+// Solidity: function setGasConfigEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) returns()
+func (_SystemConfig *SystemConfigTransactorSession) SetGasConfigEcotone(_basefeeScalar uint32, _blobbasefeeScalar uint32) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SetGasConfigEcotone(&_SystemConfig.TransactOpts, _basefeeScalar, _blobbasefeeScalar)
+}
+
+// SetGasLimit is a paid mutator transaction binding the contract method 0xb40a817c.
+//
+// Solidity: function setGasLimit(uint64 _gasLimit) returns()
+func (_SystemConfig *SystemConfigTransactor) SetGasLimit(opts *bind.TransactOpts, _gasLimit uint64) (*types.Transaction, error) {
+	return _SystemConfig.contract.Transact(opts, "setGasLimit", _gasLimit)
+}
+
+// SetGasLimit is a paid mutator transaction binding the contract method 0xb40a817c.
+//
+// Solidity: function setGasLimit(uint64 _gasLimit) returns()
+func (_SystemConfig *SystemConfigSession) SetGasLimit(_gasLimit uint64) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SetGasLimit(&_SystemConfig.TransactOpts, _gasLimit)
+}
+
+// SetGasLimit is a paid mutator transaction binding the contract method 0xb40a817c.
+//
+// Solidity: function setGasLimit(uint64 _gasLimit) returns()
+func (_SystemConfig *SystemConfigTransactorSession) SetGasLimit(_gasLimit uint64) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SetGasLimit(&_SystemConfig.TransactOpts, _gasLimit)
+}
+
+// SetUnsafeBlockSigner is a paid mutator transaction binding the contract method 0x18d13918.
+//
+// Solidity: function setUnsafeBlockSigner(address _unsafeBlockSigner) returns()
+func (_SystemConfig *SystemConfigTransactor) SetUnsafeBlockSigner(opts *bind.TransactOpts, _unsafeBlockSigner common.Address) (*types.Transaction, error) {
+	return _SystemConfig.contract.Transact(opts, "setUnsafeBlockSigner", _unsafeBlockSigner)
+}
+
+// SetUnsafeBlockSigner is a paid mutator transaction binding the contract method 0x18d13918.
+//
+// Solidity: function setUnsafeBlockSigner(address _unsafeBlockSigner) returns()
+func (_SystemConfig *SystemConfigSession) SetUnsafeBlockSigner(_unsafeBlockSigner common.Address) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SetUnsafeBlockSigner(&_SystemConfig.TransactOpts, _unsafeBlockSigner)
+}
+
+// SetUnsafeBlockSigner is a paid mutator transaction binding the contract method 0x18d13918.
+//
+// Solidity: function setUnsafeBlockSigner(address _unsafeBlockSigner) returns()
+func (_SystemConfig *SystemConfigTransactorSession) SetUnsafeBlockSigner(_unsafeBlockSigner common.Address) (*types.Transaction, error) {
+	return _SystemConfig.Contract.SetUnsafeBlockSigner(&_SystemConfig.TransactOpts, _unsafeBlockSigner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_SystemConfig *SystemConfigTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
+	return _SystemConfig.contract.Transact(opts, "transferOwnership", newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_SystemConfig *SystemConfigSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+	return _SystemConfig.Contract.TransferOwnership(&_SystemConfig.TransactOpts, newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_SystemConfig *SystemConfigTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+	return _SystemConfig.Contract.TransferOwnership(&_SystemConfig.TransactOpts, newOwner)
+}
+
+// SystemConfigConfigUpdateIterator is returned from FilterConfigUpdate and is used to iterate over the raw logs and unpacked data for ConfigUpdate events raised by the SystemConfig contract.
+type SystemConfigConfigUpdateIterator struct {
+	Event *SystemConfigConfigUpdate // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *SystemConfigConfigUpdateIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(SystemConfigConfigUpdate)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(SystemConfigConfigUpdate)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *SystemConfigConfigUpdateIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *SystemConfigConfigUpdateIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// SystemConfigConfigUpdate represents a ConfigUpdate event raised by the SystemConfig contract.
+type SystemConfigConfigUpdate struct {
+	Version    *big.Int
+	UpdateType uint8
+	Data       []byte
+	Raw        types.Log // Blockchain specific contextual infos
+}
+
+// FilterConfigUpdate is a free log retrieval operation binding the contract event 0x1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be.
+//
+// Solidity: event ConfigUpdate(uint256 indexed version, uint8 indexed updateType, bytes data)
+func (_SystemConfig *SystemConfigFilterer) FilterConfigUpdate(opts *bind.FilterOpts, version []*big.Int, updateType []uint8) (*SystemConfigConfigUpdateIterator, error) {
+
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+	var updateTypeRule []interface{}
+	for _, updateTypeItem := range updateType {
+		updateTypeRule = append(updateTypeRule, updateTypeItem)
+	}
+
+	logs, sub, err := _SystemConfig.contract.FilterLogs(opts, "ConfigUpdate", versionRule, updateTypeRule)
+	if err != nil {
+		return nil, err
+	}
+	return &SystemConfigConfigUpdateIterator{contract: _SystemConfig.contract, event: "ConfigUpdate", logs: logs, sub: sub}, nil
+}
+
+// WatchConfigUpdate is a free log subscription operation binding the contract event 0x1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be.
+//
+// Solidity: event ConfigUpdate(uint256 indexed version, uint8 indexed updateType, bytes data)
+func (_SystemConfig *SystemConfigFilterer) WatchConfigUpdate(opts *bind.WatchOpts, sink chan<- *SystemConfigConfigUpdate, version []*big.Int, updateType []uint8) (event.Subscription, error) {
+
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+	var updateTypeRule []interface{}
+	for _, updateTypeItem := range updateType {
+		updateTypeRule = append(updateTypeRule, updateTypeItem)
+	}
+
+	logs, sub, err := _SystemConfig.contract.WatchLogs(opts, "ConfigUpdate", versionRule, updateTypeRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(SystemConfigConfigUpdate)
+				if err := _SystemConfig.contract.UnpackLog(event, "ConfigUpdate", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseConfigUpdate is a log parse operation binding the contract event 0x1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be.
+//
+// Solidity: event ConfigUpdate(uint256 indexed version, uint8 indexed updateType, bytes data)
+func (_SystemConfig *SystemConfigFilterer) ParseConfigUpdate(log types.Log) (*SystemConfigConfigUpdate, error) {
+	event := new(SystemConfigConfigUpdate)
+	if err := _SystemConfig.contract.UnpackLog(event, "ConfigUpdate", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// SystemConfigInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the SystemConfig contract.
+type SystemConfigInitializedIterator struct {
+	Event *SystemConfigInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *SystemConfigInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(SystemConfigInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(SystemConfigInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *SystemConfigInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *SystemConfigInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// SystemConfigInitialized represents a Initialized event raised by the SystemConfig contract.
+type SystemConfigInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_SystemConfig *SystemConfigFilterer) FilterInitialized(opts *bind.FilterOpts) (*SystemConfigInitializedIterator, error) {
+
+	logs, sub, err := _SystemConfig.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &SystemConfigInitializedIterator{contract: _SystemConfig.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_SystemConfig *SystemConfigFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *SystemConfigInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _SystemConfig.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(SystemConfigInitialized)
+				if err := _SystemConfig.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_SystemConfig *SystemConfigFilterer) ParseInitialized(log types.Log) (*SystemConfigInitialized, error) {
+	event := new(SystemConfigInitialized)
+	if err := _SystemConfig.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// SystemConfigOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the SystemConfig contract.
+type SystemConfigOwnershipTransferredIterator struct {
+	Event *SystemConfigOwnershipTransferred // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *SystemConfigOwnershipTransferredIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(SystemConfigOwnershipTransferred)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(SystemConfigOwnershipTransferred)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *SystemConfigOwnershipTransferredIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *SystemConfigOwnershipTransferredIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// SystemConfigOwnershipTransferred represents a OwnershipTransferred event raised by the SystemConfig contract.
+type SystemConfigOwnershipTransferred struct {
+	PreviousOwner common.Address
+	NewOwner      common.Address
+	Raw           types.Log // Blockchain specific contextual infos
+}
+
+// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_SystemConfig *SystemConfigFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*SystemConfigOwnershipTransferredIterator, error) {
+
+	var previousOwnerRule []interface{}
+	for _, previousOwnerItem := range previousOwner {
+		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+	}
+	var newOwnerRule []interface{}
+	for _, newOwnerItem := range newOwner {
+		newOwnerRule = append(newOwnerRule, newOwnerItem)
+	}
+
+	logs, sub, err := _SystemConfig.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+	if err != nil {
+		return nil, err
+	}
+	return &SystemConfigOwnershipTransferredIterator{contract: _SystemConfig.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_SystemConfig *SystemConfigFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *SystemConfigOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) {
+
+	var previousOwnerRule []interface{}
+	for _, previousOwnerItem := range previousOwner {
+		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+	}
+	var newOwnerRule []interface{}
+	for _, newOwnerItem := range newOwner {
+		newOwnerRule = append(newOwnerRule, newOwnerItem)
+	}
+
+	logs, sub, err := _SystemConfig.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(SystemConfigOwnershipTransferred)
+				if err := _SystemConfig.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_SystemConfig *SystemConfigFilterer) ParseOwnershipTransferred(log types.Log) (*SystemConfigOwnershipTransferred, error) {
+	event := new(SystemConfigOwnershipTransferred)
+	if err := _SystemConfig.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-e2e/bindings/weth.go b/op-e2e/bindings/weth.go
new file mode 100644
index 000000000000..7b2eb50b7951
--- /dev/null
+++ b/op-e2e/bindings/weth.go
@@ -0,0 +1,1133 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// WETHMetaData contains all meta data concerning the WETH contract.
+var WETHMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"name_\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"symbol_\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"guy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawal\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+	Bin: "0x608060405234801561001057600080fd5b50610add806100206000396000f3fe6080604052600436106100c05760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146101f8578063d0e30db0146100cf578063dd62ed3e14610218576100cf565b8063313ce5671461018f57806370a08231146101b657806395d89b41146101e3576100cf565b806318160ddd116100a557806318160ddd1461013257806323b872dd1461014f5780632e1a7d4d1461016f576100cf565b806306fdde03146100d7578063095ea7b314610102576100cf565b366100cf576100cd610250565b005b6100cd610250565b3480156100e357600080fd5b506100ec6102ab565b6040516100f991906107a7565b60405180910390f35b34801561010e57600080fd5b5061012261011d366004610821565b610376565b60405190151581526020016100f9565b34801561013e57600080fd5b50475b6040519081526020016100f9565b34801561015b57600080fd5b5061012261016a36600461084b565b6103ef565b34801561017b57600080fd5b506100cd61018a366004610887565b610606565b34801561019b57600080fd5b506101a4601281565b60405160ff90911681526020016100f9565b3480156101c257600080fd5b506101416101d13660046108a0565b60006020819052908152604090205481565b3480156101ef57600080fd5b506100ec6106ac565b34801561020457600080fd5b50610122610213366004610821565b610763565b34801561022457600080fd5b506101416102333660046108bb565b600160209081526000928352604080842090915290825290205481565b336000908152602081905260408120805434929061026f90849061091d565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b606073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663d84447156040518163ffffffff1660e01b8152600401600060405180830381865afa15801561030c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103529190810190610964565b6040516020016103629190610a2f565b604051602081830303815290604052905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103de9086815260200190565b60405180910390a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081205482111561042157600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610497575073ffffffffffffffffffffffffffffffffffffffff841660009081526001602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b1561051f5773ffffffffffffffffffffffffffffffffffffffff841660009081526001602090815260408083203384529091529020548211156104d957600080fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260016020908152604080832033845290915281208054849290610519908490610a74565b90915550505b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604081208054849290610554908490610a74565b909155505073ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120805484929061058e90849061091d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516105f491815260200190565b60405180910390a35060019392505050565b3360009081526020819052604090205481111561062257600080fd5b3360009081526020819052604081208054839290610641908490610a74565b9091555050604051339082156108fc029083906000818181858888f19350505050158015610673573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b606073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663550fcdc96040518163ffffffff1660e01b8152600401600060405180830381865afa15801561070d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526107539190810190610964565b6040516020016103629190610a8b565b60006107703384846103ef565b9392505050565b60005b8381101561079257818101518382015260200161077a565b838111156107a1576000848401525b50505050565b60208152600082518060208401526107c6816040850160208701610777565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461081c57600080fd5b919050565b6000806040838503121561083457600080fd5b61083d836107f8565b946020939093013593505050565b60008060006060848603121561086057600080fd5b610869846107f8565b9250610877602085016107f8565b9150604084013590509250925092565b60006020828403121561089957600080fd5b5035919050565b6000602082840312156108b257600080fd5b610770826107f8565b600080604083850312156108ce57600080fd5b6108d7836107f8565b91506108e5602084016107f8565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610930576109306108ee565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561097657600080fd5b815167ffffffffffffffff8082111561098e57600080fd5b818401915084601f8301126109a257600080fd5b8151818111156109b4576109b4610935565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109fa576109fa610935565b81604052828152876020848701011115610a1357600080fd5b610a24836020830160208801610777565b979650505050505050565b7f5772617070656420000000000000000000000000000000000000000000000000815260008251610a67816008850160208701610777565b9190910160080192915050565b600082821015610a8657610a866108ee565b500390565b7f5700000000000000000000000000000000000000000000000000000000000000815260008251610ac3816001850160208701610777565b919091016001019291505056fea164736f6c634300080f000a",
+}
+
+// WETHABI is the input ABI used to generate the binding from.
+// Deprecated: Use WETHMetaData.ABI instead.
+var WETHABI = WETHMetaData.ABI
+
+// WETHBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use WETHMetaData.Bin instead.
+var WETHBin = WETHMetaData.Bin
+
+// DeployWETH deploys a new Ethereum contract, binding an instance of WETH to it.
+func DeployWETH(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *WETH, error) {
+	parsed, err := WETHMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(WETHBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &WETH{WETHCaller: WETHCaller{contract: contract}, WETHTransactor: WETHTransactor{contract: contract}, WETHFilterer: WETHFilterer{contract: contract}}, nil
+}
+
+// WETH is an auto generated Go binding around an Ethereum contract.
+type WETH struct {
+	WETHCaller     // Read-only binding to the contract
+	WETHTransactor // Write-only binding to the contract
+	WETHFilterer   // Log filterer for contract events
+}
+
+// WETHCaller is an auto generated read-only Go binding around an Ethereum contract.
+type WETHCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// WETHTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type WETHTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// WETHFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type WETHFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// WETHSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type WETHSession struct {
+	Contract     *WETH             // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// WETHCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type WETHCallerSession struct {
+	Contract *WETHCaller   // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// WETHTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type WETHTransactorSession struct {
+	Contract     *WETHTransactor   // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// WETHRaw is an auto generated low-level Go binding around an Ethereum contract.
+type WETHRaw struct {
+	Contract *WETH // Generic contract binding to access the raw methods on
+}
+
+// WETHCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type WETHCallerRaw struct {
+	Contract *WETHCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// WETHTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type WETHTransactorRaw struct {
+	Contract *WETHTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewWETH creates a new instance of WETH, bound to a specific deployed contract.
+func NewWETH(address common.Address, backend bind.ContractBackend) (*WETH, error) {
+	contract, err := bindWETH(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &WETH{WETHCaller: WETHCaller{contract: contract}, WETHTransactor: WETHTransactor{contract: contract}, WETHFilterer: WETHFilterer{contract: contract}}, nil
+}
+
+// NewWETHCaller creates a new read-only instance of WETH, bound to a specific deployed contract.
+func NewWETHCaller(address common.Address, caller bind.ContractCaller) (*WETHCaller, error) {
+	contract, err := bindWETH(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &WETHCaller{contract: contract}, nil
+}
+
+// NewWETHTransactor creates a new write-only instance of WETH, bound to a specific deployed contract.
+func NewWETHTransactor(address common.Address, transactor bind.ContractTransactor) (*WETHTransactor, error) {
+	contract, err := bindWETH(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &WETHTransactor{contract: contract}, nil
+}
+
+// NewWETHFilterer creates a new log filterer instance of WETH, bound to a specific deployed contract.
+func NewWETHFilterer(address common.Address, filterer bind.ContractFilterer) (*WETHFilterer, error) {
+	contract, err := bindWETH(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &WETHFilterer{contract: contract}, nil
+}
+
+// bindWETH binds a generic wrapper to an already deployed contract.
+func bindWETH(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(WETHABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_WETH *WETHRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _WETH.Contract.WETHCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_WETH *WETHRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _WETH.Contract.WETHTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_WETH *WETHRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _WETH.Contract.WETHTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_WETH *WETHCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _WETH.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_WETH *WETHTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _WETH.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_WETH *WETHTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _WETH.Contract.contract.Transact(opts, method, params...)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(address , address ) view returns(uint256)
+func (_WETH *WETHCaller) Allowance(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _WETH.contract.Call(opts, &out, "allowance", arg0, arg1)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(address , address ) view returns(uint256)
+func (_WETH *WETHSession) Allowance(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _WETH.Contract.Allowance(&_WETH.CallOpts, arg0, arg1)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(address , address ) view returns(uint256)
+func (_WETH *WETHCallerSession) Allowance(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _WETH.Contract.Allowance(&_WETH.CallOpts, arg0, arg1)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(address ) view returns(uint256)
+func (_WETH *WETHCaller) BalanceOf(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _WETH.contract.Call(opts, &out, "balanceOf", arg0)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(address ) view returns(uint256)
+func (_WETH *WETHSession) BalanceOf(arg0 common.Address) (*big.Int, error) {
+	return _WETH.Contract.BalanceOf(&_WETH.CallOpts, arg0)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(address ) view returns(uint256)
+func (_WETH *WETHCallerSession) BalanceOf(arg0 common.Address) (*big.Int, error) {
+	return _WETH.Contract.BalanceOf(&_WETH.CallOpts, arg0)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() view returns(uint8)
+func (_WETH *WETHCaller) Decimals(opts *bind.CallOpts) (uint8, error) {
+	var out []interface{}
+	err := _WETH.contract.Call(opts, &out, "decimals")
+
+	if err != nil {
+		return *new(uint8), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
+
+	return out0, err
+
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() view returns(uint8)
+func (_WETH *WETHSession) Decimals() (uint8, error) {
+	return _WETH.Contract.Decimals(&_WETH.CallOpts)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() view returns(uint8)
+func (_WETH *WETHCallerSession) Decimals() (uint8, error) {
+	return _WETH.Contract.Decimals(&_WETH.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() view returns(string name_)
+func (_WETH *WETHCaller) Name(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _WETH.contract.Call(opts, &out, "name")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() view returns(string name_)
+func (_WETH *WETHSession) Name() (string, error) {
+	return _WETH.Contract.Name(&_WETH.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() view returns(string name_)
+func (_WETH *WETHCallerSession) Name() (string, error) {
+	return _WETH.Contract.Name(&_WETH.CallOpts)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() view returns(string symbol_)
+func (_WETH *WETHCaller) Symbol(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _WETH.contract.Call(opts, &out, "symbol")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() view returns(string symbol_)
+func (_WETH *WETHSession) Symbol() (string, error) {
+	return _WETH.Contract.Symbol(&_WETH.CallOpts)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() view returns(string symbol_)
+func (_WETH *WETHCallerSession) Symbol() (string, error) {
+	return _WETH.Contract.Symbol(&_WETH.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() view returns(uint256)
+func (_WETH *WETHCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _WETH.contract.Call(opts, &out, "totalSupply")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() view returns(uint256)
+func (_WETH *WETHSession) TotalSupply() (*big.Int, error) {
+	return _WETH.Contract.TotalSupply(&_WETH.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() view returns(uint256)
+func (_WETH *WETHCallerSession) TotalSupply() (*big.Int, error) {
+	return _WETH.Contract.TotalSupply(&_WETH.CallOpts)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(address guy, uint256 wad) returns(bool)
+func (_WETH *WETHTransactor) Approve(opts *bind.TransactOpts, guy common.Address, wad *big.Int) (*types.Transaction, error) {
+	return _WETH.contract.Transact(opts, "approve", guy, wad)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(address guy, uint256 wad) returns(bool)
+func (_WETH *WETHSession) Approve(guy common.Address, wad *big.Int) (*types.Transaction, error) {
+	return _WETH.Contract.Approve(&_WETH.TransactOpts, guy, wad)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(address guy, uint256 wad) returns(bool)
+func (_WETH *WETHTransactorSession) Approve(guy common.Address, wad *big.Int) (*types.Transaction, error) {
+	return _WETH.Contract.Approve(&_WETH.TransactOpts, guy, wad)
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0.
+//
+// Solidity: function deposit() payable returns()
+func (_WETH *WETHTransactor) Deposit(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _WETH.contract.Transact(opts, "deposit")
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0.
+//
+// Solidity: function deposit() payable returns()
+func (_WETH *WETHSession) Deposit() (*types.Transaction, error) {
+	return _WETH.Contract.Deposit(&_WETH.TransactOpts)
+}
+
+// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0.
+//
+// Solidity: function deposit() payable returns()
+func (_WETH *WETHTransactorSession) Deposit() (*types.Transaction, error) {
+	return _WETH.Contract.Deposit(&_WETH.TransactOpts)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(address dst, uint256 wad) returns(bool)
+func (_WETH *WETHTransactor) Transfer(opts *bind.TransactOpts, dst common.Address, wad *big.Int) (*types.Transaction, error) {
+	return _WETH.contract.Transact(opts, "transfer", dst, wad)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(address dst, uint256 wad) returns(bool)
+func (_WETH *WETHSession) Transfer(dst common.Address, wad *big.Int) (*types.Transaction, error) {
+	return _WETH.Contract.Transfer(&_WETH.TransactOpts, dst, wad)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(address dst, uint256 wad) returns(bool)
+func (_WETH *WETHTransactorSession) Transfer(dst common.Address, wad *big.Int) (*types.Transaction, error) {
+	return _WETH.Contract.Transfer(&_WETH.TransactOpts, dst, wad)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(address src, address dst, uint256 wad) returns(bool)
+func (_WETH *WETHTransactor) TransferFrom(opts *bind.TransactOpts, src common.Address, dst common.Address, wad *big.Int) (*types.Transaction, error) {
+	return _WETH.contract.Transact(opts, "transferFrom", src, dst, wad)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(address src, address dst, uint256 wad) returns(bool)
+func (_WETH *WETHSession) TransferFrom(src common.Address, dst common.Address, wad *big.Int) (*types.Transaction, error) {
+	return _WETH.Contract.TransferFrom(&_WETH.TransactOpts, src, dst, wad)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(address src, address dst, uint256 wad) returns(bool)
+func (_WETH *WETHTransactorSession) TransferFrom(src common.Address, dst common.Address, wad *big.Int) (*types.Transaction, error) {
+	return _WETH.Contract.TransferFrom(&_WETH.TransactOpts, src, dst, wad)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d.
+//
+// Solidity: function withdraw(uint256 wad) returns()
+func (_WETH *WETHTransactor) Withdraw(opts *bind.TransactOpts, wad *big.Int) (*types.Transaction, error) {
+	return _WETH.contract.Transact(opts, "withdraw", wad)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d.
+//
+// Solidity: function withdraw(uint256 wad) returns()
+func (_WETH *WETHSession) Withdraw(wad *big.Int) (*types.Transaction, error) {
+	return _WETH.Contract.Withdraw(&_WETH.TransactOpts, wad)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d.
+//
+// Solidity: function withdraw(uint256 wad) returns()
+func (_WETH *WETHTransactorSession) Withdraw(wad *big.Int) (*types.Transaction, error) {
+	return _WETH.Contract.Withdraw(&_WETH.TransactOpts, wad)
+}
+
+// Fallback is a paid mutator transaction binding the contract fallback function.
+//
+// Solidity: fallback() payable returns()
+func (_WETH *WETHTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) {
+	return _WETH.contract.RawTransact(opts, calldata)
+}
+
+// Fallback is a paid mutator transaction binding the contract fallback function.
+//
+// Solidity: fallback() payable returns()
+func (_WETH *WETHSession) Fallback(calldata []byte) (*types.Transaction, error) {
+	return _WETH.Contract.Fallback(&_WETH.TransactOpts, calldata)
+}
+
+// Fallback is a paid mutator transaction binding the contract fallback function.
+//
+// Solidity: fallback() payable returns()
+func (_WETH *WETHTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) {
+	return _WETH.Contract.Fallback(&_WETH.TransactOpts, calldata)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_WETH *WETHTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _WETH.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_WETH *WETHSession) Receive() (*types.Transaction, error) {
+	return _WETH.Contract.Receive(&_WETH.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_WETH *WETHTransactorSession) Receive() (*types.Transaction, error) {
+	return _WETH.Contract.Receive(&_WETH.TransactOpts)
+}
+
+// WETHApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the WETH contract.
+type WETHApprovalIterator struct {
+	Event *WETHApproval // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *WETHApprovalIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(WETHApproval)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(WETHApproval)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *WETHApprovalIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *WETHApprovalIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// WETHApproval represents a Approval event raised by the WETH contract.
+type WETHApproval struct {
+	Src common.Address
+	Guy common.Address
+	Wad *big.Int
+	Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(address indexed src, address indexed guy, uint256 wad)
+func (_WETH *WETHFilterer) FilterApproval(opts *bind.FilterOpts, src []common.Address, guy []common.Address) (*WETHApprovalIterator, error) {
+
+	var srcRule []interface{}
+	for _, srcItem := range src {
+		srcRule = append(srcRule, srcItem)
+	}
+	var guyRule []interface{}
+	for _, guyItem := range guy {
+		guyRule = append(guyRule, guyItem)
+	}
+
+	logs, sub, err := _WETH.contract.FilterLogs(opts, "Approval", srcRule, guyRule)
+	if err != nil {
+		return nil, err
+	}
+	return &WETHApprovalIterator{contract: _WETH.contract, event: "Approval", logs: logs, sub: sub}, nil
+}
+
+// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(address indexed src, address indexed guy, uint256 wad)
+func (_WETH *WETHFilterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *WETHApproval, src []common.Address, guy []common.Address) (event.Subscription, error) {
+
+	var srcRule []interface{}
+	for _, srcItem := range src {
+		srcRule = append(srcRule, srcItem)
+	}
+	var guyRule []interface{}
+	for _, guyItem := range guy {
+		guyRule = append(guyRule, guyItem)
+	}
+
+	logs, sub, err := _WETH.contract.WatchLogs(opts, "Approval", srcRule, guyRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(WETHApproval)
+				if err := _WETH.contract.UnpackLog(event, "Approval", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(address indexed src, address indexed guy, uint256 wad)
+func (_WETH *WETHFilterer) ParseApproval(log types.Log) (*WETHApproval, error) {
+	event := new(WETHApproval)
+	if err := _WETH.contract.UnpackLog(event, "Approval", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// WETHDepositIterator is returned from FilterDeposit and is used to iterate over the raw logs and unpacked data for Deposit events raised by the WETH contract.
+type WETHDepositIterator struct {
+	Event *WETHDeposit // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *WETHDepositIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(WETHDeposit)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(WETHDeposit)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *WETHDepositIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *WETHDepositIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// WETHDeposit represents a Deposit event raised by the WETH contract.
+type WETHDeposit struct {
+	Dst common.Address
+	Wad *big.Int
+	Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDeposit is a free log retrieval operation binding the contract event 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c.
+//
+// Solidity: event Deposit(address indexed dst, uint256 wad)
+func (_WETH *WETHFilterer) FilterDeposit(opts *bind.FilterOpts, dst []common.Address) (*WETHDepositIterator, error) {
+
+	var dstRule []interface{}
+	for _, dstItem := range dst {
+		dstRule = append(dstRule, dstItem)
+	}
+
+	logs, sub, err := _WETH.contract.FilterLogs(opts, "Deposit", dstRule)
+	if err != nil {
+		return nil, err
+	}
+	return &WETHDepositIterator{contract: _WETH.contract, event: "Deposit", logs: logs, sub: sub}, nil
+}
+
+// WatchDeposit is a free log subscription operation binding the contract event 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c.
+//
+// Solidity: event Deposit(address indexed dst, uint256 wad)
+func (_WETH *WETHFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *WETHDeposit, dst []common.Address) (event.Subscription, error) {
+
+	var dstRule []interface{}
+	for _, dstItem := range dst {
+		dstRule = append(dstRule, dstItem)
+	}
+
+	logs, sub, err := _WETH.contract.WatchLogs(opts, "Deposit", dstRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(WETHDeposit)
+				if err := _WETH.contract.UnpackLog(event, "Deposit", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseDeposit is a log parse operation binding the contract event 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c.
+//
+// Solidity: event Deposit(address indexed dst, uint256 wad)
+func (_WETH *WETHFilterer) ParseDeposit(log types.Log) (*WETHDeposit, error) {
+	event := new(WETHDeposit)
+	if err := _WETH.contract.UnpackLog(event, "Deposit", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// WETHTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the WETH contract.
+type WETHTransferIterator struct {
+	Event *WETHTransfer // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *WETHTransferIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(WETHTransfer)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(WETHTransfer)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *WETHTransferIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *WETHTransferIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// WETHTransfer represents a Transfer event raised by the WETH contract.
+type WETHTransfer struct {
+	Src common.Address
+	Dst common.Address
+	Wad *big.Int
+	Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(address indexed src, address indexed dst, uint256 wad)
+func (_WETH *WETHFilterer) FilterTransfer(opts *bind.FilterOpts, src []common.Address, dst []common.Address) (*WETHTransferIterator, error) {
+
+	var srcRule []interface{}
+	for _, srcItem := range src {
+		srcRule = append(srcRule, srcItem)
+	}
+	var dstRule []interface{}
+	for _, dstItem := range dst {
+		dstRule = append(dstRule, dstItem)
+	}
+
+	logs, sub, err := _WETH.contract.FilterLogs(opts, "Transfer", srcRule, dstRule)
+	if err != nil {
+		return nil, err
+	}
+	return &WETHTransferIterator{contract: _WETH.contract, event: "Transfer", logs: logs, sub: sub}, nil
+}
+
+// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(address indexed src, address indexed dst, uint256 wad)
+func (_WETH *WETHFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *WETHTransfer, src []common.Address, dst []common.Address) (event.Subscription, error) {
+
+	var srcRule []interface{}
+	for _, srcItem := range src {
+		srcRule = append(srcRule, srcItem)
+	}
+	var dstRule []interface{}
+	for _, dstItem := range dst {
+		dstRule = append(dstRule, dstItem)
+	}
+
+	logs, sub, err := _WETH.contract.WatchLogs(opts, "Transfer", srcRule, dstRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(WETHTransfer)
+				if err := _WETH.contract.UnpackLog(event, "Transfer", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(address indexed src, address indexed dst, uint256 wad)
+func (_WETH *WETHFilterer) ParseTransfer(log types.Log) (*WETHTransfer, error) {
+	event := new(WETHTransfer)
+	if err := _WETH.contract.UnpackLog(event, "Transfer", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// WETHWithdrawalIterator is returned from FilterWithdrawal and is used to iterate over the raw logs and unpacked data for Withdrawal events raised by the WETH contract.
+type WETHWithdrawalIterator struct {
+	Event *WETHWithdrawal // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *WETHWithdrawalIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(WETHWithdrawal)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(WETHWithdrawal)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *WETHWithdrawalIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *WETHWithdrawalIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// WETHWithdrawal represents a Withdrawal event raised by the WETH contract.
+type WETHWithdrawal struct {
+	Src common.Address
+	Wad *big.Int
+	Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawal is a free log retrieval operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65.
+//
+// Solidity: event Withdrawal(address indexed src, uint256 wad)
+func (_WETH *WETHFilterer) FilterWithdrawal(opts *bind.FilterOpts, src []common.Address) (*WETHWithdrawalIterator, error) {
+
+	var srcRule []interface{}
+	for _, srcItem := range src {
+		srcRule = append(srcRule, srcItem)
+	}
+
+	logs, sub, err := _WETH.contract.FilterLogs(opts, "Withdrawal", srcRule)
+	if err != nil {
+		return nil, err
+	}
+	return &WETHWithdrawalIterator{contract: _WETH.contract, event: "Withdrawal", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawal is a free log subscription operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65.
+//
+// Solidity: event Withdrawal(address indexed src, uint256 wad)
+func (_WETH *WETHFilterer) WatchWithdrawal(opts *bind.WatchOpts, sink chan<- *WETHWithdrawal, src []common.Address) (event.Subscription, error) {
+
+	var srcRule []interface{}
+	for _, srcItem := range src {
+		srcRule = append(srcRule, srcItem)
+	}
+
+	logs, sub, err := _WETH.contract.WatchLogs(opts, "Withdrawal", srcRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(WETHWithdrawal)
+				if err := _WETH.contract.UnpackLog(event, "Withdrawal", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawal is a log parse operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65.
+//
+// Solidity: event Withdrawal(address indexed src, uint256 wad)
+func (_WETH *WETHFilterer) ParseWithdrawal(log types.Log) (*WETHWithdrawal, error) {
+	event := new(WETHWithdrawal)
+	if err := _WETH.contract.UnpackLog(event, "Withdrawal", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-bindings/bindings/weth9.go b/op-e2e/bindings/weth9.go
similarity index 99%
rename from op-bindings/bindings/weth9.go
rename to op-e2e/bindings/weth9.go
index 179a58ffb5f4..043b4fcce7dd 100644
--- a/op-bindings/bindings/weth9.go
+++ b/op-e2e/bindings/weth9.go
@@ -31,7 +31,7 @@ var (
 // WETH9MetaData contains all meta data concerning the WETH9 contract.
 var WETH9MetaData = &bind.MetaData{
 	ABI: "[{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"guy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawal\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
-	Bin: "0x60c0604052600d60808190526c2bb930b83832b21022ba3432b960991b60a090815261002e916000919061007a565b50604080518082019091526004808252630ae8aa8960e31b602090920191825261005a9160019161007a565b506002805460ff1916601217905534801561007457600080fd5b50610115565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100bb57805160ff19168380011785556100e8565b828001600101855582156100e8579182015b828111156100e85782518255916020019190600101906100cd565b506100f49291506100f8565b5090565b61011291905b808211156100f457600081556001016100fe565b90565b6107f9806101246000396000f3fe6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a723158208cdf9e0c522e49d36150a8c7a071369551180dfcf54934aa47b2d43732920e8e64736f6c63430005110032",
+	Bin: "0x60c0604052600d60808190526c2bb930b83832b21022ba3432b960991b60a090815261002e916000919061007a565b50604080518082019091526004808252630ae8aa8960e31b602090920191825261005a9160019161007a565b506002805460ff1916601217905534801561007457600080fd5b50610115565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100bb57805160ff19168380011785556100e8565b828001600101855582156100e8579182015b828111156100e85782518255916020019190600101906100cd565b506100f49291506100f8565b5090565b61011291905b808211156100f457600081556001016100fe565b90565b6107f9806101246000396000f3fe6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a72315820d9a21886186e04516cbdaa611a54950fabc4d47164691bf70de28f6c54060de964736f6c63430005110032",
 }
 
 // WETH9ABI is the input ABI used to generate the binding from.
diff --git a/op-e2e/bindingspreview/optimismportal2.go b/op-e2e/bindingspreview/optimismportal2.go
new file mode 100644
index 000000000000..5223dcec05d6
--- /dev/null
+++ b/op-e2e/bindingspreview/optimismportal2.go
@@ -0,0 +1,1633 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindingspreview
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// TypesOutputRootProof is an auto generated low-level Go binding around an user-defined struct.
+type TypesOutputRootProof struct {
+	Version                  [32]byte
+	StateRoot                [32]byte
+	MessagePasserStorageRoot [32]byte
+	LatestBlockhash          [32]byte
+}
+
+// TypesWithdrawalTransaction is an auto generated low-level Go binding around an user-defined struct.
+type TypesWithdrawalTransaction struct {
+	Nonce    *big.Int
+	Sender   common.Address
+	Target   common.Address
+	Value    *big.Int
+	GasLimit *big.Int
+	Data     []byte
+}
+
+// OptimismPortal2MetaData contains all meta data concerning the OptimismPortal2 contract.
+var OptimismPortal2MetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_proofMaturityDelaySeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_disputeGameFinalityDelaySeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"blacklistDisputeGame\",\"inputs\":[{\"name\":\"_disputeGame\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkWithdrawal\",\"inputs\":[{\"name\":\"_withdrawalHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_proofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositTransaction\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_isCreation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"disputeGameBlacklist\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disputeGameFactory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractDisputeGameFactory\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disputeGameFinalityDelaySeconds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"donateETH\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"finalizeWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizeWithdrawalTransactionExternalProof\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizedWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardian\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_disputeGameFactory\",\"type\":\"address\",\"internalType\":\"contractDisputeGameFactory\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"},{\"name\":\"_initialRespectedGameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l2Sender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minimumGasLimit\",\"inputs\":[{\"name\":\"_byteCount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"numProofSubmitters\",\"inputs\":[{\"name\":\"_withdrawalHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"params\",\"inputs\":[],\"outputs\":[{\"name\":\"prevBaseFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"prevBoughtGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"prevBlockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofMaturityDelaySeconds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitters\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_disputeGameIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_outputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"latestBlockhash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provenWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"disputeGameProxy\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"respectedGameType\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"respectedGameTypeUpdatedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setRespectedGameType\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransactionDeposited\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"version\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"opaqueData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalFinalized\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalProven\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BadTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasEstimation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LargeCalldata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfGas\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SmallGasLimit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[]}]",
+	Bin: "0x60c06040523480156200001157600080fd5b5060405162005cbd38038062005cbd8339810160408190526200003491620002f2565b608082905260a08190526200004d600080808062000055565b505062000317565b600054610100900460ff1615808015620000765750600054600160ff909116105b80620000a6575062000093306200022460201b620020d41760201c565b158015620000a6575060005460ff166001145b6200010f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000133576000805461ff0019166101001790555b603880546001600160a01b03199081166001600160a01b03888116919091179092556037805490911686831617905560358054610100600160a81b0319166101008684160217905560325416620001cc576032805461dead6001600160a01b0319909116179055603b80546001600160601b031916640100000000426001600160401b03160263ffffffff19161763ffffffff84161790555b620001d662000233565b80156200021d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6001600160a01b03163b151590565b600054610100900460ff16620002a05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000106565b600154600160c01b90046001600160401b0316600003620002f05760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b600080604083850312156200030657600080fd5b505080516020909101519092909150565b60805160a0516159726200034b600039600081816104c30152611a4601526000818161063a015261168401526159726000f3fe6080604052600436106101b05760003560e01c80637fc48504116100ec578063a35d99df1161008a578063bf653a5c11610064578063bf653a5c1461062b578063cff0ab961461065e578063e9e05c42146106ff578063f2b4e6171461071257600080fd5b8063a35d99df14610544578063a3860f4814610564578063bb2c727e1461058457600080fd5b80638e819e54116100c65780638e819e5414610494578063952b2797146104b45780639bf62d82146104e7578063a14238e71461051457600080fd5b80637fc48504146104545780638b4c40b0146101d55780638c3152e91461047457600080fd5b80634870496f1161015957806354fd4d501161013357806354fd4d50146103a95780635c975abb146103ff57806371c1566e146104145780637d6be8dc1461043457600080fd5b80634870496f1461030c5780634fd0434c1461032c578063513747ab1461036e57600080fd5b806343ca1c501161018a57806343ca1c5014610297578063452a9320146102b757806345884d32146102cc57600080fd5b806333d7e2bd146101dc57806335e80ab3146102335780633c9f397c1461026557600080fd5b366101d7576101d53334620186a060006040518060200160405280600081525061073f565b005b600080fd5b3480156101e857600080fd5b506037546102099073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023f57600080fd5b5060355461020990610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561027157600080fd5b50603b546102829063ffffffff1681565b60405163ffffffff909116815260200161022a565b3480156102a357600080fd5b506101d56102b2366004614e15565b6108fc565b3480156102c357600080fd5b50610209610b5a565b3480156102d857600080fd5b506102fc6102e7366004614e67565b603a6020526000908152604090205460ff1681565b604051901515815260200161022a565b34801561031857600080fd5b506101d5610327366004614e84565b610bf2565b34801561033857600080fd5b50603b5461035590640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161022a565b34801561037a57600080fd5b5061039b610389366004614f60565b6000908152603c602052604090205490565b60405190815260200161022a565b3480156103b557600080fd5b506103f26040518060400160405280600581526020017f332e382e3000000000000000000000000000000000000000000000000000000081525081565b60405161022a9190614fef565b34801561040b57600080fd5b506102fc6112d6565b34801561042057600080fd5b506101d561042f366004615002565b611369565b34801561044057600080fd5b506101d561044f366004614e67565b611bfa565b34801561046057600080fd5b506101d561046f366004615039565b611cb5565b34801561048057600080fd5b506101d561048f366004615056565b611d6f565b3480156104a057600080fd5b506101d56104af366004615093565b611dbb565b3480156104c057600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039b565b3480156104f357600080fd5b506032546102099073ffffffffffffffffffffffffffffffffffffffff1681565b34801561052057600080fd5b506102fc61052f366004614f60565b60336020526000908152604090205460ff1681565b34801561055057600080fd5b5061035561055f366004615105565b612070565b34801561057057600080fd5b5061020961057f366004615122565b61208f565b34801561059057600080fd5b506105f661059f366004615002565b603960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301520161022a565b34801561063757600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039b565b34801561066a57600080fd5b506001546106c6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161022a565b6101d561070d366004615152565b61073f565b34801561071e57600080fd5b506038546102099073ffffffffffffffffffffffffffffffffffffffff1681565b8260005a9050838015610767575073ffffffffffffffffffffffffffffffffffffffff871615155b1561079e576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107a88351612070565b67ffffffffffffffff168567ffffffffffffffff1610156107f5576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c083511115610833576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33328114610854575033731111000000000000000000000000000000001111015b6000348888888860405160200161086f9594939291906151d1565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516108df9190614fef565b60405180910390a450506108f382826120f0565b50505050505050565b6109046112d6565b1561093b576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead146109e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084015b60405180910390fd5b60006109f4836123c7565b9050610a008183611369565b600081815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558401516080850151606086015160a0870151610aa293929190612414565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90610b0790841515815260200190565b60405180910390a280158015610b1d5750326001145b15610b54576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190615236565b905090565b610bfa6112d6565b15610c31576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610cf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016109e0565b6038546040517fbb8aa1fc00000000000000000000000000000000000000000000000000000000815260048101869052600091829173ffffffffffffffffffffffffffffffffffffffff9091169063bb8aa1fc90602401606060405180830381865afa158015610d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d889190615253565b925050915060008173ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfe91906152a0565b603b5490915063ffffffff848116911614610e9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b610eb2610ead368890038801886152b9565b612472565b8114610f40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016109e0565b6000610f4b896123c7565b905060018373ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe919061534e565b6002811115610fcf57610fcf61531f565b0361105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f742070726f76652061676160448201527f696e737420696e76616c696420646973707574652067616d657300000000000060648201526084016109e0565b60408051602081018390526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506111259101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529061111b898b61536f565b8b604001356124b1565b6111b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016109e0565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff808716825267ffffffffffffffff4281166020808501918252600088815260398252868120338252825286812095518654935190941674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931693851693909317919091179093558d840151928e01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4506000908152603c602090815260408220805460018101825590835291200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed91906153f3565b600082815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff85811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152818552603a90935292205490919060ff161561146e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652068617360448201527f206265656e20626c61636b6c697374656400000000000000000000000000000060648201526084016109e0565b816020015167ffffffffffffffff16600003611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2062792070726f6f66207375626d6974746560648201527f7220616464726573732079657400000000000000000000000000000000000000608482015260a4016109e0565b60006115b38273ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a69190615410565b67ffffffffffffffff1690565b90508067ffffffffffffffff16836020015167ffffffffffffffff1611611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e20646973707574652067616d65206372656160648201527f74696f6e2074696d657374616d70000000000000000000000000000000000000608482015260a4016109e0565b7f0000000000000000000000000000000000000000000000000000000000000000836020015167ffffffffffffffff16426116bd919061545c565b1161174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c20686173206e6f74206d61747572656420796574000000000000000000000060648201526084016109e0565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bb919061534e565b60028111156117cc576117cc61531f565b14611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f686173206e6f74206265656e2076616c6964617465640000000000000000000060648201526084016109e0565b603b5463ffffffff1663ffffffff166118e38373ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118da9190615473565b63ffffffff1690565b63ffffffff1614611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b603b5467ffffffffffffffff64010000000090910481169082161015611a44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652063726560448201527f61746564206265666f7265207265737065637465642067616d6520747970652060648201527f7761732075706461746564000000000000000000000000000000000000000000608482015260a4016109e0565b7f0000000000000000000000000000000000000000000000000000000000000000611ab38373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d6000803e3d6000fd5b611ac79067ffffffffffffffff164261545c565b11611b54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f696e206169722d6761700000000000000000000000000000000000000000000060648201526084016109e0565b60008581526033602052604090205460ff1615611bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016109e0565b5050505050565b611c02610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c66576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff166000908152603a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611cbd610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d21576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b805463ffffffff929092167fffffffffffffffffffffffffffffffffffffffff000000000000000000000000909216919091176401000000004267ffffffffffffffff1602179055565b565b611d776112d6565b15611dae576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611db881336108fc565b50565b600054610100900460ff1615808015611ddb5750600054600160ff909116105b80611df55750303b158015611df5575060005460ff166001145b611e81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109e0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611edf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8881169190911790925560378054909116868316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008684160217905560325416611fff576032805461dead7fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055603b80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166401000000004267ffffffffffffffff16027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000161763ffffffff84161790555b6120076124d5565b8015611bf357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600061207d826010615490565b612089906152086154c0565b92915050565b603c60205281600052604060002081815481106120ab57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090612126907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361545c565b905060006121326125e8565b90506000816020015160ff16826000015163ffffffff16612153919061551b565b9050821561228a5760015460009061218a908390700100000000000000000000000000000000900467ffffffffffffffff16615583565b90506000836040015160ff16836121a191906155f7565b6001546121c19084906fffffffffffffffffffffffffffffffff166155f7565b6121cb919061551b565b60015490915060009061221c906121f59084906fffffffffffffffffffffffffffffffff166156b3565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff166126a9565b9050600186111561224b576122486121f582876040015160ff1660018a612243919061545c565b6126c8565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b600180548691906010906122bd908490700100000000000000000000000000000000900467ffffffffffffffff166154c0565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561234a576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090612376906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615727565b9050600061238848633b9aca0061271d565b6123929083615764565b905060005a6123a1908861545c565b9050808211156123bd576123bd6123b8828461545c565b612734565b5050505050505050565b80516020808301516040808501516060860151608087015160a088015193516000976123f7979096959101615778565b604051602081830303815290604052805190602001209050919050565b6000806000612424866000612762565b90508061245a576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600081600001518260200151836040015184606001516040516020016123f7949392919093845260208401929092526040830152606082015260800190565b6000806124bd86612780565b90506124cb818686866127b2565b9695505050505050565b600054610100900460ff1661256c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e0565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003611d6d5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612685573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed91906157e5565b60006126be6126b885856127e2565b836127f2565b90505b9392505050565b6000670de0b6b3a76400006127096126e0858361551b565b6126f290670de0b6b3a7640000615583565b61270485670de0b6b3a76400006155f7565b612801565b61271390866155f7565b6126be919061551b565b60008183101561272d57816126c1565b5090919050565b6000805a90505b825a612747908361545c565b101561275d57612756826158a1565b915061273b565b505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6060818051906020012060405160200161279c91815260200190565b6040516020818303038152906040529050919050565b60006127d9846127c3878686612832565b8051602091820120825192909101919091201490565b95945050505050565b60008183121561272d57816126c1565b600081831261272d57816126c1565b60006126c1670de0b6b3a764000083612819866132b0565b61282391906155f7565b61282d919061551b565b6134f4565b6060600084511161289f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b6579000000000000000000000060448201526064016109e0565b60006128aa84613733565b905060006128b78661381f565b90506000846040516020016128ce91815260200190565b60405160208183030381529060405290506000805b8451811015613227576000858281518110612900576129006158d9565b60200260200101519050845183111561299b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016109e0565b82600003612a5457805180516020918201206040516129e9926129c392910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612a4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016109e0565b612bab565b805151602011612b0a5780518051602091820120604051612a7e926129c392910190815260200190565b612a4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016109e0565b805184516020808701919091208251919092012014612bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016109e0565b612bb760106001615908565b81602001515103612d935784518303612d2b57612bf18160200151601081518110612be457612be46158d9565b6020026020010151613882565b96506000875111612c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016109e0565b60018651612c92919061545c565b8214612d20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016109e0565b5050505050506126c1565b6000858481518110612d3f57612d3f6158d9565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110612d6a57612d6a6158d9565b60200260200101519050612d7d816139e2565b9550612d8a600186615908565b94505050613214565b60028160200151510361318c576000612dab82613a07565b9050600081600081518110612dc257612dc26158d9565b016020015160f81c90506000612dd9600283615920565b612de4906002615942565b90506000612df5848360ff16613a2b565b90506000612e038a89613a2b565b90506000612e118383613a61565b905080835114612ea3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016109e0565b60ff851660021480612eb8575060ff85166003145b156130a75780825114612f4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016109e0565b612f678760200151600181518110612be457612be46158d9565b9c5060008d5111612ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016109e0565b60018c51613008919061545c565b8814613096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016109e0565b5050505050505050505050506126c1565b60ff851615806130ba575060ff85166001145b156130f9576130e687602001516001815181106130d9576130d96158d9565b60200260200101516139e2565b99506130f2818a615908565b9850613181565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016109e0565b505050505050613214565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016109e0565b508061321f816158a1565b9150506128e3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016109e0565b600080821361331b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b6000606061332884613b15565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361352557506000919050565b680755bf798b4a1bf1e58212613597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016109e0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff81111561375157613751614c38565b60405190808252806020026020018201604052801561379657816020015b604080518082019091526060808252602082015281526020019060019003908161376f5790505b50915060005b818110156138185760405180604001604052808583815181106137c1576137c16158d9565b602002602001015181526020016137f08684815181106137e3576137e36158d9565b6020026020010151613beb565b815250838281518110613805576138056158d9565b602090810291909101015260010161379c565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613877578060011b82018184015160001a8060041c8253600f811660018301535050600101613849565b509295945050505050565b6060600080600061389285613bfe565b9194509250905060008160018111156138ad576138ad61531f565b1461393a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016109e0565b6139448284615908565b8551146139d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016109e0565b6127d98560200151848461466b565b606060208260000151106139fe576139f982613882565b612089565b612089826146ff565b6060612089613a268360200151600081518110612be457612be46158d9565b61381f565b606082518210613a4a5750604080516020810190915260008152612089565b6126c18383848651613a5c919061545c565b614715565b6000808251845110613a74578251613a77565b83515b90505b8082108015613afe5750828281518110613a9657613a966158d9565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613ad557613ad56158d9565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613b0e57816001019150613a7a565b5092915050565b6000808211613b80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060612089613bf9836148ed565b6149d6565b600080600080846000015111613cbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016109e0565b6020840151805160001a607f8111613ce1576000600160009450945094505050614664565b60b78111613eef576000613cf660808361545c565b905080876000015111613db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016109e0565b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082141580613e2a57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613edc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016109e0565b5060019550935060009250614664915050565b60bf811161423d576000613f0460b78361545c565b905080876000015111613fbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016109e0565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361409d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016109e0565b600184015160088302610100031c60378111614161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016109e0565b61416b8184615908565b895111614220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016109e0565b61422b836001615908565b97509550600094506146649350505050565b60f7811161431e57600061425260c08361545c565b90508087600001511161430d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016109e0565b600195509350849250614664915050565b600061432b60f78361545c565b9050808760000151116143e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016109e0565b60018301517fff000000000000000000000000000000000000000000000000000000000000001660008190036144c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016109e0565b600184015160088302610100031c60378111614588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016109e0565b6145928184615908565b895111614647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016109e0565b614652836001615908565b97509550600194506146649350505050565b9193909250565b60608167ffffffffffffffff81111561468657614686614c38565b6040519080825280601f01601f1916602001820160405280156146b0576020820181803683370190505b50905081156126c15760006146c58486615908565b90506020820160005b848110156146e65782810151828201526020016146ce565b848111156146f5576000858301525b5050509392505050565b606061208982602001516000846000015161466b565b60608182601f011015614784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b8282840110156147f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b8183018451101561485d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016109e0565b60608215801561487c57604051915060008252602082016040526148e4565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156148b557805183526020928301920161489d565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116149b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016109e0565b50604080518082019091528151815260209182019181019190915290565b606060008060006149e685613bfe565b919450925090506001816001811115614a0157614a0161531f565b14614a8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016109e0565b8451614a9a8385615908565b14614b27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016109e0565b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081614b3e5790505093506000835b8651811015614c2c57600080614bb16040518060400160405280858c60000151614b95919061545c565b8152602001858c60200151614baa9190615908565b9052613bfe565b509150915060405180604001604052808383614bcd9190615908565b8152602001848b60200151614be29190615908565b815250888581518110614bf757614bf76158d9565b6020908102919091010152614c0d600185615908565b9350614c198183615908565b614c239084615908565b92505050614b6b565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614cae57614cae614c38565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611db857600080fd5b600082601f830112614ce957600080fd5b813567ffffffffffffffff811115614d0357614d03614c38565b614d3460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614c67565b818152846020838601011115614d4957600080fd5b816020850160208301376000918101602001919091529392505050565b600060c08284031215614d7857600080fd5b60405160c0810167ffffffffffffffff8282108183111715614d9c57614d9c614c38565b816040528293508435835260208501359150614db782614cb6565b81602084015260408501359150614dcd82614cb6565b816040840152606085013560608401526080850135608084015260a0850135915080821115614dfb57600080fd5b50614e0885828601614cd8565b60a0830152505092915050565b60008060408385031215614e2857600080fd5b823567ffffffffffffffff811115614e3f57600080fd5b614e4b85828601614d66565b9250506020830135614e5c81614cb6565b809150509250929050565b600060208284031215614e7957600080fd5b81356126c181614cb6565b600080600080600085870360e0811215614e9d57600080fd5b863567ffffffffffffffff80821115614eb557600080fd5b614ec18a838b01614d66565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614efa57600080fd5b60408901955060c0890135925080831115614f1457600080fd5b828901925089601f840112614f2857600080fd5b8235915080821115614f3957600080fd5b508860208260051b8401011115614f4f57600080fd5b959894975092955050506020019190565b600060208284031215614f7257600080fd5b5035919050565b60005b83811015614f94578181015183820152602001614f7c565b83811115610b545750506000910152565b60008151808452614fbd816020860160208601614f79565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006126c16020830184614fa5565b6000806040838503121561501557600080fd5b823591506020830135614e5c81614cb6565b63ffffffff81168114611db857600080fd5b60006020828403121561504b57600080fd5b81356126c181615027565b60006020828403121561506857600080fd5b813567ffffffffffffffff81111561507f57600080fd5b61508b84828501614d66565b949350505050565b600080600080608085870312156150a957600080fd5b84356150b481614cb6565b935060208501356150c481614cb6565b925060408501356150d481614cb6565b915060608501356150e481615027565b939692955090935050565b67ffffffffffffffff81168114611db857600080fd5b60006020828403121561511757600080fd5b81356126c1816150ef565b6000806040838503121561513557600080fd5b50508035926020909101359150565b8015158114611db857600080fd5b600080600080600060a0868803121561516a57600080fd5b853561517581614cb6565b945060208601359350604086013561518c816150ef565b9250606086013561519c81615144565b9150608086013567ffffffffffffffff8111156151b857600080fd5b6151c488828901614cd8565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251615225816049850160208701614f79565b919091016049019695505050505050565b60006020828403121561524857600080fd5b81516126c181614cb6565b60008060006060848603121561526857600080fd5b835161527381615027565b6020850151909350615284816150ef565b604085015190925061529581614cb6565b809150509250925092565b6000602082840312156152b257600080fd5b5051919050565b6000608082840312156152cb57600080fd5b6040516080810181811067ffffffffffffffff821117156152ee576152ee614c38565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020828403121561536057600080fd5b8151600381106126c157600080fd5b600067ffffffffffffffff8084111561538a5761538a614c38565b8360051b602061539b818301614c67565b8681529185019181810190368411156153b357600080fd5b865b848110156153e7578035868111156153cd5760008081fd5b6153d936828b01614cd8565b8452509183019183016153b5565b50979650505050505050565b60006020828403121561540557600080fd5b81516126c181615144565b60006020828403121561542257600080fd5b81516126c1816150ef565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561546e5761546e61542d565b500390565b60006020828403121561548557600080fd5b81516126c181615027565b600067ffffffffffffffff808316818516818304811182151516156154b7576154b761542d565b02949350505050565b600067ffffffffffffffff8083168185168083038211156154e3576154e361542d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261552a5761552a6154ec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561557e5761557e61542d565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156155bd576155bd61542d565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156155f1576155f161542d565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156156385761563861542d565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156156735761567361542d565b6000871292508782058712848416161561568f5761568f61542d565b878505871281841616156156a5576156a561542d565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156156ed576156ed61542d565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156157215761572161542d565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561575f5761575f61542d565b500290565b600082615773576157736154ec565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526157c360c0830184614fa5565b98975050505050505050565b805160ff811681146157e057600080fd5b919050565b600060c082840312156157f757600080fd5b60405160c0810181811067ffffffffffffffff8211171561581a5761581a614c38565b604052825161582881615027565b8152615836602084016157cf565b6020820152615847604084016157cf565b6040820152606083015161585a81615027565b6060820152608083015161586d81615027565b608082015260a08301516fffffffffffffffffffffffffffffffff8116811461589557600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036158d2576158d261542d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561591b5761591b61542d565b500190565b600060ff831680615933576159336154ec565b8060ff84160691505092915050565b600060ff821660ff84168082101561595c5761595c61542d565b9003939250505056fea164736f6c634300080f000a",
+}
+
+// OptimismPortal2ABI is the input ABI used to generate the binding from.
+// Deprecated: Use OptimismPortal2MetaData.ABI instead.
+var OptimismPortal2ABI = OptimismPortal2MetaData.ABI
+
+// OptimismPortal2Bin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use OptimismPortal2MetaData.Bin instead.
+var OptimismPortal2Bin = OptimismPortal2MetaData.Bin
+
+// DeployOptimismPortal2 deploys a new Ethereum contract, binding an instance of OptimismPortal2 to it.
+func DeployOptimismPortal2(auth *bind.TransactOpts, backend bind.ContractBackend, _proofMaturityDelaySeconds *big.Int, _disputeGameFinalityDelaySeconds *big.Int) (common.Address, *types.Transaction, *OptimismPortal2, error) {
+	parsed, err := OptimismPortal2MetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(OptimismPortal2Bin), backend, _proofMaturityDelaySeconds, _disputeGameFinalityDelaySeconds)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &OptimismPortal2{OptimismPortal2Caller: OptimismPortal2Caller{contract: contract}, OptimismPortal2Transactor: OptimismPortal2Transactor{contract: contract}, OptimismPortal2Filterer: OptimismPortal2Filterer{contract: contract}}, nil
+}
+
+// OptimismPortal2 is an auto generated Go binding around an Ethereum contract.
+type OptimismPortal2 struct {
+	OptimismPortal2Caller     // Read-only binding to the contract
+	OptimismPortal2Transactor // Write-only binding to the contract
+	OptimismPortal2Filterer   // Log filterer for contract events
+}
+
+// OptimismPortal2Caller is an auto generated read-only Go binding around an Ethereum contract.
+type OptimismPortal2Caller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortal2Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type OptimismPortal2Transactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortal2Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type OptimismPortal2Filterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortal2Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type OptimismPortal2Session struct {
+	Contract     *OptimismPortal2  // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// OptimismPortal2CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type OptimismPortal2CallerSession struct {
+	Contract *OptimismPortal2Caller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts          // Call options to use throughout this session
+}
+
+// OptimismPortal2TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type OptimismPortal2TransactorSession struct {
+	Contract     *OptimismPortal2Transactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
+}
+
+// OptimismPortal2Raw is an auto generated low-level Go binding around an Ethereum contract.
+type OptimismPortal2Raw struct {
+	Contract *OptimismPortal2 // Generic contract binding to access the raw methods on
+}
+
+// OptimismPortal2CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type OptimismPortal2CallerRaw struct {
+	Contract *OptimismPortal2Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// OptimismPortal2TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type OptimismPortal2TransactorRaw struct {
+	Contract *OptimismPortal2Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewOptimismPortal2 creates a new instance of OptimismPortal2, bound to a specific deployed contract.
+func NewOptimismPortal2(address common.Address, backend bind.ContractBackend) (*OptimismPortal2, error) {
+	contract, err := bindOptimismPortal2(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal2{OptimismPortal2Caller: OptimismPortal2Caller{contract: contract}, OptimismPortal2Transactor: OptimismPortal2Transactor{contract: contract}, OptimismPortal2Filterer: OptimismPortal2Filterer{contract: contract}}, nil
+}
+
+// NewOptimismPortal2Caller creates a new read-only instance of OptimismPortal2, bound to a specific deployed contract.
+func NewOptimismPortal2Caller(address common.Address, caller bind.ContractCaller) (*OptimismPortal2Caller, error) {
+	contract, err := bindOptimismPortal2(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal2Caller{contract: contract}, nil
+}
+
+// NewOptimismPortal2Transactor creates a new write-only instance of OptimismPortal2, bound to a specific deployed contract.
+func NewOptimismPortal2Transactor(address common.Address, transactor bind.ContractTransactor) (*OptimismPortal2Transactor, error) {
+	contract, err := bindOptimismPortal2(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal2Transactor{contract: contract}, nil
+}
+
+// NewOptimismPortal2Filterer creates a new log filterer instance of OptimismPortal2, bound to a specific deployed contract.
+func NewOptimismPortal2Filterer(address common.Address, filterer bind.ContractFilterer) (*OptimismPortal2Filterer, error) {
+	contract, err := bindOptimismPortal2(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal2Filterer{contract: contract}, nil
+}
+
+// bindOptimismPortal2 binds a generic wrapper to an already deployed contract.
+func bindOptimismPortal2(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(OptimismPortal2ABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismPortal2 *OptimismPortal2Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismPortal2.Contract.OptimismPortal2Caller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismPortal2 *OptimismPortal2Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.OptimismPortal2Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismPortal2 *OptimismPortal2Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.OptimismPortal2Transactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismPortal2 *OptimismPortal2CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismPortal2.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismPortal2 *OptimismPortal2TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismPortal2 *OptimismPortal2TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.contract.Transact(opts, method, params...)
+}
+
+// CheckWithdrawal is a free data retrieval call binding the contract method 0x71c1566e.
+//
+// Solidity: function checkWithdrawal(bytes32 _withdrawalHash, address _proofSubmitter) view returns()
+func (_OptimismPortal2 *OptimismPortal2Caller) CheckWithdrawal(opts *bind.CallOpts, _withdrawalHash [32]byte, _proofSubmitter common.Address) error {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "checkWithdrawal", _withdrawalHash, _proofSubmitter)
+
+	if err != nil {
+		return err
+	}
+
+	return err
+
+}
+
+// CheckWithdrawal is a free data retrieval call binding the contract method 0x71c1566e.
+//
+// Solidity: function checkWithdrawal(bytes32 _withdrawalHash, address _proofSubmitter) view returns()
+func (_OptimismPortal2 *OptimismPortal2Session) CheckWithdrawal(_withdrawalHash [32]byte, _proofSubmitter common.Address) error {
+	return _OptimismPortal2.Contract.CheckWithdrawal(&_OptimismPortal2.CallOpts, _withdrawalHash, _proofSubmitter)
+}
+
+// CheckWithdrawal is a free data retrieval call binding the contract method 0x71c1566e.
+//
+// Solidity: function checkWithdrawal(bytes32 _withdrawalHash, address _proofSubmitter) view returns()
+func (_OptimismPortal2 *OptimismPortal2CallerSession) CheckWithdrawal(_withdrawalHash [32]byte, _proofSubmitter common.Address) error {
+	return _OptimismPortal2.Contract.CheckWithdrawal(&_OptimismPortal2.CallOpts, _withdrawalHash, _proofSubmitter)
+}
+
+// DisputeGameBlacklist is a free data retrieval call binding the contract method 0x45884d32.
+//
+// Solidity: function disputeGameBlacklist(address ) view returns(bool)
+func (_OptimismPortal2 *OptimismPortal2Caller) DisputeGameBlacklist(opts *bind.CallOpts, arg0 common.Address) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "disputeGameBlacklist", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// DisputeGameBlacklist is a free data retrieval call binding the contract method 0x45884d32.
+//
+// Solidity: function disputeGameBlacklist(address ) view returns(bool)
+func (_OptimismPortal2 *OptimismPortal2Session) DisputeGameBlacklist(arg0 common.Address) (bool, error) {
+	return _OptimismPortal2.Contract.DisputeGameBlacklist(&_OptimismPortal2.CallOpts, arg0)
+}
+
+// DisputeGameBlacklist is a free data retrieval call binding the contract method 0x45884d32.
+//
+// Solidity: function disputeGameBlacklist(address ) view returns(bool)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) DisputeGameBlacklist(arg0 common.Address) (bool, error) {
+	return _OptimismPortal2.Contract.DisputeGameBlacklist(&_OptimismPortal2.CallOpts, arg0)
+}
+
+// DisputeGameFactory is a free data retrieval call binding the contract method 0xf2b4e617.
+//
+// Solidity: function disputeGameFactory() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Caller) DisputeGameFactory(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "disputeGameFactory")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// DisputeGameFactory is a free data retrieval call binding the contract method 0xf2b4e617.
+//
+// Solidity: function disputeGameFactory() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Session) DisputeGameFactory() (common.Address, error) {
+	return _OptimismPortal2.Contract.DisputeGameFactory(&_OptimismPortal2.CallOpts)
+}
+
+// DisputeGameFactory is a free data retrieval call binding the contract method 0xf2b4e617.
+//
+// Solidity: function disputeGameFactory() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) DisputeGameFactory() (common.Address, error) {
+	return _OptimismPortal2.Contract.DisputeGameFactory(&_OptimismPortal2.CallOpts)
+}
+
+// DisputeGameFinalityDelaySeconds is a free data retrieval call binding the contract method 0x952b2797.
+//
+// Solidity: function disputeGameFinalityDelaySeconds() view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2Caller) DisputeGameFinalityDelaySeconds(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "disputeGameFinalityDelaySeconds")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// DisputeGameFinalityDelaySeconds is a free data retrieval call binding the contract method 0x952b2797.
+//
+// Solidity: function disputeGameFinalityDelaySeconds() view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2Session) DisputeGameFinalityDelaySeconds() (*big.Int, error) {
+	return _OptimismPortal2.Contract.DisputeGameFinalityDelaySeconds(&_OptimismPortal2.CallOpts)
+}
+
+// DisputeGameFinalityDelaySeconds is a free data retrieval call binding the contract method 0x952b2797.
+//
+// Solidity: function disputeGameFinalityDelaySeconds() view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) DisputeGameFinalityDelaySeconds() (*big.Int, error) {
+	return _OptimismPortal2.Contract.DisputeGameFinalityDelaySeconds(&_OptimismPortal2.CallOpts)
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal2 *OptimismPortal2Caller) FinalizedWithdrawals(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "finalizedWithdrawals", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal2 *OptimismPortal2Session) FinalizedWithdrawals(arg0 [32]byte) (bool, error) {
+	return _OptimismPortal2.Contract.FinalizedWithdrawals(&_OptimismPortal2.CallOpts, arg0)
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) FinalizedWithdrawals(arg0 [32]byte) (bool, error) {
+	return _OptimismPortal2.Contract.FinalizedWithdrawals(&_OptimismPortal2.CallOpts, arg0)
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Caller) Guardian(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "guardian")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Session) Guardian() (common.Address, error) {
+	return _OptimismPortal2.Contract.Guardian(&_OptimismPortal2.CallOpts)
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) Guardian() (common.Address, error) {
+	return _OptimismPortal2.Contract.Guardian(&_OptimismPortal2.CallOpts)
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Caller) L2Sender(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "l2Sender")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Session) L2Sender() (common.Address, error) {
+	return _OptimismPortal2.Contract.L2Sender(&_OptimismPortal2.CallOpts)
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) L2Sender() (common.Address, error) {
+	return _OptimismPortal2.Contract.L2Sender(&_OptimismPortal2.CallOpts)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal2 *OptimismPortal2Caller) MinimumGasLimit(opts *bind.CallOpts, _byteCount uint64) (uint64, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "minimumGasLimit", _byteCount)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal2 *OptimismPortal2Session) MinimumGasLimit(_byteCount uint64) (uint64, error) {
+	return _OptimismPortal2.Contract.MinimumGasLimit(&_OptimismPortal2.CallOpts, _byteCount)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) MinimumGasLimit(_byteCount uint64) (uint64, error) {
+	return _OptimismPortal2.Contract.MinimumGasLimit(&_OptimismPortal2.CallOpts, _byteCount)
+}
+
+// NumProofSubmitters is a free data retrieval call binding the contract method 0x513747ab.
+//
+// Solidity: function numProofSubmitters(bytes32 _withdrawalHash) view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2Caller) NumProofSubmitters(opts *bind.CallOpts, _withdrawalHash [32]byte) (*big.Int, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "numProofSubmitters", _withdrawalHash)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// NumProofSubmitters is a free data retrieval call binding the contract method 0x513747ab.
+//
+// Solidity: function numProofSubmitters(bytes32 _withdrawalHash) view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2Session) NumProofSubmitters(_withdrawalHash [32]byte) (*big.Int, error) {
+	return _OptimismPortal2.Contract.NumProofSubmitters(&_OptimismPortal2.CallOpts, _withdrawalHash)
+}
+
+// NumProofSubmitters is a free data retrieval call binding the contract method 0x513747ab.
+//
+// Solidity: function numProofSubmitters(bytes32 _withdrawalHash) view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) NumProofSubmitters(_withdrawalHash [32]byte) (*big.Int, error) {
+	return _OptimismPortal2.Contract.NumProofSubmitters(&_OptimismPortal2.CallOpts, _withdrawalHash)
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal2 *OptimismPortal2Caller) Params(opts *bind.CallOpts) (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "params")
+
+	outstruct := new(struct {
+		PrevBaseFee   *big.Int
+		PrevBoughtGas uint64
+		PrevBlockNum  uint64
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.PrevBaseFee = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+	outstruct.PrevBoughtGas = *abi.ConvertType(out[1], new(uint64)).(*uint64)
+	outstruct.PrevBlockNum = *abi.ConvertType(out[2], new(uint64)).(*uint64)
+
+	return *outstruct, err
+
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal2 *OptimismPortal2Session) Params() (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	return _OptimismPortal2.Contract.Params(&_OptimismPortal2.CallOpts)
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) Params() (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	return _OptimismPortal2.Contract.Params(&_OptimismPortal2.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_OptimismPortal2 *OptimismPortal2Caller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_OptimismPortal2 *OptimismPortal2Session) Paused() (bool, error) {
+	return _OptimismPortal2.Contract.Paused(&_OptimismPortal2.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) Paused() (bool, error) {
+	return _OptimismPortal2.Contract.Paused(&_OptimismPortal2.CallOpts)
+}
+
+// ProofMaturityDelaySeconds is a free data retrieval call binding the contract method 0xbf653a5c.
+//
+// Solidity: function proofMaturityDelaySeconds() view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2Caller) ProofMaturityDelaySeconds(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "proofMaturityDelaySeconds")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// ProofMaturityDelaySeconds is a free data retrieval call binding the contract method 0xbf653a5c.
+//
+// Solidity: function proofMaturityDelaySeconds() view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2Session) ProofMaturityDelaySeconds() (*big.Int, error) {
+	return _OptimismPortal2.Contract.ProofMaturityDelaySeconds(&_OptimismPortal2.CallOpts)
+}
+
+// ProofMaturityDelaySeconds is a free data retrieval call binding the contract method 0xbf653a5c.
+//
+// Solidity: function proofMaturityDelaySeconds() view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) ProofMaturityDelaySeconds() (*big.Int, error) {
+	return _OptimismPortal2.Contract.ProofMaturityDelaySeconds(&_OptimismPortal2.CallOpts)
+}
+
+// ProofSubmitters is a free data retrieval call binding the contract method 0xa3860f48.
+//
+// Solidity: function proofSubmitters(bytes32 , uint256 ) view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Caller) ProofSubmitters(opts *bind.CallOpts, arg0 [32]byte, arg1 *big.Int) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "proofSubmitters", arg0, arg1)
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// ProofSubmitters is a free data retrieval call binding the contract method 0xa3860f48.
+//
+// Solidity: function proofSubmitters(bytes32 , uint256 ) view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Session) ProofSubmitters(arg0 [32]byte, arg1 *big.Int) (common.Address, error) {
+	return _OptimismPortal2.Contract.ProofSubmitters(&_OptimismPortal2.CallOpts, arg0, arg1)
+}
+
+// ProofSubmitters is a free data retrieval call binding the contract method 0xa3860f48.
+//
+// Solidity: function proofSubmitters(bytes32 , uint256 ) view returns(address)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) ProofSubmitters(arg0 [32]byte, arg1 *big.Int) (common.Address, error) {
+	return _OptimismPortal2.Contract.ProofSubmitters(&_OptimismPortal2.CallOpts, arg0, arg1)
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xbb2c727e.
+//
+// Solidity: function provenWithdrawals(bytes32 , address ) view returns(address disputeGameProxy, uint64 timestamp)
+func (_OptimismPortal2 *OptimismPortal2Caller) ProvenWithdrawals(opts *bind.CallOpts, arg0 [32]byte, arg1 common.Address) (struct {
+	DisputeGameProxy common.Address
+	Timestamp        uint64
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "provenWithdrawals", arg0, arg1)
+
+	outstruct := new(struct {
+		DisputeGameProxy common.Address
+		Timestamp        uint64
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.DisputeGameProxy = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+	outstruct.Timestamp = *abi.ConvertType(out[1], new(uint64)).(*uint64)
+
+	return *outstruct, err
+
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xbb2c727e.
+//
+// Solidity: function provenWithdrawals(bytes32 , address ) view returns(address disputeGameProxy, uint64 timestamp)
+func (_OptimismPortal2 *OptimismPortal2Session) ProvenWithdrawals(arg0 [32]byte, arg1 common.Address) (struct {
+	DisputeGameProxy common.Address
+	Timestamp        uint64
+}, error) {
+	return _OptimismPortal2.Contract.ProvenWithdrawals(&_OptimismPortal2.CallOpts, arg0, arg1)
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xbb2c727e.
+//
+// Solidity: function provenWithdrawals(bytes32 , address ) view returns(address disputeGameProxy, uint64 timestamp)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) ProvenWithdrawals(arg0 [32]byte, arg1 common.Address) (struct {
+	DisputeGameProxy common.Address
+	Timestamp        uint64
+}, error) {
+	return _OptimismPortal2.Contract.ProvenWithdrawals(&_OptimismPortal2.CallOpts, arg0, arg1)
+}
+
+// RespectedGameType is a free data retrieval call binding the contract method 0x3c9f397c.
+//
+// Solidity: function respectedGameType() view returns(uint32)
+func (_OptimismPortal2 *OptimismPortal2Caller) RespectedGameType(opts *bind.CallOpts) (uint32, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "respectedGameType")
+
+	if err != nil {
+		return *new(uint32), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+	return out0, err
+
+}
+
+// RespectedGameType is a free data retrieval call binding the contract method 0x3c9f397c.
+//
+// Solidity: function respectedGameType() view returns(uint32)
+func (_OptimismPortal2 *OptimismPortal2Session) RespectedGameType() (uint32, error) {
+	return _OptimismPortal2.Contract.RespectedGameType(&_OptimismPortal2.CallOpts)
+}
+
+// RespectedGameType is a free data retrieval call binding the contract method 0x3c9f397c.
+//
+// Solidity: function respectedGameType() view returns(uint32)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) RespectedGameType() (uint32, error) {
+	return _OptimismPortal2.Contract.RespectedGameType(&_OptimismPortal2.CallOpts)
+}
+
+// RespectedGameTypeUpdatedAt is a free data retrieval call binding the contract method 0x4fd0434c.
+//
+// Solidity: function respectedGameTypeUpdatedAt() view returns(uint64)
+func (_OptimismPortal2 *OptimismPortal2Caller) RespectedGameTypeUpdatedAt(opts *bind.CallOpts) (uint64, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "respectedGameTypeUpdatedAt")
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// RespectedGameTypeUpdatedAt is a free data retrieval call binding the contract method 0x4fd0434c.
+//
+// Solidity: function respectedGameTypeUpdatedAt() view returns(uint64)
+func (_OptimismPortal2 *OptimismPortal2Session) RespectedGameTypeUpdatedAt() (uint64, error) {
+	return _OptimismPortal2.Contract.RespectedGameTypeUpdatedAt(&_OptimismPortal2.CallOpts)
+}
+
+// RespectedGameTypeUpdatedAt is a free data retrieval call binding the contract method 0x4fd0434c.
+//
+// Solidity: function respectedGameTypeUpdatedAt() view returns(uint64)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) RespectedGameTypeUpdatedAt() (uint64, error) {
+	return _OptimismPortal2.Contract.RespectedGameTypeUpdatedAt(&_OptimismPortal2.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Caller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Session) SuperchainConfig() (common.Address, error) {
+	return _OptimismPortal2.Contract.SuperchainConfig(&_OptimismPortal2.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) SuperchainConfig() (common.Address, error) {
+	return _OptimismPortal2.Contract.SuperchainConfig(&_OptimismPortal2.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Caller) SystemConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "systemConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Session) SystemConfig() (common.Address, error) {
+	return _OptimismPortal2.Contract.SystemConfig(&_OptimismPortal2.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) SystemConfig() (common.Address, error) {
+	return _OptimismPortal2.Contract.SystemConfig(&_OptimismPortal2.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal2 *OptimismPortal2Caller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal2 *OptimismPortal2Session) Version() (string, error) {
+	return _OptimismPortal2.Contract.Version(&_OptimismPortal2.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) Version() (string, error) {
+	return _OptimismPortal2.Contract.Version(&_OptimismPortal2.CallOpts)
+}
+
+// BlacklistDisputeGame is a paid mutator transaction binding the contract method 0x7d6be8dc.
+//
+// Solidity: function blacklistDisputeGame(address _disputeGame) returns()
+func (_OptimismPortal2 *OptimismPortal2Transactor) BlacklistDisputeGame(opts *bind.TransactOpts, _disputeGame common.Address) (*types.Transaction, error) {
+	return _OptimismPortal2.contract.Transact(opts, "blacklistDisputeGame", _disputeGame)
+}
+
+// BlacklistDisputeGame is a paid mutator transaction binding the contract method 0x7d6be8dc.
+//
+// Solidity: function blacklistDisputeGame(address _disputeGame) returns()
+func (_OptimismPortal2 *OptimismPortal2Session) BlacklistDisputeGame(_disputeGame common.Address) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.BlacklistDisputeGame(&_OptimismPortal2.TransactOpts, _disputeGame)
+}
+
+// BlacklistDisputeGame is a paid mutator transaction binding the contract method 0x7d6be8dc.
+//
+// Solidity: function blacklistDisputeGame(address _disputeGame) returns()
+func (_OptimismPortal2 *OptimismPortal2TransactorSession) BlacklistDisputeGame(_disputeGame common.Address) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.BlacklistDisputeGame(&_OptimismPortal2.TransactOpts, _disputeGame)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal2 *OptimismPortal2Transactor) DepositTransaction(opts *bind.TransactOpts, _to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal2.contract.Transact(opts, "depositTransaction", _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal2 *OptimismPortal2Session) DepositTransaction(_to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.DepositTransaction(&_OptimismPortal2.TransactOpts, _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal2 *OptimismPortal2TransactorSession) DepositTransaction(_to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.DepositTransaction(&_OptimismPortal2.TransactOpts, _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal2 *OptimismPortal2Transactor) DonateETH(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal2.contract.Transact(opts, "donateETH")
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal2 *OptimismPortal2Session) DonateETH() (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.DonateETH(&_OptimismPortal2.TransactOpts)
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal2 *OptimismPortal2TransactorSession) DonateETH() (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.DonateETH(&_OptimismPortal2.TransactOpts)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal2 *OptimismPortal2Transactor) FinalizeWithdrawalTransaction(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal2.contract.Transact(opts, "finalizeWithdrawalTransaction", _tx)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal2 *OptimismPortal2Session) FinalizeWithdrawalTransaction(_tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal2.TransactOpts, _tx)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal2 *OptimismPortal2TransactorSession) FinalizeWithdrawalTransaction(_tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal2.TransactOpts, _tx)
+}
+
+// FinalizeWithdrawalTransactionExternalProof is a paid mutator transaction binding the contract method 0x43ca1c50.
+//
+// Solidity: function finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes) _tx, address _proofSubmitter) returns()
+func (_OptimismPortal2 *OptimismPortal2Transactor) FinalizeWithdrawalTransactionExternalProof(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction, _proofSubmitter common.Address) (*types.Transaction, error) {
+	return _OptimismPortal2.contract.Transact(opts, "finalizeWithdrawalTransactionExternalProof", _tx, _proofSubmitter)
+}
+
+// FinalizeWithdrawalTransactionExternalProof is a paid mutator transaction binding the contract method 0x43ca1c50.
+//
+// Solidity: function finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes) _tx, address _proofSubmitter) returns()
+func (_OptimismPortal2 *OptimismPortal2Session) FinalizeWithdrawalTransactionExternalProof(_tx TypesWithdrawalTransaction, _proofSubmitter common.Address) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.FinalizeWithdrawalTransactionExternalProof(&_OptimismPortal2.TransactOpts, _tx, _proofSubmitter)
+}
+
+// FinalizeWithdrawalTransactionExternalProof is a paid mutator transaction binding the contract method 0x43ca1c50.
+//
+// Solidity: function finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes) _tx, address _proofSubmitter) returns()
+func (_OptimismPortal2 *OptimismPortal2TransactorSession) FinalizeWithdrawalTransactionExternalProof(_tx TypesWithdrawalTransaction, _proofSubmitter common.Address) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.FinalizeWithdrawalTransactionExternalProof(&_OptimismPortal2.TransactOpts, _tx, _proofSubmitter)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x8e819e54.
+//
+// Solidity: function initialize(address _disputeGameFactory, address _systemConfig, address _superchainConfig, uint32 _initialRespectedGameType) returns()
+func (_OptimismPortal2 *OptimismPortal2Transactor) Initialize(opts *bind.TransactOpts, _disputeGameFactory common.Address, _systemConfig common.Address, _superchainConfig common.Address, _initialRespectedGameType uint32) (*types.Transaction, error) {
+	return _OptimismPortal2.contract.Transact(opts, "initialize", _disputeGameFactory, _systemConfig, _superchainConfig, _initialRespectedGameType)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x8e819e54.
+//
+// Solidity: function initialize(address _disputeGameFactory, address _systemConfig, address _superchainConfig, uint32 _initialRespectedGameType) returns()
+func (_OptimismPortal2 *OptimismPortal2Session) Initialize(_disputeGameFactory common.Address, _systemConfig common.Address, _superchainConfig common.Address, _initialRespectedGameType uint32) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.Initialize(&_OptimismPortal2.TransactOpts, _disputeGameFactory, _systemConfig, _superchainConfig, _initialRespectedGameType)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x8e819e54.
+//
+// Solidity: function initialize(address _disputeGameFactory, address _systemConfig, address _superchainConfig, uint32 _initialRespectedGameType) returns()
+func (_OptimismPortal2 *OptimismPortal2TransactorSession) Initialize(_disputeGameFactory common.Address, _systemConfig common.Address, _superchainConfig common.Address, _initialRespectedGameType uint32) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.Initialize(&_OptimismPortal2.TransactOpts, _disputeGameFactory, _systemConfig, _superchainConfig, _initialRespectedGameType)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _disputeGameIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal2 *OptimismPortal2Transactor) ProveWithdrawalTransaction(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction, _disputeGameIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal2.contract.Transact(opts, "proveWithdrawalTransaction", _tx, _disputeGameIndex, _outputRootProof, _withdrawalProof)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _disputeGameIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal2 *OptimismPortal2Session) ProveWithdrawalTransaction(_tx TypesWithdrawalTransaction, _disputeGameIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.ProveWithdrawalTransaction(&_OptimismPortal2.TransactOpts, _tx, _disputeGameIndex, _outputRootProof, _withdrawalProof)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _disputeGameIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal2 *OptimismPortal2TransactorSession) ProveWithdrawalTransaction(_tx TypesWithdrawalTransaction, _disputeGameIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.ProveWithdrawalTransaction(&_OptimismPortal2.TransactOpts, _tx, _disputeGameIndex, _outputRootProof, _withdrawalProof)
+}
+
+// SetRespectedGameType is a paid mutator transaction binding the contract method 0x7fc48504.
+//
+// Solidity: function setRespectedGameType(uint32 _gameType) returns()
+func (_OptimismPortal2 *OptimismPortal2Transactor) SetRespectedGameType(opts *bind.TransactOpts, _gameType uint32) (*types.Transaction, error) {
+	return _OptimismPortal2.contract.Transact(opts, "setRespectedGameType", _gameType)
+}
+
+// SetRespectedGameType is a paid mutator transaction binding the contract method 0x7fc48504.
+//
+// Solidity: function setRespectedGameType(uint32 _gameType) returns()
+func (_OptimismPortal2 *OptimismPortal2Session) SetRespectedGameType(_gameType uint32) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.SetRespectedGameType(&_OptimismPortal2.TransactOpts, _gameType)
+}
+
+// SetRespectedGameType is a paid mutator transaction binding the contract method 0x7fc48504.
+//
+// Solidity: function setRespectedGameType(uint32 _gameType) returns()
+func (_OptimismPortal2 *OptimismPortal2TransactorSession) SetRespectedGameType(_gameType uint32) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.SetRespectedGameType(&_OptimismPortal2.TransactOpts, _gameType)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal2 *OptimismPortal2Transactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal2.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal2 *OptimismPortal2Session) Receive() (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.Receive(&_OptimismPortal2.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal2 *OptimismPortal2TransactorSession) Receive() (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.Receive(&_OptimismPortal2.TransactOpts)
+}
+
+// OptimismPortal2InitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the OptimismPortal2 contract.
+type OptimismPortal2InitializedIterator struct {
+	Event *OptimismPortal2Initialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortal2InitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortal2Initialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortal2Initialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortal2InitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortal2InitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortal2Initialized represents a Initialized event raised by the OptimismPortal2 contract.
+type OptimismPortal2Initialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal2 *OptimismPortal2Filterer) FilterInitialized(opts *bind.FilterOpts) (*OptimismPortal2InitializedIterator, error) {
+
+	logs, sub, err := _OptimismPortal2.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal2InitializedIterator{contract: _OptimismPortal2.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal2 *OptimismPortal2Filterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *OptimismPortal2Initialized) (event.Subscription, error) {
+
+	logs, sub, err := _OptimismPortal2.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortal2Initialized)
+				if err := _OptimismPortal2.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal2 *OptimismPortal2Filterer) ParseInitialized(log types.Log) (*OptimismPortal2Initialized, error) {
+	event := new(OptimismPortal2Initialized)
+	if err := _OptimismPortal2.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortal2TransactionDepositedIterator is returned from FilterTransactionDeposited and is used to iterate over the raw logs and unpacked data for TransactionDeposited events raised by the OptimismPortal2 contract.
+type OptimismPortal2TransactionDepositedIterator struct {
+	Event *OptimismPortal2TransactionDeposited // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortal2TransactionDepositedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortal2TransactionDeposited)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortal2TransactionDeposited)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortal2TransactionDepositedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortal2TransactionDepositedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortal2TransactionDeposited represents a TransactionDeposited event raised by the OptimismPortal2 contract.
+type OptimismPortal2TransactionDeposited struct {
+	From       common.Address
+	To         common.Address
+	Version    *big.Int
+	OpaqueData []byte
+	Raw        types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransactionDeposited is a free log retrieval operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal2 *OptimismPortal2Filterer) FilterTransactionDeposited(opts *bind.FilterOpts, from []common.Address, to []common.Address, version []*big.Int) (*OptimismPortal2TransactionDepositedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+
+	logs, sub, err := _OptimismPortal2.contract.FilterLogs(opts, "TransactionDeposited", fromRule, toRule, versionRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal2TransactionDepositedIterator{contract: _OptimismPortal2.contract, event: "TransactionDeposited", logs: logs, sub: sub}, nil
+}
+
+// WatchTransactionDeposited is a free log subscription operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal2 *OptimismPortal2Filterer) WatchTransactionDeposited(opts *bind.WatchOpts, sink chan<- *OptimismPortal2TransactionDeposited, from []common.Address, to []common.Address, version []*big.Int) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+
+	logs, sub, err := _OptimismPortal2.contract.WatchLogs(opts, "TransactionDeposited", fromRule, toRule, versionRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortal2TransactionDeposited)
+				if err := _OptimismPortal2.contract.UnpackLog(event, "TransactionDeposited", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseTransactionDeposited is a log parse operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal2 *OptimismPortal2Filterer) ParseTransactionDeposited(log types.Log) (*OptimismPortal2TransactionDeposited, error) {
+	event := new(OptimismPortal2TransactionDeposited)
+	if err := _OptimismPortal2.contract.UnpackLog(event, "TransactionDeposited", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortal2WithdrawalFinalizedIterator is returned from FilterWithdrawalFinalized and is used to iterate over the raw logs and unpacked data for WithdrawalFinalized events raised by the OptimismPortal2 contract.
+type OptimismPortal2WithdrawalFinalizedIterator struct {
+	Event *OptimismPortal2WithdrawalFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortal2WithdrawalFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortal2WithdrawalFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortal2WithdrawalFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortal2WithdrawalFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortal2WithdrawalFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortal2WithdrawalFinalized represents a WithdrawalFinalized event raised by the OptimismPortal2 contract.
+type OptimismPortal2WithdrawalFinalized struct {
+	WithdrawalHash [32]byte
+	Success        bool
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawalFinalized is a free log retrieval operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal2 *OptimismPortal2Filterer) FilterWithdrawalFinalized(opts *bind.FilterOpts, withdrawalHash [][32]byte) (*OptimismPortal2WithdrawalFinalizedIterator, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+
+	logs, sub, err := _OptimismPortal2.contract.FilterLogs(opts, "WithdrawalFinalized", withdrawalHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal2WithdrawalFinalizedIterator{contract: _OptimismPortal2.contract, event: "WithdrawalFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawalFinalized is a free log subscription operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal2 *OptimismPortal2Filterer) WatchWithdrawalFinalized(opts *bind.WatchOpts, sink chan<- *OptimismPortal2WithdrawalFinalized, withdrawalHash [][32]byte) (event.Subscription, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+
+	logs, sub, err := _OptimismPortal2.contract.WatchLogs(opts, "WithdrawalFinalized", withdrawalHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortal2WithdrawalFinalized)
+				if err := _OptimismPortal2.contract.UnpackLog(event, "WithdrawalFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawalFinalized is a log parse operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal2 *OptimismPortal2Filterer) ParseWithdrawalFinalized(log types.Log) (*OptimismPortal2WithdrawalFinalized, error) {
+	event := new(OptimismPortal2WithdrawalFinalized)
+	if err := _OptimismPortal2.contract.UnpackLog(event, "WithdrawalFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortal2WithdrawalProvenIterator is returned from FilterWithdrawalProven and is used to iterate over the raw logs and unpacked data for WithdrawalProven events raised by the OptimismPortal2 contract.
+type OptimismPortal2WithdrawalProvenIterator struct {
+	Event *OptimismPortal2WithdrawalProven // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortal2WithdrawalProvenIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortal2WithdrawalProven)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortal2WithdrawalProven)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortal2WithdrawalProvenIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortal2WithdrawalProvenIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortal2WithdrawalProven represents a WithdrawalProven event raised by the OptimismPortal2 contract.
+type OptimismPortal2WithdrawalProven struct {
+	WithdrawalHash [32]byte
+	From           common.Address
+	To             common.Address
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawalProven is a free log retrieval operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal2 *OptimismPortal2Filterer) FilterWithdrawalProven(opts *bind.FilterOpts, withdrawalHash [][32]byte, from []common.Address, to []common.Address) (*OptimismPortal2WithdrawalProvenIterator, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _OptimismPortal2.contract.FilterLogs(opts, "WithdrawalProven", withdrawalHashRule, fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal2WithdrawalProvenIterator{contract: _OptimismPortal2.contract, event: "WithdrawalProven", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawalProven is a free log subscription operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal2 *OptimismPortal2Filterer) WatchWithdrawalProven(opts *bind.WatchOpts, sink chan<- *OptimismPortal2WithdrawalProven, withdrawalHash [][32]byte, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _OptimismPortal2.contract.WatchLogs(opts, "WithdrawalProven", withdrawalHashRule, fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortal2WithdrawalProven)
+				if err := _OptimismPortal2.contract.UnpackLog(event, "WithdrawalProven", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawalProven is a log parse operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal2 *OptimismPortal2Filterer) ParseWithdrawalProven(log types.Log) (*OptimismPortal2WithdrawalProven, error) {
+	event := new(OptimismPortal2WithdrawalProven)
+	if err := _OptimismPortal2.contract.UnpackLog(event, "WithdrawalProven", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-e2e/bridge_test.go b/op-e2e/bridge_test.go
index d3092d1a6e48..539088fe6751 100644
--- a/op-e2e/bridge_test.go
+++ b/op-e2e/bridge_test.go
@@ -6,12 +6,12 @@ import (
 	"math/big"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/receipts"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/core/types"
@@ -40,29 +40,29 @@ func TestERC20BridgeDeposits(t *testing.T) {
 	opts, err := bind.NewKeyedTransactorWithChainID(sys.Cfg.Secrets.Alice, cfg.L1ChainIDBig())
 	require.Nil(t, err)
 
-	// Deploy WETH9
-	weth9Address, tx, WETH9, err := bindings.DeployWETH9(opts, l1Client)
+	// Deploy WETH
+	wethAddress, tx, WETH, err := bindings.DeployWETH(opts, l1Client)
 	require.NoError(t, err)
 	_, err = wait.ForReceiptOK(context.Background(), l1Client, tx.Hash())
 	require.NoError(t, err, "Waiting for deposit tx on L1")
 
 	// Get some WETH
 	opts.Value = big.NewInt(params.Ether)
-	tx, err = WETH9.Fallback(opts, []byte{})
+	tx, err = WETH.Deposit(opts)
 	require.NoError(t, err)
 	_, err = wait.ForReceiptOK(context.Background(), l1Client, tx.Hash())
 	require.NoError(t, err)
 	opts.Value = nil
-	wethBalance, err := WETH9.BalanceOf(&bind.CallOpts{}, opts.From)
+	wethBalance, err := WETH.BalanceOf(&bind.CallOpts{}, opts.From)
 	require.NoError(t, err)
 	require.Equal(t, big.NewInt(params.Ether), wethBalance)
 
-	// Deploy L2 WETH9
+	// Deploy L2 WETH
 	l2Opts, err := bind.NewKeyedTransactorWithChainID(sys.Cfg.Secrets.Alice, cfg.L2ChainIDBig())
 	require.NoError(t, err)
 	optimismMintableTokenFactory, err := bindings.NewOptimismMintableERC20Factory(predeploys.OptimismMintableERC20FactoryAddr, l2Client)
 	require.NoError(t, err)
-	tx, err = optimismMintableTokenFactory.CreateOptimismMintableERC20(l2Opts, weth9Address, "L2-WETH", "L2-WETH")
+	tx, err = optimismMintableTokenFactory.CreateOptimismMintableERC20(l2Opts, wethAddress, "L2-WETH", "L2-WETH")
 	require.NoError(t, err)
 	rcpt, err := wait.ForReceiptOK(context.Background(), l2Client, tx.Hash())
 	require.NoError(t, err)
@@ -70,17 +70,17 @@ func TestERC20BridgeDeposits(t *testing.T) {
 	event, err := receipts.FindLog(rcpt.Logs, optimismMintableTokenFactory.ParseOptimismMintableERC20Created)
 	require.NoError(t, err, "Should emit ERC20Created event")
 
-	// Approve WETH9 with the bridge
-	tx, err = WETH9.Approve(opts, cfg.L1Deployments.L1StandardBridgeProxy, new(big.Int).SetUint64(math.MaxUint64))
+	// Approve WETH with the bridge
+	tx, err = WETH.Approve(opts, cfg.L1Deployments.L1StandardBridgeProxy, new(big.Int).SetUint64(math.MaxUint64))
 	require.NoError(t, err)
 	_, err = wait.ForReceiptOK(context.Background(), l1Client, tx.Hash())
 	require.NoError(t, err)
 
-	// Bridge the WETH9
+	// Bridge the WETH
 	l1StandardBridge, err := bindings.NewL1StandardBridge(cfg.L1Deployments.L1StandardBridgeProxy, l1Client)
 	require.NoError(t, err)
 	tx, err = transactions.PadGasEstimate(opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) {
-		return l1StandardBridge.BridgeERC20(opts, weth9Address, event.LocalToken, big.NewInt(100), 100000, []byte{})
+		return l1StandardBridge.BridgeERC20(opts, wethAddress, event.LocalToken, big.NewInt(100), 100000, []byte{})
 	})
 	require.NoError(t, err)
 	depositReceipt, err := wait.ForReceiptOK(context.Background(), l1Client, tx.Hash())
diff --git a/op-e2e/brotli_batcher_test.go b/op-e2e/brotli_batcher_test.go
new file mode 100644
index 000000000000..97211c471ba0
--- /dev/null
+++ b/op-e2e/brotli_batcher_test.go
@@ -0,0 +1,125 @@
+package op_e2e
+
+import (
+	"context"
+	"crypto/ecdsa"
+	"math/big"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+	"github.com/ethereum/go-ethereum/core"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/ethereum/go-ethereum/rpc"
+
+	batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags"
+	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
+	"github.com/ethereum-optimism/optimism/op-service/client"
+	"github.com/ethereum-optimism/optimism/op-service/sources"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
+)
+
+func setupAliceAccount(t *testing.T, cfg SystemConfig, sys *System, ethPrivKey *ecdsa.PrivateKey) {
+	l1Client := sys.Clients["l1"]
+	l2Verif := sys.Clients["verifier"]
+
+	// Send Transaction & wait for success
+	fromAddr := cfg.Secrets.Addresses().Alice
+	log.Info("alice", "addr", fromAddr)
+
+	ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
+	defer cancel()
+	startBalance, err := l2Verif.BalanceAt(ctx, fromAddr, nil)
+	require.NoError(t, err)
+
+	// Send deposit transaction
+	opts, err := bind.NewKeyedTransactorWithChainID(ethPrivKey, cfg.L1ChainIDBig())
+	require.NoError(t, err)
+	mintAmount := big.NewInt(1_000_000_000_000)
+	opts.Value = mintAmount
+	SendDepositTx(t, cfg, l1Client, l2Verif, opts, func(l2Opts *DepositTxOpts) {})
+
+	// Confirm balance
+	ctx, cancel = context.WithTimeout(context.Background(), 15*time.Second)
+	defer cancel()
+	endBalance, err := wait.ForBalanceChange(ctx, l2Verif, fromAddr, startBalance)
+	require.NoError(t, err)
+
+	diff := new(big.Int).Sub(endBalance, startBalance)
+	require.Equal(t, mintAmount, diff, "Did not get expected balance change")
+}
+
+func TestBrotliBatcherFjord(t *testing.T) {
+	InitParallel(t)
+
+	cfg := DefaultSystemConfig(t)
+	cfg.DataAvailabilityType = batcherFlags.BlobsType
+
+	genesisActivation := hexutil.Uint64(0)
+	cfg.DeployConfig.L1CancunTimeOffset = &genesisActivation
+	cfg.DeployConfig.L2GenesisDeltaTimeOffset = &genesisActivation
+	cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &genesisActivation
+	cfg.DeployConfig.L2GenesisFjordTimeOffset = &genesisActivation
+
+	// set up batcher to use brotli
+	sys, err := cfg.Start(t, SystemConfigOption{"compressionAlgo", "brotli", nil})
+	require.Nil(t, err, "Error starting up system")
+	defer sys.Close()
+
+	log := testlog.Logger(t, log.LevelInfo)
+	log.Info("genesis", "l2", sys.RollupConfig.Genesis.L2, "l1", sys.RollupConfig.Genesis.L1, "l2_time", sys.RollupConfig.Genesis.L2Time)
+
+	l2Seq := sys.Clients["sequencer"]
+	l2Verif := sys.Clients["verifier"]
+
+	// Transactor Account and set up the account
+	ethPrivKey := cfg.Secrets.Alice
+	setupAliceAccount(t, cfg, sys, ethPrivKey)
+
+	// Submit TX to L2 sequencer node
+	receipt := SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *TxOpts) {
+		opts.Value = big.NewInt(1_000_000_000)
+		opts.Nonce = 1 // Already have deposit
+		opts.ToAddr = &common.Address{0xff, 0xff}
+		opts.Gas, err = core.IntrinsicGas(opts.Data, nil, false, true, true, false)
+		require.NoError(t, err)
+		opts.VerifyOnClients(l2Verif)
+	})
+
+	// Verify blocks match after batch submission on verifiers and sequencers
+	verifBlock, err := l2Verif.BlockByNumber(context.Background(), receipt.BlockNumber)
+	require.NoError(t, err)
+	require.Equal(t, verifBlock.Hash(), receipt.BlockHash, "must be same block")
+	seqBlock, err := l2Seq.BlockByNumber(context.Background(), receipt.BlockNumber)
+	require.NoError(t, err)
+	require.Equal(t, seqBlock.Hash(), receipt.BlockHash, "must be same block")
+	require.Equal(t, verifBlock.NumberU64(), seqBlock.NumberU64(), "Verifier and sequencer blocks not the same after including a batch tx")
+	require.Equal(t, verifBlock.ParentHash(), seqBlock.ParentHash(), "Verifier and sequencer blocks parent hashes not the same after including a batch tx")
+	require.Equal(t, verifBlock.Hash(), seqBlock.Hash(), "Verifier and sequencer blocks not the same after including a batch tx")
+
+	rollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["sequencer"].HTTPEndpoint())
+	require.NoError(t, err)
+	rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient))
+	// basic check that sync status works
+	seqStatus, err := rollupClient.SyncStatus(context.Background())
+	require.NoError(t, err)
+	require.LessOrEqual(t, seqBlock.NumberU64(), seqStatus.UnsafeL2.Number)
+
+	// quick check that the batch submitter works
+	require.Eventually(t, func() bool {
+		// wait for chain to be marked as "safe" (i.e. confirm batch-submission works)
+		stat, err := rollupClient.SyncStatus(context.Background())
+		require.NoError(t, err)
+		return stat.SafeL2.Number >= receipt.BlockNumber.Uint64()
+	}, time.Second*20, time.Second, "expected L2 to be batch-submitted and labeled as safe")
+
+	// check that the L2 tx is still canonical
+	// safe and canonical => the block was batched successfully with brotli
+	seqBlock, err = l2Seq.BlockByNumber(context.Background(), receipt.BlockNumber)
+	require.NoError(t, err)
+	require.Equal(t, seqBlock.Hash(), receipt.BlockHash, "receipt block must match canonical block at tx inclusion height")
+}
diff --git a/op-e2e/check_scripts_test.go b/op-e2e/check_scripts_test.go
new file mode 100644
index 000000000000..28cdcca3ab8c
--- /dev/null
+++ b/op-e2e/check_scripts_test.go
@@ -0,0 +1,80 @@
+package op_e2e
+
+import (
+	"context"
+	"testing"
+
+	"github.com/ethereum/go-ethereum/common/hexutil"
+	"github.com/ethereum/go-ethereum/log"
+
+	"github.com/stretchr/testify/require"
+
+	fjordChecks "github.com/ethereum-optimism/optimism/op-chain-ops/cmd/check-fjord/checks"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
+)
+
+// TestCheckFjordScript ensures the op-chain-ops/cmd/check-fjord script runs successfully
+// against a test chain with the fjord hardfork activated/unactivated
+func TestCheckFjordScript(t *testing.T) {
+	log := testlog.Logger(t, log.LevelInfo)
+
+	cfg := DefaultSystemConfig(t)
+	genesisActivation := hexutil.Uint64(0)
+	cfg.DeployConfig.L1CancunTimeOffset = &genesisActivation
+	cfg.DeployConfig.L2GenesisRegolithTimeOffset = &genesisActivation
+	cfg.DeployConfig.L2GenesisCanyonTimeOffset = &genesisActivation
+	cfg.DeployConfig.L2GenesisDeltaTimeOffset = &genesisActivation
+	cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &genesisActivation
+
+	tests := []struct {
+		name            string
+		fjordActivation *hexutil.Uint64
+		expectErr       bool
+	}{
+		{
+			name:            "fjord_activated",
+			fjordActivation: &genesisActivation,
+			expectErr:       false,
+		},
+		{
+			name:            "fjord_unactivated",
+			fjordActivation: nil,
+			expectErr:       true,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			InitParallel(t)
+			cfg.DeployConfig.L2GenesisFjordTimeOffset = tt.fjordActivation
+
+			sys, err := cfg.Start(t)
+			require.NoError(t, err, "Error starting up system")
+			defer sys.Close()
+
+			checkFjordConfig := &fjordChecks.CheckFjordConfig{
+				Log:  log,
+				L2:   sys.Clients["sequencer"],
+				Key:  sys.Cfg.Secrets.Alice,
+				Addr: sys.Cfg.Secrets.Addresses().Alice,
+			}
+			if tt.expectErr {
+				err = fjordChecks.CheckRIP7212(context.Background(), checkFjordConfig)
+				require.Error(t, err, "expected error for CheckRIP7212")
+				err = fjordChecks.CheckGasPriceOracle(context.Background(), checkFjordConfig)
+				require.Error(t, err, "expected error for CheckGasPriceOracle")
+				err = fjordChecks.CheckTxEmpty(context.Background(), checkFjordConfig)
+				require.Error(t, err, "expected error for CheckTxEmpty")
+				err = fjordChecks.CheckTxAllZero(context.Background(), checkFjordConfig)
+				require.Error(t, err, "expected error for CheckTxAllZero")
+				err = fjordChecks.CheckTxAll42(context.Background(), checkFjordConfig)
+				require.Error(t, err, "expected error for CheckTxAll42")
+				err = fjordChecks.CheckTxRandom(context.Background(), checkFjordConfig)
+				require.Error(t, err, "expected error for CheckTxRandom")
+			} else {
+				err = fjordChecks.CheckAll(context.Background(), checkFjordConfig)
+				require.NoError(t, err, "should not error on CheckAll")
+			}
+		})
+	}
+}
diff --git a/op-e2e/config/init.go b/op-e2e/config/init.go
index 4d7a0a7f432c..21034c04a7d4 100644
--- a/op-e2e/config/init.go
+++ b/op-e2e/config/init.go
@@ -13,7 +13,6 @@ import (
 	"golang.org/x/exp/slog"
 
 	"github.com/ethereum/go-ethereum/common/hexutil"
-	"github.com/ethereum/go-ethereum/core/state"
 	"github.com/ethereum/go-ethereum/log"
 
 	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
@@ -40,10 +39,12 @@ var (
 	// in end to end tests.
 
 	// L1Allocs represents the L1 genesis block state.
-	L1Allocs *state.Dump
+	L1Allocs *genesis.ForgeAllocs
 	// L1Deployments maps contract names to accounts in the L1
 	// genesis block state.
 	L1Deployments *genesis.L1Deployments
+	// l2Allocs represents the L2 allocs, by hardfork/mode (e.g. delta, ecotone, interop, other)
+	l2Allocs map[genesis.L2AllocsMode]*genesis.ForgeAllocs
 	// DeployConfig represents the deploy config used by the system.
 	DeployConfig *genesis.DeployConfig
 	// ExternalL2Shim is the shim to use if external ethereum client testing is
@@ -57,7 +58,7 @@ var (
 )
 
 func init() {
-	var l1AllocsPath, l1DeploymentsPath, deployConfigPath, externalL2 string
+	var l1AllocsPath, l2AllocsDir, l1DeploymentsPath, deployConfigPath, externalL2 string
 
 	cwd, err := os.Getwd()
 	if err != nil {
@@ -69,10 +70,12 @@ func init() {
 	}
 
 	defaultL1AllocsPath := filepath.Join(root, ".devnet", "allocs-l1.json")
+	defaultL2AllocsDir := filepath.Join(root, ".devnet")
 	defaultL1DeploymentsPath := filepath.Join(root, ".devnet", "addresses.json")
 	defaultDeployConfigPath := filepath.Join(root, "packages", "contracts-bedrock", "deploy-config", "devnetL1.json")
 
 	flag.StringVar(&l1AllocsPath, "l1-allocs", defaultL1AllocsPath, "")
+	flag.StringVar(&l2AllocsDir, "l2-allocs-dir", defaultL2AllocsDir, "")
 	flag.StringVar(&l1DeploymentsPath, "l1-deployments", defaultL1DeploymentsPath, "")
 	flag.StringVar(&deployConfigPath, "deploy-config", defaultDeployConfigPath, "")
 	flag.StringVar(&externalL2, "externalL2", "", "Enable tests with external L2")
@@ -104,10 +107,25 @@ func init() {
 		return
 	}
 
-	L1Allocs, err = genesis.NewStateDump(l1AllocsPath)
+	L1Allocs, err = genesis.LoadForgeAllocs(l1AllocsPath)
 	if err != nil {
 		panic(err)
 	}
+	l2Allocs = make(map[genesis.L2AllocsMode]*genesis.ForgeAllocs)
+	mustL2Allocs := func(mode genesis.L2AllocsMode) {
+		name := "allocs-l2"
+		if mode != "" {
+			name += "-" + string(mode)
+		}
+		allocs, err := genesis.LoadForgeAllocs(filepath.Join(l2AllocsDir, name+".json"))
+		if err != nil {
+			panic(err)
+		}
+		l2Allocs[mode] = allocs
+	}
+	mustL2Allocs(genesis.L2AllocsFjord)
+	mustL2Allocs(genesis.L2AllocsEcotone)
+	mustL2Allocs(genesis.L2AllocsDelta)
 	L1Deployments, err = genesis.NewL1Deployments(l1DeploymentsPath)
 	if err != nil {
 		panic(err)
@@ -138,6 +156,14 @@ func init() {
 	}
 }
 
+func L2Allocs(mode genesis.L2AllocsMode) *genesis.ForgeAllocs {
+	allocs, ok := l2Allocs[mode]
+	if !ok {
+		panic(fmt.Errorf("unknown L2 allocs mode: %q", mode))
+	}
+	return allocs.Copy()
+}
+
 func initExternalL2(externalL2 string) error {
 	var err error
 	ExternalL2Shim, err = filepath.Abs(filepath.Join(externalL2, "shim"))
diff --git a/op-e2e/custom_gas_token_test.go b/op-e2e/custom_gas_token_test.go
new file mode 100644
index 000000000000..b649be117464
--- /dev/null
+++ b/op-e2e/custom_gas_token_test.go
@@ -0,0 +1,459 @@
+package op_e2e
+
+import (
+	"context"
+	"fmt"
+	"math/big"
+	"testing"
+	"time"
+
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
+	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
+	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/receipts"
+	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
+	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/ethclient"
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+)
+
+func TestCustomGasToken(t *testing.T) {
+	InitParallel(t, SkipOnFPAC) // Custom Gas Token feature is not yet compatible with FPAC
+
+	cfg := DefaultSystemConfig(t)
+	offset := hexutil.Uint64(0)
+	cfg.DeployConfig.L2GenesisRegolithTimeOffset = &offset
+	cfg.DeployConfig.L1CancunTimeOffset = &offset
+	cfg.DeployConfig.L2GenesisCanyonTimeOffset = &offset
+	cfg.DeployConfig.L2GenesisDeltaTimeOffset = &offset
+	cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &offset
+
+	sys, err := cfg.Start(t)
+	require.NoError(t, err, "Error starting up system")
+	defer sys.Close()
+	l1Client := sys.Clients["l1"]
+	l2Client := sys.Clients["sequencer"]
+
+	aliceOpts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.Alice, cfg.L1ChainIDBig())
+	require.NoError(t, err)
+
+	// Deploy WETH9, we'll use this as our custom gas token for the purpose of the test
+	weth9Address, tx, weth9, err := bindings.DeployWETH9(aliceOpts, l1Client)
+	require.NoError(t, err)
+	_, err = wait.ForReceiptOK(context.Background(), l1Client, tx.Hash())
+	require.NoError(t, err)
+
+	// setup expectations using custom gas token
+	type Expectations struct {
+		tokenAddress  common.Address
+		tokenName     string
+		tokenSymbol   string
+		tokenDecimals uint8
+	}
+	disabledExpectations := Expectations{
+		common.HexToAddress("0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"),
+		"Ether",
+		"ETH",
+		uint8(18),
+	}
+	enabledExpectations := Expectations{}
+	enabledExpectations.tokenAddress = weth9Address
+	enabledExpectations.tokenName, err = weth9.Name(&bind.CallOpts{})
+	require.NoError(t, err)
+	enabledExpectations.tokenSymbol, err = weth9.Symbol(&bind.CallOpts{})
+	require.NoError(t, err)
+	enabledExpectations.tokenDecimals, err = weth9.Decimals(&bind.CallOpts{})
+	require.NoError(t, err)
+
+	// Get some WETH
+	aliceOpts.Value = big.NewInt(10_000_000)
+	tx, err = weth9.Deposit(aliceOpts)
+	waitForTx(t, tx, err, l1Client)
+	aliceOpts.Value = nil
+	newBalance, err := weth9.BalanceOf(&bind.CallOpts{}, aliceOpts.From)
+	require.NoError(t, err)
+	require.Equal(t, newBalance, big.NewInt(10_000_000))
+
+	// Function to prepare and make call to depositERC20Transaction and make
+	// appropriate assertions dependent on whether custom gas tokens have been enabled or not.
+	checkDeposit := func(t *testing.T, enabled bool) {
+		// Set amount of WETH9 to bridge to the recipient on L2
+		amountToBridge := big.NewInt(10)
+		recipient := common.HexToAddress("0xbeefdead")
+
+		// Approve OptimismPortal
+		tx, err = weth9.Approve(aliceOpts, cfg.L1Deployments.OptimismPortalProxy, amountToBridge)
+		waitForTx(t, tx, err, l1Client)
+
+		// Get recipient L2 balance before bridging
+		previousL2Balance, err := l2Client.BalanceAt(context.Background(), recipient, nil)
+		require.NoError(t, err)
+
+		// Bridge the tokens
+		optimismPortal, err := bindings.NewOptimismPortal(cfg.L1Deployments.OptimismPortalProxy, l1Client)
+		require.NoError(t, err)
+		tx, err = optimismPortal.DepositERC20Transaction(aliceOpts,
+			recipient,
+			amountToBridge,
+			amountToBridge,
+			50_0000, // _gasLimit
+			false,
+			[]byte{},
+		)
+		if enabled {
+			require.NoError(t, err)
+			receipt, err := wait.ForReceiptOK(context.Background(), l1Client, tx.Hash())
+			require.NoError(t, err)
+
+			// compute the deposit transaction hash + poll for it
+			depositEvent, err := receipts.FindLog(receipt.Logs, optimismPortal.ParseTransactionDeposited)
+			require.NoError(t, err, "Should emit deposit event")
+			depositTx, err := derive.UnmarshalDepositLogEvent(&depositEvent.Raw)
+			require.NoError(t, err)
+			_, err = wait.ForReceiptOK(context.Background(), l2Client, types.NewTx(depositTx).Hash())
+			require.NoError(t, err)
+
+			require.EventuallyWithT(t, func(t *assert.CollectT) {
+				// check for balance increase on L2
+				newL2Balance, err := l2Client.BalanceAt(context.Background(), recipient, nil)
+				require.NoError(t, err)
+				l2BalanceIncrease := big.NewInt(0).Sub(newL2Balance, previousL2Balance)
+				require.Equal(t, amountToBridge, l2BalanceIncrease)
+			}, 10*time.Second, 1*time.Second)
+		} else {
+			require.Error(t, err)
+		}
+	}
+
+	// Function to prepare and execute withdrawal flow for CGTs
+	// and assert token balance is increased on L1.
+	checkWithdrawal := func(t *testing.T) {
+		l2Seq := l2Client
+		l2Verif := sys.Clients["verifier"]
+		fromAddr := aliceOpts.From
+		ethPrivKey := cfg.Secrets.Alice
+
+		// Start L2 balance for withdrawal
+		startBalanceBeforeWithdrawal, err := l2Seq.BalanceAt(context.Background(), fromAddr, nil)
+		require.NoError(t, err)
+
+		withdrawAmount := big.NewInt(5)
+		tx, receipt := SendWithdrawal(t, cfg, l2Seq, cfg.Secrets.Alice, func(opts *WithdrawalTxOpts) {
+			opts.Value = withdrawAmount
+			opts.VerifyOnClients(l2Verif)
+		})
+
+		// Verify L2 balance after withdrawal
+		header, err := l2Verif.HeaderByNumber(context.Background(), receipt.BlockNumber)
+		require.NoError(t, err)
+
+		endBalanceAfterWithdrawal, err := wait.ForBalanceChange(context.Background(), l2Seq, fromAddr, startBalanceBeforeWithdrawal)
+		require.NoError(t, err)
+
+		// Take fee into account
+		diff := new(big.Int).Sub(startBalanceBeforeWithdrawal, endBalanceAfterWithdrawal)
+		fees := calcGasFees(receipt.GasUsed, tx.GasTipCap(), tx.GasFeeCap(), header.BaseFee)
+		fees = fees.Add(fees, receipt.L1Fee)
+		diff = diff.Sub(diff, fees)
+		require.Equal(t, withdrawAmount, diff)
+
+		// Take start token balance on L1
+		startTokenBalanceBeforeFinalize, err := weth9.BalanceOf(&bind.CallOpts{}, fromAddr)
+		require.NoError(t, err)
+
+		startETHBalanceBeforeFinalize, err := l1Client.BalanceAt(context.Background(), fromAddr, nil)
+		require.NoError(t, err)
+
+		proveReceipt, finalizeReceipt, resolveClaimReceipt, resolveReceipt := ProveAndFinalizeWithdrawal(t, cfg, sys, "verifier", ethPrivKey, receipt)
+
+		// Verify L1 ETH balance change
+		proveFee := new(big.Int).Mul(new(big.Int).SetUint64(proveReceipt.GasUsed), proveReceipt.EffectiveGasPrice)
+		finalizeFee := new(big.Int).Mul(new(big.Int).SetUint64(finalizeReceipt.GasUsed), finalizeReceipt.EffectiveGasPrice)
+		fees = new(big.Int).Add(proveFee, finalizeFee)
+		if e2eutils.UseFPAC() {
+			resolveClaimFee := new(big.Int).Mul(new(big.Int).SetUint64(resolveClaimReceipt.GasUsed), resolveClaimReceipt.EffectiveGasPrice)
+			resolveFee := new(big.Int).Mul(new(big.Int).SetUint64(resolveReceipt.GasUsed), resolveReceipt.EffectiveGasPrice)
+			fees = new(big.Int).Add(fees, resolveClaimFee)
+			fees = new(big.Int).Add(fees, resolveFee)
+		}
+
+		// Verify L1ETHBalance after withdrawal
+		// On CGT chains, the only change in ETH balance from a withdrawal
+		// is a decrease to pay for gas
+		endETHBalanceAfterFinalize, err := l1Client.BalanceAt(context.Background(), fromAddr, nil)
+		require.NoError(t, err)
+		diff = new(big.Int).Sub(endETHBalanceAfterFinalize, startETHBalanceBeforeFinalize)
+		require.Equal(t, new(big.Int).Sub(big.NewInt(0), fees), diff)
+
+		// Verify token balance after withdrawal
+		// L1 Fees are paid in ETH, and
+		// withdrawal is of a Custom Gas Token, so we do not subtract l1 fees from expected balance change
+		// as we would if ETH was the gas paying token
+		endTokenBalanceAfterFinalize, err := weth9.BalanceOf(&bind.CallOpts{}, fromAddr)
+		require.NoError(t, err)
+		diff = new(big.Int).Sub(endTokenBalanceAfterFinalize, startTokenBalanceBeforeFinalize)
+		require.Equal(t, withdrawAmount, diff)
+	}
+
+	checkL1TokenNameAndSymbol := func(t *testing.T, enabled bool) {
+		systemConfig, err := bindings.NewSystemConfig(cfg.L1Deployments.SystemConfigProxy, l1Client)
+		require.NoError(t, err)
+
+		token, err := systemConfig.GasPayingToken(&bind.CallOpts{})
+		require.NoError(t, err)
+
+		name, err := systemConfig.GasPayingTokenName(&bind.CallOpts{})
+		require.NoError(t, err)
+
+		symbol, err := systemConfig.GasPayingTokenSymbol(&bind.CallOpts{})
+		require.NoError(t, err)
+
+		if enabled {
+			require.Equal(t, enabledExpectations.tokenAddress, token.Addr)
+			require.Equal(t, enabledExpectations.tokenDecimals, token.Decimals)
+			require.Equal(t, enabledExpectations.tokenName, name)
+			require.Equal(t, enabledExpectations.tokenSymbol, symbol)
+		} else {
+			require.Equal(t, disabledExpectations.tokenAddress, token.Addr)
+			require.Equal(t, disabledExpectations.tokenDecimals, token.Decimals)
+			require.Equal(t, disabledExpectations.tokenName, name)
+			require.Equal(t, disabledExpectations.tokenSymbol, symbol)
+		}
+	}
+
+	checkL2TokenNameAndSymbol := func(t *testing.T, enabled bool) {
+		l1Block, err := bindings.NewL1Block(predeploys.L1BlockAddr, l2Client)
+		require.NoError(t, err)
+
+		token, err := l1Block.GasPayingToken(&bind.CallOpts{})
+		require.NoError(t, err)
+
+		name, err := l1Block.GasPayingTokenName(&bind.CallOpts{})
+		require.NoError(t, err)
+
+		symbol, err := l1Block.GasPayingTokenSymbol(&bind.CallOpts{})
+		require.NoError(t, err)
+
+		if enabled {
+			require.Equal(t, enabledExpectations.tokenAddress, token.Addr)
+			require.Equal(t, enabledExpectations.tokenDecimals, token.Decimals)
+			require.Equal(t, enabledExpectations.tokenName, name)
+			require.Equal(t, enabledExpectations.tokenSymbol, symbol)
+		} else {
+			require.Equal(t, disabledExpectations.tokenAddress, token.Addr)
+			require.Equal(t, disabledExpectations.tokenDecimals, token.Decimals)
+			require.Equal(t, disabledExpectations.tokenName, name)
+			require.Equal(t, disabledExpectations.tokenSymbol, symbol)
+		}
+	}
+
+	checkWETHTokenNameAndSymbol := func(t *testing.T, enabled bool) {
+		// Check name and symbol in WETH predeploy
+		weth, err := bindings.NewWETH(predeploys.WETHAddr, l2Client)
+		require.NoError(t, err)
+
+		name, err := weth.Name(&bind.CallOpts{})
+		require.NoError(t, err)
+
+		symbol, err := weth.Symbol(&bind.CallOpts{})
+		require.NoError(t, err)
+
+		if enabled {
+			require.Equal(t, "Wrapped "+enabledExpectations.tokenName, name)
+			require.Equal(t, "W"+enabledExpectations.tokenSymbol, symbol)
+		} else {
+			require.Equal(t, "Wrapped "+disabledExpectations.tokenName, name)
+			require.Equal(t, "W"+disabledExpectations.tokenSymbol, symbol)
+		}
+	}
+
+	// Begin by testing behaviour when CGT feature is not enabled
+	enabled := false
+	checkDeposit(t, enabled)
+	checkL1TokenNameAndSymbol(t, enabled)
+	checkL2TokenNameAndSymbol(t, enabled)
+	checkWETHTokenNameAndSymbol(t, enabled)
+
+	// Activate custom gas token feature (devnet does not have this activated at genesis)
+	setCustomGasToken(t, cfg, sys, weth9Address)
+
+	// Now test behaviour given CGT feature is enabled
+	enabled = true
+	checkDeposit(t, enabled)
+	checkWithdrawal(t)
+	checkL1TokenNameAndSymbol(t, enabled)
+	checkL2TokenNameAndSymbol(t, enabled)
+	checkWETHTokenNameAndSymbol(t, enabled)
+}
+
+// callViaSafe will use the Safe smart account at safeAddress to send a transaction to target using the provided data. The transaction signature is constructed from
+// the supplied opts.
+func callViaSafe(opts *bind.TransactOpts, client *ethclient.Client, safeAddress common.Address, target common.Address, data []byte) (*types.Transaction, error) {
+	signature := [65]byte{}
+	copy(signature[12:], opts.From[:])
+	signature[64] = uint8(1)
+
+	safe, err := bindings.NewSafe(safeAddress, client)
+	if err != nil {
+		return nil, err
+	}
+
+	owners, err := safe.GetOwners(&bind.CallOpts{})
+	if err != nil {
+		return nil, err
+	}
+
+	isOwner, err := safe.IsOwner(&bind.CallOpts{}, opts.From)
+	if err != nil {
+		return nil, err
+	}
+	if !isOwner {
+		return nil, fmt.Errorf("address %s is not in owners list %s", opts.From, owners)
+	}
+
+	return safe.ExecTransaction(opts, target, big.NewInt(0), data, 0, big.NewInt(0), big.NewInt(0), big.NewInt(0), common.Address{}, common.Address{}, signature[:])
+}
+
+// setCustomGasToeken enables the Custom Gas Token feature on a chain where it wasn't enabled at genesis.
+// It reads existing parameters from the SystemConfig contract, inserts the supplied cgtAddress and reinitializes that contract.
+// To do this it uses the ProxyAdmin and StorageSetter from the supplied cfg.
+func setCustomGasToken(t *testing.T, cfg SystemConfig, sys *System, cgtAddress common.Address) {
+	l1Client := sys.Clients["l1"]
+	deployerOpts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.Deployer, cfg.L1ChainIDBig())
+	require.NoError(t, err)
+
+	// Bind a SystemConfig at the SystemConfigProxy address
+	systemConfig, err := bindings.NewSystemConfig(cfg.L1Deployments.SystemConfigProxy, l1Client)
+	require.NoError(t, err)
+
+	// Get existing parameters from SystemConfigProxy contract
+	owner, err := systemConfig.Owner(&bind.CallOpts{})
+	require.NoError(t, err)
+	basefeeScalar, err := systemConfig.BasefeeScalar(&bind.CallOpts{})
+	require.NoError(t, err)
+	blobbasefeeScalar, err := systemConfig.BlobbasefeeScalar(&bind.CallOpts{})
+	require.NoError(t, err)
+	batcherHash, err := systemConfig.BatcherHash(&bind.CallOpts{})
+	require.NoError(t, err)
+	gasLimit, err := systemConfig.GasLimit(&bind.CallOpts{})
+	require.NoError(t, err)
+	unsafeBlockSigner, err := systemConfig.UnsafeBlockSigner(&bind.CallOpts{})
+	require.NoError(t, err)
+	resourceConfig, err := systemConfig.ResourceConfig(&bind.CallOpts{})
+	require.NoError(t, err)
+	batchInbox, err := systemConfig.BatchInbox(&bind.CallOpts{})
+	require.NoError(t, err)
+	addresses := bindings.SystemConfigAddresses{}
+	addresses.L1CrossDomainMessenger, err = systemConfig.L1CrossDomainMessenger(&bind.CallOpts{})
+	require.NoError(t, err)
+	addresses.L1ERC721Bridge, err = systemConfig.L1ERC721Bridge(&bind.CallOpts{})
+	require.NoError(t, err)
+	addresses.L1StandardBridge, err = systemConfig.L1StandardBridge(&bind.CallOpts{})
+	require.NoError(t, err)
+	addresses.DisputeGameFactory, err = systemConfig.DisputeGameFactory(&bind.CallOpts{})
+	require.NoError(t, err)
+	addresses.OptimismPortal, err = systemConfig.OptimismPortal(&bind.CallOpts{})
+	require.NoError(t, err)
+	addresses.OptimismMintableERC20Factory, err = systemConfig.OptimismMintableERC20Factory(&bind.CallOpts{})
+	require.NoError(t, err)
+
+	// Queue up custom gas token address ready for reinitialization
+	addresses.GasPayingToken = cgtAddress
+
+	// Bind a ProxyAdmin to the ProxyAdmin address
+	proxyAdmin, err := bindings.NewProxyAdmin(cfg.L1Deployments.ProxyAdmin, l1Client)
+	require.NoError(t, err)
+
+	// Compute Proxy Admin Owner (this is a SAFE with 1 owner)
+	proxyAdminOwner, err := proxyAdmin.Owner(&bind.CallOpts{})
+	require.NoError(t, err)
+
+	// Deploy a new StorageSetter contract
+	storageSetterAddr, tx, _, err := bindings.DeployStorageSetter(deployerOpts, l1Client)
+	waitForTx(t, tx, err, l1Client)
+
+	// Set up a signer which controls the Proxy Admin Owner SAFE
+	safeOwnerOpts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.Deployer, cfg.L1ChainIDBig())
+	require.NoError(t, err)
+
+	// Encode calldata for upgrading SystemConfigProxy to the StorageSetter implementation
+	proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi()
+	require.NoError(t, err)
+	encodedUpgradeCall, err := proxyAdminABI.Pack("upgrade",
+		cfg.L1Deployments.SystemConfigProxy, storageSetterAddr)
+	require.NoError(t, err)
+
+	// Execute the upgrade SystemConfigProxy -> StorageSetter
+	tx, err = callViaSafe(safeOwnerOpts, l1Client, proxyAdminOwner, cfg.L1Deployments.ProxyAdmin, encodedUpgradeCall)
+	waitForTx(t, tx, err, l1Client)
+
+	// Bind a StorageSetter to the SystemConfigProxy address
+	storageSetter, err := bindings.NewStorageSetter(cfg.L1Deployments.SystemConfigProxy, l1Client)
+	require.NoError(t, err)
+
+	// Use StorageSetter to clear out "initialize" slot
+	tx, err = storageSetter.SetBytes320(deployerOpts, [32]byte{0}, [32]byte{0})
+	waitForTx(t, tx, err, l1Client)
+
+	// Sanity check previous step worked
+	currentSlotValue, err := storageSetter.GetBytes32(&bind.CallOpts{}, [32]byte{0})
+	require.NoError(t, err)
+	require.Equal(t, currentSlotValue, [32]byte{0})
+
+	// Prepare calldata for SystemConfigProxy -> SystemConfig upgrade
+	encodedUpgradeCall, err = proxyAdminABI.Pack("upgrade",
+		cfg.L1Deployments.SystemConfigProxy, cfg.L1Deployments.SystemConfig)
+	require.NoError(t, err)
+
+	// Execute SystemConfigProxy -> SystemConfig upgrade
+	tx, err = callViaSafe(safeOwnerOpts, l1Client, proxyAdminOwner, cfg.L1Deployments.ProxyAdmin, encodedUpgradeCall)
+	waitForTx(t, tx, err, l1Client)
+
+	// Reinitialise with existing initializer values but with custom gas token set
+	tx, err = systemConfig.Initialize(deployerOpts, owner,
+		basefeeScalar,
+		blobbasefeeScalar,
+		batcherHash,
+		gasLimit,
+		unsafeBlockSigner,
+		resourceConfig,
+		batchInbox,
+		addresses)
+	require.NoError(t, err)
+	receipt, err := wait.ForReceiptOK(context.Background(), l1Client, tx.Hash())
+	require.NoError(t, err)
+
+	// Read Custom Gas Token and check it has been set properly
+	gpt, err := systemConfig.GasPayingToken(&bind.CallOpts{})
+	require.NoError(t, err)
+	require.Equal(t, cgtAddress, gpt.Addr)
+
+	optimismPortal, err := bindings.NewOptimismPortal(cfg.L1Deployments.OptimismPortalProxy, l1Client)
+	require.NoError(t, err)
+
+	depositEvent, err := receipts.FindLog(receipt.Logs, optimismPortal.ParseTransactionDeposited)
+	require.NoError(t, err, "Should emit deposit event")
+	depositTx, err := derive.UnmarshalDepositLogEvent(&depositEvent.Raw)
+
+	require.NoError(t, err)
+	l2Client := sys.Clients["sequencer"]
+	receipt, err = wait.ForReceiptOK(context.Background(), l2Client, types.NewTx(depositTx).Hash())
+	require.NoError(t, err)
+
+	l1Block, err := bindings.NewL1Block(predeploys.L1BlockAddr, l2Client)
+	require.NoError(t, err)
+	_, err = receipts.FindLog(receipt.Logs, l1Block.ParseGasPayingTokenSet)
+	require.NoError(t, err)
+}
+
+// waitForTx is a thing wrapper around wait.ForReceiptOK which asserts on there being no errors.
+func waitForTx(t *testing.T, tx *types.Transaction, err error, client *ethclient.Client) {
+	require.NoError(t, err)
+	_, err = wait.ForReceiptOK(context.Background(), client, tx.Hash())
+	require.NoError(t, err)
+}
diff --git a/op-e2e/e2eutils/addresses.go b/op-e2e/e2eutils/addresses.go
index ad335f94d72f..46e639425a22 100644
--- a/op-e2e/e2eutils/addresses.go
+++ b/op-e2e/e2eutils/addresses.go
@@ -5,13 +5,13 @@ import (
 	"sort"
 
 	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core"
+	"github.com/ethereum/go-ethereum/core/types"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 )
 
-func collectAllocAddrs(alloc core.GenesisAlloc) []common.Address {
+func collectAllocAddrs(alloc types.GenesisAlloc) []common.Address {
 	var out []common.Address
 	for addr := range alloc {
 		out = append(out, addr)
diff --git a/op-e2e/e2eutils/challenger/helper.go b/op-e2e/e2eutils/challenger/helper.go
index a662aff560fb..a01ef9ed616c 100644
--- a/op-e2e/e2eutils/challenger/helper.go
+++ b/op-e2e/e2eutils/challenger/helper.go
@@ -12,6 +12,7 @@ import (
 	"time"
 
 	"github.com/ethereum-optimism/optimism/op-service/metrics"
+	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/stretchr/testify/require"
 
 	"github.com/ethereum/go-ethereum/common"
@@ -29,6 +30,7 @@ import (
 
 type EndpointProvider interface {
 	NodeEndpoint(name string) string
+	RollupEndpoint(name string) string
 	L1BeaconEndpoint() string
 }
 
@@ -38,6 +40,18 @@ type Helper struct {
 	require *require.Assertions
 	dir     string
 	chl     cliapp.Lifecycle
+	metrics *CapturingMetrics
+}
+
+func NewHelper(log log.Logger, t *testing.T, require *require.Assertions, dir string, chl cliapp.Lifecycle, m *CapturingMetrics) *Helper {
+	return &Helper{
+		log:     log,
+		t:       t,
+		require: require,
+		dir:     dir,
+		chl:     chl,
+		metrics: m,
+	}
 }
 
 type Option func(config2 *config.Config)
@@ -66,9 +80,9 @@ func WithPollInterval(pollInterval time.Duration) Option {
 	}
 }
 
-// findMonorepoRoot finds the relative path to the monorepo root
+// FindMonorepoRoot finds the relative path to the monorepo root
 // Different tests might be nested in subdirectories of the op-e2e dir.
-func findMonorepoRoot(t *testing.T) string {
+func FindMonorepoRoot(t *testing.T) string {
 	path := "./"
 	// Only search up 5 directories
 	// Avoids infinite recursion if the root isn't found for some reason
@@ -85,16 +99,9 @@ func findMonorepoRoot(t *testing.T) string {
 	return ""
 }
 
-func applyCannonConfig(
-	c *config.Config,
-	t *testing.T,
-	rollupCfg *rollup.Config,
-	l2Genesis *core.Genesis,
-	l2Endpoint string,
-) {
+func applyCannonConfig(c *config.Config, t *testing.T, rollupCfg *rollup.Config, l2Genesis *core.Genesis) {
 	require := require.New(t)
-	c.CannonL2 = l2Endpoint
-	root := findMonorepoRoot(t)
+	root := FindMonorepoRoot(t)
 	c.CannonBin = root + "cannon/bin/cannon"
 	c.CannonServer = root + "op-program/bin/op-program"
 	c.CannonAbsolutePreState = root + "op-program/bin/prestate.json"
@@ -113,49 +120,37 @@ func applyCannonConfig(
 	c.CannonRollupConfigPath = rollupFile
 }
 
-func WithCannon(
-	t *testing.T,
-	rollupCfg *rollup.Config,
-	l2Genesis *core.Genesis,
-	rollupEndpoint string,
-	l2Endpoint string,
-) Option {
+func WithCannon(t *testing.T, rollupCfg *rollup.Config, l2Genesis *core.Genesis) Option {
 	return func(c *config.Config) {
 		c.TraceTypes = append(c.TraceTypes, config.TraceTypeCannon)
-		c.RollupRpc = rollupEndpoint
-		applyCannonConfig(c, t, rollupCfg, l2Genesis, l2Endpoint)
+		applyCannonConfig(c, t, rollupCfg, l2Genesis)
 	}
 }
 
-func WithAlphabet(rollupEndpoint string) Option {
+func WithAlphabet() Option {
 	return func(c *config.Config) {
 		c.TraceTypes = append(c.TraceTypes, config.TraceTypeAlphabet)
-		c.RollupRpc = rollupEndpoint
 	}
 }
 
 func NewChallenger(t *testing.T, ctx context.Context, sys EndpointProvider, name string, options ...Option) *Helper {
 	log := testlog.Logger(t, log.LevelDebug).New("role", name)
 	log.Info("Creating challenger")
-	cfg := NewChallengerConfig(t, sys, options...)
-	chl, err := challenger.Main(ctx, log, cfg)
+	cfg := NewChallengerConfig(t, sys, "sequencer", options...)
+	cfg.MetricsConfig.Enabled = false // Don't start the metrics server
+	m := NewCapturingMetrics()
+	chl, err := challenger.Main(ctx, log, cfg, m)
 	require.NoError(t, err, "must init challenger")
 	require.NoError(t, chl.Start(ctx), "must start challenger")
 
-	return &Helper{
-		log:     log,
-		t:       t,
-		require: require.New(t),
-		dir:     cfg.Datadir,
-		chl:     chl,
-	}
+	return NewHelper(log, t, require.New(t), cfg.Datadir, chl, m)
 }
 
-func NewChallengerConfig(t *testing.T, sys EndpointProvider, options ...Option) *config.Config {
+func NewChallengerConfig(t *testing.T, sys EndpointProvider, l2NodeName string, options ...Option) *config.Config {
 	// Use the NewConfig method to ensure we pick up any defaults that are set.
 	l1Endpoint := sys.NodeEndpoint("l1")
 	l1Beacon := sys.L1BeaconEndpoint()
-	cfg := config.NewConfig(common.Address{}, l1Endpoint, l1Beacon, t.TempDir())
+	cfg := config.NewConfig(common.Address{}, l1Endpoint, l1Beacon, sys.RollupEndpoint(l2NodeName), sys.NodeEndpoint(l2NodeName), t.TempDir())
 	// The devnet can't set the absolute prestate output root because the contracts are deployed in L1 genesis
 	// before the L2 genesis is known.
 	cfg.AllowInvalidPrestate = true
@@ -238,3 +233,21 @@ func (h *Helper) WaitForGameDataDeletion(ctx context.Context, games ...GameAddr)
 func (h *Helper) gameDataDir(addr common.Address) string {
 	return filepath.Join(h.dir, "game-"+addr.Hex())
 }
+
+func (h *Helper) WaitL1HeadActedOn(ctx context.Context, client *ethclient.Client) {
+	l1Head, err := client.BlockNumber(ctx)
+	h.require.NoError(err)
+	h.WaitForHighestActedL1Block(ctx, l1Head)
+}
+
+func (h *Helper) WaitForHighestActedL1Block(ctx context.Context, head uint64) {
+	timedCtx, cancel := context.WithTimeout(ctx, 30*time.Second)
+	defer cancel()
+	var actual uint64
+	err := wait.For(timedCtx, time.Second, func() (bool, error) {
+		actual = h.metrics.HighestActedL1Block.Load()
+		h.log.Info("Waiting for highest acted L1 block", "target", head, "actual", actual)
+		return actual >= head, nil
+	})
+	h.require.NoErrorf(err, "Highest acted L1 block did not reach %v, was: %v", head, actual)
+}
diff --git a/op-e2e/e2eutils/challenger/metrics.go b/op-e2e/e2eutils/challenger/metrics.go
new file mode 100644
index 000000000000..de95121480f1
--- /dev/null
+++ b/op-e2e/e2eutils/challenger/metrics.go
@@ -0,0 +1,23 @@
+package challenger
+
+import (
+	"sync/atomic"
+
+	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
+)
+
+type CapturingMetrics struct {
+	metrics.NoopMetricsImpl
+
+	HighestActedL1Block atomic.Uint64
+}
+
+func NewCapturingMetrics() *CapturingMetrics {
+	return &CapturingMetrics{}
+}
+
+var _ metrics.Metricer = (*CapturingMetrics)(nil)
+
+func (c *CapturingMetrics) RecordActedL1Block(block uint64) {
+	c.HighestActedL1Block.Store(block)
+}
diff --git a/op-e2e/e2eutils/disputegame/alphabet_helper.go b/op-e2e/e2eutils/disputegame/alphabet_helper.go
deleted file mode 100644
index 228dc52f4ba2..000000000000
--- a/op-e2e/e2eutils/disputegame/alphabet_helper.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package disputegame
-
-import (
-	"context"
-	"math/big"
-
-	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/alphabet"
-	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
-	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
-)
-
-type AlphabetGameHelper struct {
-	FaultGameHelper
-}
-
-func (g *AlphabetGameHelper) StartChallenger(ctx context.Context, sys challenger.EndpointProvider, name string, options ...challenger.Option) *challenger.Helper {
-	opts := []challenger.Option{
-		challenger.WithFactoryAddress(g.factoryAddr),
-		challenger.WithGameAddress(g.addr),
-		challenger.WithAlphabet(g.system.RollupEndpoint("sequencer")),
-	}
-	opts = append(opts, options...)
-	c := challenger.NewChallenger(g.t, ctx, sys, name, opts...)
-	g.t.Cleanup(func() {
-		_ = c.Close()
-	})
-	return c
-}
-
-func (g *AlphabetGameHelper) CreateHonestActor(alphabetTrace string, depth types.Depth) *HonestHelper {
-	return &HonestHelper{
-		t:            g.t,
-		require:      g.require,
-		game:         &g.FaultGameHelper,
-		correctTrace: alphabet.NewTraceProvider(big.NewInt(0), depth),
-	}
-}
diff --git a/op-e2e/e2eutils/disputegame/claim_helper.go b/op-e2e/e2eutils/disputegame/claim_helper.go
index eff88db4240a..4eb9c420cc03 100644
--- a/op-e2e/e2eutils/disputegame/claim_helper.go
+++ b/op-e2e/e2eutils/disputegame/claim_helper.go
@@ -15,53 +15,53 @@ import (
 type ClaimHelper struct {
 	require     *require.Assertions
 	game        *OutputGameHelper
-	index       int64
-	parentIndex uint32
-	position    types.Position
+	Index       int64
+	ParentIndex int
+	Position    types.Position
 	claim       common.Hash
 }
 
-func newClaimHelper(game *OutputGameHelper, idx int64, claim ContractClaim) *ClaimHelper {
+func newClaimHelper(game *OutputGameHelper, idx int64, claim types.Claim) *ClaimHelper {
 	return &ClaimHelper{
-		require:     game.require,
+		require:     game.Require,
 		game:        game,
-		index:       idx,
-		parentIndex: claim.ParentIndex,
-		position:    types.NewPositionFromGIndex(claim.Position),
-		claim:       claim.Claim,
+		Index:       idx,
+		ParentIndex: claim.ParentContractIndex,
+		Position:    claim.Position,
+		claim:       claim.Value,
 	}
 }
 
 func (c *ClaimHelper) AgreesWithOutputRoot() bool {
-	return c.position.Depth()%2 == 0
+	return c.Position.Depth()%2 == 0
 }
 
 func (c *ClaimHelper) IsRootClaim() bool {
-	return c.position.IsRootPosition()
+	return c.Position.IsRootPosition()
 }
 
 func (c *ClaimHelper) IsOutputRoot(ctx context.Context) bool {
 	splitDepth := c.game.SplitDepth(ctx)
-	return c.position.Depth() <= splitDepth
+	return c.Position.Depth() <= splitDepth
 }
 
 func (c *ClaimHelper) IsOutputRootLeaf(ctx context.Context) bool {
 	splitDepth := c.game.SplitDepth(ctx)
-	return c.position.Depth() == splitDepth
+	return c.Position.Depth() == splitDepth
 }
 
 func (c *ClaimHelper) IsBottomGameRoot(ctx context.Context) bool {
 	splitDepth := c.game.SplitDepth(ctx)
-	return c.position.Depth() == splitDepth+1
+	return c.Position.Depth() == splitDepth+1
 }
 
 func (c *ClaimHelper) IsMaxDepth(ctx context.Context) bool {
 	maxDepth := c.game.MaxDepth(ctx)
-	return c.position.Depth() == maxDepth
+	return c.Position.Depth() == maxDepth
 }
 
 func (c *ClaimHelper) Depth() types.Depth {
-	return c.position.Depth()
+	return c.Position.Depth()
 }
 
 // WaitForCounterClaim waits for the claim to be countered by another claim being posted.
@@ -72,8 +72,8 @@ func (c *ClaimHelper) WaitForCounterClaim(ctx context.Context, ignoreClaims ...*
 		// This is the first claim we need to run cannon on, so give it more time
 		timeout = timeout * 2
 	}
-	counterIdx, counterClaim := c.game.waitForClaim(ctx, timeout, fmt.Sprintf("failed to find claim with parent idx %v", c.index), func(claimIdx int64, claim ContractClaim) bool {
-		return int64(claim.ParentIndex) == c.index && !containsClaim(claimIdx, ignoreClaims)
+	counterIdx, counterClaim := c.game.waitForClaim(ctx, timeout, fmt.Sprintf("failed to find claim with parent idx %v", c.Index), func(claimIdx int64, claim types.Claim) bool {
+		return int64(claim.ParentContractIndex) == c.Index && !containsClaim(claimIdx, ignoreClaims)
 	})
 	return newClaimHelper(c.game, counterIdx, counterClaim)
 }
@@ -83,28 +83,28 @@ func (c *ClaimHelper) WaitForCountered(ctx context.Context) {
 	timedCtx, cancel := context.WithTimeout(ctx, defaultTimeout)
 	defer cancel()
 	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		latestData := c.game.getClaim(ctx, c.index)
+		latestData := c.game.getClaim(ctx, c.Index)
 		return latestData.CounteredBy != common.Address{}, nil
 	})
 	if err != nil { // Avoid waiting time capturing game data when there's no error
-		c.require.NoErrorf(err, "Claim %v was not countered\n%v", c.index, c.game.gameData(ctx))
+		c.require.NoErrorf(err, "Claim %v was not countered\n%v", c.Index, c.game.GameData(ctx))
 	}
 }
 
 func (c *ClaimHelper) RequireCorrectOutputRoot(ctx context.Context) {
 	c.require.True(c.IsOutputRoot(ctx), "Should not expect a valid output root in the bottom game")
-	expected, err := c.game.correctOutputProvider.Get(ctx, c.position)
+	expected, err := c.game.CorrectOutputProvider.Get(ctx, c.Position)
 	c.require.NoError(err, "Failed to get correct output root")
-	c.require.Equalf(expected, c.claim, "Should have correct output root in claim %v and position %v", c.index, c.position)
+	c.require.Equalf(expected, c.claim, "Should have correct output root in claim %v and position %v", c.Index, c.Position)
 }
 
 func (c *ClaimHelper) Attack(ctx context.Context, value common.Hash, opts ...MoveOpt) *ClaimHelper {
-	c.game.Attack(ctx, c.index, value, opts...)
+	c.game.Attack(ctx, c.Index, value, opts...)
 	return c.WaitForCounterClaim(ctx)
 }
 
 func (c *ClaimHelper) Defend(ctx context.Context, value common.Hash, opts ...MoveOpt) *ClaimHelper {
-	c.game.Defend(ctx, c.index, value, opts...)
+	c.game.Defend(ctx, c.Index, value, opts...)
 	return c.WaitForCounterClaim(ctx)
 }
 
@@ -115,19 +115,19 @@ func (c *ClaimHelper) RequireDifferentClaimValue(other *ClaimHelper) {
 func (c *ClaimHelper) RequireOnlyCounteredBy(ctx context.Context, expected ...*ClaimHelper) {
 	claims := c.game.getAllClaims(ctx)
 	for idx, claim := range claims {
-		if int64(claim.ParentIndex) != c.index {
+		if int64(claim.ParentContractIndex) != c.Index {
 			// Doesn't counter this claim, so ignore
 			continue
 		}
 		if !containsClaim(int64(idx), expected) {
 			// Found a countering claim not in the expected list. Fail.
-			c.require.FailNowf("Found unexpected countering claim", "Parent claim index: %v Game state:\n%v", c.index, c.game.gameData(ctx))
+			c.require.FailNowf("Found unexpected countering claim", "Parent claim index: %v Game state:\n%v", c.Index, c.game.GameData(ctx))
 		}
 	}
 }
 
 func containsClaim(claimIdx int64, haystack []*ClaimHelper) bool {
 	return slices.ContainsFunc(haystack, func(candidate *ClaimHelper) bool {
-		return candidate.index == claimIdx
+		return candidate.Index == claimIdx
 	})
 }
diff --git a/op-e2e/e2eutils/disputegame/dishonest_helper.go b/op-e2e/e2eutils/disputegame/dishonest_helper.go
index 1b5798a06f50..015e2cd8049c 100644
--- a/op-e2e/e2eutils/disputegame/dishonest_helper.go
+++ b/op-e2e/e2eutils/disputegame/dishonest_helper.go
@@ -25,7 +25,7 @@ func (d *DishonestHelper) ExhaustDishonestClaims(ctx context.Context, rootClaim
 	depth := d.MaxDepth(ctx)
 	splitDepth := d.SplitDepth(ctx)
 
-	move := func(claimIndex int64, claimData ContractClaim) {
+	move := func(claimIndex int64, claimData types.Claim) {
 		// dishonest level, valid attack
 		// dishonest level, invalid attack
 		// dishonest level, valid defense
@@ -33,27 +33,26 @@ func (d *DishonestHelper) ExhaustDishonestClaims(ctx context.Context, rootClaim
 		// honest level, invalid attack
 		// honest level, invalid defense
 
-		pos := types.NewPositionFromGIndex(claimData.Position)
-		if pos.Depth() == depth {
+		if claimData.Depth() == depth {
 			return
 		}
 
 		d.LogGameData(ctx)
-		d.OutputGameHelper.t.Logf("Dishonest moves against claimIndex %d", claimIndex)
-		agreeWithLevel := d.defender == (pos.Depth()%2 == 0)
+		d.OutputGameHelper.T.Logf("Dishonest moves against claimIndex %d", claimIndex)
+		agreeWithLevel := d.defender == (claimData.Depth()%2 == 0)
 		if !agreeWithLevel {
 			d.OutputHonestHelper.Attack(ctx, claimIndex, WithIgnoreDuplicates())
-			if claimIndex != 0 && pos.Depth() != splitDepth+1 {
+			if claimIndex != 0 && claimData.Depth() != splitDepth+1 {
 				d.OutputHonestHelper.Defend(ctx, claimIndex, WithIgnoreDuplicates())
 			}
 		}
 		d.OutputGameHelper.Attack(ctx, claimIndex, common.Hash{byte(claimIndex)}, WithIgnoreDuplicates())
-		if claimIndex != 0 && pos.Depth() != splitDepth+1 {
+		if claimIndex != 0 && claimData.Depth() != splitDepth+1 {
 			d.OutputGameHelper.Defend(ctx, claimIndex, common.Hash{byte(claimIndex)}, WithIgnoreDuplicates())
 		}
 	}
 
-	numClaimsSeen := rootClaim.index
+	numClaimsSeen := rootClaim.Index
 	for {
 		// Use a short timeout since we don't know the challenger will respond,
 		// and this is only designed for the alphabet game where the response should be fast.
@@ -63,7 +62,7 @@ func (d *DishonestHelper) ExhaustDishonestClaims(ctx context.Context, rootClaim
 			// There's nothing to respond to.
 			break
 		}
-		d.OutputGameHelper.require.NoError(err)
+		d.OutputGameHelper.Require.NoError(err)
 
 		for ; numClaimsSeen < newCount; numClaimsSeen++ {
 			claimData := d.getClaim(ctx, numClaimsSeen)
diff --git a/op-e2e/e2eutils/disputegame/game_helper.go b/op-e2e/e2eutils/disputegame/game_helper.go
deleted file mode 100644
index b23d54e6a101..000000000000
--- a/op-e2e/e2eutils/disputegame/game_helper.go
+++ /dev/null
@@ -1,364 +0,0 @@
-package disputegame
-
-import (
-	"context"
-	"fmt"
-	"math/big"
-	"testing"
-	"time"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
-	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
-	"github.com/ethereum/go-ethereum/accounts/abi/bind"
-	"github.com/ethereum/go-ethereum/common"
-	gethtypes "github.com/ethereum/go-ethereum/core/types"
-	"github.com/ethereum/go-ethereum/ethclient"
-	"github.com/stretchr/testify/require"
-)
-
-type FaultGameHelper struct {
-	t           *testing.T
-	require     *require.Assertions
-	client      *ethclient.Client
-	opts        *bind.TransactOpts
-	game        *bindings.FaultDisputeGame
-	factoryAddr common.Address
-	addr        common.Address
-	system      DisputeSystem
-}
-
-func (g *FaultGameHelper) Addr() common.Address {
-	return g.addr
-}
-
-func (g *FaultGameHelper) GameDuration(ctx context.Context) time.Duration {
-	duration, err := g.game.GameDuration(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "failed to get game duration")
-	return time.Duration(duration) * time.Second
-}
-
-// WaitForClaimCount waits until there are at least count claims in the game.
-// This does not check that the number of claims is exactly the specified count to avoid intermittent failures
-// where a challenger posts an additional claim before this method sees the number of claims it was waiting for.
-func (g *FaultGameHelper) WaitForClaimCount(ctx context.Context, count int64) {
-	timedCtx, cancel := context.WithTimeout(ctx, defaultTimeout)
-	defer cancel()
-	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		actual, err := g.game.ClaimDataLen(&bind.CallOpts{Context: timedCtx})
-		if err != nil {
-			return false, err
-		}
-		g.t.Log("Waiting for claim count", "current", actual, "expected", count, "game", g.addr)
-		return actual.Cmp(big.NewInt(count)) >= 0, nil
-	})
-	if err != nil {
-		g.LogGameData(ctx)
-		g.require.NoErrorf(err, "Did not find expected claim count %v", count)
-	}
-}
-
-func (g *FaultGameHelper) MaxDepth(ctx context.Context) types.Depth {
-	depth, err := g.game.MaxGameDepth(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "Failed to load game depth")
-	return types.Depth(depth.Uint64())
-}
-
-func (g *FaultGameHelper) waitForClaim(ctx context.Context, errorMsg string, predicate func(claim ContractClaim) bool) {
-	timedCtx, cancel := context.WithTimeout(ctx, defaultTimeout)
-	defer cancel()
-	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		count, err := g.game.ClaimDataLen(&bind.CallOpts{Context: timedCtx})
-		if err != nil {
-			return false, fmt.Errorf("retrieve number of claims: %w", err)
-		}
-		// Search backwards because the new claims are at the end and more likely the ones we want.
-		for i := count.Int64() - 1; i >= 0; i-- {
-			claimData, err := g.game.ClaimData(&bind.CallOpts{Context: timedCtx}, big.NewInt(i))
-			if err != nil {
-				return false, fmt.Errorf("retrieve claim %v: %w", i, err)
-			}
-			if predicate(claimData) {
-				return true, nil
-			}
-		}
-		return false, nil
-	})
-	if err != nil { // Avoid waiting time capturing game data when there's no error
-		g.require.NoErrorf(err, "%v\n%v", errorMsg, g.gameData(ctx))
-	}
-}
-
-func (g *FaultGameHelper) waitForNoClaim(ctx context.Context, errorMsg string, predicate func(claim ContractClaim) bool) {
-	timedCtx, cancel := context.WithTimeout(ctx, defaultTimeout)
-	defer cancel()
-	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		count, err := g.game.ClaimDataLen(&bind.CallOpts{Context: timedCtx})
-		if err != nil {
-			return false, fmt.Errorf("retrieve number of claims: %w", err)
-		}
-		// Search backwards because the new claims are at the end and more likely the ones we will fail on.
-		for i := count.Int64() - 1; i >= 0; i-- {
-			claimData, err := g.game.ClaimData(&bind.CallOpts{Context: timedCtx}, big.NewInt(i))
-			if err != nil {
-				return false, fmt.Errorf("retrieve claim %v: %w", i, err)
-			}
-			if predicate(claimData) {
-				return false, nil
-			}
-		}
-		return true, nil
-	})
-	if err != nil { // Avoid waiting time capturing game data when there's no error
-		g.require.NoErrorf(err, "%v\n%v", errorMsg, g.gameData(ctx))
-	}
-}
-
-func (g *FaultGameHelper) GetClaimValue(ctx context.Context, claimIdx int64) common.Hash {
-	g.WaitForClaimCount(ctx, claimIdx+1)
-	claim := g.getClaim(ctx, claimIdx)
-	return claim.Claim
-}
-
-func (g *FaultGameHelper) GetClaimPosition(ctx context.Context, claimIdx int64) types.Position {
-	g.WaitForClaimCount(ctx, claimIdx+1)
-	claim := g.getClaim(ctx, claimIdx)
-	return types.NewPositionFromGIndex(claim.Position)
-}
-
-// getClaim retrieves the claim data for a specific index.
-// Note that it is deliberately not exported as tests should use WaitForClaim to avoid race conditions.
-func (g *FaultGameHelper) getClaim(ctx context.Context, claimIdx int64) ContractClaim {
-	claimData, err := g.game.ClaimData(&bind.CallOpts{Context: ctx}, big.NewInt(claimIdx))
-	if err != nil {
-		g.require.NoErrorf(err, "retrieve claim %v", claimIdx)
-	}
-	return claimData
-}
-
-// getClaimPosition retrieves the [types.Position] of a claim at a specific index.
-func (g *FaultGameHelper) getClaimPosition(ctx context.Context, claimIdx int64) types.Position {
-	return types.NewPositionFromGIndex(g.getClaim(ctx, claimIdx).Position)
-}
-
-func (g *FaultGameHelper) WaitForClaimAtDepth(ctx context.Context, depth types.Depth) {
-	g.waitForClaim(
-		ctx,
-		fmt.Sprintf("Could not find claim depth %v", depth),
-		func(claim ContractClaim) bool {
-			pos := types.NewPositionFromGIndex(claim.Position)
-			return pos.Depth() == depth
-		})
-}
-
-func (g *FaultGameHelper) WaitForClaimAtMaxDepth(ctx context.Context, countered bool) {
-	maxDepth := g.MaxDepth(ctx)
-	g.waitForClaim(
-		ctx,
-		fmt.Sprintf("Could not find claim depth %v with countered=%v", maxDepth, countered),
-		func(claim ContractClaim) bool {
-			pos := types.NewPositionFromGIndex(claim.Position)
-			return pos.Depth() == maxDepth && (claim.CounteredBy != common.Address{}) == countered
-		})
-}
-
-func (g *FaultGameHelper) WaitForAllClaimsCountered(ctx context.Context) {
-	g.waitForNoClaim(
-		ctx,
-		"Did not find all claims countered",
-		func(claim ContractClaim) bool {
-			return claim.CounteredBy == common.Address{}
-		})
-}
-
-func (g *FaultGameHelper) Resolve(ctx context.Context) {
-	ctx, cancel := context.WithTimeout(ctx, time.Minute)
-	defer cancel()
-	tx, err := g.game.Resolve(g.opts)
-	g.require.NoError(err)
-	_, err = wait.ForReceiptOK(ctx, g.client, tx.Hash())
-	g.require.NoError(err)
-}
-
-func (g *FaultGameHelper) Status(ctx context.Context) Status {
-	status, err := g.game.Status(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err)
-	return Status(status)
-}
-
-func (g *FaultGameHelper) WaitForGameStatus(ctx context.Context, expected Status) {
-	g.t.Logf("Waiting for game %v to have status %v", g.addr, expected)
-	timedCtx, cancel := context.WithTimeout(ctx, defaultTimeout)
-	defer cancel()
-	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		ctx, cancel := context.WithTimeout(timedCtx, 30*time.Second)
-		defer cancel()
-		status, err := g.game.Status(&bind.CallOpts{Context: ctx})
-		if err != nil {
-			return false, fmt.Errorf("game status unavailable: %w", err)
-		}
-		g.t.Logf("Game %v has state %v, waiting for state %v", g.addr, Status(status), expected)
-		return expected == Status(status), nil
-	})
-	g.require.NoErrorf(err, "wait for game status. Game state: \n%v", g.gameData(ctx))
-}
-
-func (g *FaultGameHelper) WaitForInactivity(ctx context.Context, numInactiveBlocks int, untilGameEnds bool) {
-	g.t.Logf("Waiting for game %v to have no activity for %v blocks", g.addr, numInactiveBlocks)
-	headCh := make(chan *gethtypes.Header, 100)
-	headSub, err := g.client.SubscribeNewHead(ctx, headCh)
-	g.require.NoError(err)
-	defer headSub.Unsubscribe()
-
-	var lastActiveBlock uint64
-	for {
-		if untilGameEnds && g.Status(ctx) != StatusInProgress {
-			break
-		}
-		select {
-		case head := <-headCh:
-			if lastActiveBlock == 0 {
-				lastActiveBlock = head.Number.Uint64()
-				continue
-			} else if lastActiveBlock+uint64(numInactiveBlocks) < head.Number.Uint64() {
-				return
-			}
-			block, err := g.client.BlockByNumber(ctx, head.Number)
-			g.require.NoError(err)
-			numActions := 0
-			for _, tx := range block.Transactions() {
-				if tx.To().Hex() == g.addr.Hex() {
-					numActions++
-				}
-			}
-			if numActions != 0 {
-				g.t.Logf("Game %v has %v actions in block %d. Resetting inactivity timeout", g.addr, numActions, block.NumberU64())
-				lastActiveBlock = head.Number.Uint64()
-			}
-		case err := <-headSub.Err():
-			g.require.NoError(err)
-		case <-ctx.Done():
-			g.require.Fail("Context canceled", ctx.Err())
-		}
-	}
-}
-
-// DefendRootClaim uses the supplied Mover to perform moves in an attempt to defend the root claim.
-// It is assumed that the output root being disputed is valid and that an honest op-challenger is already running.
-// When the game has reached the maximum depth it waits for the honest challenger to counter the leaf claim with step.
-func (g *FaultGameHelper) DefendRootClaim(ctx context.Context, performMove func(parentClaimIdx int64)) {
-	maxDepth := g.MaxDepth(ctx)
-	for claimCount := int64(1); types.Depth(claimCount) < maxDepth; {
-		g.LogGameData(ctx)
-		claimCount++
-		// Wait for the challenger to counter
-		g.WaitForClaimCount(ctx, claimCount)
-
-		// Respond with our own move
-		performMove(claimCount - 1)
-		claimCount++
-		g.WaitForClaimCount(ctx, claimCount)
-	}
-
-	// Wait for the challenger to call step and counter our invalid claim
-	g.WaitForClaimAtMaxDepth(ctx, true)
-}
-
-// ChallengeRootClaim uses the supplied Mover and Stepper to perform moves and steps in an attempt to challenge the root claim.
-// It is assumed that the output root being disputed is invalid and that an honest op-challenger is already running.
-// When the game has reached the maximum depth it calls the Stepper to attempt to counter the leaf claim.
-// Since the output root is invalid, it should not be possible for the Stepper to call step successfully.
-func (g *FaultGameHelper) ChallengeRootClaim(ctx context.Context, performMove func(parentClaimIdx int64), attemptStep Stepper) {
-	maxDepth := g.MaxDepth(ctx)
-	for claimCount := int64(1); types.Depth(claimCount) < maxDepth; {
-		g.LogGameData(ctx)
-		// Perform our move
-		performMove(claimCount - 1)
-		claimCount++
-		g.WaitForClaimCount(ctx, claimCount)
-
-		// Wait for the challenger to counter
-		claimCount++
-		g.WaitForClaimCount(ctx, claimCount)
-	}
-
-	// Confirm the game has reached max depth and the last claim hasn't been countered
-	g.WaitForClaimAtMaxDepth(ctx, false)
-	g.LogGameData(ctx)
-
-	// It's on us to call step if we want to win but shouldn't be possible
-	attemptStep(int64(maxDepth))
-}
-
-func (g *FaultGameHelper) WaitForNewClaim(ctx context.Context, checkPoint int64) (int64, error) {
-	return g.waitForNewClaim(ctx, checkPoint, defaultTimeout)
-}
-
-func (g *FaultGameHelper) waitForNewClaim(ctx context.Context, checkPoint int64, timeout time.Duration) (int64, error) {
-	timedCtx, cancel := context.WithTimeout(ctx, timeout)
-	defer cancel()
-	var newClaimLen int64
-	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		actual, err := g.game.ClaimDataLen(&bind.CallOpts{Context: ctx})
-		if err != nil {
-			return false, err
-		}
-		newClaimLen = actual.Int64()
-		return actual.Cmp(big.NewInt(checkPoint)) > 0, nil
-	})
-	return newClaimLen, err
-}
-
-func (g *FaultGameHelper) Attack(ctx context.Context, claimIdx int64, claim common.Hash) {
-	tx, err := g.game.Attack(g.opts, big.NewInt(claimIdx), claim)
-	g.require.NoError(err, "Attack transaction did not send")
-	_, err = wait.ForReceiptOK(ctx, g.client, tx.Hash())
-	g.require.NoError(err, "Attack transaction was not OK")
-}
-
-func (g *FaultGameHelper) Defend(ctx context.Context, claimIdx int64, claim common.Hash) {
-	tx, err := g.game.Defend(g.opts, big.NewInt(claimIdx), claim)
-	g.require.NoError(err, "Defend transaction did not send")
-	_, err = wait.ForReceiptOK(ctx, g.client, tx.Hash())
-	g.require.NoError(err, "Defend transaction was not OK")
-}
-
-// StepFails attempts to call step and verifies that it fails with ValidStep()
-func (g *FaultGameHelper) StepFails(claimIdx int64, isAttack bool, stateData []byte, proof []byte) {
-	g.t.Logf("Attempting step against claim %v isAttack: %v", claimIdx, isAttack)
-	_, err := g.game.Step(g.opts, big.NewInt(claimIdx), isAttack, stateData, proof)
-	errData, ok := err.(ErrWithData)
-	g.require.Truef(ok, "Error should provide ErrorData method: %v", err)
-	g.require.Equal("0xfb4e40dd", errData.ErrorData(), "Revert reason should be abi encoded ValidStep()")
-}
-
-// ResolveClaim resolves a single subgame
-func (g *FaultGameHelper) ResolveClaim(ctx context.Context, claimIdx int64) {
-	tx, err := g.game.ResolveClaim(g.opts, big.NewInt(claimIdx))
-	g.require.NoError(err, "ResolveClaim transaction did not send")
-	_, err = wait.ForReceiptOK(ctx, g.client, tx.Hash())
-	g.require.NoError(err, "ResolveClaim transaction was not OK")
-}
-
-func (g *FaultGameHelper) gameData(ctx context.Context) string {
-	opts := &bind.CallOpts{Context: ctx}
-	maxDepth := g.MaxDepth(ctx)
-	claimCount, err := g.game.ClaimDataLen(opts)
-	info := fmt.Sprintf("Claim count: %v\n", claimCount)
-	g.require.NoError(err, "Fetching claim count")
-	for i := int64(0); i < claimCount.Int64(); i++ {
-		claim, err := g.game.ClaimData(opts, big.NewInt(i))
-		g.require.NoErrorf(err, "Fetch claim %v", i)
-
-		pos := types.NewPositionFromGIndex(claim.Position)
-		info = info + fmt.Sprintf("%v - Position: %v, Depth: %v, IndexAtDepth: %v Trace Index: %v, Value: %v, Countered: %v, ParentIndex: %v\n",
-			i, claim.Position.Int64(), pos.Depth(), pos.IndexAtDepth(), pos.TraceIndex(maxDepth), common.Hash(claim.Claim).Hex(), claim.CounteredBy, claim.ParentIndex)
-	}
-	status, err := g.game.Status(opts)
-	g.require.NoError(err, "Load game status")
-	return fmt.Sprintf("Game %v (%v):\n%v\n", g.addr, Status(status), info)
-}
-
-func (g *FaultGameHelper) LogGameData(ctx context.Context) {
-	g.t.Log(g.gameData(ctx))
-}
diff --git a/op-e2e/e2eutils/disputegame/helper.go b/op-e2e/e2eutils/disputegame/helper.go
index 568d9d6fe588..57f6908be65e 100644
--- a/op-e2e/e2eutils/disputegame/helper.go
+++ b/op-e2e/e2eutils/disputegame/helper.go
@@ -3,16 +3,15 @@ package disputegame
 import (
 	"context"
 	"encoding/binary"
-	"fmt"
 	"math/big"
 	"testing"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/deployer"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/outputs"
-	faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/disputegame/preimage"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth"
@@ -21,64 +20,50 @@ import (
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/sources"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core"
 	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
 )
 
-const (
-	cannonGameType    uint32 = 0
-	alphabetGameType  uint32 = 255
-	alphabetGameDepth        = 4
+var (
+	// TestKey is the same test key that geth uses
+	TestKey, _  = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
+	TestAddress = crypto.PubkeyToAddress(TestKey.PublicKey)
 )
 
-type Status uint8
-
 const (
-	StatusInProgress Status = iota
-	StatusChallengerWins
-	StatusDefenderWins
+	cannonGameType   uint32 = 0
+	alphabetGameType uint32 = 255
 )
 
-func (s Status) String() string {
-	switch s {
-	case StatusInProgress:
-		return "In Progress"
-	case StatusChallengerWins:
-		return "Challenger Wins"
-	case StatusDefenderWins:
-		return "Defender Wins"
-	default:
-		return fmt.Sprintf("Unknown status: %v", int(s))
-	}
-}
-
-type gameCfg struct {
+type GameCfg struct {
 	allowFuture bool
 	allowUnsafe bool
 }
 type GameOpt interface {
-	Apply(cfg *gameCfg)
+	Apply(cfg *GameCfg)
 }
-type gameOptFn func(c *gameCfg)
+type gameOptFn func(c *GameCfg)
 
-func (g gameOptFn) Apply(cfg *gameCfg) {
+func (g gameOptFn) Apply(cfg *GameCfg) {
 	g(cfg)
 }
 
 func WithUnsafeProposal() GameOpt {
-	return gameOptFn(func(c *gameCfg) {
+	return gameOptFn(func(c *GameCfg) {
 		c.allowUnsafe = true
 	})
 }
 
 func WithFutureProposal() GameOpt {
-	return gameOptFn(func(c *gameCfg) {
+	return gameOptFn(func(c *GameCfg) {
 		c.allowFuture = true
 	})
 }
@@ -98,13 +83,13 @@ type DisputeSystem interface {
 }
 
 type FactoryHelper struct {
-	t           *testing.T
-	require     *require.Assertions
-	system      DisputeSystem
-	client      *ethclient.Client
-	opts        *bind.TransactOpts
-	factoryAddr common.Address
-	factory     *bindings.DisputeGameFactory
+	T           *testing.T
+	Require     *require.Assertions
+	System      DisputeSystem
+	Client      *ethclient.Client
+	Opts        *bind.TransactOpts
+	FactoryAddr common.Address
+	Factory     *bindings.DisputeGameFactory
 }
 
 func NewFactoryHelper(t *testing.T, ctx context.Context, system DisputeSystem) *FactoryHelper {
@@ -112,7 +97,7 @@ func NewFactoryHelper(t *testing.T, ctx context.Context, system DisputeSystem) *
 	client := system.NodeClient("l1")
 	chainID, err := client.ChainID(ctx)
 	require.NoError(err)
-	opts, err := bind.NewKeyedTransactorWithChainID(deployer.TestKey, chainID)
+	opts, err := bind.NewKeyedTransactorWithChainID(TestKey, chainID)
 	require.NoError(err)
 
 	l1Deployments := system.L1Deployments()
@@ -121,33 +106,33 @@ func NewFactoryHelper(t *testing.T, ctx context.Context, system DisputeSystem) *
 	require.NoError(err)
 
 	return &FactoryHelper{
-		t:           t,
-		require:     require,
-		system:      system,
-		client:      client,
-		opts:        opts,
-		factory:     factory,
-		factoryAddr: factoryAddr,
+		T:           t,
+		Require:     require,
+		System:      system,
+		Client:      client,
+		Opts:        opts,
+		Factory:     factory,
+		FactoryAddr: factoryAddr,
 	}
 }
 
 func (h *FactoryHelper) PreimageHelper(ctx context.Context) *preimage.Helper {
 	opts := &bind.CallOpts{Context: ctx}
-	gameAddr, err := h.factory.GameImpls(opts, cannonGameType)
-	h.require.NoError(err)
-	game, err := bindings.NewFaultDisputeGameCaller(gameAddr, h.client)
-	h.require.NoError(err)
+	gameAddr, err := h.Factory.GameImpls(opts, cannonGameType)
+	h.Require.NoError(err)
+	game, err := bindings.NewFaultDisputeGameCaller(gameAddr, h.Client)
+	h.Require.NoError(err)
 	vmAddr, err := game.Vm(opts)
-	h.require.NoError(err)
-	vm, err := bindings.NewMIPSCaller(vmAddr, h.client)
-	h.require.NoError(err)
+	h.Require.NoError(err)
+	vm, err := bindings.NewMIPSCaller(vmAddr, h.Client)
+	h.Require.NoError(err)
 	oracleAddr, err := vm.Oracle(opts)
-	h.require.NoError(err)
-	return preimage.NewHelper(h.t, h.opts, h.client, oracleAddr)
+	h.Require.NoError(err)
+	return preimage.NewHelper(h.T, h.Opts, h.Client, oracleAddr)
 }
 
-func newGameCfg(opts ...GameOpt) *gameCfg {
-	cfg := &gameCfg{}
+func NewGameCfg(opts ...GameOpt) *GameCfg {
+	cfg := &GameCfg{}
 	for _, opt := range opts {
 		opt.Apply(cfg)
 	}
@@ -155,159 +140,139 @@ func newGameCfg(opts ...GameOpt) *gameCfg {
 }
 
 func (h *FactoryHelper) StartOutputCannonGameWithCorrectRoot(ctx context.Context, l2Node string, l2BlockNumber uint64, opts ...GameOpt) *OutputCannonGameHelper {
-	cfg := newGameCfg(opts...)
-	h.waitForBlock(l2Node, l2BlockNumber, cfg)
-	output, err := h.system.RollupClient(l2Node).OutputAtBlock(ctx, l2BlockNumber)
-	h.require.NoErrorf(err, "Failed to get output at block %v", l2BlockNumber)
+	cfg := NewGameCfg(opts...)
+	h.WaitForBlock(l2Node, l2BlockNumber, cfg)
+	output, err := h.System.RollupClient(l2Node).OutputAtBlock(ctx, l2BlockNumber)
+	h.Require.NoErrorf(err, "Failed to get output at block %v", l2BlockNumber)
 	return h.StartOutputCannonGame(ctx, l2Node, l2BlockNumber, common.Hash(output.OutputRoot), opts...)
 }
 
 func (h *FactoryHelper) StartOutputCannonGame(ctx context.Context, l2Node string, l2BlockNumber uint64, rootClaim common.Hash, opts ...GameOpt) *OutputCannonGameHelper {
-	cfg := newGameCfg(opts...)
-	logger := testlog.Logger(h.t, log.LevelInfo).New("role", "OutputCannonGameHelper")
-	rollupClient := h.system.RollupClient(l2Node)
+	cfg := NewGameCfg(opts...)
+	logger := testlog.Logger(h.T, log.LevelInfo).New("role", "OutputCannonGameHelper")
+	rollupClient := h.System.RollupClient(l2Node)
+	l2Client := h.System.NodeClient(l2Node)
 
-	extraData := h.createBisectionGameExtraData(l2Node, l2BlockNumber, cfg)
+	extraData := h.CreateBisectionGameExtraData(l2Node, l2BlockNumber, cfg)
 
 	ctx, cancel := context.WithTimeout(ctx, 1*time.Minute)
 	defer cancel()
 
-	tx, err := transactions.PadGasEstimate(h.opts, 2, func(opts *bind.TransactOpts) (*types.Transaction, error) {
-		return h.factory.Create(opts, cannonGameType, rootClaim, extraData)
+	tx, err := transactions.PadGasEstimate(h.Opts, 2, func(opts *bind.TransactOpts) (*types.Transaction, error) {
+		return h.Factory.Create(opts, cannonGameType, rootClaim, extraData)
 	})
-	h.require.NoError(err, "create fault dispute game")
-	rcpt, err := wait.ForReceiptOK(ctx, h.client, tx.Hash())
-	h.require.NoError(err, "wait for create fault dispute game receipt to be OK")
-	h.require.Len(rcpt.Logs, 2, "should have emitted a single DisputeGameCreated event")
-	createdEvent, err := h.factory.ParseDisputeGameCreated(*rcpt.Logs[1])
-	h.require.NoError(err)
-	game, err := bindings.NewFaultDisputeGame(createdEvent.DisputeProxy, h.client)
-	h.require.NoError(err)
-
-	callOpts := &bind.CallOpts{Context: ctx}
-	prestateBlock, err := game.GenesisBlockNumber(callOpts)
-	h.require.NoError(err, "Failed to load genesis block number")
-	poststateBlock, err := game.L2BlockNumber(callOpts)
-	h.require.NoError(err, "Failed to load l2 block number")
-	splitDepth, err := game.SplitDepth(callOpts)
-	h.require.NoError(err, "Failed to load split depth")
-	l1Head := h.getL1Head(ctx, game)
-
-	prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock.Uint64())
-	provider := outputs.NewTraceProvider(logger, prestateProvider, rollupClient, l1Head, faultTypes.Depth(splitDepth.Uint64()), prestateBlock.Uint64(), poststateBlock.Uint64())
+	h.Require.NoError(err, "create fault dispute game")
+	rcpt, err := wait.ForReceiptOK(ctx, h.Client, tx.Hash())
+	h.Require.NoError(err, "wait for create fault dispute game receipt to be OK")
+	h.Require.Len(rcpt.Logs, 2, "should have emitted a single DisputeGameCreated event")
+	createdEvent, err := h.Factory.ParseDisputeGameCreated(*rcpt.Logs[1])
+	h.Require.NoError(err)
+	gameBindings, err := bindings.NewFaultDisputeGame(createdEvent.DisputeProxy, h.Client)
+	h.Require.NoError(err)
+	game, err := contracts.NewFaultDisputeGameContract(ctx, metrics.NoopContractMetrics, createdEvent.DisputeProxy, batching.NewMultiCaller(h.Client.Client(), batching.DefaultBatchSize))
+	h.Require.NoError(err)
+
+	prestateBlock, poststateBlock, err := game.GetBlockRange(ctx)
+	h.Require.NoError(err, "Failed to load starting block number")
+	splitDepth, err := game.GetSplitDepth(ctx)
+	h.Require.NoError(err, "Failed to load split depth")
+	l1Head := h.GetL1Head(ctx, game)
+
+	prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock)
+	provider := outputs.NewTraceProvider(logger, prestateProvider, rollupClient, l2Client, l1Head, splitDepth, prestateBlock, poststateBlock)
 
 	return &OutputCannonGameHelper{
-		OutputGameHelper: OutputGameHelper{
-			t:                     h.t,
-			require:               h.require,
-			client:                h.client,
-			opts:                  h.opts,
-			game:                  game,
-			factoryAddr:           h.factoryAddr,
-			addr:                  createdEvent.DisputeProxy,
-			correctOutputProvider: provider,
-			system:                h.system,
-		},
+		OutputGameHelper: *NewOutputGameHelper(h.T, h.Require, h.Client, h.Opts, game, gameBindings, h.FactoryAddr, createdEvent.DisputeProxy, provider, h.System),
 	}
 }
 
-func (h *FactoryHelper) getL1Head(ctx context.Context, game *bindings.FaultDisputeGame) eth.BlockID {
-	l1HeadHash, err := game.L1Head(&bind.CallOpts{Context: ctx})
-	h.require.NoError(err, "Failed to load L1 head")
-	l1Header, err := h.client.HeaderByHash(ctx, l1HeadHash)
-	h.require.NoError(err, "Failed to load L1 header")
+func (h *FactoryHelper) GetL1Head(ctx context.Context, game contracts.FaultDisputeGameContract) eth.BlockID {
+	l1HeadHash, err := game.GetL1Head(ctx)
+	h.Require.NoError(err, "Failed to load L1 head")
+	l1Header, err := h.Client.HeaderByHash(ctx, l1HeadHash)
+	h.Require.NoError(err, "Failed to load L1 header")
 	l1Head := eth.HeaderBlockID(l1Header)
 	return l1Head
 }
 
 func (h *FactoryHelper) StartOutputAlphabetGameWithCorrectRoot(ctx context.Context, l2Node string, l2BlockNumber uint64, opts ...GameOpt) *OutputAlphabetGameHelper {
-	cfg := newGameCfg(opts...)
-	h.waitForBlock(l2Node, l2BlockNumber, cfg)
-	output, err := h.system.RollupClient(l2Node).OutputAtBlock(ctx, l2BlockNumber)
-	h.require.NoErrorf(err, "Failed to get output at block %v", l2BlockNumber)
+	cfg := NewGameCfg(opts...)
+	h.WaitForBlock(l2Node, l2BlockNumber, cfg)
+	output, err := h.System.RollupClient(l2Node).OutputAtBlock(ctx, l2BlockNumber)
+	h.Require.NoErrorf(err, "Failed to get output at block %v", l2BlockNumber)
 	return h.StartOutputAlphabetGame(ctx, l2Node, l2BlockNumber, common.Hash(output.OutputRoot))
 }
 
 func (h *FactoryHelper) StartOutputAlphabetGame(ctx context.Context, l2Node string, l2BlockNumber uint64, rootClaim common.Hash, opts ...GameOpt) *OutputAlphabetGameHelper {
-	cfg := newGameCfg(opts...)
-	logger := testlog.Logger(h.t, log.LevelInfo).New("role", "OutputAlphabetGameHelper")
-	rollupClient := h.system.RollupClient(l2Node)
+	cfg := NewGameCfg(opts...)
+	logger := testlog.Logger(h.T, log.LevelInfo).New("role", "OutputAlphabetGameHelper")
+	rollupClient := h.System.RollupClient(l2Node)
+	l2Client := h.System.NodeClient(l2Node)
 
-	extraData := h.createBisectionGameExtraData(l2Node, l2BlockNumber, cfg)
+	extraData := h.CreateBisectionGameExtraData(l2Node, l2BlockNumber, cfg)
 
 	ctx, cancel := context.WithTimeout(ctx, 1*time.Minute)
 	defer cancel()
 
-	tx, err := transactions.PadGasEstimate(h.opts, 2, func(opts *bind.TransactOpts) (*types.Transaction, error) {
-		return h.factory.Create(opts, alphabetGameType, rootClaim, extraData)
+	tx, err := transactions.PadGasEstimate(h.Opts, 2, func(opts *bind.TransactOpts) (*types.Transaction, error) {
+		return h.Factory.Create(opts, alphabetGameType, rootClaim, extraData)
 	})
-	h.require.NoError(err, "create output bisection game")
-	rcpt, err := wait.ForReceiptOK(ctx, h.client, tx.Hash())
-	h.require.NoError(err, "wait for create output bisection game receipt to be OK")
-	h.require.Len(rcpt.Logs, 2, "should have emitted a single DisputeGameCreated event")
-	createdEvent, err := h.factory.ParseDisputeGameCreated(*rcpt.Logs[1])
-	h.require.NoError(err)
-	game, err := bindings.NewFaultDisputeGame(createdEvent.DisputeProxy, h.client)
-	h.require.NoError(err)
-
-	callOpts := &bind.CallOpts{Context: ctx}
-	prestateBlock, err := game.GenesisBlockNumber(callOpts)
-	h.require.NoError(err, "Failed to load genesis block number")
-	poststateBlock, err := game.L2BlockNumber(callOpts)
-	h.require.NoError(err, "Failed to load l2 block number")
-	splitDepth, err := game.SplitDepth(callOpts)
-	h.require.NoError(err, "Failed to load split depth")
-	l1Head := h.getL1Head(ctx, game)
-	prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock.Uint64())
-
-	provider := outputs.NewTraceProvider(logger, prestateProvider, rollupClient, l1Head, faultTypes.Depth(splitDepth.Uint64()), prestateBlock.Uint64(), poststateBlock.Uint64())
+	h.Require.NoError(err, "create output bisection game")
+	rcpt, err := wait.ForReceiptOK(ctx, h.Client, tx.Hash())
+	h.Require.NoError(err, "wait for create output bisection game receipt to be OK")
+	h.Require.Len(rcpt.Logs, 2, "should have emitted a single DisputeGameCreated event")
+	createdEvent, err := h.Factory.ParseDisputeGameCreated(*rcpt.Logs[1])
+	h.Require.NoError(err)
+	gameBindings, err := bindings.NewFaultDisputeGame(createdEvent.DisputeProxy, h.Client)
+	h.Require.NoError(err)
+	game, err := contracts.NewFaultDisputeGameContract(ctx, metrics.NoopContractMetrics, createdEvent.DisputeProxy, batching.NewMultiCaller(h.Client.Client(), batching.DefaultBatchSize))
+	h.Require.NoError(err)
+
+	prestateBlock, poststateBlock, err := game.GetBlockRange(ctx)
+	h.Require.NoError(err, "Failed to load starting block number")
+	splitDepth, err := game.GetSplitDepth(ctx)
+	h.Require.NoError(err, "Failed to load split depth")
+	l1Head := h.GetL1Head(ctx, game)
+	prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock)
+
+	provider := outputs.NewTraceProvider(logger, prestateProvider, rollupClient, l2Client, l1Head, splitDepth, prestateBlock, poststateBlock)
 
 	return &OutputAlphabetGameHelper{
-		OutputGameHelper: OutputGameHelper{
-			t:                     h.t,
-			require:               h.require,
-			client:                h.client,
-			opts:                  h.opts,
-			game:                  game,
-			factoryAddr:           h.factoryAddr,
-			addr:                  createdEvent.DisputeProxy,
-			correctOutputProvider: provider,
-			system:                h.system,
-		},
+		OutputGameHelper: *NewOutputGameHelper(h.T, h.Require, h.Client, h.Opts, game, gameBindings, h.FactoryAddr, createdEvent.DisputeProxy, provider, h.System),
 	}
 }
 
-func (h *FactoryHelper) createBisectionGameExtraData(l2Node string, l2BlockNumber uint64, cfg *gameCfg) []byte {
-	h.waitForBlock(l2Node, l2BlockNumber, cfg)
-	h.t.Logf("Creating game with l2 block number: %v", l2BlockNumber)
+func (h *FactoryHelper) CreateBisectionGameExtraData(l2Node string, l2BlockNumber uint64, cfg *GameCfg) []byte {
+	h.WaitForBlock(l2Node, l2BlockNumber, cfg)
+	h.T.Logf("Creating game with l2 block number: %v", l2BlockNumber)
 	extraData := make([]byte, 32)
 	binary.BigEndian.PutUint64(extraData[24:], l2BlockNumber)
 	return extraData
 }
 
-func (h *FactoryHelper) waitForBlock(l2Node string, l2BlockNumber uint64, cfg *gameCfg) {
+func (h *FactoryHelper) WaitForBlock(l2Node string, l2BlockNumber uint64, cfg *GameCfg) {
 	if cfg.allowFuture {
 		// Proposing a block that doesn't exist yet, so don't perform any checks
 		return
 	}
 
-	l2Client := h.system.NodeClient(l2Node)
+	l2Client := h.System.NodeClient(l2Node)
 	if cfg.allowUnsafe {
 		_, err := geth.WaitForBlock(new(big.Int).SetUint64(l2BlockNumber), l2Client, 1*time.Minute)
-		h.require.NoErrorf(err, "Block number %v did not become unsafe", l2BlockNumber)
+		h.Require.NoErrorf(err, "Block number %v did not become unsafe", l2BlockNumber)
 	} else {
 		_, err := geth.WaitForBlockToBeSafe(new(big.Int).SetUint64(l2BlockNumber), l2Client, 1*time.Minute)
-		h.require.NoErrorf(err, "Block number %v did not become safe", l2BlockNumber)
+		h.Require.NoErrorf(err, "Block number %v did not become safe", l2BlockNumber)
 	}
 }
 
 func (h *FactoryHelper) StartChallenger(ctx context.Context, name string, options ...challenger.Option) *challenger.Helper {
 	opts := []challenger.Option{
-		challenger.WithFactoryAddress(h.factoryAddr),
+		challenger.WithFactoryAddress(h.FactoryAddr),
 	}
 	opts = append(opts, options...)
-	c := challenger.NewChallenger(h.t, ctx, h.system, name, opts...)
-	h.t.Cleanup(func() {
+	c := challenger.NewChallenger(h.T, ctx, h.System, name, opts...)
+	h.T.Cleanup(func() {
 		_ = c.Close()
 	})
 	return c
diff --git a/op-e2e/e2eutils/disputegame/honest_helper.go b/op-e2e/e2eutils/disputegame/honest_helper.go
deleted file mode 100644
index 62694672be18..000000000000
--- a/op-e2e/e2eutils/disputegame/honest_helper.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package disputegame
-
-import (
-	"context"
-	"testing"
-	"time"
-
-	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
-	"github.com/stretchr/testify/require"
-)
-
-type HonestHelper struct {
-	t            *testing.T
-	require      *require.Assertions
-	game         *FaultGameHelper
-	correctTrace types.TraceProvider
-}
-
-func (h *HonestHelper) Attack(ctx context.Context, claimIdx int64) {
-	ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
-	defer cancel()
-	claim := h.game.getClaim(ctx, claimIdx)
-	pos := types.NewPositionFromGIndex(claim.Position)
-	attackPos := pos.Attack()
-	h.t.Logf("Attacking at position %v with g index %v", attackPos, attackPos.ToGIndex())
-	value, err := h.correctTrace.Get(ctx, attackPos)
-	h.require.NoErrorf(err, "Get correct claim at position %v with g index %v", attackPos, attackPos.ToGIndex())
-	h.t.Log("Performing attack")
-	h.game.Attack(ctx, claimIdx, value)
-	h.t.Log("Attack complete")
-}
-
-func (h *HonestHelper) Defend(ctx context.Context, claimIdx int64) {
-	ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
-	defer cancel()
-	claim := h.game.getClaim(ctx, claimIdx)
-	pos := types.NewPositionFromGIndex(claim.Position)
-	defendPos := pos.Defend()
-	value, err := h.correctTrace.Get(ctx, defendPos)
-	h.game.require.NoErrorf(err, "Get correct claim at position %v with g index %v", defendPos, defendPos.ToGIndex())
-	h.game.Defend(ctx, claimIdx, value)
-}
-
-func (h *HonestHelper) StepFails(ctx context.Context, claimIdx int64, isAttack bool) {
-	ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
-	defer cancel()
-	pos := h.game.getClaimPosition(ctx, claimIdx)
-	if !isAttack {
-		// If we're defending, then the step will be from the trace to the next one
-		pos = pos.MoveRight()
-	}
-	prestate, proofData, _, err := h.correctTrace.GetStepData(ctx, pos)
-	h.require.NoError(err, "Get step data")
-	h.game.StepFails(claimIdx, isAttack, prestate, proofData)
-}
diff --git a/op-e2e/e2eutils/disputegame/output_alphabet_helper.go b/op-e2e/e2eutils/disputegame/output_alphabet_helper.go
index da99c40a8136..d2e7ec8fe8f7 100644
--- a/op-e2e/e2eutils/disputegame/output_alphabet_helper.go
+++ b/op-e2e/e2eutils/disputegame/output_alphabet_helper.go
@@ -3,11 +3,9 @@ package disputegame
 import (
 	"context"
 
-	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/outputs"
 	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
-	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum/go-ethereum/log"
 )
@@ -23,38 +21,30 @@ func (g *OutputAlphabetGameHelper) StartChallenger(
 	options ...challenger.Option,
 ) *challenger.Helper {
 	opts := []challenger.Option{
-		challenger.WithAlphabet(g.system.RollupEndpoint(l2Node)),
-		challenger.WithFactoryAddress(g.factoryAddr),
-		challenger.WithGameAddress(g.addr),
+		challenger.WithAlphabet(),
+		challenger.WithFactoryAddress(g.FactoryAddr),
+		challenger.WithGameAddress(g.Addr),
 	}
 	opts = append(opts, options...)
-	c := challenger.NewChallenger(g.t, ctx, g.system, name, opts...)
-	g.t.Cleanup(func() {
+	c := challenger.NewChallenger(g.T, ctx, g.System, name, opts...)
+	g.T.Cleanup(func() {
 		_ = c.Close()
 	})
 	return c
 }
 
 func (g *OutputAlphabetGameHelper) CreateHonestActor(ctx context.Context, l2Node string) *OutputHonestHelper {
-	logger := testlog.Logger(g.t, log.LevelInfo).New("role", "HonestHelper", "game", g.addr)
-	caller := batching.NewMultiCaller(g.system.NodeClient("l1").Client(), batching.DefaultBatchSize)
-	contract, err := contracts.NewFaultDisputeGameContract(g.addr, caller)
-	g.require.NoError(err, "Failed to create game contact")
-	prestateBlock, poststateBlock, err := contract.GetBlockRange(ctx)
-	g.require.NoError(err, "Get block range")
+	logger := testlog.Logger(g.T, log.LevelInfo).New("role", "HonestHelper", "game", g.Addr)
+	prestateBlock, poststateBlock, err := g.Game.GetBlockRange(ctx)
+	g.Require.NoError(err, "Get block range")
 	splitDepth := g.SplitDepth(ctx)
-	l1Head := g.getL1Head(ctx)
-	rollupClient := g.system.RollupClient(l2Node)
+	l1Head := g.GetL1Head(ctx)
+	rollupClient := g.System.RollupClient(l2Node)
+	l2Client := g.System.NodeClient(l2Node)
 	prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock)
-	correctTrace, err := outputs.NewOutputAlphabetTraceAccessor(logger, metrics.NoopMetrics, prestateProvider, rollupClient, l1Head, splitDepth, prestateBlock, poststateBlock)
-	g.require.NoError(err, "Create trace accessor")
-	return &OutputHonestHelper{
-		t:            g.t,
-		require:      g.require,
-		game:         &g.OutputGameHelper,
-		contract:     contract,
-		correctTrace: correctTrace,
-	}
+	correctTrace, err := outputs.NewOutputAlphabetTraceAccessor(logger, metrics.NoopMetrics, prestateProvider, rollupClient, l2Client, l1Head, splitDepth, prestateBlock, poststateBlock)
+	g.Require.NoError(err, "Create trace accessor")
+	return NewOutputHonestHelper(g.T, g.Require, &g.OutputGameHelper, g.Game, correctTrace)
 }
 
 func (g *OutputAlphabetGameHelper) CreateDishonestHelper(ctx context.Context, l2Node string, defender bool) *DishonestHelper {
diff --git a/op-e2e/e2eutils/disputegame/output_cannon_helper.go b/op-e2e/e2eutils/disputegame/output_cannon_helper.go
index 6d5d73f9e491..dadbe2a24314 100644
--- a/op-e2e/e2eutils/disputegame/output_cannon_helper.go
+++ b/op-e2e/e2eutils/disputegame/output_cannon_helper.go
@@ -9,15 +9,14 @@ import (
 	"path/filepath"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-chain-ops/deployer"
-	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/cannon"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/outputs"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/split"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
 	preimage "github.com/ethereum-optimism/optimism/op-preimage"
@@ -33,55 +32,39 @@ type OutputCannonGameHelper struct {
 	OutputGameHelper
 }
 
-func (g *OutputCannonGameHelper) StartChallenger(
-	ctx context.Context,
-	l2Node string,
-	name string,
-	options ...challenger.Option,
-) *challenger.Helper {
-	rollupEndpoint := g.system.RollupEndpoint(l2Node)
-	l2Endpoint := g.system.NodeEndpoint(l2Node)
+func (g *OutputCannonGameHelper) StartChallenger(ctx context.Context, name string, options ...challenger.Option) *challenger.Helper {
 	opts := []challenger.Option{
-		challenger.WithCannon(g.t, g.system.RollupCfg(), g.system.L2Genesis(), rollupEndpoint, l2Endpoint),
-		challenger.WithFactoryAddress(g.factoryAddr),
-		challenger.WithGameAddress(g.addr),
+		challenger.WithCannon(g.T, g.System.RollupCfg(), g.System.L2Genesis()),
+		challenger.WithFactoryAddress(g.FactoryAddr),
+		challenger.WithGameAddress(g.Addr),
 	}
 	opts = append(opts, options...)
-	c := challenger.NewChallenger(g.t, ctx, g.system, name, opts...)
-	g.t.Cleanup(func() {
+	c := challenger.NewChallenger(g.T, ctx, g.System, name, opts...)
+	g.T.Cleanup(func() {
 		_ = c.Close()
 	})
 	return c
 }
 
 func (g *OutputCannonGameHelper) CreateHonestActor(ctx context.Context, l2Node string, options ...challenger.Option) *OutputHonestHelper {
-	opts := g.defaultChallengerOptions(l2Node)
+	opts := g.defaultChallengerOptions()
 	opts = append(opts, options...)
-	cfg := challenger.NewChallengerConfig(g.t, g.system, opts...)
+	cfg := challenger.NewChallengerConfig(g.T, g.System, l2Node, opts...)
 
-	logger := testlog.Logger(g.t, log.LevelInfo).New("role", "HonestHelper", "game", g.addr)
-	l2Client := g.system.NodeClient(l2Node)
-	caller := batching.NewMultiCaller(g.system.NodeClient("l1").Client(), batching.DefaultBatchSize)
-	contract, err := contracts.NewFaultDisputeGameContract(g.addr, caller)
-	g.require.NoError(err, "Failed to create game contact")
+	logger := testlog.Logger(g.T, log.LevelInfo).New("role", "HonestHelper", "game", g.Addr)
+	l2Client := g.System.NodeClient(l2Node)
 
-	prestateBlock, poststateBlock, err := contract.GetBlockRange(ctx)
-	g.require.NoError(err, "Failed to load block range")
+	prestateBlock, poststateBlock, err := g.Game.GetBlockRange(ctx)
+	g.Require.NoError(err, "Failed to load block range")
 	dir := filepath.Join(cfg.Datadir, "honest")
 	splitDepth := g.SplitDepth(ctx)
-	rollupClient := g.system.RollupClient(l2Node)
+	rollupClient := g.System.RollupClient(l2Node)
 	prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock)
-	l1Head := g.getL1Head(ctx)
+	l1Head := g.GetL1Head(ctx)
 	accessor, err := outputs.NewOutputCannonTraceAccessor(
-		logger, metrics.NoopMetrics, cfg, l2Client, prestateProvider, rollupClient, dir, l1Head, splitDepth, prestateBlock, poststateBlock)
-	g.require.NoError(err, "Failed to create output cannon trace accessor")
-	return &OutputHonestHelper{
-		t:            g.t,
-		require:      g.require,
-		game:         &g.OutputGameHelper,
-		contract:     contract,
-		correctTrace: accessor,
-	}
+		logger, metrics.NoopMetrics, cfg, l2Client, prestateProvider, cfg.CannonAbsolutePreState, rollupClient, dir, l1Head, splitDepth, prestateBlock, poststateBlock)
+	g.Require.NoError(err, "Failed to create output cannon trace accessor")
+	return NewOutputHonestHelper(g.T, g.Require, &g.OutputGameHelper, g.Game, accessor)
 }
 
 type PreimageLoadCheck func(types.TraceProvider, uint64) error
@@ -94,7 +77,7 @@ func (g *OutputCannonGameHelper) CreateStepLargePreimageLoadCheck(ctx context.Co
 		// Get the preimage data
 		execDepth := g.ExecDepth(ctx)
 		_, _, preimageData, err := provider.GetStepData(ctx, types.NewPosition(execDepth, big.NewInt(int64(targetTraceIndex))))
-		g.require.NoError(err)
+		g.Require.NoError(err)
 
 		// Wait until the challenge period has started by checking until the challenge
 		// period start time is not zero by calling the ChallengePeriodStartTime method
@@ -104,11 +87,11 @@ func (g *OutputCannonGameHelper) CreateStepLargePreimageLoadCheck(ctx context.Co
 		challengePeriodEnd := challengePeriodStart + challengePeriod
 
 		// Time travel past the challenge period.
-		g.system.AdvanceTime(time.Duration(challengePeriod) * time.Second)
-		g.require.NoError(wait.ForBlockWithTimestamp(ctx, g.system.NodeClient("l1"), challengePeriodEnd))
+		g.System.AdvanceTime(time.Duration(challengePeriod) * time.Second)
+		g.Require.NoError(wait.ForBlockWithTimestamp(ctx, g.System.NodeClient("l1"), challengePeriodEnd))
 
 		// Assert that the preimage was indeed loaded by an honest challenger
-		g.waitForPreimageInOracle(ctx, preimageData)
+		g.WaitForPreimageInOracle(ctx, preimageData)
 		return nil
 	}
 }
@@ -117,8 +100,8 @@ func (g *OutputCannonGameHelper) CreateStepPreimageLoadCheck(ctx context.Context
 	return func(provider types.TraceProvider, targetTraceIndex uint64) error {
 		execDepth := g.ExecDepth(ctx)
 		_, _, preimageData, err := provider.GetStepData(ctx, types.NewPosition(execDepth, big.NewInt(int64(targetTraceIndex))))
-		g.require.NoError(err)
-		g.waitForPreimageInOracle(ctx, preimageData)
+		g.Require.NoError(err)
+		g.WaitForPreimageInOracle(ctx, preimageData)
 		return nil
 	}
 }
@@ -129,53 +112,53 @@ func (g *OutputCannonGameHelper) CreateStepPreimageLoadCheck(ctx context.Context
 // 2. Descending the execution game tree to reach the step that loads the preimage
 // 3. Asserting that the preimage was indeed loaded by an honest challenger (assuming the preimage is not preloaded)
 // This expects an odd execution game depth in order for the honest challenger to step on our leaf claim
-func (g *OutputCannonGameHelper) ChallengeToPreimageLoad(ctx context.Context, outputRootClaim *ClaimHelper, challengerKey *ecdsa.PrivateKey, preimage cannon.PreimageOpt, preimageCheck PreimageLoadCheck, preloadPreimage bool) {
+func (g *OutputCannonGameHelper) ChallengeToPreimageLoad(ctx context.Context, outputRootClaim *ClaimHelper, challengerKey *ecdsa.PrivateKey, preimage utils.PreimageOpt, preimageCheck PreimageLoadCheck, preloadPreimage bool) {
 	// Identifying the first state transition that loads a global preimage
 	provider, _ := g.createCannonTraceProvider(ctx, "sequencer", outputRootClaim, challenger.WithPrivKey(challengerKey))
 	targetTraceIndex, err := provider.FindStep(ctx, 0, preimage)
-	g.require.NoError(err)
+	g.Require.NoError(err)
 
 	splitDepth := g.SplitDepth(ctx)
 	execDepth := g.ExecDepth(ctx)
-	g.require.NotEqual(outputRootClaim.position.TraceIndex(execDepth).Uint64(), targetTraceIndex, "cannot move to defend a terminal trace index")
-	g.require.EqualValues(splitDepth+1, outputRootClaim.Depth(), "supplied claim must be the root of an execution game")
-	g.require.EqualValues(execDepth%2, 1, "execution game depth must be odd") // since we're challenging the execution root claim
+	g.Require.NotEqual(outputRootClaim.Position.TraceIndex(execDepth).Uint64(), targetTraceIndex, "cannot move to defend a terminal trace index")
+	g.Require.EqualValues(splitDepth+1, outputRootClaim.Depth(), "supplied claim must be the root of an execution game")
+	g.Require.EqualValues(execDepth%2, 1, "execution game depth must be odd") // since we're challenging the execution root claim
 
 	if preloadPreimage {
 		_, _, preimageData, err := provider.GetStepData(ctx, types.NewPosition(execDepth, big.NewInt(int64(targetTraceIndex))))
-		g.require.NoError(err)
-		g.uploadPreimage(ctx, preimageData, challengerKey)
-		g.waitForPreimageInOracle(ctx, preimageData)
+		g.Require.NoError(err)
+		g.UploadPreimage(ctx, preimageData, challengerKey)
+		g.WaitForPreimageInOracle(ctx, preimageData)
 	}
 
 	// Descending the execution game tree to reach the step that loads the preimage
 	bisectTraceIndex := func(claim *ClaimHelper) *ClaimHelper {
-		execClaimPosition, err := claim.position.RelativeToAncestorAtDepth(splitDepth + 1)
-		g.require.NoError(err)
+		execClaimPosition, err := claim.Position.RelativeToAncestorAtDepth(splitDepth + 1)
+		g.Require.NoError(err)
 
 		claimTraceIndex := execClaimPosition.TraceIndex(execDepth).Uint64()
-		g.t.Logf("Bisecting: Into targetTraceIndex %v: claimIndex=%v at depth=%v. claimPosition=%v execClaimPosition=%v claimTraceIndex=%v",
-			targetTraceIndex, claim.index, claim.Depth(), claim.position, execClaimPosition, claimTraceIndex)
+		g.T.Logf("Bisecting: Into targetTraceIndex %v: claimIndex=%v at depth=%v. claimPosition=%v execClaimPosition=%v claimTraceIndex=%v",
+			targetTraceIndex, claim.Index, claim.Depth(), claim.Position, execClaimPosition, claimTraceIndex)
 
 		// We always want to position ourselves such that the challenger generates proofs for the targetTraceIndex as prestate
 		if execClaimPosition.Depth() == execDepth-1 {
 			if execClaimPosition.TraceIndex(execDepth).Uint64() == targetTraceIndex {
 				newPosition := execClaimPosition.Attack()
 				correct, err := provider.Get(ctx, newPosition)
-				g.require.NoError(err)
-				g.t.Logf("Bisecting: Attack correctly for step at newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
+				g.Require.NoError(err)
+				g.T.Logf("Bisecting: Attack correctly for step at newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
 				return claim.Attack(ctx, correct)
 			} else if execClaimPosition.TraceIndex(execDepth).Uint64() > targetTraceIndex {
-				g.t.Logf("Bisecting: Attack incorrectly for step")
+				g.T.Logf("Bisecting: Attack incorrectly for step")
 				return claim.Attack(ctx, common.Hash{0xdd})
 			} else if execClaimPosition.TraceIndex(execDepth).Uint64()+1 == targetTraceIndex {
-				g.t.Logf("Bisecting: Defend incorrectly for step")
+				g.T.Logf("Bisecting: Defend incorrectly for step")
 				return claim.Defend(ctx, common.Hash{0xcc})
 			} else {
 				newPosition := execClaimPosition.Defend()
 				correct, err := provider.Get(ctx, newPosition)
-				g.require.NoError(err)
-				g.t.Logf("Bisecting: Defend correctly for step at newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
+				g.Require.NoError(err)
+				g.T.Logf("Bisecting: Defend correctly for step at newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
 				return claim.Defend(ctx, correct)
 			}
 		}
@@ -185,23 +168,23 @@ func (g *OutputCannonGameHelper) ChallengeToPreimageLoad(ctx context.Context, ou
 		if execClaimPosition.TraceIndex(execDepth).Uint64() < targetTraceIndex && claim.Depth() != splitDepth+1 {
 			newPosition := execClaimPosition.Defend()
 			if newPosition.TraceIndex(execDepth).Uint64() < targetTraceIndex {
-				g.t.Logf("Bisecting: Defend correct. newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
+				g.T.Logf("Bisecting: Defend correct. newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
 				correct, err := provider.Get(ctx, newPosition)
-				g.require.NoError(err)
+				g.Require.NoError(err)
 				return claim.Defend(ctx, correct)
 			} else {
-				g.t.Logf("Bisecting: Defend incorrect. newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
+				g.T.Logf("Bisecting: Defend incorrect. newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
 				return claim.Defend(ctx, common.Hash{0xaa})
 			}
 		} else {
 			newPosition := execClaimPosition.Attack()
 			if newPosition.TraceIndex(execDepth).Uint64() < targetTraceIndex {
-				g.t.Logf("Bisecting: Attack correct. newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
+				g.T.Logf("Bisecting: Attack correct. newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
 				correct, err := provider.Get(ctx, newPosition)
-				g.require.NoError(err)
+				g.Require.NoError(err)
 				return claim.Attack(ctx, correct)
 			} else {
-				g.t.Logf("Bisecting: Attack incorrect. newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
+				g.T.Logf("Bisecting: Attack incorrect. newPosition=%v execIndexAtDepth=%v", newPosition, newPosition.TraceIndex(execDepth))
 				return claim.Attack(ctx, common.Hash{0xbb})
 			}
 		}
@@ -213,7 +196,7 @@ func (g *OutputCannonGameHelper) ChallengeToPreimageLoad(ctx context.Context, ou
 	leafClaim := g.DefendClaim(ctx, mover, bisectTraceIndex, WithoutWaitingForStep())
 
 	// Validate that the preimage was loaded correctly
-	g.require.NoError(preimageCheck(provider, targetTraceIndex))
+	g.Require.NoError(preimageCheck(provider, targetTraceIndex))
 
 	// Now the preimage is available wait for the step call to succeed.
 	leafClaim.WaitForCountered(ctx)
@@ -224,50 +207,50 @@ func (g *OutputCannonGameHelper) VerifyPreimage(ctx context.Context, outputRootC
 	execDepth := g.ExecDepth(ctx)
 
 	// Identifying the first state transition that loads a global preimage
-	provider, localContext := g.createCannonTraceProvider(ctx, "sequencer", outputRootClaim, challenger.WithPrivKey(deployer.TestKey))
+	provider, localContext := g.createCannonTraceProvider(ctx, "sequencer", outputRootClaim, challenger.WithPrivKey(TestKey))
 	start := uint64(0)
 	found := false
 	for offset := uint32(0); ; offset += 4 {
-		preimageOpt := cannon.PreimageLoad(preimageKey, offset)
-		g.t.Logf("Searching for step with key %x and offset %v", preimageKey.PreimageKey(), offset)
+		preimageOpt := utils.PreimageLoad(preimageKey, offset)
+		g.T.Logf("Searching for step with key %x and offset %v", preimageKey.PreimageKey(), offset)
 		targetTraceIndex, err := provider.FindStep(ctx, start, preimageOpt)
 		if errors.Is(err, io.EOF) {
 			// Did not find any more reads
-			g.require.True(found, "Should have found at least one preimage read")
-			g.t.Logf("Searching for step with key %x and offset %v did not find another read", preimageKey.PreimageKey(), offset)
+			g.Require.True(found, "Should have found at least one preimage read")
+			g.T.Logf("Searching for step with key %x and offset %v did not find another read", preimageKey.PreimageKey(), offset)
 			return
 		}
-		g.require.NoError(err, "Failed to find step that loads requested preimage")
+		g.Require.NoError(err, "Failed to find step that loads requested preimage")
 		start = targetTraceIndex
 		found = true
 
-		g.t.Logf("Target trace index: %v", targetTraceIndex)
+		g.T.Logf("Target trace index: %v", targetTraceIndex)
 		pos := types.NewPosition(execDepth, new(big.Int).SetUint64(targetTraceIndex))
-		g.require.Equal(targetTraceIndex, pos.TraceIndex(execDepth).Uint64())
+		g.Require.Equal(targetTraceIndex, pos.TraceIndex(execDepth).Uint64())
 
 		prestate, proof, oracleData, err := provider.GetStepData(ctx, pos)
-		g.require.NoError(err, "Failed to get step data")
-		g.require.NotNil(oracleData, "Should have had required preimage oracle data")
-		g.require.Equal(common.Hash(preimageKey.PreimageKey()).Bytes(), oracleData.OracleKey, "Must have correct preimage key")
+		g.Require.NoError(err, "Failed to get step data")
+		g.Require.NotNil(oracleData, "Should have had required preimage oracle data")
+		g.Require.Equal(common.Hash(preimageKey.PreimageKey()).Bytes(), oracleData.OracleKey, "Must have correct preimage key")
 
-		tx, err := g.game.AddLocalData(g.opts,
+		tx, err := g.GameBindings.AddLocalData(g.Opts,
 			oracleData.GetIdent(),
-			big.NewInt(outputRootClaim.index),
+			big.NewInt(outputRootClaim.Index),
 			new(big.Int).SetUint64(uint64(oracleData.OracleOffset)))
-		g.require.NoError(err)
-		_, err = wait.ForReceiptOK(ctx, g.client, tx.Hash())
-		g.require.NoError(err)
+		g.Require.NoError(err)
+		_, err = wait.ForReceiptOK(ctx, g.Client, tx.Hash())
+		g.Require.NoError(err)
 
 		expectedPostState, err := provider.Get(ctx, pos)
-		g.require.NoError(err, "Failed to get expected post state")
+		g.Require.NoError(err, "Failed to get expected post state")
 
 		callOpts := &bind.CallOpts{Context: ctx}
-		vmAddr, err := g.game.Vm(callOpts)
-		g.require.NoError(err, "Failed to get VM address")
+		vmAddr, err := g.GameBindings.Vm(callOpts)
+		g.Require.NoError(err, "Failed to get VM address")
 
 		abi, err := bindings.MIPSMetaData.GetAbi()
-		g.require.NoError(err, "Failed to load MIPS ABI")
-		caller := batching.NewMultiCaller(g.client.Client(), batching.DefaultBatchSize)
+		g.Require.NoError(err, "Failed to load MIPS ABI")
+		caller := batching.NewMultiCaller(g.Client.Client(), batching.DefaultBatchSize)
 		result, err := caller.SingleCall(ctx, rpcblock.Latest, &batching.ContractCall{
 			Abi:    abi,
 			Addr:   vmAddr,
@@ -275,62 +258,59 @@ func (g *OutputCannonGameHelper) VerifyPreimage(ctx context.Context, outputRootC
 			Args: []interface{}{
 				prestate, proof, localContext,
 			},
-			From: g.addr,
+			From: g.Addr,
 		})
-		g.require.NoError(err, "Failed to call step")
+		g.Require.NoError(err, "Failed to call step")
 		actualPostState := result.GetBytes32(0)
-		g.require.Equal(expectedPostState, common.Hash(actualPostState))
+		g.Require.Equal(expectedPostState, common.Hash(actualPostState))
 	}
 }
 
 func (g *OutputCannonGameHelper) createCannonTraceProvider(ctx context.Context, l2Node string, outputRootClaim *ClaimHelper, options ...challenger.Option) (*cannon.CannonTraceProviderForTest, common.Hash) {
 	splitDepth := g.SplitDepth(ctx)
-	g.require.EqualValues(outputRootClaim.Depth(), splitDepth+1, "outputRootClaim must be the root of an execution game")
+	g.Require.EqualValues(outputRootClaim.Depth(), splitDepth+1, "outputRootClaim must be the root of an execution game")
 
-	logger := testlog.Logger(g.t, log.LevelInfo).New("role", "CannonTraceProvider", "game", g.addr)
-	opt := g.defaultChallengerOptions(l2Node)
+	logger := testlog.Logger(g.T, log.LevelInfo).New("role", "CannonTraceProvider", "game", g.Addr)
+	opt := g.defaultChallengerOptions()
 	opt = append(opt, options...)
-	cfg := challenger.NewChallengerConfig(g.t, g.system, opt...)
+	cfg := challenger.NewChallengerConfig(g.T, g.System, l2Node, opt...)
 
-	caller := batching.NewMultiCaller(g.system.NodeClient("l1").Client(), batching.DefaultBatchSize)
-	l2Client := g.system.NodeClient(l2Node)
-	contract, err := contracts.NewFaultDisputeGameContract(g.addr, caller)
-	g.require.NoError(err, "Failed to create game contact")
+	l2Client := g.System.NodeClient(l2Node)
 
-	prestateBlock, poststateBlock, err := contract.GetBlockRange(ctx)
-	g.require.NoError(err, "Failed to load block range")
-	rollupClient := g.system.RollupClient(l2Node)
+	prestateBlock, poststateBlock, err := g.Game.GetBlockRange(ctx)
+	g.Require.NoError(err, "Failed to load block range")
+	rollupClient := g.System.RollupClient(l2Node)
 	prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock)
-	l1Head := g.getL1Head(ctx)
-	outputProvider := outputs.NewTraceProvider(logger, prestateProvider, rollupClient, l1Head, splitDepth, prestateBlock, poststateBlock)
+	l1Head := g.GetL1Head(ctx)
+	outputProvider := outputs.NewTraceProvider(logger, prestateProvider, rollupClient, l2Client, l1Head, splitDepth, prestateBlock, poststateBlock)
 
 	var localContext common.Hash
 	selector := split.NewSplitProviderSelector(outputProvider, splitDepth, func(ctx context.Context, depth types.Depth, pre types.Claim, post types.Claim) (types.TraceProvider, error) {
 		agreed, disputed, err := outputs.FetchProposals(ctx, outputProvider, pre, post)
-		g.require.NoError(err)
-		g.t.Logf("Using trace between blocks %v and %v\n", agreed.L2BlockNumber, disputed.L2BlockNumber)
-		localInputs, err := cannon.FetchLocalInputsFromProposals(ctx, l1Head.Hash, l2Client, agreed, disputed)
-		g.require.NoError(err, "Failed to fetch local inputs")
+		g.Require.NoError(err)
+		g.T.Logf("Using trace between blocks %v and %v\n", agreed.L2BlockNumber, disputed.L2BlockNumber)
+		localInputs, err := utils.FetchLocalInputsFromProposals(ctx, l1Head.Hash, l2Client, agreed, disputed)
+		g.Require.NoError(err, "Failed to fetch local inputs")
 		localContext = outputs.CreateLocalContext(pre, post)
 		dir := filepath.Join(cfg.Datadir, "cannon-trace")
 		subdir := filepath.Join(dir, localContext.Hex())
 		return cannon.NewTraceProviderForTest(logger, metrics.NoopMetrics, cfg, localInputs, subdir, g.MaxDepth(ctx)-splitDepth-1), nil
 	})
 
-	claims, err := contract.GetAllClaims(ctx, rpcblock.Latest)
-	g.require.NoError(err)
+	claims, err := g.Game.GetAllClaims(ctx, rpcblock.Latest)
+	g.Require.NoError(err)
 	game := types.NewGameState(claims, g.MaxDepth(ctx))
 
-	provider, err := selector(ctx, game, game.Claims()[outputRootClaim.parentIndex], outputRootClaim.position)
-	g.require.NoError(err)
+	provider, err := selector(ctx, game, game.Claims()[outputRootClaim.ParentIndex], outputRootClaim.Position)
+	g.Require.NoError(err)
 	translatingProvider := provider.(*trace.TranslatingProvider)
 	return translatingProvider.Original().(*cannon.CannonTraceProviderForTest), localContext
 }
 
-func (g *OutputCannonGameHelper) defaultChallengerOptions(l2Node string) []challenger.Option {
+func (g *OutputCannonGameHelper) defaultChallengerOptions() []challenger.Option {
 	return []challenger.Option{
-		challenger.WithCannon(g.t, g.system.RollupCfg(), g.system.L2Genesis(), g.system.RollupEndpoint(l2Node), g.system.NodeEndpoint(l2Node)),
-		challenger.WithFactoryAddress(g.factoryAddr),
-		challenger.WithGameAddress(g.addr),
+		challenger.WithCannon(g.T, g.System.RollupCfg(), g.System.L2Genesis()),
+		challenger.WithFactoryAddress(g.FactoryAddr),
+		challenger.WithGameAddress(g.Addr),
 	}
 }
diff --git a/op-e2e/e2eutils/disputegame/output_game_helper.go b/op-e2e/e2eutils/disputegame/output_game_helper.go
index d078a5f814f8..41143829a52e 100644
--- a/op-e2e/e2eutils/disputegame/output_game_helper.go
+++ b/op-e2e/e2eutils/disputegame/output_game_helper.go
@@ -8,16 +8,16 @@ import (
 	"testing"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/preimages"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/outputs"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
 	keccakTypes "github.com/ethereum-optimism/optimism/op-challenger/game/keccak/types"
+	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
 	preimage "github.com/ethereum-optimism/optimism/op-preimage"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
-	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/common"
@@ -29,19 +29,36 @@ import (
 const defaultTimeout = 5 * time.Minute
 
 type OutputGameHelper struct {
-	t                     *testing.T
-	require               *require.Assertions
-	client                *ethclient.Client
-	opts                  *bind.TransactOpts
-	game                  *bindings.FaultDisputeGame
-	factoryAddr           common.Address
-	addr                  common.Address
-	correctOutputProvider *outputs.OutputTraceProvider
-	system                DisputeSystem
+	T                     *testing.T
+	Require               *require.Assertions
+	Client                *ethclient.Client
+	Opts                  *bind.TransactOpts
+	Game                  contracts.FaultDisputeGameContract
+	GameBindings          *bindings.FaultDisputeGame
+	FactoryAddr           common.Address
+	Addr                  common.Address
+	CorrectOutputProvider *outputs.OutputTraceProvider
+	System                DisputeSystem
+}
+
+func NewOutputGameHelper(t *testing.T, require *require.Assertions, client *ethclient.Client, opts *bind.TransactOpts,
+	game contracts.FaultDisputeGameContract, gameBindings *bindings.FaultDisputeGame, factoryAddr common.Address, addr common.Address, correctOutputProvider *outputs.OutputTraceProvider, system DisputeSystem) *OutputGameHelper {
+	return &OutputGameHelper{
+		T:                     t,
+		Require:               require,
+		Client:                client,
+		Opts:                  opts,
+		Game:                  game,
+		GameBindings:          gameBindings,
+		FactoryAddr:           factoryAddr,
+		Addr:                  addr,
+		CorrectOutputProvider: correctOutputProvider,
+		System:                system,
+	}
 }
 
 type moveCfg struct {
-	opts        *bind.TransactOpts
+	Opts        *bind.TransactOpts
 	ignoreDupes bool
 }
 
@@ -55,9 +72,9 @@ func (f moveOptFn) Apply(c *moveCfg) {
 	f(c)
 }
 
-func WithTransactOpts(opts *bind.TransactOpts) MoveOpt {
+func WithTransactOpts(Opts *bind.TransactOpts) MoveOpt {
 	return moveOptFn(func(c *moveCfg) {
-		c.opts = opts
+		c.Opts = Opts
 	})
 }
 
@@ -67,14 +84,10 @@ func WithIgnoreDuplicates() MoveOpt {
 	})
 }
 
-func (g *OutputGameHelper) Addr() common.Address {
-	return g.addr
-}
-
 func (g *OutputGameHelper) SplitDepth(ctx context.Context) types.Depth {
-	splitDepth, err := g.game.SplitDepth(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "failed to load split depth")
-	return types.Depth(splitDepth.Uint64())
+	splitDepth, err := g.Game.GetSplitDepth(ctx)
+	g.Require.NoError(err, "failed to load split depth")
+	return splitDepth
 }
 
 func (g *OutputGameHelper) ExecDepth(ctx context.Context) types.Depth {
@@ -82,15 +95,15 @@ func (g *OutputGameHelper) ExecDepth(ctx context.Context) types.Depth {
 }
 
 func (g *OutputGameHelper) L2BlockNum(ctx context.Context) uint64 {
-	blockNum, err := g.game.L2BlockNumber(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "failed to load l2 block number")
-	return blockNum.Uint64()
+	_, blockNum, err := g.Game.GetBlockRange(ctx)
+	g.Require.NoError(err, "failed to load l2 block number")
+	return blockNum
 }
 
-func (g *OutputGameHelper) GenesisBlockNum(ctx context.Context) uint64 {
-	blockNum, err := g.game.GenesisBlockNumber(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "failed to load genesis block number")
-	return blockNum.Uint64()
+func (g *OutputGameHelper) StartingBlockNum(ctx context.Context) uint64 {
+	blockNum, _, err := g.Game.GetBlockRange(ctx)
+	g.Require.NoError(err, "failed to load starting block number")
+	return blockNum
 }
 
 func (g *OutputGameHelper) DisputeLastBlock(ctx context.Context) *ClaimHelper {
@@ -111,8 +124,8 @@ func (g *OutputGameHelper) DisputeBlock(ctx context.Context, disputeBlockNum uin
 	}
 	pos := types.NewPositionFromGIndex(big.NewInt(1))
 	getClaimValue := func(parentClaim *ClaimHelper, claimPos types.Position) common.Hash {
-		claimBlockNum, err := g.correctOutputProvider.ClaimedBlockNumber(claimPos)
-		g.require.NoError(err, "failed to calculate claim block number")
+		claimBlockNum, err := g.CorrectOutputProvider.ClaimedBlockNumber(claimPos)
+		g.Require.NoError(err, "failed to calculate claim block number")
 		if claimBlockNum < disputeBlockNum {
 			// Use the correct output root for all claims prior to the dispute block number
 			// This pushes the game to dispute the last block in the range
@@ -129,8 +142,8 @@ func (g *OutputGameHelper) DisputeBlock(ctx context.Context, disputeBlockNum uin
 
 	claim := g.RootClaim(ctx)
 	for !claim.IsOutputRootLeaf(ctx) {
-		parentClaimBlockNum, err := g.correctOutputProvider.ClaimedBlockNumber(pos)
-		g.require.NoError(err, "failed to calculate parent claim block number")
+		parentClaimBlockNum, err := g.CorrectOutputProvider.ClaimedBlockNumber(pos)
+		g.Require.NoError(err, "failed to calculate parent claim block number")
 		if parentClaimBlockNum >= disputeBlockNum {
 			pos = pos.Attack()
 			claim = claim.Attack(ctx, getClaimValue(claim, pos))
@@ -150,63 +163,63 @@ func (g *OutputGameHelper) RootClaim(ctx context.Context) *ClaimHelper {
 func (g *OutputGameHelper) WaitForCorrectOutputRoot(ctx context.Context, claimIdx int64) {
 	g.WaitForClaimCount(ctx, claimIdx+1)
 	claim := g.getClaim(ctx, claimIdx)
-	output := g.correctOutputRoot(ctx, types.NewPositionFromGIndex(claim.Position))
-	g.require.EqualValuesf(output, claim.Claim, "Incorrect output root at claim %v at position %v", claimIdx, claim.Position.Uint64())
+	output := g.correctOutputRoot(ctx, claim.Position)
+	g.Require.EqualValuesf(output, claim.Value, "Incorrect output root at claim %v at position %v", claimIdx, claim.Position.ToGIndex().Uint64())
 }
 
 func (g *OutputGameHelper) correctOutputRoot(ctx context.Context, pos types.Position) common.Hash {
-	outputRoot, err := g.correctOutputProvider.Get(ctx, pos)
-	g.require.NoErrorf(err, "Failed to get correct output for position %v", pos)
+	outputRoot, err := g.CorrectOutputProvider.Get(ctx, pos)
+	g.Require.NoErrorf(err, "Failed to get correct output for position %v", pos)
 	return outputRoot
 }
 
-func (g *OutputGameHelper) GameDuration(ctx context.Context) time.Duration {
-	duration, err := g.game.GameDuration(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "failed to get game duration")
-	return time.Duration(duration) * time.Second
+func (g *OutputGameHelper) MaxClockDuration(ctx context.Context) time.Duration {
+	duration, err := g.Game.GetMaxClockDuration(ctx)
+	g.Require.NoError(err, "failed to get max clock duration")
+	return duration
 }
 
 func (g *OutputGameHelper) WaitForNoAvailableCredit(ctx context.Context, addr common.Address) {
 	timedCtx, cancel := context.WithTimeout(ctx, defaultTimeout)
 	defer cancel()
 	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		bal, err := g.game.Credit(&bind.CallOpts{Context: timedCtx}, addr)
+		bal, _, err := g.Game.GetCredit(timedCtx, addr)
 		if err != nil {
 			return false, err
 		}
-		g.t.Log("Waiting for zero available credit", "current", bal, "addr", addr)
+		g.T.Log("Waiting for zero available credit", "current", bal, "addr", addr)
 		return bal.Cmp(big.NewInt(0)) == 0, nil
 	})
 	if err != nil {
 		g.LogGameData(ctx)
-		g.require.NoError(err, "Failed to wait for zero available credit")
+		g.Require.NoError(err, "Failed to wait for zero available credit")
 	}
 }
 
 func (g *OutputGameHelper) AvailableCredit(ctx context.Context, addr common.Address) *big.Int {
-	credit, err := g.game.Credit(&bind.CallOpts{Context: ctx}, addr)
-	g.require.NoErrorf(err, "Failed to fetch available credit for %v", addr)
+	credit, _, err := g.Game.GetCredit(ctx, addr)
+	g.Require.NoErrorf(err, "Failed to fetch available credit for %v", addr)
 	return credit
 }
 
 func (g *OutputGameHelper) CreditUnlockDuration(ctx context.Context) time.Duration {
-	weth, err := g.game.Weth(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "Failed to get WETH contract")
-	contract, err := bindings.NewDelayedWETH(weth, g.client)
-	g.require.NoError(err)
+	weth, err := g.GameBindings.Weth(&bind.CallOpts{Context: ctx})
+	g.Require.NoError(err, "Failed to get WETH contract")
+	contract, err := bindings.NewDelayedWETH(weth, g.Client)
+	g.Require.NoError(err)
 	period, err := contract.Delay(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "Failed to get WETH unlock period")
+	g.Require.NoError(err, "Failed to get WETH unlock period")
 	float, _ := period.Float64()
 	return time.Duration(float) * time.Second
 }
 
 func (g *OutputGameHelper) WethBalance(ctx context.Context, addr common.Address) *big.Int {
-	weth, err := g.game.Weth(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "Failed to get WETH contract")
-	contract, err := bindings.NewDelayedWETH(weth, g.client)
-	g.require.NoError(err)
+	weth, err := g.GameBindings.Weth(&bind.CallOpts{Context: ctx})
+	g.Require.NoError(err, "Failed to get WETH contract")
+	contract, err := bindings.NewDelayedWETH(weth, g.Client)
+	g.Require.NoError(err)
 	balance, err := contract.BalanceOf(&bind.CallOpts{Context: ctx}, addr)
-	g.require.NoError(err, "Failed to get WETH balance")
+	g.Require.NoError(err, "Failed to get WETH balance")
 	return balance
 }
 
@@ -217,16 +230,16 @@ func (g *OutputGameHelper) WaitForClaimCount(ctx context.Context, count int64) {
 	timedCtx, cancel := context.WithTimeout(ctx, defaultTimeout)
 	defer cancel()
 	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		actual, err := g.game.ClaimDataLen(&bind.CallOpts{Context: timedCtx})
+		actual, err := g.Game.GetClaimCount(timedCtx)
 		if err != nil {
 			return false, err
 		}
-		g.t.Log("Waiting for claim count", "current", actual, "expected", count, "game", g.addr)
-		return actual.Cmp(big.NewInt(count)) >= 0, nil
+		g.T.Log("Waiting for claim count", "current", actual, "expected", count, "game", g.Addr)
+		return int64(actual) >= count, nil
 	})
 	if err != nil {
 		g.LogGameData(ctx)
-		g.require.NoErrorf(err, "Did not find expected claim count %v", count)
+		g.Require.NoErrorf(err, "Did not find expected claim count %v", count)
 	}
 }
 
@@ -241,87 +254,78 @@ type ContractClaim struct {
 }
 
 func (g *OutputGameHelper) MaxDepth(ctx context.Context) types.Depth {
-	depth, err := g.game.MaxGameDepth(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "Failed to load game depth")
-	return types.Depth(depth.Uint64())
+	depth, err := g.Game.GetMaxGameDepth(ctx)
+	g.Require.NoError(err, "Failed to load game depth")
+	return depth
 }
 
-func (g *OutputGameHelper) waitForClaim(ctx context.Context, timeout time.Duration, errorMsg string, predicate func(claimIdx int64, claim ContractClaim) bool) (int64, ContractClaim) {
+func (g *OutputGameHelper) waitForClaim(ctx context.Context, timeout time.Duration, errorMsg string, predicate func(claimIdx int64, claim types.Claim) bool) (int64, types.Claim) {
 	timedCtx, cancel := context.WithTimeout(ctx, timeout)
 	defer cancel()
-	var matchedClaim ContractClaim
+	var matchedClaim types.Claim
 	var matchClaimIdx int64
 	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		count, err := g.game.ClaimDataLen(&bind.CallOpts{Context: timedCtx})
+		claims, err := g.Game.GetAllClaims(ctx, rpcblock.Latest)
 		if err != nil {
-			return false, fmt.Errorf("retrieve number of claims: %w", err)
+			return false, fmt.Errorf("retrieve all claims: %w", err)
 		}
 		// Search backwards because the new claims are at the end and more likely the ones we want.
-		for i := count.Int64() - 1; i >= 0; i-- {
-			claimData, err := g.game.ClaimData(&bind.CallOpts{Context: timedCtx}, big.NewInt(i))
-			if err != nil {
-				return false, fmt.Errorf("retrieve claim %v: %w", i, err)
-			}
-			if predicate(i, claimData) {
-				matchClaimIdx = i
-				matchedClaim = claimData
+		for i := len(claims) - 1; i >= 0; i-- {
+			claim := claims[i]
+			if predicate(int64(i), claim) {
+				matchClaimIdx = int64(i)
+				matchedClaim = claim
 				return true, nil
 			}
 		}
 		return false, nil
 	})
 	if err != nil { // Avoid waiting time capturing game data when there's no error
-		g.require.NoErrorf(err, "%v\n%v", errorMsg, g.gameData(ctx))
+		g.Require.NoErrorf(err, "%v\n%v", errorMsg, g.GameData(ctx))
 	}
 	return matchClaimIdx, matchedClaim
 }
 
-func (g *OutputGameHelper) waitForNoClaim(ctx context.Context, errorMsg string, predicate func(claim ContractClaim) bool) {
+func (g *OutputGameHelper) waitForNoClaim(ctx context.Context, errorMsg string, predicate func(claim types.Claim) bool) {
 	timedCtx, cancel := context.WithTimeout(ctx, defaultTimeout)
 	defer cancel()
 	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		count, err := g.game.ClaimDataLen(&bind.CallOpts{Context: timedCtx})
+		claims, err := g.Game.GetAllClaims(ctx, rpcblock.Latest)
 		if err != nil {
-			return false, fmt.Errorf("retrieve number of claims: %w", err)
+			return false, fmt.Errorf("retrieve all claims: %w", err)
 		}
-		// Search backwards because the new claims are at the end and more likely the ones we will fail on.
-		for i := count.Int64() - 1; i >= 0; i-- {
-			claimData, err := g.game.ClaimData(&bind.CallOpts{Context: timedCtx}, big.NewInt(i))
-			if err != nil {
-				return false, fmt.Errorf("retrieve claim %v: %w", i, err)
-			}
-			if predicate(claimData) {
+		// Search backwards because the new claims are at the end and more likely the ones we want.
+		for i := len(claims) - 1; i >= 0; i-- {
+			claim := claims[i]
+			if predicate(claim) {
 				return false, nil
 			}
 		}
 		return true, nil
 	})
 	if err != nil { // Avoid waiting time capturing game data when there's no error
-		g.require.NoErrorf(err, "%v\n%v", errorMsg, g.gameData(ctx))
+		g.Require.NoErrorf(err, "%v\n%v", errorMsg, g.GameData(ctx))
 	}
 }
 
 func (g *OutputGameHelper) GetClaimValue(ctx context.Context, claimIdx int64) common.Hash {
 	g.WaitForClaimCount(ctx, claimIdx+1)
 	claim := g.getClaim(ctx, claimIdx)
-	return claim.Claim
+	return claim.Value
 }
 
-func (g *OutputGameHelper) getAllClaims(ctx context.Context) []ContractClaim {
-	count := g.getClaimCount(ctx)
-	var claims []ContractClaim
-	for i := int64(0); i < count; i++ {
-		claims = append(claims, g.getClaim(ctx, i))
-	}
+func (g *OutputGameHelper) getAllClaims(ctx context.Context) []types.Claim {
+	claims, err := g.Game.GetAllClaims(ctx, rpcblock.Latest)
+	g.Require.NoError(err, "Failed to get all claims")
 	return claims
 }
 
 // getClaim retrieves the claim data for a specific index.
 // Note that it is deliberately not exported as tests should use WaitForClaim to avoid race conditions.
-func (g *OutputGameHelper) getClaim(ctx context.Context, claimIdx int64) ContractClaim {
-	claimData, err := g.game.ClaimData(&bind.CallOpts{Context: ctx}, big.NewInt(claimIdx))
+func (g *OutputGameHelper) getClaim(ctx context.Context, claimIdx int64) types.Claim {
+	claimData, err := g.Game.GetClaim(ctx, uint64(claimIdx))
 	if err != nil {
-		g.require.NoErrorf(err, "retrieve claim %v", claimIdx)
+		g.Require.NoErrorf(err, "retrieve claim %v", claimIdx)
 	}
 	return claimData
 }
@@ -331,9 +335,8 @@ func (g *OutputGameHelper) WaitForClaimAtDepth(ctx context.Context, depth types.
 		ctx,
 		defaultTimeout,
 		fmt.Sprintf("Could not find claim depth %v", depth),
-		func(_ int64, claim ContractClaim) bool {
-			pos := types.NewPositionFromGIndex(claim.Position)
-			return pos.Depth() == depth
+		func(_ int64, claim types.Claim) bool {
+			return claim.Depth() == depth
 		})
 }
 
@@ -343,9 +346,8 @@ func (g *OutputGameHelper) WaitForClaimAtMaxDepth(ctx context.Context, countered
 		ctx,
 		defaultTimeout,
 		fmt.Sprintf("Could not find claim depth %v with countered=%v", maxDepth, countered),
-		func(_ int64, claim ContractClaim) bool {
-			pos := types.NewPositionFromGIndex(claim.Position)
-			return pos.Depth() == maxDepth && (claim.CounteredBy != common.Address{}) == countered
+		func(_ int64, claim types.Claim) bool {
+			return claim.Depth() == maxDepth && (claim.CounteredBy != common.Address{}) == countered
 		})
 }
 
@@ -353,7 +355,7 @@ func (g *OutputGameHelper) WaitForAllClaimsCountered(ctx context.Context) {
 	g.waitForNoClaim(
 		ctx,
 		"Did not find all claims countered",
-		func(claim ContractClaim) bool {
+		func(claim types.Claim) bool {
 			return claim.CounteredBy == common.Address{}
 		})
 }
@@ -361,45 +363,45 @@ func (g *OutputGameHelper) WaitForAllClaimsCountered(ctx context.Context) {
 func (g *OutputGameHelper) Resolve(ctx context.Context) {
 	ctx, cancel := context.WithTimeout(ctx, time.Minute)
 	defer cancel()
-	tx, err := g.game.Resolve(g.opts)
-	g.require.NoError(err)
-	_, err = wait.ForReceiptOK(ctx, g.client, tx.Hash())
-	g.require.NoError(err)
+	tx, err := g.GameBindings.Resolve(g.Opts)
+	g.Require.NoError(err)
+	_, err = wait.ForReceiptOK(ctx, g.Client, tx.Hash())
+	g.Require.NoError(err)
 }
 
-func (g *OutputGameHelper) Status(ctx context.Context) Status {
-	status, err := g.game.Status(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err)
-	return Status(status)
+func (g *OutputGameHelper) Status(ctx context.Context) gameTypes.GameStatus {
+	status, err := g.Game.GetStatus(ctx)
+	g.Require.NoError(err)
+	return status
 }
 
-func (g *OutputGameHelper) WaitForGameStatus(ctx context.Context, expected Status) {
-	g.t.Logf("Waiting for game %v to have status %v", g.addr, expected)
+func (g *OutputGameHelper) WaitForGameStatus(ctx context.Context, expected gameTypes.GameStatus) {
+	g.T.Logf("Waiting for game %v to have status %v", g.Addr, expected)
 	timedCtx, cancel := context.WithTimeout(ctx, defaultTimeout)
 	defer cancel()
 	err := wait.For(timedCtx, time.Second, func() (bool, error) {
 		ctx, cancel := context.WithTimeout(timedCtx, 30*time.Second)
 		defer cancel()
-		status, err := g.game.Status(&bind.CallOpts{Context: ctx})
+		status, err := g.Game.GetStatus(ctx)
 		if err != nil {
 			return false, fmt.Errorf("game status unavailable: %w", err)
 		}
-		g.t.Logf("Game %v has state %v, waiting for state %v", g.addr, Status(status), expected)
-		return expected == Status(status), nil
+		g.T.Logf("Game %v has state %v, waiting for state %v", g.Addr, status, expected)
+		return expected == status, nil
 	})
-	g.require.NoErrorf(err, "wait for game status. Game state: \n%v", g.gameData(ctx))
+	g.Require.NoErrorf(err, "wait for Game status. Game state: \n%v", g.GameData(ctx))
 }
 
 func (g *OutputGameHelper) WaitForInactivity(ctx context.Context, numInactiveBlocks int, untilGameEnds bool) {
-	g.t.Logf("Waiting for game %v to have no activity for %v blocks", g.addr, numInactiveBlocks)
+	g.T.Logf("Waiting for game %v to have no activity for %v blocks", g.Addr, numInactiveBlocks)
 	headCh := make(chan *gethtypes.Header, 100)
-	headSub, err := g.client.SubscribeNewHead(ctx, headCh)
-	g.require.NoError(err)
+	headSub, err := g.Client.SubscribeNewHead(ctx, headCh)
+	g.Require.NoError(err)
 	defer headSub.Unsubscribe()
 
 	var lastActiveBlock uint64
 	for {
-		if untilGameEnds && g.Status(ctx) != StatusInProgress {
+		if untilGameEnds && g.Status(ctx) != gameTypes.GameStatusInProgress {
 			break
 		}
 		select {
@@ -410,26 +412,36 @@ func (g *OutputGameHelper) WaitForInactivity(ctx context.Context, numInactiveBlo
 			} else if lastActiveBlock+uint64(numInactiveBlocks) < head.Number.Uint64() {
 				return
 			}
-			block, err := g.client.BlockByNumber(ctx, head.Number)
-			g.require.NoError(err)
+			block, err := g.Client.BlockByNumber(ctx, head.Number)
+			g.Require.NoError(err)
 			numActions := 0
 			for _, tx := range block.Transactions() {
-				if tx.To().Hex() == g.addr.Hex() {
+				if tx.To().Hex() == g.Addr.Hex() {
 					numActions++
 				}
 			}
 			if numActions != 0 {
-				g.t.Logf("Game %v has %v actions in block %d. Resetting inactivity timeout", g.addr, numActions, block.NumberU64())
+				g.T.Logf("Game %v has %v actions in block %d. Resetting inactivity timeout", g.Addr, numActions, block.NumberU64())
 				lastActiveBlock = head.Number.Uint64()
 			}
 		case err := <-headSub.Err():
-			g.require.NoError(err)
+			g.Require.NoError(err)
 		case <-ctx.Done():
-			g.require.Fail("Context canceled", ctx.Err())
+			g.Require.Fail("Context canceled", ctx.Err())
 		}
 	}
 }
 
+func (g *OutputGameHelper) WaitForL2BlockNumberChallenged(ctx context.Context) {
+	g.T.Logf("Waiting for game %v to have L2 block number challenged", g.Addr)
+	timedCtx, cancel := context.WithTimeout(ctx, 30*time.Second)
+	defer cancel()
+	err := wait.For(timedCtx, time.Second, func() (bool, error) {
+		return g.Game.IsL2BlockNumberChallenged(ctx, rpcblock.Latest)
+	})
+	g.Require.NoError(err, "L2 block number was not challenged in time")
+}
+
 // Mover is a function that either attacks or defends the claim at parentClaimIdx
 type Mover func(parent *ClaimHelper) *ClaimHelper
 
@@ -452,10 +464,10 @@ func WithoutWaitingForStep() DefendClaimOpt {
 // It is assumed that the specified claim is invalid and that an honest op-challenger is already running.
 // When the game has reached the maximum depth it waits for the honest challenger to counter the leaf claim with step.
 // Returns the final leaf claim
-func (g *OutputGameHelper) DefendClaim(ctx context.Context, claim *ClaimHelper, performMove Mover, opts ...DefendClaimOpt) *ClaimHelper {
-	g.t.Logf("Defending claim %v at depth %v", claim.index, claim.Depth())
+func (g *OutputGameHelper) DefendClaim(ctx context.Context, claim *ClaimHelper, performMove Mover, Opts ...DefendClaimOpt) *ClaimHelper {
+	g.T.Logf("Defending claim %v at depth %v", claim.Index, claim.Depth())
 	cfg := &defendClaimCfg{}
-	for _, opt := range opts {
+	for _, opt := range Opts {
 		opt(cfg)
 	}
 	for !claim.IsMaxDepth(ctx) {
@@ -494,13 +506,7 @@ func (g *OutputGameHelper) ChallengeClaim(ctx context.Context, claim *ClaimHelpe
 	g.LogGameData(ctx)
 
 	// It's on us to call step if we want to win but shouldn't be possible
-	attemptStep(claim.index)
-}
-
-func (g *OutputGameHelper) getClaimCount(ctx context.Context) int64 {
-	claimCount, err := g.game.ClaimDataLen(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "Failed to get current claim count")
-	return claimCount.Int64()
+	attemptStep(claim.Index)
 }
 
 func (g *OutputGameHelper) WaitForNewClaim(ctx context.Context, checkPoint int64) (int64, error) {
@@ -512,72 +518,70 @@ func (g *OutputGameHelper) waitForNewClaim(ctx context.Context, checkPoint int64
 	defer cancel()
 	var newClaimLen int64
 	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		actual, err := g.game.ClaimDataLen(&bind.CallOpts{Context: ctx})
+		actual, err := g.Game.GetClaimCount(ctx)
 		if err != nil {
 			return false, err
 		}
-		newClaimLen = actual.Int64()
-		return actual.Cmp(big.NewInt(checkPoint)) > 0, nil
+		newClaimLen = int64(actual)
+		return int64(actual) > checkPoint, nil
 	})
 	return newClaimLen, err
 }
 
-func (g *OutputGameHelper) moveCfg(opts ...MoveOpt) *moveCfg {
+func (g *OutputGameHelper) moveCfg(Opts ...MoveOpt) *moveCfg {
 	cfg := &moveCfg{
-		opts: g.opts,
+		Opts: g.Opts,
 	}
-	for _, opt := range opts {
+	for _, opt := range Opts {
 		opt.Apply(cfg)
 	}
 	return cfg
 }
 
-func (g *OutputGameHelper) Attack(ctx context.Context, claimIdx int64, claim common.Hash, opts ...MoveOpt) {
-	g.t.Logf("Attacking claim %v with value %v", claimIdx, claim)
-	cfg := g.moveCfg(opts...)
+func (g *OutputGameHelper) Attack(ctx context.Context, claimIdx int64, claim common.Hash, Opts ...MoveOpt) {
+	g.T.Logf("Attacking claim %v with value %v", claimIdx, claim)
+	cfg := g.moveCfg(Opts...)
 
-	claimData, err := g.game.ClaimData(&bind.CallOpts{Context: ctx}, big.NewInt(claimIdx))
-	g.require.NoError(err, "Failed to get claim data")
-	pos := types.NewPositionFromGIndex(claimData.Position)
-	attackPos := pos.Attack()
-	transactOpts := g.makeBondedTransactOpts(ctx, pos.Attack().ToGIndex(), cfg.opts)
+	claimData, err := g.Game.GetClaim(ctx, uint64(claimIdx))
+	g.Require.NoError(err, "Failed to get claim data")
+	attackPos := claimData.Position.Attack()
+	transactOpts := g.makeBondedTransactOpts(ctx, claimData.Position.Attack().ToGIndex(), cfg.Opts)
 
 	err = g.sendMove(ctx, func() (*gethtypes.Transaction, error) {
-		return g.game.Attack(transactOpts, big.NewInt(claimIdx), claim)
+		return g.GameBindings.Attack(transactOpts, claimData.Value, big.NewInt(claimIdx), claim)
 	})
 	if err != nil {
 		if cfg.ignoreDupes && g.hasClaim(ctx, claimIdx, attackPos, claim) {
 			return
 		}
-		g.require.NoErrorf(err, "Defend transaction failed. Game state: \n%v", g.gameData(ctx))
+		g.Require.NoErrorf(err, "Defend transaction failed. Game state: \n%v", g.GameData(ctx))
 	}
 }
 
-func (g *OutputGameHelper) Defend(ctx context.Context, claimIdx int64, claim common.Hash, opts ...MoveOpt) {
-	g.t.Logf("Defending claim %v with value %v", claimIdx, claim)
-	cfg := g.moveCfg(opts...)
+func (g *OutputGameHelper) Defend(ctx context.Context, claimIdx int64, claim common.Hash, Opts ...MoveOpt) {
+	g.T.Logf("Defending claim %v with value %v", claimIdx, claim)
+	cfg := g.moveCfg(Opts...)
 
-	claimData, err := g.game.ClaimData(&bind.CallOpts{Context: ctx}, big.NewInt(claimIdx))
-	g.require.NoError(err, "Failed to get claim data")
-	pos := types.NewPositionFromGIndex(claimData.Position)
-	defendPos := pos.Defend()
-	transactOpts := g.makeBondedTransactOpts(ctx, defendPos.ToGIndex(), cfg.opts)
+	claimData, err := g.Game.GetClaim(ctx, uint64(claimIdx))
+	g.Require.NoError(err, "Failed to get claim data")
+	defendPos := claimData.Position.Defend()
+	transactOpts := g.makeBondedTransactOpts(ctx, defendPos.ToGIndex(), cfg.Opts)
 
 	err = g.sendMove(ctx, func() (*gethtypes.Transaction, error) {
-		return g.game.Defend(transactOpts, big.NewInt(claimIdx), claim)
+		return g.GameBindings.Defend(transactOpts, claimData.Value, big.NewInt(claimIdx), claim)
 	})
 	if err != nil {
 		if cfg.ignoreDupes && g.hasClaim(ctx, claimIdx, defendPos, claim) {
 			return
 		}
-		g.require.NoErrorf(err, "Defend transaction failed. Game state: \n%v", g.gameData(ctx))
+		g.Require.NoErrorf(err, "Defend transaction failed. Game state: \n%v", g.GameData(ctx))
 	}
 }
 
 func (g *OutputGameHelper) hasClaim(ctx context.Context, parentIdx int64, pos types.Position, value common.Hash) bool {
 	claims := g.getAllClaims(ctx)
 	for _, claim := range claims {
-		if int64(claim.ParentIndex) == parentIdx && claim.Position.Cmp(pos.ToGIndex()) == 0 && claim.Claim == value {
+		if int64(claim.ParentContractIndex) == parentIdx && claim.Position.ToGIndex().Cmp(pos.ToGIndex()) == 0 && claim.Value == value {
 			return true
 		}
 	}
@@ -589,19 +593,19 @@ func (g *OutputGameHelper) sendMove(ctx context.Context, send func() (*gethtypes
 	if err != nil {
 		return fmt.Errorf("transaction did not send: %w", err)
 	}
-	_, err = wait.ForReceiptOK(ctx, g.client, tx.Hash())
+	_, err = wait.ForReceiptOK(ctx, g.Client, tx.Hash())
 	if err != nil {
 		return fmt.Errorf("transaction was not ok: %w", err)
 	}
 	return nil
 }
 
-func (g *OutputGameHelper) makeBondedTransactOpts(ctx context.Context, pos *big.Int, opts *bind.TransactOpts) *bind.TransactOpts {
-	bopts := *opts
-	bond, err := g.game.GetRequiredBond(&bind.CallOpts{Context: ctx}, pos)
-	g.require.NoError(err, "Failed to get required bond")
-	bopts.Value = bond
-	return &bopts
+func (g *OutputGameHelper) makeBondedTransactOpts(ctx context.Context, pos *big.Int, Opts *bind.TransactOpts) *bind.TransactOpts {
+	bOpts := *Opts
+	bond, err := g.GameBindings.GetRequiredBond(&bind.CallOpts{Context: ctx}, pos)
+	g.Require.NoError(err, "Failed to get required bond")
+	bOpts.Value = bond
+	return &bOpts
 }
 
 type ErrWithData interface {
@@ -610,19 +614,19 @@ type ErrWithData interface {
 
 // StepFails attempts to call step and verifies that it fails with ValidStep()
 func (g *OutputGameHelper) StepFails(claimIdx int64, isAttack bool, stateData []byte, proof []byte) {
-	g.t.Logf("Attempting step against claim %v isAttack: %v", claimIdx, isAttack)
-	_, err := g.game.Step(g.opts, big.NewInt(claimIdx), isAttack, stateData, proof)
+	g.T.Logf("Attempting step against claim %v isAttack: %v", claimIdx, isAttack)
+	_, err := g.GameBindings.Step(g.Opts, big.NewInt(claimIdx), isAttack, stateData, proof)
 	errData, ok := err.(ErrWithData)
-	g.require.Truef(ok, "Error should provide ErrorData method: %v", err)
-	g.require.Equal("0xfb4e40dd", errData.ErrorData(), "Revert reason should be abi encoded ValidStep()")
+	g.Require.Truef(ok, "Error should provide ErrorData method: %v", err)
+	g.Require.Equal("0xfb4e40dd", errData.ErrorData(), "Revert reason should be abi encoded ValidStep()")
 }
 
 // ResolveClaim resolves a single subgame
 func (g *OutputGameHelper) ResolveClaim(ctx context.Context, claimIdx int64) {
-	tx, err := g.game.ResolveClaim(g.opts, big.NewInt(claimIdx))
-	g.require.NoError(err, "ResolveClaim transaction did not send")
-	_, err = wait.ForReceiptOK(ctx, g.client, tx.Hash())
-	g.require.NoError(err, "ResolveClaim transaction was not OK")
+	tx, err := g.GameBindings.ResolveClaim(g.Opts, big.NewInt(claimIdx), common.Big0)
+	g.Require.NoError(err, "ResolveClaim transaction did not send")
+	_, err = wait.ForReceiptOK(ctx, g.Client, tx.Hash())
+	g.Require.NoError(err, "ResolveClaim transaction was not OK")
 }
 
 // ChallengePeriod returns the challenge period fetched from the PreimageOracle contract.
@@ -630,7 +634,7 @@ func (g *OutputGameHelper) ResolveClaim(ctx context.Context, claimIdx int64) {
 func (g *OutputGameHelper) ChallengePeriod(ctx context.Context) uint64 {
 	oracle := g.oracle(ctx)
 	period, err := oracle.ChallengePeriod(ctx)
-	g.require.NoError(err, "Failed to get challenge period")
+	g.Require.NoError(err, "Failed to get challenge period")
 	return period
 }
 
@@ -642,12 +646,12 @@ func (g *OutputGameHelper) WaitForChallengePeriodStart(ctx context.Context, send
 		ctx, cancel := context.WithTimeout(timedCtx, 30*time.Second)
 		defer cancel()
 		timestamp := g.ChallengePeriodStartTime(ctx, sender, data)
-		g.t.Log("Waiting for challenge period start", "timestamp", timestamp, "key", data.OracleKey, "game", g.addr)
+		g.T.Log("Waiting for challenge period start", "timestamp", timestamp, "key", data.OracleKey, "game", g.Addr)
 		return timestamp > 0, nil
 	})
 	if err != nil {
 		g.LogGameData(ctx)
-		g.require.NoErrorf(err, "Failed to get challenge start period for preimage data %v", data)
+		g.Require.NoErrorf(err, "Failed to get challenge start period for preimage data %v", data)
 	}
 }
 
@@ -660,100 +664,92 @@ func (g *OutputGameHelper) ChallengePeriodStartTime(ctx context.Context, sender
 		Claimant: sender,
 		UUID:     uuid,
 	})
-	g.require.NoError(err, "Failed to get proposal metadata")
+	g.Require.NoError(err, "Failed to get proposal metadata")
 	if len(metadata) == 0 {
 		return 0
 	}
 	return metadata[0].Timestamp
 }
 
-func (g *OutputGameHelper) waitForPreimageInOracle(ctx context.Context, data *types.PreimageOracleData) {
+func (g *OutputGameHelper) WaitForPreimageInOracle(ctx context.Context, data *types.PreimageOracleData) {
 	timedCtx, cancel := context.WithTimeout(ctx, defaultTimeout)
 	defer cancel()
 	oracle := g.oracle(ctx)
 	err := wait.For(timedCtx, time.Second, func() (bool, error) {
-		g.t.Logf("Waiting for preimage (%v) to be present in oracle", common.Bytes2Hex(data.OracleKey))
+		g.T.Logf("Waiting for preimage (%v) to be present in oracle", common.Bytes2Hex(data.OracleKey))
 		return oracle.GlobalDataExists(ctx, data)
 	})
-	g.require.NoErrorf(err, "Did not find preimage (%v) in oracle", common.Bytes2Hex(data.OracleKey))
+	g.Require.NoErrorf(err, "Did not find preimage (%v) in oracle", common.Bytes2Hex(data.OracleKey))
 }
 
-func (g *OutputGameHelper) uploadPreimage(ctx context.Context, data *types.PreimageOracleData, privateKey *ecdsa.PrivateKey) {
+func (g *OutputGameHelper) UploadPreimage(ctx context.Context, data *types.PreimageOracleData, privateKey *ecdsa.PrivateKey) {
 	oracle := g.oracle(ctx)
-	boundOracle, err := bindings.NewPreimageOracle(oracle.Addr(), g.client)
-	g.require.NoError(err)
+	boundOracle, err := bindings.NewPreimageOracle(oracle.Addr(), g.Client)
+	g.Require.NoError(err)
 	var tx *gethtypes.Transaction
 	switch data.OracleKey[0] {
 	case byte(preimage.PrecompileKeyType):
 		tx, err = boundOracle.LoadPrecompilePreimagePart(
-			g.opts,
+			g.Opts,
 			new(big.Int).SetUint64(uint64(data.OracleOffset)),
 			data.GetPrecompileAddress(),
 			data.GetPrecompileInput(),
 		)
 	default:
-		tx, err = boundOracle.LoadKeccak256PreimagePart(g.opts, new(big.Int).SetUint64(uint64(data.OracleOffset)), data.GetPreimageWithoutSize())
+		tx, err = boundOracle.LoadKeccak256PreimagePart(g.Opts, new(big.Int).SetUint64(uint64(data.OracleOffset)), data.GetPreimageWithoutSize())
 	}
-	g.require.NoError(err, "Failed to load preimage part")
-	_, err = wait.ForReceiptOK(ctx, g.client, tx.Hash())
-	g.require.NoError(err)
+	g.Require.NoError(err, "Failed to load preimage part")
+	_, err = wait.ForReceiptOK(ctx, g.Client, tx.Hash())
+	g.Require.NoError(err)
 }
 
 func (g *OutputGameHelper) oracle(ctx context.Context) *contracts.PreimageOracleContract {
-	caller := batching.NewMultiCaller(g.system.NodeClient("l1").Client(), batching.DefaultBatchSize)
-	contract, err := contracts.NewFaultDisputeGameContract(g.addr, caller)
-	g.require.NoError(err, "Failed to create game contract")
-	oracle, err := contract.GetOracle(ctx)
-	g.require.NoError(err, "Failed to create oracle contract")
+	oracle, err := g.Game.GetOracle(ctx)
+	g.Require.NoError(err, "Failed to create oracle contract")
 	return oracle
 }
 
-func (g *OutputGameHelper) gameData(ctx context.Context) string {
-	opts := &bind.CallOpts{Context: ctx}
+func (g *OutputGameHelper) GameData(ctx context.Context) string {
 	maxDepth := g.MaxDepth(ctx)
 	splitDepth := g.SplitDepth(ctx)
-	claimCount, err := g.game.ClaimDataLen(opts)
-	info := fmt.Sprintf("Claim count: %v\n", claimCount)
-	g.require.NoError(err, "Fetching claim count")
-	for i := int64(0); i < claimCount.Int64(); i++ {
-		claim, err := g.game.ClaimData(opts, big.NewInt(i))
-		g.require.NoErrorf(err, "Fetch claim %v", i)
-
-		pos := types.NewPositionFromGIndex(claim.Position)
+	claims, err := g.Game.GetAllClaims(ctx, rpcblock.Latest)
+	g.Require.NoError(err, "Fetching claims")
+	info := fmt.Sprintf("Claim count: %v\n", len(claims))
+	for i, claim := range claims {
+		pos := claim.Position
 		extra := ""
 		if pos.Depth() <= splitDepth {
-			blockNum, err := g.correctOutputProvider.ClaimedBlockNumber(pos)
+			blockNum, err := g.CorrectOutputProvider.ClaimedBlockNumber(pos)
 			if err != nil {
 			} else {
 				extra = fmt.Sprintf("Block num: %v", blockNum)
 			}
 		}
 		info = info + fmt.Sprintf("%v - Position: %v, Depth: %v, IndexAtDepth: %v Trace Index: %v, ClaimHash: %v, Countered By: %v, ParentIndex: %v Claimant: %v Bond: %v %v\n",
-			i, claim.Position.Int64(), pos.Depth(), pos.IndexAtDepth(), pos.TraceIndex(maxDepth), common.Hash(claim.Claim).Hex(), claim.CounteredBy, claim.ParentIndex, claim.Claimant, claim.Bond, extra)
+			i, claim.Position.ToGIndex().Int64(), pos.Depth(), pos.IndexAtDepth(), pos.TraceIndex(maxDepth), claim.Value.Hex(), claim.CounteredBy, claim.ParentContractIndex, claim.Claimant, claim.Bond, extra)
 	}
 	l2BlockNum := g.L2BlockNum(ctx)
-	status, err := g.game.Status(opts)
-	g.require.NoError(err, "Load game status")
+	status, err := g.Game.GetStatus(ctx)
+	g.Require.NoError(err, "Load game status")
 	return fmt.Sprintf("Game %v - %v - L2 Block: %v - Split Depth: %v - Max Depth: %v:\n%v\n",
-		g.addr, Status(status), l2BlockNum, splitDepth, maxDepth, info)
+		g.Addr, status, l2BlockNum, splitDepth, maxDepth, info)
 }
 
 func (g *OutputGameHelper) LogGameData(ctx context.Context) {
-	g.t.Log(g.gameData(ctx))
+	g.T.Log(g.GameData(ctx))
 }
 
 func (g *OutputGameHelper) Credit(ctx context.Context, addr common.Address) *big.Int {
-	opts := &bind.CallOpts{Context: ctx}
-	amt, err := g.game.Credit(opts, addr)
-	g.require.NoError(err)
+	amt, _, err := g.Game.GetCredit(ctx, addr)
+	g.Require.NoError(err)
 	return amt
 }
 
-func (g *OutputGameHelper) getL1Head(ctx context.Context) eth.BlockID {
-	l1HeadHash, err := g.game.L1Head(&bind.CallOpts{Context: ctx})
-	g.require.NoError(err, "Failed to load L1 head")
-	l1Header, err := g.client.HeaderByHash(ctx, l1HeadHash)
-	g.require.NoError(err, "Failed to load L1 header")
+func (g *OutputGameHelper) GetL1Head(ctx context.Context) eth.BlockID {
+	l1HeadHash, err := g.Game.GetL1Head(ctx)
+	g.Require.NoError(err, "Failed to load L1 head")
+	l1Header, err := g.Client.HeaderByHash(ctx, l1HeadHash)
+	g.Require.NoError(err, "Failed to load L1 header")
 	l1Head := eth.HeaderBlockID(l1Header)
 	return l1Head
 }
diff --git a/op-e2e/e2eutils/disputegame/output_honest_helper.go b/op-e2e/e2eutils/disputegame/output_honest_helper.go
index 9258dfd797e4..e2de7c4ec743 100644
--- a/op-e2e/e2eutils/disputegame/output_honest_helper.go
+++ b/op-e2e/e2eutils/disputegame/output_honest_helper.go
@@ -11,16 +11,28 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
+const getTraceTimeout = 10 * time.Minute
+
 type OutputHonestHelper struct {
 	t            *testing.T
 	require      *require.Assertions
 	game         *OutputGameHelper
-	contract     *contracts.FaultDisputeGameContract
+	contract     contracts.FaultDisputeGameContract
 	correctTrace types.TraceAccessor
 }
 
+func NewOutputHonestHelper(t *testing.T, require *require.Assertions, game *OutputGameHelper, contract contracts.FaultDisputeGameContract, correctTrace types.TraceAccessor) *OutputHonestHelper {
+	return &OutputHonestHelper{
+		t:            t,
+		require:      require,
+		game:         game,
+		contract:     contract,
+		correctTrace: correctTrace,
+	}
+}
+
 func (h *OutputHonestHelper) CounterClaim(ctx context.Context, claim *ClaimHelper, opts ...MoveOpt) *ClaimHelper {
-	game, target := h.loadState(ctx, claim.index)
+	game, target := h.loadState(ctx, claim.Index)
 	value, err := h.correctTrace.Get(ctx, game, target, target.Position)
 	h.require.NoErrorf(err, "Failed to determine correct claim at position %v with g index %v", target.Position, target.Position.ToGIndex())
 	if value == claim.claim {
@@ -31,12 +43,12 @@ func (h *OutputHonestHelper) CounterClaim(ctx context.Context, claim *ClaimHelpe
 }
 
 func (h *OutputHonestHelper) AttackClaim(ctx context.Context, claim *ClaimHelper, opts ...MoveOpt) *ClaimHelper {
-	h.Attack(ctx, claim.index, opts...)
+	h.Attack(ctx, claim.Index, opts...)
 	return claim.WaitForCounterClaim(ctx)
 }
 
 func (h *OutputHonestHelper) DefendClaim(ctx context.Context, claim *ClaimHelper, opts ...MoveOpt) *ClaimHelper {
-	h.Defend(ctx, claim.index, opts...)
+	h.Defend(ctx, claim.Index, opts...)
 	return claim.WaitForCounterClaim(ctx)
 }
 
@@ -44,7 +56,7 @@ func (h *OutputHonestHelper) Attack(ctx context.Context, claimIdx int64, opts ..
 	// Ensure the claim exists
 	h.game.WaitForClaimCount(ctx, claimIdx+1)
 
-	ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
+	ctx, cancel := context.WithTimeout(ctx, getTraceTimeout)
 	defer cancel()
 
 	game, claim := h.loadState(ctx, claimIdx)
@@ -61,17 +73,17 @@ func (h *OutputHonestHelper) Defend(ctx context.Context, claimIdx int64, opts ..
 	// Ensure the claim exists
 	h.game.WaitForClaimCount(ctx, claimIdx+1)
 
-	ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
+	ctx, cancel := context.WithTimeout(ctx, getTraceTimeout)
 	defer cancel()
 	game, claim := h.loadState(ctx, claimIdx)
 	defendPos := claim.Position.Defend()
 	value, err := h.correctTrace.Get(ctx, game, claim, defendPos)
-	h.game.require.NoErrorf(err, "Get correct claim at position %v with g index %v", defendPos, defendPos.ToGIndex())
+	h.game.Require.NoErrorf(err, "Get correct claim at position %v with g index %v", defendPos, defendPos.ToGIndex())
 	h.game.Defend(ctx, claimIdx, value, opts...)
 }
 
 func (h *OutputHonestHelper) StepClaimFails(ctx context.Context, claim *ClaimHelper, isAttack bool) {
-	h.StepFails(ctx, claim.index, isAttack)
+	h.StepFails(ctx, claim.Index, isAttack)
 }
 
 func (h *OutputHonestHelper) StepFails(ctx context.Context, claimIdx int64, isAttack bool) {
diff --git a/op-e2e/e2eutils/disputegame/preimage/preimage_helper.go b/op-e2e/e2eutils/disputegame/preimage/preimage_helper.go
index f124add19d63..ad043d3e37a9 100644
--- a/op-e2e/e2eutils/disputegame/preimage/preimage_helper.go
+++ b/op-e2e/e2eutils/disputegame/preimage/preimage_helper.go
@@ -11,11 +11,11 @@ import (
 	"testing"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/preimages"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/keccak/matrix"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/keccak/types"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching"
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
@@ -43,8 +43,7 @@ func NewHelper(t *testing.T, opts *bind.TransactOpts, client *ethclient.Client,
 	oracleBindings, err := bindings.NewPreimageOracle(addr, client)
 	require.NoError(err)
 
-	oracle, err := contracts.NewPreimageOracleContract(addr, batching.NewMultiCaller(client.Client(), batching.DefaultBatchSize))
-	require.NoError(err)
+	oracle := contracts.NewPreimageOracleContract(addr, batching.NewMultiCaller(client.Client(), batching.DefaultBatchSize))
 	return &Helper{
 		t:              t,
 		require:        require,
diff --git a/op-e2e/e2eutils/fakebeacon/blobs.go b/op-e2e/e2eutils/fakebeacon/blobs.go
index 1f77e3d5a3f8..6be65bbb3521 100644
--- a/op-e2e/e2eutils/fakebeacon/blobs.go
+++ b/op-e2e/e2eutils/fakebeacon/blobs.go
@@ -76,8 +76,12 @@ func (f *FakeBeacon) Start(addr string) error {
 			return
 		}
 		bundle, err := f.LoadBlobsBundle(slot)
-		if err != nil {
-			f.log.Error("failed to load blobs bundle", "slot", slot)
+		if errors.Is(err, ethereum.NotFound) {
+			f.log.Error("failed to load blobs bundle - not found", "slot", slot, "err", err)
+			w.WriteHeader(http.StatusNotFound)
+			return
+		} else if err != nil {
+			f.log.Error("failed to load blobs bundle", "slot", slot, "err", err)
 			w.WriteHeader(http.StatusInternalServerError)
 			return
 		}
diff --git a/op-e2e/e2eutils/geth/wait.go b/op-e2e/e2eutils/geth/wait.go
index 76398178ac0f..823d40a52ab7 100644
--- a/op-e2e/e2eutils/geth/wait.go
+++ b/op-e2e/e2eutils/geth/wait.go
@@ -5,6 +5,7 @@ import (
 	"errors"
 	"fmt"
 	"math/big"
+	"strings"
 	"time"
 
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
@@ -16,10 +17,10 @@ import (
 	"github.com/ethereum/go-ethereum/rpc"
 )
 
-var (
-	// errTimeout represents a timeout
-	errTimeout = errors.New("timeout")
-)
+const errStrTxIdxingInProgress = "transaction indexing is in progress"
+
+// errTimeout represents a timeout
+var errTimeout = errors.New("timeout")
 
 func WaitForL1OriginOnL2(rollupCfg *rollup.Config, l1BlockNum uint64, client *ethclient.Client, timeout time.Duration) (*types.Block, error) {
 	timeoutCh := time.After(timeout)
@@ -65,7 +66,8 @@ func WaitForTransaction(hash common.Hash, client *ethclient.Client, timeout time
 		receipt, err := client.TransactionReceipt(ctx, hash)
 		if receipt != nil && err == nil {
 			return receipt, nil
-		} else if err != nil && !errors.Is(err, ethereum.NotFound) {
+		} else if err != nil &&
+			!(errors.Is(err, ethereum.NotFound) || strings.Contains(err.Error(), errStrTxIdxingInProgress)) {
 			return nil, err
 		}
 
diff --git a/op-e2e/e2eutils/setup.go b/op-e2e/e2eutils/setup.go
index a417060a7399..448fdabffa87 100644
--- a/op-e2e/e2eutils/setup.go
+++ b/op-e2e/e2eutils/setup.go
@@ -9,12 +9,14 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/core"
+	"github.com/ethereum/go-ethereum/core/types"
 
 	"github.com/stretchr/testify/require"
 
 	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
 	"github.com/ethereum-optimism/optimism/op-e2e/config"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
+	plasma "github.com/ethereum-optimism/optimism/op-plasma"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 )
 
@@ -79,6 +81,7 @@ type SetupData struct {
 	L1Cfg         *core.Genesis
 	L2Cfg         *core.Genesis
 	RollupCfg     *rollup.Config
+	ChainSpec     *rollup.ChainSpec
 	DeploymentsL1 *genesis.L1Deployments
 }
 
@@ -86,8 +89,8 @@ type SetupData struct {
 // These allocations override existing allocations per account,
 // i.e. the allocations are merged with AllocParams having priority.
 type AllocParams struct {
-	L1Alloc          core.GenesisAlloc
-	L2Alloc          core.GenesisAlloc
+	L1Alloc          types.GenesisAlloc
+	L2Alloc          types.GenesisAlloc
 	PrefundTestUsers bool
 }
 
@@ -111,7 +114,7 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) *
 	require.NoError(t, err, "failed to create l1 genesis")
 	if alloc.PrefundTestUsers {
 		for _, addr := range deployParams.Addresses.All() {
-			l1Genesis.Alloc[addr] = core.GenesisAccount{
+			l1Genesis.Alloc[addr] = types.Account{
 				Balance: Ether(1e12),
 			}
 		}
@@ -122,11 +125,17 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) *
 
 	l1Block := l1Genesis.ToBlock()
 
-	l2Genesis, err := genesis.BuildL2Genesis(deployConf, l1Block)
+	var allocsMode genesis.L2AllocsMode
+	allocsMode = genesis.L2AllocsDelta
+	if ecotoneTime := deployConf.EcotoneTime(l1Block.Time()); ecotoneTime != nil && *ecotoneTime == 0 {
+		allocsMode = genesis.L2AllocsEcotone
+	}
+	l2Allocs := config.L2Allocs(allocsMode)
+	l2Genesis, err := genesis.BuildL2Genesis(deployConf, l2Allocs, l1Block)
 	require.NoError(t, err, "failed to create l2 genesis")
 	if alloc.PrefundTestUsers {
 		for _, addr := range deployParams.Addresses.All() {
-			l2Genesis.Alloc[addr] = core.GenesisAccount{
+			l2Genesis.Alloc[addr] = types.Account{
 				Balance: Ether(1e12),
 			}
 		}
@@ -135,6 +144,16 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) *
 		l2Genesis.Alloc[addr] = val
 	}
 
+	var pcfg *rollup.PlasmaConfig
+	if deployConf.UsePlasma {
+		pcfg = &rollup.PlasmaConfig{
+			DAChallengeAddress: l1Deployments.DataAvailabilityChallengeProxy,
+			DAChallengeWindow:  deployConf.DAChallengeWindow,
+			DAResolveWindow:    deployConf.DAResolveWindow,
+			CommitmentType:     plasma.KeccakCommitmentString,
+		}
+	}
+
 	rollupCfg := &rollup.Config{
 		Genesis: rollup.Genesis{
 			L1: eth.BlockID{
@@ -163,10 +182,7 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) *
 		EcotoneTime:            deployConf.EcotoneTime(uint64(deployConf.L1GenesisBlockTimestamp)),
 		FjordTime:              deployConf.FjordTime(uint64(deployConf.L1GenesisBlockTimestamp)),
 		InteropTime:            deployConf.InteropTime(uint64(deployConf.L1GenesisBlockTimestamp)),
-		DAChallengeAddress:     l1Deployments.DataAvailabilityChallengeProxy,
-		DAChallengeWindow:      deployConf.DAChallengeWindow,
-		DAResolveWindow:        deployConf.DAResolveWindow,
-		UsePlasma:              deployConf.UsePlasma,
+		PlasmaConfig:           pcfg,
 	}
 
 	require.NoError(t, rollupCfg.Check())
@@ -180,6 +196,7 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) *
 		L1Cfg:         l1Genesis,
 		L2Cfg:         l2Genesis,
 		RollupCfg:     rollupCfg,
+		ChainSpec:     rollup.NewChainSpec(rollupCfg),
 		DeploymentsL1: l1Deployments,
 	}
 }
@@ -188,7 +205,7 @@ func SystemConfigFromDeployConfig(deployConfig *genesis.DeployConfig) eth.System
 	return eth.SystemConfig{
 		BatcherAddr: deployConfig.BatchSenderAddress,
 		Overhead:    eth.Bytes32(common.BigToHash(new(big.Int).SetUint64(deployConfig.GasPriceOracleOverhead))),
-		Scalar:      eth.Bytes32(common.BigToHash(new(big.Int).SetUint64(deployConfig.GasPriceOracleScalar))),
+		Scalar:      eth.Bytes32(deployConfig.FeeScalar()),
 		GasLimit:    uint64(deployConfig.L2GenesisBlockGasLimit),
 	}
 }
diff --git a/op-e2e/e2eutils/setup_test.go b/op-e2e/e2eutils/setup_test.go
index 2bc6a362a158..6ce4176591e0 100644
--- a/op-e2e/e2eutils/setup_test.go
+++ b/op-e2e/e2eutils/setup_test.go
@@ -7,8 +7,8 @@ import (
 
 	"github.com/stretchr/testify/require"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-e2e/config"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 )
 
 func TestWriteDefaultJWT(t *testing.T) {
diff --git a/op-e2e/e2eutils/wait/waits.go b/op-e2e/e2eutils/wait/waits.go
index bb0e8f097c50..c19db934fff4 100644
--- a/op-e2e/e2eutils/wait/waits.go
+++ b/op-e2e/e2eutils/wait/waits.go
@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"math/big"
 	"os"
+	"strings"
 	"time"
 
 	"github.com/ethereum/go-ethereum"
@@ -46,7 +47,7 @@ func ForReceipt(ctx context.Context, client *ethclient.Client, hash common.Hash,
 	defer ticker.Stop()
 	for {
 		receipt, err := client.TransactionReceipt(ctx, hash)
-		if errors.Is(err, ethereum.NotFound) {
+		if errors.Is(err, ethereum.NotFound) || (err != nil && strings.Contains(err.Error(), "transaction indexing is in progress")) {
 			select {
 			case <-ctx.Done():
 				return nil, ctx.Err()
diff --git a/op-e2e/e2eutils/wait/withdrawals.go b/op-e2e/e2eutils/wait/withdrawals.go
index 35c8f3005111..b4c932177439 100644
--- a/op-e2e/e2eutils/wait/withdrawals.go
+++ b/op-e2e/e2eutils/wait/withdrawals.go
@@ -6,9 +6,9 @@ import (
 	"math/big"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindingspreview"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
+	"github.com/ethereum-optimism/optimism/op-node/bindings"
+	bindingspreview "github.com/ethereum-optimism/optimism/op-node/bindings/preview"
 	"github.com/ethereum-optimism/optimism/op-node/withdrawals"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/common"
@@ -110,7 +110,7 @@ func ForGamePublished(ctx context.Context, client *ethclient.Client, optimismPor
 }
 
 // ForWithdrawalCheck waits until the withdrawal check in the portal succeeds.
-func ForWithdrawalCheck(ctx context.Context, client *ethclient.Client, withdrawal crossdomain.Withdrawal, optimismPortalAddr common.Address) error {
+func ForWithdrawalCheck(ctx context.Context, client *ethclient.Client, withdrawal crossdomain.Withdrawal, optimismPortalAddr common.Address, proofSubmitter common.Address) error {
 	ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
 	defer cancel()
 	opts := &bind.CallOpts{Context: ctx}
@@ -125,7 +125,7 @@ func ForWithdrawalCheck(ctx context.Context, client *ethclient.Client, withdrawa
 			return false, fmt.Errorf("hash withdrawal: %w", err)
 		}
 
-		err = portal.CheckWithdrawal(opts, wdHash)
+		err = portal.CheckWithdrawal(opts, wdHash, proofSubmitter)
 		return err == nil, nil
 	})
 }
diff --git a/op-e2e/external.go b/op-e2e/external.go
index df960d583983..e59874393941 100644
--- a/op-e2e/external.go
+++ b/op-e2e/external.go
@@ -14,6 +14,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-e2e/external"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core"
+	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/params"
 	"github.com/onsi/gomega/gexec"
 	"github.com/stretchr/testify/require"
@@ -64,7 +65,7 @@ func (eec *ExternalEthClient) Close() error {
 	return nil
 }
 
-func (er *ExternalRunner) Run(t *testing.T) *ExternalEthClient {
+func (er *ExternalRunner) Run(t testing.TB) *ExternalEthClient {
 	if er.BinPath == "" {
 		t.Error("no external bin path set")
 	}
@@ -75,8 +76,8 @@ func (er *ExternalRunner) Run(t *testing.T) *ExternalEthClient {
 
 	if er.Genesis == nil {
 		er.Genesis = &core.Genesis{
-			Alloc: core.GenesisAlloc{
-				common.Address{1}: core.GenesisAccount{Balance: big.NewInt(1)},
+			Alloc: types.GenesisAlloc{
+				common.Address{1}: types.Account{Balance: big.NewInt(1)},
 			},
 			Config:     params.OptimismTestConfig,
 			Difficulty: big.NewInt(0),
diff --git a/op-e2e/external/config.go b/op-e2e/external/config.go
index 7bea37bc68a8..943abe6346f9 100644
--- a/op-e2e/external/config.go
+++ b/op-e2e/external/config.go
@@ -31,6 +31,7 @@ func AtomicEncode(path string, val any) error {
 	if err != nil {
 		return err
 	}
+	defer atomicFile.Close()
 	if err = json.NewEncoder(atomicFile).Encode(val); err != nil {
 		return err
 	}
@@ -53,7 +54,7 @@ type TestParms struct {
 	SkipTests map[string]string `json:"skip_tests"`
 }
 
-func (tp TestParms) SkipIfNecessary(t *testing.T) {
+func (tp TestParms) SkipIfNecessary(t testing.TB) {
 	if len(tp.SkipTests) == 0 {
 		return
 	}
diff --git a/op-e2e/external_geth/main_test.go b/op-e2e/external_geth/main_test.go
index 85f4218f90b1..f51cd474850c 100644
--- a/op-e2e/external_geth/main_test.go
+++ b/op-e2e/external_geth/main_test.go
@@ -39,7 +39,7 @@ func TestShim(t *testing.T) {
 		Name:    "TestShim",
 		BinPath: shimPath,
 	}).Run(t)
-	t.Cleanup(func() { _ = ec.Close })
+	t.Cleanup(func() { _ = ec.Close() })
 
 	for _, endpoint := range []string{
 		ec.HTTPEndpoint(),
diff --git a/op-e2e/fastlz/fastlz.c b/op-e2e/fastlz/fastlz.c
new file mode 100644
index 000000000000..c8c0fa4faefb
--- /dev/null
+++ b/op-e2e/fastlz/fastlz.c
@@ -0,0 +1,511 @@
+/*
+  FastLZ - Byte-aligned LZ77 compression library
+  Copyright (C) 2005-2020 Ariya Hidayat 
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in
+  all copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  THE SOFTWARE.
+
+  This implementation is taken from the following repository/commit:
+  https://github.com/ariya/FastLZ/tree/344eb4025f9ae866ebf7a2ec48850f7113a97a42
+*/
+
+#include "fastlz.h"
+
+#include 
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
+
+/*
+ * Give hints to the compiler for branch prediction optimization.
+ */
+#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 2))
+#define FASTLZ_LIKELY(c) (__builtin_expect(!!(c), 1))
+#define FASTLZ_UNLIKELY(c) (__builtin_expect(!!(c), 0))
+#else
+#define FASTLZ_LIKELY(c) (c)
+#define FASTLZ_UNLIKELY(c) (c)
+#endif
+
+/*
+ * Specialize custom 64-bit implementation for speed improvements.
+ */
+#if defined(__x86_64__) || defined(_M_X64) || defined(__aarch64__)
+#define FLZ_ARCH64
+#endif
+
+/*
+ * Workaround for DJGPP to find uint8_t, uint16_t, etc.
+ */
+#if defined(__MSDOS__) && defined(__GNUC__)
+#include 
+#endif
+
+#if defined(FASTLZ_USE_MEMMOVE) && (FASTLZ_USE_MEMMOVE == 0)
+
+static void fastlz_memmove(uint8_t* dest, const uint8_t* src, uint32_t count) {
+  do {
+    *dest++ = *src++;
+  } while (--count);
+}
+
+static void fastlz_memcpy(uint8_t* dest, const uint8_t* src, uint32_t count) {
+  return fastlz_memmove(dest, src, count);
+}
+
+#else
+
+#include 
+
+static void fastlz_memmove(uint8_t* dest, const uint8_t* src, uint32_t count) {
+  if ((count > 4) && (dest >= src + count)) {
+    memmove(dest, src, count);
+  } else {
+    switch (count) {
+      default:
+        do {
+          *dest++ = *src++;
+        } while (--count);
+        break;
+      case 3:
+        *dest++ = *src++;
+      case 2:
+        *dest++ = *src++;
+      case 1:
+        *dest++ = *src++;
+      case 0:
+        break;
+    }
+  }
+}
+
+static void fastlz_memcpy(uint8_t* dest, const uint8_t* src, uint32_t count) { memcpy(dest, src, count); }
+
+#endif
+
+#if defined(FLZ_ARCH64)
+
+static uint32_t flz_readu32(const void* ptr) { return *(const uint32_t*)ptr; }
+
+static uint32_t flz_cmp(const uint8_t* p, const uint8_t* q, const uint8_t* r) {
+  const uint8_t* start = p;
+
+  if (flz_readu32(p) == flz_readu32(q)) {
+    p += 4;
+    q += 4;
+  }
+  while (q < r)
+    if (*p++ != *q++) break;
+  return p - start;
+}
+
+#endif /* FLZ_ARCH64 */
+
+#if !defined(FLZ_ARCH64)
+
+static uint32_t flz_readu32(const void* ptr) {
+  const uint8_t* p = (const uint8_t*)ptr;
+  return (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0];
+}
+
+static uint32_t flz_cmp(const uint8_t* p, const uint8_t* q, const uint8_t* r) {
+  const uint8_t* start = p;
+  while (q < r)
+    if (*p++ != *q++) break;
+  return p - start;
+}
+
+#endif /* !FLZ_ARCH64 */
+
+#define MAX_COPY 32
+#define MAX_LEN 264 /* 256 + 8 */
+#define MAX_L1_DISTANCE 8192
+#define MAX_L2_DISTANCE 8191
+#define MAX_FARDISTANCE (65535 + MAX_L2_DISTANCE - 1)
+
+#define HASH_LOG 13
+#define HASH_SIZE (1 << HASH_LOG)
+#define HASH_MASK (HASH_SIZE - 1)
+
+static uint16_t flz_hash(uint32_t v) {
+  uint32_t h = (v * 2654435769LL) >> (32 - HASH_LOG);
+  return h & HASH_MASK;
+}
+
+/* special case of memcpy: at most MAX_COPY bytes */
+static void flz_smallcopy(uint8_t* dest, const uint8_t* src, uint32_t count) {
+#if defined(FLZ_ARCH64)
+  if (count >= 4) {
+    const uint32_t* p = (const uint32_t*)src;
+    uint32_t* q = (uint32_t*)dest;
+    while (count > 4) {
+      *q++ = *p++;
+      count -= 4;
+      dest += 4;
+      src += 4;
+    }
+  }
+#endif
+  fastlz_memcpy(dest, src, count);
+}
+
+/* special case of memcpy: exactly MAX_COPY bytes */
+static void flz_maxcopy(void* dest, const void* src) {
+#if defined(FLZ_ARCH64)
+  const uint32_t* p = (const uint32_t*)src;
+  uint32_t* q = (uint32_t*)dest;
+  *q++ = *p++;
+  *q++ = *p++;
+  *q++ = *p++;
+  *q++ = *p++;
+  *q++ = *p++;
+  *q++ = *p++;
+  *q++ = *p++;
+  *q++ = *p++;
+#else
+  fastlz_memcpy(dest, src, MAX_COPY);
+#endif
+}
+
+static uint8_t* flz_literals(uint32_t runs, const uint8_t* src, uint8_t* dest) {
+  while (runs >= MAX_COPY) {
+    *dest++ = MAX_COPY - 1;
+    flz_maxcopy(dest, src);
+    src += MAX_COPY;
+    dest += MAX_COPY;
+    runs -= MAX_COPY;
+  }
+  if (runs > 0) {
+    *dest++ = runs - 1;
+    flz_smallcopy(dest, src, runs);
+    dest += runs;
+  }
+  return dest;
+}
+
+static uint8_t* flz1_match(uint32_t len, uint32_t distance, uint8_t* op) {
+  --distance;
+  if (FASTLZ_UNLIKELY(len > MAX_LEN - 2))
+    while (len > MAX_LEN - 2) {
+      *op++ = (7 << 5) + (distance >> 8);
+      *op++ = MAX_LEN - 2 - 7 - 2;
+      *op++ = (distance & 255);
+      len -= MAX_LEN - 2;
+    }
+  if (len < 7) {
+    *op++ = (len << 5) + (distance >> 8);
+    *op++ = (distance & 255);
+  } else {
+    *op++ = (7 << 5) + (distance >> 8);
+    *op++ = len - 7;
+    *op++ = (distance & 255);
+  }
+  return op;
+}
+
+#define FASTLZ_BOUND_CHECK(cond) \
+  if (FASTLZ_UNLIKELY(!(cond))) return 0;
+
+int fastlz1_compress(const void* input, int length, void* output) {
+  const uint8_t* ip = (const uint8_t*)input;
+  const uint8_t* ip_start = ip;
+  const uint8_t* ip_bound = ip + length - 4; /* because readU32 */
+  const uint8_t* ip_limit = ip + length - 12 - 1;
+  uint8_t* op = (uint8_t*)output;
+
+  uint32_t htab[HASH_SIZE];
+  uint32_t seq, hash;
+
+  /* initializes hash table */
+  for (hash = 0; hash < HASH_SIZE; ++hash) htab[hash] = 0;
+
+  /* we start with literal copy */
+  const uint8_t* anchor = ip;
+  ip += 2;
+
+  /* main loop */
+  while (FASTLZ_LIKELY(ip < ip_limit)) {
+    const uint8_t* ref;
+    uint32_t distance, cmp;
+
+    /* find potential match */
+    do {
+      seq = flz_readu32(ip) & 0xffffff;
+      hash = flz_hash(seq);
+      ref = ip_start + htab[hash];
+      htab[hash] = ip - ip_start;
+      distance = ip - ref;
+      cmp = FASTLZ_LIKELY(distance < MAX_L1_DISTANCE) ? flz_readu32(ref) & 0xffffff : 0x1000000;
+      if (FASTLZ_UNLIKELY(ip >= ip_limit)) break;
+      ++ip;
+    } while (seq != cmp);
+
+    if (FASTLZ_UNLIKELY(ip >= ip_limit)) break;
+    --ip;
+
+    if (FASTLZ_LIKELY(ip > anchor)) {
+      op = flz_literals(ip - anchor, anchor, op);
+    }
+
+    uint32_t len = flz_cmp(ref + 3, ip + 3, ip_bound);
+    op = flz1_match(len, distance, op);
+
+    /* update the hash at match boundary */
+    ip += len;
+    seq = flz_readu32(ip);
+    hash = flz_hash(seq & 0xffffff);
+    htab[hash] = ip++ - ip_start;
+    seq >>= 8;
+    hash = flz_hash(seq);
+    htab[hash] = ip++ - ip_start;
+
+    anchor = ip;
+  }
+
+  uint32_t copy = (uint8_t*)input + length - anchor;
+  op = flz_literals(copy, anchor, op);
+
+  return op - (uint8_t*)output;
+}
+
+int fastlz1_decompress(const void* input, int length, void* output, int maxout) {
+  const uint8_t* ip = (const uint8_t*)input;
+  const uint8_t* ip_limit = ip + length;
+  const uint8_t* ip_bound = ip_limit - 2;
+  uint8_t* op = (uint8_t*)output;
+  uint8_t* op_limit = op + maxout;
+  uint32_t ctrl = (*ip++) & 31;
+
+  while (1) {
+    if (ctrl >= 32) {
+      uint32_t len = (ctrl >> 5) - 1;
+      uint32_t ofs = (ctrl & 31) << 8;
+      const uint8_t* ref = op - ofs - 1;
+      if (len == 7 - 1) {
+        FASTLZ_BOUND_CHECK(ip <= ip_bound);
+        len += *ip++;
+      }
+      ref -= *ip++;
+      len += 3;
+      FASTLZ_BOUND_CHECK(op + len <= op_limit);
+      FASTLZ_BOUND_CHECK(ref >= (uint8_t*)output);
+      fastlz_memmove(op, ref, len);
+      op += len;
+    } else {
+      ctrl++;
+      FASTLZ_BOUND_CHECK(op + ctrl <= op_limit);
+      FASTLZ_BOUND_CHECK(ip + ctrl <= ip_limit);
+      fastlz_memcpy(op, ip, ctrl);
+      ip += ctrl;
+      op += ctrl;
+    }
+
+    if (FASTLZ_UNLIKELY(ip > ip_bound)) break;
+    ctrl = *ip++;
+  }
+
+  return op - (uint8_t*)output;
+}
+
+static uint8_t* flz2_match(uint32_t len, uint32_t distance, uint8_t* op) {
+  --distance;
+  if (distance < MAX_L2_DISTANCE) {
+    if (len < 7) {
+      *op++ = (len << 5) + (distance >> 8);
+      *op++ = (distance & 255);
+    } else {
+      *op++ = (7 << 5) + (distance >> 8);
+      for (len -= 7; len >= 255; len -= 255) *op++ = 255;
+      *op++ = len;
+      *op++ = (distance & 255);
+    }
+  } else {
+    /* far away, but not yet in the another galaxy... */
+    if (len < 7) {
+      distance -= MAX_L2_DISTANCE;
+      *op++ = (len << 5) + 31;
+      *op++ = 255;
+      *op++ = distance >> 8;
+      *op++ = distance & 255;
+    } else {
+      distance -= MAX_L2_DISTANCE;
+      *op++ = (7 << 5) + 31;
+      for (len -= 7; len >= 255; len -= 255) *op++ = 255;
+      *op++ = len;
+      *op++ = 255;
+      *op++ = distance >> 8;
+      *op++ = distance & 255;
+    }
+  }
+  return op;
+}
+
+int fastlz2_compress(const void* input, int length, void* output) {
+  const uint8_t* ip = (const uint8_t*)input;
+  const uint8_t* ip_start = ip;
+  const uint8_t* ip_bound = ip + length - 4; /* because readU32 */
+  const uint8_t* ip_limit = ip + length - 12 - 1;
+  uint8_t* op = (uint8_t*)output;
+
+  uint32_t htab[HASH_SIZE];
+  uint32_t seq, hash;
+
+  /* initializes hash table */
+  for (hash = 0; hash < HASH_SIZE; ++hash) htab[hash] = 0;
+
+  /* we start with literal copy */
+  const uint8_t* anchor = ip;
+  ip += 2;
+
+  /* main loop */
+  while (FASTLZ_LIKELY(ip < ip_limit)) {
+    const uint8_t* ref;
+    uint32_t distance, cmp;
+
+    /* find potential match */
+    do {
+      seq = flz_readu32(ip) & 0xffffff;
+      hash = flz_hash(seq);
+      ref = ip_start + htab[hash];
+      htab[hash] = ip - ip_start;
+      distance = ip - ref;
+      cmp = FASTLZ_LIKELY(distance < MAX_FARDISTANCE) ? flz_readu32(ref) & 0xffffff : 0x1000000;
+      if (FASTLZ_UNLIKELY(ip >= ip_limit)) break;
+      ++ip;
+    } while (seq != cmp);
+
+    if (FASTLZ_UNLIKELY(ip >= ip_limit)) break;
+
+    --ip;
+
+    /* far, needs at least 5-byte match */
+    if (distance >= MAX_L2_DISTANCE) {
+      if (ref[3] != ip[3] || ref[4] != ip[4]) {
+        ++ip;
+        continue;
+      }
+    }
+
+    if (FASTLZ_LIKELY(ip > anchor)) {
+      op = flz_literals(ip - anchor, anchor, op);
+    }
+
+    uint32_t len = flz_cmp(ref + 3, ip + 3, ip_bound);
+    op = flz2_match(len, distance, op);
+
+    /* update the hash at match boundary */
+    ip += len;
+    seq = flz_readu32(ip);
+    hash = flz_hash(seq & 0xffffff);
+    htab[hash] = ip++ - ip_start;
+    seq >>= 8;
+    hash = flz_hash(seq);
+    htab[hash] = ip++ - ip_start;
+
+    anchor = ip;
+  }
+
+  uint32_t copy = (uint8_t*)input + length - anchor;
+  op = flz_literals(copy, anchor, op);
+
+  /* marker for fastlz2 */
+  *(uint8_t*)output |= (1 << 5);
+
+  return op - (uint8_t*)output;
+}
+
+int fastlz2_decompress(const void* input, int length, void* output, int maxout) {
+  const uint8_t* ip = (const uint8_t*)input;
+  const uint8_t* ip_limit = ip + length;
+  const uint8_t* ip_bound = ip_limit - 2;
+  uint8_t* op = (uint8_t*)output;
+  uint8_t* op_limit = op + maxout;
+  uint32_t ctrl = (*ip++) & 31;
+
+  while (1) {
+    if (ctrl >= 32) {
+      uint32_t len = (ctrl >> 5) - 1;
+      uint32_t ofs = (ctrl & 31) << 8;
+      const uint8_t* ref = op - ofs - 1;
+
+      uint8_t code;
+      if (len == 7 - 1) do {
+          FASTLZ_BOUND_CHECK(ip <= ip_bound);
+          code = *ip++;
+          len += code;
+        } while (code == 255);
+      code = *ip++;
+      ref -= code;
+      len += 3;
+
+      /* match from 16-bit distance */
+      if (FASTLZ_UNLIKELY(code == 255))
+        if (FASTLZ_LIKELY(ofs == (31 << 8))) {
+          FASTLZ_BOUND_CHECK(ip < ip_bound);
+          ofs = (*ip++) << 8;
+          ofs += *ip++;
+          ref = op - ofs - MAX_L2_DISTANCE - 1;
+        }
+
+      FASTLZ_BOUND_CHECK(op + len <= op_limit);
+      FASTLZ_BOUND_CHECK(ref >= (uint8_t*)output);
+      fastlz_memmove(op, ref, len);
+      op += len;
+    } else {
+      ctrl++;
+      FASTLZ_BOUND_CHECK(op + ctrl <= op_limit);
+      FASTLZ_BOUND_CHECK(ip + ctrl <= ip_limit);
+      fastlz_memcpy(op, ip, ctrl);
+      ip += ctrl;
+      op += ctrl;
+    }
+
+    if (FASTLZ_UNLIKELY(ip >= ip_limit)) break;
+    ctrl = *ip++;
+  }
+
+  return op - (uint8_t*)output;
+}
+
+int fastlz_compress(const void* input, int length, void* output) {
+  /* for short block, choose fastlz1 */
+  if (length < 65536) return fastlz1_compress(input, length, output);
+
+  /* else... */
+  return fastlz2_compress(input, length, output);
+}
+
+int fastlz_decompress(const void* input, int length, void* output, int maxout) {
+  /* magic identifier for compression level */
+  int level = ((*(const uint8_t*)input) >> 5) + 1;
+
+  if (level == 1) return fastlz1_decompress(input, length, output, maxout);
+  if (level == 2) return fastlz2_decompress(input, length, output, maxout);
+
+  /* unknown level, trigger error */
+  return 0;
+}
+
+int fastlz_compress_level(int level, const void* input, int length, void* output) {
+  if (level == 1) return fastlz1_compress(input, length, output);
+  if (level == 2) return fastlz2_compress(input, length, output);
+
+  return 0;
+}
+
+#pragma GCC diagnostic pop
diff --git a/op-e2e/fastlz/fastlz.go b/op-e2e/fastlz/fastlz.go
new file mode 100644
index 000000000000..fc0a43cf3af7
--- /dev/null
+++ b/op-e2e/fastlz/fastlz.go
@@ -0,0 +1,34 @@
+package fastlz
+
+// #include 
+// #include "fastlz.h"
+import "C"
+
+import (
+	"errors"
+	"runtime"
+	"unsafe"
+)
+
+// Compress compresses the input data using the FastLZ algorithm.
+// The version of FastLZ used is FastLZ level 1 with the implementation from
+// this commit: https://github.com/ariya/FastLZ/commit/344eb4025f9ae866ebf7a2ec48850f7113a97a42
+// Which is the same commit that Solady uses: https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol#L19
+// Note the FastLZ compression ratio does vary between different versions of the library.
+func Compress(input []byte) ([]byte, error) {
+	length := len(input)
+	if length == 0 {
+		return nil, errors.New("no input provided")
+	}
+
+	result := make([]byte, length*2)
+	size := C.fastlz_compress(unsafe.Pointer(&input[0]), C.int(length), unsafe.Pointer(&result[0]))
+
+	runtime.KeepAlive(input)
+
+	if size == 0 {
+		return nil, errors.New("error compressing data")
+	}
+
+	return result[:size], nil
+}
diff --git a/op-e2e/fastlz/fastlz.h b/op-e2e/fastlz/fastlz.h
new file mode 100644
index 000000000000..4754d647573a
--- /dev/null
+++ b/op-e2e/fastlz/fastlz.h
@@ -0,0 +1,100 @@
+/*
+  FastLZ - Byte-aligned LZ77 compression library
+  Copyright (C) 2005-2020 Ariya Hidayat 
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in
+  all copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  THE SOFTWARE.
+
+  This implementation is taken from the following repository/commit:
+  https://github.com/ariya/FastLZ/tree/344eb4025f9ae866ebf7a2ec48850f7113a97a42
+*/
+
+#ifndef FASTLZ_H
+#define FASTLZ_H
+
+#define FASTLZ_VERSION 0x000500
+
+#define FASTLZ_VERSION_MAJOR 0
+#define FASTLZ_VERSION_MINOR 5
+#define FASTLZ_VERSION_REVISION 0
+
+#define FASTLZ_VERSION_STRING "0.5.0"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/**
+  Compress a block of data in the input buffer and returns the size of
+  compressed block. The size of input buffer is specified by length. The
+  minimum input buffer size is 16.
+
+  The output buffer must be at least 5% larger than the input buffer
+  and can not be smaller than 66 bytes.
+
+  If the input is not compressible, the return value might be larger than
+  length (input buffer size).
+
+  The input buffer and the output buffer can not overlap.
+
+  Compression level can be specified in parameter level. At the moment,
+  only level 1 and level 2 are supported.
+  Level 1 is the fastest compression and generally useful for short data.
+  Level 2 is slightly slower but it gives better compression ratio.
+
+  Note that the compressed data, regardless of the level, can always be
+  decompressed using the function fastlz_decompress below.
+*/
+
+int fastlz_compress_level(int level, const void* input, int length, void* output);
+
+/**
+  Decompress a block of compressed data and returns the size of the
+  decompressed block. If error occurs, e.g. the compressed data is
+  corrupted or the output buffer is not large enough, then 0 (zero)
+  will be returned instead.
+
+  The input buffer and the output buffer can not overlap.
+
+  Decompression is memory safe and guaranteed not to write the output buffer
+  more than what is specified in maxout.
+
+  Note that the decompression will always work, regardless of the
+  compression level specified in fastlz_compress_level above (when
+  producing the compressed block).
+ */
+
+int fastlz_decompress(const void* input, int length, void* output, int maxout);
+
+/**
+  DEPRECATED.
+
+  This is similar to fastlz_compress_level above, but with the level
+  automatically chosen.
+
+  This function is deprecated and it will be completely removed in some future
+  version.
+*/
+
+int fastlz_compress(const void* input, int length, void* output);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* FASTLZ_H */
diff --git a/op-e2e/fastlz_test.go b/op-e2e/fastlz_test.go
new file mode 100644
index 000000000000..0435815b05bc
--- /dev/null
+++ b/op-e2e/fastlz_test.go
@@ -0,0 +1,235 @@
+package op_e2e
+
+import (
+	"context"
+	"encoding/binary"
+	"fmt"
+	"math/big"
+	"testing"
+	"time"
+
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
+	"github.com/ethereum-optimism/optimism/op-e2e/fastlz"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
+	"github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/ethclient/simulated"
+	"github.com/ethereum/go-ethereum/params"
+	"github.com/stretchr/testify/require"
+)
+
+var (
+	// This bytecode and ABI is for a contract, which wraps the LibZip library for easier fuzz testing.
+	// The source of this contract is here: https://github.com/danyalprout/fastlz/blob/main/src/FastLz.sol#L6-L10
+	contract = &bind.MetaData{
+		ABI: "[{\"type\":\"function\",\"name\":\"fastLz\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"}]",
+	}
+
+	fastLzBytecode = "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063920a769114610030575b600080fd5b61004361003e366004610374565b610055565b60405190815260200160405180910390f35b600061006082610067565b5192915050565b60606101e0565b818153600101919050565b600082840393505b838110156100a25782810151828201511860001a1590930292600101610081565b9392505050565b825b602082106100d75782516100c0601f8361006e565b5260209290920191601f19909101906021016100ab565b81156100a25782516100ec600184038361006e565b520160010192915050565b60006001830392505b61010782106101385761012a8360ff1661012560fd6101258760081c60e0018961006e565b61006e565b935061010682039150610100565b600782106101655761015e8360ff16610125600785036101258760081c60e0018961006e565b90506100a2565b61017e8360ff166101258560081c8560051b018761006e565b949350505050565b80516101d890838303906101bc90600081901a600182901a60081b1760029190911a60101b17639e3779b90260131c611fff1690565b8060021b6040510182815160e01c1860e01b8151188152505050565b600101919050565b5060405161800038823961800081016020830180600d8551820103826002015b81811015610313576000805b50508051604051600082901a600183901a60081b1760029290921a60101b91909117639e3779b9810260111c617ffc16909101805160e081811c878603811890911b9091189091528401908183039084841061026857506102a3565b600184019350611fff821161029d578251600081901a600182901a60081b1760029190911a60101b17810361029d57506102a3565b5061020c565b8383106102b1575050610313565b600183039250858311156102cf576102cc87878886036100a9565b96505b6102e3600985016003850160038501610079565b91506102f08782846100f7565b9650506103088461030386848601610186565b610186565b915050809350610200565b5050617fe061032884848589518601036100a9565b03925050506020820180820383525b81811161034e57617fe08101518152602001610337565b5060008152602001604052919050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561038657600080fd5b813567ffffffffffffffff8082111561039e57600080fd5b818401915084601f8301126103b257600080fd5b8135818111156103c4576103c461035e565b604051601f8201601f19908116603f011681019083821181831017156103ec576103ec61035e565b8160405282815287602084870101111561040557600080fd5b82602086016020830137600092810160200192909252509594505050505056fea264697066735822122000646b2953fc4a6f501bd0456ac52203089443937719e16b3190b7979c39511264736f6c63430008190033"
+
+	seeds = [][]byte{
+		// https: //basescan.org/tx/0x5dadeb52979f29fc7a7494c43fdabc5be1d8ff404f3aafe93d729fa8e5d00769
+		common.FromHex("0xb9047c02f904788221050883036ee48409c6c87383037f6f941195cf65f83b3a5768f3c496d3a05ad6412c64b78644364c5bb000b90404d123b4d80000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000f6476f90447748c19248ccaa31e6b8bfda4eb9d830f5f47df7f0998f7c2123d9e6137761b75d3184efb0f788e3b14516000000000000000000000000000000000000000000000000000044364c5bb000000000000000000000000000f38e53bd45c8225a7c94b513beadaa7afe5d222d0000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d6574614d61736b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d656852577a743347745961776343347564745657557233454c587261436746434259416b66507331696f48610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cd0d83d9e840f8e27d5c2e365fd365ff1c05b2480000000000000000000000000000000000000000000000000000000000000ce40000000000000000000000000000000000000000000000000000000000000041e4480d358dbae20880960a0a464d63b06565a0c9f9b1b37aa94b522247b23ce149c81359bf4239d1a879eeb41047ec710c15f5c0f67453da59a383e6abd742971c00000000000000000000000000000000000000000000000000000000000000c001a0b57f0ff8516ea29cb26a44ac5055a5420847d1e16a8e7b03b70f0c02291ff2d5a00ad3771e5f39ccacfff0faa8c5d25ef7a1c179f79e66e828ffddcb994c8b512e"),
+		// https://basescan.org/tx/0xfaada76a2dac09fc17f5a28d066aaabefc6d82ef6589b211ed8c9f766b070721
+		common.FromHex("b87602f873822105528304320f8409cfe5c98252089480c67432656d59144ceff962e8faf8926599bcf888011dfe52d06b633f80c001a08632f069f837aea7a28bab0affee14dda116956bd5a850a355c045d25afedd17a0084b8f273efffe17ece527116053e5781a4915ff89ab9c379f1e62c25b697687"),
+		// https://basescan.org/tx/0x112864e9b971af6a1dac840018833c5a5a659acc187cfdaba919ad1da013678d
+		common.FromHex("b8b302f8b0822105308304320f8409cfe5c9827496944ed4e862860bed51a9570b96d89af5e1b0efefed80b844095ea7b3000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba300000000000000000000000000000000000000000000015e10fb0973595fffffc001a02020e39f07917c1a852feb131c857e12478c7e88a20772b91a8bf5cee38c5aeea06055981727f9aaa3471c1af800555b35a77916c154be3f9d02ad1a63029455ab"),
+		// https://basescan.org/tx/0x6905051352691641888d0c427fb137c5b95afb5870d5169ff014eff1d0952195
+		common.FromHex("b87202f86f8221058303dc6c8310db1f84068fa8d7838954409436af2ff952a7355c8045fcd5e88bc9f6c8257f7b8080c001a0b89e7ff3d7694109e73e7f4244e032581670313c36e48e485c9c94b853bd81d2a038ffaf8f10859ce21d1f7f7046c3d08027fb8aa15b69038f6102be97aaa1179a"),
+		// https://basescan.org/tx/0x6a38e9a26d7202a2268de69d2d47531c1a9829867579a483fb48d78e9e0b080d
+		common.FromHex("b9049b02f904978221058201618506fc23ac008506fc23ac008306ddd0943fc91a3afd70395cd496c647d5a6cc9d4b2b7fad80b904243593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000006641d67b00000000000000000000000000000000000000000000000000000000000000030a000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000088487bd8c3222d64d1d0b3fa7098dcf9d94d79e000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000006669635d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fad000000000000000000000000000000000000000000000000000000006641d78900000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000418661369ca026f92ff88347bd0e3625a7b5ed65071b366368c68ad7c55aed136c18659b34f9246e30a784227a53dd374fbd3d2124696808c678cd987c4e954a681b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000549e5c020c764dbfffff00000000000000000000000000000000000000000000000002e5a629c093a2b600000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002b088487bd8c3222d64d1d0b3fa7098dcf9d94d79e0027104200000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000c001a014a3acef764ff6d3bb9bd81e420bfa94171a5734ab997dfbc9b41b653ce018a4a01ff5fccb01ef5c60ba3aef67d4e74f3f47312dd78bfbbff9e5090fbf2d3d62bb"),
+	}
+)
+
+type testStateGetter struct {
+	baseFee, blobBaseFee, overhead, scalar *big.Int
+	baseFeeScalar, blobBaseFeeScalar       uint32
+}
+
+func (sg *testStateGetter) GetState(addr common.Address, slot common.Hash) common.Hash {
+	buf := common.Hash{}
+	switch slot {
+	case types.L1BaseFeeSlot:
+		sg.baseFee.FillBytes(buf[:])
+	case types.OverheadSlot:
+		sg.overhead.FillBytes(buf[:])
+	case types.ScalarSlot:
+		sg.scalar.FillBytes(buf[:])
+	case types.L1BlobBaseFeeSlot:
+		sg.blobBaseFee.FillBytes(buf[:])
+	case types.L1FeeScalarsSlot:
+		// fetch Ecotone fee sclars
+		offset := 32 - types.BaseFeeScalarSlotOffset - 4 // todo maybe make scalarSelectSTartPublic
+		binary.BigEndian.PutUint32(buf[offset:offset+4], sg.baseFeeScalar)
+		binary.BigEndian.PutUint32(buf[offset+4:offset+8], sg.blobBaseFeeScalar)
+	default:
+		panic("unknown slot")
+	}
+	return buf
+}
+
+func FuzzFjordCostFunction(f *testing.F) {
+	for _, seed := range seeds {
+		f.Add(seed)
+	}
+
+	cfg := DefaultSystemConfig(f)
+	s := hexutil.Uint64(0)
+	cfg.DeployConfig.L2GenesisCanyonTimeOffset = &s
+	cfg.DeployConfig.L2GenesisDeltaTimeOffset = &s
+	cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &s
+	cfg.DeployConfig.L2GenesisFjordTimeOffset = &s
+
+	ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
+	defer cancel()
+
+	opGeth, err := NewOpGeth(f, ctx, &cfg)
+	require.NoError(f, err)
+	defer opGeth.Close()
+
+	gpoCaller, err := bindings.NewGasPriceOracleCaller(predeploys.GasPriceOracleAddr, opGeth.L2Client)
+	require.NoError(f, err)
+
+	isFjord, err := gpoCaller.IsFjord(&bind.CallOpts{})
+	require.NoError(f, err)
+	require.True(f, isFjord)
+
+	_, err = opGeth.AddL2Block(context.Background())
+	require.NoError(f, err)
+
+	baseFee, err := gpoCaller.L1BaseFee(&bind.CallOpts{})
+	require.NoError(f, err)
+	require.Greater(f, baseFee.Uint64(), uint64(0))
+
+	blobBaseFee, err := gpoCaller.BlobBaseFee(&bind.CallOpts{})
+	require.NoError(f, err)
+	require.Greater(f, blobBaseFee.Uint64(), uint64(0))
+
+	baseFeeScalar, err := gpoCaller.BaseFeeScalar(&bind.CallOpts{})
+	require.NoError(f, err)
+	require.Greater(f, baseFeeScalar, uint32(0))
+
+	blobBaseFeeScalar, err := gpoCaller.BlobBaseFeeScalar(&bind.CallOpts{})
+	require.NoError(f, err)
+	require.Equal(f, blobBaseFeeScalar, uint32(0))
+
+	// we can ignore the blobbasefee, as the scalar is set to zero.
+	feeScaled := big.NewInt(16)
+	feeScaled.Mul(feeScaled, baseFee)
+	feeScaled.Mul(feeScaled, big.NewInt(int64(baseFeeScalar)))
+
+	db := &testStateGetter{
+		baseFee:           baseFee,
+		blobBaseFee:       blobBaseFee,
+		overhead:          big.NewInt(0), // not used for fjord
+		scalar:            big.NewInt(0), // not used for fjord
+		baseFeeScalar:     baseFeeScalar,
+		blobBaseFeeScalar: blobBaseFeeScalar,
+	}
+
+	zeroTime := uint64(0)
+	// create a config where ecotone/fjord upgrades are active
+	config := ¶ms.ChainConfig{
+		Optimism:     params.OptimismTestConfig.Optimism,
+		RegolithTime: &zeroTime,
+		EcotoneTime:  &zeroTime,
+		FjordTime:    &zeroTime,
+	}
+	require.True(f, config.IsOptimismEcotone(zeroTime))
+	require.True(f, config.IsOptimismFjord(zeroTime))
+	costFunc := types.NewL1CostFunc(config, db)
+
+	f.Fuzz(func(t *testing.T, fuzzedData []byte) {
+		flzSize := types.FlzCompressLen(fuzzedData)
+
+		// Skip transactions that will be clamped to the minimum or less. These will fuzz to different values
+		// due to the solidity l1BlockGenesis adding 68 extra bytes to account for the signature.
+		estimatedSize := big.NewInt(int64(flzSize))
+		estimatedSize.Mul(estimatedSize, types.L1CostFastlzCoef)
+		estimatedSize.Add(estimatedSize, types.L1CostIntercept)
+
+		if estimatedSize.Cmp(types.MinTransactionSizeScaled) < 0 {
+			t.Skip()
+			return
+		}
+
+		l1FeeSolidity, err := gpoCaller.GetL1Fee(&bind.CallOpts{}, fuzzedData)
+		require.NoError(t, err)
+
+		// remove the adjustment
+		l1FeeSolidity.Mul(l1FeeSolidity, big.NewInt(1e12))
+		l1FeeSolidity.Div(l1FeeSolidity, feeScaled)
+
+		totalAdjustment := new(big.Int).Mul(big.NewInt(68), big.NewInt(836_500))
+		l1FeeSolidity.Sub(l1FeeSolidity, totalAdjustment)
+
+		l1FeeSolidity.Mul(l1FeeSolidity, feeScaled)
+		l1FeeSolidity.Div(l1FeeSolidity, big.NewInt(1e12))
+
+		costData := types.NewRollupCostData(fuzzedData)
+
+		l1FeeGeth := costFunc(costData, zeroTime)
+
+		require.Equal(t, l1FeeGeth.Uint64(), l1FeeSolidity.Uint64(), fmt.Sprintf("fuzzedData: %x", common.Bytes2Hex(fuzzedData)))
+	})
+}
+
+func FuzzFastLzGethSolidity(f *testing.F) {
+	for _, seed := range seeds {
+		f.Add(seed)
+	}
+
+	contractAbi, err := contract.GetAbi()
+	require.NoError(f, err)
+
+	b := simulated.NewBackend(map[common.Address]types.Account{
+		predeploys.GasPriceOracleAddr: {
+			Code: common.FromHex(fastLzBytecode),
+		},
+	})
+	defer func() {
+		require.NoError(f, b.Close())
+	}()
+
+	client := b.Client()
+
+	f.Fuzz(func(t *testing.T, data []byte) {
+		req, err := contractAbi.Pack("fastLz", data)
+		require.NoError(t, err)
+
+		response, err := client.CallContract(context.Background(), ethereum.CallMsg{
+			To:   &predeploys.GasPriceOracleAddr,
+			Data: req,
+		}, nil)
+		require.NoError(t, err)
+
+		result, err := contractAbi.Unpack("fastLz", response)
+		require.NoError(t, err)
+
+		gethCompressedLen := types.FlzCompressLen(data)
+		require.Equal(t, result[0].(*big.Int).Uint64(), uint64(gethCompressedLen))
+	})
+}
+
+func FuzzFastLzCgo(f *testing.F) {
+	for _, seed := range seeds {
+		f.Add(seed)
+	}
+
+	f.Fuzz(func(t *testing.T, data []byte) {
+		if len(data) == 0 {
+			t.Skip()
+			return
+		}
+
+		// Our implementation in go-ethereum
+		compressedLen := types.FlzCompressLen(data)
+
+		out, err := fastlz.Compress(data)
+		require.NoError(t, err)
+		require.Equal(t, int(compressedLen), len(out))
+	})
+}
diff --git a/op-e2e/faultproofs/challenge_preimage_test.go b/op-e2e/faultproofs/challenge_preimage_test.go
index f071580b51ae..226f85c825c1 100644
--- a/op-e2e/faultproofs/challenge_preimage_test.go
+++ b/op-e2e/faultproofs/challenge_preimage_test.go
@@ -15,12 +15,12 @@ import (
 func TestChallengeLargePreimages_ChallengeFirst(t *testing.T) {
 	op_e2e.InitParallel(t)
 	ctx := context.Background()
-	sys, _ := startFaultDisputeSystem(t)
+	sys, _ := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
 	disputeGameFactory.StartChallenger(ctx, "Challenger",
-		challenger.WithAlphabet(sys.RollupEndpoint("sequencer")),
+		challenger.WithAlphabet(),
 		challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 	preimageHelper := disputeGameFactory.PreimageHelper(ctx)
 	ident := preimageHelper.UploadLargePreimage(ctx, preimage.MinPreimageSize,
@@ -34,11 +34,11 @@ func TestChallengeLargePreimages_ChallengeFirst(t *testing.T) {
 func TestChallengeLargePreimages_ChallengeMiddle(t *testing.T) {
 	op_e2e.InitParallel(t)
 	ctx := context.Background()
-	sys, _ := startFaultDisputeSystem(t)
+	sys, _ := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
 	disputeGameFactory.StartChallenger(ctx, "Challenger",
-		challenger.WithAlphabet(sys.RollupEndpoint("sequencer")),
+		challenger.WithAlphabet(),
 		challenger.WithPrivKey(sys.Cfg.Secrets.Mallory))
 	preimageHelper := disputeGameFactory.PreimageHelper(ctx)
 	ident := preimageHelper.UploadLargePreimage(ctx, preimage.MinPreimageSize,
@@ -52,11 +52,11 @@ func TestChallengeLargePreimages_ChallengeMiddle(t *testing.T) {
 func TestChallengeLargePreimages_ChallengeLast(t *testing.T) {
 	op_e2e.InitParallel(t)
 	ctx := context.Background()
-	sys, _ := startFaultDisputeSystem(t)
+	sys, _ := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
 	disputeGameFactory.StartChallenger(ctx, "Challenger",
-		challenger.WithAlphabet(sys.RollupEndpoint("sequencer")),
+		challenger.WithAlphabet(),
 		challenger.WithPrivKey(sys.Cfg.Secrets.Mallory))
 	preimageHelper := disputeGameFactory.PreimageHelper(ctx)
 	ident := preimageHelper.UploadLargePreimage(ctx, preimage.MinPreimageSize,
diff --git a/op-e2e/faultproofs/multi_test.go b/op-e2e/faultproofs/multi_test.go
index 0db4167cf492..8073c3e7596b 100644
--- a/op-e2e/faultproofs/multi_test.go
+++ b/op-e2e/faultproofs/multi_test.go
@@ -14,7 +14,7 @@ func TestMultipleGameTypes(t *testing.T) {
 	op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 	ctx := context.Background()
-	sys, _ := startFaultDisputeSystem(t)
+	sys, _ := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	gameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -26,8 +26,8 @@ func TestMultipleGameTypes(t *testing.T) {
 
 	// Start a challenger with both cannon and alphabet support
 	gameFactory.StartChallenger(ctx, "TowerDefense",
-		challenger.WithCannon(t, sys.RollupConfig, sys.L2GenesisCfg, sys.RollupEndpoint("sequencer"), sys.NodeEndpoint("sequencer")),
-		challenger.WithAlphabet(sys.RollupEndpoint("sequencer")),
+		challenger.WithCannon(t, sys.RollupConfig, sys.L2GenesisCfg),
+		challenger.WithAlphabet(),
 		challenger.WithPrivKey(sys.Cfg.Secrets.Alice),
 	)
 
diff --git a/op-e2e/faultproofs/output_alphabet_test.go b/op-e2e/faultproofs/output_alphabet_test.go
index e87049b9c2e9..3e46c732edb3 100644
--- a/op-e2e/faultproofs/output_alphabet_test.go
+++ b/op-e2e/faultproofs/output_alphabet_test.go
@@ -6,7 +6,7 @@ import (
 	"testing"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-chain-ops/deployer"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	op_e2e "github.com/ethereum-optimism/optimism/op-e2e"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/disputegame"
@@ -19,7 +19,7 @@ import (
 func TestOutputAlphabetGame_ChallengerWins(t *testing.T) {
 	op_e2e.InitParallel(t)
 	ctx := context.Background()
-	sys, l1Client := startFaultDisputeSystem(t)
+	sys, l1Client := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -67,16 +67,16 @@ func TestOutputAlphabetGame_ChallengerWins(t *testing.T) {
 	claim.WaitForCountered(ctx)
 	game.LogGameData(ctx)
 
-	sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
-	game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins)
+	game.WaitForGameStatus(ctx, types.GameStatusChallengerWon)
 	game.LogGameData(ctx)
 }
 
 func TestOutputAlphabetGame_ReclaimBond(t *testing.T) {
 	op_e2e.InitParallel(t)
 	ctx := context.Background()
-	sys, l1Client := startFaultDisputeSystem(t)
+	sys, l1Client := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -84,7 +84,7 @@ func TestOutputAlphabetGame_ReclaimBond(t *testing.T) {
 	game.LogGameData(ctx)
 
 	// The dispute game should have a zero balance
-	balance := game.WethBalance(ctx, game.Addr())
+	balance := game.WethBalance(ctx, game.Addr)
 	require.Zero(t, balance.Uint64())
 
 	alice := sys.Cfg.Secrets.Addresses().Alice
@@ -106,12 +106,12 @@ func TestOutputAlphabetGame_ReclaimBond(t *testing.T) {
 	_ = claim.WaitForCounterClaim(ctx)
 
 	// Expect posted claims so the game balance is non-zero
-	balance = game.WethBalance(ctx, game.Addr())
+	balance = game.WethBalance(ctx, game.Addr)
 	require.Truef(t, balance.Cmp(big.NewInt(0)) > 0, "Expected game balance to be above zero")
 
-	sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
-	game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins)
+	game.WaitForGameStatus(ctx, types.GameStatusChallengerWon)
 	game.LogGameData(ctx)
 
 	// Expect Alice's credit to be non-zero
@@ -119,7 +119,7 @@ func TestOutputAlphabetGame_ReclaimBond(t *testing.T) {
 	require.Truef(t, game.AvailableCredit(ctx, alice).Cmp(big.NewInt(0)) > 0, "Expected alice credit to be above zero")
 
 	// The actor should have no credit available because all its bonds were paid to Alice.
-	actorCredit := game.AvailableCredit(ctx, deployer.TestAddress)
+	actorCredit := game.AvailableCredit(ctx, disputegame.TestAddress)
 	require.True(t, actorCredit.Cmp(big.NewInt(0)) == 0, "Expected alice available credit to be zero")
 
 	// Advance the time past the weth unlock delay
@@ -131,13 +131,13 @@ func TestOutputAlphabetGame_ReclaimBond(t *testing.T) {
 	game.WaitForNoAvailableCredit(ctx, alice)
 
 	// The dispute game delayed weth balance should be zero since it's all claimed
-	require.True(t, game.WethBalance(ctx, game.Addr()).Cmp(big.NewInt(0)) == 0)
+	require.True(t, game.WethBalance(ctx, game.Addr).Cmp(big.NewInt(0)) == 0)
 }
 
 func TestOutputAlphabetGame_ValidOutputRoot(t *testing.T) {
 	op_e2e.InitParallel(t)
 	ctx := context.Background()
-	sys, l1Client := startFaultDisputeSystem(t)
+	sys, l1Client := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -160,9 +160,9 @@ func TestOutputAlphabetGame_ValidOutputRoot(t *testing.T) {
 		game.LogGameData(ctx)
 	}
 
-	sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
-	game.WaitForGameStatus(ctx, disputegame.StatusDefenderWins)
+	game.WaitForGameStatus(ctx, types.GameStatusDefenderWon)
 }
 
 func TestChallengerCompleteExhaustiveDisputeGame(t *testing.T) {
@@ -170,7 +170,7 @@ func TestChallengerCompleteExhaustiveDisputeGame(t *testing.T) {
 
 	testCase := func(t *testing.T, isRootCorrect bool) {
 		ctx := context.Background()
-		sys, l1Client := startFaultDisputeSystem(t)
+		sys, l1Client := StartFaultDisputeSystem(t)
 		t.Cleanup(sys.Close)
 
 		disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -186,7 +186,7 @@ func TestChallengerCompleteExhaustiveDisputeGame(t *testing.T) {
 
 		// Start honest challenger
 		game.StartChallenger(ctx, "sequencer", "Challenger",
-			challenger.WithAlphabet(sys.RollupEndpoint("sequencer")),
+			challenger.WithAlphabet(),
 			challenger.WithPrivKey(sys.Cfg.Secrets.Alice),
 			// Ensures the challenger responds to all claims before test timeout
 			challenger.WithPollInterval(time.Millisecond*400),
@@ -210,13 +210,13 @@ func TestChallengerCompleteExhaustiveDisputeGame(t *testing.T) {
 		// Wait for 4 blocks of no challenger responses. The challenger may still be stepping on invalid claims at max depth
 		game.WaitForInactivity(ctx, 4, false)
 
-		gameDuration := game.GameDuration(ctx)
+		gameDuration := game.MaxClockDuration(ctx)
 		sys.TimeTravelClock.AdvanceTime(gameDuration)
 		require.NoError(t, wait.ForNextBlock(ctx, l1Client))
 
-		expectedStatus := disputegame.StatusChallengerWins
+		expectedStatus := types.GameStatusChallengerWon
 		if isRootCorrect {
-			expectedStatus = disputegame.StatusDefenderWins
+			expectedStatus = types.GameStatusDefenderWon
 		}
 		game.WaitForGameStatus(ctx, expectedStatus)
 		game.LogGameData(ctx)
@@ -235,7 +235,7 @@ func TestChallengerCompleteExhaustiveDisputeGame(t *testing.T) {
 func TestOutputAlphabetGame_FreeloaderEarnsNothing(t *testing.T) {
 	op_e2e.InitParallel(t)
 	ctx := context.Background()
-	sys, l1Client := startFaultDisputeSystem(t)
+	sys, l1Client := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	freeloaderOpts, err := bind.NewKeyedTransactorWithChainID(sys.Cfg.Secrets.Mallory, sys.Cfg.L1ChainIDBig())
@@ -287,10 +287,35 @@ func TestOutputAlphabetGame_FreeloaderEarnsNothing(t *testing.T) {
 	}
 
 	game.LogGameData(ctx)
-	sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
-	game.WaitForGameStatus(ctx, disputegame.StatusDefenderWins)
+	game.WaitForGameStatus(ctx, types.GameStatusDefenderWon)
 
+	game.LogGameData(ctx)
 	amt := game.Credit(ctx, freeloaderOpts.From)
-	require.True(t, amt.BitLen() == 0, "freeloaders should not be rewarded")
+	require.Truef(t, amt.BitLen() == 0, "freeloaders should not be rewarded. Credit: %v", amt)
+}
+
+func TestHighestActedL1BlockMetric(t *testing.T) {
+	op_e2e.InitParallel(t)
+	ctx := context.Background()
+	sys, l1Client := StartFaultDisputeSystem(t)
+	t.Cleanup(sys.Close)
+
+	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
+	honestChallenger := disputeGameFactory.StartChallenger(ctx, "Honest", challenger.WithAlphabet(), challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
+
+	game1 := disputeGameFactory.StartOutputAlphabetGame(ctx, "sequencer", 1, common.Hash{0xaa})
+	sys.AdvanceTime(game1.MaxClockDuration(ctx))
+	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
+
+	game1.WaitForGameStatus(ctx, types.GameStatusDefenderWon)
+
+	disputeGameFactory.StartOutputAlphabetGame(ctx, "sequencer", 2, common.Hash{0xaa})
+	disputeGameFactory.StartOutputAlphabetGame(ctx, "sequencer", 3, common.Hash{0xaa})
+
+	honestChallenger.WaitL1HeadActedOn(ctx, l1Client)
+
+	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
+	honestChallenger.WaitL1HeadActedOn(ctx, l1Client)
 }
diff --git a/op-e2e/faultproofs/output_cannon_test.go b/op-e2e/faultproofs/output_cannon_test.go
index 6aed7c041e34..11a9e9ecdbfb 100644
--- a/op-e2e/faultproofs/output_cannon_test.go
+++ b/op-e2e/faultproofs/output_cannon_test.go
@@ -6,8 +6,9 @@ import (
 	"math/big"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/cannon"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
+	gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types"
 	op_e2e "github.com/ethereum-optimism/optimism/op-e2e"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/disputegame"
@@ -21,14 +22,14 @@ import (
 func TestOutputCannonGame(t *testing.T) {
 	op_e2e.InitParallel(t, op_e2e.UsesCannon)
 	ctx := context.Background()
-	sys, l1Client := startFaultDisputeSystem(t)
+	sys, l1Client := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
 	game := disputeGameFactory.StartOutputCannonGame(ctx, "sequencer", 4, common.Hash{0x01})
 	game.LogGameData(ctx)
 
-	game.StartChallenger(ctx, "sequencer", "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
+	game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 	game.LogGameData(ctx)
 
@@ -68,16 +69,16 @@ func TestOutputCannonGame(t *testing.T) {
 	claim.WaitForCountered(ctx)
 	game.LogGameData(ctx)
 
-	sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
-	game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins)
+	game.WaitForGameStatus(ctx, gameTypes.GameStatusChallengerWon)
 }
 
 func TestOutputCannon_ChallengeAllZeroClaim(t *testing.T) {
 	// The dishonest actor always posts claims with all zeros.
 	op_e2e.InitParallel(t, op_e2e.UsesCannon)
 	ctx := context.Background()
-	sys, l1Client := startFaultDisputeSystem(t)
+	sys, l1Client := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -85,7 +86,7 @@ func TestOutputCannon_ChallengeAllZeroClaim(t *testing.T) {
 	game.LogGameData(ctx)
 
 	claim := game.DisputeLastBlock(ctx)
-	game.StartChallenger(ctx, "sequencer", "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
+	game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 	game.DefendClaim(ctx, claim, func(parent *disputegame.ClaimHelper) *disputegame.ClaimHelper {
 		if parent.IsBottomGameRoot(ctx) {
@@ -96,9 +97,9 @@ func TestOutputCannon_ChallengeAllZeroClaim(t *testing.T) {
 
 	game.LogGameData(ctx)
 
-	sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
-	game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins)
+	game.WaitForGameStatus(ctx, gameTypes.GameStatusChallengerWon)
 	game.LogGameData(ctx)
 }
 
@@ -116,14 +117,14 @@ func TestOutputCannon_PublishCannonRootClaim(t *testing.T) {
 			op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 			ctx := context.Background()
-			sys, _ := startFaultDisputeSystem(t)
+			sys, _ := StartFaultDisputeSystem(t)
 
 			disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
 			game := disputeGameFactory.StartOutputCannonGame(ctx, "sequencer", test.disputeL2BlockNumber, common.Hash{0x01})
 			game.DisputeLastBlock(ctx)
 			game.LogGameData(ctx)
 
-			game.StartChallenger(ctx, "sequencer", "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
+			game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 			splitDepth := game.SplitDepth(ctx)
 			game.WaitForClaimAtDepth(ctx, splitDepth+1)
@@ -147,7 +148,7 @@ func TestOutputCannonDisputeGame(t *testing.T) {
 			op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 			ctx := context.Background()
-			sys, l1Client := startFaultDisputeSystem(t)
+			sys, l1Client := StartFaultDisputeSystem(t)
 			t.Cleanup(sys.Close)
 
 			disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -158,7 +159,7 @@ func TestOutputCannonDisputeGame(t *testing.T) {
 			outputClaim := game.DisputeLastBlock(ctx)
 			splitDepth := game.SplitDepth(ctx)
 
-			game.StartChallenger(ctx, "sequencer", "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
+			game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 			game.DefendClaim(
 				ctx,
@@ -171,11 +172,11 @@ func TestOutputCannonDisputeGame(t *testing.T) {
 					}
 				})
 
-			sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+			sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 			require.NoError(t, wait.ForNextBlock(ctx, l1Client))
 
 			game.LogGameData(ctx)
-			game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins)
+			game.WaitForGameStatus(ctx, gameTypes.GameStatusChallengerWon)
 		})
 	}
 }
@@ -184,7 +185,7 @@ func TestOutputCannonDefendStep(t *testing.T) {
 	op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 	ctx := context.Background()
-	sys, l1Client := startFaultDisputeSystem(t)
+	sys, l1Client := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -193,7 +194,7 @@ func TestOutputCannonDefendStep(t *testing.T) {
 	outputRootClaim := game.DisputeLastBlock(ctx)
 	game.LogGameData(ctx)
 
-	game.StartChallenger(ctx, "sequencer", "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
+	game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 	correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Mallory))
 
@@ -208,19 +209,19 @@ func TestOutputCannonDefendStep(t *testing.T) {
 		}
 	})
 
-	sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
 
 	game.WaitForInactivity(ctx, 10, true)
 	game.LogGameData(ctx)
-	require.EqualValues(t, disputegame.StatusChallengerWins, game.Status(ctx))
+	require.EqualValues(t, gameTypes.GameStatusChallengerWon, game.Status(ctx))
 }
 
 func TestOutputCannonStepWithLargePreimage(t *testing.T) {
 	op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 	ctx := context.Background()
-	sys, _ := startFaultDisputeSystem(t, withBatcherStopped())
+	sys, _ := StartFaultDisputeSystem(t, WithBatcherStopped())
 	t.Cleanup(sys.Close)
 
 	// Manually send a tx from the correct batcher key to the batcher input with very large (invalid) data
@@ -240,7 +241,7 @@ func TestOutputCannonStepWithLargePreimage(t *testing.T) {
 	outputRootClaim := game.DisputeBlock(ctx, l2BlockNumber)
 	game.LogGameData(ctx)
 
-	game.StartChallenger(ctx, "sequencer", "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
+	game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 	// Wait for the honest challenger to dispute the outputRootClaim.
 	// This creates a root of an execution game that we challenge by
@@ -252,18 +253,18 @@ func TestOutputCannonStepWithLargePreimage(t *testing.T) {
 	// execution game. We then move to challenge it to induce a large preimage load.
 	sender := sys.Cfg.Secrets.Addresses().Alice
 	preimageLoadCheck := game.CreateStepLargePreimageLoadCheck(ctx, sender)
-	game.ChallengeToPreimageLoad(ctx, outputRootClaim, sys.Cfg.Secrets.Alice, cannon.PreimageLargerThan(preimage.MinPreimageSize), preimageLoadCheck, false)
+	game.ChallengeToPreimageLoad(ctx, outputRootClaim, sys.Cfg.Secrets.Alice, utils.PreimageLargerThan(preimage.MinPreimageSize), preimageLoadCheck, false)
 	// The above method already verified the image was uploaded and step called successfully
 	// So we don't waste time resolving the game - that's tested elsewhere.
 }
 
 func TestOutputCannonStepWithPreimage(t *testing.T) {
 	op_e2e.InitParallel(t, op_e2e.UsesCannon)
-	testPreimageStep := func(t *testing.T, preimageType cannon.PreimageOpt, preloadPreimage bool) {
+	testPreimageStep := func(t *testing.T, preimageType utils.PreimageOpt, preloadPreimage bool) {
 		op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 		ctx := context.Background()
-		sys, _ := startFaultDisputeSystem(t, withBlobBatches())
+		sys, _ := StartFaultDisputeSystem(t, WithBlobBatches())
 		t.Cleanup(sys.Close)
 
 		disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -272,7 +273,7 @@ func TestOutputCannonStepWithPreimage(t *testing.T) {
 		outputRootClaim := game.DisputeLastBlock(ctx)
 		game.LogGameData(ctx)
 
-		game.StartChallenger(ctx, "sequencer", "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
+		game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 		// Wait for the honest challenger to dispute the outputRootClaim. This creates a root of an execution game that we challenge by coercing
 		// a step at a preimage trace index.
@@ -290,12 +291,12 @@ func TestOutputCannonStepWithPreimage(t *testing.T) {
 	for _, preimageType := range preimageConditions {
 		preimageType := preimageType
 		t.Run("non-existing preimage-"+preimageType, func(t *testing.T) {
-			testPreimageStep(t, cannon.FirstPreimageLoadOfType(preimageType), false)
+			testPreimageStep(t, utils.FirstPreimageLoadOfType(preimageType), false)
 		})
 	}
 	// Only test pre-existing images with one type to save runtime
 	t.Run("preimage already exists", func(t *testing.T) {
-		testPreimageStep(t, cannon.FirstKeccakPreimageLoad(), true)
+		testPreimageStep(t, utils.FirstKeccakPreimageLoad(), true)
 	})
 }
 
@@ -306,7 +307,7 @@ func TestOutputCannonStepWithKZGPointEvaluation(t *testing.T) {
 		op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 		ctx := context.Background()
-		sys, _ := startFaultDisputeSystem(t, withEcotone())
+		sys, _ := StartFaultDisputeSystem(t, WithEcotone())
 		t.Cleanup(sys.Close)
 
 		// NOTE: Flake prevention
@@ -315,7 +316,7 @@ func TestOutputCannonStepWithKZGPointEvaluation(t *testing.T) {
 		require.NoError(t, err)
 		require.NoError(t, wait.ForSafeBlock(ctx, sys.RollupClient("sequencer"), safeBlock.NumberU64()+3))
 
-		receipt := sendKZGPointEvaluationTx(t, sys, "sequencer", sys.Cfg.Secrets.Alice)
+		receipt := SendKZGPointEvaluationTx(t, sys, "sequencer", sys.Cfg.Secrets.Alice)
 		precompileBlock := receipt.BlockNumber
 		t.Logf("KZG Point Evaluation block number: %d", precompileBlock)
 
@@ -325,7 +326,7 @@ func TestOutputCannonStepWithKZGPointEvaluation(t *testing.T) {
 		outputRootClaim := game.DisputeLastBlock(ctx)
 		game.LogGameData(ctx)
 
-		game.StartChallenger(ctx, "sequencer", "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
+		game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 		// Wait for the honest challenger to dispute the outputRootClaim. This creates a root of an execution game that we challenge by coercing
 		// a step at a preimage trace index.
@@ -334,7 +335,7 @@ func TestOutputCannonStepWithKZGPointEvaluation(t *testing.T) {
 		// Now the honest challenger is positioned as the defender of the execution game
 		// We then move to challenge it to induce a preimage load
 		preimageLoadCheck := game.CreateStepPreimageLoadCheck(ctx)
-		game.ChallengeToPreimageLoad(ctx, outputRootClaim, sys.Cfg.Secrets.Alice, cannon.FirstPrecompilePreimageLoad(), preimageLoadCheck, preloadPreimage)
+		game.ChallengeToPreimageLoad(ctx, outputRootClaim, sys.Cfg.Secrets.Alice, utils.FirstPrecompilePreimageLoad(), preimageLoadCheck, preloadPreimage)
 		// The above method already verified the image was uploaded and step called successfully
 		// So we don't waste time resolving the game - that's tested elsewhere.
 	}
@@ -406,14 +407,14 @@ func TestOutputCannonProposedOutputRootValid(t *testing.T) {
 			op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 			ctx := context.Background()
-			sys, l1Client := startFaultDisputeSystem(t)
+			sys, l1Client := StartFaultDisputeSystem(t)
 			t.Cleanup(sys.Close)
 
 			disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
 			game := disputeGameFactory.StartOutputCannonGameWithCorrectRoot(ctx, "sequencer", 1)
 			correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Mallory))
 
-			game.StartChallenger(ctx, "sequencer", "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
+			game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 			// Now maliciously play the game and it should be impossible to win
 			game.ChallengeClaim(ctx,
@@ -426,12 +427,12 @@ func TestOutputCannonProposedOutputRootValid(t *testing.T) {
 				})
 
 			// Time travel past when the game will be resolvable.
-			sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+			sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 			require.NoError(t, wait.ForNextBlock(ctx, l1Client))
 
 			game.WaitForInactivity(ctx, 10, true)
 			game.LogGameData(ctx)
-			require.EqualValues(t, disputegame.StatusDefenderWins, game.Status(ctx))
+			require.EqualValues(t, gameTypes.GameStatusDefenderWon, game.Status(ctx))
 		})
 	}
 }
@@ -440,7 +441,7 @@ func TestOutputCannonPoisonedPostState(t *testing.T) {
 	op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 	ctx := context.Background()
-	sys, l1Client := startFaultDisputeSystem(t)
+	sys, l1Client := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -462,7 +463,7 @@ func TestOutputCannonPoisonedPostState(t *testing.T) {
 	game.LogGameData(ctx)
 
 	// Start the honest challenger
-	game.StartChallenger(ctx, "sequencer", "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
+	game.StartChallenger(ctx, "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
 
 	// Start dishonest challenger that posts correct claims
 	for {
@@ -493,18 +494,18 @@ func TestOutputCannonPoisonedPostState(t *testing.T) {
 	claimToIgnore2.RequireOnlyCounteredBy(ctx /* nothing */)
 
 	// Time travel past when the game will be resolvable.
-	sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
 
 	game.LogGameData(ctx)
-	game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins)
+	game.WaitForGameStatus(ctx, gameTypes.GameStatusChallengerWon)
 }
 
 func TestDisputeOutputRootBeyondProposedBlock_ValidOutputRoot(t *testing.T) {
 	op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 	ctx := context.Background()
-	sys, l1Client := startFaultDisputeSystem(t)
+	sys, l1Client := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -512,7 +513,7 @@ func TestDisputeOutputRootBeyondProposedBlock_ValidOutputRoot(t *testing.T) {
 	game := disputeGameFactory.StartOutputCannonGameWithCorrectRoot(ctx, "sequencer", 1)
 	correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 	// Start the honest challenger
-	game.StartChallenger(ctx, "sequencer", "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
+	game.StartChallenger(ctx, "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
 
 	claim := game.RootClaim(ctx)
 	// Attack the output root
@@ -543,10 +544,10 @@ func TestDisputeOutputRootBeyondProposedBlock_ValidOutputRoot(t *testing.T) {
 	correctTrace.StepClaimFails(ctx, claim, false)
 
 	// Time travel past when the game will be resolvable.
-	sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
 
-	game.WaitForGameStatus(ctx, disputegame.StatusDefenderWins)
+	game.WaitForGameStatus(ctx, gameTypes.GameStatusDefenderWon)
 	game.LogGameData(ctx)
 }
 
@@ -554,7 +555,7 @@ func TestDisputeOutputRootBeyondProposedBlock_InvalidOutputRoot(t *testing.T) {
 	op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 	ctx := context.Background()
-	sys, l1Client := startFaultDisputeSystem(t)
+	sys, l1Client := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -563,7 +564,7 @@ func TestDisputeOutputRootBeyondProposedBlock_InvalidOutputRoot(t *testing.T) {
 	correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 	// Start the honest challenger
-	game.StartChallenger(ctx, "sequencer", "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
+	game.StartChallenger(ctx, "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
 
 	claim := game.RootClaim(ctx)
 	// Wait for the honest challenger to counter the root
@@ -594,10 +595,10 @@ func TestDisputeOutputRootBeyondProposedBlock_InvalidOutputRoot(t *testing.T) {
 	claim.WaitForCountered(ctx)
 
 	// Time travel past when the game will be resolvable.
-	sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
 
-	game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins)
+	game.WaitForGameStatus(ctx, gameTypes.GameStatusChallengerWon)
 	game.LogGameData(ctx)
 }
 
@@ -605,7 +606,7 @@ func TestDisputeOutputRoot_ChangeClaimedOutputRoot(t *testing.T) {
 	op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 	ctx := context.Background()
-	sys, l1Client := startFaultDisputeSystem(t)
+	sys, l1Client := StartFaultDisputeSystem(t)
 	t.Cleanup(sys.Close)
 
 	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
@@ -614,7 +615,7 @@ func TestDisputeOutputRoot_ChangeClaimedOutputRoot(t *testing.T) {
 	correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 	// Start the honest challenger
-	game.StartChallenger(ctx, "sequencer", "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
+	game.StartChallenger(ctx, "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
 
 	claim := game.RootClaim(ctx)
 	// Wait for the honest challenger to counter the root
@@ -654,10 +655,10 @@ func TestDisputeOutputRoot_ChangeClaimedOutputRoot(t *testing.T) {
 	claim.WaitForCountered(ctx)
 
 	// Time travel past when the game will be resolvable.
-	sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
 
-	game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins)
+	game.WaitForGameStatus(ctx, gameTypes.GameStatusChallengerWon)
 	game.LogGameData(ctx)
 }
 
@@ -693,7 +694,7 @@ func TestInvalidateUnsafeProposal(t *testing.T) {
 		test := test
 		t.Run(test.name, func(t *testing.T) {
 			op_e2e.InitParallel(t, op_e2e.UsesCannon)
-			sys, l1Client := startFaultDisputeSystem(t, withSequencerWindowSize(100000), withBatcherStopped())
+			sys, l1Client := StartFaultDisputeSystem(t, WithSequencerWindowSize(100000), WithBatcherStopped())
 			t.Cleanup(sys.Close)
 
 			blockNum := uint64(1)
@@ -704,7 +705,7 @@ func TestInvalidateUnsafeProposal(t *testing.T) {
 			correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 			// Start the honest challenger
-			game.StartChallenger(ctx, "sequencer", "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
+			game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
 
 			game.DefendClaim(ctx, game.RootClaim(ctx), func(parent *disputegame.ClaimHelper) *disputegame.ClaimHelper {
 				if parent.IsBottomGameRoot(ctx) {
@@ -714,10 +715,10 @@ func TestInvalidateUnsafeProposal(t *testing.T) {
 			})
 
 			// Time travel past when the game will be resolvable.
-			sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+			sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 			require.NoError(t, wait.ForNextBlock(ctx, l1Client))
 
-			game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins)
+			game.WaitForGameStatus(ctx, gameTypes.GameStatusChallengerWon)
 			game.LogGameData(ctx)
 		})
 	}
@@ -755,7 +756,7 @@ func TestInvalidateProposalForFutureBlock(t *testing.T) {
 		test := test
 		t.Run(test.name, func(t *testing.T) {
 			op_e2e.InitParallel(t, op_e2e.UsesCannon)
-			sys, l1Client := startFaultDisputeSystem(t, withSequencerWindowSize(100000))
+			sys, l1Client := StartFaultDisputeSystem(t, WithSequencerWindowSize(100000))
 			t.Cleanup(sys.Close)
 
 			farFutureBlockNum := uint64(10_000_000)
@@ -766,7 +767,7 @@ func TestInvalidateProposalForFutureBlock(t *testing.T) {
 			correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Alice))
 
 			// Start the honest challenger
-			game.StartChallenger(ctx, "sequencer", "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
+			game.StartChallenger(ctx, "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
 
 			game.DefendClaim(ctx, game.RootClaim(ctx), func(parent *disputegame.ClaimHelper) *disputegame.ClaimHelper {
 				if parent.IsBottomGameRoot(ctx) {
@@ -776,11 +777,43 @@ func TestInvalidateProposalForFutureBlock(t *testing.T) {
 			})
 
 			// Time travel past when the game will be resolvable.
-			sys.TimeTravelClock.AdvanceTime(game.GameDuration(ctx))
+			sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
 			require.NoError(t, wait.ForNextBlock(ctx, l1Client))
 
-			game.WaitForGameStatus(ctx, disputegame.StatusChallengerWins)
+			game.WaitForGameStatus(ctx, gameTypes.GameStatusChallengerWon)
 			game.LogGameData(ctx)
 		})
 	}
 }
+
+func TestInvalidateCorrectProposalFutureBlock(t *testing.T) {
+	op_e2e.InitParallel(t, op_e2e.UsesCannon)
+	ctx := context.Background()
+	// Spin up the system without the batcher so the safe head doesn't advance
+	sys, l1Client := StartFaultDisputeSystem(t, WithBatcherStopped(), WithSequencerWindowSize(100000))
+	t.Cleanup(sys.Close)
+
+	// Create a dispute game factory helper.
+	disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
+
+	// No batches submitted so safe head is genesis
+	output, err := sys.RollupClient("sequencer").OutputAtBlock(ctx, 0)
+	require.NoError(t, err, "Failed to get output at safe head")
+	// Create a dispute game with an output root that is valid at `safeHead`, but that claims to correspond to block
+	// `safeHead.Number + 10000`. This is dishonest, because this block does not exist yet.
+	game := disputeGameFactory.StartOutputCannonGame(ctx, "sequencer", 10_000, common.Hash(output.OutputRoot), disputegame.WithFutureProposal())
+
+	// Start the honest challenger.
+	game.StartChallenger(ctx, "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob))
+
+	game.WaitForL2BlockNumberChallenged(ctx)
+
+	// Time travel past when the game will be resolvable.
+	sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx))
+	require.NoError(t, wait.ForNextBlock(ctx, l1Client))
+
+	// The game should resolve as `CHALLENGER_WINS` always, because the root claim signifies a claim that does not exist
+	// yet in the L2 chain.
+	game.WaitForGameStatus(ctx, gameTypes.GameStatusChallengerWon)
+	game.LogGameData(ctx)
+}
diff --git a/op-e2e/faultproofs/precompile_test.go b/op-e2e/faultproofs/precompile_test.go
index 388fc6aeba52..dbd09e49e69e 100644
--- a/op-e2e/faultproofs/precompile_test.go
+++ b/op-e2e/faultproofs/precompile_test.go
@@ -11,6 +11,7 @@ import (
 	"github.com/ethereum-optimism/optimism/cannon/mipsevm"
 	"github.com/ethereum-optimism/optimism/op-challenger/config"
 	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/cannon"
+	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils"
 	"github.com/ethereum-optimism/optimism/op-challenger/metrics"
 	op_e2e "github.com/ethereum-optimism/optimism/op-e2e"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
@@ -122,7 +123,7 @@ func TestPrecompiles(t *testing.T) {
 			require.NoError(t, err, "get l1 head block")
 			l1Head := l1HeadBlock.Hash()
 
-			inputs := cannon.LocalGameInputs{
+			inputs := utils.LocalGameInputs{
 				L1Head:        l1Head,
 				L2Head:        l2Head,
 				L2Claim:       common.Hash(l2Claim),
@@ -134,17 +135,19 @@ func TestPrecompiles(t *testing.T) {
 	}
 }
 
-func runCannon(t *testing.T, ctx context.Context, sys *op_e2e.System, inputs cannon.LocalGameInputs, l2Node string) {
+func runCannon(t *testing.T, ctx context.Context, sys *op_e2e.System, inputs utils.LocalGameInputs, l2Node string) {
 	l1Endpoint := sys.NodeEndpoint("l1")
 	l1Beacon := sys.L1BeaconEndpoint()
-	cannonOpts := challenger.WithCannon(t, sys.RollupCfg(), sys.L2Genesis(), sys.RollupEndpoint(l2Node), sys.NodeEndpoint(l2Node))
+	rollupEndpoint := sys.RollupEndpoint("sequencer")
+	l2Endpoint := sys.NodeEndpoint("sequencer")
+	cannonOpts := challenger.WithCannon(t, sys.RollupCfg(), sys.L2Genesis())
 	dir := t.TempDir()
 	proofsDir := filepath.Join(dir, "cannon-proofs")
-	cfg := config.NewConfig(common.Address{}, l1Endpoint, l1Beacon, dir)
+	cfg := config.NewConfig(common.Address{}, l1Endpoint, l1Beacon, rollupEndpoint, l2Endpoint, dir)
 	cannonOpts(&cfg)
 
 	logger := testlog.Logger(t, log.LevelInfo).New("role", "cannon")
-	executor := cannon.NewExecutor(logger, metrics.NoopMetrics, &cfg, inputs)
+	executor := cannon.NewExecutor(logger, metrics.NoopMetrics, &cfg, cfg.CannonAbsolutePreState, inputs)
 
 	t.Log("Running cannon")
 	err := executor.GenerateProof(ctx, proofsDir, math.MaxUint)
diff --git a/op-e2e/faultproofs/preimages_test.go b/op-e2e/faultproofs/preimages_test.go
index fd6032b83fa1..03acf824daf3 100644
--- a/op-e2e/faultproofs/preimages_test.go
+++ b/op-e2e/faultproofs/preimages_test.go
@@ -32,7 +32,7 @@ func TestLocalPreimages(t *testing.T) {
 			op_e2e.InitParallel(t, op_e2e.UsesCannon)
 
 			ctx := context.Background()
-			sys, _ := startFaultDisputeSystem(t)
+			sys, _ := StartFaultDisputeSystem(t)
 			t.Cleanup(sys.Close)
 
 			disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys)
diff --git a/op-e2e/faultproofs/util.go b/op-e2e/faultproofs/util.go
index 804c8f307a02..025f9be80385 100644
--- a/op-e2e/faultproofs/util.go
+++ b/op-e2e/faultproofs/util.go
@@ -15,13 +15,13 @@ import (
 
 type faultDisputeConfigOpts func(cfg *op_e2e.SystemConfig)
 
-func withBatcherStopped() faultDisputeConfigOpts {
+func WithBatcherStopped() faultDisputeConfigOpts {
 	return func(cfg *op_e2e.SystemConfig) {
 		cfg.DisableBatcher = true
 	}
 }
 
-func withBlobBatches() faultDisputeConfigOpts {
+func WithBlobBatches() faultDisputeConfigOpts {
 	return func(cfg *op_e2e.SystemConfig) {
 		cfg.DataAvailabilityType = batcherFlags.BlobsType
 
@@ -32,7 +32,7 @@ func withBlobBatches() faultDisputeConfigOpts {
 	}
 }
 
-func withEcotone() faultDisputeConfigOpts {
+func WithEcotone() faultDisputeConfigOpts {
 	return func(cfg *op_e2e.SystemConfig) {
 		genesisActivation := hexutil.Uint64(0)
 		cfg.DeployConfig.L1CancunTimeOffset = &genesisActivation
@@ -41,30 +41,30 @@ func withEcotone() faultDisputeConfigOpts {
 	}
 }
 
-func withSequencerWindowSize(size uint64) faultDisputeConfigOpts {
+func WithSequencerWindowSize(size uint64) faultDisputeConfigOpts {
 	return func(cfg *op_e2e.SystemConfig) {
 		cfg.DeployConfig.SequencerWindowSize = size
 	}
 }
 
-func startFaultDisputeSystem(t *testing.T, opts ...faultDisputeConfigOpts) (*op_e2e.System, *ethclient.Client) {
+func StartFaultDisputeSystem(t *testing.T, opts ...faultDisputeConfigOpts) (*op_e2e.System, *ethclient.Client) {
 	cfg := op_e2e.DefaultSystemConfig(t)
 	delete(cfg.Nodes, "verifier")
-	for _, opt := range opts {
-		opt(&cfg)
-	}
 	cfg.Nodes["sequencer"].SafeDBPath = t.TempDir()
 	cfg.DeployConfig.SequencerWindowSize = 4
 	cfg.DeployConfig.FinalizationPeriodSeconds = 2
 	cfg.SupportL1TimeTravel = true
 	cfg.DeployConfig.L2OutputOracleSubmissionInterval = 1
 	cfg.NonFinalizedProposals = true // Submit output proposals asap
+	for _, opt := range opts {
+		opt(&cfg)
+	}
 	sys, err := cfg.Start(t)
 	require.Nil(t, err, "Error starting up system")
 	return sys, sys.Clients["l1"]
 }
 
-func sendKZGPointEvaluationTx(t *testing.T, sys *op_e2e.System, l2Node string, privateKey *ecdsa.PrivateKey) *types.Receipt {
+func SendKZGPointEvaluationTx(t *testing.T, sys *op_e2e.System, l2Node string, privateKey *ecdsa.PrivateKey) *types.Receipt {
 	return op_e2e.SendL2Tx(t, sys.Cfg, sys.Clients[l2Node], privateKey, func(opts *op_e2e.TxOpts) {
 		precompile := common.BytesToAddress([]byte{0x0a})
 		opts.Gas = 100_000
diff --git a/op-e2e/l1_beacon_client_test.go b/op-e2e/l1_beacon_client_test.go
index 09cdd4c592d2..93094d4884e7 100644
--- a/op-e2e/l1_beacon_client_test.go
+++ b/op-e2e/l1_beacon_client_test.go
@@ -6,8 +6,10 @@ import (
 
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/fakebeacon"
 	"github.com/ethereum-optimism/optimism/op-service/client"
+	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/sources"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
+	"github.com/ethereum/go-ethereum"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
 )
@@ -30,3 +32,22 @@ func TestGetVersion(t *testing.T) {
 	require.NoError(t, err)
 	require.Equal(t, "fakebeacon 1.2.3", version)
 }
+
+func Test404NotFound(t *testing.T) {
+	InitParallel(t)
+
+	l := testlog.Logger(t, log.LevelInfo)
+
+	beaconApi := fakebeacon.NewBeacon(l, t.TempDir(), uint64(0), uint64(12))
+	t.Cleanup(func() {
+		_ = beaconApi.Close()
+	})
+	require.NoError(t, beaconApi.Start("127.0.0.1:0"))
+
+	beaconCfg := sources.L1BeaconClientConfig{FetchAllSidecars: false}
+	cl := sources.NewL1BeaconClient(sources.NewBeaconHTTPClient(client.NewBasicHTTPClient(beaconApi.BeaconAddr(), l)), beaconCfg)
+
+	hashes := []eth.IndexedBlobHash{{Index: 1}}
+	_, err := cl.GetBlobs(context.Background(), eth.L1BlockRef{Number: 10, Time: 120}, hashes)
+	require.ErrorIs(t, err, ethereum.NotFound)
+}
diff --git a/op-e2e/op_geth.go b/op-e2e/op_geth.go
index 4afe487bffd1..7cea17d43a42 100644
--- a/op-e2e/op_geth.go
+++ b/op-e2e/op_geth.go
@@ -51,14 +51,22 @@ type OpGeth struct {
 	lgr           log.Logger
 }
 
-func NewOpGeth(t *testing.T, ctx context.Context, cfg *SystemConfig) (*OpGeth, error) {
+func NewOpGeth(t testing.TB, ctx context.Context, cfg *SystemConfig) (*OpGeth, error) {
 	logger := testlog.Logger(t, log.LevelCrit)
 
 	l1Genesis, err := genesis.BuildL1DeveloperGenesis(cfg.DeployConfig, config.L1Allocs, config.L1Deployments)
 	require.Nil(t, err)
 	l1Block := l1Genesis.ToBlock()
 
-	l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l1Block)
+	var allocsMode genesis.L2AllocsMode
+	allocsMode = genesis.L2AllocsDelta
+	if fjordTime := cfg.DeployConfig.FjordTime(l1Block.Time()); fjordTime != nil && *fjordTime <= 0 {
+		allocsMode = genesis.L2AllocsFjord
+	} else if ecotoneTime := cfg.DeployConfig.EcotoneTime(l1Block.Time()); ecotoneTime != nil && *ecotoneTime <= 0 {
+		allocsMode = genesis.L2AllocsEcotone
+	}
+	l2Allocs := config.L2Allocs(allocsMode)
+	l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, l1Block)
 	require.Nil(t, err)
 	l2GenesisBlock := l2Genesis.ToBlock()
 
diff --git a/op-e2e/op_geth_test.go b/op-e2e/op_geth_test.go
index 03a1f8c4234e..90b117084ce7 100644
--- a/op-e2e/op_geth_test.go
+++ b/op-e2e/op_geth_test.go
@@ -22,11 +22,18 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
+var (
+	rip7212Precompile = common.HexToAddress("0x0000000000000000000000000000000000000100")
+	invalid7212Data   = []byte{0x00}
+	// This is a valid hash, r, s, x, y params for RIP-7212 taken from:
+	// https://gist.github.com/ulerdogan/8f1714895e23a54147fc529ea30517eb
+	valid7212Data = common.FromHex("4cee90eb86eaa050036147a12d49004b6b9c72bd725d39d4785011fe190f0b4da73bd4903f0ce3b639bbbf6e8e80d16931ff4bcf5993d58468e8fb19086e8cac36dbcd03009df8c59286b162af3bd7fcc0450c9aa81be5d10d312af6c66b1d604aebd3099c618202fcfe16ae7770b0c49ab5eadf74b754204a3bb6060e44eff37618b065f9832de4ca6ca971a7a1adc826d0f7c00181a5fb2ddf79ae00b4e10e")
+)
+
 // TestMissingGasLimit tests that op-geth cannot build a block without gas limit while optimism is active in the chain config.
 func TestMissingGasLimit(t *testing.T) {
 	InitParallel(t)
 	cfg := DefaultSystemConfig(t)
-	cfg.DeployConfig.FundDevAccounts = false
 	ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
 	defer cancel()
 	opGeth, err := NewOpGeth(t, ctx, &cfg)
@@ -72,17 +79,19 @@ func TestTxGasSameAsBlockGasLimit(t *testing.T) {
 func TestInvalidDepositInFCU(t *testing.T) {
 	InitParallel(t)
 	cfg := DefaultSystemConfig(t)
-	cfg.DeployConfig.FundDevAccounts = false
 	ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
 	defer cancel()
 	opGeth, err := NewOpGeth(t, ctx, &cfg)
 	require.NoError(t, err)
 	defer opGeth.Close()
 
-	// Create a deposit from alice that will always fail (not enough funds)
-	fromAddr := cfg.Secrets.Addresses().Alice
+	// Create a deposit from a new account that will always fail (not enough funds)
+	fromKey, err := crypto.GenerateKey()
+	require.NoError(t, err)
+	fromAddr := crypto.PubkeyToAddress(fromKey.PublicKey)
 	balance, err := opGeth.L2Client.BalanceAt(ctx, fromAddr, nil)
 	require.Nil(t, err)
+	t.Logf("alice balance: %d, %s", balance, fromAddr)
 	require.Equal(t, 0, balance.Cmp(common.Big0))
 
 	badDepositTx := types.NewTx(&types.DepositTx{
@@ -98,7 +107,7 @@ func TestInvalidDepositInFCU(t *testing.T) {
 	_, err = opGeth.AddL2Block(ctx, badDepositTx)
 	require.NoError(t, err)
 
-	// Deposit tx was included, but Alice still shouldn't have any ETH
+	// Deposit tx was included, but our account still shouldn't have any ETH
 	balance, err = opGeth.L2Client.BalanceAt(ctx, fromAddr, nil)
 	require.Nil(t, err)
 	require.Equal(t, 0, balance.Cmp(common.Big0))
@@ -1014,3 +1023,108 @@ func TestEcotone(t *testing.T) {
 		})
 	}
 }
+
+func TestPreFjord(t *testing.T) {
+	futureTimestamp := hexutil.Uint64(4)
+
+	tests := []struct {
+		name      string
+		fjordTime *hexutil.Uint64
+	}{
+		{name: "FjordNotScheduled"},
+		{name: "FjordNotYetActive", fjordTime: &futureTimestamp},
+	}
+	for _, test := range tests {
+		test := test
+
+		t.Run(fmt.Sprintf("RIP7212_%s", test.name), func(t *testing.T) {
+			InitParallel(t)
+			cfg := DefaultSystemConfig(t)
+			s := hexutil.Uint64(0)
+			cfg.DeployConfig.L2GenesisCanyonTimeOffset = &s
+			cfg.DeployConfig.L2GenesisDeltaTimeOffset = &s
+			cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &s
+			cfg.DeployConfig.L2GenesisFjordTimeOffset = test.fjordTime
+
+			ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
+			defer cancel()
+
+			opGeth, err := NewOpGeth(t, ctx, &cfg)
+			require.NoError(t, err)
+			defer opGeth.Close()
+
+			// valid request pre-fjord returns empty response
+			response, err := opGeth.L2Client.CallContract(ctx, ethereum.CallMsg{
+				To:   &rip7212Precompile,
+				Data: valid7212Data,
+			}, nil)
+
+			require.NoError(t, err)
+			require.Equal(t, []byte{}, response, "should return empty response pre-fjord for valid signature")
+
+			// invalid request returns returns empty response
+			response, err = opGeth.L2Client.CallContract(ctx, ethereum.CallMsg{
+				To:   &rip7212Precompile,
+				Data: invalid7212Data,
+			}, nil)
+
+			require.NoError(t, err)
+			require.Equal(t, []byte{}, response, "should return empty response for invalid signature")
+		})
+	}
+}
+
+func TestFjord(t *testing.T) {
+	tests := []struct {
+		name          string
+		fjordTime     hexutil.Uint64
+		activateFjord func(ctx context.Context, opGeth *OpGeth)
+	}{
+		{name: "ActivateAtGenesis", fjordTime: 0, activateFjord: func(ctx context.Context, opGeth *OpGeth) {}},
+		{name: "ActivateAfterGenesis", fjordTime: 2, activateFjord: func(ctx context.Context, opGeth *OpGeth) {
+			//	Adding this block advances us to the fork time.
+			_, err := opGeth.AddL2Block(ctx)
+			require.NoError(t, err)
+		}},
+	}
+
+	for _, test := range tests {
+		test := test
+		t.Run(fmt.Sprintf("RIP7212_%s", test.name), func(t *testing.T) {
+			InitParallel(t)
+			cfg := DefaultSystemConfig(t)
+			s := hexutil.Uint64(0)
+			cfg.DeployConfig.L2GenesisCanyonTimeOffset = &s
+			cfg.DeployConfig.L2GenesisDeltaTimeOffset = &s
+			cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &s
+			cfg.DeployConfig.L2GenesisFjordTimeOffset = &test.fjordTime
+
+			ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
+			defer cancel()
+
+			opGeth, err := NewOpGeth(t, ctx, &cfg)
+			require.NoError(t, err)
+			defer opGeth.Close()
+
+			test.activateFjord(ctx, opGeth)
+
+			// valid request returns one
+			response, err := opGeth.L2Client.CallContract(ctx, ethereum.CallMsg{
+				To:   &rip7212Precompile,
+				Data: valid7212Data,
+			}, nil)
+
+			require.NoError(t, err)
+			require.Equal(t, common.LeftPadBytes([]byte{1}, 32), response, "should return 1 for valid signature")
+
+			// invalid request returns empty response, this is how the spec denotes an error.
+			response, err = opGeth.L2Client.CallContract(ctx, ethereum.CallMsg{
+				To:   &rip7212Precompile,
+				Data: invalid7212Data,
+			}, nil)
+
+			require.NoError(t, err)
+			require.Equal(t, []byte{}, response, "should return empty response for invalid signature")
+		})
+	}
+}
diff --git a/op-e2e/sequencer_failover_setup.go b/op-e2e/sequencer_failover_setup.go
index 9ef01a20ab55..5ef5635f467d 100644
--- a/op-e2e/sequencer_failover_setup.go
+++ b/op-e2e/sequencer_failover_setup.go
@@ -15,7 +15,6 @@ import (
 	"github.com/stretchr/testify/require"
 
 	bss "github.com/ethereum-optimism/optimism/op-batcher/batcher"
-	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
 	batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags"
 	con "github.com/ethereum-optimism/optimism/op-conductor/conductor"
 	conrpc "github.com/ethereum-optimism/optimism/op-conductor/rpc"
@@ -26,6 +25,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-node/rollup/driver"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/sync"
 	oplog "github.com/ethereum-optimism/optimism/op-service/log"
+	"github.com/ethereum-optimism/optimism/op-service/retry"
 	oprpc "github.com/ethereum-optimism/optimism/op-service/rpc"
 	"github.com/ethereum-optimism/optimism/op-service/sources"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
@@ -38,8 +38,12 @@ const (
 	VerifierName   = "verifier"
 
 	localhost = "127.0.0.1"
+
+	maxSetupRetries = 5
 )
 
+var retryStrategy = &retry.FixedStrategy{Dur: 50 * time.Millisecond}
+
 type conductor struct {
 	service       *con.OpConductor
 	client        conrpc.API
@@ -55,40 +59,14 @@ func (c *conductor) RPCEndpoint() string {
 	return fmt.Sprintf("http://%s:%d", localhost, c.rpcPort)
 }
 
-func setupSequencerFailoverTest(t *testing.T) (*System, map[string]*conductor) {
+func setupSequencerFailoverTest(t *testing.T) (*System, map[string]*conductor, func()) {
 	InitParallel(t)
 	ctx := context.Background()
 
-	conductorRpcPorts := map[string]int{
-		Sequencer1Name: findAvailablePort(t),
-		Sequencer2Name: findAvailablePort(t),
-		Sequencer3Name: findAvailablePort(t),
-	}
-
-	// 3 sequencers, 1 verifier, 1 active sequencer.
-	cfg := sequencerFailoverSystemConfig(t, conductorRpcPorts)
-	sys, err := cfg.Start(t)
-	require.NoError(t, err)
-
-	// 3 conductors that connects to 1 sequencer each.
-	conductors := make(map[string]*conductor)
-
-	// initialize all conductors in paused mode
-	conductorCfgs := []struct {
-		name      string
-		port      int
-		bootstrap bool
-	}{
-		{Sequencer1Name, conductorRpcPorts[Sequencer1Name], true}, // one in bootstrap mode so that we can form a cluster.
-		{Sequencer2Name, conductorRpcPorts[Sequencer2Name], false},
-		{Sequencer3Name, conductorRpcPorts[Sequencer3Name], false},
-	}
-	for _, cfg := range conductorCfgs {
-		cfg := cfg
-		nodePRC := sys.RollupNodes[cfg.name].HTTPEndpoint()
-		engineRPC := sys.EthInstances[cfg.name].HTTPEndpoint()
-		conductors[cfg.name] = setupConductor(t, cfg.name, t.TempDir(), nodePRC, engineRPC, cfg.port, cfg.bootstrap, *sys.RollupConfig)
-	}
+	sys, conductors, err := retry.Do2(ctx, maxSetupRetries, retryStrategy, func() (*System, map[string]*conductor, error) {
+		return setupHAInfra(t, ctx)
+	})
+	require.NoError(t, err, "Expected to successfully setup sequencers and conductors after retry")
 
 	// form a cluster
 	c1 := conductors[Sequencer1Name]
@@ -125,7 +103,7 @@ func setupSequencerFailoverTest(t *testing.T) (*System, map[string]*conductor) {
 		return healthy(t, ctx, c1) &&
 			healthy(t, ctx, c2) &&
 			healthy(t, ctx, c3)
-	}, 30*time.Second, 500*time.Millisecond, "Expected sequencers to become healthy")
+	}, 50*time.Second, 500*time.Millisecond, "Expected sequencers to become healthy")
 
 	// unpause all conductors
 	require.NoError(t, c1.client.Resume(ctx))
@@ -133,6 +111,12 @@ func setupSequencerFailoverTest(t *testing.T) (*System, map[string]*conductor) {
 	require.NoError(t, c3.client.Resume(ctx))
 
 	// final check, make sure everything is in the right place
+	require.True(t, conductorResumed(t, ctx, c1))
+	require.True(t, conductorResumed(t, ctx, c2))
+	require.True(t, conductorResumed(t, ctx, c3))
+	require.False(t, conductorStopped(t, ctx, c1))
+	require.False(t, conductorStopped(t, ctx, c2))
+	require.False(t, conductorStopped(t, ctx, c3))
 	require.True(t, conductorActive(t, ctx, c1))
 	require.True(t, conductorActive(t, ctx, c2))
 	require.True(t, conductorActive(t, ctx, c3))
@@ -145,7 +129,74 @@ func setupSequencerFailoverTest(t *testing.T) (*System, map[string]*conductor) {
 	require.True(t, healthy(t, ctx, c2))
 	require.True(t, healthy(t, ctx, c3))
 
-	return sys, conductors
+	return sys, conductors, func() {
+		sys.Close()
+		for _, c := range conductors {
+			_ = c.service.Stop(ctx)
+		}
+	}
+}
+
+func setupHAInfra(t *testing.T, ctx context.Context) (*System, map[string]*conductor, error) {
+	startTime := time.Now()
+
+	var sys *System
+	var conductors map[string]*conductor
+	var err error
+
+	// clean up if setup fails due to port in use.
+	defer func() {
+		if err != nil {
+			if sys != nil {
+				sys.Close()
+			}
+
+			for _, c := range conductors {
+				if c == nil || c.service == nil {
+					// pass. Sometimes we can get nil in this map
+				} else if serr := c.service.Stop(ctx); serr != nil {
+					t.Log("Failed to stop conductor", "error", serr)
+				}
+			}
+		}
+		t.Logf("setupHAInfra took %s\n", time.Since(startTime))
+	}()
+
+	conductorRpcPorts := map[string]int{
+		Sequencer1Name: findAvailablePort(t),
+		Sequencer2Name: findAvailablePort(t),
+		Sequencer3Name: findAvailablePort(t),
+	}
+
+	// 3 sequencers, 1 verifier, 1 active sequencer.
+	cfg := sequencerFailoverSystemConfig(t, conductorRpcPorts)
+	if sys, err = cfg.Start(t); err != nil {
+		return nil, nil, err
+	}
+
+	// 3 conductors that connects to 1 sequencer each.
+	conductors = make(map[string]*conductor)
+
+	// initialize all conductors in paused mode
+	conductorCfgs := []struct {
+		name      string
+		port      int
+		bootstrap bool
+	}{
+		{Sequencer1Name, conductorRpcPorts[Sequencer1Name], true}, // one in bootstrap mode so that we can form a cluster.
+		{Sequencer2Name, conductorRpcPorts[Sequencer2Name], false},
+		{Sequencer3Name, conductorRpcPorts[Sequencer3Name], false},
+	}
+	for _, cfg := range conductorCfgs {
+		cfg := cfg
+		nodePRC := sys.RollupNodes[cfg.name].HTTPEndpoint()
+		engineRPC := sys.EthInstances[cfg.name].HTTPEndpoint()
+		if conductors[cfg.name], err = setupConductor(t, cfg.name, t.TempDir(), nodePRC, engineRPC, cfg.port, cfg.bootstrap, *sys.RollupConfig); err != nil {
+			return nil, nil, err
+		}
+	}
+
+	return sys, conductors, nil
 }
 
 func setupConductor(
@@ -154,9 +205,7 @@ func setupConductor(
 	rpcPort int,
 	bootstrap bool,
 	rollupCfg rollup.Config,
-) *conductor {
-	// it's unfortunate that it is not possible to pass 0 as consensus port and get back the actual assigned port from raft implementation.
-	// So we find an available port and pass it in to avoid test flakiness (avoid port already in use error).
+) (*conductor, error) {
 	consensusPort := findAvailablePort(t)
 	cfg := con.Config{
 		ConsensusAddr:  localhost,
@@ -190,12 +239,19 @@ func setupConductor(
 
 	ctx := context.Background()
 	service, err := con.New(ctx, &cfg, testlog.Logger(t, log.LevelInfo), "0.0.1")
-	require.NoError(t, err)
+	if err != nil {
+		return nil, err
+	}
+
 	err = service.Start(ctx)
-	require.NoError(t, err)
+	if err != nil {
+		return nil, err
+	}
 
 	rawClient, err := rpc.DialContext(ctx, service.HTTPEndpoint())
-	require.NoError(t, err)
+	if err != nil {
+		return nil, err
+	}
 	client := conrpc.NewAPIClient(rawClient)
 
 	return &conductor{
@@ -203,7 +259,7 @@ func setupConductor(
 		client:        client,
 		consensusPort: consensusPort,
 		rpcPort:       rpcPort,
-	}
+	}, nil
 }
 
 func setupBatcher(t *testing.T, sys *System, conductors map[string]*conductor) {
@@ -226,15 +282,12 @@ func setupBatcher(t *testing.T, sys *System, conductors map[string]*conductor) {
 		RollupRpc:              rollupRpc,
 		MaxPendingTransactions: 0,
 		MaxChannelDuration:     1,
-		MaxL1TxSize:            240_000,
-		CompressorConfig: compressor.CLIConfig{
-			TargetL1TxSizeBytes: sys.Cfg.BatcherTargetL1TxSizeBytes,
-			TargetNumFrames:     1,
-			ApproxComprRatio:    0.4,
-		},
-		SubSafetyMargin: 4,
-		PollInterval:    1 * time.Second,
-		TxMgrConfig:     newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), sys.Cfg.Secrets.Batcher),
+		MaxL1TxSize:            120_000,
+		TargetNumFrames:        1,
+		ApproxComprRatio:       0.4,
+		SubSafetyMargin:        4,
+		PollInterval:           1 * time.Second,
+		TxMgrConfig:            newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), sys.Cfg.Secrets.Batcher),
 		LogConfig: oplog.CLIConfig{
 			Level:  log.LevelDebug,
 			Format: oplog.FormatText,
@@ -243,6 +296,7 @@ func setupBatcher(t *testing.T, sys *System, conductors map[string]*conductor) {
 		BatchType:                    derive.SpanBatchType,
 		DataAvailabilityType:         batcherFlags.CalldataType,
 		ActiveSequencerCheckDuration: 0,
+		CompressionAlgo:              derive.Zlib,
 	}
 
 	batcher, err := bss.BatcherServiceFromCLIConfig(context.Background(), "0.0.1", batcherCLIConfig, sys.Cfg.Loggers["batcher"])
@@ -371,6 +425,18 @@ func conductorActive(t *testing.T, ctx context.Context, con *conductor) bool {
 	return active
 }
 
+func conductorResumed(t *testing.T, ctx context.Context, con *conductor) bool {
+	paused, err := con.client.Paused(ctx)
+	require.NoError(t, err)
+	return !paused
+}
+
+func conductorStopped(t *testing.T, ctx context.Context, con *conductor) bool {
+	stopped, err := con.client.Stopped(ctx)
+	require.NoError(t, err)
+	return stopped
+}
+
 func sequencerActive(t *testing.T, ctx context.Context, rollupClient *sources.RollupClient) bool {
 	active, err := rollupClient.SequencerActive(ctx)
 	require.NoError(t, err)
diff --git a/op-e2e/sequencer_failover_test.go b/op-e2e/sequencer_failover_test.go
index a07266e533dc..6d98dc2af973 100644
--- a/op-e2e/sequencer_failover_test.go
+++ b/op-e2e/sequencer_failover_test.go
@@ -8,13 +8,14 @@ import (
 	"github.com/stretchr/testify/require"
 
 	"github.com/ethereum-optimism/optimism/op-conductor/consensus"
+	"github.com/ethereum-optimism/optimism/op-service/retry"
 )
 
 // [Category: Initial Setup]
 // In this test, we test that we can successfully setup a working cluster.
 func TestSequencerFailover_SetupCluster(t *testing.T) {
-	sys, conductors := setupSequencerFailoverTest(t)
-	defer sys.Close()
+	_, conductors, cleanup := setupSequencerFailoverTest(t)
+	defer cleanup()
 
 	require.Equal(t, 3, len(conductors), "Expected 3 conductors")
 	for _, con := range conductors {
@@ -26,8 +27,8 @@ func TestSequencerFailover_SetupCluster(t *testing.T) {
 // In this test, we test all rpcs exposed by conductor.
 func TestSequencerFailover_ConductorRPC(t *testing.T) {
 	ctx := context.Background()
-	sys, conductors := setupSequencerFailoverTest(t)
-	defer sys.Close()
+	sys, conductors, cleanup := setupSequencerFailoverTest(t)
+	defer cleanup()
 
 	// SequencerHealthy, Leader, AddServerAsVoter are used in setup already.
 
@@ -95,14 +96,21 @@ func TestSequencerFailover_ConductorRPC(t *testing.T) {
 	// Test AddServerAsNonvoter, do not start a new sequencer just for this purpose, use Sequencer3's rpc to start conductor.
 	// This is fine as this mainly tests conductor's ability to add itself into the raft consensus cluster as a nonvoter.
 	t.Log("Testing AddServerAsNonvoter")
-	nonvoter := setupConductor(
-		t, VerifierName, t.TempDir(),
-		sys.RollupEndpoint(Sequencer3Name),
-		sys.NodeEndpoint(Sequencer3Name),
-		findAvailablePort(t),
-		false,
-		*sys.RollupConfig,
-	)
+	nonvoter, err := retry.Do[*conductor](ctx, maxSetupRetries, retryStrategy, func() (*conductor, error) {
+		return setupConductor(
+			t, VerifierName, t.TempDir(),
+			sys.RollupEndpoint(Sequencer3Name),
+			sys.NodeEndpoint(Sequencer3Name),
+			findAvailablePort(t),
+			false,
+			*sys.RollupConfig,
+		)
+	})
+	require.NoError(t, err)
+	defer func() {
+		err = nonvoter.service.Stop(ctx)
+		require.NoError(t, err)
+	}()
 
 	err = leader.client.AddServerAsNonvoter(ctx, VerifierName, nonvoter.ConsensusEndpoint())
 	require.NoError(t, err, "Expected leader to add non-voter")
@@ -140,8 +148,8 @@ func TestSequencerFailover_ConductorRPC(t *testing.T) {
 // [Category: Sequencer Failover]
 // Test that the sequencer can successfully failover to a new sequencer once the active sequencer goes down.
 func TestSequencerFailover_ActiveSequencerDown(t *testing.T) {
-	sys, conductors := setupSequencerFailoverTest(t)
-	defer sys.Close()
+	sys, conductors, cleanup := setupSequencerFailoverTest(t)
+	defer cleanup()
 
 	ctx := context.Background()
 	leaderId, leader := findLeader(t, conductors)
diff --git a/op-e2e/setup.go b/op-e2e/setup.go
index 07242a3a216c..984b27a9edfe 100644
--- a/op-e2e/setup.go
+++ b/op-e2e/setup.go
@@ -31,6 +31,7 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/core"
+	"github.com/ethereum/go-ethereum/core/types"
 	geth_eth "github.com/ethereum/go-ethereum/eth"
 	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/ethereum/go-ethereum/log"
@@ -39,9 +40,7 @@ import (
 	"github.com/ethereum/go-ethereum/rpc"
 
 	bss "github.com/ethereum-optimism/optimism/op-batcher/batcher"
-	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
 	batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
 	"github.com/ethereum-optimism/optimism/op-e2e/config"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
@@ -63,6 +62,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/dial"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	oplog "github.com/ethereum-optimism/optimism/op-service/log"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum-optimism/optimism/op-service/sources"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum-optimism/optimism/op-service/txmgr"
@@ -84,7 +84,7 @@ func newTxMgrConfig(l1Addr string, privKey *ecdsa.PrivateKey) txmgr.CLIConfig {
 	}
 }
 
-func DefaultSystemConfig(t *testing.T) SystemConfig {
+func DefaultSystemConfig(t testing.TB) SystemConfig {
 	config.ExternalL2TestParms.SkipIfNecessary(t)
 
 	secrets, err := e2eutils.DefaultMnemonicConfig.Secrets()
@@ -151,17 +151,17 @@ func DefaultSystemConfig(t *testing.T) SystemConfig {
 			"batcher":   testlog.Logger(t, log.LevelInfo).New("role", "batcher"),
 			"proposer":  testlog.Logger(t, log.LevelCrit).New("role", "proposer"),
 		},
-		GethOptions:                map[string][]geth.GethOption{},
-		P2PTopology:                nil, // no P2P connectivity by default
-		NonFinalizedProposals:      false,
-		ExternalL2Shim:             config.ExternalL2Shim,
-		BatcherTargetL1TxSizeBytes: 100_000,
-		DataAvailabilityType:       batcherFlags.CalldataType,
-		MaxPendingTransactions:     1,
+		GethOptions:            map[string][]geth.GethOption{},
+		P2PTopology:            nil, // no P2P connectivity by default
+		NonFinalizedProposals:  false,
+		ExternalL2Shim:         config.ExternalL2Shim,
+		DataAvailabilityType:   batcherFlags.CalldataType,
+		MaxPendingTransactions: 1,
+		BatcherTargetNumFrames: 1,
 	}
 }
 
-func writeDefaultJWT(t *testing.T) string {
+func writeDefaultJWT(t testing.TB) string {
 	// Sadly the geth node config cannot load JWT secret from memory, it has to be a file
 	jwtPath := path.Join(t.TempDir(), "jwt_secret")
 	if err := os.WriteFile(jwtPath, []byte(hexutil.Encode(testingJWTSecret[:])), 0o600); err != nil {
@@ -213,16 +213,13 @@ type SystemConfig struct {
 	// Configure data-availability type that is used by the batcher.
 	DataAvailabilityType batcherFlags.DataAvailabilityType
 
-	// Target L1 tx size for the batcher transactions
-	BatcherTargetL1TxSizeBytes uint64
-
 	// Max L1 tx size for the batcher transactions
 	BatcherMaxL1TxSizeBytes uint64
 
 	// Target number of frames to create per channel. Can be used to create
 	// multi-blob transactions.
 	// Default is 1 if unset.
-	BatcherTargetNumFrames uint64
+	BatcherTargetNumFrames int
 
 	// whether to actually use BatcherMaxL1TxSizeBytes for blobs, insteaf of max blob size
 	BatcherUseMaxTxSizeForBlobs bool
@@ -468,14 +465,14 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste
 
 	for addr, amount := range cfg.Premine {
 		if existing, ok := l1Genesis.Alloc[addr]; ok {
-			l1Genesis.Alloc[addr] = core.GenesisAccount{
+			l1Genesis.Alloc[addr] = types.Account{
 				Code:    existing.Code,
 				Storage: existing.Storage,
 				Balance: amount,
 				Nonce:   existing.Nonce,
 			}
 		} else {
-			l1Genesis.Alloc[addr] = core.GenesisAccount{
+			l1Genesis.Alloc[addr] = types.Account{
 				Balance: amount,
 				Nonce:   0,
 			}
@@ -483,21 +480,30 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste
 	}
 
 	l1Block := l1Genesis.ToBlock()
-	l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l1Block)
+	var allocsMode genesis.L2AllocsMode
+	allocsMode = genesis.L2AllocsDelta
+	if fjordTime := cfg.DeployConfig.FjordTime(l1Block.Time()); fjordTime != nil && *fjordTime <= 0 {
+		allocsMode = genesis.L2AllocsFjord
+	} else if ecotoneTime := cfg.DeployConfig.EcotoneTime(l1Block.Time()); ecotoneTime != nil && *ecotoneTime <= 0 {
+		allocsMode = genesis.L2AllocsEcotone
+	}
+	t.Log("Generating L2 genesis", "l2_allocs_mode", string(allocsMode))
+	l2Allocs := config.L2Allocs(allocsMode)
+	l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, l1Block)
 	if err != nil {
 		return nil, err
 	}
 	sys.L2GenesisCfg = l2Genesis
 	for addr, amount := range cfg.Premine {
 		if existing, ok := l2Genesis.Alloc[addr]; ok {
-			l2Genesis.Alloc[addr] = core.GenesisAccount{
+			l2Genesis.Alloc[addr] = types.Account{
 				Code:    existing.Code,
 				Storage: existing.Storage,
 				Balance: amount,
 				Nonce:   existing.Nonce,
 			}
 		} else {
-			l2Genesis.Alloc[addr] = core.GenesisAccount{
+			l2Genesis.Alloc[addr] = types.Account{
 				Balance: amount,
 				Nonce:   0,
 			}
@@ -815,12 +821,19 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste
 	// batcher defaults if unset
 	batcherMaxL1TxSizeBytes := cfg.BatcherMaxL1TxSizeBytes
 	if batcherMaxL1TxSizeBytes == 0 {
-		batcherMaxL1TxSizeBytes = 240_000
+		batcherMaxL1TxSizeBytes = 120_000
 	}
 	batcherTargetNumFrames := cfg.BatcherTargetNumFrames
 	if batcherTargetNumFrames == 0 {
 		batcherTargetNumFrames = 1
 	}
+
+	var compressionAlgo derive.CompressionAlgo = derive.Zlib
+	// if opt has brotli key, set the compression algo as brotli
+	if _, ok := opts.Get("compressionAlgo", "brotli"); ok {
+		compressionAlgo = derive.Brotli10
+	}
+
 	batcherCLIConfig := &bss.CLIConfig{
 		L1EthRpc:                 sys.EthInstances["l1"].WSEndpoint(),
 		L2EthRpc:                 sys.EthInstances["sequencer"].WSEndpoint(),
@@ -829,14 +842,11 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste
 		MaxChannelDuration:       1,
 		MaxL1TxSize:              batcherMaxL1TxSizeBytes,
 		TestUseMaxTxSizeForBlobs: cfg.BatcherUseMaxTxSizeForBlobs,
-		CompressorConfig: compressor.CLIConfig{
-			TargetL1TxSizeBytes: cfg.BatcherTargetL1TxSizeBytes,
-			TargetNumFrames:     int(batcherTargetNumFrames),
-			ApproxComprRatio:    0.4,
-		},
-		SubSafetyMargin: 4,
-		PollInterval:    50 * time.Millisecond,
-		TxMgrConfig:     newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), cfg.Secrets.Batcher),
+		TargetNumFrames:          int(batcherTargetNumFrames),
+		ApproxComprRatio:         0.4,
+		SubSafetyMargin:          4,
+		PollInterval:             50 * time.Millisecond,
+		TxMgrConfig:              newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), cfg.Secrets.Batcher),
 		LogConfig: oplog.CLIConfig{
 			Level:  log.LevelInfo,
 			Format: oplog.FormatText,
@@ -844,6 +854,7 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste
 		Stopped:              sys.Cfg.DisableBatcher, // Batch submitter may be enabled later
 		BatchType:            batchType,
 		DataAvailabilityType: sys.Cfg.DataAvailabilityType,
+		CompressionAlgo:      compressionAlgo,
 	}
 	// Batch Submitter
 	batcher, err := bss.BatcherServiceFromCLIConfig(context.Background(), "0.0.1", batcherCLIConfig, sys.Cfg.Loggers["batcher"])
diff --git a/op-e2e/system_test.go b/op-e2e/system_test.go
index bff08e6203dd..4e2de3043615 100644
--- a/op-e2e/system_test.go
+++ b/op-e2e/system_test.go
@@ -7,11 +7,10 @@ import (
 	"math/big"
 	"os"
 	"runtime"
+	"slices"
 	"testing"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
-	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth"
 	"github.com/ethereum/go-ethereum"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/common"
@@ -28,12 +27,11 @@ import (
 
 	"github.com/libp2p/go-libp2p/core/peer"
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/config"
-	gethutils "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth"
+	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
+	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
 	"github.com/ethereum-optimism/optimism/op-node/metrics"
@@ -44,6 +42,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/client"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/oppprof"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum-optimism/optimism/op-service/retry"
 	"github.com/ethereum-optimism/optimism/op-service/sources"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
@@ -243,7 +242,7 @@ func TestSystemE2EDencunAtGenesisWithBlobs(t *testing.T) {
 	InitParallel(t)
 
 	cfg := DefaultSystemConfig(t)
-	//cancun is on from genesis:
+	// cancun is on from genesis:
 	genesisActivation := hexutil.Uint64(0)
 	cfg.DeployConfig.L1CancunTimeOffset = &genesisActivation // i.e. turn cancun on at genesis time + 0
 
@@ -267,10 +266,10 @@ func TestSystemE2EDencunAtGenesisWithBlobs(t *testing.T) {
 	require.Nil(t, err, "Waiting for blob tx on L1")
 	// end sending blob-containing txns on l1
 	l2Client := sys.Clients["sequencer"]
-	finalizedBlock, err := gethutils.WaitForL1OriginOnL2(sys.RollupConfig, blockContainsBlob.BlockNumber.Uint64(), l2Client, 30*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second)
+	finalizedBlock, err := geth.WaitForL1OriginOnL2(sys.RollupConfig, blockContainsBlob.BlockNumber.Uint64(), l2Client, 30*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second)
 	require.Nil(t, err, "Waiting for L1 origin of blob tx on L2")
 	finalizationTimeout := 30 * time.Duration(cfg.DeployConfig.L1BlockTime) * time.Second
-	_, err = gethutils.WaitForBlockToBeSafe(finalizedBlock.Header().Number, l2Client, finalizationTimeout)
+	_, err = geth.WaitForBlockToBeSafe(finalizedBlock.Header().Number, l2Client, finalizationTimeout)
 	require.Nil(t, err, "Waiting for safety of L2 block")
 }
 
@@ -1004,10 +1003,10 @@ func TestL1InfoContract(t *testing.T) {
 			BatcherAddr:    sys.RollupConfig.Genesis.SystemConfig.BatcherAddr,
 		}
 		if sys.RollupConfig.IsEcotone(b.Time()) && !sys.RollupConfig.IsEcotoneActivationBlock(b.Time()) {
-			blobBaseFeeScalar, baseFeeScalar, err := sys.RollupConfig.Genesis.SystemConfig.EcotoneScalars()
+			scalars, err := sys.RollupConfig.Genesis.SystemConfig.EcotoneScalars()
 			require.NoError(t, err)
-			l1blocks[h].BlobBaseFeeScalar = blobBaseFeeScalar
-			l1blocks[h].BaseFeeScalar = baseFeeScalar
+			l1blocks[h].BlobBaseFeeScalar = scalars.BlobBaseFeeScalar
+			l1blocks[h].BaseFeeScalar = scalars.BaseFeeScalar
 			if excess := b.ExcessBlobGas(); excess != nil {
 				l1blocks[h].BlobBaseFee = eip4844.CalcBlobFee(*excess)
 			} else {
@@ -1212,6 +1211,18 @@ func TestFees(t *testing.T) {
 		cfg.DeployConfig.L2GenesisEcotoneTimeOffset = new(hexutil.Uint64)
 		testFees(t, cfg)
 	})
+	t.Run("fjord", func(t *testing.T) {
+		InitParallel(t)
+		cfg := DefaultSystemConfig(t)
+		cfg.DeployConfig.L1GenesisBlockBaseFeePerGas = (*hexutil.Big)(big.NewInt(7))
+
+		cfg.DeployConfig.L2GenesisRegolithTimeOffset = new(hexutil.Uint64)
+		cfg.DeployConfig.L2GenesisCanyonTimeOffset = new(hexutil.Uint64)
+		cfg.DeployConfig.L2GenesisDeltaTimeOffset = new(hexutil.Uint64)
+		cfg.DeployConfig.L2GenesisEcotoneTimeOffset = new(hexutil.Uint64)
+		cfg.DeployConfig.L2GenesisFjordTimeOffset = new(hexutil.Uint64)
+		testFees(t, cfg)
+	})
 }
 
 func testFees(t *testing.T, cfg SystemConfig) {
@@ -1223,6 +1234,10 @@ func testFees(t *testing.T, cfg SystemConfig) {
 	l2Verif := sys.Clients["verifier"]
 	l1 := sys.Clients["l1"]
 
+	// Wait for first block after genesis. The genesis block has zero L1Block values and will throw off the GPO checks
+	_, err = geth.WaitForBlock(big.NewInt(1), l2Verif, time.Minute)
+	require.NoError(t, err)
+
 	config := sys.L2Genesis().Config
 
 	sga := &stateGetterAdapter{
@@ -1251,7 +1266,8 @@ func testFees(t *testing.T, cfg SystemConfig) {
 
 		scalar, err := gpoContract.Scalar(&bind.CallOpts{})
 		require.Nil(t, err, "reading gpo scalar")
-		require.Equal(t, scalar.Uint64(), cfg.DeployConfig.GasPriceOracleScalar, "wrong gpo scalar")
+		feeScalar := cfg.DeployConfig.FeeScalar()
+		require.Equal(t, scalar, new(big.Int).SetBytes(feeScalar[:]), "wrong gpo scalar")
 	} else {
 		_, err := gpoContract.Overhead(&bind.CallOpts{})
 		require.ErrorContains(t, err, "deprecated")
@@ -1349,11 +1365,25 @@ func testFees(t *testing.T, cfg SystemConfig) {
 	require.NoError(t, err)
 	require.Equal(t, sys.RollupConfig.IsEcotone(header.Time), gpoEcotone, "GPO and chain must have same ecotone view")
 
+	gpoFjord, err := gpoContract.IsFjord(nil)
+	require.NoError(t, err)
+	require.Equal(t, sys.RollupConfig.IsFjord(header.Time), gpoFjord, "GPO and chain must have same fjord view")
+
 	gpoL1Fee, err := gpoContract.GetL1Fee(&bind.CallOpts{}, bytes)
 	require.Nil(t, err)
 
 	adjustedGPOFee := gpoL1Fee
-	if sys.RollupConfig.IsRegolith(header.Time) {
+	if sys.RollupConfig.IsFjord(header.Time) {
+		// The fastlz size of the transaction is 102 bytes
+		require.Equal(t, uint64(102), tx.RollupCostData().FastLzSize)
+		// Which results in both the fjord cost function and GPO using the minimum value for the fastlz regression:
+		// Geth Linear Regression: -42.5856 + 102 * 0.8365 = 42.7374
+		// GPO Linear Regression: -42.5856 + 170 * 0.8365 = 99.6194
+		// The additional 68 (170 vs. 102) is due to the GPO adding 68 bytes to account for the signature.
+		require.Greater(t, types.MinTransactionSize.Uint64(), uint64(99))
+		// Because of this, we don't need to do any adjustment as the GPO and cost func are both bounded to the minimum value.
+		// However, if the fastlz regression output is ever larger than the minimum, this will require an adjustment.
+	} else if sys.RollupConfig.IsRegolith(header.Time) {
 		// if post-regolith, adjust the GPO fee by removing the overhead it adds because of signature data
 		artificialGPOOverhead := big.NewInt(68 * 16) // it adds 68 bytes to cover signature and RLP data
 		l1BaseFee := big.NewInt(7)                   // we assume the L1 basefee is the minimum, 7
@@ -1468,27 +1498,28 @@ func TestBatcherMultiTx(t *testing.T) {
 	InitParallel(t)
 
 	cfg := DefaultSystemConfig(t)
-	cfg.MaxPendingTransactions = 0     // no limit on parallel txs
-	cfg.BatcherTargetL1TxSizeBytes = 2 // ensures that batcher txs are as small as possible
+	cfg.MaxPendingTransactions = 0 // no limit on parallel txs
+	// ensures that batcher txs are as small as possible
+	cfg.BatcherMaxL1TxSizeBytes = derive.FrameV0OverHeadSize + 1 /*version bytes*/ + 1
 	cfg.DisableBatcher = true
 	sys, err := cfg.Start(t)
-	require.Nil(t, err, "Error starting up system")
+	require.NoError(t, err, "Error starting up system")
 	defer sys.Close()
 
 	l1Client := sys.Clients["l1"]
 	l2Seq := sys.Clients["sequencer"]
 
 	_, err = geth.WaitForBlock(big.NewInt(10), l2Seq, time.Duration(cfg.DeployConfig.L2BlockTime*15)*time.Second)
-	require.Nil(t, err, "Waiting for L2 blocks")
+	require.NoError(t, err, "Waiting for L2 blocks")
 
 	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
 	defer cancel()
 	l1Number, err := l1Client.BlockNumber(ctx)
-	require.Nil(t, err)
+	require.NoError(t, err)
 
 	// start batch submission
 	err = sys.BatchSubmitter.Driver().StartBatchSubmitting()
-	require.Nil(t, err)
+	require.NoError(t, err)
 
 	totalTxCount := 0
 	// wait for up to 10 L1 blocks, usually only 3 is required, but it's
@@ -1496,7 +1527,7 @@ func TestBatcherMultiTx(t *testing.T) {
 	// so we wait additional blocks.
 	for i := int64(0); i < 10; i++ {
 		block, err := geth.WaitForBlock(big.NewInt(int64(l1Number)+i), l1Client, time.Duration(cfg.DeployConfig.L1BlockTime*5)*time.Second)
-		require.Nil(t, err, "Waiting for l1 blocks")
+		require.NoError(t, err, "Waiting for l1 blocks")
 		totalTxCount += len(block.Transactions())
 
 		if totalTxCount >= 10 {
diff --git a/op-e2e/system_tob_test.go b/op-e2e/system_tob_test.go
index c043b2d350b5..ba3e401fcd80 100644
--- a/op-e2e/system_tob_test.go
+++ b/op-e2e/system_tob_test.go
@@ -10,15 +10,16 @@ import (
 	"testing"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindingspreview"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
+	legacybindings "github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/challenger"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/disputegame"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
+	"github.com/ethereum-optimism/optimism/op-node/bindings"
+	bindingspreview "github.com/ethereum-optimism/optimism/op-node/bindings/preview"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum-optimism/optimism/op-service/testutils/fuzzerutils"
 	"github.com/ethereum/go-ethereum/accounts"
 	"github.com/ethereum/go-ethereum/accounts/abi"
@@ -42,8 +43,9 @@ func TestGasPriceOracleFeeUpdates(t *testing.T) {
 	InitParallel(t)
 	// Define our values to set in the GasPriceOracle (we set them high to see if it can lock L2 or stop bindings
 	// from updating the prices once again.
-	overheadValue := abi.MaxUint256
-	scalarValue := abi.MaxUint256
+	overheadValue := new(big.Int).Set(abi.MaxUint256)
+	// Ensure the most significant byte is 0x00
+	scalarValue := new(big.Int).Rsh(new(big.Int).Set(abi.MaxUint256), 8)
 	var cancel context.CancelFunc
 
 	// Create our system configuration for L1/L2 and start it
@@ -59,9 +61,9 @@ func TestGasPriceOracleFeeUpdates(t *testing.T) {
 	ethPrivKey := cfg.Secrets.SysCfgOwner
 
 	// Bind to the SystemConfig & GasPriceOracle contracts
-	sysconfig, err := bindings.NewSystemConfig(cfg.L1Deployments.SystemConfigProxy, l1Client)
+	sysconfig, err := legacybindings.NewSystemConfig(cfg.L1Deployments.SystemConfigProxy, l1Client)
 	require.Nil(t, err)
-	gpoContract, err := bindings.NewGasPriceOracleCaller(predeploys.GasPriceOracleAddr, l2Seq)
+	gpoContract, err := legacybindings.NewGasPriceOracleCaller(predeploys.GasPriceOracleAddr, l2Seq)
 	require.Nil(t, err)
 
 	// Obtain our signer.
@@ -419,7 +421,7 @@ func TestMixedWithdrawalValidity(t *testing.T) {
 			l2Verif := sys.Clients["verifier"]
 			require.NoError(t, err)
 
-			systemConfig, err := bindings.NewSystemConfigCaller(cfg.L1Deployments.SystemConfigProxy, l1Client)
+			systemConfig, err := legacybindings.NewSystemConfigCaller(cfg.L1Deployments.SystemConfigProxy, l1Client)
 			require.NoError(t, err)
 			unsafeBlockSigner, err := systemConfig.UnsafeBlockSigner(nil)
 			require.NoError(t, err)
@@ -657,7 +659,7 @@ func TestMixedWithdrawalValidity(t *testing.T) {
 					// Start a challenger to resolve claims and games once the clock expires
 					factoryHelper := disputegame.NewFactoryHelper(t, ctx, sys)
 					factoryHelper.StartChallenger(ctx, "Challenger",
-						challenger.WithCannon(t, sys.RollupConfig, sys.L2GenesisCfg, sys.RollupEndpoint("sequencer"), sys.NodeEndpoint("sequencer")),
+						challenger.WithCannon(t, sys.RollupConfig, sys.L2GenesisCfg),
 						challenger.WithPrivKey(sys.Cfg.Secrets.Mallory))
 				}
 				receipt, err = wait.ForReceiptOK(ctx, l1Client, tx.Hash())
@@ -682,7 +684,7 @@ func TestMixedWithdrawalValidity(t *testing.T) {
 				ctx, withdrawalCancel := context.WithTimeout(context.Background(), 60*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second)
 				defer withdrawalCancel()
 				if e2eutils.UseFPAC() {
-					err = wait.ForWithdrawalCheck(ctx, l1Client, withdrawal, cfg.L1Deployments.OptimismPortalProxy)
+					err = wait.ForWithdrawalCheck(ctx, l1Client, withdrawal, cfg.L1Deployments.OptimismPortalProxy, transactor.Account.L1Opts.From)
 					require.NoError(t, err)
 				} else {
 					err = wait.ForFinalizationPeriod(ctx, l1Client, header.Number, cfg.L1Deployments.L2OutputOracleProxy)
diff --git a/op-e2e/tx_helper.go b/op-e2e/tx_helper.go
index 2c930801ad1a..0b91afbbb760 100644
--- a/op-e2e/tx_helper.go
+++ b/op-e2e/tx_helper.go
@@ -9,7 +9,7 @@ import (
 
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
diff --git a/op-e2e/withdrawal_helper.go b/op-e2e/withdrawal_helper.go
index f0457d105db0..88c096af307c 100644
--- a/op-e2e/withdrawal_helper.go
+++ b/op-e2e/withdrawal_helper.go
@@ -7,15 +7,16 @@ import (
 	"testing"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindingspreview"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
+	legacybindings "github.com/ethereum-optimism/optimism/op-e2e/bindings"
 	"github.com/ethereum-optimism/optimism/op-e2e/config"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth"
 	"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait"
+	"github.com/ethereum-optimism/optimism/op-node/bindings"
+	bindingspreview "github.com/ethereum-optimism/optimism/op-node/bindings/preview"
 	"github.com/ethereum-optimism/optimism/op-node/withdrawals"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/types"
@@ -193,18 +194,18 @@ func FinalizeWithdrawal(t *testing.T, cfg SystemConfig, l1Client *ethclient.Clie
 		wdHash, err := wd.Hash()
 		require.Nil(t, err)
 
-		game, err := portal2.ProvenWithdrawals(&bind.CallOpts{}, wdHash)
+		game, err := portal2.ProvenWithdrawals(&bind.CallOpts{}, wdHash, opts.From)
 		require.Nil(t, err)
 		require.NotNil(t, game, "withdrawal should be proven")
 
-		proxy, err := bindings.NewFaultDisputeGame(game.DisputeGameProxy, l1Client)
+		proxy, err := legacybindings.NewFaultDisputeGame(game.DisputeGameProxy, l1Client)
 		require.Nil(t, err)
 
-		expiry, err := proxy.GameDuration(&bind.CallOpts{})
+		expiry, err := proxy.MaxClockDuration(&bind.CallOpts{})
 		require.Nil(t, err)
 
 		time.Sleep(time.Duration(expiry) * time.Second)
-		resolveClaimTx, err := proxy.ResolveClaim(opts, common.Big0)
+		resolveClaimTx, err := proxy.ResolveClaim(opts, common.Big0, common.Big0)
 		require.Nil(t, err)
 
 		resolveClaimReceipt, err = wait.ForReceiptOK(ctx, l1Client, resolveClaimTx.Hash())
@@ -220,7 +221,7 @@ func FinalizeWithdrawal(t *testing.T, cfg SystemConfig, l1Client *ethclient.Clie
 	}
 
 	if e2eutils.UseFPAC() {
-		err := wait.ForWithdrawalCheck(ctx, l1Client, wd, config.L1Deployments.OptimismPortalProxy)
+		err := wait.ForWithdrawalCheck(ctx, l1Client, wd, config.L1Deployments.OptimismPortalProxy, opts.From)
 		require.Nil(t, err)
 	} else {
 		err := wait.ForFinalizationPeriod(ctx, l1Client, withdrawalProofReceipt.BlockNumber, config.L1Deployments.L2OutputOracleProxy)
diff --git a/op-heartbeat/Dockerfile b/op-heartbeat/Dockerfile
deleted file mode 100644
index 2e3996cde666..000000000000
--- a/op-heartbeat/Dockerfile
+++ /dev/null
@@ -1,9 +0,0 @@
-ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest
-FROM $OP_STACK_GO_BUILDER as builder
-# See "make golang-docker" and /ops/docker/op-stack-go
-
-FROM alpine:3.18
-
-COPY --from=builder /usr/local/bin/op-heartbeat /usr/local/bin/op-heartbeat
-
-CMD ["op-heartbeat"]
diff --git a/op-heartbeat/Dockerfile.dockerignore b/op-heartbeat/Dockerfile.dockerignore
deleted file mode 100644
index 4f26140750a0..000000000000
--- a/op-heartbeat/Dockerfile.dockerignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# ignore everything but the dockerfile, the op-stack-go base image performs the build
-*
diff --git a/op-heartbeat/Makefile b/op-heartbeat/Makefile
index f1efa74c37df..95d57b25c040 100644
--- a/op-heartbeat/Makefile
+++ b/op-heartbeat/Makefile
@@ -1,6 +1,6 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+VERSION ?= v0.0.0
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
diff --git a/op-node/Dockerfile.dockerignore b/op-node/Dockerfile.dockerignore
deleted file mode 100644
index 4f26140750a0..000000000000
--- a/op-node/Dockerfile.dockerignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# ignore everything but the dockerfile, the op-stack-go base image performs the build
-*
diff --git a/op-node/Makefile b/op-node/Makefile
index 9fd7c71b0310..509fc261d2f7 100644
--- a/op-node/Makefile
+++ b/op-node/Makefile
@@ -1,6 +1,18 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+# Find the github tag that points to this commit. If none are found, set the version string to "untagged"
+# Prioritizes release tag, if one exists, over tags suffixed with "-rc"
+VERSION ?= $(shell tags=$$(git tag --points-at $(GITCOMMIT) | grep '^op-node/' | sed 's/op-node\///' | sort -V); \
+             preferred_tag=$$(echo "$$tags" | grep -v -- '-rc' | tail -n 1); \
+             if [ -z "$$preferred_tag" ]; then \
+                 if [ -z "$$tags" ]; then \
+                     echo "untagged"; \
+                 else \
+                     echo "$$tags" | tail -n 1; \
+                 fi \
+             else \
+                 echo $$preferred_tag; \
+             fi)
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
@@ -8,6 +20,11 @@ LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-node/version.Version
 LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-node/version.Meta=$(VERSION_META)
 LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
 
+# Use the old Apple linker to workaround broken xcode - https://github.com/golang/go/issues/65169
+ifeq ($(shell uname),Darwin)
+	FUZZLDFLAGS := -ldflags=-extldflags=-Wl,-ld_classic
+endif
+
 op-node:
 	env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-node ./cmd/main.go
 
@@ -18,19 +35,19 @@ test:
 	go test -v ./...
 
 fuzz:
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzL1InfoBedrockRoundTrip ./rollup/derive
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzL1InfoEcotoneRoundTrip ./rollup/derive
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzL1InfoAgainstContract ./rollup/derive
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzUnmarshallLogEvent ./rollup/derive
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzParseFrames ./rollup/derive
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzFrameUnmarshalBinary ./rollup/derive
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzBatchRoundTrip ./rollup/derive
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDeriveDepositsRoundTrip ./rollup/derive
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDeriveDepositsBadVersion ./rollup/derive
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzParseL1InfoDepositTxDataValid ./rollup/derive
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzParseL1InfoDepositTxDataBadLength ./rollup/derive
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzRejectCreateBlockBadTimestamp ./rollup/driver
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDecodeDepositTxDataToL1Info ./rollup/driver
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzL1InfoBedrockRoundTrip ./rollup/derive
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzL1InfoEcotoneRoundTrip ./rollup/derive
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzL1InfoAgainstContract ./rollup/derive
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzUnmarshallLogEvent ./rollup/derive
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzParseFrames ./rollup/derive
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzFrameUnmarshalBinary ./rollup/derive
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzBatchRoundTrip ./rollup/derive
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDeriveDepositsRoundTrip ./rollup/derive
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDeriveDepositsBadVersion ./rollup/derive
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzParseL1InfoDepositTxDataValid ./rollup/derive
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzParseL1InfoDepositTxDataBadLength ./rollup/derive
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzRejectCreateBlockBadTimestamp ./rollup/driver
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDecodeDepositTxDataToL1Info ./rollup/driver
 
 generate-mocks:
 	go generate ./...
diff --git a/op-node/benchmarks/batchbuilding_test.go b/op-node/benchmarks/batchbuilding_test.go
new file mode 100644
index 000000000000..fc760deba271
--- /dev/null
+++ b/op-node/benchmarks/batchbuilding_test.go
@@ -0,0 +1,313 @@
+package benchmarks
+
+import (
+	"fmt"
+	"math/big"
+	"math/rand"
+	"testing"
+	"time"
+
+	"github.com/ethereum-optimism/optimism/op-batcher/compressor"
+	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
+	"github.com/stretchr/testify/require"
+)
+
+const (
+	// a really large target output size to ensure that the compressors are never full
+	targetOutput_huge = uint64(100_000_000_000)
+	// this target size was determiend by the devnet sepolia batcher's configuration
+	targetOuput_real = uint64(780120)
+)
+
+var (
+	// compressors used in the benchmark
+	rc, _ = compressor.NewRatioCompressor(compressor.Config{
+		TargetOutputSize: targetOutput_huge,
+		ApproxComprRatio: 0.4,
+	})
+	sc, _ = compressor.NewShadowCompressor(compressor.Config{
+		TargetOutputSize: targetOutput_huge,
+	})
+	nc, _ = compressor.NewNonCompressor(compressor.Config{
+		TargetOutputSize: targetOutput_huge,
+	})
+	realsc, _ = compressor.NewShadowCompressor(compressor.Config{
+		TargetOutputSize: targetOuput_real,
+	})
+
+	// compressors used in the benchmark mapped by their name
+	// they come paired with a target output size so span batches can use the target size directly
+	compressors = map[string]compressorAndTarget{
+		"NonCompressor":        {nc, targetOutput_huge},
+		"RatioCompressor":      {rc, targetOutput_huge},
+		"ShadowCompressor":     {sc, targetOutput_huge},
+		"RealShadowCompressor": {realsc, targetOuput_real},
+	}
+	// batch types used in the benchmark
+	batchTypes = []uint{
+		derive.SpanBatchType,
+		// uncomment to include singular batches in the benchmark
+		// singular batches are not included by default because they are not the target of the benchmark
+		// derive.SingularBatchType,
+	}
+)
+
+type compressorAndTarget struct {
+	compressor   derive.Compressor
+	targetOutput uint64
+}
+
+// channelOutByType returns a channel out of the given type as a helper for the benchmarks
+func channelOutByType(batchType uint, compKey string, algo derive.CompressionAlgo) (derive.ChannelOut, error) {
+	chainID := big.NewInt(333)
+	if batchType == derive.SingularBatchType {
+		return derive.NewSingularChannelOut(compressors[compKey].compressor)
+	}
+	if batchType == derive.SpanBatchType {
+		return derive.NewSpanChannelOut(0, chainID, compressors[compKey].targetOutput, algo)
+	}
+	return nil, fmt.Errorf("unsupported batch type: %d", batchType)
+}
+
+// a test case for the benchmark controls the number of batches and transactions per batch,
+// as well as the batch type and compressor used
+type BatchingBenchmarkTC struct {
+	BatchType  uint
+	BatchCount int
+	txPerBatch int
+	compKey    string
+}
+
+func (t BatchingBenchmarkTC) String() string {
+	var btype string
+	if t.BatchType == derive.SingularBatchType {
+		btype = "Singular"
+	}
+	if t.BatchType == derive.SpanBatchType {
+		btype = "Span"
+	}
+	return fmt.Sprintf("BatchType=%s, txPerBatch=%d, BatchCount=%d, Compressor=%s", btype, t.txPerBatch, t.BatchCount, t.compKey)
+}
+
+// BenchmarkChannelOut benchmarks the performance of adding singular batches to a channel out
+// this exercises the compression and batching logic, as well as any batch-building logic
+// Every Compressor in the compressor map is benchmarked for each test case
+// The results of the Benchmark measure *only* the time to add the final batch to the channel out,
+// not the time to send all the batches through the channel out
+// Hint: Raise the rollup.MaxRLPBytesPerChannel to 10_000_000_000 to avoid hitting limits if adding larger test cases
+func BenchmarkFinalBatchChannelOut(b *testing.B) {
+	// Targets define the number of batches and transactions per batch to test
+	type target struct{ bs, tpb int }
+	targets := []target{
+		{10, 1},
+		{100, 1},
+		{1000, 1},
+
+		{10, 100},
+		{100, 100},
+	}
+
+	// build a set of test cases for each batch type, compressor, and target-pair
+	tests := []BatchingBenchmarkTC{}
+	for _, bt := range batchTypes {
+		for compkey := range compressors {
+			for _, t := range targets {
+				tests = append(tests, BatchingBenchmarkTC{bt, t.bs, t.tpb, compkey})
+			}
+		}
+	}
+
+	for _, tc := range tests {
+		chainID := big.NewInt(333)
+		rng := rand.New(rand.NewSource(0x543331))
+		// pre-generate batches to keep the benchmark from including the random generation
+		batches := make([]*derive.SingularBatch, tc.BatchCount)
+		t := time.Now()
+		for i := 0; i < tc.BatchCount; i++ {
+			batches[i] = derive.RandomSingularBatch(rng, tc.txPerBatch, chainID)
+			// set the timestamp to increase with each batch
+			// to leverage optimizations in the Batch Linked List
+			batches[i].Timestamp = uint64(t.Add(time.Duration(i) * time.Second).Unix())
+		}
+		for _, algo := range derive.CompressionAlgos {
+			b.Run(tc.String()+"_"+algo.String(), func(b *testing.B) {
+				// reset the compressor used in the test case
+				for bn := 0; bn < b.N; bn++ {
+					// don't measure the setup time
+					b.StopTimer()
+					compressors[tc.compKey].compressor.Reset()
+					cout, _ := channelOutByType(tc.BatchType, tc.compKey, algo)
+					// add all but the final batch to the channel out
+					for i := 0; i < tc.BatchCount-1; i++ {
+						err := cout.AddSingularBatch(batches[i], 0)
+						require.NoError(b, err)
+					}
+					// measure the time to add the final batch
+					b.StartTimer()
+					// add the final batch to the channel out
+					err := cout.AddSingularBatch(batches[tc.BatchCount-1], 0)
+					require.NoError(b, err)
+				}
+			})
+		}
+
+	}
+}
+
+// BenchmarkIncremental fills a channel out incrementally with batches
+// each increment is counted as its own benchmark
+// Hint: use -benchtime=1x to run the benchmarks for a single iteration
+// it is not currently designed to use b.N
+func BenchmarkIncremental(b *testing.B) {
+	chainID := big.NewInt(333)
+	rng := rand.New(rand.NewSource(0x543331))
+	// use the real compressor for this benchmark
+	// use batchCount as the number of batches to add in each benchmark iteration
+	// and use txPerBatch as the number of transactions per batch
+	tcs := []BatchingBenchmarkTC{
+		{derive.SpanBatchType, 5, 1, "RealBlindCompressor"},
+		//{derive.SingularBatchType, 100, 1, "RealShadowCompressor"},
+	}
+	for _, algo := range derive.CompressionAlgos {
+		for _, tc := range tcs {
+			cout, err := channelOutByType(tc.BatchType, tc.compKey, algo)
+			if err != nil {
+				b.Fatal(err)
+			}
+			done := false
+			for base := 0; !done; base += tc.BatchCount {
+				rangeName := fmt.Sprintf("Incremental %s-%s: %d-%d", algo, tc.String(), base, base+tc.BatchCount)
+				b.Run(rangeName+"_"+algo.String(), func(b *testing.B) {
+					b.StopTimer()
+					// prepare the batches
+					t := time.Now()
+					batches := make([]*derive.SingularBatch, tc.BatchCount)
+					for i := 0; i < tc.BatchCount; i++ {
+						t := t.Add(time.Second)
+						batches[i] = derive.RandomSingularBatch(rng, tc.txPerBatch, chainID)
+						// set the timestamp to increase with each batch
+						// to leverage optimizations in the Batch Linked List
+						batches[i].Timestamp = uint64(t.Unix())
+					}
+					b.StartTimer()
+					for i := 0; i < tc.BatchCount; i++ {
+						err := cout.AddSingularBatch(batches[i], 0)
+						if err != nil {
+							done = true
+							return
+						}
+					}
+				})
+			}
+		}
+	}
+}
+
+// BenchmarkAllBatchesChannelOut benchmarks the performance of adding singular batches to a channel out
+// this exercises the compression and batching logic, as well as any batch-building logic
+// Every Compressor in the compressor map is benchmarked for each test case
+// The results of the Benchmark measure the time to add the *all batches* to the channel out,
+// not the time to send all the batches through the channel out
+// Hint: Raise the rollup.MaxRLPBytesPerChannel to 10_000_000_000 to avoid hitting limits
+func BenchmarkAllBatchesChannelOut(b *testing.B) {
+	// Targets define the number of batches and transactions per batch to test
+	type target struct{ bs, tpb int }
+	targets := []target{
+		{10, 1},
+		{100, 1},
+		{1000, 1},
+
+		{10, 100},
+		{100, 100},
+	}
+
+	// build a set of test cases for each batch type, compressor, and target-pair
+	tests := []BatchingBenchmarkTC{}
+	for _, bt := range batchTypes {
+		for compkey := range compressors {
+			for _, t := range targets {
+				tests = append(tests, BatchingBenchmarkTC{bt, t.bs, t.tpb, compkey})
+			}
+		}
+	}
+
+	for _, algo := range derive.CompressionAlgos {
+		for _, tc := range tests {
+			chainID := big.NewInt(333)
+			rng := rand.New(rand.NewSource(0x543331))
+			// pre-generate batches to keep the benchmark from including the random generation
+			batches := make([]*derive.SingularBatch, tc.BatchCount)
+			t := time.Now()
+			for i := 0; i < tc.BatchCount; i++ {
+				batches[i] = derive.RandomSingularBatch(rng, tc.txPerBatch, chainID)
+				// set the timestamp to increase with each batch
+				// to leverage optimizations in the Batch Linked List
+				batches[i].Timestamp = uint64(t.Add(time.Duration(i) * time.Second).Unix())
+			}
+			b.Run(tc.String()+"_"+algo.String(), func(b *testing.B) {
+				// reset the compressor used in the test case
+				for bn := 0; bn < b.N; bn++ {
+					// don't measure the setup time
+					b.StopTimer()
+					compressors[tc.compKey].compressor.Reset()
+					cout, _ := channelOutByType(tc.BatchType, tc.compKey, algo)
+					b.StartTimer()
+					// add all batches to the channel out
+					for i := 0; i < tc.BatchCount; i++ {
+						err := cout.AddSingularBatch(batches[i], 0)
+						require.NoError(b, err)
+					}
+				}
+			})
+		}
+	}
+}
+
+// BenchmarkGetRawSpanBatch benchmarks the performance of building a span batch from singular batches
+// this exercises the span batch building logic directly
+// The adding of batches to the span batch builder is not included in the benchmark, only the final build to RawSpanBatch
+func BenchmarkGetRawSpanBatch(b *testing.B) {
+	// Targets define the number of batches and transactions per batch to test
+	type target struct{ bs, tpb int }
+	targets := []target{
+		{10, 1},
+		{100, 1},
+		{1000, 1},
+		{10000, 1},
+
+		{10, 100},
+		{100, 100},
+		{1000, 100},
+	}
+
+	tests := []BatchingBenchmarkTC{}
+	for _, t := range targets {
+		tests = append(tests, BatchingBenchmarkTC{derive.SpanBatchType, t.bs, t.tpb, "NonCompressor"})
+	}
+
+	for _, tc := range tests {
+		chainID := big.NewInt(333)
+		rng := rand.New(rand.NewSource(0x543331))
+		// pre-generate batches to keep the benchmark from including the random generation
+		batches := make([]*derive.SingularBatch, tc.BatchCount)
+		t := time.Now()
+		for i := 0; i < tc.BatchCount; i++ {
+			batches[i] = derive.RandomSingularBatch(rng, tc.txPerBatch, chainID)
+			batches[i].Timestamp = uint64(t.Add(time.Duration(i) * time.Second).Unix())
+		}
+		b.Run(tc.String(), func(b *testing.B) {
+			for bn := 0; bn < b.N; bn++ {
+				// don't measure the setup time
+				b.StopTimer()
+				spanBatch := derive.NewSpanBatch(uint64(0), chainID)
+				for i := 0; i < tc.BatchCount; i++ {
+					err := spanBatch.AppendSingularBatch(batches[i], 0)
+					require.NoError(b, err)
+				}
+				b.StartTimer()
+				_, err := spanBatch.ToRawSpanBatch()
+				require.NoError(b, err)
+			}
+		})
+	}
+}
diff --git a/op-node/bindings/disputegamefactory.go b/op-node/bindings/disputegamefactory.go
new file mode 100644
index 000000000000..1bfb6a73da2b
--- /dev/null
+++ b/op-node/bindings/disputegamefactory.go
@@ -0,0 +1,1404 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// IDisputeGameFactoryGameSearchResult is an auto generated low-level Go binding around an user-defined struct.
+type IDisputeGameFactoryGameSearchResult struct {
+	Index     *big.Int
+	Metadata  [32]byte
+	Timestamp uint64
+	RootClaim [32]byte
+	ExtraData []byte
+}
+
+// DisputeGameFactoryMetaData contains all meta data concerning the DisputeGameFactory contract.
+var DisputeGameFactoryMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"create\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"findLatestGames\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_n\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"games_\",\"type\":\"tuple[]\",\"internalType\":\"structIDisputeGameFactory.GameSearchResult[]\",\"components\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"metadata\",\"type\":\"bytes32\",\"internalType\":\"GameId\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"},{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameAtIndex\",\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"timestamp_\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"},{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameCount\",\"inputs\":[],\"outputs\":[{\"name\":\"gameCount_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameImpls\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"games\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"},{\"name\":\"timestamp_\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGameUUID\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"uuid_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initBonds\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setImplementation\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_impl\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setInitBond\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_initBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DisputeGameCreated\",\"inputs\":[{\"name\":\"disputeProxy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"},{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"Claim\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ImplementationSet\",\"inputs\":[{\"name\":\"impl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitBondUpdated\",\"inputs\":[{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"},{\"name\":\"newBond\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"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\":\"error\",\"name\":\"GameAlreadyExists\",\"inputs\":[{\"name\":\"uuid\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}]},{\"type\":\"error\",\"name\":\"IncorrectBondAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoImplementation\",\"inputs\":[{\"name\":\"gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"}]}]",
+	Bin: "0x60806040523480156200001157600080fd5b506200001e600062000024565b62000292565b600054610100900460ff1615808015620000455750600054600160ff909116105b8062000075575062000062306200016260201b62000cdd1760201c565b15801562000075575060005460ff166001145b620000de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000102576000805461ff0019166101001790555b6200010c62000171565b6200011782620001d9565b80156200015e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054610100900460ff16620001cd5760405162461bcd60e51b815260206004820152602b60248201526000805160206200185283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b620001d76200022b565b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16620002875760405162461bcd60e51b815260206004820152602b60248201526000805160206200185283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b620001d733620001d9565b6115b080620002a26000396000f3fe6080604052600436106100e85760003560e01c80636593dc6e1161008a57806396cd97201161005957806396cd972014610313578063bb8aa1fc14610333578063c4d66de814610394578063f2fde38b146103b457600080fd5b80636593dc6e14610293578063715018a6146102c057806382ecf2f6146102d55780638da5cb5b146102e857600080fd5b8063254bd683116100c6578063254bd6831461019c5780634d1975b4146101c957806354fd4d50146101e85780635f0150cb1461023e57600080fd5b806314f6b1a3146100ed5780631b685b9e1461010f5780631e3342401461017c575b600080fd5b3480156100f957600080fd5b5061010d6101083660046110bf565b6103d4565b005b34801561011b57600080fd5b5061015261012a3660046110f6565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061010d610197366004611111565b61045e565b3480156101a857600080fd5b506101bc6101b736600461113b565b6104aa565b60405161017391906111e8565b3480156101d557600080fd5b506068545b604051908152602001610173565b3480156101f457600080fd5b506102316040518060400160405280600581526020017f302e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161017391906112a5565b34801561024a57600080fd5b5061025e6102593660046112b8565b6106ee565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff909116602083015201610173565b34801561029f57600080fd5b506101da6102ae3660046110f6565b60666020526000908152604090205481565b3480156102cc57600080fd5b5061010d610741565b6101526102e33660046112b8565b610755565b3480156102f457600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610152565b34801561031f57600080fd5b506101da61032e3660046112b8565b6109ef565b34801561033f57600080fd5b5061035361034e36600461133f565b610a28565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610173565b3480156103a057600080fd5b5061010d6103af366004611358565b610a8a565b3480156103c057600080fd5b5061010d6103cf366004611358565b610c26565b6103dc610cf9565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610466610cf9565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806104bc575081155b6106e7575060408051600583901b8101602001909152825b8381116106e5576000606882815481106104f0576104f0611375565b600091825260209091200154905060e081901c60a082901c67ffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff831663ffffffff891683036106b6576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d091908101906113d3565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610643919061149e565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a5161068591906114b7565b8151811061069557610695611375565b6020026020010181905250888851106106b3575050505050506106e5565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506104d49050565b505b9392505050565b60008060006106ff878787876109ef565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610749610cf9565b6107536000610d7a565b565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107c5576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff86166000908152606660205260409020543414610813576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108206001436114b7565b40905061088a338783888860405160200161083f9594939291906114f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff841690610df1565b92508273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108d457600080fd5b505af11580156108e8573d6000803e3d6000fd5b505050505060006108fb888888886109ef565b60008181526067602052604090205490915015610947576040517f014f6fe5000000000000000000000000000000000000000000000000000000008152600481018290526024016107bc565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610a089493929190611542565b604051602081830303815290604052805190602001209050949350505050565b6000806000610a7d60688581548110610a4357610a43611375565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9196909550909350915050565b600054610100900460ff1615808015610aaa5750600054600160ff909116105b80610ac45750303b158015610ac4575060005460ff166001145b610b50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bc565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bae57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bb6610dff565b610bbf82610d7a565b8015610c2257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610c2e610cf9565b73ffffffffffffffffffffffffffffffffffffffff8116610cd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bc565b610cda81610d7a565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006106e760008484610e9e565b600054610100900460ff16610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b610753610fe4565b600060608203516040830351602084035184518060208701018051600283016c5af43d3d93803e606057fd5bf3895289600d8a035278593da1005b363d3d373d3d3d3d610000806062363936013d738160481b1760218a03527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff603a8a035272fd6100003d81600a3d39f336602c57343d527f6062820160781b1761ff9e82106059018a03528060f01b8352606c8101604c8a038cf097505086610f6a5763301164256000526004601cfd5b905285527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09092019190915292915050565b600054610100900460ff1661107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b61075333610d7a565b803563ffffffff8116811461109857600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610cda57600080fd5b600080604083850312156110d257600080fd5b6110db83611084565b915060208301356110eb8161109d565b809150509250929050565b60006020828403121561110857600080fd5b6106e782611084565b6000806040838503121561112457600080fd5b61112d83611084565b946020939093013593505050565b60008060006060848603121561115057600080fd5b61115984611084565b95602085013595506040909401359392505050565b60005b83811015611189578181015183820152602001611171565b83811115611198576000848401525b50505050565b600081518084526111b681602086016020860161116e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611297578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a0918501829052906112838186018361119e565b96890196945050509086019060010161120f565b509098975050505050505050565b6020815260006106e7602083018461119e565b600080600080606085870312156112ce57600080fd5b6112d785611084565b935060208501359250604085013567ffffffffffffffff808211156112fb57600080fd5b818701915087601f83011261130f57600080fd5b81358181111561131e57600080fd5b88602082850101111561133057600080fd5b95989497505060200194505050565b60006020828403121561135157600080fd5b5035919050565b60006020828403121561136a57600080fd5b81356106e78161109d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113e557600080fd5b815167ffffffffffffffff808211156113fd57600080fd5b818401915084601f83011261141157600080fd5b815181811115611423576114236113a4565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611469576114696113a4565b8160405282815287602084870101111561148257600080fd5b61149383602083016020880161116e565b979650505050505050565b6000602082840312156114b057600080fd5b5051919050565b6000828210156114f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1681528460148201528360348201528183605483013760009101605401908152949350505050565b63ffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
+}
+
+// DisputeGameFactoryABI is the input ABI used to generate the binding from.
+// Deprecated: Use DisputeGameFactoryMetaData.ABI instead.
+var DisputeGameFactoryABI = DisputeGameFactoryMetaData.ABI
+
+// DisputeGameFactoryBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use DisputeGameFactoryMetaData.Bin instead.
+var DisputeGameFactoryBin = DisputeGameFactoryMetaData.Bin
+
+// DeployDisputeGameFactory deploys a new Ethereum contract, binding an instance of DisputeGameFactory to it.
+func DeployDisputeGameFactory(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *DisputeGameFactory, error) {
+	parsed, err := DisputeGameFactoryMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(DisputeGameFactoryBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &DisputeGameFactory{DisputeGameFactoryCaller: DisputeGameFactoryCaller{contract: contract}, DisputeGameFactoryTransactor: DisputeGameFactoryTransactor{contract: contract}, DisputeGameFactoryFilterer: DisputeGameFactoryFilterer{contract: contract}}, nil
+}
+
+// DisputeGameFactory is an auto generated Go binding around an Ethereum contract.
+type DisputeGameFactory struct {
+	DisputeGameFactoryCaller     // Read-only binding to the contract
+	DisputeGameFactoryTransactor // Write-only binding to the contract
+	DisputeGameFactoryFilterer   // Log filterer for contract events
+}
+
+// DisputeGameFactoryCaller is an auto generated read-only Go binding around an Ethereum contract.
+type DisputeGameFactoryCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DisputeGameFactoryTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type DisputeGameFactoryTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DisputeGameFactoryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type DisputeGameFactoryFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DisputeGameFactorySession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type DisputeGameFactorySession struct {
+	Contract     *DisputeGameFactory // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts       // Call options to use throughout this session
+	TransactOpts bind.TransactOpts   // Transaction auth options to use throughout this session
+}
+
+// DisputeGameFactoryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type DisputeGameFactoryCallerSession struct {
+	Contract *DisputeGameFactoryCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts             // Call options to use throughout this session
+}
+
+// DisputeGameFactoryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type DisputeGameFactoryTransactorSession struct {
+	Contract     *DisputeGameFactoryTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
+}
+
+// DisputeGameFactoryRaw is an auto generated low-level Go binding around an Ethereum contract.
+type DisputeGameFactoryRaw struct {
+	Contract *DisputeGameFactory // Generic contract binding to access the raw methods on
+}
+
+// DisputeGameFactoryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type DisputeGameFactoryCallerRaw struct {
+	Contract *DisputeGameFactoryCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// DisputeGameFactoryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type DisputeGameFactoryTransactorRaw struct {
+	Contract *DisputeGameFactoryTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewDisputeGameFactory creates a new instance of DisputeGameFactory, bound to a specific deployed contract.
+func NewDisputeGameFactory(address common.Address, backend bind.ContractBackend) (*DisputeGameFactory, error) {
+	contract, err := bindDisputeGameFactory(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactory{DisputeGameFactoryCaller: DisputeGameFactoryCaller{contract: contract}, DisputeGameFactoryTransactor: DisputeGameFactoryTransactor{contract: contract}, DisputeGameFactoryFilterer: DisputeGameFactoryFilterer{contract: contract}}, nil
+}
+
+// NewDisputeGameFactoryCaller creates a new read-only instance of DisputeGameFactory, bound to a specific deployed contract.
+func NewDisputeGameFactoryCaller(address common.Address, caller bind.ContractCaller) (*DisputeGameFactoryCaller, error) {
+	contract, err := bindDisputeGameFactory(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryCaller{contract: contract}, nil
+}
+
+// NewDisputeGameFactoryTransactor creates a new write-only instance of DisputeGameFactory, bound to a specific deployed contract.
+func NewDisputeGameFactoryTransactor(address common.Address, transactor bind.ContractTransactor) (*DisputeGameFactoryTransactor, error) {
+	contract, err := bindDisputeGameFactory(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryTransactor{contract: contract}, nil
+}
+
+// NewDisputeGameFactoryFilterer creates a new log filterer instance of DisputeGameFactory, bound to a specific deployed contract.
+func NewDisputeGameFactoryFilterer(address common.Address, filterer bind.ContractFilterer) (*DisputeGameFactoryFilterer, error) {
+	contract, err := bindDisputeGameFactory(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryFilterer{contract: contract}, nil
+}
+
+// bindDisputeGameFactory binds a generic wrapper to an already deployed contract.
+func bindDisputeGameFactory(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(DisputeGameFactoryABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_DisputeGameFactory *DisputeGameFactoryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _DisputeGameFactory.Contract.DisputeGameFactoryCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_DisputeGameFactory *DisputeGameFactoryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.DisputeGameFactoryTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_DisputeGameFactory *DisputeGameFactoryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.DisputeGameFactoryTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_DisputeGameFactory *DisputeGameFactoryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _DisputeGameFactory.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_DisputeGameFactory *DisputeGameFactoryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_DisputeGameFactory *DisputeGameFactoryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.contract.Transact(opts, method, params...)
+}
+
+// FindLatestGames is a free data retrieval call binding the contract method 0x254bd683.
+//
+// Solidity: function findLatestGames(uint32 _gameType, uint256 _start, uint256 _n) view returns((uint256,bytes32,uint64,bytes32,bytes)[] games_)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) FindLatestGames(opts *bind.CallOpts, _gameType uint32, _start *big.Int, _n *big.Int) ([]IDisputeGameFactoryGameSearchResult, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "findLatestGames", _gameType, _start, _n)
+
+	if err != nil {
+		return *new([]IDisputeGameFactoryGameSearchResult), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([]IDisputeGameFactoryGameSearchResult)).(*[]IDisputeGameFactoryGameSearchResult)
+
+	return out0, err
+
+}
+
+// FindLatestGames is a free data retrieval call binding the contract method 0x254bd683.
+//
+// Solidity: function findLatestGames(uint32 _gameType, uint256 _start, uint256 _n) view returns((uint256,bytes32,uint64,bytes32,bytes)[] games_)
+func (_DisputeGameFactory *DisputeGameFactorySession) FindLatestGames(_gameType uint32, _start *big.Int, _n *big.Int) ([]IDisputeGameFactoryGameSearchResult, error) {
+	return _DisputeGameFactory.Contract.FindLatestGames(&_DisputeGameFactory.CallOpts, _gameType, _start, _n)
+}
+
+// FindLatestGames is a free data retrieval call binding the contract method 0x254bd683.
+//
+// Solidity: function findLatestGames(uint32 _gameType, uint256 _start, uint256 _n) view returns((uint256,bytes32,uint64,bytes32,bytes)[] games_)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) FindLatestGames(_gameType uint32, _start *big.Int, _n *big.Int) ([]IDisputeGameFactoryGameSearchResult, error) {
+	return _DisputeGameFactory.Contract.FindLatestGames(&_DisputeGameFactory.CallOpts, _gameType, _start, _n)
+}
+
+// GameAtIndex is a free data retrieval call binding the contract method 0xbb8aa1fc.
+//
+// Solidity: function gameAtIndex(uint256 _index) view returns(uint32 gameType_, uint64 timestamp_, address proxy_)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) GameAtIndex(opts *bind.CallOpts, _index *big.Int) (struct {
+	GameType  uint32
+	Timestamp uint64
+	Proxy     common.Address
+}, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "gameAtIndex", _index)
+
+	outstruct := new(struct {
+		GameType  uint32
+		Timestamp uint64
+		Proxy     common.Address
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.GameType = *abi.ConvertType(out[0], new(uint32)).(*uint32)
+	outstruct.Timestamp = *abi.ConvertType(out[1], new(uint64)).(*uint64)
+	outstruct.Proxy = *abi.ConvertType(out[2], new(common.Address)).(*common.Address)
+
+	return *outstruct, err
+
+}
+
+// GameAtIndex is a free data retrieval call binding the contract method 0xbb8aa1fc.
+//
+// Solidity: function gameAtIndex(uint256 _index) view returns(uint32 gameType_, uint64 timestamp_, address proxy_)
+func (_DisputeGameFactory *DisputeGameFactorySession) GameAtIndex(_index *big.Int) (struct {
+	GameType  uint32
+	Timestamp uint64
+	Proxy     common.Address
+}, error) {
+	return _DisputeGameFactory.Contract.GameAtIndex(&_DisputeGameFactory.CallOpts, _index)
+}
+
+// GameAtIndex is a free data retrieval call binding the contract method 0xbb8aa1fc.
+//
+// Solidity: function gameAtIndex(uint256 _index) view returns(uint32 gameType_, uint64 timestamp_, address proxy_)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) GameAtIndex(_index *big.Int) (struct {
+	GameType  uint32
+	Timestamp uint64
+	Proxy     common.Address
+}, error) {
+	return _DisputeGameFactory.Contract.GameAtIndex(&_DisputeGameFactory.CallOpts, _index)
+}
+
+// GameCount is a free data retrieval call binding the contract method 0x4d1975b4.
+//
+// Solidity: function gameCount() view returns(uint256 gameCount_)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) GameCount(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "gameCount")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GameCount is a free data retrieval call binding the contract method 0x4d1975b4.
+//
+// Solidity: function gameCount() view returns(uint256 gameCount_)
+func (_DisputeGameFactory *DisputeGameFactorySession) GameCount() (*big.Int, error) {
+	return _DisputeGameFactory.Contract.GameCount(&_DisputeGameFactory.CallOpts)
+}
+
+// GameCount is a free data retrieval call binding the contract method 0x4d1975b4.
+//
+// Solidity: function gameCount() view returns(uint256 gameCount_)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) GameCount() (*big.Int, error) {
+	return _DisputeGameFactory.Contract.GameCount(&_DisputeGameFactory.CallOpts)
+}
+
+// GameImpls is a free data retrieval call binding the contract method 0x1b685b9e.
+//
+// Solidity: function gameImpls(uint32 ) view returns(address)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) GameImpls(opts *bind.CallOpts, arg0 uint32) (common.Address, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "gameImpls", arg0)
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// GameImpls is a free data retrieval call binding the contract method 0x1b685b9e.
+//
+// Solidity: function gameImpls(uint32 ) view returns(address)
+func (_DisputeGameFactory *DisputeGameFactorySession) GameImpls(arg0 uint32) (common.Address, error) {
+	return _DisputeGameFactory.Contract.GameImpls(&_DisputeGameFactory.CallOpts, arg0)
+}
+
+// GameImpls is a free data retrieval call binding the contract method 0x1b685b9e.
+//
+// Solidity: function gameImpls(uint32 ) view returns(address)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) GameImpls(arg0 uint32) (common.Address, error) {
+	return _DisputeGameFactory.Contract.GameImpls(&_DisputeGameFactory.CallOpts, arg0)
+}
+
+// Games is a free data retrieval call binding the contract method 0x5f0150cb.
+//
+// Solidity: function games(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) view returns(address proxy_, uint64 timestamp_)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) Games(opts *bind.CallOpts, _gameType uint32, _rootClaim [32]byte, _extraData []byte) (struct {
+	Proxy     common.Address
+	Timestamp uint64
+}, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "games", _gameType, _rootClaim, _extraData)
+
+	outstruct := new(struct {
+		Proxy     common.Address
+		Timestamp uint64
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.Proxy = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+	outstruct.Timestamp = *abi.ConvertType(out[1], new(uint64)).(*uint64)
+
+	return *outstruct, err
+
+}
+
+// Games is a free data retrieval call binding the contract method 0x5f0150cb.
+//
+// Solidity: function games(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) view returns(address proxy_, uint64 timestamp_)
+func (_DisputeGameFactory *DisputeGameFactorySession) Games(_gameType uint32, _rootClaim [32]byte, _extraData []byte) (struct {
+	Proxy     common.Address
+	Timestamp uint64
+}, error) {
+	return _DisputeGameFactory.Contract.Games(&_DisputeGameFactory.CallOpts, _gameType, _rootClaim, _extraData)
+}
+
+// Games is a free data retrieval call binding the contract method 0x5f0150cb.
+//
+// Solidity: function games(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) view returns(address proxy_, uint64 timestamp_)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) Games(_gameType uint32, _rootClaim [32]byte, _extraData []byte) (struct {
+	Proxy     common.Address
+	Timestamp uint64
+}, error) {
+	return _DisputeGameFactory.Contract.Games(&_DisputeGameFactory.CallOpts, _gameType, _rootClaim, _extraData)
+}
+
+// GetGameUUID is a free data retrieval call binding the contract method 0x96cd9720.
+//
+// Solidity: function getGameUUID(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) pure returns(bytes32 uuid_)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) GetGameUUID(opts *bind.CallOpts, _gameType uint32, _rootClaim [32]byte, _extraData []byte) ([32]byte, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "getGameUUID", _gameType, _rootClaim, _extraData)
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// GetGameUUID is a free data retrieval call binding the contract method 0x96cd9720.
+//
+// Solidity: function getGameUUID(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) pure returns(bytes32 uuid_)
+func (_DisputeGameFactory *DisputeGameFactorySession) GetGameUUID(_gameType uint32, _rootClaim [32]byte, _extraData []byte) ([32]byte, error) {
+	return _DisputeGameFactory.Contract.GetGameUUID(&_DisputeGameFactory.CallOpts, _gameType, _rootClaim, _extraData)
+}
+
+// GetGameUUID is a free data retrieval call binding the contract method 0x96cd9720.
+//
+// Solidity: function getGameUUID(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) pure returns(bytes32 uuid_)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) GetGameUUID(_gameType uint32, _rootClaim [32]byte, _extraData []byte) ([32]byte, error) {
+	return _DisputeGameFactory.Contract.GetGameUUID(&_DisputeGameFactory.CallOpts, _gameType, _rootClaim, _extraData)
+}
+
+// InitBonds is a free data retrieval call binding the contract method 0x6593dc6e.
+//
+// Solidity: function initBonds(uint32 ) view returns(uint256)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) InitBonds(opts *bind.CallOpts, arg0 uint32) (*big.Int, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "initBonds", arg0)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// InitBonds is a free data retrieval call binding the contract method 0x6593dc6e.
+//
+// Solidity: function initBonds(uint32 ) view returns(uint256)
+func (_DisputeGameFactory *DisputeGameFactorySession) InitBonds(arg0 uint32) (*big.Int, error) {
+	return _DisputeGameFactory.Contract.InitBonds(&_DisputeGameFactory.CallOpts, arg0)
+}
+
+// InitBonds is a free data retrieval call binding the contract method 0x6593dc6e.
+//
+// Solidity: function initBonds(uint32 ) view returns(uint256)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) InitBonds(arg0 uint32) (*big.Int, error) {
+	return _DisputeGameFactory.Contract.InitBonds(&_DisputeGameFactory.CallOpts, arg0)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "owner")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_DisputeGameFactory *DisputeGameFactorySession) Owner() (common.Address, error) {
+	return _DisputeGameFactory.Contract.Owner(&_DisputeGameFactory.CallOpts)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) Owner() (common.Address, error) {
+	return _DisputeGameFactory.Contract.Owner(&_DisputeGameFactory.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DisputeGameFactory *DisputeGameFactorySession) Version() (string, error) {
+	return _DisputeGameFactory.Contract.Version(&_DisputeGameFactory.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) Version() (string, error) {
+	return _DisputeGameFactory.Contract.Version(&_DisputeGameFactory.CallOpts)
+}
+
+// Create is a paid mutator transaction binding the contract method 0x82ecf2f6.
+//
+// Solidity: function create(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) payable returns(address proxy_)
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) Create(opts *bind.TransactOpts, _gameType uint32, _rootClaim [32]byte, _extraData []byte) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "create", _gameType, _rootClaim, _extraData)
+}
+
+// Create is a paid mutator transaction binding the contract method 0x82ecf2f6.
+//
+// Solidity: function create(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) payable returns(address proxy_)
+func (_DisputeGameFactory *DisputeGameFactorySession) Create(_gameType uint32, _rootClaim [32]byte, _extraData []byte) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.Create(&_DisputeGameFactory.TransactOpts, _gameType, _rootClaim, _extraData)
+}
+
+// Create is a paid mutator transaction binding the contract method 0x82ecf2f6.
+//
+// Solidity: function create(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) payable returns(address proxy_)
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) Create(_gameType uint32, _rootClaim [32]byte, _extraData []byte) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.Create(&_DisputeGameFactory.TransactOpts, _gameType, _rootClaim, _extraData)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _owner) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "initialize", _owner)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _owner) returns()
+func (_DisputeGameFactory *DisputeGameFactorySession) Initialize(_owner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.Initialize(&_DisputeGameFactory.TransactOpts, _owner)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _owner) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) Initialize(_owner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.Initialize(&_DisputeGameFactory.TransactOpts, _owner)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "renounceOwnership")
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_DisputeGameFactory *DisputeGameFactorySession) RenounceOwnership() (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.RenounceOwnership(&_DisputeGameFactory.TransactOpts)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) RenounceOwnership() (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.RenounceOwnership(&_DisputeGameFactory.TransactOpts)
+}
+
+// SetImplementation is a paid mutator transaction binding the contract method 0x14f6b1a3.
+//
+// Solidity: function setImplementation(uint32 _gameType, address _impl) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) SetImplementation(opts *bind.TransactOpts, _gameType uint32, _impl common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "setImplementation", _gameType, _impl)
+}
+
+// SetImplementation is a paid mutator transaction binding the contract method 0x14f6b1a3.
+//
+// Solidity: function setImplementation(uint32 _gameType, address _impl) returns()
+func (_DisputeGameFactory *DisputeGameFactorySession) SetImplementation(_gameType uint32, _impl common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.SetImplementation(&_DisputeGameFactory.TransactOpts, _gameType, _impl)
+}
+
+// SetImplementation is a paid mutator transaction binding the contract method 0x14f6b1a3.
+//
+// Solidity: function setImplementation(uint32 _gameType, address _impl) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) SetImplementation(_gameType uint32, _impl common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.SetImplementation(&_DisputeGameFactory.TransactOpts, _gameType, _impl)
+}
+
+// SetInitBond is a paid mutator transaction binding the contract method 0x1e334240.
+//
+// Solidity: function setInitBond(uint32 _gameType, uint256 _initBond) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) SetInitBond(opts *bind.TransactOpts, _gameType uint32, _initBond *big.Int) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "setInitBond", _gameType, _initBond)
+}
+
+// SetInitBond is a paid mutator transaction binding the contract method 0x1e334240.
+//
+// Solidity: function setInitBond(uint32 _gameType, uint256 _initBond) returns()
+func (_DisputeGameFactory *DisputeGameFactorySession) SetInitBond(_gameType uint32, _initBond *big.Int) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.SetInitBond(&_DisputeGameFactory.TransactOpts, _gameType, _initBond)
+}
+
+// SetInitBond is a paid mutator transaction binding the contract method 0x1e334240.
+//
+// Solidity: function setInitBond(uint32 _gameType, uint256 _initBond) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) SetInitBond(_gameType uint32, _initBond *big.Int) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.SetInitBond(&_DisputeGameFactory.TransactOpts, _gameType, _initBond)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "transferOwnership", newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_DisputeGameFactory *DisputeGameFactorySession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.TransferOwnership(&_DisputeGameFactory.TransactOpts, newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.TransferOwnership(&_DisputeGameFactory.TransactOpts, newOwner)
+}
+
+// DisputeGameFactoryDisputeGameCreatedIterator is returned from FilterDisputeGameCreated and is used to iterate over the raw logs and unpacked data for DisputeGameCreated events raised by the DisputeGameFactory contract.
+type DisputeGameFactoryDisputeGameCreatedIterator struct {
+	Event *DisputeGameFactoryDisputeGameCreated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DisputeGameFactoryDisputeGameCreatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(DisputeGameFactoryDisputeGameCreated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(DisputeGameFactoryDisputeGameCreated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DisputeGameFactoryDisputeGameCreatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DisputeGameFactoryDisputeGameCreatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// DisputeGameFactoryDisputeGameCreated represents a DisputeGameCreated event raised by the DisputeGameFactory contract.
+type DisputeGameFactoryDisputeGameCreated struct {
+	DisputeProxy common.Address
+	GameType     uint32
+	RootClaim    [32]byte
+	Raw          types.Log // Blockchain specific contextual infos
+}
+
+// FilterDisputeGameCreated is a free log retrieval operation binding the contract event 0x5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e35.
+//
+// Solidity: event DisputeGameCreated(address indexed disputeProxy, uint32 indexed gameType, bytes32 indexed rootClaim)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) FilterDisputeGameCreated(opts *bind.FilterOpts, disputeProxy []common.Address, gameType []uint32, rootClaim [][32]byte) (*DisputeGameFactoryDisputeGameCreatedIterator, error) {
+
+	var disputeProxyRule []interface{}
+	for _, disputeProxyItem := range disputeProxy {
+		disputeProxyRule = append(disputeProxyRule, disputeProxyItem)
+	}
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+	var rootClaimRule []interface{}
+	for _, rootClaimItem := range rootClaim {
+		rootClaimRule = append(rootClaimRule, rootClaimItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.FilterLogs(opts, "DisputeGameCreated", disputeProxyRule, gameTypeRule, rootClaimRule)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryDisputeGameCreatedIterator{contract: _DisputeGameFactory.contract, event: "DisputeGameCreated", logs: logs, sub: sub}, nil
+}
+
+// WatchDisputeGameCreated is a free log subscription operation binding the contract event 0x5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e35.
+//
+// Solidity: event DisputeGameCreated(address indexed disputeProxy, uint32 indexed gameType, bytes32 indexed rootClaim)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) WatchDisputeGameCreated(opts *bind.WatchOpts, sink chan<- *DisputeGameFactoryDisputeGameCreated, disputeProxy []common.Address, gameType []uint32, rootClaim [][32]byte) (event.Subscription, error) {
+
+	var disputeProxyRule []interface{}
+	for _, disputeProxyItem := range disputeProxy {
+		disputeProxyRule = append(disputeProxyRule, disputeProxyItem)
+	}
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+	var rootClaimRule []interface{}
+	for _, rootClaimItem := range rootClaim {
+		rootClaimRule = append(rootClaimRule, rootClaimItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.WatchLogs(opts, "DisputeGameCreated", disputeProxyRule, gameTypeRule, rootClaimRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(DisputeGameFactoryDisputeGameCreated)
+				if err := _DisputeGameFactory.contract.UnpackLog(event, "DisputeGameCreated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseDisputeGameCreated is a log parse operation binding the contract event 0x5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e35.
+//
+// Solidity: event DisputeGameCreated(address indexed disputeProxy, uint32 indexed gameType, bytes32 indexed rootClaim)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) ParseDisputeGameCreated(log types.Log) (*DisputeGameFactoryDisputeGameCreated, error) {
+	event := new(DisputeGameFactoryDisputeGameCreated)
+	if err := _DisputeGameFactory.contract.UnpackLog(event, "DisputeGameCreated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// DisputeGameFactoryImplementationSetIterator is returned from FilterImplementationSet and is used to iterate over the raw logs and unpacked data for ImplementationSet events raised by the DisputeGameFactory contract.
+type DisputeGameFactoryImplementationSetIterator struct {
+	Event *DisputeGameFactoryImplementationSet // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DisputeGameFactoryImplementationSetIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(DisputeGameFactoryImplementationSet)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(DisputeGameFactoryImplementationSet)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DisputeGameFactoryImplementationSetIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DisputeGameFactoryImplementationSetIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// DisputeGameFactoryImplementationSet represents a ImplementationSet event raised by the DisputeGameFactory contract.
+type DisputeGameFactoryImplementationSet struct {
+	Impl     common.Address
+	GameType uint32
+	Raw      types.Log // Blockchain specific contextual infos
+}
+
+// FilterImplementationSet is a free log retrieval operation binding the contract event 0xff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de.
+//
+// Solidity: event ImplementationSet(address indexed impl, uint32 indexed gameType)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) FilterImplementationSet(opts *bind.FilterOpts, impl []common.Address, gameType []uint32) (*DisputeGameFactoryImplementationSetIterator, error) {
+
+	var implRule []interface{}
+	for _, implItem := range impl {
+		implRule = append(implRule, implItem)
+	}
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.FilterLogs(opts, "ImplementationSet", implRule, gameTypeRule)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryImplementationSetIterator{contract: _DisputeGameFactory.contract, event: "ImplementationSet", logs: logs, sub: sub}, nil
+}
+
+// WatchImplementationSet is a free log subscription operation binding the contract event 0xff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de.
+//
+// Solidity: event ImplementationSet(address indexed impl, uint32 indexed gameType)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) WatchImplementationSet(opts *bind.WatchOpts, sink chan<- *DisputeGameFactoryImplementationSet, impl []common.Address, gameType []uint32) (event.Subscription, error) {
+
+	var implRule []interface{}
+	for _, implItem := range impl {
+		implRule = append(implRule, implItem)
+	}
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.WatchLogs(opts, "ImplementationSet", implRule, gameTypeRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(DisputeGameFactoryImplementationSet)
+				if err := _DisputeGameFactory.contract.UnpackLog(event, "ImplementationSet", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseImplementationSet is a log parse operation binding the contract event 0xff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de.
+//
+// Solidity: event ImplementationSet(address indexed impl, uint32 indexed gameType)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) ParseImplementationSet(log types.Log) (*DisputeGameFactoryImplementationSet, error) {
+	event := new(DisputeGameFactoryImplementationSet)
+	if err := _DisputeGameFactory.contract.UnpackLog(event, "ImplementationSet", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// DisputeGameFactoryInitBondUpdatedIterator is returned from FilterInitBondUpdated and is used to iterate over the raw logs and unpacked data for InitBondUpdated events raised by the DisputeGameFactory contract.
+type DisputeGameFactoryInitBondUpdatedIterator struct {
+	Event *DisputeGameFactoryInitBondUpdated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DisputeGameFactoryInitBondUpdatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(DisputeGameFactoryInitBondUpdated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(DisputeGameFactoryInitBondUpdated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DisputeGameFactoryInitBondUpdatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DisputeGameFactoryInitBondUpdatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// DisputeGameFactoryInitBondUpdated represents a InitBondUpdated event raised by the DisputeGameFactory contract.
+type DisputeGameFactoryInitBondUpdated struct {
+	GameType uint32
+	NewBond  *big.Int
+	Raw      types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitBondUpdated is a free log retrieval operation binding the contract event 0x74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca.
+//
+// Solidity: event InitBondUpdated(uint32 indexed gameType, uint256 indexed newBond)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) FilterInitBondUpdated(opts *bind.FilterOpts, gameType []uint32, newBond []*big.Int) (*DisputeGameFactoryInitBondUpdatedIterator, error) {
+
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+	var newBondRule []interface{}
+	for _, newBondItem := range newBond {
+		newBondRule = append(newBondRule, newBondItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.FilterLogs(opts, "InitBondUpdated", gameTypeRule, newBondRule)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryInitBondUpdatedIterator{contract: _DisputeGameFactory.contract, event: "InitBondUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchInitBondUpdated is a free log subscription operation binding the contract event 0x74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca.
+//
+// Solidity: event InitBondUpdated(uint32 indexed gameType, uint256 indexed newBond)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) WatchInitBondUpdated(opts *bind.WatchOpts, sink chan<- *DisputeGameFactoryInitBondUpdated, gameType []uint32, newBond []*big.Int) (event.Subscription, error) {
+
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+	var newBondRule []interface{}
+	for _, newBondItem := range newBond {
+		newBondRule = append(newBondRule, newBondItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.WatchLogs(opts, "InitBondUpdated", gameTypeRule, newBondRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(DisputeGameFactoryInitBondUpdated)
+				if err := _DisputeGameFactory.contract.UnpackLog(event, "InitBondUpdated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitBondUpdated is a log parse operation binding the contract event 0x74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca.
+//
+// Solidity: event InitBondUpdated(uint32 indexed gameType, uint256 indexed newBond)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) ParseInitBondUpdated(log types.Log) (*DisputeGameFactoryInitBondUpdated, error) {
+	event := new(DisputeGameFactoryInitBondUpdated)
+	if err := _DisputeGameFactory.contract.UnpackLog(event, "InitBondUpdated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// DisputeGameFactoryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the DisputeGameFactory contract.
+type DisputeGameFactoryInitializedIterator struct {
+	Event *DisputeGameFactoryInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DisputeGameFactoryInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(DisputeGameFactoryInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(DisputeGameFactoryInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DisputeGameFactoryInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DisputeGameFactoryInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// DisputeGameFactoryInitialized represents a Initialized event raised by the DisputeGameFactory contract.
+type DisputeGameFactoryInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) FilterInitialized(opts *bind.FilterOpts) (*DisputeGameFactoryInitializedIterator, error) {
+
+	logs, sub, err := _DisputeGameFactory.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryInitializedIterator{contract: _DisputeGameFactory.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *DisputeGameFactoryInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _DisputeGameFactory.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(DisputeGameFactoryInitialized)
+				if err := _DisputeGameFactory.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) ParseInitialized(log types.Log) (*DisputeGameFactoryInitialized, error) {
+	event := new(DisputeGameFactoryInitialized)
+	if err := _DisputeGameFactory.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// DisputeGameFactoryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the DisputeGameFactory contract.
+type DisputeGameFactoryOwnershipTransferredIterator struct {
+	Event *DisputeGameFactoryOwnershipTransferred // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DisputeGameFactoryOwnershipTransferredIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(DisputeGameFactoryOwnershipTransferred)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(DisputeGameFactoryOwnershipTransferred)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DisputeGameFactoryOwnershipTransferredIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DisputeGameFactoryOwnershipTransferredIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// DisputeGameFactoryOwnershipTransferred represents a OwnershipTransferred event raised by the DisputeGameFactory contract.
+type DisputeGameFactoryOwnershipTransferred struct {
+	PreviousOwner common.Address
+	NewOwner      common.Address
+	Raw           types.Log // Blockchain specific contextual infos
+}
+
+// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*DisputeGameFactoryOwnershipTransferredIterator, error) {
+
+	var previousOwnerRule []interface{}
+	for _, previousOwnerItem := range previousOwner {
+		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+	}
+	var newOwnerRule []interface{}
+	for _, newOwnerItem := range newOwner {
+		newOwnerRule = append(newOwnerRule, newOwnerItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryOwnershipTransferredIterator{contract: _DisputeGameFactory.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *DisputeGameFactoryOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) {
+
+	var previousOwnerRule []interface{}
+	for _, previousOwnerItem := range previousOwner {
+		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+	}
+	var newOwnerRule []interface{}
+	for _, newOwnerItem := range newOwner {
+		newOwnerRule = append(newOwnerRule, newOwnerItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(DisputeGameFactoryOwnershipTransferred)
+				if err := _DisputeGameFactory.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) ParseOwnershipTransferred(log types.Log) (*DisputeGameFactoryOwnershipTransferred, error) {
+	event := new(DisputeGameFactoryOwnershipTransferred)
+	if err := _DisputeGameFactory.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-bindings/bindings/l1block.go b/op-node/bindings/l1block.go
similarity index 100%
rename from op-bindings/bindings/l1block.go
rename to op-node/bindings/l1block.go
diff --git a/op-node/bindings/l2outputoracle.go b/op-node/bindings/l2outputoracle.go
new file mode 100644
index 000000000000..1d8934c7c838
--- /dev/null
+++ b/op-node/bindings/l2outputoracle.go
@@ -0,0 +1,1373 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// TypesOutputProposal is an auto generated low-level Go binding around an user-defined struct.
+type TypesOutputProposal struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2BlockNumber *big.Int
+}
+
+// L2OutputOracleMetaData contains all meta data concerning the L2OutputOracle contract.
+var L2OutputOracleMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CHALLENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_BLOCK_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PROPOSER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SUBMISSION_INTERVAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"challenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"computeL2Timestamp\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteL2Outputs\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizationPeriodSeconds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2Output\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputProposal\",\"components\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2OutputAfter\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputProposal\",\"components\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2OutputIndexAfter\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_submissionInterval\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l2BlockTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingBlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l2BlockTime\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestOutputIndex\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextOutputIndex\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeL2Output\",\"inputs\":[{\"name\":\"_outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proposer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"startingBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"startingTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionInterval\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputProposed\",\"inputs\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"l2OutputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"l1Timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputsDeleted\",\"inputs\":[{\"name\":\"prevNextOutputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"newNextOutputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+	Bin: "0x60806040523480156200001157600080fd5b50620000256001806000808080806200002b565b62000328565b600054610100900460ff16158080156200004c5750600054600160ff909116105b806200007c575062000069306200031960201b6200135d1760201c565b1580156200007c575060005460ff166001145b620000e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000109576000805461ff0019166101001790555b60008811620001815760405162461bcd60e51b815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e20300000000000006064820152608401620000dc565b60008711620001f95760405162461bcd60e51b815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e20300000000000000000000000006064820152608401620000dc565b428511156200027f5760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201526374696d6560e01b608482015260a401620000dc565b6004889055600587905560018690556002859055600780546001600160a01b038087166001600160a01b0319928316179092556006805492861692909116919091179055600882905580156200030f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6001600160a01b03163b151590565b6115d580620003386000396000f3fe60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a",
+}
+
+// L2OutputOracleABI is the input ABI used to generate the binding from.
+// Deprecated: Use L2OutputOracleMetaData.ABI instead.
+var L2OutputOracleABI = L2OutputOracleMetaData.ABI
+
+// L2OutputOracleBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L2OutputOracleMetaData.Bin instead.
+var L2OutputOracleBin = L2OutputOracleMetaData.Bin
+
+// DeployL2OutputOracle deploys a new Ethereum contract, binding an instance of L2OutputOracle to it.
+func DeployL2OutputOracle(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L2OutputOracle, error) {
+	parsed, err := L2OutputOracleMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2OutputOracleBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L2OutputOracle{L2OutputOracleCaller: L2OutputOracleCaller{contract: contract}, L2OutputOracleTransactor: L2OutputOracleTransactor{contract: contract}, L2OutputOracleFilterer: L2OutputOracleFilterer{contract: contract}}, nil
+}
+
+// L2OutputOracle is an auto generated Go binding around an Ethereum contract.
+type L2OutputOracle struct {
+	L2OutputOracleCaller     // Read-only binding to the contract
+	L2OutputOracleTransactor // Write-only binding to the contract
+	L2OutputOracleFilterer   // Log filterer for contract events
+}
+
+// L2OutputOracleCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L2OutputOracleCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L2OutputOracleTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L2OutputOracleFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L2OutputOracleSession struct {
+	Contract     *L2OutputOracle   // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// L2OutputOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L2OutputOracleCallerSession struct {
+	Contract *L2OutputOracleCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts         // Call options to use throughout this session
+}
+
+// L2OutputOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L2OutputOracleTransactorSession struct {
+	Contract     *L2OutputOracleTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
+}
+
+// L2OutputOracleRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L2OutputOracleRaw struct {
+	Contract *L2OutputOracle // Generic contract binding to access the raw methods on
+}
+
+// L2OutputOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L2OutputOracleCallerRaw struct {
+	Contract *L2OutputOracleCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L2OutputOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L2OutputOracleTransactorRaw struct {
+	Contract *L2OutputOracleTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL2OutputOracle creates a new instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracle(address common.Address, backend bind.ContractBackend) (*L2OutputOracle, error) {
+	contract, err := bindL2OutputOracle(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracle{L2OutputOracleCaller: L2OutputOracleCaller{contract: contract}, L2OutputOracleTransactor: L2OutputOracleTransactor{contract: contract}, L2OutputOracleFilterer: L2OutputOracleFilterer{contract: contract}}, nil
+}
+
+// NewL2OutputOracleCaller creates a new read-only instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleCaller(address common.Address, caller bind.ContractCaller) (*L2OutputOracleCaller, error) {
+	contract, err := bindL2OutputOracle(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleCaller{contract: contract}, nil
+}
+
+// NewL2OutputOracleTransactor creates a new write-only instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*L2OutputOracleTransactor, error) {
+	contract, err := bindL2OutputOracle(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleTransactor{contract: contract}, nil
+}
+
+// NewL2OutputOracleFilterer creates a new log filterer instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleFilterer(address common.Address, filterer bind.ContractFilterer) (*L2OutputOracleFilterer, error) {
+	contract, err := bindL2OutputOracle(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleFilterer{contract: contract}, nil
+}
+
+// bindL2OutputOracle binds a generic wrapper to an already deployed contract.
+func bindL2OutputOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L2OutputOracleABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2OutputOracle *L2OutputOracleRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2OutputOracle.Contract.L2OutputOracleCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2OutputOracle *L2OutputOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.L2OutputOracleTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2OutputOracle *L2OutputOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.L2OutputOracleTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2OutputOracle *L2OutputOracleCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2OutputOracle.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2OutputOracle *L2OutputOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2OutputOracle *L2OutputOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.contract.Transact(opts, method, params...)
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) CHALLENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "CHALLENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) CHALLENGER() (common.Address, error) {
+	return _L2OutputOracle.Contract.CHALLENGER(&_L2OutputOracle.CallOpts)
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) CHALLENGER() (common.Address, error) {
+	return _L2OutputOracle.Contract.CHALLENGER(&_L2OutputOracle.CallOpts)
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) FINALIZATIONPERIODSECONDS(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "FINALIZATION_PERIOD_SECONDS")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) FINALIZATIONPERIODSECONDS() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FINALIZATIONPERIODSECONDS(&_L2OutputOracle.CallOpts)
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) FINALIZATIONPERIODSECONDS() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FINALIZATIONPERIODSECONDS(&_L2OutputOracle.CallOpts)
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) L2BLOCKTIME(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "L2_BLOCK_TIME")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) L2BLOCKTIME() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BLOCKTIME(&_L2OutputOracle.CallOpts)
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) L2BLOCKTIME() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BLOCKTIME(&_L2OutputOracle.CallOpts)
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) PROPOSER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "PROPOSER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) PROPOSER() (common.Address, error) {
+	return _L2OutputOracle.Contract.PROPOSER(&_L2OutputOracle.CallOpts)
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) PROPOSER() (common.Address, error) {
+	return _L2OutputOracle.Contract.PROPOSER(&_L2OutputOracle.CallOpts)
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) SUBMISSIONINTERVAL(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "SUBMISSION_INTERVAL")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) SUBMISSIONINTERVAL() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SUBMISSIONINTERVAL(&_L2OutputOracle.CallOpts)
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) SUBMISSIONINTERVAL() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SUBMISSIONINTERVAL(&_L2OutputOracle.CallOpts)
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) Challenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "challenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) Challenger() (common.Address, error) {
+	return _L2OutputOracle.Contract.Challenger(&_L2OutputOracle.CallOpts)
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Challenger() (common.Address, error) {
+	return _L2OutputOracle.Contract.Challenger(&_L2OutputOracle.CallOpts)
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) ComputeL2Timestamp(opts *bind.CallOpts, _l2BlockNumber *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "computeL2Timestamp", _l2BlockNumber)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) ComputeL2Timestamp(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.ComputeL2Timestamp(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) ComputeL2Timestamp(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.ComputeL2Timestamp(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) FinalizationPeriodSeconds(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "finalizationPeriodSeconds")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) FinalizationPeriodSeconds() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FinalizationPeriodSeconds(&_L2OutputOracle.CallOpts)
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) FinalizationPeriodSeconds() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FinalizationPeriodSeconds(&_L2OutputOracle.CallOpts)
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2Output(opts *bind.CallOpts, _l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2Output", _l2OutputIndex)
+
+	if err != nil {
+		return *new(TypesOutputProposal), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(TypesOutputProposal)).(*TypesOutputProposal)
+
+	return out0, err
+
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleSession) GetL2Output(_l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2Output(&_L2OutputOracle.CallOpts, _l2OutputIndex)
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2Output(_l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2Output(&_L2OutputOracle.CallOpts, _l2OutputIndex)
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2OutputAfter(opts *bind.CallOpts, _l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2OutputAfter", _l2BlockNumber)
+
+	if err != nil {
+		return *new(TypesOutputProposal), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(TypesOutputProposal)).(*TypesOutputProposal)
+
+	return out0, err
+
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleSession) GetL2OutputAfter(_l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2OutputAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2OutputAfter(_l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2OutputAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2OutputIndexAfter(opts *bind.CallOpts, _l2BlockNumber *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2OutputIndexAfter", _l2BlockNumber)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) GetL2OutputIndexAfter(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.GetL2OutputIndexAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2OutputIndexAfter(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.GetL2OutputIndexAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) L2BlockTime(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "l2BlockTime")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) L2BlockTime() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BlockTime(&_L2OutputOracle.CallOpts)
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) L2BlockTime() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BlockTime(&_L2OutputOracle.CallOpts)
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) LatestBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "latestBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) LatestBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) LatestBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) LatestOutputIndex(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "latestOutputIndex")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) LatestOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) LatestOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) NextBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "nextBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) NextBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) NextBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) NextOutputIndex(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "nextOutputIndex")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) NextOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) NextOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) Proposer(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "proposer")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) Proposer() (common.Address, error) {
+	return _L2OutputOracle.Contract.Proposer(&_L2OutputOracle.CallOpts)
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Proposer() (common.Address, error) {
+	return _L2OutputOracle.Contract.Proposer(&_L2OutputOracle.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) StartingBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "startingBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) StartingBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) StartingBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) StartingTimestamp(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "startingTimestamp")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) StartingTimestamp() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingTimestamp(&_L2OutputOracle.CallOpts)
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) StartingTimestamp() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingTimestamp(&_L2OutputOracle.CallOpts)
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) SubmissionInterval(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "submissionInterval")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) SubmissionInterval() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SubmissionInterval(&_L2OutputOracle.CallOpts)
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) SubmissionInterval() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SubmissionInterval(&_L2OutputOracle.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleSession) Version() (string, error) {
+	return _L2OutputOracle.Contract.Version(&_L2OutputOracle.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Version() (string, error) {
+	return _L2OutputOracle.Contract.Version(&_L2OutputOracle.CallOpts)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) DeleteL2Outputs(opts *bind.TransactOpts, _l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "deleteL2Outputs", _l2OutputIndex)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleSession) DeleteL2Outputs(_l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.DeleteL2Outputs(&_L2OutputOracle.TransactOpts, _l2OutputIndex)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) DeleteL2Outputs(_l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.DeleteL2Outputs(&_L2OutputOracle.TransactOpts, _l2OutputIndex)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) Initialize(opts *bind.TransactOpts, _submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "initialize", _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleSession) Initialize(_submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) Initialize(_submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) ProposeL2Output(opts *bind.TransactOpts, _outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "proposeL2Output", _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleSession) ProposeL2Output(_outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.ProposeL2Output(&_L2OutputOracle.TransactOpts, _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) ProposeL2Output(_outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.ProposeL2Output(&_L2OutputOracle.TransactOpts, _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// L2OutputOracleInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L2OutputOracle contract.
+type L2OutputOracleInitializedIterator struct {
+	Event *L2OutputOracleInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleInitialized represents a Initialized event raised by the L2OutputOracle contract.
+type L2OutputOracleInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterInitialized(opts *bind.FilterOpts) (*L2OutputOracleInitializedIterator, error) {
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleInitializedIterator{contract: _L2OutputOracle.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L2OutputOracleInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleInitialized)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseInitialized(log types.Log) (*L2OutputOracleInitialized, error) {
+	event := new(L2OutputOracleInitialized)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2OutputOracleOutputProposedIterator is returned from FilterOutputProposed and is used to iterate over the raw logs and unpacked data for OutputProposed events raised by the L2OutputOracle contract.
+type L2OutputOracleOutputProposedIterator struct {
+	Event *L2OutputOracleOutputProposed // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleOutputProposedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleOutputProposed)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleOutputProposed)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleOutputProposedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleOutputProposedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleOutputProposed represents a OutputProposed event raised by the L2OutputOracle contract.
+type L2OutputOracleOutputProposed struct {
+	OutputRoot    [32]byte
+	L2OutputIndex *big.Int
+	L2BlockNumber *big.Int
+	L1Timestamp   *big.Int
+	Raw           types.Log // Blockchain specific contextual infos
+}
+
+// FilterOutputProposed is a free log retrieval operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputProposed(opts *bind.FilterOpts, outputRoot [][32]byte, l2OutputIndex []*big.Int, l2BlockNumber []*big.Int) (*L2OutputOracleOutputProposedIterator, error) {
+
+	var outputRootRule []interface{}
+	for _, outputRootItem := range outputRoot {
+		outputRootRule = append(outputRootRule, outputRootItem)
+	}
+	var l2OutputIndexRule []interface{}
+	for _, l2OutputIndexItem := range l2OutputIndex {
+		l2OutputIndexRule = append(l2OutputIndexRule, l2OutputIndexItem)
+	}
+	var l2BlockNumberRule []interface{}
+	for _, l2BlockNumberItem := range l2BlockNumber {
+		l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputProposed", outputRootRule, l2OutputIndexRule, l2BlockNumberRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleOutputProposedIterator{contract: _L2OutputOracle.contract, event: "OutputProposed", logs: logs, sub: sub}, nil
+}
+
+// WatchOutputProposed is a free log subscription operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputProposed(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputProposed, outputRoot [][32]byte, l2OutputIndex []*big.Int, l2BlockNumber []*big.Int) (event.Subscription, error) {
+
+	var outputRootRule []interface{}
+	for _, outputRootItem := range outputRoot {
+		outputRootRule = append(outputRootRule, outputRootItem)
+	}
+	var l2OutputIndexRule []interface{}
+	for _, l2OutputIndexItem := range l2OutputIndex {
+		l2OutputIndexRule = append(l2OutputIndexRule, l2OutputIndexItem)
+	}
+	var l2BlockNumberRule []interface{}
+	for _, l2BlockNumberItem := range l2BlockNumber {
+		l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputProposed", outputRootRule, l2OutputIndexRule, l2BlockNumberRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleOutputProposed)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "OutputProposed", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOutputProposed is a log parse operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseOutputProposed(log types.Log) (*L2OutputOracleOutputProposed, error) {
+	event := new(L2OutputOracleOutputProposed)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "OutputProposed", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2OutputOracleOutputsDeletedIterator is returned from FilterOutputsDeleted and is used to iterate over the raw logs and unpacked data for OutputsDeleted events raised by the L2OutputOracle contract.
+type L2OutputOracleOutputsDeletedIterator struct {
+	Event *L2OutputOracleOutputsDeleted // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleOutputsDeletedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleOutputsDeleted)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleOutputsDeleted)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleOutputsDeletedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleOutputsDeletedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleOutputsDeleted represents a OutputsDeleted event raised by the L2OutputOracle contract.
+type L2OutputOracleOutputsDeleted struct {
+	PrevNextOutputIndex *big.Int
+	NewNextOutputIndex  *big.Int
+	Raw                 types.Log // Blockchain specific contextual infos
+}
+
+// FilterOutputsDeleted is a free log retrieval operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputsDeleted(opts *bind.FilterOpts, prevNextOutputIndex []*big.Int, newNextOutputIndex []*big.Int) (*L2OutputOracleOutputsDeletedIterator, error) {
+
+	var prevNextOutputIndexRule []interface{}
+	for _, prevNextOutputIndexItem := range prevNextOutputIndex {
+		prevNextOutputIndexRule = append(prevNextOutputIndexRule, prevNextOutputIndexItem)
+	}
+	var newNextOutputIndexRule []interface{}
+	for _, newNextOutputIndexItem := range newNextOutputIndex {
+		newNextOutputIndexRule = append(newNextOutputIndexRule, newNextOutputIndexItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputsDeleted", prevNextOutputIndexRule, newNextOutputIndexRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleOutputsDeletedIterator{contract: _L2OutputOracle.contract, event: "OutputsDeleted", logs: logs, sub: sub}, nil
+}
+
+// WatchOutputsDeleted is a free log subscription operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputsDeleted(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputsDeleted, prevNextOutputIndex []*big.Int, newNextOutputIndex []*big.Int) (event.Subscription, error) {
+
+	var prevNextOutputIndexRule []interface{}
+	for _, prevNextOutputIndexItem := range prevNextOutputIndex {
+		prevNextOutputIndexRule = append(prevNextOutputIndexRule, prevNextOutputIndexItem)
+	}
+	var newNextOutputIndexRule []interface{}
+	for _, newNextOutputIndexItem := range newNextOutputIndex {
+		newNextOutputIndexRule = append(newNextOutputIndexRule, newNextOutputIndexItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputsDeleted", prevNextOutputIndexRule, newNextOutputIndexRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleOutputsDeleted)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "OutputsDeleted", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOutputsDeleted is a log parse operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseOutputsDeleted(log types.Log) (*L2OutputOracleOutputsDeleted, error) {
+	event := new(L2OutputOracleOutputsDeleted)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "OutputsDeleted", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-node/bindings/l2tol1messagepasser.go b/op-node/bindings/l2tol1messagepasser.go
new file mode 100644
index 000000000000..cc419d057adf
--- /dev/null
+++ b/op-node/bindings/l2tol1messagepasser.go
@@ -0,0 +1,699 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// L2ToL1MessagePasserMetaData contains all meta data concerning the L2ToL1MessagePasser contract.
+var L2ToL1MessagePasserMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"MESSAGE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initiateWithdrawal\",\"inputs\":[{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"messageNonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sentMessages\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"MessagePassed\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawerBalanceBurnt\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+	Bin: "0x608060405234801561001057600080fd5b506106d3806100206000396000f3fe6080604052600436106100695760003560e01c806382e3702d1161004357806382e3702d1461012a578063c2b3e5ac1461016a578063ecc704281461017d57600080fd5b80633f827a5a1461009257806344df8e70146100bf57806354fd4d50146100d457600080fd5b3661008d5761008b33620186a0604051806020016040528060008152506101e2565b005b600080fd5b34801561009e57600080fd5b506100a7600181565b60405161ffff90911681526020015b60405180910390f35b3480156100cb57600080fd5b5061008b6103a6565b3480156100e057600080fd5b5061011d6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b691906104d1565b34801561013657600080fd5b5061015a6101453660046104eb565b60006020819052908152604090205460ff1681565b60405190151581526020016100b6565b61008b610178366004610533565b6101e2565b34801561018957600080fd5b506101d46001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016100b6565b60006102786040518060c0016040528061023c6001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b815233602082015273ffffffffffffffffffffffffffffffffffffffff871660408201523460608201526080810186905260a0018490526103de565b600081815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055905073ffffffffffffffffffffffffffffffffffffffff8416336103136001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b7f02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054348787876040516103489493929190610637565b60405180910390a45050600180547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082168301167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b476103b08161042b565b60405181907f7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f90600090a250565b80516020808301516040808501516060860151608087015160a0880151935160009761040e979096959101610667565b604051602081830303815290604052805190602001209050919050565b806040516104389061045a565b6040518091039082f0905080158015610455573d6000803e3d6000fd5b505050565b6008806106bf83390190565b6000815180845260005b8181101561048c57602081850181015186830182015201610470565b8181111561049e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104e46020830184610466565b9392505050565b6000602082840312156104fd57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060006060848603121561054857600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461056c57600080fd5b925060208401359150604084013567ffffffffffffffff8082111561059057600080fd5b818601915086601f8301126105a457600080fd5b8135818111156105b6576105b6610504565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156105fc576105fc610504565b8160405282815289602084870101111561061557600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b8481528360208201526080604082015260006106566080830185610466565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526106b260c0830184610466565b9897505050505050505056fe608060405230fffea164736f6c634300080f000a",
+}
+
+// L2ToL1MessagePasserABI is the input ABI used to generate the binding from.
+// Deprecated: Use L2ToL1MessagePasserMetaData.ABI instead.
+var L2ToL1MessagePasserABI = L2ToL1MessagePasserMetaData.ABI
+
+// L2ToL1MessagePasserBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L2ToL1MessagePasserMetaData.Bin instead.
+var L2ToL1MessagePasserBin = L2ToL1MessagePasserMetaData.Bin
+
+// DeployL2ToL1MessagePasser deploys a new Ethereum contract, binding an instance of L2ToL1MessagePasser to it.
+func DeployL2ToL1MessagePasser(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L2ToL1MessagePasser, error) {
+	parsed, err := L2ToL1MessagePasserMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2ToL1MessagePasserBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L2ToL1MessagePasser{L2ToL1MessagePasserCaller: L2ToL1MessagePasserCaller{contract: contract}, L2ToL1MessagePasserTransactor: L2ToL1MessagePasserTransactor{contract: contract}, L2ToL1MessagePasserFilterer: L2ToL1MessagePasserFilterer{contract: contract}}, nil
+}
+
+// L2ToL1MessagePasser is an auto generated Go binding around an Ethereum contract.
+type L2ToL1MessagePasser struct {
+	L2ToL1MessagePasserCaller     // Read-only binding to the contract
+	L2ToL1MessagePasserTransactor // Write-only binding to the contract
+	L2ToL1MessagePasserFilterer   // Log filterer for contract events
+}
+
+// L2ToL1MessagePasserCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L2ToL1MessagePasserCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2ToL1MessagePasserTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L2ToL1MessagePasserTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2ToL1MessagePasserFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L2ToL1MessagePasserFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2ToL1MessagePasserSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L2ToL1MessagePasserSession struct {
+	Contract     *L2ToL1MessagePasser // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts        // Call options to use throughout this session
+	TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
+}
+
+// L2ToL1MessagePasserCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L2ToL1MessagePasserCallerSession struct {
+	Contract *L2ToL1MessagePasserCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts              // Call options to use throughout this session
+}
+
+// L2ToL1MessagePasserTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L2ToL1MessagePasserTransactorSession struct {
+	Contract     *L2ToL1MessagePasserTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
+}
+
+// L2ToL1MessagePasserRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L2ToL1MessagePasserRaw struct {
+	Contract *L2ToL1MessagePasser // Generic contract binding to access the raw methods on
+}
+
+// L2ToL1MessagePasserCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L2ToL1MessagePasserCallerRaw struct {
+	Contract *L2ToL1MessagePasserCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L2ToL1MessagePasserTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L2ToL1MessagePasserTransactorRaw struct {
+	Contract *L2ToL1MessagePasserTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL2ToL1MessagePasser creates a new instance of L2ToL1MessagePasser, bound to a specific deployed contract.
+func NewL2ToL1MessagePasser(address common.Address, backend bind.ContractBackend) (*L2ToL1MessagePasser, error) {
+	contract, err := bindL2ToL1MessagePasser(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasser{L2ToL1MessagePasserCaller: L2ToL1MessagePasserCaller{contract: contract}, L2ToL1MessagePasserTransactor: L2ToL1MessagePasserTransactor{contract: contract}, L2ToL1MessagePasserFilterer: L2ToL1MessagePasserFilterer{contract: contract}}, nil
+}
+
+// NewL2ToL1MessagePasserCaller creates a new read-only instance of L2ToL1MessagePasser, bound to a specific deployed contract.
+func NewL2ToL1MessagePasserCaller(address common.Address, caller bind.ContractCaller) (*L2ToL1MessagePasserCaller, error) {
+	contract, err := bindL2ToL1MessagePasser(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasserCaller{contract: contract}, nil
+}
+
+// NewL2ToL1MessagePasserTransactor creates a new write-only instance of L2ToL1MessagePasser, bound to a specific deployed contract.
+func NewL2ToL1MessagePasserTransactor(address common.Address, transactor bind.ContractTransactor) (*L2ToL1MessagePasserTransactor, error) {
+	contract, err := bindL2ToL1MessagePasser(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasserTransactor{contract: contract}, nil
+}
+
+// NewL2ToL1MessagePasserFilterer creates a new log filterer instance of L2ToL1MessagePasser, bound to a specific deployed contract.
+func NewL2ToL1MessagePasserFilterer(address common.Address, filterer bind.ContractFilterer) (*L2ToL1MessagePasserFilterer, error) {
+	contract, err := bindL2ToL1MessagePasser(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasserFilterer{contract: contract}, nil
+}
+
+// bindL2ToL1MessagePasser binds a generic wrapper to an already deployed contract.
+func bindL2ToL1MessagePasser(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L2ToL1MessagePasserABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2ToL1MessagePasser.Contract.L2ToL1MessagePasserCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.L2ToL1MessagePasserTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.L2ToL1MessagePasserTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2ToL1MessagePasser.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.contract.Transact(opts, method, params...)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCaller) MESSAGEVERSION(opts *bind.CallOpts) (uint16, error) {
+	var out []interface{}
+	err := _L2ToL1MessagePasser.contract.Call(opts, &out, "MESSAGE_VERSION")
+
+	if err != nil {
+		return *new(uint16), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
+
+	return out0, err
+
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) MESSAGEVERSION() (uint16, error) {
+	return _L2ToL1MessagePasser.Contract.MESSAGEVERSION(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a.
+//
+// Solidity: function MESSAGE_VERSION() view returns(uint16)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCallerSession) MESSAGEVERSION() (uint16, error) {
+	return _L2ToL1MessagePasser.Contract.MESSAGEVERSION(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCaller) MessageNonce(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2ToL1MessagePasser.contract.Call(opts, &out, "messageNonce")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) MessageNonce() (*big.Int, error) {
+	return _L2ToL1MessagePasser.Contract.MessageNonce(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// MessageNonce is a free data retrieval call binding the contract method 0xecc70428.
+//
+// Solidity: function messageNonce() view returns(uint256)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCallerSession) MessageNonce() (*big.Int, error) {
+	return _L2ToL1MessagePasser.Contract.MessageNonce(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// SentMessages is a free data retrieval call binding the contract method 0x82e3702d.
+//
+// Solidity: function sentMessages(bytes32 ) view returns(bool)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCaller) SentMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _L2ToL1MessagePasser.contract.Call(opts, &out, "sentMessages", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// SentMessages is a free data retrieval call binding the contract method 0x82e3702d.
+//
+// Solidity: function sentMessages(bytes32 ) view returns(bool)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) SentMessages(arg0 [32]byte) (bool, error) {
+	return _L2ToL1MessagePasser.Contract.SentMessages(&_L2ToL1MessagePasser.CallOpts, arg0)
+}
+
+// SentMessages is a free data retrieval call binding the contract method 0x82e3702d.
+//
+// Solidity: function sentMessages(bytes32 ) view returns(bool)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCallerSession) SentMessages(arg0 [32]byte) (bool, error) {
+	return _L2ToL1MessagePasser.Contract.SentMessages(&_L2ToL1MessagePasser.CallOpts, arg0)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L2ToL1MessagePasser.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) Version() (string, error) {
+	return _L2ToL1MessagePasser.Contract.Version(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserCallerSession) Version() (string, error) {
+	return _L2ToL1MessagePasser.Contract.Version(&_L2ToL1MessagePasser.CallOpts)
+}
+
+// Burn is a paid mutator transaction binding the contract method 0x44df8e70.
+//
+// Solidity: function burn() returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactor) Burn(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.contract.Transact(opts, "burn")
+}
+
+// Burn is a paid mutator transaction binding the contract method 0x44df8e70.
+//
+// Solidity: function burn() returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) Burn() (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.Burn(&_L2ToL1MessagePasser.TransactOpts)
+}
+
+// Burn is a paid mutator transaction binding the contract method 0x44df8e70.
+//
+// Solidity: function burn() returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactorSession) Burn() (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.Burn(&_L2ToL1MessagePasser.TransactOpts)
+}
+
+// InitiateWithdrawal is a paid mutator transaction binding the contract method 0xc2b3e5ac.
+//
+// Solidity: function initiateWithdrawal(address _target, uint256 _gasLimit, bytes _data) payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactor) InitiateWithdrawal(opts *bind.TransactOpts, _target common.Address, _gasLimit *big.Int, _data []byte) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.contract.Transact(opts, "initiateWithdrawal", _target, _gasLimit, _data)
+}
+
+// InitiateWithdrawal is a paid mutator transaction binding the contract method 0xc2b3e5ac.
+//
+// Solidity: function initiateWithdrawal(address _target, uint256 _gasLimit, bytes _data) payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) InitiateWithdrawal(_target common.Address, _gasLimit *big.Int, _data []byte) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.InitiateWithdrawal(&_L2ToL1MessagePasser.TransactOpts, _target, _gasLimit, _data)
+}
+
+// InitiateWithdrawal is a paid mutator transaction binding the contract method 0xc2b3e5ac.
+//
+// Solidity: function initiateWithdrawal(address _target, uint256 _gasLimit, bytes _data) payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactorSession) InitiateWithdrawal(_target common.Address, _gasLimit *big.Int, _data []byte) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.InitiateWithdrawal(&_L2ToL1MessagePasser.TransactOpts, _target, _gasLimit, _data)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserSession) Receive() (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.Receive(&_L2ToL1MessagePasser.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserTransactorSession) Receive() (*types.Transaction, error) {
+	return _L2ToL1MessagePasser.Contract.Receive(&_L2ToL1MessagePasser.TransactOpts)
+}
+
+// L2ToL1MessagePasserMessagePassedIterator is returned from FilterMessagePassed and is used to iterate over the raw logs and unpacked data for MessagePassed events raised by the L2ToL1MessagePasser contract.
+type L2ToL1MessagePasserMessagePassedIterator struct {
+	Event *L2ToL1MessagePasserMessagePassed // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2ToL1MessagePasserMessagePassedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2ToL1MessagePasserMessagePassed)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2ToL1MessagePasserMessagePassed)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2ToL1MessagePasserMessagePassedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2ToL1MessagePasserMessagePassedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2ToL1MessagePasserMessagePassed represents a MessagePassed event raised by the L2ToL1MessagePasser contract.
+type L2ToL1MessagePasserMessagePassed struct {
+	Nonce          *big.Int
+	Sender         common.Address
+	Target         common.Address
+	Value          *big.Int
+	GasLimit       *big.Int
+	Data           []byte
+	WithdrawalHash [32]byte
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterMessagePassed is a free log retrieval operation binding the contract event 0x02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054.
+//
+// Solidity: event MessagePassed(uint256 indexed nonce, address indexed sender, address indexed target, uint256 value, uint256 gasLimit, bytes data, bytes32 withdrawalHash)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) FilterMessagePassed(opts *bind.FilterOpts, nonce []*big.Int, sender []common.Address, target []common.Address) (*L2ToL1MessagePasserMessagePassedIterator, error) {
+
+	var nonceRule []interface{}
+	for _, nonceItem := range nonce {
+		nonceRule = append(nonceRule, nonceItem)
+	}
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L2ToL1MessagePasser.contract.FilterLogs(opts, "MessagePassed", nonceRule, senderRule, targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasserMessagePassedIterator{contract: _L2ToL1MessagePasser.contract, event: "MessagePassed", logs: logs, sub: sub}, nil
+}
+
+// WatchMessagePassed is a free log subscription operation binding the contract event 0x02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054.
+//
+// Solidity: event MessagePassed(uint256 indexed nonce, address indexed sender, address indexed target, uint256 value, uint256 gasLimit, bytes data, bytes32 withdrawalHash)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) WatchMessagePassed(opts *bind.WatchOpts, sink chan<- *L2ToL1MessagePasserMessagePassed, nonce []*big.Int, sender []common.Address, target []common.Address) (event.Subscription, error) {
+
+	var nonceRule []interface{}
+	for _, nonceItem := range nonce {
+		nonceRule = append(nonceRule, nonceItem)
+	}
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+	var targetRule []interface{}
+	for _, targetItem := range target {
+		targetRule = append(targetRule, targetItem)
+	}
+
+	logs, sub, err := _L2ToL1MessagePasser.contract.WatchLogs(opts, "MessagePassed", nonceRule, senderRule, targetRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2ToL1MessagePasserMessagePassed)
+				if err := _L2ToL1MessagePasser.contract.UnpackLog(event, "MessagePassed", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseMessagePassed is a log parse operation binding the contract event 0x02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054.
+//
+// Solidity: event MessagePassed(uint256 indexed nonce, address indexed sender, address indexed target, uint256 value, uint256 gasLimit, bytes data, bytes32 withdrawalHash)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) ParseMessagePassed(log types.Log) (*L2ToL1MessagePasserMessagePassed, error) {
+	event := new(L2ToL1MessagePasserMessagePassed)
+	if err := _L2ToL1MessagePasser.contract.UnpackLog(event, "MessagePassed", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2ToL1MessagePasserWithdrawerBalanceBurntIterator is returned from FilterWithdrawerBalanceBurnt and is used to iterate over the raw logs and unpacked data for WithdrawerBalanceBurnt events raised by the L2ToL1MessagePasser contract.
+type L2ToL1MessagePasserWithdrawerBalanceBurntIterator struct {
+	Event *L2ToL1MessagePasserWithdrawerBalanceBurnt // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2ToL1MessagePasserWithdrawerBalanceBurntIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2ToL1MessagePasserWithdrawerBalanceBurnt)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2ToL1MessagePasserWithdrawerBalanceBurnt)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2ToL1MessagePasserWithdrawerBalanceBurntIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2ToL1MessagePasserWithdrawerBalanceBurntIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2ToL1MessagePasserWithdrawerBalanceBurnt represents a WithdrawerBalanceBurnt event raised by the L2ToL1MessagePasser contract.
+type L2ToL1MessagePasserWithdrawerBalanceBurnt struct {
+	Amount *big.Int
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawerBalanceBurnt is a free log retrieval operation binding the contract event 0x7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f.
+//
+// Solidity: event WithdrawerBalanceBurnt(uint256 indexed amount)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) FilterWithdrawerBalanceBurnt(opts *bind.FilterOpts, amount []*big.Int) (*L2ToL1MessagePasserWithdrawerBalanceBurntIterator, error) {
+
+	var amountRule []interface{}
+	for _, amountItem := range amount {
+		amountRule = append(amountRule, amountItem)
+	}
+
+	logs, sub, err := _L2ToL1MessagePasser.contract.FilterLogs(opts, "WithdrawerBalanceBurnt", amountRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2ToL1MessagePasserWithdrawerBalanceBurntIterator{contract: _L2ToL1MessagePasser.contract, event: "WithdrawerBalanceBurnt", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawerBalanceBurnt is a free log subscription operation binding the contract event 0x7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f.
+//
+// Solidity: event WithdrawerBalanceBurnt(uint256 indexed amount)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) WatchWithdrawerBalanceBurnt(opts *bind.WatchOpts, sink chan<- *L2ToL1MessagePasserWithdrawerBalanceBurnt, amount []*big.Int) (event.Subscription, error) {
+
+	var amountRule []interface{}
+	for _, amountItem := range amount {
+		amountRule = append(amountRule, amountItem)
+	}
+
+	logs, sub, err := _L2ToL1MessagePasser.contract.WatchLogs(opts, "WithdrawerBalanceBurnt", amountRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2ToL1MessagePasserWithdrawerBalanceBurnt)
+				if err := _L2ToL1MessagePasser.contract.UnpackLog(event, "WithdrawerBalanceBurnt", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawerBalanceBurnt is a log parse operation binding the contract event 0x7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f.
+//
+// Solidity: event WithdrawerBalanceBurnt(uint256 indexed amount)
+func (_L2ToL1MessagePasser *L2ToL1MessagePasserFilterer) ParseWithdrawerBalanceBurnt(log types.Log) (*L2ToL1MessagePasserWithdrawerBalanceBurnt, error) {
+	event := new(L2ToL1MessagePasserWithdrawerBalanceBurnt)
+	if err := _L2ToL1MessagePasser.contract.UnpackLog(event, "WithdrawerBalanceBurnt", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-node/bindings/optimismportal.go b/op-node/bindings/optimismportal.go
new file mode 100644
index 000000000000..720b42a03853
--- /dev/null
+++ b/op-node/bindings/optimismportal.go
@@ -0,0 +1,1360 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// TypesOutputRootProof is an auto generated low-level Go binding around an user-defined struct.
+type TypesOutputRootProof struct {
+	Version                  [32]byte
+	StateRoot                [32]byte
+	MessagePasserStorageRoot [32]byte
+	LatestBlockhash          [32]byte
+}
+
+// TypesWithdrawalTransaction is an auto generated low-level Go binding around an user-defined struct.
+type TypesWithdrawalTransaction struct {
+	Nonce    *big.Int
+	Sender   common.Address
+	Target   common.Address
+	Value    *big.Int
+	GasLimit *big.Int
+	Data     []byte
+}
+
+// OptimismPortalMetaData contains all meta data concerning the OptimismPortal contract.
+var OptimismPortalMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"depositTransaction\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_isCreation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"donateETH\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"finalizeWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizedWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardian\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isOutputFinalized\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Oracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Sender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minimumGasLimit\",\"inputs\":[{\"name\":\"_byteCount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"params\",\"inputs\":[],\"outputs\":[{\"name\":\"prevBaseFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"prevBoughtGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"prevBlockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"paused_\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_outputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"latestBlockhash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provenWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2OutputIndex\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransactionDeposited\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"version\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"opaqueData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalFinalized\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalProven\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BadTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasEstimation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LargeCalldata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfGas\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SmallGasLimit\",\"inputs\":[]}]",
+	Bin: "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028f565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001c160201b6200191f1760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603680546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b03191661010085841602179055603254166200016a57603280546001600160a01b03191661dead1790555b62000174620001d0565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200023d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600154600160c01b90046001600160401b03166000036200028d5760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b615142806200029f6000396000f3fe6080604052600436106101125760003560e01c80638c3152e9116100a5578063a35d99df11610074578063cff0ab9611610059578063cff0ab961461039a578063e965084c1461043b578063e9e05c42146104c757600080fd5b8063a35d99df14610341578063c0c53b8b1461037a57600080fd5b80638c3152e9146102975780639b5f694a146102b75780639bf62d82146102e4578063a14238e71461031157600080fd5b806354fd4d50116100e157806354fd4d50146101fc5780635c975abb146102525780636dbffb78146102775780638b4c40b01461013757600080fd5b806333d7e2bd1461013e57806335e80ab314610195578063452a9320146101c75780634870496f146101dc57600080fd5b36610139576101373334620186a06000604051806020016040528060008152506104d5565b005b600080fd5b34801561014a57600080fd5b5060375461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101a157600080fd5b5060355461016b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156101d357600080fd5b5061016b610692565b3480156101e857600080fd5b506101376101f7366004614709565b61072a565b34801561020857600080fd5b506102456040518060400160405280600581526020017f322e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161018c919061485b565b34801561025e57600080fd5b50610267610d2d565b604051901515815260200161018c565b34801561028357600080fd5b5061026761029236600461486e565b610dc0565b3480156102a357600080fd5b506101376102b2366004614887565b610e7d565b3480156102c357600080fd5b5060365461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102f057600080fd5b5060325461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561031d57600080fd5b5061026761032c36600461486e565b60336020526000908152604090205460ff1681565b34801561034d57600080fd5b5061036161035c3660046148e1565b6116b8565b60405167ffffffffffffffff909116815260200161018c565b34801561038657600080fd5b506101376103953660046148fc565b6116d1565b3480156103a657600080fd5b50600154610402906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161018c565b34801561044757600080fd5b5061049961045636600461486e565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff928316602085015291169082015260600161018c565b6101376104d5366004614955565b8260005a90508380156104fd575073ffffffffffffffffffffffffffffffffffffffff871615155b15610534576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61053e83516116b8565b67ffffffffffffffff168567ffffffffffffffff16101561058b576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0835111156105c9576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146105ea575033731111000000000000000000000000000000001111015b600034888888886040516020016106059594939291906149d2565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610675919061485b565b60405180910390a45050610689828261193b565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614a37565b905090565b610732610d2d565b15610769576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff160361082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084015b60405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561089d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c19190614a74565b5190506108db6108d636869003860186614ad9565b611c12565b8114610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f6600000000000000000000000000000000000000000000006064820152608401610824565b600061097487611c6e565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610a8a5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614a74565b5114155b610b16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610824565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610bdf9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610bd5888a614b3f565b8a60400135611c9e565b610c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610824565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614bc3565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610e759173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190614a74565b602001516fffffffffffffffffffffffffffffffff16611cc2565b92915050565b565b610e85610d2d565b15610ebc576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14610f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e006064820152608401610824565b6000610f7082611c6e565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610824565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec9190614be0565b81602001516fffffffffffffffffffffffffffffffff1610156111b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610824565b6111d681602001516fffffffffffffffffffffffffffffffff16611cc2565b611288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610824565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561130f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113339190614a74565b82518151919250146113ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610824565b61140c81602001516fffffffffffffffffffffffffffffffff16611cc2565b6114be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610824565b60008381526033602052604090205460ff161561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610824565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a08801516115ff93929190611d68565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061166490841515815260200190565b60405180910390a28015801561167a5750326001145b156116b1576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60006116c5826010614c28565b610e7590615208614c58565b600054610100900460ff16158080156116f15750600054600160ff909116105b8061170b5750303b15801561170b575060005460ff166001145b611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610824565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156117f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010085841602179055603254166118ae57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b6118b6611dc6565b801561191957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611971907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614c84565b9050600061197d611ed9565b90506000816020015160ff16826000015163ffffffff1661199e9190614cca565b90508215611ad5576001546000906119d5908390700100000000000000000000000000000000900467ffffffffffffffff16614d32565b90506000836040015160ff16836119ec9190614da6565b600154611a0c9084906fffffffffffffffffffffffffffffffff16614da6565b611a169190614cca565b600154909150600090611a6790611a409084906fffffffffffffffffffffffffffffffff16614e62565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16611f9a565b90506001861115611a9657611a93611a4082876040015160ff1660018a611a8e9190614c84565b611fb9565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611b08908490700100000000000000000000000000000000900467ffffffffffffffff16614c58565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611b95576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090611bc1906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816614ed6565b90506000611bd348633b9aca0061200e565b611bdd9083614f13565b905060005a611bec9088614c84565b905080821115611c0857611c08611c038284614c84565b612025565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611c51949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611c51979096959101614f27565b600080611caa86612053565b9050611cb881868686612085565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015611d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d569190614be0565b611d609083614f7e565b421192915050565b6000806000611d788660006120b5565b905080611dae576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16611e5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610824565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003610e7b5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015611f76573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614fbb565b6000611faf611fa985856120d3565b836120e3565b90505b9392505050565b6000670de0b6b3a7640000611ffa611fd18583614cca565b611fe390670de0b6b3a7640000614d32565b611ff585670de0b6b3a7640000614da6565b6120f2565b6120049086614da6565b611faf9190614cca565b60008183101561201e5781611fb2565b5090919050565b6000805a90505b825a6120389083614c84565b101561204e576120478261505a565b915061202c565b505050565b6060818051906020012060405160200161206f91815260200190565b6040516020818303038152906040529050919050565b60006120ac84612096878686612123565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b60008183121561201e5781611fb2565b600081831261201e5781611fb2565b6000611fb2670de0b6b3a76400008361210a86612ba1565b6121149190614da6565b61211e9190614cca565b612de5565b60606000845111612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610824565b600061219b84613024565b905060006121a886613110565b90506000846040516020016121bf91815260200190565b60405160208183030381529060405290506000805b8451811015612b185760008582815181106121f1576121f1615092565b60200260200101519050845183111561228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610824565b8260000361234557805180516020918201206040516122da926122b492910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610824565b61249c565b8051516020116123fb578051805160209182012060405161236f926122b492910190815260200190565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610824565b80518451602080870191909120825191909201201461249c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610824565b6124a860106001614f7e565b81602001515103612684578451830361261c576124e281602001516010815181106124d5576124d5615092565b6020026020010151613173565b96506000875111612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610824565b600186516125839190614c84565b8214612611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610824565b505050505050611fb2565b600085848151811061263057612630615092565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061265b5761265b615092565b6020026020010151905061266e816132d3565b955061267b600186614f7e565b94505050612b05565b600281602001515103612a7d57600061269c826132f8565b90506000816000815181106126b3576126b3615092565b016020015160f81c905060006126ca6002836150c1565b6126d59060026150e3565b905060006126e6848360ff1661331c565b905060006126f48a8961331c565b905060006127028383613352565b905080835114612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610824565b60ff8516600214806127a9575060ff85166003145b15612998578082511461283e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610824565b61285887602001516001815181106124d5576124d5615092565b9c5060008d51116128eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610824565b60018c516128f99190614c84565b8814612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610824565b505050505050505050505050611fb2565b60ff851615806129ab575060ff85166001145b156129ea576129d787602001516001815181106129ca576129ca615092565b60200260200101516132d3565b99506129e3818a614f7e565b9850612a72565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610824565b505050505050612b05565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610824565b5080612b108161505a565b9150506121d4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610824565b6000808213612c0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b60006060612c1984613406565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213612e1657506000919050565b680755bf798b4a1bf1e58212612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610824565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff81111561304257613042614529565b60405190808252806020026020018201604052801561308757816020015b60408051808201909152606080825260208201528152602001906001900390816130605790505b50915060005b818110156131095760405180604001604052808583815181106130b2576130b2615092565b602002602001015181526020016130e18684815181106130d4576130d4615092565b60200260200101516134dc565b8152508382815181106130f6576130f6615092565b602090810291909101015260010161308d565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613168578060011b82018184015160001a8060041c8253600f81166001830153505060010161313a565b509295945050505050565b60606000806000613183856134ef565b91945092509050600081600181111561319e5761319e615106565b1461322b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610824565b6132358284614f7e565b8551146132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610824565b6120ac85602001518484613f5c565b606060208260000151106132ef576132ea82613173565b610e75565b610e7582613ff0565b6060610e7561331783602001516000815181106124d5576124d5615092565b613110565b60608251821061333b5750604080516020810190915260008152610e75565b611fb2838384865161334d9190614c84565b614006565b6000808251845110613365578251613368565b83515b90505b80821080156133ef575082828151811061338757613387615092565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106133c6576133c6615092565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156133ff5781600101915061336b565b5092915050565b6000808211613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060610e756134ea836141de565b6142c7565b6000806000808460000151116135ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b6020840151805160001a607f81116135d2576000600160009450945094505050613f55565b60b781116137e05760006135e7608083614c84565b9050808760000151116136a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610824565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061371b57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b6137cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610824565b5060019550935060009250613f55915050565b60bf8111613b2e5760006137f560b783614c84565b9050808760000151116138b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610824565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361398e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610824565b613a5c8184614f7e565b895111613b11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610824565b613b1c836001614f7e565b9750955060009450613f559350505050565b60f78111613c0f576000613b4360c083614c84565b905080876000015111613bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b600195509350849250613f55915050565b6000613c1c60f783614c84565b905080876000015111613cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610824565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610824565b613e838184614f7e565b895111613f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b613f43836001614f7e565b9750955060019450613f559350505050565b9193909250565b60608167ffffffffffffffff811115613f7757613f77614529565b6040519080825280601f01601f191660200182016040528015613fa1576020820181803683370190505b5090508115611fb2576000613fb68486614f7e565b90506020820160005b84811015613fd7578281015182820152602001613fbf565b84811115613fe6576000858301525b5050509392505050565b6060610e75826020015160008460000151613f5c565b60608182601f011015614075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8282840110156140e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8183018451101561414e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610824565b60608215801561416d57604051915060008252602082016040526141d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141a657805183526020928301920161418e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116142a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b50604080518082019091528151815260209182019181019190915290565b606060008060006142d7856134ef565b9194509250905060018160018111156142f2576142f2615106565b1461437f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610824565b845161438b8385614f7e565b14614418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610824565b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161442f5790505093506000835b865181101561451d576000806144a26040518060400160405280858c600001516144869190614c84565b8152602001858c6020015161449b9190614f7e565b90526134ef565b5091509150604051806040016040528083836144be9190614f7e565b8152602001848b602001516144d39190614f7e565b8152508885815181106144e8576144e8615092565b60209081029190910101526144fe600185614f7e565b935061450a8183614f7e565b6145149084614f7e565b9250505061445c565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561459f5761459f614529565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff811681146145c957600080fd5b50565b600082601f8301126145dd57600080fd5b813567ffffffffffffffff8111156145f7576145f7614529565b61462860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614558565b81815284602083860101111561463d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561466c57600080fd5b60405160c0810167ffffffffffffffff828210818311171561469057614690614529565b8160405282935084358352602085013591506146ab826145a7565b816020840152604085013591506146c1826145a7565b816040840152606085013560608401526080850135608084015260a08501359150808211156146ef57600080fd5b506146fc858286016145cc565b60a0830152505092915050565b600080600080600085870360e081121561472257600080fd5b863567ffffffffffffffff8082111561473a57600080fd5b6147468a838b0161465a565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561477f57600080fd5b60408901955060c089013592508083111561479957600080fd5b828901925089601f8401126147ad57600080fd5b82359150808211156147be57600080fd5b508860208260051b84010111156147d457600080fd5b959894975092955050506020019190565b60005b838110156148005781810151838201526020016147e8565b838111156119195750506000910152565b600081518084526148298160208601602086016147e5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fb26020830184614811565b60006020828403121561488057600080fd5b5035919050565b60006020828403121561489957600080fd5b813567ffffffffffffffff8111156148b057600080fd5b6148bc8482850161465a565b949350505050565b803567ffffffffffffffff811681146148dc57600080fd5b919050565b6000602082840312156148f357600080fd5b611fb2826148c4565b60008060006060848603121561491157600080fd5b833561491c816145a7565b9250602084013561492c816145a7565b9150604084013561493c816145a7565b809150509250925092565b80151581146145c957600080fd5b600080600080600060a0868803121561496d57600080fd5b8535614978816145a7565b94506020860135935061498d604087016148c4565b9250606086013561499d81614947565b9150608086013567ffffffffffffffff8111156149b957600080fd5b6149c5888289016145cc565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614a268160498501602087016147e5565b919091016049019695505050505050565b600060208284031215614a4957600080fd5b8151611fb2816145a7565b80516fffffffffffffffffffffffffffffffff811681146148dc57600080fd5b600060608284031215614a8657600080fd5b6040516060810181811067ffffffffffffffff82111715614aa957614aa9614529565b60405282518152614abc60208401614a54565b6020820152614acd60408401614a54565b60408201529392505050565b600060808284031215614aeb57600080fd5b6040516080810181811067ffffffffffffffff82111715614b0e57614b0e614529565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614b5a57614b5a614529565b8360051b6020614b6b818301614558565b868152918501918181019036841115614b8357600080fd5b865b84811015614bb757803586811115614b9d5760008081fd5b614ba936828b016145cc565b845250918301918301614b85565b50979650505050505050565b600060208284031215614bd557600080fd5b8151611fb281614947565b600060208284031215614bf257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614c4f57614c4f614bf9565b02949350505050565b600067ffffffffffffffff808316818516808303821115614c7b57614c7b614bf9565b01949350505050565b600082821015614c9657614c96614bf9565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614cd957614cd9614c9b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614d2d57614d2d614bf9565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615614d6c57614d6c614bf9565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614da057614da0614bf9565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614de757614de7614bf9565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614e2257614e22614bf9565b60008712925087820587128484161615614e3e57614e3e614bf9565b87850587128184161615614e5457614e54614bf9565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614e9c57614e9c614bf9565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614ed057614ed0614bf9565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f0e57614f0e614bf9565b500290565b600082614f2257614f22614c9b565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614f7260c0830184614811565b98975050505050505050565b60008219821115614f9157614f91614bf9565b500190565b805163ffffffff811681146148dc57600080fd5b805160ff811681146148dc57600080fd5b600060c08284031215614fcd57600080fd5b60405160c0810181811067ffffffffffffffff82111715614ff057614ff0614529565b604052614ffc83614f96565b815261500a60208401614faa565b602082015261501b60408401614faa565b604082015261502c60608401614f96565b606082015261503d60808401614f96565b608082015261504e60a08401614a54565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508b5761508b614bf9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff8316806150d4576150d4614c9b565b8060ff84160691505092915050565b600060ff821660ff8416808210156150fd576150fd614bf9565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
+}
+
+// OptimismPortalABI is the input ABI used to generate the binding from.
+// Deprecated: Use OptimismPortalMetaData.ABI instead.
+var OptimismPortalABI = OptimismPortalMetaData.ABI
+
+// OptimismPortalBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use OptimismPortalMetaData.Bin instead.
+var OptimismPortalBin = OptimismPortalMetaData.Bin
+
+// DeployOptimismPortal deploys a new Ethereum contract, binding an instance of OptimismPortal to it.
+func DeployOptimismPortal(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *OptimismPortal, error) {
+	parsed, err := OptimismPortalMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(OptimismPortalBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &OptimismPortal{OptimismPortalCaller: OptimismPortalCaller{contract: contract}, OptimismPortalTransactor: OptimismPortalTransactor{contract: contract}, OptimismPortalFilterer: OptimismPortalFilterer{contract: contract}}, nil
+}
+
+// OptimismPortal is an auto generated Go binding around an Ethereum contract.
+type OptimismPortal struct {
+	OptimismPortalCaller     // Read-only binding to the contract
+	OptimismPortalTransactor // Write-only binding to the contract
+	OptimismPortalFilterer   // Log filterer for contract events
+}
+
+// OptimismPortalCaller is an auto generated read-only Go binding around an Ethereum contract.
+type OptimismPortalCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type OptimismPortalTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type OptimismPortalFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// OptimismPortalSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type OptimismPortalSession struct {
+	Contract     *OptimismPortal   // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// OptimismPortalCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type OptimismPortalCallerSession struct {
+	Contract *OptimismPortalCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts         // Call options to use throughout this session
+}
+
+// OptimismPortalTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type OptimismPortalTransactorSession struct {
+	Contract     *OptimismPortalTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
+}
+
+// OptimismPortalRaw is an auto generated low-level Go binding around an Ethereum contract.
+type OptimismPortalRaw struct {
+	Contract *OptimismPortal // Generic contract binding to access the raw methods on
+}
+
+// OptimismPortalCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type OptimismPortalCallerRaw struct {
+	Contract *OptimismPortalCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// OptimismPortalTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type OptimismPortalTransactorRaw struct {
+	Contract *OptimismPortalTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewOptimismPortal creates a new instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortal(address common.Address, backend bind.ContractBackend) (*OptimismPortal, error) {
+	contract, err := bindOptimismPortal(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortal{OptimismPortalCaller: OptimismPortalCaller{contract: contract}, OptimismPortalTransactor: OptimismPortalTransactor{contract: contract}, OptimismPortalFilterer: OptimismPortalFilterer{contract: contract}}, nil
+}
+
+// NewOptimismPortalCaller creates a new read-only instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalCaller(address common.Address, caller bind.ContractCaller) (*OptimismPortalCaller, error) {
+	contract, err := bindOptimismPortal(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalCaller{contract: contract}, nil
+}
+
+// NewOptimismPortalTransactor creates a new write-only instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalTransactor(address common.Address, transactor bind.ContractTransactor) (*OptimismPortalTransactor, error) {
+	contract, err := bindOptimismPortal(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalTransactor{contract: contract}, nil
+}
+
+// NewOptimismPortalFilterer creates a new log filterer instance of OptimismPortal, bound to a specific deployed contract.
+func NewOptimismPortalFilterer(address common.Address, filterer bind.ContractFilterer) (*OptimismPortalFilterer, error) {
+	contract, err := bindOptimismPortal(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalFilterer{contract: contract}, nil
+}
+
+// bindOptimismPortal binds a generic wrapper to an already deployed contract.
+func bindOptimismPortal(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(OptimismPortalABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismPortal *OptimismPortalRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismPortal.Contract.OptimismPortalCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismPortal *OptimismPortalRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.OptimismPortalTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismPortal *OptimismPortalRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.OptimismPortalTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_OptimismPortal *OptimismPortalCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _OptimismPortal.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_OptimismPortal *OptimismPortalTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_OptimismPortal *OptimismPortalTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.contract.Transact(opts, method, params...)
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalCaller) FinalizedWithdrawals(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "finalizedWithdrawals", arg0)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalSession) FinalizedWithdrawals(arg0 [32]byte) (bool, error) {
+	return _OptimismPortal.Contract.FinalizedWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// FinalizedWithdrawals is a free data retrieval call binding the contract method 0xa14238e7.
+//
+// Solidity: function finalizedWithdrawals(bytes32 ) view returns(bool)
+func (_OptimismPortal *OptimismPortalCallerSession) FinalizedWithdrawals(arg0 [32]byte) (bool, error) {
+	return _OptimismPortal.Contract.FinalizedWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) Guardian(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "guardian")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) Guardian() (common.Address, error) {
+	return _OptimismPortal.Contract.Guardian(&_OptimismPortal.CallOpts)
+}
+
+// Guardian is a free data retrieval call binding the contract method 0x452a9320.
+//
+// Solidity: function guardian() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) Guardian() (common.Address, error) {
+	return _OptimismPortal.Contract.Guardian(&_OptimismPortal.CallOpts)
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalCaller) IsOutputFinalized(opts *bind.CallOpts, _l2OutputIndex *big.Int) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "isOutputFinalized", _l2OutputIndex)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalSession) IsOutputFinalized(_l2OutputIndex *big.Int) (bool, error) {
+	return _OptimismPortal.Contract.IsOutputFinalized(&_OptimismPortal.CallOpts, _l2OutputIndex)
+}
+
+// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78.
+//
+// Solidity: function isOutputFinalized(uint256 _l2OutputIndex) view returns(bool)
+func (_OptimismPortal *OptimismPortalCallerSession) IsOutputFinalized(_l2OutputIndex *big.Int) (bool, error) {
+	return _OptimismPortal.Contract.IsOutputFinalized(&_OptimismPortal.CallOpts, _l2OutputIndex)
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) L2Oracle(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "l2Oracle")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) L2Oracle() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Oracle(&_OptimismPortal.CallOpts)
+}
+
+// L2Oracle is a free data retrieval call binding the contract method 0x9b5f694a.
+//
+// Solidity: function l2Oracle() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) L2Oracle() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Oracle(&_OptimismPortal.CallOpts)
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) L2Sender(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "l2Sender")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) L2Sender() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Sender(&_OptimismPortal.CallOpts)
+}
+
+// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
+//
+// Solidity: function l2Sender() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) L2Sender() (common.Address, error) {
+	return _OptimismPortal.Contract.L2Sender(&_OptimismPortal.CallOpts)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalCaller) MinimumGasLimit(opts *bind.CallOpts, _byteCount uint64) (uint64, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "minimumGasLimit", _byteCount)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalSession) MinimumGasLimit(_byteCount uint64) (uint64, error) {
+	return _OptimismPortal.Contract.MinimumGasLimit(&_OptimismPortal.CallOpts, _byteCount)
+}
+
+// MinimumGasLimit is a free data retrieval call binding the contract method 0xa35d99df.
+//
+// Solidity: function minimumGasLimit(uint64 _byteCount) pure returns(uint64)
+func (_OptimismPortal *OptimismPortalCallerSession) MinimumGasLimit(_byteCount uint64) (uint64, error) {
+	return _OptimismPortal.Contract.MinimumGasLimit(&_OptimismPortal.CallOpts, _byteCount)
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalCaller) Params(opts *bind.CallOpts) (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "params")
+
+	outstruct := new(struct {
+		PrevBaseFee   *big.Int
+		PrevBoughtGas uint64
+		PrevBlockNum  uint64
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.PrevBaseFee = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+	outstruct.PrevBoughtGas = *abi.ConvertType(out[1], new(uint64)).(*uint64)
+	outstruct.PrevBlockNum = *abi.ConvertType(out[2], new(uint64)).(*uint64)
+
+	return *outstruct, err
+
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalSession) Params() (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	return _OptimismPortal.Contract.Params(&_OptimismPortal.CallOpts)
+}
+
+// Params is a free data retrieval call binding the contract method 0xcff0ab96.
+//
+// Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
+func (_OptimismPortal *OptimismPortalCallerSession) Params() (struct {
+	PrevBaseFee   *big.Int
+	PrevBoughtGas uint64
+	PrevBlockNum  uint64
+}, error) {
+	return _OptimismPortal.Contract.Params(&_OptimismPortal.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalCaller) Paused(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "paused")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalSession) Paused() (bool, error) {
+	return _OptimismPortal.Contract.Paused(&_OptimismPortal.CallOpts)
+}
+
+// Paused is a free data retrieval call binding the contract method 0x5c975abb.
+//
+// Solidity: function paused() view returns(bool paused_)
+func (_OptimismPortal *OptimismPortalCallerSession) Paused() (bool, error) {
+	return _OptimismPortal.Contract.Paused(&_OptimismPortal.CallOpts)
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalCaller) ProvenWithdrawals(opts *bind.CallOpts, arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "provenWithdrawals", arg0)
+
+	outstruct := new(struct {
+		OutputRoot    [32]byte
+		Timestamp     *big.Int
+		L2OutputIndex *big.Int
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.OutputRoot = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+	outstruct.Timestamp = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
+	outstruct.L2OutputIndex = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int)
+
+	return *outstruct, err
+
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalSession) ProvenWithdrawals(arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	return _OptimismPortal.Contract.ProvenWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+//
+// Solidity: function provenWithdrawals(bytes32 ) view returns(bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex)
+func (_OptimismPortal *OptimismPortalCallerSession) ProvenWithdrawals(arg0 [32]byte) (struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2OutputIndex *big.Int
+}, error) {
+	return _OptimismPortal.Contract.ProvenWithdrawals(&_OptimismPortal.CallOpts, arg0)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) SuperchainConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "superchainConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) SuperchainConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SuperchainConfig(&_OptimismPortal.CallOpts)
+}
+
+// SuperchainConfig is a free data retrieval call binding the contract method 0x35e80ab3.
+//
+// Solidity: function superchainConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) SuperchainConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SuperchainConfig(&_OptimismPortal.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCaller) SystemConfig(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "systemConfig")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalSession) SystemConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SystemConfig(&_OptimismPortal.CallOpts)
+}
+
+// SystemConfig is a free data retrieval call binding the contract method 0x33d7e2bd.
+//
+// Solidity: function systemConfig() view returns(address)
+func (_OptimismPortal *OptimismPortalCallerSession) SystemConfig() (common.Address, error) {
+	return _OptimismPortal.Contract.SystemConfig(&_OptimismPortal.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _OptimismPortal.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalSession) Version() (string, error) {
+	return _OptimismPortal.Contract.Version(&_OptimismPortal.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_OptimismPortal *OptimismPortalCallerSession) Version() (string, error) {
+	return _OptimismPortal.Contract.Version(&_OptimismPortal.CallOpts)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) DepositTransaction(opts *bind.TransactOpts, _to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "depositTransaction", _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalSession) DepositTransaction(_to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositTransaction(&_OptimismPortal.TransactOpts, _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DepositTransaction is a paid mutator transaction binding the contract method 0xe9e05c42.
+//
+// Solidity: function depositTransaction(address _to, uint256 _value, uint64 _gasLimit, bool _isCreation, bytes _data) payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) DepositTransaction(_to common.Address, _value *big.Int, _gasLimit uint64, _isCreation bool, _data []byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DepositTransaction(&_OptimismPortal.TransactOpts, _to, _value, _gasLimit, _isCreation, _data)
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) DonateETH(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "donateETH")
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalSession) DonateETH() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DonateETH(&_OptimismPortal.TransactOpts)
+}
+
+// DonateETH is a paid mutator transaction binding the contract method 0x8b4c40b0.
+//
+// Solidity: function donateETH() payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) DonateETH() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.DonateETH(&_OptimismPortal.TransactOpts)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalTransactor) FinalizeWithdrawalTransaction(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "finalizeWithdrawalTransaction", _tx)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalSession) FinalizeWithdrawalTransaction(_tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx)
+}
+
+// FinalizeWithdrawalTransaction is a paid mutator transaction binding the contract method 0x8c3152e9.
+//
+// Solidity: function finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) FinalizeWithdrawalTransaction(_tx TypesWithdrawalTransaction) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalTransactor) Initialize(opts *bind.TransactOpts, _l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "initialize", _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalSession) Initialize(_l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Initialize(&_OptimismPortal.TransactOpts, _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
+//
+// Solidity: function initialize(address _l2Oracle, address _systemConfig, address _superchainConfig) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) Initialize(_l2Oracle common.Address, _systemConfig common.Address, _superchainConfig common.Address) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Initialize(&_OptimismPortal.TransactOpts, _l2Oracle, _systemConfig, _superchainConfig)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalTransactor) ProveWithdrawalTransaction(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.contract.Transact(opts, "proveWithdrawalTransaction", _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalSession) ProveWithdrawalTransaction(_tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.ProveWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// ProveWithdrawalTransaction is a paid mutator transaction binding the contract method 0x4870496f.
+//
+// Solidity: function proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes) _tx, uint256 _l2OutputIndex, (bytes32,bytes32,bytes32,bytes32) _outputRootProof, bytes[] _withdrawalProof) returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) ProveWithdrawalTransaction(_tx TypesWithdrawalTransaction, _l2OutputIndex *big.Int, _outputRootProof TypesOutputRootProof, _withdrawalProof [][]byte) (*types.Transaction, error) {
+	return _OptimismPortal.Contract.ProveWithdrawalTransaction(&_OptimismPortal.TransactOpts, _tx, _l2OutputIndex, _outputRootProof, _withdrawalProof)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _OptimismPortal.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalSession) Receive() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Receive(&_OptimismPortal.TransactOpts)
+}
+
+// Receive is a paid mutator transaction binding the contract receive function.
+//
+// Solidity: receive() payable returns()
+func (_OptimismPortal *OptimismPortalTransactorSession) Receive() (*types.Transaction, error) {
+	return _OptimismPortal.Contract.Receive(&_OptimismPortal.TransactOpts)
+}
+
+// OptimismPortalInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the OptimismPortal contract.
+type OptimismPortalInitializedIterator struct {
+	Event *OptimismPortalInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalInitialized represents a Initialized event raised by the OptimismPortal contract.
+type OptimismPortalInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) FilterInitialized(opts *bind.FilterOpts) (*OptimismPortalInitializedIterator, error) {
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalInitializedIterator{contract: _OptimismPortal.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *OptimismPortalInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalInitialized)
+				if err := _OptimismPortal.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_OptimismPortal *OptimismPortalFilterer) ParseInitialized(log types.Log) (*OptimismPortalInitialized, error) {
+	event := new(OptimismPortalInitialized)
+	if err := _OptimismPortal.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalTransactionDepositedIterator is returned from FilterTransactionDeposited and is used to iterate over the raw logs and unpacked data for TransactionDeposited events raised by the OptimismPortal contract.
+type OptimismPortalTransactionDepositedIterator struct {
+	Event *OptimismPortalTransactionDeposited // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalTransactionDepositedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalTransactionDeposited)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalTransactionDeposited)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalTransactionDepositedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalTransactionDepositedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalTransactionDeposited represents a TransactionDeposited event raised by the OptimismPortal contract.
+type OptimismPortalTransactionDeposited struct {
+	From       common.Address
+	To         common.Address
+	Version    *big.Int
+	OpaqueData []byte
+	Raw        types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransactionDeposited is a free log retrieval operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) FilterTransactionDeposited(opts *bind.FilterOpts, from []common.Address, to []common.Address, version []*big.Int) (*OptimismPortalTransactionDepositedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "TransactionDeposited", fromRule, toRule, versionRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalTransactionDepositedIterator{contract: _OptimismPortal.contract, event: "TransactionDeposited", logs: logs, sub: sub}, nil
+}
+
+// WatchTransactionDeposited is a free log subscription operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) WatchTransactionDeposited(opts *bind.WatchOpts, sink chan<- *OptimismPortalTransactionDeposited, from []common.Address, to []common.Address, version []*big.Int) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+	var versionRule []interface{}
+	for _, versionItem := range version {
+		versionRule = append(versionRule, versionItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "TransactionDeposited", fromRule, toRule, versionRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalTransactionDeposited)
+				if err := _OptimismPortal.contract.UnpackLog(event, "TransactionDeposited", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseTransactionDeposited is a log parse operation binding the contract event 0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32.
+//
+// Solidity: event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData)
+func (_OptimismPortal *OptimismPortalFilterer) ParseTransactionDeposited(log types.Log) (*OptimismPortalTransactionDeposited, error) {
+	event := new(OptimismPortalTransactionDeposited)
+	if err := _OptimismPortal.contract.UnpackLog(event, "TransactionDeposited", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalWithdrawalFinalizedIterator is returned from FilterWithdrawalFinalized and is used to iterate over the raw logs and unpacked data for WithdrawalFinalized events raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalFinalizedIterator struct {
+	Event *OptimismPortalWithdrawalFinalized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalWithdrawalFinalized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalWithdrawalFinalized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalWithdrawalFinalizedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalWithdrawalFinalized represents a WithdrawalFinalized event raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalFinalized struct {
+	WithdrawalHash [32]byte
+	Success        bool
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawalFinalized is a free log retrieval operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) FilterWithdrawalFinalized(opts *bind.FilterOpts, withdrawalHash [][32]byte) (*OptimismPortalWithdrawalFinalizedIterator, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "WithdrawalFinalized", withdrawalHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalWithdrawalFinalizedIterator{contract: _OptimismPortal.contract, event: "WithdrawalFinalized", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawalFinalized is a free log subscription operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) WatchWithdrawalFinalized(opts *bind.WatchOpts, sink chan<- *OptimismPortalWithdrawalFinalized, withdrawalHash [][32]byte) (event.Subscription, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "WithdrawalFinalized", withdrawalHashRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalWithdrawalFinalized)
+				if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalFinalized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawalFinalized is a log parse operation binding the contract event 0xdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b.
+//
+// Solidity: event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success)
+func (_OptimismPortal *OptimismPortalFilterer) ParseWithdrawalFinalized(log types.Log) (*OptimismPortalWithdrawalFinalized, error) {
+	event := new(OptimismPortalWithdrawalFinalized)
+	if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalFinalized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// OptimismPortalWithdrawalProvenIterator is returned from FilterWithdrawalProven and is used to iterate over the raw logs and unpacked data for WithdrawalProven events raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalProvenIterator struct {
+	Event *OptimismPortalWithdrawalProven // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *OptimismPortalWithdrawalProvenIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(OptimismPortalWithdrawalProven)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(OptimismPortalWithdrawalProven)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *OptimismPortalWithdrawalProvenIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *OptimismPortalWithdrawalProvenIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// OptimismPortalWithdrawalProven represents a WithdrawalProven event raised by the OptimismPortal contract.
+type OptimismPortalWithdrawalProven struct {
+	WithdrawalHash [32]byte
+	From           common.Address
+	To             common.Address
+	Raw            types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdrawalProven is a free log retrieval operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) FilterWithdrawalProven(opts *bind.FilterOpts, withdrawalHash [][32]byte, from []common.Address, to []common.Address) (*OptimismPortalWithdrawalProvenIterator, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "WithdrawalProven", withdrawalHashRule, fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &OptimismPortalWithdrawalProvenIterator{contract: _OptimismPortal.contract, event: "WithdrawalProven", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdrawalProven is a free log subscription operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) WatchWithdrawalProven(opts *bind.WatchOpts, sink chan<- *OptimismPortalWithdrawalProven, withdrawalHash [][32]byte, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var withdrawalHashRule []interface{}
+	for _, withdrawalHashItem := range withdrawalHash {
+		withdrawalHashRule = append(withdrawalHashRule, withdrawalHashItem)
+	}
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _OptimismPortal.contract.WatchLogs(opts, "WithdrawalProven", withdrawalHashRule, fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(OptimismPortalWithdrawalProven)
+				if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalProven", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseWithdrawalProven is a log parse operation binding the contract event 0x67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62.
+//
+// Solidity: event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to)
+func (_OptimismPortal *OptimismPortalFilterer) ParseWithdrawalProven(log types.Log) (*OptimismPortalWithdrawalProven, error) {
+	event := new(OptimismPortalWithdrawalProven)
+	if err := _OptimismPortal.contract.UnpackLog(event, "WithdrawalProven", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-bindings/bindingspreview/optimismportal2.go b/op-node/bindings/preview/optimismportal2.go
similarity index 53%
rename from op-bindings/bindingspreview/optimismportal2.go
rename to op-node/bindings/preview/optimismportal2.go
index 068a35d8d87a..e15b4e996c63 100644
--- a/op-bindings/bindingspreview/optimismportal2.go
+++ b/op-node/bindings/preview/optimismportal2.go
@@ -48,8 +48,8 @@ type TypesWithdrawalTransaction struct {
 
 // OptimismPortal2MetaData contains all meta data concerning the OptimismPortal2 contract.
 var OptimismPortal2MetaData = &bind.MetaData{
-	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_proofMaturityDelaySeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_disputeGameFinalityDelaySeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_initialRespectedGameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GUARDIAN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SYSTEM_CONFIG\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blacklistDisputeGame\",\"inputs\":[{\"name\":\"_disputeGame\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkWithdrawal\",\"inputs\":[{\"name\":\"_withdrawalHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositTransaction\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_isCreation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"disputeGameBlacklist\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disputeGameFactory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractDisputeGameFactory\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disputeGameFinalityDelaySeconds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"donateETH\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"finalizeWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizedWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardian\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_disputeGameFactory\",\"type\":\"address\",\"internalType\":\"contractDisputeGameFactory\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l2Sender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minimumGasLimit\",\"inputs\":[{\"name\":\"_byteCount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"params\",\"inputs\":[],\"outputs\":[{\"name\":\"prevBaseFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"prevBoughtGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"prevBlockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofMaturityDelaySeconds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_disputeGameIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_outputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"latestBlockhash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provenWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"disputeGameProxy\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"respectedGameType\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"respectedGameTypeUpdatedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setRespectedGameType\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransactionDeposited\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"version\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"opaqueData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalFinalized\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalProven\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]",
-	Bin: "0x60c06040523480156200001157600080fd5b5060405162005e7938038062005e798339810160408190526200003491620002d3565b608083905260a0829052603b805463ffffffff191663ffffffff831617905562000061600080806200006a565b50505062000317565b600054610100900460ff16158080156200008b5750600054600160ff909116105b80620000bb5750620000a8306200020560201b620022f11760201c565b158015620000bb575060005460ff166001145b620001245760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000148576000805461ff0019166101001790555b603880546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b0319166101008584160217905560325416620001ae57603280546001600160a01b03191661dead1790555b620001b862000214565b8015620001ff576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff16620002815760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200011b565b600154600160c01b90046001600160401b0316600003620002d15760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b600080600060608486031215620002e957600080fd5b8351925060208401519150604084015163ffffffff811681146200030c57600080fd5b809150509250925092565b60805160a051615b2e6200034b6000396000818161045201526119ae01526000818161050c015261161f0152615b2e6000f3fe6080604052600436106101a55760003560e01c80638b4c40b0116100e1578063bf653a5c1161008a578063e965084c11610064578063e965084c146105f1578063e9e05c421461068d578063f0498750146106a0578063f2b4e617146106cb57600080fd5b8063bf653a5c146104fd578063c0c53b8b14610530578063cff0ab961461055057600080fd5b80639bf62d82116100bb5780639bf62d8214610480578063a14238e7146104ad578063a35d99df146104dd57600080fd5b80638b4c40b0146101ca5780638c3152e914610423578063952b27971461044357600080fd5b80634fd0434c1161014e578063724c184c11610128578063724c184c146103ae5780637af1906d146103c35780637d6be8dc146103e35780637fc485041461040357600080fd5b80634fd0434c1461030157806354fd4d50146103435780635c975abb1461039957600080fd5b8063452a93201161017f578063452a93201461028c57806345884d32146102a15780634870496f146102e157600080fd5b806333d7e2bd146101d157806335e80ab3146102285780633c9f397c1461025a57600080fd5b366101cc576101ca3334620186a06000604051806020016040528060008152506106f8565b005b600080fd5b3480156101dd57600080fd5b506037546101fe9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023457600080fd5b506035546101fe90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561026657600080fd5b50603b546102779063ffffffff1681565b60405163ffffffff909116815260200161021f565b34801561029857600080fd5b506101fe610993565b3480156102ad57600080fd5b506102d16102bc366004614ecb565b603a6020526000908152604090205460ff1681565b604051901515815260200161021f565b3480156102ed57600080fd5b506101ca6102fc3660046150a3565b610a2b565b34801561030d57600080fd5b50603b5461032a90640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161021f565b34801561034f57600080fd5b5061038c6040518060400160405280600581526020017f332e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161021f91906151f5565b3480156103a557600080fd5b506102d161129c565b3480156103ba57600080fd5b506101fe61132f565b3480156103cf57600080fd5b506101ca6103de366004615208565b611339565b3480156103ef57600080fd5b506101ca6103fe366004614ecb565b611b61565b34801561040f57600080fd5b506101ca61041e366004615233565b611c72565b34801561042f57600080fd5b506101ca61043e366004615250565b611da8565b34801561044f57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405190815260200161021f565b34801561048c57600080fd5b506032546101fe9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104b957600080fd5b506102d16104c8366004615208565b60336020526000908152604090205460ff1681565b3480156104e957600080fd5b5061032a6104f83660046152a3565b612085565b34801561050957600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610472565b34801561053c57600080fd5b506101ca61054b3660046152c0565b6120a4565b34801561055c57600080fd5b506001546105b8906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161021f565b3480156105fd57600080fd5b5061065861060c366004615208565b60396020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301520161021f565b6101ca61069b366004615319565b6106f8565b3480156106ac57600080fd5b5060375473ffffffffffffffffffffffffffffffffffffffff166101fe565b3480156106d757600080fd5b506038546101fe9073ffffffffffffffffffffffffffffffffffffffff1681565b8260005a905083156107af5773ffffffffffffffffffffffffffffffffffffffff8716156107af57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b6107b98351612085565b67ffffffffffffffff168567ffffffffffffffff16101561085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4f7074696d69736d506f7274616c3a20676173206c696d697420746f6f20736d60448201527f616c6c000000000000000000000000000000000000000000000000000000000060648201526084016107a6565b6201d4c0835111156108ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f7074696d69736d506f7274616c3a206461746120746f6f206c61726765000060448201526064016107a6565b333281146108eb575033731111000000000000000000000000000000001111015b60003488888888604051602001610906959493929190615398565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161097691906151f5565b60405180910390a4505061098a828261230d565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2691906153fd565b905090565b610a3361129c565b15610a9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a207061757365640000000000000000000060448201526064016107a6565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610b59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016107a6565b6038546040517fbb8aa1fc00000000000000000000000000000000000000000000000000000000815260048101869052600091829173ffffffffffffffffffffffffffffffffffffffff9091169063bb8aa1fc90602401606060405180830381865afa158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf1919061541a565b925050915060008173ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c67919061545c565b603b5490915060ff848116911614610d01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016107a6565b610d18610d1336889003880188615475565b61263a565b8114610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016107a6565b6000610db189612696565b60008181526039602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff81168084527401000000000000000000000000000000000000000090910467ffffffffffffffff169183018290529293509091901580610ea0575060018573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8d919061550a565b6002811115610e9e57610e9e6154db565b145b80610ed0575073ffffffffffffffffffffffffffffffffffffffff85166000908152603a602052604090205460ff165b80610f635750603b5463ffffffff1660ff16610f5d8273ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f54919061552b565b63ffffffff1690565b60ff1614155b611015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e2c20616e642064697360648201527f707574652067616d65206973206e6f7420696e76616c69640000000000000000608482015260a4016107a6565b60408051602081018590526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506110de9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152906110d48b8d615548565b8d604001356126c6565b61116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016107a6565b60405180604001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506039600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050508b6040015173ffffffffffffffffffffffffffffffffffffffff168c6020015173ffffffffffffffffffffffffffffffffffffffff16857f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6260405160405180910390a4505050505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561130b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2691906155cc565b6000610a26610993565b600081815260396020908152604080832081518083018352905473ffffffffffffffffffffffffffffffffffffffff81168083527401000000000000000000000000000000000000000090910467ffffffffffffffff1682850152808552603a90935292205460ff161561142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652068617360448201527f206265656e20626c61636b6c697374656400000000000000000000000000000060648201526084016107a6565b816020015167ffffffffffffffff166000036114cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e20796574000000000000000000000000000060648201526084016107a6565b600061154e8273ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154191906155e9565b67ffffffffffffffff1690565b90508067ffffffffffffffff16836020015167ffffffffffffffff161161161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e20646973707574652067616d65206372656160648201527f74696f6e2074696d657374616d70000000000000000000000000000000000000608482015260a4016107a6565b7f0000000000000000000000000000000000000000000000000000000000000000836020015167ffffffffffffffff16426116589190615635565b116116e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c20686173206e6f74206d61747572656420796574000000000000000000000060648201526084016107a6565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611732573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611756919061550a565b6002811115611767576117676154db565b146117f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f686173206e6f74206265656e2066696e616c697a65642079657400000000000060648201526084016107a6565b603b5463ffffffff1660ff1661184e8373ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f30573d6000803e3d6000fd5b60ff16146118de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016107a6565b603b5467ffffffffffffffff640100000000909104811690821610156119ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652063726560448201527f61746564206265666f7265207265737065637465642067616d6520747970652060648201527f7761732075706461746564000000000000000000000000000000000000000000608482015260a4016107a6565b7f0000000000000000000000000000000000000000000000000000000000000000611a1b8373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561151d573d6000803e3d6000fd5b611a2f9067ffffffffffffffff1642615635565b11611abc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f696e206169722d6761700000000000000000000000000000000000000000000060648201526084016107a6565b60008481526033602052604090205460ff1615611b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016107a6565b50505050565b611b69610993565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4f7074696d69736d506f7274616c3a206f6e6c7920746865206775617264696160448201527f6e2063616e20626c61636b6c69737420646973707574652067616d657300000060648201526084016107a6565b73ffffffffffffffffffffffffffffffffffffffff166000908152603a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611c7a610993565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4f7074696d69736d506f7274616c3a206f6e6c7920746865206775617264696160448201527f6e2063616e2073657420746865207265737065637465642067616d652074797060648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016107a6565b603b805463ffffffff929092167fffffffffffffffffffffffffffffffffffffffff000000000000000000000000909216919091176401000000004267ffffffffffffffff1602179055565b565b611db061129c565b15611e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a207061757365640000000000000000000060448201526064016107a6565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611ec0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016107a6565b6000611ecb82612696565b9050611ed681611339565b600081815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908401516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558301516080840151606085015160a0860151611f78939291906126ea565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611fdd90841515815260200190565b60405180910390a280158015611ff35750326001145b15612080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a207769746864726177616c206661696c6560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016107a6565b505050565b600061209282601061564c565b61209e9061520861567c565b92915050565b600054610100900460ff16158080156120c45750600054600160ff909116105b806120de5750303b1580156120de575060005460ff166001145b61216a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107a6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156121c857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff16610100858416021790556032541661228157603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b612289612748565b8015611b5b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090612343907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643615635565b9050600061234f61285b565b90506000816020015160ff16826000015163ffffffff1661237091906156d7565b905082156124a7576001546000906123a7908390700100000000000000000000000000000000900467ffffffffffffffff1661573f565b90506000836040015160ff16836123be91906157b3565b6001546123de9084906fffffffffffffffffffffffffffffffff166157b3565b6123e891906156d7565b600154909150600090612439906124129084906fffffffffffffffffffffffffffffffff1661586f565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff1661291c565b905060018611156124685761246561241282876040015160ff1660018a6124609190615635565b61293b565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b600180548691906010906124da908490700100000000000000000000000000000000900467ffffffffffffffff1661567c565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156125bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016107a6565b6001546000906125e9906fffffffffffffffffffffffffffffffff1667ffffffffffffffff88166158e3565b905060006125fb48633b9aca00612990565b6126059083615920565b905060005a6126149088615635565b9050808211156126305761263061262b8284615635565b6129a7565b5050505050505050565b60008160000151826020015183604001518460600151604051602001612679949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097612679979096959101615934565b6000806126d2866129d0565b90506126e081868686612a02565b9695505050505050565b60008060006126fa866000612a32565b905080612730576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff166127df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107a6565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003611da65760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa1580156128f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2691906159a1565b600061293161292b8585612a50565b83612a60565b90505b9392505050565b6000670de0b6b3a764000061297c61295385836156d7565b61296590670de0b6b3a764000061573f565b61297785670de0b6b3a76400006157b3565b612a6f565b61298690866157b3565b61293191906156d7565b6000818310156129a05781612934565b5090919050565b6000805a90505b825a6129ba9083615635565b1015612080576129c982615a5d565b91506129ae565b606081805190602001206040516020016129ec91815260200190565b6040516020818303038152906040529050919050565b6000612a2984612a13878686612aa0565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156129a05781612934565b60008183126129a05781612934565b6000612934670de0b6b3a764000083612a878661351e565b612a9191906157b3565b612a9b91906156d7565b613762565b60606000845111612b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b6579000000000000000000000060448201526064016107a6565b6000612b18846139a1565b90506000612b2586613a8d565b9050600084604051602001612b3c91815260200190565b60405160208183030381529060405290506000805b8451811015613495576000858281518110612b6e57612b6e615a95565b602002602001015190508451831115612c09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016107a6565b82600003612cc25780518051602091820120604051612c5792612c3192910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612cbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016107a6565b612e19565b805151602011612d785780518051602091820120604051612cec92612c3192910190815260200190565b612cbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016107a6565b805184516020808701919091208251919092012014612e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016107a6565b612e2560106001615ac4565b816020015151036130015784518303612f9957612e5f8160200151601081518110612e5257612e52615a95565b6020026020010151613af0565b96506000875111612ef2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016107a6565b60018651612f009190615635565b8214612f8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016107a6565b505050505050612934565b6000858481518110612fad57612fad615a95565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110612fd857612fd8615a95565b60200260200101519050612feb81613c50565b9550612ff8600186615ac4565b94505050613482565b6002816020015151036133fa57600061301982613c75565b905060008160008151811061303057613030615a95565b016020015160f81c90506000613047600283615adc565b613052906002615afe565b90506000613063848360ff16613c99565b905060006130718a89613c99565b9050600061307f8383613ccf565b905080835114613111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016107a6565b60ff851660021480613126575060ff85166003145b1561331557808251146131bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016107a6565b6131d58760200151600181518110612e5257612e52615a95565b9c5060008d5111613268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016107a6565b60018c516132769190615635565b8814613304576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016107a6565b505050505050505050505050612934565b60ff85161580613328575060ff85166001145b1561336757613354876020015160018151811061334757613347615a95565b6020026020010151613c50565b9950613360818a615ac4565b98506133ef565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016107a6565b505050505050613482565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016107a6565b508061348d81615a5d565b915050612b51565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016107a6565b6000808213613589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016107a6565b6000606061359684613d83565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361379357506000919050565b680755bf798b4a1bf1e58212613805576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016107a6565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156139bf576139bf614ee8565b604051908082528060200260200182016040528015613a0457816020015b60408051808201909152606080825260208201528152602001906001900390816139dd5790505b50915060005b81811015613a86576040518060400160405280858381518110613a2f57613a2f615a95565b60200260200101518152602001613a5e868481518110613a5157613a51615a95565b6020026020010151613e59565b815250838281518110613a7357613a73615a95565b6020908102919091010152600101613a0a565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613ae5578060011b82018184015160001a8060041c8253600f811660018301535050600101613ab7565b509295945050505050565b60606000806000613b0085613e6c565b919450925090506000816001811115613b1b57613b1b6154db565b14613ba8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016107a6565b613bb28284615ac4565b855114613c41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016107a6565b612a29856020015184846148d9565b60606020826000015110613c6c57613c6782613af0565b61209e565b61209e8261496d565b606061209e613c948360200151600081518110612e5257612e52615a95565b613a8d565b606082518210613cb8575060408051602081019091526000815261209e565b6129348383848651613cca9190615635565b614983565b6000808251845110613ce2578251613ce5565b83515b90505b8082108015613d6c5750828281518110613d0457613d04615a95565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613d4357613d43615a95565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613d7c57816001019150613ce8565b5092915050565b6000808211613dee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016107a6565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606061209e613e6783614b5b565b614c44565b600080600080846000015111613f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016107a6565b6020840151805160001a607f8111613f4f5760006001600094509450945050506148d2565b60b7811161415d576000613f64608083615635565b90508087600001511161401f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016107a6565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061409857507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b61414a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016107a6565b50600195509350600092506148d2915050565b60bf81116144ab57600061417260b783615635565b90508087600001511161422d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016107a6565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361430b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016107a6565b600184015160088302610100031c603781116143cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016107a6565b6143d98184615ac4565b89511161448e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016107a6565b614499836001615ac4565b97509550600094506148d29350505050565b60f7811161458c5760006144c060c083615635565b90508087600001511161457b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016107a6565b6001955093508492506148d2915050565b600061459960f783615635565b905080876000015111614654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016107a6565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016107a6565b600184015160088302610100031c603781116147f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016107a6565b6148008184615ac4565b8951116148b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016107a6565b6148c0836001615ac4565b97509550600194506148d29350505050565b9193909250565b60608167ffffffffffffffff8111156148f4576148f4614ee8565b6040519080825280601f01601f19166020018201604052801561491e576020820181803683370190505b50905081156129345760006149338486615ac4565b90506020820160005b8481101561495457828101518282015260200161493c565b84811115614963576000858301525b5050509392505050565b606061209e8260200151600084600001516148d9565b60608182601f0110156149f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016107a6565b828284011015614a5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016107a6565b81830184511015614acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016107a6565b606082158015614aea5760405191506000825260208201604052614b52565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614b23578051835260209283019201614b0b565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614c26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016107a6565b50604080518082019091528151815260209182019181019190915290565b60606000806000614c5485613e6c565b919450925090506001816001811115614c6f57614c6f6154db565b14614cfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016107a6565b8451614d088385615ac4565b14614d95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016107a6565b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081614dac5790505093506000835b8651811015614e9a57600080614e1f6040518060400160405280858c60000151614e039190615635565b8152602001858c60200151614e189190615ac4565b9052613e6c565b509150915060405180604001604052808383614e3b9190615ac4565b8152602001848b60200151614e509190615ac4565b815250888581518110614e6557614e65615a95565b6020908102919091010152614e7b600185615ac4565b9350614e878183615ac4565b614e919084615ac4565b92505050614dd9565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114614ec857600080fd5b50565b600060208284031215614edd57600080fd5b813561293481614ea6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614f5e57614f5e614ee8565b604052919050565b600082601f830112614f7757600080fd5b813567ffffffffffffffff811115614f9157614f91614ee8565b614fc260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614f17565b818152846020838601011115614fd757600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561500657600080fd5b60405160c0810167ffffffffffffffff828210818311171561502a5761502a614ee8565b81604052829350843583526020850135915061504582614ea6565b8160208401526040850135915061505b82614ea6565b816040840152606085013560608401526080850135608084015260a085013591508082111561508957600080fd5b5061509685828601614f66565b60a0830152505092915050565b600080600080600085870360e08112156150bc57600080fd5b863567ffffffffffffffff808211156150d457600080fd5b6150e08a838b01614ff4565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561511957600080fd5b60408901955060c089013592508083111561513357600080fd5b828901925089601f84011261514757600080fd5b823591508082111561515857600080fd5b508860208260051b840101111561516e57600080fd5b959894975092955050506020019190565b60005b8381101561519a578181015183820152602001615182565b83811115611b5b5750506000910152565b600081518084526151c381602086016020860161517f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061293460208301846151ab565b60006020828403121561521a57600080fd5b5035919050565b63ffffffff81168114614ec857600080fd5b60006020828403121561524557600080fd5b813561293481615221565b60006020828403121561526257600080fd5b813567ffffffffffffffff81111561527957600080fd5b61528584828501614ff4565b949350505050565b67ffffffffffffffff81168114614ec857600080fd5b6000602082840312156152b557600080fd5b81356129348161528d565b6000806000606084860312156152d557600080fd5b83356152e081614ea6565b925060208401356152f081614ea6565b9150604084013561530081614ea6565b809150509250925092565b8015158114614ec857600080fd5b600080600080600060a0868803121561533157600080fd5b853561533c81614ea6565b94506020860135935060408601356153538161528d565b925060608601356153638161530b565b9150608086013567ffffffffffffffff81111561537f57600080fd5b61538b88828901614f66565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516153ec81604985016020870161517f565b919091016049019695505050505050565b60006020828403121561540f57600080fd5b815161293481614ea6565b60008060006060848603121561542f57600080fd5b835161543a81615221565b602085015190935061544b8161528d565b604085015190925061530081614ea6565b60006020828403121561546e57600080fd5b5051919050565b60006080828403121561548757600080fd5b6040516080810181811067ffffffffffffffff821117156154aa576154aa614ee8565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020828403121561551c57600080fd5b81516003811061293457600080fd5b60006020828403121561553d57600080fd5b815161293481615221565b600067ffffffffffffffff8084111561556357615563614ee8565b8360051b6020615574818301614f17565b86815291850191818101903684111561558c57600080fd5b865b848110156155c0578035868111156155a65760008081fd5b6155b236828b01614f66565b84525091830191830161558e565b50979650505050505050565b6000602082840312156155de57600080fd5b81516129348161530b565b6000602082840312156155fb57600080fd5b81516129348161528d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561564757615647615606565b500390565b600067ffffffffffffffff8083168185168183048111821515161561567357615673615606565b02949350505050565b600067ffffffffffffffff80831681851680830382111561569f5761569f615606565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826156e6576156e66156a8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561573a5761573a615606565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561577957615779615606565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156157ad576157ad615606565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156157f4576157f4615606565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561582f5761582f615606565b6000871292508782058712848416161561584b5761584b615606565b8785058712818416161561586157615861615606565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156158a9576158a9615606565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156158dd576158dd615606565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561591b5761591b615606565b500290565b60008261592f5761592f6156a8565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261597f60c08301846151ab565b98975050505050505050565b805160ff8116811461599c57600080fd5b919050565b600060c082840312156159b357600080fd5b60405160c0810181811067ffffffffffffffff821117156159d6576159d6614ee8565b60405282516159e481615221565b81526159f26020840161598b565b6020820152615a036040840161598b565b60408201526060830151615a1681615221565b60608201526080830151615a2981615221565b608082015260a08301516fffffffffffffffffffffffffffffffff81168114615a5157600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a8e57615a8e615606565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115615ad757615ad7615606565b500190565b600060ff831680615aef57615aef6156a8565b8060ff84160691505092915050565b600060ff821660ff841680821015615b1857615b18615606565b9003939250505056fea164736f6c634300080f000a",
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_proofMaturityDelaySeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_disputeGameFinalityDelaySeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_initialRespectedGameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"blacklistDisputeGame\",\"inputs\":[{\"name\":\"_disputeGame\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkWithdrawal\",\"inputs\":[{\"name\":\"_withdrawalHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_proofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositTransaction\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_isCreation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"disputeGameBlacklist\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disputeGameFactory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractDisputeGameFactory\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disputeGameFinalityDelaySeconds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"donateETH\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"finalizeWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizeWithdrawalTransactionExternalProof\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizedWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardian\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_disputeGameFactory\",\"type\":\"address\",\"internalType\":\"contractDisputeGameFactory\"},{\"name\":\"_systemConfig\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"},{\"name\":\"_superchainConfig\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l2Sender\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minimumGasLimit\",\"inputs\":[{\"name\":\"_byteCount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"numProofSubmitters\",\"inputs\":[{\"name\":\"_withdrawalHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"params\",\"inputs\":[],\"outputs\":[{\"name\":\"prevBaseFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"prevBoughtGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"prevBlockNum\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofMaturityDelaySeconds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitters\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveWithdrawalTransaction\",\"inputs\":[{\"name\":\"_tx\",\"type\":\"tuple\",\"internalType\":\"structTypes.WithdrawalTransaction\",\"components\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_disputeGameIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_outputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"latestBlockhash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provenWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"disputeGameProxy\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"respectedGameType\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"respectedGameTypeUpdatedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setRespectedGameType\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"superchainConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"systemConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSystemConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransactionDeposited\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"version\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"opaqueData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalFinalized\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalProven\",\"inputs\":[{\"name\":\"withdrawalHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BadTarget\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GasEstimation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LargeCalldata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfGas\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SmallGasLimit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[]}]",
+	Bin: "0x60c06040523480156200001157600080fd5b5060405162005c3938038062005c398339810160408190526200003491620002d3565b608083905260a0829052603b805463ffffffff191663ffffffff831617905562000061600080806200006a565b50505062000317565b600054610100900460ff16158080156200008b5750600054600160ff909116105b80620000bb5750620000a8306200020560201b6200206c1760201c565b158015620000bb575060005460ff166001145b620001245760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000148576000805461ff0019166101001790555b603880546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b0319166101008584160217905560325416620001ae57603280546001600160a01b03191661dead1790555b620001b862000214565b8015620001ff576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff16620002815760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200011b565b600154600160c01b90046001600160401b0316600003620002d15760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b600080600060608486031215620002e957600080fd5b8351925060208401519150604084015163ffffffff811681146200030c57600080fd5b809150509250925092565b60805160a0516158ee6200034b600039600081816104a30152611a4601526000818161061a015261168401526158ee6000f3fe6080604052600436106101b05760003560e01c80637fc48504116100ec578063a3860f481161008a578063c0c53b8b11610064578063c0c53b8b1461063e578063cff0ab961461065e578063e9e05c42146106ff578063f2b4e6171461071257600080fd5b8063a3860f4814610544578063bb2c727e14610564578063bf653a5c1461060b57600080fd5b8063952b2797116100c6578063952b2797146104945780639bf62d82146104c7578063a14238e7146104f4578063a35d99df1461052457600080fd5b80637fc48504146104545780638b4c40b0146101d55780638c3152e91461047457600080fd5b80634870496f1161015957806354fd4d501161013357806354fd4d50146103a95780635c975abb146103ff57806371c1566e146104145780637d6be8dc1461043457600080fd5b80634870496f1461030c5780634fd0434c1461032c578063513747ab1461036e57600080fd5b806343ca1c501161018a57806343ca1c5014610297578063452a9320146102b757806345884d32146102cc57600080fd5b806333d7e2bd146101dc57806335e80ab3146102335780633c9f397c1461026557600080fd5b366101d7576101d53334620186a060006040518060200160405280600081525061073f565b005b600080fd5b3480156101e857600080fd5b506037546102099073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023f57600080fd5b5060355461020990610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561027157600080fd5b50603b546102829063ffffffff1681565b60405163ffffffff909116815260200161022a565b3480156102a357600080fd5b506101d56102b2366004614dad565b6108fc565b3480156102c357600080fd5b50610209610b5a565b3480156102d857600080fd5b506102fc6102e7366004614dff565b603a6020526000908152604090205460ff1681565b604051901515815260200161022a565b34801561031857600080fd5b506101d5610327366004614e1c565b610bf2565b34801561033857600080fd5b50603b5461035590640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161022a565b34801561037a57600080fd5b5061039b610389366004614ef8565b6000908152603c602052604090205490565b60405190815260200161022a565b3480156103b557600080fd5b506103f26040518060400160405280600581526020017f332e372e3000000000000000000000000000000000000000000000000000000081525081565b60405161022a9190614f87565b34801561040b57600080fd5b506102fc6112d6565b34801561042057600080fd5b506101d561042f366004614f9a565b611369565b34801561044057600080fd5b506101d561044f366004614dff565b611bfa565b34801561046057600080fd5b506101d561046f366004614fd1565b611cb5565b34801561048057600080fd5b506101d561048f366004614fee565b611d6f565b3480156104a057600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039b565b3480156104d357600080fd5b506032546102099073ffffffffffffffffffffffffffffffffffffffff1681565b34801561050057600080fd5b506102fc61050f366004614ef8565b60336020526000908152604090205460ff1681565b34801561053057600080fd5b5061035561053f366004615041565b611dbb565b34801561055057600080fd5b5061020961055f36600461505e565b611dda565b34801561057057600080fd5b506105d661057f366004614f9a565b603960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301520161022a565b34801561061757600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039b565b34801561064a57600080fd5b506101d5610659366004615080565b611e1f565b34801561066a57600080fd5b506001546106c6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161022a565b6101d561070d3660046150d9565b61073f565b34801561071e57600080fd5b506038546102099073ffffffffffffffffffffffffffffffffffffffff1681565b8260005a9050838015610767575073ffffffffffffffffffffffffffffffffffffffff871615155b1561079e576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107a88351611dbb565b67ffffffffffffffff168567ffffffffffffffff1610156107f5576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c083511115610833576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33328114610854575033731111000000000000000000000000000000001111015b6000348888888860405160200161086f959493929190615158565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516108df9190614f87565b60405180910390a450506108f38282612088565b50505050505050565b6109046112d6565b1561093b576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead146109e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084015b60405180910390fd5b60006109f48361235f565b9050610a008183611369565b600081815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558401516080850151606086015160a0870151610aa2939291906123ac565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90610b0790841515815260200190565b60405180910390a280158015610b1d5750326001145b15610b54576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed91906151bd565b905090565b610bfa6112d6565b15610c31576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610cf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016109e0565b6038546040517fbb8aa1fc00000000000000000000000000000000000000000000000000000000815260048101869052600091829173ffffffffffffffffffffffffffffffffffffffff9091169063bb8aa1fc90602401606060405180830381865afa158015610d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8891906151da565b925050915060008173ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfe919061521c565b603b5490915063ffffffff848116911614610e9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b610eb2610ead36889003880188615235565b61240a565b8114610f40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016109e0565b6000610f4b8961235f565b905060018373ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe91906152ca565b6002811115610fcf57610fcf61529b565b0361105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f742070726f76652061676160448201527f696e737420696e76616c696420646973707574652067616d657300000000000060648201526084016109e0565b60408051602081018390526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506111259101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529061111b898b6152eb565b8b60400135612449565b6111b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016109e0565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff808716825267ffffffffffffffff4281166020808501918252600088815260398252868120338252825286812095518654935190941674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931693851693909317919091179093558d840151928e01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4506000908152603c602090815260408220805460018101825590835291200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed919061536f565b600082815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff85811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152818552603a90935292205490919060ff161561146e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652068617360448201527f206265656e20626c61636b6c697374656400000000000000000000000000000060648201526084016109e0565b816020015167ffffffffffffffff16600003611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2062792070726f6f66207375626d6974746560648201527f7220616464726573732079657400000000000000000000000000000000000000608482015260a4016109e0565b60006115b38273ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a6919061538c565b67ffffffffffffffff1690565b90508067ffffffffffffffff16836020015167ffffffffffffffff1611611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e20646973707574652067616d65206372656160648201527f74696f6e2074696d657374616d70000000000000000000000000000000000000608482015260a4016109e0565b7f0000000000000000000000000000000000000000000000000000000000000000836020015167ffffffffffffffff16426116bd91906153d8565b1161174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c20686173206e6f74206d61747572656420796574000000000000000000000060648201526084016109e0565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bb91906152ca565b60028111156117cc576117cc61529b565b14611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f686173206e6f74206265656e2076616c6964617465640000000000000000000060648201526084016109e0565b603b5463ffffffff1663ffffffff166118e38373ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118da91906153ef565b63ffffffff1690565b63ffffffff1614611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b603b5467ffffffffffffffff64010000000090910481169082161015611a44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652063726560448201527f61746564206265666f7265207265737065637465642067616d6520747970652060648201527f7761732075706461746564000000000000000000000000000000000000000000608482015260a4016109e0565b7f0000000000000000000000000000000000000000000000000000000000000000611ab38373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d6000803e3d6000fd5b611ac79067ffffffffffffffff16426153d8565b11611b54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f696e206169722d6761700000000000000000000000000000000000000000000060648201526084016109e0565b60008581526033602052604090205460ff1615611bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016109e0565b5050505050565b611c02610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c66576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff166000908152603a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611cbd610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d21576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b805463ffffffff929092167fffffffffffffffffffffffffffffffffffffffff000000000000000000000000909216919091176401000000004267ffffffffffffffff1602179055565b565b611d776112d6565b15611dae576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611db881336108fc565b50565b6000611dc882601061540c565b611dd49061520861543c565b92915050565b603c6020528160005260406000208181548110611df657600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b600054610100900460ff1615808015611e3f5750600054600160ff909116105b80611e595750303b158015611e59575060005460ff166001145b611ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109e0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611f4357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611ffc57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b61200461246d565b8015610b5457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6001546000906120be907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436153d8565b905060006120ca612580565b90506000816020015160ff16826000015163ffffffff166120eb9190615497565b9050821561222257600154600090612122908390700100000000000000000000000000000000900467ffffffffffffffff166154ff565b90506000836040015160ff16836121399190615573565b6001546121599084906fffffffffffffffffffffffffffffffff16615573565b6121639190615497565b6001549091506000906121b49061218d9084906fffffffffffffffffffffffffffffffff1661562f565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612641565b905060018611156121e3576121e061218d82876040015160ff1660018a6121db91906153d8565b612660565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090612255908490700100000000000000000000000000000000900467ffffffffffffffff1661543c565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156122e2576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015460009061230e906fffffffffffffffffffffffffffffffff1667ffffffffffffffff88166156a3565b9050600061232048633b9aca006126b5565b61232a90836156e0565b905060005a61233990886153d8565b9050808211156123555761235561235082846153d8565b6126cc565b5050505050505050565b80516020808301516040808501516060860151608087015160a0880151935160009761238f9790969591016156f4565b604051602081830303815290604052805190602001209050919050565b60008060006123bc8660006126fa565b9050806123f2576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b6000816000015182602001518360400151846060015160405160200161238f949392919093845260208401929092526040830152606082015260800190565b60008061245586612718565b90506124638186868661274a565b9695505050505050565b600054610100900460ff16612504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e0565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003611d6d5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa15801561261d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190615761565b6000612656612650858561277a565b8361278a565b90505b9392505050565b6000670de0b6b3a76400006126a16126788583615497565b61268a90670de0b6b3a76400006154ff565b61269c85670de0b6b3a7640000615573565b612799565b6126ab9086615573565b6126569190615497565b6000818310156126c55781612659565b5090919050565b6000805a90505b825a6126df90836153d8565b10156126f5576126ee8261581d565b91506126d3565b505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6060818051906020012060405160200161273491815260200190565b6040516020818303038152906040529050919050565b60006127718461275b8786866127ca565b8051602091820120825192909101919091201490565b95945050505050565b6000818312156126c55781612659565b60008183126126c55781612659565b6000612659670de0b6b3a7640000836127b186613248565b6127bb9190615573565b6127c59190615497565b61348c565b60606000845111612837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b6579000000000000000000000060448201526064016109e0565b6000612842846136cb565b9050600061284f866137b7565b905060008460405160200161286691815260200190565b60405160208183030381529060405290506000805b84518110156131bf57600085828151811061289857612898615855565b602002602001015190508451831115612933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016109e0565b826000036129ec57805180516020918201206040516129819261295b92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6129e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016109e0565b612b43565b805151602011612aa25780518051602091820120604051612a169261295b92910190815260200190565b6129e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016109e0565b805184516020808701919091208251919092012014612b43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016109e0565b612b4f60106001615884565b81602001515103612d2b5784518303612cc357612b898160200151601081518110612b7c57612b7c615855565b602002602001015161381a565b96506000875111612c1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016109e0565b60018651612c2a91906153d8565b8214612cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016109e0565b505050505050612659565b6000858481518110612cd757612cd7615855565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110612d0257612d02615855565b60200260200101519050612d158161397a565b9550612d22600186615884565b945050506131ac565b600281602001515103613124576000612d438261399f565b9050600081600081518110612d5a57612d5a615855565b016020015160f81c90506000612d7160028361589c565b612d7c9060026158be565b90506000612d8d848360ff166139c3565b90506000612d9b8a896139c3565b90506000612da983836139f9565b905080835114612e3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016109e0565b60ff851660021480612e50575060ff85166003145b1561303f5780825114612ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016109e0565b612eff8760200151600181518110612b7c57612b7c615855565b9c5060008d5111612f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016109e0565b60018c51612fa091906153d8565b881461302e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016109e0565b505050505050505050505050612659565b60ff85161580613052575060ff85166001145b156130915761307e876020015160018151811061307157613071615855565b602002602001015161397a565b995061308a818a615884565b9850613119565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016109e0565b5050505050506131ac565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016109e0565b50806131b78161581d565b91505061287b565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016109e0565b60008082136132b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b600060606132c084613aad565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136134bd57506000919050565b680755bf798b4a1bf1e5821261352f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016109e0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156136e9576136e9614bd0565b60405190808252806020026020018201604052801561372e57816020015b60408051808201909152606080825260208201528152602001906001900390816137075790505b50915060005b818110156137b057604051806040016040528085838151811061375957613759615855565b6020026020010151815260200161378886848151811061377b5761377b615855565b6020026020010151613b83565b81525083828151811061379d5761379d615855565b6020908102919091010152600101613734565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b8381101561380f578060011b82018184015160001a8060041c8253600f8116600183015350506001016137e1565b509295945050505050565b6060600080600061382a85613b96565b9194509250905060008160018111156138455761384561529b565b146138d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016109e0565b6138dc8284615884565b85511461396b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016109e0565b61277185602001518484614603565b60606020826000015110613996576139918261381a565b611dd4565b611dd482614697565b6060611dd46139be8360200151600081518110612b7c57612b7c615855565b6137b7565b6060825182106139e25750604080516020810190915260008152611dd4565b61265983838486516139f491906153d8565b6146ad565b6000808251845110613a0c578251613a0f565b83515b90505b8082108015613a965750828281518110613a2e57613a2e615855565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613a6d57613a6d615855565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613aa657816001019150613a12565b5092915050565b6000808211613b18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060611dd4613b9183614885565b61496e565b600080600080846000015111613c54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016109e0565b6020840151805160001a607f8111613c795760006001600094509450945050506145fc565b60b78111613e87576000613c8e6080836153d8565b905080876000015111613d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016109e0565b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082141580613dc257507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613e74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016109e0565b50600195509350600092506145fc915050565b60bf81116141d5576000613e9c60b7836153d8565b905080876000015111613f57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016109e0565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016109e0565b600184015160088302610100031c603781116140f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016109e0565b6141038184615884565b8951116141b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016109e0565b6141c3836001615884565b97509550600094506145fc9350505050565b60f781116142b65760006141ea60c0836153d8565b9050808760000151116142a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016109e0565b6001955093508492506145fc915050565b60006142c360f7836153d8565b90508087600001511161437e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016109e0565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361445c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016109e0565b600184015160088302610100031c60378111614520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016109e0565b61452a8184615884565b8951116145df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016109e0565b6145ea836001615884565b97509550600194506145fc9350505050565b9193909250565b60608167ffffffffffffffff81111561461e5761461e614bd0565b6040519080825280601f01601f191660200182016040528015614648576020820181803683370190505b509050811561265957600061465d8486615884565b90506020820160005b8481101561467e578281015182820152602001614666565b8481111561468d576000858301525b5050509392505050565b6060611dd4826020015160008460000151614603565b60608182601f01101561471c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b828284011015614788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b818301845110156147f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016109e0565b606082158015614814576040519150600082526020820160405261487c565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561484d578051835260209283019201614835565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016109e0565b50604080518082019091528151815260209182019181019190915290565b6060600080600061497e85613b96565b9194509250905060018160018111156149995761499961529b565b14614a26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016109e0565b8451614a328385615884565b14614abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016109e0565b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081614ad65790505093506000835b8651811015614bc457600080614b496040518060400160405280858c60000151614b2d91906153d8565b8152602001858c60200151614b429190615884565b9052613b96565b509150915060405180604001604052808383614b659190615884565b8152602001848b60200151614b7a9190615884565b815250888581518110614b8f57614b8f615855565b6020908102919091010152614ba5600185615884565b9350614bb18183615884565b614bbb9084615884565b92505050614b03565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614c4657614c46614bd0565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611db857600080fd5b600082601f830112614c8157600080fd5b813567ffffffffffffffff811115614c9b57614c9b614bd0565b614ccc60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614bff565b818152846020838601011115614ce157600080fd5b816020850160208301376000918101602001919091529392505050565b600060c08284031215614d1057600080fd5b60405160c0810167ffffffffffffffff8282108183111715614d3457614d34614bd0565b816040528293508435835260208501359150614d4f82614c4e565b81602084015260408501359150614d6582614c4e565b816040840152606085013560608401526080850135608084015260a0850135915080821115614d9357600080fd5b50614da085828601614c70565b60a0830152505092915050565b60008060408385031215614dc057600080fd5b823567ffffffffffffffff811115614dd757600080fd5b614de385828601614cfe565b9250506020830135614df481614c4e565b809150509250929050565b600060208284031215614e1157600080fd5b813561265981614c4e565b600080600080600085870360e0811215614e3557600080fd5b863567ffffffffffffffff80821115614e4d57600080fd5b614e598a838b01614cfe565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614e9257600080fd5b60408901955060c0890135925080831115614eac57600080fd5b828901925089601f840112614ec057600080fd5b8235915080821115614ed157600080fd5b508860208260051b8401011115614ee757600080fd5b959894975092955050506020019190565b600060208284031215614f0a57600080fd5b5035919050565b60005b83811015614f2c578181015183820152602001614f14565b83811115610b545750506000910152565b60008151808452614f55816020860160208601614f11565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006126596020830184614f3d565b60008060408385031215614fad57600080fd5b823591506020830135614df481614c4e565b63ffffffff81168114611db857600080fd5b600060208284031215614fe357600080fd5b813561265981614fbf565b60006020828403121561500057600080fd5b813567ffffffffffffffff81111561501757600080fd5b61502384828501614cfe565b949350505050565b67ffffffffffffffff81168114611db857600080fd5b60006020828403121561505357600080fd5b81356126598161502b565b6000806040838503121561507157600080fd5b50508035926020909101359150565b60008060006060848603121561509557600080fd5b83356150a081614c4e565b925060208401356150b081614c4e565b915060408401356150c081614c4e565b809150509250925092565b8015158114611db857600080fd5b600080600080600060a086880312156150f157600080fd5b85356150fc81614c4e565b94506020860135935060408601356151138161502b565b92506060860135615123816150cb565b9150608086013567ffffffffffffffff81111561513f57600080fd5b61514b88828901614c70565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516151ac816049850160208701614f11565b919091016049019695505050505050565b6000602082840312156151cf57600080fd5b815161265981614c4e565b6000806000606084860312156151ef57600080fd5b83516151fa81614fbf565b602085015190935061520b8161502b565b60408501519092506150c081614c4e565b60006020828403121561522e57600080fd5b5051919050565b60006080828403121561524757600080fd5b6040516080810181811067ffffffffffffffff8211171561526a5761526a614bd0565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000602082840312156152dc57600080fd5b81516003811061265957600080fd5b600067ffffffffffffffff8084111561530657615306614bd0565b8360051b6020615317818301614bff565b86815291850191818101903684111561532f57600080fd5b865b84811015615363578035868111156153495760008081fd5b61535536828b01614c70565b845250918301918301615331565b50979650505050505050565b60006020828403121561538157600080fd5b8151612659816150cb565b60006020828403121561539e57600080fd5b81516126598161502b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156153ea576153ea6153a9565b500390565b60006020828403121561540157600080fd5b815161265981614fbf565b600067ffffffffffffffff80831681851681830481118215151615615433576154336153a9565b02949350505050565b600067ffffffffffffffff80831681851680830382111561545f5761545f6153a9565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826154a6576154a6615468565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156154fa576154fa6153a9565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615615539576155396153a9565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561556d5761556d6153a9565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156155b4576155b46153a9565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156155ef576155ef6153a9565b6000871292508782058712848416161561560b5761560b6153a9565b87850587128184161615615621576156216153a9565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615669576156696153a9565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561569d5761569d6153a9565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156db576156db6153a9565b500290565b6000826156ef576156ef615468565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261573f60c0830184614f3d565b98975050505050505050565b805160ff8116811461575c57600080fd5b919050565b600060c0828403121561577357600080fd5b60405160c0810181811067ffffffffffffffff8211171561579657615796614bd0565b60405282516157a481614fbf565b81526157b26020840161574b565b60208201526157c36040840161574b565b604082015260608301516157d681614fbf565b606082015260808301516157e981614fbf565b608082015260a08301516fffffffffffffffffffffffffffffffff8116811461581157600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361584e5761584e6153a9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115615897576158976153a9565b500190565b600060ff8316806158af576158af615468565b8060ff84160691505092915050565b600060ff821660ff8416808210156158d8576158d86153a9565b9003939250505056fea164736f6c634300080f000a",
 }
 
 // OptimismPortal2ABI is the input ABI used to generate the binding from.
@@ -219,74 +219,12 @@ func (_OptimismPortal2 *OptimismPortal2TransactorRaw) Transact(opts *bind.Transa
 	return _OptimismPortal2.Contract.contract.Transact(opts, method, params...)
 }
 
-// GUARDIAN is a free data retrieval call binding the contract method 0x724c184c.
+// CheckWithdrawal is a free data retrieval call binding the contract method 0x71c1566e.
 //
-// Solidity: function GUARDIAN() view returns(address)
-func (_OptimismPortal2 *OptimismPortal2Caller) GUARDIAN(opts *bind.CallOpts) (common.Address, error) {
+// Solidity: function checkWithdrawal(bytes32 _withdrawalHash, address _proofSubmitter) view returns()
+func (_OptimismPortal2 *OptimismPortal2Caller) CheckWithdrawal(opts *bind.CallOpts, _withdrawalHash [32]byte, _proofSubmitter common.Address) error {
 	var out []interface{}
-	err := _OptimismPortal2.contract.Call(opts, &out, "GUARDIAN")
-
-	if err != nil {
-		return *new(common.Address), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
-	return out0, err
-
-}
-
-// GUARDIAN is a free data retrieval call binding the contract method 0x724c184c.
-//
-// Solidity: function GUARDIAN() view returns(address)
-func (_OptimismPortal2 *OptimismPortal2Session) GUARDIAN() (common.Address, error) {
-	return _OptimismPortal2.Contract.GUARDIAN(&_OptimismPortal2.CallOpts)
-}
-
-// GUARDIAN is a free data retrieval call binding the contract method 0x724c184c.
-//
-// Solidity: function GUARDIAN() view returns(address)
-func (_OptimismPortal2 *OptimismPortal2CallerSession) GUARDIAN() (common.Address, error) {
-	return _OptimismPortal2.Contract.GUARDIAN(&_OptimismPortal2.CallOpts)
-}
-
-// SYSTEMCONFIG is a free data retrieval call binding the contract method 0xf0498750.
-//
-// Solidity: function SYSTEM_CONFIG() view returns(address)
-func (_OptimismPortal2 *OptimismPortal2Caller) SYSTEMCONFIG(opts *bind.CallOpts) (common.Address, error) {
-	var out []interface{}
-	err := _OptimismPortal2.contract.Call(opts, &out, "SYSTEM_CONFIG")
-
-	if err != nil {
-		return *new(common.Address), err
-	}
-
-	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
-	return out0, err
-
-}
-
-// SYSTEMCONFIG is a free data retrieval call binding the contract method 0xf0498750.
-//
-// Solidity: function SYSTEM_CONFIG() view returns(address)
-func (_OptimismPortal2 *OptimismPortal2Session) SYSTEMCONFIG() (common.Address, error) {
-	return _OptimismPortal2.Contract.SYSTEMCONFIG(&_OptimismPortal2.CallOpts)
-}
-
-// SYSTEMCONFIG is a free data retrieval call binding the contract method 0xf0498750.
-//
-// Solidity: function SYSTEM_CONFIG() view returns(address)
-func (_OptimismPortal2 *OptimismPortal2CallerSession) SYSTEMCONFIG() (common.Address, error) {
-	return _OptimismPortal2.Contract.SYSTEMCONFIG(&_OptimismPortal2.CallOpts)
-}
-
-// CheckWithdrawal is a free data retrieval call binding the contract method 0x7af1906d.
-//
-// Solidity: function checkWithdrawal(bytes32 _withdrawalHash) view returns()
-func (_OptimismPortal2 *OptimismPortal2Caller) CheckWithdrawal(opts *bind.CallOpts, _withdrawalHash [32]byte) error {
-	var out []interface{}
-	err := _OptimismPortal2.contract.Call(opts, &out, "checkWithdrawal", _withdrawalHash)
+	err := _OptimismPortal2.contract.Call(opts, &out, "checkWithdrawal", _withdrawalHash, _proofSubmitter)
 
 	if err != nil {
 		return err
@@ -296,18 +234,18 @@ func (_OptimismPortal2 *OptimismPortal2Caller) CheckWithdrawal(opts *bind.CallOp
 
 }
 
-// CheckWithdrawal is a free data retrieval call binding the contract method 0x7af1906d.
+// CheckWithdrawal is a free data retrieval call binding the contract method 0x71c1566e.
 //
-// Solidity: function checkWithdrawal(bytes32 _withdrawalHash) view returns()
-func (_OptimismPortal2 *OptimismPortal2Session) CheckWithdrawal(_withdrawalHash [32]byte) error {
-	return _OptimismPortal2.Contract.CheckWithdrawal(&_OptimismPortal2.CallOpts, _withdrawalHash)
+// Solidity: function checkWithdrawal(bytes32 _withdrawalHash, address _proofSubmitter) view returns()
+func (_OptimismPortal2 *OptimismPortal2Session) CheckWithdrawal(_withdrawalHash [32]byte, _proofSubmitter common.Address) error {
+	return _OptimismPortal2.Contract.CheckWithdrawal(&_OptimismPortal2.CallOpts, _withdrawalHash, _proofSubmitter)
 }
 
-// CheckWithdrawal is a free data retrieval call binding the contract method 0x7af1906d.
+// CheckWithdrawal is a free data retrieval call binding the contract method 0x71c1566e.
 //
-// Solidity: function checkWithdrawal(bytes32 _withdrawalHash) view returns()
-func (_OptimismPortal2 *OptimismPortal2CallerSession) CheckWithdrawal(_withdrawalHash [32]byte) error {
-	return _OptimismPortal2.Contract.CheckWithdrawal(&_OptimismPortal2.CallOpts, _withdrawalHash)
+// Solidity: function checkWithdrawal(bytes32 _withdrawalHash, address _proofSubmitter) view returns()
+func (_OptimismPortal2 *OptimismPortal2CallerSession) CheckWithdrawal(_withdrawalHash [32]byte, _proofSubmitter common.Address) error {
+	return _OptimismPortal2.Contract.CheckWithdrawal(&_OptimismPortal2.CallOpts, _withdrawalHash, _proofSubmitter)
 }
 
 // DisputeGameBlacklist is a free data retrieval call binding the contract method 0x45884d32.
@@ -527,6 +465,37 @@ func (_OptimismPortal2 *OptimismPortal2CallerSession) MinimumGasLimit(_byteCount
 	return _OptimismPortal2.Contract.MinimumGasLimit(&_OptimismPortal2.CallOpts, _byteCount)
 }
 
+// NumProofSubmitters is a free data retrieval call binding the contract method 0x513747ab.
+//
+// Solidity: function numProofSubmitters(bytes32 _withdrawalHash) view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2Caller) NumProofSubmitters(opts *bind.CallOpts, _withdrawalHash [32]byte) (*big.Int, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "numProofSubmitters", _withdrawalHash)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// NumProofSubmitters is a free data retrieval call binding the contract method 0x513747ab.
+//
+// Solidity: function numProofSubmitters(bytes32 _withdrawalHash) view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2Session) NumProofSubmitters(_withdrawalHash [32]byte) (*big.Int, error) {
+	return _OptimismPortal2.Contract.NumProofSubmitters(&_OptimismPortal2.CallOpts, _withdrawalHash)
+}
+
+// NumProofSubmitters is a free data retrieval call binding the contract method 0x513747ab.
+//
+// Solidity: function numProofSubmitters(bytes32 _withdrawalHash) view returns(uint256)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) NumProofSubmitters(_withdrawalHash [32]byte) (*big.Int, error) {
+	return _OptimismPortal2.Contract.NumProofSubmitters(&_OptimismPortal2.CallOpts, _withdrawalHash)
+}
+
 // Params is a free data retrieval call binding the contract method 0xcff0ab96.
 //
 // Solidity: function params() view returns(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum)
@@ -639,15 +608,46 @@ func (_OptimismPortal2 *OptimismPortal2CallerSession) ProofMaturityDelaySeconds(
 	return _OptimismPortal2.Contract.ProofMaturityDelaySeconds(&_OptimismPortal2.CallOpts)
 }
 
-// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+// ProofSubmitters is a free data retrieval call binding the contract method 0xa3860f48.
+//
+// Solidity: function proofSubmitters(bytes32 , uint256 ) view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Caller) ProofSubmitters(opts *bind.CallOpts, arg0 [32]byte, arg1 *big.Int) (common.Address, error) {
+	var out []interface{}
+	err := _OptimismPortal2.contract.Call(opts, &out, "proofSubmitters", arg0, arg1)
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// ProofSubmitters is a free data retrieval call binding the contract method 0xa3860f48.
 //
-// Solidity: function provenWithdrawals(bytes32 ) view returns(address disputeGameProxy, uint64 timestamp)
-func (_OptimismPortal2 *OptimismPortal2Caller) ProvenWithdrawals(opts *bind.CallOpts, arg0 [32]byte) (struct {
+// Solidity: function proofSubmitters(bytes32 , uint256 ) view returns(address)
+func (_OptimismPortal2 *OptimismPortal2Session) ProofSubmitters(arg0 [32]byte, arg1 *big.Int) (common.Address, error) {
+	return _OptimismPortal2.Contract.ProofSubmitters(&_OptimismPortal2.CallOpts, arg0, arg1)
+}
+
+// ProofSubmitters is a free data retrieval call binding the contract method 0xa3860f48.
+//
+// Solidity: function proofSubmitters(bytes32 , uint256 ) view returns(address)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) ProofSubmitters(arg0 [32]byte, arg1 *big.Int) (common.Address, error) {
+	return _OptimismPortal2.Contract.ProofSubmitters(&_OptimismPortal2.CallOpts, arg0, arg1)
+}
+
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xbb2c727e.
+//
+// Solidity: function provenWithdrawals(bytes32 , address ) view returns(address disputeGameProxy, uint64 timestamp)
+func (_OptimismPortal2 *OptimismPortal2Caller) ProvenWithdrawals(opts *bind.CallOpts, arg0 [32]byte, arg1 common.Address) (struct {
 	DisputeGameProxy common.Address
 	Timestamp        uint64
 }, error) {
 	var out []interface{}
-	err := _OptimismPortal2.contract.Call(opts, &out, "provenWithdrawals", arg0)
+	err := _OptimismPortal2.contract.Call(opts, &out, "provenWithdrawals", arg0, arg1)
 
 	outstruct := new(struct {
 		DisputeGameProxy common.Address
@@ -664,24 +664,24 @@ func (_OptimismPortal2 *OptimismPortal2Caller) ProvenWithdrawals(opts *bind.Call
 
 }
 
-// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xbb2c727e.
 //
-// Solidity: function provenWithdrawals(bytes32 ) view returns(address disputeGameProxy, uint64 timestamp)
-func (_OptimismPortal2 *OptimismPortal2Session) ProvenWithdrawals(arg0 [32]byte) (struct {
+// Solidity: function provenWithdrawals(bytes32 , address ) view returns(address disputeGameProxy, uint64 timestamp)
+func (_OptimismPortal2 *OptimismPortal2Session) ProvenWithdrawals(arg0 [32]byte, arg1 common.Address) (struct {
 	DisputeGameProxy common.Address
 	Timestamp        uint64
 }, error) {
-	return _OptimismPortal2.Contract.ProvenWithdrawals(&_OptimismPortal2.CallOpts, arg0)
+	return _OptimismPortal2.Contract.ProvenWithdrawals(&_OptimismPortal2.CallOpts, arg0, arg1)
 }
 
-// ProvenWithdrawals is a free data retrieval call binding the contract method 0xe965084c.
+// ProvenWithdrawals is a free data retrieval call binding the contract method 0xbb2c727e.
 //
-// Solidity: function provenWithdrawals(bytes32 ) view returns(address disputeGameProxy, uint64 timestamp)
-func (_OptimismPortal2 *OptimismPortal2CallerSession) ProvenWithdrawals(arg0 [32]byte) (struct {
+// Solidity: function provenWithdrawals(bytes32 , address ) view returns(address disputeGameProxy, uint64 timestamp)
+func (_OptimismPortal2 *OptimismPortal2CallerSession) ProvenWithdrawals(arg0 [32]byte, arg1 common.Address) (struct {
 	DisputeGameProxy common.Address
 	Timestamp        uint64
 }, error) {
-	return _OptimismPortal2.Contract.ProvenWithdrawals(&_OptimismPortal2.CallOpts, arg0)
+	return _OptimismPortal2.Contract.ProvenWithdrawals(&_OptimismPortal2.CallOpts, arg0, arg1)
 }
 
 // RespectedGameType is a free data retrieval call binding the contract method 0x3c9f397c.
@@ -923,6 +923,27 @@ func (_OptimismPortal2 *OptimismPortal2TransactorSession) FinalizeWithdrawalTran
 	return _OptimismPortal2.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal2.TransactOpts, _tx)
 }
 
+// FinalizeWithdrawalTransactionExternalProof is a paid mutator transaction binding the contract method 0x43ca1c50.
+//
+// Solidity: function finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes) _tx, address _proofSubmitter) returns()
+func (_OptimismPortal2 *OptimismPortal2Transactor) FinalizeWithdrawalTransactionExternalProof(opts *bind.TransactOpts, _tx TypesWithdrawalTransaction, _proofSubmitter common.Address) (*types.Transaction, error) {
+	return _OptimismPortal2.contract.Transact(opts, "finalizeWithdrawalTransactionExternalProof", _tx, _proofSubmitter)
+}
+
+// FinalizeWithdrawalTransactionExternalProof is a paid mutator transaction binding the contract method 0x43ca1c50.
+//
+// Solidity: function finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes) _tx, address _proofSubmitter) returns()
+func (_OptimismPortal2 *OptimismPortal2Session) FinalizeWithdrawalTransactionExternalProof(_tx TypesWithdrawalTransaction, _proofSubmitter common.Address) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.FinalizeWithdrawalTransactionExternalProof(&_OptimismPortal2.TransactOpts, _tx, _proofSubmitter)
+}
+
+// FinalizeWithdrawalTransactionExternalProof is a paid mutator transaction binding the contract method 0x43ca1c50.
+//
+// Solidity: function finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes) _tx, address _proofSubmitter) returns()
+func (_OptimismPortal2 *OptimismPortal2TransactorSession) FinalizeWithdrawalTransactionExternalProof(_tx TypesWithdrawalTransaction, _proofSubmitter common.Address) (*types.Transaction, error) {
+	return _OptimismPortal2.Contract.FinalizeWithdrawalTransactionExternalProof(&_OptimismPortal2.TransactOpts, _tx, _proofSubmitter)
+}
+
 // Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b.
 //
 // Solidity: function initialize(address _disputeGameFactory, address _systemConfig, address _superchainConfig) returns()
diff --git a/op-node/chaincfg/chains.go b/op-node/chaincfg/chains.go
index 34ded749fad0..2fc5c42335d8 100644
--- a/op-node/chaincfg/chains.go
+++ b/op-node/chaincfg/chains.go
@@ -9,7 +9,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 )
 
-var Mainnet, Goerli, Sepolia *rollup.Config
+var Mainnet, Sepolia *rollup.Config
 
 func init() {
 	mustCfg := func(name string) *rollup.Config {
@@ -20,7 +20,6 @@ func init() {
 		return cfg
 	}
 	Mainnet = mustCfg("op-mainnet")
-	Goerli = mustCfg("op-goerli")
 	Sepolia = mustCfg("op-sepolia")
 }
 
@@ -43,8 +42,6 @@ func AvailableNetworks() []string {
 
 func handleLegacyName(name string) string {
 	switch name {
-	case "goerli":
-		return "op-goerli"
 	case "mainnet":
 		return "op-mainnet"
 	case "sepolia":
diff --git a/op-node/chaincfg/chains_test.go b/op-node/chaincfg/chains_test.go
index b7b401b5094a..0b7355156c04 100644
--- a/op-node/chaincfg/chains_test.go
+++ b/op-node/chaincfg/chains_test.go
@@ -21,7 +21,6 @@ import (
 // the superchain-registry is no longer deemed experimental.
 func TestGetRollupConfig(t *testing.T) {
 	configsByName := map[string]rollup.Config{
-		"goerli":                        goerliCfg,
 		"mainnet":                       mainnetCfg,
 		"sepolia":                       sepoliaCfg,
 		"oplabs-devnet-0-sepolia-dev-0": sepoliaDev0Cfg,
@@ -69,40 +68,6 @@ var mainnetCfg = rollup.Config{
 	ProtocolVersionsAddress: common.HexToAddress("0x8062AbC286f5e7D9428a0Ccb9AbD71e50d93b935"),
 }
 
-var goerliCfg = rollup.Config{
-	Genesis: rollup.Genesis{
-		L1: eth.BlockID{
-			Hash:   common.HexToHash("0x6ffc1bf3754c01f6bb9fe057c1578b87a8571ce2e9be5ca14bace6eccfd336c7"),
-			Number: 8300214,
-		},
-		L2: eth.BlockID{
-			Hash:   common.HexToHash("0x0f783549ea4313b784eadd9b8e8a69913b368b7366363ea814d7707ac505175f"),
-			Number: 4061224,
-		},
-		L2Time: 1673550516,
-		SystemConfig: eth.SystemConfig{
-			BatcherAddr: common.HexToAddress("0x7431310e026B69BFC676C0013E12A1A11411EEc9"),
-			Overhead:    eth.Bytes32(common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000834")),
-			Scalar:      eth.Bytes32(common.HexToHash("0x00000000000000000000000000000000000000000000000000000000000f4240")),
-			GasLimit:    25_000_000,
-		},
-	},
-	BlockTime:               2,
-	MaxSequencerDrift:       600,
-	SeqWindowSize:           3600,
-	ChannelTimeout:          300,
-	L1ChainID:               big.NewInt(5),
-	L2ChainID:               big.NewInt(420),
-	BatchInboxAddress:       common.HexToAddress("0xff00000000000000000000000000000000000420"),
-	DepositContractAddress:  common.HexToAddress("0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383"),
-	L1SystemConfigAddress:   common.HexToAddress("0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60"),
-	RegolithTime:            u64Ptr(1679079600),
-	CanyonTime:              u64Ptr(1699981200),
-	DeltaTime:               u64Ptr(1703116800),
-	EcotoneTime:             u64Ptr(1707238800),
-	ProtocolVersionsAddress: common.HexToAddress("0x0C24F5098774aA366827D667494e9F889f7cFc08"),
-}
-
 var sepoliaCfg = rollup.Config{
 	Genesis: rollup.Genesis{
 		L1: eth.BlockID{
@@ -134,6 +99,7 @@ var sepoliaCfg = rollup.Config{
 	CanyonTime:              u64Ptr(1699981200),
 	DeltaTime:               u64Ptr(1703203200),
 	EcotoneTime:             u64Ptr(1708534800),
+	FjordTime:               u64Ptr(1716998400),
 	ProtocolVersionsAddress: common.HexToAddress("0x79ADD5713B383DAa0a138d3C4780C7A1804a8090"),
 }
 
@@ -168,6 +134,7 @@ var sepoliaDev0Cfg = rollup.Config{
 	CanyonTime:              u64Ptr(0),
 	DeltaTime:               u64Ptr(0),
 	EcotoneTime:             u64Ptr(1706634000),
+	FjordTime:               u64Ptr(1715961600),
 	ProtocolVersionsAddress: common.HexToAddress("0x252CbE9517F731C618961D890D534183822dcC8d"),
 }
 
diff --git a/op-node/cmd/batch_decoder/fetch/fetch.go b/op-node/cmd/batch_decoder/fetch/fetch.go
index df5e0626bbd9..1ffc87db64c8 100644
--- a/op-node/cmd/batch_decoder/fetch/fetch.go
+++ b/op-node/cmd/batch_decoder/fetch/fetch.go
@@ -12,7 +12,10 @@ import (
 	"time"
 
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
+	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/sources"
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/ethclient"
 	"golang.org/x/sync/errgroup"
@@ -28,8 +31,8 @@ type TransactionWithMetadata struct {
 	Sender      common.Address     `json:"sender"`
 	ValidSender bool               `json:"valid_sender"`
 	Frames      []derive.Frame     `json:"frames"`
-	FrameErr    string             `json:"frame_parse_error"`
-	ValidFrames bool               `json:"valid_data"`
+	FrameErrs   []string           `json:"frame_parse_error"`
+	ValidFrames []bool             `json:"valid_data"`
 	Tx          *types.Transaction `json:"tx"`
 }
 
@@ -45,7 +48,7 @@ type Config struct {
 // Batches fetches & stores all transactions sent to the batch inbox address in
 // the given block range (inclusive to exclusive).
 // The transactions & metadata are written to the out directory.
-func Batches(client *ethclient.Client, config Config) (totalValid, totalInvalid uint64) {
+func Batches(client *ethclient.Client, beacon *sources.L1BeaconClient, config Config) (totalValid, totalInvalid uint64) {
 	if err := os.MkdirAll(config.OutDirectory, 0750); err != nil {
 		log.Fatal(err)
 	}
@@ -61,7 +64,7 @@ func Batches(client *ethclient.Client, config Config) (totalValid, totalInvalid
 		}
 		number := i
 		g.Go(func() error {
-			valid, invalid, err := fetchBatchesPerBlock(ctx, client, number, signer, config)
+			valid, invalid, err := fetchBatchesPerBlock(ctx, client, beacon, number, signer, config)
 			if err != nil {
 				return fmt.Errorf("error occurred while fetching block %d: %w", number, err)
 			}
@@ -77,7 +80,7 @@ func Batches(client *ethclient.Client, config Config) (totalValid, totalInvalid
 }
 
 // fetchBatchesPerBlock gets a block & the parses all of the transactions in the block.
-func fetchBatchesPerBlock(ctx context.Context, client *ethclient.Client, number uint64, signer types.Signer, config Config) (uint64, uint64, error) {
+func fetchBatchesPerBlock(ctx context.Context, client *ethclient.Client, beacon *sources.L1BeaconClient, number uint64, signer types.Signer, config Config) (uint64, uint64, error) {
 	validBatchCount := uint64(0)
 	invalidBatchCount := uint64(0)
 	ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
@@ -87,6 +90,7 @@ func fetchBatchesPerBlock(ctx context.Context, client *ethclient.Client, number
 		return 0, 0, err
 	}
 	fmt.Println("Fetched block: ", number)
+	blobIndex := 0 // index of each blob in the block's blob sidecar
 	for i, tx := range block.Transactions() {
 		if tx.To() != nil && *tx.To() == config.BatchInbox {
 			sender, err := signer.Sender(tx)
@@ -99,22 +103,66 @@ func fetchBatchesPerBlock(ctx context.Context, client *ethclient.Client, number
 				invalidBatchCount += 1
 				validSender = false
 			}
-
-			validFrames := true
-			frameError := ""
-			frames, err := derive.ParseFrames(tx.Data())
-			if err != nil {
-				fmt.Printf("Found a transaction (%s) with invalid data: %v\n", tx.Hash().String(), err)
-				validFrames = false
-				frameError = err.Error()
+			var datas []hexutil.Bytes
+			if tx.Type() != types.BlobTxType {
+				datas = append(datas, tx.Data())
+				// no need to increment blobIndex because no blobs
+			} else {
+				if beacon == nil {
+					fmt.Printf("Unable to handle blob transaction (%s) because L1 Beacon API not provided\n", tx.Hash().String())
+					blobIndex += len(tx.BlobHashes())
+					continue
+				}
+				var hashes []eth.IndexedBlobHash
+				for _, h := range tx.BlobHashes() {
+					idh := eth.IndexedBlobHash{
+						Index: uint64(blobIndex),
+						Hash:  h,
+					}
+					hashes = append(hashes, idh)
+					blobIndex += 1
+				}
+				blobs, err := beacon.GetBlobs(ctx, eth.L1BlockRef{
+					Hash:       block.Hash(),
+					Number:     block.Number().Uint64(),
+					ParentHash: block.ParentHash(),
+					Time:       block.Time(),
+				}, hashes)
+				if err != nil {
+					log.Fatal(fmt.Errorf("failed to fetch blobs: %w", err))
+				}
+				for _, blob := range blobs {
+					data, err := blob.ToData()
+					if err != nil {
+						log.Fatal(fmt.Errorf("failed to parse blobs: %w", err))
+					}
+					datas = append(datas, data)
+				}
 			}
-
-			if validSender && validFrames {
+			var frameErrors []string
+			var frames []derive.Frame
+			var validFrames []bool
+			validBatch := true
+			for _, data := range datas {
+				validFrame := true
+				frameError := ""
+				framesPerData, err := derive.ParseFrames(data)
+				if err != nil {
+					fmt.Printf("Found a transaction (%s) with invalid data: %v\n", tx.Hash().String(), err)
+					validFrame = false
+					validBatch = false
+					frameError = err.Error()
+				} else {
+					frames = append(frames, framesPerData...)
+				}
+				frameErrors = append(frameErrors, frameError)
+				validFrames = append(validFrames, validFrame)
+			}
+			if validSender && validBatch {
 				validBatchCount += 1
 			} else {
 				invalidBatchCount += 1
 			}
-
 			txm := &TransactionWithMetadata{
 				Tx:          tx,
 				Sender:      sender,
@@ -126,7 +174,7 @@ func fetchBatchesPerBlock(ctx context.Context, client *ethclient.Client, number
 				ChainId:     config.ChainID.Uint64(),
 				InboxAddr:   config.BatchInbox,
 				Frames:      frames,
-				FrameErr:    frameError,
+				FrameErrs:   frameErrors,
 				ValidFrames: validFrames,
 			}
 			filename := path.Join(config.OutDirectory, fmt.Sprintf("%s.json", tx.Hash().String()))
@@ -134,11 +182,14 @@ func fetchBatchesPerBlock(ctx context.Context, client *ethclient.Client, number
 			if err != nil {
 				return 0, 0, err
 			}
-			defer file.Close()
 			enc := json.NewEncoder(file)
 			if err := enc.Encode(txm); err != nil {
+				file.Close()
 				return 0, 0, err
 			}
+			file.Close()
+		} else {
+			blobIndex += len(tx.BlobHashes())
 		}
 	}
 	return validBatchCount, invalidBatchCount, nil
diff --git a/op-node/cmd/batch_decoder/main.go b/op-node/cmd/batch_decoder/main.go
index e71099c0f30e..f1178f4369ff 100644
--- a/op-node/cmd/batch_decoder/main.go
+++ b/op-node/cmd/batch_decoder/main.go
@@ -12,6 +12,8 @@ import (
 	"github.com/ethereum-optimism/optimism/op-node/cmd/batch_decoder/reassemble"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
+	"github.com/ethereum-optimism/optimism/op-service/client"
+	"github.com/ethereum-optimism/optimism/op-service/sources"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/urfave/cli/v2"
@@ -57,6 +59,12 @@ func main() {
 					Usage:    "L1 RPC URL",
 					EnvVars:  []string{"L1_RPC"},
 				},
+				&cli.StringFlag{
+					Name:     "l1.beacon",
+					Required: false,
+					Usage:    "Address of L1 Beacon-node HTTP endpoint to use",
+					EnvVars:  []string{"L1_BEACON"},
+				},
 				&cli.IntFlag{
 					Name:  "concurrent-requests",
 					Value: 10,
@@ -64,16 +72,29 @@ func main() {
 				},
 			},
 			Action: func(cliCtx *cli.Context) error {
-				client, err := ethclient.Dial(cliCtx.String("l1"))
+				l1Client, err := ethclient.Dial(cliCtx.String("l1"))
 				if err != nil {
 					log.Fatal(err)
 				}
 				ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 				defer cancel()
-				chainID, err := client.ChainID(ctx)
+				chainID, err := l1Client.ChainID(ctx)
 				if err != nil {
 					log.Fatal(err)
 				}
+				beaconAddr := cliCtx.String("l1.beacon")
+				var beacon *sources.L1BeaconClient
+				if beaconAddr != "" {
+					beaconClient := sources.NewBeaconHTTPClient(client.NewBasicHTTPClient(beaconAddr, nil))
+					beaconCfg := sources.L1BeaconClientConfig{FetchAllSidecars: false}
+					beacon = sources.NewL1BeaconClient(beaconClient, beaconCfg)
+					_, err := beacon.GetVersion(ctx)
+					if err != nil {
+						log.Fatal(fmt.Errorf("failed to check L1 Beacon API version: %w", err))
+					}
+				} else {
+					fmt.Println("L1 Beacon endpoint not set. Unable to fetch post-ecotone channel frames")
+				}
 				config := fetch.Config{
 					Start:   uint64(cliCtx.Int("start")),
 					End:     uint64(cliCtx.Int("end")),
@@ -85,7 +106,7 @@ func main() {
 					OutDirectory:       cliCtx.String("out"),
 					ConcurrentRequests: uint64(cliCtx.Int("concurrent-requests")),
 				}
-				totalValid, totalInvalid := fetch.Batches(client, config)
+				totalValid, totalInvalid := fetch.Batches(l1Client, beacon, config)
 				fmt.Printf("Fetched batches in range [%v,%v). Found %v valid & %v invalid batches\n", config.Start, config.End, totalValid, totalInvalid)
 				fmt.Printf("Fetch Config: Chain ID: %v. Inbox Address: %v. Valid Senders: %v.\n", config.ChainID, config.BatchInbox, config.BatchSenders)
 				fmt.Printf("Wrote transactions with batches to %v\n", config.OutDirectory)
@@ -161,7 +182,7 @@ func main() {
 					L2GenesisTime: L2GenesisTime,
 					L2BlockTime:   L2BlockTime,
 				}
-				reassemble.Channels(config)
+				reassemble.Channels(config, rollupCfg)
 				return nil
 			},
 		},
diff --git a/op-node/cmd/batch_decoder/reassemble/reassemble.go b/op-node/cmd/batch_decoder/reassemble/reassemble.go
index e8ced61cce6d..dc95262659fe 100644
--- a/op-node/cmd/batch_decoder/reassemble/reassemble.go
+++ b/op-node/cmd/batch_decoder/reassemble/reassemble.go
@@ -11,19 +11,21 @@ import (
 	"sort"
 
 	"github.com/ethereum-optimism/optimism/op-node/cmd/batch_decoder/fetch"
+	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum/go-ethereum/common"
 )
 
 type ChannelWithMetadata struct {
-	ID             derive.ChannelID    `json:"id"`
-	IsReady        bool                `json:"is_ready"`
-	InvalidFrames  bool                `json:"invalid_frames"`
-	InvalidBatches bool                `json:"invalid_batches"`
-	Frames         []FrameWithMetadata `json:"frames"`
-	Batches        []derive.Batch      `json:"batches"`
-	BatchTypes     []int               `json:"batch_types"`
+	ID             derive.ChannelID         `json:"id"`
+	IsReady        bool                     `json:"is_ready"`
+	InvalidFrames  bool                     `json:"invalid_frames"`
+	InvalidBatches bool                     `json:"invalid_batches"`
+	Frames         []FrameWithMetadata      `json:"frames"`
+	Batches        []derive.Batch           `json:"batches"`
+	BatchTypes     []int                    `json:"batch_types"`
+	ComprAlgos     []derive.CompressionAlgo `json:"compr_alogs"`
 }
 
 type FrameWithMetadata struct {
@@ -53,7 +55,6 @@ func LoadFrames(directory string, inbox common.Address) []FrameWithMetadata {
 		} else {
 			return txns[i].BlockNumber < txns[j].BlockNumber
 		}
-
 	})
 	return transactionsToFrames(txns)
 }
@@ -61,7 +62,7 @@ func LoadFrames(directory string, inbox common.Address) []FrameWithMetadata {
 // Channels loads all transactions from the given input directory that are submitted to the
 // specified batch inbox and then re-assembles all channels & writes the re-assembled channels
 // to the out directory.
-func Channels(config Config) {
+func Channels(config Config, rollupCfg *rollup.Config) {
 	if err := os.MkdirAll(config.OutDirectory, 0750); err != nil {
 		log.Fatal(err)
 	}
@@ -71,7 +72,7 @@ func Channels(config Config) {
 		framesByChannel[frame.Frame.ID] = append(framesByChannel[frame.Frame.ID], frame)
 	}
 	for id, frames := range framesByChannel {
-		ch := processFrames(config, id, frames)
+		ch := processFrames(config, rollupCfg, id, frames)
 		filename := path.Join(config.OutDirectory, fmt.Sprintf("%s.json", id.String()))
 		if err := writeChannel(ch, filename); err != nil {
 			log.Fatal(err)
@@ -89,7 +90,8 @@ func writeChannel(ch ChannelWithMetadata, filename string) error {
 	return enc.Encode(ch)
 }
 
-func processFrames(cfg Config, id derive.ChannelID, frames []FrameWithMetadata) ChannelWithMetadata {
+func processFrames(cfg Config, rollupCfg *rollup.Config, id derive.ChannelID, frames []FrameWithMetadata) ChannelWithMetadata {
+	spec := rollup.NewChainSpec(rollupCfg)
 	ch := derive.NewChannel(id, eth.L1BlockRef{Number: frames[0].InclusionBlock})
 	invalidFrame := false
 
@@ -105,17 +107,22 @@ func processFrames(cfg Config, id derive.ChannelID, frames []FrameWithMetadata)
 		}
 	}
 
-	var batches []derive.Batch
-	var batchTypes []int
+	var (
+		batches    []derive.Batch
+		batchTypes []int
+		comprAlgos []derive.CompressionAlgo
+	)
+
 	invalidBatches := false
 	if ch.IsReady() {
-		br, err := derive.BatchReader(ch.Reader())
+		br, err := derive.BatchReader(ch.Reader(), spec.MaxRLPBytesPerChannel(ch.HighestBlock().Time), rollupCfg.IsFjord(ch.HighestBlock().Time))
 		if err == nil {
 			for batchData, err := br(); err != io.EOF; batchData, err = br() {
 				if err != nil {
 					fmt.Printf("Error reading batchData for channel %v. Err: %v\n", id.String(), err)
 					invalidBatches = true
 				} else {
+					comprAlgos = append(comprAlgos, batchData.ComprAlgo)
 					batchType := batchData.GetBatchType()
 					batchTypes = append(batchTypes, int(batchType))
 					switch batchType {
@@ -155,6 +162,7 @@ func processFrames(cfg Config, id derive.ChannelID, frames []FrameWithMetadata)
 		InvalidBatches: invalidBatches,
 		Batches:        batches,
 		BatchTypes:     batchTypes,
+		ComprAlgos:     comprAlgos,
 	}
 }
 
diff --git a/op-node/cmd/genesis/cmd.go b/op-node/cmd/genesis/cmd.go
index 360f7ecb59dc..6d3d687444a2 100644
--- a/op-node/cmd/genesis/cmd.go
+++ b/op-node/cmd/genesis/cmd.go
@@ -11,7 +11,6 @@ import (
 	"github.com/urfave/cli/v2"
 
 	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/state"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/ethereum/go-ethereum/log"
@@ -57,6 +56,10 @@ var (
 		Name:  "outfile.l1",
 		Usage: "Path to L1 genesis output file",
 	}
+	l2AllocsFlag = &cli.StringFlag{
+		Name:  "l2-allocs",
+		Usage: "Path to L2 genesis state dump",
+	}
 
 	l1Flags = []cli.Flag{
 		deployConfigFlag,
@@ -69,6 +72,7 @@ var (
 		l1RPCFlag,
 		l1StartingBlockFlag,
 		deployConfigFlag,
+		l2AllocsFlag,
 		l1DeploymentsFlag,
 		outfileL2Flag,
 		outfileRollupFlag,
@@ -108,9 +112,9 @@ var Subcommands = cli.Commands{
 				return fmt.Errorf("deploy config at %s invalid: %w", deployConfig, err)
 			}
 
-			var dump *state.Dump
+			var dump *genesis.ForgeAllocs
 			if l1Allocs := ctx.String("l1-allocs"); l1Allocs != "" {
-				dump, err = genesis.NewStateDump(l1Allocs)
+				dump, err = genesis.LoadForgeAllocs(l1Allocs)
 				if err != nil {
 					return err
 				}
@@ -165,6 +169,16 @@ var Subcommands = cli.Commands{
 				}
 			}
 
+			var l2Allocs *genesis.ForgeAllocs
+			if l2AllocsPath := ctx.String("l2-allocs"); l2AllocsPath != "" {
+				l2Allocs, err = genesis.LoadForgeAllocs(l2AllocsPath)
+				if err != nil {
+					return err
+				}
+			} else {
+				return errors.New("missing l2-allocs")
+			}
+
 			if l1RPC != "" {
 				client, err := ethclient.Dial(l1RPC)
 				if err != nil {
@@ -205,7 +219,7 @@ var Subcommands = cli.Commands{
 			log.Info("Using L1 Start Block", "number", l1StartBlock.Number(), "hash", l1StartBlock.Hash().Hex())
 
 			// Build the L2 genesis block
-			l2Genesis, err := genesis.BuildL2Genesis(config, l1StartBlock)
+			l2Genesis, err := genesis.BuildL2Genesis(config, l2Allocs, l1StartBlock)
 			if err != nil {
 				return fmt.Errorf("error creating l2 genesis: %w", err)
 			}
diff --git a/op-node/metrics/metrics.go b/op-node/metrics/metrics.go
index e44020f7894b..321c811dabf8 100644
--- a/op-node/metrics/metrics.go
+++ b/op-node/metrics/metrics.go
@@ -26,11 +26,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 )
 
-const (
-	Namespace = "op_node"
-
-	BatchMethod = ""
-)
+const Namespace = "op_node"
 
 type Metricer interface {
 	RecordInfo(version string)
diff --git a/op-node/node/api.go b/op-node/node/api.go
index d6252c84540e..cb60d22d911b 100644
--- a/op-node/node/api.go
+++ b/op-node/node/api.go
@@ -75,7 +75,7 @@ func (n *adminAPI) SequencerActive(ctx context.Context) (bool, error) {
 	return n.dr.SequencerActive(ctx)
 }
 
-// PostUnsafePayload is a special API that allow posting an unsafe payload to the L2 derivation pipeline.
+// PostUnsafePayload is a special API that allows posting an unsafe payload to the L2 derivation pipeline.
 // It should only be used by op-conductor for sequencer failover scenarios.
 // TODO(ethereum-optimism/optimism#9064): op-conductor Dencun changes.
 func (n *adminAPI) PostUnsafePayload(ctx context.Context, envelope *eth.ExecutionPayloadEnvelope) error {
diff --git a/op-node/node/node.go b/op-node/node/node.go
index 324a595f4ab2..0fb1edcf5700 100644
--- a/op-node/node/node.go
+++ b/op-node/node/node.go
@@ -56,7 +56,7 @@ type OpNode struct {
 	l2Source  *sources.EngineClient // L2 Execution Engine RPC bindings
 	server    *rpcServer            // RPC server hosting the rollup-node API
 	p2pNode   *p2p.NodeP2P          // P2P node functionality
-	p2pSigner p2p.Signer            // p2p gogssip application messages will be signed with this signer
+	p2pSigner p2p.Signer            // p2p gossip application messages will be signed with this signer
 	tracer    Tracer                // tracer to get events for testing/debugging
 	runCfg    *RuntimeConfig        // runtime configurables
 
@@ -175,7 +175,7 @@ func (n *OpNode) initL1(ctx context.Context, cfg *Config) error {
 	rpcCfg.EthClientConfig.RethDBPath = cfg.RethDBPath
 
 	n.l1Source, err = sources.NewL1Client(
-		client.NewInstrumentedRPC(l1Node, n.metrics), n.log, n.metrics.L1SourceCache, rpcCfg)
+		client.NewInstrumentedRPC(l1Node, &n.metrics.RPCMetrics.RPCClientMetrics), n.log, n.metrics.L1SourceCache, rpcCfg)
 	if err != nil {
 		return fmt.Errorf("failed to create L1 source: %w", err)
 	}
@@ -371,7 +371,7 @@ func (n *OpNode) initL2(ctx context.Context, cfg *Config, snapshotLog log.Logger
 	}
 
 	n.l2Source, err = sources.NewEngineClient(
-		client.NewInstrumentedRPC(rpcClient, n.metrics), n.log, n.metrics.L2SourceCache, rpcCfg,
+		client.NewInstrumentedRPC(rpcClient, &n.metrics.RPCClientMetrics), n.log, n.metrics.L2SourceCache, rpcCfg,
 	)
 	if err != nil {
 		return fmt.Errorf("failed to create Engine client: %w", err)
@@ -387,7 +387,7 @@ func (n *OpNode) initL2(ctx context.Context, cfg *Config, snapshotLog log.Logger
 	}
 
 	// if plasma is not explicitly activated in the node CLI, the config + any error will be ignored.
-	rpCfg, err := cfg.Rollup.PlasmaConfig()
+	rpCfg, err := cfg.Rollup.GetOPPlasmaConfig()
 	if cfg.Plasma.Enabled && err != nil {
 		return fmt.Errorf("failed to get plasma config: %w", err)
 	}
diff --git a/op-node/node/superchain_test.go b/op-node/node/superchain_test.go
index 0e3970333a37..021d14611a3a 100644
--- a/op-node/node/superchain_test.go
+++ b/op-node/node/superchain_test.go
@@ -1,10 +1,10 @@
 package node
 
 import (
+	"slices"
 	"testing"
 
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 
 	"github.com/ethereum/go-ethereum/params"
 )
diff --git a/op-node/p2p/host_test.go b/op-node/p2p/host_test.go
index 5fabfe48e950..3fcfb7714c26 100644
--- a/op-node/p2p/host_test.go
+++ b/op-node/p2p/host_test.go
@@ -5,6 +5,7 @@ import (
 	"crypto/rand"
 	"math/big"
 	"net"
+	"slices"
 	"testing"
 	"time"
 
@@ -17,7 +18,6 @@ import (
 	mocknet "github.com/libp2p/go-libp2p/p2p/net/mock"
 	ma "github.com/multiformats/go-multiaddr"
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
@@ -181,6 +181,28 @@ func TestP2PFull(t *testing.T) {
 	require.Equal(t, []peer.ID{hostB.ID()}, blockedPeers)
 	require.NoError(t, p2pClientA.UnblockPeer(ctx, hostB.ID()))
 
+	require.Error(t, p2pClientA.BlockAddr(ctx, nil))
+	require.Error(t, p2pClientA.UnblockAddr(ctx, nil))
+
+	require.Error(t, p2pClientA.BlockSubnet(ctx, nil))
+	require.Error(t, p2pClientA.BlockSubnet(ctx, &net.IPNet{}))
+	require.Error(t, p2pClientA.BlockSubnet(ctx, &net.IPNet{Mask: net.IPMask{255, 255, 0, 0}}))
+	require.Error(t, p2pClientA.BlockSubnet(ctx, &net.IPNet{IP: net.IP{0, 0, 0, 1}}))
+	require.NoError(t, p2pClientA.BlockSubnet(ctx, &net.IPNet{IP: net.IP{0, 0, 0, 1}, Mask: net.IPMask{255, 255, 0, 0}}))
+
+	require.Error(t, p2pClientA.UnblockSubnet(ctx, nil))
+	require.Error(t, p2pClientA.UnblockSubnet(ctx, &net.IPNet{}))
+	require.Error(t, p2pClientA.UnblockSubnet(ctx, &net.IPNet{Mask: net.IPMask{255, 255, 0, 0}}))
+	require.Error(t, p2pClientA.UnblockSubnet(ctx, &net.IPNet{IP: net.IP{0, 0, 0, 1}}))
+	require.NoError(t, p2pClientA.UnblockSubnet(ctx, &net.IPNet{IP: net.IP{0, 0, 0, 1}, Mask: net.IPMask{255, 255, 0, 0}}))
+
+	require.Error(t, p2pClientA.BlockPeer(ctx, ""))
+	require.Error(t, p2pClientA.UnblockPeer(ctx, ""))
+	require.Error(t, p2pClientA.ProtectPeer(ctx, ""))
+	require.Error(t, p2pClientA.UnprotectPeer(ctx, ""))
+	require.Error(t, p2pClientA.ConnectPeer(ctx, ""))
+	require.Error(t, p2pClientA.DisconnectPeer(ctx, ""))
+
 	require.NoError(t, p2pClientA.BlockAddr(ctx, net.IP{123, 123, 123, 123}))
 	blockedIPs, err := p2pClientA.ListBlockedAddrs(ctx)
 	require.NoError(t, err)
@@ -213,10 +235,23 @@ func TestP2PFull(t *testing.T) {
 	require.Nil(t, err)
 	data = peerDump.Peers[hostBId]
 	require.NotNil(t, data)
-	require.NoError(t, p2pClientA.DisconnectPeer(ctx, hostB.ID()))
-	peerDump, err = p2pClientA.Peers(ctx, false)
-	require.Nil(t, err)
-	data = peerDump.Peers[hostBId]
+	retries := 0
+	for {
+		require.NoError(t, p2pClientA.DisconnectPeer(ctx, hostB.ID()))
+		// disconnect may take some time which we cant control from here
+		// so we retry a few times increasing our wait tolerance
+		time.Sleep(time.Duration(retries) * time.Second)
+		peerDump, err = p2pClientA.Peers(ctx, false)
+		require.Nil(t, err)
+		data = peerDump.Peers[hostBId]
+		if data == nil {
+			break
+		}
+		retries++
+		if retries > 3 {
+			t.Fatal("failed to disconnect peer")
+		}
+	}
 	require.Nil(t, data)
 
 	// reconnect
diff --git a/op-node/p2p/node.go b/op-node/p2p/node.go
index b80801f7dbb5..8a0aee3afcf1 100644
--- a/op-node/p2p/node.go
+++ b/op-node/p2p/node.go
@@ -176,7 +176,8 @@ func (n *NodeP2P) RequestL2Range(ctx context.Context, start, end eth.L2BlockRef)
 	if !n.AltSyncEnabled() {
 		return fmt.Errorf("cannot request range %s - %s, req-resp sync is not enabled", start, end)
 	}
-	return n.syncCl.RequestL2Range(ctx, start, end)
+	_, err := n.syncCl.RequestL2Range(ctx, start, end)
+	return err
 }
 
 func (n *NodeP2P) Host() host.Host {
diff --git a/op-node/p2p/peer_params_test.go b/op-node/p2p/peer_params_test.go
index ca1effa555d5..66dc29b1604b 100644
--- a/op-node/p2p/peer_params_test.go
+++ b/op-node/p2p/peer_params_test.go
@@ -43,14 +43,14 @@ func (testSuite *PeerParamsTestSuite) TestNewPeerScoreThresholds() {
 
 // TestGetPeerScoreParams validates the peer score parameters.
 func (testSuite *PeerParamsTestSuite) TestGetPeerScoreParams_None() {
-	params, err := GetScoringParams("none", chaincfg.Goerli)
+	params, err := GetScoringParams("none", chaincfg.Sepolia)
 	testSuite.NoError(err)
 	testSuite.Nil(params)
 }
 
 // TestLightPeerScoreParams validates the light peer score params.
 func (testSuite *PeerParamsTestSuite) TestGetPeerScoreParams_Light() {
-	cfg := chaincfg.Goerli
+	cfg := chaincfg.Sepolia
 	cfg.BlockTime = 1
 	slot := time.Duration(cfg.BlockTime) * time.Second
 	epoch := 6 * slot
@@ -98,7 +98,7 @@ func (testSuite *PeerParamsTestSuite) TestGetPeerScoreParams_Light() {
 
 // TestParamsZeroBlockTime validates peer score params use default slot for 0 block time.
 func (testSuite *PeerParamsTestSuite) TestParamsZeroBlockTime() {
-	cfg := chaincfg.Goerli
+	cfg := chaincfg.Sepolia
 	cfg.BlockTime = 0
 	slot := 2 * time.Second
 	params, err := GetScoringParams("light", cfg)
diff --git a/op-node/p2p/pings_test.go b/op-node/p2p/pings_test.go
index 5db685dd7a18..75aa6fd93595 100644
--- a/op-node/p2p/pings_test.go
+++ b/op-node/p2p/pings_test.go
@@ -3,14 +3,14 @@ package p2p
 import (
 	"context"
 	"errors"
+	"sync/atomic"
 	"testing"
 	"time"
 
-	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slog"
-
 	"github.com/libp2p/go-libp2p/core/peer"
 	"github.com/libp2p/go-libp2p/p2p/protocol/ping"
+	"github.com/stretchr/testify/require"
+	"golang.org/x/exp/slog"
 
 	"github.com/ethereum-optimism/optimism/op-service/clock"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
@@ -20,10 +20,13 @@ func TestPingService(t *testing.T) {
 	peers := []peer.ID{"a", "b", "c"}
 	log, captLog := testlog.CaptureLogger(t, slog.LevelDebug)
 
-	pingCount := 0
+	pingCount := &atomic.Int64{}
 	pingFn := PingFn(func(ctx context.Context, peerID peer.ID) <-chan ping.Result {
 		out := make(chan ping.Result, 1)
-		switch pingCount % 3 {
+		// Atomically add, so that parallel pings don't have a 1/1000 chance
+		// to increment at the same time and create a CI flake.
+		newValue := pingCount.Add(1)
+		switch (newValue - 1) % 3 {
 		case 0:
 			// success
 			out <- ping.Result{
@@ -40,7 +43,6 @@ func TestPingService(t *testing.T) {
 			}
 		}
 		close(out)
-		pingCount += 1
 		return out
 	})
 
@@ -63,7 +65,8 @@ func TestPingService(t *testing.T) {
 	require.Equal(t, "pingPeers start", <-trace)
 	require.Equal(t, "pingPeers end", <-trace)
 	// see if client has hit all 3 cases we simulated on the server-side
-	require.Equal(t, 3, pingCount, "pinged 3 peers")
+	require.Equal(t, int64(3), pingCount.Load(), "pinged 3 peers")
+
 	require.NotNil(t, captLog.FindLog(testlog.NewMessageContainsFilter("ping-pong")), "case 0")
 	require.NotNil(t, captLog.FindLog(testlog.NewMessageContainsFilter("failed to ping peer, context cancelled")), "case 1")
 	require.NotNil(t, captLog.FindLog(testlog.NewMessageContainsFilter("failed to ping peer, communication error")), "case 2")
@@ -74,7 +77,7 @@ func TestPingService(t *testing.T) {
 	require.Equal(t, "pingPeers start", <-trace)
 	require.Equal(t, "pingPeers end", <-trace)
 	// see if client has hit all 3 cases we simulated on the server-side
-	require.Equal(t, 6, pingCount, "pinged 3 peers again")
+	require.Equal(t, int64(6), pingCount.Load(), "pinged 3 peers again")
 	require.NotNil(t, captLog.FindLog(testlog.NewMessageContainsFilter("ping-pong")), "case 0")
 	require.NotNil(t, captLog.FindLog(testlog.NewMessageContainsFilter("failed to ping peer, context cancelled")), "case 1")
 	require.NotNil(t, captLog.FindLog(testlog.NewMessageContainsFilter("failed to ping peer, communication error")), "case 2")
diff --git a/op-node/p2p/rpc_server.go b/op-node/p2p/rpc_server.go
index 1b908dd45e61..1aa587fcc89f 100644
--- a/op-node/p2p/rpc_server.go
+++ b/op-node/p2p/rpc_server.go
@@ -36,6 +36,7 @@ var (
 	ErrDisabledDiscovery   = errors.New("discovery disabled")
 	ErrNoConnectionManager = errors.New("no connection manager")
 	ErrNoConnectionGater   = errors.New("no connection gater")
+	ErrInvalidRequest      = errors.New("invalid request")
 )
 
 type Node interface {
@@ -244,23 +245,31 @@ func (s *APIBackend) DiscoveryTable(_ context.Context) ([]*enode.Node, error) {
 	}
 }
 
-func (s *APIBackend) BlockPeer(_ context.Context, p peer.ID) error {
+func (s *APIBackend) BlockPeer(_ context.Context, id peer.ID) error {
 	recordDur := s.m.RecordRPCServerRequest("opp2p_blockPeer")
+	if err := id.Validate(); err != nil {
+		s.log.Warn("invalid peer ID", "method", "BlockPeer", "peer", id, "err", err)
+		return ErrInvalidRequest
+	}
 	defer recordDur()
 	if gater := s.node.ConnectionGater(); gater == nil {
 		return ErrNoConnectionGater
 	} else {
-		return gater.BlockPeer(p)
+		return gater.BlockPeer(id)
 	}
 }
 
-func (s *APIBackend) UnblockPeer(_ context.Context, p peer.ID) error {
+func (s *APIBackend) UnblockPeer(_ context.Context, id peer.ID) error {
 	recordDur := s.m.RecordRPCServerRequest("opp2p_unblockPeer")
+	if err := id.Validate(); err != nil {
+		s.log.Warn("invalid peer ID", "method", "UnblockPeer", "peer", id, "err", err)
+		return ErrInvalidRequest
+	}
 	defer recordDur()
 	if gater := s.node.ConnectionGater(); gater == nil {
 		return ErrNoConnectionGater
 	} else {
-		return gater.UnblockPeer(p)
+		return gater.UnblockPeer(id)
 	}
 }
 
@@ -278,6 +287,10 @@ func (s *APIBackend) ListBlockedPeers(_ context.Context) ([]peer.ID, error) {
 // Note: active connections to the IP address are not automatically closed.
 func (s *APIBackend) BlockAddr(_ context.Context, ip net.IP) error {
 	recordDur := s.m.RecordRPCServerRequest("opp2p_blockAddr")
+	if ip == nil {
+		s.log.Warn("invalid IP", "method", "BlockAddr")
+		return ErrInvalidRequest
+	}
 	defer recordDur()
 	if gater := s.node.ConnectionGater(); gater == nil {
 		return ErrNoConnectionGater
@@ -288,6 +301,10 @@ func (s *APIBackend) BlockAddr(_ context.Context, ip net.IP) error {
 
 func (s *APIBackend) UnblockAddr(_ context.Context, ip net.IP) error {
 	recordDur := s.m.RecordRPCServerRequest("opp2p_unblockAddr")
+	if ip == nil {
+		s.log.Warn("invalid IP", "method", "UnblockAddr")
+		return ErrInvalidRequest
+	}
 	defer recordDur()
 	if gater := s.node.ConnectionGater(); gater == nil {
 		return ErrNoConnectionGater
@@ -310,6 +327,10 @@ func (s *APIBackend) ListBlockedAddrs(_ context.Context) ([]net.IP, error) {
 // Note: active connections to the IP subnet are not automatically closed.
 func (s *APIBackend) BlockSubnet(_ context.Context, ipnet *net.IPNet) error {
 	recordDur := s.m.RecordRPCServerRequest("opp2p_blockSubnet")
+	if ipnet == nil || ipnet.IP == nil || ipnet.Mask == nil {
+		s.log.Warn("invalid IPNet", "method", "BlockSubnet")
+		return ErrInvalidRequest
+	}
 	defer recordDur()
 	if gater := s.node.ConnectionGater(); gater == nil {
 		return ErrNoConnectionGater
@@ -320,6 +341,10 @@ func (s *APIBackend) BlockSubnet(_ context.Context, ipnet *net.IPNet) error {
 
 func (s *APIBackend) UnblockSubnet(_ context.Context, ipnet *net.IPNet) error {
 	recordDur := s.m.RecordRPCServerRequest("opp2p_unblockSubnet")
+	if ipnet == nil || ipnet.IP == nil || ipnet.Mask == nil {
+		s.log.Warn("invalid IPNet", "method", "UnblockSubnet")
+		return ErrInvalidRequest
+	}
 	defer recordDur()
 	if gater := s.node.ConnectionGater(); gater == nil {
 		return ErrNoConnectionGater
@@ -338,24 +363,32 @@ func (s *APIBackend) ListBlockedSubnets(_ context.Context) ([]*net.IPNet, error)
 	}
 }
 
-func (s *APIBackend) ProtectPeer(_ context.Context, p peer.ID) error {
+func (s *APIBackend) ProtectPeer(_ context.Context, id peer.ID) error {
 	recordDur := s.m.RecordRPCServerRequest("opp2p_protectPeer")
+	if err := id.Validate(); err != nil {
+		s.log.Warn("invalid peer ID", "method", "ProtectPeer", "peer", id, "err", err)
+		return ErrInvalidRequest
+	}
 	defer recordDur()
 	if manager := s.node.ConnectionManager(); manager == nil {
 		return ErrNoConnectionManager
 	} else {
-		manager.Protect(p, "api-protected")
+		manager.Protect(id, "api-protected")
 		return nil
 	}
 }
 
-func (s *APIBackend) UnprotectPeer(_ context.Context, p peer.ID) error {
+func (s *APIBackend) UnprotectPeer(_ context.Context, id peer.ID) error {
 	recordDur := s.m.RecordRPCServerRequest("opp2p_unprotectPeer")
+	if err := id.Validate(); err != nil {
+		s.log.Warn("invalid peer ID", "method", "UnprotectPeer", "peer", id, "err", err)
+		return ErrInvalidRequest
+	}
 	defer recordDur()
 	if manager := s.node.ConnectionManager(); manager == nil {
 		return ErrNoConnectionManager
 	} else {
-		manager.Unprotect(p, "api-protected")
+		manager.Unprotect(id, "api-protected")
 		return nil
 	}
 }
@@ -377,6 +410,10 @@ func (s *APIBackend) ConnectPeer(ctx context.Context, addr string) error {
 
 func (s *APIBackend) DisconnectPeer(_ context.Context, id peer.ID) error {
 	recordDur := s.m.RecordRPCServerRequest("opp2p_disconnectPeer")
+	if err := id.Validate(); err != nil {
+		s.log.Warn("invalid peer ID", "method", "DisconnectPeer", "peer", id, "err", err)
+		return ErrInvalidRequest
+	}
 	defer recordDur()
 	err := s.node.Host().Network().ClosePeer(id)
 	if err != nil {
diff --git a/op-node/p2p/sync.go b/op-node/p2p/sync.go
index 6bf0fc242c0f..96abeaf4f460 100644
--- a/op-node/p2p/sync.go
+++ b/op-node/p2p/sync.go
@@ -61,6 +61,13 @@ const (
 	clientErrRateCost = peerServerBlocksBurst
 )
 
+const (
+	ResultCodeSuccess     byte = 0
+	ResultCodeNotFoundErr byte = 1
+	ResultCodeInvalidErr  byte = 2
+	ResultCodeUnknownErr  byte = 3
+)
+
 func PayloadByNumberProtocolID(l2ChainID *big.Int) protocol.ID {
 	return protocol.ID(fmt.Sprintf("/opstack/req/payload_by_number/%d/0", l2ChainID))
 }
@@ -87,6 +94,7 @@ type receivePayloadFn func(ctx context.Context, from peer.ID, payload *eth.Execu
 type rangeRequest struct {
 	start uint64
 	end   eth.L2BlockRef
+	id    uint64
 }
 
 type syncResult struct {
@@ -95,17 +103,44 @@ type syncResult struct {
 }
 
 type peerRequest struct {
-	num uint64
-
-	complete *atomic.Bool
+	num        uint64
+	rangeReqId uint64
 }
 
 type inFlightCheck struct {
-	num uint64
-
+	num    uint64
 	result chan bool
 }
 
+type requestIdMap struct {
+	requests map[uint64]bool
+	mu       sync.Mutex
+}
+
+func newRequestIdMap() *requestIdMap {
+	return &requestIdMap{
+		requests: make(map[uint64]bool),
+	}
+}
+
+func (r *requestIdMap) set(key uint64, value bool) {
+	r.mu.Lock()
+	r.requests[key] = value
+	r.mu.Unlock()
+}
+
+func (r *requestIdMap) get(key uint64) bool {
+	r.mu.Lock()
+	defer r.mu.Unlock()
+	return r.requests[key]
+}
+
+func (r *requestIdMap) delete(key uint64) {
+	r.mu.Lock()
+	delete(r.requests, key)
+	r.mu.Unlock()
+}
+
 type SyncClientMetrics interface {
 	ClientPayloadByNumberEvent(num uint64, resultCode byte, duration time.Duration)
 	PayloadsQuarantineSize(n int)
@@ -209,12 +244,14 @@ type SyncClient struct {
 	quarantineByNum map[uint64]common.Hash
 
 	// inFlight requests are not repeated
-	inFlight map[uint64]*atomic.Bool
-
-	requests       chan rangeRequest
-	peerRequests   chan peerRequest
+	inFlight       *requestIdMap
 	inFlightChecks chan inFlightCheck
 
+	rangeRequests       chan rangeRequest
+	activeRangeRequests *requestIdMap
+	rangeReqId          uint64
+	peerRequests        chan peerRequest
+
 	results chan syncResult
 
 	receivePayload receivePayloadFn
@@ -238,24 +275,26 @@ func NewSyncClient(log log.Logger, cfg *rollup.Config, newStream newStreamFn, rc
 	ctx, cancel := context.WithCancel(context.Background())
 
 	c := &SyncClient{
-		log:             log,
-		cfg:             cfg,
-		metrics:         metrics,
-		appScorer:       appScorer,
-		newStreamFn:     newStream,
-		payloadByNumber: PayloadByNumberProtocolID(cfg.L2ChainID),
-		peers:           make(map[peer.ID]context.CancelFunc),
-		quarantineByNum: make(map[uint64]common.Hash),
-		inFlight:        make(map[uint64]*atomic.Bool),
-		requests:        make(chan rangeRequest), // blocking
-		peerRequests:    make(chan peerRequest, 128),
-		results:         make(chan syncResult, 128),
-		inFlightChecks:  make(chan inFlightCheck, 128),
-		globalRL:        rate.NewLimiter(globalServerBlocksRateLimit, globalServerBlocksBurst),
-		resCtx:          ctx,
-		resCancel:       cancel,
-		receivePayload:  rcv,
+		log:                 log,
+		cfg:                 cfg,
+		metrics:             metrics,
+		appScorer:           appScorer,
+		newStreamFn:         newStream,
+		payloadByNumber:     PayloadByNumberProtocolID(cfg.L2ChainID),
+		peers:               make(map[peer.ID]context.CancelFunc),
+		quarantineByNum:     make(map[uint64]common.Hash),
+		rangeRequests:       make(chan rangeRequest), // blocking
+		activeRangeRequests: newRequestIdMap(),
+		peerRequests:        make(chan peerRequest, 128),
+		results:             make(chan syncResult, 128),
+		inFlight:            newRequestIdMap(),
+		inFlightChecks:      make(chan inFlightCheck, 128),
+		globalRL:            rate.NewLimiter(globalServerBlocksRateLimit, globalServerBlocksBurst),
+		resCtx:              ctx,
+		resCancel:           cancel,
+		receivePayload:      rcv,
 	}
+
 	// never errors with positive LRU cache size
 	// TODO(CLI-3733): if we had an LRU based on on total payloads size, instead of payload count,
 	//  we can safely buffer more data in the happy case.
@@ -313,17 +352,23 @@ func (s *SyncClient) Close() error {
 	return nil
 }
 
-func (s *SyncClient) RequestL2Range(ctx context.Context, start, end eth.L2BlockRef) error {
+func (s *SyncClient) RequestL2Range(ctx context.Context, start, end eth.L2BlockRef) (uint64, error) {
 	if end == (eth.L2BlockRef{}) {
 		s.log.Debug("P2P sync client received range signal, but cannot sync open-ended chain: need sync target to verify blocks through parent-hashes", "start", start)
-		return nil
+		return 0, nil
 	}
+	// Create shared rangeReqId so associated peerRequests can all be cancelled by setting a single flag
+	rangeReqId := atomic.AddUint64(&s.rangeReqId, 1)
+	// need to flag request as active before adding request to s.rangeRequests to avoid race
+	s.activeRangeRequests.set(rangeReqId, true)
+
 	// synchronize requests with the main loop for state access
 	select {
-	case s.requests <- rangeRequest{start: start.Number, end: end}:
-		return nil
+	case s.rangeRequests <- rangeRequest{start: start.Number, end: end, id: rangeReqId}:
+		return rangeReqId, nil
 	case <-ctx.Done():
-		return fmt.Errorf("too busy with P2P results/requests: %w", ctx.Err())
+		s.activeRangeRequests.delete(rangeReqId)
+		return rangeReqId, fmt.Errorf("too busy with P2P results/requests: %w", ctx.Err())
 	}
 }
 
@@ -336,7 +381,7 @@ func (s *SyncClient) mainLoop() {
 	defer s.wg.Done()
 	for {
 		select {
-		case req := <-s.requests:
+		case req := <-s.rangeRequests:
 			ctx, cancel := context.WithTimeout(s.resCtx, maxRequestScheduling)
 			s.onRangeRequest(ctx, req)
 			cancel()
@@ -346,12 +391,7 @@ func (s *SyncClient) mainLoop() {
 			cancel()
 		case check := <-s.inFlightChecks:
 			s.log.Info("Checking in flight", "num", check.num)
-			complete, ok := s.inFlight[check.num]
-			if !ok {
-				check.result <- false
-			} else {
-				check.result <- !complete.Load()
-			}
+			check.result <- s.inFlight.get(check.num)
 		case <-s.resCtx.Done():
 			s.log.Info("stopped P2P req-resp L2 block sync client")
 			return
@@ -377,19 +417,13 @@ func (s *SyncClient) isInFlight(ctx context.Context, num uint64) (bool, error) {
 // onRangeRequest is exclusively called by the main loop, and has thus direct access to the request bookkeeping state.
 // This function transforms requested block ranges into work for each peer.
 func (s *SyncClient) onRangeRequest(ctx context.Context, req rangeRequest) {
+	log := s.log.New("target", req.start, "end", req.end)
+	log.Info("processing L2 range request", "rangeReqId", req.id)
+
 	// add req head to trusted set of blocks
 	s.trusted.Add(req.end.Hash, struct{}{})
 	s.trusted.Add(req.end.ParentHash, struct{}{})
 
-	log := s.log.New("target", req.start, "end", req.end)
-
-	// clean up the completed in-flight requests
-	for k, v := range s.inFlight {
-		if v.Load() {
-			delete(s.inFlight, k)
-		}
-	}
-
 	// Now try to fetch lower numbers than current end, to traverse back towards the updated start.
 	for i := uint64(0); ; i++ {
 		num := req.end.Number - 1 - i
@@ -406,17 +440,17 @@ func (s *SyncClient) onRangeRequest(ctx context.Context, req rangeRequest) {
 			continue
 		}
 
-		if _, ok := s.inFlight[num]; ok {
+		if s.inFlight.get(num) {
 			log.Debug("request still in-flight, not rescheduling sync request", "num", num)
 			continue // request still in flight
 		}
-		pr := peerRequest{num: num, complete: new(atomic.Bool)}
+		pr := peerRequest{num: num, rangeReqId: req.id}
 
-		log.Debug("Scheduling P2P block request", "num", num)
+		log.Debug("Scheduling P2P block request", "num", num, "rangeReqId", req.id)
 		// schedule number
 		select {
 		case s.peerRequests <- pr:
-			s.inFlight[num] = pr.complete
+			s.inFlight.set(num, true)
 		case <-ctx.Done():
 			log.Info("did not schedule full P2P sync range", "current", num, "err", ctx.Err())
 			return
@@ -487,7 +521,7 @@ func (s *SyncClient) onResult(ctx context.Context, res syncResult) {
 	payload := res.payload.ExecutionPayload
 	s.log.Debug("processing p2p sync result", "payload", payload.ID(), "peer", res.peer)
 	// Clean up the in-flight request, we have a result now.
-	delete(s.inFlight, uint64(payload.BlockNumber))
+	s.inFlight.delete(uint64(payload.BlockNumber))
 	// Always put it in quarantine first. If promotion fails because the receiver is too busy, this functions as cache.
 	s.quarantine.Add(payload.BlockHash, res)
 	s.quarantineByNum[uint64(payload.BlockNumber)] = payload.BlockHash
@@ -528,17 +562,39 @@ func (s *SyncClient) peerLoop(ctx context.Context, id peer.ID) {
 		// once the peer is available, wait for a sync request.
 		select {
 		case pr := <-s.peerRequests:
+			if !s.activeRangeRequests.get(pr.rangeReqId) {
+				log.Debug("dropping cancelled p2p sync request", "num", pr.num)
+				s.inFlight.delete(pr.num)
+				continue
+			}
+
 			// We already established the peer is available w.r.t. rate-limiting,
 			// and this is the only loop over this peer, so we can request now.
 			start := time.Now()
-			err := s.doRequest(ctx, id, pr.num)
+
+			resultCode := ResultCodeSuccess
+			err := panicGuard(s.doRequest)(ctx, id, pr.num)
 			if err != nil {
-				// mark as complete if there's an error: we are not sending any result and can complete immediately.
-				pr.complete.Store(true)
+				s.inFlight.delete(pr.num)
 				log.Warn("failed p2p sync request", "num", pr.num, "err", err)
-				s.appScorer.onResponseError(id)
+				resultCode = ResultCodeNotFoundErr
+				sendResponseError := true
+
+				if re, ok := err.(requestResultErr); ok {
+					resultCode = re.ResultCode()
+					if resultCode == ResultCodeNotFoundErr {
+						log.Warn("cancelling p2p sync range request", "rangeReqId", pr.rangeReqId)
+						s.activeRangeRequests.delete(pr.rangeReqId)
+						sendResponseError = false // don't penalize peer for this error
+					}
+				}
+
+				if sendResponseError {
+					s.appScorer.onResponseError(id)
+				}
+
 				// If we hit an error, then count it as many requests.
-				// We'd like to avoid making more requests for a while, to back off.
+				// We'd like to avoid making more requests for a while, so back off.
 				if err := rl.WaitN(ctx, clientErrRateCost); err != nil {
 					return
 				}
@@ -546,16 +602,8 @@ func (s *SyncClient) peerLoop(ctx context.Context, id peer.ID) {
 				log.Debug("completed p2p sync request", "num", pr.num)
 				s.appScorer.onValidResponse(id)
 			}
-			took := time.Since(start)
 
-			resultCode := byte(0)
-			if err != nil {
-				if re, ok := err.(requestResultErr); ok {
-					resultCode = re.ResultCode()
-				} else {
-					resultCode = 1
-				}
-			}
+			took := time.Since(start)
 			s.metrics.ClientPayloadByNumberEvent(pr.num, resultCode, took)
 		case <-ctx.Done():
 			return
@@ -609,13 +657,11 @@ func (s *SyncClient) doRequest(ctx context.Context, id peer.ID, expectedBlockNum
 	if _, err := io.ReadFull(r, versionData[:]); err != nil {
 		return fmt.Errorf("failed to read version part of response: %w", err)
 	}
-	version := binary.LittleEndian.Uint32(versionData[:])
-	if version != 0 && version != 1 {
-		return fmt.Errorf("unrecognized version: %d", version)
-	}
+
 	// payload is SSZ encoded with Snappy framed compression
 	r = snappy.NewReader(r)
 	r = io.LimitReader(r, maxGossipSize)
+
 	// We cannot stream straight into the SSZ decoder, since we need the scope of the SSZ payload.
 	// The server does not prepend it, nor would we trust a claimed length anyway, so we buffer the data we get.
 	data, err := io.ReadAll(r)
@@ -623,22 +669,12 @@ func (s *SyncClient) doRequest(ctx context.Context, id peer.ID, expectedBlockNum
 		return fmt.Errorf("failed to read response: %w", err)
 	}
 
-	envelope := ð.ExecutionPayloadEnvelope{}
-
-	if version == 0 {
-		expectedBlockTime := s.cfg.TimestampForBlock(expectedBlockNum)
-		envelope, err = s.readExecutionPayload(data, expectedBlockTime)
-		if err != nil {
-			return err
-		}
-	} else if version == 1 {
-		if err := envelope.UnmarshalSSZ(uint32(len(data)), bytes.NewReader(data)); err != nil {
-			return fmt.Errorf("failed to decode execution payload envelope response: %w", err)
-		}
-	} else {
-		panic(fmt.Errorf("should have already filtered by version, but got: %d", version))
+	version := binary.LittleEndian.Uint32(versionData[:])
+	isCanyon := s.cfg.IsCanyon(s.cfg.TimestampForBlock(expectedBlockNum))
+	envelope, err := readExecutionPayload(version, data, isCanyon)
+	if err != nil {
+		return err
 	}
-
 	if err := str.CloseRead(); err != nil {
 		return fmt.Errorf("failed to close reading side")
 	}
@@ -653,18 +689,41 @@ func (s *SyncClient) doRequest(ctx context.Context, id peer.ID, expectedBlockNum
 	return nil
 }
 
-func (s *SyncClient) readExecutionPayload(data []byte, expectedTime uint64) (*eth.ExecutionPayloadEnvelope, error) {
-	blockVersion := eth.BlockV1
-	if s.cfg.IsCanyon(expectedTime) {
-		blockVersion = eth.BlockV2
+// panicGuard is a generic function that takes another function with generic arguments and returns an error.
+// It recovers from any panic that occurs during the execution of the function.
+func panicGuard[T, S, U any](fn func(T, S, U) error) func(T, S, U) error {
+	return func(arg0 T, arg1 S, arg2 U) (err error) {
+		defer func() {
+			if r := recover(); r != nil {
+				err = fmt.Errorf("recovered from a panic: %v", r)
+			}
+		}()
+		return fn(arg0, arg1, arg2)
 	}
+}
 
-	var res eth.ExecutionPayload
-	if err := res.UnmarshalSSZ(blockVersion, uint32(len(data)), bytes.NewReader(data)); err != nil {
-		return nil, fmt.Errorf("failed to decode response: %w", err)
+// readExecutionPayload will unmarshal the supplied data into an ExecutionPayloadEnvelope.
+func readExecutionPayload(version uint32, data []byte, isCanyon bool) (*eth.ExecutionPayloadEnvelope, error) {
+	switch version {
+	case 0:
+		blockVersion := eth.BlockV1
+		if isCanyon {
+			blockVersion = eth.BlockV2
+		}
+		var res eth.ExecutionPayload
+		if err := res.UnmarshalSSZ(blockVersion, uint32(len(data)), bytes.NewReader(data)); err != nil {
+			return nil, fmt.Errorf("failed to decode response: %w", err)
+		}
+		return ð.ExecutionPayloadEnvelope{ExecutionPayload: &res}, nil
+	case 1:
+		envelope := ð.ExecutionPayloadEnvelope{}
+		if err := envelope.UnmarshalSSZ(uint32(len(data)), bytes.NewReader(data)); err != nil {
+			return nil, fmt.Errorf("failed to decode execution payload envelope response: %w", err)
+		}
+		return envelope, nil
+	default:
+		return nil, fmt.Errorf("unrecognized version: %d", version)
 	}
-
-	return ð.ExecutionPayloadEnvelope{ExecutionPayload: &res}, nil
 }
 
 func verifyBlock(envelope *eth.ExecutionPayloadEnvelope, expectedNum uint64) error {
@@ -740,22 +799,22 @@ func (srv *ReqRespServer) HandleSyncRequest(ctx context.Context, log log.Logger,
 	req, err := srv.handleSyncRequest(ctx, stream)
 	cancel()
 
-	resultCode := byte(0)
+	resultCode := ResultCodeSuccess
 	if err != nil {
 		log.Warn("failed to serve p2p sync request", "req", req, "err", err)
 		if errors.Is(err, ethereum.NotFound) {
-			resultCode = 1
+			resultCode = ResultCodeNotFoundErr
 		} else if errors.Is(err, invalidRequestErr) {
-			resultCode = 2
+			resultCode = ResultCodeInvalidErr
 		} else {
-			resultCode = 3
+			resultCode = ResultCodeUnknownErr
 		}
 		// try to write error code, so the other peer can understand the reason for failure.
 		_, _ = stream.Write([]byte{resultCode})
 	} else {
 		log.Debug("successfully served sync response", "req", req)
 	}
-	srv.metrics.ServerPayloadByNumberEvent(req, 0, time.Since(start))
+	srv.metrics.ServerPayloadByNumberEvent(req, resultCode, time.Since(start))
 }
 
 var invalidRequestErr = errors.New("invalid request")
diff --git a/op-node/p2p/sync_test.go b/op-node/p2p/sync_test.go
index 0c43778ce8f0..f382147e4533 100644
--- a/op-node/p2p/sync_test.go
+++ b/op-node/p2p/sync_test.go
@@ -169,7 +169,8 @@ func TestSinglePeerSync(t *testing.T) {
 	defer cl.Close()
 
 	// request to start syncing between 10 and 20
-	require.NoError(t, cl.RequestL2Range(ctx, payloads.getBlockRef(10), payloads.getBlockRef(20)))
+	_, err = cl.RequestL2Range(ctx, payloads.getBlockRef(10), payloads.getBlockRef(20))
+	require.NoError(t, err)
 
 	// and wait for the sync results to come in (in reverse order)
 	for i := uint64(19); i > 10; i-- {
@@ -255,7 +256,8 @@ func TestMultiPeerSync(t *testing.T) {
 	defer clC.Close()
 
 	// request to start syncing between 10 and 90
-	require.NoError(t, clA.RequestL2Range(ctx, payloads.getBlockRef(10), payloads.getBlockRef(90)))
+	_, err = clA.RequestL2Range(ctx, payloads.getBlockRef(10), payloads.getBlockRef(90))
+	require.NoError(t, err)
 
 	// With such large range to request we are going to hit the rate-limits of B and C,
 	// but that means we'll balance the work between the peers.
@@ -270,13 +272,18 @@ func TestMultiPeerSync(t *testing.T) {
 	// now see if B can sync a range, and fill the gap with a re-request
 	bl25, _ := payloads.getPayload(25) // temporarily remove it from the available payloads. This will create a gap
 	payloads.deletePayload(25)
-	require.NoError(t, clB.RequestL2Range(ctx, payloads.getBlockRef(20), payloads.getBlockRef(30)))
+	rangeReqId, err := clB.RequestL2Range(ctx, payloads.getBlockRef(20), payloads.getBlockRef(30))
+
+	require.NoError(t, err)
+	require.True(t, clB.activeRangeRequests.get(rangeReqId), "expecting range request to be active")
+
 	for i := uint64(29); i > 25; i-- {
 		p := <-recvB
 		exp, ok := payloads.getPayload(uint64(p.ExecutionPayload.BlockNumber))
 		require.True(t, ok, "expecting known payload")
 		require.Equal(t, exp.ExecutionPayload.BlockHash, p.ExecutionPayload.BlockHash, "expecting the correct payload")
 	}
+
 	// Wait for the request for block 25 to be made
 	ctx, cancelFunc := context.WithTimeout(context.Background(), 30*time.Second)
 	defer cancelFunc()
@@ -291,12 +298,12 @@ func TestMultiPeerSync(t *testing.T) {
 			t.Fatal("Did not request block 25 in a reasonable time")
 		}
 	}
+
 	// the request for 25 should fail. See:
 	// server: WARN  peer requested unknown block by number   num=25
 	// client: WARN  failed p2p sync request    num=25 err="peer failed to serve request with code 1"
 	require.Zero(t, len(recvB), "there is a gap, should not see other payloads yet")
-	// Add back the block
-	payloads.addPayload(bl25)
+
 	// race-condition fix: the request for 25 is expected to error, but is marked as complete in the peer-loop.
 	// But the re-request checks the status in the main loop, and it may thus look like it's still in-flight,
 	// and thus not run the new request.
@@ -306,13 +313,18 @@ func TestMultiPeerSync(t *testing.T) {
 	for {
 		isInFlight, err := clB.isInFlight(ctx, 25)
 		require.NoError(t, err)
+		time.Sleep(time.Second)
 		if !isInFlight {
 			break
 		}
-		time.Sleep(time.Second)
 	}
+	require.False(t, clB.activeRangeRequests.get(rangeReqId), "expecting range request to be cancelled")
+
+	// Add back the block
+	payloads.addPayload(bl25)
 	// And request a range again, 25 is there now, and 21-24 should follow quickly (some may already have been fetched and wait in quarantine)
-	require.NoError(t, clB.RequestL2Range(ctx, payloads.getBlockRef(20), payloads.getBlockRef(26)))
+	_, err = clB.RequestL2Range(ctx, payloads.getBlockRef(20), payloads.getBlockRef(26))
+	require.NoError(t, err)
 	for i := uint64(25); i > 20; i-- {
 		p := <-recvB
 		exp, ok := payloads.getPayload(uint64(p.ExecutionPayload.BlockNumber))
@@ -379,3 +391,14 @@ func TestNetworkNotifyAddPeerAndRemovePeer(t *testing.T) {
 	_, peerBExist3 := syncCl.peers[hostB.ID()]
 	require.True(t, !peerBExist3, "peerB should not exist in syncClient")
 }
+
+func TestPanicGuard(t *testing.T) {
+	mockPanickingFn := func(ctx context.Context, id peer.ID, expectedBlockNum uint64) error {
+		panic("gotcha")
+	}
+	require.NotPanics(t, func() {
+		err := panicGuard(mockPanickingFn)(context.Background(), peer.ID(""), 37)
+		require.EqualError(t, err, "recovered from a panic: gotcha")
+	})
+
+}
diff --git a/op-node/rollup/async/asyncgossiper.go b/op-node/rollup/async/asyncgossiper.go
index 34ca8ea5659d..969edc9987e9 100644
--- a/op-node/rollup/async/asyncgossiper.go
+++ b/op-node/rollup/async/asyncgossiper.go
@@ -40,13 +40,13 @@ type SimpleAsyncGossiper struct {
 }
 
 // To avoid import cycles, we define a new Network interface here
-// this interface is compatable with driver.Network
+// this interface is compatible with driver.Network
 type Network interface {
 	PublishL2Payload(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) error
 }
 
 // To avoid import cycles, we define a new Metrics interface here
-// this interface is compatable with driver.Metrics
+// this interface is compatible with driver.Metrics
 type Metrics interface {
 	RecordPublishingError()
 }
@@ -90,6 +90,11 @@ func (p *SimpleAsyncGossiper) Clear() {
 // Stop is a synchronous function to stop the async routine
 // it blocks until the async routine accepts the signal
 func (p *SimpleAsyncGossiper) Stop() {
+	// if the gossiping isn't running, nothing to do
+	if !p.running.Load() {
+		return
+	}
+
 	p.stop <- struct{}{}
 }
 
@@ -97,10 +102,9 @@ func (p *SimpleAsyncGossiper) Stop() {
 // each behavior of the loop is handled by a select case on a channel, plus an internal handler function call
 func (p *SimpleAsyncGossiper) Start() {
 	// if the gossiping is already running, return
-	if p.running.Load() {
+	if !p.running.CompareAndSwap(false, true) {
 		return
 	}
-	p.running.Store(true)
 	// else, start the handling loop
 	go func() {
 		defer p.running.Store(false)
diff --git a/op-node/rollup/chain_spec.go b/op-node/rollup/chain_spec.go
new file mode 100644
index 000000000000..0eaedd2c1c1e
--- /dev/null
+++ b/op-node/rollup/chain_spec.go
@@ -0,0 +1,161 @@
+package rollup
+
+import (
+	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum/go-ethereum/log"
+)
+
+// maxChannelBankSize is the amount of memory space, in number of bytes,
+// till the bank is pruned by removing channels, starting with the oldest channel.
+// It's value is changed with the Fjord network upgrade.
+const (
+	maxChannelBankSizeBedrock = 100_000_000
+	maxChannelBankSizeFjord   = 1_000_000_000
+)
+
+// MaxRLPBytesPerChannel is the maximum amount of bytes that will be read from
+// a channel. This limit is set when decoding the RLP.
+const (
+	maxRLPBytesPerChannelBedrock = 10_000_000
+	maxRLPBytesPerChannelFjord   = 100_000_000
+)
+
+// SafeMaxRLPBytesPerChannel is a limit of RLP Bytes per channel that is valid across every OP Stack chain.
+// The limit on certain chains at certain times may be higher
+// TODO(#10428) Remove this parameter
+const SafeMaxRLPBytesPerChannel = maxRLPBytesPerChannelBedrock
+
+// Fjord changes the max sequencer drift to a protocol constant. It was previously configurable via
+// the rollup config.
+// From Fjord, the max sequencer drift for a given block timestamp should be learned via the
+// ChainSpec instead of reading the rollup configuration field directly.
+const maxSequencerDriftFjord = 1800
+
+type ForkName string
+
+const (
+	Bedrock  ForkName = "bedrock"
+	Regolith ForkName = "regolith"
+	Canyon   ForkName = "canyon"
+	Delta    ForkName = "delta"
+	Ecotone  ForkName = "ecotone"
+	Fjord    ForkName = "fjord"
+	Interop  ForkName = "interop"
+	None     ForkName = "none"
+)
+
+var nextFork = map[ForkName]ForkName{
+	Bedrock:  Regolith,
+	Regolith: Canyon,
+	Canyon:   Delta,
+	Delta:    Ecotone,
+	Ecotone:  Fjord,
+	Fjord:    Interop,
+	Interop:  None,
+}
+
+type ChainSpec struct {
+	config      *Config
+	currentFork ForkName
+}
+
+func NewChainSpec(config *Config) *ChainSpec {
+	return &ChainSpec{config: config}
+}
+
+// IsCanyon returns true if t >= canyon_time
+func (s *ChainSpec) IsCanyon(t uint64) bool {
+	return s.config.IsCanyon(t)
+}
+
+// MaxChannelBankSize returns the maximum number of bytes the can allocated inside the channel bank
+// before pruning occurs at the given timestamp.
+func (s *ChainSpec) MaxChannelBankSize(t uint64) uint64 {
+	if s.config.IsFjord(t) {
+		return maxChannelBankSizeFjord
+	}
+	return maxChannelBankSizeBedrock
+}
+
+// ChannelTimeout returns the channel timeout constant.
+func (s *ChainSpec) ChannelTimeout() uint64 {
+	return s.config.ChannelTimeout
+}
+
+// MaxRLPBytesPerChannel returns the maximum amount of bytes that will be read from
+// a channel at a given timestamp.
+func (s *ChainSpec) MaxRLPBytesPerChannel(t uint64) uint64 {
+	if s.config.IsFjord(t) {
+		return maxRLPBytesPerChannelFjord
+	}
+	return maxRLPBytesPerChannelBedrock
+}
+
+// IsFeatMaxSequencerDriftConstant specifies in which fork the max sequencer drift change to a
+// constant will be performed.
+func (s *ChainSpec) IsFeatMaxSequencerDriftConstant(t uint64) bool {
+	return s.config.IsFjord(t)
+}
+
+// MaxSequencerDrift returns the maximum sequencer drift for the given block timestamp. Until Fjord,
+// this was a rollup configuration parameter. Since Fjord, it is a constant, so its effective value
+// should always be queried via the ChainSpec.
+func (s *ChainSpec) MaxSequencerDrift(t uint64) uint64 {
+	if s.IsFeatMaxSequencerDriftConstant(t) {
+		return maxSequencerDriftFjord
+	}
+	return s.config.MaxSequencerDrift
+}
+
+func (s *ChainSpec) CheckForkActivation(log log.Logger, block eth.L2BlockRef) {
+	if s.currentFork == Interop {
+		return
+	}
+
+	if s.currentFork == "" {
+		// Initialize currentFork if it is not set yet
+		s.currentFork = Bedrock
+		if s.config.IsRegolith(block.Time) {
+			s.currentFork = Regolith
+		}
+		if s.config.IsCanyon(block.Time) {
+			s.currentFork = Canyon
+		}
+		if s.config.IsDelta(block.Time) {
+			s.currentFork = Delta
+		}
+		if s.config.IsEcotone(block.Time) {
+			s.currentFork = Ecotone
+		}
+		if s.config.IsFjord(block.Time) {
+			s.currentFork = Fjord
+		}
+		if s.config.IsInterop(block.Time) {
+			s.currentFork = Interop
+		}
+		log.Info("Current hardfork version detected", "forkName", s.currentFork)
+		return
+	}
+
+	foundActivationBlock := false
+
+	switch nextFork[s.currentFork] {
+	case Regolith:
+		foundActivationBlock = s.config.IsRegolithActivationBlock(block.Time)
+	case Canyon:
+		foundActivationBlock = s.config.IsCanyonActivationBlock(block.Time)
+	case Delta:
+		foundActivationBlock = s.config.IsDeltaActivationBlock(block.Time)
+	case Ecotone:
+		foundActivationBlock = s.config.IsEcotoneActivationBlock(block.Time)
+	case Fjord:
+		foundActivationBlock = s.config.IsFjordActivationBlock(block.Time)
+	case Interop:
+		foundActivationBlock = s.config.IsInteropActivationBlock(block.Time)
+	}
+
+	if foundActivationBlock {
+		s.currentFork = nextFork[s.currentFork]
+		log.Info("Detected hardfork activation block", "forkName", s.currentFork, "timestamp", block.Time, "blockNum", block.Number, "hash", block.Hash)
+	}
+}
diff --git a/op-node/rollup/chain_spec_test.go b/op-node/rollup/chain_spec_test.go
new file mode 100644
index 000000000000..b6547835cdba
--- /dev/null
+++ b/op-node/rollup/chain_spec_test.go
@@ -0,0 +1,198 @@
+package rollup
+
+import (
+	"math/big"
+	"testing"
+
+	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/stretchr/testify/require"
+	"golang.org/x/exp/slog"
+)
+
+func u64ptr(n uint64) *uint64 {
+	return &n
+}
+
+var testConfig = Config{
+	Genesis: Genesis{
+		L1: eth.BlockID{
+			Hash:   common.HexToHash("0x438335a20d98863a4c0c97999eb2481921ccd28553eac6f913af7c12aec04108"),
+			Number: 17422590,
+		},
+		L2: eth.BlockID{
+			Hash:   common.HexToHash("0xdbf6a80fef073de06add9b0d14026d6e5a86c85f6d102c36d3d8e9cf89c2afd3"),
+			Number: 105235063,
+		},
+		L2Time: 0,
+		SystemConfig: eth.SystemConfig{
+			BatcherAddr: common.HexToAddress("0x6887246668a3b87f54deb3b94ba47a6f63f32985"),
+			Overhead:    eth.Bytes32(common.HexToHash("0x00000000000000000000000000000000000000000000000000000000000000bc")),
+			Scalar:      eth.Bytes32(common.HexToHash("0x00000000000000000000000000000000000000000000000000000000000a6fe0")),
+			GasLimit:    30_000_000,
+		},
+	},
+	BlockTime:               2,
+	MaxSequencerDrift:       600,
+	SeqWindowSize:           3600,
+	ChannelTimeout:          300,
+	L1ChainID:               big.NewInt(1),
+	L2ChainID:               big.NewInt(10),
+	RegolithTime:            u64ptr(10),
+	CanyonTime:              u64ptr(20),
+	DeltaTime:               u64ptr(30),
+	EcotoneTime:             u64ptr(40),
+	FjordTime:               u64ptr(50),
+	InteropTime:             nil,
+	BatchInboxAddress:       common.HexToAddress("0xff00000000000000000000000000000000000010"),
+	DepositContractAddress:  common.HexToAddress("0xbEb5Fc579115071764c7423A4f12eDde41f106Ed"),
+	L1SystemConfigAddress:   common.HexToAddress("0x229047fed2591dbec1eF1118d64F7aF3dB9EB290"),
+	ProtocolVersionsAddress: common.HexToAddress("0x8062AbC286f5e7D9428a0Ccb9AbD71e50d93b935"),
+	PlasmaConfig:            nil,
+}
+
+func TestChainSpec_CanyonForkActivation(t *testing.T) {
+	c := NewChainSpec(&testConfig)
+	tests := []struct {
+		name     string
+		blockNum uint64
+		isCanyon bool
+	}{
+		{"Genesis", 0, false},
+		{"CanyonTimeMinusOne", 19, false},
+		{"CanyonTime", 20, true},
+		{"CanyonTimePlusOne", 21, true},
+		{"DeltaTime", 30, true},
+		{"EcotoneTime", 40, true},
+		{"FjordTime", 50, true},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			result := c.IsCanyon(tt.blockNum)
+			require.Equal(t, tt.isCanyon, result, "Block number %d should be Canyon", tt.blockNum)
+		})
+	}
+}
+
+func TestChainSpec_MaxChannelBankSize(t *testing.T) {
+	c := NewChainSpec(&testConfig)
+	tests := []struct {
+		name        string
+		blockNum    uint64
+		expected    uint64
+		description string
+	}{
+		{"Genesis", 0, uint64(maxChannelBankSizeBedrock), "Before Fjord activation, should use Bedrock size"},
+		{"FjordTimeMinusOne", 49, uint64(maxChannelBankSizeBedrock), "Just before Fjord, should still use Bedrock size"},
+		{"FjordTime", 50, uint64(maxChannelBankSizeFjord), "At Fjord activation, should switch to Fjord size"},
+		{"FjordTimePlusOne", 51, uint64(maxChannelBankSizeFjord), "After Fjord activation, should use Fjord size"},
+		{"NextForkTime", 60, uint64(maxChannelBankSizeFjord), "Well after Fjord, should continue to use Fjord size"},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			result := c.MaxChannelBankSize(tt.blockNum)
+			require.Equal(t, tt.expected, result, tt.description)
+		})
+	}
+}
+
+func TestChainSpec_MaxRLPBytesPerChannel(t *testing.T) {
+	c := NewChainSpec(&testConfig)
+	tests := []struct {
+		name        string
+		blockNum    uint64
+		expected    uint64
+		description string
+	}{
+		{"Genesis", 0, uint64(maxRLPBytesPerChannelBedrock), "Before Fjord activation, should use Bedrock RLP bytes limit"},
+		{"FjordTimeMinusOne", 49, uint64(maxRLPBytesPerChannelBedrock), "Just before Fjord, should still use Bedrock RLP bytes limit"},
+		{"FjordTime", 50, uint64(maxRLPBytesPerChannelFjord), "At Fjord activation, should switch to Fjord RLP bytes limit"},
+		{"FjordTimePlusOne", 51, uint64(maxRLPBytesPerChannelFjord), "After Fjord activation, should use Fjord RLP bytes limit"},
+		{"NextForkTime", 60, uint64(maxRLPBytesPerChannelFjord), "Well after Fjord, should continue to use Fjord RLP bytes limit"},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			result := c.MaxRLPBytesPerChannel(tt.blockNum)
+			require.Equal(t, tt.expected, result, tt.description)
+		})
+	}
+}
+
+func TestChainSpec_MaxSequencerDrift(t *testing.T) {
+	c := NewChainSpec(&testConfig)
+	tests := []struct {
+		name        string
+		blockNum    uint64
+		expected    uint64
+		description string
+	}{
+		{"Genesis", 0, testConfig.MaxSequencerDrift, "Before Fjord activation, should use rollup config value"},
+		{"FjordTimeMinusOne", 49, testConfig.MaxSequencerDrift, "Just before Fjord, should still use rollup config value"},
+		{"FjordTime", 50, maxSequencerDriftFjord, "At Fjord activation, should switch to Fjord constant"},
+		{"FjordTimePlusOne", 51, maxSequencerDriftFjord, "After Fjord activation, should use Fjord constant"},
+		{"NextForkTime", 60, maxSequencerDriftFjord, "Well after Fjord, should continue to use Fjord constant"},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			result := c.MaxSequencerDrift(tt.blockNum)
+			require.Equal(t, tt.expected, result, tt.description)
+		})
+	}
+}
+
+func TestCheckForkActivation(t *testing.T) {
+	tests := []struct {
+		name                string
+		block               eth.L2BlockRef
+		expectedCurrentFork ForkName
+		expectedLog         string
+	}{
+		{
+			name:                "Regolith activation",
+			block:               eth.L2BlockRef{Time: 10, Number: 5, Hash: common.Hash{0x5}},
+			expectedCurrentFork: Regolith,
+			expectedLog:         "Detected hardfork activation block",
+		},
+		{
+			name:                "Still Regolith",
+			block:               eth.L2BlockRef{Time: 11, Number: 6, Hash: common.Hash{0x6}},
+			expectedCurrentFork: Regolith,
+			expectedLog:         "",
+		},
+		{
+			name:                "Canyon activation",
+			block:               eth.L2BlockRef{Time: 20, Number: 7, Hash: common.Hash{0x7}},
+			expectedCurrentFork: Canyon,
+			expectedLog:         "Detected hardfork activation block",
+		},
+		{
+			name:                "No more hardforks",
+			block:               eth.L2BlockRef{Time: 700, Number: 8, Hash: common.Hash{0x8}},
+			expectedCurrentFork: Fjord,
+			expectedLog:         "",
+		},
+	}
+
+	hasInfoLevel := testlog.NewLevelFilter(slog.LevelInfo)
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			lgr, logs := testlog.CaptureLogger(t, slog.LevelDebug)
+
+			chainSpec := NewChainSpec(&testConfig)
+			// First call initializes chainSpec.currentFork value
+			chainSpec.CheckForkActivation(lgr, eth.L2BlockRef{Time: tt.block.Time - 1, Number: 1, Hash: common.Hash{0x1}})
+			chainSpec.CheckForkActivation(lgr, tt.block)
+			require.Equal(t, tt.expectedCurrentFork, chainSpec.currentFork)
+			if tt.expectedLog != "" {
+				require.NotNil(t, logs.FindLog(
+					hasInfoLevel,
+					testlog.NewMessageContainsFilter(tt.expectedLog)))
+			}
+		})
+	}
+}
diff --git a/op-node/rollup/derive/attributes.go b/op-node/rollup/derive/attributes.go
index 77a683755ebc..c65198bcec73 100644
--- a/op-node/rollup/derive/attributes.go
+++ b/op-node/rollup/derive/attributes.go
@@ -8,9 +8,9 @@ import (
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/core/types"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 )
 
 // L1ReceiptsFetcher fetches L1 header info and receipts for the payload attributes derivation (the info tx and deposits)
@@ -108,6 +108,14 @@ func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Contex
 		}
 	}
 
+	if ba.rollupCfg.IsFjordActivationBlock(nextL2Time) {
+		fjord, err := FjordNetworkUpgradeTransactions()
+		if err != nil {
+			return nil, NewCriticalError(fmt.Errorf("failed to build fjord network upgrade txs: %w", err))
+		}
+		upgradeTxs = append(upgradeTxs, fjord...)
+	}
+
 	l1InfoTx, err := L1InfoDepositBytes(ba.rollupCfg, sysConfig, seqNumber, l1Info, nextL2Time)
 	if err != nil {
 		return nil, NewCriticalError(fmt.Errorf("failed to create l1InfoTx: %w", err))
diff --git a/op-node/rollup/derive/attributes_queue_test.go b/op-node/rollup/derive/attributes_queue_test.go
index c9f23080d4fc..ebbca96ee4f5 100644
--- a/op-node/rollup/derive/attributes_queue_test.go
+++ b/op-node/rollup/derive/attributes_queue_test.go
@@ -11,9 +11,9 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum-optimism/optimism/op-service/testutils"
 )
diff --git a/op-node/rollup/derive/attributes_test.go b/op-node/rollup/derive/attributes_test.go
index b6c3e80737e0..68c7c71aa1e1 100644
--- a/op-node/rollup/derive/attributes_test.go
+++ b/op-node/rollup/derive/attributes_test.go
@@ -13,9 +13,9 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/types"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum-optimism/optimism/op-service/testutils"
 )
 
diff --git a/op-node/rollup/derive/batch.go b/op-node/rollup/derive/batch.go
index c58b7e340c44..9e6283cc0ca7 100644
--- a/op-node/rollup/derive/batch.go
+++ b/op-node/rollup/derive/batch.go
@@ -37,6 +37,21 @@ type Batch interface {
 	GetBatchType() int
 	GetTimestamp() uint64
 	LogContext(log.Logger) log.Logger
+	AsSingularBatch() (*SingularBatch, bool)
+	AsSpanBatch() (*SpanBatch, bool)
+}
+
+type batchWithMetadata struct {
+	Batch
+	comprAlgo CompressionAlgo
+}
+
+func (b batchWithMetadata) LogContext(l log.Logger) log.Logger {
+	lgr := b.Batch.LogContext(l)
+	if b.comprAlgo == "" {
+		return lgr
+	}
+	return lgr.With("compression_algo", b.comprAlgo)
 }
 
 // BatchData is used to represent the typed encoding & decoding.
@@ -44,7 +59,8 @@ type Batch interface {
 // Further fields such as cache can be added in the future, without embedding each type of InnerBatchData.
 // Similar design with op-geth's types.Transaction struct.
 type BatchData struct {
-	inner InnerBatchData
+	inner     InnerBatchData
+	ComprAlgo CompressionAlgo
 }
 
 // InnerBatchData is the underlying data of a BatchData.
diff --git a/op-node/rollup/derive/batch_queue.go b/op-node/rollup/derive/batch_queue.go
index 22cb1bafc547..3dbfe20d305d 100644
--- a/op-node/rollup/derive/batch_queue.go
+++ b/op-node/rollup/derive/batch_queue.go
@@ -117,11 +117,7 @@ func (bq *BatchQueue) NextBatch(ctx context.Context, parent eth.L2BlockRef) (*Si
 		for i, l1Block := range bq.l1Blocks {
 			if parent.L1Origin.Number == l1Block.Number {
 				bq.l1Blocks = bq.l1Blocks[i:]
-				if len(bq.l1Blocks) > 0 {
-					bq.log.Debug("Advancing internal L1 blocks", "next_epoch", bq.l1Blocks[0].ID(), "next_epoch_time", bq.l1Blocks[0].Time)
-				} else {
-					bq.log.Debug("Advancing internal L1 blocks. No L1 blocks left")
-				}
+				bq.log.Debug("Advancing internal L1 blocks", "next_epoch", bq.l1Blocks[0].ID(), "next_epoch_time", bq.l1Blocks[0].Time)
 				break
 			}
 		}
@@ -181,15 +177,15 @@ func (bq *BatchQueue) NextBatch(ctx context.Context, parent eth.L2BlockRef) (*Si
 	}
 
 	var nextBatch *SingularBatch
-	switch batch.GetBatchType() {
+	switch typ := batch.GetBatchType(); typ {
 	case SingularBatchType:
-		singularBatch, ok := batch.(*SingularBatch)
+		singularBatch, ok := batch.AsSingularBatch()
 		if !ok {
 			return nil, false, NewCriticalError(errors.New("failed type assertion to SingularBatch"))
 		}
 		nextBatch = singularBatch
 	case SpanBatchType:
-		spanBatch, ok := batch.(*SpanBatch)
+		spanBatch, ok := batch.AsSpanBatch()
 		if !ok {
 			return nil, false, NewCriticalError(errors.New("failed type assertion to SpanBatch"))
 		}
@@ -202,7 +198,7 @@ func (bq *BatchQueue) NextBatch(ctx context.Context, parent eth.L2BlockRef) (*Si
 		// span-batches are non-empty, so the below pop is safe.
 		nextBatch = bq.popNextBatch(parent)
 	default:
-		return nil, false, NewCriticalError(fmt.Errorf("unrecognized batch type: %d", batch.GetBatchType()))
+		return nil, false, NewCriticalError(fmt.Errorf("unrecognized batch type: %d", typ))
 	}
 
 	// If the nextBatch is derived from the span batch, len(bq.nextSpan) == 0 means it's the last batch of the span.
diff --git a/op-node/rollup/derive/batch_queue_test.go b/op-node/rollup/derive/batch_queue_test.go
index f82a7520842a..6712ae15a680 100644
--- a/op-node/rollup/derive/batch_queue_test.go
+++ b/op-node/rollup/derive/batch_queue_test.go
@@ -66,7 +66,7 @@ func buildSpanBatches(t *testing.T, parent *eth.L2BlockRef, singularBatches []*S
 	var spanBatches []Batch
 	idx := 0
 	for _, count := range blockCounts {
-		span := NewSpanBatch(singularBatches[idx : idx+count])
+		span := initializedSpanBatch(singularBatches[idx:idx+count], uint64(0), chainId)
 		spanBatches = append(spanBatches, span)
 		idx += count
 	}
@@ -767,7 +767,7 @@ func TestBatchQueueOverlappingSpanBatch(t *testing.T) {
 	var inputBatches []Batch
 	batchSize := 3
 	for i := 0; i < len(expectedOutputBatches)-batchSize; i++ {
-		inputBatches = append(inputBatches, NewSpanBatch(expectedOutputBatches[i:i+batchSize]))
+		inputBatches = append(inputBatches, initializedSpanBatch(expectedOutputBatches[i:i+batchSize], uint64(0), chainId))
 	}
 	inputBatches = append(inputBatches, nil)
 	// inputBatches:
@@ -872,12 +872,12 @@ func TestBatchQueueComplex(t *testing.T) {
 	inputErrors := []error{nil, nil, nil, nil, nil, nil, io.EOF}
 	// batches will be returned by fakeBatchQueueInput
 	inputBatches := []Batch{
-		NewSpanBatch(expectedOutputBatches[0:2]), // [6, 8] - no overlap
-		expectedOutputBatches[2],                 // [10] - no overlap
-		NewSpanBatch(expectedOutputBatches[1:4]), // [8, 10, 12] - overlapped blocks: 8 or 8, 10
-		expectedOutputBatches[4],                 // [14] - no overlap
-		NewSpanBatch(expectedOutputBatches[4:6]), // [14, 16] - overlapped blocks: nothing or 14
-		NewSpanBatch(expectedOutputBatches[6:9]), // [18, 20, 22] - no overlap
+		initializedSpanBatch(expectedOutputBatches[0:2], uint64(0), chainId), // [6, 8] - no overlap
+		expectedOutputBatches[2], // [10] - no overlap
+		initializedSpanBatch(expectedOutputBatches[1:4], uint64(0), chainId), // [8, 10, 12] - overlapped blocks: 8 or 8, 10
+		expectedOutputBatches[4], // [14] - no overlap
+		initializedSpanBatch(expectedOutputBatches[4:6], uint64(0), chainId), // [14, 16] - overlapped blocks: nothing or 14
+		initializedSpanBatch(expectedOutputBatches[6:9], uint64(0), chainId), // [18, 20, 22] - no overlap
 	}
 
 	// Shuffle the order of input batches
@@ -979,7 +979,7 @@ func TestBatchQueueResetSpan(t *testing.T) {
 	}
 
 	input := &fakeBatchQueueInput{
-		batches: []Batch{NewSpanBatch(singularBatches)},
+		batches: []Batch{initializedSpanBatch(singularBatches, uint64(0), chainId)},
 		errors:  []error{nil},
 		origin:  l1[2],
 	}
diff --git a/op-node/rollup/derive/batch_test.go b/op-node/rollup/derive/batch_test.go
index 4668a7e035f7..3dc554a59325 100644
--- a/op-node/rollup/derive/batch_test.go
+++ b/op-node/rollup/derive/batch_test.go
@@ -76,28 +76,6 @@ func RandomRawSpanBatch(rng *rand.Rand, chainId *big.Int) *RawSpanBatch {
 	return &rawSpanBatch
 }
 
-func RandomSingularBatch(rng *rand.Rand, txCount int, chainID *big.Int) *SingularBatch {
-	signer := types.NewLondonSigner(chainID)
-	baseFee := big.NewInt(rng.Int63n(300_000_000_000))
-	txsEncoded := make([]hexutil.Bytes, 0, txCount)
-	// force each tx to have equal chainID
-	for i := 0; i < txCount; i++ {
-		tx := testutils.RandomTx(rng, baseFee, signer)
-		txEncoded, err := tx.MarshalBinary()
-		if err != nil {
-			panic("tx Marshal binary" + err.Error())
-		}
-		txsEncoded = append(txsEncoded, hexutil.Bytes(txEncoded))
-	}
-	return &SingularBatch{
-		ParentHash:   testutils.RandomHash(rng),
-		EpochNum:     rollup.Epoch(1 + rng.Int63n(100_000_000)),
-		EpochHash:    testutils.RandomHash(rng),
-		Timestamp:    uint64(rng.Int63n(2_000_000_000)),
-		Transactions: txsEncoded,
-	}
-}
-
 func RandomValidConsecutiveSingularBatches(rng *rand.Rand, chainID *big.Int) []*SingularBatch {
 	blockCount := 2 + rng.Intn(128)
 	l2BlockTime := uint64(2)
diff --git a/op-node/rollup/derive/batch_test_utils.go b/op-node/rollup/derive/batch_test_utils.go
new file mode 100644
index 000000000000..3b931cc4f03b
--- /dev/null
+++ b/op-node/rollup/derive/batch_test_utils.go
@@ -0,0 +1,33 @@
+package derive
+
+import (
+	"math/big"
+	"math/rand"
+
+	"github.com/ethereum-optimism/optimism/op-node/rollup"
+	"github.com/ethereum-optimism/optimism/op-service/testutils"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+	"github.com/ethereum/go-ethereum/core/types"
+)
+
+func RandomSingularBatch(rng *rand.Rand, txCount int, chainID *big.Int) *SingularBatch {
+	signer := types.NewLondonSigner(chainID)
+	baseFee := big.NewInt(rng.Int63n(300_000_000_000))
+	txsEncoded := make([]hexutil.Bytes, 0, txCount)
+	// force each tx to have equal chainID
+	for i := 0; i < txCount; i++ {
+		tx := testutils.RandomTx(rng, baseFee, signer)
+		txEncoded, err := tx.MarshalBinary()
+		if err != nil {
+			panic("tx Marshal binary" + err.Error())
+		}
+		txsEncoded = append(txsEncoded, hexutil.Bytes(txEncoded))
+	}
+	return &SingularBatch{
+		ParentHash:   testutils.RandomHash(rng),
+		EpochNum:     rollup.Epoch(1 + rng.Int63n(100_000_000)),
+		EpochHash:    testutils.RandomHash(rng),
+		Timestamp:    uint64(rng.Int63n(2_000_000_000)),
+		Transactions: txsEncoded,
+	}
+}
diff --git a/op-node/rollup/derive/batches.go b/op-node/rollup/derive/batches.go
index 1c70013d3ce9..bde228074552 100644
--- a/op-node/rollup/derive/batches.go
+++ b/op-node/rollup/derive/batches.go
@@ -11,8 +11,8 @@ import (
 )
 
 type BatchWithL1InclusionBlock struct {
+	Batch
 	L1InclusionBlock eth.L1BlockRef
-	Batch            Batch
 }
 
 type BatchValidity uint8
@@ -32,24 +32,25 @@ const (
 // The first entry of the l1Blocks should match the origin of the l2SafeHead. One or more consecutive l1Blocks should be provided.
 // In case of only a single L1 block, the decision whether a batch is valid may have to stay undecided.
 func CheckBatch(ctx context.Context, cfg *rollup.Config, log log.Logger, l1Blocks []eth.L1BlockRef,
-	l2SafeHead eth.L2BlockRef, batch *BatchWithL1InclusionBlock, l2Fetcher SafeBlockFetcher) BatchValidity {
-	switch batch.Batch.GetBatchType() {
+	l2SafeHead eth.L2BlockRef, batch *BatchWithL1InclusionBlock, l2Fetcher SafeBlockFetcher,
+) BatchValidity {
+	switch typ := batch.GetBatchType(); typ {
 	case SingularBatchType:
-		singularBatch, ok := batch.Batch.(*SingularBatch)
+		singularBatch, ok := batch.AsSingularBatch()
 		if !ok {
 			log.Error("failed type assertion to SingularBatch")
 			return BatchDrop
 		}
 		return checkSingularBatch(cfg, log, l1Blocks, l2SafeHead, singularBatch, batch.L1InclusionBlock)
 	case SpanBatchType:
-		spanBatch, ok := batch.Batch.(*SpanBatch)
+		spanBatch, ok := batch.AsSpanBatch()
 		if !ok {
 			log.Error("failed type assertion to SpanBatch")
 			return BatchDrop
 		}
 		return checkSpanBatch(ctx, cfg, log, l1Blocks, l2SafeHead, spanBatch, batch.L1InclusionBlock, l2Fetcher)
 	default:
-		log.Warn("Unrecognized batch type: %d", batch.Batch.GetBatchType())
+		log.Warn("Unrecognized batch type: %d", typ)
 		return BatchDrop
 	}
 }
@@ -122,8 +123,9 @@ func checkSingularBatch(cfg *rollup.Config, log log.Logger, l1Blocks []eth.L1Blo
 		return BatchDrop
 	}
 
+	spec := rollup.NewChainSpec(cfg)
 	// Check if we ran out of sequencer time drift
-	if max := batchOrigin.Time + cfg.MaxSequencerDrift; batch.Timestamp > max {
+	if max := batchOrigin.Time + spec.MaxSequencerDrift(batchOrigin.Time); batch.Timestamp > max {
 		if len(batch.Transactions) == 0 {
 			// If the sequencer is co-operating by producing an empty batch,
 			// then allow the batch if it was the right thing to do to maintain the L2 time >= L1 time invariant.
@@ -166,7 +168,8 @@ func checkSingularBatch(cfg *rollup.Config, log log.Logger, l1Blocks []eth.L1Blo
 
 // checkSpanBatch implements SpanBatch validation rule.
 func checkSpanBatch(ctx context.Context, cfg *rollup.Config, log log.Logger, l1Blocks []eth.L1BlockRef, l2SafeHead eth.L2BlockRef,
-	batch *SpanBatch, l1InclusionBlock eth.L1BlockRef, l2Fetcher SafeBlockFetcher) BatchValidity {
+	batch *SpanBatch, l1InclusionBlock eth.L1BlockRef, l2Fetcher SafeBlockFetcher,
+) BatchValidity {
 	// add details to the log
 	log = batch.LogContext(log)
 
@@ -266,10 +269,7 @@ func checkSpanBatch(ctx context.Context, cfg *rollup.Config, log log.Logger, l1B
 	}
 
 	originIdx := 0
-	originAdvanced := false
-	if startEpochNum == parentBlock.L1Origin.Number+1 {
-		originAdvanced = true
-	}
+	originAdvanced := startEpochNum == parentBlock.L1Origin.Number+1
 
 	for i := 0; i < batch.GetBlockCount(); i++ {
 		if batch.GetBlockTimestamp(i) <= l2SafeHead.Time {
@@ -282,7 +282,6 @@ func checkSpanBatch(ctx context.Context, cfg *rollup.Config, log log.Logger, l1B
 				originIdx = j
 				break
 			}
-
 		}
 		if i > 0 {
 			originAdvanced = false
@@ -296,8 +295,9 @@ func checkSpanBatch(ctx context.Context, cfg *rollup.Config, log log.Logger, l1B
 			return BatchDrop
 		}
 
+		spec := rollup.NewChainSpec(cfg)
 		// Check if we ran out of sequencer time drift
-		if max := l1Origin.Time + cfg.MaxSequencerDrift; blockTimestamp > max {
+		if max := l1Origin.Time + spec.MaxSequencerDrift(l1Origin.Time); blockTimestamp > max {
 			if len(batch.GetBlockTransactions(i)) == 0 {
 				// If the sequencer is co-operating by producing an empty batch,
 				// then allow the batch if it was the right thing to do to maintain the L2 time >= L1 time invariant.
diff --git a/op-node/rollup/derive/batches_test.go b/op-node/rollup/derive/batches_test.go
index 2cef6c4c6c0b..125fc0f02e2c 100644
--- a/op-node/rollup/derive/batches_test.go
+++ b/op-node/rollup/derive/batches_test.go
@@ -24,26 +24,53 @@ type ValidBatchTestCase struct {
 	L2SafeHead     eth.L2BlockRef
 	Batch          BatchWithL1InclusionBlock
 	Expected       BatchValidity
-	ExpectedLog    string // log message that must be included
-	NotExpectedLog string // log message that must not be included
-	DeltaTime      *uint64
+	ExpectedLog    string               // log message that must be included
+	NotExpectedLog string               // log message that must not be included
+	ConfigMod      func(*rollup.Config) // optional rollup config mod
 }
 
+var zero64 = uint64(0)
+
+func deltaAtGenesis(c *rollup.Config) {
+	c.DeltaTime = &zero64
+}
+
+func deltaAt(t *uint64) func(*rollup.Config) {
+	return func(c *rollup.Config) {
+		c.DeltaTime = t
+	}
+}
+
+func fjordAt(t *uint64) func(*rollup.Config) {
+	return func(c *rollup.Config) {
+		c.FjordTime = t
+	}
+}
+
+func multiMod[T any](mods ...func(T)) func(T) {
+	return func(x T) {
+		for _, mod := range mods {
+			mod(x)
+		}
+	}
+}
+
+const defaultBlockTime = 2
+
 func TestValidBatch(t *testing.T) {
-	defaultConf := rollup.Config{
-		Genesis: rollup.Genesis{
-			L2Time: 31, // a genesis time that itself does not align to make it more interesting
-		},
-		BlockTime:         2,
-		SeqWindowSize:     4,
-		MaxSequencerDrift: 6,
-		// other config fields are ignored and can be left empty.
-		DeltaTime: nil,
+	defaultConf := func() *rollup.Config {
+		return &rollup.Config{
+			Genesis: rollup.Genesis{
+				L2Time: 31, // a genesis time that itself does not align to make it more interesting
+			},
+			BlockTime:         defaultBlockTime,
+			SeqWindowSize:     4,
+			MaxSequencerDrift: 6,
+		}
 	}
 
 	rng := rand.New(rand.NewSource(1234))
 
-	minTs := uint64(0)
 	chainId := new(big.Int).SetUint64(rng.Uint64())
 	signer := types.NewLondonSigner(chainId)
 	randTx := testutils.RandomTx(rng, new(big.Int).SetUint64(rng.Uint64()), signer)
@@ -94,7 +121,7 @@ func TestValidBatch(t *testing.T) {
 		Hash:           testutils.RandomHash(rng),
 		Number:         l2A0.Number + 1,
 		ParentHash:     l2A0.Hash,
-		Time:           l2A0.Time + defaultConf.BlockTime,
+		Time:           l2A0.Time + defaultBlockTime,
 		L1Origin:       l1A.ID(),
 		SequenceNumber: 1,
 	}
@@ -103,7 +130,7 @@ func TestValidBatch(t *testing.T) {
 		Hash:           testutils.RandomHash(rng),
 		Number:         l2A1.Number + 1,
 		ParentHash:     l2A1.Hash,
-		Time:           l2A1.Time + defaultConf.BlockTime,
+		Time:           l2A1.Time + defaultBlockTime,
 		L1Origin:       l1A.ID(),
 		SequenceNumber: 2,
 	}
@@ -112,7 +139,7 @@ func TestValidBatch(t *testing.T) {
 		Hash:           testutils.RandomHash(rng),
 		Number:         l2A2.Number + 1,
 		ParentHash:     l2A2.Hash,
-		Time:           l2A2.Time + defaultConf.BlockTime,
+		Time:           l2A2.Time + defaultBlockTime,
 		L1Origin:       l1A.ID(),
 		SequenceNumber: 3,
 	}
@@ -121,7 +148,7 @@ func TestValidBatch(t *testing.T) {
 		Hash:           testutils.RandomHash(rng),
 		Number:         l2A3.Number + 1,
 		ParentHash:     l2A3.Hash,
-		Time:           l2A3.Time + defaultConf.BlockTime, // 8 seconds larger than l1A0, 1 larger than origin
+		Time:           l2A3.Time + defaultBlockTime, // 8 seconds larger than l1A0, 1 larger than origin
 		L1Origin:       l1B.ID(),
 		SequenceNumber: 0,
 	}
@@ -130,7 +157,7 @@ func TestValidBatch(t *testing.T) {
 		Hash:           testutils.RandomHash(rng),
 		Number:         l2B0.Number + 1,
 		ParentHash:     l2B0.Hash,
-		Time:           l2B0.Time + defaultConf.BlockTime,
+		Time:           l2B0.Time + defaultBlockTime,
 		L1Origin:       l1B.ID(),
 		SequenceNumber: 1,
 	}
@@ -139,7 +166,7 @@ func TestValidBatch(t *testing.T) {
 		Hash:           testutils.RandomHash(rng),
 		Number:         l2B1.Number + 1,
 		ParentHash:     l2B1.Hash,
-		Time:           l2B1.Time + defaultConf.BlockTime,
+		Time:           l2B1.Time + defaultBlockTime,
 		L1Origin:       l1B.ID(),
 		SequenceNumber: 2,
 	}
@@ -174,7 +201,7 @@ func TestValidBatch(t *testing.T) {
 		Hash:           testutils.RandomHash(rng),
 		Number:         l2X0.Number + 1,
 		ParentHash:     l2X0.Hash,
-		Time:           l2X0.Time + defaultConf.BlockTime, // exceeds sequencer time drift, forced to be empty block
+		Time:           l2X0.Time + defaultBlockTime, // exceeds sequencer time drift, forced to be empty block
 		L1Origin:       l1Y.ID(),
 		SequenceNumber: 0,
 	}
@@ -182,7 +209,7 @@ func TestValidBatch(t *testing.T) {
 		Hash:           testutils.RandomHash(rng),
 		Number:         l2Y0.Number + 1,
 		ParentHash:     l2Y0.Hash,
-		Time:           l2Y0.Time + defaultConf.BlockTime, // exceeds sequencer time drift, forced to be empty block
+		Time:           l2Y0.Time + defaultBlockTime, // exceeds sequencer time drift, forced to be empty block
 		L1Origin:       l1Z.ID(),
 		SequenceNumber: 0,
 	}
@@ -191,7 +218,7 @@ func TestValidBatch(t *testing.T) {
 		Hash:           testutils.RandomHash(rng),
 		Number:         l2A3.Number + 1,
 		ParentHash:     l2A3.Hash,
-		Time:           l2A3.Time + defaultConf.BlockTime, // 4*2 = 8, higher than seq time drift
+		Time:           l2A3.Time + defaultBlockTime, // 4*2 = 8, higher than seq time drift
 		L1Origin:       l1A.ID(),
 		SequenceNumber: 4,
 	}
@@ -310,7 +337,7 @@ func TestValidBatch(t *testing.T) {
 					ParentHash:   l2B0.Hash,                          // build on top of safe head to continue
 					EpochNum:     rollup.Epoch(l2A3.L1Origin.Number), // epoch A is no longer valid
 					EpochHash:    l2A3.L1Origin.Hash,
-					Timestamp:    l2B0.Time + defaultConf.BlockTime, // pass the timestamp check to get too epoch check
+					Timestamp:    l2B0.Time + defaultBlockTime, // pass the timestamp check to get too epoch check
 					Transactions: nil,
 				},
 			},
@@ -380,6 +407,23 @@ func TestValidBatch(t *testing.T) {
 			},
 			Expected: BatchDrop,
 		},
+		{ // this is the same test case as above, but with Fjord activated at the L1 origin, so accepted batch
+			Name:       "no sequencer time drift on same epoch with non-empty txs and Fjord",
+			L1Blocks:   []eth.L1BlockRef{l1A, l1B},
+			L2SafeHead: l2A3,
+			Batch: BatchWithL1InclusionBlock{
+				L1InclusionBlock: l1B,
+				Batch: &SingularBatch{ // we build l2A4, which has a timestamp of 2*4 = 8 higher than l2A0
+					ParentHash:   l2A4.ParentHash,
+					EpochNum:     rollup.Epoch(l2A4.L1Origin.Number),
+					EpochHash:    l2A4.L1Origin.Hash,
+					Timestamp:    l2A4.Time,
+					Transactions: []hexutil.Bytes{[]byte("sequencer should include this tx")},
+				},
+			},
+			ConfigMod: fjordAt(&l1A.Time),
+			Expected:  BatchAccept,
+		},
 		{
 			Name:       "sequencer time drift on changing epoch with non-empty txs",
 			L1Blocks:   []eth.L1BlockRef{l1X, l1Y, l1Z},
@@ -544,7 +588,7 @@ func TestValidBatch(t *testing.T) {
 					ParentHash:   l2A2.Hash,
 					EpochNum:     rollup.Epoch(l2B0.L1Origin.Number),
 					EpochHash:    l2B0.L1Origin.Hash,
-					Timestamp:    l2A2.Time + defaultConf.BlockTime,
+					Timestamp:    l2A2.Time + defaultBlockTime,
 					Transactions: nil,
 				},
 			},
@@ -558,7 +602,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A1.ParentHash,
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -566,11 +610,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A1.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchUndecided,
 			ExpectedLog: "missing L1 block input, cannot proceed with batch checking",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "future timestamp",
@@ -578,7 +622,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A1.ParentHash,
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -586,11 +630,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A1.Time + 1, // 1 too high
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchFuture,
 			ExpectedLog: "received out-of-order batch for future processing after next batch",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "misaligned timestamp",
@@ -598,7 +642,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A1.ParentHash,
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -606,11 +650,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A1.Time - 1, // block time is 2, so this is 1 too low
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "span batch has no new blocks after safe head",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "invalid parent block hash",
@@ -618,7 +662,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   testutils.RandomHash(rng),
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -626,11 +670,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A1.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "ignoring batch with mismatching parent hash",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "sequence window expired",
@@ -638,7 +682,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1F,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A1.ParentHash,
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -646,11 +690,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A1.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "batch was included too late, sequence window expired",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "epoch too old, but good parent hash and timestamp", // repeat of now outdated l2A3 data
@@ -658,25 +702,25 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2B0, // we already moved on to B
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1C,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2B0.Hash,                          // build on top of safe head to continue
 						EpochNum:     rollup.Epoch(l2A3.L1Origin.Number), // epoch A is no longer valid
 						EpochHash:    l2A3.L1Origin.Hash,
-						Timestamp:    l2B0.Time + defaultConf.BlockTime, // pass the timestamp check to get too epoch check
+						Timestamp:    l2B0.Time + defaultBlockTime, // pass the timestamp check to get too epoch check
 						Transactions: nil,
 					},
 					{
 						EpochNum:     rollup.Epoch(l1B.Number),
 						EpochHash:    l1B.Hash, // pass the l1 origin check
-						Timestamp:    l2B0.Time + defaultConf.BlockTime*2,
+						Timestamp:    l2B0.Time + defaultBlockTime*2,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "dropped batch, epoch is too old",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "insufficient L1 info for eager derivation",
@@ -684,7 +728,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A3,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1C,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2B0.ParentHash,
 						EpochNum:     rollup.Epoch(l2B0.L1Origin.Number),
@@ -692,11 +736,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2B0.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchUndecided,
 			ExpectedLog: "eager batch wants to advance epoch, but could not without more L1 blocks",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "insufficient L1 info for eager derivation - long span",
@@ -704,7 +748,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1C,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A3.ParentHash,
 						EpochNum:     rollup.Epoch(l2A3.L1Origin.Number),
@@ -719,11 +763,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2B0.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchUndecided,
 			ExpectedLog: "need more l1 blocks to check entire origins of span batch",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "epoch too new",
@@ -731,7 +775,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A3,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1D,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2B0.ParentHash,
 						EpochNum:     rollup.Epoch(l1C.Number), // invalid, we need to adopt epoch B before C
@@ -739,11 +783,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2B0.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "batch is for future epoch too far ahead, while it has the next timestamp, so it must be invalid",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "epoch hash wrong",
@@ -751,7 +795,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A3,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1C,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2B0.ParentHash,
 						EpochNum:     rollup.Epoch(l2B0.L1Origin.Number),
@@ -759,11 +803,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2B0.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "batch is for different L1 chain, epoch hash does not match",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "epoch hash wrong - long span",
@@ -771,7 +815,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1C,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{ // valid batch
 						ParentHash:   l2A3.ParentHash,
 						EpochNum:     rollup.Epoch(l2A3.L1Origin.Number),
@@ -786,11 +830,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2B0.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "batch is for different L1 chain, epoch hash does not match",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "sequencer time drift on same epoch with non-empty txs",
@@ -798,7 +842,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A3,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{ // we build l2A4, which has a timestamp of 2*4 = 8 higher than l2A0
 						ParentHash:   l2A4.ParentHash,
 						EpochNum:     rollup.Epoch(l2A4.L1Origin.Number),
@@ -806,11 +850,30 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A4.Time,
 						Transactions: []hexutil.Bytes{randTxData},
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "batch exceeded sequencer time drift, sequencer must adopt new L1 origin to include transactions again",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
+		},
+		{
+			Name:       "no sequencer time drift on same epoch with non-empty txs and Fjord",
+			L1Blocks:   []eth.L1BlockRef{l1A, l1B},
+			L2SafeHead: l2A3,
+			Batch: BatchWithL1InclusionBlock{
+				L1InclusionBlock: l1B,
+				Batch: initializedSpanBatch([]*SingularBatch{
+					{ // we build l2A4, which has a timestamp of 2*4 = 8 higher than l2A0
+						ParentHash:   l2A4.ParentHash,
+						EpochNum:     rollup.Epoch(l2A4.L1Origin.Number),
+						EpochHash:    l2A4.L1Origin.Hash,
+						Timestamp:    l2A4.Time,
+						Transactions: []hexutil.Bytes{randTxData},
+					},
+				}, uint64(0), big.NewInt(0)),
+			},
+			Expected:  BatchAccept,
+			ConfigMod: multiMod(deltaAtGenesis, fjordAt(&l1A.Time)),
 		},
 		{
 			Name:       "sequencer time drift on same epoch with non-empty txs - long span",
@@ -818,7 +881,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{ // valid batch
 						ParentHash:   l2A3.ParentHash,
 						EpochNum:     rollup.Epoch(l2A3.L1Origin.Number),
@@ -833,11 +896,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A4.Time,
 						Transactions: []hexutil.Bytes{randTxData},
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "batch exceeded sequencer time drift, sequencer must adopt new L1 origin to include transactions again",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "sequencer time drift on changing epoch with non-empty txs",
@@ -845,7 +908,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2X0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1Z,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2Y0.ParentHash,
 						EpochNum:     rollup.Epoch(l2Y0.L1Origin.Number),
@@ -853,11 +916,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2Y0.Time, // valid, but more than 6 ahead of l1Y.Time
 						Transactions: []hexutil.Bytes{randTxData},
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "batch exceeded sequencer time drift, sequencer must adopt new L1 origin to include transactions again",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "sequencer time drift on same epoch with empty txs and late next epoch",
@@ -865,7 +928,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A3,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1BLate,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{ // l2A4 time < l1BLate time, so we cannot adopt origin B yet
 						ParentHash:   l2A4.ParentHash,
 						EpochNum:     rollup.Epoch(l2A4.L1Origin.Number),
@@ -873,10 +936,10 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A4.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:  BatchAccept, // accepted because empty & preserving L2 time invariant
-			DeltaTime: &minTs,
+			ConfigMod: deltaAtGenesis,
 		},
 		{
 			Name:       "sequencer time drift on changing epoch with empty txs",
@@ -884,7 +947,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2X0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1Z,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2Y0.ParentHash,
 						EpochNum:     rollup.Epoch(l2Y0.L1Origin.Number),
@@ -899,10 +962,10 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2Z0.Time, // valid, but more than 6 ahead of l1Y.Time
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:       BatchAccept, // accepted because empty & still advancing epoch
-			DeltaTime:      &minTs,
+			ConfigMod:      deltaAtGenesis,
 			NotExpectedLog: "continuing with empty batch before late L1 block to preserve L2 time invariant",
 		},
 		{
@@ -911,7 +974,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A3,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{ // we build l2A4, which has a timestamp of 2*4 = 8 higher than l2A0
 						ParentHash:   l2A4.ParentHash,
 						EpochNum:     rollup.Epoch(l2A4.L1Origin.Number),
@@ -919,11 +982,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A4.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchUndecided, // we have to wait till the next epoch is in sight to check the time
 			ExpectedLog: "without the next L1 origin we cannot determine yet if this empty batch that exceeds the time drift is still valid",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "sequencer time drift on same epoch with empty txs and no next epoch in sight yet - long span",
@@ -931,7 +994,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{ // valid batch
 						ParentHash:   l2A3.ParentHash,
 						EpochNum:     rollup.Epoch(l2A3.L1Origin.Number),
@@ -946,11 +1009,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A4.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchUndecided, // we have to wait till the next epoch is in sight to check the time
 			ExpectedLog: "without the next L1 origin we cannot determine yet if this empty batch that exceeds the time drift is still valid",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "sequencer time drift on same epoch with empty txs and but in-sight epoch that invalidates it",
@@ -958,7 +1021,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A3,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1C,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{ // we build l2A4, which has a timestamp of 2*4 = 8 higher than l2A0
 						ParentHash:   l2A4.ParentHash,
 						EpochNum:     rollup.Epoch(l2A4.L1Origin.Number),
@@ -966,11 +1029,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A4.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop, // dropped because it could have advanced the epoch to B
 			ExpectedLog: "batch exceeded sequencer time drift without adopting next origin, and next L1 origin would have been valid",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "sequencer time drift on same epoch with empty txs and but in-sight epoch that invalidates it - long span",
@@ -978,7 +1041,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1C,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{ // valid batch
 						ParentHash:   l2A3.ParentHash,
 						EpochNum:     rollup.Epoch(l2A3.L1Origin.Number),
@@ -993,11 +1056,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A4.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop, // dropped because it could have advanced the epoch to B
 			ExpectedLog: "batch exceeded sequencer time drift without adopting next origin, and next L1 origin would have been valid",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "empty tx included",
@@ -1005,7 +1068,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash: l2A1.ParentHash,
 						EpochNum:   rollup.Epoch(l2A1.L1Origin.Number),
@@ -1015,11 +1078,11 @@ func TestValidBatch(t *testing.T) {
 							[]byte{}, // empty tx data
 						},
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "transaction data must not be empty, but found empty tx",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "deposit tx included",
@@ -1027,7 +1090,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash: l2A1.ParentHash,
 						EpochNum:   rollup.Epoch(l2A1.L1Origin.Number),
@@ -1037,11 +1100,11 @@ func TestValidBatch(t *testing.T) {
 							[]byte{types.DepositTxType, 0}, // piece of data alike to a deposit
 						},
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "sequencers may not embed any deposits into batch data, but found tx that has one",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "valid batch same epoch",
@@ -1049,7 +1112,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A1.ParentHash,
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -1057,10 +1120,10 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A1.Time,
 						Transactions: []hexutil.Bytes{randTxData},
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:  BatchAccept,
-			DeltaTime: &minTs,
+			ConfigMod: deltaAtGenesis,
 		},
 		{
 			Name:       "valid batch changing epoch",
@@ -1068,7 +1131,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A3,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1C,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2B0.ParentHash,
 						EpochNum:     rollup.Epoch(l2B0.L1Origin.Number),
@@ -1076,10 +1139,10 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2B0.Time,
 						Transactions: []hexutil.Bytes{randTxData},
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:  BatchAccept,
-			DeltaTime: &minTs,
+			ConfigMod: deltaAtGenesis,
 		},
 		{
 			Name:       "batch with L2 time before L1 time",
@@ -1087,19 +1150,19 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{ // we build l2B0, which starts a new epoch too early
 						ParentHash:   l2A2.Hash,
 						EpochNum:     rollup.Epoch(l2B0.L1Origin.Number),
 						EpochHash:    l2B0.L1Origin.Hash,
-						Timestamp:    l2A2.Time + defaultConf.BlockTime,
+						Timestamp:    l2A2.Time + defaultBlockTime,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "block timestamp is less than L1 origin timestamp",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "batch with L2 time before L1 time - long span",
@@ -1107,7 +1170,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A1,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{ // valid batch
 						ParentHash:   l2A1.Hash,
 						EpochNum:     rollup.Epoch(l2A2.L1Origin.Number),
@@ -1119,14 +1182,14 @@ func TestValidBatch(t *testing.T) {
 						ParentHash:   l2A2.Hash,
 						EpochNum:     rollup.Epoch(l2B0.L1Origin.Number),
 						EpochHash:    l2B0.L1Origin.Hash,
-						Timestamp:    l2A2.Time + defaultConf.BlockTime,
+						Timestamp:    l2A2.Time + defaultBlockTime,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "block timestamp is less than L1 origin timestamp",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "valid overlapping batch",
@@ -1134,7 +1197,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A1.Hash,
 						EpochNum:     rollup.Epoch(l2A2.L1Origin.Number),
@@ -1149,10 +1212,10 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A3.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:  BatchAccept,
-			DeltaTime: &minTs,
+			ConfigMod: deltaAtGenesis,
 		},
 		{
 			Name:       "longer overlapping batch",
@@ -1160,7 +1223,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A0.Hash,
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -1182,10 +1245,10 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A3.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:  BatchAccept,
-			DeltaTime: &minTs,
+			ConfigMod: deltaAtGenesis,
 		},
 		{
 			Name:       "fully overlapping batch",
@@ -1193,7 +1256,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A0.Hash,
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -1208,11 +1271,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A2.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "span batch has no new blocks after safe head",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "overlapping batch with invalid parent hash",
@@ -1220,7 +1283,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A0.Hash,
 						EpochNum:     rollup.Epoch(l2A2.L1Origin.Number),
@@ -1235,11 +1298,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A3.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "ignoring batch with mismatching parent hash",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "overlapping batch with invalid origin number",
@@ -1247,7 +1310,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A1.Hash,
 						EpochNum:     rollup.Epoch(l2A2.L1Origin.Number) + 1,
@@ -1262,11 +1325,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A3.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "overlapped block's L1 origin number does not match",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "overlapping batch with invalid tx",
@@ -1274,7 +1337,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A2,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A1.Hash,
 						EpochNum:     rollup.Epoch(l2A2.L1Origin.Number),
@@ -1289,11 +1352,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A3.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "overlapped block's tx count does not match",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "overlapping batch l2 fetcher error",
@@ -1301,7 +1364,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A1,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A0.ParentHash,
 						EpochNum:     rollup.Epoch(l2A0.L1Origin.Number),
@@ -1323,11 +1386,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A2.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchUndecided,
 			ExpectedLog: "failed to fetch L2 block",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "short block time",
@@ -1335,7 +1398,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A0.Hash,
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -1350,11 +1413,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A1.Time + 1,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "batch has misaligned timestamp, block time is too short",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "misaligned batch",
@@ -1362,7 +1425,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A0.Hash,
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -1377,11 +1440,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A1.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchDrop,
 			ExpectedLog: "batch has misaligned timestamp, not overlapped exactly",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "failed to fetch overlapping block payload",
@@ -1389,7 +1452,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A3,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A2.Hash,
 						EpochNum:     rollup.Epoch(l2A3.L1Origin.Number),
@@ -1404,11 +1467,11 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2B0.Time,
 						Transactions: nil,
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
 			Expected:    BatchUndecided,
 			ExpectedLog: "failed to fetch L2 block payload",
-			DeltaTime:   &minTs,
+			ConfigMod:   deltaAtGenesis,
 		},
 		{
 			Name:       "singular batch before hard fork",
@@ -1424,7 +1487,7 @@ func TestValidBatch(t *testing.T) {
 					Transactions: []hexutil.Bytes{randTxData},
 				},
 			},
-			DeltaTime: &l1B.Time,
+			ConfigMod: deltaAt(&l1B.Time),
 			Expected:  BatchAccept,
 		},
 		{
@@ -1433,7 +1496,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A1.ParentHash,
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -1441,9 +1504,9 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A1.Time,
 						Transactions: []hexutil.Bytes{randTxData},
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
-			DeltaTime:   &l1B.Time,
+			ConfigMod:   deltaAt(&l1B.Time),
 			Expected:    BatchDrop,
 			ExpectedLog: "received SpanBatch with L1 origin before Delta hard fork",
 		},
@@ -1461,7 +1524,7 @@ func TestValidBatch(t *testing.T) {
 					Transactions: []hexutil.Bytes{randTxData},
 				},
 			},
-			DeltaTime: &l1A.Time,
+			ConfigMod: deltaAt(&l1A.Time),
 			Expected:  BatchAccept,
 		},
 		{
@@ -1470,7 +1533,7 @@ func TestValidBatch(t *testing.T) {
 			L2SafeHead: l2A0,
 			Batch: BatchWithL1InclusionBlock{
 				L1InclusionBlock: l1B,
-				Batch: NewSpanBatch([]*SingularBatch{
+				Batch: initializedSpanBatch([]*SingularBatch{
 					{
 						ParentHash:   l2A1.ParentHash,
 						EpochNum:     rollup.Epoch(l2A1.L1Origin.Number),
@@ -1478,9 +1541,9 @@ func TestValidBatch(t *testing.T) {
 						Timestamp:    l2A1.Time,
 						Transactions: []hexutil.Bytes{randTxData},
 					},
-				}),
+				}, uint64(0), big.NewInt(0)),
 			},
-			DeltaTime: &l1A.Time,
+			ConfigMod: deltaAt(&l1A.Time),
 			Expected:  BatchAccept,
 		},
 	}
@@ -1515,11 +1578,11 @@ func TestValidBatch(t *testing.T) {
 
 	runTestCase := func(t *testing.T, testCase ValidBatchTestCase) {
 		ctx := context.Background()
-		rcfg := defaultConf
-		if testCase.DeltaTime != nil {
-			rcfg.DeltaTime = testCase.DeltaTime
+		rcfg := defaultConf()
+		if mod := testCase.ConfigMod; mod != nil {
+			mod(rcfg)
 		}
-		validity := CheckBatch(ctx, &rcfg, logger, testCase.L1Blocks, testCase.L2SafeHead, &testCase.Batch, &l2Client)
+		validity := CheckBatch(ctx, rcfg, logger, testCase.L1Blocks, testCase.L2SafeHead, &testCase.Batch, &l2Client)
 		require.Equal(t, testCase.Expected, validity, "batch check must return expected validity level")
 		if expLog := testCase.ExpectedLog; expLog != "" {
 			// Check if ExpectedLog is contained in the log buffer
@@ -1576,7 +1639,7 @@ func TestValidBatch(t *testing.T) {
 		L2SafeHead: l2B1,
 		Batch: BatchWithL1InclusionBlock{
 			L1InclusionBlock: l1B,
-			Batch: NewSpanBatch([]*SingularBatch{
+			Batch: initializedSpanBatch([]*SingularBatch{
 				{
 					ParentHash:   l2B0.Hash,
 					EpochNum:     rollup.Epoch(l2B1.L1Origin.Number),
@@ -1591,11 +1654,11 @@ func TestValidBatch(t *testing.T) {
 					Timestamp:    l2B2.Time,
 					Transactions: nil,
 				},
-			}),
+			}, uint64(0), big.NewInt(0)),
 		},
 		Expected:    BatchDrop,
 		ExpectedLog: "overlapped block's transaction does not match",
-		DeltaTime:   &minTs,
+		ConfigMod:   deltaAtGenesis,
 	}
 
 	t.Run(differentTxtestCase.Name, func(t *testing.T) {
@@ -1621,7 +1684,7 @@ func TestValidBatch(t *testing.T) {
 		L2SafeHead: l2B1,
 		Batch: BatchWithL1InclusionBlock{
 			L1InclusionBlock: l1B,
-			Batch: NewSpanBatch([]*SingularBatch{
+			Batch: initializedSpanBatch([]*SingularBatch{
 				{
 					ParentHash:   l2B0.Hash,
 					EpochNum:     rollup.Epoch(l2B1.L1Origin.Number),
@@ -1636,11 +1699,11 @@ func TestValidBatch(t *testing.T) {
 					Timestamp:    l2B2.Time,
 					Transactions: nil,
 				},
-			}),
+			}, uint64(0), big.NewInt(0)),
 		},
 		Expected:    BatchDrop,
 		ExpectedLog: "failed to extract L2BlockRef from execution payload",
-		DeltaTime:   &minTs,
+		ConfigMod:   deltaAtGenesis,
 	}
 
 	t.Run(invalidTxTestCase.Name, func(t *testing.T) {
diff --git a/op-node/rollup/derive/channel.go b/op-node/rollup/derive/channel.go
index 7bd67f184995..48a9f585c4aa 100644
--- a/op-node/rollup/derive/channel.go
+++ b/op-node/rollup/derive/channel.go
@@ -1,15 +1,22 @@
 package derive
 
 import (
+	"bufio"
 	"bytes"
 	"compress/zlib"
 	"fmt"
 	"io"
 
+	"github.com/andybalholm/brotli"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum/go-ethereum/rlp"
 )
 
+const (
+	ZlibCM8  = 8
+	ZlibCM15 = 15
+)
+
 // A Channel is a set of batches that are split into at least one, but possibly multiple frames.
 // Frames are allowed to be ingested out of order.
 // Each frame is ingested one by one. Once a frame with `closed` is added to the channel, the
@@ -100,6 +107,11 @@ func (ch *Channel) OpenBlockNumber() uint64 {
 	return ch.openBlock.Number
 }
 
+// HighestBlock returns the last L1 block which affect this channel
+func (ch *Channel) HighestBlock() eth.L1BlockRef {
+	return ch.highestL1InclusionBlock
+}
+
 // Size returns the current size of the channel including frame overhead.
 // Reading from the channel does not reduce the size as reading is done
 // on uncompressed data while this size is over compressed data.
@@ -146,17 +158,47 @@ func (ch *Channel) Reader() io.Reader {
 // The L1Inclusion block is also provided at creation time.
 // Warning: the batch reader can read every batch-type.
 // The caller of the batch-reader should filter the results.
-func BatchReader(r io.Reader) (func() (*BatchData, error), error) {
-	// Setup decompressor stage + RLP reader
-	zr, err := zlib.NewReader(r)
+func BatchReader(r io.Reader, maxRLPBytesPerChannel uint64, isFjord bool) (func() (*BatchData, error), error) {
+	// use buffered reader so can peek the first byte
+	bufReader := bufio.NewReader(r)
+	compressionType, err := bufReader.Peek(1)
 	if err != nil {
 		return nil, err
 	}
-	rlpReader := rlp.NewStream(zr, MaxRLPBytesPerChannel)
+
+	var zr io.Reader
+	var comprAlgo CompressionAlgo
+	// For zlib, the last 4 bits must be either 8 or 15 (both are reserved value)
+	if compressionType[0]&0x0F == ZlibCM8 || compressionType[0]&0x0F == ZlibCM15 {
+		var err error
+		zr, err = zlib.NewReader(bufReader)
+		if err != nil {
+			return nil, err
+		}
+		// If the bits equal to 1, then it is a brotli reader
+		comprAlgo = Zlib
+	} else if compressionType[0] == ChannelVersionBrotli {
+		// If before Fjord, we cannot accept brotli compressed batch
+		if !isFjord {
+			return nil, fmt.Errorf("cannot accept brotli compressed batch before Fjord")
+		}
+		// discard the first byte
+		_, err := bufReader.Discard(1)
+		if err != nil {
+			return nil, err
+		}
+		zr = brotli.NewReader(bufReader)
+		comprAlgo = Brotli
+	} else {
+		return nil, fmt.Errorf("cannot distinguish the compression algo used given type byte %v", compressionType[0])
+	}
+
+	// Setup decompressor stage + RLP reader
+	rlpReader := rlp.NewStream(zr, maxRLPBytesPerChannel)
 	// Read each batch iteratively
 	return func() (*BatchData, error) {
-		var batchData BatchData
-		if err = rlpReader.Decode(&batchData); err != nil {
+		batchData := BatchData{ComprAlgo: comprAlgo}
+		if err := rlpReader.Decode(&batchData); err != nil {
 			return nil, err
 		}
 		return &batchData, nil
diff --git a/op-node/rollup/derive/channel_bank.go b/op-node/rollup/derive/channel_bank.go
index 64a7660ba5ea..2a821bb868b1 100644
--- a/op-node/rollup/derive/channel_bank.go
+++ b/op-node/rollup/derive/channel_bank.go
@@ -3,10 +3,10 @@ package derive
 import (
 	"context"
 	"io"
+	"slices"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
-	"golang.org/x/exp/slices"
 
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
@@ -31,7 +31,7 @@ type NextFrameProvider interface {
 // ChannelBank buffers channel frames, and emits full channel data
 type ChannelBank struct {
 	log     log.Logger
-	cfg     *rollup.Config
+	spec    *rollup.ChainSpec
 	metrics Metrics
 
 	channels     map[ChannelID]*Channel // channels by ID
@@ -47,7 +47,7 @@ var _ ResettableStage = (*ChannelBank)(nil)
 func NewChannelBank(log log.Logger, cfg *rollup.Config, prev NextFrameProvider, fetcher L1Fetcher, m Metrics) *ChannelBank {
 	return &ChannelBank{
 		log:          log,
-		cfg:          cfg,
+		spec:         rollup.NewChainSpec(cfg),
 		metrics:      m,
 		channels:     make(map[ChannelID]*Channel),
 		channelQueue: make([]ChannelID, 0, 10),
@@ -67,7 +67,7 @@ func (cb *ChannelBank) prune() {
 		totalSize += ch.size
 	}
 	// prune until it is reasonable again. The high-priority channel failed to be read, so we start pruning there.
-	for totalSize > MaxChannelBankSize {
+	for totalSize > cb.spec.MaxChannelBankSize(cb.Origin().Time) {
 		id := cb.channelQueue[0]
 		ch := cb.channels[id]
 		cb.channelQueue = cb.channelQueue[1:]
@@ -98,7 +98,7 @@ func (cb *ChannelBank) IngestFrame(f Frame) {
 	}
 
 	// check if the channel is not timed out
-	if currentCh.OpenBlockNumber()+cb.cfg.ChannelTimeout < origin.Number {
+	if currentCh.OpenBlockNumber()+cb.spec.ChannelTimeout() < origin.Number {
 		log.Warn("channel is timed out, ignore frame")
 		return
 	}
@@ -125,7 +125,7 @@ func (cb *ChannelBank) Read() (data []byte, err error) {
 	// channels at the head of the queue and we want to remove them all.
 	first := cb.channelQueue[0]
 	ch := cb.channels[first]
-	timedOut := ch.OpenBlockNumber()+cb.cfg.ChannelTimeout < cb.Origin().Number
+	timedOut := ch.OpenBlockNumber()+cb.spec.ChannelTimeout() < cb.Origin().Number
 	if timedOut {
 		cb.log.Info("channel timed out", "channel", first, "frames", len(ch.inputs))
 		cb.metrics.RecordChannelTimedOut()
@@ -139,7 +139,7 @@ func (cb *ChannelBank) Read() (data []byte, err error) {
 	// Post-Canyon we read the entire channelQueue for the first ready channel. If no channel is
 	// available, we return `nil, io.EOF`.
 	// Canyon is activated when the first L1 block whose time >= CanyonTime, not on the L2 timestamp.
-	if !cb.cfg.IsCanyon(cb.Origin().Time) {
+	if !cb.spec.IsCanyon(cb.Origin().Time) {
 		return cb.tryReadChannelAtIndex(0)
 	}
 
@@ -157,7 +157,7 @@ func (cb *ChannelBank) Read() (data []byte, err error) {
 func (cb *ChannelBank) tryReadChannelAtIndex(i int) (data []byte, err error) {
 	chanID := cb.channelQueue[i]
 	ch := cb.channels[chanID]
-	timedOut := ch.OpenBlockNumber()+cb.cfg.ChannelTimeout < cb.Origin().Number
+	timedOut := ch.OpenBlockNumber()+cb.spec.ChannelTimeout() < cb.Origin().Number
 	if timedOut || !ch.IsReady() {
 		return nil, io.EOF
 	}
diff --git a/op-node/rollup/derive/channel_compressor.go b/op-node/rollup/derive/channel_compressor.go
new file mode 100644
index 000000000000..341dd13d825e
--- /dev/null
+++ b/op-node/rollup/derive/channel_compressor.go
@@ -0,0 +1,94 @@
+package derive
+
+import (
+	"bytes"
+	"compress/zlib"
+	"fmt"
+	"io"
+
+	"github.com/andybalholm/brotli"
+)
+
+const (
+	ChannelVersionBrotli byte = 0x01
+)
+
+type ChannelCompressor interface {
+	Write([]byte) (int, error)
+	Flush() error
+	Close() error
+	Reset()
+	Len() int
+	Read([]byte) (int, error)
+	GetCompressed() *bytes.Buffer
+}
+
+type CompressorWriter interface {
+	Write([]byte) (int, error)
+	Flush() error
+	Close() error
+	Reset(io.Writer)
+}
+
+type BaseChannelCompressor struct {
+	compressed *bytes.Buffer
+	CompressorWriter
+}
+
+func (bcc *BaseChannelCompressor) Len() int {
+	return bcc.compressed.Len()
+}
+
+func (bcc *BaseChannelCompressor) Read(p []byte) (int, error) {
+	return bcc.compressed.Read(p)
+}
+
+func (bcc *BaseChannelCompressor) GetCompressed() *bytes.Buffer {
+	return bcc.compressed
+}
+
+type ZlibCompressor struct {
+	BaseChannelCompressor
+}
+
+func (zc *ZlibCompressor) Reset() {
+	zc.compressed.Reset()
+	zc.CompressorWriter.Reset(zc.compressed)
+}
+
+type BrotliCompressor struct {
+	BaseChannelCompressor
+}
+
+func (bc *BrotliCompressor) Reset() {
+	bc.compressed.Reset()
+	bc.compressed.WriteByte(ChannelVersionBrotli)
+	bc.CompressorWriter.Reset(bc.compressed)
+}
+
+func NewChannelCompressor(algo CompressionAlgo) (ChannelCompressor, error) {
+	compressed := &bytes.Buffer{}
+	if algo == Zlib {
+		writer, err := zlib.NewWriterLevel(compressed, zlib.BestCompression)
+		if err != nil {
+			return nil, err
+		}
+		return &ZlibCompressor{
+			BaseChannelCompressor{
+				CompressorWriter: writer,
+				compressed:       compressed,
+			},
+		}, nil
+	} else if algo.IsBrotli() {
+		compressed.WriteByte(ChannelVersionBrotli)
+		writer := brotli.NewWriterLevel(compressed, GetBrotliLevel(algo))
+		return &BrotliCompressor{
+			BaseChannelCompressor{
+				CompressorWriter: writer,
+				compressed:       compressed,
+			},
+		}, nil
+	} else {
+		return nil, fmt.Errorf("unsupported compression algorithm: %s", algo)
+	}
+}
diff --git a/op-node/rollup/derive/channel_compressor_test.go b/op-node/rollup/derive/channel_compressor_test.go
new file mode 100644
index 000000000000..3224b89d9808
--- /dev/null
+++ b/op-node/rollup/derive/channel_compressor_test.go
@@ -0,0 +1,67 @@
+package derive
+
+import (
+	"math/rand"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+var r = rand.New(rand.NewSource(99))
+
+func randomBytes(length int) []byte {
+	b := make([]byte, length)
+	_, err := r.Read(b)
+	// Rand.Read always returns nil error
+	if err != nil {
+		panic(err)
+	}
+	return b
+}
+
+func TestChannelCompressor_NewReset(t *testing.T) {
+	testCases := []struct {
+		name              string
+		algo              CompressionAlgo
+		expectedResetSize int
+		expectErr         bool
+	}{
+		{
+			name:              "zlib",
+			algo:              Zlib,
+			expectedResetSize: 0,
+		},
+		{
+			name:              "brotli10",
+			algo:              Brotli10,
+			expectedResetSize: 1,
+		},
+		{
+			name:              "zstd",
+			algo:              CompressionAlgo("zstd"),
+			expectedResetSize: 0,
+			expectErr:         true,
+		},
+	}
+
+	for _, tc := range testCases {
+		t.Run(tc.name, func(t *testing.T) {
+			scc, err := NewChannelCompressor(tc.algo)
+			if tc.expectErr {
+				require.Error(t, err)
+				return
+			}
+			require.NoError(t, err)
+			require.Equal(t, tc.expectedResetSize, scc.Len())
+
+			_, err = scc.Write(randomBytes(10))
+			require.NoError(t, err)
+			err = scc.Flush()
+			require.NoError(t, err)
+			require.Greater(t, scc.Len(), tc.expectedResetSize)
+
+			scc.Reset()
+			require.Equal(t, tc.expectedResetSize, scc.Len())
+		})
+	}
+}
diff --git a/op-node/rollup/derive/channel_in_reader.go b/op-node/rollup/derive/channel_in_reader.go
index ccbeccce469d..f7dde867bc9d 100644
--- a/op-node/rollup/derive/channel_in_reader.go
+++ b/op-node/rollup/derive/channel_in_reader.go
@@ -17,15 +17,12 @@ import (
 // This is a pure function from the channel, but each channel (or channel fragment)
 // must be tagged with an L1 inclusion block to be passed to the batch queue.
 type ChannelInReader struct {
-	log log.Logger
-
-	cfg *rollup.Config
-
+	log         log.Logger
+	spec        *rollup.ChainSpec
+	cfg         *rollup.Config
 	nextBatchFn func() (*BatchData, error)
-
-	prev *ChannelBank
-
-	metrics Metrics
+	prev        *ChannelBank
+	metrics     Metrics
 }
 
 var _ ResettableStage = (*ChannelInReader)(nil)
@@ -33,6 +30,7 @@ var _ ResettableStage = (*ChannelInReader)(nil)
 // NewChannelInReader creates a ChannelInReader, which should be Reset(origin) before use.
 func NewChannelInReader(cfg *rollup.Config, log log.Logger, prev *ChannelBank, metrics Metrics) *ChannelInReader {
 	return &ChannelInReader{
+		spec:    rollup.NewChainSpec(cfg),
 		cfg:     cfg,
 		log:     log,
 		prev:    prev,
@@ -46,7 +44,7 @@ func (cr *ChannelInReader) Origin() eth.L1BlockRef {
 
 // TODO: Take full channel for better logging
 func (cr *ChannelInReader) WriteChannel(data []byte) error {
-	if f, err := BatchReader(bytes.NewBuffer(data)); err == nil {
+	if f, err := BatchReader(bytes.NewBuffer(data), cr.spec.MaxRLPBytesPerChannel(cr.prev.Origin().Time), cr.cfg.IsFjord(cr.prev.Origin().Time)); err == nil {
 		cr.nextBatchFn = f
 		cr.metrics.RecordChannelInputBytes(len(data))
 		return nil
@@ -89,15 +87,17 @@ func (cr *ChannelInReader) NextBatch(ctx context.Context) (Batch, error) {
 		cr.NextChannel()
 		return nil, NotEnoughData
 	}
+
+	batch := batchWithMetadata{comprAlgo: batchData.ComprAlgo}
 	switch batchData.GetBatchType() {
 	case SingularBatchType:
-		singularBatch, err := GetSingularBatch(batchData)
+		batch.Batch, err = GetSingularBatch(batchData)
 		if err != nil {
 			return nil, err
 		}
-		singularBatch.LogContext(cr.log).Debug("decoded singular batch from channel", "stage_origin", cr.Origin())
+		batch.LogContext(cr.log).Debug("decoded singular batch from channel", "stage_origin", cr.Origin())
 		cr.metrics.RecordDerivedBatches("singular")
-		return singularBatch, nil
+		return batch, nil
 	case SpanBatchType:
 		if origin := cr.Origin(); !cr.cfg.IsDelta(origin.Time) {
 			// Check hard fork activation with the L1 inclusion block time instead of the L1 origin block time.
@@ -105,13 +105,13 @@ func (cr *ChannelInReader) NextBatch(ctx context.Context) (Batch, error) {
 			// This is just for early dropping invalid batches as soon as possible.
 			return nil, NewTemporaryError(fmt.Errorf("cannot accept span batch in L1 block %s at time %d", origin, origin.Time))
 		}
-		spanBatch, err := DeriveSpanBatch(batchData, cr.cfg.BlockTime, cr.cfg.Genesis.L2Time, cr.cfg.L2ChainID)
+		batch.Batch, err = DeriveSpanBatch(batchData, cr.cfg.BlockTime, cr.cfg.Genesis.L2Time, cr.cfg.L2ChainID)
 		if err != nil {
 			return nil, err
 		}
-		spanBatch.LogContext(cr.log).Debug("decoded span batch from channel", "stage_origin", cr.Origin())
+		batch.LogContext(cr.log).Debug("decoded span batch from channel", "stage_origin", cr.Origin())
 		cr.metrics.RecordDerivedBatches("span")
-		return spanBatch, nil
+		return batch, nil
 	default:
 		// error is bubbled up to user, but pipeline can skip the batch and continue after.
 		return nil, NewTemporaryError(fmt.Errorf("unrecognized batch type: %d", batchData.GetBatchType()))
diff --git a/op-node/rollup/derive/channel_out.go b/op-node/rollup/derive/channel_out.go
index 52fd2fb36da0..2142796bab0e 100644
--- a/op-node/rollup/derive/channel_out.go
+++ b/op-node/rollup/derive/channel_out.go
@@ -13,10 +13,13 @@ import (
 	"github.com/ethereum/go-ethereum/rlp"
 )
 
-var ErrMaxFrameSizeTooSmall = errors.New("maxSize is too small to fit the fixed frame overhead")
-var ErrNotDepositTx = errors.New("first transaction in block is not a deposit tx")
-var ErrTooManyRLPBytes = errors.New("batch would cause RLP bytes to go over limit")
-var ErrChannelOutAlreadyClosed = errors.New("channel-out already closed")
+var (
+	ErrMaxFrameSizeTooSmall    = errors.New("maxSize is too small to fit the fixed frame overhead")
+	ErrNotDepositTx            = errors.New("first transaction in block is not a deposit tx")
+	ErrTooManyRLPBytes         = errors.New("batch would cause RLP bytes to go over limit")
+	ErrChannelOutAlreadyClosed = errors.New("channel-out already closed")
+	ErrCompressorFull          = errors.New("compressor is full")
+)
 
 // FrameV0OverHeadSize is the absolute minimum size of a frame.
 // This is the fixed overhead frame size, calculated as specified
@@ -25,11 +28,9 @@ var ErrChannelOutAlreadyClosed = errors.New("channel-out already closed")
 // [Frame Format]: https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/derivation.md#frame-format
 const FrameV0OverHeadSize = 23
 
-var CompressorFullErr = errors.New("compressor is full")
-
 type Compressor interface {
 	// Writer is used to write uncompressed data which will be compressed. Should return
-	// CompressorFullErr if the compressor is full and no more data should be written.
+	// ErrCompressorFull if the compressor is full and no more data should be written.
 	io.Writer
 	// Closer Close function should be called before reading any data.
 	io.Closer
@@ -43,17 +44,17 @@ type Compressor interface {
 	// Flush flushes any uncompressed data to the compression buffer. This will result in a
 	// non-optimal compression ratio.
 	Flush() error
-	// FullErr returns CompressorFullErr if the compressor is known to be full. Note that
+	// FullErr returns ErrCompressorFull if the compressor is known to be full. Note that
 	// calls to Write will fail if an error is returned from this method, but calls to Write
-	// can still return CompressorFullErr even if this does not.
+	// can still return ErrCompressorFull even if this does not.
 	FullErr() error
 }
 
 type ChannelOut interface {
 	ID() ChannelID
 	Reset() error
-	AddBlock(*rollup.Config, *types.Block) (uint64, error)
-	AddSingularBatch(*SingularBatch, uint64) (uint64, error)
+	AddBlock(*rollup.Config, *types.Block) error
+	AddSingularBatch(*SingularBatch, uint64) error
 	InputBytes() int
 	ReadyBytes() int
 	Flush() error
@@ -62,17 +63,6 @@ type ChannelOut interface {
 	OutputFrame(*bytes.Buffer, uint64) (uint16, error)
 }
 
-func NewChannelOut(batchType uint, compress Compressor, spanBatchBuilder *SpanBatchBuilder) (ChannelOut, error) {
-	switch batchType {
-	case SingularBatchType:
-		return NewSingularChannelOut(compress)
-	case SpanBatchType:
-		return NewSpanChannelOut(compress, spanBatchBuilder)
-	default:
-		return nil, fmt.Errorf("unrecognized batch type: %d", batchType)
-	}
-}
-
 type SingularChannelOut struct {
 	id ChannelID
 	// Frame ID of the next frame to emit. Increment after emitting
@@ -118,14 +108,14 @@ func (co *SingularChannelOut) Reset() error {
 // and an error if there is a problem adding the block. The only sentinel error
 // that it returns is ErrTooManyRLPBytes. If this error is returned, the channel
 // should be closed and a new one should be made.
-func (co *SingularChannelOut) AddBlock(rollupCfg *rollup.Config, block *types.Block) (uint64, error) {
+func (co *SingularChannelOut) AddBlock(rollupCfg *rollup.Config, block *types.Block) error {
 	if co.closed {
-		return 0, ErrChannelOutAlreadyClosed
+		return ErrChannelOutAlreadyClosed
 	}
 
 	batch, l1Info, err := BlockToSingularBatch(rollupCfg, block)
 	if err != nil {
-		return 0, err
+		return err
 	}
 	return co.AddSingularBatch(batch, l1Info.SequenceNumber)
 }
@@ -138,26 +128,26 @@ func (co *SingularChannelOut) AddBlock(rollupCfg *rollup.Config, block *types.Bl
 // AddSingularBatch should be used together with BlockToBatch if you need to access the
 // BatchData before adding a block to the channel. It isn't possible to access
 // the batch data with AddBlock.
-func (co *SingularChannelOut) AddSingularBatch(batch *SingularBatch, _ uint64) (uint64, error) {
+func (co *SingularChannelOut) AddSingularBatch(batch *SingularBatch, _ uint64) error {
 	if co.closed {
-		return 0, ErrChannelOutAlreadyClosed
+		return ErrChannelOutAlreadyClosed
 	}
 
 	// We encode to a temporary buffer to determine the encoded length to
 	// ensure that the total size of all RLP elements is less than or equal to MAX_RLP_BYTES_PER_CHANNEL
 	var buf bytes.Buffer
 	if err := rlp.Encode(&buf, NewBatchData(batch)); err != nil {
-		return 0, err
+		return err
 	}
-	if co.rlpLength+buf.Len() > MaxRLPBytesPerChannel {
-		return 0, fmt.Errorf("could not add %d bytes to channel of %d bytes, max is %d. err: %w",
-			buf.Len(), co.rlpLength, MaxRLPBytesPerChannel, ErrTooManyRLPBytes)
+	if co.rlpLength+buf.Len() > rollup.SafeMaxRLPBytesPerChannel {
+		return fmt.Errorf("could not add %d bytes to channel of %d bytes, max is %d. err: %w",
+			buf.Len(), co.rlpLength, rollup.SafeMaxRLPBytesPerChannel, ErrTooManyRLPBytes)
 	}
 	co.rlpLength += buf.Len()
 
 	// avoid using io.Copy here, because we need all or nothing
-	written, err := co.compress.Write(buf.Bytes())
-	return uint64(written), err
+	_, err := co.compress.Write(buf.Bytes())
+	return err
 }
 
 // InputBytes returns the total amount of RLP-encoded input bytes.
diff --git a/op-node/rollup/derive/channel_out_test.go b/op-node/rollup/derive/channel_out_test.go
index 7e6bc04cb06c..9c5d038c9470 100644
--- a/op-node/rollup/derive/channel_out_test.go
+++ b/op-node/rollup/derive/channel_out_test.go
@@ -15,9 +15,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 )
 
-var (
-	rollupCfg rollup.Config
-)
+var rollupCfg rollup.Config
 
 // basic implementation of the Compressor interface that does no compression
 type nonCompressor struct {
@@ -36,59 +34,94 @@ func (s *nonCompressor) FullErr() error {
 	return nil
 }
 
-func TestChannelOutAddBlock(t *testing.T) {
-	cout, err := NewChannelOut(SingularBatchType, &nonCompressor{}, nil)
-	require.NoError(t, err)
+// channelTypes allows tests to run against different channel types
+var channelTypes = []struct {
+	ChannelOut func(t *testing.T) ChannelOut
+	Name       string
+}{
+	{
+		Name: "Singular",
+		ChannelOut: func(t *testing.T) ChannelOut {
+			cout, err := NewSingularChannelOut(&nonCompressor{})
+			require.NoError(t, err)
+			return cout
+		},
+	},
+	{
+		Name: "Span",
+		ChannelOut: func(t *testing.T) ChannelOut {
+			cout, err := NewSpanChannelOut(0, big.NewInt(0), 128_000, Zlib)
+			require.NoError(t, err)
+			return cout
+		},
+	},
+}
 
-	t.Run("returns err if first tx is not an l1info tx", func(t *testing.T) {
-		header := &types.Header{Number: big.NewInt(1), Difficulty: big.NewInt(100)}
-		block := types.NewBlockWithHeader(header).WithBody(
-			[]*types.Transaction{
-				types.NewTx(&types.DynamicFeeTx{}),
-			},
-			nil,
-		)
-		_, err := cout.AddBlock(&rollupCfg, block)
-		require.Error(t, err)
-		require.Equal(t, ErrNotDepositTx, err)
-	})
+func TestChannelOutAddBlock(t *testing.T) {
+	for _, tcase := range channelTypes {
+		t.Run(tcase.Name, func(t *testing.T) {
+			cout := tcase.ChannelOut(t)
+			header := &types.Header{Number: big.NewInt(1), Difficulty: big.NewInt(100)}
+			block := types.NewBlockWithHeader(header).WithBody(
+				[]*types.Transaction{
+					types.NewTx(&types.DynamicFeeTx{}),
+				},
+				nil,
+			)
+			err := cout.AddBlock(&rollupCfg, block)
+			require.Error(t, err)
+			require.Equal(t, ErrNotDepositTx, err)
+		})
+	}
 }
 
 // TestOutputFrameSmallMaxSize tests that calling [OutputFrame] with a small
-// max size that is below the fixed frame size overhead of 23, will return
-// an error.
+// max size that is below the fixed frame size overhead of FrameV0OverHeadSize (23),
+// will return an error.
 func TestOutputFrameSmallMaxSize(t *testing.T) {
-	cout, err := NewChannelOut(SingularBatchType, &nonCompressor{}, nil)
-	require.NoError(t, err)
-
-	// Call OutputFrame with the range of small max size values that err
-	var w bytes.Buffer
-	for i := 0; i < 23; i++ {
-		fid, err := cout.OutputFrame(&w, uint64(i))
-		require.ErrorIs(t, err, ErrMaxFrameSizeTooSmall)
-		require.Zero(t, fid)
+	for _, tcase := range channelTypes {
+		t.Run(tcase.Name, func(t *testing.T) {
+			cout := tcase.ChannelOut(t)
+			// Call OutputFrame with the range of small max size values that err
+			var w bytes.Buffer
+			for i := 0; i < FrameV0OverHeadSize; i++ {
+				fid, err := cout.OutputFrame(&w, uint64(i))
+				require.ErrorIs(t, err, ErrMaxFrameSizeTooSmall)
+				require.Zero(t, fid)
+			}
+		})
 	}
 }
 
 func TestOutputFrameNoEmptyLastFrame(t *testing.T) {
-	cout, err := NewChannelOut(SingularBatchType, &nonCompressor{}, nil)
-	require.NoError(t, err)
+	for _, tcase := range channelTypes {
+		t.Run(tcase.Name, func(t *testing.T) {
+			cout := tcase.ChannelOut(t)
 
-	rng := rand.New(rand.NewSource(0x543331))
-	chainID := big.NewInt(rng.Int63n(1000))
-	txCount := 1
-	singularBatch := RandomSingularBatch(rng, txCount, chainID)
+			rng := rand.New(rand.NewSource(0x543331))
+			chainID := big.NewInt(0)
+			txCount := 1
+			singularBatch := RandomSingularBatch(rng, txCount, chainID)
 
-	written, err := cout.AddSingularBatch(singularBatch, 0)
-	require.NoError(t, err)
+			err := cout.AddSingularBatch(singularBatch, 0)
+			var written uint64
+			require.NoError(t, err)
 
-	require.NoError(t, cout.Close())
+			require.NoError(t, cout.Close())
 
-	var buf bytes.Buffer
-	// Output a frame which needs exactly `written` bytes. This frame is expected to be the last frame.
-	_, err = cout.OutputFrame(&buf, written+FrameV0OverHeadSize)
-	require.ErrorIs(t, err, io.EOF)
+			// depending on the channel type, determine the size of the written data
+			if span, ok := cout.(*SpanChannelOut); ok {
+				written = uint64(span.compressor.Len())
+			} else if singular, ok := cout.(*SingularChannelOut); ok {
+				written = uint64(singular.compress.Len())
+			}
 
+			var buf bytes.Buffer
+			// Output a frame which needs exactly `written` bytes. This frame is expected to be the last frame.
+			_, err = cout.OutputFrame(&buf, written+FrameV0OverHeadSize)
+			require.ErrorIs(t, err, io.EOF)
+		})
+	}
 }
 
 // TestRLPByteLimit ensures that stream encoder is properly limiting the length.
@@ -184,3 +217,110 @@ func TestBlockToBatchValidity(t *testing.T) {
 	_, _, err := BlockToSingularBatch(&rollupCfg, block)
 	require.ErrorContains(t, err, "has no transactions")
 }
+
+func SpanChannelAndBatches(t *testing.T, target uint64, len int, algo CompressionAlgo) (*SpanChannelOut, []*SingularBatch) {
+	// target is larger than one batch, but smaller than two batches
+	rng := rand.New(rand.NewSource(0x543331))
+	chainID := big.NewInt(rng.Int63n(1000))
+	txCount := 1
+	cout, err := NewSpanChannelOut(0, chainID, target, algo)
+	require.NoError(t, err)
+	batches := make([]*SingularBatch, len)
+	// adding the first batch should not cause an error
+	for i := 0; i < len; i++ {
+		singularBatch := RandomSingularBatch(rng, txCount, chainID)
+		batches[i] = singularBatch
+	}
+
+	return cout, batches
+}
+
+func TestSpanChannelOut(t *testing.T) {
+	tests := []struct {
+		name string
+		f    func(t *testing.T, algo CompressionAlgo)
+	}{
+		{"SpanChannelOutCompressionOnlyOneBatch", SpanChannelOutCompressionOnlyOneBatch},
+		{"SpanChannelOutCompressionUndo", SpanChannelOutCompressionUndo},
+		{"SpanChannelOutClose", SpanChannelOutClose},
+	}
+	for _, test := range tests {
+		test := test
+		for _, algo := range CompressionAlgos {
+			t.Run(test.name+"_"+algo.String(), func(t *testing.T) {
+				test.f(t, algo)
+			})
+		}
+	}
+}
+
+// TestSpanChannelOutCompressionOnlyOneBatch tests that the SpanChannelOut compression works as expected when there is only one batch
+// and it is larger than the target size. The single batch should be compressed, and the channel should now be full
+func SpanChannelOutCompressionOnlyOneBatch(t *testing.T, algo CompressionAlgo) {
+	cout, singularBatches := SpanChannelAndBatches(t, 300, 2, algo)
+
+	err := cout.AddSingularBatch(singularBatches[0], 0)
+	// confirm compression was not skipped
+	require.Greater(t, cout.compressor.Len(), 0)
+	require.NoError(t, err)
+
+	// confirm the channel is full
+	require.ErrorIs(t, cout.FullErr(), ErrCompressorFull)
+
+	// confirm adding another batch would cause the same full error
+	err = cout.AddSingularBatch(singularBatches[1], 0)
+	require.ErrorIs(t, err, ErrCompressorFull)
+}
+
+// TestSpanChannelOutCompressionUndo tests that the SpanChannelOut compression rejects a batch that would cause the channel to be overfull
+func SpanChannelOutCompressionUndo(t *testing.T, algo CompressionAlgo) {
+	// target is larger than one batch, but smaller than two batches
+	cout, singularBatches := SpanChannelAndBatches(t, 750, 2, algo)
+
+	err := cout.AddSingularBatch(singularBatches[0], 0)
+	require.NoError(t, err)
+	// confirm that the first compression was skipped
+	if algo == Zlib {
+		require.Equal(t, 0, cout.compressor.Len())
+	} else {
+		require.Equal(t, 1, cout.compressor.Len()) // 1 because of brotli channel version
+	}
+	// record the RLP length to confirm it doesn't change when adding a rejected batch
+	rlp1 := cout.activeRLP().Len()
+
+	err = cout.AddSingularBatch(singularBatches[1], 0)
+	require.ErrorIs(t, err, ErrCompressorFull)
+	// confirm that the second compression was not skipped
+	require.Greater(t, cout.compressor.Len(), 0)
+
+	// confirm that the second rlp is tht same size as the first (because the second batch was not added)
+	require.Equal(t, rlp1, cout.activeRLP().Len())
+}
+
+// TestSpanChannelOutClose tests that the SpanChannelOut compression works as expected when the channel is closed.
+// it should compress the batch even if it is smaller than the target size because the channel is closing
+func SpanChannelOutClose(t *testing.T, algo CompressionAlgo) {
+	target := uint64(600)
+	cout, singularBatches := SpanChannelAndBatches(t, target, 1, algo)
+
+	err := cout.AddSingularBatch(singularBatches[0], 0)
+	require.NoError(t, err)
+	// confirm no compression has happened yet
+
+	if algo == Zlib {
+		require.Equal(t, 0, cout.compressor.Len())
+	} else {
+		require.Equal(t, 1, cout.compressor.Len()) // 1 because of brotli channel version
+	}
+
+	// confirm the RLP length is less than the target
+	rlpLen := cout.activeRLP().Len()
+	require.Less(t, uint64(rlpLen), target)
+
+	// close the channel
+	require.NoError(t, cout.Close())
+
+	// confirm that the only batch was compressed, and that the RLP did not change
+	require.Greater(t, cout.compressor.Len(), 0)
+	require.Equal(t, rlpLen, cout.activeRLP().Len())
+}
diff --git a/op-node/rollup/derive/channel_test.go b/op-node/rollup/derive/channel_test.go
index fdd6e4065e25..e853d622aa04 100644
--- a/op-node/rollup/derive/channel_test.go
+++ b/op-node/rollup/derive/channel_test.go
@@ -1,8 +1,14 @@
 package derive
 
 import (
+	"bytes"
+	"compress/zlib"
+	"math/big"
+	"math/rand"
 	"testing"
 
+	"github.com/DataDog/zstd"
+	"github.com/andybalholm/brotli"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/stretchr/testify/require"
 )
@@ -49,7 +55,8 @@ func TestFrameValidity(t *testing.T) {
 			name: "double close",
 			frames: []Frame{
 				{ID: id, FrameNumber: 2, IsLast: true, Data: []byte("four")},
-				{ID: id, FrameNumber: 1, IsLast: true}},
+				{ID: id, FrameNumber: 1, IsLast: true},
+			},
 			shouldErr: []bool{false, true},
 			sizes:     []uint64{204, 204},
 		},
@@ -57,7 +64,8 @@ func TestFrameValidity(t *testing.T) {
 			name: "duplicate frame",
 			frames: []Frame{
 				{ID: id, FrameNumber: 2, Data: []byte("four")},
-				{ID: id, FrameNumber: 2, Data: []byte("seven__")}},
+				{ID: id, FrameNumber: 2, Data: []byte("seven__")},
+			},
 			shouldErr: []bool{false, true},
 			sizes:     []uint64{204, 204},
 		},
@@ -65,7 +73,8 @@ func TestFrameValidity(t *testing.T) {
 			name: "duplicate closing frames",
 			frames: []Frame{
 				{ID: id, FrameNumber: 2, IsLast: true, Data: []byte("four")},
-				{ID: id, FrameNumber: 2, IsLast: true, Data: []byte("seven__")}},
+				{ID: id, FrameNumber: 2, IsLast: true, Data: []byte("seven__")},
+			},
 			shouldErr: []bool{false, true},
 			sizes:     []uint64{204, 204},
 		},
@@ -73,7 +82,8 @@ func TestFrameValidity(t *testing.T) {
 			name: "frame past closing",
 			frames: []Frame{
 				{ID: id, FrameNumber: 2, IsLast: true, Data: []byte("four")},
-				{ID: id, FrameNumber: 10, Data: []byte("seven__")}},
+				{ID: id, FrameNumber: 10, Data: []byte("seven__")},
+			},
 			shouldErr: []bool{false, true},
 			sizes:     []uint64{204, 204},
 		},
@@ -81,7 +91,8 @@ func TestFrameValidity(t *testing.T) {
 			name: "prune after close frame",
 			frames: []Frame{
 				{ID: id, FrameNumber: 10, IsLast: false, Data: []byte("seven__")},
-				{ID: id, FrameNumber: 2, IsLast: true, Data: []byte("four")}},
+				{ID: id, FrameNumber: 2, IsLast: true, Data: []byte("four")},
+			},
 			shouldErr: []bool{false, false},
 			sizes:     []uint64{207, 204},
 		},
@@ -89,7 +100,8 @@ func TestFrameValidity(t *testing.T) {
 			name: "multiple valid frames",
 			frames: []Frame{
 				{ID: id, FrameNumber: 10, Data: []byte("seven__")},
-				{ID: id, FrameNumber: 2, Data: []byte("four")}},
+				{ID: id, FrameNumber: 2, Data: []byte("four")},
+			},
 			shouldErr: []bool{false, false},
 			sizes:     []uint64{207, 411},
 		},
@@ -99,3 +111,127 @@ func TestFrameValidity(t *testing.T) {
 		t.Run(tc.name, tc.Run)
 	}
 }
+
+func TestBatchReader(t *testing.T) {
+	rng := rand.New(rand.NewSource(0x543331))
+	singularBatch := RandomSingularBatch(rng, 20, big.NewInt(333))
+	batchDataInput := NewBatchData(singularBatch)
+
+	encodedBatch := new(bytes.Buffer)
+	err := batchDataInput.EncodeRLP(encodedBatch)
+	require.NoError(t, err)
+
+	const Zstd CompressionAlgo = "zstd" // invalid algo
+	compressor := func(ca CompressionAlgo) func(buf *bytes.Buffer, t *testing.T) {
+		switch {
+		case ca == Zlib:
+			return func(buf *bytes.Buffer, t *testing.T) {
+				writer := zlib.NewWriter(buf)
+				_, err := writer.Write(encodedBatch.Bytes())
+				require.NoError(t, err)
+				require.NoError(t, writer.Close())
+			}
+		case ca.IsBrotli():
+			return func(buf *bytes.Buffer, t *testing.T) {
+				buf.WriteByte(ChannelVersionBrotli)
+				lvl := GetBrotliLevel(ca)
+				writer := brotli.NewWriterLevel(buf, lvl)
+				_, err := writer.Write(encodedBatch.Bytes())
+				require.NoError(t, err)
+				require.NoError(t, writer.Close())
+			}
+		case ca == Zstd: // invalid algo
+			return func(buf *bytes.Buffer, t *testing.T) {
+				buf.WriteByte(0x02) // invalid channel version byte
+				writer := zstd.NewWriter(buf)
+				_, err := writer.Write(encodedBatch.Bytes())
+				require.NoError(t, err)
+				require.NoError(t, writer.Close())
+			}
+		default:
+			panic("unexpected test algo")
+		}
+	}
+
+	testCases := []struct {
+		name      string
+		algo      CompressionAlgo
+		isFjord   bool
+		expectErr bool
+	}{
+		{
+			name:    "zlib-post-fjord",
+			algo:    Zlib,
+			isFjord: true,
+		},
+		{
+			name:    "zlib-pre-fjord",
+			algo:    Zlib,
+			isFjord: false,
+		},
+		{
+			name:    "brotli-post-fjord",
+			algo:    Brotli,
+			isFjord: true,
+		},
+		{
+			name:      "brotli-pre-fjord",
+			algo:      Brotli,
+			isFjord:   false,
+			expectErr: true, // expect an error because brotli is not supported before Fjord
+		},
+		{
+			name:    "brotli9-post-fjord",
+			algo:    Brotli9,
+			isFjord: true,
+		},
+		{
+			name:      "brotli9-pre-fjord",
+			algo:      Brotli9,
+			isFjord:   false,
+			expectErr: true, // expect an error because brotli is not supported before Fjord
+		},
+		{
+			name:    "brotli10-post-fjord",
+			algo:    Brotli10,
+			isFjord: true,
+		},
+		{
+			name:    "brotli11-post-fjord",
+			algo:    Brotli11,
+			isFjord: true,
+		},
+		{
+			name:      "zstd-post-fjord",
+			algo:      Zstd,
+			expectErr: true,
+			isFjord:   true,
+		},
+	}
+
+	for _, tc := range testCases {
+		compressed := new(bytes.Buffer)
+		tc := tc
+		t.Run(tc.name, func(t *testing.T) {
+			compressor(tc.algo)(compressed, t)
+			reader, err := BatchReader(bytes.NewReader(compressed.Bytes()), 120000, tc.isFjord)
+			if tc.expectErr {
+				require.Error(t, err)
+				return
+			}
+			require.NoError(t, err)
+
+			// read the batch data
+			batchData, err := reader()
+			require.NoError(t, err)
+			require.NotNil(t, batchData)
+			if tc.algo.IsBrotli() {
+				// special case because reader doesn't decode level
+				batchDataInput.ComprAlgo = Brotli
+			} else {
+				batchDataInput.ComprAlgo = tc.algo
+			}
+			require.Equal(t, batchDataInput, batchData)
+		})
+	}
+}
diff --git a/op-node/rollup/derive/data_source.go b/op-node/rollup/derive/data_source.go
index 2a1dbd7c00de..6cb43a94165f 100644
--- a/op-node/rollup/derive/data_source.go
+++ b/op-node/rollup/derive/data_source.go
@@ -28,7 +28,7 @@ type L1BlobsFetcher interface {
 
 type PlasmaInputFetcher interface {
 	// GetInput fetches the input for the given commitment at the given block number from the DA storage service.
-	GetInput(ctx context.Context, l1 plasma.L1Fetcher, c plasma.Keccak256Commitment, blockId eth.BlockID) (eth.Data, error)
+	GetInput(ctx context.Context, l1 plasma.L1Fetcher, c plasma.CommitmentData, blockId eth.BlockID) (eth.Data, error)
 	// AdvanceL1Origin advances the L1 origin to the given block number, syncing the DA challenge events.
 	AdvanceL1Origin(ctx context.Context, l1 plasma.L1Fetcher, blockId eth.BlockID) error
 	// Reset the challenge origin in case of L1 reorg
@@ -55,7 +55,7 @@ func NewDataSourceFactory(log log.Logger, cfg *rollup.Config, fetcher L1Fetcher,
 	config := DataSourceConfig{
 		l1Signer:          cfg.L1Signer(),
 		batchInboxAddress: cfg.BatchInboxAddress,
-		plasmaEnabled:     cfg.UsePlasma,
+		plasmaEnabled:     cfg.PlasmaEnabled(),
 	}
 	return &DataSourceFactory{
 		log:           log,
diff --git a/op-node/rollup/derive/ecotone_upgrade_transactions.go b/op-node/rollup/derive/ecotone_upgrade_transactions.go
index 7b0d885025af..e2fed646dc84 100644
--- a/op-node/rollup/derive/ecotone_upgrade_transactions.go
+++ b/op-node/rollup/derive/ecotone_upgrade_transactions.go
@@ -10,7 +10,7 @@ import (
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/crypto"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum-optimism/optimism/op-service/solabi"
 )
 
diff --git a/op-node/rollup/derive/ecotone_upgrade_transactions_test.go b/op-node/rollup/derive/ecotone_upgrade_transactions_test.go
index 13f8f237bed2..e75e56578e4e 100644
--- a/op-node/rollup/derive/ecotone_upgrade_transactions_test.go
+++ b/op-node/rollup/derive/ecotone_upgrade_transactions_test.go
@@ -9,8 +9,6 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/core/types"
-
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 )
 
 func TestSourcesMatchSpec(t *testing.T) {
@@ -71,14 +69,14 @@ func TestEcotoneNetworkTransactions(t *testing.T) {
 	require.Equal(t, deployL1BlockSource.SourceHash(), deployL1Block.SourceHash())
 	require.Nil(t, deployL1Block.To())
 	require.Equal(t, uint64(375_000), deployL1Block.Gas())
-	require.Equal(t, bindings.L1BlockMetaData.Bin, hexutil.Bytes(deployL1Block.Data()).String())
+	require.Equal(t, l1BlockDeploymentBytecode, deployL1Block.Data())
 
 	deployGasPriceOracleSender, deployGasPriceOracle := toDepositTxn(t, upgradeTxns[1])
 	require.Equal(t, deployGasPriceOracleSender, common.HexToAddress("0x4210000000000000000000000000000000000001"))
 	require.Equal(t, deployGasPriceOracleSource.SourceHash(), deployGasPriceOracle.SourceHash())
 	require.Nil(t, deployGasPriceOracle.To())
 	require.Equal(t, uint64(1_000_000), deployGasPriceOracle.Gas())
-	require.Equal(t, bindings.GasPriceOracleMetaData.Bin, hexutil.Bytes(deployGasPriceOracle.Data()).String())
+	require.Equal(t, gasPriceOracleDeploymentBytecode, deployGasPriceOracle.Data())
 
 	updateL1BlockProxySender, updateL1BlockProxy := toDepositTxn(t, upgradeTxns[2])
 	require.Equal(t, updateL1BlockProxySender, common.Address{})
diff --git a/op-node/rollup/derive/engine_consolidate_test.go b/op-node/rollup/derive/engine_consolidate_test.go
index f67c331d36f7..57b7970d3204 100644
--- a/op-node/rollup/derive/engine_consolidate_test.go
+++ b/op-node/rollup/derive/engine_consolidate_test.go
@@ -107,7 +107,7 @@ func mismatchedParentHashArgs() args {
 	return args
 }
 
-func createMistmatchedPrevRandao() args {
+func createMismatchedPrevRandao() args {
 	args := ecotoneArgs()
 	args.attrs.PrevRandao = eth.Bytes32(common.HexToHash("0xabc"))
 	return args
@@ -126,7 +126,7 @@ func createNilGasLimit() args {
 	return args
 }
 
-func createMistmatchedTimestamp() args {
+func createMismatchedTimestamp() args {
 	args := ecotoneArgs()
 	val := eth.Uint64Quantity(2000)
 	args.attrs.Timestamp = val
@@ -178,7 +178,7 @@ func TestAttributesMatch(t *testing.T) {
 		},
 		{
 			shouldMatch: false,
-			args:        createMistmatchedPrevRandao(),
+			args:        createMismatchedPrevRandao(),
 		},
 		{
 			shouldMatch: false,
@@ -190,7 +190,7 @@ func TestAttributesMatch(t *testing.T) {
 		},
 		{
 			shouldMatch: false,
-			args:        createMistmatchedTimestamp(),
+			args:        createMismatchedTimestamp(),
 		},
 	}
 
diff --git a/op-node/rollup/derive/engine_controller.go b/op-node/rollup/derive/engine_controller.go
index d9103fcd5cbc..c9f802c467b1 100644
--- a/op-node/rollup/derive/engine_controller.go
+++ b/op-node/rollup/derive/engine_controller.go
@@ -50,6 +50,7 @@ type EngineController struct {
 	metrics    Metrics
 	syncMode   sync.Mode
 	syncStatus syncStatusEnum
+	chainSpec  *rollup.ChainSpec
 	rollupCfg  *rollup.Config
 	elStart    time.Time
 	clock      clock.Clock
@@ -85,6 +86,7 @@ func NewEngineController(engine ExecEngine, log log.Logger, metrics Metrics, rol
 		engine:     engine,
 		log:        log,
 		metrics:    metrics,
+		chainSpec:  rollup.NewChainSpec(rollupCfg),
 		rollupCfg:  rollupCfg,
 		syncMode:   syncMode,
 		syncStatus: syncStatus,
@@ -149,6 +151,7 @@ func (e *EngineController) SetUnsafeHead(r eth.L2BlockRef) {
 	e.metrics.RecordL2Ref("l2_unsafe", r)
 	e.unsafeHead = r
 	e.needFCUCall = true
+	e.chainSpec.CheckForkActivation(e.log, r)
 }
 
 // SetBackupUnsafeL2Head implements LocalEngineControl.
@@ -327,8 +330,8 @@ func (e *EngineController) InsertUnsafePayload(ctx context.Context, envelope *et
 	// Check if there is a finalized head once when doing EL sync. If so, transition to CL sync
 	if e.syncStatus == syncStatusWillStartEL {
 		b, err := e.engine.L2BlockRefByLabel(ctx, eth.Finalized)
-		isTransitionBlock := e.rollupCfg.Genesis.L2.Number != 0 && b.Hash == e.rollupCfg.Genesis.L2.Hash
-		if errors.Is(err, ethereum.NotFound) || isTransitionBlock {
+		rollupGenesisIsFinalized := b.Hash == e.rollupCfg.Genesis.L2.Hash
+		if errors.Is(err, ethereum.NotFound) || rollupGenesisIsFinalized {
 			e.syncStatus = syncStatusStartedEL
 			e.log.Info("Starting EL sync")
 			e.elStart = e.clock.Now()
diff --git a/op-node/rollup/derive/engine_queue.go b/op-node/rollup/derive/engine_queue.go
index 4dd4bebec49a..848b3778472d 100644
--- a/op-node/rollup/derive/engine_queue.go
+++ b/op-node/rollup/derive/engine_queue.go
@@ -141,8 +141,8 @@ const finalityDelay = 64
 func calcFinalityLookback(cfg *rollup.Config) uint64 {
 	// in plasma mode the longest finality lookback is a commitment is challenged on the last block of
 	// the challenge window in which case it will be both challenge + resolve window.
-	if cfg.UsePlasma {
-		lkb := cfg.DAChallengeWindow + cfg.DAResolveWindow + 1
+	if cfg.PlasmaEnabled() {
+		lkb := cfg.PlasmaConfig.DAChallengeWindow + cfg.PlasmaConfig.DAResolveWindow + 1
 		// in the case only if the plasma windows are longer than the default finality lookback
 		if lkb > finalityLookback {
 			return lkb
@@ -316,7 +316,7 @@ func (eq *EngineQueue) Step(ctx context.Context) error {
 	if eq.safeAttributes != nil {
 		return eq.tryNextSafeAttributes(ctx)
 	}
-	outOfData := false
+
 	newOrigin := eq.prev.Origin()
 	// Check if the L2 unsafe head origin is consistent with the new origin
 	if err := eq.verifyNewL1Origin(ctx, newOrigin); err != nil {
@@ -332,7 +332,7 @@ func (eq *EngineQueue) Step(ctx context.Context) error {
 		return err
 	}
 	if next, err := eq.prev.NextAttributes(ctx, eq.ec.PendingSafeL2Head()); err == io.EOF {
-		outOfData = true
+		return io.EOF
 	} else if err != nil {
 		return err
 	} else {
@@ -341,12 +341,6 @@ func (eq *EngineQueue) Step(ctx context.Context) error {
 			"pending_safe_head", eq.ec.PendingSafeL2Head(), "next", next)
 		return NotEnoughData
 	}
-
-	if outOfData {
-		return io.EOF
-	} else {
-		return nil
-	}
 }
 
 // verifyNewL1Origin checks that the L2 unsafe head still has a L1 origin that is on the canonical chain.
@@ -496,7 +490,7 @@ func (eq *EngineQueue) tryNextUnsafePayload(ctx context.Context) error {
 	first := firstEnvelope.ExecutionPayload
 
 	if uint64(first.BlockNumber) <= eq.ec.SafeL2Head().Number {
-		eq.log.Info("skipping unsafe payload, since it is older than safe head", "safe", eq.ec.SafeL2Head().ID(), "unsafe", first.ID(), "payload", first.ID())
+		eq.log.Info("skipping unsafe payload, since it is older than safe head", "safe", eq.ec.SafeL2Head().ID(), "unsafe", eq.ec.UnsafeL2Head().ID(), "unsafe_payload", first.ID())
 		eq.unsafePayloads.Pop()
 		return nil
 	}
@@ -509,7 +503,7 @@ func (eq *EngineQueue) tryNextUnsafePayload(ctx context.Context) error {
 	// Ensure that the unsafe payload builds upon the current unsafe head
 	if first.ParentHash != eq.ec.UnsafeL2Head().Hash {
 		if uint64(first.BlockNumber) == eq.ec.UnsafeL2Head().Number+1 {
-			eq.log.Info("skipping unsafe payload, since it does not build onto the existing unsafe chain", "safe", eq.ec.SafeL2Head().ID(), "unsafe", first.ID(), "payload", first.ID())
+			eq.log.Info("skipping unsafe payload, since it does not build onto the existing unsafe chain", "safe", eq.ec.SafeL2Head().ID(), "unsafe", eq.ec.UnsafeL2Head().ID(), "unsafe_payload", first.ID())
 			eq.unsafePayloads.Pop()
 		}
 		return io.EOF // time to go to next stage if we cannot process the first unsafe payload
diff --git a/op-node/rollup/derive/engine_queue_test.go b/op-node/rollup/derive/engine_queue_test.go
index 190e86140efb..884ff5ad510b 100644
--- a/op-node/rollup/derive/engine_queue_test.go
+++ b/op-node/rollup/derive/engine_queue_test.go
@@ -9,6 +9,7 @@ import (
 	"testing"
 
 	"github.com/ethereum-optimism/optimism/op-node/node/safedb"
+	plasma "github.com/ethereum-optimism/optimism/op-plasma"
 	"github.com/holiman/uint256"
 	"github.com/stretchr/testify/require"
 
@@ -1250,16 +1251,18 @@ func TestPlasmaFinalityData(t *testing.T) {
 				GasLimit:    20_000_000,
 			},
 		},
-		BlockTime:         1,
-		SeqWindowSize:     2,
-		UsePlasma:         false,
+		BlockTime:     1,
+		SeqWindowSize: 2,
+	}
+	plasmaCfg := &rollup.PlasmaConfig{
 		DAChallengeWindow: 90,
 		DAResolveWindow:   90,
+		CommitmentType:    plasma.KeccakCommitmentString,
 	}
 	// shoud return l1 finality if plasma is not enabled
 	require.Equal(t, uint64(finalityLookback), calcFinalityLookback(cfg))
 
-	cfg.UsePlasma = true
+	cfg.PlasmaConfig = plasmaCfg
 	expFinalityLookback := 181
 	require.Equal(t, uint64(expFinalityLookback), calcFinalityLookback(cfg))
 
diff --git a/op-node/rollup/derive/fjord_upgrade_transactions.go b/op-node/rollup/derive/fjord_upgrade_transactions.go
new file mode 100644
index 000000000000..93f7595dd1d8
--- /dev/null
+++ b/op-node/rollup/derive/fjord_upgrade_transactions.go
@@ -0,0 +1,90 @@
+package derive
+
+import (
+	"math/big"
+
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/crypto"
+)
+
+var (
+	// Gas Price Oracle Parameters
+	deployFjordGasPriceOracleSource    = UpgradeDepositSource{Intent: "Fjord: Gas Price Oracle Deployment"}
+	GasPriceOracleFjordDeployerAddress = common.HexToAddress("0x4210000000000000000000000000000000000002")
+	// Fjord GPO Deployment bytecode generated from:
+	// 1. git checkout 52abfb507342191ae1f960b443ae8aec7598755c
+	// 2. pnpm clean && pnpm install && pnpm build
+	// 3. jq -r ".bytecode.object" packages/contracts-bedrock/forge-artifacts/GasPriceOracle.sol/GasPriceOracle.json
+	// https://github.com/ethereum-optimism/specs/blob/2dd412ce42171b4041e826fd6b8defacc88e8f56/specs/fjord/derivation.md#gaspriceoracle-deployment
+	gasPriceOracleFjordDeploymentBytecode = common.FromHex("0x608060405234801561001057600080fd5b506117f6806100206000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80636ef25c3a116100b2578063de26c4a111610081578063f45e65d811610066578063f45e65d81461025b578063f820614014610263578063fe173b971461020d57600080fd5b8063de26c4a114610235578063f1c7a58b1461024857600080fd5b80636ef25c3a1461020d5780638e98b10614610213578063960e3a231461021b578063c59859181461022d57600080fd5b806349948e0e11610109578063519b4bd3116100ee578063519b4bd31461019f57806354fd4d50146101a757806368d5dca6146101f057600080fd5b806349948e0e1461016f5780634ef6e2241461018257600080fd5b80630c18c1621461013b57806322b90ab3146101565780632e0f262514610160578063313ce56714610168575b600080fd5b61014361026b565b6040519081526020015b60405180910390f35b61015e61038c565b005b610143600681565b6006610143565b61014361017d3660046112a1565b610515565b60005461018f9060ff1681565b604051901515815260200161014d565b610143610552565b6101e36040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b60405161014d9190611370565b6101f86105b3565b60405163ffffffff909116815260200161014d565b48610143565b61015e610638565b60005461018f90610100900460ff1681565b6101f8610832565b6101436102433660046112a1565b610893565b6101436102563660046113e3565b61098d565b610143610a69565b610143610b5c565b6000805460ff1615610304576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f47617350726963654f7261636c653a206f76657268656164282920697320646560448201527f707265636174656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038791906113fc565b905090565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e2073657420697345636f746f6e6520666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a4016102fb565b60005460ff16156104e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a2045636f746f6e6520616c72656164792060448201527f616374697665000000000000000000000000000000000000000000000000000060648201526084016102fb565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60008054610100900460ff16156105355761052f82610bbd565b92915050565b60005460ff16156105495761052f82610bdc565b61052f82610c80565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166368d5dca66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103879190611415565b3373deaddeaddeaddeaddeaddeaddeaddeaddead0001146106db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973466a6f726420666c61670060648201526084016102fb565b60005460ff1661076d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20466a6f72642063616e206f6e6c79206260448201527f65206163746976617465642061667465722045636f746f6e650000000000000060648201526084016102fb565b600054610100900460ff1615610804576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f47617350726963654f7261636c653a20466a6f726420616c726561647920616360448201527f746976650000000000000000000000000000000000000000000000000000000060648201526084016102fb565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663c59859186040518163ffffffff1660e01b8152600401602060405180830381865afa158015610614573d6000803e3d6000fd5b60008054610100900460ff16156108da57620f42406108c56108b484610dd4565b516108c090604461146a565b6110f1565b6108d0906010611482565b61052f91906114bf565b60006108e583611150565b60005490915060ff16156108f95792915050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097c91906113fc565b610986908261146a565b9392505050565b60008054610100900460ff16610a25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f47617350726963654f7261636c653a206765744c314665655570706572426f7560448201527f6e64206f6e6c7920737570706f72747320466a6f72640000000000000000000060648201526084016102fb565b6000610a3283604461146a565b90506000610a4160ff836114bf565b610a4b908361146a565b610a5690601061146a565b9050610a61816111e0565b949350505050565b6000805460ff1615610afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a207363616c61722829206973206465707260448201527f656361746564000000000000000000000000000000000000000000000000000060648201526084016102fb565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663f82061406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b600061052f610bcb83610dd4565b51610bd790604461146a565b6111e0565b600080610be883611150565b90506000610bf4610552565b610bfc610832565b610c079060106114fa565b63ffffffff16610c179190611482565b90506000610c23610b5c565b610c2b6105b3565b63ffffffff16610c3b9190611482565b90506000610c49828461146a565b610c539085611482565b9050610c616006600a611646565b610c6c906010611482565b610c7690826114bf565b9695505050505050565b600080610c8c83611150565b9050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1391906113fc565b610d1b610552565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9e91906113fc565b610da8908561146a565b610db29190611482565b610dbc9190611482565b9050610dca6006600a611646565b610a6190826114bf565b6060610f63565b818153600101919050565b600082840393505b838110156109865782810151828201511860001a1590930292600101610dee565b825b60208210610e5b578251610e26601f83610ddb565b52602092909201917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090910190602101610e11565b8115610986578251610e706001840383610ddb565b520160010192915050565b60006001830392505b6101078210610ebc57610eae8360ff16610ea960fd610ea98760081c60e00189610ddb565b610ddb565b935061010682039150610e84565b60078210610ee957610ee28360ff16610ea960078503610ea98760081c60e00189610ddb565b9050610986565b610a618360ff16610ea98560081c8560051b0187610ddb565b610f5b828203610f3f610f2f84600081518060001a8160011a60081b178160021a60101b17915050919050565b639e3779b90260131c611fff1690565b8060021b6040510182815160e01c1860e01b8151188152505050565b600101919050565b6180003860405139618000604051016020830180600d8551820103826002015b81811015611096576000805b50508051604051600082901a600183901a60081b1760029290921a60101b91909117639e3779b9810260111c617ffc16909101805160e081811c878603811890911b90911890915284019081830390848410610feb5750611026565b600184019350611fff8211611020578251600081901a600182901a60081b1760029190911a60101b1781036110205750611026565b50610f8f565b838310611034575050611096565b600183039250858311156110525761104f8787888603610e0f565b96505b611066600985016003850160038501610de6565b9150611073878284610e7b565b96505061108b8461108686848601610f02565b610f02565b915050809350610f83565b50506110a88383848851850103610e0f565b925050506040519150618000820180820391508183526020830160005b838110156110dd5782810151828201526020016110c5565b506000920191825250602001604052919050565b60008061110183620cc394611482565b61112b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd763200611652565b905061113b6064620f42406116c6565b81121561052f576109866064620f42406116c6565b80516000908190815b818110156111d35784818151811061117357611173611782565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166000036111b3576111ac60048461146a565b92506111c1565b6111be60108461146a565b92505b806111cb816117b1565b915050611159565b50610a618261044061146a565b6000806111ec836110f1565b905060006111f8610b5c565b6112006105b3565b63ffffffff166112109190611482565b611218610552565b611220610832565b61122b9060106114fa565b63ffffffff1661123b9190611482565b611245919061146a565b905061125360066002611482565b61125e90600a611646565b6112688284611482565b610a6191906114bf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156112b357600080fd5b813567ffffffffffffffff808211156112cb57600080fd5b818401915084601f8301126112df57600080fd5b8135818111156112f1576112f1611272565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561133757611337611272565b8160405282815287602084870101111561135057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561139d57858101830151858201604001528201611381565b818111156113af576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156113f557600080fd5b5035919050565b60006020828403121561140e57600080fd5b5051919050565b60006020828403121561142757600080fd5b815163ffffffff8116811461098657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561147d5761147d61143b565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156114ba576114ba61143b565b500290565b6000826114f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600063ffffffff8083168185168183048111821515161561151d5761151d61143b565b02949350505050565b600181815b8085111561157f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156115655761156561143b565b8085161561157257918102915b93841c939080029061152b565b509250929050565b6000826115965750600161052f565b816115a35750600061052f565b81600181146115b957600281146115c3576115df565b600191505061052f565b60ff8411156115d4576115d461143b565b50506001821b61052f565b5060208310610133831016604e8410600b8410161715611602575081810a61052f565b61160c8383611526565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561163e5761163e61143b565b029392505050565b60006109868383611587565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561168c5761168c61143b565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156116c0576116c061143b565b50500190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156117075761170761143b565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156117425761174261143b565b6000871292508782058712848416161561175e5761175e61143b565b878505871281841616156117745761177461143b565b505050929093029392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036117e2576117e261143b565b506001019056fea164736f6c634300080f000a")
+
+	// Update GasPricePriceOracle Proxy Parameters
+	updateFjordGasPriceOracleSource = UpgradeDepositSource{Intent: "Fjord: Gas Price Oracle Proxy Update"}
+	fjordGasPriceOracleAddress      = common.HexToAddress("0xa919894851548179A0750865e7974DA599C0Fac7")
+
+	// Enable Fjord Parameters
+	enableFjordSource = UpgradeDepositSource{Intent: "Fjord: Gas Price Oracle Set Fjord"}
+	enableFjordInput  = crypto.Keccak256([]byte("setFjord()"))[:4]
+)
+
+// FjordNetworkUpgradeTransactions returns the transactions required to upgrade the Fjord network.
+func FjordNetworkUpgradeTransactions() ([]hexutil.Bytes, error) {
+	upgradeTxns := make([]hexutil.Bytes, 0, 3)
+
+	// Deploy Gas Price Oracle transaction
+	deployGasPriceOracle, err := types.NewTx(&types.DepositTx{
+		SourceHash:          deployFjordGasPriceOracleSource.SourceHash(),
+		From:                GasPriceOracleFjordDeployerAddress,
+		To:                  nil,
+		Mint:                big.NewInt(0),
+		Value:               big.NewInt(0),
+		Gas:                 1_450_000,
+		IsSystemTransaction: false,
+		Data:                gasPriceOracleFjordDeploymentBytecode,
+	}).MarshalBinary()
+
+	if err != nil {
+		return nil, err
+	}
+
+	upgradeTxns = append(upgradeTxns, deployGasPriceOracle)
+
+	updateGasPriceOracleProxy, err := types.NewTx(&types.DepositTx{
+		SourceHash:          updateFjordGasPriceOracleSource.SourceHash(),
+		From:                common.Address{},
+		To:                  &predeploys.GasPriceOracleAddr,
+		Mint:                big.NewInt(0),
+		Value:               big.NewInt(0),
+		Gas:                 50_000,
+		IsSystemTransaction: false,
+		Data:                upgradeToCalldata(fjordGasPriceOracleAddress),
+	}).MarshalBinary()
+
+	if err != nil {
+		return nil, err
+	}
+
+	upgradeTxns = append(upgradeTxns, updateGasPriceOracleProxy)
+
+	enableFjord, err := types.NewTx(&types.DepositTx{
+		SourceHash:          enableFjordSource.SourceHash(),
+		From:                L1InfoDepositerAddress,
+		To:                  &predeploys.GasPriceOracleAddr,
+		Mint:                big.NewInt(0),
+		Value:               big.NewInt(0),
+		Gas:                 90_000,
+		IsSystemTransaction: false,
+		Data:                enableFjordInput,
+	}).MarshalBinary()
+
+	if err != nil {
+		return nil, err
+	}
+
+	upgradeTxns = append(upgradeTxns, enableFjord)
+
+	return upgradeTxns, nil
+}
diff --git a/op-node/rollup/derive/fjord_upgrade_transactions_test.go b/op-node/rollup/derive/fjord_upgrade_transactions_test.go
new file mode 100644
index 000000000000..07da4ce46204
--- /dev/null
+++ b/op-node/rollup/derive/fjord_upgrade_transactions_test.go
@@ -0,0 +1,59 @@
+package derive
+
+import (
+	"testing"
+
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/stretchr/testify/require"
+)
+
+func TestFjordSourcesMatchSpec(t *testing.T) {
+	for _, test := range []struct {
+		source       UpgradeDepositSource
+		expectedHash string
+	}{
+		{
+			source:       deployFjordGasPriceOracleSource,
+			expectedHash: "0x86122c533fdcb89b16d8713174625e44578a89751d96c098ec19ab40a51a8ea3",
+		},
+		{
+			source:       updateFjordGasPriceOracleSource,
+			expectedHash: "0x1e6bb0c28bfab3dc9b36ffb0f721f00d6937f33577606325692db0965a7d58c6",
+		},
+		{
+			source:       enableFjordSource,
+			expectedHash: "0xbac7bb0d5961cad209a345408b0280a0d4686b1b20665e1b0f9cdafd73b19b6b",
+		},
+	} {
+		require.Equal(t, common.HexToHash(test.expectedHash), test.source.SourceHash())
+	}
+}
+
+func TestFjordNetworkTransactions(t *testing.T) {
+	upgradeTxns, err := FjordNetworkUpgradeTransactions()
+	require.NoError(t, err)
+	require.Len(t, upgradeTxns, 3)
+
+	deployGasPriceOracleSender, deployGasPriceOracle := toDepositTxn(t, upgradeTxns[0])
+	require.Equal(t, deployGasPriceOracleSender, common.HexToAddress("0x4210000000000000000000000000000000000002"))
+	require.Equal(t, deployFjordGasPriceOracleSource.SourceHash(), deployGasPriceOracle.SourceHash())
+	require.Nil(t, deployGasPriceOracle.To())
+	require.Equal(t, uint64(1_450_000), deployGasPriceOracle.Gas())
+	require.Equal(t, gasPriceOracleFjordDeploymentBytecode, deployGasPriceOracle.Data())
+
+	updateGasPriceOracleSender, updateGasPriceOracle := toDepositTxn(t, upgradeTxns[1])
+	require.Equal(t, updateGasPriceOracleSender, common.Address{})
+	require.Equal(t, updateFjordGasPriceOracleSource.SourceHash(), updateGasPriceOracle.SourceHash())
+	require.NotNil(t, updateGasPriceOracle.To())
+	require.Equal(t, *updateGasPriceOracle.To(), common.HexToAddress("0x420000000000000000000000000000000000000F"))
+	require.Equal(t, uint64(50_000), updateGasPriceOracle.Gas())
+	require.Equal(t, common.FromHex("0x3659cfe6000000000000000000000000a919894851548179A0750865e7974DA599C0Fac7"), updateGasPriceOracle.Data())
+
+	gpoSetFjordSender, gpoSetFjord := toDepositTxn(t, upgradeTxns[2])
+	require.Equal(t, gpoSetFjordSender, common.HexToAddress("0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001"))
+	require.Equal(t, enableFjordSource.SourceHash(), gpoSetFjord.SourceHash())
+	require.NotNil(t, gpoSetFjord.To())
+	require.Equal(t, *gpoSetFjord.To(), common.HexToAddress("0x420000000000000000000000000000000000000F"))
+	require.Equal(t, uint64(90_000), gpoSetFjord.Gas())
+	require.Equal(t, common.FromHex("0x8e98b106"), gpoSetFjord.Data())
+}
diff --git a/op-node/rollup/derive/frame_test.go b/op-node/rollup/derive/frame_test.go
index c7ef78266033..46006398c707 100644
--- a/op-node/rollup/derive/frame_test.go
+++ b/op-node/rollup/derive/frame_test.go
@@ -224,7 +224,7 @@ func randomFrame(rng *rand.Rand, opts ...frameOpt) *Frame {
 		IsLast:      testutils.RandomBool(rng),
 	}
 
-	// evaulaute options
+	// evaluate options
 	for _, opt := range opts {
 		opt(rng, frame)
 	}
diff --git a/op-node/rollup/derive/fuzz_parsers_test.go b/op-node/rollup/derive/fuzz_parsers_test.go
index bf6bd5f9fd4f..4054eb7f2370 100644
--- a/op-node/rollup/derive/fuzz_parsers_test.go
+++ b/op-node/rollup/derive/fuzz_parsers_test.go
@@ -6,6 +6,7 @@ import (
 	"testing"
 
 	"github.com/google/go-cmp/cmp"
+	"github.com/holiman/uint256"
 	"github.com/stretchr/testify/require"
 
 	"github.com/ethereum/go-ethereum/accounts/abi"
@@ -17,18 +18,15 @@ import (
 	"github.com/ethereum/go-ethereum/core/vm/runtime"
 	"github.com/ethereum/go-ethereum/crypto"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-node/bindings"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/testutils"
 )
 
 var (
-	pk, _                  = crypto.GenerateKey()
-	addr                   = common.Address{0x42, 0xff}
-	opts, _                = bind.NewKeyedTransactorWithChainID(pk, common.Big1)
-	from                   = crypto.PubkeyToAddress(pk.PublicKey)
-	portalContract, _      = bindings.NewOptimismPortal(addr, nil)
-	l1BlockInfoContract, _ = bindings.NewL1Block(addr, nil)
+	pk, _   = crypto.GenerateKey()
+	opts, _ = bind.NewKeyedTransactorWithChainID(pk, common.Big1)
+	from    = crypto.PubkeyToAddress(pk.PublicKey)
 )
 
 func cap_byte_slice(b []byte, c int) []byte {
@@ -103,6 +101,9 @@ func FuzzL1InfoEcotoneRoundTrip(f *testing.F) {
 // bindings. Note that we don't test setL1BlockValuesEcotone since it accepts only custom packed
 // calldata and cannot be invoked using the generated bindings.
 func FuzzL1InfoBedrockAgainstContract(f *testing.F) {
+	l1BlockInfoContract, err := bindings.NewL1Block(common.Address{0x42, 0xff}, nil)
+	require.NoError(f, err)
+
 	f.Fuzz(func(t *testing.T, number, time uint64, baseFee, hash []byte, seqNumber uint64, batcherHash []byte, l1FeeOverhead []byte, l1FeeScalar []byte) {
 		expected := L1BlockInfo{
 			Number:         number,
@@ -230,6 +231,23 @@ func FuzzUnmarshallLogEvent(f *testing.F) {
 		f.Add(c.to.Bytes(), b(c.mint), b(c.value), []byte(c.data), c.gasLimit, c.isCreation)
 	}
 
+	// Set the EVM state up once to fuzz against
+	state, err := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil)
+	require.NoError(f, err)
+	state.SetBalance(from, uint256.MustFromBig(BytesToBigInt([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff})))
+	_, addr, _, err := runtime.Create(common.FromHex(bindings.OptimismPortalMetaData.Bin), &runtime.Config{
+		Origin:   from,
+		State:    state,
+		GasLimit: 20_000_000,
+	})
+	require.NoError(f, err)
+
+	_, err = state.Commit(0, false)
+	require.NoError(f, err)
+
+	portalContract, err := bindings.NewOptimismPortal(addr, nil)
+	require.NoError(f, err)
+
 	f.Fuzz(func(t *testing.T, _to, _mint, _value, data []byte, l2GasLimit uint64, isCreation bool) {
 		to := common.BytesToAddress(_to)
 		mint := BytesToBigInt(_mint)
@@ -243,20 +261,7 @@ func FuzzUnmarshallLogEvent(f *testing.F) {
 		opts.Nonce = common.Big0
 		// Create the deposit transaction
 		tx, err := portalContract.DepositTransaction(opts, to, value, l2GasLimit, isCreation, data)
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		state, err := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil)
-		if err != nil {
-			t.Fatal(err)
-		}
-		state.SetBalance(from, BytesToBigInt([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}))
-		state.SetCode(addr, common.FromHex(bindings.OptimismPortalDeployedBin))
-		_, err = state.Commit(0, false)
-		if err != nil {
-			t.Fatal(err)
-		}
+		require.NoError(t, err)
 
 		cfg := runtime.Config{
 			Origin:   from,
diff --git a/op-node/rollup/derive/l1_block_info.go b/op-node/rollup/derive/l1_block_info.go
index 4546c95bdb81..93c529750ef9 100644
--- a/op-node/rollup/derive/l1_block_info.go
+++ b/op-node/rollup/derive/l1_block_info.go
@@ -11,9 +11,9 @@ import (
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/crypto"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum-optimism/optimism/op-service/solabi"
 )
 
@@ -276,12 +276,12 @@ func L1InfoDeposit(rollupCfg *rollup.Config, sysCfg eth.SystemConfig, seqNumber
 			// The L2 spec states to use the MIN_BLOB_GASPRICE from EIP-4844 if not yet active on L1.
 			l1BlockInfo.BlobBaseFee = big.NewInt(1)
 		}
-		blobBaseFeeScalar, baseFeeScalar, err := sysCfg.EcotoneScalars()
+		scalars, err := sysCfg.EcotoneScalars()
 		if err != nil {
 			return nil, err
 		}
-		l1BlockInfo.BlobBaseFeeScalar = blobBaseFeeScalar
-		l1BlockInfo.BaseFeeScalar = baseFeeScalar
+		l1BlockInfo.BlobBaseFeeScalar = scalars.BlobBaseFeeScalar
+		l1BlockInfo.BaseFeeScalar = scalars.BaseFeeScalar
 		out, err := l1BlockInfo.marshalBinaryEcotone()
 		if err != nil {
 			return nil, fmt.Errorf("failed to marshal Ecotone l1 block info: %w", err)
diff --git a/op-node/rollup/derive/params.go b/op-node/rollup/derive/params.go
index 35ac8667e83c..918bbf210c15 100644
--- a/op-node/rollup/derive/params.go
+++ b/op-node/rollup/derive/params.go
@@ -24,19 +24,9 @@ const DerivationVersion0 = 0
 // DerivationVersion1 is reserved for batcher transactions containing plasma commitments.
 const DerivationVersion1 = plasma.TxDataVersion1
 
-// MaxSpanBatchSize is the maximum amount of bytes that will be needed
-// to decode every span batch field. This value cannot be larger than
-// MaxRLPBytesPerChannel because single batch cannot be larger than channel size.
-const MaxSpanBatchSize = MaxRLPBytesPerChannel
-
-// MaxChannelBankSize is the amount of memory space, in number of bytes,
-// till the bank is pruned by removing channels,
-// starting with the oldest channel.
-const MaxChannelBankSize = 100_000_000
-
-// MaxRLPBytesPerChannel is the maximum amount of bytes that will be read from
-// a channel. This limit is set when decoding the RLP.
-const MaxRLPBytesPerChannel = 10_000_000
+// MaxSpanBatchElementCount is the maximum number of blocks, transactions in total,
+// or transaction per block allowed in a span batch.
+const MaxSpanBatchElementCount = 10_000_000
 
 // DuplicateErr is returned when a newly read frame is already known
 var DuplicateErr = errors.New("duplicate frame")
diff --git a/op-node/rollup/derive/pipeline.go b/op-node/rollup/derive/pipeline.go
index 405222bba565..80726fcaa4af 100644
--- a/op-node/rollup/derive/pipeline.go
+++ b/op-node/rollup/derive/pipeline.go
@@ -127,7 +127,7 @@ func (dp *DerivationPipeline) Origin() eth.L1BlockRef {
 func (dp *DerivationPipeline) Finalize(l1Origin eth.L1BlockRef) {
 	// In plasma mode, the finalization signal is proxied through the plasma manager.
 	// Finality signal will come from the DA contract or L1 finality whichever is last.
-	if dp.rollupCfg.UsePlasma {
+	if dp.rollupCfg.PlasmaEnabled() {
 		dp.plasma.Finalize(l1Origin)
 	} else {
 		dp.eng.Finalize(l1Origin)
diff --git a/op-node/rollup/derive/plasma_data_source.go b/op-node/rollup/derive/plasma_data_source.go
index da311c50e0c3..9db4dd1cc553 100644
--- a/op-node/rollup/derive/plasma_data_source.go
+++ b/op-node/rollup/derive/plasma_data_source.go
@@ -19,7 +19,7 @@ type PlasmaDataSource struct {
 	l1      L1Fetcher
 	id      eth.BlockID
 	// keep track of a pending commitment so we can keep trying to fetch the input.
-	comm plasma.Keccak256Commitment
+	comm plasma.CommitmentData
 }
 
 func NewPlasmaDataSource(log log.Logger, src DataIter, l1 L1Fetcher, fetcher PlasmaInputFetcher, id eth.BlockID) *PlasmaDataSource {
@@ -50,6 +50,7 @@ func (s *PlasmaDataSource) Next(ctx context.Context) (eth.Data, error) {
 		if err != nil {
 			return nil, err
 		}
+
 		if len(data) == 0 {
 			return nil, NotEnoughData
 		}
@@ -60,10 +61,11 @@ func (s *PlasmaDataSource) Next(ctx context.Context) (eth.Data, error) {
 		}
 
 		// validate batcher inbox data is a commitment.
-		comm, err := plasma.DecodeKeccak256(data[1:])
+		// strip the transaction data version byte from the data before decoding.
+		comm, err := plasma.DecodeCommitmentData(data[1:])
 		if err != nil {
 			s.log.Warn("invalid commitment", "commitment", data, "err", err)
-			return s.Next(ctx)
+			return nil, NotEnoughData
 		}
 		s.comm = comm
 	}
@@ -90,7 +92,7 @@ func (s *PlasmaDataSource) Next(ctx context.Context) (eth.Data, error) {
 		return nil, NewTemporaryError(fmt.Errorf("failed to fetch input data with comm %x from da service: %w", s.comm, err))
 	}
 	// inputs are limited to a max size to ensure they can be challenged in the DA contract.
-	if len(data) > plasma.MaxInputSize {
+	if s.comm.CommitmentType() == plasma.Keccak256CommitmentType && len(data) > plasma.MaxInputSize {
 		s.log.Warn("input data exceeds max size", "size", len(data), "max", plasma.MaxInputSize)
 		s.comm = nil
 		return s.Next(ctx)
diff --git a/op-node/rollup/derive/plasma_data_source_test.go b/op-node/rollup/derive/plasma_data_source_test.go
index 0769eb504a11..ae13be8e37f8 100644
--- a/op-node/rollup/derive/plasma_data_source_test.go
+++ b/op-node/rollup/derive/plasma_data_source_test.go
@@ -88,11 +88,15 @@ func TestPlasmaDataSource(t *testing.T) {
 		BlockTime:         1,
 		SeqWindowSize:     20,
 		BatchInboxAddress: batcherInbox,
-		UsePlasma:         true,
+		PlasmaConfig: &rollup.PlasmaConfig{
+			DAChallengeWindow: pcfg.ChallengeWindow,
+			DAResolveWindow:   pcfg.ResolveWindow,
+			CommitmentType:    plasma.KeccakCommitmentString,
+		},
 	}
 	// keep track of random input data to validate against
 	var inputs [][]byte
-	var comms []plasma.Keccak256Commitment
+	var comms []plasma.CommitmentData
 
 	signer := cfg.L1Signer()
 
@@ -123,8 +127,10 @@ func TestPlasmaDataSource(t *testing.T) {
 			// mock input commitments in l1 transactions
 			input := testutils.RandomData(rng, 2000)
 			comm, _ := storage.SetInput(ctx, input)
+			// plasma da tests are designed for keccak256 commitments, so we type assert here
+			kComm := comm.(plasma.Keccak256Commitment)
 			inputs = append(inputs, input)
-			comms = append(comms, comm)
+			comms = append(comms, kComm)
 
 			tx, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{
 				ChainID:   signer.ChainID(),
@@ -223,8 +229,10 @@ func TestPlasmaDataSource(t *testing.T) {
 				// mock input commitments in l1 transactions
 				input := testutils.RandomData(rng, 2000)
 				comm, _ := storage.SetInput(ctx, input)
+				// plasma da tests are designed for keccak256 commitments, so we type assert here
+				kComm := comm.(plasma.Keccak256Commitment)
 				inputs = append(inputs, input)
-				comms = append(comms, comm)
+				comms = append(comms, kComm)
 
 				tx, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{
 					ChainID:   signer.ChainID(),
@@ -323,7 +331,11 @@ func TestPlasmaDataSourceStall(t *testing.T) {
 		BlockTime:         1,
 		SeqWindowSize:     20,
 		BatchInboxAddress: batcherInbox,
-		UsePlasma:         true,
+		PlasmaConfig: &rollup.PlasmaConfig{
+			DAChallengeWindow: pcfg.ChallengeWindow,
+			DAResolveWindow:   pcfg.ResolveWindow,
+			CommitmentType:    plasma.KeccakCommitmentString,
+		},
 	}
 
 	signer := cfg.L1Signer()
@@ -438,7 +450,11 @@ func TestPlasmaDataSourceInvalidData(t *testing.T) {
 		BlockTime:         1,
 		SeqWindowSize:     20,
 		BatchInboxAddress: batcherInbox,
-		UsePlasma:         true,
+		PlasmaConfig: &rollup.PlasmaConfig{
+			DAChallengeWindow: pcfg.ChallengeWindow,
+			DAResolveWindow:   pcfg.ResolveWindow,
+			CommitmentType:    plasma.KeccakCommitmentString,
+		},
 	}
 
 	signer := cfg.L1Signer()
diff --git a/op-node/rollup/derive/singular_batch.go b/op-node/rollup/derive/singular_batch.go
index fb7baeecb9b0..fdb867efbe72 100644
--- a/op-node/rollup/derive/singular_batch.go
+++ b/op-node/rollup/derive/singular_batch.go
@@ -27,6 +27,9 @@ type SingularBatch struct {
 	Transactions []hexutil.Bytes
 }
 
+func (b *SingularBatch) AsSingularBatch() (*SingularBatch, bool) { return b, true }
+func (b *SingularBatch) AsSpanBatch() (*SpanBatch, bool)         { return nil, false }
+
 // GetBatchType returns its batch type (batch_version)
 func (b *SingularBatch) GetBatchType() int {
 	return SingularBatchType
diff --git a/op-node/rollup/derive/span_batch.go b/op-node/rollup/derive/span_batch.go
index af8c77d84802..aa95b3838a7b 100644
--- a/op-node/rollup/derive/span_batch.go
+++ b/op-node/rollup/derive/span_batch.go
@@ -8,7 +8,6 @@ import (
 	"fmt"
 	"io"
 	"math/big"
-	"sort"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
@@ -59,6 +58,9 @@ func (b *RawSpanBatch) GetBatchType() int {
 
 // decodeOriginBits parses data into bp.originBits
 func (bp *spanBatchPayload) decodeOriginBits(r *bytes.Reader) error {
+	if bp.blockCount > MaxSpanBatchElementCount {
+		return ErrTooBigSpanBatchSize
+	}
 	bits, err := decodeSpanBatchBits(r, bp.blockCount)
 	if err != nil {
 		return fmt.Errorf("failed to decode origin bits: %w", err)
@@ -128,8 +130,8 @@ func (bp *spanBatchPayload) decodeBlockCount(r *bytes.Reader) error {
 	if err != nil {
 		return fmt.Errorf("failed to read block count: %w", err)
 	}
-	// number of L2 block in span batch cannot be greater than MaxSpanBatchSize
-	if blockCount > MaxSpanBatchSize {
+	// number of L2 block in span batch cannot be greater than MaxSpanBatchElementCount
+	if blockCount > MaxSpanBatchElementCount {
 		return ErrTooBigSpanBatchSize
 	}
 	if blockCount == 0 {
@@ -148,9 +150,9 @@ func (bp *spanBatchPayload) decodeBlockTxCounts(r *bytes.Reader) error {
 		if err != nil {
 			return fmt.Errorf("failed to read block tx count: %w", err)
 		}
-		// number of txs in single L2 block cannot be greater than MaxSpanBatchSize
+		// number of txs in single L2 block cannot be greater than MaxSpanBatchElementCount
 		// every tx will take at least single byte
-		if blockTxCount > MaxSpanBatchSize {
+		if blockTxCount > MaxSpanBatchElementCount {
 			return ErrTooBigSpanBatchSize
 		}
 		blockTxCounts = append(blockTxCounts, blockTxCount)
@@ -175,8 +177,8 @@ func (bp *spanBatchPayload) decodeTxs(r *bytes.Reader) error {
 		}
 		totalBlockTxCount = total
 	}
-	// total number of txs in span batch cannot be greater than MaxSpanBatchSize
-	if totalBlockTxCount > MaxSpanBatchSize {
+	// total number of txs in span batch cannot be greater than MaxSpanBatchElementCount
+	if totalBlockTxCount > MaxSpanBatchElementCount {
 		return ErrTooBigSpanBatchSize
 	}
 	bp.txs.totalBlockTxCount = totalBlockTxCount
@@ -205,9 +207,6 @@ func (bp *spanBatchPayload) decodePayload(r *bytes.Reader) error {
 
 // decode reads the byte encoding of SpanBatch from Reader stream
 func (b *RawSpanBatch) decode(r *bytes.Reader) error {
-	if r.Len() > MaxSpanBatchSize {
-		return ErrTooBigSpanBatchSize
-	}
 	if err := b.decodePrefix(r); err != nil {
 		return fmt.Errorf("failed to decode span batch prefix: %w", err)
 	}
@@ -411,11 +410,21 @@ func singularBatchToElement(singularBatch *SingularBatch) *SpanBatchElement {
 // SpanBatch is an implementation of Batch interface,
 // containing the input to build a span of L2 blocks in derived form (SpanBatchElement)
 type SpanBatch struct {
-	ParentCheck   [20]byte            // First 20 bytes of the first block's parent hash
-	L1OriginCheck [20]byte            // First 20 bytes of the last block's L1 origin hash
-	Batches       []*SpanBatchElement // List of block input in derived form
+	ParentCheck      [20]byte // First 20 bytes of the first block's parent hash
+	L1OriginCheck    [20]byte // First 20 bytes of the last block's L1 origin hash
+	GenesisTimestamp uint64
+	ChainID          *big.Int
+	Batches          []*SpanBatchElement // List of block input in derived form
+
+	// caching
+	originBits    *big.Int
+	blockTxCounts []uint64
+	sbtxs         *spanBatchTxs
 }
 
+func (b *SpanBatch) AsSingularBatch() (*SingularBatch, bool) { return nil, false }
+func (b *SpanBatch) AsSpanBatch() (*SpanBatch, bool)         { return b, true }
+
 // spanBatchMarshaling is a helper type used for JSON marshaling.
 type spanBatchMarshaling struct {
 	ParentCheck   []hexutil.Bytes     `json:"parent_check"`
@@ -493,60 +502,73 @@ func (b *SpanBatch) GetBlockCount() int {
 	return len(b.Batches)
 }
 
+func (b *SpanBatch) peek(n int) *SpanBatchElement { return b.Batches[len(b.Batches)-1-n] }
+
 // AppendSingularBatch appends a SingularBatch into the span batch
 // updates l1OriginCheck or parentCheck if needed.
-func (b *SpanBatch) AppendSingularBatch(singularBatch *SingularBatch) {
-	if len(b.Batches) == 0 {
-		copy(b.ParentCheck[:], singularBatch.ParentHash.Bytes()[:20])
+func (b *SpanBatch) AppendSingularBatch(singularBatch *SingularBatch, seqNum uint64) error {
+	// if this new element is not ordered with respect to the last element, panic
+	if len(b.Batches) > 0 && b.peek(0).Timestamp > singularBatch.Timestamp {
+		panic("span batch is not ordered")
 	}
+
+	// always append the new batch and set the L1 origin check
 	b.Batches = append(b.Batches, singularBatchToElement(singularBatch))
+
+	// always update the L1 origin check
 	copy(b.L1OriginCheck[:], singularBatch.EpochHash.Bytes()[:20])
+	// if there is only one batch, initialize the ParentCheck
+	// and set the epochBit based on the seqNum
+	epochBit := uint(0)
+	if len(b.Batches) == 1 {
+		if seqNum == 0 {
+			epochBit = 1
+		}
+		copy(b.ParentCheck[:], singularBatch.ParentHash.Bytes()[:20])
+	} else {
+		// if there is more than one batch, set the epochBit based on the last two batches
+		if b.peek(1).EpochNum < b.peek(0).EpochNum {
+			epochBit = 1
+		}
+	}
+	// set the respective bit in the originBits
+	b.originBits.SetBit(b.originBits, len(b.Batches)-1, epochBit)
+
+	// update the blockTxCounts cache with the latest batch's tx count
+	b.blockTxCounts = append(b.blockTxCounts, uint64(len(b.peek(0).Transactions)))
+
+	// add the new txs to the sbtxs
+	newTxs := make([][]byte, 0, len(b.peek(0).Transactions))
+	for i := 0; i < len(b.peek(0).Transactions); i++ {
+		newTxs = append(newTxs, b.peek(0).Transactions[i])
+	}
+	// add the new txs to the sbtxs
+	// this is the only place where we can get an error
+	return b.sbtxs.AddTxs(newTxs, b.ChainID)
 }
 
 // ToRawSpanBatch merges SingularBatch List and initialize single RawSpanBatch
-func (b *SpanBatch) ToRawSpanBatch(originChangedBit uint, genesisTimestamp uint64, chainID *big.Int) (*RawSpanBatch, error) {
+func (b *SpanBatch) ToRawSpanBatch() (*RawSpanBatch, error) {
 	if len(b.Batches) == 0 {
 		return nil, errors.New("cannot merge empty singularBatch list")
 	}
-	raw := RawSpanBatch{}
-	// Sort by timestamp of L2 block
-	sort.Slice(b.Batches, func(i, j int) bool {
-		return b.Batches[i].Timestamp < b.Batches[j].Timestamp
-	})
-	// spanBatchPrefix
 	span_start := b.Batches[0]
 	span_end := b.Batches[len(b.Batches)-1]
-	raw.relTimestamp = span_start.Timestamp - genesisTimestamp
-	raw.l1OriginNum = uint64(span_end.EpochNum)
-	raw.parentCheck = b.ParentCheck
-	raw.l1OriginCheck = b.L1OriginCheck
-	// spanBatchPayload
-	raw.blockCount = uint64(len(b.Batches))
-	raw.originBits = new(big.Int)
-	raw.originBits.SetBit(raw.originBits, 0, originChangedBit)
-	for i := 1; i < len(b.Batches); i++ {
-		bit := uint(0)
-		if b.Batches[i-1].EpochNum < b.Batches[i].EpochNum {
-			bit = 1
-		}
-		raw.originBits.SetBit(raw.originBits, i, bit)
-	}
-	var blockTxCounts []uint64
-	var txs [][]byte
-	for _, batch := range b.Batches {
-		blockTxCount := uint64(len(batch.Transactions))
-		blockTxCounts = append(blockTxCounts, blockTxCount)
-		for _, rawTx := range batch.Transactions {
-			txs = append(txs, rawTx)
-		}
-	}
-	raw.blockTxCounts = blockTxCounts
-	stxs, err := newSpanBatchTxs(txs, chainID)
-	if err != nil {
-		return nil, err
-	}
-	raw.txs = stxs
-	return &raw, nil
+
+	return &RawSpanBatch{
+		spanBatchPrefix: spanBatchPrefix{
+			relTimestamp:  span_start.Timestamp - b.GenesisTimestamp,
+			l1OriginNum:   uint64(span_end.EpochNum),
+			parentCheck:   b.ParentCheck,
+			l1OriginCheck: b.L1OriginCheck,
+		},
+		spanBatchPayload: spanBatchPayload{
+			blockCount:    uint64(len(b.Batches)),
+			originBits:    b.originBits,
+			blockTxCounts: b.blockTxCounts,
+			txs:           b.sbtxs,
+		},
+	}, nil
 }
 
 // GetSingularBatches converts SpanBatchElements after L2 safe head to SingularBatches.
@@ -582,17 +604,15 @@ func (b *SpanBatch) GetSingularBatches(l1Origins []eth.L1BlockRef, l2SafeHead et
 }
 
 // NewSpanBatch converts given singularBatches into SpanBatchElements, and creates a new SpanBatch.
-func NewSpanBatch(singularBatches []*SingularBatch) *SpanBatch {
-	spanBatch := &SpanBatch{}
-	if len(singularBatches) == 0 {
-		return spanBatch
-	}
-	copy(spanBatch.ParentCheck[:], singularBatches[0].ParentHash.Bytes()[:20])
-	copy(spanBatch.L1OriginCheck[:], singularBatches[len(singularBatches)-1].EpochHash.Bytes()[:20])
-	for _, singularBatch := range singularBatches {
-		spanBatch.Batches = append(spanBatch.Batches, singularBatchToElement(singularBatch))
+func NewSpanBatch(genesisTimestamp uint64, chainID *big.Int) *SpanBatch {
+	// newSpanBatchTxs can't fail with empty txs
+	sbtxs, _ := newSpanBatchTxs([][]byte{}, chainID)
+	return &SpanBatch{
+		GenesisTimestamp: genesisTimestamp,
+		ChainID:          chainID,
+		originBits:       big.NewInt(0),
+		sbtxs:            sbtxs,
 	}
-	return spanBatch
 }
 
 // DeriveSpanBatch derives SpanBatch from BatchData.
@@ -605,49 +625,6 @@ func DeriveSpanBatch(batchData *BatchData, blockTime, genesisTimestamp uint64, c
 	return rawSpanBatch.ToSpanBatch(blockTime, genesisTimestamp, chainID)
 }
 
-// SpanBatchBuilder is a utility type to build a SpanBatch by adding a SingularBatch one by one.
-// makes easier to stack SingularBatches and convert to RawSpanBatch for encoding.
-type SpanBatchBuilder struct {
-	genesisTimestamp uint64
-	chainID          *big.Int
-	spanBatch        *SpanBatch
-	originChangedBit uint
-}
-
-func NewSpanBatchBuilder(genesisTimestamp uint64, chainID *big.Int) *SpanBatchBuilder {
-	return &SpanBatchBuilder{
-		genesisTimestamp: genesisTimestamp,
-		chainID:          chainID,
-		spanBatch:        &SpanBatch{},
-	}
-}
-
-func (b *SpanBatchBuilder) AppendSingularBatch(singularBatch *SingularBatch, seqNum uint64) {
-	if b.GetBlockCount() == 0 {
-		b.originChangedBit = 0
-		if seqNum == 0 {
-			b.originChangedBit = 1
-		}
-	}
-	b.spanBatch.AppendSingularBatch(singularBatch)
-}
-
-func (b *SpanBatchBuilder) GetRawSpanBatch() (*RawSpanBatch, error) {
-	raw, err := b.spanBatch.ToRawSpanBatch(b.originChangedBit, b.genesisTimestamp, b.chainID)
-	if err != nil {
-		return nil, err
-	}
-	return raw, nil
-}
-
-func (b *SpanBatchBuilder) GetBlockCount() int {
-	return len(b.spanBatch.Batches)
-}
-
-func (b *SpanBatchBuilder) Reset() {
-	b.spanBatch = &SpanBatch{}
-}
-
 // ReadTxData reads raw RLP tx data from reader and returns txData and txType
 func ReadTxData(r *bytes.Reader) ([]byte, int, error) {
 	var txData []byte
@@ -672,7 +649,7 @@ func ReadTxData(r *bytes.Reader) ([]byte, int, error) {
 		}
 	}
 	// avoid out of memory before allocation
-	s := rlp.NewStream(r, MaxSpanBatchSize)
+	s := rlp.NewStream(r, MaxSpanBatchElementCount)
 	var txPayload []byte
 	kind, _, err := s.Kind()
 	switch {
diff --git a/op-node/rollup/derive/span_batch_test.go b/op-node/rollup/derive/span_batch_test.go
index dd3574b4aa39..4c02c46b2de4 100644
--- a/op-node/rollup/derive/span_batch_test.go
+++ b/op-node/rollup/derive/span_batch_test.go
@@ -18,6 +18,29 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/testutils"
 )
 
+// initializedSpanBatch creates a new SpanBatch with given SingularBatches.
+// It is used *only* in tests to create a SpanBatch with given SingularBatches as a convenience.
+// It will also ignore any errors that occur during AppendSingularBatch.
+// Tests should manually set the first bit of the originBits if needed using SetFirstOriginChangedBit
+func initializedSpanBatch(singularBatches []*SingularBatch, genesisTimestamp uint64, chainID *big.Int) *SpanBatch {
+	spanBatch := NewSpanBatch(genesisTimestamp, chainID)
+	if len(singularBatches) == 0 {
+		return spanBatch
+	}
+	for i := 0; i < len(singularBatches); i++ {
+		if err := spanBatch.AppendSingularBatch(singularBatches[i], uint64(i)); err != nil {
+			continue
+		}
+	}
+	return spanBatch
+}
+
+// setFirstOriginChangedBit sets the first bit of the originBits to the given value
+// used for testing when a Span Batch is made with InitializedSpanBatch, which doesn't have a sequence number
+func (b *SpanBatch) setFirstOriginChangedBit(bit uint) {
+	b.originBits.SetBit(b.originBits, 0, bit)
+}
+
 func TestSpanBatchForBatchInterface(t *testing.T) {
 	rng := rand.New(rand.NewSource(0x5432177))
 	chainID := big.NewInt(rng.Int63n(1000))
@@ -27,7 +50,7 @@ func TestSpanBatchForBatchInterface(t *testing.T) {
 	safeL2Head := testutils.RandomL2BlockRef(rng)
 	safeL2Head.Hash = common.BytesToHash(singularBatches[0].ParentHash[:])
 
-	spanBatch := NewSpanBatch(singularBatches)
+	spanBatch := initializedSpanBatch(singularBatches, uint64(0), chainID)
 
 	// check interface method implementations except logging
 	require.Equal(t, SpanBatchType, spanBatch.GetBatchType())
@@ -322,9 +345,10 @@ func TestSpanBatchDerive(t *testing.T) {
 		safeL2Head.Hash = common.BytesToHash(singularBatches[0].ParentHash[:])
 		genesisTimeStamp := 1 + singularBatches[0].Timestamp - 128
 
-		spanBatch := NewSpanBatch(singularBatches)
-		originChangedBit := uint(originChangedBit)
-		rawSpanBatch, err := spanBatch.ToRawSpanBatch(originChangedBit, genesisTimeStamp, chainID)
+		spanBatch := initializedSpanBatch(singularBatches, genesisTimeStamp, chainID)
+		// set originChangedBit to match the original test implementation
+		spanBatch.setFirstOriginChangedBit(uint(originChangedBit))
+		rawSpanBatch, err := spanBatch.ToRawSpanBatch()
 		require.NoError(t, err)
 
 		spanBatchDerived, err := rawSpanBatch.derive(l2BlockTime, genesisTimeStamp, chainID)
@@ -354,14 +378,15 @@ func TestSpanBatchAppend(t *testing.T) {
 
 	singularBatches := RandomValidConsecutiveSingularBatches(rng, chainID)
 	// initialize empty span batch
-	spanBatch := NewSpanBatch([]*SingularBatch{})
+	spanBatch := initializedSpanBatch([]*SingularBatch{}, uint64(0), chainID)
 
 	L := 2
 	for i := 0; i < L; i++ {
-		spanBatch.AppendSingularBatch(singularBatches[i])
+		err := spanBatch.AppendSingularBatch(singularBatches[i], uint64(i))
+		require.NoError(t, err)
 	}
 	// initialize with two singular batches
-	spanBatch2 := NewSpanBatch(singularBatches[:L])
+	spanBatch2 := initializedSpanBatch(singularBatches[:L], uint64(0), chainID)
 
 	require.Equal(t, spanBatch, spanBatch2)
 }
@@ -376,9 +401,10 @@ func TestSpanBatchMerge(t *testing.T) {
 		singularBatches := RandomValidConsecutiveSingularBatches(rng, chainID)
 		blockCount := len(singularBatches)
 
-		spanBatch := NewSpanBatch(singularBatches)
-		originChangedBit := uint(originChangedBit)
-		rawSpanBatch, err := spanBatch.ToRawSpanBatch(originChangedBit, genesisTimeStamp, chainID)
+		spanBatch := initializedSpanBatch(singularBatches, genesisTimeStamp, chainID)
+		// set originChangedBit to match the original test implementation
+		spanBatch.setFirstOriginChangedBit(uint(originChangedBit))
+		rawSpanBatch, err := spanBatch.ToRawSpanBatch()
 		require.NoError(t, err)
 
 		// check span batch prefix
@@ -389,7 +415,7 @@ func TestSpanBatchMerge(t *testing.T) {
 
 		// check span batch payload
 		require.Equal(t, int(rawSpanBatch.blockCount), len(singularBatches))
-		require.Equal(t, rawSpanBatch.originBits.Bit(0), originChangedBit)
+		require.Equal(t, rawSpanBatch.originBits.Bit(0), uint(originChangedBit))
 		for i := 1; i < blockCount; i++ {
 			if rawSpanBatch.originBits.Bit(i) == 1 {
 				require.Equal(t, singularBatches[i].EpochNum, singularBatches[i-1].EpochNum+1)
@@ -421,9 +447,10 @@ func TestSpanBatchToSingularBatch(t *testing.T) {
 		safeL2Head.Time = singularBatches[0].Timestamp - 2
 		genesisTimeStamp := 1 + singularBatches[0].Timestamp - 128
 
-		spanBatch := NewSpanBatch(singularBatches)
-		originChangedBit := uint(originChangedBit)
-		rawSpanBatch, err := spanBatch.ToRawSpanBatch(originChangedBit, genesisTimeStamp, chainID)
+		spanBatch := initializedSpanBatch(singularBatches, genesisTimeStamp, chainID)
+		// set originChangedBit to match the original test implementation
+		spanBatch.setFirstOriginChangedBit(uint(originChangedBit))
+		rawSpanBatch, err := spanBatch.ToRawSpanBatch()
 		require.NoError(t, err)
 
 		l1Origins := mockL1Origin(rng, rawSpanBatch, singularBatches)
@@ -492,54 +519,11 @@ func TestSpanBatchReadTxDataInvalid(t *testing.T) {
 	require.ErrorContains(t, err, "tx RLP prefix type must be list")
 }
 
-func TestSpanBatchBuilder(t *testing.T) {
-	rng := rand.New(rand.NewSource(0xbab1bab1))
-	chainID := new(big.Int).SetUint64(rng.Uint64())
-
-	for originChangedBit := 0; originChangedBit < 2; originChangedBit++ {
-		singularBatches := RandomValidConsecutiveSingularBatches(rng, chainID)
-		safeL2Head := testutils.RandomL2BlockRef(rng)
-		if originChangedBit == 0 {
-			safeL2Head.Hash = common.BytesToHash(singularBatches[0].ParentHash[:])
-		}
-		genesisTimeStamp := 1 + singularBatches[0].Timestamp - 128
-
-		var seqNum uint64 = 1
-		if originChangedBit == 1 {
-			seqNum = 0
-		}
-		spanBatchBuilder := NewSpanBatchBuilder(genesisTimeStamp, chainID)
-
-		require.Equal(t, 0, spanBatchBuilder.GetBlockCount())
-
-		for i := 0; i < len(singularBatches); i++ {
-			spanBatchBuilder.AppendSingularBatch(singularBatches[i], seqNum)
-			require.Equal(t, i+1, spanBatchBuilder.GetBlockCount())
-			require.Equal(t, singularBatches[0].ParentHash.Bytes()[:20], spanBatchBuilder.spanBatch.ParentCheck[:])
-			require.Equal(t, singularBatches[i].EpochHash.Bytes()[:20], spanBatchBuilder.spanBatch.L1OriginCheck[:])
-		}
-
-		rawSpanBatch, err := spanBatchBuilder.GetRawSpanBatch()
-		require.NoError(t, err)
-
-		// compare with rawSpanBatch not using spanBatchBuilder
-		spanBatch := NewSpanBatch(singularBatches)
-		originChangedBit := uint(originChangedBit)
-		rawSpanBatch2, err := spanBatch.ToRawSpanBatch(originChangedBit, genesisTimeStamp, chainID)
-		require.NoError(t, err)
-
-		require.Equal(t, rawSpanBatch2, rawSpanBatch)
-
-		spanBatchBuilder.Reset()
-		require.Equal(t, 0, spanBatchBuilder.GetBlockCount())
-	}
-}
-
 func TestSpanBatchMaxTxData(t *testing.T) {
 	rng := rand.New(rand.NewSource(0x177288))
 
 	invalidTx := types.NewTx(&types.DynamicFeeTx{
-		Data: testutils.RandomData(rng, MaxSpanBatchSize+1),
+		Data: testutils.RandomData(rng, MaxSpanBatchElementCount+1),
 	})
 
 	txEncoded, err := invalidTx.MarshalBinary()
@@ -602,8 +586,8 @@ func TestSpanBatchTotalBlockTxCountNotOverflow(t *testing.T) {
 	chainID := big.NewInt(rng.Int63n(1000))
 
 	rawSpanBatch := RandomRawSpanBatch(rng, chainID)
-	rawSpanBatch.blockTxCounts[0] = MaxSpanBatchSize - 1
-	rawSpanBatch.blockTxCounts[1] = MaxSpanBatchSize - 1
+	rawSpanBatch.blockTxCounts[0] = MaxSpanBatchElementCount - 1
+	rawSpanBatch.blockTxCounts[1] = MaxSpanBatchElementCount - 1
 	// we are sure that totalBlockTxCount will overflow on uint64
 
 	var buf bytes.Buffer
diff --git a/op-node/rollup/derive/span_batch_txs.go b/op-node/rollup/derive/span_batch_txs.go
index ca9e8b1d84c1..305aafefe9da 100644
--- a/op-node/rollup/derive/span_batch_txs.go
+++ b/op-node/rollup/derive/span_batch_txs.go
@@ -47,6 +47,9 @@ func (btx *spanBatchTxs) encodeContractCreationBits(w io.Writer) error {
 }
 
 func (btx *spanBatchTxs) decodeContractCreationBits(r *bytes.Reader) error {
+	if btx.totalBlockTxCount > MaxSpanBatchElementCount {
+		return ErrTooBigSpanBatchSize
+	}
 	bits, err := decodeSpanBatchBits(r, btx.totalBlockTxCount)
 	if err != nil {
 		return fmt.Errorf("failed to decode contract creation bits: %w", err)
@@ -63,6 +66,9 @@ func (btx *spanBatchTxs) encodeProtectedBits(w io.Writer) error {
 }
 
 func (btx *spanBatchTxs) decodeProtectedBits(r *bytes.Reader) error {
+	if btx.totalLegacyTxCount > MaxSpanBatchElementCount {
+		return ErrTooBigSpanBatchSize
+	}
 	bits, err := decodeSpanBatchBits(r, btx.totalLegacyTxCount)
 	if err != nil {
 		return fmt.Errorf("failed to decode protected bits: %w", err)
@@ -396,32 +402,42 @@ func isProtectedV(v uint64, txType int) bool {
 }
 
 func newSpanBatchTxs(txs [][]byte, chainID *big.Int) (*spanBatchTxs, error) {
+	sbtxs := &spanBatchTxs{
+		contractCreationBits: big.NewInt(0),
+		yParityBits:          big.NewInt(0),
+		txSigs:               []spanBatchSignature{},
+		txNonces:             []uint64{},
+		txGases:              []uint64{},
+		txTos:                []common.Address{},
+		txDatas:              []hexutil.Bytes{},
+		txTypes:              []int{},
+		protectedBits:        big.NewInt(0),
+	}
+
+	if err := sbtxs.AddTxs(txs, chainID); err != nil {
+		return nil, err
+	}
+	return sbtxs, nil
+}
+
+func (sbtx *spanBatchTxs) AddTxs(txs [][]byte, chainID *big.Int) error {
 	totalBlockTxCount := uint64(len(txs))
-	var txSigs []spanBatchSignature
-	var txTos []common.Address
-	var txNonces []uint64
-	var txGases []uint64
-	var txDatas []hexutil.Bytes
-	var txTypes []int
-	contractCreationBits := new(big.Int)
-	yParityBits := new(big.Int)
-	protectedBits := new(big.Int)
-	totalLegacyTxCount := uint64(0)
+	offset := sbtx.totalBlockTxCount
 	for idx := 0; idx < int(totalBlockTxCount); idx++ {
 		var tx types.Transaction
 		if err := tx.UnmarshalBinary(txs[idx]); err != nil {
-			return nil, errors.New("failed to decode tx")
+			return errors.New("failed to decode tx")
 		}
 		if tx.Type() == types.LegacyTxType {
 			protectedBit := uint(0)
 			if tx.Protected() {
 				protectedBit = uint(1)
 			}
-			protectedBits.SetBit(protectedBits, int(totalLegacyTxCount), protectedBit)
-			totalLegacyTxCount++
+			sbtx.protectedBits.SetBit(sbtx.protectedBits, int(sbtx.totalLegacyTxCount), protectedBit)
+			sbtx.totalLegacyTxCount++
 		}
 		if tx.Protected() && tx.ChainId().Cmp(chainID) != 0 {
-			return nil, fmt.Errorf("protected tx has chain ID %d, but expected chain ID %d", tx.ChainId(), chainID)
+			return fmt.Errorf("protected tx has chain ID %d, but expected chain ID %d", tx.ChainId(), chainID)
 		}
 		var txSig spanBatchSignature
 		v, r, s := tx.RawSignatureValues()
@@ -430,42 +446,31 @@ func newSpanBatchTxs(txs [][]byte, chainID *big.Int) (*spanBatchTxs, error) {
 		txSig.v = v.Uint64()
 		txSig.r = R
 		txSig.s = S
-		txSigs = append(txSigs, txSig)
+		sbtx.txSigs = append(sbtx.txSigs, txSig)
 		contractCreationBit := uint(1)
 		if tx.To() != nil {
-			txTos = append(txTos, *tx.To())
+			sbtx.txTos = append(sbtx.txTos, *tx.To())
 			contractCreationBit = uint(0)
 		}
-		contractCreationBits.SetBit(contractCreationBits, idx, contractCreationBit)
+		sbtx.contractCreationBits.SetBit(sbtx.contractCreationBits, idx+int(offset), contractCreationBit)
 		yParityBit, err := convertVToYParity(txSig.v, int(tx.Type()))
 		if err != nil {
-			return nil, err
+			return err
 		}
-		yParityBits.SetBit(yParityBits, idx, yParityBit)
-		txNonces = append(txNonces, tx.Nonce())
-		txGases = append(txGases, tx.Gas())
+		sbtx.yParityBits.SetBit(sbtx.yParityBits, idx+int(offset), yParityBit)
+		sbtx.txNonces = append(sbtx.txNonces, tx.Nonce())
+		sbtx.txGases = append(sbtx.txGases, tx.Gas())
 		stx, err := newSpanBatchTx(tx)
 		if err != nil {
-			return nil, err
+			return err
 		}
 		txData, err := stx.MarshalBinary()
 		if err != nil {
-			return nil, err
+			return err
 		}
-		txDatas = append(txDatas, txData)
-		txTypes = append(txTypes, int(tx.Type()))
-	}
-	return &spanBatchTxs{
-		totalBlockTxCount:    totalBlockTxCount,
-		contractCreationBits: contractCreationBits,
-		yParityBits:          yParityBits,
-		txSigs:               txSigs,
-		txNonces:             txNonces,
-		txGases:              txGases,
-		txTos:                txTos,
-		txDatas:              txDatas,
-		txTypes:              txTypes,
-		protectedBits:        protectedBits,
-		totalLegacyTxCount:   totalLegacyTxCount,
-	}, nil
+		sbtx.txDatas = append(sbtx.txDatas, txData)
+		sbtx.txTypes = append(sbtx.txTypes, int(tx.Type()))
+	}
+	sbtx.totalBlockTxCount += totalBlockTxCount
+	return nil
 }
diff --git a/op-node/rollup/derive/span_batch_txs_test.go b/op-node/rollup/derive/span_batch_txs_test.go
index ea8f898e45ff..20f03899413d 100644
--- a/op-node/rollup/derive/span_batch_txs_test.go
+++ b/op-node/rollup/derive/span_batch_txs_test.go
@@ -302,6 +302,31 @@ func TestSpanBatchTxsTxDatas(t *testing.T) {
 	require.Equal(t, txDatas, sbt.txDatas)
 	require.Equal(t, txTypes, sbt.txTypes)
 }
+func TestSpanBatchTxsAddTxs(t *testing.T) {
+	rng := rand.New(rand.NewSource(0x1234))
+	chainID := big.NewInt(rng.Int63n(1000))
+	// make batches to extract txs from
+	batches := RandomValidConsecutiveSingularBatches(rng, chainID)
+	allTxs := [][]byte{}
+
+	iterativeSBTX, err := newSpanBatchTxs([][]byte{}, chainID)
+	require.NoError(t, err)
+	for i := 0; i < len(batches); i++ {
+		// explicitly extract txs due to mismatch of [][]byte to []hexutil.Bytes
+		txs := [][]byte{}
+		for j := 0; j < len(batches[i].Transactions); j++ {
+			txs = append(txs, batches[i].Transactions[j])
+		}
+		err = iterativeSBTX.AddTxs(txs, chainID)
+		require.NoError(t, err)
+		allTxs = append(allTxs, txs...)
+	}
+
+	fullSBTX, err := newSpanBatchTxs(allTxs, chainID)
+	require.NoError(t, err)
+
+	require.Equal(t, iterativeSBTX, fullSBTX)
+}
 
 func TestSpanBatchTxsRecoverV(t *testing.T) {
 	rng := rand.New(rand.NewSource(0x123))
diff --git a/op-node/rollup/derive/span_batch_util.go b/op-node/rollup/derive/span_batch_util.go
index 7b96cd784f78..04092d3c2b56 100644
--- a/op-node/rollup/derive/span_batch_util.go
+++ b/op-node/rollup/derive/span_batch_util.go
@@ -17,10 +17,6 @@ func decodeSpanBatchBits(r *bytes.Reader, bitLength uint64) (*big.Int, error) {
 	if bitLength%8 != 0 {
 		bufLen++
 	}
-	// avoid out of memory before allocation
-	if bufLen > MaxSpanBatchSize {
-		return nil, ErrTooBigSpanBatchSize
-	}
 	buf := make([]byte, bufLen)
 	_, err := io.ReadFull(r, buf)
 	if err != nil {
@@ -48,9 +44,6 @@ func encodeSpanBatchBits(w io.Writer, bitLength uint64, bits *big.Int) error {
 	if bitLength%8 != 0 { // rounding up this way is safe against overflows
 		bufLen++
 	}
-	if bufLen > MaxSpanBatchSize {
-		return ErrTooBigSpanBatchSize
-	}
 	buf := make([]byte, bufLen)
 	bits.FillBytes(buf) // zero-extended, big-endian
 	if _, err := w.Write(buf); err != nil {
diff --git a/op-node/rollup/derive/span_channel_out.go b/op-node/rollup/derive/span_channel_out.go
index 362272a44e21..8e02b553781a 100644
--- a/op-node/rollup/derive/span_channel_out.go
+++ b/op-node/rollup/derive/span_channel_out.go
@@ -2,9 +2,11 @@ package derive
 
 import (
 	"bytes"
+
 	"crypto/rand"
 	"fmt"
 	"io"
+	"math/big"
 
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/rlp"
@@ -16,34 +18,49 @@ type SpanChannelOut struct {
 	id ChannelID
 	// Frame ID of the next frame to emit. Increment after emitting
 	frame uint64
-	// rlpLength is the uncompressed size of the channel. Must be less than MAX_RLP_BYTES_PER_CHANNEL
-	rlpLength int
-
-	// Compressor stage. Write input data to it
-	compress Compressor
+	// rlp is the encoded, uncompressed data of the channel. length must be less than MAX_RLP_BYTES_PER_CHANNEL
+	// it is a double buffer to allow us to "undo" the last change to the RLP structure when the target size is exceeded
+	rlp [2]*bytes.Buffer
+	// rlpIndex is the index of the current rlp buffer
+	rlpIndex int
+	// lastCompressedRLPSize tracks the *uncompressed* size of the last RLP buffer that was compressed
+	// it is used to measure the growth of the RLP buffer when adding a new batch to optimize compression
+	lastCompressedRLPSize int
+	// the compressor for the channel
+	compressor ChannelCompressor
+	// target is the target size of the compressed data
+	target uint64
 	// closed indicates if the channel is closed
 	closed bool
-	// spanBatchBuilder contains information requires to build SpanBatch
-	spanBatchBuilder *SpanBatchBuilder
-	// reader contains compressed data for making output frames
-	reader *bytes.Buffer
+	// full indicates if the channel is full
+	full error
+	// spanBatch is the batch being built, which immutably holds genesis timestamp and chain ID, but otherwise can be reset
+	spanBatch *SpanBatch
 }
 
 func (co *SpanChannelOut) ID() ChannelID {
 	return co.id
 }
 
-func NewSpanChannelOut(compress Compressor, spanBatchBuilder *SpanBatchBuilder) (*SpanChannelOut, error) {
+func (co *SpanChannelOut) setRandomID() error {
+	_, err := rand.Read(co.id[:])
+	return err
+}
+
+func NewSpanChannelOut(genesisTimestamp uint64, chainID *big.Int, targetOutputSize uint64, compressionAlgo CompressionAlgo) (*SpanChannelOut, error) {
 	c := &SpanChannelOut{
-		id:               ChannelID{},
-		frame:            0,
-		rlpLength:        0,
-		compress:         compress,
-		spanBatchBuilder: spanBatchBuilder,
-		reader:           &bytes.Buffer{},
-	}
-	_, err := rand.Read(c.id[:])
-	if err != nil {
+		id:        ChannelID{},
+		frame:     0,
+		spanBatch: NewSpanBatch(genesisTimestamp, chainID),
+		rlp:       [2]*bytes.Buffer{{}, {}},
+		target:    targetOutputSize,
+	}
+	var err error
+	if err = c.setRandomID(); err != nil {
+		return nil, err
+	}
+
+	if c.compressor, err = NewChannelCompressor(compressionAlgo); err != nil {
 		return nil, err
 	}
 
@@ -51,138 +68,167 @@ func NewSpanChannelOut(compress Compressor, spanBatchBuilder *SpanBatchBuilder)
 }
 
 func (co *SpanChannelOut) Reset() error {
-	co.frame = 0
-	co.rlpLength = 0
-	co.compress.Reset()
-	co.reader.Reset()
 	co.closed = false
-	co.spanBatchBuilder.Reset()
-	_, err := rand.Read(co.id[:])
-	return err
+	co.full = nil
+	co.frame = 0
+	co.rlp[0].Reset()
+	co.rlp[1].Reset()
+	co.lastCompressedRLPSize = 0
+	co.compressor.Reset()
+	co.spanBatch = NewSpanBatch(co.spanBatch.GenesisTimestamp, co.spanBatch.ChainID)
+	// setting the new randomID is the only part of the reset that can fail
+	return co.setRandomID()
 }
 
-// AddBlock adds a block to the channel. It returns the RLP encoded byte size
-// and an error if there is a problem adding the block. The only sentinel error
+// activeRLP returns the active RLP buffer using the current rlpIndex
+func (co *SpanChannelOut) activeRLP() *bytes.Buffer {
+	return co.rlp[co.rlpIndex]
+}
+
+// inactiveRLP returns the inactive RLP buffer using the current rlpIndex
+func (co *SpanChannelOut) inactiveRLP() *bytes.Buffer {
+	return co.rlp[(co.rlpIndex+1)%2]
+}
+
+// swapRLP switches the active and inactive RLP buffers by modifying the rlpIndex
+func (co *SpanChannelOut) swapRLP() {
+	co.rlpIndex = (co.rlpIndex + 1) % 2
+}
+
+// AddBlock adds a block to the channel.
+// returns an error if there is a problem adding the block. The only sentinel error
 // that it returns is ErrTooManyRLPBytes. If this error is returned, the channel
 // should be closed and a new one should be made.
-func (co *SpanChannelOut) AddBlock(rollupCfg *rollup.Config, block *types.Block) (uint64, error) {
+func (co *SpanChannelOut) AddBlock(rollupCfg *rollup.Config, block *types.Block) error {
 	if co.closed {
-		return 0, ErrChannelOutAlreadyClosed
+		return ErrChannelOutAlreadyClosed
 	}
 
 	batch, l1Info, err := BlockToSingularBatch(rollupCfg, block)
 	if err != nil {
-		return 0, err
+		return err
 	}
 	return co.AddSingularBatch(batch, l1Info.SequenceNumber)
 }
 
-// AddSingularBatch adds a batch to the channel. It returns the RLP encoded byte size
-// and an error if there is a problem adding the batch. The only sentinel error
-// that it returns is ErrTooManyRLPBytes. If this error is returned, the channel
-// should be closed and a new one should be made.
-//
-// AddSingularBatch should be used together with BlockToSingularBatch if you need to access the
-// BatchData before adding a block to the channel. It isn't possible to access
-// the batch data with AddBlock.
-//
-// SingularBatch is appended to the channel's SpanBatch.
-// A channel can have only one SpanBatch. And compressed results should not be accessible until the channel is closed, since the prefix and payload can be changed.
-// So it resets channel contents and rewrites the entire SpanBatch each time, and compressed results are copied to reader after the channel is closed.
-// It makes we can only get frames once the channel is full or closed, in the case of SpanBatch.
-func (co *SpanChannelOut) AddSingularBatch(batch *SingularBatch, seqNum uint64) (uint64, error) {
+// AddSingularBatch adds a SingularBatch to the channel, compressing the data if necessary.
+// if the new batch would make the channel exceed the target size, the last batch is reverted,
+// and the compression happens on the previous RLP buffer instead
+// if the input is too small to need compression, data is accumulated but not compressed
+func (co *SpanChannelOut) AddSingularBatch(batch *SingularBatch, seqNum uint64) error {
+	// sentinel error for closed or full channel
 	if co.closed {
-		return 0, ErrChannelOutAlreadyClosed
+		return ErrChannelOutAlreadyClosed
 	}
-	if co.FullErr() != nil {
-		// channel is already full
-		return 0, co.FullErr()
-	}
-	var buf bytes.Buffer
-	// Append Singular batch to its span batch builder
-	co.spanBatchBuilder.AppendSingularBatch(batch, seqNum)
-	// Convert Span batch to RawSpanBatch
-	rawSpanBatch, err := co.spanBatchBuilder.GetRawSpanBatch()
+	if err := co.FullErr(); err != nil {
+		return err
+	}
+
+	// update the SpanBatch with the SingularBatch
+	if err := co.spanBatch.AppendSingularBatch(batch, seqNum); err != nil {
+		return fmt.Errorf("failed to append SingularBatch to SpanBatch: %w", err)
+	}
+	// convert Span batch to RawSpanBatch
+	rawSpanBatch, err := co.spanBatch.ToRawSpanBatch()
 	if err != nil {
-		return 0, fmt.Errorf("failed to convert SpanBatch into RawSpanBatch: %w", err)
+		return fmt.Errorf("failed to convert SpanBatch into RawSpanBatch: %w", err)
 	}
-	// Encode RawSpanBatch into bytes
-	if err = rlp.Encode(&buf, NewBatchData(rawSpanBatch)); err != nil {
-		return 0, fmt.Errorf("failed to encode RawSpanBatch into bytes: %w", err)
+
+	// switch to the other buffer and reset it for new use
+	// (the RLP buffer which is being made inactive holds the RLP encoded span batch just before the new batch was added)
+	co.swapRLP()
+	co.activeRLP().Reset()
+	if err = rlp.Encode(co.activeRLP(), NewBatchData(rawSpanBatch)); err != nil {
+		return fmt.Errorf("failed to encode RawSpanBatch into bytes: %w", err)
 	}
-	// Ensure that the total size of all RLP elements is less than or equal to MAX_RLP_BYTES_PER_CHANNEL
-	if buf.Len() > MaxRLPBytesPerChannel {
-		return 0, fmt.Errorf("could not take %d bytes as replacement of channel of %d bytes, max is %d. err: %w",
-			buf.Len(), co.rlpLength, MaxRLPBytesPerChannel, ErrTooManyRLPBytes)
+
+	// check the RLP length against the max
+	if co.activeRLP().Len() > rollup.SafeMaxRLPBytesPerChannel {
+		return fmt.Errorf("could not take %d bytes as replacement of channel of %d bytes, max is %d. err: %w",
+			co.activeRLP().Len(), co.inactiveRLP().Len(), rollup.SafeMaxRLPBytesPerChannel, ErrTooManyRLPBytes)
 	}
-	co.rlpLength = buf.Len()
 
-	if co.spanBatchBuilder.GetBlockCount() > 1 {
-		// Flush compressed data into reader to preserve current result.
-		// If the channel is full after this block is appended, we should use preserved data.
-		if err := co.compress.Flush(); err != nil {
-			return 0, fmt.Errorf("failed to flush compressor: %w", err)
-		}
-		_, err = io.Copy(co.reader, co.compress)
-		if err != nil {
-			// Must reset reader to avoid partial output
-			co.reader.Reset()
-			return 0, fmt.Errorf("failed to copy compressed data to reader: %w", err)
-		}
+	// if the compressed data *plus* the new rlp data is under the target size, return early
+	// this optimizes out cases where the compressor will obviously come in under the target size
+	rlpGrowth := co.activeRLP().Len() - co.lastCompressedRLPSize
+	if uint64(co.compressor.Len()+rlpGrowth) < co.target {
+		return nil
 	}
 
-	// Reset compressor to rewrite the entire span batch
-	co.compress.Reset()
-	// Avoid using io.Copy here, because we need all or nothing
-	written, err := co.compress.Write(buf.Bytes())
-	if co.compress.FullErr() != nil {
-		err = co.compress.FullErr()
-		if co.spanBatchBuilder.GetBlockCount() == 1 {
-			// Do not return CompressorFullErr for the first block in the batch
-			// In this case, reader must be empty. then the contents of compressor will be copied to reader when the channel is closed.
-			err = nil
+	// we must compress the data to check if we've met or exceeded the target size
+	if err = co.compress(); err != nil {
+		return err
+	}
+	co.lastCompressedRLPSize = co.activeRLP().Len()
+
+	// if the channel is now full, either return the compressed data, or the compressed previous data
+	if err := co.FullErr(); err != nil {
+		// if there is only one batch in the channel, it *must* be returned
+		if len(co.spanBatch.Batches) == 1 {
+			return nil
+		}
+
+		// if there is more than one batch in the channel, we revert the last batch
+		// by switching the RLP buffer and doing a fresh compression
+		co.swapRLP()
+		if err := co.compress(); err != nil {
+			return err
 		}
-		// If there are more than one blocks in the channel, reader should have data that preserves previous compression result before adding this block.
-		// So, as a result, this block is not added to the channel and the channel will be closed.
-		return uint64(written), err
+		// return the full error
+		return err
 	}
 
-	// If compressor is not full yet, reader must be reset to avoid submitting invalid frames
-	co.reader.Reset()
-	return uint64(written), err
+	return nil
+}
+
+// compress compresses the active RLP buffer and checks if the compressed data is over the target size.
+// it resets all the compression buffers because Span Batches aren't meant to be compressed incrementally.
+func (co *SpanChannelOut) compress() error {
+	co.compressor.Reset()
+	if _, err := co.compressor.Write(co.activeRLP().Bytes()); err != nil {
+		return err
+	}
+	if err := co.compressor.Close(); err != nil {
+		return err
+	}
+	co.checkFull()
+	return nil
 }
 
 // InputBytes returns the total amount of RLP-encoded input bytes.
 func (co *SpanChannelOut) InputBytes() int {
-	return co.rlpLength
+	return co.activeRLP().Len()
 }
 
-// ReadyBytes returns the number of bytes that the channel out can immediately output into a frame.
-// Use `Flush` or `Close` to move data from the compression buffer into the ready buffer if more bytes
-// are needed. Add blocks may add to the ready buffer, but it is not guaranteed due to the compression stage.
+// ReadyBytes returns the total amount of compressed bytes that are ready to be output.
+// Span Channel Out does not provide early output, so this will always be 0 until the channel is closed or full
 func (co *SpanChannelOut) ReadyBytes() int {
-	return co.reader.Len()
+	if co.closed || co.FullErr() != nil {
+		return co.compressor.Len()
+	}
+	return 0
 }
 
-// Flush flushes the internal compression stage to the ready buffer. It enables pulling a larger & more
-// complete frame. It reduces the compression efficiency.
+// Flush implements the Channel Out
+// Span Channel Out manages the flushing of the compressor internally, so this is a no-op
 func (co *SpanChannelOut) Flush() error {
-	if err := co.compress.Flush(); err != nil {
-		return err
+	return nil
+}
+
+// checkFull sets the full error if the compressed data is over the target size.
+// the error is only set once, and the channel is considered full from that point on
+func (co *SpanChannelOut) checkFull() {
+	// if the channel is already full, don't update further
+	if co.full != nil {
+		return
 	}
-	if co.closed && co.ReadyBytes() == 0 && co.compress.Len() > 0 {
-		_, err := io.Copy(co.reader, co.compress)
-		if err != nil {
-			// Must reset reader to avoid partial output
-			co.reader.Reset()
-			return fmt.Errorf("failed to flush compressed data to reader: %w", err)
-		}
+	if uint64(co.compressor.Len()) >= co.target {
+		co.full = ErrCompressorFull
 	}
-	return nil
 }
 
 func (co *SpanChannelOut) FullErr() error {
-	return co.compress.FullErr()
+	return co.full
 }
 
 func (co *SpanChannelOut) Close() error {
@@ -190,10 +236,14 @@ func (co *SpanChannelOut) Close() error {
 		return ErrChannelOutAlreadyClosed
 	}
 	co.closed = true
-	if err := co.Flush(); err != nil {
-		return err
+	// if the channel was already full,
+	// the compressor is already flushed and closed
+	if co.FullErr() != nil {
+		return nil
 	}
-	return co.compress.Close()
+	// if this channel is not full, we need to compress the last batch
+	// this also flushes/closes the compressor
+	return co.compress()
 }
 
 // OutputFrame writes a frame to w with a given max size and returns the frame
@@ -211,7 +261,7 @@ func (co *SpanChannelOut) OutputFrame(w *bytes.Buffer, maxSize uint64) (uint16,
 
 	f := createEmptyFrame(co.id, co.frame, co.ReadyBytes(), co.closed, maxSize)
 
-	if _, err := io.ReadFull(co.reader, f.Data); err != nil {
+	if _, err := io.ReadFull(co.compressor.GetCompressed(), f.Data); err != nil {
 		return 0, err
 	}
 
diff --git a/op-node/rollup/derive/test/random.go b/op-node/rollup/derive/test/random.go
index c0f512b49588..57ad0d8d9579 100644
--- a/op-node/rollup/derive/test/random.go
+++ b/op-node/rollup/derive/test/random.go
@@ -3,6 +3,7 @@ package test
 import (
 	"math/big"
 	"math/rand"
+	"time"
 
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
@@ -14,9 +15,8 @@ import (
 
 // RandomL2Block returns a random block whose first transaction is a random pre-Ecotone upgrade
 // L1 Info Deposit transaction.
-func RandomL2Block(rng *rand.Rand, txCount int) (*types.Block, []*types.Receipt) {
-	l1Block := types.NewBlock(testutils.RandomHeader(rng),
-		nil, nil, nil, trie.NewStackTrie(nil))
+func RandomL2Block(rng *rand.Rand, txCount int, t time.Time) (*types.Block, []*types.Receipt) {
+	l1Block := types.NewBlock(testutils.RandomHeader(rng), nil, nil, nil, trie.NewStackTrie(nil))
 	rollupCfg := rollup.Config{}
 	if testutils.RandomBool(rng) {
 		t := uint64(0)
@@ -26,12 +26,21 @@ func RandomL2Block(rng *rand.Rand, txCount int) (*types.Block, []*types.Receipt)
 	if err != nil {
 		panic("L1InfoDeposit: " + err.Error())
 	}
-	return testutils.RandomBlockPrependTxs(rng, txCount, types.NewTx(l1InfoTx))
+	if t.IsZero() {
+		return testutils.RandomBlockPrependTxs(rng, txCount, types.NewTx(l1InfoTx))
+	} else {
+		return testutils.RandomBlockPrependTxsWithTime(rng, txCount, uint64(t.Unix()), types.NewTx(l1InfoTx))
+	}
+
 }
 
 func RandomL2BlockWithChainId(rng *rand.Rand, txCount int, chainId *big.Int) *types.Block {
+	return RandomL2BlockWithChainIdAndTime(rng, txCount, chainId, time.Time{})
+}
+
+func RandomL2BlockWithChainIdAndTime(rng *rand.Rand, txCount int, chainId *big.Int, t time.Time) *types.Block {
 	signer := types.NewLondonSigner(chainId)
-	block, _ := RandomL2Block(rng, 0)
+	block, _ := RandomL2Block(rng, 0, t)
 	txs := []*types.Transaction{block.Transactions()[0]} // L1 info deposit TX
 	for i := 0; i < txCount; i++ {
 		txs = append(txs, testutils.RandomTx(rng, big.NewInt(int64(rng.Uint32())), signer))
diff --git a/op-node/rollup/derive/types.go b/op-node/rollup/derive/types.go
new file mode 100644
index 000000000000..fb28d80a012f
--- /dev/null
+++ b/op-node/rollup/derive/types.go
@@ -0,0 +1,70 @@
+package derive
+
+import (
+	"fmt"
+	"regexp"
+)
+
+type CompressionAlgo string
+
+const (
+	// compression algo types
+	Zlib     CompressionAlgo = "zlib"
+	Brotli   CompressionAlgo = "brotli" // default level
+	Brotli9  CompressionAlgo = "brotli-9"
+	Brotli10 CompressionAlgo = "brotli-10"
+	Brotli11 CompressionAlgo = "brotli-11"
+)
+
+var CompressionAlgos = []CompressionAlgo{
+	Zlib,
+	Brotli,
+	Brotli9,
+	Brotli10,
+	Brotli11,
+}
+
+var brotliRegexp = regexp.MustCompile(`^brotli(|-(9|10|11))$`)
+
+func (algo CompressionAlgo) String() string {
+	return string(algo)
+}
+
+func (algo *CompressionAlgo) Set(value string) error {
+	if !ValidCompressionAlgo(CompressionAlgo(value)) {
+		return fmt.Errorf("unknown compression algo type: %q", value)
+	}
+	*algo = CompressionAlgo(value)
+	return nil
+}
+
+func (algo *CompressionAlgo) Clone() any {
+	cpy := *algo
+	return &cpy
+}
+
+func (algo *CompressionAlgo) IsBrotli() bool {
+	return brotliRegexp.MatchString(algo.String())
+}
+
+func GetBrotliLevel(algo CompressionAlgo) int {
+	switch algo {
+	case Brotli9:
+		return 9
+	case Brotli10, Brotli: // make level 10 the default
+		return 10
+	case Brotli11:
+		return 11
+	default:
+		panic("Unsupported brotli level")
+	}
+}
+
+func ValidCompressionAlgo(value CompressionAlgo) bool {
+	for _, k := range CompressionAlgos {
+		if k == value {
+			return true
+		}
+	}
+	return false
+}
diff --git a/op-node/rollup/derive/types_test.go b/op-node/rollup/derive/types_test.go
new file mode 100644
index 000000000000..3b9be6430482
--- /dev/null
+++ b/op-node/rollup/derive/types_test.go
@@ -0,0 +1,73 @@
+package derive
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+func TestCompressionAlgo(t *testing.T) {
+	testCases := []struct {
+		name                       string
+		algo                       CompressionAlgo
+		isValidCompressionAlgoType bool
+		isBrotli                   bool
+		brotliLevel                int
+	}{
+		{
+			name:                       "zlib",
+			algo:                       Zlib,
+			isValidCompressionAlgoType: true,
+			isBrotli:                   false,
+		},
+		{
+			name:                       "brotli",
+			algo:                       Brotli,
+			isValidCompressionAlgoType: true,
+			isBrotli:                   true,
+			brotliLevel:                10,
+		},
+		{
+			name:                       "brotli-9",
+			algo:                       Brotli9,
+			isValidCompressionAlgoType: true,
+			isBrotli:                   true,
+			brotliLevel:                9,
+		},
+		{
+			name:                       "brotli-10",
+			algo:                       Brotli10,
+			isValidCompressionAlgoType: true,
+			isBrotli:                   true,
+			brotliLevel:                10,
+		},
+		{
+			name:                       "brotli-11",
+			algo:                       Brotli11,
+			isValidCompressionAlgoType: true,
+			isBrotli:                   true,
+			brotliLevel:                11,
+		},
+		{
+			name:                       "invalid",
+			algo:                       CompressionAlgo("invalid"),
+			isValidCompressionAlgoType: false,
+			isBrotli:                   false,
+		},
+	}
+
+	for _, tc := range testCases {
+		t.Run(tc.name, func(t *testing.T) {
+			require.Equal(t, tc.isBrotli, tc.algo.IsBrotli())
+			if tc.isBrotli {
+				require.NotPanics(t, func() {
+					blvl := GetBrotliLevel((tc.algo))
+					require.Equal(t, tc.brotliLevel, blvl)
+				})
+			} else {
+				require.Panics(t, func() { GetBrotliLevel(tc.algo) })
+			}
+			require.Equal(t, tc.isValidCompressionAlgoType, ValidCompressionAlgo(tc.algo))
+		})
+	}
+}
diff --git a/op-node/rollup/driver/conf_depth.go b/op-node/rollup/driver/conf_depth.go
index 029cd630469e..194692bf39db 100644
--- a/op-node/rollup/driver/conf_depth.go
+++ b/op-node/rollup/driver/conf_depth.go
@@ -31,7 +31,7 @@ func (c *confDepth) L1BlockRefByNumber(ctx context.Context, num uint64) (eth.L1B
 	// TODO: performance optimization: buffer the l1Unsafe, invalidate any reorged previous buffer content,
 	// and instantly return the origin by number from the buffer if we can.
 
-	// Don't apply the conf depth is l1Head is empty (as it is during the startup case before the l1State is initialized).
+	// Don't apply the conf depth if l1Head is empty (as it is during the startup case before the l1State is initialized).
 	l1Head := c.l1Head()
 	if l1Head == (eth.L1BlockRef{}) {
 		return c.L1Fetcher.L1BlockRefByNumber(ctx, num)
diff --git a/op-node/rollup/driver/origin_selector.go b/op-node/rollup/driver/origin_selector.go
index 8dd041d051ff..ea4828980928 100644
--- a/op-node/rollup/driver/origin_selector.go
+++ b/op-node/rollup/driver/origin_selector.go
@@ -19,17 +19,19 @@ type L1Blocks interface {
 }
 
 type L1OriginSelector struct {
-	log log.Logger
-	cfg *rollup.Config
+	log  log.Logger
+	cfg  *rollup.Config
+	spec *rollup.ChainSpec
 
 	l1 L1Blocks
 }
 
 func NewL1OriginSelector(log log.Logger, cfg *rollup.Config, l1 L1Blocks) *L1OriginSelector {
 	return &L1OriginSelector{
-		log: log,
-		cfg: cfg,
-		l1:  l1,
+		log:  log,
+		cfg:  cfg,
+		spec: rollup.NewChainSpec(cfg),
+		l1:   l1,
 	}
 }
 
@@ -42,12 +44,13 @@ func (los *L1OriginSelector) FindL1Origin(ctx context.Context, l2Head eth.L2Bloc
 	if err != nil {
 		return eth.L1BlockRef{}, err
 	}
+	msd := los.spec.MaxSequencerDrift(currentOrigin.Time)
 	log := los.log.New("current", currentOrigin, "current_time", currentOrigin.Time,
-		"l2_head", l2Head, "l2_head_time", l2Head.Time)
+		"l2_head", l2Head, "l2_head_time", l2Head.Time, "max_seq_drift", msd)
 
 	// If we are past the sequencer depth, we may want to advance the origin, but need to still
 	// check the time of the next origin.
-	pastSeqDrift := l2Head.Time+los.cfg.BlockTime > currentOrigin.Time+los.cfg.MaxSequencerDrift
+	pastSeqDrift := l2Head.Time+los.cfg.BlockTime > currentOrigin.Time+msd
 	if pastSeqDrift {
 		log.Warn("Next L2 block time is past the sequencer drift + current origin time")
 	}
diff --git a/op-node/rollup/driver/origin_selector_test.go b/op-node/rollup/driver/origin_selector_test.go
index 1ddfb8840ee8..55f67fce8be8 100644
--- a/op-node/rollup/driver/origin_selector_test.go
+++ b/op-node/rollup/driver/origin_selector_test.go
@@ -8,6 +8,7 @@ import (
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
 	"github.com/ethereum-optimism/optimism/op-service/testutils"
+	"github.com/ethereum/go-ethereum"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
@@ -176,6 +177,42 @@ func TestOriginSelectorStrictConfDepth(t *testing.T) {
 	require.ErrorContains(t, err, "sequencer time drift")
 }
 
+func u64ptr(n uint64) *uint64 {
+	return &n
+}
+
+// TestOriginSelector_FjordSeqDrift has a similar setup to the previous test
+// TestOriginSelectorStrictConfDepth but with Fjord activated at the l1 origin.
+// This time the same L1 origin is returned if no new L1 head is seen, instead of an error,
+// because the Fjord max sequencer drift is higher.
+func TestOriginSelector_FjordSeqDrift(t *testing.T) {
+	log := testlog.Logger(t, log.LevelCrit)
+	cfg := &rollup.Config{
+		MaxSequencerDrift: 8,
+		BlockTime:         2,
+		FjordTime:         u64ptr(20), // a's timestamp
+	}
+	l1 := &testutils.MockL1Source{}
+	defer l1.AssertExpectations(t)
+	a := eth.L1BlockRef{
+		Hash:   common.Hash{'a'},
+		Number: 10,
+		Time:   20,
+	}
+	l2Head := eth.L2BlockRef{
+		L1Origin: a.ID(),
+		Time:     27, // next L2 block time would be past pre-Fjord seq drift
+	}
+
+	l1.ExpectL1BlockRefByHash(a.Hash, a, nil)
+	l1.ExpectL1BlockRefByNumber(a.Number+1, eth.L1BlockRef{}, ethereum.NotFound)
+	s := NewL1OriginSelector(log, cfg, l1)
+
+	l1O, err := s.FindL1Origin(context.Background(), l2Head)
+	require.NoError(t, err, "with Fjord activated, have increased max seq drift")
+	require.Equal(t, a, l1O)
+}
+
 // TestOriginSelectorSeqDriftRespectsNextOriginTime
 //
 // There are 2 L1 blocks at time 20 & 100. The L2 Head is at time 27.
diff --git a/op-node/rollup/driver/sequencer.go b/op-node/rollup/driver/sequencer.go
index 135591b76749..b46db64b1a0e 100644
--- a/op-node/rollup/driver/sequencer.go
+++ b/op-node/rollup/driver/sequencer.go
@@ -35,6 +35,7 @@ type SequencerMetrics interface {
 type Sequencer struct {
 	log       log.Logger
 	rollupCfg *rollup.Config
+	spec      *rollup.ChainSpec
 
 	engine derive.EngineControl
 
@@ -53,6 +54,7 @@ func NewSequencer(log log.Logger, rollupCfg *rollup.Config, engine derive.Engine
 	return &Sequencer{
 		log:              log,
 		rollupCfg:        rollupCfg,
+		spec:             rollup.NewChainSpec(rollupCfg),
 		engine:           engine,
 		timeNow:          time.Now,
 		attrBuilder:      attributesBuilder,
@@ -91,7 +93,7 @@ func (d *Sequencer) StartBuildingBlock(ctx context.Context) error {
 	// empty blocks (other than the L1 info deposit and any user deposits). We handle this by
 	// setting NoTxPool to true, which will cause the Sequencer to not include any transactions
 	// from the transaction pool.
-	attrs.NoTxPool = uint64(attrs.Timestamp) > l1Origin.Time+d.rollupCfg.MaxSequencerDrift
+	attrs.NoTxPool = uint64(attrs.Timestamp) > l1Origin.Time+d.spec.MaxSequencerDrift(l1Origin.Time)
 
 	// For the Ecotone activation block we shouldn't include any sequencer transactions.
 	if d.rollupCfg.IsEcotoneActivationBlock(uint64(attrs.Timestamp)) {
@@ -99,6 +101,12 @@ func (d *Sequencer) StartBuildingBlock(ctx context.Context) error {
 		d.log.Info("Sequencing Ecotone upgrade block")
 	}
 
+	// For the Fjord activation block we shouldn't include any sequencer transactions.
+	if d.rollupCfg.IsFjordActivationBlock(uint64(attrs.Timestamp)) {
+		attrs.NoTxPool = true
+		d.log.Info("Sequencing Fjord upgrade block")
+	}
+
 	d.log.Debug("prepared attributes for new block",
 		"num", l2Head.Number+1, "time", uint64(attrs.Timestamp),
 		"origin", l1Origin, "origin_time", l1Origin.Time, "noTxPool", attrs.NoTxPool)
@@ -132,10 +140,11 @@ func (d *Sequencer) CancelBuildingBlock(ctx context.Context) {
 
 // PlanNextSequencerAction returns a desired delay till the RunNextSequencerAction call.
 func (d *Sequencer) PlanNextSequencerAction() time.Duration {
+	buildingOnto, buildingID, safe := d.engine.BuildingPayload()
 	// If the engine is busy building safe blocks (and thus changing the head that we would sync on top of),
 	// then give it time to sync up.
-	if onto, _, safe := d.engine.BuildingPayload(); safe {
-		d.log.Warn("delaying sequencing to not interrupt safe-head changes", "onto", onto, "onto_time", onto.Time)
+	if safe {
+		d.log.Warn("delaying sequencing to not interrupt safe-head changes", "onto", buildingOnto, "onto_time", buildingOnto.Time)
 		// approximates the worst-case time it takes to build a block, to reattempt sequencing after.
 		return time.Second * time.Duration(d.rollupCfg.BlockTime)
 	}
@@ -143,8 +152,6 @@ func (d *Sequencer) PlanNextSequencerAction() time.Duration {
 	head := d.engine.UnsafeL2Head()
 	now := d.timeNow()
 
-	buildingOnto, buildingID, _ := d.engine.BuildingPayload()
-
 	// We may have to wait till the next sequencing action, e.g. upon an error.
 	// If the head changed we need to respond and will not delay the sequencing.
 	if delay := d.nextAction.Sub(now); delay > 0 && buildingOnto.Hash == head.Hash {
diff --git a/op-node/rollup/output_root.go b/op-node/rollup/output_root.go
index 6144aa343182..aa84dfb6acbf 100644
--- a/op-node/rollup/output_root.go
+++ b/op-node/rollup/output_root.go
@@ -3,7 +3,7 @@ package rollup
 import (
 	"errors"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-node/bindings"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 )
 
diff --git a/op-node/rollup/superchain.go b/op-node/rollup/superchain.go
index 9c8ff2b8cb4a..3cafdf91ace0 100644
--- a/op-node/rollup/superchain.go
+++ b/op-node/rollup/superchain.go
@@ -15,18 +15,6 @@ import (
 var OPStackSupport = params.ProtocolVersionV0{Build: [8]byte{}, Major: 6, Minor: 0, Patch: 0, PreRelease: 0}.Encode()
 
 const (
-	opMainnet = 10
-	opGoerli  = 420
-	opSepolia = 11155420
-
-	labsGoerliDevnet   = 997
-	labsGoerliChaosnet = 888
-	labsSepoliaDevnet0 = 11155421
-
-	baseGoerli  = 84531
-	baseMainnet = 8453
-
-	pgnMainnet = 424
 	pgnSepolia = 58008
 )
 
@@ -60,20 +48,16 @@ func LoadOPStackRollupConfig(chainID uint64) (*Config, error) {
 		return nil, fmt.Errorf("unable to retrieve deposit contract address")
 	}
 
-	regolithTime := uint64(0)
-	// three goerli testnets test-ran Bedrock and later upgraded to Regolith.
-	// All other OP-Stack chains have Regolith enabled from the start.
-	switch chainID {
-	case baseGoerli:
-		regolithTime = 1683219600
-	case opGoerli:
-		regolithTime = 1679079600
-	case labsGoerliDevnet:
-		regolithTime = 1677984480
-	case labsGoerliChaosnet:
-		regolithTime = 1692156862
+	var plasma *PlasmaConfig
+	if chConfig.Plasma != nil {
+		plasma = &PlasmaConfig{
+			DAChallengeAddress: common.Address(*chConfig.Plasma.DAChallengeAddress),
+			DAChallengeWindow:  *chConfig.Plasma.DAChallengeWindow,
+			DAResolveWindow:    *chConfig.Plasma.DAResolveWindow,
+		}
 	}
 
+	regolithTime := uint64(0)
 	cfg := &Config{
 		Genesis: Genesis{
 			L1: eth.BlockID{
@@ -105,14 +89,12 @@ func LoadOPStackRollupConfig(chainID uint64) (*Config, error) {
 		BatchInboxAddress:      common.Address(chConfig.BatchInboxAddr),
 		DepositContractAddress: common.Address(addrs.OptimismPortalProxy),
 		L1SystemConfigAddress:  common.Address(addrs.SystemConfigProxy),
+		PlasmaConfig:           plasma,
 	}
+
 	if superChain.Config.ProtocolVersionsAddr != nil { // Set optional protocol versions address
 		cfg.ProtocolVersionsAddress = common.Address(*superChain.Config.ProtocolVersionsAddr)
 	}
-	if chainID == labsGoerliDevnet || chainID == labsGoerliChaosnet {
-		cfg.ChannelTimeout = 120
-		cfg.MaxSequencerDrift = 1200
-	}
 	if chainID == pgnSepolia {
 		cfg.MaxSequencerDrift = 1000
 		cfg.SeqWindowSize = 7200
diff --git a/op-node/rollup/sync/config.go b/op-node/rollup/sync/config.go
index 3b0b6b21880e..965d7c127cc4 100644
--- a/op-node/rollup/sync/config.go
+++ b/op-node/rollup/sync/config.go
@@ -14,7 +14,7 @@ type Mode int
 //     It will consolidate the chain as usual. This allows execution clients to snap sync if they are capable of it.
 const (
 	CLSync Mode = iota
-	ELSync Mode = iota
+	ELSync
 )
 
 const (
diff --git a/op-node/rollup/sync/start.go b/op-node/rollup/sync/start.go
index 34d650cec749..f81985bc21c1 100644
--- a/op-node/rollup/sync/start.go
+++ b/op-node/rollup/sync/start.go
@@ -34,6 +34,7 @@ import (
 
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/retry"
 )
 
 type L1Chain interface {
@@ -124,6 +125,7 @@ func FindL2Heads(ctx context.Context, cfg *rollup.Config, l1 L1Chain, l2 L2Chain
 	var ahead bool                                    // when "n", the L2 block, has a L1 origin that is not visible in our L1 chain source yet
 
 	ready := false // when we found the block after the safe head, and we just need to return the parent block.
+	bOff := retry.Exponential()
 
 	// Each loop iteration we traverse further from the unsafe head towards the finalized head.
 	// Once we pass the previous safe head and we have seen enough canonical L1 origins to fill a sequence window worth of data,
@@ -133,7 +135,7 @@ func FindL2Heads(ctx context.Context, cfg *rollup.Config, l1 L1Chain, l2 L2Chain
 		// Fetch L1 information if we never had it, or if we do not have it for the current origin.
 		// Optimization: as soon as we have a previous L1 block, try to traverse L1 by hash instead of by number, to fill the cache.
 		if n.L1Origin.Hash == l1Block.ParentHash {
-			b, err := l1.L1BlockRefByHash(ctx, n.L1Origin.Hash)
+			b, err := retry.Do(ctx, 5, bOff, func() (eth.L1BlockRef, error) { return l1.L1BlockRefByHash(ctx, n.L1Origin.Hash) })
 			if err != nil {
 				// Exit, find-sync start should start over, to move to an available L1 chain with block-by-number / not-found case.
 				return nil, fmt.Errorf("failed to retrieve L1 block: %w", err)
@@ -142,7 +144,7 @@ func FindL2Heads(ctx context.Context, cfg *rollup.Config, l1 L1Chain, l2 L2Chain
 			l1Block = b
 			ahead = false
 		} else if l1Block == (eth.L1BlockRef{}) || n.L1Origin.Hash != l1Block.Hash {
-			b, err := l1.L1BlockRefByNumber(ctx, n.L1Origin.Number)
+			b, err := retry.Do(ctx, 5, bOff, func() (eth.L1BlockRef, error) { return l1.L1BlockRefByNumber(ctx, n.L1Origin.Number) })
 			// if L2 is ahead of L1 view, then consider it a "plausible" head
 			notFound := errors.Is(err, ethereum.NotFound)
 			if err != nil && !notFound {
diff --git a/op-node/rollup/types.go b/op-node/rollup/types.go
index 1ad45272e8aa..816181687567 100644
--- a/op-node/rollup/types.go
+++ b/op-node/rollup/types.go
@@ -25,7 +25,6 @@ var (
 	ErrGenesisHashesSame             = errors.New("achievement get! rollup inception: L1 and L2 genesis cannot be the same")
 	ErrMissingGenesisL2Time          = errors.New("missing L2 genesis time")
 	ErrMissingBatcherAddr            = errors.New("missing genesis system config batcher address")
-	ErrMissingOverhead               = errors.New("missing genesis system config overhead")
 	ErrMissingScalar                 = errors.New("missing genesis system config scalar")
 	ErrMissingGasLimit               = errors.New("missing genesis system config gas limit")
 	ErrMissingBatchInboxAddress      = errors.New("missing batch inbox address")
@@ -50,6 +49,19 @@ type Genesis struct {
 	SystemConfig eth.SystemConfig `json:"system_config"`
 }
 
+type PlasmaConfig struct {
+	// L1 DataAvailabilityChallenge contract proxy address
+	DAChallengeAddress common.Address `json:"da_challenge_contract_address,omitempty"`
+	// CommitmentType specifies which commitment type can be used. Defaults to Keccak (type 0) if not present
+	CommitmentType string `json:"da_commitment_type"`
+	// DA challenge window value set on the DAC contract. Used in plasma mode
+	// to compute when a commitment can no longer be challenged.
+	DAChallengeWindow uint64 `json:"da_challenge_window"`
+	// DA resolve window value set on the DAC contract. Used in plasma mode
+	// to compute when a challenge expires and trigger a reorg if needed.
+	DAResolveWindow uint64 `json:"da_resolve_window"`
+}
+
 type Config struct {
 	// Genesis anchor point of the rollup
 	Genesis Genesis `json:"genesis"`
@@ -60,7 +72,12 @@ type Config struct {
 	//
 	// Note: When L1 has many 1 second consecutive blocks, and L2 grows at fixed 2 seconds,
 	// the L2 time may still grow beyond this difference.
-	MaxSequencerDrift uint64 `json:"max_sequencer_drift"`
+	//
+	// With Fjord, the MaxSequencerDrift becomes a constant. Use the ChainSpec
+	// instead of reading this rollup configuration field directly to determine
+	// the max sequencer drift for a given block based on the block's L1 origin.
+	// Chains that activate Fjord at genesis may leave this field empty.
+	MaxSequencerDrift uint64 `json:"max_sequencer_drift,omitempty"`
 	// Number of epochs (L1 blocks) per sequencing window, including the epoch L1 origin block itself
 	SeqWindowSize uint64 `json:"seq_window_size"`
 	// Number of L1 blocks between when a channel can be opened and when it must be closed by.
@@ -109,19 +126,22 @@ type Config struct {
 	// L1 address that declares the protocol versions, optional (Beta feature)
 	ProtocolVersionsAddress common.Address `json:"protocol_versions_address,omitempty"`
 
+	// Plasma Config. We are in the process of migrating to the PlasmaConfig from these legacy top level values
+	PlasmaConfig *PlasmaConfig `json:"plasma_config,omitempty"`
+
 	// L1 DataAvailabilityChallenge contract proxy address
-	DAChallengeAddress common.Address `json:"da_challenge_address,omitempty"`
+	LegacyDAChallengeAddress common.Address `json:"da_challenge_contract_address,omitempty"`
 
 	// DA challenge window value set on the DAC contract. Used in plasma mode
 	// to compute when a commitment can no longer be challenged.
-	DAChallengeWindow uint64 `json:"da_challenge_window"`
+	LegacyDAChallengeWindow uint64 `json:"da_challenge_window,omitempty"`
 
 	// DA resolve window value set on the DAC contract. Used in plasma mode
 	// to compute when a challenge expires and trigger a reorg if needed.
-	DAResolveWindow uint64 `json:"da_resolve_window"`
+	LegacyDAResolveWindow uint64 `json:"da_resolve_window,omitempty"`
 
-	// UsePlasma is activated when the chain is in plasma mode.
-	UsePlasma bool `json:"use_plasma"`
+	// LegacyUsePlasma is activated when the chain is in plasma mode.
+	LegacyUsePlasma bool `json:"use_plasma,omitempty"`
 }
 
 // ValidateL1Config checks L1 config variables for errors.
@@ -259,9 +279,6 @@ func (cfg *Config) Check() error {
 	if cfg.Genesis.SystemConfig.BatcherAddr == (common.Address{}) {
 		return ErrMissingBatcherAddr
 	}
-	if cfg.Genesis.SystemConfig.Overhead == (eth.Bytes32{}) {
-		return ErrMissingOverhead
-	}
 	if cfg.Genesis.SystemConfig.Scalar == (eth.Bytes32{}) {
 		return ErrMissingScalar
 	}
@@ -289,25 +306,65 @@ func (cfg *Config) Check() error {
 	if cfg.L2ChainID.Sign() < 1 {
 		return ErrL2ChainIDNotPositive
 	}
+	if err := validatePlasmaConfig(cfg); err != nil {
+		return err
+	}
 
-	if err := checkFork(cfg.RegolithTime, cfg.CanyonTime, "regolith", "canyon"); err != nil {
+	if err := checkFork(cfg.RegolithTime, cfg.CanyonTime, Regolith, Canyon); err != nil {
 		return err
 	}
-	if err := checkFork(cfg.CanyonTime, cfg.DeltaTime, "canyon", "delta"); err != nil {
+	if err := checkFork(cfg.CanyonTime, cfg.DeltaTime, Canyon, Delta); err != nil {
 		return err
 	}
-	if err := checkFork(cfg.DeltaTime, cfg.EcotoneTime, "delta", "ecotone"); err != nil {
+	if err := checkFork(cfg.DeltaTime, cfg.EcotoneTime, Delta, Ecotone); err != nil {
 		return err
 	}
-	if err := checkFork(cfg.EcotoneTime, cfg.FjordTime, "ecotone", "fjord"); err != nil {
+	if err := checkFork(cfg.EcotoneTime, cfg.FjordTime, Ecotone, Fjord); err != nil {
 		return err
 	}
 
 	return nil
 }
 
+// validatePlasmaConfig checks the two approaches to configuring plasma mode.
+// If the legacy values are set, they are copied to the new location. If both are set, they are check for consistency.
+func validatePlasmaConfig(cfg *Config) error {
+	if cfg.LegacyUsePlasma && cfg.PlasmaConfig == nil {
+		// copy from top level to plasma config
+		cfg.PlasmaConfig = &PlasmaConfig{
+			DAChallengeAddress: cfg.LegacyDAChallengeAddress,
+			DAChallengeWindow:  cfg.LegacyDAChallengeWindow,
+			DAResolveWindow:    cfg.LegacyDAResolveWindow,
+		}
+	} else if cfg.LegacyUsePlasma && cfg.PlasmaConfig != nil {
+		// validate that both are the same
+		if cfg.LegacyDAChallengeAddress != cfg.PlasmaConfig.DAChallengeAddress {
+			return fmt.Errorf("LegacyDAChallengeAddress (%v) !=  PlasmaConfig.DAChallengeAddress (%v)", cfg.LegacyDAChallengeAddress, cfg.PlasmaConfig.DAChallengeAddress)
+		}
+		if cfg.LegacyDAChallengeWindow != cfg.PlasmaConfig.DAChallengeWindow {
+			return fmt.Errorf("LegacyDAChallengeWindow (%v) !=  PlasmaConfig.DAChallengeWindow (%v)", cfg.LegacyDAChallengeWindow, cfg.PlasmaConfig.DAChallengeWindow)
+		}
+		if cfg.LegacyDAResolveWindow != cfg.PlasmaConfig.DAResolveWindow {
+			return fmt.Errorf("LegacyDAResolveWindow (%v) !=  PlasmaConfig.DAResolveWindow (%v)", cfg.LegacyDAResolveWindow, cfg.PlasmaConfig.DAResolveWindow)
+		}
+		if cfg.PlasmaConfig.CommitmentType != plasma.KeccakCommitmentString {
+			return errors.New("Cannot set CommitmentType with the legacy config")
+		}
+	} else if cfg.PlasmaConfig != nil {
+		if !(cfg.PlasmaConfig.CommitmentType == plasma.KeccakCommitmentString || cfg.PlasmaConfig.CommitmentType == plasma.GenericCommitmentString) {
+			return fmt.Errorf("invalid commitment type: %v", cfg.PlasmaConfig.CommitmentType)
+		}
+		if cfg.PlasmaConfig.CommitmentType == plasma.KeccakCommitmentString && cfg.PlasmaConfig.DAChallengeAddress == (common.Address{}) {
+			return errors.New("Must set da_challenge_contract_address for keccak commitments")
+		} else if cfg.PlasmaConfig.CommitmentType == plasma.GenericCommitmentString && cfg.PlasmaConfig.DAChallengeAddress != (common.Address{}) {
+			return errors.New("Must set empty da_challenge_contract_address for generic commitments")
+		}
+	}
+	return nil
+}
+
 // checkFork checks that fork A is before or at the same time as fork B
-func checkFork(a, b *uint64, aName, bName string) error {
+func checkFork(a, b *uint64, aName, bName ForkName) error {
 	if a == nil && b == nil {
 		return nil
 	}
@@ -347,24 +404,56 @@ func (c *Config) IsEcotone(timestamp uint64) bool {
 	return c.EcotoneTime != nil && timestamp >= *c.EcotoneTime
 }
 
-// IsEcotoneActivationBlock returns whether the specified block is the first block subject to the
-// Ecotone upgrade. Ecotone activation at genesis does not count.
-func (c *Config) IsEcotoneActivationBlock(l2BlockTime uint64) bool {
-	return c.IsEcotone(l2BlockTime) &&
-		l2BlockTime >= c.BlockTime &&
-		!c.IsEcotone(l2BlockTime-c.BlockTime)
-}
-
 // IsFjord returns true if the Fjord hardfork is active at or past the given timestamp.
 func (c *Config) IsFjord(timestamp uint64) bool {
 	return c.FjordTime != nil && timestamp >= *c.FjordTime
 }
 
+// IsFjordActivationBlock returns whether the specified block is the first block subject to the
+// Fjord upgrade.
+func (c *Config) IsFjordActivationBlock(l2BlockTime uint64) bool {
+	return c.IsFjord(l2BlockTime) &&
+		l2BlockTime >= c.BlockTime &&
+		!c.IsFjord(l2BlockTime-c.BlockTime)
+}
+
 // IsInterop returns true if the Interop hardfork is active at or past the given timestamp.
 func (c *Config) IsInterop(timestamp uint64) bool {
 	return c.InteropTime != nil && timestamp >= *c.InteropTime
 }
 
+func (c *Config) IsRegolithActivationBlock(l2BlockTime uint64) bool {
+	return c.IsRegolith(l2BlockTime) &&
+		l2BlockTime >= c.BlockTime &&
+		!c.IsRegolith(l2BlockTime-c.BlockTime)
+}
+
+func (c *Config) IsCanyonActivationBlock(l2BlockTime uint64) bool {
+	return c.IsCanyon(l2BlockTime) &&
+		l2BlockTime >= c.BlockTime &&
+		!c.IsCanyon(l2BlockTime-c.BlockTime)
+}
+
+func (c *Config) IsDeltaActivationBlock(l2BlockTime uint64) bool {
+	return c.IsDelta(l2BlockTime) &&
+		l2BlockTime >= c.BlockTime &&
+		!c.IsDelta(l2BlockTime-c.BlockTime)
+}
+
+// IsEcotoneActivationBlock returns whether the specified block is the first block subject to the
+// Ecotone upgrade. Ecotone activation at genesis does not count.
+func (c *Config) IsEcotoneActivationBlock(l2BlockTime uint64) bool {
+	return c.IsEcotone(l2BlockTime) &&
+		l2BlockTime >= c.BlockTime &&
+		!c.IsEcotone(l2BlockTime-c.BlockTime)
+}
+
+func (c *Config) IsInteropActivationBlock(l2BlockTime uint64) bool {
+	return c.IsInterop(l2BlockTime) &&
+		l2BlockTime >= c.BlockTime &&
+		!c.IsInterop(l2BlockTime-c.BlockTime)
+}
+
 // ForkchoiceUpdatedVersion returns the EngineAPIMethod suitable for the chain hard fork version.
 func (c *Config) ForkchoiceUpdatedVersion(attr *eth.PayloadAttributes) eth.EngineAPIMethod {
 	if attr == nil {
@@ -405,29 +494,38 @@ func (c *Config) GetPayloadVersion(timestamp uint64) eth.EngineAPIMethod {
 	}
 }
 
-// PlasmaConfig validates and returns the plasma config from the rollup config.
-func (c *Config) PlasmaConfig() (plasma.Config, error) {
-	if c.DAChallengeAddress == (common.Address{}) {
-		return plasma.Config{}, fmt.Errorf("missing DAChallengeAddress")
+// GetOPPlasmaConfig validates and returns the plasma config from the rollup config.
+func (c *Config) GetOPPlasmaConfig() (plasma.Config, error) {
+	if c.PlasmaConfig == nil {
+		return plasma.Config{}, errors.New("no plasma config")
 	}
-	if c.DAChallengeWindow == uint64(0) {
-		return plasma.Config{}, fmt.Errorf("missing DAChallengeWindow")
+	if c.PlasmaConfig.DAChallengeWindow == uint64(0) {
+		return plasma.Config{}, errors.New("missing DAChallengeWindow")
 	}
-	if c.DAResolveWindow == uint64(0) {
-		return plasma.Config{}, fmt.Errorf("missing DAResolveWindow")
+	if c.PlasmaConfig.DAResolveWindow == uint64(0) {
+		return plasma.Config{}, errors.New("missing DAResolveWindow")
+	}
+	t, err := plasma.CommitmentTypeFromString(c.PlasmaConfig.CommitmentType)
+	if err != nil {
+		return plasma.Config{}, err
 	}
 	return plasma.Config{
-		DAChallengeContractAddress: c.DAChallengeAddress,
-		ChallengeWindow:            c.DAChallengeWindow,
-		ResolveWindow:              c.DAResolveWindow,
+		DAChallengeContractAddress: c.PlasmaConfig.DAChallengeAddress,
+		ChallengeWindow:            c.PlasmaConfig.DAChallengeWindow,
+		ResolveWindow:              c.PlasmaConfig.DAResolveWindow,
+		CommitmentType:             t,
 	}, nil
 }
 
+func (c *Config) PlasmaEnabled() bool {
+	return c.PlasmaConfig != nil
+}
+
 // SyncLookback computes the number of blocks to walk back in order to find the correct L1 origin.
 // In plasma mode longest possible window is challenge + resolve windows.
 func (c *Config) SyncLookback() uint64 {
-	if c.UsePlasma {
-		if win := (c.DAChallengeWindow + c.DAResolveWindow); win > c.SeqWindowSize {
+	if c.PlasmaEnabled() {
+		if win := (c.PlasmaConfig.DAChallengeWindow + c.PlasmaConfig.DAResolveWindow); win > c.SeqWindowSize {
 			return win
 		}
 	}
@@ -468,6 +566,9 @@ func (c *Config) Description(l2Chains map[string]string) string {
 	banner += fmt.Sprintf("  - Interop: %s\n", fmtForkTimeOrUnset(c.InteropTime))
 	// Report the protocol version
 	banner += fmt.Sprintf("Node supports up to OP-Stack Protocol Version: %s\n", OPStackSupport)
+	if c.PlasmaConfig != nil {
+		banner += fmt.Sprintf("Node supports Plasma Mode with CommitmentType %v\n", c.PlasmaConfig.CommitmentType)
+	}
 	return banner
 }
 
@@ -487,6 +588,7 @@ func (c *Config) LogDescription(log log.Logger, l2Chains map[string]string) {
 	if networkL1 == "" {
 		networkL1 = "unknown L1"
 	}
+
 	log.Info("Rollup Config", "l2_chain_id", c.L2ChainID, "l2_network", networkL2, "l1_chain_id", c.L1ChainID,
 		"l1_network", networkL1, "l2_start_time", c.Genesis.L2Time, "l2_block_hash", c.Genesis.L2.Hash.String(),
 		"l2_block_number", c.Genesis.L2.Number, "l1_block_hash", c.Genesis.L1.Hash.String(),
@@ -496,6 +598,7 @@ func (c *Config) LogDescription(log log.Logger, l2Chains map[string]string) {
 		"ecotone_time", fmtForkTimeOrUnset(c.EcotoneTime),
 		"fjord_time", fmtForkTimeOrUnset(c.FjordTime),
 		"interop_time", fmtForkTimeOrUnset(c.InteropTime),
+		"plasma_mode", c.PlasmaConfig != nil,
 	)
 }
 
diff --git a/op-node/rollup/types_test.go b/op-node/rollup/types_test.go
index 17343430f262..46d232a3ad06 100644
--- a/op-node/rollup/types_test.go
+++ b/op-node/rollup/types_test.go
@@ -147,9 +147,9 @@ func TestRandomConfigDescription(t *testing.T) {
 	})
 	t.Run("named L1", func(t *testing.T) {
 		config := randConfig()
-		config.L1ChainID = big.NewInt(5)
+		config.L1ChainID = big.NewInt(11155111)
 		out := config.Description(map[string]string{config.L2ChainID.String(): "foobar chain"})
-		require.Contains(t, out, "goerli")
+		require.Contains(t, out, "sepolia")
 	})
 	t.Run("unnamed", func(t *testing.T) {
 		config := randConfig()
@@ -180,21 +180,87 @@ func TestRandomConfigDescription(t *testing.T) {
 	})
 }
 
-// TestRegolithActivation tests the activation condition of the Regolith upgrade.
-func TestRegolithActivation(t *testing.T) {
-	config := randConfig()
-	config.RegolithTime = nil
-	require.False(t, config.IsRegolith(0), "false if nil time, even if checking 0")
-	require.False(t, config.IsRegolith(123456), "false if nil time")
-	config.RegolithTime = new(uint64)
-	require.True(t, config.IsRegolith(0), "true at zero")
-	require.True(t, config.IsRegolith(123456), "true for any")
-	x := uint64(123)
-	config.RegolithTime = &x
-	require.False(t, config.IsRegolith(0))
-	require.False(t, config.IsRegolith(122))
-	require.True(t, config.IsRegolith(123))
-	require.True(t, config.IsRegolith(124))
+// TestActivations tests the activation condition of the various upgrades.
+func TestActivations(t *testing.T) {
+	for _, test := range []struct {
+		name           string
+		setUpgradeTime func(t *uint64, c *Config)
+		checkEnabled   func(t uint64, c *Config) bool
+	}{
+		{
+			name: "Regolith",
+			setUpgradeTime: func(t *uint64, c *Config) {
+				c.RegolithTime = t
+			},
+			checkEnabled: func(t uint64, c *Config) bool {
+				return c.IsRegolith(t)
+			},
+		},
+		{
+			name: "Canyon",
+			setUpgradeTime: func(t *uint64, c *Config) {
+				c.CanyonTime = t
+			},
+			checkEnabled: func(t uint64, c *Config) bool {
+				return c.IsCanyon(t)
+			},
+		},
+		{
+			name: "Delta",
+			setUpgradeTime: func(t *uint64, c *Config) {
+				c.DeltaTime = t
+			},
+			checkEnabled: func(t uint64, c *Config) bool {
+				return c.IsDelta(t)
+			},
+		},
+		{
+			name: "Ecotone",
+			setUpgradeTime: func(t *uint64, c *Config) {
+				c.EcotoneTime = t
+			},
+			checkEnabled: func(t uint64, c *Config) bool {
+				return c.IsEcotone(t)
+			},
+		},
+		{
+			name: "Fjord",
+			setUpgradeTime: func(t *uint64, c *Config) {
+				c.FjordTime = t
+			},
+			checkEnabled: func(t uint64, c *Config) bool {
+				return c.IsFjord(t)
+			},
+		},
+		{
+			name: "Interop",
+			setUpgradeTime: func(t *uint64, c *Config) {
+				c.InteropTime = t
+			},
+			checkEnabled: func(t uint64, c *Config) bool {
+				return c.IsInterop(t)
+			},
+		},
+	} {
+		tt := test
+		t.Run(fmt.Sprintf("TestActivations_%s", tt.name), func(t *testing.T) {
+			config := randConfig()
+			test.setUpgradeTime(nil, config)
+			require.False(t, tt.checkEnabled(0, config), "false if nil time, even if checking 0")
+			require.False(t, tt.checkEnabled(123456, config), "false if nil time")
+
+			test.setUpgradeTime(new(uint64), config)
+			require.True(t, tt.checkEnabled(0, config), "true at zero")
+			require.True(t, tt.checkEnabled(123456, config), "true for any")
+
+			x := uint64(123)
+			test.setUpgradeTime(&x, config)
+			require.False(t, tt.checkEnabled(0, config))
+			require.False(t, tt.checkEnabled(122, config))
+			require.True(t, tt.checkEnabled(123, config))
+			require.True(t, tt.checkEnabled(124, config))
+		})
+	}
 }
 
 type mockL2Client struct {
@@ -339,11 +405,6 @@ func TestConfig_Check(t *testing.T) {
 			modifier:    func(cfg *Config) { cfg.Genesis.SystemConfig.BatcherAddr = common.Address{} },
 			expectedErr: ErrMissingBatcherAddr,
 		},
-		{
-			name:        "NoOverhead",
-			modifier:    func(cfg *Config) { cfg.Genesis.SystemConfig.Overhead = eth.Bytes32{} },
-			expectedErr: ErrMissingOverhead,
-		},
 		{
 			name:        "NoScalar",
 			modifier:    func(cfg *Config) { cfg.Genesis.SystemConfig.Scalar = eth.Bytes32{} },
@@ -506,7 +567,6 @@ func TestTimestampForBlock(t *testing.T) {
 			assert.Equal(t, timestamp, test.expectedBlockTime)
 		})
 	}
-
 }
 
 func TestForkchoiceUpdatedVersion(t *testing.T) {
diff --git a/op-node/service.go b/op-node/service.go
index bd7627c97255..707525fc49b7 100644
--- a/op-node/service.go
+++ b/op-node/service.go
@@ -253,6 +253,10 @@ func applyOverrides(ctx *cli.Context, rollupConfig *rollup.Config) {
 		ecotone := ctx.Uint64(opflags.EcotoneOverrideFlagName)
 		rollupConfig.EcotoneTime = &ecotone
 	}
+	if ctx.IsSet(opflags.FjordOverrideFlagName) {
+		fjord := ctx.Uint64(opflags.FjordOverrideFlagName)
+		rollupConfig.FjordTime = &fjord
+	}
 }
 
 func NewSnapshotLogger(ctx *cli.Context) (log.Logger, error) {
@@ -271,7 +275,7 @@ func NewSnapshotLogger(ctx *cli.Context) (log.Logger, error) {
 
 func NewSyncConfig(ctx *cli.Context, log log.Logger) (*sync.Config, error) {
 	if ctx.IsSet(flags.L2EngineSyncEnabled.Name) && ctx.IsSet(flags.SyncModeFlag.Name) {
-		return nil, errors.New("cannot set both --l2.engine-sync and --syncmode at the same time.")
+		return nil, errors.New("cannot set both --l2.engine-sync and --syncmode at the same time")
 	} else if ctx.IsSet(flags.L2EngineSyncEnabled.Name) {
 		log.Error("l2.engine-sync is deprecated and will be removed in a future release. Use --syncmode=execution-layer instead.")
 	}
diff --git a/op-node/withdrawals/proof.go b/op-node/withdrawals/proof.go
index 070282aa5b33..94ce76d0ffb4 100644
--- a/op-node/withdrawals/proof.go
+++ b/op-node/withdrawals/proof.go
@@ -5,6 +5,8 @@ import (
 	"errors"
 	"fmt"
 
+	"github.com/holiman/uint256"
+
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/crypto"
@@ -76,12 +78,16 @@ func VerifyStorageProof(root common.Hash, proof gethclient.StorageResult) error
 }
 
 func VerifyProof(stateRoot common.Hash, proof *gethclient.AccountResult) error {
+	balance, overflow := uint256.FromBig(proof.Balance)
+	if overflow {
+		return fmt.Errorf("proof balance overflows uint256: %d", proof.Balance)
+	}
 	err := VerifyAccountProof(
 		stateRoot,
 		proof.Address,
 		types.StateAccount{
 			Nonce:    proof.Nonce,
-			Balance:  proof.Balance,
+			Balance:  balance,
 			Root:     proof.StorageHash,
 			CodeHash: proof.CodeHash[:],
 		},
diff --git a/op-node/withdrawals/utils.go b/op-node/withdrawals/utils.go
index 057b56a29945..f3b2067a33d6 100644
--- a/op-node/withdrawals/utils.go
+++ b/op-node/withdrawals/utils.go
@@ -14,9 +14,9 @@ import (
 	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/ethclient/gethclient"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
-	"github.com/ethereum-optimism/optimism/op-bindings/bindingspreview"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
+	"github.com/ethereum-optimism/optimism/op-node/bindings"
+	bindingspreview "github.com/ethereum-optimism/optimism/op-node/bindings/preview"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 )
 
 var MessagePassedTopic = crypto.Keccak256Hash([]byte("MessagePassed(uint256,address,address,uint256,uint256,bytes,bytes32)"))
diff --git a/op-node/withdrawals/utils_test.go b/op-node/withdrawals/utils_test.go
index a5e4ec1527a1..68daf173fa1b 100644
--- a/op-node/withdrawals/utils_test.go
+++ b/op-node/withdrawals/utils_test.go
@@ -7,7 +7,7 @@ import (
 	"path"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-node/bindings"
 	"github.com/ethereum-optimism/optimism/op-service/testutils"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
diff --git a/endpoint-monitor/.gitignore b/op-plasma/.gitignore
similarity index 100%
rename from endpoint-monitor/.gitignore
rename to op-plasma/.gitignore
diff --git a/op-node/Dockerfile b/op-plasma/Dockerfile
similarity index 69%
rename from op-node/Dockerfile
rename to op-plasma/Dockerfile
index 0cd7f16d9c1d..122e8b09644a 100644
--- a/op-node/Dockerfile
+++ b/op-plasma/Dockerfile
@@ -4,6 +4,6 @@ FROM $OP_STACK_GO_BUILDER as builder
 
 FROM alpine:3.18
 
-COPY --from=builder /usr/local/bin/op-node /usr/local/bin/op-node
+COPY --from=builder /usr/local/bin/da-server /usr/local/bin/da-server
 
-CMD ["op-node"]
+CMD ["da-server"]
diff --git a/op-plasma/Dockerfile.dockerignore b/op-plasma/Dockerfile.dockerignore
new file mode 100644
index 000000000000..f7f3fc90af70
--- /dev/null
+++ b/op-plasma/Dockerfile.dockerignore
@@ -0,0 +1,7 @@
+*
+
+!/op-bindings
+!/op-service
+!/op-plasma
+!/go.mod
+!/go.sum
diff --git a/endpoint-monitor/Makefile b/op-plasma/Makefile
similarity index 61%
rename from endpoint-monitor/Makefile
rename to op-plasma/Makefile
index a5c17d519e7d..38b921f8d17f 100644
--- a/endpoint-monitor/Makefile
+++ b/op-plasma/Makefile
@@ -1,28 +1,22 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+VERSION ?= v0.0.0
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
 LDFLAGSSTRING +=-X main.Version=$(VERSION)
 LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
 
-all: build
-
-build:
-	env GO111MODULE=on go build -v $(LDFLAGS) -o ./bin/endpoint-monitor ./cmd
+da-server:
+	env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/da-server ./cmd/daserver
 
 clean:
-	rm ./bin/endpoint-monitor
+	rm bin/da-server
 
 test:
 	go test -v ./...
 
-lint:
-	golangci-lint run ./...
-
 .PHONY: \
-	build \
+	op-batcher \
 	clean \
-	test \
-	lint
+	test
diff --git a/op-bindings/bindings/dataavailabilitychallenge.go b/op-plasma/bindings/dataavailabilitychallenge.go
similarity index 100%
rename from op-bindings/bindings/dataavailabilitychallenge.go
rename to op-plasma/bindings/dataavailabilitychallenge.go
diff --git a/op-plasma/cli.go b/op-plasma/cli.go
index 92164bd5041d..64b1dc33af92 100644
--- a/op-plasma/cli.go
+++ b/op-plasma/cli.go
@@ -11,6 +11,7 @@ const (
 	EnabledFlagName         = "plasma.enabled"
 	DaServerAddressFlagName = "plasma.da-server"
 	VerifyOnReadFlagName    = "plasma.verify-on-read"
+	DaServiceFlag           = "plasma.da-service"
 )
 
 func plasmaEnv(envprefix, v string) []string {
@@ -39,6 +40,13 @@ func CLIFlags(envPrefix string, category string) []cli.Flag {
 			EnvVars:  plasmaEnv(envPrefix, "VERIFY_ON_READ"),
 			Category: category,
 		},
+		&cli.BoolFlag{
+			Name:     DaServiceFlag,
+			Usage:    "Use DA service type where commitments are generated by plasma server",
+			Value:    false,
+			EnvVars:  plasmaEnv(envPrefix, "DA_SERVICE"),
+			Category: category,
+		},
 	}
 }
 
@@ -46,6 +54,7 @@ type CLIConfig struct {
 	Enabled      bool
 	DAServerURL  string
 	VerifyOnRead bool
+	GenericDA    bool
 }
 
 func (c CLIConfig) Check() error {
@@ -61,7 +70,7 @@ func (c CLIConfig) Check() error {
 }
 
 func (c CLIConfig) NewDAClient() *DAClient {
-	return &DAClient{url: c.DAServerURL, verify: c.VerifyOnRead}
+	return &DAClient{url: c.DAServerURL, verify: c.VerifyOnRead, precompute: !c.GenericDA}
 }
 
 func ReadCLIConfig(c *cli.Context) CLIConfig {
@@ -69,5 +78,6 @@ func ReadCLIConfig(c *cli.Context) CLIConfig {
 		Enabled:      c.Bool(EnabledFlagName),
 		DAServerURL:  c.String(DaServerAddressFlagName),
 		VerifyOnRead: c.Bool(VerifyOnReadFlagName),
+		GenericDA:    c.Bool(DaServiceFlag),
 	}
 }
diff --git a/op-plasma/cmd/daserver/README.md b/op-plasma/cmd/daserver/README.md
new file mode 100644
index 000000000000..6d8ec315d747
--- /dev/null
+++ b/op-plasma/cmd/daserver/README.md
@@ -0,0 +1,31 @@
+# Plasma DA Server
+
+## Introduction
+
+This simple DA server implementation supports local storage via file based storage and remote via S3.
+LevelDB is only recommended for usage in local devnets where connecting to S3 is not convenient.
+See the [S3 doc](https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/) for more information
+on how to configure the S3 client.
+
+## S3 Configuration
+
+Depending on your cloud provider a wide array of configurations are available. The S3 client will
+load configurations from the environment, shared credentials and shared config files.
+Sample environment variables are provided below:
+
+```bash
+export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID
+export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY
+export AWS_SESSION_TOKEN=YOUR_SESSION_TOKEN
+export AWS_REGION=YOUR_REGION
+```
+
+You can find out more about AWS authentication [here](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html).
+
+Additionally, these variables can be used with a google cloud S3 endpoint as well, i.e:
+
+```bash
+export AWS_ENDPOINT_URL="https://storage.googleapis.com"
+export AWS_ACCESS_KEY_ID=YOUR_GOOGLE_ACCESS_KEY_ID
+export AWS_SECRET_ACCESS_KEY=YOUR_GOOGLE_ACCESS_KEY_SECRET
+```
diff --git a/op-plasma/cmd/daserver/entrypoint.go b/op-plasma/cmd/daserver/entrypoint.go
new file mode 100644
index 000000000000..c8b03486b8c2
--- /dev/null
+++ b/op-plasma/cmd/daserver/entrypoint.go
@@ -0,0 +1,61 @@
+package main
+
+import (
+	"fmt"
+
+	"github.com/urfave/cli/v2"
+
+	plasma "github.com/ethereum-optimism/optimism/op-plasma"
+	oplog "github.com/ethereum-optimism/optimism/op-service/log"
+	"github.com/ethereum-optimism/optimism/op-service/opio"
+)
+
+func StartDAServer(cliCtx *cli.Context) error {
+	if err := CheckRequired(cliCtx); err != nil {
+		return err
+	}
+
+	cfg := ReadCLIConfig(cliCtx)
+	if err := cfg.Check(); err != nil {
+		return err
+	}
+
+	logCfg := oplog.ReadCLIConfig(cliCtx)
+
+	l := oplog.NewLogger(oplog.AppOut(cliCtx), logCfg)
+	oplog.SetGlobalLogHandler(l.Handler())
+
+	l.Info("Initializing Plasma DA server...")
+
+	var store plasma.KVStore
+
+	if cfg.FileStoreEnabled() {
+		l.Info("Using file storage", "path", cfg.FileStoreDirPath)
+		store = NewFileStore(cfg.FileStoreDirPath)
+	} else if cfg.S3Enabled() {
+		l.Info("Using S3 storage", "bucket", cfg.S3Config().Bucket)
+		s3, err := NewS3Store(cfg.S3Config())
+		if err != nil {
+			return fmt.Errorf("failed to create S3 store: %w", err)
+		}
+		store = s3
+	}
+
+	server := plasma.NewDAServer(cliCtx.String(ListenAddrFlagName), cliCtx.Int(PortFlagName), store, l, cfg.UseGenericComm)
+
+	if err := server.Start(); err != nil {
+		return fmt.Errorf("failed to start the DA server")
+	} else {
+		l.Info("Started DA Server")
+	}
+
+	defer func() {
+		if err := server.Stop(); err != nil {
+			l.Error("failed to stop DA server", "err", err)
+		}
+	}()
+
+	opio.BlockOnInterrupts()
+
+	return nil
+}
diff --git a/op-plasma/cmd/daserver/file.go b/op-plasma/cmd/daserver/file.go
new file mode 100644
index 000000000000..0398fa8a2493
--- /dev/null
+++ b/op-plasma/cmd/daserver/file.go
@@ -0,0 +1,39 @@
+package main
+
+import (
+	"context"
+	"encoding/hex"
+	"os"
+	"path"
+
+	plasma "github.com/ethereum-optimism/optimism/op-plasma"
+)
+
+type FileStore struct {
+	directory string
+}
+
+func NewFileStore(directory string) *FileStore {
+	return &FileStore{
+		directory: directory,
+	}
+}
+
+func (s *FileStore) Get(ctx context.Context, key []byte) ([]byte, error) {
+	data, err := os.ReadFile(s.fileName(key))
+	if err != nil {
+		if os.IsNotExist(err) {
+			return nil, plasma.ErrNotFound
+		}
+		return nil, err
+	}
+	return data, nil
+}
+
+func (s *FileStore) Put(ctx context.Context, key []byte, value []byte) error {
+	return os.WriteFile(s.fileName(key), value, 0600)
+}
+
+func (s *FileStore) fileName(key []byte) string {
+	return path.Join(s.directory, hex.EncodeToString(key))
+}
diff --git a/op-plasma/cmd/daserver/flags.go b/op-plasma/cmd/daserver/flags.go
new file mode 100644
index 000000000000..841a3c3a43a0
--- /dev/null
+++ b/op-plasma/cmd/daserver/flags.go
@@ -0,0 +1,158 @@
+package main
+
+import (
+	"errors"
+	"fmt"
+
+	"github.com/urfave/cli/v2"
+
+	opservice "github.com/ethereum-optimism/optimism/op-service"
+	oplog "github.com/ethereum-optimism/optimism/op-service/log"
+)
+
+const (
+	ListenAddrFlagName        = "addr"
+	PortFlagName              = "port"
+	S3BucketFlagName          = "s3.bucket"
+	S3EndpointFlagName        = "s3.endpoint"
+	S3AccessKeyIDFlagName     = "s3.access-key-id"
+	S3AccessKeySecretFlagName = "s3.access-key-secret"
+	FileStorePathFlagName     = "file.path"
+	GenericCommFlagName       = "generic-commitment"
+)
+
+const EnvVarPrefix = "OP_PLASMA_DA_SERVER"
+
+func prefixEnvVars(name string) []string {
+	return opservice.PrefixEnvVar(EnvVarPrefix, name)
+}
+
+var (
+	ListenAddrFlag = &cli.StringFlag{
+		Name:    ListenAddrFlagName,
+		Usage:   "server listening address",
+		Value:   "127.0.0.1",
+		EnvVars: prefixEnvVars("ADDR"),
+	}
+	PortFlag = &cli.IntFlag{
+		Name:    PortFlagName,
+		Usage:   "server listening port",
+		Value:   3100,
+		EnvVars: prefixEnvVars("PORT"),
+	}
+	FileStorePathFlag = &cli.StringFlag{
+		Name:    FileStorePathFlagName,
+		Usage:   "path to directory for file storage",
+		EnvVars: prefixEnvVars("FILESTORE_PATH"),
+	}
+	GenericCommFlag = &cli.BoolFlag{
+		Name:    GenericCommFlagName,
+		Usage:   "enable generic commitments for testing. Not for production use.",
+		EnvVars: prefixEnvVars("GENERIC_COMMITMENT"),
+		Value:   false,
+	}
+	S3BucketFlag = &cli.StringFlag{
+		Name:    S3BucketFlagName,
+		Usage:   "bucket name for S3 storage",
+		EnvVars: prefixEnvVars("S3_BUCKET"),
+	}
+	S3EndpointFlag = &cli.StringFlag{
+		Name:    S3EndpointFlagName,
+		Usage:   "endpoint for S3 storage",
+		Value:   "",
+		EnvVars: prefixEnvVars("S3_ENDPOINT"),
+	}
+	S3AccessKeyIDFlag = &cli.StringFlag{
+		Name:    S3AccessKeyIDFlagName,
+		Usage:   "access key id for S3 storage",
+		Value:   "",
+		EnvVars: prefixEnvVars("S3_ACCESS_KEY_ID"),
+	}
+	S3AccessKeySecretFlag = &cli.StringFlag{
+		Name:    S3AccessKeySecretFlagName,
+		Usage:   "access key secret for S3 storage",
+		Value:   "",
+		EnvVars: prefixEnvVars("S3_ACCESS_KEY_SECRET"),
+	}
+)
+
+var requiredFlags = []cli.Flag{
+	ListenAddrFlag,
+	PortFlag,
+}
+
+var optionalFlags = []cli.Flag{
+	FileStorePathFlag,
+	S3BucketFlag,
+	S3EndpointFlag,
+	S3AccessKeyIDFlag,
+	S3AccessKeySecretFlag,
+	GenericCommFlag,
+}
+
+func init() {
+	optionalFlags = append(optionalFlags, oplog.CLIFlags(EnvVarPrefix)...)
+	Flags = append(requiredFlags, optionalFlags...)
+}
+
+// Flags contains the list of configuration options available to the binary.
+var Flags []cli.Flag
+
+type CLIConfig struct {
+	FileStoreDirPath  string
+	S3Bucket          string
+	S3Endpoint        string
+	S3AccessKeyID     string
+	S3AccessKeySecret string
+	UseGenericComm    bool
+}
+
+func ReadCLIConfig(ctx *cli.Context) CLIConfig {
+	return CLIConfig{
+		FileStoreDirPath:  ctx.String(FileStorePathFlagName),
+		S3Bucket:          ctx.String(S3BucketFlagName),
+		S3Endpoint:        ctx.String(S3EndpointFlagName),
+		S3AccessKeyID:     ctx.String(S3AccessKeyIDFlagName),
+		S3AccessKeySecret: ctx.String(S3AccessKeySecretFlagName),
+		UseGenericComm:    ctx.Bool(GenericCommFlagName),
+	}
+}
+
+func (c CLIConfig) Check() error {
+	if !c.S3Enabled() && !c.FileStoreEnabled() {
+		return errors.New("at least one storage backend must be enabled")
+	}
+	if c.S3Enabled() && c.FileStoreEnabled() {
+		return errors.New("only one storage backend can be enabled")
+	}
+	if c.S3Enabled() && (c.S3Bucket == "" || c.S3Endpoint == "" || c.S3AccessKeyID == "" || c.S3AccessKeySecret == "") {
+		return errors.New("all S3 flags must be set")
+	}
+	return nil
+}
+
+func (c CLIConfig) S3Enabled() bool {
+	return !(c.S3Bucket == "" && c.S3Endpoint == "" && c.S3AccessKeyID == "" && c.S3AccessKeySecret == "")
+}
+
+func (c CLIConfig) S3Config() S3Config {
+	return S3Config{
+		Bucket:          c.S3Bucket,
+		Endpoint:        c.S3Endpoint,
+		AccessKeyID:     c.S3AccessKeyID,
+		AccessKeySecret: c.S3AccessKeySecret,
+	}
+}
+
+func (c CLIConfig) FileStoreEnabled() bool {
+	return c.FileStoreDirPath != ""
+}
+
+func CheckRequired(ctx *cli.Context) error {
+	for _, f := range requiredFlags {
+		if !ctx.IsSet(f.Names()[0]) {
+			return fmt.Errorf("flag %s is required", f.Names()[0])
+		}
+	}
+	return nil
+}
diff --git a/op-plasma/cmd/daserver/main.go b/op-plasma/cmd/daserver/main.go
new file mode 100644
index 000000000000..ba9f06a76117
--- /dev/null
+++ b/op-plasma/cmd/daserver/main.go
@@ -0,0 +1,35 @@
+package main
+
+import (
+	"context"
+	"os"
+
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/urfave/cli/v2"
+
+	opservice "github.com/ethereum-optimism/optimism/op-service"
+	"github.com/ethereum-optimism/optimism/op-service/cliapp"
+	oplog "github.com/ethereum-optimism/optimism/op-service/log"
+	"github.com/ethereum-optimism/optimism/op-service/opio"
+)
+
+var Version = "v0.0.1"
+
+func main() {
+	oplog.SetupDefaults()
+
+	app := cli.NewApp()
+	app.Flags = cliapp.ProtectFlags(Flags)
+	app.Version = opservice.FormatVersion(Version, "", "", "")
+	app.Name = "da-server"
+	app.Usage = "Plasma DA Storage Service"
+	app.Description = "Service for storing plasma DA inputs"
+	app.Action = StartDAServer
+
+	ctx := opio.WithInterruptBlocker(context.Background())
+	err := app.RunContext(ctx, os.Args)
+	if err != nil {
+		log.Crit("Application failed", "message", err)
+	}
+
+}
diff --git a/op-plasma/cmd/daserver/s3.go b/op-plasma/cmd/daserver/s3.go
new file mode 100644
index 000000000000..68eaf93270e4
--- /dev/null
+++ b/op-plasma/cmd/daserver/s3.go
@@ -0,0 +1,63 @@
+package main
+
+import (
+	"bytes"
+	"context"
+	"encoding/hex"
+	"io"
+
+	"github.com/minio/minio-go/v7"
+	"github.com/minio/minio-go/v7/pkg/credentials"
+
+	plasma "github.com/ethereum-optimism/optimism/op-plasma"
+)
+
+type S3Config struct {
+	Bucket          string
+	Endpoint        string
+	AccessKeyID     string
+	AccessKeySecret string
+}
+
+type S3Store struct {
+	cfg    S3Config
+	client *minio.Client
+}
+
+func NewS3Store(cfg S3Config) (*S3Store, error) {
+	client, err := minio.New(cfg.Endpoint, &minio.Options{
+		Creds:  credentials.NewStaticV4(cfg.AccessKeyID, cfg.AccessKeySecret, ""),
+		Secure: true,
+	})
+	if err != nil {
+		return nil, err
+	}
+	return &S3Store{
+		cfg:    cfg,
+		client: client,
+	}, nil
+}
+
+func (s *S3Store) Get(ctx context.Context, key []byte) ([]byte, error) {
+	result, err := s.client.GetObject(ctx, s.cfg.Bucket, hex.EncodeToString(key), minio.GetObjectOptions{})
+	if err != nil {
+		errResponse := minio.ToErrorResponse(err)
+		if errResponse.Code == "NoSuchKey" {
+			return nil, plasma.ErrNotFound
+		}
+		return nil, err
+	}
+	defer result.Close()
+	data, err := io.ReadAll(result)
+	if err != nil {
+		return nil, err
+	}
+
+	return data, nil
+}
+
+func (s *S3Store) Put(ctx context.Context, key []byte, value []byte) error {
+	_, err := s.client.PutObject(ctx, s.cfg.Bucket, hex.EncodeToString(key), bytes.NewReader(value), int64(len(value)), minio.PutObjectOptions{})
+
+	return err
+}
diff --git a/op-plasma/commitment.go b/op-plasma/commitment.go
index 6f45bd4f8429..0edb4ad2f14c 100644
--- a/op-plasma/commitment.go
+++ b/op-plasma/commitment.go
@@ -3,6 +3,7 @@ package plasma
 import (
 	"bytes"
 	"errors"
+	"fmt"
 
 	"github.com/ethereum/go-ethereum/crypto"
 )
@@ -16,12 +17,95 @@ var ErrCommitmentMismatch = errors.New("commitment mismatch")
 // CommitmentType is the commitment type prefix.
 type CommitmentType byte
 
-// KeccakCommitmentType is the default commitment type for the DA storage.
-const Keccak256CommitmentType CommitmentType = 0
+func CommitmentTypeFromString(s string) (CommitmentType, error) {
+	switch s {
+	case KeccakCommitmentString:
+		return Keccak256CommitmentType, nil
+	case GenericCommitmentString:
+		return GenericCommitmentType, nil
+	default:
+		return 0, fmt.Errorf("invalid commitment type: %s", s)
+	}
+}
+
+// CommitmentType describes the binary format of the commitment.
+// KeccakCommitmentStringType is the default commitment type for the centralized DA storage.
+// GenericCommitmentType indicates an opaque bytestring that the op-node never opens.
+const (
+	Keccak256CommitmentType CommitmentType = 0
+	GenericCommitmentType   CommitmentType = 1
+	KeccakCommitmentString  string         = "KeccakCommitment"
+	GenericCommitmentString string         = "GenericCommitment"
+)
 
-// Keccak256Commitment is the default commitment type for op-plasma.
+// CommitmentData is the binary representation of a commitment.
+type CommitmentData interface {
+	CommitmentType() CommitmentType
+	Encode() []byte
+	TxData() []byte
+	Verify(input []byte) error
+}
+
+// Keccak256Commitment is an implementation of CommitmentData that uses Keccak256 as the commitment function.
 type Keccak256Commitment []byte
 
+// GenericCommitment is an implementation of CommitmentData that treats the commitment as an opaque bytestring.
+type GenericCommitment []byte
+
+// NewCommitmentData creates a new commitment from the given input and desired type.
+func NewCommitmentData(t CommitmentType, input []byte) CommitmentData {
+	switch t {
+	case Keccak256CommitmentType:
+		return NewKeccak256Commitment(input)
+	case GenericCommitmentType:
+		return NewGenericCommitment(input)
+	default:
+		return nil
+	}
+}
+
+// DecodeCommitmentData parses the commitment into a known commitment type.
+// The input type is determined by the first byte of the raw data.
+// The input type is discarded and the commitment is passed to the appropriate constructor.
+func DecodeCommitmentData(input []byte) (CommitmentData, error) {
+	if len(input) == 0 {
+		return nil, ErrInvalidCommitment
+	}
+	t := CommitmentType(input[0])
+	data := input[1:]
+	switch t {
+	case Keccak256CommitmentType:
+		return DecodeKeccak256(data)
+	case GenericCommitmentType:
+		return DecodeGenericCommitment(data)
+	default:
+		return nil, ErrInvalidCommitment
+	}
+}
+
+// NewKeccak256Commitment creates a new commitment from the given input.
+func NewKeccak256Commitment(input []byte) Keccak256Commitment {
+	return Keccak256Commitment(crypto.Keccak256(input))
+}
+
+// DecodeKeccak256 validates and casts the commitment into a Keccak256Commitment.
+func DecodeKeccak256(commitment []byte) (Keccak256Commitment, error) {
+	// guard against empty commitments
+	if len(commitment) == 0 {
+		return nil, ErrInvalidCommitment
+	}
+	// keccak commitments are always 32 bytes
+	if len(commitment) != 32 {
+		return nil, ErrInvalidCommitment
+	}
+	return commitment, nil
+}
+
+// CommitmentType returns the commitment type of Keccak256.
+func (c Keccak256Commitment) CommitmentType() CommitmentType {
+	return Keccak256CommitmentType
+}
+
 // Encode adds a commitment type prefix self describing the commitment.
 func (c Keccak256Commitment) Encode() []byte {
 	return append([]byte{byte(Keccak256CommitmentType)}, c...)
@@ -40,22 +124,35 @@ func (c Keccak256Commitment) Verify(input []byte) error {
 	return nil
 }
 
-// Keccak256 creates a new commitment from the given input.
-func Keccak256(input []byte) Keccak256Commitment {
-	return Keccak256Commitment(crypto.Keccak256(input))
+// NewGenericCommitment creates a new commitment from the given input.
+func NewGenericCommitment(input []byte) GenericCommitment {
+	return GenericCommitment(input)
 }
 
-// DecodeKeccak256 validates and casts the commitment into a Keccak256Commitment.
-func DecodeKeccak256(commitment []byte) (Keccak256Commitment, error) {
+// DecodeGenericCommitment validates and casts the commitment into a GenericCommitment.
+func DecodeGenericCommitment(commitment []byte) (GenericCommitment, error) {
 	if len(commitment) == 0 {
 		return nil, ErrInvalidCommitment
 	}
-	if commitment[0] != byte(Keccak256CommitmentType) {
-		return nil, ErrInvalidCommitment
-	}
-	c := commitment[1:]
-	if len(c) != 32 {
-		return nil, ErrInvalidCommitment
-	}
-	return c, nil
+	return commitment[:], nil
+}
+
+// CommitmentType returns the commitment type of Generic Commitment.
+func (c GenericCommitment) CommitmentType() CommitmentType {
+	return GenericCommitmentType
+}
+
+// Encode adds a commitment type prefix self describing the commitment.
+func (c GenericCommitment) Encode() []byte {
+	return append([]byte{byte(GenericCommitmentType)}, c...)
+}
+
+// TxData adds an extra version byte to signal it's a commitment.
+func (c GenericCommitment) TxData() []byte {
+	return append([]byte{TxDataVersion1}, c.Encode()...)
+}
+
+// Verify always returns true for GenericCommitment because the DA Server must validate the data before returning it to the op-node.
+func (c GenericCommitment) Verify(input []byte) error {
+	return nil
 }
diff --git a/op-plasma/commitment_test.go b/op-plasma/commitment_test.go
new file mode 100644
index 000000000000..96d845f8c63a
--- /dev/null
+++ b/op-plasma/commitment_test.go
@@ -0,0 +1,69 @@
+package plasma
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+// TestCommitmentData tests the CommitmentData type and its implementations,
+// by encoding and decoding the commitment data and verifying the input data.
+func TestCommitmentData(t *testing.T) {
+
+	type tcase struct {
+		name        string
+		commType    CommitmentType
+		commData    []byte
+		expectedErr error
+	}
+
+	testCases := []tcase{
+		{
+			name:        "valid keccak256 commitment",
+			commType:    Keccak256CommitmentType,
+			commData:    []byte("abcdefghijklmnopqrstuvwxyz012345"),
+			expectedErr: ErrInvalidCommitment,
+		},
+		{
+			name:        "invalid keccak256 commitment",
+			commType:    Keccak256CommitmentType,
+			commData:    []byte("ab_baddata_yz012345"),
+			expectedErr: ErrInvalidCommitment,
+		},
+		{
+			name:        "valid generic commitment",
+			commType:    GenericCommitmentType,
+			commData:    []byte("any length of data! wow, that's so generic!"),
+			expectedErr: ErrInvalidCommitment,
+		},
+		{
+			name:        "invalid commitment type",
+			commType:    9,
+			commData:    []byte("abcdefghijklmnopqrstuvwxyz012345"),
+			expectedErr: ErrInvalidCommitment,
+		},
+	}
+
+	for _, tc := range testCases {
+		t.Run(tc.name, func(t *testing.T) {
+			comm, err := DecodeCommitmentData(tc.commData)
+			require.ErrorIs(t, err, tc.expectedErr)
+			if err == nil {
+				// Test that the commitment type is correct
+				require.Equal(t, tc.commType, comm.CommitmentType())
+				// Test that reencoding the commitment returns the same data
+				require.Equal(t, tc.commData, comm.Encode())
+				// Test that TxData() returns the same data as the original, prepended with a version byte
+				require.Equal(t, append([]byte{TxDataVersion1}, tc.commData...), comm.TxData())
+
+				// Test that Verify() returns no error for the correct data
+				require.NoError(t, comm.Verify(tc.commData))
+				// Test that Verify() returns error for the incorrect data
+				// don't do this for GenericCommitmentType, which does not do any verification
+				if tc.commType != GenericCommitmentType {
+					require.ErrorIs(t, ErrCommitmentMismatch, comm.Verify([]byte("wrong data")))
+				}
+			}
+		})
+	}
+}
diff --git a/op-plasma/daclient.go b/op-plasma/daclient.go
index e1c03509f69a..39708b2fd25a 100644
--- a/op-plasma/daclient.go
+++ b/op-plasma/daclient.go
@@ -17,20 +17,20 @@ var ErrInvalidInput = errors.New("invalid input")
 
 // DAClient is an HTTP client to communicate with a DA storage service.
 // It creates commitments and retrieves input data + verifies if needed.
-// Currently only supports Keccak256 commitments but may be extended eventually.
 type DAClient struct {
 	url string
-	// VerifyOnRead sets the client to verify the commitment on read.
-	// SHOULD enable if the storage service is not trusted.
+	// verify sets the client to verify a Keccak256 commitment on read.
 	verify bool
+	// whether commitment is precomputable (only applicable to keccak256)
+	precompute bool
 }
 
-func NewDAClient(url string, verify bool) *DAClient {
-	return &DAClient{url, verify}
+func NewDAClient(url string, verify bool, pc bool) *DAClient {
+	return &DAClient{url, verify, pc}
 }
 
 // GetInput returns the input data for the given encoded commitment bytes.
-func (c *DAClient) GetInput(ctx context.Context, comm Keccak256Commitment) ([]byte, error) {
+func (c *DAClient) GetInput(ctx context.Context, comm CommitmentData) ([]byte, error) {
 	req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("%s/get/0x%x", c.url, comm.Encode()), nil)
 	if err != nil {
 		return nil, fmt.Errorf("failed to create HTTP request: %w", err)
@@ -42,11 +42,15 @@ func (c *DAClient) GetInput(ctx context.Context, comm Keccak256Commitment) ([]by
 	if resp.StatusCode == http.StatusNotFound {
 		return nil, ErrNotFound
 	}
+	if resp.StatusCode != http.StatusOK {
+		return nil, fmt.Errorf("failed to get preimage: %v", resp.StatusCode)
+	}
 	defer resp.Body.Close()
 	input, err := io.ReadAll(resp.Body)
 	if err != nil {
 		return nil, err
 	}
+
 	if c.verify {
 		if err := comm.Verify(input); err != nil {
 			return nil, err
@@ -56,17 +60,58 @@ func (c *DAClient) GetInput(ctx context.Context, comm Keccak256Commitment) ([]by
 	return input, nil
 }
 
-// SetInput sets the input data and returns the keccak256 hash commitment.
-func (c *DAClient) SetInput(ctx context.Context, img []byte) (Keccak256Commitment, error) {
+// SetInput sets the input data and returns the respective commitment.
+func (c *DAClient) SetInput(ctx context.Context, img []byte) (CommitmentData, error) {
 	if len(img) == 0 {
 		return nil, ErrInvalidInput
 	}
-	comm := Keccak256(img)
+
+	if c.precompute { // precompute commitment (only applicable to keccak256)
+		comm := NewKeccak256Commitment(img)
+		if err := c.setInputWithCommit(ctx, comm, img); err != nil {
+			return nil, err
+		}
+
+		return comm, nil
+	}
+
+	// let DA server generate commitment
+	return c.setInput(ctx, img)
+
+}
+
+// setInputWithCommit sets a precomputed commitment for some pre-image data.
+func (c *DAClient) setInputWithCommit(ctx context.Context, comm CommitmentData, img []byte) error {
 	// encode with commitment type prefix
 	key := comm.Encode()
 	body := bytes.NewReader(img)
 	url := fmt.Sprintf("%s/put/0x%x", c.url, key)
 	req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, body)
+	if err != nil {
+		return fmt.Errorf("failed to create HTTP request: %w", err)
+	}
+	req.Header.Set("Content-Type", "application/octet-stream")
+	resp, err := http.DefaultClient.Do(req)
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+	if resp.StatusCode != http.StatusOK {
+		return fmt.Errorf("failed to store preimage: %v", resp.StatusCode)
+	}
+
+	return nil
+}
+
+// setInput sets the input data and reads the respective DA generated commitment.
+func (c *DAClient) setInput(ctx context.Context, img []byte) (CommitmentData, error) {
+	if len(img) == 0 {
+		return nil, ErrInvalidInput
+	}
+
+	body := bytes.NewReader(img)
+	url := fmt.Sprintf("%s/put/", c.url)
+	req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, body)
 	if err != nil {
 		return nil, fmt.Errorf("failed to create HTTP request: %w", err)
 	}
@@ -77,7 +122,18 @@ func (c *DAClient) SetInput(ctx context.Context, img []byte) (Keccak256Commitmen
 	}
 	defer resp.Body.Close()
 	if resp.StatusCode != http.StatusOK {
-		return nil, fmt.Errorf("failed to store preimage: %v", resp.StatusCode)
+		return nil, fmt.Errorf("failed to store data: %v", resp.StatusCode)
 	}
+
+	b, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+
+	comm, err := DecodeCommitmentData(b)
+	if err != nil {
+		return nil, err
+	}
+
 	return comm, nil
 }
diff --git a/op-plasma/daclient_test.go b/op-plasma/daclient_test.go
index f605cda761ad..8f5aa55053bc 100644
--- a/op-plasma/daclient_test.go
+++ b/op-plasma/daclient_test.go
@@ -2,74 +2,62 @@ package plasma
 
 import (
 	"context"
-	"io"
+	"fmt"
 	"math/rand"
-	"net/http"
-	"net/http/httptest"
+	"sync"
 	"testing"
 
 	"github.com/ethereum-optimism/optimism/op-service/testlog"
-	"github.com/ethereum/go-ethereum/common/hexutil"
-	"github.com/ethereum/go-ethereum/ethdb/memorydb"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
 )
 
-func TestDAClient(t *testing.T) {
-	store := memorydb.New()
+type MemStore struct {
+	db   map[string][]byte
+	lock sync.RWMutex
+}
+
+func NewMemStore() *MemStore {
+	return &MemStore{
+		db: make(map[string][]byte),
+	}
+}
+
+// Get retrieves the given key if it's present in the key-value store.
+func (s *MemStore) Get(ctx context.Context, key []byte) ([]byte, error) {
+	s.lock.RLock()
+	defer s.lock.RUnlock()
+
+	if entry, ok := s.db[string(key)]; ok {
+		return common.CopyBytes(entry), nil
+	}
+	return nil, ErrNotFound
+}
+
+// Put inserts the given value into the key-value store.
+func (s *MemStore) Put(ctx context.Context, key []byte, value []byte) error {
+	s.lock.Lock()
+	defer s.lock.Unlock()
+
+	s.db[string(key)] = common.CopyBytes(value)
+	return nil
+}
+
+func TestDAClientPrecomputed(t *testing.T) {
+	store := NewMemStore()
 	logger := testlog.Logger(t, log.LevelDebug)
 
 	ctx := context.Background()
 
-	mux := http.NewServeMux()
-	mux.Handle("/get/", http.StripPrefix("/get/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		logger.Debug("GET", "url", r.URL)
-
-		comm, err := hexutil.Decode(r.URL.String())
-		if err != nil {
-			w.WriteHeader(http.StatusBadRequest)
-			return
-		}
-
-		input, err := store.Get(comm)
-		if err != nil {
-			w.WriteHeader(http.StatusNotFound)
-			return
-		}
-		if _, err := w.Write(input); err != nil {
-			w.WriteHeader(http.StatusInternalServerError)
-			return
-		}
-	})))
-	mux.Handle("/put/", http.StripPrefix("/put/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		logger.Debug("PUT", "url", r.URL)
-
-		input, err := io.ReadAll(r.Body)
-		if err != nil {
-			w.WriteHeader(http.StatusBadRequest)
-			return
-		}
-		comm, err := hexutil.Decode(r.URL.String())
-		if err != nil {
-			w.WriteHeader(http.StatusBadRequest)
-			return
-		}
-		if err := store.Put(comm, input); err != nil {
-			w.WriteHeader(http.StatusInternalServerError)
-			return
-		}
-
-		if _, err := w.Write(comm); err != nil {
-			w.WriteHeader(http.StatusInternalServerError)
-			return
-		}
-	})))
-
-	tsrv := httptest.NewServer(mux)
+	server := NewDAServer("127.0.0.1", 0, store, logger, false)
+
+	require.NoError(t, server.Start())
 
 	cfg := CLIConfig{
 		Enabled:      true,
-		DAServerURL:  tsrv.URL,
+		DAServerURL:  fmt.Sprintf("http://%s", server.Endpoint()),
 		VerifyOnRead: true,
 	}
 	require.NoError(t, cfg.Check())
@@ -83,7 +71,7 @@ func TestDAClient(t *testing.T) {
 	comm, err := client.SetInput(ctx, input)
 	require.NoError(t, err)
 
-	require.Equal(t, comm, Keccak256(input))
+	require.Equal(t, comm, NewKeccak256Commitment(input))
 
 	stored, err := client.GetInput(ctx, comm)
 	require.NoError(t, err)
@@ -91,13 +79,72 @@ func TestDAClient(t *testing.T) {
 	require.Equal(t, input, stored)
 
 	// set a bad commitment in the store
-	require.NoError(t, store.Put(comm.Encode(), []byte("bad data")))
+	require.NoError(t, store.Put(ctx, comm.Encode(), []byte("bad data")))
 
 	_, err = client.GetInput(ctx, comm)
 	require.ErrorIs(t, err, ErrCommitmentMismatch)
 
 	// test not found error
-	comm = Keccak256(RandomData(rng, 32))
+	comm = NewKeccak256Commitment(RandomData(rng, 32))
+	_, err = client.GetInput(ctx, comm)
+	require.ErrorIs(t, err, ErrNotFound)
+
+	// test storing bad data
+	_, err = client.SetInput(ctx, []byte{})
+	require.ErrorIs(t, err, ErrInvalidInput)
+
+	// server not responsive
+	require.NoError(t, server.Stop())
+	_, err = client.SetInput(ctx, input)
+	require.Error(t, err)
+
+	_, err = client.GetInput(ctx, NewKeccak256Commitment(input))
+	require.Error(t, err)
+}
+
+func TestDAClientService(t *testing.T) {
+	store := NewMemStore()
+	logger := testlog.Logger(t, log.LevelDebug)
+
+	ctx := context.Background()
+
+	server := NewDAServer("127.0.0.1", 0, store, logger, false)
+
+	require.NoError(t, server.Start())
+
+	cfg := CLIConfig{
+		Enabled:      true,
+		DAServerURL:  fmt.Sprintf("http://%s", server.Endpoint()),
+		VerifyOnRead: false,
+		GenericDA:    true,
+	}
+	require.NoError(t, cfg.Check())
+
+	client := cfg.NewDAClient()
+
+	rng := rand.New(rand.NewSource(1234))
+
+	input := RandomData(rng, 2000)
+
+	comm, err := client.SetInput(ctx, input)
+	require.NoError(t, err)
+
+	require.Equal(t, comm, NewGenericCommitment(crypto.Keccak256(input)))
+
+	stored, err := client.GetInput(ctx, comm)
+	require.NoError(t, err)
+
+	require.Equal(t, input, stored)
+
+	// set a bad commitment in the store
+	require.NoError(t, store.Put(ctx, comm.Encode(), []byte("bad data")))
+
+	// assert no error as generic commitments cannot be verified client side
+	_, err = client.GetInput(ctx, comm)
+	require.NoError(t, err)
+
+	// test not found error
+	comm = NewGenericCommitment(RandomData(rng, 32))
 	_, err = client.GetInput(ctx, comm)
 	require.ErrorIs(t, err, ErrNotFound)
 
@@ -106,10 +153,10 @@ func TestDAClient(t *testing.T) {
 	require.ErrorIs(t, err, ErrInvalidInput)
 
 	// server not responsive
-	tsrv.Close()
+	require.NoError(t, server.Stop())
 	_, err = client.SetInput(ctx, input)
 	require.Error(t, err)
 
-	_, err = client.GetInput(ctx, Keccak256(input))
+	_, err = client.GetInput(ctx, NewGenericCommitment(input))
 	require.Error(t, err)
 }
diff --git a/op-plasma/damgr.go b/op-plasma/damgr.go
index 13d67aa505ba..b3604ac1c7ef 100644
--- a/op-plasma/damgr.go
+++ b/op-plasma/damgr.go
@@ -12,7 +12,7 @@ import (
 	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/log"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-plasma/bindings"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 )
 
@@ -40,8 +40,8 @@ type L1Fetcher interface {
 
 // DAStorage interface for calling the DA storage server.
 type DAStorage interface {
-	GetInput(ctx context.Context, key Keccak256Commitment) ([]byte, error)
-	SetInput(ctx context.Context, img []byte) (Keccak256Commitment, error)
+	GetInput(ctx context.Context, key CommitmentData) ([]byte, error)
+	SetInput(ctx context.Context, img []byte) (CommitmentData, error)
 }
 
 // HeadSignalFn is the callback function to accept head-signals without a context.
@@ -51,6 +51,8 @@ type HeadSignalFn func(eth.L1BlockRef)
 type Config struct {
 	// Required for filtering contract events
 	DAChallengeContractAddress common.Address
+	// Allowed CommitmentType
+	CommitmentType CommitmentType
 	// The number of l1 blocks after the input is committed during which one can challenge.
 	ChallengeWindow uint64
 	// The number of l1 blocks after a commitment is challenged during which one can resolve.
@@ -95,7 +97,7 @@ func NewPlasmaDAWithStorage(log log.Logger, cfg Config, storage DAStorage, metri
 	}
 }
 
-// NewPlasmaWithState creates a plasma storage from initial state used for testing in isolation.
+// NewPlasmaDAWithState creates a plasma storage from initial state used for testing in isolation.
 // We pass the L1Fetcher to each method so it is kept in sync with the conf depth of the pipeline.
 func NewPlasmaDAWithState(log log.Logger, cfg Config, storage DAStorage, metrics Metricer, state *State) *DA {
 	return &DA{
@@ -165,7 +167,11 @@ func (d *DA) Reset(ctx context.Context, base eth.L1BlockRef, baseCfg eth.SystemC
 
 // GetInput returns the input data for the given commitment bytes. blockNumber is required to lookup
 // the challenge status in the DataAvailabilityChallenge L1 contract.
-func (d *DA) GetInput(ctx context.Context, l1 L1Fetcher, comm Keccak256Commitment, blockId eth.BlockID) (eth.Data, error) {
+func (d *DA) GetInput(ctx context.Context, l1 L1Fetcher, comm CommitmentData, blockId eth.BlockID) (eth.Data, error) {
+	// If it's not the right commitment type, report it as an expired commitment in order to skip it
+	if d.cfg.CommitmentType != comm.CommitmentType() {
+		return nil, fmt.Errorf("invalid commitment type; expected: %v, got: %v: %w", d.cfg.CommitmentType, comm.CommitmentType(), ErrExpiredChallenge)
+	}
 	// If the challenge head is ahead in the case of a pipeline reset or stall, we might have synced a
 	// challenge event for this commitment. Otherwise we mark the commitment as part of the canonical
 	// chain so potential future challenge events can be selected.
@@ -205,6 +211,10 @@ func (d *DA) GetInput(ctx context.Context, l1 L1Fetcher, comm Keccak256Commitmen
 		if !notFound {
 			return data, nil
 		}
+		// Generic Commitments don't resolve from L1 so if we still can't find the data with out of luck
+		if comm.CommitmentType() == GenericCommitmentType {
+			return nil, ErrMissingPastWindow
+		}
 		// data not found in storage, return from challenge resolved input
 		resolvedInput, err := d.state.GetResolvedInput(comm.Encode())
 		if err != nil {
@@ -310,31 +320,39 @@ func (d *DA) LoadChallengeEvents(ctx context.Context, l1 L1Fetcher, block eth.Bl
 				d.log.Error("tx hash mismatch", "block", block.Number, "txIdx", i, "log", log.Index, "txHash", tx.Hash(), "receiptTxHash", log.TxHash)
 				continue
 			}
-			// Decode the input from resolver tx calldata
-			input, err := DecodeResolvedInput(tx.Data())
-			if err != nil {
-				d.log.Error("failed to decode resolved input", "block", block.Number, "txIdx", i, "err", err)
-				continue
-			}
-			if err := comm.Verify(input); err != nil {
-				d.log.Error("failed to verify commitment", "block", block.Number, "txIdx", i, "err", err)
-				continue
+			var input []byte
+			if d.cfg.CommitmentType == Keccak256CommitmentType {
+				// Decode the input from resolver tx calldata
+				input, err = DecodeResolvedInput(tx.Data())
+				if err != nil {
+					d.log.Error("failed to decode resolved input", "block", block.Number, "txIdx", i, "err", err)
+					continue
+				}
+				if err := comm.Verify(input); err != nil {
+					d.log.Error("failed to verify commitment", "block", block.Number, "txIdx", i, "err", err)
+					continue
+				}
 			}
-			d.log.Debug("challenge resolved", "block", block, "txIdx", i)
+			d.log.Info("challenge resolved", "block", block, "txIdx", i, "comm", comm.Encode())
 			d.state.SetResolvedChallenge(comm.Encode(), input, log.BlockNumber)
 		case ChallengeActive:
-			d.log.Info("detected new active challenge", "block", block)
+			d.log.Info("detected new active challenge", "block", block, "comm", comm.Encode())
 			d.state.SetActiveChallenge(comm.Encode(), log.BlockNumber, d.cfg.ResolveWindow)
 		default:
-			d.log.Warn("skipping unknown challenge status", "block", block.Number, "tx", i, "log", log.Index, "status", status)
+			d.log.Warn("skipping unknown challenge status", "block", block.Number, "tx", i, "log", log.Index, "status", status, "comm", comm.Encode())
 		}
 	}
 	return nil
 }
 
 // fetchChallengeLogs returns logs for challenge events if any for the given block
-func (d *DA) fetchChallengeLogs(ctx context.Context, l1 L1Fetcher, block eth.BlockID) ([]*types.Log, error) { //cached with deposits events call so not expensive
+func (d *DA) fetchChallengeLogs(ctx context.Context, l1 L1Fetcher, block eth.BlockID) ([]*types.Log, error) {
 	var logs []*types.Log
+	// Don't look at the challenge contract if there is no challenge contract.
+	if d.cfg.CommitmentType == GenericCommitmentType {
+		return logs, nil
+	}
+	//cached with deposits events call so not expensive
 	_, receipts, err := l1.FetchReceipts(ctx, block.Hash)
 	if err != nil {
 		return nil, err
@@ -356,20 +374,21 @@ func (d *DA) fetchChallengeLogs(ctx context.Context, l1 L1Fetcher, block eth.Blo
 }
 
 // decodeChallengeStatus decodes and validates a challenge event from a transaction log, returning the associated commitment bytes.
-func (d *DA) decodeChallengeStatus(log *types.Log) (ChallengeStatus, Keccak256Commitment, error) {
+func (d *DA) decodeChallengeStatus(log *types.Log) (ChallengeStatus, CommitmentData, error) {
 	event, err := DecodeChallengeStatusEvent(log)
 	if err != nil {
 		return 0, nil, err
 	}
-	d.log.Debug("decoded challenge status event", "log", log, "event", event)
-	comm, err := DecodeKeccak256(event.ChallengedCommitment)
+	comm, err := DecodeCommitmentData(event.ChallengedCommitment)
 	if err != nil {
 		return 0, nil, err
 	}
+	d.log.Debug("decoded challenge status event", "log", log, "event", event, "comm", fmt.Sprintf("%x", comm.Encode()))
 
 	bn := event.ChallengedBlockNumber.Uint64()
-	// if we are not tracking the commitment from processing the l1 origin in derivation,
-	// i.e. someone challenged garbage data, this challenge is invalid.
+	// IsTracking just validates whether the commitment was challenged for the correct block number
+	// if it has been loaded from the batcher inbox before. Spam commitments will be tracked but
+	// ignored and evicted unless derivation encounters the commitment.
 	if !d.state.IsTracking(comm.Encode(), bn) {
 		return 0, nil, fmt.Errorf("%w: %x at block %d", ErrInvalidChallenge, comm.Encode(), bn)
 	}
@@ -409,10 +428,13 @@ func DecodeChallengeStatusEvent(log *types.Log) (*bindings.DataAvailabilityChall
 
 // DecodeResolvedInput decodes the preimage bytes from the tx input data.
 func DecodeResolvedInput(data []byte) ([]byte, error) {
-	dacAbi, _ := bindings.DataAvailabilityChallengeMetaData.GetAbi()
+	dacAbi, err := bindings.DataAvailabilityChallengeMetaData.GetAbi()
+	if err != nil {
+		return nil, err
+	}
 
 	args := make(map[string]interface{})
-	err := dacAbi.Methods["resolve"].Inputs.UnpackIntoMap(args, data[4:])
+	err = dacAbi.Methods["resolve"].Inputs.UnpackIntoMap(args, data[4:])
 	if err != nil {
 		return nil, err
 	}
diff --git a/op-plasma/damgr_test.go b/op-plasma/damgr_test.go
index b80b2a33046f..5a37badc19ca 100644
--- a/op-plasma/damgr_test.go
+++ b/op-plasma/damgr_test.go
@@ -213,6 +213,51 @@ func TestExpireChallenges(t *testing.T) {
 	require.Equal(t, uint64(3713926), bn)
 }
 
+func TestDAChallengeDetached(t *testing.T) {
+	logger := testlog.Logger(t, log.LvlDebug)
+
+	rng := rand.New(rand.NewSource(1234))
+	state := NewState(logger, &NoopMetrics{})
+
+	challengeWindow := uint64(6)
+	resolveWindow := uint64(6)
+
+	c1 := RandomData(rng, 32)
+	c2 := RandomData(rng, 32)
+
+	// c1 at bn1 is missing, pipeline stalls
+	state.GetOrTrackChallenge(c1, 1, challengeWindow)
+
+	// c2 at bn2 is challenged at bn3
+	require.True(t, state.IsTracking(c2, 2))
+	state.SetActiveChallenge(c2, 3, resolveWindow)
+
+	// c1 is finally challenged at bn5
+	state.SetActiveChallenge(c1, 5, resolveWindow)
+
+	// c2 expires but should not trigger a reset because we don't know if it's valid yet
+	bn, err := state.ExpireChallenges(10)
+	require.NoError(t, err)
+	require.Equal(t, uint64(0), bn)
+
+	// c1 expires finally
+	bn, err = state.ExpireChallenges(11)
+	require.ErrorIs(t, err, ErrReorgRequired)
+	require.Equal(t, uint64(1), bn)
+
+	// pruning finalized block is safe
+	state.Prune(bn)
+
+	// pipeline discovers c2
+	comm := state.GetOrTrackChallenge(c2, 2, challengeWindow)
+	// it is already marked as expired so it will be skipped without needing a reorg
+	require.Equal(t, ChallengeExpired, comm.challengeStatus)
+
+	// later when we get to finalizing block 10 + margin, the pending challenge is safely pruned
+	state.Prune(210)
+	require.Equal(t, 0, len(state.expiredComms))
+}
+
 // cannot import from testutils at this time because of import cycle
 type mockL1Fetcher struct {
 	mock.Mock
@@ -261,7 +306,9 @@ func TestFilterInvalidBlockNumber(t *testing.T) {
 	bn := uint64(19)
 	bhash := common.HexToHash("0xd438144ffab918b1349e7cd06889c26800c26d8edc34d64f750e3e097166a09c")
 
-	da := NewPlasmaDAWithStorage(logger, pcfg, storage, &NoopMetrics{})
+	state := NewState(logger, &NoopMetrics{})
+
+	da := NewPlasmaDAWithState(logger, pcfg, storage, &NoopMetrics{}, state)
 
 	receipts := types.Receipts{&types.Receipt{
 		Type:   2,
@@ -292,13 +339,28 @@ func TestFilterInvalidBlockNumber(t *testing.T) {
 	}
 	l1F.ExpectFetchReceipts(bhash, nil, receipts, nil)
 
-	// we get 1 logs successfully filtered as valid status updated contract event
+	// we get 1 log successfully filtered as valid status updated contract event
 	logs, err := da.fetchChallengeLogs(ctx, l1F, id)
 	require.NoError(t, err)
 	require.Equal(t, len(logs), 1)
 
-	_, _, err = da.decodeChallengeStatus(logs[0])
-	// challenge was successfully decoded but is invalid because it does not belong
-	// to any known commitment previously submitted onchain.
-	require.ErrorIs(t, err, ErrInvalidChallenge)
+	// commitment is tracked but not canonical
+	status, comm, err := da.decodeChallengeStatus(logs[0])
+	require.NoError(t, err)
+
+	c, has := state.commsByKey[string(comm.Encode())]
+	require.True(t, has)
+	require.False(t, c.canonical)
+
+	require.Equal(t, ChallengeActive, status)
+	// once tracked, set as active based on decoded status
+	state.SetActiveChallenge(comm.Encode(), bn, pcfg.ResolveWindow)
+
+	// once we request it during derivation it becomes canonical
+	tracked := state.GetOrTrackChallenge(comm.Encode(), 14, pcfg.ChallengeWindow)
+	require.True(t, tracked.canonical)
+
+	require.Equal(t, ChallengeActive, tracked.challengeStatus)
+	require.Equal(t, uint64(14), tracked.blockNumber)
+	require.Equal(t, bn+pcfg.ResolveWindow, tracked.expiresAt)
 }
diff --git a/op-plasma/damock.go b/op-plasma/damock.go
index f21e80df25e0..c43bdbc53e92 100644
--- a/op-plasma/damock.go
+++ b/op-plasma/damock.go
@@ -14,18 +14,20 @@ import (
 // MockDAClient mocks a DA storage provider to avoid running an HTTP DA server
 // in unit tests.
 type MockDAClient struct {
-	store ethdb.KeyValueStore
-	log   log.Logger
+	CommitmentType CommitmentType
+	store          ethdb.KeyValueStore
+	log            log.Logger
 }
 
 func NewMockDAClient(log log.Logger) *MockDAClient {
 	return &MockDAClient{
-		store: memorydb.New(),
-		log:   log,
+		CommitmentType: Keccak256CommitmentType,
+		store:          memorydb.New(),
+		log:            log,
 	}
 }
 
-func (c *MockDAClient) GetInput(ctx context.Context, key Keccak256Commitment) ([]byte, error) {
+func (c *MockDAClient) GetInput(ctx context.Context, key CommitmentData) ([]byte, error) {
 	bytes, err := c.store.Get(key.Encode())
 	if err != nil {
 		return nil, ErrNotFound
@@ -33,8 +35,8 @@ func (c *MockDAClient) GetInput(ctx context.Context, key Keccak256Commitment) ([
 	return bytes, nil
 }
 
-func (c *MockDAClient) SetInput(ctx context.Context, data []byte) (Keccak256Commitment, error) {
-	key := Keccak256(data)
+func (c *MockDAClient) SetInput(ctx context.Context, data []byte) (CommitmentData, error) {
+	key := NewCommitmentData(c.CommitmentType, data)
 	return key, c.store.Put(key.Encode(), data)
 }
 
@@ -49,7 +51,7 @@ type DAErrFaker struct {
 	setInputErr error
 }
 
-func (f *DAErrFaker) GetInput(ctx context.Context, key Keccak256Commitment) ([]byte, error) {
+func (f *DAErrFaker) GetInput(ctx context.Context, key CommitmentData) ([]byte, error) {
 	if err := f.getInputErr; err != nil {
 		f.getInputErr = nil
 		return nil, err
@@ -57,7 +59,7 @@ func (f *DAErrFaker) GetInput(ctx context.Context, key Keccak256Commitment) ([]b
 	return f.Client.GetInput(ctx, key)
 }
 
-func (f *DAErrFaker) SetInput(ctx context.Context, data []byte) (Keccak256Commitment, error) {
+func (f *DAErrFaker) SetInput(ctx context.Context, data []byte) (CommitmentData, error) {
 	if err := f.setInputErr; err != nil {
 		f.setInputErr = nil
 		return nil, err
@@ -80,7 +82,7 @@ var ErrNotEnabled = errors.New("plasma not enabled")
 // PlasmaDisabled is a noop plasma DA implementation for stubbing.
 type PlasmaDisabled struct{}
 
-func (d *PlasmaDisabled) GetInput(ctx context.Context, l1 L1Fetcher, commitment Keccak256Commitment, blockId eth.BlockID) (eth.Data, error) {
+func (d *PlasmaDisabled) GetInput(ctx context.Context, l1 L1Fetcher, commitment CommitmentData, blockId eth.BlockID) (eth.Data, error) {
 	return nil, ErrNotEnabled
 }
 
diff --git a/op-plasma/daserver.go b/op-plasma/daserver.go
new file mode 100644
index 000000000000..6f163cb2f715
--- /dev/null
+++ b/op-plasma/daserver.go
@@ -0,0 +1,199 @@
+package plasma
+
+import (
+	"context"
+	"crypto/rand"
+	"encoding/hex"
+	"errors"
+	"fmt"
+	"io"
+	"math/big"
+	"net"
+	"net/http"
+	"path"
+	"strconv"
+	"time"
+
+	"github.com/ethereum-optimism/optimism/op-service/rpc"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+	"github.com/ethereum/go-ethereum/log"
+)
+
+type KVStore interface {
+	// Get retrieves the given key if it's present in the key-value data store.
+	Get(ctx context.Context, key []byte) ([]byte, error)
+	// Put inserts the given value into the key-value data store.
+	Put(ctx context.Context, key []byte, value []byte) error
+}
+
+type DAServer struct {
+	log            log.Logger
+	endpoint       string
+	store          KVStore
+	tls            *rpc.ServerTLSConfig
+	httpServer     *http.Server
+	listener       net.Listener
+	useGenericComm bool
+}
+
+func NewDAServer(host string, port int, store KVStore, log log.Logger, useGenericComm bool) *DAServer {
+	endpoint := net.JoinHostPort(host, strconv.Itoa(port))
+	return &DAServer{
+		log:      log,
+		endpoint: endpoint,
+		store:    store,
+		httpServer: &http.Server{
+			Addr: endpoint,
+		},
+		useGenericComm: useGenericComm,
+	}
+}
+
+func (d *DAServer) Start() error {
+	mux := http.NewServeMux()
+
+	mux.HandleFunc("/get/", d.HandleGet)
+	mux.HandleFunc("/put/", d.HandlePut)
+
+	d.httpServer.Handler = mux
+
+	listener, err := net.Listen("tcp", d.endpoint)
+	if err != nil {
+		return fmt.Errorf("failed to listen: %w", err)
+	}
+	d.listener = listener
+
+	d.endpoint = listener.Addr().String()
+	errCh := make(chan error, 1)
+	go func() {
+		if d.tls != nil {
+			if err := d.httpServer.ServeTLS(d.listener, "", ""); err != nil {
+				errCh <- err
+			}
+		} else {
+			if err := d.httpServer.Serve(d.listener); err != nil {
+				errCh <- err
+			}
+		}
+	}()
+
+	// verify that the server comes up
+	tick := time.NewTimer(10 * time.Millisecond)
+	defer tick.Stop()
+
+	select {
+	case err := <-errCh:
+		return fmt.Errorf("http server failed: %w", err)
+	case <-tick.C:
+		return nil
+	}
+}
+
+func (d *DAServer) HandleGet(w http.ResponseWriter, r *http.Request) {
+	d.log.Debug("GET", "url", r.URL)
+
+	route := path.Dir(r.URL.Path)
+	if route != "/get" {
+		w.WriteHeader(http.StatusBadRequest)
+		return
+	}
+
+	key := path.Base(r.URL.Path)
+	comm, err := hexutil.Decode(key)
+	if err != nil {
+		d.log.Error("Failed to decode commitment", "err", err, "key", key)
+		w.WriteHeader(http.StatusBadRequest)
+		return
+	}
+
+	input, err := d.store.Get(r.Context(), comm)
+	if err != nil && errors.Is(err, ErrNotFound) {
+		d.log.Error("Commitment not found", "key", key, "error", err)
+		w.WriteHeader(http.StatusNotFound)
+		return
+	}
+	if err != nil {
+		d.log.Error("Failed to read commitment", "err", err, "key", key)
+		w.WriteHeader(http.StatusInternalServerError)
+		return
+	}
+	if _, err := w.Write(input); err != nil {
+		d.log.Error("Failed to write pre-image", "err", err, "key", key)
+		w.WriteHeader(http.StatusInternalServerError)
+		return
+	}
+}
+
+func (d *DAServer) HandlePut(w http.ResponseWriter, r *http.Request) {
+	d.log.Info("PUT", "url", r.URL)
+
+	route := path.Dir(r.URL.Path)
+	if route != "/put" {
+		w.WriteHeader(http.StatusBadRequest)
+		return
+	}
+
+	input, err := io.ReadAll(r.Body)
+	if err != nil {
+		d.log.Error("Failed to read request body", "err", err)
+		w.WriteHeader(http.StatusBadRequest)
+		return
+	}
+
+	if r.URL.Path == "/put" || r.URL.Path == "/put/" { // without commitment
+		var comm []byte
+		if d.useGenericComm {
+			n, err := rand.Int(rand.Reader, big.NewInt(99999999999999))
+			if err != nil {
+				d.log.Error("Failed to generate commitment", "err", err)
+				w.WriteHeader(http.StatusInternalServerError)
+				return
+			}
+			comm = append(comm, 0x01)
+			comm = append(comm, 0xff)
+			comm = append(comm, n.Bytes()...)
+
+		} else {
+			comm = NewKeccak256Commitment(input).Encode()
+		}
+
+		if err = d.store.Put(r.Context(), comm, input); err != nil {
+			d.log.Error("Failed to store commitment to the DA server", "err", err, "comm", comm)
+			w.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+		d.log.Info("stored commitment", "key", hex.EncodeToString(comm), "input_len", len(input))
+
+		if _, err := w.Write(comm); err != nil {
+			d.log.Error("Failed to write commitment request body", "err", err, "comm", comm)
+			w.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+	} else {
+		key := path.Base(r.URL.Path)
+		comm, err := hexutil.Decode(key)
+		if err != nil {
+			d.log.Error("Failed to decode commitment", "err", err, "key", key)
+			w.WriteHeader(http.StatusBadRequest)
+			return
+		}
+
+		if err := d.store.Put(r.Context(), comm, input); err != nil {
+			d.log.Error("Failed to store commitment to the DA server", "err", err, "key", key)
+			w.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+		w.WriteHeader(http.StatusOK)
+	}
+}
+
+func (b *DAServer) Endpoint() string {
+	return b.listener.Addr().String()
+}
+
+func (b *DAServer) Stop() error {
+	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+	defer cancel()
+	_ = b.httpServer.Shutdown(ctx)
+	return nil
+}
diff --git a/op-plasma/dastate.go b/op-plasma/dastate.go
index 465eefe9ff9f..c6fee4800af9 100644
--- a/op-plasma/dastate.go
+++ b/op-plasma/dastate.go
@@ -3,6 +3,7 @@ package plasma
 import (
 	"container/heap"
 	"errors"
+	"fmt"
 
 	"github.com/ethereum/go-ethereum/log"
 )
@@ -14,7 +15,7 @@ var ErrReorgRequired = errors.New("reorg required")
 type ChallengeStatus uint8
 
 const (
-	ChallengeUnititialized ChallengeStatus = iota
+	ChallengeUninitialized ChallengeStatus = iota
 	ChallengeActive
 	ChallengeResolved
 	ChallengeExpired
@@ -27,15 +28,17 @@ type Commitment struct {
 	expiresAt       uint64          // represents the block number after which the commitment can no longer be challenged or if challenged no longer be resolved.
 	blockNumber     uint64          // block where the commitment is included as calldata to the batcher inbox
 	challengeStatus ChallengeStatus // latest known challenge status
+	canonical       bool            // whether the commitment was derived as part of the canonical chain if canonical it will be in comms queue if not in the pendingComms queue.
 }
 
-// CommQueue is a queue of commitments ordered by block number.
+// CommQueue is a priority queue of commitments ordered by block number.
 type CommQueue []*Commitment
 
 var _ heap.Interface = (*CommQueue)(nil)
 
 func (c CommQueue) Len() int { return len(c) }
 
+// we want the first item in the queue to have the lowest block number
 func (c CommQueue) Less(i, j int) bool {
 	return c[i].blockNumber < c[j].blockNumber
 }
@@ -59,27 +62,50 @@ func (c *CommQueue) Pop() any {
 
 // State tracks the commitment and their challenges in order of l1 inclusion.
 type State struct {
-	comms      CommQueue
-	commsByKey map[string]*Commitment
-	log        log.Logger
-	metrics    Metricer
+	activeComms  CommQueue
+	expiredComms CommQueue
+	commsByKey   map[string]*Commitment
+	log          log.Logger
+	metrics      Metricer
+	finalized    uint64
 }
 
 func NewState(log log.Logger, m Metricer) *State {
 	return &State{
-		comms:      make(CommQueue, 0),
-		commsByKey: make(map[string]*Commitment),
-		log:        log,
-		metrics:    m,
+		activeComms:  make(CommQueue, 0),
+		expiredComms: make(CommQueue, 0),
+		commsByKey:   make(map[string]*Commitment),
+		log:          log,
+		metrics:      m,
 	}
 }
 
 // IsTracking returns whether we currently have a commitment for the given key.
+// if the block number is mismatched we return false to ignore the challenge.
 func (s *State) IsTracking(key []byte, bn uint64) bool {
 	if c, ok := s.commsByKey[string(key)]; ok {
 		return c.blockNumber == bn
 	}
-	return false
+	// track the commitment knowing we may be in detached head and not have seen
+	// the commitment in the inbox yet.
+	s.TrackDetachedCommitment(key, bn)
+	return true
+}
+
+// TrackDetachedCommitment is used for indexing challenges for commitments that have not yet
+// been derived due to the derivation pipeline being stalled pending a commitment to be challenged.
+// Memory usage is bound to L1 block space during the DA windows, so it is hard and expensive to spam.
+// Note that the challenge status and expiration is updated separately after it is tracked.
+func (s *State) TrackDetachedCommitment(key []byte, bn uint64) {
+	c := &Commitment{
+		key:         key,
+		expiresAt:   bn,
+		blockNumber: bn,
+		canonical:   false,
+	}
+	s.log.Debug("tracking detached commitment", "blockNumber", c.blockNumber, "commitment", fmt.Sprintf("%x", key))
+	heap.Push(&s.activeComms, c)
+	s.commsByKey[string(key)] = c
 }
 
 // SetActiveChallenge switches the state of a given commitment to active challenge. Noop if
@@ -112,9 +138,10 @@ func (s *State) SetInputCommitment(key []byte, committedAt uint64, challengeWind
 		key:         key,
 		expiresAt:   committedAt + challengeWindow,
 		blockNumber: committedAt,
+		canonical:   true,
 	}
 	s.log.Debug("append commitment", "expiresAt", c.expiresAt, "blockNumber", c.blockNumber)
-	heap.Push(&s.comms, c)
+	heap.Push(&s.activeComms, c)
 	s.commsByKey[string(key)] = c
 
 	return c
@@ -124,6 +151,8 @@ func (s *State) SetInputCommitment(key []byte, committedAt uint64, challengeWind
 // initializes a new commitment and adds it to the state.
 func (s *State) GetOrTrackChallenge(key []byte, bn uint64, challengeWindow uint64) *Commitment {
 	if c, ok := s.commsByKey[string(key)]; ok {
+		// commitments previously introduced by challenge events are marked as canonical
+		c.canonical = true
 		return c
 	}
 	return s.SetInputCommitment(key, bn, challengeWindow)
@@ -142,42 +171,48 @@ func (s *State) GetResolvedInput(key []byte) ([]byte, error) {
 // as expired based on the new latest l1 origin. If any active challenges are expired
 // it returns an error to signal that a derivation pipeline reset is required.
 func (s *State) ExpireChallenges(bn uint64) (uint64, error) {
-	latest := uint64(0)
 	var err error
-	for i := 0; i < len(s.comms); i++ {
-		c := s.comms[i]
-		if c.expiresAt <= bn && c.blockNumber > latest {
-			latest = c.blockNumber
+	for s.activeComms.Len() > 0 && s.activeComms[0].expiresAt <= bn && s.activeComms[0].blockNumber > s.finalized {
+		// move from the active to the expired queue
+		c := heap.Pop(&s.activeComms).(*Commitment)
+		heap.Push(&s.expiredComms, c)
+
+		if c.canonical {
+			// advance finalized head only if the commitment was derived as part of the canonical chain
+			s.finalized = c.blockNumber
+		}
 
-			if c.challengeStatus == ChallengeActive {
-				c.challengeStatus = ChallengeExpired
-				s.metrics.RecordExpiredChallenge(c.key)
+		// active mark as expired so it is skipped in the derivation pipeline
+		if c.challengeStatus == ChallengeActive {
+			c.challengeStatus = ChallengeExpired
+
+			// only reorg if canonical. If the pipeline is behind, it will just
+			// get skipped once it catches up. If it is spam, it will be pruned
+			// with no effect.
+			if c.canonical {
 				err = ErrReorgRequired
+				s.metrics.RecordExpiredChallenge(c.key)
 			}
-		} else {
-			break
 		}
 	}
-	return latest, err
+
+	return s.finalized, err
 }
 
 // safely prune in case reset is deeper than the finalized l1
 const commPruneMargin = 200
 
 // Prune removes commitments once they can no longer be challenged or resolved.
+// the finalized head block number is passed so we can safely remove any commitments
+// with finalized block numbers.
 func (s *State) Prune(bn uint64) {
 	if bn > commPruneMargin {
 		bn -= commPruneMargin
 	} else {
 		bn = 0
 	}
-	if s.comms.Len() == 0 {
-		return
-	}
-	// only first element is the highest priority (lowest block number).
-	// next highest priority is swapped to the first position after a Pop.
-	for s.comms.Len() > 0 && s.comms[0].blockNumber < bn {
-		c := heap.Pop(&s.comms).(*Commitment)
+	for s.expiredComms.Len() > 0 && s.expiredComms[0].blockNumber < bn {
+		c := heap.Pop(&s.expiredComms).(*Commitment)
 		s.log.Debug("prune commitment", "expiresAt", c.expiresAt, "blockNumber", c.blockNumber)
 		delete(s.commsByKey, string(c.key))
 	}
@@ -186,6 +221,8 @@ func (s *State) Prune(bn uint64) {
 // In case of L1 reorg, state should be cleared so we can sync all the challenge events
 // from scratch.
 func (s *State) Reset() {
-	s.comms = s.comms[:0]
+	s.activeComms = s.activeComms[:0]
+	s.expiredComms = s.expiredComms[:0]
+	s.finalized = 0
 	clear(s.commsByKey)
 }
diff --git a/op-plasma/params.go b/op-plasma/params.go
index e176c207919a..84672999e3c9 100644
--- a/op-plasma/params.go
+++ b/op-plasma/params.go
@@ -1,6 +1,6 @@
 package plasma
 
-// Max input size ensures the canonical chain cannot include input batches too large to
+// MaxInputSize ensures the canonical chain cannot include input batches too large to
 // challenge in the Data Availability Challenge contract. Value in number of bytes.
 // This value can only be changed in a hard fork.
 const MaxInputSize = 130672
diff --git a/op-preimage/filepoller.go b/op-preimage/filepoller.go
index daf17f3c2a0b..45ab7d3baced 100644
--- a/op-preimage/filepoller.go
+++ b/op-preimage/filepoller.go
@@ -30,12 +30,12 @@ func (f *FilePoller) Read(b []byte) (int, error) {
 			return 0, err
 		}
 		n, err := f.File.Read(b[read:])
+		read += n
 		if errors.Is(err, os.ErrDeadlineExceeded) {
 			if cerr := f.ctx.Err(); cerr != nil {
 				return read, cerr
 			}
 		} else {
-			read += n
 			if read >= len(b) {
 				return read, err
 			}
@@ -50,12 +50,12 @@ func (f *FilePoller) Write(b []byte) (int, error) {
 			return 0, err
 		}
 		n, err := f.File.Write(b[written:])
+		written += n
 		if errors.Is(err, os.ErrDeadlineExceeded) {
 			if cerr := f.ctx.Err(); cerr != nil {
 				return written, cerr
 			}
 		} else {
-			written += n
 			if written >= len(b) {
 				return written, err
 			}
diff --git a/op-program/Dockerfile b/op-program/Dockerfile
deleted file mode 100644
index 91688b51607d..000000000000
--- a/op-program/Dockerfile
+++ /dev/null
@@ -1,9 +0,0 @@
-ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest
-FROM $OP_STACK_GO_BUILDER as builder
-# See "make golang-docker" and /ops/docker/op-stack-go
-
-FROM alpine:3.18
-
-COPY --from=builder /usr/local/bin/op-program /usr/local/bin/op-program
-
-CMD ["op-program"]
diff --git a/op-program/Dockerfile.dockerignore b/op-program/Dockerfile.dockerignore
deleted file mode 100644
index 4f26140750a0..000000000000
--- a/op-program/Dockerfile.dockerignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# ignore everything but the dockerfile, the op-stack-go base image performs the build
-*
diff --git a/op-program/Makefile b/op-program/Makefile
index 25a8ec3f9005..509c4cf2e774 100644
--- a/op-program/Makefile
+++ b/op-program/Makefile
@@ -1,12 +1,16 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+VERSION ?= v0.0.0
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
-LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-program/version.Version=$(VERSION)
 LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-program/version.Meta=$(VERSION_META)
-LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
+
+# op-program-client version must ALWAYS be set to the same value (v0.0.0) to ensure exact build is reproducible
+PC_LDFLAGSSTRING := $(LDFLAGSSTRING)
+PC_LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-program/version.Version=v0.0.0
+
+LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-program/version.Version=$(VERSION)
 
 COMPAT_DIR := temp/compat
 
@@ -16,16 +20,19 @@ op-program: \
 	op-program-client-mips
 
 op-program-host:
-	env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-program ./host/cmd/main.go
+	env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v -ldflags "$(LDFLAGSSTRING)" -o ./bin/op-program ./host/cmd/main.go
 
 op-program-client:
-	env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-program-client ./client/cmd/main.go
+	env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v -ldflags "$(PC_LDFLAGSSTRING)" -o ./bin/op-program-client ./client/cmd/main.go
 
 op-program-client-mips:
-	env GO111MODULE=on GOOS=linux GOARCH=mips GOMIPS=softfloat go build -v $(LDFLAGS) -o ./bin/op-program-client.elf ./client/cmd/main.go
+	env GO111MODULE=on GOOS=linux GOARCH=mips GOMIPS=softfloat go build -v -ldflags "$(LDFLAGSSTRING)" -o ./bin/op-program-client.elf ./client/cmd/main.go
 	# verify output with: readelf -h bin/op-program-client.elf
 	# result is mips32, big endian, R3000
 
+op-program-client-riscv:
+	env GO111MODULE=on GOOS=linux GOARCH=riscv64 go build -v -gcflags="all=-d=softfloat" -ldflags "$(LDFLAGSSTRING)" -o ./bin/op-program-client-riscv.elf ./client/cmd/main.go
+
 reproducible-prestate:
 	@docker build --output ./bin/ --progress plain -f Dockerfile.repro ../
 	@echo "Absolute prestate hash:"
@@ -74,6 +81,7 @@ verify-compat: verify-sepolia-delta verify-sepolia-ecotone verify-mainnet-genesi
 	op-program-host \
 	op-program-client \
 	op-program-client-mips \
+	op-program-client-riscv \
 	clean \
 	test \
 	capture-goerli-verify \
diff --git a/op-program/chainconfig/chaincfg.go b/op-program/chainconfig/chaincfg.go
index 001ea2865665..484309cd6bca 100644
--- a/op-program/chainconfig/chaincfg.go
+++ b/op-program/chainconfig/chaincfg.go
@@ -7,7 +7,7 @@ import (
 	"github.com/ethereum/go-ethereum/params"
 )
 
-var OPGoerliChainConfig, OPSepoliaChainConfig, OPMainnetChainConfig *params.ChainConfig
+var OPSepoliaChainConfig, OPMainnetChainConfig *params.ChainConfig
 
 func init() {
 	mustLoadConfig := func(chainID uint64) *params.ChainConfig {
@@ -17,13 +17,11 @@ func init() {
 		}
 		return cfg
 	}
-	OPGoerliChainConfig = mustLoadConfig(420)
 	OPSepoliaChainConfig = mustLoadConfig(11155420)
 	OPMainnetChainConfig = mustLoadConfig(10)
 }
 
 var L2ChainConfigsByChainID = map[uint64]*params.ChainConfig{
-	420:      OPGoerliChainConfig,
 	11155420: OPSepoliaChainConfig,
 	10:       OPMainnetChainConfig,
 }
diff --git a/op-program/client/boot_test.go b/op-program/client/boot_test.go
index e52098dd779f..e8e91e519b75 100644
--- a/op-program/client/boot_test.go
+++ b/op-program/client/boot_test.go
@@ -19,9 +19,9 @@ func TestBootstrapClient(t *testing.T) {
 		L2OutputRoot:       common.HexToHash("0x2222"),
 		L2Claim:            common.HexToHash("0x3333"),
 		L2ClaimBlockNumber: 1,
-		L2ChainID:          chaincfg.Goerli.L2ChainID.Uint64(),
-		L2ChainConfig:      chainconfig.OPGoerliChainConfig,
-		RollupConfig:       chaincfg.Goerli,
+		L2ChainID:          chaincfg.Sepolia.L2ChainID.Uint64(),
+		L2ChainConfig:      chainconfig.OPSepoliaChainConfig,
+		RollupConfig:       chaincfg.Sepolia,
 	}
 	mockOracle := &mockBoostrapOracle{bootInfo, false}
 	readBootInfo := NewBootstrapClient(mockOracle).BootInfo()
@@ -35,8 +35,8 @@ func TestBootstrapClient_CustomChain(t *testing.T) {
 		L2Claim:            common.HexToHash("0x3333"),
 		L2ClaimBlockNumber: 1,
 		L2ChainID:          CustomChainIDIndicator,
-		L2ChainConfig:      chainconfig.OPGoerliChainConfig,
-		RollupConfig:       chaincfg.Goerli,
+		L2ChainConfig:      chainconfig.OPSepoliaChainConfig,
+		RollupConfig:       chaincfg.Sepolia,
 	}
 	mockOracle := &mockBoostrapOracle{bootInfo, true}
 	readBootInfo := NewBootstrapClient(mockOracle).BootInfo()
diff --git a/op-program/client/l2/db_test.go b/op-program/client/l2/db_test.go
index 0a826382a639..00b70c810d73 100644
--- a/op-program/client/l2/db_test.go
+++ b/op-program/client/l2/db_test.go
@@ -15,8 +15,9 @@ import (
 	"github.com/ethereum/go-ethereum/ethdb"
 	"github.com/ethereum/go-ethereum/ethdb/memorydb"
 	"github.com/ethereum/go-ethereum/params"
-	"github.com/ethereum/go-ethereum/trie"
-	"github.com/ethereum/go-ethereum/trie/triedb/hashdb"
+	"github.com/ethereum/go-ethereum/triedb"
+	"github.com/ethereum/go-ethereum/triedb/hashdb"
+	"github.com/holiman/uint256"
 	"github.com/stretchr/testify/require"
 )
 
@@ -111,7 +112,7 @@ func TestPut(t *testing.T) {
 func TestSupportsStateDBOperations(t *testing.T) {
 	l2Genesis := createGenesis()
 	realDb := rawdb.NewDatabase(memorydb.New())
-	trieDB := trie.NewDatabase(realDb, &trie.Config{HashDB: hashdb.Defaults})
+	trieDB := triedb.NewDatabase(realDb, &triedb.Config{HashDB: hashdb.Defaults})
 	genesisBlock := l2Genesis.MustCommit(realDb, trieDB)
 
 	loader := test.NewKvStateOracle(t, realDb)
@@ -123,19 +124,19 @@ func TestUpdateState(t *testing.T) {
 	oracle := test.NewStubStateOracle(t)
 	db := rawdb.NewDatabase(NewOracleBackedDB(oracle))
 
-	trieDB := trie.NewDatabase(db, &trie.Config{HashDB: hashdb.Defaults})
+	trieDB := triedb.NewDatabase(db, &triedb.Config{HashDB: hashdb.Defaults})
 	genesisBlock := l2Genesis.MustCommit(db, trieDB)
 	assertStateDataAvailable(t, db, l2Genesis, genesisBlock)
 
 	statedb, err := state.New(genesisBlock.Root(), state.NewDatabase(rawdb.NewDatabase(db)), nil)
 	require.NoError(t, err)
-	statedb.SetBalance(userAccount, big.NewInt(50))
-	require.Equal(t, big.NewInt(50), statedb.GetBalance(userAccount))
+	statedb.SetBalance(userAccount, uint256.NewInt(50))
+	require.Equal(t, uint256.NewInt(50), statedb.GetBalance(userAccount))
 	statedb.SetNonce(userAccount, uint64(5))
 	require.Equal(t, uint64(5), statedb.GetNonce(userAccount))
 
-	statedb.SetBalance(unknownAccount, big.NewInt(60))
-	require.Equal(t, big.NewInt(60), statedb.GetBalance(unknownAccount))
+	statedb.SetBalance(unknownAccount, uint256.NewInt(60))
+	require.Equal(t, uint256.NewInt(60), statedb.GetBalance(unknownAccount))
 	statedb.SetCode(codeAccount, []byte{1})
 	require.Equal(t, []byte{1}, statedb.GetCode(codeAccount))
 
@@ -147,9 +148,9 @@ func TestUpdateState(t *testing.T) {
 
 	statedb, err = state.New(newRoot, state.NewDatabase(rawdb.NewDatabase(db)), nil)
 	require.NoError(t, err)
-	require.Equal(t, big.NewInt(50), statedb.GetBalance(userAccount))
+	require.Equal(t, uint256.NewInt(50), statedb.GetBalance(userAccount))
 	require.Equal(t, uint64(5), statedb.GetNonce(userAccount))
-	require.Equal(t, big.NewInt(60), statedb.GetBalance(unknownAccount))
+	require.Equal(t, uint256.NewInt(60), statedb.GetBalance(unknownAccount))
 	require.Equal(t, []byte{1}, statedb.GetCode(codeAccount))
 }
 
@@ -159,7 +160,7 @@ func createGenesis() *core.Genesis {
 		Difficulty: common.Big0,
 		ParentHash: common.Hash{},
 		BaseFee:    big.NewInt(7),
-		Alloc: map[common.Address]core.GenesisAccount{
+		Alloc: map[common.Address]types.Account{
 			userAccount: {
 				Balance: big.NewInt(1_000_000_000_000_000_000),
 				Nonce:   10,
@@ -183,7 +184,7 @@ func assertStateDataAvailable(t *testing.T, db ethdb.KeyValueStore, l2Genesis *c
 	require.NoError(t, err)
 
 	for address, account := range l2Genesis.Alloc {
-		require.Equal(t, account.Balance, statedb.GetBalance(address))
+		require.Equal(t, uint256.MustFromBig(account.Balance), statedb.GetBalance(address))
 		require.Equal(t, account.Nonce, statedb.GetNonce(address))
 		require.Equal(t, common.BytesToHash(crypto.Keccak256(account.Code)), statedb.GetCodeHash(address))
 		require.Equal(t, account.Code, statedb.GetCode(address))
@@ -192,7 +193,7 @@ func assertStateDataAvailable(t *testing.T, db ethdb.KeyValueStore, l2Genesis *c
 		}
 	}
 	require.Equal(t, common.Hash{}, statedb.GetState(codeAccount, common.HexToHash("0x99")), "retrieve unset storage key")
-	require.Equal(t, common.Big0, statedb.GetBalance(unknownAccount), "unset account balance")
+	require.Equal(t, common.U2560, statedb.GetBalance(unknownAccount), "unset account balance")
 	require.Equal(t, uint64(0), statedb.GetNonce(unknownAccount), "unset account balance")
 	require.Nil(t, statedb.GetCode(unknownAccount), "unset account code")
 	require.Equal(t, common.Hash{}, statedb.GetCodeHash(unknownAccount), "unset account code hash")
diff --git a/op-program/client/l2/engine.go b/op-program/client/l2/engine.go
index b3040187138c..ee5e1e937ecf 100644
--- a/op-program/client/l2/engine.go
+++ b/op-program/client/l2/engine.go
@@ -5,11 +5,11 @@ import (
 	"errors"
 	"fmt"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	"github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
diff --git a/op-program/client/l2/engine_backend_test.go b/op-program/client/l2/engine_backend_test.go
index 0801d8738038..2e6922e77148 100644
--- a/op-program/client/l2/engine_backend_test.go
+++ b/op-program/client/l2/engine_backend_test.go
@@ -19,8 +19,8 @@ import (
 	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/ethereum/go-ethereum/params"
-	"github.com/ethereum/go-ethereum/trie"
-	"github.com/ethereum/go-ethereum/trie/triedb/hashdb"
+	"github.com/ethereum/go-ethereum/triedb"
+	"github.com/ethereum/go-ethereum/triedb/hashdb"
 	"github.com/stretchr/testify/require"
 )
 
@@ -294,14 +294,14 @@ func setupOracle(t *testing.T, blockCount int, headBlockNumber int, enableEcoton
 	l2Genesis, err := genesis.NewL2Genesis(deployConfig, l1Genesis.ToBlock())
 	require.NoError(t, err)
 
-	l2Genesis.Alloc[fundedAddress] = core.GenesisAccount{
+	l2Genesis.Alloc[fundedAddress] = types.Account{
 		Balance: big.NewInt(1_000_000_000_000_000_000),
 		Nonce:   0,
 	}
 	chainCfg := l2Genesis.Config
 	consensus := beacon.New(nil)
 	db := rawdb.NewMemoryDatabase()
-	trieDB := trie.NewDatabase(db, &trie.Config{HashDB: hashdb.Defaults})
+	trieDB := triedb.NewDatabase(db, &triedb.Config{HashDB: hashdb.Defaults})
 
 	// Set minimal amount of stuff to avoid nil references later
 	genesisBlock := l2Genesis.MustCommit(db, trieDB)
diff --git a/op-program/client/l2/engine_test.go b/op-program/client/l2/engine_test.go
index a3008115fbff..b96db24d0cc9 100644
--- a/op-program/client/l2/engine_test.go
+++ b/op-program/client/l2/engine_test.go
@@ -161,13 +161,13 @@ func createOracleEngine(t *testing.T) (*OracleEngine, *stubEngineBackend) {
 	}
 	engine := OracleEngine{
 		backend:   backend,
-		rollupCfg: chaincfg.Goerli,
+		rollupCfg: chaincfg.Sepolia,
 	}
 	return &engine, backend
 }
 
 func createL2Block(t *testing.T, number int) *types.Block {
-	tx, err := derive.L1InfoDeposit(chaincfg.Goerli, eth.SystemConfig{}, uint64(1), eth.HeaderBlockInfo(&types.Header{
+	tx, err := derive.L1InfoDeposit(chaincfg.Sepolia, eth.SystemConfig{}, uint64(1), eth.HeaderBlockInfo(&types.Header{
 		Number:  big.NewInt(32),
 		BaseFee: big.NewInt(7),
 	}), 0)
diff --git a/op-program/client/mpt/trie.go b/op-program/client/mpt/trie.go
index daa530f42baf..981f7c436145 100644
--- a/op-program/client/mpt/trie.go
+++ b/op-program/client/mpt/trie.go
@@ -9,7 +9,8 @@ import (
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/rlp"
 	"github.com/ethereum/go-ethereum/trie"
-	"github.com/ethereum/go-ethereum/trie/triedb/hashdb"
+	"github.com/ethereum/go-ethereum/triedb"
+	"github.com/ethereum/go-ethereum/triedb/hashdb"
 )
 
 // ReadTrie takes a Merkle Patricia Trie (MPT) root of a "DerivableList", and a pre-image oracle getter,
@@ -47,7 +48,7 @@ func ReadTrie(root common.Hash, getPreimage func(key common.Hash) []byte) []hexu
 	//
 	// For now we just use the state DB trie approach.
 
-	tdb := trie.NewDatabase(odb, &trie.Config{HashDB: hashdb.Defaults})
+	tdb := triedb.NewDatabase(odb, &triedb.Config{HashDB: hashdb.Defaults})
 	tr, err := trie.New(trie.TrieID(root), tdb)
 	if err != nil {
 		panic(err)
@@ -115,11 +116,11 @@ func (n noResetHasher) Reset() {}
 // if any values are less than 32 bytes and fit into branch-node slots that way.
 func WriteTrie(values []hexutil.Bytes) (common.Hash, []hexutil.Bytes) {
 	var out []hexutil.Bytes
-	st := noResetHasher{trie.NewStackTrie(
-		trie.NewStackTrieOptions().WithWriter(
-			func(path []byte, hash common.Hash, blob []byte) {
-				out = append(out, common.CopyBytes(blob)) // the stack hasher may mutate the blob bytes, so copy them.
-			}))}
+	st := noResetHasher{
+		trie.NewStackTrie(func(path []byte, hash common.Hash, blob []byte) {
+			out = append(out, common.CopyBytes(blob)) // the stack hasher may mutate the blob bytes, so copy them.
+		}),
+	}
 	root := types.DeriveSha(rawList(values), st)
 	return root, out
 }
diff --git a/op-program/host/cmd/main_test.go b/op-program/host/cmd/main_test.go
index 928158c7cd01..0bff6513ffc5 100644
--- a/op-program/host/cmd/main_test.go
+++ b/op-program/host/cmd/main_test.go
@@ -25,8 +25,8 @@ var (
 	l2ClaimValue       = common.HexToHash("0x333333").Hex()
 	l2OutputRoot       = common.HexToHash("0x444444").Hex()
 	l2ClaimBlockNumber = uint64(1203)
-	// Note: This is actually the L1 goerli genesis config. Just using it as an arbitrary, valid genesis config
-	l2Genesis       = core.DefaultGoerliGenesisBlock()
+	// Note: This is actually the L1 Sepolia genesis config. Just using it as an arbitrary, valid genesis config
+	l2Genesis       = core.DefaultSepoliaGenesisBlock()
 	l2GenesisConfig = l2Genesis.Config
 )
 
@@ -67,11 +67,11 @@ func TestLogFormat(t *testing.T) {
 
 func TestDefaultCLIOptionsMatchDefaultConfig(t *testing.T) {
 	cfg := configForArgs(t, addRequiredArgs())
-	rollupCfg, err := chaincfg.GetRollupConfig("op-goerli")
+	rollupCfg, err := chaincfg.GetRollupConfig("op-sepolia")
 	require.NoError(t, err)
 	defaultCfg := config.NewConfig(
 		rollupCfg,
-		chainconfig.OPGoerliChainConfig,
+		chainconfig.OPSepoliaChainConfig,
 		common.HexToHash(l1HeadValue),
 		common.HexToHash(l2HeadValue),
 		common.HexToHash(l2OutputRoot),
@@ -98,7 +98,7 @@ func TestNetwork(t *testing.T) {
 		genesisFile := writeValidGenesis(t)
 
 		cfg := configForArgs(t, addRequiredArgsExcept("--network", "--rollup.config", configFile, "--l2.genesis", genesisFile))
-		require.Equal(t, *chaincfg.Goerli, *cfg.Rollup)
+		require.Equal(t, *chaincfg.Sepolia, *cfg.Rollup)
 	})
 
 	for _, name := range chaincfg.AvailableNetworks() {
@@ -139,8 +139,8 @@ func TestL2Genesis(t *testing.T) {
 	})
 
 	t.Run("NotRequiredForGoerli", func(t *testing.T) {
-		cfg := configForArgs(t, replaceRequiredArg("--network", "goerli"))
-		require.Equal(t, chainconfig.OPGoerliChainConfig, cfg.L2ChainConfig)
+		cfg := configForArgs(t, replaceRequiredArg("--network", "sepolia"))
+		require.Equal(t, chainconfig.OPSepoliaChainConfig, cfg.L2ChainConfig)
 	})
 }
 
@@ -352,7 +352,7 @@ func replaceRequiredArg(name string, value string) []string {
 // to create a valid Config
 func requiredArgs() map[string]string {
 	return map[string]string{
-		"--network":        "goerli",
+		"--network":        "sepolia",
 		"--l1.head":        l1HeadValue,
 		"--l2.head":        l2HeadValue,
 		"--l2.outputroot":  l2OutputRoot,
@@ -372,7 +372,7 @@ func writeValidGenesis(t *testing.T) string {
 
 func writeValidRollupConfig(t *testing.T) string {
 	dir := t.TempDir()
-	j, err := json.Marshal(chaincfg.Goerli)
+	j, err := json.Marshal(chaincfg.Sepolia)
 	require.NoError(t, err)
 	cfgFile := dir + "/rollup.json"
 	require.NoError(t, os.WriteFile(cfgFile, j, 0666))
diff --git a/op-program/host/config/config_test.go b/op-program/host/config/config_test.go
index 2b85da110778..7497b5db4bd9 100644
--- a/op-program/host/config/config_test.go
+++ b/op-program/host/config/config_test.go
@@ -13,8 +13,8 @@ import (
 )
 
 var (
-	validRollupConfig    = chaincfg.Goerli
-	validL2Genesis       = chainconfig.OPGoerliChainConfig
+	validRollupConfig    = chaincfg.Sepolia
+	validL2Genesis       = chainconfig.OPSepoliaChainConfig
 	validL1Head          = common.Hash{0xaa}
 	validL2Head          = common.Hash{0xbb}
 	validL2Claim         = common.Hash{0xcc}
diff --git a/op-program/host/host_test.go b/op-program/host/host_test.go
index c46ebe781190..2e7cc4d21646 100644
--- a/op-program/host/host_test.go
+++ b/op-program/host/host_test.go
@@ -25,7 +25,7 @@ func TestServerMode(t *testing.T) {
 
 	l1Head := common.Hash{0x11}
 	l2OutputRoot := common.Hash{0x33}
-	cfg := config.NewConfig(chaincfg.Goerli, chainconfig.OPGoerliChainConfig, l1Head, common.Hash{0x22}, l2OutputRoot, common.Hash{0x44}, 1000)
+	cfg := config.NewConfig(chaincfg.Sepolia, chainconfig.OPSepoliaChainConfig, l1Head, common.Hash{0x22}, l2OutputRoot, common.Hash{0x44}, 1000)
 	cfg.DataDir = dir
 	cfg.ServerMode = true
 
diff --git a/op-program/host/kvstore/local_test.go b/op-program/host/kvstore/local_test.go
index d3b601d45b1e..d42a89a0c271 100644
--- a/op-program/host/kvstore/local_test.go
+++ b/op-program/host/kvstore/local_test.go
@@ -15,7 +15,7 @@ import (
 
 func TestLocalPreimageSource(t *testing.T) {
 	cfg := &config.Config{
-		Rollup:             chaincfg.Goerli,
+		Rollup:             chaincfg.Sepolia,
 		L1Head:             common.HexToHash("0x1111"),
 		L2OutputRoot:       common.HexToHash("0x2222"),
 		L2Claim:            common.HexToHash("0x3333"),
diff --git a/op-program/host/prefetcher/prefetcher_test.go b/op-program/host/prefetcher/prefetcher_test.go
index 6ffb9bd5af8a..84cab6d7d7ea 100644
--- a/op-program/host/prefetcher/prefetcher_test.go
+++ b/op-program/host/prefetcher/prefetcher_test.go
@@ -7,8 +7,6 @@ import (
 	"math/rand"
 	"testing"
 
-	"github.com/consensys/gnark-crypto/ecc/bls12-381/fr"
-	gokzg4844 "github.com/crate-crypto/go-kzg-4844"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/crypto"
@@ -158,38 +156,29 @@ func TestFetchL1Receipts(t *testing.T) {
 	})
 }
 
-// Globally initialize a kzgCtx for blob tests.
-var kzgCtx, _ = gokzg4844.NewContext4096Secure()
-
-// Returns a serialized random field element in big-endian
-func GetRandFieldElement(seed int64) [32]byte {
-	var r fr.Element
-	_, _ = r.SetRandom()
-	return gokzg4844.SerializeScalar(r)
-}
-
-func GetRandBlob(seed int64) gokzg4844.Blob {
-	var blob gokzg4844.Blob
-	bytesPerBlob := gokzg4844.ScalarsPerBlob * gokzg4844.SerializedScalarSize
-	for i := 0; i < bytesPerBlob; i += gokzg4844.SerializedScalarSize {
-		fieldElementBytes := GetRandFieldElement(seed + int64(i))
-		copy(blob[i:i+gokzg4844.SerializedScalarSize], fieldElementBytes[:])
+func GetRandBlob(t *testing.T, seed int64) eth.Blob {
+	r := rand.New(rand.NewSource(seed))
+	bigData := eth.Data(make([]byte, eth.MaxBlobDataSize))
+	for i := range bigData {
+		bigData[i] = byte(r.Intn(256))
 	}
-	return blob
+	var b eth.Blob
+	err := b.FromData(bigData)
+	require.NoError(t, err)
+	return b
 }
 
 func TestFetchL1Blob(t *testing.T) {
-	blob := GetRandBlob(0xf00f00)
-	commitment, err := kzgCtx.BlobToKZGCommitment(blob, 0)
+	blob := GetRandBlob(t, 0xf00f00)
+	commitment, err := blob.ComputeKZGCommitment()
 	require.NoError(t, err)
-	versionedHash := sha256.Sum256(commitment[:])
-	versionedHash[0] = params.BlobTxHashVersion
+	versionedHash := eth.KZGToVersionedHash(commitment)
 	blobHash := eth.IndexedBlobHash{Hash: versionedHash, Index: 0xFACADE}
 	l1Ref := eth.L1BlockRef{Time: 0}
 
 	t.Run("AlreadyKnown", func(t *testing.T) {
 		prefetcher, _, blobFetcher, _, kv := createPrefetcher(t)
-		storeBlob(t, kv, (eth.Bytes48)(commitment), (*eth.Blob)(&blob))
+		storeBlob(t, kv, (eth.Bytes48)(commitment), &blob)
 
 		oracle := l1.NewPreimageOracle(asOracleFn(t, prefetcher), asHinter(t, prefetcher))
 		defer blobFetcher.AssertExpectations(t)
@@ -207,7 +196,7 @@ func TestFetchL1Blob(t *testing.T) {
 			l1Ref,
 			[]eth.IndexedBlobHash{blobHash},
 			(eth.Bytes48)(commitment),
-			[]*eth.Blob{(*eth.Blob)(&blob)},
+			[]*eth.Blob{&blob},
 			nil,
 		)
 		defer blobFetcher.AssertExpectations(t)
diff --git a/op-program/host/prefetcher/retry_test.go b/op-program/host/prefetcher/retry_test.go
index 205b3ce84d0e..737635b57d95 100644
--- a/op-program/host/prefetcher/retry_test.go
+++ b/op-program/host/prefetcher/retry_test.go
@@ -2,7 +2,6 @@ package prefetcher
 
 import (
 	"context"
-	"crypto/sha256"
 	"errors"
 	"testing"
 
@@ -12,7 +11,6 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
-	"github.com/ethereum/go-ethereum/params"
 
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/retry"
@@ -115,11 +113,10 @@ func createL1Source(t *testing.T) (*RetryingL1Source, *testutils.MockL1Source) {
 
 func TestRetryingL1BlobSource(t *testing.T) {
 	ctx := context.Background()
-	blob := GetRandBlob(0xFACADE)
-	commitment, err := kzgCtx.BlobToKZGCommitment(blob, 0)
+	blob := GetRandBlob(t, 0xFACADE)
+	commitment, err := blob.ComputeKZGCommitment()
 	require.NoError(t, err)
-	versionedHash := sha256.Sum256(commitment[:])
-	versionedHash[0] = params.BlobTxHashVersion
+	versionedHash := eth.KZGToVersionedHash(commitment)
 	blobHash := eth.IndexedBlobHash{Hash: versionedHash, Index: 0xFACADE}
 	l1BlockRef := eth.L1BlockRef{Time: 0}
 
diff --git a/op-program/verify/sepolia/cmd/sepolia.go b/op-program/verify/sepolia/cmd/sepolia.go
index 50c38d4a70ec..c89e67cea931 100644
--- a/op-program/verify/sepolia/cmd/sepolia.go
+++ b/op-program/verify/sepolia/cmd/sepolia.go
@@ -44,7 +44,7 @@ func main() {
 		os.Exit(2)
 	}
 
-	runner, err := verify.NewRunner(l1RpcUrl, l1RpcKind, l1BeaconUrl, l2RpcUrl, dataDir, "sepolia", chainconfig.OPSepoliaChainConfig)
+	runner, err := verify.NewRunner(l1RpcUrl, l1RpcKind, l1BeaconUrl, l2RpcUrl, dataDir, "op-sepolia", chainconfig.OPSepoliaChainConfig)
 	if err != nil {
 		_, _ = fmt.Fprintf(os.Stderr, "Failed to create runner: %v\n", err.Error())
 		os.Exit(1)
diff --git a/op-proposer/Dockerfile b/op-proposer/Dockerfile
deleted file mode 100644
index 8eb4b7cc0ebb..000000000000
--- a/op-proposer/Dockerfile
+++ /dev/null
@@ -1,9 +0,0 @@
-ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest
-FROM $OP_STACK_GO_BUILDER as builder
-# See "make golang-docker" and /ops/docker/op-stack-go
-
-FROM alpine:3.18
-
-COPY --from=builder /usr/local/bin/op-proposer /usr/local/bin/op-proposer
-
-CMD ["op-proposer"]
diff --git a/op-proposer/Dockerfile.dockerignore b/op-proposer/Dockerfile.dockerignore
deleted file mode 100644
index 4f26140750a0..000000000000
--- a/op-proposer/Dockerfile.dockerignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# ignore everything but the dockerfile, the op-stack-go base image performs the build
-*
diff --git a/op-proposer/Makefile b/op-proposer/Makefile
index 00bb036b78b8..dff47b41d799 100644
--- a/op-proposer/Makefile
+++ b/op-proposer/Makefile
@@ -1,6 +1,18 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+# Find the github tag that points to this commit. If none are found, set the version string to "untagged"
+# Prioritizes release tag, if one exists, over tags suffixed with "-rc"
+VERSION ?= $(shell tags=$$(git tag --points-at $(GITCOMMIT) | grep '^op-proposer/' | sed 's/op-proposer\///' | sort -V); \
+             preferred_tag=$$(echo "$$tags" | grep -v -- '-rc' | tail -n 1); \
+             if [ -z "$$preferred_tag" ]; then \
+                 if [ -z "$$tags" ]; then \
+                     echo "untagged"; \
+                 else \
+                     echo "$$tags" | tail -n 1; \
+                 fi \
+             else \
+                 echo $$preferred_tag; \
+             fi)
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
diff --git a/op-proposer/bindings/disputegamefactory.go b/op-proposer/bindings/disputegamefactory.go
new file mode 100644
index 000000000000..1bfb6a73da2b
--- /dev/null
+++ b/op-proposer/bindings/disputegamefactory.go
@@ -0,0 +1,1404 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// IDisputeGameFactoryGameSearchResult is an auto generated low-level Go binding around an user-defined struct.
+type IDisputeGameFactoryGameSearchResult struct {
+	Index     *big.Int
+	Metadata  [32]byte
+	Timestamp uint64
+	RootClaim [32]byte
+	ExtraData []byte
+}
+
+// DisputeGameFactoryMetaData contains all meta data concerning the DisputeGameFactory contract.
+var DisputeGameFactoryMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"create\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"findLatestGames\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_n\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"games_\",\"type\":\"tuple[]\",\"internalType\":\"structIDisputeGameFactory.GameSearchResult[]\",\"components\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"metadata\",\"type\":\"bytes32\",\"internalType\":\"GameId\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"},{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameAtIndex\",\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"timestamp_\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"},{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameCount\",\"inputs\":[],\"outputs\":[{\"name\":\"gameCount_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameImpls\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"games\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"proxy_\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"},{\"name\":\"timestamp_\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGameUUID\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"uuid_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initBonds\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setImplementation\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_impl\",\"type\":\"address\",\"internalType\":\"contractIDisputeGame\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setInitBond\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_initBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DisputeGameCreated\",\"inputs\":[{\"name\":\"disputeProxy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"},{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"Claim\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ImplementationSet\",\"inputs\":[{\"name\":\"impl\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitBondUpdated\",\"inputs\":[{\"name\":\"gameType\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"GameType\"},{\"name\":\"newBond\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"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\":\"error\",\"name\":\"GameAlreadyExists\",\"inputs\":[{\"name\":\"uuid\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}]},{\"type\":\"error\",\"name\":\"IncorrectBondAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoImplementation\",\"inputs\":[{\"name\":\"gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"}]}]",
+	Bin: "0x60806040523480156200001157600080fd5b506200001e600062000024565b62000292565b600054610100900460ff1615808015620000455750600054600160ff909116105b8062000075575062000062306200016260201b62000cdd1760201c565b15801562000075575060005460ff166001145b620000de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000102576000805461ff0019166101001790555b6200010c62000171565b6200011782620001d9565b80156200015e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054610100900460ff16620001cd5760405162461bcd60e51b815260206004820152602b60248201526000805160206200185283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b620001d76200022b565b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16620002875760405162461bcd60e51b815260206004820152602b60248201526000805160206200185283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b620001d733620001d9565b6115b080620002a26000396000f3fe6080604052600436106100e85760003560e01c80636593dc6e1161008a57806396cd97201161005957806396cd972014610313578063bb8aa1fc14610333578063c4d66de814610394578063f2fde38b146103b457600080fd5b80636593dc6e14610293578063715018a6146102c057806382ecf2f6146102d55780638da5cb5b146102e857600080fd5b8063254bd683116100c6578063254bd6831461019c5780634d1975b4146101c957806354fd4d50146101e85780635f0150cb1461023e57600080fd5b806314f6b1a3146100ed5780631b685b9e1461010f5780631e3342401461017c575b600080fd5b3480156100f957600080fd5b5061010d6101083660046110bf565b6103d4565b005b34801561011b57600080fd5b5061015261012a3660046110f6565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061010d610197366004611111565b61045e565b3480156101a857600080fd5b506101bc6101b736600461113b565b6104aa565b60405161017391906111e8565b3480156101d557600080fd5b506068545b604051908152602001610173565b3480156101f457600080fd5b506102316040518060400160405280600581526020017f302e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161017391906112a5565b34801561024a57600080fd5b5061025e6102593660046112b8565b6106ee565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff909116602083015201610173565b34801561029f57600080fd5b506101da6102ae3660046110f6565b60666020526000908152604090205481565b3480156102cc57600080fd5b5061010d610741565b6101526102e33660046112b8565b610755565b3480156102f457600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610152565b34801561031f57600080fd5b506101da61032e3660046112b8565b6109ef565b34801561033f57600080fd5b5061035361034e36600461133f565b610a28565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610173565b3480156103a057600080fd5b5061010d6103af366004611358565b610a8a565b3480156103c057600080fd5b5061010d6103cf366004611358565b610c26565b6103dc610cf9565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610466610cf9565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806104bc575081155b6106e7575060408051600583901b8101602001909152825b8381116106e5576000606882815481106104f0576104f0611375565b600091825260209091200154905060e081901c60a082901c67ffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff831663ffffffff891683036106b6576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d091908101906113d3565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610643919061149e565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a5161068591906114b7565b8151811061069557610695611375565b6020026020010181905250888851106106b3575050505050506106e5565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506104d49050565b505b9392505050565b60008060006106ff878787876109ef565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610749610cf9565b6107536000610d7a565b565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107c5576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff86166000908152606660205260409020543414610813576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108206001436114b7565b40905061088a338783888860405160200161083f9594939291906114f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff841690610df1565b92508273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108d457600080fd5b505af11580156108e8573d6000803e3d6000fd5b505050505060006108fb888888886109ef565b60008181526067602052604090205490915015610947576040517f014f6fe5000000000000000000000000000000000000000000000000000000008152600481018290526024016107bc565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610a089493929190611542565b604051602081830303815290604052805190602001209050949350505050565b6000806000610a7d60688581548110610a4357610a43611375565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9196909550909350915050565b600054610100900460ff1615808015610aaa5750600054600160ff909116105b80610ac45750303b158015610ac4575060005460ff166001145b610b50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bc565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bae57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bb6610dff565b610bbf82610d7a565b8015610c2257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610c2e610cf9565b73ffffffffffffffffffffffffffffffffffffffff8116610cd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bc565b610cda81610d7a565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006106e760008484610e9e565b600054610100900460ff16610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b610753610fe4565b600060608203516040830351602084035184518060208701018051600283016c5af43d3d93803e606057fd5bf3895289600d8a035278593da1005b363d3d373d3d3d3d610000806062363936013d738160481b1760218a03527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff603a8a035272fd6100003d81600a3d39f336602c57343d527f6062820160781b1761ff9e82106059018a03528060f01b8352606c8101604c8a038cf097505086610f6a5763301164256000526004601cfd5b905285527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09092019190915292915050565b600054610100900460ff1661107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b61075333610d7a565b803563ffffffff8116811461109857600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610cda57600080fd5b600080604083850312156110d257600080fd5b6110db83611084565b915060208301356110eb8161109d565b809150509250929050565b60006020828403121561110857600080fd5b6106e782611084565b6000806040838503121561112457600080fd5b61112d83611084565b946020939093013593505050565b60008060006060848603121561115057600080fd5b61115984611084565b95602085013595506040909401359392505050565b60005b83811015611189578181015183820152602001611171565b83811115611198576000848401525b50505050565b600081518084526111b681602086016020860161116e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611297578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a0918501829052906112838186018361119e565b96890196945050509086019060010161120f565b509098975050505050505050565b6020815260006106e7602083018461119e565b600080600080606085870312156112ce57600080fd5b6112d785611084565b935060208501359250604085013567ffffffffffffffff808211156112fb57600080fd5b818701915087601f83011261130f57600080fd5b81358181111561131e57600080fd5b88602082850101111561133057600080fd5b95989497505060200194505050565b60006020828403121561135157600080fd5b5035919050565b60006020828403121561136a57600080fd5b81356106e78161109d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113e557600080fd5b815167ffffffffffffffff808211156113fd57600080fd5b818401915084601f83011261141157600080fd5b815181811115611423576114236113a4565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611469576114696113a4565b8160405282815287602084870101111561148257600080fd5b61149383602083016020880161116e565b979650505050505050565b6000602082840312156114b057600080fd5b5051919050565b6000828210156114f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1681528460148201528360348201528183605483013760009101605401908152949350505050565b63ffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
+}
+
+// DisputeGameFactoryABI is the input ABI used to generate the binding from.
+// Deprecated: Use DisputeGameFactoryMetaData.ABI instead.
+var DisputeGameFactoryABI = DisputeGameFactoryMetaData.ABI
+
+// DisputeGameFactoryBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use DisputeGameFactoryMetaData.Bin instead.
+var DisputeGameFactoryBin = DisputeGameFactoryMetaData.Bin
+
+// DeployDisputeGameFactory deploys a new Ethereum contract, binding an instance of DisputeGameFactory to it.
+func DeployDisputeGameFactory(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *DisputeGameFactory, error) {
+	parsed, err := DisputeGameFactoryMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(DisputeGameFactoryBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &DisputeGameFactory{DisputeGameFactoryCaller: DisputeGameFactoryCaller{contract: contract}, DisputeGameFactoryTransactor: DisputeGameFactoryTransactor{contract: contract}, DisputeGameFactoryFilterer: DisputeGameFactoryFilterer{contract: contract}}, nil
+}
+
+// DisputeGameFactory is an auto generated Go binding around an Ethereum contract.
+type DisputeGameFactory struct {
+	DisputeGameFactoryCaller     // Read-only binding to the contract
+	DisputeGameFactoryTransactor // Write-only binding to the contract
+	DisputeGameFactoryFilterer   // Log filterer for contract events
+}
+
+// DisputeGameFactoryCaller is an auto generated read-only Go binding around an Ethereum contract.
+type DisputeGameFactoryCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DisputeGameFactoryTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type DisputeGameFactoryTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DisputeGameFactoryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type DisputeGameFactoryFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// DisputeGameFactorySession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type DisputeGameFactorySession struct {
+	Contract     *DisputeGameFactory // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts       // Call options to use throughout this session
+	TransactOpts bind.TransactOpts   // Transaction auth options to use throughout this session
+}
+
+// DisputeGameFactoryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type DisputeGameFactoryCallerSession struct {
+	Contract *DisputeGameFactoryCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts             // Call options to use throughout this session
+}
+
+// DisputeGameFactoryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type DisputeGameFactoryTransactorSession struct {
+	Contract     *DisputeGameFactoryTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
+}
+
+// DisputeGameFactoryRaw is an auto generated low-level Go binding around an Ethereum contract.
+type DisputeGameFactoryRaw struct {
+	Contract *DisputeGameFactory // Generic contract binding to access the raw methods on
+}
+
+// DisputeGameFactoryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type DisputeGameFactoryCallerRaw struct {
+	Contract *DisputeGameFactoryCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// DisputeGameFactoryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type DisputeGameFactoryTransactorRaw struct {
+	Contract *DisputeGameFactoryTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewDisputeGameFactory creates a new instance of DisputeGameFactory, bound to a specific deployed contract.
+func NewDisputeGameFactory(address common.Address, backend bind.ContractBackend) (*DisputeGameFactory, error) {
+	contract, err := bindDisputeGameFactory(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactory{DisputeGameFactoryCaller: DisputeGameFactoryCaller{contract: contract}, DisputeGameFactoryTransactor: DisputeGameFactoryTransactor{contract: contract}, DisputeGameFactoryFilterer: DisputeGameFactoryFilterer{contract: contract}}, nil
+}
+
+// NewDisputeGameFactoryCaller creates a new read-only instance of DisputeGameFactory, bound to a specific deployed contract.
+func NewDisputeGameFactoryCaller(address common.Address, caller bind.ContractCaller) (*DisputeGameFactoryCaller, error) {
+	contract, err := bindDisputeGameFactory(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryCaller{contract: contract}, nil
+}
+
+// NewDisputeGameFactoryTransactor creates a new write-only instance of DisputeGameFactory, bound to a specific deployed contract.
+func NewDisputeGameFactoryTransactor(address common.Address, transactor bind.ContractTransactor) (*DisputeGameFactoryTransactor, error) {
+	contract, err := bindDisputeGameFactory(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryTransactor{contract: contract}, nil
+}
+
+// NewDisputeGameFactoryFilterer creates a new log filterer instance of DisputeGameFactory, bound to a specific deployed contract.
+func NewDisputeGameFactoryFilterer(address common.Address, filterer bind.ContractFilterer) (*DisputeGameFactoryFilterer, error) {
+	contract, err := bindDisputeGameFactory(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryFilterer{contract: contract}, nil
+}
+
+// bindDisputeGameFactory binds a generic wrapper to an already deployed contract.
+func bindDisputeGameFactory(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(DisputeGameFactoryABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_DisputeGameFactory *DisputeGameFactoryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _DisputeGameFactory.Contract.DisputeGameFactoryCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_DisputeGameFactory *DisputeGameFactoryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.DisputeGameFactoryTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_DisputeGameFactory *DisputeGameFactoryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.DisputeGameFactoryTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_DisputeGameFactory *DisputeGameFactoryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _DisputeGameFactory.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_DisputeGameFactory *DisputeGameFactoryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_DisputeGameFactory *DisputeGameFactoryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.contract.Transact(opts, method, params...)
+}
+
+// FindLatestGames is a free data retrieval call binding the contract method 0x254bd683.
+//
+// Solidity: function findLatestGames(uint32 _gameType, uint256 _start, uint256 _n) view returns((uint256,bytes32,uint64,bytes32,bytes)[] games_)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) FindLatestGames(opts *bind.CallOpts, _gameType uint32, _start *big.Int, _n *big.Int) ([]IDisputeGameFactoryGameSearchResult, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "findLatestGames", _gameType, _start, _n)
+
+	if err != nil {
+		return *new([]IDisputeGameFactoryGameSearchResult), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([]IDisputeGameFactoryGameSearchResult)).(*[]IDisputeGameFactoryGameSearchResult)
+
+	return out0, err
+
+}
+
+// FindLatestGames is a free data retrieval call binding the contract method 0x254bd683.
+//
+// Solidity: function findLatestGames(uint32 _gameType, uint256 _start, uint256 _n) view returns((uint256,bytes32,uint64,bytes32,bytes)[] games_)
+func (_DisputeGameFactory *DisputeGameFactorySession) FindLatestGames(_gameType uint32, _start *big.Int, _n *big.Int) ([]IDisputeGameFactoryGameSearchResult, error) {
+	return _DisputeGameFactory.Contract.FindLatestGames(&_DisputeGameFactory.CallOpts, _gameType, _start, _n)
+}
+
+// FindLatestGames is a free data retrieval call binding the contract method 0x254bd683.
+//
+// Solidity: function findLatestGames(uint32 _gameType, uint256 _start, uint256 _n) view returns((uint256,bytes32,uint64,bytes32,bytes)[] games_)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) FindLatestGames(_gameType uint32, _start *big.Int, _n *big.Int) ([]IDisputeGameFactoryGameSearchResult, error) {
+	return _DisputeGameFactory.Contract.FindLatestGames(&_DisputeGameFactory.CallOpts, _gameType, _start, _n)
+}
+
+// GameAtIndex is a free data retrieval call binding the contract method 0xbb8aa1fc.
+//
+// Solidity: function gameAtIndex(uint256 _index) view returns(uint32 gameType_, uint64 timestamp_, address proxy_)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) GameAtIndex(opts *bind.CallOpts, _index *big.Int) (struct {
+	GameType  uint32
+	Timestamp uint64
+	Proxy     common.Address
+}, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "gameAtIndex", _index)
+
+	outstruct := new(struct {
+		GameType  uint32
+		Timestamp uint64
+		Proxy     common.Address
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.GameType = *abi.ConvertType(out[0], new(uint32)).(*uint32)
+	outstruct.Timestamp = *abi.ConvertType(out[1], new(uint64)).(*uint64)
+	outstruct.Proxy = *abi.ConvertType(out[2], new(common.Address)).(*common.Address)
+
+	return *outstruct, err
+
+}
+
+// GameAtIndex is a free data retrieval call binding the contract method 0xbb8aa1fc.
+//
+// Solidity: function gameAtIndex(uint256 _index) view returns(uint32 gameType_, uint64 timestamp_, address proxy_)
+func (_DisputeGameFactory *DisputeGameFactorySession) GameAtIndex(_index *big.Int) (struct {
+	GameType  uint32
+	Timestamp uint64
+	Proxy     common.Address
+}, error) {
+	return _DisputeGameFactory.Contract.GameAtIndex(&_DisputeGameFactory.CallOpts, _index)
+}
+
+// GameAtIndex is a free data retrieval call binding the contract method 0xbb8aa1fc.
+//
+// Solidity: function gameAtIndex(uint256 _index) view returns(uint32 gameType_, uint64 timestamp_, address proxy_)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) GameAtIndex(_index *big.Int) (struct {
+	GameType  uint32
+	Timestamp uint64
+	Proxy     common.Address
+}, error) {
+	return _DisputeGameFactory.Contract.GameAtIndex(&_DisputeGameFactory.CallOpts, _index)
+}
+
+// GameCount is a free data retrieval call binding the contract method 0x4d1975b4.
+//
+// Solidity: function gameCount() view returns(uint256 gameCount_)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) GameCount(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "gameCount")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GameCount is a free data retrieval call binding the contract method 0x4d1975b4.
+//
+// Solidity: function gameCount() view returns(uint256 gameCount_)
+func (_DisputeGameFactory *DisputeGameFactorySession) GameCount() (*big.Int, error) {
+	return _DisputeGameFactory.Contract.GameCount(&_DisputeGameFactory.CallOpts)
+}
+
+// GameCount is a free data retrieval call binding the contract method 0x4d1975b4.
+//
+// Solidity: function gameCount() view returns(uint256 gameCount_)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) GameCount() (*big.Int, error) {
+	return _DisputeGameFactory.Contract.GameCount(&_DisputeGameFactory.CallOpts)
+}
+
+// GameImpls is a free data retrieval call binding the contract method 0x1b685b9e.
+//
+// Solidity: function gameImpls(uint32 ) view returns(address)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) GameImpls(opts *bind.CallOpts, arg0 uint32) (common.Address, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "gameImpls", arg0)
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// GameImpls is a free data retrieval call binding the contract method 0x1b685b9e.
+//
+// Solidity: function gameImpls(uint32 ) view returns(address)
+func (_DisputeGameFactory *DisputeGameFactorySession) GameImpls(arg0 uint32) (common.Address, error) {
+	return _DisputeGameFactory.Contract.GameImpls(&_DisputeGameFactory.CallOpts, arg0)
+}
+
+// GameImpls is a free data retrieval call binding the contract method 0x1b685b9e.
+//
+// Solidity: function gameImpls(uint32 ) view returns(address)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) GameImpls(arg0 uint32) (common.Address, error) {
+	return _DisputeGameFactory.Contract.GameImpls(&_DisputeGameFactory.CallOpts, arg0)
+}
+
+// Games is a free data retrieval call binding the contract method 0x5f0150cb.
+//
+// Solidity: function games(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) view returns(address proxy_, uint64 timestamp_)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) Games(opts *bind.CallOpts, _gameType uint32, _rootClaim [32]byte, _extraData []byte) (struct {
+	Proxy     common.Address
+	Timestamp uint64
+}, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "games", _gameType, _rootClaim, _extraData)
+
+	outstruct := new(struct {
+		Proxy     common.Address
+		Timestamp uint64
+	})
+	if err != nil {
+		return *outstruct, err
+	}
+
+	outstruct.Proxy = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+	outstruct.Timestamp = *abi.ConvertType(out[1], new(uint64)).(*uint64)
+
+	return *outstruct, err
+
+}
+
+// Games is a free data retrieval call binding the contract method 0x5f0150cb.
+//
+// Solidity: function games(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) view returns(address proxy_, uint64 timestamp_)
+func (_DisputeGameFactory *DisputeGameFactorySession) Games(_gameType uint32, _rootClaim [32]byte, _extraData []byte) (struct {
+	Proxy     common.Address
+	Timestamp uint64
+}, error) {
+	return _DisputeGameFactory.Contract.Games(&_DisputeGameFactory.CallOpts, _gameType, _rootClaim, _extraData)
+}
+
+// Games is a free data retrieval call binding the contract method 0x5f0150cb.
+//
+// Solidity: function games(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) view returns(address proxy_, uint64 timestamp_)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) Games(_gameType uint32, _rootClaim [32]byte, _extraData []byte) (struct {
+	Proxy     common.Address
+	Timestamp uint64
+}, error) {
+	return _DisputeGameFactory.Contract.Games(&_DisputeGameFactory.CallOpts, _gameType, _rootClaim, _extraData)
+}
+
+// GetGameUUID is a free data retrieval call binding the contract method 0x96cd9720.
+//
+// Solidity: function getGameUUID(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) pure returns(bytes32 uuid_)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) GetGameUUID(opts *bind.CallOpts, _gameType uint32, _rootClaim [32]byte, _extraData []byte) ([32]byte, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "getGameUUID", _gameType, _rootClaim, _extraData)
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// GetGameUUID is a free data retrieval call binding the contract method 0x96cd9720.
+//
+// Solidity: function getGameUUID(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) pure returns(bytes32 uuid_)
+func (_DisputeGameFactory *DisputeGameFactorySession) GetGameUUID(_gameType uint32, _rootClaim [32]byte, _extraData []byte) ([32]byte, error) {
+	return _DisputeGameFactory.Contract.GetGameUUID(&_DisputeGameFactory.CallOpts, _gameType, _rootClaim, _extraData)
+}
+
+// GetGameUUID is a free data retrieval call binding the contract method 0x96cd9720.
+//
+// Solidity: function getGameUUID(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) pure returns(bytes32 uuid_)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) GetGameUUID(_gameType uint32, _rootClaim [32]byte, _extraData []byte) ([32]byte, error) {
+	return _DisputeGameFactory.Contract.GetGameUUID(&_DisputeGameFactory.CallOpts, _gameType, _rootClaim, _extraData)
+}
+
+// InitBonds is a free data retrieval call binding the contract method 0x6593dc6e.
+//
+// Solidity: function initBonds(uint32 ) view returns(uint256)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) InitBonds(opts *bind.CallOpts, arg0 uint32) (*big.Int, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "initBonds", arg0)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// InitBonds is a free data retrieval call binding the contract method 0x6593dc6e.
+//
+// Solidity: function initBonds(uint32 ) view returns(uint256)
+func (_DisputeGameFactory *DisputeGameFactorySession) InitBonds(arg0 uint32) (*big.Int, error) {
+	return _DisputeGameFactory.Contract.InitBonds(&_DisputeGameFactory.CallOpts, arg0)
+}
+
+// InitBonds is a free data retrieval call binding the contract method 0x6593dc6e.
+//
+// Solidity: function initBonds(uint32 ) view returns(uint256)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) InitBonds(arg0 uint32) (*big.Int, error) {
+	return _DisputeGameFactory.Contract.InitBonds(&_DisputeGameFactory.CallOpts, arg0)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "owner")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_DisputeGameFactory *DisputeGameFactorySession) Owner() (common.Address, error) {
+	return _DisputeGameFactory.Contract.Owner(&_DisputeGameFactory.CallOpts)
+}
+
+// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
+//
+// Solidity: function owner() view returns(address)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) Owner() (common.Address, error) {
+	return _DisputeGameFactory.Contract.Owner(&_DisputeGameFactory.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DisputeGameFactory *DisputeGameFactoryCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _DisputeGameFactory.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DisputeGameFactory *DisputeGameFactorySession) Version() (string, error) {
+	return _DisputeGameFactory.Contract.Version(&_DisputeGameFactory.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_DisputeGameFactory *DisputeGameFactoryCallerSession) Version() (string, error) {
+	return _DisputeGameFactory.Contract.Version(&_DisputeGameFactory.CallOpts)
+}
+
+// Create is a paid mutator transaction binding the contract method 0x82ecf2f6.
+//
+// Solidity: function create(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) payable returns(address proxy_)
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) Create(opts *bind.TransactOpts, _gameType uint32, _rootClaim [32]byte, _extraData []byte) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "create", _gameType, _rootClaim, _extraData)
+}
+
+// Create is a paid mutator transaction binding the contract method 0x82ecf2f6.
+//
+// Solidity: function create(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) payable returns(address proxy_)
+func (_DisputeGameFactory *DisputeGameFactorySession) Create(_gameType uint32, _rootClaim [32]byte, _extraData []byte) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.Create(&_DisputeGameFactory.TransactOpts, _gameType, _rootClaim, _extraData)
+}
+
+// Create is a paid mutator transaction binding the contract method 0x82ecf2f6.
+//
+// Solidity: function create(uint32 _gameType, bytes32 _rootClaim, bytes _extraData) payable returns(address proxy_)
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) Create(_gameType uint32, _rootClaim [32]byte, _extraData []byte) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.Create(&_DisputeGameFactory.TransactOpts, _gameType, _rootClaim, _extraData)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _owner) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "initialize", _owner)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _owner) returns()
+func (_DisputeGameFactory *DisputeGameFactorySession) Initialize(_owner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.Initialize(&_DisputeGameFactory.TransactOpts, _owner)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
+//
+// Solidity: function initialize(address _owner) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) Initialize(_owner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.Initialize(&_DisputeGameFactory.TransactOpts, _owner)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "renounceOwnership")
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_DisputeGameFactory *DisputeGameFactorySession) RenounceOwnership() (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.RenounceOwnership(&_DisputeGameFactory.TransactOpts)
+}
+
+// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
+//
+// Solidity: function renounceOwnership() returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) RenounceOwnership() (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.RenounceOwnership(&_DisputeGameFactory.TransactOpts)
+}
+
+// SetImplementation is a paid mutator transaction binding the contract method 0x14f6b1a3.
+//
+// Solidity: function setImplementation(uint32 _gameType, address _impl) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) SetImplementation(opts *bind.TransactOpts, _gameType uint32, _impl common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "setImplementation", _gameType, _impl)
+}
+
+// SetImplementation is a paid mutator transaction binding the contract method 0x14f6b1a3.
+//
+// Solidity: function setImplementation(uint32 _gameType, address _impl) returns()
+func (_DisputeGameFactory *DisputeGameFactorySession) SetImplementation(_gameType uint32, _impl common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.SetImplementation(&_DisputeGameFactory.TransactOpts, _gameType, _impl)
+}
+
+// SetImplementation is a paid mutator transaction binding the contract method 0x14f6b1a3.
+//
+// Solidity: function setImplementation(uint32 _gameType, address _impl) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) SetImplementation(_gameType uint32, _impl common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.SetImplementation(&_DisputeGameFactory.TransactOpts, _gameType, _impl)
+}
+
+// SetInitBond is a paid mutator transaction binding the contract method 0x1e334240.
+//
+// Solidity: function setInitBond(uint32 _gameType, uint256 _initBond) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) SetInitBond(opts *bind.TransactOpts, _gameType uint32, _initBond *big.Int) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "setInitBond", _gameType, _initBond)
+}
+
+// SetInitBond is a paid mutator transaction binding the contract method 0x1e334240.
+//
+// Solidity: function setInitBond(uint32 _gameType, uint256 _initBond) returns()
+func (_DisputeGameFactory *DisputeGameFactorySession) SetInitBond(_gameType uint32, _initBond *big.Int) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.SetInitBond(&_DisputeGameFactory.TransactOpts, _gameType, _initBond)
+}
+
+// SetInitBond is a paid mutator transaction binding the contract method 0x1e334240.
+//
+// Solidity: function setInitBond(uint32 _gameType, uint256 _initBond) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) SetInitBond(_gameType uint32, _initBond *big.Int) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.SetInitBond(&_DisputeGameFactory.TransactOpts, _gameType, _initBond)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.contract.Transact(opts, "transferOwnership", newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_DisputeGameFactory *DisputeGameFactorySession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.TransferOwnership(&_DisputeGameFactory.TransactOpts, newOwner)
+}
+
+// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
+//
+// Solidity: function transferOwnership(address newOwner) returns()
+func (_DisputeGameFactory *DisputeGameFactoryTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+	return _DisputeGameFactory.Contract.TransferOwnership(&_DisputeGameFactory.TransactOpts, newOwner)
+}
+
+// DisputeGameFactoryDisputeGameCreatedIterator is returned from FilterDisputeGameCreated and is used to iterate over the raw logs and unpacked data for DisputeGameCreated events raised by the DisputeGameFactory contract.
+type DisputeGameFactoryDisputeGameCreatedIterator struct {
+	Event *DisputeGameFactoryDisputeGameCreated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DisputeGameFactoryDisputeGameCreatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(DisputeGameFactoryDisputeGameCreated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(DisputeGameFactoryDisputeGameCreated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DisputeGameFactoryDisputeGameCreatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DisputeGameFactoryDisputeGameCreatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// DisputeGameFactoryDisputeGameCreated represents a DisputeGameCreated event raised by the DisputeGameFactory contract.
+type DisputeGameFactoryDisputeGameCreated struct {
+	DisputeProxy common.Address
+	GameType     uint32
+	RootClaim    [32]byte
+	Raw          types.Log // Blockchain specific contextual infos
+}
+
+// FilterDisputeGameCreated is a free log retrieval operation binding the contract event 0x5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e35.
+//
+// Solidity: event DisputeGameCreated(address indexed disputeProxy, uint32 indexed gameType, bytes32 indexed rootClaim)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) FilterDisputeGameCreated(opts *bind.FilterOpts, disputeProxy []common.Address, gameType []uint32, rootClaim [][32]byte) (*DisputeGameFactoryDisputeGameCreatedIterator, error) {
+
+	var disputeProxyRule []interface{}
+	for _, disputeProxyItem := range disputeProxy {
+		disputeProxyRule = append(disputeProxyRule, disputeProxyItem)
+	}
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+	var rootClaimRule []interface{}
+	for _, rootClaimItem := range rootClaim {
+		rootClaimRule = append(rootClaimRule, rootClaimItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.FilterLogs(opts, "DisputeGameCreated", disputeProxyRule, gameTypeRule, rootClaimRule)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryDisputeGameCreatedIterator{contract: _DisputeGameFactory.contract, event: "DisputeGameCreated", logs: logs, sub: sub}, nil
+}
+
+// WatchDisputeGameCreated is a free log subscription operation binding the contract event 0x5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e35.
+//
+// Solidity: event DisputeGameCreated(address indexed disputeProxy, uint32 indexed gameType, bytes32 indexed rootClaim)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) WatchDisputeGameCreated(opts *bind.WatchOpts, sink chan<- *DisputeGameFactoryDisputeGameCreated, disputeProxy []common.Address, gameType []uint32, rootClaim [][32]byte) (event.Subscription, error) {
+
+	var disputeProxyRule []interface{}
+	for _, disputeProxyItem := range disputeProxy {
+		disputeProxyRule = append(disputeProxyRule, disputeProxyItem)
+	}
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+	var rootClaimRule []interface{}
+	for _, rootClaimItem := range rootClaim {
+		rootClaimRule = append(rootClaimRule, rootClaimItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.WatchLogs(opts, "DisputeGameCreated", disputeProxyRule, gameTypeRule, rootClaimRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(DisputeGameFactoryDisputeGameCreated)
+				if err := _DisputeGameFactory.contract.UnpackLog(event, "DisputeGameCreated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseDisputeGameCreated is a log parse operation binding the contract event 0x5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e35.
+//
+// Solidity: event DisputeGameCreated(address indexed disputeProxy, uint32 indexed gameType, bytes32 indexed rootClaim)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) ParseDisputeGameCreated(log types.Log) (*DisputeGameFactoryDisputeGameCreated, error) {
+	event := new(DisputeGameFactoryDisputeGameCreated)
+	if err := _DisputeGameFactory.contract.UnpackLog(event, "DisputeGameCreated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// DisputeGameFactoryImplementationSetIterator is returned from FilterImplementationSet and is used to iterate over the raw logs and unpacked data for ImplementationSet events raised by the DisputeGameFactory contract.
+type DisputeGameFactoryImplementationSetIterator struct {
+	Event *DisputeGameFactoryImplementationSet // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DisputeGameFactoryImplementationSetIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(DisputeGameFactoryImplementationSet)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(DisputeGameFactoryImplementationSet)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DisputeGameFactoryImplementationSetIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DisputeGameFactoryImplementationSetIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// DisputeGameFactoryImplementationSet represents a ImplementationSet event raised by the DisputeGameFactory contract.
+type DisputeGameFactoryImplementationSet struct {
+	Impl     common.Address
+	GameType uint32
+	Raw      types.Log // Blockchain specific contextual infos
+}
+
+// FilterImplementationSet is a free log retrieval operation binding the contract event 0xff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de.
+//
+// Solidity: event ImplementationSet(address indexed impl, uint32 indexed gameType)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) FilterImplementationSet(opts *bind.FilterOpts, impl []common.Address, gameType []uint32) (*DisputeGameFactoryImplementationSetIterator, error) {
+
+	var implRule []interface{}
+	for _, implItem := range impl {
+		implRule = append(implRule, implItem)
+	}
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.FilterLogs(opts, "ImplementationSet", implRule, gameTypeRule)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryImplementationSetIterator{contract: _DisputeGameFactory.contract, event: "ImplementationSet", logs: logs, sub: sub}, nil
+}
+
+// WatchImplementationSet is a free log subscription operation binding the contract event 0xff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de.
+//
+// Solidity: event ImplementationSet(address indexed impl, uint32 indexed gameType)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) WatchImplementationSet(opts *bind.WatchOpts, sink chan<- *DisputeGameFactoryImplementationSet, impl []common.Address, gameType []uint32) (event.Subscription, error) {
+
+	var implRule []interface{}
+	for _, implItem := range impl {
+		implRule = append(implRule, implItem)
+	}
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.WatchLogs(opts, "ImplementationSet", implRule, gameTypeRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(DisputeGameFactoryImplementationSet)
+				if err := _DisputeGameFactory.contract.UnpackLog(event, "ImplementationSet", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseImplementationSet is a log parse operation binding the contract event 0xff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de.
+//
+// Solidity: event ImplementationSet(address indexed impl, uint32 indexed gameType)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) ParseImplementationSet(log types.Log) (*DisputeGameFactoryImplementationSet, error) {
+	event := new(DisputeGameFactoryImplementationSet)
+	if err := _DisputeGameFactory.contract.UnpackLog(event, "ImplementationSet", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// DisputeGameFactoryInitBondUpdatedIterator is returned from FilterInitBondUpdated and is used to iterate over the raw logs and unpacked data for InitBondUpdated events raised by the DisputeGameFactory contract.
+type DisputeGameFactoryInitBondUpdatedIterator struct {
+	Event *DisputeGameFactoryInitBondUpdated // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DisputeGameFactoryInitBondUpdatedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(DisputeGameFactoryInitBondUpdated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(DisputeGameFactoryInitBondUpdated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DisputeGameFactoryInitBondUpdatedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DisputeGameFactoryInitBondUpdatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// DisputeGameFactoryInitBondUpdated represents a InitBondUpdated event raised by the DisputeGameFactory contract.
+type DisputeGameFactoryInitBondUpdated struct {
+	GameType uint32
+	NewBond  *big.Int
+	Raw      types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitBondUpdated is a free log retrieval operation binding the contract event 0x74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca.
+//
+// Solidity: event InitBondUpdated(uint32 indexed gameType, uint256 indexed newBond)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) FilterInitBondUpdated(opts *bind.FilterOpts, gameType []uint32, newBond []*big.Int) (*DisputeGameFactoryInitBondUpdatedIterator, error) {
+
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+	var newBondRule []interface{}
+	for _, newBondItem := range newBond {
+		newBondRule = append(newBondRule, newBondItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.FilterLogs(opts, "InitBondUpdated", gameTypeRule, newBondRule)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryInitBondUpdatedIterator{contract: _DisputeGameFactory.contract, event: "InitBondUpdated", logs: logs, sub: sub}, nil
+}
+
+// WatchInitBondUpdated is a free log subscription operation binding the contract event 0x74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca.
+//
+// Solidity: event InitBondUpdated(uint32 indexed gameType, uint256 indexed newBond)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) WatchInitBondUpdated(opts *bind.WatchOpts, sink chan<- *DisputeGameFactoryInitBondUpdated, gameType []uint32, newBond []*big.Int) (event.Subscription, error) {
+
+	var gameTypeRule []interface{}
+	for _, gameTypeItem := range gameType {
+		gameTypeRule = append(gameTypeRule, gameTypeItem)
+	}
+	var newBondRule []interface{}
+	for _, newBondItem := range newBond {
+		newBondRule = append(newBondRule, newBondItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.WatchLogs(opts, "InitBondUpdated", gameTypeRule, newBondRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(DisputeGameFactoryInitBondUpdated)
+				if err := _DisputeGameFactory.contract.UnpackLog(event, "InitBondUpdated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitBondUpdated is a log parse operation binding the contract event 0x74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca.
+//
+// Solidity: event InitBondUpdated(uint32 indexed gameType, uint256 indexed newBond)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) ParseInitBondUpdated(log types.Log) (*DisputeGameFactoryInitBondUpdated, error) {
+	event := new(DisputeGameFactoryInitBondUpdated)
+	if err := _DisputeGameFactory.contract.UnpackLog(event, "InitBondUpdated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// DisputeGameFactoryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the DisputeGameFactory contract.
+type DisputeGameFactoryInitializedIterator struct {
+	Event *DisputeGameFactoryInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DisputeGameFactoryInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(DisputeGameFactoryInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(DisputeGameFactoryInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DisputeGameFactoryInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DisputeGameFactoryInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// DisputeGameFactoryInitialized represents a Initialized event raised by the DisputeGameFactory contract.
+type DisputeGameFactoryInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) FilterInitialized(opts *bind.FilterOpts) (*DisputeGameFactoryInitializedIterator, error) {
+
+	logs, sub, err := _DisputeGameFactory.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryInitializedIterator{contract: _DisputeGameFactory.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *DisputeGameFactoryInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _DisputeGameFactory.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(DisputeGameFactoryInitialized)
+				if err := _DisputeGameFactory.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) ParseInitialized(log types.Log) (*DisputeGameFactoryInitialized, error) {
+	event := new(DisputeGameFactoryInitialized)
+	if err := _DisputeGameFactory.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// DisputeGameFactoryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the DisputeGameFactory contract.
+type DisputeGameFactoryOwnershipTransferredIterator struct {
+	Event *DisputeGameFactoryOwnershipTransferred // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *DisputeGameFactoryOwnershipTransferredIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(DisputeGameFactoryOwnershipTransferred)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(DisputeGameFactoryOwnershipTransferred)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *DisputeGameFactoryOwnershipTransferredIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *DisputeGameFactoryOwnershipTransferredIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// DisputeGameFactoryOwnershipTransferred represents a OwnershipTransferred event raised by the DisputeGameFactory contract.
+type DisputeGameFactoryOwnershipTransferred struct {
+	PreviousOwner common.Address
+	NewOwner      common.Address
+	Raw           types.Log // Blockchain specific contextual infos
+}
+
+// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*DisputeGameFactoryOwnershipTransferredIterator, error) {
+
+	var previousOwnerRule []interface{}
+	for _, previousOwnerItem := range previousOwner {
+		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+	}
+	var newOwnerRule []interface{}
+	for _, newOwnerItem := range newOwner {
+		newOwnerRule = append(newOwnerRule, newOwnerItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+	if err != nil {
+		return nil, err
+	}
+	return &DisputeGameFactoryOwnershipTransferredIterator{contract: _DisputeGameFactory.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *DisputeGameFactoryOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) {
+
+	var previousOwnerRule []interface{}
+	for _, previousOwnerItem := range previousOwner {
+		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+	}
+	var newOwnerRule []interface{}
+	for _, newOwnerItem := range newOwner {
+		newOwnerRule = append(newOwnerRule, newOwnerItem)
+	}
+
+	logs, sub, err := _DisputeGameFactory.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(DisputeGameFactoryOwnershipTransferred)
+				if err := _DisputeGameFactory.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
+//
+// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
+func (_DisputeGameFactory *DisputeGameFactoryFilterer) ParseOwnershipTransferred(log types.Log) (*DisputeGameFactoryOwnershipTransferred, error) {
+	event := new(DisputeGameFactoryOwnershipTransferred)
+	if err := _DisputeGameFactory.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-proposer/bindings/l2outputoracle.go b/op-proposer/bindings/l2outputoracle.go
new file mode 100644
index 000000000000..1d8934c7c838
--- /dev/null
+++ b/op-proposer/bindings/l2outputoracle.go
@@ -0,0 +1,1373 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package bindings
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// TypesOutputProposal is an auto generated low-level Go binding around an user-defined struct.
+type TypesOutputProposal struct {
+	OutputRoot    [32]byte
+	Timestamp     *big.Int
+	L2BlockNumber *big.Int
+}
+
+// L2OutputOracleMetaData contains all meta data concerning the L2OutputOracle contract.
+var L2OutputOracleMetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CHALLENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_BLOCK_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PROPOSER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SUBMISSION_INTERVAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"challenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"computeL2Timestamp\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteL2Outputs\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"finalizationPeriodSeconds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2Output\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputProposal\",\"components\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2OutputAfter\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputProposal\",\"components\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2OutputIndexAfter\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_submissionInterval\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l2BlockTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingBlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l2BlockTime\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestOutputIndex\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextOutputIndex\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeL2Output\",\"inputs\":[{\"name\":\"_outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proposer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"startingBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"startingTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionInterval\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputProposed\",\"inputs\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"l2OutputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"l1Timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputsDeleted\",\"inputs\":[{\"name\":\"prevNextOutputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"newNextOutputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+	Bin: "0x60806040523480156200001157600080fd5b50620000256001806000808080806200002b565b62000328565b600054610100900460ff16158080156200004c5750600054600160ff909116105b806200007c575062000069306200031960201b6200135d1760201c565b1580156200007c575060005460ff166001145b620000e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000109576000805461ff0019166101001790555b60008811620001815760405162461bcd60e51b815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e20300000000000006064820152608401620000dc565b60008711620001f95760405162461bcd60e51b815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e20300000000000000000000000006064820152608401620000dc565b428511156200027f5760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201526374696d6560e01b608482015260a401620000dc565b6004889055600587905560018690556002859055600780546001600160a01b038087166001600160a01b0319928316179092556006805492861692909116919091179055600882905580156200030f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6001600160a01b03163b151590565b6115d580620003386000396000f3fe60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a",
+}
+
+// L2OutputOracleABI is the input ABI used to generate the binding from.
+// Deprecated: Use L2OutputOracleMetaData.ABI instead.
+var L2OutputOracleABI = L2OutputOracleMetaData.ABI
+
+// L2OutputOracleBin is the compiled bytecode used for deploying new contracts.
+// Deprecated: Use L2OutputOracleMetaData.Bin instead.
+var L2OutputOracleBin = L2OutputOracleMetaData.Bin
+
+// DeployL2OutputOracle deploys a new Ethereum contract, binding an instance of L2OutputOracle to it.
+func DeployL2OutputOracle(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L2OutputOracle, error) {
+	parsed, err := L2OutputOracleMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2OutputOracleBin), backend)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &L2OutputOracle{L2OutputOracleCaller: L2OutputOracleCaller{contract: contract}, L2OutputOracleTransactor: L2OutputOracleTransactor{contract: contract}, L2OutputOracleFilterer: L2OutputOracleFilterer{contract: contract}}, nil
+}
+
+// L2OutputOracle is an auto generated Go binding around an Ethereum contract.
+type L2OutputOracle struct {
+	L2OutputOracleCaller     // Read-only binding to the contract
+	L2OutputOracleTransactor // Write-only binding to the contract
+	L2OutputOracleFilterer   // Log filterer for contract events
+}
+
+// L2OutputOracleCaller is an auto generated read-only Go binding around an Ethereum contract.
+type L2OutputOracleCaller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type L2OutputOracleTransactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type L2OutputOracleFilterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// L2OutputOracleSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type L2OutputOracleSession struct {
+	Contract     *L2OutputOracle   // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// L2OutputOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type L2OutputOracleCallerSession struct {
+	Contract *L2OutputOracleCaller // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts         // Call options to use throughout this session
+}
+
+// L2OutputOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type L2OutputOracleTransactorSession struct {
+	Contract     *L2OutputOracleTransactor // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
+}
+
+// L2OutputOracleRaw is an auto generated low-level Go binding around an Ethereum contract.
+type L2OutputOracleRaw struct {
+	Contract *L2OutputOracle // Generic contract binding to access the raw methods on
+}
+
+// L2OutputOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type L2OutputOracleCallerRaw struct {
+	Contract *L2OutputOracleCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// L2OutputOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type L2OutputOracleTransactorRaw struct {
+	Contract *L2OutputOracleTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewL2OutputOracle creates a new instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracle(address common.Address, backend bind.ContractBackend) (*L2OutputOracle, error) {
+	contract, err := bindL2OutputOracle(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracle{L2OutputOracleCaller: L2OutputOracleCaller{contract: contract}, L2OutputOracleTransactor: L2OutputOracleTransactor{contract: contract}, L2OutputOracleFilterer: L2OutputOracleFilterer{contract: contract}}, nil
+}
+
+// NewL2OutputOracleCaller creates a new read-only instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleCaller(address common.Address, caller bind.ContractCaller) (*L2OutputOracleCaller, error) {
+	contract, err := bindL2OutputOracle(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleCaller{contract: contract}, nil
+}
+
+// NewL2OutputOracleTransactor creates a new write-only instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*L2OutputOracleTransactor, error) {
+	contract, err := bindL2OutputOracle(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleTransactor{contract: contract}, nil
+}
+
+// NewL2OutputOracleFilterer creates a new log filterer instance of L2OutputOracle, bound to a specific deployed contract.
+func NewL2OutputOracleFilterer(address common.Address, filterer bind.ContractFilterer) (*L2OutputOracleFilterer, error) {
+	contract, err := bindL2OutputOracle(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleFilterer{contract: contract}, nil
+}
+
+// bindL2OutputOracle binds a generic wrapper to an already deployed contract.
+func bindL2OutputOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(L2OutputOracleABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2OutputOracle *L2OutputOracleRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2OutputOracle.Contract.L2OutputOracleCaller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2OutputOracle *L2OutputOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.L2OutputOracleTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2OutputOracle *L2OutputOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.L2OutputOracleTransactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_L2OutputOracle *L2OutputOracleCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _L2OutputOracle.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_L2OutputOracle *L2OutputOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_L2OutputOracle *L2OutputOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.contract.Transact(opts, method, params...)
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) CHALLENGER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "CHALLENGER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) CHALLENGER() (common.Address, error) {
+	return _L2OutputOracle.Contract.CHALLENGER(&_L2OutputOracle.CallOpts)
+}
+
+// CHALLENGER is a free data retrieval call binding the contract method 0x6b4d98dd.
+//
+// Solidity: function CHALLENGER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) CHALLENGER() (common.Address, error) {
+	return _L2OutputOracle.Contract.CHALLENGER(&_L2OutputOracle.CallOpts)
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) FINALIZATIONPERIODSECONDS(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "FINALIZATION_PERIOD_SECONDS")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) FINALIZATIONPERIODSECONDS() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FINALIZATIONPERIODSECONDS(&_L2OutputOracle.CallOpts)
+}
+
+// FINALIZATIONPERIODSECONDS is a free data retrieval call binding the contract method 0xf4daa291.
+//
+// Solidity: function FINALIZATION_PERIOD_SECONDS() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) FINALIZATIONPERIODSECONDS() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FINALIZATIONPERIODSECONDS(&_L2OutputOracle.CallOpts)
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) L2BLOCKTIME(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "L2_BLOCK_TIME")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) L2BLOCKTIME() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BLOCKTIME(&_L2OutputOracle.CallOpts)
+}
+
+// L2BLOCKTIME is a free data retrieval call binding the contract method 0x002134cc.
+//
+// Solidity: function L2_BLOCK_TIME() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) L2BLOCKTIME() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BLOCKTIME(&_L2OutputOracle.CallOpts)
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) PROPOSER(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "PROPOSER")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) PROPOSER() (common.Address, error) {
+	return _L2OutputOracle.Contract.PROPOSER(&_L2OutputOracle.CallOpts)
+}
+
+// PROPOSER is a free data retrieval call binding the contract method 0xbffa7f0f.
+//
+// Solidity: function PROPOSER() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) PROPOSER() (common.Address, error) {
+	return _L2OutputOracle.Contract.PROPOSER(&_L2OutputOracle.CallOpts)
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) SUBMISSIONINTERVAL(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "SUBMISSION_INTERVAL")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) SUBMISSIONINTERVAL() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SUBMISSIONINTERVAL(&_L2OutputOracle.CallOpts)
+}
+
+// SUBMISSIONINTERVAL is a free data retrieval call binding the contract method 0x529933df.
+//
+// Solidity: function SUBMISSION_INTERVAL() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) SUBMISSIONINTERVAL() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SUBMISSIONINTERVAL(&_L2OutputOracle.CallOpts)
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) Challenger(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "challenger")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) Challenger() (common.Address, error) {
+	return _L2OutputOracle.Contract.Challenger(&_L2OutputOracle.CallOpts)
+}
+
+// Challenger is a free data retrieval call binding the contract method 0x534db0e2.
+//
+// Solidity: function challenger() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Challenger() (common.Address, error) {
+	return _L2OutputOracle.Contract.Challenger(&_L2OutputOracle.CallOpts)
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) ComputeL2Timestamp(opts *bind.CallOpts, _l2BlockNumber *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "computeL2Timestamp", _l2BlockNumber)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) ComputeL2Timestamp(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.ComputeL2Timestamp(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// ComputeL2Timestamp is a free data retrieval call binding the contract method 0xd1de856c.
+//
+// Solidity: function computeL2Timestamp(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) ComputeL2Timestamp(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.ComputeL2Timestamp(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) FinalizationPeriodSeconds(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "finalizationPeriodSeconds")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) FinalizationPeriodSeconds() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FinalizationPeriodSeconds(&_L2OutputOracle.CallOpts)
+}
+
+// FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6.
+//
+// Solidity: function finalizationPeriodSeconds() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) FinalizationPeriodSeconds() (*big.Int, error) {
+	return _L2OutputOracle.Contract.FinalizationPeriodSeconds(&_L2OutputOracle.CallOpts)
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2Output(opts *bind.CallOpts, _l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2Output", _l2OutputIndex)
+
+	if err != nil {
+		return *new(TypesOutputProposal), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(TypesOutputProposal)).(*TypesOutputProposal)
+
+	return out0, err
+
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleSession) GetL2Output(_l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2Output(&_L2OutputOracle.CallOpts, _l2OutputIndex)
+}
+
+// GetL2Output is a free data retrieval call binding the contract method 0xa25ae557.
+//
+// Solidity: function getL2Output(uint256 _l2OutputIndex) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2Output(_l2OutputIndex *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2Output(&_L2OutputOracle.CallOpts, _l2OutputIndex)
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2OutputAfter(opts *bind.CallOpts, _l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2OutputAfter", _l2BlockNumber)
+
+	if err != nil {
+		return *new(TypesOutputProposal), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(TypesOutputProposal)).(*TypesOutputProposal)
+
+	return out0, err
+
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleSession) GetL2OutputAfter(_l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2OutputAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputAfter is a free data retrieval call binding the contract method 0xcf8e5cf0.
+//
+// Solidity: function getL2OutputAfter(uint256 _l2BlockNumber) view returns((bytes32,uint128,uint128))
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2OutputAfter(_l2BlockNumber *big.Int) (TypesOutputProposal, error) {
+	return _L2OutputOracle.Contract.GetL2OutputAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) GetL2OutputIndexAfter(opts *bind.CallOpts, _l2BlockNumber *big.Int) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "getL2OutputIndexAfter", _l2BlockNumber)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) GetL2OutputIndexAfter(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.GetL2OutputIndexAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// GetL2OutputIndexAfter is a free data retrieval call binding the contract method 0x7f006420.
+//
+// Solidity: function getL2OutputIndexAfter(uint256 _l2BlockNumber) view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) GetL2OutputIndexAfter(_l2BlockNumber *big.Int) (*big.Int, error) {
+	return _L2OutputOracle.Contract.GetL2OutputIndexAfter(&_L2OutputOracle.CallOpts, _l2BlockNumber)
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) L2BlockTime(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "l2BlockTime")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) L2BlockTime() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BlockTime(&_L2OutputOracle.CallOpts)
+}
+
+// L2BlockTime is a free data retrieval call binding the contract method 0x93991af3.
+//
+// Solidity: function l2BlockTime() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) L2BlockTime() (*big.Int, error) {
+	return _L2OutputOracle.Contract.L2BlockTime(&_L2OutputOracle.CallOpts)
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) LatestBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "latestBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) LatestBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// LatestBlockNumber is a free data retrieval call binding the contract method 0x4599c788.
+//
+// Solidity: function latestBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) LatestBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) LatestOutputIndex(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "latestOutputIndex")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) LatestOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// LatestOutputIndex is a free data retrieval call binding the contract method 0x69f16eec.
+//
+// Solidity: function latestOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) LatestOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.LatestOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) NextBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "nextBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) NextBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// NextBlockNumber is a free data retrieval call binding the contract method 0xdcec3348.
+//
+// Solidity: function nextBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) NextBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) NextOutputIndex(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "nextOutputIndex")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) NextOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563.
+//
+// Solidity: function nextOutputIndex() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) NextOutputIndex() (*big.Int, error) {
+	return _L2OutputOracle.Contract.NextOutputIndex(&_L2OutputOracle.CallOpts)
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCaller) Proposer(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "proposer")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleSession) Proposer() (common.Address, error) {
+	return _L2OutputOracle.Contract.Proposer(&_L2OutputOracle.CallOpts)
+}
+
+// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
+//
+// Solidity: function proposer() view returns(address)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Proposer() (common.Address, error) {
+	return _L2OutputOracle.Contract.Proposer(&_L2OutputOracle.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) StartingBlockNumber(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "startingBlockNumber")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) StartingBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5.
+//
+// Solidity: function startingBlockNumber() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) StartingBlockNumber() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingBlockNumber(&_L2OutputOracle.CallOpts)
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) StartingTimestamp(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "startingTimestamp")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) StartingTimestamp() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingTimestamp(&_L2OutputOracle.CallOpts)
+}
+
+// StartingTimestamp is a free data retrieval call binding the contract method 0x88786272.
+//
+// Solidity: function startingTimestamp() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) StartingTimestamp() (*big.Int, error) {
+	return _L2OutputOracle.Contract.StartingTimestamp(&_L2OutputOracle.CallOpts)
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCaller) SubmissionInterval(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "submissionInterval")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleSession) SubmissionInterval() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SubmissionInterval(&_L2OutputOracle.CallOpts)
+}
+
+// SubmissionInterval is a free data retrieval call binding the contract method 0xe1a41bcf.
+//
+// Solidity: function submissionInterval() view returns(uint256)
+func (_L2OutputOracle *L2OutputOracleCallerSession) SubmissionInterval() (*big.Int, error) {
+	return _L2OutputOracle.Contract.SubmissionInterval(&_L2OutputOracle.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleCaller) Version(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _L2OutputOracle.contract.Call(opts, &out, "version")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleSession) Version() (string, error) {
+	return _L2OutputOracle.Contract.Version(&_L2OutputOracle.CallOpts)
+}
+
+// Version is a free data retrieval call binding the contract method 0x54fd4d50.
+//
+// Solidity: function version() view returns(string)
+func (_L2OutputOracle *L2OutputOracleCallerSession) Version() (string, error) {
+	return _L2OutputOracle.Contract.Version(&_L2OutputOracle.CallOpts)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) DeleteL2Outputs(opts *bind.TransactOpts, _l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "deleteL2Outputs", _l2OutputIndex)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleSession) DeleteL2Outputs(_l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.DeleteL2Outputs(&_L2OutputOracle.TransactOpts, _l2OutputIndex)
+}
+
+// DeleteL2Outputs is a paid mutator transaction binding the contract method 0x89c44cbb.
+//
+// Solidity: function deleteL2Outputs(uint256 _l2OutputIndex) returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) DeleteL2Outputs(_l2OutputIndex *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.DeleteL2Outputs(&_L2OutputOracle.TransactOpts, _l2OutputIndex)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) Initialize(opts *bind.TransactOpts, _submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "initialize", _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleSession) Initialize(_submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// Initialize is a paid mutator transaction binding the contract method 0x1c89c97d.
+//
+// Solidity: function initialize(uint256 _submissionInterval, uint256 _l2BlockTime, uint256 _startingBlockNumber, uint256 _startingTimestamp, address _proposer, address _challenger, uint256 _finalizationPeriodSeconds) returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) Initialize(_submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _proposer common.Address, _challenger common.Address, _finalizationPeriodSeconds *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _proposer, _challenger, _finalizationPeriodSeconds)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleTransactor) ProposeL2Output(opts *bind.TransactOpts, _outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.contract.Transact(opts, "proposeL2Output", _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleSession) ProposeL2Output(_outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.ProposeL2Output(&_L2OutputOracle.TransactOpts, _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
+//
+// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns()
+func (_L2OutputOracle *L2OutputOracleTransactorSession) ProposeL2Output(_outputRoot [32]byte, _l2BlockNumber *big.Int, _l1BlockHash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
+	return _L2OutputOracle.Contract.ProposeL2Output(&_L2OutputOracle.TransactOpts, _outputRoot, _l2BlockNumber, _l1BlockHash, _l1BlockNumber)
+}
+
+// L2OutputOracleInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L2OutputOracle contract.
+type L2OutputOracleInitializedIterator struct {
+	Event *L2OutputOracleInitialized // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleInitializedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleInitialized)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleInitialized)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleInitializedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleInitializedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleInitialized represents a Initialized event raised by the L2OutputOracle contract.
+type L2OutputOracleInitialized struct {
+	Version uint8
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterInitialized(opts *bind.FilterOpts) (*L2OutputOracleInitializedIterator, error) {
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleInitializedIterator{contract: _L2OutputOracle.contract, event: "Initialized", logs: logs, sub: sub}, nil
+}
+
+// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L2OutputOracleInitialized) (event.Subscription, error) {
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "Initialized")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleInitialized)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "Initialized", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
+//
+// Solidity: event Initialized(uint8 version)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseInitialized(log types.Log) (*L2OutputOracleInitialized, error) {
+	event := new(L2OutputOracleInitialized)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "Initialized", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2OutputOracleOutputProposedIterator is returned from FilterOutputProposed and is used to iterate over the raw logs and unpacked data for OutputProposed events raised by the L2OutputOracle contract.
+type L2OutputOracleOutputProposedIterator struct {
+	Event *L2OutputOracleOutputProposed // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleOutputProposedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleOutputProposed)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleOutputProposed)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleOutputProposedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleOutputProposedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleOutputProposed represents a OutputProposed event raised by the L2OutputOracle contract.
+type L2OutputOracleOutputProposed struct {
+	OutputRoot    [32]byte
+	L2OutputIndex *big.Int
+	L2BlockNumber *big.Int
+	L1Timestamp   *big.Int
+	Raw           types.Log // Blockchain specific contextual infos
+}
+
+// FilterOutputProposed is a free log retrieval operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputProposed(opts *bind.FilterOpts, outputRoot [][32]byte, l2OutputIndex []*big.Int, l2BlockNumber []*big.Int) (*L2OutputOracleOutputProposedIterator, error) {
+
+	var outputRootRule []interface{}
+	for _, outputRootItem := range outputRoot {
+		outputRootRule = append(outputRootRule, outputRootItem)
+	}
+	var l2OutputIndexRule []interface{}
+	for _, l2OutputIndexItem := range l2OutputIndex {
+		l2OutputIndexRule = append(l2OutputIndexRule, l2OutputIndexItem)
+	}
+	var l2BlockNumberRule []interface{}
+	for _, l2BlockNumberItem := range l2BlockNumber {
+		l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputProposed", outputRootRule, l2OutputIndexRule, l2BlockNumberRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleOutputProposedIterator{contract: _L2OutputOracle.contract, event: "OutputProposed", logs: logs, sub: sub}, nil
+}
+
+// WatchOutputProposed is a free log subscription operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputProposed(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputProposed, outputRoot [][32]byte, l2OutputIndex []*big.Int, l2BlockNumber []*big.Int) (event.Subscription, error) {
+
+	var outputRootRule []interface{}
+	for _, outputRootItem := range outputRoot {
+		outputRootRule = append(outputRootRule, outputRootItem)
+	}
+	var l2OutputIndexRule []interface{}
+	for _, l2OutputIndexItem := range l2OutputIndex {
+		l2OutputIndexRule = append(l2OutputIndexRule, l2OutputIndexItem)
+	}
+	var l2BlockNumberRule []interface{}
+	for _, l2BlockNumberItem := range l2BlockNumber {
+		l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputProposed", outputRootRule, l2OutputIndexRule, l2BlockNumberRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleOutputProposed)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "OutputProposed", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOutputProposed is a log parse operation binding the contract event 0xa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2.
+//
+// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseOutputProposed(log types.Log) (*L2OutputOracleOutputProposed, error) {
+	event := new(L2OutputOracleOutputProposed)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "OutputProposed", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// L2OutputOracleOutputsDeletedIterator is returned from FilterOutputsDeleted and is used to iterate over the raw logs and unpacked data for OutputsDeleted events raised by the L2OutputOracle contract.
+type L2OutputOracleOutputsDeletedIterator struct {
+	Event *L2OutputOracleOutputsDeleted // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *L2OutputOracleOutputsDeletedIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(L2OutputOracleOutputsDeleted)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(L2OutputOracleOutputsDeleted)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *L2OutputOracleOutputsDeletedIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *L2OutputOracleOutputsDeletedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// L2OutputOracleOutputsDeleted represents a OutputsDeleted event raised by the L2OutputOracle contract.
+type L2OutputOracleOutputsDeleted struct {
+	PrevNextOutputIndex *big.Int
+	NewNextOutputIndex  *big.Int
+	Raw                 types.Log // Blockchain specific contextual infos
+}
+
+// FilterOutputsDeleted is a free log retrieval operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputsDeleted(opts *bind.FilterOpts, prevNextOutputIndex []*big.Int, newNextOutputIndex []*big.Int) (*L2OutputOracleOutputsDeletedIterator, error) {
+
+	var prevNextOutputIndexRule []interface{}
+	for _, prevNextOutputIndexItem := range prevNextOutputIndex {
+		prevNextOutputIndexRule = append(prevNextOutputIndexRule, prevNextOutputIndexItem)
+	}
+	var newNextOutputIndexRule []interface{}
+	for _, newNextOutputIndexItem := range newNextOutputIndex {
+		newNextOutputIndexRule = append(newNextOutputIndexRule, newNextOutputIndexItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputsDeleted", prevNextOutputIndexRule, newNextOutputIndexRule)
+	if err != nil {
+		return nil, err
+	}
+	return &L2OutputOracleOutputsDeletedIterator{contract: _L2OutputOracle.contract, event: "OutputsDeleted", logs: logs, sub: sub}, nil
+}
+
+// WatchOutputsDeleted is a free log subscription operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputsDeleted(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputsDeleted, prevNextOutputIndex []*big.Int, newNextOutputIndex []*big.Int) (event.Subscription, error) {
+
+	var prevNextOutputIndexRule []interface{}
+	for _, prevNextOutputIndexItem := range prevNextOutputIndex {
+		prevNextOutputIndexRule = append(prevNextOutputIndexRule, prevNextOutputIndexItem)
+	}
+	var newNextOutputIndexRule []interface{}
+	for _, newNextOutputIndexItem := range newNextOutputIndex {
+		newNextOutputIndexRule = append(newNextOutputIndexRule, newNextOutputIndexItem)
+	}
+
+	logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputsDeleted", prevNextOutputIndexRule, newNextOutputIndexRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(L2OutputOracleOutputsDeleted)
+				if err := _L2OutputOracle.contract.UnpackLog(event, "OutputsDeleted", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseOutputsDeleted is a log parse operation binding the contract event 0x4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6.
+//
+// Solidity: event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex)
+func (_L2OutputOracle *L2OutputOracleFilterer) ParseOutputsDeleted(log types.Log) (*L2OutputOracleOutputsDeleted, error) {
+	event := new(L2OutputOracleOutputsDeleted)
+	if err := _L2OutputOracle.contract.UnpackLog(event, "OutputsDeleted", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-proposer/cmd/main.go b/op-proposer/cmd/main.go
index 4ef2083597cd..bdfc730b4bf3 100644
--- a/op-proposer/cmd/main.go
+++ b/op-proposer/cmd/main.go
@@ -28,8 +28,8 @@ func main() {
 	app.Flags = cliapp.ProtectFlags(flags.Flags)
 	app.Version = opservice.FormatVersion(Version, GitCommit, GitDate, "")
 	app.Name = "op-proposer"
-	app.Usage = "L2Output Submitter"
-	app.Description = "Service for generating and submitting L2 Output checkpoints to the L2OutputOracle contract"
+	app.Usage = "L2 Output Submitter"
+	app.Description = "Service for generating and proposing L2 Outputs"
 	app.Action = cliapp.LifecycleCmd(proposer.Main(Version))
 	app.Commands = []*cli.Command{
 		{
diff --git a/op-proposer/flags/flags.go b/op-proposer/flags/flags.go
index fa95551236dc..4321e000fe2f 100644
--- a/op-proposer/flags/flags.go
+++ b/op-proposer/flags/flags.go
@@ -72,6 +72,13 @@ var (
 		Value:   2 * time.Minute,
 		EnvVars: prefixEnvVars("ACTIVE_SEQUENCER_CHECK_DURATION"),
 	}
+	WaitNodeSyncFlag = &cli.BoolFlag{
+		Name: "wait-node-sync",
+		Usage: "Indicates if, during startup, the proposer should wait for the rollup node to sync to " +
+			"the current L1 tip before proceeding with its driver loop.",
+		Value:   false,
+		EnvVars: prefixEnvVars("WAIT_NODE_SYNC"),
+	}
 	// Legacy Flags
 	L2OutputHDPathFlag = txmgr.L2OutputHDPathFlag
 )
@@ -90,6 +97,7 @@ var optionalFlags = []cli.Flag{
 	ProposalIntervalFlag,
 	DisputeGameTypeFlag,
 	ActiveSequencerCheckDurationFlag,
+	WaitNodeSyncFlag,
 }
 
 func init() {
diff --git a/op-proposer/proposer/abi_test.go b/op-proposer/proposer/abi_test.go
index 7ff576c365e3..47c2d8c11acc 100644
--- a/op-proposer/proposer/abi_test.go
+++ b/op-proposer/proposer/abi_test.go
@@ -6,13 +6,13 @@ import (
 	"math/rand"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-proposer/bindings"
 	"github.com/ethereum-optimism/optimism/op-service/testutils"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/math"
-	"github.com/ethereum/go-ethereum/core"
+	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/params"
 	"github.com/stretchr/testify/require"
@@ -28,7 +28,7 @@ func simulatedBackend() (privateKey *ecdsa.PrivateKey, address common.Address, o
 	if err != nil {
 		return nil, common.Address{}, nil, nil, err
 	}
-	backend = backends.NewSimulatedBackend(core.GenesisAlloc{from: {Balance: big.NewInt(params.Ether)}}, 50_000_000)
+	backend = backends.NewSimulatedBackend(types.GenesisAlloc{from: {Balance: big.NewInt(params.Ether)}}, 50_000_000) // nolint:staticcheck
 
 	return privateKey, from, opts, backend, nil
 }
@@ -80,7 +80,7 @@ func TestManualABIPacking(t *testing.T) {
 	txData, err := proposeL2OutputTxData(l2ooAbi, output)
 	require.NoError(t, err)
 
-	// set a gas limit to disable gas estimation. The invariantes that the L2OO tries to uphold
+	// set a gas limit to disable gas estimation. The invariants that the L2OO tries to uphold
 	// are not maintained in this test.
 	opts.GasLimit = 100_000
 	tx, err := l2oo.ProposeL2Output(
diff --git a/op-proposer/proposer/config.go b/op-proposer/proposer/config.go
index dcd0693549bb..8786da0c0daa 100644
--- a/op-proposer/proposer/config.go
+++ b/op-proposer/proposer/config.go
@@ -58,6 +58,9 @@ type CLIConfig struct {
 
 	// ActiveSequencerCheckDuration is the duration between checks to determine the active sequencer endpoint.
 	ActiveSequencerCheckDuration time.Duration
+
+	// Whether to wait for the sequencer to sync to a recent block at startup.
+	WaitNodeSync bool
 }
 
 func (c *CLIConfig) Check() error {
@@ -74,6 +77,9 @@ func (c *CLIConfig) Check() error {
 		return err
 	}
 
+	if c.DGFAddress == "" && c.L2OOAddress == "" {
+		return errors.New("neither the `DisputeGameFactory` nor `L2OutputOracle` address was provided")
+	}
 	if c.DGFAddress != "" && c.L2OOAddress != "" {
 		return errors.New("both the `DisputeGameFactory` and `L2OutputOracle` addresses were provided")
 	}
@@ -106,5 +112,6 @@ func NewConfig(ctx *cli.Context) *CLIConfig {
 		ProposalInterval:             ctx.Duration(flags.ProposalIntervalFlag.Name),
 		DisputeGameType:              uint32(ctx.Uint(flags.DisputeGameTypeFlag.Name)),
 		ActiveSequencerCheckDuration: ctx.Duration(flags.ActiveSequencerCheckDurationFlag.Name),
+		WaitNodeSync:                 ctx.Bool(flags.WaitNodeSyncFlag.Name),
 	}
 }
diff --git a/op-proposer/proposer/driver.go b/op-proposer/proposer/driver.go
index 68fee69a1ba2..1278e863b1c7 100644
--- a/op-proposer/proposer/driver.go
+++ b/op-proposer/proposer/driver.go
@@ -17,7 +17,7 @@ import (
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-proposer/bindings"
 	"github.com/ethereum-optimism/optimism/op-proposer/metrics"
 	"github.com/ethereum-optimism/optimism/op-service/dial"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
@@ -415,6 +415,14 @@ func (l *L2OutputSubmitter) loop() {
 	defer l.wg.Done()
 	ctx := l.ctx
 
+	if l.Cfg.WaitNodeSync {
+		err := l.waitNodeSync()
+		if err != nil {
+			l.Log.Error("Error waiting for node sync", "err", err)
+			return
+		}
+	}
+
 	if l.dgfContract == nil {
 		l.loopL2OO(ctx)
 	} else {
@@ -422,6 +430,23 @@ func (l *L2OutputSubmitter) loop() {
 	}
 }
 
+func (l *L2OutputSubmitter) waitNodeSync() error {
+	ctx, cancel := context.WithTimeout(l.ctx, l.Cfg.NetworkTimeout)
+	defer cancel()
+
+	l1head, err := l.Txmgr.BlockNumber(ctx)
+	if err != nil {
+		return fmt.Errorf("failed to retrieve current L1 block number: %w", err)
+	}
+
+	rollupClient, err := l.RollupProvider.RollupClient(ctx)
+	if err != nil {
+		return fmt.Errorf("failed to get rollup client: %w", err)
+	}
+
+	return dial.WaitRollupSync(l.ctx, l.Log, rollupClient, l1head, time.Second*12)
+}
+
 func (l *L2OutputSubmitter) loopL2OO(ctx context.Context) {
 	ticker := time.NewTicker(l.Cfg.PollInterval)
 	defer ticker.Stop()
diff --git a/op-proposer/proposer/service.go b/op-proposer/proposer/service.go
index 0336c2d6bb4f..0e5012d1ab85 100644
--- a/op-proposer/proposer/service.go
+++ b/op-proposer/proposer/service.go
@@ -44,6 +44,8 @@ type ProposerConfig struct {
 	// is never valid on an alternative L1 chain that would produce different L2 data.
 	// This option is not necessary when higher proposal latency is acceptable and L1 is healthy.
 	AllowNonFinalized bool
+
+	WaitNodeSync bool
 }
 
 type ProposerService struct {
@@ -89,6 +91,7 @@ func (ps *ProposerService) initFromCLIConfig(ctx context.Context, version string
 	ps.PollInterval = cfg.PollInterval
 	ps.NetworkTimeout = cfg.TxMgrConfig.NetworkTimeout
 	ps.AllowNonFinalized = cfg.AllowNonFinalized
+	ps.WaitNodeSync = cfg.WaitNodeSync
 
 	ps.initL2ooAddress(cfg)
 	ps.initDGF(cfg)
@@ -259,8 +262,7 @@ func (ps *ProposerService) initRPCServer(cfg *CLIConfig) error {
 // Start runs once upon start of the proposer lifecycle,
 // and starts L2Output-submission work if the proposer is configured to start submit data on startup.
 func (ps *ProposerService) Start(_ context.Context) error {
-	ps.driver.Log.Info("Starting Proposer")
-
+	ps.Log.Info("Starting Proposer")
 	return ps.driver.StartL2OutputSubmitting()
 }
 
diff --git a/op-service/Makefile b/op-service/Makefile
index d458b3c15aa5..0978529f9b8d 100644
--- a/op-service/Makefile
+++ b/op-service/Makefile
@@ -1,3 +1,8 @@
+# Use the old Apple linker to workaround broken xcode - https://github.com/golang/go/issues/65169
+ifeq ($(shell uname),Darwin)
+	FUZZLDFLAGS := -ldflags=-extldflags=-Wl,-ld_classic
+endif
+
 test:
 	go test -v ./...
 
@@ -5,13 +10,14 @@ generate-mocks:
 	go generate ./...
 
 fuzz:
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzExecutionPayloadUnmarshal ./eth
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzExecutionPayloadMarshalUnmarshalV1 ./eth
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzExecutionPayloadMarshalUnmarshalV2 ./eth
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzExecutionPayloadMarshalUnmarshalV3 ./eth
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzOBP01 ./eth
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzEncodeDecodeBlob ./eth
-	go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDetectNonBijectivity ./eth
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzExecutionPayloadUnmarshal ./eth
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzExecutionPayloadMarshalUnmarshalV1 ./eth
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzExecutionPayloadMarshalUnmarshalV2 ./eth
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzExecutionPayloadMarshalUnmarshalV3 ./eth
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzOBP01 ./eth
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzEncodeDecodeBlob ./eth
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzDetectNonBijectivity ./eth
+	go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzEncodeScalar ./eth
 
 .PHONY: \
 	test \
diff --git a/op-service/client/client.go b/op-service/client/client.go
index 5d155957bfeb..22f71866926b 100644
--- a/op-service/client/client.go
+++ b/op-service/client/client.go
@@ -4,16 +4,18 @@ import (
 	"context"
 	"math/big"
 
-	"github.com/ethereum-optimism/optimism/op-node/metrics"
 	"github.com/ethereum/go-ethereum"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/ethereum/go-ethereum/rpc"
+
+	"github.com/ethereum-optimism/optimism/op-service/metrics"
 )
 
 type Client interface {
 	Close()
+	RPC() RPC
 	ChainID(ctx context.Context) (*big.Int, error)
 	BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error)
 	BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error)
@@ -52,17 +54,19 @@ type Client interface {
 // InstrumentedClient is an Ethereum client that tracks
 // Prometheus metrics for each call.
 type InstrumentedClient struct {
-	c *ethclient.Client
-	m *metrics.Metrics
+	c   *ethclient.Client
+	m   *metrics.RPCClientMetrics
+	rpc RPC
 }
 
 // NewInstrumentedClient creates a new instrumented client. It takes
 // a concrete *rpc.Client to prevent people from passing in an already
 // instrumented client.
-func NewInstrumentedClient(c *rpc.Client, m *metrics.Metrics) *InstrumentedClient {
+func NewInstrumentedClient(c *rpc.Client, m *metrics.RPCClientMetrics) *InstrumentedClient {
 	return &InstrumentedClient{
-		c: ethclient.NewClient(c),
-		m: m,
+		c:   ethclient.NewClient(c),
+		m:   m,
+		rpc: NewInstrumentedRPC(NewBaseRPCClient(c), m),
 	}
 }
 
@@ -70,6 +74,10 @@ func (ic *InstrumentedClient) Close() {
 	ic.c.Close()
 }
 
+func (ic *InstrumentedClient) RPC() RPC {
+	return ic.rpc
+}
+
 func (ic *InstrumentedClient) ChainID(ctx context.Context) (*big.Int, error) {
 	return instrument2[*big.Int](ic.m, "eth_chainId", func() (*big.Int, error) {
 		return ic.c.ChainID(ctx)
@@ -263,14 +271,14 @@ func (ic *InstrumentedClient) SendTransaction(ctx context.Context, tx *types.Tra
 	})
 }
 
-func instrument1(m *metrics.Metrics, name string, cb func() error) error {
+func instrument1(m metrics.RPCClientMetricer, name string, cb func() error) error {
 	record := m.RecordRPCClientRequest(name)
 	err := cb()
 	record(err)
 	return err
 }
 
-func instrument2[O any](m *metrics.Metrics, name string, cb func() (O, error)) (O, error) {
+func instrument2[O any](m metrics.RPCClientMetricer, name string, cb func() (O, error)) (O, error) {
 	record := m.RecordRPCClientRequest(name)
 	res, err := cb()
 	record(err)
diff --git a/op-service/client/mocks/HTTP.go b/op-service/client/mocks/HTTP.go
new file mode 100644
index 000000000000..b0ffe5f373a5
--- /dev/null
+++ b/op-service/client/mocks/HTTP.go
@@ -0,0 +1,97 @@
+// Code generated by mockery v2.28.1. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+	http "net/http"
+
+	mock "github.com/stretchr/testify/mock"
+
+	url "net/url"
+)
+
+// HTTP is an autogenerated mock type for the HTTP type
+type HTTP struct {
+	mock.Mock
+}
+
+type HTTP_Expecter struct {
+	mock *mock.Mock
+}
+
+func (_m *HTTP) EXPECT() *HTTP_Expecter {
+	return &HTTP_Expecter{mock: &_m.Mock}
+}
+
+// Get provides a mock function with given fields: ctx, path, query, headers
+func (_m *HTTP) Get(ctx context.Context, path string, query url.Values, headers http.Header) (*http.Response, error) {
+	ret := _m.Called(ctx, path, query, headers)
+
+	var r0 *http.Response
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, string, url.Values, http.Header) (*http.Response, error)); ok {
+		return rf(ctx, path, query, headers)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, string, url.Values, http.Header) *http.Response); ok {
+		r0 = rf(ctx, path, query, headers)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*http.Response)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, string, url.Values, http.Header) error); ok {
+		r1 = rf(ctx, path, query, headers)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// HTTP_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get'
+type HTTP_Get_Call struct {
+	*mock.Call
+}
+
+// Get is a helper method to define mock.On call
+//   - ctx context.Context
+//   - path string
+//   - query url.Values
+//   - headers http.Header
+func (_e *HTTP_Expecter) Get(ctx interface{}, path interface{}, query interface{}, headers interface{}) *HTTP_Get_Call {
+	return &HTTP_Get_Call{Call: _e.mock.On("Get", ctx, path, query, headers)}
+}
+
+func (_c *HTTP_Get_Call) Run(run func(ctx context.Context, path string, query url.Values, headers http.Header)) *HTTP_Get_Call {
+	_c.Call.Run(func(args mock.Arguments) {
+		run(args[0].(context.Context), args[1].(string), args[2].(url.Values), args[3].(http.Header))
+	})
+	return _c
+}
+
+func (_c *HTTP_Get_Call) Return(_a0 *http.Response, _a1 error) *HTTP_Get_Call {
+	_c.Call.Return(_a0, _a1)
+	return _c
+}
+
+func (_c *HTTP_Get_Call) RunAndReturn(run func(context.Context, string, url.Values, http.Header) (*http.Response, error)) *HTTP_Get_Call {
+	_c.Call.Return(run)
+	return _c
+}
+
+type mockConstructorTestingTNewHTTP interface {
+	mock.TestingT
+	Cleanup(func())
+}
+
+// NewHTTP creates a new instance of HTTP. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+func NewHTTP(t mockConstructorTestingTNewHTTP) *HTTP {
+	mock := &HTTP{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/op-service/client/rpc.go b/op-service/client/rpc.go
index cc48b8b1bf0d..78acce883203 100644
--- a/op-service/client/rpc.go
+++ b/op-service/client/rpc.go
@@ -8,14 +8,16 @@ import (
 	"regexp"
 	"time"
 
-	"github.com/ethereum-optimism/optimism/op-service/retry"
-	"github.com/ethereum/go-ethereum"
-	"github.com/ethereum/go-ethereum/log"
-	"github.com/prometheus/client_golang/prometheus"
 	"golang.org/x/time/rate"
 
-	"github.com/ethereum-optimism/optimism/op-node/metrics"
+	"github.com/prometheus/client_golang/prometheus"
+
+	"github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/log"
 	"github.com/ethereum/go-ethereum/rpc"
+
+	"github.com/ethereum-optimism/optimism/op-service/metrics"
+	"github.com/ethereum-optimism/optimism/op-service/retry"
 )
 
 var httpRegex = regexp.MustCompile("^http(s)?://")
@@ -183,11 +185,11 @@ func (b *BaseRPCClient) EthSubscribe(ctx context.Context, channel any, args ...a
 // Prometheus metrics for each call.
 type InstrumentedRPCClient struct {
 	c RPC
-	m *metrics.Metrics
+	m *metrics.RPCClientMetrics
 }
 
 // NewInstrumentedRPC creates a new instrumented RPC client.
-func NewInstrumentedRPC(c RPC, m *metrics.Metrics) *InstrumentedRPCClient {
+func NewInstrumentedRPC(c RPC, m *metrics.RPCClientMetrics) *InstrumentedRPCClient {
 	return &InstrumentedRPCClient{
 		c: c,
 		m: m,
@@ -219,7 +221,7 @@ func (ic *InstrumentedRPCClient) EthSubscribe(ctx context.Context, channel any,
 // the batch as a whole using a special  method. Errors are tracked
 // for each individual batch response, unless the overall request fails in
 // which case the  method is used.
-func instrumentBatch(m *metrics.Metrics, cb func() error, b []rpc.BatchElem) error {
+func instrumentBatch(m *metrics.RPCClientMetrics, cb func() error, b []rpc.BatchElem) error {
 	m.RPCClientRequestsTotal.WithLabelValues(metrics.BatchMethod).Inc()
 	for _, elem := range b {
 		m.RPCClientRequestsTotal.WithLabelValues(elem.Method).Inc()
diff --git a/op-service/clock/util.go b/op-service/clock/util.go
new file mode 100644
index 000000000000..dc564c652fff
--- /dev/null
+++ b/op-service/clock/util.go
@@ -0,0 +1,25 @@
+package clock
+
+import (
+	"time"
+)
+
+type RWClock interface {
+	Now() time.Time
+}
+
+// MinCheckedTimestamp returns the minimum checked unix timestamp.
+// If the duration is 0, the returned minimum timestamp is 0.
+// Otherwise, the minimum timestamp is the current unix time minus the duration.
+// The subtraction operation is checked and returns 0 on underflow.
+func MinCheckedTimestamp(clock RWClock, duration time.Duration) uint64 {
+	if duration.Seconds() == 0 {
+		return 0
+	}
+	// To compute t-d for a duration d, use t.Add(-d).
+	// See https://pkg.go.dev/time#Time.Sub
+	if clock.Now().Unix() > int64(duration.Seconds()) {
+		return uint64(clock.Now().Add(-duration).Unix())
+	}
+	return 0
+}
diff --git a/op-service/clock/util_test.go b/op-service/clock/util_test.go
new file mode 100644
index 000000000000..b2c5e3f50259
--- /dev/null
+++ b/op-service/clock/util_test.go
@@ -0,0 +1,64 @@
+package clock
+
+import (
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+)
+
+func TestMinCheckedTimestamp(t *testing.T) {
+	tests := []struct {
+		name     string
+		now      time.Time
+		duration time.Duration
+		want     uint64
+	}{
+		{
+			name:     "ZeroDurationZeroClock",
+			now:      time.Unix(0, 0),
+			duration: 0,
+			want:     0,
+		},
+		{
+			name:     "ZeroDurationPositiveClock",
+			now:      time.Unix(1, 0),
+			duration: 0,
+			want:     0,
+		},
+		{
+			name:     "UnderflowZeroClock",
+			now:      time.Unix(0, 0),
+			duration: time.Second,
+			want:     0,
+		},
+		{
+			name:     "UnderflowPositiveClock",
+			now:      time.Unix(1, 0),
+			duration: time.Second * 2,
+			want:     0,
+		},
+		{
+			name:     "CorrectArithmetic",
+			now:      time.Unix(100, 0),
+			duration: time.Second * 10,
+			want:     90,
+		},
+	}
+
+	for _, test := range tests {
+		test := test
+		t.Run(test.name, func(t *testing.T) {
+			clock := &mockClock{now: test.now}
+			require.Equal(t, test.want, MinCheckedTimestamp(clock, test.duration))
+		})
+	}
+}
+
+type mockClock struct {
+	now time.Time
+}
+
+func (m *mockClock) Now() time.Time {
+	return m.now
+}
diff --git a/op-service/dial/rollup_sync.go b/op-service/dial/rollup_sync.go
new file mode 100644
index 000000000000..59f40488cab5
--- /dev/null
+++ b/op-service/dial/rollup_sync.go
@@ -0,0 +1,41 @@
+package dial
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/ethereum/go-ethereum/log"
+)
+
+func WaitRollupSync(
+	ctx context.Context,
+	lgr log.Logger,
+	rollup SyncStatusProvider,
+	l1BlockTarget uint64,
+	pollInterval time.Duration,
+) error {
+	for {
+		syncst, err := rollup.SyncStatus(ctx)
+		if err != nil {
+			// don't log assuming caller handles and logs errors
+			return fmt.Errorf("getting sync status: %w", err)
+		}
+
+		lgr := lgr.With("current_l1", syncst.CurrentL1, "target_l1", l1BlockTarget)
+		if syncst.CurrentL1.Number >= l1BlockTarget {
+			lgr.Info("rollup current L1 block target reached")
+			return nil
+		}
+
+		lgr.Info("rollup current L1 block still behind target, retrying")
+		timer := time.NewTimer(pollInterval)
+		select {
+		case <-timer.C: // next try
+		case <-ctx.Done():
+			lgr.Warn("waiting for rollup sync timed out")
+			timer.Stop()
+			return ctx.Err()
+		}
+	}
+}
diff --git a/op-service/dial/rollup_sync_test.go b/op-service/dial/rollup_sync_test.go
new file mode 100644
index 000000000000..1d3898e8fdb8
--- /dev/null
+++ b/op-service/dial/rollup_sync_test.go
@@ -0,0 +1,101 @@
+package dial
+
+import (
+	"context"
+	"errors"
+	"testing"
+	"time"
+
+	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/testlog"
+	"github.com/ethereum-optimism/optimism/op-service/testutils"
+	"github.com/stretchr/testify/require"
+	"golang.org/x/exp/slog"
+)
+
+func TestWaitRollupSync(t *testing.T) {
+	bctx := context.Background()
+	hasInfoLevel := testlog.NewLevelFilter(slog.LevelInfo)
+	const target = 42
+
+	t.Run("sync-error", func(t *testing.T) {
+		lgr, logs := testlog.CaptureLogger(t, slog.LevelInfo)
+		rollup := new(testutils.MockRollupClient)
+		syncErr := errors.New("test sync error")
+		rollup.ExpectSyncStatus(nil, syncErr)
+
+		err := WaitRollupSync(bctx, lgr, rollup, 0, 0)
+		require.ErrorIs(t, err, syncErr)
+		require.Nil(t, logs.FindLog(hasInfoLevel), "expected no logs")
+		rollup.AssertExpectations(t)
+	})
+
+	t.Run("at-target", func(t *testing.T) {
+		lgr, logs := testlog.CaptureLogger(t, slog.LevelDebug)
+		rollup := new(testutils.MockRollupClient)
+		rollup.ExpectSyncStatus(ð.SyncStatus{
+			CurrentL1: eth.L1BlockRef{Number: target},
+		}, nil)
+
+		err := WaitRollupSync(bctx, lgr, rollup, target, 0)
+		require.NoError(t, err)
+		require.NotNil(t, logs.FindLog(hasInfoLevel,
+			testlog.NewMessageContainsFilter("target reached")))
+		rollup.AssertExpectations(t)
+	})
+
+	t.Run("beyond-target", func(t *testing.T) {
+		lgr, logs := testlog.CaptureLogger(t, slog.LevelDebug)
+		rollup := new(testutils.MockRollupClient)
+		rollup.ExpectSyncStatus(ð.SyncStatus{
+			CurrentL1: eth.L1BlockRef{Number: target + 12},
+		}, nil)
+
+		err := WaitRollupSync(bctx, lgr, rollup, target, 0)
+		require.NoError(t, err)
+		require.NotNil(t, logs.FindLog(hasInfoLevel,
+			testlog.NewMessageContainsFilter("target reached")))
+		rollup.AssertExpectations(t)
+	})
+
+	t.Run("few-blocks-before-target", func(t *testing.T) {
+		lgr, logs := testlog.CaptureLogger(t, slog.LevelDebug)
+		rollup := new(testutils.MockRollupClient)
+		const gap = 7
+		for i := -gap; i <= 0; i++ {
+			rollup.ExpectSyncStatus(ð.SyncStatus{
+				CurrentL1: eth.L1BlockRef{Number: uint64(target + i)},
+			}, nil)
+		}
+
+		err := WaitRollupSync(bctx, lgr, rollup, target, 0)
+		require.NoError(t, err)
+		require.NotNil(t, logs.FindLog(hasInfoLevel,
+			testlog.NewMessageContainsFilter("target reached")))
+		require.Len(t, logs.FindLogs(hasInfoLevel,
+			testlog.NewMessageContainsFilter("retrying")), gap)
+		rollup.AssertExpectations(t)
+	})
+
+	t.Run("ctx-timeout", func(t *testing.T) {
+		lgr, logs := testlog.CaptureLogger(t, slog.LevelDebug)
+		rollup := new(testutils.MockRollupClient)
+		rollup.ExpectSyncStatus(ð.SyncStatus{
+			CurrentL1: eth.L1BlockRef{Number: uint64(target - 1)},
+		}, nil)
+
+		ctx, cancel := context.WithCancel(bctx)
+		// We can already cancel the context because the mock ignores the
+		// cancelled context.
+		cancel()
+		// need real duration or the timer races with the cancelled context
+		err := WaitRollupSync(ctx, lgr, rollup, target, time.Second)
+		require.ErrorIs(t, err, context.Canceled)
+		require.NotNil(t, logs.FindLogs(hasInfoLevel,
+			testlog.NewMessageContainsFilter("retrying")))
+		require.NotNil(t, logs.FindLog(
+			testlog.NewLevelFilter(slog.LevelWarn),
+			testlog.NewMessageContainsFilter("timed out")))
+		rollup.AssertExpectations(t)
+	})
+}
diff --git a/op-service/dial/rollupclient_interface.go b/op-service/dial/rollupclient_interface.go
index 46e1afdc7264..e83619bab3fc 100644
--- a/op-service/dial/rollupclient_interface.go
+++ b/op-service/dial/rollupclient_interface.go
@@ -11,10 +11,16 @@ import (
 // RollupClientInterface is an interface for providing a RollupClient
 // It does not describe all of the functions a RollupClient has, only the ones used by the L2 Providers and their callers
 type RollupClientInterface interface {
+	SyncStatusProvider
 	OutputAtBlock(ctx context.Context, blockNum uint64) (*eth.OutputResponse, error)
-	SyncStatus(ctx context.Context) (*eth.SyncStatus, error)
 	RollupConfig(ctx context.Context) (*rollup.Config, error)
 	StartSequencer(ctx context.Context, unsafeHead common.Hash) error
 	SequencerActive(ctx context.Context) (bool, error)
 	Close()
 }
+
+// SyncStatusProvider is the interface of a rollup client from which its sync status
+// can be queried.
+type SyncStatusProvider interface {
+	SyncStatus(ctx context.Context) (*eth.SyncStatus, error)
+}
diff --git a/op-service/eth/balance.go b/op-service/eth/balance.go
new file mode 100644
index 000000000000..43ff1269103e
--- /dev/null
+++ b/op-service/eth/balance.go
@@ -0,0 +1,16 @@
+package eth
+
+import (
+	"math/big"
+
+	"github.com/ethereum/go-ethereum/params"
+)
+
+// WeiToEther divides the wei value by 10^18 to get a number in ether as a float64
+func WeiToEther(wei *big.Int) float64 {
+	num := new(big.Rat).SetInt(wei)
+	denom := big.NewRat(params.Ether, 1)
+	num = num.Quo(num, denom)
+	f, _ := num.Float64()
+	return f
+}
diff --git a/op-service/metrics/balance_test.go b/op-service/eth/balance_test.go
similarity index 93%
rename from op-service/metrics/balance_test.go
rename to op-service/eth/balance_test.go
index e8d0122608c9..87ed1f096cc5 100644
--- a/op-service/metrics/balance_test.go
+++ b/op-service/eth/balance_test.go
@@ -1,4 +1,4 @@
-package metrics
+package eth
 
 import (
 	"math/big"
@@ -31,10 +31,9 @@ func TestWeiToEther(t *testing.T) {
 	}
 
 	for i, tc := range tests {
-		out := weiToEther(tc.input)
+		out := WeiToEther(tc.input)
 		if out != tc.output {
 			t.Fatalf("test %v: expected %v but got %v", i, tc.output, out)
 		}
 	}
-
 }
diff --git a/op-service/eth/blob.go b/op-service/eth/blob.go
index 2c60828571db..da871215da85 100644
--- a/op-service/eth/blob.go
+++ b/op-service/eth/blob.go
@@ -9,7 +9,6 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/crypto/kzg4844"
-	"github.com/ethereum/go-ethereum/params"
 )
 
 const (
@@ -64,14 +63,8 @@ func (b *Blob) ComputeKZGCommitment() (kzg4844.Commitment, error) {
 // KZGToVersionedHash computes the "blob hash" (a.k.a. versioned-hash) of a blob-commitment, as used in a blob-tx.
 // We implement it here because it is unfortunately not (currently) exposed by geth.
 func KZGToVersionedHash(commitment kzg4844.Commitment) (out common.Hash) {
-	// EIP-4844 spec:
-	//	def kzg_to_versioned_hash(commitment: KZGCommitment) -> VersionedHash:
-	//		return VERSIONED_HASH_VERSION_KZG + sha256(commitment)[1:]
-	h := sha256.New()
-	h.Write(commitment[:])
-	_ = h.Sum(out[:0])
-	out[0] = params.BlobTxHashVersion
-	return out
+	hasher := sha256.New()
+	return kzg4844.CalcBlobHashV1(hasher, &commitment)
 }
 
 // VerifyBlobProof verifies that the given blob and proof corresponds to the given commitment,
diff --git a/op-service/eth/blobs_api_test.go b/op-service/eth/blobs_api_test.go
index ca8a15766ad8..f7439ff75a9c 100644
--- a/op-service/eth/blobs_api_test.go
+++ b/op-service/eth/blobs_api_test.go
@@ -7,8 +7,9 @@ import (
 	"reflect"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/stretchr/testify/require"
+
+	"github.com/ethereum-optimism/optimism/op-service/eth"
 )
 
 type dataJson struct {
diff --git a/op-service/eth/ssz.go b/op-service/eth/ssz.go
index 1eb31235f625..ae3d89ec3614 100644
--- a/op-service/eth/ssz.go
+++ b/op-service/eth/ssz.go
@@ -319,6 +319,9 @@ func (payload *ExecutionPayload) UnmarshalSSZ(version BlockVersion, scope uint32
 		if withdrawalsOffset < transactionsOffset {
 			return ErrBadWithdrawalsOffset
 		}
+		if withdrawalsOffset > scope {
+			return fmt.Errorf("withdrawals offset is too large: %d", withdrawalsOffset)
+		}
 	}
 
 	if version == BlockV3 {
@@ -345,10 +348,6 @@ func (payload *ExecutionPayload) UnmarshalSSZ(version BlockVersion, scope uint32
 	payload.Transactions = txs
 
 	if version.HasWithdrawals() {
-		if withdrawalsOffset > scope {
-			return fmt.Errorf("withdrawals offset is too large: %d", withdrawalsOffset)
-		}
-
 		withdrawals, err := unmarshalWithdrawals(buf[withdrawalsOffset:])
 		if err != nil {
 			return fmt.Errorf("failed to unmarshal withdrawals list: %w", err)
diff --git a/op-service/eth/ssz_test.go b/op-service/eth/ssz_test.go
index fdaded1c19e6..fdaf866643a9 100644
--- a/op-service/eth/ssz_test.go
+++ b/op-service/eth/ssz_test.go
@@ -427,7 +427,7 @@ func TestMarshalUnmarshalExecutionPayloadEnvelopes(t *testing.T) {
 		ExecutionPayload:      createPayloadWithWithdrawals(&types.Withdrawals{}),
 	}
 
-	missingExecutionPaylaod := &ExecutionPayloadEnvelope{
+	missingExecutionPayload := &ExecutionPayloadEnvelope{
 		ParentBeaconBlockRoot: &hash,
 		ExecutionPayload:      nil,
 	}
@@ -439,7 +439,7 @@ func TestMarshalUnmarshalExecutionPayloadEnvelopes(t *testing.T) {
 	}{
 		{"ValidInputSucceeds", validInput, nil},
 		{"MissingHashFailsToSerialize", missingHash, ErrMissingData},
-		{"MissingExecutionDataFailsToSerialize", missingExecutionPaylaod, ErrMissingData},
+		{"MissingExecutionDataFailsToSerialize", missingExecutionPayload, ErrMissingData},
 	}
 
 	for _, test := range tests {
diff --git a/op-service/eth/transactions.go b/op-service/eth/transactions.go
index 8af4b5c57844..d92f5a245646 100644
--- a/op-service/eth/transactions.go
+++ b/op-service/eth/transactions.go
@@ -1,13 +1,20 @@
 package eth
 
 import (
+	"context"
 	"fmt"
+	"math/big"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/core/types"
 )
 
+type L1Client interface {
+	HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error)
+	NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error)
+}
+
 // EncodeTransactions encodes a list of transactions into opaque transactions.
 func EncodeTransactions(elems []*types.Transaction) ([]hexutil.Bytes, error) {
 	out := make([]hexutil.Bytes, len(elems))
@@ -42,3 +49,45 @@ func TransactionsToHashes(elems []*types.Transaction) []common.Hash {
 	}
 	return out
 }
+
+// CheckRecentTxs checks the depth recent blocks for transactions from the account with address addr
+// and returns the most recent block and true, if any was found, or the oldest block checked and false, if not.
+func CheckRecentTxs(
+	ctx context.Context,
+	l1 L1Client,
+	depth int,
+	addr common.Address,
+) (recentBlock uint64, found bool, err error) {
+	blockHeader, err := l1.HeaderByNumber(ctx, nil)
+	if err != nil {
+		return 0, false, fmt.Errorf("failed to retrieve current block header: %w", err)
+	}
+
+	currentBlock := blockHeader.Number
+	currentNonce, err := l1.NonceAt(ctx, addr, currentBlock)
+	if err != nil {
+		return 0, false, fmt.Errorf("failed to retrieve current nonce: %w", err)
+	}
+
+	oldestBlock := new(big.Int)
+	oldestBlock.Sub(currentBlock, big.NewInt(int64(depth)))
+	previousNonce, err := l1.NonceAt(ctx, addr, oldestBlock)
+	if err != nil {
+		return 0, false, fmt.Errorf("failed to retrieve previous nonce: %w", err)
+	}
+
+	if currentNonce == previousNonce {
+		return oldestBlock.Uint64(), false, nil
+	}
+
+	// Decrease block num until we find the block before the most recent batcher tx was sent
+	targetNonce := currentNonce - 1
+	for currentNonce > targetNonce && currentBlock.Cmp(oldestBlock) != -1 {
+		currentBlock.Sub(currentBlock, big.NewInt(1))
+		currentNonce, err = l1.NonceAt(ctx, addr, currentBlock)
+		if err != nil {
+			return 0, false, fmt.Errorf("failed to retrieve nonce: %w", err)
+		}
+	}
+	return currentBlock.Uint64() + 1, true, nil
+}
diff --git a/op-service/eth/transactions_test.go b/op-service/eth/transactions_test.go
new file mode 100644
index 000000000000..57470d977f17
--- /dev/null
+++ b/op-service/eth/transactions_test.go
@@ -0,0 +1,140 @@
+package eth
+
+import (
+	"context"
+	"math/big"
+	"testing"
+
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/stretchr/testify/mock"
+	"github.com/stretchr/testify/require"
+)
+
+type MockL1Client struct {
+	mock.Mock
+}
+
+func (m *MockL1Client) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) {
+	args := m.Called(ctx, account, blockNumber)
+	return args.Get(0).(uint64), args.Error(1)
+}
+
+func (m *MockL1Client) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) {
+	args := m.Called(ctx, number)
+	if header, ok := args.Get(0).(*types.Header); ok {
+		return header, args.Error(1)
+	}
+	return nil, args.Error(1)
+}
+
+func TestTransactions_checkRecentTxs(t *testing.T) {
+	tests := []struct {
+		name               string
+		currentBlock       uint64
+		blockConfirms      uint64
+		previousNonceBlock uint64
+		expectedBlockNum   uint64
+		expectedFound      bool
+	}{
+		{
+			// Blocks       495 496 497 498 499 500
+			// Nonce          5   5   5   6   6   6
+			// call NonceAt   x   -   x   x   x   x
+			name:               "NonceDiff_3Blocks",
+			currentBlock:       500,
+			blockConfirms:      5,
+			previousNonceBlock: 497,
+			expectedBlockNum:   498,
+			expectedFound:      true,
+		},
+		{
+			// Blocks       495 496 497 498 499 500
+			// Nonce          5   5   5   5   5   6
+			// call NonceAt   x   -   -   -   x   x
+			name:               "NonceDiff_1Block",
+			currentBlock:       500,
+			blockConfirms:      5,
+			previousNonceBlock: 499,
+			expectedBlockNum:   500,
+			expectedFound:      true,
+		},
+		{
+			// Blocks       495 496 497 498 499 500
+			// Nonce          6   6   6   6   6   6
+			// call NonceAt   x   -   -   -   -   x
+			name:               "NonceUnchanged",
+			currentBlock:       500,
+			blockConfirms:      5,
+			previousNonceBlock: 400,
+			expectedBlockNum:   495,
+			expectedFound:      false,
+		},
+	}
+
+	for _, tt := range tests {
+
+		t.Run(tt.name, func(t *testing.T) {
+			l1Client := new(MockL1Client)
+			ctx := context.Background()
+
+			currentNonce := uint64(6)
+			previousNonce := uint64(5)
+
+			l1Client.On("HeaderByNumber", ctx, (*big.Int)(nil)).Return(&types.Header{Number: big.NewInt(int64(tt.currentBlock))}, nil)
+
+			// Setup mock calls for NonceAt, depending on how many times its expected to be called
+			if tt.previousNonceBlock < tt.currentBlock-tt.blockConfirms {
+				l1Client.On("NonceAt", ctx, common.Address{}, big.NewInt(int64(tt.currentBlock))).Return(currentNonce, nil)
+				l1Client.On("NonceAt", ctx, common.Address{}, big.NewInt(int64(tt.currentBlock-tt.blockConfirms))).Return(currentNonce, nil)
+			} else {
+				for block := tt.currentBlock; block >= (tt.currentBlock - tt.blockConfirms); block-- {
+					blockBig := big.NewInt(int64(block))
+					if block > (tt.currentBlock-tt.blockConfirms) && block < tt.previousNonceBlock {
+						t.Log("skipped block: ", block)
+						continue
+					} else if block <= tt.previousNonceBlock {
+						t.Log("previousNonce set at block: ", block)
+						l1Client.On("NonceAt", ctx, common.Address{}, blockBig).Return(previousNonce, nil)
+					} else {
+						t.Log("currentNonce set at block: ", block)
+						l1Client.On("NonceAt", ctx, common.Address{}, blockBig).Return(currentNonce, nil)
+					}
+				}
+			}
+
+			blockNum, found, err := CheckRecentTxs(ctx, l1Client, 5, common.Address{})
+			require.NoError(t, err)
+			require.Equal(t, tt.expectedBlockNum, blockNum)
+			require.Equal(t, tt.expectedFound, found)
+
+			l1Client.AssertExpectations(t)
+		})
+	}
+}
+func TestTransactions_checkRecentTxs_reorg(t *testing.T) {
+	l1Client := new(MockL1Client)
+	ctx := context.Background()
+
+	currentNonce := uint64(6)
+	currentBlock := uint64(500)
+	blockConfirms := uint64(5)
+
+	l1Client.On("HeaderByNumber", ctx, (*big.Int)(nil)).Return(&types.Header{Number: big.NewInt(int64(currentBlock))}, nil)
+	l1Client.On("NonceAt", ctx, common.Address{}, big.NewInt(int64(currentBlock))).Return(currentNonce, nil)
+
+	l1Client.On("NonceAt", ctx, common.Address{}, big.NewInt(int64(currentBlock-blockConfirms))).Return(currentNonce+1, nil)
+	l1Client.On("NonceAt", ctx, common.Address{}, big.NewInt(int64(currentBlock-1))).Return(currentNonce, nil)
+	l1Client.On("NonceAt", ctx, common.Address{}, big.NewInt(int64(currentBlock-2))).Return(currentNonce, nil)
+	l1Client.On("NonceAt", ctx, common.Address{}, big.NewInt(int64(currentBlock-3))).Return(currentNonce, nil)
+	l1Client.On("NonceAt", ctx, common.Address{}, big.NewInt(int64(currentBlock-4))).Return(currentNonce, nil)
+	l1Client.On("NonceAt", ctx, common.Address{}, big.NewInt(int64(currentBlock-5))).Return(currentNonce, nil)
+	l1Client.On("NonceAt", ctx, common.Address{}, big.NewInt(int64(currentBlock-6))).Return(currentNonce, nil)
+
+	blockNum, found, err := CheckRecentTxs(ctx, l1Client, 5, common.Address{})
+	require.NoError(t, err)
+	require.Equal(t, uint64(495), blockNum)
+	require.Equal(t, true, found)
+
+	l1Client.AssertExpectations(t)
+}
diff --git a/op-service/eth/types.go b/op-service/eth/types.go
index 58d16c3cdd22..81a95fc968f8 100644
--- a/op-service/eth/types.go
+++ b/op-service/eth/types.go
@@ -393,25 +393,48 @@ const (
 	L1ScalarEcotone = byte(1)
 )
 
-func (sysCfg *SystemConfig) EcotoneScalars() (blobBaseFeeScalar, baseFeeScalar uint32, err error) {
+type EcotoneScalars struct {
+	BlobBaseFeeScalar uint32
+	BaseFeeScalar     uint32
+}
+
+func (sysCfg *SystemConfig) EcotoneScalars() (EcotoneScalars, error) {
 	if err := CheckEcotoneL1SystemConfigScalar(sysCfg.Scalar); err != nil {
 		if errors.Is(err, ErrBedrockScalarPaddingNotEmpty) {
 			// L2 spec mandates we set baseFeeScalar to MaxUint32 if there are non-zero bytes in
 			// the padding area.
-			return 0, math.MaxUint32, nil
+			return EcotoneScalars{BlobBaseFeeScalar: 0, BaseFeeScalar: math.MaxUint32}, nil
 		}
-		return 0, 0, err
+		return EcotoneScalars{}, err
 	}
-	switch sysCfg.Scalar[0] {
+	return DecodeScalar(sysCfg.Scalar)
+}
+
+// DecodeScalar decodes the blobBaseFeeScalar and baseFeeScalar from a 32-byte scalar value.
+// It uses the first byte to determine the scalar format.
+func DecodeScalar(scalar [32]byte) (EcotoneScalars, error) {
+	switch scalar[0] {
 	case L1ScalarBedrock:
-		blobBaseFeeScalar = 0
-		baseFeeScalar = binary.BigEndian.Uint32(sysCfg.Scalar[28:32])
+		return EcotoneScalars{
+			BlobBaseFeeScalar: 0,
+			BaseFeeScalar:     binary.BigEndian.Uint32(scalar[28:32]),
+		}, nil
 	case L1ScalarEcotone:
-		blobBaseFeeScalar = binary.BigEndian.Uint32(sysCfg.Scalar[24:28])
-		baseFeeScalar = binary.BigEndian.Uint32(sysCfg.Scalar[28:32])
+		return EcotoneScalars{
+			BlobBaseFeeScalar: binary.BigEndian.Uint32(scalar[24:28]),
+			BaseFeeScalar:     binary.BigEndian.Uint32(scalar[28:32]),
+		}, nil
 	default:
-		err = fmt.Errorf("unexpected system config scalar: %s", sysCfg.Scalar)
+		return EcotoneScalars{}, fmt.Errorf("unexpected system config scalar: %x", scalar)
 	}
+}
+
+// EncodeScalar encodes the EcotoneScalars into a 32-byte scalar value
+// for the Ecotone serialization format.
+func EncodeScalar(scalars EcotoneScalars) (scalar [32]byte) {
+	scalar[0] = L1ScalarEcotone
+	binary.BigEndian.PutUint32(scalar[24:28], scalars.BlobBaseFeeScalar)
+	binary.BigEndian.PutUint32(scalar[28:32], scalars.BaseFeeScalar)
 	return
 }
 
diff --git a/op-service/eth/types_test.go b/op-service/eth/types_test.go
index 16f98d7b9393..f62c14691a16 100644
--- a/op-service/eth/types_test.go
+++ b/op-service/eth/types_test.go
@@ -45,13 +45,24 @@ func TestEcotoneScalars(t *testing.T) {
 		tc := tc
 		t.Run(tc.name, func(t *testing.T) {
 			sysConfig := SystemConfig{Scalar: tc.val}
-			blobScalar, regScalar, err := sysConfig.EcotoneScalars()
+			scalars, err := sysConfig.EcotoneScalars()
 			if tc.fail {
 				require.NotNil(t, err)
 			} else {
-				require.Equal(t, tc.blobBaseFeeScalar, blobScalar)
-				require.Equal(t, tc.baseFeeScalar, regScalar)
+				require.Equal(t, tc.blobBaseFeeScalar, scalars.BlobBaseFeeScalar)
+				require.Equal(t, tc.baseFeeScalar, scalars.BaseFeeScalar)
+				require.NoError(t, err)
 			}
 		})
 	}
 }
+
+func FuzzEncodeScalar(f *testing.F) {
+	f.Fuzz(func(t *testing.T, blobBaseFeeScalar uint32, baseFeeScalar uint32) {
+		encoded := EncodeScalar(EcotoneScalars{BlobBaseFeeScalar: blobBaseFeeScalar, BaseFeeScalar: baseFeeScalar})
+		scalars, err := DecodeScalar(encoded)
+		require.NoError(t, err)
+		require.Equal(t, blobBaseFeeScalar, scalars.BlobBaseFeeScalar)
+		require.Equal(t, baseFeeScalar, scalars.BaseFeeScalar)
+	})
+}
diff --git a/op-service/flags/flags.go b/op-service/flags/flags.go
index 31ca3eb5bc6b..f607bbf73dd6 100644
--- a/op-service/flags/flags.go
+++ b/op-service/flags/flags.go
@@ -16,6 +16,7 @@ const (
 	CanyonOverrideFlagName  = "override.canyon"
 	DeltaOverrideFlagName   = "override.delta"
 	EcotoneOverrideFlagName = "override.ecotone"
+	FjordOverrideFlagName   = "override.fjord"
 )
 
 func CLIFlags(envPrefix string, category string) []cli.Flag {
@@ -41,6 +42,13 @@ func CLIFlags(envPrefix string, category string) []cli.Flag {
 			Hidden:   false,
 			Category: category,
 		},
+		&cli.Uint64Flag{
+			Name:     FjordOverrideFlagName,
+			Usage:    "Manually specify the Fjord fork timestamp, overriding the bundled setting",
+			EnvVars:  opservice.PrefixEnvVar(envPrefix, "OVERRIDE_FJORD"),
+			Hidden:   false,
+			Category: category,
+		},
 		CLINetworkFlag(envPrefix, category),
 		CLIRollupConfigFlag(envPrefix, category),
 	}
diff --git a/op-service/ioutil/atomic.go b/op-service/ioutil/atomic.go
index 2bf3ae88d0c2..7fc24d01900c 100644
--- a/op-service/ioutil/atomic.go
+++ b/op-service/ioutil/atomic.go
@@ -6,7 +6,7 @@ import (
 	"path/filepath"
 )
 
-type atomicWriter struct {
+type AtomicWriter struct {
 	dest string
 	temp string
 	out  io.WriteCloser
@@ -16,7 +16,7 @@ type atomicWriter struct {
 // The contents are initially written to a temporary file and only renamed into place when the writer is closed.
 // NOTE: It's vital to check if an error is returned from Close() as it may indicate the file could not be renamed
 // If path ends in .gz the contents written will be gzipped.
-func NewAtomicWriterCompressed(path string, perm os.FileMode) (io.WriteCloser, error) {
+func NewAtomicWriterCompressed(path string, perm os.FileMode) (*AtomicWriter, error) {
 	f, err := os.CreateTemp(filepath.Dir(path), filepath.Base(path))
 	if err != nil {
 		return nil, err
@@ -25,18 +25,26 @@ func NewAtomicWriterCompressed(path string, perm os.FileMode) (io.WriteCloser, e
 		_ = f.Close()
 		return nil, err
 	}
-	return &atomicWriter{
+	return &AtomicWriter{
 		dest: path,
 		temp: f.Name(),
 		out:  CompressByFileType(path, f),
 	}, nil
 }
 
-func (a *atomicWriter) Write(p []byte) (n int, err error) {
+func (a *AtomicWriter) Write(p []byte) (n int, err error) {
 	return a.out.Write(p)
 }
 
-func (a *atomicWriter) Close() error {
+// Abort releases any open resources and cleans up temporary files without renaming them into place.
+// Does nothing if the writer has already been closed.
+func (a *AtomicWriter) Abort() error {
+	// Attempt to clean up the temp file even if Close fails.
+	defer os.Remove(a.temp)
+	return a.out.Close()
+}
+
+func (a *AtomicWriter) Close() error {
 	// Attempt to clean up the temp file even if it can't be renamed into place.
 	defer os.Remove(a.temp)
 	if err := a.out.Close(); err != nil {
diff --git a/op-service/ioutil/atomic_test.go b/op-service/ioutil/atomic_test.go
index 291cbeb37730..46f2f19a5058 100644
--- a/op-service/ioutil/atomic_test.go
+++ b/op-service/ioutil/atomic_test.go
@@ -46,6 +46,30 @@ func TestAtomicWriter_MultipleClose(t *testing.T) {
 	require.ErrorIs(t, f.Close(), os.ErrClosed)
 }
 
+func TestAtomicWriter_AbortBeforeClose(t *testing.T) {
+	dir := t.TempDir()
+	target := filepath.Join(dir, "target.txt")
+	f, err := NewAtomicWriterCompressed(target, 0755)
+	require.NoError(t, err)
+
+	require.NoError(t, f.Abort())
+	_, err = os.Stat(target)
+	require.ErrorIs(t, err, os.ErrNotExist, "should not create target file when aborted")
+	require.ErrorIs(t, f.Close(), os.ErrClosed)
+}
+
+func TestAtomicWriter_AbortAfterClose(t *testing.T) {
+	dir := t.TempDir()
+	target := filepath.Join(dir, "target.txt")
+	f, err := NewAtomicWriterCompressed(target, 0755)
+	require.NoError(t, err)
+
+	require.NoError(t, f.Close())
+	_, err = os.Stat(target)
+	require.NoError(t, err)
+	require.ErrorIs(t, f.Abort(), os.ErrClosed)
+}
+
 func TestAtomicWriter_ApplyGzip(t *testing.T) {
 	tests := []struct {
 		name       string
diff --git a/op-service/ioutil/gzip.go b/op-service/ioutil/gzip.go
index 5af9b99d7841..52fbb10cc4c1 100644
--- a/op-service/ioutil/gzip.go
+++ b/op-service/ioutil/gzip.go
@@ -36,6 +36,18 @@ func OpenCompressed(file string, flag int, perm os.FileMode) (io.WriteCloser, er
 	return CompressByFileType(file, out), nil
 }
 
+// WriteCompressedBytes writes a byte slice to the specified file.
+// If the filename ends with .gz, a byte slice is compressed and written.
+func WriteCompressedBytes(file string, data []byte, flag int, perm os.FileMode) error {
+	out, err := OpenCompressed(file, flag, perm)
+	if err != nil {
+		return err
+	}
+	defer out.Close()
+	_, err = out.Write(data)
+	return err
+}
+
 // WriteCompressedJson writes the object to the specified file as a compressed json object
 // if the filename ends with .gz.
 func WriteCompressedJson(file string, obj any) error {
diff --git a/op-service/jsonutil/json.go b/op-service/jsonutil/json.go
index a7918d6d4a62..9dd5db448246 100644
--- a/op-service/jsonutil/json.go
+++ b/op-service/jsonutil/json.go
@@ -21,9 +21,14 @@ func LoadJSON[X any](inputPath string) (*X, error) {
 	}
 	defer f.Close()
 	var state X
-	if err := json.NewDecoder(f).Decode(&state); err != nil {
+	decoder := json.NewDecoder(f)
+	if err := decoder.Decode(&state); err != nil {
 		return nil, fmt.Errorf("failed to decode file %q: %w", inputPath, err)
 	}
+	// We are only expecting 1 JSON object - confirm there is no trailing data
+	if _, err := decoder.Token(); err != io.EOF {
+		return nil, fmt.Errorf("unexpected trailing data in file %q", inputPath)
+	}
 	return &state, nil
 }
 
diff --git a/op-service/jsonutil/json_test.go b/op-service/jsonutil/json_test.go
index 16eb91992f87..9a143d0c2579 100644
--- a/op-service/jsonutil/json_test.go
+++ b/op-service/jsonutil/json_test.go
@@ -2,6 +2,7 @@ package jsonutil
 
 import (
 	"encoding/json"
+	"fmt"
 	"os"
 	"path/filepath"
 	"testing"
@@ -47,7 +48,113 @@ func TestRoundTripJSONWithGzip(t *testing.T) {
 	require.EqualValues(t, data, result)
 }
 
+func TestLoadJSONWithExtraDataAppended(t *testing.T) {
+	data := &jsonTestData{A: "yay", B: 3}
+
+	cases := []struct {
+		name      string
+		extraData func() ([]byte, error)
+	}{
+		{
+			name: "duplicate json object",
+			extraData: func() ([]byte, error) {
+				return json.Marshal(data)
+			},
+		},
+		{
+			name: "duplicate comma-separated json object",
+			extraData: func() ([]byte, error) {
+				data, err := json.Marshal(data)
+				if err != nil {
+					return nil, err
+				}
+				return append([]byte(","), data...), nil
+			},
+		},
+		{
+			name: "additional characters",
+			extraData: func() ([]byte, error) {
+				return []byte("some text"), nil
+			},
+		},
+	}
+
+	for _, tc := range cases {
+		t.Run(tc.name, func(t *testing.T) {
+			dir := t.TempDir()
+			file := filepath.Join(dir, "test.json")
+			extraData, err := tc.extraData()
+			require.NoError(t, err)
+
+			// Write primary json payload + extra data to the file
+			err = WriteJSON(file, data, 0o755)
+			require.NoError(t, err)
+			err = appendDataToFile(file, extraData)
+			require.NoError(t, err)
+
+			var result *jsonTestData
+			result, err = LoadJSON[jsonTestData](file)
+			require.ErrorContains(t, err, fmt.Sprintf("unexpected trailing data in file %q", file))
+			require.Nil(t, result)
+		})
+	}
+}
+
+func TestLoadJSONWithTrailingWhitespace(t *testing.T) {
+	cases := []struct {
+		name      string
+		extraData []byte
+	}{
+		{
+			name:      "space",
+			extraData: []byte(" "),
+		},
+		{
+			name:      "tab",
+			extraData: []byte("\t"),
+		},
+		{
+			name:      "new line",
+			extraData: []byte("\n"),
+		},
+		{
+			name:      "multiple chars",
+			extraData: []byte(" \t\n"),
+		},
+	}
+
+	for _, tc := range cases {
+		t.Run(tc.name, func(t *testing.T) {
+			dir := t.TempDir()
+			file := filepath.Join(dir, "test.json")
+			data := &jsonTestData{A: "yay", B: 3}
+
+			// Write primary json payload + extra data to the file
+			err := WriteJSON(file, data, 0o755)
+			require.NoError(t, err)
+			err = appendDataToFile(file, tc.extraData)
+			require.NoError(t, err)
+
+			var result *jsonTestData
+			result, err = LoadJSON[jsonTestData](file)
+			require.NoError(t, err)
+			require.EqualValues(t, data, result)
+		})
+	}
+}
+
 type jsonTestData struct {
 	A string `json:"a"`
 	B int    `json:"b"`
 }
+
+func appendDataToFile(outputPath string, data []byte) error {
+	file, err := os.OpenFile(outputPath, os.O_APPEND|os.O_WRONLY, 0644)
+	if err != nil {
+		return err
+	}
+	defer file.Close()
+
+	_, err = file.Write(data)
+	return err
+}
diff --git a/op-service/log/cli.go b/op-service/log/cli.go
index 966f7ad7d8c7..afac61483391 100644
--- a/op-service/log/cli.go
+++ b/op-service/log/cli.go
@@ -128,6 +128,7 @@ func FormatHandler(ft FormatType, color bool) func(io.Writer) slog.Handler {
 	termColorHandler := func(w io.Writer) slog.Handler {
 		return log.NewTerminalHandler(w, color)
 	}
+	logfmtHandler := func(w io.Writer) slog.Handler { return log.LogfmtHandlerWithLevel(w, log.LevelTrace) }
 	switch ft {
 	case FormatJSON:
 		return log.JSONHandler
@@ -135,12 +136,12 @@ func FormatHandler(ft FormatType, color bool) func(io.Writer) slog.Handler {
 		if term.IsTerminal(int(os.Stdout.Fd())) {
 			return termColorHandler
 		} else {
-			return log.LogfmtHandler
+			return logfmtHandler
 		}
 	case FormatTerminal:
 		return termColorHandler
 	case FormatLogFmt:
-		return log.LogfmtHandler
+		return logfmtHandler
 	default:
 		panic(fmt.Errorf("failed to create slog.Handler factory for format-type=%q and color=%v", ft, color))
 	}
diff --git a/op-service/metrics/balance.go b/op-service/metrics/balance.go
index 8da012813268..27131fa5eef0 100644
--- a/op-service/metrics/balance.go
+++ b/op-service/metrics/balance.go
@@ -2,7 +2,6 @@ package metrics
 
 import (
 	"context"
-	"math/big"
 	"time"
 
 	"github.com/prometheus/client_golang/prometheus"
@@ -11,20 +10,11 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/ethclient"
 	"github.com/ethereum/go-ethereum/log"
-	"github.com/ethereum/go-ethereum/params"
 
 	"github.com/ethereum-optimism/optimism/op-service/clock"
+	"github.com/ethereum-optimism/optimism/op-service/eth"
 )
 
-// weiToEther divides the wei value by 10^18 to get a number in ether as a float64
-func weiToEther(wei *big.Int) float64 {
-	num := new(big.Rat).SetInt(wei)
-	denom := big.NewRat(params.Ether, 1)
-	num = num.Quo(num, denom)
-	f, _ := num.Float64()
-	return f
-}
-
 // LaunchBalanceMetrics starts a periodic query of the balance of the supplied account and records it
 // to the "balance" metric of the namespace. The balance of the account is recorded in Ether (not Wei).
 // Cancel the supplied context to shut down the go routine
@@ -42,7 +32,7 @@ func LaunchBalanceMetrics(log log.Logger, r *prometheus.Registry, ns string, cli
 			log.Warn("failed to get balance of account", "err", err, "address", account)
 			return
 		}
-		bal := weiToEther(bigBal)
+		bal := eth.WeiToEther(bigBal)
 		balanceGuage.Set(bal)
 	}, func() error {
 		log.Info("balance metrics shutting down")
diff --git a/op-service/metrics/doc/cmd.go b/op-service/metrics/doc/cmd.go
index f9b639a46c41..7074cdb848d9 100644
--- a/op-service/metrics/doc/cmd.go
+++ b/op-service/metrics/doc/cmd.go
@@ -46,7 +46,7 @@ func NewSubcommands(m Metrics) cli.Commands {
 				table.SetCenterSeparator("|")
 				table.SetAutoWrapText(false)
 				table.SetHeader([]string{"Metric", "Description", "Labels", "Type"})
-				var data [][]string
+				data := make([][]string, 0, len(supportedMetrics))
 				for _, metric := range supportedMetrics {
 					labels := strings.Join(metric.Labels, ",")
 					data = append(data, []string{metric.Name, metric.Help, labels, metric.Type})
diff --git a/op-service/metrics/rpc_metrics.go b/op-service/metrics/rpc_metrics.go
index b6bda30c8007..264869e10962 100644
--- a/op-service/metrics/rpc_metrics.go
+++ b/op-service/metrics/rpc_metrics.go
@@ -12,44 +12,54 @@ import (
 const (
 	RPCServerSubsystem = "rpc_server"
 	RPCClientSubsystem = "rpc_client"
+
+	BatchMethod = ""
 )
 
-type RPCMetricer interface {
-	RecordRPCServerRequest(method string) func()
+type RPCClientMetricer interface {
 	RecordRPCClientRequest(method string) func(err error)
 	RecordRPCClientResponse(method string, err error)
 }
 
-// RPCMetrics tracks all the RPC metrics for the op-service RPC.
-type RPCMetrics struct {
-	RPCServerRequestsTotal          *prometheus.CounterVec
-	RPCServerRequestDurationSeconds *prometheus.HistogramVec
+type RPCServerMetricer interface {
+	RecordRPCServerRequest(method string) func()
+}
+
+type RPCMetricer interface {
+	RPCClientMetricer
+	RPCServerMetricer
+}
+
+// RPCMetrics tracks client-only RPC metrics
+type RPCClientMetrics struct {
 	RPCClientRequestsTotal          *prometheus.CounterVec
 	RPCClientRequestDurationSeconds *prometheus.HistogramVec
 	RPCClientResponsesTotal         *prometheus.CounterVec
 }
 
-// MakeRPCMetrics creates a new RPCMetrics instance with the given process name, and
-// namespace for the service.
+// RPCMetrics tracks server-only RPC metrics
+type RPCServerMetrics struct {
+	RPCServerRequestsTotal          *prometheus.CounterVec
+	RPCServerRequestDurationSeconds *prometheus.HistogramVec
+}
+
+// RPCMetrics tracks all the RPC metrics, both client & server
+type RPCMetrics struct {
+	RPCClientMetrics
+	RPCServerMetrics
+}
+
+// MakeRPCMetrics creates a new RPCMetrics with the given namespace
 func MakeRPCMetrics(ns string, factory Factory) RPCMetrics {
 	return RPCMetrics{
-		RPCServerRequestsTotal: factory.NewCounterVec(prometheus.CounterOpts{
-			Namespace: ns,
-			Subsystem: RPCServerSubsystem,
-			Name:      "requests_total",
-			Help:      "Total requests to the RPC server",
-		}, []string{
-			"method",
-		}),
-		RPCServerRequestDurationSeconds: factory.NewHistogramVec(prometheus.HistogramOpts{
-			Namespace: ns,
-			Subsystem: RPCServerSubsystem,
-			Name:      "request_duration_seconds",
-			Buckets:   []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10},
-			Help:      "Histogram of RPC server request durations",
-		}, []string{
-			"method",
-		}),
+		RPCClientMetrics: MakeRPCClientMetrics(ns, factory),
+		RPCServerMetrics: MakeRPCServerMetrics(ns, factory),
+	}
+}
+
+// MakeRPCClientMetrics creates a new RPCServerMetrics instance with the given namespace
+func MakeRPCClientMetrics(ns string, factory Factory) RPCClientMetrics {
+	return RPCClientMetrics{
 		RPCClientRequestsTotal: factory.NewCounterVec(prometheus.CounterOpts{
 			Namespace: ns,
 			Subsystem: RPCClientSubsystem,
@@ -79,21 +89,10 @@ func MakeRPCMetrics(ns string, factory Factory) RPCMetrics {
 	}
 }
 
-// RecordRPCServerRequest is a helper method to record an incoming RPC
-// call to the opnode's RPC server. It bumps the requests metric,
-// and tracks how long it takes to serve a response.
-func (m *RPCMetrics) RecordRPCServerRequest(method string) func() {
-	m.RPCServerRequestsTotal.WithLabelValues(method).Inc()
-	timer := prometheus.NewTimer(m.RPCServerRequestDurationSeconds.WithLabelValues(method))
-	return func() {
-		timer.ObserveDuration()
-	}
-}
-
 // RecordRPCClientRequest is a helper method to record an RPC client
 // request. It bumps the requests metric, tracks the response
 // duration, and records the response's error code.
-func (m *RPCMetrics) RecordRPCClientRequest(method string) func(err error) {
+func (m *RPCClientMetrics) RecordRPCClientRequest(method string) func(err error) {
 	m.RPCClientRequestsTotal.WithLabelValues(method).Inc()
 	timer := prometheus.NewTimer(m.RPCClientRequestDurationSeconds.WithLabelValues(method))
 	return func(err error) {
@@ -108,7 +107,7 @@ func (m *RPCMetrics) RecordRPCClientRequest(method string) func(err error) {
 // into rpc_, HTTP errors are converted into
 // http_, and everything else is converted into
 // .
-func (m *RPCMetrics) RecordRPCClientResponse(method string, err error) {
+func (m *RPCClientMetrics) RecordRPCClientResponse(method string, err error) {
 	var errStr string
 	var rpcErr rpc.Error
 	var httpErr rpc.HTTPError
@@ -126,6 +125,40 @@ func (m *RPCMetrics) RecordRPCClientResponse(method string, err error) {
 	m.RPCClientResponsesTotal.WithLabelValues(method, errStr).Inc()
 }
 
+// MakeRPCServerMetrics creates a new RPCServerMetrics instance with the given namespace
+func MakeRPCServerMetrics(ns string, factory Factory) RPCServerMetrics {
+	return RPCServerMetrics{
+		RPCServerRequestsTotal: factory.NewCounterVec(prometheus.CounterOpts{
+			Namespace: ns,
+			Subsystem: RPCServerSubsystem,
+			Name:      "requests_total",
+			Help:      "Total requests to the RPC server",
+		}, []string{
+			"method",
+		}),
+		RPCServerRequestDurationSeconds: factory.NewHistogramVec(prometheus.HistogramOpts{
+			Namespace: ns,
+			Subsystem: RPCServerSubsystem,
+			Name:      "request_duration_seconds",
+			Buckets:   []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10},
+			Help:      "Histogram of RPC server request durations",
+		}, []string{
+			"method",
+		}),
+	}
+}
+
+// RecordRPCServerRequest is a helper method to record an incoming RPC
+// call to the opnode's RPC server. It bumps the requests metric,
+// and tracks how long it takes to serve a response.
+func (m *RPCServerMetrics) RecordRPCServerRequest(method string) func() {
+	m.RPCServerRequestsTotal.WithLabelValues(method).Inc()
+	timer := prometheus.NewTimer(m.RPCServerRequestDurationSeconds.WithLabelValues(method))
+	return func() {
+		timer.ObserveDuration()
+	}
+}
+
 type NoopRPCMetrics struct{}
 
 func (n *NoopRPCMetrics) RecordRPCServerRequest(method string) func() {
diff --git a/op-bindings/predeploys/addresses.go b/op-service/predeploys/addresses.go
similarity index 97%
rename from op-bindings/predeploys/addresses.go
rename to op-service/predeploys/addresses.go
index 6d1b75e3bf4c..045a50413bc9 100644
--- a/op-bindings/predeploys/addresses.go
+++ b/op-service/predeploys/addresses.go
@@ -8,7 +8,7 @@ import "github.com/ethereum/go-ethereum/common"
 const (
 	L2ToL1MessagePasser           = "0x4200000000000000000000000000000000000016"
 	DeployerWhitelist             = "0x4200000000000000000000000000000000000002"
-	WETH9                         = "0x4200000000000000000000000000000000000006"
+	WETH                          = "0x4200000000000000000000000000000000000006"
 	L2CrossDomainMessenger        = "0x4200000000000000000000000000000000000007"
 	L2StandardBridge              = "0x4200000000000000000000000000000000000010"
 	SequencerFeeVault             = "0x4200000000000000000000000000000000000011"
@@ -41,7 +41,7 @@ const (
 var (
 	L2ToL1MessagePasserAddr           = common.HexToAddress(L2ToL1MessagePasser)
 	DeployerWhitelistAddr             = common.HexToAddress(DeployerWhitelist)
-	WETH9Addr                         = common.HexToAddress(WETH9)
+	WETHAddr                          = common.HexToAddress(WETH)
 	L2CrossDomainMessengerAddr        = common.HexToAddress(L2CrossDomainMessenger)
 	L2StandardBridgeAddr              = common.HexToAddress(L2StandardBridge)
 	SequencerFeeVaultAddr             = common.HexToAddress(SequencerFeeVault)
@@ -77,7 +77,7 @@ var (
 func init() {
 	Predeploys["L2ToL1MessagePasser"] = &Predeploy{Address: L2ToL1MessagePasserAddr}
 	Predeploys["DeployerWhitelist"] = &Predeploy{Address: DeployerWhitelistAddr}
-	Predeploys["WETH9"] = &Predeploy{Address: WETH9Addr, ProxyDisabled: true}
+	Predeploys["WETH"] = &Predeploy{Address: WETHAddr, ProxyDisabled: true}
 	Predeploys["L2CrossDomainMessenger"] = &Predeploy{Address: L2CrossDomainMessengerAddr}
 	Predeploys["L2StandardBridge"] = &Predeploy{Address: L2StandardBridgeAddr}
 	Predeploys["SequencerFeeVault"] = &Predeploy{Address: SequencerFeeVaultAddr}
diff --git a/op-service/predeploys/addresses_test.go b/op-service/predeploys/addresses_test.go
new file mode 100644
index 000000000000..dfd820d5d143
--- /dev/null
+++ b/op-service/predeploys/addresses_test.go
@@ -0,0 +1,14 @@
+package predeploys
+
+import (
+	"testing"
+
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/stretchr/testify/require"
+)
+
+func TestGethAddresses(t *testing.T) {
+	// We test if the addresses in geth match those in op-bindings, to avoid an import-cycle:
+	// we import geth in the monorepo, and do not want to import op-bindings into geth.
+	require.Equal(t, L1BlockAddr, types.L1BlockAddr)
+}
diff --git a/op-bindings/predeploys/eip4788.go b/op-service/predeploys/eip4788.go
similarity index 100%
rename from op-bindings/predeploys/eip4788.go
rename to op-service/predeploys/eip4788.go
diff --git a/op-bindings/predeploys/legacy_addresses.go b/op-service/predeploys/legacy_addresses.go
similarity index 100%
rename from op-bindings/predeploys/legacy_addresses.go
rename to op-service/predeploys/legacy_addresses.go
diff --git a/op-bindings/predeploys/predeploy.go b/op-service/predeploys/predeploy.go
similarity index 100%
rename from op-bindings/predeploys/predeploy.go
rename to op-service/predeploys/predeploy.go
diff --git a/op-service/rethdb-reader/Cargo.lock b/op-service/rethdb-reader/Cargo.lock
index 9ad3a5ed6639..5b4c003d5b0c 100644
--- a/op-service/rethdb-reader/Cargo.lock
+++ b/op-service/rethdb-reader/Cargo.lock
@@ -1676,9 +1676,9 @@ dependencies = [
 
 [[package]]
 name = "h2"
-version = "0.3.24"
+version = "0.3.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9"
+checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
 dependencies = [
  "bytes",
  "fnv",
@@ -1815,7 +1815,7 @@ dependencies = [
  "httpdate",
  "itoa",
  "pin-project-lite",
- "socket2 0.5.6",
+ "socket2 0.4.10",
  "tokio",
  "tower-service",
  "tracing",
diff --git a/op-service/rethdb-reader/README.md b/op-service/rethdb-reader/README.md
index 30469a58b294..9f760f978015 100644
--- a/op-service/rethdb-reader/README.md
+++ b/op-service/rethdb-reader/README.md
@@ -68,16 +68,29 @@ typedef struct ReceiptsResult {
   bool error;
 } ReceiptsResult;
 
+/**
+ * A [OpenDBResult] is a wrapper of DB instance [BlockchainProvider]
+ * as well as an error status that is compatible with FFI.
+ *
+ * # Safety
+ * - When the `error` field is false, the `data` pointer is guaranteed to be valid.
+ * - When the `error` field is true, the `data` pointer is guaranteed to be null.
+ */
+typedef struct OpenDBResult {
+  const void *data;
+  bool error;
+} OpenDBResult;
+
 /**
  * Read the receipts for a blockhash from the RETH database directly.
  *
  * # Safety
- * - All possible nil pointer dereferences are checked, and the function will return a
- *   failing [ReceiptsResult] if any are found.
+ * - All possible nil pointer dereferences are checked, and the function will return a failing
+ *   [ReceiptsResult] if any are found.
  */
 struct ReceiptsResult rdb_read_receipts(const uint8_t *block_hash,
                                         uintptr_t block_hash_len,
-                                        const char *db_path);
+                                        const void *db_instance);
 
 /**
  * Free a string that was allocated in Rust and passed to C.
@@ -86,6 +99,15 @@ struct ReceiptsResult rdb_read_receipts(const uint8_t *block_hash,
  * - All possible nil pointer dereferences are checked.
  */
 void rdb_free_string(char *string);
+
+/**
+ * Open a DB instance and return.
+ *
+ * # Safety
+ * - All possible nil pointer dereferences are checked, and the function will return a failing
+ *   [OpenDBResult] if any are found.
+ */
+struct OpenDBResult open_db_read_only(const char *db_path);
 ```
 
 [rust-toolchain]: https://rustup.rs/
diff --git a/op-service/rethdb-reader/src/db.rs b/op-service/rethdb-reader/src/db.rs
new file mode 100644
index 000000000000..8d1840fbdea0
--- /dev/null
+++ b/op-service/rethdb-reader/src/db.rs
@@ -0,0 +1,59 @@
+use anyhow::{anyhow, Result};
+use reth_blockchain_tree::noop::NoopBlockchainTree;
+use reth_db::{mdbx::DatabaseArguments, open_db_read_only};
+use reth_primitives::MAINNET;
+use reth_provider::{providers::BlockchainProvider, ProviderFactory};
+use std::{
+    ffi::{c_char, c_void},
+    path::Path,
+};
+
+/// A [OpenDBResult] is a wrapper of DB instance [BlockchainProvider]
+/// as well as an error status that is compatible with FFI.
+///
+/// # Safety
+/// - When the `error` field is false, the `data` pointer is guaranteed to be valid.
+/// - When the `error` field is true, the `data` pointer is guaranteed to be null.
+#[repr(C)]
+pub struct OpenDBResult {
+    pub(crate) data: *const c_void,
+    pub(crate) error: bool,
+}
+
+impl OpenDBResult {
+    /// Constructs a successful [OpenDBResult] from a DB instance.
+    pub fn success(data: *const c_void) -> Self {
+        Self { data, error: false }
+    }
+
+    /// Constructs a failing [OpenDBResult] with a null pointer to the data.
+    pub fn fail() -> Self {
+        Self { data: std::ptr::null_mut(), error: true }
+    }
+}
+
+/// Open and return a DB instance.
+///
+/// # Safety
+/// - All possible nil pointer dereferences are checked, and the function will return a failing
+///   [OpenDBResult] if any are found.
+#[inline(always)]
+pub(crate) unsafe fn open_db_read_only_inner(db_path: *const c_char) -> Result {
+    // Convert the *const c_char to a Rust &str
+    let db_path_str = {
+        if db_path.is_null() {
+            anyhow::bail!("db path pointer is null");
+        }
+        std::ffi::CStr::from_ptr(db_path)
+    }
+    .to_str()?;
+
+    let db = open_db_read_only(Path::new(db_path_str), DatabaseArguments::default())
+        .map_err(|e| anyhow!(e))?;
+    let factory = ProviderFactory::new(db, MAINNET.clone());
+
+    // Create a read-only BlockChainProvider
+    let provider = Box::new(BlockchainProvider::new(factory, NoopBlockchainTree::default())?);
+    let res = OpenDBResult::success(Box::into_raw(provider) as *const c_void);
+    Ok(res)
+}
diff --git a/op-service/rethdb-reader/src/lib.rs b/op-service/rethdb-reader/src/lib.rs
index 46f545ed7397..4aa785608081 100644
--- a/op-service/rethdb-reader/src/lib.rs
+++ b/op-service/rethdb-reader/src/lib.rs
@@ -1,8 +1,12 @@
 #![doc = include_str!("../README.md")]
 
+use db::{open_db_read_only_inner, OpenDBResult};
 use receipts::{read_receipts_inner, ReceiptsResult};
+use std::ffi::c_void;
+
 use std::os::raw::c_char;
 
+mod db;
 mod receipts;
 
 /// Read the receipts for a blockhash from the RETH database directly.
@@ -14,9 +18,9 @@ mod receipts;
 pub unsafe extern "C" fn rdb_read_receipts(
     block_hash: *const u8,
     block_hash_len: usize,
-    db_path: *const c_char,
+    db_instance: *const c_void,
 ) -> ReceiptsResult {
-    read_receipts_inner(block_hash, block_hash_len, db_path).unwrap_or(ReceiptsResult::fail())
+    read_receipts_inner(block_hash, block_hash_len, db_instance).unwrap_or(ReceiptsResult::fail())
 }
 
 /// Free a string that was allocated in Rust and passed to C.
@@ -31,3 +35,13 @@ pub unsafe extern "C" fn rdb_free_string(string: *mut c_char) {
         let _ = std::ffi::CString::from_raw(string);
     }
 }
+
+/// Open a DB instance and return.
+///
+/// # Safety
+/// - All possible nil pointer dereferences are checked, and the function will return a failing
+///   [OpenDBResult] if any are found.
+#[no_mangle]
+pub unsafe extern "C" fn open_db_read_only(db_path: *const c_char) -> OpenDBResult {
+    open_db_read_only_inner(db_path).unwrap_or(OpenDBResult::fail())
+}
diff --git a/op-service/rethdb-reader/src/receipts.rs b/op-service/rethdb-reader/src/receipts.rs
index 3e10900ef6e5..0dea66689b5f 100644
--- a/op-service/rethdb-reader/src/receipts.rs
+++ b/op-service/rethdb-reader/src/receipts.rs
@@ -3,14 +3,14 @@
 
 use anyhow::{anyhow, Result};
 use reth_blockchain_tree::noop::NoopBlockchainTree;
-use reth_db::{mdbx::DatabaseArguments, open_db_read_only};
+use reth_db::DatabaseEnv;
 use reth_primitives::{
-    BlockHashOrNumber, Receipt, TransactionKind, TransactionMeta, TransactionSigned, MAINNET, U128,
-    U256, U64,
+    BlockHashOrNumber, Receipt, TransactionKind, TransactionMeta, TransactionSigned, U128, U256,
+    U64,
 };
-use reth_provider::{providers::BlockchainProvider, BlockReader, ProviderFactory, ReceiptProvider};
+use reth_provider::{providers::BlockchainProvider, BlockReader, ReceiptProvider};
 use reth_rpc_types::{Log, TransactionReceipt};
-use std::{ffi::c_char, path::Path};
+use std::ffi::c_void;
 
 /// A [ReceiptsResult] is a wrapper around a JSON string containing serialized [TransactionReceipt]s
 /// as well as an error status that is compatible with FFI.
@@ -46,7 +46,7 @@ impl ReceiptsResult {
 pub(crate) unsafe fn read_receipts_inner(
     block_hash: *const u8,
     block_hash_len: usize,
-    db_path: *const c_char,
+    db_instance: *const c_void,
 ) -> Result {
     // Convert the raw pointer and length back to a Rust slice
     let block_hash: [u8; 32] = {
@@ -57,22 +57,8 @@ pub(crate) unsafe fn read_receipts_inner(
     }
     .try_into()?;
 
-    // Convert the *const c_char to a Rust &str
-    let db_path_str = {
-        if db_path.is_null() {
-            anyhow::bail!("db path pointer is null");
-        }
-        std::ffi::CStr::from_ptr(db_path)
-    }
-    .to_str()?;
-
-    let db = open_db_read_only(Path::new(db_path_str), DatabaseArguments::default())
-        .map_err(|e| anyhow!(e))?;
-    let factory = ProviderFactory::new(db, MAINNET.clone());
-
     // Create a read-only BlockChainProvider
-    let provider = BlockchainProvider::new(factory, NoopBlockchainTree::default())?;
-
+    let provider = &*(db_instance as *const BlockchainProvider);
     // Fetch the block and the receipts within it
     let block =
         provider.block_by_hash(block_hash.into())?.ok_or(anyhow!("Failed to fetch block"))?;
@@ -206,11 +192,15 @@ mod test {
     use reth_db::{database::Database, mdbx::DatabaseArguments};
     use reth_primitives::{
         address, b256, bloom, hex, Address, Block, Bytes, ReceiptWithBloom, Receipts,
-        SealedBlockWithSenders, U8,
+        SealedBlockWithSenders, MAINNET, U8,
     };
     use reth_provider::{BlockWriter, BundleStateWithReceipts, DatabaseProvider};
     use reth_revm::revm::db::BundleState;
-    use std::{ffi::CString, fs::File, path::Path};
+    use std::{
+        ffi::{c_char, CString},
+        fs::File,
+        path::Path,
+    };
 
     #[inline]
     fn dummy_block_with_receipts() -> Result<(Block, Vec)> {
@@ -284,16 +274,16 @@ mod test {
     #[test]
     fn fetch_receipts() {
         open_receipts_testdata_db().unwrap();
-
         unsafe {
+            let res = crate::open_db_read_only(
+                CString::new("testdata/db").unwrap().into_raw() as *const c_char
+            );
+            assert_eq!(res.error, false);
+
             let mut block_hash =
                 b256!("6a229123d607c2232a8b0bdd36f90745945d05181018e64e60ff2b93ab6b52e5");
-            let receipts_res = super::read_receipts_inner(
-                block_hash.as_mut_ptr(),
-                32,
-                CString::new("testdata/db").unwrap().into_raw() as *const c_char,
-            )
-            .unwrap();
+            let receipts_res =
+                super::read_receipts_inner(block_hash.as_mut_ptr(), 32, res.data).unwrap();
 
             let receipts_data =
                 std::slice::from_raw_parts(receipts_res.data as *const u8, receipts_res.data_len);
diff --git a/op-service/sources/batching/bound.go b/op-service/sources/batching/bound.go
index a6b7e3385f8d..33e19c3dfbfa 100644
--- a/op-service/sources/batching/bound.go
+++ b/op-service/sources/batching/bound.go
@@ -6,11 +6,14 @@ import (
 
 	"github.com/ethereum/go-ethereum/accounts/abi"
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
 )
 
 var (
 	ErrUnknownMethod = errors.New("unknown method")
 	ErrInvalidCall   = errors.New("invalid call")
+	ErrUnknownEvent  = errors.New("unknown event")
+	ErrInvalidEvent  = errors.New("invalid event")
 )
 
 type BoundContract struct {
@@ -48,3 +51,40 @@ func (b *BoundContract) DecodeCall(data []byte) (string, *CallResult, error) {
 	}
 	return method.Name, &CallResult{args}, nil
 }
+
+func (b *BoundContract) DecodeEvent(log *types.Log) (string, *CallResult, error) {
+	if len(log.Topics) == 0 {
+		return "", nil, ErrUnknownEvent
+	}
+	event, err := b.abi.EventByID(log.Topics[0])
+	if err != nil {
+		return "", nil, fmt.Errorf("%w: %v", ErrUnknownEvent, err.Error())
+	}
+
+	argsMap := make(map[string]interface{})
+	var indexed abi.Arguments
+	for _, arg := range event.Inputs {
+		if arg.Indexed {
+			indexed = append(indexed, arg)
+		}
+	}
+	if err := abi.ParseTopicsIntoMap(argsMap, indexed, log.Topics[1:]); err != nil {
+		return "", nil, fmt.Errorf("%w indexed topics: %v", ErrInvalidEvent, err.Error())
+	}
+
+	nonIndexed := event.Inputs.NonIndexed()
+	if len(nonIndexed) > 0 {
+		if err := nonIndexed.UnpackIntoMap(argsMap, log.Data); err != nil {
+			return "", nil, fmt.Errorf("%w non-indexed topics: %v", ErrInvalidEvent, err.Error())
+		}
+	}
+	args := make([]interface{}, 0, len(event.Inputs))
+	for _, input := range event.Inputs {
+		val, ok := argsMap[input.Name]
+		if !ok {
+			return "", nil, fmt.Errorf("%w missing argument: %v", ErrUnknownEvent, input.Name)
+		}
+		args = append(args, val)
+	}
+	return event.Name, &CallResult{args}, nil
+}
diff --git a/op-service/sources/batching/bound_test.go b/op-service/sources/batching/bound_test.go
index b5672897a575..201fa2bdf48d 100644
--- a/op-service/sources/batching/bound_test.go
+++ b/op-service/sources/batching/bound_test.go
@@ -4,8 +4,9 @@ import (
 	"math/big"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/test"
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/stretchr/testify/require"
 )
 
@@ -13,7 +14,7 @@ func TestDecodeCall(t *testing.T) {
 	method := "approve"
 	spender := common.Address{0xbb, 0xee}
 	amount := big.NewInt(4242)
-	testAbi, err := bindings.ERC20MetaData.GetAbi()
+	testAbi, err := test.ERC20MetaData.GetAbi()
 	require.NoError(t, err)
 	validData, err := testAbi.Pack(method, spender, amount)
 	require.NoError(t, err)
@@ -51,3 +52,87 @@ func TestDecodeCall(t *testing.T) {
 		require.Zero(t, amount.Cmp(args.GetBigInt(1)))
 	})
 }
+
+func TestDecodeEvent(t *testing.T) {
+	testAbi, err := test.ERC20MetaData.GetAbi()
+	require.NoError(t, err)
+
+	// event Transfer(address indexed from, address indexed to, uint256 amount);
+	event := testAbi.Events["Transfer"]
+
+	contract := NewBoundContract(testAbi, common.Address{0xaa})
+	t.Run("NoTopics", func(t *testing.T) {
+		log := &types.Log{}
+		_, _, err := contract.DecodeEvent(log)
+		require.ErrorIs(t, err, ErrUnknownEvent)
+	})
+
+	t.Run("UnknownEvent", func(t *testing.T) {
+		log := &types.Log{
+			Topics: []common.Hash{{0xaa}},
+		}
+		_, _, err := contract.DecodeEvent(log)
+		require.ErrorIs(t, err, ErrUnknownEvent)
+	})
+
+	t.Run("InvalidTopics", func(t *testing.T) {
+		amount := big.NewInt(828274)
+		data, err := event.Inputs.NonIndexed().Pack(amount)
+		require.NoError(t, err)
+		log := &types.Log{
+			Topics: []common.Hash{
+				event.ID,
+				common.BytesToHash(common.Address{0xaa}.Bytes()),
+				// Missing topic for to indexed value
+			},
+			Data: data,
+		}
+		_, _, err = contract.DecodeEvent(log)
+		require.ErrorIs(t, err, ErrInvalidEvent)
+	})
+
+	t.Run("MissingData", func(t *testing.T) {
+		log := &types.Log{
+			Topics: []common.Hash{
+				event.ID,
+				common.BytesToHash(common.Address{0xaa}.Bytes()),
+				common.BytesToHash(common.Address{0xbb}.Bytes()),
+			},
+		}
+		_, _, err := contract.DecodeEvent(log)
+		require.ErrorIs(t, err, ErrInvalidEvent)
+	})
+
+	t.Run("InvalidData", func(t *testing.T) {
+		log := &types.Log{
+			Topics: []common.Hash{
+				event.ID,
+				common.BytesToHash(common.Address{0xaa}.Bytes()),
+				common.BytesToHash(common.Address{0xbb}.Bytes()),
+			},
+			Data: []byte{0xbb, 0xcc},
+		}
+		_, _, err := contract.DecodeEvent(log)
+		require.ErrorIs(t, err, ErrInvalidEvent)
+	})
+
+	t.Run("ValidEvent", func(t *testing.T) {
+		amount := big.NewInt(828274)
+		data, err := event.Inputs.NonIndexed().Pack(amount)
+		require.NoError(t, err)
+		log := &types.Log{
+			Topics: []common.Hash{
+				event.ID,
+				common.BytesToHash(common.Address{0xaa}.Bytes()),
+				common.BytesToHash(common.Address{0xbb}.Bytes()),
+			},
+			Data: data,
+		}
+		name, result, err := contract.DecodeEvent(log)
+		require.NoError(t, err)
+		require.Equal(t, name, event.Name)
+		require.Equal(t, common.Address{0xaa}, result.GetAddress(0))
+		require.Equal(t, common.Address{0xbb}, result.GetAddress(1))
+		require.Zerof(t, amount.Cmp(result.GetBigInt(2)), "expected %v but got %v", amount, result.GetBigInt(2))
+	})
+}
diff --git a/op-service/sources/batching/call.go b/op-service/sources/batching/call.go
index d84932fac6ee..db4563b64258 100644
--- a/op-service/sources/batching/call.go
+++ b/op-service/sources/batching/call.go
@@ -63,3 +63,7 @@ func (c *CallResult) GetBytes32(i int) [32]byte {
 func (c *CallResult) GetBytes32Slice(i int) [][32]byte {
 	return *abi.ConvertType(c.out[i], new([][32]byte)).(*[][32]byte)
 }
+
+func (c *CallResult) GetString(i int) string {
+	return *abi.ConvertType(c.out[i], new(string)).(*string)
+}
diff --git a/op-service/sources/batching/contract_call_test.go b/op-service/sources/batching/contract_call_test.go
index 854161c5cbda..c4444cded9d4 100644
--- a/op-service/sources/batching/contract_call_test.go
+++ b/op-service/sources/batching/contract_call_test.go
@@ -4,7 +4,7 @@ import (
 	"math/big"
 	"testing"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
+	"github.com/ethereum-optimism/optimism/op-service/sources/batching/test"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/stretchr/testify/require"
@@ -12,7 +12,7 @@ import (
 
 func TestContractCall_ToCallArgs(t *testing.T) {
 	addr := common.Address{0xbd}
-	testAbi, err := bindings.ERC20MetaData.GetAbi()
+	testAbi, err := test.ERC20MetaData.GetAbi()
 	require.NoError(t, err)
 	call := NewContractCall(testAbi, addr, "approve", common.Address{0xcc}, big.NewInt(1234444))
 	call.From = common.Address{0xab}
@@ -33,7 +33,7 @@ func TestContractCall_ToCallArgs(t *testing.T) {
 
 func TestContractCall_ToTxCandidate(t *testing.T) {
 	addr := common.Address{0xbd}
-	testAbi, err := bindings.ERC20MetaData.GetAbi()
+	testAbi, err := test.ERC20MetaData.GetAbi()
 	require.NoError(t, err)
 	call := NewContractCall(testAbi, addr, "approve", common.Address{0xcc}, big.NewInt(1234444))
 	candidate, err := call.ToTxCandidate()
@@ -49,7 +49,7 @@ func TestContractCall_ToTxCandidate(t *testing.T) {
 
 func TestContractCall_Pack(t *testing.T) {
 	addr := common.Address{0xbd}
-	testAbi, err := bindings.ERC20MetaData.GetAbi()
+	testAbi, err := test.ERC20MetaData.GetAbi()
 	require.NoError(t, err)
 	sender := common.Address{0xcc}
 	amount := big.NewInt(1234444)
@@ -64,7 +64,7 @@ func TestContractCall_Pack(t *testing.T) {
 
 func TestContractCall_PackInvalid(t *testing.T) {
 	addr := common.Address{0xbd}
-	testAbi, err := bindings.ERC20MetaData.GetAbi()
+	testAbi, err := test.ERC20MetaData.GetAbi()
 	require.NoError(t, err)
 	// Second arg should be a *big.Int so packing should fail
 	call := NewContractCall(testAbi, addr, "approve", common.Address{0xcc}, uint32(123))
@@ -74,7 +74,7 @@ func TestContractCall_PackInvalid(t *testing.T) {
 
 func TestContractCall_Unpack(t *testing.T) {
 	addr := common.Address{0xbd}
-	testAbi, err := bindings.ERC20MetaData.GetAbi()
+	testAbi, err := test.ERC20MetaData.GetAbi()
 	require.NoError(t, err)
 	call := NewContractCall(testAbi, addr, "balanceOf", common.Address{0xcc})
 	outputs := testAbi.Methods["balanceOf"].Outputs
@@ -89,7 +89,7 @@ func TestContractCall_Unpack(t *testing.T) {
 
 func TestContractCall_UnpackInvalid(t *testing.T) {
 	addr := common.Address{0xbd}
-	testAbi, err := bindings.ERC20MetaData.GetAbi()
+	testAbi, err := test.ERC20MetaData.GetAbi()
 	require.NoError(t, err)
 	call := NewContractCall(testAbi, addr, "balanceOf", common.Address{0xcc})
 
diff --git a/op-service/sources/batching/test/abi_stub.go b/op-service/sources/batching/test/abi_stub.go
index f4a70b907a96..3c834896a800 100644
--- a/op-service/sources/batching/test/abi_stub.go
+++ b/op-service/sources/batching/test/abi_stub.go
@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"slices"
 	"testing"
 
 	"github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock"
@@ -13,7 +14,6 @@ import (
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 )
 
 type expectedCall struct {
@@ -23,6 +23,7 @@ type expectedCall struct {
 	args       []interface{}
 	packedArgs []byte
 	outputs    []interface{}
+	err        error
 }
 
 func (c *expectedCall) Matches(rpcMethod string, args ...interface{}) error {
@@ -66,7 +67,7 @@ func (c *expectedCall) Matches(rpcMethod string, args ...interface{}) error {
 	return nil
 }
 
-func (c *expectedCall) Execute(t *testing.T, out interface{}) {
+func (c *expectedCall) Execute(t *testing.T, out interface{}) error {
 	output, err := c.abiMethod.Outputs.Pack(c.outputs...)
 	require.NoErrorf(t, err, "Invalid outputs for method %v: %v", c.abiMethod.Name, c.outputs)
 
@@ -75,6 +76,7 @@ func (c *expectedCall) Execute(t *testing.T, out interface{}) {
 	j, err := json.Marshal(hexutil.Bytes(output))
 	require.NoError(t, err)
 	require.NoError(t, json.Unmarshal(j, out))
+	return c.err
 }
 
 func (c *expectedCall) String() string {
@@ -107,6 +109,24 @@ func (l *AbiBasedRpc) abi(to common.Address) *abi.ABI {
 	return abi
 }
 
+func (l *AbiBasedRpc) SetError(to common.Address, method string, block rpcblock.Block, expected []interface{}, callErr error) {
+	if expected == nil {
+		expected = []interface{}{}
+	}
+	abiMethod, ok := l.abi(to).Methods[method]
+	require.Truef(l.t, ok, "No method: %v", method)
+	packedArgs, err := abiMethod.Inputs.Pack(expected...)
+	require.NoErrorf(l.t, err, "Invalid expected arguments for method %v: %v", method, expected)
+	l.AddExpectedCall(&expectedCall{
+		abiMethod:  abiMethod,
+		to:         to,
+		block:      block,
+		args:       expected,
+		packedArgs: packedArgs,
+		outputs:    []interface{}{},
+		err:        callErr,
+	})
+}
 func (l *AbiBasedRpc) SetResponse(to common.Address, method string, block rpcblock.Block, expected []interface{}, output []interface{}) {
 	if expected == nil {
 		expected = []interface{}{}
diff --git a/op-service/sources/batching/test/erc20.go b/op-service/sources/batching/test/erc20.go
new file mode 100644
index 000000000000..5dcde4641857
--- /dev/null
+++ b/op-service/sources/batching/test/erc20.go
@@ -0,0 +1,820 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package test
+
+import (
+	"errors"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+)
+
+// ERC20MetaData contains all meta data concerning the ERC20 contract.
+var ERC20MetaData = &bind.MetaData{
+	ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+}
+
+// ERC20ABI is the input ABI used to generate the binding from.
+// Deprecated: Use ERC20MetaData.ABI instead.
+var ERC20ABI = ERC20MetaData.ABI
+
+// ERC20 is an auto generated Go binding around an Ethereum contract.
+type ERC20 struct {
+	ERC20Caller     // Read-only binding to the contract
+	ERC20Transactor // Write-only binding to the contract
+	ERC20Filterer   // Log filterer for contract events
+}
+
+// ERC20Caller is an auto generated read-only Go binding around an Ethereum contract.
+type ERC20Caller struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ERC20Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type ERC20Transactor struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ERC20Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type ERC20Filterer struct {
+	contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ERC20Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type ERC20Session struct {
+	Contract     *ERC20            // Generic contract binding to set the session for
+	CallOpts     bind.CallOpts     // Call options to use throughout this session
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ERC20CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type ERC20CallerSession struct {
+	Contract *ERC20Caller  // Generic contract caller binding to set the session for
+	CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// ERC20TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type ERC20TransactorSession struct {
+	Contract     *ERC20Transactor  // Generic contract transactor binding to set the session for
+	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ERC20Raw is an auto generated low-level Go binding around an Ethereum contract.
+type ERC20Raw struct {
+	Contract *ERC20 // Generic contract binding to access the raw methods on
+}
+
+// ERC20CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type ERC20CallerRaw struct {
+	Contract *ERC20Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// ERC20TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type ERC20TransactorRaw struct {
+	Contract *ERC20Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewERC20 creates a new instance of ERC20, bound to a specific deployed contract.
+func NewERC20(address common.Address, backend bind.ContractBackend) (*ERC20, error) {
+	contract, err := bindERC20(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &ERC20{ERC20Caller: ERC20Caller{contract: contract}, ERC20Transactor: ERC20Transactor{contract: contract}, ERC20Filterer: ERC20Filterer{contract: contract}}, nil
+}
+
+// NewERC20Caller creates a new read-only instance of ERC20, bound to a specific deployed contract.
+func NewERC20Caller(address common.Address, caller bind.ContractCaller) (*ERC20Caller, error) {
+	contract, err := bindERC20(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &ERC20Caller{contract: contract}, nil
+}
+
+// NewERC20Transactor creates a new write-only instance of ERC20, bound to a specific deployed contract.
+func NewERC20Transactor(address common.Address, transactor bind.ContractTransactor) (*ERC20Transactor, error) {
+	contract, err := bindERC20(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &ERC20Transactor{contract: contract}, nil
+}
+
+// NewERC20Filterer creates a new log filterer instance of ERC20, bound to a specific deployed contract.
+func NewERC20Filterer(address common.Address, filterer bind.ContractFilterer) (*ERC20Filterer, error) {
+	contract, err := bindERC20(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &ERC20Filterer{contract: contract}, nil
+}
+
+// bindERC20 binds a generic wrapper to an already deployed contract.
+func bindERC20(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := abi.JSON(strings.NewReader(ERC20ABI))
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ERC20 *ERC20Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _ERC20.Contract.ERC20Caller.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ERC20 *ERC20Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _ERC20.Contract.ERC20Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ERC20 *ERC20Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _ERC20.Contract.ERC20Transactor.contract.Transact(opts, method, params...)
+}
+
+// Call invokes the (constant) contract method with params as input values and
+// sets the output to result. The result type might be a single field for simple
+// returns, a slice of interfaces for anonymous returns and a struct for named
+// returns.
+func (_ERC20 *ERC20CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _ERC20.Contract.contract.Call(opts, result, method, params...)
+}
+
+// Transfer initiates a plain transaction to move funds to the contract, calling
+// its default method if one is available.
+func (_ERC20 *ERC20TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _ERC20.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ERC20 *ERC20TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _ERC20.Contract.contract.Transact(opts, method, params...)
+}
+
+// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
+//
+// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32)
+func (_ERC20 *ERC20Caller) DOMAINSEPARATOR(opts *bind.CallOpts) ([32]byte, error) {
+	var out []interface{}
+	err := _ERC20.contract.Call(opts, &out, "DOMAIN_SEPARATOR")
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
+//
+// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32)
+func (_ERC20 *ERC20Session) DOMAINSEPARATOR() ([32]byte, error) {
+	return _ERC20.Contract.DOMAINSEPARATOR(&_ERC20.CallOpts)
+}
+
+// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
+//
+// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32)
+func (_ERC20 *ERC20CallerSession) DOMAINSEPARATOR() ([32]byte, error) {
+	return _ERC20.Contract.DOMAINSEPARATOR(&_ERC20.CallOpts)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(address , address ) view returns(uint256)
+func (_ERC20 *ERC20Caller) Allowance(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _ERC20.contract.Call(opts, &out, "allowance", arg0, arg1)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(address , address ) view returns(uint256)
+func (_ERC20 *ERC20Session) Allowance(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.Allowance(&_ERC20.CallOpts, arg0, arg1)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(address , address ) view returns(uint256)
+func (_ERC20 *ERC20CallerSession) Allowance(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.Allowance(&_ERC20.CallOpts, arg0, arg1)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(address ) view returns(uint256)
+func (_ERC20 *ERC20Caller) BalanceOf(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _ERC20.contract.Call(opts, &out, "balanceOf", arg0)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(address ) view returns(uint256)
+func (_ERC20 *ERC20Session) BalanceOf(arg0 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.BalanceOf(&_ERC20.CallOpts, arg0)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(address ) view returns(uint256)
+func (_ERC20 *ERC20CallerSession) BalanceOf(arg0 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.BalanceOf(&_ERC20.CallOpts, arg0)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() view returns(uint8)
+func (_ERC20 *ERC20Caller) Decimals(opts *bind.CallOpts) (uint8, error) {
+	var out []interface{}
+	err := _ERC20.contract.Call(opts, &out, "decimals")
+
+	if err != nil {
+		return *new(uint8), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
+
+	return out0, err
+
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() view returns(uint8)
+func (_ERC20 *ERC20Session) Decimals() (uint8, error) {
+	return _ERC20.Contract.Decimals(&_ERC20.CallOpts)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() view returns(uint8)
+func (_ERC20 *ERC20CallerSession) Decimals() (uint8, error) {
+	return _ERC20.Contract.Decimals(&_ERC20.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() view returns(string)
+func (_ERC20 *ERC20Caller) Name(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _ERC20.contract.Call(opts, &out, "name")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() view returns(string)
+func (_ERC20 *ERC20Session) Name() (string, error) {
+	return _ERC20.Contract.Name(&_ERC20.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() view returns(string)
+func (_ERC20 *ERC20CallerSession) Name() (string, error) {
+	return _ERC20.Contract.Name(&_ERC20.CallOpts)
+}
+
+// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
+//
+// Solidity: function nonces(address ) view returns(uint256)
+func (_ERC20 *ERC20Caller) Nonces(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
+	var out []interface{}
+	err := _ERC20.contract.Call(opts, &out, "nonces", arg0)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
+//
+// Solidity: function nonces(address ) view returns(uint256)
+func (_ERC20 *ERC20Session) Nonces(arg0 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.Nonces(&_ERC20.CallOpts, arg0)
+}
+
+// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
+//
+// Solidity: function nonces(address ) view returns(uint256)
+func (_ERC20 *ERC20CallerSession) Nonces(arg0 common.Address) (*big.Int, error) {
+	return _ERC20.Contract.Nonces(&_ERC20.CallOpts, arg0)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() view returns(string)
+func (_ERC20 *ERC20Caller) Symbol(opts *bind.CallOpts) (string, error) {
+	var out []interface{}
+	err := _ERC20.contract.Call(opts, &out, "symbol")
+
+	if err != nil {
+		return *new(string), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+	return out0, err
+
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() view returns(string)
+func (_ERC20 *ERC20Session) Symbol() (string, error) {
+	return _ERC20.Contract.Symbol(&_ERC20.CallOpts)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() view returns(string)
+func (_ERC20 *ERC20CallerSession) Symbol() (string, error) {
+	return _ERC20.Contract.Symbol(&_ERC20.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() view returns(uint256)
+func (_ERC20 *ERC20Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _ERC20.contract.Call(opts, &out, "totalSupply")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() view returns(uint256)
+func (_ERC20 *ERC20Session) TotalSupply() (*big.Int, error) {
+	return _ERC20.Contract.TotalSupply(&_ERC20.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() view returns(uint256)
+func (_ERC20 *ERC20CallerSession) TotalSupply() (*big.Int, error) {
+	return _ERC20.Contract.TotalSupply(&_ERC20.CallOpts)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(address spender, uint256 amount) returns(bool)
+func (_ERC20 *ERC20Transactor) Approve(opts *bind.TransactOpts, spender common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _ERC20.contract.Transact(opts, "approve", spender, amount)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(address spender, uint256 amount) returns(bool)
+func (_ERC20 *ERC20Session) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _ERC20.Contract.Approve(&_ERC20.TransactOpts, spender, amount)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(address spender, uint256 amount) returns(bool)
+func (_ERC20 *ERC20TransactorSession) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _ERC20.Contract.Approve(&_ERC20.TransactOpts, spender, amount)
+}
+
+// Permit is a paid mutator transaction binding the contract method 0xd505accf.
+//
+// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
+func (_ERC20 *ERC20Transactor) Permit(opts *bind.TransactOpts, owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
+	return _ERC20.contract.Transact(opts, "permit", owner, spender, value, deadline, v, r, s)
+}
+
+// Permit is a paid mutator transaction binding the contract method 0xd505accf.
+//
+// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
+func (_ERC20 *ERC20Session) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
+	return _ERC20.Contract.Permit(&_ERC20.TransactOpts, owner, spender, value, deadline, v, r, s)
+}
+
+// Permit is a paid mutator transaction binding the contract method 0xd505accf.
+//
+// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
+func (_ERC20 *ERC20TransactorSession) Permit(owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
+	return _ERC20.Contract.Permit(&_ERC20.TransactOpts, owner, spender, value, deadline, v, r, s)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(address to, uint256 amount) returns(bool)
+func (_ERC20 *ERC20Transactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _ERC20.contract.Transact(opts, "transfer", to, amount)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(address to, uint256 amount) returns(bool)
+func (_ERC20 *ERC20Session) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _ERC20.Contract.Transfer(&_ERC20.TransactOpts, to, amount)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(address to, uint256 amount) returns(bool)
+func (_ERC20 *ERC20TransactorSession) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _ERC20.Contract.Transfer(&_ERC20.TransactOpts, to, amount)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
+func (_ERC20 *ERC20Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _ERC20.contract.Transact(opts, "transferFrom", from, to, amount)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
+func (_ERC20 *ERC20Session) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _ERC20.Contract.TransferFrom(&_ERC20.TransactOpts, from, to, amount)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
+func (_ERC20 *ERC20TransactorSession) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
+	return _ERC20.Contract.TransferFrom(&_ERC20.TransactOpts, from, to, amount)
+}
+
+// ERC20ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the ERC20 contract.
+type ERC20ApprovalIterator struct {
+	Event *ERC20Approval // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *ERC20ApprovalIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(ERC20Approval)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(ERC20Approval)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *ERC20ApprovalIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ERC20ApprovalIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// ERC20Approval represents a Approval event raised by the ERC20 contract.
+type ERC20Approval struct {
+	Owner   common.Address
+	Spender common.Address
+	Amount  *big.Int
+	Raw     types.Log // Blockchain specific contextual infos
+}
+
+// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
+func (_ERC20 *ERC20Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*ERC20ApprovalIterator, error) {
+
+	var ownerRule []interface{}
+	for _, ownerItem := range owner {
+		ownerRule = append(ownerRule, ownerItem)
+	}
+	var spenderRule []interface{}
+	for _, spenderItem := range spender {
+		spenderRule = append(spenderRule, spenderItem)
+	}
+
+	logs, sub, err := _ERC20.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &ERC20ApprovalIterator{contract: _ERC20.contract, event: "Approval", logs: logs, sub: sub}, nil
+}
+
+// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
+func (_ERC20 *ERC20Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *ERC20Approval, owner []common.Address, spender []common.Address) (event.Subscription, error) {
+
+	var ownerRule []interface{}
+	for _, ownerItem := range owner {
+		ownerRule = append(ownerRule, ownerItem)
+	}
+	var spenderRule []interface{}
+	for _, spenderItem := range spender {
+		spenderRule = append(spenderRule, spenderItem)
+	}
+
+	logs, sub, err := _ERC20.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(ERC20Approval)
+				if err := _ERC20.contract.UnpackLog(event, "Approval", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(address indexed owner, address indexed spender, uint256 amount)
+func (_ERC20 *ERC20Filterer) ParseApproval(log types.Log) (*ERC20Approval, error) {
+	event := new(ERC20Approval)
+	if err := _ERC20.contract.UnpackLog(event, "Approval", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+// ERC20TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the ERC20 contract.
+type ERC20TransferIterator struct {
+	Event *ERC20Transfer // Event containing the contract specifics and raw log
+
+	contract *bind.BoundContract // Generic contract to use for unpacking event data
+	event    string              // Event name to use for unpacking event data
+
+	logs chan types.Log        // Log channel receiving the found contract events
+	sub  ethereum.Subscription // Subscription for errors, completion and termination
+	done bool                  // Whether the subscription completed delivering logs
+	fail error                 // Occurred error to stop iteration
+}
+
+// Next advances the iterator to the subsequent event, returning whether there
+// are any more events found. In case of a retrieval or parsing error, false is
+// returned and Error() can be queried for the exact failure.
+func (it *ERC20TransferIterator) Next() bool {
+	// If the iterator failed, stop iterating
+	if it.fail != nil {
+		return false
+	}
+	// If the iterator completed, deliver directly whatever's available
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(ERC20Transfer)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+	// Iterator still in progress, wait for either a data or an error event
+	select {
+	case log := <-it.logs:
+		it.Event = new(ERC20Transfer)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+// Error returns any retrieval or parsing error occurred during filtering.
+func (it *ERC20TransferIterator) Error() error {
+	return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ERC20TransferIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+// ERC20Transfer represents a Transfer event raised by the ERC20 contract.
+type ERC20Transfer struct {
+	From   common.Address
+	To     common.Address
+	Amount *big.Int
+	Raw    types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
+func (_ERC20 *ERC20Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ERC20TransferIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _ERC20.contract.FilterLogs(opts, "Transfer", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &ERC20TransferIterator{contract: _ERC20.contract, event: "Transfer", logs: logs, sub: sub}, nil
+}
+
+// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
+func (_ERC20 *ERC20Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ERC20Transfer, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _ERC20.contract.WatchLogs(opts, "Transfer", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+				// New log arrived, parse the event and forward to the user
+				event := new(ERC20Transfer)
+				if err := _ERC20.contract.UnpackLog(event, "Transfer", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(address indexed from, address indexed to, uint256 amount)
+func (_ERC20 *ERC20Filterer) ParseTransfer(log types.Log) (*ERC20Transfer, error) {
+	event := new(ERC20Transfer)
+	if err := _ERC20.contract.UnpackLog(event, "Transfer", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
diff --git a/op-service/sources/batching/test/generic_stub.go b/op-service/sources/batching/test/generic_stub.go
index 9e78656ad48f..c269eb100d6b 100644
--- a/op-service/sources/batching/test/generic_stub.go
+++ b/op-service/sources/batching/test/generic_stub.go
@@ -19,7 +19,7 @@ import (
 type ExpectedRpcCall interface {
 	fmt.Stringer
 	Matches(rpcMethod string, args ...interface{}) error
-	Execute(t *testing.T, out interface{})
+	Execute(t *testing.T, out interface{}) error
 }
 
 type RpcStub struct {
@@ -50,8 +50,7 @@ func (r *RpcStub) BatchCallContext(ctx context.Context, b []rpc.BatchElem) error
 
 func (r *RpcStub) CallContext(_ context.Context, out interface{}, method string, args ...interface{}) error {
 	call := r.findExpectedCall(method, args...)
-	call.Execute(r.t, out)
-	return nil
+	return call.Execute(r.t, out)
 }
 
 func (r *RpcStub) findExpectedCall(rpcMethod string, args ...interface{}) ExpectedRpcCall {
@@ -91,12 +90,13 @@ func (c *GenericExpectedCall) Matches(rpcMethod string, args ...interface{}) err
 	return nil
 }
 
-func (c *GenericExpectedCall) Execute(t *testing.T, out interface{}) {
+func (c *GenericExpectedCall) Execute(t *testing.T, out interface{}) error {
 	// I admit I do not understand Go reflection.
 	// So leverage json.Unmarshal to set the out value correctly.
 	j, err := json.Marshal(c.result)
 	require.NoError(t, err)
 	require.NoError(t, json.Unmarshal(j, out))
+	return nil
 }
 
 func (c *GenericExpectedCall) String() string {
diff --git a/op-service/sources/eth_client.go b/op-service/sources/eth_client.go
index 8f73b13b6110..faf10e7803a2 100644
--- a/op-service/sources/eth_client.go
+++ b/op-service/sources/eth_client.go
@@ -137,6 +137,9 @@ func NewEthClient(client client.RPC, log log.Logger, metrics caching.Metrics, co
 
 	client = LimitRPC(client, config.MaxConcurrentRequests)
 	recProvider := newRecProviderFromConfig(client, log, metrics, config)
+	if recProvider.isInnerNil() {
+		return nil, fmt.Errorf("failed to open RethDB")
+	}
 	return &EthClient{
 		client:            client,
 		recProvider:       recProvider,
diff --git a/op-service/sources/l1_beacon_client.go b/op-service/sources/l1_beacon_client.go
index 7a6aea703a13..95e0b4022307 100644
--- a/op-service/sources/l1_beacon_client.go
+++ b/op-service/sources/l1_beacon_client.go
@@ -12,6 +12,7 @@ import (
 	"strconv"
 	"sync"
 
+	"github.com/ethereum/go-ethereum"
 	"github.com/ethereum/go-ethereum/crypto/kzg4844"
 
 	"github.com/ethereum-optimism/optimism/op-service/client"
@@ -72,7 +73,11 @@ func (cl *BeaconHTTPClient) apiReq(ctx context.Context, dest any, reqPath string
 	if err != nil {
 		return fmt.Errorf("http Get failed: %w", err)
 	}
-	if resp.StatusCode != http.StatusOK {
+	if resp.StatusCode == http.StatusNotFound {
+		errMsg, _ := io.ReadAll(resp.Body)
+		_ = resp.Body.Close()
+		return fmt.Errorf("failed request with status %d: %s: %w", resp.StatusCode, string(errMsg), ethereum.NotFound)
+	} else if resp.StatusCode != http.StatusOK {
 		errMsg, _ := io.ReadAll(resp.Body)
 		_ = resp.Body.Close()
 		return fmt.Errorf("failed request with status %d: %s", resp.StatusCode, string(errMsg))
@@ -124,6 +129,19 @@ func (cl *BeaconHTTPClient) BeaconBlobSideCars(ctx context.Context, fetchAllSide
 	if err := cl.apiReq(ctx, &resp, reqPath, reqQuery); err != nil {
 		return eth.APIGetBlobSidecarsResponse{}, err
 	}
+
+	indices := make(map[uint64]struct{}, len(hashes))
+	for _, h := range hashes {
+		indices[h.Index] = struct{}{}
+	}
+
+	for _, apisc := range resp.Data {
+		delete(indices, uint64(apisc.Index))
+	}
+
+	if len(indices) > 0 {
+		return eth.APIGetBlobSidecarsResponse{}, fmt.Errorf("#returned blobs(%d) != #requested blobs(%d)", len(hashes)-len(indices), len(hashes))
+	}
 	return resp, nil
 }
 
diff --git a/op-service/sources/l1_beacon_client_test.go b/op-service/sources/l1_beacon_client_test.go
index defee7d8cbf3..ef4ede18c68d 100644
--- a/op-service/sources/l1_beacon_client_test.go
+++ b/op-service/sources/l1_beacon_client_test.go
@@ -1,10 +1,19 @@
 package sources
 
 import (
+	"bytes"
 	"context"
+	"encoding/json"
 	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"path"
+	"strconv"
 	"testing"
 
+	client_mocks "github.com/ethereum-optimism/optimism/op-service/client/mocks"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum-optimism/optimism/op-service/sources/mocks"
 	"github.com/ethereum/go-ethereum/crypto/kzg4844"
@@ -174,6 +183,37 @@ func TestBeaconClientFallback(t *testing.T) {
 
 }
 
+func TestBeaconHTTPClient(t *testing.T) {
+	c := client_mocks.NewHTTP(t)
+	b := NewBeaconHTTPClient(c)
+
+	ctx := context.Background()
+
+	indices := []uint64{3, 9, 11}
+	index0, _ := makeTestBlobSidecar(indices[0])
+	index1, _ := makeTestBlobSidecar(indices[1])
+	index2, _ := makeTestBlobSidecar(indices[2])
+
+	hashes := []eth.IndexedBlobHash{index0, index1, index2}
+
+	// mocks returning a 200 with empty list
+	respBytes, _ := json.Marshal(eth.APIGetBlobSidecarsResponse{})
+	slot := uint64(2)
+	path := path.Join(sidecarsMethodPrefix, strconv.FormatUint(slot, 10))
+	reqQuery := url.Values{}
+	for i := range hashes {
+		reqQuery.Add("indices", strconv.FormatUint(hashes[i].Index, 10))
+	}
+	headers := http.Header{}
+	headers.Add("Accept", "application/json")
+	c.EXPECT().Get(ctx, path, reqQuery, headers).Return(&http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader(respBytes))}, nil)
+
+	// BeaconBlobSideCars should return error when client.HTTP returns a 200 with empty list
+	_, err := b.BeaconBlobSideCars(ctx, false, slot, hashes)
+	require.Error(t, err)
+	require.Equal(t, err.Error(), fmt.Sprintf("#returned blobs(%d) != #requested blobs(%d)", 0, len(hashes)))
+}
+
 func TestClientPoolSingle(t *testing.T) {
 	p := NewClientPool[int](1)
 	for i := 0; i < 10; i++ {
diff --git a/op-service/sources/l2_client.go b/op-service/sources/l2_client.go
index 6d79194268e8..304a94a0a292 100644
--- a/op-service/sources/l2_client.go
+++ b/op-service/sources/l2_client.go
@@ -10,11 +10,11 @@ import (
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/log"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	"github.com/ethereum-optimism/optimism/op-service/client"
 	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum-optimism/optimism/op-service/sources/caching"
 )
 
@@ -102,7 +102,7 @@ func (s *L2Client) L2BlockRefByLabel(ctx context.Context, label eth.BlockLabel)
 	if err != nil {
 		// Both geth and erigon like to serve non-standard errors for the safe and finalized heads, correct that.
 		// This happens when the chain just started and nothing is marked as safe/finalized yet.
-		if strings.Contains(err.Error(), "block not found") || strings.Contains(err.Error(), "Unknown block") {
+		if strings.Contains(err.Error(), "block not found") || strings.Contains(err.Error(), "Unknown block") || strings.Contains(err.Error(), "unknown block") {
 			err = ethereum.NotFound
 		}
 		// w%: wrap to preserve ethereum.NotFound case
diff --git a/op-service/sources/receipts_caching.go b/op-service/sources/receipts_caching.go
index 4631e4e78b23..b1760c5afd39 100644
--- a/op-service/sources/receipts_caching.go
+++ b/op-service/sources/receipts_caching.go
@@ -80,3 +80,7 @@ func (p *CachingReceiptsProvider) FetchReceipts(ctx context.Context, blockInfo e
 	p.deleteFetchingLock(block.Hash)
 	return r, nil
 }
+
+func (p *CachingReceiptsProvider) isInnerNil() bool {
+	return p.inner == nil
+}
diff --git a/op-service/sources/reth_db.go b/op-service/sources/reth_db.go
index aba2d8f25bff..aff8d491c0c6 100644
--- a/op-service/sources/reth_db.go
+++ b/op-service/sources/reth_db.go
@@ -18,9 +18,10 @@ import (
 
 /*
 #cgo LDFLAGS: -L../rethdb-reader/target/release -lrethdbreader
-#include 
-#include 
+#include 
 #include 
+#include 
+#include 
 
 typedef struct {
     char* data;
@@ -28,14 +29,20 @@ typedef struct {
     bool error;
 } ReceiptsResult;
 
-extern ReceiptsResult rdb_read_receipts(const uint8_t* block_hash, size_t block_hash_len, const char* db_path);
+typedef struct OpenDBResult {
+  const void *data;
+  bool error;
+} OpenDBResult;
+
+extern ReceiptsResult rdb_read_receipts(const uint8_t* block_hash, size_t block_hash_len, const void *db_instance);
 extern void rdb_free_string(char* string);
+extern OpenDBResult open_db_read_only(const char *db_path);
 */
 import "C"
 
 // FetchRethReceipts fetches the receipts for the given block hash directly from the Reth Database
 // and populates the given results slice pointer with the receipts that were found.
-func FetchRethReceipts(dbPath string, blockHash *common.Hash) (types.Receipts, error) {
+func FetchRethReceipts(db unsafe.Pointer, blockHash *common.Hash) (types.Receipts, error) {
 	if blockHash == nil {
 		return nil, fmt.Errorf("Must provide a block hash to fetch receipts for.")
 	}
@@ -44,12 +51,8 @@ func FetchRethReceipts(dbPath string, blockHash *common.Hash) (types.Receipts, e
 	cBlockHash := C.CBytes(blockHash[:])
 	defer C.free(cBlockHash)
 
-	// Convert the db path to a C string and defer its deallocation
-	cDbPath := C.CString(dbPath)
-	defer C.free(unsafe.Pointer(cDbPath))
-
 	// Call the C function to fetch the receipts from the Reth Database
-	receiptsResult := C.rdb_read_receipts((*C.uint8_t)(cBlockHash), C.size_t(len(blockHash)), cDbPath)
+	receiptsResult := C.rdb_read_receipts((*C.uint8_t)(cBlockHash), C.size_t(len(blockHash)), db)
 
 	if receiptsResult.error {
 		return nil, fmt.Errorf("Error fetching receipts from Reth Database.")
@@ -68,26 +71,44 @@ func FetchRethReceipts(dbPath string, blockHash *common.Hash) (types.Receipts, e
 	return receipts, nil
 }
 
+func OpenDBReadOnly(dbPath string) (db unsafe.Pointer, err error) {
+	// Convert the db path to a C string and defer its deallocation
+	cDbPath := C.CString(dbPath)
+	defer C.free(unsafe.Pointer(cDbPath))
+
+	// Call the C function to fetch the receipts from the Reth Database
+	openDBResult := C.open_db_read_only(cDbPath)
+
+	if openDBResult.error {
+		return nil, fmt.Errorf("failed to open RethDB")
+	}
+
+	return openDBResult.data, nil
+}
+
 type RethDBReceiptsFetcher struct {
-	dbPath string
-	// TODO(8225): Now that we have reading from a Reth DB encapsulated here,
-	//   We could store a reference to the RethDB here instead of just a db path,
-	//   which would be more optimal.
-	//   We could move the opening of the RethDB and creation of the db reference
-	//   into NewRethDBReceiptsFetcher.
+	dbInstance unsafe.Pointer
 }
 
 var _ ReceiptsProvider = (*RethDBReceiptsFetcher)(nil)
 
+// NewRethDBReceiptsFetcher opens a RethDB for reading receipts. It returns nil if it was unable to open the database
 func NewRethDBReceiptsFetcher(dbPath string) *RethDBReceiptsFetcher {
+	db, err := OpenDBReadOnly(dbPath)
+	if err != nil {
+		return nil
+	}
 	return &RethDBReceiptsFetcher{
-		dbPath: dbPath,
+		dbInstance: db,
 	}
 }
 
 func (f *RethDBReceiptsFetcher) FetchReceipts(ctx context.Context, block eth.BlockInfo, txHashes []common.Hash) (types.Receipts, error) {
+	if f.dbInstance == nil {
+		return nil, fmt.Errorf("Reth dbInstance is nil")
+	}
 	hash := block.Hash()
-	return FetchRethReceipts(f.dbPath, &hash)
+	return FetchRethReceipts(f.dbInstance, &hash)
 }
 
 func NewCachingRethDBReceiptsFetcher(dbPath string, m caching.Metrics, cacheSize int) *CachingReceiptsProvider {
diff --git a/op-service/sources/reth_db_test.go b/op-service/sources/reth_db_test.go
index c98cf07a6153..d52042c439f2 100644
--- a/op-service/sources/reth_db_test.go
+++ b/op-service/sources/reth_db_test.go
@@ -23,7 +23,9 @@ func TestRethDBReceiptsLoad(t *testing.T) {
 	//       Old State Root: 0xaf81a692d228d56d35c80d65aeba59636b4671403054f6c57446c0e3e4d951c8
 	//       New State Root (Empty MPT): 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
 	blockHash := common.HexToHash("0x6a229123d607c2232a8b0bdd36f90745945d05181018e64e60ff2b93ab6b52e5")
-	res, err := FetchRethReceipts("../rethdb-reader/testdata/db", &blockHash)
+	fetcher := NewRethDBReceiptsFetcher("../rethdb-reader/testdata/db")
+	require.NotNil(t, fetcher.dbInstance)
+	res, err := FetchRethReceipts(fetcher.dbInstance, &blockHash)
 	require.NoError(t, err)
 
 	receipt := (*types.Receipt)(res[0])
diff --git a/op-service/testutils/mock_client.go b/op-service/testutils/mock_client.go
new file mode 100644
index 000000000000..7335c9f7cd59
--- /dev/null
+++ b/op-service/testutils/mock_client.go
@@ -0,0 +1,334 @@
+package testutils
+
+import (
+	"context"
+	"math/big"
+
+	"github.com/stretchr/testify/mock"
+
+	"github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+
+	"github.com/ethereum-optimism/optimism/op-service/client"
+)
+
+var _ client.Client = &MockClient{}
+
+type MockClient struct {
+	mock.Mock
+}
+
+func (m *MockClient) Close() {
+	m.Mock.Called()
+}
+
+func (m *MockClient) ExpectClose() {
+	m.Mock.On("Close").Once().Return()
+}
+
+func (m *MockClient) RPC() client.RPC {
+	out := m.Mock.Called()
+	return out.Get(0).(client.RPC)
+}
+
+func (m *MockClient) ExpectRPC(rpc client.RPC) {
+	m.Mock.On("RPC").Once().Return(rpc)
+}
+
+func (m *MockClient) ChainID(ctx context.Context) (*big.Int, error) {
+	out := m.Mock.Called(ctx)
+	return out.Get(0).(*big.Int), out.Error(1)
+}
+
+func (m *MockClient) ExpectChainID(id *big.Int, err error) {
+	m.Mock.On("ChainID", mock.Anything).Once().Return(id, err)
+}
+
+func (m *MockClient) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) {
+	out := m.Mock.Called(ctx, hash)
+	return out.Get(0).(*types.Block), out.Error(1)
+}
+
+func (m *MockClient) ExpectBlockByHash(hash common.Hash, block *types.Block, err error) {
+	m.Mock.On("BlockByHash", mock.Anything, hash).Once().Return(block, err)
+}
+
+func (m *MockClient) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) {
+	out := m.Mock.Called(ctx, number)
+	return out.Get(0).(*types.Block), out.Error(1)
+}
+
+func (m *MockClient) ExpectBlockByNumber(number *big.Int, block *types.Block, err error) {
+	m.Mock.On("BlockByNumber", mock.Anything, number).Once().Return(block, err)
+}
+
+func (m *MockClient) BlockNumber(ctx context.Context) (uint64, error) {
+	out := m.Mock.Called(ctx)
+	return out.Get(0).(uint64), out.Error(1)
+}
+
+func (m *MockClient) ExpectBlockNumber(blockNum uint64, err error) {
+	m.Mock.On("BlockNumber", mock.Anything).Once().Return(blockNum, err)
+}
+
+func (m *MockClient) PeerCount(ctx context.Context) (uint64, error) {
+	out := m.Mock.Called(ctx)
+	return out.Get(0).(uint64), out.Error(1)
+}
+
+func (m *MockClient) ExpectPeerCount(count uint64, err error) {
+	m.Mock.On("PeerCount", mock.Anything).Once().Return(count, err)
+}
+
+func (m *MockClient) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) {
+	out := m.Mock.Called(ctx, hash)
+	return out.Get(0).(*types.Header), out.Error(1)
+}
+
+func (m *MockClient) ExpectHeaderByHash(hash common.Hash, header *types.Header, err error) {
+	m.Mock.On("HeaderByHash", mock.Anything, hash).Once().Return(header, err)
+}
+
+func (m *MockClient) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) {
+	out := m.Mock.Called(ctx, number)
+	return out.Get(0).(*types.Header), out.Error(1)
+}
+
+func (m *MockClient) ExpectHeaderByNumber(number *big.Int, header *types.Header, err error) {
+	m.Mock.On("HeaderByNumber", mock.Anything, number).Once().Return(header, err)
+}
+
+func (m *MockClient) TransactionByHash(ctx context.Context, hash common.Hash) (*types.Transaction, bool, error) {
+	out := m.Mock.Called(ctx, hash)
+	return out.Get(0).(*types.Transaction), out.Get(1).(bool), out.Error(2)
+}
+
+func (m *MockClient) ExpectTransactionByHash(hash common.Hash, tx *types.Transaction, isPending bool, err error) {
+	m.Mock.On("TransactionByHash", mock.Anything, hash).Once().Return(tx, isPending, err)
+}
+
+func (m *MockClient) TransactionSender(ctx context.Context, tx *types.Transaction, block common.Hash, index uint) (common.Address, error) {
+	out := m.Mock.Called(ctx, tx, block, index)
+	return out.Get(0).(common.Address), out.Error(1)
+}
+
+func (m *MockClient) ExpectTransactionSender(tx *types.Transaction, block common.Hash, index uint, sender common.Address, err error) {
+	m.Mock.On("TransactionSender", mock.Anything, tx, block, index).Once().Return(sender, err)
+}
+
+func (m *MockClient) TransactionCount(ctx context.Context, hash common.Hash) (uint, error) {
+	out := m.Mock.Called(ctx, hash)
+	return out.Get(0).(uint), out.Error(1)
+}
+
+func (m *MockClient) ExpectTransactionCount(hash common.Hash, count uint, err error) {
+	m.Mock.On("TransactionCount", mock.Anything, hash).Once().Return(count, err)
+}
+
+func (m *MockClient) TransactionInBlock(ctx context.Context, hash common.Hash, index uint) (*types.Transaction, error) {
+	out := m.Mock.Called(ctx, hash, index)
+	return out.Get(0).(*types.Transaction), out.Error(1)
+}
+
+func (m *MockClient) ExpectTransactionInBlock(hash common.Hash, index uint, tx *types.Transaction, err error) {
+	m.Mock.On("TransactionInBlock", mock.Anything, hash, index).Once().Return(tx, err)
+}
+
+func (m *MockClient) TransactionReceipt(ctx context.Context, hash common.Hash) (*types.Receipt, error) {
+	out := m.Mock.Called(ctx, hash)
+	return out.Get(0).(*types.Receipt), out.Error(1)
+}
+
+func (m *MockClient) ExpectTransactionReceipt(hash common.Hash, receipt *types.Receipt, err error) {
+	m.Mock.On("TransactionReceipt", mock.Anything, hash).Once().Return(receipt, err)
+}
+
+func (m *MockClient) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, error) {
+	out := m.Mock.Called(ctx)
+	return out.Get(0).(*ethereum.SyncProgress), out.Error(1)
+}
+
+func (m *MockClient) ExpectSyncProgress(prog *ethereum.SyncProgress, err error) {
+	m.Mock.On("SyncProgress", mock.Anything).Once().Return(prog, err)
+}
+
+func (m *MockClient) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) {
+	out := m.Mock.Called(ctx, ch)
+	return out.Get(0).(ethereum.Subscription), out.Error(1)
+}
+
+func (m *MockClient) ExpectSubscribeNewHead(ch chan<- *types.Header, sub ethereum.Subscription, err error) {
+	m.Mock.On("SubscribeNewHead", mock.Anything, ch).Once().Return(sub, err)
+}
+
+func (m *MockClient) NetworkID(ctx context.Context) (*big.Int, error) {
+	out := m.Mock.Called(ctx)
+	return out.Get(0).(*big.Int), out.Error(1)
+}
+
+func (m *MockClient) ExpectNetworkID(id *big.Int, err error) {
+	m.Mock.On("NetworkID", mock.Anything).Once().Return(id, err)
+}
+
+func (m *MockClient) BalanceAt(ctx context.Context, account common.Address, block *big.Int) (*big.Int, error) {
+	out := m.Mock.Called(ctx, account, block)
+	return out.Get(0).(*big.Int), out.Error(1)
+}
+
+func (m *MockClient) ExpectBalanceAt(account common.Address, block, amount *big.Int, err error) {
+	m.Mock.On("BalanceAt", mock.Anything, account, block).Once().Return(amount, err)
+}
+
+func (m *MockClient) StorageAt(ctx context.Context, account common.Address, key common.Hash, block *big.Int) ([]byte, error) {
+	out := m.Mock.Called(ctx, account, key, block)
+	return out.Get(0).([]byte), out.Error(1)
+}
+
+func (m *MockClient) ExpectStorageAt(account common.Address, key common.Hash, block *big.Int, data []byte, err error) {
+	m.Mock.On("StorageAt", mock.Anything, account, key, block).Once().Return(data, err)
+}
+
+func (m *MockClient) CodeAt(ctx context.Context, account common.Address, block *big.Int) ([]byte, error) {
+	out := m.Mock.Called(ctx, account, block)
+	return out.Get(0).([]byte), out.Error(1)
+}
+
+func (m *MockClient) ExpectCodeAt(account common.Address, block *big.Int, code []byte, err error) {
+	m.Mock.On("CodeAt", mock.Anything, account, block).Once().Return(code, err)
+}
+
+func (m *MockClient) NonceAt(ctx context.Context, account common.Address, block *big.Int) (uint64, error) {
+	out := m.Mock.Called(ctx, account, block)
+	return out.Get(0).(uint64), out.Error(1)
+}
+
+func (m *MockClient) ExpectNonceAt(account common.Address, block *big.Int, nonce uint64, err error) {
+	m.Mock.On("NonceAt", mock.Anything, account, block).Once().Return(nonce, err)
+}
+
+func (m *MockClient) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error) {
+	out := m.Mock.Called(ctx, q)
+	return out.Get(0).([]types.Log), out.Error(1)
+}
+
+func (m *MockClient) ExpectFilterLogs(q ethereum.FilterQuery, logs []types.Log, err error) {
+	m.Mock.On("FilterLogs", mock.Anything, q).Once().Return(logs, err)
+}
+
+func (m *MockClient) SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) {
+	out := m.Mock.Called(ctx, q, ch)
+	return out.Get(0).(ethereum.Subscription), out.Error(1)
+}
+
+func (m *MockClient) ExpectSubscribeFilterLogs(q ethereum.FilterQuery, ch chan<- types.Log, sub ethereum.Subscription, err error) {
+	m.Mock.On("SubscribeFilterLogs", mock.Anything, q, ch).Once().Return(sub, err)
+}
+
+func (m *MockClient) PendingBalanceAt(ctx context.Context, account common.Address) (*big.Int, error) {
+	out := m.Mock.Called(ctx, account)
+	return out.Get(0).(*big.Int), out.Error(1)
+}
+
+func (m *MockClient) ExpectPendingBalanceAt(account common.Address, balance *big.Int, err error) {
+	m.Mock.On("PendingBalanceAt", mock.Anything, account).Once().Return(balance, err)
+}
+
+func (m *MockClient) PendingStorageAt(ctx context.Context, account common.Address, key common.Hash) ([]byte, error) {
+	out := m.Mock.Called(ctx, account, key)
+	return out.Get(0).([]byte), out.Error(1)
+}
+
+func (m *MockClient) ExpectPendingStorageAt(account common.Address, key common.Hash, data []byte, err error) {
+	m.Mock.On("PendingStorageAt", mock.Anything, account, key).Once().Return(data, err)
+}
+
+func (m *MockClient) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) {
+	out := m.Mock.Called(ctx, account)
+	return out.Get(0).([]byte), out.Error(1)
+}
+
+func (m *MockClient) ExpectPendingCodeAt(account common.Address, code []byte, err error) {
+	m.Mock.On("PendingCodeAt", mock.Anything, account).Once().Return(code, err)
+}
+
+func (m *MockClient) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) {
+	out := m.Mock.Called(ctx, account)
+	return out.Get(0).(uint64), out.Error(1)
+}
+
+func (m *MockClient) ExpectPendingNonceAt(account common.Address, nonce uint64, err error) {
+	m.Mock.On("PendingNonceAt", mock.Anything, account).Once().Return(nonce, err)
+}
+
+func (m *MockClient) PendingTransactionCount(ctx context.Context) (uint, error) {
+	out := m.Mock.Called(ctx)
+	return out.Get(0).(uint), out.Error(1)
+}
+
+func (m *MockClient) ExpectPendingTransactionCount(count uint, err error) {
+	m.Mock.On("PendingTransactionCount", mock.Anything).Once().Return(count, err)
+}
+
+func (m *MockClient) CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) {
+	out := m.Mock.Called(ctx, msg, blockNumber)
+	return out.Get(0).([]byte), out.Error(1)
+}
+
+func (m *MockClient) ExpectCallContract(msg ethereum.CallMsg, blockNumber *big.Int, result []byte, err error) {
+	m.Mock.On("CallContract", mock.Anything, msg, blockNumber).Once().Return(result, err)
+}
+
+func (m *MockClient) CallContractAtHash(ctx context.Context, msg ethereum.CallMsg, blockHash common.Hash) ([]byte, error) {
+	out := m.Mock.Called(ctx, msg, blockHash)
+	return out.Get(0).([]byte), out.Error(1)
+}
+
+func (m *MockClient) ExpectCallContractAtHash(msg ethereum.CallMsg, blockHash common.Hash, result []byte, err error) {
+	m.Mock.On("CallContractAtHash", mock.Anything, msg, blockHash).Once().Return(result, err)
+}
+
+func (m *MockClient) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) {
+	out := m.Mock.Called(ctx, msg)
+	return out.Get(0).([]byte), out.Error(1)
+}
+
+func (m *MockClient) ExpectPendingCallContract(msg ethereum.CallMsg, result []byte, err error) {
+	m.Mock.On("PendingCallContract", mock.Anything, msg).Once().Return(result, err)
+}
+
+func (m *MockClient) SuggestGasPrice(ctx context.Context) (*big.Int, error) {
+	out := m.Mock.Called(ctx)
+	return out.Get(0).(*big.Int), out.Error(1)
+}
+
+func (m *MockClient) ExpectSuggestGasPrice(price *big.Int, err error) {
+	m.Mock.On("SuggestGasPrice", mock.Anything).Once().Return(price, err)
+}
+
+func (m *MockClient) SuggestGasTipCap(ctx context.Context) (*big.Int, error) {
+	out := m.Mock.Called(ctx)
+	return out.Get(0).(*big.Int), out.Error(1)
+}
+
+func (m *MockClient) ExpectSuggestGasTipCap(tipCap *big.Int, err error) {
+	m.Mock.On("SuggestGasTipCap", mock.Anything).Once().Return(tipCap, err)
+}
+
+func (m *MockClient) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) {
+	out := m.Mock.Called(ctx, msg)
+	return out.Get(0).(uint64), out.Error(1)
+}
+
+func (m *MockClient) ExpectEstimateGas(msg ethereum.CallMsg, gas uint64, err error) {
+	m.Mock.On("EstimateGas", mock.Anything, msg).Once().Return(gas, err)
+}
+
+func (m *MockClient) SendTransaction(ctx context.Context, tx *types.Transaction) error {
+	out := m.Mock.Called(ctx, tx)
+	return out.Error(0)
+}
+
+func (m *MockClient) ExpectSendTransaction(tx *types.Transaction, err error) {
+	m.Mock.On("SendTransaction", mock.Anything, tx).Once().Return(err)
+}
diff --git a/op-service/testutils/mock_rpc.go b/op-service/testutils/mock_rpc.go
new file mode 100644
index 000000000000..4bc332336dc6
--- /dev/null
+++ b/op-service/testutils/mock_rpc.go
@@ -0,0 +1,69 @@
+package testutils
+
+import (
+	"context"
+	"reflect"
+
+	"github.com/ethereum-optimism/optimism/op-service/client"
+	"github.com/stretchr/testify/mock"
+
+	"github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/rpc"
+)
+
+var _ client.RPC = &MockRPC{}
+
+type MockRPC struct {
+	mock.Mock
+}
+
+func (m *MockRPC) Close() {
+	m.Mock.Called()
+}
+
+func (m *MockRPC) ExpectClose() {
+	m.Mock.On("Close").Once().Return()
+}
+
+func (m *MockRPC) CallContext(ctx context.Context, result any, method string, args ...any) error {
+	out := m.Mock.Called(ctx, result, method, args)
+	return out.Error(0)
+}
+
+func (m *MockRPC) ExpectCallContext(result any, method string, args []any, err error) {
+	m.Mock.On("CallContext", mock.Anything, result, method, args).Once().Return(err)
+}
+
+func (m *MockRPC) BatchCallContext(ctx context.Context, b []rpc.BatchElem) error {
+	out := m.Mock.Called(ctx, b)
+	return out.Error(0)
+}
+
+func (m *MockRPC) ExpectBatchCallContext(b []rpc.BatchElem, err error) {
+	// Arguments are mutated directly, so replace the result as long as everything else matches
+	rpcElemsMatcher := mock.MatchedBy(func(elems []rpc.BatchElem) bool {
+		for i, e := range elems {
+			if e.Error != b[i].Error || e.Method != b[i].Method || !reflect.DeepEqual(e.Args, b[i].Args) {
+				return false
+			}
+		}
+		return true
+	})
+
+	// Replace the Result
+	m.Mock.On("BatchCallContext", mock.Anything, rpcElemsMatcher).Once().Run(func(args mock.Arguments) {
+		r := args.Get(1).([]rpc.BatchElem)
+		for i := 0; i < len(r); i++ {
+			r[i].Result = b[i].Result
+		}
+	}).Return(err)
+}
+
+func (m *MockRPC) EthSubscribe(ctx context.Context, channel any, args ...any) (ethereum.Subscription, error) {
+	out := m.Mock.Called(ctx, channel, args)
+	return out.Get(0).(ethereum.Subscription), out.Error(1)
+}
+
+func (m *MockRPC) ExpectEthSubscribe(channel any, args []any, sub ethereum.Subscription, err error) {
+	m.Mock.On("EthSubscribe", mock.Anything, channel, args).Once().Return(sub, err)
+}
diff --git a/op-service/testutils/random.go b/op-service/testutils/random.go
index f13fb2fc658d..f065d2583765 100644
--- a/op-service/testutils/random.go
+++ b/op-service/testutils/random.go
@@ -169,7 +169,7 @@ func RandomLegacyTx(rng *rand.Rand, signer types.Signer) *types.Transaction {
 		Gas:      params.TxGas + uint64(rng.Int63n(2_000_000)),
 		To:       RandomTo(rng),
 		Value:    RandomETH(rng, 10),
-		Data:     RandomData(rng, rng.Intn(1000)),
+		Data:     RandomData(rng, rng.Intn(RandomDataSize)),
 	}
 	tx, err := types.SignNewTx(key, signer, txData)
 	if err != nil {
@@ -187,7 +187,7 @@ func RandomAccessListTx(rng *rand.Rand, signer types.Signer) *types.Transaction
 		Gas:        params.TxGas + uint64(rng.Int63n(2_000_000)),
 		To:         RandomTo(rng),
 		Value:      RandomETH(rng, 10),
-		Data:       RandomData(rng, rng.Intn(1000)),
+		Data:       RandomData(rng, rng.Intn(RandomDataSize)),
 		AccessList: nil,
 	}
 	tx, err := types.SignNewTx(key, signer, txData)
@@ -208,7 +208,7 @@ func RandomDynamicFeeTxWithBaseFee(rng *rand.Rand, baseFee *big.Int, signer type
 		Gas:        params.TxGas + uint64(rng.Int63n(2_000_000)),
 		To:         RandomTo(rng),
 		Value:      RandomETH(rng, 10),
-		Data:       RandomData(rng, rng.Intn(1000)),
+		Data:       RandomData(rng, rng.Intn(RandomDataSize)),
 		AccessList: nil,
 	}
 	tx, err := types.SignNewTx(key, signer, txData)
@@ -218,6 +218,8 @@ func RandomDynamicFeeTxWithBaseFee(rng *rand.Rand, baseFee *big.Int, signer type
 	return tx
 }
 
+var RandomDataSize = 1000
+
 func RandomDynamicFeeTx(rng *rand.Rand, signer types.Signer) *types.Transaction {
 	baseFee := new(big.Int).SetUint64(rng.Uint64())
 	return RandomDynamicFeeTxWithBaseFee(rng, baseFee, signer)
@@ -250,7 +252,7 @@ func RandomReceipt(rng *rand.Rand, signer types.Signer, tx *types.Transaction, t
 	}
 }
 
-func RandomHeader(rng *rand.Rand) *types.Header {
+func RandomHeaderWithTime(rng *rand.Rand, t uint64) *types.Header {
 	return &types.Header{
 		ParentHash:  RandomHash(rng),
 		UncleHash:   types.EmptyUncleHash,
@@ -263,7 +265,7 @@ func RandomHeader(rng *rand.Rand) *types.Header {
 		Number:      big.NewInt(1 + rng.Int63n(100_000_000)),
 		GasLimit:    0,
 		GasUsed:     0,
-		Time:        uint64(rng.Int63n(2_000_000_000)),
+		Time:        t,
 		Extra:       RandomData(rng, rng.Intn(33)),
 		MixDigest:   common.Hash{},
 		Nonce:       types.BlockNonce{},
@@ -271,15 +273,17 @@ func RandomHeader(rng *rand.Rand) *types.Header {
 	}
 }
 
+func RandomHeader(rng *rand.Rand) *types.Header {
+	t := uint64(rng.Int63n(2_000_000_000))
+	return RandomHeaderWithTime(rng, t)
+}
+
 func RandomBlock(rng *rand.Rand, txCount uint64) (*types.Block, []*types.Receipt) {
 	return RandomBlockPrependTxs(rng, int(txCount))
 }
 
-// RandomBlockPrependTxs returns a random block with txCount randomly generated
-// transactions and additionally the transactions ptxs prepended. So the total
-// number of transactions is len(ptxs) + txCount.
-func RandomBlockPrependTxs(rng *rand.Rand, txCount int, ptxs ...*types.Transaction) (*types.Block, []*types.Receipt) {
-	header := RandomHeader(rng)
+func RandomBlockPrependTxsWithTime(rng *rand.Rand, txCount int, t uint64, ptxs ...*types.Transaction) (*types.Block, []*types.Receipt) {
+	header := RandomHeaderWithTime(rng, t)
 	signer := types.NewLondonSigner(big.NewInt(rng.Int63n(1000)))
 	txs := make([]*types.Transaction, 0, txCount+len(ptxs))
 	txs = append(txs, ptxs...)
@@ -312,6 +316,14 @@ func RandomBlockPrependTxs(rng *rand.Rand, txCount int, ptxs ...*types.Transacti
 	return block, receipts
 }
 
+// RandomBlockPrependTxs returns a random block with txCount randomly generated
+// transactions and additionally the transactions ptxs prepended. So the total
+// number of transactions is len(ptxs) + txCount.
+func RandomBlockPrependTxs(rng *rand.Rand, txCount int, ptxs ...*types.Transaction) (*types.Block, []*types.Receipt) {
+	t := uint64(rng.Int63n(2_000_000_000))
+	return RandomBlockPrependTxsWithTime(rng, txCount, t, ptxs...)
+}
+
 func RandomOutputResponse(rng *rand.Rand) *eth.OutputResponse {
 	return ð.OutputResponse{
 		Version:               eth.Bytes32(RandomHash(rng)),
diff --git a/op-service/txmgr/metrics/noop.go b/op-service/txmgr/metrics/noop.go
index d9683b4f6db7..6ad796d0169b 100644
--- a/op-service/txmgr/metrics/noop.go
+++ b/op-service/txmgr/metrics/noop.go
@@ -15,5 +15,6 @@ func (*NoopTxMetrics) RecordTxConfirmationLatency(int64) {}
 func (*NoopTxMetrics) TxConfirmed(*types.Receipt)        {}
 func (*NoopTxMetrics) TxPublished(string)                {}
 func (*NoopTxMetrics) RecordBaseFee(*big.Int)            {}
+func (*NoopTxMetrics) RecordBlobBaseFee(*big.Int)        {}
 func (*NoopTxMetrics) RecordTipCap(*big.Int)             {}
 func (*NoopTxMetrics) RPCError()                         {}
diff --git a/op-service/txmgr/metrics/tx_metrics.go b/op-service/txmgr/metrics/tx_metrics.go
index 66b9f3ef5e56..e3015e229830 100644
--- a/op-service/txmgr/metrics/tx_metrics.go
+++ b/op-service/txmgr/metrics/tx_metrics.go
@@ -18,6 +18,7 @@ type TxMetricer interface {
 	TxConfirmed(*types.Receipt)
 	TxPublished(string)
 	RecordBaseFee(*big.Int)
+	RecordBlobBaseFee(*big.Int)
 	RecordTipCap(*big.Int)
 	RPCError()
 }
@@ -34,6 +35,7 @@ type TxMetrics struct {
 	publishEvent       *metrics.Event
 	confirmEvent       metrics.EventVec
 	baseFee            prometheus.Gauge
+	blobBaseFee        prometheus.Gauge
 	tipCap             prometheus.Gauge
 	rpcError           prometheus.Counter
 }
@@ -107,7 +109,13 @@ func MakeTxMetrics(ns string, factory metrics.Factory) TxMetrics {
 		baseFee: factory.NewGauge(prometheus.GaugeOpts{
 			Namespace: ns,
 			Name:      "basefee_wei",
-			Help:      "Latest L1 baseFee (in Wei)",
+			Help:      "Latest L1 base fee (in Wei)",
+			Subsystem: "txmgr",
+		}),
+		blobBaseFee: factory.NewGauge(prometheus.GaugeOpts{
+			Namespace: ns,
+			Name:      "blob_basefee_wei",
+			Help:      "Latest Blob base fee (in Wei)",
 			Subsystem: "txmgr",
 		}),
 		tipCap: factory.NewGauge(prometheus.GaugeOpts{
@@ -163,6 +171,11 @@ func (t *TxMetrics) RecordBaseFee(baseFee *big.Int) {
 	t.baseFee.Set(bff)
 }
 
+func (t *TxMetrics) RecordBlobBaseFee(blobBaseFee *big.Int) {
+	bff, _ := blobBaseFee.Float64()
+	t.blobBaseFee.Set(bff)
+}
+
 func (t *TxMetrics) RecordTipCap(tipcap *big.Int) {
 	tcf, _ := tipcap.Float64()
 	t.tipCap.Set(tcf)
diff --git a/op-service/txmgr/queue_test.go b/op-service/txmgr/queue_test.go
index e0b65d32fd09..ee7a07b0ee05 100644
--- a/op-service/txmgr/queue_test.go
+++ b/op-service/txmgr/queue_test.go
@@ -4,6 +4,8 @@ import (
 	"context"
 	"fmt"
 	"math/big"
+	"slices"
+	"sync"
 	"testing"
 	"time"
 
@@ -14,7 +16,6 @@ import (
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/log"
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 )
 
 type queueFunc func(id int, candidate TxCandidate, receiptCh chan TxReceipt[int], q *Queue[int]) bool
@@ -181,10 +182,15 @@ func TestQueue_Send(t *testing.T) {
 			}
 
 			// track the nonces, and return any expected errors from tx sending
-			var nonces []uint64
+			var (
+				nonces  []uint64
+				nonceMu sync.Mutex
+			)
 			sendTx := func(ctx context.Context, tx *types.Transaction) error {
 				index := int(tx.Data()[0])
+				nonceMu.Lock()
 				nonces = append(nonces, tx.Nonce())
+				nonceMu.Unlock()
 				var testTx *testTx
 				if index < len(test.txs) {
 					testTx = &test.txs[index]
diff --git a/op-service/txmgr/send_state.go b/op-service/txmgr/send_state.go
index 7ccc52b2e151..4066a0caa149 100644
--- a/op-service/txmgr/send_state.go
+++ b/op-service/txmgr/send_state.go
@@ -90,7 +90,7 @@ func (s *SendState) TxMined(txHash common.Hash) {
 	s.minedTxs[txHash] = struct{}{}
 }
 
-// TxMined records that the txn with txnHash has not been mined or has been
+// TxNotMined records that the txn with txnHash has not been mined or has been
 // reorg'd out. It is safe to call this function multiple times.
 func (s *SendState) TxNotMined(txHash common.Hash) {
 	s.mu.Lock()
diff --git a/op-service/txmgr/txmgr.go b/op-service/txmgr/txmgr.go
index 5ef59e2d4e9b..b3d2e4e70e15 100644
--- a/op-service/txmgr/txmgr.go
+++ b/op-service/txmgr/txmgr.go
@@ -317,14 +317,13 @@ func (m *SimpleTxManager) craftTx(ctx context.Context, candidate TxCandidate) (*
 		}
 	}
 	return m.signWithNextNonce(ctx, txMessage) // signer sets the nonce field of the tx
-
 }
 
 // MakeSidecar builds & returns the BlobTxSidecar and corresponding blob hashes from the raw blob
 // data.
 func MakeSidecar(blobs []*eth.Blob) (*types.BlobTxSidecar, []common.Hash, error) {
 	sidecar := &types.BlobTxSidecar{}
-	blobHashes := []common.Hash{}
+	blobHashes := make([]common.Hash, 0, len(blobs))
 	for i, blob := range blobs {
 		rawBlob := *blob.KZGBlob()
 		sidecar.Blobs = append(sidecar.Blobs, rawBlob)
@@ -419,7 +418,7 @@ func (m *SimpleTxManager) sendTx(ctx context.Context, tx *types.Transaction) (*t
 		return tx
 	}
 
-	// Immediately publish a transaction before starting the resumbission loop
+	// Immediately publish a transaction before starting the resubmission loop
 	tx = publishAndWait(tx, false)
 
 	ticker := time.NewTicker(m.cfg.ResubmissionTimeout)
@@ -599,6 +598,11 @@ func (m *SimpleTxManager) queryReceipt(ctx context.Context, txHash common.Hash,
 	}
 
 	m.metr.RecordBaseFee(tip.BaseFee)
+	if tip.ExcessBlobGas != nil {
+		blobFee := eip4844.CalcBlobFee(*tip.ExcessBlobGas)
+		m.metr.RecordBlobBaseFee(blobFee)
+	}
+
 	m.l.Debug("Transaction mined, checking confirmations", "tx", txHash,
 		"block", eth.ReceiptBlockID(receipt), "tip", eth.HeaderBlockID(tip),
 		"numConfirmations", m.cfg.NumConfirmations)
@@ -752,6 +756,7 @@ func (m *SimpleTxManager) suggestGasPriceCaps(ctx context.Context) (*big.Int, *b
 	var blobFee *big.Int
 	if head.ExcessBlobGas != nil {
 		blobFee = eip4844.CalcBlobFee(*head.ExcessBlobGas)
+		m.metr.RecordBlobBaseFee(blobFee)
 	}
 	return tip, baseFee, blobFee, nil
 }
diff --git a/op-service/txmgr/txmgr_test.go b/op-service/txmgr/txmgr_test.go
index e404ea9de761..4a8cf1f26cf2 100644
--- a/op-service/txmgr/txmgr_test.go
+++ b/op-service/txmgr/txmgr_test.go
@@ -305,7 +305,7 @@ func (*mockBackend) ChainID(ctx context.Context) (*big.Int, error) {
 
 // TransactionReceipt queries the mockBackend for a mined txHash. If none is found, nil is returned
 // for both return values. Otherwise, it returns a receipt containing the txHash, the gasFeeCap
-// used in GasUsed, and the blobFeeCap in CumuluativeGasUsed to make the values accessible from our
+// used in GasUsed, and the blobFeeCap in CumulativeGasUsed to make the values accessible from our
 // test framework.
 func (b *mockBackend) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) {
 	b.mu.RLock()
@@ -409,7 +409,7 @@ func TestAlreadyReserved(t *testing.T) {
 	require.ErrorIs(t, err, ErrAlreadyReserved)
 }
 
-// TestTxMgrConfirmsAtMaxGasPrice asserts that Send properly returns the max gas
+// TestTxMgrConfirmsAtHigherGasPrice asserts that Send properly returns the max gas
 // price receipt if none of the lower gas price txs were mined.
 func TestTxMgrConfirmsAtHigherGasPrice(t *testing.T) {
 	t.Parallel()
@@ -439,7 +439,7 @@ func TestTxMgrConfirmsAtHigherGasPrice(t *testing.T) {
 	require.Equal(t, h.gasPricer.expGasFeeCap().Uint64(), receipt.GasUsed)
 }
 
-// TestTxMgrConfirmsBlobTxAtMaxGasPrice asserts that Send properly returns the max gas price
+// TestTxMgrConfirmsBlobTxAtHigherGasPrice asserts that Send properly returns the max gas price
 // receipt if none of the lower gas price txs were mined when attempting to send a blob tx.
 func TestTxMgrConfirmsBlobTxAtHigherGasPrice(t *testing.T) {
 	t.Parallel()
diff --git a/op-ufm/go.mod b/op-ufm/go.mod
index e00d1ad4d24a..997a0c0e2a6c 100644
--- a/op-ufm/go.mod
+++ b/op-ufm/go.mod
@@ -8,12 +8,12 @@ require (
 	cloud.google.com/go/kms v1.12.1
 	github.com/BurntSushi/toml v1.3.2
 	github.com/ethereum-optimism/optimism v1.6.2-0.20240222202618-f707883038d5
-	github.com/ethereum/go-ethereum v1.13.8
+	github.com/ethereum/go-ethereum v1.13.15
 	github.com/gorilla/mux v1.8.0
 	github.com/pkg/errors v0.9.1
 	github.com/prometheus/client_golang v1.19.0
 	github.com/rs/cors v1.9.0
-	golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa
+	golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3
 )
 
 require (
@@ -38,13 +38,13 @@ require (
 	github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect
 	github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect
 	github.com/deckarep/golang-set/v2 v2.1.0 // indirect
-	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
-	github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240306093353-c557df8e6f41 // indirect
+	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
+	github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240522134500-19555bdbdc95 // indirect
 	github.com/ethereum/c-kzg-4844 v0.4.0 // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect
 	github.com/getsentry/sentry-go v0.18.0 // indirect
-	github.com/go-ole/go-ole v1.2.6 // indirect
+	github.com/go-ole/go-ole v1.3.0 // indirect
 	github.com/gofrs/flock v0.8.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
@@ -54,10 +54,10 @@ require (
 	github.com/google/s2a-go v0.1.4 // indirect
 	github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect
 	github.com/googleapis/gax-go/v2 v2.12.0 // indirect
-	github.com/gorilla/websocket v1.5.0 // indirect
+	github.com/gorilla/websocket v1.5.1 // indirect
 	github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
 	github.com/holiman/uint256 v1.2.4 // indirect
-	github.com/klauspost/compress v1.17.2 // indirect
+	github.com/klauspost/compress v1.17.6 // indirect
 	github.com/kr/pretty v0.3.1 // indirect
 	github.com/kr/text v0.2.0 // indirect
 	github.com/mattn/go-runewidth v0.0.14 // indirect
@@ -76,28 +76,28 @@ require (
 	github.com/tklauser/numcpus v0.6.1 // indirect
 	github.com/urfave/cli/v2 v2.27.1 // indirect
 	github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
-	github.com/yusufpapurcu/wmi v1.2.2 // indirect
+	github.com/yusufpapurcu/wmi v1.2.3 // indirect
 	go.opencensus.io v0.24.0 // indirect
-	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/crypto v0.23.0 // indirect
 	golang.org/x/mod v0.14.0 // indirect
-	golang.org/x/net v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
 	golang.org/x/oauth2 v0.16.0 // indirect
 	golang.org/x/sync v0.6.0 // indirect
-	golang.org/x/sys v0.18.0 // indirect
-	golang.org/x/term v0.18.0 // indirect
-	golang.org/x/text v0.14.0 // indirect
-	golang.org/x/tools v0.16.1 // indirect
+	golang.org/x/sys v0.20.0 // indirect
+	golang.org/x/term v0.20.0 // indirect
+	golang.org/x/text v0.15.0 // indirect
+	golang.org/x/tools v0.17.0 // indirect
 	google.golang.org/api v0.132.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
 	google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 // indirect
 	google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 // indirect
 	google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect
 	google.golang.org/grpc v1.56.3 // indirect
-	google.golang.org/protobuf v1.32.0 // indirect
+	google.golang.org/protobuf v1.33.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	rsc.io/tmplfunc v0.0.3 // indirect
 )
 
-replace github.com/ethereum/go-ethereum v1.13.8 => github.com/ethereum-optimism/op-geth v1.101308.2-rc.2
+replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101315.1-rc.5
 
 replace github.com/ethereum-optimism/optimism => ../.
diff --git a/op-ufm/go.sum b/op-ufm/go.sum
index a40bd9ece1ed..d5fb1dd986fd 100644
--- a/op-ufm/go.sum
+++ b/op-ufm/go.sum
@@ -76,22 +76,22 @@ github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6
 github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
 github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
 github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/ethereum-optimism/op-geth v1.101308.2-rc.2 h1:Tjm2n7/actyINbRIbqeDS+SyWAcIl+pRfOHODwW7lpQ=
-github.com/ethereum-optimism/op-geth v1.101308.2-rc.2/go.mod h1:RPqVhnX00rJNys/YRDK4Wl4PvS6dgFrLqhsopIZOhEw=
-github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240306093353-c557df8e6f41 h1:WKJvsRyW/YNgyT0P2x5U530ITOY8Dv9TrZnbliqSXd8=
-github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240306093353-c557df8e6f41/go.mod h1:7xh2awFQqsiZxFrHKTgEd+InVfDRrkKVUIuK8SAFHp0=
+github.com/ethereum-optimism/op-geth v1.101315.1-rc.5 h1:yaBvV/GfDuZOecDsGXyzsa/g8+AEBG+Bj1+NFyZRkdw=
+github.com/ethereum-optimism/op-geth v1.101315.1-rc.5/go.mod h1:8tQ6r0e1NNJbSVHzYKafQqf62gV9BzZR+SKkXRckjLM=
+github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240522134500-19555bdbdc95 h1:GjXKQg6u6WkEIcY0dvW2IKhMRY8cVjwdw+rNKhduAo8=
+github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240522134500-19555bdbdc95/go.mod h1:7xh2awFQqsiZxFrHKTgEd+InVfDRrkKVUIuK8SAFHp0=
 github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY=
 github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
-github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ=
-github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
+github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA=
+github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
@@ -106,8 +106,9 @@ github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnR
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
 github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
-github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
 github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
+github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
+github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
 github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
 github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
@@ -161,13 +162,13 @@ github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56
 github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=
 github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
 github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
-github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
-github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
+github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY=
 github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE=
-github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw=
-github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc=
+github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4=
+github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc=
 github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
 github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
 github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU=
@@ -180,8 +181,8 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd
 github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
-github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI=
+github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -205,8 +206,9 @@ github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iP
 github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
 github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
+github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
 github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
 github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -281,8 +283,8 @@ github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsr
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
-github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
+github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
 go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
 go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
@@ -291,11 +293,11 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
-golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
+golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ=
-golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE=
+golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=
+golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -324,8 +326,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
-golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ=
@@ -358,23 +360,24 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
-golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
+golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
-golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
+golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
+golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
+golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
 golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -387,8 +390,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY
 golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA=
-golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
+golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc=
+golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -431,8 +434,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
-google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
+google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
diff --git a/op-wheel/Dockerfile b/op-wheel/Dockerfile
deleted file mode 100644
index 30f7a8a3713a..000000000000
--- a/op-wheel/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest
-FROM $OP_STACK_GO_BUILDER as builder
-# See "make golang-docker" and /ops/docker/op-stack-go
-FROM alpine:3.18
-
-COPY --from=builder /app/op-wheel/bin/op-wheel /usr/local/bin
-
-CMD ["op-wheel"]
diff --git a/op-wheel/Dockerfile.dockerignore b/op-wheel/Dockerfile.dockerignore
deleted file mode 100644
index 4f26140750a0..000000000000
--- a/op-wheel/Dockerfile.dockerignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# ignore everything but the dockerfile, the op-stack-go base image performs the build
-*
diff --git a/op-wheel/Makefile b/op-wheel/Makefile
index 3fe0c0a85b58..06d114012022 100644
--- a/op-wheel/Makefile
+++ b/op-wheel/Makefile
@@ -1,6 +1,6 @@
 GITCOMMIT ?= $(shell git rev-parse HEAD)
 GITDATE ?= $(shell git show -s --format='%ct')
-VERSION := v0.0.0
+VERSION ?= v0.0.0
 
 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT)
 LDFLAGSSTRING +=-X main.GitDate=$(GITDATE)
diff --git a/op-wheel/cheat/cheat.go b/op-wheel/cheat/cheat.go
index 1bf4c4bad97d..61c8d74d09f3 100644
--- a/op-wheel/cheat/cheat.go
+++ b/op-wheel/cheat/cheat.go
@@ -10,9 +10,8 @@ import (
 	"path/filepath"
 	"strings"
 
-	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/holiman/uint256"
 
-	"github.com/ethereum-optimism/optimism/op-service/eth"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
 	"github.com/ethereum/go-ethereum/consensus/beacon"
@@ -20,11 +19,14 @@ import (
 	"github.com/ethereum/go-ethereum/core"
 	"github.com/ethereum/go-ethereum/core/rawdb"
 	"github.com/ethereum/go-ethereum/core/state"
+	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/core/vm"
 	"github.com/ethereum/go-ethereum/ethdb"
 	"github.com/ethereum/go-ethereum/params"
 	"github.com/ethereum/go-ethereum/rlp"
 	"github.com/ethereum/go-ethereum/trie"
+
+	"github.com/ethereum-optimism/optimism/op-service/eth"
 )
 
 var HundredETH = big.NewInt(0).Mul(big.NewInt(100), big.NewInt(params.Ether))
@@ -335,7 +337,7 @@ func StoragePatch(patch io.Reader, address common.Address) HeadFn {
 
 func SetBalance(addr common.Address, amount *big.Int) HeadFn {
 	return func(_ *types.Header, headState *state.StateDB) error {
-		headState.SetBalance(addr, amount)
+		headState.SetBalance(addr, uint256.MustFromBig(amount))
 		return nil
 	}
 }
diff --git a/op-wheel/engine/engine.go b/op-wheel/engine/engine.go
index c715d659afb8..f76fc753ac4b 100644
--- a/op-wheel/engine/engine.go
+++ b/op-wheel/engine/engine.go
@@ -331,7 +331,7 @@ func Copy(ctx context.Context, copyFrom client.RPC, copyTo *sources.EngineAPICli
 	return nil
 }
 
-// CopyPaylod takes the execution payload at number & applies it via NewPayload to copyTo
+// CopyPayload takes the execution payload at number & applies it via NewPayload to copyTo
 func CopyPayload(ctx context.Context, number uint64, copyFrom client.RPC, copyTo *sources.EngineAPIClient) error {
 	copyHead, err := getBlock(ctx, copyFrom, methodEthGetBlockByNumber, hexutil.EncodeUint64(number))
 	if err != nil {
diff --git a/ops-bedrock/Dockerfile.l1 b/ops-bedrock/Dockerfile.l1
index 1cf2c0229903..d3226b8db24e 100644
--- a/ops-bedrock/Dockerfile.l1
+++ b/ops-bedrock/Dockerfile.l1
@@ -1,4 +1,4 @@
-FROM ethereum/client-go:v1.13.14
+FROM ethereum/client-go:v1.13.15
 
 RUN apk add --no-cache jq bash
 
diff --git a/ops-bedrock/docker-compose.yml b/ops-bedrock/docker-compose.yml
index 3d8aef0b848f..64a8007b3396 100644
--- a/ops-bedrock/docker-compose.yml
+++ b/ops-bedrock/docker-compose.yml
@@ -7,19 +7,13 @@ version: '3.4'
 volumes:
   l1_data:
   l2_data:
+  safedb_data:
+  challenger_data:
+  da_data:
   op_log:
 
 
 services:
-  op_stack_go_builder:  # Not an actual service, but builds the prerequisite go images
-    build:
-      context: ../
-      dockerfile: ops/docker/op-stack-go/Dockerfile
-      args:
-        GIT_COMMIT: "dev"
-        GIT_DATE: "0"
-    image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet
-    entrypoint: ["echo", "build complete"]
 
   l1:
     build:
@@ -56,14 +50,12 @@ services:
 
   op-node:
     depends_on:
-      - op_stack_go_builder
       - l1
       - l2
     build:
       context: ../
-      dockerfile: ./op-node/Dockerfile
-      args:
-        OP_STACK_GO_BUILDER: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet
+      dockerfile: ops/docker/op-stack-go/Dockerfile
+      target: op-node-target
     image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:devnet
     command: >
       op-node
@@ -89,12 +81,17 @@ services:
       --metrics.port=7300
       --pprof.enabled
       --rpc.enable-admin
+      --safedb.path=/db
+      --plasma.enabled=${PLASMA_ENABLED}
+      --plasma.da-service=${PLASMA_DA_SERVICE}
+      --plasma.da-server=http://da-server:3100
     ports:
       - "7545:8545"
       - "9003:9003"
       - "7300:7300"
       - "6060:6060"
     volumes:
+      - "safedb_data:/db"
       - "${PWD}/p2p-sequencer-key.txt:/config/p2p-sequencer-key.txt"
       - "${PWD}/p2p-node-key.txt:/config/p2p-node-key.txt"
       - "${PWD}/test-jwt-secret.txt:/config/test-jwt-secret.txt"
@@ -103,15 +100,13 @@ services:
 
   op-proposer:
     depends_on:
-      - op_stack_go_builder
       - l1
       - l2
       - op-node
     build:
       context: ../
-      dockerfile: ./op-proposer/Dockerfile
-      args:
-        OP_STACK_GO_BUILDER: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet
+      dockerfile: ops/docker/op-stack-go/Dockerfile
+      target: op-proposer-target
     image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-proposer:devnet
     ports:
       - "6062:6060"
@@ -135,15 +130,13 @@ services:
 
   op-batcher:
     depends_on:
-      - op_stack_go_builder
       - l1
       - l2
       - op-node
     build:
       context: ../
-      dockerfile: ./op-batcher/Dockerfile
-      args:
-        OP_STACK_GO_BUILDER: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet
+      dockerfile: ops/docker/op-stack-go/Dockerfile
+      target: op-batcher-target
     image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:devnet
     ports:
       - "6061:6060"
@@ -163,19 +156,23 @@ services:
       OP_BATCHER_METRICS_ENABLED: "true"
       OP_BATCHER_RPC_ENABLE_ADMIN: "true"
       OP_BATCHER_BATCH_TYPE: 0
+      OP_BATCHER_PLASMA_ENABLED: "${PLASMA_ENABLED}"
+      OP_BATCHER_PLASMA_DA_SERVICE: "${PLASMA_DA_SERVICE}"
+      OP_BATCHER_PLASMA_DA_SERVER: "http://da-server:3100"
 
   op-challenger:
     depends_on:
-      - op_stack_go_builder
       - l1
       - l2
       - op-node
     build:
       context: ../
-      dockerfile: ./op-challenger/Dockerfile
-      args:
-        OP_STACK_GO_BUILDER: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet
+      dockerfile: ops/docker/op-stack-go/Dockerfile
+      target: op-challenger-target
     image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:devnet
+    volumes:
+      - "challenger_data:/db"
+      - "../op-program/bin:/op-program"
     environment:
       OP_CHALLENGER_L1_ETH_RPC: http://l1:8545
       # Note: this will need to be updated to point to a L1 consensus node when there is one in the devnet
@@ -186,17 +183,49 @@ services:
       # The devnet can't set the absolute prestate output root because the contracts are deployed in L1 genesis
       # before the L2 genesis is known.
       OP_CHALLENGER_UNSAFE_ALLOW_INVALID_PRESTATE: "true"
-      OP_CHALLENGER_DATADIR: temp/challenger-data
+      OP_CHALLENGER_DATADIR: /db
       OP_CHALLENGER_CANNON_ROLLUP_CONFIG: ./.devnet/rollup.json
       OP_CHALLENGER_CANNON_L2_GENESIS: ./.devnet/genesis-l2.json
       OP_CHALLENGER_CANNON_BIN: ./cannon/bin/cannon
-      OP_CHALLENGER_CANNON_SERVER: ./op-program/bin/op-program
-      OP_CHALLENGER_CANNON_PRESTATE: ./op-program/bin/prestate.json
-      OP_CHALLENGER_CANNON_L2: http://l2:8545
+      OP_CHALLENGER_CANNON_SERVER: /op-program/op-program
+      OP_CHALLENGER_CANNON_PRESTATE: /op-program/prestate.json
+      OP_CHALLENGER_L2_ETH_RPC: http://l2:8545
       OP_CHALLENGER_MNEMONIC: test test test test test test test test test test test junk
       OP_CHALLENGER_HD_PATH: "m/44'/60'/0'/0/4"
       OP_CHALLENGER_NUM_CONFIRMATIONS: 1
 
+  da-server:
+    image: us-docker.pkg.dev/oplabs-tools-artifacts/images/da-server:devnet
+    build:
+      context: ../
+      dockerfile: ops/docker/op-stack-go/Dockerfile
+      target: da-server-target
+    command: >
+      da-server
+      --file.path=/data
+      --addr=0.0.0.0
+      --port=3100
+      --log.level=debug
+      --generic-commitment="${PLASMA_GENERIC_DA}"
+    ports:
+      - "3100:3100"
+    volumes:
+      - "da_data:/data"
+
+  sentinel:
+    image: quarry/sentinel # TODO(10141): We need a public image for this (sentinel is out of repo)
+    volumes:
+      - "${PWD}/../.devnet/rollup.json:/rollup.json"
+    # private-key is mnemonic index 5 of the test mnemonic.
+    command: >
+      sentinel
+      --datadir=data
+      --l1-rpc-http=http://l1:8545
+      --l1-rpc-ws=ws://l1:8546
+      --da-storage-uri=http://da-server:3100
+      --private-key=0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba
+      --config=/rollup.json
+
   artifact-server:
     depends_on:
       - l1
diff --git a/ops/check-changed/requirements.txt b/ops/check-changed/requirements.txt
index 943922a02a86..c58d1db7352b 100644
--- a/ops/check-changed/requirements.txt
+++ b/ops/check-changed/requirements.txt
@@ -2,11 +2,11 @@ certifi==2023.7.22
 cffi==1.15.1
 charset-normalizer==2.1.1
 Deprecated==1.2.13
-idna==3.4
+idna==3.7
 pycparser==2.21
 PyGithub==1.57
 PyJWT==2.6.0
 PyNaCl==1.5.0
-requests==2.31.0
+requests==2.32.0
 urllib3==1.26.18
 wrapt==1.14.1
diff --git a/ops/docker/Dockerfile.packages b/ops/docker/Dockerfile.packages
index a4ba78875fc3..c61b533e1835 100644
--- a/ops/docker/Dockerfile.packages
+++ b/ops/docker/Dockerfile.packages
@@ -17,7 +17,7 @@ FROM alpine:3.16 as manifests
 RUN apk add coreutils
 
 WORKDIR /tmp
-COPY pnpm-lock.yaml pnpm-workspace.yaml .nvmrc package.json ./src/
+COPY pnpm-lock.yaml pnpm-workspace.yaml .nvmrc package.json .pnpmfile.cjs ./src/
 COPY packages src/packages/
 RUN mkdir manifests && \
   cd src && \
@@ -28,7 +28,9 @@ RUN mkdir manifests && \
   # pnpm-workspace.yaml
   cp pnpm-workspace.yaml ../manifests/ && \
   # .nvmrc
-  cp .nvmrc ../manifests/
+  cp .nvmrc ../manifests/ && \
+  # .pnpmfile.cjs
+  cp .pnpmfile.cjs ../manifests/
 
 FROM us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest as foundry
 # bullseye-slim is debian based
@@ -93,33 +95,37 @@ WORKDIR /opt/optimism/packages/chain-mon
 # TODO keeping the rest of these here for now because they are being used
 # but we should really delete them we only need one image
 FROM base as balance-mon
-WORKDIR /opt/optimism/packages/chain-mon
+WORKDIR /opt/optimism/packages/chain-mon/internal
 CMD ["start:balance-mon"]
 
 FROM base as drippie-mon
-WORKDIR /opt/optimism/packages/chain-mon
+WORKDIR /opt/optimism/packages/chain-mon/contrib
 CMD ["start:drippie-mon"]
 
 from base as fault-mon
-WORKDIR /opt/optimism/packages/chain-mon
+WORKDIR /opt/optimism/packages/chain-mon/
 CMD ["start:fault-mon"]
 
 from base as multisig-mon
-WORKDIR /opt/optimism/packages/multisig-mon
+WORKDIR /opt/optimism/packages/internal/multisig-mon
 CMD ["start:multisig-mon"]
 
 FROM base as replica-mon
-WORKDIR /opt/optimism/packages/chain-mon
+WORKDIR /opt/optimism/packages/chain-mon/contrib
 CMD ["start:replica-mon"]
 
 FROM base as wallet-mon
-WORKDIR /opt/optimism/packages/chain-mon
+WORKDIR /opt/optimism/packages/chain-mon/contrib
 CMD ["start:wallet-mon"]
 
 FROM base as wd-mon
-WORKDIR /opt/optimism/packages/chain-mon
+WORKDIR /opt/optimism/packages/chain-mon/
 CMD ["start:wd-mon"]
 
+FROM base as faultproof-wd-mon
+WORKDIR /opt/optimism/packages/chain-mon/
+CMD ["start:faultproof-wd-mon"]
+
 FROM base as contracts-bedrock
 WORKDIR /opt/optimism/packages/contracts-bedrock
 CMD ["deploy"]
diff --git a/ops/docker/ci-builder/Dockerfile b/ops/docker/ci-builder/Dockerfile
index 5ef307482018..7d95ed9fdada 100644
--- a/ops/docker/ci-builder/Dockerfile
+++ b/ops/docker/ci-builder/Dockerfile
@@ -28,14 +28,13 @@ COPY ./versions.json ./versions.json
 COPY ./ops/scripts/install-foundry.sh ./install-foundry.sh
 
 RUN curl -L https://foundry.paradigm.xyz | bash
-RUN source $HOME/.profile && \
-    ./install-foundry.sh && \
-    cargo install svm-rs
+RUN source $HOME/.profile && ./install-foundry.sh
 
 RUN strip /root/.foundry/bin/forge && \
   strip /root/.foundry/bin/cast && \
   strip /root/.foundry/bin/anvil && \
-  strip /root/.cargo/bin/svm
+  strip /root/.cargo/bin/svm && \
+  strip /root/.cargo/bin/just
 
 FROM --platform=linux/amd64 debian:bullseye-slim as go-build
 
@@ -55,16 +54,18 @@ COPY ./versions.json ./versions.json
 RUN go install github.com/ethereum/go-ethereum/cmd/abigen@$(jq -r .abigen < versions.json)
 RUN go install github.com/ethereum/go-ethereum/cmd/geth@$(jq -r .geth < versions.json)
 
-RUN go install gotest.tools/gotestsum@latest
+RUN go install gotest.tools/gotestsum@v1.11.0
 RUN go install github.com/vektra/mockery/v2@v2.28.1
 RUN go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.54.2
+RUN go install github.com/mikefarah/yq/v4@v4.43.1
 
 # Strip binaries to reduce size
 RUN strip /go/bin/gotestsum && \
   strip /go/bin/mockery && \
   strip /go/bin/golangci-lint && \
   strip /go/bin/abigen && \
-  strip /go/bin/geth
+  strip /go/bin/geth && \
+  strip /go/bin/yq
 
 FROM --platform=linux/amd64 debian:bullseye-slim as base-builder
 
@@ -82,12 +83,14 @@ COPY --from=go-build /go/bin/mockery /go/bin/mockery
 COPY --from=go-build /go/bin/golangci-lint /go/bin/golangci-lint
 COPY --from=go-build /go/bin/abigen /usr/local/bin/abigen
 COPY --from=go-build /go/bin/geth /usr/local/bin/geth
+COPY --from=go-build /go/bin/yq /go/bin/yq
 
 # copy tools
 COPY --from=rust-build /root/.foundry/bin/forge /usr/local/bin/forge
 COPY --from=rust-build /root/.foundry/bin/cast /usr/local/bin/cast
 COPY --from=rust-build /root/.foundry/bin/anvil /usr/local/bin/anvil
 COPY --from=rust-build /root/.cargo/bin/svm /usr/local/bin/svm
+COPY --from=rust-build /root/.cargo/bin/just /usr/local/bin/just
 
 COPY .nvmrc .nvmrc
 COPY ./versions.json ./versions.json
@@ -96,7 +99,7 @@ ENV NODE_MAJOR=20
 
 RUN /bin/sh -c set -eux; \
   apt-get update; \
-  apt-get install -y --no-install-recommends bash curl openssh-client git build-essential ca-certificates jq gnupg binutils-mips-linux-gnu python3 python3-pip; \
+  apt-get install -y --no-install-recommends bash curl openssh-client git build-essential ca-certificates jq gnupg binutils-mips-linux-gnu python3 python3-pip python3-setuptools; \
   mkdir -p /etc/apt/keyrings; \
   curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg; \
   echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list; \
diff --git a/ops/docker/op-stack-go/Dockerfile b/ops/docker/op-stack-go/Dockerfile
index ee3cbc95e383..e5dc595ea094 100644
--- a/ops/docker/op-stack-go/Dockerfile
+++ b/ops/docker/op-stack-go/Dockerfile
@@ -1,3 +1,17 @@
+# automatically set by buildkit, can be changed with --platform flag
+# see https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope
+# TARGETOS
+# TARGETARCH
+# TARGETPLATFORM
+# BUILDPLATFORM
+ARG TARGETOS
+ARG TARGETARCH
+
+# All target images use this as base image, and add the final build results.
+# It will default to the target platform.
+ARG TARGET_BASE_IMAGE=alpine:3.18
+
+# We may be cross-building for another platform. Specify which platform we need as builder.
 FROM --platform=$BUILDPLATFORM golang:1.21.3-alpine3.18 as builder
 
 RUN apk add --no-cache make gcc musl-dev linux-headers git jq bash
@@ -11,6 +25,7 @@ WORKDIR /app
 RUN echo "go mod cache: $(go env GOMODCACHE)"
 RUN echo "go build cache: $(go env GOCACHE)"
 
+# warm-up the cache
 RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build go mod download
 
 # NOTE: the Dockerfile.dockerignore file effectively describes all dependencies
@@ -23,67 +38,123 @@ COPY . /app
 ARG GIT_COMMIT
 ARG GIT_DATE
 
-ARG CANNON_VERSION=v0.0.0
-ARG OP_PROGRAM_VERSION=v0.0.0
-
-ARG OP_HEARTBEAT_VERSION=v0.0.0
-ARG OP_WHEEL_VERSION=v0.0.0
-
-ARG OP_NODE_VERSION=v0.0.0
-ARG OP_CHALLENGER_VERSION=v0.0.0
-ARG OP_DISPUTE_MON_VERSION=v0.0.0
-ARG OP_BATCHER_VERSION=v0.0.0
-ARG OP_PROPOSER_VERSION=v0.0.0
-ARG OP_CONDUCTOR_VERSION=v0.0.0
-
-
 # separate docker-builds:
 # - op-ufm
 # - proxyd
 # - any JS/TS/smart-contract builds
 
+# TODO: if the build involves optional CGO, then:
+# 1) we may have to disable CGO explicitly
+# 3) apk install cross-build gcc,
+#    and specify to go to use that, with the CC flag
+
 ARG TARGETOS TARGETARCH
 
 # Build the Go services, utilizing caches and share the many common packages.
 # The "id" defaults to the value of "target", the cache will thus be reused during this build.
 # "sharing" defaults to "shared", the cache will thus be available to other concurrent docker builds.
-
+FROM --platform=$BUILDPLATFORM builder as cannon-builder
+ARG CANNON_VERSION=v0.0.0
 RUN --mount=type=cache,target=/root/.cache/go-build cd cannon && make cannon  \
     GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$CANNON_VERSION"
+
+FROM --platform=$BUILDPLATFORM builder as op-program-builder
+ARG OP_PROGRAM_VERSION=v0.0.0
 # note: we only build the host, that's all the user needs. No Go MIPS cross-build in docker
 RUN --mount=type=cache,target=/root/.cache/go-build cd op-program && make op-program-host  \
     GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_PROGRAM_VERSION"
 
+FROM --platform=$BUILDPLATFORM builder as op-heartbeat-builder
+ARG OP_HEARTBEAT_VERSION=v0.0.0
 RUN --mount=type=cache,target=/root/.cache/go-build cd op-heartbeat && make op-heartbeat  \
     GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_HEARTBEAT_VERSION"
+
+FROM --platform=$BUILDPLATFORM builder as op-wheel-builder
+ARG OP_WHEEL_VERSION=v0.0.0
 RUN --mount=type=cache,target=/root/.cache/go-build cd op-wheel && make op-wheel  \
     GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE  VERSION="$OP_WHEEL_VERSION"
 
+FROM --platform=$BUILDPLATFORM builder as op-node-builder
+ARG OP_NODE_VERSION=v0.0.0
+RUN echo TARGETOS=$TARGETOS TARGETARCH=$TARGETARCH BUILDPLATFORM=$BUILDPLATFORM TARGETPLATFORM=$TARGETPLATFORM OP_NODE_VERSION=$OP_NODE_VERSION
 RUN --mount=type=cache,target=/root/.cache/go-build cd op-node && make op-node  \
     GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_NODE_VERSION"
+
+FROM --platform=$BUILDPLATFORM builder as op-challenger-builder
+ARG OP_CHALLENGER_VERSION=v0.0.0
 RUN --mount=type=cache,target=/root/.cache/go-build cd op-challenger && make op-challenger  \
     GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE  VERSION="$OP_CHALLENGER_VERSION"
+
+FROM --platform=$BUILDPLATFORM builder as op-dispute-mon-builder
+ARG OP_DISPUTE_MON_VERSION=v0.0.0
 RUN --mount=type=cache,target=/root/.cache/go-build cd op-dispute-mon && make op-dispute-mon  \
     GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE  VERSION="$OP_DISPUTE_MON_VERSION"
+
+FROM --platform=$BUILDPLATFORM builder as op-batcher-builder
+ARG OP_BATCHER_VERSION=v0.0.0
 RUN --mount=type=cache,target=/root/.cache/go-build cd op-batcher && make op-batcher  \
     GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE  VERSION="$OP_BATCHER_VERSION"
+
+FROM --platform=$BUILDPLATFORM builder as op-proposer-builder
+ARG OP_PROPOSER_VERSION=v0.0.0
 RUN --mount=type=cache,target=/root/.cache/go-build cd op-proposer && make op-proposer  \
     GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE  VERSION="$OP_PROPOSER_VERSION"
+
+FROM --platform=$BUILDPLATFORM builder as op-conductor-builder
+ARG OP_CONDUCTOR_VERSION=v0.0.0
 RUN --mount=type=cache,target=/root/.cache/go-build cd op-conductor && make op-conductor  \
     GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE  VERSION="$OP_CONDUCTOR_VERSION"
 
-
-FROM alpine:3.18
-
-COPY --from=builder /app/cannon/bin/cannon /usr/local/bin/
-COPY --from=builder /app/op-program/bin/op-program /usr/local/bin/
-
-COPY --from=builder /app/op-heartbeat/bin/op-heartbeat /usr/local/bin/
-COPY --from=builder /app/op-wheel/bin/op-wheel /usr/local/bin/
-
-COPY --from=builder /app/op-node/bin/op-node /usr/local/bin/
-COPY --from=builder /app/op-challenger/bin/op-challenger /usr/local/bin/
-COPY --from=builder /app/op-dispute-mon/bin/op-dispute-mon /usr/local/bin/
-COPY --from=builder /app/op-batcher/bin/op-batcher /usr/local/bin/
-COPY --from=builder /app/op-proposer/bin/op-proposer /usr/local/bin/
-COPY --from=builder /app/op-conductor/bin/op-conductor /usr/local/bin/
+FROM --platform=$BUILDPLATFORM builder as da-server-builder
+RUN --mount=type=cache,target=/root/.cache/go-build cd op-plasma && make da-server  \
+    GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE
+
+FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as cannon-target
+COPY --from=cannon-builder /app/cannon/bin/cannon /usr/local/bin/
+CMD ["cannon"]
+
+FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-program-target
+COPY --from=op-program-builder /app/op-program/bin/op-program /usr/local/bin/
+CMD ["op-program"]
+
+FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-heartbeat-target
+COPY --from=op-heartbeat-builder /app/op-heartbeat/bin/op-heartbeat /usr/local/bin/
+CMD ["op-heartbeat"]
+
+FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-wheel-target
+COPY --from=op-wheel-builder /app/op-wheel/bin/op-wheel /usr/local/bin/
+CMD ["op-wheel"]
+
+FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-node-target
+COPY --from=op-node-builder /app/op-node/bin/op-node /usr/local/bin/
+CMD ["op-node"]
+
+FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-challenger-target
+COPY --from=op-challenger-builder /app/op-challenger/bin/op-challenger /usr/local/bin/
+# Make the bundled op-program the default cannon server
+COPY --from=op-program-builder /app/op-program/bin/op-program /usr/local/bin/
+ENV OP_CHALLENGER_CANNON_SERVER /usr/local/bin/op-program
+# Make the bundled cannon the default cannon executable
+COPY --from=cannon-builder /app/cannon/bin/cannon /usr/local/bin/
+ENV OP_CHALLENGER_CANNON_BIN /usr/local/bin/cannon
+CMD ["op-challenger"]
+
+FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-dispute-mon-target
+COPY --from=op-dispute-mon-builder /app/op-dispute-mon/bin/op-dispute-mon /usr/local/bin/
+CMD ["op-dispute-mon"]
+
+FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-batcher-target
+COPY --from=op-batcher-builder /app/op-batcher/bin/op-batcher /usr/local/bin/
+CMD ["op-batcher"]
+
+FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-proposer-target
+COPY --from=op-proposer-builder /app/op-proposer/bin/op-proposer /usr/local/bin/
+CMD ["op-proposer"]
+
+FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-conductor-target
+COPY --from=op-conductor-builder /app/op-conductor/bin/op-conductor /usr/local/bin/
+CMD ["op-conductor"]
+
+FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as da-server-target
+COPY --from=da-server-builder /app/op-plasma/bin/da-server /usr/local/bin/
+CMD ["da-server"]
diff --git a/ops/docker/op-stack-go/Dockerfile.dockerignore b/ops/docker/op-stack-go/Dockerfile.dockerignore
index 821978fb7992..9512fe9fbc7c 100644
--- a/ops/docker/op-stack-go/Dockerfile.dockerignore
+++ b/ops/docker/op-stack-go/Dockerfile.dockerignore
@@ -8,6 +8,7 @@
 !/op-bootnode
 !/op-chain-ops
 !/op-challenger
+!/packages/contracts-bedrock/snapshots
 !/op-dispute-mon
 !/op-conductor
 !/op-heartbeat
diff --git a/ops/scripts/ci-docker-tag-op-stack-release.sh b/ops/scripts/ci-docker-tag-op-stack-release.sh
index 62cf4b319dbd..b6c3cb6eb412 100755
--- a/ops/scripts/ci-docker-tag-op-stack-release.sh
+++ b/ops/scripts/ci-docker-tag-op-stack-release.sh
@@ -6,7 +6,7 @@ DOCKER_REPO=$1
 GIT_TAG=$2
 GIT_SHA=$3
 
-IMAGE_NAME=$(echo "$GIT_TAG" | grep -Eow '^(ci-builder(-rust)?|chain-mon|proxyd|indexer|ufm-[a-z0-9\-]*|op-[a-z0-9\-]*)' || true)
+IMAGE_NAME=$(echo "$GIT_TAG" | grep -Eow '^(ci-builder(-rust)?|chain-mon|proxyd|da-server|indexer|ufm-[a-z0-9\-]*|op-[a-z0-9\-]*)' || true)
 if [ -z "$IMAGE_NAME" ]; then
   echo "image name could not be parsed from git tag '$GIT_TAG'"
   exit 1
diff --git a/ops/scripts/install-foundry.sh b/ops/scripts/install-foundry.sh
index 5f1fc577e3b0..654ed6b87f76 100755
--- a/ops/scripts/install-foundry.sh
+++ b/ops/scripts/install-foundry.sh
@@ -39,11 +39,19 @@ if git rev-parse "$TAG" >/dev/null 2>&1; then
   foundryup -v "$TAG"
 else
   echo "Nightly tag doesn't exist! Building from source..."
-  foundryup -C "$SHA"
+  git checkout "$SHA"
+
+  # Use native `cargo` build to avoid any rustc environment variables `foundryup` sets. We explicitly
+  # ignore chisel, as it is not a part of `ci-builder`.
+  cargo build --bin forge --release
+  cargo build --bin cast --release
+  cargo build --bin anvil --release
+  mkdir -p ~/.foundry/bin
+  mv target/release/forge ~/.foundry/bin
+  mv target/release/cast ~/.foundry/bin
+  mv target/release/anvil ~/.foundry/bin
 fi
 
 # Remove the temporary foundry repo; Used just for checking the nightly tag's existence.
 rm -rf "$TMP_DIR"
 echo "Removed tempdir @ $TMP_DIR"
-
-
diff --git a/ops/scripts/parse_json_test_output.sh b/ops/scripts/parse_json_test_output.sh
new file mode 100755
index 000000000000..ee7030804316
--- /dev/null
+++ b/ops/scripts/parse_json_test_output.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+set -euo pipefail
+
+if [ "$#" -ne 2 ]; then
+    echo "Usage: $0  "
+    exit 1
+fi
+
+TEST_NAME="$1"
+JSON_FILE="$2"
+
+jq --raw-output --join-output --arg testName "${TEST_NAME}" 'select(.Test == $testName and .Action == "output").Output' "${JSON_FILE}"
diff --git a/ops/tag-service/tag-service.py b/ops/tag-service/tag-service.py
index b88a03ad1292..e27e081f5c64 100755
--- a/ops/tag-service/tag-service.py
+++ b/ops/tag-service/tag-service.py
@@ -25,6 +25,7 @@
     'op-heartbeat': '0.1.0',
     'ufm-metamask': '0.1.0',
     'op-contracts': '1.0.0',
+    'op-conductor': '0.0.0',
 }
 
 VALID_BUMPS = ('major', 'minor', 'patch', 'prerelease', 'finalize-prerelease')
diff --git a/ops/tag-service/tag-tool.py b/ops/tag-service/tag-tool.py
index ddab04e00a4f..ef3b68ed6cd9 100644
--- a/ops/tag-service/tag-tool.py
+++ b/ops/tag-service/tag-tool.py
@@ -14,12 +14,14 @@
     'op-dispute-mon',
     'op-proposer',
     'op-ufm',
+    'da-server',
     'proxyd',
     'op-heartbeat',
     'ufm-metamask',
     'op-contracts',
     'test',
     'op-stack', # special case for tagging op-node, op-batcher, and op-proposer together
+    'op-conductor',
 ]
 VERSION_PATTERN = '^{service}/v\\d+\\.\\d+\\.\\d+(-rc\\.\\d+)?$'
 GIT_TAG_COMMAND = 'git tag -a {tag} -m "{message}"'
diff --git a/package.json b/package.json
index 215b6ef9a934..472ac9d4df33 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
   "private": true,
   "engines": {
     "node": ">=16",
-    "pnpm": ">=8"
+    "pnpm": ">=9"
   },
   "scripts": {
     "clean": "pnpm recursive run clean; rm -rf node_modules packages/*/node_modules && echo 'Finished cleaning. Run `pnpm install && pnpm build` from root of repo to rebuild the repo.'",
@@ -69,13 +69,14 @@
     "husky": "^9.0.10",
     "lint-staged": "15.2.0",
     "mocha": "^10.2.0",
-    "nx": "18.0.4",
+    "nx": "18.2.2",
+    "nx-cloud": "latest",
     "nyc": "^15.1.0",
     "prettier": "^2.8.0",
     "rimraf": "^5.0.5",
     "ts-mocha": "^10.0.0",
-    "typescript": "^5.3.3",
-    "nx-cloud": "latest"
+    "typescript": "^5.4.5",
+    "wait-on": "^7.2.0"
   },
   "dependencies": {
     "@changesets/cli": "^2.27.1"
diff --git a/packages/chain-mon/CHANGELOG.md b/packages/chain-mon/CHANGELOG.md
index fd80a56235f0..bb0af76311f0 100644
--- a/packages/chain-mon/CHANGELOG.md
+++ b/packages/chain-mon/CHANGELOG.md
@@ -1,5 +1,31 @@
 # @eth-optimism/drippie-mon
 
+## 0.6.5
+
+### Patch Changes
+
+- Updated dependencies [[`799bc898bfb207e2ccd4b2027e3fb4db4372292b`](https://github.com/ethereum-optimism/optimism/commit/799bc898bfb207e2ccd4b2027e3fb4db4372292b)]:
+  - @eth-optimism/sdk@3.3.1
+
+## 0.6.4
+
+### Patch Changes
+
+- [#9964](https://github.com/ethereum-optimism/optimism/pull/9964) [`8241220898128e1f61064f22dcb6fdd0a5f043c3`](https://github.com/ethereum-optimism/optimism/commit/8241220898128e1f61064f22dcb6fdd0a5f043c3) Thanks [@roninjin10](https://github.com/roninjin10)! - Removed only-allow command from package.json
+
+- Updated dependencies [[`8241220898128e1f61064f22dcb6fdd0a5f043c3`](https://github.com/ethereum-optimism/optimism/commit/8241220898128e1f61064f22dcb6fdd0a5f043c3), [`ac5b061dfce6a9817b928a8703be9252daaeeca7`](https://github.com/ethereum-optimism/optimism/commit/ac5b061dfce6a9817b928a8703be9252daaeeca7), [`87093b0e9144a4709f11c7fbd631828847d891f9`](https://github.com/ethereum-optimism/optimism/commit/87093b0e9144a4709f11c7fbd631828847d891f9), [`372bca2257764be33797d67ddca9b53c3dd3c295`](https://github.com/ethereum-optimism/optimism/commit/372bca2257764be33797d67ddca9b53c3dd3c295)]:
+  - @eth-optimism/common-ts@0.8.9
+  - @eth-optimism/contracts-bedrock@0.17.2
+  - @eth-optimism/core-utils@0.13.2
+  - @eth-optimism/sdk@3.3.0
+
+## 0.6.3
+
+### Patch Changes
+
+- Updated dependencies [[`5fe797f183e502c1c7e91fc1e74dd3cc664ba22e`](https://github.com/ethereum-optimism/optimism/commit/5fe797f183e502c1c7e91fc1e74dd3cc664ba22e), [`3dc129fade77ddf9d45bb4c2ecd34360d1aa838a`](https://github.com/ethereum-optimism/optimism/commit/3dc129fade77ddf9d45bb4c2ecd34360d1aa838a)]:
+  - @eth-optimism/sdk@3.2.3
+
 ## 0.6.2
 
 ### Patch Changes
diff --git a/packages/chain-mon/src/drippie-mon/service.ts b/packages/chain-mon/contrib/drippie-mon/service.ts
similarity index 100%
rename from packages/chain-mon/src/drippie-mon/service.ts
rename to packages/chain-mon/contrib/drippie-mon/service.ts
diff --git a/packages/chain-mon/src/initialized-upgraded-mon/service.ts b/packages/chain-mon/contrib/initialized-upgraded-mon/service.ts
similarity index 97%
rename from packages/chain-mon/src/initialized-upgraded-mon/service.ts
rename to packages/chain-mon/contrib/initialized-upgraded-mon/service.ts
index 5fe302063dd7..32249797a35d 100644
--- a/packages/chain-mon/src/initialized-upgraded-mon/service.ts
+++ b/packages/chain-mon/contrib/initialized-upgraded-mon/service.ts
@@ -10,7 +10,6 @@ import { getChainId, compareAddrs } from '@eth-optimism/core-utils'
 import { Provider, TransactionResponse } from '@ethersproject/abstract-provider'
 import mainnetConfig from '@eth-optimism/contracts-bedrock/deploy-config/mainnet.json'
 import sepoliaConfig from '@eth-optimism/contracts-bedrock/deploy-config/sepolia.json'
-import goerliConfig from '@eth-optimism/contracts-bedrock/deploy-config/goerli.json'
 
 import { version } from '../../package.json'
 
@@ -31,10 +30,6 @@ const networks = {
     name: 'op-sepolia',
     l1StartingBlockTag: null,
   },
-  5: {
-    name: 'goerli',
-    l1StartingBlockTag: goerliConfig.l1StartingBlockTag,
-  },
   420: {
     name: 'op-goerli',
     l1StartingBlockTag: null,
diff --git a/packages/chain-mon/src/replica-mon/README.md b/packages/chain-mon/contrib/replica-mon/README.md
similarity index 100%
rename from packages/chain-mon/src/replica-mon/README.md
rename to packages/chain-mon/contrib/replica-mon/README.md
diff --git a/packages/chain-mon/src/replica-mon/index.ts b/packages/chain-mon/contrib/replica-mon/index.ts
similarity index 100%
rename from packages/chain-mon/src/replica-mon/index.ts
rename to packages/chain-mon/contrib/replica-mon/index.ts
diff --git a/packages/chain-mon/src/replica-mon/service.ts b/packages/chain-mon/contrib/replica-mon/service.ts
similarity index 100%
rename from packages/chain-mon/src/replica-mon/service.ts
rename to packages/chain-mon/contrib/replica-mon/service.ts
diff --git a/packages/chain-mon/src/wallet-mon/service.ts b/packages/chain-mon/contrib/wallet-mon/service.ts
similarity index 90%
rename from packages/chain-mon/src/wallet-mon/service.ts
rename to packages/chain-mon/contrib/wallet-mon/service.ts
index 819f18333dc1..6aa97394e8d8 100644
--- a/packages/chain-mon/src/wallet-mon/service.ts
+++ b/packages/chain-mon/contrib/wallet-mon/service.ts
@@ -9,7 +9,6 @@ import {
 import { getChainId, compareAddrs } from '@eth-optimism/core-utils'
 import { Provider, TransactionResponse } from '@ethersproject/abstract-provider'
 import mainnetConfig from '@eth-optimism/contracts-bedrock/deploy-config/mainnet.json'
-import goerliConfig from '@eth-optimism/contracts-bedrock/deploy-config/goerli.json'
 
 import { version } from '../../package.json'
 
@@ -30,22 +29,6 @@ const networks = {
       },
     ],
   },
-  10: {
-    name: 'goerli',
-    l1StartingBlockTag: goerliConfig.l1StartingBlockTag,
-    accounts: [
-      {
-        label: 'Proposer',
-        wallet: goerliConfig.l2OutputOracleProposer,
-        target: '0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0',
-      },
-      {
-        label: 'Batcher',
-        wallet: goerliConfig.batchSenderAddress,
-        target: goerliConfig.batchInboxAddress,
-      },
-    ],
-  },
 }
 
 type WalletMonOptions = {
diff --git a/packages/chain-mon/src/balance-mon/service.ts b/packages/chain-mon/internal/balance-mon/service.ts
similarity index 100%
rename from packages/chain-mon/src/balance-mon/service.ts
rename to packages/chain-mon/internal/balance-mon/service.ts
diff --git a/packages/chain-mon/src/multisig-mon/service.ts b/packages/chain-mon/internal/multisig-mon/service.ts
similarity index 94%
rename from packages/chain-mon/src/multisig-mon/service.ts
rename to packages/chain-mon/internal/multisig-mon/service.ts
index bb50d18b3d9b..6b406a43dbf1 100644
--- a/packages/chain-mon/src/multisig-mon/service.ts
+++ b/packages/chain-mon/internal/multisig-mon/service.ts
@@ -10,8 +10,8 @@ import {
 import { Provider } from '@ethersproject/abstract-provider'
 import { ethers } from 'ethers'
 
-import Safe from '../abi/IGnosisSafe.0.8.19.json'
-import OptimismPortal from '../abi/OptimismPortal.json'
+import Safe from '../../src/abi/IGnosisSafe.0.8.19.json'
+import OptimismPortal from '../../src/abi/OptimismPortal.json'
 import { version } from '../../package.json'
 
 type MultisigMonOptions = {
@@ -160,18 +160,20 @@ export class MultisigMonService extends BaseServiceV2<
         `OP_SERVICE_ACCOUNT_TOKEN=${this.options.onePassServiceToken} op item list --format json --vault="${account.vault}"`,
         (error, stdout, stderr) => {
           if (error) {
-            this.logger.error(`got unexpected error from onepass: ${error}`, {
+            this.logger.error(`got unexpected error from onepass:`, {
               section: 'onePassNonce',
               name: 'getOnePassNonce',
             })
             return
           }
           if (stderr) {
-            this.logger.error(`got unexpected error from onepass`, {
-              section: 'onePassNonce',
-              name: 'getOnePassNonce',
-              stderr,
-            })
+            this.logger.error(
+              `got unexpected error (from the stderr) from onepass`,
+              {
+                section: 'onePassNonce',
+                name: 'getOnePassNonce',
+              }
+            )
             return
           }
           const items = JSON.parse(stdout)
diff --git a/packages/chain-mon/package.json b/packages/chain-mon/package.json
index 540aaf3f7916..26a9073656c6 100644
--- a/packages/chain-mon/package.json
+++ b/packages/chain-mon/package.json
@@ -1,7 +1,7 @@
 {
   "private": true,
   "name": "@eth-optimism/chain-mon",
-  "version": "0.6.2",
+  "version": "0.6.5",
   "description": "[Optimism] Chain monitoring services",
   "main": "dist/index",
   "types": "dist/index",
@@ -9,22 +9,24 @@
     "dist/*"
   ],
   "scripts": {
-    "dev:balance-mon": "tsx watch ./src/balance-mon/service.ts",
-    "dev:drippie-mon": "tsx watch ./src/drippie-mon/service.ts",
+    "dev:balance-mon": "tsx watch ./internal/balance-mon/service.ts",
+    "dev:drippie-mon": "tsx watch ./contrib/drippie/service.ts",
     "dev:fault-mon": "tsx watch ./src/fault-mon/service.ts",
-    "dev:multisig-mon": "tsx watch ./src/multisig-mon/service.ts",
-    "dev:replica-mon": "tsx watch ./src/replica-mon/service.ts",
-    "dev:wallet-mon": "tsx watch ./src/wallet-mon/service.ts",
+    "dev:multisig-mon": "tsx watch ./internal/multisig-mon/service.ts",
+    "dev:replica-mon": "tsx watch ./contrib/replica-mon/service.ts",
+    "dev:wallet-mon": "tsx watch ./contrib/wallet-mon/service.ts",
     "dev:wd-mon": "tsx watch ./src/wd-mon/service.ts",
-    "dev:initialized-upgraded-mon": "tsx watch ./src/initialized-upgraded-mon/service.ts",
-    "start:balance-mon": "tsx ./src/balance-mon/service.ts",
-    "start:drippie-mon": "tsx ./src/drippie-mon/service.ts",
+    "dev:faultproof-wd-mon": "tsx ./src/faultproof-wd-mon/service.ts",
+    "dev:initialized-upgraded-mon": "tsx watch ./contrib/initialized-upgraded-mon/service.ts",
+    "start:balance-mon": "tsx ./internal/balance-mon/service.ts",
+    "start:drippie-mon": "tsx ./contrib/drippie/service.ts",
     "start:fault-mon": "tsx ./src/fault-mon/service.ts",
-    "start:multisig-mon": "tsx ./src/multisig-mon/service.ts",
-    "start:replica-mon": "tsx ./src/replica-mon/service.ts",
-    "start:wallet-mon": "tsx ./src/wallet-mon/service.ts",
+    "start:multisig-mon": "tsx ./internal/multisig-mon/service.ts",
+    "start:replica-mon": "tsx ./contrib/replica-mon/service.ts",
+    "start:wallet-mon": "tsx ./contrib/wallet-mon/service.ts",
     "start:wd-mon": "tsx ./src/wd-mon/service.ts",
-    "start:initialized-upgraded-mon": "tsx ./src/initialized-upgraded-mon/service.ts",
+    "start:faultproof-wd-mon": "tsx ./src/faultproof-wd-mon/service.ts",
+    "start:initialized-upgraded-mon": "tsx ./contrib/initialized-upgraded-mon/service.ts",
     "test": "hardhat test",
     "test:coverage": "nyc hardhat test && nyc merge .nyc_output coverage.json",
     "build": "tsc -p ./tsconfig.json",
@@ -47,11 +49,11 @@
     "url": "https://github.com/ethereum-optimism/optimism.git"
   },
   "dependencies": {
-    "@eth-optimism/common-ts": "workspace:*",
+    "@eth-optimism/common-ts": "^0.8.9",
     "@eth-optimism/contracts-bedrock": "workspace:*",
     "@eth-optimism/contracts-periphery": "1.0.8",
-    "@eth-optimism/core-utils": "workspace:*",
-    "@eth-optimism/sdk": "workspace:*",
+    "@eth-optimism/core-utils": "^0.13.2",
+    "@eth-optimism/sdk": "^3.3.1",
     "@types/dateformat": "^5.0.0",
     "chai-as-promised": "^7.1.1",
     "dateformat": "^4.5.1",
@@ -66,4 +68,4 @@
     "ts-node": "^10.9.2",
     "tsx": "^4.7.0"
   }
-}
\ No newline at end of file
+}
diff --git a/packages/chain-mon/src/fault-mon/service.ts b/packages/chain-mon/src/fault-mon/service.ts
index 63ef1cc95229..b86f406c9125 100644
--- a/packages/chain-mon/src/fault-mon/service.ts
+++ b/packages/chain-mon/src/fault-mon/service.ts
@@ -151,7 +151,7 @@ export class FaultDetector extends BaseServiceV2 {
         address: portalAddress,
         signerOrProvider: this.options.l1RpcProvider,
       })
-      contracts.L2OutputOracle = await portalContract.L2_ORACLE()
+      contracts.L2OutputOracle = await portalContract.l2Oracle()
     }
 
     // ... for a known chain ids without an override, the L2OutputOracle will already
diff --git a/packages/chain-mon/src/faultproof-wd-mon/constants.ts b/packages/chain-mon/src/faultproof-wd-mon/constants.ts
new file mode 100644
index 000000000000..0021c0de2606
--- /dev/null
+++ b/packages/chain-mon/src/faultproof-wd-mon/constants.ts
@@ -0,0 +1,21 @@
+import { L2ChainID } from '@eth-optimism/sdk'
+
+// TODO: Consider moving to `@eth-optimism/constants` and generating from superchain registry.
+// @see https://github.com/ethereum-optimism/optimism/pull/9041
+
+/**
+ * Mapping of L2ChainIDs to the L1 block numbers where the wd-mon service should start looking for
+ * withdrawals by default. L1 block numbers here are based on the block number in which the
+ * OptimismPortal proxy contract was deployed to L1.
+ */
+export const DEFAULT_STARTING_BLOCK_NUMBERS: {
+  [ChainID in L2ChainID]?: number
+} = {
+  [L2ChainID.OPTIMISM]: 17365802 as const,
+  [L2ChainID.OPTIMISM_GOERLI]: 8299684 as const,
+  [L2ChainID.OPTIMISM_SEPOLIA]: 4071248 as const,
+  [L2ChainID.BASE_MAINNET]: 17482143 as const,
+  [L2ChainID.BASE_GOERLI]: 8411116 as const,
+  [L2ChainID.BASE_SEPOLIA]: 4370901 as const,
+  [L2ChainID.ZORA_MAINNET]: 17473938 as const,
+}
diff --git a/packages/chain-mon/src/faultproof-wd-mon/service.ts b/packages/chain-mon/src/faultproof-wd-mon/service.ts
new file mode 100644
index 000000000000..d4590f805d4b
--- /dev/null
+++ b/packages/chain-mon/src/faultproof-wd-mon/service.ts
@@ -0,0 +1,556 @@
+import {
+  BaseServiceV2,
+  StandardOptions,
+  ExpressRouter,
+  Gauge,
+  validators,
+  waitForProvider,
+} from '@eth-optimism/common-ts'
+import {
+  getOEContract,
+  DEFAULT_L2_CONTRACT_ADDRESSES,
+  makeStateTrieProof,
+  toJsonRpcProvider,
+} from '@eth-optimism/sdk'
+import { getChainId, sleep, toRpcHexString } from '@eth-optimism/core-utils'
+import { Provider } from '@ethersproject/abstract-provider'
+import { ethers } from 'ethers'
+import dateformat from 'dateformat'
+
+import { version } from '../../package.json'
+import { DEFAULT_STARTING_BLOCK_NUMBERS } from './constants'
+
+type Options = {
+  l1RpcProvider: Provider
+  l2RpcProvider: Provider
+  optimismPortalAddress: string
+  l2ToL1MessagePasserAddress: string
+  startBlockNumber: number
+  eventBlockRange: number
+  sleepTimeMs: number
+}
+
+type Metrics = {
+  highestCheckedBlockNumber: Gauge
+  highestKnownBlockNumber: Gauge
+  withdrawalsValidated: Gauge
+  invalidProposalWithdrawals: Gauge
+  invalidProofWithdrawals: Gauge
+  isDetectingForgeries: Gauge
+  nodeConnectionFailures: Gauge
+}
+
+type State = {
+  portal: ethers.Contract
+  messenger: ethers.Contract
+  highestUncheckedBlockNumber: number
+  faultProofWindow: number
+  forgeryDetected: boolean
+  invalidProposalWithdrawals: Array<{
+    withdrawalHash: string
+    senderAddress: string
+    disputeGame: ethers.Contract
+  }>
+  invalidProofWithdrawals: Array<{
+    withdrawalHash: string
+    senderAddress: string
+    disputeGame: ethers.Contract
+  }>
+}
+
+enum GameStatus {
+  // The game is currently in progress, and has not been resolved.
+  IN_PROGRESS,
+  // The game has concluded, and the `rootClaim` was challenged successfully.
+  CHALLENGER_WINS,
+  // The game has concluded, and the `rootClaim` could not be contested.
+  DEFENDER_WINS,
+}
+
+export class FaultProofWithdrawalMonitor extends BaseServiceV2<
+  Options,
+  Metrics,
+  State
+> {
+  /**
+   * Contract objects attached to their respective providers and addresses.
+   */
+  public l2ChainId: number
+
+  constructor(options?: Partial) {
+    super({
+      version,
+      name: 'two-step-monitor',
+      loop: true,
+      options: {
+        loopIntervalMs: 1000,
+        ...options,
+      },
+      optionsSpec: {
+        l1RpcProvider: {
+          validator: validators.provider,
+          desc: 'Provider for interacting with L1',
+        },
+        l2RpcProvider: {
+          validator: validators.provider,
+          desc: 'Provider for interacting with L2',
+        },
+        optimismPortalAddress: {
+          validator: validators.address,
+          default: null,
+          desc: 'Address of the OptimismPortal proxy contract on L1',
+          public: true,
+        },
+        l2ToL1MessagePasserAddress: {
+          validator: validators.address,
+          default: DEFAULT_L2_CONTRACT_ADDRESSES.BedrockMessagePasser as string,
+          desc: 'Address of the L2ToL1MessagePasser contract on L2',
+          public: true,
+        },
+        startBlockNumber: {
+          validator: validators.num,
+          default: -1,
+          desc: 'L1 block number to start checking from',
+          public: true,
+        },
+        eventBlockRange: {
+          validator: validators.num,
+          default: 2000,
+          desc: 'Number of blocks to query for events over per loop',
+          public: true,
+        },
+        sleepTimeMs: {
+          validator: validators.num,
+          default: 15000,
+          desc: 'Time in ms to sleep when waiting for a node',
+          public: true,
+        },
+      },
+
+      metricsSpec: {
+        highestCheckedBlockNumber: {
+          type: Gauge,
+          desc: 'Highest L1 block number that we have searched.',
+          labels: ['type'],
+        },
+        highestKnownBlockNumber: {
+          type: Gauge,
+          desc: 'Highest L1 block number that we have seen.',
+          labels: ['type'],
+        },
+        invalidProposalWithdrawals: {
+          type: Gauge,
+          desc: 'Number of withdrawals against invalid proposals.',
+          labels: ['type'],
+        },
+        invalidProofWithdrawals: {
+          type: Gauge,
+          desc: 'Number of withdrawals with invalid proofs.',
+          labels: ['type'],
+        },
+        withdrawalsValidated: {
+          type: Gauge,
+          desc: 'Latest L1 Block (checked and known)',
+          labels: ['type'],
+        },
+        isDetectingForgeries: {
+          type: Gauge,
+          desc: '0 if state is ok. 1 or more if forged withdrawals are detected.',
+        },
+        nodeConnectionFailures: {
+          type: Gauge,
+          desc: 'Number of times node connection has failed',
+          labels: ['layer', 'section'],
+        },
+      },
+    })
+  }
+
+  async init(): Promise {
+    // Connect to L1.
+    await waitForProvider(this.options.l1RpcProvider, {
+      logger: this.logger,
+      name: 'L1',
+    })
+
+    // Connect to L2.
+    await waitForProvider(this.options.l2RpcProvider, {
+      logger: this.logger,
+      name: 'L2',
+    })
+
+    // Need L2 chain ID to resolve contract addresses.
+    const l2ChainId = await getChainId(this.options.l2RpcProvider)
+    this.l2ChainId = l2ChainId
+
+    // Create the OptimismPortal contract instance. If the optimismPortal option is not provided
+    // then the SDK will attempt to resolve the address automatically based on the L2 chain ID. If
+    // the SDK isn't aware of the L2 chain ID then it will throw an error that makes it clear the
+    // user needs to provide this value explicitly.
+    this.state.portal = getOEContract('OptimismPortal2', l2ChainId, {
+      signerOrProvider: this.options.l1RpcProvider,
+      address: this.options.optimismPortalAddress,
+    })
+
+    // Create the L2ToL1MessagePasser contract instance. If the l2ToL1MessagePasser option is not
+    // provided then we'll use the default address which typically should be correct. It's very
+    // unlikely that any user would change this address so this should work in 99% of cases. If we
+    // really wanted to be extra safe we could do some sanity checks to make sure the contract has
+    // the interface we need but doesn't seem important for now.
+    this.state.messenger = getOEContract('L2ToL1MessagePasser', l2ChainId, {
+      signerOrProvider: this.options.l2RpcProvider,
+      address: this.options.l2ToL1MessagePasserAddress,
+    })
+
+    // Previous versions of wd-mon would try to pick the starting block number automatically but
+    // this had the possibility of missing certain withdrawals if the service was restarted at the
+    // wrong time. Given the added complexity of finding a starting point automatically after FPAC,
+    // it's much easier to simply start a fixed block number than trying to do something fancy. Use
+    // the default configured in this service or use zero if no default is defined.
+    this.state.highestUncheckedBlockNumber = this.options.startBlockNumber
+    if (this.options.startBlockNumber === -1) {
+      this.state.highestUncheckedBlockNumber =
+        DEFAULT_STARTING_BLOCK_NUMBERS[l2ChainId] || 0
+    }
+
+    // Default state is that forgeries have not been detected.
+    this.state.forgeryDetected = false
+    this.state.invalidProposalWithdrawals = []
+    this.state.invalidProofWithdrawals = []
+  }
+
+  // K8s healthcheck
+  async routes(router: ExpressRouter): Promise {
+    router.get('/healthz', async (req, res) => {
+      return res.status(200).json({
+        ok: !this.state.forgeryDetected,
+      })
+    })
+  }
+
+  async main(): Promise {
+    this.metrics.isDetectingForgeries.set(Number(this.state.forgeryDetected))
+    this.metrics.invalidProposalWithdrawals.set(
+      this.state.invalidProposalWithdrawals.length
+    )
+    this.metrics.invalidProofWithdrawals.set(
+      this.state.invalidProofWithdrawals.length
+    )
+
+    for (
+      let i = this.state.invalidProposalWithdrawals.length - 1;
+      i >= 0;
+      i--
+    ) {
+      const disputeGameData = this.state.invalidProposalWithdrawals[i]
+      const disputeGame = disputeGameData.disputeGame
+      const disputeGameAddress = disputeGame.address
+      const isGameBlacklisted =
+        this.state.portal.disputeGameBlacklist(disputeGameAddress)
+
+      if (isGameBlacklisted) {
+        this.state.invalidProposalWithdrawals.splice(i, 1)
+      } else {
+        const status = await disputeGame.status()
+        if (status === GameStatus.CHALLENGER_WINS) {
+          this.state.invalidProposalWithdrawals.splice(i, 1)
+        } else if (status === GameStatus.DEFENDER_WINS) {
+          this.state.forgeryDetected = true
+          this.metrics.isDetectingForgeries.set(
+            Number(this.state.forgeryDetected)
+          )
+        }
+      }
+    }
+    // Get the latest L1 block number.
+    let latestL1BlockNumber: number
+    try {
+      latestL1BlockNumber = await this.options.l1RpcProvider.getBlockNumber()
+    } catch (err) {
+      // Log the issue so we can debug it.
+      this.logger.error(`got error when connecting to node`, {
+        error: err,
+        node: 'l1',
+        section: 'getBlockNumber',
+      })
+
+      // Increment the metric so we can detect the issue.
+      this.metrics.nodeConnectionFailures.inc({
+        layer: 'l1',
+        section: 'getBlockNumber',
+      })
+
+      // Sleep for a little to give intermittent errors a chance to recover.
+      return sleep(this.options.sleepTimeMs)
+    }
+
+    // Update highest block number metrics so we can keep track of how the service is doing.
+    this.metrics.highestKnownBlockNumber.set(latestL1BlockNumber)
+    this.metrics.highestCheckedBlockNumber.set(
+      this.state.highestUncheckedBlockNumber
+    )
+
+    // Check if the RPC provider is behind us for some reason. Can happen occasionally,
+    // particularly if connected to an RPC provider that load balances over multiple nodes that
+    // might not be perfectly in sync.
+    if (latestL1BlockNumber <= this.state.highestUncheckedBlockNumber) {
+      // Sleep for a little to give the RPC a chance to catch up.
+      return sleep(this.options.sleepTimeMs)
+    }
+
+    // Generally better to use a relatively small block range because it means this service can be
+    // used alongside many different types of L1 nodes. For instance, Geth will typically only
+    // support a block range of 2000 blocks out of the box.
+    const toBlockNumber = Math.min(
+      this.state.highestUncheckedBlockNumber + this.options.eventBlockRange,
+      latestL1BlockNumber
+    )
+
+    // Useful to log this stuff just in case we get stuck or something.
+    this.logger.info(`checking recent blocks`, {
+      fromBlockNumber: this.state.highestUncheckedBlockNumber,
+      toBlockNumber,
+    })
+
+    // Query for WithdrawalProven events within the specified block range.
+    let events: ethers.Event[]
+    try {
+      events = await this.state.portal.queryFilter(
+        this.state.portal.filters.WithdrawalProven(),
+        this.state.highestUncheckedBlockNumber,
+        toBlockNumber
+      )
+    } catch (err) {
+      // Log the issue so we can debug it.
+      this.logger.error(`got error when connecting to node`, {
+        error: err,
+        node: 'l1',
+        section: 'querying for WithdrawalProven events',
+      })
+
+      // Increment the metric so we can detect the issue.
+      this.metrics.nodeConnectionFailures.inc({
+        layer: 'l1',
+        section: 'querying for WithdrawalProven events',
+      })
+
+      // Sleep for a little to give intermittent errors a chance to recover.
+      return sleep(this.options.sleepTimeMs)
+    }
+    // Go over all the events and check if the withdrawal hash actually exists on L2.
+    for (const event of events) {
+      // If this loop throws for whatever reason then the same event may be dropped into
+      // invalidProposalWithdrawals or invalidProofWithdrawals more than once. This can lead to
+      // inflated metrics. However, it's worth noting that inflated metrics are preferred over not
+      // incrementing the metrics at all. Documenting this behavior for future reference.
+
+      // Grab and format the timestamp for logging purposes.
+      const block = await event.getBlock()
+      const ts = `${dateformat(
+        new Date(block.timestamp * 1000),
+        'mmmm dS, yyyy, h:MM:ss TT',
+        true
+      )} UTC`
+
+      // Could consider using multicall here but this is efficient enough for now.
+      const hash = event.args.withdrawalHash
+      const disputeGamesData = await this.getWithdrawalDisputeGames(event)
+      for (const disputeGameData of disputeGamesData) {
+        const disputeGame = disputeGameData.disputeGame
+        const rootClaim = await disputeGame.rootClaim()
+        const l2BlockNumber = await disputeGame.l2BlockNumber()
+        const isValidRoot = await this.isValidOutputRoot(
+          rootClaim,
+          l2BlockNumber
+        )
+        if (isValidRoot) {
+          // Check if the withdrawal exists on L2.
+          const exists = await this.state.messenger.sentMessages(hash)
+          // Hopefully the withdrawal exists!
+          if (exists) {
+            // Unlike below we don't grab the timestamp here because it adds an unnecessary request.
+            this.logger.info(`valid withdrawal`, {
+              withdrawalHash: event.args.withdrawalHash,
+            })
+
+            // Bump the withdrawals metric so we can keep track.
+            this.metrics.withdrawalsValidated.inc()
+          } else {
+            this.state.invalidProofWithdrawals.push(disputeGameData)
+
+            // Uh oh!
+            this.logger.error(`withdrawalHash not seen on L2`, {
+              withdrawalHash: event.args.withdrawalHash,
+              provenAt: ts,
+            })
+
+            // Change to forgery state.
+            this.state.forgeryDetected = true
+            this.metrics.isDetectingForgeries.set(
+              Number(this.state.forgeryDetected)
+            )
+          }
+        } else {
+          this.state.invalidProposalWithdrawals.push(disputeGameData)
+          this.logger.info(`invalid proposal`, {
+            withdrawalHash: event.args.withdrawalHash,
+            provenAt: ts,
+          })
+        }
+      }
+    }
+
+    // Increment the highest unchecked block number for the next loop.
+    this.state.highestUncheckedBlockNumber = toBlockNumber
+  }
+
+  /**
+   * Retrieves the dispute games data associated with a withdrawal hash associated in an event.
+   *
+   * @param event The event containing the withdrawal hash.
+   * @returns An array of objects containing the withdrawal hash, sender address, and dispute game address.
+   */
+  async getWithdrawalDisputeGames(event: ethers.Event): Promise<
+    Array<{
+      withdrawalHash: string
+      senderAddress: string
+      disputeGame: ethers.Contract
+    }>
+  > {
+    const withdrawalHash = event.args.withdrawalHash
+    const disputeGameMap: Array<{
+      withdrawalHash: string
+      senderAddress: string
+      disputeGame: ethers.Contract
+    }> = []
+
+    const numProofSubmitter = await this.state.portal.numProofSubmitters(
+      withdrawalHash
+    )
+
+    // iterate for numProofSubmitter
+    const proofSubmitterAddresses = await Promise.all(
+      Array.from({ length: numProofSubmitter.toNumber() }, (_, i) =>
+        this.state.portal.proofSubmitters(withdrawalHash, i)
+      )
+    )
+
+    // Iterate for proofSubmitterAddresses and query provenWithdrawals to get the disputeGameProxy for each proofSubmitter
+    // Note: In the future, if rate limiting becomes an issue, consider breaking up this loop into smaller chunks.
+    await Promise.all(
+      proofSubmitterAddresses.map(async (proofSubmitter) => {
+        const provenWithdrawals_ = await this.state.portal.provenWithdrawals(
+          withdrawalHash,
+          proofSubmitter
+        )
+        const disputeGame_ = await this.getDisputeGameFromAddress(
+          provenWithdrawals_['disputeGameProxy']
+        )
+        disputeGameMap.push({
+          withdrawalHash,
+          senderAddress: proofSubmitter,
+          disputeGame: disputeGame_,
+        })
+      })
+    )
+    return disputeGameMap
+  }
+
+  /**
+   * Retrieves the FaultDisputeGame contract instance given the dispute game proxy address.
+   *
+   * @param disputeGameProxyAddress The address of the dispute game proxy contract.
+   * @returns The FaultDisputeGame contract instance.
+   */
+  async getDisputeGameFromAddress(
+    disputeGameProxyAddress: string
+  ): Promise {
+    // Create the FaultDisputeGame contract instance using the provided dispute game proxy address.
+    const FaultDisputeGame = getOEContract('FaultDisputeGame', this.l2ChainId, {
+      signerOrProvider: this.options.l1RpcProvider,
+      address: disputeGameProxyAddress,
+    })
+
+    return FaultDisputeGame
+  }
+
+  /**
+   * A private cache to store the validity of output roots.
+   * The cache is implemented as a Map, where the key is a combination of the output root and the L2 block number,
+   * and the value is a boolean indicating if the output root is valid.
+   */
+  private outputRootCache: Map = new Map()
+
+  /**
+   * The maximum size of the output root cache.
+   * Once the cache reaches this size, the oldest entries will be automatically evicted to make room for new entries.
+   */
+  private MAX_CACHE_SIZE = 100
+
+  /**
+   * Checks if the provided output root is valid for the given L2 block number.
+   * Caches the result to improve performance.
+   *
+   * @param outputRoot The output root to validate.
+   * @param l2BlockNumber The L2 block number.
+   * @returns A promise that resolves to a boolean indicating if the output root is valid.
+   */
+  public async isValidOutputRoot(
+    outputRoot: string,
+    l2BlockNumber: number
+  ): Promise {
+    const cacheKey = `${outputRoot}-${l2BlockNumber}`
+    const cachedValue = this.outputRootCache.get(cacheKey)
+    if (cachedValue !== undefined) {
+      return cachedValue
+    }
+
+    try {
+      // Make sure this is a JSON RPC provider.
+      const provider = toJsonRpcProvider(this.options.l2RpcProvider)
+
+      // Grab the block and storage proof at the same time.
+      const [block, proof] = await Promise.all([
+        provider.send('eth_getBlockByNumber', [
+          toRpcHexString(l2BlockNumber),
+          false,
+        ]),
+        makeStateTrieProof(
+          provider,
+          l2BlockNumber,
+          this.state.messenger.address,
+          ethers.constants.HashZero
+        ),
+      ])
+
+      // Compute the output.
+      const output = ethers.utils.solidityKeccak256(
+        ['bytes32', 'bytes32', 'bytes32', 'bytes32'],
+        [
+          ethers.constants.HashZero,
+          block.stateRoot,
+          proof.storageRoot,
+          block.hash,
+        ]
+      )
+
+      // If the output matches the proposal then we're good.
+      const valid = output === outputRoot
+      this.outputRootCache.set(cacheKey, valid)
+
+      if (this.outputRootCache.size > this.MAX_CACHE_SIZE) {
+        const oldestKey = this.outputRootCache.keys().next().value
+        this.outputRootCache.delete(oldestKey)
+      }
+      return valid
+    } catch (err) {
+      // Assume the game is invalid but don't add it to the cache just in case we had a temp error.
+      return false
+    }
+  }
+}
+
+if (require.main === module) {
+  const service = new FaultProofWithdrawalMonitor()
+  service.run()
+}
diff --git a/packages/chain-mon/src/index.ts b/packages/chain-mon/src/index.ts
index 9091eca096d6..9f838b714b40 100644
--- a/packages/chain-mon/src/index.ts
+++ b/packages/chain-mon/src/index.ts
@@ -1,7 +1,8 @@
-export * from './balance-mon/service'
-export * from './drippie-mon/service'
+export * from '../internal/balance-mon/service'
+export * from '../contrib/drippie-mon/service'
 export * from './fault-mon/index'
-export * from './multisig-mon/service'
+export * from '../internal/multisig-mon/service'
 export * from './wd-mon/service'
-export * from './wallet-mon/service'
-export * from './initialized-upgraded-mon/service'
+export * from './faultproof-wd-mon/service'
+export * from '../contrib/wallet-mon/service'
+export * from '../contrib/initialized-upgraded-mon/service'
diff --git a/packages/chain-mon/tsconfig.json b/packages/chain-mon/tsconfig.json
index 24967ddae693..f9bea541e657 100644
--- a/packages/chain-mon/tsconfig.json
+++ b/packages/chain-mon/tsconfig.json
@@ -8,6 +8,8 @@
     "package.json",
     "src/abi/IGnosisSafe.0.8.19.json",
     "src/abi/OptimismPortal.json",
-    "src/**/*"
+    "src/**/*",
+    "contrib/**/*",
+    "internal/**/*"
   ]
 }
diff --git a/packages/common-ts/.depcheckrc b/packages/common-ts/.depcheckrc
deleted file mode 100644
index b1352d5781d9..000000000000
--- a/packages/common-ts/.depcheckrc
+++ /dev/null
@@ -1,12 +0,0 @@
-ignores: [
-  "@babel/eslint-parser",
-  "@typescript-eslint/parser",
-  "eslint-plugin-import",
-  "eslint-plugin-unicorn",
-  "eslint-plugin-jsdoc",
-  "eslint-plugin-prefer-arrow",
-  "eslint-plugin-react",
-  "@typescript-eslint/eslint-plugin",
-  "eslint-config-prettier",
-  "eslint-plugin-prettier"
-]
diff --git a/packages/common-ts/.eslintrc.js b/packages/common-ts/.eslintrc.js
deleted file mode 100644
index bfd2057be80b..000000000000
--- a/packages/common-ts/.eslintrc.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  extends: '../../.eslintrc.js',
-}
diff --git a/packages/common-ts/.gitignore b/packages/common-ts/.gitignore
deleted file mode 100644
index b51ea715cf58..000000000000
--- a/packages/common-ts/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules/
-build/
\ No newline at end of file
diff --git a/packages/common-ts/.lintstagedrc.yml b/packages/common-ts/.lintstagedrc.yml
deleted file mode 100644
index a3035a2299b2..000000000000
--- a/packages/common-ts/.lintstagedrc.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-"*.{ts,js}":
-  - eslint
diff --git a/packages/common-ts/.prettierrc.js b/packages/common-ts/.prettierrc.js
deleted file mode 100644
index 6b3fa8e2ce23..000000000000
--- a/packages/common-ts/.prettierrc.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  ...require('../../.prettierrc.js'),
-};
\ No newline at end of file
diff --git a/packages/common-ts/CHANGELOG.md b/packages/common-ts/CHANGELOG.md
deleted file mode 100644
index 3d2733c11f53..000000000000
--- a/packages/common-ts/CHANGELOG.md
+++ /dev/null
@@ -1,323 +0,0 @@
-# @eth-optimism/common-ts
-
-## 0.8.8
-
-### Patch Changes
-
-- [#9334](https://github.com/ethereum-optimism/optimism/pull/9334) [`1ed50c44a5c4fb7244ede3b4c45ea7bbf144c1e5`](https://github.com/ethereum-optimism/optimism/commit/1ed50c44a5c4fb7244ede3b4c45ea7bbf144c1e5) Thanks [@smartcontracts](https://github.com/smartcontracts)! - Adds a new validator for address types.
-
-## 0.8.7
-
-### Patch Changes
-
-- [#7450](https://github.com/ethereum-optimism/optimism/pull/7450) [`ac90e16a7`](https://github.com/ethereum-optimism/optimism/commit/ac90e16a7f85c4f73661ae6023135c3d00421c1e) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated dev dependencies related to testing that is causing audit tooling to report failures
-
-- Updated dependencies [[`ac90e16a7`](https://github.com/ethereum-optimism/optimism/commit/ac90e16a7f85c4f73661ae6023135c3d00421c1e)]:
-  - @eth-optimism/core-utils@0.13.1
-
-## 0.8.6
-
-### Patch Changes
-
-- Updated dependencies [[`210b2c81d`](https://github.com/ethereum-optimism/optimism/commit/210b2c81dd383bad93480aa876b283d9a0c991c2)]:
-  - @eth-optimism/core-utils@0.13.0
-
-## 0.8.5
-
-### Patch Changes
-
-- [#6887](https://github.com/ethereum-optimism/optimism/pull/6887) [`33eb63b10`](https://github.com/ethereum-optimism/optimism/commit/33eb63b10559a2267c814eda8129447c72940839) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated npm dependencies of common-ts
-
-## 0.8.4
-
-### Patch Changes
-
-- Updated dependencies [[`dfa309e34`](https://github.com/ethereum-optimism/optimism/commit/dfa309e3430ebc8790b932554dde120aafc4161e)]:
-  - @eth-optimism/core-utils@0.12.3
-
-## 0.8.3
-
-### Patch Changes
-
-- Updated dependencies [[`c11039060`](https://github.com/ethereum-optimism/optimism/commit/c11039060bc037a88916c2cba602687b6d69ad1a), [`77da6edc6`](https://github.com/ethereum-optimism/optimism/commit/77da6edc643e0b5e39f7b6bb41c3c7ead418a876)]:
-  - @eth-optimism/core-utils@0.12.2
-
-## 0.8.2
-
-### Patch Changes
-
-- Updated dependencies [8d7dcc70c]
-- Updated dependencies [d6388be4a]
-  - @eth-optimism/core-utils@0.12.1
-
-## 0.8.1
-
-### Patch Changes
-
-- fecd42d67: Fix BaseServiceV2 configuration for caseCase options
-
-## 0.8.0
-
-### Minor Changes
-
-- 4ae94b412: Add option to configure body parser
-
-### Patch Changes
-
-- 0e179781b: Fixes a minor bug where the provider name was incorrectly logged when using waitForProvider
-
-## 0.7.1
-
-### Patch Changes
-
-- f04e5db2d: Fix unknown option error in base service v2
-
-## 0.7.0
-
-### Minor Changes
-
-- ab8ec365c: Updates BaseServiceV2 so that options are secret by default. Services will have to explicitly mark options as "public" for those options to be logged and included in the metadata metric.
-- 9b2891852: Refactors BaseServiceV2 slightly, merges standard options with regular options
-
-### Patch Changes
-
-- e23f60f63: Fixes a bug in BaseServiceV2 where options were not being parsed correctly when passed into the constructor rather than via environment variables or command line arguments
-- c6c9c7dbf: Adds a function for waiting for ethers providers
-- ffcee1013: Make logLevel a default option of BaseServiceV2
-- eceb0de1d: Adds new standard options to disable parsing variables from environment and command line.
-
-## 0.6.8
-
-### Patch Changes
-
-- Updated dependencies [c975c9620]
-- Updated dependencies [136ea1785]
-  - @eth-optimism/core-utils@0.12.0
-
-## 0.6.7
-
-### Patch Changes
-
-- Updated dependencies [1e76cdb86]
-  - @eth-optimism/core-utils@0.11.0
-
-## 0.6.6
-
-### Patch Changes
-
-- ce7da914: Minor update to BaseServiceV2 to keep the raw body around when requests are made.
-
-## 0.6.5
-
-### Patch Changes
-
-- 7215f4ce: Bump ethers to 5.7.0 globally
-- d7679ca4: Add source maps
-- Updated dependencies [7215f4ce]
-- Updated dependencies [206f6033]
-  - @eth-optimism/core-utils@0.10.1
-
-## 0.6.4
-
-### Patch Changes
-
-- Updated dependencies [dbfea116]
-  - @eth-optimism/core-utils@0.10.0
-
-## 0.6.3
-
-### Patch Changes
-
-- Updated dependencies [0df744f6]
-- Updated dependencies [8ae39154]
-- Updated dependencies [dac4a9f0]
-  - @eth-optimism/core-utils@0.9.3
-
-## 0.6.2
-
-### Patch Changes
-
-- Updated dependencies [0bf3b9b4]
-- Updated dependencies [8d26459b]
-- Updated dependencies [4477fe9f]
-  - @eth-optimism/core-utils@0.9.2
-
-## 0.6.1
-
-### Patch Changes
-
-- Updated dependencies [f9fee446]
-  - @eth-optimism/core-utils@0.9.1
-
-## 0.6.0
-
-### Minor Changes
-
-- 3d1cb720: Add version to healthz for convenience
-
-### Patch Changes
-
-- Updated dependencies [700dcbb0]
-  - @eth-optimism/core-utils@0.9.0
-
-## 0.5.0
-
-### Minor Changes
-
-- cb71fcde: Make typescript type more permissive for MetricsV2
-
-### Patch Changes
-
-- 10e41522: Fix potential metrics DoS vector in recent commit to BSV2
-
-## 0.4.0
-
-### Minor Changes
-
-- 52b26878: More gracefully shut down base service
-
-### Patch Changes
-
-- c201f3f1: Collect default node metrics
-- 29ff7462: Revert es target back to 2017
-- Updated dependencies [29ff7462]
-  - @eth-optimism/core-utils@0.8.7
-
-## 0.3.1
-
-### Patch Changes
-
-- 9ba869a7: Log server messages to logger instead of stdout
-- 050859fd: Include default options in metadata metric
-
-## 0.3.0
-
-### Minor Changes
-
-- d9e39931: Minor upgrade to BaseServiceV2 to expose a full customizable server, instead of just metrics.
-- 84a8934c: BaseServiceV2 exposes service name and version as standard synthetic metric
-
-## 0.2.10
-
-### Patch Changes
-
-- 9ecbf3e5: Expose service internal options as environment or cli options
-
-## 0.2.9
-
-### Patch Changes
-
-- Updated dependencies [17962ca9]
-  - @eth-optimism/core-utils@0.8.6
-
-## 0.2.8
-
-### Patch Changes
-
-- f16383f2: Have legacy BaseService metrics bind to 0.0.0.0 by default
-- d18ae135: Updates all ethers versions in response to BN.js bug
-- Updated dependencies [d18ae135]
-  - @eth-optimism/core-utils@0.8.5
-
-## 0.2.7
-
-### Patch Changes
-
-- Updated dependencies [5cb3a5f7]
-- Updated dependencies [6b9fc055]
-  - @eth-optimism/core-utils@0.8.4
-
-## 0.2.6
-
-### Patch Changes
-
-- b57014d1: Update to typescript@4.6.2
-- Updated dependencies [b57014d1]
-  - @eth-optimism/core-utils@0.8.3
-
-## 0.2.5
-
-### Patch Changes
-
-- e36b085c: Adds hard stop to BaseServiceV2 when multiple exit signals are received
-- c1957126: Update Dockerfile to use Alpine
-- 51673b90: Have BaseServiceV2 throw when options are undefined
-- 7a179003: Adds the jsonRpcProvider validator as an input validator
-- Updated dependencies [c1957126]
-  - @eth-optimism/core-utils@0.8.2
-
-## 0.2.4
-
-### Patch Changes
-
-- f981b8da: Properly exposes metrics as part of a metrics server at port 7300
-
-## 0.2.3
-
-### Patch Changes
-
-- f7761058: Update log lines for service shutdown
-- 5ae15042: Update metric names to include proper snake_case for strings that include "L1" or "L2"
-- 5cd1e996: Have BaseServiceV2 add spaces to environment variable names
-
-## 0.2.2
-
-### Patch Changes
-
-- b3f9bdef: Have BaseServiceV2 gracefully catch exit signals
-- e53b5783: Introduces the new BaseServiceV2 class.
-
-## 0.2.1
-
-### Patch Changes
-
-- 243f33e5: Standardize package json file format
-
-## 0.2.0
-
-### Minor Changes
-
-- 81ccd6e4: `regenesis/0.5.0` release
-
-## 0.1.6
-
-### Patch Changes
-
-- 6d3e1d7f: Update dependencies
-
-## 0.1.5
-
-### Patch Changes
-
-- c73c3939: Update the typescript version to `4.3.5`
-
-## 0.1.4
-
-### Patch Changes
-
-- 5c89c45f: Move the metric prefix string to a label #1047
-
-## 0.1.3
-
-### Patch Changes
-
-- baa3b761: Improve Sentry support, initializing as needed and ensuring ERROR logs route to Sentry
-
-## 0.1.2
-
-### Patch Changes
-
-- 0c16805: add metrics server to common-ts and batch submitter
-
-## 0.1.1
-
-### Patch Changes
-
-- 1d40586: Removed various unused dependencies
-- 575bcf6: add environment and network to dtl, move metric init to app from base-service
-
-## 0.1.0
-
-### Minor Changes
-
-- 28dc442: move metrics, logger, and base-service to new common-ts package
diff --git a/packages/common-ts/LICENSE b/packages/common-ts/LICENSE
deleted file mode 100644
index 6a7da5218bb2..000000000000
--- a/packages/common-ts/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright 2020-2021 Optimism
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/packages/common-ts/README.md b/packages/common-ts/README.md
deleted file mode 100644
index f6b080ad4547..000000000000
--- a/packages/common-ts/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# @eth-optimism/common-ts
-
-[![codecov](https://codecov.io/gh/ethereum-optimism/optimism/branch/develop/graph/badge.svg?token=0VTG7PG7YR&flag=common-ts-tests)](https://codecov.io/gh/ethereum-optimism/optimism)
-
-## What is this?
-
-`@eth-optimism/common-ts` contains useful tools for logging, metrics, and other Node stuff.
-
diff --git a/packages/common-ts/package.json b/packages/common-ts/package.json
deleted file mode 100644
index 4ad287f66bd2..000000000000
--- a/packages/common-ts/package.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "name": "@eth-optimism/common-ts",
-  "version": "0.8.8",
-  "description": "[Optimism] Advanced typescript tooling used by various services",
-  "main": "dist/index",
-  "types": "dist/index",
-  "files": [
-    "dist/*",
-    "src/*"
-  ],
-  "scripts": {
-    "all": "pnpm clean && pnpm build && pnpm test && pnpm lint:fix && pnpm lint",
-    "build": "tsc -p tsconfig.json",
-    "clean": "rimraf dist/ ./tsconfig.tsbuildinfo",
-    "lint:check": "eslint . --max-warnings=0",
-    "lint:fix": "pnpm lint:check --fix",
-    "lint": "pnpm lint:fix && pnpm lint:check",
-    "pre-commit": "lint-staged",
-    "test": "ts-mocha test/*.spec.ts",
-    "test:coverage": "nyc ts-mocha test/*.spec.ts && nyc merge .nyc_output coverage.json"
-  },
-  "keywords": [
-    "optimism",
-    "ethereum",
-    "common",
-    "typescript"
-  ],
-  "homepage": "https://github.com/ethereum-optimism/optimism/tree/develop/packages/common-ts#readme",
-  "license": "MIT",
-  "author": "Optimism PBC",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/ethereum-optimism/optimism.git"
-  },
-  "dependencies": {
-    "@eth-optimism/core-utils": "workspace:*",
-    "@sentry/node": "^7.99.0",
-    "bcfg": "^0.2.1",
-    "body-parser": "^1.20.2",
-    "commander": "^11.1.0",
-    "dotenv": "^16.4.5",
-    "envalid": "^8.0.0",
-    "ethers": "^5.7.2",
-    "express": "^4.18.2",
-    "express-prom-bundle": "^7.0.0",
-    "lodash": "^4.17.21",
-    "morgan": "^1.10.0",
-    "pino": "^8.19.0",
-    "pino-multi-stream": "^6.0.0",
-    "pino-sentry": "^0.14.0",
-    "prom-client": "^14.2.0"
-  },
-  "devDependencies": {
-    "@ethersproject/abstract-provider": "^5.7.0",
-    "@ethersproject/abstract-signer": "^5.7.0",
-    "@types/express": "^4.17.21",
-    "@types/morgan": "^1.9.9",
-    "@types/pino": "^7.0.5",
-    "@types/pino-multi-stream": "^5.1.6",
-    "chai": "^4.3.10",
-    "supertest": "^6.3.4"
-  }
-}
diff --git a/packages/common-ts/src/base-service/base-service-v2.ts b/packages/common-ts/src/base-service/base-service-v2.ts
deleted file mode 100644
index f4daa25fb18a..000000000000
--- a/packages/common-ts/src/base-service/base-service-v2.ts
+++ /dev/null
@@ -1,485 +0,0 @@
-import { Server } from 'net'
-
-import Config from 'bcfg'
-import * as dotenv from 'dotenv'
-import { Command, Option } from 'commander'
-import { cleanEnv } from 'envalid'
-import snakeCase from 'lodash/snakeCase'
-import express from 'express'
-import prometheus, { Registry } from 'prom-client'
-import promBundle from 'express-prom-bundle'
-import bodyParser from 'body-parser'
-import morgan from 'morgan'
-
-import { ExpressRouter } from './router'
-import { Logger } from '../common/logger'
-import {
-  Metrics,
-  MetricsSpec,
-  StandardMetrics,
-  makeStdMetricsSpec,
-} from './metrics'
-import {
-  Options,
-  OptionsSpec,
-  StandardOptions,
-  stdOptionsSpec,
-  getPublicOptions,
-} from './options'
-
-/**
- * BaseServiceV2 is an advanced but simple base class for long-running TypeScript services.
- */
-export abstract class BaseServiceV2<
-  TOptions extends Options,
-  TMetrics extends Metrics,
-  TServiceState
-> {
-  /**
-   * The timeout that controls the polling interval
-   * If clearTimeout(this.pollingTimeout) is called the timeout will stop
-   */
-  private pollingTimeout: NodeJS.Timeout
-
-  /**
-   * The promise representing this.main
-   */
-  private mainPromise: ReturnType
-
-  /**
-   * Whether or not the service will loop.
-   */
-  protected loop: boolean
-
-  /**
-   * Waiting period in ms between loops, if the service will loop.
-   */
-  protected loopIntervalMs: number
-
-  /**
-   * Whether or not the service is currently running.
-   */
-  protected running: boolean
-
-  /**
-   * Whether or not the service is currently healthy.
-   */
-  protected healthy: boolean
-
-  /**
-   * Logger class for this service.
-   */
-  protected logger: Logger
-
-  /**
-   * Service state, persisted between loops.
-   */
-  protected state: TServiceState
-
-  /**
-   * Service options.
-   */
-  protected readonly options: TOptions & StandardOptions
-
-  /**
-   * Metrics.
-   */
-  protected readonly metrics: TMetrics & StandardMetrics
-
-  /**
-   * Registry for prometheus metrics.
-   */
-  protected readonly metricsRegistry: Registry
-
-  /**
-   * App server.
-   */
-  protected server: Server
-
-  /**
-   * Port for the app server.
-   */
-  protected readonly port: number
-
-  /**
-   * Hostname for the app server.
-   */
-  protected readonly hostname: string
-
-  /**
-   * @param params Options for the construction of the service.
-   * @param params.name Name for the service.
-   * @param params.optionsSpec Settings for input options.
-   * @param params.metricsSpec Settings that define which metrics are collected.
-   * @param params.options Options to pass to the service.
-   * @param params.loops Whether or not the service should loop. Defaults to true.
-   * @param params.useEnv Whether or not to load options from the environment. Defaults to true.
-   * @param params.useArgv Whether or not to load options from the command line. Defaults to true.
-   */
-  constructor(
-    private readonly params: {
-      name: string
-      version: string
-      optionsSpec: OptionsSpec
-      metricsSpec: MetricsSpec
-      options?: Partial
-      loop?: boolean
-      bodyParserParams?: bodyParser.OptionsJson
-    }
-  ) {
-    this.loop = params.loop !== undefined ? params.loop : true
-    this.state = {} as TServiceState
-
-    // Add standard options spec to user options spec.
-    ;(params.optionsSpec as any) = {
-      ...params.optionsSpec,
-      ...stdOptionsSpec,
-    }
-
-    // Add default metrics to metrics spec.
-    ;(params.metricsSpec as any) = {
-      ...params.metricsSpec,
-      ...makeStdMetricsSpec(params.optionsSpec),
-    }
-
-    /**
-     * Special snake_case function which accounts for the common strings "L1" and "L2" which would
-     * normally be split into "L_1" and "L_2" by the snake_case function.
-     *
-     * @param str String to convert to snake_case.
-     * @returns snake_case string.
-     */
-    const opSnakeCase = (str: string) => {
-      const reg = /l_1|l_2/g
-      const repl = str.includes('l1') ? 'l1' : 'l2'
-      return snakeCase(str).replace(reg, repl)
-    }
-
-    // Use commander as a way to communicate info about the service. We don't actually *use*
-    // commander for anything besides the ability to run `tsx ./service.ts --help`.
-    const program = new Command().allowUnknownOption(true)
-    for (const [optionName, optionSpec] of Object.entries(params.optionsSpec)) {
-      // Skip options that are not meant to be used by the user.
-      if (['useEnv', 'useArgv'].includes(optionName)) {
-        continue
-      }
-
-      program.addOption(
-        new Option(`--${optionName.toLowerCase()}`, `${optionSpec.desc}`).env(
-          `${opSnakeCase(
-            params.name.replace(/-/g, '_')
-          ).toUpperCase()}__${opSnakeCase(optionName).toUpperCase()}`
-        )
-      )
-    }
-
-    const longestMetricNameLength = Object.keys(params.metricsSpec).reduce(
-      (acc, key) => {
-        const nameLength = snakeCase(key).length
-        if (nameLength > acc) {
-          return nameLength
-        } else {
-          return acc
-        }
-      },
-      0
-    )
-
-    program.addHelpText(
-      'after',
-      `\nMetrics:\n${Object.entries(params.metricsSpec)
-        .map(([metricName, metricSpec]) => {
-          const parsedName = opSnakeCase(metricName)
-          return `  ${parsedName}${' '.repeat(
-            longestMetricNameLength - parsedName.length + 2
-          )}${metricSpec.desc} (type: ${metricSpec.type.name})`
-        })
-        .join('\n')}
-      `
-    )
-
-    // Load all configuration values from the environment and argv.
-    program.parse()
-    dotenv.config()
-    const config = new Config(params.name)
-    config.load({
-      env: params.options?.useEnv ?? true,
-      argv: params.options?.useEnv ?? true,
-    })
-
-    // Clean configuration values using the options spec.
-    // Since BCFG turns everything into lower case, we're required to turn all of the input option
-    // names into lower case for the validation step. We'll turn the names back into their original
-    // names when we're done.
-    const lowerCaseOptions = Object.entries(params.options).reduce(
-      (acc, [key, val]) => {
-        acc[key.toLowerCase()] = val
-        return acc
-      },
-      {}
-    )
-    const cleaned = cleanEnv(
-      { ...config.env, ...config.args, ...(lowerCaseOptions || {}) },
-      Object.entries(params.optionsSpec || {}).reduce((acc, [key, val]) => {
-        acc[key.toLowerCase()] = val.validator({
-          desc: val.desc,
-          default: val.default,
-        })
-        return acc
-      }, {}) as any
-    )
-
-    // Turn the lowercased option names back into camelCase.
-    this.options = Object.keys(params.optionsSpec || {}).reduce((acc, key) => {
-      acc[key] = cleaned[key.toLowerCase()]
-      return acc
-    }, {}) as TOptions
-
-    // Make sure all options are defined.
-    for (const [optionName, optionSpec] of Object.entries(params.optionsSpec)) {
-      if (
-        optionSpec.default === undefined &&
-        this.options[optionName] === undefined
-      ) {
-        throw new Error(`missing required option: ${optionName}`)
-      }
-    }
-
-    // Create the metrics objects.
-    this.metrics = Object.keys(params.metricsSpec || {}).reduce((acc, key) => {
-      const spec = params.metricsSpec[key]
-      acc[key] = new spec.type({
-        name: `${opSnakeCase(params.name)}_${opSnakeCase(key)}`,
-        help: spec.desc,
-        labelNames: spec.labels || [],
-      })
-      return acc
-    }, {}) as TMetrics & StandardMetrics
-
-    // Create the metrics server.
-    this.metricsRegistry = prometheus.register
-    this.port = this.options.port
-    this.hostname = this.options.hostname
-
-    // Set up everything else.
-    this.healthy = true
-    this.loopIntervalMs = this.options.loopIntervalMs
-    this.logger = new Logger({
-      name: params.name,
-      level: this.options.logLevel,
-    })
-
-    // Gracefully handle stop signals.
-    const maxSignalCount = 3
-    let currSignalCount = 0
-    const stop = async (signal: string) => {
-      // Allow exiting fast if more signals are received.
-      currSignalCount++
-      if (currSignalCount === 1) {
-        this.logger.info(`stopping service with signal`, { signal })
-        await this.stop()
-        process.exit(0)
-      } else if (currSignalCount >= maxSignalCount) {
-        this.logger.info(`performing hard stop`)
-        process.exit(0)
-      } else {
-        this.logger.info(
-          `send ${maxSignalCount - currSignalCount} more signal(s) to hard stop`
-        )
-      }
-    }
-
-    // Handle stop signals.
-    process.on('SIGTERM', stop)
-    process.on('SIGINT', stop)
-
-    // Set metadata synthetic metric.
-    this.metrics.metadata.set(
-      {
-        name: params.name,
-        version: params.version,
-        ...getPublicOptions(params.optionsSpec).reduce((acc, key) => {
-          if (key in stdOptionsSpec) {
-            acc[key] = this.options[key].toString()
-          } else {
-            acc[key] = config.str(key)
-          }
-          return acc
-        }, {}),
-      },
-      1
-    )
-
-    // Collect default node metrics.
-    prometheus.collectDefaultMetrics({
-      register: this.metricsRegistry,
-      labels: { name: params.name, version: params.version },
-    })
-  }
-
-  /**
-   * Runs the main function. If this service is set up to loop, will repeatedly loop around the
-   * main function. Will also catch unhandled errors.
-   */
-  public async run(): Promise {
-    // Start the app server if not yet running.
-    if (!this.server) {
-      this.logger.info('starting app server')
-
-      // Start building the app.
-      const app = express()
-
-      // Body parsing.
-      app.use(bodyParser.urlencoded({ extended: true }))
-
-      // Keep the raw body around in case the application needs it.
-      app.use(
-        bodyParser.json({
-          verify: (req, res, buf, encoding) => {
-            ;(req as any).rawBody =
-              buf?.toString((encoding as BufferEncoding) || 'utf8') || ''
-          },
-          ...(this.params.bodyParserParams ?? {}),
-        })
-      )
-
-      // Logging.
-      app.use(
-        morgan('short', {
-          stream: {
-            write: (str: string) => {
-              this.logger.info(`server log`, {
-                log: str,
-              })
-            },
-          },
-        })
-      )
-
-      // Health status.
-      app.get('/healthz', async (req, res) => {
-        return res.json({
-          ok: this.healthy,
-          version: this.params.version,
-        })
-      })
-
-      // Register user routes.
-      const router = express.Router()
-      if (this.routes) {
-        this.routes(router)
-      }
-
-      // Metrics.
-      // Will expose a /metrics endpoint by default.
-      app.use(
-        promBundle({
-          promRegistry: this.metricsRegistry,
-          includeMethod: true,
-          includePath: true,
-          includeStatusCode: true,
-          normalizePath: (req) => {
-            for (const layer of router.stack) {
-              if (layer.route && req.path.match(layer.regexp)) {
-                return layer.route.path
-              }
-            }
-
-            return '/invalid_path_not_a_real_route'
-          },
-        })
-      )
-
-      app.use('/api', router)
-
-      // Wait for server to come up.
-      await new Promise((resolve) => {
-        this.server = app.listen(this.port, this.hostname, () => {
-          resolve(null)
-        })
-      })
-
-      this.logger.info(`app server started`, {
-        port: this.port,
-        hostname: this.hostname,
-      })
-    }
-
-    if (this.init) {
-      this.logger.info('initializing service')
-      await this.init()
-      this.logger.info('service initialized')
-    }
-
-    if (this.loop) {
-      this.logger.info('starting main loop')
-      this.running = true
-
-      const doLoop = async () => {
-        try {
-          this.mainPromise = this.main()
-          await this.mainPromise
-        } catch (err) {
-          this.metrics.unhandledErrors.inc()
-          this.logger.error('caught an unhandled exception', {
-            message: err.message,
-            stack: err.stack,
-            code: err.code,
-          })
-        }
-
-        // Sleep between loops if we're still running (service not stopped).
-        if (this.running) {
-          this.pollingTimeout = setTimeout(doLoop, this.loopIntervalMs)
-        }
-      }
-      doLoop()
-    } else {
-      this.logger.info('running main function')
-      await this.main()
-    }
-  }
-
-  /**
-   * Tries to gracefully stop the service. Service will continue running until the current loop
-   * iteration is finished and will then stop looping.
-   */
-  public async stop(): Promise {
-    this.logger.info('stopping main loop...')
-    this.running = false
-    clearTimeout(this.pollingTimeout)
-    this.logger.info('waiting for main to complete')
-    // if main is in the middle of running wait for it to complete
-    await this.mainPromise
-    this.logger.info('main loop stopped.')
-
-    // Shut down the metrics server if it's running.
-    if (this.server) {
-      this.logger.info('stopping metrics server')
-      await new Promise((resolve) => {
-        this.server.close(() => {
-          resolve(null)
-        })
-      })
-      this.logger.info('metrics server stopped')
-      this.server = undefined
-    }
-  }
-
-  /**
-   * Initialization function. Runs once before the main function.
-   */
-  protected init?(): Promise
-
-  /**
-   * Initialization function for router.
-   *
-   * @param router Express router.
-   */
-  protected routes?(router: ExpressRouter): Promise
-
-  /**
-   * Main function. Runs repeatedly when run() is called.
-   */
-  protected abstract main(): Promise
-}
diff --git a/packages/common-ts/src/base-service/base-service.ts b/packages/common-ts/src/base-service/base-service.ts
deleted file mode 100644
index ee816be55c36..000000000000
--- a/packages/common-ts/src/base-service/base-service.ts
+++ /dev/null
@@ -1,150 +0,0 @@
-/* Imports: Internal */
-import { Logger } from '../common/logger'
-import { LegacyMetrics } from '../common/metrics'
-
-type OptionSettings = {
-  [P in keyof TOptions]?: {
-    default?: TOptions[P]
-    validate?: (val: any) => boolean
-  }
-}
-
-type BaseServiceOptions = T & {
-  logger?: Logger
-  metrics?: LegacyMetrics
-}
-
-/**
- * Base for other "Service" objects. Handles your standard initialization process, can dynamically
- * start and stop.
- */
-export class BaseService {
-  protected name: string
-  protected options: T
-  protected logger: Logger
-  protected metrics: LegacyMetrics
-  protected initialized = false
-  protected running = false
-
-  constructor(
-    name: string,
-    options: BaseServiceOptions,
-    optionSettings: OptionSettings
-  ) {
-    validateOptions(options, optionSettings)
-    this.name = name
-    this.options = mergeDefaultOptions(options, optionSettings)
-    this.logger = options.logger || new Logger({ name })
-    if (options.metrics) {
-      this.metrics = options.metrics
-    }
-  }
-
-  /**
-   * Initializes the service.
-   */
-  public async init(): Promise {
-    if (this.initialized) {
-      return
-    }
-
-    this.logger.info('Service is initializing...')
-    await this._init()
-    this.logger.info('Service has initialized.')
-    this.initialized = true
-  }
-
-  /**
-   * Starts the service (initializes it if needed).
-   */
-  public async start(): Promise {
-    if (this.running) {
-      return
-    }
-    this.logger.info('Service is starting...')
-    await this.init()
-
-    // set the service to running
-    this.running = true
-    await this._start()
-    this.logger.info('Service has started')
-  }
-
-  /**
-   * Stops the service.
-   */
-  public async stop(): Promise {
-    if (!this.running) {
-      return
-    }
-
-    this.logger.info('Service is stopping...')
-    await this._stop()
-    this.logger.info('Service has stopped')
-    this.running = false
-  }
-
-  /**
-   * Internal init function. Parent should implement.
-   */
-  protected async _init(): Promise {
-    return
-  }
-
-  /**
-   * Internal start function. Parent should implement.
-   */
-  protected async _start(): Promise {
-    return
-  }
-
-  /**
-   * Internal stop function. Parent should implement.
-   */
-  protected async _stop(): Promise {
-    return
-  }
-}
-
-/**
- * Combines user provided and default options.
- */
-const mergeDefaultOptions = (
-  options: T,
-  optionSettings: OptionSettings
-): T => {
-  for (const optionName of Object.keys(optionSettings)) {
-    const optionDefault = optionSettings[optionName].default
-    if (optionDefault === undefined) {
-      continue
-    }
-
-    if (options[optionName] !== undefined && options[optionName] !== null) {
-      continue
-    }
-
-    options[optionName] = optionDefault
-  }
-
-  return options
-}
-
-/**
- * Performs option validation against the option settings
- */
-const validateOptions = (options: T, optionSettings: OptionSettings) => {
-  for (const optionName of Object.keys(optionSettings)) {
-    const optionValidationFunction = optionSettings[optionName].validate
-    if (optionValidationFunction === undefined) {
-      continue
-    }
-
-    const optionValue = options[optionName]
-
-    if (optionValidationFunction(optionValue) === false) {
-      throw new Error(
-        `Provided input for option "${optionName}" is invalid: ${optionValue}`
-      )
-    }
-  }
-}
diff --git a/packages/common-ts/src/base-service/index.ts b/packages/common-ts/src/base-service/index.ts
deleted file mode 100644
index 6383c019ee7f..000000000000
--- a/packages/common-ts/src/base-service/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export * from './base-service'
-export * from './base-service-v2'
-export * from './validators'
-export * from './metrics'
-export * from './options'
-export * from './router'
diff --git a/packages/common-ts/src/base-service/metrics.ts b/packages/common-ts/src/base-service/metrics.ts
deleted file mode 100644
index f3cd48f07fa8..000000000000
--- a/packages/common-ts/src/base-service/metrics.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import {
-  Gauge as PGauge,
-  Counter as PCounter,
-  Histogram as PHistogram,
-  Summary as PSummary,
-} from 'prom-client'
-
-import { OptionsSpec, getPublicOptions } from './options'
-
-// Prometheus metrics re-exported.
-export class Gauge extends PGauge {}
-export class Counter extends PCounter {}
-export class Histogram extends PHistogram {}
-export class Summary extends PSummary {}
-export type Metric = Gauge | Counter | Histogram | Summary
-
-/**
- * Metrics that are available for a given service.
- */
-export type Metrics = Record
-
-/**
- * Specification for metrics.
- */
-export type MetricsSpec = {
-  [P in keyof Required]: {
-    type: new (configuration: any) => TMetrics[P]
-    desc: string
-    labels?: string[]
-  }
-}
-
-/**
- * Standard metrics that are always available.
- */
-export type StandardMetrics = {
-  metadata: Gauge
-  unhandledErrors: Counter
-}
-
-/**
- * Generates a standard metrics specification. Needs to be a function because the labels for
- * service metadata are dynamic dependent on the list of given options.
- *
- * @param options Options to include in the service metadata.
- * @returns Metrics specification.
- */
-export const makeStdMetricsSpec = (
-  optionsSpec: OptionsSpec
-): MetricsSpec => {
-  return {
-    // Users cannot set these options.
-    metadata: {
-      type: Gauge,
-      desc: 'Service metadata',
-      labels: ['name', 'version'].concat(getPublicOptions(optionsSpec)),
-    },
-    unhandledErrors: {
-      type: Counter,
-      desc: 'Unhandled errors',
-    },
-  }
-}
diff --git a/packages/common-ts/src/base-service/options.ts b/packages/common-ts/src/base-service/options.ts
deleted file mode 100644
index 06e5a5af1f18..000000000000
--- a/packages/common-ts/src/base-service/options.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import { ValidatorSpec, Spec } from 'envalid'
-
-import { LogLevel } from '../common/logger'
-import { validators } from './validators'
-
-/**
- * Options for a service.
- */
-export type Options = {
-  [key: string]: any
-}
-
-/**
- * Specification for options.
- */
-export type OptionsSpec = {
-  [P in keyof Required]: {
-    validator: (spec?: Spec) => ValidatorSpec
-    desc: string
-    default?: TOptions[P]
-    public?: boolean
-  }
-}
-
-/**
- * Standard options shared by all services.
- */
-export type StandardOptions = {
-  loopIntervalMs?: number
-  port?: number
-  hostname?: string
-  logLevel?: LogLevel
-  useEnv?: boolean
-  useArgv?: boolean
-}
-
-/**
- * Specification for standard options.
- */
-export const stdOptionsSpec: OptionsSpec = {
-  loopIntervalMs: {
-    validator: validators.num,
-    desc: 'Loop interval in milliseconds, only applies if service is set to loop',
-    default: 0,
-    public: true,
-  },
-  port: {
-    validator: validators.num,
-    desc: 'Port for the app server',
-    default: 7300,
-    public: true,
-  },
-  hostname: {
-    validator: validators.str,
-    desc: 'Hostname for the app server',
-    default: '0.0.0.0',
-    public: true,
-  },
-  logLevel: {
-    validator: validators.logLevel,
-    desc: 'Log level',
-    default: 'debug',
-    public: true,
-  },
-  useEnv: {
-    validator: validators.bool,
-    desc: 'For programmatic use, whether to use environment variables',
-    default: true,
-    public: true,
-  },
-  useArgv: {
-    validator: validators.bool,
-    desc: 'For programmatic use, whether to use command line arguments',
-    default: true,
-    public: true,
-  },
-}
-
-/**
- * Gets the list of public option names from an options specification.
- *
- * @param optionsSpec Options specification.
- * @returns List of public option names.
- */
-export const getPublicOptions = (
-  optionsSpec: OptionsSpec
-): string[] => {
-  return Object.keys(optionsSpec).filter((key) => {
-    return optionsSpec[key].public
-  })
-}
diff --git a/packages/common-ts/src/base-service/router.ts b/packages/common-ts/src/base-service/router.ts
deleted file mode 100644
index e5bbaabd4e5f..000000000000
--- a/packages/common-ts/src/base-service/router.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { Router } from 'express'
-
-/**
- * Express router re-exported.
- */
-export type ExpressRouter = Router
diff --git a/packages/common-ts/src/base-service/validators.ts b/packages/common-ts/src/base-service/validators.ts
deleted file mode 100644
index 5eced2306707..000000000000
--- a/packages/common-ts/src/base-service/validators.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import {
-  str,
-  bool,
-  num,
-  email,
-  host,
-  port,
-  url,
-  json,
-  makeValidator,
-} from 'envalid'
-import { Provider } from '@ethersproject/abstract-provider'
-import { Signer } from '@ethersproject/abstract-signer'
-import { ethers } from 'ethers'
-
-import { LogLevel, logLevels } from '../common'
-
-const provider = makeValidator((input) => {
-  const parsed = url()._parse(input)
-  return new ethers.providers.JsonRpcProvider(parsed)
-})
-
-const jsonRpcProvider = makeValidator(
-  (input) => {
-    const parsed = url()._parse(input)
-    return new ethers.providers.JsonRpcProvider(parsed)
-  }
-)
-
-const staticJsonRpcProvider =
-  makeValidator((input) => {
-    const parsed = url()._parse(input)
-    return new ethers.providers.StaticJsonRpcProvider(parsed)
-  })
-
-const wallet = makeValidator((input) => {
-  if (!ethers.utils.isHexString(input)) {
-    throw new Error(`expected wallet to be a hex string`)
-  } else {
-    return new ethers.Wallet(input)
-  }
-})
-
-const logLevel = makeValidator((input) => {
-  if (!logLevels.includes(input as LogLevel)) {
-    throw new Error(`expected log level to be one of ${logLevels.join(', ')}`)
-  } else {
-    return input as LogLevel
-  }
-})
-
-const address = makeValidator((input) => {
-  if (!ethers.utils.isHexString(input, 20)) {
-    throw new Error(`expected input to be an address: ${input}`)
-  } else {
-    return input as `0x${string}`
-  }
-})
-
-export const validators = {
-  str,
-  bool,
-  num,
-  email,
-  host,
-  port,
-  url,
-  json,
-  wallet,
-  provider,
-  jsonRpcProvider,
-  staticJsonRpcProvider,
-  logLevel,
-  address,
-}
diff --git a/packages/common-ts/src/common/index.ts b/packages/common-ts/src/common/index.ts
deleted file mode 100644
index 8c8845ed6ece..000000000000
--- a/packages/common-ts/src/common/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './logger'
-export * from './metrics'
-export * from './provider'
diff --git a/packages/common-ts/src/common/logger.ts b/packages/common-ts/src/common/logger.ts
deleted file mode 100644
index 973740cdd57d..000000000000
--- a/packages/common-ts/src/common/logger.ts
+++ /dev/null
@@ -1,128 +0,0 @@
-import pino, { LoggerOptions as PinoLoggerOptions } from 'pino'
-import pinoms, { Streams } from 'pino-multi-stream'
-import { createWriteStream } from 'pino-sentry'
-import { NodeOptions } from '@sentry/node'
-
-export const logLevels = [
-  'trace',
-  'debug',
-  'info',
-  'warn',
-  'error',
-  'fatal',
-] as const
-export type LogLevel = (typeof logLevels)[number]
-
-export interface LoggerOptions {
-  name: string
-  level?: LogLevel
-  sentryOptions?: NodeOptions
-  streams?: Streams
-}
-
-/**
- * Temporary wrapper class to maintain earlier module interface.
- */
-export class Logger {
-  options: LoggerOptions
-  inner: pino.Logger
-
-  constructor(options: LoggerOptions) {
-    this.options = options
-
-    const loggerOptions: PinoLoggerOptions = {
-      name: options.name,
-
-      level: options.level || 'debug',
-
-      // Remove pid and hostname considering production runs inside docker
-      base: null,
-    }
-
-    let loggerStreams: Streams = [{ stream: process.stdout }]
-    if (options.sentryOptions) {
-      loggerStreams.push({
-        level: 'error',
-        stream: createWriteStream({
-          ...options.sentryOptions,
-          stackAttributeKey: 'err',
-        }),
-      })
-    }
-    if (options.streams) {
-      loggerStreams = loggerStreams.concat(options.streams)
-    }
-
-    this.inner = pino(loggerOptions, pinoms.multistream(loggerStreams))
-  }
-
-  child(bindings: pino.Bindings): Logger {
-    const inner = this.inner.child(bindings)
-    const logger = new Logger(this.options)
-    logger.inner = inner
-    return logger
-  }
-
-  trace(msg: string, o?: object, ...args: any[]): void {
-    if (o) {
-      this.inner.trace(o, msg, ...args)
-    } else {
-      this.inner.trace(msg, ...args)
-    }
-  }
-
-  debug(msg: string, o?: object, ...args: any[]): void {
-    if (o) {
-      this.inner.debug(o, msg, ...args)
-    } else {
-      this.inner.debug(msg, ...args)
-    }
-  }
-
-  info(msg: string, o?: object, ...args: any[]): void {
-    if (o) {
-      this.inner.info(o, msg, ...args)
-    } else {
-      this.inner.info(msg, ...args)
-    }
-  }
-
-  warn(msg: string, o?: object, ...args: any[]): void {
-    if (o) {
-      this.inner.warn(o, msg, ...args)
-    } else {
-      this.inner.warn(msg, ...args)
-    }
-  }
-
-  warning(msg: string, o?: object, ...args: any[]): void {
-    if (o) {
-      this.inner.warn(o, msg, ...args)
-    } else {
-      this.inner.warn(msg, ...args)
-    }
-  }
-
-  error(msg: string, o?: object, ...args: any[]): void {
-    if (o) {
-      // Formatting error log for Sentry
-      const context = {
-        extra: { ...o },
-      }
-      this.inner.error(context, msg, ...args)
-    } else {
-      this.inner.error(msg, ...args)
-    }
-  }
-
-  fatal(msg: string, o?: object, ...args: any[]): void {
-    if (o) {
-      const context = {
-        extra: { ...o },
-      }
-      this.inner.fatal(context, msg, ...args)
-    } else {
-      this.inner.fatal(msg, ...args)
-    }
-  }
-}
diff --git a/packages/common-ts/src/common/metrics.ts b/packages/common-ts/src/common/metrics.ts
deleted file mode 100644
index bf2bdb213009..000000000000
--- a/packages/common-ts/src/common/metrics.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { Server } from 'net'
-
-import prometheus, {
-  collectDefaultMetrics,
-  DefaultMetricsCollectorConfiguration,
-  Registry,
-} from 'prom-client'
-import express from 'express'
-
-import { Logger } from './logger'
-
-export interface MetricsOptions {
-  prefix?: string
-  labels?: Object
-}
-
-export class LegacyMetrics {
-  options: MetricsOptions
-  client: typeof prometheus
-  registry: Registry
-
-  constructor(options: MetricsOptions) {
-    this.options = options
-
-    const metricsOptions: DefaultMetricsCollectorConfiguration = {
-      prefix: options.prefix,
-      labels: options.labels,
-    }
-
-    this.client = prometheus
-    this.registry = prometheus.register
-
-    // Collect default metrics (event loop lag, memory, file descriptors etc.)
-    collectDefaultMetrics(metricsOptions)
-  }
-}
-
-export interface MetricsServerOptions {
-  logger: Logger
-  registry: Registry
-  port?: number
-  route?: string
-  hostname?: string
-}
-
-export const createMetricsServer = async (
-  options: MetricsServerOptions
-): Promise => {
-  const logger = options.logger.child({ component: 'MetricsServer' })
-
-  const app = express()
-
-  const route = options.route || '/metrics'
-  app.get(route, async (_, res) => {
-    res.status(200).send(await options.registry.metrics())
-  })
-
-  const port = options.port || 7300
-  const hostname = options.hostname || '0.0.0.0'
-  const server = app.listen(port, hostname, () => {
-    logger.info('Metrics server started', {
-      port,
-      hostname,
-      route,
-    })
-  })
-
-  return server
-}
diff --git a/packages/common-ts/src/common/provider.ts b/packages/common-ts/src/common/provider.ts
deleted file mode 100644
index 7c57c26e5840..000000000000
--- a/packages/common-ts/src/common/provider.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Provider } from '@ethersproject/abstract-provider'
-import { sleep } from '@eth-optimism/core-utils'
-
-import { Logger } from './logger'
-
-/**
- * Waits for an Ethers provider to be connected.
- *
- * @param provider Ethers provider to check.
- * @param opts Options for the function.
- * @param opts.logger Logger to use.
- * @param opts.intervalMs Interval to wait between checks.
- * @param opts.name Name of the provider for logs.
- */
-export const waitForProvider = async (
-  provider: Provider,
-  opts?: {
-    logger?: Logger
-    intervalMs?: number
-    name?: string
-  }
-) => {
-  const name = opts?.name || 'target'
-  opts?.logger?.info(`waiting for ${name} provider...`)
-  let connected = false
-  while (!connected) {
-    try {
-      await provider.getBlockNumber()
-      connected = true
-    } catch (e) {
-      opts?.logger?.info(`${name} provider not connected, retrying...`)
-      await sleep(opts?.intervalMs || 15000)
-    }
-  }
-  opts?.logger?.info(`${name} provider connected`)
-}
diff --git a/packages/common-ts/src/index.ts b/packages/common-ts/src/index.ts
deleted file mode 100644
index 3f8827d14604..000000000000
--- a/packages/common-ts/src/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './common'
-export * from './base-service'
diff --git a/packages/common-ts/test/metrics.spec.ts b/packages/common-ts/test/metrics.spec.ts
deleted file mode 100644
index 4a51fc2a9664..000000000000
--- a/packages/common-ts/test/metrics.spec.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import request from 'supertest'
-// Setup
-import chai = require('chai')
-const expect = chai.expect
-
-import { Logger, LegacyMetrics, createMetricsServer } from '../src'
-
-describe('Metrics', () => {
-  it('should serve metrics', async () => {
-    const metrics = new LegacyMetrics({
-      prefix: 'test_metrics',
-    })
-    const registry = metrics.registry
-    const logger = new Logger({ name: 'test_logger' })
-
-    const server = await createMetricsServer({
-      logger,
-      registry,
-      port: 42069,
-    })
-
-    try {
-      // Create two metrics for testing
-      const counter = new metrics.client.Counter({
-        name: 'counter',
-        help: 'counter help',
-        registers: [registry],
-      })
-      const gauge = new metrics.client.Gauge({
-        name: 'gauge',
-        help: 'gauge help',
-        registers: [registry],
-      })
-
-      counter.inc()
-      counter.inc()
-      gauge.set(100)
-
-      // Verify that the registered metrics are served at `/`
-      const response = await request(server).get('/metrics').send()
-      expect(response.status).eq(200)
-      expect(response.text).match(/counter 2/)
-      expect(response.text).match(/gauge 100/)
-    } finally {
-      server.close()
-      registry.clear()
-    }
-  })
-})
diff --git a/packages/common-ts/test/service-spec.ts b/packages/common-ts/test/service-spec.ts
deleted file mode 100644
index c04adec3a461..000000000000
--- a/packages/common-ts/test/service-spec.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { validators } from '../dist'
-import { BaseServiceV2 } from '../src'
-
-type ServiceOptions = {
-  camelCase: string
-}
-
-class Service extends BaseServiceV2 {
-  constructor(options?: Partial) {
-    super({
-      name: 'test-service',
-      version: '0.0',
-      options,
-      optionsSpec: {
-        camelCase: { validator: validators.str, desc: 'test' },
-      },
-      metricsSpec: {},
-    })
-  }
-  protected async main() {
-    /* eslint-disable @typescript-eslint/no-empty-function */
-  }
-}
-
-describe('BaseServiceV2', () => {
-  it('base service ctor does not throw on camel case options', async () => {
-    new Service({ camelCase: 'test' })
-  })
-})
diff --git a/packages/common-ts/tsconfig.json b/packages/common-ts/tsconfig.json
deleted file mode 100644
index 1736804e2889..000000000000
--- a/packages/common-ts/tsconfig.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "extends": "../../tsconfig.json",
-  "compilerOptions": {
-    "rootDir": "./src",
-    "outDir": "./dist",
-    "skipLibCheck": true
-  },
-
-  "include": [
-    "src/**/*"
-  ]
-}
diff --git a/packages/contracts-bedrock/.gas-snapshot b/packages/contracts-bedrock/.gas-snapshot
index c0d5007bbc8d..25dfa45eaf93 100644
--- a/packages/contracts-bedrock/.gas-snapshot
+++ b/packages/contracts-bedrock/.gas-snapshot
@@ -1,11 +1,11 @@
-GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_0() (gas: 356552)
-GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_1() (gas: 2954737)
-GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 549159)
-GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 4061135)
-GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_0() (gas: 450308)
-GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 3496057)
-GasBenchMark_L1StandardBridge_Finalize:test_finalizeETHWithdrawal_benchmark() (gas: 59803)
-GasBenchMark_L2OutputOracle:test_proposeL2Output_benchmark() (gas: 92930)
-GasBenchMark_OptimismPortal:test_depositTransaction_benchmark() (gas: 68360)
-GasBenchMark_OptimismPortal:test_depositTransaction_benchmark_1() (gas: 69013)
-GasBenchMark_OptimismPortal:test_proveWithdrawalTransaction_benchmark() (gas: 155556)
\ No newline at end of file
+GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_0() (gas: 369380)
+GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_1() (gas: 2967520)
+GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 561992)
+GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 4074035)
+GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_0() (gas: 466947)
+GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 3512629)
+GasBenchMark_L1StandardBridge_Finalize:test_finalizeETHWithdrawal_benchmark() (gas: 72629)
+GasBenchMark_L2OutputOracle:test_proposeL2Output_benchmark() (gas: 92973)
+GasBenchMark_OptimismPortal:test_depositTransaction_benchmark() (gas: 68433)
+GasBenchMark_OptimismPortal:test_depositTransaction_benchmark_1() (gas: 68903)
+GasBenchMark_OptimismPortal:test_proveWithdrawalTransaction_benchmark() (gas: 155618)
\ No newline at end of file
diff --git a/packages/contracts-bedrock/.gitignore b/packages/contracts-bedrock/.gitignore
index 8b673a6cb333..6d5212b28b4e 100644
--- a/packages/contracts-bedrock/.gitignore
+++ b/packages/contracts-bedrock/.gitignore
@@ -29,6 +29,12 @@ deployments/hardhat
 deployments/getting-started
 deployments/*/.deploy
 deployments/1337
+deployments/31337-deploy.json
+deployments/kontrol.json
+deployments/kontrol.jsonReversed
+deployments/kontrol-fp.json
+deployments/kontrol-fp.jsonReversed
+snapshots/state-diff/Kontrol-31337.json
 
 # Devnet config which changes with each 'make devnet-up'
 deploy-config/devnetL1.json
diff --git a/packages/contracts-bedrock/CHANGELOG.md b/packages/contracts-bedrock/CHANGELOG.md
index 881f44272508..231089ac102d 100644
--- a/packages/contracts-bedrock/CHANGELOG.md
+++ b/packages/contracts-bedrock/CHANGELOG.md
@@ -1,5 +1,11 @@
 # @eth-optimism/contracts-bedrock
 
+## 0.17.2
+
+### Patch Changes
+
+- [#9964](https://github.com/ethereum-optimism/optimism/pull/9964) [`8241220898128e1f61064f22dcb6fdd0a5f043c3`](https://github.com/ethereum-optimism/optimism/commit/8241220898128e1f61064f22dcb6fdd0a5f043c3) Thanks [@roninjin10](https://github.com/roninjin10)! - Removed only-allow command from package.json
+
 ## 0.17.1
 
 ### Patch Changes
diff --git a/packages/contracts-bedrock/README.md b/packages/contracts-bedrock/README.md
index 4f92a317dff3..beab7e0212d9 100644
--- a/packages/contracts-bedrock/README.md
+++ b/packages/contracts-bedrock/README.md
@@ -1,58 +1,269 @@
-# Optimism Smart Contracts (Bedrock)
+# OP Stack Smart Contracts
+
+This package contains the L1 and L2 smart contracts for the OP Stack.
+Detailed specifications for the contracts contained within this package can be found at [specs.optimism.io](https://specs.optimism.io).
+High-level information about these contracts can be found within this README and within the [Optimism Developer Docs](https://docs.optimism.io).
+
+
+
+## Table of Contents
+
+- [Architecture Overview](#architecture-overview)
+  - [Core L1 Smart Contracts](#core-l1-smart-contracts)
+    - [Notes for Core L1 Smart Contracts](#notes-for-core-l1-smart-contracts)
+  - [Core L2 Smart Contracts](#core-l2-smart-contracts)
+    - [Notes for Core L2 Smart Contracts](#notes-for-core-l2-smart-contracts)
+  - [Smart Contract Proxies](#smart-contract-proxies)
+- [External Usage](#external-usage)
+  - [Using OP Stack Contracts in Solidity](#using-op-stack-contracts-in-solidity)
+  - [Using OP Stack Contracts in JavaScript](#using-op-stack-contracts-in-javascript)
+  - [Deployed Addresses](#deployed-addresses)
+- [Contributing](#contributing)
+  - [Contributing Guide](#contributing-guide)
+  - [Style Guide](#style-guide)
+- [Deployment](#deployment)
+  - [Configuration](#configuration)
+    - [Custom Gas Token](#custom-gas-token)
+  - [Execution](#execution)
+  - [Deploying a single contract](#deploying-a-single-contract)
+- [Testing](#testing)
+  - [Test Setup](#test-setup)
+  - [Static Analysis](#static-analysis)
+
+
+
+## Architecture Overview
+
+> **NOTE**: Smart contract names in the architecture diagrams below are links to source code. Click them!
+
+### Core L1 Smart Contracts
+
+Below you'll find an architecture diagram describing the core L1 smart contracts for the OP Stack.
+Smart contracts that are considered "peripheral" and not core to the operation of the OP Stack system are described separately.
+
+```mermaid
+graph LR
+    subgraph "External Contracts"
+        ExternalERC20(External ERC20 Contracts)
+        ExternalERC721(External ERC721 Contracts)
+    end
+
+    subgraph "L1 Smart Contracts"
+        BatchDataEOA(Batch Inbox Address)
+        L1StandardBridge(L1StandardBridge)
+        L1ERC721Bridge(L1ERC721Bridge)
+        L1CrossDomainMessenger(L1CrossDomainMessenger)
+        L2OutputOracle(L2OutputOracle)
+        OptimismPortal(OptimismPortal)
+        SuperchainConfig(SuperchainConfig)
+        SystemConfig(SystemConfig)
+    end
+
+    subgraph "User Interactions"
+        Users(Users)
+    end
+
+    subgraph "System Interactions"
+        Batcher(Batcher)
+        Proposer(Proposer)
+        Guardian(Guardian)
+    end
+
+    subgraph "Layer 2 Interactions"
+        L2Nodes(Layer 2 Nodes)
+    end
+
+    Batcher -->|publish transaction batches| BatchDataEOA
+    Proposer -->|propose state outputs| L2OutputOracle
+    Guardian -->|remove invalid state outputs| L2OutputOracle
+
+    ExternalERC20 <-->|mint/burn/transfer| L1StandardBridge
+    ExternalERC721 <-->|mint/burn/transfer| L1ERC721Bridge
+
+    L1StandardBridge <-->|send/receive message| L1CrossDomainMessenger
+    L1ERC721Bridge <-->|send/receive message| L1CrossDomainMessenger
+    L1CrossDomainMessenger <-->|package/send/receive message| OptimismPortal
+    L1StandardBridge -.->|query pause state| SuperchainConfig
+    L1ERC721Bridge -.->|query pause state| SuperchainConfig
+    L1CrossDomainMessenger -.->|query pause state| SuperchainConfig
+    OptimismPortal -.->|query pause state| SuperchainConfig
+
+    OptimismPortal -.->|query config| SystemConfig
+    OptimismPortal -.->|query proposed states| L2OutputOracle
+
+    Users <-->|deposit/withdraw ETH/ERC20| L1StandardBridge
+    Users <-->|deposit/withdraw ERC721| L1ERC721Bridge
+    Users -->|prove/execute withdrawal transactions| OptimismPortal
+
+    L2Nodes -.->|fetch transaction batches| BatchDataEOA
+    L2Nodes -.->|verify output roots| L2OutputOracle
+    L2Nodes -.->|fetch deposit events| OptimismPortal
+
+    classDef extContracts stroke:#ff9,stroke-width:2px;
+    classDef l1Contracts stroke:#bbf,stroke-width:2px;
+    classDef l1EOA stroke:#bbb,stroke-width:2px;
+    classDef userInt stroke:#f9a,stroke-width:2px;
+    classDef systemUser stroke:#f9a,stroke-width:2px;
+    classDef l2Nodes stroke:#333,stroke-width:2px
+    class ExternalERC20,ExternalERC721 extContracts;
+    class L1StandardBridge,L1ERC721Bridge,L1CrossDomainMessenger,L2OutputOracle,OptimismPortal,SuperchainConfig,SystemConfig l1Contracts;
+    class BatchDataEOA l1EOA;
+    class Users userInt;
+    class Batcher,Proposer,Guardian systemUser;
+    class L2Nodes l2Nodes;
+```
 
-[![codecov](https://codecov.io/gh/ethereum-optimism/optimism/branch/develop/graph/badge.svg?token=0VTG7PG7YR&flag=contracts-bedrock-tests)](https://codecov.io/gh/ethereum-optimism/optimism)
+#### Notes for Core L1 Smart Contracts
+
+- The `Batch Data Address` described above (**highlighted in GREY**) is *not* a smart contract and is instead simply an arbitrarily chosen account that is assumed to have no known private key. This account is typically chosen as the account `0xFF0000....` where `` is chain ID of the Layer 2 network for which the data is being posted. For instance, for OP Mainnet, this account is chosen as `0xFF00000000000000000000000000000000000010`. However, this is not a strict requirement and some OP Stack chains may not follow this convention.
+- Smart contracts that sit behind `Proxy` contracts are **highlighted in BLUE**. Refer to the [Smart Contract Proxies](#smart-contract-proxies) section below to understand how these proxies are designed.
+  - The `L1CrossDomainMessenger` contract sits behind the [`ResolvedDelegateProxy`](https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/legacy/ResolvedDelegateProxy.sol) contract, a legacy proxy contract type used within older versions of the OP Stack. This proxy type is used exclusively for the `L1CrossDomainMessenger` to maintain backwards compatibility.
+  - The `L1StandardBridge` contract sits behind the [`L1ChugSplashProxy`](https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/legacy/L1ChugSplashProxy.sol) contract, a legacy proxy contract type used within older versions of the OP Stack. This proxy type is used exclusively for the `L1StandardBridge` contract to maintain backwards compatibility.
+
+### Core L2 Smart Contracts
+
+Here you'll find an architecture diagram describing the core OP Stack smart contracts that exist natively on the L2 chain itself.
+
+```mermaid
+graph LR
+    subgraph "Layer 1 (Ethereum)"
+        L1SmartContracts(L1 Smart Contracts)
+    end
+
+    subgraph "L2 Client"
+        L2Node(L2 Node)
+    end
+
+    subgraph "L2 System Contracts"
+        L1Block(L1Block)
+        GasPriceOracle(GasPriceOracle)
+        L1FeeVault(L1FeeVault)
+        BaseFeeVault(BaseFeeVault)
+        SequencerFeeVault(SequencerFeeVault)
+    end
+
+    subgraph "L2 Bridge Contracts"
+        L2CrossDomainMessenger(L2CrossDomainMessenger)
+        L2ToL1MessagePasser(L2ToL1MessagePasser)
+        L2StandardBridge(L2StandardBridge)
+        L2ERC721Bridge(L2ERC721Bridge)
+    end
+
+    subgraph "Transactions"
+        DepositTransaction(Deposit Transaction)
+        UserTransaction(User Transaction)
+    end
+
+    subgraph "External Contracts"
+        ExternalERC20(External ERC20 Contracts)
+        ExternalERC721(External ERC721 Contracts)
+    end
+
+    subgraph "Remaining L2 Universe"
+        OtherContracts(Any Contracts and Addresses)
+    end
+
+    L2Node -.->|derives chain from| L1SmartContracts
+    L2Node -->|updates| L1Block
+    L2Node -->|distributes fees to| L1FeeVault
+    L2Node -->|distributes fees to| BaseFeeVault
+    L2Node -->|distributes fees to| SequencerFeeVault
+    L2Node -->|derives from deposits| DepositTransaction
+    L2Node -->|derives from chain data| UserTransaction
+
+    UserTransaction -->|can trigger| OtherContracts
+    DepositTransaction -->|maybe triggers| L2CrossDomainMessenger
+    DepositTransaction -->|can trigger| OtherContracts
+
+    ExternalERC20 <-->|mint/burn/transfer| L2StandardBridge
+    ExternalERC721 <-->|mint/burn/transfer| L2ERC721Bridge
+
+    L2StandardBridge <-->|sends/receives messages| L2CrossDomainMessenger
+    L2ERC721Bridge <-->|sends/receives messages| L2CrossDomainMessenger
+    GasPriceOracle -.->|queries| L1Block
+    L2CrossDomainMessenger -->|sends messages| L2ToL1MessagePasser
+
+    classDef extContracts stroke:#ff9,stroke-width:2px;
+    classDef l2Contracts stroke:#bbf,stroke-width:2px;
+    classDef transactions stroke:#fba,stroke-width:2px;
+    classDef l2Node stroke:#f9a,stroke-width:2px;
+
+    class ExternalERC20,ExternalERC721 extContracts;
+    class L2CrossDomainMessenger,L2ToL1MessagePasser,L2StandardBridge,L2ERC721Bridge l2Contracts;
+    class L1Block,L1FeeVault,BaseFeeVault,SequencerFeeVault,GasPriceOracle l2Contracts;
+    class UserTransaction,DepositTransaction transactions;
+    class L2Node l2Node;
+```
 
-This package contains the smart contracts that compose the on-chain component of Optimism's upcoming Bedrock upgrade.
-We've tried to maintain 100% backwards compatibility with the existing system while also introducing new useful features.
-You can find detailed specifications for the contracts contained within this package [here](../../specs).
+#### Notes for Core L2 Smart Contracts
 
-A style guide we follow for writing contracts can be found [here](./STYLE_GUIDE.md).
+- Contracts highlighted as "L2 System Contracts" are updated or mutated automatically as part of the chain derivation process. Users typically do not mutate these contracts directly, except in the case of the `FeeVault` contracts where any user may trigger a withdrawal of collected fees to the pre-determined withdrawal address.
+- Smart contracts that sit behind `Proxy` contracts are **highlighted in BLUE**. Refer to the [Smart Contract Proxies](#smart-contract-proxies) section below to understand how these proxies are designed.
+- User interactions for the "L2 Bridge Contracts" have been omitted from this diagram but largely follow the same user interactions described in the architecture diagram for the [Core L1 Smart Contracts](#core-l1-smart-contracts).
 
-## Contracts Overview
+### Smart Contract Proxies
 
-### Contracts deployed to L1
+Most L1 and L2 smart contracts for OP Stack chains today sit behind `Proxy` contracts that themselves are managed by a `ProxyAdmin` contract.
+The `ProxyAdmin` contract is controlled by some `owner` address that can be any EOA or smart contract.
+Below you'll find a diagram that explains the behavior of the typical proxy contract.
 
-| Name                                                                                     | Proxy Type                                                              | Description                                                                                         |
-| ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
-| [`L1CrossDomainMessenger`](../../specs/messengers.md)                                    | [`ResolvedDelegateProxy`](./contracts/legacy/ResolvedDelegateProxy.sol) | High-level interface for sending messages to and receiving messages from Optimism                   |
-| [`L1StandardBridge`](../../specs/bridges.md)                                             | [`L1ChugSplashProxy`](./contracts/legacy/L1ChugSplashProxy.sol)         | Standardized system for transferring ERC20 tokens to/from Optimism                                   |
-| [`L2OutputOracle`](../../specs/proposals.md#l2-output-oracle-smart-contract)             | [`Proxy`](./contracts/universal/Proxy.sol)                              | Stores commitments to the state of Optimism which can be used by contracts on L1 to access L2 state |
-| [`OptimismPortal`](../../specs/deposits.md#deposit-contract)                             | [`Proxy`](./contracts/universal/Proxy.sol)                              | Low-level message passing interface                                                                 |
-| [`OptimismMintableERC20Factory`](../../specs/predeploys.md#optimismmintableerc20factory) | [`Proxy`](./contracts/universal/Proxy.sol)                              | Deploys standard `OptimismMintableERC20` tokens that are compatible with either `StandardBridge`    |
-| [`ProxyAdmin`](../../specs/TODO)                                                         | -                                                                       | Contract that can upgrade L1 contracts                                                              |
+```mermaid
+graph LR
+    ProxyAdminOwner(Proxy Admin Owner)
+    ProxyAdmin(ProxyAdmin)
 
-### Contracts deployed to L2
+    subgraph "Logical Smart Contract"
+        Proxy(Proxy)
+        Implementation(Implementation)
+    end
 
-| Name                                                                                     | Proxy Type                                 | Description                                                                                      |
-| ---------------------------------------------------------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------ |
-| [`GasPriceOracle`](../../specs/predeploys.md#ovm_gaspriceoracle)                         | [`Proxy`](./contracts/universal/Proxy.sol) | Stores L2 gas price configuration values                                                         |
-| [`L1Block`](../../specs/predeploys.md#l1block)                                           | [`Proxy`](./contracts/universal/Proxy.sol) | Stores L1 block context information (e.g., latest known L1 block hash)                           |
-| [`L2CrossDomainMessenger`](../../specs/predeploys.md#l2crossdomainmessenger)             | [`Proxy`](./contracts/universal/Proxy.sol) | High-level interface for sending messages to and receiving messages from L1                      |
-| [`L2StandardBridge`](../../specs/predeploys.md#l2standardbridge)                         | [`Proxy`](./contracts/universal/Proxy.sol) | Standardized system for transferring ERC20 tokens to/from L1                                     |
-| [`L2ToL1MessagePasser`](../../specs/predeploys.md#ovm_l2tol1messagepasser)               | [`Proxy`](./contracts/universal/Proxy.sol) | Low-level message passing interface                                                              |
-| [`SequencerFeeVault`](../../specs/predeploys.md#sequencerfeevault)                       | [`Proxy`](./contracts/universal/Proxy.sol) | Vault for L2 transaction fees                                                                    |
-| [`OptimismMintableERC20Factory`](../../specs/predeploys.md#optimismmintableerc20factory) | [`Proxy`](./contracts/universal/Proxy.sol) | Deploys standard `OptimismMintableERC20` tokens that are compatible with either `StandardBridge` |
-| [`L2ProxyAdmin`](../../specs/TODO)                                                       | -                                          | Contract that can upgrade L2 contracts when sent a transaction from L1                           |
+    ProxyAdminOwner -->|manages| ProxyAdmin
+    ProxyAdmin -->|upgrades| Proxy
+    Proxy -->|delegatecall| Implementation
 
-### Legacy and deprecated contracts
+    classDef l1Contracts stroke:#bbf,stroke-width:2px;
+    classDef systemUser stroke:#f9a,stroke-width:2px;
+    class Proxy l1Contracts;
+    class ProxyAdminOwner systemUser;
+```
 
-| Name                                                            | Location | Proxy Type                                 | Description                                                                           |
-| --------------------------------------------------------------- | -------- | ------------------------------------------ | ------------------------------------------------------------------------------------- |
-| [`AddressManager`](./contracts/legacy/AddressManager.sol)       | L1       | -                                          | Legacy upgrade mechanism (unused in Bedrock)                                          |
-| [`DeployerWhitelist`](./contracts/legacy/DeployerWhitelist.sol) | L2       | [`Proxy`](./contracts/universal/Proxy.sol) | Legacy contract for managing allowed deployers (unused since EVM Equivalence upgrade) |
-| [`L1BlockNumber`](./contracts/legacy/L1BlockNumber.sol)         | L2       | [`Proxy`](./contracts/universal/Proxy.sol) | Legacy contract for accessing latest known L1 block number, replaced by `L1Block`     |
+## External Usage
 
-## Installation
+### Using OP Stack Contracts in Solidity
 
-We export contract ABIs, contract source code, and contract deployment information for this package via `npm`:
+OP Stack smart contracts are published to NPM and can be installed via:
 
-```shell
-npm install @eth-optimism/contracts-bedrock
+```sh
+npm install @eth-optimism/contracts-bedrock.
 ```
 
+Refer to the [Optimism Developer Docs](https://docs.optimism.io/builders/dapp-developers/contracts/system-contracts#using-system-contracts-in-solidity) for additional information about how to use this package.
+
+### Using OP Stack Contracts in JavaScript
+
+Contract ABIs and addresses are published to NPM in a separate package and can be installed via:
+
+```sh
+npm install @eth-optimism/contracts-ts
+```
+
+Refer to the [Optimism Developer Docs](https://docs.optimism.io/builders/dapp-developers/contracts/system-contracts#using-system-contracts-in-javascript) for additional information about how to use this package.
+
+### Deployed Addresses
+
+See the [Optimism Developer Docs](https://docs.optimism.io/chain/addresses) for the deployed addresses of these smart contracts for OP Mainnet and OP Sepolia.
+
 ## Contributing
 
-For all information about working on and contributing to Optimism's smart contracts, please see [CONTRIBUTING.md](./CONTRIBUTING.md)
+### Contributing Guide
+
+Contributions to the OP Stack are always welcome.
+Please refer to the [CONTRIBUTING.md](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/CONTRIBUTING.md) for more information about how to contribute to the OP Stack smart contracts.
+
+### Style Guide
+
+OP Stack smart contracts should be written according to the [STYLE_GUIDE.md](./STYLE_GUIDE.md) found within this repository.
+Maintaining a consistent code style makes code easier to review and maintain, ultimately making the development process safer.
 
 ## Deployment
 
@@ -67,24 +278,30 @@ values are addresses. This works well with the JSON files in `superchain-ops`.
 ### Configuration
 
 Create or modify a file `.json` inside of the [`deploy-config`](./deploy-config/) folder.
-By default, the network name will be selected automatically based on the chainid. Alternatively, the `DEPLOYMENT_CONTEXT` env var can be used to override the network name.
-The spec for the deploy config is defined by the `deployConfigSpec` located inside of the [`hardhat.config.ts`](./hardhat.config.ts).
+Use the env var `DEPLOY_CONFIG_PATH` to use a particular deploy config file at runtime.
+
+#### Custom Gas Token
+
+The Custom Gas Token feature is a Beta feature of the MIT licensed OP Stack.
+While it has received initial review from core contributors, it is still undergoing testing, and may have bugs or other issues.
 
 ### Execution
 
 Before deploying the contracts, you can verify the state diff produced by the deploy script using the `runWithStateDiff()` function signature which produces the outputs inside [`snapshots/state-diff/`](./snapshots/state-diff).
 Run the deployment with state diffs by executing: `forge script -vvv scripts/Deploy.s.sol:Deploy --sig 'runWithStateDiff()' --rpc-url $ETH_RPC_URL --broadcast --private-key $PRIVATE_KEY`.
 
-1. Set the env vars `ETH_RPC_URL`, `PRIVATE_KEY` and `ETHERSCAN_API_KEY` if contract verification is desired
+1. Set the env vars `ETH_RPC_URL`, `PRIVATE_KEY` and `ETHERSCAN_API_KEY` if contract verification is desired.
+1. Set the `DEPLOY_CONFIG_PATH` env var to a path on the filesystem that points to a deploy config.
 1. Deploy the contracts with `forge script -vvv scripts/Deploy.s.sol:Deploy --rpc-url $ETH_RPC_URL --broadcast --private-key $PRIVATE_KEY`
    Pass the `--verify` flag to verify the deployments automatically with Etherscan.
-1. Generate the hardhat deploy artifacts with `forge script -vvv scripts/Deploy.s.sol:Deploy --sig 'sync()' --rpc-url $ETH_RPC_URL --broadcast --private-key $PRIVATE_KEY`
 
 ### Deploying a single contract
 
 All of the functions for deploying a single contract are `public` meaning that the `--sig` argument to `forge script` can be used to
 target the deployment of a single contract.
 
+## Testing
+
 ### Test Setup
 
 The Solidity unit tests use the same codepaths to set up state that are used in production. The same L1 deploy script is used to deploy the L1 contracts for the in memory tests
diff --git a/packages/contracts-bedrock/STYLE_GUIDE.md b/packages/contracts-bedrock/STYLE_GUIDE.md
index 181521368c58..a27d5b0e5721 100644
--- a/packages/contracts-bedrock/STYLE_GUIDE.md
+++ b/packages/contracts-bedrock/STYLE_GUIDE.md
@@ -1,5 +1,31 @@
 # Smart Contract Style Guide
 
+
+
+
+- [Standards and Conventions](#standards-and-conventions)
+  - [Style](#style)
+    - [Comments](#comments)
+    - [Errors](#errors)
+    - [Function Parameters](#function-parameters)
+    - [Function Return Arguments](#function-return-arguments)
+    - [Event Parameters](#event-parameters)
+    - [Immutable variables](#immutable-variables)
+    - [Spacers](#spacers)
+  - [Proxy by Default](#proxy-by-default)
+  - [Versioning](#versioning)
+    - [Exceptions](#exceptions)
+  - [Dependencies](#dependencies)
+  - [Source Code](#source-code)
+  - [Tests](#tests)
+    - [Expect Revert with Low Level Calls](#expect-revert-with-low-level-calls)
+    - [Organizing Principles](#organizing-principles)
+    - [Test function naming convention](#test-function-naming-convention)
+    - [Contract Naming Conventions](#contract-naming-conventions)
+- [Withdrawing From Fee Vaults](#withdrawing-from-fee-vaults)
+
+
+
 This document provides guidance on how we organize and write our smart contracts. For cases where
 this document does not provide guidance, please refer to existing contracts for guidance,
 with priority on the `L2OutputOracle` and `OptimismPortal`.
@@ -106,6 +132,12 @@ making changes to a well-known, simple, and recognizable contract.
 Where basic functionality is already supported by an existing contract in the OpenZeppelin library,
 we should default to using the Upgradeable version of that contract.
 
+### Source Code
+
+The following guidelines should be followed for all contracts in the `src/` directory:
+
+- All state changing functions should emit a corresponding event. This ensures that all actions are transparent, can be easily monitored, and can be reconstructed from the event logs.
+
 ### Tests
 
 Tests are written using Foundry.
diff --git a/packages/contracts-bedrock/deploy-config/base-sepolia.json b/packages/contracts-bedrock/deploy-config/base-sepolia.json
deleted file mode 100644
index f83a1c285782..000000000000
--- a/packages/contracts-bedrock/deploy-config/base-sepolia.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "finalSystemOwner": "0x608081689Fe46936fB2fBDF7552CbB1D80ad4822",
-
-  "l1StartingBlockTag": "safe",
-
-  "l1ChainID": 11155111,
-  "l2ChainID": 84532,
-  "l1BlockTime": 12,
-  "l2BlockTime": 2,
-
-  "maxSequencerDrift": 600,
-  "sequencerWindowSize": 3600,
-  "channelTimeout": 300,
-
-  "p2pSequencerAddress": "0xb830b99c95Ea32300039624Cb567d324D4b1D83C",
-  "batchInboxAddress": "0xFf00000000000000000000000000000000084532",
-  "batchSenderAddress": "0x6CDEbe940BC0F26850285cacA097C11c33103E47",
-
-  "l2OutputOracleSubmissionInterval": 120,
-  "l2OutputOracleStartingBlockNumber": 0,
-  "l2OutputOracleStartingTimestamp": 1695767904,
-
-  "l2OutputOracleProposer": "0x20044a0d104E9e788A0C984A2B7eAe615afD046b",
-  "l2OutputOracleChallenger": "0xDa3037Ff70Ac92CD867c683BD807e5A484857405",
-
-  "finalizationPeriodSeconds": 12,
-
-  "proxyAdminOwner": "0x8937037a0bB08658e5A178C182e60b12f14720ce",
-  "baseFeeVaultRecipient": "0xc7dE632EC7f11634318856a57c5897f6a0bda3b0",
-  "l1FeeVaultRecipient": "0x9082AB367EAFe8887a88A1B9970BE2719007Cf6b",
-  "sequencerFeeVaultRecipient": "0x4cFDfb25b34b5e5E3932dA5C4F080194137AF20F",
-
-  "baseFeeVaultMinimumWithdrawalAmount": "0x1bc16d674ec80000",
-  "l1FeeVaultMinimumWithdrawalAmount": "0x1bc16d674ec80000",
-  "sequencerFeeVaultMinimumWithdrawalAmount": "0x1bc16d674ec80000",
-  "baseFeeVaultWithdrawalNetwork": 0,
-  "l1FeeVaultWithdrawalNetwork": 0,
-  "sequencerFeeVaultWithdrawalNetwork": 0,
-
-  "gasPriceOracleOverhead": 2100,
-  "gasPriceOracleScalar": 1000000,
-
-  "governanceTokenSymbol": "NA",
-  "governanceTokenName": "NotApplicable",
-  "governanceTokenOwner": "0xEb5E931176714636563DC7BE4A10387D911BaE05",
-
-  "l2GenesisBlockGasLimit": "0x17D7840",
-  "l2GenesisBlockBaseFeePerGas": "0x3b9aca00",
-
-  "eip1559Denominator": 50,
-  "eip1559Elasticity": 10,
-
-  "l2GenesisRegolithTimeOffset": "0x0",
-
-  "finalSystemOwner": "0x608081689Fe46936fB2fBDF7552CbB1D80ad4822",
-  "superchainConfigGuardian": "0xA9FF930151130fd19DA1F03E5077AFB7C78F8503",
-
-  "systemConfigStartBlock": 0,
-  "requiredProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000",
-  "recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000"
-}
diff --git a/packages/contracts-bedrock/deploy-config/devnetL1-template.json b/packages/contracts-bedrock/deploy-config/devnetL1-template.json
index 60b585d55ab2..557a6b763d1f 100644
--- a/packages/contracts-bedrock/deploy-config/devnetL1-template.json
+++ b/packages/contracts-bedrock/deploy-config/devnetL1-template.json
@@ -35,6 +35,8 @@
   "l2GenesisBlockBaseFeePerGas": "0x1",
   "gasPriceOracleOverhead": 2100,
   "gasPriceOracleScalar": 1000000,
+  "gasPriceOracleBaseFeeScalar": 1368,
+  "gasPriceOracleBlobBaseFeeScalar": 810949,
   "enableGovernance": true,
   "governanceTokenSymbol": "OP",
   "governanceTokenName": "Optimism",
@@ -51,9 +53,10 @@
   "recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000",
   "faultGameAbsolutePrestate": "0x03c7ae758795765c6664a5d39bf63841c71ff191e9189522bad8ebff5d4eca98",
   "faultGameMaxDepth": 50,
-  "faultGameMaxDuration": 2400,
+  "faultGameClockExtension": 0,
+  "faultGameMaxClockDuration": 1200,
   "faultGameGenesisBlock": 0,
-  "faultGameGenesisOutputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
+  "faultGameGenesisOutputRoot": "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
   "faultGameSplitDepth": 14,
   "faultGameWithdrawalDelay": 604800,
   "preimageOracleMinProposalSize": 10000,
@@ -63,8 +66,9 @@
   "respectedGameType": 0,
   "useFaultProofs": false,
   "usePlasma": false,
-  "daChallengeWindow": 6,
-  "daResolveWindow": 6,
+  "daCommitmentType": "KeccakCommitment",
+  "daChallengeWindow": 160,
+  "daResolveWindow": 160,
   "daBondSize": 1000000,
   "daResolverRefundPercentage": 0
 }
diff --git a/packages/contracts-bedrock/deploy-config/goerli.json b/packages/contracts-bedrock/deploy-config/goerli.json
deleted file mode 100644
index 2084f742c403..000000000000
--- a/packages/contracts-bedrock/deploy-config/goerli.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
-  "finalSystemOwner": "0xBc1233d0C3e6B5d53Ab455cF65A6623F6dCd7e4f",
-  "superchainConfigGuardian": "0xBc1233d0C3e6B5d53Ab455cF65A6623F6dCd7e4f",
-  "l1StartingBlockTag": "0x6ffc1bf3754c01f6bb9fe057c1578b87a8571ce2e9be5ca14bace6eccfd336c7",
-  "l1ChainID": 5,
-  "l2ChainID": 420,
-  "l2BlockTime": 2,
-  "l1BlockTime": 12,
-  "maxSequencerDrift": 600,
-  "sequencerWindowSize": 3600,
-  "channelTimeout": 300,
-  "p2pSequencerAddress": "0x715b7219D986641DF9eFd9C7Ef01218D528e19ec",
-  "batchInboxAddress": "0xff00000000000000000000000000000000000420",
-  "batchSenderAddress": "0x7431310e026B69BFC676C0013E12A1A11411EEc9",
-  "l2OutputOracleSubmissionInterval": 120,
-  "l2OutputOracleStartingBlockNumber": 4061224,
-  "l2OutputOracleStartingTimestamp": 1673550516,
-  "l2OutputOracleProposer": "0x02b1786A85Ec3f71fBbBa46507780dB7cF9014f6",
-  "l2OutputOracleChallenger": "0xBc1233d0C3e6B5d53Ab455cF65A6623F6dCd7e4f",
-  "finalizationPeriodSeconds": 12,
-  "proxyAdminOwner": "0xf80267194936da1E98dB10bcE06F3147D580a62e",
-  "baseFeeVaultRecipient": "0xBc1233d0C3e6B5d53Ab455cF65A6623F6dCd7e4f",
-  "l1FeeVaultRecipient": "0xBc1233d0C3e6B5d53Ab455cF65A6623F6dCd7e4f",
-  "sequencerFeeVaultRecipient": "0xBc1233d0C3e6B5d53Ab455cF65A6623F6dCd7e4f",
-  "baseFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "l1FeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "sequencerFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "baseFeeVaultWithdrawalNetwork": 0,
-  "l1FeeVaultWithdrawalNetwork": 0,
-  "sequencerFeeVaultWithdrawalNetwork": 0,
-  "gasPriceOracleOverhead": 2100,
-  "gasPriceOracleScalar": 1000000,
-  "enableGovernance": true,
-  "governanceTokenSymbol": "OP",
-  "governanceTokenName": "Optimism",
-  "governanceTokenOwner": "0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76",
-  "l2GenesisBlockGasLimit": "0x2faf080",
-  "l2GenesisBlockBaseFeePerGas": "0x3b9aca00",
-  "eip1559Denominator": 50,
-  "eip1559DenominatorCanyon": 250,
-  "eip1559Elasticity": 10,
-  "systemConfigStartBlock": 8300214,
-  "requiredProtocolVersion": "0x0000000000000000000000000000000000000003000000010000000000000000",
-  "recommendedProtocolVersion": "0x0000000000000000000000000000000000000003000000010000000000000000",
-  "fundDevAccounts": false,
-  "faultGameAbsolutePrestate": "0x03e1255457128b9afd9acf93239c1d477bdff88624901f9ca8fe0783b756dbe0",
-  "faultGameMaxDepth": 73,
-  "faultGameMaxDuration": 604800,
-  "faultGameGenesisBlock": 4061224,
-  "faultGameGenesisOutputRoot": "0xd08055c58b2c5149565c636b44fad2c25b5ccddef1385a2cb721529d7480b242",
-  "faultGameSplitDepth": 32,
-  "faultGameWithdrawalDelay": 604800,
-  "preimageOracleMinProposalSize": 1800000,
-  "preimageOracleChallengePeriod": 86400,
-  "proofMaturityDelaySeconds": 604800,
-  "disputeGameFinalityDelaySeconds": 302400,
-  "respectedGameType": 0,
-  "useFaultProofs": true
-}
diff --git a/packages/contracts-bedrock/deploy-config/hardhat.json b/packages/contracts-bedrock/deploy-config/hardhat.json
index 6a858e6ebb7f..30a89a4ff4ab 100644
--- a/packages/contracts-bedrock/deploy-config/hardhat.json
+++ b/packages/contracts-bedrock/deploy-config/hardhat.json
@@ -16,8 +16,8 @@
   "l2OutputOracleSubmissionInterval": 6,
   "l2OutputOracleStartingTimestamp": 1,
   "l2OutputOracleStartingBlockNumber": 1,
-  "gasPriceOracleOverhead": 2100,
-  "gasPriceOracleScalar": 1000000,
+  "gasPriceOracleBaseFeeScalar": 1368,
+  "gasPriceOracleBlobBaseFeeScalar": 810949,
   "l2OutputOracleProposer": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
   "l2OutputOracleChallenger": "0x6925B8704Ff96DEe942623d6FB5e946EF5884b63",
   "l2GenesisBlockBaseFeePerGas": "0x3B9ACA00",
@@ -45,9 +45,10 @@
   "recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000",
   "faultGameAbsolutePrestate": "0x0000000000000000000000000000000000000000000000000000000000000000",
   "faultGameMaxDepth": 8,
-  "faultGameMaxDuration": 2400,
+  "faultGameClockExtension": 0,
+  "faultGameMaxClockDuration": 1200,
   "faultGameGenesisBlock": 0,
-  "faultGameGenesisOutputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
+  "faultGameGenesisOutputRoot": "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
   "faultGameSplitDepth": 4,
   "faultGameWithdrawalDelay": 604800,
   "preimageOracleMinProposalSize": 10000,
@@ -56,7 +57,7 @@
   "disputeGameFinalityDelaySeconds": 6,
   "respectedGameType": 0,
   "useFaultProofs": false,
-  "fundDevAccounts": false,
+  "fundDevAccounts": true,
   "usePlasma": false,
   "daChallengeWindow": 100,
   "daResolveWindow": 100,
diff --git a/packages/contracts-bedrock/deploy-config/internal-devnet.json b/packages/contracts-bedrock/deploy-config/internal-devnet.json
index 3dfca2607983..643c507dc86d 100644
--- a/packages/contracts-bedrock/deploy-config/internal-devnet.json
+++ b/packages/contracts-bedrock/deploy-config/internal-devnet.json
@@ -34,8 +34,6 @@
   "governanceTokenOwner": "0x858F0751ef8B4067f0d2668C076BDB50a8549fbF",
   "l2GenesisBlockGasLimit": "0x17D7840",
   "l2GenesisBlockBaseFeePerGas": "0x3b9aca00",
-  "gasPriceOracleOverhead": 2100,
-  "gasPriceOracleScalar": 1000000,
   "eip1559Denominator": 50,
   "eip1559Elasticity": 10,
   "systemConfigStartBlock": 8364212,
diff --git a/packages/contracts-bedrock/deploy-config/mainnet.json b/packages/contracts-bedrock/deploy-config/mainnet.json
index a6be1d7cf9ec..ba16326b3c0b 100644
--- a/packages/contracts-bedrock/deploy-config/mainnet.json
+++ b/packages/contracts-bedrock/deploy-config/mainnet.json
@@ -34,12 +34,26 @@
   "governanceTokenOwner": "0x5C4e7Ba1E219E47948e6e3F55019A647bA501005",
   "l2GenesisBlockGasLimit": "0x1c9c380",
   "l2GenesisBlockBaseFeePerGas": "0x3b9aca00",
-  "gasPriceOracleOverhead": 188,
-  "gasPriceOracleScalar": 684000,
+  "gasPriceOracleBaseFeeScalar": 1368,
+  "gasPriceOracleBlobBaseFeeScalar": 810949,
   "eip1559Denominator": 50,
   "eip1559Elasticity": 6,
   "l2GenesisRegolithTimeOffset": "0x0",
   "systemConfigStartBlock": 17422444,
   "requiredProtocolVersion": "0x0000000000000000000000000000000000000003000000010000000000000000",
-  "recommendedProtocolVersion": "0x0000000000000000000000000000000000000003000000010000000000000000"
+  "recommendedProtocolVersion": "0x0000000000000000000000000000000000000003000000010000000000000000",
+  "faultGameAbsolutePrestate": "0x037ef3c1a487960b0e633d3e513df020c43432769f41a634d18a9595cbf53c55",
+  "faultGameMaxDepth": 73,
+  "faultGameClockExtension": 10800,
+  "faultGameMaxClockDuration": 302400,
+  "faultGameGenesisBlock": 120059863,
+  "faultGameGenesisOutputRoot": "0x2694ac14dcf54b7a77363e3f60e6462dc78da0d43d1e2f058dbb6a1488814977",
+  "faultGameSplitDepth": 30,
+  "faultGameWithdrawalDelay": 604800,
+  "preimageOracleMinProposalSize": 126000,
+  "preimageOracleChallengePeriod": 86400,
+  "proofMaturityDelaySeconds": 604800,
+  "disputeGameFinalityDelaySeconds": 302400,
+  "respectedGameType": 0,
+  "useFaultProofs": true
 }
diff --git a/packages/contracts-bedrock/deploy-config/pgn-sepolia.json b/packages/contracts-bedrock/deploy-config/pgn-sepolia.json
deleted file mode 100644
index eda4eadfcd69..000000000000
--- a/packages/contracts-bedrock/deploy-config/pgn-sepolia.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-  "l1StartingBlockTag": "0x3716f5",
-  "l1ChainID": 11155111,
-  "l2ChainID": 58008,
-  "l1BlockTime": 12,
-  "l2BlockTime": 2,
-  "finalizationPeriodSeconds": 604800,
-  "finalSystemOwner": "0x23BA22Dd7923F3a3f2495bB32a6f3c9b9CD1EC6C",
-  "baseFeeVaultRecipient": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "l1FeeVaultRecipient": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "sequencerFeeVaultRecipient": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "l2GenesisBlockBaseFeePerGas": "0x3b9aca00",
-  "governanceTokenOwner": "0x23BA22Dd7923F3a3f2495bB32a6f3c9b9CD1EC6C",
-  "governanceTokenSymbol": "OP",
-  "governanceTokenName": "Optimism",
-  "maxSequencerDrift": 1000,
-  "sequencerWindowSize": 7200,
-  "channelTimeout": 300,
-  "p2pSequencerAddress": "0x91Bf8996f15B128FDDC80e170FD1aA2C52659A4e",
-  "batchInboxAddress": "0x454A2A86132C937AD4eFc8721f1b85418f92cbCe",
-  "batchSenderAddress": "0x7224e05E6cF6E07aFBE1eFa09a3fA23A637DD485",
-  "l2GenesisRegolithTimeOffset": "0x0",
-  "superchainConfigGuardian": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "l2OutputOracleSubmissionInterval": 180,
-  "l2OutputOracleStartingTimestamp": 1685727972,
-  "l2OutputOracleProposer": "0xD457799C5ba870D609f21048c67a9b11aC611BF0",
-  "l2GenesisBlockGasLimit": "0x1c9c380",
-  "fundDevAccounts": false,
-  "gasPriceOracleOverhead": 2100,
-  "gasPriceOracleScalar": 1000000,
-  "eip1559Denominator": 8,
-  "eip1559Elasticity": 2,
-  "proxyAdminOwner": "0xFAAcd5c22F1bf4127151193F80C5Dd7aCaEff079",
-  "l2OutputOracleChallenger": "0x69F0FFc19504B57e9AE4B6D7694d028c3CD876F8",
-  "baseFeeVaultWithdrawalNetwork": 0,
-  "l1FeeVaultWithdrawalNetwork": 0,
-  "sequencerFeeVaultWithdrawalNetwork": 0,
-  "l2OutputOracleStartingBlockNumber": 0,
-  "baseFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "l1FeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "sequencerFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "systemConfigStartBlock": 0,
-  "requiredProtocolVersion": "0x0000000000000000000000000000000000000003000000010000000000000001",
-  "recommendedProtocolVersion": "0x0000000000000000000000000000000000000003000000010000000000000001"
-}
diff --git a/packages/contracts-bedrock/deploy-config/pgn.json b/packages/contracts-bedrock/deploy-config/pgn.json
deleted file mode 100644
index c333e3d84613..000000000000
--- a/packages/contracts-bedrock/deploy-config/pgn.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "l1StartingBlockTag": "0x10da9fe",
-  "l1ChainID": 1,
-  "l2ChainID": 424,
-  "l2BlockTime": 2,
-  "finalizationPeriodSeconds": 604800,
-  "finalSystemOwner": "0x4a4962275DF8C60a80d3a25faEc5AA7De116A746",
-  "baseFeeVaultRecipient": "0xefCf0c8faFB425997870f845e26fC6cA6EE6dD5C",
-  "l1FeeVaultRecipient": "0xefCf0c8faFB425997870f845e26fC6cA6EE6dD5C",
-  "sequencerFeeVaultRecipient": "0xefCf0c8faFB425997870f845e26fC6cA6EE6dD5C",
-  "l2GenesisBlockBaseFeePerGas": "0x3b9aca00",
-  "governanceTokenOwner": "0x4a4962275DF8C60a80d3a25faEc5AA7De116A746",
-  "governanceTokenSymbol": "OP",
-  "governanceTokenName": "Optimism",
-  "maxSequencerDrift": 600,
-  "sequencerWindowSize": 3600,
-  "channelTimeout": 300,
-  "p2pSequencerAddress": "0x7916D35b57c2E4AffCaB46C3E5C8d76D3b44d1F7",
-  "batchInboxAddress": "0xC1B90E1e459aBBDcEc4DCF90dA45ba077d83BFc5",
-  "batchSenderAddress": "0x99526b0e49A95833E734EB556A6aBaFFAb0Ee167",
-  "l2GenesisRegolithTimeOffset": "0x0",
-  "superchainConfigGuardian": "0x39E13D1AB040F6EA58CE19998edCe01B3C365f84",
-  "l2OutputOracleSubmissionInterval": 1800,
-  "l2OutputOracleStartingTimestamp": -1,
-  "l2OutputOracleProposer": "0x69968Ce0E92d9c101BAd81de55EFbcb69603cFe3",
-  "l2GenesisBlockGasLimit": "0x1c9c380",
-  "fundDevAccounts": false,
-  "gasPriceOracleOverhead": 188,
-  "gasPriceOracleScalar": 684000,
-  "eip1559Denominator": 50,
-  "eip1559Elasticity": 6,
-  "proxyAdminOwner": "0xefCf0c8faFB425997870f845e26fC6cA6EE6dD5C",
-  "l2OutputOracleChallenger": "0x39E13D1AB040F6EA58CE19998edCe01B3C365f84",
-  "baseFeeVaultWithdrawalNetwork": 0,
-  "l1FeeVaultWithdrawalNetwork": 0,
-  "sequencerFeeVaultWithdrawalNetwork": 0,
-  "l1BlockTime": 12
-}
diff --git a/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json b/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json
index e3c86a9f38d8..afb31e6b86ad 100644
--- a/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json
+++ b/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json
@@ -57,8 +57,6 @@
   "l1ERC721BridgeProxy": "0x0000000000000000000000000000000000000000",
   "systemConfigProxy": "0x0000000000000000000000000000000000000000",
   "optimismPortalProxy": "0x0000000000000000000000000000000000000000",
-  "gasPriceOracleOverhead": 188,
-  "gasPriceOracleScalar": 684000,
   "enableGovernance": true,
   "governanceTokenSymbol": "OP",
   "governanceTokenName": "Optimism",
@@ -68,17 +66,18 @@
   "eip1559Denominator": 250,
   "eip1559DenominatorCanyon": 250,
   "systemConfigStartBlock": 4071248,
-  "faultGameAbsolutePrestate": "0x038942ec840131a63c49fa514a3f0577ae401fd5584d56ad50cdf5a8b41d4538",
+  "faultGameAbsolutePrestate": "0x03e69d3de5155f4a80da99dd534561cbddd4f9dd56c9ecc704d6886625711d2b",
   "faultGameMaxDepth": 73,
-  "faultGameMaxDuration": 604800,
+  "faultGameClockExtension": 3600,
+  "faultGameMaxClockDuration": 14400,
   "faultGameGenesisBlock": 0,
   "faultGameGenesisOutputRoot": "0x91bd00ecd596a86c9f4e12c0646578e77022881c87c06ec6aa31e656d2730688",
   "faultGameSplitDepth": 30,
-  "faultGameWithdrawalDelay": 604800,
+  "faultGameWithdrawalDelay": 600,
   "preimageOracleMinProposalSize": 126000,
-  "preimageOracleChallengePeriod": 86400,
-  "proofMaturityDelaySeconds": 604800,
-  "disputeGameFinalityDelaySeconds": 302400,
+  "preimageOracleChallengePeriod": 10800,
+  "proofMaturityDelaySeconds": 1200,
+  "disputeGameFinalityDelaySeconds": 600,
   "respectedGameType": 0,
   "useFaultProofs": true,
   "fundDevAccounts": false,
diff --git a/packages/contracts-bedrock/deploy-config/sepolia.json b/packages/contracts-bedrock/deploy-config/sepolia.json
index f08f186d858d..d8e901c0840f 100644
--- a/packages/contracts-bedrock/deploy-config/sepolia.json
+++ b/packages/contracts-bedrock/deploy-config/sepolia.json
@@ -28,8 +28,6 @@
   "baseFeeVaultWithdrawalNetwork": 0,
   "l1FeeVaultWithdrawalNetwork": 0,
   "sequencerFeeVaultWithdrawalNetwork": 0,
-  "gasPriceOracleOverhead": 188,
-  "gasPriceOracleScalar": 684000,
   "enableGovernance": true,
   "governanceTokenSymbol": "OP",
   "governanceTokenName": "Optimism",
@@ -43,14 +41,15 @@
   "requiredProtocolVersion": "0x0000000000000000000000000000000000000004000000000000000000000001",
   "recommendedProtocolVersion": "0x0000000000000000000000000000000000000004000000000000000000000001",
   "fundDevAccounts": false,
-  "faultGameAbsolutePrestate": "0x03e1255457128b9afd9acf93239c1d477bdff88624901f9ca8fe0783b756dbe0",
+  "faultGameAbsolutePrestate": "0x037ef3c1a487960b0e633d3e513df020c43432769f41a634d18a9595cbf53c55",
   "faultGameMaxDepth": 73,
-  "faultGameMaxDuration": 604800,
-  "faultGameGenesisBlock": 4061224,
-  "faultGameGenesisOutputRoot": "0xd08055c58b2c5149565c636b44fad2c25b5ccddef1385a2cb721529d7480b242",
-  "faultGameSplitDepth": 32,
+  "faultGameClockExtension": 10800,
+  "faultGameMaxClockDuration": 302400,
+  "faultGameGenesisBlock": 9496192,
+  "faultGameGenesisOutputRoot": "0x63b1cda487c072b020a57c1203f7c2921754005cadbd54bed7f558111b8278d8",
+  "faultGameSplitDepth": 30,
   "faultGameWithdrawalDelay": 604800,
-  "preimageOracleMinProposalSize": 1800000,
+  "preimageOracleMinProposalSize": 126000,
   "preimageOracleChallengePeriod": 86400,
   "proofMaturityDelaySeconds": 604800,
   "disputeGameFinalityDelaySeconds": 302400,
diff --git a/packages/contracts-bedrock/deploy-config/zora-goerli.json b/packages/contracts-bedrock/deploy-config/zora-goerli.json
deleted file mode 100644
index 7fab9eb144e1..000000000000
--- a/packages/contracts-bedrock/deploy-config/zora-goerli.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "l1StartingBlockTag": "0x88732d",
-  "l1ChainID": 5,
-  "l2ChainID": 999,
-  "l2BlockTime": 10,
-  "l1BlockTime": 12,
-  "finalizationPeriodSeconds": 30,
-  "finalSystemOwner": "0x23BA22Dd7923F3a3f2495bB32a6f3c9b9CD1EC6C",
-  "baseFeeVaultRecipient": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "l1FeeVaultRecipient": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "sequencerFeeVaultRecipient": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "l2GenesisBlockBaseFeePerGas": "0x3b9aca00",
-  "governanceTokenOwner": "0x23BA22Dd7923F3a3f2495bB32a6f3c9b9CD1EC6C",
-  "governanceTokenSymbol": "OP",
-  "governanceTokenName": "Optimism",
-  "maxSequencerDrift": 1000,
-  "sequencerWindowSize": 7200,
-  "channelTimeout": 300,
-  "p2pSequencerAddress": "0xC890C7cbF8400aA9a2c908AB3caACd97e0018d85",
-  "batchInboxAddress": "0xcF628E24aC574866D3d0a7CFE4e9DA7278b7ef13",
-  "batchSenderAddress": "0x427c9a666d3b27873111cE3894712Bf64C6343A0",
-  "l2GenesisRegolithTimeOffset": "0x0",
-  "superchainConfigGuardian": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "l2OutputOracleSubmissionInterval": 180,
-  "l2OutputOracleStartingTimestamp": 0,
-  "l2OutputOracleProposer": "0xa98B585654fC03E2fEa3FAB56E1C851E4f5c2B54",
-  "l2GenesisBlockGasLimit": "0x1c9c380",
-  "fundDevAccounts": false,
-  "gasPriceOracleOverhead": 2100,
-  "gasPriceOracleScalar": 1000000,
-  "eip1559Denominator": 8,
-  "eip1559Elasticity": 2,
-  "proxyAdminOwner": "0xdfc7C4A2EFa9eFA6E7596F874f7d7FB5e02f7373",
-  "l2OutputOracleChallenger": "0xFBAfDf2C3762b571310e3a726A6cD4443E6Ff3dA",
-  "baseFeeVaultWithdrawalNetwork": 0,
-  "l1FeeVaultWithdrawalNetwork": 0,
-  "sequencerFeeVaultWithdrawalNetwork": 0
-}
diff --git a/packages/contracts-bedrock/deploy-config/zora-sepolia.json b/packages/contracts-bedrock/deploy-config/zora-sepolia.json
deleted file mode 100644
index 18faf423d185..000000000000
--- a/packages/contracts-bedrock/deploy-config/zora-sepolia.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "l1StartingBlockTag": "0xf782446a2487d900addb5d466a8597c7c543b59fa9aaa154d413830238f8798a",
-  "l1ChainID": 11155111,
-  "l2ChainID": 999999999,
-  "l2BlockTime": 2,
-  "l1BlockTime": 12,
-  "finalizationPeriodSeconds": 604800,
-  "finalSystemOwner": "0x23BA22Dd7923F3a3f2495bB32a6f3c9b9CD1EC6C",
-  "baseFeeVaultRecipient": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "l1FeeVaultRecipient": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "sequencerFeeVaultRecipient": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "l2GenesisBlockBaseFeePerGas": "0x3b9aca00",
-  "governanceTokenOwner": "0x23BA22Dd7923F3a3f2495bB32a6f3c9b9CD1EC6C",
-  "governanceTokenSymbol": "OP",
-  "governanceTokenName": "Optimism",
-  "maxSequencerDrift": 600,
-  "sequencerWindowSize": 3600,
-  "channelTimeout": 300,
-  "p2pSequencerAddress": "0x3609513933100689bd1f84782529A99239842344",
-  "sequencerFeeVaultRecipient": "0xCb4Ba05b7f1F66B0F19Ae26561F6a3694a95768a",
-  "batchInboxAddress": "0xCd734290E4bd0200dAC631c7D4b9E8a33234e91f",
-  "batchSenderAddress": "0x3Cd868E221A3be64B161D596A7482257a99D857f",
-  "l2GenesisRegolithTimeOffset": "0x0",
-  "superchainConfigGuardian": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "l2OutputOracleSubmissionInterval": 180,
-  "l2OutputOracleStartingTimestamp": 1698080004,
-  "l2OutputOracleStartingBlockNumber": 0,
-  "l2OutputOracleProposer": "0xe8326a5839175dE7f467e66D8bB443aa70DA1c3e",
-  "sequencerFeeVaultWithdrawalNetwork": 0,
-  "baseFeeVaultWithdrawalNetwork": 0,
-  "l1FeeVaultWithdrawalNetwork": 0,
-  "baseFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "l1FeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "sequencerFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000",
-  "l2GenesisBlockGasLimit": "0x1c9c380",
-  "fundDevAccounts": false,
-  "gasPriceOracleOverhead": 188,
-  "gasPriceOracleScalar": 684000,
-  "eip1559Denominator": 50,
-  "eip1559Elasticity": 6,
-  "proxyAdminOwner": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "baseFeeVaultRecipient": "0xba6fAD507A432402C64444Ed201025e060b34faB",
-  "l1FeeVaultRecipient": "0x91EFd7d4c6a2A04Ca59a05a4B8E07207D31a6589",
-  "l2OutputOracleChallenger": "0x45eFFbD799Ab49122eeEAB75B78D9C56A187F9A7",
-  "requiredProtocolVersion": "0x0000000000000000000000000000000000000003000000010000000000000001",
-  "recommendedProtocolVersion": "0x0000000000000000000000000000000000000003000000010000000000000001"
-}
diff --git a/packages/contracts-bedrock/deploy-config/zora.json b/packages/contracts-bedrock/deploy-config/zora.json
deleted file mode 100644
index 06aa62cb2568..000000000000
--- a/packages/contracts-bedrock/deploy-config/zora.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "l1StartingBlockTag": "0x10aa183",
-  "l1ChainID": 1,
-  "l2ChainID": 7777777,
-  "l2BlockTime": 2,
-  "finalizationPeriodSeconds": 604800,
-  "finalSystemOwner": "0xC72aE5c7cc9a332699305E29F68Be66c73b60542",
-  "baseFeeVaultRecipient": "0xe900b3Edc1BA0430CFa9a204A1027B90825ac951",
-  "l1FeeVaultRecipient": "0xe900b3Edc1BA0430CFa9a204A1027B90825ac951",
-  "sequencerFeeVaultRecipient": "0xe900b3Edc1BA0430CFa9a204A1027B90825ac951",
-  "l2GenesisBlockBaseFeePerGas": "0x3b9aca00",
-  "governanceTokenOwner": "0xC72aE5c7cc9a332699305E29F68Be66c73b60542",
-  "governanceTokenSymbol": "OP",
-  "governanceTokenName": "Optimism",
-  "maxSequencerDrift": 600,
-  "sequencerWindowSize": 3600,
-  "channelTimeout": 300,
-  "p2pSequencerAddress": "0x3Dc8Dfd0709C835cAd15a6A27e089FF4cF4C9228",
-  "batchInboxAddress": "0x6F54Ca6F6EdE96662024Ffd61BFd18f3f4e34DFf",
-  "batchSenderAddress": "0x625726c858dBF78c0125436C943Bf4b4bE9d9033",
-  "l2GenesisRegolithTimeOffset": "0x0",
-  "superchainConfigGuardian": "0xC72aE5c7cc9a332699305E29F68Be66c73b60542",
-  "l2OutputOracleSubmissionInterval": 1800,
-  "l2OutputOracleStartingTimestamp": -1,
-  "l2OutputOracleProposer": "0x48247032092e7b0ecf5dEF611ad89eaf3fC888Dd",
-  "l2GenesisBlockGasLimit": "0x1c9c380",
-  "fundDevAccounts": false,
-  "gasPriceOracleOverhead": 188,
-  "gasPriceOracleScalar": 684000,
-  "eip1559Denominator": 50,
-  "eip1559Elasticity": 6,
-  "proxyAdminOwner": "0xb0cCdbD6fe09D2199171BE19450aF249250518A0",
-  "l2OutputOracleChallenger": "0xcA4571b1ecBeC86Ea2E660d242c1c29FcB55Dc72",
-  "baseFeeVaultWithdrawalNetwork": 0,
-  "l1FeeVaultWithdrawalNetwork": 0,
-  "sequencerFeeVaultWithdrawalNetwork": 0,
-  "l1BlockTime": 12
-}
diff --git a/packages/contracts-bedrock/foundry.toml b/packages/contracts-bedrock/foundry.toml
index 51f9db270ffe..eaed71ce82f9 100644
--- a/packages/contracts-bedrock/foundry.toml
+++ b/packages/contracts-bedrock/foundry.toml
@@ -14,17 +14,19 @@ remappings = [
   '@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts',
   '@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts',
   '@rari-capital/solmate/=lib/solmate',
-  '@cwia/=lib/clones-with-immutable-args/src',
   '@lib-keccak/=lib/lib-keccak/contracts/lib',
+  '@solady/=lib/solady/src',
   'forge-std/=lib/forge-std/src',
   'ds-test/=lib/forge-std/lib/ds-test/src',
   'safe-contracts/=lib/safe-contracts/contracts',
   'kontrol-cheatcodes/=lib/kontrol-cheatcodes/src',
-  'solady/=lib/solady/src',
 ]
 extra_output = ['devdoc', 'userdoc', 'metadata', 'storageLayout']
 bytecode_hash = 'none'
 build_info_path = 'artifacts/build-info'
+ast = true
+evm_version = "cancun"
+ignored_error_codes = ["transient-storage", "code-size", "init-code-size"]
 
 # Test / Script Runner Settings
 ffi = true
@@ -50,14 +52,12 @@ line_length=120
 multiline_func_header='all'
 bracket_spacing=true
 wrap_comments=true
-ignore = ['src/vendor/WETH9.sol']
 
 ################################################################
 #                         PROFILE: CI                          #
 ################################################################
 
 [profile.ci]
-deny_warnings = true
 fuzz = { runs = 512 }
 
 [profile.ci.invariant]
@@ -87,4 +87,3 @@ src = 'test/kontrol/proofs'
 out = 'kout-proofs'
 test = 'test/kontrol/proofs'
 script = 'test/kontrol/proofs'
-ast = true
diff --git a/packages/contracts-bedrock/invariant-docs/FaultDisputeGame.md b/packages/contracts-bedrock/invariant-docs/FaultDisputeGame.md
index f8bd532ac9e8..c54eb974cff7 100644
--- a/packages/contracts-bedrock/invariant-docs/FaultDisputeGame.md
+++ b/packages/contracts-bedrock/invariant-docs/FaultDisputeGame.md
@@ -1,6 +1,6 @@
 # `FaultDisputeGame` Invariants
 
 ## FaultDisputeGame always returns all ETH on total resolution
-**Test:** [`FaultDisputeGame.t.sol#L39`](../test/invariants/FaultDisputeGame.t.sol#L39)
+**Test:** [`FaultDisputeGame.t.sol#L33`](../test/invariants/FaultDisputeGame.t.sol#L33)
 
 The FaultDisputeGame contract should always return all ETH in the contract to the correct recipients upon resolution of all outstanding claims. There may never be any ETH left in the contract after a full resolution. 
\ No newline at end of file
diff --git a/packages/contracts-bedrock/invariant-docs/SystemConfig.md b/packages/contracts-bedrock/invariant-docs/SystemConfig.md
index 382bb3d539df..59f9a999f10c 100644
--- a/packages/contracts-bedrock/invariant-docs/SystemConfig.md
+++ b/packages/contracts-bedrock/invariant-docs/SystemConfig.md
@@ -1,5 +1,6 @@
 # `SystemConfig` Invariants
 
-## The gas limit of the `SystemConfig` contract can never be lower than the hard-coded lower bound.
-**Test:** [`SystemConfig.t.sol#L68`](../test/invariants/SystemConfig.t.sol#L68)
+## Gas limit boundaries
+**Test:** [`SystemConfig.t.sol#L70`](../test/invariants/SystemConfig.t.sol#L70)
 
+The gas limit of the `SystemConfig` contract can never be lower than the hard-coded lower bound or higher than the hard-coded upper bound. The lower bound must never be higher than the upper bound. 
\ No newline at end of file
diff --git a/packages/contracts-bedrock/lib/clones-with-immutable-args b/packages/contracts-bedrock/lib/clones-with-immutable-args
deleted file mode 160000
index 105efee1b912..000000000000
--- a/packages/contracts-bedrock/lib/clones-with-immutable-args
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 105efee1b9127ed7f6fedf139e1fc796ce8791f2
diff --git a/packages/contracts-bedrock/lib/forge-std b/packages/contracts-bedrock/lib/forge-std
index 1fd874f0efdb..2d8b7b876a5b 160000
--- a/packages/contracts-bedrock/lib/forge-std
+++ b/packages/contracts-bedrock/lib/forge-std
@@ -1 +1 @@
-Subproject commit 1fd874f0efdb711cb6807c4f4a000ed2805dc809
+Subproject commit 2d8b7b876a5b328d6a73e13c4740ed7a0d72d5f4
diff --git a/packages/contracts-bedrock/lib/safe-contracts b/packages/contracts-bedrock/lib/safe-contracts
index e870f514ad34..186a21a74b32 160000
--- a/packages/contracts-bedrock/lib/safe-contracts
+++ b/packages/contracts-bedrock/lib/safe-contracts
@@ -1 +1 @@
-Subproject commit e870f514ad34cd9654c72174d6d4a839e3c6639f
+Subproject commit 186a21a74b327f17fc41217a927dea7064f74604
diff --git a/packages/contracts-bedrock/package.json b/packages/contracts-bedrock/package.json
index 9004a872e7cd..e6efb918a5d0 100644
--- a/packages/contracts-bedrock/package.json
+++ b/packages/contracts-bedrock/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@eth-optimism/contracts-bedrock",
-  "version": "0.17.1",
+  "version": "0.17.2",
   "description": "Contracts for Optimism Specs",
   "license": "MIT",
   "files": [
@@ -10,31 +10,29 @@
     "src/**/*.sol"
   ],
   "scripts": {
-    "bindings": "pnpm bindings:ts && pnpm bindings:go",
-    "bindings:ts": "nx generate @eth-optimism/contracts-ts",
-    "bindings:go:no-build": "cd ../../op-bindings && make bindings-build",
-    "bindings:go": "pnpm clean && pnpm build && pnpm bindings:go:no-build",
     "prebuild": "./scripts/checks/check-foundry-install.sh",
     "build": "forge build",
     "build:go-ffi": "(cd scripts/go-ffi && go build)",
     "autogen:invariant-docs": "npx tsx scripts/autogen/generate-invariant-docs.ts",
     "test": "pnpm build:go-ffi && forge test",
     "test:kontrol": "./test/kontrol/scripts/run-kontrol.sh script",
-    "genesis": "./scripts/generate-l2-genesis.sh",
-    "coverage": "pnpm build:go-ffi && forge coverage",
-    "coverage:lcov": "pnpm build:go-ffi && forge coverage --report lcov",
+    "genesis": "forge script scripts/L2Genesis.s.sol:L2Genesis --sig 'runWithStateDump()'",
+    "coverage": "pnpm build:go-ffi && (forge coverage || (bash -c \"forge coverage 2>&1 | grep -q 'Stack too deep' && echo -e '\\033[1;33mWARNING\\033[0m: Coverage failed with stack too deep, so overriding and exiting successfully' && exit 0 || exit 1\"))",
+    "coverage:lcov": "pnpm build:go-ffi && (forge coverage --report lcov || (bash -c \"forge coverage --report lcov 2>&1 | grep -q 'Stack too deep' && echo -e '\\033[1;33mWARNING\\033[0m: Coverage failed with stack too deep, so overriding and exiting successfully' && exit 0 || exit 1\"))",
     "deploy": "./scripts/deploy.sh",
     "gas-snapshot:no-build": "forge snapshot --match-contract GasBenchMark",
     "statediff": "./scripts/statediff.sh && git diff --exit-code",
     "gas-snapshot": "pnpm build:go-ffi && pnpm gas-snapshot:no-build",
-    "snapshots": "npx tsx scripts/autogen/generate-snapshots.ts && ./test/kontrol/scripts/make-summary-deployment.sh",
+    "kontrol-summary": "./test/kontrol/scripts/make-summary-deployment.sh",
+    "kontrol-summary-fp": "KONTROL_FP_DEPLOYMENT=true pnpm kontrol-summary",
+    "snapshots": "forge build && npx tsx scripts/autogen/generate-snapshots.ts && pnpm kontrol-summary && pnpm kontrol-summary-fp",
     "snapshots:check": "./scripts/checks/check-snapshots.sh",
     "semver-lock": "forge script scripts/SemverLock.s.sol",
     "validate-deploy-configs": "./scripts/checks/check-deploy-configs.sh",
     "validate-spacers:no-build": "npx tsx scripts/checks/check-spacers.ts",
     "validate-spacers": "pnpm build && pnpm validate-spacers:no-build",
     "clean": "rm -rf ./artifacts ./forge-artifacts ./cache ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./scripts/go-ffi/go-ffi ./.testdata ./deployments/hardhat/*",
-    "pre-pr:no-build": "pnpm gas-snapshot:no-build && pnpm snapshots && pnpm semver-lock && pnpm autogen:invariant-docs && pnpm lint && pnpm bindings:go:no-build",
+    "pre-pr:no-build": "pnpm gas-snapshot:no-build && pnpm snapshots && pnpm semver-lock && pnpm autogen:invariant-docs && pnpm lint",
     "pre-pr": "pnpm clean && pnpm build:go-ffi && pnpm build && pnpm pre-pr:no-build",
     "pre-pr:full": "pnpm test && pnpm validate-deploy-configs && pnpm validate-spacers && pnpm pre-pr",
     "lint:ts:check": "eslint . --max-warnings=0",
@@ -50,6 +48,6 @@
     "@typescript-eslint/eslint-plugin": "^6.21.0",
     "@typescript-eslint/parser": "^6.21.0",
     "tsx": "^4.7.0",
-    "typescript": "^5.3.3"
+    "typescript": "^5.4.5"
   }
 }
diff --git a/packages/contracts-bedrock/scripts/Artifacts.s.sol b/packages/contracts-bedrock/scripts/Artifacts.s.sol
index 4042c72043eb..d8b8a218e92a 100644
--- a/packages/contracts-bedrock/scripts/Artifacts.s.sol
+++ b/packages/contracts-bedrock/scripts/Artifacts.s.sol
@@ -9,7 +9,7 @@ import { Predeploys } from "src/libraries/Predeploys.sol";
 import { Config } from "scripts/Config.sol";
 import { StorageSlot } from "scripts/ForgeArtifacts.sol";
 import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
-import { LibString } from "solady/utils/LibString.sol";
+import { LibString } from "@solady/utils/LibString.sol";
 import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol";
 import { IAddressManager } from "scripts/interfaces/IAddressManager.sol";
 
@@ -129,8 +129,8 @@ abstract contract Artifacts {
             return payable(Predeploys.L1_MESSAGE_SENDER);
         } else if (digest == keccak256(bytes("DeployerWhitelist"))) {
             return payable(Predeploys.DEPLOYER_WHITELIST);
-        } else if (digest == keccak256(bytes("WETH9"))) {
-            return payable(Predeploys.WETH9);
+        } else if (digest == keccak256(bytes("WETH"))) {
+            return payable(Predeploys.WETH);
         } else if (digest == keccak256(bytes("LegacyERC20ETH"))) {
             return payable(Predeploys.LEGACY_ERC20_ETH);
         } else if (digest == keccak256(bytes("L1BlockNumber"))) {
diff --git a/packages/contracts-bedrock/scripts/ChainAssertions.sol b/packages/contracts-bedrock/scripts/ChainAssertions.sol
index 7afdceb62cb3..a99c14e9514b 100644
--- a/packages/contracts-bedrock/scripts/ChainAssertions.sol
+++ b/packages/contracts-bedrock/scripts/ChainAssertions.sol
@@ -71,11 +71,12 @@ library ChainAssertions {
 
         if (_isProxy) {
             require(config.owner() == _cfg.finalSystemOwner());
-            require(config.overhead() == _cfg.gasPriceOracleOverhead());
-            require(config.scalar() == _cfg.gasPriceOracleScalar());
+            require(config.basefeeScalar() == _cfg.basefeeScalar());
+            require(config.blobbasefeeScalar() == _cfg.blobbasefeeScalar());
             require(config.batcherHash() == bytes32(uint256(uint160(_cfg.batchSenderAddress()))));
             require(config.gasLimit() == uint64(_cfg.l2GenesisBlockGasLimit()));
             require(config.unsafeBlockSigner() == _cfg.p2pSequencerAddress());
+            require(config.scalar() >> 248 == 1);
             // Check _config
             ResourceMetering.ResourceConfig memory rconfig = Constants.DEFAULT_RESOURCE_CONFIG();
             require(resourceConfig.maxResourceLimit == rconfig.maxResourceLimit);
@@ -92,13 +93,15 @@ library ChainAssertions {
             require(config.l1CrossDomainMessenger() == _contracts.L1CrossDomainMessenger);
             require(config.l1ERC721Bridge() == _contracts.L1ERC721Bridge);
             require(config.l1StandardBridge() == _contracts.L1StandardBridge);
-            require(config.l2OutputOracle() == _contracts.L2OutputOracle);
+            require(config.disputeGameFactory() == _contracts.DisputeGameFactory);
             require(config.optimismPortal() == _contracts.OptimismPortal);
             require(config.optimismMintableERC20Factory() == _contracts.OptimismMintableERC20Factory);
         } else {
             require(config.owner() == address(0xdead));
             require(config.overhead() == 0);
-            require(config.scalar() == 0);
+            require(config.scalar() == uint256(0x01) << 248); // version 1
+            require(config.basefeeScalar() == 0);
+            require(config.blobbasefeeScalar() == 0);
             require(config.batcherHash() == bytes32(0));
             require(config.gasLimit() == 1);
             require(config.unsafeBlockSigner() == address(0));
@@ -115,7 +118,7 @@ library ChainAssertions {
             require(config.l1CrossDomainMessenger() == address(0));
             require(config.l1ERC721Bridge() == address(0));
             require(config.l1StandardBridge() == address(0));
-            require(config.l2OutputOracle() == address(0));
+            require(config.disputeGameFactory() == address(0));
             require(config.optimismPortal() == address(0));
             require(config.optimismMintableERC20Factory() == address(0));
         }
@@ -304,19 +307,14 @@ library ChainAssertions {
         }
 
         if (_isProxy) {
-            require(address(portal.L2_ORACLE()) == _contracts.L2OutputOracle);
             require(address(portal.l2Oracle()) == _contracts.L2OutputOracle);
-            require(address(portal.SYSTEM_CONFIG()) == _contracts.SystemConfig);
             require(address(portal.systemConfig()) == _contracts.SystemConfig);
-            require(portal.GUARDIAN() == guardian);
             require(portal.guardian() == guardian);
             require(address(portal.superchainConfig()) == address(_contracts.SuperchainConfig));
             require(portal.paused() == SuperchainConfig(_contracts.SuperchainConfig).paused());
             require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER);
         } else {
-            require(address(portal.L2_ORACLE()) == address(0));
             require(address(portal.l2Oracle()) == address(0));
-            require(address(portal.SYSTEM_CONFIG()) == address(0));
             require(address(portal.systemConfig()) == address(0));
             require(address(portal.superchainConfig()) == address(0));
             require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER);
@@ -346,20 +344,20 @@ library ChainAssertions {
 
         if (_isProxy) {
             require(address(portal.disputeGameFactory()) == _contracts.DisputeGameFactory);
-            require(address(portal.SYSTEM_CONFIG()) == _contracts.SystemConfig);
             require(address(portal.systemConfig()) == _contracts.SystemConfig);
-            require(portal.GUARDIAN() == guardian);
             require(portal.guardian() == guardian);
             require(address(portal.superchainConfig()) == address(_contracts.SuperchainConfig));
             require(portal.paused() == SuperchainConfig(_contracts.SuperchainConfig).paused());
             require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER);
         } else {
             require(address(portal.disputeGameFactory()) == address(0));
-            require(address(portal.SYSTEM_CONFIG()) == address(0));
             require(address(portal.systemConfig()) == address(0));
             require(address(portal.superchainConfig()) == address(0));
             require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER);
         }
+        // This slot is the custom gas token _balance and this check ensures
+        // that it stays unset for forwards compatibility with custom gas token.
+        require(vm.load(address(portal), bytes32(uint256(61))) == bytes32(0));
     }
 
     /// @notice Asserts that the ProtocolVersions is setup correctly
diff --git a/packages/contracts-bedrock/scripts/Config.sol b/packages/contracts-bedrock/scripts/Config.sol
index eafb8bfe983b..1a7692d498ff 100644
--- a/packages/contracts-bedrock/scripts/Config.sol
+++ b/packages/contracts-bedrock/scripts/Config.sol
@@ -1,8 +1,7 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.0;
 
-import { Vm } from "forge-std/Vm.sol";
-import { Chains } from "scripts/Chains.sol";
+import { Vm, VmSafe } from "forge-std/Vm.sol";
 
 /// @title Config
 /// @notice Contains all env var based config. Add any new env var parsing to this file
@@ -15,15 +14,19 @@ library Config {
     ///         written to disk after doing a deployment.
     function deploymentOutfile() internal view returns (string memory _env) {
         _env = vm.envOr(
-            "DEPLOYMENT_OUTFILE", string.concat(vm.projectRoot(), "/deployments/", _getDeploymentContext(), "/.deploy")
+            "DEPLOYMENT_OUTFILE",
+            string.concat(vm.projectRoot(), "/deployments/", vm.toString(block.chainid), "-deploy.json")
         );
     }
 
     /// @notice Returns the path on the local filesystem where the deploy config is
     function deployConfigPath() internal view returns (string memory _env) {
-        _env = vm.envOr(
-            "DEPLOY_CONFIG_PATH", string.concat(vm.projectRoot(), "/deploy-config/", _getDeploymentContext(), ".json")
-        );
+        if (vm.isContext(VmSafe.ForgeContext.TestGroup)) {
+            _env = string.concat(vm.projectRoot(), "/deploy-config/hardhat.json");
+        } else {
+            _env = vm.envOr("DEPLOY_CONFIG_PATH", string(""));
+            require(bytes(_env).length > 0, "Config: must set DEPLOY_CONFIG_PATH to filesystem path of deploy config");
+        }
     }
 
     /// @notice Returns the chainid from the EVM context or the value of the CHAIN_ID env var as
@@ -39,12 +42,6 @@ library Config {
         _env = vm.envOr("CONTRACT_ADDRESSES_PATH", string(""));
     }
 
-    /// @notice Returns the deployment context which was only useful in the hardhat deploy style
-    ///         of deployments. It is now DEPRECATED and will be removed in the future.
-    function deploymentContext() internal view returns (string memory _env) {
-        _env = vm.envOr("DEPLOYMENT_CONTEXT", string(""));
-    }
-
     /// @notice The CREATE2 salt to be used when deploying the implementations.
     function implSalt() internal view returns (string memory _env) {
         _env = vm.envOr("IMPL_SALT", string("ethers phoenix"));
@@ -52,18 +49,13 @@ library Config {
 
     /// @notice Returns the path that the state dump file should be written to or read from
     ///         on the local filesystem.
-    function stateDumpPath(string memory _name) internal view returns (string memory _env) {
+    function stateDumpPath(string memory _suffix) internal view returns (string memory _env) {
         _env = vm.envOr(
-            "STATE_DUMP_PATH", string.concat(vm.projectRoot(), "/", _name, "-", vm.toString(block.chainid), ".json")
+            "STATE_DUMP_PATH",
+            string.concat(vm.projectRoot(), "/state-dump-", vm.toString(block.chainid), _suffix, ".json")
         );
     }
 
-    /// @notice Returns the sig of the entrypoint to the deploy script. By default, it is `run`.
-    ///         This was useful for creating hardhat deploy style artifacts and will be removed in a future release.
-    function sig() internal view returns (string memory _env) {
-        _env = vm.envOr("SIG", string("run"));
-    }
-
     /// @notice Returns the name of the file that the forge deployment artifact is written to on the local
     ///         filesystem. By default, it is the name of the deploy script with the suffix `-latest.json`.
     ///         This was useful for creating hardhat deploy style artifacts and will be removed in a future release.
@@ -75,35 +67,4 @@ library Config {
     function drippieOwnerPrivateKey() internal view returns (uint256 _env) {
         _env = vm.envUint("DRIPPIE_OWNER_PRIVATE_KEY");
     }
-
-    /// @notice The context of the deployment is used to namespace the artifacts.
-    ///         An unknown context will use the chainid as the context name.
-    ///         This is legacy code and should be removed in the future.
-    function _getDeploymentContext() private view returns (string memory) {
-        string memory context = deploymentContext();
-        if (bytes(context).length > 0) {
-            return context;
-        }
-
-        uint256 chainid = Config.chainID();
-        if (chainid == Chains.Mainnet) {
-            return "mainnet";
-        } else if (chainid == Chains.Goerli) {
-            return "goerli";
-        } else if (chainid == Chains.OPGoerli) {
-            return "optimism-goerli";
-        } else if (chainid == Chains.OPMainnet) {
-            return "optimism-mainnet";
-        } else if (chainid == Chains.LocalDevnet || chainid == Chains.GethDevnet) {
-            return "devnetL1";
-        } else if (chainid == Chains.Hardhat) {
-            return "hardhat";
-        } else if (chainid == Chains.Sepolia) {
-            return "sepolia";
-        } else if (chainid == Chains.OPSepolia) {
-            return "optimism-sepolia";
-        } else {
-            return vm.toString(chainid);
-        }
-    }
 }
diff --git a/packages/contracts-bedrock/scripts/Deploy.s.sol b/packages/contracts-bedrock/scripts/Deploy.s.sol
index 93912e6743eb..d1aa9aea9282 100644
--- a/packages/contracts-bedrock/scripts/Deploy.s.sol
+++ b/packages/contracts-bedrock/scripts/Deploy.s.sol
@@ -7,8 +7,9 @@ import { Script } from "forge-std/Script.sol";
 import { console2 as console } from "forge-std/console2.sol";
 import { stdJson } from "forge-std/StdJson.sol";
 
-import { Safe } from "safe-contracts/Safe.sol";
-import { SafeProxyFactory } from "safe-contracts/proxies/SafeProxyFactory.sol";
+import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol";
+import { OwnerManager } from "safe-contracts/base/OwnerManager.sol";
+import { GnosisSafeProxyFactory as SafeProxyFactory } from "safe-contracts/proxies/GnosisSafeProxyFactory.sol";
 import { Enum as SafeOps } from "safe-contracts/common/Enum.sol";
 
 import { Deployer } from "scripts/Deployer.sol";
@@ -20,6 +21,7 @@ import { L1StandardBridge } from "src/L1/L1StandardBridge.sol";
 import { StandardBridge } from "src/universal/StandardBridge.sol";
 import { OptimismPortal } from "src/L1/OptimismPortal.sol";
 import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol";
+import { OptimismPortalInterop } from "src/L1/OptimismPortalInterop.sol";
 import { L1ChugSplashProxy } from "src/legacy/L1ChugSplashProxy.sol";
 import { ResolvedDelegateProxy } from "src/legacy/ResolvedDelegateProxy.sol";
 import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
@@ -27,6 +29,7 @@ import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
 import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol";
 import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
 import { SystemConfig } from "src/L1/SystemConfig.sol";
+import { SystemConfigInterop } from "src/L1/SystemConfigInterop.sol";
 import { ResourceMetering } from "src/L1/ResourceMetering.sol";
 import { DataAvailabilityChallenge } from "src/L1/DataAvailabilityChallenge.sol";
 import { Constants } from "src/libraries/Constants.sol";
@@ -34,6 +37,7 @@ import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
 import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol";
 import { PermissionedDisputeGame } from "src/dispute/PermissionedDisputeGame.sol";
 import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol";
+import { AnchorStateRegistry } from "src/dispute/AnchorStateRegistry.sol";
 import { PreimageOracle } from "src/cannon/PreimageOracle.sol";
 import { MIPS } from "src/cannon/MIPS.sol";
 import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol";
@@ -46,7 +50,7 @@ import { Config } from "scripts/Config.sol";
 import { IBigStepper } from "src/dispute/interfaces/IBigStepper.sol";
 import { IPreimageOracle } from "src/cannon/interfaces/IPreimageOracle.sol";
 import { AlphabetVM } from "test/mocks/AlphabetVM.sol";
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
 import { ChainAssertions } from "scripts/ChainAssertions.sol";
 import { Types } from "scripts/Types.sol";
 import { LibStateDiff } from "scripts/libraries/LibStateDiff.sol";
@@ -69,6 +73,7 @@ contract Deploy is Deployer {
     ///         to finally adopt PUSHN and get rid of stack too deep once and for all.
     ///         Someday we will look back and laugh about stack too deep, today is not that day.
     struct FaultDisputeGameParams {
+        AnchorStateRegistry anchorStateRegistry;
         DelayedWETH weth;
         GameType gameType;
         Claim absolutePrestate;
@@ -114,9 +119,14 @@ contract Deploy is Deployer {
         vm.startStateDiffRecording();
         _;
         VmSafe.AccountAccess[] memory accesses = vm.stopAndReturnStateDiff();
-        console.log("Writing %d state diff account accesses to snapshots/state-diff/%s.json", accesses.length, name());
+        console.log(
+            "Writing %d state diff account accesses to snapshots/state-diff/%s.json",
+            accesses.length,
+            vm.toString(block.chainid)
+        );
         string memory json = LibStateDiff.encodeAccountAccesses(accesses);
-        string memory statediffPath = string.concat(vm.projectRoot(), "/snapshots/state-diff/", name(), ".json");
+        string memory statediffPath =
+            string.concat(vm.projectRoot(), "/snapshots/state-diff/", vm.toString(block.chainid), ".json");
         vm.writeJson({ json: json, path: statediffPath });
     }
 
@@ -124,11 +134,6 @@ contract Deploy is Deployer {
     //                        Accessors                           //
     ////////////////////////////////////////////////////////////////
 
-    /// @inheritdoc Deployer
-    function name() public pure override returns (string memory name_) {
-        name_ = "Deploy";
-    }
-
     /// @notice The create2 salt used for deployment of the contract implementations.
     ///         Using this helps to reduce config across networks as the implementation
     ///         addresses will be the same across networks when deployed with create2.
@@ -144,6 +149,7 @@ contract Deploy is Deployer {
             L2OutputOracle: mustGetAddress("L2OutputOracleProxy"),
             DisputeGameFactory: mustGetAddress("DisputeGameFactoryProxy"),
             DelayedWETH: mustGetAddress("DelayedWETHProxy"),
+            AnchorStateRegistry: mustGetAddress("AnchorStateRegistryProxy"),
             OptimismMintableERC20Factory: mustGetAddress("OptimismMintableERC20FactoryProxy"),
             OptimismPortal: mustGetAddress("OptimismPortalProxy"),
             OptimismPortal2: mustGetAddress("OptimismPortalProxy"),
@@ -162,6 +168,7 @@ contract Deploy is Deployer {
             L2OutputOracle: getAddress("L2OutputOracleProxy"),
             DisputeGameFactory: getAddress("DisputeGameFactoryProxy"),
             DelayedWETH: getAddress("DelayedWETHProxy"),
+            AnchorStateRegistry: getAddress("AnchorStateRegistryProxy"),
             OptimismMintableERC20Factory: getAddress("OptimismMintableERC20FactoryProxy"),
             OptimismPortal: getAddress("OptimismPortalProxy"),
             OptimismPortal2: getAddress("OptimismPortalProxy"),
@@ -178,6 +185,13 @@ contract Deploy is Deployer {
 
     /// @notice Gets the address of the SafeProxyFactory and Safe singleton for use in deploying a new GnosisSafe.
     function _getSafeFactory() internal returns (SafeProxyFactory safeProxyFactory_, Safe safeSingleton_) {
+        if (getAddress("SafeProxyFactory") != address(0)) {
+            // The SafeProxyFactory is already saved, we can just use it.
+            safeProxyFactory_ = SafeProxyFactory(getAddress("SafeProxyFactory"));
+            safeSingleton_ = Safe(getAddress("SafeSingleton"));
+            return (safeProxyFactory_, safeSingleton_);
+        }
+
         // These are the standard create2 deployed contracts. First we'll check if they are deployed,
         // if not we'll deploy new ones, though not at these addresses.
         address safeProxyFactory = 0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2;
@@ -194,13 +208,11 @@ contract Deploy is Deployer {
     }
 
     /// @notice Make a call from the Safe contract to an arbitrary address with arbitrary data
-    function _callViaSafe(address _target, bytes memory _data) internal {
-        Safe safe = Safe(mustGetAddress("SystemOwnerSafe"));
-
+    function _callViaSafe(Safe _safe, address _target, bytes memory _data) internal {
         // This is the signature format used the caller is also the signer.
         bytes memory signature = abi.encodePacked(uint256(uint160(msg.sender)), bytes32(0), uint8(1));
 
-        safe.execTransaction({
+        _safe.execTransaction({
             to: _target,
             value: 0,
             data: _data,
@@ -221,7 +233,8 @@ contract Deploy is Deployer {
         bytes memory data =
             abi.encodeCall(ProxyAdmin.upgradeAndCall, (payable(_proxy), _implementation, _innerCallData));
 
-        _callViaSafe({ _target: proxyAdmin, _data: data });
+        Safe safe = Safe(mustGetAddress("SystemOwnerSafe"));
+        _callViaSafe({ _safe: safe, _target: proxyAdmin, _data: data });
     }
 
     /// @notice Transfer ownership of the ProxyAdmin contract to the final system owner
@@ -257,9 +270,9 @@ contract Deploy is Deployer {
     }
 
     function runWithStateDump() public {
+        vm.chainId(cfg.l1ChainID());
         _run();
-
-        vm.dumpState(Config.stateDumpPath(name()));
+        vm.dumpState(Config.stateDumpPath(""));
     }
 
     /// @notice Deploy all L1 contracts and write the state diff to a file.
@@ -268,13 +281,21 @@ contract Deploy is Deployer {
     }
 
     /// @notice Internal function containing the deploy logic.
-    function _run() internal {
-        deploySafe();
+    function _run() internal virtual {
+        console.log("start of L1 Deploy!");
+        deploySafe("SystemOwnerSafe");
+        console.log("deployed Safe!");
         setupSuperchain();
+        console.log("set up superchain!");
         if (cfg.usePlasma()) {
-            setupOpPlasma();
+            bytes32 typeHash = keccak256(bytes(cfg.daCommitmentType()));
+            bytes32 keccakHash = keccak256(bytes("KeccakCommitment"));
+            if (typeHash == keccakHash) {
+                setupOpPlasma();
+            }
         }
         setupOpChain();
+        console.log("set up op chain!");
     }
 
     ////////////////////////////////////////////////////////////////
@@ -345,6 +366,7 @@ contract Deploy is Deployer {
         deployERC1967Proxy("DisputeGameFactoryProxy");
         deployERC1967Proxy("L2OutputOracleProxy");
         deployERC1967Proxy("DelayedWETHProxy");
+        deployERC1967Proxy("AnchorStateRegistryProxy");
 
         transferAddressManagerOwnership(); // to the ProxyAdmin
     }
@@ -366,20 +388,12 @@ contract Deploy is Deployer {
         deployDelayedWETH();
         deployPreimageOracle();
         deployMips();
+        deployAnchorStateRegistry();
     }
 
     /// @notice Initialize all of the implementations
     function initializeImplementations() public {
         console.log("Initializing implementations");
-        initializeSystemConfig();
-        initializeL1StandardBridge();
-        initializeL1ERC721Bridge();
-        initializeOptimismMintableERC20Factory();
-        initializeL1CrossDomainMessenger();
-        initializeL2OutputOracle();
-        initializeDisputeGameFactory();
-        initializeDelayedWETH();
-
         // Selectively initialize either the original OptimismPortal or the new OptimismPortal2. Since this will upgrade
         // the proxy, we cannot initialize both. FPAC warning can be removed once we're done with the old OptimismPortal
         // contract.
@@ -389,6 +403,16 @@ contract Deploy is Deployer {
         } else {
             initializeOptimismPortal();
         }
+
+        initializeSystemConfig();
+        initializeL1StandardBridge();
+        initializeL1ERC721Bridge();
+        initializeOptimismMintableERC20Factory();
+        initializeL1CrossDomainMessenger();
+        initializeL2OutputOracle();
+        initializeDisputeGameFactory();
+        initializeDelayedWETH();
+        initializeAnchorStateRegistry();
     }
 
     /// @notice Add Plasma setup to the OP chain
@@ -404,21 +428,67 @@ contract Deploy is Deployer {
     ////////////////////////////////////////////////////////////////
 
     /// @notice Deploy the Safe
-    function deploySafe() public broadcast returns (address addr_) {
-        console.log("Deploying Safe");
+    function deploySafe(string memory _name) public broadcast returns (address addr_) {
+        address[] memory owners = new address[](0);
+        addr_ = deploySafe(_name, owners, 1, true);
+    }
+
+    /// @notice Deploy a new Safe contract. If the keepDeployer option is used to enable further setup actions, then
+    ///         the removeDeployerFromSafe() function should be called on that safe after setup is complete.
+    ///         Note this function does not have the broadcast modifier.
+    /// @param _name The name of the Safe to deploy.
+    /// @param _owners The owners of the Safe.
+    /// @param _threshold The threshold of the Safe.
+    /// @param _keepDeployer Wether or not the deployer address will be added as an owner of the Safe.
+    function deploySafe(
+        string memory _name,
+        address[] memory _owners,
+        uint256 _threshold,
+        bool _keepDeployer
+    )
+        public
+        returns (address addr_)
+    {
+        bytes32 salt = keccak256(abi.encode(_name, _implSalt()));
+        console.log("Deploying safe: %s with salt %s", _name, vm.toString(salt));
         (SafeProxyFactory safeProxyFactory, Safe safeSingleton) = _getSafeFactory();
 
-        address[] memory signers = new address[](1);
-        signers[0] = msg.sender;
+        address[] memory expandedOwners = new address[](_owners.length + 1);
+        if (_keepDeployer) {
+            // By always adding msg.sender first we know that the previousOwner will be SENTINEL_OWNERS, which makes it
+            // easier to call removeOwner later.
+            expandedOwners[0] = msg.sender;
+            for (uint256 i = 0; i < _owners.length; i++) {
+                expandedOwners[i + 1] = _owners[i];
+            }
+            _owners = expandedOwners;
+        }
 
-        bytes memory initData = abi.encodeWithSelector(
-            Safe.setup.selector, signers, 1, address(0), hex"", address(0), address(0), 0, address(0)
+        bytes memory initData = abi.encodeCall(
+            Safe.setup, (_owners, _threshold, address(0), hex"", address(0), address(0), 0, payable(address(0)))
         );
-        address safe = address(safeProxyFactory.createProxyWithNonce(address(safeSingleton), initData, block.timestamp));
+        addr_ = address(safeProxyFactory.createProxyWithNonce(address(safeSingleton), initData, uint256(salt)));
+
+        save(_name, addr_);
+        console.log("New safe: %s deployed at %s\n    Note that this safe is owned by the deployer key", _name, addr_);
+    }
 
-        save("SystemOwnerSafe", address(safe));
-        console.log("New SystemOwnerSafe deployed at %s", address(safe));
-        addr_ = safe;
+    /// @notice If the keepDeployer option was used with deploySafe(), this function can be used to remove the deployer.
+    ///         Note this function does not have the broadcast modifier.
+    function removeDeployerFromSafe(string memory _name, uint256 _newThreshold) public {
+        Safe safe = Safe(mustGetAddress(_name));
+
+        // The sentinel address is used to mark the start and end of the linked list of owners in the Safe.
+        address sentinelOwners = address(0x1);
+
+        // Because deploySafe() always adds msg.sender first (if keepDeployer is true), we know that the previousOwner
+        // will be sentinelOwners.
+        _callViaSafe({
+            _safe: safe,
+            _target: address(safe),
+            _data: abi.encodeCall(OwnerManager.removeOwner, (sentinelOwners, msg.sender, _newThreshold))
+        });
+        console.log("Removed deployer owner from ", _name);
     }
 
     /// @notice Deploy the AddressManager
@@ -569,20 +639,20 @@ contract Deploy is Deployer {
     /// @notice Deploy the OptimismPortal
     function deployOptimismPortal() public broadcast returns (address addr_) {
         console.log("Deploying OptimismPortal implementation");
-
-        OptimismPortal portal = new OptimismPortal{ salt: _implSalt() }();
-
-        save("OptimismPortal", address(portal));
-        console.log("OptimismPortal deployed at %s", address(portal));
+        if (cfg.useInterop()) {
+            addr_ = address(new OptimismPortalInterop{ salt: _implSalt() }());
+        } else {
+            addr_ = address(new OptimismPortal{ salt: _implSalt() }());
+        }
+        save("OptimismPortal", addr_);
+        console.log("OptimismPortal deployed at %s", addr_);
 
         // Override the `OptimismPortal` contract to the deployed implementation. This is necessary
         // to check the `OptimismPortal` implementation alongside dependent contracts, which
         // are always proxies.
         Types.ContractSet memory contracts = _proxiesUnstrict();
-        contracts.OptimismPortal = address(portal);
+        contracts.OptimismPortal = addr_;
         ChainAssertions.checkOptimismPortal({ _contracts: contracts, _cfg: cfg, _isProxy: false });
-
-        addr_ = address(portal);
     }
 
     /// @notice Deploy the OptimismPortal2
@@ -596,8 +666,7 @@ contract Deploy is Deployer {
 
         OptimismPortal2 portal = new OptimismPortal2{ salt: _implSalt() }({
             _proofMaturityDelaySeconds: cfg.proofMaturityDelaySeconds(),
-            _disputeGameFinalityDelaySeconds: cfg.disputeGameFinalityDelaySeconds(),
-            _initialRespectedGameType: GameType.wrap(uint32(cfg.respectedGameType()))
+            _disputeGameFinalityDelaySeconds: cfg.disputeGameFinalityDelaySeconds()
         });
 
         save("OptimismPortal2", address(portal));
@@ -731,22 +800,34 @@ contract Deploy is Deployer {
         addr_ = address(mips);
     }
 
+    /// @notice Deploy the AnchorStateRegistry
+    function deployAnchorStateRegistry() public broadcast returns (address addr_) {
+        console.log("Deploying AnchorStateRegistry implementation");
+        AnchorStateRegistry anchorStateRegistry =
+            new AnchorStateRegistry{ salt: _implSalt() }(DisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")));
+        save("AnchorStateRegistry", address(anchorStateRegistry));
+        console.log("AnchorStateRegistry deployed at %s", address(anchorStateRegistry));
+
+        addr_ = address(anchorStateRegistry);
+    }
+
     /// @notice Deploy the SystemConfig
     function deploySystemConfig() public broadcast returns (address addr_) {
         console.log("Deploying SystemConfig implementation");
-        SystemConfig config = new SystemConfig{ salt: _implSalt() }();
-
-        save("SystemConfig", address(config));
-        console.log("SystemConfig deployed at %s", address(config));
+        if (cfg.useInterop()) {
+            addr_ = address(new SystemConfigInterop{ salt: _implSalt() }());
+        } else {
+            addr_ = address(new SystemConfig{ salt: _implSalt() }());
+        }
+        save("SystemConfig", addr_);
+        console.log("SystemConfig deployed at %s", addr_);
 
         // Override the `SystemConfig` contract to the deployed implementation. This is necessary
         // to check the `SystemConfig` implementation alongside dependent contracts, which
         // are always proxies.
         Types.ContractSet memory contracts = _proxiesUnstrict();
-        contracts.SystemConfig = address(config);
+        contracts.SystemConfig = addr_;
         ChainAssertions.checkSystemConfig({ _contracts: contracts, _cfg: cfg, _isProxy: false });
-
-        addr_ = address(config);
     }
 
     /// @notice Deploy the L1StandardBridge
@@ -869,6 +950,51 @@ contract Deploy is Deployer {
         });
     }
 
+    function initializeAnchorStateRegistry() public broadcast {
+        console.log("Upgrading and initializing AnchorStateRegistry proxy");
+        address anchorStateRegistryProxy = mustGetAddress("AnchorStateRegistryProxy");
+        address anchorStateRegistry = mustGetAddress("AnchorStateRegistry");
+
+        AnchorStateRegistry.StartingAnchorRoot[] memory roots = new AnchorStateRegistry.StartingAnchorRoot[](4);
+        roots[0] = AnchorStateRegistry.StartingAnchorRoot({
+            gameType: GameTypes.CANNON,
+            outputRoot: OutputRoot({
+                root: Hash.wrap(cfg.faultGameGenesisOutputRoot()),
+                l2BlockNumber: cfg.faultGameGenesisBlock()
+            })
+        });
+        roots[1] = AnchorStateRegistry.StartingAnchorRoot({
+            gameType: GameTypes.PERMISSIONED_CANNON,
+            outputRoot: OutputRoot({
+                root: Hash.wrap(cfg.faultGameGenesisOutputRoot()),
+                l2BlockNumber: cfg.faultGameGenesisBlock()
+            })
+        });
+        roots[2] = AnchorStateRegistry.StartingAnchorRoot({
+            gameType: GameTypes.ALPHABET,
+            outputRoot: OutputRoot({
+                root: Hash.wrap(cfg.faultGameGenesisOutputRoot()),
+                l2BlockNumber: cfg.faultGameGenesisBlock()
+            })
+        });
+        roots[3] = AnchorStateRegistry.StartingAnchorRoot({
+            gameType: GameTypes.ASTERISC,
+            outputRoot: OutputRoot({
+                root: Hash.wrap(cfg.faultGameGenesisOutputRoot()),
+                l2BlockNumber: cfg.faultGameGenesisBlock()
+            })
+        });
+
+        _upgradeAndCallViaSafe({
+            _proxy: payable(anchorStateRegistryProxy),
+            _implementation: anchorStateRegistry,
+            _innerCallData: abi.encodeCall(AnchorStateRegistry.initialize, (roots))
+        });
+
+        string memory version = AnchorStateRegistry(payable(anchorStateRegistryProxy)).version();
+        console.log("AnchorStateRegistry version: %s", version);
+    }
+
     /// @notice Initialize the SystemConfig
     function initializeSystemConfig() public broadcast {
         console.log("Upgrading and initializing SystemConfig proxy");
@@ -877,6 +1003,11 @@ contract Deploy is Deployer {
 
         bytes32 batcherHash = bytes32(uint256(uint160(cfg.batchSenderAddress())));
 
+        address customGasTokenAddress = Constants.ETHER;
+        if (cfg.useCustomGasToken()) {
+            customGasTokenAddress = cfg.customGasTokenAddress();
+        }
+
         _upgradeAndCallViaSafe({
             _proxy: payable(systemConfigProxy),
             _implementation: systemConfig,
@@ -884,8 +1015,8 @@ contract Deploy is Deployer {
                 SystemConfig.initialize,
                 (
                     cfg.finalSystemOwner(),
-                    cfg.gasPriceOracleOverhead(),
-                    cfg.gasPriceOracleScalar(),
+                    cfg.basefeeScalar(),
+                    cfg.blobbasefeeScalar(),
                     batcherHash,
                     uint64(cfg.l2GenesisBlockGasLimit()),
                     cfg.p2pSequencerAddress(),
@@ -895,12 +1026,13 @@ contract Deploy is Deployer {
                         l1CrossDomainMessenger: mustGetAddress("L1CrossDomainMessengerProxy"),
                         l1ERC721Bridge: mustGetAddress("L1ERC721BridgeProxy"),
                         l1StandardBridge: mustGetAddress("L1StandardBridgeProxy"),
-                        l2OutputOracle: mustGetAddress("L2OutputOracleProxy"),
+                        disputeGameFactory: mustGetAddress("DisputeGameFactoryProxy"),
                         optimismPortal: mustGetAddress("OptimismPortalProxy"),
-                        optimismMintableERC20Factory: mustGetAddress("OptimismMintableERC20FactoryProxy")
+                        optimismMintableERC20Factory: mustGetAddress("OptimismMintableERC20FactoryProxy"),
+                        gasPayingToken: customGasTokenAddress
                     })
                 )
-                )
+            )
         });
 
         SystemConfig config = SystemConfig(systemConfigProxy);
@@ -918,10 +1050,13 @@ contract Deploy is Deployer {
         address l1StandardBridge = mustGetAddress("L1StandardBridge");
         address l1CrossDomainMessengerProxy = mustGetAddress("L1CrossDomainMessengerProxy");
         address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy");
+        address systemConfigProxy = mustGetAddress("SystemConfigProxy");
 
         uint256 proxyType = uint256(proxyAdmin.proxyType(l1StandardBridgeProxy));
+        Safe safe = Safe(mustGetAddress("SystemOwnerSafe"));
         if (proxyType != uint256(ProxyAdmin.ProxyType.CHUGSPLASH)) {
             _callViaSafe({
+                _safe: safe,
                 _target: address(proxyAdmin),
                 _data: abi.encodeCall(ProxyAdmin.setProxyType, (l1StandardBridgeProxy, ProxyAdmin.ProxyType.CHUGSPLASH))
             });
@@ -933,8 +1068,12 @@ contract Deploy is Deployer {
             _implementation: l1StandardBridge,
             _innerCallData: abi.encodeCall(
                 L1StandardBridge.initialize,
-                (L1CrossDomainMessenger(l1CrossDomainMessengerProxy), SuperchainConfig(superchainConfigProxy))
+                (
+                    L1CrossDomainMessenger(l1CrossDomainMessengerProxy),
+                    SuperchainConfig(superchainConfigProxy),
+                    SystemConfig(systemConfigProxy)
                 )
+            )
         });
 
         string memory version = L1StandardBridge(payable(l1StandardBridgeProxy)).version();
@@ -957,7 +1096,7 @@ contract Deploy is Deployer {
             _innerCallData: abi.encodeCall(
                 L1ERC721Bridge.initialize,
                 (L1CrossDomainMessenger(payable(l1CrossDomainMessengerProxy)), SuperchainConfig(superchainConfigProxy))
-                )
+            )
         });
 
         L1ERC721Bridge bridge = L1ERC721Bridge(l1ERC721BridgeProxy);
@@ -967,7 +1106,7 @@ contract Deploy is Deployer {
         ChainAssertions.checkL1ERC721Bridge({ _contracts: _proxies(), _isProxy: true });
     }
 
-    /// @notice Ininitialize the OptimismMintableERC20Factory
+    /// @notice Initialize the OptimismMintableERC20Factory
     function initializeOptimismMintableERC20Factory() public broadcast {
         console.log("Upgrading and initializing OptimismMintableERC20Factory proxy");
         address optimismMintableERC20FactoryProxy = mustGetAddress("OptimismMintableERC20FactoryProxy");
@@ -995,10 +1134,13 @@ contract Deploy is Deployer {
         address l1CrossDomainMessenger = mustGetAddress("L1CrossDomainMessenger");
         address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy");
         address optimismPortalProxy = mustGetAddress("OptimismPortalProxy");
+        address systemConfigProxy = mustGetAddress("SystemConfigProxy");
 
         uint256 proxyType = uint256(proxyAdmin.proxyType(l1CrossDomainMessengerProxy));
+        Safe safe = Safe(mustGetAddress("SystemOwnerSafe"));
         if (proxyType != uint256(ProxyAdmin.ProxyType.RESOLVED)) {
             _callViaSafe({
+                _safe: safe,
                 _target: address(proxyAdmin),
                 _data: abi.encodeCall(ProxyAdmin.setProxyType, (l1CrossDomainMessengerProxy, ProxyAdmin.ProxyType.RESOLVED))
             });
@@ -1009,6 +1151,7 @@ contract Deploy is Deployer {
         string memory implName = proxyAdmin.implementationName(l1CrossDomainMessenger);
         if (keccak256(bytes(contractName)) != keccak256(bytes(implName))) {
             _callViaSafe({
+                _safe: safe,
                 _target: address(proxyAdmin),
                 _data: abi.encodeCall(ProxyAdmin.setImplementationName, (l1CrossDomainMessengerProxy, contractName))
             });
@@ -1023,8 +1166,12 @@ contract Deploy is Deployer {
             _implementation: l1CrossDomainMessenger,
             _innerCallData: abi.encodeCall(
                 L1CrossDomainMessenger.initialize,
-                (SuperchainConfig(superchainConfigProxy), OptimismPortal(payable(optimismPortalProxy)))
+                (
+                    SuperchainConfig(superchainConfigProxy),
+                    OptimismPortal(payable(optimismPortalProxy)),
+                    SystemConfig(systemConfigProxy)
                 )
+            )
         });
 
         L1CrossDomainMessenger messenger = L1CrossDomainMessenger(l1CrossDomainMessengerProxy);
@@ -1054,7 +1201,7 @@ contract Deploy is Deployer {
                     cfg.l2OutputOracleChallenger(),
                     cfg.finalizationPeriodSeconds()
                 )
-                )
+            )
         });
 
         L2OutputOracle oracle = L2OutputOracle(l2OutputOracleProxy);
@@ -1088,7 +1235,7 @@ contract Deploy is Deployer {
                     SystemConfig(systemConfigProxy),
                     SuperchainConfig(superchainConfigProxy)
                 )
-                )
+            )
         });
 
         OptimismPortal portal = OptimismPortal(payable(optimismPortalProxy));
@@ -1115,9 +1262,10 @@ contract Deploy is Deployer {
                 (
                     DisputeGameFactory(disputeGameFactoryProxy),
                     SystemConfig(systemConfigProxy),
-                    SuperchainConfig(superchainConfigProxy)
-                )
+                    SuperchainConfig(superchainConfigProxy),
+                    GameType.wrap(uint32(cfg.respectedGameType()))
                 )
+            )
         });
 
         OptimismPortal2 portal = OptimismPortal2(payable(optimismPortalProxy));
@@ -1146,7 +1294,7 @@ contract Deploy is Deployer {
                     ProtocolVersion.wrap(requiredProtocolVersion),
                     ProtocolVersion.wrap(recommendedProtocolVersion)
                 )
-                )
+            )
         });
 
         ProtocolVersions versions = ProtocolVersions(protocolVersionsProxy);
@@ -1222,6 +1370,7 @@ contract Deploy is Deployer {
             _factory: factory,
             _allowUpgrade: _allowUpgrade,
             _params: FaultDisputeGameParams({
+                anchorStateRegistry: AnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")),
                 weth: weth,
                 gameType: GameTypes.CANNON,
                 absolutePrestate: loadMipsAbsolutePrestate(),
@@ -1242,6 +1391,7 @@ contract Deploy is Deployer {
             _factory: factory,
             _allowUpgrade: _allowUpgrade,
             _params: FaultDisputeGameParams({
+                anchorStateRegistry: AnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")),
                 weth: weth,
                 gameType: GameTypes.PERMISSIONED_CANNON,
                 absolutePrestate: loadMipsAbsolutePrestate(),
@@ -1262,6 +1412,7 @@ contract Deploy is Deployer {
             _factory: factory,
             _allowUpgrade: _allowUpgrade,
             _params: FaultDisputeGameParams({
+                anchorStateRegistry: AnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")),
                 weth: weth,
                 gameType: GameTypes.ALPHABET,
                 absolutePrestate: outputAbsolutePrestate,
@@ -1295,13 +1446,13 @@ contract Deploy is Deployer {
                 new FaultDisputeGame({
                     _gameType: _params.gameType,
                     _absolutePrestate: _params.absolutePrestate,
-                    _genesisBlockNumber: cfg.faultGameGenesisBlock(),
-                    _genesisOutputRoot: Hash.wrap(cfg.faultGameGenesisOutputRoot()),
                     _maxGameDepth: _params.maxGameDepth,
                     _splitDepth: cfg.faultGameSplitDepth(),
-                    _gameDuration: Duration.wrap(uint64(cfg.faultGameMaxDuration())),
+                    _clockExtension: Duration.wrap(uint64(cfg.faultGameClockExtension())),
+                    _maxClockDuration: Duration.wrap(uint64(cfg.faultGameMaxClockDuration())),
                     _vm: _params.faultVm,
                     _weth: _params.weth,
+                    _anchorStateRegistry: _params.anchorStateRegistry,
                     _l2ChainId: cfg.l2ChainID()
                 })
             );
@@ -1311,13 +1462,13 @@ contract Deploy is Deployer {
                 new PermissionedDisputeGame({
                     _gameType: _params.gameType,
                     _absolutePrestate: _params.absolutePrestate,
-                    _genesisBlockNumber: cfg.faultGameGenesisBlock(),
-                    _genesisOutputRoot: Hash.wrap(cfg.faultGameGenesisOutputRoot()),
                     _maxGameDepth: _params.maxGameDepth,
                     _splitDepth: cfg.faultGameSplitDepth(),
-                    _gameDuration: Duration.wrap(uint64(cfg.faultGameMaxDuration())),
+                    _clockExtension: Duration.wrap(uint64(cfg.faultGameClockExtension())),
+                    _maxClockDuration: Duration.wrap(uint64(cfg.faultGameMaxClockDuration())),
                     _vm: _params.faultVm,
                     _weth: _params.weth,
+                    _anchorStateRegistry: _params.anchorStateRegistry,
                     _l2ChainId: cfg.l2ChainID(),
                     _proposer: cfg.l2OutputOracleProposer(),
                     _challenger: cfg.l2OutputOracleChallenger()
@@ -1361,7 +1512,7 @@ contract Deploy is Deployer {
             _innerCallData: abi.encodeCall(
                 DataAvailabilityChallenge.initialize,
                 (finalSystemOwner, daChallengeWindow, daResolveWindow, daBondSize, daResolverRefundPercentage)
-                )
+            )
         });
 
         DataAvailabilityChallenge dac = DataAvailabilityChallenge(payable(dataAvailabilityChallengeProxy));
diff --git a/packages/contracts-bedrock/scripts/DeployConfig.s.sol b/packages/contracts-bedrock/scripts/DeployConfig.s.sol
index 097ffbf4b9e4..3467d7e4d9a3 100644
--- a/packages/contracts-bedrock/scripts/DeployConfig.s.sol
+++ b/packages/contracts-bedrock/scripts/DeployConfig.s.sol
@@ -7,10 +7,6 @@ import { stdJson } from "forge-std/StdJson.sol";
 import { Executables } from "scripts/Executables.sol";
 import { Chains } from "scripts/Chains.sol";
 
-// Global constant for the `useFaultProofs` slot in the DeployConfig contract, which can be overridden in the testing
-// environment.
-bytes32 constant USE_FAULT_PROOFS_SLOT = bytes32(uint256(63));
-
 /// @title DeployConfig
 /// @notice Represents the configuration required to deploy the system. It is expected
 ///         to read the file from JSON. A future improvement would be to have fallback
@@ -39,8 +35,10 @@ contract DeployConfig is Script {
     address public proxyAdminOwner;
     address public baseFeeVaultRecipient;
     uint256 public baseFeeVaultMinimumWithdrawalAmount;
+    uint256 public baseFeeVaultWithdrawalNetwork;
     address public l1FeeVaultRecipient;
     uint256 public l1FeeVaultMinimumWithdrawalAmount;
+    uint256 public l1FeeVaultWithdrawalNetwork;
     address public sequencerFeeVaultRecipient;
     uint256 public sequencerFeeVaultMinimumWithdrawalAmount;
     uint256 public sequencerFeeVaultWithdrawalNetwork;
@@ -48,9 +46,8 @@ contract DeployConfig is Script {
     string public governanceTokenSymbol;
     address public governanceTokenOwner;
     uint256 public l2GenesisBlockGasLimit;
-    uint256 public l2GenesisBlockBaseFeePerGas;
-    uint256 public gasPriceOracleOverhead;
-    uint256 public gasPriceOracleScalar;
+    uint32 public basefeeScalar;
+    uint32 public blobbasefeeScalar;
     bool public enableGovernance;
     uint256 public eip1559Denominator;
     uint256 public eip1559Elasticity;
@@ -59,7 +56,8 @@ contract DeployConfig is Script {
     bytes32 public faultGameGenesisOutputRoot;
     uint256 public faultGameMaxDepth;
     uint256 public faultGameSplitDepth;
-    uint256 public faultGameMaxDuration;
+    uint256 public faultGameClockExtension;
+    uint256 public faultGameMaxClockDuration;
     uint256 public faultGameWithdrawalDelay;
     uint256 public preimageOracleMinProposalSize;
     uint256 public preimageOracleChallengePeriod;
@@ -71,11 +69,17 @@ contract DeployConfig is Script {
     uint256 public respectedGameType;
     bool public useFaultProofs;
     bool public usePlasma;
+    string public daCommitmentType;
     uint256 public daChallengeWindow;
     uint256 public daResolveWindow;
     uint256 public daBondSize;
     uint256 public daResolverRefundPercentage;
 
+    bool public useCustomGasToken;
+    address public customGasTokenAddress;
+
+    bool public useInterop;
+
     function read(string memory _path) public {
         console.log("DeployConfig: reading file %s", _path);
         try vm.readFile(_path) returns (string memory data) {
@@ -101,12 +105,14 @@ contract DeployConfig is Script {
         l2OutputOracleProposer = stdJson.readAddress(_json, "$.l2OutputOracleProposer");
         l2OutputOracleChallenger = stdJson.readAddress(_json, "$.l2OutputOracleChallenger");
         finalizationPeriodSeconds = stdJson.readUint(_json, "$.finalizationPeriodSeconds");
-        fundDevAccounts = stdJson.readBool(_json, "$.fundDevAccounts");
+        fundDevAccounts = _readOr(_json, "$.fundDevAccounts", false);
         proxyAdminOwner = stdJson.readAddress(_json, "$.proxyAdminOwner");
         baseFeeVaultRecipient = stdJson.readAddress(_json, "$.baseFeeVaultRecipient");
         baseFeeVaultMinimumWithdrawalAmount = stdJson.readUint(_json, "$.baseFeeVaultMinimumWithdrawalAmount");
+        baseFeeVaultWithdrawalNetwork = stdJson.readUint(_json, "$.baseFeeVaultWithdrawalNetwork");
         l1FeeVaultRecipient = stdJson.readAddress(_json, "$.l1FeeVaultRecipient");
         l1FeeVaultMinimumWithdrawalAmount = stdJson.readUint(_json, "$.l1FeeVaultMinimumWithdrawalAmount");
+        l1FeeVaultWithdrawalNetwork = stdJson.readUint(_json, "$.l1FeeVaultWithdrawalNetwork");
         sequencerFeeVaultRecipient = stdJson.readAddress(_json, "$.sequencerFeeVaultRecipient");
         sequencerFeeVaultMinimumWithdrawalAmount = stdJson.readUint(_json, "$.sequencerFeeVaultMinimumWithdrawalAmount");
         sequencerFeeVaultWithdrawalNetwork = stdJson.readUint(_json, "$.sequencerFeeVaultWithdrawalNetwork");
@@ -114,9 +120,9 @@ contract DeployConfig is Script {
         governanceTokenSymbol = stdJson.readString(_json, "$.governanceTokenSymbol");
         governanceTokenOwner = stdJson.readAddress(_json, "$.governanceTokenOwner");
         l2GenesisBlockGasLimit = stdJson.readUint(_json, "$.l2GenesisBlockGasLimit");
-        l2GenesisBlockBaseFeePerGas = stdJson.readUint(_json, "$.l2GenesisBlockBaseFeePerGas");
-        gasPriceOracleOverhead = stdJson.readUint(_json, "$.gasPriceOracleOverhead");
-        gasPriceOracleScalar = stdJson.readUint(_json, "$.gasPriceOracleScalar");
+        basefeeScalar = uint32(_readOr(_json, "$.gasPriceOracleBaseFeeScalar", 1368));
+        blobbasefeeScalar = uint32(_readOr(_json, "$.gasPriceOracleBlobBaseFeeScalar", 810949));
+
         enableGovernance = stdJson.readBool(_json, "$.enableGovernance");
         eip1559Denominator = stdJson.readUint(_json, "$.eip1559Denominator");
         eip1559Elasticity = stdJson.readUint(_json, "$.eip1559Elasticity");
@@ -124,15 +130,16 @@ contract DeployConfig is Script {
         requiredProtocolVersion = stdJson.readUint(_json, "$.requiredProtocolVersion");
         recommendedProtocolVersion = stdJson.readUint(_json, "$.recommendedProtocolVersion");
 
-        useFaultProofs = stdJson.readBool(_json, "$.useFaultProofs");
-        proofMaturityDelaySeconds = stdJson.readUint(_json, "$.proofMaturityDelaySeconds");
-        disputeGameFinalityDelaySeconds = stdJson.readUint(_json, "$.disputeGameFinalityDelaySeconds");
-        respectedGameType = stdJson.readUint(_json, "$.respectedGameType");
+        useFaultProofs = _readOr(_json, "$.useFaultProofs", false);
+        proofMaturityDelaySeconds = _readOr(_json, "$.proofMaturityDelaySeconds", 0);
+        disputeGameFinalityDelaySeconds = _readOr(_json, "$.disputeGameFinalityDelaySeconds", 0);
+        respectedGameType = _readOr(_json, "$.respectedGameType", 0);
 
         faultGameAbsolutePrestate = stdJson.readUint(_json, "$.faultGameAbsolutePrestate");
         faultGameMaxDepth = stdJson.readUint(_json, "$.faultGameMaxDepth");
         faultGameSplitDepth = stdJson.readUint(_json, "$.faultGameSplitDepth");
-        faultGameMaxDuration = stdJson.readUint(_json, "$.faultGameMaxDuration");
+        faultGameClockExtension = stdJson.readUint(_json, "$.faultGameClockExtension");
+        faultGameMaxClockDuration = stdJson.readUint(_json, "$.faultGameMaxClockDuration");
         faultGameGenesisBlock = stdJson.readUint(_json, "$.faultGameGenesisBlock");
         faultGameGenesisOutputRoot = stdJson.readBytes32(_json, "$.faultGameGenesisOutputRoot");
         faultGameWithdrawalDelay = stdJson.readUint(_json, "$.faultGameWithdrawalDelay");
@@ -141,10 +148,16 @@ contract DeployConfig is Script {
         preimageOracleChallengePeriod = stdJson.readUint(_json, "$.preimageOracleChallengePeriod");
 
         usePlasma = _readOr(_json, "$.usePlasma", false);
+        daCommitmentType = _readOr(_json, "$.daCommitmentType", "KeccakCommitment");
         daChallengeWindow = _readOr(_json, "$.daChallengeWindow", 1000);
         daResolveWindow = _readOr(_json, "$.daResolveWindow", 1000);
         daBondSize = _readOr(_json, "$.daBondSize", 1000000000);
         daResolverRefundPercentage = _readOr(_json, "$.daResolverRefundPercentage", 0);
+
+        useCustomGasToken = _readOr(_json, "$.useCustomGasToken", false);
+        customGasTokenAddress = _readOr(_json, "$.customGasTokenAddress", address(0));
+
+        useInterop = _readOr(_json, "$.useInterop", false);
     }
 
     function l1StartingBlockTag() public returns (bytes32) {
@@ -180,6 +193,27 @@ contract DeployConfig is Script {
         usePlasma = _usePlasma;
     }
 
+    /// @notice Allow the `useFaultProofs` config to be overridden in testing environments
+    function setUseFaultProofs(bool _useFaultProofs) public {
+        useFaultProofs = _useFaultProofs;
+    }
+
+    /// @notice Allow the `useInterop` config to be overridden in testing environments
+    function setUseInterop(bool _useInterop) public {
+        useInterop = _useInterop;
+    }
+
+    /// @notice Allow the `fundDevAccounts` config to be overridden.
+    function setFundDevAccounts(bool _fundDevAccounts) public {
+        fundDevAccounts = _fundDevAccounts;
+    }
+
+    /// @notice Allow the `useCustomGasToken` config to be overridden in testing environments
+    function setUseCustomGasToken(address _token) public {
+        useCustomGasToken = true;
+        customGasTokenAddress = _token;
+    }
+
     function _getBlockByTag(string memory _tag) internal returns (bytes32) {
         string[] memory cmd = new string[](3);
         cmd[0] = Executables.bash;
@@ -196,4 +230,20 @@ contract DeployConfig is Script {
     function _readOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) {
         return vm.keyExists(json, key) ? stdJson.readUint(json, key) : defaultValue;
     }
+
+    function _readOr(string memory json, string memory key, address defaultValue) internal view returns (address) {
+        return vm.keyExists(json, key) ? stdJson.readAddress(json, key) : defaultValue;
+    }
+
+    function _readOr(
+        string memory json,
+        string memory key,
+        string memory defaultValue
+    )
+        internal
+        view
+        returns (string memory)
+    {
+        return vm.keyExists(json, key) ? stdJson.readString(json, key) : defaultValue;
+    }
 }
diff --git a/packages/contracts-bedrock/scripts/DeployOwnership.s.sol b/packages/contracts-bedrock/scripts/DeployOwnership.s.sol
new file mode 100644
index 000000000000..bb436d69b15b
--- /dev/null
+++ b/packages/contracts-bedrock/scripts/DeployOwnership.s.sol
@@ -0,0 +1,257 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import { console2 as console } from "forge-std/console2.sol";
+import { stdJson } from "forge-std/StdJson.sol";
+
+import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol";
+import { OwnerManager } from "safe-contracts/base/OwnerManager.sol";
+import { ModuleManager } from "safe-contracts/base/ModuleManager.sol";
+import { GuardManager } from "safe-contracts/base/GuardManager.sol";
+
+import { Deployer } from "scripts/Deployer.sol";
+
+import { LivenessGuard } from "src/Safe/LivenessGuard.sol";
+import { LivenessModule } from "src/Safe/LivenessModule.sol";
+import { DeputyGuardianModule } from "src/Safe/DeputyGuardianModule.sol";
+import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
+
+import { Deploy } from "./Deploy.s.sol";
+
+/// @notice Configuration for a Safe
+struct SafeConfig {
+    uint256 threshold;
+    address[] owners;
+}
+
+/// @notice Configuration for the Liveness Module
+struct LivenessModuleConfig {
+    uint256 livenessInterval;
+    uint256 thresholdPercentage;
+    uint256 minOwners;
+    address fallbackOwner;
+}
+
+/// @notice Configuration for the Security Council Safe.
+struct SecurityCouncilConfig {
+    SafeConfig safeConfig;
+    LivenessModuleConfig livenessModuleConfig;
+}
+
+/// @notice Configuration for the Deputy Guardian Module
+struct DeputyGuardianModuleConfig {
+    address deputyGuardian;
+    SuperchainConfig superchainConfig;
+}
+
+/// @notice Configuration for the Guardian Safe.
+struct GuardianConfig {
+    SafeConfig safeConfig;
+    DeputyGuardianModuleConfig deputyGuardianModuleConfig;
+}
+
+/// @title Deploy
+/// @notice Script used to deploy and configure the Safe contracts which are used to manage the Superchain,
+///         as the ProxyAdminOwner and other roles in the system. Note that this script is not executable in a
+///         production environment as some steps depend on having a quorum of signers available. This script is meant to
+///         be used as an example to guide the setup and configuration of the Safe contracts.
+contract DeployOwnership is Deploy {
+    /// @notice Internal function containing the deploy logic.
+    function _run() internal override {
+        console.log("start of Ownership Deployment");
+        // The SuperchainConfig is needed as a constructor argument to the Deputy Guardian Module
+        deploySuperchainConfig();
+
+        deployFoundationOperationsSafe();
+        deployFoundationUpgradeSafe();
+        deploySecurityCouncilSafe();
+        deployGuardianSafe();
+        configureGuardianSafe();
+        configureSecurityCouncilSafe();
+
+        console.log("Ownership contracts completed");
+    }
+
+    /// @notice Returns a SafeConfig similar to that of the Foundation Safe on Mainnet.
+    function _getExampleFoundationConfig() internal returns (SafeConfig memory safeConfig_) {
+        address[] memory exampleFoundationOwners = new address[](7);
+        for (uint256 i; i < exampleFoundationOwners.length; i++) {
+            exampleFoundationOwners[i] = makeAddr(string.concat("fnd-", vm.toString(i)));
+        }
+        safeConfig_ = SafeConfig({ threshold: 5, owners: exampleFoundationOwners });
+    }
+
+    /// @notice Returns a GuardianConfig similar to that of the Guardian Safe on Mainnet.
+    function _getExampleGuardianConfig() internal view returns (GuardianConfig memory guardianConfig_) {
+        address[] memory exampleGuardianOwners = new address[](1);
+        exampleGuardianOwners[0] = mustGetAddress("SecurityCouncilSafe");
+        guardianConfig_ = GuardianConfig({
+            safeConfig: SafeConfig({ threshold: 1, owners: exampleGuardianOwners }),
+            deputyGuardianModuleConfig: DeputyGuardianModuleConfig({
+                deputyGuardian: mustGetAddress("FoundationOperationsSafe"),
+                superchainConfig: SuperchainConfig(mustGetAddress("SuperchainConfig"))
+            })
+        });
+    }
+
+    /// @notice Returns a SafeConfig similar to that of the Security Council Safe on Mainnet.
+    function _getExampleCouncilConfig() internal returns (SecurityCouncilConfig memory councilConfig_) {
+        address[] memory exampleCouncilOwners = new address[](13);
+        for (uint256 i; i < exampleCouncilOwners.length; i++) {
+            exampleCouncilOwners[i] = makeAddr(string.concat("sc-", vm.toString(i)));
+        }
+        SafeConfig memory safeConfig = SafeConfig({ threshold: 10, owners: exampleCouncilOwners });
+        councilConfig_ = SecurityCouncilConfig({
+            safeConfig: safeConfig,
+            livenessModuleConfig: LivenessModuleConfig({
+                livenessInterval: 14 weeks,
+                thresholdPercentage: 75,
+                minOwners: 8,
+                fallbackOwner: mustGetAddress("FoundationUpgradeSafe")
+            })
+        });
+    }
+
+    /// @notice Deploys a Safe with a configuration similar to that of the Foundation Safe on Mainnet.
+    function deployFoundationOperationsSafe() public broadcast returns (address addr_) {
+        SafeConfig memory exampleFoundationConfig = _getExampleFoundationConfig();
+        addr_ = deploySafe({
+            _name: "FoundationOperationsSafe",
+            _owners: exampleFoundationConfig.owners,
+            _threshold: exampleFoundationConfig.threshold,
+            _keepDeployer: false
+        });
+    }
+
+    /// @notice Deploys a Safe with a configuration similar to that of the Foundation Safe on Mainnet.
+    function deployFoundationUpgradeSafe() public broadcast returns (address addr_) {
+        SafeConfig memory exampleFoundationConfig = _getExampleFoundationConfig();
+        addr_ = deploySafe({
+            _name: "FoundationUpgradeSafe",
+            _owners: exampleFoundationConfig.owners,
+            _threshold: exampleFoundationConfig.threshold,
+            _keepDeployer: false
+        });
+    }
+
+    /// @notice Deploy a LivenessGuard for use on the Security Council Safe.
+    ///         Note this function does not have the broadcast modifier.
+    function deployLivenessGuard() public returns (address addr_) {
+        Safe councilSafe = Safe(payable(mustGetAddress("SecurityCouncilSafe")));
+        addr_ = address(new LivenessGuard(councilSafe));
+
+        save("LivenessGuard", address(addr_));
+        console.log("New LivenessGuard deployed at %s", address(addr_));
+    }
+
+    /// @notice Deploy a LivenessModule for use on the Security Council Safe
+    ///         Note this function does not have the broadcast modifier.
+    function deployLivenessModule() public returns (address addr_) {
+        Safe councilSafe = Safe(payable(mustGetAddress("SecurityCouncilSafe")));
+        address guard = mustGetAddress("LivenessGuard");
+        LivenessModuleConfig memory livenessModuleConfig = _getExampleCouncilConfig().livenessModuleConfig;
+
+        addr_ = address(
+            new LivenessModule({
+                _safe: councilSafe,
+                _livenessGuard: LivenessGuard(guard),
+                _livenessInterval: livenessModuleConfig.livenessInterval,
+                _thresholdPercentage: livenessModuleConfig.thresholdPercentage,
+                _minOwners: livenessModuleConfig.minOwners,
+                _fallbackOwner: livenessModuleConfig.fallbackOwner
+            })
+        );
+
+        save("LivenessModule", address(addr_));
+        console.log("New LivenessModule deployed at %s", address(addr_));
+    }
+
+    /// @notice Deploy a DeputyGuardianModule for use on the Security Council Safe.
+    ///         Note this function does not have the broadcast modifier.
+    function deployDeputyGuardianModule() public returns (address addr_) {
+        Safe guardianSafe = Safe(payable(mustGetAddress("GuardianSafe")));
+        DeputyGuardianModuleConfig memory deputyGuardianModuleConfig =
+            _getExampleGuardianConfig().deputyGuardianModuleConfig;
+        addr_ = address(
+            new DeputyGuardianModule({
+                _safe: guardianSafe,
+                _superchainConfig: deputyGuardianModuleConfig.superchainConfig,
+                _deputyGuardian: deputyGuardianModuleConfig.deputyGuardian
+            })
+        );
+
+        save("DeputyGuardianModule", addr_);
+        console.log("New DeputyGuardianModule deployed at %s", addr_);
+    }
+
+    /// @notice Deploy a Security Council Safe.
+    function deploySecurityCouncilSafe() public broadcast returns (address addr_) {
+        // Deploy the safe with the extra deployer key, and keep the threshold at 1 to allow for further setup.
+        SecurityCouncilConfig memory exampleCouncilConfig = _getExampleCouncilConfig();
+        addr_ = payable(
+            deploySafe({
+                _name: "SecurityCouncilSafe",
+                _owners: exampleCouncilConfig.safeConfig.owners,
+                _threshold: 1,
+                _keepDeployer: true
+            })
+        );
+    }
+
+    /// @notice Deploy Guardian Safe.
+    function deployGuardianSafe() public broadcast returns (address addr_) {
+        // Config is hardcoded here as the Guardian Safe's configuration is inflexible.
+        address[] memory owners = new address[](1);
+        owners[0] = mustGetAddress("SecurityCouncilSafe");
+        addr_ = deploySafe({ _name: "GuardianSafe", _owners: owners, _threshold: 1, _keepDeployer: true });
+
+        console.log("Deployed and configured the Guardian Safe!");
+    }
+
+    /// @notice Configure the Guardian Safe with the DeputyGuardianModule.
+    function configureGuardianSafe() public broadcast returns (address addr_) {
+        addr_ = mustGetAddress("GuardianSafe");
+        address deputyGuardianModule = deployDeputyGuardianModule();
+        _callViaSafe({
+            _safe: Safe(payable(addr_)),
+            _target: addr_,
+            _data: abi.encodeCall(ModuleManager.enableModule, (deputyGuardianModule))
+        });
+
+        // Finalize configuration by removing the additional deployer key.
+        removeDeployerFromSafe({ _name: "GuardianSafe", _newThreshold: 1 });
+        console.log("DeputyGuardianModule enabled on GuardianSafe");
+    }
+
+    /// @notice Configure the Security Council Safe with the LivenessModule and LivenessGuard.
+    function configureSecurityCouncilSafe() public broadcast returns (address addr_) {
+        // Deploy and add the Deputy Guardian Module.
+        SecurityCouncilConfig memory exampleCouncilConfig = _getExampleCouncilConfig();
+        Safe safe = Safe(mustGetAddress("SecurityCouncilSafe"));
+
+        // Deploy and add the Liveness Guard.
+        address guard = deployLivenessGuard();
+        _callViaSafe({ _safe: safe, _target: address(safe), _data: abi.encodeCall(GuardManager.setGuard, (guard)) });
+        console.log("LivenessGuard setup on SecurityCouncilSafe");
+
+        // Deploy and add the Liveness Module.
+        address livenessModule = deployLivenessModule();
+        _callViaSafe({
+            _safe: safe,
+            _target: address(safe),
+            _data: abi.encodeCall(ModuleManager.enableModule, (livenessModule))
+        });
+
+        // Finalize configuration by removing the additional deployer key.
+        removeDeployerFromSafe({ _name: "SecurityCouncilSafe", _newThreshold: exampleCouncilConfig.safeConfig.threshold });
+
+        address[] memory owners = safe.getOwners();
+        require(
+            safe.getThreshold() == LivenessModule(livenessModule).getRequiredThreshold(owners.length),
+            "Safe threshold must be equal to the LivenessModule's required threshold"
+        );
+
+        addr_ = address(safe);
+        console.log("Deployed and configured the Security Council Safe!");
+    }
+}
diff --git a/packages/contracts-bedrock/scripts/DeployPeriphery.s.sol b/packages/contracts-bedrock/scripts/DeployPeriphery.s.sol
index 8efb11228334..01371b4a0d28 100644
--- a/packages/contracts-bedrock/scripts/DeployPeriphery.s.sol
+++ b/packages/contracts-bedrock/scripts/DeployPeriphery.s.sol
@@ -10,6 +10,8 @@ import { PeripheryDeployConfig } from "scripts/PeripheryDeployConfig.s.sol";
 import { ProxyAdmin } from "src/universal/ProxyAdmin.sol";
 import { Proxy } from "src/universal/Proxy.sol";
 
+import { L1StandardBridge } from "src/L1/L1StandardBridge.sol";
+
 import { Faucet } from "src/periphery/faucet/Faucet.sol";
 import { Drippie } from "src/periphery/drippie/Drippie.sol";
 import { CheckGelatoLow } from "src/periphery/drippie/dripchecks/CheckGelatoLow.sol";
@@ -24,22 +26,15 @@ import { Config } from "scripts/Config.sol";
 contract DeployPeriphery is Script, Artifacts {
     PeripheryDeployConfig cfg;
 
-    /// @notice The name of the script, used to ensure the right deploy artifacts
-    ///         are used.
-    function name() public pure returns (string memory name_) {
-        name_ = "DeployPeriphery";
-    }
-
+    /// @notice Sets up the deployment script.
     function setUp() public override {
         Artifacts.setUp();
-
         string memory path = string.concat(vm.projectRoot(), "/periphery-deploy-config/", deploymentContext, ".json");
         cfg = new PeripheryDeployConfig(path);
-
         console.log("Deployment context: %s", deploymentContext);
     }
 
-    /// @notice Deploy all of the periphery contracts
+    /// @notice Deploy all of the periphery contracts.
     function run() public {
         console.log("Deploying all periphery contracts");
 
@@ -58,14 +53,13 @@ contract DeployPeriphery is Script, Artifacts {
         }
     }
 
-    /// @notice Deploy all of the proxies
+    /// @notice Deploy all of the proxies.
     function deployProxies() public {
         deployProxyAdmin();
-
         deployFaucetProxy();
     }
 
-    /// @notice Deploy all of the implementations
+    /// @notice Deploy all of the implementations.
     function deployImplementations() public {
         deployFaucet();
         deployFaucetDrippie();
@@ -83,145 +77,106 @@ contract DeployPeriphery is Script, Artifacts {
         vm.stopBroadcast();
     }
 
-    /// @notice Deploy the ProxyAdmin
+    /// @notice Deploy ProxyAdmin.
     function deployProxyAdmin() public broadcast returns (address addr_) {
-        bytes32 salt = keccak256(bytes("ProxyAdmin"));
-        bytes32 initCodeHash = keccak256(abi.encodePacked(type(ProxyAdmin).creationCode, abi.encode(msg.sender)));
-        address preComputedAddress = computeCreate2Address(salt, initCodeHash);
-        if (preComputedAddress.code.length > 0) {
-            console.log("ProxyAdmin already deployed at %s", preComputedAddress);
-            save("ProxyAdmin", preComputedAddress);
-            addr_ = preComputedAddress;
-        } else {
-            ProxyAdmin admin = new ProxyAdmin{ salt: salt }({ _owner: msg.sender });
-            require(admin.owner() == msg.sender);
-
-            save("ProxyAdmin", address(admin));
-            console.log("ProxyAdmin deployed at %s", address(admin));
+        addr_ = _deployCreate2({
+            _name: "ProxyAdmin",
+            _creationCode: type(ProxyAdmin).creationCode,
+            _constructorParams: abi.encode(msg.sender)
+        });
 
-            addr_ = address(admin);
-        }
+        ProxyAdmin admin = ProxyAdmin(addr_);
+        require(admin.owner() == msg.sender);
     }
 
-    /// @notice Deploy the FaucetProxy
+    /// @notice Deploy FaucetProxy.
     function deployFaucetProxy() public broadcast returns (address addr_) {
-        bytes32 salt = keccak256(bytes("FaucetProxy"));
-        address proxyAdmin = mustGetAddress("ProxyAdmin");
-        bytes32 initCodeHash = keccak256(abi.encodePacked(type(Proxy).creationCode, abi.encode(proxyAdmin)));
-        address preComputedAddress = computeCreate2Address(salt, initCodeHash);
-        if (preComputedAddress.code.length > 0) {
-            console.log("FaucetProxy already deployed at %s", preComputedAddress);
-            save("FaucetProxy", preComputedAddress);
-            addr_ = preComputedAddress;
-        } else {
-            Proxy proxy = new Proxy{ salt: salt }({ _admin: proxyAdmin });
-            require(EIP1967Helper.getAdmin(address(proxy)) == proxyAdmin);
-
-            save("FaucetProxy", address(proxy));
-            console.log("FaucetProxy deployed at %s", address(proxy));
+        addr_ = _deployCreate2({
+            _name: "FaucetProxy",
+            _creationCode: type(Proxy).creationCode,
+            _constructorParams: abi.encode(mustGetAddress("ProxyAdmin"))
+        });
 
-            addr_ = address(proxy);
-        }
+        Proxy proxy = Proxy(payable(addr_));
+        require(EIP1967Helper.getAdmin(address(proxy)) == mustGetAddress("ProxyAdmin"));
     }
 
-    /// @notice Deploy the faucet contract.
+    /// @notice Deploy the Faucet contract.
     function deployFaucet() public broadcast returns (address addr_) {
-        bytes32 salt = keccak256(bytes("Faucet"));
-        bytes32 initCodeHash = keccak256(abi.encodePacked(type(Faucet).creationCode, abi.encode(cfg.faucetAdmin())));
-        address preComputedAddress = computeCreate2Address(salt, initCodeHash);
-        if (preComputedAddress.code.length > 0) {
-            console.log("Faucet already deployed at %s", preComputedAddress);
-            save("Faucet", preComputedAddress);
-            addr_ = preComputedAddress;
-        } else {
-            Faucet faucet = new Faucet{ salt: salt }(cfg.faucetAdmin());
-            require(faucet.ADMIN() == cfg.faucetAdmin());
+        addr_ = _deployCreate2({
+            _name: "Faucet",
+            _creationCode: type(Faucet).creationCode,
+            _constructorParams: abi.encode(cfg.faucetAdmin())
+        });
 
-            save("Faucet", address(faucet));
-            console.log("Faucet deployed at %s", address(faucet));
-
-            addr_ = address(faucet);
-        }
+        Faucet faucet = Faucet(payable(addr_));
+        require(faucet.ADMIN() == cfg.faucetAdmin());
     }
 
-    /// @notice Deploy drippie contract.
+    /// @notice Deploy the Drippie contract.
     function deployFaucetDrippie() public broadcast returns (address addr_) {
-        bytes32 salt = keccak256(bytes("FaucetDrippie"));
-        bytes32 initCodeHash =
-            keccak256(abi.encodePacked(type(Drippie).creationCode, abi.encode(cfg.faucetDrippieOwner())));
-        address preComputedAddress = computeCreate2Address(salt, initCodeHash);
-        if (preComputedAddress.code.length > 0) {
-            console.log("FaucetDrippie already deployed at %s", preComputedAddress);
-            save("FaucetDrippie", preComputedAddress);
-            addr_ = preComputedAddress;
-        } else {
-            Drippie drippie = new Drippie{ salt: salt }(cfg.faucetDrippieOwner());
+        addr_ = _deployCreate2({
+            _name: "FaucetDrippie",
+            _creationCode: type(Drippie).creationCode,
+            _constructorParams: abi.encode(cfg.faucetDrippieOwner())
+        });
 
-            save("FaucetDrippie", address(drippie));
-            console.log("FaucetDrippie deployed at %s", address(drippie));
+        Drippie drippie = Drippie(payable(addr_));
+        require(drippie.owner() == cfg.faucetDrippieOwner());
+    }
 
-            addr_ = address(drippie);
-        }
+    /// @notice Deploy On-Chain Authentication Module.
+    function deployOnChainAuthModule() public broadcast returns (address addr_) {
+        addr_ = _deployCreate2({
+            _name: "OnChainAuthModule",
+            _creationCode: type(AdminFaucetAuthModule).creationCode,
+            _constructorParams: abi.encode(cfg.faucetOnchainAuthModuleAdmin(), "OnChainAuthModule", "1")
+        });
+
+        AdminFaucetAuthModule module = AdminFaucetAuthModule(addr_);
+        require(module.ADMIN() == cfg.faucetOnchainAuthModuleAdmin());
     }
 
-    /// @notice Deploy CheckTrue contract.
-    function deployCheckTrue() public broadcast returns (address addr_) {
-        bytes32 salt = keccak256(bytes("CheckTrue"));
-        bytes32 initCodeHash = keccak256(abi.encodePacked(type(CheckTrue).creationCode));
-        address preComputedAddress = computeCreate2Address(salt, initCodeHash);
-        if (preComputedAddress.code.length > 0) {
-            console.log("CheckTrue already deployed at %s", preComputedAddress);
-            save("CheckTrue", preComputedAddress);
-            addr_ = preComputedAddress;
-        } else {
-            CheckTrue checkTrue = new CheckTrue{ salt: salt }();
+    /// @notice Deploy Off-Chain Authentication Module.
+    function deployOffChainAuthModule() public broadcast returns (address addr_) {
+        addr_ = _deployCreate2({
+            _name: "OffChainAuthModule",
+            _creationCode: type(AdminFaucetAuthModule).creationCode,
+            _constructorParams: abi.encode(cfg.faucetOffchainAuthModuleAdmin(), "OffChainAuthModule", "1")
+        });
 
-            save("CheckTrue", address(checkTrue));
-            console.log("CheckTrue deployed at %s", address(checkTrue));
+        AdminFaucetAuthModule module = AdminFaucetAuthModule(addr_);
+        require(module.ADMIN() == cfg.faucetOffchainAuthModuleAdmin());
+    }
 
-            addr_ = address(checkTrue);
-        }
+    /// @notice Deploy CheckTrue contract.
+    function deployCheckTrue() public broadcast returns (address addr_) {
+        addr_ = _deployCreate2({
+            _name: "CheckTrue",
+            _creationCode: type(CheckTrue).creationCode,
+            _constructorParams: hex""
+        });
     }
 
     /// @notice Deploy CheckBalanceLow contract.
     function deployCheckBalanceLow() public broadcast returns (address addr_) {
-        bytes32 salt = keccak256(bytes("CheckBalanceLow"));
-        bytes32 initCodeHash = keccak256(abi.encodePacked(type(CheckBalanceLow).creationCode));
-        address preComputedAddress = computeCreate2Address(salt, initCodeHash);
-        if (preComputedAddress.code.length > 0) {
-            console.log("CheckBalanceLow already deployed at %s", preComputedAddress);
-            save("CheckBalanceLow", preComputedAddress);
-            addr_ = preComputedAddress;
-        } else {
-            CheckBalanceLow checkBalanceLow = new CheckBalanceLow{ salt: salt }();
-
-            save("CheckBalanceLow", address(checkBalanceLow));
-            console.log("CheckBalanceLow deployed at %s", address(checkBalanceLow));
-
-            addr_ = address(checkBalanceLow);
-        }
+        addr_ = _deployCreate2({
+            _name: "CheckBalanceLow",
+            _creationCode: type(CheckBalanceLow).creationCode,
+            _constructorParams: hex""
+        });
     }
 
     /// @notice Deploy CheckGelatoLow contract.
     function deployCheckGelatoLow() public broadcast returns (address addr_) {
-        bytes32 salt = keccak256(bytes("CheckGelatoLow"));
-        bytes32 initCodeHash = keccak256(abi.encodePacked(type(CheckGelatoLow).creationCode));
-        address preComputedAddress = computeCreate2Address(salt, initCodeHash);
-        if (preComputedAddress.code.length > 0) {
-            console.log("CheckGelatoLow already deployed at %s", preComputedAddress);
-            save("CheckGelatoLow", preComputedAddress);
-            addr_ = preComputedAddress;
-        } else {
-            CheckGelatoLow checkGelatoLow = new CheckGelatoLow{ salt: salt }();
-
-            save("CheckGelatoLow", address(checkGelatoLow));
-            console.log("CheckGelatoLow deployed at %s", address(checkGelatoLow));
-
-            addr_ = address(checkGelatoLow);
-        }
+        addr_ = _deployCreate2({
+            _name: "CheckGelatoLow",
+            _creationCode: type(CheckGelatoLow).creationCode,
+            _constructorParams: hex""
+        });
     }
 
-    /// @notice Initialize the Faucet
+    /// @notice Initialize the Faucet.
     function initializeFaucet() public broadcast {
         ProxyAdmin proxyAdmin = ProxyAdmin(mustGetAddress("ProxyAdmin"));
         address faucetProxy = mustGetAddress("FaucetProxy");
@@ -236,20 +191,19 @@ contract DeployPeriphery is Script, Artifacts {
         require(Faucet(payable(faucetProxy)).ADMIN() == Faucet(payable(faucet)).ADMIN());
     }
 
-    /// @notice installs the drip configs in the faucet drippie contract.
+    /// @notice Installs the drip configs in the faucet drippie contract.
     function installFaucetDrippieConfigs() public {
         Drippie drippie = Drippie(mustGetAddress("FaucetDrippie"));
         console.log("Installing faucet drips at %s", address(drippie));
         installFaucetDripV1();
         installFaucetDripV2();
         installFaucetAdminDripV1();
-        installFaucetGelatoBalanceV1();
-
+        installFaucetGelatoBalanceV2();
         console.log("Faucet drip configs successfully installed");
     }
 
-    /// @notice installs drip configs that deposit funds to all OP Chain faucets. This function
-    /// should only be called on an L1 testnet.
+    /// @notice Installs drip configs that deposit funds to all OP Chain faucets. This function
+    ///         should only be called on an L1 testnet.
     function installOpChainFaucetsDrippieConfigs() public {
         uint256 drippieOwnerPrivateKey = Config.drippieOwnerPrivateKey();
         vm.startBroadcast(drippieOwnerPrivateKey);
@@ -260,234 +214,165 @@ contract DeployPeriphery is Script, Artifacts {
         installLargeOpChainFaucetsDrips();
         installSmallOpChainAdminWalletDrips();
         installLargeOpChainAdminWalletDrips();
-
-        vm.stopBroadcast();
-
         console.log("OP chain faucet drip configs successfully installed");
-    }
-
-    /// @notice archives the previous OP Chain drip configs.
-    function archivePreviousOpChainFaucetsDrippieConfigs() public {
-        uint256 drippieOwnerPrivateKey = Config.drippieOwnerPrivateKey();
-        vm.startBroadcast(drippieOwnerPrivateKey);
-
-        Drippie drippie = Drippie(mustGetAddress("FaucetDrippie"));
-        console.log("Archiving OP Chain faucet drips at %s", address(drippie));
-        archivePreviousSmallOpChainFaucetsDrips();
-        archivePreviousLargeOpChainFaucetsDrips();
 
         vm.stopBroadcast();
-
-        console.log("OP chain faucet drip configs successfully installed");
     }
 
-    /// @notice installs drips that send funds to small OP chain faucets on the scheduled interval.
+    /// @notice Installs drips that send funds to small OP chain faucets on the scheduled interval.
     function installSmallOpChainFaucetsDrips() public {
-        address faucetProxy = mustGetAddress("FaucetProxy");
-        uint256 arrayLength = cfg.getSmallFaucetsL1BridgeAddressesCount();
-        for (uint256 i = 0; i < arrayLength; i++) {
+        for (uint256 i = 0; i < cfg.getSmallFaucetsL1BridgeAddressesCount(); i++) {
             address l1BridgeAddress = cfg.smallFaucetsL1BridgeAddresses(i);
-            _installDepositEthToDrip(
-                faucetProxy,
-                l1BridgeAddress,
-                cfg.smallOpChainFaucetDripValue(),
-                cfg.smallOpChainFaucetDripInterval(),
-                _faucetDripName(l1BridgeAddress, cfg.dripVersion())
-            );
+            _installDepositEthToDrip({
+                _drippie: Drippie(mustGetAddress("FaucetDrippie")),
+                _name: _makeFaucetDripName(l1BridgeAddress, cfg.dripVersion()),
+                _bridge: l1BridgeAddress,
+                _target: mustGetAddress("FaucetProxy"),
+                _value: cfg.smallOpChainFaucetDripValue(),
+                _interval: cfg.smallOpChainFaucetDripInterval()
+            });
         }
     }
 
-    /// @notice installs drips that send funds to the admin wallets for small OP chain faucets
-    /// on the scheduled interval.
+    /// @notice Installs drips that send funds to large OP chain faucets on the scheduled interval.
+    function installLargeOpChainFaucetsDrips() public {
+        for (uint256 i = 0; i < cfg.getLargeFaucetsL1BridgeAddressesCount(); i++) {
+            address l1BridgeAddress = cfg.largeFaucetsL1BridgeAddresses(i);
+            _installDepositEthToDrip({
+                _drippie: Drippie(mustGetAddress("FaucetDrippie")),
+                _name: _makeFaucetDripName(l1BridgeAddress, cfg.dripVersion()),
+                _bridge: l1BridgeAddress,
+                _target: mustGetAddress("FaucetProxy"),
+                _value: cfg.largeOpChainFaucetDripValue(),
+                _interval: cfg.largeOpChainFaucetDripInterval()
+            });
+        }
+    }
+
+    /// @notice Installs drips that send funds to the admin wallets for small OP chain faucets
+    ///         on the scheduled interval.
     function installSmallOpChainAdminWalletDrips() public {
         require(
             cfg.faucetOnchainAuthModuleAdmin() == cfg.faucetOffchainAuthModuleAdmin(),
             "installSmallOpChainAdminWalletDrips: Only handles identical admin wallet addresses"
         );
-        address adminWallet = cfg.faucetOnchainAuthModuleAdmin();
-        uint256 arrayLength = cfg.getSmallFaucetsL1BridgeAddressesCount();
-        for (uint256 i = 0; i < arrayLength; i++) {
+
+        for (uint256 i = 0; i < cfg.getSmallFaucetsL1BridgeAddressesCount(); i++) {
             address l1BridgeAddress = cfg.smallFaucetsL1BridgeAddresses(i);
-            _installDepositEthToDrip(
-                adminWallet,
-                l1BridgeAddress,
-                cfg.opChainAdminWalletDripValue(),
-                cfg.opChainAdminWalletDripInterval(),
-                _adminWalletDripName(l1BridgeAddress, cfg.dripVersion())
-            );
+            _installDepositEthToDrip({
+                _drippie: Drippie(mustGetAddress("FaucetDrippie")),
+                _name: _makeAdminWalletDripName(l1BridgeAddress, cfg.dripVersion()),
+                _bridge: l1BridgeAddress,
+                _target: cfg.faucetOnchainAuthModuleAdmin(),
+                _value: cfg.opChainAdminWalletDripValue(),
+                _interval: cfg.opChainAdminWalletDripInterval()
+            });
         }
     }
 
-    /// @notice installs drips that send funds to the admin wallets for large OP chain faucets
-    /// on the scheduled interval.
+    /// @notice Installs drips that send funds to the admin wallets for large OP chain faucets
+    ///         on the scheduled interval.
     function installLargeOpChainAdminWalletDrips() public {
         require(
             cfg.faucetOnchainAuthModuleAdmin() == cfg.faucetOffchainAuthModuleAdmin(),
             "installLargeOpChainAdminWalletDrips: Only handles identical admin wallet addresses"
         );
-        address adminWallet = cfg.faucetOnchainAuthModuleAdmin();
-        uint256 arrayLength = cfg.getLargeFaucetsL1BridgeAddressesCount();
-        for (uint256 i = 0; i < arrayLength; i++) {
-            address l1BridgeAddress = cfg.largeFaucetsL1BridgeAddresses(i);
-            _installDepositEthToDrip(
-                adminWallet,
-                l1BridgeAddress,
-                cfg.opChainAdminWalletDripValue(),
-                cfg.opChainAdminWalletDripInterval(),
-                _adminWalletDripName(l1BridgeAddress, cfg.dripVersion())
-            );
-        }
-    }
 
-    /// @notice installs drips that send funds to large OP chain faucets on the scheduled interval.
-    function installLargeOpChainFaucetsDrips() public {
-        address faucetProxy = mustGetAddress("FaucetProxy");
-        uint256 arrayLength = cfg.getLargeFaucetsL1BridgeAddressesCount();
-        for (uint256 i = 0; i < arrayLength; i++) {
+        for (uint256 i = 0; i < cfg.getLargeFaucetsL1BridgeAddressesCount(); i++) {
             address l1BridgeAddress = cfg.largeFaucetsL1BridgeAddresses(i);
-            _installDepositEthToDrip(
-                faucetProxy,
-                l1BridgeAddress,
-                cfg.largeOpChainFaucetDripValue(),
-                cfg.largeOpChainFaucetDripInterval(),
-                _faucetDripName(l1BridgeAddress, cfg.dripVersion())
-            );
+            _installDepositEthToDrip({
+                _drippie: Drippie(mustGetAddress("FaucetDrippie")),
+                _name: _makeAdminWalletDripName(l1BridgeAddress, cfg.dripVersion()),
+                _bridge: l1BridgeAddress,
+                _target: cfg.faucetOnchainAuthModuleAdmin(),
+                _value: cfg.opChainAdminWalletDripValue(),
+                _interval: cfg.opChainAdminWalletDripInterval()
+            });
         }
     }
 
-    /// @notice installs the FaucetDripV1 drip on the faucet drippie contract.
+    /// @notice Installs the FaucetDripV1 drip on the faucet drippie contract.
     function installFaucetDripV1() public broadcast {
-        Drippie drippie = Drippie(mustGetAddress("FaucetDrippie"));
-        string memory dripName = "FaucetDripV1";
-        if (drippie.getDripStatus(dripName) == Drippie.DripStatus.NONE) {
-            console.log("installing %s", dripName);
-            Drippie.DripAction[] memory actions = new Drippie.DripAction[](1);
-            actions[0] =
-                Drippie.DripAction({ target: mustGetAddress("FaucetProxy"), data: "", value: cfg.faucetDripV1Value() });
-            drippie.create({
-                _name: dripName,
-                _config: Drippie.DripConfig({
-                    reentrant: false,
-                    interval: cfg.faucetDripV1Interval(),
-                    dripcheck: CheckBalanceLow(mustGetAddress("CheckBalanceLow")),
-                    checkparams: abi.encode(
-                        CheckBalanceLow.Params({ target: mustGetAddress("FaucetProxy"), threshold: cfg.faucetDripV1Threshold() })
-                        ),
-                    actions: actions
-                })
-            });
-            console.log("%s installed successfully", dripName);
-        } else {
-            console.log("%s already installed.", dripName);
-        }
-
-        _activateIfPausedDrip(drippie, dripName);
+        _installBalanceLowDrip({
+            _drippie: Drippie(mustGetAddress("FaucetDrippie")),
+            _name: "FaucetDripV1",
+            _target: mustGetAddress("FaucetProxy"),
+            _value: cfg.faucetDripV1Value(),
+            _interval: cfg.faucetDripV1Interval(),
+            _threshold: cfg.faucetDripV1Threshold()
+        });
     }
 
-    /// @notice installs the FaucetDripV2 drip on the faucet drippie contract.
+    /// @notice Installs the FaucetDripV2 drip on the faucet drippie contract.
     function installFaucetDripV2() public broadcast {
-        Drippie drippie = Drippie(mustGetAddress("FaucetDrippie"));
-        string memory dripName = "FaucetDripV2";
-        if (drippie.getDripStatus(dripName) == Drippie.DripStatus.NONE) {
-            console.log("installing %s", dripName);
-            Drippie.DripAction[] memory actions = new Drippie.DripAction[](1);
-            actions[0] =
-                Drippie.DripAction({ target: mustGetAddress("FaucetProxy"), data: "", value: cfg.faucetDripV2Value() });
-            drippie.create({
-                _name: dripName,
-                _config: Drippie.DripConfig({
-                    reentrant: false,
-                    interval: cfg.faucetDripV2Interval(),
-                    dripcheck: CheckBalanceLow(mustGetAddress("CheckBalanceLow")),
-                    checkparams: abi.encode(
-                        CheckBalanceLow.Params({ target: mustGetAddress("FaucetProxy"), threshold: cfg.faucetDripV2Threshold() })
-                        ),
-                    actions: actions
-                })
-            });
-            console.log("%s installed successfully", dripName);
-        } else {
-            console.log("%s already installed.", dripName);
-        }
-
-        _activateIfPausedDrip(drippie, dripName);
+        _installBalanceLowDrip({
+            _drippie: Drippie(mustGetAddress("FaucetDrippie")),
+            _name: "FaucetDripV2",
+            _target: mustGetAddress("FaucetProxy"),
+            _value: cfg.faucetDripV2Value(),
+            _interval: cfg.faucetDripV2Interval(),
+            _threshold: cfg.faucetDripV2Threshold()
+        });
     }
 
-    /// @notice installs the FaucetAdminDripV1 drip on the faucet drippie contract.
+    /// @notice Installs the FaucetAdminDripV1 drip on the faucet drippie contract.
     function installFaucetAdminDripV1() public broadcast {
-        Drippie drippie = Drippie(mustGetAddress("FaucetDrippie"));
-        string memory dripName = "FaucetAdminDripV1";
-        if (drippie.getDripStatus(dripName) == Drippie.DripStatus.NONE) {
-            console.log("installing %s", dripName);
-            Drippie.DripAction[] memory actions = new Drippie.DripAction[](1);
-            actions[0] = Drippie.DripAction({
-                target: mustGetAddress("FaucetProxy"),
-                data: "",
-                value: cfg.faucetAdminDripV1Value()
-            });
-            drippie.create({
-                _name: dripName,
-                _config: Drippie.DripConfig({
-                    reentrant: false,
-                    interval: cfg.faucetAdminDripV1Interval(),
-                    dripcheck: CheckBalanceLow(mustGetAddress("CheckBalanceLow")),
-                    checkparams: abi.encode(
-                        CheckBalanceLow.Params({
-                            target: mustGetAddress("FaucetProxy"),
-                            threshold: cfg.faucetAdminDripV1Threshold()
-                        })
-                        ),
-                    actions: actions
-                })
-            });
-            console.log("%s installed successfully", dripName);
-        } else {
-            console.log("%s already installed.", dripName);
-        }
-
-        _activateIfPausedDrip(drippie, dripName);
-    }
+        _installBalanceLowDrip({
+            _drippie: Drippie(mustGetAddress("FaucetDrippie")),
+            _name: "FaucetAdminDripV1",
+            _target: mustGetAddress("FaucetProxy"),
+            _value: cfg.faucetAdminDripV1Value(),
+            _interval: cfg.faucetAdminDripV1Interval(),
+            _threshold: cfg.faucetAdminDripV1Threshold()
+        });
+    }
+
+    /// @notice Installs the GelatoBalanceV2 drip on the faucet drippie contract.
+    function installFaucetGelatoBalanceV2() public broadcast {
+        Drippie.DripAction[] memory actions = new Drippie.DripAction[](1);
+        actions[0] = Drippie.DripAction({
+            target: payable(cfg.faucetGelatoTreasury()),
+            data: abi.encodeWithSignature(
+                "depositFunds(address,address,uint256)",
+                cfg.faucetGelatoRecipient(),
+                // Gelato represents ETH as 0xeeeee....eeeee
+                0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE,
+                cfg.faucetGelatoBalanceV1Value()
+            ),
+            value: cfg.faucetGelatoBalanceV1Value()
+        });
+        _installDrip({
+            _drippie: Drippie(mustGetAddress("FaucetDrippie")),
+            _name: "GelatoBalanceV2",
+            _config: Drippie.DripConfig({
+                reentrant: false,
+                interval: cfg.faucetGelatoBalanceV1DripInterval(),
+                dripcheck: CheckGelatoLow(mustGetAddress("CheckGelatoLow")),
+                checkparams: abi.encode(
+                    CheckGelatoLow.Params({
+                        recipient: cfg.faucetGelatoRecipient(),
+                        threshold: cfg.faucetGelatoThreshold(),
+                        treasury: cfg.faucetGelatoTreasury()
+                    })
+                ),
+                actions: actions
+            })
+        });
+    }
+
+    /// @notice Archives the previous OP Chain drip configs.
+    function archivePreviousOpChainFaucetsDrippieConfigs() public {
+        uint256 drippieOwnerPrivateKey = Config.drippieOwnerPrivateKey();
+        vm.startBroadcast(drippieOwnerPrivateKey);
 
-    /// @notice installs the GelatoBalanceV1 drip on the faucet drippie contract.
-    function installFaucetGelatoBalanceV1() public broadcast {
         Drippie drippie = Drippie(mustGetAddress("FaucetDrippie"));
-        string memory dripName = "GelatoBalanceV2";
-        if (drippie.getDripStatus(dripName) == Drippie.DripStatus.NONE) {
-            console.log("installing %s", dripName);
-            Drippie.DripAction[] memory actions = new Drippie.DripAction[](1);
-            actions[0] = Drippie.DripAction({
-                target: payable(cfg.faucetGelatoTreasury()),
-                data: abi.encodeWithSignature(
-                    "depositFunds(address,address,uint256)",
-                    cfg.faucetGelatoRecipient(),
-                    // Gelato represents ETH as 0xeeeee....eeeee
-                    0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE,
-                    cfg.faucetGelatoBalanceV1Value()
-                    ),
-                value: cfg.faucetGelatoBalanceV1Value()
-            });
-            drippie.create({
-                _name: dripName,
-                _config: Drippie.DripConfig({
-                    reentrant: false,
-                    interval: cfg.faucetGelatoBalanceV1DripInterval(),
-                    dripcheck: CheckGelatoLow(mustGetAddress("CheckGelatoLow")),
-                    checkparams: abi.encode(
-                        CheckGelatoLow.Params({
-                            recipient: cfg.faucetGelatoRecipient(),
-                            threshold: cfg.faucetGelatoThreshold(),
-                            treasury: cfg.faucetGelatoTreasury()
-                        })
-                        ),
-                    actions: actions
-                })
-            });
-            console.log("%s installed successfully", dripName);
-        } else {
-            console.log("%s already installed.", dripName);
-        }
+        console.log("Archiving OP Chain faucet drips at %s", address(drippie));
+        archivePreviousSmallOpChainFaucetsDrips();
+        archivePreviousLargeOpChainFaucetsDrips();
+
+        vm.stopBroadcast();
 
-        _activateIfPausedDrip(drippie, dripName);
+        console.log("OP chain faucet drip configs successfully installed");
     }
 
     function archivePreviousSmallOpChainFaucetsDrips() public {
@@ -495,10 +380,14 @@ contract DeployPeriphery is Script, Artifacts {
         uint256 arrayLength = cfg.getSmallFaucetsL1BridgeAddressesCount();
         for (uint256 i = 0; i < arrayLength; i++) {
             address l1BridgeAddress = cfg.smallFaucetsL1BridgeAddresses(i);
-            _pauseIfActivatedDrip(drippie, _faucetDripName(l1BridgeAddress, cfg.previousDripVersion()));
-            _pauseIfActivatedDrip(drippie, _adminWalletDripName(l1BridgeAddress, cfg.previousDripVersion()));
-            _archiveIfPausedDrip(drippie, _faucetDripName(l1BridgeAddress, cfg.previousDripVersion()));
-            _archiveIfPausedDrip(drippie, _adminWalletDripName(l1BridgeAddress, cfg.previousDripVersion()));
+            drippie.status(_makeFaucetDripName(l1BridgeAddress, cfg.previousDripVersion()), Drippie.DripStatus.PAUSED);
+            drippie.status(
+                _makeAdminWalletDripName(l1BridgeAddress, cfg.previousDripVersion()), Drippie.DripStatus.PAUSED
+            );
+            drippie.status(_makeFaucetDripName(l1BridgeAddress, cfg.previousDripVersion()), Drippie.DripStatus.ARCHIVED);
+            drippie.status(
+                _makeAdminWalletDripName(l1BridgeAddress, cfg.previousDripVersion()), Drippie.DripStatus.ARCHIVED
+            );
         }
     }
 
@@ -507,213 +396,197 @@ contract DeployPeriphery is Script, Artifacts {
         uint256 arrayLength = cfg.getLargeFaucetsL1BridgeAddressesCount();
         for (uint256 i = 0; i < arrayLength; i++) {
             address l1BridgeAddress = cfg.largeFaucetsL1BridgeAddresses(i);
-            _pauseIfActivatedDrip(drippie, _faucetDripName(l1BridgeAddress, cfg.previousDripVersion()));
-            _pauseIfActivatedDrip(drippie, _adminWalletDripName(l1BridgeAddress, cfg.previousDripVersion()));
-            _archiveIfPausedDrip(drippie, _faucetDripName(l1BridgeAddress, cfg.previousDripVersion()));
-            _archiveIfPausedDrip(drippie, _adminWalletDripName(l1BridgeAddress, cfg.previousDripVersion()));
-        }
-    }
-
-    function _activateIfPausedDrip(Drippie drippie, string memory dripName) internal {
-        require(
-            drippie.getDripStatus(dripName) == Drippie.DripStatus.ACTIVE
-                || drippie.getDripStatus(dripName) == Drippie.DripStatus.PAUSED,
-            "attempting to activate a drip that is not currently paused or activated"
-        );
-        if (drippie.getDripStatus(dripName) == Drippie.DripStatus.PAUSED) {
-            console.log("%s is paused, activating", dripName);
-            drippie.status(dripName, Drippie.DripStatus.ACTIVE);
-            console.log("%s activated", dripName);
-            require(drippie.getDripStatus(dripName) == Drippie.DripStatus.ACTIVE);
-        } else {
-            console.log("%s already activated", dripName);
-        }
-    }
-
-    function _pauseIfActivatedDrip(Drippie drippie, string memory dripName) internal {
-        require(
-            drippie.getDripStatus(dripName) == Drippie.DripStatus.ACTIVE
-                || drippie.getDripStatus(dripName) == Drippie.DripStatus.PAUSED,
-            "attempting to pause a drip that is not currently paused or activated"
-        );
-        if (drippie.getDripStatus(dripName) == Drippie.DripStatus.ACTIVE) {
-            console.log("%s is active, pausing", dripName);
-            drippie.status(dripName, Drippie.DripStatus.PAUSED);
-            console.log("%s paused", dripName);
-            require(drippie.getDripStatus(dripName) == Drippie.DripStatus.PAUSED);
-        } else {
-            console.log("%s already paused", dripName);
-        }
-    }
-
-    function _archiveIfPausedDrip(Drippie drippie, string memory dripName) internal {
-        require(
-            drippie.getDripStatus(dripName) == Drippie.DripStatus.PAUSED
-                || drippie.getDripStatus(dripName) == Drippie.DripStatus.ARCHIVED,
-            "attempting to archive a drip that is not currently paused or archived"
-        );
-        if (drippie.getDripStatus(dripName) == Drippie.DripStatus.PAUSED) {
-            console.log("%s is paused, archiving", dripName);
-            drippie.status(dripName, Drippie.DripStatus.ARCHIVED);
-            console.log("%s archived", dripName);
-            require(drippie.getDripStatus(dripName) == Drippie.DripStatus.ARCHIVED);
-        } else {
-            console.log("%s already archived", dripName);
-        }
-    }
-
-    /// @notice deploys the On-Chain Authentication Module
-    function deployOnChainAuthModule() public broadcast returns (address addr_) {
-        string memory moduleName = "OnChainAuthModule";
-        string memory version = "1";
-        bytes32 salt = keccak256(bytes("OnChainAuthModule"));
-        bytes32 initCodeHash = keccak256(
-            abi.encodePacked(
-                type(AdminFaucetAuthModule).creationCode,
-                abi.encode(cfg.faucetOnchainAuthModuleAdmin(), moduleName, version)
-            )
-        );
-        address preComputedAddress = computeCreate2Address(salt, initCodeHash);
-        if (preComputedAddress.code.length > 0) {
-            console.log("OnChainAuthModule already deployed at %s", preComputedAddress);
-            save("OnChainAuthModule", preComputedAddress);
-            addr_ = preComputedAddress;
-        } else {
-            AdminFaucetAuthModule onChainAuthModule =
-                new AdminFaucetAuthModule{ salt: salt }(cfg.faucetOnchainAuthModuleAdmin(), moduleName, version);
-            require(onChainAuthModule.ADMIN() == cfg.faucetOnchainAuthModuleAdmin());
-
-            save("OnChainAuthModule", address(onChainAuthModule));
-            console.log("OnChainAuthModule deployed at %s", address(onChainAuthModule));
-
-            addr_ = address(onChainAuthModule);
-        }
-    }
-
-    /// @notice deploys the Off-Chain Authentication Module
-    function deployOffChainAuthModule() public broadcast returns (address addr_) {
-        string memory moduleName = "OffChainAuthModule";
-        string memory version = "1";
-        bytes32 salt = keccak256(bytes("OffChainAuthModule"));
-        bytes32 initCodeHash = keccak256(
-            abi.encodePacked(
-                type(AdminFaucetAuthModule).creationCode,
-                abi.encode(cfg.faucetOffchainAuthModuleAdmin(), moduleName, version)
-            )
-        );
-        address preComputedAddress = computeCreate2Address(salt, initCodeHash);
-        if (preComputedAddress.code.length > 0) {
-            console.logBytes32(initCodeHash);
-            console.log("OffChainAuthModule already deployed at %s", preComputedAddress);
-            save("OffChainAuthModule", preComputedAddress);
-            addr_ = preComputedAddress;
-        } else {
-            AdminFaucetAuthModule offChainAuthModule =
-                new AdminFaucetAuthModule{ salt: salt }(cfg.faucetOffchainAuthModuleAdmin(), moduleName, version);
-            require(offChainAuthModule.ADMIN() == cfg.faucetOffchainAuthModuleAdmin());
-
-            save("OffChainAuthModule", address(offChainAuthModule));
-            console.log("OffChainAuthModule deployed at %s", address(offChainAuthModule));
-
-            addr_ = address(offChainAuthModule);
+            drippie.status(_makeFaucetDripName(l1BridgeAddress, cfg.previousDripVersion()), Drippie.DripStatus.PAUSED);
+            drippie.status(
+                _makeAdminWalletDripName(l1BridgeAddress, cfg.previousDripVersion()), Drippie.DripStatus.PAUSED
+            );
+            drippie.status(_makeFaucetDripName(l1BridgeAddress, cfg.previousDripVersion()), Drippie.DripStatus.ARCHIVED);
+            drippie.status(
+                _makeAdminWalletDripName(l1BridgeAddress, cfg.previousDripVersion()), Drippie.DripStatus.ARCHIVED
+            );
         }
     }
 
-    /// @notice installs the OnChain AuthModule on the Faucet contract.
+    /// @notice Installs the OnChain AuthModule on the Faucet contract.
     function installOnChainAuthModule() public broadcast {
-        string memory moduleName = "OnChainAuthModule";
-        Faucet faucet = Faucet(mustGetAddress("FaucetProxy"));
-        AdminFaucetAuthModule onChainAuthModule = AdminFaucetAuthModule(mustGetAddress(moduleName));
-        if (faucet.isModuleEnabled(onChainAuthModule)) {
-            console.log("%s already installed.", moduleName);
-        } else {
-            console.log("Installing %s", moduleName);
-            Faucet.ModuleConfig memory myModuleConfig = Faucet.ModuleConfig({
-                name: moduleName,
+        _installAuthModule({
+            _faucet: Faucet(mustGetAddress("FaucetProxy")),
+            _name: "OnChainAuthModule",
+            _config: Faucet.ModuleConfig({
+                name: "OnChainAuthModule",
                 enabled: true,
                 ttl: cfg.faucetOnchainAuthModuleTtl(),
                 amount: cfg.faucetOnchainAuthModuleAmount()
-            });
-            faucet.configure(onChainAuthModule, myModuleConfig);
-            console.log("%s installed successfully", moduleName);
-        }
+            })
+        });
     }
 
-    /// @notice installs the OffChain AuthModule on the Faucet contract.
+    /// @notice Installs the OffChain AuthModule on the Faucet contract.
     function installOffChainAuthModule() public broadcast {
-        string memory moduleName = "OffChainAuthModule";
-        Faucet faucet = Faucet(mustGetAddress("FaucetProxy"));
-        AdminFaucetAuthModule offChainAuthModule = AdminFaucetAuthModule(mustGetAddress(moduleName));
-        if (faucet.isModuleEnabled(offChainAuthModule)) {
-            console.log("%s already installed.", moduleName);
-        } else {
-            console.log("Installing %s", moduleName);
-            Faucet.ModuleConfig memory myModuleConfig = Faucet.ModuleConfig({
-                name: moduleName,
+        _installAuthModule({
+            _faucet: Faucet(mustGetAddress("FaucetProxy")),
+            _name: "OffChainAuthModule",
+            _config: Faucet.ModuleConfig({
+                name: "OffChainAuthModule",
                 enabled: true,
                 ttl: cfg.faucetOffchainAuthModuleTtl(),
                 amount: cfg.faucetOffchainAuthModuleAmount()
-            });
-            faucet.configure(offChainAuthModule, myModuleConfig);
-            console.log("%s installed successfully", moduleName);
-        }
+            })
+        });
     }
 
-    /// @notice installs all of the auth module in the faucet contract.
+    /// @notice Installs all of the auth modules in the faucet contract.
     function installFaucetAuthModulesConfigs() public {
         Faucet faucet = Faucet(mustGetAddress("FaucetProxy"));
         console.log("Installing auth modules at %s", address(faucet));
         installOnChainAuthModule();
         installOffChainAuthModule();
-
         console.log("Faucet Auth Module configs successfully installed");
     }
 
-    function _faucetDripName(address _l1Bridge, uint256 version) internal pure returns (string memory) {
+    /// @notice Generates a drip name for a chain/faucet drip.
+    /// @param _l1Bridge The address of the L1 bridge.
+    /// @param _version The version of the drip.
+    function _makeFaucetDripName(address _l1Bridge, uint256 _version) internal pure returns (string memory) {
         string memory dripNamePrefixWithBridgeAddress = string.concat("faucet-drip-", vm.toString(_l1Bridge));
-        string memory versionSuffix = string.concat("-", vm.toString(version));
+        string memory versionSuffix = string.concat("-", vm.toString(_version));
         return string.concat(dripNamePrefixWithBridgeAddress, versionSuffix);
     }
 
-    function _adminWalletDripName(address _l1Bridge, uint256 version) internal pure returns (string memory) {
+    /// @notice Generates a drip name for a chain/admin wallet drip.
+    /// @param _l1Bridge The address of the L1 bridge.
+    /// @param _version The version of the drip.
+    function _makeAdminWalletDripName(address _l1Bridge, uint256 _version) internal pure returns (string memory) {
         string memory dripNamePrefixWithBridgeAddress = string.concat("faucet-admin-drip-", vm.toString(_l1Bridge));
-        string memory versionSuffix = string.concat("-", vm.toString(version));
+        string memory versionSuffix = string.concat("-", vm.toString(_version));
         return string.concat(dripNamePrefixWithBridgeAddress, versionSuffix);
     }
 
-    function _installDepositEthToDrip(
-        address _depositTo,
-        address _l1Bridge,
-        uint256 _dripValue,
-        uint256 _dripInterval,
-        string memory dripName
+    // @notice Deploys a contract using the CREATE2 opcode.
+    // @param _name The name of the contract.
+    // @param _creationCode The contract creation code.
+    // @param _constructorParams The constructor parameters.
+    function _deployCreate2(
+        string memory _name,
+        bytes memory _creationCode,
+        bytes memory _constructorParams
     )
         internal
+        returns (address addr_)
     {
-        Drippie drippie = Drippie(mustGetAddress("FaucetDrippie"));
-        if (drippie.getDripStatus(dripName) == Drippie.DripStatus.NONE) {
-            console.log("installing %s", dripName);
-            Drippie.DripAction[] memory actions = new Drippie.DripAction[](1);
-            actions[0] = Drippie.DripAction({
-                target: payable(_l1Bridge),
-                data: abi.encodeWithSignature("depositETHTo(address,uint32,bytes)", _depositTo, 200000, ""),
-                value: _dripValue
-            });
-            drippie.create({
-                _name: dripName,
-                _config: Drippie.DripConfig({
-                    reentrant: false,
-                    interval: _dripInterval,
-                    dripcheck: CheckTrue(mustGetAddress("CheckTrue")),
-                    checkparams: abi.encode(""),
-                    actions: actions
-                })
-            });
-            console.log("%s installed successfully", dripName);
+        bytes32 salt = keccak256(bytes(_name));
+        bytes memory initCode = abi.encodePacked(_creationCode, _constructorParams);
+        address preComputedAddress = computeCreate2Address(salt, keccak256(initCode));
+        if (preComputedAddress.code.length > 0) {
+            console.log("%s already deployed at %s", _name, preComputedAddress);
+            save(_name, preComputedAddress);
+            addr_ = preComputedAddress;
+        } else {
+            assembly {
+                addr_ := create2(0, add(initCode, 0x20), mload(initCode), salt)
+            }
+            require(addr_ != address(0), "deployment failed");
+            save(_name, addr_);
+            console.log("%s deployed at %s", _name, addr_);
+        }
+    }
+
+    /// @notice Installs an auth module in the faucet.
+    /// @param _faucet The faucet contract.
+    /// @param _name The name of the auth module.
+    /// @param _config The configuration of the auth module.
+    function _installAuthModule(Faucet _faucet, string memory _name, Faucet.ModuleConfig memory _config) internal {
+        AdminFaucetAuthModule module = AdminFaucetAuthModule(mustGetAddress(_name));
+        if (_faucet.isModuleEnabled(module)) {
+            console.log("%s already installed.", _name);
+        } else {
+            console.log("Installing %s", _name);
+            _faucet.configure(module, _config);
+            console.log("%s installed successfully", _name);
+        }
+    }
+
+    /// @notice Installs a drip in the drippie contract.
+    /// @param _drippie The drippie contract.
+    /// @param _name The name of the drip.
+    /// @param _config The configuration of the drip.
+    function _installDrip(Drippie _drippie, string memory _name, Drippie.DripConfig memory _config) internal {
+        if (_drippie.getDripStatus(_name) == Drippie.DripStatus.NONE) {
+            console.log("installing %s", _name);
+            _drippie.create(_name, _config);
+            console.log("%s installed successfully", _name);
         } else {
-            console.log("%s already installed.", dripName);
+            console.log("%s already installed", _name);
         }
 
-        _activateIfPausedDrip(drippie, dripName);
+        // Attempt to activate the drip.
+        _drippie.status(_name, Drippie.DripStatus.ACTIVE);
+    }
+
+    /// @notice Installs a drip that sends ETH to an address if the balance is below a threshold.
+    /// @param _drippie The drippie contract.
+    /// @param _name The name of the drip.
+    /// @param _target The target address.
+    /// @param _value The amount of ETH to send.
+    /// @param _interval The interval that must elapse between drips.
+    /// @param _threshold The balance threshold.
+    function _installBalanceLowDrip(
+        Drippie _drippie,
+        string memory _name,
+        address payable _target,
+        uint256 _value,
+        uint256 _interval,
+        uint256 _threshold
+    )
+        internal
+    {
+        Drippie.DripAction[] memory actions = new Drippie.DripAction[](1);
+        actions[0] = Drippie.DripAction({ target: _target, data: "", value: _value });
+        _installDrip({
+            _drippie: _drippie,
+            _name: _name,
+            _config: Drippie.DripConfig({
+                reentrant: false,
+                interval: _interval,
+                dripcheck: CheckBalanceLow(mustGetAddress("CheckBalanceLow")),
+                checkparams: abi.encode(CheckBalanceLow.Params({ target: _target, threshold: _threshold })),
+                actions: actions
+            })
+        });
+    }
+
+    /// @notice Installs a drip that sends ETH through the L1StandardBridge on an interval.
+    /// @param _drippie The drippie contract.
+    /// @param _name The name of the drip.
+    /// @param _bridge The address of the bridge.
+    /// @param _target The target address.
+    /// @param _value The amount of ETH to send.
+    function _installDepositEthToDrip(
+        Drippie _drippie,
+        string memory _name,
+        address _bridge,
+        address _target,
+        uint256 _value,
+        uint256 _interval
+    )
+        internal
+    {
+        Drippie.DripAction[] memory actions = new Drippie.DripAction[](1);
+        actions[0] = Drippie.DripAction({
+            target: payable(_bridge),
+            data: abi.encodeCall(L1StandardBridge.depositETHTo, (_target, 200000, "")),
+            value: _value
+        });
+        _installDrip({
+            _drippie: _drippie,
+            _name: _name,
+            _config: Drippie.DripConfig({
+                reentrant: false,
+                interval: _interval,
+                dripcheck: CheckTrue(mustGetAddress("CheckTrue")),
+                checkparams: abi.encode(""),
+                actions: actions
+            })
+        });
     }
 }
diff --git a/packages/contracts-bedrock/scripts/Deployer.sol b/packages/contracts-bedrock/scripts/Deployer.sol
index 6ab4fa8c19a9..aac3f5ac8ec2 100644
--- a/packages/contracts-bedrock/scripts/Deployer.sol
+++ b/packages/contracts-bedrock/scripts/Deployer.sol
@@ -5,7 +5,8 @@ import { Script } from "forge-std/Script.sol";
 import { Artifacts } from "scripts/Artifacts.s.sol";
 import { Config } from "scripts/Config.sol";
 import { DeployConfig } from "scripts/DeployConfig.s.sol";
-import { USE_FAULT_PROOFS_SLOT } from "scripts/DeployConfig.s.sol";
+import { Executables } from "scripts/Executables.sol";
+import { console } from "forge-std/console.sol";
 
 /// @title Deployer
 /// @author tynes
@@ -18,23 +19,11 @@ abstract contract Deployer is Script, Artifacts {
     function setUp() public virtual override {
         Artifacts.setUp();
 
-        // Load the `useFaultProofs` slot value prior to etching the DeployConfig's bytecode and reading the deploy
-        // config file. If this slot has already been set, it will override the preference in the deploy config.
-        bytes32 useFaultProofsOverride = vm.load(address(cfg), USE_FAULT_PROOFS_SLOT);
+        console.log("Commit hash: %s", Executables.gitCommitHash());
 
         vm.etch(address(cfg), vm.getDeployedCode("DeployConfig.s.sol:DeployConfig"));
         vm.label(address(cfg), "DeployConfig");
         vm.allowCheatcodes(address(cfg));
         cfg.read(Config.deployConfigPath());
-
-        if (useFaultProofsOverride != 0) {
-            vm.store(address(cfg), USE_FAULT_PROOFS_SLOT, useFaultProofsOverride);
-        }
     }
-
-    /// @notice Returns the name of the deployment script. Children contracts
-    ///         must implement this to ensure that the deploy artifacts can be found.
-    ///         This should be the same as the name of the script and is used as the file
-    ///         name inside of the `broadcast` directory when looking up deployment artifacts.
-    function name() public pure virtual returns (string memory);
 }
diff --git a/packages/contracts-bedrock/scripts/Executables.sol b/packages/contracts-bedrock/scripts/Executables.sol
index 8eab92078b9b..bd0621b96f54 100644
--- a/packages/contracts-bedrock/scripts/Executables.sol
+++ b/packages/contracts-bedrock/scripts/Executables.sol
@@ -1,10 +1,14 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.0;
 
+import { Vm } from "forge-std/Vm.sol";
+
 /// @notice The executables used in ffi commands. These are set here
 ///         to have a single source of truth in case absolute paths
 ///         need to be used.
 library Executables {
+    /// @notice Foundry cheatcode VM.
+    Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
     string internal constant bash = "bash";
     string internal constant jq = "jq";
     string internal constant forge = "forge";
@@ -12,4 +16,14 @@ library Executables {
     string internal constant sed = "sed";
     string internal constant find = "find";
     string internal constant ls = "ls";
+    string internal constant git = "git";
+
+    /// @notice Returns the commit hash of HEAD.
+    function gitCommitHash() internal returns (string memory) {
+        string[] memory commands = new string[](3);
+        commands[0] = bash;
+        commands[1] = "-c";
+        commands[2] = "cast abi-encode 'f(string)' $(git rev-parse HEAD)";
+        return abi.decode(vm.ffi(commands), (string));
+    }
 }
diff --git a/packages/contracts-bedrock/scripts/FaultDisputeGameViz.s.sol b/packages/contracts-bedrock/scripts/FaultDisputeGameViz.s.sol
index d2c47e64b37d..ae370934f1e3 100644
--- a/packages/contracts-bedrock/scripts/FaultDisputeGameViz.s.sol
+++ b/packages/contracts-bedrock/scripts/FaultDisputeGameViz.s.sol
@@ -9,9 +9,8 @@ import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
 import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol";
 import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol";
 
-import "src/libraries/DisputeTypes.sol";
-import "src/libraries/DisputeErrors.sol";
-import { LibPosition } from "src/dispute/lib/LibPosition.sol";
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
 
 /**
  * @title FaultDisputeGameViz
@@ -25,13 +24,7 @@ contract FaultDisputeGameViz is Script, FaultDisputeGame_Init {
 
     function setUp() public override {
         super.setUp();
-        super.init({
-            rootClaim: ROOT_CLAIM,
-            absolutePrestate: ABSOLUTE_PRESTATE,
-            l2BlockNumber: 0x10,
-            genesisBlockNumber: 0,
-            genesisOutputRoot: Hash.wrap(bytes32(0))
-        });
+        super.init({ rootClaim: ROOT_CLAIM, absolutePrestate: ABSOLUTE_PRESTATE, l2BlockNumber: 0x10 });
     }
 
     /**
diff --git a/packages/contracts-bedrock/scripts/ForgeArtifacts.sol b/packages/contracts-bedrock/scripts/ForgeArtifacts.sol
index c95254c8e044..19ef08cdf0df 100644
--- a/packages/contracts-bedrock/scripts/ForgeArtifacts.sol
+++ b/packages/contracts-bedrock/scripts/ForgeArtifacts.sol
@@ -16,6 +16,16 @@ struct StorageSlot {
     string _type;
 }
 
+struct AbiEntry {
+    string fnName;
+    bytes4 sel;
+}
+
+struct Abi {
+    string contractName;
+    AbiEntry[] entries;
+}
+
 /// @title ForgeArtifacts
 /// @notice Library for interacting with the forge artifacts.
 library ForgeArtifacts {
@@ -133,13 +143,68 @@ library ForgeArtifacts {
         slot_ = abi.decode(rawSlot, (StorageSlot));
     }
 
+    /// @notice Returns whether or not a contract is initialized.
+    ///         Needs the name to get the storage layout.
+    function isInitialized(string memory _name, address _address) internal returns (bool initialized_) {
+        StorageSlot memory slot = ForgeArtifacts.getInitializedSlot(_name);
+        bytes32 slotVal = vm.load(_address, bytes32(vm.parseUint(slot.slot)));
+        initialized_ = uint8((uint256(slotVal) >> (slot.offset * 8)) & 0xFF) != 0;
+    }
+
+    /// @notice Returns the function ABIs of all L1 contracts.
+    function getContractFunctionAbis(
+        string memory path,
+        string[] memory pathExcludes
+    )
+        internal
+        returns (Abi[] memory abis_)
+    {
+        string memory pathExcludesPat;
+        for (uint256 i = 0; i < pathExcludes.length; i++) {
+            pathExcludesPat = string.concat(pathExcludesPat, " -path ", pathExcludes[i]);
+            if (i != pathExcludes.length - 1) {
+                pathExcludesPat = string.concat(pathExcludesPat, " -o ");
+            }
+        }
+
+        string[] memory command = new string[](3);
+        command[0] = Executables.bash;
+        command[1] = "-c";
+        command[2] = string.concat(
+            Executables.find,
+            " ",
+            path,
+            bytes(pathExcludesPat).length > 0 ? string.concat(" ! \\( ", pathExcludesPat, " \\)") : "",
+            " -type f ",
+            "-exec basename {} \\;",
+            " | ",
+            Executables.sed,
+            " 's/\\.[^.]*$//'",
+            " | ",
+            Executables.jq,
+            " -R -s 'split(\"\n\")[:-1]'"
+        );
+        string[] memory contractNames = abi.decode(vm.parseJson(string(vm.ffi(command))), (string[]));
+
+        abis_ = new Abi[](contractNames.length);
+
+        for (uint256 i; i < contractNames.length; i++) {
+            string memory contractName = contractNames[i];
+            string[] memory methodIdentifiers = getMethodIdentifiers(contractName);
+            abis_[i].contractName = contractName;
+            abis_[i].entries = new AbiEntry[](methodIdentifiers.length);
+            for (uint256 j; j < methodIdentifiers.length; j++) {
+                string memory fnName = methodIdentifiers[j];
+                bytes4 sel = bytes4(keccak256(abi.encodePacked(fnName)));
+                abis_[i].entries[j] = AbiEntry({ fnName: fnName, sel: sel });
+            }
+        }
+    }
+
     /// @notice Accepts a filepath and then ensures that the directory
     ///         exists for the file to live in.
     function ensurePath(string memory _path) internal {
-        (, bytes memory returndata) =
-            address(vm).call(abi.encodeWithSignature("split(string,string)", _path, string("/")));
-        string[] memory outputs = abi.decode(returndata, (string[]));
-
+        string[] memory outputs = vm.split(_path, "/");
         string memory path = "";
         for (uint256 i = 0; i < outputs.length - 1; i++) {
             path = string.concat(path, outputs[i], "/");
diff --git a/packages/contracts-bedrock/scripts/L2Genesis.s.sol b/packages/contracts-bedrock/scripts/L2Genesis.s.sol
index 5f5f8a198bb9..881638fd45a7 100644
--- a/packages/contracts-bedrock/scripts/L2Genesis.s.sol
+++ b/packages/contracts-bedrock/scripts/L2Genesis.s.sol
@@ -3,299 +3,419 @@ pragma solidity 0.8.15;
 
 import { Script } from "forge-std/Script.sol";
 import { console2 as console } from "forge-std/console2.sol";
+import { Deployer } from "scripts/Deployer.sol";
 
+import { Config } from "scripts/Config.sol";
 import { Artifacts } from "scripts/Artifacts.s.sol";
 import { DeployConfig } from "scripts/DeployConfig.s.sol";
 import { Predeploys } from "src/libraries/Predeploys.sol";
-import { L1StandardBridge } from "src/L1/L1StandardBridge.sol";
-import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
-import { L2StandardBridge } from "src/L2/L2StandardBridge.sol";
+import { Preinstalls } from "src/libraries/Preinstalls.sol";
 import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol";
+import { L1Block } from "src/L2/L1Block.sol";
+import { GasPriceOracle } from "src/L2/GasPriceOracle.sol";
+import { L2StandardBridge } from "src/L2/L2StandardBridge.sol";
+import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol";
 import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol";
-import { FeeVault } from "src/universal/FeeVault.sol";
 import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol";
-import { L1Block } from "src/L2/L1Block.sol";
+import { OptimismMintableERC721Factory } from "src/universal/OptimismMintableERC721Factory.sol";
+import { BaseFeeVault } from "src/L2/BaseFeeVault.sol";
+import { L1FeeVault } from "src/L2/L1FeeVault.sol";
 import { GovernanceToken } from "src/governance/GovernanceToken.sol";
+import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
+import { L1StandardBridge } from "src/L1/L1StandardBridge.sol";
+import { FeeVault } from "src/universal/FeeVault.sol";
 import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
 
 interface IInitializable {
     function initialize(address _addr) external;
 }
 
-/// @dev The general flow of adding a predeploy is:
-///      1. _setPredeployProxies uses vm.etch to set the Proxy.sol deployed bytecode for proxy address `0x420...000` to
-/// `0x420...000 + PROXY_COUNT - 1`.
-///      Additionally, the PROXY_ADMIN_ADDRESS and PROXY_IMPLEMENTATION_ADDRESS storage slots are set for the proxy
-///      address.
-///      2. `vm.etch` sets the deployed bytecode for each predeploy at the implementation address (i.e. `0xc0d3`
-/// namespace).
-///      3. The `initialize` method is called at the implementation address with zero/dummy vaules if the method exists.
-///      4. The `initialize` method is called at the proxy address with actual vaules if the method exists.
-///      5. A `require` check to verify the expected implementation address is set for the proxy.
-/// @notice The following safety invariants are used when setting state:
+struct L1Dependencies {
+    address payable l1CrossDomainMessengerProxy;
+    address payable l1StandardBridgeProxy;
+    address payable l1ERC721BridgeProxy;
+}
+
+/// @notice Enum representing different ways of outputting genesis allocs.
+/// @custom:value DEFAULT_LATEST Represents only latest L2 allocs, written to output path.
+/// @custom:value LOCAL_LATEST   Represents latest L2 allocs, not output anywhere, but kept in-process.
+/// @custom:value LOCAL_ECOTONE  Represents Ecotone-upgrade L2 allocs, not output anywhere, but kept in-process.
+/// @custom:value LOCAL_DELTA    Represents Delta-upgrade L2 allocs, not output anywhere, but kept in-process.
+/// @custom:value OUTPUT_ALL     Represents creation of one L2 allocs file for every upgrade.
+enum OutputMode {
+    DEFAULT_LATEST,
+    LOCAL_LATEST,
+    LOCAL_ECOTONE,
+    LOCAL_DELTA,
+    OUTPUT_ALL
+}
+
+/// @title L2Genesis
+/// @notice Generates the genesis state for the L2 network.
+///         The following safety invariants are used when setting state:
 ///         1. `vm.getDeployedBytecode` can only be used with `vm.etch` when there are no side
 ///         effects in the constructor and no immutables in the bytecode.
 ///         2. A contract must be deployed using the `new` syntax if there are immutables in the code.
 ///         Any other side effects from the init code besides setting the immutables must be cleaned up afterwards.
-///         3. A contract is deployed using the `new` syntax, however it's not proxied and is still expected to exist at
-/// a
-///         specific implementation address (i.e. `0xc0d3` namespace). In this case we deploy an instance of the
-/// contract
-///         using `new` syntax, use `contract.code` to retrieve it's deployed bytecode, `vm.etch` the bytecode at the
-///         expected implementation address, and `vm.store` to set any storage slots that are
-///         expected to be set after a new deployment. Lastly, we reset the account code and storage slots the contract
-///         was initially deployed to so it's not included in the `vm.dumpState`.
-contract L2Genesis is Script, Artifacts {
-    uint256 constant PROXY_COUNT = 2048;
-    uint256 constant PRECOMPILE_COUNT = 256;
-    DeployConfig public constant cfg =
-        DeployConfig(address(uint160(uint256(keccak256(abi.encode("optimism.deployconfig"))))));
-
-    /// @notice The storage slot that holds the address of a proxy implementation.
-    /// @dev `bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)`
-    bytes32 internal constant PROXY_IMPLEMENTATION_ADDRESS =
-        0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
-
-    /// @notice The storage slot that holds the address of the owner.
-    /// @dev `bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)`
-    bytes32 internal constant PROXY_ADMIN_ADDRESS = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
+contract L2Genesis is Deployer {
+    uint256 public constant PRECOMPILE_COUNT = 256;
+
     uint80 internal constant DEV_ACCOUNT_FUND_AMT = 10_000 ether;
+
     /// @notice Default Anvil dev accounts. Only funded if `cfg.fundDevAccounts == true`.
-    address[10] internal devAccounts = [
-        0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266,
-        0x70997970C51812dc3A010C7d01b50e0d17dc79C8,
-        0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC,
-        0x90F79bf6EB2c4f870365E785982E1f101E93b906,
-        0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65,
-        0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc,
-        0x976EA74026E726554dB657fA54763abd0C3a0aa9,
-        0x14dC79964da2C08b23698B3D3cc7Ca32193d9955,
-        0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f,
-        0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
+    /// Also known as "test test test test test test test test test test test junk" mnemonic accounts,
+    /// on path "m/44'/60'/0'/0/i" (where i is the account index).
+    address[30] internal devAccounts = [
+        0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266, // 0
+        0x70997970C51812dc3A010C7d01b50e0d17dc79C8, // 1
+        0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC, // 2
+        0x90F79bf6EB2c4f870365E785982E1f101E93b906, // 3
+        0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65, // 4
+        0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc, // 5
+        0x976EA74026E726554dB657fA54763abd0C3a0aa9, // 6
+        0x14dC79964da2C08b23698B3D3cc7Ca32193d9955, // 7
+        0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f, // 8
+        0xa0Ee7A142d267C1f36714E4a8F75612F20a79720, // 9
+        0xBcd4042DE499D14e55001CcbB24a551F3b954096, // 10
+        0x71bE63f3384f5fb98995898A86B02Fb2426c5788, // 11
+        0xFABB0ac9d68B0B445fB7357272Ff202C5651694a, // 12
+        0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec, // 13
+        0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097, // 14
+        0xcd3B766CCDd6AE721141F452C550Ca635964ce71, // 15
+        0x2546BcD3c84621e976D8185a91A922aE77ECEc30, // 16
+        0xbDA5747bFD65F08deb54cb465eB87D40e51B197E, // 17
+        0xdD2FD4581271e230360230F9337D5c0430Bf44C0, // 18
+        0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199, // 19
+        0x09DB0a93B389bEF724429898f539AEB7ac2Dd55f, // 20
+        0x02484cb50AAC86Eae85610D6f4Bf026f30f6627D, // 21
+        0x08135Da0A343E492FA2d4282F2AE34c6c5CC1BbE, // 22
+        0x5E661B79FE2D3F6cE70F5AAC07d8Cd9abb2743F1, // 23
+        0x61097BA76cD906d2ba4FD106E757f7Eb455fc295, // 24
+        0xDf37F81dAAD2b0327A0A50003740e1C935C70913, // 25
+        0x553BC17A05702530097c3677091C5BB47a3a7931, // 26
+        0x87BdCE72c06C21cd96219BD8521bDF1F42C78b5e, // 27
+        0x40Fc963A729c542424cD800349a7E4Ecc4896624, // 28
+        0x9DCCe783B6464611f38631e6C851bf441907c710 // 29
     ];
 
-    string internal outfile;
+    /// @notice The address of the deployer account.
+    address internal deployer;
 
-    /// @dev Reads the deploy config, sets `outfile` which is where the `vm.dumpState` will be saved to, and
-    ///      loads in the addresses for the L1 contract deployments.
+    /// @notice Sets up the script and ensures the deployer account is used to make calls.
     function setUp() public override {
-        Artifacts.setUp();
-
-        string memory path = string.concat(vm.projectRoot(), "/deploy-config/", deploymentContext, ".json");
-        vm.etch(address(cfg), vm.getDeployedCode("DeployConfig.s.sol:DeployConfig"));
-        vm.label(address(cfg), "DeployConfig");
-        vm.allowCheatcodes(address(cfg));
-        cfg.read(path);
-
-        outfile = string.concat(vm.projectRoot(), "/deployments/", deploymentContext, "/genesis-l2.json");
+        deployer = makeAddr("deployer");
+        super.setUp();
+    }
 
-        _loadAddresses(string.concat(vm.projectRoot(), "/deployments/", deploymentContext, "/.deploy"));
+    function artifactDependencies() internal view returns (L1Dependencies memory l1Dependencies_) {
+        return L1Dependencies({
+            l1CrossDomainMessengerProxy: mustGetAddress("L1CrossDomainMessengerProxy"),
+            l1StandardBridgeProxy: mustGetAddress("L1StandardBridgeProxy"),
+            l1ERC721BridgeProxy: mustGetAddress("L1ERC721BridgeProxy")
+        });
     }
 
-    /// @dev Sets the precompiles, proxies, and the implementation accounts to be `vm.dumpState`
-    ///      to generate a L2 genesis alloc.
     /// @notice The alloc object is sorted numerically by address.
+    ///         Sets the precompiles, proxies, and the implementation accounts to be `vm.dumpState`
+    ///         to generate a L2 genesis alloc.
+    function runWithStateDump() public {
+        runWithOptions(OutputMode.DEFAULT_LATEST, artifactDependencies());
+    }
+
+    /// @notice Alias for `runWithStateDump` so that no `--sig` needs to be specified.
     function run() public {
-        _dealEthToPrecompiles();
-        _setPredeployProxies();
-        _setPredeployImplementations();
+        runWithStateDump();
+    }
 
+    /// @notice This is used by op-e2e to have a version of the L2 allocs for each upgrade.
+    function runWithAllUpgrades() public {
+        runWithOptions(OutputMode.OUTPUT_ALL, artifactDependencies());
+    }
+
+    /// @notice Build the L2 genesis.
+    function runWithOptions(OutputMode _mode, L1Dependencies memory _l1Dependencies) public {
+        vm.startPrank(deployer);
+        vm.chainId(cfg.l2ChainID());
+
+        dealEthToPrecompiles();
+        setPredeployProxies();
+        setPredeployImplementations(_l1Dependencies);
+        setPreinstalls();
         if (cfg.fundDevAccounts()) {
-            _fundDevAccounts();
+            fundDevAccounts();
         }
+        vm.stopPrank();
 
-        /// Reset so its not included state dump
-        vm.etch(address(cfg), "");
+        // Genesis is "complete" at this point, but some hardfork activation steps remain.
+        // Depending on the "Output Mode" we perform the activations and output the necessary state dumps.
+        if (_mode == OutputMode.LOCAL_DELTA) {
+            return;
+        }
+        if (_mode == OutputMode.OUTPUT_ALL) {
+            writeGenesisAllocs(Config.stateDumpPath("-delta"));
+        }
 
-        vm.dumpState(outfile);
-        _sortJsonByKeys(outfile);
+        activateEcotone();
+
+        if (_mode == OutputMode.LOCAL_ECOTONE) {
+            return;
+        }
+        if (_mode == OutputMode.OUTPUT_ALL) {
+            writeGenesisAllocs(Config.stateDumpPath("-ecotone"));
+        }
+
+        activateFjord();
+
+        if (_mode == OutputMode.OUTPUT_ALL || _mode == OutputMode.DEFAULT_LATEST) {
+            writeGenesisAllocs(Config.stateDumpPath(""));
+        }
     }
 
-    /// @notice Give all of the precompiles 1 wei so that they are
-    ///         not considered empty accounts.
-    function _dealEthToPrecompiles() internal {
+    /// @notice Give all of the precompiles 1 wei
+    function dealEthToPrecompiles() internal {
+        console.log("Setting precompile 1 wei balances");
         for (uint256 i; i < PRECOMPILE_COUNT; i++) {
             vm.deal(address(uint160(i)), 1);
         }
     }
 
-    /// @dev Set up the accounts that correspond to the predeploys.
-    ///      The Proxy bytecode should be set. All proxied predeploys should have
-    ///      the 1967 admin slot set to the ProxyAdmin predeploy. All defined predeploys
-    ///      should have their implementations set.
-    function _setPredeployProxies() internal {
+    /// @notice Set up the accounts that correspond to the predeploys.
+    ///         The Proxy bytecode should be set. All proxied predeploys should have
+    ///         the 1967 admin slot set to the ProxyAdmin predeploy. All defined predeploys
+    ///         should have their implementations set.
+    ///         Warning: the predeploy accounts have contract code, but 0 nonce value.
+    function setPredeployProxies() public {
+        console.log("Setting Predeploy proxies");
         bytes memory code = vm.getDeployedCode("Proxy.sol:Proxy");
         uint160 prefix = uint160(0x420) << 148;
 
         console.log(
             "Setting proxy deployed bytecode for addresses in range %s through %s",
             address(prefix | uint160(0)),
-            address(prefix | uint160(PROXY_COUNT - 1))
+            address(prefix | uint160(Predeploys.PREDEPLOY_COUNT - 1))
         );
-        for (uint256 i = 0; i < PROXY_COUNT; i++) {
+        for (uint256 i = 0; i < Predeploys.PREDEPLOY_COUNT; i++) {
             address addr = address(prefix | uint160(i));
-            if (_notProxied(addr)) {
+            if (Predeploys.notProxied(addr)) {
+                console.log("Skipping proxy at %s", addr);
                 continue;
             }
 
             vm.etch(addr, code);
-            vm.store(addr, PROXY_ADMIN_ADDRESS, bytes32(uint256(uint160(Predeploys.PROXY_ADMIN))));
+            EIP1967Helper.setAdmin(addr, Predeploys.PROXY_ADMIN);
 
-            if (_isDefinedPredeploy(addr)) {
-                address implementation = _predeployToCodeNamespace(addr);
+            if (Predeploys.isSupportedPredeploy(addr, cfg.useInterop())) {
+                address implementation = Predeploys.predeployToCodeNamespace(addr);
                 console.log("Setting proxy %s implementation: %s", addr, implementation);
-                vm.store(addr, PROXY_IMPLEMENTATION_ADDRESS, bytes32(uint256(uint160(implementation))));
+                EIP1967Helper.setImplementation(addr, implementation);
             }
         }
     }
 
-    /// @notice LEGACY_ERC20_ETH is not being predeployed since it's been deprecated.
-    /// @dev Sets all the implementations for the predeploy proxies. For contracts without proxies,
+    /// @notice Sets all the implementations for the predeploy proxies. For contracts without proxies,
     ///      sets the deployed bytecode at their expected predeploy address.
-    function _setPredeployImplementations() internal {
-        _setLegacyMessagePasser();
-        _setDeployerWhitelist();
-        _setWETH9();
-        _setL2StandardBridge();
-        _setL2CrossDomainMessenger();
-        _setSequencerFeeVault();
-        _setOptimismMintableERC20Factory();
-        _setL1BlockNumber();
-        _setGasPriceOracle();
-        _setGovernanceToken();
-        _setL1Block();
-    }
-
-    /// @notice This predeploy is following the saftey invariant #1.
-    function _setLegacyMessagePasser() internal {
-        _setImplementationCode(Predeploys.LEGACY_MESSAGE_PASSER, "LegacyMessagePasser");
-    }
-
-    /// @notice This predeploy is following the saftey invariant #1.
-    function _setDeployerWhitelist() internal {
-        _setImplementationCode(Predeploys.DEPLOYER_WHITELIST, "DeployerWhitelist");
-    }
-
-    /// @notice This predeploy is following the saftey invariant #1.
-    ///         Contract metadata hash appended to deployed bytecode will differ
-    ///         from previous L2 genesis output.
-    ///         This contract is NOT proxied.
-    /// @dev We're manually setting storage slots because we need to deployment to be at
-    ///      the address `Predeploys.WETH9`, so we can't just deploy a new instance of `WETH9`.
-    function _setWETH9() internal {
-        console.log("Setting %s implementation at: %s", "WETH9", Predeploys.WETH9);
-        vm.etch(Predeploys.WETH9, vm.getDeployedCode("WETH9.sol:WETH9"));
-
-        vm.store(
-            Predeploys.WETH9,
-            /// string public name
-            hex"0000000000000000000000000000000000000000000000000000000000000000",
-            /// "Wrapped Ether"
-            hex"577261707065642045746865720000000000000000000000000000000000001a"
-        );
-        vm.store(
-            Predeploys.WETH9,
-            /// string public symbol
-            hex"0000000000000000000000000000000000000000000000000000000000000001",
-            /// "WETH"
-            hex"5745544800000000000000000000000000000000000000000000000000000008"
-        );
-        vm.store(
-            Predeploys.WETH9,
-            // uint8 public decimals
-            hex"0000000000000000000000000000000000000000000000000000000000000002",
-            /// 18
-            hex"0000000000000000000000000000000000000000000000000000000000000012"
-        );
+    ///      LEGACY_ERC20_ETH and L1_MESSAGE_SENDER are deprecated and are not set.
+    function setPredeployImplementations(L1Dependencies memory _l1Dependencies) internal {
+        console.log("Setting predeploy implementations with L1 contract dependencies:");
+        console.log("- L1CrossDomainMessengerProxy: %s", _l1Dependencies.l1CrossDomainMessengerProxy);
+        console.log("- L1StandardBridgeProxy: %s", _l1Dependencies.l1StandardBridgeProxy);
+        console.log("- L1ERC721BridgeProxy: %s", _l1Dependencies.l1ERC721BridgeProxy);
+        setLegacyMessagePasser(); // 0
+        // 01: legacy, not used in OP-Stack
+        setDeployerWhitelist(); // 2
+        // 3,4,5: legacy, not used in OP-Stack.
+        setWETH(); // 6: WETH (not behind a proxy)
+        setL2CrossDomainMessenger(_l1Dependencies.l1CrossDomainMessengerProxy); // 7
+        // 8,9,A,B,C,D,E: legacy, not used in OP-Stack.
+        setGasPriceOracle(); // f
+        setL2StandardBridge(_l1Dependencies.l1StandardBridgeProxy); // 10
+        setSequencerFeeVault(); // 11
+        setOptimismMintableERC20Factory(); // 12
+        setL1BlockNumber(); // 13
+        setL2ERC721Bridge(_l1Dependencies.l1ERC721BridgeProxy); // 14
+        setL1Block(); // 15
+        setL2ToL1MessagePasser(); // 16
+        setOptimismMintableERC721Factory(); // 17
+        setProxyAdmin(); // 18
+        setBaseFeeVault(); // 19
+        setL1FeeVault(); // 1A
+        // 1B,1C,1D,1E,1F: not used.
+        setSchemaRegistry(); // 20
+        setEAS(); // 21
+        setGovernanceToken(); // 42: OP (not behind a proxy)
+        if (cfg.useInterop()) {
+            setCrossL2Inbox(); // 22
+            setL2ToL2CrossDomainMessenger(); // 23
+        }
     }
 
-    /// @notice This predeploy is following the saftey invariant #1.
-    ///         We're initializing the implementation with `address(0)` so
-    ///         it's not left uninitialized. After `initialize` is called on the
-    ///         proxy to set the storage slot with the expected value.
-    function _setL2StandardBridge() internal {
-        address impl = _setImplementationCode(Predeploys.L2_STANDARD_BRIDGE, "L2StandardBridge");
+    function setProxyAdmin() public {
+        // Note the ProxyAdmin implementation itself is behind a proxy that owns itself.
+        address impl = _setImplementationCode(Predeploys.PROXY_ADMIN);
 
-        L2StandardBridge(payable(impl)).initialize(L1StandardBridge(payable(address(0))));
+        bytes32 _ownerSlot = bytes32(0);
 
-        L2StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)).initialize(
-            L1StandardBridge(mustGetAddress("L1StandardBridgeProxy"))
-        );
+        // there is no initialize() function, so we just set the storage manually.
+        vm.store(Predeploys.PROXY_ADMIN, _ownerSlot, bytes32(uint256(uint160(cfg.proxyAdminOwner()))));
+        // update the proxy to not be uninitialized (although not standard initialize pattern)
+        vm.store(impl, _ownerSlot, bytes32(uint256(uint160(cfg.proxyAdminOwner()))));
+    }
 
-        _checkL2StandardBridge(impl);
+    function setL2ToL1MessagePasser() public {
+        _setImplementationCode(Predeploys.L2_TO_L1_MESSAGE_PASSER);
     }
 
-    /// @notice This predeploy is following the saftey invariant #1.
-    ///         We're initializing the implementation with `address(0)` so
-    ///         it's not left uninitialized. After `initialize` is called on the
-    ///         proxy to set the storage slot with the expected value.
-    function _setL2CrossDomainMessenger() internal {
-        address impl = _setImplementationCode(Predeploys.L2_CROSS_DOMAIN_MESSENGER, "L2CrossDomainMessenger");
+    /// @notice This predeploy is following the safety invariant #1.
+    function setL2CrossDomainMessenger(address payable _l1CrossDomainMessengerProxy) public {
+        address impl = _setImplementationCode(Predeploys.L2_CROSS_DOMAIN_MESSENGER);
 
-        L2CrossDomainMessenger(impl).initialize(L1CrossDomainMessenger(address(0)));
+        L2CrossDomainMessenger(impl).initialize({ _l1CrossDomainMessenger: L1CrossDomainMessenger(address(0)) });
 
-        L2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER).initialize(
-            L1CrossDomainMessenger(mustGetAddress("L1CrossDomainMessengerProxy"))
-        );
+        L2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER).initialize({
+            _l1CrossDomainMessenger: L1CrossDomainMessenger(_l1CrossDomainMessengerProxy)
+        });
+    }
+
+    /// @notice This predeploy is following the safety invariant #1.
+    function setL2StandardBridge(address payable _l1StandardBridgeProxy) public {
+        address impl = _setImplementationCode(Predeploys.L2_STANDARD_BRIDGE);
+
+        L2StandardBridge(payable(impl)).initialize({ _otherBridge: L1StandardBridge(payable(address(0))) });
+
+        L2StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)).initialize({
+            _otherBridge: L1StandardBridge(_l1StandardBridgeProxy)
+        });
+    }
+
+    /// @notice This predeploy is following the safety invariant #1.
+    function setL2ERC721Bridge(address payable _l1ERC721BridgeProxy) public {
+        address impl = _setImplementationCode(Predeploys.L2_ERC721_BRIDGE);
+
+        L2ERC721Bridge(impl).initialize({ _l1ERC721Bridge: payable(address(0)) });
 
-        _checkL2CrossDomainMessenger(impl);
+        L2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE).initialize({ _l1ERC721Bridge: payable(_l1ERC721BridgeProxy) });
     }
 
-    /// @notice This predeploy is following the saftey invariant #2,
-    ///         because the constructor args are non-static L1 contract
-    ///         addresses that are being read from the deploy config
-    ///         that are set as immutables.
-    /// @dev Because the constructor args are stored as immutables,
-    ///      we don't have to worry about setting storage slots.
-    function _setSequencerFeeVault() internal {
+    /// @notice This predeploy is following the safety invariant #2,
+    function setSequencerFeeVault() public {
         SequencerFeeVault vault = new SequencerFeeVault({
             _recipient: cfg.sequencerFeeVaultRecipient(),
             _minWithdrawalAmount: cfg.sequencerFeeVaultMinimumWithdrawalAmount(),
             _withdrawalNetwork: FeeVault.WithdrawalNetwork(cfg.sequencerFeeVaultWithdrawalNetwork())
         });
 
-        address impl = _predeployToCodeNamespace(Predeploys.SEQUENCER_FEE_WALLET);
+        address impl = Predeploys.predeployToCodeNamespace(Predeploys.SEQUENCER_FEE_WALLET);
         console.log("Setting %s implementation at: %s", "SequencerFeeVault", impl);
         vm.etch(impl, address(vault).code);
 
         /// Reset so its not included state dump
         vm.etch(address(vault), "");
         vm.resetNonce(address(vault));
+    }
+
+    /// @notice This predeploy is following the safety invariant #1.
+    function setOptimismMintableERC20Factory() public {
+        address impl = _setImplementationCode(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY);
 
-        _checkSequencerFeeVault(impl);
+        OptimismMintableERC20Factory(impl).initialize({ _bridge: address(0) });
+
+        OptimismMintableERC20Factory(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY).initialize({
+            _bridge: Predeploys.L2_STANDARD_BRIDGE
+        });
     }
 
-    /// @notice This predeploy is following the saftey invariant #1.
-    ///         We're initializing the implementation with `address(0)` so
-    ///         it's not left uninitialized. After `initialize` is called on the
-    ///         proxy to set the storage slot with the expected value.
-    function _setOptimismMintableERC20Factory() internal {
-        address impl =
-            _setImplementationCode(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY, "OptimismMintableERC20Factory");
+    /// @notice This predeploy is following the safety invariant #2,
+    function setOptimismMintableERC721Factory() public {
+        OptimismMintableERC721Factory factory =
+            new OptimismMintableERC721Factory({ _bridge: Predeploys.L2_ERC721_BRIDGE, _remoteChainId: cfg.l1ChainID() });
 
-        OptimismMintableERC20Factory(impl).initialize(address(0));
+        address impl = Predeploys.predeployToCodeNamespace(Predeploys.OPTIMISM_MINTABLE_ERC721_FACTORY);
+        console.log("Setting %s implementation at: %s", "OptimismMintableERC721Factory", impl);
+        vm.etch(impl, address(factory).code);
 
-        OptimismMintableERC20Factory(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY).initialize(
-            Predeploys.L2_STANDARD_BRIDGE
-        );
+        /// Reset so its not included state dump
+        vm.etch(address(factory), "");
+        vm.resetNonce(address(factory));
+    }
 
-        _checkOptimismMintableERC20Factory(impl);
+    /// @notice This predeploy is following the safety invariant #1.
+    function setL1Block() public {
+        if (cfg.useInterop()) {
+            string memory cname = "L1BlockInterop";
+            address impl = Predeploys.predeployToCodeNamespace(Predeploys.L1_BLOCK_ATTRIBUTES);
+            console.log("Setting %s implementation at: %s", cname, impl);
+            vm.etch(impl, vm.getDeployedCode(string.concat(cname, ".sol:", cname)));
+        } else {
+            _setImplementationCode(Predeploys.L1_BLOCK_ATTRIBUTES);
+            // Note: L1 block attributes are set to 0.
+            // Before the first user-tx the state is overwritten with actual L1 attributes.
+        }
     }
 
-    /// @notice This predeploy is following the saftey invariant #1.
-    ///         This contract has no initializer.
-    function _setL1BlockNumber() internal {
-        _setImplementationCode(Predeploys.L1_BLOCK_NUMBER, "L1BlockNumber");
+    /// @notice This predeploy is following the safety invariant #1.
+    function setGasPriceOracle() public {
+        _setImplementationCode(Predeploys.GAS_PRICE_ORACLE);
     }
 
-    /// @notice This predeploy is following the saftey invariant #1.
-    ///         This contract has no initializer.
-    function _setGasPriceOracle() internal {
-        _setImplementationCode(Predeploys.GAS_PRICE_ORACLE, "GasPriceOracle");
+    /// @notice This predeploy is following the safety invariant #1.
+    function setDeployerWhitelist() public {
+        _setImplementationCode(Predeploys.DEPLOYER_WHITELIST);
+    }
+
+    /// @notice This predeploy is following the safety invariant #1.
+    ///         This contract is NOT proxied and the state that is set
+    ///         in the constructor is set manually.
+    function setWETH() public {
+        console.log("Setting %s implementation at: %s", "WETH", Predeploys.WETH);
+        vm.etch(Predeploys.WETH, vm.getDeployedCode("WETH.sol:WETH"));
+    }
+
+    /// @notice This predeploy is following the safety invariant #1.
+    function setL1BlockNumber() public {
+        _setImplementationCode(Predeploys.L1_BLOCK_NUMBER);
+    }
+
+    /// @notice This predeploy is following the safety invariant #1.
+    function setLegacyMessagePasser() public {
+        _setImplementationCode(Predeploys.LEGACY_MESSAGE_PASSER);
+    }
+
+    /// @notice This predeploy is following the safety invariant #2.
+    function setBaseFeeVault() public {
+        BaseFeeVault vault = new BaseFeeVault({
+            _recipient: cfg.baseFeeVaultRecipient(),
+            _minWithdrawalAmount: cfg.baseFeeVaultMinimumWithdrawalAmount(),
+            _withdrawalNetwork: FeeVault.WithdrawalNetwork(cfg.baseFeeVaultWithdrawalNetwork())
+        });
+
+        address impl = Predeploys.predeployToCodeNamespace(Predeploys.BASE_FEE_VAULT);
+        console.log("Setting %s implementation at: %s", "BaseFeeVault", impl);
+        vm.etch(impl, address(vault).code);
+
+        /// Reset so its not included state dump
+        vm.etch(address(vault), "");
+        vm.resetNonce(address(vault));
     }
 
-    /// @notice This predeploy is following the saftey invariant #3.
-    function _setGovernanceToken() internal {
+    /// @notice This predeploy is following the safety invariant #2.
+    function setL1FeeVault() public {
+        L1FeeVault vault = new L1FeeVault({
+            _recipient: cfg.l1FeeVaultRecipient(),
+            _minWithdrawalAmount: cfg.l1FeeVaultMinimumWithdrawalAmount(),
+            _withdrawalNetwork: FeeVault.WithdrawalNetwork(cfg.l1FeeVaultWithdrawalNetwork())
+        });
+
+        address impl = Predeploys.predeployToCodeNamespace(Predeploys.L1_FEE_VAULT);
+        console.log("Setting %s implementation at: %s", "L1FeeVault", impl);
+        vm.etch(impl, address(vault).code);
+
+        /// Reset so its not included state dump
+        vm.etch(address(vault), "");
+        vm.resetNonce(address(vault));
+    }
+
+    /// @notice This predeploy is following the safety invariant #2.
+    function setGovernanceToken() public {
         if (!cfg.enableGovernance()) {
             console.log("Governance not enabled, skipping setting governanace token");
             return;
@@ -318,112 +438,133 @@ contract L2Genesis is Script, Artifacts {
         vm.resetNonce(address(token));
     }
 
-    /// @notice This predeploy is following the saftey invariant #1.
-    ///         This contract has no initializer.
-    /// @dev Previously the initial L1 attributes was set at genesis, to simplify,
-    ///      they no longer are so the resulting storage slots are no longer set.
-    function _setL1Block() internal {
-        _setImplementationCode(Predeploys.L1_BLOCK_ATTRIBUTES, "L1Block");
-    }
-
-    /// @dev Returns true if the address is not proxied.
-    function _notProxied(address _addr) internal pure returns (bool) {
-        return _addr == Predeploys.GOVERNANCE_TOKEN || _addr == Predeploys.WETH9;
-    }
-
-    /// @dev Returns true if the address is a predeploy.
-    function _isDefinedPredeploy(address _addr) internal pure returns (bool) {
-        return _addr == Predeploys.L2_TO_L1_MESSAGE_PASSER || _addr == Predeploys.L2_CROSS_DOMAIN_MESSENGER
-            || _addr == Predeploys.L2_STANDARD_BRIDGE || _addr == Predeploys.L2_ERC721_BRIDGE
-            || _addr == Predeploys.SEQUENCER_FEE_WALLET || _addr == Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY
-            || _addr == Predeploys.OPTIMISM_MINTABLE_ERC721_FACTORY || _addr == Predeploys.L1_BLOCK_ATTRIBUTES
-            || _addr == Predeploys.GAS_PRICE_ORACLE || _addr == Predeploys.DEPLOYER_WHITELIST || _addr == Predeploys.WETH9
-            || _addr == Predeploys.L1_BLOCK_NUMBER || _addr == Predeploys.LEGACY_MESSAGE_PASSER
-            || _addr == Predeploys.PROXY_ADMIN || _addr == Predeploys.BASE_FEE_VAULT || _addr == Predeploys.L1_FEE_VAULT
-            || _addr == Predeploys.GOVERNANCE_TOKEN || _addr == Predeploys.SCHEMA_REGISTRY || _addr == Predeploys.EAS;
-    }
-
-    /// @dev Function to compute the expected address of the predeploy implementation
-    ///      in the genesis state.
-    function _predeployToCodeNamespace(address _addr) internal pure returns (address) {
-        return address(
-            uint160(uint256(uint160(_addr)) & 0xffff | uint256(uint160(0xc0D3C0d3C0d3C0D3c0d3C0d3c0D3C0d3c0d30000)))
-        );
+    /// @notice This predeploy is following the safety invariant #1.
+    function setSchemaRegistry() public {
+        _setImplementationCode(Predeploys.SCHEMA_REGISTRY);
     }
 
-    function _setImplementationCode(address _addr, string memory _name) internal returns (address) {
-        address impl = _predeployToCodeNamespace(_addr);
-        console.log("Setting %s implementation at: %s", _name, impl);
-        vm.etch(impl, vm.getDeployedCode(string.concat(_name, ".sol:", _name)));
+    /// @notice This predeploy is following the safety invariant #2,
+    ///         It uses low level create to deploy the contract due to the code
+    ///         having immutables and being a different compiler version.
+    function setEAS() public {
+        string memory cname = Predeploys.getName(Predeploys.EAS);
+        address impl = Predeploys.predeployToCodeNamespace(Predeploys.EAS);
+        bytes memory code = vm.getCode(string.concat(cname, ".sol:", cname));
+
+        address eas;
+        assembly {
+            eas := create(0, add(code, 0x20), mload(code))
+        }
 
-        _verifyProxyImplementationAddress(_addr, impl);
+        console.log("Setting %s implementation at: %s", cname, impl);
+        vm.etch(impl, eas.code);
 
-        return impl;
+        /// Reset so its not included state dump
+        vm.etch(address(eas), "");
+        vm.resetNonce(address(eas));
     }
 
-    /// @dev Function to verify the expected implementation address is set for the respective proxy.
-    function _verifyProxyImplementationAddress(address _proxy, address _impl) internal view {
-        require(
-            EIP1967Helper.getImplementation(_proxy) == _impl,
-            "Expected different address at Proxys PROXY_IMPLEMENTATION_ADDRESS storage slot"
-        );
+    /// @notice This predeploy is following the saftey invariant #2.
+    ///         This contract has no initializer.
+    function setCrossL2Inbox() internal {
+        _setImplementationCode(Predeploys.CROSS_L2_INBOX);
     }
 
-    /// @dev Function to verify that a contract was initialized, and can't be reinitialized.
-    /// @notice There isn't a good way to know if the resulting revering is due to abi mismatch
-    ///         or because it's already been initialized
-    function _verifyCantReinitialize(address _contract, address _arg) internal {
-        vm.expectRevert("Initializable: contract is already initialized");
-        IInitializable(_contract).initialize(_arg);
+    /// @notice This predeploy is following the saftey invariant #2.
+    ///         This contract has no initializer.
+    function setL2ToL2CrossDomainMessenger() internal {
+        _setImplementationCode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER);
     }
 
-    /// @dev Helper function to sort the genesis alloc numerically by address.
-    function _sortJsonByKeys(string memory _path) internal {
-        string[] memory commands = new string[](3);
-        commands[0] = "bash";
-        commands[1] = "-c";
-        commands[2] = string.concat("cat <<< $(jq -S '.' ", _path, ") > ", _path);
-        vm.ffi(commands);
+    /// @notice Sets all the preinstalls.
+    ///         Warning: the creator-accounts of the preinstall contracts have 0 nonce values.
+    ///         When performing a regular user-initiated contract-creation of a preinstall,
+    ///         the creation will fail (but nonce will be bumped and not blocked).
+    ///         The preinstalls themselves are all inserted with a nonce of 1, reflecting regular user execution.
+    function setPreinstalls() internal {
+        _setPreinstallCode(Preinstalls.MultiCall3);
+        _setPreinstallCode(Preinstalls.Create2Deployer);
+        _setPreinstallCode(Preinstalls.Safe_v130);
+        _setPreinstallCode(Preinstalls.SafeL2_v130);
+        _setPreinstallCode(Preinstalls.MultiSendCallOnly_v130);
+        _setPreinstallCode(Preinstalls.SafeSingletonFactory);
+        _setPreinstallCode(Preinstalls.DeterministicDeploymentProxy);
+        _setPreinstallCode(Preinstalls.MultiSend_v130);
+        _setPreinstallCode(Preinstalls.Permit2);
+        _setPreinstallCode(Preinstalls.SenderCreator);
+        _setPreinstallCode(Preinstalls.EntryPoint); // ERC 4337
+        _setPreinstallCode(Preinstalls.BeaconBlockRoots);
+        // 4788 sender nonce must be incremented, since it's part of later upgrade-transactions.
+        // For the upgrade-tx to not create a contract that conflicts with an already-existing copy,
+        // the nonce must be bumped.
+        vm.setNonce(Preinstalls.BeaconBlockRootsSender, 1);
     }
 
-    function _fundDevAccounts() internal {
-        for (uint256 i; i < devAccounts.length; i++) {
-            console.log("Funding dev account %s with %s ETH", devAccounts[i], DEV_ACCOUNT_FUND_AMT / 1e18);
-            vm.deal(devAccounts[i], DEV_ACCOUNT_FUND_AMT);
-        }
+    /// @notice Activate Ecotone network upgrade.
+    function activateEcotone() public {
+        require(Preinstalls.BeaconBlockRoots.code.length > 0, "L2Genesis: must have beacon-block-roots contract");
+        console.log("Activating ecotone in GasPriceOracle contract");
+
+        vm.prank(L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).DEPOSITOR_ACCOUNT());
+        GasPriceOracle(Predeploys.GAS_PRICE_ORACLE).setEcotone();
+    }
 
-        _checkDevAccountsFunded();
+    function activateFjord() public {
+        console.log("Activating fjord in GasPriceOracle contract");
+        vm.prank(L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).DEPOSITOR_ACCOUNT());
+        GasPriceOracle(Predeploys.GAS_PRICE_ORACLE).setFjord();
     }
 
-    //////////////////////////////////////////////////////
-    /// Post Checks
-    //////////////////////////////////////////////////////
-    function _checkL2StandardBridge(address _impl) internal {
-        _verifyCantReinitialize(_impl, address(0));
-        _verifyCantReinitialize(Predeploys.L2_STANDARD_BRIDGE, mustGetAddress("L1StandardBridgeProxy"));
+    /// @notice Sets the bytecode in state
+    function _setImplementationCode(address _addr) internal returns (address) {
+        string memory cname = Predeploys.getName(_addr);
+        address impl = Predeploys.predeployToCodeNamespace(_addr);
+        console.log("Setting %s implementation at: %s", cname, impl);
+        vm.etch(impl, vm.getDeployedCode(string.concat(cname, ".sol:", cname)));
+        return impl;
     }
 
-    function _checkL2CrossDomainMessenger(address _impl) internal {
-        _verifyCantReinitialize(_impl, address(0));
-        _verifyCantReinitialize(Predeploys.L2_CROSS_DOMAIN_MESSENGER, mustGetAddress("L1CrossDomainMessengerProxy"));
+    /// @notice Sets the bytecode in state
+    function _setPreinstallCode(address _addr) internal {
+        string memory cname = Preinstalls.getName(_addr);
+        console.log("Setting %s preinstall code at: %s", cname, _addr);
+        vm.etch(_addr, Preinstalls.getDeployedCode(_addr, cfg.l2ChainID()));
+        // during testing in a shared L1/L2 account namespace some preinstalls may already have been inserted and used.
+        if (vm.getNonce(_addr) == 0) {
+            vm.setNonce(_addr, 1);
+        }
     }
 
-    function _checkSequencerFeeVault(address _impl) internal view {
-        _verifyProxyImplementationAddress(Predeploys.SEQUENCER_FEE_WALLET, _impl);
+    /// @notice Writes the genesis allocs, i.e. the state dump, to disk
+    function writeGenesisAllocs(string memory _path) public {
+        /// Reset so its not included state dump
+        vm.etch(address(cfg), "");
+        vm.etch(msg.sender, "");
+        vm.resetNonce(msg.sender);
+        vm.deal(msg.sender, 0);
+
+        vm.deal(deployer, 0);
+        vm.resetNonce(deployer);
+
+        console.log("Writing state dump to: %s", _path);
+        vm.dumpState(_path);
+        sortJsonByKeys(_path);
     }
 
-    function _checkOptimismMintableERC20Factory(address _impl) internal {
-        _verifyCantReinitialize(_impl, address(0));
-        _verifyCantReinitialize(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY, Predeploys.L2_STANDARD_BRIDGE);
+    /// @notice Sorts the allocs by address
+    function sortJsonByKeys(string memory _path) internal {
+        string[] memory commands = new string[](3);
+        commands[0] = "bash";
+        commands[1] = "-c";
+        commands[2] = string.concat("cat <<< $(jq -S '.' ", _path, ") > ", _path);
+        vm.ffi(commands);
     }
 
-    function _checkDevAccountsFunded() internal view {
+    /// @notice Funds the default dev accounts with ether
+    function fundDevAccounts() internal {
         for (uint256 i; i < devAccounts.length; i++) {
-            if (devAccounts[i].balance != DEV_ACCOUNT_FUND_AMT) {
-                revert(
-                    string.concat("Dev account not funded with expected amount of ETH: ", vm.toString(devAccounts[i]))
-                );
-            }
+            console.log("Funding dev account %s with %s ETH", devAccounts[i], DEV_ACCOUNT_FUND_AMT / 1e18);
+            vm.deal(devAccounts[i], DEV_ACCOUNT_FUND_AMT);
         }
     }
 }
diff --git a/packages/contracts-bedrock/scripts/Types.sol b/packages/contracts-bedrock/scripts/Types.sol
index bcd6d4392a37..c8b48dc1e704 100644
--- a/packages/contracts-bedrock/scripts/Types.sol
+++ b/packages/contracts-bedrock/scripts/Types.sol
@@ -9,6 +9,7 @@ library Types {
         address L2OutputOracle;
         address DisputeGameFactory;
         address DelayedWETH;
+        address AnchorStateRegistry;
         address OptimismMintableERC20Factory;
         address OptimismPortal;
         address OptimismPortal2;
diff --git a/packages/contracts-bedrock/scripts/autogen/generate-snapshots.ts b/packages/contracts-bedrock/scripts/autogen/generate-snapshots.ts
index 19c5e18740a9..fcfc59b89950 100644
--- a/packages/contracts-bedrock/scripts/autogen/generate-snapshots.ts
+++ b/packages/contracts-bedrock/scripts/autogen/generate-snapshots.ts
@@ -81,6 +81,8 @@ const main = async () => {
 
   const storageLayoutDir = path.join(outdir, 'storageLayout')
   const abiDir = path.join(outdir, 'abi')
+  fs.rmSync(storageLayoutDir, { recursive: true })
+  fs.rmSync(abiDir, { recursive: true })
   fs.mkdirSync(storageLayoutDir, { recursive: true })
   fs.mkdirSync(abiDir, { recursive: true })
 
@@ -96,6 +98,11 @@ const main = async () => {
       const contractName = parseArtifactName(name)
 
       // HACK: This is a hack to ignore libraries and abstract contracts. Not robust against changes to solc's internal ast repr
+      if (artifact.ast === undefined) {
+        throw new Error(
+          "ast isn't present in forge-artifacts. Did you run forge build with `--ast`?"
+        )
+      }
       const isContract = artifact.ast.nodes.some((node: any) => {
         return (
           node.nodeType === 'ContractDefinition' &&
diff --git a/packages/contracts-bedrock/scripts/checks/check-snapshots.sh b/packages/contracts-bedrock/scripts/checks/check-snapshots.sh
index 1aedf049fabf..cc1ffabd3659 100755
--- a/packages/contracts-bedrock/scripts/checks/check-snapshots.sh
+++ b/packages/contracts-bedrock/scripts/checks/check-snapshots.sh
@@ -5,9 +5,9 @@ set -euo pipefail
 # Generate the snapshots
 pnpm snapshots
 
-# Check if the generated snapshots are different from the committed snapshots
-if git diff --exit-code snapshots > /dev/null; then
-  [ -z "$(git ls-files --others --exclude-standard snapshots)" ] || exit 1
+# Check if the generated `snapshots` or `test/kontrol` files are different from the committed versions
+if git diff --exit-code snapshots test/kontrol > /dev/null; then
+  [ -z "$(git ls-files --others --exclude-standard snapshots test/kontrol)" ] || exit 1
 else
   exit 1
 fi
diff --git a/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol b/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol
index bda7858de52d..434b5274d929 100644
--- a/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol
+++ b/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol
@@ -3,7 +3,10 @@ pragma solidity 0.8.15;
 
 import { Proxy } from "src/universal/Proxy.sol";
 import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
+import { AnchorStateRegistry, IAnchorStateRegistry } from "src/dispute/AnchorStateRegistry.sol";
+import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol";
 import { StdAssertions } from "forge-std/StdAssertions.sol";
+import "src/dispute/lib/Types.sol";
 import "scripts/Deploy.s.sol";
 
 /// @notice Deploys the Fault Proof Alpha Chad contracts.
@@ -22,10 +25,12 @@ contract FPACOPS is Deploy, StdAssertions {
         // Deploy the proxies.
         deployERC1967Proxy("DisputeGameFactoryProxy");
         deployERC1967Proxy("DelayedWETHProxy");
+        deployERC1967Proxy("AnchorStateRegistryProxy");
 
         // Deploy implementations.
         deployDisputeGameFactory();
         deployDelayedWETH();
+        deployAnchorStateRegistry();
         deployPreimageOracle();
         deployMips();
 
@@ -35,6 +40,7 @@ contract FPACOPS is Deploy, StdAssertions {
         // Initialize the proxies.
         initializeDisputeGameFactoryProxy();
         initializeDelayedWETHProxy();
+        initializeAnchorStateRegistryProxy();
 
         // Deploy the Cannon Fault game implementation and set it as game ID = 0.
         setCannonFaultGameImplementation({ _allowUpgrade: false });
@@ -45,6 +51,7 @@ contract FPACOPS is Deploy, StdAssertions {
         // of the DisputeGameFactoryProxy to the ProxyAdmin.
         transferDGFOwnershipFinal({ _proxyAdmin: _proxyAdmin, _systemOwnerSafe: _systemOwnerSafe });
         transferWethOwnershipFinal({ _proxyAdmin: _proxyAdmin, _systemOwnerSafe: _systemOwnerSafe });
+        transferAnchorStateOwnershipFinal({ _proxyAdmin: _proxyAdmin });
 
         // Run post-deployment assertions.
         postDeployAssertions({ _proxyAdmin: _proxyAdmin, _systemOwnerSafe: _systemOwnerSafe });
@@ -65,6 +72,11 @@ contract FPACOPS is Deploy, StdAssertions {
         Proxy(payable(dgfProxy)).upgradeToAndCall(
             mustGetAddress("DisputeGameFactory"), abi.encodeCall(DisputeGameFactory.initialize, msg.sender)
         );
+
+        // Set the initialization bonds for the FaultDisputeGame and PermissionedDisputeGame.
+        DisputeGameFactory dgf = DisputeGameFactory(dgfProxy);
+        dgf.setInitBond(GameTypes.CANNON, 0.08 ether);
+        dgf.setInitBond(GameTypes.PERMISSIONED_CANNON, 0.08 ether);
     }
 
     function initializeDelayedWETHProxy() internal broadcast {
@@ -78,6 +90,31 @@ contract FPACOPS is Deploy, StdAssertions {
         );
     }
 
+    function initializeAnchorStateRegistryProxy() internal broadcast {
+        console.log("Initializing AnchorStateRegistryProxy with AnchorStateRegistry.");
+
+        AnchorStateRegistry.StartingAnchorRoot[] memory roots = new AnchorStateRegistry.StartingAnchorRoot[](2);
+        roots[0] = AnchorStateRegistry.StartingAnchorRoot({
+            gameType: GameTypes.CANNON,
+            outputRoot: OutputRoot({
+                root: Hash.wrap(cfg.faultGameGenesisOutputRoot()),
+                l2BlockNumber: cfg.faultGameGenesisBlock()
+            })
+        });
+        roots[1] = AnchorStateRegistry.StartingAnchorRoot({
+            gameType: GameTypes.PERMISSIONED_CANNON,
+            outputRoot: OutputRoot({
+                root: Hash.wrap(cfg.faultGameGenesisOutputRoot()),
+                l2BlockNumber: cfg.faultGameGenesisBlock()
+            })
+        });
+
+        address asrProxy = mustGetAddress("AnchorStateRegistryProxy");
+        Proxy(payable(asrProxy)).upgradeToAndCall(
+            mustGetAddress("AnchorStateRegistry"), abi.encodeCall(AnchorStateRegistry.initialize, (roots))
+        );
+    }
+
     /// @notice Transfers admin rights of the `DisputeGameFactoryProxy` to the `ProxyAdmin` and sets the
     ///         `DisputeGameFactory` owner to the `SystemOwnerSafe`.
     function transferDGFOwnershipFinal(address _proxyAdmin, address _systemOwnerSafe) internal broadcast {
@@ -104,8 +141,17 @@ contract FPACOPS is Deploy, StdAssertions {
         prox.changeAdmin(_proxyAdmin);
     }
 
+    /// @notice Transfers admin rights of the `AnchorStateRegistryProxy` to the `ProxyAdmin`.
+    function transferAnchorStateOwnershipFinal(address _proxyAdmin) internal broadcast {
+        AnchorStateRegistry asr = AnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy"));
+
+        // Transfer the admin rights of the AnchorStateRegistryProxy to the ProxyAdmin.
+        Proxy prox = Proxy(payable(address(asr)));
+        prox.changeAdmin(_proxyAdmin);
+    }
+
     /// @notice Checks that the deployed system is configured correctly.
-    function postDeployAssertions(address _proxyAdmin, address _systemOwnerSafe) internal {
+    function postDeployAssertions(address _proxyAdmin, address _systemOwnerSafe) internal view {
         Types.ContractSet memory contracts = _proxiesUnstrict();
         contracts.OptimismPortal2 = mustGetAddress("OptimismPortal2");
 
@@ -131,24 +177,39 @@ contract FPACOPS is Deploy, StdAssertions {
         MIPS mips = MIPS(mustGetAddress("Mips"));
         assertEq(address(mips.oracle()), address(oracle));
 
+        // Check the AnchorStateRegistry configuration.
+        AnchorStateRegistry asr = AnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy"));
+        (Hash root1, uint256 l2BlockNumber1) = asr.anchors(GameTypes.CANNON);
+        (Hash root2, uint256 l2BlockNumber2) = asr.anchors(GameTypes.PERMISSIONED_CANNON);
+        assertEq(root1.raw(), cfg.faultGameGenesisOutputRoot());
+        assertEq(root2.raw(), cfg.faultGameGenesisOutputRoot());
+        assertEq(l2BlockNumber1, cfg.faultGameGenesisBlock());
+        assertEq(l2BlockNumber2, cfg.faultGameGenesisBlock());
+
         // Check the FaultDisputeGame configuration.
         FaultDisputeGame gameImpl = FaultDisputeGame(payable(address(dgfProxy.gameImpls(GameTypes.CANNON))));
         assertEq(gameImpl.maxGameDepth(), cfg.faultGameMaxDepth());
         assertEq(gameImpl.splitDepth(), cfg.faultGameSplitDepth());
-        assertEq(gameImpl.gameDuration().raw(), cfg.faultGameMaxDuration());
+        assertEq(gameImpl.clockExtension().raw(), cfg.faultGameClockExtension());
+        assertEq(gameImpl.maxClockDuration().raw(), cfg.faultGameMaxClockDuration());
         assertEq(gameImpl.absolutePrestate().raw(), bytes32(cfg.faultGameAbsolutePrestate()));
-        assertEq(gameImpl.genesisBlockNumber(), cfg.faultGameGenesisBlock());
-        assertEq(gameImpl.genesisOutputRoot().raw(), cfg.faultGameGenesisOutputRoot());
+        assertEq(address(gameImpl.weth()), wethProxyAddr);
+        assertEq(address(gameImpl.anchorStateRegistry()), address(asr));
+        assertEq(address(gameImpl.vm()), address(mips));
 
         // Check the security override yoke configuration.
         PermissionedDisputeGame soyGameImpl =
             PermissionedDisputeGame(payable(address(dgfProxy.gameImpls(GameTypes.PERMISSIONED_CANNON))));
+        assertEq(soyGameImpl.proposer(), cfg.l2OutputOracleProposer());
+        assertEq(soyGameImpl.challenger(), cfg.l2OutputOracleChallenger());
         assertEq(soyGameImpl.maxGameDepth(), cfg.faultGameMaxDepth());
         assertEq(soyGameImpl.splitDepth(), cfg.faultGameSplitDepth());
-        assertEq(soyGameImpl.gameDuration().raw(), cfg.faultGameMaxDuration());
+        assertEq(soyGameImpl.clockExtension().raw(), cfg.faultGameClockExtension());
+        assertEq(soyGameImpl.maxClockDuration().raw(), cfg.faultGameMaxClockDuration());
         assertEq(soyGameImpl.absolutePrestate().raw(), bytes32(cfg.faultGameAbsolutePrestate()));
-        assertEq(soyGameImpl.genesisBlockNumber(), cfg.faultGameGenesisBlock());
-        assertEq(soyGameImpl.genesisOutputRoot().raw(), cfg.faultGameGenesisOutputRoot());
+        assertEq(address(soyGameImpl.weth()), wethProxyAddr);
+        assertEq(address(soyGameImpl.anchorStateRegistry()), address(asr));
+        assertEq(address(soyGameImpl.vm()), address(mips));
     }
 
     /// @notice Prints a review of the fault proof configuration section of the deploy config.
@@ -158,13 +219,14 @@ contract FPACOPS is Deploy, StdAssertions {
         console.log("    1. Absolute Prestate: %x", cfg.faultGameAbsolutePrestate());
         console.log("    2. Max Depth: %d", cfg.faultGameMaxDepth());
         console.log("    3. Output / Execution split Depth: %d", cfg.faultGameSplitDepth());
-        console.log("    4. Game Duration (seconds): %d", cfg.faultGameMaxDuration());
-        console.log("    5. L2 Genesis block number: %d", cfg.faultGameGenesisBlock());
-        console.log("    6. L2 Genesis output root: %x", uint256(cfg.faultGameGenesisOutputRoot()));
-        console.log("    7. Proof Maturity Delay (seconds): ", cfg.proofMaturityDelaySeconds());
-        console.log("    8. Dispute Game Finality Delay (seconds): ", cfg.disputeGameFinalityDelaySeconds());
-        console.log("    9. Respected Game Type: ", cfg.respectedGameType());
-        console.log("   10. Preimage Oracle Min Proposal Size (bytes): ", cfg.preimageOracleMinProposalSize());
-        console.log("   11. Preimage Oracle Challenge Period (seconds): ", cfg.preimageOracleChallengePeriod());
+        console.log("    4. Clock Extension (seconds): %d", cfg.faultGameClockExtension());
+        console.log("    5. Max Clock Duration (seconds): %d", cfg.faultGameMaxClockDuration());
+        console.log("    6. L2 Genesis block number: %d", cfg.faultGameGenesisBlock());
+        console.log("    7. L2 Genesis output root: %x", uint256(cfg.faultGameGenesisOutputRoot()));
+        console.log("    8. Proof Maturity Delay (seconds): ", cfg.proofMaturityDelaySeconds());
+        console.log("    9. Dispute Game Finality Delay (seconds): ", cfg.disputeGameFinalityDelaySeconds());
+        console.log("   10. Respected Game Type: ", cfg.respectedGameType());
+        console.log("   11. Preimage Oracle Min Proposal Size (bytes): ", cfg.preimageOracleMinProposalSize());
+        console.log("   12. Preimage Oracle Challenge Period (seconds): ", cfg.preimageOracleChallengePeriod());
     }
 }
diff --git a/packages/contracts-bedrock/scripts/generate-l2-genesis.sh b/packages/contracts-bedrock/scripts/generate-l2-genesis.sh
deleted file mode 100755
index 39d162b9151b..000000000000
--- a/packages/contracts-bedrock/scripts/generate-l2-genesis.sh
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env bash
-
-set -euo pipefail
-
-# Create a L2 genesis.json suitable for the solidity tests to
-# ingest using `vm.loadAllocs(string)`.
-# This script depends on the relative path to the op-node from
-# contracts-bedrock
-
-SCRIPTS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" > /dev/null && pwd)"
-CONTRACTS_DIR="$(realpath "$SCRIPTS_DIR/..")"
-MONOREPO_BASE="$(realpath "$CONTRACTS_DIR/../..")"
-
-DEPLOY_ARTIFACT="$CONTRACTS_DIR/deployments/hardhat/.deploy"
-OP_NODE="$MONOREPO_BASE/op-node/cmd/main.go"
-L1_STARTING_BLOCK_PATH="$CONTRACTS_DIR/test/mocks/block.json"
-TESTDATA_DIR="$CONTRACTS_DIR/.testdata"
-
-OUTFILE_L2="$TESTDATA_DIR/genesis.json"
-OUTFILE_ROLLUP="$TESTDATA_DIR/rollup.json"
-
-LOCKDIR="/tmp/lock-generate-l2-genesis"
-
-cleanup() {
-  rm -rf -- "$LOCKDIR"
-}
-
-# Wait for the L2 outfile to be over 8M for up to $2 iterations
-# of $1 seconds. This is a hack to ensure that the outfile is fully
-# written before the solidity tests try to read it
-wait_l2_outfile() {
-  i=1
-  while [ $i -le "$2" ]; do
-    i=$((i + 1))
-
-    if [ ! -f "$OUTFILE_L2" ]; then
-      sleep "$1"
-      continue
-    fi
-
-    if [ "$(du -m "$OUTFILE_L2" | cut -f1)" -lt 8 ]; then
-      sleep "$1"
-      continue
-    fi
-
-    exit 0
-  done
-
-  echo "L2 genesis file not generated in time. Exiting."
-  exit 1
-}
-
-# Directory creations are atomic, so we can use mkdir to
-# create a lockfile that prevents subsequent invocations
-# of the script from running concurrently.
-if mkdir -- "$LOCKDIR" > /dev/null 2>&1; then
-  trap 'cleanup' EXIT
-
-  mkdir -p "$TESTDATA_DIR"
-
-  if [ ! -f "$DEPLOY_ARTIFACT" ]; then
-    forge script "$CONTRACTS_DIR"/scripts/Deploy.s.sol:Deploy > /dev/null 2>&1
-  fi
-
-  if [ ! -f "$OUTFILE_L2" ]; then
-    tempfile=$(mktemp)
-    if ! go run "$OP_NODE" genesis l2 \
-      --deploy-config "$CONTRACTS_DIR/deploy-config/hardhat.json" \
-      --l1-deployments "$DEPLOY_ARTIFACT" \
-      --l1-starting-block "$L1_STARTING_BLOCK_PATH" \
-      --outfile.l2 "$OUTFILE_L2" \
-      --outfile.rollup "$OUTFILE_ROLLUP" 2>"$tempfile"; then
-      cat "$tempfile" >&2
-    fi
-    rm "$tempfile"
-  fi
-else
-  # Wait up to 5 minutes for the lock to be released
-  wait_l2_outfile 0.25 1200
-fi
diff --git a/packages/contracts-bedrock/scripts/getting-started/config.sh b/packages/contracts-bedrock/scripts/getting-started/config.sh
index 95ab527d603d..0e3bc5cf7ebb 100755
--- a/packages/contracts-bedrock/scripts/getting-started/config.sh
+++ b/packages/contracts-bedrock/scripts/getting-started/config.sh
@@ -65,7 +65,7 @@ config=$(cat << EOL
   "l1FeeVaultWithdrawalNetwork": 0,
   "sequencerFeeVaultWithdrawalNetwork": 0,
 
-  "gasPriceOracleOverhead": 2100,
+  "gasPriceOracleOverhead": 0,
   "gasPriceOracleScalar": 1000000,
 
   "enableGovernance": true,
@@ -81,7 +81,8 @@ config=$(cat << EOL
   "eip1559DenominatorCanyon": 250,
   "eip1559Elasticity": 6,
 
-  "l2GenesisDeltaTimeOffset": null,
+  "l2GenesisEcotoneTimeOffset": "0x0",
+  "l2GenesisDeltaTimeOffset": "0x0",
   "l2GenesisCanyonTimeOffset": "0x0",
 
   "systemConfigStartBlock": 0,
@@ -91,13 +92,14 @@ config=$(cat << EOL
 
   "faultGameAbsolutePrestate": "0x03c7ae758795765c6664a5d39bf63841c71ff191e9189522bad8ebff5d4eca98",
   "faultGameMaxDepth": 44,
-  "faultGameMaxDuration": 1200,
+  "faultGameClockExtension": 0,
+  "faultGameMaxClockDuration": 600,
   "faultGameGenesisBlock": 0,
   "faultGameGenesisOutputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
   "faultGameSplitDepth": 14,
 
   "preimageOracleMinProposalSize": 1800000,
-  "preimageOracleChallengePeriod": 86400,
+  "preimageOracleChallengePeriod": 86400
 }
 EOL
 )
diff --git a/packages/contracts-bedrock/scripts/getting-started/versions.sh b/packages/contracts-bedrock/scripts/getting-started/versions.sh
index 79dc55a7e9c5..18c0ca3228f8 100755
--- a/packages/contracts-bedrock/scripts/getting-started/versions.sh
+++ b/packages/contracts-bedrock/scripts/getting-started/versions.sh
@@ -43,7 +43,7 @@ echo "Dependency | Minimum         | Actual"
 echo "git          2                $ver_git"
 echo "go           1.21             $ver_go"
 echo "node         20               $ver_node"
-echo "pnpm         8                $ver_pnpm"
+echo "pnpm         9                $ver_pnpm"
 echo "foundry      0.2.0 (a5efe4f)  $ver_foundry"
 echo "make         3                $ver_make"
 echo "jq           1.6              $ver_jq"
diff --git a/packages/contracts-bedrock/scripts/go-ffi/differential-testing.go b/packages/contracts-bedrock/scripts/go-ffi/differential-testing.go
index 6c48d31de96a..67d0c45249c8 100644
--- a/packages/contracts-bedrock/scripts/go-ffi/differential-testing.go
+++ b/packages/contracts-bedrock/scripts/go-ffi/differential-testing.go
@@ -8,8 +8,9 @@ import (
 	"strconv"
 
 	"github.com/ethereum-optimism/optimism/cannon/mipsevm"
-	"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
+	"github.com/ethereum-optimism/optimism/op-service/eth"
+	"github.com/ethereum-optimism/optimism/op-service/predeploys"
 	"github.com/ethereum/go-ethereum/accounts/abi"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/hexutil"
@@ -17,7 +18,8 @@ import (
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/trie"
-	"github.com/ethereum/go-ethereum/trie/triedb/hashdb"
+	"github.com/ethereum/go-ethereum/triedb"
+	"github.com/ethereum/go-ethereum/triedb/hashdb"
 )
 
 // ABI types
@@ -34,6 +36,17 @@ var (
 		{Type: fixedBytes},
 	}
 
+	uint32Type, _ = abi.NewType("uint32", "", nil)
+
+	// Plain address type
+	addressType, _ = abi.NewType("address", "", nil)
+
+	// Plain uint8 type
+	uint8Type, _ = abi.NewType("uint8", "", nil)
+
+	// Plain uint256 type
+	uint256Type, _ = abi.NewType("uint256", "", nil)
+
 	// Decoded nonce tuple (nonce, version)
 	decodedNonce, _ = abi.NewType("tuple", "DecodedNonce", []abi.ArgumentMarshaling{
 		{Name: "nonce", Type: "uint256"},
@@ -43,6 +56,12 @@ var (
 		{Name: "encodedNonce", Type: decodedNonce},
 	}
 
+	// Decoded ecotone scalars (uint32, uint32)
+	decodedScalars = abi.Arguments{
+		{Name: "basefeeScalar", Type: uint32Type},
+		{Name: "blobbasefeeScalar", Type: uint32Type},
+	}
+
 	// WithdrawalHash slot tuple (bytes32, bytes32)
 	withdrawalSlot, _ = abi.NewType("tuple", "SlotHash", []abi.ArgumentMarshaling{
 		{Name: "withdrawalHash", Type: "bytes32"},
@@ -72,6 +91,17 @@ var (
 	cannonMemoryProofArgs = abi.Arguments{
 		{Name: "encodedCannonMemoryProof", Type: cannonMemoryProof},
 	}
+
+	// Gas paying token tuple (address, uint8, bytes32, bytes32)
+	gasPayingTokenArgs = abi.Arguments{
+		{Name: "token", Type: addressType},
+		{Name: "decimals", Type: uint8Type},
+		{Name: "name", Type: fixedBytes},
+		{Name: "symbol", Type: fixedBytes},
+	}
+
+	// Dependency tuple (uint256)
+	dependencyArgs = abi.Arguments{{Name: "chainId", Type: uint256Type}}
 )
 
 func DiffTestUtils() {
@@ -274,7 +304,7 @@ func DiffTestUtils() {
 		// Create a secure trie for state
 		state, err := trie.NewStateTrie(
 			trie.TrieID(types.EmptyRootHash),
-			trie.NewDatabase(rawdb.NewMemoryDatabase(), &trie.Config{HashDB: hashdb.Defaults}),
+			triedb.NewDatabase(rawdb.NewMemoryDatabase(), &triedb.Config{HashDB: hashdb.Defaults}),
 		)
 		checkErr(err, "Error creating secure trie")
 
@@ -285,14 +315,14 @@ func DiffTestUtils() {
 		// Create a secure trie for the world state
 		world, err := trie.NewStateTrie(
 			trie.TrieID(types.EmptyRootHash),
-			trie.NewDatabase(rawdb.NewMemoryDatabase(), &trie.Config{HashDB: hashdb.Defaults}),
+			triedb.NewDatabase(rawdb.NewMemoryDatabase(), &triedb.Config{HashDB: hashdb.Defaults}),
 		)
 		checkErr(err, "Error creating secure trie")
 
 		// Put the put the rlp encoded account in the world trie
 		account := types.StateAccount{
 			Nonce:   0,
-			Balance: big.NewInt(0),
+			Balance: common.U2560,
 			Root:    state.Hash(),
 		}
 		writer := new(bytes.Buffer)
@@ -360,6 +390,56 @@ func DiffTestUtils() {
 		packed, err := cannonMemoryProofArgs.Pack(&output)
 		checkErr(err, "Error encoding output")
 		fmt.Print(hexutil.Encode(packed[32:]))
+	case "encodeScalarEcotone":
+		basefeeScalar, err := strconv.ParseUint(args[1], 10, 32)
+		checkErr(err, "Error decocding basefeeScalar")
+		blobbasefeeScalar, err := strconv.ParseUint(args[2], 10, 32)
+		checkErr(err, "Error decocding blobbasefeeScalar")
+
+		encoded := eth.EncodeScalar(eth.EcotoneScalars{
+			BaseFeeScalar:     uint32(basefeeScalar),
+			BlobBaseFeeScalar: uint32(blobbasefeeScalar),
+		})
+		fmt.Print(hexutil.Encode(encoded[:]))
+	case "decodeScalarEcotone":
+		scalar := common.HexToHash(args[1])
+		scalars, err := eth.DecodeScalar([32]byte(scalar[:]))
+		checkErr(err, "Error decoding scalar")
+
+		packed, err := decodedScalars.Pack(scalars.BaseFeeScalar, scalars.BlobBaseFeeScalar)
+		checkErr(err, "Error encoding output")
+		fmt.Print(hexutil.Encode(packed))
+	case "encodeGasPayingToken":
+		// Parse input arguments
+		token := common.HexToAddress(args[1])
+		decimals, err := strconv.ParseUint(args[2], 10, 8)
+		checkErr(err, "Error decoding decimals")
+		name := common.HexToHash(args[3])
+		symbol := common.HexToHash(args[4])
+
+		// Encode gas paying token
+		encoded, err := gasPayingTokenArgs.Pack(token, uint8(decimals), name, symbol)
+		checkErr(err, "Error encoding gas paying token")
+
+		// Pack encoded gas paying token
+		packed, err := bytesArgs.Pack(&encoded)
+		checkErr(err, "Error encoding output")
+
+		fmt.Print(hexutil.Encode(packed))
+	case "encodeDependency":
+		// Parse input arguments
+		chainId, ok := new(big.Int).SetString(args[1], 10)
+		checkOk(ok)
+
+		// Encode dependency
+		encoded, err := dependencyArgs.Pack(chainId)
+		checkErr(err, "Error encoding dependency")
+
+		// Pack encoded dependency
+		packed, err := bytesArgs.Pack(&encoded)
+		checkErr(err, "Error encoding output")
+
+		fmt.Print(hexutil.Encode(packed))
 	default:
 		panic(fmt.Errorf("Unknown command: %s", args[0]))
 	}
diff --git a/packages/contracts-bedrock/scripts/go-ffi/trie.go b/packages/contracts-bedrock/scripts/go-ffi/trie.go
index 4666816f6d7a..c1d06469a51f 100644
--- a/packages/contracts-bedrock/scripts/go-ffi/trie.go
+++ b/packages/contracts-bedrock/scripts/go-ffi/trie.go
@@ -13,6 +13,7 @@ import (
 	"github.com/ethereum/go-ethereum/core/rawdb"
 	"github.com/ethereum/go-ethereum/rlp"
 	"github.com/ethereum/go-ethereum/trie"
+	"github.com/ethereum/go-ethereum/triedb"
 )
 
 // Variant enum
@@ -133,7 +134,7 @@ func FuzzTrie() {
 func genTrieTestCase(selectEmptyKey bool) trieTestCase {
 	// Create an empty merkle trie
 	memdb := rawdb.NewMemoryDatabase()
-	randTrie := trie.NewEmpty(trie.NewDatabase(memdb, nil))
+	randTrie := trie.NewEmpty(triedb.NewDatabase(memdb, nil))
 
 	// Get a random number of elements to put into the trie
 	randN := randRange(2, 1024)
diff --git a/packages/contracts-bedrock/scripts/go-ffi/utils.go b/packages/contracts-bedrock/scripts/go-ffi/utils.go
index f7e866fc5e5b..0c535c03feef 100644
--- a/packages/contracts-bedrock/scripts/go-ffi/utils.go
+++ b/packages/contracts-bedrock/scripts/go-ffi/utils.go
@@ -5,8 +5,8 @@ import (
 	"fmt"
 	"math/big"
 
-	"github.com/ethereum-optimism/optimism/op-bindings/bindings"
 	"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
+	"github.com/ethereum-optimism/optimism/op-node/bindings"
 	"github.com/ethereum-optimism/optimism/op-node/rollup"
 	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
 	"github.com/ethereum/go-ethereum/common"
diff --git a/packages/contracts-bedrock/semver-lock.json b/packages/contracts-bedrock/semver-lock.json
index e21cebb1a5e2..8e1e633eb81b 100644
--- a/packages/contracts-bedrock/semver-lock.json
+++ b/packages/contracts-bedrock/semver-lock.json
@@ -16,28 +16,32 @@
     "sourceCodeHash": "0xc59b8574531162e016d7342aeb6e79d05574e90dbea6c0e5ede35b65010ad894"
   },
   "src/L1/L1CrossDomainMessenger.sol": {
-    "initCodeHash": "0xb0b3273999191e4ff616509e3a368a9d89f7967c20ba73c1bc5bd72bd13acb16",
-    "sourceCodeHash": "0x6c86ba9f20f54ac834ad846e6302f892b7576dd407db595ebaba017971471eb4"
+    "initCodeHash": "0xff2c621c5ae8f1190779b13d8da4ee9fcd64f202d6e5ee309f0028bca17a8b8f",
+    "sourceCodeHash": "0x56a2d3abed97eb7b292db758aac1e36fc08a12bfa44f7969824e26866a1417fa"
   },
   "src/L1/L1ERC721Bridge.sol": {
     "initCodeHash": "0xec73b46e68ea29298707f7b9709e7948afe303907b6c4e8b161e2ded2c85ee9c",
     "sourceCodeHash": "0xd57acdbd001941e75cf4326ba7c1bdad809912f10b1e44ffaebe073917cdd296"
   },
   "src/L1/L1StandardBridge.sol": {
-    "initCodeHash": "0xb0166b741e0b6938c004c19de78f347171e2656056a0363434ebd0f34a6a32ca",
-    "sourceCodeHash": "0x654f9490dd2d0bc9e92dc31781e62f106f6b7d8b6fca0cfe718cd2a599c1b18b"
+    "initCodeHash": "0xf46dc2d8e171bd5aebbafe31386e9d27323a124b1b99f378cb8f67ab22225a7b",
+    "sourceCodeHash": "0x0d07e526c1891abb81c7e94f73642caa8ee386ab036b3b2a67f1b21ca85089c5"
   },
   "src/L1/L2OutputOracle.sol": {
     "initCodeHash": "0x14c3a582ca46ef2a6abad5590323f4de26ff4de54415c927c62e131ccbf8d9ba",
     "sourceCodeHash": "0xf5fcf570721e25459fadbb37e02f9efe349e1c8afcbf1e3b5fdb09c9f612cdc0"
   },
   "src/L1/OptimismPortal.sol": {
-    "initCodeHash": "0x54658799b54481f56acb6481db4f37ad830a8238a8fd592c96e8b1a2b60e0627",
-    "sourceCodeHash": "0xf549ae16033b63e7cb3e032898a6495e1a13090dc8dd1422f7f650076ae973f8"
+    "initCodeHash": "0xfdc8cf0b0b26961f6ac493ee564761716447d263291bea4d366a7b94afe33392",
+    "sourceCodeHash": "0x9fe0a9001edecd2a04daada4ca9e17d66141b1c982f73653493b4703d2c675c4"
   },
   "src/L1/OptimismPortal2.sol": {
-    "initCodeHash": "0x718b2bc2925ca1551a98908b26237fc7dd6634f7ca35c766a42b3d7e20eecd5e",
-    "sourceCodeHash": "0x5941d020f7ce1f6eeab2be25bb492cd955b77c379eaed2d66880a5caaaeaf0de"
+    "initCodeHash": "0x45cae622788a795c2fc4f4bc8e6b85d8edf284a1dc20e1b5fa01e88d737deb23",
+    "sourceCodeHash": "0xea564dbff9831ad1bf0c1b345fbc3da4675cf112d2605ba94e1ef5c7b745b7ae"
+  },
+  "src/L1/OptimismPortalInterop.sol": {
+    "initCodeHash": "0x4ab4c99bd776d1817f7475161db0ce47e735a91bb9fb486338238aa762fe0909",
+    "sourceCodeHash": "0x49ae32c402536774928116b833e2256741dbbdf99900ea5df159efab684d1008"
   },
   "src/L1/ProtocolVersions.sol": {
     "initCodeHash": "0x72cd467e8bcf019c02675d72ab762e088bcc9cc0f1a4e9f587fa4589f7fdd1b8",
@@ -48,72 +52,100 @@
     "sourceCodeHash": "0xd6a894e371c2c7182b5960c507491f81c3775dda0efedd29475f7c30ca07b004"
   },
   "src/L1/SystemConfig.sol": {
-    "initCodeHash": "0xa14bfe090e923acbacb361d9aa60e0d56fc1dff158ddbd1dc221a5380679f37f",
-    "sourceCodeHash": "0x58d078f2f352ccb9001afe8245f4655b47ed0227189ede9ef56523b2193059bd"
+    "initCodeHash": "0x3324c93485f594bccb2af1a0c5a3551948ae9b347baea371764ce8fe239c39be",
+    "sourceCodeHash": "0xaed39fb8a0ce4b8d7a97ead42074e0c672fa18a58a57227b9d32abe2c3600223"
+  },
+  "src/L1/SystemConfigInterop.sol": {
+    "initCodeHash": "0x710484da188ec16a0ade97d99ecd4f5e910bc87ad01e448db4cf3f0e5050aaee",
+    "sourceCodeHash": "0x40d708140ee6345e146e358c169a191dbbc991782560a2dcbf90ba45a82f7117"
   },
   "src/L2/BaseFeeVault.sol": {
     "initCodeHash": "0x2744d34573be83206d1b75d049d18a7bb37f9058e68c0803e5008c46b0dc2474",
     "sourceCodeHash": "0xd787bd2a192ba5025fa0a8de2363af66a8de20de226e411bdb576adb64636cd0"
   },
+  "src/L2/CrossL2Inbox.sol": {
+    "initCodeHash": "0x46e15ac5de81ea415061d049730da25acf31040d6d5d70fe3a9bf4cac100c282",
+    "sourceCodeHash": "0xc3d38bfa73fc33369891a2e8c987baf64b1e94c53d6104676fd4c93e1f5c8011"
+  },
   "src/L2/GasPriceOracle.sol": {
-    "initCodeHash": "0xfd456e91d8c9714590a4f0a2c1046ba70e102f1c629ead886c4eebc3f921c3c3",
-    "sourceCodeHash": "0xde06becce9514f46ba78b4cb0732c7a714d49ba8f131258d56a5f5b22b51be7e"
+    "initCodeHash": "0xb16f1e370e58c7693fd113a21a1b1e7ccebc03d4f1e5a76786fc27847ef51ead",
+    "sourceCodeHash": "0x5529ee28aae94904a1c08a8b188f51a39a0f51fbd3b43f1abd4fee7bba57998c"
   },
   "src/L2/L1Block.sol": {
-    "initCodeHash": "0xda6828a2a6e02d9fde7d5d9947f51b207f31abf5dbb538dd968cd491164e2115",
-    "sourceCodeHash": "0x775c399d93a729e1d3fe9a67c015f529f0c17a5986f93cd8d0f7806414fc5cdc"
+    "initCodeHash": "0xfd099da051edf13b147f4382ab4bed9db546d0c48157736ba298fb7e178b20d9",
+    "sourceCodeHash": "0x24db623574743432626ed0d7dd938bbd2149b570a00328c772debd7eb179ff1d"
+  },
+  "src/L2/L1BlockInterop.sol": {
+    "initCodeHash": "0x6833a323934b3be1e5a5c7491c652b6e90bc5102416ddbb255b5f65aa6d5d4a1",
+    "sourceCodeHash": "0xd8ec2f814690d1ffd55e5b8496bca5a179d6d1772d61f71cdf8296c9058dc2c6"
   },
   "src/L2/L1FeeVault.sol": {
     "initCodeHash": "0x2744d34573be83206d1b75d049d18a7bb37f9058e68c0803e5008c46b0dc2474",
     "sourceCodeHash": "0x3a94f273937d8908fb37dd2c495a6a0b9c3941fe68ccea51723f84eb343ba225"
   },
   "src/L2/L2CrossDomainMessenger.sol": {
-    "initCodeHash": "0xfeedd51cc3159f814f6aee9e54cbba1c9a2fa4079fa40c00871889bc1c98c902",
-    "sourceCodeHash": "0x9993c85445b4a00153d7bbfb8259d920d0b1b6c9fd557c65ad8df47119e55275"
+    "initCodeHash": "0x5d1d1c0c3cc2171832438cbafb6e55c142eab43a7d7ea09ee818a7e3c50d9314",
+    "sourceCodeHash": "0x440d299b7429c44f6faa4005b33428f9edc1283027d9c78a63eb3d76452bfa47"
   },
   "src/L2/L2ERC721Bridge.sol": {
     "initCodeHash": "0xcafa012b2d8f1bb05c11cbbff9749c0fe6f995c9afb1d26d2d71f03384e34a22",
     "sourceCodeHash": "0xa7646a588275046f92525ef121e5a0fe149e7752ea51fe62f7e0686a21153542"
   },
   "src/L2/L2StandardBridge.sol": {
-    "initCodeHash": "0xe16aed4fc021c768d0ebcb8bb83db7cfe6b062663d034df9f351cdc6af2e5077",
-    "sourceCodeHash": "0xc86e370a8cd1277b203d18df154a50aed16b27156b755e6bd6672d068d44b9f2"
+    "initCodeHash": "0xdfe717975f7c76e80201f715a0d68f3fef02beca6a9e0f378a115e175c6a5944",
+    "sourceCodeHash": "0xb4a9f333f04008f610eb55fa6ff7e610bab340d53156cb50ec65a575c9576b0e"
   },
   "src/L2/L2ToL1MessagePasser.sol": {
     "initCodeHash": "0x08bbede75cd6dfd076903b8f04d24f82fa7881576c135825098778632e37eebc",
     "sourceCodeHash": "0x8388b9b8075f31d580fed815b66b45394e40fb1a63cd8cda2272d2c390fc908c"
   },
+  "src/L2/L2ToL2CrossDomainMessenger.sol": {
+    "initCodeHash": "0x975a4b620e71a1cacd5078972c5e042d010b01e52d0ccd17934cbc7c9890f23b",
+    "sourceCodeHash": "0x249218d69909750f5245a42d247a789f1837c24863bded94dc577fcbec914175"
+  },
   "src/L2/SequencerFeeVault.sol": {
     "initCodeHash": "0xd62e193d89b1661d34031227a45ce1eade9c2a89b0bd7f362f511d03cceef294",
     "sourceCodeHash": "0xa304b4b556162323d69662b4dd9a1d073d55ec661494465489bb67f1e465e7b3"
   },
+  "src/L2/WETH.sol": {
+    "initCodeHash": "0xde72ae96910e95249623c2d695749847e4c4adeaf96a7a35033afd77318a528a",
+    "sourceCodeHash": "0xbe200a6cb297a3ca1a7d174a9c886e3f17eb8edf617ad014a2ac4f6c2e2ac7f1"
+  },
+  "src/Safe/DeputyGuardianModule.sol": {
+    "initCodeHash": "0x433eb7488e613a51c7ff05a76bbecf47f5beac8b8614f5c50001f99e39ae7ed2",
+    "sourceCodeHash": "0x5b415dc432a83fb1d5c41585539245997c62acb6bd77c489bf57e9b59be5f983"
+  },
   "src/Safe/LivenessGuard.sol": {
-    "initCodeHash": "0x16ec47f0888391638814047a1735dbac849b48e256b2e20182bbb3186d950a3c",
-    "sourceCodeHash": "0x9633cea9b66077e222f470439fe3e9a31f3e33b4f7a5618374c44310fd234b24"
+    "initCodeHash": "0xf54289de5cef7ba0044e0d63310937fa231d6528aac91e13e531c845af42afac",
+    "sourceCodeHash": "0xea3872d8f196ae3c863363dfa4b57803cb2a24b0c100244d8f861891e901e03f"
   },
   "src/Safe/LivenessModule.sol": {
-    "initCodeHash": "0x0da844fb4dd22f252ff631524f01f45edf43bca7558fe45f71d711b79af01742",
-    "sourceCodeHash": "0x1afb1d392e8f6a58ff86ea7f648e0d1756d4ba8d0d964279d58a390deaa53b7e"
+    "initCodeHash": "0xde144889fe7d98dbf300a98f5331edd535086a4af8ae6d88ca190c7f4c754a2d",
+    "sourceCodeHash": "0x3ff4a3f21202478935412d47fd5ef7f94a170402ddc50e5c062013ce5544c83f"
   },
   "src/cannon/MIPS.sol": {
-    "initCodeHash": "0xaf2ac814f64ccf12e9c6738db7cef865f51f9e39f39105adef9fba11465f6ee1",
-    "sourceCodeHash": "0x6ab593a4b87007c000c254b2c4ff0507683600f48b60e453148e44bee30030f6"
+    "initCodeHash": "0xa5d36fc67170ad87322f358f612695f642757bbf5280800d5d878da21402579a",
+    "sourceCodeHash": "0x75701f3efb7a9c16079ba0a4ed2867999aab7d95bfa0fe5ebb131cfc278593aa"
   },
   "src/cannon/PreimageOracle.sol": {
-    "initCodeHash": "0x9e0d25588d96934044c6f20b62b21444d734c85fe86b305efd8d226024e92725",
-    "sourceCodeHash": "0xa2d7d5a1de4159a41ff99c2f05d33b9b472c2d00ea62f817b372988f56650153"
+    "initCodeHash": "0xe5db668fe41436f53995e910488c7c140766ba8745e19743773ebab508efd090",
+    "sourceCodeHash": "0x7c8b26cd263f6be144bace1f3faf0ec9265df0efb68ac34fa1fa7df7f608ab42"
+  },
+  "src/dispute/AnchorStateRegistry.sol": {
+    "initCodeHash": "0x0305c21e50829b9e07d43358d8c2c82f1449534c90d4391400d46e76d0503a49",
+    "sourceCodeHash": "0x56b069b33d080c2a45ee6fd340e5c5824ab4dc866eadb5b481b9026ebb12aa7c"
   },
   "src/dispute/DisputeGameFactory.sol": {
-    "initCodeHash": "0x80d749a56c1776930fe0deb5c3c646217716e5875ace99c4d036af0452236476",
-    "sourceCodeHash": "0x1e5a6deded88804971fc1847c9eac65921771bff353437c0b29ed2f55513b984"
+    "initCodeHash": "0x7a7cb8f2c95df2f9afb3ce9eaefe4a6f997ccce7ed8ffda5d425a65a2474a792",
+    "sourceCodeHash": "0x918c395ac5d77357f2551616aad0613e68893862edd14e554623eb16ee6ba148"
   },
   "src/dispute/FaultDisputeGame.sol": {
-    "initCodeHash": "0x9f8e47a4073639af201991a075c7eb03a73055750b3808281e7615b46d47a104",
-    "sourceCodeHash": "0xef3dee1a6dd89270b67c7e6a54862de9d11b9059cf053127bd26704e7e6b1fbf"
+    "initCodeHash": "0x5ea5b544b8d7b32f55f7864c25a2443a5db363ffd1c66e0799cbc7bccaf98526",
+    "sourceCodeHash": "0xe8d90f1a8f92732707e370767df260bc806be5be9808f150ebed2c6caa158734"
   },
   "src/dispute/weth/DelayedWETH.sol": {
-    "initCodeHash": "0xf812f5a6de97162b48ccc847ff64c3be4ba575f1325d6e08fbf9dda91a7dc4c2",
-    "sourceCodeHash": "0xa03df86dee2d365cef7d0e3db78130c785069ee1c44fb8cb78f3746164793be2"
+    "initCodeHash": "0xb9bbe005874922cd8f499e7a0a092967cfca03e012c1e41912b0c77481c71777",
+    "sourceCodeHash": "0x87d00995773d34cc28e81559f4cc5f25890d924df285ec6e9e01b5277f52a9dc"
   },
   "src/legacy/DeployerWhitelist.sol": {
     "initCodeHash": "0x8de80fb23b26dd9d849f6328e56ea7c173cd9e9ce1f05c9beea559d1720deb3d",
diff --git a/packages/contracts-bedrock/snapshots/abi/AdminFaucetAuthModule.json b/packages/contracts-bedrock/snapshots/abi/AdminFaucetAuthModule.json
index 7c2112223259..fc0dbd595b1f 100644
--- a/packages/contracts-bedrock/snapshots/abi/AdminFaucetAuthModule.json
+++ b/packages/contracts-bedrock/snapshots/abi/AdminFaucetAuthModule.json
@@ -55,10 +55,20 @@
             "name": "recipient",
             "type": "address"
           },
+          {
+            "internalType": "bytes",
+            "name": "data",
+            "type": "bytes"
+          },
           {
             "internalType": "bytes32",
             "name": "nonce",
             "type": "bytes32"
+          },
+          {
+            "internalType": "uint32",
+            "name": "gasLimit",
+            "type": "uint32"
           }
         ],
         "internalType": "struct Faucet.DripParameters",
diff --git a/packages/contracts-bedrock/snapshots/abi/AnchorStateRegistry.json b/packages/contracts-bedrock/snapshots/abi/AnchorStateRegistry.json
new file mode 100644
index 000000000000..37ddc45a0ae2
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/abi/AnchorStateRegistry.json
@@ -0,0 +1,120 @@
+[
+  {
+    "inputs": [
+      {
+        "internalType": "contract IDisputeGameFactory",
+        "name": "_disputeGameFactory",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "nonpayable",
+    "type": "constructor"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "GameType",
+        "name": "",
+        "type": "uint32"
+      }
+    ],
+    "name": "anchors",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "root",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint256",
+        "name": "l2BlockNumber",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "disputeGameFactory",
+    "outputs": [
+      {
+        "internalType": "contract IDisputeGameFactory",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "components": [
+          {
+            "internalType": "GameType",
+            "name": "gameType",
+            "type": "uint32"
+          },
+          {
+            "components": [
+              {
+                "internalType": "Hash",
+                "name": "root",
+                "type": "bytes32"
+              },
+              {
+                "internalType": "uint256",
+                "name": "l2BlockNumber",
+                "type": "uint256"
+              }
+            ],
+            "internalType": "struct OutputRoot",
+            "name": "outputRoot",
+            "type": "tuple"
+          }
+        ],
+        "internalType": "struct AnchorStateRegistry.StartingAnchorRoot[]",
+        "name": "_startingAnchorRoots",
+        "type": "tuple[]"
+      }
+    ],
+    "name": "initialize",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "tryUpdateAnchorState",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "version",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": false,
+        "internalType": "uint8",
+        "name": "version",
+        "type": "uint8"
+      }
+    ],
+    "name": "Initialized",
+    "type": "event"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/BlockOracle.json b/packages/contracts-bedrock/snapshots/abi/BlockOracle.json
deleted file mode 100644
index 1b888772334c..000000000000
--- a/packages/contracts-bedrock/snapshots/abi/BlockOracle.json
+++ /dev/null
@@ -1,89 +0,0 @@
-[
-  {
-    "inputs": [],
-    "name": "checkpoint",
-    "outputs": [
-      {
-        "internalType": "uint256",
-        "name": "blockNumber_",
-        "type": "uint256"
-      }
-    ],
-    "stateMutability": "nonpayable",
-    "type": "function"
-  },
-  {
-    "inputs": [
-      {
-        "internalType": "uint256",
-        "name": "_blockNumber",
-        "type": "uint256"
-      }
-    ],
-    "name": "load",
-    "outputs": [
-      {
-        "components": [
-          {
-            "internalType": "Hash",
-            "name": "hash",
-            "type": "bytes32"
-          },
-          {
-            "internalType": "Timestamp",
-            "name": "childTimestamp",
-            "type": "uint64"
-          }
-        ],
-        "internalType": "struct BlockOracle.BlockInfo",
-        "name": "blockInfo_",
-        "type": "tuple"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
-  {
-    "inputs": [],
-    "name": "version",
-    "outputs": [
-      {
-        "internalType": "string",
-        "name": "",
-        "type": "string"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
-  {
-    "anonymous": false,
-    "inputs": [
-      {
-        "indexed": true,
-        "internalType": "uint256",
-        "name": "blockNumber",
-        "type": "uint256"
-      },
-      {
-        "indexed": true,
-        "internalType": "Hash",
-        "name": "blockHash",
-        "type": "bytes32"
-      },
-      {
-        "indexed": true,
-        "internalType": "Timestamp",
-        "name": "childTimestamp",
-        "type": "uint64"
-      }
-    ],
-    "name": "Checkpoint",
-    "type": "event"
-  },
-  {
-    "inputs": [],
-    "name": "BlockHashNotPresent",
-    "type": "error"
-  }
-]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/CheckSecrets.json b/packages/contracts-bedrock/snapshots/abi/CheckSecrets.json
new file mode 100644
index 000000000000..b0be49aadd11
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/abi/CheckSecrets.json
@@ -0,0 +1,102 @@
+[
+  {
+    "inputs": [
+      {
+        "internalType": "bytes",
+        "name": "_params",
+        "type": "bytes"
+      }
+    ],
+    "name": "check",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "execute_",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "bytes",
+        "name": "_secret",
+        "type": "bytes"
+      }
+    ],
+    "name": "reveal",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "name": "revealedSecrets",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "bytes32",
+        "name": "secretHash",
+        "type": "bytes32"
+      },
+      {
+        "indexed": false,
+        "internalType": "bytes",
+        "name": "secret",
+        "type": "bytes"
+      }
+    ],
+    "name": "SecretRevealed",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "components": [
+          {
+            "internalType": "uint256",
+            "name": "delay",
+            "type": "uint256"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "secretHashMustExist",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "secretHashMustNotExist",
+            "type": "bytes32"
+          }
+        ],
+        "indexed": false,
+        "internalType": "struct CheckSecrets.Params",
+        "name": "params",
+        "type": "tuple"
+      }
+    ],
+    "name": "_EventToExposeStructInABI__Params",
+    "type": "event"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/CrossL2Inbox.json b/packages/contracts-bedrock/snapshots/abi/CrossL2Inbox.json
new file mode 100644
index 000000000000..c1aae9a8687a
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/abi/CrossL2Inbox.json
@@ -0,0 +1,169 @@
+[
+  {
+    "inputs": [],
+    "name": "blockNumber",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "chainId",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "components": [
+          {
+            "internalType": "address",
+            "name": "origin",
+            "type": "address"
+          },
+          {
+            "internalType": "uint256",
+            "name": "blockNumber",
+            "type": "uint256"
+          },
+          {
+            "internalType": "uint256",
+            "name": "logIndex",
+            "type": "uint256"
+          },
+          {
+            "internalType": "uint256",
+            "name": "timestamp",
+            "type": "uint256"
+          },
+          {
+            "internalType": "uint256",
+            "name": "chainId",
+            "type": "uint256"
+          }
+        ],
+        "internalType": "struct ICrossL2Inbox.Identifier",
+        "name": "_id",
+        "type": "tuple"
+      },
+      {
+        "internalType": "address",
+        "name": "_target",
+        "type": "address"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_message",
+        "type": "bytes"
+      }
+    ],
+    "name": "executeMessage",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "logIndex",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "origin",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "timestamp",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "version",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": false,
+        "internalType": "bytes",
+        "name": "encodedId",
+        "type": "bytes"
+      },
+      {
+        "indexed": false,
+        "internalType": "bytes",
+        "name": "message",
+        "type": "bytes"
+      }
+    ],
+    "name": "ExecutingMessage",
+    "type": "event"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidChainId",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidTimestamp",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "NotEntered",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "TargetCallFailed",
+    "type": "error"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/DelayedWETH.json b/packages/contracts-bedrock/snapshots/abi/DelayedWETH.json
index ef58fc35f123..fe4fd5b63f61 100644
--- a/packages/contracts-bedrock/snapshots/abi/DelayedWETH.json
+++ b/packages/contracts-bedrock/snapshots/abi/DelayedWETH.json
@@ -10,6 +10,10 @@
     "stateMutability": "nonpayable",
     "type": "constructor"
   },
+  {
+    "stateMutability": "payable",
+    "type": "fallback"
+  },
   {
     "stateMutability": "payable",
     "type": "receive"
diff --git a/packages/contracts-bedrock/snapshots/abi/DeputyGuardianModule.json b/packages/contracts-bedrock/snapshots/abi/DeputyGuardianModule.json
new file mode 100644
index 000000000000..643273921771
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/abi/DeputyGuardianModule.json
@@ -0,0 +1,192 @@
+[
+  {
+    "inputs": [
+      {
+        "internalType": "contract GnosisSafe",
+        "name": "_safe",
+        "type": "address"
+      },
+      {
+        "internalType": "contract SuperchainConfig",
+        "name": "_superchainConfig",
+        "type": "address"
+      },
+      {
+        "internalType": "address",
+        "name": "_deputyGuardian",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "nonpayable",
+    "type": "constructor"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "contract OptimismPortal2",
+        "name": "_portal",
+        "type": "address"
+      },
+      {
+        "internalType": "contract IDisputeGame",
+        "name": "_game",
+        "type": "address"
+      }
+    ],
+    "name": "blacklistDisputeGame",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "deputyGuardian",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "deputyGuardian_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "pause",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "safe",
+    "outputs": [
+      {
+        "internalType": "contract GnosisSafe",
+        "name": "safe_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "contract OptimismPortal2",
+        "name": "_portal",
+        "type": "address"
+      },
+      {
+        "internalType": "GameType",
+        "name": "_gameType",
+        "type": "uint32"
+      }
+    ],
+    "name": "setRespectedGameType",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "superchainConfig",
+    "outputs": [
+      {
+        "internalType": "contract SuperchainConfig",
+        "name": "superchainConfig_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "unpause",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "version",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "contract IDisputeGame",
+        "name": "game",
+        "type": "address"
+      }
+    ],
+    "name": "DisputeGameBlacklisted",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": false,
+        "internalType": "string",
+        "name": "identifier",
+        "type": "string"
+      }
+    ],
+    "name": "Paused",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "GameType",
+        "name": "gameType",
+        "type": "uint32"
+      },
+      {
+        "indexed": true,
+        "internalType": "Timestamp",
+        "name": "updatedAt",
+        "type": "uint64"
+      }
+    ],
+    "name": "RespectedGameTypeSet",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [],
+    "name": "Unpaused",
+    "type": "event"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "string",
+        "name": "",
+        "type": "string"
+      }
+    ],
+    "name": "ExecutionFailed",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "Unauthorized",
+    "type": "error"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/DisputeGameFactory.json b/packages/contracts-bedrock/snapshots/abi/DisputeGameFactory.json
index 01de0ce1b0a1..d4ae9165f9d7 100644
--- a/packages/contracts-bedrock/snapshots/abi/DisputeGameFactory.json
+++ b/packages/contracts-bedrock/snapshots/abi/DisputeGameFactory.json
@@ -435,7 +435,7 @@
   },
   {
     "inputs": [],
-    "name": "InsufficientBond",
+    "name": "IncorrectBondAmount",
     "type": "error"
   },
   {
diff --git a/packages/contracts-bedrock/snapshots/abi/Faucet.json b/packages/contracts-bedrock/snapshots/abi/Faucet.json
index f943faed8283..79cdc8315398 100644
--- a/packages/contracts-bedrock/snapshots/abi/Faucet.json
+++ b/packages/contracts-bedrock/snapshots/abi/Faucet.json
@@ -76,10 +76,20 @@
             "name": "recipient",
             "type": "address"
           },
+          {
+            "internalType": "bytes",
+            "name": "data",
+            "type": "bytes"
+          },
           {
             "internalType": "bytes32",
             "name": "nonce",
             "type": "bytes32"
+          },
+          {
+            "internalType": "uint32",
+            "name": "gasLimit",
+            "type": "uint32"
           }
         ],
         "internalType": "struct Faucet.DripParameters",
diff --git a/packages/contracts-bedrock/snapshots/abi/FaultDisputeGame.json b/packages/contracts-bedrock/snapshots/abi/FaultDisputeGame.json
index 563e447d816f..e9527c8a4f44 100644
--- a/packages/contracts-bedrock/snapshots/abi/FaultDisputeGame.json
+++ b/packages/contracts-bedrock/snapshots/abi/FaultDisputeGame.json
@@ -11,16 +11,6 @@
         "name": "_absolutePrestate",
         "type": "bytes32"
       },
-      {
-        "internalType": "uint256",
-        "name": "_genesisBlockNumber",
-        "type": "uint256"
-      },
-      {
-        "internalType": "Hash",
-        "name": "_genesisOutputRoot",
-        "type": "bytes32"
-      },
       {
         "internalType": "uint256",
         "name": "_maxGameDepth",
@@ -33,7 +23,12 @@
       },
       {
         "internalType": "Duration",
-        "name": "_gameDuration",
+        "name": "_clockExtension",
+        "type": "uint64"
+      },
+      {
+        "internalType": "Duration",
+        "name": "_maxClockDuration",
         "type": "uint64"
       },
       {
@@ -46,6 +41,11 @@
         "name": "_weth",
         "type": "address"
       },
+      {
+        "internalType": "contract IAnchorStateRegistry",
+        "name": "_anchorStateRegistry",
+        "type": "address"
+      },
       {
         "internalType": "uint256",
         "name": "_l2ChainId",
@@ -55,14 +55,6 @@
     "stateMutability": "nonpayable",
     "type": "constructor"
   },
-  {
-    "stateMutability": "payable",
-    "type": "fallback"
-  },
-  {
-    "stateMutability": "payable",
-    "type": "receive"
-  },
   {
     "inputs": [],
     "name": "absolutePrestate",
@@ -99,8 +91,26 @@
     "stateMutability": "nonpayable",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "anchorStateRegistry",
+    "outputs": [
+      {
+        "internalType": "contract IAnchorStateRegistry",
+        "name": "registry_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [
+      {
+        "internalType": "Claim",
+        "name": "_disputed",
+        "type": "bytes32"
+      },
       {
         "internalType": "uint256",
         "name": "_parentIndex",
@@ -117,6 +127,46 @@
     "stateMutability": "payable",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "components": [
+          {
+            "internalType": "bytes32",
+            "name": "version",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "stateRoot",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "messagePasserStorageRoot",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "latestBlockhash",
+            "type": "bytes32"
+          }
+        ],
+        "internalType": "struct Types.OutputRootProof",
+        "name": "_outputRootProof",
+        "type": "tuple"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_headerRLP",
+        "type": "bytes"
+      }
+    ],
+    "name": "challengeRootL2Block",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
   {
     "inputs": [
       {
@@ -192,17 +242,36 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "Hash",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "name": "claims",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
-    "name": "claimedBondFlag",
+    "name": "clockExtension",
     "outputs": [
       {
-        "internalType": "uint128",
-        "name": "claimedBondFlag_",
-        "type": "uint128"
+        "internalType": "Duration",
+        "name": "clockExtension_",
+        "type": "uint64"
       }
     ],
-    "stateMutability": "pure",
+    "stateMutability": "view",
     "type": "function"
   },
   {
@@ -239,6 +308,11 @@
   },
   {
     "inputs": [
+      {
+        "internalType": "Claim",
+        "name": "_disputed",
+        "type": "bytes32"
+      },
       {
         "internalType": "uint256",
         "name": "_parentIndex",
@@ -268,6 +342,19 @@
     "stateMutability": "pure",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "gameCreator",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "creator_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "gameData",
@@ -291,19 +378,6 @@
     "stateMutability": "view",
     "type": "function"
   },
-  {
-    "inputs": [],
-    "name": "gameDuration",
-    "outputs": [
-      {
-        "internalType": "Duration",
-        "name": "gameDuration_",
-        "type": "uint64"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
   {
     "inputs": [],
     "name": "gameType",
@@ -318,26 +392,38 @@
     "type": "function"
   },
   {
-    "inputs": [],
-    "name": "genesisBlockNumber",
-    "outputs": [
+    "inputs": [
       {
         "internalType": "uint256",
-        "name": "genesisBlockNumber_",
+        "name": "_claimIndex",
         "type": "uint256"
       }
     ],
+    "name": "getChallengerDuration",
+    "outputs": [
+      {
+        "internalType": "Duration",
+        "name": "duration_",
+        "type": "uint64"
+      }
+    ],
     "stateMutability": "view",
     "type": "function"
   },
   {
-    "inputs": [],
-    "name": "genesisOutputRoot",
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_claimIndex",
+        "type": "uint256"
+      }
+    ],
+    "name": "getNumToResolve",
     "outputs": [
       {
-        "internalType": "Hash",
-        "name": "genesisOutputRoot_",
-        "type": "bytes32"
+        "internalType": "uint256",
+        "name": "numRemainingChildren_",
+        "type": "uint256"
       }
     ],
     "stateMutability": "view",
@@ -395,6 +481,32 @@
     "stateMutability": "pure",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "l2BlockNumberChallenged",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l2BlockNumberChallenger",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "l2ChainId",
@@ -408,6 +520,19 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "maxClockDuration",
+    "outputs": [
+      {
+        "internalType": "Duration",
+        "name": "maxClockDuration_",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "maxGameDepth",
@@ -423,6 +548,11 @@
   },
   {
     "inputs": [
+      {
+        "internalType": "Claim",
+        "name": "_disputed",
+        "type": "bytes32"
+      },
       {
         "internalType": "uint256",
         "name": "_challengeIndex",
@@ -444,6 +574,40 @@
     "stateMutability": "payable",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "resolutionCheckpoints",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "initialCheckpointComplete",
+        "type": "bool"
+      },
+      {
+        "internalType": "uint32",
+        "name": "subgameIndex",
+        "type": "uint32"
+      },
+      {
+        "internalType": "Position",
+        "name": "leftmostPosition",
+        "type": "uint128"
+      },
+      {
+        "internalType": "address",
+        "name": "counteredBy",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "resolve",
@@ -463,11 +627,16 @@
         "internalType": "uint256",
         "name": "_claimIndex",
         "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_numToResolve",
+        "type": "uint256"
       }
     ],
     "name": "resolveClaim",
     "outputs": [],
-    "stateMutability": "payable",
+    "stateMutability": "nonpayable",
     "type": "function"
   },
   {
@@ -483,6 +652,25 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "resolvedSubgames",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "rootClaim",
@@ -509,6 +697,50 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "startingBlockNumber",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "startingBlockNumber_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingOutputRoot",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "root",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint256",
+        "name": "l2BlockNumber",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingRootHash",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "startingRootHash_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "status",
@@ -550,6 +782,30 @@
     "stateMutability": "nonpayable",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "subgames",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "version",
@@ -632,6 +888,16 @@
     "name": "AlreadyInitialized",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "AnchorRootNotFound",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "BlockNumberMatches",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "BondTransferFailed",
@@ -667,11 +933,21 @@
     "name": "ClockTimeExceeded",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "ContentLengthMismatch",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "DuplicateStep",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "EmptyItem",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "GameDepthExceeded",
@@ -684,7 +960,32 @@
   },
   {
     "inputs": [],
-    "name": "InsufficientBond",
+    "name": "IncorrectBondAmount",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidClockExtension",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidDataRemainder",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidDisputedClaimIndex",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidHeader",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidHeaderRLP",
     "type": "error"
   },
   {
@@ -692,6 +993,11 @@
     "name": "InvalidLocalIdent",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "InvalidOutputRootProof",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "InvalidParent",
@@ -707,6 +1013,16 @@
     "name": "InvalidSplitDepth",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "L2BlockNumberChallenged",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "MaxDepthTooLarge",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "NoCreditToClaim",
@@ -717,6 +1033,11 @@
     "name": "OutOfOrderResolution",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "UnexpectedList",
+    "type": "error"
+  },
   {
     "inputs": [
       {
@@ -728,6 +1049,11 @@
     "name": "UnexpectedRootClaim",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "UnexpectedString",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "ValidStep",
diff --git a/packages/contracts-bedrock/snapshots/abi/GasPriceOracle.json b/packages/contracts-bedrock/snapshots/abi/GasPriceOracle.json
index 8689547c919f..cf3503023594 100644
--- a/packages/contracts-bedrock/snapshots/abi/GasPriceOracle.json
+++ b/packages/contracts-bedrock/snapshots/abi/GasPriceOracle.json
@@ -109,6 +109,25 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_unsignedTxSize",
+        "type": "uint256"
+      }
+    ],
+    "name": "getL1FeeUpperBound",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [
       {
@@ -141,6 +160,19 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "isFjord",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "l1BaseFee",
@@ -187,6 +219,13 @@
     "stateMutability": "nonpayable",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "setFjord",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "version",
diff --git a/packages/contracts-bedrock/snapshots/abi/L1Block.json b/packages/contracts-bedrock/snapshots/abi/L1Block.json
index cb7b3029bfef..020c9e942c75 100644
--- a/packages/contracts-bedrock/snapshots/abi/L1Block.json
+++ b/packages/contracts-bedrock/snapshots/abi/L1Block.json
@@ -5,11 +5,11 @@
     "outputs": [
       {
         "internalType": "address",
-        "name": "",
+        "name": "addr_",
         "type": "address"
       }
     ],
-    "stateMutability": "view",
+    "stateMutability": "pure",
     "type": "function"
   },
   {
@@ -77,6 +77,50 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "gasPayingToken",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      },
+      {
+        "internalType": "uint8",
+        "name": "decimals_",
+        "type": "uint8"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gasPayingTokenName",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "name_",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gasPayingTokenSymbol",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "symbol_",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "hash",
@@ -90,6 +134,19 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "isCustomGasToken",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "l1FeeOverhead",
@@ -142,6 +199,34 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "_token",
+        "type": "address"
+      },
+      {
+        "internalType": "uint8",
+        "name": "_decimals",
+        "type": "uint8"
+      },
+      {
+        "internalType": "bytes32",
+        "name": "_name",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "bytes32",
+        "name": "_symbol",
+        "type": "bytes32"
+      }
+    ],
+    "name": "setGasPayingToken",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
   {
     "inputs": [
       {
@@ -220,7 +305,43 @@
         "type": "string"
       }
     ],
-    "stateMutability": "view",
+    "stateMutability": "pure",
     "type": "function"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "token",
+        "type": "address"
+      },
+      {
+        "indexed": true,
+        "internalType": "uint8",
+        "name": "decimals",
+        "type": "uint8"
+      },
+      {
+        "indexed": false,
+        "internalType": "bytes32",
+        "name": "name",
+        "type": "bytes32"
+      },
+      {
+        "indexed": false,
+        "internalType": "bytes32",
+        "name": "symbol",
+        "type": "bytes32"
+      }
+    ],
+    "name": "GasPayingTokenSet",
+    "type": "event"
+  },
+  {
+    "inputs": [],
+    "name": "NotDepositor",
+    "type": "error"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/LegacyERC20ETH.json b/packages/contracts-bedrock/snapshots/abi/L1BlockInterop.json
similarity index 56%
rename from packages/contracts-bedrock/snapshots/abi/LegacyERC20ETH.json
rename to packages/contracts-bedrock/snapshots/abi/L1BlockInterop.json
index f46b0f3acc32..146691aff1a1 100644
--- a/packages/contracts-bedrock/snapshots/abi/LegacyERC20ETH.json
+++ b/packages/contracts-bedrock/snapshots/abi/L1BlockInterop.json
@@ -1,49 +1,33 @@
 [
   {
     "inputs": [],
-    "stateMutability": "nonpayable",
-    "type": "constructor"
-  },
-  {
-    "inputs": [],
-    "name": "BRIDGE",
+    "name": "DEPOSITOR_ACCOUNT",
     "outputs": [
       {
         "internalType": "address",
-        "name": "",
+        "name": "addr_",
         "type": "address"
       }
     ],
-    "stateMutability": "view",
+    "stateMutability": "pure",
     "type": "function"
   },
   {
     "inputs": [],
-    "name": "REMOTE_TOKEN",
+    "name": "baseFeeScalar",
     "outputs": [
       {
-        "internalType": "address",
+        "internalType": "uint32",
         "name": "",
-        "type": "address"
+        "type": "uint32"
       }
     ],
     "stateMutability": "view",
     "type": "function"
   },
   {
-    "inputs": [
-      {
-        "internalType": "address",
-        "name": "owner",
-        "type": "address"
-      },
-      {
-        "internalType": "address",
-        "name": "spender",
-        "type": "address"
-      }
-    ],
-    "name": "allowance",
+    "inputs": [],
+    "name": "basefee",
     "outputs": [
       {
         "internalType": "uint256",
@@ -55,38 +39,21 @@
     "type": "function"
   },
   {
-    "inputs": [
-      {
-        "internalType": "address",
-        "name": "",
-        "type": "address"
-      },
-      {
-        "internalType": "uint256",
-        "name": "",
-        "type": "uint256"
-      }
-    ],
-    "name": "approve",
+    "inputs": [],
+    "name": "batcherHash",
     "outputs": [
       {
-        "internalType": "bool",
+        "internalType": "bytes32",
         "name": "",
-        "type": "bool"
+        "type": "bytes32"
       }
     ],
-    "stateMutability": "nonpayable",
+    "stateMutability": "view",
     "type": "function"
   },
   {
-    "inputs": [
-      {
-        "internalType": "address",
-        "name": "_who",
-        "type": "address"
-      }
-    ],
-    "name": "balanceOf",
+    "inputs": [],
+    "name": "blobBaseFee",
     "outputs": [
       {
         "internalType": "uint256",
@@ -99,38 +66,20 @@
   },
   {
     "inputs": [],
-    "name": "bridge",
+    "name": "blobBaseFeeScalar",
     "outputs": [
       {
-        "internalType": "address",
+        "internalType": "uint32",
         "name": "",
-        "type": "address"
+        "type": "uint32"
       }
     ],
     "stateMutability": "view",
     "type": "function"
   },
-  {
-    "inputs": [
-      {
-        "internalType": "address",
-        "name": "",
-        "type": "address"
-      },
-      {
-        "internalType": "uint256",
-        "name": "",
-        "type": "uint256"
-      }
-    ],
-    "name": "burn",
-    "outputs": [],
-    "stateMutability": "nonpayable",
-    "type": "function"
-  },
   {
     "inputs": [],
-    "name": "decimals",
+    "name": "dependencySetSize",
     "outputs": [
       {
         "internalType": "uint8",
@@ -142,61 +91,57 @@
     "type": "function"
   },
   {
-    "inputs": [
+    "inputs": [],
+    "name": "gasPayingToken",
+    "outputs": [
       {
         "internalType": "address",
-        "name": "",
+        "name": "addr_",
         "type": "address"
       },
       {
-        "internalType": "uint256",
-        "name": "",
-        "type": "uint256"
+        "internalType": "uint8",
+        "name": "decimals_",
+        "type": "uint8"
       }
     ],
-    "name": "decreaseAllowance",
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gasPayingTokenName",
     "outputs": [
       {
-        "internalType": "bool",
-        "name": "",
-        "type": "bool"
+        "internalType": "string",
+        "name": "name_",
+        "type": "string"
       }
     ],
-    "stateMutability": "nonpayable",
+    "stateMutability": "view",
     "type": "function"
   },
   {
-    "inputs": [
-      {
-        "internalType": "address",
-        "name": "",
-        "type": "address"
-      },
-      {
-        "internalType": "uint256",
-        "name": "",
-        "type": "uint256"
-      }
-    ],
-    "name": "increaseAllowance",
+    "inputs": [],
+    "name": "gasPayingTokenSymbol",
     "outputs": [
       {
-        "internalType": "bool",
-        "name": "",
-        "type": "bool"
+        "internalType": "string",
+        "name": "symbol_",
+        "type": "string"
       }
     ],
-    "stateMutability": "nonpayable",
+    "stateMutability": "view",
     "type": "function"
   },
   {
     "inputs": [],
-    "name": "l1Token",
+    "name": "hash",
     "outputs": [
       {
-        "internalType": "address",
+        "internalType": "bytes32",
         "name": "",
-        "type": "address"
+        "type": "bytes32"
       }
     ],
     "stateMutability": "view",
@@ -204,12 +149,12 @@
   },
   {
     "inputs": [],
-    "name": "l2Bridge",
+    "name": "isCustomGasToken",
     "outputs": [
       {
-        "internalType": "address",
+        "internalType": "bool",
         "name": "",
-        "type": "address"
+        "type": "bool"
       }
     ],
     "stateMutability": "view",
@@ -217,30 +162,18 @@
   },
   {
     "inputs": [
-      {
-        "internalType": "address",
-        "name": "",
-        "type": "address"
-      },
       {
         "internalType": "uint256",
-        "name": "",
+        "name": "_chainId",
         "type": "uint256"
       }
     ],
-    "name": "mint",
-    "outputs": [],
-    "stateMutability": "nonpayable",
-    "type": "function"
-  },
-  {
-    "inputs": [],
-    "name": "name",
+    "name": "isInDependencySet",
     "outputs": [
       {
-        "internalType": "string",
+        "internalType": "bool",
         "name": "",
-        "type": "string"
+        "type": "bool"
       }
     ],
     "stateMutability": "view",
@@ -248,44 +181,38 @@
   },
   {
     "inputs": [],
-    "name": "remoteToken",
+    "name": "l1FeeOverhead",
     "outputs": [
       {
-        "internalType": "address",
+        "internalType": "uint256",
         "name": "",
-        "type": "address"
+        "type": "uint256"
       }
     ],
     "stateMutability": "view",
     "type": "function"
   },
   {
-    "inputs": [
-      {
-        "internalType": "bytes4",
-        "name": "_interfaceId",
-        "type": "bytes4"
-      }
-    ],
-    "name": "supportsInterface",
+    "inputs": [],
+    "name": "l1FeeScalar",
     "outputs": [
       {
-        "internalType": "bool",
+        "internalType": "uint256",
         "name": "",
-        "type": "bool"
+        "type": "uint256"
       }
     ],
-    "stateMutability": "pure",
+    "stateMutability": "view",
     "type": "function"
   },
   {
     "inputs": [],
-    "name": "symbol",
+    "name": "number",
     "outputs": [
       {
-        "internalType": "string",
+        "internalType": "uint64",
         "name": "",
-        "type": "string"
+        "type": "uint64"
       }
     ],
     "stateMutability": "view",
@@ -293,12 +220,12 @@
   },
   {
     "inputs": [],
-    "name": "totalSupply",
+    "name": "sequenceNumber",
     "outputs": [
       {
-        "internalType": "uint256",
+        "internalType": "uint64",
         "name": "",
-        "type": "uint256"
+        "type": "uint64"
       }
     ],
     "stateMutability": "view",
@@ -307,54 +234,115 @@
   {
     "inputs": [
       {
-        "internalType": "address",
-        "name": "",
-        "type": "address"
+        "internalType": "enum ConfigType",
+        "name": "_type",
+        "type": "uint8"
       },
       {
-        "internalType": "uint256",
-        "name": "",
-        "type": "uint256"
+        "internalType": "bytes",
+        "name": "_value",
+        "type": "bytes"
       }
     ],
-    "name": "transfer",
-    "outputs": [
+    "name": "setConfig",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
       {
-        "internalType": "bool",
-        "name": "",
-        "type": "bool"
+        "internalType": "address",
+        "name": "_token",
+        "type": "address"
+      },
+      {
+        "internalType": "uint8",
+        "name": "_decimals",
+        "type": "uint8"
+      },
+      {
+        "internalType": "bytes32",
+        "name": "_name",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "bytes32",
+        "name": "_symbol",
+        "type": "bytes32"
       }
     ],
+    "name": "setGasPayingToken",
+    "outputs": [],
     "stateMutability": "nonpayable",
     "type": "function"
   },
   {
     "inputs": [
       {
-        "internalType": "address",
-        "name": "",
-        "type": "address"
+        "internalType": "uint64",
+        "name": "_number",
+        "type": "uint64"
       },
       {
-        "internalType": "address",
-        "name": "",
-        "type": "address"
+        "internalType": "uint64",
+        "name": "_timestamp",
+        "type": "uint64"
       },
       {
         "internalType": "uint256",
-        "name": "",
+        "name": "_basefee",
+        "type": "uint256"
+      },
+      {
+        "internalType": "bytes32",
+        "name": "_hash",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint64",
+        "name": "_sequenceNumber",
+        "type": "uint64"
+      },
+      {
+        "internalType": "bytes32",
+        "name": "_batcherHash",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_l1FeeOverhead",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_l1FeeScalar",
         "type": "uint256"
       }
     ],
-    "name": "transferFrom",
+    "name": "setL1BlockValues",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "setL1BlockValuesEcotone",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "timestamp",
     "outputs": [
       {
-        "internalType": "bool",
+        "internalType": "uint64",
         "name": "",
-        "type": "bool"
+        "type": "uint64"
       }
     ],
-    "stateMutability": "nonpayable",
+    "stateMutability": "view",
     "type": "function"
   },
   {
@@ -367,7 +355,7 @@
         "type": "string"
       }
     ],
-    "stateMutability": "view",
+    "stateMutability": "pure",
     "type": "function"
   },
   {
@@ -375,24 +363,12 @@
     "inputs": [
       {
         "indexed": true,
-        "internalType": "address",
-        "name": "owner",
-        "type": "address"
-      },
-      {
-        "indexed": true,
-        "internalType": "address",
-        "name": "spender",
-        "type": "address"
-      },
-      {
-        "indexed": false,
         "internalType": "uint256",
-        "name": "value",
+        "name": "chainId",
         "type": "uint256"
       }
     ],
-    "name": "Approval",
+    "name": "DependencyAdded",
     "type": "event"
   },
   {
@@ -400,18 +376,12 @@
     "inputs": [
       {
         "indexed": true,
-        "internalType": "address",
-        "name": "account",
-        "type": "address"
-      },
-      {
-        "indexed": false,
         "internalType": "uint256",
-        "name": "amount",
+        "name": "chainId",
         "type": "uint256"
       }
     ],
-    "name": "Burn",
+    "name": "DependencyRemoved",
     "type": "event"
   },
   {
@@ -420,42 +390,54 @@
       {
         "indexed": true,
         "internalType": "address",
-        "name": "account",
+        "name": "token",
         "type": "address"
       },
-      {
-        "indexed": false,
-        "internalType": "uint256",
-        "name": "amount",
-        "type": "uint256"
-      }
-    ],
-    "name": "Mint",
-    "type": "event"
-  },
-  {
-    "anonymous": false,
-    "inputs": [
       {
         "indexed": true,
-        "internalType": "address",
-        "name": "from",
-        "type": "address"
+        "internalType": "uint8",
+        "name": "decimals",
+        "type": "uint8"
       },
       {
-        "indexed": true,
-        "internalType": "address",
-        "name": "to",
-        "type": "address"
+        "indexed": false,
+        "internalType": "bytes32",
+        "name": "name",
+        "type": "bytes32"
       },
       {
         "indexed": false,
-        "internalType": "uint256",
-        "name": "value",
-        "type": "uint256"
+        "internalType": "bytes32",
+        "name": "symbol",
+        "type": "bytes32"
       }
     ],
-    "name": "Transfer",
+    "name": "GasPayingTokenSet",
     "type": "event"
+  },
+  {
+    "inputs": [],
+    "name": "AlreadyDependency",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "CantRemovedDependency",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "DependencySetSizeTooLarge",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "NotDependency",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "NotDepositor",
+    "type": "error"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/L1CrossDomainMessenger.json b/packages/contracts-bedrock/snapshots/abi/L1CrossDomainMessenger.json
index d330b13b802a..cc99f64c449e 100644
--- a/packages/contracts-bedrock/snapshots/abi/L1CrossDomainMessenger.json
+++ b/packages/contracts-bedrock/snapshots/abi/L1CrossDomainMessenger.json
@@ -188,6 +188,11 @@
         "internalType": "contract OptimismPortal",
         "name": "_portal",
         "type": "address"
+      },
+      {
+        "internalType": "contract SystemConfig",
+        "name": "_systemConfig",
+        "type": "address"
       }
     ],
     "name": "initialize",
@@ -340,6 +345,19 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "systemConfig",
+    "outputs": [
+      {
+        "internalType": "contract SystemConfig",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "version",
diff --git a/packages/contracts-bedrock/snapshots/abi/L1StandardBridge.json b/packages/contracts-bedrock/snapshots/abi/L1StandardBridge.json
index ab658ac7e5b2..2a93a9f8da24 100644
--- a/packages/contracts-bedrock/snapshots/abi/L1StandardBridge.json
+++ b/packages/contracts-bedrock/snapshots/abi/L1StandardBridge.json
@@ -425,6 +425,11 @@
         "internalType": "contract SuperchainConfig",
         "name": "_superchainConfig",
         "type": "address"
+      },
+      {
+        "internalType": "contract SystemConfig",
+        "name": "_systemConfig",
+        "type": "address"
       }
     ],
     "name": "initialize",
@@ -497,6 +502,19 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "systemConfig",
+    "outputs": [
+      {
+        "internalType": "contract SystemConfig",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "version",
diff --git a/packages/contracts-bedrock/snapshots/abi/L2StandardBridge.json b/packages/contracts-bedrock/snapshots/abi/L2StandardBridge.json
index 74a2ae477d98..a73e6038c22a 100644
--- a/packages/contracts-bedrock/snapshots/abi/L2StandardBridge.json
+++ b/packages/contracts-bedrock/snapshots/abi/L2StandardBridge.json
@@ -236,44 +236,6 @@
     "stateMutability": "payable",
     "type": "function"
   },
-  {
-    "inputs": [
-      {
-        "internalType": "address",
-        "name": "_l1Token",
-        "type": "address"
-      },
-      {
-        "internalType": "address",
-        "name": "_l2Token",
-        "type": "address"
-      },
-      {
-        "internalType": "address",
-        "name": "_from",
-        "type": "address"
-      },
-      {
-        "internalType": "address",
-        "name": "_to",
-        "type": "address"
-      },
-      {
-        "internalType": "uint256",
-        "name": "_amount",
-        "type": "uint256"
-      },
-      {
-        "internalType": "bytes",
-        "name": "_extraData",
-        "type": "bytes"
-      }
-    ],
-    "name": "finalizeDeposit",
-    "outputs": [],
-    "stateMutability": "payable",
-    "type": "function"
-  },
   {
     "inputs": [
       {
diff --git a/packages/contracts-bedrock/snapshots/abi/L2ToL2CrossDomainMessenger.json b/packages/contracts-bedrock/snapshots/abi/L2ToL2CrossDomainMessenger.json
new file mode 100644
index 000000000000..f708571aff1c
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/abi/L2ToL2CrossDomainMessenger.json
@@ -0,0 +1,231 @@
+[
+  {
+    "inputs": [],
+    "name": "crossDomainMessageSender",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "_sender",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "crossDomainMessageSource",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "_source",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "messageNonce",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "messageVersion",
+    "outputs": [
+      {
+        "internalType": "uint16",
+        "name": "",
+        "type": "uint16"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_destination",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_source",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_nonce",
+        "type": "uint256"
+      },
+      {
+        "internalType": "address",
+        "name": "_sender",
+        "type": "address"
+      },
+      {
+        "internalType": "address",
+        "name": "_target",
+        "type": "address"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_message",
+        "type": "bytes"
+      }
+    ],
+    "name": "relayMessage",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_destination",
+        "type": "uint256"
+      },
+      {
+        "internalType": "address",
+        "name": "_target",
+        "type": "address"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_message",
+        "type": "bytes"
+      }
+    ],
+    "name": "sendMessage",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "name": "successfulMessages",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "version",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "bytes32",
+        "name": "messageHash",
+        "type": "bytes32"
+      }
+    ],
+    "name": "FailedRelayedMessage",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "bytes32",
+        "name": "messageHash",
+        "type": "bytes32"
+      }
+    ],
+    "name": "RelayedMessage",
+    "type": "event"
+  },
+  {
+    "anonymous": true,
+    "inputs": [
+      {
+        "indexed": false,
+        "internalType": "bytes",
+        "name": "data",
+        "type": "bytes"
+      }
+    ],
+    "name": "SentMessage",
+    "type": "event"
+  },
+  {
+    "inputs": [],
+    "name": "CrossL2InboxOriginNotL2ToL2CrossDomainMessenger",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "MessageAlreadyRelayed",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "MessageDestinationNotRelayChain",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "MessageDestinationSameChain",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "MessageTargetCrossL2Inbox",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "MessageTargetL2ToL2CrossDomainMessenger",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "NotEntered",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ReentrantCall",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "RelayMessageCallerNotCrossL2Inbox",
+    "type": "error"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/LivenessGuard.json b/packages/contracts-bedrock/snapshots/abi/LivenessGuard.json
index e058e21c6b06..53c5bac847d4 100644
--- a/packages/contracts-bedrock/snapshots/abi/LivenessGuard.json
+++ b/packages/contracts-bedrock/snapshots/abi/LivenessGuard.json
@@ -2,7 +2,7 @@
   {
     "inputs": [
       {
-        "internalType": "contract Safe",
+        "internalType": "contract GnosisSafe",
         "name": "_safe",
         "type": "address"
       }
@@ -115,7 +115,7 @@
     "name": "safe",
     "outputs": [
       {
-        "internalType": "contract Safe",
+        "internalType": "contract GnosisSafe",
         "name": "safe_",
         "type": "address"
       }
@@ -130,25 +130,6 @@
     "stateMutability": "nonpayable",
     "type": "function"
   },
-  {
-    "inputs": [
-      {
-        "internalType": "bytes4",
-        "name": "interfaceId",
-        "type": "bytes4"
-      }
-    ],
-    "name": "supportsInterface",
-    "outputs": [
-      {
-        "internalType": "bool",
-        "name": "",
-        "type": "bool"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
   {
     "inputs": [],
     "name": "version",
diff --git a/packages/contracts-bedrock/snapshots/abi/LivenessModule.json b/packages/contracts-bedrock/snapshots/abi/LivenessModule.json
index 48712a307580..5a0a46300725 100644
--- a/packages/contracts-bedrock/snapshots/abi/LivenessModule.json
+++ b/packages/contracts-bedrock/snapshots/abi/LivenessModule.json
@@ -2,7 +2,7 @@
   {
     "inputs": [
       {
-        "internalType": "contract Safe",
+        "internalType": "contract GnosisSafe",
         "name": "_safe",
         "type": "address"
       },
@@ -21,6 +21,11 @@
         "name": "_minOwners",
         "type": "uint256"
       },
+      {
+        "internalType": "uint256",
+        "name": "_thresholdPercentage",
+        "type": "uint256"
+      },
       {
         "internalType": "address",
         "name": "_fallbackOwner",
@@ -70,7 +75,7 @@
         "type": "uint256"
       }
     ],
-    "name": "get75PercentThreshold",
+    "name": "getRequiredThreshold",
     "outputs": [
       {
         "internalType": "uint256",
@@ -78,7 +83,7 @@
         "type": "uint256"
       }
     ],
-    "stateMutability": "pure",
+    "stateMutability": "view",
     "type": "function"
   },
   {
@@ -120,6 +125,19 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "ownershipTransferredToFallback",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [
       {
@@ -143,7 +161,7 @@
     "name": "safe",
     "outputs": [
       {
-        "internalType": "contract Safe",
+        "internalType": "contract GnosisSafe",
         "name": "safe_",
         "type": "address"
       }
@@ -151,6 +169,19 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "thresholdPercentage",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "thresholdPercentage_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "version",
@@ -163,5 +194,35 @@
     ],
     "stateMutability": "view",
     "type": "function"
+  },
+  {
+    "anonymous": false,
+    "inputs": [],
+    "name": "OwnershipTransferredToFallback",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "owner",
+        "type": "address"
+      }
+    ],
+    "name": "RemovedOwner",
+    "type": "event"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "string",
+        "name": "",
+        "type": "string"
+      }
+    ],
+    "name": "OwnerRemovalFailed",
+    "type": "error"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/OptimismPortal.json b/packages/contracts-bedrock/snapshots/abi/OptimismPortal.json
index 538733986580..88531b87da44 100644
--- a/packages/contracts-bedrock/snapshots/abi/OptimismPortal.json
+++ b/packages/contracts-bedrock/snapshots/abi/OptimismPortal.json
@@ -10,41 +10,53 @@
   },
   {
     "inputs": [],
-    "name": "GUARDIAN",
+    "name": "balance",
     "outputs": [
       {
-        "internalType": "address",
+        "internalType": "uint256",
         "name": "",
-        "type": "address"
+        "type": "uint256"
       }
     ],
     "stateMutability": "view",
     "type": "function"
   },
   {
-    "inputs": [],
-    "name": "L2_ORACLE",
-    "outputs": [
+    "inputs": [
       {
-        "internalType": "contract L2OutputOracle",
-        "name": "",
+        "internalType": "address",
+        "name": "_to",
         "type": "address"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
-  {
-    "inputs": [],
-    "name": "SYSTEM_CONFIG",
-    "outputs": [
+      },
       {
-        "internalType": "contract SystemConfig",
-        "name": "",
-        "type": "address"
+        "internalType": "uint256",
+        "name": "_mint",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_value",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint64",
+        "name": "_gasLimit",
+        "type": "uint64"
+      },
+      {
+        "internalType": "bool",
+        "name": "_isCreation",
+        "type": "bool"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_data",
+        "type": "bytes"
       }
     ],
-    "stateMutability": "view",
+    "name": "depositERC20Transaction",
+    "outputs": [],
+    "stateMutability": "nonpayable",
     "type": "function"
   },
   {
@@ -398,6 +410,34 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "_token",
+        "type": "address"
+      },
+      {
+        "internalType": "uint8",
+        "name": "_decimals",
+        "type": "uint8"
+      },
+      {
+        "internalType": "bytes32",
+        "name": "_name",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "bytes32",
+        "name": "_symbol",
+        "type": "bytes32"
+      }
+    ],
+    "name": "setGasPayingToken",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "superchainConfig",
@@ -434,7 +474,7 @@
         "type": "string"
       }
     ],
-    "stateMutability": "view",
+    "stateMutability": "pure",
     "type": "function"
   },
   {
@@ -524,5 +564,90 @@
     ],
     "name": "WithdrawalProven",
     "type": "event"
+  },
+  {
+    "inputs": [],
+    "name": "BadTarget",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "CallPaused",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ContentLengthMismatch",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "EmptyItem",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "GasEstimation",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidDataRemainder",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidHeader",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "LargeCalldata",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "NoValue",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "NonReentrant",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "OnlyCustomGasToken",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "OutOfGas",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "SmallGasLimit",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "TransferFailed",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "Unauthorized",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "UnexpectedList",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "UnexpectedString",
+    "type": "error"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/OptimismPortal2.json b/packages/contracts-bedrock/snapshots/abi/OptimismPortal2.json
index 4f3c67ebd4a1..6fb9255844cc 100644
--- a/packages/contracts-bedrock/snapshots/abi/OptimismPortal2.json
+++ b/packages/contracts-bedrock/snapshots/abi/OptimismPortal2.json
@@ -10,11 +10,6 @@
         "internalType": "uint256",
         "name": "_disputeGameFinalityDelaySeconds",
         "type": "uint256"
-      },
-      {
-        "internalType": "GameType",
-        "name": "_initialRespectedGameType",
-        "type": "uint32"
       }
     ],
     "stateMutability": "nonpayable",
@@ -24,32 +19,6 @@
     "stateMutability": "payable",
     "type": "receive"
   },
-  {
-    "inputs": [],
-    "name": "GUARDIAN",
-    "outputs": [
-      {
-        "internalType": "address",
-        "name": "",
-        "type": "address"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
-  {
-    "inputs": [],
-    "name": "SYSTEM_CONFIG",
-    "outputs": [
-      {
-        "internalType": "contract SystemConfig",
-        "name": "",
-        "type": "address"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
   {
     "inputs": [
       {
@@ -69,6 +38,11 @@
         "internalType": "bytes32",
         "name": "_withdrawalHash",
         "type": "bytes32"
+      },
+      {
+        "internalType": "address",
+        "name": "_proofSubmitter",
+        "type": "address"
       }
     ],
     "name": "checkWithdrawal",
@@ -206,6 +180,56 @@
     "stateMutability": "nonpayable",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "components": [
+          {
+            "internalType": "uint256",
+            "name": "nonce",
+            "type": "uint256"
+          },
+          {
+            "internalType": "address",
+            "name": "sender",
+            "type": "address"
+          },
+          {
+            "internalType": "address",
+            "name": "target",
+            "type": "address"
+          },
+          {
+            "internalType": "uint256",
+            "name": "value",
+            "type": "uint256"
+          },
+          {
+            "internalType": "uint256",
+            "name": "gasLimit",
+            "type": "uint256"
+          },
+          {
+            "internalType": "bytes",
+            "name": "data",
+            "type": "bytes"
+          }
+        ],
+        "internalType": "struct Types.WithdrawalTransaction",
+        "name": "_tx",
+        "type": "tuple"
+      },
+      {
+        "internalType": "address",
+        "name": "_proofSubmitter",
+        "type": "address"
+      }
+    ],
+    "name": "finalizeWithdrawalTransactionExternalProof",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
   {
     "inputs": [
       {
@@ -254,6 +278,11 @@
         "internalType": "contract SuperchainConfig",
         "name": "_superchainConfig",
         "type": "address"
+      },
+      {
+        "internalType": "GameType",
+        "name": "_initialRespectedGameType",
+        "type": "uint32"
       }
     ],
     "name": "initialize",
@@ -293,6 +322,25 @@
     "stateMutability": "pure",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "bytes32",
+        "name": "_withdrawalHash",
+        "type": "bytes32"
+      }
+    ],
+    "name": "numProofSubmitters",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "params",
@@ -342,6 +390,30 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "proofSubmitters",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [
       {
@@ -430,6 +502,11 @@
         "internalType": "bytes32",
         "name": "",
         "type": "bytes32"
+      },
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
       }
     ],
     "name": "provenWithdrawals",
@@ -526,6 +603,19 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "contract IDisputeGame",
+        "name": "disputeGame",
+        "type": "address"
+      }
+    ],
+    "name": "DisputeGameBlacklisted",
+    "type": "event"
+  },
   {
     "anonymous": false,
     "inputs": [
@@ -539,6 +629,25 @@
     "name": "Initialized",
     "type": "event"
   },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "GameType",
+        "name": "newGameType",
+        "type": "uint32"
+      },
+      {
+        "indexed": true,
+        "internalType": "Timestamp",
+        "name": "updatedAt",
+        "type": "uint64"
+      }
+    ],
+    "name": "RespectedGameTypeSet",
+    "type": "event"
+  },
   {
     "anonymous": false,
     "inputs": [
@@ -613,5 +722,89 @@
     ],
     "name": "WithdrawalProven",
     "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "bytes32",
+        "name": "withdrawalHash",
+        "type": "bytes32"
+      },
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "proofSubmitter",
+        "type": "address"
+      }
+    ],
+    "name": "WithdrawalProvenExtension1",
+    "type": "event"
+  },
+  {
+    "inputs": [],
+    "name": "BadTarget",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "CallPaused",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ContentLengthMismatch",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "EmptyItem",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "GasEstimation",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidDataRemainder",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidHeader",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "LargeCalldata",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "OutOfGas",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "SmallGasLimit",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "Unauthorized",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "UnexpectedList",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "UnexpectedString",
+    "type": "error"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/OptimismPortalInterop.json b/packages/contracts-bedrock/snapshots/abi/OptimismPortalInterop.json
new file mode 100644
index 000000000000..36ed78b23ead
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/abi/OptimismPortalInterop.json
@@ -0,0 +1,671 @@
+[
+  {
+    "stateMutability": "payable",
+    "type": "receive"
+  },
+  {
+    "inputs": [],
+    "name": "balance",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "_to",
+        "type": "address"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_mint",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_value",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint64",
+        "name": "_gasLimit",
+        "type": "uint64"
+      },
+      {
+        "internalType": "bool",
+        "name": "_isCreation",
+        "type": "bool"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_data",
+        "type": "bytes"
+      }
+    ],
+    "name": "depositERC20Transaction",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "_to",
+        "type": "address"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_value",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint64",
+        "name": "_gasLimit",
+        "type": "uint64"
+      },
+      {
+        "internalType": "bool",
+        "name": "_isCreation",
+        "type": "bool"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_data",
+        "type": "bytes"
+      }
+    ],
+    "name": "depositTransaction",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "donateETH",
+    "outputs": [],
+    "stateMutability": "payable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "components": [
+          {
+            "internalType": "uint256",
+            "name": "nonce",
+            "type": "uint256"
+          },
+          {
+            "internalType": "address",
+            "name": "sender",
+            "type": "address"
+          },
+          {
+            "internalType": "address",
+            "name": "target",
+            "type": "address"
+          },
+          {
+            "internalType": "uint256",
+            "name": "value",
+            "type": "uint256"
+          },
+          {
+            "internalType": "uint256",
+            "name": "gasLimit",
+            "type": "uint256"
+          },
+          {
+            "internalType": "bytes",
+            "name": "data",
+            "type": "bytes"
+          }
+        ],
+        "internalType": "struct Types.WithdrawalTransaction",
+        "name": "_tx",
+        "type": "tuple"
+      }
+    ],
+    "name": "finalizeWithdrawalTransaction",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "name": "finalizedWithdrawals",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "guardian",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "contract L2OutputOracle",
+        "name": "_l2Oracle",
+        "type": "address"
+      },
+      {
+        "internalType": "contract SystemConfig",
+        "name": "_systemConfig",
+        "type": "address"
+      },
+      {
+        "internalType": "contract SuperchainConfig",
+        "name": "_superchainConfig",
+        "type": "address"
+      }
+    ],
+    "name": "initialize",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_l2OutputIndex",
+        "type": "uint256"
+      }
+    ],
+    "name": "isOutputFinalized",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l2Oracle",
+    "outputs": [
+      {
+        "internalType": "contract L2OutputOracle",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l2Sender",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint64",
+        "name": "_byteCount",
+        "type": "uint64"
+      }
+    ],
+    "name": "minimumGasLimit",
+    "outputs": [
+      {
+        "internalType": "uint64",
+        "name": "",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "params",
+    "outputs": [
+      {
+        "internalType": "uint128",
+        "name": "prevBaseFee",
+        "type": "uint128"
+      },
+      {
+        "internalType": "uint64",
+        "name": "prevBoughtGas",
+        "type": "uint64"
+      },
+      {
+        "internalType": "uint64",
+        "name": "prevBlockNum",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "paused",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "paused_",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "components": [
+          {
+            "internalType": "uint256",
+            "name": "nonce",
+            "type": "uint256"
+          },
+          {
+            "internalType": "address",
+            "name": "sender",
+            "type": "address"
+          },
+          {
+            "internalType": "address",
+            "name": "target",
+            "type": "address"
+          },
+          {
+            "internalType": "uint256",
+            "name": "value",
+            "type": "uint256"
+          },
+          {
+            "internalType": "uint256",
+            "name": "gasLimit",
+            "type": "uint256"
+          },
+          {
+            "internalType": "bytes",
+            "name": "data",
+            "type": "bytes"
+          }
+        ],
+        "internalType": "struct Types.WithdrawalTransaction",
+        "name": "_tx",
+        "type": "tuple"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_l2OutputIndex",
+        "type": "uint256"
+      },
+      {
+        "components": [
+          {
+            "internalType": "bytes32",
+            "name": "version",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "stateRoot",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "messagePasserStorageRoot",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "latestBlockhash",
+            "type": "bytes32"
+          }
+        ],
+        "internalType": "struct Types.OutputRootProof",
+        "name": "_outputRootProof",
+        "type": "tuple"
+      },
+      {
+        "internalType": "bytes[]",
+        "name": "_withdrawalProof",
+        "type": "bytes[]"
+      }
+    ],
+    "name": "proveWithdrawalTransaction",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "name": "provenWithdrawals",
+    "outputs": [
+      {
+        "internalType": "bytes32",
+        "name": "outputRoot",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint128",
+        "name": "timestamp",
+        "type": "uint128"
+      },
+      {
+        "internalType": "uint128",
+        "name": "l2OutputIndex",
+        "type": "uint128"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "enum ConfigType",
+        "name": "_type",
+        "type": "uint8"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_value",
+        "type": "bytes"
+      }
+    ],
+    "name": "setConfig",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "_token",
+        "type": "address"
+      },
+      {
+        "internalType": "uint8",
+        "name": "_decimals",
+        "type": "uint8"
+      },
+      {
+        "internalType": "bytes32",
+        "name": "_name",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "bytes32",
+        "name": "_symbol",
+        "type": "bytes32"
+      }
+    ],
+    "name": "setGasPayingToken",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "superchainConfig",
+    "outputs": [
+      {
+        "internalType": "contract SuperchainConfig",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "systemConfig",
+    "outputs": [
+      {
+        "internalType": "contract SystemConfig",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "version",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": false,
+        "internalType": "uint8",
+        "name": "version",
+        "type": "uint8"
+      }
+    ],
+    "name": "Initialized",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "from",
+        "type": "address"
+      },
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "to",
+        "type": "address"
+      },
+      {
+        "indexed": true,
+        "internalType": "uint256",
+        "name": "version",
+        "type": "uint256"
+      },
+      {
+        "indexed": false,
+        "internalType": "bytes",
+        "name": "opaqueData",
+        "type": "bytes"
+      }
+    ],
+    "name": "TransactionDeposited",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "bytes32",
+        "name": "withdrawalHash",
+        "type": "bytes32"
+      },
+      {
+        "indexed": false,
+        "internalType": "bool",
+        "name": "success",
+        "type": "bool"
+      }
+    ],
+    "name": "WithdrawalFinalized",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "bytes32",
+        "name": "withdrawalHash",
+        "type": "bytes32"
+      },
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "from",
+        "type": "address"
+      },
+      {
+        "indexed": true,
+        "internalType": "address",
+        "name": "to",
+        "type": "address"
+      }
+    ],
+    "name": "WithdrawalProven",
+    "type": "event"
+  },
+  {
+    "inputs": [],
+    "name": "BadTarget",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "CallPaused",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "ContentLengthMismatch",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "EmptyItem",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "GasEstimation",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidDataRemainder",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidHeader",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "LargeCalldata",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "NoValue",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "NonReentrant",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "OnlyCustomGasToken",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "OutOfGas",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "SmallGasLimit",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "TransferFailed",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "Unauthorized",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "Unauthorized",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "UnexpectedList",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "UnexpectedString",
+    "type": "error"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/PermissionedDisputeGame.json b/packages/contracts-bedrock/snapshots/abi/PermissionedDisputeGame.json
index 6d2c23bc3a68..f9849492b8d0 100644
--- a/packages/contracts-bedrock/snapshots/abi/PermissionedDisputeGame.json
+++ b/packages/contracts-bedrock/snapshots/abi/PermissionedDisputeGame.json
@@ -11,16 +11,6 @@
         "name": "_absolutePrestate",
         "type": "bytes32"
       },
-      {
-        "internalType": "uint256",
-        "name": "_genesisBlockNumber",
-        "type": "uint256"
-      },
-      {
-        "internalType": "Hash",
-        "name": "_genesisOutputRoot",
-        "type": "bytes32"
-      },
       {
         "internalType": "uint256",
         "name": "_maxGameDepth",
@@ -33,7 +23,12 @@
       },
       {
         "internalType": "Duration",
-        "name": "_gameDuration",
+        "name": "_clockExtension",
+        "type": "uint64"
+      },
+      {
+        "internalType": "Duration",
+        "name": "_maxClockDuration",
         "type": "uint64"
       },
       {
@@ -46,6 +41,11 @@
         "name": "_weth",
         "type": "address"
       },
+      {
+        "internalType": "contract IAnchorStateRegistry",
+        "name": "_anchorStateRegistry",
+        "type": "address"
+      },
       {
         "internalType": "uint256",
         "name": "_l2ChainId",
@@ -65,14 +65,6 @@
     "stateMutability": "nonpayable",
     "type": "constructor"
   },
-  {
-    "stateMutability": "payable",
-    "type": "fallback"
-  },
-  {
-    "stateMutability": "payable",
-    "type": "receive"
-  },
   {
     "inputs": [],
     "name": "absolutePrestate",
@@ -109,8 +101,26 @@
     "stateMutability": "nonpayable",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "anchorStateRegistry",
+    "outputs": [
+      {
+        "internalType": "contract IAnchorStateRegistry",
+        "name": "registry_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [
+      {
+        "internalType": "Claim",
+        "name": "_disputed",
+        "type": "bytes32"
+      },
       {
         "internalType": "uint256",
         "name": "_parentIndex",
@@ -127,6 +137,59 @@
     "stateMutability": "payable",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "components": [
+          {
+            "internalType": "bytes32",
+            "name": "version",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "stateRoot",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "messagePasserStorageRoot",
+            "type": "bytes32"
+          },
+          {
+            "internalType": "bytes32",
+            "name": "latestBlockhash",
+            "type": "bytes32"
+          }
+        ],
+        "internalType": "struct Types.OutputRootProof",
+        "name": "_outputRootProof",
+        "type": "tuple"
+      },
+      {
+        "internalType": "bytes",
+        "name": "_headerRLP",
+        "type": "bytes"
+      }
+    ],
+    "name": "challengeRootL2Block",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "challenger",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "challenger_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [
       {
@@ -202,17 +265,36 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "Hash",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "name": "claims",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
-    "name": "claimedBondFlag",
+    "name": "clockExtension",
     "outputs": [
       {
-        "internalType": "uint128",
-        "name": "claimedBondFlag_",
-        "type": "uint128"
+        "internalType": "Duration",
+        "name": "clockExtension_",
+        "type": "uint64"
       }
     ],
-    "stateMutability": "pure",
+    "stateMutability": "view",
     "type": "function"
   },
   {
@@ -249,6 +331,11 @@
   },
   {
     "inputs": [
+      {
+        "internalType": "Claim",
+        "name": "_disputed",
+        "type": "bytes32"
+      },
       {
         "internalType": "uint256",
         "name": "_parentIndex",
@@ -278,6 +365,19 @@
     "stateMutability": "pure",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "gameCreator",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "creator_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "gameData",
@@ -301,19 +401,6 @@
     "stateMutability": "view",
     "type": "function"
   },
-  {
-    "inputs": [],
-    "name": "gameDuration",
-    "outputs": [
-      {
-        "internalType": "Duration",
-        "name": "gameDuration_",
-        "type": "uint64"
-      }
-    ],
-    "stateMutability": "view",
-    "type": "function"
-  },
   {
     "inputs": [],
     "name": "gameType",
@@ -328,26 +415,38 @@
     "type": "function"
   },
   {
-    "inputs": [],
-    "name": "genesisBlockNumber",
-    "outputs": [
+    "inputs": [
       {
         "internalType": "uint256",
-        "name": "genesisBlockNumber_",
+        "name": "_claimIndex",
         "type": "uint256"
       }
     ],
+    "name": "getChallengerDuration",
+    "outputs": [
+      {
+        "internalType": "Duration",
+        "name": "duration_",
+        "type": "uint64"
+      }
+    ],
     "stateMutability": "view",
     "type": "function"
   },
   {
-    "inputs": [],
-    "name": "genesisOutputRoot",
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_claimIndex",
+        "type": "uint256"
+      }
+    ],
+    "name": "getNumToResolve",
     "outputs": [
       {
-        "internalType": "Hash",
-        "name": "genesisOutputRoot_",
-        "type": "bytes32"
+        "internalType": "uint256",
+        "name": "numRemainingChildren_",
+        "type": "uint256"
       }
     ],
     "stateMutability": "view",
@@ -405,6 +504,32 @@
     "stateMutability": "pure",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "l2BlockNumberChallenged",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l2BlockNumberChallenger",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "l2ChainId",
@@ -418,6 +543,19 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "maxClockDuration",
+    "outputs": [
+      {
+        "internalType": "Duration",
+        "name": "maxClockDuration_",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "maxGameDepth",
@@ -433,6 +571,11 @@
   },
   {
     "inputs": [
+      {
+        "internalType": "Claim",
+        "name": "_disputed",
+        "type": "bytes32"
+      },
       {
         "internalType": "uint256",
         "name": "_challengeIndex",
@@ -454,6 +597,53 @@
     "stateMutability": "payable",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "proposer",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "proposer_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "resolutionCheckpoints",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "initialCheckpointComplete",
+        "type": "bool"
+      },
+      {
+        "internalType": "uint32",
+        "name": "subgameIndex",
+        "type": "uint32"
+      },
+      {
+        "internalType": "Position",
+        "name": "leftmostPosition",
+        "type": "uint128"
+      },
+      {
+        "internalType": "address",
+        "name": "counteredBy",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "resolve",
@@ -473,11 +663,16 @@
         "internalType": "uint256",
         "name": "_claimIndex",
         "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_numToResolve",
+        "type": "uint256"
       }
     ],
     "name": "resolveClaim",
     "outputs": [],
-    "stateMutability": "payable",
+    "stateMutability": "nonpayable",
     "type": "function"
   },
   {
@@ -493,6 +688,25 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "resolvedSubgames",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "rootClaim",
@@ -519,6 +733,50 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "startingBlockNumber",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "startingBlockNumber_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingOutputRoot",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "root",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint256",
+        "name": "l2BlockNumber",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startingRootHash",
+    "outputs": [
+      {
+        "internalType": "Hash",
+        "name": "startingRootHash_",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "status",
@@ -560,6 +818,30 @@
     "stateMutability": "nonpayable",
     "type": "function"
   },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "name": "subgames",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "version",
@@ -642,11 +924,21 @@
     "name": "AlreadyInitialized",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "AnchorRootNotFound",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "BadAuth",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "BlockNumberMatches",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "BondTransferFailed",
@@ -682,11 +974,21 @@
     "name": "ClockTimeExceeded",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "ContentLengthMismatch",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "DuplicateStep",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "EmptyItem",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "GameDepthExceeded",
@@ -699,7 +1001,32 @@
   },
   {
     "inputs": [],
-    "name": "InsufficientBond",
+    "name": "IncorrectBondAmount",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidClockExtension",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidDataRemainder",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidDisputedClaimIndex",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidHeader",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "InvalidHeaderRLP",
     "type": "error"
   },
   {
@@ -707,6 +1034,11 @@
     "name": "InvalidLocalIdent",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "InvalidOutputRootProof",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "InvalidParent",
@@ -722,6 +1054,16 @@
     "name": "InvalidSplitDepth",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "L2BlockNumberChallenged",
+    "type": "error"
+  },
+  {
+    "inputs": [],
+    "name": "MaxDepthTooLarge",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "NoCreditToClaim",
@@ -732,6 +1074,11 @@
     "name": "OutOfOrderResolution",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "UnexpectedList",
+    "type": "error"
+  },
   {
     "inputs": [
       {
@@ -743,6 +1090,11 @@
     "name": "UnexpectedRootClaim",
     "type": "error"
   },
+  {
+    "inputs": [],
+    "name": "UnexpectedString",
+    "type": "error"
+  },
   {
     "inputs": [],
     "name": "ValidStep",
diff --git a/packages/contracts-bedrock/snapshots/abi/SystemConfig.json b/packages/contracts-bedrock/snapshots/abi/SystemConfig.json
index eb334e29d26c..4b4ddd6c70a1 100644
--- a/packages/contracts-bedrock/snapshots/abi/SystemConfig.json
+++ b/packages/contracts-bedrock/snapshots/abi/SystemConfig.json
@@ -19,7 +19,7 @@
   },
   {
     "inputs": [],
-    "name": "L1_CROSS_DOMAIN_MESSENGER_SLOT",
+    "name": "DISPUTE_GAME_FACTORY_SLOT",
     "outputs": [
       {
         "internalType": "bytes32",
@@ -32,7 +32,7 @@
   },
   {
     "inputs": [],
-    "name": "L1_ERC_721_BRIDGE_SLOT",
+    "name": "L1_CROSS_DOMAIN_MESSENGER_SLOT",
     "outputs": [
       {
         "internalType": "bytes32",
@@ -45,7 +45,7 @@
   },
   {
     "inputs": [],
-    "name": "L1_STANDARD_BRIDGE_SLOT",
+    "name": "L1_ERC_721_BRIDGE_SLOT",
     "outputs": [
       {
         "internalType": "bytes32",
@@ -58,7 +58,7 @@
   },
   {
     "inputs": [],
-    "name": "L2_OUTPUT_ORACLE_SLOT",
+    "name": "L1_STANDARD_BRIDGE_SLOT",
     "outputs": [
       {
         "internalType": "bytes32",
@@ -134,6 +134,19 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "basefeeScalar",
+    "outputs": [
+      {
+        "internalType": "uint32",
+        "name": "",
+        "type": "uint32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "batchInbox",
@@ -160,6 +173,32 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "blobbasefeeScalar",
+    "outputs": [
+      {
+        "internalType": "uint32",
+        "name": "",
+        "type": "uint32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "disputeGameFactory",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "gasLimit",
@@ -173,6 +212,50 @@
     "stateMutability": "view",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "gasPayingToken",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      },
+      {
+        "internalType": "uint8",
+        "name": "decimals_",
+        "type": "uint8"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gasPayingTokenName",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "name_",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gasPayingTokenSymbol",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "symbol_",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [
       {
@@ -181,14 +264,14 @@
         "type": "address"
       },
       {
-        "internalType": "uint256",
-        "name": "_overhead",
-        "type": "uint256"
+        "internalType": "uint32",
+        "name": "_basefeeScalar",
+        "type": "uint32"
       },
       {
-        "internalType": "uint256",
-        "name": "_scalar",
-        "type": "uint256"
+        "internalType": "uint32",
+        "name": "_blobbasefeeScalar",
+        "type": "uint32"
       },
       {
         "internalType": "bytes32",
@@ -266,7 +349,7 @@
           },
           {
             "internalType": "address",
-            "name": "l2OutputOracle",
+            "name": "disputeGameFactory",
             "type": "address"
           },
           {
@@ -278,6 +361,11 @@
             "internalType": "address",
             "name": "optimismMintableERC20Factory",
             "type": "address"
+          },
+          {
+            "internalType": "address",
+            "name": "gasPayingToken",
+            "type": "address"
           }
         ],
         "internalType": "struct SystemConfig.Addresses",
@@ -290,6 +378,19 @@
     "stateMutability": "nonpayable",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "isCustomGasToken",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [],
     "name": "l1CrossDomainMessenger",
@@ -331,15 +432,15 @@
   },
   {
     "inputs": [],
-    "name": "l2OutputOracle",
+    "name": "maximumGasLimit",
     "outputs": [
       {
-        "internalType": "address",
-        "name": "addr_",
-        "type": "address"
+        "internalType": "uint64",
+        "name": "",
+        "type": "uint64"
       }
     ],
-    "stateMutability": "view",
+    "stateMutability": "pure",
     "type": "function"
   },
   {
@@ -506,12 +607,17 @@
   {
     "inputs": [
       {
-        "internalType": "uint64",
-        "name": "_gasLimit",
-        "type": "uint64"
+        "internalType": "uint32",
+        "name": "_basefeeScalar",
+        "type": "uint32"
+      },
+      {
+        "internalType": "uint32",
+        "name": "_blobbasefeeScalar",
+        "type": "uint32"
       }
     ],
-    "name": "setGasLimit",
+    "name": "setGasConfigEcotone",
     "outputs": [],
     "stateMutability": "nonpayable",
     "type": "function"
@@ -519,44 +625,12 @@
   {
     "inputs": [
       {
-        "components": [
-          {
-            "internalType": "uint32",
-            "name": "maxResourceLimit",
-            "type": "uint32"
-          },
-          {
-            "internalType": "uint8",
-            "name": "elasticityMultiplier",
-            "type": "uint8"
-          },
-          {
-            "internalType": "uint8",
-            "name": "baseFeeMaxChangeDenominator",
-            "type": "uint8"
-          },
-          {
-            "internalType": "uint32",
-            "name": "minimumBaseFee",
-            "type": "uint32"
-          },
-          {
-            "internalType": "uint32",
-            "name": "systemTxMaxGas",
-            "type": "uint32"
-          },
-          {
-            "internalType": "uint128",
-            "name": "maximumBaseFee",
-            "type": "uint128"
-          }
-        ],
-        "internalType": "struct ResourceMetering.ResourceConfig",
-        "name": "_config",
-        "type": "tuple"
+        "internalType": "uint64",
+        "name": "_gasLimit",
+        "type": "uint64"
       }
     ],
-    "name": "setResourceConfig",
+    "name": "setGasLimit",
     "outputs": [],
     "stateMutability": "nonpayable",
     "type": "function"
@@ -623,7 +697,7 @@
         "type": "string"
       }
     ],
-    "stateMutability": "view",
+    "stateMutability": "pure",
     "type": "function"
   },
   {
diff --git a/packages/contracts-bedrock/snapshots/abi/SystemConfigInterop.json b/packages/contracts-bedrock/snapshots/abi/SystemConfigInterop.json
new file mode 100644
index 000000000000..a6e2efc89f01
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/abi/SystemConfigInterop.json
@@ -0,0 +1,781 @@
+[
+  {
+    "inputs": [],
+    "name": "BATCH_INBOX_SLOT",
+    "outputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "DISPUTE_GAME_FACTORY_SLOT",
+    "outputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "L1_CROSS_DOMAIN_MESSENGER_SLOT",
+    "outputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "L1_ERC_721_BRIDGE_SLOT",
+    "outputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "L1_STANDARD_BRIDGE_SLOT",
+    "outputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT",
+    "outputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "OPTIMISM_PORTAL_SLOT",
+    "outputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "START_BLOCK_SLOT",
+    "outputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "UNSAFE_BLOCK_SIGNER_SLOT",
+    "outputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "VERSION",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_chainId",
+        "type": "uint256"
+      }
+    ],
+    "name": "addDependency",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "basefeeScalar",
+    "outputs": [
+      {
+        "internalType": "uint32",
+        "name": "",
+        "type": "uint32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "batchInbox",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "batcherHash",
+    "outputs": [
+      {
+        "internalType": "bytes32",
+        "name": "",
+        "type": "bytes32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "blobbasefeeScalar",
+    "outputs": [
+      {
+        "internalType": "uint32",
+        "name": "",
+        "type": "uint32"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "disputeGameFactory",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gasLimit",
+    "outputs": [
+      {
+        "internalType": "uint64",
+        "name": "",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gasPayingToken",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      },
+      {
+        "internalType": "uint8",
+        "name": "decimals_",
+        "type": "uint8"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gasPayingTokenName",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "name_",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "gasPayingTokenSymbol",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "symbol_",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "_owner",
+        "type": "address"
+      },
+      {
+        "internalType": "uint32",
+        "name": "_basefeeScalar",
+        "type": "uint32"
+      },
+      {
+        "internalType": "uint32",
+        "name": "_blobbasefeeScalar",
+        "type": "uint32"
+      },
+      {
+        "internalType": "bytes32",
+        "name": "_batcherHash",
+        "type": "bytes32"
+      },
+      {
+        "internalType": "uint64",
+        "name": "_gasLimit",
+        "type": "uint64"
+      },
+      {
+        "internalType": "address",
+        "name": "_unsafeBlockSigner",
+        "type": "address"
+      },
+      {
+        "components": [
+          {
+            "internalType": "uint32",
+            "name": "maxResourceLimit",
+            "type": "uint32"
+          },
+          {
+            "internalType": "uint8",
+            "name": "elasticityMultiplier",
+            "type": "uint8"
+          },
+          {
+            "internalType": "uint8",
+            "name": "baseFeeMaxChangeDenominator",
+            "type": "uint8"
+          },
+          {
+            "internalType": "uint32",
+            "name": "minimumBaseFee",
+            "type": "uint32"
+          },
+          {
+            "internalType": "uint32",
+            "name": "systemTxMaxGas",
+            "type": "uint32"
+          },
+          {
+            "internalType": "uint128",
+            "name": "maximumBaseFee",
+            "type": "uint128"
+          }
+        ],
+        "internalType": "struct ResourceMetering.ResourceConfig",
+        "name": "_config",
+        "type": "tuple"
+      },
+      {
+        "internalType": "address",
+        "name": "_batchInbox",
+        "type": "address"
+      },
+      {
+        "components": [
+          {
+            "internalType": "address",
+            "name": "l1CrossDomainMessenger",
+            "type": "address"
+          },
+          {
+            "internalType": "address",
+            "name": "l1ERC721Bridge",
+            "type": "address"
+          },
+          {
+            "internalType": "address",
+            "name": "l1StandardBridge",
+            "type": "address"
+          },
+          {
+            "internalType": "address",
+            "name": "disputeGameFactory",
+            "type": "address"
+          },
+          {
+            "internalType": "address",
+            "name": "optimismPortal",
+            "type": "address"
+          },
+          {
+            "internalType": "address",
+            "name": "optimismMintableERC20Factory",
+            "type": "address"
+          },
+          {
+            "internalType": "address",
+            "name": "gasPayingToken",
+            "type": "address"
+          }
+        ],
+        "internalType": "struct SystemConfig.Addresses",
+        "name": "_addresses",
+        "type": "tuple"
+      }
+    ],
+    "name": "initialize",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "isCustomGasToken",
+    "outputs": [
+      {
+        "internalType": "bool",
+        "name": "",
+        "type": "bool"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l1CrossDomainMessenger",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l1ERC721Bridge",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "l1StandardBridge",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "maximumGasLimit",
+    "outputs": [
+      {
+        "internalType": "uint64",
+        "name": "",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "minimumGasLimit",
+    "outputs": [
+      {
+        "internalType": "uint64",
+        "name": "",
+        "type": "uint64"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "optimismMintableERC20Factory",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "optimismPortal",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "overhead",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "owner",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_chainId",
+        "type": "uint256"
+      }
+    ],
+    "name": "removeDependency",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "renounceOwnership",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "resourceConfig",
+    "outputs": [
+      {
+        "components": [
+          {
+            "internalType": "uint32",
+            "name": "maxResourceLimit",
+            "type": "uint32"
+          },
+          {
+            "internalType": "uint8",
+            "name": "elasticityMultiplier",
+            "type": "uint8"
+          },
+          {
+            "internalType": "uint8",
+            "name": "baseFeeMaxChangeDenominator",
+            "type": "uint8"
+          },
+          {
+            "internalType": "uint32",
+            "name": "minimumBaseFee",
+            "type": "uint32"
+          },
+          {
+            "internalType": "uint32",
+            "name": "systemTxMaxGas",
+            "type": "uint32"
+          },
+          {
+            "internalType": "uint128",
+            "name": "maximumBaseFee",
+            "type": "uint128"
+          }
+        ],
+        "internalType": "struct ResourceMetering.ResourceConfig",
+        "name": "",
+        "type": "tuple"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "scalar",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "bytes32",
+        "name": "_batcherHash",
+        "type": "bytes32"
+      }
+    ],
+    "name": "setBatcherHash",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint256",
+        "name": "_overhead",
+        "type": "uint256"
+      },
+      {
+        "internalType": "uint256",
+        "name": "_scalar",
+        "type": "uint256"
+      }
+    ],
+    "name": "setGasConfig",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint32",
+        "name": "_basefeeScalar",
+        "type": "uint32"
+      },
+      {
+        "internalType": "uint32",
+        "name": "_blobbasefeeScalar",
+        "type": "uint32"
+      }
+    ],
+    "name": "setGasConfigEcotone",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "uint64",
+        "name": "_gasLimit",
+        "type": "uint64"
+      }
+    ],
+    "name": "setGasLimit",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "_unsafeBlockSigner",
+        "type": "address"
+      }
+    ],
+    "name": "setUnsafeBlockSigner",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "startBlock",
+    "outputs": [
+      {
+        "internalType": "uint256",
+        "name": "startBlock_",
+        "type": "uint256"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [
+      {
+        "internalType": "address",
+        "name": "newOwner",
+        "type": "address"
+      }
+    ],
+    "name": "transferOwnership",
+    "outputs": [],
+    "stateMutability": "nonpayable",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "unsafeBlockSigner",
+    "outputs": [
+      {
+        "internalType": "address",
+        "name": "addr_",
+        "type": "address"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
+  {
+    "inputs": [],
+    "name": "version",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "pure",
+    "type": "function"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
+        "internalType": "uint256",
+        "name": "version",
+        "type": "uint256"
+      },
+      {
+        "indexed": true,
+        "internalType": "enum SystemConfig.UpdateType",
+        "name": "updateType",
+        "type": "uint8"
+      },
+      {
+        "indexed": false,
+        "internalType": "bytes",
+        "name": "data",
+        "type": "bytes"
+      }
+    ],
+    "name": "ConfigUpdate",
+    "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": "OwnershipTransferred",
+    "type": "event"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/abi/Clone.json b/packages/contracts-bedrock/snapshots/abi/TransientReentrancyAware.json
similarity index 100%
rename from packages/contracts-bedrock/snapshots/abi/Clone.json
rename to packages/contracts-bedrock/snapshots/abi/TransientReentrancyAware.json
diff --git a/packages/contracts-bedrock/snapshots/abi/WETH9.json b/packages/contracts-bedrock/snapshots/abi/WETH.json
similarity index 94%
rename from packages/contracts-bedrock/snapshots/abi/WETH9.json
rename to packages/contracts-bedrock/snapshots/abi/WETH.json
index f2a38a109e8b..9430e99a4c85 100644
--- a/packages/contracts-bedrock/snapshots/abi/WETH9.json
+++ b/packages/contracts-bedrock/snapshots/abi/WETH.json
@@ -3,6 +3,10 @@
     "stateMutability": "payable",
     "type": "fallback"
   },
+  {
+    "stateMutability": "payable",
+    "type": "receive"
+  },
   {
     "inputs": [
       {
@@ -96,7 +100,7 @@
     "outputs": [
       {
         "internalType": "string",
-        "name": "",
+        "name": "name_",
         "type": "string"
       }
     ],
@@ -109,7 +113,7 @@
     "outputs": [
       {
         "internalType": "string",
-        "name": "",
+        "name": "symbol_",
         "type": "string"
       }
     ],
@@ -182,6 +186,19 @@
     "stateMutability": "nonpayable",
     "type": "function"
   },
+  {
+    "inputs": [],
+    "name": "version",
+    "outputs": [
+      {
+        "internalType": "string",
+        "name": "",
+        "type": "string"
+      }
+    ],
+    "stateMutability": "view",
+    "type": "function"
+  },
   {
     "inputs": [
       {
diff --git a/packages/contracts-bedrock/snapshots/abi/WETH98.json b/packages/contracts-bedrock/snapshots/abi/WETH98.json
index f5380edb3e52..364d6b0591dc 100644
--- a/packages/contracts-bedrock/snapshots/abi/WETH98.json
+++ b/packages/contracts-bedrock/snapshots/abi/WETH98.json
@@ -1,4 +1,8 @@
 [
+  {
+    "stateMutability": "payable",
+    "type": "fallback"
+  },
   {
     "stateMutability": "payable",
     "type": "receive"
diff --git a/packages/contracts-bedrock/snapshots/abi_loader.go b/packages/contracts-bedrock/snapshots/abi_loader.go
new file mode 100644
index 000000000000..483969e61a77
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/abi_loader.go
@@ -0,0 +1,47 @@
+package snapshots
+
+import (
+	"bytes"
+	_ "embed"
+
+	"github.com/ethereum/go-ethereum/accounts/abi"
+)
+
+//go:embed abi/DisputeGameFactory.json
+var disputeGameFactory []byte
+
+//go:embed abi/FaultDisputeGame.json
+var faultDisputeGame []byte
+
+//go:embed abi/PreimageOracle.json
+var preimageOracle []byte
+
+//go:embed abi/MIPS.json
+var mips []byte
+
+//go:embed abi/DelayedWETH.json
+var delayedWETH []byte
+
+func LoadDisputeGameFactoryABI() *abi.ABI {
+	return loadABI(disputeGameFactory)
+}
+func LoadFaultDisputeGameABI() *abi.ABI {
+	return loadABI(faultDisputeGame)
+}
+func LoadPreimageOracleABI() *abi.ABI {
+	return loadABI(preimageOracle)
+}
+func LoadMIPSABI() *abi.ABI {
+	return loadABI(mips)
+}
+func LoadDelayedWETHABI() *abi.ABI {
+	return loadABI(delayedWETH)
+}
+
+func loadABI(json []byte) *abi.ABI {
+	if parsed, err := abi.JSON(bytes.NewReader(json)); err != nil {
+		panic(err)
+	} else {
+		return &parsed
+	}
+}
diff --git a/packages/contracts-bedrock/snapshots/abi_loader_test.go b/packages/contracts-bedrock/snapshots/abi_loader_test.go
new file mode 100644
index 000000000000..0bb58922c6c2
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/abi_loader_test.go
@@ -0,0 +1,28 @@
+package snapshots
+
+import (
+	"testing"
+
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/stretchr/testify/require"
+)
+
+func TestLoadABIs(t *testing.T) {
+	tests := []struct {
+		contract string
+		method   func() *abi.ABI
+	}{
+		{"DisputeGameFactory", LoadDisputeGameFactoryABI},
+		{"FaultDisputeGame", LoadFaultDisputeGameABI},
+		{"PreimageOracle", LoadPreimageOracleABI},
+		{"MIPS", LoadMIPSABI},
+		{"DelayedWETH", LoadDelayedWETHABI},
+	}
+	for _, test := range tests {
+		test := test
+		t.Run(test.contract, func(t *testing.T) {
+			actual := test.method()
+			require.NotNil(t, actual)
+		})
+	}
+}
diff --git a/packages/contracts-bedrock/snapshots/state-diff/Kontrol-Deploy.json b/packages/contracts-bedrock/snapshots/state-diff/Kontrol-Deploy.json
index 1185fce2f370..fe1f98e7ee44 100644
--- a/packages/contracts-bedrock/snapshots/state-diff/Kontrol-Deploy.json
+++ b/packages/contracts-bedrock/snapshots/state-diff/Kontrol-Deploy.json
@@ -135,7 +135,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x1688f0b900000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000164b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x1688f0b900000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a100000000000000000000000000000000000000000000000000000000000000607f1c05487074ec69e9df71933c23a7dde272d692d6610a01ffa18261163204e20000000000000000000000000000000000000000000000000000000000000164b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -164,7 +164,7 @@
     },
     {
       "accessor": "0x34A1D3fff3958843C43aD80F30b94c510645C316",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -178,7 +178,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -186,7 +186,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -198,7 +198,7 @@
     },
     {
       "accessor": "0x34A1D3fff3958843C43aD80F30b94c510645C316",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -212,7 +212,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
@@ -238,7 +238,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -246,7 +246,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -254,7 +254,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -262,7 +262,7 @@
           "slot": "0xe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -270,7 +270,7 @@
           "slot": "0xe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -278,7 +278,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -286,7 +286,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -294,7 +294,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -302,7 +302,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -310,7 +310,7 @@
           "slot": "0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -318,7 +318,7 @@
           "slot": "0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -778,7 +778,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0xf2fde38b0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+      "data": "0xf2fde38b0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -805,7 +805,7 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": true,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
@@ -932,6 +932,23 @@
       "storageAccesses": [],
       "value": 0
     },
+    {
+      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
+      "account": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
+      "chainInfo": {
+        "chainId": 31337,
+        "forkId": 0
+      },
+      "data": "0x638627e586f5e36fe67a77519503a7c6da22f92b150d3c6055fd40bdcfe9ffd160806040523480156200001157600080fd5b506200001f60008062000025565b62000361565b600054610100900460ff1615808015620000465750600054600160ff909116105b8062000076575062000063306200019460201b620005fd1760201c565b15801562000076575060005460ff166001145b620000de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff19166001179055801562000102576000805461ff0019166101001790555b6200010d83620001a3565b81156200014857604080518082019091526012815271125b9a5d1a585b1a5e995c881c185d5cd95960721b6020820152620001489062000248565b80156200018f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b620001e9620001d460017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69620002cf565b60001b82620002cb60201b620006191760201c565b6000604080516001600160a01b03841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb910160408051601f19818403018152908290526200023d9162000345565b60405180910390a250565b6200028f6200027960017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7620002cf565b60001b6001620002cb60201b620006191760201c565b7fc32e6d5d6d1de257f64eac19ddb1f700ba13527983849c9486b1ab007ea2838181604051620002c0919062000345565b60405180910390a150565b9055565b600082821015620002f057634e487b7160e01b600052601160045260246000fd5b500390565b6000815180845260005b818110156200031d57602081850181015186830182015201620002ff565b8181111562000330576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006200035a6020830184620002f5565b9392505050565b61096b80620003716000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80635c975abb1161005b5780635c975abb146101255780636da663551461013d5780637fbf7b6a14610150578063c23a451a1461016657600080fd5b80633f4ba83a1461008d578063400ada7514610097578063452a9320146100aa57806354fd4d50146100dc575b600080fd5b61009561016e565b005b6100956100a5366004610746565b610294565b6100b261046d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101186040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100d39190610808565b61012d6104a6565b60405190151581526020016100d3565b61009561014b366004610851565b6104d6565b6101586105a4565b6040519081526020016100d3565b6101586105d2565b61017661046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e20756e706175736500000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61026961026360017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60009055565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156102b45750600054600160ff909116105b806102ce5750303b1580156102ce575060005460ff166001145b61035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161022c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156103b857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6103c18361061d565b8115610405576104056040518060400160405280601281526020017f496e697469616c697a65722070617573656400000000000000000000000000008152506106d8565b801561046857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006104a161049d60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b5490565b905090565b60006104a161049d60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b6104de61046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e2070617573650000000000000000000000000000000000000000000000606482015260840161022c565b6105a1816106d8565b50565b6105cf60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b81565b6105cf60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b61065061064b60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b829055565b60006040805173ffffffffffffffffffffffffffffffffffffffff841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526106cd91610808565b60405180910390a250565b61070c61070660017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60019055565b7fc32e6d5d6d1de257f64eac19ddb1f700ba13527983849c9486b1ab007ea283818160405161073b9190610808565b60405180910390a150565b6000806040838503121561075957600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461077d57600080fd5b91506020830135801515811461079257600080fd5b809150509250929050565b6000815180845260005b818110156107c3576020818501810151868301820152016107a7565b818111156107d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061081b602083018461079d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561086357600080fd5b813567ffffffffffffffff8082111561087b57600080fd5b818401915084601f83011261088f57600080fd5b8135818111156108a1576108a1610822565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108e7576108e7610822565b8160405282815287602084870101111561090057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600082821015610959577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a",
+      "deployedCode": "0x",
+      "initialized": true,
+      "kind": "Call",
+      "newBalance": 0,
+      "oldBalance": 0,
+      "reverted": false,
+      "storageAccesses": [],
+      "value": 0
+    },
     {
       "accessor": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
       "account": "0x068E44eB31e111028c41598E4535be7468674D0A",
@@ -1120,14 +1137,14 @@
           "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000000e"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000000f"
         }
       ],
       "value": 0
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -1141,7 +1158,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
@@ -1167,7 +1184,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -1175,7 +1192,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -1183,7 +1200,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -1191,7 +1208,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -1199,7 +1216,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -1207,7 +1224,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -1218,7 +1235,7 @@
       "value": 0
     },
     {
-      "accessor": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
       "chainInfo": {
         "chainId": 31337,
@@ -1235,8 +1252,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -1396,7 +1413,7 @@
           "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000000e"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000000f"
         }
       ],
       "value": 0
@@ -1624,6 +1641,23 @@
       "storageAccesses": [],
       "value": 0
     },
+    {
+      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
+      "account": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
+      "chainInfo": {
+        "chainId": 31337,
+        "forkId": 0
+      },
+      "data": "0x638627e586f5e36fe67a77519503a7c6da22f92b150d3c6055fd40bdcfe9ffd160806040523480156200001157600080fd5b506200002261dead60008062000028565b6200051c565b600054610100900460ff1615808015620000495750600054600160ff909116105b8062000079575062000066306200017e60201b6200053f1760201c565b15801562000079575060005460ff166001145b620000e25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000106576000805461ff0019166101001790555b620001106200018d565b6200011b84620001f5565b620001268362000274565b620001318262000324565b801562000178576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff16620001e95760405162461bcd60e51b815260206004820152602b602482015260008051602062000f4f83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d9565b620001f362000385565b565b620001ff620003ec565b6001600160a01b038116620002665760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620000d9565b620002718162000448565b50565b620002ba620002a560017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16200049e565b60001b826200049a60201b6200055b1760201c565b600081604051602001620002d091815260200190565b60408051601f19818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051620003189190620004c4565b60405180910390a35050565b62000355620002a560017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6200049e565b6000816040516020016200036b91815260200190565b60408051601f1981840301815291905290506001620002e5565b600054610100900460ff16620003e15760405162461bcd60e51b815260206004820152602b602482015260008051602062000f4f83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d9565b620001f33362000448565b6033546001600160a01b03163314620001f35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000d9565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b9055565b600082821015620004bf57634e487b7160e01b600052601160045260246000fd5b500390565b600060208083528351808285015260005b81811015620004f357858101830151858201604001528201620004d5565b8181111562000506576000604083870101525b50601f01601f1916929092016040019392505050565b610a23806200052c6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e73660046108c3565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101009190610947565b6100ec6101603660046108c3565b61021d565b6100ec61022e565b6100ec61017b36600461098a565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103f7565b6100f6610430565b6100ec6101c63660046109bd565b610460565b6100f6610514565b6100f6600081565b6101e361055f565b6101ec816105e0565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b81565b61022561055f565b6101ec81610698565b61023661055f565b6102406000610712565b565b600054610100900460ff16158080156102625750600054600160ff909116105b8061027c5750303b15801561027c575060005460ff166001145b61030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561036b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610373610789565b61037c84610460565b610385836105e0565b61038e82610698565b80156103f157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061042b61042760017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b5490565b905090565b600061042b61042760017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b61046861055f565b73ffffffffffffffffffffffffffffffffffffffff811661050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610304565b6101ec81610712565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b61061361060e60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b829055565b60008160405160200161062891815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161068c9190610947565b60405180910390a35050565b6106c661060e60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b6000816040516020016106db91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600161065b565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240600054610100900460ff166108ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b61024033610712565b6000602082840312156108d557600080fd5b5035919050565b6000815180845260005b81811015610902576020818501810151868301820152016108e6565b81811115610914576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061095a60208301846108dc565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461098557600080fd5b919050565b60008060006060848603121561099f57600080fd5b6109a884610961565b95602085013595506040909401359392505050565b6000602082840312156109cf57600080fd5b61095a82610961565b600082821015610a11577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
+      "deployedCode": "0x",
+      "initialized": true,
+      "kind": "Call",
+      "newBalance": 0,
+      "oldBalance": 0,
+      "reverted": false,
+      "storageAccesses": [],
+      "value": 0
+    },
     {
       "accessor": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
       "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F",
@@ -1928,7 +1962,7 @@
           "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000000d"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000000e"
         }
       ],
       "value": 0
@@ -1954,7 +1988,7 @@
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000003a"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000003d"
         }
       ],
       "value": 0
@@ -1980,14 +2014,14 @@
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000003b"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000003e"
         }
       ],
       "value": 0
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -2001,7 +2035,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
@@ -2027,7 +2061,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -2035,7 +2069,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -2043,7 +2077,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -2051,7 +2085,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -2059,7 +2093,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -2067,7 +2101,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -2078,7 +2112,7 @@
       "value": 0
     },
     {
-      "accessor": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
       "chainInfo": {
         "chainId": 31337,
@@ -2095,8 +2129,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -2363,7 +2397,7 @@
           "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000000d"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000000e"
         }
       ],
       "value": 0
@@ -2441,7 +2475,7 @@
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000003a"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000003d"
         }
       ],
       "value": 0
@@ -2519,7 +2553,7 @@
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000003b"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000003e"
         }
       ],
       "value": 0
@@ -3273,15 +3307,32 @@
       "storageAccesses": [],
       "value": 0
     },
+    {
+      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
+      "account": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
+      "chainInfo": {
+        "chainId": 31337,
+        "forkId": 0
+      },
+      "data": "0x638627e586f5e36fe67a77519503a7c6da22f92b150d3c6055fd40bdcfe9ffd160806040523480156200001157600080fd5b50620000206000808062000026565b6200028f565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001c160201b62001f071760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603680546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b03191661010085841602179055603254166200016a57603280546001600160a01b03191661dead1790555b62000174620001d0565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200023d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600154600160c01b90046001600160401b03166000036200028d5760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b615f24806200029f6000396000f3fe6080604052600436106101635760003560e01c80638c3152e9116100c0578063b69ef8a811610074578063cff0ab9611610059578063cff0ab961461044e578063e965084c146104ef578063e9e05c421461057b57600080fd5b8063b69ef8a81461040b578063c0c53b8b1461042e57600080fd5b80639bf62d82116100a55780639bf62d8214610375578063a14238e7146103a2578063a35d99df146103d257600080fd5b80638c3152e9146103285780639b5f694a1461034857600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102e857806371cfaa3f146103085780638b4c40b01461018857600080fd5b806354fd4d501461026d5780635c975abb146102c357600080fd5b806335e80ab31161014857806335e80ab314610206578063452a9320146102385780634870496f1461024d57600080fd5b8063149f2f221461018f57806333d7e2bd146101af57600080fd5b3661018a576101883334620186a0600060405180602001604052806000815250610589565b005b600080fd5b34801561019b57600080fd5b506101886101aa366004615344565b61062e565b3480156101bb57600080fd5b506037546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021257600080fd5b506035546101dc90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024457600080fd5b506101dc61086f565b34801561025957600080fd5b50610188610268366004615478565b610907565b34801561027957600080fd5b506102b66040518060400160405280600581526020017f322e372e3000000000000000000000000000000000000000000000000000000081525081565b6040516101fd91906155ca565b3480156102cf57600080fd5b506102d8610eb4565b60405190151581526020016101fd565b3480156102f457600080fd5b506102d86103033660046155dd565b610f47565b34801561031457600080fd5b50610188610323366004615605565b611002565b34801561033457600080fd5b5061018861034336600461564b565b6111c4565b34801561035457600080fd5b506036546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561038157600080fd5b506032546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ae57600080fd5b506102d86103bd3660046155dd565b60336020526000908152604090205460ff1681565b3480156103de57600080fd5b506103f26103ed366004615688565b611c46565b60405167ffffffffffffffff90911681526020016101fd565b34801561041757600080fd5b50610420611c5f565b6040519081526020016101fd565b34801561043a57600080fd5b506101886104493660046156a3565b611cb9565b34801561045a57600080fd5b506001546104b6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101fd565b3480156104fb57600080fd5b5061054d61050a3660046155dd565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101fd565b6101886105893660046156ee565b8260005a90506000610599611f23565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015906105d557503415155b1561060c576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61061a883489898989611fc0565b50610625828261216c565b50505050505050565b8260005a9050600061063e611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016106b0576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87603d60008282546106c2919061579a565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075891906157b2565b905061077c73ffffffffffffffffffffffffffffffffffffffff831633308c612439565b610786898261579a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156107f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081491906157b2565b1461084b576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108598a8a8a8a8a8a611fc0565b5050610865828261216c565b5050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090291906157cb565b905090565b61090f610eb4565b15610946576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109af576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a439190615808565b519050610a5d610a583686900386018661586d565b612515565b8114610af0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610afb87612571565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c115750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190615808565b5114155b610c9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610ae7565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610d669101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d5c888a6158d3565b8a604001356125a1565b610df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610ae7565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190615957565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610ffc9173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe19190615808565b602001516fffffffffffffffffffffffffffffffff166125c5565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff163314611053576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105f6201388061266b565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3290849081906201388090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f00000000000000000000000000000000000000000000000000000000179052905161117c96959493929101615974565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526111b4916155ca565b60405180910390a450505050565b565b6111cc610eb4565b15611203576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611256576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061126182612571565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610ae7565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113dd91906157b2565b81602001516fffffffffffffffffffffffffffffffff1610156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610ae7565b6114c781602001516fffffffffffffffffffffffffffffffff166125c5565b611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015611600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116249190615808565b82518151919250146116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610ae7565b6116fd81602001516fffffffffffffffffffffffffffffffff166125c5565b6117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60008381526033602052604090205460ff161561184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610ae7565b6000838152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055806118d9611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161193c576119358660400151876080015188606001518960a001516126cd565b9150611b8f565b8073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff16036119a5576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086015115611b66578560600151603d60008282546119c591906159d9565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b91906157b2565b9050611a90876040015188606001518473ffffffffffffffffffffffffffffffffffffffff1661272b9092919063ffffffff16565b6060870151611a9f90826159d9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906157b2565b14611b64576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08601515115611b8a576119358660400151876080015160008960a001516126cd565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405185907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611bf190851515815260200190565b60405180910390a281158015611c075750326001145b15611c3e576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000611c538260106159f0565b610ffc90615208615a20565b600080611c6a611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611cb1574791505090565b5050603d5490565b600054610100900460ff1615808015611cd95750600054600160ff909116105b80611cf35750303b158015611cf3575060005460ff166001145b611d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ae7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611ddd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611e9657603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611e9e612786565b8015611f0157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015611f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb79190615a4c565b90939092509050565b818015611fe2575073ffffffffffffffffffffffffffffffffffffffff861615155b15612019576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120238151611c46565b67ffffffffffffffff168367ffffffffffffffff161015612070576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0815111156120ae576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146120cf575033731111000000000000000000000000000000001111015b600086868686866040516020016120ea959493929190615974565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161215a91906155ca565b60405180910390a45050505050505050565b6001546000906121a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436159d9565b905060006121ae612899565b90506000816020015160ff16826000015163ffffffff166121cf9190615ab5565b9050821561230657600154600090612206908390700100000000000000000000000000000000900467ffffffffffffffff16615b1d565b90506000836040015160ff168361221d9190615b91565b60015461223d9084906fffffffffffffffffffffffffffffffff16615b91565b6122479190615ab5565b600154909150600090612298906122719084906fffffffffffffffffffffffffffffffff16615c4d565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff1661295a565b905060018611156122c7576122c461227182876040015160ff1660018a6122bf91906159d9565b612979565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090612339908490700100000000000000000000000000000000900467ffffffffffffffff16615a20565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156123c6576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906123f2906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615cc1565b9050600061240448633b9aca006129ce565b61240e9083615cfe565b905060005a61241d90886159d9565b9050808211156108655761086561243482846159d9565b6129e5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f019085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a0e565b60008160000151826020015183604001518460600151604051602001612554949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097612554979096959101615d12565b6000806125ad86612b1a565b90506125bb81868686612b4c565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015612635573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265991906157b2565b612663908361579a565b421192915050565b6001805463ffffffff831691906010906126a4908490700100000000000000000000000000000000900467ffffffffffffffff16615a20565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008060006126dd866000612b7c565b905080612713576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127819084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612493565b505050565b600054610100900460ff1661281d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610ae7565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036111c25760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612936573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190615d7d565b600061296f6129698585612b9a565b83612baa565b90505b9392505050565b6000670de0b6b3a76400006129ba6129918583615ab5565b6129a390670de0b6b3a7640000615b1d565b6129b585670de0b6b3a7640000615b91565b612bb9565b6129c49086615b91565b61296f9190615ab5565b6000818310156129de5781612972565b5090919050565b6000805a90505b825a6129f890836159d9565b101561278157612a0782615e20565b91506129ec565b6000612a70826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612bea9092919063ffffffff16565b8051909150156127815780806020019051810190612a8e9190615957565b612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ae7565b60608180519060200120604051602001612b3691815260200190565b6040516020818303038152906040529050919050565b6000612b7384612b5d878686612bf9565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156129de5781612972565b60008183126129de5781612972565b6000612972670de0b6b3a764000083612bd186613677565b612bdb9190615b91565b612be59190615ab5565b6138bb565b606061296f8484600085613afa565b60606000845111612c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610ae7565b6000612c7184613c90565b90506000612c7e86613d7c565b9050600084604051602001612c9591815260200190565b60405160208183030381529060405290506000805b84518110156135ee576000858281518110612cc757612cc7615e58565b602002602001015190508451831115612d62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610ae7565b82600003612e1b5780518051602091820120604051612db092612d8a92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610ae7565b612f72565b805151602011612ed15780518051602091820120604051612e4592612d8a92910190815260200190565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610ae7565b805184516020808701919091208251919092012014612f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610ae7565b612f7e6010600161579a565b8160200151510361315a57845183036130f257612fb88160200151601081518110612fab57612fab615e58565b6020026020010151613ddf565b9650600087511161304b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610ae7565b6001865161305991906159d9565b82146130e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610ae7565b505050505050612972565b600085848151811061310657613106615e58565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061313157613131615e58565b6020026020010151905061314481613f3f565b955061315160018661579a565b945050506135db565b60028160200151510361355357600061317282613f64565b905060008160008151811061318957613189615e58565b016020015160f81c905060006131a0600283615e87565b6131ab906002615ea9565b905060006131bc848360ff16613f88565b905060006131ca8a89613f88565b905060006131d88383613fbe565b90508083511461326a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610ae7565b60ff85166002148061327f575060ff85166003145b1561346e5780825114613314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610ae7565b61332e8760200151600181518110612fab57612fab615e58565b9c5060008d51116133c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610ae7565b60018c516133cf91906159d9565b881461345d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610ae7565b505050505050505050505050612972565b60ff85161580613481575060ff85166001145b156134c0576134ad87602001516001815181106134a0576134a0615e58565b6020026020010151613f3f565b99506134b9818a61579a565b9850613548565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610ae7565b5050505050506135db565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610ae7565b50806135e681615e20565b915050612caa565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610ae7565b60008082136136e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b600060606136ef84614072565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136138ec57506000919050565b680755bf798b4a1bf1e5821261395e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610ae7565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ae7565b73ffffffffffffffffffffffffffffffffffffffff85163b613c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ae7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c339190615ecc565b60006040518083038185875af1925050503d8060008114613c70576040519150601f19603f3d011682016040523d82523d6000602084013e613c75565b606091505b5091509150613c85828286614148565b979650505050505050565b80516060908067ffffffffffffffff811115613cae57613cae615238565b604051908082528060200260200182016040528015613cf357816020015b6040805180820190915260608082526020820152815260200190600190039081613ccc5790505b50915060005b81811015613d75576040518060400160405280858381518110613d1e57613d1e615e58565b60200260200101518152602001613d4d868481518110613d4057613d40615e58565b602002602001015161419b565b815250838281518110613d6257613d62615e58565b6020908102919091010152600101613cf9565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613dd4578060011b82018184015160001a8060041c8253600f811660018301535050600101613da6565b509295945050505050565b60606000806000613def856141ae565b919450925090506000816001811115613e0a57613e0a615ee8565b14613e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610ae7565b613ea1828461579a565b855114613f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610ae7565b612b7385602001518484614c1b565b60606020826000015110613f5b57613f5682613ddf565b610ffc565b610ffc82614caf565b6060610ffc613f838360200151600081518110612fab57612fab615e58565b613d7c565b606082518210613fa75750604080516020810190915260008152610ffc565b6129728383848651613fb991906159d9565b614cc5565b6000808251845110613fd1578251613fd4565b83515b90505b808210801561405b5750828281518110613ff357613ff3615e58565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684838151811061403257614032615e58565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561406b57816001019150613fd7565b5092915050565b60008082116140dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608315614157575081612972565b8251156141675782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae791906155ca565b6060610ffc6141a983614e9d565b614f86565b60008060008084600001511161426c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610ae7565b6020840151805160001a607f8111614291576000600160009450945094505050614c14565b60b7811161449f5760006142a66080836159d9565b905080876000015111614361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610ae7565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806143da57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b61448c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610ae7565b5060019550935060009250614c14915050565b60bf81116147ed5760006144b460b7836159d9565b90508087600001511161456f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610ae7565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361464d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610ae7565b600184015160088302610100031c60378111614711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610ae7565b61471b818461579a565b8951116147d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610ae7565b6147db83600161579a565b9750955060009450614c149350505050565b60f781116148ce57600061480260c0836159d9565b9050808760000151116148bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610ae7565b600195509350849250614c14915050565b60006148db60f7836159d9565b905080876000015111614996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610ae7565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610ae7565b600184015160088302610100031c60378111614b38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610ae7565b614b42818461579a565b895111614bf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610ae7565b614c0283600161579a565b9750955060019450614c149350505050565b9193909250565b60608167ffffffffffffffff811115614c3657614c36615238565b6040519080825280601f01601f191660200182016040528015614c60576020820181803683370190505b5090508115612972576000614c75848661579a565b90506020820160005b84811015614c96578281015182820152602001614c7e565b84811115614ca5576000858301525b5050509392505050565b6060610ffc826020015160008460000151614c1b565b60608182601f011015614d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b828284011015614da0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b81830184511015614e0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610ae7565b606082158015614e2c5760405191506000825260208201604052614e94565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614e65578051835260209283019201614e4d565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614f68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610ae7565b50604080518082019091528151815260209182019181019190915290565b60606000806000614f96856141ae565b919450925090506001816001811115614fb157614fb1615ee8565b1461503e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610ae7565b845161504a838561579a565b146150d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610ae7565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816150ee5790505093506000835b86518110156151dc576000806151616040518060400160405280858c6000015161514591906159d9565b8152602001858c6020015161515a919061579a565b90526141ae565b50915091506040518060400160405280838361517d919061579a565b8152602001848b60200151615192919061579a565b8152508885815181106151a7576151a7615e58565b60209081029190910101526151bd60018561579a565b93506151c9818361579a565b6151d3908461579a565b9250505061511b565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461520a57600080fd5b50565b803567ffffffffffffffff8116811461522557600080fd5b919050565b801515811461520a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156152ae576152ae615238565b604052919050565b600082601f8301126152c757600080fd5b813567ffffffffffffffff8111156152e1576152e1615238565b61531260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615267565b81815284602083860101111561532757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561535d57600080fd5b8635615368816151e8565b955060208701359450604087013593506153846060880161520d565b925060808701356153948161522a565b915060a087013567ffffffffffffffff8111156153b057600080fd5b6153bc89828a016152b6565b9150509295509295509295565b600060c082840312156153db57600080fd5b60405160c0810167ffffffffffffffff82821081831117156153ff576153ff615238565b81604052829350843583526020850135915061541a826151e8565b81602084015260408501359150615430826151e8565b816040840152606085013560608401526080850135608084015260a085013591508082111561545e57600080fd5b5061546b858286016152b6565b60a0830152505092915050565b600080600080600085870360e081121561549157600080fd5b863567ffffffffffffffff808211156154a957600080fd5b6154b58a838b016153c9565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0840112156154ee57600080fd5b60408901955060c089013592508083111561550857600080fd5b828901925089601f84011261551c57600080fd5b823591508082111561552d57600080fd5b508860208260051b840101111561554357600080fd5b959894975092955050506020019190565b60005b8381101561556f578181015183820152602001615557565b83811115611f015750506000910152565b60008151808452615598816020860160208601615554565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129726020830184615580565b6000602082840312156155ef57600080fd5b5035919050565b60ff8116811461520a57600080fd5b6000806000806080858703121561561b57600080fd5b8435615626816151e8565b93506020850135615636816155f6565b93969395505050506040820135916060013590565b60006020828403121561565d57600080fd5b813567ffffffffffffffff81111561567457600080fd5b615680848285016153c9565b949350505050565b60006020828403121561569a57600080fd5b6129728261520d565b6000806000606084860312156156b857600080fd5b83356156c3816151e8565b925060208401356156d3816151e8565b915060408401356156e3816151e8565b809150509250925092565b600080600080600060a0868803121561570657600080fd5b8535615711816151e8565b9450602086013593506157266040870161520d565b925060608601356157368161522a565b9150608086013567ffffffffffffffff81111561575257600080fd5b61575e888289016152b6565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157ad576157ad61576b565b500190565b6000602082840312156157c457600080fd5b5051919050565b6000602082840312156157dd57600080fd5b8151612972816151e8565b80516fffffffffffffffffffffffffffffffff8116811461522557600080fd5b60006060828403121561581a57600080fd5b6040516060810181811067ffffffffffffffff8211171561583d5761583d615238565b60405282518152615850602084016157e8565b6020820152615861604084016157e8565b60408201529392505050565b60006080828403121561587f57600080fd5b6040516080810181811067ffffffffffffffff821117156158a2576158a2615238565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff808411156158ee576158ee615238565b8360051b60206158ff818301615267565b86815291850191818101903684111561591757600080fd5b865b8481101561594b578035868111156159315760008081fd5b61593d36828b016152b6565b845250918301918301615919565b50979650505050505050565b60006020828403121561596957600080fd5b81516129728161522a565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516159c8816049850160208701615554565b919091016049019695505050505050565b6000828210156159eb576159eb61576b565b500390565b600067ffffffffffffffff80831681851681830481118215151615615a1757615a1761576b565b02949350505050565b600067ffffffffffffffff808316818516808303821115615a4357615a4361576b565b01949350505050565b60008060408385031215615a5f57600080fd5b8251615a6a816151e8565b6020840151909250615a7b816155f6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615ac457615ac4615a86565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b1857615b1861576b565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615615b5757615b5761576b565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615615b8b57615b8b61576b565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd257615bd261576b565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0d57615c0d61576b565b60008712925087820587128484161615615c2957615c2961576b565b87850587128184161615615c3f57615c3f61576b565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615c8757615c8761576b565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615615cbb57615cbb61576b565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615cf957615cf961576b565b500290565b600082615d0d57615d0d615a86565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152615d5d60c0830184615580565b98975050505050505050565b805163ffffffff8116811461522557600080fd5b600060c08284031215615d8f57600080fd5b60405160c0810181811067ffffffffffffffff82111715615db257615db2615238565b604052615dbe83615d69565b81526020830151615dce816155f6565b60208201526040830151615de1816155f6565b6040820152615df260608401615d69565b6060820152615e0360808401615d69565b6080820152615e1460a084016157e8565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615e5157615e5161576b565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680615e9a57615e9a615a86565b8060ff84160691505092915050565b600060ff821660ff841680821015615ec357615ec361576b565b90039392505050565b60008251615ede818460208701615554565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
+      "deployedCode": "0x",
+      "initialized": true,
+      "kind": "Call",
+      "newBalance": 0,
+      "oldBalance": 0,
+      "reverted": false,
+      "storageAccesses": [],
+      "value": 0
+    },
     {
       "accessor": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028f565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001c160201b62001b741760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603680546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b03191661010085841602179055603254166200016a57603280546001600160a01b03191661dead1790555b62000174620001d0565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200023d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600154600160c01b90046001600160401b03166000036200028d5760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b6153ed806200029f6000396000f3fe6080604052600436106101625760003560e01c80638c3152e9116100c0578063c0c53b8b11610074578063e965084c11610059578063e965084c146104c7578063e9e05c4214610553578063f04987501461056657600080fd5b8063c0c53b8b14610406578063cff0ab961461042657600080fd5b80639bf62d82116100a55780639bf62d8214610370578063a14238e71461039d578063a35d99df146103cd57600080fd5b80638c3152e9146103235780639b5f694a1461034357600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102ee578063724c184c1461030e5780638b4c40b01461018757600080fd5b806354fd4d50146102735780635c975abb146102c957600080fd5b806335e80ab31161014857806335e80ab31461020c578063452a93201461023e5780634870496f1461025357600080fd5b80621c2ff61461018e57806333d7e2bd146101df57600080fd5b36610189576101873334620186a0600060405180602001604052806000815250610591565b005b600080fd5b34801561019a57600080fd5b5060365473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101eb57600080fd5b506037546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021857600080fd5b506035546101b590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024a57600080fd5b506101b561082c565b34801561025f57600080fd5b5061018761026e3660046149b4565b6108c4565b34801561027f57600080fd5b506102bc6040518060400160405280600581526020017f322e352e3000000000000000000000000000000000000000000000000000000081525081565b6040516101d69190614b06565b3480156102d557600080fd5b506102de610ef2565b60405190151581526020016101d6565b3480156102fa57600080fd5b506102de610309366004614b19565b610f85565b34801561031a57600080fd5b506101b5611040565b34801561032f57600080fd5b5061018761033e366004614b32565b61104c565b34801561034f57600080fd5b506036546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037c57600080fd5b506032546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a957600080fd5b506102de6103b8366004614b19565b60336020526000908152604090205460ff1681565b3480156103d957600080fd5b506103ed6103e8366004614b8c565b61190d565b60405167ffffffffffffffff90911681526020016101d6565b34801561041257600080fd5b50610187610421366004614ba7565b611926565b34801561043257600080fd5b5060015461048e906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101d6565b3480156104d357600080fd5b506105256104e2366004614b19565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101d6565b610187610561366004614c00565b610591565b34801561057257600080fd5b5060375473ffffffffffffffffffffffffffffffffffffffff166101b5565b8260005a905083156106485773ffffffffffffffffffffffffffffffffffffffff87161561064857604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b610652835161190d565b67ffffffffffffffff168567ffffffffffffffff1610156106f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4f7074696d69736d506f7274616c3a20676173206c696d697420746f6f20736d60448201527f616c6c0000000000000000000000000000000000000000000000000000000000606482015260840161063f565b6201d4c083511115610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f7074696d69736d506f7274616c3a206461746120746f6f206c617267650000604482015260640161063f565b33328114610784575033731111000000000000000000000000000000001111015b6000348888888860405160200161079f959493929190614c7d565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161080f9190614b06565b60405180910390a450506108238282611b90565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa15801561089b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190614ce2565b905090565b6108cc610ef2565b15610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161063f565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e747261637400606482015260840161063f565b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614d1f565b519050610aa0610a9b36869003860186614d84565b611ebd565b8114610b2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f660000000000000000000000000000000000000000000000606482015260840161063f565b6000610b3987611f19565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c4f5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4b9190614d1f565b5114155b610cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e000000000000000000606482015260840161063f565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610da49101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d9a888a614dea565b8a60400135611f49565b610e30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f660000000000000000000000000000606482015260840161063f565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f61573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190614e6e565b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810183905260009161103a9173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f9190614d1f565b602001516fffffffffffffffffffffffffffffffff16611f6d565b92915050565b60006108bf61082c565b565b611054610ef2565b156110bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161063f565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e00606482015260840161063f565b600061116f82611f19565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e207965740000000000000000000000000000606482015260840161063f565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112eb9190614e8b565b81602001516fffffffffffffffffffffffffffffffff1610156113b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a40161063f565b6113d581602001516fffffffffffffffffffffffffffffffff16611f6d565b611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a40161063f565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561150e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115329190614d1f565b82518151919250146115ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a40161063f565b61160b81602001516fffffffffffffffffffffffffffffffff16611f6d565b6116bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a40161063f565b60008381526033602052604090205460ff161561175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a65640000000000000000000000606482015260840161063f565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a08801516117fe93929190612013565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061186390841515815260200190565b60405180910390a2801580156118795750326001145b15611906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a207769746864726177616c206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161063f565b5050505050565b600061191a826010614ed3565b61103a90615208614f03565b600054610100900460ff16158080156119465750600054600160ff909116105b806119605750303b158015611960575060005460ff166001145b6119ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161063f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611a4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611b0357603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611b0b612071565b8015611b6e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611bc6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614f2f565b90506000611bd2612184565b90506000816020015160ff16826000015163ffffffff16611bf39190614f75565b90508215611d2a57600154600090611c2a908390700100000000000000000000000000000000900467ffffffffffffffff16614fdd565b90506000836040015160ff1683611c419190615051565b600154611c619084906fffffffffffffffffffffffffffffffff16615051565b611c6b9190614f75565b600154909150600090611cbc90611c959084906fffffffffffffffffffffffffffffffff1661510d565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612245565b90506001861115611ceb57611ce8611c9582876040015160ff1660018a611ce39190614f2f565b612264565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611d5d908490700100000000000000000000000000000000900467ffffffffffffffff16614f03565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d69740000606482015260840161063f565b600154600090611e6c906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615181565b90506000611e7e48633b9aca006122b9565b611e8890836151be565b905060005a611e979088614f2f565b905080821115611eb357611eb3611eae8284614f2f565b6122d0565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611efc949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611efc9790969591016151d2565b600080611f55866122fe565b9050611f6381868686612330565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120019190614e8b565b61200b9083615229565b421192915050565b6000806000612023866000612360565b905080612059576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16612108576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161063f565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660000361104a5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612221573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190615266565b600061225a612254858561237e565b8361238e565b90505b9392505050565b6000670de0b6b3a76400006122a561227c8583614f75565b61228e90670de0b6b3a7640000614fdd565b6122a085670de0b6b3a7640000615051565b61239d565b6122af9086615051565b61225a9190614f75565b6000818310156122c9578161225d565b5090919050565b6000805a90505b825a6122e39083614f2f565b10156122f9576122f282615305565b91506122d7565b505050565b6060818051906020012060405160200161231a91815260200190565b6040516020818303038152906040529050919050565b6000612357846123418786866123ce565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156122c9578161225d565b60008183126122c9578161225d565b600061225d670de0b6b3a7640000836123b586612e4c565b6123bf9190615051565b6123c99190614f75565b613090565b6060600084511161243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b65790000000000000000000000604482015260640161063f565b6000612446846132cf565b90506000612453866133bb565b905060008460405160200161246a91815260200190565b60405160208183030381529060405290506000805b8451811015612dc357600085828151811061249c5761249c61533d565b602002602001015190508451831115612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e677468000000000000000000000000000000000000606482015260840161063f565b826000036125f057805180516020918201206040516125859261255f92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6125eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f742068617368000000604482015260640161063f565b612747565b8051516020116126a6578051805160209182012060405161261a9261255f92910190815260200190565b6125eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c206861736800000000000000000000000000000000000000000000000000606482015260840161063f565b805184516020808701919091208251919092012014612747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f6520686173680000000000000000000000000000000000000000000000000000606482015260840161063f565b61275360106001615229565b8160200151510361292f57845183036128c75761278d81602001516010815181106127805761278061533d565b602002602001015161341e565b96506000875111612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e6368290000000000606482015260840161063f565b6001865161282e9190614f2f565b82146128bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e636829000000000000606482015260840161063f565b50505050505061225d565b60008584815181106128db576128db61533d565b602001015160f81c60f81b60f81c9050600082602001518260ff16815181106129065761290661533d565b602002602001015190506129198161357e565b9550612926600186615229565b94505050612db0565b600281602001515103612d28576000612947826135a3565b905060008160008151811061295e5761295e61533d565b016020015160f81c9050600061297560028361536c565b61298090600261538e565b90506000612991848360ff166135c7565b9050600061299f8a896135c7565b905060006129ad83836135fd565b905080835114612a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b6579000000000000606482015260840161063f565b60ff851660021480612a54575060ff85166003145b15612c435780825114612ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e646572000000606482015260840161063f565b612b0387602001516001815181106127805761278061533d565b9c5060008d5111612b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c6561662900000000000000606482015260840161063f565b60018c51612ba49190614f2f565b8814612c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c656166290000000000000000606482015260840161063f565b50505050505050505050505061225d565b60ff85161580612c56575060ff85166001145b15612c9557612c828760200151600181518110612c7557612c7561533d565b602002602001015161357e565b9950612c8e818a615229565b9850612d1d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e207072656669780000000000000000000000000000606482015260840161063f565b505050505050612db0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f6465000000000000000000000000000000000000000000000000606482015260840161063f565b5080612dbb81615305565b91505061247f565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e7473000000000000000000000000000000000000000000000000000000606482015260840161063f565b6000808213612eb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161063f565b60006060612ec4846136b1565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136130c157506000919050565b680755bf798b4a1bf1e58212613133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f570000000000000000000000000000000000000000604482015260640161063f565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156132ed576132ed6147d4565b60405190808252806020026020018201604052801561333257816020015b604080518082019091526060808252602082015281526020019060019003908161330b5790505b50915060005b818110156133b457604051806040016040528085838151811061335d5761335d61533d565b6020026020010151815260200161338c86848151811061337f5761337f61533d565b6020026020010151613787565b8152508382815181106133a1576133a161533d565b6020908102919091010152600101613338565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613413578060011b82018184015160001a8060041c8253600f8116600183015350506001016133e5565b509295945050505050565b6060600080600061342e8561379a565b919450925090506000816001811115613449576134496153b1565b146134d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d00000000000000606482015260840161063f565b6134e08284615229565b85511461356f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e646572000000000000000000000000606482015260840161063f565b61235785602001518484614207565b6060602082600001511061359a576135958261341e565b61103a565b61103a8261429b565b606061103a6135c283602001516000815181106127805761278061533d565b6133bb565b6060825182106135e6575060408051602081019091526000815261103a565b61225d83838486516135f89190614f2f565b6142b1565b6000808251845110613610578251613613565b83515b90505b808210801561369a57508282815181106136325761363261533d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106136715761367161533d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156136aa57816001019150613616565b5092915050565b600080821161371c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161063f565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606061103a61379583614489565b614572565b600080600080846000015111613858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161063f565b6020840151805160001a607f811161387d576000600160009450945094505050614200565b60b78111613a8b576000613892608083614f2f565b90508087600001511161394d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a40161063f565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806139c657507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a40161063f565b5060019550935060009250614200915050565b60bf8111613dd9576000613aa060b783614f2f565b905080876000015111613b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a40161063f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613c39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a40161063f565b600184015160088302610100031c60378111613cfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a40161063f565b613d078184615229565b895111613dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a40161063f565b613dc7836001615229565b97509550600094506142009350505050565b60f78111613eba576000613dee60c083614f2f565b905080876000015111613ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a40161063f565b600195509350849250614200915050565b6000613ec760f783614f2f565b905080876000015111613f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a40161063f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a40161063f565b600184015160088302610100031c60378111614124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a40161063f565b61412e8184615229565b8951116141e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a40161063f565b6141ee836001615229565b97509550600194506142009350505050565b9193909250565b60608167ffffffffffffffff811115614222576142226147d4565b6040519080825280601f01601f19166020018201604052801561424c576020820181803683370190505b509050811561225d5760006142618486615229565b90506020820160005b8481101561428257828101518282015260200161426a565b84811115614291576000858301525b5050509392505050565b606061103a826020015160008460000151614207565b60608182601f011015614320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161063f565b82828401101561438c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161063f565b818301845110156143f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161063f565b6060821580156144185760405191506000825260208201604052614480565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614451578051835260209283019201614439565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161063f565b50604080518082019091528151815260209182019181019190915290565b606060008060006145828561379a565b91945092509050600181600181111561459d5761459d6153b1565b1461462a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d0000000000000000606482015260840161063f565b84516146368385615229565b146146c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e6465720000000000000000000000000000606482015260840161063f565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816146da5790505093506000835b86518110156147c85760008061474d6040518060400160405280858c600001516147319190614f2f565b8152602001858c602001516147469190615229565b905261379a565b5091509150604051806040016040528083836147699190615229565b8152602001848b6020015161477e9190615229565b8152508885815181106147935761479361533d565b60209081029190910101526147a9600185615229565b93506147b58183615229565b6147bf9084615229565b92505050614707565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561484a5761484a6147d4565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461487457600080fd5b50565b600082601f83011261488857600080fd5b813567ffffffffffffffff8111156148a2576148a26147d4565b6148d360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614803565b8181528460208386010111156148e857600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561491757600080fd5b60405160c0810167ffffffffffffffff828210818311171561493b5761493b6147d4565b81604052829350843583526020850135915061495682614852565b8160208401526040850135915061496c82614852565b816040840152606085013560608401526080850135608084015260a085013591508082111561499a57600080fd5b506149a785828601614877565b60a0830152505092915050565b600080600080600085870360e08112156149cd57600080fd5b863567ffffffffffffffff808211156149e557600080fd5b6149f18a838b01614905565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614a2a57600080fd5b60408901955060c0890135925080831115614a4457600080fd5b828901925089601f840112614a5857600080fd5b8235915080821115614a6957600080fd5b508860208260051b8401011115614a7f57600080fd5b959894975092955050506020019190565b60005b83811015614aab578181015183820152602001614a93565b83811115611b6e5750506000910152565b60008151808452614ad4816020860160208601614a90565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061225d6020830184614abc565b600060208284031215614b2b57600080fd5b5035919050565b600060208284031215614b4457600080fd5b813567ffffffffffffffff811115614b5b57600080fd5b614b6784828501614905565b949350505050565b803567ffffffffffffffff81168114614b8757600080fd5b919050565b600060208284031215614b9e57600080fd5b61225d82614b6f565b600080600060608486031215614bbc57600080fd5b8335614bc781614852565b92506020840135614bd781614852565b91506040840135614be781614852565b809150509250925092565b801515811461487457600080fd5b600080600080600060a08688031215614c1857600080fd5b8535614c2381614852565b945060208601359350614c3860408701614b6f565b92506060860135614c4881614bf2565b9150608086013567ffffffffffffffff811115614c6457600080fd5b614c7088828901614877565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614cd1816049850160208701614a90565b919091016049019695505050505050565b600060208284031215614cf457600080fd5b815161225d81614852565b80516fffffffffffffffffffffffffffffffff81168114614b8757600080fd5b600060608284031215614d3157600080fd5b6040516060810181811067ffffffffffffffff82111715614d5457614d546147d4565b60405282518152614d6760208401614cff565b6020820152614d7860408401614cff565b60408201529392505050565b600060808284031215614d9657600080fd5b6040516080810181811067ffffffffffffffff82111715614db957614db96147d4565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614e0557614e056147d4565b8360051b6020614e16818301614803565b868152918501918181019036841115614e2e57600080fd5b865b84811015614e6257803586811115614e485760008081fd5b614e5436828b01614877565b845250918301918301614e30565b50979650505050505050565b600060208284031215614e8057600080fd5b815161225d81614bf2565b600060208284031215614e9d57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614efa57614efa614ea4565b02949350505050565b600067ffffffffffffffff808316818516808303821115614f2657614f26614ea4565b01949350505050565b600082821015614f4157614f41614ea4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614f8457614f84614f46565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614fd857614fd8614ea4565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561501757615017614ea4565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561504b5761504b614ea4565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561509257615092614ea4565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156150cd576150cd614ea4565b600087129250878205871284841616156150e9576150e9614ea4565b878505871281841616156150ff576150ff614ea4565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561514757615147614ea4565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561517b5761517b614ea4565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151b9576151b9614ea4565b500290565b6000826151cd576151cd614f46565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261521d60c0830184614abc565b98975050505050505050565b6000821982111561523c5761523c614ea4565b500190565b805163ffffffff81168114614b8757600080fd5b805160ff81168114614b8757600080fd5b600060c0828403121561527857600080fd5b60405160c0810181811067ffffffffffffffff8211171561529b5761529b6147d4565b6040526152a783615241565b81526152b560208401615255565b60208201526152c660408401615255565b60408201526152d760608401615241565b60608201526152e860808401615241565b60808201526152f960a08401614cff565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361533657615336614ea4565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff83168061537f5761537f614f46565b8060ff84160691505092915050565b600060ff821660ff8416808210156153a8576153a8614ea4565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
-      "deployedCode": "0x6080604052600436106101625760003560e01c80638c3152e9116100c0578063c0c53b8b11610074578063e965084c11610059578063e965084c146104c7578063e9e05c4214610553578063f04987501461056657600080fd5b8063c0c53b8b14610406578063cff0ab961461042657600080fd5b80639bf62d82116100a55780639bf62d8214610370578063a14238e71461039d578063a35d99df146103cd57600080fd5b80638c3152e9146103235780639b5f694a1461034357600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102ee578063724c184c1461030e5780638b4c40b01461018757600080fd5b806354fd4d50146102735780635c975abb146102c957600080fd5b806335e80ab31161014857806335e80ab31461020c578063452a93201461023e5780634870496f1461025357600080fd5b80621c2ff61461018e57806333d7e2bd146101df57600080fd5b36610189576101873334620186a0600060405180602001604052806000815250610591565b005b600080fd5b34801561019a57600080fd5b5060365473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101eb57600080fd5b506037546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021857600080fd5b506035546101b590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024a57600080fd5b506101b561082c565b34801561025f57600080fd5b5061018761026e3660046149b4565b6108c4565b34801561027f57600080fd5b506102bc6040518060400160405280600581526020017f322e352e3000000000000000000000000000000000000000000000000000000081525081565b6040516101d69190614b06565b3480156102d557600080fd5b506102de610ef2565b60405190151581526020016101d6565b3480156102fa57600080fd5b506102de610309366004614b19565b610f85565b34801561031a57600080fd5b506101b5611040565b34801561032f57600080fd5b5061018761033e366004614b32565b61104c565b34801561034f57600080fd5b506036546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037c57600080fd5b506032546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a957600080fd5b506102de6103b8366004614b19565b60336020526000908152604090205460ff1681565b3480156103d957600080fd5b506103ed6103e8366004614b8c565b61190d565b60405167ffffffffffffffff90911681526020016101d6565b34801561041257600080fd5b50610187610421366004614ba7565b611926565b34801561043257600080fd5b5060015461048e906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101d6565b3480156104d357600080fd5b506105256104e2366004614b19565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101d6565b610187610561366004614c00565b610591565b34801561057257600080fd5b5060375473ffffffffffffffffffffffffffffffffffffffff166101b5565b8260005a905083156106485773ffffffffffffffffffffffffffffffffffffffff87161561064857604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b610652835161190d565b67ffffffffffffffff168567ffffffffffffffff1610156106f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4f7074696d69736d506f7274616c3a20676173206c696d697420746f6f20736d60448201527f616c6c0000000000000000000000000000000000000000000000000000000000606482015260840161063f565b6201d4c083511115610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f7074696d69736d506f7274616c3a206461746120746f6f206c617267650000604482015260640161063f565b33328114610784575033731111000000000000000000000000000000001111015b6000348888888860405160200161079f959493929190614c7d565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161080f9190614b06565b60405180910390a450506108238282611b90565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa15801561089b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190614ce2565b905090565b6108cc610ef2565b15610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161063f565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e747261637400606482015260840161063f565b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614d1f565b519050610aa0610a9b36869003860186614d84565b611ebd565b8114610b2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f660000000000000000000000000000000000000000000000606482015260840161063f565b6000610b3987611f19565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c4f5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4b9190614d1f565b5114155b610cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e000000000000000000606482015260840161063f565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610da49101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d9a888a614dea565b8a60400135611f49565b610e30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f660000000000000000000000000000606482015260840161063f565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f61573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190614e6e565b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810183905260009161103a9173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f9190614d1f565b602001516fffffffffffffffffffffffffffffffff16611f6d565b92915050565b60006108bf61082c565b565b611054610ef2565b156110bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161063f565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e00606482015260840161063f565b600061116f82611f19565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e207965740000000000000000000000000000606482015260840161063f565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112eb9190614e8b565b81602001516fffffffffffffffffffffffffffffffff1610156113b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a40161063f565b6113d581602001516fffffffffffffffffffffffffffffffff16611f6d565b611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a40161063f565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561150e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115329190614d1f565b82518151919250146115ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a40161063f565b61160b81602001516fffffffffffffffffffffffffffffffff16611f6d565b6116bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a40161063f565b60008381526033602052604090205460ff161561175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a65640000000000000000000000606482015260840161063f565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a08801516117fe93929190612013565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061186390841515815260200190565b60405180910390a2801580156118795750326001145b15611906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a207769746864726177616c206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161063f565b5050505050565b600061191a826010614ed3565b61103a90615208614f03565b600054610100900460ff16158080156119465750600054600160ff909116105b806119605750303b158015611960575060005460ff166001145b6119ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161063f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611a4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611b0357603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611b0b612071565b8015611b6e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611bc6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614f2f565b90506000611bd2612184565b90506000816020015160ff16826000015163ffffffff16611bf39190614f75565b90508215611d2a57600154600090611c2a908390700100000000000000000000000000000000900467ffffffffffffffff16614fdd565b90506000836040015160ff1683611c419190615051565b600154611c619084906fffffffffffffffffffffffffffffffff16615051565b611c6b9190614f75565b600154909150600090611cbc90611c959084906fffffffffffffffffffffffffffffffff1661510d565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612245565b90506001861115611ceb57611ce8611c9582876040015160ff1660018a611ce39190614f2f565b612264565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611d5d908490700100000000000000000000000000000000900467ffffffffffffffff16614f03565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d69740000606482015260840161063f565b600154600090611e6c906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615181565b90506000611e7e48633b9aca006122b9565b611e8890836151be565b905060005a611e979088614f2f565b905080821115611eb357611eb3611eae8284614f2f565b6122d0565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611efc949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611efc9790969591016151d2565b600080611f55866122fe565b9050611f6381868686612330565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120019190614e8b565b61200b9083615229565b421192915050565b6000806000612023866000612360565b905080612059576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16612108576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161063f565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660000361104a5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612221573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190615266565b600061225a612254858561237e565b8361238e565b90505b9392505050565b6000670de0b6b3a76400006122a561227c8583614f75565b61228e90670de0b6b3a7640000614fdd565b6122a085670de0b6b3a7640000615051565b61239d565b6122af9086615051565b61225a9190614f75565b6000818310156122c9578161225d565b5090919050565b6000805a90505b825a6122e39083614f2f565b10156122f9576122f282615305565b91506122d7565b505050565b6060818051906020012060405160200161231a91815260200190565b6040516020818303038152906040529050919050565b6000612357846123418786866123ce565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156122c9578161225d565b60008183126122c9578161225d565b600061225d670de0b6b3a7640000836123b586612e4c565b6123bf9190615051565b6123c99190614f75565b613090565b6060600084511161243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b65790000000000000000000000604482015260640161063f565b6000612446846132cf565b90506000612453866133bb565b905060008460405160200161246a91815260200190565b60405160208183030381529060405290506000805b8451811015612dc357600085828151811061249c5761249c61533d565b602002602001015190508451831115612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e677468000000000000000000000000000000000000606482015260840161063f565b826000036125f057805180516020918201206040516125859261255f92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6125eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f742068617368000000604482015260640161063f565b612747565b8051516020116126a6578051805160209182012060405161261a9261255f92910190815260200190565b6125eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c206861736800000000000000000000000000000000000000000000000000606482015260840161063f565b805184516020808701919091208251919092012014612747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f6520686173680000000000000000000000000000000000000000000000000000606482015260840161063f565b61275360106001615229565b8160200151510361292f57845183036128c75761278d81602001516010815181106127805761278061533d565b602002602001015161341e565b96506000875111612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e6368290000000000606482015260840161063f565b6001865161282e9190614f2f565b82146128bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e636829000000000000606482015260840161063f565b50505050505061225d565b60008584815181106128db576128db61533d565b602001015160f81c60f81b60f81c9050600082602001518260ff16815181106129065761290661533d565b602002602001015190506129198161357e565b9550612926600186615229565b94505050612db0565b600281602001515103612d28576000612947826135a3565b905060008160008151811061295e5761295e61533d565b016020015160f81c9050600061297560028361536c565b61298090600261538e565b90506000612991848360ff166135c7565b9050600061299f8a896135c7565b905060006129ad83836135fd565b905080835114612a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b6579000000000000606482015260840161063f565b60ff851660021480612a54575060ff85166003145b15612c435780825114612ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e646572000000606482015260840161063f565b612b0387602001516001815181106127805761278061533d565b9c5060008d5111612b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c6561662900000000000000606482015260840161063f565b60018c51612ba49190614f2f565b8814612c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c656166290000000000000000606482015260840161063f565b50505050505050505050505061225d565b60ff85161580612c56575060ff85166001145b15612c9557612c828760200151600181518110612c7557612c7561533d565b602002602001015161357e565b9950612c8e818a615229565b9850612d1d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e207072656669780000000000000000000000000000606482015260840161063f565b505050505050612db0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f6465000000000000000000000000000000000000000000000000606482015260840161063f565b5080612dbb81615305565b91505061247f565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e7473000000000000000000000000000000000000000000000000000000606482015260840161063f565b6000808213612eb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161063f565b60006060612ec4846136b1565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136130c157506000919050565b680755bf798b4a1bf1e58212613133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f570000000000000000000000000000000000000000604482015260640161063f565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156132ed576132ed6147d4565b60405190808252806020026020018201604052801561333257816020015b604080518082019091526060808252602082015281526020019060019003908161330b5790505b50915060005b818110156133b457604051806040016040528085838151811061335d5761335d61533d565b6020026020010151815260200161338c86848151811061337f5761337f61533d565b6020026020010151613787565b8152508382815181106133a1576133a161533d565b6020908102919091010152600101613338565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613413578060011b82018184015160001a8060041c8253600f8116600183015350506001016133e5565b509295945050505050565b6060600080600061342e8561379a565b919450925090506000816001811115613449576134496153b1565b146134d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d00000000000000606482015260840161063f565b6134e08284615229565b85511461356f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e646572000000000000000000000000606482015260840161063f565b61235785602001518484614207565b6060602082600001511061359a576135958261341e565b61103a565b61103a8261429b565b606061103a6135c283602001516000815181106127805761278061533d565b6133bb565b6060825182106135e6575060408051602081019091526000815261103a565b61225d83838486516135f89190614f2f565b6142b1565b6000808251845110613610578251613613565b83515b90505b808210801561369a57508282815181106136325761363261533d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106136715761367161533d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156136aa57816001019150613616565b5092915050565b600080821161371c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161063f565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606061103a61379583614489565b614572565b600080600080846000015111613858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161063f565b6020840151805160001a607f811161387d576000600160009450945094505050614200565b60b78111613a8b576000613892608083614f2f565b90508087600001511161394d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a40161063f565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806139c657507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a40161063f565b5060019550935060009250614200915050565b60bf8111613dd9576000613aa060b783614f2f565b905080876000015111613b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a40161063f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613c39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a40161063f565b600184015160088302610100031c60378111613cfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a40161063f565b613d078184615229565b895111613dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a40161063f565b613dc7836001615229565b97509550600094506142009350505050565b60f78111613eba576000613dee60c083614f2f565b905080876000015111613ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a40161063f565b600195509350849250614200915050565b6000613ec760f783614f2f565b905080876000015111613f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a40161063f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a40161063f565b600184015160088302610100031c60378111614124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a40161063f565b61412e8184615229565b8951116141e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a40161063f565b6141ee836001615229565b97509550600194506142009350505050565b9193909250565b60608167ffffffffffffffff811115614222576142226147d4565b6040519080825280601f01601f19166020018201604052801561424c576020820181803683370190505b509050811561225d5760006142618486615229565b90506020820160005b8481101561428257828101518282015260200161426a565b84811115614291576000858301525b5050509392505050565b606061103a826020015160008460000151614207565b60608182601f011015614320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161063f565b82828401101561438c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161063f565b818301845110156143f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161063f565b6060821580156144185760405191506000825260208201604052614480565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614451578051835260209283019201614439565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161063f565b50604080518082019091528151815260209182019181019190915290565b606060008060006145828561379a565b91945092509050600181600181111561459d5761459d6153b1565b1461462a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d0000000000000000606482015260840161063f565b84516146368385615229565b146146c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e6465720000000000000000000000000000606482015260840161063f565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816146da5790505093506000835b86518110156147c85760008061474d6040518060400160405280858c600001516147319190614f2f565b8152602001858c602001516147469190615229565b905261379a565b5091509150604051806040016040528083836147699190615229565b8152602001848b6020015161477e9190615229565b8152508885815181106147935761479361533d565b60209081029190910101526147a9600185615229565b93506147b58183615229565b6147bf9084615229565b92505050614707565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561484a5761484a6147d4565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461487457600080fd5b50565b600082601f83011261488857600080fd5b813567ffffffffffffffff8111156148a2576148a26147d4565b6148d360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614803565b8181528460208386010111156148e857600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561491757600080fd5b60405160c0810167ffffffffffffffff828210818311171561493b5761493b6147d4565b81604052829350843583526020850135915061495682614852565b8160208401526040850135915061496c82614852565b816040840152606085013560608401526080850135608084015260a085013591508082111561499a57600080fd5b506149a785828601614877565b60a0830152505092915050565b600080600080600085870360e08112156149cd57600080fd5b863567ffffffffffffffff808211156149e557600080fd5b6149f18a838b01614905565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614a2a57600080fd5b60408901955060c0890135925080831115614a4457600080fd5b828901925089601f840112614a5857600080fd5b8235915080821115614a6957600080fd5b508860208260051b8401011115614a7f57600080fd5b959894975092955050506020019190565b60005b83811015614aab578181015183820152602001614a93565b83811115611b6e5750506000910152565b60008151808452614ad4816020860160208601614a90565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061225d6020830184614abc565b600060208284031215614b2b57600080fd5b5035919050565b600060208284031215614b4457600080fd5b813567ffffffffffffffff811115614b5b57600080fd5b614b6784828501614905565b949350505050565b803567ffffffffffffffff81168114614b8757600080fd5b919050565b600060208284031215614b9e57600080fd5b61225d82614b6f565b600080600060608486031215614bbc57600080fd5b8335614bc781614852565b92506020840135614bd781614852565b91506040840135614be781614852565b809150509250925092565b801515811461487457600080fd5b600080600080600060a08688031215614c1857600080fd5b8535614c2381614852565b945060208601359350614c3860408701614b6f565b92506060860135614c4881614bf2565b9150608086013567ffffffffffffffff811115614c6457600080fd5b614c7088828901614877565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614cd1816049850160208701614a90565b919091016049019695505050505050565b600060208284031215614cf457600080fd5b815161225d81614852565b80516fffffffffffffffffffffffffffffffff81168114614b8757600080fd5b600060608284031215614d3157600080fd5b6040516060810181811067ffffffffffffffff82111715614d5457614d546147d4565b60405282518152614d6760208401614cff565b6020820152614d7860408401614cff565b60408201529392505050565b600060808284031215614d9657600080fd5b6040516080810181811067ffffffffffffffff82111715614db957614db96147d4565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614e0557614e056147d4565b8360051b6020614e16818301614803565b868152918501918181019036841115614e2e57600080fd5b865b84811015614e6257803586811115614e485760008081fd5b614e5436828b01614877565b845250918301918301614e30565b50979650505050505050565b600060208284031215614e8057600080fd5b815161225d81614bf2565b600060208284031215614e9d57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614efa57614efa614ea4565b02949350505050565b600067ffffffffffffffff808316818516808303821115614f2657614f26614ea4565b01949350505050565b600082821015614f4157614f41614ea4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614f8457614f84614f46565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614fd857614fd8614ea4565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561501757615017614ea4565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561504b5761504b614ea4565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561509257615092614ea4565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156150cd576150cd614ea4565b600087129250878205871284841616156150e9576150e9614ea4565b878505871281841616156150ff576150ff614ea4565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561514757615147614ea4565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561517b5761517b614ea4565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151b9576151b9614ea4565b500290565b6000826151cd576151cd614f46565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261521d60c0830184614abc565b98975050505050505050565b6000821982111561523c5761523c614ea4565b500190565b805163ffffffff81168114614b8757600080fd5b805160ff81168114614b8757600080fd5b600060c0828403121561527857600080fd5b60405160c0810181811067ffffffffffffffff8211171561529b5761529b6147d4565b6040526152a783615241565b81526152b560208401615255565b60208201526152c660408401615255565b60408201526152d760608401615241565b60608201526152e860808401615241565b60808201526152f960a08401614cff565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361533657615336614ea4565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff83168061537f5761537f614f46565b8060ff84160691505092915050565b600060ff821660ff8416808210156153a8576153a8614ea4565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
+      "data": "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028f565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001c160201b62001f071760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603680546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b03191661010085841602179055603254166200016a57603280546001600160a01b03191661dead1790555b62000174620001d0565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200023d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600154600160c01b90046001600160401b03166000036200028d5760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b615f24806200029f6000396000f3fe6080604052600436106101635760003560e01c80638c3152e9116100c0578063b69ef8a811610074578063cff0ab9611610059578063cff0ab961461044e578063e965084c146104ef578063e9e05c421461057b57600080fd5b8063b69ef8a81461040b578063c0c53b8b1461042e57600080fd5b80639bf62d82116100a55780639bf62d8214610375578063a14238e7146103a2578063a35d99df146103d257600080fd5b80638c3152e9146103285780639b5f694a1461034857600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102e857806371cfaa3f146103085780638b4c40b01461018857600080fd5b806354fd4d501461026d5780635c975abb146102c357600080fd5b806335e80ab31161014857806335e80ab314610206578063452a9320146102385780634870496f1461024d57600080fd5b8063149f2f221461018f57806333d7e2bd146101af57600080fd5b3661018a576101883334620186a0600060405180602001604052806000815250610589565b005b600080fd5b34801561019b57600080fd5b506101886101aa366004615344565b61062e565b3480156101bb57600080fd5b506037546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021257600080fd5b506035546101dc90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024457600080fd5b506101dc61086f565b34801561025957600080fd5b50610188610268366004615478565b610907565b34801561027957600080fd5b506102b66040518060400160405280600581526020017f322e372e3000000000000000000000000000000000000000000000000000000081525081565b6040516101fd91906155ca565b3480156102cf57600080fd5b506102d8610eb4565b60405190151581526020016101fd565b3480156102f457600080fd5b506102d86103033660046155dd565b610f47565b34801561031457600080fd5b50610188610323366004615605565b611002565b34801561033457600080fd5b5061018861034336600461564b565b6111c4565b34801561035457600080fd5b506036546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561038157600080fd5b506032546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ae57600080fd5b506102d86103bd3660046155dd565b60336020526000908152604090205460ff1681565b3480156103de57600080fd5b506103f26103ed366004615688565b611c46565b60405167ffffffffffffffff90911681526020016101fd565b34801561041757600080fd5b50610420611c5f565b6040519081526020016101fd565b34801561043a57600080fd5b506101886104493660046156a3565b611cb9565b34801561045a57600080fd5b506001546104b6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101fd565b3480156104fb57600080fd5b5061054d61050a3660046155dd565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101fd565b6101886105893660046156ee565b8260005a90506000610599611f23565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015906105d557503415155b1561060c576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61061a883489898989611fc0565b50610625828261216c565b50505050505050565b8260005a9050600061063e611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016106b0576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87603d60008282546106c2919061579a565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075891906157b2565b905061077c73ffffffffffffffffffffffffffffffffffffffff831633308c612439565b610786898261579a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156107f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081491906157b2565b1461084b576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108598a8a8a8a8a8a611fc0565b5050610865828261216c565b5050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090291906157cb565b905090565b61090f610eb4565b15610946576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109af576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a439190615808565b519050610a5d610a583686900386018661586d565b612515565b8114610af0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610afb87612571565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c115750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190615808565b5114155b610c9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610ae7565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610d669101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d5c888a6158d3565b8a604001356125a1565b610df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610ae7565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190615957565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610ffc9173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe19190615808565b602001516fffffffffffffffffffffffffffffffff166125c5565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff163314611053576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105f6201388061266b565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3290849081906201388090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f00000000000000000000000000000000000000000000000000000000179052905161117c96959493929101615974565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526111b4916155ca565b60405180910390a450505050565b565b6111cc610eb4565b15611203576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611256576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061126182612571565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610ae7565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113dd91906157b2565b81602001516fffffffffffffffffffffffffffffffff1610156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610ae7565b6114c781602001516fffffffffffffffffffffffffffffffff166125c5565b611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015611600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116249190615808565b82518151919250146116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610ae7565b6116fd81602001516fffffffffffffffffffffffffffffffff166125c5565b6117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60008381526033602052604090205460ff161561184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610ae7565b6000838152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055806118d9611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161193c576119358660400151876080015188606001518960a001516126cd565b9150611b8f565b8073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff16036119a5576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086015115611b66578560600151603d60008282546119c591906159d9565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b91906157b2565b9050611a90876040015188606001518473ffffffffffffffffffffffffffffffffffffffff1661272b9092919063ffffffff16565b6060870151611a9f90826159d9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906157b2565b14611b64576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08601515115611b8a576119358660400151876080015160008960a001516126cd565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405185907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611bf190851515815260200190565b60405180910390a281158015611c075750326001145b15611c3e576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000611c538260106159f0565b610ffc90615208615a20565b600080611c6a611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611cb1574791505090565b5050603d5490565b600054610100900460ff1615808015611cd95750600054600160ff909116105b80611cf35750303b158015611cf3575060005460ff166001145b611d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ae7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611ddd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611e9657603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611e9e612786565b8015611f0157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015611f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb79190615a4c565b90939092509050565b818015611fe2575073ffffffffffffffffffffffffffffffffffffffff861615155b15612019576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120238151611c46565b67ffffffffffffffff168367ffffffffffffffff161015612070576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0815111156120ae576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146120cf575033731111000000000000000000000000000000001111015b600086868686866040516020016120ea959493929190615974565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161215a91906155ca565b60405180910390a45050505050505050565b6001546000906121a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436159d9565b905060006121ae612899565b90506000816020015160ff16826000015163ffffffff166121cf9190615ab5565b9050821561230657600154600090612206908390700100000000000000000000000000000000900467ffffffffffffffff16615b1d565b90506000836040015160ff168361221d9190615b91565b60015461223d9084906fffffffffffffffffffffffffffffffff16615b91565b6122479190615ab5565b600154909150600090612298906122719084906fffffffffffffffffffffffffffffffff16615c4d565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff1661295a565b905060018611156122c7576122c461227182876040015160ff1660018a6122bf91906159d9565b612979565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090612339908490700100000000000000000000000000000000900467ffffffffffffffff16615a20565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156123c6576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906123f2906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615cc1565b9050600061240448633b9aca006129ce565b61240e9083615cfe565b905060005a61241d90886159d9565b9050808211156108655761086561243482846159d9565b6129e5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f019085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a0e565b60008160000151826020015183604001518460600151604051602001612554949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097612554979096959101615d12565b6000806125ad86612b1a565b90506125bb81868686612b4c565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015612635573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265991906157b2565b612663908361579a565b421192915050565b6001805463ffffffff831691906010906126a4908490700100000000000000000000000000000000900467ffffffffffffffff16615a20565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008060006126dd866000612b7c565b905080612713576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127819084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612493565b505050565b600054610100900460ff1661281d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610ae7565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036111c25760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612936573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190615d7d565b600061296f6129698585612b9a565b83612baa565b90505b9392505050565b6000670de0b6b3a76400006129ba6129918583615ab5565b6129a390670de0b6b3a7640000615b1d565b6129b585670de0b6b3a7640000615b91565b612bb9565b6129c49086615b91565b61296f9190615ab5565b6000818310156129de5781612972565b5090919050565b6000805a90505b825a6129f890836159d9565b101561278157612a0782615e20565b91506129ec565b6000612a70826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612bea9092919063ffffffff16565b8051909150156127815780806020019051810190612a8e9190615957565b612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ae7565b60608180519060200120604051602001612b3691815260200190565b6040516020818303038152906040529050919050565b6000612b7384612b5d878686612bf9565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156129de5781612972565b60008183126129de5781612972565b6000612972670de0b6b3a764000083612bd186613677565b612bdb9190615b91565b612be59190615ab5565b6138bb565b606061296f8484600085613afa565b60606000845111612c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610ae7565b6000612c7184613c90565b90506000612c7e86613d7c565b9050600084604051602001612c9591815260200190565b60405160208183030381529060405290506000805b84518110156135ee576000858281518110612cc757612cc7615e58565b602002602001015190508451831115612d62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610ae7565b82600003612e1b5780518051602091820120604051612db092612d8a92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610ae7565b612f72565b805151602011612ed15780518051602091820120604051612e4592612d8a92910190815260200190565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610ae7565b805184516020808701919091208251919092012014612f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610ae7565b612f7e6010600161579a565b8160200151510361315a57845183036130f257612fb88160200151601081518110612fab57612fab615e58565b6020026020010151613ddf565b9650600087511161304b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610ae7565b6001865161305991906159d9565b82146130e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610ae7565b505050505050612972565b600085848151811061310657613106615e58565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061313157613131615e58565b6020026020010151905061314481613f3f565b955061315160018661579a565b945050506135db565b60028160200151510361355357600061317282613f64565b905060008160008151811061318957613189615e58565b016020015160f81c905060006131a0600283615e87565b6131ab906002615ea9565b905060006131bc848360ff16613f88565b905060006131ca8a89613f88565b905060006131d88383613fbe565b90508083511461326a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610ae7565b60ff85166002148061327f575060ff85166003145b1561346e5780825114613314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610ae7565b61332e8760200151600181518110612fab57612fab615e58565b9c5060008d51116133c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610ae7565b60018c516133cf91906159d9565b881461345d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610ae7565b505050505050505050505050612972565b60ff85161580613481575060ff85166001145b156134c0576134ad87602001516001815181106134a0576134a0615e58565b6020026020010151613f3f565b99506134b9818a61579a565b9850613548565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610ae7565b5050505050506135db565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610ae7565b50806135e681615e20565b915050612caa565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610ae7565b60008082136136e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b600060606136ef84614072565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136138ec57506000919050565b680755bf798b4a1bf1e5821261395e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610ae7565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ae7565b73ffffffffffffffffffffffffffffffffffffffff85163b613c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ae7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c339190615ecc565b60006040518083038185875af1925050503d8060008114613c70576040519150601f19603f3d011682016040523d82523d6000602084013e613c75565b606091505b5091509150613c85828286614148565b979650505050505050565b80516060908067ffffffffffffffff811115613cae57613cae615238565b604051908082528060200260200182016040528015613cf357816020015b6040805180820190915260608082526020820152815260200190600190039081613ccc5790505b50915060005b81811015613d75576040518060400160405280858381518110613d1e57613d1e615e58565b60200260200101518152602001613d4d868481518110613d4057613d40615e58565b602002602001015161419b565b815250838281518110613d6257613d62615e58565b6020908102919091010152600101613cf9565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613dd4578060011b82018184015160001a8060041c8253600f811660018301535050600101613da6565b509295945050505050565b60606000806000613def856141ae565b919450925090506000816001811115613e0a57613e0a615ee8565b14613e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610ae7565b613ea1828461579a565b855114613f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610ae7565b612b7385602001518484614c1b565b60606020826000015110613f5b57613f5682613ddf565b610ffc565b610ffc82614caf565b6060610ffc613f838360200151600081518110612fab57612fab615e58565b613d7c565b606082518210613fa75750604080516020810190915260008152610ffc565b6129728383848651613fb991906159d9565b614cc5565b6000808251845110613fd1578251613fd4565b83515b90505b808210801561405b5750828281518110613ff357613ff3615e58565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684838151811061403257614032615e58565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561406b57816001019150613fd7565b5092915050565b60008082116140dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608315614157575081612972565b8251156141675782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae791906155ca565b6060610ffc6141a983614e9d565b614f86565b60008060008084600001511161426c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610ae7565b6020840151805160001a607f8111614291576000600160009450945094505050614c14565b60b7811161449f5760006142a66080836159d9565b905080876000015111614361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610ae7565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806143da57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b61448c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610ae7565b5060019550935060009250614c14915050565b60bf81116147ed5760006144b460b7836159d9565b90508087600001511161456f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610ae7565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361464d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610ae7565b600184015160088302610100031c60378111614711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610ae7565b61471b818461579a565b8951116147d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610ae7565b6147db83600161579a565b9750955060009450614c149350505050565b60f781116148ce57600061480260c0836159d9565b9050808760000151116148bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610ae7565b600195509350849250614c14915050565b60006148db60f7836159d9565b905080876000015111614996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610ae7565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610ae7565b600184015160088302610100031c60378111614b38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610ae7565b614b42818461579a565b895111614bf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610ae7565b614c0283600161579a565b9750955060019450614c149350505050565b9193909250565b60608167ffffffffffffffff811115614c3657614c36615238565b6040519080825280601f01601f191660200182016040528015614c60576020820181803683370190505b5090508115612972576000614c75848661579a565b90506020820160005b84811015614c96578281015182820152602001614c7e565b84811115614ca5576000858301525b5050509392505050565b6060610ffc826020015160008460000151614c1b565b60608182601f011015614d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b828284011015614da0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b81830184511015614e0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610ae7565b606082158015614e2c5760405191506000825260208201604052614e94565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614e65578051835260209283019201614e4d565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614f68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610ae7565b50604080518082019091528151815260209182019181019190915290565b60606000806000614f96856141ae565b919450925090506001816001811115614fb157614fb1615ee8565b1461503e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610ae7565b845161504a838561579a565b146150d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610ae7565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816150ee5790505093506000835b86518110156151dc576000806151616040518060400160405280858c6000015161514591906159d9565b8152602001858c6020015161515a919061579a565b90526141ae565b50915091506040518060400160405280838361517d919061579a565b8152602001848b60200151615192919061579a565b8152508885815181106151a7576151a7615e58565b60209081029190910101526151bd60018561579a565b93506151c9818361579a565b6151d3908461579a565b9250505061511b565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461520a57600080fd5b50565b803567ffffffffffffffff8116811461522557600080fd5b919050565b801515811461520a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156152ae576152ae615238565b604052919050565b600082601f8301126152c757600080fd5b813567ffffffffffffffff8111156152e1576152e1615238565b61531260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615267565b81815284602083860101111561532757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561535d57600080fd5b8635615368816151e8565b955060208701359450604087013593506153846060880161520d565b925060808701356153948161522a565b915060a087013567ffffffffffffffff8111156153b057600080fd5b6153bc89828a016152b6565b9150509295509295509295565b600060c082840312156153db57600080fd5b60405160c0810167ffffffffffffffff82821081831117156153ff576153ff615238565b81604052829350843583526020850135915061541a826151e8565b81602084015260408501359150615430826151e8565b816040840152606085013560608401526080850135608084015260a085013591508082111561545e57600080fd5b5061546b858286016152b6565b60a0830152505092915050565b600080600080600085870360e081121561549157600080fd5b863567ffffffffffffffff808211156154a957600080fd5b6154b58a838b016153c9565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0840112156154ee57600080fd5b60408901955060c089013592508083111561550857600080fd5b828901925089601f84011261551c57600080fd5b823591508082111561552d57600080fd5b508860208260051b840101111561554357600080fd5b959894975092955050506020019190565b60005b8381101561556f578181015183820152602001615557565b83811115611f015750506000910152565b60008151808452615598816020860160208601615554565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129726020830184615580565b6000602082840312156155ef57600080fd5b5035919050565b60ff8116811461520a57600080fd5b6000806000806080858703121561561b57600080fd5b8435615626816151e8565b93506020850135615636816155f6565b93969395505050506040820135916060013590565b60006020828403121561565d57600080fd5b813567ffffffffffffffff81111561567457600080fd5b615680848285016153c9565b949350505050565b60006020828403121561569a57600080fd5b6129728261520d565b6000806000606084860312156156b857600080fd5b83356156c3816151e8565b925060208401356156d3816151e8565b915060408401356156e3816151e8565b809150509250925092565b600080600080600060a0868803121561570657600080fd5b8535615711816151e8565b9450602086013593506157266040870161520d565b925060608601356157368161522a565b9150608086013567ffffffffffffffff81111561575257600080fd5b61575e888289016152b6565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157ad576157ad61576b565b500190565b6000602082840312156157c457600080fd5b5051919050565b6000602082840312156157dd57600080fd5b8151612972816151e8565b80516fffffffffffffffffffffffffffffffff8116811461522557600080fd5b60006060828403121561581a57600080fd5b6040516060810181811067ffffffffffffffff8211171561583d5761583d615238565b60405282518152615850602084016157e8565b6020820152615861604084016157e8565b60408201529392505050565b60006080828403121561587f57600080fd5b6040516080810181811067ffffffffffffffff821117156158a2576158a2615238565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff808411156158ee576158ee615238565b8360051b60206158ff818301615267565b86815291850191818101903684111561591757600080fd5b865b8481101561594b578035868111156159315760008081fd5b61593d36828b016152b6565b845250918301918301615919565b50979650505050505050565b60006020828403121561596957600080fd5b81516129728161522a565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516159c8816049850160208701615554565b919091016049019695505050505050565b6000828210156159eb576159eb61576b565b500390565b600067ffffffffffffffff80831681851681830481118215151615615a1757615a1761576b565b02949350505050565b600067ffffffffffffffff808316818516808303821115615a4357615a4361576b565b01949350505050565b60008060408385031215615a5f57600080fd5b8251615a6a816151e8565b6020840151909250615a7b816155f6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615ac457615ac4615a86565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b1857615b1861576b565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615615b5757615b5761576b565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615615b8b57615b8b61576b565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd257615bd261576b565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0d57615c0d61576b565b60008712925087820587128484161615615c2957615c2961576b565b87850587128184161615615c3f57615c3f61576b565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615c8757615c8761576b565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615615cbb57615cbb61576b565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615cf957615cf961576b565b500290565b600082615d0d57615d0d615a86565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152615d5d60c0830184615580565b98975050505050505050565b805163ffffffff8116811461522557600080fd5b600060c08284031215615d8f57600080fd5b60405160c0810181811067ffffffffffffffff82111715615db257615db2615238565b604052615dbe83615d69565b81526020830151615dce816155f6565b60208201526040830151615de1816155f6565b6040820152615df260608401615d69565b6060820152615e0360808401615d69565b6080820152615e1460a084016157e8565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615e5157615e5161576b565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680615e9a57615e9a615a86565b8060ff84160691505092915050565b600060ff821660ff841680821015615ec357615ec361576b565b90039392505050565b60008251615ede818460208701615554565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
+      "deployedCode": "0x6080604052600436106101635760003560e01c80638c3152e9116100c0578063b69ef8a811610074578063cff0ab9611610059578063cff0ab961461044e578063e965084c146104ef578063e9e05c421461057b57600080fd5b8063b69ef8a81461040b578063c0c53b8b1461042e57600080fd5b80639bf62d82116100a55780639bf62d8214610375578063a14238e7146103a2578063a35d99df146103d257600080fd5b80638c3152e9146103285780639b5f694a1461034857600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102e857806371cfaa3f146103085780638b4c40b01461018857600080fd5b806354fd4d501461026d5780635c975abb146102c357600080fd5b806335e80ab31161014857806335e80ab314610206578063452a9320146102385780634870496f1461024d57600080fd5b8063149f2f221461018f57806333d7e2bd146101af57600080fd5b3661018a576101883334620186a0600060405180602001604052806000815250610589565b005b600080fd5b34801561019b57600080fd5b506101886101aa366004615344565b61062e565b3480156101bb57600080fd5b506037546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021257600080fd5b506035546101dc90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024457600080fd5b506101dc61086f565b34801561025957600080fd5b50610188610268366004615478565b610907565b34801561027957600080fd5b506102b66040518060400160405280600581526020017f322e372e3000000000000000000000000000000000000000000000000000000081525081565b6040516101fd91906155ca565b3480156102cf57600080fd5b506102d8610eb4565b60405190151581526020016101fd565b3480156102f457600080fd5b506102d86103033660046155dd565b610f47565b34801561031457600080fd5b50610188610323366004615605565b611002565b34801561033457600080fd5b5061018861034336600461564b565b6111c4565b34801561035457600080fd5b506036546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561038157600080fd5b506032546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ae57600080fd5b506102d86103bd3660046155dd565b60336020526000908152604090205460ff1681565b3480156103de57600080fd5b506103f26103ed366004615688565b611c46565b60405167ffffffffffffffff90911681526020016101fd565b34801561041757600080fd5b50610420611c5f565b6040519081526020016101fd565b34801561043a57600080fd5b506101886104493660046156a3565b611cb9565b34801561045a57600080fd5b506001546104b6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101fd565b3480156104fb57600080fd5b5061054d61050a3660046155dd565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101fd565b6101886105893660046156ee565b8260005a90506000610599611f23565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015906105d557503415155b1561060c576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61061a883489898989611fc0565b50610625828261216c565b50505050505050565b8260005a9050600061063e611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016106b0576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87603d60008282546106c2919061579a565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075891906157b2565b905061077c73ffffffffffffffffffffffffffffffffffffffff831633308c612439565b610786898261579a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156107f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081491906157b2565b1461084b576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108598a8a8a8a8a8a611fc0565b5050610865828261216c565b5050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090291906157cb565b905090565b61090f610eb4565b15610946576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109af576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a439190615808565b519050610a5d610a583686900386018661586d565b612515565b8114610af0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610afb87612571565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c115750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190615808565b5114155b610c9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610ae7565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610d669101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d5c888a6158d3565b8a604001356125a1565b610df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610ae7565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190615957565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610ffc9173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe19190615808565b602001516fffffffffffffffffffffffffffffffff166125c5565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff163314611053576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105f6201388061266b565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3290849081906201388090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f00000000000000000000000000000000000000000000000000000000179052905161117c96959493929101615974565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526111b4916155ca565b60405180910390a450505050565b565b6111cc610eb4565b15611203576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611256576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061126182612571565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610ae7565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113dd91906157b2565b81602001516fffffffffffffffffffffffffffffffff1610156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610ae7565b6114c781602001516fffffffffffffffffffffffffffffffff166125c5565b611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015611600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116249190615808565b82518151919250146116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610ae7565b6116fd81602001516fffffffffffffffffffffffffffffffff166125c5565b6117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60008381526033602052604090205460ff161561184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610ae7565b6000838152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055806118d9611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161193c576119358660400151876080015188606001518960a001516126cd565b9150611b8f565b8073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff16036119a5576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086015115611b66578560600151603d60008282546119c591906159d9565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b91906157b2565b9050611a90876040015188606001518473ffffffffffffffffffffffffffffffffffffffff1661272b9092919063ffffffff16565b6060870151611a9f90826159d9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906157b2565b14611b64576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08601515115611b8a576119358660400151876080015160008960a001516126cd565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405185907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611bf190851515815260200190565b60405180910390a281158015611c075750326001145b15611c3e576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000611c538260106159f0565b610ffc90615208615a20565b600080611c6a611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611cb1574791505090565b5050603d5490565b600054610100900460ff1615808015611cd95750600054600160ff909116105b80611cf35750303b158015611cf3575060005460ff166001145b611d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ae7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611ddd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611e9657603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611e9e612786565b8015611f0157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015611f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb79190615a4c565b90939092509050565b818015611fe2575073ffffffffffffffffffffffffffffffffffffffff861615155b15612019576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120238151611c46565b67ffffffffffffffff168367ffffffffffffffff161015612070576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0815111156120ae576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146120cf575033731111000000000000000000000000000000001111015b600086868686866040516020016120ea959493929190615974565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161215a91906155ca565b60405180910390a45050505050505050565b6001546000906121a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436159d9565b905060006121ae612899565b90506000816020015160ff16826000015163ffffffff166121cf9190615ab5565b9050821561230657600154600090612206908390700100000000000000000000000000000000900467ffffffffffffffff16615b1d565b90506000836040015160ff168361221d9190615b91565b60015461223d9084906fffffffffffffffffffffffffffffffff16615b91565b6122479190615ab5565b600154909150600090612298906122719084906fffffffffffffffffffffffffffffffff16615c4d565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff1661295a565b905060018611156122c7576122c461227182876040015160ff1660018a6122bf91906159d9565b612979565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090612339908490700100000000000000000000000000000000900467ffffffffffffffff16615a20565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156123c6576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906123f2906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615cc1565b9050600061240448633b9aca006129ce565b61240e9083615cfe565b905060005a61241d90886159d9565b9050808211156108655761086561243482846159d9565b6129e5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f019085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a0e565b60008160000151826020015183604001518460600151604051602001612554949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097612554979096959101615d12565b6000806125ad86612b1a565b90506125bb81868686612b4c565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015612635573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265991906157b2565b612663908361579a565b421192915050565b6001805463ffffffff831691906010906126a4908490700100000000000000000000000000000000900467ffffffffffffffff16615a20565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008060006126dd866000612b7c565b905080612713576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127819084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612493565b505050565b600054610100900460ff1661281d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610ae7565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036111c25760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612936573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190615d7d565b600061296f6129698585612b9a565b83612baa565b90505b9392505050565b6000670de0b6b3a76400006129ba6129918583615ab5565b6129a390670de0b6b3a7640000615b1d565b6129b585670de0b6b3a7640000615b91565b612bb9565b6129c49086615b91565b61296f9190615ab5565b6000818310156129de5781612972565b5090919050565b6000805a90505b825a6129f890836159d9565b101561278157612a0782615e20565b91506129ec565b6000612a70826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612bea9092919063ffffffff16565b8051909150156127815780806020019051810190612a8e9190615957565b612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ae7565b60608180519060200120604051602001612b3691815260200190565b6040516020818303038152906040529050919050565b6000612b7384612b5d878686612bf9565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156129de5781612972565b60008183126129de5781612972565b6000612972670de0b6b3a764000083612bd186613677565b612bdb9190615b91565b612be59190615ab5565b6138bb565b606061296f8484600085613afa565b60606000845111612c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610ae7565b6000612c7184613c90565b90506000612c7e86613d7c565b9050600084604051602001612c9591815260200190565b60405160208183030381529060405290506000805b84518110156135ee576000858281518110612cc757612cc7615e58565b602002602001015190508451831115612d62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610ae7565b82600003612e1b5780518051602091820120604051612db092612d8a92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610ae7565b612f72565b805151602011612ed15780518051602091820120604051612e4592612d8a92910190815260200190565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610ae7565b805184516020808701919091208251919092012014612f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610ae7565b612f7e6010600161579a565b8160200151510361315a57845183036130f257612fb88160200151601081518110612fab57612fab615e58565b6020026020010151613ddf565b9650600087511161304b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610ae7565b6001865161305991906159d9565b82146130e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610ae7565b505050505050612972565b600085848151811061310657613106615e58565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061313157613131615e58565b6020026020010151905061314481613f3f565b955061315160018661579a565b945050506135db565b60028160200151510361355357600061317282613f64565b905060008160008151811061318957613189615e58565b016020015160f81c905060006131a0600283615e87565b6131ab906002615ea9565b905060006131bc848360ff16613f88565b905060006131ca8a89613f88565b905060006131d88383613fbe565b90508083511461326a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610ae7565b60ff85166002148061327f575060ff85166003145b1561346e5780825114613314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610ae7565b61332e8760200151600181518110612fab57612fab615e58565b9c5060008d51116133c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610ae7565b60018c516133cf91906159d9565b881461345d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610ae7565b505050505050505050505050612972565b60ff85161580613481575060ff85166001145b156134c0576134ad87602001516001815181106134a0576134a0615e58565b6020026020010151613f3f565b99506134b9818a61579a565b9850613548565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610ae7565b5050505050506135db565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610ae7565b50806135e681615e20565b915050612caa565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610ae7565b60008082136136e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b600060606136ef84614072565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136138ec57506000919050565b680755bf798b4a1bf1e5821261395e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610ae7565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ae7565b73ffffffffffffffffffffffffffffffffffffffff85163b613c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ae7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c339190615ecc565b60006040518083038185875af1925050503d8060008114613c70576040519150601f19603f3d011682016040523d82523d6000602084013e613c75565b606091505b5091509150613c85828286614148565b979650505050505050565b80516060908067ffffffffffffffff811115613cae57613cae615238565b604051908082528060200260200182016040528015613cf357816020015b6040805180820190915260608082526020820152815260200190600190039081613ccc5790505b50915060005b81811015613d75576040518060400160405280858381518110613d1e57613d1e615e58565b60200260200101518152602001613d4d868481518110613d4057613d40615e58565b602002602001015161419b565b815250838281518110613d6257613d62615e58565b6020908102919091010152600101613cf9565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613dd4578060011b82018184015160001a8060041c8253600f811660018301535050600101613da6565b509295945050505050565b60606000806000613def856141ae565b919450925090506000816001811115613e0a57613e0a615ee8565b14613e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610ae7565b613ea1828461579a565b855114613f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610ae7565b612b7385602001518484614c1b565b60606020826000015110613f5b57613f5682613ddf565b610ffc565b610ffc82614caf565b6060610ffc613f838360200151600081518110612fab57612fab615e58565b613d7c565b606082518210613fa75750604080516020810190915260008152610ffc565b6129728383848651613fb991906159d9565b614cc5565b6000808251845110613fd1578251613fd4565b83515b90505b808210801561405b5750828281518110613ff357613ff3615e58565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684838151811061403257614032615e58565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561406b57816001019150613fd7565b5092915050565b60008082116140dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608315614157575081612972565b8251156141675782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae791906155ca565b6060610ffc6141a983614e9d565b614f86565b60008060008084600001511161426c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610ae7565b6020840151805160001a607f8111614291576000600160009450945094505050614c14565b60b7811161449f5760006142a66080836159d9565b905080876000015111614361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610ae7565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806143da57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b61448c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610ae7565b5060019550935060009250614c14915050565b60bf81116147ed5760006144b460b7836159d9565b90508087600001511161456f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610ae7565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361464d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610ae7565b600184015160088302610100031c60378111614711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610ae7565b61471b818461579a565b8951116147d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610ae7565b6147db83600161579a565b9750955060009450614c149350505050565b60f781116148ce57600061480260c0836159d9565b9050808760000151116148bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610ae7565b600195509350849250614c14915050565b60006148db60f7836159d9565b905080876000015111614996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610ae7565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610ae7565b600184015160088302610100031c60378111614b38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610ae7565b614b42818461579a565b895111614bf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610ae7565b614c0283600161579a565b9750955060019450614c149350505050565b9193909250565b60608167ffffffffffffffff811115614c3657614c36615238565b6040519080825280601f01601f191660200182016040528015614c60576020820181803683370190505b5090508115612972576000614c75848661579a565b90506020820160005b84811015614c96578281015182820152602001614c7e565b84811115614ca5576000858301525b5050509392505050565b6060610ffc826020015160008460000151614c1b565b60608182601f011015614d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b828284011015614da0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b81830184511015614e0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610ae7565b606082158015614e2c5760405191506000825260208201604052614e94565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614e65578051835260209283019201614e4d565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614f68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610ae7565b50604080518082019091528151815260209182019181019190915290565b60606000806000614f96856141ae565b919450925090506001816001811115614fb157614fb1615ee8565b1461503e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610ae7565b845161504a838561579a565b146150d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610ae7565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816150ee5790505093506000835b86518110156151dc576000806151616040518060400160405280858c6000015161514591906159d9565b8152602001858c6020015161515a919061579a565b90526141ae565b50915091506040518060400160405280838361517d919061579a565b8152602001848b60200151615192919061579a565b8152508885815181106151a7576151a7615e58565b60209081029190910101526151bd60018561579a565b93506151c9818361579a565b6151d3908461579a565b9250505061511b565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461520a57600080fd5b50565b803567ffffffffffffffff8116811461522557600080fd5b919050565b801515811461520a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156152ae576152ae615238565b604052919050565b600082601f8301126152c757600080fd5b813567ffffffffffffffff8111156152e1576152e1615238565b61531260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615267565b81815284602083860101111561532757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561535d57600080fd5b8635615368816151e8565b955060208701359450604087013593506153846060880161520d565b925060808701356153948161522a565b915060a087013567ffffffffffffffff8111156153b057600080fd5b6153bc89828a016152b6565b9150509295509295509295565b600060c082840312156153db57600080fd5b60405160c0810167ffffffffffffffff82821081831117156153ff576153ff615238565b81604052829350843583526020850135915061541a826151e8565b81602084015260408501359150615430826151e8565b816040840152606085013560608401526080850135608084015260a085013591508082111561545e57600080fd5b5061546b858286016152b6565b60a0830152505092915050565b600080600080600085870360e081121561549157600080fd5b863567ffffffffffffffff808211156154a957600080fd5b6154b58a838b016153c9565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0840112156154ee57600080fd5b60408901955060c089013592508083111561550857600080fd5b828901925089601f84011261551c57600080fd5b823591508082111561552d57600080fd5b508860208260051b840101111561554357600080fd5b959894975092955050506020019190565b60005b8381101561556f578181015183820152602001615557565b83811115611f015750506000910152565b60008151808452615598816020860160208601615554565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129726020830184615580565b6000602082840312156155ef57600080fd5b5035919050565b60ff8116811461520a57600080fd5b6000806000806080858703121561561b57600080fd5b8435615626816151e8565b93506020850135615636816155f6565b93969395505050506040820135916060013590565b60006020828403121561565d57600080fd5b813567ffffffffffffffff81111561567457600080fd5b615680848285016153c9565b949350505050565b60006020828403121561569a57600080fd5b6129728261520d565b6000806000606084860312156156b857600080fd5b83356156c3816151e8565b925060208401356156d3816151e8565b915060408401356156e3816151e8565b809150509250925092565b600080600080600060a0868803121561570657600080fd5b8535615711816151e8565b9450602086013593506157266040870161520d565b925060608601356157368161522a565b9150608086013567ffffffffffffffff81111561575257600080fd5b61575e888289016152b6565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157ad576157ad61576b565b500190565b6000602082840312156157c457600080fd5b5051919050565b6000602082840312156157dd57600080fd5b8151612972816151e8565b80516fffffffffffffffffffffffffffffffff8116811461522557600080fd5b60006060828403121561581a57600080fd5b6040516060810181811067ffffffffffffffff8211171561583d5761583d615238565b60405282518152615850602084016157e8565b6020820152615861604084016157e8565b60408201529392505050565b60006080828403121561587f57600080fd5b6040516080810181811067ffffffffffffffff821117156158a2576158a2615238565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff808411156158ee576158ee615238565b8360051b60206158ff818301615267565b86815291850191818101903684111561591757600080fd5b865b8481101561594b578035868111156159315760008081fd5b61593d36828b016152b6565b845250918301918301615919565b50979650505050505050565b60006020828403121561596957600080fd5b81516129728161522a565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516159c8816049850160208701615554565b919091016049019695505050505050565b6000828210156159eb576159eb61576b565b500390565b600067ffffffffffffffff80831681851681830481118215151615615a1757615a1761576b565b02949350505050565b600067ffffffffffffffff808316818516808303821115615a4357615a4361576b565b01949350505050565b60008060408385031215615a5f57600080fd5b8251615a6a816151e8565b6020840151909250615a7b816155f6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615ac457615ac4615a86565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b1857615b1861576b565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615615b5757615b5761576b565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615615b8b57615b8b61576b565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd257615bd261576b565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0d57615c0d61576b565b60008712925087820587128484161615615c2957615c2961576b565b87850587128184161615615c3f57615c3f61576b565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615c8757615c8761576b565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615615cbb57615cbb61576b565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615cf957615cf961576b565b500290565b600082615d0d57615d0d615a86565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152615d5d60c0830184615580565b98975050505050505050565b805163ffffffff8116811461522557600080fd5b600060c08284031215615d8f57600080fd5b60405160c0810181811067ffffffffffffffff82111715615db257615db2615238565b604052615dbe83615d69565b81526020830151615dce816155f6565b60208201526040830151615de1816155f6565b6040820152615df260608401615d69565b6060820152615e0360808401615d69565b6080820152615e1460a084016157e8565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615e5157615e5161576b565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680615e9a57615e9a615a86565b8060ff84160691505092915050565b600060ff821660ff841680821015615ec357615ec361576b565b90039392505050565b60008251615ede818460208701615554565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a",
       "initialized": true,
       "kind": "Create",
       "newBalance": 0,
@@ -3289,7 +3340,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3297,7 +3348,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3305,7 +3356,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3313,7 +3364,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3321,7 +3372,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -3329,7 +3380,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -3337,7 +3388,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3345,7 +3396,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000036"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3353,7 +3404,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000036"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3361,7 +3412,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000037"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3369,7 +3420,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000037"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3377,7 +3428,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000035"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3385,7 +3436,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000035"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3393,7 +3444,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000032"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3401,7 +3452,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000032"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": true,
           "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3409,7 +3460,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000032"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
@@ -3417,7 +3468,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3425,7 +3476,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": true,
           "newValue": "0x000000000000000100000000000000000000000000000000000000003b9aca00",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3433,7 +3484,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000001"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
@@ -3441,7 +3492,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
@@ -3489,7 +3540,7 @@
           "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000000e"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000000f"
         }
       ],
       "value": 0
@@ -3513,33 +3564,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
-      "chainInfo": {
-        "chainId": 31337,
-        "forkId": 0
-      },
-      "data": "0x001c2ff6",
-      "deployedCode": "0x",
-      "initialized": true,
-      "kind": "StaticCall",
-      "newBalance": 0,
-      "oldBalance": 0,
-      "reverted": false,
-      "storageAccesses": [
-        {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
-          "isWrite": false,
-          "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
-          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
-          "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000036"
-        }
-      ],
-      "value": 0
-    },
-    {
-      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -3553,7 +3578,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3565,12 +3590,12 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0xf0498750",
+      "data": "0x33d7e2bd",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "StaticCall",
@@ -3579,7 +3604,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3591,12 +3616,12 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x33d7e2bd",
+      "data": "0x35e80ab3",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "StaticCall",
@@ -3605,24 +3630,24 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000037"
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000035"
         }
       ],
       "value": 0
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x35e80ab3",
+      "data": "0x9bf62d82",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "StaticCall",
@@ -3631,40 +3656,31 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+          "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
-          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead",
+          "previousValue": "0x000000000000000000000000000000000000000000000000000000000000dead",
           "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000035"
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000032"
         }
       ],
       "value": 0
     },
     {
-      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496",
+      "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x9bf62d82",
+      "data": "0x",
       "deployedCode": "0x",
       "initialized": true,
-      "kind": "StaticCall",
+      "kind": "Resume",
       "newBalance": 0,
       "oldBalance": 0,
       "reverted": false,
-      "storageAccesses": [
-        {
-          "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
-          "isWrite": false,
-          "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead",
-          "previousValue": "0x000000000000000000000000000000000000000000000000000000000000dead",
-          "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000032"
-        }
-      ],
+      "storageAccesses": [],
       "value": 0
     },
     {
@@ -3685,16 +3701,16 @@
       "value": 0
     },
     {
-      "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496",
-      "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D",
+      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
+      "account": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x",
+      "data": "0x638627e586f5e36fe67a77519503a7c6da22f92b150d3c6055fd40bdcfe9ffd160806040523480156200001157600080fd5b50620000206000808062000026565b6200028e565b600054600160a81b900460ff16158080156200004f57506000546001600160a01b90910460ff16105b806200008657506200006c30620001c860201b620015b71760201c565b158015620000865750600054600160a01b900460ff166001145b620000ef5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a01b1916600160a01b17905580156200011d576000805460ff60a81b1916600160a81b1790555b60fb80546001600160a01b038087166001600160a01b03199283161790925560fc805486841690831617905560fd80549285169290911691909117905562000179734200000000000000000000000000000000000007620001d7565b8015620001c2576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054600160a81b900460ff16620002465760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000e6565b60cc546001600160a01b03166200026c5760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b6121a3806200029e6000396000f3fe60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdf565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ba9190611cb1565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611ccb565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611ccb565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce4565b6109bd565b34801561048757600080fd5b506102a6610496366004611d38565b610a2b565b6102a66104a9366004611d83565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eb1565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611eff565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f50565b6109e39190611f80565b6109ee601088611f50565b6109fb9062030d40611fce565b610a059190611fce565b610a0f9190611fce565b610a199190611fce565b610a239190611fce565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ffa565b600081815260ce602052604090205460ff1615610f4457610f44611ffa565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fce565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612029565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ffa565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611983565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611673908890839089906000908990600401612040565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a20565b805190602001209050949350505050565b6000611816878787878787611ab9565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612098565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906120b5565b90939092509050565b606084848484604051602401611a3994939291906120f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad69695949392919061213f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7a57600080fd5b50565b60008083601f840112611b8f57600080fd5b50813567ffffffffffffffff811115611ba757600080fd5b602083019150836020828501011115611bbf57600080fd5b9250929050565b803563ffffffff81168114611bda57600080fd5b919050565b60008060008060608587031215611bf557600080fd5b8435611c0081611b58565b9350602085013567ffffffffffffffff811115611c1c57600080fd5b611c2887828801611b7d565b9094509250611c3b905060408601611bc6565b905092959194509250565b6000815180845260005b81811015611c6c57602081850181015186830182015201611c50565b81811115611c7e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc46020830184611c46565b9392505050565b600060208284031215611cdd57600080fd5b5035919050565b600080600060408486031215611cf957600080fd5b833567ffffffffffffffff811115611d1057600080fd5b611d1c86828701611b7d565b9094509250611d2f905060208501611bc6565b90509250925092565b600080600060608486031215611d4d57600080fd5b8335611d5881611b58565b92506020840135611d6881611b58565b91506040840135611d7881611b58565b809150509250925092565b600080600080600080600060c0888a031215611d9e57600080fd5b873596506020880135611db081611b58565b95506040880135611dc081611b58565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611dea57600080fd5b611df68a828b01611b7d565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea460c083018486611e09565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611ee1608083018688611e09565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f1157600080fd5b81518015158114611cc457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7757611f77611f21565b02949350505050565b600067ffffffffffffffff80841680611fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ff157611ff1611f21565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203b5761203b611f21565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208d60a0830184611c46565b979650505050505050565b6000602082840312156120aa57600080fd5b8151611cc481611b58565b600080604083850312156120c857600080fd5b82516120d381611b58565b602084015190925060ff811681146120ea57600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212e6080830185611c46565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218a60c0830184611c46565b9897505050505050505056fea164736f6c634300080f000a",
       "deployedCode": "0x",
       "initialized": true,
-      "kind": "Resume",
+      "kind": "Call",
       "newBalance": 0,
       "oldBalance": 0,
       "reverted": false,
@@ -3703,13 +3719,13 @@
     },
     {
       "accessor": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x60806040523480156200001157600080fd5b506200001f60008062000025565b6200027f565b600054600160a81b900460ff16158080156200004e57506000546001600160a01b90910460ff16105b806200008557506200006b30620001b960201b620014d61760201c565b158015620000855750600054600160a01b900460ff166001145b620000ee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a01b1916600160a01b17905580156200011c576000805460ff60a81b1916600160a81b1790555b60fb80546001600160a01b038086166001600160a01b03199283161790925560fc8054928516929091169190911790556200016b734200000000000000000000000000000000000007620001c8565b8015620001b4576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054600160a81b900460ff16620002375760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000e5565b60cc546001600160a01b03166200025d5760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b611f94806200028f6000396000f3fe6080604052600436106101805760003560e01c80635c975abb116100d6578063a4e7f8bd1161007f578063d764ad0b11610059578063d764ad0b14610463578063db505d8014610476578063ecc70428146104a357600080fd5b8063a4e7f8bd146103e3578063b1b1b20914610413578063b28ade251461044357600080fd5b806383a74074116100b057806383a74074146103a15780638cbeeef2146102b85780639fce812c146103b857600080fd5b80635c975abb1461033a5780636425666b1461035f5780636e296e451461038c57600080fd5b80633dbb202b116101385780634c1d6a69116101125780634c1d6a69146102b857806354fd4d50146102ce5780635644cfdf1461032457600080fd5b80633dbb202b1461025b5780633f827a5a14610270578063485cc9551461029857600080fd5b80630ff754ea116101695780630ff754ea146101cd5780632828d7e81461021957806335e80ab31461022e57600080fd5b8063028f85f7146101855780630c568498146101b8575b600080fd5b34801561019157600080fd5b5061019a601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101c457600080fd5b5061019a603f81565b3480156101d957600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101af565b34801561022557600080fd5b5061019a604081565b34801561023a57600080fd5b5060fb546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b61026e610269366004611a22565b610508565b005b34801561027c57600080fd5b50610285600181565b60405161ffff90911681526020016101af565b3480156102a457600080fd5b5061026e6102b3366004611a89565b610765565b3480156102c457600080fd5b5061019a619c4081565b3480156102da57600080fd5b506103176040518060400160405280600581526020017f322e332e3000000000000000000000000000000000000000000000000000000081525081565b6040516101af9190611b2d565b34801561033057600080fd5b5061019a61138881565b34801561034657600080fd5b5061034f6109d3565b60405190151581526020016101af565b34801561036b57600080fd5b5060fc546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039857600080fd5b506101f4610a6c565b3480156103ad57600080fd5b5061019a62030d4081565b3480156103c457600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101f4565b3480156103ef57600080fd5b5061034f6103fe366004611b47565b60ce6020526000908152604090205460ff1681565b34801561041f57600080fd5b5061034f61042e366004611b47565b60cb6020526000908152604090205460ff1681565b34801561044f57600080fd5b5061019a61045e366004611b60565b610b53565b61026e610471366004611bb4565b610bc1565b34801561048257600080fd5b5060cf546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104af57600080fd5b506104fa60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101af565b60cf5461063a9073ffffffffffffffffffffffffffffffffffffffff16610530858585610b53565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061059c60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016105b89796959493929190611c83565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526114f2565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856106bf60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516106d1959493929190611ce2565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b6000547501000000000000000000000000000000000000000000900460ff16158080156107b0575060005460017401000000000000000000000000000000000000000090910460ff16105b806107e25750303b1580156107e2575060005474010000000000000000000000000000000000000000900460ff166001145b610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905580156108f957600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc80549285169290911691909117905561096b73420000000000000000000000000000000000000761158b565b80156109ce57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a679190611d30565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f74207365740000000000000000000000606482015260840161086a565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f610b6f604063ffffffff8816611d81565b610b799190611db1565b610b84601088611d81565b610b919062030d40611dff565b610b9b9190611dff565b610ba59190611dff565b610baf9190611dff565b610bb99190611dff565b949350505050565b610bc96109d3565b15610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a2070617573656400000000604482015260640161086a565b60f087901c60028110610ceb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161086a565b8061ffff16600003610de0576000610d3c878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506116c7915050565b600081815260cb602052604090205490915060ff1615610dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161086a565b505b6000610e26898989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116e692505050565b9050610e30611709565b15610e6857853414610e4457610e44611e2b565b600081815260ce602052604090205460ff1615610e6357610e63611e2b565b610fba565b3415610f1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a40161086a565b600081815260ce602052604090205460ff16610fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161086a565b610fc3876117e5565b15611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161086a565b600081815260cb602052604090205460ff1615611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161086a565b61113685611127611388619c40611dff565b67ffffffffffffffff1661182b565b158061115c575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561127557600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b50506114cd565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061130688619c405a6112c99190611e5a565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061184992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156113bc57600082815260cb602052604090205460ff161561135957611359611e2b565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26114c9565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611553908890839089906000908990600401611e71565b6000604051808303818588803b15801561156c57600080fd5b505af1158015611580573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161086a565b60cc5473ffffffffffffffffffffffffffffffffffffffff166116805760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006116d585858585611863565b805190602001209050949350505050565b60006116f68787878787876118fc565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff1633148015610a67575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190611ec9565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611825575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60608484848460405160240161187c9493929190611ee6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161191996959493929190611f30565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146119bd57600080fd5b50565b60008083601f8401126119d257600080fd5b50813567ffffffffffffffff8111156119ea57600080fd5b602083019150836020828501011115611a0257600080fd5b9250929050565b803563ffffffff81168114611a1d57600080fd5b919050565b60008060008060608587031215611a3857600080fd5b8435611a438161199b565b9350602085013567ffffffffffffffff811115611a5f57600080fd5b611a6b878288016119c0565b9094509250611a7e905060408601611a09565b905092959194509250565b60008060408385031215611a9c57600080fd5b8235611aa78161199b565b91506020830135611ab78161199b565b809150509250929050565b6000815180845260005b81811015611ae857602081850181015186830182015201611acc565b81811115611afa576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611b406020830184611ac2565b9392505050565b600060208284031215611b5957600080fd5b5035919050565b600080600060408486031215611b7557600080fd5b833567ffffffffffffffff811115611b8c57600080fd5b611b98868287016119c0565b9094509250611bab905060208501611a09565b90509250925092565b600080600080600080600060c0888a031215611bcf57600080fd5b873596506020880135611be18161199b565b95506040880135611bf18161199b565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611c1b57600080fd5b611c278a828b016119c0565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611cd560c083018486611c3a565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611d12608083018688611c3a565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611d4257600080fd5b81518015158114611b4057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611da857611da8611d52565b02949350505050565b600067ffffffffffffffff80841680611df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611e2257611e22611d52565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611e6c57611e6c611d52565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611ebe60a0830184611ac2565b979650505050505050565b600060208284031215611edb57600080fd5b8151611b408161199b565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611f1f6080830185611ac2565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611f7b60c0830184611ac2565b9897505050505050505056fea164736f6c634300080f000a",
-      "deployedCode": "0x6080604052600436106101805760003560e01c80635c975abb116100d6578063a4e7f8bd1161007f578063d764ad0b11610059578063d764ad0b14610463578063db505d8014610476578063ecc70428146104a357600080fd5b8063a4e7f8bd146103e3578063b1b1b20914610413578063b28ade251461044357600080fd5b806383a74074116100b057806383a74074146103a15780638cbeeef2146102b85780639fce812c146103b857600080fd5b80635c975abb1461033a5780636425666b1461035f5780636e296e451461038c57600080fd5b80633dbb202b116101385780634c1d6a69116101125780634c1d6a69146102b857806354fd4d50146102ce5780635644cfdf1461032457600080fd5b80633dbb202b1461025b5780633f827a5a14610270578063485cc9551461029857600080fd5b80630ff754ea116101695780630ff754ea146101cd5780632828d7e81461021957806335e80ab31461022e57600080fd5b8063028f85f7146101855780630c568498146101b8575b600080fd5b34801561019157600080fd5b5061019a601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101c457600080fd5b5061019a603f81565b3480156101d957600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101af565b34801561022557600080fd5b5061019a604081565b34801561023a57600080fd5b5060fb546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b61026e610269366004611a22565b610508565b005b34801561027c57600080fd5b50610285600181565b60405161ffff90911681526020016101af565b3480156102a457600080fd5b5061026e6102b3366004611a89565b610765565b3480156102c457600080fd5b5061019a619c4081565b3480156102da57600080fd5b506103176040518060400160405280600581526020017f322e332e3000000000000000000000000000000000000000000000000000000081525081565b6040516101af9190611b2d565b34801561033057600080fd5b5061019a61138881565b34801561034657600080fd5b5061034f6109d3565b60405190151581526020016101af565b34801561036b57600080fd5b5060fc546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039857600080fd5b506101f4610a6c565b3480156103ad57600080fd5b5061019a62030d4081565b3480156103c457600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101f4565b3480156103ef57600080fd5b5061034f6103fe366004611b47565b60ce6020526000908152604090205460ff1681565b34801561041f57600080fd5b5061034f61042e366004611b47565b60cb6020526000908152604090205460ff1681565b34801561044f57600080fd5b5061019a61045e366004611b60565b610b53565b61026e610471366004611bb4565b610bc1565b34801561048257600080fd5b5060cf546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104af57600080fd5b506104fa60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101af565b60cf5461063a9073ffffffffffffffffffffffffffffffffffffffff16610530858585610b53565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061059c60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016105b89796959493929190611c83565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526114f2565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856106bf60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516106d1959493929190611ce2565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b6000547501000000000000000000000000000000000000000000900460ff16158080156107b0575060005460017401000000000000000000000000000000000000000090910460ff16105b806107e25750303b1580156107e2575060005474010000000000000000000000000000000000000000900460ff166001145b610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905580156108f957600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc80549285169290911691909117905561096b73420000000000000000000000000000000000000761158b565b80156109ce57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a679190611d30565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f74207365740000000000000000000000606482015260840161086a565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f610b6f604063ffffffff8816611d81565b610b799190611db1565b610b84601088611d81565b610b919062030d40611dff565b610b9b9190611dff565b610ba59190611dff565b610baf9190611dff565b610bb99190611dff565b949350505050565b610bc96109d3565b15610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a2070617573656400000000604482015260640161086a565b60f087901c60028110610ceb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161086a565b8061ffff16600003610de0576000610d3c878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506116c7915050565b600081815260cb602052604090205490915060ff1615610dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161086a565b505b6000610e26898989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116e692505050565b9050610e30611709565b15610e6857853414610e4457610e44611e2b565b600081815260ce602052604090205460ff1615610e6357610e63611e2b565b610fba565b3415610f1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a40161086a565b600081815260ce602052604090205460ff16610fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161086a565b610fc3876117e5565b15611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161086a565b600081815260cb602052604090205460ff1615611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161086a565b61113685611127611388619c40611dff565b67ffffffffffffffff1661182b565b158061115c575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561127557600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b50506114cd565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061130688619c405a6112c99190611e5a565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061184992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156113bc57600082815260cb602052604090205460ff161561135957611359611e2b565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26114c9565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611553908890839089906000908990600401611e71565b6000604051808303818588803b15801561156c57600080fd5b505af1158015611580573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161086a565b60cc5473ffffffffffffffffffffffffffffffffffffffff166116805760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006116d585858585611863565b805190602001209050949350505050565b60006116f68787878787876118fc565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff1633148015610a67575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190611ec9565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611825575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60608484848460405160240161187c9493929190611ee6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161191996959493929190611f30565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146119bd57600080fd5b50565b60008083601f8401126119d257600080fd5b50813567ffffffffffffffff8111156119ea57600080fd5b602083019150836020828501011115611a0257600080fd5b9250929050565b803563ffffffff81168114611a1d57600080fd5b919050565b60008060008060608587031215611a3857600080fd5b8435611a438161199b565b9350602085013567ffffffffffffffff811115611a5f57600080fd5b611a6b878288016119c0565b9094509250611a7e905060408601611a09565b905092959194509250565b60008060408385031215611a9c57600080fd5b8235611aa78161199b565b91506020830135611ab78161199b565b809150509250929050565b6000815180845260005b81811015611ae857602081850181015186830182015201611acc565b81811115611afa576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611b406020830184611ac2565b9392505050565b600060208284031215611b5957600080fd5b5035919050565b600080600060408486031215611b7557600080fd5b833567ffffffffffffffff811115611b8c57600080fd5b611b98868287016119c0565b9094509250611bab905060208501611a09565b90509250925092565b600080600080600080600060c0888a031215611bcf57600080fd5b873596506020880135611be18161199b565b95506040880135611bf18161199b565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611c1b57600080fd5b611c278a828b016119c0565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611cd560c083018486611c3a565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611d12608083018688611c3a565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611d4257600080fd5b81518015158114611b4057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611da857611da8611d52565b02949350505050565b600067ffffffffffffffff80841680611df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611e2257611e22611d52565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611e6c57611e6c611d52565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611ebe60a0830184611ac2565b979650505050505050565b600060208284031215611edb57600080fd5b8151611b408161199b565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611f1f6080830185611ac2565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611f7b60c0830184611ac2565b9897505050505050505056fea164736f6c634300080f000a",
+      "data": "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028e565b600054600160a81b900460ff16158080156200004f57506000546001600160a01b90910460ff16105b806200008657506200006c30620001c860201b620015b71760201c565b158015620000865750600054600160a01b900460ff166001145b620000ef5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a01b1916600160a01b17905580156200011d576000805460ff60a81b1916600160a81b1790555b60fb80546001600160a01b038087166001600160a01b03199283161790925560fc805486841690831617905560fd80549285169290911691909117905562000179734200000000000000000000000000000000000007620001d7565b8015620001c2576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054600160a81b900460ff16620002465760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000e6565b60cc546001600160a01b03166200026c5760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b6121a3806200029e6000396000f3fe60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdf565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ba9190611cb1565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611ccb565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611ccb565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce4565b6109bd565b34801561048757600080fd5b506102a6610496366004611d38565b610a2b565b6102a66104a9366004611d83565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eb1565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611eff565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f50565b6109e39190611f80565b6109ee601088611f50565b6109fb9062030d40611fce565b610a059190611fce565b610a0f9190611fce565b610a199190611fce565b610a239190611fce565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ffa565b600081815260ce602052604090205460ff1615610f4457610f44611ffa565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fce565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612029565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ffa565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611983565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611673908890839089906000908990600401612040565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a20565b805190602001209050949350505050565b6000611816878787878787611ab9565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612098565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906120b5565b90939092509050565b606084848484604051602401611a3994939291906120f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad69695949392919061213f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7a57600080fd5b50565b60008083601f840112611b8f57600080fd5b50813567ffffffffffffffff811115611ba757600080fd5b602083019150836020828501011115611bbf57600080fd5b9250929050565b803563ffffffff81168114611bda57600080fd5b919050565b60008060008060608587031215611bf557600080fd5b8435611c0081611b58565b9350602085013567ffffffffffffffff811115611c1c57600080fd5b611c2887828801611b7d565b9094509250611c3b905060408601611bc6565b905092959194509250565b6000815180845260005b81811015611c6c57602081850181015186830182015201611c50565b81811115611c7e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc46020830184611c46565b9392505050565b600060208284031215611cdd57600080fd5b5035919050565b600080600060408486031215611cf957600080fd5b833567ffffffffffffffff811115611d1057600080fd5b611d1c86828701611b7d565b9094509250611d2f905060208501611bc6565b90509250925092565b600080600060608486031215611d4d57600080fd5b8335611d5881611b58565b92506020840135611d6881611b58565b91506040840135611d7881611b58565b809150509250925092565b600080600080600080600060c0888a031215611d9e57600080fd5b873596506020880135611db081611b58565b95506040880135611dc081611b58565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611dea57600080fd5b611df68a828b01611b7d565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea460c083018486611e09565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611ee1608083018688611e09565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f1157600080fd5b81518015158114611cc457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7757611f77611f21565b02949350505050565b600067ffffffffffffffff80841680611fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ff157611ff1611f21565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203b5761203b611f21565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208d60a0830184611c46565b979650505050505050565b6000602082840312156120aa57600080fd5b8151611cc481611b58565b600080604083850312156120c857600080fd5b82516120d381611b58565b602084015190925060ff811681146120ea57600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212e6080830185611c46565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218a60c0830184611c46565b9897505050505050505056fea164736f6c634300080f000a",
+      "deployedCode": "0x60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdf565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ba9190611cb1565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611ccb565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611ccb565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce4565b6109bd565b34801561048757600080fd5b506102a6610496366004611d38565b610a2b565b6102a66104a9366004611d83565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eb1565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611eff565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f50565b6109e39190611f80565b6109ee601088611f50565b6109fb9062030d40611fce565b610a059190611fce565b610a0f9190611fce565b610a199190611fce565b610a239190611fce565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ffa565b600081815260ce602052604090205460ff1615610f4457610f44611ffa565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fce565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612029565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ffa565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611983565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611673908890839089906000908990600401612040565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a20565b805190602001209050949350505050565b6000611816878787878787611ab9565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612098565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906120b5565b90939092509050565b606084848484604051602401611a3994939291906120f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad69695949392919061213f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7a57600080fd5b50565b60008083601f840112611b8f57600080fd5b50813567ffffffffffffffff811115611ba757600080fd5b602083019150836020828501011115611bbf57600080fd5b9250929050565b803563ffffffff81168114611bda57600080fd5b919050565b60008060008060608587031215611bf557600080fd5b8435611c0081611b58565b9350602085013567ffffffffffffffff811115611c1c57600080fd5b611c2887828801611b7d565b9094509250611c3b905060408601611bc6565b905092959194509250565b6000815180845260005b81811015611c6c57602081850181015186830182015201611c50565b81811115611c7e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc46020830184611c46565b9392505050565b600060208284031215611cdd57600080fd5b5035919050565b600080600060408486031215611cf957600080fd5b833567ffffffffffffffff811115611d1057600080fd5b611d1c86828701611b7d565b9094509250611d2f905060208501611bc6565b90509250925092565b600080600060608486031215611d4d57600080fd5b8335611d5881611b58565b92506020840135611d6881611b58565b91506040840135611d7881611b58565b809150509250925092565b600080600080600080600060c0888a031215611d9e57600080fd5b873596506020880135611db081611b58565b95506040880135611dc081611b58565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611dea57600080fd5b611df68a828b01611b7d565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea460c083018486611e09565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611ee1608083018688611e09565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f1157600080fd5b81518015158114611cc457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7757611f77611f21565b02949350505050565b600067ffffffffffffffff80841680611fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ff157611ff1611f21565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203b5761203b611f21565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208d60a0830184611c46565b979650505050505050565b6000602082840312156120aa57600080fd5b8151611cc481611b58565b600080604083850312156120c857600080fd5b82516120d381611b58565b602084015190925060ff811681146120ea57600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212e6080830185611c46565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218a60c0830184611c46565b9897505050505050505056fea164736f6c634300080f000a",
       "initialized": true,
       "kind": "Create",
       "newBalance": 0,
@@ -3717,7 +3733,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3725,7 +3741,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3733,7 +3749,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3741,7 +3757,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": true,
           "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3749,7 +3765,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000010000000000000000000000000000000000000000",
@@ -3757,7 +3773,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": true,
           "newValue": "0x0000000000000000000001010000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000010000000000000000000000000000000000000000",
@@ -3765,7 +3781,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3773,7 +3789,7 @@
           "slot": "0x00000000000000000000000000000000000000000000000000000000000000fb"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3781,7 +3797,7 @@
           "slot": "0x00000000000000000000000000000000000000000000000000000000000000fb"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3789,7 +3805,7 @@
           "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3797,7 +3813,23 @@
           "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
+          "isWrite": false,
+          "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "reverted": false,
+          "slot": "0x00000000000000000000000000000000000000000000000000000000000000fd"
+        },
+        {
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
+          "isWrite": true,
+          "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "reverted": false,
+          "slot": "0x00000000000000000000000000000000000000000000000000000000000000fd"
+        },
+        {
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000001010000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000001010000000000000000000000000000000000000000",
@@ -3805,7 +3837,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3813,7 +3845,7 @@
           "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3821,7 +3853,7 @@
           "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": true,
           "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3829,7 +3861,7 @@
           "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3837,7 +3869,7 @@
           "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": true,
           "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3845,7 +3877,7 @@
           "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000001010000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000001010000000000000000000000000000000000000000",
@@ -3853,7 +3885,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": true,
           "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000001010000000000000000000000000000000000000000",
@@ -3882,7 +3914,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -3896,7 +3928,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007",
           "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000007",
@@ -3908,7 +3940,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -3922,7 +3954,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007",
           "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000007",
@@ -3934,7 +3966,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -3948,7 +3980,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3960,7 +3992,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -3974,7 +4006,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -3986,7 +4018,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -4000,7 +4032,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+          "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4044,6 +4076,23 @@
       "storageAccesses": [],
       "value": 0
     },
+    {
+      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
+      "account": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
+      "chainInfo": {
+        "chainId": 31337,
+        "forkId": 0
+      },
+      "data": "0x638627e586f5e36fe67a77519503a7c6da22f92b150d3c6055fd40bdcfe9ffd160806040523480156200001157600080fd5b50620000256001806000808080806200002b565b62000328565b600054610100900460ff16158080156200004c5750600054600160ff909116105b806200007c575062000069306200031960201b6200135d1760201c565b1580156200007c575060005460ff166001145b620000e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000109576000805461ff0019166101001790555b60008811620001815760405162461bcd60e51b815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e20300000000000006064820152608401620000dc565b60008711620001f95760405162461bcd60e51b815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e20300000000000000000000000006064820152608401620000dc565b428511156200027f5760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201526374696d6560e01b608482015260a401620000dc565b6004889055600587905560018690556002859055600780546001600160a01b038087166001600160a01b0319928316179092556006805492861692909116919091179055600882905580156200030f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6001600160a01b03163b151590565b6115d580620003386000396000f3fe60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a",
+      "deployedCode": "0x",
+      "initialized": true,
+      "kind": "Call",
+      "newBalance": 0,
+      "oldBalance": 0,
+      "reverted": false,
+      "storageAccesses": [],
+      "value": 0
+    },
     {
       "accessor": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
       "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60",
@@ -4561,15 +4610,32 @@
       "storageAccesses": [],
       "value": 0
     },
+    {
+      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
+      "account": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
+      "chainInfo": {
+        "chainId": 31337,
+        "forkId": 0
+      },
+      "data": "0x638627e586f5e36fe67a77519503a7c6da22f92b150d3c6055fd40bdcfe9ffd160806040523480156200001157600080fd5b50620000496200003260016000805160206200398783398151915262001141565b60001b600019620000d160201b62000f441760201c565b6040805160c080820183526001808352602080840182905260028486015260006060808601829052608080870183905260a0808801849052885160e081018a528481529485018490529784018390529083018290528201819052948101859052918201849052620000cb9361dead9390928392839290918391908290620000d5565b6200136a565b9055565b600054610100900460ff1615808015620000f65750600054600160ff909116105b806200012657506200011330620004e660201b62000f481760201c565b15801562000126575060005460ff166001145b6200018f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620001b3576000805461ff0019166101001790555b620001bd620004f5565b620001c88a6200055d565b620001d387620005dc565b620001df89896200062e565b620001ea8662000692565b620002217f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0886620000d160201b62000f441760201c565b620002676200025260017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59862001141565b60001b84620000d160201b62000f441760201c565b620002b16200029860017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063762001141565b60001b8360000151620000d160201b62000f441760201c565b620002fb620002e260017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a862001141565b60001b8360200151620000d160201b62000f441760201c565b620003456200032c60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637762001141565b60001b8360400151620000d160201b62000f441760201c565b6200038f6200037660017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90762001141565b60001b8360600151620000d160201b62000f441760201c565b620003c8620003af60016000805160206200396783398151915262001141565b60001b8360800151620000d160201b62000f441760201c565b62000412620003f960017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d62001141565b60001b8360a00151620000d160201b62000f441760201c565b6200041c6200072f565b60c08201516200042c90620007a0565b620004378462000a29565b6200044162000d6d565b6001600160401b0316866001600160401b03161015620004935760405162461bcd60e51b815260206004820152601f602482015260008051602062003907833981519152604482015260640162000186565b8015620004da576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b03163b151590565b600054610100900460ff16620005515760405162461bcd60e51b815260206004820152602b60248201526000805160206200394783398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000186565b6200055b62000d9a565b565b6200056762000e01565b6001600160a01b038116620005ce5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000186565b620005d98162000e5d565b50565b60678190556040805160208082018490528251808303909101815290820190915260005b600060008051602062003927833981519152836040516200062291906200118a565b60405180910390a35050565b60658290556066819055604080516020810184905290810182905260009060600160408051601f1981840301815291905290506001600060008051602062003927833981519152836040516200068591906200118a565b60405180910390a3505050565b6200069c62000d6d565b6001600160401b0316816001600160401b03161015620006ee5760405162461bcd60e51b815260206004820152601f602482015260008051602062003907833981519152604482015260640162000186565b606880546001600160401b0319166001600160401b038316908117909155604080516020808201939093528151808203909301835281019052600262000600565b620007636200074f60016000805160206200398783398151915262001141565b60001b62000eaf60201b620006d71760201c565b6000036200055b576200055b6200078b60016000805160206200398783398151915262001141565b60001b43620000d160201b62000f441760201c565b6001600160a01b03811615801590620007d657506001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b8015620007ea5750620007e862000eb3565b155b15620005d957601260ff16816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000834573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200085a9190620011bf565b60ff1614620008c35760405162461bcd60e51b815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201526d39903830bcb4b733903a37b5b2b760911b606482015260840162000186565b600062000943826001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000908573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000932919081019062001201565b62000ee760201b62000f641760201c565b905060006200098a836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000908573d6000803e3d6000fd5b9050620009a6836012848462000f7f60201b620010071760201c565b620009b06200105b565b6040516371cfaa3f60e01b81526001600160a01b03858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b15801562000a0b57600080fd5b505af115801562000a20573d6000803e3d6000fd5b50505050505050565b8060a001516001600160801b0316816060015163ffffffff16111562000ab85760405162461bcd60e51b815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d617820626173650000000000000000000000606482015260840162000186565b6001816040015160ff161162000b295760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201526e65206c6172676572207468616e203160881b606482015260840162000186565b606854608082015182516001600160401b039092169162000b4b9190620012b9565b63ffffffff16111562000b905760405162461bcd60e51b815260206004820152601f602482015260008051602062003907833981519152604482015260640162000186565b6000816020015160ff161162000c015760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201526e06965722063616e6e6f74206265203608c1b606482015260840162000186565b8051602082015163ffffffff82169160ff9091169062000c23908290620012e4565b62000c2f919062001316565b63ffffffff161462000caa5760405162461bcd60e51b815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d6974000000000000000000606482015260840162000186565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff96871664ffffffffff199095169490941764010000000060ff948516021764ffffffffff60281b191665010000000000939092169290920263ffffffff60301b19161766010000000000009185169190910217600160501b600160f01b0319166a01000000000000000000009390941692909202600160701b600160f01b03191692909217600160701b6001600160801b0390921691909102179055565b60695460009062000d959063ffffffff6a010000000000000000000082048116911662001345565b905090565b600054610100900460ff1662000df65760405162461bcd60e51b815260206004820152602b60248201526000805160206200394783398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000186565b6200055b3362000e5d565b6033546001600160a01b031633146200055b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000186565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b5490565b60008062000ec06200107d565b506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b600060208251111562000f635760405162461bcd60e51b815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e20333220627974657300000000000000000000606482015260840162000186565b62000f79826200109e60201b620010d91760201c565b92915050565b62000fc962000f9f6001600080516020620038e783398151915262001141565b60001b856001600160a01b031660a08660ff16901b1760001b620000d160201b62000f441760201c565b6200100f62000ffa60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d62001141565b60001b83620000d160201b62000f441760201c565b620010556200104060017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd0576462001141565b60001b82620000d160201b62000f441760201c565b50505050565b600062000d956200074f60016000805160206200396783398151915262001141565b60008062001095620010c860201b620011021760201c565b90939092509050565b805160218110620010b75763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b60008080620010ec6200074f6001600080516020620038e783398151915262001141565b6001600160a01b03811693509050826200111f575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b634e487b7160e01b600052601160045260246000fd5b6000828210156200115657620011566200112b565b500390565b60005b83811015620011785781810151838201526020016200115e565b83811115620010555750506000910152565b6020815260008251806020840152620011ab8160408501602087016200115b565b601f01601f19169190910160400192915050565b600060208284031215620011d257600080fd5b815160ff81168114620011e457600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156200121457600080fd5b81516001600160401b03808211156200122c57600080fd5b818401915084601f8301126200124157600080fd5b815181811115620012565762001256620011eb565b604051601f8201601f19908116603f01168101908382118183101715620012815762001281620011eb565b816040528281528760208487010111156200129b57600080fd5b620012ae8360208301602088016200115b565b979650505050505050565b600063ffffffff808316818516808303821115620012db57620012db6200112b565b01949350505050565b600063ffffffff808416806200130a57634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600063ffffffff808316818516818304811182151516156200133c576200133c6200112b565b02949350505050565b60006001600160401b03828116848216808303821115620012db57620012db6200112b565b61256d806200137a6000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80639b7d7f0a1161017b578063e0e2016d116100d8578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610661578063fd32aa0f14610669578063ffa1ad741461067157600080fd5b8063f45e65d814610644578063f68016b71461064d57600080fd5b8063e81b2c6d116100bd578063e81b2c6d14610620578063f2b4e61714610629578063f2fde38b1461063157600080fd5b8063e0e2016d14610610578063e2a3285c1461061857600080fd5b8063c71973f61161012f578063cc731b0211610114578063cc731b02146104cc578063d844471514610600578063dac6e63a1461060857600080fd5b8063c71973f6146104a6578063c9b26f61146104b957600080fd5b8063b40a817c11610160578063b40a817c14610483578063bc49ce5f14610496578063c4e8ddfa1461049e57600080fd5b80639b7d7f0a14610473578063a71198691461047b57600080fd5b806348cd4cb111610229578063550fcdc9116101dd578063715018a6116101c2578063715018a61461043a5780638da5cb5b14610442578063935f029e1461046057600080fd5b8063550fcdc91461042a5780635d73369c1461043257600080fd5b80634c1e843d1161020e5780634c1e843d146103a75780634f16540b146103ba57806354fd4d50146103e157600080fd5b806348cd4cb11461037e5780634add321d1461038657600080fd5b806318d13918116102805780631fd19ee1116102655780631fd19ee11461032857806321326849146103305780634397dfef1461034857600080fd5b806318d139181461030b57806319f5cea81461032057600080fd5b806306c92657146102b2578063078f29cf146102cd5780630a49cb03146102fa5780630c18c16214610302575b600080fd5b6102ba610679565b6040519081526020015b60405180910390f35b6102d56106a7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c4565b6102d56106e0565b6102ba60655481565b61031e610319366004611fc4565b610710565b005b6102ba610724565b6102d561074f565b610338610779565b60405190151581526020016102c4565b6103506107b8565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016102c4565b6102ba6107cc565b61038e6107fc565b60405167ffffffffffffffff90911681526020016102c4565b61031e6103b5366004612137565b610822565b6102ba7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b61041d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102c491906122ec565b61041d610c2d565b6102ba610c37565b61031e610c62565b60335473ffffffffffffffffffffffffffffffffffffffff166102d5565b61031e61046e3660046122ff565b610c76565b6102d5610c8c565b6102d5610cbc565b61031e610491366004612321565b610cec565b6102ba610cfd565b6102d5610d28565b61031e6104b436600461233c565b610d58565b61031e6104c7366004612358565b610d69565b6105906040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102c49190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61041d610d7a565b6102d5610d84565b6102ba610db4565b6102ba610ddf565b6102ba60675481565b6102d5610e0a565b61031e61063f366004611fc4565b610e3a565b6102ba60665481565b60685461038e9067ffffffffffffffff1681565b6102ba610eee565b6102ba610f19565b6102ba600081565b6106a460017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b81565b60006106db6106d760017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b5490565b905090565b60006106db6106d760017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b61071861117f565b61072181611200565b50565b6106a460017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b60006106db7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b6000806107846107b8565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b6000806107c3611102565b90939092509050565b60006106db6106d760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b6069546000906106db9063ffffffff6a01000000000000000000008204811691166123b7565b600054610100900460ff16158080156108425750600054600160ff909116105b8061085c5750303b15801561085c575060005460ff166001145b6108ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561094b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109536112bd565b61095c8a610e3a565b6109658761135c565b61096f8989611384565b61097886611415565b6109a17f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b6109d46109cf60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b849055565b610a08610a0260017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b83519055565b610a3f610a3660017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b60208401519055565b610a76610a6d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b60408401519055565b610aad610aa460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b60608401519055565b610ae4610adb60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b60808401519055565b610b1b610b1260017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b60a08401519055565b610b236114f3565b610b308260c0015161155b565b610b3984611865565b610b416107fc565b67ffffffffffffffff168667ffffffffffffffff161015610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b8015610c2157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b60606106db611cd9565b6106a460017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b610c6a61117f565b610c746000611d9a565b565b610c7e61117f565b610c888282611384565b5050565b60006106db6106d760017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b60006106db6106d760017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b610cf461117f565b61072181611415565b6106a460017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b60006106db6106d760017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b610d6061117f565b61072181611865565b610d7161117f565b6107218161135c565b60606106db611e11565b60006106db6106d760017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b6106a460017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b6106a460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b60006106db6106d760017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b610e4261117f565b73ffffffffffffffffffffffffffffffffffffffff8116610ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e4565b61072181611d9a565b6106a460017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b6106a460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000602082511115610ff8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e2033322062797465730000000000000000000060648201526084016108e4565b611001826110d9565b92915050565b61106d61103560017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec6123a0565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b6110a061109b60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d6123a0565b839055565b6110d36110ce60017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd057646123a0565b829055565b50505050565b8051602181106110f15763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b600080806111346106d760017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec6123a0565b73ffffffffffffffffffffffffffffffffffffffff81169350905082611173575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6112297f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516112b191906122ec565b60405180910390a35050565b600054610100900460ff16611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e4565b610c74611ec7565b6067819055604080516020808201849052825180830390910181529082019091526000611280565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161140891906122ec565b60405180910390a3505050565b61141d6107fc565b67ffffffffffffffff168167ffffffffffffffff16101561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611280565b6115216106d760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b600003610c7457610c7461155660017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b439055565b73ffffffffffffffffffffffffffffffffffffffff8116158015906115aa575073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b80156115bb57506115b9610779565b155b1561072157601260ff168173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906123e3565b60ff16146116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201527f7320706179696e6720746f6b656e00000000000000000000000000000000000060648201526084016108e4565b600061175f8273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611714573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261175a9190810190612400565b610f64565b905060006117b18373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611714573d6000803e3d6000fd5b90506117c08360128484611007565b6117c86106e0565b6040517f71cfaa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b50505050505050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d61782062617365000000000000000000000060648201526084016108e4565b6001816040015160ff16116119ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e2031000000000000000000000000000000000060648201526084016108e4565b6068546080820151825167ffffffffffffffff909216916119cd91906124cb565b63ffffffff161115611a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b6000816020015160ff1611611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f742062652030000000000000000000000000000000000060648201526084016108e4565b8051602082015163ffffffff82169160ff90911690611af29082906124ea565b611afc9190612534565b63ffffffff1614611b8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d697400000000000000000060648201526084016108e4565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60606000611ce5611102565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611d5e57505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b611d94611d8f6106d760017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd057646123a0565b611f67565b91505090565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000611e1d611102565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611e9657505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b611d94611d8f6106d760017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d6123a0565b600054610100900460ff16611f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e4565b610c7433611d9a565b60405160005b82811a15611f7d57600101611f6d565b80825260208201838152600082820152505060408101604052919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611fbf57600080fd5b919050565b600060208284031215611fd657600080fd5b611fdf82611f9b565b9392505050565b803567ffffffffffffffff81168114611fbf57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561205057612050611ffe565b60405290565b803563ffffffff81168114611fbf57600080fd5b60ff8116811461072157600080fd5b600060c0828403121561208b57600080fd5b60405160c0810181811067ffffffffffffffff821117156120ae576120ae611ffe565b6040529050806120bd83612056565b815260208301356120cd8161206a565b602082015260408301356120e08161206a565b60408201526120f160608401612056565b606082015261210260808401612056565b608082015260a08301356fffffffffffffffffffffffffffffffff8116811461212a57600080fd5b60a0919091015292915050565b6000806000806000806000806000898b0361028081121561215757600080fd5b6121608b611f9b565b995060208b0135985060408b0135975060608b0135965061218360808c01611fe6565b955061219160a08c01611f9b565b94506121a08c60c08d01612079565b93506121af6101808c01611f9b565b925060e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60820112156121e157600080fd5b506121ea61202d565b6121f76101a08c01611f9b565b81526122066101c08c01611f9b565b60208201526122186101e08c01611f9b565b604082015261222a6102008c01611f9b565b606082015261223c6102208c01611f9b565b608082015261224e6102408c01611f9b565b60a08201526122606102608c01611f9b565b60c0820152809150509295985092959850929598565b60005b83811015612291578181015183820152602001612279565b838111156110d35750506000910152565b600081518084526122ba816020860160208601612276565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fdf60208301846122a2565b6000806040838503121561231257600080fd5b50508035926020909101359150565b60006020828403121561233357600080fd5b611fdf82611fe6565b600060c0828403121561234e57600080fd5b611fdf8383612079565b60006020828403121561236a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156123b2576123b2612371565b500390565b600067ffffffffffffffff8083168185168083038211156123da576123da612371565b01949350505050565b6000602082840312156123f557600080fd5b8151611fdf8161206a565b60006020828403121561241257600080fd5b815167ffffffffffffffff8082111561242a57600080fd5b818401915084601f83011261243e57600080fd5b81518181111561245057612450611ffe565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561249657612496611ffe565b816040528281528760208487010111156124af57600080fd5b6124c0836020830160208801612276565b979650505050505050565b600063ffffffff8083168185168083038211156123da576123da612371565b600063ffffffff80841680612528577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff8083168185168183048111821515161561255757612557612371565b0294935050505056fea164736f6c634300080f000a04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77001d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420694b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ada11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0",
+      "deployedCode": "0x",
+      "initialized": true,
+      "kind": "Call",
+      "newBalance": 0,
+      "oldBalance": 0,
+      "reverted": false,
+      "storageAccesses": [],
+      "value": 0
+    },
     {
       "accessor": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x60806040523480156200001157600080fd5b506200004962000032600160008051602062002a4783398151915262000c39565b60001b600019620000c960201b62000e061760201c565b6040805160c080820183526001808352602080840182905260028486015260006060808601829052608080870183905260a08088018490528851968701895283875293860183905296850182905284018190529483018590528201849052620000c39361dead9390928392839290918391908290620000cd565b62000d5c565b9055565b600054610100900460ff1615808015620000ee5750600054600160ff909116105b806200011e57506200010b30620004df60201b62000e0a1760201c565b1580156200011e575060005460ff166001145b620001875760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620001ab576000805461ff0019166101001790555b620001b5620004ee565b620001c08a62000556565b620001cb87620005d5565b620001d7898962000627565b620001e2866200068b565b620002197f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0886620000c960201b62000e061760201c565b6200025f6200024a60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59862000c39565b60001b84620000c960201b62000e061760201c565b620002a96200029060017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063762000c39565b60001b8360000151620000c960201b62000e061760201c565b620002f3620002da60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a862000c39565b60001b8360200151620000c960201b62000e061760201c565b6200033d6200032460017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637762000c39565b60001b8360400151620000c960201b62000e061760201c565b620003876200036e60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a687181662000c39565b60001b8360600151620000c960201b62000e061760201c565b620003d1620003b860017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad62000c39565b60001b8360800151620000c960201b62000e061760201c565b6200041b6200040260017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d62000c39565b60001b8360a00151620000c960201b62000e061760201c565b6200042562000728565b620004308462000799565b6200043a62000add565b6001600160401b0316866001600160401b031610156200048c5760405162461bcd60e51b815260206004820152601f6024820152600080516020620029e783398151915260448201526064016200017e565b8015620004d3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b03163b151590565b600054610100900460ff166200054a5760405162461bcd60e51b815260206004820152602b602482015260008051602062002a2783398151915260448201526a6e697469616c697a696e6760a81b60648201526084016200017e565b6200055462000b0a565b565b6200056062000b71565b6001600160a01b038116620005c75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200017e565b620005d28162000bcd565b50565b60678190556040805160208082018490528251808303909101815290820190915260005b600060008051602062002a07833981519152836040516200061b919062000c53565b60405180910390a35050565b60658290556066819055604080516020810184905290810182905260009060600160408051601f1981840301815291905290506001600060008051602062002a07833981519152836040516200067e919062000c53565b60405180910390a3505050565b6200069562000add565b6001600160401b0316816001600160401b03161015620006e75760405162461bcd60e51b815260206004820152601f6024820152600080516020620029e783398151915260448201526064016200017e565b606880546001600160401b0319166001600160401b0383169081179091556040805160208082019390935281518082039093018352810190526002620005f9565b6200075c62000748600160008051602062002a4783398151915262000c39565b60001b62000c1f60201b62000e261760201c565b60000362000554576200055462000784600160008051602062002a4783398151915262000c39565b60001b43620000c960201b62000e061760201c565b8060a001516001600160801b0316816060015163ffffffff161115620008285760405162461bcd60e51b815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d61782062617365000000000000000000000060648201526084016200017e565b6001816040015160ff1611620008995760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201526e65206c6172676572207468616e203160881b60648201526084016200017e565b606854608082015182516001600160401b0390921691620008bb919062000cab565b63ffffffff161115620009005760405162461bcd60e51b815260206004820152601f6024820152600080516020620029e783398151915260448201526064016200017e565b6000816020015160ff1611620009715760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201526e06965722063616e6e6f74206265203608c1b60648201526084016200017e565b8051602082015163ffffffff82169160ff909116906200099390829062000cd6565b6200099f919062000d08565b63ffffffff161462000a1a5760405162461bcd60e51b815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d697400000000000000000060648201526084016200017e565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff96871664ffffffffff199095169490941764010000000060ff948516021764ffffffffff60281b191665010000000000939092169290920263ffffffff60301b19161766010000000000009185169190910217600160501b600160f01b0319166a01000000000000000000009390941692909202600160701b600160f01b03191692909217600160701b6001600160801b0390921691909102179055565b60695460009062000b059063ffffffff6a010000000000000000000082048116911662000d37565b905090565b600054610100900460ff1662000b665760405162461bcd60e51b815260206004820152602b602482015260008051602062002a2783398151915260448201526a6e697469616c697a696e6760a81b60648201526084016200017e565b620005543362000bcd565b6033546001600160a01b03163314620005545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200017e565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b5490565b634e487b7160e01b600052601160045260246000fd5b60008282101562000c4e5762000c4e62000c23565b500390565b600060208083528351808285015260005b8181101562000c825785810183015185820160400152820162000c64565b8181111562000c95576000604083870101525b50601f01601f1916929092016040019392505050565b600063ffffffff80831681851680830382111562000ccd5762000ccd62000c23565b01949350505050565b600063ffffffff8084168062000cfc57634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600063ffffffff8083168185168183048111821515161562000d2e5762000d2e62000c23565b02949350505050565b60006001600160401b0382811684821680830382111562000ccd5762000ccd62000c23565b611c7b8062000d6c6000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c8063935f029e11610145578063dac6e63a116100bd578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610597578063fd32aa0f1461059f578063ffa1ad74146105a757600080fd5b8063f45e65d81461057a578063f68016b71461058357600080fd5b8063dac6e63a1461054e578063e0e2016d14610556578063e81b2c6d1461055e578063f2fde38b1461056757600080fd5b8063bc49ce5f11610114578063c71973f6116100f9578063c71973f6146103f4578063c9b26f6114610407578063cc731b021461041a57600080fd5b8063bc49ce5f146103e4578063c4e8ddfa146103ec57600080fd5b8063935f029e146103ae5780639b7d7f0a146103c1578063a7119869146103c9578063b40a817c146103d157600080fd5b806348cd4cb1116101d857806354fd4d50116101a757806361d157681161018c57806361d1576814610380578063715018a6146103885780638da5cb5b1461039057600080fd5b806354fd4d501461032f5780635d73369c1461037857600080fd5b806348cd4cb1146102d75780634add321d146102df5780634d9f1559146103005780634f16540b1461030857600080fd5b80630c18c162116102145780630c18c162146102ab57806318d13918146102b457806319f5cea8146102c75780631fd19ee1146102cf57600080fd5b806306c9265714610246578063078f29cf146102615780630a49cb031461028e5780630bbb796814610296575b600080fd5b61024e6105af565b6040519081526020015b60405180910390f35b6102696105dd565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610258565b610269610616565b6102a96102a4366004611928565b610646565b005b61024e60655481565b6102a96102c2366004611a55565b610a44565b61024e610a58565b610269610a83565b61024e610aad565b6102e7610add565b60405167ffffffffffffffff9091168152602001610258565b610269610b03565b61024e7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b61036b6040518060400160405280600681526020017f312e31322e30000000000000000000000000000000000000000000000000000081525081565b6040516102589190611ae2565b61024e610b33565b61024e610b5e565b6102a9610b89565b60335473ffffffffffffffffffffffffffffffffffffffff16610269565b6102a96103bc366004611af5565b610b9d565b610269610bb3565b610269610be3565b6102a96103df366004611b17565b610c13565b61024e610c24565b610269610c4f565b6102a9610402366004611b32565b610c7f565b6102a9610415366004611b4e565b610c90565b6104de6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102589190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b610269610ca1565b61024e610cd1565b61024e60675481565b6102a9610575366004611a55565b610cfc565b61024e60665481565b6068546102e79067ffffffffffffffff1681565b61024e610db0565b61024e610ddb565b61024e600081565b6105da60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b81565b600061061161060d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b5490565b905090565b600061061161060d60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b600054610100900460ff16158080156106665750600054600160ff909116105b806106805750303b158015610680575060005460ff166001145b610711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561076f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610777610e2a565b6107808a610cfc565b61078987610ec9565b6107938989610f2a565b61079c86610fbb565b6107c57f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b6107f86107f360017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b849055565b61082c61082660017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b83519055565b61086361085a60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b60208401519055565b61089a61089160017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b60408401519055565b6108d16108c860017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b60608401519055565b6109086108ff60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b60808401519055565b61093f61093660017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b60a08401519055565b610947611099565b61095084611101565b610958610add565b67ffffffffffffffff168667ffffffffffffffff1610156109d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b8015610a3857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b610a4c611575565b610a55816115f6565b50565b6105da60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b60006106117f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b600061061161060d60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b6069546000906106119063ffffffff6a0100000000000000000000820481169116611bad565b600061061161060d60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b6105da60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b6105da60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b610b91611575565b610b9b600061167a565b565b610ba5611575565b610baf8282610f2a565b5050565b600061061161060d60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b600061061161060d60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b610c1b611575565b610a5581610fbb565b6105da60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b600061061161060d60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b610c87611575565b610a5581611101565b610c98611575565b610a5581610ec9565b600061061161060d60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b6105da60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b610d04611575565b73ffffffffffffffffffffffffffffffffffffffff8116610da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610708565b610a558161167a565b6105da60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b6105da60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b5490565b600054610100900460ff16610ec1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610708565b610b9b6116f1565b60678190556040805160208082018490528251808303909101815290820190915260005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610f1e9190611ae2565b60405180910390a35050565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610fae9190611ae2565b60405180910390a3505050565b610fc3610add565b67ffffffffffffffff168167ffffffffffffffff161015611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002610eed565b6110c761060d60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b600003610b9b57610b9b6110fc60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b439055565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff1611156111b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610708565b6001816040015160ff1611611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610708565b6068546080820151825167ffffffffffffffff909216916112699190611bd9565b63ffffffff1611156112d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b6000816020015160ff161161136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610708565b8051602082015163ffffffff82169160ff9091169061138e908290611bf8565b6113989190611c42565b63ffffffff161461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610708565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610708565b61161f7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290506003610eed565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610708565b610b9b3361167a565b803573ffffffffffffffffffffffffffffffffffffffff811681146117b557600080fd5b919050565b803567ffffffffffffffff811681146117b557600080fd5b60405160c0810167ffffffffffffffff8111828210171561181c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b803563ffffffff811681146117b557600080fd5b803560ff811681146117b557600080fd5b600060c0828403121561185957600080fd5b60405160c0810181811067ffffffffffffffff821117156118a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806118b283611822565b81526118c060208401611836565b60208201526118d160408401611836565b60408201526118e260608401611822565b60608201526118f360808401611822565b608082015260a08301356fffffffffffffffffffffffffffffffff8116811461191b57600080fd5b60a0919091015292915050565b6000806000806000806000806000898b0361026081121561194857600080fd5b6119518b611791565b995060208b0135985060408b0135975060608b0135965061197460808c016117ba565b955061198260a08c01611791565b94506119918c60c08d01611847565b93506119a06101808c01611791565b925060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60820112156119d257600080fd5b506119db6117d2565b6119e86101a08c01611791565b81526119f76101c08c01611791565b6020820152611a096101e08c01611791565b6040820152611a1b6102008c01611791565b6060820152611a2d6102208c01611791565b6080820152611a3f6102408c01611791565b60a0820152809150509295985092959850929598565b600060208284031215611a6757600080fd5b611a7082611791565b9392505050565b6000815180845260005b81811015611a9d57602081850181015186830182015201611a81565b81811115611aaf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a706020830184611a77565b60008060408385031215611b0857600080fd5b50508035926020909101359150565b600060208284031215611b2957600080fd5b611a70826117ba565b600060c08284031215611b4457600080fd5b611a708383611847565b600060208284031215611b6057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611ba857611ba8611b67565b500390565b600067ffffffffffffffff808316818516808303821115611bd057611bd0611b67565b01949350505050565b600063ffffffff808316818516808303821115611bd057611bd0611b67565b600063ffffffff80841680611c36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff80831681851681830481118215151615611c6557611c65611b67565b0294935050505056fea164736f6c634300080f000a53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77001d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0",
-      "deployedCode": "0x608060405234801561001057600080fd5b50600436106102415760003560e01c8063935f029e11610145578063dac6e63a116100bd578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610597578063fd32aa0f1461059f578063ffa1ad74146105a757600080fd5b8063f45e65d81461057a578063f68016b71461058357600080fd5b8063dac6e63a1461054e578063e0e2016d14610556578063e81b2c6d1461055e578063f2fde38b1461056757600080fd5b8063bc49ce5f11610114578063c71973f6116100f9578063c71973f6146103f4578063c9b26f6114610407578063cc731b021461041a57600080fd5b8063bc49ce5f146103e4578063c4e8ddfa146103ec57600080fd5b8063935f029e146103ae5780639b7d7f0a146103c1578063a7119869146103c9578063b40a817c146103d157600080fd5b806348cd4cb1116101d857806354fd4d50116101a757806361d157681161018c57806361d1576814610380578063715018a6146103885780638da5cb5b1461039057600080fd5b806354fd4d501461032f5780635d73369c1461037857600080fd5b806348cd4cb1146102d75780634add321d146102df5780634d9f1559146103005780634f16540b1461030857600080fd5b80630c18c162116102145780630c18c162146102ab57806318d13918146102b457806319f5cea8146102c75780631fd19ee1146102cf57600080fd5b806306c9265714610246578063078f29cf146102615780630a49cb031461028e5780630bbb796814610296575b600080fd5b61024e6105af565b6040519081526020015b60405180910390f35b6102696105dd565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610258565b610269610616565b6102a96102a4366004611928565b610646565b005b61024e60655481565b6102a96102c2366004611a55565b610a44565b61024e610a58565b610269610a83565b61024e610aad565b6102e7610add565b60405167ffffffffffffffff9091168152602001610258565b610269610b03565b61024e7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b61036b6040518060400160405280600681526020017f312e31322e30000000000000000000000000000000000000000000000000000081525081565b6040516102589190611ae2565b61024e610b33565b61024e610b5e565b6102a9610b89565b60335473ffffffffffffffffffffffffffffffffffffffff16610269565b6102a96103bc366004611af5565b610b9d565b610269610bb3565b610269610be3565b6102a96103df366004611b17565b610c13565b61024e610c24565b610269610c4f565b6102a9610402366004611b32565b610c7f565b6102a9610415366004611b4e565b610c90565b6104de6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102589190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b610269610ca1565b61024e610cd1565b61024e60675481565b6102a9610575366004611a55565b610cfc565b61024e60665481565b6068546102e79067ffffffffffffffff1681565b61024e610db0565b61024e610ddb565b61024e600081565b6105da60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b81565b600061061161060d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b5490565b905090565b600061061161060d60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b600054610100900460ff16158080156106665750600054600160ff909116105b806106805750303b158015610680575060005460ff166001145b610711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561076f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610777610e2a565b6107808a610cfc565b61078987610ec9565b6107938989610f2a565b61079c86610fbb565b6107c57f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b6107f86107f360017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b849055565b61082c61082660017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b83519055565b61086361085a60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b60208401519055565b61089a61089160017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b60408401519055565b6108d16108c860017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b60608401519055565b6109086108ff60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b60808401519055565b61093f61093660017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b60a08401519055565b610947611099565b61095084611101565b610958610add565b67ffffffffffffffff168667ffffffffffffffff1610156109d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b8015610a3857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b610a4c611575565b610a55816115f6565b50565b6105da60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b60006106117f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b600061061161060d60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b6069546000906106119063ffffffff6a0100000000000000000000820481169116611bad565b600061061161060d60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b6105da60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b6105da60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b610b91611575565b610b9b600061167a565b565b610ba5611575565b610baf8282610f2a565b5050565b600061061161060d60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b600061061161060d60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b610c1b611575565b610a5581610fbb565b6105da60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b600061061161060d60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b610c87611575565b610a5581611101565b610c98611575565b610a5581610ec9565b600061061161060d60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b6105da60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b610d04611575565b73ffffffffffffffffffffffffffffffffffffffff8116610da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610708565b610a558161167a565b6105da60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b6105da60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b5490565b600054610100900460ff16610ec1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610708565b610b9b6116f1565b60678190556040805160208082018490528251808303909101815290820190915260005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610f1e9190611ae2565b60405180910390a35050565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610fae9190611ae2565b60405180910390a3505050565b610fc3610add565b67ffffffffffffffff168167ffffffffffffffff161015611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002610eed565b6110c761060d60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b600003610b9b57610b9b6110fc60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b439055565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff1611156111b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610708565b6001816040015160ff1611611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610708565b6068546080820151825167ffffffffffffffff909216916112699190611bd9565b63ffffffff1611156112d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b6000816020015160ff161161136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610708565b8051602082015163ffffffff82169160ff9091169061138e908290611bf8565b6113989190611c42565b63ffffffff161461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610708565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610708565b61161f7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290506003610eed565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610708565b610b9b3361167a565b803573ffffffffffffffffffffffffffffffffffffffff811681146117b557600080fd5b919050565b803567ffffffffffffffff811681146117b557600080fd5b60405160c0810167ffffffffffffffff8111828210171561181c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b803563ffffffff811681146117b557600080fd5b803560ff811681146117b557600080fd5b600060c0828403121561185957600080fd5b60405160c0810181811067ffffffffffffffff821117156118a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806118b283611822565b81526118c060208401611836565b60208201526118d160408401611836565b60408201526118e260608401611822565b60608201526118f360808401611822565b608082015260a08301356fffffffffffffffffffffffffffffffff8116811461191b57600080fd5b60a0919091015292915050565b6000806000806000806000806000898b0361026081121561194857600080fd5b6119518b611791565b995060208b0135985060408b0135975060608b0135965061197460808c016117ba565b955061198260a08c01611791565b94506119918c60c08d01611847565b93506119a06101808c01611791565b925060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60820112156119d257600080fd5b506119db6117d2565b6119e86101a08c01611791565b81526119f76101c08c01611791565b6020820152611a096101e08c01611791565b6040820152611a1b6102008c01611791565b6060820152611a2d6102208c01611791565b6080820152611a3f6102408c01611791565b60a0820152809150509295985092959850929598565b600060208284031215611a6757600080fd5b611a7082611791565b9392505050565b6000815180845260005b81811015611a9d57602081850181015186830182015201611a81565b81811115611aaf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a706020830184611a77565b60008060408385031215611b0857600080fd5b50508035926020909101359150565b600060208284031215611b2957600080fd5b611a70826117ba565b600060c08284031215611b4457600080fd5b611a708383611847565b600060208284031215611b6057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611ba857611ba8611b67565b500390565b600067ffffffffffffffff808316818516808303821115611bd057611bd0611b67565b01949350505050565b600063ffffffff808316818516808303821115611bd057611bd0611b67565b600063ffffffff80841680611c36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff80831681851681830481118215151615611c6557611c65611b67565b0294935050505056fea164736f6c634300080f000a",
+      "data": "0x60806040523480156200001157600080fd5b50620000496200003260016000805160206200398783398151915262001141565b60001b600019620000d160201b62000f441760201c565b6040805160c080820183526001808352602080840182905260028486015260006060808601829052608080870183905260a0808801849052885160e081018a528481529485018490529784018390529083018290528201819052948101859052918201849052620000cb9361dead9390928392839290918391908290620000d5565b6200136a565b9055565b600054610100900460ff1615808015620000f65750600054600160ff909116105b806200012657506200011330620004e660201b62000f481760201c565b15801562000126575060005460ff166001145b6200018f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620001b3576000805461ff0019166101001790555b620001bd620004f5565b620001c88a6200055d565b620001d387620005dc565b620001df89896200062e565b620001ea8662000692565b620002217f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0886620000d160201b62000f441760201c565b620002676200025260017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59862001141565b60001b84620000d160201b62000f441760201c565b620002b16200029860017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063762001141565b60001b8360000151620000d160201b62000f441760201c565b620002fb620002e260017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a862001141565b60001b8360200151620000d160201b62000f441760201c565b620003456200032c60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637762001141565b60001b8360400151620000d160201b62000f441760201c565b6200038f6200037660017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90762001141565b60001b8360600151620000d160201b62000f441760201c565b620003c8620003af60016000805160206200396783398151915262001141565b60001b8360800151620000d160201b62000f441760201c565b62000412620003f960017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d62001141565b60001b8360a00151620000d160201b62000f441760201c565b6200041c6200072f565b60c08201516200042c90620007a0565b620004378462000a29565b6200044162000d6d565b6001600160401b0316866001600160401b03161015620004935760405162461bcd60e51b815260206004820152601f602482015260008051602062003907833981519152604482015260640162000186565b8015620004da576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b03163b151590565b600054610100900460ff16620005515760405162461bcd60e51b815260206004820152602b60248201526000805160206200394783398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000186565b6200055b62000d9a565b565b6200056762000e01565b6001600160a01b038116620005ce5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000186565b620005d98162000e5d565b50565b60678190556040805160208082018490528251808303909101815290820190915260005b600060008051602062003927833981519152836040516200062291906200118a565b60405180910390a35050565b60658290556066819055604080516020810184905290810182905260009060600160408051601f1981840301815291905290506001600060008051602062003927833981519152836040516200068591906200118a565b60405180910390a3505050565b6200069c62000d6d565b6001600160401b0316816001600160401b03161015620006ee5760405162461bcd60e51b815260206004820152601f602482015260008051602062003907833981519152604482015260640162000186565b606880546001600160401b0319166001600160401b038316908117909155604080516020808201939093528151808203909301835281019052600262000600565b620007636200074f60016000805160206200398783398151915262001141565b60001b62000eaf60201b620006d71760201c565b6000036200055b576200055b6200078b60016000805160206200398783398151915262001141565b60001b43620000d160201b62000f441760201c565b6001600160a01b03811615801590620007d657506001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b8015620007ea5750620007e862000eb3565b155b15620005d957601260ff16816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000834573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200085a9190620011bf565b60ff1614620008c35760405162461bcd60e51b815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201526d39903830bcb4b733903a37b5b2b760911b606482015260840162000186565b600062000943826001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000908573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000932919081019062001201565b62000ee760201b62000f641760201c565b905060006200098a836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000908573d6000803e3d6000fd5b9050620009a6836012848462000f7f60201b620010071760201c565b620009b06200105b565b6040516371cfaa3f60e01b81526001600160a01b03858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b15801562000a0b57600080fd5b505af115801562000a20573d6000803e3d6000fd5b50505050505050565b8060a001516001600160801b0316816060015163ffffffff16111562000ab85760405162461bcd60e51b815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d617820626173650000000000000000000000606482015260840162000186565b6001816040015160ff161162000b295760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201526e65206c6172676572207468616e203160881b606482015260840162000186565b606854608082015182516001600160401b039092169162000b4b9190620012b9565b63ffffffff16111562000b905760405162461bcd60e51b815260206004820152601f602482015260008051602062003907833981519152604482015260640162000186565b6000816020015160ff161162000c015760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201526e06965722063616e6e6f74206265203608c1b606482015260840162000186565b8051602082015163ffffffff82169160ff9091169062000c23908290620012e4565b62000c2f919062001316565b63ffffffff161462000caa5760405162461bcd60e51b815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d6974000000000000000000606482015260840162000186565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff96871664ffffffffff199095169490941764010000000060ff948516021764ffffffffff60281b191665010000000000939092169290920263ffffffff60301b19161766010000000000009185169190910217600160501b600160f01b0319166a01000000000000000000009390941692909202600160701b600160f01b03191692909217600160701b6001600160801b0390921691909102179055565b60695460009062000d959063ffffffff6a010000000000000000000082048116911662001345565b905090565b600054610100900460ff1662000df65760405162461bcd60e51b815260206004820152602b60248201526000805160206200394783398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000186565b6200055b3362000e5d565b6033546001600160a01b031633146200055b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000186565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b5490565b60008062000ec06200107d565b506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b600060208251111562000f635760405162461bcd60e51b815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e20333220627974657300000000000000000000606482015260840162000186565b62000f79826200109e60201b620010d91760201c565b92915050565b62000fc962000f9f6001600080516020620038e783398151915262001141565b60001b856001600160a01b031660a08660ff16901b1760001b620000d160201b62000f441760201c565b6200100f62000ffa60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d62001141565b60001b83620000d160201b62000f441760201c565b620010556200104060017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd0576462001141565b60001b82620000d160201b62000f441760201c565b50505050565b600062000d956200074f60016000805160206200396783398151915262001141565b60008062001095620010c860201b620011021760201c565b90939092509050565b805160218110620010b75763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b60008080620010ec6200074f6001600080516020620038e783398151915262001141565b6001600160a01b03811693509050826200111f575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b634e487b7160e01b600052601160045260246000fd5b6000828210156200115657620011566200112b565b500390565b60005b83811015620011785781810151838201526020016200115e565b83811115620010555750506000910152565b6020815260008251806020840152620011ab8160408501602087016200115b565b601f01601f19169190910160400192915050565b600060208284031215620011d257600080fd5b815160ff81168114620011e457600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156200121457600080fd5b81516001600160401b03808211156200122c57600080fd5b818401915084601f8301126200124157600080fd5b815181811115620012565762001256620011eb565b604051601f8201601f19908116603f01168101908382118183101715620012815762001281620011eb565b816040528281528760208487010111156200129b57600080fd5b620012ae8360208301602088016200115b565b979650505050505050565b600063ffffffff808316818516808303821115620012db57620012db6200112b565b01949350505050565b600063ffffffff808416806200130a57634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600063ffffffff808316818516818304811182151516156200133c576200133c6200112b565b02949350505050565b60006001600160401b03828116848216808303821115620012db57620012db6200112b565b61256d806200137a6000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80639b7d7f0a1161017b578063e0e2016d116100d8578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610661578063fd32aa0f14610669578063ffa1ad741461067157600080fd5b8063f45e65d814610644578063f68016b71461064d57600080fd5b8063e81b2c6d116100bd578063e81b2c6d14610620578063f2b4e61714610629578063f2fde38b1461063157600080fd5b8063e0e2016d14610610578063e2a3285c1461061857600080fd5b8063c71973f61161012f578063cc731b0211610114578063cc731b02146104cc578063d844471514610600578063dac6e63a1461060857600080fd5b8063c71973f6146104a6578063c9b26f61146104b957600080fd5b8063b40a817c11610160578063b40a817c14610483578063bc49ce5f14610496578063c4e8ddfa1461049e57600080fd5b80639b7d7f0a14610473578063a71198691461047b57600080fd5b806348cd4cb111610229578063550fcdc9116101dd578063715018a6116101c2578063715018a61461043a5780638da5cb5b14610442578063935f029e1461046057600080fd5b8063550fcdc91461042a5780635d73369c1461043257600080fd5b80634c1e843d1161020e5780634c1e843d146103a75780634f16540b146103ba57806354fd4d50146103e157600080fd5b806348cd4cb11461037e5780634add321d1461038657600080fd5b806318d13918116102805780631fd19ee1116102655780631fd19ee11461032857806321326849146103305780634397dfef1461034857600080fd5b806318d139181461030b57806319f5cea81461032057600080fd5b806306c92657146102b2578063078f29cf146102cd5780630a49cb03146102fa5780630c18c16214610302575b600080fd5b6102ba610679565b6040519081526020015b60405180910390f35b6102d56106a7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c4565b6102d56106e0565b6102ba60655481565b61031e610319366004611fc4565b610710565b005b6102ba610724565b6102d561074f565b610338610779565b60405190151581526020016102c4565b6103506107b8565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016102c4565b6102ba6107cc565b61038e6107fc565b60405167ffffffffffffffff90911681526020016102c4565b61031e6103b5366004612137565b610822565b6102ba7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b61041d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102c491906122ec565b61041d610c2d565b6102ba610c37565b61031e610c62565b60335473ffffffffffffffffffffffffffffffffffffffff166102d5565b61031e61046e3660046122ff565b610c76565b6102d5610c8c565b6102d5610cbc565b61031e610491366004612321565b610cec565b6102ba610cfd565b6102d5610d28565b61031e6104b436600461233c565b610d58565b61031e6104c7366004612358565b610d69565b6105906040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102c49190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61041d610d7a565b6102d5610d84565b6102ba610db4565b6102ba610ddf565b6102ba60675481565b6102d5610e0a565b61031e61063f366004611fc4565b610e3a565b6102ba60665481565b60685461038e9067ffffffffffffffff1681565b6102ba610eee565b6102ba610f19565b6102ba600081565b6106a460017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b81565b60006106db6106d760017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b5490565b905090565b60006106db6106d760017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b61071861117f565b61072181611200565b50565b6106a460017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b60006106db7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b6000806107846107b8565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b6000806107c3611102565b90939092509050565b60006106db6106d760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b6069546000906106db9063ffffffff6a01000000000000000000008204811691166123b7565b600054610100900460ff16158080156108425750600054600160ff909116105b8061085c5750303b15801561085c575060005460ff166001145b6108ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561094b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109536112bd565b61095c8a610e3a565b6109658761135c565b61096f8989611384565b61097886611415565b6109a17f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b6109d46109cf60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b849055565b610a08610a0260017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b83519055565b610a3f610a3660017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b60208401519055565b610a76610a6d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b60408401519055565b610aad610aa460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b60608401519055565b610ae4610adb60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b60808401519055565b610b1b610b1260017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b60a08401519055565b610b236114f3565b610b308260c0015161155b565b610b3984611865565b610b416107fc565b67ffffffffffffffff168667ffffffffffffffff161015610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b8015610c2157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b60606106db611cd9565b6106a460017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b610c6a61117f565b610c746000611d9a565b565b610c7e61117f565b610c888282611384565b5050565b60006106db6106d760017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b60006106db6106d760017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b610cf461117f565b61072181611415565b6106a460017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b60006106db6106d760017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b610d6061117f565b61072181611865565b610d7161117f565b6107218161135c565b60606106db611e11565b60006106db6106d760017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b6106a460017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b6106a460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b60006106db6106d760017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b610e4261117f565b73ffffffffffffffffffffffffffffffffffffffff8116610ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e4565b61072181611d9a565b6106a460017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b6106a460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000602082511115610ff8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e2033322062797465730000000000000000000060648201526084016108e4565b611001826110d9565b92915050565b61106d61103560017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec6123a0565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b6110a061109b60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d6123a0565b839055565b6110d36110ce60017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd057646123a0565b829055565b50505050565b8051602181106110f15763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b600080806111346106d760017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec6123a0565b73ffffffffffffffffffffffffffffffffffffffff81169350905082611173575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6112297f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516112b191906122ec565b60405180910390a35050565b600054610100900460ff16611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e4565b610c74611ec7565b6067819055604080516020808201849052825180830390910181529082019091526000611280565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161140891906122ec565b60405180910390a3505050565b61141d6107fc565b67ffffffffffffffff168167ffffffffffffffff16101561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611280565b6115216106d760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b600003610c7457610c7461155660017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b439055565b73ffffffffffffffffffffffffffffffffffffffff8116158015906115aa575073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b80156115bb57506115b9610779565b155b1561072157601260ff168173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906123e3565b60ff16146116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201527f7320706179696e6720746f6b656e00000000000000000000000000000000000060648201526084016108e4565b600061175f8273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611714573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261175a9190810190612400565b610f64565b905060006117b18373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611714573d6000803e3d6000fd5b90506117c08360128484611007565b6117c86106e0565b6040517f71cfaa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b50505050505050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d61782062617365000000000000000000000060648201526084016108e4565b6001816040015160ff16116119ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e2031000000000000000000000000000000000060648201526084016108e4565b6068546080820151825167ffffffffffffffff909216916119cd91906124cb565b63ffffffff161115611a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b6000816020015160ff1611611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f742062652030000000000000000000000000000000000060648201526084016108e4565b8051602082015163ffffffff82169160ff90911690611af29082906124ea565b611afc9190612534565b63ffffffff1614611b8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d697400000000000000000060648201526084016108e4565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60606000611ce5611102565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611d5e57505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b611d94611d8f6106d760017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd057646123a0565b611f67565b91505090565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000611e1d611102565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611e9657505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b611d94611d8f6106d760017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d6123a0565b600054610100900460ff16611f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e4565b610c7433611d9a565b60405160005b82811a15611f7d57600101611f6d565b80825260208201838152600082820152505060408101604052919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611fbf57600080fd5b919050565b600060208284031215611fd657600080fd5b611fdf82611f9b565b9392505050565b803567ffffffffffffffff81168114611fbf57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561205057612050611ffe565b60405290565b803563ffffffff81168114611fbf57600080fd5b60ff8116811461072157600080fd5b600060c0828403121561208b57600080fd5b60405160c0810181811067ffffffffffffffff821117156120ae576120ae611ffe565b6040529050806120bd83612056565b815260208301356120cd8161206a565b602082015260408301356120e08161206a565b60408201526120f160608401612056565b606082015261210260808401612056565b608082015260a08301356fffffffffffffffffffffffffffffffff8116811461212a57600080fd5b60a0919091015292915050565b6000806000806000806000806000898b0361028081121561215757600080fd5b6121608b611f9b565b995060208b0135985060408b0135975060608b0135965061218360808c01611fe6565b955061219160a08c01611f9b565b94506121a08c60c08d01612079565b93506121af6101808c01611f9b565b925060e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60820112156121e157600080fd5b506121ea61202d565b6121f76101a08c01611f9b565b81526122066101c08c01611f9b565b60208201526122186101e08c01611f9b565b604082015261222a6102008c01611f9b565b606082015261223c6102208c01611f9b565b608082015261224e6102408c01611f9b565b60a08201526122606102608c01611f9b565b60c0820152809150509295985092959850929598565b60005b83811015612291578181015183820152602001612279565b838111156110d35750506000910152565b600081518084526122ba816020860160208601612276565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fdf60208301846122a2565b6000806040838503121561231257600080fd5b50508035926020909101359150565b60006020828403121561233357600080fd5b611fdf82611fe6565b600060c0828403121561234e57600080fd5b611fdf8383612079565b60006020828403121561236a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156123b2576123b2612371565b500390565b600067ffffffffffffffff8083168185168083038211156123da576123da612371565b01949350505050565b6000602082840312156123f557600080fd5b8151611fdf8161206a565b60006020828403121561241257600080fd5b815167ffffffffffffffff8082111561242a57600080fd5b818401915084601f83011261243e57600080fd5b81518181111561245057612450611ffe565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561249657612496611ffe565b816040528281528760208487010111156124af57600080fd5b6124c0836020830160208801612276565b979650505050505050565b600063ffffffff8083168185168083038211156123da576123da612371565b600063ffffffff80841680612528577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff8083168185168183048111821515161561255757612557612371565b0294935050505056fea164736f6c634300080f000a04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77001d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420694b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ada11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0",
+      "deployedCode": "0x608060405234801561001057600080fd5b50600436106102ad5760003560e01c80639b7d7f0a1161017b578063e0e2016d116100d8578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610661578063fd32aa0f14610669578063ffa1ad741461067157600080fd5b8063f45e65d814610644578063f68016b71461064d57600080fd5b8063e81b2c6d116100bd578063e81b2c6d14610620578063f2b4e61714610629578063f2fde38b1461063157600080fd5b8063e0e2016d14610610578063e2a3285c1461061857600080fd5b8063c71973f61161012f578063cc731b0211610114578063cc731b02146104cc578063d844471514610600578063dac6e63a1461060857600080fd5b8063c71973f6146104a6578063c9b26f61146104b957600080fd5b8063b40a817c11610160578063b40a817c14610483578063bc49ce5f14610496578063c4e8ddfa1461049e57600080fd5b80639b7d7f0a14610473578063a71198691461047b57600080fd5b806348cd4cb111610229578063550fcdc9116101dd578063715018a6116101c2578063715018a61461043a5780638da5cb5b14610442578063935f029e1461046057600080fd5b8063550fcdc91461042a5780635d73369c1461043257600080fd5b80634c1e843d1161020e5780634c1e843d146103a75780634f16540b146103ba57806354fd4d50146103e157600080fd5b806348cd4cb11461037e5780634add321d1461038657600080fd5b806318d13918116102805780631fd19ee1116102655780631fd19ee11461032857806321326849146103305780634397dfef1461034857600080fd5b806318d139181461030b57806319f5cea81461032057600080fd5b806306c92657146102b2578063078f29cf146102cd5780630a49cb03146102fa5780630c18c16214610302575b600080fd5b6102ba610679565b6040519081526020015b60405180910390f35b6102d56106a7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c4565b6102d56106e0565b6102ba60655481565b61031e610319366004611fc4565b610710565b005b6102ba610724565b6102d561074f565b610338610779565b60405190151581526020016102c4565b6103506107b8565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016102c4565b6102ba6107cc565b61038e6107fc565b60405167ffffffffffffffff90911681526020016102c4565b61031e6103b5366004612137565b610822565b6102ba7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b61041d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102c491906122ec565b61041d610c2d565b6102ba610c37565b61031e610c62565b60335473ffffffffffffffffffffffffffffffffffffffff166102d5565b61031e61046e3660046122ff565b610c76565b6102d5610c8c565b6102d5610cbc565b61031e610491366004612321565b610cec565b6102ba610cfd565b6102d5610d28565b61031e6104b436600461233c565b610d58565b61031e6104c7366004612358565b610d69565b6105906040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102c49190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61041d610d7a565b6102d5610d84565b6102ba610db4565b6102ba610ddf565b6102ba60675481565b6102d5610e0a565b61031e61063f366004611fc4565b610e3a565b6102ba60665481565b60685461038e9067ffffffffffffffff1681565b6102ba610eee565b6102ba610f19565b6102ba600081565b6106a460017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b81565b60006106db6106d760017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b5490565b905090565b60006106db6106d760017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b61071861117f565b61072181611200565b50565b6106a460017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b60006106db7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b6000806107846107b8565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b6000806107c3611102565b90939092509050565b60006106db6106d760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b6069546000906106db9063ffffffff6a01000000000000000000008204811691166123b7565b600054610100900460ff16158080156108425750600054600160ff909116105b8061085c5750303b15801561085c575060005460ff166001145b6108ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561094b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109536112bd565b61095c8a610e3a565b6109658761135c565b61096f8989611384565b61097886611415565b6109a17f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b6109d46109cf60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b849055565b610a08610a0260017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b83519055565b610a3f610a3660017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b60208401519055565b610a76610a6d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b60408401519055565b610aad610aa460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b60608401519055565b610ae4610adb60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b60808401519055565b610b1b610b1260017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b60a08401519055565b610b236114f3565b610b308260c0015161155b565b610b3984611865565b610b416107fc565b67ffffffffffffffff168667ffffffffffffffff161015610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b8015610c2157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b60606106db611cd9565b6106a460017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b610c6a61117f565b610c746000611d9a565b565b610c7e61117f565b610c888282611384565b5050565b60006106db6106d760017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b60006106db6106d760017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b610cf461117f565b61072181611415565b6106a460017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b60006106db6106d760017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b610d6061117f565b61072181611865565b610d7161117f565b6107218161135c565b60606106db611e11565b60006106db6106d760017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b6106a460017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b6106a460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b60006106db6106d760017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b610e4261117f565b73ffffffffffffffffffffffffffffffffffffffff8116610ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e4565b61072181611d9a565b6106a460017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b6106a460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000602082511115610ff8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e2033322062797465730000000000000000000060648201526084016108e4565b611001826110d9565b92915050565b61106d61103560017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec6123a0565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b6110a061109b60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d6123a0565b839055565b6110d36110ce60017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd057646123a0565b829055565b50505050565b8051602181106110f15763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b600080806111346106d760017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec6123a0565b73ffffffffffffffffffffffffffffffffffffffff81169350905082611173575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6112297f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516112b191906122ec565b60405180910390a35050565b600054610100900460ff16611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e4565b610c74611ec7565b6067819055604080516020808201849052825180830390910181529082019091526000611280565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161140891906122ec565b60405180910390a3505050565b61141d6107fc565b67ffffffffffffffff168167ffffffffffffffff16101561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611280565b6115216106d760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b600003610c7457610c7461155660017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b439055565b73ffffffffffffffffffffffffffffffffffffffff8116158015906115aa575073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b80156115bb57506115b9610779565b155b1561072157601260ff168173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906123e3565b60ff16146116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201527f7320706179696e6720746f6b656e00000000000000000000000000000000000060648201526084016108e4565b600061175f8273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611714573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261175a9190810190612400565b610f64565b905060006117b18373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611714573d6000803e3d6000fd5b90506117c08360128484611007565b6117c86106e0565b6040517f71cfaa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b50505050505050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d61782062617365000000000000000000000060648201526084016108e4565b6001816040015160ff16116119ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e2031000000000000000000000000000000000060648201526084016108e4565b6068546080820151825167ffffffffffffffff909216916119cd91906124cb565b63ffffffff161115611a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b6000816020015160ff1611611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f742062652030000000000000000000000000000000000060648201526084016108e4565b8051602082015163ffffffff82169160ff90911690611af29082906124ea565b611afc9190612534565b63ffffffff1614611b8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d697400000000000000000060648201526084016108e4565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60606000611ce5611102565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611d5e57505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b611d94611d8f6106d760017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd057646123a0565b611f67565b91505090565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000611e1d611102565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611e9657505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b611d94611d8f6106d760017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d6123a0565b600054610100900460ff16611f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e4565b610c7433611d9a565b60405160005b82811a15611f7d57600101611f6d565b80825260208201838152600082820152505060408101604052919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611fbf57600080fd5b919050565b600060208284031215611fd657600080fd5b611fdf82611f9b565b9392505050565b803567ffffffffffffffff81168114611fbf57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561205057612050611ffe565b60405290565b803563ffffffff81168114611fbf57600080fd5b60ff8116811461072157600080fd5b600060c0828403121561208b57600080fd5b60405160c0810181811067ffffffffffffffff821117156120ae576120ae611ffe565b6040529050806120bd83612056565b815260208301356120cd8161206a565b602082015260408301356120e08161206a565b60408201526120f160608401612056565b606082015261210260808401612056565b608082015260a08301356fffffffffffffffffffffffffffffffff8116811461212a57600080fd5b60a0919091015292915050565b6000806000806000806000806000898b0361028081121561215757600080fd5b6121608b611f9b565b995060208b0135985060408b0135975060608b0135965061218360808c01611fe6565b955061219160a08c01611f9b565b94506121a08c60c08d01612079565b93506121af6101808c01611f9b565b925060e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60820112156121e157600080fd5b506121ea61202d565b6121f76101a08c01611f9b565b81526122066101c08c01611f9b565b60208201526122186101e08c01611f9b565b604082015261222a6102008c01611f9b565b606082015261223c6102208c01611f9b565b608082015261224e6102408c01611f9b565b60a08201526122606102608c01611f9b565b60c0820152809150509295985092959850929598565b60005b83811015612291578181015183820152602001612279565b838111156110d35750506000910152565b600081518084526122ba816020860160208601612276565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fdf60208301846122a2565b6000806040838503121561231257600080fd5b50508035926020909101359150565b60006020828403121561233357600080fd5b611fdf82611fe6565b600060c0828403121561234e57600080fd5b611fdf8383612079565b60006020828403121561236a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156123b2576123b2612371565b500390565b600067ffffffffffffffff8083168185168083038211156123da576123da612371565b01949350505050565b6000602082840312156123f557600080fd5b8151611fdf8161206a565b60006020828403121561241257600080fd5b815167ffffffffffffffff8082111561242a57600080fd5b818401915084601f83011261243e57600080fd5b81518181111561245057612450611ffe565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561249657612496611ffe565b816040528281528760208487010111156124af57600080fd5b6124c0836020830160208801612276565b979650505050505050565b600063ffffffff8083168185168083038211156123da576123da612371565b600063ffffffff80841680612528577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff8083168185168183048111821515161561255757612557612371565b0294935050505056fea164736f6c634300080f000a",
       "initialized": true,
       "kind": "Create",
       "newBalance": 0,
@@ -4577,7 +4643,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4585,7 +4651,7 @@
           "slot": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4593,7 +4659,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4601,7 +4667,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4609,7 +4675,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4617,7 +4683,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -4625,7 +4691,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -4633,7 +4699,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
@@ -4641,7 +4707,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
@@ -4649,7 +4715,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4657,7 +4723,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000033"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4665,7 +4731,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000033"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c",
           "previousValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c",
@@ -4673,7 +4739,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000033"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c",
           "previousValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c",
@@ -4681,7 +4747,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000033"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead",
           "previousValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c",
@@ -4689,7 +4755,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000033"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4697,7 +4763,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000067"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4705,7 +4771,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000065"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4713,7 +4779,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000066"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4721,7 +4787,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000069"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4729,7 +4795,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000068"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4737,7 +4803,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000068"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4745,7 +4811,7 @@
           "slot": "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4753,7 +4819,7 @@
           "slot": "0x71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4761,7 +4827,7 @@
           "slot": "0x383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4769,7 +4835,7 @@
           "slot": "0x46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4777,15 +4843,15 @@
           "slot": "0x9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0xe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871815"
+          "slot": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4793,7 +4859,7 @@
           "slot": "0x4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4801,7 +4867,7 @@
           "slot": "0xa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
           "previousValue": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
@@ -4809,7 +4875,7 @@
           "slot": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -4817,7 +4883,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000068"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4825,7 +4891,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000069"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000020100000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4833,7 +4899,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000069"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000020100000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000020100000001",
@@ -4841,7 +4907,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000069"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
@@ -4849,7 +4915,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
@@ -4878,7 +4944,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -4892,7 +4958,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000020100000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000020100000001",
@@ -4904,7 +4970,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -4918,7 +4984,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead",
           "previousValue": "0x000000000000000000000000000000000000000000000000000000000000dead",
@@ -4930,7 +4996,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -4944,7 +5010,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4956,7 +5022,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -4970,7 +5036,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -4982,7 +5048,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -4996,7 +5062,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5008,7 +5074,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5022,7 +5088,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -5034,7 +5100,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5048,7 +5114,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5060,7 +5126,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5074,7 +5140,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
           "previousValue": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
@@ -5086,7 +5152,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5100,7 +5166,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5112,7 +5178,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5126,7 +5192,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5138,7 +5204,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5152,7 +5218,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5164,7 +5230,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5178,7 +5244,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5190,12 +5256,12 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x4d9f1559",
+      "data": "0xf2b4e617",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "StaticCall",
@@ -5204,19 +5270,19 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0xe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871815"
+          "slot": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906"
         }
       ],
       "value": 0
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5230,7 +5296,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5242,7 +5308,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5256,7 +5322,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+          "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5300,15 +5366,32 @@
       "storageAccesses": [],
       "value": 0
     },
+    {
+      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
+      "account": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
+      "chainInfo": {
+        "chainId": 31337,
+        "forkId": 0
+      },
+      "data": "0x638627e586f5e36fe67a77519503a7c6da22f92b150d3c6055fd40bdcfe9ffd160806040523480156200001157600080fd5b50620000206000808062000026565b6200024b565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001a160201b620005891760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603280546001600160a01b038086166001600160a01b03199283161790925560338054928516929091169190911790556200015484734200000000000000000000000000000000000010620001b0565b80156200019b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200021d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b612faf806200025b6000396000f3fe6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612993565b6105b8565b61023b610270366004612a44565b6109d2565b61023b610283366004612a97565b610aa9565b61023b610296366004612a97565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612b0a565b61101b565b34801561037857600080fd5b506103b56040518060400160405280600581526020017f322e322e3000000000000000000000000000000000000000000000000000000081525081565b6040516102e99190612bf7565b3480156103ce57600080fd5b5061023b6103dd366004612c0a565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612b0a565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612c0a565b611212565b34801561047e57600080fd5b506104aa61048d366004612c8d565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612cc6565b6112e6565b34801561050257600080fd5b5061023b610511366004612993565b611328565b61023b610524366004612a44565b611337565b34801561053557600080fd5b5061023b610544366004612d29565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612cc6565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612dc0565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612dd7565b905090565b6109c987873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f84734200000000000000000000000000000000000010612021565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a8585858461210b565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612df9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612e42565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b806119055750611905827fec4fc8e30000000000000000000000000000000000000000000000000000000061217e565b92915050565b6000611937837f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612d74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526121a1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612e87565b60405180910390a46110138686868686866122ad565b600080611b98612335565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612ec5565b60405180910390a36105b2848484846123d2565b600080600080845160208601878a8af19695505050505050565b3415611ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610214565b611cf0876118a9565b15611e3e57611cff878761190b565b611db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b50505050611ed2565b611e6073ffffffffffffffffffffffffffffffffffffffff881686308661243f565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e9e908490612ede565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611ee087878787878661249d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611f44908b908d908c908c908c908b90602401612ef6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611fd792918790600401612e42565b600060405180830381600087803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c59565b600054610100900460ff166120b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23848460405161216a929190612ec5565b60405180910390a36105b28484848461252b565b60006121898361258a565b801561219a575061219a83836125ee565b9392505050565b6000612203826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126bd9092919063ffffffff16565b805190915015610aa457808060200190518101906122219190612dd7565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161232593929190612e87565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c99190612f51565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612431929190612ec5565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161251593929190612e87565b60405180910390a46110138686868686866126d4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612431929190612ec5565b60006125b6827f01ffc9a7000000000000000000000000000000000000000000000000000000006125ee565b801561190557506125e7827fffffffff000000000000000000000000000000000000000000000000000000006125ee565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156126a6575060208210155b80156126b25750600081115b979650505050505050565b60606126cc848460008561274c565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161232593929190612e87565b6060824710156127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b61285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128859190612f86565b60006040518083038185875af1925050503d80600081146128c2576040519150601f19603f3d011682016040523d82523d6000602084013e6128c7565b606091505b50915091506126b2828286606083156128e157508161219a565b8251156128f15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612bf7565b73ffffffffffffffffffffffffffffffffffffffff8116811461294757600080fd5b50565b60008083601f84011261295c57600080fd5b50813567ffffffffffffffff81111561297457600080fd5b60208301915083602082850101111561298c57600080fd5b9250929050565b600080600080600080600060c0888a0312156129ae57600080fd5b87356129b981612925565b965060208801356129c981612925565b955060408801356129d981612925565b945060608801356129e981612925565b93506080880135925060a088013567ffffffffffffffff811115612a0c57600080fd5b612a188a828b0161294a565b989b979a50959850939692959293505050565b803563ffffffff81168114612a3f57600080fd5b919050565b600080600060408486031215612a5957600080fd5b612a6284612a2b565b9250602084013567ffffffffffffffff811115612a7e57600080fd5b612a8a8682870161294a565b9497909650939450505050565b600080600080600060808688031215612aaf57600080fd5b8535612aba81612925565b94506020860135612aca81612925565b935060408601359250606086013567ffffffffffffffff811115612aed57600080fd5b612af98882890161294a565b969995985093965092949392505050565b600080600080600080600060c0888a031215612b2557600080fd5b8735612b3081612925565b96506020880135612b4081612925565b95506040880135612b5081612925565b945060608801359350612b6560808901612a2b565b925060a088013567ffffffffffffffff811115612a0c57600080fd5b60005b83811015612b9c578181015183820152602001612b84565b838111156105b25750506000910152565b60008151808452612bc5816020860160208601612b81565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061219a6020830184612bad565b60008060008060008060a08789031215612c2357600080fd5b8635612c2e81612925565b95506020870135612c3e81612925565b945060408701359350612c5360608801612a2b565b9250608087013567ffffffffffffffff811115612c6f57600080fd5b612c7b89828a0161294a565b979a9699509497509295939492505050565b60008060408385031215612ca057600080fd5b8235612cab81612925565b91506020830135612cbb81612925565b809150509250929050565b60008060008060608587031215612cdc57600080fd5b8435612ce781612925565b9350612cf560208601612a2b565b9250604085013567ffffffffffffffff811115612d1157600080fd5b612d1d8782880161294a565b95989497509550505050565b600080600060608486031215612d3e57600080fd5b8335612d4981612925565b92506020840135612d5981612925565b91506040840135612d6981612925565b809150509250925092565b600060208284031215612d8657600080fd5b815161219a81612925565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612dd257612dd2612d91565b500390565b600060208284031215612de957600080fd5b8151801515811461219a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612e386080830184612bad565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612e716060830185612bad565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612ebc6060830184612bad565b95945050505050565b8281526040602082015260006126cc6040830184612bad565b60008219821115612ef157612ef1612d91565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612f4560c0830184612bad565b98975050505050505050565b60008060408385031215612f6457600080fd5b8251612f6f81612925565b602084015190925060ff81168114612cbb57600080fd5b60008251612f98818460208701612b81565b919091019291505056fea164736f6c634300080f000a",
+      "deployedCode": "0x",
+      "initialized": true,
+      "kind": "Call",
+      "newBalance": 0,
+      "oldBalance": 0,
+      "reverted": false,
+      "storageAccesses": [],
+      "value": 0
+    },
     {
       "accessor": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x60806040523480156200001157600080fd5b506200001f60008062000025565b62000234565b600054610100900460ff1615808015620000465750600054600160ff909116105b8062000076575062000063306200018a60201b620005511760201c565b15801562000076575060005460ff166001145b620000df5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000103576000805461ff0019166101001790555b603280546001600160a01b0319166001600160a01b0384161790556200013e8373420000000000000000000000000000000000001062000199565b801562000185576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054610100900460ff16620002065760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d6565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b612c4d80620002446000396000f3fe6080604052600436106101795760003560e01c80637f46ddb2116100cb578063927ede2d1161007f578063b1a1a88211610059578063b1a1a882146104fe578063c89701a214610511578063e11013dd1461053e57600080fd5b8063927ede2d146104a05780639a2ac6d5146104cb578063a9f9e675146104de57600080fd5b806387087623116100b0578063870876231461043a5780638f601f661461045a57806391c49bf8146103ef57600080fd5b80637f46ddb2146103ef578063838b25201461041a57600080fd5b80633cb747bf1161012d57806354fd4d501161010757806354fd4d501461035457806358a997f6146103aa5780635c975abb146103ca57600080fd5b80633cb747bf146102e7578063485cc95514610314578063540abf731461033457600080fd5b80631532ec341161015e5780631532ec341461026a5780631635f5fd1461027d57806335e80ab31461029057600080fd5b80630166a07a1461023757806309fc88431461025757600080fd5b3661023257333b15610212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b610230333362030d406040518060200160405280600081525061056d565b005b600080fd5b34801561024357600080fd5b506102306102523660046126b1565b610580565b610230610265366004612762565b61099a565b6102306102783660046127b5565b610a71565b61023061028b3660046127b5565b610a85565b34801561029c57600080fd5b506032546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102f357600080fd5b506003546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032057600080fd5b5061023061032f366004612828565b610f4e565b34801561034057600080fd5b5061023061034f366004612861565b611137565b34801561036057600080fd5b5061039d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102de919061294e565b3480156103b657600080fd5b506102306103c5366004612961565b61117c565b3480156103d657600080fd5b506103df611250565b60405190151581526020016102de565b3480156103fb57600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102bd565b34801561042657600080fd5b50610230610435366004612861565b6112e9565b34801561044657600080fd5b50610230610455366004612961565b61132e565b34801561046657600080fd5b50610492610475366004612828565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102de565b3480156104ac57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102bd565b6102306104d93660046129e4565b611402565b3480156104ea57600080fd5b506102306104f93660046126b1565b611444565b61023061050c366004612762565b611453565b34801561051d57600080fd5b506004546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b61023061054c3660046129e4565b611524565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61057a8484348585611567565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610653575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b9190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b61070d611250565b15610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b61077d87611731565b156108cb5761078c8787611793565b61083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108ae57600080fd5b505af11580156108c2573d6000803e3d6000fd5b5050505061094d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610909908490612a93565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c168352939052919091209190915561094d9085856118b3565b610991878787878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061198792505050565b50505050505050565b333b15610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c3333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b505050565b610a7e8585858585610a85565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b58575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b409190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b610c12611250565b15610c79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b823414610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610209565b3073ffffffffffffffffffffffffffffffffffffffff851603610dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610209565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610209565b610e9a85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a1592505050565b6000610eb7855a8660405180602001604052806000815250611a88565b905080610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610209565b505050505050565b600054610100900460ff1615808015610f6e5750600054600160ff909116105b80610f885750303b158015610f88575060005460ff166001145b611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610209565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556110d083734200000000000000000000000000000000000010611aa2565b8015610a6c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b333b1561120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156112c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e49190612aaa565b905090565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b333b156113bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b61057a33858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61099187878787878787610580565b333b156114e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61057a3385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b8234146115f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610209565b61160285858584611ec6565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd0000000000000000000000000000000000000000000000000000000090611665908b908b9086908a90602401612acc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526116f892918890600401612b15565b6000604051808303818588803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b50505050505050505050565b600061175d827f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b8061178d575061178d827fec4fc8e300000000000000000000000000000000000000000000000000000000611f39565b92915050565b60006117bf837f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b15611868578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118339190612a47565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905061178d565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a6c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611f5c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b38686866040516119ff93929190612b5a565b60405180910390a4610f46868686868686612068565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611a74929190612b98565b60405180910390a361057a848484846120f0565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610209565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b611b9587611731565b15611ce357611ba48787611793565b611c56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611cc657600080fd5b505af1158015611cda573d6000803e3d6000fd5b50505050611d77565b611d0573ffffffffffffffffffffffffffffffffffffffff881686308661215d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611d43908490612bb1565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611d858787878787866121bb565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611de9908b908d908c908c908c908b90602401612bc9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611e7c92918790600401612b15565b600060405180830381600087803b158015611e9657600080fd5b505af1158015611eaa573d6000803e3d6000fd5b5050505050505050505050565b61099187878787878787611b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f238484604051611f25929190612b98565b60405180910390a361057a84848484612249565b6000611f44836122a8565b8015611f555750611f55838361230c565b9392505050565b6000611fbe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123db9092919063ffffffff16565b805190915015610a6c5780806020019051810190611fdc9190612aaa565b610a6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610209565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8686866040516120e093929190612b5a565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d848460405161214f929190612b98565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261057a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611905565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161223393929190612b5a565b60405180910390a4610f468686868686866123f2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5848460405161214f929190612b98565b60006122d4827f01ffc9a70000000000000000000000000000000000000000000000000000000061230c565b801561178d5750612305827fffffffff0000000000000000000000000000000000000000000000000000000061230c565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156123c4575060208210155b80156123d05750600081115b979650505050505050565b60606123ea848460008561246a565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8686866040516120e093929190612b5a565b6060824710156124fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610209565b73ffffffffffffffffffffffffffffffffffffffff85163b61257a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610209565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125a39190612c24565b60006040518083038185875af1925050503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b50915091506123d0828286606083156125ff575081611f55565b82511561260f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610209919061294e565b73ffffffffffffffffffffffffffffffffffffffff8116811461266557600080fd5b50565b60008083601f84011261267a57600080fd5b50813567ffffffffffffffff81111561269257600080fd5b6020830191508360208285010111156126aa57600080fd5b9250929050565b600080600080600080600060c0888a0312156126cc57600080fd5b87356126d781612643565b965060208801356126e781612643565b955060408801356126f781612643565b9450606088013561270781612643565b93506080880135925060a088013567ffffffffffffffff81111561272a57600080fd5b6127368a828b01612668565b989b979a50959850939692959293505050565b803563ffffffff8116811461275d57600080fd5b919050565b60008060006040848603121561277757600080fd5b61278084612749565b9250602084013567ffffffffffffffff81111561279c57600080fd5b6127a886828701612668565b9497909650939450505050565b6000806000806000608086880312156127cd57600080fd5b85356127d881612643565b945060208601356127e881612643565b935060408601359250606086013567ffffffffffffffff81111561280b57600080fd5b61281788828901612668565b969995985093965092949392505050565b6000806040838503121561283b57600080fd5b823561284681612643565b9150602083013561285681612643565b809150509250929050565b600080600080600080600060c0888a03121561287c57600080fd5b873561288781612643565b9650602088013561289781612643565b955060408801356128a781612643565b9450606088013593506128bc60808901612749565b925060a088013567ffffffffffffffff81111561272a57600080fd5b60005b838110156128f35781810151838201526020016128db565b8381111561057a5750506000910152565b6000815180845261291c8160208601602086016128d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f556020830184612904565b60008060008060008060a0878903121561297a57600080fd5b863561298581612643565b9550602087013561299581612643565b9450604087013593506129aa60608801612749565b9250608087013567ffffffffffffffff8111156129c657600080fd5b6129d289828a01612668565b979a9699509497509295939492505050565b600080600080606085870312156129fa57600080fd5b8435612a0581612643565b9350612a1360208601612749565b9250604085013567ffffffffffffffff811115612a2f57600080fd5b612a3b87828801612668565b95989497509550505050565b600060208284031215612a5957600080fd5b8151611f5581612643565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612aa557612aa5612a64565b500390565b600060208284031215612abc57600080fd5b81518015158114611f5557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612b0b6080830184612904565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612b446060830185612904565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612b8f6060830184612904565b95945050505050565b8281526040602082015260006123ea6040830184612904565b60008219821115612bc457612bc4612a64565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612c1860c0830184612904565b98975050505050505050565b60008251612c368184602087016128d8565b919091019291505056fea164736f6c634300080f000a",
-      "deployedCode": "0x6080604052600436106101795760003560e01c80637f46ddb2116100cb578063927ede2d1161007f578063b1a1a88211610059578063b1a1a882146104fe578063c89701a214610511578063e11013dd1461053e57600080fd5b8063927ede2d146104a05780639a2ac6d5146104cb578063a9f9e675146104de57600080fd5b806387087623116100b0578063870876231461043a5780638f601f661461045a57806391c49bf8146103ef57600080fd5b80637f46ddb2146103ef578063838b25201461041a57600080fd5b80633cb747bf1161012d57806354fd4d501161010757806354fd4d501461035457806358a997f6146103aa5780635c975abb146103ca57600080fd5b80633cb747bf146102e7578063485cc95514610314578063540abf731461033457600080fd5b80631532ec341161015e5780631532ec341461026a5780631635f5fd1461027d57806335e80ab31461029057600080fd5b80630166a07a1461023757806309fc88431461025757600080fd5b3661023257333b15610212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b610230333362030d406040518060200160405280600081525061056d565b005b600080fd5b34801561024357600080fd5b506102306102523660046126b1565b610580565b610230610265366004612762565b61099a565b6102306102783660046127b5565b610a71565b61023061028b3660046127b5565b610a85565b34801561029c57600080fd5b506032546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102f357600080fd5b506003546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032057600080fd5b5061023061032f366004612828565b610f4e565b34801561034057600080fd5b5061023061034f366004612861565b611137565b34801561036057600080fd5b5061039d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102de919061294e565b3480156103b657600080fd5b506102306103c5366004612961565b61117c565b3480156103d657600080fd5b506103df611250565b60405190151581526020016102de565b3480156103fb57600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102bd565b34801561042657600080fd5b50610230610435366004612861565b6112e9565b34801561044657600080fd5b50610230610455366004612961565b61132e565b34801561046657600080fd5b50610492610475366004612828565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102de565b3480156104ac57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102bd565b6102306104d93660046129e4565b611402565b3480156104ea57600080fd5b506102306104f93660046126b1565b611444565b61023061050c366004612762565b611453565b34801561051d57600080fd5b506004546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b61023061054c3660046129e4565b611524565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61057a8484348585611567565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610653575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b9190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b61070d611250565b15610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b61077d87611731565b156108cb5761078c8787611793565b61083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108ae57600080fd5b505af11580156108c2573d6000803e3d6000fd5b5050505061094d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610909908490612a93565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c168352939052919091209190915561094d9085856118b3565b610991878787878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061198792505050565b50505050505050565b333b15610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c3333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b505050565b610a7e8585858585610a85565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b58575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b409190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b610c12611250565b15610c79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b823414610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610209565b3073ffffffffffffffffffffffffffffffffffffffff851603610dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610209565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610209565b610e9a85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a1592505050565b6000610eb7855a8660405180602001604052806000815250611a88565b905080610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610209565b505050505050565b600054610100900460ff1615808015610f6e5750600054600160ff909116105b80610f885750303b158015610f88575060005460ff166001145b611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610209565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556110d083734200000000000000000000000000000000000010611aa2565b8015610a6c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b333b1561120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156112c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e49190612aaa565b905090565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b333b156113bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b61057a33858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61099187878787878787610580565b333b156114e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61057a3385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b8234146115f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610209565b61160285858584611ec6565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd0000000000000000000000000000000000000000000000000000000090611665908b908b9086908a90602401612acc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526116f892918890600401612b15565b6000604051808303818588803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b50505050505050505050565b600061175d827f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b8061178d575061178d827fec4fc8e300000000000000000000000000000000000000000000000000000000611f39565b92915050565b60006117bf837f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b15611868578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118339190612a47565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905061178d565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a6c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611f5c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b38686866040516119ff93929190612b5a565b60405180910390a4610f46868686868686612068565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611a74929190612b98565b60405180910390a361057a848484846120f0565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610209565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b611b9587611731565b15611ce357611ba48787611793565b611c56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611cc657600080fd5b505af1158015611cda573d6000803e3d6000fd5b50505050611d77565b611d0573ffffffffffffffffffffffffffffffffffffffff881686308661215d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611d43908490612bb1565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611d858787878787866121bb565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611de9908b908d908c908c908c908b90602401612bc9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611e7c92918790600401612b15565b600060405180830381600087803b158015611e9657600080fd5b505af1158015611eaa573d6000803e3d6000fd5b5050505050505050505050565b61099187878787878787611b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f238484604051611f25929190612b98565b60405180910390a361057a84848484612249565b6000611f44836122a8565b8015611f555750611f55838361230c565b9392505050565b6000611fbe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123db9092919063ffffffff16565b805190915015610a6c5780806020019051810190611fdc9190612aaa565b610a6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610209565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8686866040516120e093929190612b5a565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d848460405161214f929190612b98565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261057a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611905565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161223393929190612b5a565b60405180910390a4610f468686868686866123f2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5848460405161214f929190612b98565b60006122d4827f01ffc9a70000000000000000000000000000000000000000000000000000000061230c565b801561178d5750612305827fffffffff0000000000000000000000000000000000000000000000000000000061230c565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156123c4575060208210155b80156123d05750600081115b979650505050505050565b60606123ea848460008561246a565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8686866040516120e093929190612b5a565b6060824710156124fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610209565b73ffffffffffffffffffffffffffffffffffffffff85163b61257a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610209565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125a39190612c24565b60006040518083038185875af1925050503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b50915091506123d0828286606083156125ff575081611f55565b82511561260f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610209919061294e565b73ffffffffffffffffffffffffffffffffffffffff8116811461266557600080fd5b50565b60008083601f84011261267a57600080fd5b50813567ffffffffffffffff81111561269257600080fd5b6020830191508360208285010111156126aa57600080fd5b9250929050565b600080600080600080600060c0888a0312156126cc57600080fd5b87356126d781612643565b965060208801356126e781612643565b955060408801356126f781612643565b9450606088013561270781612643565b93506080880135925060a088013567ffffffffffffffff81111561272a57600080fd5b6127368a828b01612668565b989b979a50959850939692959293505050565b803563ffffffff8116811461275d57600080fd5b919050565b60008060006040848603121561277757600080fd5b61278084612749565b9250602084013567ffffffffffffffff81111561279c57600080fd5b6127a886828701612668565b9497909650939450505050565b6000806000806000608086880312156127cd57600080fd5b85356127d881612643565b945060208601356127e881612643565b935060408601359250606086013567ffffffffffffffff81111561280b57600080fd5b61281788828901612668565b969995985093965092949392505050565b6000806040838503121561283b57600080fd5b823561284681612643565b9150602083013561285681612643565b809150509250929050565b600080600080600080600060c0888a03121561287c57600080fd5b873561288781612643565b9650602088013561289781612643565b955060408801356128a781612643565b9450606088013593506128bc60808901612749565b925060a088013567ffffffffffffffff81111561272a57600080fd5b60005b838110156128f35781810151838201526020016128db565b8381111561057a5750506000910152565b6000815180845261291c8160208601602086016128d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f556020830184612904565b60008060008060008060a0878903121561297a57600080fd5b863561298581612643565b9550602087013561299581612643565b9450604087013593506129aa60608801612749565b9250608087013567ffffffffffffffff8111156129c657600080fd5b6129d289828a01612668565b979a9699509497509295939492505050565b600080600080606085870312156129fa57600080fd5b8435612a0581612643565b9350612a1360208601612749565b9250604085013567ffffffffffffffff811115612a2f57600080fd5b612a3b87828801612668565b95989497509550505050565b600060208284031215612a5957600080fd5b8151611f5581612643565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612aa557612aa5612a64565b500390565b600060208284031215612abc57600080fd5b81518015158114611f5557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612b0b6080830184612904565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612b446060830185612904565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612b8f6060830184612904565b95945050505050565b8281526040602082015260006123ea6040830184612904565b60008219821115612bc457612bc4612a64565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612c1860c0830184612904565b98975050505050505050565b60008251612c368184602087016128d8565b919091019291505056fea164736f6c634300080f000a",
+      "data": "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200024b565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001a160201b620005891760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603280546001600160a01b038086166001600160a01b03199283161790925560338054928516929091169190911790556200015484734200000000000000000000000000000000000010620001b0565b80156200019b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200021d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b612faf806200025b6000396000f3fe6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612993565b6105b8565b61023b610270366004612a44565b6109d2565b61023b610283366004612a97565b610aa9565b61023b610296366004612a97565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612b0a565b61101b565b34801561037857600080fd5b506103b56040518060400160405280600581526020017f322e322e3000000000000000000000000000000000000000000000000000000081525081565b6040516102e99190612bf7565b3480156103ce57600080fd5b5061023b6103dd366004612c0a565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612b0a565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612c0a565b611212565b34801561047e57600080fd5b506104aa61048d366004612c8d565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612cc6565b6112e6565b34801561050257600080fd5b5061023b610511366004612993565b611328565b61023b610524366004612a44565b611337565b34801561053557600080fd5b5061023b610544366004612d29565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612cc6565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612dc0565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612dd7565b905090565b6109c987873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f84734200000000000000000000000000000000000010612021565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a8585858461210b565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612df9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612e42565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b806119055750611905827fec4fc8e30000000000000000000000000000000000000000000000000000000061217e565b92915050565b6000611937837f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612d74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526121a1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612e87565b60405180910390a46110138686868686866122ad565b600080611b98612335565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612ec5565b60405180910390a36105b2848484846123d2565b600080600080845160208601878a8af19695505050505050565b3415611ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610214565b611cf0876118a9565b15611e3e57611cff878761190b565b611db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b50505050611ed2565b611e6073ffffffffffffffffffffffffffffffffffffffff881686308661243f565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e9e908490612ede565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611ee087878787878661249d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611f44908b908d908c908c908c908b90602401612ef6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611fd792918790600401612e42565b600060405180830381600087803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c59565b600054610100900460ff166120b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23848460405161216a929190612ec5565b60405180910390a36105b28484848461252b565b60006121898361258a565b801561219a575061219a83836125ee565b9392505050565b6000612203826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126bd9092919063ffffffff16565b805190915015610aa457808060200190518101906122219190612dd7565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161232593929190612e87565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c99190612f51565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612431929190612ec5565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161251593929190612e87565b60405180910390a46110138686868686866126d4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612431929190612ec5565b60006125b6827f01ffc9a7000000000000000000000000000000000000000000000000000000006125ee565b801561190557506125e7827fffffffff000000000000000000000000000000000000000000000000000000006125ee565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156126a6575060208210155b80156126b25750600081115b979650505050505050565b60606126cc848460008561274c565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161232593929190612e87565b6060824710156127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b61285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128859190612f86565b60006040518083038185875af1925050503d80600081146128c2576040519150601f19603f3d011682016040523d82523d6000602084013e6128c7565b606091505b50915091506126b2828286606083156128e157508161219a565b8251156128f15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612bf7565b73ffffffffffffffffffffffffffffffffffffffff8116811461294757600080fd5b50565b60008083601f84011261295c57600080fd5b50813567ffffffffffffffff81111561297457600080fd5b60208301915083602082850101111561298c57600080fd5b9250929050565b600080600080600080600060c0888a0312156129ae57600080fd5b87356129b981612925565b965060208801356129c981612925565b955060408801356129d981612925565b945060608801356129e981612925565b93506080880135925060a088013567ffffffffffffffff811115612a0c57600080fd5b612a188a828b0161294a565b989b979a50959850939692959293505050565b803563ffffffff81168114612a3f57600080fd5b919050565b600080600060408486031215612a5957600080fd5b612a6284612a2b565b9250602084013567ffffffffffffffff811115612a7e57600080fd5b612a8a8682870161294a565b9497909650939450505050565b600080600080600060808688031215612aaf57600080fd5b8535612aba81612925565b94506020860135612aca81612925565b935060408601359250606086013567ffffffffffffffff811115612aed57600080fd5b612af98882890161294a565b969995985093965092949392505050565b600080600080600080600060c0888a031215612b2557600080fd5b8735612b3081612925565b96506020880135612b4081612925565b95506040880135612b5081612925565b945060608801359350612b6560808901612a2b565b925060a088013567ffffffffffffffff811115612a0c57600080fd5b60005b83811015612b9c578181015183820152602001612b84565b838111156105b25750506000910152565b60008151808452612bc5816020860160208601612b81565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061219a6020830184612bad565b60008060008060008060a08789031215612c2357600080fd5b8635612c2e81612925565b95506020870135612c3e81612925565b945060408701359350612c5360608801612a2b565b9250608087013567ffffffffffffffff811115612c6f57600080fd5b612c7b89828a0161294a565b979a9699509497509295939492505050565b60008060408385031215612ca057600080fd5b8235612cab81612925565b91506020830135612cbb81612925565b809150509250929050565b60008060008060608587031215612cdc57600080fd5b8435612ce781612925565b9350612cf560208601612a2b565b9250604085013567ffffffffffffffff811115612d1157600080fd5b612d1d8782880161294a565b95989497509550505050565b600080600060608486031215612d3e57600080fd5b8335612d4981612925565b92506020840135612d5981612925565b91506040840135612d6981612925565b809150509250925092565b600060208284031215612d8657600080fd5b815161219a81612925565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612dd257612dd2612d91565b500390565b600060208284031215612de957600080fd5b8151801515811461219a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612e386080830184612bad565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612e716060830185612bad565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612ebc6060830184612bad565b95945050505050565b8281526040602082015260006126cc6040830184612bad565b60008219821115612ef157612ef1612d91565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612f4560c0830184612bad565b98975050505050505050565b60008060408385031215612f6457600080fd5b8251612f6f81612925565b602084015190925060ff81168114612cbb57600080fd5b60008251612f98818460208701612b81565b919091019291505056fea164736f6c634300080f000a",
+      "deployedCode": "0x6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612993565b6105b8565b61023b610270366004612a44565b6109d2565b61023b610283366004612a97565b610aa9565b61023b610296366004612a97565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612b0a565b61101b565b34801561037857600080fd5b506103b56040518060400160405280600581526020017f322e322e3000000000000000000000000000000000000000000000000000000081525081565b6040516102e99190612bf7565b3480156103ce57600080fd5b5061023b6103dd366004612c0a565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612b0a565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612c0a565b611212565b34801561047e57600080fd5b506104aa61048d366004612c8d565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612cc6565b6112e6565b34801561050257600080fd5b5061023b610511366004612993565b611328565b61023b610524366004612a44565b611337565b34801561053557600080fd5b5061023b610544366004612d29565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612cc6565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612dc0565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612dd7565b905090565b6109c987873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f84734200000000000000000000000000000000000010612021565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a8585858461210b565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612df9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612e42565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b806119055750611905827fec4fc8e30000000000000000000000000000000000000000000000000000000061217e565b92915050565b6000611937837f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612d74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526121a1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612e87565b60405180910390a46110138686868686866122ad565b600080611b98612335565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612ec5565b60405180910390a36105b2848484846123d2565b600080600080845160208601878a8af19695505050505050565b3415611ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610214565b611cf0876118a9565b15611e3e57611cff878761190b565b611db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b50505050611ed2565b611e6073ffffffffffffffffffffffffffffffffffffffff881686308661243f565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e9e908490612ede565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611ee087878787878661249d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611f44908b908d908c908c908c908b90602401612ef6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611fd792918790600401612e42565b600060405180830381600087803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c59565b600054610100900460ff166120b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23848460405161216a929190612ec5565b60405180910390a36105b28484848461252b565b60006121898361258a565b801561219a575061219a83836125ee565b9392505050565b6000612203826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126bd9092919063ffffffff16565b805190915015610aa457808060200190518101906122219190612dd7565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161232593929190612e87565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c99190612f51565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612431929190612ec5565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161251593929190612e87565b60405180910390a46110138686868686866126d4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612431929190612ec5565b60006125b6827f01ffc9a7000000000000000000000000000000000000000000000000000000006125ee565b801561190557506125e7827fffffffff000000000000000000000000000000000000000000000000000000006125ee565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156126a6575060208210155b80156126b25750600081115b979650505050505050565b60606126cc848460008561274c565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161232593929190612e87565b6060824710156127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b61285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128859190612f86565b60006040518083038185875af1925050503d80600081146128c2576040519150601f19603f3d011682016040523d82523d6000602084013e6128c7565b606091505b50915091506126b2828286606083156128e157508161219a565b8251156128f15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612bf7565b73ffffffffffffffffffffffffffffffffffffffff8116811461294757600080fd5b50565b60008083601f84011261295c57600080fd5b50813567ffffffffffffffff81111561297457600080fd5b60208301915083602082850101111561298c57600080fd5b9250929050565b600080600080600080600060c0888a0312156129ae57600080fd5b87356129b981612925565b965060208801356129c981612925565b955060408801356129d981612925565b945060608801356129e981612925565b93506080880135925060a088013567ffffffffffffffff811115612a0c57600080fd5b612a188a828b0161294a565b989b979a50959850939692959293505050565b803563ffffffff81168114612a3f57600080fd5b919050565b600080600060408486031215612a5957600080fd5b612a6284612a2b565b9250602084013567ffffffffffffffff811115612a7e57600080fd5b612a8a8682870161294a565b9497909650939450505050565b600080600080600060808688031215612aaf57600080fd5b8535612aba81612925565b94506020860135612aca81612925565b935060408601359250606086013567ffffffffffffffff811115612aed57600080fd5b612af98882890161294a565b969995985093965092949392505050565b600080600080600080600060c0888a031215612b2557600080fd5b8735612b3081612925565b96506020880135612b4081612925565b95506040880135612b5081612925565b945060608801359350612b6560808901612a2b565b925060a088013567ffffffffffffffff811115612a0c57600080fd5b60005b83811015612b9c578181015183820152602001612b84565b838111156105b25750506000910152565b60008151808452612bc5816020860160208601612b81565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061219a6020830184612bad565b60008060008060008060a08789031215612c2357600080fd5b8635612c2e81612925565b95506020870135612c3e81612925565b945060408701359350612c5360608801612a2b565b9250608087013567ffffffffffffffff811115612c6f57600080fd5b612c7b89828a0161294a565b979a9699509497509295939492505050565b60008060408385031215612ca057600080fd5b8235612cab81612925565b91506020830135612cbb81612925565b809150509250929050565b60008060008060608587031215612cdc57600080fd5b8435612ce781612925565b9350612cf560208601612a2b565b9250604085013567ffffffffffffffff811115612d1157600080fd5b612d1d8782880161294a565b95989497509550505050565b600080600060608486031215612d3e57600080fd5b8335612d4981612925565b92506020840135612d5981612925565b91506040840135612d6981612925565b809150509250925092565b600060208284031215612d8657600080fd5b815161219a81612925565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612dd257612dd2612d91565b500390565b600060208284031215612de957600080fd5b8151801515811461219a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612e386080830184612bad565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612e716060830185612bad565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612ebc6060830184612bad565b95945050505050565b8281526040602082015260006126cc6040830184612bad565b60008219821115612ef157612ef1612d91565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612f4560c0830184612bad565b98975050505050505050565b60008060408385031215612f6457600080fd5b8251612f6f81612925565b602084015190925060ff81168114612cbb57600080fd5b60008251612f98818460208701612b81565b919091019291505056fea164736f6c634300080f000a",
       "initialized": true,
       "kind": "Create",
       "newBalance": 0,
@@ -5316,7 +5399,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5324,7 +5407,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5332,7 +5415,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5340,7 +5423,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5348,7 +5431,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -5356,7 +5439,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -5364,7 +5447,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5372,7 +5455,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000032"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5380,7 +5463,23 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000032"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
+          "isWrite": false,
+          "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "reverted": false,
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000033"
+        },
+        {
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
+          "isWrite": true,
+          "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "reverted": false,
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000033"
+        },
+        {
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
@@ -5388,7 +5487,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5396,7 +5495,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5404,7 +5503,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000003"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5412,7 +5511,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": true,
           "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5420,7 +5519,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
@@ -5428,7 +5527,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101",
@@ -5457,7 +5556,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5471,7 +5570,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5483,7 +5582,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5497,7 +5596,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5509,7 +5608,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5523,7 +5622,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010",
           "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000010",
@@ -5535,7 +5634,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5549,7 +5648,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010",
           "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000010",
@@ -5561,7 +5660,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -5575,7 +5674,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+          "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -5619,6 +5718,23 @@
       "storageAccesses": [],
       "value": 0
     },
+    {
+      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
+      "account": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
+      "chainInfo": {
+        "chainId": 31337,
+        "forkId": 0
+      },
+      "data": "0x638627e586f5e36fe67a77519503a7c6da22f92b150d3c6055fd40bdcfe9ffd160806040523480156200001157600080fd5b506200001f60008062000025565b62000234565b600054610100900460ff1615808015620000465750600054600160ff909116105b8062000076575062000063306200018a60201b62000b141760201c565b15801562000076575060005460ff166001145b620000df5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000103576000805461ff0019166101001790555b603280546001600160a01b0319166001600160a01b0384161790556200013e8373420000000000000000000000000000000000001462000199565b801562000185576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054610100900460ff16620002065760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d6565b600180546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b6113e980620002446000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a",
+      "deployedCode": "0x",
+      "initialized": true,
+      "kind": "Call",
+      "newBalance": 0,
+      "oldBalance": 0,
+      "reverted": false,
+      "storageAccesses": [],
+      "value": 0
+    },
     {
       "accessor": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
       "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586",
@@ -5959,7 +6075,33 @@
           "newValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc",
           "previousValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc",
           "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000017"
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000018"
+        }
+      ],
+      "value": 0
+    },
+    {
+      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
+      "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c",
+      "chainInfo": {
+        "chainId": 31337,
+        "forkId": 0
+      },
+      "data": "0xf77a09bd",
+      "deployedCode": "0x",
+      "initialized": true,
+      "kind": "StaticCall",
+      "newBalance": 0,
+      "oldBalance": 0,
+      "reverted": false,
+      "storageAccesses": [
+        {
+          "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c",
+          "isWrite": false,
+          "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "reverted": false,
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000047"
         }
       ],
       "value": 0
@@ -5985,7 +6127,7 @@
           "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000000d"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000000e"
         }
       ],
       "value": 0
@@ -6011,7 +6153,7 @@
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000834",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000834",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000002b"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000002d"
         }
       ],
       "value": 0
@@ -6037,7 +6179,7 @@
           "newValue": "0x00000000000000000000000000000000000000000000000000000000000f4240",
           "previousValue": "0x00000000000000000000000000000000000000000000000000000000000f4240",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000002c"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000002e"
         }
       ],
       "value": 0
@@ -6063,7 +6205,7 @@
           "newValue": "0x00000000000000000000000000000000000000000000000000000000017d7840",
           "previousValue": "0x00000000000000000000000000000000000000000000000000000000017d7840",
           "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000029"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000002c"
         }
       ],
       "value": 0
@@ -6089,7 +6231,7 @@
           "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000015"
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000016"
         }
       ],
       "value": 0
@@ -6115,19 +6257,19 @@
           "newValue": "0x000000000000000000000000ff00000000000000000000000000000000000000",
           "previousValue": "0x000000000000000000000000ff00000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000016"
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000017"
         }
       ],
       "value": 0
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000003049623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002640bbb79680000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000003249623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002844c1e843d0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -6136,7 +6278,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
@@ -6153,7 +6295,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000003049623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002640bbb79680000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000003249623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002844c1e843d0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "DelegateCall",
@@ -6162,7 +6304,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002",
@@ -6170,7 +6312,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002",
@@ -6178,7 +6320,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000003",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002",
@@ -6186,7 +6328,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -6194,7 +6336,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -6202,7 +6344,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -6213,13 +6355,13 @@
       "value": 0
     },
     {
-      "accessor": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x9623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002640bbb79680000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x9623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002844c1e843d0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -6230,8 +6372,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -6253,7 +6395,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x4f1ef286000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002640bbb79680000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x4f1ef286000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002844c1e843d0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -6272,7 +6414,7 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": true,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
@@ -6282,12 +6424,12 @@
     },
     {
       "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x0bbb79680000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x4c1e843d0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "DelegateCall",
@@ -6490,10 +6632,10 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": true,
-          "newValue": "0x0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb",
+          "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0xe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871815"
+          "slot": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906"
         },
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
@@ -6596,8 +6738,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -6606,7 +6748,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -6639,8 +6781,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -6649,7 +6791,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -6694,7 +6836,7 @@
           "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000000d"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000000e"
         }
       ],
       "value": 0
@@ -6717,8 +6859,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -6727,7 +6869,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -6772,7 +6914,7 @@
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000834",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000834",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000002b"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000002d"
         }
       ],
       "value": 0
@@ -6795,8 +6937,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -6805,7 +6947,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -6850,7 +6992,7 @@
           "newValue": "0x00000000000000000000000000000000000000000000000000000000000f4240",
           "previousValue": "0x00000000000000000000000000000000000000000000000000000000000f4240",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000002c"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000002e"
         }
       ],
       "value": 0
@@ -6873,8 +7015,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -6883,7 +7025,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -6928,7 +7070,7 @@
           "newValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc",
           "previousValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc",
           "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000017"
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000018"
         }
       ],
       "value": 0
@@ -6951,8 +7093,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -6961,7 +7103,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -7006,7 +7148,7 @@
           "newValue": "0x00000000000000000000000000000000000000000000000000000000017d7840",
           "previousValue": "0x00000000000000000000000000000000000000000000000000000000017d7840",
           "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000029"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000002c"
         }
       ],
       "value": 0
@@ -7029,8 +7171,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -7039,7 +7181,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -7084,7 +7226,7 @@
           "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000015"
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000016"
         }
       ],
       "value": 0
@@ -7107,8 +7249,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -7117,7 +7259,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -7162,7 +7304,7 @@
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000039"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000003c"
         }
       ],
       "value": 0
@@ -7185,8 +7327,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -7195,7 +7337,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -7240,7 +7382,7 @@
           "newValue": "0x000000000000000000000000ff00000000000000000000000000000000000000",
           "previousValue": "0x000000000000000000000000ff00000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000016"
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000017"
         }
       ],
       "value": 0
@@ -7263,8 +7405,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -7273,7 +7415,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -7315,8 +7457,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -7325,7 +7467,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -7367,8 +7509,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -7377,7 +7519,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -7419,8 +7561,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -7429,7 +7571,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -7460,7 +7602,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x4d9f1559",
+      "data": "0xf2b4e617",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "StaticCall",
@@ -7471,8 +7613,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -7481,12 +7623,12 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x4d9f1559",
+      "data": "0xf2b4e617",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "DelegateCall",
@@ -7497,10 +7639,10 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb",
-          "previousValue": "0x0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb",
+          "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0xe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871815"
+          "slot": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906"
         }
       ],
       "value": 0
@@ -7523,8 +7665,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -7533,7 +7675,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -7575,8 +7717,8 @@
         {
           "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4",
           "isWrite": false,
-          "newValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
-          "previousValue": "0x000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2",
+          "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
+          "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -7585,7 +7727,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0xffbA8944650e26653823658d76A122946F27e2f2",
+      "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -7671,7 +7813,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -7685,7 +7827,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
@@ -7711,7 +7853,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000003",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003",
@@ -7719,7 +7861,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000003",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003",
@@ -7727,7 +7869,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003",
@@ -7735,7 +7877,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -7743,7 +7885,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -7751,7 +7893,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -7762,7 +7904,7 @@
       "value": 0
     },
     {
-      "accessor": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
       "chainInfo": {
         "chainId": 31337,
@@ -7779,8 +7921,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -7831,12 +7973,12 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc95500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -7845,7 +7987,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
@@ -7862,7 +8004,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc95500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "DelegateCall",
@@ -7871,7 +8013,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000004",
@@ -7879,7 +8021,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000004",
@@ -7887,7 +8029,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000005",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000004",
@@ -7895,7 +8037,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -7903,7 +8045,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -7911,7 +8053,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -7922,13 +8064,13 @@
       "value": 0
     },
     {
-      "accessor": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x9623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc95500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000",
+      "data": "0x9623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e400000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -7939,8 +8081,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -7955,8 +8097,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -7995,7 +8137,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x9b0b0fda360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
+      "data": "0x9b0b0fda360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -8014,7 +8156,7 @@
         {
           "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
           "isWrite": true,
-          "newValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
+          "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
@@ -8029,7 +8171,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x485cc95500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809",
+      "data": "0xc0c53b8b00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -8092,8 +8234,8 @@
         {
           "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
-          "previousValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
+          "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
+          "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -8102,12 +8244,12 @@
     },
     {
       "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x485cc95500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809",
+      "data": "0xc0c53b8b00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "DelegateCall",
@@ -8179,6 +8321,22 @@
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000032"
         },
+        {
+          "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
+          "isWrite": false,
+          "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "reverted": false,
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000033"
+        },
+        {
+          "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
+          "isWrite": true,
+          "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4",
+          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "reverted": false,
+          "slot": "0x0000000000000000000000000000000000000000000000000000000000000033"
+        },
         {
           "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
           "isWrite": false,
@@ -8308,8 +8466,8 @@
         {
           "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
-          "previousValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
+          "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
+          "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -8318,7 +8476,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -8403,8 +8561,8 @@
         {
           "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
-          "previousValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
+          "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
+          "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -8413,7 +8571,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -8507,8 +8665,8 @@
         {
           "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
-          "previousValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
+          "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
+          "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -8517,7 +8675,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -8611,8 +8769,8 @@
         {
           "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
-          "previousValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
+          "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
+          "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -8621,7 +8779,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -8715,8 +8873,8 @@
         {
           "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
-          "previousValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
+          "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
+          "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -8725,7 +8883,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -8819,8 +8977,8 @@
         {
           "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
-          "previousValue": "0x0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c",
+          "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
+          "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -8829,7 +8987,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x0Da314776B267D898dEE57F6Ede357ae28b3b83c",
+      "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -8889,7 +9047,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -8903,7 +9061,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
@@ -8929,7 +9087,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000005",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000005",
@@ -8937,7 +9095,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000005",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000005",
@@ -8945,7 +9103,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000005",
@@ -8953,7 +9111,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -8961,7 +9119,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -8969,7 +9127,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -8980,7 +9138,7 @@
       "value": 0
     },
     {
-      "accessor": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
       "chainInfo": {
         "chainId": 31337,
@@ -8997,8 +9155,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -9550,7 +9708,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -9564,7 +9722,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
@@ -9590,7 +9748,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006",
@@ -9598,7 +9756,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006",
@@ -9606,7 +9764,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000007",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006",
@@ -9614,7 +9772,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -9622,7 +9780,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -9630,7 +9788,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -9641,7 +9799,7 @@
       "value": 0
     },
     {
-      "accessor": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
       "chainInfo": {
         "chainId": 31337,
@@ -9658,8 +9816,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -9715,7 +9873,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x238181ae00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
+      "data": "0x238181ae000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "StaticCall",
@@ -9729,7 +9887,7 @@
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0xa84149e805fd07fd65e6292517ce28bc2d9d17991b87a6d9c16e7c7cb921ab16"
+          "slot": "0x130727a1e38e003a4a83c345938c34d2eb51450595da938f77fdc3d81ddefae9"
         },
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
@@ -9737,14 +9895,14 @@
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
-          "slot": "0xa84149e805fd07fd65e6292517ce28bc2d9d17991b87a6d9c16e7c7cb921ab16"
+          "slot": "0x130727a1e38e003a4a83c345938c34d2eb51450595da938f77fdc3d81ddefae9"
         }
       ],
       "value": 0
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -9758,7 +9916,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
@@ -9784,7 +9942,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000007",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000007",
@@ -9792,7 +9950,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000007",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000007",
@@ -9800,7 +9958,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000008",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000007",
@@ -9808,7 +9966,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -9816,7 +9974,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -9824,7 +9982,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -9835,7 +9993,7 @@
       "value": 0
     },
     {
-      "accessor": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
       "chainInfo": {
         "chainId": 31337,
@@ -9852,8 +10010,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -9920,12 +10078,12 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd9900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -9934,7 +10092,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
@@ -9951,7 +10109,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd9900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "DelegateCall",
@@ -9960,7 +10118,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000008",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000008",
@@ -9968,7 +10126,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000008",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000008",
@@ -9976,7 +10134,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000009",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000008",
@@ -9984,7 +10142,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -9992,7 +10150,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -10000,7 +10158,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -10011,13 +10169,13 @@
       "value": 0
     },
     {
-      "accessor": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x9623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc955000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d9000000000000000000000000000000000000000000000000000000000",
+      "data": "0x9623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd9900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e400000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -10028,8 +10186,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -10044,8 +10202,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -10116,7 +10274,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x9b2ea4bd000000000000000000000000000000000000000000000000000000000000004000000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000",
+      "data": "0x9b2ea4bd0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -10143,7 +10301,7 @@
         {
           "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3",
           "isWrite": true,
-          "newValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
+          "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
           "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"
@@ -10158,7 +10316,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x485cc955000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d90",
+      "data": "0xc0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -10203,8 +10361,8 @@
         {
           "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3",
           "isWrite": false,
-          "newValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
-          "previousValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
+          "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
+          "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
           "reverted": false,
           "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"
         }
@@ -10213,12 +10371,12 @@
     },
     {
       "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x485cc955000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d90",
+      "data": "0xc0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "DelegateCall",
@@ -10306,6 +10464,22 @@
           "reverted": false,
           "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc"
         },
+        {
+          "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D",
+          "isWrite": false,
+          "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "reverted": false,
+          "slot": "0x00000000000000000000000000000000000000000000000000000000000000fd"
+        },
+        {
+          "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D",
+          "isWrite": true,
+          "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4",
+          "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
+          "reverted": false,
+          "slot": "0x00000000000000000000000000000000000000000000000000000000000000fd"
+        },
         {
           "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D",
           "isWrite": false,
@@ -10425,8 +10599,8 @@
         {
           "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3",
           "isWrite": false,
-          "newValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
-          "previousValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
+          "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
+          "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
           "reverted": false,
           "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"
         }
@@ -10435,7 +10609,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -10502,8 +10676,8 @@
         {
           "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3",
           "isWrite": false,
-          "newValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
-          "previousValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
+          "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
+          "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
           "reverted": false,
           "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"
         }
@@ -10512,7 +10686,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -10588,8 +10762,8 @@
         {
           "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3",
           "isWrite": false,
-          "newValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
-          "previousValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
+          "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
+          "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
           "reverted": false,
           "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"
         }
@@ -10598,7 +10772,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -10674,8 +10848,8 @@
         {
           "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3",
           "isWrite": false,
-          "newValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
-          "previousValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
+          "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
+          "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
           "reverted": false,
           "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"
         }
@@ -10684,7 +10858,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -10760,8 +10934,8 @@
         {
           "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3",
           "isWrite": false,
-          "newValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
-          "previousValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
+          "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
+          "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
           "reverted": false,
           "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"
         }
@@ -10770,7 +10944,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -10846,8 +11020,8 @@
         {
           "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3",
           "isWrite": false,
-          "newValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
-          "previousValue": "0x00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f",
+          "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
+          "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99",
           "reverted": false,
           "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"
         }
@@ -10856,7 +11030,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x71fA82Ea96672797954C28032b337aA40AAFC99f",
+      "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -10916,12 +11090,12 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c8200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -10930,7 +11104,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
           "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1",
@@ -10947,7 +11121,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
+      "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c8200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "DelegateCall",
@@ -10956,7 +11130,7 @@
       "reverted": false,
       "storageAccesses": [
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000009",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000009",
@@ -10964,7 +11138,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000009",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000009",
@@ -10972,7 +11146,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": true,
           "newValue": "0x000000000000000000000000000000000000000000000000000000000000000a",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000009",
@@ -10980,7 +11154,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -10988,7 +11162,7 @@
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000004"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001",
@@ -10996,7 +11170,7 @@
           "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32"
         },
         {
-          "account": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+          "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
           "isWrite": false,
           "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -11007,13 +11181,13 @@
       "value": 0
     },
     {
-      "accessor": "0x2601573C28B77dea6C8B73385c25024A28a00C3F",
+      "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02",
       "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x9623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000",
+      "data": "0x9623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c8200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -11024,8 +11198,8 @@
         {
           "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
-          "previousValue": "0x0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f",
+          "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
+          "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02",
           "reverted": false,
           "slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
         },
@@ -11047,7 +11221,7 @@
         "chainId": 31337,
         "forkId": 0
       },
-      "data": "0x4f1ef2860000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000",
+      "data": "0x4f1ef286000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c8200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000",
       "deployedCode": "0x",
       "initialized": true,
       "kind": "Call",
@@ -11066,7 +11240,7 @@
         {
           "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
           "isWrite": true,
-          "newValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
+          "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
           "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
@@ -11076,7 +11250,7 @@
     },
     {
       "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -11270,8 +11444,8 @@
         {
           "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "previousValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
+          "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
+          "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -11280,7 +11454,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -11316,7 +11490,7 @@
           "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
           "reverted": false,
-          "slot": "0x000000000000000000000000000000000000000000000000000000000000000e"
+          "slot": "0x000000000000000000000000000000000000000000000000000000000000000f"
         }
       ],
       "value": 0
@@ -11338,58 +11512,6 @@
       "storageAccesses": [],
       "value": 0
     },
-    {
-      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
-      "chainInfo": {
-        "chainId": 31337,
-        "forkId": 0
-      },
-      "data": "0x001c2ff6",
-      "deployedCode": "0x",
-      "initialized": true,
-      "kind": "StaticCall",
-      "newBalance": 0,
-      "oldBalance": 0,
-      "reverted": false,
-      "storageAccesses": [
-        {
-          "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
-          "isWrite": false,
-          "newValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "previousValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "reverted": false,
-          "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
-        }
-      ],
-      "value": 0
-    },
-    {
-      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
-      "chainInfo": {
-        "chainId": 31337,
-        "forkId": 0
-      },
-      "data": "0x001c2ff6",
-      "deployedCode": "0x",
-      "initialized": true,
-      "kind": "DelegateCall",
-      "newBalance": 0,
-      "oldBalance": 0,
-      "reverted": false,
-      "storageAccesses": [
-        {
-          "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
-          "isWrite": false,
-          "newValue": "0x0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb",
-          "previousValue": "0x0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb",
-          "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000036"
-        }
-      ],
-      "value": 0
-    },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
       "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
@@ -11408,8 +11530,8 @@
         {
           "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "previousValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
+          "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
+          "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -11418,7 +11540,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -11442,58 +11564,6 @@
       ],
       "value": 0
     },
-    {
-      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
-      "chainInfo": {
-        "chainId": 31337,
-        "forkId": 0
-      },
-      "data": "0xf0498750",
-      "deployedCode": "0x",
-      "initialized": true,
-      "kind": "StaticCall",
-      "newBalance": 0,
-      "oldBalance": 0,
-      "reverted": false,
-      "storageAccesses": [
-        {
-          "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
-          "isWrite": false,
-          "newValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "previousValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "reverted": false,
-          "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
-        }
-      ],
-      "value": 0
-    },
-    {
-      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
-      "chainInfo": {
-        "chainId": 31337,
-        "forkId": 0
-      },
-      "data": "0xf0498750",
-      "deployedCode": "0x",
-      "initialized": true,
-      "kind": "DelegateCall",
-      "newBalance": 0,
-      "oldBalance": 0,
-      "reverted": false,
-      "storageAccesses": [
-        {
-          "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
-          "isWrite": false,
-          "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4",
-          "previousValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4",
-          "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000037"
-        }
-      ],
-      "value": 0
-    },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
       "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
@@ -11512,8 +11582,8 @@
         {
           "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "previousValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
+          "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
+          "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -11522,7 +11592,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -11546,110 +11616,6 @@
       ],
       "value": 0
     },
-    {
-      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
-      "chainInfo": {
-        "chainId": 31337,
-        "forkId": 0
-      },
-      "data": "0x724c184c",
-      "deployedCode": "0x",
-      "initialized": true,
-      "kind": "StaticCall",
-      "newBalance": 0,
-      "oldBalance": 0,
-      "reverted": false,
-      "storageAccesses": [
-        {
-          "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
-          "isWrite": false,
-          "newValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "previousValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "reverted": false,
-          "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
-        }
-      ],
-      "value": 0
-    },
-    {
-      "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
-      "chainInfo": {
-        "chainId": 31337,
-        "forkId": 0
-      },
-      "data": "0x724c184c",
-      "deployedCode": "0x",
-      "initialized": true,
-      "kind": "DelegateCall",
-      "newBalance": 0,
-      "oldBalance": 0,
-      "reverted": false,
-      "storageAccesses": [
-        {
-          "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
-          "isWrite": false,
-          "newValue": "0x0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900",
-          "previousValue": "0x0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900",
-          "reverted": false,
-          "slot": "0x0000000000000000000000000000000000000000000000000000000000000035"
-        }
-      ],
-      "value": 0
-    },
-    {
-      "accessor": "0x978e3286EB805934215a88694d80b09aDed68D90",
-      "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809",
-      "chainInfo": {
-        "chainId": 31337,
-        "forkId": 0
-      },
-      "data": "0x452a9320",
-      "deployedCode": "0x",
-      "initialized": true,
-      "kind": "StaticCall",
-      "newBalance": 0,
-      "oldBalance": 0,
-      "reverted": false,
-      "storageAccesses": [
-        {
-          "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809",
-          "isWrite": false,
-          "newValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a",
-          "previousValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a",
-          "reverted": false,
-          "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
-        }
-      ],
-      "value": 0
-    },
-    {
-      "accessor": "0x978e3286EB805934215a88694d80b09aDed68D90",
-      "account": "0x068E44eB31e111028c41598E4535be7468674D0A",
-      "chainInfo": {
-        "chainId": 31337,
-        "forkId": 0
-      },
-      "data": "0x452a9320",
-      "deployedCode": "0x",
-      "initialized": true,
-      "kind": "DelegateCall",
-      "newBalance": 0,
-      "oldBalance": 0,
-      "reverted": false,
-      "storageAccesses": [
-        {
-          "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809",
-          "isWrite": false,
-          "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
-          "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc",
-          "reverted": false,
-          "slot": "0xd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe68"
-        }
-      ],
-      "value": 0
-    },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
       "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
@@ -11668,8 +11634,8 @@
         {
           "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "previousValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
+          "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
+          "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -11678,7 +11644,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -11772,8 +11738,8 @@
         {
           "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "previousValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
+          "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
+          "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -11782,7 +11748,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -11876,8 +11842,8 @@
         {
           "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "previousValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
+          "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
+          "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -11886,7 +11852,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
@@ -11980,8 +11946,8 @@
         {
           "account": "0x978e3286EB805934215a88694d80b09aDed68D90",
           "isWrite": false,
-          "newValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
-          "previousValue": "0x0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4",
+          "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
+          "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82",
           "reverted": false,
           "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
         }
@@ -11990,7 +11956,7 @@
     },
     {
       "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38",
-      "account": "0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4",
+      "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82",
       "chainInfo": {
         "chainId": 31337,
         "forkId": 0
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/AnchorStateRegistry.json b/packages/contracts-bedrock/snapshots/storageLayout/AnchorStateRegistry.json
new file mode 100644
index 000000000000..5da4030ae426
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/storageLayout/AnchorStateRegistry.json
@@ -0,0 +1,23 @@
+[
+  {
+    "bytes": "1",
+    "label": "_initialized",
+    "offset": 0,
+    "slot": "0",
+    "type": "uint8"
+  },
+  {
+    "bytes": "1",
+    "label": "_initializing",
+    "offset": 1,
+    "slot": "0",
+    "type": "bool"
+  },
+  {
+    "bytes": "32",
+    "label": "anchors",
+    "offset": 0,
+    "slot": "1",
+    "type": "mapping(GameType => struct OutputRoot)"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/BlockOracle.json b/packages/contracts-bedrock/snapshots/storageLayout/BlockOracle.json
deleted file mode 100644
index e897a9201ea8..000000000000
--- a/packages/contracts-bedrock/snapshots/storageLayout/BlockOracle.json
+++ /dev/null
@@ -1,9 +0,0 @@
-[
-  {
-    "bytes": "32",
-    "label": "blocks",
-    "offset": 0,
-    "slot": "0",
-    "type": "mapping(uint256 => struct BlockOracle.BlockInfo)"
-  }
-]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/CheckSecrets.json b/packages/contracts-bedrock/snapshots/storageLayout/CheckSecrets.json
new file mode 100644
index 000000000000..accf9c6d643b
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/storageLayout/CheckSecrets.json
@@ -0,0 +1,9 @@
+[
+  {
+    "bytes": "32",
+    "label": "revealedSecrets",
+    "offset": 0,
+    "slot": "0",
+    "type": "mapping(bytes32 => uint256)"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/Clone.json b/packages/contracts-bedrock/snapshots/storageLayout/CrossL2Inbox.json
similarity index 100%
rename from packages/contracts-bedrock/snapshots/storageLayout/Clone.json
rename to packages/contracts-bedrock/snapshots/storageLayout/CrossL2Inbox.json
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/DeputyGuardianModule.json b/packages/contracts-bedrock/snapshots/storageLayout/DeputyGuardianModule.json
new file mode 100644
index 000000000000..0637a088a01e
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/storageLayout/DeputyGuardianModule.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/FaultDisputeGame.json b/packages/contracts-bedrock/snapshots/storageLayout/FaultDisputeGame.json
index 09707776ae09..f87fa588ed9c 100644
--- a/packages/contracts-bedrock/snapshots/storageLayout/FaultDisputeGame.json
+++ b/packages/contracts-bedrock/snapshots/storageLayout/FaultDisputeGame.json
@@ -20,46 +20,74 @@
     "slot": "0",
     "type": "enum GameStatus"
   },
+  {
+    "bytes": "1",
+    "label": "initialized",
+    "offset": 17,
+    "slot": "0",
+    "type": "bool"
+  },
+  {
+    "bytes": "1",
+    "label": "l2BlockNumberChallenged",
+    "offset": 18,
+    "slot": "0",
+    "type": "bool"
+  },
+  {
+    "bytes": "20",
+    "label": "l2BlockNumberChallenger",
+    "offset": 0,
+    "slot": "1",
+    "type": "address"
+  },
   {
     "bytes": "32",
     "label": "claimData",
     "offset": 0,
-    "slot": "1",
+    "slot": "2",
     "type": "struct IFaultDisputeGame.ClaimData[]"
   },
   {
     "bytes": "32",
     "label": "credit",
     "offset": 0,
-    "slot": "2",
+    "slot": "3",
     "type": "mapping(address => uint256)"
   },
   {
     "bytes": "32",
     "label": "claims",
     "offset": 0,
-    "slot": "3",
-    "type": "mapping(ClaimHash => bool)"
+    "slot": "4",
+    "type": "mapping(Hash => bool)"
   },
   {
     "bytes": "32",
     "label": "subgames",
     "offset": 0,
-    "slot": "4",
+    "slot": "5",
     "type": "mapping(uint256 => uint256[])"
   },
   {
-    "bytes": "1",
-    "label": "subgameAtRootResolved",
+    "bytes": "32",
+    "label": "resolvedSubgames",
     "offset": 0,
-    "slot": "5",
-    "type": "bool"
+    "slot": "6",
+    "type": "mapping(uint256 => bool)"
   },
   {
-    "bytes": "1",
-    "label": "initialized",
-    "offset": 1,
-    "slot": "5",
-    "type": "bool"
+    "bytes": "32",
+    "label": "resolutionCheckpoints",
+    "offset": 0,
+    "slot": "7",
+    "type": "mapping(uint256 => struct IFaultDisputeGame.ResolutionCheckpoint)"
+  },
+  {
+    "bytes": "64",
+    "label": "startingOutputRoot",
+    "offset": 0,
+    "slot": "8",
+    "type": "struct OutputRoot"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/GasPriceOracle.json b/packages/contracts-bedrock/snapshots/storageLayout/GasPriceOracle.json
index 9dd2e57a3d14..f5149cb06ce8 100644
--- a/packages/contracts-bedrock/snapshots/storageLayout/GasPriceOracle.json
+++ b/packages/contracts-bedrock/snapshots/storageLayout/GasPriceOracle.json
@@ -5,5 +5,12 @@
     "offset": 0,
     "slot": "0",
     "type": "bool"
+  },
+  {
+    "bytes": "1",
+    "label": "isFjord",
+    "offset": 1,
+    "slot": "0",
+    "type": "bool"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/L1BlockInterop.json b/packages/contracts-bedrock/snapshots/storageLayout/L1BlockInterop.json
new file mode 100644
index 000000000000..14ee2ff9609a
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/storageLayout/L1BlockInterop.json
@@ -0,0 +1,86 @@
+[
+  {
+    "bytes": "8",
+    "label": "number",
+    "offset": 0,
+    "slot": "0",
+    "type": "uint64"
+  },
+  {
+    "bytes": "8",
+    "label": "timestamp",
+    "offset": 8,
+    "slot": "0",
+    "type": "uint64"
+  },
+  {
+    "bytes": "32",
+    "label": "basefee",
+    "offset": 0,
+    "slot": "1",
+    "type": "uint256"
+  },
+  {
+    "bytes": "32",
+    "label": "hash",
+    "offset": 0,
+    "slot": "2",
+    "type": "bytes32"
+  },
+  {
+    "bytes": "8",
+    "label": "sequenceNumber",
+    "offset": 0,
+    "slot": "3",
+    "type": "uint64"
+  },
+  {
+    "bytes": "4",
+    "label": "blobBaseFeeScalar",
+    "offset": 8,
+    "slot": "3",
+    "type": "uint32"
+  },
+  {
+    "bytes": "4",
+    "label": "baseFeeScalar",
+    "offset": 12,
+    "slot": "3",
+    "type": "uint32"
+  },
+  {
+    "bytes": "32",
+    "label": "batcherHash",
+    "offset": 0,
+    "slot": "4",
+    "type": "bytes32"
+  },
+  {
+    "bytes": "32",
+    "label": "l1FeeOverhead",
+    "offset": 0,
+    "slot": "5",
+    "type": "uint256"
+  },
+  {
+    "bytes": "32",
+    "label": "l1FeeScalar",
+    "offset": 0,
+    "slot": "6",
+    "type": "uint256"
+  },
+  {
+    "bytes": "32",
+    "label": "blobBaseFee",
+    "offset": 0,
+    "slot": "7",
+    "type": "uint256"
+  },
+  {
+    "bytes": "64",
+    "label": "dependencySet",
+    "offset": 0,
+    "slot": "8",
+    "type": "struct EnumerableSet.UintSet"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/L1CrossDomainMessenger.json b/packages/contracts-bedrock/snapshots/storageLayout/L1CrossDomainMessenger.json
index cc9b5cfa86fc..5c88be3ca9ae 100644
--- a/packages/contracts-bedrock/snapshots/storageLayout/L1CrossDomainMessenger.json
+++ b/packages/contracts-bedrock/snapshots/storageLayout/L1CrossDomainMessenger.json
@@ -138,5 +138,12 @@
     "offset": 0,
     "slot": "252",
     "type": "contract OptimismPortal"
+  },
+  {
+    "bytes": "20",
+    "label": "systemConfig",
+    "offset": 0,
+    "slot": "253",
+    "type": "contract SystemConfig"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/L1StandardBridge.json b/packages/contracts-bedrock/snapshots/storageLayout/L1StandardBridge.json
index 48ec70c8b508..1ed5eac5d183 100644
--- a/packages/contracts-bedrock/snapshots/storageLayout/L1StandardBridge.json
+++ b/packages/contracts-bedrock/snapshots/storageLayout/L1StandardBridge.json
@@ -61,5 +61,12 @@
     "offset": 0,
     "slot": "50",
     "type": "contract SuperchainConfig"
+  },
+  {
+    "bytes": "20",
+    "label": "systemConfig",
+    "offset": 0,
+    "slot": "51",
+    "type": "contract SystemConfig"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/L2ToL2CrossDomainMessenger.json b/packages/contracts-bedrock/snapshots/storageLayout/L2ToL2CrossDomainMessenger.json
new file mode 100644
index 000000000000..a69c85af7b2a
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/storageLayout/L2ToL2CrossDomainMessenger.json
@@ -0,0 +1,16 @@
+[
+  {
+    "bytes": "32",
+    "label": "successfulMessages",
+    "offset": 0,
+    "slot": "0",
+    "type": "mapping(bytes32 => bool)"
+  },
+  {
+    "bytes": "30",
+    "label": "msgNonce",
+    "offset": 0,
+    "slot": "1",
+    "type": "uint240"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/LegacyERC20ETH.json b/packages/contracts-bedrock/snapshots/storageLayout/LegacyERC20ETH.json
deleted file mode 100644
index 418a98546cf7..000000000000
--- a/packages/contracts-bedrock/snapshots/storageLayout/LegacyERC20ETH.json
+++ /dev/null
@@ -1,37 +0,0 @@
-[
-  {
-    "bytes": "32",
-    "label": "_balances",
-    "offset": 0,
-    "slot": "0",
-    "type": "mapping(address => uint256)"
-  },
-  {
-    "bytes": "32",
-    "label": "_allowances",
-    "offset": 0,
-    "slot": "1",
-    "type": "mapping(address => mapping(address => uint256))"
-  },
-  {
-    "bytes": "32",
-    "label": "_totalSupply",
-    "offset": 0,
-    "slot": "2",
-    "type": "uint256"
-  },
-  {
-    "bytes": "32",
-    "label": "_name",
-    "offset": 0,
-    "slot": "3",
-    "type": "string"
-  },
-  {
-    "bytes": "32",
-    "label": "_symbol",
-    "offset": 0,
-    "slot": "4",
-    "type": "string"
-  }
-]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/LegacyFaultDisputeGame.json b/packages/contracts-bedrock/snapshots/storageLayout/LegacyFaultDisputeGame.json
deleted file mode 100644
index 56aa9cc0b800..000000000000
--- a/packages/contracts-bedrock/snapshots/storageLayout/LegacyFaultDisputeGame.json
+++ /dev/null
@@ -1,58 +0,0 @@
-[
-  {
-    "bytes": "8",
-    "label": "createdAt",
-    "offset": 0,
-    "slot": "0",
-    "type": "Timestamp"
-  },
-  {
-    "bytes": "1",
-    "label": "status",
-    "offset": 8,
-    "slot": "0",
-    "type": "enum GameStatus"
-  },
-  {
-    "bytes": "32",
-    "label": "l1Head",
-    "offset": 0,
-    "slot": "1",
-    "type": "Hash"
-  },
-  {
-    "bytes": "32",
-    "label": "claimData",
-    "offset": 0,
-    "slot": "2",
-    "type": "struct ILegacyFaultDisputeGame.ClaimData[]"
-  },
-  {
-    "bytes": "128",
-    "label": "proposals",
-    "offset": 0,
-    "slot": "3",
-    "type": "struct ILegacyFaultDisputeGame.OutputProposals"
-  },
-  {
-    "bytes": "32",
-    "label": "claims",
-    "offset": 0,
-    "slot": "7",
-    "type": "mapping(ClaimHash => bool)"
-  },
-  {
-    "bytes": "32",
-    "label": "subgames",
-    "offset": 0,
-    "slot": "8",
-    "type": "mapping(uint256 => uint256[])"
-  },
-  {
-    "bytes": "1",
-    "label": "subgameAtRootResolved",
-    "offset": 0,
-    "slot": "9",
-    "type": "bool"
-  }
-]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/LivenessModule.json b/packages/contracts-bedrock/snapshots/storageLayout/LivenessModule.json
index 0637a088a01e..305b77337959 100644
--- a/packages/contracts-bedrock/snapshots/storageLayout/LivenessModule.json
+++ b/packages/contracts-bedrock/snapshots/storageLayout/LivenessModule.json
@@ -1 +1,9 @@
-[]
\ No newline at end of file
+[
+  {
+    "bytes": "1",
+    "label": "ownershipTransferredToFallback",
+    "offset": 0,
+    "slot": "0",
+    "type": "bool"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal.json b/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal.json
index 455fdf358772..6eff1d1a0790 100644
--- a/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal.json
+++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal.json
@@ -75,5 +75,47 @@
     "offset": 0,
     "slot": "55",
     "type": "contract SystemConfig"
+  },
+  {
+    "bytes": "20",
+    "label": "spacer_56_0_20",
+    "offset": 0,
+    "slot": "56",
+    "type": "address"
+  },
+  {
+    "bytes": "32",
+    "label": "spacer_57_0_32",
+    "offset": 0,
+    "slot": "57",
+    "type": "bytes32"
+  },
+  {
+    "bytes": "32",
+    "label": "spacer_58_0_32",
+    "offset": 0,
+    "slot": "58",
+    "type": "bytes32"
+  },
+  {
+    "bytes": "32",
+    "label": "spacer_59_0_32",
+    "offset": 0,
+    "slot": "59",
+    "type": "bytes32"
+  },
+  {
+    "bytes": "32",
+    "label": "spacer_60_0_32",
+    "offset": 0,
+    "slot": "60",
+    "type": "bytes32"
+  },
+  {
+    "bytes": "32",
+    "label": "_balance",
+    "offset": 0,
+    "slot": "61",
+    "type": "uint256"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal2.json b/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal2.json
index c18c6eb5cc2b..ac6f991c9a8e 100644
--- a/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal2.json
+++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal2.json
@@ -88,7 +88,7 @@
     "label": "provenWithdrawals",
     "offset": 0,
     "slot": "57",
-    "type": "mapping(bytes32 => struct OptimismPortal2.ProvenWithdrawal)"
+    "type": "mapping(bytes32 => mapping(address => struct OptimismPortal2.ProvenWithdrawal))"
   },
   {
     "bytes": "32",
@@ -110,5 +110,19 @@
     "offset": 4,
     "slot": "59",
     "type": "uint64"
+  },
+  {
+    "bytes": "32",
+    "label": "proofSubmitters",
+    "offset": 0,
+    "slot": "60",
+    "type": "mapping(bytes32 => address[])"
+  },
+  {
+    "bytes": "32",
+    "label": "spacer_61_0_32",
+    "offset": 0,
+    "slot": "61",
+    "type": "bytes32"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortalInterop.json b/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortalInterop.json
new file mode 100644
index 000000000000..6eff1d1a0790
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortalInterop.json
@@ -0,0 +1,121 @@
+[
+  {
+    "bytes": "1",
+    "label": "_initialized",
+    "offset": 0,
+    "slot": "0",
+    "type": "uint8"
+  },
+  {
+    "bytes": "1",
+    "label": "_initializing",
+    "offset": 1,
+    "slot": "0",
+    "type": "bool"
+  },
+  {
+    "bytes": "32",
+    "label": "params",
+    "offset": 0,
+    "slot": "1",
+    "type": "struct ResourceMetering.ResourceParams"
+  },
+  {
+    "bytes": "1536",
+    "label": "__gap",
+    "offset": 0,
+    "slot": "2",
+    "type": "uint256[48]"
+  },
+  {
+    "bytes": "20",
+    "label": "l2Sender",
+    "offset": 0,
+    "slot": "50",
+    "type": "address"
+  },
+  {
+    "bytes": "32",
+    "label": "finalizedWithdrawals",
+    "offset": 0,
+    "slot": "51",
+    "type": "mapping(bytes32 => bool)"
+  },
+  {
+    "bytes": "32",
+    "label": "provenWithdrawals",
+    "offset": 0,
+    "slot": "52",
+    "type": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal)"
+  },
+  {
+    "bytes": "1",
+    "label": "spacer_53_0_1",
+    "offset": 0,
+    "slot": "53",
+    "type": "bool"
+  },
+  {
+    "bytes": "20",
+    "label": "superchainConfig",
+    "offset": 1,
+    "slot": "53",
+    "type": "contract SuperchainConfig"
+  },
+  {
+    "bytes": "20",
+    "label": "l2Oracle",
+    "offset": 0,
+    "slot": "54",
+    "type": "contract L2OutputOracle"
+  },
+  {
+    "bytes": "20",
+    "label": "systemConfig",
+    "offset": 0,
+    "slot": "55",
+    "type": "contract SystemConfig"
+  },
+  {
+    "bytes": "20",
+    "label": "spacer_56_0_20",
+    "offset": 0,
+    "slot": "56",
+    "type": "address"
+  },
+  {
+    "bytes": "32",
+    "label": "spacer_57_0_32",
+    "offset": 0,
+    "slot": "57",
+    "type": "bytes32"
+  },
+  {
+    "bytes": "32",
+    "label": "spacer_58_0_32",
+    "offset": 0,
+    "slot": "58",
+    "type": "bytes32"
+  },
+  {
+    "bytes": "32",
+    "label": "spacer_59_0_32",
+    "offset": 0,
+    "slot": "59",
+    "type": "bytes32"
+  },
+  {
+    "bytes": "32",
+    "label": "spacer_60_0_32",
+    "offset": 0,
+    "slot": "60",
+    "type": "bytes32"
+  },
+  {
+    "bytes": "32",
+    "label": "_balance",
+    "offset": 0,
+    "slot": "61",
+    "type": "uint256"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/PermissionedDisputeGame.json b/packages/contracts-bedrock/snapshots/storageLayout/PermissionedDisputeGame.json
index 09707776ae09..f87fa588ed9c 100644
--- a/packages/contracts-bedrock/snapshots/storageLayout/PermissionedDisputeGame.json
+++ b/packages/contracts-bedrock/snapshots/storageLayout/PermissionedDisputeGame.json
@@ -20,46 +20,74 @@
     "slot": "0",
     "type": "enum GameStatus"
   },
+  {
+    "bytes": "1",
+    "label": "initialized",
+    "offset": 17,
+    "slot": "0",
+    "type": "bool"
+  },
+  {
+    "bytes": "1",
+    "label": "l2BlockNumberChallenged",
+    "offset": 18,
+    "slot": "0",
+    "type": "bool"
+  },
+  {
+    "bytes": "20",
+    "label": "l2BlockNumberChallenger",
+    "offset": 0,
+    "slot": "1",
+    "type": "address"
+  },
   {
     "bytes": "32",
     "label": "claimData",
     "offset": 0,
-    "slot": "1",
+    "slot": "2",
     "type": "struct IFaultDisputeGame.ClaimData[]"
   },
   {
     "bytes": "32",
     "label": "credit",
     "offset": 0,
-    "slot": "2",
+    "slot": "3",
     "type": "mapping(address => uint256)"
   },
   {
     "bytes": "32",
     "label": "claims",
     "offset": 0,
-    "slot": "3",
-    "type": "mapping(ClaimHash => bool)"
+    "slot": "4",
+    "type": "mapping(Hash => bool)"
   },
   {
     "bytes": "32",
     "label": "subgames",
     "offset": 0,
-    "slot": "4",
+    "slot": "5",
     "type": "mapping(uint256 => uint256[])"
   },
   {
-    "bytes": "1",
-    "label": "subgameAtRootResolved",
+    "bytes": "32",
+    "label": "resolvedSubgames",
     "offset": 0,
-    "slot": "5",
-    "type": "bool"
+    "slot": "6",
+    "type": "mapping(uint256 => bool)"
   },
   {
-    "bytes": "1",
-    "label": "initialized",
-    "offset": 1,
-    "slot": "5",
-    "type": "bool"
+    "bytes": "32",
+    "label": "resolutionCheckpoints",
+    "offset": 0,
+    "slot": "7",
+    "type": "mapping(uint256 => struct IFaultDisputeGame.ResolutionCheckpoint)"
+  },
+  {
+    "bytes": "64",
+    "label": "startingOutputRoot",
+    "offset": 0,
+    "slot": "8",
+    "type": "struct OutputRoot"
   }
 ]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/SystemConfig.json b/packages/contracts-bedrock/snapshots/storageLayout/SystemConfig.json
index f9f63083c274..648245156248 100644
--- a/packages/contracts-bedrock/snapshots/storageLayout/SystemConfig.json
+++ b/packages/contracts-bedrock/snapshots/storageLayout/SystemConfig.json
@@ -62,6 +62,20 @@
     "slot": "104",
     "type": "uint64"
   },
+  {
+    "bytes": "4",
+    "label": "basefeeScalar",
+    "offset": 8,
+    "slot": "104",
+    "type": "uint32"
+  },
+  {
+    "bytes": "4",
+    "label": "blobbasefeeScalar",
+    "offset": 12,
+    "slot": "104",
+    "type": "uint32"
+  },
   {
     "bytes": "32",
     "label": "_resourceConfig",
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/SystemConfigInterop.json b/packages/contracts-bedrock/snapshots/storageLayout/SystemConfigInterop.json
new file mode 100644
index 000000000000..648245156248
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/storageLayout/SystemConfigInterop.json
@@ -0,0 +1,86 @@
+[
+  {
+    "bytes": "1",
+    "label": "_initialized",
+    "offset": 0,
+    "slot": "0",
+    "type": "uint8"
+  },
+  {
+    "bytes": "1",
+    "label": "_initializing",
+    "offset": 1,
+    "slot": "0",
+    "type": "bool"
+  },
+  {
+    "bytes": "1600",
+    "label": "__gap",
+    "offset": 0,
+    "slot": "1",
+    "type": "uint256[50]"
+  },
+  {
+    "bytes": "20",
+    "label": "_owner",
+    "offset": 0,
+    "slot": "51",
+    "type": "address"
+  },
+  {
+    "bytes": "1568",
+    "label": "__gap",
+    "offset": 0,
+    "slot": "52",
+    "type": "uint256[49]"
+  },
+  {
+    "bytes": "32",
+    "label": "overhead",
+    "offset": 0,
+    "slot": "101",
+    "type": "uint256"
+  },
+  {
+    "bytes": "32",
+    "label": "scalar",
+    "offset": 0,
+    "slot": "102",
+    "type": "uint256"
+  },
+  {
+    "bytes": "32",
+    "label": "batcherHash",
+    "offset": 0,
+    "slot": "103",
+    "type": "bytes32"
+  },
+  {
+    "bytes": "8",
+    "label": "gasLimit",
+    "offset": 0,
+    "slot": "104",
+    "type": "uint64"
+  },
+  {
+    "bytes": "4",
+    "label": "basefeeScalar",
+    "offset": 8,
+    "slot": "104",
+    "type": "uint32"
+  },
+  {
+    "bytes": "4",
+    "label": "blobbasefeeScalar",
+    "offset": 12,
+    "slot": "104",
+    "type": "uint32"
+  },
+  {
+    "bytes": "32",
+    "label": "_resourceConfig",
+    "offset": 0,
+    "slot": "105",
+    "type": "struct ResourceMetering.ResourceConfig"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/TransientReentrancyAware.json b/packages/contracts-bedrock/snapshots/storageLayout/TransientReentrancyAware.json
new file mode 100644
index 000000000000..0637a088a01e
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/storageLayout/TransientReentrancyAware.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/WETH.json b/packages/contracts-bedrock/snapshots/storageLayout/WETH.json
new file mode 100644
index 000000000000..ac5f38a75a04
--- /dev/null
+++ b/packages/contracts-bedrock/snapshots/storageLayout/WETH.json
@@ -0,0 +1,16 @@
+[
+  {
+    "bytes": "32",
+    "label": "balanceOf",
+    "offset": 0,
+    "slot": "0",
+    "type": "mapping(address => uint256)"
+  },
+  {
+    "bytes": "32",
+    "label": "allowance",
+    "offset": 0,
+    "slot": "1",
+    "type": "mapping(address => mapping(address => uint256))"
+  }
+]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/snapshots/storageLayout/WETH9.json b/packages/contracts-bedrock/snapshots/storageLayout/WETH9.json
deleted file mode 100644
index ae4f958c6d32..000000000000
--- a/packages/contracts-bedrock/snapshots/storageLayout/WETH9.json
+++ /dev/null
@@ -1,37 +0,0 @@
-[
-  {
-    "bytes": "32",
-    "label": "name",
-    "offset": 0,
-    "slot": "0",
-    "type": "string"
-  },
-  {
-    "bytes": "32",
-    "label": "symbol",
-    "offset": 0,
-    "slot": "1",
-    "type": "string"
-  },
-  {
-    "bytes": "1",
-    "label": "decimals",
-    "offset": 0,
-    "slot": "2",
-    "type": "uint8"
-  },
-  {
-    "bytes": "32",
-    "label": "balanceOf",
-    "offset": 0,
-    "slot": "3",
-    "type": "mapping(address => uint256)"
-  },
-  {
-    "bytes": "32",
-    "label": "allowance",
-    "offset": 0,
-    "slot": "4",
-    "type": "mapping(address => mapping(address => uint256))"
-  }
-]
\ No newline at end of file
diff --git a/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol
index e9840fef55dc..4aaf2bd31156 100644
--- a/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol
+++ b/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol
@@ -6,6 +6,7 @@ import { OptimismPortal } from "src/L1/OptimismPortal.sol";
 import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
 import { ISemver } from "src/universal/ISemver.sol";
 import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
+import { SystemConfig } from "src/L1/SystemConfig.sol";
 
 /// @custom:proxied
 /// @title L1CrossDomainMessenger
@@ -20,24 +21,45 @@ contract L1CrossDomainMessenger is CrossDomainMessenger, ISemver {
     /// @custom:network-specific
     OptimismPortal public portal;
 
+    /// @notice Address of the SystemConfig contract.
+    SystemConfig public systemConfig;
+
     /// @notice Semantic version.
-    /// @custom:semver 2.3.0
-    string public constant version = "2.3.0";
+    /// @custom:semver 2.4.0
+    string public constant version = "2.4.0";
 
     /// @notice Constructs the L1CrossDomainMessenger contract.
     constructor() CrossDomainMessenger() {
-        initialize({ _superchainConfig: SuperchainConfig(address(0)), _portal: OptimismPortal(payable(address(0))) });
+        initialize({
+            _superchainConfig: SuperchainConfig(address(0)),
+            _portal: OptimismPortal(payable(address(0))),
+            _systemConfig: SystemConfig(address(0))
+        });
     }
 
     /// @notice Initializes the contract.
     /// @param _superchainConfig Contract of the SuperchainConfig contract on this network.
     /// @param _portal Contract of the OptimismPortal contract on this network.
-    function initialize(SuperchainConfig _superchainConfig, OptimismPortal _portal) public initializer {
+    /// @param _systemConfig Contract of the SystemConfig contract on this network.
+    function initialize(
+        SuperchainConfig _superchainConfig,
+        OptimismPortal _portal,
+        SystemConfig _systemConfig
+    )
+        public
+        initializer
+    {
         superchainConfig = _superchainConfig;
         portal = _portal;
+        systemConfig = _systemConfig;
         __CrossDomainMessenger_init({ _otherMessenger: CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER) });
     }
 
+    /// @inheritdoc CrossDomainMessenger
+    function gasPayingToken() internal view override returns (address _addr, uint8 _decimals) {
+        (_addr, _decimals) = systemConfig.gasPayingToken();
+    }
+
     /// @notice Getter function for the OptimismPortal contract on this chain.
     ///         Public getter is legacy and will be removed in the future. Use `portal()` instead.
     /// @return Contract of the OptimismPortal on this chain.
diff --git a/packages/contracts-bedrock/src/L1/L1StandardBridge.sol b/packages/contracts-bedrock/src/L1/L1StandardBridge.sol
index 9f399999b5f8..757c140c56e4 100644
--- a/packages/contracts-bedrock/src/L1/L1StandardBridge.sol
+++ b/packages/contracts-bedrock/src/L1/L1StandardBridge.sol
@@ -6,7 +6,8 @@ import { StandardBridge } from "src/universal/StandardBridge.sol";
 import { ISemver } from "src/universal/ISemver.sol";
 import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
 import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
-import { Constants } from "src/libraries/Constants.sol";
+import { OptimismPortal } from "src/L1/OptimismPortal.sol";
+import { SystemConfig } from "src/L1/SystemConfig.sol";
 
 /// @custom:proxied
 /// @title L1StandardBridge
@@ -70,22 +71,37 @@ contract L1StandardBridge is StandardBridge, ISemver {
     );
 
     /// @notice Semantic version.
-    /// @custom:semver 2.1.0
-    string public constant version = "2.1.0";
+    /// @custom:semver 2.2.0
+    string public constant version = "2.2.0";
 
     /// @notice Address of the SuperchainConfig contract.
     SuperchainConfig public superchainConfig;
 
+    /// @notice Address of the SystemConfig contract.
+    SystemConfig public systemConfig;
+
     /// @notice Constructs the L1StandardBridge contract.
     constructor() StandardBridge() {
-        initialize({ _messenger: CrossDomainMessenger(address(0)), _superchainConfig: SuperchainConfig(address(0)) });
+        initialize({
+            _messenger: CrossDomainMessenger(address(0)),
+            _superchainConfig: SuperchainConfig(address(0)),
+            _systemConfig: SystemConfig(address(0))
+        });
     }
 
     /// @notice Initializer.
     /// @param _messenger        Contract for the CrossDomainMessenger on this network.
     /// @param _superchainConfig Contract for the SuperchainConfig on this network.
-    function initialize(CrossDomainMessenger _messenger, SuperchainConfig _superchainConfig) public initializer {
+    function initialize(
+        CrossDomainMessenger _messenger,
+        SuperchainConfig _superchainConfig,
+        SystemConfig _systemConfig
+    )
+        public
+        initializer
+    {
         superchainConfig = _superchainConfig;
+        systemConfig = _systemConfig;
         __StandardBridge_init({
             _messenger: _messenger,
             _otherBridge: StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE))
@@ -102,6 +118,11 @@ contract L1StandardBridge is StandardBridge, ISemver {
         _initiateETHDeposit(msg.sender, msg.sender, RECEIVE_DEFAULT_GAS_LIMIT, bytes(""));
     }
 
+    /// @inheritdoc StandardBridge
+    function gasPayingToken() internal view override returns (address addr_, uint8 decimals_) {
+        (addr_, decimals_) = systemConfig.gasPayingToken();
+    }
+
     /// @custom:legacy
     /// @notice Deposits some amount of ETH into the sender's account on L2.
     /// @param _minGasLimit Minimum gas limit for the deposit message on L2.
diff --git a/packages/contracts-bedrock/src/L1/OptimismPortal.sol b/packages/contracts-bedrock/src/L1/OptimismPortal.sol
index 30e6bd471dd6..38c638aa8e48 100644
--- a/packages/contracts-bedrock/src/L1/OptimismPortal.sol
+++ b/packages/contracts-bedrock/src/L1/OptimismPortal.sol
@@ -13,7 +13,11 @@ import { SecureMerkleTrie } from "src/libraries/trie/SecureMerkleTrie.sol";
 import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
 import { ResourceMetering } from "src/L1/ResourceMetering.sol";
 import { ISemver } from "src/universal/ISemver.sol";
-import { Constants } from "src/libraries/Constants.sol";
+import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
+import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import { L1Block } from "src/L2/L1Block.sol";
+import { Predeploys } from "src/libraries/Predeploys.sol";
+import "src/libraries/PortalErrors.sol";
 
 /// @custom:proxied
 /// @title OptimismPortal
@@ -21,6 +25,9 @@ import { Constants } from "src/libraries/Constants.sol";
 ///         and L2. Messages sent directly to the OptimismPortal have no form of replayability.
 ///         Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface.
 contract OptimismPortal is Initializable, ResourceMetering, ISemver {
+    /// @notice Allows for interactions with non standard ERC20 tokens.
+    using SafeERC20 for IERC20;
+
     /// @notice Represents a proven withdrawal.
     /// @custom:field outputRoot    Root of the L2 output this was proven against.
     /// @custom:field timestamp     Timestamp at whcih the withdrawal was proven.
@@ -37,6 +44,9 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
     /// @notice The L2 gas limit set when eth is deposited using the receive() function.
     uint64 internal constant RECEIVE_DEFAULT_GAS_LIMIT = 100_000;
 
+    /// @notice The L2 gas limit for system deposit transactions that are initiated from L1.
+    uint32 internal constant SYSTEM_DEPOSIT_GAS_LIMIT = 200_000;
+
     /// @notice Address of the L2 account which initiated a withdrawal in this transaction.
     ///         If the of this variable is the default L2 sender address, then we are NOT inside of
     ///         a call to finalizeWithdrawalTransaction.
@@ -64,6 +74,33 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
     /// @custom:network-specific
     SystemConfig public systemConfig;
 
+    /// @custom:spacer disputeGameFactory
+    /// @notice Spacer for backwards compatibility.
+    address private spacer_56_0_20;
+
+    /// @custom:spacer provenWithdrawals
+    /// @notice Spacer for backwards compatibility.
+    bytes32 private spacer_57_0_32;
+
+    /// @custom:spacer disputeGameBlacklist
+    /// @notice Spacer for backwards compatibility.
+    bytes32 private spacer_58_0_32;
+
+    /// @custom:spacer respectedGameType + respectedGameTypeUpdatedAt
+    /// @notice Spacer for backwards compatibility.
+    bytes32 private spacer_59_0_32;
+
+    /// @custom:spacer proofSubmitters
+    /// @notice Spacer for backwards compatibility.
+    bytes32 private spacer_60_0_32;
+
+    /// @notice Represents the amount of native asset minted in L2. This may not
+    ///         be 100% accurate due to the ability to send ether to the contract
+    ///         without triggering a deposit transaction. It also is used to prevent
+    ///         overflows for L2 account balances when custom gas tokens are used.
+    ///         It is not safe to trust `ERC20.balanceOf` as it may lie.
+    uint256 internal _balance;
+
     /// @notice Emitted when a transaction is deposited from L1 to L2.
     ///         The parameters of this event are read by the rollup node and used to derive deposit
     ///         transactions on L2.
@@ -86,13 +123,15 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
 
     /// @notice Reverts when paused.
     modifier whenNotPaused() {
-        require(paused() == false, "OptimismPortal: paused");
+        if (paused()) revert CallPaused();
         _;
     }
 
     /// @notice Semantic version.
-    /// @custom:semver 2.5.0
-    string public constant version = "2.5.0";
+    /// @custom:semver 2.8.1-beta.1
+    function version() public pure virtual returns (string memory) {
+        return "2.8.1-beta.1";
+    }
 
     /// @notice Constructs the OptimismPortal contract.
     constructor() {
@@ -124,28 +163,14 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
         __ResourceMetering_init();
     }
 
-    /// @notice Getter function for the contract of the L2OutputOracle on this chain.
-    ///         Public getter is legacy and will be removed in the future. Use `l2Oracle()` instead.
-    /// @return Contract of the L2OutputOracle on this chain.
-    /// @custom:legacy
-    function L2_ORACLE() external view returns (L2OutputOracle) {
-        return l2Oracle;
-    }
-
-    /// @notice Getter function for the contract of the SystemConfig on this chain.
-    ///         Public getter is legacy and will be removed in the future. Use `systemConfig()` instead.
-    /// @return Contract of the SystemConfig on this chain.
-    /// @custom:legacy
-    function SYSTEM_CONFIG() external view returns (SystemConfig) {
-        return systemConfig;
-    }
-
-    /// @notice Getter function for the address of the guardian.
-    ///         Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead.
-    /// @return Address of the guardian.
-    /// @custom:legacy
-    function GUARDIAN() external view returns (address) {
-        return guardian();
+    /// @notice Getter for the balance of the contract.
+    function balance() public view returns (uint256) {
+        (address token,) = gasPayingToken();
+        if (token == Constants.ETHER) {
+            return address(this).balance;
+        } else {
+            return _balance;
+        }
     }
 
     /// @notice Getter function for the address of the guardian.
@@ -188,6 +213,11 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
         // Intentionally empty.
     }
 
+    /// @notice Returns the gas paying token and its decimals.
+    function gasPayingToken() internal view returns (address addr_, uint8 decimals_) {
+        (addr_, decimals_) = systemConfig.gasPayingToken();
+    }
+
     /// @notice Getter for the resource config.
     ///         Used internally by the ResourceMetering contract.
     ///         The SystemConfig is the source of truth for the resource config.
@@ -213,7 +243,7 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
         // Prevent users from creating a deposit transaction where this address is the message
         // sender on L2. Because this is checked here, we do not need to check again in
         // `finalizeWithdrawalTransaction`.
-        require(_tx.target != address(this), "OptimismPortal: you cannot send messages to the portal contract");
+        if (_tx.target == address(this)) revert BadTarget();
 
         // Get the output root and load onto the stack to prevent multiple mloads. This will
         // revert if there is no output root for the given block number.
@@ -255,9 +285,12 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
         // bugs, then we know that this withdrawal was actually triggered on L2 and can therefore
         // be relayed on L1.
         require(
-            SecureMerkleTrie.verifyInclusionProof(
-                abi.encode(storageKey), hex"01", _withdrawalProof, _outputRootProof.messagePasserStorageRoot
-            ),
+            SecureMerkleTrie.verifyInclusionProof({
+                _key: abi.encode(storageKey),
+                _value: hex"01",
+                _proof: _withdrawalProof,
+                _root: _outputRootProof.messagePasserStorageRoot
+            }),
             "OptimismPortal: invalid withdrawal inclusion proof"
         );
 
@@ -280,9 +313,7 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
         // Make sure that the l2Sender has not yet been set. The l2Sender is set to a value other
         // than the default value when a withdrawal transaction is being finalized. This check is
         // a defacto reentrancy guard.
-        require(
-            l2Sender == Constants.DEFAULT_L2_SENDER, "OptimismPortal: can only trigger one withdrawal per transaction"
-        );
+        if (l2Sender != Constants.DEFAULT_L2_SENDER) revert NonReentrant();
 
         // Grab the proven withdrawal from the `provenWithdrawals` map.
         bytes32 withdrawalHash = Hashing.hashWithdrawal(_tx);
@@ -335,16 +366,53 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
         finalizedWithdrawals[withdrawalHash] = true;
 
         // Set the l2Sender so contracts know who triggered this withdrawal on L2.
+        // This acts as a reentrancy guard.
         l2Sender = _tx.sender;
 
-        // Trigger the call to the target contract. We use a custom low level method
-        // SafeCall.callWithMinGas to ensure two key properties
-        //   1. Target contracts cannot force this call to run out of gas by returning a very large
-        //      amount of data (and this is OK because we don't care about the returndata here).
-        //   2. The amount of gas provided to the execution context of the target is at least the
-        //      gas limit specified by the user. If there is not enough gas in the current context
-        //      to accomplish this, `callWithMinGas` will revert.
-        bool success = SafeCall.callWithMinGas(_tx.target, _tx.gasLimit, _tx.value, _tx.data);
+        bool success;
+        (address token,) = gasPayingToken();
+        if (token == Constants.ETHER) {
+            // Trigger the call to the target contract. We use a custom low level method
+            // SafeCall.callWithMinGas to ensure two key properties
+            //   1. Target contracts cannot force this call to run out of gas by returning a very large
+            //      amount of data (and this is OK because we don't care about the returndata here).
+            //   2. The amount of gas provided to the execution context of the target is at least the
+            //      gas limit specified by the user. If there is not enough gas in the current context
+            //      to accomplish this, `callWithMinGas` will revert.
+            success = SafeCall.callWithMinGas(_tx.target, _tx.gasLimit, _tx.value, _tx.data);
+        } else {
+            // Cannot call the token contract directly from the portal. This would allow an attacker
+            // to call approve from a withdrawal and drain the balance of the portal.
+            if (_tx.target == token) revert BadTarget();
+
+            // Only transfer value when a non zero value is specified. This saves gas in the case of
+            // using the standard bridge or arbitrary message passing.
+            if (_tx.value != 0) {
+                // Update the contracts internal accounting of the amount of native asset in L2.
+                _balance -= _tx.value;
+
+                // Read the balance of the target contract before the transfer so the consistency
+                // of the transfer can be checked afterwards.
+                uint256 startBalance = IERC20(token).balanceOf(address(this));
+
+                // Transfer the ERC20 balance to the target, accounting for non standard ERC20
+                // implementations that may not return a boolean. This reverts if the low level
+                // call is not successful.
+                IERC20(token).safeTransfer({ to: _tx.target, value: _tx.value });
+
+                // The balance must be transferred exactly.
+                if (IERC20(token).balanceOf(address(this)) != startBalance - _tx.value) {
+                    revert TransferFailed();
+                }
+            }
+
+            // Make a call to the target contract only if there is calldata.
+            if (_tx.data.length != 0) {
+                success = SafeCall.callWithMinGas(_tx.target, _tx.gasLimit, 0, _tx.data);
+            } else {
+                success = true;
+            }
+        }
 
         // Reset the l2Sender back to the default value.
         l2Sender = Constants.DEFAULT_L2_SENDER;
@@ -357,8 +425,57 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
         // sub call to the target contract if the minimum gas limit specified by the user would not
         // be sufficient to execute the sub call.
         if (success == false && tx.origin == Constants.ESTIMATION_ADDRESS) {
-            revert("OptimismPortal: withdrawal failed");
+            revert GasEstimation();
+        }
+    }
+
+    /// @notice Entrypoint to depositing an ERC20 token as a custom gas token.
+    ///         This function depends on a well formed ERC20 token. There are only
+    ///         so many checks that can be done on chain for this so it is assumed
+    ///         that chain operators will deploy chains with well formed ERC20 tokens.
+    /// @param _to         Target address on L2.
+    /// @param _mint       Units of ERC20 token to deposit into L2.
+    /// @param _value      Units of ERC20 token to send on L2 to the recipient.
+    /// @param _gasLimit   Amount of L2 gas to purchase by burning gas on L1.
+    /// @param _isCreation Whether or not the transaction is a contract creation.
+    /// @param _data       Data to trigger the recipient with.
+    function depositERC20Transaction(
+        address _to,
+        uint256 _mint,
+        uint256 _value,
+        uint64 _gasLimit,
+        bool _isCreation,
+        bytes memory _data
+    )
+        public
+        metered(_gasLimit)
+    {
+        // Can only be called if an ERC20 token is used for gas paying on L2
+        (address token,) = gasPayingToken();
+        if (token == Constants.ETHER) revert OnlyCustomGasToken();
+
+        // Gives overflow protection for L2 account balances.
+        _balance += _mint;
+
+        // Get the balance of the portal before the transfer.
+        uint256 startBalance = IERC20(token).balanceOf(address(this));
+
+        // Take ownership of the token. It is assumed that the user has given the portal an approval.
+        IERC20(token).safeTransferFrom({ from: msg.sender, to: address(this), value: _mint });
+
+        // Double check that the portal now has the exact amount of token.
+        if (IERC20(token).balanceOf(address(this)) != startBalance + _mint) {
+            revert TransferFailed();
         }
+
+        _depositTransaction({
+            _to: _to,
+            _mint: _mint,
+            _value: _value,
+            _gasLimit: _gasLimit,
+            _isCreation: _isCreation,
+            _data: _data
+        });
     }
 
     /// @notice Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in
@@ -380,22 +497,50 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
         public
         payable
         metered(_gasLimit)
+    {
+        (address token,) = gasPayingToken();
+        if (token != Constants.ETHER && msg.value != 0) revert NoValue();
+
+        _depositTransaction({
+            _to: _to,
+            _mint: msg.value,
+            _value: _value,
+            _gasLimit: _gasLimit,
+            _isCreation: _isCreation,
+            _data: _data
+        });
+    }
+
+    /// @notice Common logic for creating deposit transactions.
+    /// @param _to         Target address on L2.
+    /// @param _mint       Units of asset to deposit into L2.
+    /// @param _value      Units of asset to send on L2 to the recipient.
+    /// @param _gasLimit   Amount of L2 gas to purchase by burning gas on L1.
+    /// @param _isCreation Whether or not the transaction is a contract creation.
+    /// @param _data       Data to trigger the recipient with.
+    function _depositTransaction(
+        address _to,
+        uint256 _mint,
+        uint256 _value,
+        uint64 _gasLimit,
+        bool _isCreation,
+        bytes memory _data
+    )
+        internal
     {
         // Just to be safe, make sure that people specify address(0) as the target when doing
         // contract creations.
-        if (_isCreation) {
-            require(_to == address(0), "OptimismPortal: must send to address(0) when creating a contract");
-        }
+        if (_isCreation && _to != address(0)) revert BadTarget();
 
         // Prevent depositing transactions that have too small of a gas limit. Users should pay
         // more for more resource usage.
-        require(_gasLimit >= minimumGasLimit(uint64(_data.length)), "OptimismPortal: gas limit too small");
+        if (_gasLimit < minimumGasLimit(uint64(_data.length))) revert SmallGasLimit();
 
         // Prevent the creation of deposit transactions that have too much calldata. This gives an
         // upper limit on the size of unsafe blocks over the p2p network. 120kb is chosen to ensure
         // that the transaction can fit into the p2p network policy of 128kb even though deposit
         // transactions are not gossipped over the p2p network.
-        require(_data.length <= 120_000, "OptimismPortal: data too large");
+        if (_data.length > 120_000) revert LargeCalldata();
 
         // Transform the from-address to its alias if the caller is a contract.
         address from = msg.sender;
@@ -406,13 +551,38 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver {
         // Compute the opaque data that will be emitted as part of the TransactionDeposited event.
         // We use opaque data so that we can update the TransactionDeposited event in the future
         // without breaking the current interface.
-        bytes memory opaqueData = abi.encodePacked(msg.value, _value, _gasLimit, _isCreation, _data);
+        bytes memory opaqueData = abi.encodePacked(_mint, _value, _gasLimit, _isCreation, _data);
 
         // Emit a TransactionDeposited event so that the rollup node can derive a deposit
         // transaction for this deposit.
         emit TransactionDeposited(from, _to, DEPOSIT_VERSION, opaqueData);
     }
 
+    /// @notice Sets the gas paying token for the L2 system. This token is used as the
+    ///         L2 native asset. Only the SystemConfig contract can call this function.
+    function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) external {
+        if (msg.sender != address(systemConfig)) revert Unauthorized();
+
+        // Set L2 deposit gas as used without paying burning gas. Ensures that deposits cannot use too much L2 gas.
+        // This value must be large enough to cover the cost of calling `L1Block.setGasPayingToken`.
+        useGas(SYSTEM_DEPOSIT_GAS_LIMIT);
+
+        // Emit the special deposit transaction directly that sets the gas paying
+        // token in the L1Block predeploy contract.
+        emit TransactionDeposited(
+            Constants.DEPOSITOR_ACCOUNT,
+            Predeploys.L1_BLOCK_ATTRIBUTES,
+            DEPOSIT_VERSION,
+            abi.encodePacked(
+                uint256(0), // mint
+                uint256(0), // value
+                uint64(SYSTEM_DEPOSIT_GAS_LIMIT), // gasLimit
+                false, // isCreation,
+                abi.encodeCall(L1Block.setGasPayingToken, (_token, _decimals, _name, _symbol))
+            )
+        );
+    }
+
     /// @notice Determine if a given output is finalized.
     ///         Reverts if the call to l2Oracle.getL2Output reverts.
     ///         Returns a boolean otherwise.
diff --git a/packages/contracts-bedrock/src/L1/OptimismPortal2.sol b/packages/contracts-bedrock/src/L1/OptimismPortal2.sol
index ab311af6bc39..385a6ca63f01 100644
--- a/packages/contracts-bedrock/src/L1/OptimismPortal2.sol
+++ b/packages/contracts-bedrock/src/L1/OptimismPortal2.sol
@@ -15,7 +15,8 @@ import { ResourceMetering } from "src/L1/ResourceMetering.sol";
 import { ISemver } from "src/universal/ISemver.sol";
 import { Constants } from "src/libraries/Constants.sol";
 
-import "src/libraries/DisputeTypes.sol";
+import "src/libraries/PortalErrors.sol";
+import "src/dispute/lib/Types.sol";
 
 /// @custom:proxied
 /// @title OptimismPortal2
@@ -78,8 +79,8 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
     /// @custom:network-specific
     DisputeGameFactory public disputeGameFactory;
 
-    /// @notice A mapping of withdrawal hashes to `ProvenWithdrawal` data.
-    mapping(bytes32 => ProvenWithdrawal) public provenWithdrawals;
+    /// @notice A mapping of withdrawal hashes to proof submitters to `ProvenWithdrawal` data.
+    mapping(bytes32 => mapping(address => ProvenWithdrawal)) public provenWithdrawals;
 
     /// @notice A mapping of dispute game addresses to whether or not they are blacklisted.
     mapping(IDisputeGame => bool) public disputeGameBlacklist;
@@ -90,6 +91,13 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
     /// @notice The timestamp at which the respected game type was last updated.
     uint64 public respectedGameTypeUpdatedAt;
 
+    /// @notice Mapping of withdrawal hashes to addresses that have submitted a proof for the withdrawal.
+    mapping(bytes32 => address[]) public proofSubmitters;
+
+    /// @custom:spacer _balance (custom gas token)
+    /// @notice Spacer for forwards compatibility.
+    bytes32 private spacer_61_0_32;
+
     /// @notice Emitted when a transaction is deposited from L1 to L2.
     ///         The parameters of this event are read by the rollup node and used to derive deposit
     ///         transactions on L2.
@@ -105,35 +113,46 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
     /// @param to             Address that the withdrawal transaction is directed to.
     event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to);
 
+    /// @notice Emitted when a withdrawal transaction is proven. Exists as a separate event to allow for backwards
+    ///         compatibility for tooling that observes the `WithdrawalProven` event.
+    /// @param withdrawalHash Hash of the withdrawal transaction.
+    /// @param proofSubmitter Address of the proof submitter.
+    event WithdrawalProvenExtension1(bytes32 indexed withdrawalHash, address indexed proofSubmitter);
+
     /// @notice Emitted when a withdrawal transaction is finalized.
     /// @param withdrawalHash Hash of the withdrawal transaction.
     /// @param success        Whether the withdrawal transaction was successful.
     event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success);
 
+    /// @notice Emitted when a dispute game is blacklisted by the Guardian.
+    /// @param disputeGame Address of the dispute game that was blacklisted.
+    event DisputeGameBlacklisted(IDisputeGame indexed disputeGame);
+
+    /// @notice Emitted when the Guardian changes the respected game type in the portal.
+    /// @param newGameType The new respected game type.
+    /// @param updatedAt   The timestamp at which the respected game type was updated.
+    event RespectedGameTypeSet(GameType indexed newGameType, Timestamp indexed updatedAt);
+
     /// @notice Reverts when paused.
     modifier whenNotPaused() {
-        require(!paused(), "OptimismPortal: paused");
+        if (paused()) revert CallPaused();
         _;
     }
 
     /// @notice Semantic version.
-    /// @custom:semver 3.2.0
-    string public constant version = "3.2.0";
+    /// @custom:semver 3.10.0
+    string public constant version = "3.10.0";
 
     /// @notice Constructs the OptimismPortal contract.
-    constructor(
-        uint256 _proofMaturityDelaySeconds,
-        uint256 _disputeGameFinalityDelaySeconds,
-        GameType _initialRespectedGameType
-    ) {
+    constructor(uint256 _proofMaturityDelaySeconds, uint256 _disputeGameFinalityDelaySeconds) {
         PROOF_MATURITY_DELAY_SECONDS = _proofMaturityDelaySeconds;
         DISPUTE_GAME_FINALITY_DELAY_SECONDS = _disputeGameFinalityDelaySeconds;
-        respectedGameType = _initialRespectedGameType;
 
         initialize({
             _disputeGameFactory: DisputeGameFactory(address(0)),
             _systemConfig: SystemConfig(address(0)),
-            _superchainConfig: SuperchainConfig(address(0))
+            _superchainConfig: SuperchainConfig(address(0)),
+            _initialRespectedGameType: GameType.wrap(0)
         });
     }
 
@@ -144,7 +163,8 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
     function initialize(
         DisputeGameFactory _disputeGameFactory,
         SystemConfig _systemConfig,
-        SuperchainConfig _superchainConfig
+        SuperchainConfig _superchainConfig,
+        GameType _initialRespectedGameType
     )
         public
         initializer
@@ -152,26 +172,21 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
         disputeGameFactory = _disputeGameFactory;
         systemConfig = _systemConfig;
         superchainConfig = _superchainConfig;
+
+        // Set the `l2Sender` slot, only if it is currently empty. This signals the first initialization of the
+        // contract.
         if (l2Sender == address(0)) {
             l2Sender = Constants.DEFAULT_L2_SENDER;
-        }
-        __ResourceMetering_init();
-    }
 
-    /// @notice Getter function for the contract of the SystemConfig on this chain.
-    ///         Public getter is legacy and will be removed in the future. Use `systemConfig()` instead.
-    /// @return Contract of the SystemConfig on this chain.
-    /// @custom:legacy
-    function SYSTEM_CONFIG() external view returns (SystemConfig) {
-        return systemConfig;
-    }
+            // Set the `respectedGameTypeUpdatedAt` timestamp, to ignore all games of the respected type prior
+            // to this operation.
+            respectedGameTypeUpdatedAt = uint64(block.timestamp);
 
-    /// @notice Getter function for the address of the guardian.
-    ///         Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead.
-    /// @return Address of the guardian.
-    /// @custom:legacy
-    function GUARDIAN() external view returns (address) {
-        return guardian();
+            // Set the initial respected game type
+            respectedGameType = _initialRespectedGameType;
+        }
+
+        __ResourceMetering_init();
     }
 
     /// @notice Getter function for the address of the guardian.
@@ -265,19 +280,12 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
 
         // Load the ProvenWithdrawal into memory, using the withdrawal hash as a unique identifier.
         bytes32 withdrawalHash = Hashing.hashWithdrawal(_tx);
-        ProvenWithdrawal memory provenWithdrawal = provenWithdrawals[withdrawalHash];
-
-        // We generally want to prevent users from proving the same withdrawal multiple times
-        // because each successive proof will update the timestamp. A malicious user can take
-        // advantage of this to prevent other users from finalizing their withdrawal. However,
-        // in the case that an honest user proves their withdrawal against a dispute game that
-        // resolves against the root claim, or the dispute game is blacklisted, we allow
-        // re-proving the withdrawal against a new proposal.
-        IDisputeGame game = provenWithdrawal.disputeGameProxy;
+
+        // We do not allow for proving withdrawals against dispute games that have resolved against the favor
+        // of the root claim.
         require(
-            provenWithdrawal.timestamp == 0 || gameProxy.status() == GameStatus.CHALLENGER_WINS
-                || disputeGameBlacklist[gameProxy] || game.gameType().raw() != respectedGameType.raw(),
-            "OptimismPortal: withdrawal hash has already been proven, and dispute game is not invalid"
+            gameProxy.status() != GameStatus.CHALLENGER_WINS,
+            "OptimismPortal: cannot prove against invalid dispute games"
         );
 
         // Compute the storage slot of the withdrawal hash in the L2ToL1MessagePasser contract.
@@ -295,25 +303,46 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
         // bugs, then we know that this withdrawal was actually triggered on L2 and can therefore
         // be relayed on L1.
         require(
-            SecureMerkleTrie.verifyInclusionProof(
-                abi.encode(storageKey), hex"01", _withdrawalProof, _outputRootProof.messagePasserStorageRoot
-            ),
+            SecureMerkleTrie.verifyInclusionProof({
+                _key: abi.encode(storageKey),
+                _value: hex"01",
+                _proof: _withdrawalProof,
+                _root: _outputRootProof.messagePasserStorageRoot
+            }),
             "OptimismPortal: invalid withdrawal inclusion proof"
         );
 
         // Designate the withdrawalHash as proven by storing the `disputeGameProxy` & `timestamp` in the
         // `provenWithdrawals` mapping. A `withdrawalHash` can only be proven once unless the dispute game it proved
         // against resolves against the favor of the root claim.
-        provenWithdrawals[withdrawalHash] =
+        provenWithdrawals[withdrawalHash][msg.sender] =
             ProvenWithdrawal({ disputeGameProxy: gameProxy, timestamp: uint64(block.timestamp) });
 
         // Emit a `WithdrawalProven` event.
         emit WithdrawalProven(withdrawalHash, _tx.sender, _tx.target);
+        // Emit a `WithdrawalProvenExtension1` event.
+        emit WithdrawalProvenExtension1(withdrawalHash, msg.sender);
+
+        // Add the proof submitter to the list of proof submitters for this withdrawal hash.
+        proofSubmitters[withdrawalHash].push(msg.sender);
     }
 
     /// @notice Finalizes a withdrawal transaction.
     /// @param _tx Withdrawal transaction to finalize.
     function finalizeWithdrawalTransaction(Types.WithdrawalTransaction memory _tx) external whenNotPaused {
+        finalizeWithdrawalTransactionExternalProof(_tx, msg.sender);
+    }
+
+    /// @notice Finalizes a withdrawal transaction, using an external proof submitter.
+    /// @param _tx Withdrawal transaction to finalize.
+    /// @param _proofSubmitter Address of the proof submitter.
+    function finalizeWithdrawalTransactionExternalProof(
+        Types.WithdrawalTransaction memory _tx,
+        address _proofSubmitter
+    )
+        public
+        whenNotPaused
+    {
         // Make sure that the l2Sender has not yet been set. The l2Sender is set to a value other
         // than the default value when a withdrawal transaction is being finalized. This check is
         // a defacto reentrancy guard.
@@ -325,7 +354,7 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
         bytes32 withdrawalHash = Hashing.hashWithdrawal(_tx);
 
         // Check that the withdrawal can be finalized.
-        checkWithdrawal(withdrawalHash);
+        checkWithdrawal(withdrawalHash, _proofSubmitter);
 
         // Mark the withdrawal as finalized so it can't be replayed.
         finalizedWithdrawals[withdrawalHash] = true;
@@ -353,7 +382,7 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
         // sub call to the target contract if the minimum gas limit specified by the user would not
         // be sufficient to execute the sub call.
         if (!success && tx.origin == Constants.ESTIMATION_ADDRESS) {
-            revert("OptimismPortal: withdrawal failed");
+            revert GasEstimation();
         }
     }
 
@@ -379,19 +408,17 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
     {
         // Just to be safe, make sure that people specify address(0) as the target when doing
         // contract creations.
-        if (_isCreation) {
-            require(_to == address(0), "OptimismPortal: must send to address(0) when creating a contract");
-        }
+        if (_isCreation && _to != address(0)) revert BadTarget();
 
         // Prevent depositing transactions that have too small of a gas limit. Users should pay
         // more for more resource usage.
-        require(_gasLimit >= minimumGasLimit(uint64(_data.length)), "OptimismPortal: gas limit too small");
+        if (_gasLimit < minimumGasLimit(uint64(_data.length))) revert SmallGasLimit();
 
         // Prevent the creation of deposit transactions that have too much calldata. This gives an
         // upper limit on the size of unsafe blocks over the p2p network. 120kb is chosen to ensure
         // that the transaction can fit into the p2p network policy of 128kb even though deposit
         // transactions are not gossipped over the p2p network.
-        require(_data.length <= 120_000, "OptimismPortal: data too large");
+        if (_data.length > 120_000) revert LargeCalldata();
 
         // Transform the from-address to its alias if the caller is a contract.
         address from = msg.sender;
@@ -412,24 +439,27 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
     /// @notice Blacklists a dispute game. Should only be used in the event that a dispute game resolves incorrectly.
     /// @param _disputeGame Dispute game to blacklist.
     function blacklistDisputeGame(IDisputeGame _disputeGame) external {
-        require(msg.sender == guardian(), "OptimismPortal: only the guardian can blacklist dispute games");
+        if (msg.sender != guardian()) revert Unauthorized();
         disputeGameBlacklist[_disputeGame] = true;
+        emit DisputeGameBlacklisted(_disputeGame);
     }
 
     /// @notice Sets the respected game type. Changing this value can alter the security properties of the system,
     ///         depending on the new game's behavior.
     /// @param _gameType The game type to consult for output proposals.
     function setRespectedGameType(GameType _gameType) external {
-        require(msg.sender == guardian(), "OptimismPortal: only the guardian can set the respected game type");
+        if (msg.sender != guardian()) revert Unauthorized();
         respectedGameType = _gameType;
         respectedGameTypeUpdatedAt = uint64(block.timestamp);
+        emit RespectedGameTypeSet(_gameType, Timestamp.wrap(respectedGameTypeUpdatedAt));
     }
 
     /// @notice Checks if a withdrawal can be finalized. This function will revert if the withdrawal cannot be
     ///         finalized, and otherwise has no side-effects.
     /// @param _withdrawalHash Hash of the withdrawal to check.
-    function checkWithdrawal(bytes32 _withdrawalHash) public view {
-        ProvenWithdrawal memory provenWithdrawal = provenWithdrawals[_withdrawalHash];
+    /// @param _proofSubmitter The submitter of the proof for the withdrawal hash
+    function checkWithdrawal(bytes32 _withdrawalHash, address _proofSubmitter) public view {
+        ProvenWithdrawal memory provenWithdrawal = provenWithdrawals[_withdrawalHash][_proofSubmitter];
         IDisputeGame disputeGameProxy = provenWithdrawal.disputeGameProxy;
 
         // The dispute game must not be blacklisted.
@@ -438,7 +468,10 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
         // A withdrawal can only be finalized if it has been proven. We know that a withdrawal has
         // been proven at least once when its timestamp is non-zero. Unproven withdrawals will have
         // a timestamp of zero.
-        require(provenWithdrawal.timestamp != 0, "OptimismPortal: withdrawal has not been proven yet");
+        require(
+            provenWithdrawal.timestamp != 0,
+            "OptimismPortal: withdrawal has not been proven by proof submitter address yet"
+        );
 
         uint64 createdAt = disputeGameProxy.createdAt().raw();
 
@@ -461,7 +494,7 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
         // from finalizing withdrawals proven against non-finalized output roots.
         require(
             disputeGameProxy.status() == GameStatus.DEFENDER_WINS,
-            "OptimismPortal: output proposal has not been finalized yet"
+            "OptimismPortal: output proposal has not been validated"
         );
 
         // The game type of the dispute game must be the respected game type. This was also checked in
@@ -487,4 +520,11 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver {
         // Check that this withdrawal has not already been finalized, this is replay protection.
         require(!finalizedWithdrawals[_withdrawalHash], "OptimismPortal: withdrawal has already been finalized");
     }
+
+    /// @notice External getter for the number of proof submitters for a withdrawal hash.
+    /// @param _withdrawalHash Hash of the withdrawal.
+    /// @return The number of proof submitters for the withdrawal hash.
+    function numProofSubmitters(bytes32 _withdrawalHash) external view returns (uint256) {
+        return proofSubmitters[_withdrawalHash].length;
+    }
 }
diff --git a/packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol b/packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol
new file mode 100644
index 000000000000..630ae563722b
--- /dev/null
+++ b/packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { OptimismPortal } from "src/L1/OptimismPortal.sol";
+import { L1BlockInterop, ConfigType } from "src/L2/L1BlockInterop.sol";
+import { Predeploys } from "src/libraries/Predeploys.sol";
+import { Constants } from "src/libraries/Constants.sol";
+
+/// @custom:proxied
+/// @title OptimismPortalInterop
+/// @notice The OptimismPortal is a low-level contract responsible for passing messages between L1
+///         and L2. Messages sent directly to the OptimismPortal have no form of replayability.
+///         Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface.
+contract OptimismPortalInterop is OptimismPortal {
+    /// @notice Thrown when a non-depositor account attempts update static configuration.
+    error Unauthorized();
+
+    /// @custom:semver +interop
+    function version() public pure override returns (string memory) {
+        return string.concat(super.version(), "+interop");
+    }
+
+    /// @notice Sets static configuration options for the L2 system.
+    /// @param _type  Type of configuration to set.
+    /// @param _value Encoded value of the configuration.
+    function setConfig(ConfigType _type, bytes memory _value) external {
+        if (msg.sender != address(systemConfig)) revert Unauthorized();
+
+        // Set L2 deposit gas as used without paying burning gas. Ensures that deposits cannot use too much L2 gas.
+        // This value must be large enough to cover the cost of calling `L1Block.setConfig`.
+        useGas(SYSTEM_DEPOSIT_GAS_LIMIT);
+
+        // Emit the special deposit transaction directly that sets the config in the L1Block predeploy contract.
+        emit TransactionDeposited(
+            Constants.DEPOSITOR_ACCOUNT,
+            Predeploys.L1_BLOCK_ATTRIBUTES,
+            DEPOSIT_VERSION,
+            abi.encodePacked(
+                uint256(0), // mint
+                uint256(0), // value
+                uint64(SYSTEM_DEPOSIT_GAS_LIMIT), // gasLimit
+                false, // isCreation,
+                abi.encodeCall(L1BlockInterop.setConfig, (_type, _value))
+            )
+        );
+    }
+}
diff --git a/packages/contracts-bedrock/src/L1/ResourceMetering.sol b/packages/contracts-bedrock/src/L1/ResourceMetering.sol
index e66cb6b16e22..feeabe14ee17 100644
--- a/packages/contracts-bedrock/src/L1/ResourceMetering.sol
+++ b/packages/contracts-bedrock/src/L1/ResourceMetering.sol
@@ -11,6 +11,9 @@ import { Arithmetic } from "src/libraries/Arithmetic.sol";
 /// @notice ResourceMetering implements an EIP-1559 style resource metering system where pricing
 ///         updates automatically based on current demand.
 abstract contract ResourceMetering is Initializable {
+    /// @notice Error returned when too much gas resource is consumed.
+    error OutOfGas();
+
     /// @notice Represents the various parameters that control the way in which resources are
     ///         metered. Corresponds to the EIP-1559 resource metering system.
     /// @custom:field prevBaseFee   Base fee from the previous block(s).
@@ -121,10 +124,9 @@ abstract contract ResourceMetering is Initializable {
 
         // Make sure we can actually buy the resource amount requested by the user.
         params.prevBoughtGas += _amount;
-        require(
-            int256(uint256(params.prevBoughtGas)) <= int256(uint256(config.maxResourceLimit)),
-            "ResourceMetering: cannot buy more gas than available gas limit"
-        );
+        if (int256(uint256(params.prevBoughtGas)) > int256(uint256(config.maxResourceLimit))) {
+            revert OutOfGas();
+        }
 
         // Determine the amount of ETH to be paid.
         uint256 resourceCost = uint256(_amount) * uint256(params.prevBaseFee);
@@ -145,6 +147,13 @@ abstract contract ResourceMetering is Initializable {
         }
     }
 
+    /// @notice Adds an amount of L2 gas consumed to the prev bought gas params. This is meant to be used
+    ///         when L2 system transactions are generated from L1.
+    /// @param _amount Amount of the L2 gas resource requested.
+    function useGas(uint32 _amount) internal {
+        params.prevBoughtGas += uint64(_amount);
+    }
+
     /// @notice Virtual function that returns the resource config.
     ///         Contracts that inherit this contract must implement this function.
     /// @return ResourceConfig
diff --git a/packages/contracts-bedrock/src/L1/SystemConfig.sol b/packages/contracts-bedrock/src/L1/SystemConfig.sol
index 5e497e22793a..3d00077527a8 100644
--- a/packages/contracts-bedrock/src/L1/SystemConfig.sol
+++ b/packages/contracts-bedrock/src/L1/SystemConfig.sol
@@ -6,12 +6,15 @@ import { ISemver } from "src/universal/ISemver.sol";
 import { ResourceMetering } from "src/L1/ResourceMetering.sol";
 import { Storage } from "src/libraries/Storage.sol";
 import { Constants } from "src/libraries/Constants.sol";
+import { OptimismPortal } from "src/L1/OptimismPortal.sol";
+import { GasPayingToken, IGasToken } from "src/libraries/GasPayingToken.sol";
+import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
 
 /// @title SystemConfig
 /// @notice The SystemConfig contract is used to manage configuration of an Optimism network.
 ///         All configuration is stored on L1 and picked up by L2 as part of the derviation of
 ///         the L2 chain.
-contract SystemConfig is OwnableUpgradeable, ISemver {
+contract SystemConfig is OwnableUpgradeable, ISemver, IGasToken {
     /// @notice Enum representing different types of updates.
     /// @custom:value BATCHER              Represents an update to the batcher hash.
     /// @custom:value GAS_CONFIG           Represents an update to txn fee config on L2.
@@ -26,14 +29,16 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
     }
 
     /// @notice Struct representing the addresses of L1 system contracts. These should be the
-    ///         proxies and are network specific.
+    ///         contracts that users interact with (not implementations for proxied contracts)
+    ///         and are network specific.
     struct Addresses {
         address l1CrossDomainMessenger;
         address l1ERC721Bridge;
         address l1StandardBridge;
-        address l2OutputOracle;
+        address disputeGameFactory;
         address optimismPortal;
         address optimismMintableERC20Factory;
+        address gasPayingToken;
     }
 
     /// @notice Version identifier, used for upgrades.
@@ -59,9 +64,6 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
     /// @notice Storage slot that the L1StandardBridge address is stored at.
     bytes32 public constant L1_STANDARD_BRIDGE_SLOT = bytes32(uint256(keccak256("systemconfig.l1standardbridge")) - 1);
 
-    /// @notice Storage slot that the L2OutputOracle address is stored at.
-    bytes32 public constant L2_OUTPUT_ORACLE_SLOT = bytes32(uint256(keccak256("systemconfig.l2outputoracle")) - 1);
-
     /// @notice Storage slot that the OptimismPortal address is stored at.
     bytes32 public constant OPTIMISM_PORTAL_SLOT = bytes32(uint256(keccak256("systemconfig.optimismportal")) - 1);
 
@@ -75,10 +77,25 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
     /// @notice Storage slot for block at which the op-node can start searching for logs from.
     bytes32 public constant START_BLOCK_SLOT = bytes32(uint256(keccak256("systemconfig.startBlock")) - 1);
 
+    /// @notice Storage slot for the DisputeGameFactory address.
+    bytes32 public constant DISPUTE_GAME_FACTORY_SLOT =
+        bytes32(uint256(keccak256("systemconfig.disputegamefactory")) - 1);
+
+    /// @notice The number of decimals that the gas paying token has.
+    uint8 internal constant GAS_PAYING_TOKEN_DECIMALS = 18;
+
+    /// @notice The maximum gas limit that can be set for L2 blocks. This limit is used to enforce that the blocks
+    ///         on L2 are not too large to process and prove. Over time, this value can be increased as various
+    ///         optimizations and improvements are made to the system at large.
+    uint64 internal constant MAX_GAS_LIMIT = 200_000_000;
+
     /// @notice Fixed L2 gas overhead. Used as part of the L2 fee calculation.
+    ///         Deprecated since the Ecotone network upgrade
     uint256 public overhead;
 
     /// @notice Dynamic L2 gas overhead. Used as part of the L2 fee calculation.
+    ///         The most significant byte is used to determine the version since the
+    ///         Ecotone network upgrade.
     uint256 public scalar;
 
     /// @notice Identifier for the batcher.
@@ -89,6 +106,12 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
     /// @notice L2 block gas limit.
     uint64 public gasLimit;
 
+    /// @notice Basefee scalar value. Part of the L2 fee calculation since the Ecotone network upgrade.
+    uint32 public basefeeScalar;
+
+    /// @notice Blobbasefee scalar value. Part of the L2 fee calculation since the Ecotone network upgrade.
+    uint32 public blobbasefeeScalar;
+
     /// @notice The configuration for the deposit fee market.
     ///         Used by the OptimismPortal to meter the cost of buying L2 gas on L1.
     ///         Set as internal with a getter so that the struct is returned instead of a tuple.
@@ -101,8 +124,10 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
     event ConfigUpdate(uint256 indexed version, UpdateType indexed updateType, bytes data);
 
     /// @notice Semantic version.
-    /// @custom:semver 1.12.0
-    string public constant version = "1.12.0";
+    /// @custom:semver 2.3.0-beta.2
+    function version() public pure virtual returns (string memory) {
+        return "2.3.0-beta.2";
+    }
 
     /// @notice Constructs the SystemConfig contract. Cannot set
     ///         the owner to `address(0)` due to the Ownable contract's
@@ -113,8 +138,8 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
         Storage.setUint(START_BLOCK_SLOT, type(uint256).max);
         initialize({
             _owner: address(0xdEaD),
-            _overhead: 0,
-            _scalar: 0,
+            _basefeeScalar: 0,
+            _blobbasefeeScalar: 0,
             _batcherHash: bytes32(0),
             _gasLimit: 1,
             _unsafeBlockSigner: address(0),
@@ -131,9 +156,10 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
                 l1CrossDomainMessenger: address(0),
                 l1ERC721Bridge: address(0),
                 l1StandardBridge: address(0),
-                l2OutputOracle: address(0),
+                disputeGameFactory: address(0),
                 optimismPortal: address(0),
-                optimismMintableERC20Factory: address(0)
+                optimismMintableERC20Factory: address(0),
+                gasPayingToken: address(0)
             })
         });
     }
@@ -141,8 +167,8 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
     /// @notice Initializer.
     ///         The resource config must be set before the require check.
     /// @param _owner             Initial owner of the contract.
-    /// @param _overhead          Initial overhead value.
-    /// @param _scalar            Initial scalar value.
+    /// @param _basefeeScalar     Initial basefee scalar value.
+    /// @param _blobbasefeeScalar Initial blobbasefee scalar value.
     /// @param _batcherHash       Initial batcher hash.
     /// @param _gasLimit          Initial gas limit.
     /// @param _unsafeBlockSigner Initial unsafe block signer address.
@@ -152,8 +178,8 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
     /// @param _addresses         Set of L1 contract addresses. These should be the proxies.
     function initialize(
         address _owner,
-        uint256 _overhead,
-        uint256 _scalar,
+        uint32 _basefeeScalar,
+        uint32 _blobbasefeeScalar,
         bytes32 _batcherHash,
         uint64 _gasLimit,
         address _unsafeBlockSigner,
@@ -169,7 +195,7 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
 
         // These are set in ascending order of their UpdateTypes.
         _setBatcherHash(_batcherHash);
-        _setGasConfig({ _overhead: _overhead, _scalar: _scalar });
+        _setGasConfigEcotone({ _basefeeScalar: _basefeeScalar, _blobbasefeeScalar: _blobbasefeeScalar });
         _setGasLimit(_gasLimit);
 
         Storage.setAddress(UNSAFE_BLOCK_SIGNER_SLOT, _unsafeBlockSigner);
@@ -177,11 +203,12 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
         Storage.setAddress(L1_CROSS_DOMAIN_MESSENGER_SLOT, _addresses.l1CrossDomainMessenger);
         Storage.setAddress(L1_ERC_721_BRIDGE_SLOT, _addresses.l1ERC721Bridge);
         Storage.setAddress(L1_STANDARD_BRIDGE_SLOT, _addresses.l1StandardBridge);
-        Storage.setAddress(L2_OUTPUT_ORACLE_SLOT, _addresses.l2OutputOracle);
+        Storage.setAddress(DISPUTE_GAME_FACTORY_SLOT, _addresses.disputeGameFactory);
         Storage.setAddress(OPTIMISM_PORTAL_SLOT, _addresses.optimismPortal);
         Storage.setAddress(OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT, _addresses.optimismMintableERC20Factory);
 
         _setStartBlock();
+        _setGasPayingToken(_addresses.gasPayingToken);
 
         _setResourceConfig(_config);
         require(_gasLimit >= minimumGasLimit(), "SystemConfig: gas limit too low");
@@ -197,6 +224,14 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
         return uint64(_resourceConfig.maxResourceLimit) + uint64(_resourceConfig.systemTxMaxGas);
     }
 
+    /// @notice Returns the maximum L2 gas limit that can be safely set for the system to
+    ///         operate. This bound is used to prevent the gas limit from being set too high
+    ///         and causing the system to be unable to process and/or prove L2 blocks.
+    /// @return uint64 Maximum gas limit.
+    function maximumGasLimit() public pure returns (uint64) {
+        return MAX_GAS_LIMIT;
+    }
+
     /// @notice High level getter for the unsafe block signer address.
     ///         Unsafe blocks can be propagated across the p2p network if they are signed by the
     ///         key corresponding to this address.
@@ -220,13 +255,13 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
         addr_ = Storage.getAddress(L1_STANDARD_BRIDGE_SLOT);
     }
 
-    /// @notice Getter for the L2OutputOracle address.
-    function l2OutputOracle() external view returns (address addr_) {
-        addr_ = Storage.getAddress(L2_OUTPUT_ORACLE_SLOT);
+    /// @notice Getter for the DisputeGameFactory address.
+    function disputeGameFactory() external view returns (address addr_) {
+        addr_ = Storage.getAddress(DISPUTE_GAME_FACTORY_SLOT);
     }
 
     /// @notice Getter for the OptimismPortal address.
-    function optimismPortal() external view returns (address addr_) {
+    function optimismPortal() public view returns (address addr_) {
         addr_ = Storage.getAddress(OPTIMISM_PORTAL_SLOT);
     }
 
@@ -245,6 +280,52 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
         startBlock_ = Storage.getUint(START_BLOCK_SLOT);
     }
 
+    /// @notice Getter for the gas paying asset address.
+    function gasPayingToken() public view returns (address addr_, uint8 decimals_) {
+        (addr_, decimals_) = GasPayingToken.getToken();
+    }
+
+    /// @notice Getter for custom gas token paying networks. Returns true if the
+    ///         network uses a custom gas token.
+    function isCustomGasToken() public view returns (bool) {
+        (address token,) = gasPayingToken();
+        return token != Constants.ETHER;
+    }
+
+    /// @notice Getter for the gas paying token name.
+    function gasPayingTokenName() external view returns (string memory name_) {
+        name_ = GasPayingToken.getName();
+    }
+
+    /// @notice Getter for the gas paying token symbol.
+    function gasPayingTokenSymbol() external view returns (string memory symbol_) {
+        symbol_ = GasPayingToken.getSymbol();
+    }
+
+    /// @notice Internal setter for the gas paying token address, includes validation.
+    ///         The token must not already be set and must be non zero and not the ether address
+    ///         to set the token address. This prevents the token address from being changed
+    ///         and makes it explicitly opt-in to use custom gas token.
+    /// @param _token Address of the gas paying token.
+    function _setGasPayingToken(address _token) internal virtual {
+        if (_token != address(0) && _token != Constants.ETHER && !isCustomGasToken()) {
+            require(
+                ERC20(_token).decimals() == GAS_PAYING_TOKEN_DECIMALS, "SystemConfig: bad decimals of gas paying token"
+            );
+            bytes32 name = GasPayingToken.sanitize(ERC20(_token).name());
+            bytes32 symbol = GasPayingToken.sanitize(ERC20(_token).symbol());
+
+            // Set the gas paying token in storage and in the OptimismPortal.
+            GasPayingToken.set({ _token: _token, _decimals: GAS_PAYING_TOKEN_DECIMALS, _name: name, _symbol: symbol });
+            OptimismPortal(payable(optimismPortal())).setGasPayingToken({
+                _token: _token,
+                _decimals: GAS_PAYING_TOKEN_DECIMALS,
+                _name: name,
+                _symbol: symbol
+            });
+        }
+    }
+
     /// @notice Updates the unsafe block signer address. Can only be called by the owner.
     /// @param _unsafeBlockSigner New unsafe block signer address.
     function setUnsafeBlockSigner(address _unsafeBlockSigner) external onlyOwner {
@@ -276,6 +357,7 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
     }
 
     /// @notice Updates gas config. Can only be called by the owner.
+    ///         Deprecated in favor of setGasConfigEcotone since the Ecotone upgrade.
     /// @param _overhead New overhead value.
     /// @param _scalar   New scalar value.
     function setGasConfig(uint256 _overhead, uint256 _scalar) external onlyOwner {
@@ -286,6 +368,8 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
     /// @param _overhead New overhead value.
     /// @param _scalar   New scalar value.
     function _setGasConfig(uint256 _overhead, uint256 _scalar) internal {
+        require((uint256(0xff) << 248) & _scalar == 0, "SystemConfig: scalar exceeds max.");
+
         overhead = _overhead;
         scalar = _scalar;
 
@@ -293,6 +377,26 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
         emit ConfigUpdate(VERSION, UpdateType.GAS_CONFIG, data);
     }
 
+    /// @notice Updates gas config as of the Ecotone upgrade. Can only be called by the owner.
+    /// @param _basefeeScalar     New basefeeScalar value.
+    /// @param _blobbasefeeScalar New blobbasefeeScalar value.
+    function setGasConfigEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) external onlyOwner {
+        _setGasConfigEcotone(_basefeeScalar, _blobbasefeeScalar);
+    }
+
+    /// @notice Internal function for updating the fee scalars as of the Ecotone upgrade.
+    /// @param _basefeeScalar     New basefeeScalar value.
+    /// @param _blobbasefeeScalar New blobbasefeeScalar value.
+    function _setGasConfigEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) internal {
+        basefeeScalar = _basefeeScalar;
+        blobbasefeeScalar = _blobbasefeeScalar;
+
+        scalar = (uint256(0x01) << 248) | (uint256(_blobbasefeeScalar) << 32) | _basefeeScalar;
+
+        bytes memory data = abi.encode(overhead, scalar);
+        emit ConfigUpdate(VERSION, UpdateType.GAS_CONFIG, data);
+    }
+
     /// @notice Updates the L2 gas limit. Can only be called by the owner.
     /// @param _gasLimit New gas limit.
     function setGasLimit(uint64 _gasLimit) external onlyOwner {
@@ -303,6 +407,7 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
     /// @param _gasLimit New gas limit.
     function _setGasLimit(uint64 _gasLimit) internal {
         require(_gasLimit >= minimumGasLimit(), "SystemConfig: gas limit too low");
+        require(_gasLimit <= maximumGasLimit(), "SystemConfig: gas limit too high");
         gasLimit = _gasLimit;
 
         bytes memory data = abi.encode(_gasLimit);
@@ -331,16 +436,10 @@ contract SystemConfig is OwnableUpgradeable, ISemver {
         return _resourceConfig;
     }
 
-    /// @notice An external setter for the resource config.
-    ///         In the future, this method may emit an event that the `op-node` picks up
-    ///         for when the resource config is changed.
-    /// @param _config The new resource config values.
-    function setResourceConfig(ResourceMetering.ResourceConfig memory _config) external onlyOwner {
-        _setResourceConfig(_config);
-    }
-
     /// @notice An internal setter for the resource config.
     ///         Ensures that the config is sane before storing it by checking for invariants.
+    ///         In the future, this method may emit an event that the `op-node` picks up
+    ///         for when the resource config is changed.
     /// @param _config The new resource config.
     function _setResourceConfig(ResourceMetering.ResourceConfig memory _config) internal {
         // Min base fee must be less than or equal to max base fee.
diff --git a/packages/contracts-bedrock/src/L1/SystemConfigInterop.sol b/packages/contracts-bedrock/src/L1/SystemConfigInterop.sol
new file mode 100644
index 000000000000..d129520b4843
--- /dev/null
+++ b/packages/contracts-bedrock/src/L1/SystemConfigInterop.sol
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { Constants } from "src/libraries/Constants.sol";
+import { OptimismPortalInterop as OptimismPortal } from "src/L1/OptimismPortalInterop.sol";
+import { GasPayingToken } from "src/libraries/GasPayingToken.sol";
+import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import { SystemConfig } from "src/L1/SystemConfig.sol";
+import { ConfigType } from "src/L2/L1BlockInterop.sol";
+import { StaticConfig } from "src/libraries/StaticConfig.sol";
+
+/// @title SystemConfigInterop
+/// @notice The SystemConfig contract is used to manage configuration of an Optimism network.
+///         All configuration is stored on L1 and picked up by L2 as part of the derviation of
+///         the L2 chain.
+contract SystemConfigInterop is SystemConfig {
+    /// @custom:semver +interop
+    function version() public pure override returns (string memory) {
+        return string.concat(super.version(), "+interop");
+    }
+
+    /// @notice Internal setter for the gas paying token address, includes validation.
+    ///         The token must not already be set and must be non zero and not the ether address
+    ///         to set the token address. This prevents the token address from being changed
+    ///         and makes it explicitly opt-in to use custom gas token. Additionally,
+    ///         OptimismPortal's address must be non zero, since otherwise the call to set the
+    ///         config for the gas paying token to OptimismPortal will fail.
+    /// @param _token Address of the gas paying token.
+    function _setGasPayingToken(address _token) internal override {
+        if (_token != address(0) && _token != Constants.ETHER && !isCustomGasToken()) {
+            require(
+                ERC20(_token).decimals() == GAS_PAYING_TOKEN_DECIMALS, "SystemConfig: bad decimals of gas paying token"
+            );
+            bytes32 name = GasPayingToken.sanitize(ERC20(_token).name());
+            bytes32 symbol = GasPayingToken.sanitize(ERC20(_token).symbol());
+
+            // Set the gas paying token in storage and in the OptimismPortal.
+            GasPayingToken.set({ _token: _token, _decimals: GAS_PAYING_TOKEN_DECIMALS, _name: name, _symbol: symbol });
+            OptimismPortal(payable(optimismPortal())).setConfig(
+                ConfigType.SET_GAS_PAYING_TOKEN,
+                StaticConfig.encodeSetGasPayingToken({
+                    _token: _token,
+                    _decimals: GAS_PAYING_TOKEN_DECIMALS,
+                    _name: name,
+                    _symbol: symbol
+                })
+            );
+        }
+    }
+
+    /// @notice Adds a chain to the interop dependency set. Can only be called by the owner.
+    /// @param _chainId Chain ID of chain to add.
+    function addDependency(uint256 _chainId) external onlyOwner {
+        OptimismPortal(payable(optimismPortal())).setConfig(
+            ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId)
+        );
+    }
+
+    /// @notice Removes a chain from the interop dependency set. Can only be called by the owner.
+    /// @param _chainId Chain ID of the chain to remove.
+    function removeDependency(uint256 _chainId) external onlyOwner {
+        OptimismPortal(payable(optimismPortal())).setConfig(
+            ConfigType.REMOVE_DEPENDENCY, StaticConfig.encodeRemoveDependency(_chainId)
+        );
+    }
+}
diff --git a/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol b/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol
new file mode 100644
index 000000000000..211fe76729c4
--- /dev/null
+++ b/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol
@@ -0,0 +1,161 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.25;
+
+import { Predeploys } from "src/libraries/Predeploys.sol";
+import { TransientContext, TransientReentrancyAware } from "src/libraries/TransientContext.sol";
+import { ISemver } from "src/universal/ISemver.sol";
+import { ICrossL2Inbox } from "src/L2/ICrossL2Inbox.sol";
+
+/// @title IDependencySet
+/// @notice Interface for L1Block with only `isInDependencySet(uint256)` method.
+interface IDependencySet {
+    /// @notice Returns true iff the chain associated with input chain ID is in the interop dependency set.
+    ///         Every chain is in the interop dependency set of itself.
+    /// @param _chainId Input chain ID.
+    /// @return True if the input chain ID corresponds to a chain in the interop dependency set, and false otherwise.
+    function isInDependencySet(uint256 _chainId) external view returns (bool);
+}
+
+/// @notice Thrown when a non-written transient storage slot is attempted to be read from.
+error NotEntered();
+
+/// @notice Thrown when trying to execute a cross chain message with an invalid Identifier timestamp.
+error InvalidTimestamp();
+
+/// @notice Thrown when trying to execute a cross chain message with an invalid Identifier chain ID.
+error InvalidChainId();
+
+/// @notice Thrown when trying to execute a cross chain message and the target call fails.
+error TargetCallFailed();
+
+/// @custom:proxied
+/// @custom:predeploy 0x4200000000000000000000000000000000000022
+/// @title CrossL2Inbox
+/// @notice The CrossL2Inbox is responsible for executing a cross chain message on the destination
+///         chain. It is permissionless to execute a cross chain message on behalf of any user.
+contract CrossL2Inbox is ICrossL2Inbox, ISemver, TransientReentrancyAware {
+    /// @notice Transient storage slot that the origin for an Identifier is stored at.
+    ///         Equal to bytes32(uint256(keccak256("crossl2inbox.identifier.origin")) - 1)
+    bytes32 internal constant ORIGIN_SLOT = 0xd2b7c5071ec59eb3ff0017d703a8ea513a7d0da4779b0dbefe845808c300c815;
+
+    /// @notice Transient storage slot that the blockNumber for an Identifier is stored at.
+    ///         Equal to bytes32(uint256(keccak256("crossl2inbox.identifier.blocknumber")) - 1)
+    bytes32 internal constant BLOCK_NUMBER_SLOT = 0x5a1da0738b7fdc60047c07bb519beb02aa32a8619de57e6258da1f1c2e020ccc;
+
+    /// @notice Transient storage slot that the logIndex for an Identifier is stored at.
+    ///         Equal to bytes32(uint256(keccak256("crossl2inbox.identifier.logindex")) - 1)
+    bytes32 internal constant LOG_INDEX_SLOT = 0xab8acc221aecea88a685fabca5b88bf3823b05f335b7b9f721ca7fe3ffb2c30d;
+
+    /// @notice Transient storage slot that the timestamp for an Identifier is stored at.
+    ///         Equal to bytes32(uint256(keccak256("crossl2inbox.identifier.timestamp")) - 1)
+    bytes32 internal constant TIMESTAMP_SLOT = 0x2e148a404a50bb94820b576997fd6450117132387be615e460fa8c5e11777e02;
+
+    /// @notice Transient storage slot that the chainId for an Identifier is stored at.
+    ///         Equal to bytes32(uint256(keccak256("crossl2inbox.identifier.chainid")) - 1)
+    bytes32 internal constant CHAINID_SLOT = 0x6e0446e8b5098b8c8193f964f1b567ec3a2bdaeba33d36acb85c1f1d3f92d313;
+
+    /// @notice Semantic version.
+    /// @custom:semver 0.1.0
+    string public constant version = "0.1.0";
+
+    /// @notice Emitted when a cross chain message is being executed.
+    /// @param encodedId Encoded Identifier of the message.
+    /// @param message   Message payload being executed.
+    event ExecutingMessage(bytes encodedId, bytes message);
+
+    /// @notice Enforces that cross domain message sender and source are set. Reverts if not.
+    ///         Used to differentiate between 0 and nil in transient storage.
+    modifier notEntered() {
+        if (TransientContext.callDepth() == 0) revert NotEntered();
+        _;
+    }
+
+    /// @notice Returns the origin address of the Identifier. If not entered, reverts.
+    /// @return Origin address of the Identifier.
+    function origin() external view notEntered returns (address) {
+        return address(uint160(TransientContext.get(ORIGIN_SLOT)));
+    }
+
+    /// @notice Returns the block number of the Identifier. If not entered, reverts.
+    /// @return Block number of the Identifier.
+    function blockNumber() external view notEntered returns (uint256) {
+        return TransientContext.get(BLOCK_NUMBER_SLOT);
+    }
+
+    /// @notice Returns the log index of the Identifier. If not entered, reverts.
+    /// @return Log index of the Identifier.
+    function logIndex() external view notEntered returns (uint256) {
+        return TransientContext.get(LOG_INDEX_SLOT);
+    }
+
+    /// @notice Returns the timestamp of the Identifier. If not entered, reverts.
+    /// @return Timestamp of the Identifier.
+    function timestamp() external view notEntered returns (uint256) {
+        return TransientContext.get(TIMESTAMP_SLOT);
+    }
+
+    /// @notice Returns the chain ID of the Identifier. If not entered, reverts.
+    /// @return _chainId The chain ID of the Identifier.
+    function chainId() external view notEntered returns (uint256) {
+        return TransientContext.get(CHAINID_SLOT);
+    }
+
+    /// @notice Executes a cross chain message on the destination chain.
+    /// @param _id      Identifier of the message.
+    /// @param _target  Target address to call.
+    /// @param _message Message payload to call target with.
+    function executeMessage(
+        Identifier calldata _id,
+        address _target,
+        bytes memory _message
+    )
+        external
+        payable
+        reentrantAware
+    {
+        if (_id.timestamp > block.timestamp) revert InvalidTimestamp();
+        if (!IDependencySet(Predeploys.L1_BLOCK_ATTRIBUTES).isInDependencySet(_id.chainId)) {
+            revert InvalidChainId();
+        }
+
+        // Store the Identifier in transient storage.
+        _storeIdentifier(_id);
+
+        // Call the target account with the message payload.
+        bool success = _callWithAllGas(_target, _message);
+
+        // Revert if the target call failed.
+        if (!success) revert TargetCallFailed();
+
+        emit ExecutingMessage(abi.encode(_id), _message);
+    }
+
+    /// @notice Stores the Identifier in transient storage.
+    /// @param _id Identifier to store.
+    function _storeIdentifier(Identifier calldata _id) internal {
+        TransientContext.set(ORIGIN_SLOT, uint160(_id.origin));
+        TransientContext.set(BLOCK_NUMBER_SLOT, _id.blockNumber);
+        TransientContext.set(LOG_INDEX_SLOT, _id.logIndex);
+        TransientContext.set(TIMESTAMP_SLOT, _id.timestamp);
+        TransientContext.set(CHAINID_SLOT, _id.chainId);
+    }
+
+    /// @notice Calls the target address with the message payload and all available gas.
+    /// @param _target  Target address to call.
+    /// @param _message Message payload to call target with.
+    /// @return _success True if the call was successful, and false otherwise.
+    function _callWithAllGas(address _target, bytes memory _message) internal returns (bool _success) {
+        assembly {
+            _success :=
+                call(
+                    gas(), // gas
+                    _target, // recipient
+                    callvalue(), // ether value
+                    add(_message, 32), // inloc
+                    mload(_message), // inlen
+                    0, // outloc
+                    0 // outlen
+                )
+        }
+    }
+}
diff --git a/packages/contracts-bedrock/src/L2/GasPriceOracle.sol b/packages/contracts-bedrock/src/L2/GasPriceOracle.sol
index 194bd68f7395..79c3eb431503 100644
--- a/packages/contracts-bedrock/src/L2/GasPriceOracle.sol
+++ b/packages/contracts-bedrock/src/L2/GasPriceOracle.sol
@@ -4,6 +4,8 @@ pragma solidity 0.8.15;
 import { ISemver } from "src/universal/ISemver.sol";
 import { Predeploys } from "src/libraries/Predeploys.sol";
 import { L1Block } from "src/L2/L1Block.sol";
+import { Constants } from "src/libraries/Constants.sol";
+import { LibZip } from "@solady/utils/LibZip.sol";
 
 /// @custom:proxied
 /// @custom:predeploy 0x420000000000000000000000000000000000000F
@@ -24,33 +26,77 @@ contract GasPriceOracle is ISemver {
     uint256 public constant DECIMALS = 6;
 
     /// @notice Semantic version.
-    /// @custom:semver 1.2.0
-    string public constant version = "1.2.0";
+    /// @custom:semver 1.3.0
+    string public constant version = "1.3.0";
+
+    /// @notice This is the intercept value for the linear regression used to estimate the final size of the
+    ///         compressed transaction.
+    int32 private constant COST_INTERCEPT = -42_585_600;
+
+    /// @notice This is the coefficient value for the linear regression used to estimate the final size of the
+    ///         compressed transaction.
+    uint32 private constant COST_FASTLZ_COEF = 836_500;
+
+    /// @notice This is the minimum bound for the fastlz to brotli size estimation. Any estimations below this
+    ///         are set to this value.
+    uint256 private constant MIN_TRANSACTION_SIZE = 100;
 
     /// @notice Indicates whether the network has gone through the Ecotone upgrade.
     bool public isEcotone;
 
+    /// @notice Indicates whether the network has gone through the Fjord upgrade.
+    bool public isFjord;
+
     /// @notice Computes the L1 portion of the fee based on the size of the rlp encoded input
     ///         transaction, the current L1 base fee, and the various dynamic parameters.
     /// @param _data Unsigned fully RLP-encoded transaction to get the L1 fee for.
     /// @return L1 fee that should be paid for the tx
     function getL1Fee(bytes memory _data) external view returns (uint256) {
-        if (isEcotone) {
+        if (isFjord) {
+            return _getL1FeeFjord(_data);
+        } else if (isEcotone) {
             return _getL1FeeEcotone(_data);
         }
         return _getL1FeeBedrock(_data);
     }
 
+    /// @notice returns an upper bound for the L1 fee for a given transaction size.
+    /// It is provided for callers who wish to estimate L1 transaction costs in the
+    /// write path, and is much more gas efficient than `getL1Fee`.
+    /// It assumes the worst case of fastlz upper-bound which covers %99.99 txs.
+    /// @param _unsignedTxSize Unsigned fully RLP-encoded transaction size to get the L1 fee for.
+    /// @return L1 estimated upper-bound fee that should be paid for the tx
+    function getL1FeeUpperBound(uint256 _unsignedTxSize) external view returns (uint256) {
+        require(isFjord, "GasPriceOracle: getL1FeeUpperBound only supports Fjord");
+
+        // Add 68 to the size to account for unsigned tx:
+        uint256 txSize = _unsignedTxSize + 68;
+        // txSize / 255 + 16 is the pratical fastlz upper-bound covers %99.99 txs.
+        uint256 flzUpperBound = txSize + txSize / 255 + 16;
+
+        return _fjordL1Cost(flzUpperBound);
+    }
+
     /// @notice Set chain to be Ecotone chain (callable by depositor account)
     function setEcotone() external {
         require(
-            msg.sender == L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).DEPOSITOR_ACCOUNT(),
+            msg.sender == Constants.DEPOSITOR_ACCOUNT,
             "GasPriceOracle: only the depositor account can set isEcotone flag"
         );
         require(isEcotone == false, "GasPriceOracle: Ecotone already active");
         isEcotone = true;
     }
 
+    /// @notice Set chain to be Fjord chain (callable by depositor account)
+    function setFjord() external {
+        require(
+            msg.sender == Constants.DEPOSITOR_ACCOUNT, "GasPriceOracle: only the depositor account can set isFjord flag"
+        );
+        require(isEcotone, "GasPriceOracle: Fjord can only be activated after Ecotone");
+        require(isFjord == false, "GasPriceOracle: Fjord already active");
+        isFjord = true;
+    }
+
     /// @notice Retrieves the current gas price (base fee).
     /// @return Current L2 gas price (base fee).
     function gasPrice() public view returns (uint256) {
@@ -114,7 +160,15 @@ contract GasPriceOracle is ISemver {
     ///         of padding to account for the fact that the input does not have a signature.
     /// @param _data Unsigned fully RLP-encoded transaction to get the L1 gas for.
     /// @return Amount of L1 gas used to publish the transaction.
+    /// @custom:deprecated This method does not accurately estimate the gas used for a transaction.
+    ///                    If you are calculating fees use getL1Fee or getL1FeeUpperBound.
     function getL1GasUsed(bytes memory _data) public view returns (uint256) {
+        if (isFjord) {
+            // Add 68 to the size to account for unsigned tx
+            // Assume the compressed data is mostly non-zero, and would pay 16 gas per calldata byte
+            // Divide by 1e6 due to the scaling factor of the linear regression
+            return _fjordLinearRegression(LibZip.flzCompress(_data).length + 68) * 16 / 1e6;
+        }
         uint256 l1GasUsed = _getCalldataGas(_data);
         if (isEcotone) {
             return l1GasUsed;
@@ -143,6 +197,13 @@ contract GasPriceOracle is ISemver {
         return fee / (16 * 10 ** DECIMALS);
     }
 
+    /// @notice L1 portion of the fee after Fjord.
+    /// @param _data Unsigned fully RLP-encoded transaction to get the L1 fee for.
+    /// @return L1 fee that should be paid for the tx
+    function _getL1FeeFjord(bytes memory _data) internal view returns (uint256) {
+        return _fjordL1Cost(LibZip.flzCompress(_data).length + 68);
+    }
+
     /// @notice L1 gas estimation calculation.
     /// @param _data Unsigned fully RLP-encoded transaction to get the L1 gas for.
     /// @return Amount of L1 gas used to publish the transaction.
@@ -158,4 +219,25 @@ contract GasPriceOracle is ISemver {
         }
         return total + (68 * 16);
     }
+
+    /// @notice Fjord L1 cost based on the compressed and original tx size.
+    /// @param _fastLzSize estimated compressed tx size.
+    /// @return Fjord L1 fee that should be paid for the tx
+    function _fjordL1Cost(uint256 _fastLzSize) internal view returns (uint256) {
+        // Apply the linear regression to estimate the Brotli 10 size
+        uint256 estimatedSize = _fjordLinearRegression(_fastLzSize);
+        uint256 feeScaled = baseFeeScalar() * 16 * l1BaseFee() + blobBaseFeeScalar() * blobBaseFee();
+        return estimatedSize * feeScaled / (10 ** (DECIMALS * 2));
+    }
+
+    /// @notice Takes the fastLz size compression and returns the estimated Brotli
+    /// @param _fastLzSize fastlz compressed tx size.
+    /// @return Number of bytes in the compressed transaction
+    function _fjordLinearRegression(uint256 _fastLzSize) internal pure returns (uint256) {
+        int256 estimatedSize = COST_INTERCEPT + int256(COST_FASTLZ_COEF * _fastLzSize);
+        if (estimatedSize < int256(MIN_TRANSACTION_SIZE) * 1e6) {
+            estimatedSize = int256(MIN_TRANSACTION_SIZE) * 1e6;
+        }
+        return uint256(estimatedSize);
+    }
 }
diff --git a/packages/contracts-bedrock/src/L2/ICrossL2Inbox.sol b/packages/contracts-bedrock/src/L2/ICrossL2Inbox.sol
new file mode 100644
index 000000000000..25cc116c1da0
--- /dev/null
+++ b/packages/contracts-bedrock/src/L2/ICrossL2Inbox.sol
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+/// @title ICrossL2Inbox
+/// @notice Interface for the CrossL2Inbox contract.
+interface ICrossL2Inbox {
+    /// @notice The struct for a pointer to a message payload in a remote (or local) chain.
+    struct Identifier {
+        address origin;
+        uint256 blockNumber;
+        uint256 logIndex;
+        uint256 timestamp;
+        uint256 chainId;
+    }
+
+    /// @notice Returns the origin address of the Identifier.
+    /// @return _origin The origin address of the Identifier.
+    function origin() external view returns (address _origin);
+
+    /// @notice Returns the block number of the Identifier.
+    /// @return _blockNumber The block number of the Identifier.
+    function blockNumber() external view returns (uint256 _blockNumber);
+
+    /// @notice Returns the log index of the Identifier.
+    /// @return _logIndex The log index of the Identifier.
+    function logIndex() external view returns (uint256 _logIndex);
+
+    /// @notice Returns the timestamp of the Identifier.
+    /// @return _timestamp The timestamp of the Identifier.
+    function timestamp() external view returns (uint256 _timestamp);
+
+    /// @notice Returns the chain ID of the Identifier.
+    /// @return _chainId The chain ID of the Identifier.
+    function chainId() external view returns (uint256 _chainId);
+
+    /// @notice Executes a cross chain message on the destination chain.
+    /// @param _id An Identifier pointing to the initiating message.
+    /// @param _target Account that is called with _msg.
+    /// @param _msg The message payload, matching the initiating message.
+    function executeMessage(
+        ICrossL2Inbox.Identifier calldata _id,
+        address _target,
+        bytes calldata _msg
+    )
+        external
+        payable;
+}
diff --git a/packages/contracts-bedrock/src/L2/IL2ToL2CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L2/IL2ToL2CrossDomainMessenger.sol
new file mode 100644
index 000000000000..19a627ff9a30
--- /dev/null
+++ b/packages/contracts-bedrock/src/L2/IL2ToL2CrossDomainMessenger.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+/// @title IL2ToL2CrossDomainMessenger
+/// @notice Interface for the L2ToL2CrossDomainMessenger contract.
+interface IL2ToL2CrossDomainMessenger {
+    /// @notice Retrieves the sender of the current cross domain message.
+    /// @return _sender Address of the sender of the current cross domain message.
+    function crossDomainMessageSender() external view returns (address _sender);
+
+    /// @notice Retrieves the source of the current cross domain message.
+    /// @return _source Chain ID of the source of the current cross domain message.
+    function crossDomainMessageSource() external view returns (uint256 _source);
+
+    /// @notice Sends a message to some target address on a destination chain. Note that if the call
+    ///         always reverts, then the message will be unrelayable, and any ETH sent will be
+    ///         permanently locked. The same will occur if the target on the other chain is
+    ///         considered unsafe (see the _isUnsafeTarget() function).
+    /// @param _destination Chain ID of the destination chain.
+    /// @param _target      Target contract or wallet address.
+    /// @param _message     Message to trigger the target address with.
+    function sendMessage(uint256 _destination, address _target, bytes calldata _message) external payable;
+
+    /// @notice Relays a message that was sent by the other CrossDomainMessenger contract. Can only
+    ///         be executed via cross-chain call from the other messenger OR if the message was
+    ///         already received once and is currently being replayed.
+    /// @param _destination Chain ID of the destination chain.
+    /// @param _nonce       Nonce of the message being relayed.
+    /// @param _sender      Address of the user who sent the message.
+    /// @param _source      Chain ID of the source chain.
+    /// @param _target      Address that the message is targeted at.
+    /// @param _message     Message to send to the target.
+    function relayMessage(
+        uint256 _destination,
+        uint256 _source,
+        uint256 _nonce,
+        address _sender,
+        address _target,
+        bytes calldata _message
+    )
+        external
+        payable;
+}
diff --git a/packages/contracts-bedrock/src/L2/L1Block.sol b/packages/contracts-bedrock/src/L2/L1Block.sol
index fa59e66f78df..8cfbb391f0f5 100644
--- a/packages/contracts-bedrock/src/L2/L1Block.sol
+++ b/packages/contracts-bedrock/src/L2/L1Block.sol
@@ -2,6 +2,9 @@
 pragma solidity 0.8.15;
 
 import { ISemver } from "src/universal/ISemver.sol";
+import { Constants } from "src/libraries/Constants.sol";
+import { GasPayingToken, IGasToken } from "src/libraries/GasPayingToken.sol";
+import "src/libraries/L1BlockErrors.sol";
 
 /// @custom:proxied
 /// @custom:predeploy 0x4200000000000000000000000000000000000015
@@ -10,9 +13,14 @@ import { ISemver } from "src/universal/ISemver.sol";
 ///         Values within this contract are updated once per epoch (every L1 block) and can only be
 ///         set by the "depositor" account, a special system address. Depositor account transactions
 ///         are created by the protocol whenever we move to a new epoch.
-contract L1Block is ISemver {
+contract L1Block is ISemver, IGasToken {
+    /// @notice Event emitted when the gas paying token is set.
+    event GasPayingTokenSet(address indexed token, uint8 indexed decimals, bytes32 name, bytes32 symbol);
+
     /// @notice Address of the special depositor account.
-    address public constant DEPOSITOR_ACCOUNT = 0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001;
+    function DEPOSITOR_ACCOUNT() public pure returns (address addr_) {
+        addr_ = Constants.DEPOSITOR_ACCOUNT;
+    }
 
     /// @notice The latest L1 block number known by the L2 system.
     uint64 public number;
@@ -49,8 +57,35 @@ contract L1Block is ISemver {
     /// @notice The latest L1 blob base fee.
     uint256 public blobBaseFee;
 
-    /// @custom:semver 1.2.0
-    string public constant version = "1.2.0";
+    /// @custom:semver 1.4.1-beta.1
+    function version() public pure virtual returns (string memory) {
+        return "1.4.1-beta.1";
+    }
+
+    /// @notice Returns the gas paying token, its decimals, name and symbol.
+    ///         If nothing is set in state, then it means ether is used.
+    function gasPayingToken() public view returns (address addr_, uint8 decimals_) {
+        (addr_, decimals_) = GasPayingToken.getToken();
+    }
+
+    /// @notice Returns the gas paying token name.
+    ///         If nothing is set in state, then it means ether is used.
+    function gasPayingTokenName() public view returns (string memory name_) {
+        name_ = GasPayingToken.getName();
+    }
+
+    /// @notice Returns the gas paying token symbol.
+    ///         If nothing is set in state, then it means ether is used.
+    function gasPayingTokenSymbol() public view returns (string memory symbol_) {
+        symbol_ = GasPayingToken.getSymbol();
+    }
+
+    /// @notice Getter for custom gas token paying networks. Returns true if the
+    ///         network uses a custom gas token.
+    function isCustomGasToken() public view returns (bool) {
+        (address token,) = gasPayingToken();
+        return token != Constants.ETHER;
+    }
 
     /// @custom:legacy
     /// @notice Updates the L1 block values.
@@ -74,7 +109,7 @@ contract L1Block is ISemver {
     )
         external
     {
-        require(msg.sender == DEPOSITOR_ACCOUNT, "L1Block: only the depositor account can set L1 block values");
+        require(msg.sender == DEPOSITOR_ACCOUNT(), "L1Block: only the depositor account can set L1 block values");
 
         number = _number;
         timestamp = _timestamp;
@@ -99,13 +134,13 @@ contract L1Block is ISemver {
     ///   8. _hash               L1 blockhash.
     ///   9. _batcherHash        Versioned hash to authenticate batcher by.
     function setL1BlockValuesEcotone() external {
+        address depositor = DEPOSITOR_ACCOUNT();
         assembly {
             // Revert if the caller is not the depositor account.
-            if xor(caller(), DEPOSITOR_ACCOUNT) {
+            if xor(caller(), depositor) {
                 mstore(0x00, 0x3cc50b45) // 0x3cc50b45 is the 4-byte selector of "NotDepositor()"
                 revert(0x1C, 0x04) // returns the stored 4-byte selector from above
             }
-            let data := calldataload(4)
             // sequencenum (uint64), blobBaseFeeScalar (uint32), baseFeeScalar (uint32)
             sstore(sequenceNumber.slot, shr(128, calldataload(4)))
             // number (uint64) and timestamp (uint64)
@@ -116,4 +151,15 @@ contract L1Block is ISemver {
             sstore(batcherHash.slot, calldataload(132)) // bytes32
         }
     }
+
+    /// @notice Sets the gas paying token for the L2 system. Can only be called by the special
+    ///         depositor account. This function is not called on every L2 block but instead
+    ///         only called by specially crafted L1 deposit transactions.
+    function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) external {
+        if (msg.sender != DEPOSITOR_ACCOUNT()) revert NotDepositor();
+
+        GasPayingToken.set({ _token: _token, _decimals: _decimals, _name: _name, _symbol: _symbol });
+
+        emit GasPayingTokenSet({ token: _token, decimals: _decimals, name: _name, symbol: _symbol });
+    }
 }
diff --git a/packages/contracts-bedrock/src/L2/L1BlockInterop.sol b/packages/contracts-bedrock/src/L2/L1BlockInterop.sol
new file mode 100644
index 000000000000..8dbf986fb7e6
--- /dev/null
+++ b/packages/contracts-bedrock/src/L2/L1BlockInterop.sol
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { L1Block } from "src/L2/L1Block.sol";
+import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
+import { GasPayingToken } from "src/libraries/GasPayingToken.sol";
+import { StaticConfig } from "src/libraries/StaticConfig.sol";
+import "src/libraries/L1BlockErrors.sol";
+
+/// @notice Enum representing different types of configurations that can be set on L1BlockInterop.
+/// @custom:value SET_GAS_PAYING_TOKEN  Represents the config type for setting the gas paying token.
+/// @custom:value ADD_DEPENDENCY        Represents the config type for adding a chain to the interop dependency set.
+/// @custom:value REMOVE_DEPENDENCY     Represents the config type for removing a chain from the interop dependency set.
+enum ConfigType {
+    SET_GAS_PAYING_TOKEN,
+    ADD_DEPENDENCY,
+    REMOVE_DEPENDENCY
+}
+
+/// @custom:proxied
+/// @custom:predeploy 0x4200000000000000000000000000000000000015
+/// @title L1BlockInterop
+/// @notice Interop extenstions of L1Block.
+contract L1BlockInterop is L1Block {
+    using EnumerableSet for EnumerableSet.UintSet;
+
+    /// @notice Event emitted when a new dependency is added to the interop dependency set.
+    event DependencyAdded(uint256 indexed chainId);
+
+    /// @notice Event emitted when a dependency is removed from the interop dependency set.
+    event DependencyRemoved(uint256 indexed chainId);
+
+    /// @notice The interop dependency set, containing the chain IDs in it.
+    EnumerableSet.UintSet dependencySet;
+
+    /// @custom:semver +interop
+    function version() public pure override returns (string memory) {
+        return string.concat(super.version(), "+interop");
+    }
+
+    /// @notice Returns true if a chain ID is in the interop dependency set and false otherwise.
+    ///         The chain's chain ID is always considered to be in the dependency set.
+    /// @param _chainId The chain ID to check.
+    /// @return True if the chain ID to check is in the interop dependency set. False otherwise.
+    function isInDependencySet(uint256 _chainId) public view returns (bool) {
+        return _chainId == block.chainid || dependencySet.contains(_chainId);
+    }
+
+    /// @notice Returns the size of the interop dependency set.
+    /// @return The size of the interop dependency set.
+    function dependencySetSize() external view returns (uint8) {
+        return uint8(dependencySet.length());
+    }
+
+    /// @notice Sets static configuration options for the L2 system. Can only be called by the special
+    ///         depositor account.
+    /// @param _type  The type of configuration to set.
+    /// @param _value The encoded value with which to set the configuration.
+    function setConfig(ConfigType _type, bytes calldata _value) external {
+        if (msg.sender != DEPOSITOR_ACCOUNT()) revert NotDepositor();
+
+        if (_type == ConfigType.SET_GAS_PAYING_TOKEN) {
+            _setGasPayingToken(_value);
+        } else if (_type == ConfigType.ADD_DEPENDENCY) {
+            _addDependency(_value);
+        } else if (_type == ConfigType.REMOVE_DEPENDENCY) {
+            _removeDependency(_value);
+        }
+    }
+
+    /// @notice Internal method to set the gas paying token.
+    /// @param _value The encoded value with which to set the gas paying token.
+    function _setGasPayingToken(bytes calldata _value) internal {
+        (address token, uint8 decimals, bytes32 name, bytes32 symbol) = StaticConfig.decodeSetGasPayingToken(_value);
+
+        GasPayingToken.set({ _token: token, _decimals: decimals, _name: name, _symbol: symbol });
+
+        emit GasPayingTokenSet({ token: token, decimals: decimals, name: name, symbol: symbol });
+    }
+
+    /// @notice Internal method to add a dependency to the interop dependency set.
+    /// @param _value The encoded value with which to add the dependency.
+    function _addDependency(bytes calldata _value) internal {
+        uint256 chainId = StaticConfig.decodeAddDependency(_value);
+
+        if (dependencySet.length() == type(uint8).max) revert DependencySetSizeTooLarge();
+
+        if (chainId == block.chainid || !dependencySet.add(chainId)) revert AlreadyDependency();
+
+        emit DependencyAdded(chainId);
+    }
+
+    /// @notice Internal method to remove a dependency from the interop dependency set.
+    /// @param _value The encoded value with which to remove the dependency.
+    function _removeDependency(bytes calldata _value) internal {
+        uint256 chainId = StaticConfig.decodeRemoveDependency(_value);
+
+        if (chainId == block.chainid) revert CantRemovedDependency();
+
+        if (!dependencySet.remove(chainId)) revert NotDependency();
+
+        emit DependencyRemoved(chainId);
+    }
+}
diff --git a/packages/contracts-bedrock/src/L2/L2CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L2/L2CrossDomainMessenger.sol
index ad0e117d3f7c..d504b2d40d32 100644
--- a/packages/contracts-bedrock/src/L2/L2CrossDomainMessenger.sol
+++ b/packages/contracts-bedrock/src/L2/L2CrossDomainMessenger.sol
@@ -7,6 +7,8 @@ import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
 import { ISemver } from "src/universal/ISemver.sol";
 import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
 import { Constants } from "src/libraries/Constants.sol";
+import { L1Block } from "src/L2/L1Block.sol";
+import { Predeploys } from "src/libraries/Predeploys.sol";
 
 /// @custom:proxied
 /// @custom:predeploy 0x4200000000000000000000000000000000000007
@@ -15,8 +17,8 @@ import { Constants } from "src/libraries/Constants.sol";
 ///         L2 on the L2 side. Users are generally encouraged to use this contract instead of lower
 ///         level message passing contracts.
 contract L2CrossDomainMessenger is CrossDomainMessenger, ISemver {
-    /// @custom:semver 2.0.0
-    string public constant version = "2.0.0";
+    /// @custom:semver 2.1.0
+    string public constant version = "2.1.0";
 
     /// @notice Constructs the L2CrossDomainMessenger contract.
     constructor() CrossDomainMessenger() {
@@ -44,6 +46,11 @@ contract L2CrossDomainMessenger is CrossDomainMessenger, ISemver {
         );
     }
 
+    /// @inheritdoc CrossDomainMessenger
+    function gasPayingToken() internal view override returns (address addr_, uint8 decimals_) {
+        (addr_, decimals_) = L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).gasPayingToken();
+    }
+
     /// @inheritdoc CrossDomainMessenger
     function _isOtherMessenger() internal view override returns (bool) {
         return AddressAliasHelper.undoL1ToL2Alias(msg.sender) == address(otherMessenger);
diff --git a/packages/contracts-bedrock/src/L2/L2StandardBridge.sol b/packages/contracts-bedrock/src/L2/L2StandardBridge.sol
index 69319560ae10..1472d0fd9e86 100644
--- a/packages/contracts-bedrock/src/L2/L2StandardBridge.sol
+++ b/packages/contracts-bedrock/src/L2/L2StandardBridge.sol
@@ -6,7 +6,7 @@ import { StandardBridge } from "src/universal/StandardBridge.sol";
 import { ISemver } from "src/universal/ISemver.sol";
 import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
 import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
-import { Constants } from "src/libraries/Constants.sol";
+import { L1Block } from "src/L2/L1Block.sol";
 
 /// @custom:proxied
 /// @custom:predeploy 0x4200000000000000000000000000000000000010
@@ -52,8 +52,8 @@ contract L2StandardBridge is StandardBridge, ISemver {
         bytes extraData
     );
 
-    /// @custom:semver 1.8.0
-    string public constant version = "1.8.0";
+    /// @custom:semver 1.10.0
+    string public constant version = "1.10.0";
 
     /// @notice Constructs the L2StandardBridge contract.
     constructor() StandardBridge() {
@@ -76,10 +76,16 @@ contract L2StandardBridge is StandardBridge, ISemver {
         );
     }
 
+    /// @inheritdoc StandardBridge
+    function gasPayingToken() internal view override returns (address addr_, uint8 decimals_) {
+        (addr_, decimals_) = L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).gasPayingToken();
+    }
+
     /// @custom:legacy
     /// @notice Initiates a withdrawal from L2 to L1.
     ///         This function only works with OptimismMintableERC20 tokens or ether. Use the
     ///         `bridgeERC20` function to bridge native L2 tokens to L1.
+    ///         Subject to be deprecated in the future.
     /// @param _l2Token     Address of the L2 token to withdraw.
     /// @param _amount      Amount of the L2 token to withdraw.
     /// @param _minGasLimit Minimum gas limit to use for the transaction.
@@ -95,6 +101,7 @@ contract L2StandardBridge is StandardBridge, ISemver {
         virtual
         onlyEOA
     {
+        require(isCustomGasToken() == false, "L2StandardBridge: not supported with custom gas token");
         _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _minGasLimit, _extraData);
     }
 
@@ -106,6 +113,7 @@ contract L2StandardBridge is StandardBridge, ISemver {
     ///         call will fail for any amount of gas, then the ETH will be locked permanently.
     ///         This function only works with OptimismMintableERC20 tokens or ether. Use the
     ///         `bridgeERC20To` function to bridge native L2 tokens to L1.
+    ///         Subject to be deprecated in the future.
     /// @param _l2Token     Address of the L2 token to withdraw.
     /// @param _to          Recipient account on L1.
     /// @param _amount      Amount of the L2 token to withdraw.
@@ -122,37 +130,10 @@ contract L2StandardBridge is StandardBridge, ISemver {
         payable
         virtual
     {
+        require(isCustomGasToken() == false, "L2StandardBridge: not supported with custom gas token");
         _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _minGasLimit, _extraData);
     }
 
-    /// @custom:legacy
-    /// @notice Finalizes a deposit from L1 to L2. To finalize a deposit of ether, use address(0)
-    ///         and the l1Token and the Legacy ERC20 ether predeploy address as the l2Token.
-    /// @param _l1Token   Address of the L1 token to deposit.
-    /// @param _l2Token   Address of the corresponding L2 token.
-    /// @param _from      Address of the depositor.
-    /// @param _to        Address of the recipient.
-    /// @param _amount    Amount of the tokens being deposited.
-    /// @param _extraData Extra data attached to the deposit.
-    function finalizeDeposit(
-        address _l1Token,
-        address _l2Token,
-        address _from,
-        address _to,
-        uint256 _amount,
-        bytes calldata _extraData
-    )
-        external
-        payable
-        virtual
-    {
-        if (_l1Token == address(0) && _l2Token == Predeploys.LEGACY_ERC20_ETH) {
-            finalizeBridgeETH(_from, _to, _amount, _extraData);
-        } else {
-            finalizeBridgeERC20(_l2Token, _l1Token, _from, _to, _amount, _extraData);
-        }
-    }
-
     /// @custom:legacy
     /// @notice Retrieves the access of the corresponding L1 bridge contract.
     /// @return Address of the corresponding L1 bridge contract.
diff --git a/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol
new file mode 100644
index 000000000000..fe851c5523c8
--- /dev/null
+++ b/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol
@@ -0,0 +1,235 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.25;
+
+import { Encoding } from "src/libraries/Encoding.sol";
+import { Predeploys } from "src/libraries/Predeploys.sol";
+import { CrossL2Inbox } from "src/L2/CrossL2Inbox.sol";
+import { IL2ToL2CrossDomainMessenger } from "src/L2/IL2ToL2CrossDomainMessenger.sol";
+import { ISemver } from "src/universal/ISemver.sol";
+
+/// @notice Thrown when a non-written slot in transient storage is attempted to be read from.
+error NotEntered();
+
+/// @notice Thrown when attempting to send a message to the chain that the message is being sent from.
+error MessageDestinationSameChain();
+
+/// @notice Thrown when attempting to relay a message and the function caller (msg.sender) is not CrossL2Inbox.
+error RelayMessageCallerNotCrossL2Inbox();
+
+/// @notice Thrown when attempting to relay a message where CrossL2Inbox's origin is not L2ToL2CrossDomainMessenger.
+error CrossL2InboxOriginNotL2ToL2CrossDomainMessenger();
+
+/// @notice Thrown when attempting to relay a message whose destination chain is not the chain relaying it.
+error MessageDestinationNotRelayChain();
+
+/// @notice Thrown when attempting to relay a message whose target is CrossL2Inbox.
+error MessageTargetCrossL2Inbox();
+
+/// @notice Thrown when attempting to relay a message whose target is L2ToL2CrossDomainMessenger.
+error MessageTargetL2ToL2CrossDomainMessenger();
+
+/// @notice Thrown when attempting to relay a message that has already been relayed.
+error MessageAlreadyRelayed();
+
+/// @notice Thrown when a reentrant call is detected.
+error ReentrantCall();
+
+/// @custom:proxied
+/// @custom:predeploy 0x4200000000000000000000000000000000000023
+/// @title L2ToL2CrossDomainMessenger
+/// @notice The L2ToL2CrossDomainMessenger is a higher level abstraction on top of the CrossL2Inbox that provides
+///         features necessary for secure transfers ERC20 tokens between L2 chains. Messages sent through the
+///         L2ToL2CrossDomainMessenger on the source chain receive both replay protection as well as domain binding.
+contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver {
+    /// @notice Storage slot for `entered` value.
+    ///         Equal to bytes32(uint256(keccak256("l2tol2crossdomainmessenger.entered")) - 1)
+    bytes32 internal constant ENTERED_SLOT = 0xf53fc38c5e461bdcbbeb47887fecf014abd399293109cd50f65e5f9078cfd025;
+
+    /// @notice Storage slot for the sender of the current cross domain message.
+    ///         Equal to bytes32(uint256(keccak256("l2tol2crossdomainmessenger.sender")) - 1)
+    bytes32 internal constant CROSS_DOMAIN_MESSAGE_SENDER_SLOT =
+        0xb83444d07072b122e2e72a669ce32857d892345c19856f4e7142d06a167ab3f3;
+
+    /// @notice Storage slot for the source of the current cross domain message.
+    ///         Equal to bytes32(uint256(keccak256("l2tol2crossdomainmessenger.source")) - 1)
+    bytes32 internal constant CROSS_DOMAIN_MESSAGE_SOURCE_SLOT =
+        0x711dfa3259c842fffc17d6e1f1e0fc5927756133a2345ca56b4cb8178589fee7;
+
+    /// @notice Current message version identifier.
+    uint16 public constant messageVersion = uint16(0);
+
+    /// @notice Semantic version.
+    /// @custom:semver 0.1.0
+    string public constant version = "0.1.0";
+
+    /// @notice Mapping of message hashes to boolean receipt values. Note that a message will only be present in this
+    ///         mapping if it has successfully been relayed on this chain, and can therefore not be relayed again.
+    mapping(bytes32 => bool) public successfulMessages;
+
+    /// @notice Nonce for the next message to be sent, without the message version applied. Use the messageNonce getter,
+    ///         which will insert the message version into the nonce to give you the actual nonce to be used for the
+    ///         message.
+    uint240 internal msgNonce;
+
+    /// @notice Emitted whenever a message is sent to the other chain.
+    /// @param data Encoded data of the message that was sent.
+    event SentMessage(bytes data) anonymous;
+
+    /// @notice Emitted whenever a message is successfully relayed on this chain.
+    /// @param messageHash Hash of the message that was relayed.
+    event RelayedMessage(bytes32 indexed messageHash);
+
+    /// @notice Emitted whenever a message fails to be relayed on this chain.
+    /// @param messageHash Hash of the message that failed to be relayed.
+    event FailedRelayedMessage(bytes32 indexed messageHash);
+
+    /// @notice Enforces that a function cannot be re-entered.
+    modifier nonReentrant() {
+        if (_entered()) revert ReentrantCall();
+        assembly {
+            tstore(ENTERED_SLOT, 1)
+        }
+        _;
+        assembly {
+            tstore(ENTERED_SLOT, 0)
+        }
+    }
+
+    /// @notice Enforces that cross domain message sender and source are set. Reverts if not.
+    ///         Used to differentiate between 0 and nil in transient storage.
+    modifier onlyEntered() {
+        if (!_entered()) revert NotEntered();
+        _;
+    }
+
+    /// @notice Retrieves the sender of the current cross domain message. If not entered, reverts.
+    /// @return _sender Address of the sender of the current cross domain message.
+    function crossDomainMessageSender() external view onlyEntered returns (address _sender) {
+        assembly {
+            _sender := tload(CROSS_DOMAIN_MESSAGE_SENDER_SLOT)
+        }
+    }
+
+    /// @notice Retrieves the source of the current cross domain message. If not entered, reverts.
+    /// @return _source Chain ID of the source of the current cross domain message.
+    function crossDomainMessageSource() external view onlyEntered returns (uint256 _source) {
+        assembly {
+            _source := tload(CROSS_DOMAIN_MESSAGE_SOURCE_SLOT)
+        }
+    }
+
+    /// @notice Sends a message to some target address on a destination chain. Note that if the call always reverts,
+    ///         then the message will be unrelayable and any ETH sent will be permanently locked. The same will occur
+    ///         if the target on the other chain is considered unsafe (see the _isUnsafeTarget() function).
+    /// @param _destination Chain ID of the destination chain.
+    /// @param _target      Target contract or wallet address.
+    /// @param _message     Message payload to call target with.
+    function sendMessage(uint256 _destination, address _target, bytes calldata _message) external payable {
+        if (_destination == block.chainid) revert MessageDestinationSameChain();
+        if (_target == Predeploys.CROSS_L2_INBOX) revert MessageTargetCrossL2Inbox();
+        if (_target == Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER) revert MessageTargetL2ToL2CrossDomainMessenger();
+
+        bytes memory data = abi.encodeCall(
+            L2ToL2CrossDomainMessenger.relayMessage,
+            (_destination, block.chainid, messageNonce(), msg.sender, _target, _message)
+        );
+        emit SentMessage(data);
+        msgNonce++;
+    }
+
+    /// @notice Relays a message that was sent by the other CrossDomainMessenger contract. Can only be executed via
+    ///         cross-chain call from the other messenger OR if the message was already received once and is currently
+    ///         being replayed.
+    /// @param _destination Chain ID of the destination chain.
+    /// @param _source      Chain ID of the source chain.
+    /// @param _nonce       Nonce of the message being relayed.
+    /// @param _sender      Address of the user who sent the message.
+    /// @param _target      Address that the message is targeted at.
+    /// @param _message     Message payload to call target with.
+    function relayMessage(
+        uint256 _destination,
+        uint256 _source,
+        uint256 _nonce,
+        address _sender,
+        address _target,
+        bytes memory _message
+    )
+        external
+        payable
+        nonReentrant
+    {
+        if (msg.sender != Predeploys.CROSS_L2_INBOX) revert RelayMessageCallerNotCrossL2Inbox();
+        if (CrossL2Inbox(Predeploys.CROSS_L2_INBOX).origin() != Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER) {
+            revert CrossL2InboxOriginNotL2ToL2CrossDomainMessenger();
+        }
+        if (_destination != block.chainid) revert MessageDestinationNotRelayChain();
+        if (_target == Predeploys.CROSS_L2_INBOX) revert MessageTargetCrossL2Inbox();
+        if (_target == Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER) {
+            revert MessageTargetL2ToL2CrossDomainMessenger();
+        }
+
+        bytes32 messageHash = keccak256(abi.encode(_destination, _source, _nonce, _sender, _target, _message));
+        if (successfulMessages[messageHash]) {
+            revert MessageAlreadyRelayed();
+        }
+
+        _storeMessageMetadata(_source, _sender);
+
+        bool success = _callWithAllGas(_target, _message);
+
+        if (success) {
+            successfulMessages[messageHash] = true;
+            emit RelayedMessage(messageHash);
+        } else {
+            emit FailedRelayedMessage(messageHash);
+        }
+
+        _storeMessageMetadata(0, address(0));
+    }
+
+    /// @notice Retrieves the next message nonce. Message version will be added to the upper two bytes of the message
+    ///         nonce. Message version allows us to treat messages as having different structures.
+    /// @return Nonce of the next message to be sent, with added message version.
+    function messageNonce() public view returns (uint256) {
+        return Encoding.encodeVersionedNonce(msgNonce, messageVersion);
+    }
+
+    /// @notice Retrieves whether the contract is currently entered or not.
+    /// @return True if the contract is entered, and false otherwise.
+    function _entered() internal view returns (bool) {
+        uint256 value;
+        assembly {
+            value := tload(ENTERED_SLOT)
+        }
+        return value != 0;
+    }
+
+    /// @notice Stores message data such as sender and source in transient storage.
+    /// @param _source Chain ID of the source chain.
+    /// @param _sender Address of the sender of the message.
+    function _storeMessageMetadata(uint256 _source, address _sender) internal {
+        assembly {
+            tstore(CROSS_DOMAIN_MESSAGE_SENDER_SLOT, _sender)
+            tstore(CROSS_DOMAIN_MESSAGE_SOURCE_SLOT, _source)
+        }
+    }
+
+    /// @notice Calls the target address with the message payload and all available gas.
+    /// @param _target  Target address to call.
+    /// @param _message Message payload to call target with.
+    /// @return _success True if the call was successful, and false otherwise.
+    function _callWithAllGas(address _target, bytes memory _message) internal returns (bool _success) {
+        assembly {
+            _success :=
+                call(
+                    gas(), // gas
+                    _target, // recipient
+                    callvalue(), // ether value
+                    add(_message, 32), // inloc
+                    mload(_message), // inlen
+                    0, // outloc
+                    0 // outlen
+                )
+        }
+    }
+}
diff --git a/packages/contracts-bedrock/src/L2/WETH.sol b/packages/contracts-bedrock/src/L2/WETH.sol
new file mode 100644
index 000000000000..42b957f45e95
--- /dev/null
+++ b/packages/contracts-bedrock/src/L2/WETH.sol
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { WETH98 } from "src/dispute/weth/WETH98.sol";
+import { Predeploys } from "src/libraries/Predeploys.sol";
+import { L1Block } from "src/L2/L1Block.sol";
+import { ISemver } from "src/universal/ISemver.sol";
+
+/// @title WETH contract that reads the name and symbol from the L1Block contract.
+///        Allows for nice rendering of token names for chains using custom gas token.
+contract WETH is WETH98, ISemver {
+    /// @custom:semver 1.0.0
+    string public constant version = "1.0.0";
+
+    /// @notice Returns the name of the wrapped native asset. Will be "Wrapped Ether"
+    ///         if the native asset is Ether.
+    function name() external view override returns (string memory name_) {
+        name_ = string.concat("Wrapped ", L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).gasPayingTokenName());
+    }
+
+    /// @notice Returns the symbol of the wrapped native asset. Will be "WETH" if the
+    ///         native asset is Ether.
+    function symbol() external view override returns (string memory symbol_) {
+        symbol_ = string.concat("W", L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).gasPayingTokenSymbol());
+    }
+}
diff --git a/packages/contracts-bedrock/src/Safe/DeputyGuardianModule.sol b/packages/contracts-bedrock/src/Safe/DeputyGuardianModule.sol
new file mode 100644
index 000000000000..d88fe317f9a8
--- /dev/null
+++ b/packages/contracts-bedrock/src/Safe/DeputyGuardianModule.sol
@@ -0,0 +1,144 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol";
+import { Enum } from "safe-contracts/common/Enum.sol";
+
+import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
+import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol";
+import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
+import { ISemver } from "src/universal/ISemver.sol";
+import { Unauthorized } from "src/libraries/PortalErrors.sol";
+
+import "src/dispute/lib/Types.sol";
+
+/// @title DeputyGuardianModule
+/// @notice This module is intended to be enabled on the Security Council Safe, which will own the Guardian role in the
+///         SuperchainConfig contract. The DeputyGuardianModule should allow a Deputy Guardian to administer any of the
+///         actions that the Guardian is authorized to take. The security council can revoke the Deputy Guardian's
+///         authorization at any time by disabling this module.
+contract DeputyGuardianModule is ISemver {
+    /// @notice Error message for failed transaction execution
+    error ExecutionFailed(string);
+
+    /// @notice Emitted when the SuperchainConfig is paused
+    event Paused(string identifier);
+
+    /// @notice Emitted when the SuperchainConfig is unpaused
+    event Unpaused();
+
+    /// @notice Emitted when a DisputeGame is blacklisted
+    event DisputeGameBlacklisted(IDisputeGame indexed game);
+
+    /// @notice Emitted when the respected game type is set
+    event RespectedGameTypeSet(GameType indexed gameType, Timestamp indexed updatedAt);
+
+    /// @notice The Safe contract instance
+    Safe internal immutable SAFE;
+
+    /// @notice The SuperchainConfig's address
+    SuperchainConfig internal immutable SUPERCHAIN_CONFIG;
+
+    /// @notice The deputy guardian's address
+    address internal immutable DEPUTY_GUARDIAN;
+
+    /// @notice Semantic version.
+    /// @custom:semver 1.1.0
+    string public constant version = "1.1.0";
+
+    // Constructor to initialize the Safe and baseModule instances
+    constructor(Safe _safe, SuperchainConfig _superchainConfig, address _deputyGuardian) {
+        SAFE = _safe;
+        SUPERCHAIN_CONFIG = _superchainConfig;
+        DEPUTY_GUARDIAN = _deputyGuardian;
+    }
+
+    /// @notice Getter function for the Safe contract instance
+    /// @return safe_ The Safe contract instance
+    function safe() public view returns (Safe safe_) {
+        safe_ = SAFE;
+    }
+
+    /// @notice Getter function for the SuperchainConfig's address
+    /// @return superchainConfig_ The SuperchainConfig's address
+    function superchainConfig() public view returns (SuperchainConfig superchainConfig_) {
+        superchainConfig_ = SUPERCHAIN_CONFIG;
+    }
+
+    /// @notice Getter function for the deputy guardian's address
+    /// @return deputyGuardian_ The deputy guardian's address
+    function deputyGuardian() public view returns (address deputyGuardian_) {
+        deputyGuardian_ = DEPUTY_GUARDIAN;
+    }
+
+    /// @notice Internal function to ensure that only the deputy guardian can call certain functions.
+    function _onlyDeputyGuardian() internal view {
+        if (msg.sender != DEPUTY_GUARDIAN) {
+            revert Unauthorized();
+        }
+    }
+
+    /// @notice Calls the Security Council Safe's `execTransactionFromModuleReturnData()`, with the arguments
+    ///      necessary to call `pause()` on the `SuperchainConfig` contract.
+    ///      Only the deputy guardian can call this function.
+    function pause() external {
+        _onlyDeputyGuardian();
+
+        bytes memory data = abi.encodeCall(SUPERCHAIN_CONFIG.pause, ("Deputy Guardian"));
+        (bool success, bytes memory returnData) =
+            SAFE.execTransactionFromModuleReturnData(address(SUPERCHAIN_CONFIG), 0, data, Enum.Operation.Call);
+        if (!success) {
+            revert ExecutionFailed(string(returnData));
+        }
+        emit Paused("Deputy Guardian");
+    }
+
+    /// @notice Calls the Security Council Safe's `execTransactionFromModuleReturnData()`, with the arguments
+    ///      necessary to call `unpause()` on the `SuperchainConfig` contract.
+    ///      Only the deputy guardian can call this function.
+    function unpause() external {
+        _onlyDeputyGuardian();
+
+        bytes memory data = abi.encodeCall(SUPERCHAIN_CONFIG.unpause, ());
+        (bool success, bytes memory returnData) =
+            SAFE.execTransactionFromModuleReturnData(address(SUPERCHAIN_CONFIG), 0, data, Enum.Operation.Call);
+        if (!success) {
+            revert ExecutionFailed(string(returnData));
+        }
+        emit Unpaused();
+    }
+
+    /// @notice Calls the Security Council Safe's `execTransactionFromModuleReturnData()`, with the arguments
+    ///      necessary to call `blacklistDisputeGame()` on the `OptimismPortal2` contract.
+    ///      Only the deputy guardian can call this function.
+    /// @param _portal The `OptimismPortal2` contract instance.
+    /// @param _game The `IDisputeGame` contract instance.
+    function blacklistDisputeGame(OptimismPortal2 _portal, IDisputeGame _game) external {
+        _onlyDeputyGuardian();
+
+        bytes memory data = abi.encodeCall(OptimismPortal2.blacklistDisputeGame, (_game));
+        (bool success, bytes memory returnData) =
+            SAFE.execTransactionFromModuleReturnData(address(_portal), 0, data, Enum.Operation.Call);
+        if (!success) {
+            revert ExecutionFailed(string(returnData));
+        }
+        emit DisputeGameBlacklisted(_game);
+    }
+
+    /// @notice Calls the Security Council Safe's `execTransactionFromModuleReturnData()`, with the arguments
+    ///      necessary to call `setRespectedGameType()` on the `OptimismPortal2` contract.
+    ///      Only the deputy guardian can call this function.
+    /// @param _portal The `OptimismPortal2` contract instance.
+    /// @param _gameType The `GameType` to set as the respected game type.
+    function setRespectedGameType(OptimismPortal2 _portal, GameType _gameType) external {
+        _onlyDeputyGuardian();
+
+        bytes memory data = abi.encodeCall(OptimismPortal2.setRespectedGameType, (_gameType));
+        (bool success, bytes memory returnData) =
+            SAFE.execTransactionFromModuleReturnData(address(_portal), 0, data, Enum.Operation.Call);
+        if (!success) {
+            revert ExecutionFailed(string(returnData));
+        }
+        emit RespectedGameTypeSet(_gameType, Timestamp.wrap(uint64(block.timestamp)));
+    }
+}
diff --git a/packages/contracts-bedrock/src/Safe/LivenessGuard.sol b/packages/contracts-bedrock/src/Safe/LivenessGuard.sol
index ae2c5145514b..59b431de126a 100644
--- a/packages/contracts-bedrock/src/Safe/LivenessGuard.sol
+++ b/packages/contracts-bedrock/src/Safe/LivenessGuard.sol
@@ -1,9 +1,8 @@
 // SPDX-License-Identifier: MIT
 pragma solidity 0.8.15;
 
-import { Safe } from "safe-contracts/Safe.sol";
-import { BaseGuard, GuardManager } from "safe-contracts/base/GuardManager.sol";
-import { ModuleManager } from "safe-contracts/base/ModuleManager.sol";
+import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol";
+import { Guard as BaseGuard } from "safe-contracts/base/GuardManager.sol";
 import { SafeSigners } from "src/Safe/SafeSigners.sol";
 import { Enum } from "safe-contracts/common/Enum.sol";
 import { ISemver } from "src/universal/ISemver.sol";
diff --git a/packages/contracts-bedrock/src/Safe/LivenessModule.sol b/packages/contracts-bedrock/src/Safe/LivenessModule.sol
index 41f2ed64708e..17ec33f1a884 100644
--- a/packages/contracts-bedrock/src/Safe/LivenessModule.sol
+++ b/packages/contracts-bedrock/src/Safe/LivenessModule.sol
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 pragma solidity 0.8.15;
 
-import { Safe, OwnerManager } from "safe-contracts/Safe.sol";
+import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol";
 import { Enum } from "safe-contracts/common/Enum.sol";
 import { OwnerManager } from "safe-contracts/base/OwnerManager.sol";
 import { LivenessGuard } from "src/Safe/LivenessGuard.sol";
@@ -14,6 +14,18 @@ import { ISemver } from "src/universal/ISemver.sol";
 ///         If the number of owners falls below the minimum number of owners, the ownership of the
 ///         safe will be transferred to the fallback owner.
 contract LivenessModule is ISemver {
+    /// @notice Error message for failed owner removal.
+    error OwnerRemovalFailed(string);
+
+    /// @notice Emitted when an owner is removed due to insufficient liveness
+    event RemovedOwner(address indexed owner);
+
+    /// @notice Emitted when the fallback owner takes ownership
+    event OwnershipTransferredToFallback();
+
+    /// @notice Flag to indicate if the module has been deactivated
+    bool public ownershipTransferredToFallback;
+
     /// @notice The Safe contract instance
     Safe internal immutable SAFE;
 
@@ -29,6 +41,9 @@ contract LivenessModule is ISemver {
     ///         This can be updated by replacing with a new module.
     uint256 internal immutable MIN_OWNERS;
 
+    /// @notice The percentage used to calculate the threshold for the Safe.
+    uint256 internal immutable THRESHOLD_PERCENTAGE;
+
     /// @notice The fallback owner of the Safe
     ///         This can be updated by replacing with a new module.
     address internal immutable FALLBACK_OWNER;
@@ -38,8 +53,8 @@ contract LivenessModule is ISemver {
     uint256 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8;
 
     /// @notice Semantic version.
-    /// @custom:semver 1.0.0
-    string public constant version = "1.0.0";
+    /// @custom:semver 1.1.0
+    string public constant version = "1.2.0";
 
     // Constructor to initialize the Safe and baseModule instances
     constructor(
@@ -47,25 +62,25 @@ contract LivenessModule is ISemver {
         LivenessGuard _livenessGuard,
         uint256 _livenessInterval,
         uint256 _minOwners,
+        uint256 _thresholdPercentage,
         address _fallbackOwner
     ) {
         SAFE = _safe;
         LIVENESS_GUARD = _livenessGuard;
         LIVENESS_INTERVAL = _livenessInterval;
+        THRESHOLD_PERCENTAGE = _thresholdPercentage;
         FALLBACK_OWNER = _fallbackOwner;
         MIN_OWNERS = _minOwners;
         address[] memory owners = _safe.getOwners();
         require(_minOwners <= owners.length, "LivenessModule: minOwners must be less than the number of owners");
-        require(
-            _safe.getThreshold() >= get75PercentThreshold(owners.length),
-            "LivenessModule: Safe must have a threshold of at least 75% of the number of owners"
-        );
+        require(_thresholdPercentage > 0, "LivenessModule: thresholdPercentage must be greater than 0");
+        require(_thresholdPercentage <= 100, "LivenessModule: thresholdPercentage must be less than or equal to 100");
     }
 
-    /// @notice For a given number of owners, return the lowest threshold which is greater than 75.
+    /// @notice For a given number of owners, return the lowest threshold which is greater than the required percentage.
     ///         Note: this function returns 1 for numOwners == 1.
-    function get75PercentThreshold(uint256 _numOwners) public pure returns (uint256 threshold_) {
-        threshold_ = (_numOwners * 75 + 99) / 100;
+    function getRequiredThreshold(uint256 _numOwners) public view returns (uint256 threshold_) {
+        threshold_ = (_numOwners * THRESHOLD_PERCENTAGE + 99) / 100;
     }
 
     /// @notice Getter function for the Safe contract instance
@@ -92,7 +107,13 @@ contract LivenessModule is ISemver {
         minOwners_ = MIN_OWNERS;
     }
 
-    /// @notice Getter function for the fallback owner
+    /// @notice Getter function for the required threshold percentage
+    /// @return thresholdPercentage_ The minimum number of owners
+    function thresholdPercentage() public view returns (uint256 thresholdPercentage_) {
+        thresholdPercentage_ = THRESHOLD_PERCENTAGE;
+    }
+
+    /// @notice Getter function for the fallback
     /// @return fallbackOwner_ The fallback owner of the Safe
     function fallbackOwner() public view returns (address fallbackOwner_) {
         fallbackOwner_ = FALLBACK_OWNER;
@@ -113,11 +134,16 @@ contract LivenessModule is ISemver {
     /// @param _ownersToRemove The owners to remove
     function removeOwners(address[] memory _previousOwners, address[] memory _ownersToRemove) external {
         require(_previousOwners.length == _ownersToRemove.length, "LivenessModule: arrays must be the same length");
+        address[] memory currentOwners = SAFE.getOwners();
+        require(
+            !ownershipTransferredToFallback,
+            "LivenessModule: The safe has been shutdown, the LivenessModule and LivenessGuard should be removed or replaced."
+        );
 
         // Initialize the ownersCount count to the current number of owners, so that we can track the number of
         // owners in the Safe after each removal. The Safe will revert if an owner cannot be removed, so it is safe
         // keep a local count of the number of owners this way.
-        uint256 ownersCount = SAFE.getOwners().length;
+        uint256 ownersCount = currentOwners.length;
         for (uint256 i = 0; i < _previousOwners.length; i++) {
             // Validate that the owner can be removed, which means that either:
             //   1. the ownersCount is now less than MIN_OWNERS, in which case all owners should be removed regardless
@@ -155,7 +181,7 @@ contract LivenessModule is ISemver {
     /// @param _newOwnersCount New number of owners after removal.
     function _removeOwner(address _prevOwner, address _ownerToRemove, uint256 _newOwnersCount) internal {
         if (_newOwnersCount > 0) {
-            uint256 newThreshold = get75PercentThreshold(_newOwnersCount);
+            uint256 newThreshold = getRequiredThreshold(_newOwnersCount);
             // Remove the owner and update the threshold
             _removeOwnerSafeCall({ _prevOwner: _prevOwner, _owner: _ownerToRemove, _threshold: newThreshold });
         } else {
@@ -169,15 +195,19 @@ contract LivenessModule is ISemver {
     /// @param _prevOwner Owner that pointed to the owner to be replaced in the linked list
     /// @param _oldOwner Owner address to be replaced.
     function _swapToFallbackOwnerSafeCall(address _prevOwner, address _oldOwner) internal {
-        require(
-            SAFE.execTransactionFromModule({
-                to: address(SAFE),
-                value: 0,
-                operation: Enum.Operation.Call,
-                data: abi.encodeCall(OwnerManager.swapOwner, (_prevOwner, _oldOwner, FALLBACK_OWNER))
-            }),
-            "LivenessModule: failed to swap to fallback owner"
-        );
+        (bool success, bytes memory returnData) = SAFE.execTransactionFromModuleReturnData({
+            to: address(SAFE),
+            value: 0,
+            operation: Enum.Operation.Call,
+            data: abi.encodeCall(OwnerManager.swapOwner, (_prevOwner, _oldOwner, FALLBACK_OWNER))
+        });
+        if (!success) {
+            revert OwnerRemovalFailed(string(returnData));
+        }
+
+        // Deactivate the module to prevent unintended behavior after the fallback owner has taken ownership.
+        ownershipTransferredToFallback = true;
+        emit OwnershipTransferredToFallback();
     }
 
     /// @notice Removes the owner `owner` from the Safe and updates the threshold to `_threshold`.
@@ -185,15 +215,16 @@ contract LivenessModule is ISemver {
     /// @param _owner Owner address to be removed.
     /// @param _threshold New threshold.
     function _removeOwnerSafeCall(address _prevOwner, address _owner, uint256 _threshold) internal {
-        require(
-            SAFE.execTransactionFromModule({
-                to: address(SAFE),
-                value: 0,
-                operation: Enum.Operation.Call,
-                data: abi.encodeCall(OwnerManager.removeOwner, (_prevOwner, _owner, _threshold))
-            }),
-            "LivenessModule: failed to remove owner"
-        );
+        (bool success, bytes memory returnData) = SAFE.execTransactionFromModuleReturnData({
+            to: address(SAFE),
+            value: 0,
+            operation: Enum.Operation.Call,
+            data: abi.encodeCall(OwnerManager.removeOwner, (_prevOwner, _owner, _threshold))
+        });
+        if (!success) {
+            revert OwnerRemovalFailed(string(returnData));
+        }
+        emit RemovedOwner(_owner);
     }
 
     /// @notice A FREI-PI invariant check enforcing requirements on number of owners and threshold.
@@ -215,11 +246,11 @@ contract LivenessModule is ISemver {
 
         // Check that"LivenessModule: must remove all owners and transfer to fallback owner if numOwners < minOwners"
         // the threshold is correct. This check is also correct when there is a single
-        // owner, because get75PercentThreshold(1) returns 1.
+        // owner, because getRequiredThreshold(1) returns 1.
         uint256 threshold = SAFE.getThreshold();
         require(
-            threshold == get75PercentThreshold(numOwners),
-            "LivenessModule: Safe must have a threshold of 75% of the number of owners"
+            threshold == getRequiredThreshold(numOwners),
+            "LivenessModule: Insufficient threshold for the number of owners"
         );
 
         // Check that the guard has not been changed
diff --git a/packages/contracts-bedrock/src/cannon/MIPS.sol b/packages/contracts-bedrock/src/cannon/MIPS.sol
index 09be2d34b499..b47fb9313f7e 100644
--- a/packages/contracts-bedrock/src/cannon/MIPS.sol
+++ b/packages/contracts-bedrock/src/cannon/MIPS.sol
@@ -43,8 +43,8 @@ contract MIPS is ISemver {
     uint32 public constant BRK_START = 0x40000000;
 
     /// @notice The semantic version of the MIPS contract.
-    /// @custom:semver 0.1.0
-    string public constant version = "0.1.0";
+    /// @custom:semver 1.0.1
+    string public constant version = "1.0.1";
 
     uint32 internal constant FD_STDIN = 0;
     uint32 internal constant FD_STDOUT = 1;
@@ -422,6 +422,9 @@ contract MIPS is ISemver {
             // Stores the quotient in LO
             // And the remainder in HI
             else if (_func == 0x1a) {
+                if (int32(_rt) == 0) {
+                    revert("MIPS: division by zero");
+                }
                 state.hi = uint32(int32(_rs) % int32(_rt));
                 state.lo = uint32(int32(_rs) / int32(_rt));
             }
@@ -429,6 +432,9 @@ contract MIPS is ISemver {
             // Stores the quotient in LO
             // And the remainder in HI
             else if (_func == 0x1b) {
+                if (_rt == 0) {
+                    revert("MIPS: division by zero");
+                }
                 state.hi = _rs % _rt;
                 state.lo = _rs / _rt;
             }
diff --git a/packages/contracts-bedrock/src/cannon/PreimageOracle.sol b/packages/contracts-bedrock/src/cannon/PreimageOracle.sol
index dfdeaa7fc5b1..77dcfc20c403 100644
--- a/packages/contracts-bedrock/src/cannon/PreimageOracle.sol
+++ b/packages/contracts-bedrock/src/cannon/PreimageOracle.sol
@@ -29,8 +29,8 @@ contract PreimageOracle is IPreimageOracle, ISemver {
     uint256 public constant MAX_LEAF_COUNT = 2 ** KECCAK_TREE_DEPTH - 1;
 
     /// @notice The semantic version of the Preimage Oracle contract.
-    /// @custom:semver 0.1.0
-    string public constant version = "0.1.0";
+    /// @custom:semver 1.0.0
+    string public constant version = "1.0.0";
 
     ////////////////////////////////////////////////////////////////
     //                 Authorized Preimage Parts                  //
@@ -460,6 +460,8 @@ contract PreimageOracle is IPreimageOracle, ISemver {
         uint256 blocksProcessed = metaData.blocksProcessed();
 
         // The caller of `addLeavesLPP` must be an EOA.
+        // Note: This check may break if EIPs like EIP-3074 are introduced. We may query the data in the logs if this
+        // is the case.
         if (msg.sender != tx.origin) revert NotEOA();
 
         // Revert if the proposal has not been initialized. 0-size preimages are *not* allowed.
@@ -552,6 +554,14 @@ contract PreimageOracle is IPreimageOracle, ISemver {
         proposalBlocks[msg.sender][_uuid].push(uint64(block.number));
         // Persist the updated metadata to storage.
         proposalMetadata[msg.sender][_uuid] = metaData;
+
+        // Clobber memory and `log0` all calldata. This is safe because there is no execution afterwards within
+        // this callframe.
+        assembly {
+            mstore(0x00, shl(96, caller()))
+            calldatacopy(0x14, 0x00, calldatasize())
+            log0(0x00, add(0x14, calldatasize()))
+        }
     }
 
     /// @notice Challenge a keccak256 block that was committed to in the merkle tree.
diff --git a/packages/contracts-bedrock/src/dispute/AnchorStateRegistry.sol b/packages/contracts-bedrock/src/dispute/AnchorStateRegistry.sol
new file mode 100644
index 000000000000..c1f95f3df135
--- /dev/null
+++ b/packages/contracts-bedrock/src/dispute/AnchorStateRegistry.sol
@@ -0,0 +1,88 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+import { ISemver } from "src/universal/ISemver.sol";
+
+import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol";
+import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol";
+import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
+import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.sol";
+
+import "src/dispute/lib/Types.sol";
+
+/// @title AnchorStateRegistry
+/// @notice The AnchorStateRegistry is a contract that stores the latest "anchor" state for each available
+///         FaultDisputeGame type. The anchor state is the latest state that has been proposed on L1 and was not
+///         challenged within the challenge period. By using stored anchor states, new FaultDisputeGame instances can
+///         be initialized with a more recent starting state which reduces the amount of required offchain computation.
+contract AnchorStateRegistry is Initializable, IAnchorStateRegistry, ISemver {
+    /// @notice Describes an initial anchor state for a game type.
+    struct StartingAnchorRoot {
+        GameType gameType;
+        OutputRoot outputRoot;
+    }
+
+    /// @notice Semantic version.
+    /// @custom:semver 1.0.0
+    string public constant version = "1.0.0";
+
+    /// @notice DisputeGameFactory address.
+    IDisputeGameFactory internal immutable DISPUTE_GAME_FACTORY;
+
+    /// @inheritdoc IAnchorStateRegistry
+    mapping(GameType => OutputRoot) public anchors;
+
+    /// @param _disputeGameFactory DisputeGameFactory address.
+    constructor(IDisputeGameFactory _disputeGameFactory) {
+        DISPUTE_GAME_FACTORY = _disputeGameFactory;
+
+        // Initialize the implementation with an empty array of starting anchor roots.
+        initialize(new StartingAnchorRoot[](0));
+    }
+
+    /// @notice Initializes the contract.
+    /// @param _startingAnchorRoots An array of starting anchor roots.
+    function initialize(StartingAnchorRoot[] memory _startingAnchorRoots) public initializer {
+        for (uint256 i = 0; i < _startingAnchorRoots.length; i++) {
+            StartingAnchorRoot memory startingAnchorRoot = _startingAnchorRoots[i];
+            anchors[startingAnchorRoot.gameType] = startingAnchorRoot.outputRoot;
+        }
+    }
+
+    /// @inheritdoc IAnchorStateRegistry
+    function disputeGameFactory() external view returns (IDisputeGameFactory) {
+        return DISPUTE_GAME_FACTORY;
+    }
+
+    /// @inheritdoc IAnchorStateRegistry
+    function tryUpdateAnchorState() external {
+        // Grab the game and game data.
+        IFaultDisputeGame game = IFaultDisputeGame(msg.sender);
+        (GameType gameType, Claim rootClaim, bytes memory extraData) = game.gameData();
+
+        // Grab the verified address of the game based on the game data.
+        // slither-disable-next-line unused-return
+        (IDisputeGame factoryRegisteredGame,) =
+            DISPUTE_GAME_FACTORY.games({ _gameType: gameType, _rootClaim: rootClaim, _extraData: extraData });
+
+        // Must be a valid game.
+        require(
+            address(factoryRegisteredGame) == address(game),
+            "AnchorStateRegistry: fault dispute game not registered with factory"
+        );
+
+        // No need to update anything if the anchor state is already newer.
+        if (game.l2BlockNumber() <= anchors[gameType].l2BlockNumber) {
+            return;
+        }
+
+        // Must be a game that resolved in favor of the state.
+        if (game.status() != GameStatus.DEFENDER_WINS) {
+            return;
+        }
+
+        // Actually update the anchor state.
+        anchors[gameType] = OutputRoot({ l2BlockNumber: game.l2BlockNumber(), root: Hash.wrap(game.rootClaim().raw()) });
+    }
+}
diff --git a/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol b/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol
index 09bc99a99148..55d25abb9224 100644
--- a/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol
+++ b/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol
@@ -1,31 +1,28 @@
 // SPDX-License-Identifier: MIT
 pragma solidity 0.8.15;
 
-import { ClonesWithImmutableArgs } from "@cwia/ClonesWithImmutableArgs.sol";
+import { LibClone } from "@solady/utils/LibClone.sol";
 import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
 import { ISemver } from "src/universal/ISemver.sol";
 
 import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
 import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.sol";
 
-import { LibGameId } from "src/dispute/lib/LibGameId.sol";
-
-import "src/libraries/DisputeTypes.sol";
-import "src/libraries/DisputeErrors.sol";
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
 
 /// @title DisputeGameFactory
-/// @notice A factory contract for creating `IDisputeGame` contracts. All created dispute games
-///         are stored in both a mapping and an append only array. The timestamp of the creation
-///         time of the dispute game is packed tightly into the storage slot with the address of
-///         the dispute game. This is to make offchain discoverability of playable dispute games
-///         easier.
+/// @notice A factory contract for creating `IDisputeGame` contracts. All created dispute games are stored in both a
+///         mapping and an append only array. The timestamp of the creation time of the dispute game is packed tightly
+///         into the storage slot with the address of the dispute game to make offchain discoverability of playable
+///         dispute games easier.
 contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver {
     /// @dev Allows for the creation of clone proxies with immutable arguments.
-    using ClonesWithImmutableArgs for address;
+    using LibClone for address;
 
     /// @notice Semantic version.
-    /// @custom:semver 0.2.0
-    string public constant version = "0.2.0";
+    /// @custom:semver 1.0.0
+    string public constant version = "1.0.0";
 
     /// @inheritdoc IDisputeGameFactory
     mapping(GameType => IDisputeGame) public gameImpls;
@@ -33,17 +30,15 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver
     /// @inheritdoc IDisputeGameFactory
     mapping(GameType => uint256) public initBonds;
 
-    /// @notice Mapping of a hash of `gameType || rootClaim || extraData` to
-    ///         the deployed `IDisputeGame` clone.
-    /// @dev Note: `||` denotes concatenation.
+    /// @notice Mapping of a hash of `gameType || rootClaim || extraData` to the deployed `IDisputeGame` clone (where
+    //          `||` denotes concatenation).
     mapping(Hash => GameId) internal _disputeGames;
 
-    /// @notice an append-only array of disputeGames that have been created.
-    /// @dev this accessor is used by offchain game solvers to efficiently
-    ///      track dispute games
+    /// @notice An append-only array of disputeGames that have been created. Used by offchain game solvers to
+    ///         efficiently track dispute games.
     GameId[] internal _disputeGameList;
 
-    /// @notice constructs a new DisputeGameFactory contract.
+    /// @notice Constructs a new DisputeGameFactory contract.
     constructor() OwnableUpgradeable() {
         initialize(address(0));
     }
@@ -71,7 +66,8 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver
         returns (IDisputeGame proxy_, Timestamp timestamp_)
     {
         Hash uuid = getGameUUID(_gameType, _rootClaim, _extraData);
-        (, timestamp_, proxy_) = _disputeGames[uuid].unpack();
+        (, Timestamp timestamp, address proxy) = _disputeGames[uuid].unpack();
+        (proxy_, timestamp_) = (IDisputeGame(proxy), timestamp);
     }
 
     /// @inheritdoc IDisputeGameFactory
@@ -80,7 +76,8 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver
         view
         returns (GameType gameType_, Timestamp timestamp_, IDisputeGame proxy_)
     {
-        (gameType_, timestamp_, proxy_) = _disputeGameList[_index].unpack();
+        (GameType gameType, Timestamp timestamp, address proxy) = _disputeGameList[_index].unpack();
+        (gameType_, timestamp_, proxy_) = (gameType, timestamp, IDisputeGame(proxy));
     }
 
     /// @inheritdoc IDisputeGameFactory
@@ -100,13 +97,23 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver
         if (address(impl) == address(0)) revert NoImplementation(_gameType);
 
         // If the required initialization bond is not met, revert.
-        if (msg.value < initBonds[_gameType]) revert InsufficientBond();
+        if (msg.value != initBonds[_gameType]) revert IncorrectBondAmount();
 
         // Get the hash of the parent block.
         bytes32 parentHash = blockhash(block.number - 1);
 
         // Clone the implementation contract and initialize it with the given parameters.
-        proxy_ = IDisputeGame(address(impl).clone(abi.encodePacked(_rootClaim, parentHash, _extraData)));
+        //
+        // CWIA Calldata Layout:
+        // ┌──────────────┬────────────────────────────────────┐
+        // │    Bytes     │            Description             │
+        // ├──────────────┼────────────────────────────────────┤
+        // │ [0, 20)      │ Game creator address               │
+        // │ [20, 52)     │ Root claim                         │
+        // │ [52, 84)     │ Parent block hash at creation time │
+        // │ [84, 84 + n) │ Extra data (opaque)                │
+        // └──────────────┴────────────────────────────────────┘
+        proxy_ = IDisputeGame(address(impl).clone(abi.encodePacked(msg.sender, _rootClaim, parentHash, _extraData)));
         proxy_.initialize{ value: msg.value }();
 
         // Compute the unique identifier for the dispute game.
@@ -115,7 +122,8 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver
         // If a dispute game with the same UUID already exists, revert.
         if (GameId.unwrap(_disputeGames[uuid]) != bytes32(0)) revert GameAlreadyExists(uuid);
 
-        GameId id = LibGameId.pack(_gameType, Timestamp.wrap(uint64(block.timestamp)), proxy_);
+        // Pack the game ID.
+        GameId id = LibGameId.pack(_gameType, Timestamp.wrap(uint64(block.timestamp)), address(proxy_));
 
         // Store the dispute game id in the mapping & emit the `DisputeGameCreated` event.
         _disputeGames[uuid] = id;
@@ -159,7 +167,7 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver
         // Perform a reverse linear search for the `_n` most recent games of type `_gameType`.
         for (uint256 i = _start; i >= 0 && i <= _start;) {
             GameId id = _disputeGameList[i];
-            (GameType gameType, Timestamp timestamp, IDisputeGame proxy) = id.unpack();
+            (GameType gameType, Timestamp timestamp, address proxy) = id.unpack();
 
             if (gameType.raw() == _gameType.raw()) {
                 // Increase the size of the `games_` array by 1.
@@ -169,8 +177,8 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver
                     mstore(games_, add(mload(games_), 0x01))
                 }
 
-                bytes memory extraData = proxy.extraData();
-                Claim rootClaim = proxy.rootClaim();
+                bytes memory extraData = IDisputeGame(proxy).extraData();
+                Claim rootClaim = IDisputeGame(proxy).rootClaim();
                 games_[games_.length - 1] = GameSearchResult({
                     index: i,
                     metadata: id,
diff --git a/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol b/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol
index 2f7eda6b7321..ab559147ed17 100644
--- a/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol
+++ b/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol
@@ -1,21 +1,24 @@
 // SPDX-License-Identifier: MIT
 pragma solidity 0.8.15;
 
-import { FixedPointMathLib } from "solady/utils/FixedPointMathLib.sol";
+import { FixedPointMathLib } from "@solady/utils/FixedPointMathLib.sol";
 
 import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol";
 import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
 import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol";
 import { IInitializable } from "src/dispute/interfaces/IInitializable.sol";
 import { IBigStepper, IPreimageOracle } from "src/dispute/interfaces/IBigStepper.sol";
+import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol";
 
-import { Clone } from "src/libraries/Clone.sol";
+import { Clone } from "@solady/utils/Clone.sol";
 import { Types } from "src/libraries/Types.sol";
 import { ISemver } from "src/universal/ISemver.sol";
-import { LibClock } from "src/dispute/lib/LibUDT.sol";
 
-import "src/libraries/DisputeTypes.sol";
-import "src/libraries/DisputeErrors.sol";
+import { Types } from "src/libraries/Types.sol";
+import { Hashing } from "src/libraries/Hashing.sol";
+import { RLPReader } from "src/libraries/rlp/RLPReader.sol";
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
 
 /// @title FaultDisputeGame
 /// @notice An implementation of the `IFaultDisputeGame` interface.
@@ -35,32 +38,39 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
     ///         this depth, execution trace bisection begins.
     uint256 internal immutable SPLIT_DEPTH;
 
-    /// @notice The duration of the game.
-    Duration internal immutable GAME_DURATION;
+    /// @notice The maximum duration that may accumulate on a team's chess clock before they may no longer respond.
+    Duration internal immutable MAX_CLOCK_DURATION;
 
     /// @notice An onchain VM that performs single instruction steps on a fault proof program trace.
     IBigStepper internal immutable VM;
 
-    /// @notice The genesis block number.
-    uint256 internal immutable GENESIS_BLOCK_NUMBER;
-
-    /// @notice The genesis output root.
-    Hash internal immutable GENESIS_OUTPUT_ROOT;
-
     /// @notice The game type ID.
     GameType internal immutable GAME_TYPE;
 
     /// @notice WETH contract for holding ETH.
     IDelayedWETH internal immutable WETH;
 
+    /// @notice The anchor state registry.
+    IAnchorStateRegistry internal immutable ANCHOR_STATE_REGISTRY;
+
     /// @notice The chain ID of the L2 network this contract argues about.
     uint256 internal immutable L2_CHAIN_ID;
 
+    /// @notice The duration of the clock extension. Will be doubled if the grandchild is the root claim of an execution
+    ///         trace bisection subgame.
+    Duration internal immutable CLOCK_EXTENSION;
+
     /// @notice The global root claim's position is always at gindex 1.
     Position internal constant ROOT_POSITION = Position.wrap(1);
 
-    /// @notice The flag set in the `bond` field of a `ClaimData` struct to indicate that the bond has been claimed.
-    uint128 internal constant CLAIMED_BOND_FLAG = type(uint128).max;
+    /// @notice The index of the block number in the RLP-encoded block header.
+    /// @dev Consensus encoding reference:
+    /// https://github.com/paradigmxyz/reth/blob/5f82993c23164ce8ccdc7bf3ae5085205383a5c8/crates/primitives/src/header.rs#L368
+    uint256 internal constant HEADER_BLOCK_NUMBER_INDEX = 8;
+
+    /// @notice Semantic version.
+    /// @custom:semver 1.2.0
+    string public constant version = "1.2.0";
 
     /// @notice The starting timestamp of the game
     Timestamp public createdAt;
@@ -71,70 +81,150 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
     /// @inheritdoc IDisputeGame
     GameStatus public status;
 
+    /// @notice Flag for the `initialize` function to prevent re-initialization.
+    bool internal initialized;
+
+    /// @notice Flag for whether or not the L2 block number claim has been invalidated via `challengeRootL2Block`.
+    bool public l2BlockNumberChallenged;
+
+    /// @notice The challenger of the L2 block number claim. Should always be `address(0)` if `l2BlockNumberChallenged`
+    ///         is `false`. Should be the address of the challenger if `l2BlockNumberChallenged` is `true`.
+    address public l2BlockNumberChallenger;
+
     /// @notice An append-only array of all claims made during the dispute game.
     ClaimData[] public claimData;
 
     /// @notice Credited balances for winning participants.
     mapping(address => uint256) public credit;
 
-    /// @notice An internal mapping to allow for constant-time lookups of existing claims.
-    mapping(ClaimHash => bool) internal claims;
+    /// @notice A mapping to allow for constant-time lookups of existing claims.
+    mapping(Hash => bool) public claims;
 
-    /// @notice An internal mapping of subgames rooted at a claim index to other claim indices in the subgame.
-    mapping(uint256 => uint256[]) internal subgames;
+    /// @notice A mapping of subgames rooted at a claim index to other claim indices in the subgame.
+    mapping(uint256 => uint256[]) public subgames;
 
-    /// @notice Indicates whether the subgame rooted at the root claim has been resolved.
-    bool internal subgameAtRootResolved;
+    /// @notice A mapping of resolved subgames rooted at a claim index.
+    mapping(uint256 => bool) public resolvedSubgames;
 
-    /// @notice Flag for the `initialize` function to prevent re-initialization.
-    bool internal initialized;
+    /// @notice A mapping of claim indices to resolution checkpoints.
+    mapping(uint256 => ResolutionCheckpoint) public resolutionCheckpoints;
 
-    /// @notice Semantic version.
-    /// @custom:semver 0.7.1
-    string public constant version = "0.7.1";
+    /// @notice The latest finalized output root, serving as the anchor for output bisection.
+    OutputRoot public startingOutputRoot;
 
     /// @param _gameType The type ID of the game.
     /// @param _absolutePrestate The absolute prestate of the instruction trace.
-    /// @param _genesisBlockNumber The block number of the genesis block.
-    /// @param _genesisOutputRoot The output root of the genesis block.
     /// @param _maxGameDepth The maximum depth of bisection.
     /// @param _splitDepth The final depth of the output bisection portion of the game.
-    /// @param _gameDuration The duration of the game.
+    /// @param _clockExtension The clock extension to perform when the remaining duration is less than the extension.
+    /// @param _maxClockDuration The maximum amount of time that may accumulate on a team's chess clock.
     /// @param _vm An onchain VM that performs single instruction steps on an FPP trace.
     /// @param _weth WETH contract for holding ETH.
+    /// @param _anchorStateRegistry The contract that stores the anchor state for each game type.
     /// @param _l2ChainId Chain ID of the L2 network this contract argues about.
     constructor(
         GameType _gameType,
         Claim _absolutePrestate,
-        uint256 _genesisBlockNumber,
-        Hash _genesisOutputRoot,
         uint256 _maxGameDepth,
         uint256 _splitDepth,
-        Duration _gameDuration,
+        Duration _clockExtension,
+        Duration _maxClockDuration,
         IBigStepper _vm,
         IDelayedWETH _weth,
+        IAnchorStateRegistry _anchorStateRegistry,
         uint256 _l2ChainId
     ) {
+        // The max game depth may not be greater than `LibPosition.MAX_POSITION_BITLEN - 1`.
+        if (_maxGameDepth > LibPosition.MAX_POSITION_BITLEN - 1) revert MaxDepthTooLarge();
         // The split depth cannot be greater than or equal to the max game depth.
         if (_splitDepth >= _maxGameDepth) revert InvalidSplitDepth();
+        // The clock extension may not be greater than the max clock duration.
+        if (_clockExtension.raw() > _maxClockDuration.raw()) revert InvalidClockExtension();
 
         GAME_TYPE = _gameType;
         ABSOLUTE_PRESTATE = _absolutePrestate;
-        GENESIS_BLOCK_NUMBER = _genesisBlockNumber;
-        GENESIS_OUTPUT_ROOT = _genesisOutputRoot;
         MAX_GAME_DEPTH = _maxGameDepth;
         SPLIT_DEPTH = _splitDepth;
-        GAME_DURATION = _gameDuration;
+        CLOCK_EXTENSION = _clockExtension;
+        MAX_CLOCK_DURATION = _maxClockDuration;
         VM = _vm;
         WETH = _weth;
+        ANCHOR_STATE_REGISTRY = _anchorStateRegistry;
         L2_CHAIN_ID = _l2ChainId;
     }
 
-    /// @notice Receive function to allow the contract to receive ETH.
-    receive() external payable { }
+    /// @inheritdoc IInitializable
+    function initialize() public payable virtual {
+        // SAFETY: Any revert in this function will bubble up to the DisputeGameFactory and
+        // prevent the game from being created.
+        //
+        // Implicit assumptions:
+        // - The `gameStatus` state variable defaults to 0, which is `GameStatus.IN_PROGRESS`
+        // - The dispute game factory will enforce the required bond to initialize the game.
+        //
+        // Explicit checks:
+        // - The game must not have already been initialized.
+        // - An output root cannot be proposed at or before the starting block number.
+
+        // INVARIANT: The game must not have already been initialized.
+        if (initialized) revert AlreadyInitialized();
+
+        // Grab the latest anchor root.
+        (Hash root, uint256 rootBlockNumber) = ANCHOR_STATE_REGISTRY.anchors(GAME_TYPE);
+
+        // Should only happen if this is a new game type that hasn't been set up yet.
+        if (root.raw() == bytes32(0)) revert AnchorRootNotFound();
+
+        // Set the starting output root.
+        startingOutputRoot = OutputRoot({ l2BlockNumber: rootBlockNumber, root: root });
+
+        // Revert if the calldata size is not the expected length.
+        //
+        // This is to prevent adding extra or omitting bytes from to `extraData` that result in a different game UUID
+        // in the factory, but are not used by the game, which would allow for multiple dispute games for the same
+        // output proposal to be created.
+        //
+        // Expected length: 0x7A
+        // - 0x04 selector
+        // - 0x14 creator address
+        // - 0x20 root claim
+        // - 0x20 l1 head
+        // - 0x20 extraData
+        // - 0x02 CWIA bytes
+        assembly {
+            if iszero(eq(calldatasize(), 0x7A)) {
+                // Store the selector for `BadExtraData()` & revert
+                mstore(0x00, 0x9824bdab)
+                revert(0x1C, 0x04)
+            }
+        }
+
+        // Do not allow the game to be initialized if the root claim corresponds to a block at or before the
+        // configured starting block number.
+        if (l2BlockNumber() <= rootBlockNumber) revert UnexpectedRootClaim(rootClaim());
+
+        // Set the root claim
+        claimData.push(
+            ClaimData({
+                parentIndex: type(uint32).max,
+                counteredBy: address(0),
+                claimant: gameCreator(),
+                bond: uint128(msg.value),
+                claim: rootClaim(),
+                position: ROOT_POSITION,
+                clock: LibClock.wrap(Duration.wrap(0), Timestamp.wrap(uint64(block.timestamp)))
+            })
+        );
+
+        // Set the game as initialized.
+        initialized = true;
 
-    /// @notice Fallback function to allow the contract to receive ETH.
-    fallback() external payable { }
+        // Deposit the bond.
+        WETH.deposit{ value: msg.value }();
+
+        // Set the game's starting timestamp
+        createdAt = Timestamp.wrap(uint64(block.timestamp));
+    }
 
     ////////////////////////////////////////////////////////////////
     //                  `IFaultDisputeGame` impl                  //
@@ -222,16 +312,20 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
     }
 
     /// @notice Generic move function, used for both `attack` and `defend` moves.
+    /// @param _disputed The disputed `Claim`.
     /// @param _challengeIndex The index of the claim being moved against.
     /// @param _claim The claim at the next logical position in the game.
     /// @param _isAttack Whether or not the move is an attack or defense.
-    function move(uint256 _challengeIndex, Claim _claim, bool _isAttack) public payable virtual {
+    function move(Claim _disputed, uint256 _challengeIndex, Claim _claim, bool _isAttack) public payable virtual {
         // INVARIANT: Moves cannot be made unless the game is currently in progress.
         if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress();
 
         // Get the parent. If it does not exist, the call will revert with OOB.
         ClaimData memory parent = claimData[_challengeIndex];
 
+        // INVARIANT: The claim at the _challengeIndex must be the disputed claim.
+        if (Claim.unwrap(parent.claim) != Claim.unwrap(_disputed)) revert InvalidDisputedClaimIndex();
+
         // Compute the position that the claim commits to. Because the parent's position is already
         // known, we can compute the next position by moving left or right depending on whether
         // or not the move is an attack or defense.
@@ -246,6 +340,10 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
             revert CannotDefendRootClaim();
         }
 
+        // INVARIANT: No moves against the root claim can be made after it has been challenged with
+        //            `challengeRootL2Block`.`
+        if (l2BlockNumberChallenged && _challengeIndex == 0) revert L2BlockNumberChallenged();
+
         // INVARIANT: A move can never surpass the `MAX_GAME_DEPTH`. The only option to counter a
         //            claim at this depth is to perform a single instruction step on-chain via
         //            the `step` function to prove that the state transition produces an unexpected
@@ -258,32 +356,30 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
             _verifyExecBisectionRoot(_claim, _challengeIndex, parentPos, _isAttack);
         }
 
-        // INVARIANT: The `msg.value` must be sufficient to cover the required bond.
-        if (getRequiredBond(nextPosition) > msg.value) revert InsufficientBond();
-
-        // Fetch the grandparent clock, if it exists.
-        // The grandparent clock should always exist unless the parent is the root claim.
-        Clock grandparentClock;
-        if (parent.parentIndex != type(uint32).max) {
-            grandparentClock = claimData[parent.parentIndex].clock;
-        }
+        // INVARIANT: The `msg.value` must exactly equal the required bond.
+        if (getRequiredBond(nextPosition) != msg.value) revert IncorrectBondAmount();
 
         // Compute the duration of the next clock. This is done by adding the duration of the
         // grandparent claim to the difference between the current block timestamp and the
         // parent's clock timestamp.
-        Duration nextDuration = Duration.wrap(
-            uint64(
-                // First, fetch the duration of the grandparent claim.
-                grandparentClock.duration().raw()
-                // Second, add the difference between the current block timestamp and the
-                // parent's clock timestamp.
-                + block.timestamp - parent.clock.timestamp().raw()
-            )
-        );
+        Duration nextDuration = getChallengerDuration(_challengeIndex);
 
-        // INVARIANT: A move can never be made once its clock has exceeded `GAME_DURATION / 2`
+        // INVARIANT: A move can never be made once its clock has exceeded `MAX_CLOCK_DURATION`
         //            seconds of time.
-        if (nextDuration.raw() > GAME_DURATION.raw() >> 1) revert ClockTimeExceeded();
+        if (nextDuration.raw() == MAX_CLOCK_DURATION.raw()) revert ClockTimeExceeded();
+
+        // If the remaining clock time has less than `CLOCK_EXTENSION` seconds remaining, grant the potential
+        // grandchild's clock `CLOCK_EXTENSION` seconds. This is to ensure that, even if a player has to inherit another
+        // team's clock to counter a freeloader claim, they will always have enough time to to respond. This extension
+        // is bounded by the depth of the tree. If the potential grandchild is an execution trace bisection root, the
+        // clock extension is doubled. This is to allow for extra time for the off-chain challenge agent to generate
+        // the initial instruction trace on the native FPVM.
+        if (nextDuration.raw() > MAX_CLOCK_DURATION.raw() - CLOCK_EXTENSION.raw()) {
+            // If the potential grandchild is an execution trace bisection root, double the clock extension.
+            uint64 extensionPeriod =
+                nextPositionDepth == SPLIT_DEPTH - 1 ? CLOCK_EXTENSION.raw() * 2 : CLOCK_EXTENSION.raw();
+            nextDuration = Duration.wrap(MAX_CLOCK_DURATION.raw() - extensionPeriod);
+        }
 
         // Construct the next clock with the new duration and the current block timestamp.
         Clock nextClock = LibClock.wrap(nextDuration, Timestamp.wrap(uint64(block.timestamp)));
@@ -291,7 +387,7 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
         // INVARIANT: There cannot be multiple identical claims with identical moves on the same challengeIndex. Multiple
         //            claims at the same position may dispute the same challengeIndex. However, they must have different
         //            values.
-        ClaimHash claimHash = _claim.hashClaimPos(nextPosition, _challengeIndex);
+        Hash claimHash = _claim.hashClaimPos(nextPosition, _challengeIndex);
         if (claims[claimHash]) revert ClaimAlreadyExists();
         claims[claimHash] = true;
 
@@ -320,13 +416,13 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
     }
 
     /// @inheritdoc IFaultDisputeGame
-    function attack(uint256 _parentIndex, Claim _claim) external payable {
-        move(_parentIndex, _claim, true);
+    function attack(Claim _disputed, uint256 _parentIndex, Claim _claim) external payable {
+        move(_disputed, _parentIndex, _claim, true);
     }
 
     /// @inheritdoc IFaultDisputeGame
-    function defend(uint256 _parentIndex, Claim _claim) external payable {
-        move(_parentIndex, _claim, false);
+    function defend(Claim _disputed, uint256 _parentIndex, Claim _claim) external payable {
+        move(_disputed, _parentIndex, _claim, false);
     }
 
     /// @inheritdoc IFaultDisputeGame
@@ -352,8 +448,9 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
             // Load the disputed proposal's L2 block number as a big-endian uint64 in the
             // high order 8 bytes of the word.
 
-            // We add the index at depth + 1 to the genesis block number to get the disputed L2 block number.
-            uint256 l2Number = GENESIS_BLOCK_NUMBER + disputedPos.traceIndex(SPLIT_DEPTH) + 1;
+            // We add the index at depth + 1 to the starting block number to get the disputed L2
+            // block number.
+            uint256 l2Number = startingOutputRoot.l2BlockNumber + disputedPos.traceIndex(SPLIT_DEPTH) + 1;
 
             oracle.loadLocalData(_ident, uuid.raw(), bytes32(l2Number << 0xC0), 8, _partOffset);
         } else if (_ident == LocalPreimageKey.CHAIN_ID) {
@@ -365,61 +462,119 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
     }
 
     /// @inheritdoc IFaultDisputeGame
-    function l1Head() public pure returns (Hash l1Head_) {
-        l1Head_ = Hash.wrap(_getArgFixedBytes(0x20));
+    function getNumToResolve(uint256 _claimIndex) public view returns (uint256 numRemainingChildren_) {
+        ResolutionCheckpoint storage checkpoint = resolutionCheckpoints[_claimIndex];
+        uint256[] storage challengeIndices = subgames[_claimIndex];
+        uint256 challengeIndicesLen = challengeIndices.length;
+
+        numRemainingChildren_ = challengeIndicesLen - checkpoint.subgameIndex;
     }
 
     /// @inheritdoc IFaultDisputeGame
     function l2BlockNumber() public pure returns (uint256 l2BlockNumber_) {
-        l2BlockNumber_ = _getArgUint256(0x40);
+        l2BlockNumber_ = _getArgUint256(0x54);
+    }
+
+    /// @inheritdoc IFaultDisputeGame
+    function startingBlockNumber() external view returns (uint256 startingBlockNumber_) {
+        startingBlockNumber_ = startingOutputRoot.l2BlockNumber;
+    }
+
+    /// @inheritdoc IFaultDisputeGame
+    function startingRootHash() external view returns (Hash startingRootHash_) {
+        startingRootHash_ = startingOutputRoot.root;
+    }
+
+    /// @notice Challenges the root L2 block number by providing the preimage of the output root and the L2 block header
+    ///         and showing that the committed L2 block number is incorrect relative to the claimed L2 block number.
+    /// @param _outputRootProof The output root proof.
+    /// @param _headerRLP The RLP-encoded L2 block header.
+    function challengeRootL2Block(
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes calldata _headerRLP
+    )
+        external
+    {
+        // INVARIANT: Moves cannot be made unless the game is currently in progress.
+        if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress();
+
+        // The root L2 block claim can only be challenged once.
+        if (l2BlockNumberChallenged) revert L2BlockNumberChallenged();
+
+        // Verify the output root preimage.
+        if (Hashing.hashOutputRootProof(_outputRootProof) != rootClaim().raw()) revert InvalidOutputRootProof();
+
+        // Verify the block hash preimage.
+        if (keccak256(_headerRLP) != _outputRootProof.latestBlockhash) revert InvalidHeaderRLP();
+
+        // Decode the header RLP to find the number of the block. In the consensus encoding, the timestamp
+        // is the 9th element in the list that represents the block header.
+        RLPReader.RLPItem[] memory headerContents = RLPReader.readList(RLPReader.toRLPItem(_headerRLP));
+        bytes memory rawBlockNumber = RLPReader.readBytes(headerContents[HEADER_BLOCK_NUMBER_INDEX]);
+
+        // Sanity check the block number string length.
+        if (rawBlockNumber.length > 32) revert InvalidHeaderRLP();
+
+        // Convert the raw, left-aligned block number to a uint256 by aligning it as a big-endian
+        // number in the low-order bytes of a 32-byte word.
+        //
+        // SAFETY: The length of `rawBlockNumber` is checked above to ensure it is at most 32 bytes.
+        uint256 blockNumber;
+        assembly {
+            blockNumber := shr(shl(0x03, sub(0x20, mload(rawBlockNumber))), mload(add(rawBlockNumber, 0x20)))
+        }
+
+        // Ensure the block number does not match the block number claimed in the dispute game.
+        if (blockNumber == l2BlockNumber()) revert BlockNumberMatches();
+
+        // Issue a special counter to the root claim. This counter will always win the root claim subgame, and receive
+        // the bond from the root claimant.
+        l2BlockNumberChallenger = msg.sender;
+        l2BlockNumberChallenged = true;
     }
 
     ////////////////////////////////////////////////////////////////
     //                    `IDisputeGame` impl                     //
     ////////////////////////////////////////////////////////////////
 
-    /// @inheritdoc IDisputeGame
-    function gameType() public view override returns (GameType gameType_) {
-        gameType_ = GAME_TYPE;
-    }
-
     /// @inheritdoc IDisputeGame
     function resolve() external returns (GameStatus status_) {
         // INVARIANT: Resolution cannot occur unless the game is currently in progress.
         if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress();
 
         // INVARIANT: Resolution cannot occur unless the absolute root subgame has been resolved.
-        if (!subgameAtRootResolved) revert OutOfOrderResolution();
+        if (!resolvedSubgames[0]) revert OutOfOrderResolution();
 
         // Update the global game status; The dispute has concluded.
         status_ = claimData[0].counteredBy == address(0) ? GameStatus.DEFENDER_WINS : GameStatus.CHALLENGER_WINS;
         resolvedAt = Timestamp.wrap(uint64(block.timestamp));
 
+        // Update the status and emit the resolved event, note that we're performing an assignment here.
         emit Resolved(status = status_);
+
+        // Try to update the anchor state, this should not revert.
+        ANCHOR_STATE_REGISTRY.tryUpdateAnchorState();
     }
 
     /// @inheritdoc IFaultDisputeGame
-    function resolveClaim(uint256 _claimIndex) external payable {
+    function resolveClaim(uint256 _claimIndex, uint256 _numToResolve) external {
         // INVARIANT: Resolution cannot occur unless the game is currently in progress.
         if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress();
 
-        ClaimData storage parent = claimData[_claimIndex];
+        ClaimData storage subgameRootClaim = claimData[_claimIndex];
+        Duration challengeClockDuration = getChallengerDuration(_claimIndex);
 
-        // INVARIANT: Cannot resolve a subgame unless the clock of its root has expired
-        uint64 parentClockDuration = parent.clock.duration().raw();
-        uint64 timeSinceParentMove = uint64(block.timestamp) - parent.clock.timestamp().raw();
-        if (parentClockDuration + timeSinceParentMove <= GAME_DURATION.raw() >> 1) {
-            revert ClockNotExpired();
-        }
+        // INVARIANT: Cannot resolve a subgame unless the clock of its would-be counter has expired
+        // INVARIANT: Assuming ordered subgame resolution, challengeClockDuration is always >= MAX_CLOCK_DURATION if all
+        // descendant subgames are resolved
+        if (challengeClockDuration.raw() < MAX_CLOCK_DURATION.raw()) revert ClockNotExpired();
+
+        // INVARIANT: Cannot resolve a subgame twice.
+        if (resolvedSubgames[_claimIndex]) revert ClaimAlreadyResolved();
 
         uint256[] storage challengeIndices = subgames[_claimIndex];
         uint256 challengeIndicesLen = challengeIndices.length;
 
-        // INVARIANT: Cannot resolve subgames twice
-        if (_claimIndex == 0 && subgameAtRootResolved) {
-            revert ClaimAlreadyResolved();
-        }
-
         // Uncontested claims are resolved implicitly unless they are the root claim. Pay out the bond to the claimant
         // and return early.
         if (challengeIndicesLen == 0 && _claimIndex != 0) {
@@ -427,20 +582,33 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
             // `counteredBy` field is set and there are no subgames, this implies that the parent claim was successfully
             // stepped against. In this case, we pay out the bond to the party that stepped against the parent claim.
             // Otherwise, the parent claim is uncontested, and the bond is returned to the claimant.
-            address counteredBy = parent.counteredBy;
-            address recipient = counteredBy == address(0) ? parent.claimant : counteredBy;
-            _distributeBond(recipient, parent);
+            address counteredBy = subgameRootClaim.counteredBy;
+            address recipient = counteredBy == address(0) ? subgameRootClaim.claimant : counteredBy;
+            _distributeBond(recipient, subgameRootClaim);
+            resolvedSubgames[_claimIndex] = true;
             return;
         }
 
+        // Fetch the resolution checkpoint from storage.
+        ResolutionCheckpoint memory checkpoint = resolutionCheckpoints[_claimIndex];
+
+        // If the checkpoint does not currently exist, initialize the current left most position as max u128.
+        if (!checkpoint.initialCheckpointComplete) {
+            checkpoint.leftmostPosition = Position.wrap(type(uint128).max);
+            checkpoint.initialCheckpointComplete = true;
+
+            // If `_numToResolve == 0`, assume that we can check all child subgames in this one callframe.
+            if (_numToResolve == 0) _numToResolve = challengeIndicesLen;
+        }
+
         // Assume parent is honest until proven otherwise
-        address countered = address(0);
-        Position leftmostCounter = Position.wrap(type(uint128).max);
-        for (uint256 i = 0; i < challengeIndicesLen; ++i) {
+        uint256 lastToResolve = checkpoint.subgameIndex + _numToResolve;
+        uint256 finalCursor = lastToResolve > challengeIndicesLen ? challengeIndicesLen : lastToResolve;
+        for (uint256 i = checkpoint.subgameIndex; i < finalCursor; i++) {
             uint256 challengeIndex = challengeIndices[i];
 
             // INVARIANT: Cannot resolve a subgame containing an unresolved claim
-            if (subgames[challengeIndex].length != 0) revert OutOfOrderResolution();
+            if (!resolvedSubgames[challengeIndex]) revert OutOfOrderResolution();
 
             ClaimData storage claim = claimData[challengeIndex];
 
@@ -450,39 +618,71 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
             // from countering invalid subgame roots via an invalid defense position. As such positions
             // cannot be correctly countered.
             // Note that correctly positioned defense, but invalid claimes can still be successfully countered.
-            if (claim.counteredBy == address(0) && leftmostCounter.raw() > claim.position.raw()) {
-                countered = claim.claimant;
-                leftmostCounter = claim.position;
+            if (claim.counteredBy == address(0) && checkpoint.leftmostPosition.raw() > claim.position.raw()) {
+                checkpoint.counteredBy = claim.claimant;
+                checkpoint.leftmostPosition = claim.position;
             }
         }
 
-        // If the parent was not successfully countered, pay out the parent's bond to the claimant.
-        // If the parent was successfully countered, pay out the parent's bond to the challenger.
-        _distributeBond(countered == address(0) ? parent.claimant : countered, parent);
+        // Increase the checkpoint's cursor position by the number of children that were checked.
+        checkpoint.subgameIndex = uint32(finalCursor);
+
+        // Persist the checkpoint and allow for continuing in a separate transaction, if resolution is not already
+        // complete.
+        resolutionCheckpoints[_claimIndex] = checkpoint;
 
-        // Once a subgame is resolved, we percolate the result up the DAG so subsequent calls to
-        // resolveClaim will not need to traverse this subgame.
-        parent.counteredBy = countered;
+        // If all children have been traversed in the above loop, the subgame may be resolved. Otherwise, persist the
+        // checkpoint and allow for continuation in a separate transaction.
+        if (checkpoint.subgameIndex == challengeIndicesLen) {
+            address countered = checkpoint.counteredBy;
 
-        // Resolved subgames have no entries
-        delete subgames[_claimIndex];
+            // Mark the subgame as resolved.
+            resolvedSubgames[_claimIndex] = true;
 
-        // Indicate the game is ready to be resolved globally.
-        if (_claimIndex == 0) {
-            subgameAtRootResolved = true;
+            // Distribute the bond to the appropriate party.
+            if (_claimIndex == 0 && l2BlockNumberChallenged) {
+                // Special case: If the root claim has been challenged with the `challengeRootL2Block` function,
+                // the bond is always paid out to the issuer of that challenge.
+                address challenger = l2BlockNumberChallenger;
+                _distributeBond(challenger, subgameRootClaim);
+                subgameRootClaim.counteredBy = challenger;
+            } else {
+                // If the parent was not successfully countered, pay out the parent's bond to the claimant.
+                // If the parent was successfully countered, pay out the parent's bond to the challenger.
+                _distributeBond(countered == address(0) ? subgameRootClaim.claimant : countered, subgameRootClaim);
+
+                // Once a subgame is resolved, we percolate the result up the DAG so subsequent calls to
+                // resolveClaim will not need to traverse this subgame.
+                subgameRootClaim.counteredBy = countered;
+            }
         }
     }
 
+    /// @inheritdoc IDisputeGame
+    function gameType() public view override returns (GameType gameType_) {
+        gameType_ = GAME_TYPE;
+    }
+
+    /// @inheritdoc IDisputeGame
+    function gameCreator() public pure returns (address creator_) {
+        creator_ = _getArgAddress(0x00);
+    }
+
     /// @inheritdoc IDisputeGame
     function rootClaim() public pure returns (Claim rootClaim_) {
-        rootClaim_ = Claim.wrap(_getArgFixedBytes(0x00));
+        rootClaim_ = Claim.wrap(_getArgBytes32(0x14));
+    }
+
+    /// @inheritdoc IDisputeGame
+    function l1Head() public pure returns (Hash l1Head_) {
+        l1Head_ = Hash.wrap(_getArgBytes32(0x34));
     }
 
     /// @inheritdoc IDisputeGame
     function extraData() public pure returns (bytes memory extraData_) {
         // The extra data starts at the second word within the cwia calldata and
         // is 32 bytes long.
-        extraData_ = _getArgDynBytes(0x40, 0x20);
+        extraData_ = _getArgBytes(0x54, 0x20);
     }
 
     /// @inheritdoc IDisputeGame
@@ -496,67 +696,6 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
     //                       MISC EXTERNAL                        //
     ////////////////////////////////////////////////////////////////
 
-    /// @inheritdoc IInitializable
-    function initialize() public payable virtual {
-        // SAFETY: Any revert in this function will bubble up to the DisputeGameFactory and
-        // prevent the game from being created.
-        //
-        // Implicit assumptions:
-        // - The `gameStatus` state variable defaults to 0, which is `GameStatus.IN_PROGRESS`
-        // - The dispute game factory will enforce the required bond to initialize the game.
-        //
-        // Explicit checks:
-        // - The game must not have already been initialized.
-        // - An output root cannot be proposed at or before the genesis block.
-
-        // INVARIANT: The game must not have already been initialized.
-        if (initialized) revert AlreadyInitialized();
-
-        // Do not allow the game to be initialized if the root claim corresponds to a block at or before the
-        // configured genesis block number.
-        if (l2BlockNumber() <= GENESIS_BLOCK_NUMBER) revert UnexpectedRootClaim(rootClaim());
-
-        // Revert if the calldata size is too large, which signals that the `extraData` contains more than expected.
-        // This is to prevent adding extra bytes to the `extraData` that result in a different game UUID in the factory,
-        // but are not used by the game, which would allow for multiple dispute games for the same output proposal to
-        // be created.
-        // Expected length: 0x66 (0x04 selector + 0x20 root claim + 0x20 l1 head + 0x20 extraData + 0x02 CWIA bytes)
-        assembly {
-            if gt(calldatasize(), 0x66) {
-                // Store the selector for `ExtraDataTooLong()` & revert
-                mstore(0x00, 0xc407e025)
-                revert(0x1C, 0x04)
-            }
-        }
-
-        // Set the root claim
-        claimData.push(
-            ClaimData({
-                parentIndex: type(uint32).max,
-                counteredBy: address(0),
-                claimant: tx.origin,
-                bond: uint128(msg.value),
-                claim: rootClaim(),
-                position: ROOT_POSITION,
-                clock: LibClock.wrap(Duration.wrap(0), Timestamp.wrap(uint64(block.timestamp)))
-            })
-        );
-
-        // Deposit the bond.
-        WETH.deposit{ value: msg.value }();
-
-        // Set the game's starting timestamp
-        createdAt = Timestamp.wrap(uint64(block.timestamp));
-
-        // Set the game as initialized.
-        initialized = true;
-    }
-
-    /// @notice Returns the length of the `claimData` array.
-    function claimDataLen() external view returns (uint256 len_) {
-        len_ = claimData.length;
-    }
-
     /// @notice Returns the required bond for a given move kind.
     /// @param _position The position of the bonded interaction.
     /// @return requiredBond_ The required ETH bond for the given move, in wei.
@@ -567,7 +706,7 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
         // Values taken from Big Bonds v1.5 (TM) spec.
         uint256 assumedBaseFee = 200 gwei;
         uint256 baseGasCharged = 400_000;
-        uint256 highGasCharged = 200_000_000;
+        uint256 highGasCharged = 300_000_000;
 
         // Goal here is to compute the fixed multiplier that will be applied to the base gas
         // charged to get the required gas amount for the given depth. We apply this multiplier
@@ -611,9 +750,7 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
         credit[_recipient] = 0;
 
         // Revert if the recipient has no credit to claim.
-        if (recipientCredit == 0) {
-            revert NoCreditToClaim();
-        }
+        if (recipientCredit == 0) revert NoCreditToClaim();
 
         // Try to withdraw the WETH amount so it can be used here.
         WETH.withdraw(_recipient, recipientCredit);
@@ -623,10 +760,34 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
         if (!success) revert BondTransferFailed();
     }
 
-    /// @notice Returns the flag set in the `bond` field of a `ClaimData` struct to indicate that the bond has been
-    ///         claimed.
-    function claimedBondFlag() external pure returns (uint128 claimedBondFlag_) {
-        claimedBondFlag_ = CLAIMED_BOND_FLAG;
+    /// @notice Returns the amount of time elapsed on the potential challenger to `_claimIndex`'s chess clock. Maxes
+    ///         out at `MAX_CLOCK_DURATION`.
+    /// @param _claimIndex The index of the subgame root claim.
+    /// @return duration_ The time elapsed on the potential challenger to `_claimIndex`'s chess clock.
+    function getChallengerDuration(uint256 _claimIndex) public view returns (Duration duration_) {
+        // INVARIANT: The game must be in progress to query the remaining time to respond to a given claim.
+        if (status != GameStatus.IN_PROGRESS) {
+            revert GameNotInProgress();
+        }
+
+        // Fetch the subgame root claim.
+        ClaimData storage subgameRootClaim = claimData[_claimIndex];
+
+        // Fetch the parent of the subgame root's clock, if it exists.
+        Clock parentClock;
+        if (subgameRootClaim.parentIndex != type(uint32).max) {
+            parentClock = claimData[subgameRootClaim.parentIndex].clock;
+        }
+
+        // Compute the duration elapsed of the potential challenger's clock.
+        uint64 challengeDuration =
+            uint64(parentClock.duration().raw() + (block.timestamp - subgameRootClaim.clock.timestamp().raw()));
+        duration_ = challengeDuration > MAX_CLOCK_DURATION.raw() ? MAX_CLOCK_DURATION : Duration.wrap(challengeDuration);
+    }
+
+    /// @notice Returns the length of the `claimData` array.
+    function claimDataLen() external view returns (uint256 len_) {
+        len_ = claimData.length;
     }
 
     ////////////////////////////////////////////////////////////////
@@ -648,9 +809,14 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
         splitDepth_ = SPLIT_DEPTH;
     }
 
-    /// @notice Returns the game duration.
-    function gameDuration() external view returns (Duration gameDuration_) {
-        gameDuration_ = GAME_DURATION;
+    /// @notice Returns the max clock duration.
+    function maxClockDuration() external view returns (Duration maxClockDuration_) {
+        maxClockDuration_ = MAX_CLOCK_DURATION;
+    }
+
+    /// @notice Returns the clock extension constant.
+    function clockExtension() external view returns (Duration clockExtension_) {
+        clockExtension_ = CLOCK_EXTENSION;
     }
 
     /// @notice Returns the address of the VM.
@@ -658,21 +824,16 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
         vm_ = VM;
     }
 
-    /// @notice Returns the genesis block number.
-    function genesisBlockNumber() external view returns (uint256 genesisBlockNumber_) {
-        genesisBlockNumber_ = GENESIS_BLOCK_NUMBER;
-    }
-
-    /// @notice Returns the genesis output root.
-    function genesisOutputRoot() external view returns (Hash genesisOutputRoot_) {
-        genesisOutputRoot_ = GENESIS_OUTPUT_ROOT;
-    }
-
     /// @notice Returns the WETH contract for holding ETH.
     function weth() external view returns (IDelayedWETH weth_) {
         weth_ = WETH;
     }
 
+    /// @notice Returns the anchor state registry contract.
+    function anchorStateRegistry() external view returns (IAnchorStateRegistry registry_) {
+        registry_ = ANCHOR_STATE_REGISTRY;
+    }
+
     /// @notice Returns the chain ID of the L2 network this contract argues about.
     function l2ChainId() external view returns (uint256 l2ChainId_) {
         l2ChainId_ = L2_CHAIN_ID;
@@ -688,8 +849,6 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
     function _distributeBond(address _recipient, ClaimData storage _bonded) internal {
         // Set all bits in the bond value to indicate that the bond has been paid out.
         uint256 bond = _bonded.bond;
-        if (bond == CLAIMED_BOND_FLAG) revert ClaimAlreadyResolved();
-        _bonded.bond = CLAIMED_BOND_FLAG;
 
         // Increase the recipient's credit.
         credit[_recipient] += bond;
@@ -813,14 +972,14 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
         // 2. If it was a defense, the starting output root is `claim`, and the disputed output root is
         //    elsewhere in the DAG (it must commit to the block # index at depth of `outputPos + 1`).
         if (wasAttack) {
-            // If this is an attack on the first output root (the block directly after genesis), the
-            // starting claim nor position exists in the tree. We leave these as 0, which can be easily
-            // identified due to 0 being an invalid Gindex.
+            // If this is an attack on the first output root (the block directly after the starting
+            // block number), the starting claim nor position exists in the tree. We leave these as
+            // 0, which can be easily identified due to 0 being an invalid Gindex.
             if (outputPos.indexAtDepth() > 0) {
                 ClaimData storage starting = _findTraceAncestor(Position.wrap(outputPos.raw() - 1), claimIdx, true);
                 (startingClaim_, startingPos_) = (starting.claim, starting.position);
             } else {
-                startingClaim_ = Claim.wrap(GENESIS_OUTPUT_ROOT.raw());
+                startingClaim_ = Claim.wrap(startingOutputRoot.root.raw());
             }
             (disputedClaim_, disputedPos_) = (claim.claim, claim.position);
         } else {
@@ -857,10 +1016,8 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
     {
         // A position of 0 indicates that the starting claim is the absolute prestate. In this special case,
         // we do not include the starting claim within the local context hash.
-        if (_startingPos.raw() == 0) {
-            uuid_ = Hash.wrap(keccak256(abi.encode(_disputed, _disputedPos)));
-        } else {
-            uuid_ = Hash.wrap(keccak256(abi.encode(_starting, _startingPos, _disputed, _disputedPos)));
-        }
+        uuid_ = _startingPos.raw() == 0
+            ? Hash.wrap(keccak256(abi.encode(_disputed, _disputedPos)))
+            : Hash.wrap(keccak256(abi.encode(_starting, _startingPos, _disputed, _disputedPos)));
     }
 }
diff --git a/packages/contracts-bedrock/src/dispute/FaultDisputeGame2.sol b/packages/contracts-bedrock/src/dispute/FaultDisputeGame2.sol
new file mode 100644
index 000000000000..24f46ed1d9fb
--- /dev/null
+++ b/packages/contracts-bedrock/src/dispute/FaultDisputeGame2.sol
@@ -0,0 +1,945 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { FixedPointMathLib } from "@solady/utils/FixedPointMathLib.sol";
+
+import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol";
+import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
+import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol";
+import { IInitializable } from "src/dispute/interfaces/IInitializable.sol";
+import { IBigStepper, IPreimageOracle } from "src/dispute/interfaces/IBigStepper.sol";
+import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol";
+
+import { Clone } from "@solady/utils/Clone.sol";
+import { Types } from "src/libraries/Types.sol";
+import { ISemver } from "src/universal/ISemver.sol";
+
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
+
+/// @title FaultDisputeGame
+/// @notice An implementation of the `IFaultDisputeGame` interface.
+contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
+    ////////////////////////////////////////////////////////////////
+    //                         State Vars                         //
+    ////////////////////////////////////////////////////////////////
+
+    /// @notice The absolute prestate of the instruction trace. This is a constant that is defined
+    ///         by the program that is being used to execute the trace.
+    Claim internal immutable ABSOLUTE_PRESTATE;
+
+    /// @notice The max depth of the game.
+    uint256 internal immutable MAX_GAME_DEPTH;
+
+    /// @notice The max depth of the output bisection portion of the position tree. Immediately beneath
+    ///         this depth, execution trace bisection begins.
+    uint256 internal immutable SPLIT_DEPTH;
+
+    /// @notice The maximum duration that may accumulate on a team's chess clock before they may no longer respond.
+    Duration internal immutable MAX_CLOCK_DURATION;
+
+    /// @notice An onchain VM that performs single instruction steps on a fault proof program trace.
+    IBigStepper internal immutable VM;
+
+    /// @notice The game type ID.
+    GameType internal immutable GAME_TYPE;
+
+    /// @notice WETH contract for holding ETH.
+    IDelayedWETH internal immutable WETH;
+
+    /// @notice The anchor state registry.
+    IAnchorStateRegistry internal immutable ANCHOR_STATE_REGISTRY;
+
+    /// @notice The chain ID of the L2 network this contract argues about.
+    uint256 internal immutable L2_CHAIN_ID;
+
+    /// @notice The duration of the clock extension. Will be doubled if the grandchild is the root claim of an execution
+    ///         trace bisection subgame.
+    Duration internal immutable CLOCK_EXTENSION;
+
+    /// @notice The global root claim's position is always at gindex 1.
+    Position internal constant ROOT_POSITION = Position.wrap(1);
+
+    /// @notice Semantic version.
+    /// @custom:semver 0.18.1
+    string public constant version = "0.18.1";
+
+    /// @notice The starting timestamp of the game
+    Timestamp public createdAt;
+
+    /// @notice The timestamp of the game's global resolution.
+    Timestamp public resolvedAt;
+
+    /// @inheritdoc IDisputeGame
+    GameStatus public status;
+
+    /// @notice Flag for the `initialize` function to prevent re-initialization.
+    bool internal initialized;
+
+    /// @notice An append-only array of all claims made during the dispute game.
+    ClaimData[] public claimData;
+
+    /// @notice Credited balances for winning participants.
+    mapping(address => uint256) public credit;
+
+    /// @notice A mapping to allow for constant-time lookups of existing claims.
+    mapping(Hash => bool) public claims;
+
+    /// @notice A mapping of subgames rooted at a claim index to other claim indices in the subgame.
+    mapping(uint256 => uint256[]) public subgames;
+
+    /// @notice A mapping of resolved subgames rooted at a claim index.
+    mapping(uint256 => bool) public resolvedSubgames;
+
+    /// @notice A mapping of claim indices to resolution checkpoints.
+    mapping(uint256 => ResolutionCheckpoint) public resolutionCheckpoints;
+
+    /// @notice The latest finalized output root, serving as the anchor for output bisection.
+    OutputRoot public startingOutputRoot;
+
+    /// @param _gameType The type ID of the game.
+    /// @param _absolutePrestate The absolute prestate of the instruction trace.
+    /// @param _maxGameDepth The maximum depth of bisection.
+    /// @param _splitDepth The final depth of the output bisection portion of the game.
+    /// @param _clockExtension The clock extension to perform when the remaining duration is less than the extension.
+    /// @param _maxClockDuration The maximum amount of time that may accumulate on a team's chess clock.
+    /// @param _vm An onchain VM that performs single instruction steps on an FPP trace.
+    /// @param _weth WETH contract for holding ETH.
+    /// @param _anchorStateRegistry The contract that stores the anchor state for each game type.
+    /// @param _l2ChainId Chain ID of the L2 network this contract argues about.
+    constructor(
+        GameType _gameType,
+        Claim _absolutePrestate,
+        uint256 _maxGameDepth,
+        uint256 _splitDepth,
+        Duration _clockExtension,
+        Duration _maxClockDuration,
+        IBigStepper _vm,
+        IDelayedWETH _weth,
+        IAnchorStateRegistry _anchorStateRegistry,
+        uint256 _l2ChainId
+    ) {
+        // The max game depth may not be greater than `LibPosition.MAX_POSITION_BITLEN - 1`.
+        if (_maxGameDepth > LibPosition.MAX_POSITION_BITLEN - 1) revert MaxDepthTooLarge();
+        // The split depth cannot be greater than or equal to the max game depth.
+        if (_splitDepth >= _maxGameDepth) revert InvalidSplitDepth();
+        // The clock extension may not be greater than the max clock duration.
+        if (_clockExtension.raw() > _maxClockDuration.raw()) revert InvalidClockExtension();
+
+        GAME_TYPE = _gameType;
+        ABSOLUTE_PRESTATE = _absolutePrestate;
+        MAX_GAME_DEPTH = _maxGameDepth;
+        SPLIT_DEPTH = _splitDepth;
+        CLOCK_EXTENSION = _clockExtension;
+        MAX_CLOCK_DURATION = _maxClockDuration;
+        VM = _vm;
+        WETH = _weth;
+        ANCHOR_STATE_REGISTRY = _anchorStateRegistry;
+        L2_CHAIN_ID = _l2ChainId;
+    }
+
+    /// @inheritdoc IInitializable
+    function initialize() public payable virtual {
+        // SAFETY: Any revert in this function will bubble up to the DisputeGameFactory and
+        // prevent the game from being created.
+        //
+        // Implicit assumptions:
+        // - The `gameStatus` state variable defaults to 0, which is `GameStatus.IN_PROGRESS`
+        // - The dispute game factory will enforce the required bond to initialize the game.
+        //
+        // Explicit checks:
+        // - The game must not have already been initialized.
+        // - An output root cannot be proposed at or before the starting block number.
+
+        // INVARIANT: The game must not have already been initialized.
+        if (initialized) revert AlreadyInitialized();
+
+        // Grab the latest anchor root.
+        (Hash root, uint256 rootBlockNumber) = ANCHOR_STATE_REGISTRY.anchors(GAME_TYPE);
+
+        // Should only happen if this is a new game type that hasn't been set up yet.
+        if (root.raw() == bytes32(0)) revert AnchorRootNotFound();
+
+        // Set the starting output root.
+        startingOutputRoot = OutputRoot({ l2BlockNumber: rootBlockNumber, root: root });
+
+        // Revert if the calldata size is not the expected length.
+        //
+        // This is to prevent adding extra or omitting bytes from to `extraData` that result in a different game UUID
+        // in the factory, but are not used by the game, which would allow for multiple dispute games for the same
+        // output proposal to be created.
+        //
+        // Expected length: 0x7A
+        // - 0x04 selector
+        // - 0x14 creator address
+        // - 0x20 root claim
+        // - 0x20 l1 head
+        // - 0x20 extraData
+        // - 0x02 CWIA bytes
+        assembly {
+            if iszero(eq(calldatasize(), 0x7A)) {
+                // Store the selector for `BadExtraData()` & revert
+                mstore(0x00, 0x9824bdab)
+                revert(0x1C, 0x04)
+            }
+        }
+
+        // Do not allow the game to be initialized if the root claim corresponds to a block at or before the
+        // configured starting block number.
+        if (l2BlockNumber() <= rootBlockNumber) revert UnexpectedRootClaim(rootClaim());
+
+        // Set the root claim
+        claimData.push(
+            ClaimData({
+                parentIndex: type(uint32).max,
+                counteredBy: address(0),
+                claimant: gameCreator(),
+                bond: uint128(msg.value),
+                claim: rootClaim(),
+                position: ROOT_POSITION,
+                clock: LibClock.wrap(Duration.wrap(0), Timestamp.wrap(uint64(block.timestamp)))
+            })
+        );
+
+        // Set the game as initialized.
+        initialized = true;
+
+        // Deposit the bond.
+        WETH.deposit{ value: msg.value }();
+
+        // Set the game's starting timestamp
+        createdAt = Timestamp.wrap(uint64(block.timestamp));
+    }
+
+    ////////////////////////////////////////////////////////////////
+    //                  `IFaultDisputeGame` impl                  //
+    ////////////////////////////////////////////////////////////////
+
+    /// @inheritdoc IFaultDisputeGame
+    function step(
+        uint256 _claimIndex,
+        bool _isAttack,
+        bytes calldata _stateData,
+        bytes calldata _proof
+    )
+        public
+        virtual
+    {
+        // INVARIANT: Steps cannot be made unless the game is currently in progress.
+        if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress();
+
+        // Get the parent. If it does not exist, the call will revert with OOB.
+        ClaimData storage parent = claimData[_claimIndex];
+
+        // Pull the parent position out of storage.
+        Position parentPos = parent.position;
+        // Determine the position of the step.
+        Position stepPos = parentPos.move(_isAttack);
+
+        // INVARIANT: A step cannot be made unless the move position is 1 below the `MAX_GAME_DEPTH`
+        if (stepPos.depth() != MAX_GAME_DEPTH + 1) revert InvalidParent();
+
+        // Determine the expected pre & post states of the step.
+        Claim preStateClaim;
+        ClaimData storage postState;
+        if (_isAttack) {
+            // If the step position's index at depth is 0, the prestate is the absolute
+            // prestate.
+            // If the step is an attack at a trace index > 0, the prestate exists elsewhere in
+            // the game state.
+            // NOTE: We localize the `indexAtDepth` for the current execution trace subgame by finding
+            //       the remainder of the index at depth divided by 2 ** (MAX_GAME_DEPTH - SPLIT_DEPTH),
+            //       which is the number of leaves in each execution trace subgame. This is so that we can
+            //       determine whether or not the step position is represents the `ABSOLUTE_PRESTATE`.
+            preStateClaim = (stepPos.indexAtDepth() % (1 << (MAX_GAME_DEPTH - SPLIT_DEPTH))) == 0
+                ? ABSOLUTE_PRESTATE
+                : _findTraceAncestor(Position.wrap(parentPos.raw() - 1), parent.parentIndex, false).claim;
+            // For all attacks, the poststate is the parent claim.
+            postState = parent;
+        } else {
+            // If the step is a defense, the poststate exists elsewhere in the game state,
+            // and the parent claim is the expected pre-state.
+            preStateClaim = parent.claim;
+            postState = _findTraceAncestor(Position.wrap(parentPos.raw() + 1), parent.parentIndex, false);
+        }
+
+        // INVARIANT: The prestate is always invalid if the passed `_stateData` is not the
+        //            preimage of the prestate claim hash.
+        //            We ignore the highest order byte of the digest because it is used to
+        //            indicate the VM Status and is added after the digest is computed.
+        if (keccak256(_stateData) << 8 != preStateClaim.raw() << 8) revert InvalidPrestate();
+
+        // Compute the local preimage context for the step.
+        Hash uuid = _findLocalContext(_claimIndex);
+
+        // INVARIANT: If a step is an attack, the poststate is valid if the step produces
+        //            the same poststate hash as the parent claim's value.
+        //            If a step is a defense:
+        //              1. If the parent claim and the found post state agree with each other
+        //                 (depth diff % 2 == 0), the step is valid if it produces the same
+        //                 state hash as the post state's claim.
+        //              2. If the parent claim and the found post state disagree with each other
+        //                 (depth diff % 2 != 0), the parent cannot be countered unless the step
+        //                 produces the same state hash as `postState.claim`.
+        // SAFETY:    While the `attack` path does not need an extra check for the post
+        //            state's depth in relation to the parent, we don't need another
+        //            branch because (n - n) % 2 == 0.
+        bool validStep = VM.step(_stateData, _proof, uuid.raw()) == postState.claim.raw();
+        bool parentPostAgree = (parentPos.depth() - postState.position.depth()) % 2 == 0;
+        if (parentPostAgree == validStep) revert ValidStep();
+
+        // INVARIANT: A step cannot be made against a claim for a second time.
+        if (parent.counteredBy != address(0)) revert DuplicateStep();
+
+        // Set the parent claim as countered. We do not need to append a new claim to the game;
+        // instead, we can just set the existing parent as countered.
+        parent.counteredBy = msg.sender;
+    }
+
+    /// @notice Generic move function, used for both `attack` and `defend` moves.
+    /// @param _challengeIndex The index of the claim being moved against.
+    /// @param _claim The claim at the next logical position in the game.
+    /// @param _isAttack Whether or not the move is an attack or defense.
+    function move(uint256 _challengeIndex, Claim _claim, bool _isAttack) public payable virtual {
+        // INVARIANT: Moves cannot be made unless the game is currently in progress.
+        if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress();
+
+        // Get the parent. If it does not exist, the call will revert with OOB.
+        ClaimData memory parent = claimData[_challengeIndex];
+
+        // Compute the position that the claim commits to. Because the parent's position is already
+        // known, we can compute the next position by moving left or right depending on whether
+        // or not the move is an attack or defense.
+        Position parentPos = parent.position;
+        Position nextPosition = parentPos.move(_isAttack);
+        uint256 nextPositionDepth = nextPosition.depth();
+
+        // INVARIANT: A defense can never be made against the root claim of either the output root game or any
+        //            of the execution trace bisection subgames. This is because the root claim commits to the
+        //            entire state. Therefore, the only valid defense is to do nothing if it is agreed with.
+        if ((_challengeIndex == 0 || nextPositionDepth == SPLIT_DEPTH + 2) && !_isAttack) {
+            revert CannotDefendRootClaim();
+        }
+
+        // INVARIANT: A move can never surpass the `MAX_GAME_DEPTH`. The only option to counter a
+        //            claim at this depth is to perform a single instruction step on-chain via
+        //            the `step` function to prove that the state transition produces an unexpected
+        //            post-state.
+        if (nextPositionDepth > MAX_GAME_DEPTH) revert GameDepthExceeded();
+
+        // When the next position surpasses the split depth (i.e., it is the root claim of an execution
+        // trace bisection sub-game), we need to perform some extra verification steps.
+        if (nextPositionDepth == SPLIT_DEPTH + 1) {
+            _verifyExecBisectionRoot(_claim, _challengeIndex, parentPos, _isAttack);
+        }
+
+        // INVARIANT: The `msg.value` must exactly equal the required bond.
+        if (getRequiredBond(nextPosition) != msg.value) revert IncorrectBondAmount();
+
+        // Compute the duration of the next clock. This is done by adding the duration of the
+        // grandparent claim to the difference between the current block timestamp and the
+        // parent's clock timestamp.
+        Duration nextDuration = getChallengerDuration(_challengeIndex);
+
+        // INVARIANT: A move can never be made once its clock has exceeded `MAX_CLOCK_DURATION`
+        //            seconds of time.
+        if (nextDuration.raw() == MAX_CLOCK_DURATION.raw()) revert ClockTimeExceeded();
+
+        // If the remaining clock time has less than `CLOCK_EXTENSION` seconds remaining, grant the potential
+        // grandchild's clock `CLOCK_EXTENSION` seconds. This is to ensure that, even if a player has to inherit another
+        // team's clock to counter a freeloader claim, they will always have enough time to to respond. This extension
+        // is bounded by the depth of the tree. If the potential grandchild is an execution trace bisection root, the
+        // clock extension is doubled. This is to allow for extra time for the off-chain challenge agent to generate
+        // the initial instruction trace on the native FPVM.
+        if (nextDuration.raw() > MAX_CLOCK_DURATION.raw() - CLOCK_EXTENSION.raw()) {
+            // If the potential grandchild is an execution trace bisection root, double the clock extension.
+            uint64 extensionPeriod =
+                nextPositionDepth == SPLIT_DEPTH - 1 ? CLOCK_EXTENSION.raw() * 2 : CLOCK_EXTENSION.raw();
+            nextDuration = Duration.wrap(MAX_CLOCK_DURATION.raw() - extensionPeriod);
+        }
+
+        // Construct the next clock with the new duration and the current block timestamp.
+        Clock nextClock = LibClock.wrap(nextDuration, Timestamp.wrap(uint64(block.timestamp)));
+
+        // INVARIANT: There cannot be multiple identical claims with identical moves on the same challengeIndex. Multiple
+        //            claims at the same position may dispute the same challengeIndex. However, they must have different
+        //            values.
+        Hash claimHash = _claim.hashClaimPos(nextPosition, _challengeIndex);
+        if (claims[claimHash]) revert ClaimAlreadyExists();
+        claims[claimHash] = true;
+
+        // Create the new claim.
+        claimData.push(
+            ClaimData({
+                parentIndex: uint32(_challengeIndex),
+                // This is updated during subgame resolution
+                counteredBy: address(0),
+                claimant: msg.sender,
+                bond: uint128(msg.value),
+                claim: _claim,
+                position: nextPosition,
+                clock: nextClock
+            })
+        );
+
+        // Update the subgame rooted at the parent claim.
+        subgames[_challengeIndex].push(claimData.length - 1);
+
+        // Deposit the bond.
+        WETH.deposit{ value: msg.value }();
+
+        // Emit the appropriate event for the attack or defense.
+        emit Move(_challengeIndex, _claim, msg.sender);
+    }
+
+    /// @inheritdoc IFaultDisputeGame
+    function attack(uint256 _parentIndex, Claim _claim) external payable {
+        move(_parentIndex, _claim, true);
+    }
+
+    /// @inheritdoc IFaultDisputeGame
+    function defend(uint256 _parentIndex, Claim _claim) external payable {
+        move(_parentIndex, _claim, false);
+    }
+
+    /// @inheritdoc IFaultDisputeGame
+    function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) external {
+        // INVARIANT: Local data can only be added if the game is currently in progress.
+        if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress();
+
+        (Claim starting, Position startingPos, Claim disputed, Position disputedPos) =
+            _findStartingAndDisputedOutputs(_execLeafIdx);
+        Hash uuid = _computeLocalContext(starting, startingPos, disputed, disputedPos);
+
+        IPreimageOracle oracle = VM.oracle();
+        if (_ident == LocalPreimageKey.L1_HEAD_HASH) {
+            // Load the L1 head hash
+            oracle.loadLocalData(_ident, uuid.raw(), l1Head().raw(), 32, _partOffset);
+        } else if (_ident == LocalPreimageKey.STARTING_OUTPUT_ROOT) {
+            // Load the starting proposal's output root.
+            oracle.loadLocalData(_ident, uuid.raw(), starting.raw(), 32, _partOffset);
+        } else if (_ident == LocalPreimageKey.DISPUTED_OUTPUT_ROOT) {
+            // Load the disputed proposal's output root
+            oracle.loadLocalData(_ident, uuid.raw(), disputed.raw(), 32, _partOffset);
+        } else if (_ident == LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER) {
+            // Load the disputed proposal's L2 block number as a big-endian uint64 in the
+            // high order 8 bytes of the word.
+
+            // We add the index at depth + 1 to the starting block number to get the disputed L2
+            // block number.
+            uint256 l2Number = startingOutputRoot.l2BlockNumber + disputedPos.traceIndex(SPLIT_DEPTH) + 1;
+
+            oracle.loadLocalData(_ident, uuid.raw(), bytes32(l2Number << 0xC0), 8, _partOffset);
+        } else if (_ident == LocalPreimageKey.CHAIN_ID) {
+            // Load the chain ID as a big-endian uint64 in the high order 8 bytes of the word.
+            oracle.loadLocalData(_ident, uuid.raw(), bytes32(L2_CHAIN_ID << 0xC0), 8, _partOffset);
+        } else {
+            revert InvalidLocalIdent();
+        }
+    }
+
+    /// @inheritdoc IFaultDisputeGame
+    function getNumToResolve(uint256 _claimIndex) public view returns (uint256 numRemainingChildren_) {
+        ResolutionCheckpoint storage checkpoint = resolutionCheckpoints[_claimIndex];
+        uint256[] storage challengeIndices = subgames[_claimIndex];
+        uint256 challengeIndicesLen = challengeIndices.length;
+
+        numRemainingChildren_ = challengeIndicesLen - checkpoint.subgameIndex;
+    }
+
+    /// @inheritdoc IFaultDisputeGame
+    function l2BlockNumber() public pure returns (uint256 l2BlockNumber_) {
+        l2BlockNumber_ = _getArgUint256(0x54);
+    }
+
+    /// @inheritdoc IFaultDisputeGame
+    function startingBlockNumber() external view returns (uint256 startingBlockNumber_) {
+        startingBlockNumber_ = startingOutputRoot.l2BlockNumber;
+    }
+
+    /// @inheritdoc IFaultDisputeGame
+    function startingRootHash() external view returns (Hash startingRootHash_) {
+        startingRootHash_ = startingOutputRoot.root;
+    }
+
+    ////////////////////////////////////////////////////////////////
+    //                    `IDisputeGame` impl                     //
+    ////////////////////////////////////////////////////////////////
+
+    /// @inheritdoc IDisputeGame
+    function resolve() external returns (GameStatus status_) {
+        // INVARIANT: Resolution cannot occur unless the game is currently in progress.
+        if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress();
+
+        // INVARIANT: Resolution cannot occur unless the absolute root subgame has been resolved.
+        if (!resolvedSubgames[0]) revert OutOfOrderResolution();
+
+        // Update the global game status; The dispute has concluded.
+        status_ = claimData[0].counteredBy == address(0) ? GameStatus.DEFENDER_WINS : GameStatus.CHALLENGER_WINS;
+        resolvedAt = Timestamp.wrap(uint64(block.timestamp));
+
+        // Update the status and emit the resolved event, note that we're performing an assignment here.
+        emit Resolved(status = status_);
+
+        // Try to update the anchor state, this should not revert.
+        ANCHOR_STATE_REGISTRY.tryUpdateAnchorState();
+    }
+
+    /// @inheritdoc IFaultDisputeGame
+    function resolveClaim(uint256 _claimIndex, uint256 _numToResolve) external {
+        // INVARIANT: Resolution cannot occur unless the game is currently in progress.
+        if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress();
+
+        ClaimData storage subgameRootClaim = claimData[_claimIndex];
+        Duration challengeClockDuration = getChallengerDuration(_claimIndex);
+
+        // INVARIANT: Cannot resolve a subgame unless the clock of its would-be counter has expired
+        // INVARIANT: Assuming ordered subgame resolution, challengeClockDuration is always >= MAX_CLOCK_DURATION if all
+        // descendant subgames are resolved
+        if (challengeClockDuration.raw() < MAX_CLOCK_DURATION.raw()) revert ClockNotExpired();
+
+        // INVARIANT: Cannot resolve a subgame twice.
+        if (resolvedSubgames[_claimIndex]) revert ClaimAlreadyResolved();
+
+        uint256[] storage challengeIndices = subgames[_claimIndex];
+        uint256 challengeIndicesLen = challengeIndices.length;
+
+        // Uncontested claims are resolved implicitly unless they are the root claim. Pay out the bond to the claimant
+        // and return early.
+        if (challengeIndicesLen == 0 && _claimIndex != 0) {
+            // In the event that the parent claim is at the max depth, there will always be 0 subgames. If the
+            // `counteredBy` field is set and there are no subgames, this implies that the parent claim was successfully
+            // stepped against. In this case, we pay out the bond to the party that stepped against the parent claim.
+            // Otherwise, the parent claim is uncontested, and the bond is returned to the claimant.
+            address counteredBy = subgameRootClaim.counteredBy;
+            address recipient = counteredBy == address(0) ? subgameRootClaim.claimant : counteredBy;
+            _distributeBond(recipient, subgameRootClaim);
+            resolvedSubgames[_claimIndex] = true;
+            return;
+        }
+
+        // Fetch the resolution checkpoint from storage.
+        ResolutionCheckpoint memory checkpoint = resolutionCheckpoints[_claimIndex];
+
+        // If the checkpoint does not currently exist, initialize the current left most position as max u128.
+        if (!checkpoint.initialCheckpointComplete) {
+            checkpoint.leftmostPosition = Position.wrap(type(uint128).max);
+            checkpoint.initialCheckpointComplete = true;
+
+            // If `_numToResolve == 0`, assume that we can check all child subgames in this one callframe.
+            if (_numToResolve == 0) _numToResolve = challengeIndicesLen;
+        }
+
+        // Assume parent is honest until proven otherwise
+        uint256 lastToResolve = checkpoint.subgameIndex + _numToResolve;
+        uint256 finalCursor = lastToResolve > challengeIndicesLen ? challengeIndicesLen : lastToResolve;
+        for (uint256 i = checkpoint.subgameIndex; i < finalCursor; i++) {
+            uint256 challengeIndex = challengeIndices[i];
+
+            // INVARIANT: Cannot resolve a subgame containing an unresolved claim
+            if (!resolvedSubgames[challengeIndex]) revert OutOfOrderResolution();
+
+            ClaimData storage claim = claimData[challengeIndex];
+
+            // If the child subgame is uncountered and further left than the current left-most counter,
+            // update the parent subgame's `countered` address and the current `leftmostCounter`.
+            // The left-most correct counter is preferred in bond payouts in order to discourage attackers
+            // from countering invalid subgame roots via an invalid defense position. As such positions
+            // cannot be correctly countered.
+            // Note that correctly positioned defense, but invalid claimes can still be successfully countered.
+            if (claim.counteredBy == address(0) && checkpoint.leftmostPosition.raw() > claim.position.raw()) {
+                checkpoint.counteredBy = claim.claimant;
+                checkpoint.leftmostPosition = claim.position;
+            }
+        }
+
+        // Increase the checkpoint's cursor position by the number of children that were checked.
+        checkpoint.subgameIndex = uint32(finalCursor);
+
+        // Persist the checkpoint and allow for continuing in a separate transaction, if resolution is not already
+        // complete.
+        resolutionCheckpoints[_claimIndex] = checkpoint;
+
+        // If all children have been traversed in the above loop, the subgame may be resolved. Otherwise, persist the
+        // checkpoint and allow for continuation in a separate transaction.
+        if (checkpoint.subgameIndex == challengeIndicesLen) {
+            address countered = checkpoint.counteredBy;
+
+            // Once a subgame is resolved, we percolate the result up the DAG so subsequent calls to
+            // resolveClaim will not need to traverse this subgame.
+            subgameRootClaim.counteredBy = countered;
+
+            // Mark the subgame as resolved.
+            resolvedSubgames[_claimIndex] = true;
+
+            // If the parent was not successfully countered, pay out the parent's bond to the claimant.
+            // If the parent was successfully countered, pay out the parent's bond to the challenger.
+            _distributeBond(countered == address(0) ? subgameRootClaim.claimant : countered, subgameRootClaim);
+        }
+    }
+
+    /// @inheritdoc IDisputeGame
+    function gameType() public view override returns (GameType gameType_) {
+        gameType_ = GAME_TYPE;
+    }
+
+    /// @inheritdoc IDisputeGame
+    function gameCreator() public pure returns (address creator_) {
+        creator_ = _getArgAddress(0x00);
+    }
+
+    /// @inheritdoc IDisputeGame
+    function rootClaim() public pure returns (Claim rootClaim_) {
+        rootClaim_ = Claim.wrap(_getArgBytes32(0x14));
+    }
+
+    /// @inheritdoc IDisputeGame
+    function l1Head() public pure returns (Hash l1Head_) {
+        l1Head_ = Hash.wrap(_getArgBytes32(0x34));
+    }
+
+    /// @inheritdoc IDisputeGame
+    function extraData() public pure returns (bytes memory extraData_) {
+        // The extra data starts at the second word within the cwia calldata and
+        // is 32 bytes long.
+        extraData_ = _getArgBytes(0x54, 0x20);
+    }
+
+    /// @inheritdoc IDisputeGame
+    function gameData() external view returns (GameType gameType_, Claim rootClaim_, bytes memory extraData_) {
+        gameType_ = gameType();
+        rootClaim_ = rootClaim();
+        extraData_ = extraData();
+    }
+
+    ////////////////////////////////////////////////////////////////
+    //                       MISC EXTERNAL                        //
+    ////////////////////////////////////////////////////////////////
+
+    /// @notice Returns the required bond for a given move kind.
+    /// @param _position The position of the bonded interaction.
+    /// @return requiredBond_ The required ETH bond for the given move, in wei.
+    function getRequiredBond(Position _position) public view returns (uint256 requiredBond_) {
+        uint256 depth = uint256(_position.depth());
+        if (depth > MAX_GAME_DEPTH) revert GameDepthExceeded();
+
+        // Values taken from Big Bonds v1.5 (TM) spec.
+        uint256 assumedBaseFee = 200 gwei;
+        uint256 baseGasCharged = 400_000;
+        uint256 highGasCharged = 300_000_000;
+
+        // Goal here is to compute the fixed multiplier that will be applied to the base gas
+        // charged to get the required gas amount for the given depth. We apply this multiplier
+        // some `n` times where `n` is the depth of the position. We are looking for some number
+        // that, when multiplied by itself `MAX_GAME_DEPTH` times and then multiplied by the base
+        // gas charged, will give us the maximum gas that we want to charge.
+        // We want to solve for (highGasCharged/baseGasCharged) ** (1/MAX_GAME_DEPTH).
+        // We know that a ** (b/c) is equal to e ** (ln(a) * (b/c)).
+        // We can compute e ** (ln(a) * (b/c)) quite easily with FixedPointMathLib.
+
+        // Set up a, b, and c.
+        uint256 a = highGasCharged / baseGasCharged;
+        uint256 b = FixedPointMathLib.WAD;
+        uint256 c = MAX_GAME_DEPTH * FixedPointMathLib.WAD;
+
+        // Compute ln(a).
+        // slither-disable-next-line divide-before-multiply
+        uint256 lnA = uint256(FixedPointMathLib.lnWad(int256(a * FixedPointMathLib.WAD)));
+
+        // Computes (b / c) with full precision using WAD = 1e18.
+        uint256 bOverC = FixedPointMathLib.divWad(b, c);
+
+        // Compute e ** (ln(a) * (b/c))
+        // sMulWad can be used here since WAD = 1e18 maintains the same precision.
+        uint256 numerator = FixedPointMathLib.mulWad(lnA, bOverC);
+        int256 base = FixedPointMathLib.expWad(int256(numerator));
+
+        // Compute the required gas amount.
+        int256 rawGas = FixedPointMathLib.powWad(base, int256(depth * FixedPointMathLib.WAD));
+        uint256 requiredGas = FixedPointMathLib.mulWad(baseGasCharged, uint256(rawGas));
+
+        // Compute the required bond.
+        requiredBond_ = assumedBaseFee * requiredGas;
+    }
+
+    /// @notice Claim the credit belonging to the recipient address.
+    /// @param _recipient The owner and recipient of the credit.
+    function claimCredit(address _recipient) external {
+        // Remove the credit from the recipient prior to performing the external call.
+        uint256 recipientCredit = credit[_recipient];
+        credit[_recipient] = 0;
+
+        // Revert if the recipient has no credit to claim.
+        if (recipientCredit == 0) {
+            revert NoCreditToClaim();
+        }
+
+        // Try to withdraw the WETH amount so it can be used here.
+        WETH.withdraw(_recipient, recipientCredit);
+
+        // Transfer the credit to the recipient.
+        (bool success,) = _recipient.call{ value: recipientCredit }(hex"");
+        if (!success) revert BondTransferFailed();
+    }
+
+    /// @notice Returns the amount of time elapsed on the potential challenger to `_claimIndex`'s chess clock. Maxes
+    ///         out at `MAX_CLOCK_DURATION`.
+    /// @param _claimIndex The index of the subgame root claim.
+    /// @return duration_ The time elapsed on the potential challenger to `_claimIndex`'s chess clock.
+    function getChallengerDuration(uint256 _claimIndex) public view returns (Duration duration_) {
+        // INVARIANT: The game must be in progress to query the remaining time to respond to a given claim.
+        if (status != GameStatus.IN_PROGRESS) {
+            revert GameNotInProgress();
+        }
+
+        // Fetch the subgame root claim.
+        ClaimData storage subgameRootClaim = claimData[_claimIndex];
+
+        // Fetch the parent of the subgame root's clock, if it exists.
+        Clock parentClock;
+        if (subgameRootClaim.parentIndex != type(uint32).max) {
+            parentClock = claimData[subgameRootClaim.parentIndex].clock;
+        }
+
+        // Compute the duration elapsed of the potential challenger's clock.
+        uint64 challengeDuration =
+            uint64(parentClock.duration().raw() + (block.timestamp - subgameRootClaim.clock.timestamp().raw()));
+        duration_ = challengeDuration > MAX_CLOCK_DURATION.raw() ? MAX_CLOCK_DURATION : Duration.wrap(challengeDuration);
+    }
+
+    /// @notice Returns the length of the `claimData` array.
+    function claimDataLen() external view returns (uint256 len_) {
+        len_ = claimData.length;
+    }
+
+    ////////////////////////////////////////////////////////////////
+    //                     IMMUTABLE GETTERS                      //
+    ////////////////////////////////////////////////////////////////
+
+    /// @notice Returns the absolute prestate of the instruction trace.
+    function absolutePrestate() external view returns (Claim absolutePrestate_) {
+        absolutePrestate_ = ABSOLUTE_PRESTATE;
+    }
+
+    /// @notice Returns the max game depth.
+    function maxGameDepth() external view returns (uint256 maxGameDepth_) {
+        maxGameDepth_ = MAX_GAME_DEPTH;
+    }
+
+    /// @notice Returns the split depth.
+    function splitDepth() external view returns (uint256 splitDepth_) {
+        splitDepth_ = SPLIT_DEPTH;
+    }
+
+    /// @notice Returns the max clock duration.
+    function maxClockDuration() external view returns (Duration maxClockDuration_) {
+        maxClockDuration_ = MAX_CLOCK_DURATION;
+    }
+
+    /// @notice Returns the clock extension constant.
+    function clockExtension() external view returns (Duration clockExtension_) {
+        clockExtension_ = CLOCK_EXTENSION;
+    }
+
+    /// @notice Returns the address of the VM.
+    function vm() external view returns (IBigStepper vm_) {
+        vm_ = VM;
+    }
+
+    /// @notice Returns the WETH contract for holding ETH.
+    function weth() external view returns (IDelayedWETH weth_) {
+        weth_ = WETH;
+    }
+
+    /// @notice Returns the anchor state registry contract.
+    function anchorStateRegistry() external view returns (IAnchorStateRegistry registry_) {
+        registry_ = ANCHOR_STATE_REGISTRY;
+    }
+
+    /// @notice Returns the chain ID of the L2 network this contract argues about.
+    function l2ChainId() external view returns (uint256 l2ChainId_) {
+        l2ChainId_ = L2_CHAIN_ID;
+    }
+
+    ////////////////////////////////////////////////////////////////
+    //                          HELPERS                           //
+    ////////////////////////////////////////////////////////////////
+
+    /// @notice Pays out the bond of a claim to a given recipient.
+    /// @param _recipient The recipient of the bond.
+    /// @param _bonded The claim to pay out the bond of.
+    function _distributeBond(address _recipient, ClaimData storage _bonded) internal {
+        // Set all bits in the bond value to indicate that the bond has been paid out.
+        uint256 bond = _bonded.bond;
+
+        // Increase the recipient's credit.
+        credit[_recipient] += bond;
+
+        // Unlock the bond.
+        WETH.unlock(_recipient, bond);
+    }
+
+    /// @notice Verifies the integrity of an execution bisection subgame's root claim. Reverts if the claim
+    ///         is invalid.
+    /// @param _rootClaim The root claim of the execution bisection subgame.
+    function _verifyExecBisectionRoot(
+        Claim _rootClaim,
+        uint256 _parentIdx,
+        Position _parentPos,
+        bool _isAttack
+    )
+        internal
+        view
+    {
+        // The root claim of an execution trace bisection sub-game must:
+        // 1. Signal that the VM panicked or resulted in an invalid transition if the disputed output root
+        //    was made by the opposing party.
+        // 2. Signal that the VM resulted in a valid transition if the disputed output root was made by the same party.
+
+        // If the move is a defense, the disputed output could have been made by either party. In this case, we
+        // need to search for the parent output to determine what the expected status byte should be.
+        Position disputedLeafPos = Position.wrap(_parentPos.raw() + 1);
+        ClaimData storage disputed = _findTraceAncestor({ _pos: disputedLeafPos, _start: _parentIdx, _global: true });
+        uint8 vmStatus = uint8(_rootClaim.raw()[0]);
+
+        if (_isAttack || disputed.position.depth() % 2 == SPLIT_DEPTH % 2) {
+            // If the move is an attack, the parent output is always deemed to be disputed. In this case, we only need
+            // to check that the root claim signals that the VM panicked or resulted in an invalid transition.
+            // If the move is a defense, and the disputed output and creator of the execution trace subgame disagree,
+            // the root claim should also signal that the VM panicked or resulted in an invalid transition.
+            if (!(vmStatus == VMStatuses.INVALID.raw() || vmStatus == VMStatuses.PANIC.raw())) {
+                revert UnexpectedRootClaim(_rootClaim);
+            }
+        } else if (vmStatus != VMStatuses.VALID.raw()) {
+            // The disputed output and the creator of the execution trace subgame agree. The status byte should
+            // have signaled that the VM succeeded.
+            revert UnexpectedRootClaim(_rootClaim);
+        }
+    }
+
+    /// @notice Finds the trace ancestor of a given position within the DAG.
+    /// @param _pos The position to find the trace ancestor claim of.
+    /// @param _start The index to start searching from.
+    /// @param _global Whether or not to search the entire dag or just within an execution trace subgame. If set to
+    ///                `true`, and `_pos` is at or above the split depth, this function will revert.
+    /// @return ancestor_ The ancestor claim that commits to the same trace index as `_pos`.
+    function _findTraceAncestor(
+        Position _pos,
+        uint256 _start,
+        bool _global
+    )
+        internal
+        view
+        returns (ClaimData storage ancestor_)
+    {
+        // Grab the trace ancestor's expected position.
+        Position traceAncestorPos = _global ? _pos.traceAncestor() : _pos.traceAncestorBounded(SPLIT_DEPTH);
+
+        // Walk up the DAG to find a claim that commits to the same trace index as `_pos`. It is
+        // guaranteed that such a claim exists.
+        ancestor_ = claimData[_start];
+        while (ancestor_.position.raw() != traceAncestorPos.raw()) {
+            ancestor_ = claimData[ancestor_.parentIndex];
+        }
+    }
+
+    /// @notice Finds the starting and disputed output root for a given `ClaimData` within the DAG. This
+    ///         `ClaimData` must be below the `SPLIT_DEPTH`.
+    /// @param _start The index within `claimData` of the claim to start searching from.
+    /// @return startingClaim_ The starting output root claim.
+    /// @return startingPos_ The starting output root position.
+    /// @return disputedClaim_ The disputed output root claim.
+    /// @return disputedPos_ The disputed output root position.
+    function _findStartingAndDisputedOutputs(uint256 _start)
+        internal
+        view
+        returns (Claim startingClaim_, Position startingPos_, Claim disputedClaim_, Position disputedPos_)
+    {
+        // Fatch the starting claim.
+        uint256 claimIdx = _start;
+        ClaimData storage claim = claimData[claimIdx];
+
+        // If the starting claim's depth is less than or equal to the split depth, we revert as this is UB.
+        if (claim.position.depth() <= SPLIT_DEPTH) revert ClaimAboveSplit();
+
+        // We want to:
+        // 1. Find the first claim at the split depth.
+        // 2. Determine whether it was the starting or disputed output for the exec game.
+        // 3. Find the complimentary claim depending on the info from #2 (pre or post).
+
+        // Walk up the DAG until the ancestor's depth is equal to the split depth.
+        uint256 currentDepth;
+        ClaimData storage execRootClaim = claim;
+        while ((currentDepth = claim.position.depth()) > SPLIT_DEPTH) {
+            uint256 parentIndex = claim.parentIndex;
+
+            // If we're currently at the split depth + 1, we're at the root of the execution sub-game.
+            // We need to keep track of the root claim here to determine whether the execution sub-game was
+            // started with an attack or defense against the output leaf claim.
+            if (currentDepth == SPLIT_DEPTH + 1) execRootClaim = claim;
+
+            claim = claimData[parentIndex];
+            claimIdx = parentIndex;
+        }
+
+        // Determine whether the start of the execution sub-game was an attack or defense to the output root
+        // above. This is important because it determines which claim is the starting output root and which
+        // is the disputed output root.
+        (Position execRootPos, Position outputPos) = (execRootClaim.position, claim.position);
+        bool wasAttack = execRootPos.parent().raw() == outputPos.raw();
+
+        // Determine the starting and disputed output root indices.
+        // 1. If it was an attack, the disputed output root is `claim`, and the starting output root is
+        //    elsewhere in the DAG (it must commit to the block # index at depth of `outputPos - 1`).
+        // 2. If it was a defense, the starting output root is `claim`, and the disputed output root is
+        //    elsewhere in the DAG (it must commit to the block # index at depth of `outputPos + 1`).
+        if (wasAttack) {
+            // If this is an attack on the first output root (the block directly after the starting
+            // block number), the starting claim nor position exists in the tree. We leave these as
+            // 0, which can be easily identified due to 0 being an invalid Gindex.
+            if (outputPos.indexAtDepth() > 0) {
+                ClaimData storage starting = _findTraceAncestor(Position.wrap(outputPos.raw() - 1), claimIdx, true);
+                (startingClaim_, startingPos_) = (starting.claim, starting.position);
+            } else {
+                startingClaim_ = Claim.wrap(startingOutputRoot.root.raw());
+            }
+            (disputedClaim_, disputedPos_) = (claim.claim, claim.position);
+        } else {
+            ClaimData storage disputed = _findTraceAncestor(Position.wrap(outputPos.raw() + 1), claimIdx, true);
+            (startingClaim_, startingPos_) = (claim.claim, claim.position);
+            (disputedClaim_, disputedPos_) = (disputed.claim, disputed.position);
+        }
+    }
+
+    /// @notice Finds the local context hash for a given claim index that is present in an execution trace subgame.
+    /// @param _claimIndex The index of the claim to find the local context hash for.
+    /// @return uuid_ The local context hash.
+    function _findLocalContext(uint256 _claimIndex) internal view returns (Hash uuid_) {
+        (Claim starting, Position startingPos, Claim disputed, Position disputedPos) =
+            _findStartingAndDisputedOutputs(_claimIndex);
+        uuid_ = _computeLocalContext(starting, startingPos, disputed, disputedPos);
+    }
+
+    /// @notice Computes the local context hash for a set of starting/disputed claim values and positions.
+    /// @param _starting The starting claim.
+    /// @param _startingPos The starting claim's position.
+    /// @param _disputed The disputed claim.
+    /// @param _disputedPos The disputed claim's position.
+    /// @return uuid_ The local context hash.
+    function _computeLocalContext(
+        Claim _starting,
+        Position _startingPos,
+        Claim _disputed,
+        Position _disputedPos
+    )
+        internal
+        pure
+        returns (Hash uuid_)
+    {
+        // A position of 0 indicates that the starting claim is the absolute prestate. In this special case,
+        // we do not include the starting claim within the local context hash.
+        uuid_ = _startingPos.raw() == 0
+            ? Hash.wrap(keccak256(abi.encode(_disputed, _disputedPos)))
+            : Hash.wrap(keccak256(abi.encode(_starting, _startingPos, _disputed, _disputedPos)));
+    }
+}
diff --git a/packages/contracts-bedrock/src/dispute/PermissionedDisputeGame.sol b/packages/contracts-bedrock/src/dispute/PermissionedDisputeGame.sol
index c41f644ccd85..8e6741552489 100644
--- a/packages/contracts-bedrock/src/dispute/PermissionedDisputeGame.sol
+++ b/packages/contracts-bedrock/src/dispute/PermissionedDisputeGame.sol
@@ -2,20 +2,23 @@
 pragma solidity 0.8.15;
 
 import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol";
+import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol";
 import { FaultDisputeGame, IFaultDisputeGame, IBigStepper, IInitializable } from "src/dispute/FaultDisputeGame.sol";
-import "src/libraries/DisputeTypes.sol";
-import "src/libraries/DisputeErrors.sol";
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
 
 /// @title PermissionedDisputeGame
 /// @notice PermissionedDisputeGame is a contract that inherits from `FaultDisputeGame`, and contains two roles:
 ///         - The `challenger` role, which is allowed to challenge a dispute.
 ///         - The `proposer` role, which is allowed to create proposals and participate in their game.
-///         This contract exists as a fallback mechanism in case of the failure of the fault proof system in the stage
-///         one release. It will not be the default implementation used, and eventually will be deprecated in favor of
-///         a fully permissionless system.
+///         This contract exists as a way for networks to support the fault proof iteration of the OptimismPortal
+///         contract without needing to support a fully permissionless system. Permissionless systems can introduce
+///         costs that certain networks may not wish to support. This contract can also be used as a fallback mechanism
+///         in case of a failure in the permissionless fault proof system in the stage one release.
 contract PermissionedDisputeGame is FaultDisputeGame {
     /// @notice The proposer role is allowed to create proposals and participate in the dispute game.
     address internal immutable PROPOSER;
+
     /// @notice The challenger role is allowed to participate in the dispute game.
     address internal immutable CHALLENGER;
 
@@ -29,26 +32,26 @@ contract PermissionedDisputeGame is FaultDisputeGame {
 
     /// @param _gameType The type ID of the game.
     /// @param _absolutePrestate The absolute prestate of the instruction trace.
-    /// @param _genesisBlockNumber The block number of the genesis block.
-    /// @param _genesisOutputRoot The output root of the genesis block.
     /// @param _maxGameDepth The maximum depth of bisection.
     /// @param _splitDepth The final depth of the output bisection portion of the game.
-    /// @param _gameDuration The duration of the game.
+    /// @param _clockExtension The clock extension to perform when the remaining duration is less than the extension.
+    /// @param _maxClockDuration The maximum amount of time that may accumulate on a team's chess clock.
     /// @param _vm An onchain VM that performs single instruction steps on an FPP trace.
     /// @param _weth WETH contract for holding ETH.
+    /// @param _anchorStateRegistry The contract that stores the anchor state for each game type.
     /// @param _l2ChainId Chain ID of the L2 network this contract argues about.
     /// @param _proposer Address that is allowed to create instances of this contract.
     /// @param _challenger Address that is allowed to challenge instances of this contract.
     constructor(
         GameType _gameType,
         Claim _absolutePrestate,
-        uint256 _genesisBlockNumber,
-        Hash _genesisOutputRoot,
         uint256 _maxGameDepth,
         uint256 _splitDepth,
-        Duration _gameDuration,
+        Duration _clockExtension,
+        Duration _maxClockDuration,
         IBigStepper _vm,
         IDelayedWETH _weth,
+        IAnchorStateRegistry _anchorStateRegistry,
         uint256 _l2ChainId,
         address _proposer,
         address _challenger
@@ -56,13 +59,13 @@ contract PermissionedDisputeGame is FaultDisputeGame {
         FaultDisputeGame(
             _gameType,
             _absolutePrestate,
-            _genesisBlockNumber,
-            _genesisOutputRoot,
             _maxGameDepth,
             _splitDepth,
-            _gameDuration,
+            _clockExtension,
+            _maxClockDuration,
             _vm,
             _weth,
+            _anchorStateRegistry,
             _l2ChainId
         )
     {
@@ -85,11 +88,22 @@ contract PermissionedDisputeGame is FaultDisputeGame {
     }
 
     /// @notice Generic move function, used for both `attack` and `defend` moves.
-    /// @param _challengeIndex The index of the claim being moved against.
+    /// @notice _disputed The disputed `Claim`.
+    /// @param _challengeIndex The index of the claim being moved against. This must match the `_disputed` claim.
     /// @param _claim The claim at the next logical position in the game.
     /// @param _isAttack Whether or not the move is an attack or defense.
-    function move(uint256 _challengeIndex, Claim _claim, bool _isAttack) public payable override onlyAuthorized {
-        super.move(_challengeIndex, _claim, _isAttack);
+    function move(
+        Claim _disputed,
+        uint256 _challengeIndex,
+        Claim _claim,
+        bool _isAttack
+    )
+        public
+        payable
+        override
+        onlyAuthorized
+    {
+        super.move(_disputed, _challengeIndex, _claim, _isAttack);
     }
 
     /// @inheritdoc IInitializable
@@ -100,4 +114,18 @@ contract PermissionedDisputeGame is FaultDisputeGame {
         // Fallthrough initialization.
         super.initialize();
     }
+
+    ////////////////////////////////////////////////////////////////
+    //                     IMMUTABLE GETTERS                      //
+    ////////////////////////////////////////////////////////////////
+
+    /// @notice Returns the proposer address.
+    function proposer() external view returns (address proposer_) {
+        proposer_ = PROPOSER;
+    }
+
+    /// @notice Returns the challenger address.
+    function challenger() external view returns (address challenger_) {
+        challenger_ = CHALLENGER;
+    }
 }
diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IAnchorStateRegistry.sol b/packages/contracts-bedrock/src/dispute/interfaces/IAnchorStateRegistry.sol
new file mode 100644
index 000000000000..2294a76ef303
--- /dev/null
+++ b/packages/contracts-bedrock/src/dispute/interfaces/IAnchorStateRegistry.sol
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.sol";
+
+import "src/dispute/lib/Types.sol";
+
+/// @title IAnchorStateRegistry
+/// @notice Describes a contract that stores the anchor state for each game type.
+interface IAnchorStateRegistry {
+    /// @notice Returns the anchor state for the given game type.
+    /// @param _gameType The game type to get the anchor state for.
+    /// @return The anchor state for the given game type.
+    function anchors(GameType _gameType) external view returns (Hash, uint256);
+
+    /// @notice Returns the DisputeGameFactory address.
+    /// @return DisputeGameFactory address.
+    function disputeGameFactory() external view returns (IDisputeGameFactory);
+
+    /// @notice Callable by FaultDisputeGame contracts to update the anchor state. Pulls the anchor state directly from
+    ///         the FaultDisputeGame contract and stores it in the registry if the new anchor state is valid and the
+    ///         state is newer than the current anchor state.
+    function tryUpdateAnchorState() external;
+}
diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IBigStepper.sol b/packages/contracts-bedrock/src/dispute/interfaces/IBigStepper.sol
index 8b32d7c555f6..f38e58f9d9d6 100644
--- a/packages/contracts-bedrock/src/dispute/interfaces/IBigStepper.sol
+++ b/packages/contracts-bedrock/src/dispute/interfaces/IBigStepper.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.15;
+pragma solidity ^0.8.0;
 
 import { IPreimageOracle } from "src/cannon/interfaces/IPreimageOracle.sol";
 
diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IDelayedWETH.sol b/packages/contracts-bedrock/src/dispute/interfaces/IDelayedWETH.sol
index bc112fa3f7b3..80b90c69b860 100644
--- a/packages/contracts-bedrock/src/dispute/interfaces/IDelayedWETH.sol
+++ b/packages/contracts-bedrock/src/dispute/interfaces/IDelayedWETH.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.15;
+pragma solidity ^0.8.0;
 
 import { IWETH } from "src/dispute/interfaces/IWETH.sol";
 
diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGame.sol b/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGame.sol
index 8d9d4c9b5644..7e9389b4ddaf 100644
--- a/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGame.sol
+++ b/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGame.sol
@@ -1,9 +1,9 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.15;
+pragma solidity ^0.8.0;
 
 import { IInitializable } from "src/dispute/interfaces/IInitializable.sol";
 
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
 
 /// @title IDisputeGame
 /// @notice The generic interface for a DisputeGame contract.
@@ -30,13 +30,23 @@ interface IDisputeGame is IInitializable {
     /// @return gameType_ The type of proof system being used.
     function gameType() external view returns (GameType gameType_);
 
-    /// @notice Getter for the root claim.
+    /// @notice Getter for the creator of the dispute game.
     /// @dev `clones-with-immutable-args` argument #1
+    /// @return creator_ The creator of the dispute game.
+    function gameCreator() external pure returns (address creator_);
+
+    /// @notice Getter for the root claim.
+    /// @dev `clones-with-immutable-args` argument #2
     /// @return rootClaim_ The root claim of the DisputeGame.
     function rootClaim() external pure returns (Claim rootClaim_);
 
+    /// @notice Getter for the parent hash of the L1 block when the dispute game was created.
+    /// @dev `clones-with-immutable-args` argument #3
+    /// @return l1Head_ The parent hash of the L1 block when the dispute game was created.
+    function l1Head() external pure returns (Hash l1Head_);
+
     /// @notice Getter for the extra data.
-    /// @dev `clones-with-immutable-args` argument #2
+    /// @dev `clones-with-immutable-args` argument #4
     /// @return extraData_ Any extra data supplied to the dispute game contract by the creator.
     function extraData() external pure returns (bytes memory extraData_);
 
diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGameFactory.sol b/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGameFactory.sol
index 0c1bc9881d58..5021de04d62a 100644
--- a/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGameFactory.sol
+++ b/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGameFactory.sol
@@ -1,9 +1,9 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.15;
+pragma solidity ^0.8.0;
 
 import { IDisputeGame } from "./IDisputeGame.sol";
 
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
 
 /// @title IDisputeGameFactory
 /// @notice The interface for a DisputeGameFactory contract.
diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol b/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol
index d53107e3bace..43de378ac06d 100644
--- a/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol
+++ b/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol
@@ -1,9 +1,9 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.15;
+pragma solidity ^0.8.0;
 
 import { IDisputeGame } from "./IDisputeGame.sol";
 
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
 
 /// @title IFaultDisputeGame
 /// @notice The interface for a fault proof backed dispute game.
@@ -19,6 +19,14 @@ interface IFaultDisputeGame is IDisputeGame {
         Clock clock;
     }
 
+    /// @notice The `ResolutionCheckpoint` struct represents the data associated with an in-progress claim resolution.
+    struct ResolutionCheckpoint {
+        bool initialCheckpointComplete;
+        uint32 subgameIndex;
+        Position leftmostPosition;
+        address counteredBy;
+    }
+
     /// @notice Emitted when a new claim is added to the DAG by `claimant`
     /// @param parentIndex The index within the `claimData` array of the parent claim
     /// @param claim The claim being added
@@ -26,14 +34,18 @@ interface IFaultDisputeGame is IDisputeGame {
     event Move(uint256 indexed parentIndex, Claim indexed claim, address indexed claimant);
 
     /// @notice Attack a disagreed upon `Claim`.
-    /// @param _parentIndex Index of the `Claim` to attack in the `claimData` array.
+    /// @param _disputed The `Claim` being attacked.
+    /// @param _parentIndex Index of the `Claim` to attack in the `claimData` array. This must match the `_disputed`
+    /// claim.
     /// @param _claim The `Claim` at the relative attack position.
-    function attack(uint256 _parentIndex, Claim _claim) external payable;
+    function attack(Claim _disputed, uint256 _parentIndex, Claim _claim) external payable;
 
     /// @notice Defend an agreed upon `Claim`.
-    /// @param _parentIndex Index of the claim to defend in the `claimData` array.
+    /// @notice _disputed The `Claim` being defended.
+    /// @param _parentIndex Index of the claim to defend in the `claimData` array. This must match the `_disputed`
+    /// claim.
     /// @param _claim The `Claim` at the relative defense position.
-    function defend(uint256 _parentIndex, Claim _claim) external payable;
+    function defend(Claim _disputed, uint256 _parentIndex, Claim _claim) external payable;
 
     /// @notice Perform an instruction step via an on-chain fault proof processor.
     /// @dev This function should point to a fault proof processor in order to execute
@@ -54,17 +66,34 @@ interface IFaultDisputeGame is IDisputeGame {
     /// @param _partOffset The offset of the data to post.
     function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) external;
 
-    /// @notice Resolves the subgame rooted at the given claim index.
+    /// @notice Resolves the subgame rooted at the given claim index. `_numToResolve` specifies how many children of
+    ///         the subgame will be checked in this call. If `_numToResolve` is less than the number of children, an
+    ///         internal cursor will be updated and this function may be called again to complete resolution of the
+    ///         subgame.
     /// @dev This function must be called bottom-up in the DAG
     ///      A subgame is a tree of claims that has a maximum depth of 1.
     ///      A subgame root claims is valid if, and only if, all of its child claims are invalid.
     ///      At the deepest level in the DAG, a claim is invalid if there's a successful step against it.
     /// @param _claimIndex The index of the subgame root claim to resolve.
-    function resolveClaim(uint256 _claimIndex) external payable;
+    /// @param _numToResolve The number of subgames to resolve in this call. If the input is `0`, and this is the first
+    ///                      page, this function will attempt to check all of the subgame's children at once.
+    function resolveClaim(uint256 _claimIndex, uint256 _numToResolve) external;
 
-    /// @notice A block hash on the L1 that contains the disputed output root.
-    function l1Head() external view returns (Hash l1Head_);
+    /// @notice Returns the number of children that still need to be resolved in order to fully resolve a subgame rooted
+    ///         at `_claimIndex`.
+    /// @param _claimIndex The subgame root claim's index within `claimData`.
+    /// @return numRemainingChildren_ The number of children that still need to be checked to resolve the subgame.
+    function getNumToResolve(uint256 _claimIndex) external view returns (uint256 numRemainingChildren_);
 
     /// @notice The l2BlockNumber of the disputed output root in the `L2OutputOracle`.
     function l2BlockNumber() external view returns (uint256 l2BlockNumber_);
+
+    /// @notice Starting output root and block number of the game.
+    function startingOutputRoot() external view returns (Hash startingRoot_, uint256 l2BlockNumber_);
+
+    /// @notice Only the starting block number of the game.
+    function startingBlockNumber() external view returns (uint256 startingBlockNumber_);
+
+    /// @notice Only the starting output root of the game.
+    function startingRootHash() external view returns (Hash startingRootHash_);
 }
diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IInitializable.sol b/packages/contracts-bedrock/src/dispute/interfaces/IInitializable.sol
index c2ca15f0d144..5968b45f9bfb 100644
--- a/packages/contracts-bedrock/src/dispute/interfaces/IInitializable.sol
+++ b/packages/contracts-bedrock/src/dispute/interfaces/IInitializable.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.15;
+pragma solidity ^0.8.0;
 
 /// @title IInitializable
 /// @notice An interface for initializable contracts.
diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IWETH.sol b/packages/contracts-bedrock/src/dispute/interfaces/IWETH.sol
index a0a2ebf900f0..73ef0e954577 100644
--- a/packages/contracts-bedrock/src/dispute/interfaces/IWETH.sol
+++ b/packages/contracts-bedrock/src/dispute/interfaces/IWETH.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.15;
+pragma solidity ^0.8.0;
 
 /// @title IWETH
 /// @notice Interface for WETH9.
@@ -28,11 +28,11 @@ interface IWETH {
 
     /// @notice Returns the name of the token.
     /// @return The name of the token.
-    function name() external pure returns (string memory);
+    function name() external view returns (string memory);
 
     /// @notice Returns the symbol of the token.
     /// @return The symbol of the token.
-    function symbol() external pure returns (string memory);
+    function symbol() external view returns (string memory);
 
     /// @notice Returns the number of decimals the token uses.
     /// @return The number of decimals the token uses.
diff --git a/packages/contracts-bedrock/src/libraries/DisputeErrors.sol b/packages/contracts-bedrock/src/dispute/lib/Errors.sol
similarity index 74%
rename from packages/contracts-bedrock/src/libraries/DisputeErrors.sol
rename to packages/contracts-bedrock/src/dispute/lib/Errors.sol
index 27d019e2c924..9a3237b32d2c 100644
--- a/packages/contracts-bedrock/src/libraries/DisputeErrors.sol
+++ b/packages/contracts-bedrock/src/dispute/lib/Errors.sol
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.15;
 
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/LibUDT.sol";
 
 ////////////////////////////////////////////////////////////////
 //                `DisputeGameFactory` Errors                 //
@@ -27,8 +27,8 @@ error UnexpectedRootClaim(Claim rootClaim);
 /// @notice Thrown when a dispute game has already been initialized.
 error AlreadyInitialized();
 
-/// @notice Thrown when a supplied bond is too low to cover the cost of the interaction.
-error InsufficientBond();
+/// @notice Thrown when a supplied bond is not equal to the required bond amount to cover the cost of the interaction.
+error IncorrectBondAmount();
 
 /// @notice Thrown when a credit claim is attempted for a value of 0.
 error NoCreditToClaim();
@@ -36,8 +36,8 @@ error NoCreditToClaim();
 /// @notice Thrown when the transfer of credit to a recipient account reverts.
 error BondTransferFailed();
 
-/// @notice Thrown when the `extraData` passed to the CWIA proxy is too long for the `FaultDisputeGame`.
-error ExtraDataTooLong();
+/// @notice Thrown when the `extraData` passed to the CWIA proxy is of improper length, or contains invalid information.
+error BadExtraData();
 
 /// @notice Thrown when a defense against the root claim is attempted.
 error CannotDefendRootClaim();
@@ -45,8 +45,8 @@ error CannotDefendRootClaim();
 /// @notice Thrown when a claim is attempting to be made that already exists.
 error ClaimAlreadyExists();
 
-/// @notice Thrown when a given claim is invalid (0).
-error InvalidClaim();
+/// @notice Thrown when a disputed claim does not match its index in the game.
+error InvalidDisputedClaimIndex();
 
 /// @notice Thrown when an action that requires the game to be `IN_PROGRESS` is invoked when
 ///         the game is not in progress.
@@ -91,10 +91,32 @@ error ClaimAboveSplit();
 ///         depth of the game.
 error InvalidSplitDepth();
 
+/// @notice Thrown on deployment if the max clock duration is less than or equal to the clock extension.
+error InvalidClockExtension();
+
+/// @notice Thrown on deployment if the max depth is greater than `LibPosition.`
+error MaxDepthTooLarge();
+
 /// @notice Thrown when trying to step against a claim for a second time, after it has already been countered with
 ///         an instruction step.
 error DuplicateStep();
 
+/// @notice Thrown when an anchor root is not found for a given game type.
+error AnchorRootNotFound();
+
+/// @notice Thrown when an output root proof is invalid.
+error InvalidOutputRootProof();
+
+/// @notice Thrown when header RLP is invalid with respect to the block hash in an output root proof.
+error InvalidHeaderRLP();
+
+/// @notice Thrown when there is a match between the block number in the output root proof and the block number
+///         claimed in the dispute game.
+error BlockNumberMatches();
+
+/// @notice Thrown when the L2 block number claim has already been challenged.
+error L2BlockNumberChallenged();
+
 ////////////////////////////////////////////////////////////////
 //              `PermissionedDisputeGame` Errors              //
 ////////////////////////////////////////////////////////////////
diff --git a/packages/contracts-bedrock/src/dispute/lib/LibGameId.sol b/packages/contracts-bedrock/src/dispute/lib/LibGameId.sol
deleted file mode 100644
index 2a4657b3246e..000000000000
--- a/packages/contracts-bedrock/src/dispute/lib/LibGameId.sol
+++ /dev/null
@@ -1,45 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.15;
-
-import "src/libraries/DisputeTypes.sol";
-import "src/dispute/interfaces/IDisputeGame.sol";
-
-/// @title LibGameId
-/// @notice Utility functions for packing and unpacking GameIds.
-library LibGameId {
-    /// @notice Packs values into a 32 byte GameId type.
-    /// @param _gameType The game type.
-    /// @param _timestamp The timestamp of the game's creation.
-    /// @param _gameProxy The game proxy address.
-    /// @return gameId_ The packed GameId.
-    function pack(
-        GameType _gameType,
-        Timestamp _timestamp,
-        IDisputeGame _gameProxy
-    )
-        internal
-        pure
-        returns (GameId gameId_)
-    {
-        assembly {
-            gameId_ := or(or(shl(224, _gameType), shl(160, _timestamp)), _gameProxy)
-        }
-    }
-
-    /// @notice Unpacks values from a 32 byte GameId type.
-    /// @param _gameId The packed GameId.
-    /// @return gameType_ The game type.
-    /// @return timestamp_ The timestamp of the game's creation.
-    /// @return gameProxy_ The game proxy address.
-    function unpack(GameId _gameId)
-        internal
-        pure
-        returns (GameType gameType_, Timestamp timestamp_, IDisputeGame gameProxy_)
-    {
-        assembly {
-            gameType_ := shr(224, _gameId)
-            timestamp_ := and(shr(160, _gameId), 0xFFFFFFFFFFFFFFFF)
-            gameProxy_ := and(_gameId, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
-        }
-    }
-}
diff --git a/packages/contracts-bedrock/src/dispute/lib/LibHashing.sol b/packages/contracts-bedrock/src/dispute/lib/LibHashing.sol
deleted file mode 100644
index 800eeb1bde67..000000000000
--- a/packages/contracts-bedrock/src/dispute/lib/LibHashing.sol
+++ /dev/null
@@ -1,29 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.15;
-
-import "src/libraries/DisputeTypes.sol";
-
-/// @title Hashing
-/// @notice This library contains all of the hashing utilities used in the Cannon contracts.
-library LibHashing {
-    /// @notice Hashes a claim and a position together.
-    /// @param _claim A Claim type.
-    /// @param _position The position of `claim`.
-    /// @param _challengeIndex The index of the claim being moved against.
-    /// @return claimHash_ A hash of abi.encodePacked(claim, position|challengeIndex);
-    function hashClaimPos(
-        Claim _claim,
-        Position _position,
-        uint256 _challengeIndex
-    )
-        internal
-        pure
-        returns (ClaimHash claimHash_)
-    {
-        assembly {
-            mstore(0x00, _claim)
-            mstore(0x20, or(shl(128, _position), and(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, _challengeIndex)))
-            claimHash_ := keccak256(0x00, 0x40)
-        }
-    }
-}
diff --git a/packages/contracts-bedrock/src/dispute/lib/LibPosition.sol b/packages/contracts-bedrock/src/dispute/lib/LibPosition.sol
index abf79fb51b06..9cff271920b4 100644
--- a/packages/contracts-bedrock/src/dispute/lib/LibPosition.sol
+++ b/packages/contracts-bedrock/src/dispute/lib/LibPosition.sol
@@ -1,17 +1,27 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.15;
 
-import "src/libraries/DisputeTypes.sol";
-import "src/libraries/DisputeErrors.sol";
+using LibPosition for Position global;
+
+/// @notice A `Position` represents a position of a claim within the game tree.
+/// @dev This is represented as a "generalized index" where the high-order bit
+/// is the level in the tree and the remaining bits is a unique bit pattern, allowing
+/// a unique identifier for each node in the tree. Mathematically, it is calculated
+/// as 2^{depth} + indexAtDepth.
+type Position is uint128;
 
 /// @title LibPosition
 /// @notice This library contains helper functions for working with the `Position` type.
 library LibPosition {
+    /// @notice the `MAX_POSITION_BITLEN` is the number of bits that the `Position` type, and the implementation of
+    ///         its behavior within this library, can safely support.
+    uint8 internal constant MAX_POSITION_BITLEN = 126;
+
     /// @notice Computes a generalized index (2^{depth} + indexAtDepth).
     /// @param _depth The depth of the position.
     /// @param _indexAtDepth The index at the depth of the position.
     /// @return position_ The computed generalized index.
-    function wrap(uint64 _depth, uint64 _indexAtDepth) internal pure returns (Position position_) {
+    function wrap(uint8 _depth, uint128 _indexAtDepth) internal pure returns (Position position_) {
         assembly {
             // gindex = 2^{_depth} + _indexAtDepth
             position_ := add(shl(_depth, 1), _indexAtDepth)
@@ -22,7 +32,7 @@ library LibPosition {
     /// @param _position The generalized index to get the `depth` of.
     /// @return depth_ The `depth` of the `position` gindex.
     /// @custom:attribution Solady 
-    function depth(Position _position) internal pure returns (uint64 depth_) {
+    function depth(Position _position) internal pure returns (uint8 depth_) {
         // Return the most significant bit offset, which signifies the depth of the gindex.
         assembly {
             depth_ := or(depth_, shl(6, lt(0xffffffffffffffff, shr(depth_, _position))))
@@ -53,7 +63,7 @@ library LibPosition {
     ///         and the `indexAtDepth` = 0.
     /// @param _position The generalized index to get the `indexAtDepth` of.
     /// @return indexAtDepth_ The `indexAtDepth` of the `position` gindex.
-    function indexAtDepth(Position _position) internal pure returns (uint64 indexAtDepth_) {
+    function indexAtDepth(Position _position) internal pure returns (uint128 indexAtDepth_) {
         // Return bits p_{msb-1}...p_{0}. This effectively pulls the 2^{depth} out of the gindex,
         // leaving only the `indexAtDepth`.
         uint256 msb = depth(_position);
@@ -152,7 +162,13 @@ library LibPosition {
         returns (Position ancestor_)
     {
         // This function only works for positions that are below the upper bound.
-        if (_position.depth() <= _upperBoundExclusive) revert ClaimAboveSplit();
+        if (_position.depth() <= _upperBoundExclusive) {
+            assembly {
+                // Revert with `ClaimAboveSplit()`
+                mstore(0x00, 0xb34b5c22)
+                revert(0x1C, 0x04)
+            }
+        }
 
         // Grab the global trace ancestor.
         ancestor_ = traceAncestor(_position);
diff --git a/packages/contracts-bedrock/src/dispute/lib/LibUDT.sol b/packages/contracts-bedrock/src/dispute/lib/LibUDT.sol
index 1ea8e33565c5..b0b8edfab8f4 100644
--- a/packages/contracts-bedrock/src/dispute/lib/LibUDT.sol
+++ b/packages/contracts-bedrock/src/dispute/lib/LibUDT.sol
@@ -1,7 +1,26 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.15;
 
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/LibPosition.sol";
+
+using LibClaim for Claim global;
+using LibHash for Hash global;
+using LibDuration for Duration global;
+using LibClock for Clock global;
+using LibGameId for GameId global;
+using LibTimestamp for Timestamp global;
+using LibVMStatus for VMStatus global;
+using LibGameType for GameType global;
+
+/// @notice A `Clock` represents a packed `Duration` and `Timestamp`
+/// @dev The packed layout of this type is as follows:
+/// ┌────────────┬────────────────┐
+/// │    Bits    │     Value      │
+/// ├────────────┼────────────────┤
+/// │ [0, 64)    │ Duration       │
+/// │ [64, 128)  │ Timestamp      │
+/// └────────────┴────────────────┘
+type Clock is uint128;
 
 /// @title LibClock
 /// @notice This library contains helper functions for working with the `Clock` type.
@@ -47,6 +66,60 @@ library LibClock {
     }
 }
 
+/// @notice A `GameId` represents a packed 4 byte game ID, a 8 byte timestamp, and a 20 byte address.
+/// @dev The packed layout of this type is as follows:
+/// ┌───────────┬───────────┐
+/// │   Bits    │   Value   │
+/// ├───────────┼───────────┤
+/// │ [0, 32)   │ Game Type │
+/// │ [32, 96)  │ Timestamp │
+/// │ [96, 256) │ Address   │
+/// └───────────┴───────────┘
+type GameId is bytes32;
+
+/// @title LibGameId
+/// @notice Utility functions for packing and unpacking GameIds.
+library LibGameId {
+    /// @notice Packs values into a 32 byte GameId type.
+    /// @param _gameType The game type.
+    /// @param _timestamp The timestamp of the game's creation.
+    /// @param _gameProxy The game proxy address.
+    /// @return gameId_ The packed GameId.
+    function pack(
+        GameType _gameType,
+        Timestamp _timestamp,
+        address _gameProxy
+    )
+        internal
+        pure
+        returns (GameId gameId_)
+    {
+        assembly {
+            gameId_ := or(or(shl(224, _gameType), shl(160, _timestamp)), _gameProxy)
+        }
+    }
+
+    /// @notice Unpacks values from a 32 byte GameId type.
+    /// @param _gameId The packed GameId.
+    /// @return gameType_ The game type.
+    /// @return timestamp_ The timestamp of the game's creation.
+    /// @return gameProxy_ The game proxy address.
+    function unpack(GameId _gameId)
+        internal
+        pure
+        returns (GameType gameType_, Timestamp timestamp_, address gameProxy_)
+    {
+        assembly {
+            gameType_ := shr(224, _gameId)
+            timestamp_ := and(shr(160, _gameId), 0xFFFFFFFFFFFFFFFF)
+            gameProxy_ := and(_gameId, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
+        }
+    }
+}
+
+/// @notice A claim represents an MPT root representing the state of the fault proof program.
+type Claim is bytes32;
+
 /// @title LibClaim
 /// @notice This library contains helper functions for working with the `Claim` type.
 library LibClaim {
@@ -58,8 +131,33 @@ library LibClaim {
             claim_ := _claim
         }
     }
+
+    /// @notice Hashes a claim and a position together.
+    /// @param _claim A Claim type.
+    /// @param _position The position of `claim`.
+    /// @param _challengeIndex The index of the claim being moved against.
+    /// @return claimHash_ A hash of abi.encodePacked(claim, position|challengeIndex);
+    function hashClaimPos(
+        Claim _claim,
+        Position _position,
+        uint256 _challengeIndex
+    )
+        internal
+        pure
+        returns (Hash claimHash_)
+    {
+        assembly {
+            mstore(0x00, _claim)
+            mstore(0x20, or(shl(128, _position), and(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, _challengeIndex)))
+            claimHash_ := keccak256(0x00, 0x40)
+        }
+    }
 }
 
+/// @notice A dedicated duration type.
+/// @dev Unit: seconds
+type Duration is uint64;
+
 /// @title LibDuration
 /// @notice This library contains helper functions for working with the `Duration` type.
 library LibDuration {
@@ -73,6 +171,9 @@ library LibDuration {
     }
 }
 
+/// @notice A custom type for a generic hash.
+type Hash is bytes32;
+
 /// @title LibHash
 /// @notice This library contains helper functions for working with the `Hash` type.
 library LibHash {
@@ -86,6 +187,9 @@ library LibHash {
     }
 }
 
+/// @notice A dedicated timestamp type.
+type Timestamp is uint64;
+
 /// @title LibTimestamp
 /// @notice This library contains helper functions for working with the `Timestamp` type.
 library LibTimestamp {
@@ -99,6 +203,9 @@ library LibTimestamp {
     }
 }
 
+/// @notice A `VMStatus` represents the status of a VM execution.
+type VMStatus is uint8;
+
 /// @title LibVMStatus
 /// @notice This library contains helper functions for working with the `VMStatus` type.
 library LibVMStatus {
@@ -112,13 +219,16 @@ library LibVMStatus {
     }
 }
 
+/// @notice A `GameType` represents the type of game being played.
+type GameType is uint32;
+
 /// @title LibGameType
 /// @notice This library contains helper functions for working with the `GameType` type.
 library LibGameType {
-    /// @notice Get the value of a `GameType` type in the form of the underlying uint8.
+    /// @notice Get the value of a `GameType` type in the form of the underlying uint32.
     /// @param _gametype The `GameType` type to get the value of.
-    /// @return gametype_ The value of the `GameType` type as a uint8 type.
-    function raw(GameType _gametype) internal pure returns (uint8 gametype_) {
+    /// @return gametype_ The value of the `GameType` type as a uint32 type.
+    function raw(GameType _gametype) internal pure returns (uint32 gametype_) {
         assembly {
             gametype_ := _gametype
         }
diff --git a/packages/contracts-bedrock/src/dispute/lib/Types.sol b/packages/contracts-bedrock/src/dispute/lib/Types.sol
new file mode 100644
index 000000000000..a5866699d066
--- /dev/null
+++ b/packages/contracts-bedrock/src/dispute/lib/Types.sol
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.15;
+
+import "src/dispute/lib/LibUDT.sol";
+
+/// @notice The current status of the dispute game.
+enum GameStatus {
+    // The game is currently in progress, and has not been resolved.
+    IN_PROGRESS,
+    // The game has concluded, and the `rootClaim` was challenged successfully.
+    CHALLENGER_WINS,
+    // The game has concluded, and the `rootClaim` could not be contested.
+    DEFENDER_WINS
+}
+
+/// @notice Represents an L2 output root and the L2 block number at which it was generated.
+/// @custom:field root The output root.
+/// @custom:field l2BlockNumber The L2 block number at which the output root was generated.
+struct OutputRoot {
+    Hash root;
+    uint256 l2BlockNumber;
+}
+
+/// @title GameTypes
+/// @notice A library that defines the IDs of games that can be played.
+library GameTypes {
+    /// @dev A dispute game type the uses the cannon vm.
+    GameType internal constant CANNON = GameType.wrap(0);
+
+    /// @dev A permissioned dispute game type the uses the cannon vm.
+    GameType internal constant PERMISSIONED_CANNON = GameType.wrap(1);
+
+    /// @notice A dispute game type the uses the asterisc VM
+    GameType internal constant ASTERISC = GameType.wrap(2);
+
+    /// @notice A dispute game type that uses an alphabet vm.
+    ///         Not intended for production use.
+    GameType internal constant ALPHABET = GameType.wrap(255);
+}
+
+/// @title VMStatuses
+/// @notice Named type aliases for the various valid VM status bytes.
+library VMStatuses {
+    /// @notice The VM has executed successfully and the outcome is valid.
+    VMStatus internal constant VALID = VMStatus.wrap(0);
+
+    /// @notice The VM has executed successfully and the outcome is invalid.
+    VMStatus internal constant INVALID = VMStatus.wrap(1);
+
+    /// @notice The VM has paniced.
+    VMStatus internal constant PANIC = VMStatus.wrap(2);
+
+    /// @notice The VM execution is still in progress.
+    VMStatus internal constant UNFINISHED = VMStatus.wrap(3);
+}
+
+/// @title LocalPreimageKey
+/// @notice Named type aliases for local `PreimageOracle` key identifiers.
+library LocalPreimageKey {
+    /// @notice The identifier for the L1 head hash.
+    uint256 internal constant L1_HEAD_HASH = 0x01;
+
+    /// @notice The identifier for the starting output root.
+    uint256 internal constant STARTING_OUTPUT_ROOT = 0x02;
+
+    /// @notice The identifier for the disputed output root.
+    uint256 internal constant DISPUTED_OUTPUT_ROOT = 0x03;
+
+    /// @notice The identifier for the disputed L2 block number.
+    uint256 internal constant DISPUTED_L2_BLOCK_NUMBER = 0x04;
+
+    /// @notice The identifier for the chain ID.
+    uint256 internal constant CHAIN_ID = 0x05;
+}
diff --git a/packages/contracts-bedrock/src/dispute/weth/DelayedWETH.sol b/packages/contracts-bedrock/src/dispute/weth/DelayedWETH.sol
index b823139456d2..c8a3f8f03262 100644
--- a/packages/contracts-bedrock/src/dispute/weth/DelayedWETH.sol
+++ b/packages/contracts-bedrock/src/dispute/weth/DelayedWETH.sol
@@ -11,20 +11,18 @@ import { WETH98 } from "src/dispute/weth/WETH98.sol";
 import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
 
 /// @title DelayedWETH
-/// @notice DelayedWETH is an extension to WETH9 that allows for delayed withdrawals. Accounts must
-///         trigger an unlock function before they can withdraw WETH. Accounts must trigger unlock
-///         by specifying a sub-account and an amount of WETH to unlock. Accounts can trigger the
-///         unlock function at any time, but must wait a delay period before they can withdraw
-///         after the unlock function is triggered. DelayedWETH is designed to be used by the
-///         DisputeGame contracts where unlock will only be triggered after a dispute is resolved.
-///         DelayedWETH is meant to sit behind a proxy contract and has an owner address that can
-///         pull WETH from any account and can recover ETH from the contract itself. Variable and
-///         function naming vaguely follows the vibe of WETH9. Not the prettiest contract in the
-///         world, but it gets the job done.
+/// @notice DelayedWETH is an extension to WETH9 that allows for delayed withdrawals. Accounts must trigger an unlock
+///         function before they can withdraw WETH. Accounts must trigger unlock by specifying a sub-account and an
+///         amount of WETH to unlock. Accounts can trigger the unlock function at any time, but must wait a delay
+///         period before they can withdraw after the unlock function is triggered. DelayedWETH is designed to be used
+///         by the DisputeGame contracts where unlock will only be triggered after a dispute is resolved. DelayedWETH
+///         is meant to sit behind a proxy contract and has an owner address that can pull WETH from any account and
+///         can recover ETH from the contract itself. Variable and function naming vaguely follows the vibe of WETH9.
+///         Not the prettiest contract in the world, but it gets the job done.
 contract DelayedWETH is OwnableUpgradeable, WETH98, IDelayedWETH, ISemver {
     /// @notice Semantic version.
-    /// @custom:semver 0.2.0
-    string public constant version = "0.2.0";
+    /// @custom:semver 1.0.0
+    string public constant version = "1.0.0";
 
     /// @inheritdoc IDelayedWETH
     mapping(address => mapping(address => WithdrawalRequest)) public withdrawals;
@@ -57,12 +55,11 @@ contract DelayedWETH is OwnableUpgradeable, WETH98, IDelayedWETH, ISemver {
 
     /// @inheritdoc IDelayedWETH
     function unlock(address _guy, uint256 _wad) external {
-        // Note that the unlock function can be called by any address, but the actual unlocking
-        // capability still only gives the msg.sender the ability to withdraw from the account.
-        // As long as the unlock and withdraw functions are called with the proper recipient
-        // addresses, this will be safe. Could be made safer by having external accounts execute
-        // withdrawals themselves but that would have added extra complexity and made DelayedWETH
-        // a leaky abstraction, so we chose this instead.
+        // Note that the unlock function can be called by any address, but the actual unlocking capability still only
+        // gives the msg.sender the ability to withdraw from the account. As long as the unlock and withdraw functions
+        // are called with the proper recipient addresses, this will be safe. Could be made safer by having external
+        // accounts execute withdrawals themselves but that would have added extra complexity and made DelayedWETH a
+        // leaky abstraction, so we chose this instead.
         WithdrawalRequest storage wd = withdrawals[msg.sender][_guy];
         wd.timestamp = block.timestamp;
         wd.amount += _wad;
@@ -87,14 +84,14 @@ contract DelayedWETH is OwnableUpgradeable, WETH98, IDelayedWETH, ISemver {
     /// @inheritdoc IDelayedWETH
     function recover(uint256 _wad) external {
         require(msg.sender == owner(), "DelayedWETH: not owner");
-        require(address(this).balance >= _wad, "DelayedWETH: insufficient balance");
-        payable(msg.sender).transfer(_wad);
+        uint256 amount = _wad < address(this).balance ? _wad : address(this).balance;
+        payable(msg.sender).transfer(amount);
     }
 
     /// @inheritdoc IDelayedWETH
     function hold(address _guy, uint256 _wad) external {
         require(msg.sender == owner(), "DelayedWETH: not owner");
-        allowance[msg.sender][_guy] = _wad;
-        emit Approval(msg.sender, _guy, _wad);
+        allowance[_guy][msg.sender] = _wad;
+        emit Approval(_guy, msg.sender, _wad);
     }
 }
diff --git a/packages/contracts-bedrock/src/dispute/weth/WETH98.sol b/packages/contracts-bedrock/src/dispute/weth/WETH98.sol
index c52291e0982b..f95699a3bf93 100644
--- a/packages/contracts-bedrock/src/dispute/weth/WETH98.sol
+++ b/packages/contracts-bedrock/src/dispute/weth/WETH98.sol
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-3.0
 // Copyright (C) 2015, 2016, 2017 Dapphub
 
 // This program is free software: you can redistribute it and/or modify
@@ -23,8 +24,6 @@ import { IWETH } from "src/dispute/interfaces/IWETH.sol";
 /// @title WETH98
 /// @notice WETH98 is a version of WETH9 upgraded for Solidity 0.8.x.
 contract WETH98 is IWETH {
-    string public constant name = "Wrapped Ether";
-    string public constant symbol = "WETH";
     uint8 public constant decimals = 18;
 
     mapping(address => uint256) public balanceOf;
@@ -35,6 +34,21 @@ contract WETH98 is IWETH {
         deposit();
     }
 
+    /// @notice Pipes to deposit.
+    fallback() external payable {
+        deposit();
+    }
+
+    /// @inheritdoc IWETH
+    function name() external view virtual override returns (string memory) {
+        return "Wrapped Ether";
+    }
+
+    /// @inheritdoc IWETH
+    function symbol() external view virtual override returns (string memory) {
+        return "WETH";
+    }
+
     /// @inheritdoc IWETH
     function deposit() public payable {
         balanceOf[msg.sender] += msg.value;
diff --git a/packages/contracts-bedrock/src/libraries/Clone.sol b/packages/contracts-bedrock/src/libraries/Clone.sol
deleted file mode 100644
index 6ba37793ee08..000000000000
--- a/packages/contracts-bedrock/src/libraries/Clone.sol
+++ /dev/null
@@ -1,97 +0,0 @@
-// SPDX-License-Identifier: BSD
-pragma solidity ^0.8.15;
-
-/// @title Clone
-/// @author zefram.eth, Saw-mon & Natalie, clabby
-/// @notice Provides helper functions for reading immutable args from calldata
-/// @dev Original:
-///      https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args/
-///      blob/105efee1b9127ed7f6fedf139e1fc796ce8791f2/src/Clone.sol
-/// @dev MODIFICATIONS:
-///      - Added `_getArgDynBytes` function.
-contract Clone {
-    uint256 private constant ONE_WORD = 0x20;
-
-    /// @notice Reads an immutable arg with type address
-    /// @param argOffset The offset of the arg in the packed data
-    /// @return arg The arg value
-    function _getArgAddress(uint256 argOffset) internal pure returns (address arg) {
-        uint256 offset = _getImmutableArgsOffset();
-        assembly {
-            arg := shr(0x60, calldataload(add(offset, argOffset)))
-        }
-    }
-
-    /// @notice Reads an immutable arg with type uint256
-    /// @param argOffset The offset of the arg in the packed data
-    /// @return arg The arg value
-    function _getArgUint256(uint256 argOffset) internal pure returns (uint256 arg) {
-        uint256 offset = _getImmutableArgsOffset();
-        assembly {
-            arg := calldataload(add(offset, argOffset))
-        }
-    }
-
-    /// @notice Reads an immutable arg with type bytes32
-    /// @param argOffset The offset of the arg in the packed data
-    /// @return arg The arg value
-    function _getArgFixedBytes(uint256 argOffset) internal pure returns (bytes32 arg) {
-        uint256 offset = _getImmutableArgsOffset();
-        assembly {
-            arg := calldataload(add(offset, argOffset))
-        }
-    }
-
-    /// @notice Reads a uint256 array stored in the immutable args.
-    /// @param argOffset The offset of the arg in the packed data
-    /// @param arrLen Number of elements in the array
-    /// @return arr The array
-    function _getArgUint256Array(uint256 argOffset, uint64 arrLen) internal pure returns (uint256[] memory arr) {
-        uint256 offset = _getImmutableArgsOffset() + argOffset;
-        arr = new uint256[](arrLen);
-
-        assembly {
-            calldatacopy(add(arr, ONE_WORD), offset, shl(5, arrLen))
-        }
-    }
-
-    /// @notice Reads a dynamic bytes array stored in the immutable args.
-    /// @param argOffset The offset of the arg in the packed data
-    /// @param arrLen Number of elements in the array
-    /// @return arr The array
-    function _getArgDynBytes(uint256 argOffset, uint64 arrLen) internal pure returns (bytes memory arr) {
-        uint256 offset = _getImmutableArgsOffset() + argOffset;
-        arr = new bytes(arrLen);
-
-        assembly {
-            calldatacopy(add(arr, ONE_WORD), offset, arrLen)
-        }
-    }
-
-    /// @notice Reads an immutable arg with type uint64
-    /// @param argOffset The offset of the arg in the packed data
-    /// @return arg The arg value
-    function _getArgUint64(uint256 argOffset) internal pure returns (uint64 arg) {
-        uint256 offset = _getImmutableArgsOffset();
-        assembly {
-            arg := shr(0xc0, calldataload(add(offset, argOffset)))
-        }
-    }
-
-    /// @notice Reads an immutable arg with type uint8
-    /// @param argOffset The offset of the arg in the packed data
-    /// @return arg The arg value
-    function _getArgUint8(uint256 argOffset) internal pure returns (uint8 arg) {
-        uint256 offset = _getImmutableArgsOffset();
-        assembly {
-            arg := shr(0xf8, calldataload(add(offset, argOffset)))
-        }
-    }
-
-    /// @return offset The offset of the packed immutable args in calldata
-    function _getImmutableArgsOffset() internal pure returns (uint256 offset) {
-        assembly {
-            offset := sub(calldatasize(), shr(0xf0, calldataload(sub(calldatasize(), 2))))
-        }
-    }
-}
diff --git a/packages/contracts-bedrock/src/libraries/Constants.sol b/packages/contracts-bedrock/src/libraries/Constants.sol
index 933250d1ecda..e86010421d34 100644
--- a/packages/contracts-bedrock/src/libraries/Constants.sol
+++ b/packages/contracts-bedrock/src/libraries/Constants.sol
@@ -30,6 +30,13 @@ library Constants {
     /// @dev `bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)`
     bytes32 internal constant PROXY_OWNER_ADDRESS = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
 
+    /// @notice The address that represents ether when dealing with ERC20 token addresses.
+    address internal constant ETHER = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+
+    /// @notice The address that represents the system caller responsible for L1 attributes
+    ///         transactions.
+    address internal constant DEPOSITOR_ACCOUNT = 0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001;
+
     /// @notice Returns the default values for the ResourceConfig. These are the recommended values
     ///         for a production network.
     function DEFAULT_RESOURCE_CONFIG() internal pure returns (ResourceMetering.ResourceConfig memory) {
diff --git a/packages/contracts-bedrock/src/libraries/DisputeTypes.sol b/packages/contracts-bedrock/src/libraries/DisputeTypes.sol
deleted file mode 100644
index 1d8d57fca6ff..000000000000
--- a/packages/contracts-bedrock/src/libraries/DisputeTypes.sol
+++ /dev/null
@@ -1,139 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.15;
-
-import { LibHashing } from "src/dispute/lib/LibHashing.sol";
-import {
-    LibClaim,
-    LibHash,
-    LibDuration,
-    LibClock,
-    LibTimestamp,
-    LibVMStatus,
-    LibGameType
-} from "src/dispute/lib/LibUDT.sol";
-import { LibPosition } from "src/dispute/lib/LibPosition.sol";
-import { LibGameId } from "src/dispute/lib/LibGameId.sol";
-
-using LibClaim for Claim global;
-using LibHashing for Claim global;
-using LibHash for Hash global;
-using LibPosition for Position global;
-using LibDuration for Duration global;
-using LibClock for Clock global;
-using LibGameId for GameId global;
-using LibTimestamp for Timestamp global;
-using LibVMStatus for VMStatus global;
-using LibGameType for GameType global;
-
-/// @notice A custom type for a generic hash.
-type Hash is bytes32;
-
-/// @notice A claim represents an MPT root representing the state of the fault proof program.
-type Claim is bytes32;
-
-/// @notice A claim hash represents a hash of a claim and a position within the game tree.
-/// @dev Keccak hash of abi.encodePacked(Claim, Position);
-type ClaimHash is bytes32;
-
-/// @notice A bondamount represents the amount of collateral that a user has locked up in a claim.
-type BondAmount is uint256;
-
-/// @notice A dedicated timestamp type.
-type Timestamp is uint64;
-
-/// @notice A dedicated duration type.
-/// @dev Unit: seconds
-type Duration is uint64;
-
-/// @notice A `GameId` represents a packed 1 byte game ID, an 11 byte timestamp, and a 20 byte address.
-/// @dev The packed layout of this type is as follows:
-/// ┌───────────┬───────────┐
-/// │   Bits    │   Value   │
-/// ├───────────┼───────────┤
-/// │ [0, 8)    │ Game Type │
-/// │ [8, 96)   │ Timestamp │
-/// │ [96, 256) │ Address   │
-/// └───────────┴───────────┘
-type GameId is bytes32;
-
-/// @notice A `Clock` represents a packed `Duration` and `Timestamp`
-/// @dev The packed layout of this type is as follows:
-/// ┌────────────┬────────────────┐
-/// │    Bits    │     Value      │
-/// ├────────────┼────────────────┤
-/// │ [0, 64)    │ Duration       │
-/// │ [64, 128)  │ Timestamp      │
-/// └────────────┴────────────────┘
-type Clock is uint128;
-
-/// @notice A `Position` represents a position of a claim within the game tree.
-/// @dev This is represented as a "generalized index" where the high-order bit
-/// is the level in the tree and the remaining bits is a unique bit pattern, allowing
-/// a unique identifier for each node in the tree. Mathematically, it is calculated
-/// as 2^{depth} + indexAtDepth.
-type Position is uint128;
-
-/// @notice A `GameType` represents the type of game being played.
-type GameType is uint32;
-
-/// @notice A `VMStatus` represents the status of a VM execution.
-type VMStatus is uint8;
-
-/// @notice The current status of the dispute game.
-enum GameStatus {
-    // The game is currently in progress, and has not been resolved.
-    IN_PROGRESS,
-    // The game has concluded, and the `rootClaim` was challenged successfully.
-    CHALLENGER_WINS,
-    // The game has concluded, and the `rootClaim` could not be contested.
-    DEFENDER_WINS
-}
-
-/// @title GameTypes
-/// @notice A library that defines the IDs of games that can be played.
-library GameTypes {
-    /// @dev A dispute game type the uses the cannon vm.
-    GameType internal constant CANNON = GameType.wrap(0);
-
-    /// @dev A permissioned dispute game type the uses the cannon vm.
-    GameType internal constant PERMISSIONED_CANNON = GameType.wrap(1);
-
-    /// @notice A dispute game type that uses an alphabet vm.
-    ///         Not intended for production use.
-    GameType internal constant ALPHABET = GameType.wrap(255);
-}
-
-/// @title VMStatuses
-/// @notice Named type aliases for the various valid VM status bytes.
-library VMStatuses {
-    /// @notice The VM has executed successfully and the outcome is valid.
-    VMStatus internal constant VALID = VMStatus.wrap(0);
-
-    /// @notice The VM has executed successfully and the outcome is invalid.
-    VMStatus internal constant INVALID = VMStatus.wrap(1);
-
-    /// @notice The VM has paniced.
-    VMStatus internal constant PANIC = VMStatus.wrap(2);
-
-    /// @notice The VM execution is still in progress.
-    VMStatus internal constant UNFINISHED = VMStatus.wrap(3);
-}
-
-/// @title LocalPreimageKey
-/// @notice Named type aliases for local `PreimageOracle` key identifiers.
-library LocalPreimageKey {
-    /// @notice The identifier for the L1 head hash.
-    uint256 internal constant L1_HEAD_HASH = 0x01;
-
-    /// @notice The identifier for the starting output root.
-    uint256 internal constant STARTING_OUTPUT_ROOT = 0x02;
-
-    /// @notice The identifier for the disputed output root.
-    uint256 internal constant DISPUTED_OUTPUT_ROOT = 0x03;
-
-    /// @notice The identifier for the disputed L2 block number.
-    uint256 internal constant DISPUTED_L2_BLOCK_NUMBER = 0x04;
-
-    /// @notice The identifier for the chain ID.
-    uint256 internal constant CHAIN_ID = 0x05;
-}
diff --git a/packages/contracts-bedrock/src/libraries/Encoding.sol b/packages/contracts-bedrock/src/libraries/Encoding.sol
index f53d7c59d288..dae9486c7c63 100644
--- a/packages/contracts-bedrock/src/libraries/Encoding.sol
+++ b/packages/contracts-bedrock/src/libraries/Encoding.sol
@@ -173,4 +173,52 @@ library Encoding {
             batcherHash
         );
     }
+
+    /// @notice Returns an appropriately encoded call to L1Block.setL1BlockValuesInterop
+    /// @param _baseFeeScalar       L1 base fee Scalar
+    /// @param _blobBaseFeeScalar   L1 blob base fee Scalar
+    /// @param _sequenceNumber      Number of L2 blocks since epoch start.
+    /// @param _timestamp           L1 timestamp.
+    /// @param _number              L1 blocknumber.
+    /// @param _baseFee             L1 base fee.
+    /// @param _blobBaseFee         L1 blob base fee.
+    /// @param _hash                L1 blockhash.
+    /// @param _batcherHash         Versioned hash to authenticate batcher by.
+    /// @param _dependencySet       Array of the chain IDs in the interop dependency set.
+    function encodeSetL1BlockValuesInterop(
+        uint32 _baseFeeScalar,
+        uint32 _blobBaseFeeScalar,
+        uint64 _sequenceNumber,
+        uint64 _timestamp,
+        uint64 _number,
+        uint256 _baseFee,
+        uint256 _blobBaseFee,
+        bytes32 _hash,
+        bytes32 _batcherHash,
+        uint256[] memory _dependencySet
+    )
+        internal
+        pure
+        returns (bytes memory)
+    {
+        require(_dependencySet.length <= type(uint8).max, "Encoding: dependency set length is too large");
+        // Check that the batcher hash is just the address with 0 padding to the left for version 0.
+        require(uint160(uint256(_batcherHash)) == uint256(_batcherHash), "Encoding: invalid batcher hash");
+
+        bytes4 functionSignature = bytes4(keccak256("setL1BlockValuesInterop()"));
+        return abi.encodePacked(
+            functionSignature,
+            _baseFeeScalar,
+            _blobBaseFeeScalar,
+            _sequenceNumber,
+            _timestamp,
+            _number,
+            _baseFee,
+            _blobBaseFee,
+            _hash,
+            _batcherHash,
+            uint8(_dependencySet.length),
+            _dependencySet
+        );
+    }
 }
diff --git a/packages/contracts-bedrock/src/libraries/GasPayingToken.sol b/packages/contracts-bedrock/src/libraries/GasPayingToken.sol
new file mode 100644
index 000000000000..37c06840bd59
--- /dev/null
+++ b/packages/contracts-bedrock/src/libraries/GasPayingToken.sol
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import { Storage } from "src/libraries/Storage.sol";
+import { Constants } from "src/libraries/Constants.sol";
+import { LibString } from "@solady/utils/LibString.sol";
+
+/// @title IGasToken
+/// @notice Implemented by contracts that are aware of the custom gas token used
+///         by the L2 network.
+interface IGasToken {
+    /// @notice Getter for the ERC20 token address that is used to pay for gas and its decimals.
+    function gasPayingToken() external view returns (address, uint8);
+    /// @notice Returns the gas token name.
+    function gasPayingTokenName() external view returns (string memory);
+    /// @notice Returns the gas token symbol.
+    function gasPayingTokenSymbol() external view returns (string memory);
+    /// @notice Returns true if the network uses a custom gas token.
+    function isCustomGasToken() external view returns (bool);
+}
+
+/// @title GasPayingToken
+/// @notice Handles reading and writing the custom gas token to storage.
+///         To be used in any place where gas token information is read or
+///         written to state. If multiple contracts use this library, the
+///         values in storage should be kept in sync between them.
+library GasPayingToken {
+    /// @notice The storage slot that contains the address and decimals of the gas paying token
+    bytes32 internal constant GAS_PAYING_TOKEN_SLOT = bytes32(uint256(keccak256("opstack.gaspayingtoken")) - 1);
+
+    /// @notice The storage slot that contains the ERC20 `name()` of the gas paying token
+    bytes32 internal constant GAS_PAYING_TOKEN_NAME_SLOT = bytes32(uint256(keccak256("opstack.gaspayingtokenname")) - 1);
+
+    /// @notice the storage slot that contains the ERC20 `symbol()` of the gas paying token
+    bytes32 internal constant GAS_PAYING_TOKEN_SYMBOL_SLOT =
+        bytes32(uint256(keccak256("opstack.gaspayingtokensymbol")) - 1);
+
+    /// @notice Reads the gas paying token and its decimals from the magic
+    ///         storage slot. If nothing is set in storage, then the ether
+    ///         address is returned instead.
+    function getToken() internal view returns (address addr_, uint8 decimals_) {
+        bytes32 slot = Storage.getBytes32(GAS_PAYING_TOKEN_SLOT);
+        addr_ = address(uint160(uint256(slot) & uint256(type(uint160).max)));
+        if (addr_ == address(0)) {
+            addr_ = Constants.ETHER;
+            decimals_ = 18;
+        } else {
+            decimals_ = uint8(uint256(slot) >> 160);
+        }
+    }
+
+    /// @notice Reads the gas paying token's name from the magic storage slot.
+    ///         If nothing is set in storage, then the ether name, 'Ether', is returned instead.
+    function getName() internal view returns (string memory name_) {
+        (address addr,) = getToken();
+        if (addr == Constants.ETHER) {
+            name_ = "Ether";
+        } else {
+            name_ = LibString.fromSmallString(Storage.getBytes32(GAS_PAYING_TOKEN_NAME_SLOT));
+        }
+    }
+
+    /// @notice Reads the gas paying token's symbol from the magic storage slot.
+    ///         If nothing is set in storage, then the ether symbol, 'ETH', is returned instead.
+    function getSymbol() internal view returns (string memory symbol_) {
+        (address addr,) = getToken();
+        if (addr == Constants.ETHER) {
+            symbol_ = "ETH";
+        } else {
+            symbol_ = LibString.fromSmallString(Storage.getBytes32(GAS_PAYING_TOKEN_SYMBOL_SLOT));
+        }
+    }
+
+    /// @notice Writes the gas paying token, its decimals, name and symbol to the magic storage slot.
+    function set(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) internal {
+        Storage.setBytes32(GAS_PAYING_TOKEN_SLOT, bytes32(uint256(_decimals) << 160 | uint256(uint160(_token))));
+        Storage.setBytes32(GAS_PAYING_TOKEN_NAME_SLOT, _name);
+        Storage.setBytes32(GAS_PAYING_TOKEN_SYMBOL_SLOT, _symbol);
+    }
+
+    /// @notice Maps a string to a normalized null-terminated small string.
+    function sanitize(string memory _str) internal pure returns (bytes32) {
+        require(bytes(_str).length <= 32, "GasPayingToken: string cannot be greater than 32 bytes");
+
+        return LibString.toSmallString(_str);
+    }
+}
diff --git a/packages/contracts-bedrock/src/libraries/L1BlockErrors.sol b/packages/contracts-bedrock/src/libraries/L1BlockErrors.sol
new file mode 100644
index 000000000000..c9ef3903aebe
--- /dev/null
+++ b/packages/contracts-bedrock/src/libraries/L1BlockErrors.sol
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+/// @notice Error returns when a non-depositor account tries to set L1 block values.
+error NotDepositor();
+
+/// @notice Error when a chain ID is not in the interop dependency set.
+error NotDependency();
+
+/// @notice Error when the interop dependency set size is too large.
+error DependencySetSizeTooLarge();
+
+/// @notice Error when a chain ID already in the interop dependency set is attempted to be added.
+error AlreadyDependency();
+
+/// @notice Error when the chain's chain ID is attempted to be removed from the interop dependency set.
+error CantRemovedDependency();
diff --git a/packages/contracts-bedrock/src/libraries/PortalErrors.sol b/packages/contracts-bedrock/src/libraries/PortalErrors.sol
new file mode 100644
index 000000000000..0ec300370f20
--- /dev/null
+++ b/packages/contracts-bedrock/src/libraries/PortalErrors.sol
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+/// @notice Error for when a deposit or withdrawal is to a bad target.
+error BadTarget();
+/// @notice Error for when a deposit has too much calldata.
+error LargeCalldata();
+/// @notice Error for when a deposit has too small of a gas limit.
+error SmallGasLimit();
+/// @notice Error for when a withdrawal transfer fails.
+error TransferFailed();
+/// @notice Error for when a method is called that only works when using a custom gas token.
+error OnlyCustomGasToken();
+/// @notice Error for when a method cannot be called with non zero CALLVALUE.
+error NoValue();
+/// @notice Error for an unauthorized CALLER.
+error Unauthorized();
+/// @notice Error for when a method cannot be called when paused. This could be renamed
+///         to `Paused` in the future, but it collides with the `Paused` event.
+error CallPaused();
+/// @notice Error for special gas estimation.
+error GasEstimation();
+/// @notice Error for when a method is being reentered.
+error NonReentrant();
diff --git a/packages/contracts-bedrock/src/libraries/Predeploys.sol b/packages/contracts-bedrock/src/libraries/Predeploys.sol
index e06566481933..d37dbca6af11 100644
--- a/packages/contracts-bedrock/src/libraries/Predeploys.sol
+++ b/packages/contracts-bedrock/src/libraries/Predeploys.sol
@@ -2,63 +2,62 @@
 pragma solidity ^0.8.0;
 
 /// @title Predeploys
-/// @notice Contains constant addresses for contracts that are pre-deployed to the L2 system.
+/// @notice Contains constant addresses for protocol contracts that are pre-deployed to the L2 system.
+//          This excludes the preinstalls (non-protocol contracts).
 library Predeploys {
-    /// @notice Address of the L2ToL1MessagePasser predeploy.
-    address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000016;
-
-    /// @notice Address of the L2CrossDomainMessenger predeploy.
-    address internal constant L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000007;
-
-    /// @notice Address of the L2StandardBridge predeploy.
-    address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;
-
-    /// @notice Address of the L2ERC721Bridge predeploy.
-    address internal constant L2_ERC721_BRIDGE = 0x4200000000000000000000000000000000000014;
-
-    //// @notice Address of the SequencerFeeWallet predeploy.
-    address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;
-
-    /// @notice Address of the OptimismMintableERC20Factory predeploy.
-    address internal constant OPTIMISM_MINTABLE_ERC20_FACTORY = 0x4200000000000000000000000000000000000012;
-
-    /// @notice Address of the OptimismMintableERC721Factory predeploy.
-    address internal constant OPTIMISM_MINTABLE_ERC721_FACTORY = 0x4200000000000000000000000000000000000017;
-
-    /// @notice Address of the L1Block predeploy.
-    address internal constant L1_BLOCK_ATTRIBUTES = 0x4200000000000000000000000000000000000015;
+    /// @notice Number of predeploy-namespace addresses reserved for protocol usage.
+    uint256 internal constant PREDEPLOY_COUNT = 2048;
 
-    /// @notice Address of the GasPriceOracle predeploy. Includes fee information
-    ///         and helpers for computing the L1 portion of the transaction fee.
-    address internal constant GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;
+    /// @custom:legacy
+    /// @notice Address of the LegacyMessagePasser predeploy. Deprecate. Use the updated
+    ///         L2ToL1MessagePasser contract instead.
+    address internal constant LEGACY_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;
 
     /// @custom:legacy
     /// @notice Address of the L1MessageSender predeploy. Deprecated. Use L2CrossDomainMessenger
     ///         or access tx.origin (or msg.sender) in a L1 to L2 transaction instead.
+    ///         Not embedded into new OP-Stack chains.
     address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;
 
     /// @custom:legacy
     /// @notice Address of the DeployerWhitelist predeploy. No longer active.
     address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;
 
-    /// @notice Address of the canonical WETH9 contract.
-    address internal constant WETH9 = 0x4200000000000000000000000000000000000006;
+    /// @notice Address of the canonical WETH contract.
+    address internal constant WETH = 0x4200000000000000000000000000000000000006;
 
-    /// @custom:legacy
-    /// @notice Address of the LegacyERC20ETH predeploy. Deprecated. Balances are migrated to the
-    ///         state trie as of the Bedrock upgrade. Contract has been locked and write functions
-    ///         can no longer be accessed.
-    address internal constant LEGACY_ERC20_ETH = 0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000;
+    /// @notice Address of the L2CrossDomainMessenger predeploy.
+    address internal constant L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000007;
+
+    /// @notice Address of the GasPriceOracle predeploy. Includes fee information
+    ///         and helpers for computing the L1 portion of the transaction fee.
+    address internal constant GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;
+
+    /// @notice Address of the L2StandardBridge predeploy.
+    address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;
+
+    //// @notice Address of the SequencerFeeWallet predeploy.
+    address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;
+
+    /// @notice Address of the OptimismMintableERC20Factory predeploy.
+    address internal constant OPTIMISM_MINTABLE_ERC20_FACTORY = 0x4200000000000000000000000000000000000012;
 
     /// @custom:legacy
     /// @notice Address of the L1BlockNumber predeploy. Deprecated. Use the L1Block predeploy
     ///         instead, which exposes more information about the L1 state.
     address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;
 
-    /// @custom:legacy
-    /// @notice Address of the LegacyMessagePasser predeploy. Deprecate. Use the updated
-    ///         L2ToL1MessagePasser contract instead.
-    address internal constant LEGACY_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;
+    /// @notice Address of the L2ERC721Bridge predeploy.
+    address internal constant L2_ERC721_BRIDGE = 0x4200000000000000000000000000000000000014;
+
+    /// @notice Address of the L1Block predeploy.
+    address internal constant L1_BLOCK_ATTRIBUTES = 0x4200000000000000000000000000000000000015;
+
+    /// @notice Address of the L2ToL1MessagePasser predeploy.
+    address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000016;
+
+    /// @notice Address of the OptimismMintableERC721Factory predeploy.
+    address internal constant OPTIMISM_MINTABLE_ERC721_FACTORY = 0x4200000000000000000000000000000000000017;
 
     /// @notice Address of the ProxyAdmin predeploy.
     address internal constant PROXY_ADMIN = 0x4200000000000000000000000000000000000018;
@@ -69,45 +68,84 @@ library Predeploys {
     /// @notice Address of the L1FeeVault predeploy.
     address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A;
 
-    /// @notice Address of the GovernanceToken predeploy.
-    address internal constant GOVERNANCE_TOKEN = 0x4200000000000000000000000000000000000042;
-
     /// @notice Address of the SchemaRegistry predeploy.
     address internal constant SCHEMA_REGISTRY = 0x4200000000000000000000000000000000000020;
 
     /// @notice Address of the EAS predeploy.
     address internal constant EAS = 0x4200000000000000000000000000000000000021;
 
-    /// @notice Address of the MultiCall3 predeploy.
-    address internal constant MultiCall3 = 0xcA11bde05977b3631167028862bE2a173976CA11;
-
-    /// @notice Address of the Create2Deployer predeploy.
-    address internal constant Create2Deployer = 0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2;
-
-    /// @notice Address of the Safe_v130 predeploy.
-    address internal constant Safe_v130 = 0x69f4D1788e39c87893C980c06EdF4b7f686e2938;
-
-    /// @notice Address of the SafeL2_v130 predeploy.
-    address internal constant SafeL2_v130 = 0xfb1bffC9d739B8D520DaF37dF666da4C687191EA;
-
-    /// @notice Address of the MultiSendCallOnly_v130 predeploy.
-    address internal constant MultiSendCallOnly_v130 = 0xA1dabEF33b3B82c7814B6D82A79e50F4AC44102B;
-
-    /// @notice Address of the SafeSingletonFactory predeploy.
-    address internal constant SafeSingletonFactory = 0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7;
-
-    /// @notice Address of the DeterministicDeploymentProxy predeploy.
-    address internal constant DeterministicDeploymentProxy = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
-
-    /// @notice Address of the MultiSend_v130 predeploy.
-    address internal constant MultiSend_v130 = 0x998739BFdAAdde7C933B942a68053933098f9EDa;
-
-    /// @notice Address of the Permit2 predeploy.
-    address internal constant Permit2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3;
+    /// @notice Address of the GovernanceToken predeploy.
+    address internal constant GOVERNANCE_TOKEN = 0x4200000000000000000000000000000000000042;
 
-    /// @notice Address of the SenderCreator predeploy.
-    address internal constant SenderCreator = 0x7fc98430eAEdbb6070B35B39D798725049088348;
+    /// @custom:legacy
+    /// @notice Address of the LegacyERC20ETH predeploy. Deprecated. Balances are migrated to the
+    ///         state trie as of the Bedrock upgrade. Contract has been locked and write functions
+    ///         can no longer be accessed.
+    address internal constant LEGACY_ERC20_ETH = 0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000;
 
-    /// @notice Address of the EntryPoint predeploy.
-    address internal constant EntryPoint = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789;
+    /// @notice Address of the CrossL2Inbox predeploy.
+    address internal constant CROSS_L2_INBOX = 0x4200000000000000000000000000000000000022;
+
+    /// @notice Address of the L2ToL2CrossDomainMessenger predeploy.
+    address internal constant L2_TO_L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000023;
+
+    /// @notice Returns the name of the predeploy at the given address.
+    function getName(address _addr) internal pure returns (string memory out_) {
+        require(isPredeployNamespace(_addr), "Predeploys: address must be a predeploy");
+        if (_addr == LEGACY_MESSAGE_PASSER) return "LegacyMessagePasser";
+        if (_addr == L1_MESSAGE_SENDER) return "L1MessageSender";
+        if (_addr == DEPLOYER_WHITELIST) return "DeployerWhitelist";
+        if (_addr == WETH) return "WETH";
+        if (_addr == L2_CROSS_DOMAIN_MESSENGER) return "L2CrossDomainMessenger";
+        if (_addr == GAS_PRICE_ORACLE) return "GasPriceOracle";
+        if (_addr == L2_STANDARD_BRIDGE) return "L2StandardBridge";
+        if (_addr == SEQUENCER_FEE_WALLET) return "SequencerFeeVault";
+        if (_addr == OPTIMISM_MINTABLE_ERC20_FACTORY) return "OptimismMintableERC20Factory";
+        if (_addr == L1_BLOCK_NUMBER) return "L1BlockNumber";
+        if (_addr == L2_ERC721_BRIDGE) return "L2ERC721Bridge";
+        if (_addr == L1_BLOCK_ATTRIBUTES) return "L1Block";
+        if (_addr == L2_TO_L1_MESSAGE_PASSER) return "L2ToL1MessagePasser";
+        if (_addr == OPTIMISM_MINTABLE_ERC721_FACTORY) return "OptimismMintableERC721Factory";
+        if (_addr == PROXY_ADMIN) return "ProxyAdmin";
+        if (_addr == BASE_FEE_VAULT) return "BaseFeeVault";
+        if (_addr == L1_FEE_VAULT) return "L1FeeVault";
+        if (_addr == SCHEMA_REGISTRY) return "SchemaRegistry";
+        if (_addr == EAS) return "EAS";
+        if (_addr == GOVERNANCE_TOKEN) return "GovernanceToken";
+        if (_addr == LEGACY_ERC20_ETH) return "LegacyERC20ETH";
+        if (_addr == CROSS_L2_INBOX) return "CrossL2Inbox";
+        if (_addr == L2_TO_L2_CROSS_DOMAIN_MESSENGER) return "L2ToL2CrossDomainMessenger";
+        revert("Predeploys: unnamed predeploy");
+    }
+
+    /// @notice Returns true if the predeploy is not proxied.
+    function notProxied(address _addr) internal pure returns (bool) {
+        return _addr == GOVERNANCE_TOKEN || _addr == WETH;
+    }
+
+    /// @notice Returns true if the address is a defined predeploy that is embedded into new OP-Stack chains.
+    function isSupportedPredeploy(address _addr, bool _useInterop) internal pure returns (bool) {
+        return _addr == LEGACY_MESSAGE_PASSER || _addr == DEPLOYER_WHITELIST || _addr == WETH
+            || _addr == L2_CROSS_DOMAIN_MESSENGER || _addr == GAS_PRICE_ORACLE || _addr == L2_STANDARD_BRIDGE
+            || _addr == SEQUENCER_FEE_WALLET || _addr == OPTIMISM_MINTABLE_ERC20_FACTORY || _addr == L1_BLOCK_NUMBER
+            || _addr == L2_ERC721_BRIDGE || _addr == L1_BLOCK_ATTRIBUTES || _addr == L2_TO_L1_MESSAGE_PASSER
+            || _addr == OPTIMISM_MINTABLE_ERC721_FACTORY || _addr == PROXY_ADMIN || _addr == BASE_FEE_VAULT
+            || _addr == L1_FEE_VAULT || _addr == SCHEMA_REGISTRY || _addr == EAS || _addr == GOVERNANCE_TOKEN
+            || (_useInterop && _addr == CROSS_L2_INBOX) || (_useInterop && _addr == L2_TO_L2_CROSS_DOMAIN_MESSENGER);
+    }
+
+    function isPredeployNamespace(address _addr) internal pure returns (bool) {
+        return uint160(_addr) >> 11 == uint160(0x4200000000000000000000000000000000000000) >> 11;
+    }
+
+    /// @notice Function to compute the expected address of the predeploy implementation
+    ///         in the genesis state.
+    function predeployToCodeNamespace(address _addr) internal pure returns (address) {
+        require(
+            isPredeployNamespace(_addr), "Predeploys: can only derive code-namespace address for predeploy addresses"
+        );
+        return address(
+            uint160(uint256(uint160(_addr)) & 0xffff | uint256(uint160(0xc0D3C0d3C0d3C0D3c0d3C0d3c0D3C0d3c0d30000)))
+        );
+    }
 }
diff --git a/packages/contracts-bedrock/src/libraries/Preinstalls.sol b/packages/contracts-bedrock/src/libraries/Preinstalls.sol
new file mode 100644
index 000000000000..7c245545c869
--- /dev/null
+++ b/packages/contracts-bedrock/src/libraries/Preinstalls.sol
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+/// @title Preinstalls
+/// @notice Contains constant addresses for non-protocol contracts that are pre-deployed to the L2 system.
+//          This excludes the predeploys (protocol contracts).
+library Preinstalls {
+    /// @notice Address of the MultiCall3 predeploy.
+    address internal constant MultiCall3 = 0xcA11bde05977b3631167028862bE2a173976CA11;
+
+    /// @notice Address of the Create2Deployer predeploy.
+    address internal constant Create2Deployer = 0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2;
+
+    /// @notice Address of the Safe_v130 predeploy.
+    address internal constant Safe_v130 = 0x69f4D1788e39c87893C980c06EdF4b7f686e2938;
+
+    /// @notice Address of the SafeL2_v130 predeploy.
+    address internal constant SafeL2_v130 = 0xfb1bffC9d739B8D520DaF37dF666da4C687191EA;
+
+    /// @notice Address of the MultiSendCallOnly_v130 predeploy.
+    address internal constant MultiSendCallOnly_v130 = 0xA1dabEF33b3B82c7814B6D82A79e50F4AC44102B;
+
+    /// @notice Address of the SafeSingletonFactory predeploy.
+    address internal constant SafeSingletonFactory = 0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7;
+
+    /// @notice Address of the DeterministicDeploymentProxy predeploy.
+    address internal constant DeterministicDeploymentProxy = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
+
+    /// @notice Address of the MultiSend_v130 predeploy.
+    address internal constant MultiSend_v130 = 0x998739BFdAAdde7C933B942a68053933098f9EDa;
+
+    /// @notice Address of the Permit2 predeploy.
+    address internal constant Permit2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3;
+
+    /// @notice Address of the SenderCreator predeploy.
+    address internal constant SenderCreator = 0x7fc98430eAEdbb6070B35B39D798725049088348;
+
+    /// @notice Address of the EntryPoint predeploy.
+    address internal constant EntryPoint = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789;
+
+    /// @notice Address of beacon block roots contract, introduced in the Cancun upgrade.
+    ///         See BEACON_ROOTS_ADDRESS in EIP-4788.
+    ///         This contract is introduced in L2 through an Ecotone upgrade transaction, if not already in genesis.
+    address internal constant BeaconBlockRoots = 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02;
+
+    /// @notice See https://eips.ethereum.org/EIPS/eip-4788, this is the address of the sender of the deployment tx.
+    /// The nonce of this account must be non-zero, to ensure the Ecotone upgrade tx is still successful
+    /// if the code is already in place.
+    address internal constant BeaconBlockRootsSender = 0x0B799C86a49DEeb90402691F1041aa3AF2d3C875;
+
+    // @notice Permit2 code is templated. The template is a copy of the Mainnet Ethereum L1 Permit2 deployment.
+    //         This deployed bytecode contains two immutable values _CACHED_CHAIN_ID and _CACHED_DOMAIN_SEPARATOR,
+    //         which depend on the chain-ID (the domain-separator is computed with the chain-ID as input).
+    //         Note that the _CACHED_DOMAIN_SEPARATOR in the Permit2 deployed-bytecode of the
+    //         Permit2 test-utils is wrong, and does not match the chain-ID of 31337 in said bytecode.
+    //         These two values are substituted for accuracy when the code is retrieved with getPermit2Code(chainid).
+    bytes internal constant Permit2TemplateCode =
+        hex"6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000000103611b69577f866a5aba21966af95d6c7ab78eb2b2fc913915c28be3b9aa07cc04ff903e3f2890565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a";
+
+    bytes internal constant MultiCall3Code =
+        hex"6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033";
+
+    bytes internal constant Create2DeployerCode =
+        hex"6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033";
+
+    bytes internal constant Safe_v130Code =
+        hex"6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c63430007060033";
+
+    bytes internal constant SafeL2_v130Code =
+        hex"6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506126fc565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b810190808035906020019092919080359060200190929190505050612732565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b81019080803590602001909291905050506127b9565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d1565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612b63565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c9d565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612edc565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612f01565b005b348015610d3457600080fd5b50610d3d612f90565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613139565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061313f565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613161565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff16906020019092919050505061331f565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613447565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613639565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506137d8565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613805565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b96565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c1a565b005b34801561148957600080fd5b5061149261428c565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614296565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061443e565b005b3480156116a457600080fd5b506116ad61449f565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061451d565b005b34801561174a57600080fd5b50611753614950565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614989565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612b63565b5b5050565b611bd2604182614a2c90919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614a66565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614a2c90919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614a9590919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614a9590919063ffffffff16565b614a9590919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b60007fb648d3644f584ed1c2232d53c46d87e693586486ad0d1175f8656013110b714e3386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183600181111561266b57fe5b8152602001828103825284818151815260200191508051906020019080838360005b838110156126a857808201518184015260208101905061268d565b50505050905090810190601f1680156126d55780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a16126f285858585614ab4565b9050949350505050565b6000606061270c868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561275057600080fd5b506040519080825280601f01601f1916602001820160405280156127835781602001600182028036833780820191505090505b50905060005b838110156127ae57808501548060208302602085010152508080600101915050612789565b508091505092915050565b60076020528060005260406000206000915090505481565b6127d9614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128435750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6128b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612b6b614989565b600354811115612be3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612c5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000606060055433600454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405160208183030381529060405290507f66753cd2356569ee081232e3be8909b950e0a76c1f8460c3a5e3c2be32b11bed8d8d8d8d8d8d8d8d8d8d8d8c604051808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612d5057fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200184810384528e8e82818152602001925080828437600081840152601f19601f820116905080830192505050848103835286818151815260200191508051906020019080838360005b83811015612e0a578082015181840152602081019050612def565b50505050905090810190601f168015612e375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612e70578082015181840152602081019050612e55565b50505050905090810190601f168015612e9d5780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390a1612eca8d8d8d8d8d8d8d8d8d8d8d614c9a565b9150509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612f7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612f8a84848484611bbe565b50505050565b6060600060035467ffffffffffffffff81118015612fad57600080fd5b50604051908082528060200260200182016040528015612fdc5781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613130578083838151811061308757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050613046565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6131ac8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050896151d7565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131ea576131e9846156d7565b5b6132388787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615706565b60008211156132525761325082600060018685615941565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a9050613376878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615b47565b61337f57600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561340c5780820151818401526020810190506133f1565b50505050905090810190601f1680156134395780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561346257600080fd5b506040519080825280602002602001820160405280156134915781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135645750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561356f57508482105b1561362a578084838151811061358157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506134fa565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006137ed8c8c8c8c8c8c8c8c8c8c8c614296565b8051906020012090509b9a5050505050505050505050565b61380d614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156138775750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6138e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613b9e614989565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613c22614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c8c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613cc457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613d36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613ea15750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614013576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561432757fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6143b361449f565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b614446614989565b61444f816156d7565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6144cd6125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b614525614989565b8060016003540310156145a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561460a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61467c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461477c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1806004541461494b5761494a81612b63565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614a3f5760009050614a60565b6000828402905082848281614a5057fe5b0414614a5b57600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614aaa57600080fd5b8091505092915050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015614b7f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b614bf1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b614bfe858585855a615b47565b90508015614c4e573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2614c92565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000806000614cb48e8e8e8e8e8e8e8e8e8e600554614296565b905060056000815480929190600101919050555080805190602001209150614cdd828286612f01565b506000614ce8615b93565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614ece578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115614d8b57fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015614e5d578082015181840152602081019050614e42565b50505050905090810190601f168015614e8a5780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015614eb557600080fd5b505af1158015614ec9573d6000803e3d6000fd5b505050505b6101f4614ef56109c48b01603f60408d0281614ee657fe5b04615bc490919063ffffffff16565b015a1015614f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a9050614fd48f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d14614fc9578e614fcf565b6109c45a035b615b47565b9350614fe95a82615bde90919063ffffffff16565b90508380614ff8575060008a14155b80615004575060008814155b615076576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156150905761508d828b8b8b8b615941565b90505b84156150da577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a161511a565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146151c6578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156151ad57600080fd5b505af11580156151c1573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b60006004541461524f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81518111156152c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600181101561533d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b835181101561564357600084828151811061535d57fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153d15750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561540957503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561544157508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b6154b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550809250508080600101915050615346565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461593d576158ca8260008360015a615b47565b61593c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461597e5782615980565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615a98576159ea3a86106159c7573a6159c9565b855b6159dc888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615b3d565b615abd85615aaf888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b9150615aca848284615bfe565b615b3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600180811115615b5557fe5b836001811115615b6157fe5b1415615b7a576000808551602087018986f49050615b8a565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015615bd45781615bd6565b825b905092915050565b600082821115615bed57600080fd5b600082840390508091505092915050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615ca55760208114615cad5760009350615cb8565b819350615cb8565b600051158215171593505b505050939250505056fea2646970667358221220047fac33099ca576d1c4f1ac6a8abdb0396e42ad6a397d2cb2f4dc1624cc0c5b64736f6c63430007060033";
+
+    bytes internal constant MultiSendCallOnly_v130Code =
+        hex"60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b805160205b8181101561015f578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811461012857600181146101385761013d565b6000808585888a5af1915061013d565b600080fd5b50600081141561014c57600080fd5b82605501870196505050505050506100e3565b50505056fea264697066735822122035246402746c96964495cae5b36461fd44dfb89f8e6cf6f6b8d60c0aa89f414864736f6c63430007060033";
+
+    bytes internal constant SafeSingletonFactoryCode =
+        hex"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3";
+
+    bytes internal constant DeterministicDeploymentProxyCode =
+        hex"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3";
+
+    bytes internal constant MultiSend_v130Code =
+        hex"60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b7f000000000000000000000000998739bfdaadde7c933b942a68053933098f9eda73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610183576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806102106030913960400191505060405180910390fd5b805160205b8181101561020a578083015160f81c6001820184015160601c6015830185015160358401860151605585018701600085600081146101cd57600181146101dd576101e8565b6000808585888a5af191506101e8565b6000808585895af491505b5060008114156101f757600080fd5b8260550187019650505050505050610188565b50505056fe4d756c746953656e642073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca26469706673582212205c784303626eec02b71940b551976170b500a8a36cc5adcbeb2c19751a76d05464736f6c63430007060033";
+
+    bytes internal constant SenderCreatorCode =
+        hex"6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033";
+
+    bytes internal constant EntryPointCode =
+        hex"60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000007fc98430eaedbb6070b35b39d798725049088348165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033";
+
+    bytes internal constant BeaconBlockRootsCode =
+        hex"3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500";
+
+    function getDeployedCode(address _addr, uint256 _chainID) internal pure returns (bytes memory out_) {
+        if (_addr == MultiCall3) return MultiCall3Code;
+        if (_addr == Create2Deployer) return Create2DeployerCode;
+        if (_addr == Safe_v130) return Safe_v130Code;
+        if (_addr == SafeL2_v130) return SafeL2_v130Code;
+        if (_addr == MultiSendCallOnly_v130) return MultiSendCallOnly_v130Code;
+        if (_addr == SafeSingletonFactory) return SafeSingletonFactoryCode;
+        if (_addr == DeterministicDeploymentProxy) return DeterministicDeploymentProxyCode;
+        if (_addr == MultiSend_v130) return MultiSend_v130Code;
+        if (_addr == SenderCreator) return SenderCreatorCode;
+        if (_addr == EntryPoint) return EntryPointCode;
+
+        if (_addr == Permit2) return getPermit2Code(_chainID);
+        if (_addr == BeaconBlockRoots) return BeaconBlockRootsCode;
+
+        revert("Preinstalls: unknown preinstall");
+    }
+
+    /// @notice Returns the name of the preinstall at the given address.
+    function getName(address _addr) internal pure returns (string memory out_) {
+        if (_addr == Permit2) return "Permit2";
+        if (_addr == MultiCall3) return "MultiCall3";
+        if (_addr == Create2Deployer) return "Create2Deployer";
+        if (_addr == Safe_v130) return "Safe_v130";
+        if (_addr == SafeL2_v130) return "SafeL2_v130";
+        if (_addr == MultiSendCallOnly_v130) return "MultiSendCallOnly_v130";
+        if (_addr == SafeSingletonFactory) return "SafeSingletonFactory";
+        if (_addr == DeterministicDeploymentProxy) return "DeterministicDeploymentProxy";
+        if (_addr == MultiSend_v130) return "MultiSend_v130";
+        if (_addr == SenderCreator) return "SenderCreator";
+        if (_addr == EntryPoint) return "EntryPoint";
+        if (_addr == BeaconBlockRoots) return "BeaconBlockRoots";
+        revert("Preinstalls: unnamed preinstall");
+    }
+
+    function getPermit2Code(uint256 _chainID) internal pure returns (bytes memory out_) {
+        bytes32 nameHash = keccak256(abi.encodePacked("Permit2"));
+        bytes32 typeHash =
+            keccak256(abi.encodePacked("EIP712Domain(string name,uint256 chainId,address verifyingContract)"));
+        bytes32 domainSeparator = keccak256(abi.encode(typeHash, nameHash, _chainID, Permit2));
+        out_ = Permit2TemplateCode;
+        assembly {
+            mstore(add(add(out_, 0x20), 6945), _chainID)
+            mstore(add(add(out_, 0x20), 6983), domainSeparator)
+        }
+        return out_;
+    }
+}
diff --git a/packages/contracts-bedrock/src/libraries/StaticConfig.sol b/packages/contracts-bedrock/src/libraries/StaticConfig.sol
new file mode 100644
index 000000000000..ffaa0b4e5535
--- /dev/null
+++ b/packages/contracts-bedrock/src/libraries/StaticConfig.sol
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+/// @title StaticConfig
+/// @notice Library for encoding and decoding static configuration data.
+library StaticConfig {
+    /// @notice Encodes the static configuration data for setting a gas paying token.
+    /// @param _token    Address of the gas paying token.
+    /// @param _decimals Number of decimals for the gas paying token.
+    /// @param _name     Name of the gas paying token.
+    /// @param _symbol   Symbol of the gas paying token.
+    /// @return Encoded static configuration data.
+    function encodeSetGasPayingToken(
+        address _token,
+        uint8 _decimals,
+        bytes32 _name,
+        bytes32 _symbol
+    )
+        internal
+        pure
+        returns (bytes memory)
+    {
+        return abi.encode(_token, _decimals, _name, _symbol);
+    }
+
+    /// @notice Decodes the static configuration data for setting a gas paying token.
+    /// @param _data Encoded static configuration data.
+    /// @return Decoded gas paying token data (token address, decimals, name, symbol).
+    function decodeSetGasPayingToken(bytes memory _data) internal pure returns (address, uint8, bytes32, bytes32) {
+        return abi.decode(_data, (address, uint8, bytes32, bytes32));
+    }
+
+    /// @notice Encodes the static configuration data for adding a dependency.
+    /// @param _chainId Chain ID of the dependency to add.
+    /// @return Encoded static configuration data.
+    function encodeAddDependency(uint256 _chainId) internal pure returns (bytes memory) {
+        return abi.encode(_chainId);
+    }
+
+    /// @notice Decodes the static configuration data for adding a dependency.
+    /// @param _data Encoded static configuration data.
+    /// @return Decoded chain ID of the dependency to add.
+    function decodeAddDependency(bytes memory _data) internal pure returns (uint256) {
+        return abi.decode(_data, (uint256));
+    }
+
+    /// @notice Encodes the static configuration data for removing a dependency.
+    /// @param _chainId Chain ID of the dependency to remove.
+    /// @return Encoded static configuration data.
+    function encodeRemoveDependency(uint256 _chainId) internal pure returns (bytes memory) {
+        return abi.encode(_chainId);
+    }
+
+    /// @notice Decodes the static configuration data for removing a dependency.
+    /// @param _data Encoded static configuration data.
+    /// @return Decoded chain ID of the dependency to remove.
+    function decodeRemoveDependency(bytes memory _data) internal pure returns (uint256) {
+        return abi.decode(_data, (uint256));
+    }
+}
diff --git a/packages/contracts-bedrock/src/libraries/TransientContext.sol b/packages/contracts-bedrock/src/libraries/TransientContext.sol
new file mode 100644
index 000000000000..4dfb92070d6b
--- /dev/null
+++ b/packages/contracts-bedrock/src/libraries/TransientContext.sol
@@ -0,0 +1,70 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.24;
+
+/// @title TransientContext
+/// @notice Library for transient storage.
+library TransientContext {
+    /// @notice Slot for call depth.
+    ///         Equal to bytes32(uint256(keccak256("transient.calldepth")) - 1).
+    bytes32 internal constant CALL_DEPTH_SLOT = 0x7a74fd168763fd280eaec3bcd2fd62d0e795027adc8183a693c497a7c2b10b5c;
+
+    /// @notice Gets the call depth.
+    /// @return callDepth_ Current call depth.
+    function callDepth() internal view returns (uint256 callDepth_) {
+        assembly ("memory-safe") {
+            callDepth_ := tload(CALL_DEPTH_SLOT)
+        }
+    }
+
+    /// @notice Gets value in transient storage for a slot at the current call depth.
+    /// @param _slot Slot to get.
+    /// @return value_ Transient value.
+    function get(bytes32 _slot) internal view returns (uint256 value_) {
+        assembly ("memory-safe") {
+            mstore(0, tload(CALL_DEPTH_SLOT))
+            mstore(32, _slot)
+            value_ := tload(keccak256(0, 64))
+        }
+    }
+
+    /// @notice Sets a value in transient storage for a slot at the current call depth.
+    /// @param _slot    Slot to set.
+    /// @param _value   Value to set.
+    function set(bytes32 _slot, uint256 _value) internal {
+        assembly ("memory-safe") {
+            mstore(0, tload(CALL_DEPTH_SLOT))
+            mstore(32, _slot)
+            tstore(keccak256(0, 64), _value)
+        }
+    }
+
+    /// @notice Increments call depth.
+    ///         This function can overflow. However, this is ok because there's still
+    ///         only one value stored per slot.
+    function increment() internal {
+        assembly ("memory-safe") {
+            tstore(CALL_DEPTH_SLOT, add(tload(CALL_DEPTH_SLOT), 1))
+        }
+    }
+
+    /// @notice Decrements call depth.
+    ///         This function can underflow. However, this is ok because there's still
+    ///         only one value stored per slot.
+    function decrement() internal {
+        assembly ("memory-safe") {
+            tstore(CALL_DEPTH_SLOT, sub(tload(CALL_DEPTH_SLOT), 1))
+        }
+    }
+}
+
+/// @title TransientReentrancyAware
+/// @notice Reentrancy-aware modifier for transient storage, which increments and
+///         decrements the call depth when entering and exiting a function.
+contract TransientReentrancyAware {
+    /// @notice Modifier to make a function reentrancy-aware.
+    modifier reentrantAware() {
+        TransientContext.increment();
+        _;
+        TransientContext.decrement();
+    }
+}
diff --git a/packages/contracts-bedrock/src/libraries/rlp/RLPErrors.sol b/packages/contracts-bedrock/src/libraries/rlp/RLPErrors.sol
new file mode 100644
index 000000000000..f7a9cdb091c4
--- /dev/null
+++ b/packages/contracts-bedrock/src/libraries/rlp/RLPErrors.sol
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+/// @notice The length of an RLP item must be greater than zero to be decodable
+error EmptyItem();
+
+/// @notice The decoded item type for list is not a list item
+error UnexpectedString();
+
+/// @notice The RLP item has an invalid data remainder
+error InvalidDataRemainder();
+
+/// @notice Decoded item type for bytes is not a string item
+error UnexpectedList();
+
+/// @notice The length of the content must be greater than the RLP item length
+error ContentLengthMismatch();
+
+/// @notice Invalid RLP header for RLP item
+error InvalidHeader();
diff --git a/packages/contracts-bedrock/src/libraries/rlp/RLPReader.sol b/packages/contracts-bedrock/src/libraries/rlp/RLPReader.sol
index 179c8f4c7624..9f82ca8c802e 100644
--- a/packages/contracts-bedrock/src/libraries/rlp/RLPReader.sol
+++ b/packages/contracts-bedrock/src/libraries/rlp/RLPReader.sol
@@ -1,6 +1,8 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.8;
 
+import "./RLPErrors.sol";
+
 /// @custom:attribution https://github.com/hamdiallam/Solidity-RLP
 /// @title RLPReader
 /// @notice RLPReader is a library for parsing RLP-encoded byte arrays into Solidity types. Adapted
@@ -34,7 +36,7 @@ library RLPReader {
     /// @return out_ Output memory reference.
     function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory out_) {
         // Empty arrays are not RLP items.
-        require(_in.length > 0, "RLPReader: length of an RLP item must be greater than zero to be decodable");
+        if (_in.length == 0) revert EmptyItem();
 
         MemoryPointer ptr;
         assembly {
@@ -50,9 +52,9 @@ library RLPReader {
     function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory out_) {
         (uint256 listOffset, uint256 listLength, RLPItemType itemType) = _decodeLength(_in);
 
-        require(itemType == RLPItemType.LIST_ITEM, "RLPReader: decoded item type for list is not a list item");
+        if (itemType != RLPItemType.LIST_ITEM) revert UnexpectedString();
 
-        require(listOffset + listLength == _in.length, "RLPReader: list item has an invalid data remainder");
+        if (listOffset + listLength != _in.length) revert InvalidDataRemainder();
 
         // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by
         // writing to the length. Since we can't know the number of RLP items without looping over
@@ -97,9 +99,9 @@ library RLPReader {
     function readBytes(RLPItem memory _in) internal pure returns (bytes memory out_) {
         (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);
 
-        require(itemType == RLPItemType.DATA_ITEM, "RLPReader: decoded item type for bytes is not a data item");
+        if (itemType != RLPItemType.DATA_ITEM) revert UnexpectedList();
 
-        require(_in.length == itemOffset + itemLength, "RLPReader: bytes value contains an invalid remainder");
+        if (_in.length != itemOffset + itemLength) revert InvalidDataRemainder();
 
         out_ = _copy(_in.ptr, itemOffset, itemLength);
     }
@@ -131,7 +133,7 @@ library RLPReader {
         // Short-circuit if there's nothing to decode, note that we perform this check when
         // the user creates an RLP item via toRLPItem, but it's always possible for them to bypass
         // that function and create an RLP item directly. So we need to check this anyway.
-        require(_in.length > 0, "RLPReader: length of an RLP item must be greater than zero to be decodable");
+        if (_in.length == 0) revert EmptyItem();
 
         MemoryPointer ptr = _in.ptr;
         uint256 prefix;
@@ -148,50 +150,37 @@ library RLPReader {
             // slither-disable-next-line variable-scope
             uint256 strLen = prefix - 0x80;
 
-            require(
-                _in.length > strLen, "RLPReader: length of content must be greater than string length (short string)"
-            );
+            if (_in.length <= strLen) revert ContentLengthMismatch();
 
             bytes1 firstByteOfContent;
             assembly {
                 firstByteOfContent := and(mload(add(ptr, 1)), shl(248, 0xff))
             }
 
-            require(
-                strLen != 1 || firstByteOfContent >= 0x80,
-                "RLPReader: invalid prefix, single byte < 0x80 are not prefixed (short string)"
-            );
+            if (strLen == 1 && firstByteOfContent < 0x80) revert InvalidHeader();
 
             return (1, strLen, RLPItemType.DATA_ITEM);
         } else if (prefix <= 0xbf) {
             // Long string.
             uint256 lenOfStrLen = prefix - 0xb7;
 
-            require(
-                _in.length > lenOfStrLen,
-                "RLPReader: length of content must be > than length of string length (long string)"
-            );
+            if (_in.length <= lenOfStrLen) revert ContentLengthMismatch();
 
             bytes1 firstByteOfContent;
             assembly {
                 firstByteOfContent := and(mload(add(ptr, 1)), shl(248, 0xff))
             }
 
-            require(
-                firstByteOfContent != 0x00, "RLPReader: length of content must not have any leading zeros (long string)"
-            );
+            if (firstByteOfContent == 0x00) revert InvalidHeader();
 
             uint256 strLen;
             assembly {
                 strLen := shr(sub(256, mul(8, lenOfStrLen)), mload(add(ptr, 1)))
             }
 
-            require(strLen > 55, "RLPReader: length of content must be greater than 55 bytes (long string)");
+            if (strLen <= 55) revert InvalidHeader();
 
-            require(
-                _in.length > lenOfStrLen + strLen,
-                "RLPReader: length of content must be greater than total length (long string)"
-            );
+            if (_in.length <= lenOfStrLen + strLen) revert ContentLengthMismatch();
 
             return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);
         } else if (prefix <= 0xf7) {
@@ -199,38 +188,30 @@ library RLPReader {
             // slither-disable-next-line variable-scope
             uint256 listLen = prefix - 0xc0;
 
-            require(_in.length > listLen, "RLPReader: length of content must be greater than list length (short list)");
+            if (_in.length <= listLen) revert ContentLengthMismatch();
 
             return (1, listLen, RLPItemType.LIST_ITEM);
         } else {
             // Long list.
             uint256 lenOfListLen = prefix - 0xf7;
 
-            require(
-                _in.length > lenOfListLen,
-                "RLPReader: length of content must be > than length of list length (long list)"
-            );
+            if (_in.length <= lenOfListLen) revert ContentLengthMismatch();
 
             bytes1 firstByteOfContent;
             assembly {
                 firstByteOfContent := and(mload(add(ptr, 1)), shl(248, 0xff))
             }
 
-            require(
-                firstByteOfContent != 0x00, "RLPReader: length of content must not have any leading zeros (long list)"
-            );
+            if (firstByteOfContent == 0x00) revert InvalidHeader();
 
             uint256 listLen;
             assembly {
                 listLen := shr(sub(256, mul(8, lenOfListLen)), mload(add(ptr, 1)))
             }
 
-            require(listLen > 55, "RLPReader: length of content must be greater than 55 bytes (long list)");
+            if (listLen <= 55) revert InvalidHeader();
 
-            require(
-                _in.length > lenOfListLen + listLen,
-                "RLPReader: length of content must be greater than total length (long list)"
-            );
+            if (_in.length <= lenOfListLen + listLen) revert ContentLengthMismatch();
 
             return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);
         }
diff --git a/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckSecrets.sol b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckSecrets.sol
new file mode 100644
index 000000000000..f008f62cb5d9
--- /dev/null
+++ b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckSecrets.sol
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { IDripCheck } from "../IDripCheck.sol";
+
+/// @title CheckSecrets
+/// @notice DripCheck that checks if specific secrets exist (or not). Supports having a secret that
+///         must exist for the check to pass as well as a second secret that must not exist. First
+///         secret can be revealed to begin the drip, second secret can be revealed to stop it.
+contract CheckSecrets is IDripCheck {
+    struct Params {
+        uint256 delay;
+        bytes32 secretHashMustExist;
+        bytes32 secretHashMustNotExist;
+    }
+
+    /// @notice External event used to help client-side tooling encode parameters.
+    /// @param params Parameters to encode.
+    event _EventToExposeStructInABI__Params(Params params);
+
+    /// @notice Event emitted when a secret is revealed.
+    event SecretRevealed(bytes32 indexed secretHash, bytes secret);
+
+    /// @notice Keeps track of when secrets were revealed.
+    mapping(bytes32 => uint256) public revealedSecrets;
+
+    /// @inheritdoc IDripCheck
+    function check(bytes memory _params) external view returns (bool execute_) {
+        Params memory params = abi.decode(_params, (Params));
+
+        // Check that the secrets have/have not been revealed.
+        execute_ = (
+            revealedSecrets[params.secretHashMustExist] > 0
+                && block.timestamp >= revealedSecrets[params.secretHashMustExist] + params.delay
+                && revealedSecrets[params.secretHashMustNotExist] == 0
+        );
+    }
+
+    /// @notice Reveal a secret.
+    /// @param _secret Secret to reveal.
+    function reveal(bytes memory _secret) external {
+        bytes32 secretHash = keccak256(_secret);
+        require(revealedSecrets[secretHash] == 0, "CheckSecrets: secret already revealed");
+        revealedSecrets[secretHash] = block.timestamp;
+        emit SecretRevealed(secretHash, _secret);
+    }
+}
diff --git a/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol b/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol
index e23e6869c335..9266d00ed0f0 100644
--- a/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol
+++ b/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol
@@ -2,6 +2,7 @@
 pragma solidity 0.8.15;
 
 import { IFaucetAuthModule } from "./authmodules/IFaucetAuthModule.sol";
+import { SafeCall } from "../../libraries/SafeCall.sol";
 
 /// @title  SafeSend
 /// @notice Sends ETH to a recipient account without triggering any code.
@@ -25,7 +26,9 @@ contract Faucet {
     /// @notice Parameters for a drip.
     struct DripParameters {
         address payable recipient;
+        bytes data;
         bytes32 nonce;
+        uint32 gasLimit;
     }
 
     /// @notice Parameters for authentication.
@@ -113,14 +116,17 @@ contract Faucet {
             "Faucet: drip parameters could not be verified by security module"
         );
 
+        // Verify recepient is not the faucet address.
+        require(_params.recipient != address(this), "Faucet: cannot drip to itself");
+
         // Set the next timestamp at which this auth id can be used.
         timeouts[_auth.module][_auth.id] = block.timestamp + config.ttl;
 
         // Mark the nonce as used.
         nonces[_auth.id][_params.nonce] = true;
 
-        // Execute a safe transfer of ETH to the recipient account.
-        new SafeSend{ value: config.amount }(_params.recipient);
+        // Execute transfer of ETH to the recipient account.
+        SafeCall.call(_params.recipient, _params.gasLimit, config.amount, _params.data);
 
         emit Drip(config.name, _auth.id, config.amount, _params.recipient);
     }
diff --git a/packages/contracts-bedrock/src/universal/CrossDomainMessenger.sol b/packages/contracts-bedrock/src/universal/CrossDomainMessenger.sol
index b5048d5c7bcc..66c724d3eba9 100644
--- a/packages/contracts-bedrock/src/universal/CrossDomainMessenger.sol
+++ b/packages/contracts-bedrock/src/universal/CrossDomainMessenger.sol
@@ -174,6 +174,10 @@ abstract contract CrossDomainMessenger is
     /// @param _message     Message to trigger the target address with.
     /// @param _minGasLimit Minimum gas limit that the message can be executed with.
     function sendMessage(address _target, bytes calldata _message, uint32 _minGasLimit) external payable {
+        if (isCustomGasToken()) {
+            require(msg.value == 0, "CrossDomainMessenger: cannot send value with custom gas token");
+        }
+
         // Triggers a message to the other messenger. Note that the amount of gas provided to the
         // message is the amount of gas requested by the user PLUS the base gas value. We want to
         // guarantee the property that the call to the target contract will always have at least
@@ -184,7 +188,7 @@ abstract contract CrossDomainMessenger is
             _value: msg.value,
             _data: abi.encodeWithSelector(
                 this.relayMessage.selector, messageNonce(), msg.sender, _target, msg.value, _minGasLimit, _message
-                )
+            )
         });
 
         emit SentMessage(_target, msg.sender, _message, messageNonce(), _minGasLimit);
@@ -358,6 +362,15 @@ abstract contract CrossDomainMessenger is
         + RELAY_GAS_CHECK_BUFFER;
     }
 
+    /// @notice Returns the address of the gas token and the token's decimals.
+    function gasPayingToken() internal view virtual returns (address, uint8);
+
+    /// @notice Returns whether the chain uses a custom gas token or not.
+    function isCustomGasToken() internal view returns (bool) {
+        (address token,) = gasPayingToken();
+        return token != Constants.ETHER;
+    }
+
     /// @notice Initializer.
     /// @param _otherMessenger CrossDomainMessenger contract on the other chain.
     function __CrossDomainMessenger_init(CrossDomainMessenger _otherMessenger) internal onlyInitializing {
diff --git a/packages/contracts-bedrock/src/universal/StandardBridge.sol b/packages/contracts-bedrock/src/universal/StandardBridge.sol
index 2c2c8c241b0b..140aba531e61 100644
--- a/packages/contracts-bedrock/src/universal/StandardBridge.sol
+++ b/packages/contracts-bedrock/src/universal/StandardBridge.sol
@@ -10,6 +10,7 @@ import { IOptimismMintableERC20, ILegacyMintableERC20 } from "src/universal/IOpt
 import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
 import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
 import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
+import { Constants } from "src/libraries/Constants.sol";
 
 /// @custom:upgradeable
 /// @title StandardBridge
@@ -129,6 +130,15 @@ abstract contract StandardBridge is Initializable {
     ///         Must be implemented by contracts that inherit.
     receive() external payable virtual;
 
+    /// @notice Returns the address of the custom gas token and the token's decimals.
+    function gasPayingToken() internal view virtual returns (address, uint8);
+
+    /// @notice Returns whether the chain uses a custom gas token or not.
+    function isCustomGasToken() internal view returns (bool) {
+        (address token,) = gasPayingToken();
+        return token != Constants.ETHER;
+    }
+
     /// @notice Getter for messenger contract.
     ///         Public getter is legacy and will be removed in the future. Use `messenger` instead.
     /// @return Contract of the messenger on this domain.
@@ -178,10 +188,7 @@ abstract contract StandardBridge is Initializable {
         _initiateBridgeETH(msg.sender, _to, msg.value, _minGasLimit, _extraData);
     }
 
-    /// @notice Sends ERC20 tokens to the sender's address on the other chain. Note that if the
-    ///         ERC20 token on the other chain does not recognize the local token as the correct
-    ///         pair token, the ERC20 bridge will fail and the tokens will be returned to sender on
-    ///         this chain.
+    /// @notice Sends ERC20 tokens to the sender's address on the other chain.
     /// @param _localToken  Address of the ERC20 on this chain.
     /// @param _remoteToken Address of the corresponding token on the remote chain.
     /// @param _amount      Amount of local tokens to deposit.
@@ -203,10 +210,7 @@ abstract contract StandardBridge is Initializable {
         _initiateBridgeERC20(_localToken, _remoteToken, msg.sender, msg.sender, _amount, _minGasLimit, _extraData);
     }
 
-    /// @notice Sends ERC20 tokens to a receiver's address on the other chain. Note that if the
-    ///         ERC20 token on the other chain does not recognize the local token as the correct
-    ///         pair token, the ERC20 bridge will fail and the tokens will be returned to sender on
-    ///         this chain.
+    /// @notice Sends ERC20 tokens to a receiver's address on the other chain.
     /// @param _localToken  Address of the ERC20 on this chain.
     /// @param _remoteToken Address of the corresponding token on the remote chain.
     /// @param _to          Address of the receiver.
@@ -248,6 +252,7 @@ abstract contract StandardBridge is Initializable {
         onlyOtherBridge
     {
         require(paused() == false, "StandardBridge: paused");
+        require(isCustomGasToken() == false, "StandardBridge: cannot bridge ETH with custom gas token");
         require(msg.value == _amount, "StandardBridge: amount sent does not match amount required");
         require(_to != address(this), "StandardBridge: cannot send to self");
         require(_to != address(messenger), "StandardBridge: cannot send to messenger");
@@ -316,6 +321,7 @@ abstract contract StandardBridge is Initializable {
     )
         internal
     {
+        require(isCustomGasToken() == false, "StandardBridge: cannot bridge ETH with custom gas token");
         require(msg.value == _amount, "StandardBridge: bridging ETH must include sufficient ETH value");
 
         // Emit the correct events. By default this will be _amount, but child
@@ -349,6 +355,8 @@ abstract contract StandardBridge is Initializable {
     )
         internal
     {
+        require(msg.value == 0, "StandardBridge: cannot send value");
+
         if (_isOptimismMintableERC20(_localToken)) {
             require(
                 _isCorrectTokenPair(_localToken, _remoteToken),
@@ -378,7 +386,7 @@ abstract contract StandardBridge is Initializable {
                 _to,
                 _amount,
                 _extraData
-                ),
+            ),
             _minGasLimit: _minGasLimit
         });
     }
diff --git a/packages/contracts-bedrock/src/vendor/WETH9.sol b/packages/contracts-bedrock/src/vendor/WETH9.sol
deleted file mode 100644
index 7bb4ab4dde57..000000000000
--- a/packages/contracts-bedrock/src/vendor/WETH9.sol
+++ /dev/null
@@ -1,756 +0,0 @@
-// Copyright (C) 2015, 2016, 2017 Dapphub
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with this program.  If not, see .
-
-pragma solidity >=0.4.22 <0.6;
-
-contract WETH9 {
-    string public name     = "Wrapped Ether";
-    string public symbol   = "WETH";
-    uint8  public decimals = 18;
-
-    event  Approval(address indexed src, address indexed guy, uint wad);
-    event  Transfer(address indexed src, address indexed dst, uint wad);
-    event  Deposit(address indexed dst, uint wad);
-    event  Withdrawal(address indexed src, uint wad);
-
-    mapping (address => uint)                       public  balanceOf;
-    mapping (address => mapping (address => uint))  public  allowance;
-
-    function() external payable {
-        deposit();
-    }
-    function deposit() public payable {
-        balanceOf[msg.sender] += msg.value;
-        emit Deposit(msg.sender, msg.value);
-    }
-    function withdraw(uint wad) public {
-        require(balanceOf[msg.sender] >= wad);
-        balanceOf[msg.sender] -= wad;
-        msg.sender.transfer(wad);
-        emit Withdrawal(msg.sender, wad);
-    }
-
-    function totalSupply() public view returns (uint) {
-        return address(this).balance;
-    }
-
-    function approve(address guy, uint wad) public returns (bool) {
-        allowance[msg.sender][guy] = wad;
-        emit Approval(msg.sender, guy, wad);
-        return true;
-    }
-
-    function transfer(address dst, uint wad) public returns (bool) {
-        return transferFrom(msg.sender, dst, wad);
-    }
-
-    function transferFrom(address src, address dst, uint wad)
-        public
-        returns (bool)
-    {
-        require(balanceOf[src] >= wad);
-
-        if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
-            require(allowance[src][msg.sender] >= wad);
-            allowance[src][msg.sender] -= wad;
-        }
-
-        balanceOf[src] -= wad;
-        balanceOf[dst] += wad;
-
-        emit Transfer(src, dst, wad);
-
-        return true;
-    }
-}
-
-
-/*
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. 
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
-know their rights.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    
-    Copyright (C)   
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
-      Copyright (C)   
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-.
-
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-.
-
-*/
diff --git a/packages/contracts-bedrock/test/L1/L1CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/L1/L1CrossDomainMessenger.t.sol
index 1f8054609073..3f585f795762 100644
--- a/packages/contracts-bedrock/test/L1/L1CrossDomainMessenger.t.sol
+++ b/packages/contracts-bedrock/test/L1/L1CrossDomainMessenger.t.sol
@@ -16,6 +16,7 @@ import { Constants } from "src/libraries/Constants.sol";
 import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
 import { OptimismPortal } from "src/L1/OptimismPortal.sol";
 import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
+import { SystemConfig } from "src/L1/SystemConfig.sol";
 
 contract L1CrossDomainMessenger_Test is Bridge_Initializer {
     /// @dev The receiver address
@@ -37,7 +38,7 @@ contract L1CrossDomainMessenger_Test is Bridge_Initializer {
     }
 
     /// @dev Tests that the proxy is initialized correctly.
-    function test_initialize_succeeds() external {
+    function test_initialize_succeeds() external view {
         assertEq(address(l1CrossDomainMessenger.superchainConfig()), address(superchainConfig));
         assertEq(address(l1CrossDomainMessenger.PORTAL()), address(optimismPortal));
         assertEq(address(l1CrossDomainMessenger.portal()), address(optimismPortal));
@@ -46,7 +47,7 @@ contract L1CrossDomainMessenger_Test is Bridge_Initializer {
     }
 
     /// @dev Tests that the version can be decoded from the message nonce.
-    function test_messageVersion_succeeds() external {
+    function test_messageVersion_succeeds() external view {
         (, uint16 version) = Encoding.decodeVersionedNonce(l1CrossDomainMessenger.messageNonce());
         assertEq(version, l1CrossDomainMessenger.MESSAGE_VERSION());
     }
@@ -619,6 +620,121 @@ contract L1CrossDomainMessenger_Test is Bridge_Initializer {
         assertTrue(l1CrossDomainMessenger.paused());
         assertEq(l1CrossDomainMessenger.paused(), superchainConfig.paused());
     }
+
+    /// @dev Tests that sendMessage succeeds with a custom gas token when the call value is zero.
+    function test_sendMessage_customGasToken_noValue_succeeds() external {
+        // Mock the gasPayingToken function to return a custom gas token
+        vm.mockCall(
+            address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(18))
+        );
+
+        // deposit transaction on the optimism portal should be called
+        vm.expectCall(
+            address(optimismPortal),
+            abi.encodeWithSelector(
+                OptimismPortal.depositTransaction.selector,
+                Predeploys.L2_CROSS_DOMAIN_MESSENGER,
+                0,
+                l1CrossDomainMessenger.baseGas(hex"ff", 100),
+                false,
+                Encoding.encodeCrossDomainMessage(
+                    l1CrossDomainMessenger.messageNonce(), alice, recipient, 0, 100, hex"ff"
+                )
+            )
+        );
+
+        // TransactionDeposited event
+        vm.expectEmit(address(optimismPortal));
+        emitTransactionDeposited(
+            AddressAliasHelper.applyL1ToL2Alias(address(l1CrossDomainMessenger)),
+            Predeploys.L2_CROSS_DOMAIN_MESSENGER,
+            0,
+            0,
+            l1CrossDomainMessenger.baseGas(hex"ff", 100),
+            false,
+            Encoding.encodeCrossDomainMessage(l1CrossDomainMessenger.messageNonce(), alice, recipient, 0, 100, hex"ff")
+        );
+
+        // SentMessage event
+        vm.expectEmit(address(l1CrossDomainMessenger));
+        emit SentMessage(recipient, alice, hex"ff", l1CrossDomainMessenger.messageNonce(), 100);
+
+        // SentMessageExtension1 event
+        vm.expectEmit(address(l1CrossDomainMessenger));
+        emit SentMessageExtension1(alice, 0);
+
+        vm.prank(alice);
+        l1CrossDomainMessenger.sendMessage(recipient, hex"ff", uint32(100));
+    }
+
+    /// @dev Tests that the sendMessage reverts when call value is non-zero with custom gas token.
+    function test_sendMessage_customGasToken_withValue_reverts() external {
+        // Mock the gasPayingToken function to return a custom gas token
+        vm.mockCall(
+            address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2))
+        );
+
+        vm.expectRevert("CrossDomainMessenger: cannot send value with custom gas token");
+        l1CrossDomainMessenger.sendMessage{ value: 1 }(recipient, hex"aa", uint32(500_000));
+    }
+
+    /// @dev Tests that the relayMessage succeeds with a custom gas token when the call value is zero.
+    function test_relayMessage_customGasToken_noValue_succeeds() external {
+        // Mock the gasPayingToken function to return a custom gas token
+        vm.mockCall(
+            address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2))
+        );
+
+        address target = address(0xabcd);
+        address sender = Predeploys.L2_CROSS_DOMAIN_MESSENGER;
+
+        vm.expectCall(target, hex"1111");
+
+        // set the value of op.l2Sender() to be the L2 Cross Domain Messenger.
+        vm.store(address(optimismPortal), bytes32(senderSlotIndex), bytes32(abi.encode(sender)));
+        vm.prank(address(optimismPortal));
+
+        vm.expectEmit(address(l1CrossDomainMessenger));
+
+        bytes32 hash = Hashing.hashCrossDomainMessage(
+            Encoding.encodeVersionedNonce({ _nonce: 0, _version: 1 }), sender, target, 0, 0, hex"1111"
+        );
+
+        emit RelayedMessage(hash);
+
+        l1CrossDomainMessenger.relayMessage(
+            Encoding.encodeVersionedNonce({ _nonce: 0, _version: 1 }), // nonce
+            sender,
+            target,
+            0, // value
+            0,
+            hex"1111"
+        );
+
+        // the message hash is in the successfulMessages mapping
+        assertTrue(l1CrossDomainMessenger.successfulMessages(hash));
+        // it is not in the received messages mapping
+        assertEq(l1CrossDomainMessenger.failedMessages(hash), false);
+    }
+
+    /// @dev Tests that the relayMessage reverts when call value is non-zero with custom gas token.
+    ///      The L2CrossDomainMessenger contract cannot `sendMessage` with value when using a custom gas token.
+    function test_relayMessage_customGasToken_withValue_reverts() external virtual {
+        // Mock the gasPayingToken function to return a custom gas token
+        vm.mockCall(
+            address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2))
+        );
+        vm.expectRevert("CrossDomainMessenger: value must be zero unless message is from a system address");
+
+        l1CrossDomainMessenger.relayMessage{ value: 1 }(
+            Encoding.encodeVersionedNonce({ _nonce: 0, _version: 1 }),
+            address(0xabcd),
+            address(0xabcd),
+            1, // value
+            0,
+            hex"1111"
+        );
+    }
 }
 
 /// @dev A regression test against a reentrancy vulnerability in the CrossDomainMessenger contract, which
@@ -653,7 +769,9 @@ contract L1CrossDomainMessenger_ReinitReentryTest is Bridge_Initializer {
             vm.store(address(l1CrossDomainMessenger), 0, bytes32(uint256(0)));
 
             // call the initializer function
-            l1CrossDomainMessenger.initialize(SuperchainConfig(superchainConfig), OptimismPortal(optimismPortal));
+            l1CrossDomainMessenger.initialize(
+                SuperchainConfig(superchainConfig), OptimismPortal(optimismPortal), SystemConfig(systemConfig)
+            );
 
             // attempt to re-replay the withdrawal
             vm.expectEmit(address(l1CrossDomainMessenger));
diff --git a/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol b/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol
index 5d2444525bf7..3c8abcb4843d 100644
--- a/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol
+++ b/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol
@@ -76,7 +76,7 @@ contract L1ERC721Bridge_Test is Bridge_Initializer {
     }
 
     /// @dev Tests that the proxy is initialized with the correct values.
-    function test_initialize_succeeds() public {
+    function test_initialize_succeeds() public view {
         assertEq(address(l1ERC721Bridge.MESSENGER()), address(l1CrossDomainMessenger));
         assertEq(address(l1ERC721Bridge.messenger()), address(l1CrossDomainMessenger));
         assertEq(address(l1ERC721Bridge.OTHER_BRIDGE()), Predeploys.L2_ERC721_BRIDGE);
@@ -96,7 +96,7 @@ contract L1ERC721Bridge_Test is Bridge_Initializer {
                     abi.encodeCall(
                         L2ERC721Bridge.finalizeBridgeERC721,
                         (address(remoteToken), address(localToken), alice, alice, tokenId, hex"5678")
-                        ),
+                    ),
                     1234
                 )
             )
@@ -177,7 +177,7 @@ contract L1ERC721Bridge_Test is Bridge_Initializer {
                     abi.encodeCall(
                         L2ERC721Bridge.finalizeBridgeERC721,
                         (address(remoteToken), address(localToken), alice, bob, tokenId, hex"5678")
-                        ),
+                    ),
                     1234
                 )
             )
@@ -316,7 +316,7 @@ contract L1ERC721Bridge_Test is Bridge_Initializer {
 contract L1ERC721Bridge_Pause_Test is Bridge_Initializer {
     /// @dev Verifies that the `paused` accessor returns the same value as the `paused` function of the
     ///      `superchainConfig`.
-    function test_paused_succeeds() external {
+    function test_paused_succeeds() external view {
         assertEq(l1ERC721Bridge.paused(), superchainConfig.paused());
     }
 
diff --git a/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol b/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol
index 0d0b7dc8c308..d01fb1c26048 100644
--- a/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol
+++ b/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol
@@ -8,6 +8,7 @@ import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
 
 // Libraries
 import { Predeploys } from "src/libraries/Predeploys.sol";
+import { Constants } from "src/libraries/Constants.sol";
 
 // Target contract dependencies
 import { StandardBridge } from "src/universal/StandardBridge.sol";
@@ -27,6 +28,8 @@ contract L1StandardBridge_Getter_Test is Bridge_Initializer {
         assert(l1StandardBridge.OTHER_BRIDGE() == l2StandardBridge);
         assert(l1StandardBridge.messenger() == l1CrossDomainMessenger);
         assert(l1StandardBridge.MESSENGER() == l1CrossDomainMessenger);
+        assert(l1StandardBridge.superchainConfig() == superchainConfig);
+        assert(l1StandardBridge.systemConfig() == systemConfig);
     }
 }
 
@@ -42,23 +45,25 @@ contract L1StandardBridge_Initialize_Test is Bridge_Initializer {
         assertEq(address(impl.OTHER_BRIDGE()), Predeploys.L2_STANDARD_BRIDGE);
         assertEq(address(impl.otherBridge()), Predeploys.L2_STANDARD_BRIDGE);
         assertEq(address(l2StandardBridge), Predeploys.L2_STANDARD_BRIDGE);
+        assertEq(address(impl.systemConfig()), address(0));
     }
 
     /// @dev Test that the initialize function sets the correct values.
-    function test_initialize_succeeds() external {
+    function test_initialize_succeeds() external view {
         assertEq(address(l1StandardBridge.superchainConfig()), address(superchainConfig));
         assertEq(address(l1StandardBridge.MESSENGER()), address(l1CrossDomainMessenger));
         assertEq(address(l1StandardBridge.messenger()), address(l1CrossDomainMessenger));
         assertEq(address(l1StandardBridge.OTHER_BRIDGE()), Predeploys.L2_STANDARD_BRIDGE);
         assertEq(address(l1StandardBridge.otherBridge()), Predeploys.L2_STANDARD_BRIDGE);
         assertEq(address(l2StandardBridge), Predeploys.L2_STANDARD_BRIDGE);
+        assertEq(address(l1StandardBridge.systemConfig()), address(systemConfig));
     }
 }
 
 contract L1StandardBridge_Pause_Test is Bridge_Initializer {
     /// @dev Verifies that the `paused` accessor returns the same value as the `paused` function of the
     ///      `superchainConfig`.
-    function test_paused_succeeds() external {
+    function test_paused_succeeds() external view {
         assertEq(l1StandardBridge.paused(), superchainConfig.paused());
     }
 
@@ -185,36 +190,51 @@ contract L1StandardBridge_Receive_Test is Bridge_Initializer {
     }
 }
 
-contract L1StandardBridge_Receive_TestFail { }
+contract L1StandardBridge_Receive_TestFail is Bridge_Initializer {
+    /// @dev Tests receive function reverts with custom gas token.
+    function testFuzz_receive_customGasToken_reverts(uint256 _value) external {
+        vm.prank(alice, alice);
+        vm.mockCall(
+            address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(18))
+        );
+        vm.deal(alice, _value);
+        (bool success, bytes memory data) = address(l1StandardBridge).call{ value: _value }(hex"");
+        assertFalse(success);
+        assembly {
+            data := add(data, 0x04)
+        }
+        assertEq(abi.decode(data, (string)), "StandardBridge: cannot bridge ETH with custom gas token");
+    }
+}
 
 contract PreBridgeETH is Bridge_Initializer {
     /// @dev Asserts the expected calls and events for bridging ETH depending
     ///      on whether the bridge call is legacy or not.
-    function _preBridgeETH(bool isLegacy) internal {
+    function _preBridgeETH(bool isLegacy, uint256 value) internal {
         assertEq(address(optimismPortal).balance, 0);
         uint256 nonce = l1CrossDomainMessenger.messageNonce();
         uint256 version = 0; // Internal constant in the OptimismPortal: DEPOSIT_VERSION
         address l1MessengerAliased = AddressAliasHelper.applyL1ToL2Alias(address(l1CrossDomainMessenger));
 
         bytes memory message =
-            abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, alice, 500, hex"dead");
+            abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, alice, value, hex"dead");
 
         if (isLegacy) {
             vm.expectCall(
                 address(l1StandardBridge),
-                500,
+                value,
                 abi.encodeWithSelector(l1StandardBridge.depositETH.selector, 50000, hex"dead")
             );
         } else {
             vm.expectCall(
                 address(l1StandardBridge),
-                500,
+                value,
                 abi.encodeWithSelector(l1StandardBridge.bridgeETH.selector, 50000, hex"dead")
             );
         }
         vm.expectCall(
             address(l1CrossDomainMessenger),
-            500,
+            value,
             abi.encodeWithSelector(CrossDomainMessenger.sendMessage.selector, address(l2StandardBridge), message, 50000)
         );
 
@@ -223,7 +243,7 @@ contract PreBridgeETH is Bridge_Initializer {
             nonce,
             address(l1StandardBridge),
             address(l2StandardBridge),
-            500,
+            value,
             50000,
             message
         );
@@ -231,24 +251,24 @@ contract PreBridgeETH is Bridge_Initializer {
         uint64 baseGas = l1CrossDomainMessenger.baseGas(message, 50000);
         vm.expectCall(
             address(optimismPortal),
-            500,
+            value,
             abi.encodeWithSelector(
                 OptimismPortal.depositTransaction.selector,
                 address(l2CrossDomainMessenger),
-                500,
+                value,
                 baseGas,
                 false,
                 innerMessage
             )
         );
 
-        bytes memory opaqueData = abi.encodePacked(uint256(500), uint256(500), baseGas, false, innerMessage);
+        bytes memory opaqueData = abi.encodePacked(uint256(value), uint256(value), baseGas, false, innerMessage);
 
         vm.expectEmit(address(l1StandardBridge));
-        emit ETHDepositInitiated(alice, alice, 500, hex"dead");
+        emit ETHDepositInitiated(alice, alice, value, hex"dead");
 
         vm.expectEmit(address(l1StandardBridge));
-        emit ETHBridgeInitiated(alice, alice, 500, hex"dead");
+        emit ETHBridgeInitiated(alice, alice, value, hex"dead");
 
         // OptimismPortal emits a TransactionDeposited event on `depositTransaction` call
         vm.expectEmit(address(optimismPortal));
@@ -260,7 +280,7 @@ contract PreBridgeETH is Bridge_Initializer {
 
         // SentMessageExtension1 event emitted by the CrossDomainMessenger
         vm.expectEmit(address(l1CrossDomainMessenger));
-        emit SentMessageExtension1(address(l1StandardBridge), 500);
+        emit SentMessageExtension1(address(l1StandardBridge), value);
 
         vm.prank(alice, alice);
     }
@@ -273,12 +293,32 @@ contract L1StandardBridge_DepositETH_Test is PreBridgeETH {
     ///      Only EOA can call depositETH.
     ///      ETH ends up in the optimismPortal.
     function test_depositETH_succeeds() external {
-        _preBridgeETH({ isLegacy: true });
+        _preBridgeETH({ isLegacy: true, value: 500 });
         l1StandardBridge.depositETH{ value: 500 }(50000, hex"dead");
         assertEq(address(optimismPortal).balance, 500);
     }
 }
 
+contract L1StandardBridge_DepositETH_TestFail is Bridge_Initializer {
+    /// @dev Tests that depositing ETH reverts if the call is not from an EOA.
+    function test_depositETH_notEoa_reverts() external {
+        vm.etch(alice, address(L1Token).code);
+        vm.expectRevert("StandardBridge: function can only be called from an EOA");
+        vm.prank(alice);
+        l1StandardBridge.depositETH{ value: 1 }(300, hex"");
+    }
+
+    /// @dev Tests that depositing reverts with custom gas token.
+    function test_depositETH_customGasToken_reverts() external {
+        vm.mockCall(
+            address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2))
+        );
+        vm.prank(alice, alice);
+        vm.expectRevert("StandardBridge: cannot bridge ETH with custom gas token");
+        l1StandardBridge.depositETH(50000, hex"dead");
+    }
+}
+
 contract L1StandardBridge_BridgeETH_Test is PreBridgeETH {
     /// @dev Tests that bridging ETH succeeds.
     ///      Emits ETHDepositInitiated and ETHBridgeInitiated events.
@@ -286,26 +326,29 @@ contract L1StandardBridge_BridgeETH_Test is PreBridgeETH {
     ///      Only EOA can call bridgeETH.
     ///      ETH ends up in the optimismPortal.
     function test_bridgeETH_succeeds() external {
-        _preBridgeETH({ isLegacy: false });
+        _preBridgeETH({ isLegacy: false, value: 500 });
         l1StandardBridge.bridgeETH{ value: 500 }(50000, hex"dead");
         assertEq(address(optimismPortal).balance, 500);
     }
 }
 
-contract L1StandardBridge_DepositETH_TestFail is Bridge_Initializer {
-    /// @dev Tests that depositing ETH reverts if the call is not from an EOA.
-    function test_depositETH_notEoa_reverts() external {
-        vm.etch(alice, address(L1Token).code);
-        vm.expectRevert("StandardBridge: function can only be called from an EOA");
-        vm.prank(alice);
-        l1StandardBridge.depositETH{ value: 1 }(300, hex"");
+contract L1StandardBridge_BridgeETH_TestFail is PreBridgeETH {
+    /// @dev Tests that bridging eth reverts with custom gas token.
+    function test_bridgeETH_customGasToken_reverts() external {
+        vm.prank(alice, alice);
+        vm.mockCall(
+            address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2))
+        );
+        vm.expectRevert("StandardBridge: cannot bridge ETH with custom gas token");
+
+        l1StandardBridge.bridgeETH(50000, hex"dead");
     }
 }
 
 contract PreBridgeETHTo is Bridge_Initializer {
     /// @dev Asserts the expected calls and events for bridging ETH to a different
     ///      address depending on whether the bridge call is legacy or not.
-    function _preBridgeETHTo(bool isLegacy) internal {
+    function _preBridgeETHTo(bool isLegacy, uint256 value) internal {
         assertEq(address(optimismPortal).balance, 0);
         uint256 nonce = l1CrossDomainMessenger.messageNonce();
         uint256 version = 0; // Internal constant in the OptimismPortal: DEPOSIT_VERSION
@@ -314,19 +357,19 @@ contract PreBridgeETHTo is Bridge_Initializer {
         if (isLegacy) {
             vm.expectCall(
                 address(l1StandardBridge),
-                600,
+                value,
                 abi.encodeWithSelector(l1StandardBridge.depositETHTo.selector, bob, 60000, hex"dead")
             );
         } else {
             vm.expectCall(
                 address(l1StandardBridge),
-                600,
+                value,
                 abi.encodeWithSelector(l1StandardBridge.bridgeETHTo.selector, bob, 60000, hex"dead")
             );
         }
 
         bytes memory message =
-            abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, bob, 600, hex"dead");
+            abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, bob, value, hex"dead");
 
         // the L1 bridge should call
         // L1CrossDomainMessenger.sendMessage
@@ -340,7 +383,7 @@ contract PreBridgeETHTo is Bridge_Initializer {
             nonce,
             address(l1StandardBridge),
             address(l2StandardBridge),
-            600,
+            value,
             60000,
             message
         );
@@ -351,20 +394,20 @@ contract PreBridgeETHTo is Bridge_Initializer {
             abi.encodeWithSelector(
                 OptimismPortal.depositTransaction.selector,
                 address(l2CrossDomainMessenger),
-                600,
+                value,
                 baseGas,
                 false,
                 innerMessage
             )
         );
 
-        bytes memory opaqueData = abi.encodePacked(uint256(600), uint256(600), baseGas, false, innerMessage);
+        bytes memory opaqueData = abi.encodePacked(uint256(value), uint256(value), baseGas, false, innerMessage);
 
         vm.expectEmit(address(l1StandardBridge));
-        emit ETHDepositInitiated(alice, bob, 600, hex"dead");
+        emit ETHDepositInitiated(alice, bob, value, hex"dead");
 
         vm.expectEmit(address(l1StandardBridge));
-        emit ETHBridgeInitiated(alice, bob, 600, hex"dead");
+        emit ETHBridgeInitiated(alice, bob, value, hex"dead");
 
         // OptimismPortal emits a TransactionDeposited event on `depositTransaction` call
         vm.expectEmit(address(optimismPortal));
@@ -376,7 +419,7 @@ contract PreBridgeETHTo is Bridge_Initializer {
 
         // SentMessageExtension1 event emitted by the CrossDomainMessenger
         vm.expectEmit(address(l1CrossDomainMessenger));
-        emit SentMessageExtension1(address(l1StandardBridge), 600);
+        emit SentMessageExtension1(address(l1StandardBridge), value);
 
         // deposit eth to bob
         vm.prank(alice, alice);
@@ -390,12 +433,32 @@ contract L1StandardBridge_DepositETHTo_Test is PreBridgeETHTo {
     ///      EOA or contract can call depositETHTo.
     ///      ETH ends up in the optimismPortal.
     function test_depositETHTo_succeeds() external {
-        _preBridgeETHTo({ isLegacy: true });
+        _preBridgeETHTo({ isLegacy: true, value: 600 });
         l1StandardBridge.depositETHTo{ value: 600 }(bob, 60000, hex"dead");
         assertEq(address(optimismPortal).balance, 600);
     }
 }
 
+contract L1StandardBridge_DepositETHTo_TestFail is Bridge_Initializer {
+    /// @dev Tests that depositETHTo reverts with custom gas token.
+    function testFuzz_depositETHTo_customGasToken_reverts(
+        uint256 _value,
+        address _to,
+        uint32 _minGasLimit,
+        bytes calldata _extraData
+    )
+        external
+    {
+        vm.mockCall(
+            address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2))
+        );
+        vm.deal(address(this), _value);
+        vm.expectRevert("StandardBridge: cannot bridge ETH with custom gas token");
+
+        l1StandardBridge.depositETHTo{ value: _value }(_to, _minGasLimit, _extraData);
+    }
+}
+
 contract L1StandardBridge_BridgeETHTo_Test is PreBridgeETHTo {
     /// @dev Tests that bridging ETH to a different address succeeds.
     ///      Emits ETHDepositInitiated and ETHBridgeInitiated events.
@@ -403,13 +466,30 @@ contract L1StandardBridge_BridgeETHTo_Test is PreBridgeETHTo {
     ///      Only EOA can call bridgeETHTo.
     ///      ETH ends up in the optimismPortal.
     function test_bridgeETHTo_succeeds() external {
-        _preBridgeETHTo({ isLegacy: false });
+        _preBridgeETHTo({ isLegacy: false, value: 600 });
         l1StandardBridge.bridgeETHTo{ value: 600 }(bob, 60000, hex"dead");
         assertEq(address(optimismPortal).balance, 600);
     }
 }
 
-contract L1StandardBridge_DepositETHTo_TestFail is Bridge_Initializer { }
+contract L1StandardBridge_BridgeETHTo_TestFail is PreBridgeETHTo {
+    /// @dev Tests that bridging reverts with custom gas token.
+    function testFuzz_bridgeETHTo_customGasToken_reverts(
+        uint256 _value,
+        uint32 _minGasLimit,
+        bytes calldata _extraData
+    )
+        external
+    {
+        vm.mockCall(
+            address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2))
+        );
+        vm.deal(address(this), _value);
+        vm.expectRevert("StandardBridge: cannot bridge ETH with custom gas token");
+
+        l1StandardBridge.bridgeETHTo{ value: _value }(bob, _minGasLimit, _extraData);
+    }
+}
 
 contract L1StandardBridge_DepositERC20_Test is Bridge_Initializer {
     using stdStorage for StdStorage;
@@ -627,7 +707,29 @@ contract L1StandardBridge_FinalizeETHWithdrawal_Test is Bridge_Initializer {
     }
 }
 
-contract L1StandardBridge_FinalizeETHWithdrawal_TestFail is Bridge_Initializer { }
+contract L1StandardBridge_FinalizeETHWithdrawal_TestFail is Bridge_Initializer {
+    /// @dev Tests that finalizeETHWithdrawal reverts with custom gas token.
+    function testFuzz_finalizeETHWithdrawal_customGasToken_reverts(
+        uint256 _value,
+        bytes calldata _extraData
+    )
+        external
+    {
+        vm.mockCall(
+            address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2))
+        );
+        vm.mockCall(
+            address(l1StandardBridge.messenger()),
+            abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector),
+            abi.encode(address(l1StandardBridge.OTHER_BRIDGE()))
+        );
+        vm.deal(address(l1StandardBridge.messenger()), _value);
+        vm.prank(address(l1StandardBridge.messenger()));
+        vm.expectRevert("StandardBridge: cannot bridge ETH with custom gas token");
+
+        l1StandardBridge.finalizeETHWithdrawal{ value: _value }(alice, alice, _value, _extraData);
+    }
+}
 
 contract L1StandardBridge_FinalizeERC20Withdrawal_Test is Bridge_Initializer {
     using stdStorage for StdStorage;
@@ -714,6 +816,23 @@ contract L1StandardBridge_FinalizeBridgeETH_Test is Bridge_Initializer {
 }
 
 contract L1StandardBridge_FinalizeBridgeETH_TestFail is Bridge_Initializer {
+    /// @dev Tests that finalizing bridged reverts with custom gas token.
+    function testFuzz_finalizeBridgeETH_customGasToken_reverts(uint256 _value, bytes calldata _extraData) external {
+        vm.mockCall(
+            address(l1StandardBridge.messenger()),
+            abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector),
+            abi.encode(address(l1StandardBridge.OTHER_BRIDGE()))
+        );
+        vm.deal(address(l1CrossDomainMessenger), _value);
+        vm.prank(address(l1CrossDomainMessenger));
+        vm.mockCall(
+            address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2))
+        );
+        vm.expectRevert("StandardBridge: cannot bridge ETH with custom gas token");
+
+        l1StandardBridge.finalizeBridgeETH{ value: _value }(alice, alice, _value, _extraData);
+    }
+
     /// @dev Tests that finalizing bridged ETH reverts if the amount is incorrect.
     function test_finalizeBridgeETH_incorrectValue_reverts() external {
         address messenger = address(l1StandardBridge.messenger());
diff --git a/packages/contracts-bedrock/test/L1/L2OutputOracle.t.sol b/packages/contracts-bedrock/test/L1/L2OutputOracle.t.sol
index 7f712e8ff8f7..3d89809e9b30 100644
--- a/packages/contracts-bedrock/test/L1/L2OutputOracle.t.sol
+++ b/packages/contracts-bedrock/test/L1/L2OutputOracle.t.sol
@@ -168,7 +168,7 @@ contract L2OutputOracle_getter_Test is CommonTest {
     }
 
     /// @dev Tests that `nextBlockNumber` returns the correct value.
-    function test_nextBlockNumber_succeeds() external {
+    function test_nextBlockNumber_succeeds() external view {
         assertEq(
             l2OutputOracle.nextBlockNumber(),
             // The return value should match this arithmetic
diff --git a/packages/contracts-bedrock/test/L1/OptimismPortal.t.sol b/packages/contracts-bedrock/test/L1/OptimismPortal.t.sol
index 58679b313ee9..474c052a4016 100644
--- a/packages/contracts-bedrock/test/L1/OptimismPortal.t.sol
+++ b/packages/contracts-bedrock/test/L1/OptimismPortal.t.sol
@@ -3,6 +3,7 @@ pragma solidity 0.8.15;
 
 // Testing utilities
 import { stdError } from "forge-std/Test.sol";
+import { VmSafe } from "forge-std/Vm.sol";
 
 import { CommonTest } from "test/setup/CommonTest.sol";
 import { NextImpl } from "test/mocks/NextImpl.sol";
@@ -20,7 +21,13 @@ import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
 import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
 import { SystemConfig } from "src/L1/SystemConfig.sol";
 import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
+import { L1Block } from "src/L2/L1Block.sol";
+import { Predeploys } from "src/libraries/Predeploys.sol";
 import { OptimismPortal } from "src/L1/OptimismPortal.sol";
+import { GasPayingToken } from "src/libraries/GasPayingToken.sol";
+import { MockERC20 } from "solmate/test/utils/mocks/MockERC20.sol";
+import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
+import "src/libraries/PortalErrors.sol";
 
 contract OptimismPortal_Test is CommonTest {
     address depositor;
@@ -37,9 +44,7 @@ contract OptimismPortal_Test is CommonTest {
     ///         test/kontrol/deployment/DeploymentSummary.t.sol
     function test_constructor_succeeds() external virtual {
         OptimismPortal opImpl = OptimismPortal(payable(deploy.mustGetAddress("OptimismPortal")));
-        assertEq(address(opImpl.L2_ORACLE()), address(0));
         assertEq(address(opImpl.l2Oracle()), address(0));
-        assertEq(address(opImpl.SYSTEM_CONFIG()), address(0));
         assertEq(address(opImpl.systemConfig()), address(0));
         assertEq(address(opImpl.superchainConfig()), address(0));
         assertEq(opImpl.l2Sender(), Constants.DEFAULT_L2_SENDER);
@@ -54,11 +59,8 @@ contract OptimismPortal_Test is CommonTest {
     ///         test/kontrol/deployment/DeploymentSummary.t.sol
     function test_initialize_succeeds() external virtual {
         address guardian = deploy.cfg().superchainConfigGuardian();
-        assertEq(address(optimismPortal.L2_ORACLE()), address(l2OutputOracle));
         assertEq(address(optimismPortal.l2Oracle()), address(l2OutputOracle));
-        assertEq(address(optimismPortal.SYSTEM_CONFIG()), address(systemConfig));
         assertEq(address(optimismPortal.systemConfig()), address(systemConfig));
-        assertEq(optimismPortal.GUARDIAN(), guardian);
         assertEq(optimismPortal.guardian(), guardian);
         assertEq(address(optimismPortal.superchainConfig()), address(superchainConfig));
         assertEq(optimismPortal.l2Sender(), Constants.DEFAULT_L2_SENDER);
@@ -72,7 +74,7 @@ contract OptimismPortal_Test is CommonTest {
     /// @dev Tests that `pause` successfully pauses
     ///      when called by the GUARDIAN.
     function test_pause_succeeds() external {
-        address guardian = optimismPortal.GUARDIAN();
+        address guardian = optimismPortal.guardian();
 
         assertEq(optimismPortal.paused(), false);
 
@@ -89,7 +91,7 @@ contract OptimismPortal_Test is CommonTest {
     function test_pause_onlyGuardian_reverts() external {
         assertEq(optimismPortal.paused(), false);
 
-        assertTrue(optimismPortal.GUARDIAN() != alice);
+        assertTrue(optimismPortal.guardian() != alice);
         vm.expectRevert("SuperchainConfig: only guardian can pause");
         vm.prank(alice);
         superchainConfig.pause("identifier");
@@ -100,7 +102,7 @@ contract OptimismPortal_Test is CommonTest {
     /// @dev Tests that `unpause` successfully unpauses
     ///      when called by the GUARDIAN.
     function test_unpause_succeeds() external {
-        address guardian = optimismPortal.GUARDIAN();
+        address guardian = optimismPortal.guardian();
 
         vm.prank(guardian);
         superchainConfig.pause("identifier");
@@ -116,13 +118,13 @@ contract OptimismPortal_Test is CommonTest {
 
     /// @dev Tests that `unpause` reverts when called by a non-GUARDIAN.
     function test_unpause_onlyGuardian_reverts() external {
-        address guardian = optimismPortal.GUARDIAN();
+        address guardian = optimismPortal.guardian();
 
         vm.prank(guardian);
         superchainConfig.pause("identifier");
         assertEq(optimismPortal.paused(), true);
 
-        assertTrue(optimismPortal.GUARDIAN() != alice);
+        assertTrue(optimismPortal.guardian() != alice);
         vm.expectRevert("SuperchainConfig: only guardian can unpause");
         vm.prank(alice);
         superchainConfig.unpause();
@@ -152,11 +154,107 @@ contract OptimismPortal_Test is CommonTest {
         assertEq(address(optimismPortal).balance, _value);
     }
 
+    /// @notice Helper function for depositing a transaction.
+    function depositTransaction(
+        address _from,
+        address _to,
+        uint256 _mint,
+        uint256 _value,
+        uint64 _gasLimit,
+        bool _isCreation,
+        bytes memory _data
+    )
+        internal
+    {
+        if (_isCreation) {
+            _to = address(0);
+        }
+        vm.assume(_data.length <= 120_000);
+        ResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig();
+        _gasLimit =
+            uint64(bound(_gasLimit, optimismPortal.minimumGasLimit(uint64(_data.length)), rcfg.maxResourceLimit));
+
+        uint256 prevBalance = address(optimismPortal).balance;
+
+        // Ensure that no custom gas token is set
+        (address gasPayingToken,) = systemConfig.gasPayingToken();
+        assertEq(gasPayingToken, Constants.ETHER);
+
+        bytes memory opaqueData = abi.encodePacked(_mint, _value, _gasLimit, _isCreation, _data);
+
+        vm.expectEmit(address(optimismPortal));
+        emit TransactionDeposited(
+            _from, // from
+            _to,
+            uint256(0), // DEPOSIT_VERSION
+            opaqueData
+        );
+
+        vm.deal(address(this), _mint);
+
+        // Deposit the token into the portal
+        optimismPortal.depositTransaction{ value: _mint }(_to, _value, _gasLimit, _isCreation, _data);
+
+        // Assert final balance equals the deposited amount
+        assertEq(address(optimismPortal).balance, _mint + prevBalance);
+        assertEq(optimismPortal.balance(), _mint + prevBalance);
+    }
+
+    /// @dev Tests that `depositTransaction` succeeds when msg.sender == tx.origin and non-custom gas is used.
+    function testFuzz_depositTransaction_senderIsOrigin_succeeds(
+        address _to,
+        uint256 _mint,
+        uint256 _value,
+        uint64 _gasLimit,
+        bool _isCreation,
+        bytes memory _data
+    )
+        external
+    {
+        // Ensure that msg.sender == tx.origin
+        vm.startPrank(address(this), address(this));
+
+        depositTransaction({
+            _from: address(this),
+            _to: _to,
+            _mint: _mint,
+            _value: _value,
+            _gasLimit: _gasLimit,
+            _isCreation: _isCreation,
+            _data: _data
+        });
+    }
+
+    /// @dev Tests that `depositTransaction` succeeds when msg.sender != tx.origin and non-custom gas is used.
+    function testFuzz_depositTransaction_senderNotOrigin_succeeds(
+        address _to,
+        uint256 _mint,
+        uint256 _value,
+        uint64 _gasLimit,
+        bool _isCreation,
+        bytes memory _data
+    )
+        external
+    {
+        // Ensure that msg.sender != tx.origin
+        vm.startPrank(address(this), address(1));
+
+        depositTransaction({
+            _from: AddressAliasHelper.applyL1ToL2Alias(address(this)),
+            _to: _to,
+            _mint: _mint,
+            _value: _value,
+            _gasLimit: _gasLimit,
+            _isCreation: _isCreation,
+            _data: _data
+        });
+    }
+
     /// @dev Tests that `depositTransaction` reverts when the destination address is non-zero
     ///      for a contract creation deposit.
     function test_depositTransaction_contractCreation_reverts() external {
         // contract creation must have a target of address(0)
-        vm.expectRevert("OptimismPortal: must send to address(0) when creating a contract");
+        vm.expectRevert(BadTarget.selector);
         optimismPortal.depositTransaction(address(1), 1, 0, true, hex"");
     }
 
@@ -164,8 +262,9 @@ contract OptimismPortal_Test is CommonTest {
     ///      This places an upper bound on unsafe blocks sent over p2p.
     function test_depositTransaction_largeData_reverts() external {
         uint256 size = 120_001;
+
         uint64 gasLimit = optimismPortal.minimumGasLimit(uint64(size));
-        vm.expectRevert("OptimismPortal: data too large");
+        vm.expectRevert(LargeCalldata.selector);
         optimismPortal.depositTransaction({
             _to: address(0),
             _value: 0,
@@ -177,7 +276,7 @@ contract OptimismPortal_Test is CommonTest {
 
     /// @dev Tests that `depositTransaction` reverts when the gas limit is too small.
     function test_depositTransaction_smallGasLimit_reverts() external {
-        vm.expectRevert("OptimismPortal: gas limit too small");
+        vm.expectRevert(SmallGasLimit.selector);
         optimismPortal.depositTransaction({ _to: address(1), _value: 0, _gasLimit: 0, _isCreation: false, _data: hex"" });
     }
 
@@ -187,7 +286,7 @@ contract OptimismPortal_Test is CommonTest {
         uint64 gasLimit = optimismPortal.minimumGasLimit(uint64(_data.length));
         if (_shouldFail) {
             gasLimit = uint64(bound(gasLimit, 0, gasLimit - 1));
-            vm.expectRevert("OptimismPortal: gas limit too small");
+            vm.expectRevert(SmallGasLimit.selector);
         }
 
         optimismPortal.depositTransaction({
@@ -202,7 +301,7 @@ contract OptimismPortal_Test is CommonTest {
     /// @dev Tests that `minimumGasLimit` succeeds for small calldata sizes.
     ///      The gas limit should be 21k for 0 calldata and increase linearly
     ///      for larger calldata sizes.
-    function test_minimumGasLimit_succeeds() external {
+    function test_minimumGasLimit_succeeds() external view {
         assertEq(optimismPortal.minimumGasLimit(0), 21_000);
         assertTrue(optimismPortal.minimumGasLimit(2) > optimismPortal.minimumGasLimit(1));
         assertTrue(optimismPortal.minimumGasLimit(3) > optimismPortal.minimumGasLimit(2));
@@ -344,6 +443,127 @@ contract OptimismPortal_Test is CommonTest {
         vm.expectRevert(stdError.indexOOBError);
         assertEq(optimismPortal.isOutputFinalized(nextOutputIndex + 1), false);
     }
+
+    /// @dev Tests that the gas paying token can be set.
+    function testFuzz_setGasPayingToken_succeeds(
+        address _token,
+        uint8 _decimals,
+        bytes32 _name,
+        bytes32 _symbol
+    )
+        external
+    {
+        vm.expectEmit(address(optimismPortal));
+        emit TransactionDeposited(
+            0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001,
+            Predeploys.L1_BLOCK_ATTRIBUTES,
+            0,
+            abi.encodePacked(
+                uint256(0), // mint
+                uint256(0), // value
+                uint64(200_000), // gasLimit
+                false, // isCreation,
+                abi.encodeCall(L1Block.setGasPayingToken, (_token, _decimals, _name, _symbol))
+            )
+        );
+
+        vm.prank(address(systemConfig));
+        optimismPortal.setGasPayingToken({ _token: _token, _decimals: _decimals, _name: _name, _symbol: _symbol });
+    }
+
+    /// @notice Ensures that the deposit event is correct for the `setGasPayingToken`
+    ///         code path that manually emits a deposit transaction outside of the
+    ///         `depositTransaction` function. This is a simple differential test.
+    function test_setGasPayingToken_correctEvent_succeeds(
+        address _token,
+        string memory _name,
+        string memory _symbol
+    )
+        external
+    {
+        vm.assume(bytes(_name).length <= 32);
+        vm.assume(bytes(_symbol).length <= 32);
+
+        bytes32 name = GasPayingToken.sanitize(_name);
+        bytes32 symbol = GasPayingToken.sanitize(_symbol);
+
+        vm.recordLogs();
+
+        vm.prank(address(systemConfig));
+        optimismPortal.setGasPayingToken({ _token: _token, _decimals: 18, _name: name, _symbol: symbol });
+
+        vm.prank(Constants.DEPOSITOR_ACCOUNT, Constants.DEPOSITOR_ACCOUNT);
+        optimismPortal.depositTransaction({
+            _to: Predeploys.L1_BLOCK_ATTRIBUTES,
+            _value: 0,
+            _gasLimit: 200_000,
+            _isCreation: false,
+            _data: abi.encodeCall(L1Block.setGasPayingToken, (_token, 18, name, symbol))
+        });
+
+        VmSafe.Log[] memory logs = vm.getRecordedLogs();
+        assertEq(logs.length, 2);
+
+        VmSafe.Log memory systemPath = logs[0];
+        VmSafe.Log memory userPath = logs[1];
+
+        assertEq(systemPath.topics.length, 4);
+        assertEq(systemPath.topics.length, userPath.topics.length);
+        assertEq(systemPath.topics[0], userPath.topics[0]);
+        assertEq(systemPath.topics[1], userPath.topics[1]);
+        assertEq(systemPath.topics[2], userPath.topics[2]);
+        assertEq(systemPath.topics[3], userPath.topics[3]);
+        assertEq(systemPath.data, userPath.data);
+    }
+
+    /// @dev Tests that the gas paying token cannot be set by a non-system config.
+    function test_setGasPayingToken_notSystemConfig_fails(address _caller) external {
+        vm.assume(_caller != address(systemConfig));
+        vm.prank(_caller);
+        vm.expectRevert(Unauthorized.selector);
+        optimismPortal.setGasPayingToken({ _token: address(0), _decimals: 0, _name: "", _symbol: "" });
+    }
+
+    /// @dev Tests that `depositERC20Transaction` reverts when the gas paying token is ether.
+    function test_depositERC20Transaction_noCustomGasToken_reverts() external {
+        // Check that the gas paying token is set to ether
+        (address token,) = systemConfig.gasPayingToken();
+        assertEq(token, Constants.ETHER);
+
+        vm.expectRevert(OnlyCustomGasToken.selector);
+        optimismPortal.depositERC20Transaction(address(0), 0, 0, 0, false, "");
+    }
+
+    function test_depositERC20Transaction_balanceOverflow_reverts() external {
+        vm.mockCall(address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(42), 18));
+
+        // The balance slot
+        vm.store(address(optimismPortal), bytes32(uint256(61)), bytes32(type(uint256).max));
+        assertEq(optimismPortal.balance(), type(uint256).max);
+
+        vm.expectRevert(stdError.arithmeticError);
+        optimismPortal.depositERC20Transaction({
+            _to: address(0),
+            _mint: 1,
+            _value: 1,
+            _gasLimit: 10_000,
+            _isCreation: false,
+            _data: ""
+        });
+    }
+
+    /// @dev Tests that `balance()` returns the correct balance when the gas paying token is ether.
+    function testFuzz_balance_ether_succeeds(uint256 _amount) external {
+        // Check that the gas paying token is set to ether
+        (address token,) = systemConfig.gasPayingToken();
+        assertEq(token, Constants.ETHER);
+
+        // Increase the balance of the gas paying token
+        vm.deal(address(optimismPortal), _amount);
+
+        // Check that the balance has been correctly updated
+        assertEq(optimismPortal.balance(), address(optimismPortal).balance);
+    }
 }
 
 contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest {
@@ -368,8 +588,8 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest {
             target: bob,
             value: 100,
             gasLimit: 100_000,
-            data: hex""
-        });
+            data: hex"aa" // includes calldata for ERC20 withdrawal test
+         });
         // Get withdrawal proof data we can use for testing.
         (_stateRoot, _storageRoot, _outputRoot, _withdrawalHash, _withdrawalProof) =
             ffi.getProveWithdrawalTransactionInputs(_defaultTx);
@@ -386,7 +606,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest {
     }
 
     /// @dev Setup the system for a ready-to-use state.
-    function setUp() public override {
+    function setUp() public virtual override {
         // Configure the oracle to return the output root we've prepared.
         vm.warp(l2OutputOracle.computeL2Timestamp(_proposedBlockNumber) + 1);
         vm.prank(l2OutputOracle.PROPOSER());
@@ -403,7 +623,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest {
 
     /// @dev Asserts that the reentrant call will revert.
     function callPortalAndExpectRevert() external payable {
-        vm.expectRevert("OptimismPortal: can only trigger one withdrawal per transaction");
+        vm.expectRevert(NonReentrant.selector);
         // Arguments here don't matter, as the require check is the first thing that happens.
         // We assume that this has already been proven.
         optimismPortal.finalizeWithdrawalTransaction(_defaultTx);
@@ -413,10 +633,10 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest {
 
     /// @dev Tests that `proveWithdrawalTransaction` reverts when paused.
     function test_proveWithdrawalTransaction_paused_reverts() external {
-        vm.prank(optimismPortal.GUARDIAN());
+        vm.prank(optimismPortal.guardian());
         superchainConfig.pause("identifier");
 
-        vm.expectRevert("OptimismPortal: paused");
+        vm.expectRevert(CallPaused.selector);
         optimismPortal.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _l2OutputIndex: _proposedOutputIndex,
@@ -428,7 +648,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest {
     /// @dev Tests that `proveWithdrawalTransaction` reverts when the target is the portal contract.
     function test_proveWithdrawalTransaction_onSelfCall_reverts() external {
         _defaultTx.target = address(optimismPortal);
-        vm.expectRevert("OptimismPortal: you cannot send messages to the portal contract");
+        vm.expectRevert(BadTarget.selector);
         optimismPortal.proveWithdrawalTransaction(_defaultTx, _proposedOutputIndex, _outputRootProof, _withdrawalProof);
     }
 
@@ -548,7 +768,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest {
     }
 
     /// @dev Tests that `finalizeWithdrawalTransaction` succeeds.
-    function test_finalizeWithdrawalTransaction_provenWithdrawalHash_succeeds() external {
+    function test_finalizeWithdrawalTransaction_provenWithdrawalHash_ether_succeeds() external {
         uint256 bobBalanceBefore = address(bob).balance;
 
         vm.expectEmit(true, true, true, true);
@@ -560,15 +780,31 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest {
         emit WithdrawalFinalized(_withdrawalHash, true);
         optimismPortal.finalizeWithdrawalTransaction(_defaultTx);
 
-        assert(address(bob).balance == bobBalanceBefore + 100);
+        assertEq(address(bob).balance, bobBalanceBefore + 100);
+    }
+
+    /// @dev Tests that `finalizeWithdrawalTransaction` succeeds.
+    function test_finalizeWithdrawalTransaction_provenWithdrawalHash_nonEther_targetToken_reverts() external {
+        vm.mockCall(
+            address(systemConfig),
+            abi.encodeWithSignature("gasPayingToken()"),
+            abi.encode(address(_defaultTx.target), 18)
+        );
+
+        optimismPortal.proveWithdrawalTransaction(_defaultTx, _proposedOutputIndex, _outputRootProof, _withdrawalProof);
+
+        vm.warp(block.timestamp + l2OutputOracle.FINALIZATION_PERIOD_SECONDS() + 1);
+
+        vm.expectRevert(BadTarget.selector);
+        optimismPortal.finalizeWithdrawalTransaction(_defaultTx);
     }
 
     /// @dev Tests that `finalizeWithdrawalTransaction` reverts if the contract is paused.
     function test_finalizeWithdrawalTransaction_paused_reverts() external {
-        vm.prank(optimismPortal.GUARDIAN());
+        vm.prank(optimismPortal.guardian());
         superchainConfig.pause("identifier");
 
-        vm.expectRevert("OptimismPortal: paused");
+        vm.expectRevert(CallPaused.selector);
         optimismPortal.finalizeWithdrawalTransaction(_defaultTx);
     }
 
@@ -918,7 +1154,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest {
 
 contract OptimismPortalUpgradeable_Test is CommonTest {
     /// @dev Tests that the proxy is initialized correctly.
-    function test_params_initValuesOnProxy_succeeds() external {
+    function test_params_initValuesOnProxy_succeeds() external view {
         (uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum) = optimismPortal.params();
         ResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig();
 
@@ -1027,3 +1263,324 @@ contract OptimismPortalResourceFuzz_Test is CommonTest {
         });
     }
 }
+
+contract OptimismPortalWithMockERC20_Test is OptimismPortal_FinalizeWithdrawal_Test {
+    MockERC20 token;
+
+    function setUp() public override {
+        super.setUp();
+        token = new MockERC20("Test", "TST", 18);
+    }
+
+    function depositERC20Transaction(
+        address _from,
+        address _to,
+        uint256 _mint,
+        uint256 _value,
+        uint64 _gasLimit,
+        bool _isCreation,
+        bytes memory _data
+    )
+        internal
+    {
+        if (_isCreation) {
+            _to = address(0);
+        }
+        vm.assume(_data.length <= 120_000);
+        ResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig();
+        _gasLimit =
+            uint64(bound(_gasLimit, optimismPortal.minimumGasLimit(uint64(_data.length)), rcfg.maxResourceLimit));
+
+        // Mint the token to the contract and approve the token for the portal
+        token.mint(address(this), _mint);
+        token.approve(address(optimismPortal), _mint);
+
+        // Mock the gas paying token to be the ERC20 token
+        vm.mockCall(address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(token), 18));
+
+        bytes memory opaqueData = abi.encodePacked(_mint, _value, _gasLimit, _isCreation, _data);
+
+        vm.expectEmit(address(optimismPortal));
+        emit TransactionDeposited(
+            _from, // from
+            _to,
+            uint256(0), // DEPOSIT_VERSION
+            opaqueData
+        );
+
+        // Deposit the token into the portal
+        optimismPortal.depositERC20Transaction(_to, _mint, _value, _gasLimit, _isCreation, _data);
+
+        // Assert final balance equals the deposited amount
+        assertEq(token.balanceOf(address(optimismPortal)), _mint);
+        assertEq(optimismPortal.balance(), _mint);
+    }
+
+    /// @dev Tests that `depositERC20Transaction` succeeds when msg.sender == tx.origin.
+    function testFuzz_depositERC20Transaction_senderIsOrigin_succeeds(
+        address _to,
+        uint256 _mint,
+        uint256 _value,
+        uint64 _gasLimit,
+        bool _isCreation,
+        bytes memory _data
+    )
+        external
+    {
+        // Ensure that msg.sender == tx.origin
+        vm.startPrank(address(this), address(this));
+
+        depositERC20Transaction({
+            _from: address(this),
+            _to: _to,
+            _mint: _mint,
+            _value: _value,
+            _gasLimit: _gasLimit,
+            _isCreation: _isCreation,
+            _data: _data
+        });
+    }
+
+    /// @dev Tests that `depositERC20Transaction` succeeds when msg.sender != tx.origin.
+    function testFuzz_depositERC20Transaction_senderNotOrigin_succeeds(
+        address _to,
+        uint256 _mint,
+        uint256 _value,
+        uint64 _gasLimit,
+        bool _isCreation,
+        bytes memory _data
+    )
+        external
+    {
+        // Ensure that msg.sender != tx.origin
+        vm.startPrank(address(this), address(1));
+
+        depositERC20Transaction({
+            _from: AddressAliasHelper.applyL1ToL2Alias(address(this)),
+            _to: _to,
+            _mint: _mint,
+            _value: _value,
+            _gasLimit: _gasLimit,
+            _isCreation: _isCreation,
+            _data: _data
+        });
+    }
+
+    /// @dev Tests that `depositERC20Transaction` reverts when not enough of the token is approved.
+    function test_depositERC20Transaction_notEnoughAmount_reverts() external {
+        // Mock the gas paying token to be the ERC20 token
+        vm.mockCall(address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(token), 18));
+        vm.expectRevert(stdError.arithmeticError);
+        // Deposit the token into the portal
+        optimismPortal.depositERC20Transaction(address(0), 1, 0, 0, false, "");
+    }
+
+    /// @dev Tests that `depositERC20Transaction` reverts when token balance does not update correctly after transfer.
+    function test_depositERC20Transaction_incorrectTokenBalance_reverts() external {
+        // Mint the token to the contract and approve the token for the portal
+        token.mint(address(this), 100);
+        token.approve(address(optimismPortal), 100);
+
+        // Mock the gas paying token to be the ERC20 token
+        vm.mockCall(address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(token), 18));
+
+        // Mock the token balance
+        vm.mockCall(
+            address(token), abi.encodeWithSelector(token.balanceOf.selector, address(optimismPortal)), abi.encode(0)
+        );
+
+        // Call minimumGasLimit(0) before vm.expectRevert to ensure vm.expectRevert is for depositERC20Transaction
+        uint64 gasLimit = optimismPortal.minimumGasLimit(0);
+
+        vm.expectRevert(TransferFailed.selector);
+
+        // Deposit the token into the portal
+        optimismPortal.depositERC20Transaction(address(1), 100, 0, gasLimit, false, "");
+    }
+
+    /// @dev Tests that `depositERC20Transaction` reverts when creating a contract with a non-zero target.
+    function test_depositERC20Transaction_isCreationNotZeroTarget_reverts() external {
+        // Mock the gas paying token to be the ERC20 token
+        vm.mockCall(address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(token), 18));
+
+        // Call minimumGasLimit(0) before vm.expectRevert to ensure vm.expectRevert is for depositERC20Transaction
+        uint64 gasLimit = optimismPortal.minimumGasLimit(0);
+
+        vm.expectRevert(BadTarget.selector);
+        // Deposit the token into the portal
+        optimismPortal.depositERC20Transaction(address(1), 0, 0, gasLimit, true, "");
+    }
+
+    /// @dev Tests that `depositERC20Transaction` reverts when the gas limit is too low.
+    function test_depositERC20Transaction_gasLimitTooLow_reverts() external {
+        // Mock the gas paying token to be the ERC20 token
+        vm.mockCall(address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(token), 18));
+
+        vm.expectRevert(SmallGasLimit.selector);
+        // Deposit the token into the portal
+        optimismPortal.depositERC20Transaction(address(0), 0, 0, 0, false, "");
+    }
+
+    /// @dev Tests that `depositERC20Transaction` reverts when the data is too large.
+    function test_depositERC20Transaction_dataTooLarge_reverts() external {
+        bytes memory data = new bytes(120_001);
+        data[120_000] = 0x01;
+
+        // Mock the gas paying token to be the ERC20 token
+        vm.mockCall(address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(token), 18));
+
+        uint64 gasLimit = optimismPortal.minimumGasLimit(120_001);
+        vm.expectRevert(LargeCalldata.selector);
+        // Deposit the token into the portal
+        optimismPortal.depositERC20Transaction(address(0), 0, 0, gasLimit, false, data);
+    }
+
+    /// @dev Tests that `balance()` returns the correct balance when the gas paying token is not ether.
+    function testFuzz_balance_nonEther_succeeds(uint256 _amount) external {
+        // Mint the token to the contract and approve the token for the portal
+        token.mint(address(this), _amount);
+        token.approve(address(optimismPortal), _amount);
+
+        // Mock the gas paying token to be the ERC20 token
+        vm.mockCall(address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(token), 18));
+
+        // Deposit the token into the portal
+        optimismPortal.depositERC20Transaction(address(0), _amount, 0, optimismPortal.minimumGasLimit(0), false, "");
+
+        // Check that the balance has been correctly updated
+        assertEq(optimismPortal.balance(), _amount);
+    }
+
+    /// @dev Tests that `finalizeWithdrawalTransaction` succeeds.
+    function test_finalizeWithdrawalTransaction_provenWithdrawalHash_nonEther_succeeds() external {
+        // Mint the token to the contract and approve the token for the portal
+        token.mint(address(this), _defaultTx.value);
+        token.approve(address(optimismPortal), _defaultTx.value);
+
+        // Mock the gas paying token to be the ERC20 token
+        vm.mockCall(address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(token), 18));
+
+        // Deposit the token into the portal
+        optimismPortal.depositERC20Transaction(
+            address(bob), _defaultTx.value, 0, optimismPortal.minimumGasLimit(0), false, ""
+        );
+
+        assertEq(optimismPortal.balance(), _defaultTx.value);
+
+        vm.expectEmit(address(optimismPortal));
+        emit WithdrawalProven(_withdrawalHash, alice, bob);
+        optimismPortal.proveWithdrawalTransaction(_defaultTx, _proposedOutputIndex, _outputRootProof, _withdrawalProof);
+
+        vm.warp(block.timestamp + l2OutputOracle.FINALIZATION_PERIOD_SECONDS() + 1);
+        vm.expectEmit(address(optimismPortal));
+        emit WithdrawalFinalized(_withdrawalHash, true);
+
+        vm.expectCall(_defaultTx.target, 0, _defaultTx.data);
+
+        vm.expectCall(
+            address(token), 0, abi.encodeWithSelector(token.transfer.selector, _defaultTx.target, _defaultTx.value)
+        );
+
+        optimismPortal.finalizeWithdrawalTransaction(_defaultTx);
+
+        assertEq(optimismPortal.balance(), 0);
+        assertEq(token.balanceOf(address(bob)), 100);
+    }
+
+    /// @dev Helper for depositing a transaction.
+    function depositTransaction(
+        address _from,
+        address _to,
+        uint256 _value,
+        uint64 _gasLimit,
+        bool _isCreation,
+        bytes memory _data
+    )
+        internal
+    {
+        if (_isCreation) {
+            _to = address(0);
+        }
+        vm.assume(_data.length <= 120_000);
+        ResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig();
+        _gasLimit =
+            uint64(bound(_gasLimit, optimismPortal.minimumGasLimit(uint64(_data.length)), rcfg.maxResourceLimit));
+
+        // Mock the gas paying token to be the ERC20 token
+        vm.mockCall(address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(token), 18));
+
+        bytes memory opaqueData = abi.encodePacked(uint256(0), _value, _gasLimit, _isCreation, _data);
+
+        vm.expectEmit(address(optimismPortal));
+        emit TransactionDeposited(
+            _from, // from
+            _to,
+            uint256(0), // DEPOSIT_VERSION
+            opaqueData
+        );
+
+        // Deposit the token into the portal
+        optimismPortal.depositTransaction(_to, _value, _gasLimit, _isCreation, _data);
+
+        // Assert final balance equals the deposited amount
+        assertEq(token.balanceOf(address(optimismPortal)), 0);
+        assertEq(optimismPortal.balance(), 0);
+    }
+
+    /// @dev Tests that `depositTransaction` succeeds when a custom gas token is used but the msg.value is zero.
+    function testFuzz_depositTransaction_customGasToken_noValue_senderIsOrigin_succeeds(
+        address _to,
+        uint256 _value,
+        uint64 _gasLimit,
+        bool _isCreation,
+        bytes memory _data
+    )
+        external
+    {
+        // Ensure that msg.sender == tx.origin
+        vm.startPrank(address(this), address(this));
+
+        depositTransaction({
+            _from: address(this),
+            _to: _to,
+            _value: _value,
+            _gasLimit: _gasLimit,
+            _isCreation: _isCreation,
+            _data: _data
+        });
+    }
+
+    /// @dev Tests that `depositTransaction` succeeds when a custom gas token is used but the msg.value is zero.
+    function testFuzz_depositTransaction_customGasToken_noValue_senderNotOrigin_succeeds(
+        address _to,
+        uint256 _value,
+        uint64 _gasLimit,
+        bool _isCreation,
+        bytes memory _data
+    )
+        external
+    {
+        // Ensure that msg.sender != tx.origin
+        vm.startPrank(address(this), address(1));
+
+        depositTransaction({
+            _from: AddressAliasHelper.applyL1ToL2Alias(address(this)),
+            _to: _to,
+            _value: _value,
+            _gasLimit: _gasLimit,
+            _isCreation: _isCreation,
+            _data: _data
+        });
+    }
+
+    /// @dev Tests that `depositTransaction` fails when a custom gas token is used and msg.value is non-zero.
+    function test_depositTransaction_customGasToken_withValue_reverts() external {
+        // Mock the gas paying token to be the ERC20 token
+        vm.mockCall(address(systemConfig), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(token), 18));
+
+        vm.expectRevert(NoValue.selector);
+
+        // Deposit the token into the portal
+        optimismPortal.depositTransaction{ value: 100 }(address(0), 0, 0, false, "");
+    }
+}
diff --git a/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol b/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol
index a15dd0d4a694..257d2799b441 100644
--- a/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol
+++ b/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol
@@ -22,12 +22,13 @@ import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
 import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol";
 
 import { FaultDisputeGame, IDisputeGame } from "src/dispute/FaultDisputeGame.sol";
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
+import "src/libraries/PortalErrors.sol";
 
 contract OptimismPortal2_Test is CommonTest {
     address depositor;
 
-    function setUp() public override {
+    function setUp() public virtual override {
         super.enableFaultProofs();
         super.setUp();
 
@@ -40,7 +41,6 @@ contract OptimismPortal2_Test is CommonTest {
     function test_constructor_succeeds() external virtual {
         OptimismPortal2 opImpl = OptimismPortal2(payable(deploy.mustGetAddress("OptimismPortal2")));
         assertEq(address(opImpl.disputeGameFactory()), address(0));
-        assertEq(address(opImpl.SYSTEM_CONFIG()), address(0));
         assertEq(address(opImpl.systemConfig()), address(0));
         assertEq(address(opImpl.superchainConfig()), address(0));
         assertEq(opImpl.l2Sender(), Constants.DEFAULT_L2_SENDER);
@@ -53,9 +53,7 @@ contract OptimismPortal2_Test is CommonTest {
     function test_initialize_succeeds() external virtual {
         address guardian = deploy.cfg().superchainConfigGuardian();
         assertEq(address(optimismPortal2.disputeGameFactory()), address(disputeGameFactory));
-        assertEq(address(optimismPortal2.SYSTEM_CONFIG()), address(systemConfig));
         assertEq(address(optimismPortal2.systemConfig()), address(systemConfig));
-        assertEq(optimismPortal2.GUARDIAN(), guardian);
         assertEq(optimismPortal2.guardian(), guardian);
         assertEq(address(optimismPortal2.superchainConfig()), address(superchainConfig));
         assertEq(optimismPortal2.l2Sender(), Constants.DEFAULT_L2_SENDER);
@@ -66,7 +64,7 @@ contract OptimismPortal2_Test is CommonTest {
     /// @dev Tests that `pause` successfully pauses
     ///      when called by the GUARDIAN.
     function test_pause_succeeds() external {
-        address guardian = optimismPortal2.GUARDIAN();
+        address guardian = optimismPortal2.guardian();
 
         assertEq(optimismPortal2.paused(), false);
 
@@ -83,7 +81,7 @@ contract OptimismPortal2_Test is CommonTest {
     function test_pause_onlyGuardian_reverts() external {
         assertEq(optimismPortal2.paused(), false);
 
-        assertTrue(optimismPortal2.GUARDIAN() != alice);
+        assertTrue(optimismPortal2.guardian() != alice);
         vm.expectRevert("SuperchainConfig: only guardian can pause");
         vm.prank(alice);
         superchainConfig.pause("identifier");
@@ -94,7 +92,7 @@ contract OptimismPortal2_Test is CommonTest {
     /// @dev Tests that `unpause` successfully unpauses
     ///      when called by the GUARDIAN.
     function test_unpause_succeeds() external {
-        address guardian = optimismPortal2.GUARDIAN();
+        address guardian = optimismPortal2.guardian();
 
         vm.prank(guardian);
         superchainConfig.pause("identifier");
@@ -110,13 +108,13 @@ contract OptimismPortal2_Test is CommonTest {
 
     /// @dev Tests that `unpause` reverts when called by a non-GUARDIAN.
     function test_unpause_onlyGuardian_reverts() external {
-        address guardian = optimismPortal2.GUARDIAN();
+        address guardian = optimismPortal2.guardian();
 
         vm.prank(guardian);
         superchainConfig.pause("identifier");
         assertEq(optimismPortal2.paused(), true);
 
-        assertTrue(optimismPortal2.GUARDIAN() != alice);
+        assertTrue(optimismPortal2.guardian() != alice);
         vm.expectRevert("SuperchainConfig: only guardian can unpause");
         vm.prank(alice);
         superchainConfig.unpause();
@@ -150,7 +148,7 @@ contract OptimismPortal2_Test is CommonTest {
     ///      for a contract creation deposit.
     function test_depositTransaction_contractCreation_reverts() external {
         // contract creation must have a target of address(0)
-        vm.expectRevert("OptimismPortal: must send to address(0) when creating a contract");
+        vm.expectRevert(BadTarget.selector);
         optimismPortal2.depositTransaction(address(1), 1, 0, true, hex"");
     }
 
@@ -159,7 +157,7 @@ contract OptimismPortal2_Test is CommonTest {
     function test_depositTransaction_largeData_reverts() external {
         uint256 size = 120_001;
         uint64 gasLimit = optimismPortal2.minimumGasLimit(uint64(size));
-        vm.expectRevert("OptimismPortal: data too large");
+        vm.expectRevert(LargeCalldata.selector);
         optimismPortal2.depositTransaction({
             _to: address(0),
             _value: 0,
@@ -171,7 +169,7 @@ contract OptimismPortal2_Test is CommonTest {
 
     /// @dev Tests that `depositTransaction` reverts when the gas limit is too small.
     function test_depositTransaction_smallGasLimit_reverts() external {
-        vm.expectRevert("OptimismPortal: gas limit too small");
+        vm.expectRevert(SmallGasLimit.selector);
         optimismPortal2.depositTransaction({ _to: address(1), _value: 0, _gasLimit: 0, _isCreation: false, _data: hex"" });
     }
 
@@ -181,7 +179,7 @@ contract OptimismPortal2_Test is CommonTest {
         uint64 gasLimit = optimismPortal2.minimumGasLimit(uint64(_data.length));
         if (_shouldFail) {
             gasLimit = uint64(bound(gasLimit, 0, gasLimit - 1));
-            vm.expectRevert("OptimismPortal: gas limit too small");
+            vm.expectRevert(SmallGasLimit.selector);
         }
 
         optimismPortal2.depositTransaction({
@@ -196,7 +194,7 @@ contract OptimismPortal2_Test is CommonTest {
     /// @dev Tests that `minimumGasLimit` succeeds for small calldata sizes.
     ///      The gas limit should be 21k for 0 calldata and increase linearly
     ///      for larger calldata sizes.
-    function test_minimumGasLimit_succeeds() external {
+    function test_minimumGasLimit_succeeds() external view {
         assertEq(optimismPortal2.minimumGasLimit(0), 21_000);
         assertTrue(optimismPortal2.minimumGasLimit(2) > optimismPortal2.minimumGasLimit(1));
         assertTrue(optimismPortal2.minimumGasLimit(3) > optimismPortal2.minimumGasLimit(2));
@@ -345,7 +343,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         _proposedGameIndex = disputeGameFactory.gameCount() - 1;
 
         // Warp beyond the chess clocks and finalize the game.
-        vm.warp(block.timestamp + game.gameDuration().raw() / 2 + 1 seconds);
+        vm.warp(block.timestamp + game.maxClockDuration().raw() + 1 seconds);
 
         // Fund the portal so that we can withdraw ETH.
         vm.deal(address(optimismPortal2), 0xFFFFFFFF);
@@ -365,16 +363,19 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
     function testFuzz_blacklist_onlyGuardian_reverts(address _act) external {
         vm.assume(_act != address(optimismPortal2.guardian()));
 
-        vm.expectRevert("OptimismPortal: only the guardian can blacklist dispute games");
+        vm.expectRevert(Unauthorized.selector);
         optimismPortal2.blacklistDisputeGame(IDisputeGame(address(0xdead)));
     }
 
     /// @dev Tests that the guardian role can blacklist any dispute game.
-    function testFuzz_blacklist_guardian_succeeds(address _addr) external {
+    function testFuzz_blacklist_guardian_succeeds(IDisputeGame _addr) external {
+        vm.expectEmit(address(optimismPortal2));
+        emit DisputeGameBlacklisted(_addr);
+
         vm.prank(optimismPortal2.guardian());
-        optimismPortal2.blacklistDisputeGame(IDisputeGame(_addr));
+        optimismPortal2.blacklistDisputeGame(_addr);
 
-        assertTrue(optimismPortal2.disputeGameBlacklist(IDisputeGame(_addr)));
+        assertTrue(optimismPortal2.disputeGameBlacklist(_addr));
     }
 
     /// @dev Tests that `setRespectedGameType` reverts when called by a non-guardian.
@@ -382,12 +383,14 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         vm.assume(_act != address(optimismPortal2.guardian()));
 
         vm.prank(_act);
-        vm.expectRevert("OptimismPortal: only the guardian can set the respected game type");
+        vm.expectRevert(Unauthorized.selector);
         optimismPortal2.setRespectedGameType(_ty);
     }
 
     /// @dev Tests that the guardian role can set the respected game type to anything they want.
     function testFuzz_setRespectedGameType_guardian_succeeds(GameType _ty) external {
+        vm.expectEmit(address(optimismPortal2));
+        emit RespectedGameTypeSet(_ty, Timestamp.wrap(uint64(block.timestamp)));
         vm.prank(optimismPortal2.guardian());
         optimismPortal2.setRespectedGameType(_ty);
 
@@ -396,10 +399,10 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
 
     /// @dev Tests that `proveWithdrawalTransaction` reverts when paused.
     function test_proveWithdrawalTransaction_paused_reverts() external {
-        vm.prank(optimismPortal2.GUARDIAN());
+        vm.prank(optimismPortal2.guardian());
         superchainConfig.pause("identifier");
 
-        vm.expectRevert("OptimismPortal: paused");
+        vm.expectRevert(CallPaused.selector);
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -446,11 +449,13 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         });
     }
 
-    /// @dev Tests that `proveWithdrawalTransaction` reverts when the withdrawal has already
-    ///      been proven.
-    function test_proveWithdrawalTransaction_replayProve_reverts() external {
+    /// @dev Tests that `proveWithdrawalTransaction` reverts when the withdrawal has already been proven, and the new
+    ///      game has the `CHALLENGER_WINS` status.
+    function test_proveWithdrawalTransaction_replayProve_differentGameChallengerWins_reverts() external {
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -458,7 +463,15 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
             _withdrawalProof: _withdrawalProof
         });
 
-        vm.expectRevert("OptimismPortal: withdrawal hash has already been proven, and dispute game is not invalid");
+        // Create a new dispute game, and mock both games to be CHALLENGER_WINS.
+        IDisputeGame game2 = disputeGameFactory.create(
+            optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber + 1)
+        );
+        _proposedGameIndex = disputeGameFactory.gameCount() - 1;
+        vm.mockCall(address(game), abi.encodeCall(game.status, ()), abi.encode(GameStatus.CHALLENGER_WINS));
+        vm.mockCall(address(game2), abi.encodeCall(game.status, ()), abi.encode(GameStatus.CHALLENGER_WINS));
+
+        vm.expectRevert("OptimismPortal: cannot prove against invalid dispute games");
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -490,6 +503,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
     function test_proveWithdrawalTransaction_replayProveBlacklisted_suceeds() external {
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -501,8 +516,18 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         vm.prank(optimismPortal2.guardian());
         optimismPortal2.blacklistDisputeGame(IDisputeGame(address(game)));
 
+        // Mock the status of the dispute game we just proved against to be CHALLENGER_WINS.
+        vm.mockCall(address(game), abi.encodeCall(game.status, ()), abi.encode(GameStatus.CHALLENGER_WINS));
+        // Create a new game to re-prove against
+        disputeGameFactory.create(
+            optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber + 1)
+        );
+        _proposedGameIndex = disputeGameFactory.gameCount() - 1;
+
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -516,6 +541,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
     function test_proveWithdrawalTransaction_replayProveBadProposal_suceeds() external {
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -523,10 +550,18 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
             _withdrawalProof: _withdrawalProof
         });
 
+        // Mock the status of the dispute game we just proved against to be CHALLENGER_WINS.
         vm.mockCall(address(game), abi.encodeCall(game.status, ()), abi.encode(GameStatus.CHALLENGER_WINS));
+        // Create a new game to re-prove against
+        disputeGameFactory.create(
+            optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber + 1)
+        );
+        _proposedGameIndex = disputeGameFactory.gameCount() - 1;
 
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -541,6 +576,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         // Prove the withdrawal against a game with the current respected game type.
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -564,6 +601,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         // Re-proving should be successful against the new game.
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex + 1,
@@ -576,6 +615,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
     function test_proveWithdrawalTransaction_validWithdrawalProof_succeeds() external {
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -584,12 +625,59 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         });
     }
 
+    /// @dev Tests that `finalizeWithdrawalTransaction` reverts when attempting to replay using a secondary proof
+    ///      submitter.
+    function test_finalizeWithdrawalTransaction_secondProofReplay_reverts() external {
+        uint256 bobBalanceBefore = address(bob).balance;
+
+        // Submit the first proof for the withdrawal hash.
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
+        optimismPortal2.proveWithdrawalTransaction({
+            _tx: _defaultTx,
+            _disputeGameIndex: _proposedGameIndex,
+            _outputRootProof: _outputRootProof,
+            _withdrawalProof: _withdrawalProof
+        });
+
+        // Submit a second proof for the same withdrawal hash.
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(0xb0b));
+        vm.prank(address(0xb0b));
+        optimismPortal2.proveWithdrawalTransaction({
+            _tx: _defaultTx,
+            _disputeGameIndex: _proposedGameIndex,
+            _outputRootProof: _outputRootProof,
+            _withdrawalProof: _withdrawalProof
+        });
+
+        // Warp and resolve the dispute game.
+        game.resolveClaim(0, 0);
+        game.resolve();
+        vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1 seconds);
+
+        vm.expectEmit(true, true, false, true);
+        emit WithdrawalFinalized(_withdrawalHash, true);
+        optimismPortal2.finalizeWithdrawalTransactionExternalProof(_defaultTx, address(0xb0b));
+
+        vm.expectRevert("OptimismPortal: withdrawal has already been finalized");
+        optimismPortal2.finalizeWithdrawalTransactionExternalProof(_defaultTx, address(this));
+
+        assert(address(bob).balance == bobBalanceBefore + 100);
+    }
+
     /// @dev Tests that `finalizeWithdrawalTransaction` succeeds.
     function test_finalizeWithdrawalTransaction_provenWithdrawalHash_succeeds() external {
         uint256 bobBalanceBefore = address(bob).balance;
 
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -598,7 +686,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         });
 
         // Warp and resolve the dispute game.
-        game.resolveClaim(0);
+        game.resolveClaim(0, 0);
         game.resolve();
         vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1 seconds);
 
@@ -609,12 +697,73 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         assert(address(bob).balance == bobBalanceBefore + 100);
     }
 
+    /// @dev Tests that `finalizeWithdrawalTransaction` succeeds using a different proof than an earlier one by another
+    ///      party.
+    function test_finalizeWithdrawalTransaction_secondaryProof_succeeds() external {
+        uint256 bobBalanceBefore = address(bob).balance;
+
+        // Create a secondary dispute game.
+        IDisputeGame secondGame = disputeGameFactory.create(
+            optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber + 1)
+        );
+
+        // Warp 1 second into the future so that the proof is submitted after the timestamp of game creation.
+        vm.warp(block.timestamp + 1 seconds);
+
+        // Prove the withdrawal transaction against the invalid dispute game, as 0xb0b.
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(0xb0b));
+        vm.prank(address(0xb0b));
+        optimismPortal2.proveWithdrawalTransaction({
+            _tx: _defaultTx,
+            _disputeGameIndex: _proposedGameIndex + 1,
+            _outputRootProof: _outputRootProof,
+            _withdrawalProof: _withdrawalProof
+        });
+
+        // Mock the status of the dispute game 0xb0b proves against to be CHALLENGER_WINS.
+        vm.mockCall(address(secondGame), abi.encodeCall(game.status, ()), abi.encode(GameStatus.CHALLENGER_WINS));
+
+        // Prove the withdrawal transaction against the invalid dispute game, as the test contract, against the original
+        // game.
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
+        optimismPortal2.proveWithdrawalTransaction({
+            _tx: _defaultTx,
+            _disputeGameIndex: _proposedGameIndex,
+            _outputRootProof: _outputRootProof,
+            _withdrawalProof: _withdrawalProof
+        });
+
+        // Warp and resolve the original dispute game.
+        game.resolveClaim(0, 0);
+        game.resolve();
+        vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1 seconds);
+
+        // Ensure both proofs are registered successfully.
+        assertEq(optimismPortal2.numProofSubmitters(_withdrawalHash), 2);
+
+        vm.expectRevert("OptimismPortal: output proposal has not been validated");
+        vm.prank(address(0xb0b));
+        optimismPortal2.finalizeWithdrawalTransaction(_defaultTx);
+
+        vm.expectEmit(true, true, false, true);
+        emit WithdrawalFinalized(_withdrawalHash, true);
+        optimismPortal2.finalizeWithdrawalTransaction(_defaultTx);
+
+        assert(address(bob).balance == bobBalanceBefore + 100);
+    }
+
     /// @dev Tests that `finalizeWithdrawalTransaction` reverts if the contract is paused.
     function test_finalizeWithdrawalTransaction_paused_reverts() external {
-        vm.prank(optimismPortal2.GUARDIAN());
+        vm.prank(optimismPortal2.guardian());
         superchainConfig.pause("identifier");
 
-        vm.expectRevert("OptimismPortal: paused");
+        vm.expectRevert(CallPaused.selector);
         optimismPortal2.finalizeWithdrawalTransaction(_defaultTx);
     }
 
@@ -622,7 +771,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
     function test_finalizeWithdrawalTransaction_ifWithdrawalNotProven_reverts() external {
         uint256 bobBalanceBefore = address(bob).balance;
 
-        vm.expectRevert("OptimismPortal: withdrawal has not been proven yet");
+        vm.expectRevert("OptimismPortal: withdrawal has not been proven by proof submitter address yet");
         optimismPortal2.finalizeWithdrawalTransaction(_defaultTx);
 
         assert(address(bob).balance == bobBalanceBefore);
@@ -635,6 +784,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
 
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -656,6 +807,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         // Prove our withdrawal
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -685,6 +838,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         // Prove our withdrawal
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -696,7 +851,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1);
 
         // Attempt to finalize the withdrawal
-        vm.expectRevert("OptimismPortal: output proposal has not been finalized yet");
+        vm.expectRevert("OptimismPortal: output proposal has not been validated");
         optimismPortal2.finalizeWithdrawalTransaction(_defaultTx);
 
         // Ensure that bob's balance has remained the same
@@ -710,6 +865,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
 
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -718,7 +875,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         });
 
         // Resolve the dispute game.
-        game.resolveClaim(0);
+        game.resolveClaim(0, 0);
         game.resolve();
 
         vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1);
@@ -734,6 +891,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
     function test_finalizeWithdrawalTransaction_onReplay_reverts() external {
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -742,7 +901,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         });
 
         // Resolve the dispute game.
-        game.resolveClaim(0);
+        game.resolveClaim(0, 0);
         game.resolve();
 
         vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1);
@@ -790,7 +949,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         });
 
         // Resolve the dispute game.
-        game.resolveClaim(0);
+        game.resolveClaim(0, 0);
         game.resolve();
 
         vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1);
@@ -829,10 +988,12 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
 
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(withdrawalHash, alice, address(this));
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction(_testTx, _proposedGameIndex, outputRootProof, withdrawalProof);
 
         // Resolve the dispute game.
-        game.resolveClaim(0);
+        game.resolveClaim(0, 0);
         game.resolve();
 
         vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1);
@@ -903,11 +1064,11 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
 
         // Prove the withdrawal transaction
         optimismPortal2.proveWithdrawalTransaction(_tx, _proposedGameIndex, proof, withdrawalProof);
-        (IDisputeGame _game,) = optimismPortal2.provenWithdrawals(withdrawalHash);
+        (IDisputeGame _game,) = optimismPortal2.provenWithdrawals(withdrawalHash, address(this));
         assertTrue(_game.rootClaim().raw() != bytes32(0));
 
         // Resolve the dispute game
-        game.resolveClaim(0);
+        game.resolveClaim(0, 0);
         game.resolve();
 
         // Warp past the finalization period
@@ -923,6 +1084,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
     function test_finalizeWithdrawalTransaction_blacklisted_reverts() external {
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -931,7 +1094,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         });
 
         // Resolve the dispute game.
-        game.resolveClaim(0);
+        game.resolveClaim(0, 0);
         game.resolve();
 
         vm.prank(optimismPortal2.guardian());
@@ -948,6 +1111,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
     function test_finalizeWithdrawalTransaction_gameInAirGap_reverts() external {
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -959,7 +1124,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1);
 
         // Resolve the dispute game.
-        game.resolveClaim(0);
+        game.resolveClaim(0, 0);
         game.resolve();
 
         // Attempt to finalize the withdrawal directly after the game resolves. This should fail.
@@ -977,6 +1142,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
     function test_finalizeWithdrawalTransaction_respectedTypeChangedSinceProving_reverts() external {
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -988,7 +1155,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1);
 
         // Resolve the dispute game.
-        game.resolveClaim(0);
+        game.resolveClaim(0, 0);
         game.resolve();
 
         // Change the respected game type in the portal.
@@ -1004,6 +1171,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
     function test_finalizeWithdrawalTransaction_gameOlderThanRespectedGameTypeUpdate_reverts() external {
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -1015,7 +1184,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1);
 
         // Resolve the dispute game.
-        game.resolveClaim(0);
+        game.resolveClaim(0, 0);
         game.resolve();
 
         // Change the respected game type in the portal.
@@ -1034,6 +1203,8 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         // Prove the withdrawal transaction.
         vm.expectEmit(true, true, true, true);
         emit WithdrawalProven(_withdrawalHash, alice, bob);
+        vm.expectEmit(true, true, true, true);
+        emit WithdrawalProvenExtension1(_withdrawalHash, address(this));
         optimismPortal2.proveWithdrawalTransaction({
             _tx: _defaultTx,
             _disputeGameIndex: _proposedGameIndex,
@@ -1049,12 +1220,12 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
         // Warp 1 second in the future, past the proof maturity delay, and attempt to finalize the withdrawal.
         // This should also fail, since the dispute game has not resolved yet.
         vm.warp(block.timestamp + 1 seconds);
-        vm.expectRevert("OptimismPortal: output proposal has not been finalized yet");
+        vm.expectRevert("OptimismPortal: output proposal has not been validated");
         optimismPortal2.finalizeWithdrawalTransaction(_defaultTx);
 
         // Finalize the dispute game and attempt to finalize the withdrawal again. This should also fail, since the
         // air gap dispute game delay has not elapsed.
-        game.resolveClaim(0);
+        game.resolveClaim(0, 0);
         game.resolve();
         vm.warp(block.timestamp + optimismPortal2.disputeGameFinalityDelaySeconds());
         vm.expectRevert("OptimismPortal: output proposal in air-gap");
@@ -1075,7 +1246,7 @@ contract OptimismPortal2_Upgradeable_Test is CommonTest {
     }
 
     /// @dev Tests that the proxy is initialized correctly.
-    function test_params_initValuesOnProxy_succeeds() external {
+    function test_params_initValuesOnProxy_succeeds() external view {
         (uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum) = optimismPortal2.params();
         ResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig();
 
diff --git a/packages/contracts-bedrock/test/L1/OptimismPortalInterop.t.sol b/packages/contracts-bedrock/test/L1/OptimismPortalInterop.t.sol
new file mode 100644
index 000000000000..1d9c2b01a248
--- /dev/null
+++ b/packages/contracts-bedrock/test/L1/OptimismPortalInterop.t.sol
@@ -0,0 +1,97 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+// Testing utilities
+import { CommonTest } from "test/setup/CommonTest.sol";
+
+// Libraries
+import { Constants } from "src/libraries/Constants.sol";
+import { Predeploys } from "src/libraries/Predeploys.sol";
+
+// Target contract dependencies
+import "src/libraries/PortalErrors.sol";
+import { OptimismPortalInterop } from "src/L1/OptimismPortalInterop.sol";
+import { L1BlockInterop, ConfigType } from "src/L2/L1BlockInterop.sol";
+
+contract OptimismPortalInterop_Test is CommonTest {
+    /// @notice Marked virtual to be overridden in
+    ///         test/kontrol/deployment/DeploymentSummary.t.sol
+    function setUp() public virtual override {
+        super.enableInterop();
+        super.setUp();
+    }
+
+    /// @dev Tests that the config for the gas paying token can be set.
+    function testFuzz_setConfig_gasPayingToken_succeeds(bytes calldata _value) public {
+        vm.expectEmit(address(optimismPortal));
+        emitTransactionDeposited({
+            _from: Constants.DEPOSITOR_ACCOUNT,
+            _to: Predeploys.L1_BLOCK_ATTRIBUTES,
+            _value: 0,
+            _mint: 0,
+            _gasLimit: 200_000,
+            _isCreation: false,
+            _data: abi.encodeCall(L1BlockInterop.setConfig, (ConfigType.SET_GAS_PAYING_TOKEN, _value))
+        });
+
+        vm.prank(address(_optimismPortalInterop().systemConfig()));
+        _optimismPortalInterop().setConfig(ConfigType.SET_GAS_PAYING_TOKEN, _value);
+    }
+
+    /// @dev Tests that setting the gas paying token config as not the system config reverts.
+    function testFuzz_setConfig_gasPayingToken_notSystemConfig_reverts(bytes calldata _value) public {
+        vm.expectRevert(Unauthorized.selector);
+        _optimismPortalInterop().setConfig(ConfigType.SET_GAS_PAYING_TOKEN, _value);
+    }
+
+    /// @dev Tests that the config for adding a dependency can be set.
+    function testFuzz_setConfig_addDependency_succeeds(bytes calldata _value) public {
+        vm.expectEmit(address(optimismPortal));
+        emitTransactionDeposited({
+            _from: Constants.DEPOSITOR_ACCOUNT,
+            _to: Predeploys.L1_BLOCK_ATTRIBUTES,
+            _value: 0,
+            _mint: 0,
+            _gasLimit: 200_000,
+            _isCreation: false,
+            _data: abi.encodeCall(L1BlockInterop.setConfig, (ConfigType.ADD_DEPENDENCY, _value))
+        });
+
+        vm.prank(address(_optimismPortalInterop().systemConfig()));
+        _optimismPortalInterop().setConfig(ConfigType.ADD_DEPENDENCY, _value);
+    }
+
+    /// @dev Tests that setting the add dependency config as not the system config reverts.
+    function testFuzz_setConfig_addDependency_notSystemConfig_reverts(bytes calldata _value) public {
+        vm.expectRevert(Unauthorized.selector);
+        _optimismPortalInterop().setConfig(ConfigType.ADD_DEPENDENCY, _value);
+    }
+
+    /// @dev Tests that the config for removing a dependency can be set.
+    function testFuzz_setConfig_removeDependency_succeeds(bytes calldata _value) public {
+        vm.expectEmit(address(optimismPortal));
+        emitTransactionDeposited({
+            _from: Constants.DEPOSITOR_ACCOUNT,
+            _to: Predeploys.L1_BLOCK_ATTRIBUTES,
+            _value: 0,
+            _mint: 0,
+            _gasLimit: 200_000,
+            _isCreation: false,
+            _data: abi.encodeCall(L1BlockInterop.setConfig, (ConfigType.REMOVE_DEPENDENCY, _value))
+        });
+
+        vm.prank(address(_optimismPortalInterop().systemConfig()));
+        _optimismPortalInterop().setConfig(ConfigType.REMOVE_DEPENDENCY, _value);
+    }
+
+    /// @dev Tests that setting the remove dependency config as not the system config reverts.
+    function testFuzz_setConfig_removeDependency_notSystemConfig_reverts(bytes calldata _value) public {
+        vm.expectRevert(Unauthorized.selector);
+        _optimismPortalInterop().setConfig(ConfigType.REMOVE_DEPENDENCY, _value);
+    }
+
+    /// @dev Returns the OptimismPortalInterop instance.
+    function _optimismPortalInterop() internal view returns (OptimismPortalInterop) {
+        return OptimismPortalInterop(payable(address(optimismPortal)));
+    }
+}
diff --git a/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol b/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol
index 4a05fee431b3..235654d38af6 100644
--- a/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol
+++ b/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol
@@ -29,7 +29,7 @@ contract ProtocolVersions_Init is CommonTest {
 
 contract ProtocolVersions_Initialize_Test is ProtocolVersions_Init {
     /// @dev Tests that initialization sets the correct values.
-    function test_initialize_values_succeeds() external {
+    function test_initialize_values_succeeds() external view {
         ProtocolVersions protocolVersionsImpl = ProtocolVersions(deploy.mustGetAddress("ProtocolVersions"));
         address owner = deploy.cfg().finalSystemOwner();
 
diff --git a/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol b/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol
index 99633fe67ec7..63b208b9c255 100644
--- a/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol
+++ b/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol
@@ -62,7 +62,7 @@ contract ResourceMetering_Test is Test {
     }
 
     /// @dev Tests that the initial resource params are set correctly.
-    function test_meter_initialResourceParams_succeeds() external {
+    function test_meter_initialResourceParams_succeeds() external view {
         (uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum) = meter.params();
         ResourceMetering.ResourceConfig memory rcfg = meter.resourceConfig();
 
@@ -185,7 +185,7 @@ contract ResourceMetering_Test is Test {
         uint64 target = uint64(rcfg.maxResourceLimit) / uint64(rcfg.elasticityMultiplier);
         uint64 elasticityMultiplier = uint64(rcfg.elasticityMultiplier);
 
-        vm.expectRevert("ResourceMetering: cannot buy more gas than available gas limit");
+        vm.expectRevert(ResourceMetering.OutOfGas.selector);
         meter.use(target * elasticityMultiplier + 1);
     }
 
@@ -203,6 +203,16 @@ contract ResourceMetering_Test is Test {
         vm.roll(initialBlockNum + _blockDiff);
         meter.use(_amount);
     }
+
+    function testFuzz_meter_useGas_succeeds(uint64 _amount) external {
+        (, uint64 prevBoughtGas,) = meter.params();
+        vm.assume(prevBoughtGas + _amount <= meter.resourceConfig().maxResourceLimit);
+
+        meter.use(_amount);
+
+        (, uint64 postPrevBoughtGas,) = meter.params();
+        assertEq(postPrevBoughtGas, prevBoughtGas + _amount);
+    }
 }
 
 /// @title CustomMeterUser
diff --git a/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol b/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol
index d1f58eed71c7..97b25f3f611a 100644
--- a/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol
+++ b/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol
@@ -15,7 +15,7 @@ import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
 
 contract SuperchainConfig_Init_Test is CommonTest {
     /// @dev Tests that initialization sets the correct values. These are defined in CommonTest.sol.
-    function test_initialize_unpaused_succeeds() external {
+    function test_initialize_unpaused_succeeds() external view {
         assertFalse(superchainConfig.paused());
         assertEq(superchainConfig.guardian(), deploy.cfg().superchainConfigGuardian());
     }
diff --git a/packages/contracts-bedrock/test/L1/SystemConfig.t.sol b/packages/contracts-bedrock/test/L1/SystemConfig.t.sol
index c8b89b5045c3..9b48f354d248 100644
--- a/packages/contracts-bedrock/test/L1/SystemConfig.t.sol
+++ b/packages/contracts-bedrock/test/L1/SystemConfig.t.sol
@@ -3,14 +3,18 @@ pragma solidity 0.8.15;
 
 // Testing utilities
 import { CommonTest } from "test/setup/CommonTest.sol";
+import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
 
 // Libraries
 import { Constants } from "src/libraries/Constants.sol";
 import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
+import { Predeploys } from "src/libraries/Predeploys.sol";
 
 // Target contract dependencies
 import { ResourceMetering } from "src/L1/ResourceMetering.sol";
 import { Proxy } from "src/universal/Proxy.sol";
+import { L1Block } from "src/L2/L1Block.sol";
+import { GasPayingToken } from "src/libraries/GasPayingToken.sol";
 
 // Target contract
 import { SystemConfig } from "src/L1/SystemConfig.sol";
@@ -22,20 +26,20 @@ contract SystemConfig_Init is CommonTest {
 contract SystemConfig_Initialize_Test is SystemConfig_Init {
     address batchInbox;
     address owner;
-    uint256 overhead;
-    uint256 scalar;
     bytes32 batcherHash;
     uint64 gasLimit;
     address unsafeBlockSigner;
     address systemConfigImpl;
     address optimismMintableERC20Factory;
+    uint32 basefeeScalar;
+    uint32 blobbasefeeScalar;
 
     function setUp() public virtual override {
         super.setUp();
         batchInbox = deploy.cfg().batchInboxAddress();
         owner = deploy.cfg().finalSystemOwner();
-        overhead = deploy.cfg().gasPriceOracleOverhead();
-        scalar = deploy.cfg().gasPriceOracleScalar();
+        basefeeScalar = deploy.cfg().basefeeScalar();
+        blobbasefeeScalar = deploy.cfg().blobbasefeeScalar();
         batcherHash = bytes32(uint256(uint160(deploy.cfg().batchSenderAddress())));
         gasLimit = uint64(deploy.cfg().l2GenesisBlockGasLimit());
         unsafeBlockSigner = deploy.cfg().p2pSequencerAddress();
@@ -44,14 +48,16 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init {
     }
 
     /// @dev Tests that constructor sets the correct values.
-    function test_constructor_succeeds() external {
+    function test_constructor_succeeds() external view {
         SystemConfig impl = SystemConfig(systemConfigImpl);
         assertEq(impl.owner(), address(0xdEaD));
         assertEq(impl.overhead(), 0);
-        assertEq(impl.scalar(), 0);
+        assertEq(impl.scalar(), uint256(0x01) << 248);
         assertEq(impl.batcherHash(), bytes32(0));
         assertEq(impl.gasLimit(), 1);
         assertEq(impl.unsafeBlockSigner(), address(0));
+        assertEq(impl.basefeeScalar(), 0);
+        assertEq(impl.blobbasefeeScalar(), 0);
         ResourceMetering.ResourceConfig memory actual = impl.resourceConfig();
         assertEq(actual.maxResourceLimit, 1);
         assertEq(actual.elasticityMultiplier, 1);
@@ -65,19 +71,25 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init {
         assertEq(address(impl.l1CrossDomainMessenger()), address(0));
         assertEq(address(impl.l1ERC721Bridge()), address(0));
         assertEq(address(impl.l1StandardBridge()), address(0));
-        assertEq(address(impl.l2OutputOracle()), address(0));
+        assertEq(address(impl.disputeGameFactory()), address(0));
         assertEq(address(impl.optimismPortal()), address(0));
         assertEq(address(impl.optimismMintableERC20Factory()), address(0));
+        // Check gas paying token
+        (address token, uint8 decimals) = impl.gasPayingToken();
+        assertEq(token, Constants.ETHER);
+        assertEq(decimals, 18);
     }
 
-    /// @dev Tests that initailization sets the correct values.
-    function test_initialize_succeeds() external {
+    /// @dev Tests that initialization sets the correct values.
+    function test_initialize_succeeds() external view {
         assertEq(systemConfig.owner(), owner);
-        assertEq(systemConfig.overhead(), overhead);
-        assertEq(systemConfig.scalar(), scalar);
+        assertEq(systemConfig.overhead(), 0);
+        assertEq(systemConfig.scalar() >> 248, 1);
         assertEq(systemConfig.batcherHash(), batcherHash);
         assertEq(systemConfig.gasLimit(), gasLimit);
         assertEq(systemConfig.unsafeBlockSigner(), unsafeBlockSigner);
+        assertEq(systemConfig.basefeeScalar(), basefeeScalar);
+        assertEq(systemConfig.blobbasefeeScalar(), blobbasefeeScalar);
         // Depends on `initialize` being called with defaults
         ResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG();
         ResourceMetering.ResourceConfig memory actual = systemConfig.resourceConfig();
@@ -95,9 +107,13 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init {
         assertEq(address(systemConfig.l1CrossDomainMessenger()), address(l1CrossDomainMessenger));
         assertEq(address(systemConfig.l1ERC721Bridge()), address(l1ERC721Bridge));
         assertEq(address(systemConfig.l1StandardBridge()), address(l1StandardBridge));
-        assertEq(address(systemConfig.l2OutputOracle()), address(l2OutputOracle));
+        assertEq(address(systemConfig.disputeGameFactory()), address(disputeGameFactory));
         assertEq(address(systemConfig.optimismPortal()), address(optimismPortal));
         assertEq(address(systemConfig.optimismMintableERC20Factory()), address(optimismMintableERC20Factory));
+        // Check gas paying token
+        (address token, uint8 decimals) = systemConfig.gasPayingToken();
+        assertEq(token, Constants.ETHER);
+        assertEq(decimals, 18);
     }
 }
 
@@ -115,8 +131,8 @@ contract SystemConfig_Initialize_TestFail is SystemConfig_Initialize_Test {
         vm.expectRevert("SystemConfig: gas limit too low");
         systemConfig.initialize({
             _owner: alice,
-            _overhead: 2100,
-            _scalar: 1000000,
+            _basefeeScalar: basefeeScalar,
+            _blobbasefeeScalar: blobbasefeeScalar,
             _batcherHash: bytes32(hex"abcd"),
             _gasLimit: minimumGasLimit - 1,
             _unsafeBlockSigner: address(1),
@@ -126,9 +142,10 @@ contract SystemConfig_Initialize_TestFail is SystemConfig_Initialize_Test {
                 l1CrossDomainMessenger: address(0),
                 l1ERC721Bridge: address(0),
                 l1StandardBridge: address(0),
-                l2OutputOracle: address(0),
+                disputeGameFactory: address(0),
                 optimismPortal: address(0),
-                optimismMintableERC20Factory: address(0)
+                optimismMintableERC20Factory: address(0),
+                gasPayingToken: Constants.ETHER
             })
         });
     }
@@ -144,8 +161,8 @@ contract SystemConfig_Initialize_TestFail is SystemConfig_Initialize_Test {
         vm.prank(systemConfig.owner());
         systemConfig.initialize({
             _owner: alice,
-            _overhead: 2100,
-            _scalar: 1000000,
+            _basefeeScalar: basefeeScalar,
+            _blobbasefeeScalar: blobbasefeeScalar,
             _batcherHash: bytes32(hex"abcd"),
             _gasLimit: gasLimit,
             _unsafeBlockSigner: address(1),
@@ -155,9 +172,10 @@ contract SystemConfig_Initialize_TestFail is SystemConfig_Initialize_Test {
                 l1CrossDomainMessenger: address(0),
                 l1ERC721Bridge: address(0),
                 l1StandardBridge: address(0),
-                l2OutputOracle: address(0),
+                disputeGameFactory: address(0),
                 optimismPortal: address(0),
-                optimismMintableERC20Factory: address(0)
+                optimismMintableERC20Factory: address(0),
+                gasPayingToken: Constants.ETHER
             })
         });
         assertEq(systemConfig.startBlock(), block.number);
@@ -174,8 +192,8 @@ contract SystemConfig_Initialize_TestFail is SystemConfig_Initialize_Test {
         vm.prank(systemConfig.owner());
         systemConfig.initialize({
             _owner: alice,
-            _overhead: 2100,
-            _scalar: 1000000,
+            _basefeeScalar: basefeeScalar,
+            _blobbasefeeScalar: blobbasefeeScalar,
             _batcherHash: bytes32(hex"abcd"),
             _gasLimit: gasLimit,
             _unsafeBlockSigner: address(1),
@@ -185,47 +203,17 @@ contract SystemConfig_Initialize_TestFail is SystemConfig_Initialize_Test {
                 l1CrossDomainMessenger: address(0),
                 l1ERC721Bridge: address(0),
                 l1StandardBridge: address(0),
-                l2OutputOracle: address(0),
+                disputeGameFactory: address(0),
                 optimismPortal: address(0),
-                optimismMintableERC20Factory: address(0)
+                optimismMintableERC20Factory: address(0),
+                gasPayingToken: Constants.ETHER
             })
         });
         assertEq(systemConfig.startBlock(), 1);
     }
 }
 
-contract SystemConfig_Setters_TestFail is SystemConfig_Init {
-    /// @dev Tests that `setBatcherHash` reverts if the caller is not the owner.
-    function test_setBatcherHash_notOwner_reverts() external {
-        vm.expectRevert("Ownable: caller is not the owner");
-        systemConfig.setBatcherHash(bytes32(hex""));
-    }
-
-    /// @dev Tests that `setGasConfig` reverts if the caller is not the owner.
-    function test_setGasConfig_notOwner_reverts() external {
-        vm.expectRevert("Ownable: caller is not the owner");
-        systemConfig.setGasConfig(0, 0);
-    }
-
-    /// @dev Tests that `setGasLimit` reverts if the caller is not the owner.
-    function test_setGasLimit_notOwner_reverts() external {
-        vm.expectRevert("Ownable: caller is not the owner");
-        systemConfig.setGasLimit(0);
-    }
-
-    /// @dev Tests that `setUnsafeBlockSigner` reverts if the caller is not the owner.
-    function test_setUnsafeBlockSigner_notOwner_reverts() external {
-        vm.expectRevert("Ownable: caller is not the owner");
-        systemConfig.setUnsafeBlockSigner(address(0x20));
-    }
-
-    /// @dev Tests that `setResourceConfig` reverts if the caller is not the owner.
-    function test_setResourceConfig_notOwner_reverts() external {
-        ResourceMetering.ResourceConfig memory config = Constants.DEFAULT_RESOURCE_CONFIG();
-        vm.expectRevert("Ownable: caller is not the owner");
-        systemConfig.setResourceConfig(config);
-    }
-
+contract SystemConfig_Init_ResourceConfig is SystemConfig_Init {
     /// @dev Tests that `setResourceConfig` reverts if the min base fee
     ///      is greater than the maximum allowed base fee.
     function test_setResourceConfig_badMinMax_reverts() external {
@@ -237,9 +225,7 @@ contract SystemConfig_Setters_TestFail is SystemConfig_Init {
             minimumBaseFee: 2 gwei,
             maximumBaseFee: 1 gwei
         });
-        vm.prank(systemConfig.owner());
-        vm.expectRevert("SystemConfig: min base fee must be less than max base");
-        systemConfig.setResourceConfig(config);
+        _initializeWithResourceConfig(config, "SystemConfig: min base fee must be less than max base");
     }
 
     /// @dev Tests that `setResourceConfig` reverts if the baseFeeMaxChangeDenominator
@@ -253,9 +239,7 @@ contract SystemConfig_Setters_TestFail is SystemConfig_Init {
             minimumBaseFee: 1 gwei,
             maximumBaseFee: 2 gwei
         });
-        vm.prank(systemConfig.owner());
-        vm.expectRevert("SystemConfig: denominator must be larger than 1");
-        systemConfig.setResourceConfig(config);
+        _initializeWithResourceConfig(config, "SystemConfig: denominator must be larger than 1");
     }
 
     /// @dev Tests that `setResourceConfig` reverts if the gas limit is too low.
@@ -270,9 +254,7 @@ contract SystemConfig_Setters_TestFail is SystemConfig_Init {
             minimumBaseFee: 1 gwei,
             maximumBaseFee: 2 gwei
         });
-        vm.prank(systemConfig.owner());
-        vm.expectRevert("SystemConfig: gas limit too low");
-        systemConfig.setResourceConfig(config);
+        _initializeWithResourceConfig(config, "SystemConfig: gas limit too low");
     }
 
     /// @dev Tests that `setResourceConfig` reverts if the elasticity multiplier
@@ -286,16 +268,271 @@ contract SystemConfig_Setters_TestFail is SystemConfig_Init {
             minimumBaseFee: 1 gwei,
             maximumBaseFee: 2 gwei
         });
+        _initializeWithResourceConfig(config, "SystemConfig: precision loss with target resource limit");
+    }
+
+    /// @dev Helper to initialize the system config with a resource config and default values, and expect a revert
+    ///      with the given message.
+    function _initializeWithResourceConfig(
+        ResourceMetering.ResourceConfig memory config,
+        string memory revertMessage
+    )
+        internal
+    {
+        // Wipe out the initialized slot so the proxy can be initialized again
+        vm.store(address(systemConfig), bytes32(0), bytes32(0));
+        // Fetch the current gas limit
+        uint64 gasLimit = uint64(deploy.cfg().l2GenesisBlockGasLimit());
+
+        vm.expectRevert(bytes(revertMessage));
+        systemConfig.initialize({
+            _owner: address(0xdEaD),
+            _basefeeScalar: 0,
+            _blobbasefeeScalar: 0,
+            _batcherHash: bytes32(0),
+            _gasLimit: gasLimit,
+            _unsafeBlockSigner: address(0),
+            _config: config,
+            _batchInbox: address(0),
+            _addresses: SystemConfig.Addresses({
+                l1CrossDomainMessenger: address(0),
+                l1ERC721Bridge: address(0),
+                l1StandardBridge: address(0),
+                disputeGameFactory: address(0),
+                optimismPortal: address(0),
+                optimismMintableERC20Factory: address(0),
+                gasPayingToken: address(0)
+            })
+        });
+    }
+}
+
+contract SystemConfig_Init_CustomGasToken is SystemConfig_Init {
+    ERC20 token;
+
+    function setUp() public override {
+        token = new ERC20("Silly", "SIL");
+        super.enableCustomGasToken(address(token));
+        super.setUp();
+    }
+
+    /// @dev Helper to clean storage and then initialize the system config with an arbitrary gas token address.
+    function cleanStorageAndInit(address _gasPayingToken) internal {
+        vm.store(address(systemConfig), bytes32(0), bytes32(0)); // initailizer
+        vm.store(address(systemConfig), GasPayingToken.GAS_PAYING_TOKEN_SLOT, bytes32(0));
+        vm.store(address(systemConfig), GasPayingToken.GAS_PAYING_TOKEN_NAME_SLOT, bytes32(0));
+        vm.store(address(systemConfig), GasPayingToken.GAS_PAYING_TOKEN_SYMBOL_SLOT, bytes32(0));
+
+        systemConfig.initialize({
+            _owner: alice,
+            _basefeeScalar: 2100,
+            _blobbasefeeScalar: 1000000,
+            _batcherHash: bytes32(hex"abcd"),
+            _gasLimit: 30_000_000,
+            _unsafeBlockSigner: address(1),
+            _config: Constants.DEFAULT_RESOURCE_CONFIG(),
+            _batchInbox: address(0),
+            _addresses: SystemConfig.Addresses({
+                l1CrossDomainMessenger: address(0),
+                l1ERC721Bridge: address(0),
+                disputeGameFactory: address(0),
+                l1StandardBridge: address(0),
+                optimismPortal: address(optimismPortal),
+                optimismMintableERC20Factory: address(0),
+                gasPayingToken: _gasPayingToken
+            })
+        });
+    }
+
+    /// @dev Tests that initialization sets the correct values and getters work.
+    function test_initialize_customGasToken_succeeds() external view {
+        (address addr, uint8 decimals) = systemConfig.gasPayingToken();
+        assertEq(addr, address(token));
+        assertEq(decimals, 18);
+
+        assertEq(systemConfig.gasPayingTokenName(), token.name());
+        assertEq(systemConfig.gasPayingTokenSymbol(), token.symbol());
+    }
+
+    /// @dev Tests that initialization sets the correct values and getters work.
+    function testFuzz_initialize_customGasToken_succeeds(
+        address _token,
+        string calldata _name,
+        string calldata _symbol
+    )
+        external
+    {
+        // don't use vm's address
+        vm.assume(_token != address(vm));
+        // don't use console's address
+        vm.assume(_token != CONSOLE);
+        // don't use create2 deployer's address
+        vm.assume(_token != CREATE2_FACTORY);
+        // don't use default test's address
+        vm.assume(_token != DEFAULT_TEST_CONTRACT);
+        // don't use multicall3's address
+        vm.assume(_token != MULTICALL3_ADDRESS);
+
+        vm.assume(bytes(_name).length <= 32);
+        vm.assume(bytes(_symbol).length <= 32);
+
+        vm.mockCall(_token, abi.encodeWithSelector(token.decimals.selector), abi.encode(18));
+        vm.mockCall(_token, abi.encodeWithSelector(token.name.selector), abi.encode(_name));
+        vm.mockCall(_token, abi.encodeWithSelector(token.symbol.selector), abi.encode(_symbol));
+
+        cleanStorageAndInit(_token);
+
+        (address addr, uint8 decimals) = systemConfig.gasPayingToken();
+        assertEq(decimals, 18);
+
+        if (_token == address(0) || _token == Constants.ETHER) {
+            assertEq(addr, Constants.ETHER);
+            assertEq(systemConfig.gasPayingTokenName(), "Ether");
+            assertEq(systemConfig.gasPayingTokenSymbol(), "ETH");
+        } else {
+            assertEq(addr, _token);
+            assertEq(systemConfig.gasPayingTokenName(), _name);
+            assertEq(systemConfig.gasPayingTokenSymbol(), _symbol);
+        }
+    }
+
+    /// @dev Tests that initialization sets the correct values and getters work when token address passed is 0.
+    function test_initialize_customGasToken_zeroTokenAddress_succeeds() external {
+        cleanStorageAndInit(address(0));
+
+        (address addr, uint8 decimals) = systemConfig.gasPayingToken();
+        assertEq(addr, address(Constants.ETHER));
+        assertEq(decimals, 18);
+
+        assertEq(systemConfig.gasPayingTokenName(), "Ether");
+        assertEq(systemConfig.gasPayingTokenSymbol(), "ETH");
+    }
+
+    /// @dev Tests that initialization sets the correct values and getters work when token address is Constants.ETHER
+    function test_initialize_customGasToken_etherTokenAddress_succeeds() external {
+        cleanStorageAndInit(Constants.ETHER);
+
+        (address addr, uint8 decimals) = systemConfig.gasPayingToken();
+        assertEq(addr, address(Constants.ETHER));
+        assertEq(decimals, 18);
+
+        assertEq(systemConfig.gasPayingTokenName(), "Ether");
+        assertEq(systemConfig.gasPayingTokenSymbol(), "ETH");
+    }
+
+    /// @dev Tests that initialization fails if decimals are not 18.
+    function test_initialize_customGasToken_wrongDecimals_fails() external {
+        vm.mockCall(address(token), abi.encodeWithSelector(token.decimals.selector), abi.encode(8));
+        vm.expectRevert("SystemConfig: bad decimals of gas paying token");
+
+        cleanStorageAndInit(address(token));
+    }
+
+    /// @dev Tests that initialization fails if name is too long.
+    function test_initialize_customGasToken_nameTooLong_fails() external {
+        string memory name = new string(32);
+        name = string.concat(name, "a");
+
+        vm.mockCall(address(token), abi.encodeWithSelector(token.name.selector), abi.encode(name));
+        vm.expectRevert("GasPayingToken: string cannot be greater than 32 bytes");
+
+        cleanStorageAndInit(address(token));
+    }
+
+    /// @dev Tests that initialization fails if symbol is too long.
+    function test_initialize_customGasToken_symbolTooLong_fails() external {
+        string memory symbol = new string(33);
+        symbol = string.concat(symbol, "a");
+
+        vm.mockCall(address(token), abi.encodeWithSelector(token.symbol.selector), abi.encode(symbol));
+        vm.expectRevert("GasPayingToken: string cannot be greater than 32 bytes");
+
+        cleanStorageAndInit(address(token));
+    }
+
+    /// @dev Tests that initialization works with OptimismPortal.
+    function test_initialize_customGasTokenCall_succeeds() external {
+        vm.expectCall(
+            address(optimismPortal),
+            abi.encodeCall(optimismPortal.setGasPayingToken, (address(token), 18, bytes32("Silly"), bytes32("SIL")))
+        );
+
+        vm.expectEmit(address(optimismPortal));
+        emit TransactionDeposited(
+            0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001,
+            Predeploys.L1_BLOCK_ATTRIBUTES,
+            0, // deposit version
+            abi.encodePacked(
+                uint256(0), // mint
+                uint256(0), // value
+                uint64(200_000), // gasLimit
+                false, // isCreation,
+                abi.encodeCall(L1Block.setGasPayingToken, (address(token), 18, bytes32("Silly"), bytes32("SIL")))
+            )
+        );
+
+        cleanStorageAndInit(address(token));
+    }
+}
+
+contract SystemConfig_Setters_TestFail is SystemConfig_Init {
+    /// @dev Tests that `setBatcherHash` reverts if the caller is not the owner.
+    function test_setBatcherHash_notOwner_reverts() external {
+        vm.expectRevert("Ownable: caller is not the owner");
+        systemConfig.setBatcherHash(bytes32(hex""));
+    }
+
+    /// @dev Tests that `setGasConfig` reverts if the caller is not the owner.
+    function test_setGasConfig_notOwner_reverts() external {
+        vm.expectRevert("Ownable: caller is not the owner");
+        systemConfig.setGasConfig(0, 0);
+    }
+
+    /// @notice Ensures that `setGasConfig` reverts if version byte is set.
+    function test_setGasConfig_badValues_reverts() external {
+        vm.prank(systemConfig.owner());
+        vm.expectRevert("SystemConfig: scalar exceeds max.");
+        systemConfig.setGasConfig({ _overhead: 0, _scalar: type(uint256).max });
+    }
+
+    function test_setGasConfigEcotone_notOwner_reverts() external {
+        vm.expectRevert("Ownable: caller is not the owner");
+        systemConfig.setGasConfigEcotone({ _basefeeScalar: 0, _blobbasefeeScalar: 0 });
+    }
+
+    /// @dev Tests that `setGasLimit` reverts if the caller is not the owner.
+    function test_setGasLimit_notOwner_reverts() external {
+        vm.expectRevert("Ownable: caller is not the owner");
+        systemConfig.setGasLimit(0);
+    }
+
+    /// @dev Tests that `setUnsafeBlockSigner` reverts if the caller is not the owner.
+    function test_setUnsafeBlockSigner_notOwner_reverts() external {
+        vm.expectRevert("Ownable: caller is not the owner");
+        systemConfig.setUnsafeBlockSigner(address(0x20));
+    }
+
+    /// @dev Tests that `setGasLimit` reverts if the gas limit is too low.
+    function test_setGasLimit_lowGasLimit_reverts() external {
+        uint64 minimumGasLimit = systemConfig.minimumGasLimit();
         vm.prank(systemConfig.owner());
-        vm.expectRevert("SystemConfig: precision loss with target resource limit");
-        systemConfig.setResourceConfig(config);
+        vm.expectRevert("SystemConfig: gas limit too low");
+        systemConfig.setGasLimit(minimumGasLimit - 1);
+    }
+
+    /// @dev Tests that `setGasLimit` reverts if the gas limit is too high.
+    function test_setGasLimit_highGasLimit_reverts() external {
+        uint64 maximumGasLimit = systemConfig.maximumGasLimit();
+        vm.prank(systemConfig.owner());
+        vm.expectRevert("SystemConfig: gas limit too high");
+        systemConfig.setGasLimit(maximumGasLimit + 1);
     }
 }
 
 contract SystemConfig_Setters_Test is SystemConfig_Init {
     /// @dev Tests that `setBatcherHash` updates the batcher hash successfully.
     function testFuzz_setBatcherHash_succeeds(bytes32 newBatcherHash) external {
-        vm.expectEmit(true, true, true, true);
+        vm.expectEmit(address(systemConfig));
         emit ConfigUpdate(0, SystemConfig.UpdateType.BATCHER, abi.encode(newBatcherHash));
 
         vm.prank(systemConfig.owner());
@@ -305,7 +542,9 @@ contract SystemConfig_Setters_Test is SystemConfig_Init {
 
     /// @dev Tests that `setGasConfig` updates the overhead and scalar successfully.
     function testFuzz_setGasConfig_succeeds(uint256 newOverhead, uint256 newScalar) external {
-        vm.expectEmit(true, true, true, true);
+        // always zero out most significant byte
+        newScalar = (newScalar << 16) >> 16;
+        vm.expectEmit(address(systemConfig));
         emit ConfigUpdate(0, SystemConfig.UpdateType.GAS_CONFIG, abi.encode(newOverhead, newScalar));
 
         vm.prank(systemConfig.owner());
@@ -314,12 +553,31 @@ contract SystemConfig_Setters_Test is SystemConfig_Init {
         assertEq(systemConfig.scalar(), newScalar);
     }
 
+    function testFuzz_setGasConfigEcotone_succeeds(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) external {
+        bytes32 encoded =
+            ffi.encodeScalarEcotone({ _basefeeScalar: _basefeeScalar, _blobbasefeeScalar: _blobbasefeeScalar });
+
+        vm.expectEmit(address(systemConfig));
+        emit ConfigUpdate(0, SystemConfig.UpdateType.GAS_CONFIG, abi.encode(systemConfig.overhead(), encoded));
+
+        vm.prank(systemConfig.owner());
+        systemConfig.setGasConfigEcotone({ _basefeeScalar: _basefeeScalar, _blobbasefeeScalar: _blobbasefeeScalar });
+        assertEq(systemConfig.basefeeScalar(), _basefeeScalar);
+        assertEq(systemConfig.blobbasefeeScalar(), _blobbasefeeScalar);
+        assertEq(systemConfig.scalar(), uint256(encoded));
+
+        (uint32 basefeeScalar, uint32 blobbbasefeeScalar) = ffi.decodeScalarEcotone(encoded);
+        assertEq(uint256(basefeeScalar), uint256(_basefeeScalar));
+        assertEq(uint256(blobbbasefeeScalar), uint256(_blobbasefeeScalar));
+    }
+
     /// @dev Tests that `setGasLimit` updates the gas limit successfully.
     function testFuzz_setGasLimit_succeeds(uint64 newGasLimit) external {
         uint64 minimumGasLimit = systemConfig.minimumGasLimit();
-        newGasLimit = uint64(bound(uint256(newGasLimit), uint256(minimumGasLimit), uint256(type(uint64).max)));
+        uint64 maximumGasLimit = systemConfig.maximumGasLimit();
+        newGasLimit = uint64(bound(uint256(newGasLimit), uint256(minimumGasLimit), uint256(maximumGasLimit)));
 
-        vm.expectEmit(true, true, true, true);
+        vm.expectEmit(address(systemConfig));
         emit ConfigUpdate(0, SystemConfig.UpdateType.GAS_LIMIT, abi.encode(newGasLimit));
 
         vm.prank(systemConfig.owner());
@@ -329,7 +587,7 @@ contract SystemConfig_Setters_Test is SystemConfig_Init {
 
     /// @dev Tests that `setUnsafeBlockSigner` updates the block signer successfully.
     function testFuzz_setUnsafeBlockSigner_succeeds(address newUnsafeSigner) external {
-        vm.expectEmit(true, true, true, true);
+        vm.expectEmit(address(systemConfig));
         emit ConfigUpdate(0, SystemConfig.UpdateType.UNSAFE_BLOCK_SIGNER, abi.encode(newUnsafeSigner));
 
         vm.prank(systemConfig.owner());
diff --git a/packages/contracts-bedrock/test/L1/SystemConfigInterop.t.sol b/packages/contracts-bedrock/test/L1/SystemConfigInterop.t.sol
new file mode 100644
index 000000000000..8c43aad40702
--- /dev/null
+++ b/packages/contracts-bedrock/test/L1/SystemConfigInterop.t.sol
@@ -0,0 +1,137 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+// Testing utilities
+import { CommonTest } from "test/setup/CommonTest.sol";
+
+// Libraries
+import { Constants } from "src/libraries/Constants.sol";
+import { StaticConfig } from "src/libraries/StaticConfig.sol";
+import { GasPayingToken } from "src/libraries/GasPayingToken.sol";
+
+// Target contract dependencies
+import { SystemConfig } from "src/L1/SystemConfig.sol";
+import { SystemConfigInterop } from "src/L1/SystemConfigInterop.sol";
+import { OptimismPortalInterop } from "src/L1/OptimismPortalInterop.sol";
+import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import { ConfigType } from "src/L2/L1BlockInterop.sol";
+
+contract SystemConfigInterop_Test is CommonTest {
+    /// @notice Marked virtual to be overridden in
+    ///         test/kontrol/deployment/DeploymentSummary.t.sol
+    function setUp() public virtual override {
+        super.enableInterop();
+        super.setUp();
+    }
+
+    /// @dev Tests that the gas paying token can be set.
+    function testFuzz_setGasPayingToken_succeeds(
+        address _token,
+        string calldata _name,
+        string calldata _symbol
+    )
+        public
+    {
+        assumeNotForgeAddress(_token);
+        vm.assume(_token != address(0));
+        vm.assume(_token != Constants.ETHER);
+
+        vm.assume(bytes(_name).length <= 32);
+        vm.assume(bytes(_symbol).length <= 32);
+
+        vm.mockCall(_token, abi.encodeWithSelector(ERC20.decimals.selector), abi.encode(18));
+        vm.mockCall(_token, abi.encodeWithSelector(ERC20.name.selector), abi.encode(_name));
+        vm.mockCall(_token, abi.encodeWithSelector(ERC20.symbol.selector), abi.encode(_symbol));
+
+        vm.expectCall(
+            address(optimismPortal),
+            abi.encodeCall(
+                OptimismPortalInterop.setConfig,
+                (
+                    ConfigType.SET_GAS_PAYING_TOKEN,
+                    StaticConfig.encodeSetGasPayingToken({
+                        _token: _token,
+                        _decimals: 18,
+                        _name: GasPayingToken.sanitize(_name),
+                        _symbol: GasPayingToken.sanitize(_symbol)
+                    })
+                )
+            )
+        );
+
+        _cleanStorageAndInit(_token);
+    }
+
+    /// @dev Tests that a dependency can be added.
+    function testFuzz_addDependency_succeeds(uint256 _chainId) public {
+        vm.expectCall(
+            address(optimismPortal),
+            abi.encodeCall(
+                OptimismPortalInterop.setConfig, (ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId))
+            )
+        );
+
+        vm.prank(systemConfig.owner());
+        _systemConfigInterop().addDependency(_chainId);
+    }
+
+    /// @dev Tests that adding a dependency as not the owner reverts.
+    function testFuzz_addDependency_notOwner_reverts(uint256 _chainId) public {
+        vm.expectRevert("Ownable: caller is not the owner");
+        _systemConfigInterop().addDependency(_chainId);
+    }
+
+    /// @dev Tests that a dependency can be removed.
+    function testFuzz_removeDependency_succeeds(uint256 _chainId) public {
+        vm.expectCall(
+            address(optimismPortal),
+            abi.encodeCall(
+                OptimismPortalInterop.setConfig,
+                (ConfigType.REMOVE_DEPENDENCY, StaticConfig.encodeRemoveDependency(_chainId))
+            )
+        );
+
+        vm.prank(systemConfig.owner());
+        _systemConfigInterop().removeDependency(_chainId);
+    }
+
+    /// @dev Tests that removing a dependency as not the owner reverts.
+    function testFuzz_removeDependency_notOwner_reverts(uint256 _chainId) public {
+        vm.expectRevert("Ownable: caller is not the owner");
+        _systemConfigInterop().removeDependency(_chainId);
+    }
+
+    /// @dev Helper to clean storage and then initialize the system config with an arbitrary gas token address.
+    function _cleanStorageAndInit(address _token) internal {
+        // Wipe out the initialized slot so the proxy can be initialized again
+        vm.store(address(systemConfig), bytes32(0), bytes32(0));
+        vm.store(address(systemConfig), GasPayingToken.GAS_PAYING_TOKEN_SLOT, bytes32(0));
+        vm.store(address(systemConfig), GasPayingToken.GAS_PAYING_TOKEN_NAME_SLOT, bytes32(0));
+        vm.store(address(systemConfig), GasPayingToken.GAS_PAYING_TOKEN_SYMBOL_SLOT, bytes32(0));
+
+        systemConfig.initialize({
+            _owner: alice,
+            _basefeeScalar: 2100,
+            _blobbasefeeScalar: 1000000,
+            _batcherHash: bytes32(hex"abcd"),
+            _gasLimit: 30_000_000,
+            _unsafeBlockSigner: address(1),
+            _config: Constants.DEFAULT_RESOURCE_CONFIG(),
+            _batchInbox: address(0),
+            _addresses: SystemConfig.Addresses({
+                l1CrossDomainMessenger: address(0),
+                l1ERC721Bridge: address(0),
+                disputeGameFactory: address(0),
+                l1StandardBridge: address(0),
+                optimismPortal: address(optimismPortal),
+                optimismMintableERC20Factory: address(0),
+                gasPayingToken: _token
+            })
+        });
+    }
+
+    /// @dev Returns the SystemConfigInterop instance.
+    function _systemConfigInterop() internal view returns (SystemConfigInterop) {
+        return SystemConfigInterop(address(systemConfig));
+    }
+}
diff --git a/packages/contracts-bedrock/test/L2/CrossDomainOwnable3.t.sol b/packages/contracts-bedrock/test/L2/CrossDomainOwnable3.t.sol
index 24eab5f55a48..432007ecd6d7 100644
--- a/packages/contracts-bedrock/test/L2/CrossDomainOwnable3.t.sol
+++ b/packages/contracts-bedrock/test/L2/CrossDomainOwnable3.t.sol
@@ -37,7 +37,7 @@ contract CrossDomainOwnable3_Test is Bridge_Initializer {
     }
 
     /// @dev Tests that the constructor sets the correct variables.
-    function test_constructor_succeeds() public {
+    function test_constructor_succeeds() public view {
         assertEq(setter.owner(), alice);
         assertEq(setter.isLocal(), true);
     }
diff --git a/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol
new file mode 100644
index 000000000000..32e8840ab6a3
--- /dev/null
+++ b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol
@@ -0,0 +1,363 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.25;
+
+// Testing utilities
+import { Test } from "forge-std/Test.sol";
+
+// Libraries
+import { Predeploys } from "src/libraries/Predeploys.sol";
+import { TransientContext } from "src/libraries/TransientContext.sol";
+
+// Target contracts
+import { CrossL2Inbox, NotEntered, InvalidTimestamp, InvalidChainId, TargetCallFailed } from "src/L2/CrossL2Inbox.sol";
+import { ICrossL2Inbox } from "src/L2/ICrossL2Inbox.sol";
+
+/// @title CrossL2InboxWithModifiableTransientStorage
+/// @dev CrossL2Inbox contract with methods to modify the transient storage.
+///      This is used to test the transient storage of CrossL2Inbox.
+contract CrossL2InboxWithModifiableTransientStorage is CrossL2Inbox {
+    /// @dev Increments call depth in transient storage.
+    function increment() external {
+        TransientContext.increment();
+    }
+
+    /// @dev Sets origin in transient storage.
+    /// @param _origin Origin to set.
+    function setOrigin(address _origin) external {
+        TransientContext.set(ORIGIN_SLOT, uint160(_origin));
+    }
+
+    /// @dev Sets block number in transient storage.
+    /// @param _blockNumber Block number to set.
+    function setBlockNumber(uint256 _blockNumber) external {
+        TransientContext.set(BLOCK_NUMBER_SLOT, _blockNumber);
+    }
+
+    /// @dev Sets log index in transient storage.
+    /// @param _logIndex Log index to set.
+    function setLogIndex(uint256 _logIndex) external {
+        TransientContext.set(LOG_INDEX_SLOT, _logIndex);
+    }
+
+    /// @dev Sets timestamp in transient storage.
+    /// @param _timestamp Timestamp to set.
+    function setTimestamp(uint256 _timestamp) external {
+        TransientContext.set(TIMESTAMP_SLOT, _timestamp);
+    }
+
+    /// @dev Sets chain ID in transient storage.
+    /// @param _chainId Chain ID to set.
+    function setChainId(uint256 _chainId) external {
+        TransientContext.set(CHAINID_SLOT, _chainId);
+    }
+}
+
+/// @title CrossL2InboxTest
+/// @dev Contract for testing the CrossL2Inbox contract.
+contract CrossL2InboxTest is Test {
+    /// @dev Selector for the `isInDependencySet` method of the L1Block contract.
+    bytes4 constant L1BlockIsInDependencySetSelector = bytes4(keccak256("isInDependencySet(uint256)"));
+
+    /// @dev CrossL2Inbox contract instance.
+    CrossL2Inbox crossL2Inbox;
+
+    /// @dev Sets up the test suite.
+    function setUp() public {
+        // Deploy the L2ToL2CrossDomainMessenger contract
+        vm.etch(Predeploys.CROSS_L2_INBOX, address(new CrossL2InboxWithModifiableTransientStorage()).code);
+        crossL2Inbox = CrossL2Inbox(Predeploys.CROSS_L2_INBOX);
+    }
+
+    /// @dev Tests that the `executeMessage` function succeeds.
+    function testFuzz_executeMessage_succeeds(
+        ICrossL2Inbox.Identifier memory _id,
+        address _target,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+        payable
+    {
+        // Ensure that the id's timestamp is valid (less than or equal to the current block timestamp)
+        _id.timestamp = bound(_id.timestamp, 0, block.timestamp);
+
+        // Ensure that the target call is payable if value is sent
+        if (_value > 0) assumePayable(_target);
+
+        // Ensure that the target call does not revert
+        vm.mockCall({ callee: _target, msgValue: _value, data: _message, returnData: abi.encode(true) });
+
+        // Ensure that the chain ID is in the dependency set
+        vm.mockCall({
+            callee: Predeploys.L1_BLOCK_ATTRIBUTES,
+            data: abi.encodeWithSelector(L1BlockIsInDependencySetSelector, _id.chainId),
+            returnData: abi.encode(true)
+        });
+
+        // Ensure that the contract has enough balance to send with value
+        vm.deal(address(this), _value);
+
+        // Look for the call to the target contract
+        vm.expectCall({ callee: _target, msgValue: _value, data: _message });
+
+        // Look for the emit ExecutingMessage event
+        vm.expectEmit(Predeploys.CROSS_L2_INBOX);
+        emit CrossL2Inbox.ExecutingMessage(abi.encode(_id), _message);
+
+        // Call the executeMessage function
+        crossL2Inbox.executeMessage{ value: _value }({ _id: _id, _target: _target, _message: _message });
+
+        // Check that the Identifier was stored correctly, but first we have to increment. This is because
+        // `executeMessage` increments + decrements the transient call depth, so we need to increment to have the
+        // getters use the right call depth.
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).increment();
+        assertEq(crossL2Inbox.origin(), _id.origin);
+        assertEq(crossL2Inbox.blockNumber(), _id.blockNumber);
+        assertEq(crossL2Inbox.logIndex(), _id.logIndex);
+        assertEq(crossL2Inbox.timestamp(), _id.timestamp);
+        assertEq(crossL2Inbox.chainId(), _id.chainId);
+    }
+
+    /// @dev Mock reentrant function that calls the `executeMessage` function.
+    /// @param _id Identifier to pass to the `executeMessage` function.
+    function mockReentrant(ICrossL2Inbox.Identifier calldata _id) external payable {
+        crossL2Inbox.executeMessage({ _id: _id, _target: address(0), _message: "" });
+    }
+
+    /// @dev Tests that the `executeMessage` function successfully handles reentrant calls.
+    function testFuzz_executeMessage_reentrant_succeeds(
+        ICrossL2Inbox.Identifier memory _id1, // identifier passed to `executeMessage` by the initial call.
+        ICrossL2Inbox.Identifier memory _id2, // identifier passed to `executeMessage` by the reentrant call.
+        uint256 _value
+    )
+        external
+        payable
+    {
+        // Ensure that the ids' timestamp are valid (less than or equal to the current block timestamp)
+        _id1.timestamp = bound(_id1.timestamp, 0, block.timestamp);
+        _id2.timestamp = bound(_id2.timestamp, 0, block.timestamp);
+
+        // Ensure that id1's chain ID is in the dependency set
+        vm.mockCall({
+            callee: Predeploys.L1_BLOCK_ATTRIBUTES,
+            data: abi.encodeWithSelector(L1BlockIsInDependencySetSelector, _id1.chainId),
+            returnData: abi.encode(true)
+        });
+
+        // Ensure that id2's chain ID is in the dependency set
+        vm.mockCall({
+            callee: Predeploys.L1_BLOCK_ATTRIBUTES,
+            data: abi.encodeWithSelector(L1BlockIsInDependencySetSelector, _id2.chainId),
+            returnData: abi.encode(true)
+        });
+
+        // Set the target and message for the reentrant call
+        address target = address(this);
+        bytes memory message = abi.encodeWithSelector(this.mockReentrant.selector, _id2);
+
+        // Ensure that the contract has enough balance to send with value
+        vm.deal(address(this), _value);
+
+        // Look for the call to the target contract
+        vm.expectCall({ callee: target, msgValue: _value, data: message });
+
+        // Call the executeMessage function
+        crossL2Inbox.executeMessage{ value: _value }({ _id: _id1, _target: target, _message: message });
+
+        // Check that the reentrant function didn't update Identifier in transient storage at first call's call depth
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).increment();
+        assertEq(crossL2Inbox.origin(), _id1.origin);
+        assertEq(crossL2Inbox.blockNumber(), _id1.blockNumber);
+        assertEq(crossL2Inbox.logIndex(), _id1.logIndex);
+        assertEq(crossL2Inbox.timestamp(), _id1.timestamp);
+        assertEq(crossL2Inbox.chainId(), _id1.chainId);
+
+        // Check that the reentrant function updated the Identifier at deeper call depth
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).increment();
+        assertEq(crossL2Inbox.origin(), _id2.origin);
+        assertEq(crossL2Inbox.blockNumber(), _id2.blockNumber);
+        assertEq(crossL2Inbox.logIndex(), _id2.logIndex);
+        assertEq(crossL2Inbox.timestamp(), _id2.timestamp);
+        assertEq(crossL2Inbox.chainId(), _id2.chainId);
+    }
+
+    /// @dev Tests that the `executeMessage` function reverts when called with an identifier with an invalid timestamp.
+    function testFuzz_executeMessage_invalidTimestamp_reverts(
+        ICrossL2Inbox.Identifier calldata _id,
+        address _target,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Ensure that the id's timestamp is invalid (greater than the current block timestamp)
+        vm.assume(_id.timestamp > block.timestamp);
+
+        // Ensure that the contract has enough balance to send with value
+        vm.deal(address(this), _value);
+
+        // Expect a revert with the InvalidTimestamp selector
+        vm.expectRevert(InvalidTimestamp.selector);
+
+        // Call the executeMessage function
+        crossL2Inbox.executeMessage{ value: _value }({ _id: _id, _target: _target, _message: _message });
+    }
+
+    /// @dev Tests that the `executeMessage` function reverts when called with an identifier with a chain ID not in
+    /// dependency set.
+    function testFuzz_executeMessage_invalidChainId_reverts(
+        ICrossL2Inbox.Identifier memory _id,
+        address _target,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Ensure that the id's timestamp is valid (less than or equal to the current block timestamp)
+        _id.timestamp = bound(_id.timestamp, 0, block.timestamp);
+
+        // Ensure that the chain ID is NOT in the dependency set
+        vm.mockCall({
+            callee: Predeploys.L1_BLOCK_ATTRIBUTES,
+            data: abi.encodeWithSelector(L1BlockIsInDependencySetSelector, _id.chainId),
+            returnData: abi.encode(false)
+        });
+
+        // Ensure that the contract has enough balance to send with value
+        vm.deal(address(this), _value);
+
+        // Expect a revert with the InvalidChainId selector
+        vm.expectRevert(InvalidChainId.selector);
+
+        // Call the executeMessage function
+        crossL2Inbox.executeMessage{ value: _value }({ _id: _id, _target: _target, _message: _message });
+    }
+
+    /// @dev Tests that the `executeMessage` function reverts when the target call fails.
+    function testFuzz_executeMessage_targetCallFailed_reverts(
+        ICrossL2Inbox.Identifier memory _id,
+        address _target,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Ensure that the id's timestamp is valid (less than or equal to the current block timestamp)
+        _id.timestamp = bound(_id.timestamp, 0, block.timestamp);
+
+        // Ensure that the target call is payable if value is sent
+        if (_value > 0) assumePayable(_target);
+
+        // Ensure that the target call reverts
+        vm.mockCallRevert({ callee: _target, msgValue: _value, data: _message, revertData: abi.encode(false) });
+
+        // Ensure that the chain ID is in the dependency set
+        vm.mockCall({
+            callee: Predeploys.L1_BLOCK_ATTRIBUTES,
+            data: abi.encodeWithSelector(L1BlockIsInDependencySetSelector, _id.chainId),
+            returnData: abi.encode(true)
+        });
+
+        // Ensure that the contract has enough balance to send with value
+        vm.deal(address(this), _value);
+
+        // Look for the call to the target contract
+        vm.expectCall({ callee: _target, msgValue: _value, data: _message });
+
+        // Expect a revert with the TargetCallFailed selector
+        vm.expectRevert(TargetCallFailed.selector);
+
+        // Call the executeMessage function
+        crossL2Inbox.executeMessage{ value: _value }({ _id: _id, _target: _target, _message: _message });
+    }
+
+    /// @dev Tests that the `origin` function returns the correct value.
+    function testFuzz_origin_succeeds(address _origin) external {
+        // Increment the call depth to prevent NotEntered revert
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).increment();
+        // Set origin in the transient storage
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).setOrigin(_origin);
+        // Check that the `origin` function returns the correct value
+        assertEq(crossL2Inbox.origin(), _origin);
+    }
+
+    /// @dev Tests that the `origin` function reverts when not entered.
+    function test_origin_notEntered_reverts() external {
+        // Expect a revert with the NotEntered selector
+        vm.expectRevert(NotEntered.selector);
+        // Call the `origin` function
+        crossL2Inbox.origin();
+    }
+
+    /// @dev Tests that the `blockNumber` function returns the correct value.
+    function testFuzz_blockNumber_succeeds(uint256 _blockNumber) external {
+        // Increment the call depth to prevent NotEntered revert
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).increment();
+        // Set blockNumber in the transient storage
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).setBlockNumber(_blockNumber);
+        // Check that the `blockNumber` function returns the correct value
+        assertEq(crossL2Inbox.blockNumber(), _blockNumber);
+    }
+
+    /// @dev Tests that the `blockNumber` function reverts when not entered.
+    function test_blockNumber_notEntered_reverts() external {
+        // Expect a revert with the NotEntered selector
+        vm.expectRevert(NotEntered.selector);
+        // Call the `blockNumber` function
+        crossL2Inbox.blockNumber();
+    }
+
+    /// @dev Tests that the `logIndex` function returns the correct value.
+    function testFuzz_logIndex_succeeds(uint256 _logIndex) external {
+        // Increment the call depth to prevent NotEntered revert
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).increment();
+        // Set logIndex in the transient storage
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).setLogIndex(_logIndex);
+        // Check that the `logIndex` function returns the correct value
+        assertEq(crossL2Inbox.logIndex(), _logIndex);
+    }
+
+    /// @dev Tests that the `logIndex` function reverts when not entered.
+    function test_logIndex_notEntered_reverts() external {
+        // Expect a revert with the NotEntered selector
+        vm.expectRevert(NotEntered.selector);
+        // Call the `logIndex` function
+        crossL2Inbox.logIndex();
+    }
+
+    /// @dev Tests that the `timestamp` function returns the correct value.
+    function testFuzz_timestamp_succeeds(uint256 _timestamp) external {
+        // Increment the call depth to prevent NotEntered revert
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).increment();
+        // Set timestamp in the transient storage
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).setTimestamp(_timestamp);
+        // Check that the `timestamp` function returns the correct value
+        assertEq(crossL2Inbox.timestamp(), _timestamp);
+    }
+
+    /// @dev Tests that the `timestamp` function reverts when not entered.
+    function test_timestamp_notEntered_reverts() external {
+        // Expect a revert with the NotEntered selector
+        vm.expectRevert(NotEntered.selector);
+        // Call the `timestamp` function
+        crossL2Inbox.timestamp();
+    }
+
+    /// @dev Tests that the `chainId` function returns the correct value.
+    function testFuzz_chainId_succeeds(uint256 _chainId) external {
+        // Increment the call depth to prevent NotEntered revert
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).increment();
+        // Set chainId in the transient storage
+        CrossL2InboxWithModifiableTransientStorage(Predeploys.CROSS_L2_INBOX).setChainId(_chainId);
+        // Check that the `chainId` function returns the correct value
+        assertEq(crossL2Inbox.chainId(), _chainId);
+    }
+
+    /// @dev Tests that the `chainId` function reverts when not entered.
+    function test_chainId_notEntered_reverts() external {
+        // Expect a revert with the NotEntered selector
+        vm.expectRevert(NotEntered.selector);
+        // Call the `chainId` function
+        crossL2Inbox.chainId();
+    }
+}
diff --git a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol
index f829d207d02e..3b04804fb0e2 100644
--- a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol
+++ b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol
@@ -3,6 +3,7 @@ pragma solidity 0.8.15;
 
 // Testing utilities
 import { CommonTest } from "test/setup/CommonTest.sol";
+import { OutputMode } from "scripts/L2Genesis.s.sol";
 
 // Libraries
 import { Encoding } from "src/libraries/Encoding.sol";
@@ -37,7 +38,10 @@ contract GasPriceOracle_Test is CommonTest {
 contract GasPriceOracleBedrock_Test is GasPriceOracle_Test {
     /// @dev Sets up the test suite.
     function setUp() public virtual override {
+        // The gasPriceOracle tests rely on an L2 genesis that is not past Ecotone.
+        l2OutputMode = OutputMode.LOCAL_DELTA;
         super.setUp();
+        assertEq(gasPriceOracle.isEcotone(), false);
 
         vm.prank(depositor);
         l1Block.setL1BlockValues({
@@ -53,7 +57,7 @@ contract GasPriceOracleBedrock_Test is GasPriceOracle_Test {
     }
 
     /// @dev Tests that `l1BaseFee` is set correctly.
-    function test_l1BaseFee_succeeds() external {
+    function test_l1BaseFee_succeeds() external view {
         assertEq(gasPriceOracle.l1BaseFee(), baseFee);
     }
 
@@ -72,17 +76,17 @@ contract GasPriceOracleBedrock_Test is GasPriceOracle_Test {
     }
 
     /// @dev Tests that `scalar` is set correctly.
-    function test_scalar_succeeds() external {
+    function test_scalar_succeeds() external view {
         assertEq(gasPriceOracle.scalar(), l1FeeScalar);
     }
 
     /// @dev Tests that `overhead` is set correctly.
-    function test_overhead_succeeds() external {
+    function test_overhead_succeeds() external view {
         assertEq(gasPriceOracle.overhead(), l1FeeOverhead);
     }
 
     /// @dev Tests that `decimals` is set correctly.
-    function test_decimals_succeeds() external {
+    function test_decimals_succeeds() external view {
         assertEq(gasPriceOracle.decimals(), 6);
         assertEq(gasPriceOracle.DECIMALS(), 6);
     }
@@ -104,12 +108,21 @@ contract GasPriceOracleBedrock_Test is GasPriceOracle_Test {
         assertEq(success, false);
         assertEq(returndata, hex"");
     }
+
+    /// @dev Tests that Fjord cannot be activated without activating Ecotone
+    function test_setFjord_withoutEcotone_reverts() external {
+        vm.prank(depositor);
+        vm.expectRevert("GasPriceOracle: Fjord can only be activated after Ecotone");
+        gasPriceOracle.setFjord();
+    }
 }
 
 contract GasPriceOracleEcotone_Test is GasPriceOracle_Test {
     /// @dev Sets up the test suite.
     function setUp() public virtual override {
+        l2OutputMode = OutputMode.LOCAL_ECOTONE; // activate ecotone
         super.setUp();
+        assertEq(gasPriceOracle.isEcotone(), true);
 
         bytes memory calldataPacked = Encoding.encodeSetL1BlockValuesEcotone(
             baseFeeScalar, blobBaseFeeScalar, sequenceNumber, timestamp, number, baseFee, blobBaseFee, hash, batcherHash
@@ -119,9 +132,6 @@ contract GasPriceOracleEcotone_Test is GasPriceOracle_Test {
         vm.prank(depositor);
         (bool success,) = address(l1Block).call(calldataPacked);
         require(success, "Function call failed");
-
-        vm.prank(depositor);
-        gasPriceOracle.setEcotone();
     }
 
     /// @dev Tests that `setEcotone` is only callable by the depositor.
@@ -157,33 +167,33 @@ contract GasPriceOracleEcotone_Test is GasPriceOracle_Test {
     }
 
     /// @dev Tests that `l1BaseFee` is set correctly.
-    function test_l1BaseFee_succeeds() external {
+    function test_l1BaseFee_succeeds() external view {
         assertEq(gasPriceOracle.l1BaseFee(), baseFee);
     }
 
     /// @dev Tests that `blobBaseFee` is set correctly.
-    function test_blobBaseFee_succeeds() external {
+    function test_blobBaseFee_succeeds() external view {
         assertEq(gasPriceOracle.blobBaseFee(), blobBaseFee);
     }
 
     /// @dev Tests that `baseFeeScalar` is set correctly.
-    function test_baseFeeScalar_succeeds() external {
+    function test_baseFeeScalar_succeeds() external view {
         assertEq(gasPriceOracle.baseFeeScalar(), baseFeeScalar);
     }
 
     /// @dev Tests that `blobBaseFeeScalar` is set correctly.
-    function test_blobBaseFeeScalar_succeeds() external {
+    function test_blobBaseFeeScalar_succeeds() external view {
         assertEq(gasPriceOracle.blobBaseFeeScalar(), blobBaseFeeScalar);
     }
 
     /// @dev Tests that `decimals` is set correctly.
-    function test_decimals_succeeds() external {
+    function test_decimals_succeeds() external view {
         assertEq(gasPriceOracle.decimals(), 6);
         assertEq(gasPriceOracle.DECIMALS(), 6);
     }
 
     /// @dev Tests that `getL1GasUsed` and `getL1Fee` return expected values
-    function test_getL1Fee_succeeds() external {
+    function test_getL1Fee_succeeds() external view {
         bytes memory data = hex"0000010203"; // 2 zero bytes, 3 non-zero bytes
         // (2*4) + (3*16) + (68*16) == 1144
         uint256 gas = gasPriceOracle.getL1GasUsed(data);
@@ -192,4 +202,131 @@ contract GasPriceOracleEcotone_Test is GasPriceOracle_Test {
         // gas * (2M*16*20 + 3M*15) / 16M == 48977.5
         assertEq(price, 48977);
     }
+
+    /// @dev Tests that `setFjord` is only callable by the depositor.
+    function test_setFjord_wrongCaller_reverts() external {
+        vm.expectRevert("GasPriceOracle: only the depositor account can set isFjord flag");
+        gasPriceOracle.setFjord();
+    }
+}
+
+contract GasPriceOracleFjordActive_Test is GasPriceOracle_Test {
+    /// @dev Sets up the test suite.
+    function setUp() public virtual override {
+        l2OutputMode = OutputMode.LOCAL_LATEST; // activate fjord
+        super.setUp();
+
+        bytes memory calldataPacked = Encoding.encodeSetL1BlockValuesEcotone(
+            baseFeeScalar, blobBaseFeeScalar, sequenceNumber, timestamp, number, baseFee, blobBaseFee, hash, batcherHash
+        );
+
+        vm.prank(depositor);
+        (bool success,) = address(l1Block).call(calldataPacked);
+        require(success, "Function call failed");
+    }
+
+    /// @dev Tests that `setFjord` cannot be called when Fjord is already activate
+    function test_setFjord_whenFjordActive_reverts() external {
+        vm.expectRevert("GasPriceOracle: Fjord already active");
+        vm.prank(depositor);
+        gasPriceOracle.setFjord();
+    }
+
+    /// @dev Tests that `gasPrice` is set correctly.
+    function test_gasPrice_succeeds() external {
+        vm.fee(100);
+        uint256 gasPrice = gasPriceOracle.gasPrice();
+        assertEq(gasPrice, 100);
+    }
+
+    /// @dev Tests that `baseFee` is set correctly.
+    function test_baseFee_succeeds() external {
+        vm.fee(64);
+        uint256 gasPrice = gasPriceOracle.baseFee();
+        assertEq(gasPrice, 64);
+    }
+
+    /// @dev Tests that `overhead` reverts since it was removed in ecotone.
+    function test_overhead_legacyFunction_reverts() external {
+        vm.expectRevert("GasPriceOracle: overhead() is deprecated");
+        gasPriceOracle.overhead();
+    }
+
+    /// @dev Tests that `scalar` reverts since it was removed in ecotone.
+    function test_scalar_legacyFunction_reverts() external {
+        vm.expectRevert("GasPriceOracle: scalar() is deprecated");
+        gasPriceOracle.scalar();
+    }
+
+    /// @dev Tests that `l1BaseFee` is set correctly.
+    function test_l1BaseFee_succeeds() external view {
+        assertEq(gasPriceOracle.l1BaseFee(), baseFee);
+    }
+
+    /// @dev Tests that `blobBaseFee` is set correctly.
+    function test_blobBaseFee_succeeds() external view {
+        assertEq(gasPriceOracle.blobBaseFee(), blobBaseFee);
+    }
+
+    /// @dev Tests that `baseFeeScalar` is set correctly.
+    function test_baseFeeScalar_succeeds() external view {
+        assertEq(gasPriceOracle.baseFeeScalar(), baseFeeScalar);
+    }
+
+    /// @dev Tests that `blobBaseFeeScalar` is set correctly.
+    function test_blobBaseFeeScalar_succeeds() external view {
+        assertEq(gasPriceOracle.blobBaseFeeScalar(), blobBaseFeeScalar);
+    }
+
+    /// @dev Tests that `decimals` is set correctly.
+    function test_decimals_succeeds() external view {
+        assertEq(gasPriceOracle.decimals(), 6);
+        assertEq(gasPriceOracle.DECIMALS(), 6);
+    }
+
+    /// @dev Tests that `getL1GasUsed`, `getL1Fee` and `getL1FeeUpperBound` return expected values
+    ///      for the minimum bound of the linear regression
+    function test_getL1FeeMinimumBound_succeeds() external view {
+        bytes memory data = hex"0000010203"; // fastlzSize: 74, inc signature
+        uint256 gas = gasPriceOracle.getL1GasUsed(data);
+        assertEq(gas, 1600); // 100 (minimum size) * 16
+        uint256 price = gasPriceOracle.getL1Fee(data);
+        // linearRegression = -42.5856 + 74 * 0.8365 = 19.3154
+        // under the minTxSize of 100, so linear regression output is ignored
+        // 100_000_000 * (20 * 16 * 2 * 1e6 + 3 * 1e6 * 15) / 1e12
+        assertEq(price, 68500);
+
+        assertEq(data.length, 5);
+        // flzUpperBound = (5 + 68) + ((5 + 68) / 255) + 16 = 89
+        // linearRegression = -42.5856 + 89 * 0.8365 = 31.8629
+        // under the minTxSize of 100, so output is ignored
+        // 100_000_000 * (20 * 16 * 2 * 1e6 + 3 * 1e6 * 15) / 1e12
+        uint256 upperBound = gasPriceOracle.getL1FeeUpperBound(data.length);
+        assertEq(upperBound, 68500);
+    }
+
+    /// @dev Tests that `getL1GasUsed`, `getL1Fee` and `getL1FeeUpperBound` return expected values
+    ///      for a specific test transaction
+    function test_getL1FeeRegression_succeeds() external view {
+        // fastlzSize: 235, inc signature
+        bytes memory data =
+            hex"1d2c3ec4f5a9b3f3cd2c024e455c1143a74bbd637c324adcbd4f74e346786ac44e23e78f47d932abedd8d1"
+            hex"06daadcea350be16478461046273101034601364012364701331dfad43729dc486abd134bcad61b34d6ca1"
+            hex"f2eb31655b7d61ca33ba6d172cdf7d8b5b0ef389a314ca7a9a831c09fc2ca9090d059b4dd25194f3de297b"
+            hex"dba6d6d796e4f80be94f8a9151d685607826e7ba25177b40cb127ea9f1438470";
+
+        uint256 gas = gasPriceOracle.getL1GasUsed(data);
+        assertEq(gas, 2463); // 235 * 16
+        uint256 price = gasPriceOracle.getL1Fee(data);
+        // linearRegression = -42.5856 + 235 * 0.8365 = 153.9919
+        // 153_991_900 * (20 * 16 * 2 * 1e6 + 3 * 1e6 * 15) / 1e12
+        assertEq(price, 105484);
+
+        assertEq(data.length, 161);
+        // flzUpperBound = (161 + 68) + ((161 + 68) / 255) + 16 = 245
+        // linearRegression = -42.5856 + 245 * 0.8365 = 162.3569
+        // 162_356_900 * (20 * 16 * 2 * 1e6 + 3 * 1e6 * 15) / 1e12 == 111,214.4765
+        uint256 upperBound = gasPriceOracle.getL1FeeUpperBound(data.length);
+        assertEq(upperBound, 111214);
+    }
 }
diff --git a/packages/contracts-bedrock/test/L2/L1Block.t.sol b/packages/contracts-bedrock/test/L2/L1Block.t.sol
index 18fd7efea582..ce67a6692223 100644
--- a/packages/contracts-bedrock/test/L2/L1Block.t.sol
+++ b/packages/contracts-bedrock/test/L2/L1Block.t.sol
@@ -6,13 +6,17 @@ import { CommonTest } from "test/setup/CommonTest.sol";
 
 // Libraries
 import { Encoding } from "src/libraries/Encoding.sol";
+import { Constants } from "src/libraries/Constants.sol";
 
 // Target contract
 import { L1Block } from "src/L2/L1Block.sol";
+import "src/libraries/L1BlockErrors.sol";
 
 contract L1BlockTest is CommonTest {
     address depositor;
 
+    event GasPayingTokenSet(address indexed token, uint8 indexed decimals, bytes32 name, bytes32 symbol);
+
     /// @dev Sets up the test suite.
     function setUp() public virtual override {
         super.setUp();
@@ -60,6 +64,21 @@ contract L1BlockBedrock_Test is L1BlockTest {
             _l1FeeScalar: type(uint256).max
         });
     }
+
+    /// @dev Tests that `setL1BlockValues` reverts if sender address is not the depositor
+    function test_updatesValues_notDepositor_reverts() external {
+        vm.expectRevert("L1Block: only the depositor account can set L1 block values");
+        l1Block.setL1BlockValues({
+            _number: type(uint64).max,
+            _timestamp: type(uint64).max,
+            _basefee: type(uint256).max,
+            _hash: keccak256(abi.encode(1)),
+            _sequenceNumber: type(uint64).max,
+            _batcherHash: bytes32(type(uint256).max),
+            _l1FeeOverhead: type(uint256).max,
+            _l1FeeScalar: type(uint256).max
+        });
+    }
 }
 
 contract L1BlockEcotone_Test is L1BlockTest {
@@ -127,8 +146,8 @@ contract L1BlockEcotone_Test is L1BlockTest {
         assertTrue(success, "function call failed");
     }
 
-    /// @dev Tests that `setL1BlockValuesEcotone` fails if sender address is not the depositor
-    function test_setL1BlockValuesEcotone_notDepositor_fails() external {
+    /// @dev Tests that `setL1BlockValuesEcotone` reverts if sender address is not the depositor
+    function test_setL1BlockValuesEcotone_notDepositor_reverts() external {
         bytes memory functionCallDataPacked = Encoding.encodeSetL1BlockValuesEcotone(
             type(uint32).max,
             type(uint32).max,
@@ -148,3 +167,41 @@ contract L1BlockEcotone_Test is L1BlockTest {
         assertEq(data, expReturn);
     }
 }
+
+contract L1BlockCustomGasToken_Test is L1BlockTest {
+    function testFuzz_setGasPayingToken_succeeds(
+        address _token,
+        uint8 _decimals,
+        string memory _name,
+        string memory _symbol
+    )
+        external
+    {
+        vm.assume(_token != address(0));
+        vm.assume(_token != Constants.ETHER);
+        vm.assume(bytes(_name).length <= 32);
+        vm.assume(bytes(_symbol).length <= 32);
+
+        bytes32 name = bytes32(abi.encodePacked(_name));
+        bytes32 symbol = bytes32(abi.encodePacked(_symbol));
+
+        vm.expectEmit(address(l1Block));
+        emit GasPayingTokenSet({ token: _token, decimals: _decimals, name: name, symbol: symbol });
+
+        vm.prank(depositor);
+        l1Block.setGasPayingToken({ _token: _token, _decimals: _decimals, _name: name, _symbol: symbol });
+
+        (address token, uint8 decimals) = l1Block.gasPayingToken();
+        assertEq(token, _token);
+        assertEq(decimals, _decimals);
+
+        assertEq(_name, l1Block.gasPayingTokenName());
+        assertEq(_symbol, l1Block.gasPayingTokenSymbol());
+        assertTrue(l1Block.isCustomGasToken());
+    }
+
+    function test_setGasPayingToken_isDepositor_reverts() external {
+        vm.expectRevert(NotDepositor.selector);
+        l1Block.setGasPayingToken(address(this), 18, "Test", "TST");
+    }
+}
diff --git a/packages/contracts-bedrock/test/L2/L1BlockInterop.t.sol b/packages/contracts-bedrock/test/L2/L1BlockInterop.t.sol
new file mode 100644
index 000000000000..159021e77dcc
--- /dev/null
+++ b/packages/contracts-bedrock/test/L2/L1BlockInterop.t.sol
@@ -0,0 +1,204 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+// Testing utilities
+import { CommonTest } from "test/setup/CommonTest.sol";
+
+// Libraries
+import { StaticConfig } from "src/libraries/StaticConfig.sol";
+
+// Target contract dependencies
+import { L1BlockInterop, ConfigType } from "src/L2/L1BlockInterop.sol";
+import "src/libraries/L1BlockErrors.sol";
+
+contract L1BlockInteropTest is CommonTest {
+    event GasPayingTokenSet(address indexed token, uint8 indexed decimals, bytes32 name, bytes32 symbol);
+    event DependencyAdded(uint256 indexed chainId);
+    event DependencyRemoved(uint256 indexed chainId);
+
+    modifier prankDepositor() {
+        vm.startPrank(l1Block.DEPOSITOR_ACCOUNT());
+        _;
+        vm.stopPrank();
+    }
+
+    /// @notice Marked virtual to be overridden in
+    ///         test/kontrol/deployment/DeploymentSummary.t.sol
+    function setUp() public virtual override {
+        super.enableInterop();
+        super.setUp();
+    }
+
+    /// @dev Tests that an arbitrary chain ID can be added to the dependency set.
+    function testFuzz_isInDependencySet_succeeds(uint256 _chainId) public prankDepositor {
+        vm.assume(_chainId != block.chainid);
+
+        _l1BlockInterop().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId));
+
+        assertTrue(_l1BlockInterop().isInDependencySet(_chainId));
+    }
+
+    /// @dev Tests that `isInDependencySet` returns true when the chain's chain ID is passed as the input.
+    function test_isInDependencySet_chainChainId_succeeds() public view {
+        assertTrue(_l1BlockInterop().isInDependencySet(block.chainid));
+    }
+
+    /// @dev Tests that `isInDependencySet` reverts when the input chain ID is not in the dependency set
+    ///      and is not the chain's chain ID.
+    function testFuzz_isInDependencySet_notDependency_reverts(uint256 _chainId) public view {
+        vm.assume(_chainId != block.chainid);
+
+        // Check that the chain ID is not in the dependency set
+        assertFalse(_l1BlockInterop().isInDependencySet(_chainId));
+    }
+
+    /// @dev Tests that `isInDependencySet` returns false when the dependency set is empty.
+    function testFuzz_isInDependencySet_dependencySetEmpty_succeeds(uint256 _chainId) public view {
+        vm.assume(_chainId != block.chainid);
+
+        assertEq(_l1BlockInterop().dependencySetSize(), 0);
+
+        assertFalse(_l1BlockInterop().isInDependencySet(_chainId));
+    }
+
+    /// @dev Tests that the dependency set size is correct when adding an arbitrary number of chain IDs.
+    function testFuzz_dependencySetSize_succeeds(uint8 _dependencySetSize) public prankDepositor {
+        vm.assume(_dependencySetSize <= type(uint8).max);
+
+        uint256 uniqueCount = 0;
+
+        for (uint256 i = 0; i < _dependencySetSize; i++) {
+            if (i == block.chainid) continue;
+            _l1BlockInterop().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(i));
+            uniqueCount++;
+        }
+
+        assertEq(_l1BlockInterop().dependencySetSize(), uniqueCount);
+    }
+
+    /// @dev Tests that the dependency set size is correct when the dependency set is empty.
+    function test_dependencySetSize_dependencySetEmpty_succeeds() public view {
+        assertEq(_l1BlockInterop().dependencySetSize(), 0);
+    }
+
+    /// @dev Tests that the config for setting the gas paying token succeeds.
+    function testFuzz_setConfig_gasPayingToken_succeeds(
+        address _token,
+        uint8 _decimals,
+        bytes32 _name,
+        bytes32 _symbol
+    )
+        public
+        prankDepositor
+    {
+        vm.assume(_token != address(vm));
+
+        vm.expectEmit(address(l1Block));
+        emit GasPayingTokenSet({ token: _token, decimals: _decimals, name: _name, symbol: _symbol });
+
+        _l1BlockInterop().setConfig(
+            ConfigType.SET_GAS_PAYING_TOKEN,
+            StaticConfig.encodeSetGasPayingToken({ _token: _token, _decimals: _decimals, _name: _name, _symbol: _symbol })
+        );
+    }
+
+    /// @dev Tests that setting the gas paying token config as not the depositor reverts.
+    function testFuzz_setConfig_gasPayingToken_notDepositor_reverts(
+        address _token,
+        uint8 _decimals,
+        bytes32 _name,
+        bytes32 _symbol
+    )
+        public
+    {
+        vm.assume(_token != address(vm));
+
+        vm.expectRevert(NotDepositor.selector);
+        _l1BlockInterop().setConfig(
+            ConfigType.SET_GAS_PAYING_TOKEN,
+            StaticConfig.encodeSetGasPayingToken({ _token: _token, _decimals: _decimals, _name: _name, _symbol: _symbol })
+        );
+    }
+
+    /// @dev Tests that the config for adding a dependency can be set.
+    function testFuzz_setConfig_addDependency_succeeds(uint256 _chainId) public prankDepositor {
+        vm.assume(_chainId != block.chainid);
+
+        vm.expectEmit(address(l1Block));
+        emit DependencyAdded(_chainId);
+
+        _l1BlockInterop().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId));
+    }
+
+    /// @dev Tests that adding a dependency reverts if it's the chain's chain id
+    function test_setConfig_addDependency_chainChainId_reverts() public prankDepositor {
+        vm.expectRevert(AlreadyDependency.selector);
+        _l1BlockInterop().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(block.chainid));
+    }
+
+    /// @dev Tests that adding a dependency already in the set reverts
+    function test_setConfig_addDependency_alreadyDependency_reverts(uint256 _chainId) public prankDepositor {
+        vm.assume(_chainId != block.chainid);
+
+        _l1BlockInterop().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId));
+
+        vm.expectRevert(AlreadyDependency.selector);
+        _l1BlockInterop().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId));
+    }
+
+    /// @dev Tests that setting the add dependency config as not the depositor reverts.
+    function testFuzz_setConfig_addDependency_notDepositor_reverts(uint256 _chainId) public {
+        vm.expectRevert(NotDepositor.selector);
+        _l1BlockInterop().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId));
+    }
+
+    /// @dev Tests that setting the add dependency config when the dependency set size is too large reverts.
+    function test_setConfig_addDependency_dependencySetSizeTooLarge_reverts() public prankDepositor {
+        for (uint256 i = 0; i < type(uint8).max; i++) {
+            _l1BlockInterop().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(i));
+        }
+
+        assertEq(_l1BlockInterop().dependencySetSize(), type(uint8).max);
+
+        vm.expectRevert(DependencySetSizeTooLarge.selector);
+        _l1BlockInterop().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(1));
+    }
+
+    /// @dev Tests that the config for removing a dependency can be set.
+    function testFuzz_setConfig_removeDependency_succeeds(uint256 _chainId) public prankDepositor {
+        vm.assume(_chainId != block.chainid);
+
+        // Add the chain ID to the dependency set before removing it
+        _l1BlockInterop().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId));
+
+        vm.expectEmit(address(l1Block));
+        emit DependencyRemoved(_chainId);
+
+        _l1BlockInterop().setConfig(ConfigType.REMOVE_DEPENDENCY, StaticConfig.encodeRemoveDependency(_chainId));
+    }
+
+    /// @dev Tests that setting the remove dependency config as not the depositor reverts.
+    function testFuzz_setConfig_removeDependency_notDepositor_reverts(uint256 _chainId) public {
+        vm.expectRevert(NotDepositor.selector);
+        _l1BlockInterop().setConfig(ConfigType.REMOVE_DEPENDENCY, StaticConfig.encodeRemoveDependency(_chainId));
+    }
+
+    /// @dev Tests that setting the remove dependency config for the chain's chain ID reverts.
+    function test_setConfig_removeDependency_chainChainId_reverts() public prankDepositor {
+        vm.expectRevert(CantRemovedDependency.selector);
+        _l1BlockInterop().setConfig(ConfigType.REMOVE_DEPENDENCY, StaticConfig.encodeRemoveDependency(block.chainid));
+    }
+
+    /// @dev Tests that setting the remove dependency config for a chain ID that is not in the dependency set reverts.
+    function testFuzz_setConfig_removeDependency_notDependency_reverts(uint256 _chainId) public prankDepositor {
+        vm.assume(_chainId != block.chainid);
+
+        vm.expectRevert(NotDependency.selector);
+        _l1BlockInterop().setConfig(ConfigType.REMOVE_DEPENDENCY, StaticConfig.encodeRemoveDependency(_chainId));
+    }
+
+    /// @dev Returns the L1BlockInterop instance.
+    function _l1BlockInterop() internal view returns (L1BlockInterop) {
+        return L1BlockInterop(address(l1Block));
+    }
+}
diff --git a/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol
index eb9e1f30a91b..c3805b991261 100644
--- a/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol
+++ b/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol
@@ -10,18 +10,20 @@ import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
 import { Hashing } from "src/libraries/Hashing.sol";
 import { Encoding } from "src/libraries/Encoding.sol";
 import { Types } from "src/libraries/Types.sol";
+import { Constants } from "src/libraries/Constants.sol";
 
 // Target contract dependencies
 import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol";
 import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
 import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
+import { OptimismPortal } from "src/L1/OptimismPortal.sol";
 
 contract L2CrossDomainMessenger_Test is Bridge_Initializer {
     /// @dev Receiver address for testing
     address recipient = address(0xabbaacdc);
 
     /// @dev Tests that the implementation is initialized correctly.
-    function test_constructor_succeeds() external {
+    function test_constructor_succeeds() external view {
         L2CrossDomainMessenger impl =
             L2CrossDomainMessenger(EIP1967Helper.getImplementation(deploy.mustGetAddress("L2CrossDomainMessenger")));
         assertEq(address(impl.OTHER_MESSENGER()), address(0));
@@ -30,14 +32,14 @@ contract L2CrossDomainMessenger_Test is Bridge_Initializer {
     }
 
     /// @dev Tests that the proxy is initialized correctly.
-    function test_initialize_succeeds() external {
+    function test_initialize_succeeds() external view {
         assertEq(address(l2CrossDomainMessenger.OTHER_MESSENGER()), address(l1CrossDomainMessenger));
         assertEq(address(l2CrossDomainMessenger.otherMessenger()), address(l1CrossDomainMessenger));
         assertEq(address(l2CrossDomainMessenger.l1CrossDomainMessenger()), address(l1CrossDomainMessenger));
     }
 
     /// @dev Tests that `messageNonce` can be decoded correctly.
-    function test_messageVersion_succeeds() external {
+    function test_messageVersion_succeeds() external view {
         (, uint16 version) = Encoding.decodeVersionedNonce(l2CrossDomainMessenger.messageNonce());
         assertEq(version, l2CrossDomainMessenger.MESSAGE_VERSION());
     }
@@ -226,4 +228,107 @@ contract L2CrossDomainMessenger_Test is Bridge_Initializer {
         assertEq(l2CrossDomainMessenger.successfulMessages(hash), true);
         assertEq(l2CrossDomainMessenger.failedMessages(hash), true);
     }
+
+    /// @dev Tests that sendMessage succeeds with a custom gas token when the call value is zero.
+    function test_sendMessage_customGasToken_noValue_succeeds() external {
+        // Mock the gasPayingToken function to return a custom gas token
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2)));
+
+        bytes memory xDomainCallData =
+            Encoding.encodeCrossDomainMessage(l2CrossDomainMessenger.messageNonce(), alice, recipient, 0, 100, hex"ff");
+        vm.expectCall(
+            address(l2ToL1MessagePasser),
+            abi.encodeWithSelector(
+                L2ToL1MessagePasser.initiateWithdrawal.selector,
+                address(l1CrossDomainMessenger),
+                l2CrossDomainMessenger.baseGas(hex"ff", 100),
+                xDomainCallData
+            )
+        );
+
+        // MessagePassed event
+        vm.expectEmit(true, true, true, true);
+        emit MessagePassed(
+            l2ToL1MessagePasser.messageNonce(),
+            address(l2CrossDomainMessenger),
+            address(l1CrossDomainMessenger),
+            0,
+            l2CrossDomainMessenger.baseGas(hex"ff", 100),
+            xDomainCallData,
+            Hashing.hashWithdrawal(
+                Types.WithdrawalTransaction({
+                    nonce: l2ToL1MessagePasser.messageNonce(),
+                    sender: address(l2CrossDomainMessenger),
+                    target: address(l1CrossDomainMessenger),
+                    value: 0,
+                    gasLimit: l2CrossDomainMessenger.baseGas(hex"ff", 100),
+                    data: xDomainCallData
+                })
+            )
+        );
+
+        vm.prank(alice);
+        l2CrossDomainMessenger.sendMessage(recipient, hex"ff", uint32(100));
+    }
+
+    /// @dev Tests that the sendMessage reverts when call value is non-zero with custom gas token.
+    function test_sendMessage_customGasToken_withValue_reverts() external {
+        // Mock the gasPayingToken function to return a custom gas token
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2)));
+
+        vm.expectRevert("CrossDomainMessenger: cannot send value with custom gas token");
+        l2CrossDomainMessenger.sendMessage{ value: 1 }(recipient, hex"ff", uint32(100));
+    }
+
+    /// @dev Tests that the relayMessage succeeds with a custom gas token when the call value is zero.
+    function test_relayMessage_customGasToken_noValue_succeeds() external {
+        // Mock the gasPayingToken function to return a custom gas token
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2)));
+
+        address target = address(0xabcd);
+        address sender = address(l1CrossDomainMessenger);
+        address caller = AddressAliasHelper.applyL1ToL2Alias(address(l1CrossDomainMessenger));
+
+        vm.expectCall(target, hex"1111");
+
+        vm.prank(caller);
+
+        vm.expectEmit(true, true, true, true);
+
+        bytes32 hash =
+            Hashing.hashCrossDomainMessage(Encoding.encodeVersionedNonce(0, 1), sender, target, 0, 0, hex"1111");
+
+        emit RelayedMessage(hash);
+
+        l2CrossDomainMessenger.relayMessage(
+            Encoding.encodeVersionedNonce(0, 1), // nonce
+            sender,
+            target,
+            0, // value
+            0,
+            hex"1111"
+        );
+
+        // the message hash is in the successfulMessages mapping
+        assert(l2CrossDomainMessenger.successfulMessages(hash));
+        // it is not in the received messages mapping
+        assertEq(l2CrossDomainMessenger.failedMessages(hash), false);
+    }
+
+    /// @dev Tests that the relayMessage reverts when call value is non-zero with custom gas token.
+    ///       The L1CrossDomainMessenger `sendMessage` function cannot send value with a custom gas token.
+    function test_relayMessage_customGasToken_withValue_reverts() external virtual {
+        // Mock the gasPayingToken function to return a custom gas token
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2)));
+        vm.expectRevert("CrossDomainMessenger: value must be zero unless message is from a system address");
+
+        l2CrossDomainMessenger.relayMessage{ value: 1 }(
+            Encoding.encodeVersionedNonce({ _nonce: 0, _version: 1 }),
+            address(0xabcd),
+            address(0xabcd),
+            1, // value
+            0,
+            hex"1111"
+        );
+    }
 }
diff --git a/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol b/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol
index af79149b2a90..b7a3e96bc44b 100644
--- a/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol
+++ b/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol
@@ -74,7 +74,7 @@ contract L2ERC721Bridge_Test is Bridge_Initializer {
     }
 
     /// @dev Tests that the constructor sets the correct variables.
-    function test_constructor_succeeds() public {
+    function test_constructor_succeeds() public view {
         assertEq(address(l2ERC721Bridge.MESSENGER()), address(l2CrossDomainMessenger));
         assertEq(address(l2ERC721Bridge.OTHER_BRIDGE()), address(l1ERC721Bridge));
         assertEq(address(l2ERC721Bridge.messenger()), address(l2CrossDomainMessenger));
@@ -83,7 +83,7 @@ contract L2ERC721Bridge_Test is Bridge_Initializer {
 
     /// @dev Ensures that the L2ERC721Bridge is always not paused. The pausability
     ///      happens on L1 and not L2.
-    function test_paused_succeeds() external {
+    function test_paused_succeeds() external view {
         assertFalse(l2ERC721Bridge.paused());
     }
 
@@ -100,7 +100,7 @@ contract L2ERC721Bridge_Test is Bridge_Initializer {
                     abi.encodeCall(
                         L2ERC721Bridge.finalizeBridgeERC721,
                         (address(remoteToken), address(localToken), alice, alice, tokenId, hex"5678")
-                        ),
+                    ),
                     1234
                 )
             )
@@ -177,7 +177,7 @@ contract L2ERC721Bridge_Test is Bridge_Initializer {
                     abi.encodeCall(
                         L1ERC721Bridge.finalizeBridgeERC721,
                         (address(remoteToken), address(localToken), alice, bob, tokenId, hex"5678")
-                        ),
+                    ),
                     1234
                 )
             )
diff --git a/packages/contracts-bedrock/test/L2/L2StandardBridge.t.sol b/packages/contracts-bedrock/test/L2/L2StandardBridge.t.sol
index db6560dafecb..e07fc0086bd8 100644
--- a/packages/contracts-bedrock/test/L2/L2StandardBridge.t.sol
+++ b/packages/contracts-bedrock/test/L2/L2StandardBridge.t.sol
@@ -25,17 +25,19 @@ contract L2StandardBridge_Test is Bridge_Initializer {
     using stdStorage for StdStorage;
 
     /// @dev Test that the bridge's constructor sets the correct values.
-    function test_constructor_succeeds() external {
+    function test_constructor_succeeds() external view {
         L2StandardBridge impl =
             L2StandardBridge(payable(EIP1967Helper.getImplementation(deploy.mustGetAddress("L2StandardBridge"))));
-        assertEq(address(impl.MESSENGER()), address(0));
-        assertEq(address(impl.messenger()), address(0));
-        assertEq(address(impl.OTHER_BRIDGE()), address(0));
-        assertEq(address(impl.otherBridge()), address(0));
+        // The implementation contract is initialized with a 0 L1 bridge address,
+        // but the L2 cross-domain-messenger is always set to the predeploy address for both proxy and implementation.
+        assertEq(address(impl.MESSENGER()), Predeploys.L2_CROSS_DOMAIN_MESSENGER, "constructor zero check MESSENGER");
+        assertEq(address(impl.messenger()), Predeploys.L2_CROSS_DOMAIN_MESSENGER, "constructor zero check messenger");
+        assertEq(address(impl.OTHER_BRIDGE()), address(0), "constructor zero check OTHER_BRIDGE");
+        assertEq(address(impl.otherBridge()), address(0), "constructor zero check otherBridge");
     }
 
     /// @dev Tests that the bridge is initialized correctly.
-    function test_initialize_succeeds() external {
+    function test_initialize_succeeds() external view {
         assertEq(address(l2StandardBridge.MESSENGER()), address(l2CrossDomainMessenger));
         assertEq(address(l2StandardBridge.messenger()), address(l2CrossDomainMessenger));
         assertEq(l1StandardBridge.l2TokenBridge(), address(l2StandardBridge));
@@ -45,7 +47,7 @@ contract L2StandardBridge_Test is Bridge_Initializer {
 
     /// @dev Ensures that the L2StandardBridge is always not paused. The pausability
     ///      happens on L1 and not L2.
-    function test_paused_succeeds() external {
+    function test_paused_succeeds() external view {
         assertFalse(l2StandardBridge.paused());
     }
 
@@ -84,7 +86,7 @@ contract L2StandardBridge_Test is Bridge_Initializer {
         emit ETHBridgeInitiated(alice, alice, 100, hex"");
 
         // L2ToL1MessagePasser will emit a MessagePassed event
-        vm.expectEmit(true, true, true, true, address(l2ToL1MessagePasser));
+        vm.expectEmit(address(l2ToL1MessagePasser));
         emit MessagePassed(
             nonce,
             address(l2CrossDomainMessenger),
@@ -96,11 +98,11 @@ contract L2StandardBridge_Test is Bridge_Initializer {
         );
 
         // SentMessage event emitted by the CrossDomainMessenger
-        vm.expectEmit(true, true, true, true, address(l2CrossDomainMessenger));
+        vm.expectEmit(address(l2CrossDomainMessenger));
         emit SentMessage(address(l1StandardBridge), address(l2StandardBridge), message, nonce, 200_000);
 
         // SentMessageExtension1 event emitted by the CrossDomainMessenger
-        vm.expectEmit(true, true, true, true, address(l2CrossDomainMessenger));
+        vm.expectEmit(address(l2CrossDomainMessenger));
         emit SentMessageExtension1(address(l2StandardBridge), 100);
 
         vm.expectCall(
@@ -129,13 +131,112 @@ contract L2StandardBridge_Test is Bridge_Initializer {
         assertEq(address(l2ToL1MessagePasser).balance, 100);
     }
 
+    /// @dev Tests that the receive function reverts with custom gas token.
+    function testFuzz_receive_customGasToken_reverts(uint256 _value) external {
+        vm.prank(alice, alice);
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2)));
+        vm.deal(alice, _value);
+        (bool success, bytes memory data) = address(l2StandardBridge).call{ value: _value }(hex"");
+        assertFalse(success);
+        assembly {
+            data := add(data, 0x04)
+        }
+        assertEq(abi.decode(data, (string)), "StandardBridge: cannot bridge ETH with custom gas token");
+    }
+
     /// @dev Tests that `withdraw` reverts if the amount is not equal to the value sent.
     function test_withdraw_insufficientValue_reverts() external {
         assertEq(address(l2ToL1MessagePasser).balance, 0);
 
         vm.expectRevert("StandardBridge: bridging ETH must include sufficient ETH value");
         vm.prank(alice, alice);
-        l2StandardBridge.withdraw(address(Predeploys.LEGACY_ERC20_ETH), 100, 1000, hex"");
+        l2StandardBridge.withdraw{ value: 1 }(address(Predeploys.LEGACY_ERC20_ETH), 100, 1, hex"");
+    }
+
+    /// @dev Tests that `withdraw` reverts when sending value and attempting to withdraw
+    ///      an ERC20 token. This prevents ether from being stuck in the contract.
+    function test_withdraw_erc20WithValue_reverts() external {
+        vm.deal(alice, 100);
+        vm.expectRevert("StandardBridge: cannot send value");
+        vm.prank(alice, alice);
+        l2StandardBridge.withdraw{ value: 100 }(address(L2Token), 100, 1, hex"");
+    }
+
+    /// @dev Tests that `withdrawTo` reverts when sending value and attempting to withdraw
+    ///      an ERC20 token. This prevents ether from being stuck in the contract.
+    function test_withdrawTo_erc20WithValue_reverts() external {
+        vm.deal(alice, 100);
+        vm.expectRevert("StandardBridge: cannot send value");
+        vm.prank(alice, alice);
+        l2StandardBridge.withdrawTo{ value: 100 }(address(L2Token), alice, 100, 1, hex"");
+    }
+
+    /// @dev Tests that `withdraw` reverts with custom gas token.
+    function test_withdraw_customGasToken_reverts() external {
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(18)));
+        vm.expectRevert("L2StandardBridge: not supported with custom gas token");
+        vm.prank(alice, alice);
+        l2StandardBridge.withdraw(address(Predeploys.LEGACY_ERC20_ETH), 1, 1, hex"");
+    }
+
+    /// @dev Tests that `withdraw` reverts with custom gas token.
+    function test_withdrawERC20_customGasToken_reverts() external {
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(18)));
+        vm.expectRevert("L2StandardBridge: not supported with custom gas token");
+        vm.prank(alice, alice);
+        l2StandardBridge.withdraw(address(L1Token), 1, 1, hex"");
+    }
+
+    /// @dev Tests that `withdraw` reverts with custom gas token.
+    function test_withdrawERC20WithValue_customGasToken_reverts() external {
+        vm.deal(alice, 1 ether);
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(18)));
+        vm.expectRevert("L2StandardBridge: not supported with custom gas token");
+        vm.prank(alice, alice);
+        l2StandardBridge.withdraw{ value: 1 ether }(address(L1Token), 1, 1, hex"");
+    }
+
+    /// @dev Tests that `withdraw` with value reverts with custom gas token.
+    function test_withdraw_customGasTokenWithValue_reverts() external {
+        vm.deal(alice, 1 ether);
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(18)));
+        vm.expectRevert("L2StandardBridge: not supported with custom gas token");
+        vm.prank(alice, alice);
+        l2StandardBridge.withdraw{ value: 1 ether }(address(Predeploys.LEGACY_ERC20_ETH), 1, 1, hex"");
+    }
+
+    /// @dev Tests that `withdrawTo` reverts with custom gas token.
+    function test_withdrawTo_customGasToken_reverts() external {
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(18)));
+        vm.expectRevert("L2StandardBridge: not supported with custom gas token");
+        vm.prank(alice, alice);
+        l2StandardBridge.withdrawTo(address(Predeploys.LEGACY_ERC20_ETH), bob, 1, 1, hex"");
+    }
+
+    /// @dev Tests that `withdrawTo` reverts with custom gas token.
+    function test_withdrawToERC20_customGasToken_reverts() external {
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(18)));
+        vm.expectRevert("L2StandardBridge: not supported with custom gas token");
+        vm.prank(alice, alice);
+        l2StandardBridge.withdrawTo(address(L2Token), bob, 1, 1, hex"");
+    }
+
+    /// @dev Tests that `withdrawTo` reverts with custom gas token.
+    function test_withdrawToERC20WithValue_customGasToken_reverts() external {
+        vm.deal(alice, 1 ether);
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(18)));
+        vm.expectRevert("L2StandardBridge: not supported with custom gas token");
+        vm.prank(alice, alice);
+        l2StandardBridge.withdrawTo{ value: 1 ether }(address(L2Token), bob, 1, 1, hex"");
+    }
+
+    /// @dev Tests that `withdrawTo` with value reverts with custom gas token.
+    function test_withdrawTo_customGasTokenWithValue_reverts() external {
+        vm.deal(alice, 1 ether);
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(18)));
+        vm.expectRevert("L2StandardBridge: not supported with custom gas token");
+        vm.prank(alice, alice);
+        l2StandardBridge.withdrawTo{ value: 1 ether }(address(Predeploys.LEGACY_ERC20_ETH), bob, 1, 1, hex"");
     }
 
     /// @dev Tests that the legacy `withdraw` interface on the L2StandardBridge
@@ -144,7 +245,7 @@ contract L2StandardBridge_Test is Bridge_Initializer {
         assertTrue(alice.balance >= 100);
         assertEq(Predeploys.L2_TO_L1_MESSAGE_PASSER.balance, 0);
 
-        vm.expectEmit(true, true, true, true, address(l2StandardBridge));
+        vm.expectEmit(address(l2StandardBridge));
         emit WithdrawalInitiated({
             l1Token: address(0),
             l2Token: Predeploys.LEGACY_ERC20_ETH,
@@ -154,7 +255,7 @@ contract L2StandardBridge_Test is Bridge_Initializer {
             data: hex""
         });
 
-        vm.expectEmit(true, true, true, true, address(l2StandardBridge));
+        vm.expectEmit(address(l2StandardBridge));
         emit ETHBridgeInitiated({ from: alice, to: alice, amount: 100, data: hex"" });
 
         vm.prank(alice, alice);
@@ -338,13 +439,13 @@ contract PreBridgeERC20To is Bridge_Initializer {
             })
         );
 
-        vm.expectEmit(true, true, true, true, address(l2StandardBridge));
+        vm.expectEmit(address(l2StandardBridge));
         emit WithdrawalInitiated(address(L1Token), _l2Token, alice, bob, 100, hex"");
 
-        vm.expectEmit(true, true, true, true, address(l2StandardBridge));
+        vm.expectEmit(address(l2StandardBridge));
         emit ERC20BridgeInitiated(_l2Token, address(L1Token), alice, bob, 100, hex"");
 
-        vm.expectEmit(true, true, true, true, address(l2ToL1MessagePasser));
+        vm.expectEmit(address(l2ToL1MessagePasser));
         emit MessagePassed(
             nonce,
             address(l2CrossDomainMessenger),
@@ -356,11 +457,11 @@ contract PreBridgeERC20To is Bridge_Initializer {
         );
 
         // SentMessage event emitted by the CrossDomainMessenger
-        vm.expectEmit(true, true, true, true, address(l2CrossDomainMessenger));
+        vm.expectEmit(address(l2CrossDomainMessenger));
         emit SentMessage(address(l1StandardBridge), address(l2StandardBridge), message, nonce, 1000);
 
         // SentMessageExtension1 event emitted by the CrossDomainMessenger
-        vm.expectEmit(true, true, true, true, address(l2CrossDomainMessenger));
+        vm.expectEmit(address(l2CrossDomainMessenger));
         emit SentMessageExtension1(address(l2StandardBridge), 0);
 
         if (_isLegacy) {
@@ -419,93 +520,131 @@ contract L2StandardBridge_BridgeERC20To_Test is PreBridgeERC20To {
 }
 
 contract L2StandardBridge_Bridge_Test is Bridge_Initializer {
-    /// @dev Tests that `finalizeDeposit` succeeds. It should:
-    ///      - only be callable by the l1TokenBridge
-    ///      - emit `DepositFinalized` if the token pair is supported
-    ///      - call `Withdrawer.initiateWithdrawal` if the token pair is not supported
-    function test_finalizeDeposit_depositingERC20_succeeds() external {
+    /// @dev Tests that `finalizeBridgeETH` reverts if the recipient is the other bridge.
+    function test_finalizeBridgeETH_sendToSelf_reverts() external {
         vm.mockCall(
             address(l2StandardBridge.messenger()),
             abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector),
             abi.encode(address(l2StandardBridge.OTHER_BRIDGE()))
         );
-
-        vm.expectCall(address(L2Token), abi.encodeWithSelector(OptimismMintableERC20.mint.selector, alice, 100));
-
-        // Should emit both the bedrock and legacy events
-        vm.expectEmit(true, true, true, true, address(l2StandardBridge));
-        emit DepositFinalized(address(L1Token), address(L2Token), alice, alice, 100, hex"");
-
-        vm.expectEmit(true, true, true, true, address(l2StandardBridge));
-        emit ERC20BridgeFinalized(address(L2Token), address(L1Token), alice, alice, 100, hex"");
-
+        vm.deal(address(l2CrossDomainMessenger), 100);
         vm.prank(address(l2CrossDomainMessenger));
-        l2StandardBridge.finalizeDeposit(address(L1Token), address(L2Token), alice, alice, 100, hex"");
+        vm.expectRevert("StandardBridge: cannot send to self");
+        l2StandardBridge.finalizeBridgeETH{ value: 100 }(alice, address(l2StandardBridge), 100, hex"");
     }
 
-    /// @dev Tests that `finalizeDeposit` succeeds when depositing ETH.
-    function test_finalizeDeposit_depositingETH_succeeds() external {
+    /// @dev Tests that `finalizeBridgeETH` reverts if the recipient is the messenger.
+    function test_finalizeBridgeETH_sendToMessenger_reverts() external {
         vm.mockCall(
             address(l2StandardBridge.messenger()),
             abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector),
             abi.encode(address(l2StandardBridge.OTHER_BRIDGE()))
         );
+        vm.deal(address(l2CrossDomainMessenger), 100);
+        vm.prank(address(l2CrossDomainMessenger));
+        vm.expectRevert("StandardBridge: cannot send to messenger");
+        l2StandardBridge.finalizeBridgeETH{ value: 100 }(alice, address(l2CrossDomainMessenger), 100, hex"");
+    }
 
-        // Should emit both the bedrock and legacy events
-        vm.expectEmit(true, true, true, true, address(l2StandardBridge));
-        emit DepositFinalized(address(L1Token), address(L2Token), alice, alice, 100, hex"");
+    /// @dev Tests that bridging ETH succeeds.
+    function testFuzz_bridgeETH_succeeds(uint256 _value, uint32 _minGasLimit, bytes calldata _extraData) external {
+        uint256 nonce = l2CrossDomainMessenger.messageNonce();
 
-        vm.expectEmit(true, true, true, true, address(l2StandardBridge));
-        emit ERC20BridgeFinalized(
-            address(L2Token), // localToken
-            address(L1Token), // remoteToken
-            alice,
-            alice,
-            100,
-            hex""
+        bytes memory message =
+            abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, alice, _value, _extraData);
+
+        vm.expectCall(
+            address(l2StandardBridge),
+            _value,
+            abi.encodeWithSelector(l2StandardBridge.bridgeETH.selector, _minGasLimit, _extraData)
         );
 
-        vm.prank(address(l2CrossDomainMessenger));
-        l2StandardBridge.finalizeDeposit(address(L1Token), address(L2Token), alice, alice, 100, hex"");
+        vm.expectCall(
+            address(l2CrossDomainMessenger),
+            _value,
+            abi.encodeWithSelector(
+                CrossDomainMessenger.sendMessage.selector, address(l1StandardBridge), message, _minGasLimit
+            )
+        );
+
+        vm.expectEmit(address(l2StandardBridge));
+        emit ETHBridgeInitiated(alice, alice, _value, _extraData);
+
+        // SentMessage event emitted by the CrossDomainMessenger
+        vm.expectEmit(address(l2CrossDomainMessenger));
+        emit SentMessage(address(l1StandardBridge), address(l2StandardBridge), message, nonce, _minGasLimit);
+
+        // SentMessageExtension1 event emitted by the CrossDomainMessenger
+        vm.expectEmit(address(l2CrossDomainMessenger));
+        emit SentMessageExtension1(address(l2StandardBridge), _value);
+
+        vm.deal(alice, _value);
+        vm.prank(alice, alice);
+
+        l2StandardBridge.bridgeETH{ value: _value }(_minGasLimit, _extraData);
     }
 
-    /// @dev Tests that `finalizeDeposit` reverts if the amounts do not match.
-    function test_finalizeBridgeETH_incorrectValue_reverts() external {
-        vm.mockCall(
-            address(l2StandardBridge.messenger()),
-            abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector),
-            abi.encode(address(l2StandardBridge.OTHER_BRIDGE()))
-        );
-        vm.deal(address(l2CrossDomainMessenger), 100);
-        vm.prank(address(l2CrossDomainMessenger));
-        vm.expectRevert("StandardBridge: amount sent does not match amount required");
-        l2StandardBridge.finalizeBridgeETH{ value: 50 }(alice, alice, 100, hex"");
+    /// @dev Tests that bridging reverts with custom gas token.
+    function test_bridgeETH_customGasToken_reverts() external {
+        vm.prank(alice, alice);
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2)));
+        vm.expectRevert("StandardBridge: cannot bridge ETH with custom gas token");
+
+        l2StandardBridge.bridgeETH(50000, hex"dead");
     }
 
-    /// @dev Tests that `finalizeDeposit` reverts if the receipient is the other bridge.
-    function test_finalizeBridgeETH_sendToSelf_reverts() external {
-        vm.mockCall(
-            address(l2StandardBridge.messenger()),
-            abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector),
-            abi.encode(address(l2StandardBridge.OTHER_BRIDGE()))
+    /// @dev Tests that bridging ETH to a different address succeeds.
+    function testFuzz_bridgeETHTo_succeeds(uint256 _value, uint32 _minGasLimit, bytes calldata _extraData) external {
+        uint256 nonce = l2CrossDomainMessenger.messageNonce();
+
+        vm.expectCall(
+            address(l2StandardBridge),
+            _value,
+            abi.encodeWithSelector(l1StandardBridge.bridgeETHTo.selector, bob, _minGasLimit, _extraData)
         );
-        vm.deal(address(l2CrossDomainMessenger), 100);
-        vm.prank(address(l2CrossDomainMessenger));
-        vm.expectRevert("StandardBridge: cannot send to self");
-        l2StandardBridge.finalizeBridgeETH{ value: 100 }(alice, address(l2StandardBridge), 100, hex"");
-    }
 
-    /// @dev Tests that `finalizeDeposit` reverts if the receipient is the messenger.
-    function test_finalizeBridgeETH_sendToMessenger_reverts() external {
-        vm.mockCall(
-            address(l2StandardBridge.messenger()),
-            abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector),
-            abi.encode(address(l2StandardBridge.OTHER_BRIDGE()))
+        bytes memory message =
+            abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, bob, _value, _extraData);
+
+        // the L2 bridge should call
+        // L2CrossDomainMessenger.sendMessage
+        vm.expectCall(
+            address(l2CrossDomainMessenger),
+            abi.encodeWithSelector(
+                CrossDomainMessenger.sendMessage.selector, address(l1StandardBridge), message, _minGasLimit
+            )
         );
-        vm.deal(address(l2CrossDomainMessenger), 100);
-        vm.prank(address(l2CrossDomainMessenger));
-        vm.expectRevert("StandardBridge: cannot send to messenger");
-        l2StandardBridge.finalizeBridgeETH{ value: 100 }(alice, address(l2CrossDomainMessenger), 100, hex"");
+
+        vm.expectEmit(address(l2StandardBridge));
+        emit ETHBridgeInitiated(alice, bob, _value, _extraData);
+
+        // SentMessage event emitted by the CrossDomainMessenger
+        vm.expectEmit(address(l2CrossDomainMessenger));
+        emit SentMessage(address(l1StandardBridge), address(l2StandardBridge), message, nonce, _minGasLimit);
+
+        // SentMessageExtension1 event emitted by the CrossDomainMessenger
+        vm.expectEmit(address(l2CrossDomainMessenger));
+        emit SentMessageExtension1(address(l2StandardBridge), _value);
+
+        // deposit eth to bob
+        vm.deal(alice, _value);
+        vm.prank(alice, alice);
+
+        l2StandardBridge.bridgeETHTo{ value: _value }(bob, _minGasLimit, _extraData);
+    }
+
+    /// @dev Tests that bridging reverts with custom gas token.
+    function testFuzz_bridgeETHTo_customGasToken_reverts(
+        uint256 _value,
+        uint32 _minGasLimit,
+        bytes calldata _extraData
+    )
+        external
+    {
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2)));
+        vm.expectRevert("StandardBridge: cannot bridge ETH with custom gas token");
+        vm.deal(address(this), _value);
+        l2StandardBridge.bridgeETHTo{ value: _value }(bob, _minGasLimit, _extraData);
     }
 }
 
@@ -529,4 +668,20 @@ contract L2StandardBridge_FinalizeBridgeETH_Test is Bridge_Initializer {
 
         l2StandardBridge.finalizeBridgeETH{ value: 100 }(alice, alice, 100, hex"");
     }
+
+    /// @dev Tests that finalizing bridged reverts with custom gas token.
+    function test_finalizeBridgeETH_customGasToken_reverts() external {
+        address messenger = address(l2StandardBridge.messenger());
+        vm.mockCall(
+            messenger,
+            abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector),
+            abi.encode(address(l2StandardBridge.OTHER_BRIDGE()))
+        );
+        vm.deal(address(l2CrossDomainMessenger), 1);
+        vm.prank(address(l2CrossDomainMessenger));
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingToken()"), abi.encode(address(1), uint8(2)));
+        vm.expectRevert("StandardBridge: cannot bridge ETH with custom gas token");
+
+        l2StandardBridge.finalizeBridgeETH(alice, alice, 1, hex"");
+    }
 }
diff --git a/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol
new file mode 100644
index 000000000000..1478d8dabc04
--- /dev/null
+++ b/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol
@@ -0,0 +1,734 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.25;
+
+// Testing utilities
+import { Test } from "forge-std/Test.sol";
+import { Vm } from "forge-std/Vm.sol";
+
+// Libraries
+import { Predeploys } from "src/libraries/Predeploys.sol";
+
+// Target contract
+import {
+    L2ToL2CrossDomainMessenger,
+    NotEntered,
+    MessageDestinationSameChain,
+    RelayMessageCallerNotCrossL2Inbox,
+    CrossL2InboxOriginNotL2ToL2CrossDomainMessenger,
+    MessageDestinationNotRelayChain,
+    MessageTargetCrossL2Inbox,
+    MessageTargetL2ToL2CrossDomainMessenger,
+    MessageAlreadyRelayed,
+    ReentrantCall
+} from "src/L2/L2ToL2CrossDomainMessenger.sol";
+import { CrossL2Inbox } from "src/L2/CrossL2Inbox.sol";
+
+/// @title L2ToL2CrossDomainMessengerWithModifiableTransientStorage
+/// @dev L2ToL2CrossDomainMessenger contract with methods to modify the transient storage.
+///      This is used to test the transient storage of L2ToL2CrossDomainMessenger.
+contract L2ToL2CrossDomainMessengerWithModifiableTransientStorage is L2ToL2CrossDomainMessenger {
+    /// @dev Returns the value of the entered slot in transient storage.
+    /// @return Value of the entered slot.
+    function entered() external view returns (bool) {
+        return _entered();
+    }
+
+    /// @dev Sets the entered slot value in transient storage.
+    /// @param _value Value to set.
+    function setEntered(uint256 _value) external {
+        assembly {
+            tstore(ENTERED_SLOT, _value)
+        }
+    }
+
+    /// @dev Sets the cross domain messenger sender in transient storage.
+    /// @param _sender Sender address to set.
+    function setCrossDomainMessageSender(address _sender) external {
+        assembly {
+            tstore(CROSS_DOMAIN_MESSAGE_SENDER_SLOT, _sender)
+        }
+    }
+
+    /// @dev Sets the cross domain messenger source in transient storage.
+    /// @param _source Source chain ID to set.
+    function setCrossDomainMessageSource(uint256 _source) external {
+        assembly {
+            tstore(CROSS_DOMAIN_MESSAGE_SOURCE_SLOT, _source)
+        }
+    }
+}
+
+/// @title L2ToL2CrossDomainMessengerTest
+/// @dev Contract for testing the L2ToL2CrossDomainMessenger contract.
+contract L2ToL2CrossDomainMessengerTest is Test {
+    /// @dev L2ToL2CrossDomainMessenger contract instance with modifiable transient storage.
+    L2ToL2CrossDomainMessengerWithModifiableTransientStorage l2ToL2CrossDomainMessenger;
+
+    /// @dev Sets up the test suite.
+    function setUp() public {
+        // Deploy the L2ToL2CrossDomainMessenger contract
+        vm.etch(
+            Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER,
+            address(new L2ToL2CrossDomainMessengerWithModifiableTransientStorage()).code
+        );
+        l2ToL2CrossDomainMessenger =
+            L2ToL2CrossDomainMessengerWithModifiableTransientStorage(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER);
+    }
+
+    /// @dev Tests that `sendMessage` succeeds and emits the correct SentMessage event.
+    function testFuzz_sendMessage_succeeds(
+        uint256 _destination,
+        address _target,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Ensure the destination is not the same as the source, otherwise the function will revert
+        vm.assume(_destination != block.chainid);
+
+        // Ensure that the target contract is not CrossL2Inbox or L2ToL2CrossDomainMessenger
+        vm.assume(_target != Predeploys.CROSS_L2_INBOX && _target != Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER);
+
+        // Get the current message nonce
+        uint256 messageNonce = l2ToL2CrossDomainMessenger.messageNonce();
+
+        // Add sufficient value to the contract to send the message with
+        vm.deal(address(this), _value);
+
+        // Look for correct emitted event
+        vm.recordLogs();
+
+        // Call the sendMessage function
+        l2ToL2CrossDomainMessenger.sendMessage{ value: _value }({
+            _destination: _destination,
+            _target: _target,
+            _message: _message
+        });
+
+        // Check that the SentMessage event was emitted with the correct parameters
+        Vm.Log[] memory logs = vm.getRecordedLogs();
+        assertEq(logs.length, 1);
+        assertEq(
+            abi.decode(logs[0].data, (bytes)),
+            abi.encodeCall(
+                L2ToL2CrossDomainMessenger.relayMessage,
+                (_destination, block.chainid, messageNonce, address(this), _target, _message)
+            )
+        );
+
+        // Check that the message nonce has been incremented
+        assertEq(l2ToL2CrossDomainMessenger.messageNonce(), messageNonce + 1);
+    }
+
+    /// @dev Tests that the `sendMessage` function reverts when destination is the same as the source chain.
+    function testFuzz_sendMessage_destinationSameChain_reverts(address _target, bytes calldata _message) external {
+        // Expect a revert with the MessageDestinationSameChain selector
+        vm.expectRevert(MessageDestinationSameChain.selector);
+
+        // Call `sendMessage` with the current chain as the destination to prevent revert due to invalid destination
+        l2ToL2CrossDomainMessenger.sendMessage({ _destination: block.chainid, _target: _target, _message: _message });
+    }
+
+    /// @dev Tests that the `sendMessage` function reverts when the target is CrossL2Inbox.
+    function testFuzz_sendMessage_targetCrossL2Inbox_reverts(uint256 _destination, bytes calldata _message) external {
+        // Ensure the destination is not the same as the source, otherwise the function will revert regardless of target
+        vm.assume(_destination != block.chainid);
+
+        // Expect a revert with the MessageTargetCrossL2Inbox selector
+        vm.expectRevert(MessageTargetCrossL2Inbox.selector);
+
+        // Call `senderMessage` with the CrossL2Inbox as the target to provoke revert
+        l2ToL2CrossDomainMessenger.sendMessage({
+            _destination: _destination,
+            _target: Predeploys.CROSS_L2_INBOX,
+            _message: _message
+        });
+    }
+
+    /// @dev Tests that the `sendMessage` function reverts when the target is L2ToL2CrossDomainMessenger.
+    function testFuzz_sendMessage_targetL2ToL2CrossDomainMessenger_reverts(
+        uint256 _destination,
+        bytes calldata _message
+    )
+        external
+    {
+        // Ensure the destination is not the same as the source, otherwise the function will revert regardless of target
+        vm.assume(_destination != block.chainid);
+
+        // Expect a revert with the MessageTargetL2ToL2CrossDomainMessenger selector
+        vm.expectRevert(MessageTargetL2ToL2CrossDomainMessenger.selector);
+
+        // Call `senderMessage` with the L2ToL2CrossDomainMessenger as the target to provoke revert
+        l2ToL2CrossDomainMessenger.sendMessage({
+            _destination: _destination,
+            _target: Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER,
+            _message: _message
+        });
+    }
+
+    /// @dev Tests that the `relayMessage` function succeeds and emits the correct RelayedMessage event.
+    function testFuzz_relayMessage_succeeds(
+        uint256 _source,
+        uint256 _nonce,
+        address _sender,
+        address _target,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Ensure that the target contract is not CrossL2Inbox or L2ToL2CrossDomainMessenger
+        vm.assume(_target != Predeploys.CROSS_L2_INBOX && _target != Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER);
+
+        // Ensure that the target call is payable if value is sent
+        if (_value > 0) assumePayable(_target);
+
+        // Ensure that the target contract does not revert
+        vm.mockCall({ callee: _target, msgValue: _value, data: _message, returnData: abi.encode(true) });
+
+        // Mock the CrossL2Inbox origin to return the L2ToL2CrossDomainMessenger contract
+        vm.mockCall({
+            callee: Predeploys.CROSS_L2_INBOX,
+            data: abi.encodeWithSelector(CrossL2Inbox.origin.selector),
+            returnData: abi.encode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER)
+        });
+
+        // Look for correct emitted event
+        vm.expectEmit(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER);
+        emit L2ToL2CrossDomainMessenger.RelayedMessage(
+            keccak256(abi.encode(block.chainid, _source, _nonce, _sender, _target, _message))
+        );
+
+        // Ensure the target contract is called with the correct parameters
+        vm.expectCall({ callee: _target, msgValue: _value, data: _message });
+
+        // Ensure caller is CrossL2Inbox to prevent a revert from the caller check and that it has sufficient value
+        hoax(Predeploys.CROSS_L2_INBOX, _value);
+
+        // Call the relayMessage function
+        l2ToL2CrossDomainMessenger.relayMessage{ value: _value }({
+            _destination: block.chainid, // ensure the destination is the chain of L2ToL2CrossDomainMessenger
+            _source: _source,
+            _nonce: _nonce,
+            _sender: _sender,
+            _target: _target,
+            _message: _message
+        });
+
+        // Check that successfulMessages mapping updates the message hash correctly
+        assertEq(
+            l2ToL2CrossDomainMessenger.successfulMessages(
+                keccak256(abi.encode(block.chainid, _source, _nonce, _sender, _target, _message))
+            ),
+            true
+        );
+
+        // Check that entered slot is cleared after the function call
+        assertEq(l2ToL2CrossDomainMessenger.entered(), false);
+
+        // Check that metadata is cleared after the function call. We need to set the `entered` slot to non-zero value
+        // to prevent NotEntered revert when calling the crossDomainMessageSender and crossDomainMessageSource functions
+        l2ToL2CrossDomainMessenger.setEntered(1);
+        assertEq(l2ToL2CrossDomainMessenger.crossDomainMessageSource(), 0);
+        assertEq(l2ToL2CrossDomainMessenger.crossDomainMessageSender(), address(0));
+    }
+
+    /// @dev Mock target function that checks the source and sender of the message in transient storage.
+    /// @param _source Source chain ID of the message.
+    /// @param _sender Sender of the message.
+    function mockTarget(uint256 _source, address _sender) external payable {
+        // Ensure that the contract is entered
+        assertEq(l2ToL2CrossDomainMessenger.entered(), true);
+
+        // Ensure that the sender is correct
+        assertEq(l2ToL2CrossDomainMessenger.crossDomainMessageSource(), _source);
+
+        // Ensure that the source is correct
+        assertEq(l2ToL2CrossDomainMessenger.crossDomainMessageSender(), _sender);
+    }
+
+    /// @dev Tests that the `relayMessage` function succeeds and stores the correct metadata in transient storage.
+    function testFuzz_relayMessage_metadataStore_succeeds(
+        uint256 _source,
+        uint256 _nonce,
+        address _sender,
+        uint256 _value
+    )
+        external
+    {
+        // Since the target is this contract, we want to ensure the payment doesn't lead to overflow, since this
+        // contract has a non-zero balance. Thus, we set this contract's balance to zero and we hoax afterwards.
+        vm.deal(address(this), 0);
+
+        // Mock the CrossL2Inbox origin to return the L2ToL2CrossDomainMessenger contract
+        vm.mockCall({
+            callee: Predeploys.CROSS_L2_INBOX,
+            data: abi.encodeWithSelector(CrossL2Inbox.origin.selector),
+            returnData: abi.encode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER)
+        });
+
+        // Set the target and message for the reentrant call
+        address target = address(this);
+        bytes memory message = abi.encodeWithSelector(this.mockTarget.selector, _source, _sender);
+
+        // Look for correct emitted event
+        vm.expectEmit(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER);
+        emit L2ToL2CrossDomainMessenger.RelayedMessage(
+            keccak256(abi.encode(block.chainid, _source, _nonce, _sender, target, message))
+        );
+
+        // Ensure the target contract is called with the correct parameters
+        vm.expectCall({ callee: target, msgValue: _value, data: message });
+
+        // Ensure caller is CrossL2Inbox to prevent a revert from the caller check and that it has sufficient value
+        hoax(Predeploys.CROSS_L2_INBOX, _value);
+
+        // Call the relayMessage function
+        l2ToL2CrossDomainMessenger.relayMessage{ value: _value }({
+            _destination: block.chainid, // ensure the destination is the chain of L2ToL2CrossDomainMessenger
+            _source: _source,
+            _nonce: _nonce,
+            _sender: _sender,
+            _target: target,
+            _message: message
+        });
+
+        // Check that successfulMessages mapping updates the message hash correctly
+        assertEq(
+            l2ToL2CrossDomainMessenger.successfulMessages(
+                keccak256(abi.encode(block.chainid, _source, _nonce, _sender, target, message))
+            ),
+            true
+        );
+
+        // Check that entered slot is cleared after the function call
+        assertEq(l2ToL2CrossDomainMessenger.entered(), false);
+
+        // Check that metadata is cleared after the function call. We need to set the `entered` slot to non-zero value
+        // to prevent NotEntered revert when calling the crossDomainMessageSender and crossDomainMessageSource functions
+        l2ToL2CrossDomainMessenger.setEntered(1);
+        assertEq(l2ToL2CrossDomainMessenger.crossDomainMessageSource(), 0);
+        assertEq(l2ToL2CrossDomainMessenger.crossDomainMessageSender(), address(0));
+    }
+
+    /// @dev Mock reentrant function that calls the `relayMessage` function.
+    /// @param _source Source chain ID of the message.
+    /// @param _nonce Nonce of the message.
+    /// @param _sender Sender of the message.
+    function mockTargetReentrant(uint256 _source, uint256 _nonce, address _sender) external payable {
+        // Ensure caller is CrossL2Inbox to prevent a revert from the caller check
+        vm.prank(Predeploys.CROSS_L2_INBOX);
+
+        // Ensure that the contract is entered
+        assertEq(l2ToL2CrossDomainMessenger.entered(), true);
+
+        vm.expectRevert(ReentrantCall.selector);
+
+        l2ToL2CrossDomainMessenger.relayMessage({
+            _destination: block.chainid,
+            _source: _source,
+            _nonce: _nonce,
+            _sender: _sender,
+            _target: address(0),
+            _message: ""
+        });
+
+        // Ensure the function still reverts if `expectRevert` succeeds
+        revert();
+    }
+
+    /// @dev Tests that the `relayMessage` function reverts when reentrancy is attempted.
+    function testFuzz_relayMessage_reentrant_reverts(
+        uint256 _source1, // source passed to `relayMessage` by the initial call.
+        address _sender1, // sender passed to `relayMessage` by the initial call.
+        uint256 _source2, // sender passed to `relayMessage` by the reentrant call.
+        address _sender2, // sender passed to `relayMessage` by the reentrant call.
+        uint256 _nonce,
+        uint256 _value
+    )
+        external
+    {
+        // Since the target is this contract, we want to ensure the payment doesn't lead to overflow, since this
+        // contract has a non-zero balance. Thus, we set this contract's balance to zero and we hoax afterwards.
+        vm.deal(address(this), 0);
+
+        // Mock the CrossL2Inbox origin to return the L2ToL2CrossDomainMessenger contract
+        vm.mockCall({
+            callee: Predeploys.CROSS_L2_INBOX,
+            data: abi.encodeWithSelector(CrossL2Inbox.origin.selector),
+            returnData: abi.encode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER)
+        });
+
+        // Set the target and message for the reentrant call
+        address target = address(this);
+        bytes memory message = abi.encodeWithSelector(this.mockTargetReentrant.selector, _source2, _nonce, _sender2);
+
+        // Look for correct emitted event
+        vm.expectEmit(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER);
+        emit L2ToL2CrossDomainMessenger.FailedRelayedMessage(
+            keccak256(abi.encode(block.chainid, _source1, _nonce, _sender1, target, message))
+        );
+
+        // Ensure the target contract is called with the correct parameters
+        vm.expectCall({ callee: target, msgValue: _value, data: message });
+
+        // Ensure caller is CrossL2Inbox to prevent a revert from the caller check and that it has sufficient value
+        hoax(Predeploys.CROSS_L2_INBOX, _value);
+
+        // Call the relayMessage function
+        l2ToL2CrossDomainMessenger.relayMessage{ value: _value }({
+            _destination: block.chainid, // ensure the destination is the chain of L2ToL2CrossDomainMessenger
+            _source: _source1,
+            _nonce: _nonce,
+            _sender: _sender1,
+            _target: target,
+            _message: message
+        });
+
+        // Check that entered slot is cleared after the function call
+        assertEq(l2ToL2CrossDomainMessenger.entered(), false);
+
+        // Check that metadata is cleared after the function call. We need to set the `entered` slot to non-zero value
+        // to prevent NotEntered revert when calling the crossDomainMessageSender and crossDomainMessageSource functions
+        l2ToL2CrossDomainMessenger.setEntered(1);
+        assertEq(l2ToL2CrossDomainMessenger.crossDomainMessageSource(), 0);
+        assertEq(l2ToL2CrossDomainMessenger.crossDomainMessageSender(), address(0));
+    }
+
+    /// @dev Tests that the `relayMessage` function reverts when the caller is not the CrossL2Inbox contract.
+    function testFuzz_relayMessage_callerNotCrossL2Inbox_reverts(
+        uint256 _destination,
+        uint256 _source,
+        uint256 _nonce,
+        address _sender,
+        address _target,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Add sufficient value to the contract to relay the message with
+        vm.deal(address(this), _value);
+
+        // Expect a revert with the RelayMessageCallerNotCrossL2Inbox selector
+        vm.expectRevert(RelayMessageCallerNotCrossL2Inbox.selector);
+
+        // Call `relayMessage` with the current contract as the caller to provoke revert
+        l2ToL2CrossDomainMessenger.relayMessage{ value: _value }({
+            _destination: _destination,
+            _source: _source,
+            _nonce: _nonce,
+            _sender: _sender,
+            _target: _target,
+            _message: _message
+        });
+    }
+
+    /// @dev Tests that the `relayMessage` function reverts when CrossL2Inbox's origin is not
+    ///      L2ToL2CrossDomainMessenger.
+    function testFuzz_relayMessage_crossL2InboxOriginNotL2ToL2CrossDomainMessenger_reverts(
+        uint256 _destination,
+        uint256 _source,
+        uint256 _nonce,
+        address _sender,
+        address _target,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Set address(0) as the origin of the CrossL2Inbox contract, which is not the L2ToL2CrossDomainMessenger
+        vm.mockCall({
+            callee: Predeploys.CROSS_L2_INBOX,
+            data: abi.encodeWithSelector(CrossL2Inbox.origin.selector),
+            returnData: abi.encode(address(0))
+        });
+
+        // Ensure caller is CrossL2Inbox to prevent a revert from the caller check and that it has sufficient value
+        hoax(Predeploys.CROSS_L2_INBOX, _value);
+
+        // Expect a revert with the CrossL2InboxOriginNotL2ToL2CrossDomainMessenger selector
+        vm.expectRevert(CrossL2InboxOriginNotL2ToL2CrossDomainMessenger.selector);
+
+        // Call `relayMessage` with invalid CrossL2Inbox origin to provoke revert
+        l2ToL2CrossDomainMessenger.relayMessage{ value: _value }({
+            _destination: _destination,
+            _source: _source,
+            _nonce: _nonce,
+            _sender: _sender,
+            _target: _target,
+            _message: _message
+        });
+    }
+
+    /// @dev Tests that the `relayMessage` function reverts when the destination is not the relay chain.
+    function testFuzz_relayMessage_destinationNotRelayChain_reverts(
+        uint256 _destination,
+        uint256 _source,
+        uint256 _nonce,
+        address _sender,
+        address _target,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Ensure the destination is not this chain
+        vm.assume(_destination != block.chainid);
+
+        // Mock the CrossL2Inbox origin to return the L2ToL2CrossDomainMessenger contract
+        vm.mockCall({
+            callee: Predeploys.CROSS_L2_INBOX,
+            data: abi.encodeWithSelector(CrossL2Inbox.origin.selector),
+            returnData: abi.encode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER)
+        });
+
+        // Ensure caller is CrossL2Inbox to prevent a revert from the caller check and that it has sufficient value
+        hoax(Predeploys.CROSS_L2_INBOX, _value);
+
+        // Expect a revert with the MessageDestinationNotRelayChain selector
+        vm.expectRevert(MessageDestinationNotRelayChain.selector);
+
+        // Call `relayMessage`
+        l2ToL2CrossDomainMessenger.relayMessage{ value: _value }({
+            _destination: _destination,
+            _source: _source,
+            _nonce: _nonce,
+            _sender: _sender,
+            _target: _target,
+            _message: _message
+        });
+    }
+
+    /// @dev Tests that the `relayMessage` function reverts when the message target is CrossL2Inbox.
+    function testFuzz_relayMessage_targetCrossL2Inbox_reverts(
+        uint256 _source,
+        uint256 _nonce,
+        address _sender,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Mock the CrossL2Inbox origin to return the L2ToL2CrossDomainMessenger contract
+        vm.mockCall({
+            callee: Predeploys.CROSS_L2_INBOX,
+            data: abi.encodeWithSelector(CrossL2Inbox.origin.selector),
+            returnData: abi.encode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER)
+        });
+
+        // Ensure caller is CrossL2Inbox to prevent a revert from the caller check and that it has sufficient value
+        hoax(Predeploys.CROSS_L2_INBOX, _value);
+
+        // Expect a revert with the MessageTargetCrossL2Inbox selector
+        vm.expectRevert(MessageTargetCrossL2Inbox.selector);
+
+        // Call `relayMessage` with CrossL2Inbox as the target to provoke revert. The current chain is the destination
+        // to prevent revert due to invalid destination
+        l2ToL2CrossDomainMessenger.relayMessage{ value: _value }({
+            _destination: block.chainid,
+            _source: _source,
+            _nonce: _nonce,
+            _sender: _sender,
+            _target: Predeploys.CROSS_L2_INBOX,
+            _message: _message
+        });
+    }
+
+    /// @dev Tests that the `relayMessage` function reverts when the message target is L2ToL2CrossDomainMessenger.
+    function testFuzz_relayMessage_targetL2ToL2CrossDomainMessenger_reverts(
+        uint256 _source,
+        uint256 _nonce,
+        address _sender,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Mock the CrossL2Inbox origin to return the L2ToL2CrossDomainMessenger contract
+        vm.mockCall({
+            callee: Predeploys.CROSS_L2_INBOX,
+            data: abi.encodeWithSelector(CrossL2Inbox.origin.selector),
+            returnData: abi.encode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER)
+        });
+
+        // Ensure caller is CrossL2Inbox to prevent a revert from the caller check and that it has sufficient value
+        hoax(Predeploys.CROSS_L2_INBOX, _value);
+
+        // Expect a revert with the MessageTargetL2ToL2CrossDomainMessenger selector
+        vm.expectRevert(MessageTargetL2ToL2CrossDomainMessenger.selector);
+
+        // Call `relayMessage` with L2ToL2CrossDomainMessenger as the target to provoke revert. The current chain is the
+        // destination to prevent revert due to invalid destination
+        l2ToL2CrossDomainMessenger.relayMessage{ value: _value }({
+            _destination: block.chainid,
+            _source: _source,
+            _nonce: _nonce,
+            _sender: _sender,
+            _target: Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER,
+            _message: _message
+        });
+    }
+
+    /// @dev Tests that the `relayMessage` function reverts when the message has already been relayed.
+    function testFuzz_relayMessage_alreadyRelayed_reverts(
+        uint256 _source,
+        uint256 _nonce,
+        address _sender,
+        address _target,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Ensure that payment doesn't overflow since we send value to L2ToL2CrossDomainMessenger twice
+        _value = bound(_value, 0, type(uint256).max / 2);
+
+        // Ensure that the target call is payable if value is sent
+        if (_value > 0) assumePayable(_target);
+
+        // Ensure that the target contract is not CrossL2Inbox or L2ToL2CrossDomainMessenger
+        vm.assume(_target != Predeploys.CROSS_L2_INBOX && _target != Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER);
+
+        // Ensure that the target contract does not revert
+        vm.mockCall({ callee: _target, msgValue: _value, data: _message, returnData: abi.encode(true) });
+
+        // Mock the CrossL2Inbox origin to return the L2ToL2CrossDomainMessenger contract
+        vm.mockCall({
+            callee: Predeploys.CROSS_L2_INBOX,
+            data: abi.encodeWithSelector(CrossL2Inbox.origin.selector),
+            returnData: abi.encode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER)
+        });
+
+        // Ensure caller is CrossL2Inbox to prevent a revert from the caller check and that it has sufficient value
+        hoax(Predeploys.CROSS_L2_INBOX, _value);
+
+        // Look for correct emitted event for first call.
+        vm.expectEmit(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER);
+        emit L2ToL2CrossDomainMessenger.RelayedMessage(
+            keccak256(abi.encode(block.chainid, _source, _nonce, _sender, _target, _message))
+        );
+
+        // First call to `relayMessage` should succeed. The current chain is the destination to prevent revert due to
+        // invalid destination
+        l2ToL2CrossDomainMessenger.relayMessage{ value: _value }({
+            _destination: block.chainid,
+            _source: _source,
+            _nonce: _nonce,
+            _sender: _sender,
+            _target: _target,
+            _message: _message
+        });
+
+        // Ensure caller is CrossL2Inbox to prevent a revert from the caller check and that it has sufficient value
+        hoax(Predeploys.CROSS_L2_INBOX, _value);
+
+        // Second call should fail with MessageAlreadyRelayed selector
+        vm.expectRevert(MessageAlreadyRelayed.selector);
+
+        // Call `relayMessage` again. The current chain is the destination to prevent revert due to invalid destination
+        l2ToL2CrossDomainMessenger.relayMessage{ value: _value }({
+            _destination: block.chainid,
+            _source: _source,
+            _nonce: _nonce,
+            _sender: _sender,
+            _target: _target,
+            _message: _message
+        });
+    }
+
+    /// @dev Tests that the `relayMessage` function reverts when the target call fails.
+    function testFuzz_relayMessage_targetCallFails_reverts(
+        uint256 _source,
+        uint256 _nonce,
+        address _sender,
+        address _target,
+        bytes calldata _message,
+        uint256 _value
+    )
+        external
+    {
+        // Ensure that the target contract is not CrossL2Inbox or L2ToL2CrossDomainMessenger
+        vm.assume(_target != Predeploys.CROSS_L2_INBOX && _target != Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER);
+
+        // Ensure that the target call is payable if value is sent
+        if (_value > 0) assumePayable(_target);
+
+        // Ensure that the target contract reverts
+        vm.mockCallRevert({ callee: _target, msgValue: _value, data: _message, revertData: abi.encode(false) });
+
+        // Mock the CrossL2Inbox origin to return the L2ToL2CrossDomainMessenger contract
+        vm.mockCall({
+            callee: Predeploys.CROSS_L2_INBOX,
+            data: abi.encodeWithSelector(CrossL2Inbox.origin.selector),
+            returnData: abi.encode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER)
+        });
+
+        // Ensure caller is CrossL2Inbox to prevent a revert from the caller check and that it has sufficient value
+        hoax(Predeploys.CROSS_L2_INBOX, _value);
+
+        // Look for correct emitted event
+        vm.expectEmit(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER);
+        emit L2ToL2CrossDomainMessenger.FailedRelayedMessage(
+            keccak256(abi.encode(block.chainid, _source, _nonce, _sender, _target, _message))
+        );
+
+        l2ToL2CrossDomainMessenger.relayMessage{ value: _value }({
+            _destination: block.chainid,
+            _source: _source,
+            _nonce: _nonce,
+            _sender: _sender,
+            _target: _target,
+            _message: _message
+        });
+    }
+
+    /// @dev Tests that the `crossDomainMessageSender` function returns the correct value.
+    function testFuzz_crossDomainMessageSender_succeeds(address _sender) external {
+        // Set `entered` to non-zero value to prevent NotEntered revert
+        l2ToL2CrossDomainMessenger.setEntered(1);
+        // Ensure that the contract is now entered
+        assertEq(l2ToL2CrossDomainMessenger.entered(), true);
+        // Set cross domain message sender in the transient storage
+        l2ToL2CrossDomainMessenger.setCrossDomainMessageSender(_sender);
+        // Check that the `crossDomainMessageSender` function returns the correct value
+        assertEq(l2ToL2CrossDomainMessenger.crossDomainMessageSender(), _sender);
+    }
+
+    /// @dev Tests that the `crossDomainMessageSender` function reverts when not entered.
+    function test_crossDomainMessageSender_notEntered_reverts() external {
+        // Ensure that the contract is not entered
+        assertEq(l2ToL2CrossDomainMessenger.entered(), false);
+
+        // Expect a revert with the NotEntered selector
+        vm.expectRevert(NotEntered.selector);
+
+        // Call `crossDomainMessageSender` to provoke revert
+        l2ToL2CrossDomainMessenger.crossDomainMessageSender();
+    }
+
+    /// @dev Tests that the `crossDomainMessageSource` function returns the correct value.
+    function testFuzz_crossDomainMessageSource_succeeds(uint256 _source) external {
+        // Set `entered` to non-zero value to prevent NotEntered revert
+        l2ToL2CrossDomainMessenger.setEntered(1);
+        // Ensure that the contract is now entered
+        assertEq(l2ToL2CrossDomainMessenger.entered(), true);
+        // Set cross domain message source in the transient storage
+        l2ToL2CrossDomainMessenger.setCrossDomainMessageSource(_source);
+        // Check that the `crossDomainMessageSource` function returns the correct value
+        assertEq(l2ToL2CrossDomainMessenger.crossDomainMessageSource(), _source);
+    }
+
+    /// @dev Tests that the `crossDomainMessageSource` function reverts when not entered.
+    function test_crossDomainMessageSource_notEntered_reverts() external {
+        // Ensure that the contract is not entered
+        assertEq(l2ToL2CrossDomainMessenger.entered(), false);
+
+        // Expect a revert with the NotEntered selector
+        vm.expectRevert(NotEntered.selector);
+
+        // Call `crossDomainMessageSource` to provoke revert
+        l2ToL2CrossDomainMessenger.crossDomainMessageSource();
+    }
+}
diff --git a/packages/contracts-bedrock/test/L2/SequencerFeeVault.t.sol b/packages/contracts-bedrock/test/L2/SequencerFeeVault.t.sol
index f0956064c4b8..de759a4fd9fb 100644
--- a/packages/contracts-bedrock/test/L2/SequencerFeeVault.t.sol
+++ b/packages/contracts-bedrock/test/L2/SequencerFeeVault.t.sol
@@ -26,12 +26,12 @@ contract SequencerFeeVault_Test is CommonTest {
     }
 
     /// @dev Tests that the minimum withdrawal amount is correct.
-    function test_minWithdrawalAmount_succeeds() external {
+    function test_minWithdrawalAmount_succeeds() external view {
         assertEq(sequencerFeeVault.MIN_WITHDRAWAL_AMOUNT(), deploy.cfg().sequencerFeeVaultMinimumWithdrawalAmount());
     }
 
     /// @dev Tests that the l1 fee wallet is correct.
-    function test_constructor_succeeds() external {
+    function test_constructor_succeeds() external view {
         assertEq(sequencerFeeVault.l1FeeWallet(), recipient);
     }
 
diff --git a/packages/contracts-bedrock/test/L2/WETH.t.sol b/packages/contracts-bedrock/test/L2/WETH.t.sol
new file mode 100644
index 000000000000..fa16be1f53cc
--- /dev/null
+++ b/packages/contracts-bedrock/test/L2/WETH.t.sol
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+// Testing utilities
+import { CommonTest } from "test/setup/CommonTest.sol";
+
+// Target contract
+import { WETH } from "src/L2/WETH.sol";
+
+contract WETH_Test is CommonTest {
+    /// @dev Tests that the name function returns the correct value.
+    function testFuzz_name_succeeds(string memory _gasPayingTokenName) external {
+        vm.mockCall(address(l1Block), abi.encodeWithSignature("gasPayingTokenName()"), abi.encode(_gasPayingTokenName));
+
+        assertEq(string.concat("Wrapped ", _gasPayingTokenName), weth.name());
+    }
+
+    /// @dev Tests that the symbol function returns the correct value.
+    function testFuzz_symbol_succeeds(string memory _gasPayingTokenSymbol) external {
+        vm.mockCall(
+            address(l1Block), abi.encodeWithSignature("gasPayingTokenSymbol()"), abi.encode(_gasPayingTokenSymbol)
+        );
+
+        assertEq(string.concat("W", _gasPayingTokenSymbol), weth.symbol());
+    }
+
+    /// @dev Tests that the name function returns the correct value.
+    function test_name_ether_succeeds() external view {
+        assertFalse(l1Block.isCustomGasToken());
+        assertEq("Wrapped Ether", weth.name());
+    }
+
+    /// @dev Tests that the symbol function returns the correct value.
+    function test_symbol_ether_succeeds() external view {
+        assertFalse(l1Block.isCustomGasToken());
+        assertEq("WETH", weth.symbol());
+    }
+}
diff --git a/packages/contracts-bedrock/test/L2Genesis.t.sol b/packages/contracts-bedrock/test/L2Genesis.t.sol
new file mode 100644
index 000000000000..551e01088947
--- /dev/null
+++ b/packages/contracts-bedrock/test/L2Genesis.t.sol
@@ -0,0 +1,198 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { Test } from "forge-std/Test.sol";
+import { L2Genesis, OutputMode, L1Dependencies } from "scripts/L2Genesis.s.sol";
+import { Predeploys } from "src/libraries/Predeploys.sol";
+import { Constants } from "src/libraries/Constants.sol";
+
+/// @title L2GenesisTest
+/// @notice Test suite for L2Genesis script.
+contract L2GenesisTest is Test {
+    L2Genesis genesis;
+
+    function setUp() public {
+        genesis = new L2Genesis();
+        // Note: to customize L1 addresses,
+        // simply pass in the L1 addresses argument for Genesis setup functions that depend on it.
+        // L1 addresses, or L1 artifacts, are not stored globally.
+        genesis.setUp();
+    }
+
+    /// @notice Creates a temp file and returns the path to it.
+    function tmpfile() internal returns (string memory) {
+        string[] memory commands = new string[](3);
+        commands[0] = "bash";
+        commands[1] = "-c";
+        commands[2] = "mktemp";
+        bytes memory result = vm.ffi(commands);
+        return string(result);
+    }
+
+    /// @notice Deletes a file at a given filesystem path. Does not force delete
+    ///         and does not recursively delete.
+    function deleteFile(string memory path) internal {
+        string[] memory commands = new string[](3);
+        commands[0] = "bash";
+        commands[1] = "-c";
+        commands[2] = string.concat("rm ", path);
+        vm.ffi(commands);
+    }
+
+    /// @notice Returns the number of top level keys in a JSON object at a given
+    ///         file path.
+    function getJSONKeyCount(string memory path) internal returns (uint256) {
+        string[] memory commands = new string[](3);
+        commands[0] = "bash";
+        commands[1] = "-c";
+        commands[2] = string.concat("jq 'keys | length' < ", path, " | xargs cast abi-encode 'f(uint256)'");
+        return abi.decode(vm.ffi(commands), (uint256));
+    }
+
+    /// @notice Helper function to run a function with a temporary dump file.
+    function withTempDump(function (string memory) internal f) internal {
+        string memory path = tmpfile();
+        f(path);
+        deleteFile(path);
+    }
+
+    /// @notice Helper function for reading the number of storage keys for a given account.
+    function getStorageKeysCount(string memory _path, address _addr) internal returns (uint256) {
+        string[] memory commands = new string[](3);
+        commands[0] = "bash";
+        commands[1] = "-c";
+        commands[2] =
+            string.concat("jq -r '.[\"", vm.toLowercase(vm.toString(_addr)), "\"].storage | length' < ", _path);
+        return vm.parseUint(string(vm.ffi(commands)));
+    }
+
+    /// @notice Returns the number of accounts that contain particular code at a given path to a genesis file.
+    function getCodeCount(string memory path, string memory name) internal returns (uint256) {
+        bytes memory code = vm.getDeployedCode(name);
+        string[] memory commands = new string[](3);
+        commands[0] = "bash";
+        commands[1] = "-c";
+        commands[2] = string.concat(
+            "jq -r 'map_values(select(.code == \"",
+            vm.toString(code),
+            "\")) | length' < ",
+            path,
+            " | xargs cast abi-encode 'f(uint256)'"
+        );
+        return abi.decode(vm.ffi(commands), (uint256));
+    }
+
+    /// @notice Returns the number of accounts that have a particular slot set.
+    function getPredeployCountWithSlotSet(string memory path, bytes32 slot) internal returns (uint256) {
+        string[] memory commands = new string[](3);
+        commands[0] = "bash";
+        commands[1] = "-c";
+        commands[2] = string.concat(
+            "jq 'map_values(.storage | select(has(\"",
+            vm.toString(slot),
+            "\"))) | keys | length' < ",
+            path,
+            " | xargs cast abi-encode 'f(uint256)'"
+        );
+        return abi.decode(vm.ffi(commands), (uint256));
+    }
+
+    /// @notice Returns the number of accounts that have a particular slot set to a particular value.
+    function getPredeployCountWithSlotSetToValue(
+        string memory path,
+        bytes32 slot,
+        bytes32 value
+    )
+        internal
+        returns (uint256)
+    {
+        string[] memory commands = new string[](3);
+        commands[0] = "bash";
+        commands[1] = "-c";
+        commands[2] = string.concat(
+            "jq 'map_values(.storage | select(.\"",
+            vm.toString(slot),
+            "\" == \"",
+            vm.toString(value),
+            "\")) | length' < ",
+            path,
+            " | xargs cast abi-encode 'f(uint256)'"
+        );
+        return abi.decode(vm.ffi(commands), (uint256));
+    }
+
+    /// @notice Tests the genesis predeploys setup using a temp file for the case where useInterop is false.
+    function test_genesis_predeploys_notUsingInterop() external {
+        string memory path = tmpfile();
+        _test_genesis_predeploys(path, false);
+        deleteFile(path);
+    }
+
+    /// @notice Tests the genesis predeploys setup using a temp file for the case where useInterop is true.
+    function test_genesis_predeploys_usingInterop() external {
+        string memory path = tmpfile();
+        _test_genesis_predeploys(path, true);
+        deleteFile(path);
+    }
+
+    /// @notice Tests the genesis predeploys setup.
+    function _test_genesis_predeploys(string memory _path, bool _useInterop) internal {
+        // Set the useInterop value
+        vm.mockCall(
+            address(genesis.cfg()), abi.encodeWithSelector(genesis.cfg().useInterop.selector), abi.encode(_useInterop)
+        );
+
+        // Set the predeploy proxies into state
+        genesis.setPredeployProxies();
+        genesis.writeGenesisAllocs(_path);
+
+        // 2 predeploys do not have proxies
+        assertEq(getCodeCount(_path, "Proxy.sol:Proxy"), Predeploys.PREDEPLOY_COUNT - 2);
+
+        // 19 proxies have the implementation set if useInterop is true and 17 if useInterop is false
+        assertEq(getPredeployCountWithSlotSet(_path, Constants.PROXY_IMPLEMENTATION_ADDRESS), _useInterop ? 19 : 17);
+
+        // All proxies except 2 have the proxy 1967 admin slot set to the proxy admin
+        assertEq(
+            getPredeployCountWithSlotSetToValue(
+                _path, Constants.PROXY_OWNER_ADDRESS, bytes32(uint256(uint160(Predeploys.PROXY_ADMIN)))
+            ),
+            Predeploys.PREDEPLOY_COUNT - 2
+        );
+
+        // Also see Predeploys.t.test_predeploysSet_succeeds which uses L1Genesis for the CommonTest prestate.
+    }
+
+    /// @notice Tests the number of accounts in the genesis setup
+    function test_allocs_size() external {
+        withTempDump(_test_allocs_size);
+    }
+
+    /// @notice Creates mock L1Dependencies for testing purposes.
+    function _dummyL1Deps() internal pure returns (L1Dependencies memory _deps) {
+        return L1Dependencies({
+            l1CrossDomainMessengerProxy: payable(address(0x100000)),
+            l1StandardBridgeProxy: payable(address(0x100001)),
+            l1ERC721BridgeProxy: payable(address(0x100002))
+        });
+    }
+
+    /// @notice Tests the number of accounts in the genesis setup
+    function _test_allocs_size(string memory _path) internal {
+        genesis.cfg().setFundDevAccounts(false);
+        genesis.runWithOptions(OutputMode.LOCAL_LATEST, _dummyL1Deps());
+        genesis.writeGenesisAllocs(_path);
+
+        uint256 expected = 0;
+        expected += 2048 - 2; // predeploy proxies
+        expected += 19; // predeploy implementations (excl. legacy erc20-style eth and legacy message sender)
+        expected += 256; // precompiles
+        expected += 12; // preinstalls
+        expected += 1; // 4788 deployer account
+        // 16 prefunded dev accounts are excluded
+        assertEq(expected, getJSONKeyCount(_path), "key count check");
+
+        // 3 slots: implementation, owner, admin
+        assertEq(3, getStorageKeysCount(_path, Predeploys.PROXY_ADMIN), "proxy admin storage check");
+    }
+}
diff --git a/packages/contracts-bedrock/test/Predeploys.t.sol b/packages/contracts-bedrock/test/Predeploys.t.sol
index 51305bc8ffe2..df7c2e3229ed 100644
--- a/packages/contracts-bedrock/test/Predeploys.t.sol
+++ b/packages/contracts-bedrock/test/Predeploys.t.sol
@@ -2,167 +2,130 @@
 pragma solidity 0.8.15;
 
 import { CommonTest } from "test/setup/CommonTest.sol";
+import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol";
 import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
 import { Predeploys } from "src/libraries/Predeploys.sol";
 
-interface IEIP712 {
-    function DOMAIN_SEPARATOR() external view returns (bytes32);
-}
-
 /// @title PredeploysTest
 contract PredeploysTest is CommonTest {
     //////////////////////////////////////////////////////
     /// Internal helpers
     //////////////////////////////////////////////////////
 
-    /// @dev Function to compute the expected address of the predeploy implementation
-    ///      in the genesis state.
-    function _predeployToCodeNamespace(address _addr) internal pure returns (address) {
-        return address(
-            uint160(uint256(uint160(_addr)) & 0xffff | uint256(uint160(0xc0D3C0d3C0d3C0D3c0d3C0d3c0D3C0d3c0d30000)))
-        );
-    }
-
-    /// @dev Returns true if the address is a predeploy.
+    /// @dev Returns true if the address is a predeploy that is active (i.e. embedded in L2 genesis).
     function _isPredeploy(address _addr) internal pure returns (bool) {
         return _addr == Predeploys.L2_TO_L1_MESSAGE_PASSER || _addr == Predeploys.L2_CROSS_DOMAIN_MESSENGER
             || _addr == Predeploys.L2_STANDARD_BRIDGE || _addr == Predeploys.L2_ERC721_BRIDGE
             || _addr == Predeploys.SEQUENCER_FEE_WALLET || _addr == Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY
             || _addr == Predeploys.OPTIMISM_MINTABLE_ERC721_FACTORY || _addr == Predeploys.L1_BLOCK_ATTRIBUTES
-            || _addr == Predeploys.GAS_PRICE_ORACLE || _addr == Predeploys.DEPLOYER_WHITELIST || _addr == Predeploys.WETH9
+            || _addr == Predeploys.GAS_PRICE_ORACLE || _addr == Predeploys.DEPLOYER_WHITELIST || _addr == Predeploys.WETH
             || _addr == Predeploys.L1_BLOCK_NUMBER || _addr == Predeploys.LEGACY_MESSAGE_PASSER
             || _addr == Predeploys.PROXY_ADMIN || _addr == Predeploys.BASE_FEE_VAULT || _addr == Predeploys.L1_FEE_VAULT
             || _addr == Predeploys.GOVERNANCE_TOKEN || _addr == Predeploys.SCHEMA_REGISTRY || _addr == Predeploys.EAS;
     }
 
-    /// @dev Returns true if the adress is not proxied.
+    /// @dev Returns true if the address is not proxied.
     function _notProxied(address _addr) internal pure returns (bool) {
-        return _addr == Predeploys.LEGACY_ERC20_ETH || _addr == Predeploys.GOVERNANCE_TOKEN || _addr == Predeploys.WETH9
-            || _addr == Predeploys.MultiCall3 || _addr == Predeploys.Create2Deployer || _addr == Predeploys.Safe_v130
-            || _addr == Predeploys.SafeL2_v130 || _addr == Predeploys.MultiSendCallOnly_v130
-            || _addr == Predeploys.SafeSingletonFactory || _addr == Predeploys.DeterministicDeploymentProxy
-            || _addr == Predeploys.MultiSend_v130 || _addr == Predeploys.Permit2 || _addr == Predeploys.SenderCreator
-            || _addr == Predeploys.EntryPoint;
-    }
-
-    /// @dev Tests that the predeploy addresses are set correctly. They have code
-    ///      and the proxied accounts have the correct admin.
-    function test_predeploysSet_succeeds() external {
-        uint256 count = 2048;
-        uint160 prefix = uint160(0x420) << 148;
-        for (uint256 i = 0; i < count; i++) {
-            address addr = address(prefix | uint160(i));
-            bytes memory code = addr.code;
-            assertTrue(code.length > 0);
-
-            bool proxied = _notProxied(addr) == false;
-            bool isPredeploy = _isPredeploy(addr);
-
-            // Skip the accounts that do not have a proxy
-            if (proxied == false) {
-                continue;
-            }
-
-            // Only the defined predeploys have their implementation slot set
-            if (proxied && isPredeploy) {
-                assertEq(
-                    EIP1967Helper.getImplementation(addr),
-                    _predeployToCodeNamespace(addr),
-                    string.concat("Implementation mismatch for ", vm.toString(addr))
-                );
-            }
-
-            // The code is a proxy
-            assertEq(code, vm.getDeployedCode("Proxy.sol"));
-
-            // All of the defined predeploys have their admin set to the proxy admin
-            assertEq(EIP1967Helper.getAdmin(addr), Predeploys.PROXY_ADMIN, "Admin mismatch");
-        }
+        return _addr == Predeploys.GOVERNANCE_TOKEN || _addr == Predeploys.WETH;
     }
 
-    /// @dev The domain separator commits to the chainid of the chain
-    function test_preinstall_permit2_succeeds() external {
-        bytes32 domainSeparator = IEIP712(Predeploys.Permit2).DOMAIN_SEPARATOR();
-        bytes32 typeHash =
-            keccak256(abi.encodePacked("EIP712Domain(string name,uint256 chainId,address verifyingContract)"));
-        bytes32 nameHash = keccak256(abi.encodePacked("Permit2"));
-        uint256 chainId = block.chainid;
-        bytes memory encoded = abi.encode(typeHash, nameHash, chainId, Predeploys.Permit2);
-        bytes32 expectedDomainSeparator = keccak256(encoded);
-        assertEq(domainSeparator, expectedDomainSeparator, "Domain separator mismatch");
+    /// @dev Returns true if the account is not meant to be in the L2 genesis anymore.
+    function _isOmitted(address _addr) internal pure returns (bool) {
+        return _addr == Predeploys.L1_MESSAGE_SENDER;
     }
 
-    //////////////////////////////////////////////////////
-    /// Code Assertion Tests
-    //////////////////////////////////////////////////////
-
-    function test_preinstall_multicall3_succeeds() external {
-        assertEq(
-            Predeploys.MultiCall3.code,
-            hex"6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033"
+    function _isInitializable(address _addr) internal pure returns (bool) {
+        return !(
+            _addr == Predeploys.LEGACY_MESSAGE_PASSER || _addr == Predeploys.DEPLOYER_WHITELIST
+                || _addr == Predeploys.GAS_PRICE_ORACLE || _addr == Predeploys.SEQUENCER_FEE_WALLET
+                || _addr == Predeploys.BASE_FEE_VAULT || _addr == Predeploys.L1_FEE_VAULT
+                || _addr == Predeploys.L1_BLOCK_NUMBER || _addr == Predeploys.L1_BLOCK_ATTRIBUTES
+                || _addr == Predeploys.L2_TO_L1_MESSAGE_PASSER || _addr == Predeploys.OPTIMISM_MINTABLE_ERC721_FACTORY
+                || _addr == Predeploys.PROXY_ADMIN || _addr == Predeploys.SCHEMA_REGISTRY || _addr == Predeploys.EAS
+                || _addr == Predeploys.GOVERNANCE_TOKEN
         );
     }
 
-    function test_preinstall_create2Deployer_succeeds() external {
-        assertEq(
-            Predeploys.Create2Deployer.code,
-            hex"6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033"
-        );
+    function _usesImmutables(address _addr) internal pure returns (bool) {
+        return _addr == Predeploys.OPTIMISM_MINTABLE_ERC721_FACTORY || _addr == Predeploys.SEQUENCER_FEE_WALLET
+            || _addr == Predeploys.BASE_FEE_VAULT || _addr == Predeploys.L1_FEE_VAULT || _addr == Predeploys.EAS
+            || _addr == Predeploys.GOVERNANCE_TOKEN;
     }
 
-    function test_preinstall_safev130_succeeds() external {
+    function test_predeployToCodeNamespace() external pure {
         assertEq(
-            Predeploys.Safe_v130.code,
-            hex"6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c63430007060033"
+            address(0xc0D3C0d3C0d3C0D3c0d3C0d3c0D3C0d3c0d30000),
+            Predeploys.predeployToCodeNamespace(Predeploys.LEGACY_MESSAGE_PASSER)
         );
-    }
-
-    function test_preinstall_safeL2v130_succeeds() external {
         assertEq(
-            Predeploys.SafeL2_v130.code,
-            hex"6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506126fc565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b810190808035906020019092919080359060200190929190505050612732565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b81019080803590602001909291905050506127b9565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d1565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612b63565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c9d565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612edc565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612f01565b005b348015610d3457600080fd5b50610d3d612f90565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613139565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061313f565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613161565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff16906020019092919050505061331f565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613447565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613639565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506137d8565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613805565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b96565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c1a565b005b34801561148957600080fd5b5061149261428c565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614296565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061443e565b005b3480156116a457600080fd5b506116ad61449f565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061451d565b005b34801561174a57600080fd5b50611753614950565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614989565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612b63565b5b5050565b611bd2604182614a2c90919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614a66565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614a2c90919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614a9590919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614a9590919063ffffffff16565b614a9590919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b60007fb648d3644f584ed1c2232d53c46d87e693586486ad0d1175f8656013110b714e3386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183600181111561266b57fe5b8152602001828103825284818151815260200191508051906020019080838360005b838110156126a857808201518184015260208101905061268d565b50505050905090810190601f1680156126d55780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a16126f285858585614ab4565b9050949350505050565b6000606061270c868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561275057600080fd5b506040519080825280601f01601f1916602001820160405280156127835781602001600182028036833780820191505090505b50905060005b838110156127ae57808501548060208302602085010152508080600101915050612789565b508091505092915050565b60076020528060005260406000206000915090505481565b6127d9614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128435750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6128b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612b6b614989565b600354811115612be3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612c5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000606060055433600454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405160208183030381529060405290507f66753cd2356569ee081232e3be8909b950e0a76c1f8460c3a5e3c2be32b11bed8d8d8d8d8d8d8d8d8d8d8d8c604051808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612d5057fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200184810384528e8e82818152602001925080828437600081840152601f19601f820116905080830192505050848103835286818151815260200191508051906020019080838360005b83811015612e0a578082015181840152602081019050612def565b50505050905090810190601f168015612e375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612e70578082015181840152602081019050612e55565b50505050905090810190601f168015612e9d5780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390a1612eca8d8d8d8d8d8d8d8d8d8d8d614c9a565b9150509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612f7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612f8a84848484611bbe565b50505050565b6060600060035467ffffffffffffffff81118015612fad57600080fd5b50604051908082528060200260200182016040528015612fdc5781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613130578083838151811061308757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050613046565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6131ac8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050896151d7565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131ea576131e9846156d7565b5b6132388787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615706565b60008211156132525761325082600060018685615941565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a9050613376878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615b47565b61337f57600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561340c5780820151818401526020810190506133f1565b50505050905090810190601f1680156134395780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561346257600080fd5b506040519080825280602002602001820160405280156134915781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135645750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561356f57508482105b1561362a578084838151811061358157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506134fa565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006137ed8c8c8c8c8c8c8c8c8c8c8c614296565b8051906020012090509b9a5050505050505050505050565b61380d614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156138775750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6138e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613b9e614989565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613c22614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c8c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613cc457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613d36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613ea15750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614013576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561432757fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6143b361449f565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b614446614989565b61444f816156d7565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6144cd6125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b614525614989565b8060016003540310156145a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561460a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61467c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461477c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1806004541461494b5761494a81612b63565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614a3f5760009050614a60565b6000828402905082848281614a5057fe5b0414614a5b57600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614aaa57600080fd5b8091505092915050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015614b7f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b614bf1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b614bfe858585855a615b47565b90508015614c4e573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2614c92565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000806000614cb48e8e8e8e8e8e8e8e8e8e600554614296565b905060056000815480929190600101919050555080805190602001209150614cdd828286612f01565b506000614ce8615b93565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614ece578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115614d8b57fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015614e5d578082015181840152602081019050614e42565b50505050905090810190601f168015614e8a5780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015614eb557600080fd5b505af1158015614ec9573d6000803e3d6000fd5b505050505b6101f4614ef56109c48b01603f60408d0281614ee657fe5b04615bc490919063ffffffff16565b015a1015614f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a9050614fd48f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d14614fc9578e614fcf565b6109c45a035b615b47565b9350614fe95a82615bde90919063ffffffff16565b90508380614ff8575060008a14155b80615004575060008814155b615076576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156150905761508d828b8b8b8b615941565b90505b84156150da577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a161511a565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146151c6578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156151ad57600080fd5b505af11580156151c1573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b60006004541461524f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81518111156152c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600181101561533d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b835181101561564357600084828151811061535d57fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153d15750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561540957503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561544157508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b6154b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550809250508080600101915050615346565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461593d576158ca8260008360015a615b47565b61593c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461597e5782615980565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615a98576159ea3a86106159c7573a6159c9565b855b6159dc888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615b3d565b615abd85615aaf888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b9150615aca848284615bfe565b615b3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600180811115615b5557fe5b836001811115615b6157fe5b1415615b7a576000808551602087018986f49050615b8a565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015615bd45781615bd6565b825b905092915050565b600082821115615bed57600080fd5b600082840390508091505092915050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615ca55760208114615cad5760009350615cb8565b819350615cb8565b600051158215171593505b505050939250505056fea2646970667358221220047fac33099ca576d1c4f1ac6a8abdb0396e42ad6a397d2cb2f4dc1624cc0c5b64736f6c63430007060033"
+            address(0xc0d3C0d3C0d3c0D3C0D3C0d3C0d3C0D3C0D3000f),
+            Predeploys.predeployToCodeNamespace(Predeploys.GAS_PRICE_ORACLE)
         );
-    }
-
-    function test_preinstall_multisendCallOnlyv130_succeeds() external {
         assertEq(
-            Predeploys.MultiSendCallOnly_v130.code,
-            hex"60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b805160205b8181101561015f578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811461012857600181146101385761013d565b6000808585888a5af1915061013d565b600080fd5b50600081141561014c57600080fd5b82605501870196505050505050506100e3565b50505056fea264697066735822122035246402746c96964495cae5b36461fd44dfb89f8e6cf6f6b8d60c0aa89f414864736f6c63430007060033"
+            address(0xC0d3C0d3c0d3c0d3C0d3c0D3c0D3c0D3C0d30420),
+            Predeploys.predeployToCodeNamespace(address(0x4200000000000000000000000000000000000420))
         );
     }
 
-    function test_preinstall_safeSingletonFactory_succeeds() external {
-        assertEq(
-            Predeploys.SafeSingletonFactory.code,
-            hex"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"
-        );
-    }
+    /// @dev Tests that the predeploy addresses are set correctly. They have code
+    ///      and the proxied accounts have the correct admin.
+    function test_predeploys_succeeds() external {
+        uint256 count = 2048;
+        uint160 prefix = uint160(0x420) << 148;
 
-    function test_preinstall_deterministicDeploymentProxy_succeeds() external {
-        assertEq(
-            Predeploys.DeterministicDeploymentProxy.code,
-            hex"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"
-        );
-    }
+        bytes memory proxyCode = vm.getDeployedCode("Proxy.sol:Proxy");
 
-    function test_preinstall_multisendv130_succeeds() external {
-        assertEq(
-            Predeploys.MultiSend_v130.code,
-            hex"60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b7f000000000000000000000000998739bfdaadde7c933b942a68053933098f9eda73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610183576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806102106030913960400191505060405180910390fd5b805160205b8181101561020a578083015160f81c6001820184015160601c6015830185015160358401860151605585018701600085600081146101cd57600181146101dd576101e8565b6000808585888a5af191506101e8565b6000808585895af491505b5060008114156101f757600080fd5b8260550187019650505050505050610188565b50505056fe4d756c746953656e642073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca26469706673582212205c784303626eec02b71940b551976170b500a8a36cc5adcbeb2c19751a76d05464736f6c63430007060033"
-        );
-    }
+        for (uint256 i = 0; i < count; i++) {
+            address addr = address(prefix | uint160(i));
+            bytes memory code = addr.code;
+            assertTrue(code.length > 0);
 
-    function test_preinstall_senderCreator_succeeds() external {
-        assertEq(
-            Predeploys.SenderCreator.code,
-            hex"6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033"
-        );
-    }
+            address implAddr = Predeploys.predeployToCodeNamespace(addr);
 
-    function test_preinstall_entrypoint_succeeds() external {
-        assertEq(
-            Predeploys.EntryPoint.code,
-            hex"60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000007fc98430eaedbb6070b35b39d798725049088348165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"
-        );
+            if (_isOmitted(addr)) {
+                assertEq(implAddr.code.length, 0, "must have no code");
+                continue;
+            }
+            bool isPredeploy = _isPredeploy(addr);
+
+            if (!isPredeploy) {
+                // All of the predeploys, even if inactive, have their admin set to the proxy admin
+                assertEq(EIP1967Helper.getAdmin(addr), Predeploys.PROXY_ADMIN, "Admin mismatch");
+                continue;
+            }
+            bool proxied = _notProxied(addr) == false;
+
+            string memory cname = Predeploys.getName(addr);
+            assertNotEq(cname, "", "must have a name");
+
+            bytes memory supposedCode = vm.getDeployedCode(string.concat(cname, ".sol:", cname));
+            assertNotEq(supposedCode.length, 0, "must have supposed code");
+
+            if (proxied == false) {
+                // can't check bytecode if it's modified with immutables in genesis.
+                if (!_usesImmutables(addr)) {
+                    assertEq(code, supposedCode, "non-proxy contract should be deployed in-place");
+                }
+                continue;
+            }
+
+            // The code is a proxy
+            assertEq(code, proxyCode);
+
+            assertEq(
+                EIP1967Helper.getImplementation(addr),
+                implAddr,
+                string.concat("Implementation mismatch for ", vm.toString(addr))
+            );
+            assertNotEq(implAddr.code.length, 0, "predeploy implementation account must have code");
+            if (!_usesImmutables(addr)) {
+                // can't check bytecode if it's modified with immutables in genesis.
+                assertEq(implAddr.code, supposedCode, "proxy implementation contract should match contract source");
+            }
+
+            if (_isInitializable(addr)) {
+                assertEq(l2Genesis.loadInitializedSlot(cname), uint8(1));
+            }
+        }
     }
 }
diff --git a/packages/contracts-bedrock/test/Preinstalls.t.sol b/packages/contracts-bedrock/test/Preinstalls.t.sol
new file mode 100644
index 000000000000..1fa31a0cfb0f
--- /dev/null
+++ b/packages/contracts-bedrock/test/Preinstalls.t.sol
@@ -0,0 +1,113 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { CommonTest } from "test/setup/CommonTest.sol";
+import { Preinstalls } from "src/libraries/Preinstalls.sol";
+import { Bytes } from "src/libraries/Bytes.sol";
+import { console2 as console } from "forge-std/console2.sol";
+
+interface IEIP712 {
+    function DOMAIN_SEPARATOR() external view returns (bytes32);
+}
+
+/// @title PreinstallsTest
+contract PreinstallsTest is CommonTest {
+    /// @dev The domain separator commits to the chainid of the chain
+    function test_preinstall_permit2_domain_separator() external view {
+        bytes32 domainSeparator = IEIP712(Preinstalls.Permit2).DOMAIN_SEPARATOR();
+        bytes32 typeHash =
+            keccak256(abi.encodePacked("EIP712Domain(string name,uint256 chainId,address verifyingContract)"));
+        bytes32 nameHash = keccak256(abi.encodePacked("Permit2"));
+        uint256 chainId = block.chainid;
+        bytes memory encoded = abi.encode(typeHash, nameHash, chainId, Preinstalls.Permit2);
+        bytes32 expectedDomainSeparator = keccak256(encoded);
+        assertEq(domainSeparator, expectedDomainSeparator, "Domain separator mismatch");
+        assertEq(chainId, uint256(901)); // uses devnet config
+        assertEq(domainSeparator, bytes32(0x48deb34b39fb4b41f5c195008940d5ef510cdd7853eba5807b2fa08dfd586475));
+        // Warning the Permit2 domain separator as cached in the DeployPermit2.sol bytecode is incorrect.
+    }
+
+    function test_permit2_templating() external pure {
+        bytes memory customCode = Preinstalls.getPermit2Code(1234);
+        assertNotEq(customCode.length, 0, "must have code");
+        assertEq(uint256(bytes32(Bytes.slice(customCode, 6945, 32))), uint256(1234), "expecting custom chain ID");
+        assertEq(
+            bytes32(Bytes.slice(customCode, 6983, 32)),
+            bytes32(0x6cda538cafce36292a6ef27740629597f85f6716f5694d26d5c59fc1d07cfd95),
+            "expecting custom domain separator"
+        );
+
+        bytes memory defaultCode = Preinstalls.getPermit2Code(1);
+        assertNotEq(defaultCode.length, 0, "must have code");
+        assertEq(uint256(bytes32(Bytes.slice(defaultCode, 6945, 32))), uint256(1), "expecting default chain ID");
+        assertEq(
+            bytes32(Bytes.slice(defaultCode, 6983, 32)),
+            bytes32(0x866a5aba21966af95d6c7ab78eb2b2fc913915c28be3b9aa07cc04ff903e3f28),
+            "expecting default domain separator"
+        );
+        assertEq(defaultCode, Preinstalls.Permit2TemplateCode, "template is using chain ID 1");
+    }
+
+    function assertPreinstall(address _addr, bytes memory _code) internal view {
+        assertNotEq(_code.length, 0, "must have code");
+        assertNotEq(_addr.code.length, 0, "deployed preinstall account must have code");
+        assertEq(_addr.code, _code, "equal code must be deployed");
+        assertEq(Preinstalls.getDeployedCode(_addr, block.chainid), _code, "deployed-code getter must match");
+        assertNotEq(Preinstalls.getName(_addr), "", "must have a name");
+        if (_addr != Preinstalls.DeterministicDeploymentProxy) {
+            assertEq(vm.getNonce(_addr), 1, "preinstall account must have 1 nonce");
+        }
+    }
+
+    function test_preinstall_multicall3_succeeds() external view {
+        assertPreinstall(Preinstalls.MultiCall3, Preinstalls.MultiCall3Code);
+    }
+
+    function test_preinstall_create2Deployer_succeeds() external view {
+        assertPreinstall(Preinstalls.Create2Deployer, Preinstalls.Create2DeployerCode);
+    }
+
+    function test_preinstall_safev130_succeeds() external view {
+        assertPreinstall(Preinstalls.Safe_v130, Preinstalls.Safe_v130Code);
+    }
+
+    function test_preinstall_safeL2v130_succeeds() external view {
+        assertPreinstall(Preinstalls.SafeL2_v130, Preinstalls.SafeL2_v130Code);
+    }
+
+    function test_preinstall_multisendCallOnlyv130_succeeds() external view {
+        assertPreinstall(Preinstalls.MultiSendCallOnly_v130, Preinstalls.MultiSendCallOnly_v130Code);
+    }
+
+    function test_preinstall_safeSingletonFactory_succeeds() external view {
+        assertPreinstall(Preinstalls.SafeSingletonFactory, Preinstalls.SafeSingletonFactoryCode);
+    }
+
+    function test_preinstall_deterministicDeploymentProxy_succeeds() external view {
+        assertPreinstall(Preinstalls.DeterministicDeploymentProxy, Preinstalls.DeterministicDeploymentProxyCode);
+    }
+
+    function test_preinstall_multisendv130_succeeds() external view {
+        assertPreinstall(Preinstalls.MultiSend_v130, Preinstalls.MultiSend_v130Code);
+    }
+
+    function test_preinstall_permit2_succeeds() external {
+        uint256 pre = block.chainid;
+        vm.chainId(901); // TODO legacy deployment does not use same chainID as tests run with
+        assertPreinstall(Preinstalls.Permit2, Preinstalls.getPermit2Code(block.chainid));
+        vm.chainId(pre);
+    }
+
+    function test_preinstall_senderCreator_succeeds() external view {
+        assertPreinstall(Preinstalls.SenderCreator, Preinstalls.SenderCreatorCode);
+    }
+
+    function test_preinstall_entrypoint_succeeds() external view {
+        assertPreinstall(Preinstalls.EntryPoint, Preinstalls.EntryPointCode);
+    }
+
+    function test_preinstall_beaconBlockRoots_succeeds() external view {
+        assertPreinstall(Preinstalls.BeaconBlockRoots, Preinstalls.BeaconBlockRootsCode);
+        assertEq(vm.getNonce(Preinstalls.BeaconBlockRootsSender), 1, "4788 sender must have nonce=1");
+    }
+}
diff --git a/packages/contracts-bedrock/test/Safe/DeployOwnership.t.sol b/packages/contracts-bedrock/test/Safe/DeployOwnership.t.sol
new file mode 100644
index 000000000000..cc4f58508ab1
--- /dev/null
+++ b/packages/contracts-bedrock/test/Safe/DeployOwnership.t.sol
@@ -0,0 +1,125 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import {
+    DeployOwnership,
+    SafeConfig,
+    SecurityCouncilConfig,
+    GuardianConfig,
+    DeputyGuardianModuleConfig,
+    LivenessModuleConfig
+} from "scripts/DeployOwnership.s.sol";
+import { Test } from "forge-std/Test.sol";
+
+import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol";
+import { ModuleManager } from "safe-contracts/base/ModuleManager.sol";
+import { GuardManager } from "safe-contracts/base/GuardManager.sol";
+
+import { LivenessGuard } from "src/Safe/LivenessGuard.sol";
+import { LivenessModule } from "src/Safe/LivenessModule.sol";
+import { DeputyGuardianModule } from "src/Safe/DeputyGuardianModule.sol";
+import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
+
+contract DeployOwnershipTest is Test, DeployOwnership {
+    address internal constant SENTINEL_MODULES = address(0x1);
+    // keccak256("guard_manager.guard.address")
+    bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8;
+
+    function setUp() public override {
+        super.setUp();
+        run();
+    }
+
+    /// @dev Helper function to make assertions on basic Safe config properties.
+    function _checkSafeConfig(SafeConfig memory _safeConfig, Safe _safe) internal view {
+        assertEq(_safe.getThreshold(), _safeConfig.threshold);
+
+        address[] memory safeOwners = _safe.getOwners();
+        assertEq(_safeConfig.owners.length, safeOwners.length);
+        assertFalse(_safe.isOwner(msg.sender));
+        for (uint256 i = 0; i < safeOwners.length; i++) {
+            assertEq(safeOwners[i], _safeConfig.owners[i]);
+        }
+    }
+
+    /// @dev Test the example Foundation Safe configurations, against the expected configuration, and
+    ///     check that they both have the same configuration.
+    function test_exampleFoundationSafes() public {
+        Safe upgradeSafe = Safe(payable(mustGetAddress("FoundationUpgradeSafe")));
+        Safe operationsSafe = Safe(payable(mustGetAddress("FoundationOperationsSafe")));
+        SafeConfig memory exampleFoundationConfig = _getExampleFoundationConfig();
+
+        // Ensure the safes both match the example configuration
+        _checkSafeConfig(exampleFoundationConfig, upgradeSafe);
+        _checkSafeConfig(exampleFoundationConfig, operationsSafe);
+
+        // Sanity check to ensure the safes match each other's configuration
+        assertEq(upgradeSafe.getThreshold(), operationsSafe.getThreshold());
+        assertEq(upgradeSafe.getOwners().length, operationsSafe.getOwners().length);
+    }
+
+    /// @dev Test the example Security Council Safe configuration.
+    function test_exampleSecurityCouncilSafe() public {
+        Safe securityCouncilSafe = Safe(payable(mustGetAddress("SecurityCouncilSafe")));
+        SecurityCouncilConfig memory exampleSecurityCouncilConfig = _getExampleCouncilConfig();
+
+        _checkSafeConfig(exampleSecurityCouncilConfig.safeConfig, securityCouncilSafe);
+
+        // Guard Checks
+        address livenessGuard = mustGetAddress("LivenessGuard");
+
+        // The Safe's getGuard method is internal, so we read directly from storage
+        // https://github.com/safe-global/safe-contracts/blob/v1.4.0/contracts/base/GuardManager.sol#L66-L72
+        assertEq(vm.load(address(securityCouncilSafe), GUARD_STORAGE_SLOT), bytes32(uint256(uint160(livenessGuard))));
+
+        // check that all the owners have a lastLive time in the Guard
+        address[] memory owners = exampleSecurityCouncilConfig.safeConfig.owners;
+        for (uint256 i = 0; i < owners.length; i++) {
+            assertEq(LivenessGuard(livenessGuard).lastLive(owners[i]), block.timestamp);
+        }
+
+        // Module Checks
+        address livenessModule = mustGetAddress("LivenessModule");
+        (address[] memory modules, address nextModule) =
+            ModuleManager(securityCouncilSafe).getModulesPaginated(SENTINEL_MODULES, 2);
+        assertEq(modules.length, 1);
+        assertEq(modules[0], livenessModule);
+        assertEq(nextModule, SENTINEL_MODULES); // ensures there are no more modules in the list
+
+        // LivenessModule checks
+        LivenessModuleConfig memory lmConfig = exampleSecurityCouncilConfig.livenessModuleConfig;
+        assertEq(address(LivenessModule(livenessModule).livenessGuard()), livenessGuard);
+        assertEq(LivenessModule(livenessModule).livenessInterval(), lmConfig.livenessInterval);
+        assertEq(LivenessModule(livenessModule).thresholdPercentage(), lmConfig.thresholdPercentage);
+        assertEq(LivenessModule(livenessModule).minOwners(), lmConfig.minOwners);
+
+        // Ensure the threshold on the safe agrees with the LivenessModule's required threshold
+        assertEq(securityCouncilSafe.getThreshold(), LivenessModule(livenessModule).getRequiredThreshold(owners.length));
+    }
+
+    /// @dev Test the example Guardian Safe configuration.
+    function test_exampleGuardianSafe() public view {
+        Safe guardianSafe = Safe(payable(mustGetAddress("GuardianSafe")));
+        address[] memory owners = new address[](1);
+        owners[0] = mustGetAddress("SecurityCouncilSafe");
+        GuardianConfig memory guardianConfig = _getExampleGuardianConfig();
+        _checkSafeConfig(guardianConfig.safeConfig, guardianSafe);
+
+        // DeputyGuardianModule checks
+        address deputyGuardianModule = mustGetAddress("DeputyGuardianModule");
+        (address[] memory modules, address nextModule) =
+            ModuleManager(guardianSafe).getModulesPaginated(SENTINEL_MODULES, 2);
+        assertEq(modules.length, 1);
+        assertEq(modules[0], deputyGuardianModule);
+        assertEq(nextModule, SENTINEL_MODULES); // ensures there are no more modules in the list
+
+        assertEq(
+            DeputyGuardianModule(deputyGuardianModule).deputyGuardian(),
+            guardianConfig.deputyGuardianModuleConfig.deputyGuardian
+        );
+        assertEq(
+            address(DeputyGuardianModule(deputyGuardianModule).superchainConfig()),
+            address(guardianConfig.deputyGuardianModuleConfig.superchainConfig)
+        );
+    }
+}
diff --git a/packages/contracts-bedrock/test/Safe/DeputyGuardianModule.t.sol b/packages/contracts-bedrock/test/Safe/DeputyGuardianModule.t.sol
new file mode 100644
index 000000000000..28fa47bb3138
--- /dev/null
+++ b/packages/contracts-bedrock/test/Safe/DeputyGuardianModule.t.sol
@@ -0,0 +1,254 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { CommonTest } from "test/setup/CommonTest.sol";
+import { ForgeArtifacts, Abi } from "scripts/ForgeArtifacts.sol";
+import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol";
+import "test/safe-tools/SafeTestTools.sol";
+
+import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
+import { DeputyGuardianModule } from "src/Safe/DeputyGuardianModule.sol";
+
+import "src/dispute/lib/Types.sol";
+
+contract DeputyGuardianModule_TestInit is CommonTest, SafeTestTools {
+    using SafeTestLib for SafeInstance;
+
+    error Unauthorized();
+    error ExecutionFailed(string);
+
+    event ExecutionFromModuleSuccess(address indexed);
+
+    DeputyGuardianModule deputyGuardianModule;
+    SafeInstance safeInstance;
+    address deputyGuardian;
+
+    /// @dev Sets up the test environment
+    function setUp() public virtual override {
+        super.enableFaultProofs();
+        super.setUp();
+
+        // Create a Safe with 10 owners
+        (, uint256[] memory keys) = SafeTestLib.makeAddrsAndKeys("moduleTest", 10);
+        safeInstance = _setupSafe(keys, 10);
+
+        // Set the Safe as the Guardian of the SuperchainConfig
+        vm.store(
+            address(superchainConfig),
+            superchainConfig.GUARDIAN_SLOT(),
+            bytes32(uint256(uint160(address(safeInstance.safe))))
+        );
+
+        deputyGuardian = makeAddr("deputyGuardian");
+
+        deputyGuardianModule = new DeputyGuardianModule({
+            _safe: safeInstance.safe,
+            _superchainConfig: superchainConfig,
+            _deputyGuardian: deputyGuardian
+        });
+        safeInstance.enableModule(address(deputyGuardianModule));
+    }
+}
+
+contract DeputyGuardianModule_Getters_Test is DeputyGuardianModule_TestInit {
+    /// @dev Tests that the constructor sets the correct values
+    function test_getters_works() external view {
+        assertEq(address(deputyGuardianModule.safe()), address(safeInstance.safe));
+        assertEq(address(deputyGuardianModule.deputyGuardian()), address(deputyGuardian));
+        assertEq(address(deputyGuardianModule.superchainConfig()), address(superchainConfig));
+    }
+}
+
+contract DeputyGuardianModule_Pause_Test is DeputyGuardianModule_TestInit {
+    /// @dev Tests that `pause` successfully pauses when called by the deputy guardian.
+    function test_pause_succeeds() external {
+        vm.expectEmit(address(superchainConfig));
+        emit Paused("Deputy Guardian");
+
+        vm.expectEmit(address(safeInstance.safe));
+        emit ExecutionFromModuleSuccess(address(deputyGuardianModule));
+
+        vm.expectEmit(address(deputyGuardianModule));
+        emit Paused("Deputy Guardian");
+
+        vm.prank(address(deputyGuardian));
+        deputyGuardianModule.pause();
+        assertEq(superchainConfig.paused(), true);
+    }
+}
+
+contract DeputyGuardianModule_Pause_TestFail is DeputyGuardianModule_TestInit {
+    /// @dev Tests that `pause` reverts when called by a non deputy guardian.
+    function test_pause_notDeputyGuardian_reverts() external {
+        vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector));
+        deputyGuardianModule.pause();
+    }
+
+    /// @dev Tests that when the call from the Safe reverts, the error message is returned.
+    function test_pause_targetReverts_reverts() external {
+        vm.mockCallRevert(
+            address(superchainConfig),
+            abi.encodeWithSelector(superchainConfig.pause.selector),
+            "SuperchainConfig: pause() reverted"
+        );
+
+        vm.prank(address(deputyGuardian));
+        vm.expectRevert(abi.encodeWithSelector(ExecutionFailed.selector, "SuperchainConfig: pause() reverted"));
+        deputyGuardianModule.pause();
+    }
+}
+
+contract DeputyGuardianModule_Unpause_Test is DeputyGuardianModule_TestInit {
+    /// @dev Sets up the test environment with the SuperchainConfig paused
+    function setUp() public override {
+        super.setUp();
+        vm.prank(address(deputyGuardian));
+        deputyGuardianModule.pause();
+        assertTrue(superchainConfig.paused());
+    }
+
+    /// @dev Tests that `unpause` successfully unpauses when called by the deputy guardian.
+    function test_unpause_succeeds() external {
+        vm.expectEmit(address(superchainConfig));
+        emit Unpaused();
+
+        vm.expectEmit(address(safeInstance.safe));
+        emit ExecutionFromModuleSuccess(address(deputyGuardianModule));
+
+        vm.expectEmit(address(deputyGuardianModule));
+        emit Unpaused();
+
+        vm.prank(address(deputyGuardian));
+        deputyGuardianModule.unpause();
+        assertFalse(superchainConfig.paused());
+    }
+}
+
+/// @dev Note that this contract inherits from DeputyGuardianModule_Unpause_Test to ensure that the SuperchainConfig is
+///      paused before the tests are run.
+contract DeputyGuardianModule_Unpause_TestFail is DeputyGuardianModule_Unpause_Test {
+    /// @dev Tests that `unpause` reverts when called by a non deputy guardian.
+    function test_unpause_notDeputyGuardian_reverts() external {
+        vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector));
+        deputyGuardianModule.unpause();
+        assertTrue(superchainConfig.paused());
+    }
+
+    /// @dev Tests that when the call from the Safe reverts, the error message is returned.
+    function test_unpause_targetReverts_reverts() external {
+        vm.mockCallRevert(
+            address(superchainConfig),
+            abi.encodeWithSelector(superchainConfig.unpause.selector),
+            "SuperchainConfig: unpause reverted"
+        );
+
+        vm.prank(address(deputyGuardian));
+        vm.expectRevert(abi.encodeWithSelector(ExecutionFailed.selector, "SuperchainConfig: unpause reverted"));
+        deputyGuardianModule.unpause();
+    }
+}
+
+contract DeputyGuardianModule_BlacklistDisputeGame_Test is DeputyGuardianModule_TestInit {
+    /// @dev Tests that `blacklistDisputeGame` successfully blacklists a dispute game when called by the deputy
+    /// guardian.
+    function test_blacklistDisputeGame_succeeds() external {
+        IDisputeGame game = IDisputeGame(makeAddr("game"));
+
+        vm.expectEmit(address(safeInstance.safe));
+        emit ExecutionFromModuleSuccess(address(deputyGuardianModule));
+
+        vm.expectEmit(address(deputyGuardianModule));
+        emit DisputeGameBlacklisted(game);
+
+        vm.prank(address(deputyGuardian));
+        deputyGuardianModule.blacklistDisputeGame(optimismPortal2, game);
+        assertTrue(optimismPortal2.disputeGameBlacklist(game));
+    }
+}
+
+contract DeputyGuardianModule_BlacklistDisputeGame_TestFail is DeputyGuardianModule_TestInit {
+    /// @dev Tests that `blacklistDisputeGame` reverts when called by a non deputy guardian.
+    function test_blacklistDisputeGame_notDeputyGuardian_reverts() external {
+        IDisputeGame game = IDisputeGame(makeAddr("game"));
+        vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector));
+        deputyGuardianModule.blacklistDisputeGame(optimismPortal2, game);
+        assertFalse(optimismPortal2.disputeGameBlacklist(game));
+    }
+
+    /// @dev Tests that when the call from the Safe reverts, the error message is returned.
+    function test_blacklistDisputeGame_targetReverts_reverts() external {
+        vm.mockCallRevert(
+            address(optimismPortal2),
+            abi.encodeWithSelector(optimismPortal2.blacklistDisputeGame.selector),
+            "OptimismPortal2: blacklistDisputeGame reverted"
+        );
+
+        IDisputeGame game = IDisputeGame(makeAddr("game"));
+        vm.prank(address(deputyGuardian));
+        vm.expectRevert(
+            abi.encodeWithSelector(ExecutionFailed.selector, "OptimismPortal2: blacklistDisputeGame reverted")
+        );
+        deputyGuardianModule.blacklistDisputeGame(optimismPortal2, game);
+    }
+}
+
+contract DeputyGuardianModule_setRespectedGameType_Test is DeputyGuardianModule_TestInit {
+    /// @dev Tests that `setRespectedGameType` successfully updates the respected game type when called by the deputy
+    /// guardian.
+    function testFuzz_setRespectedGameType_succeeds(GameType _gameType) external {
+        vm.expectEmit(address(safeInstance.safe));
+        emit ExecutionFromModuleSuccess(address(deputyGuardianModule));
+
+        vm.expectEmit(address(deputyGuardianModule));
+        emit RespectedGameTypeSet(_gameType, Timestamp.wrap(uint64(block.timestamp)));
+
+        vm.prank(address(deputyGuardian));
+        deputyGuardianModule.setRespectedGameType(optimismPortal2, _gameType);
+        assertEq(GameType.unwrap(optimismPortal2.respectedGameType()), GameType.unwrap(_gameType));
+        assertEq(optimismPortal2.respectedGameTypeUpdatedAt(), uint64(block.timestamp));
+    }
+}
+
+contract DeputyGuardianModule_setRespectedGameType_TestFail is DeputyGuardianModule_TestInit {
+    /// @dev Tests that `setRespectedGameType` when called by a non deputy guardian.
+    function testFuzz_setRespectedGameType_notDeputyGuardian_reverts(GameType _gameType) external {
+        vm.assume(GameType.unwrap(optimismPortal2.respectedGameType()) != GameType.unwrap(_gameType));
+        vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector));
+        deputyGuardianModule.setRespectedGameType(optimismPortal2, _gameType);
+        assertNotEq(GameType.unwrap(optimismPortal2.respectedGameType()), GameType.unwrap(_gameType));
+    }
+
+    /// @dev Tests that when the call from the Safe reverts, the error message is returned.
+    function test_setRespectedGameType_targetReverts_reverts() external {
+        vm.mockCallRevert(
+            address(optimismPortal2),
+            abi.encodeWithSelector(optimismPortal2.setRespectedGameType.selector),
+            "OptimismPortal2: setRespectedGameType reverted"
+        );
+
+        GameType gameType = GameType.wrap(1);
+        vm.prank(address(deputyGuardian));
+        vm.expectRevert(
+            abi.encodeWithSelector(ExecutionFailed.selector, "OptimismPortal2: setRespectedGameType reverted")
+        );
+        deputyGuardianModule.setRespectedGameType(optimismPortal2, gameType);
+    }
+}
+
+contract DeputyGuardianModule_NoPortalCollisions_Test is DeputyGuardianModule_TestInit {
+    /// @dev tests that no function selectors in the L1 contracts collide with the OptimismPortal2 functions called by
+    ///      the DeputyGuardianModule.
+    function test_noPortalCollisions_succeeds() external {
+        string[] memory excludes = new string[](2);
+        excludes[0] = "src/L1/OptimismPortal2.sol";
+        excludes[1] = "src/dispute/lib/*";
+        Abi[] memory abis = ForgeArtifacts.getContractFunctionAbis("src/{L1,dispute,universal}/", excludes);
+        for (uint256 i; i < abis.length; i++) {
+            for (uint256 j; j < abis[i].entries.length; j++) {
+                bytes4 sel = abis[i].entries[j].sel;
+                assertNotEq(sel, optimismPortal2.blacklistDisputeGame.selector);
+                assertNotEq(sel, optimismPortal2.setRespectedGameType.selector);
+            }
+        }
+    }
+}
diff --git a/packages/contracts-bedrock/test/Safe/LivenessGuard.t.sol b/packages/contracts-bedrock/test/Safe/LivenessGuard.t.sol
index 2ea2159d25dc..b8d67506da6d 100644
--- a/packages/contracts-bedrock/test/Safe/LivenessGuard.t.sol
+++ b/packages/contracts-bedrock/test/Safe/LivenessGuard.t.sol
@@ -4,9 +4,8 @@ pragma solidity 0.8.15;
 import { Test } from "forge-std/Test.sol";
 import { StdUtils } from "forge-std/StdUtils.sol";
 import { StdCheats } from "forge-std/StdCheats.sol";
-import { Safe, OwnerManager } from "safe-contracts/Safe.sol";
-import { SafeProxyFactory } from "safe-contracts/proxies/SafeProxyFactory.sol";
-import { ModuleManager } from "safe-contracts/base/ModuleManager.sol";
+import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol";
+import { OwnerManager } from "safe-contracts/base/OwnerManager.sol";
 import { Enum } from "safe-contracts/common/Enum.sol";
 import "test/safe-tools/SafeTestTools.sol";
 import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
@@ -29,14 +28,20 @@ contract LivenessGuard_TestInit is Test, SafeTestTools {
 
     event OwnerRecorded(address owner);
 
-    uint256 initTime = 10;
     WrappedGuard livenessGuard;
     SafeInstance safeInstance;
 
+    // This needs to be non-zero so that the `lastLive` mapping can record non-zero timestamps
+    uint256 initTime = 10;
+    // These values reflect the planned state of the mainnet Security Council Safe.
+    uint256 threshold = 10;
+    uint256 ownerCount = 13;
+
     /// @dev Sets up the test environment
     function setUp() public {
         vm.warp(initTime);
-        safeInstance = _setupSafe();
+        (, uint256[] memory privKeys) = SafeTestLib.makeAddrsAndKeys("test-owners", ownerCount);
+        safeInstance = _setupSafe(privKeys, threshold);
         livenessGuard = new WrappedGuard(safeInstance.safe);
         safeInstance.setGuard(address(livenessGuard));
     }
@@ -55,7 +60,7 @@ contract LivenessGuard_Constructor_Test is LivenessGuard_TestInit {
 
 contract LivenessGuard_Getters_Test is LivenessGuard_TestInit {
     /// @dev Tests that the getters return the correct values
-    function test_getters_works() external {
+    function test_getters_works() external view {
         assertEq(address(livenessGuard.safe()), address(safeInstance.safe));
         assertEq(livenessGuard.lastLive(address(0)), 0);
     }
@@ -89,8 +94,10 @@ contract LivenessGuard_CheckTx_Test is LivenessGuard_TestInit {
         // Create an array of the addresses who will sign the transaction. SafeTestTools
         // will generate these signatures up to the threshold by iterating over the owners array.
         address[] memory signers = new address[](safeInstance.threshold);
-        signers[0] = safeInstance.owners[0];
-        signers[1] = safeInstance.owners[1];
+        // copy the first threshold owners into the signers array
+        for (uint256 i; i < safeInstance.threshold; i++) {
+            signers[i] = safeInstance.owners[i];
+        }
 
         // Record the timestamps before the transaction
         uint256[] memory beforeTimestamps = new uint256[](safeInstance.owners.length);
@@ -246,6 +253,8 @@ contract LivenessGuard_FuzzOwnerManagement_Test is StdCheats, StdUtils, Liveness
             privateKeys[ownerAddrs[i]] = ownerkeys[i];
         }
 
+        // Override the saltNonce to ensure prevent a create2 collision.
+        saltNonce = uint256(keccak256(bytes("LIVENESS GUARD OWNER MANAGEMENT TEST")));
         // Create the new safe and register the guard.
         SafeInstance memory safeInstance = _setupSafe(ownerkeys, threshold);
         livenessGuard = new WrappedGuard(safeInstance.safe);
diff --git a/packages/contracts-bedrock/test/Safe/LivenessModule.t.sol b/packages/contracts-bedrock/test/Safe/LivenessModule.t.sol
index a1976279c5fc..f27e8aab4c50 100644
--- a/packages/contracts-bedrock/test/Safe/LivenessModule.t.sol
+++ b/packages/contracts-bedrock/test/Safe/LivenessModule.t.sol
@@ -1,10 +1,8 @@
 // SPDX-License-Identifier: MIT
 pragma solidity 0.8.15;
 
-import { Test, StdUtils } from "forge-std/Test.sol";
-import { Safe } from "safe-contracts/Safe.sol";
-import { SafeProxyFactory } from "safe-contracts/proxies/SafeProxyFactory.sol";
-import { ModuleManager } from "safe-contracts/base/ModuleManager.sol";
+import { Test } from "forge-std/Test.sol";
+import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol";
 import { OwnerManager } from "safe-contracts/base/OwnerManager.sol";
 import { Enum } from "safe-contracts/common/Enum.sol";
 import "test/safe-tools/SafeTestTools.sol";
@@ -15,11 +13,17 @@ import { LivenessGuard } from "src/Safe/LivenessGuard.sol";
 contract LivenessModule_TestInit is Test, SafeTestTools {
     using SafeTestLib for SafeInstance;
 
+    error OwnerRemovalFailed(string reason);
+
+    // LivenessModule events
     event SignersRecorded(bytes32 indexed txHash, address[] signers);
+    event RemovedOwner(address indexed owner);
+    event OwnershipTransferredToFallback();
 
-    uint256 initTime = 10;
-    uint256 livenessInterval = 30 days;
-    uint256 minOwners = 6;
+    uint256 constant INIT_TIME = 10;
+    uint256 constant LIVENESS_INTERVAL = 30 days;
+    uint256 constant MIN_OWNERS = 6;
+    uint256 constant THRESHOLD_PERCENTAGE = 75;
     LivenessModule livenessModule;
     LivenessGuard livenessGuard;
     SafeInstance safeInstance;
@@ -37,14 +41,35 @@ contract LivenessModule_TestInit is Test, SafeTestTools {
 
     /// @dev Set the current time to after the liveness interval
     function _warpPastLivenessInterval() internal {
-        vm.warp(initTime + livenessInterval + 1);
+        vm.warp(INIT_TIME + LIVENESS_INTERVAL + 1);
+    }
+
+    /// @dev Helper function to calculate the required threshold for a given number of owners and threshold percentage.
+    ///      This does a lot of extra work to set up a dummy LivenessModule and Safe, but helps to keep the tests clean.
+    function _getRequiredThreshold(uint256 _numOwners, uint256 _thresholdPercentage) internal returns (uint256) {
+        // Mock calls made to the Safe by the LivenessModule's constructor
+        address[] memory dummyOwners = new address[](_numOwners);
+        dummyOwners[0] = address(0);
+        vm.mockCall(address(0), abi.encodeCall(OwnerManager.getOwners, ()), abi.encode(dummyOwners));
+        vm.mockCall(address(0), abi.encodeCall(OwnerManager.getThreshold, ()), abi.encode(dummyOwners.length));
+        // This module is only used to calculate the required threshold for the Safe. It's state will not be modified
+        // after it is created so the constructor arguments are not important.
+        LivenessModule dummyLivenessModule = new LivenessModule({
+            _safe: Safe(payable(address(0))),
+            _livenessGuard: LivenessGuard(address(0)),
+            _livenessInterval: 0,
+            _thresholdPercentage: _thresholdPercentage,
+            _minOwners: 0,
+            _fallbackOwner: address(0)
+        });
+        return dummyLivenessModule.getRequiredThreshold(_numOwners);
     }
 
     /// @dev Sets up the test environment
     function setUp() public virtual {
         // Set the block timestamp to the initTime, so that signatures recorded in the first block
         // are non-zero.
-        vm.warp(initTime);
+        vm.warp(INIT_TIME);
 
         // Create a Safe with 10 owners
         (, uint256[] memory keys) = SafeTestLib.makeAddrsAndKeys("moduleTest", 10);
@@ -55,8 +80,9 @@ contract LivenessModule_TestInit is Test, SafeTestTools {
         livenessModule = new LivenessModule({
             _safe: safeInstance.safe,
             _livenessGuard: livenessGuard,
-            _livenessInterval: livenessInterval,
-            _minOwners: minOwners,
+            _livenessInterval: LIVENESS_INTERVAL,
+            _thresholdPercentage: THRESHOLD_PERCENTAGE,
+            _minOwners: MIN_OWNERS,
             _fallbackOwner: fallbackOwner
         });
         safeInstance.setGuard(address(livenessGuard));
@@ -71,24 +97,9 @@ contract LivenessModule_Constructor_TestFail is LivenessModule_TestInit {
         new LivenessModule({
             _safe: safeInstance.safe,
             _livenessGuard: livenessGuard,
-            _livenessInterval: livenessInterval,
-            _minOwners: 11,
-            _fallbackOwner: address(0)
-        });
-    }
-
-    /// @dev Tests that the constructor fails if the minOwners is greater than the number of owners
-    function test_constructor_wrongThreshold_reverts() external {
-        uint256 wrongThreshold = livenessModule.get75PercentThreshold(safeInstance.owners.length) - 1;
-        vm.mockCall(
-            address(safeInstance.safe), abi.encodeCall(OwnerManager.getThreshold, ()), abi.encode(wrongThreshold)
-        );
-        vm.expectRevert("LivenessModule: Safe must have a threshold of at least 75% of the number of owners");
-        new LivenessModule({
-            _safe: safeInstance.safe,
-            _livenessGuard: livenessGuard,
-            _livenessInterval: livenessInterval,
-            _minOwners: minOwners,
+            _livenessInterval: LIVENESS_INTERVAL,
+            _thresholdPercentage: THRESHOLD_PERCENTAGE,
+            _minOwners: safeInstance.owners.length + 1,
             _fallbackOwner: address(0)
         });
     }
@@ -96,12 +107,15 @@ contract LivenessModule_Constructor_TestFail is LivenessModule_TestInit {
 
 contract LivenessModule_Getters_Test is LivenessModule_TestInit {
     /// @dev Tests if the getters work correctly
-    function test_getters_works() external {
+    function test_getters_works() external view {
         assertEq(address(livenessModule.safe()), address(safeInstance.safe));
         assertEq(address(livenessModule.livenessGuard()), address(livenessGuard));
         assertEq(livenessModule.livenessInterval(), 30 days);
         assertEq(livenessModule.minOwners(), 6);
+        assertEq(livenessModule.thresholdPercentage(), THRESHOLD_PERCENTAGE);
+        assertEq(safeInstance.safe.getThreshold(), livenessModule.getRequiredThreshold(safeInstance.owners.length));
         assertEq(livenessModule.fallbackOwner(), fallbackOwner);
+        assertFalse(livenessModule.ownershipTransferredToFallback());
     }
 }
 
@@ -123,30 +137,93 @@ contract LivenessModule_CanRemove_Test is LivenessModule_TestInit {
     }
 }
 
-contract LivenessModule_Get75PercentThreshold_Test is LivenessModule_TestInit {
-    /// @dev check the return values of the get75PercentThreshold function against manually
+contract LivenessModule_GetRequiredThreshold_Test is LivenessModule_TestInit {
+    /// @dev Tests if getRequiredThreshold work correctly by implementing the same logic in a different manner
+    function _getLeastIntegerValueAbovePercentage(
+        uint256 _total,
+        uint256 _percentage
+    )
+        internal
+        pure
+        returns (uint256)
+    {
+        require(_percentage > 0 && _percentage <= 100);
+        uint256 toAdd;
+
+        // If the total multiplied by the percentage is not divisible by 100, we need to add 1 to the result to
+        // compensate for the rounding down by integer division.
+        if ((_total * _percentage) % 100 > 0) {
+            toAdd = 1;
+        }
+        return (_total * _percentage) / 100 + toAdd;
+    }
+
+    /// @dev Differentially tests the getRequiredThreshold function against _getLeastIntegerValueAbovePercentage
+    function testFuzz_getRequiredThreshold_works(uint256 _numOwners, uint256 _percentage) external {
+        // Enforce valid percentages
+        uint256 percentage = bound(_percentage, 1, 100);
+        // Enforce a sane number of owners to keep runtime in check
+        uint256 numOwners = bound(_numOwners, 1, 100);
+        assertEq(
+            _getRequiredThreshold(numOwners, percentage), _getLeastIntegerValueAbovePercentage(numOwners, percentage)
+        );
+    }
+
+    /// @dev check the return values of the getRequiredThreshold function against the boundary conditions of 1 and 100
+    ///      percent.
+    function testFuzz_getRequiredThreshold_atBoundaries_works(uint256 _numOwners) external {
+        // Enforce a sane number of owners to keep runtime in check
+        uint256 numOwners = bound(_numOwners, 1, 100);
+        assertEq(_getRequiredThreshold(numOwners, 100), numOwners);
+        assertEq(_getRequiredThreshold(numOwners, 1), 1);
+    }
+
+    /// @dev check the return values of the getRequiredThreshold function against manually
     ///      calculated values.
-    function test_get75PercentThreshold_Works() external {
-        assertEq(livenessModule.get75PercentThreshold(20), 15);
-        assertEq(livenessModule.get75PercentThreshold(19), 15);
-        assertEq(livenessModule.get75PercentThreshold(18), 14);
-        assertEq(livenessModule.get75PercentThreshold(17), 13);
-        assertEq(livenessModule.get75PercentThreshold(16), 12);
-        assertEq(livenessModule.get75PercentThreshold(15), 12);
-        assertEq(livenessModule.get75PercentThreshold(14), 11);
-        assertEq(livenessModule.get75PercentThreshold(13), 10);
-        assertEq(livenessModule.get75PercentThreshold(12), 9);
-        assertEq(livenessModule.get75PercentThreshold(11), 9);
-        assertEq(livenessModule.get75PercentThreshold(10), 8);
-        assertEq(livenessModule.get75PercentThreshold(9), 7);
-        assertEq(livenessModule.get75PercentThreshold(8), 6);
-        assertEq(livenessModule.get75PercentThreshold(7), 6);
-        assertEq(livenessModule.get75PercentThreshold(6), 5);
-        assertEq(livenessModule.get75PercentThreshold(5), 4);
-        assertEq(livenessModule.get75PercentThreshold(4), 3);
-        assertEq(livenessModule.get75PercentThreshold(3), 3);
-        assertEq(livenessModule.get75PercentThreshold(2), 2);
-        assertEq(livenessModule.get75PercentThreshold(1), 1);
+    function test_getRequiredThreshold_hardcoded_works() external {
+        // 75% threshold
+        assertEq(_getRequiredThreshold(20, 75), 15);
+        assertEq(_getRequiredThreshold(19, 75), 15);
+        assertEq(_getRequiredThreshold(18, 75), 14);
+        assertEq(_getRequiredThreshold(17, 75), 13);
+        assertEq(_getRequiredThreshold(16, 75), 12);
+        assertEq(_getRequiredThreshold(15, 75), 12);
+        assertEq(_getRequiredThreshold(14, 75), 11);
+        assertEq(_getRequiredThreshold(13, 75), 10);
+        assertEq(_getRequiredThreshold(12, 75), 9);
+        assertEq(_getRequiredThreshold(11, 75), 9);
+        assertEq(_getRequiredThreshold(10, 75), 8);
+        assertEq(_getRequiredThreshold(9, 75), 7);
+        assertEq(_getRequiredThreshold(8, 75), 6);
+        assertEq(_getRequiredThreshold(7, 75), 6);
+        assertEq(_getRequiredThreshold(6, 75), 5);
+        assertEq(_getRequiredThreshold(5, 75), 4);
+        assertEq(_getRequiredThreshold(4, 75), 3);
+        assertEq(_getRequiredThreshold(3, 75), 3);
+        assertEq(_getRequiredThreshold(2, 75), 2);
+        assertEq(_getRequiredThreshold(1, 75), 1);
+
+        // 33% threshold
+        assertEq(_getRequiredThreshold(20, 33), 7);
+        assertEq(_getRequiredThreshold(19, 33), 7);
+        assertEq(_getRequiredThreshold(18, 33), 6);
+        assertEq(_getRequiredThreshold(17, 33), 6);
+        assertEq(_getRequiredThreshold(16, 33), 6);
+        assertEq(_getRequiredThreshold(15, 33), 5);
+        assertEq(_getRequiredThreshold(14, 33), 5);
+        assertEq(_getRequiredThreshold(13, 33), 5);
+        assertEq(_getRequiredThreshold(12, 33), 4);
+        assertEq(_getRequiredThreshold(11, 33), 4);
+        assertEq(_getRequiredThreshold(10, 33), 4);
+        assertEq(_getRequiredThreshold(9, 33), 3);
+        assertEq(_getRequiredThreshold(8, 33), 3);
+        assertEq(_getRequiredThreshold(7, 33), 3);
+        assertEq(_getRequiredThreshold(6, 33), 2);
+        assertEq(_getRequiredThreshold(5, 33), 2);
+        assertEq(_getRequiredThreshold(4, 33), 2);
+        assertEq(_getRequiredThreshold(3, 33), 1);
+        assertEq(_getRequiredThreshold(2, 33), 1);
+        assertEq(_getRequiredThreshold(1, 33), 1);
     }
 }
 
@@ -187,10 +264,13 @@ contract LivenessModule_RemoveOwners_TestFail is LivenessModule_TestInit {
         address[] memory prevOwners = new address[](1);
         address[] memory ownersToRemove = new address[](1);
         ownersToRemove[0] = safeInstance.owners[0];
-        prevOwners[0] = ownersToRemove[0]; // incorrect.
+        // Incorrectly set the previous owner as equal to the owner to remove, which will cause the Safe to revert.
+        prevOwners[0] = ownersToRemove[0];
 
         _warpPastLivenessInterval();
-        vm.expectRevert("LivenessModule: failed to remove owner");
+        vm.expectRevert(
+            abi.encodeWithSelector(OwnerRemovalFailed.selector, (abi.encodeWithSignature("Error(string)", "GS205")))
+        );
         livenessModule.removeOwners(prevOwners, ownersToRemove);
     }
 
@@ -204,11 +284,13 @@ contract LivenessModule_RemoveOwners_TestFail is LivenessModule_TestInit {
         }
         address[] memory prevOwners = safeInstance.getPrevOwners(ownersToRemove);
 
-        // Incorrectly set the final owner to address(0)
+        // Incorrectly set the final owner to address(0), causing the Safe to revert.
         ownersToRemove[ownersToRemove.length - 1] = address(0);
 
         _warpPastLivenessInterval();
-        vm.expectRevert("LivenessModule: failed to swap to fallback owner");
+        vm.expectRevert(
+            abi.encodeWithSelector(OwnerRemovalFailed.selector, (abi.encodeWithSignature("Error(string)", "GS203")))
+        );
         livenessModule.removeOwners(prevOwners, ownersToRemove);
     }
 
@@ -272,7 +354,7 @@ contract LivenessModule_RemoveOwners_TestFail is LivenessModule_TestInit {
         );
 
         _warpPastLivenessInterval();
-        vm.expectRevert("LivenessModule: Safe must have a threshold of 75% of the number of owners");
+        vm.expectRevert("LivenessModule: Insufficient threshold for the number of owners");
         livenessModule.removeOwners(prevOwners, ownersToRemove);
     }
 }
@@ -286,6 +368,8 @@ contract LivenessModule_RemoveOwners_Test is LivenessModule_TestInit {
         address ownerToRemove = safeInstance.owners[0];
 
         _warpPastLivenessInterval();
+        vm.expectEmit(address(livenessModule));
+        emit RemovedOwner(ownerToRemove);
         _removeAnOwner(ownerToRemove, safeInstance.owners);
 
         assertFalse(safeInstance.safe.isOwner(ownerToRemove));
@@ -303,16 +387,28 @@ contract LivenessModule_RemoveOwners_Test is LivenessModule_TestInit {
         address[] memory prevOwners = safeInstance.getPrevOwners(ownersToRemove);
 
         _warpPastLivenessInterval();
+        for (uint256 i; i < ownersToRemove.length; i++) {
+            if (i != ownersToRemove.length - 1) {
+                vm.expectEmit(address(livenessModule));
+                emit RemovedOwner(ownersToRemove[i]);
+            }
+        }
+
+        vm.expectEmit(address(livenessModule));
+        emit OwnershipTransferredToFallback();
+
         livenessModule.removeOwners(prevOwners, ownersToRemove);
         assertEq(safeInstance.safe.getOwners().length, 1);
         assertEq(safeInstance.safe.getOwners()[0], fallbackOwner);
         assertEq(safeInstance.safe.getThreshold(), 1);
-    }
-}
 
-/// @dev A copy of LivenessModule.get75PercentThreshold as a free function to use below.
-function get75PercentThreshold(uint256 _numOwners) pure returns (uint256 threshold_) {
-    threshold_ = (_numOwners * 75 + 99) / 100;
+        // Ensure that the LivenessModule's removeOwners function is now disabled
+        assertTrue(livenessModule.ownershipTransferredToFallback());
+        vm.expectRevert(
+            "LivenessModule: The safe has been shutdown, the LivenessModule and LivenessGuard should be removed or replaced."
+        );
+        livenessModule.removeOwners(prevOwners, ownersToRemove);
+    }
 }
 
 contract LivenessModule_RemoveOwnersFuzz_Test is LivenessModule_TestInit {
@@ -334,7 +430,7 @@ contract LivenessModule_RemoveOwnersFuzz_Test is LivenessModule_TestInit {
     /// @dev This contract inherits the storage layout from the LivenessModule_TestInit contract, but we
     ///      override the base setUp function, to avoid instantiating an unnecessary Safe and liveness checking system.
     function setUp() public override {
-        vm.warp(initTime);
+        vm.warp(INIT_TIME);
         fallbackOwner = makeAddr("fallbackOwner");
     }
 
@@ -342,10 +438,11 @@ contract LivenessModule_RemoveOwnersFuzz_Test is LivenessModule_TestInit {
     function _prepare(
         uint256 _numOwners,
         uint256 _minOwners,
-        uint256 _numLiveOwners
+        uint256 _numLiveOwners,
+        uint256 _thresholdPercentage
     )
         internal
-        returns (uint256 numOwners_, uint256 minOwners_, uint256 numLiveOwners_)
+        returns (uint256 numOwners_, uint256 minOwners_, uint256 numLiveOwners_, uint256 thresholdPercentage_)
     {
         // First we modify the test parameters to ensure that they describe a plausible starting point.
         //
@@ -359,6 +456,9 @@ contract LivenessModule_RemoveOwnersFuzz_Test is LivenessModule_TestInit {
         // Ensure that _numLiveOwners is less than _numOwners so that we can remove at least one owner.
         numLiveOwners_ = bound(_numLiveOwners, 0, numOwners_ - 1);
 
+        // thresholdPercentage must be between a percentage greater than 0.
+        thresholdPercentage_ = bound(_thresholdPercentage, 1, 100);
+
         // The above bounds are a bit tricky, so we assert that the resulting parameters enable us to test all possible
         // success and revert cases in the removeOwners function.
         // This is also necessary to avoid underflows or out of bounds accesses in the test.
@@ -370,13 +470,14 @@ contract LivenessModule_RemoveOwnersFuzz_Test is LivenessModule_TestInit {
 
         // Create a Safe with _numOwners owners
         (, uint256[] memory keys) = SafeTestLib.makeAddrsAndKeys("rmOwnersTest", numOwners_);
-        uint256 threshold = get75PercentThreshold(numOwners_);
+        uint256 threshold = _getRequiredThreshold(numOwners_, thresholdPercentage_);
         safeInstance = _setupSafe(keys, threshold);
         livenessGuard = new LivenessGuard(safeInstance.safe);
         livenessModule = new LivenessModule({
             _safe: safeInstance.safe,
             _livenessGuard: livenessGuard,
-            _livenessInterval: livenessInterval,
+            _livenessInterval: LIVENESS_INTERVAL,
+            _thresholdPercentage: thresholdPercentage_,
             _minOwners: minOwners_,
             _fallbackOwner: fallbackOwner
         });
@@ -392,13 +493,15 @@ contract LivenessModule_RemoveOwnersFuzz_Test is LivenessModule_TestInit {
         uint256 _numOwners,
         uint256 _minOwners,
         uint256 _numLiveOwners,
+        uint256 _thresholdPercentage,
         uint256 _shutDownBehavior,
         uint256 _numOwnersToRemoveinShutDown
     )
         external
     {
         // Prepare the test env and test params
-        (uint256 numOwners, uint256 minOwners, uint256 numLiveOwners) = _prepare(_numOwners, _minOwners, _numLiveOwners);
+        (uint256 numOwners, uint256 minOwners, uint256 numLiveOwners, uint256 thresholdPercentage) =
+            _prepare(_numOwners, _minOwners, _numLiveOwners, _thresholdPercentage);
 
         // Create an array of live owners, and call showLiveness for each of them
         address[] memory liveOwners = new address[](numLiveOwners);
@@ -422,7 +525,7 @@ contract LivenessModule_RemoveOwnersFuzz_Test is LivenessModule_TestInit {
 
             // Validate the resulting state of the Safe
             assertEq(safeInstance.safe.getOwners().length, numLiveOwners);
-            assertEq(safeInstance.safe.getThreshold(), get75PercentThreshold(numLiveOwners));
+            assertEq(safeInstance.safe.getThreshold(), _getRequiredThreshold(numLiveOwners, thresholdPercentage));
             for (uint256 i; i < numLiveOwners; i++) {
                 assertTrue(safeInstance.safe.isOwner(liveOwners[i]));
             }
@@ -451,6 +554,12 @@ contract LivenessModule_RemoveOwnersFuzz_Test is LivenessModule_TestInit {
                 assertEq(safeInstance.safe.getOwners().length, 1);
                 assertEq(safeInstance.safe.getOwners()[0], fallbackOwner);
                 assertEq(safeInstance.safe.getThreshold(), 1);
+                // Ensure that the LivenessModule's removeOwners function is now disabled
+                assertTrue(livenessModule.ownershipTransferredToFallback());
+                vm.expectRevert(
+                    "LivenessModule: The safe has been shutdown, the LivenessModule and LivenessGuard should be removed or replaced."
+                );
+                livenessModule.removeOwners(prevOwners, ownersToRemove);
             } else {
                 // For both of the incorrect behaviors, we need to calculate the number of owners to remove to
                 // trigger that behavior. We initialize that value here then set it in the if statements below.
@@ -492,7 +601,7 @@ contract LivenessModule_RemoveOwnersFuzz_Test is LivenessModule_TestInit {
                 }
                 // For both of the incorrect behaviors, verify no change to the Safe state
                 assertEq(safeInstance.safe.getOwners().length, numOwners);
-                assertEq(safeInstance.safe.getThreshold(), get75PercentThreshold(numOwners));
+                assertEq(safeInstance.safe.getThreshold(), _getRequiredThreshold(numOwners, thresholdPercentage));
                 for (uint256 i; i < numOwners; i++) {
                     assertTrue(safeInstance.safe.isOwner(safeInstance.owners[i]));
                 }
diff --git a/packages/contracts-bedrock/test/Safe/SafeSigners.t.sol b/packages/contracts-bedrock/test/Safe/SafeSigners.t.sol
index d94d91382fa3..2006a44b9e71 100644
--- a/packages/contracts-bedrock/test/Safe/SafeSigners.t.sol
+++ b/packages/contracts-bedrock/test/Safe/SafeSigners.t.sol
@@ -2,12 +2,10 @@
 pragma solidity 0.8.15;
 
 import { Test } from "forge-std/Test.sol";
-import { Safe } from "safe-contracts/Safe.sol";
+import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol";
 import { SafeSigners } from "src/Safe/SafeSigners.sol";
 import "test/safe-tools/SafeTestTools.sol";
 
-import { SignatureDecoder } from "safe-contracts/common/SignatureDecoder.sol";
-
 contract SafeSigners_Test is Test, SafeTestTools {
     bytes4 internal constant EIP1271_MAGIC_VALUE = 0x20c13b0b;
 
diff --git a/packages/contracts-bedrock/test/Specs.t.sol b/packages/contracts-bedrock/test/Specs.t.sol
index ee6747fbff85..e8ac18e7adfc 100644
--- a/packages/contracts-bedrock/test/Specs.t.sol
+++ b/packages/contracts-bedrock/test/Specs.t.sol
@@ -9,7 +9,7 @@ import { OptimismPortal } from "src/L1/OptimismPortal.sol";
 import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol";
 import { SystemConfig } from "src/L1/SystemConfig.sol";
 import { DataAvailabilityChallenge } from "src/L1/DataAvailabilityChallenge.sol";
-import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol";
+import { ForgeArtifacts, Abi, AbiEntry } from "scripts/ForgeArtifacts.sol";
 
 /// @title Specification_Test
 /// @dev Specifies common security properties of entrypoints to L1 contracts, including authorization and
@@ -18,16 +18,6 @@ import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol";
 ///      properties of the new function. The `Spec` struct reppresents this documentation. However, this contract does
 ///      not actually test to verify these properties, only that a spec is defined.
 contract Specification_Test is CommonTest {
-    struct AbiEntry {
-        string fnName;
-        bytes4 sel;
-    }
-
-    struct Abi {
-        string contractName;
-        AbiEntry[] entries;
-    }
-
     enum Role {
         NOAUTH,
         PROPOSER,
@@ -38,7 +28,9 @@ contract Specification_Test is CommonTest {
         L1PROXYADMINOWNER,
         GOVERNANCETOKENOWNER,
         MINTMANAGEROWNER,
-        DATAAVAILABILITYCHALLENGEOWNER
+        DATAAVAILABILITYCHALLENGEOWNER,
+        DISPUTEGAMEFACTORYOWNER,
+        DELAYEDWETHOWNER
     }
 
     /// @notice Represents the specification of a function.
@@ -121,11 +113,14 @@ contract Specification_Test is CommonTest {
         _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("RELAY_RESERVED_GAS()") });
         _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("baseGas(bytes,uint32)") });
         _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("failedMessages(bytes32)") });
-        _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("initialize(address,address)") });
+        _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("initialize(address,address,address)") });
         _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("messageNonce()") });
         _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("paused()") });
         _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("otherMessenger()") });
         _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("portal()") });
+        _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("systemConfig()") });
+        _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("isCustomGasToken()") });
+        _addSpec({ _name: "L1CrossDomainMessenger", _sel: _getSel("gasPayingToken()") });
         _addSpec({
             _name: "L1CrossDomainMessenger",
             _sel: _getSel("relayMessage(uint256,address,address,uint256,uint256,bytes)"),
@@ -200,13 +195,16 @@ contract Specification_Test is CommonTest {
             _auth: Role.MESSENGER,
             _pausable: true
         });
-        _addSpec({ _name: "L1StandardBridge", _sel: _getSel("initialize(address,address)") });
+        _addSpec({ _name: "L1StandardBridge", _sel: _getSel("initialize(address,address,address)") });
         _addSpec({ _name: "L1StandardBridge", _sel: _getSel("l2TokenBridge()") });
         _addSpec({ _name: "L1StandardBridge", _sel: _getSel("messenger()") });
         _addSpec({ _name: "L1StandardBridge", _sel: _getSel("otherBridge()") });
         _addSpec({ _name: "L1StandardBridge", _sel: _getSel("paused()") });
         _addSpec({ _name: "L1StandardBridge", _sel: _getSel("superchainConfig()") });
         _addSpec({ _name: "L1StandardBridge", _sel: _getSel("version()") });
+        _addSpec({ _name: "L1StandardBridge", _sel: _getSel("gasPayingToken()") });
+        _addSpec({ _name: "L1StandardBridge", _sel: _getSel("isCustomGasToken()") });
+        _addSpec({ _name: "L1StandardBridge", _sel: _getSel("systemConfig()") });
 
         // L2OutputOracle
         _addSpec({ _name: "L2OutputOracle", _sel: _getSel("CHALLENGER()") });
@@ -242,9 +240,6 @@ contract Specification_Test is CommonTest {
         _addSpec({ _name: "L2OutputOracle", _sel: _getSel("version()") });
 
         // OptimismPortal
-        _addSpec({ _name: "OptimismPortal", _sel: _getSel("GUARDIAN()") });
-        _addSpec({ _name: "OptimismPortal", _sel: _getSel("L2_ORACLE()") });
-        _addSpec({ _name: "OptimismPortal", _sel: _getSel("SYSTEM_CONFIG()") });
         _addSpec({ _name: "OptimismPortal", _sel: _getSel("depositTransaction(address,uint256,uint64,bool,bytes)") });
         _addSpec({ _name: "OptimismPortal", _sel: _getSel("donateETH()") });
         _addSpec({
@@ -266,10 +261,15 @@ contract Specification_Test is CommonTest {
         _addSpec({ _name: "OptimismPortal", _sel: _getSel("superchainConfig()") });
         _addSpec({ _name: "OptimismPortal", _sel: _getSel("systemConfig()") });
         _addSpec({ _name: "OptimismPortal", _sel: _getSel("version()") });
+        _addSpec({ _name: "OptimismPortal", _sel: _getSel("balance()") });
+        _addSpec({ _name: "OptimismPortal", _sel: _getSel("gasPayingToken()") });
+        _addSpec({
+            _name: "OptimismPortal",
+            _sel: _getSel("depositERC20Transaction(address,uint256,uint256,uint64,bool,bytes)")
+        });
+        _addSpec({ _name: "OptimismPortal", _sel: _getSel("setGasPayingToken(address,uint8,bytes32,bytes32)") });
 
         // OptimismPortal2
-        _addSpec({ _name: "OptimismPortal2", _sel: _getSel("GUARDIAN()") });
-        _addSpec({ _name: "OptimismPortal2", _sel: _getSel("SYSTEM_CONFIG()") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("depositTransaction(address,uint256,uint64,bool,bytes)") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("donateETH()") });
         _addSpec({
@@ -277,15 +277,20 @@ contract Specification_Test is CommonTest {
             _sel: OptimismPortal2.finalizeWithdrawalTransaction.selector,
             _pausable: true
         });
+        _addSpec({
+            _name: "OptimismPortal2",
+            _sel: OptimismPortal2.finalizeWithdrawalTransactionExternalProof.selector,
+            _pausable: true
+        });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("finalizedWithdrawals(bytes32)") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("guardian()") });
-        _addSpec({ _name: "OptimismPortal2", _sel: _getSel("initialize(address,address,address)") });
+        _addSpec({ _name: "OptimismPortal2", _sel: _getSel("initialize(address,address,address,uint32)") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("l2Sender()") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("minimumGasLimit(uint64)") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("params()") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("paused()") });
         _addSpec({ _name: "OptimismPortal2", _sel: OptimismPortal2.proveWithdrawalTransaction.selector, _pausable: true });
-        _addSpec({ _name: "OptimismPortal2", _sel: _getSel("provenWithdrawals(bytes32)") });
+        _addSpec({ _name: "OptimismPortal2", _sel: _getSel("provenWithdrawals(bytes32,address)") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("superchainConfig()") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("systemConfig()") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("version()") });
@@ -294,10 +299,12 @@ contract Specification_Test is CommonTest {
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("respectedGameType()") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("blacklistDisputeGame(address)"), _auth: Role.GUARDIAN });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("setRespectedGameType(uint32)"), _auth: Role.GUARDIAN });
-        _addSpec({ _name: "OptimismPortal2", _sel: _getSel("checkWithdrawal(bytes32)") });
+        _addSpec({ _name: "OptimismPortal2", _sel: _getSel("checkWithdrawal(bytes32,address)") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("proofMaturityDelaySeconds()") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("disputeGameFinalityDelaySeconds()") });
         _addSpec({ _name: "OptimismPortal2", _sel: _getSel("respectedGameTypeUpdatedAt()") });
+        _addSpec({ _name: "OptimismPortal2", _sel: _getSel("proofSubmitters(bytes32,uint256)") });
+        _addSpec({ _name: "OptimismPortal2", _sel: _getSel("numProofSubmitters(bytes32)") });
 
         // ProtocolVersions
         _addSpec({ _name: "ProtocolVersions", _sel: _getSel("RECOMMENDED_SLOT()") });
@@ -350,7 +357,6 @@ contract Specification_Test is CommonTest {
         _addSpec({ _name: "SystemConfig", _sel: SystemConfig.setBatcherHash.selector, _auth: Role.SYSTEMCONFIGOWNER });
         _addSpec({ _name: "SystemConfig", _sel: SystemConfig.setGasConfig.selector, _auth: Role.SYSTEMCONFIGOWNER });
         _addSpec({ _name: "SystemConfig", _sel: SystemConfig.setGasLimit.selector, _auth: Role.SYSTEMCONFIGOWNER });
-        _addSpec({ _name: "SystemConfig", _sel: SystemConfig.setResourceConfig.selector, _auth: Role.SYSTEMCONFIGOWNER });
         _addSpec({
             _name: "SystemConfig",
             _sel: SystemConfig.setUnsafeBlockSigner.selector,
@@ -374,6 +380,10 @@ contract Specification_Test is CommonTest {
         _addSpec({ _name: "SystemConfig", _sel: _getSel("OPTIMISM_PORTAL_SLOT()") });
         _addSpec({ _name: "SystemConfig", _sel: _getSel("OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT()") });
         _addSpec({ _name: "SystemConfig", _sel: _getSel("BATCH_INBOX_SLOT()") });
+        _addSpec({ _name: "SystemConfig", _sel: _getSel("gasPayingToken()") });
+        _addSpec({ _name: "SystemConfig", _sel: _getSel("gasPayingTokenName()") });
+        _addSpec({ _name: "SystemConfig", _sel: _getSel("gasPayingTokenSymbol()") });
+        _addSpec({ _name: "SystemConfig", _sel: _getSel("isCustomGasToken()") });
 
         // ProxyAdmin
         _addSpec({ _name: "ProxyAdmin", _sel: _getSel("addressManager()") });
@@ -453,6 +463,177 @@ contract Specification_Test is CommonTest {
         _addSpec({ _name: "MintManager", _sel: _getSel("renounceOwnership()"), _auth: Role.MINTMANAGEROWNER });
         _addSpec({ _name: "MintManager", _sel: _getSel("transferOwnership(address)"), _auth: Role.MINTMANAGEROWNER });
         _addSpec({ _name: "MintManager", _sel: _getSel("upgrade(address)"), _auth: Role.MINTMANAGEROWNER });
+
+        // AnchorStateRegistry
+        _addSpec({ _name: "AnchorStateRegistry", _sel: _getSel("anchors(uint32)") });
+        _addSpec({ _name: "AnchorStateRegistry", _sel: _getSel("disputeGameFactory()") });
+        _addSpec({ _name: "AnchorStateRegistry", _sel: _getSel("initialize((uint32,(bytes32,uint256))[])") });
+        _addSpec({ _name: "AnchorStateRegistry", _sel: _getSel("tryUpdateAnchorState()") });
+        _addSpec({ _name: "AnchorStateRegistry", _sel: _getSel("version()") });
+
+        // PermissionedDisputeGame
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("absolutePrestate()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("addLocalData(uint256,uint256,uint256)") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("anchorStateRegistry()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("attack(uint256,bytes32)"), _auth: Role.CHALLENGER });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("challenger()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("claimCredit(address)") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("claimData(uint256)") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("claimDataLen()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("claims(bytes32)") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("clockExtension()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("createdAt()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("credit(address)") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("defend(uint256,bytes32)"), _auth: Role.CHALLENGER });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("extraData()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("gameCreator()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("gameData()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("gameType()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("getChallengerDuration(uint256)") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("getRequiredBond(uint128)") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("initialize()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("l1Head()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("l2BlockNumber()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("l2ChainId()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("maxClockDuration()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("maxGameDepth()") });
+        _addSpec({
+            _name: "PermissionedDisputeGame",
+            _sel: _getSel("move(uint256,bytes32,bool)"),
+            _auth: Role.CHALLENGER
+        });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("proposer()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("resolve()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("resolveClaim(uint256)") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("resolvedAt()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("resolvedSubgames(uint256)") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("rootClaim()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("splitDepth()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("startingBlockNumber()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("startingOutputRoot()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("startingRootHash()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("status()") });
+        _addSpec({
+            _name: "PermissionedDisputeGame",
+            _sel: _getSel("step(uint256,bool,bytes,bytes)"),
+            _auth: Role.CHALLENGER
+        });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("subgames(uint256,uint256)") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("version()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("vm()") });
+        _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("weth()") });
+
+        // FaultDisputeGame
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("absolutePrestate()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("addLocalData(uint256,uint256,uint256)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("anchorStateRegistry()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("attack(uint256,bytes32)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("challenger()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("claimCredit(address)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("claimData(uint256)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("claimDataLen()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("claims(bytes32)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("clockExtension()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("createdAt()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("credit(address)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("defend(uint256,bytes32)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("extraData()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("gameCreator()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("gameData()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("gameType()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("getChallengerDuration(uint256)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("getRequiredBond(uint128)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("initialize()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("l1Head()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("l2BlockNumber()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("l2ChainId()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("maxClockDuration()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("maxGameDepth()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("move(uint256,bytes32,bool)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("proposer()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("resolve()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("getNumToResolve(uint256)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("resolveClaim(uint256,uint256)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("resolvedAt()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("resolvedSubgames(uint256)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("rootClaim()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("splitDepth()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("startingBlockNumber()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("startingOutputRoot()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("startingRootHash()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("status()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("step(uint256,bool,bytes,bytes)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("subgames(uint256,uint256)") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("version()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("vm()") });
+        _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("weth()") });
+
+        // DisputeGameFactory
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("create(uint32,bytes32,bytes)") });
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("findLatestGames(uint32,uint256,uint256)") });
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("gameAtIndex(uint256)") });
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("gameCount()") });
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("gameImpls(uint32)") });
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("games(uint32,bytes32,bytes)") });
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("getGameUUID(uint32,bytes32,bytes)") });
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("initBonds(uint32)") });
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("initialize(address)") });
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("owner()") });
+        _addSpec({
+            _name: "DisputeGameFactory",
+            _sel: _getSel("renounceOwnership()"),
+            _auth: Role.DISPUTEGAMEFACTORYOWNER
+        });
+        _addSpec({
+            _name: "DisputeGameFactory",
+            _sel: _getSel("setImplementation(uint32,address)"),
+            _auth: Role.GUARDIAN
+        });
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("setInitBond(uint32,uint256)"), _auth: Role.GUARDIAN });
+        _addSpec({
+            _name: "DisputeGameFactory",
+            _sel: _getSel("transferOwnership(address)"),
+            _auth: Role.DISPUTEGAMEFACTORYOWNER
+        });
+        _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("version()") });
+
+        // DelayedWETH
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("allowance(address,address)") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("approve(address,uint256)") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("balanceOf(address)") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("config()") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("decimals()") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("delay()") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("deposit()") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("hold(address,uint256)"), _auth: Role.GUARDIAN });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("initialize(address,address)") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("name()") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("owner()") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("recover(uint256)"), _auth: Role.GUARDIAN });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("renounceOwnership()"), _auth: Role.DELAYEDWETHOWNER });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("symbol()") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("totalSupply()") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("transfer(address,uint256)") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("transferFrom(address,address,uint256)") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("transferOwnership(address)"), _auth: Role.DELAYEDWETHOWNER });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("unlock(address,uint256)") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("version()") });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("withdraw(address,uint256)"), _pausable: true });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("withdraw(uint256)"), _pausable: true });
+        _addSpec({ _name: "DelayedWETH", _sel: _getSel("withdrawals(address,address)") });
+
+        // WETH98
+        _addSpec({ _name: "WETH98", _sel: _getSel("allowance(address,address)") });
+        _addSpec({ _name: "WETH98", _sel: _getSel("approve(address,uint256)") });
+        _addSpec({ _name: "WETH98", _sel: _getSel("balanceOf(address)") });
+        _addSpec({ _name: "WETH98", _sel: _getSel("decimals()") });
+        _addSpec({ _name: "WETH98", _sel: _getSel("deposit()") });
+        _addSpec({ _name: "WETH98", _sel: _getSel("name()") });
+        _addSpec({ _name: "WETH98", _sel: _getSel("symbol()") });
+        _addSpec({ _name: "WETH98", _sel: _getSel("totalSupply()") });
+        _addSpec({ _name: "WETH98", _sel: _getSel("transfer(address,uint256)") });
+        _addSpec({ _name: "WETH98", _sel: _getSel("transferFrom(address,address,uint256)") });
+        _addSpec({ _name: "WETH98", _sel: _getSel("withdraw(uint256)") });
     }
 
     /// @dev Computes the selector from a function signature.
@@ -483,12 +664,17 @@ contract Specification_Test is CommonTest {
 
     /// @notice Ensures that there's an auth spec for every L1 contract function.
     function testContractAuth() public {
-        Abi[] memory abis = _getL1ContractFunctionAbis();
+        string[] memory pathExcludes = new string[](1);
+        pathExcludes[0] = "src/dispute/interfaces/*";
+        Abi[] memory abis =
+            ForgeArtifacts.getContractFunctionAbis("src/{L1,dispute,governance,universal/ProxyAdmin.sol}", pathExcludes);
 
         for (uint256 i = 0; i < abis.length; i++) {
             string memory contractName = abis[i].contractName;
             assertEq(
-                abis[i].entries.length, numEntries[contractName], "Specification_Test: invalid number of ABI entries"
+                abis[i].entries.length,
+                numEntries[contractName],
+                string.concat("Specification_Test: invalid number of ABI entries for ", contractName)
             );
 
             for (uint256 j = 0; j < abis[i].entries.length; j++) {
@@ -497,40 +683,17 @@ contract Specification_Test is CommonTest {
                     "Checking auth spec for %s: %s(%x)", contractName, abiEntry.fnName, uint256(uint32(abiEntry.sel))
                 );
                 Spec memory spec = specs[contractName][abiEntry.sel];
-                assertTrue(spec.sel != bytes4(0), "Specification_Test: missing spec definition");
-                assertEq(abiEntry.sel, spec.sel, "Specification_Test: invalid ABI");
-            }
-        }
-    }
-
-    /// @dev Returns the function ABIs of all L1 contracts.
-    function _getL1ContractFunctionAbis() internal returns (Abi[] memory abis_) {
-        string[] memory command = new string[](3);
-        command[0] = Executables.bash;
-        command[1] = "-c";
-        command[2] = string.concat(
-            Executables.find,
-            " src/{L1,governance,universal/ProxyAdmin.sol} -type f -exec basename {} \\;",
-            " | ",
-            Executables.sed,
-            " 's/\\.[^.]*$//'",
-            " | ",
-            Executables.jq,
-            " -R -s 'split(\"\n\")[:-1]'"
-        );
-        string[] memory contractNames = abi.decode(vm.parseJson(string(vm.ffi(command))), (string[]));
-
-        abis_ = new Abi[](contractNames.length);
-
-        for (uint256 i; i < contractNames.length; i++) {
-            string memory contractName = contractNames[i];
-            string[] memory methodIdentifiers = ForgeArtifacts.getMethodIdentifiers(contractName);
-            abis_[i].contractName = contractName;
-            abis_[i].entries = new AbiEntry[](methodIdentifiers.length);
-            for (uint256 j; j < methodIdentifiers.length; j++) {
-                string memory fnName = methodIdentifiers[j];
-                bytes4 sel = bytes4(keccak256(abi.encodePacked(fnName)));
-                abis_[i].entries[j] = AbiEntry({ fnName: fnName, sel: sel });
+                assertTrue(
+                    spec.sel != bytes4(0),
+                    string.concat(
+                        "Specification_Test: missing spec definition for ", contractName, "::", abiEntry.fnName
+                    )
+                );
+                assertEq(
+                    abiEntry.sel,
+                    spec.sel,
+                    string.concat("Specification_Test: invalid ABI ", contractName, "::", abiEntry.fnName)
+                );
             }
         }
     }
diff --git a/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol b/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol
index d1bf6456e2c8..181fc87266ac 100644
--- a/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol
+++ b/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol
@@ -6,7 +6,7 @@ import { CommonBase } from "forge-std/Base.sol";
 import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol";
 import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol";
 
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
 
 /// @title GameSolver
 /// @notice The `GameSolver` contract is a contract that can produce an array of available
@@ -218,11 +218,12 @@ contract HonestGameSolver is GameSolver {
         bool isAttack = _direction == Direction.Attack;
 
         uint256 bond = GAME.getRequiredBond(_movePos);
+        (,,,, Claim disputed,,) = GAME.claimData(_challengeIndex);
 
         move_ = Move({
             kind: isAttack ? MoveKind.Attack : MoveKind.Defend,
             value: bond,
-            data: abi.encodeCall(FaultDisputeGame.move, (_challengeIndex, claimAt(_movePos), isAttack))
+            data: abi.encodeCall(FaultDisputeGame.move, (disputed, _challengeIndex, claimAt(_movePos), isAttack))
         });
     }
 
diff --git a/packages/contracts-bedrock/test/actors/FaultDisputeActors2.sol b/packages/contracts-bedrock/test/actors/FaultDisputeActors2.sol
new file mode 100644
index 000000000000..c1cbb45cecd8
--- /dev/null
+++ b/packages/contracts-bedrock/test/actors/FaultDisputeActors2.sol
@@ -0,0 +1,418 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.15;
+
+import { CommonBase } from "forge-std/Base.sol";
+
+import { FaultDisputeGame } from "src/dispute/FaultDisputeGame2.sol";
+import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol";
+
+import "src/dispute/lib/Types.sol";
+
+/// @title GameSolver
+/// @notice The `GameSolver` contract is a contract that can produce an array of available
+///         moves for a given `FaultDisputeGame` contract, from the eyes of an honest
+///         actor. The `GameSolver` does not implement functionality for acting on the `Move`s
+///         it suggests.
+abstract contract GameSolver is CommonBase {
+    /// @notice The `FaultDisputeGame` proxy that the `GameSolver` will be solving.
+    FaultDisputeGame public immutable GAME;
+    /// @notice The split depth of the game
+    uint256 internal immutable SPLIT_DEPTH;
+    /// @notice The max depth of the game
+    uint256 internal immutable MAX_DEPTH;
+    /// @notice The maximum L2 block number that the output bisection portion of the position tree
+    ///         can handle.
+    uint256 internal immutable MAX_L2_BLOCK_NUMBER;
+
+    /// @notice The L2 outputs that the `GameSolver` will be representing, keyed by L2 block number - 1.
+    uint256[] public l2Outputs;
+    /// @notice The execution trace that the `GameSolver` will be representing.
+    bytes public trace;
+    /// @notice The raw absolute prestate data.
+    bytes public absolutePrestateData;
+    /// @notice The offset of previously processed claims in the `GAME` contract's `claimData` array.
+    ///         Starts at 0 and increments by 1 for each claim processed.
+    uint256 public processedBuf;
+    /// @notice Signals whether or not the `GameSolver` agrees with the root claim of the
+    ///         `GAME` contract.
+    bool public agreeWithRoot;
+
+    /// @notice The `MoveKind` enum represents a kind of interaction with the `FaultDisputeGame` contract.
+    enum MoveKind {
+        Attack,
+        Defend,
+        Step,
+        AddLocalData
+    }
+
+    /// @notice The `Move` struct represents a move in the game, and contains information
+    ///         about the kind of move, the sender of the move, and the calldata to be sent
+    ///         to the `FaultDisputeGame` contract by a consumer of this contract.
+    struct Move {
+        MoveKind kind;
+        bytes data;
+        uint256 value;
+    }
+
+    constructor(
+        FaultDisputeGame _gameProxy,
+        uint256[] memory _l2Outputs,
+        bytes memory _trace,
+        bytes memory _preStateData
+    ) {
+        GAME = _gameProxy;
+        SPLIT_DEPTH = GAME.splitDepth();
+        MAX_DEPTH = GAME.maxGameDepth();
+        MAX_L2_BLOCK_NUMBER = 2 ** (MAX_DEPTH - SPLIT_DEPTH);
+
+        l2Outputs = _l2Outputs;
+        trace = _trace;
+        absolutePrestateData = _preStateData;
+    }
+
+    /// @notice Returns an array of `Move`s that can be taken from the perspective of an honest
+    ///         actor in the `FaultDisputeGame` contract.
+    function solveGame() external virtual returns (Move[] memory moves_);
+}
+
+/// @title HonestGameSolver
+/// @notice The `HonestGameSolver` is an implementation of `GameSolver` which responds accordingly depending
+///         on the state of the `FaultDisputeGame` contract in relation to their local opinion of the correct
+///         order of output roots and the execution trace between each block `n` -> `n + 1` state transition.
+contract HonestGameSolver is GameSolver {
+    /// @notice The `Direction` enum represents the direction of a proposed move in the game,
+    ///         or a lack thereof.
+    enum Direction {
+        Defend,
+        Attack,
+        Noop
+    }
+
+    constructor(
+        FaultDisputeGame _gameProxy,
+        uint256[] memory _l2Outputs,
+        bytes memory _trace,
+        bytes memory _preStateData
+    )
+        GameSolver(_gameProxy, _l2Outputs, _trace, _preStateData)
+    {
+        // Mark agreement with the root claim if the local opinion of the root claim is the same as the
+        // observed root claim.
+        agreeWithRoot = Claim.unwrap(outputAt(MAX_L2_BLOCK_NUMBER)) == Claim.unwrap(_gameProxy.rootClaim());
+    }
+
+    ////////////////////////////////////////////////////////////////
+    //                          EXTERNAL                          //
+    ////////////////////////////////////////////////////////////////
+
+    /// @notice Returns an array of `Move`s that can be taken from the perspective of an honest
+    ///         actor in the `FaultDisputeGame` contract.
+    function solveGame() external override returns (Move[] memory moves_) {
+        uint256 numClaims = GAME.claimDataLen();
+
+        // Pre-allocate the `moves_` array to the maximum possible length. Test environment, so
+        // over-allocation is fine, and more easy to read than making a linked list in asm.
+        moves_ = new Move[](numClaims - processedBuf);
+
+        uint256 numMoves = 0;
+        for (uint256 i = processedBuf; i < numClaims; i++) {
+            // Grab the observed claim.
+            IFaultDisputeGame.ClaimData memory observed = getClaimData(i);
+
+            // Determine the direction of the next move to be taken.
+            (Direction moveDirection, Position movePos) = determineDirection(observed);
+
+            // Continue if there is no move to be taken against the observed claim.
+            if (moveDirection == Direction.Noop) continue;
+
+            if (movePos.depth() <= MAX_DEPTH) {
+                // bisection
+                moves_[numMoves++] = handleBisectionMove(moveDirection, movePos, i);
+            } else {
+                // instruction step
+                moves_[numMoves++] = handleStepMove(moveDirection, observed.position, movePos, i);
+            }
+        }
+
+        // Update the length of the `moves_` array to the number of moves that were added. This is
+        // always a no-op or a truncation operation.
+        assembly {
+            mstore(moves_, numMoves)
+        }
+
+        // Increment `processedBuf` by the number of claims processed, so that next time around,
+        // we don't attempt to process the same claims again.
+        processedBuf += numClaims - processedBuf;
+    }
+
+    ////////////////////////////////////////////////////////////////
+    //                          INTERNAL                          //
+    ////////////////////////////////////////////////////////////////
+
+    /// @dev Helper function to determine the direction of the next move to be taken.
+    function determineDirection(IFaultDisputeGame.ClaimData memory _claimData)
+        internal
+        view
+        returns (Direction direction_, Position movePos_)
+    {
+        bool rightLevel = isRightLevel(_claimData.position);
+        bool localAgree = Claim.unwrap(claimAt(_claimData.position)) == Claim.unwrap(_claimData.claim);
+        if (_claimData.parentIndex == type(uint32).max) {
+            // If we agree with the parent claim and it is on a level we agree with, ignore it.
+            if (localAgree && rightLevel) {
+                return (Direction.Noop, Position.wrap(0));
+            }
+
+            // The parent claim is the root claim. We must attack if we disagree per the game rules.
+            direction_ = Direction.Attack;
+            movePos_ = _claimData.position.move(true);
+        } else {
+            // Never attempt to defend an execution trace subgame root. Only attack if we disagree with it,
+            // otherwise do nothing.
+            // NOTE: This is not correct behavior in the context of the honest actor; The alphabet game has
+            //       a constant status byte, and is not safe from someone being dishonest in output bisection
+            //       and then posting a correct execution trace bisection root claim.
+            if (_claimData.position.depth() == SPLIT_DEPTH + 1 && localAgree) {
+                return (Direction.Noop, Position.wrap(0));
+            }
+
+            // If the parent claim is not the root claim, first check if the observed claim is on a level that
+            // agrees with the local view of the root claim. If it is, noop. If it is not, perform an attack or
+            // defense depending on the local view of the observed claim.
+            if (rightLevel) {
+                // Never move against a claim on the right level. Even if it's wrong, if it's uncountered, it furthers
+                // our goals.
+                return (Direction.Noop, Position.wrap(0));
+            } else {
+                // Fetch the local opinion of the parent claim.
+                Claim localParent = claimAt(_claimData.position);
+
+                // NOTE: Poison not handled.
+                if (Claim.unwrap(localParent) != Claim.unwrap(_claimData.claim)) {
+                    // If we disagree with the observed claim, we must attack it.
+                    movePos_ = _claimData.position.move(true);
+                    direction_ = Direction.Attack;
+                } else {
+                    // If we agree with the observed claim, we must defend the observed claim.
+                    movePos_ = _claimData.position.move(false);
+                    direction_ = Direction.Defend;
+                }
+            }
+        }
+    }
+
+    /// @notice Returns a `Move` struct that represents an attack or defense move in the bisection portion
+    ///         of the game.
+    ///
+    /// @dev Note: This function assumes that the `movePos` and `challengeIndex` are valid within the
+    ///            output bisection context. This is enforced by the `solveGame` function.
+    function handleBisectionMove(
+        Direction _direction,
+        Position _movePos,
+        uint256 _challengeIndex
+    )
+        internal
+        view
+        returns (Move memory move_)
+    {
+        bool isAttack = _direction == Direction.Attack;
+
+        uint256 bond = GAME.getRequiredBond(_movePos);
+
+        move_ = Move({
+            kind: isAttack ? MoveKind.Attack : MoveKind.Defend,
+            value: bond,
+            data: abi.encodeCall(FaultDisputeGame.move, (_challengeIndex, claimAt(_movePos), isAttack))
+        });
+    }
+
+    /// @notice Returns a `Move` struct that represents a step move in the execution trace
+    ///         bisection portion of the dispute game.
+    /// @dev Note: This function assumes that the `movePos` and `challengeIndex` are valid within the
+    ///            execution trace bisection context. This is enforced by the `solveGame` function.
+    function handleStepMove(
+        Direction _direction,
+        Position _parentPos,
+        Position _movePos,
+        uint256 _challengeIndex
+    )
+        internal
+        view
+        returns (Move memory move_)
+    {
+        bool isAttack = _direction == Direction.Attack;
+        bytes memory preStateTrace;
+
+        // First, we need to find the pre/post state index depending on whether we
+        // are making an attack step or a defense step. If the relative index at depth of the
+        // move position is 0, the prestate is the absolute prestate and we need to
+        // do nothing.
+        if ((_movePos.indexAtDepth() % (2 ** (MAX_DEPTH - SPLIT_DEPTH))) != 0) {
+            // Grab the trace up to the prestate's trace index.
+            if (isAttack) {
+                Position leafPos = Position.wrap(Position.unwrap(_parentPos) - 1);
+                preStateTrace = abi.encode(leafPos.traceIndex(MAX_DEPTH), stateAt(leafPos));
+            } else {
+                preStateTrace = abi.encode(_parentPos.traceIndex(MAX_DEPTH), stateAt(_parentPos));
+            }
+        } else {
+            preStateTrace = absolutePrestateData;
+        }
+
+        move_ = Move({
+            kind: MoveKind.Step,
+            value: 0,
+            data: abi.encodeCall(FaultDisputeGame.step, (_challengeIndex, isAttack, preStateTrace, hex""))
+        });
+    }
+
+    ////////////////////////////////////////////////////////////////
+    //                          HELPERS                           //
+    ////////////////////////////////////////////////////////////////
+
+    /// @dev Helper function to get the `ClaimData` struct at a given index in the `GAME` contract's
+    ///      `claimData` array.
+    function getClaimData(uint256 _claimIndex) internal view returns (IFaultDisputeGame.ClaimData memory claimData_) {
+        // thanks, solc
+        (
+            uint32 parentIndex,
+            address countered,
+            address claimant,
+            uint128 bond,
+            Claim claim,
+            Position position,
+            Clock clock
+        ) = GAME.claimData(_claimIndex);
+        claimData_ = IFaultDisputeGame.ClaimData({
+            parentIndex: parentIndex,
+            counteredBy: countered,
+            claimant: claimant,
+            bond: bond,
+            claim: claim,
+            position: position,
+            clock: clock
+        });
+    }
+
+    /// @notice Returns the player's claim that commits to a given position, swapping between
+    ///         output bisection claims and execution trace bisection claims depending on the depth.
+    /// @dev Prefer this function over `outputAt` or `statehashAt` directly.
+    function claimAt(Position _position) internal view returns (Claim claim_) {
+        return _position.depth() > SPLIT_DEPTH ? statehashAt(_position) : outputAt(_position);
+    }
+
+    /// @notice Returns the mock output at the given position.
+    function outputAt(Position _position) internal view returns (Claim claim_) {
+        // Don't allow for positions that are deeper than the split depth.
+        if (_position.depth() > SPLIT_DEPTH) {
+            revert("GameSolver: invalid position depth");
+        }
+
+        return outputAt(_position.traceIndex(SPLIT_DEPTH) + 1);
+    }
+
+    /// @notice Returns the mock output at the given L2 block number.
+    function outputAt(uint256 _l2BlockNumber) internal view returns (Claim claim_) {
+        return Claim.wrap(bytes32(l2Outputs[_l2BlockNumber - 1]));
+    }
+
+    /// @notice Returns the player's claim that commits to a given trace index.
+    function statehashAt(uint256 _traceIndex) internal view returns (Claim claim_) {
+        bytes32 hash =
+            keccak256(abi.encode(_traceIndex >= trace.length ? trace.length - 1 : _traceIndex, stateAt(_traceIndex)));
+        assembly {
+            claim_ := or(and(hash, not(shl(248, 0xFF))), shl(248, 1))
+        }
+    }
+
+    /// @notice Returns the player's claim that commits to a given trace index.
+    function statehashAt(Position _position) internal view returns (Claim claim_) {
+        return statehashAt(_position.traceIndex(MAX_DEPTH));
+    }
+
+    /// @notice Returns the state at the trace index within the player's trace.
+    function stateAt(Position _position) internal view returns (uint256 state_) {
+        return stateAt(_position.traceIndex(MAX_DEPTH));
+    }
+
+    /// @notice Returns the state at the trace index within the player's trace.
+    function stateAt(uint256 _traceIndex) internal view returns (uint256 state_) {
+        return uint256(uint8(_traceIndex >= trace.length ? trace[trace.length - 1] : trace[_traceIndex]));
+    }
+
+    /// @notice Returns whether or not the position is on a level which opposes the local opinion of the
+    ///         root claim.
+    function isRightLevel(Position _position) internal view returns (bool isRightLevel_) {
+        isRightLevel_ = agreeWithRoot == (_position.depth() % 2 == 0);
+    }
+}
+
+/// @title DisputeActor
+/// @notice The `DisputeActor` contract is an abstract contract that represents an actor
+///         that consumes the suggested moves from a `GameSolver` contract.
+abstract contract DisputeActor {
+    /// @notice The `GameSolver` contract used to determine the moves to be taken.
+    GameSolver public solver;
+
+    /// @notice Performs all available moves deemed by the attached solver.
+    /// @return numMoves_ The number of moves that the actor took.
+    /// @return success_ True if all moves were successful, false otherwise.
+    function move() external virtual returns (uint256 numMoves_, bool success_);
+}
+
+/// @title HonestDisputeActor
+/// @notice An actor that consumes the suggested moves from an `HonestGameSolver` contract. Note
+///         that this actor *can* be dishonest if the trace is faulty, but it will always follow
+///         the rules of the honest actor.
+contract HonestDisputeActor is DisputeActor {
+    FaultDisputeGame public immutable GAME;
+
+    constructor(
+        FaultDisputeGame _gameProxy,
+        uint256[] memory _l2Outputs,
+        bytes memory _trace,
+        bytes memory _preStateData
+    ) {
+        GAME = _gameProxy;
+        solver = GameSolver(new HonestGameSolver(_gameProxy, _l2Outputs, _trace, _preStateData));
+    }
+
+    /// @inheritdoc DisputeActor
+    function move() external override returns (uint256 numMoves_, bool success_) {
+        GameSolver.Move[] memory moves = solver.solveGame();
+        numMoves_ = moves.length;
+
+        // Optimistically assume success, will be set to false if any move fails.
+        success_ = true;
+
+        // Perform all available moves given to the actor by the solver.
+        for (uint256 i = 0; i < moves.length; i++) {
+            GameSolver.Move memory localMove = moves[i];
+
+            // If the move is a step, we first need to add the starting L2 block number to the `PreimageOracle`
+            // via the `FaultDisputeGame` contract.
+            // TODO: This is leaky. Could be another move kind.
+            if (localMove.kind == GameSolver.MoveKind.Step) {
+                bytes memory moveData = localMove.data;
+                uint256 challengeIndex;
+                assembly {
+                    challengeIndex := mload(add(moveData, 0x24))
+                }
+                GAME.addLocalData({
+                    _ident: LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER,
+                    _execLeafIdx: challengeIndex,
+                    _partOffset: 0
+                });
+            }
+
+            (bool innerSuccess,) = address(GAME).call{ value: localMove.value }(localMove.data);
+            assembly {
+                success_ := and(success_, innerSuccess)
+            }
+        }
+    }
+
+    fallback() external payable { }
+
+    receive() external payable { }
+}
diff --git a/packages/contracts-bedrock/test/cannon/MIPS.t.sol b/packages/contracts-bedrock/test/cannon/MIPS.t.sol
index eb7843fd7cc9..f62aaceac4f5 100644
--- a/packages/contracts-bedrock/test/cannon/MIPS.t.sol
+++ b/packages/contracts-bedrock/test/cannon/MIPS.t.sol
@@ -4,7 +4,7 @@ pragma solidity 0.8.15;
 import { CommonTest } from "test/setup/CommonTest.sol";
 import { MIPS } from "src/cannon/MIPS.sol";
 import { PreimageOracle } from "src/cannon/PreimageOracle.sol";
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
 
 contract MIPS_Test is CommonTest {
     MIPS internal mips;
@@ -892,6 +892,26 @@ contract MIPS_Test is CommonTest {
         assertEq(postState, outputState(expect), "unexpected post state");
     }
 
+    function test_div_byZero_fails() external {
+        uint32 insn = encodespec(0x9, 0xa, 0x0, 0x1a); // div t1, t2
+        (MIPS.State memory state, bytes memory proof) = constructMIPSState(0, insn, 0x4, 0);
+        state.registers[9] = 5; // t1
+        state.registers[10] = 0; // t2
+
+        vm.expectRevert("MIPS: division by zero");
+        mips.step(encodeState(state), proof, 0);
+    }
+
+    function test_divu_byZero_fails() external {
+        uint32 insn = encodespec(0x9, 0xa, 0x0, 0x1b); // divu t1, t2
+        (MIPS.State memory state, bytes memory proof) = constructMIPSState(0, insn, 0x4, 0);
+        state.registers[9] = 5; // t1
+        state.registers[10] = 0; // t2
+
+        vm.expectRevert("MIPS: division by zero");
+        mips.step(encodeState(state), proof, 0);
+    }
+
     function test_beq_succeeds() external {
         uint16 boff = 0x10;
         uint32 insn = encodeitype(0x4, 0x9, 0x8, boff); // beq $t0, $t1, 16
diff --git a/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol b/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol
index 2ca5f08cbc78..5c8709ae9687 100644
--- a/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol
+++ b/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 pragma solidity 0.8.15;
 
-import { Test, console2 as console } from "forge-std/Test.sol";
+import { Test, Vm, console2 as console } from "forge-std/Test.sol";
 
 import { PreimageOracle } from "src/cannon/PreimageOracle.sol";
 import { PreimageKeyLib } from "src/cannon/PreimageKeyLib.sol";
@@ -20,7 +20,7 @@ contract PreimageOracle_Test is Test {
     }
 
     /// @notice Test the pre-image key computation with a known pre-image.
-    function test_keccak256PreimageKey_succeeds() public {
+    function test_keccak256PreimageKey_succeeds() public pure {
         bytes memory preimage = hex"deadbeef";
         bytes32 key = PreimageKeyLib.keccak256PreimageKey(preimage);
         bytes32 known = 0x02fd4e189132273036449fc9e11198c739161b4c0116a9a2dccdfa1c492006f1;
@@ -329,11 +329,19 @@ contract PreimageOracle_LargePreimageProposals_Test is Test {
         // Allocate the calldata so it isn't included in the gas measurement.
         bytes memory cd = abi.encodeCall(oracle.addLeavesLPP, (TEST_UUID, 0, data, stateCommitments, true));
 
+        // Record logs from the call. `expectEmit` does not capture assembly logs.
+        bytes memory expectedLog = abi.encodePacked(address(this), cd);
+        vm.recordLogs();
+
         uint256 gas = gasleft();
         (bool success,) = address(oracle).call(cd);
         uint256 gasUsed = gas - gasleft();
         assertTrue(success);
 
+        Vm.Log[] memory logs = vm.getRecordedLogs();
+        assertEq(logs[0].data, expectedLog);
+        assertEq(logs[0].emitter, address(oracle));
+
         console.log("Gas used: %d", gasUsed);
         console.log("Gas per byte (%d bytes streamed): %d", data.length, gasUsed / data.length);
         console.log("Gas for 4MB: %d", (gasUsed / data.length) * 4000000);
diff --git a/packages/contracts-bedrock/test/dispute/AnchorStateRegistry.t.sol b/packages/contracts-bedrock/test/dispute/AnchorStateRegistry.t.sol
new file mode 100644
index 000000000000..4f9cb3c8115e
--- /dev/null
+++ b/packages/contracts-bedrock/test/dispute/AnchorStateRegistry.t.sol
@@ -0,0 +1,135 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.15;
+
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
+
+import { Test } from "forge-std/Test.sol";
+import { FaultDisputeGame_Init, _changeClaimStatus } from "test/dispute/FaultDisputeGame.t.sol";
+
+contract AnchorStateRegistry_Init is FaultDisputeGame_Init {
+    function setUp() public virtual override {
+        // Duplicating the initialization/setup logic of FaultDisputeGame_Test.
+        // See that test for more information, actual values here not really important.
+        Claim rootClaim = Claim.wrap(bytes32((uint256(1) << 248) | uint256(10)));
+        bytes memory absolutePrestateData = abi.encode(0);
+        Claim absolutePrestate = _changeClaimStatus(Claim.wrap(keccak256(absolutePrestateData)), VMStatuses.UNFINISHED);
+
+        super.setUp();
+        super.init({ rootClaim: rootClaim, absolutePrestate: absolutePrestate, l2BlockNumber: 0x10 });
+    }
+}
+
+contract AnchorStateRegistry_Initialize_Test is AnchorStateRegistry_Init {
+    /// @dev Tests that initialization is successful.
+    function test_initialize_succeeds() public view {
+        (Hash cannonRoot, uint256 cannonL2BlockNumber) = anchorStateRegistry.anchors(GameTypes.CANNON);
+        (Hash permissionedCannonRoot, uint256 permissionedCannonL2BlockNumber) =
+            anchorStateRegistry.anchors(GameTypes.PERMISSIONED_CANNON);
+        (Hash asteriscRoot, uint256 asteriscL2BlockNumber) = anchorStateRegistry.anchors(GameTypes.ASTERISC);
+        (Hash alphabetRoot, uint256 alphabetL2BlockNumber) = anchorStateRegistry.anchors(GameTypes.ALPHABET);
+        assertEq(cannonRoot.raw(), 0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF);
+        assertEq(cannonL2BlockNumber, 0);
+        assertEq(permissionedCannonRoot.raw(), 0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF);
+        assertEq(permissionedCannonL2BlockNumber, 0);
+        assertEq(asteriscRoot.raw(), 0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF);
+        assertEq(asteriscL2BlockNumber, 0);
+        assertEq(alphabetRoot.raw(), 0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF);
+        assertEq(alphabetL2BlockNumber, 0);
+    }
+}
+
+contract AnchorStateRegistry_TryUpdateAnchorState_Test is AnchorStateRegistry_Init {
+    /// @dev Tests that updating the anchor state succeeds when the game state is valid and newer.
+    function test_tryUpdateAnchorState_validNewerState_succeeds() public {
+        // Confirm that the anchor state is older than the game state.
+        (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assert(l2BlockNumber < gameProxy.l2BlockNumber());
+
+        // Mock the state that we want.
+        vm.mockCall(
+            address(gameProxy), abi.encodeWithSelector(gameProxy.status.selector), abi.encode(GameStatus.DEFENDER_WINS)
+        );
+
+        // Try to update the anchor state.
+        vm.prank(address(gameProxy));
+        anchorStateRegistry.tryUpdateAnchorState();
+
+        // Confirm that the anchor state is now the same as the game state.
+        (root, l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assertEq(l2BlockNumber, gameProxy.l2BlockNumber());
+        assertEq(root.raw(), gameProxy.rootClaim().raw());
+    }
+
+    /// @dev Tests that updating the anchor state fails when the game state is valid but older.
+    function test_tryUpdateAnchorState_validOlderState_fails() public {
+        // Confirm that the anchor state is newer than the game state.
+        vm.mockCall(address(gameProxy), abi.encodeWithSelector(gameProxy.l2BlockNumber.selector), abi.encode(0));
+        (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assert(l2BlockNumber >= gameProxy.l2BlockNumber());
+
+        // Mock the state that we want.
+        vm.mockCall(address(gameProxy), abi.encodeWithSelector(gameProxy.l2BlockNumber.selector), abi.encode(0));
+        vm.mockCall(
+            address(gameProxy), abi.encodeWithSelector(gameProxy.status.selector), abi.encode(GameStatus.DEFENDER_WINS)
+        );
+
+        // Try to update the anchor state.
+        vm.prank(address(gameProxy));
+        anchorStateRegistry.tryUpdateAnchorState();
+
+        // Confirm that the anchor state has not updated.
+        (Hash updatedRoot, uint256 updatedL2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assertEq(updatedL2BlockNumber, l2BlockNumber);
+        assertEq(updatedRoot.raw(), root.raw());
+    }
+
+    /// @dev Tests that updating the anchor state fails when the game state is invalid.
+    function test_tryUpdateAnchorState_invalidNewerState_fails() public {
+        // Confirm that the anchor state is older than the game state.
+        (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assert(l2BlockNumber < gameProxy.l2BlockNumber());
+
+        // Mock the state that we want.
+        vm.mockCall(
+            address(gameProxy),
+            abi.encodeWithSelector(gameProxy.status.selector),
+            abi.encode(GameStatus.CHALLENGER_WINS)
+        );
+
+        // Try to update the anchor state.
+        vm.prank(address(gameProxy));
+        anchorStateRegistry.tryUpdateAnchorState();
+
+        // Confirm that the anchor state has not updated.
+        (Hash updatedRoot, uint256 updatedL2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assertEq(updatedL2BlockNumber, l2BlockNumber);
+        assertEq(updatedRoot.raw(), root.raw());
+    }
+
+    /// @dev Tests that updating the anchor state fails when the game is not registered with the factory.
+    function test_tryUpdateAnchorState_invalidGame_fails() public {
+        // Confirm that the anchor state is older than the game state.
+        (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assert(l2BlockNumber < gameProxy.l2BlockNumber());
+
+        // Mock the state that we want.
+        vm.mockCall(
+            address(disputeGameFactory),
+            abi.encodeWithSelector(
+                disputeGameFactory.games.selector, gameProxy.gameType(), gameProxy.rootClaim(), gameProxy.extraData()
+            ),
+            abi.encode(address(0), 0)
+        );
+
+        // Try to update the anchor state.
+        vm.prank(address(gameProxy));
+        vm.expectRevert("AnchorStateRegistry: fault dispute game not registered with factory");
+        anchorStateRegistry.tryUpdateAnchorState();
+
+        // Confirm that the anchor state has not updated.
+        (Hash updatedRoot, uint256 updatedL2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assertEq(updatedL2BlockNumber, l2BlockNumber);
+        assertEq(updatedRoot.raw(), root.raw());
+    }
+}
diff --git a/packages/contracts-bedrock/test/dispute/DelayedWETH.t.sol b/packages/contracts-bedrock/test/dispute/DelayedWETH.t.sol
index 5064a38aaccb..0e0922f825c4 100644
--- a/packages/contracts-bedrock/test/dispute/DelayedWETH.t.sol
+++ b/packages/contracts-bedrock/test/dispute/DelayedWETH.t.sol
@@ -1,8 +1,8 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.15;
 
-import "src/libraries/DisputeTypes.sol";
-import "src/libraries/DisputeErrors.sol";
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
 
 import { Test } from "forge-std/Test.sol";
 import { DisputeGameFactory, IDisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
@@ -30,7 +30,7 @@ contract DelayedWETH_Init is CommonTest {
 
 contract DelayedWETH_Initialize_Test is DelayedWETH_Init {
     /// @dev Tests that initialization is successful.
-    function test_initialize_succeeds() public {
+    function test_initialize_succeeds() public view {
         assertEq(delayedWeth.owner(), address(this));
         assertEq(address(delayedWeth.config()), address(superchainConfig));
     }
@@ -158,7 +158,7 @@ contract DelayedWETH_Withdraw_Test is DelayedWETH_Init {
         vm.warp(block.timestamp + delayedWeth.delay() + 1);
 
         // Pause the contract.
-        address guardian = optimismPortal.GUARDIAN();
+        address guardian = optimismPortal.guardian();
         vm.prank(guardian);
         superchainConfig.pause("identifier");
 
@@ -172,6 +172,7 @@ contract DelayedWETH_Withdraw_Test is DelayedWETH_Init {
 contract DelayedWETH_Recover_Test is DelayedWETH_Init {
     /// @dev Tests that recovering WETH succeeds.
     function test_recover_succeeds() public {
+        // Transfer ownership to alice.
         delayedWeth.transferOwnership(alice);
 
         // Give the contract some WETH to recover.
@@ -191,16 +192,32 @@ contract DelayedWETH_Recover_Test is DelayedWETH_Init {
 
     /// @dev Tests that recovering WETH by non-owner fails.
     function test_recover_byNonOwner_fails() public {
+        // Pretend to be a non-owner.
         vm.prank(alice);
+
+        // Recover fails.
         vm.expectRevert("DelayedWETH: not owner");
         delayedWeth.recover(1 ether);
     }
 
-    /// @dev Tests that recovering more than the balance fails.
-    function test_recover_moreThanBalance_fails() public {
+    /// @dev Tests that recovering more than the balance recovers what it can.
+    function test_recover_moreThanBalance_succeeds() public {
+        // Transfer ownership to alice.
+        delayedWeth.transferOwnership(alice);
+
+        // Give the contract some WETH to recover.
         vm.deal(address(delayedWeth), 0.5 ether);
-        vm.expectRevert("DelayedWETH: insufficient balance");
+
+        // Record the initial balance.
+        uint256 initialBalance = address(alice).balance;
+
+        // Recover the WETH.
+        vm.prank(alice);
         delayedWeth.recover(1 ether);
+
+        // Verify the WETH was recovered.
+        assertEq(address(delayedWeth).balance, 0);
+        assertEq(address(alice).balance, initialBalance + 0.5 ether);
     }
 }
 
@@ -208,15 +225,32 @@ contract DelayedWETH_Hold_Test is DelayedWETH_Init {
     /// @dev Tests that holding WETH succeeds.
     function test_hold_succeeds() public {
         uint256 amount = 1 ether;
+
+        // Pretend to be alice and deposit some WETH.
+        vm.prank(alice);
+        delayedWeth.deposit{ value: amount }();
+
+        // Hold some WETH.
         vm.expectEmit(true, true, true, false);
-        emit Approval(address(this), alice, amount);
+        emit Approval(alice, address(this), amount);
         delayedWeth.hold(alice, amount);
-        assertEq(delayedWeth.allowance(address(this), alice), amount);
+
+        // Verify the allowance.
+        assertEq(delayedWeth.allowance(alice, address(this)), amount);
+
+        // We can transfer.
+        delayedWeth.transferFrom(alice, address(this), amount);
+
+        // Verify the transfer.
+        assertEq(delayedWeth.balanceOf(address(this)), amount);
     }
 
     /// @dev Tests that holding WETH by non-owner fails.
     function test_hold_byNonOwner_fails() public {
+        // Pretend to be a non-owner.
         vm.prank(alice);
+
+        // Hold fails.
         vm.expectRevert("DelayedWETH: not owner");
         delayedWeth.hold(bob, 1 ether);
     }
diff --git a/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol b/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol
index 10e2e9a03060..09a087fb5d77 100644
--- a/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol
+++ b/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol
@@ -1,8 +1,8 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.15;
 
-import "src/libraries/DisputeTypes.sol";
-import "src/libraries/DisputeErrors.sol";
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
 
 import { Test } from "forge-std/Test.sol";
 import { DisputeGameFactory, IDisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
@@ -32,7 +32,7 @@ contract DisputeGameFactory_Create_Test is DisputeGameFactory_Init {
     /// @dev Tests that the `create` function succeeds when creating a new dispute game
     ///      with a `GameType` that has an implementation set.
     function testFuzz_create_succeeds(
-        uint8 gameType,
+        uint32 gameType,
         Claim rootClaim,
         bytes calldata extraData,
         uint256 _value
@@ -72,9 +72,9 @@ contract DisputeGameFactory_Create_Test is DisputeGameFactory_Init {
         assertEq(address(proxy).balance, _value);
     }
 
-    /// @dev Tests that the `create` function reverts when creating a new dispute game with an insufficient bond.
-    function testFuzz_create_insufficientBond_reverts(
-        uint8 gameType,
+    /// @dev Tests that the `create` function reverts when creating a new dispute game with an incorrect bond amount.
+    function testFuzz_create_incorrectBondAmount_reverts(
+        uint32 gameType,
         Claim rootClaim,
         bytes calldata extraData
     )
@@ -92,7 +92,7 @@ contract DisputeGameFactory_Create_Test is DisputeGameFactory_Init {
             disputeGameFactory.setInitBond(lgt, 1 ether);
         }
 
-        vm.expectRevert(InsufficientBond.selector);
+        vm.expectRevert(IncorrectBondAmount.selector);
         disputeGameFactory.create(gt, rootClaim, extraData);
     }
 
@@ -110,7 +110,7 @@ contract DisputeGameFactory_Create_Test is DisputeGameFactory_Init {
     }
 
     /// @dev Tests that the `create` function reverts when there exists a dispute game with the same UUID.
-    function testFuzz_create_sameUUID_reverts(uint8 gameType, Claim rootClaim, bytes calldata extraData) public {
+    function testFuzz_create_sameUUID_reverts(uint32 gameType, Claim rootClaim, bytes calldata extraData) public {
         // Ensure that the `gameType` is within the bounds of the `GameType` enum's possible values.
         GameType gt = GameType.wrap(uint8(bound(gameType, 0, 2)));
         // Ensure the rootClaim has a VMStatus that disagrees with the validity.
@@ -195,7 +195,7 @@ contract DisputeGameFactory_SetInitBond_Test is DisputeGameFactory_Init {
 contract DisputeGameFactory_GetGameUUID_Test is DisputeGameFactory_Init {
     /// @dev Tests that the `getGameUUID` function returns the correct hash when comparing
     ///      against the keccak256 hash of the abi-encoded parameters.
-    function testDiff_getGameUUID_succeeds(uint8 gameType, Claim rootClaim, bytes calldata extraData) public {
+    function testDiff_getGameUUID_succeeds(uint32 gameType, Claim rootClaim, bytes calldata extraData) public view {
         // Ensure that the `gameType` is within the bounds of the `GameType` enum's possible values.
         GameType gt = GameType.wrap(uint8(bound(gameType, 0, 2)));
 
@@ -208,7 +208,7 @@ contract DisputeGameFactory_GetGameUUID_Test is DisputeGameFactory_Init {
 
 contract DisputeGameFactory_Owner_Test is DisputeGameFactory_Init {
     /// @dev Tests that the `owner` function returns the correct address after deployment.
-    function test_owner_succeeds() public {
+    function test_owner_succeeds() public view {
         assertEq(disputeGameFactory.owner(), address(this));
     }
 }
@@ -272,7 +272,7 @@ contract DisputeGameFactory_FindLatestGames_Test is DisputeGameFactory_Init {
         games = disputeGameFactory.findLatestGames(GameType.wrap(0), gameCount - 1, 1);
         assertEq(games.length, 1);
         assertEq(games[0].index, 30);
-        (GameType gameType, Timestamp createdAt, IDisputeGame game) = games[0].metadata.unpack();
+        (GameType gameType, Timestamp createdAt, address game) = games[0].metadata.unpack();
         assertEq(gameType.raw(), 0);
         assertEq(createdAt.raw(), block.timestamp);
 
@@ -328,7 +328,7 @@ contract DisputeGameFactory_FindLatestGames_Test is DisputeGameFactory_Init {
 
         // Create `_numGames` dispute games, with at least `_numSearchedGames` games.
         for (uint256 i; i < _numGames; i++) {
-            uint8 gameType = i < _numSearchedGames ? 0 : 1;
+            uint32 gameType = i < _numSearchedGames ? 0 : 1;
             disputeGameFactory.create(GameType.wrap(gameType), Claim.wrap(bytes32(i)), abi.encode(i));
         }
 
diff --git a/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol b/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol
index ae54cbbdb2b1..81e24d08b0eb 100644
--- a/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol
+++ b/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol
@@ -5,15 +5,19 @@ import { Test } from "forge-std/Test.sol";
 import { Vm } from "forge-std/Vm.sol";
 import { DisputeGameFactory_Init } from "test/dispute/DisputeGameFactory.t.sol";
 import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
-import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol";
+import { FaultDisputeGame, IDisputeGame } from "src/dispute/FaultDisputeGame.sol";
 import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol";
 import { PreimageOracle } from "src/cannon/PreimageOracle.sol";
 
-import "src/libraries/DisputeTypes.sol";
-import "src/libraries/DisputeErrors.sol";
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
+import { Types } from "src/libraries/Types.sol";
+import { Hashing } from "src/libraries/Hashing.sol";
+import { RLPWriter } from "src/libraries/rlp/RLPWriter.sol";
 import { LibClock } from "src/dispute/lib/LibUDT.sol";
 import { LibPosition } from "src/dispute/lib/LibPosition.sol";
 import { IPreimageOracle } from "src/dispute/interfaces/IBigStepper.sol";
+import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol";
 import { AlphabetVM } from "test/mocks/AlphabetVM.sol";
 
 import { DisputeActor, HonestDisputeActor } from "test/actors/FaultDisputeActors.sol";
@@ -32,15 +36,9 @@ contract FaultDisputeGame_Init is DisputeGameFactory_Init {
 
     event Move(uint256 indexed parentIndex, Claim indexed pivot, address indexed claimant);
 
-    function init(
-        Claim rootClaim,
-        Claim absolutePrestate,
-        uint256 l2BlockNumber,
-        uint256 genesisBlockNumber,
-        Hash genesisOutputRoot
-    )
-        public
-    {
+    event ReceiveETH(uint256 amount);
+
+    function init(Claim rootClaim, Claim absolutePrestate, uint256 l2BlockNumber) public {
         // Set the time to a realistic date.
         vm.warp(1690906994);
 
@@ -53,15 +51,16 @@ contract FaultDisputeGame_Init is DisputeGameFactory_Init {
         gameImpl = new FaultDisputeGame({
             _gameType: GAME_TYPE,
             _absolutePrestate: absolutePrestate,
-            _genesisBlockNumber: genesisBlockNumber,
-            _genesisOutputRoot: genesisOutputRoot,
             _maxGameDepth: 2 ** 3,
             _splitDepth: 2 ** 2,
-            _gameDuration: Duration.wrap(7 days),
+            _clockExtension: Duration.wrap(3 hours),
+            _maxClockDuration: Duration.wrap(3.5 days),
             _vm: _vm,
             _weth: delayedWeth,
+            _anchorStateRegistry: anchorStateRegistry,
             _l2ChainId: 10
         });
+
         // Register the game implementation with the factory.
         disputeGameFactory.setImplementation(GAME_TYPE, gameImpl);
         // Create a new game.
@@ -70,11 +69,12 @@ contract FaultDisputeGame_Init is DisputeGameFactory_Init {
         // Check immutables
         assertEq(gameProxy.gameType().raw(), GAME_TYPE.raw());
         assertEq(gameProxy.absolutePrestate().raw(), absolutePrestate.raw());
-        assertEq(gameProxy.genesisBlockNumber(), genesisBlockNumber);
-        assertEq(gameProxy.genesisOutputRoot().raw(), genesisOutputRoot.raw());
         assertEq(gameProxy.maxGameDepth(), 2 ** 3);
         assertEq(gameProxy.splitDepth(), 2 ** 2);
-        assertEq(gameProxy.gameDuration().raw(), 7 days);
+        assertEq(gameProxy.clockExtension().raw(), 3 hours);
+        assertEq(gameProxy.maxClockDuration().raw(), 3.5 days);
+        assertEq(address(gameProxy.weth()), address(delayedWeth));
+        assertEq(address(gameProxy.anchorStateRegistry()), address(anchorStateRegistry));
         assertEq(address(gameProxy.vm()), address(_vm));
 
         // Label the proxy
@@ -95,72 +95,109 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
     /// @dev The absolute prestate of the trace.
     Claim internal absolutePrestate;
 
-    /// @dev Minimum bond value that covers all possible moves.
-    uint256 internal constant MIN_BOND = 50 ether;
-
     function setUp() public override {
         absolutePrestateData = abi.encode(0);
         absolutePrestate = _changeClaimStatus(Claim.wrap(keccak256(absolutePrestateData)), VMStatuses.UNFINISHED);
 
         super.setUp();
-        super.init({
-            rootClaim: ROOT_CLAIM,
-            absolutePrestate: absolutePrestate,
-            l2BlockNumber: 0x10,
-            genesisBlockNumber: 0,
-            genesisOutputRoot: Hash.wrap(bytes32(0))
-        });
+        super.init({ rootClaim: ROOT_CLAIM, absolutePrestate: absolutePrestate, l2BlockNumber: 0x10 });
     }
 
     ////////////////////////////////////////////////////////////////
     //            `IDisputeGame` Implementation Tests             //
     ////////////////////////////////////////////////////////////////
 
+    /// @dev Tests that the constructor of the `FaultDisputeGame` reverts when the `MAX_GAME_DEPTH` parameter is
+    ///      greater  than `LibPosition.MAX_POSITION_BITLEN - 1`.
+    function testFuzz_constructor_maxDepthTooLarge_reverts(uint256 _maxGameDepth) public {
+        AlphabetVM alphabetVM = new AlphabetVM(absolutePrestate, new PreimageOracle(0, 0));
+
+        _maxGameDepth = bound(_maxGameDepth, LibPosition.MAX_POSITION_BITLEN, type(uint256).max - 1);
+        vm.expectRevert(MaxDepthTooLarge.selector);
+        new FaultDisputeGame({
+            _gameType: GAME_TYPE,
+            _absolutePrestate: absolutePrestate,
+            _maxGameDepth: _maxGameDepth,
+            _splitDepth: _maxGameDepth + 1,
+            _clockExtension: Duration.wrap(3 hours),
+            _maxClockDuration: Duration.wrap(3.5 days),
+            _vm: alphabetVM,
+            _weth: DelayedWETH(payable(address(0))),
+            _anchorStateRegistry: IAnchorStateRegistry(address(0)),
+            _l2ChainId: 10
+        });
+    }
+
     /// @dev Tests that the constructor of the `FaultDisputeGame` reverts when the `_splitDepth`
     ///      parameter is greater than or equal to the `MAX_GAME_DEPTH`
-    function test_constructor_wrongArgs_reverts(uint256 _splitDepth) public {
+    function testFuzz_constructor_invalidSplitDepth_reverts(uint256 _splitDepth) public {
         AlphabetVM alphabetVM = new AlphabetVM(absolutePrestate, new PreimageOracle(0, 0));
 
-        // Test that the constructor reverts when the `_splitDepth` parameter is greater than or equal
-        // to the `MAX_GAME_DEPTH` parameter.
         _splitDepth = bound(_splitDepth, 2 ** 3, type(uint256).max);
         vm.expectRevert(InvalidSplitDepth.selector);
         new FaultDisputeGame({
             _gameType: GAME_TYPE,
             _absolutePrestate: absolutePrestate,
-            _genesisBlockNumber: 0,
-            _genesisOutputRoot: Hash.wrap(bytes32(0)),
             _maxGameDepth: 2 ** 3,
             _splitDepth: _splitDepth,
-            _gameDuration: Duration.wrap(7 days),
+            _clockExtension: Duration.wrap(3 hours),
+            _maxClockDuration: Duration.wrap(3.5 days),
+            _vm: alphabetVM,
+            _weth: DelayedWETH(payable(address(0))),
+            _anchorStateRegistry: IAnchorStateRegistry(address(0)),
+            _l2ChainId: 10
+        });
+    }
+
+    /// @dev Tests that the constructor of the `FaultDisputeGame` reverts when clock extension is greater than the
+    ///      max clock duration.
+    function testFuzz_constructor_clockExtensionTooLong_reverts(
+        uint64 _maxClockDuration,
+        uint64 _clockExtension
+    )
+        public
+    {
+        AlphabetVM alphabetVM = new AlphabetVM(absolutePrestate, new PreimageOracle(0, 0));
+
+        _maxClockDuration = uint64(bound(_maxClockDuration, 0, type(uint64).max - 1));
+        _clockExtension = uint64(bound(_clockExtension, _maxClockDuration + 1, type(uint64).max));
+        vm.expectRevert(InvalidClockExtension.selector);
+        new FaultDisputeGame({
+            _gameType: GAME_TYPE,
+            _absolutePrestate: absolutePrestate,
+            _maxGameDepth: 16,
+            _splitDepth: 8,
+            _clockExtension: Duration.wrap(_clockExtension),
+            _maxClockDuration: Duration.wrap(_maxClockDuration),
             _vm: alphabetVM,
             _weth: DelayedWETH(payable(address(0))),
+            _anchorStateRegistry: IAnchorStateRegistry(address(0)),
             _l2ChainId: 10
         });
     }
 
     /// @dev Tests that the game's root claim is set correctly.
-    function test_rootClaim_succeeds() public {
+    function test_rootClaim_succeeds() public view {
         assertEq(gameProxy.rootClaim().raw(), ROOT_CLAIM.raw());
     }
 
     /// @dev Tests that the game's extra data is set correctly.
-    function test_extraData_succeeds() public {
+    function test_extraData_succeeds() public view {
         assertEq(gameProxy.extraData(), extraData);
     }
 
     /// @dev Tests that the game's starting timestamp is set correctly.
-    function test_createdAt_succeeds() public {
+    function test_createdAt_succeeds() public view {
         assertEq(gameProxy.createdAt().raw(), block.timestamp);
     }
 
     /// @dev Tests that the game's type is set correctly.
-    function test_gameType_succeeds() public {
+    function test_gameType_succeeds() public view {
         assertEq(gameProxy.gameType().raw(), GAME_TYPE.raw());
     }
 
     /// @dev Tests that the game's data is set correctly.
-    function test_gameData_succeeds() public {
+    function test_gameData_succeeds() public view {
         (GameType gameType, Claim rootClaim, bytes memory _extraData) = gameProxy.gameData();
 
         assertEq(gameType.raw(), GAME_TYPE.raw());
@@ -172,10 +209,11 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
     //          `IFaultDisputeGame` Implementation Tests       //
     ////////////////////////////////////////////////////////////////
 
-    /// @dev Tests that the game cannot be initialized with an output root that commits to <= the configured genesis
+    /// @dev Tests that the game cannot be initialized with an output root that commits to <= the configured starting
     ///      block number
     function testFuzz_initialize_cannotProposeGenesis_reverts(uint256 _blockNumber) public {
-        _blockNumber = bound(_blockNumber, 0, gameProxy.genesisBlockNumber());
+        (, uint256 startingL2Block) = gameProxy.startingOutputRoot();
+        _blockNumber = bound(_blockNumber, 0, startingL2Block);
 
         Claim claim = _dummyClaim();
         vm.expectRevert(abi.encodeWithSelector(UnexpectedRootClaim.selector, claim));
@@ -184,8 +222,8 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
     }
 
     /// @dev Tests that the proxy receives ETH from the dispute game factory.
-    function test_initialize_receivesETH_succeeds(uint128 _value) public {
-        _value = uint128(bound(_value, gameProxy.getRequiredBond(Position.wrap(1)), type(uint128).max));
+    function test_initialize_receivesETH_succeeds() public {
+        uint256 _value = disputeGameFactory.initBonds(GAME_TYPE);
         vm.deal(address(this), _value);
 
         assertEq(address(gameProxy).balance, 0);
@@ -196,30 +234,32 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         assertEq(delayedWeth.balanceOf(address(gameProxy)), _value);
     }
 
-    /// @dev Tests that the game cannot be initialized with extra data > 64 bytes long (root claim + l2 block number
-    ///      concatenated)
-    function testFuzz_initialize_extraDataTooLong_reverts(uint256 _extraDataLen) public {
+    /// @dev Tests that the game cannot be initialized with extra data of the incorrect length (must be 32 bytes)
+    function testFuzz_initialize_badExtraData_reverts(uint256 _extraDataLen) public {
         // The `DisputeGameFactory` will pack the root claim and the extra data into a single array, which is enforced
         // to be at least 64 bytes long.
         // We bound the upper end to 23.5KB to ensure that the minimal proxy never surpasses the contract size limit
         // in this test, as CWIA proxies store the immutable args in their bytecode.
-        // [33 bytes, 23.5 KB]
-        _extraDataLen = bound(_extraDataLen, 33, 23_500);
+        // [0 bytes, 31 bytes] u [33 bytes, 23.5 KB]
+        _extraDataLen = bound(_extraDataLen, 0, 23_500);
+        if (_extraDataLen == 32) {
+            _extraDataLen++;
+        }
         bytes memory _extraData = new bytes(_extraDataLen);
 
-        // Assign the first 32 bytes in `extraData` to a valid L2 block number passed genesis.
-        uint256 genesisBlockNumber = gameProxy.genesisBlockNumber();
+        // Assign the first 32 bytes in `extraData` to a valid L2 block number passed the starting block.
+        (, uint256 startingL2Block) = gameProxy.startingOutputRoot();
         assembly {
-            mstore(add(_extraData, 0x20), add(genesisBlockNumber, 1))
+            mstore(add(_extraData, 0x20), add(startingL2Block, 1))
         }
 
         Claim claim = _dummyClaim();
-        vm.expectRevert(abi.encodeWithSelector(ExtraDataTooLong.selector));
+        vm.expectRevert(abi.encodeWithSelector(BadExtraData.selector));
         gameProxy = FaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, claim, _extraData))));
     }
 
     /// @dev Tests that the game is initialized with the correct data.
-    function test_initialize_correctData_succeeds() public {
+    function test_initialize_correctData_succeeds() public view {
         // Assert that the root claim is initialized correctly.
         (
             uint32 parentIndex,
@@ -232,7 +272,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         ) = gameProxy.claimData(0);
         assertEq(parentIndex, type(uint32).max);
         assertEq(counteredBy, address(0));
-        assertEq(claimant, DEFAULT_SENDER);
+        assertEq(claimant, address(this));
         assertEq(bond, 0);
         assertEq(claim.raw(), ROOT_CLAIM.raw());
         assertEq(position.raw(), 1);
@@ -251,17 +291,43 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         gameProxy.initialize();
     }
 
+    /// @dev Tests that the user cannot control the first 4 bytes of the CWIA data, disallowing them to control the
+    ///      entrypoint when no calldata is provided to a call.
+    function test_cwiaCalldata_userCannotControlSelector_succeeds() public {
+        // Construct the expected CWIA data that the proxy will pass to the implementation, alongside any extra
+        // calldata passed by the user.
+        Hash l1Head = gameProxy.l1Head();
+        bytes memory cwiaData = abi.encodePacked(address(this), gameProxy.rootClaim(), l1Head, gameProxy.extraData());
+
+        // We expect a `ReceiveETH` event to be emitted when 0 bytes of calldata are sent; The fallback is always
+        // reached *within the minimal proxy* in `LibClone`'s version of `clones-with-immutable-args`
+        vm.expectEmit(false, false, false, true);
+        emit ReceiveETH(0);
+        // We expect no delegatecall to the implementation contract if 0 bytes are sent. Assert that this happens
+        // 0 times.
+        vm.expectCall(address(gameImpl), cwiaData, 0);
+        (bool successA,) = address(gameProxy).call(hex"");
+        assertTrue(successA);
+
+        // When calldata is forwarded, we do expect a delegatecall to the implementation.
+        bytes memory data = abi.encodePacked(gameProxy.l1Head.selector);
+        vm.expectCall(address(gameImpl), abi.encodePacked(data, cwiaData), 1);
+        (bool successB, bytes memory returnData) = address(gameProxy).call(data);
+        assertTrue(successB);
+        assertEq(returnData, abi.encode(l1Head));
+    }
+
     /// @dev Tests that the bond during the bisection game depths is correct.
-    function test_getRequiredBond_succeeds() public {
-        for (uint64 i = 0; i < uint64(gameProxy.splitDepth()); i++) {
+    function test_getRequiredBond_succeeds() public view {
+        for (uint8 i = 0; i < uint8(gameProxy.splitDepth()); i++) {
             Position pos = LibPosition.wrap(i, 0);
             uint256 bond = gameProxy.getRequiredBond(pos);
 
             // Reasonable approximation for a max depth of 8.
             uint256 expected = 0.08 ether;
             for (uint64 j = 0; j < i; j++) {
-                expected = expected * 217456;
-                expected = expected / 100000;
+                expected = expected * 22876;
+                expected = expected / 10000;
             }
 
             assertApproxEqAbs(bond, expected, 0.01 ether);
@@ -270,7 +336,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
 
     /// @dev Tests that the bond at a depth greater than the maximum game depth reverts.
     function test_getRequiredBond_outOfBounds_reverts() public {
-        Position pos = LibPosition.wrap(uint64(gameProxy.maxGameDepth() + 1), 0);
+        Position pos = LibPosition.wrap(uint8(gameProxy.maxGameDepth() + 1), 0);
         vm.expectRevert(GameDepthExceeded.selector);
         gameProxy.getRequiredBond(pos);
     }
@@ -292,15 +358,17 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         GameStatus status = gameProxy.status();
         assertEq(uint256(status), chalWins);
 
+        (,,,, Claim root,,) = gameProxy.claimData(0);
         // Attempt to make a move. Should revert.
         vm.expectRevert(GameNotInProgress.selector);
-        gameProxy.attack(0, Claim.wrap(0));
+        gameProxy.attack(root, 0, Claim.wrap(0));
     }
 
     /// @dev Tests that an attempt to defend the root claim reverts with the `CannotDefendRootClaim` error.
     function test_move_defendRoot_reverts() public {
+        (,,,, Claim root,,) = gameProxy.claimData(0);
         vm.expectRevert(CannotDefendRootClaim.selector);
-        gameProxy.defend(0, _dummyClaim());
+        gameProxy.defend(root, 0, _dummyClaim());
     }
 
     /// @dev Tests that an attempt to move against a claim that does not exist reverts with the
@@ -310,11 +378,11 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
 
         // Expect an out of bounds revert for an attack
         vm.expectRevert(abi.encodeWithSignature("Panic(uint256)", 0x32));
-        gameProxy.attack(1, claim);
+        gameProxy.attack(_dummyClaim(), 1, claim);
 
         // Expect an out of bounds revert for a defense
         vm.expectRevert(abi.encodeWithSignature("Panic(uint256)", 0x32));
-        gameProxy.defend(1, claim);
+        gameProxy.defend(_dummyClaim(), 1, claim);
     }
 
     /// @dev Tests that an attempt to move at the maximum game depth reverts with the
@@ -325,12 +393,15 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         uint256 maxDepth = gameProxy.maxGameDepth();
 
         for (uint256 i = 0; i <= maxDepth; i++) {
+            (,,,, Claim disputed,,) = gameProxy.claimData(i);
             // At the max game depth, the `_move` function should revert with
             // the `GameDepthExceeded` error.
             if (i == maxDepth) {
                 vm.expectRevert(GameDepthExceeded.selector);
+                gameProxy.attack{ value: 100 ether }(disputed, i, claim);
+            } else {
+                gameProxy.attack{ value: _getRequiredBond(i) }(disputed, i, claim);
             }
-            gameProxy.attack{ value: MIN_BOND }(i, claim);
         }
     }
 
@@ -339,8 +410,10 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
     function test_move_clockTimeExceeded_reverts() public {
         // Warp ahead past the clock time for the first move (3 1/2 days)
         vm.warp(block.timestamp + 3 days + 12 hours + 1);
+        uint256 bond = _getRequiredBond(0);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
         vm.expectRevert(ClockTimeExceeded.selector);
-        gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim());
+        gameProxy.attack{ value: bond }(disputed, 0, _dummyClaim());
     }
 
     /// @notice Static unit test for the correctness of the chess clock incrementation.
@@ -351,12 +424,16 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         Claim claim = _dummyClaim();
 
         vm.warp(block.timestamp + 15);
-        gameProxy.attack{ value: MIN_BOND }(0, claim);
+        uint256 bond = _getRequiredBond(0);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: bond }(disputed, 0, claim);
         (,,,,,, clock) = gameProxy.claimData(1);
         assertEq(clock.raw(), LibClock.wrap(Duration.wrap(15), Timestamp.wrap(uint64(block.timestamp))).raw());
 
         vm.warp(block.timestamp + 10);
-        gameProxy.attack{ value: MIN_BOND }(1, claim);
+        bond = _getRequiredBond(1);
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: bond }(disputed, 1, claim);
         (,,,,,, clock) = gameProxy.claimData(2);
         assertEq(clock.raw(), LibClock.wrap(Duration.wrap(10), Timestamp.wrap(uint64(block.timestamp))).raw());
 
@@ -365,27 +442,74 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         claim = _changeClaimStatus(claim, VMStatuses.PANIC);
 
         vm.warp(block.timestamp + 10);
-        gameProxy.attack{ value: MIN_BOND }(2, claim);
+        bond = _getRequiredBond(2);
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        gameProxy.attack{ value: bond }(disputed, 2, claim);
         (,,,,,, clock) = gameProxy.claimData(3);
         assertEq(clock.raw(), LibClock.wrap(Duration.wrap(25), Timestamp.wrap(uint64(block.timestamp))).raw());
 
         vm.warp(block.timestamp + 10);
-        gameProxy.attack{ value: MIN_BOND }(3, claim);
+        bond = _getRequiredBond(3);
+        (,,,, disputed,,) = gameProxy.claimData(3);
+        gameProxy.attack{ value: bond }(disputed, 3, claim);
         (,,,,,, clock) = gameProxy.claimData(4);
         assertEq(clock.raw(), LibClock.wrap(Duration.wrap(20), Timestamp.wrap(uint64(block.timestamp))).raw());
     }
 
+    /// @notice Static unit test that checks proper clock extension.
+    function test_move_clockExtensionCorrectness_succeeds() public {
+        (,,,,,, Clock clock) = gameProxy.claimData(0);
+        assertEq(clock.raw(), LibClock.wrap(Duration.wrap(0), Timestamp.wrap(uint64(block.timestamp))).raw());
+
+        Claim claim = _dummyClaim();
+        uint256 splitDepth = gameProxy.splitDepth();
+        uint64 halfGameDuration = gameProxy.maxClockDuration().raw();
+        uint64 clockExtension = gameProxy.clockExtension().raw();
+
+        // Make an initial attack against the root claim with 1 second left on the clock. The grandchild should be
+        // allocated exactly `clockExtension` seconds remaining on their potential clock.
+        vm.warp(block.timestamp + halfGameDuration - 1 seconds);
+        uint256 bond = _getRequiredBond(0);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: bond }(disputed, 0, claim);
+        (,,,,,, clock) = gameProxy.claimData(1);
+        assertEq(clock.duration().raw(), halfGameDuration - clockExtension);
+
+        // Warp ahead to the last second of the root claim defender's clock, and bisect all the way down to the move
+        // above the `SPLIT_DEPTH`. This warp guarantees that all moves from here on out will have clock extensions.
+        vm.warp(block.timestamp + halfGameDuration - 1 seconds);
+        for (uint256 i = 1; i < splitDepth - 2; i++) {
+            bond = _getRequiredBond(i);
+            (,,,, disputed,,) = gameProxy.claimData(i);
+            gameProxy.attack{ value: bond }(disputed, i, claim);
+        }
+
+        // Warp ahead 1 seconds to have `clockExtension - 1 seconds` left on the next move's clock.
+        vm.warp(block.timestamp + 1 seconds);
+
+        // The move above the split depth's grand child is the execution trace bisection root. The grandchild should
+        // be allocated `clockExtension * 2` seconds on their potential clock, if currently they have less than
+        // `clockExtension` seconds left.
+        bond = _getRequiredBond(splitDepth - 2);
+        (,,,, disputed,,) = gameProxy.claimData(splitDepth - 2);
+        gameProxy.attack{ value: bond }(disputed, splitDepth - 2, claim);
+        (,,,,,, clock) = gameProxy.claimData(splitDepth - 1);
+        assertEq(clock.duration().raw(), halfGameDuration - clockExtension * 2);
+    }
+
     /// @dev Tests that an identical claim cannot be made twice. The duplicate claim attempt should
     ///      revert with the `ClaimAlreadyExists` error.
     function test_move_duplicateClaim_reverts() public {
         Claim claim = _dummyClaim();
 
         // Make the first move. This should succeed.
-        gameProxy.attack{ value: MIN_BOND }(0, claim);
+        uint256 bond = _getRequiredBond(0);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: bond }(disputed, 0, claim);
 
         // Attempt to make the same move again.
         vm.expectRevert(ClaimAlreadyExists.selector);
-        gameProxy.attack{ value: MIN_BOND }(0, claim);
+        gameProxy.attack{ value: bond }(disputed, 0, claim);
     }
 
     /// @dev Static unit test asserting that identical claims at the same position can be made in different subgames.
@@ -394,13 +518,19 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         Claim claimB = _dummyClaim();
 
         // Make the first moves. This should succeed.
-        gameProxy.attack{ value: MIN_BOND }(0, claimA);
-        gameProxy.attack{ value: MIN_BOND }(0, claimB);
+        uint256 bond = _getRequiredBond(0);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: bond }(disputed, 0, claimA);
+        gameProxy.attack{ value: bond }(disputed, 0, claimB);
 
         // Perform an attack at the same position with the same claim value in both subgames.
         // These both should succeed.
-        gameProxy.attack{ value: MIN_BOND }(1, claimA);
-        gameProxy.attack{ value: MIN_BOND }(2, claimA);
+        bond = _getRequiredBond(1);
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: bond }(disputed, 1, claimA);
+        bond = _getRequiredBond(2);
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        gameProxy.attack{ value: bond }(disputed, 2, claimA);
     }
 
     /// @dev Static unit test for the correctness of an opening attack.
@@ -411,9 +541,11 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         Claim counter = _dummyClaim();
 
         // Perform the attack.
+        uint256 reqBond = _getRequiredBond(0);
         vm.expectEmit(true, true, true, false);
         emit Move(0, counter, address(this));
-        gameProxy.attack{ value: MIN_BOND }(0, counter);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: reqBond }(disputed, 0, counter);
 
         // Grab the claim data of the attack.
         (
@@ -430,7 +562,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         assertEq(parentIndex, 0);
         assertEq(counteredBy, address(0));
         assertEq(claimant, address(this));
-        assertEq(bond, MIN_BOND);
+        assertEq(bond, reqBond);
         assertEq(claim.raw(), counter.raw());
         assertEq(position.raw(), Position.wrap(1).move(true).raw());
         assertEq(clock.raw(), LibClock.wrap(Duration.wrap(5), Timestamp.wrap(uint64(block.timestamp))).raw());
@@ -441,7 +573,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         // Assert correctness of the parent claim's data.
         assertEq(parentIndex, type(uint32).max);
         assertEq(counteredBy, address(0));
-        assertEq(claimant, DEFAULT_SENDER);
+        assertEq(claimant, address(this));
         assertEq(bond, 0);
         assertEq(claim.raw(), ROOT_CLAIM.raw());
         assertEq(position.raw(), 1);
@@ -451,27 +583,209 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
     /// @dev Tests that making a claim at the execution trace bisection root level with an invalid status
     ///      byte reverts with the `UnexpectedRootClaim` error.
     function test_move_incorrectStatusExecRoot_reverts() public {
+        Claim disputed;
         for (uint256 i; i < 4; i++) {
-            gameProxy.attack{ value: MIN_BOND }(i, _dummyClaim());
+            (,,,, disputed,,) = gameProxy.claimData(i);
+            gameProxy.attack{ value: _getRequiredBond(i) }(disputed, i, _dummyClaim());
         }
 
+        uint256 bond = _getRequiredBond(4);
+        (,,,, disputed,,) = gameProxy.claimData(4);
         vm.expectRevert(abi.encodeWithSelector(UnexpectedRootClaim.selector, bytes32(0)));
-        gameProxy.attack{ value: MIN_BOND }(4, Claim.wrap(bytes32(0)));
+        gameProxy.attack{ value: bond }(disputed, 4, Claim.wrap(bytes32(0)));
     }
 
     /// @dev Tests that making a claim at the execution trace bisection root level with a valid status
     ///      byte succeeds.
     function test_move_correctStatusExecRoot_succeeds() public {
+        Claim disputed;
         for (uint256 i; i < 4; i++) {
-            gameProxy.attack{ value: MIN_BOND }(i, _dummyClaim());
+            uint256 bond = _getRequiredBond(i);
+            (,,,, disputed,,) = gameProxy.claimData(i);
+            gameProxy.attack{ value: bond }(disputed, i, _dummyClaim());
         }
-        gameProxy.attack{ value: MIN_BOND }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        uint256 lastBond = _getRequiredBond(4);
+        (,,,, disputed,,) = gameProxy.claimData(4);
+        gameProxy.attack{ value: lastBond }(disputed, 4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+    }
+
+    /// @dev Static unit test asserting that a move reverts when the bonded amount is incorrect.
+    function test_move_incorrectBondAmount_reverts() public {
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        vm.expectRevert(IncorrectBondAmount.selector);
+        gameProxy.attack{ value: 0 }(disputed, 0, _dummyClaim());
     }
 
-    /// @dev Static unit test asserting that a move reverts when the bond is insufficient.
-    function test_move_insufficientBond_reverts() public {
-        vm.expectRevert(InsufficientBond.selector);
-        gameProxy.attack{ value: 0 }(0, _dummyClaim());
+    /// @dev Static unit test asserting that a move reverts when the disputed claim does not match its index.
+    function test_move_incorrectDisputedIndex_reverts() public {
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        uint256 bond = _getRequiredBond(1);
+        vm.expectRevert(InvalidDisputedClaimIndex.selector);
+        gameProxy.attack{ value: bond }(disputed, 1, _dummyClaim());
+    }
+
+    /// @dev Tests that challenging the root claim's L2 block number by providing the real preimage of the output root
+    ///      succeeds.
+    function testFuzz_challengeRootL2Block_succeeds(
+        bytes32 _storageRoot,
+        bytes32 _withdrawalRoot,
+        uint256 _l2BlockNumber
+    )
+        public
+    {
+        _l2BlockNumber = bound(_l2BlockNumber, 0, type(uint256).max - 1);
+
+        (Types.OutputRootProof memory outputRootProof, bytes32 outputRoot, bytes memory headerRLP) =
+            _generateOutputRootProof(_storageRoot, _withdrawalRoot, abi.encodePacked(_l2BlockNumber));
+
+        // Create the dispute game with the output root at the wrong L2 block number.
+        IDisputeGame game = disputeGameFactory.create(GAME_TYPE, Claim.wrap(outputRoot), abi.encode(_l2BlockNumber + 1));
+
+        // Challenge the L2 block number.
+        FaultDisputeGame fdg = FaultDisputeGame(address(game));
+        fdg.challengeRootL2Block(outputRootProof, headerRLP);
+
+        // Ensure that a duplicate challenge reverts.
+        vm.expectRevert(L2BlockNumberChallenged.selector);
+        fdg.challengeRootL2Block(outputRootProof, headerRLP);
+
+        // Warp past the clocks, resolve the game.
+        vm.warp(block.timestamp + 3 days + 12 hours + 1);
+        fdg.resolveClaim(0, 0);
+        fdg.resolve();
+
+        // Ensure the challenge was successful.
+        assertEq(uint8(fdg.status()), uint8(GameStatus.CHALLENGER_WINS));
+        assertTrue(fdg.l2BlockNumberChallenged());
+    }
+
+    /// @dev Tests that challenging the root claim's L2 block number by providing the real preimage of the output root
+    ///      succeeds. Also, this claim should always receive the bond when there is another counter that is as far left
+    ///      as possible.
+    function testFuzz_challengeRootL2Block_receivesBond_succeeds(
+        bytes32 _storageRoot,
+        bytes32 _withdrawalRoot,
+        uint256 _l2BlockNumber
+    )
+        public
+    {
+        vm.deal(address(0xb0b), 1 ether);
+        _l2BlockNumber = bound(_l2BlockNumber, 0, type(uint256).max - 1);
+
+        (Types.OutputRootProof memory outputRootProof, bytes32 outputRoot, bytes memory headerRLP) =
+            _generateOutputRootProof(_storageRoot, _withdrawalRoot, abi.encodePacked(_l2BlockNumber));
+
+        // Create the dispute game with the output root at the wrong L2 block number.
+        disputeGameFactory.setInitBond(GAME_TYPE, 0.1 ether);
+        uint256 balanceBefore = address(this).balance;
+        IDisputeGame game = disputeGameFactory.create{ value: 0.1 ether }(
+            GAME_TYPE, Claim.wrap(outputRoot), abi.encode(_l2BlockNumber + 1)
+        );
+        FaultDisputeGame fdg = FaultDisputeGame(address(game));
+
+        // Attack the root as 0xb0b
+        uint256 bond = _getRequiredBond(0);
+        (,,,, Claim disputed,,) = fdg.claimData(0);
+        vm.prank(address(0xb0b));
+        fdg.attack{ value: bond }(disputed, 0, Claim.wrap(0));
+
+        // Challenge the L2 block number as 0xace. This claim should receive the root claim's bond.
+        vm.prank(address(0xace));
+        fdg.challengeRootL2Block(outputRootProof, headerRLP);
+
+        // Warp past the clocks, resolve the game.
+        vm.warp(block.timestamp + 3 days + 12 hours + 1);
+        fdg.resolveClaim(1, 0);
+        fdg.resolveClaim(0, 0);
+        fdg.resolve();
+
+        // Ensure the challenge was successful.
+        assertEq(uint8(fdg.status()), uint8(GameStatus.CHALLENGER_WINS));
+
+        // Wait for the withdrawal delay.
+        vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
+
+        // Claim credit
+        vm.expectRevert(NoCreditToClaim.selector);
+        fdg.claimCredit(address(this));
+        fdg.claimCredit(address(0xb0b));
+        fdg.claimCredit(address(0xace));
+
+        // Ensure that the party who challenged the L2 block number with the special move received the bond.
+        // - Root claim loses their bond
+        // - 0xace receives the root claim's bond
+        // - 0xb0b receives their bond back
+        assertEq(address(this).balance, balanceBefore - 0.1 ether);
+        assertEq(address(0xb0b).balance, 1 ether);
+        assertEq(address(0xace).balance, 0.1 ether);
+    }
+
+    /// @dev Tests that challenging the root claim's L2 block number by providing the real preimage of the output root
+    ///      never succeeds.
+    function testFuzz_challengeRootL2Block_rightBlockNumber_reverts(
+        bytes32 _storageRoot,
+        bytes32 _withdrawalRoot,
+        uint256 _l2BlockNumber
+    )
+        public
+    {
+        _l2BlockNumber = bound(_l2BlockNumber, 1, type(uint256).max);
+
+        (Types.OutputRootProof memory outputRootProof, bytes32 outputRoot, bytes memory headerRLP) =
+            _generateOutputRootProof(_storageRoot, _withdrawalRoot, abi.encodePacked(_l2BlockNumber));
+
+        // Create the dispute game with the output root at the wrong L2 block number.
+        IDisputeGame game = disputeGameFactory.create(GAME_TYPE, Claim.wrap(outputRoot), abi.encode(_l2BlockNumber));
+
+        // Challenge the L2 block number.
+        FaultDisputeGame fdg = FaultDisputeGame(address(game));
+        vm.expectRevert(BlockNumberMatches.selector);
+        fdg.challengeRootL2Block(outputRootProof, headerRLP);
+
+        // Warp past the clocks, resolve the game.
+        vm.warp(block.timestamp + 3 days + 12 hours + 1);
+        fdg.resolveClaim(0, 0);
+        fdg.resolve();
+
+        // Ensure the challenge was successful.
+        assertEq(uint8(fdg.status()), uint8(GameStatus.DEFENDER_WINS));
+    }
+
+    /// @dev Tests that challenging the root claim's L2 block number with a bad output root proof reverts.
+    function test_challengeRootL2Block_badProof_reverts() public {
+        Types.OutputRootProof memory outputRootProof =
+            Types.OutputRootProof({ version: 0, stateRoot: 0, messagePasserStorageRoot: 0, latestBlockhash: 0 });
+
+        vm.expectRevert(InvalidOutputRootProof.selector);
+        gameProxy.challengeRootL2Block(outputRootProof, hex"");
+    }
+
+    /// @dev Tests that challenging the root claim's L2 block number with a bad output root proof reverts.
+    function test_challengeRootL2Block_badHeaderRLP_reverts() public {
+        Types.OutputRootProof memory outputRootProof =
+            Types.OutputRootProof({ version: 0, stateRoot: 0, messagePasserStorageRoot: 0, latestBlockhash: 0 });
+        bytes32 outputRoot = Hashing.hashOutputRootProof(outputRootProof);
+
+        // Create the dispute game with the output root at the wrong L2 block number.
+        IDisputeGame game = disputeGameFactory.create(GAME_TYPE, Claim.wrap(outputRoot), abi.encode(1));
+        FaultDisputeGame fdg = FaultDisputeGame(address(game));
+
+        vm.expectRevert(InvalidHeaderRLP.selector);
+        fdg.challengeRootL2Block(outputRootProof, hex"");
+    }
+
+    /// @dev Tests that challenging the root claim's L2 block number with a bad output root proof reverts.
+    function test_challengeRootL2Block_badHeaderRLPBlockNumberLength_reverts() public {
+        (Types.OutputRootProof memory outputRootProof, bytes32 outputRoot,) =
+            _generateOutputRootProof(0, 0, new bytes(64));
+
+        // Create the dispute game with the output root at the wrong L2 block number.
+        IDisputeGame game = disputeGameFactory.create(GAME_TYPE, Claim.wrap(outputRoot), abi.encode(1));
+        FaultDisputeGame fdg = FaultDisputeGame(address(game));
+
+        vm.expectRevert(InvalidHeaderRLP.selector);
+        fdg.challengeRootL2Block(outputRootProof, hex"");
     }
 
     /// @dev Tests that a claim cannot be stepped against twice.
@@ -480,14 +794,22 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         vm.deal(address(this), 1000 ether);
 
         // Make claims all the way down the tree.
-        gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(1, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(2, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(3, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
-        gameProxy.attack{ value: MIN_BOND }(5, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(6, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(7, _dummyClaim());
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: _getRequiredBond(1) }(disputed, 1, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        gameProxy.attack{ value: _getRequiredBond(2) }(disputed, 2, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(3);
+        gameProxy.attack{ value: _getRequiredBond(3) }(disputed, 3, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(4);
+        gameProxy.attack{ value: _getRequiredBond(4) }(disputed, 4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        (,,,, disputed,,) = gameProxy.claimData(5);
+        gameProxy.attack{ value: _getRequiredBond(5) }(disputed, 5, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(6);
+        gameProxy.attack{ value: _getRequiredBond(6) }(disputed, 6, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(7);
+        gameProxy.attack{ value: _getRequiredBond(7) }(disputed, 7, _dummyClaim());
         gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
         gameProxy.step(8, true, absolutePrestateData, hex"");
 
@@ -495,24 +817,205 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         gameProxy.step(8, true, absolutePrestateData, hex"");
     }
 
+    /// @dev Tests that successfully step with true attacking claim when there is a true defend claim(claim5) in the
+    /// middle of the dispute game.
+    function test_stepAttackDummyClaim_defendTrueClaimInTheMiddle_succeeds() public {
+        // Give the test contract some ether
+        vm.deal(address(this), 1000 ether);
+
+        // Make claims all the way down the tree.
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: _getRequiredBond(1) }(disputed, 1, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        gameProxy.attack{ value: _getRequiredBond(2) }(disputed, 2, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(3);
+        gameProxy.attack{ value: _getRequiredBond(3) }(disputed, 3, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(4);
+        gameProxy.attack{ value: _getRequiredBond(4) }(disputed, 4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        bytes memory claimData5 = abi.encode(5, 5);
+        Claim claim5 = Claim.wrap(keccak256(claimData5));
+        (,,,, disputed,,) = gameProxy.claimData(5);
+        gameProxy.attack{ value: _getRequiredBond(5) }(disputed, 5, claim5);
+        (,,,, disputed,,) = gameProxy.claimData(6);
+        gameProxy.defend{ value: _getRequiredBond(6) }(disputed, 6, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(7);
+        gameProxy.attack{ value: _getRequiredBond(7) }(disputed, 7, _dummyClaim());
+        gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
+        gameProxy.step(8, true, claimData5, hex"");
+    }
+
+    /// @dev Tests that step reverts with false attacking claim when there is a true defend claim(claim5) in the middle
+    /// of the dispute game.
+    function test_stepAttackTrueClaim_defendTrueClaimInTheMiddle_reverts() public {
+        // Give the test contract some ether
+        vm.deal(address(this), 1000 ether);
+
+        // Make claims all the way down the tree.
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: _getRequiredBond(1) }(disputed, 1, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        gameProxy.attack{ value: _getRequiredBond(2) }(disputed, 2, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(3);
+        gameProxy.attack{ value: _getRequiredBond(3) }(disputed, 3, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(4);
+        gameProxy.attack{ value: _getRequiredBond(4) }(disputed, 4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        bytes memory claimData5 = abi.encode(5, 5);
+        Claim claim5 = Claim.wrap(keccak256(claimData5));
+        (,,,, disputed,,) = gameProxy.claimData(5);
+        gameProxy.attack{ value: _getRequiredBond(5) }(disputed, 5, claim5);
+        (,,,, disputed,,) = gameProxy.claimData(6);
+        gameProxy.defend{ value: _getRequiredBond(6) }(disputed, 6, _dummyClaim());
+        Claim postState_ = Claim.wrap(gameImpl.vm().step(claimData5, hex"", bytes32(0)));
+        (,,,, disputed,,) = gameProxy.claimData(7);
+        gameProxy.attack{ value: _getRequiredBond(7) }(disputed, 7, postState_);
+        gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
+
+        vm.expectRevert(ValidStep.selector);
+        gameProxy.step(8, true, claimData5, hex"");
+    }
+
+    /// @dev Tests that step reverts with false defending claim when there is a true defend claim(postState_) in the
+    /// middle of the dispute game.
+    function test_stepDefendDummyClaim_defendTrueClaimInTheMiddle_reverts() public {
+        // Give the test contract some ether
+        vm.deal(address(this), 1000 ether);
+
+        // Make claims all the way down the tree.
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: _getRequiredBond(1) }(disputed, 1, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        gameProxy.attack{ value: _getRequiredBond(2) }(disputed, 2, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(3);
+        gameProxy.attack{ value: _getRequiredBond(3) }(disputed, 3, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(4);
+        gameProxy.attack{ value: _getRequiredBond(4) }(disputed, 4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+
+        bytes memory claimData7 = abi.encode(5, 5);
+        Claim postState_ = Claim.wrap(gameImpl.vm().step(claimData7, hex"", bytes32(0)));
+
+        (,,,, disputed,,) = gameProxy.claimData(5);
+        gameProxy.attack{ value: _getRequiredBond(5) }(disputed, 5, postState_);
+        (,,,, disputed,,) = gameProxy.claimData(6);
+        gameProxy.defend{ value: _getRequiredBond(6) }(disputed, 6, _dummyClaim());
+
+        bytes memory _dummyClaimData = abi.encode(gasleft(), gasleft());
+        Claim dummyClaim7 = Claim.wrap(keccak256(_dummyClaimData));
+        (,,,, disputed,,) = gameProxy.claimData(7);
+        gameProxy.attack{ value: _getRequiredBond(7) }(disputed, 7, dummyClaim7);
+        gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
+        vm.expectRevert(ValidStep.selector);
+        gameProxy.step(8, false, _dummyClaimData, hex"");
+    }
+
+    /// @dev Tests that step reverts with true defending claim when there is a true defend claim(postState_) in the
+    /// middle of the dispute game.
+    function test_stepDefendTrueClaim_defendTrueClaimInTheMiddle_reverts() public {
+        // Give the test contract some ether
+        vm.deal(address(this), 1000 ether);
+
+        // Make claims all the way down the tree.
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: _getRequiredBond(1) }(disputed, 1, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        gameProxy.attack{ value: _getRequiredBond(2) }(disputed, 2, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(3);
+        gameProxy.attack{ value: _getRequiredBond(3) }(disputed, 3, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(4);
+        gameProxy.attack{ value: _getRequiredBond(4) }(disputed, 4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+
+        bytes memory claimData7 = abi.encode(5, 5);
+        Claim claim7 = Claim.wrap(keccak256(claimData7));
+        Claim postState_ = Claim.wrap(gameImpl.vm().step(claimData7, hex"", bytes32(0)));
+
+        (,,,, disputed,,) = gameProxy.claimData(5);
+        gameProxy.attack{ value: _getRequiredBond(5) }(disputed, 5, postState_);
+        (,,,, disputed,,) = gameProxy.claimData(6);
+        gameProxy.defend{ value: _getRequiredBond(6) }(disputed, 6, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(7);
+        gameProxy.attack{ value: _getRequiredBond(7) }(disputed, 7, claim7);
+        gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
+
+        vm.expectRevert(ValidStep.selector);
+        gameProxy.step(8, false, claimData7, hex"");
+    }
+
     /// @dev Static unit test for the correctness an uncontested root resolution.
     function test_resolve_rootUncontested_succeeds() public {
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
-        gameProxy.resolveClaim(0);
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        gameProxy.resolveClaim(0, 0);
         assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
     }
 
     /// @dev Static unit test for the correctness an uncontested root resolution.
     function test_resolve_rootUncontestedClockNotExpired_succeeds() public {
-        vm.warp(block.timestamp + 3 days + 12 hours);
+        vm.warp(block.timestamp + 3 days + 12 hours - 1 seconds);
         vm.expectRevert(ClockNotExpired.selector);
-        gameProxy.resolveClaim(0);
+        gameProxy.resolveClaim(0, 0);
+    }
+
+    /// @dev Static unit test for the correctness of a multi-part resolution of a single claim.
+    function test_resolve_multiPart_succeeds() public {
+        vm.deal(address(this), 10_000 ether);
+
+        uint256 bond = _getRequiredBond(0);
+        for (uint256 i = 0; i < 2048; i++) {
+            (,,,, Claim disputed,,) = gameProxy.claimData(0);
+            gameProxy.attack{ value: bond }(disputed, 0, Claim.wrap(bytes32(i)));
+        }
+
+        // Warp past the clock period.
+        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+
+        // Resolve all children of the root subgame. Every single one of these will be uncontested.
+        for (uint256 i = 1; i <= 2048; i++) {
+            gameProxy.resolveClaim(i, 0);
+        }
+
+        // Resolve the first half of the root claim subgame.
+        gameProxy.resolveClaim(0, 1024);
+
+        // Fetch the resolution checkpoint for the root subgame and assert correctness.
+        (bool initCheckpoint, uint32 subgameIndex, Position leftmostPosition, address counteredBy) =
+            gameProxy.resolutionCheckpoints(0);
+        assertTrue(initCheckpoint);
+        assertEq(subgameIndex, 1024);
+        assertEq(leftmostPosition.raw(), Position.wrap(1).move(true).raw());
+        assertEq(counteredBy, address(this));
+
+        // The root subgame should not be resolved.
+        assertFalse(gameProxy.resolvedSubgames(0));
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolve();
+
+        // Resolve the second half of the root claim subgame.
+        uint256 numToResolve = gameProxy.getNumToResolve(0);
+        assertEq(numToResolve, 1024);
+        gameProxy.resolveClaim(0, numToResolve);
+
+        // Fetch the resolution checkpoint for the root subgame and assert correctness.
+        (initCheckpoint, subgameIndex, leftmostPosition, counteredBy) = gameProxy.resolutionCheckpoints(0);
+        assertTrue(initCheckpoint);
+        assertEq(subgameIndex, 2048);
+        assertEq(leftmostPosition.raw(), Position.wrap(1).move(true).raw());
+        assertEq(counteredBy, address(this));
+
+        // The root subgame should now be resolved
+        assertTrue(gameProxy.resolvedSubgames(0));
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS));
     }
 
     /// @dev Static unit test asserting that resolve reverts when the absolute root
     ///      subgame has not been resolved.
     function test_resolve_rootUncontestedButUnresolved_reverts() public {
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
         vm.expectRevert(OutOfOrderResolution.selector);
         gameProxy.resolve();
     }
@@ -531,42 +1034,52 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
 
         vm.store(address(gameProxy), bytes32(uint256(0)), bytes32(slot));
         vm.expectRevert(GameNotInProgress.selector);
-        gameProxy.resolveClaim(0);
+        gameProxy.resolveClaim(0, 0);
     }
 
     /// @dev Static unit test for the correctness of resolving a single attack game state.
     function test_resolve_rootContested_succeeds() public {
-        gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim());
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
 
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
 
-        gameProxy.resolveClaim(0);
+        gameProxy.resolveClaim(1, 0);
+        gameProxy.resolveClaim(0, 0);
         assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS));
     }
 
     /// @dev Static unit test for the correctness of resolving a game with a contested challenge claim.
     function test_resolve_challengeContested_succeeds() public {
-        gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim());
-        gameProxy.defend{ value: MIN_BOND }(1, _dummyClaim());
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.defend{ value: _getRequiredBond(1) }(disputed, 1, _dummyClaim());
 
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
 
-        gameProxy.resolveClaim(1);
-        gameProxy.resolveClaim(0);
+        gameProxy.resolveClaim(2, 0);
+        gameProxy.resolveClaim(1, 0);
+        gameProxy.resolveClaim(0, 0);
         assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
     }
 
     /// @dev Static unit test for the correctness of resolving a game with multiplayer moves.
     function test_resolve_teamDeathmatch_succeeds() public {
-        gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim());
-        gameProxy.defend{ value: MIN_BOND }(1, _dummyClaim());
-        gameProxy.defend{ value: MIN_BOND }(1, _dummyClaim());
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.defend{ value: _getRequiredBond(1) }(disputed, 1, _dummyClaim());
+        gameProxy.defend{ value: _getRequiredBond(1) }(disputed, 1, _dummyClaim());
 
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
 
-        gameProxy.resolveClaim(1);
-        gameProxy.resolveClaim(0);
+        gameProxy.resolveClaim(4, 0);
+        gameProxy.resolveClaim(3, 0);
+        gameProxy.resolveClaim(2, 0);
+        gameProxy.resolveClaim(1, 0);
+        gameProxy.resolveClaim(0, 0);
         assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS));
     }
 
@@ -574,85 +1087,95 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
     function test_resolve_stepReached_succeeds() public {
         Claim claim = _dummyClaim();
         for (uint256 i; i < gameProxy.splitDepth(); i++) {
-            gameProxy.attack{ value: MIN_BOND }(i, claim);
+            (,,,, Claim disputed,,) = gameProxy.claimData(i);
+            gameProxy.attack{ value: _getRequiredBond(i) }(disputed, i, claim);
         }
 
         claim = _changeClaimStatus(claim, VMStatuses.PANIC);
         for (uint256 i = gameProxy.claimDataLen() - 1; i < gameProxy.maxGameDepth(); i++) {
-            gameProxy.attack{ value: MIN_BOND }(i, claim);
+            (,,,, Claim disputed,,) = gameProxy.claimData(i);
+            gameProxy.attack{ value: _getRequiredBond(i) }(disputed, i, claim);
         }
 
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
 
-        // resolving claim at 8 isn't necessary
-        for (uint256 i = 8; i > 0; i--) {
-            gameProxy.resolveClaim(i - 1);
+        for (uint256 i = 9; i > 0; i--) {
+            gameProxy.resolveClaim(i - 1, 0);
         }
         assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
     }
 
     /// @dev Static unit test asserting that resolve reverts when attempting to resolve a subgame multiple times
     function test_resolve_claimAlreadyResolved_reverts() public {
-        vm.deal(address(this), 2 * MIN_BOND);
-
         Claim claim = _dummyClaim();
-        gameProxy.attack{ value: MIN_BOND }(0, claim);
-        gameProxy.attack{ value: MIN_BOND }(1, claim);
+        uint256 firstBond = _getRequiredBond(0);
+        vm.deal(address(this), firstBond);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: firstBond }(disputed, 0, claim);
+        uint256 secondBond = _getRequiredBond(1);
+        vm.deal(address(this), secondBond);
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: secondBond }(disputed, 1, claim);
 
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
 
         assertEq(address(this).balance, 0);
-        gameProxy.resolveClaim(1);
+        gameProxy.resolveClaim(2, 0);
+        gameProxy.resolveClaim(1, 0);
 
         // Wait for the withdrawal delay.
         vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
 
         gameProxy.claimCredit(address(this));
-        assertEq(address(this).balance, MIN_BOND);
+        assertEq(address(this).balance, firstBond + secondBond);
 
         vm.expectRevert(ClaimAlreadyResolved.selector);
-        gameProxy.resolveClaim(1);
-        assertEq(address(this).balance, MIN_BOND);
+        gameProxy.resolveClaim(1, 0);
+        assertEq(address(this).balance, firstBond + secondBond);
     }
 
     /// @dev Static unit test asserting that resolve reverts when attempting to resolve a subgame at max depth
     function test_resolve_claimAtMaxDepthAlreadyResolved_reverts() public {
         Claim claim = _dummyClaim();
         for (uint256 i; i < gameProxy.splitDepth(); i++) {
-            gameProxy.attack{ value: MIN_BOND }(i, claim);
+            (,,,, Claim disputed,,) = gameProxy.claimData(i);
+            gameProxy.attack{ value: _getRequiredBond(i) }(disputed, i, claim);
         }
 
         vm.deal(address(this), 10000 ether);
         claim = _changeClaimStatus(claim, VMStatuses.PANIC);
         for (uint256 i = gameProxy.claimDataLen() - 1; i < gameProxy.maxGameDepth(); i++) {
-            gameProxy.attack{ value: MIN_BOND }(i, claim);
+            (,,,, Claim disputed,,) = gameProxy.claimData(i);
+            gameProxy.attack{ value: _getRequiredBond(i) }(disputed, i, claim);
         }
 
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
 
         // Resolve to claim bond
         uint256 balanceBefore = address(this).balance;
-        gameProxy.resolveClaim(8);
+        gameProxy.resolveClaim(8, 0);
 
         // Wait for the withdrawal delay.
         vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
 
         gameProxy.claimCredit(address(this));
-        assertEq(address(this).balance, balanceBefore + MIN_BOND);
+        assertEq(address(this).balance, balanceBefore + _getRequiredBond(7));
 
         vm.expectRevert(ClaimAlreadyResolved.selector);
-        gameProxy.resolveClaim(8);
+        gameProxy.resolveClaim(8, 0);
     }
 
     /// @dev Static unit test asserting that resolve reverts when attempting to resolve subgames out of order
     function test_resolve_outOfOrderResolution_reverts() public {
-        gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(1, _dummyClaim());
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: _getRequiredBond(1) }(disputed, 1, _dummyClaim());
 
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
 
         vm.expectRevert(OutOfOrderResolution.selector);
-        gameProxy.resolveClaim(0);
+        gameProxy.resolveClaim(0, 0);
     }
 
     /// @dev Static unit test asserting that resolve pays out bonds on step, output bisection, and execution trace
@@ -663,14 +1186,38 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         vm.deal(address(this), bal);
 
         // Make claims all the way down the tree.
-        gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(1, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(2, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(3, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
-        gameProxy.attack{ value: MIN_BOND }(5, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(6, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(7, _dummyClaim());
+        uint256 bond = _getRequiredBond(0);
+        uint256 totalBonded = bond;
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: bond }(disputed, 0, _dummyClaim());
+        bond = _getRequiredBond(1);
+        totalBonded += bond;
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: bond }(disputed, 1, _dummyClaim());
+        bond = _getRequiredBond(2);
+        totalBonded += bond;
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        gameProxy.attack{ value: bond }(disputed, 2, _dummyClaim());
+        bond = _getRequiredBond(3);
+        totalBonded += bond;
+        (,,,, disputed,,) = gameProxy.claimData(3);
+        gameProxy.attack{ value: bond }(disputed, 3, _dummyClaim());
+        bond = _getRequiredBond(4);
+        totalBonded += bond;
+        (,,,, disputed,,) = gameProxy.claimData(4);
+        gameProxy.attack{ value: bond }(disputed, 4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        bond = _getRequiredBond(5);
+        totalBonded += bond;
+        (,,,, disputed,,) = gameProxy.claimData(5);
+        gameProxy.attack{ value: bond }(disputed, 5, _dummyClaim());
+        bond = _getRequiredBond(6);
+        totalBonded += bond;
+        (,,,, disputed,,) = gameProxy.claimData(6);
+        gameProxy.attack{ value: bond }(disputed, 6, _dummyClaim());
+        bond = _getRequiredBond(7);
+        totalBonded += bond;
+        (,,,, disputed,,) = gameProxy.claimData(7);
+        gameProxy.attack{ value: bond }(disputed, 7, _dummyClaim());
         gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
         gameProxy.step(8, true, absolutePrestateData, hex"");
 
@@ -679,15 +1226,14 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         assertEq(counteredBy, address(this));
 
         // Ensure we bonded the correct amounts
-        uint256 bonded = (gameProxy.claimDataLen() - 1) * MIN_BOND;
-        assertEq(address(this).balance, bal - bonded);
+        assertEq(address(this).balance, bal - totalBonded);
         assertEq(address(gameProxy).balance, 0);
-        assertEq(delayedWeth.balanceOf(address(gameProxy)), bonded);
+        assertEq(delayedWeth.balanceOf(address(gameProxy)), totalBonded);
 
         // Resolve all claims
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
         for (uint256 i = gameProxy.claimDataLen(); i > 0; i--) {
-            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1)));
+            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1, 0)));
             assertTrue(success);
         }
         gameProxy.resolve();
@@ -710,31 +1256,56 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
     /// moves with 2 actors and a dishonest root claim.
     function test_resolve_bondPayoutsSeveralActors_succeeds() public {
         // Give the test contract and bob some ether
-        uint256 bal = 1000 ether;
+        // We use the "1000 ether" literal for `bal`, the initial balance, to avoid stack too deep
+        //uint256 bal = 1000 ether;
         address bob = address(0xb0b);
-        vm.deal(address(this), bal);
-        vm.deal(bob, bal);
+        vm.deal(address(this), 1000 ether);
+        vm.deal(bob, 1000 ether);
 
         // Make claims all the way down the tree, trading off between bob and the test contract.
-        gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim());
-
+        uint256 firstBond = _getRequiredBond(0);
+        uint256 thisBonded = firstBond;
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: firstBond }(disputed, 0, _dummyClaim());
+
+        uint256 secondBond = _getRequiredBond(1);
+        uint256 bobBonded = secondBond;
+        (,,,, disputed,,) = gameProxy.claimData(1);
         vm.prank(bob);
-        gameProxy.attack{ value: MIN_BOND }(1, _dummyClaim());
+        gameProxy.attack{ value: secondBond }(disputed, 1, _dummyClaim());
 
-        gameProxy.attack{ value: MIN_BOND }(2, _dummyClaim());
+        uint256 thirdBond = _getRequiredBond(2);
+        thisBonded += thirdBond;
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        gameProxy.attack{ value: thirdBond }(disputed, 2, _dummyClaim());
 
+        uint256 fourthBond = _getRequiredBond(3);
+        bobBonded += fourthBond;
+        (,,,, disputed,,) = gameProxy.claimData(3);
         vm.prank(bob);
-        gameProxy.attack{ value: MIN_BOND }(3, _dummyClaim());
+        gameProxy.attack{ value: fourthBond }(disputed, 3, _dummyClaim());
 
-        gameProxy.attack{ value: MIN_BOND }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        uint256 fifthBond = _getRequiredBond(4);
+        thisBonded += fifthBond;
+        (,,,, disputed,,) = gameProxy.claimData(4);
+        gameProxy.attack{ value: fifthBond }(disputed, 4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
 
+        uint256 sixthBond = _getRequiredBond(5);
+        bobBonded += sixthBond;
+        (,,,, disputed,,) = gameProxy.claimData(5);
         vm.prank(bob);
-        gameProxy.attack{ value: MIN_BOND }(5, _dummyClaim());
+        gameProxy.attack{ value: sixthBond }(disputed, 5, _dummyClaim());
 
-        gameProxy.attack{ value: MIN_BOND }(6, _dummyClaim());
+        uint256 seventhBond = _getRequiredBond(6);
+        thisBonded += seventhBond;
+        (,,,, disputed,,) = gameProxy.claimData(6);
+        gameProxy.attack{ value: seventhBond }(disputed, 6, _dummyClaim());
 
+        uint256 eighthBond = _getRequiredBond(7);
+        bobBonded += eighthBond;
+        (,,,, disputed,,) = gameProxy.claimData(7);
         vm.prank(bob);
-        gameProxy.attack{ value: MIN_BOND }(7, _dummyClaim());
+        gameProxy.attack{ value: eighthBond }(disputed, 7, _dummyClaim());
 
         gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
         gameProxy.step(8, true, absolutePrestateData, hex"");
@@ -744,16 +1315,15 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         assertEq(counteredBy, address(this));
 
         // Ensure we bonded the correct amounts
-        uint256 bonded = ((gameProxy.claimDataLen() - 1) / 2) * MIN_BOND;
-        assertEq(address(this).balance, bal - bonded);
-        assertEq(bob.balance, bal - bonded);
+        assertEq(address(this).balance, 1000 ether - thisBonded);
+        assertEq(bob.balance, 1000 ether - bobBonded);
         assertEq(address(gameProxy).balance, 0);
-        assertEq(delayedWeth.balanceOf(address(gameProxy)), bonded * 2);
+        assertEq(delayedWeth.balanceOf(address(gameProxy)), thisBonded + bobBonded);
 
         // Resolve all claims
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
         for (uint256 i = gameProxy.claimDataLen(); i > 0; i--) {
-            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1)));
+            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1, 0)));
             assertTrue(success);
         }
         gameProxy.resolve();
@@ -768,8 +1338,8 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         gameProxy.claimCredit(bob);
 
         // Ensure that bonds were paid out correctly.
-        assertEq(address(this).balance, bal + bonded);
-        assertEq(bob.balance, bal - bonded);
+        assertEq(address(this).balance, 1000 ether + bobBonded);
+        assertEq(bob.balance, 1000 ether - bobBonded);
         assertEq(address(gameProxy).balance, 0);
         assertEq(delayedWeth.balanceOf(address(gameProxy)), 0);
 
@@ -792,22 +1362,28 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         // Make claims with bob, charlie and the test contract on defense, and alice as the challenger
         // charlie is successfully countered by alice
         // alice is successfully countered by both bob and the test contract
+        uint256 firstBond = _getRequiredBond(0);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
         vm.prank(alice);
-        gameProxy.attack{ value: MIN_BOND }(0, _dummyClaim());
+        gameProxy.attack{ value: firstBond }(disputed, 0, _dummyClaim());
 
+        uint256 secondBond = _getRequiredBond(1);
+        (,,,, disputed,,) = gameProxy.claimData(1);
         vm.prank(bob);
-        gameProxy.defend{ value: MIN_BOND }(1, _dummyClaim());
+        gameProxy.defend{ value: secondBond }(disputed, 1, _dummyClaim());
         vm.prank(charlie);
-        gameProxy.attack{ value: MIN_BOND }(1, _dummyClaim());
-        gameProxy.attack{ value: MIN_BOND }(1, _dummyClaim());
+        gameProxy.attack{ value: secondBond }(disputed, 1, _dummyClaim());
+        gameProxy.attack{ value: secondBond }(disputed, 1, _dummyClaim());
 
+        uint256 thirdBond = _getRequiredBond(3);
+        (,,,, disputed,,) = gameProxy.claimData(3);
         vm.prank(alice);
-        gameProxy.attack{ value: MIN_BOND }(3, _dummyClaim());
+        gameProxy.attack{ value: thirdBond }(disputed, 3, _dummyClaim());
 
         // Resolve all claims
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
         for (uint256 i = gameProxy.claimDataLen(); i > 0; i--) {
-            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1)));
+            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1, 0)));
             assertTrue(success);
         }
         gameProxy.resolve();
@@ -824,8 +1400,8 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         gameProxy.claimCredit(charlie);
 
         // Ensure that bonds were paid out correctly.
-        uint256 aliceLosses = MIN_BOND;
-        uint256 charlieLosses = MIN_BOND;
+        uint256 aliceLosses = firstBond;
+        uint256 charlieLosses = secondBond;
         assertEq(address(this).balance, bal + aliceLosses, "incorrect this balance");
         assertEq(alice.balance, bal - aliceLosses + charlieLosses, "incorrect alice balance");
         assertEq(bob.balance, bal, "incorrect bob balance");
@@ -836,36 +1412,105 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         assertEq(disputeGameFactory.initBonds(GAME_TYPE), 0);
     }
 
+    /// @dev Static unit test asserting that the anchor state updates when the game resolves in
+    /// favor of the defender and the anchor state is older than the game state.
+    function test_resolve_validNewerStateUpdatesAnchor_succeeds() public {
+        // Confirm that the anchor state is older than the game state.
+        (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assert(l2BlockNumber < gameProxy.l2BlockNumber());
+
+        // Resolve the game.
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        gameProxy.resolveClaim(0, 0);
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
+
+        // Confirm that the anchor state is now the same as the game state.
+        (root, l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assertEq(l2BlockNumber, gameProxy.l2BlockNumber());
+        assertEq(root.raw(), gameProxy.rootClaim().raw());
+    }
+
+    /// @dev Static unit test asserting that the anchor state does not change when the game
+    /// resolves in favor of the defender but the game state is not newer than the anchor state.
+    function test_resolve_validOlderStateSameAnchor_succeeds() public {
+        // Mock the game block to be older than the game state.
+        vm.mockCall(address(gameProxy), abi.encodeWithSelector(gameProxy.l2BlockNumber.selector), abi.encode(0));
+
+        // Confirm that the anchor state is newer than the game state.
+        (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assert(l2BlockNumber >= gameProxy.l2BlockNumber());
+
+        // Resolve the game.
+        vm.mockCall(address(gameProxy), abi.encodeWithSelector(gameProxy.l2BlockNumber.selector), abi.encode(0));
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        gameProxy.resolveClaim(0, 0);
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
+
+        // Confirm that the anchor state is the same as the initial anchor state.
+        (Hash updatedRoot, uint256 updatedL2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assertEq(updatedL2BlockNumber, l2BlockNumber);
+        assertEq(updatedRoot.raw(), root.raw());
+    }
+
+    /// @dev Static unit test asserting that the anchor state does not change when the game
+    /// resolves in favor of the challenger, even if the game state is newer than the anchor.
+    function test_resolve_invalidStateSameAnchor_succeeds() public {
+        // Confirm that the anchor state is older than the game state.
+        (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assert(l2BlockNumber < gameProxy.l2BlockNumber());
+
+        // Challenge the claim and resolve it.
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        gameProxy.resolveClaim(1, 0);
+        gameProxy.resolveClaim(0, 0);
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS));
+
+        // Confirm that the anchor state is the same as the initial anchor state.
+        (Hash updatedRoot, uint256 updatedL2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assertEq(updatedL2BlockNumber, l2BlockNumber);
+        assertEq(updatedRoot.raw(), root.raw());
+    }
+
     /// @dev Static unit test asserting that credit may not be drained past allowance through reentrancy.
     function test_claimCredit_claimAlreadyResolved_reverts() public {
         ClaimCreditReenter reenter = new ClaimCreditReenter(gameProxy, vm);
         vm.startPrank(address(reenter));
 
-        // Give the test contract some ether to bond.
-        vm.deal(address(reenter), MIN_BOND * 2);
         // Give the game proxy 1 extra ether, unregistered.
         vm.deal(address(gameProxy), 1 ether);
 
         // Perform a bonded move.
         Claim claim = _dummyClaim();
-        gameProxy.attack{ value: MIN_BOND }(0, claim);
-        gameProxy.attack{ value: MIN_BOND }(1, claim);
+        uint256 firstBond = _getRequiredBond(0);
+        vm.deal(address(reenter), firstBond);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: firstBond }(disputed, 0, claim);
+        uint256 secondBond = _getRequiredBond(1);
+        vm.deal(address(reenter), secondBond);
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: secondBond }(disputed, 1, claim);
+        uint256 reenterBond = firstBond + secondBond;
 
         // Warp past the finalization period
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
 
         // Ensure that we bonded all the test contract's ETH
         assertEq(address(reenter).balance, 0);
         // Ensure the game proxy has 1 ether in it.
         assertEq(address(gameProxy).balance, 1 ether);
-        // Ensure the game has a balance of 2 * MIN_BOND in the delayedWeth contract.
-        assertEq(delayedWeth.balanceOf(address(gameProxy)), MIN_BOND * 2);
+        // Ensure the game has a balance of reenterBond in the delayedWeth contract.
+        assertEq(delayedWeth.balanceOf(address(gameProxy)), reenterBond);
+
+        // Resolve the claim at index 2 first so that index 1 can be resolved.
+        gameProxy.resolveClaim(2, 0);
 
-        // Resolve the claim at gindex 1 and claim the reenter contract's credit.
-        gameProxy.resolveClaim(1);
+        // Resolve the claim at index 1 and claim the reenter contract's credit.
+        gameProxy.resolveClaim(1, 0);
 
         // Ensure that the game registered the `reenter` contract's credit.
-        assertEq(gameProxy.credit(address(reenter)), MIN_BOND);
+        assertEq(gameProxy.credit(address(reenter)), reenterBond);
 
         // Wait for the withdrawal delay.
         vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
@@ -878,20 +1523,25 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         // The claimant must only have received the amount bonded for the gindex 1 subgame.
         // The root claim bond and the unregistered ETH should still exist in the game proxy.
         assertEq(reenter.numCalls(), 2);
-        assertEq(address(reenter).balance, MIN_BOND);
+        assertEq(address(reenter).balance, reenterBond);
         assertEq(address(gameProxy).balance, 1 ether);
-        assertEq(delayedWeth.balanceOf(address(gameProxy)), MIN_BOND);
+        assertEq(delayedWeth.balanceOf(address(gameProxy)), 0);
 
         vm.stopPrank();
     }
 
     /// @dev Tests that adding local data with an out of bounds identifier reverts.
     function testFuzz_addLocalData_oob_reverts(uint256 _ident) public {
+        Claim disputed;
         // Get a claim below the split depth so that we can add local data for an execution trace subgame.
         for (uint256 i; i < 4; i++) {
-            gameProxy.attack{ value: MIN_BOND }(i, _dummyClaim());
+            uint256 bond = _getRequiredBond(i);
+            (,,,, disputed,,) = gameProxy.claimData(i);
+            gameProxy.attack{ value: bond }(disputed, i, _dummyClaim());
         }
-        gameProxy.attack{ value: MIN_BOND }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        uint256 lastBond = _getRequiredBond(4);
+        (,,,, disputed,,) = gameProxy.claimData(4);
+        gameProxy.attack{ value: lastBond }(disputed, 4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
 
         // [1, 5] are valid local data identifiers.
         if (_ident <= 5) _ident = 0;
@@ -904,15 +1554,21 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
     ///      that is disputing the transition from `GENESIS -> GENESIS + 1`
     function test_addLocalDataGenesisTransition_static_succeeds() public {
         IPreimageOracle oracle = IPreimageOracle(address(gameProxy.vm().oracle()));
+        Claim disputed;
 
         // Get a claim below the split depth so that we can add local data for an execution trace subgame.
         for (uint256 i; i < 4; i++) {
-            gameProxy.attack{ value: MIN_BOND }(i, Claim.wrap(bytes32(i)));
+            uint256 bond = _getRequiredBond(i);
+            (,,,, disputed,,) = gameProxy.claimData(i);
+            gameProxy.attack{ value: bond }(disputed, i, Claim.wrap(bytes32(i)));
         }
-        gameProxy.attack{ value: MIN_BOND }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        uint256 lastBond = _getRequiredBond(4);
+        (,,,, disputed,,) = gameProxy.claimData(4);
+        gameProxy.attack{ value: lastBond }(disputed, 4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
 
         // Expected start/disputed claims
-        bytes32 startingClaim = gameProxy.genesisOutputRoot().raw();
+        (Hash root,) = gameProxy.startingOutputRoot();
+        bytes32 startingClaim = root.raw();
         bytes32 disputedClaim = bytes32(uint256(3));
         Position disputedPos = LibPosition.wrap(4, 0);
 
@@ -949,12 +1605,17 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
     /// @dev Tests that local data is loaded into the preimage oracle correctly.
     function test_addLocalDataMiddle_static_succeeds() public {
         IPreimageOracle oracle = IPreimageOracle(address(gameProxy.vm().oracle()));
+        Claim disputed;
 
         // Get a claim below the split depth so that we can add local data for an execution trace subgame.
         for (uint256 i; i < 4; i++) {
-            gameProxy.attack{ value: MIN_BOND }(i, Claim.wrap(bytes32(i)));
+            uint256 bond = _getRequiredBond(i);
+            (,,,, disputed,,) = gameProxy.claimData(i);
+            gameProxy.attack{ value: bond }(disputed, i, Claim.wrap(bytes32(i)));
         }
-        gameProxy.defend{ value: MIN_BOND }(4, _changeClaimStatus(ROOT_CLAIM, VMStatuses.VALID));
+        uint256 lastBond = _getRequiredBond(4);
+        (,,,, disputed,,) = gameProxy.claimData(4);
+        gameProxy.defend{ value: lastBond }(disputed, 4, _changeClaimStatus(ROOT_CLAIM, VMStatuses.VALID));
 
         // Expected start/disputed claims
         bytes32 startingClaim = bytes32(uint256(3));
@@ -992,6 +1653,136 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
         }
     }
 
+    /// @dev Static unit test asserting that resolveClaim isn't possible if there's time
+    ///      left for a counter.
+    function test_resolution_lastSecondDisputes_succeeds() public {
+        // The honest proposer created an honest root claim during setup - node 0
+
+        // Defender's turn
+        vm.warp(block.timestamp + 3.5 days - 1 seconds);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: _getRequiredBond(0) }(disputed, 0, _dummyClaim());
+        // Chess clock time accumulated:
+        assertEq(gameProxy.getChallengerDuration(0).raw(), 3.5 days - 1 seconds);
+        assertEq(gameProxy.getChallengerDuration(1).raw(), 0);
+
+        // Advance time by 1 second, so that the root claim challenger clock is expired.
+        vm.warp(block.timestamp + 1 seconds);
+        // Attempt a second attack against the root claim. This should revert since the challenger clock is expired.
+        uint256 expectedBond = _getRequiredBond(0);
+        vm.expectRevert(ClockTimeExceeded.selector);
+        gameProxy.attack{ value: expectedBond }(disputed, 0, _dummyClaim());
+        // Chess clock time accumulated:
+        assertEq(gameProxy.getChallengerDuration(0).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(1).raw(), 1 seconds);
+
+        // Should not be able to resolve the root claim or second counter yet.
+        vm.expectRevert(ClockNotExpired.selector);
+        gameProxy.resolveClaim(1, 0);
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(0, 0);
+
+        // Warp to the last second of the root claim defender clock.
+        vm.warp(block.timestamp + 3.5 days - 2 seconds);
+        // Attack the challenge to the root claim. This should succeed, since the defender clock is not expired.
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.attack{ value: _getRequiredBond(1) }(disputed, 1, _dummyClaim());
+        // Chess clock time accumulated:
+        assertEq(gameProxy.getChallengerDuration(0).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(1).raw(), 3.5 days - 1 seconds);
+        assertEq(gameProxy.getChallengerDuration(2).raw(), 3.5 days - gameProxy.clockExtension().raw());
+
+        // Should not be able to resolve any claims yet.
+        vm.expectRevert(ClockNotExpired.selector);
+        gameProxy.resolveClaim(2, 0);
+        vm.expectRevert(ClockNotExpired.selector);
+        gameProxy.resolveClaim(1, 0);
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(0, 0);
+
+        vm.warp(block.timestamp + gameProxy.clockExtension().raw() - 1 seconds);
+
+        // Should not be able to resolve any claims yet.
+        vm.expectRevert(ClockNotExpired.selector);
+        gameProxy.resolveClaim(2, 0);
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(1, 0);
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(0, 0);
+
+        // Chess clock time accumulated:
+        assertEq(gameProxy.getChallengerDuration(0).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(1).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(2).raw(), 3.5 days - 1 seconds);
+
+        // Warp past the challenge period for the root claim defender. Defending the root claim should now revert.
+        vm.warp(block.timestamp + 1 seconds);
+        expectedBond = _getRequiredBond(1);
+        vm.expectRevert(ClockTimeExceeded.selector); // no further move can be made
+        gameProxy.attack{ value: expectedBond }(disputed, 1, _dummyClaim());
+        expectedBond = _getRequiredBond(2);
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        vm.expectRevert(ClockTimeExceeded.selector); // no further move can be made
+        gameProxy.attack{ value: expectedBond }(disputed, 2, _dummyClaim());
+        // Chess clock time accumulated:
+        assertEq(gameProxy.getChallengerDuration(0).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(1).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(2).raw(), 3.5 days);
+
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(1, 0);
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(0, 0);
+
+        // All clocks are expired. Resolve the game.
+        gameProxy.resolveClaim(2, 0); // Node 2 is resolved as UNCOUNTERED by default since it has no children
+        gameProxy.resolveClaim(1, 0); // Node 1 is resolved as COUNTERED since it has an UNCOUNTERED child
+        gameProxy.resolveClaim(0, 0); // Node 0 is resolved as UNCOUNTERED since it has no UNCOUNTERED children
+
+        // Defender wins game since the root claim is uncountered
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
+    }
+
+    /// @dev Helper to generate a mock RLP encoded header (with only a real block number) & an output root proof.
+    function _generateOutputRootProof(
+        bytes32 _storageRoot,
+        bytes32 _withdrawalRoot,
+        bytes memory _l2BlockNumber
+    )
+        internal
+        pure
+        returns (Types.OutputRootProof memory proof_, bytes32 root_, bytes memory rlp_)
+    {
+        // L2 Block header
+        bytes[] memory rawHeaderRLP = new bytes[](9);
+        rawHeaderRLP[0] = hex"83FACADE";
+        rawHeaderRLP[1] = hex"83FACADE";
+        rawHeaderRLP[2] = hex"83FACADE";
+        rawHeaderRLP[3] = hex"83FACADE";
+        rawHeaderRLP[4] = hex"83FACADE";
+        rawHeaderRLP[5] = hex"83FACADE";
+        rawHeaderRLP[6] = hex"83FACADE";
+        rawHeaderRLP[7] = hex"83FACADE";
+        rawHeaderRLP[8] = RLPWriter.writeBytes(_l2BlockNumber);
+        rlp_ = RLPWriter.writeList(rawHeaderRLP);
+
+        // Output root
+        proof_ = Types.OutputRootProof({
+            version: 0,
+            stateRoot: _storageRoot,
+            messagePasserStorageRoot: _withdrawalRoot,
+            latestBlockhash: keccak256(rlp_)
+        });
+        root_ = Hashing.hashOutputRootProof(proof_);
+    }
+
+    /// @dev Helper to get the required bond for the given claim index.
+    function _getRequiredBond(uint256 _claimIndex) internal view returns (uint256 bond_) {
+        (,,,,, Position parent,) = gameProxy.claimData(_claimIndex);
+        Position pos = parent.move(true);
+        bond_ = gameProxy.getRequiredBond(pos);
+    }
+
     /// @dev Helper to return a pseudo-random claim
     function _dummyClaim() internal view returns (Claim) {
         return Claim.wrap(keccak256(abi.encode(gasleft())));
@@ -1476,13 +2267,7 @@ contract FaultDispute_1v1_Actors_Test is FaultDisputeGame_Init {
         Claim absolutePrestateExec =
             _changeClaimStatus(Claim.wrap(keccak256(absolutePrestateData_)), VMStatuses.UNFINISHED);
         Claim rootClaim = Claim.wrap(bytes32(uint256(_rootClaim)));
-        super.init({
-            rootClaim: rootClaim,
-            absolutePrestate: absolutePrestateExec,
-            l2BlockNumber: _rootClaim,
-            genesisBlockNumber: 0,
-            genesisOutputRoot: Hash.wrap(bytes32(0))
-        });
+        super.init({ rootClaim: rootClaim, absolutePrestate: absolutePrestateExec, l2BlockNumber: _rootClaim });
     }
 
     /// @dev Helper to create actors for the 1v1 dispute.
@@ -1532,14 +2317,14 @@ contract FaultDispute_1v1_Actors_Test is FaultDisputeGame_Init {
     /// @dev Helper to warp past the chess clock and resolve all claims within the dispute game.
     function _warpAndResolve() internal {
         // Warp past the chess clock
-        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+        vm.warp(block.timestamp + 3 days + 12 hours);
 
         // Resolve all claims in reverse order. We allow `resolveClaim` calls to fail due to
         // the check that prevents claims with no subgames attached from being passed to
         // `resolveClaim`. There's also a check in `resolve` to ensure all children have been
         // resolved before global resolution, which catches any unresolved subgames here.
         for (uint256 i = gameProxy.claimDataLen(); i > 0; i--) {
-            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1)));
+            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1, 0)));
             assertTrue(success);
         }
         gameProxy.resolve();
diff --git a/packages/contracts-bedrock/test/dispute/FaultDisputeGame2.t.sol b/packages/contracts-bedrock/test/dispute/FaultDisputeGame2.t.sol
new file mode 100644
index 000000000000..9a25b02b3940
--- /dev/null
+++ b/packages/contracts-bedrock/test/dispute/FaultDisputeGame2.t.sol
@@ -0,0 +1,2045 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.15;
+
+import { Test } from "forge-std/Test.sol";
+import { Vm } from "forge-std/Vm.sol";
+import { DisputeGameFactory_Init } from "test/dispute/DisputeGameFactory.t.sol";
+import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
+import { FaultDisputeGame } from "src/dispute/FaultDisputeGame2.sol";
+import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol";
+import { PreimageOracle } from "src/cannon/PreimageOracle.sol";
+
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
+import { LibClock } from "src/dispute/lib/LibUDT.sol";
+import { LibPosition } from "src/dispute/lib/LibPosition.sol";
+import { IPreimageOracle } from "src/dispute/interfaces/IBigStepper.sol";
+import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol";
+import { AlphabetVM } from "test/mocks/AlphabetVM.sol";
+
+import { DisputeActor, HonestDisputeActor } from "test/actors/FaultDisputeActors2.sol";
+
+contract FaultDisputeGame_Init is DisputeGameFactory_Init {
+    /// @dev The type of the game being tested.
+    GameType internal constant GAME_TYPE = GameType.wrap(0);
+
+    /// @dev The implementation of the game.
+    FaultDisputeGame internal gameImpl;
+    /// @dev The `Clone` proxy of the game.
+    FaultDisputeGame internal gameProxy;
+
+    /// @dev The extra data passed to the game for initialization.
+    bytes internal extraData;
+
+    event Move(uint256 indexed parentIndex, Claim indexed pivot, address indexed claimant);
+
+    event ReceiveETH(uint256 amount);
+
+    function init(Claim rootClaim, Claim absolutePrestate, uint256 l2BlockNumber) public {
+        // Set the time to a realistic date.
+        vm.warp(1690906994);
+
+        // Set the extra data for the game creation
+        extraData = abi.encode(l2BlockNumber);
+
+        AlphabetVM _vm = new AlphabetVM(absolutePrestate, new PreimageOracle(0, 0));
+
+        // Deploy an implementation of the fault game
+        gameImpl = new FaultDisputeGame({
+            _gameType: GAME_TYPE,
+            _absolutePrestate: absolutePrestate,
+            _maxGameDepth: 2 ** 3,
+            _splitDepth: 2 ** 2,
+            _clockExtension: Duration.wrap(3 hours),
+            _maxClockDuration: Duration.wrap(3.5 days),
+            _vm: _vm,
+            _weth: delayedWeth,
+            _anchorStateRegistry: anchorStateRegistry,
+            _l2ChainId: 10
+        });
+
+        // Register the game implementation with the factory.
+        disputeGameFactory.setImplementation(GAME_TYPE, gameImpl);
+        // Create a new game.
+        gameProxy = FaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, rootClaim, extraData))));
+
+        // Check immutables
+        assertEq(gameProxy.gameType().raw(), GAME_TYPE.raw());
+        assertEq(gameProxy.absolutePrestate().raw(), absolutePrestate.raw());
+        assertEq(gameProxy.maxGameDepth(), 2 ** 3);
+        assertEq(gameProxy.splitDepth(), 2 ** 2);
+        assertEq(gameProxy.clockExtension().raw(), 3 hours);
+        assertEq(gameProxy.maxClockDuration().raw(), 3.5 days);
+        assertEq(address(gameProxy.weth()), address(delayedWeth));
+        assertEq(address(gameProxy.anchorStateRegistry()), address(anchorStateRegistry));
+        assertEq(address(gameProxy.vm()), address(_vm));
+
+        // Label the proxy
+        vm.label(address(gameProxy), "FaultDisputeGame_Clone");
+    }
+
+    fallback() external payable { }
+
+    receive() external payable { }
+}
+
+contract FaultDisputeGame2_Test is FaultDisputeGame_Init {
+    /// @dev The root claim of the game.
+    Claim internal constant ROOT_CLAIM = Claim.wrap(bytes32((uint256(1) << 248) | uint256(10)));
+
+    /// @dev The preimage of the absolute prestate claim
+    bytes internal absolutePrestateData;
+    /// @dev The absolute prestate of the trace.
+    Claim internal absolutePrestate;
+
+    function setUp() public override {
+        absolutePrestateData = abi.encode(0);
+        absolutePrestate = _changeClaimStatus(Claim.wrap(keccak256(absolutePrestateData)), VMStatuses.UNFINISHED);
+
+        super.setUp();
+        super.init({ rootClaim: ROOT_CLAIM, absolutePrestate: absolutePrestate, l2BlockNumber: 0x10 });
+    }
+
+    ////////////////////////////////////////////////////////////////
+    //            `IDisputeGame` Implementation Tests             //
+    ////////////////////////////////////////////////////////////////
+
+    /// @dev Tests that the constructor of the `FaultDisputeGame` reverts when the `MAX_GAME_DEPTH` parameter is
+    ///      greater  than `LibPosition.MAX_POSITION_BITLEN - 1`.
+    function testFuzz_constructor_maxDepthTooLarge_reverts(uint256 _maxGameDepth) public {
+        AlphabetVM alphabetVM = new AlphabetVM(absolutePrestate, new PreimageOracle(0, 0));
+
+        _maxGameDepth = bound(_maxGameDepth, LibPosition.MAX_POSITION_BITLEN, type(uint256).max - 1);
+        vm.expectRevert(MaxDepthTooLarge.selector);
+        new FaultDisputeGame({
+            _gameType: GAME_TYPE,
+            _absolutePrestate: absolutePrestate,
+            _maxGameDepth: _maxGameDepth,
+            _splitDepth: _maxGameDepth + 1,
+            _clockExtension: Duration.wrap(3 hours),
+            _maxClockDuration: Duration.wrap(3.5 days),
+            _vm: alphabetVM,
+            _weth: DelayedWETH(payable(address(0))),
+            _anchorStateRegistry: IAnchorStateRegistry(address(0)),
+            _l2ChainId: 10
+        });
+    }
+
+    /// @dev Tests that the constructor of the `FaultDisputeGame` reverts when the `_splitDepth`
+    ///      parameter is greater than or equal to the `MAX_GAME_DEPTH`
+    function testFuzz_constructor_invalidSplitDepth_reverts(uint256 _splitDepth) public {
+        AlphabetVM alphabetVM = new AlphabetVM(absolutePrestate, new PreimageOracle(0, 0));
+
+        _splitDepth = bound(_splitDepth, 2 ** 3, type(uint256).max);
+        vm.expectRevert(InvalidSplitDepth.selector);
+        new FaultDisputeGame({
+            _gameType: GAME_TYPE,
+            _absolutePrestate: absolutePrestate,
+            _maxGameDepth: 2 ** 3,
+            _splitDepth: _splitDepth,
+            _clockExtension: Duration.wrap(3 hours),
+            _maxClockDuration: Duration.wrap(3.5 days),
+            _vm: alphabetVM,
+            _weth: DelayedWETH(payable(address(0))),
+            _anchorStateRegistry: IAnchorStateRegistry(address(0)),
+            _l2ChainId: 10
+        });
+    }
+
+    /// @dev Tests that the constructor of the `FaultDisputeGame` reverts when clock extension is greater than the
+    ///      max clock duration.
+    function testFuzz_constructor_clockExtensionTooLong_reverts(
+        uint64 _maxClockDuration,
+        uint64 _clockExtension
+    )
+        public
+    {
+        AlphabetVM alphabetVM = new AlphabetVM(absolutePrestate, new PreimageOracle(0, 0));
+
+        _maxClockDuration = uint64(bound(_maxClockDuration, 0, type(uint64).max - 1));
+        _clockExtension = uint64(bound(_clockExtension, _maxClockDuration + 1, type(uint64).max));
+        vm.expectRevert(InvalidClockExtension.selector);
+        new FaultDisputeGame({
+            _gameType: GAME_TYPE,
+            _absolutePrestate: absolutePrestate,
+            _maxGameDepth: 16,
+            _splitDepth: 8,
+            _clockExtension: Duration.wrap(_clockExtension),
+            _maxClockDuration: Duration.wrap(_maxClockDuration),
+            _vm: alphabetVM,
+            _weth: DelayedWETH(payable(address(0))),
+            _anchorStateRegistry: IAnchorStateRegistry(address(0)),
+            _l2ChainId: 10
+        });
+    }
+
+    /// @dev Tests that the game's root claim is set correctly.
+    function test_rootClaim_succeeds() public view {
+        assertEq(gameProxy.rootClaim().raw(), ROOT_CLAIM.raw());
+    }
+
+    /// @dev Tests that the game's extra data is set correctly.
+    function test_extraData_succeeds() public view {
+        assertEq(gameProxy.extraData(), extraData);
+    }
+
+    /// @dev Tests that the game's starting timestamp is set correctly.
+    function test_createdAt_succeeds() public view {
+        assertEq(gameProxy.createdAt().raw(), block.timestamp);
+    }
+
+    /// @dev Tests that the game's type is set correctly.
+    function test_gameType_succeeds() public view {
+        assertEq(gameProxy.gameType().raw(), GAME_TYPE.raw());
+    }
+
+    /// @dev Tests that the game's data is set correctly.
+    function test_gameData_succeeds() public view {
+        (GameType gameType, Claim rootClaim, bytes memory _extraData) = gameProxy.gameData();
+
+        assertEq(gameType.raw(), GAME_TYPE.raw());
+        assertEq(rootClaim.raw(), ROOT_CLAIM.raw());
+        assertEq(_extraData, extraData);
+    }
+
+    ////////////////////////////////////////////////////////////////
+    //          `IFaultDisputeGame` Implementation Tests       //
+    ////////////////////////////////////////////////////////////////
+
+    /// @dev Tests that the game cannot be initialized with an output root that commits to <= the configured starting
+    ///      block number
+    function testFuzz_initialize_cannotProposeGenesis_reverts(uint256 _blockNumber) public {
+        (, uint256 startingL2Block) = gameProxy.startingOutputRoot();
+        _blockNumber = bound(_blockNumber, 0, startingL2Block);
+
+        Claim claim = _dummyClaim();
+        vm.expectRevert(abi.encodeWithSelector(UnexpectedRootClaim.selector, claim));
+        gameProxy =
+            FaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, claim, abi.encode(_blockNumber)))));
+    }
+
+    /// @dev Tests that the proxy receives ETH from the dispute game factory.
+    function test_initialize_receivesETH_succeeds() public {
+        uint256 _value = disputeGameFactory.initBonds(GAME_TYPE);
+        vm.deal(address(this), _value);
+
+        assertEq(address(gameProxy).balance, 0);
+        gameProxy = FaultDisputeGame(
+            payable(address(disputeGameFactory.create{ value: _value }(GAME_TYPE, ROOT_CLAIM, abi.encode(1))))
+        );
+        assertEq(address(gameProxy).balance, 0);
+        assertEq(delayedWeth.balanceOf(address(gameProxy)), _value);
+    }
+
+    /// @dev Tests that the game cannot be initialized with extra data of the incorrect length (must be 32 bytes)
+    function testFuzz_initialize_badExtraData_reverts(uint256 _extraDataLen) public {
+        // The `DisputeGameFactory` will pack the root claim and the extra data into a single array, which is enforced
+        // to be at least 64 bytes long.
+        // We bound the upper end to 23.5KB to ensure that the minimal proxy never surpasses the contract size limit
+        // in this test, as CWIA proxies store the immutable args in their bytecode.
+        // [0 bytes, 31 bytes] u [33 bytes, 23.5 KB]
+        _extraDataLen = bound(_extraDataLen, 0, 23_500);
+        if (_extraDataLen == 32) {
+            _extraDataLen++;
+        }
+        bytes memory _extraData = new bytes(_extraDataLen);
+
+        // Assign the first 32 bytes in `extraData` to a valid L2 block number passed the starting block.
+        (, uint256 startingL2Block) = gameProxy.startingOutputRoot();
+        assembly {
+            mstore(add(_extraData, 0x20), add(startingL2Block, 1))
+        }
+
+        Claim claim = _dummyClaim();
+        vm.expectRevert(abi.encodeWithSelector(BadExtraData.selector));
+        gameProxy = FaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, claim, _extraData))));
+    }
+
+    /// @dev Tests that the game is initialized with the correct data.
+    function test_initialize_correctData_succeeds() public view {
+        // Assert that the root claim is initialized correctly.
+        (
+            uint32 parentIndex,
+            address counteredBy,
+            address claimant,
+            uint128 bond,
+            Claim claim,
+            Position position,
+            Clock clock
+        ) = gameProxy.claimData(0);
+        assertEq(parentIndex, type(uint32).max);
+        assertEq(counteredBy, address(0));
+        assertEq(claimant, address(this));
+        assertEq(bond, 0);
+        assertEq(claim.raw(), ROOT_CLAIM.raw());
+        assertEq(position.raw(), 1);
+        assertEq(clock.raw(), LibClock.wrap(Duration.wrap(0), Timestamp.wrap(uint64(block.timestamp))).raw());
+
+        // Assert that the `createdAt` timestamp is correct.
+        assertEq(gameProxy.createdAt().raw(), block.timestamp);
+
+        // Assert that the blockhash provided is correct.
+        assertEq(gameProxy.l1Head().raw(), blockhash(block.number - 1));
+    }
+
+    /// @dev Tests that the game cannot be initialized twice.
+    function test_initialize_onlyOnce_succeeds() public {
+        vm.expectRevert(AlreadyInitialized.selector);
+        gameProxy.initialize();
+    }
+
+    /// @dev Tests that the user cannot control the first 4 bytes of the CWIA data, disallowing them to control the
+    ///      entrypoint when no calldata is provided to a call.
+    function test_cwiaCalldata_userCannotControlSelector_succeeds() public {
+        // Construct the expected CWIA data that the proxy will pass to the implementation, alongside any extra
+        // calldata passed by the user.
+        Hash l1Head = gameProxy.l1Head();
+        bytes memory cwiaData = abi.encodePacked(address(this), gameProxy.rootClaim(), l1Head, gameProxy.extraData());
+
+        // We expect a `ReceiveETH` event to be emitted when 0 bytes of calldata are sent; The fallback is always
+        // reached *within the minimal proxy* in `LibClone`'s version of `clones-with-immutable-args`
+        vm.expectEmit(false, false, false, true);
+        emit ReceiveETH(0);
+        // We expect no delegatecall to the implementation contract if 0 bytes are sent. Assert that this happens
+        // 0 times.
+        vm.expectCall(address(gameImpl), cwiaData, 0);
+        (bool successA,) = address(gameProxy).call(hex"");
+        assertTrue(successA);
+
+        // When calldata is forwarded, we do expect a delegatecall to the implementation.
+        bytes memory data = abi.encodePacked(gameProxy.l1Head.selector);
+        vm.expectCall(address(gameImpl), abi.encodePacked(data, cwiaData), 1);
+        (bool successB, bytes memory returnData) = address(gameProxy).call(data);
+        assertTrue(successB);
+        assertEq(returnData, abi.encode(l1Head));
+    }
+
+    /// @dev Tests that the bond during the bisection game depths is correct.
+    function test_getRequiredBond_succeeds() public view {
+        for (uint8 i = 0; i < uint8(gameProxy.splitDepth()); i++) {
+            Position pos = LibPosition.wrap(i, 0);
+            uint256 bond = gameProxy.getRequiredBond(pos);
+
+            // Reasonable approximation for a max depth of 8.
+            uint256 expected = 0.08 ether;
+            for (uint64 j = 0; j < i; j++) {
+                expected = expected * 22876;
+                expected = expected / 10000;
+            }
+
+            assertApproxEqAbs(bond, expected, 0.01 ether);
+        }
+    }
+
+    /// @dev Tests that the bond at a depth greater than the maximum game depth reverts.
+    function test_getRequiredBond_outOfBounds_reverts() public {
+        Position pos = LibPosition.wrap(uint8(gameProxy.maxGameDepth() + 1), 0);
+        vm.expectRevert(GameDepthExceeded.selector);
+        gameProxy.getRequiredBond(pos);
+    }
+
+    /// @dev Tests that a move while the game status is not `IN_PROGRESS` causes the call to revert
+    ///      with the `GameNotInProgress` error
+    function test_move_gameNotInProgress_reverts() public {
+        uint256 chalWins = uint256(GameStatus.CHALLENGER_WINS);
+
+        // Replace the game status in storage. It exists in slot 0 at offset 16.
+        uint256 slot = uint256(vm.load(address(gameProxy), bytes32(0)));
+        uint256 offset = 16 << 3;
+        uint256 mask = 0xFF << offset;
+        // Replace the byte in the slot value with the challenger wins status.
+        slot = (slot & ~mask) | (chalWins << offset);
+        vm.store(address(gameProxy), bytes32(0), bytes32(slot));
+
+        // Ensure that the game status was properly updated.
+        GameStatus status = gameProxy.status();
+        assertEq(uint256(status), chalWins);
+
+        // Attempt to make a move. Should revert.
+        vm.expectRevert(GameNotInProgress.selector);
+        gameProxy.attack(0, Claim.wrap(0));
+    }
+
+    /// @dev Tests that an attempt to defend the root claim reverts with the `CannotDefendRootClaim` error.
+    function test_move_defendRoot_reverts() public {
+        vm.expectRevert(CannotDefendRootClaim.selector);
+        gameProxy.defend(0, _dummyClaim());
+    }
+
+    /// @dev Tests that an attempt to move against a claim that does not exist reverts with the
+    ///      `ParentDoesNotExist` error.
+    function test_move_nonExistentParent_reverts() public {
+        Claim claim = _dummyClaim();
+
+        // Expect an out of bounds revert for an attack
+        vm.expectRevert(abi.encodeWithSignature("Panic(uint256)", 0x32));
+        gameProxy.attack(1, claim);
+
+        // Expect an out of bounds revert for a defense
+        vm.expectRevert(abi.encodeWithSignature("Panic(uint256)", 0x32));
+        gameProxy.defend(1, claim);
+    }
+
+    /// @dev Tests that an attempt to move at the maximum game depth reverts with the
+    ///      `GameDepthExceeded` error.
+    function test_move_gameDepthExceeded_reverts() public {
+        Claim claim = _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC);
+
+        uint256 maxDepth = gameProxy.maxGameDepth();
+
+        for (uint256 i = 0; i <= maxDepth; i++) {
+            // At the max game depth, the `_move` function should revert with
+            // the `GameDepthExceeded` error.
+            if (i == maxDepth) {
+                vm.expectRevert(GameDepthExceeded.selector);
+                gameProxy.attack{ value: 100 ether }(i, claim);
+            } else {
+                gameProxy.attack{ value: _getRequiredBond(i) }(i, claim);
+            }
+        }
+    }
+
+    /// @dev Tests that a move made after the clock time has exceeded reverts with the
+    ///      `ClockTimeExceeded` error.
+    function test_move_clockTimeExceeded_reverts() public {
+        // Warp ahead past the clock time for the first move (3 1/2 days)
+        vm.warp(block.timestamp + 3 days + 12 hours + 1);
+        uint256 bond = _getRequiredBond(0);
+        vm.expectRevert(ClockTimeExceeded.selector);
+        gameProxy.attack{ value: bond }(0, _dummyClaim());
+    }
+
+    /// @notice Static unit test for the correctness of the chess clock incrementation.
+    function test_move_clockCorrectness_succeeds() public {
+        (,,,,,, Clock clock) = gameProxy.claimData(0);
+        assertEq(clock.raw(), LibClock.wrap(Duration.wrap(0), Timestamp.wrap(uint64(block.timestamp))).raw());
+
+        Claim claim = _dummyClaim();
+
+        vm.warp(block.timestamp + 15);
+        uint256 bond = _getRequiredBond(0);
+        gameProxy.attack{ value: bond }(0, claim);
+        (,,,,,, clock) = gameProxy.claimData(1);
+        assertEq(clock.raw(), LibClock.wrap(Duration.wrap(15), Timestamp.wrap(uint64(block.timestamp))).raw());
+
+        vm.warp(block.timestamp + 10);
+        bond = _getRequiredBond(1);
+        gameProxy.attack{ value: bond }(1, claim);
+        (,,,,,, clock) = gameProxy.claimData(2);
+        assertEq(clock.raw(), LibClock.wrap(Duration.wrap(10), Timestamp.wrap(uint64(block.timestamp))).raw());
+
+        // We are at the split depth, so we need to set the status byte of the claim
+        // for the next move.
+        claim = _changeClaimStatus(claim, VMStatuses.PANIC);
+
+        vm.warp(block.timestamp + 10);
+        bond = _getRequiredBond(2);
+        gameProxy.attack{ value: bond }(2, claim);
+        (,,,,,, clock) = gameProxy.claimData(3);
+        assertEq(clock.raw(), LibClock.wrap(Duration.wrap(25), Timestamp.wrap(uint64(block.timestamp))).raw());
+
+        vm.warp(block.timestamp + 10);
+        bond = _getRequiredBond(3);
+        gameProxy.attack{ value: bond }(3, claim);
+        (,,,,,, clock) = gameProxy.claimData(4);
+        assertEq(clock.raw(), LibClock.wrap(Duration.wrap(20), Timestamp.wrap(uint64(block.timestamp))).raw());
+    }
+
+    /// @notice Static unit test that checks proper clock extension.
+    function test_move_clockExtensionCorrectness_succeeds() public {
+        (,,,,,, Clock clock) = gameProxy.claimData(0);
+        assertEq(clock.raw(), LibClock.wrap(Duration.wrap(0), Timestamp.wrap(uint64(block.timestamp))).raw());
+
+        Claim claim = _dummyClaim();
+        uint256 splitDepth = gameProxy.splitDepth();
+        uint64 halfGameDuration = gameProxy.maxClockDuration().raw();
+        uint64 clockExtension = gameProxy.clockExtension().raw();
+
+        // Make an initial attack against the root claim with 1 second left on the clock. The grandchild should be
+        // allocated exactly `clockExtension` seconds remaining on their potential clock.
+        vm.warp(block.timestamp + halfGameDuration - 1 seconds);
+        uint256 bond = _getRequiredBond(0);
+        gameProxy.attack{ value: bond }(0, claim);
+        (,,,,,, clock) = gameProxy.claimData(1);
+        assertEq(clock.duration().raw(), halfGameDuration - clockExtension);
+
+        // Warp ahead to the last second of the root claim defender's clock, and bisect all the way down to the move
+        // above the `SPLIT_DEPTH`. This warp guarantees that all moves from here on out will have clock extensions.
+        vm.warp(block.timestamp + halfGameDuration - 1 seconds);
+        for (uint256 i = 1; i < splitDepth - 2; i++) {
+            bond = _getRequiredBond(i);
+            gameProxy.attack{ value: bond }(i, claim);
+        }
+
+        // Warp ahead 1 seconds to have `clockExtension - 1 seconds` left on the next move's clock.
+        vm.warp(block.timestamp + 1 seconds);
+
+        // The move above the split depth's grand child is the execution trace bisection root. The grandchild should
+        // be allocated `clockExtension * 2` seconds on their potential clock, if currently they have less than
+        // `clockExtension` seconds left.
+        bond = _getRequiredBond(splitDepth - 2);
+        gameProxy.attack{ value: bond }(splitDepth - 2, claim);
+        (,,,,,, clock) = gameProxy.claimData(splitDepth - 1);
+        assertEq(clock.duration().raw(), halfGameDuration - clockExtension * 2);
+    }
+
+    /// @dev Tests that an identical claim cannot be made twice. The duplicate claim attempt should
+    ///      revert with the `ClaimAlreadyExists` error.
+    function test_move_duplicateClaim_reverts() public {
+        Claim claim = _dummyClaim();
+
+        // Make the first move. This should succeed.
+        uint256 bond = _getRequiredBond(0);
+        gameProxy.attack{ value: bond }(0, claim);
+
+        // Attempt to make the same move again.
+        vm.expectRevert(ClaimAlreadyExists.selector);
+        gameProxy.attack{ value: bond }(0, claim);
+    }
+
+    /// @dev Static unit test asserting that identical claims at the same position can be made in different subgames.
+    function test_move_duplicateClaimsDifferentSubgames_succeeds() public {
+        Claim claimA = _dummyClaim();
+        Claim claimB = _dummyClaim();
+
+        // Make the first moves. This should succeed.
+        uint256 bond = _getRequiredBond(0);
+        gameProxy.attack{ value: bond }(0, claimA);
+        gameProxy.attack{ value: bond }(0, claimB);
+
+        // Perform an attack at the same position with the same claim value in both subgames.
+        // These both should succeed.
+        bond = _getRequiredBond(1);
+        gameProxy.attack{ value: bond }(1, claimA);
+        bond = _getRequiredBond(2);
+        gameProxy.attack{ value: bond }(2, claimA);
+    }
+
+    /// @dev Static unit test for the correctness of an opening attack.
+    function test_move_simpleAttack_succeeds() public {
+        // Warp ahead 5 seconds.
+        vm.warp(block.timestamp + 5);
+
+        Claim counter = _dummyClaim();
+
+        // Perform the attack.
+        uint256 reqBond = _getRequiredBond(0);
+        vm.expectEmit(true, true, true, false);
+        emit Move(0, counter, address(this));
+        gameProxy.attack{ value: reqBond }(0, counter);
+
+        // Grab the claim data of the attack.
+        (
+            uint32 parentIndex,
+            address counteredBy,
+            address claimant,
+            uint128 bond,
+            Claim claim,
+            Position position,
+            Clock clock
+        ) = gameProxy.claimData(1);
+
+        // Assert correctness of the attack claim's data.
+        assertEq(parentIndex, 0);
+        assertEq(counteredBy, address(0));
+        assertEq(claimant, address(this));
+        assertEq(bond, reqBond);
+        assertEq(claim.raw(), counter.raw());
+        assertEq(position.raw(), Position.wrap(1).move(true).raw());
+        assertEq(clock.raw(), LibClock.wrap(Duration.wrap(5), Timestamp.wrap(uint64(block.timestamp))).raw());
+
+        // Grab the claim data of the parent.
+        (parentIndex, counteredBy, claimant, bond, claim, position, clock) = gameProxy.claimData(0);
+
+        // Assert correctness of the parent claim's data.
+        assertEq(parentIndex, type(uint32).max);
+        assertEq(counteredBy, address(0));
+        assertEq(claimant, address(this));
+        assertEq(bond, 0);
+        assertEq(claim.raw(), ROOT_CLAIM.raw());
+        assertEq(position.raw(), 1);
+        assertEq(clock.raw(), LibClock.wrap(Duration.wrap(0), Timestamp.wrap(uint64(block.timestamp - 5))).raw());
+    }
+
+    /// @dev Tests that making a claim at the execution trace bisection root level with an invalid status
+    ///      byte reverts with the `UnexpectedRootClaim` error.
+    function test_move_incorrectStatusExecRoot_reverts() public {
+        for (uint256 i; i < 4; i++) {
+            gameProxy.attack{ value: _getRequiredBond(i) }(i, _dummyClaim());
+        }
+
+        uint256 bond = _getRequiredBond(4);
+        vm.expectRevert(abi.encodeWithSelector(UnexpectedRootClaim.selector, bytes32(0)));
+        gameProxy.attack{ value: bond }(4, Claim.wrap(bytes32(0)));
+    }
+
+    /// @dev Tests that making a claim at the execution trace bisection root level with a valid status
+    ///      byte succeeds.
+    function test_move_correctStatusExecRoot_succeeds() public {
+        for (uint256 i; i < 4; i++) {
+            uint256 bond = _getRequiredBond(i);
+            gameProxy.attack{ value: bond }(i, _dummyClaim());
+        }
+        uint256 lastBond = _getRequiredBond(4);
+        gameProxy.attack{ value: lastBond }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+    }
+
+    /// @dev Static unit test asserting that a move reverts when the bonded amount is incorrect.
+    function test_move_incorrectBondAmount_reverts() public {
+        vm.expectRevert(IncorrectBondAmount.selector);
+        gameProxy.attack{ value: 0 }(0, _dummyClaim());
+    }
+
+    /// @dev Tests that a claim cannot be stepped against twice.
+    function test_step_duplicateStep_reverts() public {
+        // Give the test contract some ether
+        vm.deal(address(this), 1000 ether);
+
+        // Make claims all the way down the tree.
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(1) }(1, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(2) }(2, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(3) }(3, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(4) }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        gameProxy.attack{ value: _getRequiredBond(5) }(5, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(6) }(6, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(7) }(7, _dummyClaim());
+        gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
+        gameProxy.step(8, true, absolutePrestateData, hex"");
+
+        vm.expectRevert(DuplicateStep.selector);
+        gameProxy.step(8, true, absolutePrestateData, hex"");
+    }
+
+    /// @dev Tests that successfully step with true attacking claim when there is a true defend claim(claim5) in the
+    /// middle of the dispute game.
+    function test_stepAttackDummyClaim_defendTrueClaimInTheMiddle_succeeds() public {
+        // Give the test contract some ether
+        vm.deal(address(this), 1000 ether);
+
+        // Make claims all the way down the tree.
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(1) }(1, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(2) }(2, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(3) }(3, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(4) }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        bytes memory claimData5 = abi.encode(5, 5);
+        Claim claim5 = Claim.wrap(keccak256(claimData5));
+        gameProxy.attack{ value: _getRequiredBond(5) }(5, claim5);
+        gameProxy.defend{ value: _getRequiredBond(6) }(6, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(7) }(7, _dummyClaim());
+        gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
+        gameProxy.step(8, true, claimData5, hex"");
+    }
+
+    /// @dev Tests that step reverts with false attacking claim when there is a true defend claim(claim5) in the middle
+    /// of the dispute game.
+    function test_stepAttackTrueClaim_defendTrueClaimInTheMiddle_reverts() public {
+        // Give the test contract some ether
+        vm.deal(address(this), 1000 ether);
+
+        // Make claims all the way down the tree.
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(1) }(1, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(2) }(2, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(3) }(3, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(4) }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        bytes memory claimData5 = abi.encode(5, 5);
+        Claim claim5 = Claim.wrap(keccak256(claimData5));
+        gameProxy.attack{ value: _getRequiredBond(5) }(5, claim5);
+        gameProxy.defend{ value: _getRequiredBond(6) }(6, _dummyClaim());
+        Claim postState_ = Claim.wrap(gameImpl.vm().step(claimData5, hex"", bytes32(0)));
+        gameProxy.attack{ value: _getRequiredBond(7) }(7, postState_);
+        gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
+
+        vm.expectRevert(ValidStep.selector);
+        gameProxy.step(8, true, claimData5, hex"");
+    }
+
+    /// @dev Tests that step reverts with false defending claim when there is a true defend claim(postState_) in the
+    /// middle of the dispute game.
+    function test_stepDefendDummyClaim_defendTrueClaimInTheMiddle_reverts() public {
+        // Give the test contract some ether
+        vm.deal(address(this), 1000 ether);
+
+        // Make claims all the way down the tree.
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(1) }(1, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(2) }(2, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(3) }(3, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(4) }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+
+        bytes memory claimData7 = abi.encode(5, 5);
+        Claim postState_ = Claim.wrap(gameImpl.vm().step(claimData7, hex"", bytes32(0)));
+
+        gameProxy.attack{ value: _getRequiredBond(5) }(5, postState_);
+        gameProxy.defend{ value: _getRequiredBond(6) }(6, _dummyClaim());
+
+        bytes memory _dummyClaimData = abi.encode(gasleft(), gasleft());
+        Claim dummyClaim7 = Claim.wrap(keccak256(_dummyClaimData));
+        gameProxy.attack{ value: _getRequiredBond(7) }(7, dummyClaim7);
+        gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
+        vm.expectRevert(ValidStep.selector);
+        gameProxy.step(8, false, _dummyClaimData, hex"");
+    }
+
+    /// @dev Tests that step reverts with true defending claim when there is a true defend claim(postState_) in the
+    /// middle of the dispute game.
+    function test_stepDefendTrueClaim_defendTrueClaimInTheMiddle_reverts() public {
+        // Give the test contract some ether
+        vm.deal(address(this), 1000 ether);
+
+        // Make claims all the way down the tree.
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(1) }(1, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(2) }(2, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(3) }(3, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(4) }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+
+        bytes memory claimData7 = abi.encode(5, 5);
+        Claim claim7 = Claim.wrap(keccak256(claimData7));
+        Claim postState_ = Claim.wrap(gameImpl.vm().step(claimData7, hex"", bytes32(0)));
+
+        gameProxy.attack{ value: _getRequiredBond(5) }(5, postState_);
+        gameProxy.defend{ value: _getRequiredBond(6) }(6, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(7) }(7, claim7);
+        gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
+
+        vm.expectRevert(ValidStep.selector);
+        gameProxy.step(8, false, claimData7, hex"");
+    }
+
+    /// @dev Static unit test for the correctness an uncontested root resolution.
+    function test_resolve_rootUncontested_succeeds() public {
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        gameProxy.resolveClaim(0, 0);
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
+    }
+
+    /// @dev Static unit test for the correctness an uncontested root resolution.
+    function test_resolve_rootUncontestedClockNotExpired_succeeds() public {
+        vm.warp(block.timestamp + 3 days + 12 hours - 1 seconds);
+        vm.expectRevert(ClockNotExpired.selector);
+        gameProxy.resolveClaim(0, 0);
+    }
+
+    /// @dev Static unit test for the correctness of a multi-part resolution of a single claim.
+    function test_resolve_multiPart_succeeds() public {
+        vm.deal(address(this), 10_000 ether);
+
+        uint256 bond = _getRequiredBond(0);
+        for (uint256 i = 0; i < 2048; i++) {
+            gameProxy.attack{ value: bond }(0, Claim.wrap(bytes32(i)));
+        }
+
+        // Warp past the clock period.
+        vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
+
+        // Resolve all children of the root subgame. Every single one of these will be uncontested.
+        for (uint256 i = 1; i <= 2048; i++) {
+            gameProxy.resolveClaim(i, 0);
+        }
+
+        // Resolve the first half of the root claim subgame.
+        gameProxy.resolveClaim(0, 1024);
+
+        // Fetch the resolution checkpoint for the root subgame and assert correctness.
+        (bool initCheckpoint, uint32 subgameIndex, Position leftmostPosition, address counteredBy) =
+            gameProxy.resolutionCheckpoints(0);
+        assertTrue(initCheckpoint);
+        assertEq(subgameIndex, 1024);
+        assertEq(leftmostPosition.raw(), Position.wrap(1).move(true).raw());
+        assertEq(counteredBy, address(this));
+
+        // The root subgame should not be resolved.
+        assertFalse(gameProxy.resolvedSubgames(0));
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolve();
+
+        // Resolve the second half of the root claim subgame.
+        uint256 numToResolve = gameProxy.getNumToResolve(0);
+        assertEq(numToResolve, 1024);
+        gameProxy.resolveClaim(0, numToResolve);
+
+        // Fetch the resolution checkpoint for the root subgame and assert correctness.
+        (initCheckpoint, subgameIndex, leftmostPosition, counteredBy) = gameProxy.resolutionCheckpoints(0);
+        assertTrue(initCheckpoint);
+        assertEq(subgameIndex, 2048);
+        assertEq(leftmostPosition.raw(), Position.wrap(1).move(true).raw());
+        assertEq(counteredBy, address(this));
+
+        // The root subgame should now be resolved
+        assertTrue(gameProxy.resolvedSubgames(0));
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS));
+    }
+
+    /// @dev Static unit test asserting that resolve reverts when the absolute root
+    ///      subgame has not been resolved.
+    function test_resolve_rootUncontestedButUnresolved_reverts() public {
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolve();
+    }
+
+    /// @dev Static unit test asserting that resolve reverts when the game state is
+    ///      not in progress.
+    function test_resolve_notInProgress_reverts() public {
+        uint256 chalWins = uint256(GameStatus.CHALLENGER_WINS);
+
+        // Replace the game status in storage. It exists in slot 0 at offset 16.
+        uint256 slot = uint256(vm.load(address(gameProxy), bytes32(0)));
+        uint256 offset = 16 << 3;
+        uint256 mask = 0xFF << offset;
+        // Replace the byte in the slot value with the challenger wins status.
+        slot = (slot & ~mask) | (chalWins << offset);
+
+        vm.store(address(gameProxy), bytes32(uint256(0)), bytes32(slot));
+        vm.expectRevert(GameNotInProgress.selector);
+        gameProxy.resolveClaim(0, 0);
+    }
+
+    /// @dev Static unit test for the correctness of resolving a single attack game state.
+    function test_resolve_rootContested_succeeds() public {
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+
+        vm.warp(block.timestamp + 3 days + 12 hours);
+
+        gameProxy.resolveClaim(1, 0);
+        gameProxy.resolveClaim(0, 0);
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS));
+    }
+
+    /// @dev Static unit test for the correctness of resolving a game with a contested challenge claim.
+    function test_resolve_challengeContested_succeeds() public {
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+        gameProxy.defend{ value: _getRequiredBond(1) }(1, _dummyClaim());
+
+        vm.warp(block.timestamp + 3 days + 12 hours);
+
+        gameProxy.resolveClaim(2, 0);
+        gameProxy.resolveClaim(1, 0);
+        gameProxy.resolveClaim(0, 0);
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
+    }
+
+    /// @dev Static unit test for the correctness of resolving a game with multiplayer moves.
+    function test_resolve_teamDeathmatch_succeeds() public {
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+        gameProxy.defend{ value: _getRequiredBond(1) }(1, _dummyClaim());
+        gameProxy.defend{ value: _getRequiredBond(1) }(1, _dummyClaim());
+
+        vm.warp(block.timestamp + 3 days + 12 hours);
+
+        gameProxy.resolveClaim(4, 0);
+        gameProxy.resolveClaim(3, 0);
+        gameProxy.resolveClaim(2, 0);
+        gameProxy.resolveClaim(1, 0);
+        gameProxy.resolveClaim(0, 0);
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS));
+    }
+
+    /// @dev Static unit test for the correctness of resolving a game that reaches max game depth.
+    function test_resolve_stepReached_succeeds() public {
+        Claim claim = _dummyClaim();
+        for (uint256 i; i < gameProxy.splitDepth(); i++) {
+            gameProxy.attack{ value: _getRequiredBond(i) }(i, claim);
+        }
+
+        claim = _changeClaimStatus(claim, VMStatuses.PANIC);
+        for (uint256 i = gameProxy.claimDataLen() - 1; i < gameProxy.maxGameDepth(); i++) {
+            gameProxy.attack{ value: _getRequiredBond(i) }(i, claim);
+        }
+
+        vm.warp(block.timestamp + 3 days + 12 hours);
+
+        for (uint256 i = 9; i > 0; i--) {
+            gameProxy.resolveClaim(i - 1, 0);
+        }
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
+    }
+
+    /// @dev Static unit test asserting that resolve reverts when attempting to resolve a subgame multiple times
+    function test_resolve_claimAlreadyResolved_reverts() public {
+        Claim claim = _dummyClaim();
+        uint256 firstBond = _getRequiredBond(0);
+        vm.deal(address(this), firstBond);
+        gameProxy.attack{ value: firstBond }(0, claim);
+        uint256 secondBond = _getRequiredBond(1);
+        vm.deal(address(this), secondBond);
+        gameProxy.attack{ value: secondBond }(1, claim);
+
+        vm.warp(block.timestamp + 3 days + 12 hours);
+
+        assertEq(address(this).balance, 0);
+        gameProxy.resolveClaim(2, 0);
+        gameProxy.resolveClaim(1, 0);
+
+        // Wait for the withdrawal delay.
+        vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
+
+        gameProxy.claimCredit(address(this));
+        assertEq(address(this).balance, firstBond + secondBond);
+
+        vm.expectRevert(ClaimAlreadyResolved.selector);
+        gameProxy.resolveClaim(1, 0);
+        assertEq(address(this).balance, firstBond + secondBond);
+    }
+
+    /// @dev Static unit test asserting that resolve reverts when attempting to resolve a subgame at max depth
+    function test_resolve_claimAtMaxDepthAlreadyResolved_reverts() public {
+        Claim claim = _dummyClaim();
+        for (uint256 i; i < gameProxy.splitDepth(); i++) {
+            gameProxy.attack{ value: _getRequiredBond(i) }(i, claim);
+        }
+
+        vm.deal(address(this), 10000 ether);
+        claim = _changeClaimStatus(claim, VMStatuses.PANIC);
+        for (uint256 i = gameProxy.claimDataLen() - 1; i < gameProxy.maxGameDepth(); i++) {
+            gameProxy.attack{ value: _getRequiredBond(i) }(i, claim);
+        }
+
+        vm.warp(block.timestamp + 3 days + 12 hours);
+
+        // Resolve to claim bond
+        uint256 balanceBefore = address(this).balance;
+        gameProxy.resolveClaim(8, 0);
+
+        // Wait for the withdrawal delay.
+        vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
+
+        gameProxy.claimCredit(address(this));
+        assertEq(address(this).balance, balanceBefore + _getRequiredBond(7));
+
+        vm.expectRevert(ClaimAlreadyResolved.selector);
+        gameProxy.resolveClaim(8, 0);
+    }
+
+    /// @dev Static unit test asserting that resolve reverts when attempting to resolve subgames out of order
+    function test_resolve_outOfOrderResolution_reverts() public {
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+        gameProxy.attack{ value: _getRequiredBond(1) }(1, _dummyClaim());
+
+        vm.warp(block.timestamp + 3 days + 12 hours);
+
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(0, 0);
+    }
+
+    /// @dev Static unit test asserting that resolve pays out bonds on step, output bisection, and execution trace
+    /// moves.
+    function test_resolve_bondPayouts_succeeds() public {
+        // Give the test contract some ether
+        uint256 bal = 1000 ether;
+        vm.deal(address(this), bal);
+
+        // Make claims all the way down the tree.
+        uint256 bond = _getRequiredBond(0);
+        uint256 totalBonded = bond;
+        gameProxy.attack{ value: bond }(0, _dummyClaim());
+        bond = _getRequiredBond(1);
+        totalBonded += bond;
+        gameProxy.attack{ value: bond }(1, _dummyClaim());
+        bond = _getRequiredBond(2);
+        totalBonded += bond;
+        gameProxy.attack{ value: bond }(2, _dummyClaim());
+        bond = _getRequiredBond(3);
+        totalBonded += bond;
+        gameProxy.attack{ value: bond }(3, _dummyClaim());
+        bond = _getRequiredBond(4);
+        totalBonded += bond;
+        gameProxy.attack{ value: bond }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+        bond = _getRequiredBond(5);
+        totalBonded += bond;
+        gameProxy.attack{ value: bond }(5, _dummyClaim());
+        bond = _getRequiredBond(6);
+        totalBonded += bond;
+        gameProxy.attack{ value: bond }(6, _dummyClaim());
+        bond = _getRequiredBond(7);
+        totalBonded += bond;
+        gameProxy.attack{ value: bond }(7, _dummyClaim());
+        gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
+        gameProxy.step(8, true, absolutePrestateData, hex"");
+
+        // Ensure that the step successfully countered the leaf claim.
+        (, address counteredBy,,,,,) = gameProxy.claimData(8);
+        assertEq(counteredBy, address(this));
+
+        // Ensure we bonded the correct amounts
+        assertEq(address(this).balance, bal - totalBonded);
+        assertEq(address(gameProxy).balance, 0);
+        assertEq(delayedWeth.balanceOf(address(gameProxy)), totalBonded);
+
+        // Resolve all claims
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        for (uint256 i = gameProxy.claimDataLen(); i > 0; i--) {
+            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1, 0)));
+            assertTrue(success);
+        }
+        gameProxy.resolve();
+
+        // Wait for the withdrawal delay.
+        vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
+
+        gameProxy.claimCredit(address(this));
+
+        // Ensure that bonds were paid out correctly.
+        assertEq(address(this).balance, bal);
+        assertEq(address(gameProxy).balance, 0);
+        assertEq(delayedWeth.balanceOf(address(gameProxy)), 0);
+
+        // Ensure that the init bond for the game is 0, in case we change it in the test suite in the future.
+        assertEq(disputeGameFactory.initBonds(GAME_TYPE), 0);
+    }
+
+    /// @dev Static unit test asserting that resolve pays out bonds on step, output bisection, and execution trace
+    /// moves with 2 actors and a dishonest root claim.
+    function test_resolve_bondPayoutsSeveralActors_succeeds() public {
+        // Give the test contract and bob some ether
+        uint256 bal = 1000 ether;
+        address bob = address(0xb0b);
+        vm.deal(address(this), bal);
+        vm.deal(bob, bal);
+
+        // Make claims all the way down the tree, trading off between bob and the test contract.
+        uint256 firstBond = _getRequiredBond(0);
+        uint256 thisBonded = firstBond;
+        gameProxy.attack{ value: firstBond }(0, _dummyClaim());
+
+        uint256 secondBond = _getRequiredBond(1);
+        uint256 bobBonded = secondBond;
+        vm.prank(bob);
+        gameProxy.attack{ value: secondBond }(1, _dummyClaim());
+
+        uint256 thirdBond = _getRequiredBond(2);
+        thisBonded += thirdBond;
+        gameProxy.attack{ value: thirdBond }(2, _dummyClaim());
+
+        uint256 fourthBond = _getRequiredBond(3);
+        bobBonded += fourthBond;
+        vm.prank(bob);
+        gameProxy.attack{ value: fourthBond }(3, _dummyClaim());
+
+        uint256 fifthBond = _getRequiredBond(4);
+        thisBonded += fifthBond;
+        gameProxy.attack{ value: fifthBond }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+
+        uint256 sixthBond = _getRequiredBond(5);
+        bobBonded += sixthBond;
+        vm.prank(bob);
+        gameProxy.attack{ value: sixthBond }(5, _dummyClaim());
+
+        uint256 seventhBond = _getRequiredBond(6);
+        thisBonded += seventhBond;
+        gameProxy.attack{ value: seventhBond }(6, _dummyClaim());
+
+        uint256 eighthBond = _getRequiredBond(7);
+        bobBonded += eighthBond;
+        vm.prank(bob);
+        gameProxy.attack{ value: eighthBond }(7, _dummyClaim());
+
+        gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0);
+        gameProxy.step(8, true, absolutePrestateData, hex"");
+
+        // Ensure that the step successfully countered the leaf claim.
+        (, address counteredBy,,,,,) = gameProxy.claimData(8);
+        assertEq(counteredBy, address(this));
+
+        // Ensure we bonded the correct amounts
+        assertEq(address(this).balance, bal - thisBonded);
+        assertEq(bob.balance, bal - bobBonded);
+        assertEq(address(gameProxy).balance, 0);
+        assertEq(delayedWeth.balanceOf(address(gameProxy)), thisBonded + bobBonded);
+
+        // Resolve all claims
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        for (uint256 i = gameProxy.claimDataLen(); i > 0; i--) {
+            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1, 0)));
+            assertTrue(success);
+        }
+        gameProxy.resolve();
+
+        // Wait for the withdrawal delay.
+        vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
+
+        gameProxy.claimCredit(address(this));
+
+        // Bob's claim should revert since it's value is 0
+        vm.expectRevert(NoCreditToClaim.selector);
+        gameProxy.claimCredit(bob);
+
+        // Ensure that bonds were paid out correctly.
+        assertEq(address(this).balance, bal + bobBonded);
+        assertEq(bob.balance, bal - bobBonded);
+        assertEq(address(gameProxy).balance, 0);
+        assertEq(delayedWeth.balanceOf(address(gameProxy)), 0);
+
+        // Ensure that the init bond for the game is 0, in case we change it in the test suite in the future.
+        assertEq(disputeGameFactory.initBonds(GAME_TYPE), 0);
+    }
+
+    /// @dev Static unit test asserting that resolve pays out bonds on moves to the leftmost actor
+    /// in subgames containing successful counters.
+    function test_resolve_leftmostBondPayout_succeeds() public {
+        uint256 bal = 1000 ether;
+        address alice = address(0xa11ce);
+        address bob = address(0xb0b);
+        address charlie = address(0xc0c);
+        vm.deal(address(this), bal);
+        vm.deal(alice, bal);
+        vm.deal(bob, bal);
+        vm.deal(charlie, bal);
+
+        // Make claims with bob, charlie and the test contract on defense, and alice as the challenger
+        // charlie is successfully countered by alice
+        // alice is successfully countered by both bob and the test contract
+        uint256 firstBond = _getRequiredBond(0);
+        vm.prank(alice);
+        gameProxy.attack{ value: firstBond }(0, _dummyClaim());
+
+        uint256 secondBond = _getRequiredBond(1);
+        vm.prank(bob);
+        gameProxy.defend{ value: secondBond }(1, _dummyClaim());
+        vm.prank(charlie);
+        gameProxy.attack{ value: secondBond }(1, _dummyClaim());
+        gameProxy.attack{ value: secondBond }(1, _dummyClaim());
+
+        uint256 thirdBond = _getRequiredBond(3);
+        vm.prank(alice);
+        gameProxy.attack{ value: thirdBond }(3, _dummyClaim());
+
+        // Resolve all claims
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        for (uint256 i = gameProxy.claimDataLen(); i > 0; i--) {
+            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1, 0)));
+            assertTrue(success);
+        }
+        gameProxy.resolve();
+
+        // Wait for the withdrawal delay.
+        vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
+
+        gameProxy.claimCredit(address(this));
+        gameProxy.claimCredit(alice);
+        gameProxy.claimCredit(bob);
+
+        // Charlie's claim should revert since it's value is 0
+        vm.expectRevert(NoCreditToClaim.selector);
+        gameProxy.claimCredit(charlie);
+
+        // Ensure that bonds were paid out correctly.
+        uint256 aliceLosses = firstBond;
+        uint256 charlieLosses = secondBond;
+        assertEq(address(this).balance, bal + aliceLosses, "incorrect this balance");
+        assertEq(alice.balance, bal - aliceLosses + charlieLosses, "incorrect alice balance");
+        assertEq(bob.balance, bal, "incorrect bob balance");
+        assertEq(charlie.balance, bal - charlieLosses, "incorrect charlie balance");
+        assertEq(address(gameProxy).balance, 0);
+
+        // Ensure that the init bond for the game is 0, in case we change it in the test suite in the future.
+        assertEq(disputeGameFactory.initBonds(GAME_TYPE), 0);
+    }
+
+    /// @dev Static unit test asserting that the anchor state updates when the game resolves in
+    /// favor of the defender and the anchor state is older than the game state.
+    function test_resolve_validNewerStateUpdatesAnchor_succeeds() public {
+        // Confirm that the anchor state is older than the game state.
+        (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assert(l2BlockNumber < gameProxy.l2BlockNumber());
+
+        // Resolve the game.
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        gameProxy.resolveClaim(0, 0);
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
+
+        // Confirm that the anchor state is now the same as the game state.
+        (root, l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assertEq(l2BlockNumber, gameProxy.l2BlockNumber());
+        assertEq(root.raw(), gameProxy.rootClaim().raw());
+    }
+
+    /// @dev Static unit test asserting that the anchor state does not change when the game
+    /// resolves in favor of the defender but the game state is not newer than the anchor state.
+    function test_resolve_validOlderStateSameAnchor_succeeds() public {
+        // Mock the game block to be older than the game state.
+        vm.mockCall(address(gameProxy), abi.encodeWithSelector(gameProxy.l2BlockNumber.selector), abi.encode(0));
+
+        // Confirm that the anchor state is newer than the game state.
+        (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assert(l2BlockNumber >= gameProxy.l2BlockNumber());
+
+        // Resolve the game.
+        vm.mockCall(address(gameProxy), abi.encodeWithSelector(gameProxy.l2BlockNumber.selector), abi.encode(0));
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        gameProxy.resolveClaim(0, 0);
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
+
+        // Confirm that the anchor state is the same as the initial anchor state.
+        (Hash updatedRoot, uint256 updatedL2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assertEq(updatedL2BlockNumber, l2BlockNumber);
+        assertEq(updatedRoot.raw(), root.raw());
+    }
+
+    /// @dev Static unit test asserting that the anchor state does not change when the game
+    /// resolves in favor of the challenger, even if the game state is newer than the anchor.
+    function test_resolve_invalidStateSameAnchor_succeeds() public {
+        // Confirm that the anchor state is older than the game state.
+        (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assert(l2BlockNumber < gameProxy.l2BlockNumber());
+
+        // Challenge the claim and resolve it.
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+        vm.warp(block.timestamp + 3 days + 12 hours);
+        gameProxy.resolveClaim(1, 0);
+        gameProxy.resolveClaim(0, 0);
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.CHALLENGER_WINS));
+
+        // Confirm that the anchor state is the same as the initial anchor state.
+        (Hash updatedRoot, uint256 updatedL2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType());
+        assertEq(updatedL2BlockNumber, l2BlockNumber);
+        assertEq(updatedRoot.raw(), root.raw());
+    }
+
+    /// @dev Static unit test asserting that credit may not be drained past allowance through reentrancy.
+    function test_claimCredit_claimAlreadyResolved_reverts() public {
+        ClaimCreditReenter reenter = new ClaimCreditReenter(gameProxy, vm);
+        vm.startPrank(address(reenter));
+
+        // Give the game proxy 1 extra ether, unregistered.
+        vm.deal(address(gameProxy), 1 ether);
+
+        // Perform a bonded move.
+        Claim claim = _dummyClaim();
+        uint256 firstBond = _getRequiredBond(0);
+        vm.deal(address(reenter), firstBond);
+        gameProxy.attack{ value: firstBond }(0, claim);
+        uint256 secondBond = _getRequiredBond(1);
+        vm.deal(address(reenter), secondBond);
+        gameProxy.attack{ value: secondBond }(1, claim);
+        uint256 reenterBond = firstBond + secondBond;
+
+        // Warp past the finalization period
+        vm.warp(block.timestamp + 3 days + 12 hours);
+
+        // Ensure that we bonded all the test contract's ETH
+        assertEq(address(reenter).balance, 0);
+        // Ensure the game proxy has 1 ether in it.
+        assertEq(address(gameProxy).balance, 1 ether);
+        // Ensure the game has a balance of reenterBond in the delayedWeth contract.
+        assertEq(delayedWeth.balanceOf(address(gameProxy)), reenterBond);
+
+        // Resolve the claim at index 2 first so that index 1 can be resolved.
+        gameProxy.resolveClaim(2, 0);
+
+        // Resolve the claim at index 1 and claim the reenter contract's credit.
+        gameProxy.resolveClaim(1, 0);
+
+        // Ensure that the game registered the `reenter` contract's credit.
+        assertEq(gameProxy.credit(address(reenter)), reenterBond);
+
+        // Wait for the withdrawal delay.
+        vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
+
+        // Initiate the reentrant credit claim.
+        reenter.claimCredit(address(reenter));
+
+        // The reenter contract should have performed 2 calls to `claimCredit`.
+        // Once all the credit is claimed, all subsequent calls will revert since there is 0 credit left to claim.
+        // The claimant must only have received the amount bonded for the gindex 1 subgame.
+        // The root claim bond and the unregistered ETH should still exist in the game proxy.
+        assertEq(reenter.numCalls(), 2);
+        assertEq(address(reenter).balance, reenterBond);
+        assertEq(address(gameProxy).balance, 1 ether);
+        assertEq(delayedWeth.balanceOf(address(gameProxy)), 0);
+
+        vm.stopPrank();
+    }
+
+    /// @dev Tests that adding local data with an out of bounds identifier reverts.
+    function testFuzz_addLocalData_oob_reverts(uint256 _ident) public {
+        // Get a claim below the split depth so that we can add local data for an execution trace subgame.
+        for (uint256 i; i < 4; i++) {
+            uint256 bond = _getRequiredBond(i);
+            gameProxy.attack{ value: bond }(i, _dummyClaim());
+        }
+        uint256 lastBond = _getRequiredBond(4);
+        gameProxy.attack{ value: lastBond }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+
+        // [1, 5] are valid local data identifiers.
+        if (_ident <= 5) _ident = 0;
+
+        vm.expectRevert(InvalidLocalIdent.selector);
+        gameProxy.addLocalData(_ident, 5, 0);
+    }
+
+    /// @dev Tests that local data is loaded into the preimage oracle correctly in the subgame
+    ///      that is disputing the transition from `GENESIS -> GENESIS + 1`
+    function test_addLocalDataGenesisTransition_static_succeeds() public {
+        IPreimageOracle oracle = IPreimageOracle(address(gameProxy.vm().oracle()));
+
+        // Get a claim below the split depth so that we can add local data for an execution trace subgame.
+        for (uint256 i; i < 4; i++) {
+            uint256 bond = _getRequiredBond(i);
+            gameProxy.attack{ value: bond }(i, Claim.wrap(bytes32(i)));
+        }
+        uint256 lastBond = _getRequiredBond(4);
+        gameProxy.attack{ value: lastBond }(4, _changeClaimStatus(_dummyClaim(), VMStatuses.PANIC));
+
+        // Expected start/disputed claims
+        (Hash root,) = gameProxy.startingOutputRoot();
+        bytes32 startingClaim = root.raw();
+        bytes32 disputedClaim = bytes32(uint256(3));
+        Position disputedPos = LibPosition.wrap(4, 0);
+
+        // Expected local data
+        bytes32[5] memory data = [
+            gameProxy.l1Head().raw(),
+            startingClaim,
+            disputedClaim,
+            bytes32(uint256(1) << 0xC0),
+            bytes32(gameProxy.l2ChainId() << 0xC0)
+        ];
+
+        for (uint256 i = 1; i <= 5; i++) {
+            uint256 expectedLen = i > 3 ? 8 : 32;
+            bytes32 key = _getKey(i, keccak256(abi.encode(disputedClaim, disputedPos)));
+
+            gameProxy.addLocalData(i, 5, 0);
+            (bytes32 dat, uint256 datLen) = oracle.readPreimage(key, 0);
+            assertEq(dat >> 0xC0, bytes32(expectedLen));
+            // Account for the length prefix if i > 3 (the data stored
+            // at identifiers i <= 3 are 32 bytes long, so the expected
+            // length is already correct. If i > 3, the data is only 8
+            // bytes long, so the length prefix + the data is 16 bytes
+            // total.)
+            assertEq(datLen, expectedLen + (i > 3 ? 8 : 0));
+
+            gameProxy.addLocalData(i, 5, 8);
+            (dat, datLen) = oracle.readPreimage(key, 8);
+            assertEq(dat, data[i - 1]);
+            assertEq(datLen, expectedLen);
+        }
+    }
+
+    /// @dev Tests that local data is loaded into the preimage oracle correctly.
+    function test_addLocalDataMiddle_static_succeeds() public {
+        IPreimageOracle oracle = IPreimageOracle(address(gameProxy.vm().oracle()));
+
+        // Get a claim below the split depth so that we can add local data for an execution trace subgame.
+        for (uint256 i; i < 4; i++) {
+            uint256 bond = _getRequiredBond(i);
+            gameProxy.attack{ value: bond }(i, Claim.wrap(bytes32(i)));
+        }
+        uint256 lastBond = _getRequiredBond(4);
+        gameProxy.defend{ value: lastBond }(4, _changeClaimStatus(ROOT_CLAIM, VMStatuses.VALID));
+
+        // Expected start/disputed claims
+        bytes32 startingClaim = bytes32(uint256(3));
+        Position startingPos = LibPosition.wrap(4, 0);
+        bytes32 disputedClaim = bytes32(uint256(2));
+        Position disputedPos = LibPosition.wrap(3, 0);
+
+        // Expected local data
+        bytes32[5] memory data = [
+            gameProxy.l1Head().raw(),
+            startingClaim,
+            disputedClaim,
+            bytes32(uint256(2) << 0xC0),
+            bytes32(gameProxy.l2ChainId() << 0xC0)
+        ];
+
+        for (uint256 i = 1; i <= 5; i++) {
+            uint256 expectedLen = i > 3 ? 8 : 32;
+            bytes32 key = _getKey(i, keccak256(abi.encode(startingClaim, startingPos, disputedClaim, disputedPos)));
+
+            gameProxy.addLocalData(i, 5, 0);
+            (bytes32 dat, uint256 datLen) = oracle.readPreimage(key, 0);
+            assertEq(dat >> 0xC0, bytes32(expectedLen));
+            // Account for the length prefix if i > 3 (the data stored
+            // at identifiers i <= 3 are 32 bytes long, so the expected
+            // length is already correct. If i > 3, the data is only 8
+            // bytes long, so the length prefix + the data is 16 bytes
+            // total.)
+            assertEq(datLen, expectedLen + (i > 3 ? 8 : 0));
+
+            gameProxy.addLocalData(i, 5, 8);
+            (dat, datLen) = oracle.readPreimage(key, 8);
+            assertEq(dat, data[i - 1]);
+            assertEq(datLen, expectedLen);
+        }
+    }
+
+    /// @dev Static unit test asserting that resolveClaim isn't possible if there's time
+    ///      left for a counter.
+    function test_resolution_lastSecondDisputes_succeeds() public {
+        // The honest proposer created an honest root claim during setup - node 0
+
+        // Defender's turn
+        vm.warp(block.timestamp + 3.5 days - 1 seconds);
+        gameProxy.attack{ value: _getRequiredBond(0) }(0, _dummyClaim());
+        // Chess clock time accumulated:
+        assertEq(gameProxy.getChallengerDuration(0).raw(), 3.5 days - 1 seconds);
+        assertEq(gameProxy.getChallengerDuration(1).raw(), 0);
+
+        // Advance time by 1 second, so that the root claim challenger clock is expired.
+        vm.warp(block.timestamp + 1 seconds);
+        // Attempt a second attack against the root claim. This should revert since the challenger clock is expired.
+        uint256 expectedBond = _getRequiredBond(0);
+        vm.expectRevert(ClockTimeExceeded.selector);
+        gameProxy.attack{ value: expectedBond }(0, _dummyClaim());
+        // Chess clock time accumulated:
+        assertEq(gameProxy.getChallengerDuration(0).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(1).raw(), 1 seconds);
+
+        // Should not be able to resolve the root claim or second counter yet.
+        vm.expectRevert(ClockNotExpired.selector);
+        gameProxy.resolveClaim(1, 0);
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(0, 0);
+
+        // Warp to the last second of the root claim defender clock.
+        vm.warp(block.timestamp + 3.5 days - 2 seconds);
+        // Attack the challenge to the root claim. This should succeed, since the defender clock is not expired.
+        gameProxy.attack{ value: _getRequiredBond(1) }(1, _dummyClaim());
+        // Chess clock time accumulated:
+        assertEq(gameProxy.getChallengerDuration(0).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(1).raw(), 3.5 days - 1 seconds);
+        assertEq(gameProxy.getChallengerDuration(2).raw(), 3.5 days - gameProxy.clockExtension().raw());
+
+        // Should not be able to resolve any claims yet.
+        vm.expectRevert(ClockNotExpired.selector);
+        gameProxy.resolveClaim(2, 0);
+        vm.expectRevert(ClockNotExpired.selector);
+        gameProxy.resolveClaim(1, 0);
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(0, 0);
+
+        vm.warp(block.timestamp + gameProxy.clockExtension().raw() - 1 seconds);
+
+        // Should not be able to resolve any claims yet.
+        vm.expectRevert(ClockNotExpired.selector);
+        gameProxy.resolveClaim(2, 0);
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(1, 0);
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(0, 0);
+
+        // Chess clock time accumulated:
+        assertEq(gameProxy.getChallengerDuration(0).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(1).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(2).raw(), 3.5 days - 1 seconds);
+
+        // Warp past the challenge period for the root claim defender. Defending the root claim should now revert.
+        vm.warp(block.timestamp + 1 seconds);
+        expectedBond = _getRequiredBond(1);
+        vm.expectRevert(ClockTimeExceeded.selector); // no further move can be made
+        gameProxy.attack{ value: expectedBond }(1, _dummyClaim());
+        expectedBond = _getRequiredBond(2);
+        vm.expectRevert(ClockTimeExceeded.selector); // no further move can be made
+        gameProxy.attack{ value: expectedBond }(2, _dummyClaim());
+        // Chess clock time accumulated:
+        assertEq(gameProxy.getChallengerDuration(0).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(1).raw(), 3.5 days);
+        assertEq(gameProxy.getChallengerDuration(2).raw(), 3.5 days);
+
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(1, 0);
+        vm.expectRevert(OutOfOrderResolution.selector);
+        gameProxy.resolveClaim(0, 0);
+
+        // All clocks are expired. Resolve the game.
+        gameProxy.resolveClaim(2, 0); // Node 2 is resolved as UNCOUNTERED by default since it has no children
+        gameProxy.resolveClaim(1, 0); // Node 1 is resolved as COUNTERED since it has an UNCOUNTERED child
+        gameProxy.resolveClaim(0, 0); // Node 0 is resolved as UNCOUNTERED since it has no UNCOUNTERED children
+
+        // Defender wins game since the root claim is uncountered
+        assertEq(uint8(gameProxy.resolve()), uint8(GameStatus.DEFENDER_WINS));
+    }
+
+    /// @dev Helper to get the required bond for the given claim index.
+    function _getRequiredBond(uint256 _claimIndex) internal view returns (uint256 bond_) {
+        (,,,,, Position parent,) = gameProxy.claimData(_claimIndex);
+        Position pos = parent.move(true);
+        bond_ = gameProxy.getRequiredBond(pos);
+    }
+
+    /// @dev Helper to return a pseudo-random claim
+    function _dummyClaim() internal view returns (Claim) {
+        return Claim.wrap(keccak256(abi.encode(gasleft())));
+    }
+
+    /// @dev Helper to get the localized key for an identifier in the context of the game proxy.
+    function _getKey(uint256 _ident, bytes32 _localContext) internal view returns (bytes32) {
+        bytes32 h = keccak256(abi.encode(_ident | (1 << 248), address(gameProxy), _localContext));
+        return bytes32((uint256(h) & ~uint256(0xFF << 248)) | (1 << 248));
+    }
+}
+
+contract FaultDispute_1v1_Actors_Test is FaultDisputeGame_Init {
+    /// @dev The honest actor
+    DisputeActor internal honest;
+    /// @dev The dishonest actor
+    DisputeActor internal dishonest;
+
+    function setUp() public override {
+        // Setup the `FaultDisputeGame`
+        super.setUp();
+    }
+
+    /// @notice Fuzz test for a 1v1 output bisection dispute.
+    /// @dev The alphabet game has a constant status byte, and is not safe from someone being dishonest in
+    ///      output bisection and then posting a correct execution trace bisection root claim. This test
+    ///      does not cover this case (i.e. root claim of output bisection is dishonest, root claim of
+    ///      execution trace bisection is made by the dishonest actor but is honest, honest actor cannot
+    ///      attack it without risk of losing).
+    function testFuzz_outputBisection1v1honestRoot_succeeds(uint8 _divergeOutput, uint8 _divergeStep) public {
+        uint256[] memory honestL2Outputs = new uint256[](16);
+        for (uint256 i; i < honestL2Outputs.length; i++) {
+            honestL2Outputs[i] = i + 1;
+        }
+        bytes memory honestTrace = new bytes(256);
+        for (uint256 i; i < honestTrace.length; i++) {
+            honestTrace[i] = bytes1(uint8(i));
+        }
+
+        uint256 divergeAtOutput = bound(_divergeOutput, 0, 15);
+        uint256 divergeAtStep = bound(_divergeStep, 0, 7);
+        uint256 divergeStepOffset = (divergeAtOutput << 4) + divergeAtStep;
+
+        uint256[] memory dishonestL2Outputs = new uint256[](16);
+        for (uint256 i; i < dishonestL2Outputs.length; i++) {
+            dishonestL2Outputs[i] = i >= divergeAtOutput ? 0xFF : i + 1;
+        }
+        bytes memory dishonestTrace = new bytes(256);
+        for (uint256 i; i < dishonestTrace.length; i++) {
+            dishonestTrace[i] = i >= divergeStepOffset ? bytes1(uint8(0xFF)) : bytes1(uint8(i));
+        }
+
+        // Run the actor test
+        _actorTest({
+            _rootClaim: 16,
+            _absolutePrestateData: 0,
+            _honestTrace: honestTrace,
+            _honestL2Outputs: honestL2Outputs,
+            _dishonestTrace: dishonestTrace,
+            _dishonestL2Outputs: dishonestL2Outputs,
+            _expectedStatus: GameStatus.DEFENDER_WINS
+        });
+    }
+
+    /// @notice Static unit test for a 1v1 output bisection dispute.
+    function test_static_1v1honestRootGenesisAbsolutePrestate_succeeds() public {
+        // The honest l2 outputs are from [1, 16] in this game.
+        uint256[] memory honestL2Outputs = new uint256[](16);
+        for (uint256 i; i < honestL2Outputs.length; i++) {
+            honestL2Outputs[i] = i + 1;
+        }
+        // The honest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of bytes [0, 255].
+        bytes memory honestTrace = new bytes(256);
+        for (uint256 i; i < honestTrace.length; i++) {
+            honestTrace[i] = bytes1(uint8(i));
+        }
+
+        // The dishonest l2 outputs are from [2, 17] in this game.
+        uint256[] memory dishonestL2Outputs = new uint256[](16);
+        for (uint256 i; i < dishonestL2Outputs.length; i++) {
+            dishonestL2Outputs[i] = i + 2;
+        }
+        // The dishonest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of all set bits.
+        bytes memory dishonestTrace = new bytes(256);
+        for (uint256 i; i < dishonestTrace.length; i++) {
+            dishonestTrace[i] = bytes1(0xFF);
+        }
+
+        // Run the actor test
+        _actorTest({
+            _rootClaim: 16,
+            _absolutePrestateData: 0,
+            _honestTrace: honestTrace,
+            _honestL2Outputs: honestL2Outputs,
+            _dishonestTrace: dishonestTrace,
+            _dishonestL2Outputs: dishonestL2Outputs,
+            _expectedStatus: GameStatus.DEFENDER_WINS
+        });
+    }
+
+    /// @notice Static unit test for a 1v1 output bisection dispute.
+    function test_static_1v1dishonestRootGenesisAbsolutePrestate_succeeds() public {
+        // The honest l2 outputs are from [1, 16] in this game.
+        uint256[] memory honestL2Outputs = new uint256[](16);
+        for (uint256 i; i < honestL2Outputs.length; i++) {
+            honestL2Outputs[i] = i + 1;
+        }
+        // The honest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of bytes [0, 255].
+        bytes memory honestTrace = new bytes(256);
+        for (uint256 i; i < honestTrace.length; i++) {
+            honestTrace[i] = bytes1(uint8(i));
+        }
+
+        // The dishonest l2 outputs are from [2, 17] in this game.
+        uint256[] memory dishonestL2Outputs = new uint256[](16);
+        for (uint256 i; i < dishonestL2Outputs.length; i++) {
+            dishonestL2Outputs[i] = i + 2;
+        }
+        // The dishonest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of all set bits.
+        bytes memory dishonestTrace = new bytes(256);
+        for (uint256 i; i < dishonestTrace.length; i++) {
+            dishonestTrace[i] = bytes1(0xFF);
+        }
+
+        // Run the actor test
+        _actorTest({
+            _rootClaim: 17,
+            _absolutePrestateData: 0,
+            _honestTrace: honestTrace,
+            _honestL2Outputs: honestL2Outputs,
+            _dishonestTrace: dishonestTrace,
+            _dishonestL2Outputs: dishonestL2Outputs,
+            _expectedStatus: GameStatus.CHALLENGER_WINS
+        });
+    }
+
+    /// @notice Static unit test for a 1v1 output bisection dispute.
+    function test_static_1v1honestRoot_succeeds() public {
+        // The honest l2 outputs are from [1, 16] in this game.
+        uint256[] memory honestL2Outputs = new uint256[](16);
+        for (uint256 i; i < honestL2Outputs.length; i++) {
+            honestL2Outputs[i] = i + 1;
+        }
+        // The honest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of bytes [0, 255].
+        bytes memory honestTrace = new bytes(256);
+        for (uint256 i; i < honestTrace.length; i++) {
+            honestTrace[i] = bytes1(uint8(i));
+        }
+
+        // The dishonest l2 outputs are from [2, 17] in this game.
+        uint256[] memory dishonestL2Outputs = new uint256[](16);
+        for (uint256 i; i < dishonestL2Outputs.length; i++) {
+            dishonestL2Outputs[i] = i + 2;
+        }
+        // The dishonest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of all zeros.
+        bytes memory dishonestTrace = new bytes(256);
+
+        // Run the actor test
+        _actorTest({
+            _rootClaim: 16,
+            _absolutePrestateData: 0,
+            _honestTrace: honestTrace,
+            _honestL2Outputs: honestL2Outputs,
+            _dishonestTrace: dishonestTrace,
+            _dishonestL2Outputs: dishonestL2Outputs,
+            _expectedStatus: GameStatus.DEFENDER_WINS
+        });
+    }
+
+    /// @notice Static unit test for a 1v1 output bisection dispute.
+    function test_static_1v1dishonestRoot_succeeds() public {
+        // The honest l2 outputs are from [1, 16] in this game.
+        uint256[] memory honestL2Outputs = new uint256[](16);
+        for (uint256 i; i < honestL2Outputs.length; i++) {
+            honestL2Outputs[i] = i + 1;
+        }
+        // The honest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of bytes [0, 255].
+        bytes memory honestTrace = new bytes(256);
+        for (uint256 i; i < honestTrace.length; i++) {
+            honestTrace[i] = bytes1(uint8(i));
+        }
+
+        // The dishonest l2 outputs are from [2, 17] in this game.
+        uint256[] memory dishonestL2Outputs = new uint256[](16);
+        for (uint256 i; i < dishonestL2Outputs.length; i++) {
+            dishonestL2Outputs[i] = i + 2;
+        }
+        // The dishonest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of all zeros.
+        bytes memory dishonestTrace = new bytes(256);
+
+        // Run the actor test
+        _actorTest({
+            _rootClaim: 17,
+            _absolutePrestateData: 0,
+            _honestTrace: honestTrace,
+            _honestL2Outputs: honestL2Outputs,
+            _dishonestTrace: dishonestTrace,
+            _dishonestL2Outputs: dishonestL2Outputs,
+            _expectedStatus: GameStatus.CHALLENGER_WINS
+        });
+    }
+
+    /// @notice Static unit test for a 1v1 output bisection dispute.
+    function test_static_1v1correctRootHalfWay_succeeds() public {
+        // The honest l2 outputs are from [1, 16] in this game.
+        uint256[] memory honestL2Outputs = new uint256[](16);
+        for (uint256 i; i < honestL2Outputs.length; i++) {
+            honestL2Outputs[i] = i + 1;
+        }
+        // The honest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of bytes [0, 255].
+        bytes memory honestTrace = new bytes(256);
+        for (uint256 i; i < honestTrace.length; i++) {
+            honestTrace[i] = bytes1(uint8(i));
+        }
+
+        // The dishonest l2 outputs are half correct, half incorrect.
+        uint256[] memory dishonestL2Outputs = new uint256[](16);
+        for (uint256 i; i < dishonestL2Outputs.length; i++) {
+            dishonestL2Outputs[i] = i > 7 ? 0xFF : i + 1;
+        }
+        // The dishonest trace is half correct, half incorrect.
+        bytes memory dishonestTrace = new bytes(256);
+        for (uint256 i; i < dishonestTrace.length; i++) {
+            dishonestTrace[i] = i > (127 + 4) ? bytes1(0xFF) : bytes1(uint8(i));
+        }
+
+        // Run the actor test
+        _actorTest({
+            _rootClaim: 16,
+            _absolutePrestateData: 0,
+            _honestTrace: honestTrace,
+            _honestL2Outputs: honestL2Outputs,
+            _dishonestTrace: dishonestTrace,
+            _dishonestL2Outputs: dishonestL2Outputs,
+            _expectedStatus: GameStatus.DEFENDER_WINS
+        });
+    }
+
+    /// @notice Static unit test for a 1v1 output bisection dispute.
+    function test_static_1v1dishonestRootHalfWay_succeeds() public {
+        // The honest l2 outputs are from [1, 16] in this game.
+        uint256[] memory honestL2Outputs = new uint256[](16);
+        for (uint256 i; i < honestL2Outputs.length; i++) {
+            honestL2Outputs[i] = i + 1;
+        }
+        // The honest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of bytes [0, 255].
+        bytes memory honestTrace = new bytes(256);
+        for (uint256 i; i < honestTrace.length; i++) {
+            honestTrace[i] = bytes1(uint8(i));
+        }
+
+        // The dishonest l2 outputs are half correct, half incorrect.
+        uint256[] memory dishonestL2Outputs = new uint256[](16);
+        for (uint256 i; i < dishonestL2Outputs.length; i++) {
+            dishonestL2Outputs[i] = i > 7 ? 0xFF : i + 1;
+        }
+        // The dishonest trace is half correct, half incorrect.
+        bytes memory dishonestTrace = new bytes(256);
+        for (uint256 i; i < dishonestTrace.length; i++) {
+            dishonestTrace[i] = i > (127 + 4) ? bytes1(0xFF) : bytes1(uint8(i));
+        }
+
+        // Run the actor test
+        _actorTest({
+            _rootClaim: 0xFF,
+            _absolutePrestateData: 0,
+            _honestTrace: honestTrace,
+            _honestL2Outputs: honestL2Outputs,
+            _dishonestTrace: dishonestTrace,
+            _dishonestL2Outputs: dishonestL2Outputs,
+            _expectedStatus: GameStatus.CHALLENGER_WINS
+        });
+    }
+
+    /// @notice Static unit test for a 1v1 output bisection dispute.
+    function test_static_1v1correctAbsolutePrestate_succeeds() public {
+        // The honest l2 outputs are from [1, 16] in this game.
+        uint256[] memory honestL2Outputs = new uint256[](16);
+        for (uint256 i; i < honestL2Outputs.length; i++) {
+            honestL2Outputs[i] = i + 1;
+        }
+        // The honest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of bytes [0, 255].
+        bytes memory honestTrace = new bytes(256);
+        for (uint256 i; i < honestTrace.length; i++) {
+            honestTrace[i] = bytes1(uint8(i));
+        }
+
+        // The dishonest l2 outputs are half correct, half incorrect.
+        uint256[] memory dishonestL2Outputs = new uint256[](16);
+        for (uint256 i; i < dishonestL2Outputs.length; i++) {
+            dishonestL2Outputs[i] = i > 7 ? 0xFF : i + 1;
+        }
+        // The dishonest trace correct is half correct, half incorrect.
+        bytes memory dishonestTrace = new bytes(256);
+        for (uint256 i; i < dishonestTrace.length; i++) {
+            dishonestTrace[i] = i > 127 ? bytes1(0xFF) : bytes1(uint8(i));
+        }
+
+        // Run the actor test
+        _actorTest({
+            _rootClaim: 16,
+            _absolutePrestateData: 0,
+            _honestTrace: honestTrace,
+            _honestL2Outputs: honestL2Outputs,
+            _dishonestTrace: dishonestTrace,
+            _dishonestL2Outputs: dishonestL2Outputs,
+            _expectedStatus: GameStatus.DEFENDER_WINS
+        });
+    }
+
+    /// @notice Static unit test for a 1v1 output bisection dispute.
+    function test_static_1v1dishonestAbsolutePrestate_succeeds() public {
+        // The honest l2 outputs are from [1, 16] in this game.
+        uint256[] memory honestL2Outputs = new uint256[](16);
+        for (uint256 i; i < honestL2Outputs.length; i++) {
+            honestL2Outputs[i] = i + 1;
+        }
+        // The honest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of bytes [0, 255].
+        bytes memory honestTrace = new bytes(256);
+        for (uint256 i; i < honestTrace.length; i++) {
+            honestTrace[i] = bytes1(uint8(i));
+        }
+
+        // The dishonest l2 outputs are half correct, half incorrect.
+        uint256[] memory dishonestL2Outputs = new uint256[](16);
+        for (uint256 i; i < dishonestL2Outputs.length; i++) {
+            dishonestL2Outputs[i] = i > 7 ? 0xFF : i + 1;
+        }
+        // The dishonest trace correct is half correct, half incorrect.
+        bytes memory dishonestTrace = new bytes(256);
+        for (uint256 i; i < dishonestTrace.length; i++) {
+            dishonestTrace[i] = i > 127 ? bytes1(0xFF) : bytes1(uint8(i));
+        }
+
+        // Run the actor test
+        _actorTest({
+            _rootClaim: 0xFF,
+            _absolutePrestateData: 0,
+            _honestTrace: honestTrace,
+            _honestL2Outputs: honestL2Outputs,
+            _dishonestTrace: dishonestTrace,
+            _dishonestL2Outputs: dishonestL2Outputs,
+            _expectedStatus: GameStatus.CHALLENGER_WINS
+        });
+    }
+
+    /// @notice Static unit test for a 1v1 output bisection dispute.
+    function test_static_1v1honestRootFinalInstruction_succeeds() public {
+        // The honest l2 outputs are from [1, 16] in this game.
+        uint256[] memory honestL2Outputs = new uint256[](16);
+        for (uint256 i; i < honestL2Outputs.length; i++) {
+            honestL2Outputs[i] = i + 1;
+        }
+        // The honest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of bytes [0, 255].
+        bytes memory honestTrace = new bytes(256);
+        for (uint256 i; i < honestTrace.length; i++) {
+            honestTrace[i] = bytes1(uint8(i));
+        }
+
+        // The dishonest l2 outputs are half correct, half incorrect.
+        uint256[] memory dishonestL2Outputs = new uint256[](16);
+        for (uint256 i; i < dishonestL2Outputs.length; i++) {
+            dishonestL2Outputs[i] = i > 7 ? 0xFF : i + 1;
+        }
+        // The dishonest trace is half correct, and correct all the way up to the final instruction of the exec
+        // subgame.
+        bytes memory dishonestTrace = new bytes(256);
+        for (uint256 i; i < dishonestTrace.length; i++) {
+            dishonestTrace[i] = i > (127 + 7) ? bytes1(0xFF) : bytes1(uint8(i));
+        }
+
+        // Run the actor test
+        _actorTest({
+            _rootClaim: 16,
+            _absolutePrestateData: 0,
+            _honestTrace: honestTrace,
+            _honestL2Outputs: honestL2Outputs,
+            _dishonestTrace: dishonestTrace,
+            _dishonestL2Outputs: dishonestL2Outputs,
+            _expectedStatus: GameStatus.DEFENDER_WINS
+        });
+    }
+
+    /// @notice Static unit test for a 1v1 output bisection dispute.
+    function test_static_1v1dishonestRootFinalInstruction_succeeds() public {
+        // The honest l2 outputs are from [1, 16] in this game.
+        uint256[] memory honestL2Outputs = new uint256[](16);
+        for (uint256 i; i < honestL2Outputs.length; i++) {
+            honestL2Outputs[i] = i + 1;
+        }
+        // The honest trace covers all block -> block + 1 transitions, and is 256 bytes long, consisting
+        // of bytes [0, 255].
+        bytes memory honestTrace = new bytes(256);
+        for (uint256 i; i < honestTrace.length; i++) {
+            honestTrace[i] = bytes1(uint8(i));
+        }
+
+        // The dishonest l2 outputs are half correct, half incorrect.
+        uint256[] memory dishonestL2Outputs = new uint256[](16);
+        for (uint256 i; i < dishonestL2Outputs.length; i++) {
+            dishonestL2Outputs[i] = i > 7 ? 0xFF : i + 1;
+        }
+        // The dishonest trace is half correct, and correct all the way up to the final instruction of the exec
+        // subgame.
+        bytes memory dishonestTrace = new bytes(256);
+        for (uint256 i; i < dishonestTrace.length; i++) {
+            dishonestTrace[i] = i > (127 + 7) ? bytes1(0xFF) : bytes1(uint8(i));
+        }
+
+        // Run the actor test
+        _actorTest({
+            _rootClaim: 0xFF,
+            _absolutePrestateData: 0,
+            _honestTrace: honestTrace,
+            _honestL2Outputs: honestL2Outputs,
+            _dishonestTrace: dishonestTrace,
+            _dishonestL2Outputs: dishonestL2Outputs,
+            _expectedStatus: GameStatus.CHALLENGER_WINS
+        });
+    }
+
+    ////////////////////////////////////////////////////////////////
+    //                          HELPERS                           //
+    ////////////////////////////////////////////////////////////////
+
+    /// @dev Helper to run a 1v1 actor test
+    function _actorTest(
+        uint256 _rootClaim,
+        uint256 _absolutePrestateData,
+        bytes memory _honestTrace,
+        uint256[] memory _honestL2Outputs,
+        bytes memory _dishonestTrace,
+        uint256[] memory _dishonestL2Outputs,
+        GameStatus _expectedStatus
+    )
+        internal
+    {
+        // Setup the environment
+        bytes memory absolutePrestateData =
+            _setup({ _absolutePrestateData: _absolutePrestateData, _rootClaim: _rootClaim });
+
+        // Create actors
+        _createActors({
+            _honestTrace: _honestTrace,
+            _honestPreStateData: absolutePrestateData,
+            _honestL2Outputs: _honestL2Outputs,
+            _dishonestTrace: _dishonestTrace,
+            _dishonestPreStateData: absolutePrestateData,
+            _dishonestL2Outputs: _dishonestL2Outputs
+        });
+
+        // Exhaust all moves from both actors
+        _exhaustMoves();
+
+        // Resolve the game and assert that the defender won
+        _warpAndResolve();
+        assertEq(uint8(gameProxy.status()), uint8(_expectedStatus));
+    }
+
+    /// @dev Helper to setup the 1v1 test
+    function _setup(
+        uint256 _absolutePrestateData,
+        uint256 _rootClaim
+    )
+        internal
+        returns (bytes memory absolutePrestateData_)
+    {
+        absolutePrestateData_ = abi.encode(_absolutePrestateData);
+        Claim absolutePrestateExec =
+            _changeClaimStatus(Claim.wrap(keccak256(absolutePrestateData_)), VMStatuses.UNFINISHED);
+        Claim rootClaim = Claim.wrap(bytes32(uint256(_rootClaim)));
+        super.init({ rootClaim: rootClaim, absolutePrestate: absolutePrestateExec, l2BlockNumber: _rootClaim });
+    }
+
+    /// @dev Helper to create actors for the 1v1 dispute.
+    function _createActors(
+        bytes memory _honestTrace,
+        bytes memory _honestPreStateData,
+        uint256[] memory _honestL2Outputs,
+        bytes memory _dishonestTrace,
+        bytes memory _dishonestPreStateData,
+        uint256[] memory _dishonestL2Outputs
+    )
+        internal
+    {
+        honest = new HonestDisputeActor({
+            _gameProxy: gameProxy,
+            _l2Outputs: _honestL2Outputs,
+            _trace: _honestTrace,
+            _preStateData: _honestPreStateData
+        });
+        dishonest = new HonestDisputeActor({
+            _gameProxy: gameProxy,
+            _l2Outputs: _dishonestL2Outputs,
+            _trace: _dishonestTrace,
+            _preStateData: _dishonestPreStateData
+        });
+
+        vm.deal(address(honest), 100 ether);
+        vm.deal(address(dishonest), 100 ether);
+        vm.label(address(honest), "HonestActor");
+        vm.label(address(dishonest), "DishonestActor");
+    }
+
+    /// @dev Helper to exhaust all moves from both actors.
+    function _exhaustMoves() internal {
+        while (true) {
+            // Allow the dishonest actor to make their moves, and then the honest actor.
+            (uint256 numMovesA,) = dishonest.move();
+            (uint256 numMovesB, bool success) = honest.move();
+
+            require(success, "Honest actor's moves should always be successful");
+
+            // If both actors have run out of moves, we're done.
+            if (numMovesA == 0 && numMovesB == 0) break;
+        }
+    }
+
+    /// @dev Helper to warp past the chess clock and resolve all claims within the dispute game.
+    function _warpAndResolve() internal {
+        // Warp past the chess clock
+        vm.warp(block.timestamp + 3 days + 12 hours);
+
+        // Resolve all claims in reverse order. We allow `resolveClaim` calls to fail due to
+        // the check that prevents claims with no subgames attached from being passed to
+        // `resolveClaim`. There's also a check in `resolve` to ensure all children have been
+        // resolved before global resolution, which catches any unresolved subgames here.
+        for (uint256 i = gameProxy.claimDataLen(); i > 0; i--) {
+            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1, 0)));
+            assertTrue(success);
+        }
+        gameProxy.resolve();
+    }
+}
+
+contract ClaimCreditReenter {
+    Vm internal immutable vm;
+    FaultDisputeGame internal immutable GAME;
+    uint256 public numCalls;
+
+    constructor(FaultDisputeGame _gameProxy, Vm _vm) {
+        GAME = _gameProxy;
+        vm = _vm;
+    }
+
+    function claimCredit(address _recipient) public {
+        numCalls += 1;
+        if (numCalls > 1) {
+            vm.expectRevert(NoCreditToClaim.selector);
+        }
+        GAME.claimCredit(_recipient);
+    }
+
+    receive() external payable {
+        if (numCalls == 5) {
+            return;
+        }
+        claimCredit(address(this));
+    }
+}
+
+/// @dev Helper to change the VM status byte of a claim.
+function _changeClaimStatus(Claim _claim, VMStatus _status) pure returns (Claim out_) {
+    assembly {
+        out_ := or(and(not(shl(248, 0xFF)), _claim), shl(248, _status))
+    }
+}
diff --git a/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol b/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol
index d0a162d397e5..5d3fc6f70f79 100644
--- a/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol
+++ b/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol
@@ -11,8 +11,8 @@ import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
 import { PreimageOracle } from "src/cannon/PreimageOracle.sol";
 import { PreimageKeyLib } from "src/cannon/PreimageKeyLib.sol";
 
-import "src/libraries/DisputeTypes.sol";
-import "src/libraries/DisputeErrors.sol";
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
 import { Types } from "src/libraries/Types.sol";
 import { LibClock } from "src/dispute/lib/LibUDT.sol";
 import { LibPosition } from "src/dispute/lib/LibPosition.sol";
@@ -39,15 +39,7 @@ contract PermissionedDisputeGame_Init is DisputeGameFactory_Init {
 
     event Move(uint256 indexed parentIndex, Claim indexed pivot, address indexed claimant);
 
-    function init(
-        Claim rootClaim,
-        Claim absolutePrestate,
-        uint256 l2BlockNumber,
-        uint256 genesisBlockNumber,
-        Hash genesisOutputRoot
-    )
-        public
-    {
+    function init(Claim rootClaim, Claim absolutePrestate, uint256 l2BlockNumber) public {
         // Set the time to a realistic date.
         vm.warp(1690906994);
 
@@ -63,13 +55,13 @@ contract PermissionedDisputeGame_Init is DisputeGameFactory_Init {
         gameImpl = new PermissionedDisputeGame({
             _gameType: GAME_TYPE,
             _absolutePrestate: absolutePrestate,
-            _genesisBlockNumber: genesisBlockNumber,
-            _genesisOutputRoot: genesisOutputRoot,
             _maxGameDepth: 2 ** 3,
             _splitDepth: 2 ** 2,
-            _gameDuration: Duration.wrap(7 days),
+            _clockExtension: Duration.wrap(3 hours),
+            _maxClockDuration: Duration.wrap(3.5 days),
             _vm: _vm,
             _weth: _weth,
+            _anchorStateRegistry: anchorStateRegistry,
             _l2ChainId: 10,
             _proposer: PROPOSER,
             _challenger: CHALLENGER
@@ -82,13 +74,13 @@ contract PermissionedDisputeGame_Init is DisputeGameFactory_Init {
             PermissionedDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, rootClaim, extraData))));
 
         // Check immutables
+        assertEq(gameProxy.proposer(), PROPOSER);
+        assertEq(gameProxy.challenger(), CHALLENGER);
         assertEq(gameProxy.gameType().raw(), GAME_TYPE.raw());
         assertEq(gameProxy.absolutePrestate().raw(), absolutePrestate.raw());
-        assertEq(gameProxy.genesisBlockNumber(), genesisBlockNumber);
-        assertEq(gameProxy.genesisOutputRoot().raw(), genesisOutputRoot.raw());
         assertEq(gameProxy.maxGameDepth(), 2 ** 3);
         assertEq(gameProxy.splitDepth(), 2 ** 2);
-        assertEq(gameProxy.gameDuration().raw(), 7 days);
+        assertEq(gameProxy.maxClockDuration().raw(), 3.5 days);
         assertEq(address(gameProxy.vm()), address(_vm));
 
         // Label the proxy
@@ -116,13 +108,7 @@ contract PermissionedDisputeGame_Test is PermissionedDisputeGame_Init {
         absolutePrestate = _changeClaimStatus(Claim.wrap(keccak256(absolutePrestateData)), VMStatuses.UNFINISHED);
 
         super.setUp();
-        super.init({
-            rootClaim: ROOT_CLAIM,
-            absolutePrestate: absolutePrestate,
-            l2BlockNumber: 0x10,
-            genesisBlockNumber: 0,
-            genesisOutputRoot: Hash.wrap(bytes32(0))
-        });
+        super.init({ rootClaim: ROOT_CLAIM, absolutePrestate: absolutePrestate, l2BlockNumber: 0x10 });
     }
 
     /// @dev Tests that the proposer can create a permissioned dispute game.
@@ -143,20 +129,36 @@ contract PermissionedDisputeGame_Test is PermissionedDisputeGame_Init {
     /// @dev Tests that the challenger can participate in a permissioned dispute game.
     function test_participateInGame_challenger_succeeds() public {
         vm.startPrank(CHALLENGER, CHALLENGER);
-        vm.deal(CHALLENGER, MIN_BOND * 3);
-        gameProxy.attack{ value: MIN_BOND }(0, Claim.wrap(0));
-        gameProxy.defend{ value: MIN_BOND }(1, Claim.wrap(0));
-        gameProxy.move{ value: MIN_BOND }(2, Claim.wrap(0), true);
+        uint256 firstBond = _getRequiredBond(0);
+        vm.deal(CHALLENGER, firstBond);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: firstBond }(disputed, 0, Claim.wrap(0));
+        uint256 secondBond = _getRequiredBond(1);
+        vm.deal(CHALLENGER, secondBond);
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.defend{ value: secondBond }(disputed, 1, Claim.wrap(0));
+        uint256 thirdBond = _getRequiredBond(2);
+        vm.deal(CHALLENGER, thirdBond);
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        gameProxy.move{ value: thirdBond }(disputed, 2, Claim.wrap(0), true);
         vm.stopPrank();
     }
 
     /// @dev Tests that the proposer can participate in a permissioned dispute game.
     function test_participateInGame_proposer_succeeds() public {
         vm.startPrank(PROPOSER, PROPOSER);
-        vm.deal(PROPOSER, MIN_BOND * 3);
-        gameProxy.attack{ value: MIN_BOND }(0, Claim.wrap(0));
-        gameProxy.defend{ value: MIN_BOND }(1, Claim.wrap(0));
-        gameProxy.move{ value: MIN_BOND }(2, Claim.wrap(0), true);
+        uint256 firstBond = _getRequiredBond(0);
+        vm.deal(PROPOSER, firstBond);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        gameProxy.attack{ value: firstBond }(disputed, 0, Claim.wrap(0));
+        uint256 secondBond = _getRequiredBond(1);
+        vm.deal(PROPOSER, secondBond);
+        (,,,, disputed,,) = gameProxy.claimData(1);
+        gameProxy.defend{ value: secondBond }(disputed, 1, Claim.wrap(0));
+        uint256 thirdBond = _getRequiredBond(2);
+        vm.deal(PROPOSER, thirdBond);
+        (,,,, disputed,,) = gameProxy.claimData(2);
+        gameProxy.move{ value: thirdBond }(disputed, 2, Claim.wrap(0), true);
         vm.stopPrank();
     }
 
@@ -166,14 +168,24 @@ contract PermissionedDisputeGame_Test is PermissionedDisputeGame_Init {
         vm.assume(_p != PROPOSER && _p != CHALLENGER);
 
         vm.startPrank(_p, _p);
+        (,,,, Claim disputed,,) = gameProxy.claimData(0);
+        vm.expectRevert(BadAuth.selector);
+        gameProxy.attack(disputed, 0, Claim.wrap(0));
         vm.expectRevert(BadAuth.selector);
-        gameProxy.attack(0, Claim.wrap(0));
+        gameProxy.defend(disputed, 0, Claim.wrap(0));
         vm.expectRevert(BadAuth.selector);
-        gameProxy.defend(1, Claim.wrap(0));
+        gameProxy.move(disputed, 0, Claim.wrap(0), true);
         vm.expectRevert(BadAuth.selector);
-        gameProxy.move(2, Claim.wrap(0), true);
+        gameProxy.step(0, true, absolutePrestateData, hex"");
         vm.stopPrank();
     }
+
+    /// @dev Helper to get the required bond for the given claim index.
+    function _getRequiredBond(uint256 _claimIndex) internal view returns (uint256 bond_) {
+        (,,,,, Position parent,) = gameProxy.claimData(_claimIndex);
+        Position pos = parent.move(true);
+        bond_ = gameProxy.getRequiredBond(pos);
+    }
 }
 
 /// @dev Helper to change the VM status byte of a claim.
diff --git a/packages/contracts-bedrock/test/dispute/WETH98.t.sol b/packages/contracts-bedrock/test/dispute/WETH98.t.sol
new file mode 100644
index 000000000000..6573a9d005c5
--- /dev/null
+++ b/packages/contracts-bedrock/test/dispute/WETH98.t.sol
@@ -0,0 +1,142 @@
+pragma solidity 0.8.15;
+
+import { Test } from "forge-std/Test.sol";
+import { WETH98 } from "src/dispute/weth/WETH98.sol";
+
+contract WETH98_Test is Test {
+    event Approval(address indexed src, address indexed guy, uint256 wad);
+    event Transfer(address indexed src, address indexed dst, uint256 wad);
+    event Deposit(address indexed dst, uint256 wad);
+    event Withdrawal(address indexed src, uint256 wad);
+
+    WETH98 public weth;
+    address alice;
+    address bob;
+
+    function setUp() public {
+        weth = new WETH98();
+        alice = makeAddr("alice");
+        bob = makeAddr("bob");
+        deal(alice, 1 ether);
+    }
+
+    function test_getName_succeeds() public view {
+        assertEq(weth.name(), "Wrapped Ether");
+        assertEq(weth.symbol(), "WETH");
+        assertEq(weth.decimals(), 18);
+    }
+
+    function test_receive_succeeds() public {
+        vm.expectEmit(address(weth));
+        emit Deposit(alice, 1 ether);
+        vm.prank(alice);
+        (bool success,) = address(weth).call{ value: 1 ether }("");
+        assertTrue(success);
+        assertEq(weth.balanceOf(alice), 1 ether);
+    }
+
+    function test_fallback_succeeds() public {
+        vm.expectEmit(address(weth));
+        emit Deposit(alice, 1 ether);
+        vm.prank(alice);
+        (bool success,) = address(weth).call{ value: 1 ether }(hex"1234");
+        assertTrue(success);
+        assertEq(weth.balanceOf(alice), 1 ether);
+    }
+
+    function test_deposit_succeeds() public {
+        vm.expectEmit(address(weth));
+        emit Deposit(alice, 1 ether);
+        vm.prank(alice);
+        weth.deposit{ value: 1 ether }();
+        assertEq(weth.balanceOf(alice), 1 ether);
+    }
+
+    function test_withdraw_succeeds() public {
+        vm.prank(alice);
+        weth.deposit{ value: 1 ether }();
+        vm.expectEmit(address(weth));
+        emit Withdrawal(alice, 1 ether);
+        vm.prank(alice);
+        weth.withdraw(1 ether);
+        assertEq(weth.balanceOf(alice), 0);
+    }
+
+    function test_withdraw_partialWithdrawal_succeeds() public {
+        vm.prank(alice);
+        weth.deposit{ value: 1 ether }();
+        vm.expectEmit(address(weth));
+        emit Withdrawal(alice, 1 ether / 2);
+        vm.prank(alice);
+        weth.withdraw(1 ether / 2);
+        assertEq(weth.balanceOf(alice), 1 ether / 2);
+    }
+
+    function test_withdraw_tooLargeWithdrawal_fails() public {
+        vm.prank(alice);
+        weth.deposit{ value: 1 ether }();
+        vm.expectRevert();
+        vm.prank(alice);
+        weth.withdraw(1 ether + 1);
+    }
+
+    function test_transfer_succeeds() public {
+        vm.prank(alice);
+        weth.deposit{ value: 1 ether }();
+        vm.expectEmit(address(weth));
+        emit Transfer(alice, bob, 1 ether);
+        vm.prank(alice);
+        weth.transfer(bob, 1 ether);
+        assertEq(weth.balanceOf(alice), 0);
+        assertEq(weth.balanceOf(bob), 1 ether);
+    }
+
+    function test_transfer_tooLarge_fails() public {
+        vm.prank(alice);
+        weth.deposit{ value: 1 ether }();
+        vm.expectRevert();
+        vm.prank(alice);
+        weth.transfer(bob, 1 ether + 1);
+    }
+
+    function test_approve_succeeds() public {
+        vm.prank(alice);
+        vm.expectEmit(address(weth));
+        emit Approval(alice, bob, 1 ether);
+        weth.approve(bob, 1 ether);
+        assertEq(weth.allowance(alice, bob), 1 ether);
+    }
+
+    function test_transferFrom_succeeds() public {
+        vm.prank(alice);
+        weth.deposit{ value: 1 ether }();
+        vm.prank(alice);
+        weth.approve(bob, 1 ether);
+        vm.expectEmit(address(weth));
+        emit Transfer(alice, bob, 1 ether);
+        vm.prank(bob);
+        weth.transferFrom(alice, bob, 1 ether);
+        assertEq(weth.balanceOf(alice), 0);
+        assertEq(weth.balanceOf(bob), 1 ether);
+    }
+
+    function test_transferFrom_tooLittleApproval_fails() public {
+        vm.prank(alice);
+        weth.deposit{ value: 1 ether }();
+        vm.prank(alice);
+        weth.approve(bob, 1 ether);
+        vm.expectRevert();
+        vm.prank(bob);
+        weth.transferFrom(alice, bob, 1 ether + 1);
+    }
+
+    function test_transferFrom_tooLittleBalance_fails() public {
+        vm.prank(alice);
+        weth.deposit{ value: 1 ether }();
+        vm.prank(alice);
+        weth.approve(bob, 2 ether);
+        vm.expectRevert();
+        vm.prank(bob);
+        weth.transferFrom(alice, bob, 1 ether + 1);
+    }
+}
diff --git a/packages/contracts-bedrock/test/dispute/lib/LibClock.t.sol b/packages/contracts-bedrock/test/dispute/lib/LibClock.t.sol
index 6d39c7df2125..3e4579b00627 100644
--- a/packages/contracts-bedrock/test/dispute/lib/LibClock.t.sol
+++ b/packages/contracts-bedrock/test/dispute/lib/LibClock.t.sol
@@ -3,18 +3,18 @@ pragma solidity ^0.8.15;
 
 import { Test } from "forge-std/Test.sol";
 import { LibClock } from "src/dispute/lib/LibUDT.sol";
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
 
 /// @notice Tests for `LibClock`
 contract LibClock_Test is Test {
     /// @notice Tests that the `duration` function correctly shifts out the `Duration` from a packed `Clock` type.
-    function testFuzz_duration_succeeds(Duration _duration, Timestamp _timestamp) public {
+    function testFuzz_duration_succeeds(Duration _duration, Timestamp _timestamp) public pure {
         Clock clock = LibClock.wrap(_duration, _timestamp);
         assertEq(Duration.unwrap(clock.duration()), Duration.unwrap(_duration));
     }
 
     /// @notice Tests that the `timestamp` function correctly shifts out the `Timestamp` from a packed `Clock` type.
-    function testFuzz_timestamp_succeeds(Duration _duration, Timestamp _timestamp) public {
+    function testFuzz_timestamp_succeeds(Duration _duration, Timestamp _timestamp) public pure {
         Clock clock = LibClock.wrap(_duration, _timestamp);
         assertEq(Timestamp.unwrap(clock.timestamp()), Timestamp.unwrap(_timestamp));
     }
diff --git a/packages/contracts-bedrock/test/dispute/lib/LibGameId.t.sol b/packages/contracts-bedrock/test/dispute/lib/LibGameId.t.sol
index 996b135af6c5..70ca0dab6a8a 100644
--- a/packages/contracts-bedrock/test/dispute/lib/LibGameId.t.sol
+++ b/packages/contracts-bedrock/test/dispute/lib/LibGameId.t.sol
@@ -3,24 +3,24 @@ pragma solidity ^0.8.15;
 
 import { Test } from "forge-std/Test.sol";
 
-import { LibGameId } from "src/dispute/lib/LibGameId.sol";
 import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
 
 contract LibGameId_Test is Test {
     /// @dev Tests that a round trip of packing and unpacking a GameId maintains the same values.
     function testFuzz_gameId_roundTrip_succeeds(
         GameType _gameType,
         Timestamp _timestamp,
-        IDisputeGame _gameProxy
+        address _gameProxy
     )
         public
+        pure
     {
         GameId gameId = LibGameId.pack(_gameType, _timestamp, _gameProxy);
-        (GameType gameType_, Timestamp timestamp_, IDisputeGame gameProxy_) = LibGameId.unpack(gameId);
+        (GameType gameType_, Timestamp timestamp_, address gameProxy_) = LibGameId.unpack(gameId);
 
         assertEq(GameType.unwrap(gameType_), GameType.unwrap(_gameType));
         assertEq(Timestamp.unwrap(timestamp_), Timestamp.unwrap(_timestamp));
-        assertEq(address(gameProxy_), address(_gameProxy));
+        assertEq(gameProxy_, _gameProxy);
     }
 }
diff --git a/packages/contracts-bedrock/test/dispute/lib/LibPosition.t.sol b/packages/contracts-bedrock/test/dispute/lib/LibPosition.t.sol
index 0dda3330672f..26d79c1a82d8 100644
--- a/packages/contracts-bedrock/test/dispute/lib/LibPosition.t.sol
+++ b/packages/contracts-bedrock/test/dispute/lib/LibPosition.t.sol
@@ -3,28 +3,28 @@ pragma solidity ^0.8.15;
 
 import { Test } from "forge-std/Test.sol";
 import { LibPosition } from "src/dispute/lib/LibPosition.sol";
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
 
 /// @notice Tests for `LibPosition`
 contract LibPosition_Test is Test {
-    /// @dev Assumes a MAX depth of 63 for the Position type. Any greater depth can cause overflows.
-    /// @dev At the lowest level of the tree, this allows for 2 ** 63 leaves. In reality, the max game depth
+    /// @dev Assumes a MAX depth of 126 for the Position type. Any greater depth can cause overflows.
+    /// @dev At the lowest level of the tree, this allows for 2 ** 126 leaves. In reality, the max game depth
     ///      will likely be much lower.
-    uint8 internal constant MAX_DEPTH = 63;
+    uint8 internal constant MAX_DEPTH = 126;
     /// @dev Arbitrary split depth around half way down the tree.
-    uint8 internal constant SPLIT_DEPTH = 30;
+    uint8 internal constant SPLIT_DEPTH = 64;
 
-    function boundIndexAtDepth(uint8 _depth, uint64 _indexAtDepth) internal pure returns (uint64) {
+    function boundIndexAtDepth(uint8 _depth, uint128 _indexAtDepth) internal pure returns (uint128) {
         // Index at depth bound: [0, 2 ** _depth-1]
         if (_depth > 0) {
-            return uint64(bound(_indexAtDepth, 0, 2 ** (_depth - 1)));
+            return uint128(bound(_indexAtDepth, 0, 2 ** (_depth - 1)));
         } else {
             return 0;
         }
     }
 
     /// @notice Tests that the `depth` function correctly shifts out the `depth` from a packed `Position` type.
-    function testFuzz_depth_correctness_succeeds(uint8 _depth, uint64 _indexAtDepth) public {
+    function testFuzz_depth_correctness_succeeds(uint8 _depth, uint128 _indexAtDepth) public pure {
         _depth = uint8(bound(_depth, 0, MAX_DEPTH));
         _indexAtDepth = boundIndexAtDepth(_depth, _indexAtDepth);
         Position position = LibPosition.wrap(_depth, _indexAtDepth);
@@ -33,7 +33,7 @@ contract LibPosition_Test is Test {
 
     /// @notice Tests that the `indexAtDepth` function correctly shifts out the `indexAtDepth` from a packed `Position`
     /// type.
-    function testFuzz_indexAtDepth_correctness_succeeds(uint8 _depth, uint64 _indexAtDepth) public {
+    function testFuzz_indexAtDepth_correctness_succeeds(uint8 _depth, uint128 _indexAtDepth) public pure {
         _depth = uint8(bound(_depth, 0, MAX_DEPTH));
         _indexAtDepth = boundIndexAtDepth(_depth, _indexAtDepth);
         Position position = LibPosition.wrap(_depth, _indexAtDepth);
@@ -41,19 +41,19 @@ contract LibPosition_Test is Test {
     }
 
     /// @notice Tests that the `left` function correctly computes the position of the left child.
-    function testFuzz_left_correctness_succeeds(uint8 _depth, uint64 _indexAtDepth) public {
+    function testFuzz_left_correctness_succeeds(uint8 _depth, uint128 _indexAtDepth) public pure {
         _depth = uint8(bound(_depth, 0, MAX_DEPTH));
         _indexAtDepth = boundIndexAtDepth(_depth, _indexAtDepth);
 
         Position position = LibPosition.wrap(_depth, _indexAtDepth);
         Position left = position.left();
 
-        assertEq(left.depth(), uint64(_depth) + 1);
+        assertEq(left.depth(), _depth + 1);
         assertEq(left.indexAtDepth(), _indexAtDepth * 2);
     }
 
     /// @notice Tests that the `right` function correctly computes the position of the right child.
-    function testFuzz_right_correctness_succeeds(uint8 _depth, uint64 _indexAtDepth) public {
+    function testFuzz_right_correctness_succeeds(uint8 _depth, uint128 _indexAtDepth) public pure {
         // Depth bound: [0, 63]
         _depth = uint8(bound(_depth, 0, MAX_DEPTH));
         _indexAtDepth = boundIndexAtDepth(_depth, _indexAtDepth);
@@ -66,7 +66,7 @@ contract LibPosition_Test is Test {
     }
 
     /// @notice Tests that the `parent` function correctly computes the position of the parent.
-    function testFuzz_parent_correctness_succeeds(uint8 _depth, uint64 _indexAtDepth) public {
+    function testFuzz_parent_correctness_succeeds(uint8 _depth, uint128 _indexAtDepth) public pure {
         _depth = uint8(bound(_depth, 1, MAX_DEPTH));
         _indexAtDepth = boundIndexAtDepth(_depth, _indexAtDepth);
 
@@ -79,7 +79,7 @@ contract LibPosition_Test is Test {
 
     /// @notice Tests that the `traceAncestor` function correctly computes the position of the
     ///         highest ancestor that commits to the same trace index.
-    function testFuzz_traceAncestor_correctness_succeeds(uint8 _depth, uint64 _indexAtDepth) public {
+    function testFuzz_traceAncestor_correctness_succeeds(uint8 _depth, uint128 _indexAtDepth) public pure {
         _depth = uint8(bound(_depth, 1, MAX_DEPTH));
         _indexAtDepth = boundIndexAtDepth(_depth, _indexAtDepth);
 
@@ -95,7 +95,7 @@ contract LibPosition_Test is Test {
 
     /// @notice Tests that the `traceAncestorBounded` function correctly computes the position of the
     ///         highest ancestor (below `SPLIT_DEPTH`) that commits to the same trace index.
-    function testFuzz_traceAncestorBounded_correctness_succeeds(uint8 _depth, uint64 _indexAtDepth) public {
+    function testFuzz_traceAncestorBounded_correctness_succeeds(uint8 _depth, uint128 _indexAtDepth) public pure {
         _depth = uint8(bound(_depth, SPLIT_DEPTH + 1, MAX_DEPTH));
         _indexAtDepth = boundIndexAtDepth(_depth, _indexAtDepth);
 
@@ -116,7 +116,14 @@ contract LibPosition_Test is Test {
 
     /// @notice Tests that the `rightIndex` function correctly computes the deepest, right most index relative
     ///         to a given position.
-    function testFuzz_rightIndex_correctness_succeeds(uint64 _maxDepth, uint8 _depth, uint64 _indexAtDepth) public {
+    function testFuzz_rightIndex_correctness_succeeds(
+        uint8 _maxDepth,
+        uint8 _depth,
+        uint128 _indexAtDepth
+    )
+        public
+        pure
+    {
         // Max depth bound: [1, 63]
         // The max game depth MUST be at least 1.
         _maxDepth = uint8(bound(_maxDepth, 1, MAX_DEPTH));
@@ -138,7 +145,7 @@ contract LibPosition_Test is Test {
     /// @notice Tests that the `attack` function correctly computes the position of the attack relative to
     ///         a given position.
     /// @dev `attack` is an alias for `left`, but we test it separately for completeness.
-    function testFuzz_attack_correctness_succeeds(uint8 _depth, uint64 _indexAtDepth) public {
+    function testFuzz_attack_correctness_succeeds(uint8 _depth, uint128 _indexAtDepth) public pure {
         // Depth bound: [0, 63]
         _depth = uint8(bound(_depth, 0, MAX_DEPTH));
         _indexAtDepth = boundIndexAtDepth(_depth, _indexAtDepth);
@@ -154,7 +161,7 @@ contract LibPosition_Test is Test {
     ///         a given position.
     /// @dev A defense can only be given if the position does not belong to the root claim, hence the bound of [1, 127]
     ///      on the depth.
-    function testFuzz_defend_correctness_succeeds(uint8 _depth, uint64 _indexAtDepth) public {
+    function testFuzz_defend_correctness_succeeds(uint8 _depth, uint128 _indexAtDepth) public pure {
         // Depth bound: [1, 63]
         _depth = uint8(bound(_depth, 1, MAX_DEPTH));
         _indexAtDepth = boundIndexAtDepth(_depth, _indexAtDepth);
@@ -168,7 +175,7 @@ contract LibPosition_Test is Test {
 
     /// @notice A static unit test for the correctness of all gindicies, (depth, index) combos,
     ///         and the trace index in a tree of max depth = 4.
-    function test_pos_correctness_succeeds() public {
+    function test_pos_correctness_succeeds() public pure {
         uint256 maxDepth = 4;
 
         Position p = LibPosition.wrap(0, 0);
diff --git a/packages/contracts-bedrock/test/governance/GovernanceToken.t.sol b/packages/contracts-bedrock/test/governance/GovernanceToken.t.sol
index 93f0585b3ee0..4bd13a231d49 100644
--- a/packages/contracts-bedrock/test/governance/GovernanceToken.t.sol
+++ b/packages/contracts-bedrock/test/governance/GovernanceToken.t.sol
@@ -16,7 +16,7 @@ contract GovernanceToken_Test is CommonTest {
     }
 
     /// @dev Tests that the constructor sets the correct initial state.
-    function test_constructor_succeeds() external {
+    function test_constructor_succeeds() external view {
         assertEq(governanceToken.owner(), owner);
         assertEq(governanceToken.name(), "Optimism");
         assertEq(governanceToken.symbol(), "OP");
diff --git a/packages/contracts-bedrock/test/governance/MintManager.t.sol b/packages/contracts-bedrock/test/governance/MintManager.t.sol
index 00cc791b98c2..690fa15c0d25 100644
--- a/packages/contracts-bedrock/test/governance/MintManager.t.sol
+++ b/packages/contracts-bedrock/test/governance/MintManager.t.sol
@@ -33,7 +33,7 @@ contract MintManager_Initializer is CommonTest {
 
 contract MintManager_constructor_Test is MintManager_Initializer {
     /// @dev Tests that the constructor properly configures the contract.
-    function test_constructor_succeeds() external {
+    function test_constructor_succeeds() external view {
         assertEq(manager.owner(), owner);
         assertEq(address(manager.governanceToken()), address(gov));
     }
diff --git a/packages/contracts-bedrock/test/invariants/AddressAliasHelper.t.sol b/packages/contracts-bedrock/test/invariants/AddressAliasHelper.t.sol
index d61be07f7c32..7cbd5a7e8d22 100644
--- a/packages/contracts-bedrock/test/invariants/AddressAliasHelper.t.sol
+++ b/packages/contracts-bedrock/test/invariants/AddressAliasHelper.t.sol
@@ -45,7 +45,7 @@ contract AddressAliasHelper_AddressAliasing_Invariant is StdInvariant, Invariant
     ///                   Asserts that an address that has been aliased with
     ///                   `applyL1ToL2Alias` can always be unaliased with
     ///                   `undoL1ToL2Alias`.
-    function invariant_round_trip_aliasing() external {
+    function invariant_round_trip_aliasing() external view {
         // ASSERTION: The round trip aliasing done in testRoundTrip(...) should never fail.
         assertEq(actor.failedRoundtrip(), false);
     }
diff --git a/packages/contracts-bedrock/test/invariants/Burn.Eth.t.sol b/packages/contracts-bedrock/test/invariants/Burn.Eth.t.sol
index 2948cf8dcfc5..c57b50fd6f09 100644
--- a/packages/contracts-bedrock/test/invariants/Burn.Eth.t.sol
+++ b/packages/contracts-bedrock/test/invariants/Burn.Eth.t.sol
@@ -63,7 +63,7 @@ contract Burn_BurnEth_Invariant is StdInvariant, InvariantTest {
     ///
     ///                   Asserts that when `Burn.eth(uint256)` is called, it always
     ///                   burns the exact amount of ETH passed to the function.
-    function invariant_burn_eth() external {
+    function invariant_burn_eth() external view {
         // ASSERTION: The amount burned should always match the amount passed exactly
         assertEq(actor.failedEthBurn(), false);
     }
diff --git a/packages/contracts-bedrock/test/invariants/Burn.Gas.t.sol b/packages/contracts-bedrock/test/invariants/Burn.Gas.t.sol
index 6ba4fa6fe345..ec04c9d73bd7 100644
--- a/packages/contracts-bedrock/test/invariants/Burn.Gas.t.sol
+++ b/packages/contracts-bedrock/test/invariants/Burn.Gas.t.sol
@@ -63,7 +63,7 @@ contract Burn_BurnGas_Invariant is StdInvariant, InvariantTest {
     ///
     ///                   Asserts that when `Burn.gas(uint256)` is called, it always burns
     ///                   at least the amount of gas passed to the function.
-    function invariant_burn_gas() external {
+    function invariant_burn_gas() external view {
         // ASSERTION: The amount burned should always match the amount passed exactly
         assertEq(actor.failedGasBurn(), false);
     }
diff --git a/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol
index 5d5c19cea756..b0b64253493b 100644
--- a/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol
+++ b/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol
@@ -140,7 +140,7 @@ contract XDM_MinGasLimits_Succeeds is XDM_MinGasLimits {
     ///
     ///                   - The inner min gas limit is for the call from the
     ///                     `L1CrossDomainMessenger` to the target contract.
-    function invariant_minGasLimits() external {
+    function invariant_minGasLimits() external view {
         uint256 length = actor.numHashes();
         for (uint256 i = 0; i < length; ++i) {
             bytes32 hash = actor.hashes(i);
@@ -173,7 +173,7 @@ contract XDM_MinGasLimits_Reverts is XDM_MinGasLimits {
     ///
     ///                   - The inner min gas limit is for the call from the
     ///                     `L1CrossDomainMessenger` to the target contract.
-    function invariant_minGasLimits() external {
+    function invariant_minGasLimits() external view {
         uint256 length = actor.numHashes();
         for (uint256 i = 0; i < length; ++i) {
             bytes32 hash = actor.hashes(i);
diff --git a/packages/contracts-bedrock/test/invariants/Encoding.t.sol b/packages/contracts-bedrock/test/invariants/Encoding.t.sol
index 94289876975f..15e5e06b08e7 100644
--- a/packages/contracts-bedrock/test/invariants/Encoding.t.sol
+++ b/packages/contracts-bedrock/test/invariants/Encoding.t.sol
@@ -70,7 +70,7 @@ contract Encoding_Invariant is StdInvariant, InvariantTest {
     ///
     ///                   Asserts that a raw versioned nonce can be encoded / decoded
     ///                   to reach the same raw value.
-    function invariant_round_trip_encoding_AToB() external {
+    function invariant_round_trip_encoding_AToB() external view {
         // ASSERTION: The round trip encoding done in testRoundTripAToB(...)
         assertEq(actor.failedRoundtripAToB(), false);
     }
@@ -79,7 +79,7 @@ contract Encoding_Invariant is StdInvariant, InvariantTest {
     ///
     ///                   Asserts that an encoded versioned nonce can always be decoded /
     ///                   re-encoded to reach the same encoded value.
-    function invariant_round_trip_encoding_BToA() external {
+    function invariant_round_trip_encoding_BToA() external view {
         // ASSERTION: The round trip encoding done in testRoundTripBToA should never
         // fail.
         assertEq(actor.failedRoundtripBToA(), false);
diff --git a/packages/contracts-bedrock/test/invariants/FaultDisputeGame.t.sol b/packages/contracts-bedrock/test/invariants/FaultDisputeGame.t.sol
index 97a26f6f92cb..295b9f315abf 100644
--- a/packages/contracts-bedrock/test/invariants/FaultDisputeGame.t.sol
+++ b/packages/contracts-bedrock/test/invariants/FaultDisputeGame.t.sol
@@ -6,8 +6,8 @@ import { StdUtils } from "forge-std/StdUtils.sol";
 import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol";
 import { FaultDisputeGame_Init } from "test/dispute/FaultDisputeGame.t.sol";
 
-import "src/libraries/DisputeTypes.sol";
-import "src/libraries/DisputeErrors.sol";
+import "src/dispute/lib/Types.sol";
+import "src/dispute/lib/Errors.sol";
 
 contract FaultDisputeGame_Solvency_Invariant is FaultDisputeGame_Init {
     Claim internal constant ROOT_CLAIM = Claim.wrap(bytes32(uint256(10)));
@@ -18,13 +18,7 @@ contract FaultDisputeGame_Solvency_Invariant is FaultDisputeGame_Init {
 
     function setUp() public override {
         super.setUp();
-        super.init({
-            rootClaim: ROOT_CLAIM,
-            absolutePrestate: ABSOLUTE_PRESTATE,
-            l2BlockNumber: 0x10,
-            genesisBlockNumber: 0,
-            genesisOutputRoot: Hash.wrap(bytes32(0))
-        });
+        super.init({ rootClaim: ROOT_CLAIM, absolutePrestate: ABSOLUTE_PRESTATE, l2BlockNumber: 0x10 });
 
         actor = new RandomClaimActor(gameProxy, vm);
 
@@ -42,7 +36,7 @@ contract FaultDisputeGame_Solvency_Invariant is FaultDisputeGame_Init {
         (,,, uint256 rootBond,,,) = gameProxy.claimData(0);
 
         for (uint256 i = gameProxy.claimDataLen(); i > 0; i--) {
-            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1)));
+            (bool success,) = address(gameProxy).call(abi.encodeCall(gameProxy.resolveClaim, (i - 1, 0)));
             assertTrue(success);
         }
         gameProxy.resolve();
@@ -95,7 +89,8 @@ contract RandomClaimActor is StdUtils {
 
         totalBonded += _bondAmount;
 
-        GAME.move{ value: _bondAmount }(_parentIndex, _claim, _isAttack);
+        (,,,, Claim disputed,,) = GAME.claimData(_parentIndex);
+        GAME.move{ value: _bondAmount }(disputed, _parentIndex, _claim, _isAttack);
     }
 
     fallback() external payable { }
diff --git a/packages/contracts-bedrock/test/invariants/Hashing.t.sol b/packages/contracts-bedrock/test/invariants/Hashing.t.sol
index f60013b1cfab..1bcda2a601d2 100644
--- a/packages/contracts-bedrock/test/invariants/Hashing.t.sol
+++ b/packages/contracts-bedrock/test/invariants/Hashing.t.sol
@@ -116,7 +116,7 @@ contract Hashing_Invariant is StdInvariant, InvariantTest {
     ///
     ///                   The `hashCrossDomainMessage` function should always revert if
     ///                   the `version` passed is > `1`.
-    function invariant_hash_xdomain_msg_high_version() external {
+    function invariant_hash_xdomain_msg_high_version() external view {
         // ASSERTION: The round trip aliasing done in testRoundTrip(...) should never fail.
         assertFalse(actor.failedCrossDomainHashHighVersion());
     }
@@ -126,7 +126,7 @@ contract Hashing_Invariant is StdInvariant, InvariantTest {
     ///
     ///                   If the version passed is 0, `hashCrossDomainMessage` and
     ///                   `hashCrossDomainMessageV0` should be equivalent.
-    function invariant_hash_xdomain_msg_0() external {
+    function invariant_hash_xdomain_msg_0() external view {
         // ASSERTION: A call to hashCrossDomainMessage and hashCrossDomainMessageV0
         // should always match when the version passed is 0
         assertFalse(actor.failedCrossDomainHashV0());
@@ -137,7 +137,7 @@ contract Hashing_Invariant is StdInvariant, InvariantTest {
     ///
     ///                   If the version passed is 1, `hashCrossDomainMessage` and
     ///                   `hashCrossDomainMessageV1` should be equivalent.
-    function invariant_hash_xdomain_msg_1() external {
+    function invariant_hash_xdomain_msg_1() external view {
         // ASSERTION: A call to hashCrossDomainMessage and hashCrossDomainMessageV1
         // should always match when the version passed is 1
         assertFalse(actor.failedCrossDomainHashV1());
diff --git a/packages/contracts-bedrock/test/invariants/L2OutputOracle.t.sol b/packages/contracts-bedrock/test/invariants/L2OutputOracle.t.sol
index c688ef419617..5152d7688be2 100644
--- a/packages/contracts-bedrock/test/invariants/L2OutputOracle.t.sol
+++ b/packages/contracts-bedrock/test/invariants/L2OutputOracle.t.sol
@@ -55,7 +55,7 @@ contract L2OutputOracle_MonotonicBlockNumIncrease_Invariant is CommonTest {
     ///
     ///                   When a new output is submitted, it should never be allowed to
     ///                   correspond to a block number that is less than the current output.
-    function invariant_monotonicBlockNumIncrease() external {
+    function invariant_monotonicBlockNumIncrease() external view {
         // Assert that the block number of proposals must monotonically increase.
         assertTrue(l2OutputOracle.nextBlockNumber() >= l2OutputOracle.latestBlockNumber());
     }
diff --git a/packages/contracts-bedrock/test/invariants/OptimismPortal.t.sol b/packages/contracts-bedrock/test/invariants/OptimismPortal.t.sol
index 81df17cc8a63..804de4320286 100644
--- a/packages/contracts-bedrock/test/invariants/OptimismPortal.t.sol
+++ b/packages/contracts-bedrock/test/invariants/OptimismPortal.t.sol
@@ -146,7 +146,7 @@ contract OptimismPortal_Deposit_Invariant is CommonTest {
     ///
     ///                   All deposits, barring creation transactions and transactions
     ///                   sent to `address(0)`, should always succeed.
-    function invariant_deposit_completes() external {
+    function invariant_deposit_completes() external view {
         assertEq(actor.failedToComplete(), false);
     }
 }
diff --git a/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol b/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol
index 5d32ba3a5826..bffc3a3b4259 100644
--- a/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol
+++ b/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol
@@ -15,7 +15,7 @@ import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol";
 import { Types } from "src/libraries/Types.sol";
 
 import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol";
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
 
 contract OptimismPortal2_Depositor is StdUtils, ResourceMetering {
     Vm internal vm;
@@ -127,8 +127,8 @@ contract OptimismPortal2_Invariant_Harness is CommonTest {
         _proposedGameIndex = disputeGameFactory.gameCount() - 1;
 
         // Warp beyond the finalization period for the dispute game and resolve it.
-        vm.warp(block.timestamp + game.gameDuration().raw() + 1 seconds);
-        game.resolveClaim(0);
+        vm.warp(block.timestamp + (game.maxClockDuration().raw() * 2) + 1 seconds);
+        game.resolveClaim(0, 0);
         game.resolve();
 
         // Fund the portal so that we can withdraw ETH.
@@ -157,7 +157,7 @@ contract OptimismPortal2_Deposit_Invariant is CommonTest {
     ///
     ///                   All deposits, barring creation transactions and transactions
     ///                   sent to `address(0)`, should always succeed.
-    function invariant_deposit_completes() external {
+    function invariant_deposit_completes() external view {
         assertEq(actor.failedToComplete(), false);
     }
 }
diff --git a/packages/contracts-bedrock/test/invariants/ResourceMetering.t.sol b/packages/contracts-bedrock/test/invariants/ResourceMetering.t.sol
index 091bc54adae2..39e54590efbb 100644
--- a/packages/contracts-bedrock/test/invariants/ResourceMetering.t.sol
+++ b/packages/contracts-bedrock/test/invariants/ResourceMetering.t.sol
@@ -160,7 +160,7 @@ contract ResourceMetering_Invariant is StdInvariant, InvariantTest {
     ///                   (and there were no empty blocks in between), ensure this
     ///                   block's baseFee increased, but not by more than the max amount
     ///                   per block.
-    function invariant_high_usage_raise_baseFee() external {
+    function invariant_high_usage_raise_baseFee() external view {
         assertFalse(actor.failedRaiseBaseFee());
     }
 
@@ -169,7 +169,7 @@ contract ResourceMetering_Invariant is StdInvariant, InvariantTest {
     ///
     ///                   If the previous block used less than the target amount of gas,
     ///                   the base fee should decrease, but not more than the max amount.
-    function invariant_low_usage_lower_baseFee() external {
+    function invariant_low_usage_lower_baseFee() external view {
         assertFalse(actor.failedLowerBaseFee());
     }
 
@@ -177,7 +177,7 @@ contract ResourceMetering_Invariant is StdInvariant, InvariantTest {
     ///
     ///                   This test asserts that a block's base fee can never drop
     ///                   below the `MINIMUM_BASE_FEE` threshold.
-    function invariant_never_below_min_baseFee() external {
+    function invariant_never_below_min_baseFee() external view {
         assertFalse(actor.failedNeverBelowMinBaseFee());
     }
 
@@ -185,7 +185,7 @@ contract ResourceMetering_Invariant is StdInvariant, InvariantTest {
     ///
     ///                   This test asserts that a block can never consume more than
     ///                   the `MAX_RESOURCE_LIMIT` gas threshold.
-    function invariant_never_above_max_gas_limit() external {
+    function invariant_never_above_max_gas_limit() external view {
         assertFalse(actor.failedMaxGasPerBlock());
     }
 
@@ -195,7 +195,7 @@ contract ResourceMetering_Invariant is StdInvariant, InvariantTest {
     ///                   cannot be raised more than the maximum amount allowed. The max base
     ///                   fee change (per-block) is derived as follows:
     ///                   `prevBaseFee / BASE_FEE_MAX_CHANGE_DENOMINATOR`
-    function invariant_never_exceed_max_increase() external {
+    function invariant_never_exceed_max_increase() external view {
         assertFalse(actor.failedMaxRaiseBaseFeePerBlock());
     }
 
@@ -205,7 +205,7 @@ contract ResourceMetering_Invariant is StdInvariant, InvariantTest {
     ///                   be lowered more than the maximum amount allowed. The max base fee
     ///                   change (per-block) is derived as follows:
     ///                   `prevBaseFee / BASE_FEE_MAX_CHANGE_DENOMINATOR`
-    function invariant_never_exceed_max_decrease() external {
+    function invariant_never_exceed_max_decrease() external view {
         assertFalse(actor.failedMaxLowerBaseFeePerBlock());
     }
 
@@ -214,7 +214,7 @@ contract ResourceMetering_Invariant is StdInvariant, InvariantTest {
     ///
     ///                   When calculating the `maxBaseFeeChange` after multiple empty blocks,
     ///                   the calculation should never be allowed to underflow.
-    function invariant_never_underflow() external {
+    function invariant_never_underflow() external view {
         assertFalse(actor.underflow());
     }
 }
diff --git a/packages/contracts-bedrock/test/invariants/SafeCall.t.sol b/packages/contracts-bedrock/test/invariants/SafeCall.t.sol
index 849154aa2d65..0a70c3ddd906 100644
--- a/packages/contracts-bedrock/test/invariants/SafeCall.t.sol
+++ b/packages/contracts-bedrock/test/invariants/SafeCall.t.sol
@@ -30,7 +30,7 @@ contract SafeCall_Succeeds_Invariants is InvariantTest {
     ///
     ///                   If the check for remaining gas in `SafeCall.callWithMinGas` passes, the
     ///                   subcontext of the call below it must be provided at least `minGas` gas.
-    function invariant_callWithMinGas_alwaysForwardsMinGas_succeeds() public {
+    function invariant_callWithMinGas_alwaysForwardsMinGas_succeeds() public view {
         assertEq(actor.numCalls(), 0, "no failed calls allowed");
     }
 
@@ -63,7 +63,7 @@ contract SafeCall_Fails_Invariants is InvariantTest {
     ///                   If there is not enough gas in the callframe to ensure that
     ///                   `callWithMinGas` can provide the specified minimum gas limit
     ///                   to the subcontext of the call, then `callWithMinGas` must revert.
-    function invariant_callWithMinGas_neverForwardsMinGas_reverts() public {
+    function invariant_callWithMinGas_neverForwardsMinGas_reverts() public view {
         assertEq(actor.numCalls(), 0, "no successful calls allowed");
     }
 
diff --git a/packages/contracts-bedrock/test/invariants/SystemConfig.t.sol b/packages/contracts-bedrock/test/invariants/SystemConfig.t.sol
index 75b4e6c2b265..8419113917f4 100644
--- a/packages/contracts-bedrock/test/invariants/SystemConfig.t.sol
+++ b/packages/contracts-bedrock/test/invariants/SystemConfig.t.sol
@@ -6,7 +6,7 @@ import { SystemConfig } from "src/L1/SystemConfig.sol";
 import { Proxy } from "src/universal/Proxy.sol";
 import { Constants } from "src/libraries/Constants.sol";
 
-contract SystemConfig_GasLimitLowerBound_Invariant is Test {
+contract SystemConfig_GasLimitBoundaries_Invariant is Test {
     SystemConfig public config;
 
     function setUp() external {
@@ -31,9 +31,10 @@ contract SystemConfig_GasLimitLowerBound_Invariant is Test {
                         l1CrossDomainMessenger: address(0),
                         l1ERC721Bridge: address(0),
                         l1StandardBridge: address(0),
-                        l2OutputOracle: address(0),
+                        disputeGameFactory: address(0),
                         optimismPortal: address(0),
-                        optimismMintableERC20Factory: address(0)
+                        optimismMintableERC20Factory: address(0),
+                        gasPayingToken: Constants.ETHER
                     })
                 )
             )
@@ -62,9 +63,13 @@ contract SystemConfig_GasLimitLowerBound_Invariant is Test {
         targetInterface(target);
     }
 
-    /// @custom:invariant The gas limit of the `SystemConfig` contract can never be lower
-    ///                   than the hard-coded lower bound.
-    function invariant_gasLimitLowerBound() external {
+    /// @custom:invariant Gas limit boundaries
+    ///
+    /// The gas limit of the `SystemConfig` contract can never be lower than the hard-coded lower bound or higher than
+    /// the hard-coded upper bound. The lower bound must never be higher than the upper bound.
+    function invariant_gasLimitBoundaries() external view {
         assertTrue(config.gasLimit() >= config.minimumGasLimit());
+        assertTrue(config.gasLimit() <= config.maximumGasLimit());
+        assertTrue(config.minimumGasLimit() <= config.maximumGasLimit());
     }
 }
diff --git a/packages/contracts-bedrock/test/kontrol/README.md b/packages/contracts-bedrock/test/kontrol/README.md
index 341715601568..ccf8781fce0b 100644
--- a/packages/contracts-bedrock/test/kontrol/README.md
+++ b/packages/contracts-bedrock/test/kontrol/README.md
@@ -67,6 +67,9 @@ First, generate a deployment summary contract from the deploy script in [`Kontro
 ./test/kontrol/scripts/make-summary-deployment.sh [container|local|dev]
 ```
 
+> [!NOTE]
+> To create a fault proof summary deployment, set `KONTROL_FP_DEPLOYMENT=true` and run the script `./test/kontrol/scripts/make-summary-deployment.sh`.
+
 The [`make-summary-deployment.sh`](./scripts/make-summary-deployment.sh) supports the same execution modes as `run-kontrol.sh` below.
 
 [`KontrolDeployment.sol`](./deployment/KontrolDeployment.sol) contains the minimal deployment sequence required by the proofs.
diff --git a/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummary.t.sol b/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummary.t.sol
index 90b73b9e987e..c9c351e143e3 100644
--- a/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummary.t.sol
+++ b/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummary.t.sol
@@ -52,12 +52,10 @@ contract DeploymentSummary_TestOptimismPortal is DeploymentSummary, OptimismPort
     /// @dev Skips the first line of `super.test_constructor_succeeds` because
     ///      we're not exercising the `Deploy` logic in these tests. However,
     ///      the remaining assertions of the test are important to check
-    function test_constructor_succeeds() external override {
+    function test_constructor_succeeds() external view override {
         // OptimismPortal opImpl = OptimismPortal(payable(deploy.mustGetAddress("OptimismPortal")));
         OptimismPortal opImpl = OptimismPortal(payable(optimismPortalAddress));
-        assertEq(address(opImpl.L2_ORACLE()), address(0));
         assertEq(address(opImpl.l2Oracle()), address(0));
-        assertEq(address(opImpl.SYSTEM_CONFIG()), address(0));
         assertEq(address(opImpl.systemConfig()), address(0));
         assertEq(address(opImpl.superchainConfig()), address(0));
         assertEq(opImpl.l2Sender(), Constants.DEFAULT_L2_SENDER);
@@ -66,14 +64,11 @@ contract DeploymentSummary_TestOptimismPortal is DeploymentSummary, OptimismPort
     /// @dev Skips the first line of `super.test_initialize_succeeds` because
     ///      we're not exercising the `Deploy` logic in these tests. However,
     ///      the remaining assertions of the test are important to check
-    function test_initialize_succeeds() external override {
+    function test_initialize_succeeds() external view override {
         // address guardian = deploy.cfg().superchainConfigGuardian();
         address guardian = superchainConfig.guardian();
-        assertEq(address(optimismPortal.L2_ORACLE()), address(l2OutputOracle));
         assertEq(address(optimismPortal.l2Oracle()), address(l2OutputOracle));
-        assertEq(address(optimismPortal.SYSTEM_CONFIG()), address(systemConfig));
         assertEq(address(optimismPortal.systemConfig()), address(systemConfig));
-        assertEq(optimismPortal.GUARDIAN(), guardian);
         assertEq(optimismPortal.guardian(), guardian);
         assertEq(address(optimismPortal.superchainConfig()), address(superchainConfig));
         assertEq(optimismPortal.l2Sender(), Constants.DEFAULT_L2_SENDER);
@@ -113,7 +108,7 @@ contract DeploymentSummary_TestL1CrossDomainMessenger is DeploymentSummary, L1Cr
     /// @dev Skips the first line of `super.test_constructor_succeeds` because
     ///      we're not exercising the `Deploy` logic in these tests. However,
     ///      the remaining assertions of the test are important to check
-    function test_constructor_succeeds() external override {
+    function test_constructor_succeeds() external view override {
         // L1CrossDomainMessenger impl = L1CrossDomainMessenger(deploy.mustGetAddress("L1CrossDomainMessenger"));
         L1CrossDomainMessenger impl = L1CrossDomainMessenger(l1CrossDomainMessengerAddress);
         assertEq(address(impl.superchainConfig()), address(0));
@@ -210,7 +205,7 @@ contract DeploymentSummary_TestL1ERC721Bridge is DeploymentSummary, L1ERC721Brid
     /// @dev Skips the first line of `super.test_constructor_succeeds` because
     ///      we're not exercising the `Deploy` logic in these tests. However,
     ///      the remaining assertions of the test are important to check
-    function test_constructor_succeeds() public override {
+    function test_constructor_succeeds() public view override {
         // L1ERC721Bridge impl = L1ERC721Bridge(deploy.mustGetAddress("L1ERC721Bridge"));
         L1ERC721Bridge impl = L1ERC721Bridge(l1ERC721BridgeAddress);
         assertEq(address(impl.MESSENGER()), address(0));
@@ -246,7 +241,7 @@ contract DeploymentSummary_TestL1StandardBridge is
     /// @dev Skips the first line of `super.test_constructor_succeeds` because
     ///      we're not exercising the `Deploy` logic in these tests. However,
     ///      the remaining assertions of the test are important to check
-    function test_constructor_succeeds() external override {
+    function test_constructor_succeeds() external view override {
         // L1StandardBridge impl = L1StandardBridge(deploy.mustGetAddress("L1StandardBridge"));
         L1StandardBridge impl = L1StandardBridge(payable(l1StandardBridgeAddress));
         assertEq(address(impl.superchainConfig()), address(0));
diff --git a/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummaryFaultProofs.t.sol b/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummaryFaultProofs.t.sol
new file mode 100644
index 000000000000..2f96f3145119
--- /dev/null
+++ b/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummaryFaultProofs.t.sol
@@ -0,0 +1,77 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+// Libraries
+import { Constants } from "src/libraries/Constants.sol";
+import { Predeploys } from "src/libraries/Predeploys.sol";
+
+// Target contract dependencies
+import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
+import { SystemConfig } from "src/L1/SystemConfig.sol";
+import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
+import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol";
+import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
+import { DeploymentSummaryFaultProofs } from "../proofs/utils/DeploymentSummaryFaultProofs.sol";
+import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol";
+import { L1StandardBridge } from "src/L1/L1StandardBridge.sol";
+import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import { LegacyMintableERC20 } from "src/legacy/LegacyMintableERC20.sol";
+
+// Tests
+import { L1CrossDomainMessenger_Test } from "test/L1/L1CrossDomainMessenger.t.sol";
+import { OptimismPortal2_Test } from "test/L1/OptimismPortal2.t.sol";
+import { L1ERC721Bridge_Test, TestERC721 } from "test/L1/L1ERC721Bridge.t.sol";
+import {
+    L1StandardBridge_Getter_Test,
+    L1StandardBridge_Initialize_Test,
+    L1StandardBridge_Pause_Test
+} from "test/L1/L1StandardBridge.t.sol";
+
+/// @dev Contract testing the deployment summary correctness
+contract DeploymentSummaryFaultProofs_TestOptimismPortal is DeploymentSummaryFaultProofs, OptimismPortal2_Test {
+    /// @notice super.setUp is not called on purpose
+    function setUp() public override {
+        // Recreate Deployment Summary state changes
+        DeploymentSummaryFaultProofs deploymentSummary = new DeploymentSummaryFaultProofs();
+        deploymentSummary.recreateDeployment();
+
+        // Set summary addresses
+        optimismPortal2 = OptimismPortal2(payable(optimismPortalProxyAddress));
+        superchainConfig = SuperchainConfig(superchainConfigProxyAddress);
+        disputeGameFactory = DisputeGameFactory(disputeGameFactoryProxyAddress);
+        systemConfig = SystemConfig(systemConfigProxyAddress);
+
+        // Set up utilized addresses
+        depositor = makeAddr("depositor");
+        alice = makeAddr("alice");
+        bob = makeAddr("bob");
+        vm.deal(alice, 10000 ether);
+        vm.deal(bob, 10000 ether);
+    }
+
+    /// @dev Skips the first line of `super.test_constructor_succeeds` because
+    ///      we're not exercising the `Deploy` logic in these tests. However,
+    ///      the remaining assertions of the test are important to check
+    function test_constructor_succeeds() external view override {
+        // OptimismPortal opImpl = OptimismPortal(payable(deploy.mustGetAddress("OptimismPortal")));
+        OptimismPortal2 opImpl = OptimismPortal2(payable(optimismPortal2Address));
+        assertEq(address(opImpl.disputeGameFactory()), address(0));
+        assertEq(address(opImpl.systemConfig()), address(0));
+        assertEq(address(opImpl.superchainConfig()), address(0));
+        assertEq(opImpl.l2Sender(), Constants.DEFAULT_L2_SENDER);
+    }
+
+    /// @dev Skips the first line of `super.test_initialize_succeeds` because
+    ///      we're not exercising the `Deploy` logic in these tests. However,
+    ///      the remaining assertions of the test are important to check
+    function test_initialize_succeeds() external view override {
+        // address guardian = deploy.cfg().superchainConfigGuardian();
+        address guardian = superchainConfig.guardian();
+        assertEq(address(optimismPortal2.disputeGameFactory()), address(disputeGameFactory));
+        assertEq(address(optimismPortal2.systemConfig()), address(systemConfig));
+        assertEq(optimismPortal2.guardian(), guardian);
+        assertEq(address(optimismPortal2.superchainConfig()), address(superchainConfig));
+        assertEq(optimismPortal2.l2Sender(), Constants.DEFAULT_L2_SENDER);
+        assertEq(optimismPortal2.paused(), false);
+    }
+}
diff --git a/packages/contracts-bedrock/test/kontrol/deployment/KontrolDeployment.sol b/packages/contracts-bedrock/test/kontrol/deployment/KontrolDeployment.sol
index ae88bdb0c3cd..4b8ef355727c 100644
--- a/packages/contracts-bedrock/test/kontrol/deployment/KontrolDeployment.sol
+++ b/packages/contracts-bedrock/test/kontrol/deployment/KontrolDeployment.sol
@@ -5,7 +5,7 @@ import { Deploy } from "scripts/Deploy.s.sol";
 
 contract KontrolDeployment is Deploy {
     function runKontrolDeployment() public stateDiff {
-        deploySafe();
+        deploySafe("SystemOwnerSafe");
         setupSuperchain();
 
         // deployProxies();
@@ -32,4 +32,46 @@ contract KontrolDeployment is Deploy {
         initializeL1CrossDomainMessenger();
         initializeOptimismPortal();
     }
+
+    function runKontrolDeploymentFaultProofs() public stateDiff {
+        deploySafe("SystemOwnerSafe");
+        setupSuperchain();
+
+        // deployProxies();
+        deployERC1967Proxy("OptimismPortalProxy");
+        deployERC1967Proxy("DisputeGameFactoryProxy");
+        deployERC1967Proxy("AnchorStateRegistryProxy");
+        deployERC1967Proxy("DelayedWETHProxy");
+        deployERC1967Proxy("SystemConfigProxy");
+        deployL1StandardBridgeProxy();
+        deployL1CrossDomainMessengerProxy();
+        deployERC1967Proxy("L1ERC721BridgeProxy");
+        transferAddressManagerOwnership(); // to the ProxyAdmin
+
+        // deployImplementations();
+        deployOptimismPortal2();
+        deployL1CrossDomainMessenger();
+        deploySystemConfig();
+        deployL1StandardBridge();
+        deployL1ERC721Bridge();
+        deployDisputeGameFactory();
+        deployDelayedWETH();
+        deployPreimageOracle();
+        deployMips();
+        deployAnchorStateRegistry();
+
+        // initializeImplementations();
+        initializeSystemConfig();
+        initializeL1StandardBridge();
+        initializeL1ERC721Bridge();
+        initializeL1CrossDomainMessenger();
+        initializeDisputeGameFactory();
+        initializeDelayedWETH();
+        initializeAnchorStateRegistry();
+        initializeOptimismPortal2();
+
+        // Set dispute game implementations in DGF
+        setCannonFaultGameImplementation({ _allowUpgrade: false });
+        setPermissionedCannonFaultGameImplementation({ _allowUpgrade: false });
+    }
 }
diff --git a/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal.k.sol b/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal.k.sol
index 1ba1815c2632..10a6d1045745 100644
--- a/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal.k.sol
+++ b/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal.k.sol
@@ -8,6 +8,7 @@ import {
     IOptimismPortal as OptimismPortal,
     ISuperchainConfig as SuperchainConfig
 } from "./interfaces/KontrolInterfaces.sol";
+import "src/libraries/PortalErrors.sol";
 
 contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils {
     OptimismPortal optimismPortal;
@@ -27,7 +28,10 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils {
         vm.prank(optimismPortal.guardian());
         superchainConfig.pause("identifier");
 
-        vm.expectRevert("OptimismPortal: paused");
+        // We need to encode the error selector as bytes instead of bytes4 because the bytes4 signature
+        // it's not currently supported
+        // Tracking issue: https://github.com/runtimeverification/kontrol/issues/466
+        vm.expectRevert(abi.encodeWithSelector(CallPaused.selector));
         optimismPortal.finalizeWithdrawalTransaction(_tx);
     }
 
@@ -48,7 +52,10 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils {
         vm.prank(optimismPortal.guardian());
         superchainConfig.pause("identifier");
 
-        vm.expectRevert("OptimismPortal: paused");
+        // We need to encode the error selector as bytes instead of bytes4 because the bytes4 signature
+        // it's not currently supported
+        // Tracking issue: https://github.com/runtimeverification/kontrol/issues/466
+        vm.expectRevert(abi.encodeWithSelector(CallPaused.selector));
         optimismPortal.proveWithdrawalTransaction(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
     }
 
diff --git a/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal2.k.sol b/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal2.k.sol
new file mode 100644
index 000000000000..e32f6771342a
--- /dev/null
+++ b/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal2.k.sol
@@ -0,0 +1,202 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.13;
+
+import { DeploymentSummaryFaultProofs } from "./utils/DeploymentSummaryFaultProofs.sol";
+import { KontrolUtils } from "./utils/KontrolUtils.sol";
+import { Types } from "src/libraries/Types.sol";
+import {
+    IOptimismPortal as OptimismPortal,
+    ISuperchainConfig as SuperchainConfig
+} from "./interfaces/KontrolInterfaces.sol";
+import "src/libraries/PortalErrors.sol";
+
+contract OptimismPortal2Kontrol is DeploymentSummaryFaultProofs, KontrolUtils {
+    OptimismPortal optimismPortal;
+    SuperchainConfig superchainConfig;
+
+    /// @dev Inlined setUp function for faster Kontrol performance
+    ///      Tracking issue: https://github.com/runtimeverification/kontrol/issues/282
+    function setUpInlined() public {
+        optimismPortal = OptimismPortal(payable(optimismPortalProxyAddress));
+        superchainConfig = SuperchainConfig(superchainConfigProxyAddress);
+    }
+
+    function prove_finalizeWithdrawalTransaction_paused(Types.WithdrawalTransaction calldata _tx) external {
+        setUpInlined();
+
+        // Pause Optimism Portal
+        vm.prank(optimismPortal.guardian());
+        superchainConfig.pause("identifier");
+
+        // We need to encode the error selector as bytes instead of bytes4 because the bytes4 signature
+        // it's not currently supported
+        // Tracking issue: https://github.com/runtimeverification/kontrol/issues/466
+        vm.expectRevert(abi.encodeWithSelector(CallPaused.selector));
+        optimismPortal.finalizeWithdrawalTransaction(_tx);
+    }
+
+    /// @dev Function containing the logic for prove_proveWithdrawalTransaction_paused
+    ///      The reason for this is that we want the _withdrawalProof to range in size from
+    ///      0 to 10. These 11 proofs will exercise the same logic, which is contained in this function
+    function prove_proveWithdrawalTransaction_paused_internal(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes[] memory _withdrawalProof
+    )
+        internal
+    {
+        setUpInlined();
+
+        // Pause Optimism Portal
+        vm.prank(optimismPortal.guardian());
+        superchainConfig.pause("identifier");
+
+        // We need to encode the error selector as bytes instead of bytes4 because the bytes4 signature
+        // it's not currently supported
+        // Tracking issue: https://github.com/runtimeverification/kontrol/issues/466
+        vm.expectRevert(abi.encodeWithSelector(CallPaused.selector));
+        optimismPortal.proveWithdrawalTransaction(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+
+    /// @custom:kontrol-array-length-equals _withdrawalProof: 10,
+    /// @custom:kontrol-bytes-length-equals _withdrawalProof: 600,
+    function prove_proveWithdrawalTransaction_paused10(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes[] calldata _withdrawalProof
+    )
+        external
+    {
+        prove_proveWithdrawalTransaction_paused_internal(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+
+    /// @custom:kontrol-array-length-equals _withdrawalProof: 9,
+    /// @custom:kontrol-bytes-length-equals _withdrawalProof: 600,
+    function prove_proveWithdrawalTransaction_paused9(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes[] calldata _withdrawalProof
+    )
+        external
+    {
+        prove_proveWithdrawalTransaction_paused_internal(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+
+    /// @custom:kontrol-array-length-equals _withdrawalProof: 8,
+    /// @custom:kontrol-bytes-length-equals _withdrawalProof: 600,
+    function prove_proveWithdrawalTransaction_paused8(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes[] calldata _withdrawalProof
+    )
+        external
+    {
+        prove_proveWithdrawalTransaction_paused_internal(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+
+    /// @custom:kontrol-array-length-equals _withdrawalProof: 7,
+    /// @custom:kontrol-bytes-length-equals _withdrawalProof: 600,
+    function prove_proveWithdrawalTransaction_paused7(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes[] calldata _withdrawalProof
+    )
+        external
+    {
+        prove_proveWithdrawalTransaction_paused_internal(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+
+    /// @custom:kontrol-array-length-equals _withdrawalProof: 6,
+    /// @custom:kontrol-bytes-length-equals _withdrawalProof: 600,
+    function prove_proveWithdrawalTransaction_paused6(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes[] calldata _withdrawalProof
+    )
+        external
+    {
+        prove_proveWithdrawalTransaction_paused_internal(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+
+    /// @custom:kontrol-array-length-equals _withdrawalProof: 5,
+    /// @custom:kontrol-bytes-length-equals _withdrawalProof: 600,
+    function prove_proveWithdrawalTransaction_paused5(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes[] calldata _withdrawalProof
+    )
+        external
+    {
+        prove_proveWithdrawalTransaction_paused_internal(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+
+    /// @custom:kontrol-array-length-equals _withdrawalProof: 4,
+    /// @custom:kontrol-bytes-length-equals _withdrawalProof: 600,
+    function prove_proveWithdrawalTransaction_paused4(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes[] calldata _withdrawalProof
+    )
+        external
+    {
+        prove_proveWithdrawalTransaction_paused_internal(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+
+    /// @custom:kontrol-array-length-equals _withdrawalProof: 3,
+    /// @custom:kontrol-bytes-length-equals _withdrawalProof: 600,
+    function prove_proveWithdrawalTransaction_paused3(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes[] calldata _withdrawalProof
+    )
+        external
+    {
+        prove_proveWithdrawalTransaction_paused_internal(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+
+    /// @custom:kontrol-array-length-equals _withdrawalProof: 2,
+    /// @custom:kontrol-bytes-length-equals _withdrawalProof: 600,
+    function prove_proveWithdrawalTransaction_paused2(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes[] calldata _withdrawalProof
+    )
+        external
+    {
+        prove_proveWithdrawalTransaction_paused_internal(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+
+    /// @custom:kontrol-array-length-equals _withdrawalProof: 1,
+    /// @custom:kontrol-bytes-length-equals _withdrawalProof: 600,
+    function prove_proveWithdrawalTransaction_paused1(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof,
+        bytes[] calldata _withdrawalProof
+    )
+        external
+    {
+        prove_proveWithdrawalTransaction_paused_internal(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+
+    function prove_proveWithdrawalTransaction_paused0(
+        Types.WithdrawalTransaction memory _tx,
+        uint256 _l2OutputIndex,
+        Types.OutputRootProof calldata _outputRootProof
+    )
+        external
+    {
+        bytes[] memory _withdrawalProof = new bytes[](0);
+        prove_proveWithdrawalTransaction_paused_internal(_tx, _l2OutputIndex, _outputRootProof, _withdrawalProof);
+    }
+}
diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol
index 70a0c148b356..55ba25fef033 100644
--- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol
+++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol
@@ -13,15 +13,15 @@ contract DeploymentSummary is DeploymentSummaryCode {
     Vm private constant vm = Vm(VM_ADDRESS);
 
     address internal constant addressManagerAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3;
-    address internal constant l1CrossDomainMessengerAddress = 0x71fA82Ea96672797954C28032b337aA40AAFC99f;
+    address internal constant l1CrossDomainMessengerAddress = 0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99;
     address internal constant l1CrossDomainMessengerProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D;
     address internal constant l1ERC721BridgeAddress = 0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586;
     address internal constant l1ERC721BridgeProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F;
-    address internal constant l1StandardBridgeAddress = 0x0Da314776B267D898dEE57F6Ede357ae28b3b83c;
+    address internal constant l1StandardBridgeAddress = 0x04c50B398Cd4182428E79f7186b7C919cF17e86F;
     address internal constant l1StandardBridgeProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6;
     address internal constant l2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60;
     address internal constant l2OutputOracleProxyAddress = 0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb;
-    address internal constant optimismPortalAddress = 0x8887E7568E81405c4E0D4cAaabdda949e3B9d4E4;
+    address internal constant optimismPortalAddress = 0xbdD90485FCbcac869D5b5752179815a3103d8131;
     address internal constant optimismPortalProxyAddress = 0x978e3286EB805934215a88694d80b09aDed68D90;
     address internal constant protocolVersionsAddress = 0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F;
     address internal constant protocolVersionsProxyAddress = 0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6;
@@ -30,9 +30,9 @@ contract DeploymentSummary is DeploymentSummaryCode {
     address internal constant safeSingletonAddress = 0x90193C961A926261B756D1E5bb255e67ff9498A1;
     address internal constant superchainConfigAddress = 0x068E44eB31e111028c41598E4535be7468674D0A;
     address internal constant superchainConfigProxyAddress = 0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809;
-    address internal constant systemConfigAddress = 0xffbA8944650e26653823658d76A122946F27e2f2;
+    address internal constant systemConfigAddress = 0x67866A5052E5302aaD08e9f352331fd8622eB6DC;
     address internal constant systemConfigProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4;
-    address internal constant systemOwnerSafeAddress = 0x2601573C28B77dea6C8B73385c25024A28a00C3F;
+    address internal constant systemOwnerSafeAddress = 0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3;
 
     function recreateDeployment() public {
         bytes32 slot;
@@ -73,7 +73,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
         value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3";
         vm.store(proxyAdminAddress, slot, value);
         slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
-        value = hex"0000000000000000000000002601573c28b77dea6c8b73385c25024a28a00c3f";
+        value = hex"0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3";
         vm.store(proxyAdminAddress, slot, value);
         vm.etch(superchainConfigProxyAddress, superchainConfigProxyCode);
         slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
@@ -242,6 +242,9 @@ contract DeploymentSummary is DeploymentSummaryCode {
         slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
         value = hex"000000000000000000000000000000000000000000000000000000000000dead";
         vm.store(systemConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000066";
+        value = hex"0100000000000000000000000000000000000000000000000000000000000000";
+        vm.store(systemConfigAddress, slot, value);
         slot = hex"0000000000000000000000000000000000000000000000000000000000000068";
         value = hex"0000000000000000000000000000000000000000000000000000000000000001";
         vm.store(systemConfigAddress, slot, value);
@@ -281,7 +284,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
         value = hex"0000000000000000000000000000000000000000000000000000000000000003";
         vm.store(systemOwnerSafeAddress, slot, value);
         slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
-        value = hex"000000000000000000000000ffba8944650e26653823658d76a122946f27e2f2";
+        value = hex"00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc";
         vm.store(systemConfigProxyAddress, slot, value);
         slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
         value = hex"0000000000000000000000000000000000000000000000000000000000000001";
@@ -298,14 +301,14 @@ contract DeploymentSummary is DeploymentSummaryCode {
         slot = hex"0000000000000000000000000000000000000000000000000000000000000067";
         value = hex"0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc";
         vm.store(systemConfigProxyAddress, slot, value);
-        slot = hex"0000000000000000000000000000000000000000000000000000000000000065";
-        value = hex"0000000000000000000000000000000000000000000000000000000000000834";
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000068";
+        value = hex"00000000000000000000000000000000000c5fc5000005580000000000000000";
         vm.store(systemConfigProxyAddress, slot, value);
         slot = hex"0000000000000000000000000000000000000000000000000000000000000066";
-        value = hex"00000000000000000000000000000000000000000000000000000000000f4240";
+        value = hex"010000000000000000000000000000000000000000000000000c5fc500000558";
         vm.store(systemConfigProxyAddress, slot, value);
         slot = hex"0000000000000000000000000000000000000000000000000000000000000068";
-        value = hex"00000000000000000000000000000000000000000000000000000000017d7840";
+        value = hex"00000000000000000000000000000000000c5fc50000055800000000017d7840";
         vm.store(systemConfigProxyAddress, slot, value);
         slot = hex"65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08";
         value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc";
@@ -322,9 +325,6 @@ contract DeploymentSummary is DeploymentSummaryCode {
         slot = hex"9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376";
         value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6";
         vm.store(systemConfigProxyAddress, slot, value);
-        slot = hex"e52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871815";
-        value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb";
-        vm.store(systemConfigProxyAddress, slot, value);
         slot = hex"4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac";
         value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90";
         vm.store(systemConfigProxyAddress, slot, value);
@@ -347,7 +347,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
         value = hex"0000000000000000000000000000000000000000000000000000000000000005";
         vm.store(systemOwnerSafeAddress, slot, value);
         slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
-        value = hex"0000000000000000000000000da314776b267d898dee57f6ede357ae28b3b83c";
+        value = hex"00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f";
         vm.store(l1StandardBridgeProxyAddress, slot, value);
         slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
         value = hex"0000000000000000000000000000000000000000000000000000000000000001";
@@ -358,6 +358,9 @@ contract DeploymentSummary is DeploymentSummaryCode {
         slot = hex"0000000000000000000000000000000000000000000000000000000000000032";
         value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809";
         vm.store(l1StandardBridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4";
+        vm.store(l1StandardBridgeProxyAddress, slot, value);
         slot = hex"0000000000000000000000000000000000000000000000000000000000000003";
         value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d";
         vm.store(l1StandardBridgeProxyAddress, slot, value);
@@ -407,7 +410,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
         value = hex"0000000000000000000000000000000000000000000000000000000000000009";
         vm.store(systemOwnerSafeAddress, slot, value);
         slot = hex"515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e";
-        value = hex"00000000000000000000000071fa82ea96672797954c28032b337aa40aafc99f";
+        value = hex"000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99";
         vm.store(addressManagerAddress, slot, value);
         slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
         value = hex"0000000000000000000000010000000000000000000000000000000000000000";
@@ -421,6 +424,9 @@ contract DeploymentSummary is DeploymentSummaryCode {
         slot = hex"00000000000000000000000000000000000000000000000000000000000000fc";
         value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90";
         vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
+        slot = hex"00000000000000000000000000000000000000000000000000000000000000fd";
+        value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4";
+        vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
         slot = hex"00000000000000000000000000000000000000000000000000000000000000cc";
         value = hex"000000000000000000000000000000000000000000000000000000000000dead";
         vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
@@ -434,7 +440,7 @@ contract DeploymentSummary is DeploymentSummaryCode {
         value = hex"000000000000000000000000000000000000000000000000000000000000000a";
         vm.store(systemOwnerSafeAddress, slot, value);
         slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
-        value = hex"0000000000000000000000008887e7568e81405c4e0d4caaabdda949e3b9d4e4";
+        value = hex"000000000000000000000000bdd90485fcbcac869d5b5752179815a3103d8131";
         vm.store(optimismPortalProxyAddress, slot, value);
         slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
         value = hex"0000000000000000000000000000000000000000000000000000000000000001";
diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol
index 4af7b21aa1d8..07dd548a4367 100644
--- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol
+++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol
@@ -5,9 +5,9 @@ pragma solidity ^0.8.13;
 
 contract DeploymentSummaryCode {
     bytes internal constant safeProxyFactoryCode =
-        hex"608060405234801561001057600080fd5b50600436106100675760003560e01c806353e5d9351161005057806353e5d935146100b7578063d18af54d146100cc578063ec9e80bb146100df57600080fd5b80631688f0b91461006c5780633408e470146100a9575b600080fd5b61007f61007a3660046105d2565b6100f2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6040514681526020016100a0565b6100bf610194565b6040516100a091906106a5565b61007f6100da3660046106bf565b6101dc565b61007f6100ed3660046105d2565b6102f8565b600080838051906020012083604051602001610118929190918252602082015260400190565b60405160208183030381529060405280519060200120905061013b85858361032a565b60405173ffffffffffffffffffffffffffffffffffffffff8781168252919350908316907f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2359060200160405180910390a2509392505050565b6060604051806020016101a6906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052919050565b600080838360405160200161022092919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b6040516020818303038152906040528051906020012060001c90506102468686836100f2565b915073ffffffffffffffffffffffffffffffffffffffff8316156102ef576040517f1e52b51800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690631e52b518906102bc9085908a908a908a9060040161072b565b600060405180830381600087803b1580156102d657600080fd5b505af11580156102ea573d6000803e3d6000fd5b505050505b50949350505050565b60008083805190602001208361030b4690565b6040805160208101949094528301919091526060820152608001610118565b6000833b610399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f7965640060448201526064015b60405180910390fd5b6000604051806020016103ab906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052610403919073ffffffffffffffffffffffffffffffffffffffff881690602001610775565b6040516020818303038152906040529050828151826020016000f5915073ffffffffffffffffffffffffffffffffffffffff821661049d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606401610390565b8351156104be5760008060008651602088016000875af1036104be57600080fd5b509392505050565b61016f8061079883390190565b73ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261053857600080fd5b813567ffffffffffffffff80821115610553576105536104f8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610599576105996104f8565b816040528381528660208588010111156105b257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156105e757600080fd5b83356105f2816104d3565b9250602084013567ffffffffffffffff81111561060e57600080fd5b61061a86828701610527565b925050604084013590509250925092565b60005b8381101561064657818101518382015260200161062e565b83811115610655576000848401525b50505050565b6000815180845261067381602086016020860161062b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006106b8602083018461065b565b9392505050565b600080600080608085870312156106d557600080fd5b84356106e0816104d3565b9350602085013567ffffffffffffffff8111156106fc57600080fd5b61070887828801610527565b935050604085013591506060850135610720816104d3565b939692955090935050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610764608083018561065b565b905082606083015295945050505050565b6000835161078781846020880161062b565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161016f38038061016f83398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b6078806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000aa164736f6c634300080f000a";
+        hex"608060405234801561001057600080fd5b50600436106100725760003560e01c806361b69abd1161005057806361b69abd146100dc578063addacc0f146100ef578063d18af54d146100f757600080fd5b80631688f0b9146100775780632500510e146100b457806353e5d935146100c7575b600080fd5b61008a61008536600461070e565b61010a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61008a6100c2366004610767565b610192565b6100cf610272565b6040516100ab919061086c565b61008a6100ea366004610886565b6102ba565b6100cf61037d565b61008a6101053660046108d6565b61038f565b60006101178484846104ab565b83519091501561013b5760008060008551602087016000865af10361013b57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252861660208201527f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235910160405180910390a19392505050565b60006101d68585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792506104ab915050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b166020820152909150603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526102699160040161086c565b60405180910390fd5b606060405180602001610284906105f6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052919050565b6000826040516102c9906105f6565b73ffffffffffffffffffffffffffffffffffffffff9091168152602001604051809103906000f080158015610302573d6000803e3d6000fd5b508251909150156103275760008060008451602086016000865af10361032757600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201527f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235910160405180910390a192915050565b60606040518060200161028490610603565b60008083836040516020016103d392919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b6040516020818303038152906040528051906020012060001c90506103f986868361010a565b915073ffffffffffffffffffffffffffffffffffffffff8316156104a2576040517f1e52b51800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690631e52b5189061046f9085908a908a908a90600401610942565b600060405180830381600087803b15801561048957600080fd5b505af115801561049d573d6000803e3d6000fd5b505050505b50949350505050565b6000808380519060200120836040516020016104d1929190918252602082015260400190565b6040516020818303038152906040528051906020012090506000604051806020016104fb906105f6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052610553919073ffffffffffffffffffffffffffffffffffffffff89169060200161098c565b6040516020818303038152906040529050818151826020016000f5925073ffffffffffffffffffffffffffffffffffffffff83166105ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606401610269565b50509392505050565b61016f806109af83390190565b607880610b1e83390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461063157600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261067457600080fd5b813567ffffffffffffffff8082111561068f5761068f610634565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156106d5576106d5610634565b816040528381528660208588010111156106ee57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561072357600080fd5b833561072e8161060f565b9250602084013567ffffffffffffffff81111561074a57600080fd5b61075686828701610663565b925050604084013590509250925092565b6000806000806060858703121561077d57600080fd5b84356107888161060f565b9350602085013567ffffffffffffffff808211156107a557600080fd5b818701915087601f8301126107b957600080fd5b8135818111156107c857600080fd5b8860208285010111156107da57600080fd5b95986020929092019750949560400135945092505050565b60005b8381101561080d5781810151838201526020016107f5565b8381111561081c576000848401525b50505050565b6000815180845261083a8160208601602086016107f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061087f6020830184610822565b9392505050565b6000806040838503121561089957600080fd5b82356108a48161060f565b9150602083013567ffffffffffffffff8111156108c057600080fd5b6108cc85828601610663565b9150509250929050565b600080600080608085870312156108ec57600080fd5b84356108f78161060f565b9350602085013567ffffffffffffffff81111561091357600080fd5b61091f87828801610663565b9350506040850135915060608501356109378161060f565b939692955090935050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261097b6080830185610822565b905082606083015295945050505050565b6000835161099e8184602088016107f2565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161016f38038061016f83398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b6078806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000a6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000aa164736f6c634300080f000a";
     bytes internal constant safeSingletonCode =
-        hex"6080604052600436106101d15760003560e01c8063affed0e0116100f7578063e19a9dd911610095578063f08a032311610064578063f08a0323146105f5578063f698da2514610615578063f8dc5dd91461067c578063ffa1ad741461069c5761020d565b8063e19a9dd914610580578063e318b52b146105a0578063e75235b8146105c0578063e86637db146105d55761020d565b8063cc2f8452116100d1578063cc2f8452146104f2578063d4d9bdcd14610520578063d8d11f7814610540578063e009cfde146105605761020d565b8063affed0e01461049c578063b4faba09146104b2578063b63e800d146104d25761020d565b80635624b25b1161016f5780636a7612021161013e5780636a7612021461040f5780637d83297414610422578063934f3a111461045a578063a0e67e2b1461047a5761020d565b80635624b25b146103755780635ae6bd37146103a2578063610b5925146103cf578063694e80c3146103ef5761020d565b80632f54bf6e116101ab5780632f54bf6e146102ea5780633408e4701461030a578063468721a7146103275780635229073f146103475761020d565b80630d582f131461027357806312fb68e0146102955780632d9ad53d146102b55761020d565b3661020d5760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561021957600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024457005b36600080373360601b365260008060143601600080855af190503d6000803e8061026d573d6000fd5b503d6000f35b34801561027f57600080fd5b5061029361028e366004613568565b6106e5565b005b3480156102a157600080fd5b506102936102b036600461366e565b610933565b3480156102c157600080fd5b506102d56102d03660046136e3565b610ff7565b60405190151581526020015b60405180910390f35b3480156102f657600080fd5b506102d56103053660046136e3565b61104c565b34801561031657600080fd5b50465b6040519081526020016102e1565b34801561033357600080fd5b506102d561034236600461370f565b61109e565b34801561035357600080fd5b5061036761036236600461370f565b6111d4565b6040516102e19291906137e4565b34801561038157600080fd5b506103956103903660046137ff565b61120a565b6040516102e19190613821565b3480156103ae57600080fd5b506103196103bd366004613834565b60076020526000908152604090205481565b3480156103db57600080fd5b506102936103ea3660046136e3565b611290565b3480156103fb57600080fd5b5061029361040a366004613834565b611479565b6102d561041d366004613896565b611593565b34801561042e57600080fd5b5061031961043d366004613568565b600860209081526000928352604080842090915290825290205481565b34801561046657600080fd5b5061029361047536600461396f565b61198f565b34801561048657600080fd5b5061048f611a0b565b6040516102e19190613a2d565b3480156104a857600080fd5b5061031960055481565b3480156104be57600080fd5b506102936104cd366004613a40565b611b23565b3480156104de57600080fd5b506102936104ed366004613a90565b611b46565b3480156104fe57600080fd5b5061051261050d366004613568565b611c62565b6040516102e1929190613b85565b34801561052c57600080fd5b5061029361053b366004613834565b611ed0565b34801561054c57600080fd5b5061031961055b366004613bbd565b611fa4565b34801561056c57600080fd5b5061029361057b366004613c7e565b611fd1565b34801561058c57600080fd5b5061029361059b3660046136e3565b6121a3565b3480156105ac57600080fd5b506102936105bb366004613cb7565b612344565b3480156105cc57600080fd5b50600454610319565b3480156105e157600080fd5b506103956105f0366004613bbd565b6126bc565b34801561060157600080fd5b506102936106103660046136e3565b612855565b34801561062157600080fd5b5061031960007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b34801561068857600080fd5b50610293610697366004613d02565b6128aa565b3480156106a857600080fd5b506103956040518060400160405280600581526020017f312e342e3000000000000000000000000000000000000000000000000000000081525081565b6106ed612b34565b73ffffffffffffffffffffffffffffffffffffffff821615801590610729575073ffffffffffffffffffffffffffffffffffffffff8216600114155b801561074b575073ffffffffffffffffffffffffffffffffffffffff82163014155b6107b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600260205260409020541615610845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0805473ffffffffffffffffffffffffffffffffffffffff8481166000818152604081208054939094167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179093556001835283549091161790915560038054916108d783613d72565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2806004541461092f5761092f81611479565b5050565b61093e816041612b9f565b825110156109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000808060008060005b86811015610feb576041818102890160208101516040820151919092015160ff16955090935091506000849003610cf857885160208a01208a14610a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323700000000000000000000000000000000000000000000000000000060448201526064016107ad565b9193508391610a62876041612b9f565b821015610acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323100000000000000000000000000000000000000000000000000000060448201526064016107ad565b8751610ad8836020612bdb565b1115610b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323200000000000000000000000000000000000000000000000000000060448201526064016107ad565b602082890181015189519091610b63908390610b5d908790612bdb565b90612bdb565b1115610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040517f20c13b0b000000000000000000000000000000000000000000000000000000008082528a85016020019173ffffffffffffffffffffffffffffffffffffffff8916906320c13b0b90610c27908f908690600401613daa565b602060405180830381865afa158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190613dcf565b7fffffffff000000000000000000000000000000000000000000000000000000001614610cf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323400000000000000000000000000000000000000000000000000000060448201526064016107ad565b5050610eeb565b8360ff16600103610dc65791935083913373ffffffffffffffffffffffffffffffffffffffff84161480610d5b575073ffffffffffffffffffffffffffffffffffffffff851660009081526008602090815260408083208d845290915290205415155b610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323500000000000000000000000000000000000000000000000000000060448201526064016107ad565b610eeb565b601e8460ff161115610e8b576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610e2b9190613e11565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610e7a573d6000803e3d6000fd5b505050602060405103519450610eeb565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610ede573d6000803e3d6000fd5b5050506020604051035194505b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015610f4c575073ffffffffffffffffffffffffffffffffffffffff8581166000908152600260205260409020541615155b8015610f6f575073ffffffffffffffffffffffffffffffffffffffff8516600114155b610fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8495508080610fe390613d72565b9150506109b2565b50505050505050505050565b6000600173ffffffffffffffffffffffffffffffffffffffff831614801590611046575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615155b92915050565b600073ffffffffffffffffffffffffffffffffffffffff821660011480159061104657505073ffffffffffffffffffffffffffffffffffffffff90811660009081526002602052604090205416151590565b6000336001148015906110d557503360009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b61113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b611168858585857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612bf7565b905080156111a05760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a26111cc565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b600060606111e48686868661109e565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60606000611219836020613e34565b67ffffffffffffffff81111561123157611231613594565b6040519080825280601f01601f19166020018201604052801561125b576020820181803683370190505b50905060005b8381101561128857848101546020808302840101528061128081613d72565b915050611261565b509392505050565b611298612b34565b73ffffffffffffffffffffffffffffffffffffffff8116158015906112d4575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604090205416156113c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f805473ffffffffffffffffffffffffffffffffffffffff848116600081815260408082208054949095167fffffffffffffffffffffffff000000000000000000000000000000000000000094851617909455948552835490911681179092555190917fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091a250565b611481612b34565b6003548111156114ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939060200160405180910390a150565b60008060006115ad8e8e8e8e8e8e8e8e8e8e6005546126bc565b6005805491925060006115bf83613d72565b90915550508051602082012091506115d882828661198f565b5060006116037f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b905073ffffffffffffffffffffffffffffffffffffffff8116156116a3578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016116709c9b9a99989796959493929190613edb565b600060405180830381600087803b15801561168a57600080fd5b505af115801561169e573d6000803e3d6000fd5b505050505b6116cf6116b28a6109c4613ff1565b603f6116bf8c6040613e34565b6116c99190614009565b90612c3e565b6116db906101f4613ff1565b5a1015611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313000000000000000000000000000000000000000000000000000000060448201526064016107ad565b60005a90506117b58f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c6000146117a2578e612bf7565b6109c45a6117b09190614044565b612bf7565b93506117c25a8290612c55565b905083806117cf57508915155b806117d957508715155b61183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000881561185757611854828b8b8b8b612c70565b90505b841561189c57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8260405161188f91815260200190565b60405180910390a26118d7565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040516118ce91815260200190565b60405180910390a25b505073ffffffffffffffffffffffffffffffffffffffff81161561197e576040517f9327136800000000000000000000000000000000000000000000000000000000815260048101839052831515602482015273ffffffffffffffffffffffffffffffffffffffff821690639327136890604401600060405180830381600087803b15801561196557600080fd5b505af1158015611979573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b600454806119f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b611a0584848484610933565b50505050565b6060600060035467ffffffffffffffff811115611a2a57611a2a613594565b604051908082528060200260200182016040528015611a53578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff8116600114611b1b5780838381518110611ace57611ace61405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260029092526040909120541681611b1381613d72565b925050611a9d565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b611b848a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c9250612e01915050565b73ffffffffffffffffffffffffffffffffffffffff841615611ba957611ba9846131ce565b611be98787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061327192505050565b8115611c0057611bfe82600060018685612c70565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b89604051611c4e95949392919061408a565b60405180910390a250505050505050505050565b6060600073ffffffffffffffffffffffffffffffffffffffff841660011480611c8f5750611c8f84610ff7565b611cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b60008311611d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8267ffffffffffffffff811115611d7857611d78613594565b604051908082528060200260200182016040528015611da1578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff808616600090815260016020526040812054929450911691505b73ffffffffffffffffffffffffffffffffffffffff821615801590611e0d575073ffffffffffffffffffffffffffffffffffffffff8216600114155b8015611e1857508381105b15611e805781838281518110611e3057611e3061405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152928116600090815260019093526040909220549091169080611e7881613d72565b915050611dd1565b73ffffffffffffffffffffffffffffffffffffffff8216600114611ec55782611eaa600183614044565b81518110611eba57611eba61405b565b602002602001015191505b808352509250929050565b3360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16611f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333000000000000000000000000000000000000000000000000000000060448201526064016107ad565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b6000611fb98c8c8c8c8c8c8c8c8c8c8c6126bc565b8051906020012090509b9a5050505050505050505050565b611fd9612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612015575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602052604090205481169082161461210e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600081815260016020526040808220805487861684528284208054919096167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179095558383528054909416909355915190917faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691a25050565b6121ab612b34565b73ffffffffffffffffffffffffffffffffffffffff8116156122db576040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fe6d7a83a00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015612251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122759190614110565b6122db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475333303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c881815560405173ffffffffffffffffffffffffffffffffffffffff8316907f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa290600090a25050565b61234c612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612388575073ffffffffffffffffffffffffffffffffffffffff8116600114155b80156123aa575073ffffffffffffffffffffffffffffffffffffffff81163014155b612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040902054161561249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8216158015906124db575073ffffffffffffffffffffffffffffffffffffffff8216600114155b612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260205260409020548116908316146125d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805486861680855283852080549288167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790559589168452828420805482169096179095558383528054909416909355915190917ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf91a260405173ffffffffffffffffffffffffffffffffffffffff8216907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d6040516126f6929190614132565b60405190819003812061271c949392918e908e908e908e908e908e908e90602001614142565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090507f19000000000000000000000000000000000000000000000000000000000000007f01000000000000000000000000000000000000000000000000000000000000006127f060007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b61285d612b34565b612866816131ce565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b090600090a250565b6128b2612b34565b8060016003546128c29190614044565b101561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff821615801590612966575073ffffffffffffffffffffffffffffffffffffffff8216600114155b6129cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260026020526040902054811690831614612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805488861684529183208054929095167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790945591815282549091169091556003805491612ad7836141bf565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf90600090a28060045414612b2f57612b2f81611479565b505050565b333014612b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333100000000000000000000000000000000000000000000000000000060448201526064016107ad565b565b600082600003612bb157506000611046565b6000612bbd8385613e34565b905082612bca8583614009565b14612bd457600080fd5b9392505050565b600080612be88385613ff1565b905083811015612bd457600080fd5b60006001836001811115612c0d57612c0d613e71565b03612c25576000808551602087018986f49050612c35565b600080855160208701888a87f190505b95945050505050565b600081831015612c4e5781612bd4565b5090919050565b600082821115612c6457600080fd5b60006111cc8385614044565b60008073ffffffffffffffffffffffffffffffffffffffff831615612c955782612c97565b325b905073ffffffffffffffffffffffffffffffffffffffff8416612d7657612cd63a8610612cc4573a612cc6565b855b612cd08989612bdb565b90612b9f565b60405190925073ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f19350505050612d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313100000000000000000000000000000000000000000000000000000060448201526064016107ad565b612df7565b612d8485612cd08989612bdb565b9150612d91848284613469565b612df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313200000000000000000000000000000000000000000000000000000060448201526064016107ad565b5095945050505050565b60045415612e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b8151811115612ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015612f41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160005b8351811015613176576000848281518110612f6357612f6361405b565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612fc1575073ffffffffffffffffffffffffffffffffffffffff8116600114155b8015612fe3575073ffffffffffffffffffffffffffffffffffffffff81163014155b801561301b57508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b613081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600260205260409020541615613110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff928316600090815260026020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938216939093179092558061316e81613d72565b915050612f46565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790559051600355600455565b3073ffffffffffffffffffffffffffffffffffffffff82160361324d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475334303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f5473ffffffffffffffffffffffffffffffffffffffff161561331a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905573ffffffffffffffffffffffffffffffffffffffff82161561092f57813b6133f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b6134038260008360015a612bf7565b61092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040805173ffffffffffffffffffffffffffffffffffffffff841660248201526044808201849052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251600093929184919082896127105a03f13d8015613516576020811461351e5760009350613529565b819350613529565b600051158215171593505b5050509392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461355557600080fd5b50565b803561356381613533565b919050565b6000806040838503121561357b57600080fd5b823561358681613533565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126135d457600080fd5b813567ffffffffffffffff808211156135ef576135ef613594565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561363557613635613594565b8160405283815286602085880101111561364e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561368457600080fd5b84359350602085013567ffffffffffffffff808211156136a357600080fd5b6136af888389016135c3565b945060408701359150808211156136c557600080fd5b506136d2878288016135c3565b949793965093946060013593505050565b6000602082840312156136f557600080fd5b8135612bd481613533565b80356002811061356357600080fd5b6000806000806080858703121561372557600080fd5b843561373081613533565b935060208501359250604085013567ffffffffffffffff81111561375357600080fd5b61375f878288016135c3565b92505061376e60608601613700565b905092959194509250565b6000815180845260005b8181101561379f57602081850181015186830182015201613783565b818111156137b1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b82151581526040602082015260006111cc6040830184613779565b6000806040838503121561381257600080fd5b50508035926020909101359150565b602081526000612bd46020830184613779565b60006020828403121561384657600080fd5b5035919050565b60008083601f84011261385f57600080fd5b50813567ffffffffffffffff81111561387757600080fd5b60208301915083602082850101111561388f57600080fd5b9250929050565b60008060008060008060008060008060006101408c8e0312156138b857600080fd5b6138c18c613558565b9a5060208c0135995067ffffffffffffffff8060408e013511156138e457600080fd5b6138f48e60408f01358f0161384d565b909a50985061390560608e01613700565b975060808d0135965060a08d0135955060c08d0135945061392860e08e01613558565b93506139376101008e01613558565b9250806101208e0135111561394b57600080fd5b5061395d8d6101208e01358e016135c3565b90509295989b509295989b9093969950565b60008060006060848603121561398457600080fd5b83359250602084013567ffffffffffffffff808211156139a357600080fd5b6139af878388016135c3565b935060408601359150808211156139c557600080fd5b506139d2868287016135c3565b9150509250925092565b600081518084526020808501945080840160005b83811015613a2257815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016139f0565b509495945050505050565b602081526000612bd460208301846139dc565b60008060408385031215613a5357600080fd5b8235613a5e81613533565b9150602083013567ffffffffffffffff811115613a7a57600080fd5b613a86858286016135c3565b9150509250929050565b6000806000806000806000806000806101008b8d031215613ab057600080fd5b8a3567ffffffffffffffff80821115613ac857600080fd5b818d0191508d601f830112613adc57600080fd5b813581811115613aeb57600080fd5b8e60208260051b8501011115613b0057600080fd5b60208381019d50909b508d01359950613b1b60408e01613558565b985060608d0135915080821115613b3157600080fd5b50613b3e8d828e0161384d565b9097509550613b51905060808c01613558565b9350613b5f60a08c01613558565b925060c08b01359150613b7460e08c01613558565b90509295989b9194979a5092959850565b604081526000613b9860408301856139dc565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b60008060008060008060008060008060006101408c8e031215613bdf57600080fd5b8b35613bea81613533565b9a5060208c0135995060408c013567ffffffffffffffff811115613c0d57600080fd5b613c198e828f0161384d565b909a509850613c2c905060608d01613700565b965060808c0135955060a08c0135945060c08c0135935060e08c0135613c5181613533565b92506101008c0135613c6281613533565b809250506101208c013590509295989b509295989b9093969950565b60008060408385031215613c9157600080fd5b8235613c9c81613533565b91506020830135613cac81613533565b809150509250929050565b600080600060608486031215613ccc57600080fd5b8335613cd781613533565b92506020840135613ce781613533565b91506040840135613cf781613533565b809150509250925092565b600080600060608486031215613d1757600080fd5b8335613d2281613533565b92506020840135613d3281613533565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613da357613da3613d43565b5060010190565b604081526000613dbd6040830185613779565b8281036020840152612c358185613779565b600060208284031215613de157600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114612bd457600080fd5b600060ff821660ff841680821015613e2b57613e2b613d43565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e6c57613e6c613d43565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600061016073ffffffffffffffffffffffffffffffffffffffff8f1683528d60208401528060408401528b81840152506101808b8d828501376000818d850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8d01168301613f51606085018d613ea0565b8a60808501528960a08501528860c0850152613f8560e085018973ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff87166101008501528184820301610120850152613fb982820187613779565b92505050613fe061014083018473ffffffffffffffffffffffffffffffffffffffff169052565b9d9c50505050505050505050505050565b6000821982111561400457614004613d43565b500190565b60008261403f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561405657614056613d43565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6080808252810185905260008660a08301825b888110156140da5782356140b081613533565b73ffffffffffffffffffffffffffffffffffffffff1682526020928301929091019060010161409d565b506020840196909652505073ffffffffffffffffffffffffffffffffffffffff9283166040820152911660609091015292915050565b60006020828403121561412257600080fd5b81518015158114612bd457600080fd5b8183823760009101908152919050565b6000610160820190508c825273ffffffffffffffffffffffffffffffffffffffff808d1660208401528b60408401528a6060840152614184608084018b613ea0565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b6000816141ce576141ce613d43565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea164736f6c634300080f000a";
+        hex"6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314610620578063f698da2514610640578063f8dc5dd9146106a7578063ffa1ad74146106c757610218565b8063e19a9dd9146105ab578063e318b52b146105cb578063e75235b8146105eb578063e86637db1461060057610218565b8063cc2f8452116100d1578063cc2f84521461051d578063d4d9bdcd1461054b578063d8d11f781461056b578063e009cfde1461058b57610218565b8063affed0e0146104a7578063b4faba09146104bd578063b63e800d146104dd578063c4ca3a9c146104fd57610218565b80635624b25b1161017a5780636a761202116101495780636a7612021461041a5780637d8329741461042d578063934f3a1114610465578063a0e67e2b1461048557610218565b80635624b25b146103805780635ae6bd37146103ad578063610b5925146103da578063694e80c3146103fa57610218565b80632f54bf6e116101b65780632f54bf6e146102f55780633408e47014610315578063468721a7146103325780635229073f1461035257610218565b80630d582f131461027e57806312fb68e0146102a05780632d9ad53d146102c057610218565b366102185760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561022457600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024f57005b36600080373360601b365260008060143601600080855af190503d6000803e80610278573d6000fd5b503d6000f35b34801561028a57600080fd5b5061029e6102993660046132ce565b610710565b005b3480156102ac57600080fd5b5061029e6102bb3660046133d4565b610966565b3480156102cc57600080fd5b506102e06102db366004613449565b610fbb565b60405190151581526020015b60405180910390f35b34801561030157600080fd5b506102e0610310366004613449565b611010565b34801561032157600080fd5b50465b6040519081526020016102ec565b34801561033e57600080fd5b506102e061034d366004613475565b611062565b34801561035e57600080fd5b5061037261036d366004613475565b611178565b6040516102ec92919061354a565b34801561038c57600080fd5b506103a061039b366004613565565b6111ae565b6040516102ec9190613587565b3480156103b957600080fd5b506103246103c836600461359a565b60076020526000908152604090205481565b3480156103e657600080fd5b5061029e6103f5366004613449565b611234565b34801561040657600080fd5b5061029e61041536600461359a565b611426565b6102e06104283660046135fc565b61153a565b34801561043957600080fd5b506103246104483660046132ce565b600860209081526000928352604080842090915290825290205481565b34801561047157600080fd5b5061029e6104803660046136d5565b611934565b34801561049157600080fd5b5061049a6119b0565b6040516102ec9190613793565b3480156104b357600080fd5b5061032460055481565b3480156104c957600080fd5b5061029e6104d83660046137a6565b611ac8565b3480156104e957600080fd5b5061029e6104f83660046137f6565b611aeb565b34801561050957600080fd5b506103246105183660046138eb565b611c26565b34801561052957600080fd5b5061053d6105383660046132ce565b611cf8565b6040516102ec92919061395c565b34801561055757600080fd5b5061029e61056636600461359a565b611e26565b34801561057757600080fd5b50610324610586366004613994565b611efa565b34801561059757600080fd5b5061029e6105a6366004613a55565b611f27565b3480156105b757600080fd5b5061029e6105c6366004613449565b612106565b3480156105d757600080fd5b5061029e6105e6366004613a8e565b612178565b3480156105f757600080fd5b50600454610324565b34801561060c57600080fd5b506103a061061b366004613994565b612504565b34801561062c57600080fd5b5061029e61063b366004613449565b61269d565b34801561064c57600080fd5b5061032460007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b3480156106b357600080fd5b5061029e6106c2366004613ad9565b612713565b3480156106d357600080fd5b506103a06040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b6107186129a5565b73ffffffffffffffffffffffffffffffffffffffff821615801590610754575073ffffffffffffffffffffffffffffffffffffffff8216600114155b8015610776575073ffffffffffffffffffffffffffffffffffffffff82163014155b6107e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600260205260409020541615610870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107d8565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0805473ffffffffffffffffffffffffffffffffffffffff8481166000818152604081208054939094167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790935560018352835490911617909155600380549161090283613b49565b909155505060405173ffffffffffffffffffffffffffffffffffffffff831681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a180600454146109625761096281611426565b5050565b610971816041612a10565b825110156109db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323000000000000000000000000000000000000000000000000000000060448201526064016107d8565b6000808060008060005b86811015610faf576041818102890160208101516040820151919092015160ff16955090935091506000849003610cbc579193508391610a26876041612a10565b821015610a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323100000000000000000000000000000000000000000000000000000060448201526064016107d8565b8751610a9c836020612a4c565b1115610b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323200000000000000000000000000000000000000000000000000000060448201526064016107d8565b602082890181015189519091610b27908390610b21908790612a4c565b90612a4c565b1115610b8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323300000000000000000000000000000000000000000000000000000060448201526064016107d8565b6040517f20c13b0b000000000000000000000000000000000000000000000000000000008082528a85016020019173ffffffffffffffffffffffffffffffffffffffff8916906320c13b0b90610beb908f908690600401613b81565b602060405180830381865afa158015610c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2c9190613ba6565b7fffffffff000000000000000000000000000000000000000000000000000000001614610cb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323400000000000000000000000000000000000000000000000000000060448201526064016107d8565b5050610eaf565b8360ff16600103610d8a5791935083913373ffffffffffffffffffffffffffffffffffffffff84161480610d1f575073ffffffffffffffffffffffffffffffffffffffff851660009081526008602090815260408083208d845290915290205415155b610d85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323500000000000000000000000000000000000000000000000000000060448201526064016107d8565b610eaf565b601e8460ff161115610e4f576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610def9190613be8565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610e3e573d6000803e3d6000fd5b505050602060405103519450610eaf565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610ea2573d6000803e3d6000fd5b5050506020604051035194505b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015610f10575073ffffffffffffffffffffffffffffffffffffffff8581166000908152600260205260409020541615155b8015610f33575073ffffffffffffffffffffffffffffffffffffffff8516600114155b610f99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323600000000000000000000000000000000000000000000000000000060448201526064016107d8565b8495508080610fa790613b49565b9150506109e5565b50505050505050505050565b6000600173ffffffffffffffffffffffffffffffffffffffff83161480159061100a575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615155b92915050565b600073ffffffffffffffffffffffffffffffffffffffff821660011480159061100a57505073ffffffffffffffffffffffffffffffffffffffff90811660009081526002602052604090205416151590565b60003360011480159061109957503360009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b6110ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303400000000000000000000000000000000000000000000000000000060448201526064016107d8565b61110c858585855a612a68565b905080156111445760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a2611170565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b6000606061118886868686611062565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006111bd836020613c0b565b67ffffffffffffffff8111156111d5576111d56132fa565b6040519080825280601f01601f1916602001820160405280156111ff576020820181803683370190505b50905060005b8381101561122c57848101546020808302840101528061122481613b49565b915050611205565b509392505050565b61123c6129a5565b73ffffffffffffffffffffffffffffffffffffffff811615801590611278575073ffffffffffffffffffffffffffffffffffffffff8116600114155b6112de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260016020526040902054161561136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303200000000000000000000000000000000000000000000000000000060448201526064016107d8565b600160208181527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f805473ffffffffffffffffffffffffffffffffffffffff858116600081815260408082208054949095167fffffffffffffffffffffffff000000000000000000000000000000000000000094851617909455959095528254168417909155519182527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091015b60405180910390a150565b61142e6129a5565b60035481111561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b6001811015611505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107d8565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939060200161141b565b60008060006115548e8e8e8e8e8e8e8e8e8e600554612504565b60058054919250600061156683613b49565b909155505080516020820120915061157f828286611934565b5060006115aa7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b905073ffffffffffffffffffffffffffffffffffffffff81161561164a578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016116179c9b9a99989796959493929190613cb2565b600060405180830381600087803b15801561163157600080fd5b505af1158015611645573d6000803e3d6000fd5b505050505b6116766116598a6109c4613dc8565b603f6116668c6040613c0b565b6116709190613de0565b90612aaf565b611682906101f4613dc8565b5a10156116eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313000000000000000000000000000000000000000000000000000000060448201526064016107d8565b60005a905061175c8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c600014611749578e612a68565b6109c45a6117579190613e1b565b612a68565b93506117695a8290612ac6565b9050838061177657508915155b8061178057508715155b6117e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313300000000000000000000000000000000000000000000000000000060448201526064016107d8565b600088156117fe576117fb828b8b8b8b612ae1565b90505b84156118425760408051858152602081018390527f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e910160405180910390a161187c565b60408051858152602081018390527f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23910160405180910390a15b505073ffffffffffffffffffffffffffffffffffffffff811615611923576040517f9327136800000000000000000000000000000000000000000000000000000000815260048101839052831515602482015273ffffffffffffffffffffffffffffffffffffffff821690639327136890604401600060405180830381600087803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6004548061199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b6119aa84848484610966565b50505050565b6060600060035467ffffffffffffffff8111156119cf576119cf6132fa565b6040519080825280602002602001820160405280156119f8578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff8116600114611ac05780838381518110611a7357611a73613e32565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260029092526040909120541681611ab881613b49565b925050611a42565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b611b298a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c9250612c72915050565b73ffffffffffffffffffffffffffffffffffffffff841615611b6d57611b6d847f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b611bad8787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061303f92505050565b8115611bc457611bc282600060018685612ae1565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b89604051611c12959493929190613e61565b60405180910390a250505050505050505050565b6000805a9050611c6f878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050505a612a68565b611c7857600080fd5b60005a611c859083613e1b565b905080604051602001611c9a91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526107d891600401613587565b606060008267ffffffffffffffff811115611d1557611d156132fa565b604051908082528060200260200182016040528015611d3e578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff80861660009081526001602052604081205492945091165b73ffffffffffffffffffffffffffffffffffffffff811615801590611da8575073ffffffffffffffffffffffffffffffffffffffff8116600114155b8015611db357508482105b15611e185780848381518110611dcb57611dcb613e32565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260019092526040909120541681611e1081613b49565b925050611d6c565b908352919491935090915050565b3360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16611eb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333000000000000000000000000000000000000000000000000000000060448201526064016107d8565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b6000611f0f8c8c8c8c8c8c8c8c8c8c8c612504565b8051906020012090509b9a5050505050505050505050565b611f2f6129a5565b73ffffffffffffffffffffffffffffffffffffffff811615801590611f6b575073ffffffffffffffffffffffffffffffffffffffff8116600114155b611fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260016020526040902054811690821614612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303300000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600160209081526040808320805488871685528285208054919097167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790965592849052825490941690915591519081527faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691015b60405180910390a15050565b61210e6129a5565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c881815560405173ffffffffffffffffffffffffffffffffffffffff831681527f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa2906020016120fa565b6121806129a5565b73ffffffffffffffffffffffffffffffffffffffff8116158015906121bc575073ffffffffffffffffffffffffffffffffffffffff8116600114155b80156121de575073ffffffffffffffffffffffffffffffffffffffff81163014155b612244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602052604090205416156122d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff82161580159061230f575073ffffffffffffffffffffffffffffffffffffffff8216600114155b612375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260026020526040902054811690831614612408576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600260209081526040808320805487871680865283862080549289167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179055968a1685528285208054821690971790965592849052825490941690915591519081527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf910160405180910390a160405173ffffffffffffffffffffffffffffffffffffffff821681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a1505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405161253e929190613ee7565b604051908190038120612564949392918e908e908e908e908e908e908e90602001613ef7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090507f19000000000000000000000000000000000000000000000000000000000000007f010000000000000000000000000000000000000000000000000000000000000061263860007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b6126a56129a5565b6126cd817f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b09060200161141b565b61271b6129a5565b80600160035461272b9190613e1b565b1015612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff8216158015906127cf575073ffffffffffffffffffffffffffffffffffffffff8216600114155b612835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260205260409020548116908316146128c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805488861684529183208054929095167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179094559181528254909116909155600380549161294083613f74565b909155505060405173ffffffffffffffffffffffffffffffffffffffff831681527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf9060200160405180910390a180600454146129a0576129a081611426565b505050565b333014612a0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333100000000000000000000000000000000000000000000000000000060448201526064016107d8565b565b600082600003612a225750600061100a565b6000612a2e8385613c0b565b905082612a3b8583613de0565b14612a4557600080fd5b9392505050565b600080612a598385613dc8565b905083811015612a4557600080fd5b60006001836001811115612a7e57612a7e613c48565b03612a96576000808551602087018986f49050612aa6565b600080855160208701888a87f190505b95945050505050565b600081831015612abf5781612a45565b5090919050565b600082821115612ad557600080fd5b60006111708385613e1b565b60008073ffffffffffffffffffffffffffffffffffffffff831615612b065782612b08565b325b905073ffffffffffffffffffffffffffffffffffffffff8416612be757612b473a8610612b35573a612b37565b855b612b418989612a4c565b90612a10565b60405190925073ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f19350505050612be2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313100000000000000000000000000000000000000000000000000000060448201526064016107d8565b612c68565b612bf585612b418989612a4c565b9150612c028482846131cf565b612c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313200000000000000000000000000000000000000000000000000000060448201526064016107d8565b5095945050505050565b60045415612cdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303000000000000000000000000000000000000000000000000000000060448201526064016107d8565b8151811115612d47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b6001811015612db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107d8565b600160005b8351811015612fe7576000848281518110612dd457612dd4613e32565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612e32575073ffffffffffffffffffffffffffffffffffffffff8116600114155b8015612e54575073ffffffffffffffffffffffffffffffffffffffff81163014155b8015612e8c57508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b612ef2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600260205260409020541615612f81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff928316600090815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169382169390931790925580612fdf81613b49565b915050612db7565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790559051600355600455565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f5473ffffffffffffffffffffffffffffffffffffffff16156130e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303000000000000000000000000000000000000000000000000000000060448201526064016107d8565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905573ffffffffffffffffffffffffffffffffffffffff821615610962576131698260008360015a612a68565b610962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303000000000000000000000000000000000000000000000000000000060448201526064016107d8565b6040805173ffffffffffffffffffffffffffffffffffffffff841660248201526044808201849052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251600093929184919082896127105a03f13d801561327c5760208114613284576000935061328f565b81935061328f565b600051158215171593505b5050509392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146132bb57600080fd5b50565b80356132c981613299565b919050565b600080604083850312156132e157600080fd5b82356132ec81613299565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261333a57600080fd5b813567ffffffffffffffff80821115613355576133556132fa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561339b5761339b6132fa565b816040528381528660208588010111156133b457600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080608085870312156133ea57600080fd5b84359350602085013567ffffffffffffffff8082111561340957600080fd5b61341588838901613329565b9450604087013591508082111561342b57600080fd5b5061343887828801613329565b949793965093946060013593505050565b60006020828403121561345b57600080fd5b8135612a4581613299565b8035600281106132c957600080fd5b6000806000806080858703121561348b57600080fd5b843561349681613299565b935060208501359250604085013567ffffffffffffffff8111156134b957600080fd5b6134c587828801613329565b9250506134d460608601613466565b905092959194509250565b6000815180845260005b81811015613505576020818501810151868301820152016134e9565b81811115613517576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b821515815260406020820152600061117060408301846134df565b6000806040838503121561357857600080fd5b50508035926020909101359150565b602081526000612a4560208301846134df565b6000602082840312156135ac57600080fd5b5035919050565b60008083601f8401126135c557600080fd5b50813567ffffffffffffffff8111156135dd57600080fd5b6020830191508360208285010111156135f557600080fd5b9250929050565b60008060008060008060008060008060006101408c8e03121561361e57600080fd5b6136278c6132be565b9a5060208c0135995067ffffffffffffffff8060408e0135111561364a57600080fd5b61365a8e60408f01358f016135b3565b909a50985061366b60608e01613466565b975060808d0135965060a08d0135955060c08d0135945061368e60e08e016132be565b935061369d6101008e016132be565b9250806101208e013511156136b157600080fd5b506136c38d6101208e01358e01613329565b90509295989b509295989b9093969950565b6000806000606084860312156136ea57600080fd5b83359250602084013567ffffffffffffffff8082111561370957600080fd5b61371587838801613329565b9350604086013591508082111561372b57600080fd5b5061373886828701613329565b9150509250925092565b600081518084526020808501945080840160005b8381101561378857815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101613756565b509495945050505050565b602081526000612a456020830184613742565b600080604083850312156137b957600080fd5b82356137c481613299565b9150602083013567ffffffffffffffff8111156137e057600080fd5b6137ec85828601613329565b9150509250929050565b6000806000806000806000806000806101008b8d03121561381657600080fd5b8a3567ffffffffffffffff8082111561382e57600080fd5b818d0191508d601f83011261384257600080fd5b81358181111561385157600080fd5b8e60208260051b850101111561386657600080fd5b60208381019d50909b508d0135995061388160408e016132be565b985060608d013591508082111561389757600080fd5b506138a48d828e016135b3565b90975095506138b7905060808c016132be565b93506138c560a08c016132be565b925060c08b013591506138da60e08c016132be565b90509295989b9194979a5092959850565b60008060008060006080868803121561390357600080fd5b853561390e81613299565b945060208601359350604086013567ffffffffffffffff81111561393157600080fd5b61393d888289016135b3565b9094509250613950905060608701613466565b90509295509295909350565b60408152600061396f6040830185613742565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b60008060008060008060008060008060006101408c8e0312156139b657600080fd5b8b356139c181613299565b9a5060208c0135995060408c013567ffffffffffffffff8111156139e457600080fd5b6139f08e828f016135b3565b909a509850613a03905060608d01613466565b965060808c0135955060a08c0135945060c08c0135935060e08c0135613a2881613299565b92506101008c0135613a3981613299565b809250506101208c013590509295989b509295989b9093969950565b60008060408385031215613a6857600080fd5b8235613a7381613299565b91506020830135613a8381613299565b809150509250929050565b600080600060608486031215613aa357600080fd5b8335613aae81613299565b92506020840135613abe81613299565b91506040840135613ace81613299565b809150509250925092565b600080600060608486031215613aee57600080fd5b8335613af981613299565b92506020840135613b0981613299565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b7a57613b7a613b1a565b5060010190565b604081526000613b9460408301856134df565b8281036020840152612aa681856134df565b600060208284031215613bb857600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114612a4557600080fd5b600060ff821660ff841680821015613c0257613c02613b1a565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c4357613c43613b1a565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613cae577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600061016073ffffffffffffffffffffffffffffffffffffffff8f1683528d60208401528060408401528b81840152506101808b8d828501376000818d850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8d01168301613d28606085018d613c77565b8a60808501528960a08501528860c0850152613d5c60e085018973ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff87166101008501528184820301610120850152613d90828201876134df565b92505050613db761014083018473ffffffffffffffffffffffffffffffffffffffff169052565b9d9c50505050505050505050505050565b60008219821115613ddb57613ddb613b1a565b500190565b600082613e16577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082821015613e2d57613e2d613b1a565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6080808252810185905260008660a08301825b88811015613eb1578235613e8781613299565b73ffffffffffffffffffffffffffffffffffffffff16825260209283019290910190600101613e74565b506020840196909652505073ffffffffffffffffffffffffffffffffffffffff9283166040820152911660609091015292915050565b8183823760009101908152919050565b6000610160820190508c825273ffffffffffffffffffffffffffffffffffffffff808d1660208401528b60408401528a6060840152613f39608084018b613c77565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b600081613f8357613f83613b1a565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea164736f6c634300080f000a";
     bytes internal constant systemOwnerSafeCode =
         hex"6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000a";
     bytes internal constant addressManagerCode =
@@ -35,15 +35,15 @@ contract DeploymentSummaryCode {
     bytes internal constant l1ERC721BridgeProxyCode =
         hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a";
     bytes internal constant optimismPortalCode =
-        hex"6080604052600436106101625760003560e01c80638c3152e9116100c0578063c0c53b8b11610074578063e965084c11610059578063e965084c146104c7578063e9e05c4214610553578063f04987501461056657600080fd5b8063c0c53b8b14610406578063cff0ab961461042657600080fd5b80639bf62d82116100a55780639bf62d8214610370578063a14238e71461039d578063a35d99df146103cd57600080fd5b80638c3152e9146103235780639b5f694a1461034357600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102ee578063724c184c1461030e5780638b4c40b01461018757600080fd5b806354fd4d50146102735780635c975abb146102c957600080fd5b806335e80ab31161014857806335e80ab31461020c578063452a93201461023e5780634870496f1461025357600080fd5b80621c2ff61461018e57806333d7e2bd146101df57600080fd5b36610189576101873334620186a0600060405180602001604052806000815250610591565b005b600080fd5b34801561019a57600080fd5b5060365473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101eb57600080fd5b506037546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021857600080fd5b506035546101b590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024a57600080fd5b506101b561082c565b34801561025f57600080fd5b5061018761026e3660046149b4565b6108c4565b34801561027f57600080fd5b506102bc6040518060400160405280600581526020017f322e352e3000000000000000000000000000000000000000000000000000000081525081565b6040516101d69190614b06565b3480156102d557600080fd5b506102de610ef2565b60405190151581526020016101d6565b3480156102fa57600080fd5b506102de610309366004614b19565b610f85565b34801561031a57600080fd5b506101b5611040565b34801561032f57600080fd5b5061018761033e366004614b32565b61104c565b34801561034f57600080fd5b506036546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037c57600080fd5b506032546101b59073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a957600080fd5b506102de6103b8366004614b19565b60336020526000908152604090205460ff1681565b3480156103d957600080fd5b506103ed6103e8366004614b8c565b61190d565b60405167ffffffffffffffff90911681526020016101d6565b34801561041257600080fd5b50610187610421366004614ba7565b611926565b34801561043257600080fd5b5060015461048e906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101d6565b3480156104d357600080fd5b506105256104e2366004614b19565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101d6565b610187610561366004614c00565b610591565b34801561057257600080fd5b5060375473ffffffffffffffffffffffffffffffffffffffff166101b5565b8260005a905083156106485773ffffffffffffffffffffffffffffffffffffffff87161561064857604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b610652835161190d565b67ffffffffffffffff168567ffffffffffffffff1610156106f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4f7074696d69736d506f7274616c3a20676173206c696d697420746f6f20736d60448201527f616c6c0000000000000000000000000000000000000000000000000000000000606482015260840161063f565b6201d4c083511115610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f7074696d69736d506f7274616c3a206461746120746f6f206c617267650000604482015260640161063f565b33328114610784575033731111000000000000000000000000000000001111015b6000348888888860405160200161079f959493929190614c7d565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161080f9190614b06565b60405180910390a450506108238282611b90565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa15801561089b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190614ce2565b905090565b6108cc610ef2565b15610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161063f565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e747261637400606482015260840161063f565b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614d1f565b519050610aa0610a9b36869003860186614d84565b611ebd565b8114610b2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f660000000000000000000000000000000000000000000000606482015260840161063f565b6000610b3987611f19565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c4f5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4b9190614d1f565b5114155b610cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e000000000000000000606482015260840161063f565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610da49101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d9a888a614dea565b8a60400135611f49565b610e30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f660000000000000000000000000000606482015260840161063f565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f61573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190614e6e565b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810183905260009161103a9173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f9190614d1f565b602001516fffffffffffffffffffffffffffffffff16611f6d565b92915050565b60006108bf61082c565b565b611054610ef2565b156110bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161063f565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e00606482015260840161063f565b600061116f82611f19565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e207965740000000000000000000000000000606482015260840161063f565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112eb9190614e8b565b81602001516fffffffffffffffffffffffffffffffff1610156113b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a40161063f565b6113d581602001516fffffffffffffffffffffffffffffffff16611f6d565b611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a40161063f565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561150e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115329190614d1f565b82518151919250146115ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a40161063f565b61160b81602001516fffffffffffffffffffffffffffffffff16611f6d565b6116bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a40161063f565b60008381526033602052604090205460ff161561175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a65640000000000000000000000606482015260840161063f565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a08801516117fe93929190612013565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061186390841515815260200190565b60405180910390a2801580156118795750326001145b15611906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a207769746864726177616c206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161063f565b5050505050565b600061191a826010614ed3565b61103a90615208614f03565b600054610100900460ff16158080156119465750600054600160ff909116105b806119605750303b158015611960575060005460ff166001145b6119ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161063f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611a4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611b0357603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611b0b612071565b8015611b6e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611bc6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614f2f565b90506000611bd2612184565b90506000816020015160ff16826000015163ffffffff16611bf39190614f75565b90508215611d2a57600154600090611c2a908390700100000000000000000000000000000000900467ffffffffffffffff16614fdd565b90506000836040015160ff1683611c419190615051565b600154611c619084906fffffffffffffffffffffffffffffffff16615051565b611c6b9190614f75565b600154909150600090611cbc90611c959084906fffffffffffffffffffffffffffffffff1661510d565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612245565b90506001861115611ceb57611ce8611c9582876040015160ff1660018a611ce39190614f2f565b612264565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611d5d908490700100000000000000000000000000000000900467ffffffffffffffff16614f03565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d69740000606482015260840161063f565b600154600090611e6c906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615181565b90506000611e7e48633b9aca006122b9565b611e8890836151be565b905060005a611e979088614f2f565b905080821115611eb357611eb3611eae8284614f2f565b6122d0565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611efc949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611efc9790969591016151d2565b600080611f55866122fe565b9050611f6381868686612330565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120019190614e8b565b61200b9083615229565b421192915050565b6000806000612023866000612360565b905080612059576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16612108576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161063f565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660000361104a5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612221573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190615266565b600061225a612254858561237e565b8361238e565b90505b9392505050565b6000670de0b6b3a76400006122a561227c8583614f75565b61228e90670de0b6b3a7640000614fdd565b6122a085670de0b6b3a7640000615051565b61239d565b6122af9086615051565b61225a9190614f75565b6000818310156122c9578161225d565b5090919050565b6000805a90505b825a6122e39083614f2f565b10156122f9576122f282615305565b91506122d7565b505050565b6060818051906020012060405160200161231a91815260200190565b6040516020818303038152906040529050919050565b6000612357846123418786866123ce565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156122c9578161225d565b60008183126122c9578161225d565b600061225d670de0b6b3a7640000836123b586612e4c565b6123bf9190615051565b6123c99190614f75565b613090565b6060600084511161243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b65790000000000000000000000604482015260640161063f565b6000612446846132cf565b90506000612453866133bb565b905060008460405160200161246a91815260200190565b60405160208183030381529060405290506000805b8451811015612dc357600085828151811061249c5761249c61533d565b602002602001015190508451831115612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e677468000000000000000000000000000000000000606482015260840161063f565b826000036125f057805180516020918201206040516125859261255f92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6125eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f742068617368000000604482015260640161063f565b612747565b8051516020116126a6578051805160209182012060405161261a9261255f92910190815260200190565b6125eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c206861736800000000000000000000000000000000000000000000000000606482015260840161063f565b805184516020808701919091208251919092012014612747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f6520686173680000000000000000000000000000000000000000000000000000606482015260840161063f565b61275360106001615229565b8160200151510361292f57845183036128c75761278d81602001516010815181106127805761278061533d565b602002602001015161341e565b96506000875111612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e6368290000000000606482015260840161063f565b6001865161282e9190614f2f565b82146128bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e636829000000000000606482015260840161063f565b50505050505061225d565b60008584815181106128db576128db61533d565b602001015160f81c60f81b60f81c9050600082602001518260ff16815181106129065761290661533d565b602002602001015190506129198161357e565b9550612926600186615229565b94505050612db0565b600281602001515103612d28576000612947826135a3565b905060008160008151811061295e5761295e61533d565b016020015160f81c9050600061297560028361536c565b61298090600261538e565b90506000612991848360ff166135c7565b9050600061299f8a896135c7565b905060006129ad83836135fd565b905080835114612a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b6579000000000000606482015260840161063f565b60ff851660021480612a54575060ff85166003145b15612c435780825114612ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e646572000000606482015260840161063f565b612b0387602001516001815181106127805761278061533d565b9c5060008d5111612b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c6561662900000000000000606482015260840161063f565b60018c51612ba49190614f2f565b8814612c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c656166290000000000000000606482015260840161063f565b50505050505050505050505061225d565b60ff85161580612c56575060ff85166001145b15612c9557612c828760200151600181518110612c7557612c7561533d565b602002602001015161357e565b9950612c8e818a615229565b9850612d1d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e207072656669780000000000000000000000000000606482015260840161063f565b505050505050612db0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f6465000000000000000000000000000000000000000000000000606482015260840161063f565b5080612dbb81615305565b91505061247f565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e7473000000000000000000000000000000000000000000000000000000606482015260840161063f565b6000808213612eb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161063f565b60006060612ec4846136b1565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136130c157506000919050565b680755bf798b4a1bf1e58212613133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f570000000000000000000000000000000000000000604482015260640161063f565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156132ed576132ed6147d4565b60405190808252806020026020018201604052801561333257816020015b604080518082019091526060808252602082015281526020019060019003908161330b5790505b50915060005b818110156133b457604051806040016040528085838151811061335d5761335d61533d565b6020026020010151815260200161338c86848151811061337f5761337f61533d565b6020026020010151613787565b8152508382815181106133a1576133a161533d565b6020908102919091010152600101613338565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613413578060011b82018184015160001a8060041c8253600f8116600183015350506001016133e5565b509295945050505050565b6060600080600061342e8561379a565b919450925090506000816001811115613449576134496153b1565b146134d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d00000000000000606482015260840161063f565b6134e08284615229565b85511461356f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e646572000000000000000000000000606482015260840161063f565b61235785602001518484614207565b6060602082600001511061359a576135958261341e565b61103a565b61103a8261429b565b606061103a6135c283602001516000815181106127805761278061533d565b6133bb565b6060825182106135e6575060408051602081019091526000815261103a565b61225d83838486516135f89190614f2f565b6142b1565b6000808251845110613610578251613613565b83515b90505b808210801561369a57508282815181106136325761363261533d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106136715761367161533d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156136aa57816001019150613616565b5092915050565b600080821161371c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161063f565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606061103a61379583614489565b614572565b600080600080846000015111613858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161063f565b6020840151805160001a607f811161387d576000600160009450945094505050614200565b60b78111613a8b576000613892608083614f2f565b90508087600001511161394d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a40161063f565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806139c657507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a40161063f565b5060019550935060009250614200915050565b60bf8111613dd9576000613aa060b783614f2f565b905080876000015111613b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a40161063f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613c39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a40161063f565b600184015160088302610100031c60378111613cfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a40161063f565b613d078184615229565b895111613dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a40161063f565b613dc7836001615229565b97509550600094506142009350505050565b60f78111613eba576000613dee60c083614f2f565b905080876000015111613ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a40161063f565b600195509350849250614200915050565b6000613ec760f783614f2f565b905080876000015111613f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a40161063f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a40161063f565b600184015160088302610100031c60378111614124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a40161063f565b61412e8184615229565b8951116141e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a40161063f565b6141ee836001615229565b97509550600194506142009350505050565b9193909250565b60608167ffffffffffffffff811115614222576142226147d4565b6040519080825280601f01601f19166020018201604052801561424c576020820181803683370190505b509050811561225d5760006142618486615229565b90506020820160005b8481101561428257828101518282015260200161426a565b84811115614291576000858301525b5050509392505050565b606061103a826020015160008460000151614207565b60608182601f011015614320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161063f565b82828401101561438c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161063f565b818301845110156143f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161063f565b6060821580156144185760405191506000825260208201604052614480565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614451578051835260209283019201614439565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161063f565b50604080518082019091528151815260209182019181019190915290565b606060008060006145828561379a565b91945092509050600181600181111561459d5761459d6153b1565b1461462a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d0000000000000000606482015260840161063f565b84516146368385615229565b146146c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e6465720000000000000000000000000000606482015260840161063f565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816146da5790505093506000835b86518110156147c85760008061474d6040518060400160405280858c600001516147319190614f2f565b8152602001858c602001516147469190615229565b905261379a565b5091509150604051806040016040528083836147699190615229565b8152602001848b6020015161477e9190615229565b8152508885815181106147935761479361533d565b60209081029190910101526147a9600185615229565b93506147b58183615229565b6147bf9084615229565b92505050614707565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561484a5761484a6147d4565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461487457600080fd5b50565b600082601f83011261488857600080fd5b813567ffffffffffffffff8111156148a2576148a26147d4565b6148d360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614803565b8181528460208386010111156148e857600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561491757600080fd5b60405160c0810167ffffffffffffffff828210818311171561493b5761493b6147d4565b81604052829350843583526020850135915061495682614852565b8160208401526040850135915061496c82614852565b816040840152606085013560608401526080850135608084015260a085013591508082111561499a57600080fd5b506149a785828601614877565b60a0830152505092915050565b600080600080600085870360e08112156149cd57600080fd5b863567ffffffffffffffff808211156149e557600080fd5b6149f18a838b01614905565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614a2a57600080fd5b60408901955060c0890135925080831115614a4457600080fd5b828901925089601f840112614a5857600080fd5b8235915080821115614a6957600080fd5b508860208260051b8401011115614a7f57600080fd5b959894975092955050506020019190565b60005b83811015614aab578181015183820152602001614a93565b83811115611b6e5750506000910152565b60008151808452614ad4816020860160208601614a90565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061225d6020830184614abc565b600060208284031215614b2b57600080fd5b5035919050565b600060208284031215614b4457600080fd5b813567ffffffffffffffff811115614b5b57600080fd5b614b6784828501614905565b949350505050565b803567ffffffffffffffff81168114614b8757600080fd5b919050565b600060208284031215614b9e57600080fd5b61225d82614b6f565b600080600060608486031215614bbc57600080fd5b8335614bc781614852565b92506020840135614bd781614852565b91506040840135614be781614852565b809150509250925092565b801515811461487457600080fd5b600080600080600060a08688031215614c1857600080fd5b8535614c2381614852565b945060208601359350614c3860408701614b6f565b92506060860135614c4881614bf2565b9150608086013567ffffffffffffffff811115614c6457600080fd5b614c7088828901614877565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614cd1816049850160208701614a90565b919091016049019695505050505050565b600060208284031215614cf457600080fd5b815161225d81614852565b80516fffffffffffffffffffffffffffffffff81168114614b8757600080fd5b600060608284031215614d3157600080fd5b6040516060810181811067ffffffffffffffff82111715614d5457614d546147d4565b60405282518152614d6760208401614cff565b6020820152614d7860408401614cff565b60408201529392505050565b600060808284031215614d9657600080fd5b6040516080810181811067ffffffffffffffff82111715614db957614db96147d4565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614e0557614e056147d4565b8360051b6020614e16818301614803565b868152918501918181019036841115614e2e57600080fd5b865b84811015614e6257803586811115614e485760008081fd5b614e5436828b01614877565b845250918301918301614e30565b50979650505050505050565b600060208284031215614e8057600080fd5b815161225d81614bf2565b600060208284031215614e9d57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614efa57614efa614ea4565b02949350505050565b600067ffffffffffffffff808316818516808303821115614f2657614f26614ea4565b01949350505050565b600082821015614f4157614f41614ea4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614f8457614f84614f46565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614fd857614fd8614ea4565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561501757615017614ea4565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561504b5761504b614ea4565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561509257615092614ea4565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156150cd576150cd614ea4565b600087129250878205871284841616156150e9576150e9614ea4565b878505871281841616156150ff576150ff614ea4565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561514757615147614ea4565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561517b5761517b614ea4565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151b9576151b9614ea4565b500290565b6000826151cd576151cd614f46565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261521d60c0830184614abc565b98975050505050505050565b6000821982111561523c5761523c614ea4565b500190565b805163ffffffff81168114614b8757600080fd5b805160ff81168114614b8757600080fd5b600060c0828403121561527857600080fd5b60405160c0810181811067ffffffffffffffff8211171561529b5761529b6147d4565b6040526152a783615241565b81526152b560208401615255565b60208201526152c660408401615255565b60408201526152d760608401615241565b60608201526152e860808401615241565b60808201526152f960a08401614cff565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361533657615336614ea4565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff83168061537f5761537f614f46565b8060ff84160691505092915050565b600060ff821660ff8416808210156153a8576153a8614ea4565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a";
+        hex"6080604052600436106101635760003560e01c80638c3152e9116100c0578063b69ef8a811610074578063cff0ab9611610059578063cff0ab9614610444578063e965084c146104e5578063e9e05c421461057157600080fd5b8063b69ef8a814610401578063c0c53b8b1461042457600080fd5b80639bf62d82116100a55780639bf62d821461036b578063a14238e714610398578063a35d99df146103c857600080fd5b80638c3152e91461031e5780639b5f694a1461033e57600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102de57806371cfaa3f146102fe5780638b4c40b01461018857600080fd5b806354fd4d501461026d5780635c975abb146102b957600080fd5b806335e80ab31161014857806335e80ab314610206578063452a9320146102385780634870496f1461024d57600080fd5b8063149f2f221461018f57806333d7e2bd146101af57600080fd5b3661018a576101883334620186a060006040518060200160405280600081525061057f565b005b600080fd5b34801561019b57600080fd5b506101886101aa366004614b97565b610624565b3480156101bb57600080fd5b506037546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021257600080fd5b506035546101dc90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024457600080fd5b506101dc610865565b34801561025957600080fd5b50610188610268366004614ccb565b6108fd565b34801561027957600080fd5b50604080518082018252600c81527f322e382e312d626574612e310000000000000000000000000000000000000000602082015290516101fd9190614e1d565b3480156102c557600080fd5b506102ce610eaa565b60405190151581526020016101fd565b3480156102ea57600080fd5b506102ce6102f9366004614e30565b610f3d565b34801561030a57600080fd5b50610188610319366004614e58565b610ff8565b34801561032a57600080fd5b50610188610339366004614e9e565b6111ba565b34801561034a57600080fd5b506036546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037757600080fd5b506032546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a457600080fd5b506102ce6103b3366004614e30565b60336020526000908152604090205460ff1681565b3480156103d457600080fd5b506103e86103e3366004614edb565b611c3c565b60405167ffffffffffffffff90911681526020016101fd565b34801561040d57600080fd5b50610416611c55565b6040519081526020016101fd565b34801561043057600080fd5b5061018861043f366004614ef6565b611caf565b34801561045057600080fd5b506001546104ac906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101fd565b3480156104f157600080fd5b50610543610500366004614e30565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101fd565b61018861057f366004614f41565b8260005a9050600061058f611f19565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015906105cb57503415155b15610602576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610610883489898989611fb6565b5061061b8282612162565b50505050505050565b8260005a90506000610634611f19565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016106a6576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87603d60008282546106b89190614fed565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561072a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074e9190615005565b905061077273ffffffffffffffffffffffffffffffffffffffff831633308c61242f565b61077c8982614fed565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156107e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080a9190615005565b14610841576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084f8a8a8a8a8a8a611fb6565b505061085b8282612162565b5050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f8919061501e565b905090565b610905610eaa565b1561093c576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109a5576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a39919061505b565b519050610a53610a4e368690038601866150c0565b61250b565b8114610ae6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610af187612567565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c075750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c03919061505b565b5114155b610c93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610add565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610d5c9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d52888a615126565b8a60400135612597565b610de8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610add565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f19573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f891906151aa565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610ff29173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd7919061505b565b602001516fffffffffffffffffffffffffffffffff166125bb565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff163314611049576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105562030d40612661565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32908490819062030d4090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f000000000000000000000000000000000000000000000000000000001790529051611172969594939291016151c7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526111aa91614e1d565b60405180910390a450505050565b565b6111c2610eaa565b156111f9576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead1461124c576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061125782612567565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610add565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190615005565b81602001516fffffffffffffffffffffffffffffffff16101561149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610add565b6114bd81602001516fffffffffffffffffffffffffffffffff166125bb565b61156f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610add565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa1580156115f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161a919061505b565b82518151919250146116d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610add565b6116f381602001516fffffffffffffffffffffffffffffffff166125bb565b6117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610add565b60008381526033602052604090205460ff1615611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610add565b6000838152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055806118cf611f19565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016119325761192b8660400151876080015188606001518960a001516126c3565b9150611b85565b8073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff160361199b576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086015115611b5c578560600151603d60008282546119bb919061522c565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611a2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a519190615005565b9050611a86876040015188606001518473ffffffffffffffffffffffffffffffffffffffff166127219092919063ffffffff16565b6060870151611a95908261522c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190615005565b14611b5a576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08601515115611b805761192b8660400151876080015160008960a001516126c3565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405185907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611be790851515815260200190565b60405180910390a281158015611bfd5750326001145b15611c34576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000611c49826010615243565b610ff290615208615273565b600080611c60611f19565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611ca7574791505090565b5050603d5490565b600054610100900460ff1615808015611ccf5750600054600160ff909116105b80611ce95750303b158015611ce9575060005460ff166001145b611d75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610add565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611dd357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611e8c57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611e9461277c565b8015611ef757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015611f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fad919061529f565b90939092509050565b818015611fd8575073ffffffffffffffffffffffffffffffffffffffff861615155b1561200f576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120198151611c3c565b67ffffffffffffffff168367ffffffffffffffff161015612066576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0815111156120a4576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146120c5575033731111000000000000000000000000000000001111015b600086868686866040516020016120e09594939291906151c7565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516121509190614e1d565b60405180910390a45050505050505050565b600154600090612198907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361522c565b905060006121a461288f565b90506000816020015160ff16826000015163ffffffff166121c59190615308565b905082156122fc576001546000906121fc908390700100000000000000000000000000000000900467ffffffffffffffff16615370565b90506000836040015160ff168361221391906153e4565b6001546122339084906fffffffffffffffffffffffffffffffff166153e4565b61223d9190615308565b60015490915060009061228e906122679084906fffffffffffffffffffffffffffffffff166154a0565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612950565b905060018611156122bd576122ba61226782876040015160ff1660018a6122b5919061522c565b61296f565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805486919060109061232f908490700100000000000000000000000000000000900467ffffffffffffffff16615273565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156123bc576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906123e8906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615514565b905060006123fa48633b9aca006129c4565b6124049083615551565b905060005a612413908861522c565b90508082111561085b5761085b61242a828461522c565b6129db565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611ef79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a04565b6000816000015182602001518360400151846060015160405160200161254a949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a0880151935160009761254a979096959101615565565b6000806125a386612b10565b90506125b181868686612b42565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa15801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f9190615005565b6126599083614fed565b421192915050565b6001805463ffffffff8316919060109061269a908490700100000000000000000000000000000000900467ffffffffffffffff16615273565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008060006126d3866000612b72565b905080612709576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127779084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612489565b505050565b600054610100900460ff16612813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610add565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036111b85760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa15801561292c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f891906155d0565b600061296561295f8585612b90565b83612ba0565b90505b9392505050565b6000670de0b6b3a76400006129b06129878583615308565b61299990670de0b6b3a7640000615370565b6129ab85670de0b6b3a76400006153e4565b612baf565b6129ba90866153e4565b6129659190615308565b6000818310156129d45781612968565b5090919050565b6000805a90505b825a6129ee908361522c565b1015612777576129fd82615673565b91506129e2565b6000612a66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612be09092919063ffffffff16565b8051909150156127775780806020019051810190612a8491906151aa565b612777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610add565b60608180519060200120604051602001612b2c91815260200190565b6040516020818303038152906040529050919050565b6000612b6984612b53878686612bef565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156129d45781612968565b60008183126129d45781612968565b6000612968670de0b6b3a764000083612bc78661366d565b612bd191906153e4565b612bdb9190615308565b6138b1565b60606129658484600085613af0565b60606000845111612c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610add565b6000612c6784613c86565b90506000612c7486613d72565b9050600084604051602001612c8b91815260200190565b60405160208183030381529060405290506000805b84518110156135e4576000858281518110612cbd57612cbd6156ab565b602002602001015190508451831115612d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610add565b82600003612e115780518051602091820120604051612da692612d8092910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612e0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610add565b612f68565b805151602011612ec75780518051602091820120604051612e3b92612d8092910190815260200190565b612e0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610add565b805184516020808701919091208251919092012014612f68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610add565b612f7460106001614fed565b8160200151510361315057845183036130e857612fae8160200151601081518110612fa157612fa16156ab565b6020026020010151613dd5565b96506000875111613041576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610add565b6001865161304f919061522c565b82146130dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610add565b505050505050612968565b60008584815181106130fc576130fc6156ab565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110613127576131276156ab565b6020026020010151905061313a81613e89565b9550613147600186614fed565b945050506135d1565b60028160200151510361354957600061316882613eae565b905060008160008151811061317f5761317f6156ab565b016020015160f81c905060006131966002836156da565b6131a19060026156fc565b905060006131b2848360ff16613ed2565b905060006131c08a89613ed2565b905060006131ce8383613f08565b905080835114613260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610add565b60ff851660021480613275575060ff85166003145b15613464578082511461330a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610add565b6133248760200151600181518110612fa157612fa16156ab565b9c5060008d51116133b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610add565b60018c516133c5919061522c565b8814613453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610add565b505050505050505050505050612968565b60ff85161580613477575060ff85166001145b156134b6576134a38760200151600181518110613496576134966156ab565b6020026020010151613e89565b99506134af818a614fed565b985061353e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610add565b5050505050506135d1565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610add565b50806135dc81615673565b915050612ca0565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610add565b60008082136136d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610add565b600060606136e584613fbc565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136138e257506000919050565b680755bf798b4a1bf1e58212613954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610add565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613b82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610add565b73ffffffffffffffffffffffffffffffffffffffff85163b613c00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610add565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c29919061571f565b60006040518083038185875af1925050503d8060008114613c66576040519150601f19603f3d011682016040523d82523d6000602084013e613c6b565b606091505b5091509150613c7b828286614092565b979650505050505050565b80516060908067ffffffffffffffff811115613ca457613ca4614a8b565b604051908082528060200260200182016040528015613ce957816020015b6040805180820190915260608082526020820152815260200190600190039081613cc25790505b50915060005b81811015613d6b576040518060400160405280858381518110613d1457613d146156ab565b60200260200101518152602001613d43868481518110613d3657613d366156ab565b60200260200101516140e5565b815250838281518110613d5857613d586156ab565b6020908102919091010152600101613cef565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613dca578060011b82018184015160001a8060041c8253600f811660018301535050600101613d9c565b509295945050505050565b60606000806000613de5856140f8565b919450925090506000816001811115613e0057613e0061573b565b14613e37576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e418284614fed565b855114613e7a576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b6985602001518484614596565b60606020826000015110613ea557613ea082613dd5565b610ff2565b610ff28261462a565b6060610ff2613ecd8360200151600081518110612fa157612fa16156ab565b613d72565b606082518210613ef15750604080516020810190915260008152610ff2565b6129688383848651613f03919061522c565b614640565b6000808251845110613f1b578251613f1e565b83515b90505b8082108015613fa55750828281518110613f3d57613f3d6156ab565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613f7c57613f7c6156ab565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613fb557816001019150613f21565b5092915050565b6000808211614027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610add565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606083156140a1575081612968565b8251156140b15782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add9190614e1d565b6060610ff26140f383614818565b614885565b6000806000836000015160000361413b576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f811161416057600060016000945094509450505061458f565b60b7811161427657600061417560808361522c565b9050808760000151116141b4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214801561422c57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614263576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001955093506000925061458f915050565b60bf81116143d457600061428b60b78361522c565b9050808760000151116142ca576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361432c576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614374576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61437e8184614fed565b8951116143b7576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143c2836001614fed565b975095506000945061458f9350505050565b60f781116144395760006143e960c08361522c565b905080876000015111614428576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60019550935084925061458f915050565b600061444660f78361522c565b905080876000015111614485576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff000000000000000000000000000000000000000000000000000000000000001660008190036144e7576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c6037811161452f576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6145398184614fed565b895111614572576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61457d836001614fed565b975095506001945061458f9350505050565b9193909250565b60608167ffffffffffffffff8111156145b1576145b1614a8b565b6040519080825280601f01601f1916602001820160405280156145db576020820181803683370190505b50905081156129685760006145f08486614fed565b90506020820160005b848110156146115782810151828201526020016145f9565b84811115614620576000858301525b5050509392505050565b6060610ff2826020015160008460000151614596565b60608182601f0110156146af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610add565b82828401101561471b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610add565b81830184511015614788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610add565b6060821580156147a7576040519150600082526020820160405261480f565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156147e05780518352602092830192016147c8565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201528151600003614867576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b60606000806000614895856140f8565b9194509250905060018160018111156148b0576148b061573b565b146148e7576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516148f38385614fed565b1461492a576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816149415790505093506000835b8651811015614a2f576000806149b46040518060400160405280858c60000151614998919061522c565b8152602001858c602001516149ad9190614fed565b90526140f8565b5091509150604051806040016040528083836149d09190614fed565b8152602001848b602001516149e59190614fed565b8152508885815181106149fa576149fa6156ab565b6020908102919091010152614a10600185614fed565b9350614a1c8183614fed565b614a269084614fed565b9250505061496e565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114614a5d57600080fd5b50565b803567ffffffffffffffff81168114614a7857600080fd5b919050565b8015158114614a5d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614b0157614b01614a8b565b604052919050565b600082601f830112614b1a57600080fd5b813567ffffffffffffffff811115614b3457614b34614a8b565b614b6560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614aba565b818152846020838601011115614b7a57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614bb057600080fd5b8635614bbb81614a3b565b95506020870135945060408701359350614bd760608801614a60565b92506080870135614be781614a7d565b915060a087013567ffffffffffffffff811115614c0357600080fd5b614c0f89828a01614b09565b9150509295509295509295565b600060c08284031215614c2e57600080fd5b60405160c0810167ffffffffffffffff8282108183111715614c5257614c52614a8b565b816040528293508435835260208501359150614c6d82614a3b565b81602084015260408501359150614c8382614a3b565b816040840152606085013560608401526080850135608084015260a0850135915080821115614cb157600080fd5b50614cbe85828601614b09565b60a0830152505092915050565b600080600080600085870360e0811215614ce457600080fd5b863567ffffffffffffffff80821115614cfc57600080fd5b614d088a838b01614c1c565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614d4157600080fd5b60408901955060c0890135925080831115614d5b57600080fd5b828901925089601f840112614d6f57600080fd5b8235915080821115614d8057600080fd5b508860208260051b8401011115614d9657600080fd5b959894975092955050506020019190565b60005b83811015614dc2578181015183820152602001614daa565b83811115611ef75750506000910152565b60008151808452614deb816020860160208601614da7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129686020830184614dd3565b600060208284031215614e4257600080fd5b5035919050565b60ff81168114614a5d57600080fd5b60008060008060808587031215614e6e57600080fd5b8435614e7981614a3b565b93506020850135614e8981614e49565b93969395505050506040820135916060013590565b600060208284031215614eb057600080fd5b813567ffffffffffffffff811115614ec757600080fd5b614ed384828501614c1c565b949350505050565b600060208284031215614eed57600080fd5b61296882614a60565b600080600060608486031215614f0b57600080fd5b8335614f1681614a3b565b92506020840135614f2681614a3b565b91506040840135614f3681614a3b565b809150509250925092565b600080600080600060a08688031215614f5957600080fd5b8535614f6481614a3b565b945060208601359350614f7960408701614a60565b92506060860135614f8981614a7d565b9150608086013567ffffffffffffffff811115614fa557600080fd5b614fb188828901614b09565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561500057615000614fbe565b500190565b60006020828403121561501757600080fd5b5051919050565b60006020828403121561503057600080fd5b815161296881614a3b565b80516fffffffffffffffffffffffffffffffff81168114614a7857600080fd5b60006060828403121561506d57600080fd5b6040516060810181811067ffffffffffffffff8211171561509057615090614a8b565b604052825181526150a36020840161503b565b60208201526150b46040840161503b565b60408201529392505050565b6000608082840312156150d257600080fd5b6040516080810181811067ffffffffffffffff821117156150f5576150f5614a8b565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff8084111561514157615141614a8b565b8360051b6020615152818301614aba565b86815291850191818101903684111561516a57600080fd5b865b8481101561519e578035868111156151845760008081fd5b61519036828b01614b09565b84525091830191830161516c565b50979650505050505050565b6000602082840312156151bc57600080fd5b815161296881614a7d565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b60488201526000825161521b816049850160208701614da7565b919091016049019695505050505050565b60008282101561523e5761523e614fbe565b500390565b600067ffffffffffffffff8083168185168183048111821515161561526a5761526a614fbe565b02949350505050565b600067ffffffffffffffff80831681851680830382111561529657615296614fbe565b01949350505050565b600080604083850312156152b257600080fd5b82516152bd81614a3b565b60208401519092506152ce81614e49565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615317576153176152d9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561536b5761536b614fbe565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156153aa576153aa614fbe565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156153de576153de614fbe565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561542557615425614fbe565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561546057615460614fbe565b6000871292508782058712848416161561547c5761547c614fbe565b8785058712818416161561549257615492614fbe565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156154da576154da614fbe565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561550e5761550e614fbe565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561554c5761554c614fbe565b500290565b600082615560576155606152d9565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526155b060c0830184614dd3565b98975050505050505050565b805163ffffffff81168114614a7857600080fd5b600060c082840312156155e257600080fd5b60405160c0810181811067ffffffffffffffff8211171561560557615605614a8b565b604052615611836155bc565b8152602083015161562181614e49565b6020820152604083015161563481614e49565b6040820152615645606084016155bc565b6060820152615656608084016155bc565b608082015261566760a0840161503b565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036156a4576156a4614fbe565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff8316806156ed576156ed6152d9565b8060ff84160691505092915050565b600060ff821660ff84168082101561571657615716614fbe565b90039392505050565b60008251615731818460208701614da7565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a";
     bytes internal constant l1CrossDomainMessengerCode =
-        hex"6080604052600436106101805760003560e01c80635c975abb116100d6578063a4e7f8bd1161007f578063d764ad0b11610059578063d764ad0b14610463578063db505d8014610476578063ecc70428146104a357600080fd5b8063a4e7f8bd146103e3578063b1b1b20914610413578063b28ade251461044357600080fd5b806383a74074116100b057806383a74074146103a15780638cbeeef2146102b85780639fce812c146103b857600080fd5b80635c975abb1461033a5780636425666b1461035f5780636e296e451461038c57600080fd5b80633dbb202b116101385780634c1d6a69116101125780634c1d6a69146102b857806354fd4d50146102ce5780635644cfdf1461032457600080fd5b80633dbb202b1461025b5780633f827a5a14610270578063485cc9551461029857600080fd5b80630ff754ea116101695780630ff754ea146101cd5780632828d7e81461021957806335e80ab31461022e57600080fd5b8063028f85f7146101855780630c568498146101b8575b600080fd5b34801561019157600080fd5b5061019a601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101c457600080fd5b5061019a603f81565b3480156101d957600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101af565b34801561022557600080fd5b5061019a604081565b34801561023a57600080fd5b5060fb546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b61026e610269366004611a22565b610508565b005b34801561027c57600080fd5b50610285600181565b60405161ffff90911681526020016101af565b3480156102a457600080fd5b5061026e6102b3366004611a89565b610765565b3480156102c457600080fd5b5061019a619c4081565b3480156102da57600080fd5b506103176040518060400160405280600581526020017f322e332e3000000000000000000000000000000000000000000000000000000081525081565b6040516101af9190611b2d565b34801561033057600080fd5b5061019a61138881565b34801561034657600080fd5b5061034f6109d3565b60405190151581526020016101af565b34801561036b57600080fd5b5060fc546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039857600080fd5b506101f4610a6c565b3480156103ad57600080fd5b5061019a62030d4081565b3480156103c457600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101f4565b3480156103ef57600080fd5b5061034f6103fe366004611b47565b60ce6020526000908152604090205460ff1681565b34801561041f57600080fd5b5061034f61042e366004611b47565b60cb6020526000908152604090205460ff1681565b34801561044f57600080fd5b5061019a61045e366004611b60565b610b53565b61026e610471366004611bb4565b610bc1565b34801561048257600080fd5b5060cf546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104af57600080fd5b506104fa60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101af565b60cf5461063a9073ffffffffffffffffffffffffffffffffffffffff16610530858585610b53565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061059c60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016105b89796959493929190611c83565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526114f2565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856106bf60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516106d1959493929190611ce2565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b6000547501000000000000000000000000000000000000000000900460ff16158080156107b0575060005460017401000000000000000000000000000000000000000090910460ff16105b806107e25750303b1580156107e2575060005474010000000000000000000000000000000000000000900460ff166001145b610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905580156108f957600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc80549285169290911691909117905561096b73420000000000000000000000000000000000000761158b565b80156109ce57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a679190611d30565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f74207365740000000000000000000000606482015260840161086a565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f610b6f604063ffffffff8816611d81565b610b799190611db1565b610b84601088611d81565b610b919062030d40611dff565b610b9b9190611dff565b610ba59190611dff565b610baf9190611dff565b610bb99190611dff565b949350505050565b610bc96109d3565b15610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a2070617573656400000000604482015260640161086a565b60f087901c60028110610ceb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161086a565b8061ffff16600003610de0576000610d3c878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506116c7915050565b600081815260cb602052604090205490915060ff1615610dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161086a565b505b6000610e26898989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116e692505050565b9050610e30611709565b15610e6857853414610e4457610e44611e2b565b600081815260ce602052604090205460ff1615610e6357610e63611e2b565b610fba565b3415610f1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a40161086a565b600081815260ce602052604090205460ff16610fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161086a565b610fc3876117e5565b15611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161086a565b600081815260cb602052604090205460ff1615611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161086a565b61113685611127611388619c40611dff565b67ffffffffffffffff1661182b565b158061115c575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561127557600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b50506114cd565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061130688619c405a6112c99190611e5a565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061184992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156113bc57600082815260cb602052604090205460ff161561135957611359611e2b565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26114c9565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611553908890839089906000908990600401611e71565b6000604051808303818588803b15801561156c57600080fd5b505af1158015611580573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161086a565b60cc5473ffffffffffffffffffffffffffffffffffffffff166116805760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006116d585858585611863565b805190602001209050949350505050565b60006116f68787878787876118fc565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff1633148015610a67575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190611ec9565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611825575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60608484848460405160240161187c9493929190611ee6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161191996959493929190611f30565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146119bd57600080fd5b50565b60008083601f8401126119d257600080fd5b50813567ffffffffffffffff8111156119ea57600080fd5b602083019150836020828501011115611a0257600080fd5b9250929050565b803563ffffffff81168114611a1d57600080fd5b919050565b60008060008060608587031215611a3857600080fd5b8435611a438161199b565b9350602085013567ffffffffffffffff811115611a5f57600080fd5b611a6b878288016119c0565b9094509250611a7e905060408601611a09565b905092959194509250565b60008060408385031215611a9c57600080fd5b8235611aa78161199b565b91506020830135611ab78161199b565b809150509250929050565b6000815180845260005b81811015611ae857602081850181015186830182015201611acc565b81811115611afa576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611b406020830184611ac2565b9392505050565b600060208284031215611b5957600080fd5b5035919050565b600080600060408486031215611b7557600080fd5b833567ffffffffffffffff811115611b8c57600080fd5b611b98868287016119c0565b9094509250611bab905060208501611a09565b90509250925092565b600080600080600080600060c0888a031215611bcf57600080fd5b873596506020880135611be18161199b565b95506040880135611bf18161199b565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611c1b57600080fd5b611c278a828b016119c0565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611cd560c083018486611c3a565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611d12608083018688611c3a565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611d4257600080fd5b81518015158114611b4057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611da857611da8611d52565b02949350505050565b600067ffffffffffffffff80841680611df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611e2257611e22611d52565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611e6c57611e6c611d52565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611ebe60a0830184611ac2565b979650505050505050565b600060208284031215611edb57600080fd5b8151611b408161199b565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611f1f6080830185611ac2565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611f7b60c0830184611ac2565b9897505050505050505056fea164736f6c634300080f000a";
+        hex"60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdf565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ba9190611cb1565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611ccb565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611ccb565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce4565b6109bd565b34801561048757600080fd5b506102a6610496366004611d38565b610a2b565b6102a66104a9366004611d83565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eb1565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611eff565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f50565b6109e39190611f80565b6109ee601088611f50565b6109fb9062030d40611fce565b610a059190611fce565b610a0f9190611fce565b610a199190611fce565b610a239190611fce565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ffa565b600081815260ce602052604090205460ff1615610f4457610f44611ffa565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fce565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612029565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ffa565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611983565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611673908890839089906000908990600401612040565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a20565b805190602001209050949350505050565b6000611816878787878787611ab9565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612098565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906120b5565b90939092509050565b606084848484604051602401611a3994939291906120f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad69695949392919061213f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7a57600080fd5b50565b60008083601f840112611b8f57600080fd5b50813567ffffffffffffffff811115611ba757600080fd5b602083019150836020828501011115611bbf57600080fd5b9250929050565b803563ffffffff81168114611bda57600080fd5b919050565b60008060008060608587031215611bf557600080fd5b8435611c0081611b58565b9350602085013567ffffffffffffffff811115611c1c57600080fd5b611c2887828801611b7d565b9094509250611c3b905060408601611bc6565b905092959194509250565b6000815180845260005b81811015611c6c57602081850181015186830182015201611c50565b81811115611c7e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc46020830184611c46565b9392505050565b600060208284031215611cdd57600080fd5b5035919050565b600080600060408486031215611cf957600080fd5b833567ffffffffffffffff811115611d1057600080fd5b611d1c86828701611b7d565b9094509250611d2f905060208501611bc6565b90509250925092565b600080600060608486031215611d4d57600080fd5b8335611d5881611b58565b92506020840135611d6881611b58565b91506040840135611d7881611b58565b809150509250925092565b600080600080600080600060c0888a031215611d9e57600080fd5b873596506020880135611db081611b58565b95506040880135611dc081611b58565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611dea57600080fd5b611df68a828b01611b7d565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea460c083018486611e09565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611ee1608083018688611e09565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f1157600080fd5b81518015158114611cc457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7757611f77611f21565b02949350505050565b600067ffffffffffffffff80841680611fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ff157611ff1611f21565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203b5761203b611f21565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208d60a0830184611c46565b979650505050505050565b6000602082840312156120aa57600080fd5b8151611cc481611b58565b600080604083850312156120c857600080fd5b82516120d381611b58565b602084015190925060ff811681146120ea57600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212e6080830185611c46565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218a60c0830184611c46565b9897505050505050505056fea164736f6c634300080f000a";
     bytes internal constant l2OutputOracleCode =
         hex"60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a";
     bytes internal constant systemConfigCode =
-        hex"608060405234801561001057600080fd5b50600436106102415760003560e01c8063935f029e11610145578063dac6e63a116100bd578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610597578063fd32aa0f1461059f578063ffa1ad74146105a757600080fd5b8063f45e65d81461057a578063f68016b71461058357600080fd5b8063dac6e63a1461054e578063e0e2016d14610556578063e81b2c6d1461055e578063f2fde38b1461056757600080fd5b8063bc49ce5f11610114578063c71973f6116100f9578063c71973f6146103f4578063c9b26f6114610407578063cc731b021461041a57600080fd5b8063bc49ce5f146103e4578063c4e8ddfa146103ec57600080fd5b8063935f029e146103ae5780639b7d7f0a146103c1578063a7119869146103c9578063b40a817c146103d157600080fd5b806348cd4cb1116101d857806354fd4d50116101a757806361d157681161018c57806361d1576814610380578063715018a6146103885780638da5cb5b1461039057600080fd5b806354fd4d501461032f5780635d73369c1461037857600080fd5b806348cd4cb1146102d75780634add321d146102df5780634d9f1559146103005780634f16540b1461030857600080fd5b80630c18c162116102145780630c18c162146102ab57806318d13918146102b457806319f5cea8146102c75780631fd19ee1146102cf57600080fd5b806306c9265714610246578063078f29cf146102615780630a49cb031461028e5780630bbb796814610296575b600080fd5b61024e6105af565b6040519081526020015b60405180910390f35b6102696105dd565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610258565b610269610616565b6102a96102a4366004611928565b610646565b005b61024e60655481565b6102a96102c2366004611a55565b610a44565b61024e610a58565b610269610a83565b61024e610aad565b6102e7610add565b60405167ffffffffffffffff9091168152602001610258565b610269610b03565b61024e7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b61036b6040518060400160405280600681526020017f312e31322e30000000000000000000000000000000000000000000000000000081525081565b6040516102589190611ae2565b61024e610b33565b61024e610b5e565b6102a9610b89565b60335473ffffffffffffffffffffffffffffffffffffffff16610269565b6102a96103bc366004611af5565b610b9d565b610269610bb3565b610269610be3565b6102a96103df366004611b17565b610c13565b61024e610c24565b610269610c4f565b6102a9610402366004611b32565b610c7f565b6102a9610415366004611b4e565b610c90565b6104de6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102589190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b610269610ca1565b61024e610cd1565b61024e60675481565b6102a9610575366004611a55565b610cfc565b61024e60665481565b6068546102e79067ffffffffffffffff1681565b61024e610db0565b61024e610ddb565b61024e600081565b6105da60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b81565b600061061161060d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b5490565b905090565b600061061161060d60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b600054610100900460ff16158080156106665750600054600160ff909116105b806106805750303b158015610680575060005460ff166001145b610711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561076f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610777610e2a565b6107808a610cfc565b61078987610ec9565b6107938989610f2a565b61079c86610fbb565b6107c57f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b6107f86107f360017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b849055565b61082c61082660017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b83519055565b61086361085a60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b60208401519055565b61089a61089160017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b60408401519055565b6108d16108c860017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b60608401519055565b6109086108ff60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b60808401519055565b61093f61093660017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b60a08401519055565b610947611099565b61095084611101565b610958610add565b67ffffffffffffffff168667ffffffffffffffff1610156109d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b8015610a3857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b610a4c611575565b610a55816115f6565b50565b6105da60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b60006106117f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b600061061161060d60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b6069546000906106119063ffffffff6a0100000000000000000000820481169116611bad565b600061061161060d60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b6105da60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b6105da60017fe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871816611b96565b610b91611575565b610b9b600061167a565b565b610ba5611575565b610baf8282610f2a565b5050565b600061061161060d60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d611b96565b600061061161060d60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637611b96565b610c1b611575565b610a5581610fbb565b6105da60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b600061061161060d60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8611b96565b610c87611575565b610a5581611101565b610c98611575565b610a5581610ec9565b600061061161060d60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598611b96565b6105da60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b610d04611575565b73ffffffffffffffffffffffffffffffffffffffff8116610da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610708565b610a558161167a565b6105da60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377611b96565b6105da60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad611b96565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b5490565b600054610100900460ff16610ec1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610708565b610b9b6116f1565b60678190556040805160208082018490528251808303909101815290820190915260005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610f1e9190611ae2565b60405180910390a35050565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051610fae9190611ae2565b60405180910390a3505050565b610fc3610add565b67ffffffffffffffff168167ffffffffffffffff161015611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002610eed565b6110c761060d60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b600003610b9b57610b9b6110fc60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0611b96565b439055565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff1611156111b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610708565b6001816040015160ff1611611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610708565b6068546080820151825167ffffffffffffffff909216916112699190611bd9565b63ffffffff1611156112d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610708565b6000816020015160ff161161136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610708565b8051602082015163ffffffff82169160ff9091169061138e908290611bf8565b6113989190611c42565b63ffffffff161461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610708565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610708565b61161f7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290506003610eed565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610708565b610b9b3361167a565b803573ffffffffffffffffffffffffffffffffffffffff811681146117b557600080fd5b919050565b803567ffffffffffffffff811681146117b557600080fd5b60405160c0810167ffffffffffffffff8111828210171561181c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b803563ffffffff811681146117b557600080fd5b803560ff811681146117b557600080fd5b600060c0828403121561185957600080fd5b60405160c0810181811067ffffffffffffffff821117156118a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806118b283611822565b81526118c060208401611836565b60208201526118d160408401611836565b60408201526118e260608401611822565b60608201526118f360808401611822565b608082015260a08301356fffffffffffffffffffffffffffffffff8116811461191b57600080fd5b60a0919091015292915050565b6000806000806000806000806000898b0361026081121561194857600080fd5b6119518b611791565b995060208b0135985060408b0135975060608b0135965061197460808c016117ba565b955061198260a08c01611791565b94506119918c60c08d01611847565b93506119a06101808c01611791565b925060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60820112156119d257600080fd5b506119db6117d2565b6119e86101a08c01611791565b81526119f76101c08c01611791565b6020820152611a096101e08c01611791565b6040820152611a1b6102008c01611791565b6060820152611a2d6102208c01611791565b6080820152611a3f6102408c01611791565b60a0820152809150509295985092959850929598565b600060208284031215611a6757600080fd5b611a7082611791565b9392505050565b6000815180845260005b81811015611a9d57602081850181015186830182015201611a81565b81811115611aaf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a706020830184611a77565b60008060408385031215611b0857600080fd5b50508035926020909101359150565b600060208284031215611b2957600080fd5b611a70826117ba565b600060c08284031215611b4457600080fd5b611a708383611847565b600060208284031215611b6057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611ba857611ba8611b67565b500390565b600067ffffffffffffffff808316818516808303821115611bd057611bd0611b67565b01949350505050565b600063ffffffff808316818516808303821115611bd057611bd0611b67565b600063ffffffff80841680611c36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff80831681851681830481118215151615611c6557611c65611b67565b0294935050505056fea164736f6c634300080f000a";
+        hex"608060405234801561001057600080fd5b50600436106102de5760003560e01c8063a711986911610186578063e0e2016d116100e3578063f2fde38b11610097578063f8c68de011610071578063f8c68de0146106e2578063fd32aa0f146106ea578063ffa1ad74146106f257600080fd5b8063f2fde38b146106b2578063f45e65d8146106c5578063f68016b7146106ce57600080fd5b8063e81b2c6d116100c8578063e81b2c6d14610681578063ec7075171461068a578063f2b4e617146106aa57600080fd5b8063e0e2016d14610671578063e2a3285c1461067957600080fd5b8063c9b26f611161013a578063d84447151161011f578063d84447151461064e578063dac6e63a14610656578063db9040fa1461065e57600080fd5b8063c9b26f6114610507578063cc731b021461051a57600080fd5b8063bc49ce5f1161016b578063bc49ce5f146104c6578063bfb14fb7146104ce578063c4e8ddfa146104ff57600080fd5b8063a7119869146104ab578063b40a817c146104b357600080fd5b80634397dfef1161023f578063550fcdc9116101f35780638da5cb5b116101cd5780638da5cb5b14610472578063935f029e146104905780639b7d7f0a146104a357600080fd5b8063550fcdc91461045a5780635d73369c14610462578063715018a61461046a57600080fd5b80634add321d116102245780634add321d146103e95780634f16540b146103f157806354fd4d501461041857600080fd5b80634397dfef146103ab57806348cd4cb1146103e157600080fd5b806318d13918116102965780631fd19ee11161027b5780631fd19ee114610378578063213268491461038057806321d7fde51461039857600080fd5b806318d139181461035b57806319f5cea81461037057600080fd5b80630a49cb03116102c75780630a49cb031461032b5780630ae14b1b146103335780630c18c1621461035257600080fd5b806306c92657146102e3578063078f29cf146102fe575b600080fd5b6102eb6106fa565b6040519081526020015b60405180910390f35b610306610728565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f5565b610306610761565b630bebc2005b60405167ffffffffffffffff90911681526020016102f5565b6102eb60655481565b61036e610369366004612241565b610791565b005b6102eb6107a5565b6103066107d0565b6103886107fa565b60405190151581526020016102f5565b61036e6103a6366004612277565b610839565b6103b361084f565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016102f5565b6102eb610863565b610339610893565b6102eb7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b60408051808201909152600c81527f322e332e302d626574612e32000000000000000000000000000000000000000060208201525b6040516102f59190612320565b61044d6108b9565b6102eb6108c3565b61036e6108ee565b60335473ffffffffffffffffffffffffffffffffffffffff16610306565b61036e61049e366004612333565b610902565b610306610914565b610306610944565b61036e6104c136600461236d565b610974565b6102eb610985565b6068546104ea9068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f5565b6103066109b0565b61036e610515366004612388565b6109e0565b6105de6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102f59190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61044d6109f1565b6103066109fb565b61036e61066c3660046124bb565b610a2b565b6102eb610e36565b6102eb610e61565b6102eb60675481565b6068546104ea906c01000000000000000000000000900463ffffffff1681565b610306610e8c565b61036e6106c0366004612241565b610ebc565b6102eb60665481565b6068546103399067ffffffffffffffff1681565b6102eb610f70565b6102eb610f9b565b6102eb600081565b61072560017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b81565b600061075c61075860017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b5490565b905090565b600061075c61075860017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b610799611201565b6107a281611282565b50565b61072560017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b600061075c7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b60008061080561084f565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b610841611201565b61084b828261133f565b5050565b60008061085a611184565b90939092509050565b600061075c61075860017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b60695460009061075c9063ffffffff6a0100000000000000000000820481169116612654565b606061075c61147d565b61072560017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b6108f6611201565b610900600061153e565b565b61090a611201565b61084b82826115b5565b600061075c61075860017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b600061075c61075860017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b61097c611201565b6107a28161168b565b61072560017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b600061075c61075860017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b6109e8611201565b6107a2816117e1565b606061075c611809565b600061075c61075860017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b600054610100900460ff1615808015610a4b5750600054600160ff909116105b80610a655750303b158015610a65575060005460ff166001145b610af6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b5457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b5c6118bf565b610b658a610ebc565b610b6e876117e1565b610b78898961133f565b610b818661168b565b610baa7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b610bdd610bd860017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b849055565b610c11610c0b60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b83519055565b610c48610c3f60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b60208401519055565b610c7f610c7660017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b60408401519055565b610cb6610cad60017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b60608401519055565b610ced610ce460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b60808401519055565b610d24610d1b60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b60a08401519055565b610d2c61195e565b610d398260c001516119c6565b610d4284611cd0565b610d4a610893565b67ffffffffffffffff168667ffffffffffffffff161015610dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b8015610e2a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61072560017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b61072560017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b600061075c61075860017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b610ec4611201565b73ffffffffffffffffffffffffffffffffffffffff8116610f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610aed565b6107a28161153e565b61072560017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b61072560017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600060208251111561107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e203332206279746573000000000000000000006064820152608401610aed565b6110838261115b565b92915050565b6110ef6110b760017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec61263d565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b61112261111d60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d61263d565b839055565b61115561115060017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd0576461263d565b829055565b50505050565b8051602181106111735763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b600080806111b661075860017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec61263d565b73ffffffffffffffffffffffffffffffffffffffff811693509050826111f5575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b60335473ffffffffffffffffffffffffffffffffffffffff163314610900576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aed565b6112ab7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516113339190612320565b60405180910390a35050565b606880547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000063ffffffff8581169182027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16929092176c0100000000000000000000000092851692909202919091179091557f0100000000000000000000000000000000000000000000000000000000000000602083811b67ffffffff000000001690921717606681905560655460408051938401919091528201526000906060015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516114709190612320565b60405180910390a3505050565b60606000611489611184565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161150257505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b61153861153361075860017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd0576461263d565b612144565b91505090565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7fff00000000000000000000000000000000000000000000000000000000000000811615611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f53797374656d436f6e6669673a207363616c61722065786365656473206d617860448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610aed565b60658290556066819055604080516020810184905290810182905260009060600161140d565b611693610893565b67ffffffffffffffff168167ffffffffffffffff161015611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b630bebc20067ffffffffffffffff82161115611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f20686967686044820152606401610aed565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611302565b6067819055604080516020808201849052825180830390910181529082019091526000611302565b60606000611815611184565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161188e57505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b61153861153361075860017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d61263d565b600054610100900460ff16611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610aed565b610900612178565b61198c61075860017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b600003610900576109006119c160017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b439055565b73ffffffffffffffffffffffffffffffffffffffff811615801590611a15575073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b8015611a265750611a246107fa565b155b156107a257601260ff168173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f9190612680565b60ff1614611b2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201527f7320706179696e6720746f6b656e0000000000000000000000000000000000006064820152608401610aed565b6000611bca8273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b7f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611bc5919081019061269d565b610fe6565b90506000611c1c8373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b7f573d6000803e3d6000fd5b9050611c2b8360128484611089565b611c33610761565b6040517f71cfaa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b158015611cb357600080fd5b505af1158015611cc7573d6000803e3d6000fd5b50505050505050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611d80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610aed565b6001816040015160ff1611611e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610aed565b6068546080820151825167ffffffffffffffff90921691611e389190612768565b63ffffffff161115611ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b6000816020015160ff1611611f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610aed565b8051602082015163ffffffff82169160ff90911690611f5d908290612787565b611f6791906127d1565b63ffffffff1614611ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610aed565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60405160005b82811a1561215a5760010161214a565b80825260208201838152600082820152505060408101604052919050565b600054610100900460ff1661220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610aed565b6109003361153e565b803573ffffffffffffffffffffffffffffffffffffffff8116811461223c57600080fd5b919050565b60006020828403121561225357600080fd5b61225c82612218565b9392505050565b803563ffffffff8116811461223c57600080fd5b6000806040838503121561228a57600080fd5b61229383612263565b91506122a160208401612263565b90509250929050565b60005b838110156122c55781810151838201526020016122ad565b838111156111555750506000910152565b600081518084526122ee8160208601602086016122aa565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061225c60208301846122d6565b6000806040838503121561234657600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461223c57600080fd5b60006020828403121561237f57600080fd5b61225c82612355565b60006020828403121561239a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156123f3576123f36123a1565b60405290565b60ff811681146107a257600080fd5b600060e0828403121561241a57600080fd5b60405160e0810181811067ffffffffffffffff8211171561243d5761243d6123a1565b60405290508061244c83612218565b815261245a60208401612218565b602082015261246b60408401612218565b604082015261247c60608401612218565b606082015261248d60808401612218565b608082015261249e60a08401612218565b60a08201526124af60c08401612218565b60c08201525092915050565b6000806000806000806000806000898b036102808112156124db57600080fd5b6124e48b612218565b99506124f260208c01612263565b985061250060408c01612263565b975060608b0135965061251560808c01612355565b955061252360a08c01612218565b945060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201121561255557600080fd5b5061255e6123d0565b61256a60c08c01612263565b815260e08b013561257a816123f9565b60208201526101008b013561258e816123f9565b60408201526125a06101208c01612263565b60608201526125b26101408c01612263565b60808201526101608b01356fffffffffffffffffffffffffffffffff811681146125db57600080fd5b60a082015292506125ef6101808b01612218565b91506125ff8b6101a08c01612408565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561264f5761264f61260e565b500390565b600067ffffffffffffffff8083168185168083038211156126775761267761260e565b01949350505050565b60006020828403121561269257600080fd5b815161225c816123f9565b6000602082840312156126af57600080fd5b815167ffffffffffffffff808211156126c757600080fd5b818401915084601f8301126126db57600080fd5b8151818111156126ed576126ed6123a1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715612733576127336123a1565b8160405282815287602084870101111561274c57600080fd5b61275d8360208301602088016122aa565b979650505050505050565b600063ffffffff8083168185168083038211156126775761267761260e565b600063ffffffff808416806127c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff808316818516818304811182151516156127f4576127f461260e565b0294935050505056fea164736f6c634300080f000a";
     bytes internal constant l1StandardBridgeCode =
-        hex"6080604052600436106101795760003560e01c80637f46ddb2116100cb578063927ede2d1161007f578063b1a1a88211610059578063b1a1a882146104fe578063c89701a214610511578063e11013dd1461053e57600080fd5b8063927ede2d146104a05780639a2ac6d5146104cb578063a9f9e675146104de57600080fd5b806387087623116100b0578063870876231461043a5780638f601f661461045a57806391c49bf8146103ef57600080fd5b80637f46ddb2146103ef578063838b25201461041a57600080fd5b80633cb747bf1161012d57806354fd4d501161010757806354fd4d501461035457806358a997f6146103aa5780635c975abb146103ca57600080fd5b80633cb747bf146102e7578063485cc95514610314578063540abf731461033457600080fd5b80631532ec341161015e5780631532ec341461026a5780631635f5fd1461027d57806335e80ab31461029057600080fd5b80630166a07a1461023757806309fc88431461025757600080fd5b3661023257333b15610212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b610230333362030d406040518060200160405280600081525061056d565b005b600080fd5b34801561024357600080fd5b506102306102523660046126b1565b610580565b610230610265366004612762565b61099a565b6102306102783660046127b5565b610a71565b61023061028b3660046127b5565b610a85565b34801561029c57600080fd5b506032546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102f357600080fd5b506003546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032057600080fd5b5061023061032f366004612828565b610f4e565b34801561034057600080fd5b5061023061034f366004612861565b611137565b34801561036057600080fd5b5061039d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102de919061294e565b3480156103b657600080fd5b506102306103c5366004612961565b61117c565b3480156103d657600080fd5b506103df611250565b60405190151581526020016102de565b3480156103fb57600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102bd565b34801561042657600080fd5b50610230610435366004612861565b6112e9565b34801561044657600080fd5b50610230610455366004612961565b61132e565b34801561046657600080fd5b50610492610475366004612828565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102de565b3480156104ac57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102bd565b6102306104d93660046129e4565b611402565b3480156104ea57600080fd5b506102306104f93660046126b1565b611444565b61023061050c366004612762565b611453565b34801561051d57600080fd5b506004546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b61023061054c3660046129e4565b611524565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61057a8484348585611567565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610653575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b9190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b61070d611250565b15610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b61077d87611731565b156108cb5761078c8787611793565b61083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108ae57600080fd5b505af11580156108c2573d6000803e3d6000fd5b5050505061094d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610909908490612a93565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c168352939052919091209190915561094d9085856118b3565b610991878787878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061198792505050565b50505050505050565b333b15610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c3333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b505050565b610a7e8585858585610a85565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b58575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b409190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b610c12611250565b15610c79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b823414610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610209565b3073ffffffffffffffffffffffffffffffffffffffff851603610dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610209565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610209565b610e9a85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a1592505050565b6000610eb7855a8660405180602001604052806000815250611a88565b905080610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610209565b505050505050565b600054610100900460ff1615808015610f6e5750600054600160ff909116105b80610f885750303b158015610f88575060005460ff166001145b611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610209565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556110d083734200000000000000000000000000000000000010611aa2565b8015610a6c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b333b1561120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156112c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e49190612aaa565b905090565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b333b156113bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b61057a33858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61099187878787878787610580565b333b156114e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61057a3385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b8234146115f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610209565b61160285858584611ec6565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd0000000000000000000000000000000000000000000000000000000090611665908b908b9086908a90602401612acc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526116f892918890600401612b15565b6000604051808303818588803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b50505050505050505050565b600061175d827f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b8061178d575061178d827fec4fc8e300000000000000000000000000000000000000000000000000000000611f39565b92915050565b60006117bf837f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b15611868578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118339190612a47565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905061178d565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a6c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611f5c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b38686866040516119ff93929190612b5a565b60405180910390a4610f46868686868686612068565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611a74929190612b98565b60405180910390a361057a848484846120f0565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610209565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b611b9587611731565b15611ce357611ba48787611793565b611c56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611cc657600080fd5b505af1158015611cda573d6000803e3d6000fd5b50505050611d77565b611d0573ffffffffffffffffffffffffffffffffffffffff881686308661215d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611d43908490612bb1565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611d858787878787866121bb565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611de9908b908d908c908c908c908b90602401612bc9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611e7c92918790600401612b15565b600060405180830381600087803b158015611e9657600080fd5b505af1158015611eaa573d6000803e3d6000fd5b5050505050505050505050565b61099187878787878787611b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f238484604051611f25929190612b98565b60405180910390a361057a84848484612249565b6000611f44836122a8565b8015611f555750611f55838361230c565b9392505050565b6000611fbe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123db9092919063ffffffff16565b805190915015610a6c5780806020019051810190611fdc9190612aaa565b610a6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610209565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8686866040516120e093929190612b5a565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d848460405161214f929190612b98565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261057a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611905565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161223393929190612b5a565b60405180910390a4610f468686868686866123f2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5848460405161214f929190612b98565b60006122d4827f01ffc9a70000000000000000000000000000000000000000000000000000000061230c565b801561178d5750612305827fffffffff0000000000000000000000000000000000000000000000000000000061230c565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156123c4575060208210155b80156123d05750600081115b979650505050505050565b60606123ea848460008561246a565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8686866040516120e093929190612b5a565b6060824710156124fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610209565b73ffffffffffffffffffffffffffffffffffffffff85163b61257a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610209565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125a39190612c24565b60006040518083038185875af1925050503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b50915091506123d0828286606083156125ff575081611f55565b82511561260f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610209919061294e565b73ffffffffffffffffffffffffffffffffffffffff8116811461266557600080fd5b50565b60008083601f84011261267a57600080fd5b50813567ffffffffffffffff81111561269257600080fd5b6020830191508360208285010111156126aa57600080fd5b9250929050565b600080600080600080600060c0888a0312156126cc57600080fd5b87356126d781612643565b965060208801356126e781612643565b955060408801356126f781612643565b9450606088013561270781612643565b93506080880135925060a088013567ffffffffffffffff81111561272a57600080fd5b6127368a828b01612668565b989b979a50959850939692959293505050565b803563ffffffff8116811461275d57600080fd5b919050565b60008060006040848603121561277757600080fd5b61278084612749565b9250602084013567ffffffffffffffff81111561279c57600080fd5b6127a886828701612668565b9497909650939450505050565b6000806000806000608086880312156127cd57600080fd5b85356127d881612643565b945060208601356127e881612643565b935060408601359250606086013567ffffffffffffffff81111561280b57600080fd5b61281788828901612668565b969995985093965092949392505050565b6000806040838503121561283b57600080fd5b823561284681612643565b9150602083013561285681612643565b809150509250929050565b600080600080600080600060c0888a03121561287c57600080fd5b873561288781612643565b9650602088013561289781612643565b955060408801356128a781612643565b9450606088013593506128bc60808901612749565b925060a088013567ffffffffffffffff81111561272a57600080fd5b60005b838110156128f35781810151838201526020016128db565b8381111561057a5750506000910152565b6000815180845261291c8160208601602086016128d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f556020830184612904565b60008060008060008060a0878903121561297a57600080fd5b863561298581612643565b9550602087013561299581612643565b9450604087013593506129aa60608801612749565b9250608087013567ffffffffffffffff8111156129c657600080fd5b6129d289828a01612668565b979a9699509497509295939492505050565b600080600080606085870312156129fa57600080fd5b8435612a0581612643565b9350612a1360208601612749565b9250604085013567ffffffffffffffff811115612a2f57600080fd5b612a3b87828801612668565b95989497509550505050565b600060208284031215612a5957600080fd5b8151611f5581612643565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612aa557612aa5612a64565b500390565b600060208284031215612abc57600080fd5b81518015158114611f5557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612b0b6080830184612904565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612b446060830185612904565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612b8f6060830184612904565b95945050505050565b8281526040602082015260006123ea6040830184612904565b60008219821115612bc457612bc4612a64565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612c1860c0830184612904565b98975050505050505050565b60008251612c368184602087016128d8565b919091019291505056fea164736f6c634300080f000a";
+        hex"6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612993565b6105b8565b61023b610270366004612a44565b6109d2565b61023b610283366004612a97565b610aa9565b61023b610296366004612a97565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612b0a565b61101b565b34801561037857600080fd5b506103b56040518060400160405280600581526020017f322e322e3000000000000000000000000000000000000000000000000000000081525081565b6040516102e99190612bf7565b3480156103ce57600080fd5b5061023b6103dd366004612c0a565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612b0a565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612c0a565b611212565b34801561047e57600080fd5b506104aa61048d366004612c8d565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612cc6565b6112e6565b34801561050257600080fd5b5061023b610511366004612993565b611328565b61023b610524366004612a44565b611337565b34801561053557600080fd5b5061023b610544366004612d29565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612cc6565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612dc0565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612dd7565b905090565b6109c987873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f84734200000000000000000000000000000000000010612021565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a8585858461210b565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612df9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612e42565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b806119055750611905827fec4fc8e30000000000000000000000000000000000000000000000000000000061217e565b92915050565b6000611937837f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612d74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526121a1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612e87565b60405180910390a46110138686868686866122ad565b600080611b98612335565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612ec5565b60405180910390a36105b2848484846123d2565b600080600080845160208601878a8af19695505050505050565b3415611ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610214565b611cf0876118a9565b15611e3e57611cff878761190b565b611db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b50505050611ed2565b611e6073ffffffffffffffffffffffffffffffffffffffff881686308661243f565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e9e908490612ede565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611ee087878787878661249d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611f44908b908d908c908c908c908b90602401612ef6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611fd792918790600401612e42565b600060405180830381600087803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c59565b600054610100900460ff166120b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23848460405161216a929190612ec5565b60405180910390a36105b28484848461252b565b60006121898361258a565b801561219a575061219a83836125ee565b9392505050565b6000612203826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126bd9092919063ffffffff16565b805190915015610aa457808060200190518101906122219190612dd7565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161232593929190612e87565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c99190612f51565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612431929190612ec5565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161251593929190612e87565b60405180910390a46110138686868686866126d4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612431929190612ec5565b60006125b6827f01ffc9a7000000000000000000000000000000000000000000000000000000006125ee565b801561190557506125e7827fffffffff000000000000000000000000000000000000000000000000000000006125ee565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156126a6575060208210155b80156126b25750600081115b979650505050505050565b60606126cc848460008561274c565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161232593929190612e87565b6060824710156127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b61285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128859190612f86565b60006040518083038185875af1925050503d80600081146128c2576040519150601f19603f3d011682016040523d82523d6000602084013e6128c7565b606091505b50915091506126b2828286606083156128e157508161219a565b8251156128f15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612bf7565b73ffffffffffffffffffffffffffffffffffffffff8116811461294757600080fd5b50565b60008083601f84011261295c57600080fd5b50813567ffffffffffffffff81111561297457600080fd5b60208301915083602082850101111561298c57600080fd5b9250929050565b600080600080600080600060c0888a0312156129ae57600080fd5b87356129b981612925565b965060208801356129c981612925565b955060408801356129d981612925565b945060608801356129e981612925565b93506080880135925060a088013567ffffffffffffffff811115612a0c57600080fd5b612a188a828b0161294a565b989b979a50959850939692959293505050565b803563ffffffff81168114612a3f57600080fd5b919050565b600080600060408486031215612a5957600080fd5b612a6284612a2b565b9250602084013567ffffffffffffffff811115612a7e57600080fd5b612a8a8682870161294a565b9497909650939450505050565b600080600080600060808688031215612aaf57600080fd5b8535612aba81612925565b94506020860135612aca81612925565b935060408601359250606086013567ffffffffffffffff811115612aed57600080fd5b612af98882890161294a565b969995985093965092949392505050565b600080600080600080600060c0888a031215612b2557600080fd5b8735612b3081612925565b96506020880135612b4081612925565b95506040880135612b5081612925565b945060608801359350612b6560808901612a2b565b925060a088013567ffffffffffffffff811115612a0c57600080fd5b60005b83811015612b9c578181015183820152602001612b84565b838111156105b25750506000910152565b60008151808452612bc5816020860160208601612b81565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061219a6020830184612bad565b60008060008060008060a08789031215612c2357600080fd5b8635612c2e81612925565b95506020870135612c3e81612925565b945060408701359350612c5360608801612a2b565b9250608087013567ffffffffffffffff811115612c6f57600080fd5b612c7b89828a0161294a565b979a9699509497509295939492505050565b60008060408385031215612ca057600080fd5b8235612cab81612925565b91506020830135612cbb81612925565b809150509250929050565b60008060008060608587031215612cdc57600080fd5b8435612ce781612925565b9350612cf560208601612a2b565b9250604085013567ffffffffffffffff811115612d1157600080fd5b612d1d8782880161294a565b95989497509550505050565b600080600060608486031215612d3e57600080fd5b8335612d4981612925565b92506020840135612d5981612925565b91506040840135612d6981612925565b809150509250925092565b600060208284031215612d8657600080fd5b815161219a81612925565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612dd257612dd2612d91565b500390565b600060208284031215612de957600080fd5b8151801515811461219a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612e386080830184612bad565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612e716060830185612bad565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612ebc6060830184612bad565b95945050505050565b8281526040602082015260006126cc6040830184612bad565b60008219821115612ef157612ef1612d91565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612f4560c0830184612bad565b98975050505050505050565b60008060408385031215612f6457600080fd5b8251612f6f81612925565b602084015190925060ff81168114612cbb57600080fd5b60008251612f98818460208701612b81565b919091019291505056fea164736f6c634300080f000a";
     bytes internal constant l1ERC721BridgeCode =
         hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a";
 }
diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol
new file mode 100644
index 000000000000..0f8922a92ae2
--- /dev/null
+++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol
@@ -0,0 +1,648 @@
+// SPDX-License-Identifier: MIT
+// This file was autogenerated by running `kontrol load-state-diff`. Do not edit this file manually.
+
+pragma solidity ^0.8.13;
+
+import { Vm } from "forge-std/Vm.sol";
+
+import { DeploymentSummaryFaultProofsCode } from "./DeploymentSummaryFaultProofsCode.sol";
+
+contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode {
+    // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D
+    address private constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code"))));
+    Vm private constant vm = Vm(VM_ADDRESS);
+
+    address internal constant addressManagerAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3;
+    address internal constant anchorStateRegistryAddress = 0xF74482139D1564B826994875cF6632eB5b134b25;
+    address internal constant anchorStateRegistryProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4;
+    address internal constant delayedWETHAddress = 0x49BBFf1629824A1e7993Ab5c17AFa45D24AB28c9;
+    address internal constant delayedWETHProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6;
+    address internal constant disputeGameFactoryAddress = 0x20B168142354Cee65a32f6D8cf3033E592299765;
+    address internal constant disputeGameFactoryProxyAddress = 0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb;
+    address internal constant l1CrossDomainMessengerAddress = 0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99;
+    address internal constant l1CrossDomainMessengerProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB;
+    address internal constant l1ERC721BridgeAddress = 0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586;
+    address internal constant l1ERC721BridgeProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865;
+    address internal constant l1StandardBridgeAddress = 0x04c50B398Cd4182428E79f7186b7C919cF17e86F;
+    address internal constant l1StandardBridgeProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F;
+    address internal constant mipsAddress = 0xF698388BFCDbd3f9f2F13ebC3E01471B3cc7cE83;
+    address internal constant optimismPortal2Address = 0xfcbb237388CaF5b08175C9927a37aB6450acd535;
+    address internal constant optimismPortalProxyAddress = 0x978e3286EB805934215a88694d80b09aDed68D90;
+    address internal constant preimageOracleAddress = 0x3bd7E801E51d48c5d94Ea68e8B801DFFC275De75;
+    address internal constant protocolVersionsAddress = 0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F;
+    address internal constant protocolVersionsProxyAddress = 0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6;
+    address internal constant proxyAdminAddress = 0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76;
+    address internal constant safeProxyFactoryAddress = 0x34A1D3fff3958843C43aD80F30b94c510645C316;
+    address internal constant safeSingletonAddress = 0x90193C961A926261B756D1E5bb255e67ff9498A1;
+    address internal constant superchainConfigAddress = 0x068E44eB31e111028c41598E4535be7468674D0A;
+    address internal constant superchainConfigProxyAddress = 0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809;
+    address internal constant systemConfigAddress = 0x67866A5052E5302aaD08e9f352331fd8622eB6DC;
+    address internal constant systemConfigProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D;
+    address internal constant systemOwnerSafeAddress = 0x7EA964E5D864b95f6D7d2BD04dA897F6e31084b3;
+    address internal constant acc27Address = 0x12e721c390F5728200a26BBEf206A5F4F7E991f3;
+    address internal constant acc28Address = 0x2abb7CBB720020ee3C9ecf3915D14B6d1886A577;
+
+    function recreateDeployment() public {
+        bytes32 slot;
+        bytes32 value;
+        vm.etch(safeProxyFactoryAddress, safeProxyFactoryCode);
+        vm.etch(safeSingletonAddress, safeSingletonCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000004";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(safeSingletonAddress, slot, value);
+        vm.etch(systemOwnerSafeAddress, systemOwnerSafeCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0";
+        value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"d1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000003";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000004";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"cc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        vm.etch(addressManagerAddress, addressManagerCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38";
+        vm.store(addressManagerAddress, slot, value);
+        vm.etch(proxyAdminAddress, proxyAdminCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38";
+        vm.store(proxyAdminAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000003";
+        value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3";
+        vm.store(proxyAdminAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000007ea964e5d864b95f6d7d2bd04da897f6e31084b3";
+        vm.store(proxyAdminAddress, slot, value);
+        vm.etch(superchainConfigProxyAddress, superchainConfigProxyCode);
+        slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(superchainConfigProxyAddress, slot, value);
+        vm.etch(superchainConfigAddress, superchainConfigCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(superchainConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(superchainConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(superchainConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
+        value = hex"000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a";
+        vm.store(superchainConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(superchainConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(superchainConfigProxyAddress, slot, value);
+        slot = hex"d30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe68";
+        value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc";
+        vm.store(superchainConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(superchainConfigProxyAddress, slot, value);
+        vm.etch(protocolVersionsProxyAddress, protocolVersionsProxyCode);
+        slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(protocolVersionsProxyAddress, slot, value);
+        vm.etch(protocolVersionsAddress, protocolVersionsCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(protocolVersionsAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(protocolVersionsAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c";
+        vm.store(protocolVersionsAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"000000000000000000000000000000000000000000000000000000000000dead";
+        vm.store(protocolVersionsAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(protocolVersionsAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000002";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
+        value = hex"000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f";
+        vm.store(protocolVersionsProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(protocolVersionsProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(protocolVersionsProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(protocolVersionsProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc";
+        vm.store(protocolVersionsProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(protocolVersionsProxyAddress, slot, value);
+        vm.etch(optimismPortalProxyAddress, optimismPortalProxyCode);
+        slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(optimismPortalProxyAddress, slot, value);
+        vm.etch(disputeGameFactoryProxyAddress, disputeGameFactoryProxyCode);
+        slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(disputeGameFactoryProxyAddress, slot, value);
+        vm.etch(anchorStateRegistryProxyAddress, anchorStateRegistryProxyCode);
+        slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(anchorStateRegistryProxyAddress, slot, value);
+        vm.etch(delayedWETHProxyAddress, delayedWETHProxyCode);
+        slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(delayedWETHProxyAddress, slot, value);
+        vm.etch(systemConfigProxyAddress, systemConfigProxyCode);
+        slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(systemConfigProxyAddress, slot, value);
+        vm.etch(l1StandardBridgeProxyAddress, l1StandardBridgeProxyCode);
+        slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(l1StandardBridgeProxyAddress, slot, value);
+        vm.etch(l1CrossDomainMessengerProxyAddress, l1CrossDomainMessengerProxyCode);
+        slot = hex"f6cecbacbfeb99e6ab0f02c22fd8a103f8837deb80af03d481ac5bc8d5475f58";
+        value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3";
+        vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
+        slot = hex"ceb2ac3d439ba35adb9a3f2ba6c37d15a264e79156ee79334f5d4c00090812d2";
+        value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034";
+        vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
+        vm.etch(l1ERC721BridgeProxyAddress, l1ERC721BridgeProxyCode);
+        slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(l1ERC721BridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(addressManagerAddress, slot, value);
+        vm.etch(optimismPortal2Address, optimismPortal2Code);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(optimismPortal2Address, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(optimismPortal2Address, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000032";
+        value = hex"000000000000000000000000000000000000000000000000000000000000dead";
+        vm.store(optimismPortal2Address, slot, value);
+        slot = hex"000000000000000000000000000000000000000000000000000000000000003b";
+        value = hex"0000000000000000000000000000000000000000000000000000000100000000";
+        vm.store(optimismPortal2Address, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        value = hex"000000000000000100000000000000000000000000000000000000003b9aca00";
+        vm.store(optimismPortal2Address, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(optimismPortal2Address, slot, value);
+        vm.etch(l1CrossDomainMessengerAddress, l1CrossDomainMessengerCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000010000000000000000000000000000000000000000";
+        vm.store(l1CrossDomainMessengerAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000001010000000000000000000000000000000000000000";
+        vm.store(l1CrossDomainMessengerAddress, slot, value);
+        slot = hex"00000000000000000000000000000000000000000000000000000000000000cc";
+        value = hex"000000000000000000000000000000000000000000000000000000000000dead";
+        vm.store(l1CrossDomainMessengerAddress, slot, value);
+        slot = hex"00000000000000000000000000000000000000000000000000000000000000cf";
+        value = hex"0000000000000000000000004200000000000000000000000000000000000007";
+        vm.store(l1CrossDomainMessengerAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000010000000000000000000000000000000000000000";
+        vm.store(l1CrossDomainMessengerAddress, slot, value);
+        vm.etch(systemConfigAddress, systemConfigCode);
+        slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f";
+        value = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+        vm.store(systemConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(systemConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(systemConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c";
+        vm.store(systemConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"000000000000000000000000000000000000000000000000000000000000dead";
+        vm.store(systemConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000066";
+        value = hex"0100000000000000000000000000000000000000000000000000000000000000";
+        vm.store(systemConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000068";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(systemConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000069";
+        value = hex"0000000000000000000000000000000000000000000000000000020100000001";
+        vm.store(systemConfigAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(systemConfigAddress, slot, value);
+        vm.etch(l1StandardBridgeAddress, l1StandardBridgeCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(l1StandardBridgeAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(l1StandardBridgeAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000004";
+        value = hex"0000000000000000000000004200000000000000000000000000000000000010";
+        vm.store(l1StandardBridgeAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(l1StandardBridgeAddress, slot, value);
+        vm.etch(l1ERC721BridgeAddress, l1ERC721BridgeCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(l1ERC721BridgeAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(l1ERC721BridgeAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000002";
+        value = hex"0000000000000000000000004200000000000000000000000000000000000014";
+        vm.store(l1ERC721BridgeAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(l1ERC721BridgeAddress, slot, value);
+        vm.etch(disputeGameFactoryAddress, disputeGameFactoryCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(disputeGameFactoryAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(disputeGameFactoryAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c";
+        vm.store(disputeGameFactoryAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        vm.store(disputeGameFactoryAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(disputeGameFactoryAddress, slot, value);
+        vm.etch(delayedWETHAddress, delayedWETHCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(delayedWETHAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(delayedWETHAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c";
+        vm.store(delayedWETHAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        vm.store(delayedWETHAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(delayedWETHAddress, slot, value);
+        vm.etch(preimageOracleAddress, preimageOracleCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000004";
+        value = hex"ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000006";
+        value = hex"21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000007";
+        value = hex"e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000008";
+        value = hex"0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000009";
+        value = hex"887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"000000000000000000000000000000000000000000000000000000000000000a";
+        value = hex"ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"000000000000000000000000000000000000000000000000000000000000000b";
+        value = hex"9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"000000000000000000000000000000000000000000000000000000000000000c";
+        value = hex"cefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"000000000000000000000000000000000000000000000000000000000000000d";
+        value = hex"f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"000000000000000000000000000000000000000000000000000000000000000e";
+        value = hex"f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"000000000000000000000000000000000000000000000000000000000000000f";
+        value = hex"3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000010";
+        value = hex"c1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000011";
+        value = hex"5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc";
+        vm.store(preimageOracleAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000012";
+        value = hex"da7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2";
+        vm.store(preimageOracleAddress, slot, value);
+        vm.etch(mipsAddress, mipsCode);
+        vm.etch(anchorStateRegistryAddress, anchorStateRegistryCode);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(anchorStateRegistryAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(anchorStateRegistryAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(anchorStateRegistryAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000003";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
+        value = hex"00000000000000000000000067866a5052e5302aad08e9f352331fd8622eb6dc";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000067";
+        value = hex"0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000068";
+        value = hex"00000000000000000000000000000000000c5fc5000005580000000000000000";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000066";
+        value = hex"010000000000000000000000000000000000000000000000000c5fc500000558";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000068";
+        value = hex"00000000000000000000000000000000000c5fc50000055800000000017d7840";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08";
+        value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597";
+        value = hex"000000000000000000000000ff00000000000000000000000000000000000000";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636";
+        value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7";
+        value = hex"000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376";
+        value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906";
+        value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac";
+        value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000069";
+        value = hex"0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(systemConfigProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000004";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(proxyAdminAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
+        value = hex"00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f";
+        vm.store(l1StandardBridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(l1StandardBridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(l1StandardBridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000032";
+        value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809";
+        vm.store(l1StandardBridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d";
+        vm.store(l1StandardBridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000003";
+        value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb";
+        vm.store(l1StandardBridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000004";
+        value = hex"0000000000000000000000004200000000000000000000000000000000000010";
+        vm.store(l1StandardBridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(l1StandardBridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000006";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
+        value = hex"00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586";
+        vm.store(l1ERC721BridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(l1ERC721BridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(l1ERC721BridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000032";
+        value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809";
+        vm.store(l1ERC721BridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb";
+        vm.store(l1ERC721BridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000002";
+        value = hex"0000000000000000000000004200000000000000000000000000000000000014";
+        vm.store(l1ERC721BridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(l1ERC721BridgeProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000007";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"f6cecbacbfeb99e6ab0f02c22fd8a103f8837deb80af03d481ac5bc8d5475f58";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000002";
+        vm.store(proxyAdminAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000008";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"63c92109b91ecf3318ee316da9fdb1378fd8d900f912b2029945ff91daa463bf";
+        value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034";
+        vm.store(proxyAdminAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000009";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e";
+        value = hex"000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99";
+        vm.store(addressManagerAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000010000000000000000000000000000000000000000";
+        vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000001010000000000000000000000000000000000000000";
+        vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
+        slot = hex"00000000000000000000000000000000000000000000000000000000000000fb";
+        value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809";
+        vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
+        slot = hex"00000000000000000000000000000000000000000000000000000000000000fc";
+        value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90";
+        vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
+        slot = hex"00000000000000000000000000000000000000000000000000000000000000fd";
+        value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d";
+        vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
+        slot = hex"00000000000000000000000000000000000000000000000000000000000000cc";
+        value = hex"000000000000000000000000000000000000000000000000000000000000dead";
+        vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
+        slot = hex"00000000000000000000000000000000000000000000000000000000000000cf";
+        value = hex"0000000000000000000000004200000000000000000000000000000000000007";
+        vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000010000000000000000000000000000000000000000";
+        vm.store(l1CrossDomainMessengerProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"000000000000000000000000000000000000000000000000000000000000000a";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
+        value = hex"00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765";
+        vm.store(disputeGameFactoryProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(disputeGameFactoryProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(disputeGameFactoryProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(disputeGameFactoryProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38";
+        vm.store(disputeGameFactoryProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(disputeGameFactoryProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"000000000000000000000000000000000000000000000000000000000000000b";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
+        value = hex"00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9";
+        vm.store(delayedWETHProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(delayedWETHProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(delayedWETHProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76";
+        vm.store(delayedWETHProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000033";
+        value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38";
+        vm.store(delayedWETHProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000068";
+        value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809";
+        vm.store(delayedWETHProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(delayedWETHProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"000000000000000000000000000000000000000000000000000000000000000c";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
+        value = hex"000000000000000000000000f74482139d1564b826994875cf6632eb5b134b25";
+        vm.store(anchorStateRegistryProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(anchorStateRegistryProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(anchorStateRegistryProxyAddress, slot, value);
+        slot = hex"a6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49";
+        value = hex"deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+        vm.store(anchorStateRegistryProxyAddress, slot, value);
+        slot = hex"cc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f";
+        value = hex"deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+        vm.store(anchorStateRegistryProxyAddress, slot, value);
+        slot = hex"24a9e90595537a4321bf3a8fd43f02c179fe79a94dde54a8c1a057e2967a4d0b";
+        value = hex"deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+        vm.store(anchorStateRegistryProxyAddress, slot, value);
+        slot = hex"d9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f";
+        value = hex"deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+        vm.store(anchorStateRegistryProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(anchorStateRegistryProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000005";
+        value = hex"000000000000000000000000000000000000000000000000000000000000000d";
+        vm.store(systemOwnerSafeAddress, slot, value);
+        slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
+        value = hex"000000000000000000000000fcbb237388caf5b08175c9927a37ab6450acd535";
+        vm.store(optimismPortalProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(optimismPortalProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000101";
+        vm.store(optimismPortalProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000038";
+        value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb";
+        vm.store(optimismPortalProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000037";
+        value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d";
+        vm.store(optimismPortalProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000035";
+        value = hex"0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900";
+        vm.store(optimismPortalProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000032";
+        value = hex"000000000000000000000000000000000000000000000000000000000000dead";
+        vm.store(optimismPortalProxyAddress, slot, value);
+        slot = hex"000000000000000000000000000000000000000000000000000000000000003b";
+        value = hex"0000000000000000000000000000000000000000000000000000000100000000";
+        vm.store(optimismPortalProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        value = hex"000000000000000100000000000000000000000000000000000000003b9aca00";
+        vm.store(optimismPortalProxyAddress, slot, value);
+        slot = hex"0000000000000000000000000000000000000000000000000000000000000000";
+        value = hex"0000000000000000000000000000000000000000000000000000000000000001";
+        vm.store(optimismPortalProxyAddress, slot, value);
+        vm.etch(acc27Address, acc27Code);
+        slot = hex"ffdfc1249c027f9191656349feb0761381bb32c9f557e01f419fd08754bf5a1b";
+        value = hex"00000000000000000000000012e721c390f5728200a26bbef206a5f4f7e991f3";
+        vm.store(disputeGameFactoryProxyAddress, slot, value);
+        vm.etch(acc28Address, acc28Code);
+        slot = hex"4d5a9bd2e41301728d41c8e705190becb4e74abe869f75bdb405b63716a35f9e";
+        value = hex"0000000000000000000000002abb7cbb720020ee3c9ecf3915d14b6d1886a577";
+        vm.store(disputeGameFactoryProxyAddress, slot, value);
+    }
+}
diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol
new file mode 100644
index 000000000000..a2471b147005
--- /dev/null
+++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: MIT
+// This file was autogenerated by running `kontrol load-state-diff`. Do not edit this file manually.
+
+pragma solidity ^0.8.13;
+
+contract DeploymentSummaryFaultProofsCode {
+    bytes internal constant safeProxyFactoryCode =
+        hex"608060405234801561001057600080fd5b50600436106100725760003560e01c806361b69abd1161005057806361b69abd146100dc578063addacc0f146100ef578063d18af54d146100f757600080fd5b80631688f0b9146100775780632500510e146100b457806353e5d935146100c7575b600080fd5b61008a61008536600461070e565b61010a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61008a6100c2366004610767565b610192565b6100cf610272565b6040516100ab919061086c565b61008a6100ea366004610886565b6102ba565b6100cf61037d565b61008a6101053660046108d6565b61038f565b60006101178484846104ab565b83519091501561013b5760008060008551602087016000865af10361013b57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252861660208201527f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235910160405180910390a19392505050565b60006101d68585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792506104ab915050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b166020820152909150603401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526102699160040161086c565b60405180910390fd5b606060405180602001610284906105f6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052919050565b6000826040516102c9906105f6565b73ffffffffffffffffffffffffffffffffffffffff9091168152602001604051809103906000f080158015610302573d6000803e3d6000fd5b508251909150156103275760008060008451602086016000865af10361032757600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201527f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235910160405180910390a192915050565b60606040518060200161028490610603565b60008083836040516020016103d392919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b6040516020818303038152906040528051906020012060001c90506103f986868361010a565b915073ffffffffffffffffffffffffffffffffffffffff8316156104a2576040517f1e52b51800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690631e52b5189061046f9085908a908a908a90600401610942565b600060405180830381600087803b15801561048957600080fd5b505af115801561049d573d6000803e3d6000fd5b505050505b50949350505050565b6000808380519060200120836040516020016104d1929190918252602082015260400190565b6040516020818303038152906040528051906020012090506000604051806020016104fb906105f6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052610553919073ffffffffffffffffffffffffffffffffffffffff89169060200161098c565b6040516020818303038152906040529050818151826020016000f5925073ffffffffffffffffffffffffffffffffffffffff83166105ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606401610269565b50509392505050565b61016f806109af83390190565b607880610b1e83390190565b73ffffffffffffffffffffffffffffffffffffffff8116811461063157600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261067457600080fd5b813567ffffffffffffffff8082111561068f5761068f610634565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156106d5576106d5610634565b816040528381528660208588010111156106ee57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561072357600080fd5b833561072e8161060f565b9250602084013567ffffffffffffffff81111561074a57600080fd5b61075686828701610663565b925050604084013590509250925092565b6000806000806060858703121561077d57600080fd5b84356107888161060f565b9350602085013567ffffffffffffffff808211156107a557600080fd5b818701915087601f8301126107b957600080fd5b8135818111156107c857600080fd5b8860208285010111156107da57600080fd5b95986020929092019750949560400135945092505050565b60005b8381101561080d5781810151838201526020016107f5565b8381111561081c576000848401525b50505050565b6000815180845261083a8160208601602086016107f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061087f6020830184610822565b9392505050565b6000806040838503121561089957600080fd5b82356108a48161060f565b9150602083013567ffffffffffffffff8111156108c057600080fd5b6108cc85828601610663565b9150509250929050565b600080600080608085870312156108ec57600080fd5b84356108f78161060f565b9350602085013567ffffffffffffffff81111561091357600080fd5b61091f87828801610663565b9350506040850135915060608501356109378161060f565b939692955090935050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261097b6080830185610822565b905082606083015295945050505050565b6000835161099e8184602088016107f2565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161016f38038061016f83398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b6078806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000a6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000aa164736f6c634300080f000a";
+    bytes internal constant safeSingletonCode =
+        hex"6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314610620578063f698da2514610640578063f8dc5dd9146106a7578063ffa1ad74146106c757610218565b8063e19a9dd9146105ab578063e318b52b146105cb578063e75235b8146105eb578063e86637db1461060057610218565b8063cc2f8452116100d1578063cc2f84521461051d578063d4d9bdcd1461054b578063d8d11f781461056b578063e009cfde1461058b57610218565b8063affed0e0146104a7578063b4faba09146104bd578063b63e800d146104dd578063c4ca3a9c146104fd57610218565b80635624b25b1161017a5780636a761202116101495780636a7612021461041a5780637d8329741461042d578063934f3a1114610465578063a0e67e2b1461048557610218565b80635624b25b146103805780635ae6bd37146103ad578063610b5925146103da578063694e80c3146103fa57610218565b80632f54bf6e116101b65780632f54bf6e146102f55780633408e47014610315578063468721a7146103325780635229073f1461035257610218565b80630d582f131461027e57806312fb68e0146102a05780632d9ad53d146102c057610218565b366102185760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561022457600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024f57005b36600080373360601b365260008060143601600080855af190503d6000803e80610278573d6000fd5b503d6000f35b34801561028a57600080fd5b5061029e6102993660046132ce565b610710565b005b3480156102ac57600080fd5b5061029e6102bb3660046133d4565b610966565b3480156102cc57600080fd5b506102e06102db366004613449565b610fbb565b60405190151581526020015b60405180910390f35b34801561030157600080fd5b506102e0610310366004613449565b611010565b34801561032157600080fd5b50465b6040519081526020016102ec565b34801561033e57600080fd5b506102e061034d366004613475565b611062565b34801561035e57600080fd5b5061037261036d366004613475565b611178565b6040516102ec92919061354a565b34801561038c57600080fd5b506103a061039b366004613565565b6111ae565b6040516102ec9190613587565b3480156103b957600080fd5b506103246103c836600461359a565b60076020526000908152604090205481565b3480156103e657600080fd5b5061029e6103f5366004613449565b611234565b34801561040657600080fd5b5061029e61041536600461359a565b611426565b6102e06104283660046135fc565b61153a565b34801561043957600080fd5b506103246104483660046132ce565b600860209081526000928352604080842090915290825290205481565b34801561047157600080fd5b5061029e6104803660046136d5565b611934565b34801561049157600080fd5b5061049a6119b0565b6040516102ec9190613793565b3480156104b357600080fd5b5061032460055481565b3480156104c957600080fd5b5061029e6104d83660046137a6565b611ac8565b3480156104e957600080fd5b5061029e6104f83660046137f6565b611aeb565b34801561050957600080fd5b506103246105183660046138eb565b611c26565b34801561052957600080fd5b5061053d6105383660046132ce565b611cf8565b6040516102ec92919061395c565b34801561055757600080fd5b5061029e61056636600461359a565b611e26565b34801561057757600080fd5b50610324610586366004613994565b611efa565b34801561059757600080fd5b5061029e6105a6366004613a55565b611f27565b3480156105b757600080fd5b5061029e6105c6366004613449565b612106565b3480156105d757600080fd5b5061029e6105e6366004613a8e565b612178565b3480156105f757600080fd5b50600454610324565b34801561060c57600080fd5b506103a061061b366004613994565b612504565b34801561062c57600080fd5b5061029e61063b366004613449565b61269d565b34801561064c57600080fd5b5061032460007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b3480156106b357600080fd5b5061029e6106c2366004613ad9565b612713565b3480156106d357600080fd5b506103a06040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b6107186129a5565b73ffffffffffffffffffffffffffffffffffffffff821615801590610754575073ffffffffffffffffffffffffffffffffffffffff8216600114155b8015610776575073ffffffffffffffffffffffffffffffffffffffff82163014155b6107e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600260205260409020541615610870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107d8565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0805473ffffffffffffffffffffffffffffffffffffffff8481166000818152604081208054939094167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790935560018352835490911617909155600380549161090283613b49565b909155505060405173ffffffffffffffffffffffffffffffffffffffff831681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a180600454146109625761096281611426565b5050565b610971816041612a10565b825110156109db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323000000000000000000000000000000000000000000000000000000060448201526064016107d8565b6000808060008060005b86811015610faf576041818102890160208101516040820151919092015160ff16955090935091506000849003610cbc579193508391610a26876041612a10565b821015610a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323100000000000000000000000000000000000000000000000000000060448201526064016107d8565b8751610a9c836020612a4c565b1115610b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323200000000000000000000000000000000000000000000000000000060448201526064016107d8565b602082890181015189519091610b27908390610b21908790612a4c565b90612a4c565b1115610b8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323300000000000000000000000000000000000000000000000000000060448201526064016107d8565b6040517f20c13b0b000000000000000000000000000000000000000000000000000000008082528a85016020019173ffffffffffffffffffffffffffffffffffffffff8916906320c13b0b90610beb908f908690600401613b81565b602060405180830381865afa158015610c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2c9190613ba6565b7fffffffff000000000000000000000000000000000000000000000000000000001614610cb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323400000000000000000000000000000000000000000000000000000060448201526064016107d8565b5050610eaf565b8360ff16600103610d8a5791935083913373ffffffffffffffffffffffffffffffffffffffff84161480610d1f575073ffffffffffffffffffffffffffffffffffffffff851660009081526008602090815260408083208d845290915290205415155b610d85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323500000000000000000000000000000000000000000000000000000060448201526064016107d8565b610eaf565b601e8460ff161115610e4f576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610def9190613be8565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610e3e573d6000803e3d6000fd5b505050602060405103519450610eaf565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610ea2573d6000803e3d6000fd5b5050506020604051035194505b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015610f10575073ffffffffffffffffffffffffffffffffffffffff8581166000908152600260205260409020541615155b8015610f33575073ffffffffffffffffffffffffffffffffffffffff8516600114155b610f99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323600000000000000000000000000000000000000000000000000000060448201526064016107d8565b8495508080610fa790613b49565b9150506109e5565b50505050505050505050565b6000600173ffffffffffffffffffffffffffffffffffffffff83161480159061100a575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615155b92915050565b600073ffffffffffffffffffffffffffffffffffffffff821660011480159061100a57505073ffffffffffffffffffffffffffffffffffffffff90811660009081526002602052604090205416151590565b60003360011480159061109957503360009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b6110ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303400000000000000000000000000000000000000000000000000000060448201526064016107d8565b61110c858585855a612a68565b905080156111445760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a2611170565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b6000606061118886868686611062565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006111bd836020613c0b565b67ffffffffffffffff8111156111d5576111d56132fa565b6040519080825280601f01601f1916602001820160405280156111ff576020820181803683370190505b50905060005b8381101561122c57848101546020808302840101528061122481613b49565b915050611205565b509392505050565b61123c6129a5565b73ffffffffffffffffffffffffffffffffffffffff811615801590611278575073ffffffffffffffffffffffffffffffffffffffff8116600114155b6112de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260016020526040902054161561136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303200000000000000000000000000000000000000000000000000000060448201526064016107d8565b600160208181527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f805473ffffffffffffffffffffffffffffffffffffffff858116600081815260408082208054949095167fffffffffffffffffffffffff000000000000000000000000000000000000000094851617909455959095528254168417909155519182527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091015b60405180910390a150565b61142e6129a5565b60035481111561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b6001811015611505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107d8565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939060200161141b565b60008060006115548e8e8e8e8e8e8e8e8e8e600554612504565b60058054919250600061156683613b49565b909155505080516020820120915061157f828286611934565b5060006115aa7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b905073ffffffffffffffffffffffffffffffffffffffff81161561164a578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016116179c9b9a99989796959493929190613cb2565b600060405180830381600087803b15801561163157600080fd5b505af1158015611645573d6000803e3d6000fd5b505050505b6116766116598a6109c4613dc8565b603f6116668c6040613c0b565b6116709190613de0565b90612aaf565b611682906101f4613dc8565b5a10156116eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313000000000000000000000000000000000000000000000000000000060448201526064016107d8565b60005a905061175c8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c600014611749578e612a68565b6109c45a6117579190613e1b565b612a68565b93506117695a8290612ac6565b9050838061177657508915155b8061178057508715155b6117e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313300000000000000000000000000000000000000000000000000000060448201526064016107d8565b600088156117fe576117fb828b8b8b8b612ae1565b90505b84156118425760408051858152602081018390527f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e910160405180910390a161187c565b60408051858152602081018390527f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23910160405180910390a15b505073ffffffffffffffffffffffffffffffffffffffff811615611923576040517f9327136800000000000000000000000000000000000000000000000000000000815260048101839052831515602482015273ffffffffffffffffffffffffffffffffffffffff821690639327136890604401600060405180830381600087803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6004548061199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b6119aa84848484610966565b50505050565b6060600060035467ffffffffffffffff8111156119cf576119cf6132fa565b6040519080825280602002602001820160405280156119f8578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff8116600114611ac05780838381518110611a7357611a73613e32565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260029092526040909120541681611ab881613b49565b925050611a42565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b611b298a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c9250612c72915050565b73ffffffffffffffffffffffffffffffffffffffff841615611b6d57611b6d847f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b611bad8787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061303f92505050565b8115611bc457611bc282600060018685612ae1565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b89604051611c12959493929190613e61565b60405180910390a250505050505050505050565b6000805a9050611c6f878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050505a612a68565b611c7857600080fd5b60005a611c859083613e1b565b905080604051602001611c9a91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526107d891600401613587565b606060008267ffffffffffffffff811115611d1557611d156132fa565b604051908082528060200260200182016040528015611d3e578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff80861660009081526001602052604081205492945091165b73ffffffffffffffffffffffffffffffffffffffff811615801590611da8575073ffffffffffffffffffffffffffffffffffffffff8116600114155b8015611db357508482105b15611e185780848381518110611dcb57611dcb613e32565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260019092526040909120541681611e1081613b49565b925050611d6c565b908352919491935090915050565b3360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16611eb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333000000000000000000000000000000000000000000000000000000060448201526064016107d8565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b6000611f0f8c8c8c8c8c8c8c8c8c8c8c612504565b8051906020012090509b9a5050505050505050505050565b611f2f6129a5565b73ffffffffffffffffffffffffffffffffffffffff811615801590611f6b575073ffffffffffffffffffffffffffffffffffffffff8116600114155b611fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff828116600090815260016020526040902054811690821614612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303300000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600160209081526040808320805488871685528285208054919097167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790965592849052825490941690915591519081527faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691015b60405180910390a15050565b61210e6129a5565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c881815560405173ffffffffffffffffffffffffffffffffffffffff831681527f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa2906020016120fa565b6121806129a5565b73ffffffffffffffffffffffffffffffffffffffff8116158015906121bc575073ffffffffffffffffffffffffffffffffffffffff8116600114155b80156121de575073ffffffffffffffffffffffffffffffffffffffff81163014155b612244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602052604090205416156122d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff82161580159061230f575073ffffffffffffffffffffffffffffffffffffffff8216600114155b612375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260026020526040902054811690831614612408576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600260209081526040808320805487871680865283862080549289167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179055968a1685528285208054821690971790965592849052825490941690915591519081527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf910160405180910390a160405173ffffffffffffffffffffffffffffffffffffffff821681527f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269060200160405180910390a1505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405161253e929190613ee7565b604051908190038120612564949392918e908e908e908e908e908e908e90602001613ef7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090507f19000000000000000000000000000000000000000000000000000000000000007f010000000000000000000000000000000000000000000000000000000000000061263860007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b6126a56129a5565b6126cd817f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b09060200161141b565b61271b6129a5565b80600160035461272b9190613e1b565b1015612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff8216158015906127cf575073ffffffffffffffffffffffffffffffffffffffff8216600114155b612835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260205260409020548116908316146128c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805488861684529183208054929095167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179094559181528254909116909155600380549161294083613f74565b909155505060405173ffffffffffffffffffffffffffffffffffffffff831681527ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf9060200160405180910390a180600454146129a0576129a081611426565b505050565b333014612a0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333100000000000000000000000000000000000000000000000000000060448201526064016107d8565b565b600082600003612a225750600061100a565b6000612a2e8385613c0b565b905082612a3b8583613de0565b14612a4557600080fd5b9392505050565b600080612a598385613dc8565b905083811015612a4557600080fd5b60006001836001811115612a7e57612a7e613c48565b03612a96576000808551602087018986f49050612aa6565b600080855160208701888a87f190505b95945050505050565b600081831015612abf5781612a45565b5090919050565b600082821115612ad557600080fd5b60006111708385613e1b565b60008073ffffffffffffffffffffffffffffffffffffffff831615612b065782612b08565b325b905073ffffffffffffffffffffffffffffffffffffffff8416612be757612b473a8610612b35573a612b37565b855b612b418989612a4c565b90612a10565b60405190925073ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f19350505050612be2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313100000000000000000000000000000000000000000000000000000060448201526064016107d8565b612c68565b612bf585612b418989612a4c565b9150612c028482846131cf565b612c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313200000000000000000000000000000000000000000000000000000060448201526064016107d8565b5095945050505050565b60045415612cdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303000000000000000000000000000000000000000000000000000000060448201526064016107d8565b8151811115612d47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107d8565b6001811015612db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107d8565b600160005b8351811015612fe7576000848281518110612dd457612dd4613e32565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612e32575073ffffffffffffffffffffffffffffffffffffffff8116600114155b8015612e54575073ffffffffffffffffffffffffffffffffffffffff81163014155b8015612e8c57508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b612ef2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600260205260409020541615612f81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107d8565b73ffffffffffffffffffffffffffffffffffffffff928316600090815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169382169390931790925580612fdf81613b49565b915050612db7565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790559051600355600455565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f5473ffffffffffffffffffffffffffffffffffffffff16156130e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303000000000000000000000000000000000000000000000000000000060448201526064016107d8565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905573ffffffffffffffffffffffffffffffffffffffff821615610962576131698260008360015a612a68565b610962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303000000000000000000000000000000000000000000000000000000060448201526064016107d8565b6040805173ffffffffffffffffffffffffffffffffffffffff841660248201526044808201849052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251600093929184919082896127105a03f13d801561327c5760208114613284576000935061328f565b81935061328f565b600051158215171593505b5050509392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146132bb57600080fd5b50565b80356132c981613299565b919050565b600080604083850312156132e157600080fd5b82356132ec81613299565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261333a57600080fd5b813567ffffffffffffffff80821115613355576133556132fa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561339b5761339b6132fa565b816040528381528660208588010111156133b457600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080608085870312156133ea57600080fd5b84359350602085013567ffffffffffffffff8082111561340957600080fd5b61341588838901613329565b9450604087013591508082111561342b57600080fd5b5061343887828801613329565b949793965093946060013593505050565b60006020828403121561345b57600080fd5b8135612a4581613299565b8035600281106132c957600080fd5b6000806000806080858703121561348b57600080fd5b843561349681613299565b935060208501359250604085013567ffffffffffffffff8111156134b957600080fd5b6134c587828801613329565b9250506134d460608601613466565b905092959194509250565b6000815180845260005b81811015613505576020818501810151868301820152016134e9565b81811115613517576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b821515815260406020820152600061117060408301846134df565b6000806040838503121561357857600080fd5b50508035926020909101359150565b602081526000612a4560208301846134df565b6000602082840312156135ac57600080fd5b5035919050565b60008083601f8401126135c557600080fd5b50813567ffffffffffffffff8111156135dd57600080fd5b6020830191508360208285010111156135f557600080fd5b9250929050565b60008060008060008060008060008060006101408c8e03121561361e57600080fd5b6136278c6132be565b9a5060208c0135995067ffffffffffffffff8060408e0135111561364a57600080fd5b61365a8e60408f01358f016135b3565b909a50985061366b60608e01613466565b975060808d0135965060a08d0135955060c08d0135945061368e60e08e016132be565b935061369d6101008e016132be565b9250806101208e013511156136b157600080fd5b506136c38d6101208e01358e01613329565b90509295989b509295989b9093969950565b6000806000606084860312156136ea57600080fd5b83359250602084013567ffffffffffffffff8082111561370957600080fd5b61371587838801613329565b9350604086013591508082111561372b57600080fd5b5061373886828701613329565b9150509250925092565b600081518084526020808501945080840160005b8381101561378857815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101613756565b509495945050505050565b602081526000612a456020830184613742565b600080604083850312156137b957600080fd5b82356137c481613299565b9150602083013567ffffffffffffffff8111156137e057600080fd5b6137ec85828601613329565b9150509250929050565b6000806000806000806000806000806101008b8d03121561381657600080fd5b8a3567ffffffffffffffff8082111561382e57600080fd5b818d0191508d601f83011261384257600080fd5b81358181111561385157600080fd5b8e60208260051b850101111561386657600080fd5b60208381019d50909b508d0135995061388160408e016132be565b985060608d013591508082111561389757600080fd5b506138a48d828e016135b3565b90975095506138b7905060808c016132be565b93506138c560a08c016132be565b925060c08b013591506138da60e08c016132be565b90509295989b9194979a5092959850565b60008060008060006080868803121561390357600080fd5b853561390e81613299565b945060208601359350604086013567ffffffffffffffff81111561393157600080fd5b61393d888289016135b3565b9094509250613950905060608701613466565b90509295509295909350565b60408152600061396f6040830185613742565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b60008060008060008060008060008060006101408c8e0312156139b657600080fd5b8b356139c181613299565b9a5060208c0135995060408c013567ffffffffffffffff8111156139e457600080fd5b6139f08e828f016135b3565b909a509850613a03905060608d01613466565b965060808c0135955060a08c0135945060c08c0135935060e08c0135613a2881613299565b92506101008c0135613a3981613299565b809250506101208c013590509295989b509295989b9093969950565b60008060408385031215613a6857600080fd5b8235613a7381613299565b91506020830135613a8381613299565b809150509250929050565b600080600060608486031215613aa357600080fd5b8335613aae81613299565b92506020840135613abe81613299565b91506040840135613ace81613299565b809150509250925092565b600080600060608486031215613aee57600080fd5b8335613af981613299565b92506020840135613b0981613299565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b7a57613b7a613b1a565b5060010190565b604081526000613b9460408301856134df565b8281036020840152612aa681856134df565b600060208284031215613bb857600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114612a4557600080fd5b600060ff821660ff841680821015613c0257613c02613b1a565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c4357613c43613b1a565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613cae577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600061016073ffffffffffffffffffffffffffffffffffffffff8f1683528d60208401528060408401528b81840152506101808b8d828501376000818d850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8d01168301613d28606085018d613c77565b8a60808501528960a08501528860c0850152613d5c60e085018973ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff87166101008501528184820301610120850152613d90828201876134df565b92505050613db761014083018473ffffffffffffffffffffffffffffffffffffffff169052565b9d9c50505050505050505050505050565b60008219821115613ddb57613ddb613b1a565b500190565b600082613e16577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082821015613e2d57613e2d613b1a565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6080808252810185905260008660a08301825b88811015613eb1578235613e8781613299565b73ffffffffffffffffffffffffffffffffffffffff16825260209283019290910190600101613e74565b506020840196909652505073ffffffffffffffffffffffffffffffffffffffff9283166040820152911660609091015292915050565b8183823760009101908152919050565b6000610160820190508c825273ffffffffffffffffffffffffffffffffffffffff808d1660208401528b60408401528a6060840152613f39608084018b613c77565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b600081613f8357613f83613b1a565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea164736f6c634300080f000a";
+    bytes internal constant systemOwnerSafeCode =
+        hex"6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000a";
+    bytes internal constant addressManagerCode =
+        hex"608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046104fa565b610106565b6100906100da366004610548565b6101d9565b6100746100ed366004610585565b610215565b6100fa6102d1565b6101046000610352565b565b61010e6102d1565b6000610119836103c7565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000008316179092559151929350169061017c9085906105a7565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006101e8846103c7565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b61021d6102d1565b73ffffffffffffffffffffffffffffffffffffffff81166102c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102ce81610352565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bc565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016103da91906105a7565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261043757600080fd5b813567ffffffffffffffff80821115610452576104526103f7565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610498576104986103f7565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b919050565b6000806040838503121561050d57600080fd5b823567ffffffffffffffff81111561052457600080fd5b61053085828601610426565b92505061053f602084016104d1565b90509250929050565b60006020828403121561055a57600080fd5b813567ffffffffffffffff81111561057157600080fd5b61057d84828501610426565b949350505050565b60006020828403121561059757600080fd5b6105a0826104d1565b9392505050565b6000825160005b818110156105c857602081860181015185830152016105ae565b818111156105d7576000828501525b50919091019291505056fea164736f6c634300080f000a";
+    bytes internal constant proxyAdminCode =
+        hex"60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a";
+    bytes internal constant superchainConfigProxyCode =
+        hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a";
+    bytes internal constant superchainConfigCode =
+        hex"608060405234801561001057600080fd5b50600436106100885760003560e01c80635c975abb1161005b5780635c975abb146101255780636da663551461013d5780637fbf7b6a14610150578063c23a451a1461016657600080fd5b80633f4ba83a1461008d578063400ada7514610097578063452a9320146100aa57806354fd4d50146100dc575b600080fd5b61009561016e565b005b6100956100a5366004610746565b610294565b6100b261046d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101186040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100d39190610808565b61012d6104a6565b60405190151581526020016100d3565b61009561014b366004610851565b6104d6565b6101586105a4565b6040519081526020016100d3565b6101586105d2565b61017661046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e20756e706175736500000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61026961026360017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60009055565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156102b45750600054600160ff909116105b806102ce5750303b1580156102ce575060005460ff166001145b61035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161022c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156103b857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6103c18361061d565b8115610405576104056040518060400160405280601281526020017f496e697469616c697a65722070617573656400000000000000000000000000008152506106d8565b801561046857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006104a161049d60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b5490565b905090565b60006104a161049d60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b6104de61046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e2070617573650000000000000000000000000000000000000000000000606482015260840161022c565b6105a1816106d8565b50565b6105cf60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b81565b6105cf60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b61065061064b60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b829055565b60006040805173ffffffffffffffffffffffffffffffffffffffff841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526106cd91610808565b60405180910390a250565b61070c61070660017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60019055565b7fc32e6d5d6d1de257f64eac19ddb1f700ba13527983849c9486b1ab007ea283818160405161073b9190610808565b60405180910390a150565b6000806040838503121561075957600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461077d57600080fd5b91506020830135801515811461079257600080fd5b809150509250929050565b6000815180845260005b818110156107c3576020818501810151868301820152016107a7565b818111156107d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061081b602083018461079d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561086357600080fd5b813567ffffffffffffffff8082111561087b57600080fd5b818401915084601f83011261088f57600080fd5b8135818111156108a1576108a1610822565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108e7576108e7610822565b8160405282815287602084870101111561090057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600082821015610959577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a";
+    bytes internal constant protocolVersionsProxyCode =
+        hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a";
+    bytes internal constant protocolVersionsCode =
+        hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e73660046108c3565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101009190610947565b6100ec6101603660046108c3565b61021d565b6100ec61022e565b6100ec61017b36600461098a565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103f7565b6100f6610430565b6100ec6101c63660046109bd565b610460565b6100f6610514565b6100f6600081565b6101e361055f565b6101ec816105e0565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b81565b61022561055f565b6101ec81610698565b61023661055f565b6102406000610712565b565b600054610100900460ff16158080156102625750600054600160ff909116105b8061027c5750303b15801561027c575060005460ff166001145b61030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561036b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610373610789565b61037c84610460565b610385836105e0565b61038e82610698565b80156103f157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061042b61042760017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b5490565b905090565b600061042b61042760017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b61046861055f565b73ffffffffffffffffffffffffffffffffffffffff811661050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610304565b6101ec81610712565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b61061361060e60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b829055565b60008160405160200161062891815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161068c9190610947565b60405180910390a35050565b6106c661060e60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b6000816040516020016106db91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600161065b565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240600054610100900460ff166108ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b61024033610712565b6000602082840312156108d557600080fd5b5035919050565b6000815180845260005b81811015610902576020818501810151868301820152016108e6565b81811115610914576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061095a60208301846108dc565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461098557600080fd5b919050565b60008060006060848603121561099f57600080fd5b6109a884610961565b95602085013595506040909401359392505050565b6000602082840312156109cf57600080fd5b61095a82610961565b600082821015610a11577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a";
+    bytes internal constant optimismPortalProxyCode =
+        hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a";
+    bytes internal constant disputeGameFactoryProxyCode =
+        hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a";
+    bytes internal constant anchorStateRegistryProxyCode =
+        hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a";
+    bytes internal constant delayedWETHProxyCode =
+        hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a";
+    bytes internal constant systemConfigProxyCode =
+        hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a";
+    bytes internal constant l1StandardBridgeProxyCode =
+        hex"60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a";
+    bytes internal constant l1CrossDomainMessengerProxyCode =
+        hex"608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a";
+    bytes internal constant l1ERC721BridgeProxyCode =
+        hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a";
+    bytes internal constant optimismPortal2Code =
+        hex"6080604052600436106101b05760003560e01c80637fc48504116100ec578063a35d99df1161008a578063bf653a5c11610064578063bf653a5c1461062b578063cff0ab961461065e578063e9e05c42146106ff578063f2b4e6171461071257600080fd5b8063a35d99df14610544578063a3860f4814610564578063bb2c727e1461058457600080fd5b80638e819e54116100c65780638e819e5414610494578063952b2797146104b45780639bf62d82146104e7578063a14238e71461051457600080fd5b80637fc48504146104545780638b4c40b0146101d55780638c3152e91461047457600080fd5b80634870496f1161015957806354fd4d501161013357806354fd4d50146103a95780635c975abb146103ff57806371c1566e146104145780637d6be8dc1461043457600080fd5b80634870496f1461030c5780634fd0434c1461032c578063513747ab1461036e57600080fd5b806343ca1c501161018a57806343ca1c5014610297578063452a9320146102b757806345884d32146102cc57600080fd5b806333d7e2bd146101dc57806335e80ab3146102335780633c9f397c1461026557600080fd5b366101d7576101d53334620186a060006040518060200160405280600081525061073f565b005b600080fd5b3480156101e857600080fd5b506037546102099073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023f57600080fd5b5060355461020990610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561027157600080fd5b50603b546102829063ffffffff1681565b60405163ffffffff909116815260200161022a565b3480156102a357600080fd5b506101d56102b23660046146f9565b6108fc565b3480156102c357600080fd5b50610209610b5a565b3480156102d857600080fd5b506102fc6102e736600461474b565b603a6020526000908152604090205460ff1681565b604051901515815260200161022a565b34801561031857600080fd5b506101d5610327366004614768565b610bf2565b34801561033857600080fd5b50603b5461035590640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161022a565b34801561037a57600080fd5b5061039b610389366004614844565b6000908152603c602052604090205490565b60405190815260200161022a565b3480156103b557600080fd5b506103f26040518060400160405280600681526020017f332e31302e30000000000000000000000000000000000000000000000000000081525081565b60405161022a91906148d3565b34801561040b57600080fd5b506102fc611303565b34801561042057600080fd5b506101d561042f3660046148e6565b611396565b34801561044057600080fd5b506101d561044f36600461474b565b611c27565b34801561046057600080fd5b506101d561046f36600461491d565b611d0a565b34801561048057600080fd5b506101d561048f36600461493a565b611df6565b3480156104a057600080fd5b506101d56104af366004614977565b611e42565b3480156104c057600080fd5b507f000000000000000000000000000000000000000000000000000000000000000661039b565b3480156104f357600080fd5b506032546102099073ffffffffffffffffffffffffffffffffffffffff1681565b34801561052057600080fd5b506102fc61052f366004614844565b60336020526000908152604090205460ff1681565b34801561055057600080fd5b5061035561055f3660046149e9565b6120f7565b34801561057057600080fd5b5061020961057f366004614a06565b612116565b34801561059057600080fd5b506105f661059f3660046148e6565b603960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301520161022a565b34801561063757600080fd5b507f000000000000000000000000000000000000000000000000000000000000000c61039b565b34801561066a57600080fd5b506001546106c6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161022a565b6101d561070d366004614a36565b61073f565b34801561071e57600080fd5b506038546102099073ffffffffffffffffffffffffffffffffffffffff1681565b8260005a9050838015610767575073ffffffffffffffffffffffffffffffffffffffff871615155b1561079e576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107a883516120f7565b67ffffffffffffffff168567ffffffffffffffff1610156107f5576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c083511115610833576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33328114610854575033731111000000000000000000000000000000001111015b6000348888888860405160200161086f959493929190614ab5565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516108df91906148d3565b60405180910390a450506108f38282612177565b50505050505050565b610904611303565b1561093b576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead146109e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084015b60405180910390fd5b60006109f48361244e565b9050610a008183611396565b600081815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558401516080850151606086015160a0870151610aa29392919061249b565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90610b0790841515815260200190565b60405180910390a280158015610b1d5750326001145b15610b54576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190614b1a565b905090565b610bfa611303565b15610c31576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610cf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016109e0565b6038546040517fbb8aa1fc00000000000000000000000000000000000000000000000000000000815260048101869052600091829173ffffffffffffffffffffffffffffffffffffffff9091169063bb8aa1fc90602401606060405180830381865afa158015610d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d889190614b37565b925050915060008173ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfe9190614b84565b603b5490915063ffffffff848116911614610e9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b610eb2610ead36889003880188614b9d565b6124f9565b8114610f40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016109e0565b6000610f4b8961244e565b905060018373ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe9190614c32565b6002811115610fcf57610fcf614c03565b0361105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f742070726f76652061676160448201527f696e737420696e76616c696420646973707574652067616d657300000000000060648201526084016109e0565b60408051602081018390526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506111259101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529061111b898b614c53565b8b60400135612538565b6111b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016109e0565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff808716825267ffffffffffffffff4281166020808501918252600088815260398252868120338252825286812095518654935190941674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931693851693909317919091179093558d840151928e01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4604051339083907f798f9f13695f8f045aa5f80ed8efebb695f3c7fe65da381969f2f28bf3c60b9790600090a3506000908152603c602090815260408220805460018101825590835291200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190614cd7565b600082815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff85811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152818552603a90935292205490919060ff161561149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652068617360448201527f206265656e20626c61636b6c697374656400000000000000000000000000000060648201526084016109e0565b816020015167ffffffffffffffff1660000361155f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2062792070726f6f66207375626d6974746560648201527f7220616464726573732079657400000000000000000000000000000000000000608482015260a4016109e0565b60006115e08273ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d39190614cf4565b67ffffffffffffffff1690565b90508067ffffffffffffffff16836020015167ffffffffffffffff16116116af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e20646973707574652067616d65206372656160648201527f74696f6e2074696d657374616d70000000000000000000000000000000000000608482015260a4016109e0565b7f000000000000000000000000000000000000000000000000000000000000000c836020015167ffffffffffffffff16426116ea9190614d40565b11611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c20686173206e6f74206d61747572656420796574000000000000000000000060648201526084016109e0565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e89190614c32565b60028111156117f9576117f9614c03565b14611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f686173206e6f74206265656e2076616c6964617465640000000000000000000060648201526084016109e0565b603b5463ffffffff1663ffffffff166119108373ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119079190614d57565b63ffffffff1690565b63ffffffff16146119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b603b5467ffffffffffffffff64010000000090910481169082161015611a71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652063726560448201527f61746564206265666f7265207265737065637465642067616d6520747970652060648201527f7761732075706461746564000000000000000000000000000000000000000000608482015260a4016109e0565b7f0000000000000000000000000000000000000000000000000000000000000006611ae08373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115af573d6000803e3d6000fd5b611af49067ffffffffffffffff1642614d40565b11611b81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f696e206169722d6761700000000000000000000000000000000000000000000060648201526084016109e0565b60008581526033602052604090205460ff1615611c20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016109e0565b5050505050565b611c2f610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c93576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000818152603a602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f192c289026d59a41a27f5aea08f3969b57931b0589202d14f4368cded95d3cda9190a250565b611d12610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d76576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b805463ffffffff83167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090911681176401000000004267ffffffffffffffff90811682029290921793849055604051930416917f049fe9dd413cdf037cce27011cc1790c753118272f3630e6e8bdfa5e8208176090600090a350565b565b611dfe611303565b15611e35576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e3f81336108fc565b50565b600054610100900460ff1615808015611e625750600054600160ff909116105b80611e7c5750303b158015611e7c575060005460ff166001145b611f08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109e0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611f6657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8881169190911790925560378054909116868316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008684160217905560325416612086576032805461dead7fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055603b80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166401000000004267ffffffffffffffff16027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000161763ffffffff84161790555b61208e61255c565b8015611c2057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6000612104826010614d74565b61211090615208614da4565b92915050565b603c602052816000526040600020818154811061213257600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6001546000906121ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614d40565b905060006121b961266f565b90506000816020015160ff16826000015163ffffffff166121da9190614dff565b9050821561231157600154600090612211908390700100000000000000000000000000000000900467ffffffffffffffff16614e67565b90506000836040015160ff16836122289190614edb565b6001546122489084906fffffffffffffffffffffffffffffffff16614edb565b6122529190614dff565b6001549091506000906122a39061227c9084906fffffffffffffffffffffffffffffffff16614f97565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612730565b905060018611156122d2576122cf61227c82876040015160ff1660018a6122ca9190614d40565b61274f565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090612344908490700100000000000000000000000000000000900467ffffffffffffffff16614da4565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156123d1576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906123fd906fffffffffffffffffffffffffffffffff1667ffffffffffffffff881661500b565b9050600061240f48633b9aca006127a4565b6124199083615048565b905060005a6124289088614d40565b9050808211156124445761244461243f8284614d40565b6127bb565b5050505050505050565b80516020808301516040808501516060860151608087015160a0880151935160009761247e97909695910161505c565b604051602081830303815290604052805190602001209050919050565b60008060006124ab8660006127e9565b9050806124e1576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b6000816000015182602001518360400151846060015160405160200161247e949392919093845260208401929092526040830152606082015260800190565b60008061254486612807565b905061255281868686612839565b9695505050505050565b600054610100900460ff166125f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e0565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003611df45760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa15801561270c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed91906150c9565b600061274561273f8585612869565b83612879565b90505b9392505050565b6000670de0b6b3a76400006127906127678583614dff565b61277990670de0b6b3a7640000614e67565b61278b85670de0b6b3a7640000614edb565b612888565b61279a9086614edb565b6127459190614dff565b6000818310156127b45781612748565b5090919050565b6000805a90505b825a6127ce9083614d40565b10156127e4576127dd82615185565b91506127c2565b505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6060818051906020012060405160200161282391815260200190565b6040516020818303038152906040529050919050565b60006128608461284a8786866128b9565b8051602091820120825192909101919091201490565b95945050505050565b6000818312156127b45781612748565b60008183126127b45781612748565b6000612748670de0b6b3a7640000836128a086613337565b6128aa9190614edb565b6128b49190614dff565b61357b565b60606000845111612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b6579000000000000000000000060448201526064016109e0565b6000612931846137ba565b9050600061293e866138a6565b905060008460405160200161295591815260200190565b60405160208183030381529060405290506000805b84518110156132ae576000858281518110612987576129876151bd565b602002602001015190508451831115612a22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016109e0565b82600003612adb5780518051602091820120604051612a7092612a4a92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612ad6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016109e0565b612c32565b805151602011612b915780518051602091820120604051612b0592612a4a92910190815260200190565b612ad6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016109e0565b805184516020808701919091208251919092012014612c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016109e0565b612c3e601060016151ec565b81602001515103612e1a5784518303612db257612c788160200151601081518110612c6b57612c6b6151bd565b6020026020010151613909565b96506000875111612d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016109e0565b60018651612d199190614d40565b8214612da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016109e0565b505050505050612748565b6000858481518110612dc657612dc66151bd565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110612df157612df16151bd565b60200260200101519050612e04816139bd565b9550612e116001866151ec565b9450505061329b565b600281602001515103613213576000612e32826139e2565b9050600081600081518110612e4957612e496151bd565b016020015160f81c90506000612e60600283615204565b612e6b906002615226565b90506000612e7c848360ff16613a06565b90506000612e8a8a89613a06565b90506000612e988383613a3c565b905080835114612f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016109e0565b60ff851660021480612f3f575060ff85166003145b1561312e5780825114612fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016109e0565b612fee8760200151600181518110612c6b57612c6b6151bd565b9c5060008d5111613081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016109e0565b60018c5161308f9190614d40565b881461311d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016109e0565b505050505050505050505050612748565b60ff85161580613141575060ff85166001145b156131805761316d8760200151600181518110613160576131606151bd565b60200260200101516139bd565b9950613179818a6151ec565b9850613208565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016109e0565b50505050505061329b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016109e0565b50806132a681615185565b91505061296a565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016109e0565b60008082136133a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b600060606133af84613af0565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136135ac57506000919050565b680755bf798b4a1bf1e5821261361e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016109e0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156137d8576137d861451c565b60405190808252806020026020018201604052801561381d57816020015b60408051808201909152606080825260208201528152602001906001900390816137f65790505b50915060005b8181101561389f576040518060400160405280858381518110613848576138486151bd565b6020026020010151815260200161387786848151811061386a5761386a6151bd565b6020026020010151613bc6565b81525083828151811061388c5761388c6151bd565b6020908102919091010152600101613823565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b838110156138fe578060011b82018184015160001a8060041c8253600f8116600183015350506001016138d0565b509295945050505050565b6060600080600061391985613bd9565b91945092509050600081600181111561393457613934614c03565b1461396b576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61397582846151ec565b8551146139ae576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61286085602001518484614077565b606060208260000151106139d9576139d482613909565b612110565b6121108261410b565b6060612110613a018360200151600081518110612c6b57612c6b6151bd565b6138a6565b606082518210613a255750604080516020810190915260008152612110565b6127488383848651613a379190614d40565b614121565b6000808251845110613a4f578251613a52565b83515b90505b8082108015613ad95750828281518110613a7157613a716151bd565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613ab057613ab06151bd565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613ae957816001019150613a55565b5092915050565b6000808211613b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060612110613bd4836142f9565b614366565b60008060008360000151600003613c1c576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111613c41576000600160009450945094505050614070565b60b78111613d57576000613c56608083614d40565b905080876000015111613c95576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015613d0d57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15613d44576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614070915050565b60bf8111613eb5576000613d6c60b783614d40565b905080876000015111613dab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613e0d576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111613e55576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e5f81846151ec565b895111613e98576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ea38360016151ec565b97509550600094506140709350505050565b60f78111613f1a576000613eca60c083614d40565b905080876000015111613f09576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614070915050565b6000613f2760f783614d40565b905080876000015111613f66576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613fc8576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614010576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61401a81846151ec565b895111614053576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61405e8360016151ec565b97509550600194506140709350505050565b9193909250565b60608167ffffffffffffffff8111156140925761409261451c565b6040519080825280601f01601f1916602001820160405280156140bc576020820181803683370190505b50905081156127485760006140d184866151ec565b90506020820160005b848110156140f25782810151828201526020016140da565b84811115614101576000858301525b5050509392505050565b6060612110826020015160008460000151614077565b60608182601f011015614190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b8282840110156141fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b81830184511015614269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016109e0565b60608215801561428857604051915060008252602082016040526142f0565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156142c15780518352602092830192016142a9565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201528151600003614348576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061437685613bd9565b91945092509050600181600181111561439157614391614c03565b146143c8576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516143d483856151ec565b1461440b576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816144225790505093506000835b8651811015614510576000806144956040518060400160405280858c600001516144799190614d40565b8152602001858c6020015161448e91906151ec565b9052613bd9565b5091509150604051806040016040528083836144b191906151ec565b8152602001848b602001516144c691906151ec565b8152508885815181106144db576144db6151bd565b60209081029190910101526144f16001856151ec565b93506144fd81836151ec565b61450790846151ec565b9250505061444f565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156145925761459261451c565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e3f57600080fd5b600082601f8301126145cd57600080fd5b813567ffffffffffffffff8111156145e7576145e761451c565b61461860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161454b565b81815284602083860101111561462d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561465c57600080fd5b60405160c0810167ffffffffffffffff82821081831117156146805761468061451c565b81604052829350843583526020850135915061469b8261459a565b816020840152604085013591506146b18261459a565b816040840152606085013560608401526080850135608084015260a08501359150808211156146df57600080fd5b506146ec858286016145bc565b60a0830152505092915050565b6000806040838503121561470c57600080fd5b823567ffffffffffffffff81111561472357600080fd5b61472f8582860161464a565b92505060208301356147408161459a565b809150509250929050565b60006020828403121561475d57600080fd5b81356127488161459a565b600080600080600085870360e081121561478157600080fd5b863567ffffffffffffffff8082111561479957600080fd5b6147a58a838b0161464a565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0840112156147de57600080fd5b60408901955060c08901359250808311156147f857600080fd5b828901925089601f84011261480c57600080fd5b823591508082111561481d57600080fd5b508860208260051b840101111561483357600080fd5b959894975092955050506020019190565b60006020828403121561485657600080fd5b5035919050565b60005b83811015614878578181015183820152602001614860565b83811115610b545750506000910152565b600081518084526148a181602086016020860161485d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006127486020830184614889565b600080604083850312156148f957600080fd5b8235915060208301356147408161459a565b63ffffffff81168114611e3f57600080fd5b60006020828403121561492f57600080fd5b81356127488161490b565b60006020828403121561494c57600080fd5b813567ffffffffffffffff81111561496357600080fd5b61496f8482850161464a565b949350505050565b6000806000806080858703121561498d57600080fd5b84356149988161459a565b935060208501356149a88161459a565b925060408501356149b88161459a565b915060608501356149c88161490b565b939692955090935050565b67ffffffffffffffff81168114611e3f57600080fd5b6000602082840312156149fb57600080fd5b8135612748816149d3565b60008060408385031215614a1957600080fd5b50508035926020909101359150565b8015158114611e3f57600080fd5b600080600080600060a08688031215614a4e57600080fd5b8535614a598161459a565b9450602086013593506040860135614a70816149d3565b92506060860135614a8081614a28565b9150608086013567ffffffffffffffff811115614a9c57600080fd5b614aa8888289016145bc565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614b0981604985016020870161485d565b919091016049019695505050505050565b600060208284031215614b2c57600080fd5b81516127488161459a565b600080600060608486031215614b4c57600080fd5b8351614b578161490b565b6020850151909350614b68816149d3565b6040850151909250614b798161459a565b809150509250925092565b600060208284031215614b9657600080fd5b5051919050565b600060808284031215614baf57600080fd5b6040516080810181811067ffffffffffffffff82111715614bd257614bd261451c565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215614c4457600080fd5b81516003811061274857600080fd5b600067ffffffffffffffff80841115614c6e57614c6e61451c565b8360051b6020614c7f81830161454b565b868152918501918181019036841115614c9757600080fd5b865b84811015614ccb57803586811115614cb15760008081fd5b614cbd36828b016145bc565b845250918301918301614c99565b50979650505050505050565b600060208284031215614ce957600080fd5b815161274881614a28565b600060208284031215614d0657600080fd5b8151612748816149d3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614d5257614d52614d11565b500390565b600060208284031215614d6957600080fd5b81516127488161490b565b600067ffffffffffffffff80831681851681830481118215151615614d9b57614d9b614d11565b02949350505050565b600067ffffffffffffffff808316818516808303821115614dc757614dc7614d11565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614e0e57614e0e614dd0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614e6257614e62614d11565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615614ea157614ea1614d11565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614ed557614ed5614d11565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614f1c57614f1c614d11565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614f5757614f57614d11565b60008712925087820587128484161615614f7357614f73614d11565b87850587128184161615614f8957614f89614d11565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614fd157614fd1614d11565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561500557615005614d11565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561504357615043614d11565b500290565b60008261505757615057614dd0565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526150a760c0830184614889565b98975050505050505050565b805160ff811681146150c457600080fd5b919050565b600060c082840312156150db57600080fd5b60405160c0810181811067ffffffffffffffff821117156150fe576150fe61451c565b604052825161510c8161490b565b815261511a602084016150b3565b602082015261512b604084016150b3565b6040820152606083015161513e8161490b565b606082015260808301516151518161490b565b608082015260a08301516fffffffffffffffffffffffffffffffff8116811461517957600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036151b6576151b6614d11565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082198211156151ff576151ff614d11565b500190565b600060ff83168061521757615217614dd0565b8060ff84160691505092915050565b600060ff821660ff84168082101561524057615240614d11565b9003939250505056fea164736f6c634300080f000a";
+    bytes internal constant l1CrossDomainMessengerCode =
+        hex"60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdf565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ba9190611cb1565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611ccb565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611ccb565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce4565b6109bd565b34801561048757600080fd5b506102a6610496366004611d38565b610a2b565b6102a66104a9366004611d83565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eb1565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611eff565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f50565b6109e39190611f80565b6109ee601088611f50565b6109fb9062030d40611fce565b610a059190611fce565b610a0f9190611fce565b610a199190611fce565b610a239190611fce565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ffa565b600081815260ce602052604090205460ff1615610f4457610f44611ffa565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fce565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612029565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ffa565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611983565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611673908890839089906000908990600401612040565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a20565b805190602001209050949350505050565b6000611816878787878787611ab9565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612098565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906120b5565b90939092509050565b606084848484604051602401611a3994939291906120f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad69695949392919061213f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7a57600080fd5b50565b60008083601f840112611b8f57600080fd5b50813567ffffffffffffffff811115611ba757600080fd5b602083019150836020828501011115611bbf57600080fd5b9250929050565b803563ffffffff81168114611bda57600080fd5b919050565b60008060008060608587031215611bf557600080fd5b8435611c0081611b58565b9350602085013567ffffffffffffffff811115611c1c57600080fd5b611c2887828801611b7d565b9094509250611c3b905060408601611bc6565b905092959194509250565b6000815180845260005b81811015611c6c57602081850181015186830182015201611c50565b81811115611c7e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc46020830184611c46565b9392505050565b600060208284031215611cdd57600080fd5b5035919050565b600080600060408486031215611cf957600080fd5b833567ffffffffffffffff811115611d1057600080fd5b611d1c86828701611b7d565b9094509250611d2f905060208501611bc6565b90509250925092565b600080600060608486031215611d4d57600080fd5b8335611d5881611b58565b92506020840135611d6881611b58565b91506040840135611d7881611b58565b809150509250925092565b600080600080600080600060c0888a031215611d9e57600080fd5b873596506020880135611db081611b58565b95506040880135611dc081611b58565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611dea57600080fd5b611df68a828b01611b7d565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea460c083018486611e09565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611ee1608083018688611e09565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f1157600080fd5b81518015158114611cc457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7757611f77611f21565b02949350505050565b600067ffffffffffffffff80841680611fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ff157611ff1611f21565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203b5761203b611f21565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208d60a0830184611c46565b979650505050505050565b6000602082840312156120aa57600080fd5b8151611cc481611b58565b600080604083850312156120c857600080fd5b82516120d381611b58565b602084015190925060ff811681146120ea57600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212e6080830185611c46565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218a60c0830184611c46565b9897505050505050505056fea164736f6c634300080f000a";
+    bytes internal constant systemConfigCode =
+        hex"608060405234801561001057600080fd5b50600436106102de5760003560e01c8063a711986911610186578063e0e2016d116100e3578063f2fde38b11610097578063f8c68de011610071578063f8c68de0146106e2578063fd32aa0f146106ea578063ffa1ad74146106f257600080fd5b8063f2fde38b146106b2578063f45e65d8146106c5578063f68016b7146106ce57600080fd5b8063e81b2c6d116100c8578063e81b2c6d14610681578063ec7075171461068a578063f2b4e617146106aa57600080fd5b8063e0e2016d14610671578063e2a3285c1461067957600080fd5b8063c9b26f611161013a578063d84447151161011f578063d84447151461064e578063dac6e63a14610656578063db9040fa1461065e57600080fd5b8063c9b26f6114610507578063cc731b021461051a57600080fd5b8063bc49ce5f1161016b578063bc49ce5f146104c6578063bfb14fb7146104ce578063c4e8ddfa146104ff57600080fd5b8063a7119869146104ab578063b40a817c146104b357600080fd5b80634397dfef1161023f578063550fcdc9116101f35780638da5cb5b116101cd5780638da5cb5b14610472578063935f029e146104905780639b7d7f0a146104a357600080fd5b8063550fcdc91461045a5780635d73369c14610462578063715018a61461046a57600080fd5b80634add321d116102245780634add321d146103e95780634f16540b146103f157806354fd4d501461041857600080fd5b80634397dfef146103ab57806348cd4cb1146103e157600080fd5b806318d13918116102965780631fd19ee11161027b5780631fd19ee114610378578063213268491461038057806321d7fde51461039857600080fd5b806318d139181461035b57806319f5cea81461037057600080fd5b80630a49cb03116102c75780630a49cb031461032b5780630ae14b1b146103335780630c18c1621461035257600080fd5b806306c92657146102e3578063078f29cf146102fe575b600080fd5b6102eb6106fa565b6040519081526020015b60405180910390f35b610306610728565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f5565b610306610761565b630bebc2005b60405167ffffffffffffffff90911681526020016102f5565b6102eb60655481565b61036e610369366004612241565b610791565b005b6102eb6107a5565b6103066107d0565b6103886107fa565b60405190151581526020016102f5565b61036e6103a6366004612277565b610839565b6103b361084f565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016102f5565b6102eb610863565b610339610893565b6102eb7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b60408051808201909152600c81527f322e332e302d626574612e32000000000000000000000000000000000000000060208201525b6040516102f59190612320565b61044d6108b9565b6102eb6108c3565b61036e6108ee565b60335473ffffffffffffffffffffffffffffffffffffffff16610306565b61036e61049e366004612333565b610902565b610306610914565b610306610944565b61036e6104c136600461236d565b610974565b6102eb610985565b6068546104ea9068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f5565b6103066109b0565b61036e610515366004612388565b6109e0565b6105de6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102f59190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61044d6109f1565b6103066109fb565b61036e61066c3660046124bb565b610a2b565b6102eb610e36565b6102eb610e61565b6102eb60675481565b6068546104ea906c01000000000000000000000000900463ffffffff1681565b610306610e8c565b61036e6106c0366004612241565b610ebc565b6102eb60665481565b6068546103399067ffffffffffffffff1681565b6102eb610f70565b6102eb610f9b565b6102eb600081565b61072560017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b81565b600061075c61075860017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b5490565b905090565b600061075c61075860017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b610799611201565b6107a281611282565b50565b61072560017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b600061075c7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b60008061080561084f565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b610841611201565b61084b828261133f565b5050565b60008061085a611184565b90939092509050565b600061075c61075860017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b60695460009061075c9063ffffffff6a0100000000000000000000820481169116612654565b606061075c61147d565b61072560017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b6108f6611201565b610900600061153e565b565b61090a611201565b61084b82826115b5565b600061075c61075860017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b600061075c61075860017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b61097c611201565b6107a28161168b565b61072560017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b600061075c61075860017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b6109e8611201565b6107a2816117e1565b606061075c611809565b600061075c61075860017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b600054610100900460ff1615808015610a4b5750600054600160ff909116105b80610a655750303b158015610a65575060005460ff166001145b610af6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b5457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b5c6118bf565b610b658a610ebc565b610b6e876117e1565b610b78898961133f565b610b818661168b565b610baa7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b610bdd610bd860017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b849055565b610c11610c0b60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b83519055565b610c48610c3f60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b60208401519055565b610c7f610c7660017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b60408401519055565b610cb6610cad60017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b60608401519055565b610ced610ce460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b60808401519055565b610d24610d1b60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b60a08401519055565b610d2c61195e565b610d398260c001516119c6565b610d4284611cd0565b610d4a610893565b67ffffffffffffffff168667ffffffffffffffff161015610dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b8015610e2a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61072560017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b61072560017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b600061075c61075860017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b610ec4611201565b73ffffffffffffffffffffffffffffffffffffffff8116610f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610aed565b6107a28161153e565b61072560017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b61072560017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600060208251111561107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e203332206279746573000000000000000000006064820152608401610aed565b6110838261115b565b92915050565b6110ef6110b760017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec61263d565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b61112261111d60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d61263d565b839055565b61115561115060017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd0576461263d565b829055565b50505050565b8051602181106111735763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b600080806111b661075860017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec61263d565b73ffffffffffffffffffffffffffffffffffffffff811693509050826111f5575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b60335473ffffffffffffffffffffffffffffffffffffffff163314610900576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aed565b6112ab7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516113339190612320565b60405180910390a35050565b606880547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000063ffffffff8581169182027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16929092176c0100000000000000000000000092851692909202919091179091557f0100000000000000000000000000000000000000000000000000000000000000602083811b67ffffffff000000001690921717606681905560655460408051938401919091528201526000906060015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516114709190612320565b60405180910390a3505050565b60606000611489611184565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161150257505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b61153861153361075860017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd0576461263d565b612144565b91505090565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7fff00000000000000000000000000000000000000000000000000000000000000811615611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f53797374656d436f6e6669673a207363616c61722065786365656473206d617860448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610aed565b60658290556066819055604080516020810184905290810182905260009060600161140d565b611693610893565b67ffffffffffffffff168167ffffffffffffffff161015611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b630bebc20067ffffffffffffffff82161115611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f20686967686044820152606401610aed565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611302565b6067819055604080516020808201849052825180830390910181529082019091526000611302565b60606000611815611184565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161188e57505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b61153861153361075860017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d61263d565b600054610100900460ff16611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610aed565b610900612178565b61198c61075860017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b600003610900576109006119c160017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b439055565b73ffffffffffffffffffffffffffffffffffffffff811615801590611a15575073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b8015611a265750611a246107fa565b155b156107a257601260ff168173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f9190612680565b60ff1614611b2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201527f7320706179696e6720746f6b656e0000000000000000000000000000000000006064820152608401610aed565b6000611bca8273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b7f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611bc5919081019061269d565b610fe6565b90506000611c1c8373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b7f573d6000803e3d6000fd5b9050611c2b8360128484611089565b611c33610761565b6040517f71cfaa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b158015611cb357600080fd5b505af1158015611cc7573d6000803e3d6000fd5b50505050505050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611d80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610aed565b6001816040015160ff1611611e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610aed565b6068546080820151825167ffffffffffffffff90921691611e389190612768565b63ffffffff161115611ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b6000816020015160ff1611611f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610aed565b8051602082015163ffffffff82169160ff90911690611f5d908290612787565b611f6791906127d1565b63ffffffff1614611ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610aed565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60405160005b82811a1561215a5760010161214a565b80825260208201838152600082820152505060408101604052919050565b600054610100900460ff1661220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610aed565b6109003361153e565b803573ffffffffffffffffffffffffffffffffffffffff8116811461223c57600080fd5b919050565b60006020828403121561225357600080fd5b61225c82612218565b9392505050565b803563ffffffff8116811461223c57600080fd5b6000806040838503121561228a57600080fd5b61229383612263565b91506122a160208401612263565b90509250929050565b60005b838110156122c55781810151838201526020016122ad565b838111156111555750506000910152565b600081518084526122ee8160208601602086016122aa565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061225c60208301846122d6565b6000806040838503121561234657600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461223c57600080fd5b60006020828403121561237f57600080fd5b61225c82612355565b60006020828403121561239a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156123f3576123f36123a1565b60405290565b60ff811681146107a257600080fd5b600060e0828403121561241a57600080fd5b60405160e0810181811067ffffffffffffffff8211171561243d5761243d6123a1565b60405290508061244c83612218565b815261245a60208401612218565b602082015261246b60408401612218565b604082015261247c60608401612218565b606082015261248d60808401612218565b608082015261249e60a08401612218565b60a08201526124af60c08401612218565b60c08201525092915050565b6000806000806000806000806000898b036102808112156124db57600080fd5b6124e48b612218565b99506124f260208c01612263565b985061250060408c01612263565b975060608b0135965061251560808c01612355565b955061252360a08c01612218565b945060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201121561255557600080fd5b5061255e6123d0565b61256a60c08c01612263565b815260e08b013561257a816123f9565b60208201526101008b013561258e816123f9565b60408201526125a06101208c01612263565b60608201526125b26101408c01612263565b60808201526101608b01356fffffffffffffffffffffffffffffffff811681146125db57600080fd5b60a082015292506125ef6101808b01612218565b91506125ff8b6101a08c01612408565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561264f5761264f61260e565b500390565b600067ffffffffffffffff8083168185168083038211156126775761267761260e565b01949350505050565b60006020828403121561269257600080fd5b815161225c816123f9565b6000602082840312156126af57600080fd5b815167ffffffffffffffff808211156126c757600080fd5b818401915084601f8301126126db57600080fd5b8151818111156126ed576126ed6123a1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715612733576127336123a1565b8160405282815287602084870101111561274c57600080fd5b61275d8360208301602088016122aa565b979650505050505050565b600063ffffffff8083168185168083038211156126775761267761260e565b600063ffffffff808416806127c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff808316818516818304811182151516156127f4576127f461260e565b0294935050505056fea164736f6c634300080f000a";
+    bytes internal constant l1StandardBridgeCode =
+        hex"6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612993565b6105b8565b61023b610270366004612a44565b6109d2565b61023b610283366004612a97565b610aa9565b61023b610296366004612a97565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612b0a565b61101b565b34801561037857600080fd5b506103b56040518060400160405280600581526020017f322e322e3000000000000000000000000000000000000000000000000000000081525081565b6040516102e99190612bf7565b3480156103ce57600080fd5b5061023b6103dd366004612c0a565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612b0a565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612c0a565b611212565b34801561047e57600080fd5b506104aa61048d366004612c8d565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612cc6565b6112e6565b34801561050257600080fd5b5061023b610511366004612993565b611328565b61023b610524366004612a44565b611337565b34801561053557600080fd5b5061023b610544366004612d29565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612cc6565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612dc0565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612dd7565b905090565b6109c987873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f84734200000000000000000000000000000000000010612021565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a8585858461210b565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612df9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612e42565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b806119055750611905827fec4fc8e30000000000000000000000000000000000000000000000000000000061217e565b92915050565b6000611937837f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612d74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526121a1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612e87565b60405180910390a46110138686868686866122ad565b600080611b98612335565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612ec5565b60405180910390a36105b2848484846123d2565b600080600080845160208601878a8af19695505050505050565b3415611ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610214565b611cf0876118a9565b15611e3e57611cff878761190b565b611db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b50505050611ed2565b611e6073ffffffffffffffffffffffffffffffffffffffff881686308661243f565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e9e908490612ede565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611ee087878787878661249d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611f44908b908d908c908c908c908b90602401612ef6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611fd792918790600401612e42565b600060405180830381600087803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c59565b600054610100900460ff166120b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23848460405161216a929190612ec5565b60405180910390a36105b28484848461252b565b60006121898361258a565b801561219a575061219a83836125ee565b9392505050565b6000612203826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126bd9092919063ffffffff16565b805190915015610aa457808060200190518101906122219190612dd7565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161232593929190612e87565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c99190612f51565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612431929190612ec5565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161251593929190612e87565b60405180910390a46110138686868686866126d4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612431929190612ec5565b60006125b6827f01ffc9a7000000000000000000000000000000000000000000000000000000006125ee565b801561190557506125e7827fffffffff000000000000000000000000000000000000000000000000000000006125ee565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156126a6575060208210155b80156126b25750600081115b979650505050505050565b60606126cc848460008561274c565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161232593929190612e87565b6060824710156127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b61285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128859190612f86565b60006040518083038185875af1925050503d80600081146128c2576040519150601f19603f3d011682016040523d82523d6000602084013e6128c7565b606091505b50915091506126b2828286606083156128e157508161219a565b8251156128f15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612bf7565b73ffffffffffffffffffffffffffffffffffffffff8116811461294757600080fd5b50565b60008083601f84011261295c57600080fd5b50813567ffffffffffffffff81111561297457600080fd5b60208301915083602082850101111561298c57600080fd5b9250929050565b600080600080600080600060c0888a0312156129ae57600080fd5b87356129b981612925565b965060208801356129c981612925565b955060408801356129d981612925565b945060608801356129e981612925565b93506080880135925060a088013567ffffffffffffffff811115612a0c57600080fd5b612a188a828b0161294a565b989b979a50959850939692959293505050565b803563ffffffff81168114612a3f57600080fd5b919050565b600080600060408486031215612a5957600080fd5b612a6284612a2b565b9250602084013567ffffffffffffffff811115612a7e57600080fd5b612a8a8682870161294a565b9497909650939450505050565b600080600080600060808688031215612aaf57600080fd5b8535612aba81612925565b94506020860135612aca81612925565b935060408601359250606086013567ffffffffffffffff811115612aed57600080fd5b612af98882890161294a565b969995985093965092949392505050565b600080600080600080600060c0888a031215612b2557600080fd5b8735612b3081612925565b96506020880135612b4081612925565b95506040880135612b5081612925565b945060608801359350612b6560808901612a2b565b925060a088013567ffffffffffffffff811115612a0c57600080fd5b60005b83811015612b9c578181015183820152602001612b84565b838111156105b25750506000910152565b60008151808452612bc5816020860160208601612b81565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061219a6020830184612bad565b60008060008060008060a08789031215612c2357600080fd5b8635612c2e81612925565b95506020870135612c3e81612925565b945060408701359350612c5360608801612a2b565b9250608087013567ffffffffffffffff811115612c6f57600080fd5b612c7b89828a0161294a565b979a9699509497509295939492505050565b60008060408385031215612ca057600080fd5b8235612cab81612925565b91506020830135612cbb81612925565b809150509250929050565b60008060008060608587031215612cdc57600080fd5b8435612ce781612925565b9350612cf560208601612a2b565b9250604085013567ffffffffffffffff811115612d1157600080fd5b612d1d8782880161294a565b95989497509550505050565b600080600060608486031215612d3e57600080fd5b8335612d4981612925565b92506020840135612d5981612925565b91506040840135612d6981612925565b809150509250925092565b600060208284031215612d8657600080fd5b815161219a81612925565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612dd257612dd2612d91565b500390565b600060208284031215612de957600080fd5b8151801515811461219a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612e386080830184612bad565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612e716060830185612bad565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612ebc6060830184612bad565b95945050505050565b8281526040602082015260006126cc6040830184612bad565b60008219821115612ef157612ef1612d91565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612f4560c0830184612bad565b98975050505050505050565b60008060408385031215612f6457600080fd5b8251612f6f81612925565b602084015190925060ff81168114612cbb57600080fd5b60008251612f98818460208701612b81565b919091019291505056fea164736f6c634300080f000a";
+    bytes internal constant l1ERC721BridgeCode =
+        hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a";
+    bytes internal constant disputeGameFactoryCode =
+        hex"6080604052600436106100e85760003560e01c80636593dc6e1161008a57806396cd97201161005957806396cd972014610313578063bb8aa1fc14610333578063c4d66de814610394578063f2fde38b146103b457600080fd5b80636593dc6e14610293578063715018a6146102c057806382ecf2f6146102d55780638da5cb5b146102e857600080fd5b8063254bd683116100c6578063254bd6831461019c5780634d1975b4146101c957806354fd4d50146101e85780635f0150cb1461023e57600080fd5b806314f6b1a3146100ed5780631b685b9e1461010f5780631e3342401461017c575b600080fd5b3480156100f957600080fd5b5061010d6101083660046110c6565b6103d4565b005b34801561011b57600080fd5b5061015261012a3660046110fd565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061010d610197366004611118565b61045e565b3480156101a857600080fd5b506101bc6101b7366004611142565b6104aa565b60405161017391906111ef565b3480156101d557600080fd5b506068545b604051908152602001610173565b3480156101f457600080fd5b506102316040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161017391906112ac565b34801561024a57600080fd5b5061025e6102593660046112bf565b6106ee565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff909116602083015201610173565b34801561029f57600080fd5b506101da6102ae3660046110fd565b60666020526000908152604090205481565b3480156102cc57600080fd5b5061010d610741565b6101526102e33660046112bf565b610755565b3480156102f457600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610152565b34801561031f57600080fd5b506101da61032e3660046112bf565b6109ef565b34801561033f57600080fd5b5061035361034e366004611346565b610a28565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610173565b3480156103a057600080fd5b5061010d6103af36600461135f565b610a91565b3480156103c057600080fd5b5061010d6103cf36600461135f565b610c2d565b6103dc610d00565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610466610d00565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806104bc575081155b6106e7575060408051600583901b8101602001909152825b8381116106e5576000606882815481106104f0576104f061137c565b600091825260209091200154905060e081901c60a082901c67ffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff831663ffffffff891683036106b6576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d091908101906113da565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064391906114a5565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a5161068591906114be565b815181106106955761069561137c565b6020026020010181905250888851106106b3575050505050506106e5565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506104d49050565b505b9392505050565b60008060006106ff878787876109ef565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610749610d00565b6107536000610d81565b565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107c5576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff86166000908152606660205260409020543414610813576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108206001436114be565b40905061088a338783888860405160200161083f9594939291906114fc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff841690610df8565b92508273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108d457600080fd5b505af11580156108e8573d6000803e3d6000fd5b505050505060006108fb888888886109ef565b60008181526067602052604090205490915015610947576040517f014f6fe5000000000000000000000000000000000000000000000000000000008152600481018290526024016107bc565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610a089493929190611549565b604051602081830303815290604052805190602001209050949350505050565b600080600080600080610a8160688881548110610a4757610a4761137c565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9199909850909650945050505050565b600054610100900460ff1615808015610ab15750600054600160ff909116105b80610acb5750303b158015610acb575060005460ff166001145b610b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bc565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bb557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bbd610e06565b610bc682610d81565b8015610c2957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610c35610d00565b73ffffffffffffffffffffffffffffffffffffffff8116610cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bc565b610ce181610d81565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006106e760008484610ea5565b600054610100900460ff16610e9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b610753610feb565b600060608203516040830351602084035184518060208701018051600283016c5af43d3d93803e606057fd5bf3895289600d8a035278593da1005b363d3d373d3d3d3d610000806062363936013d738160481b1760218a03527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff603a8a035272fd6100003d81600a3d39f336602c57343d527f6062820160781b1761ff9e82106059018a03528060f01b8352606c8101604c8a038cf097505086610f715763301164256000526004601cfd5b905285527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09092019190915292915050565b600054610100900460ff16611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b61075333610d81565b803563ffffffff8116811461109f57600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ce157600080fd5b600080604083850312156110d957600080fd5b6110e28361108b565b915060208301356110f2816110a4565b809150509250929050565b60006020828403121561110f57600080fd5b6106e78261108b565b6000806040838503121561112b57600080fd5b6111348361108b565b946020939093013593505050565b60008060006060848603121561115757600080fd5b6111608461108b565b95602085013595506040909401359392505050565b60005b83811015611190578181015183820152602001611178565b8381111561119f576000848401525b50505050565b600081518084526111bd816020860160208601611175565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561129e578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a09185018290529061128a818601836111a5565b968901969450505090860190600101611216565b509098975050505050505050565b6020815260006106e760208301846111a5565b600080600080606085870312156112d557600080fd5b6112de8561108b565b935060208501359250604085013567ffffffffffffffff8082111561130257600080fd5b818701915087601f83011261131657600080fd5b81358181111561132557600080fd5b88602082850101111561133757600080fd5b95989497505060200194505050565b60006020828403121561135857600080fd5b5035919050565b60006020828403121561137157600080fd5b81356106e7816110a4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113ec57600080fd5b815167ffffffffffffffff8082111561140457600080fd5b818401915084601f83011261141857600080fd5b81518181111561142a5761142a6113ab565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611470576114706113ab565b8160405282815287602084870101111561148957600080fd5b61149a836020830160208801611175565b979650505050505050565b6000602082840312156114b757600080fd5b5051919050565b6000828210156114f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1681528460148201528360348201528183605483013760009101605401908152949350505050565b63ffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c634300080f000a";
+    bytes internal constant delayedWETHCode =
+        hex"6080604052600436106101845760003560e01c8063715018a6116100d6578063a9059cbb1161007f578063dd62ed3e11610059578063dd62ed3e1461051c578063f2fde38b14610554578063f3fef3a31461057457610193565b8063a9059cbb146104a8578063cd47bde1146104c8578063d0e30db01461019357610193565b80638da5cb5b116100b05780638da5cb5b1461041757806395d89b4114610442578063977a5ec51461048857610193565b8063715018a61461039057806379502c55146103a55780637eee288d146103f757610193565b80632e1a7d4d1161013857806354fd4d501161011257806354fd4d50146102e75780636a42b8f81461033057806370a082311461036357610193565b80632e1a7d4d14610280578063313ce567146102a0578063485cc955146102c757610193565b80630ca35682116101695780630ca356821461022357806318160ddd1461024357806323b872dd1461026057610193565b806306fdde031461019b578063095ea7b3146101f357610193565b3661019357610191610594565b005b610191610594565b3480156101a757600080fd5b5060408051808201909152600d81527f577261707065642045746865720000000000000000000000000000000000000060208201525b6040516101ea9190611378565b60405180910390f35b3480156101ff57600080fd5b5061021361020e36600461140d565b6105ef565b60405190151581526020016101ea565b34801561022f57600080fd5b5061019161023e366004611439565b610668565b34801561024f57600080fd5b50475b6040519081526020016101ea565b34801561026c57600080fd5b5061021361027b366004611452565b610734565b34801561028c57600080fd5b5061019161029b366004611439565b61094b565b3480156102ac57600080fd5b506102b5601281565b60405160ff90911681526020016101ea565b3480156102d357600080fd5b506101916102e2366004611493565b610958565b3480156102f357600080fd5b506101dd6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b34801561033c57600080fd5b507f0000000000000000000000000000000000000000000000000000000000093a80610252565b34801561036f57600080fd5b5061025261037e3660046114cc565b60656020526000908152604090205481565b34801561039c57600080fd5b50610191610b34565b3480156103b157600080fd5b506068546103d29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ea565b34801561040357600080fd5b5061019161041236600461140d565b610b48565b34801561042357600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166103d2565b34801561044e57600080fd5b5060408051808201909152600481527f574554480000000000000000000000000000000000000000000000000000000060208201526101dd565b34801561049457600080fd5b506101916104a336600461140d565b610b9c565b3480156104b457600080fd5b506102136104c336600461140d565b610c89565b3480156104d457600080fd5b506105076104e3366004611493565b60676020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101ea565b34801561052857600080fd5b50610252610537366004611493565b606660209081526000928352604080842090915290825290205481565b34801561056057600080fd5b5061019161056f3660046114cc565b610c9d565b34801561058057600080fd5b5061019161058f36600461140d565b610d51565b33600090815260656020526040812080543492906105b3908490611518565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106579086815260200190565b60405180910390a350600192915050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146106ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064015b60405180910390fd5b60004782106106fd57476106ff565b815b604051909150339082156108fc029083906000818181858888f1935050505015801561072f573d6000803e3d6000fd5b505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526065602052604081205482111561076657600080fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906107dc575073ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156108645773ffffffffffffffffffffffffffffffffffffffff8416600090815260666020908152604080832033845290915290205482111561081e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091528120805484929061085e908490611530565b90915550505b73ffffffffffffffffffffffffffffffffffffffff841660009081526065602052604081208054849290610899908490611530565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600090815260656020526040812080548492906108d3908490611518565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161093991815260200190565b60405180910390a35060019392505050565b6109553382610d51565b50565b600054610100900460ff16158080156109785750600054600160ff909116105b806109925750303b158015610992575060005460ff166001145b610a1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106e5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a7c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610a8461109b565b610a8d8361113a565b606880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055801561072f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b610b3c6111b1565b610b46600061113a565b565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120426001820155805490918391839190610b92908490611518565b9091555050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064016106e5565b73ffffffffffffffffffffffffffffffffffffffff821660008181526066602090815260408083203380855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050565b6000610c96338484610734565b9392505050565b610ca56111b1565b73ffffffffffffffffffffffffffffffffffffffff8116610d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106e5565b6109558161113a565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de29190611547565b15610e49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e7472616374206973207061757365640060448201526064016106e5565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290208054821115610f0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44656c61796564574554483a20696e73756666696369656e7420756e6c6f636b60448201527f6564207769746864726177616c0000000000000000000000000000000000000060648201526084016106e5565b6000816001015411610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44656c61796564574554483a207769746864726177616c206e6f7420756e6c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106e5565b427f0000000000000000000000000000000000000000000000000000000000093a808260010154610fce9190611518565b111561105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44656c61796564574554483a207769746864726177616c2064656c6179206e6f60448201527f74206d657400000000000000000000000000000000000000000000000000000060648201526084016106e5565b818160000160008282546110709190611530565b9091555061072f905082611232565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600054610100900460ff16611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106e5565b610b466112d8565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e5565b3360009081526065602052604090205481111561124e57600080fd5b336000908152606560205260408120805483929061126d908490611530565b9091555050604051339082156108fc029083906000818181858888f1935050505015801561129f573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600054610100900460ff1661136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106e5565b610b463361113a565b600060208083528351808285015260005b818110156113a557858101830151858201604001528201611389565b818111156113b7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461095557600080fd5b6000806040838503121561142057600080fd5b823561142b816113eb565b946020939093013593505050565b60006020828403121561144b57600080fd5b5035919050565b60008060006060848603121561146757600080fd5b8335611472816113eb565b92506020840135611482816113eb565b929592945050506040919091013590565b600080604083850312156114a657600080fd5b82356114b1816113eb565b915060208301356114c1816113eb565b809150509250929050565b6000602082840312156114de57600080fd5b8135610c96816113eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561152b5761152b6114e9565b500190565b600082821015611542576115426114e9565b500390565b60006020828403121561155957600080fd5b81518015158114610c9657600080fdfea164736f6c634300080f000a";
+    bytes internal constant preimageOracleCode =
+        hex"6080604052600436106101cd5760003560e01c80638dc4be11116100f7578063dd24f9bf11610095578063ec5efcbc11610064578063ec5efcbc1461065f578063f3f480d91461067f578063faf37bc7146106b2578063fef2b4ed146106c557600080fd5b8063dd24f9bf1461059f578063ddcd58de146105d2578063e03110e11461060a578063e15926111461063f57600080fd5b8063b2e67ba8116100d1578063b2e67ba814610512578063b4801e611461054a578063d18534b51461056a578063da35c6641461058a57600080fd5b80638dc4be11146104835780639d53a648146104a35780639d7e8769146104f257600080fd5b806354fd4d501161016f5780637917de1d1161013e5780637917de1d146103bf5780637ac54767146103df5780638542cf50146103ff578063882856ef1461044a57600080fd5b806354fd4d50146102dd57806361238bde146103335780636551927b1461036b5780637051472e146103a357600080fd5b80632055b36b116101ab5780632055b36b146102735780633909af5c146102885780634d52b4c9146102a857806352f0f3ad146102bd57600080fd5b8063013cf08b146101d25780630359a5631461022357806304697c7814610251575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612d2f565b6106f2565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b34801561022f57600080fd5b5061024361023e366004612d71565b610737565b60405190815260200161021a565b34801561025d57600080fd5b5061027161026c366004612de4565b61086f565b005b34801561027f57600080fd5b50610243601081565b34801561029457600080fd5b506102716102a3366004613008565b6109a5565b3480156102b457600080fd5b50610243610bfc565b3480156102c957600080fd5b506102436102d83660046130f4565b610c17565b3480156102e957600080fd5b506103266040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161021a919061315b565b34801561033f57600080fd5b5061024361034e3660046131ac565b600160209081526000928352604080842090915290825290205481565b34801561037757600080fd5b50610243610386366004612d71565b601560209081526000928352604080842090915290825290205481565b3480156103af57600080fd5b506102436703782dace9d9000081565b3480156103cb57600080fd5b506102716103da3660046131ce565b610cec565b3480156103eb57600080fd5b506102436103fa366004612d2f565b6111ef565b34801561040b57600080fd5b5061043a61041a3660046131ac565b600260209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161021a565b34801561045657600080fd5b5061046a61046536600461326a565b611206565b60405167ffffffffffffffff909116815260200161021a565b34801561048f57600080fd5b5061027161049e36600461329d565b611260565b3480156104af57600080fd5b506102436104be366004612d71565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601860209081526040808320938352929052205490565b3480156104fe57600080fd5b5061027161050d3660046132e9565b61135b565b34801561051e57600080fd5b5061024361052d366004612d71565b601760209081526000928352604080842090915290825290205481565b34801561055657600080fd5b5061024361056536600461326a565b611512565b34801561057657600080fd5b50610271610585366004613008565b611544565b34801561059657600080fd5b50601354610243565b3480156105ab57600080fd5b507f0000000000000000000000000000000000000000000000000000000000002710610243565b3480156105de57600080fd5b506102436105ed366004612d71565b601660209081526000928352604080842090915290825290205481565b34801561061657600080fd5b5061062a6106253660046131ac565b611906565b6040805192835260208301919091520161021a565b34801561064b57600080fd5b5061027161065a36600461329d565b6119f7565b34801561066b57600080fd5b5061027161067a366004613375565b611aff565b34801561068b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000078610243565b6102716106c036600461340e565b611c85565b3480156106d157600080fd5b506102436106e0366004612d2f565b60006020819052908152604090205481565b6013818154811061070257600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061077a9060601c63ffffffff1690565b63ffffffff16905060005b6010811015610867578160011660010361080d5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106107da576107da61344a565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925061084e565b82600382601081106108215761082161344a565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c908061085f816134a8565b915050610785565b505092915050565b600080600080608060146030823785878260140137601480870182207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06000000000000000000000000000000000000000000000000000000000000001794506000908190889084018b5afa94503d60010191506008820189106108fc5763fe2549876000526004601cfd5b60c082901b81526008018481533d6000600183013e88017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8015160008481526002602090815260408083208c8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915587845282528083209b83529a81528a82209290925593845283905296909120959095555050505050565b60006109b18a8a610737565b90506109d486868360208b01356109cf6109ca8d6134e0565b611ef0565b611f30565b80156109f257506109f283838360208801356109cf6109ca8a6134e0565b610a28576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866040013588604051602001610a3e91906135af565b6040516020818303038152906040528051906020012014610a8b576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836020013587602001356001610aa191906135ed565b14610ad8576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b2088610ae68680613605565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f9192505050565b610b29886120ec565b836040013588604051602001610b3f91906135af565b6040516020818303038152906040528051906020012003610b8c576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526015602090815260408083208c8452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055610bf08a8a33612894565b50505050505050505050565b6001610c0a6010600261378c565b610c149190613798565b81565b6000610c23868661294d565b9050610c308360086135ed565b821180610c3d5750602083115b15610c74576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b60608115610d0557610cfe86866129fa565b9050610d3f565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610d6c57505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610ded8260601c63ffffffff1690565b63ffffffff169050333214610e2e576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3e8260801c63ffffffff1690565b63ffffffff16600003610e7d576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e878260c01c90565b67ffffffffffffffff1615610ec8576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610f01576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f0e89898d8886612a73565b83516020850160888204881415608883061715610f33576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610fe3578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610fd8576001821615610fb85782818b0152610fd8565b8981015160009081526020938452604090209260019290921c9101610f9b565b505050608801610f40565b50505050600160106002610ff7919061378c565b6110019190613798565b81111561103a576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110af61104d8360401c63ffffffff1690565b61105d9063ffffffff168a6135ed565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b9150841561113c5777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b1791506110e98260801c63ffffffff1690565b63ffffffff166110ff8360401c63ffffffff1690565b63ffffffff161461113c576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e8452909152902061116290846010612ca5565b503360008181526018602090815260408083208f8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055838352601582528083208f8452909152812084905560609190911b81523690601437366014016000a05050505050505050505050565b600381601081106111ff57600080fd5b0154905081565b6018602052826000526040600020602052816000526040600020818154811061122e57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b60443560008060088301861061127e5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa9050806112ab57600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b600080603087600037602060006030600060025afa806113835763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa925082611405576309bde3396000526004601cfd5b6028861061141b5763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061153a57600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156115b7576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000786115e28260c01c90565b6115f69067ffffffffffffffff1642613798565b1161162d576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116398b8b610737565b905061165287878360208c01356109cf6109ca8e6134e0565b8015611670575061167084848360208901356109cf6109ca8b6134e0565b6116a6576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016116bc91906135af565b6040516020818303038152906040528051906020012014611709576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84602001358860200135600161171f91906135ed565b141580611751575060016117398360601c63ffffffff1690565b61174391906137af565b63ffffffff16856020013514155b15611788576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61179689610ae68780613605565b61179f896120ec565b60006117aa8a612bc6565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f020000000000000000000000000000000000000000000000000000000000000017905060006118018460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054600160008481526020019081526020016000206000838152602001908152602001600020819055506118d38460801c63ffffffff1690565b600083815260208190526040902063ffffffff9190911690556118f78d8d81612894565b50505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff1661198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546119ab8160086135ed565b6119b68560206135ed565b106119d457836119c78260086135ed565b6119d19190613798565b91505b506000938452600160209081526040808620948652939052919092205492909150565b604435600080600883018610611a155763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b6000611b0b8686610737565b9050611b2483838360208801356109cf6109ca8a6134e0565b611b5a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611b96576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b9e612ce3565b611bac81610ae68780613605565b611bb5816120ec565b846040013581604051602001611bcb91906135af565b6040516020818303038152906040528051906020012003611c18576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152601560209081526040808320898452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055611c7c878733612894565b50505050505050565b6703782dace9d90000341015611cc7576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611d00576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d0b8160086137d4565b63ffffffff168263ffffffff1610611d4f576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000027108163ffffffff161015611daf576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601560209081526040808320878452825280832080547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1660a09790971b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff169690961760809590951b949094179094558251808401845282815280850186815260138054600181018255908452915160029092027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0908101805473ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090941693909317909255517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0919091015590815260168352818120938152929091529020349055565b6000816000015182602001518360400151604051602001611f13939291906137fc565b604051602081830303815290604052805190602001209050919050565b60008160005b6010811015611f84578060051b880135600186831c1660018114611f695760008481526020839052604090209350611f7a565b600082815260208590526040902093505b5050600101611f36565b5090931495945050505050565b6088815114611f9f57600080fd5b6020810160208301612020565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b171717905061201a81612005868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b61202c60008383611fac565b61203860018383611fac565b61204460028383611fac565b61205060038383611fac565b61205c60048383611fac565b61206860058383611fac565b61207460068383611fac565b61208060078383611fac565b61208c60088383611fac565b61209860098383611fac565b6120a4600a8383611fac565b6120b0600b8383611fac565b6120bc600c8383611fac565b6120c8600d8383611fac565b6120d4600e8383611fac565b6120e0600f8383611fac565b61201a60108383611fac565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e00160405160208183030381529060405290506020820160208201612774565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c61229f8660011b67ffffffffffffffff1690565b18188584603f1c6122ba8660011b67ffffffffffffffff1690565b18188584603f1c6122d58660011b67ffffffffffffffff1690565b181895508483603f1c6122f28560011b67ffffffffffffffff1690565b181894508387603f1c61230f8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525b5050505050565b600582811b8201805160018501831b8401805160028701851b8601805160038901871b8801805160048b0190981b8901805167ffffffffffffffff861985168918811690995283198a16861889169096528819861683188816909352841986168818871690528419831684189095169052919391929190611c7c565b61270e600082612687565b612719600582612687565b612724600a82612687565b61272f600f82612687565b61273a601482612687565b50565b612746816121e2565b61274f81612703565b600383901b820151815160c09190911c9061201a90821867ffffffffffffffff168352565b6127806000828461273d565b61278c6001828461273d565b6127986002828461273d565b6127a46003828461273d565b6127b06004828461273d565b6127bc6005828461273d565b6127c86006828461273d565b6127d46007828461273d565b6127e06008828461273d565b6127ec6009828461273d565b6127f8600a828461273d565b612804600b828461273d565b612810600c828461273d565b61281c600d828461273d565b612828600e828461273d565b612834600f828461273d565b6128406010828461273d565b61284c6011828461273d565b6128586012828461273d565b6128646013828461273d565b6128706014828461273d565b61287c6015828461273d565b6128886016828461273d565b61201a6017828461273d565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526016602090815260408083208684529091528082208054908390559051909284169083908381818185875af1925050503d806000811461290d576040519150601f19603f3d011682016040523d82523d6000602084013e612912565b606091505b5050905080612680576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316176129f3818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b6060604051905081602082018181018286833760888306808015612a435760888290038501848101848103803687375060806001820353506001845160001a1784538652612a5a565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b6000612a858260a01c63ffffffff1690565b67ffffffffffffffff1690506000612aa38360801c63ffffffff1690565b63ffffffff1690506000612abd8460401c63ffffffff1690565b63ffffffff169050600883108015612ad3575080155b15612b075760c082901b6000908152883560085283513382526017602090815260408084208a855290915290912055612bbc565b60088310158015612b25575080612b1f600885613798565b93508310155b8015612b395750612b3687826135ed565b83105b15612bbc576000612b4a8285613798565b905087612b588260206135ed565b10158015612b64575085155b15612b9b576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526017602090815260408083208a845290915290209089013590555b5050505050505050565b6000612c49565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff00612bf78360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612c248360101b67ffffffffffffffff1690565b1617905060008160201c612c428360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612c6190612bcd565b612bcd565b6040820151612c6f90612bcd565b60401b17612c87612c5c60018460059190911b015190565b825160809190911b90612c9990612bcd565b60c01b17179392505050565b8260108101928215612cd3579160200282015b82811115612cd3578251825591602001919060010190612cb8565b50612cdf929150612cfb565b5090565b6040518060200160405280612cf6612d10565b905290565b5b80821115612cdf5760008155600101612cfc565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612d4157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d6c57600080fd5b919050565b60008060408385031215612d8457600080fd5b612d8d83612d48565b946020939093013593505050565b60008083601f840112612dad57600080fd5b50813567ffffffffffffffff811115612dc557600080fd5b602083019150836020828501011115612ddd57600080fd5b9250929050565b60008060008060608587031215612dfa57600080fd5b84359350612e0a60208601612d48565b9250604085013567ffffffffffffffff811115612e2657600080fd5b612e3287828801612d9b565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612e9157612e91612e3e565b60405290565b6040516060810167ffffffffffffffff81118282101715612e9157612e91612e3e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f0157612f01612e3e565b604052919050565b6000610320808385031215612f1d57600080fd5b604051602080820167ffffffffffffffff8382108183111715612f4257612f42612e3e565b8160405283955087601f880112612f5857600080fd5b612f60612e6d565b9487019491508188861115612f7457600080fd5b875b86811015612f9c5780358381168114612f8f5760008081fd5b8452928401928401612f76565b50909352509295945050505050565b600060608284031215612fbd57600080fd5b50919050565b60008083601f840112612fd557600080fd5b50813567ffffffffffffffff811115612fed57600080fd5b6020830191508360208260051b8501011115612ddd57600080fd5b60008060008060008060008060006103e08a8c03121561302757600080fd5b6130308a612d48565b985060208a013597506130468b60408c01612f09565b96506103608a013567ffffffffffffffff8082111561306457600080fd5b6130708d838e01612fab565b97506103808c013591508082111561308757600080fd5b6130938d838e01612fc3565b90975095506103a08c01359150808211156130ad57600080fd5b6130b98d838e01612fab565b94506103c08c01359150808211156130d057600080fd5b506130dd8c828d01612fc3565b915080935050809150509295985092959850929598565b600080600080600060a0868803121561310c57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60005b8381101561314a578181015183820152602001613132565b8381111561201a5750506000910152565b602081526000825180602084015261317a81604085016020870161312f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600080604083850312156131bf57600080fd5b50508035926020909101359150565b600080600080600080600060a0888a0312156131e957600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561320f57600080fd5b61321b8b838c01612d9b565b909750955060608a013591508082111561323457600080fd5b506132418a828b01612fc3565b9094509250506080880135801515811461325a57600080fd5b8091505092959891949750929550565b60008060006060848603121561327f57600080fd5b61328884612d48565b95602085013595506040909401359392505050565b6000806000604084860312156132b257600080fd5b83359250602084013567ffffffffffffffff8111156132d057600080fd5b6132dc86828701612d9b565b9497909650939450505050565b600080600080600080600060a0888a03121561330457600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561332a57600080fd5b6133368b838c01612d9b565b909750955060608a013591508082111561334f57600080fd5b5061335c8a828b01612d9b565b989b979a50959894979596608090950135949350505050565b60008060008060006080868803121561338d57600080fd5b61339686612d48565b945060208601359350604086013567ffffffffffffffff808211156133ba57600080fd5b6133c689838a01612fab565b945060608801359150808211156133dc57600080fd5b506133e988828901612fc3565b969995985093965092949392505050565b803563ffffffff81168114612d6c57600080fd5b60008060006060848603121561342357600080fd5b83359250613433602085016133fa565b9150613441604085016133fa565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134d9576134d9613479565b5060010190565b6000606082360312156134f257600080fd5b6134fa612e97565b823567ffffffffffffffff8082111561351257600080fd5b9084019036601f83011261352557600080fd5b813560208282111561353957613539612e3e565b613569817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612eba565b9250818352368183860101111561357f57600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b60198110156135e457825167ffffffffffffffff168252602092830192909101906001016135bb565b50505092915050565b6000821982111561360057613600613479565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261363a57600080fd5b83018035915067ffffffffffffffff82111561365557600080fd5b602001915036819003821315612ddd57600080fd5b600181815b808511156136c357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156136a9576136a9613479565b808516156136b657918102915b93841c939080029061366f565b509250929050565b6000826136da57506001613786565b816136e757506000613786565b81600181146136fd576002811461370757613723565b6001915050613786565b60ff84111561371857613718613479565b50506001821b613786565b5060208310610133831016604e8410600b8410161715613746575081810a613786565b613750838361366a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561378257613782613479565b0290505b92915050565b60006129f383836136cb565b6000828210156137aa576137aa613479565b500390565b600063ffffffff838116908316818110156137cc576137cc613479565b039392505050565b600063ffffffff8083168185168083038211156137f3576137f3613479565b01949350505050565b6000845161380e81846020890161312f565b9190910192835250602082015260400191905056fea164736f6c634300080f000a";
+    bytes internal constant mipsCode =
+        hex"608060405234801561001057600080fd5b506004361061004c5760003560e01c8063155633fe1461005157806354fd4d50146100765780637dc0d1d0146100bf578063e14ced3214610103575b600080fd5b61005c634000000081565b60405163ffffffff90911681526020015b60405180910390f35b6100b26040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b60405161006d9190611e16565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003bd7e801e51d48c5d94ea68e8b801dffc275de7516815260200161006d565b610116610111366004611ed2565b610124565b60405190815260200161006d565b600061012e611d8c565b6080811461013b57600080fd5b6040516106001461014b57600080fd5b6084871461015857600080fd5b6101a4851461016657600080fd5b8635608052602087013560a052604087013560e090811c60c09081526044890135821c82526048890135821c61010052604c890135821c610120526050890135821c61014052605489013590911c61016052605888013560f890811c610180526059890135901c6101a052605a880135901c6101c0526102006101e0819052606288019060005b602081101561021157823560e01c82526004909201916020909101906001016101ed565b5050508061012001511561022f5761022761066f565b915050610666565b6101408101805160010167ffffffffffffffff1690526060810151600090610257908261078b565b9050603f601a82901c16600281148061027657508063ffffffff166003145b156102cb5760006002836303ffffff1663ffffffff16901b846080015163f0000000161790506102c08263ffffffff166002146102b457601f6102b7565b60005b60ff1682610847565b945050505050610666565b6101608301516000908190601f601086901c81169190601587901c16602081106102f7576102f7611f46565b602002015192508063ffffffff8516158061031857508463ffffffff16601c145b1561034f578661016001518263ffffffff166020811061033a5761033a611f46565b6020020151925050601f600b86901c1661040b565b60208563ffffffff1610156103b1578463ffffffff16600c148061037957508463ffffffff16600d145b8061038a57508463ffffffff16600e145b1561039b578561ffff16925061040b565b6103aa8661ffff166010610938565b925061040b565b60288563ffffffff161015806103cd57508463ffffffff166022145b806103de57508463ffffffff166026145b1561040b578661016001518263ffffffff166020811061040057610400611f46565b602002015192508190505b60048563ffffffff1610158015610428575060088563ffffffff16105b8061043957508463ffffffff166001145b156104585761044a858784876109ab565b975050505050505050610666565b63ffffffff60006020878316106104bd576104788861ffff166010610938565b9095019463fffffffc861661048e81600161078b565b915060288863ffffffff16101580156104ae57508763ffffffff16603014155b156104bb57809250600093505b505b60006104cb89888885610bbb565b63ffffffff9081169150603f8a169089161580156104f0575060088163ffffffff1610155b80156105025750601c8163ffffffff16105b156105df578063ffffffff166008148061052257508063ffffffff166009145b15610559576105478163ffffffff1660081461053e5785610541565b60005b89610847565b9b505050505050505050505050610666565b8063ffffffff16600a0361057957610547858963ffffffff8a161561134b565b8063ffffffff16600b0361059a57610547858963ffffffff8a16151561134b565b8063ffffffff16600c036105b1576105478d611431565b60108163ffffffff16101580156105ce5750601c8163ffffffff16105b156105df5761054781898988611968565b8863ffffffff1660381480156105fa575063ffffffff861615155b1561062f5760018b61016001518763ffffffff166020811061061e5761061e611f46565b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff1461064c5761064c84600184611c3f565b6106588583600161134b565b9b5050505050505050505050505b95945050505050565b60408051608051815260a051602082015260dc519181019190915260fc51604482015261011c51604882015261013c51604c82015261015c51605082015261017c5160548201526101805161019f5160588301526101a0516101bf5160598401526101d851605a840152600092610200929091606283019190855b602081101561070e57601c86015184526020909501946004909301926001016106ea565b506000835283830384a060009450806001811461072e5760039550610756565b828015610746576001811461074f5760029650610754565b60009650610754565b600196505b505b50505081900390207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f89190911b17919050565b60008061079783611ce3565b905060038416156107a757600080fd5b6020810190358460051c8160005b601b81101561080d5760208501943583821c60011680156107dd57600181146107f257610803565b60008481526020839052604090209350610803565b600082815260208590526040902093505b50506001016107b5565b50608051915081811461082857630badf00d60005260206000fd5b5050601f94909416601c0360031b9390931c63ffffffff169392505050565b6000610851611d8c565b60809050806060015160040163ffffffff16816080015163ffffffff16146108da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6a756d7020696e2064656c617920736c6f74000000000000000000000000000060448201526064015b60405180910390fd5b60608101805160808301805163ffffffff90811690935285831690529085161561093057806008018261016001518663ffffffff166020811061091f5761091f611f46565b63ffffffff90921660209290920201525b61066661066f565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610995576000610997565b815b90861663ffffffff16179250505092915050565b60006109b5611d8c565b608090506000816060015160040163ffffffff16826080015163ffffffff1614610a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6272616e636820696e2064656c617920736c6f7400000000000000000000000060448201526064016108d1565b8663ffffffff1660041480610a5657508663ffffffff166005145b15610ad25760008261016001518663ffffffff1660208110610a7a57610a7a611f46565b602002015190508063ffffffff168563ffffffff16148015610aa257508763ffffffff166004145b80610aca57508063ffffffff168563ffffffff1614158015610aca57508763ffffffff166005145b915050610b4f565b8663ffffffff16600603610aef5760008460030b13159050610b4f565b8663ffffffff16600703610b0b5760008460030b139050610b4f565b8663ffffffff16600103610b4f57601f601087901c166000819003610b345760008560030b1291505b8063ffffffff16600103610b4d5760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b95576002610b7a8861ffff166010610938565b63ffffffff90811690911b8201600401166080840152610ba7565b60808301805160040163ffffffff1690525b610baf61066f565b98975050505050505050565b6000603f601a86901c16801580610bea575060088163ffffffff1610158015610bea5750600f8163ffffffff16105b1561104057603f86168160088114610c315760098114610c3a57600a8114610c4357600b8114610c4c57600c8114610c5557600d8114610c5e57600e8114610c6757610c6c565b60209150610c6c565b60219150610c6c565b602a9150610c6c565b602b9150610c6c565b60249150610c6c565b60259150610c6c565b602691505b508063ffffffff16600003610c935750505063ffffffff8216601f600686901c161b611343565b8063ffffffff16600203610cb95750505063ffffffff8216601f600686901c161c611343565b8063ffffffff16600303610cef57601f600688901c16610ce563ffffffff8716821c6020839003610938565b9350505050611343565b8063ffffffff16600403610d115750505063ffffffff8216601f84161b611343565b8063ffffffff16600603610d335750505063ffffffff8216601f84161c611343565b8063ffffffff16600703610d6657610d5d8663ffffffff168663ffffffff16901c87602003610938565b92505050611343565b8063ffffffff16600803610d7e578592505050611343565b8063ffffffff16600903610d96578592505050611343565b8063ffffffff16600a03610dae578592505050611343565b8063ffffffff16600b03610dc6578592505050611343565b8063ffffffff16600c03610dde578592505050611343565b8063ffffffff16600f03610df6578592505050611343565b8063ffffffff16601003610e0e578592505050611343565b8063ffffffff16601103610e26578592505050611343565b8063ffffffff16601203610e3e578592505050611343565b8063ffffffff16601303610e56578592505050611343565b8063ffffffff16601803610e6e578592505050611343565b8063ffffffff16601903610e86578592505050611343565b8063ffffffff16601a03610e9e578592505050611343565b8063ffffffff16601b03610eb6578592505050611343565b8063ffffffff16602003610ecf57505050828201611343565b8063ffffffff16602103610ee857505050828201611343565b8063ffffffff16602203610f0157505050818303611343565b8063ffffffff16602303610f1a57505050818303611343565b8063ffffffff16602403610f3357505050828216611343565b8063ffffffff16602503610f4c57505050828217611343565b8063ffffffff16602603610f6557505050828218611343565b8063ffffffff16602703610f7f5750505082821719611343565b8063ffffffff16602a03610fb0578460030b8660030b12610fa1576000610fa4565b60015b60ff1692505050611343565b8063ffffffff16602b03610fd8578463ffffffff168663ffffffff1610610fa1576000610fa4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e0000000000000000000000000060448201526064016108d1565b50610fd8565b8063ffffffff16601c036110c457603f8616600281900361106657505050828202611343565b8063ffffffff166020148061108157508063ffffffff166021145b1561103a578063ffffffff16602003611098579419945b60005b63800000008716156110ba576401fffffffe600197881b16960161109b565b9250611343915050565b8063ffffffff16600f036110e657505065ffffffff0000601083901b16611343565b8063ffffffff166020036111225761111a8560031660080260180363ffffffff168463ffffffff16901c60ff166008610938565b915050611343565b8063ffffffff166021036111575761111a8560021660080260100363ffffffff168463ffffffff16901c61ffff166010610938565b8063ffffffff1660220361118657505063ffffffff60086003851602811681811b198416918316901b17611343565b8063ffffffff1660230361119d5782915050611343565b8063ffffffff166024036111cf578460031660080260180363ffffffff168363ffffffff16901c60ff16915050611343565b8063ffffffff16602503611202578460021660080260100363ffffffff168363ffffffff16901c61ffff16915050611343565b8063ffffffff1660260361123457505063ffffffff60086003851602601803811681811c198416918316901c17611343565b8063ffffffff1660280361126a57505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17611343565b8063ffffffff166029036112a157505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17611343565b8063ffffffff16602a036112d057505063ffffffff60086003851602811681811c198316918416901c17611343565b8063ffffffff16602b036112e75783915050611343565b8063ffffffff16602e0361131957505063ffffffff60086003851602601803811681811b198316918416901b17611343565b8063ffffffff166030036113305782915050611343565b8063ffffffff16603803610fd857839150505b949350505050565b6000611355611d8c565b506080602063ffffffff8616106113c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c696420726567697374657200000000000000000000000000000000000060448201526064016108d1565b63ffffffff8516158015906113da5750825b1561140e57838161016001518663ffffffff16602081106113fd576113fd611f46565b63ffffffff90921660209290920201525b60808101805163ffffffff8082166060850152600490910116905261066661066f565b600061143b611d8c565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa036114b55781610fff81161561148457610fff811661100003015b8363ffffffff166000036114ab5760e08801805163ffffffff8382011690915295506114af565b8395505b50611927565b8563ffffffff16610fcd036114d05763400000009450611927565b8563ffffffff16611018036114e85760019450611927565b8563ffffffff166110960361151e57600161012088015260ff831661010088015261151161066f565b9998505050505050505050565b8563ffffffff16610fa30361178a5763ffffffff831615611927577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb63ffffffff8416016117445760006115798363fffffffc16600161078b565b60208901519091508060001a6001036115e857604080516000838152336020528d83526060902091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790505b6040808a015190517fe03110e10000000000000000000000000000000000000000000000000000000081526004810183905263ffffffff9091166024820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003bd7e801e51d48c5d94ea68e8b801dffc275de75169063e03110e1906044016040805180830381865afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190611f75565b915091506003861680600403828110156116c5578092505b50818610156116d2578591505b8260088302610100031c9250826008828460040303021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119871617955050506117298663fffffffc16600186611c3f565b60408b018051820163ffffffff169052975061178592505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd63ffffffff84160161177957809450611927565b63ffffffff9450600993505b611927565b8563ffffffff16610fa40361187b5763ffffffff8316600114806117b4575063ffffffff83166002145b806117c5575063ffffffff83166004145b156117d257809450611927565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa63ffffffff8416016117795760006118128363fffffffc16600161078b565b6020890151909150600384166004038381101561182d578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b17602088015260006040880152935083611927565b8563ffffffff16610fd703611927578163ffffffff1660030361191b5763ffffffff831615806118b1575063ffffffff83166005145b806118c2575063ffffffff83166003145b156118d05760009450611927565b63ffffffff8316600114806118eb575063ffffffff83166002145b806118fc575063ffffffff83166006145b8061190d575063ffffffff83166004145b156117795760019450611927565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b0152600401909116905261151161066f565b6000611972611d8c565b506080600063ffffffff8716601003611990575060c0810151611bd6565b8663ffffffff166011036119af5763ffffffff861660c0830152611bd6565b8663ffffffff166012036119c8575060a0810151611bd6565b8663ffffffff166013036119e75763ffffffff861660a0830152611bd6565b8663ffffffff16601803611a1b5763ffffffff600387810b9087900b02602081901c821660c08501521660a0830152611bd6565b8663ffffffff16601903611a4c5763ffffffff86811681871602602081901c821660c08501521660a0830152611bd6565b8663ffffffff16601a03611b0f578460030b600003611ac7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f0000000000000000000060448201526064016108d1565b8460030b8660030b81611adc57611adc611f99565b0763ffffffff1660c0830152600385810b9087900b81611afe57611afe611f99565b0563ffffffff1660a0830152611bd6565b8663ffffffff16601b03611bd6578463ffffffff16600003611b8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f0000000000000000000060448201526064016108d1565b8463ffffffff168663ffffffff1681611ba857611ba8611f99565b0663ffffffff90811660c084015285811690871681611bc957611bc9611f99565b0463ffffffff1660a08301525b63ffffffff841615611c1157808261016001518563ffffffff1660208110611c0057611c00611f46565b63ffffffff90921660209290920201525b60808201805163ffffffff80821660608601526004909101169052611c3461066f565b979650505050505050565b6000611c4a83611ce3565b90506003841615611c5a57600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b811015611cd85760208401933582821c6001168015611ca85760018114611cbd57611cce565b60008581526020839052604090209450611cce565b600082815260208690526040902094505b5050600101611c80565b505060805250505050565b60ff8116610380026101a4810190369061052401811015611d86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f636865636b207468617420746865726520697320656e6f7567682063616c6c6460448201527f617461000000000000000000000000000000000000000000000000000000000060648201526084016108d1565b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611df2611df7565b905290565b6040518061040001604052806020906020820280368337509192915050565b600060208083528351808285015260005b81811015611e4357858101830151858201604001528201611e27565b81811115611e55576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f840112611e9b57600080fd5b50813567ffffffffffffffff811115611eb357600080fd5b602083019150836020828501011115611ecb57600080fd5b9250929050565b600080600080600060608688031215611eea57600080fd5b853567ffffffffffffffff80821115611f0257600080fd5b611f0e89838a01611e89565b90975095506020880135915080821115611f2757600080fd5b50611f3488828901611e89565b96999598509660400135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008060408385031215611f8857600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c634300080f000a";
+    bytes internal constant anchorStateRegistryCode =
+        hex"608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb1681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a";
+    bytes internal constant acc27Code =
+        hex"6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce83610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e473ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000004600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000046157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e41690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa69092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000086158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000008600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000047f00000000000000000000000000000000000000000000000000000000000000086157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa61690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000046158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a";
+    bytes internal constant acc28Code =
+        hex"6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce83610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e473ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa61690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000460026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000460016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000004615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e41690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa69092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000860016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000460016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000004615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000004615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a";
+}
diff --git a/packages/contracts-bedrock/test/kontrol/scripts/common.sh b/packages/contracts-bedrock/test/kontrol/scripts/common.sh
index 49da354febde..444e6dd71762 100644
--- a/packages/contracts-bedrock/test/kontrol/scripts/common.sh
+++ b/packages/contracts-bedrock/test/kontrol/scripts/common.sh
@@ -37,7 +37,11 @@ usage_make_summary() {
 WORKSPACE_DIR=$( cd "$SCRIPT_HOME/../../.." >/dev/null 2>&1 && pwd )
 
 # Variables
+export KONTROL_FP_DEPLOYMENT="${KONTROL_FP_DEPLOYMENT:-false}"
 export CONTAINER_NAME=kontrol-tests
+if [ "$KONTROL_FP_DEPLOYMENT" = true ]; then
+  export CONTAINER_NAME=kontrol-fp-tests
+fi
 KONTROLRC=$(jq -r .kontrol < "$WORKSPACE_DIR/../../versions.json")
 export KONTROL_RELEASE=$KONTROLRC
 export LOCAL=false
@@ -154,7 +158,6 @@ start_docker () {
     --detach \
     --env FOUNDRY_PROFILE="$FOUNDRY_PROFILE" \
     --workdir /home/user/workspace \
-    -v "$WORKSPACE_DIR":/home/user/workspace \
     runtimeverificationinc/kontrol:ubuntu-jammy-"$KONTROL_RELEASE"
 
   copy_to_docker
diff --git a/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh b/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh
index 589f52c30764..40c7fa5778bd 100755
--- a/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh
+++ b/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh
@@ -20,6 +20,7 @@ elif [ $# -eq 1 ]; then
 fi
 
 cleanup() {
+  trap
   # Restore the original script from the backup
   if [ -f "$DEPLOY_SCRIPT.bak" ]; then
     cp "$DEPLOY_SCRIPT.bak" "$DEPLOY_SCRIPT"
@@ -36,7 +37,7 @@ cleanup() {
 }
 
 # Set trap to call cleanup function on exit
-trap cleanup EXIT
+trap cleanup EXIT ERR
 
 # create deployments/hardhat/.deploy and snapshots/state-diff/Deploy.json if necessary
 if [ ! -d "deployments/hardhat" ]; then
@@ -64,19 +65,27 @@ cp $DEPLOY_SCRIPT $DEPLOY_SCRIPT.bak
 # of the system are deployed, we'd get some reverts on the `mustGetAddress` functions
 awk '{gsub(/mustGetAddress/, "getAddress")}1' $DEPLOY_SCRIPT > temp && mv temp $DEPLOY_SCRIPT
 
-forge script -vvv test/kontrol/deployment/KontrolDeployment.sol:KontrolDeployment --sig 'runKontrolDeployment()'
+CONTRACT_NAMES=deployments/kontrol.json
+SCRIPT_SIG="runKontrolDeployment()"
+if [ "$KONTROL_FP_DEPLOYMENT" = true ]; then
+  CONTRACT_NAMES=deployments/kontrol-fp.json
+  SCRIPT_SIG="runKontrolDeploymentFaultProofs()"
+fi
+
+DEPLOY_CONFIG_PATH=deploy-config/hardhat.json \
+DEPLOYMENT_OUTFILE="$CONTRACT_NAMES" \
+  forge script -vvv test/kontrol/deployment/KontrolDeployment.sol:KontrolDeployment --sig $SCRIPT_SIG
 echo "Created state diff json"
 
 # Clean and store the state diff json in snapshots/state-diff/Kontrol-Deploy.json
 JSON_SCRIPTS=test/kontrol/scripts/json
-GENERATED_STATEDIFF=Deploy.json # Name of the statediff json produced by the deployment script
+GENERATED_STATEDIFF=31337.json # Name of the statediff json produced by the deployment script
 STATEDIFF=Kontrol-$GENERATED_STATEDIFF # Name of the Kontrol statediff
 mv snapshots/state-diff/$GENERATED_STATEDIFF snapshots/state-diff/$STATEDIFF
 python3 $JSON_SCRIPTS/clean_json.py snapshots/state-diff/$STATEDIFF
 jq . snapshots/state-diff/$STATEDIFF > temp && mv temp snapshots/state-diff/$STATEDIFF # Prettify json
 echo "Cleaned state diff json"
 
-CONTRACT_NAMES=deployments/hardhat/.deploy
 python3 $JSON_SCRIPTS/reverse_key_values.py $CONTRACT_NAMES ${CONTRACT_NAMES}Reversed
 CONTRACT_NAMES=${CONTRACT_NAMES}Reversed
 
@@ -84,8 +93,16 @@ SUMMARY_DIR=test/kontrol/proofs/utils
 SUMMARY_NAME=DeploymentSummary
 LICENSE=MIT
 
+if [ "$KONTROL_FP_DEPLOYMENT" = true ]; then
+  SUMMARY_NAME=DeploymentSummaryFaultProofs
+fi
+
 copy_to_docker # Copy the newly generated files to the docker container
 run kontrol load-state-diff $SUMMARY_NAME snapshots/state-diff/$STATEDIFF --contract-names $CONTRACT_NAMES --output-dir $SUMMARY_DIR --license $LICENSE
+if [ "$LOCAL" = false ]; then
+    # Sync Snapshot updates to the host
+    docker cp "$CONTAINER_NAME:/home/user/workspace/$SUMMARY_DIR" "$WORKSPACE_DIR/$SUMMARY_DIR/.."
+fi
 forge fmt $SUMMARY_DIR/$SUMMARY_NAME.sol
 forge fmt $SUMMARY_DIR/${SUMMARY_NAME}Code.sol
 echo "Added state updates to $SUMMARY_DIR/$SUMMARY_NAME.sol"
diff --git a/packages/contracts-bedrock/test/kontrol/scripts/run-kontrol.sh b/packages/contracts-bedrock/test/kontrol/scripts/run-kontrol.sh
index 5b37edf796f5..2254bdd17f1c 100755
--- a/packages/contracts-bedrock/test/kontrol/scripts/run-kontrol.sh
+++ b/packages/contracts-bedrock/test/kontrol/scripts/run-kontrol.sh
@@ -110,7 +110,7 @@ regen=
 #################################
 
 # Temporarily unexecuted tests
-# "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused0" \
+# "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused0" \ -- This one is executed below.
 # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused1" \
 # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused2" \
 # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused3" \
@@ -121,11 +121,22 @@ regen=
 # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused8" \
 # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused9" \
 # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused10" \
+# "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused0" \
+# "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused1" \ -- This one is executed below.
+# "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused2" \
+# "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused3" \
+# "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused4" \
+# "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused5" \
+# "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused6" \
+# "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused7" \
+# "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused8" \
+# "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused9" \
+# "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused10" \
 
 test_list=()
 if [ "$SCRIPT_TESTS" == true ]; then
   test_list=( "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused0" \
-              "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused1" \
+              "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused1(" \
               "OptimismPortalKontrol.prove_finalizeWithdrawalTransaction_paused" \
               "L1StandardBridgeKontrol.prove_finalizeBridgeERC20_paused" \
               "L1StandardBridgeKontrol.prove_finalizeBridgeETH_paused" \
diff --git a/packages/contracts-bedrock/test/legacy/DeployerWhitelist.t.sol b/packages/contracts-bedrock/test/legacy/DeployerWhitelist.t.sol
index 19dc879d44a2..ab624df2b322 100644
--- a/packages/contracts-bedrock/test/legacy/DeployerWhitelist.t.sol
+++ b/packages/contracts-bedrock/test/legacy/DeployerWhitelist.t.sol
@@ -16,7 +16,7 @@ contract DeployerWhitelist_Test is Test {
     }
 
     /// @dev Tests that `owner` is initialized to the zero address.
-    function test_owner_succeeds() external {
+    function test_owner_succeeds() external view {
         assertEq(list.owner(), address(0));
     }
 
diff --git a/packages/contracts-bedrock/test/legacy/L1BlockNumber.t.sol b/packages/contracts-bedrock/test/legacy/L1BlockNumber.t.sol
index 8ac6ab140d6b..3fad97699232 100644
--- a/packages/contracts-bedrock/test/legacy/L1BlockNumber.t.sol
+++ b/packages/contracts-bedrock/test/legacy/L1BlockNumber.t.sol
@@ -37,7 +37,7 @@ contract L1BlockNumberTest is Test {
     }
 
     /// @dev Tests that `getL1BlockNumber` returns the set block number.
-    function test_getL1BlockNumber_succeeds() external {
+    function test_getL1BlockNumber_succeeds() external view {
         assertEq(bn.getL1BlockNumber(), number);
     }
 
diff --git a/packages/contracts-bedrock/test/libraries/Bytes.t.sol b/packages/contracts-bedrock/test/libraries/Bytes.t.sol
index 766cf7e01f5b..2cfbfd3dff60 100644
--- a/packages/contracts-bedrock/test/libraries/Bytes.t.sol
+++ b/packages/contracts-bedrock/test/libraries/Bytes.t.sol
@@ -9,7 +9,7 @@ import { Bytes } from "src/libraries/Bytes.sol";
 
 contract Bytes_slice_Test is Test {
     /// @notice Tests that the `slice` function works as expected when starting from index 0.
-    function test_slice_fromZeroIdx_works() public {
+    function test_slice_fromZeroIdx_works() public pure {
         bytes memory input = hex"11223344556677889900";
 
         // Exhaustively check if all possible slices starting from index 0 are correct.
@@ -28,7 +28,7 @@ contract Bytes_slice_Test is Test {
 
     /// @notice Tests that the `slice` function works as expected when starting from indices [1, 9]
     ///         with lengths [1, 9], in reverse order.
-    function test_slice_fromNonZeroIdx_works() public {
+    function test_slice_fromNonZeroIdx_works() public pure {
         bytes memory input = hex"11223344556677889900";
 
         // Exhaustively check correctness of slices starting from indexes [1, 9]
@@ -47,7 +47,7 @@ contract Bytes_slice_Test is Test {
     /// @notice Tests that the `slice` function works as expected when slicing between multiple words
     ///         in memory. In this case, we test that a 2 byte slice between the 32nd byte of the
     ///         first word and the 1st byte of the second word is correct.
-    function test_slice_acrossWords_works() public {
+    function test_slice_acrossWords_works() public pure {
         bytes memory input =
             hex"00000000000000000000000000000000000000000000000000000000000000112200000000000000000000000000000000000000000000000000000000000000";
 
@@ -57,7 +57,7 @@ contract Bytes_slice_Test is Test {
     /// @notice Tests that the `slice` function works as expected when slicing between multiple
     ///         words in memory. In this case, we test that a 34 byte slice between 3 separate words
     ///        returns the correct result.
-    function test_slice_acrossMultipleWords_works() public {
+    function test_slice_acrossMultipleWords_works() public pure {
         bytes memory input =
             hex"000000000000000000000000000000000000000000000000000000000000001122FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1100000000000000000000000000000000000000000000000000000000000000";
         bytes memory expected = hex"1122FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11";
@@ -87,6 +87,8 @@ contract Bytes_slice_Test is Test {
         // Slice the input bytes array from `_start` to `_start + _length`
         bytes memory slice = Bytes.slice(_input, _start, _length);
 
+        vm.stopExpectSafeMemory();
+
         // Grab the free memory pointer after the slice operation
         uint64 finalPtr;
         assembly {
@@ -157,7 +159,7 @@ contract Bytes_slice_TestFail is Test {
 contract Bytes_toNibbles_Test is Test {
     /// @notice Tests that, given an input of 5 bytes, the `toNibbles` function returns an array of
     ///         10 nibbles corresponding to the input data.
-    function test_toNibbles_expectedResult5Bytes_works() public {
+    function test_toNibbles_expectedResult5Bytes_works() public pure {
         bytes memory input = hex"1234567890";
         bytes memory expected = hex"01020304050607080900";
         bytes memory actual = Bytes.toNibbles(input);
@@ -170,7 +172,7 @@ contract Bytes_toNibbles_Test is Test {
     /// @notice Tests that, given an input of 128 bytes, the `toNibbles` function returns an array
     ///         of 256 nibbles corresponding to the input data. This test exists to ensure that,
     ///         given a large input, the `toNibbles` function works as expected.
-    function test_toNibbles_expectedResult128Bytes_works() public {
+    function test_toNibbles_expectedResult128Bytes_works() public pure {
         bytes memory input =
             hex"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f";
         bytes memory expected =
@@ -184,7 +186,7 @@ contract Bytes_toNibbles_Test is Test {
 
     /// @notice Tests that, given an input of 0 bytes, the `toNibbles` function returns a zero
     ///         length array.
-    function test_toNibbles_zeroLengthInput_works() public {
+    function test_toNibbles_zeroLengthInput_works() public pure {
         bytes memory input = hex"";
         bytes memory expected = hex"";
         bytes memory actual = Bytes.toNibbles(input);
@@ -211,6 +213,8 @@ contract Bytes_toNibbles_Test is Test {
         // Pull out each individual nibble from the input bytes array
         bytes memory nibbles = Bytes.toNibbles(_input);
 
+        vm.stopExpectSafeMemory();
+
         // Grab the free memory pointer after the `toNibbles` operation
         uint64 finalPtr;
         assembly {
@@ -262,14 +266,14 @@ contract Bytes_equal_Test is Test {
 
     /// @notice Tests that the `equal` function in the `Bytes` library returns `false` if given two
     ///         non-equal byte arrays.
-    function testFuzz_equal_notEqual_works(bytes memory _a, bytes memory _b) public {
+    function testFuzz_equal_notEqual_works(bytes memory _a, bytes memory _b) public pure {
         vm.assume(!manualEq(_a, _b));
         assertFalse(Bytes.equal(_a, _b));
     }
 
     /// @notice Test whether or not the `equal` function in the `Bytes` library is equivalent to
     ///         manually checking equality of the two dynamic `bytes` arrays in memory.
-    function testDiff_equal_works(bytes memory _a, bytes memory _b) public {
+    function testDiff_equal_works(bytes memory _a, bytes memory _b) public pure {
         assertEq(Bytes.equal(_a, _b), manualEq(_a, _b));
     }
 }
diff --git a/packages/contracts-bedrock/test/libraries/Clone.t.sol b/packages/contracts-bedrock/test/libraries/Clone.t.sol
deleted file mode 100644
index 4b8802c287e5..000000000000
--- a/packages/contracts-bedrock/test/libraries/Clone.t.sol
+++ /dev/null
@@ -1,151 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.15;
-
-import "forge-std/Test.sol";
-
-import { ClonesWithImmutableArgs } from "@cwia/ClonesWithImmutableArgs.sol";
-
-import { Clone } from "src/libraries/Clone.sol";
-
-contract ExampleClone is Clone {
-    uint256 argOffset;
-
-    constructor(uint256 _argOffset) {
-        argOffset = _argOffset;
-    }
-
-    function addressArg() public view returns (address) {
-        return _getArgAddress(argOffset);
-    }
-
-    function uintArg() public view returns (uint256) {
-        return _getArgUint256(argOffset);
-    }
-
-    function fixedBytesArg() public view returns (bytes32) {
-        return _getArgFixedBytes(argOffset);
-    }
-
-    function uintArrayArg(uint64 arrLen) public view returns (uint256[] memory) {
-        return _getArgUint256Array(argOffset, arrLen);
-    }
-
-    function dynBytesArg(uint64 arrLen) public view returns (bytes memory) {
-        return _getArgDynBytes(argOffset, arrLen);
-    }
-
-    function uint64Arg() public view returns (uint64) {
-        return _getArgUint64(argOffset);
-    }
-
-    function uint8Arg() public view returns (uint8) {
-        return _getArgUint8(argOffset);
-    }
-}
-
-contract ExampleCloneFactory {
-    using ClonesWithImmutableArgs for address;
-
-    ExampleClone public implementation;
-
-    constructor(ExampleClone implementation_) {
-        implementation = implementation_;
-    }
-
-    function createAddressClone(address arg) external returns (ExampleClone clone) {
-        bytes memory data = abi.encodePacked(arg);
-        clone = ExampleClone(address(implementation).clone(data));
-    }
-
-    function createUintClone(uint256 arg) external returns (ExampleClone clone) {
-        bytes memory data = abi.encodePacked(arg);
-        clone = ExampleClone(address(implementation).clone(data));
-    }
-
-    function createFixedBytesClone(bytes32 arg) external returns (ExampleClone clone) {
-        bytes memory data = abi.encodePacked(arg);
-        clone = ExampleClone(address(implementation).clone(data));
-    }
-
-    function createUintArrayClone(uint256[] memory arg) external returns (ExampleClone clone) {
-        bytes memory data = abi.encodePacked(arg);
-        clone = ExampleClone(address(implementation).clone(data));
-    }
-
-    function createDynBytesClone(bytes memory arg) external returns (ExampleClone clone) {
-        bytes memory data = abi.encodePacked(arg);
-        clone = ExampleClone(address(implementation).clone(data));
-    }
-
-    function createUint64Clone(uint64 arg) external returns (ExampleClone clone) {
-        bytes memory data = abi.encodePacked(arg);
-        clone = ExampleClone(address(implementation).clone(data));
-    }
-
-    function createUint8Clone(uint8 arg) external returns (ExampleClone clone) {
-        bytes memory data = abi.encodePacked(arg);
-        clone = ExampleClone(address(implementation).clone(data));
-    }
-
-    function createClone(bytes memory randomCalldata) external returns (ExampleClone clone) {
-        clone = ExampleClone(address(implementation).clone(randomCalldata));
-    }
-}
-
-contract Clones_Test is Test {
-    function testFuzz_clone_addressArg_succeeds(uint256 argOffset, address param) public {
-        ExampleClone implementation = new ExampleClone(argOffset);
-        ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
-        ExampleClone clone = factory.createAddressClone(param);
-        address fetched = clone.addressArg();
-        assertEq(fetched, param);
-    }
-
-    function testFuzz_clone_uintArg_succeeds(uint256 argOffset, uint256 param) public {
-        ExampleClone implementation = new ExampleClone(argOffset);
-        ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
-        ExampleClone clone = factory.createUintClone(param);
-        uint256 fetched = clone.uintArg();
-        assertEq(fetched, param);
-    }
-
-    function testFuzz_clone_fixedBytesArg_succeeds(uint256 argOffset, bytes32 param) public {
-        ExampleClone implementation = new ExampleClone(argOffset);
-        ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
-        ExampleClone clone = factory.createFixedBytesClone(param);
-        bytes32 fetched = clone.fixedBytesArg();
-        assertEq(fetched, param);
-    }
-
-    function testFuzz_clone_uintArrayArg_succeeds(uint256 argOffset, uint256[] memory param) public {
-        ExampleClone implementation = new ExampleClone(argOffset);
-        ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
-        ExampleClone clone = factory.createUintArrayClone(param);
-        uint256[] memory fetched = clone.uintArrayArg(uint64(param.length));
-        assertEq(fetched, param);
-    }
-
-    function testFuzz_clone_dynBytesArg_succeeds(uint256 argOffset, bytes memory param) public {
-        ExampleClone implementation = new ExampleClone(argOffset);
-        ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
-        ExampleClone clone = factory.createDynBytesClone(param);
-        bytes memory fetched = clone.dynBytesArg(uint64(param.length));
-        assertEq(fetched, param);
-    }
-
-    function testFuzz_clone_uint64Arg_succeeds(uint256 argOffset, uint64 param) public {
-        ExampleClone implementation = new ExampleClone(argOffset);
-        ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
-        ExampleClone clone = factory.createUint64Clone(param);
-        uint64 fetched = clone.uint64Arg();
-        assertEq(fetched, param);
-    }
-
-    function testFuzz_clone_uint8Arg_succeeds(uint256 argOffset, uint8 param) public {
-        ExampleClone implementation = new ExampleClone(argOffset);
-        ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
-        ExampleClone clone = factory.createUint8Clone(param);
-        uint8 fetched = clone.uint8Arg();
-        assertEq(fetched, param);
-    }
-}
diff --git a/packages/contracts-bedrock/test/libraries/Constants.t.sol b/packages/contracts-bedrock/test/libraries/Constants.t.sol
index 651a36d21326..c9f60b3625ba 100644
--- a/packages/contracts-bedrock/test/libraries/Constants.t.sol
+++ b/packages/contracts-bedrock/test/libraries/Constants.t.sol
@@ -6,7 +6,7 @@ import { Constants } from "src/libraries/Constants.sol";
 
 contract Constants_Test is Test {
     /// @notice Check EIP1967 related constants.
-    function test_eip1967Constants_succeeds() external {
+    function test_eip1967Constants_succeeds() external pure {
         assertEq(
             bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1), Constants.PROXY_IMPLEMENTATION_ADDRESS
         );
diff --git a/packages/contracts-bedrock/test/libraries/Encoding.t.sol b/packages/contracts-bedrock/test/libraries/Encoding.t.sol
index 35e9300f834e..a301fdd97b3a 100644
--- a/packages/contracts-bedrock/test/libraries/Encoding.t.sol
+++ b/packages/contracts-bedrock/test/libraries/Encoding.t.sol
@@ -13,7 +13,7 @@ import { Encoding } from "src/libraries/Encoding.sol";
 
 contract Encoding_Test is CommonTest {
     /// @dev Tests encoding and decoding a nonce and version.
-    function testFuzz_nonceVersioning_succeeds(uint240 _nonce, uint16 _version) external {
+    function testFuzz_nonceVersioning_succeeds(uint240 _nonce, uint16 _version) external pure {
         (uint240 nonce, uint16 version) = Encoding.decodeVersionedNonce(Encoding.encodeVersionedNonce(_nonce, _version));
         assertEq(version, _version);
         assertEq(nonce, _nonce);
@@ -59,6 +59,7 @@ contract Encoding_Test is CommonTest {
         bytes memory _data
     )
         external
+        pure
     {
         uint8 version = 0;
         uint256 nonce = Encoding.encodeVersionedNonce(_nonce, version);
diff --git a/packages/contracts-bedrock/test/libraries/GasPayingToken.t.sol b/packages/contracts-bedrock/test/libraries/GasPayingToken.t.sol
new file mode 100644
index 000000000000..f6ad014db3a4
--- /dev/null
+++ b/packages/contracts-bedrock/test/libraries/GasPayingToken.t.sol
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+// Target contract
+import { GasPayingToken } from "src/libraries/GasPayingToken.sol";
+import { Constants } from "src/libraries/Constants.sol";
+import { Test } from "forge-std/Test.sol";
+import { LibString } from "@solady/utils/LibString.sol";
+
+/// @title GasPayingToken_Roundtrip_Test
+/// @notice Tests the roundtrip of setting and getting the gas paying token.
+contract GasPayingToken_Roundtrip_Test is Test {
+    /// @dev Test that the gas paying token correctly sets values in storage.
+    function testFuzz_set_succeeds(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) external {
+        GasPayingToken.set(_token, _decimals, _name, _symbol);
+
+        // Check the token address and decimals
+        assertEq(
+            bytes32(uint256(_decimals) << 160 | uint256(uint160(_token))),
+            vm.load(address(this), GasPayingToken.GAS_PAYING_TOKEN_SLOT)
+        );
+
+        // Check the token name
+        assertEq(_name, vm.load(address(this), GasPayingToken.GAS_PAYING_TOKEN_NAME_SLOT));
+
+        // Check the token symbol
+        assertEq(_symbol, vm.load(address(this), GasPayingToken.GAS_PAYING_TOKEN_SYMBOL_SLOT));
+    }
+
+    /// @dev Test that the gas paying token returns values associated with Ether when unset.
+    function test_get_empty_succeeds() external view {
+        (address token, uint8 decimals) = GasPayingToken.getToken();
+        assertEq(Constants.ETHER, token);
+        assertEq(18, decimals);
+
+        assertEq("Ether", GasPayingToken.getName());
+
+        assertEq("ETH", GasPayingToken.getSymbol());
+    }
+
+    /// @dev Test that the gas paying token correctly gets values from storage when set.
+    function testFuzz_get_nonEmpty_succeeds(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) external {
+        vm.assume(_token != address(0));
+        vm.assume(_token != Constants.ETHER);
+
+        GasPayingToken.set(_token, _decimals, _name, _symbol);
+
+        (address token, uint8 decimals) = GasPayingToken.getToken();
+        assertEq(_token, token);
+        assertEq(_decimals, decimals);
+
+        assertEq(LibString.fromSmallString(_name), GasPayingToken.getName());
+        assertEq(LibString.fromSmallString(_symbol), GasPayingToken.getSymbol());
+    }
+
+    /// @dev Test that the gas paying token correctly sets values in storage when input name and symbol are strings.
+    function testFuzz_setGetWithSanitize_succeeds(
+        address _token,
+        uint8 _decimals,
+        string memory _name,
+        string memory _symbol
+    )
+        external
+    {
+        vm.assume(_token != address(0));
+        vm.assume(bytes(_name).length <= 32);
+        vm.assume(bytes(_symbol).length <= 32);
+        vm.assume(_token != Constants.ETHER);
+
+        GasPayingToken.set(_token, _decimals, GasPayingToken.sanitize(_name), GasPayingToken.sanitize(_symbol));
+
+        (address token, uint8 decimals) = GasPayingToken.getToken();
+        assertEq(_token, token);
+        assertEq(_decimals, decimals);
+
+        assertEq(_name, GasPayingToken.getName());
+        assertEq(_symbol, GasPayingToken.getSymbol());
+    }
+
+    /// @dev Differentially test `sanitize`.
+    function testDiff_sanitize_succeeds(string memory _str) external pure {
+        vm.assume(bytes(_str).length <= 32);
+        vm.assume(bytes(_str).length > 0);
+
+        bytes32 output;
+        uint256 len = bytes(_str).length;
+
+        assembly {
+            output := mload(add(_str, 0x20))
+        }
+
+        output = (output >> 32 - len) << 32 - len;
+
+        assertEq(output, GasPayingToken.sanitize(_str));
+    }
+
+    /// @dev Test that `sanitize` fails when the input string is too long.
+    function test_sanitize_stringTooLong_fails(string memory _str) external {
+        vm.assume(bytes(_str).length > 32);
+
+        vm.expectRevert("GasPayingToken: string cannot be greater than 32 bytes");
+
+        GasPayingToken.sanitize(_str);
+    }
+
+    /// @dev Test that `sanitize` works as expected when the input string is empty.
+    function test_sanitize_empty_succeeds() external pure {
+        assertEq(GasPayingToken.sanitize(""), "");
+    }
+}
diff --git a/packages/contracts-bedrock/test/libraries/Hashing.t.sol b/packages/contracts-bedrock/test/libraries/Hashing.t.sol
index 98fa7ae485a0..45242acb088c 100644
--- a/packages/contracts-bedrock/test/libraries/Hashing.t.sol
+++ b/packages/contracts-bedrock/test/libraries/Hashing.t.sol
@@ -14,7 +14,7 @@ import { Hashing } from "src/libraries/Hashing.sol";
 
 contract Hashing_hashDepositSource_Test is CommonTest {
     /// @notice Tests that hashDepositSource returns the correct hash in a simple case.
-    function test_hashDepositSource_succeeds() external {
+    function test_hashDepositSource_succeeds() external pure {
         assertEq(
             Hashing.hashDepositSource(0xd25df7858efc1778118fb133ac561b138845361626dfb976699c5287ed0f4959, 0x1),
             0xf923fb07134d7d287cb52c770cc619e17e82606c21a875c92f4c63b65280a5cc
@@ -53,6 +53,7 @@ contract Hashing_hashCrossDomainMessage_Test is CommonTest {
         uint256 _messageNonce
     )
         external
+        pure
     {
         assertEq(
             keccak256(LegacyCrossDomainUtils.encodeXDomainCalldata(_target, _sender, _message, _messageNonce)),
diff --git a/packages/contracts-bedrock/test/libraries/StaticConfig.t.sol b/packages/contracts-bedrock/test/libraries/StaticConfig.t.sol
new file mode 100644
index 000000000000..bf499fb7543c
--- /dev/null
+++ b/packages/contracts-bedrock/test/libraries/StaticConfig.t.sol
@@ -0,0 +1,89 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+// Testing utilities
+import { Test } from "forge-std/Test.sol";
+import { FFIInterface } from "test/setup/FFIInterface.sol";
+
+// Target contract
+import { StaticConfig } from "src/libraries/StaticConfig.sol";
+
+contract StaticConfig_Test is Test {
+    FFIInterface constant ffi = FFIInterface(address(uint160(uint256(keccak256(abi.encode("optimism.ffi"))))));
+
+    function setUp() public {
+        vm.etch(address(ffi), vm.getDeployedCode("FFIInterface.sol:FFIInterface"));
+        vm.label(address(ffi), "FFIInterface");
+    }
+
+    /// @dev Tests set gas paying token encoding.
+    function testDiff_encodeSetGasPayingToken_succeeds(
+        address _token,
+        uint8 _decimals,
+        bytes32 _name,
+        bytes32 _symbol
+    )
+        external
+    {
+        bytes memory encoding = StaticConfig.encodeSetGasPayingToken(_token, _decimals, _name, _symbol);
+
+        bytes memory _encoding = ffi.encodeGasPayingToken(_token, _decimals, _name, _symbol);
+
+        assertEq(encoding, _encoding);
+    }
+
+    /// @dev Tests set gas paying token decoding.
+    function test_decodeSetGasPayingToken_succeeds(
+        address _token,
+        uint8 _decimals,
+        bytes32 _name,
+        bytes32 _symbol
+    )
+        external
+    {
+        bytes memory encoding = ffi.encodeGasPayingToken(_token, _decimals, _name, _symbol);
+
+        (address token, uint8 decimals, bytes32 name, bytes32 symbol) = StaticConfig.decodeSetGasPayingToken(encoding);
+
+        assertEq(token, _token);
+        assertEq(decimals, _decimals);
+        assertEq(name, _name);
+        assertEq(symbol, _symbol);
+    }
+
+    /// @dev Tests add dependency encoding.
+    function testDiff_encodeAddDependency_succeeds(uint256 _chainId) external {
+        bytes memory encoding = StaticConfig.encodeAddDependency(_chainId);
+
+        bytes memory _encoding = ffi.encodeDependency(_chainId);
+
+        assertEq(encoding, _encoding);
+    }
+
+    /// @dev Tests add dependency decoding.
+    function test_decodeAddDependency_succeeds(uint256 _chainId) external {
+        bytes memory encoding = ffi.encodeDependency(_chainId);
+
+        uint256 chainId = StaticConfig.decodeAddDependency(encoding);
+
+        assertEq(chainId, _chainId);
+    }
+
+    /// @dev Tests remove dependency encoding.
+    function testDiff_encodeRemoveDependency_succeeds(uint256 _chainId) external {
+        bytes memory encoding = StaticConfig.encodeRemoveDependency(_chainId);
+
+        bytes memory _encoding = ffi.encodeDependency(_chainId);
+
+        assertEq(encoding, _encoding);
+    }
+
+    /// @dev Tests remove dependency decoding.
+    function test_decodeRemoveDependency_succeeds(uint256 _chainId) external {
+        bytes memory encoding = ffi.encodeDependency(_chainId);
+
+        uint256 chainId = StaticConfig.decodeRemoveDependency(encoding);
+
+        assertEq(chainId, _chainId);
+    }
+}
diff --git a/packages/contracts-bedrock/test/libraries/TransientContext.t.sol b/packages/contracts-bedrock/test/libraries/TransientContext.t.sol
new file mode 100644
index 000000000000..a7b414ad3882
--- /dev/null
+++ b/packages/contracts-bedrock/test/libraries/TransientContext.t.sol
@@ -0,0 +1,193 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.24;
+
+// Testing utilities
+import { Test } from "forge-std/Test.sol";
+
+// Target contractS
+import { TransientContext } from "src/libraries/TransientContext.sol";
+import { TransientReentrancyAware } from "src/libraries/TransientContext.sol";
+
+/// @title TransientContextTest
+/// @notice Tests for the TransientContext library.
+contract TransientContextTest is Test {
+    /// @notice Slot for call depth.
+    bytes32 internal callDepthSlot = bytes32(uint256(keccak256("transient.calldepth")) - 1);
+
+    /// @notice Tests that `callDepth()` outputs the corrects call depth.
+    /// @param _callDepth Call depth to test.
+    function testFuzz_callDepth_succeeds(uint256 _callDepth) public {
+        assembly ("memory-safe") {
+            tstore(sload(callDepthSlot.slot), _callDepth)
+        }
+        assertEq(TransientContext.callDepth(), _callDepth);
+    }
+
+    /// @notice Tests that `increment()` increments the call depth.
+    /// @param _startingCallDepth Starting call depth.
+    function testFuzz_increment_succeeds(uint256 _startingCallDepth) public {
+        vm.assume(_startingCallDepth < type(uint256).max);
+        assembly ("memory-safe") {
+            tstore(sload(callDepthSlot.slot), _startingCallDepth)
+        }
+        assertEq(TransientContext.callDepth(), _startingCallDepth);
+
+        TransientContext.increment();
+        assertEq(TransientContext.callDepth(), _startingCallDepth + 1);
+    }
+
+    /// @notice Tests that `decrement()` decrements the call depth.
+    /// @param _startingCallDepth Starting call depth.
+    function testFuzz_decrement_succeeds(uint256 _startingCallDepth) public {
+        vm.assume(_startingCallDepth > 0);
+        assembly ("memory-safe") {
+            tstore(sload(callDepthSlot.slot), _startingCallDepth)
+        }
+        assertEq(TransientContext.callDepth(), _startingCallDepth);
+
+        TransientContext.decrement();
+        assertEq(TransientContext.callDepth(), _startingCallDepth - 1);
+    }
+
+    /// @notice Tests that `get()` returns the correct value.
+    /// @param _slot  Slot to test.
+    /// @param _value Value to test.
+    function testFuzz_get_succeeds(bytes32 _slot, uint256 _value) public {
+        assertEq(TransientContext.get(_slot), 0);
+
+        bytes32 tSlot = keccak256(abi.encodePacked(TransientContext.callDepth(), _slot));
+        assembly ("memory-safe") {
+            tstore(tSlot, _value)
+        }
+
+        assertEq(TransientContext.get(_slot), _value);
+    }
+
+    /// @notice Tests that `set()` sets the correct value.
+    /// @param _slot  Slot to test.
+    /// @param _value Value to test.
+    function testFuzz_set_succeeds(bytes32 _slot, uint256 _value) public {
+        TransientContext.set(_slot, _value);
+        bytes32 tSlot = keccak256(abi.encodePacked(TransientContext.callDepth(), _slot));
+        uint256 tValue;
+        assembly ("memory-safe") {
+            tValue := tload(tSlot)
+        }
+        assertEq(tValue, _value);
+    }
+
+    /// @notice Tests that `set()` and `get()` work together.
+    /// @param _slot  Slot to test.
+    /// @param _value Value to test.
+    function testFuzz_setGet_succeeds(bytes32 _slot, uint256 _value) public {
+        testFuzz_set_succeeds(_slot, _value);
+        assertEq(TransientContext.get(_slot), _value);
+    }
+
+    /// @notice Tests that `set()` and `get()` work together at the same depth.
+    /// @param _slot    Slot to test.
+    /// @param _value1  Value to write to slot at call depth 0.
+    /// @param _value2  Value to write to slot at call depth 1.
+    function testFuzz_setGet_twice_sameDepth_succeeds(bytes32 _slot, uint256 _value1, uint256 _value2) public {
+        assertEq(TransientContext.callDepth(), 0);
+        testFuzz_set_succeeds(_slot, _value1);
+        assertEq(TransientContext.get(_slot), _value1);
+
+        assertEq(TransientContext.callDepth(), 0);
+        testFuzz_set_succeeds(_slot, _value2);
+        assertEq(TransientContext.get(_slot), _value2);
+    }
+
+    /// @notice Tests that `set()` and `get()` work together at different depths.
+    /// @param _slot    Slot to test.
+    /// @param _value1  Value to write to slot at call depth 0.
+    /// @param _value2  Value to write to slot at call depth 1.
+    function testFuzz_setGet_twice_differentDepth_succeeds(bytes32 _slot, uint256 _value1, uint256 _value2) public {
+        assertEq(TransientContext.callDepth(), 0);
+        testFuzz_set_succeeds(_slot, _value1);
+        assertEq(TransientContext.get(_slot), _value1);
+
+        TransientContext.increment();
+
+        assertEq(TransientContext.callDepth(), 1);
+        testFuzz_set_succeeds(_slot, _value2);
+        assertEq(TransientContext.get(_slot), _value2);
+
+        TransientContext.decrement();
+
+        assertEq(TransientContext.callDepth(), 0);
+        assertEq(TransientContext.get(_slot), _value1);
+    }
+}
+
+/// @title TransientReentrancyAwareTest
+/// @notice Tests for TransientReentrancyAware.
+contract TransientReentrancyAwareTest is TransientContextTest, TransientReentrancyAware {
+    /// @notice Reentrant-aware mock function to set a value in transient storage.
+    /// @param _slot  Slot to set.
+    /// @param _value Value to set.
+    function mock(bytes32 _slot, uint256 _value) internal reentrantAware {
+        TransientContext.set(_slot, _value);
+    }
+
+    /// @notice Reentrant-aware mock function to set a value in transient storage at multiple depths.
+    /// @param _slot   Slot to set.
+    /// @param _value1 Value to set at call depth 1.
+    /// @param _value2 Value to set at call depth 2.
+    function mockMultiDepth(bytes32 _slot, uint256 _value1, uint256 _value2) internal reentrantAware {
+        TransientContext.set(_slot, _value1);
+        mock(_slot, _value2);
+    }
+
+    /// @notice Tests the mock function is reentrant-aware.
+    /// @param _callDepth Call depth to test.
+    /// @param _slot      Slot to test.
+    /// @param _value     Value to test.
+    function testFuzz_reentrantAware_succeeds(uint256 _callDepth, bytes32 _slot, uint256 _value) public {
+        vm.assume(_callDepth < type(uint256).max);
+        assembly ("memory-safe") {
+            tstore(sload(callDepthSlot.slot), _callDepth)
+        }
+        assertEq(TransientContext.callDepth(), _callDepth);
+
+        mock(_slot, _value);
+
+        assertEq(TransientContext.get(_slot), 0);
+
+        TransientContext.increment();
+        assertEq(TransientContext.callDepth(), _callDepth + 1);
+        assertEq(TransientContext.get(_slot), _value);
+    }
+
+    /// @notice Tests the mock function is reentrant-aware at multiple depths.
+    /// @param _callDepth Call depth to test.
+    /// @param _slot      Slot to test.
+    /// @param _value1    Value to test at call depth 1.
+    /// @param _value2    Value to test at call depth 2.
+    function testFuzz_reentrantAware_multiDepth_succeeds(
+        uint256 _callDepth,
+        bytes32 _slot,
+        uint256 _value1,
+        uint256 _value2
+    )
+        public
+    {
+        vm.assume(_callDepth < type(uint256).max - 1);
+        assembly ("memory-safe") {
+            tstore(sload(callDepthSlot.slot), _callDepth)
+        }
+        assertEq(TransientContext.callDepth(), _callDepth);
+
+        mockMultiDepth(_slot, _value1, _value2);
+
+        assertEq(TransientContext.get(_slot), 0);
+
+        TransientContext.increment();
+        assertEq(TransientContext.callDepth(), _callDepth + 1);
+        assertEq(TransientContext.get(_slot), _value1);
+
+        TransientContext.increment();
+        assertEq(TransientContext.callDepth(), _callDepth + 2);
+        assertEq(TransientContext.get(_slot), _value2);
+    }
+}
diff --git a/packages/contracts-bedrock/test/libraries/rlp/RLPReader.t.sol b/packages/contracts-bedrock/test/libraries/rlp/RLPReader.t.sol
index 7d4cf189fbe9..f4fe712dc302 100644
--- a/packages/contracts-bedrock/test/libraries/rlp/RLPReader.t.sol
+++ b/packages/contracts-bedrock/test/libraries/rlp/RLPReader.t.sol
@@ -4,53 +4,54 @@ pragma solidity 0.8.15;
 import { stdError } from "forge-std/Test.sol";
 import { Test } from "forge-std/Test.sol";
 import { RLPReader } from "src/libraries/rlp/RLPReader.sol";
+import "src/libraries/rlp/RLPErrors.sol";
 
 contract RLPReader_readBytes_Test is Test {
-    function test_readBytes_bytestring00_succeeds() external {
+    function test_readBytes_bytestring00_succeeds() external pure {
         assertEq(RLPReader.readBytes(hex"00"), hex"00");
     }
 
-    function test_readBytes_bytestring01_succeeds() external {
+    function test_readBytes_bytestring01_succeeds() external pure {
         assertEq(RLPReader.readBytes(hex"01"), hex"01");
     }
 
-    function test_readBytes_bytestring7f_succeeds() external {
+    function test_readBytes_bytestring7f_succeeds() external pure {
         assertEq(RLPReader.readBytes(hex"7f"), hex"7f");
     }
 
     function test_readBytes_revertListItem_reverts() external {
-        vm.expectRevert("RLPReader: decoded item type for bytes is not a data item");
+        vm.expectRevert(UnexpectedList.selector);
         RLPReader.readBytes(hex"c7c0c1c0c3c0c1c0");
     }
 
     function test_readBytes_invalidStringLength_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be > than length of string length (long string)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readBytes(hex"b9");
     }
 
     function test_readBytes_invalidListLength_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be > than length of list length (long list)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readBytes(hex"ff");
     }
 
     function test_readBytes_invalidRemainder_reverts() external {
-        vm.expectRevert("RLPReader: bytes value contains an invalid remainder");
+        vm.expectRevert(InvalidDataRemainder.selector);
         RLPReader.readBytes(hex"800a");
     }
 
     function test_readBytes_invalidPrefix_reverts() external {
-        vm.expectRevert("RLPReader: invalid prefix, single byte < 0x80 are not prefixed (short string)");
+        vm.expectRevert(InvalidHeader.selector);
         RLPReader.readBytes(hex"810a");
     }
 }
 
 contract RLPReader_readList_Test is Test {
-    function test_readList_empty_succeeds() external {
+    function test_readList_empty_succeeds() external pure {
         RLPReader.RLPItem[] memory list = RLPReader.readList(hex"c0");
         assertEq(list.length, 0);
     }
 
-    function test_readList_multiList_succeeds() external {
+    function test_readList_multiList_succeeds() external pure {
         RLPReader.RLPItem[] memory list = RLPReader.readList(hex"c6827a77c10401");
         assertEq(list.length, 3);
 
@@ -59,7 +60,7 @@ contract RLPReader_readList_Test is Test {
         assertEq(RLPReader.readRawBytes(list[2]), hex"01");
     }
 
-    function test_readList_shortListMax1_succeeds() external {
+    function test_readList_shortListMax1_succeeds() external pure {
         RLPReader.RLPItem[] memory list = RLPReader.readList(
             hex"f784617364668471776572847a78637684617364668471776572847a78637684617364668471776572847a78637684617364668471776572"
         );
@@ -78,7 +79,7 @@ contract RLPReader_readList_Test is Test {
         assertEq(RLPReader.readRawBytes(list[10]), hex"8471776572");
     }
 
-    function test_readList_longList1_succeeds() external {
+    function test_readList_longList1_succeeds() external pure {
         RLPReader.RLPItem[] memory list = RLPReader.readList(
             hex"f840cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376"
         );
@@ -90,7 +91,7 @@ contract RLPReader_readList_Test is Test {
         assertEq(RLPReader.readRawBytes(list[3]), hex"cf84617364668471776572847a786376");
     }
 
-    function test_readList_longList2_succeeds() external {
+    function test_readList_longList2_succeeds() external pure {
         RLPReader.RLPItem[] memory list = RLPReader.readList(
             hex"f90200cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376"
         );
@@ -106,14 +107,14 @@ contract RLPReader_readList_Test is Test {
         RLPReader.readList(hex"e1454545454545454545454545454545454545454545454545454545454545454545");
     }
 
-    function test_readList_listOfLists_succeeds() external {
+    function test_readList_listOfLists_succeeds() external pure {
         RLPReader.RLPItem[] memory list = RLPReader.readList(hex"c4c2c0c0c0");
         assertEq(list.length, 2);
         assertEq(RLPReader.readRawBytes(list[0]), hex"c2c0c0");
         assertEq(RLPReader.readRawBytes(list[1]), hex"c0");
     }
 
-    function test_readList_listOfLists2_succeeds() external {
+    function test_readList_listOfLists2_succeeds() external pure {
         RLPReader.RLPItem[] memory list = RLPReader.readList(hex"c7c0c1c0c3c0c1c0");
         assertEq(list.length, 3);
 
@@ -122,7 +123,7 @@ contract RLPReader_readList_Test is Test {
         assertEq(RLPReader.readRawBytes(list[2]), hex"c3c0c1c0");
     }
 
-    function test_readList_dictTest1_succeeds() external {
+    function test_readList_dictTest1_succeeds() external pure {
         RLPReader.RLPItem[] memory list = RLPReader.readList(
             hex"ecca846b6579318476616c31ca846b6579328476616c32ca846b6579338476616c33ca846b6579348476616c34"
         );
@@ -135,101 +136,101 @@ contract RLPReader_readList_Test is Test {
     }
 
     function test_readList_invalidShortList_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than list length (short list)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readList(hex"efdebd");
     }
 
     function test_readList_longStringLength_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than list length (short list)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readList(hex"efb83600");
     }
 
     function test_readList_notLongEnough_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than list length (short list)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readList(hex"efdebdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
     }
 
     function test_readList_int32Overflow_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than total length (long string)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readList(hex"bf0f000000000000021111");
     }
 
     function test_readList_int32Overflow2_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than total length (long list)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readList(hex"ff0f000000000000021111");
     }
 
     function test_readList_incorrectLengthInArray_reverts() external {
-        vm.expectRevert("RLPReader: length of content must not have any leading zeros (long string)");
+        vm.expectRevert(InvalidHeader.selector);
         RLPReader.readList(hex"b9002100dc2b275d0f74e8a53e6f4ec61b27f24278820be3f82ea2110e582081b0565df0");
     }
 
     function test_readList_leadingZerosInLongLengthArray1_reverts() external {
-        vm.expectRevert("RLPReader: length of content must not have any leading zeros (long string)");
+        vm.expectRevert(InvalidHeader.selector);
         RLPReader.readList(
             hex"b90040000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
         );
     }
 
     function test_readList_leadingZerosInLongLengthArray2_reverts() external {
-        vm.expectRevert("RLPReader: length of content must not have any leading zeros (long string)");
+        vm.expectRevert(InvalidHeader.selector);
         RLPReader.readList(hex"b800");
     }
 
     function test_readList_leadingZerosInLongLengthList1_reverts() external {
-        vm.expectRevert("RLPReader: length of content must not have any leading zeros (long list)");
+        vm.expectRevert(InvalidHeader.selector);
         RLPReader.readList(
             hex"fb00000040000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
         );
     }
 
     function test_readList_nonOptimalLongLengthArray1_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than 55 bytes (long string)");
+        vm.expectRevert(InvalidHeader.selector);
         RLPReader.readList(hex"b81000112233445566778899aabbccddeeff");
     }
 
     function test_readList_nonOptimalLongLengthArray2_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than 55 bytes (long string)");
+        vm.expectRevert(InvalidHeader.selector);
         RLPReader.readList(hex"b801ff");
     }
 
     function test_readList_invalidValue_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than string length (short string)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readList(hex"91");
     }
 
     function test_readList_invalidRemainder_reverts() external {
-        vm.expectRevert("RLPReader: list item has an invalid data remainder");
+        vm.expectRevert(InvalidDataRemainder.selector);
         RLPReader.readList(hex"c000");
     }
 
     function test_readList_notEnoughContentForString1_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than total length (long string)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readList(hex"ba010000aabbccddeeff");
     }
 
     function test_readList_notEnoughContentForString2_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than total length (long string)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readList(hex"b840ffeeddccbbaa99887766554433221100");
     }
 
     function test_readList_notEnoughContentForList1_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than total length (long list)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readList(hex"f90180");
     }
 
     function test_readList_notEnoughContentForList2_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than total length (long list)");
+        vm.expectRevert(ContentLengthMismatch.selector);
         RLPReader.readList(hex"ffffffffffffffffff0001020304050607");
     }
 
     function test_readList_longStringLessThan56Bytes_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than 55 bytes (long string)");
+        vm.expectRevert(InvalidHeader.selector);
         RLPReader.readList(hex"b80100");
     }
 
     function test_readList_longListLessThan56Bytes_reverts() external {
-        vm.expectRevert("RLPReader: length of content must be greater than 55 bytes (long list)");
+        vm.expectRevert(InvalidHeader.selector);
         RLPReader.readList(hex"f80100");
     }
 }
diff --git a/packages/contracts-bedrock/test/libraries/rlp/RLPWriter.t.sol b/packages/contracts-bedrock/test/libraries/rlp/RLPWriter.t.sol
index 86faffd05fc5..20c0db69eee9 100644
--- a/packages/contracts-bedrock/test/libraries/rlp/RLPWriter.t.sol
+++ b/packages/contracts-bedrock/test/libraries/rlp/RLPWriter.t.sol
@@ -5,41 +5,41 @@ import { RLPWriter } from "src/libraries/rlp/RLPWriter.sol";
 import { Test } from "forge-std/Test.sol";
 
 contract RLPWriter_writeString_Test is Test {
-    function test_writeString_empty_succeeds() external {
+    function test_writeString_empty_succeeds() external pure {
         assertEq(RLPWriter.writeString(""), hex"80");
     }
 
-    function test_writeString_bytestring00_succeeds() external {
+    function test_writeString_bytestring00_succeeds() external pure {
         assertEq(RLPWriter.writeString("\u0000"), hex"00");
     }
 
-    function test_writeString_bytestring01_succeeds() external {
+    function test_writeString_bytestring01_succeeds() external pure {
         assertEq(RLPWriter.writeString("\u0001"), hex"01");
     }
 
-    function test_writeString_bytestring7f_succeeds() external {
+    function test_writeString_bytestring7f_succeeds() external pure {
         assertEq(RLPWriter.writeString("\u007F"), hex"7f");
     }
 
-    function test_writeString_shortstring_succeeds() external {
+    function test_writeString_shortstring_succeeds() external pure {
         assertEq(RLPWriter.writeString("dog"), hex"83646f67");
     }
 
-    function test_writeString_shortstring2_succeeds() external {
+    function test_writeString_shortstring2_succeeds() external pure {
         assertEq(
             RLPWriter.writeString("Lorem ipsum dolor sit amet, consectetur adipisicing eli"),
             hex"b74c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c69"
         );
     }
 
-    function test_writeString_longstring_succeeds() external {
+    function test_writeString_longstring_succeeds() external pure {
         assertEq(
             RLPWriter.writeString("Lorem ipsum dolor sit amet, consectetur adipisicing elit"),
             hex"b8384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c6974"
         );
     }
 
-    function test_writeString_longstring2_succeeds() external {
+    function test_writeString_longstring2_succeeds() external pure {
         assertEq(
             RLPWriter.writeString(
                 "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur mauris magna, suscipit sed vehicula non, iaculis faucibus tortor. Proin suscipit ultricies malesuada. Duis tortor elit, dictum quis tristique eu, ultrices at risus. Morbi a est imperdiet mi ullamcorper aliquet suscipit nec lorem. Aenean quis leo mollis, vulputate elit varius, consequat enim. Nulla ultrices turpis justo, et posuere urna consectetur nec. Proin non convallis metus. Donec tempor ipsum in mauris congue sollicitudin. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse convallis sem vel massa faucibus, eget lacinia lacus tempor. Nulla quis ultricies purus. Proin auctor rhoncus nibh condimentum mollis. Aliquam consequat enim at metus luctus, a eleifend purus egestas. Curabitur at nibh metus. Nam bibendum, neque at auctor tristique, lorem libero aliquet arcu, non interdum tellus lectus sit amet eros. Cras rhoncus, metus ac ornare cursus, dolor justo ultrices metus, at ullamcorper volutpat"
@@ -50,45 +50,45 @@ contract RLPWriter_writeString_Test is Test {
 }
 
 contract RLPWriter_writeUint_Test is Test {
-    function test_writeUint_zero_succeeds() external {
+    function test_writeUint_zero_succeeds() external pure {
         assertEq(RLPWriter.writeUint(0x0), hex"80");
     }
 
-    function test_writeUint_smallint_succeeds() external {
+    function test_writeUint_smallint_succeeds() external pure {
         assertEq(RLPWriter.writeUint(1), hex"01");
     }
 
-    function test_writeUint_smallint2_succeeds() external {
+    function test_writeUint_smallint2_succeeds() external pure {
         assertEq(RLPWriter.writeUint(16), hex"10");
     }
 
-    function test_writeUint_smallint3_succeeds() external {
+    function test_writeUint_smallint3_succeeds() external pure {
         assertEq(RLPWriter.writeUint(79), hex"4f");
     }
 
-    function test_writeUint_smallint4_succeeds() external {
+    function test_writeUint_smallint4_succeeds() external pure {
         assertEq(RLPWriter.writeUint(127), hex"7f");
     }
 
-    function test_writeUint_mediumint_succeeds() external {
+    function test_writeUint_mediumint_succeeds() external pure {
         assertEq(RLPWriter.writeUint(128), hex"8180");
     }
 
-    function test_writeUint_mediumint2_succeeds() external {
+    function test_writeUint_mediumint2_succeeds() external pure {
         assertEq(RLPWriter.writeUint(1000), hex"8203e8");
     }
 
-    function test_writeUint_mediumint3_succeeds() external {
+    function test_writeUint_mediumint3_succeeds() external pure {
         assertEq(RLPWriter.writeUint(100000), hex"830186a0");
     }
 }
 
 contract RLPWriter_writeList_Test is Test {
-    function test_writeList_empty_succeeds() external {
+    function test_writeList_empty_succeeds() external pure {
         assertEq(RLPWriter.writeList(new bytes[](0)), hex"c0");
     }
 
-    function test_writeList_stringList_succeeds() external {
+    function test_writeList_stringList_succeeds() external pure {
         bytes[] memory list = new bytes[](3);
         list[0] = RLPWriter.writeString("dog");
         list[1] = RLPWriter.writeString("god");
@@ -97,7 +97,7 @@ contract RLPWriter_writeList_Test is Test {
         assertEq(RLPWriter.writeList(list), hex"cc83646f6783676f6483636174");
     }
 
-    function test_writeList_multiList_succeeds() external {
+    function test_writeList_multiList_succeeds() external pure {
         bytes[] memory list = new bytes[](3);
         bytes[] memory list2 = new bytes[](1);
         list2[0] = RLPWriter.writeUint(4);
@@ -109,7 +109,7 @@ contract RLPWriter_writeList_Test is Test {
         assertEq(RLPWriter.writeList(list), hex"c6827a77c10401");
     }
 
-    function test_writeList_shortListMax1_succeeds() external {
+    function test_writeList_shortListMax1_succeeds() external pure {
         bytes[] memory list = new bytes[](11);
         list[0] = RLPWriter.writeString("asdf");
         list[1] = RLPWriter.writeString("qwer");
@@ -129,7 +129,7 @@ contract RLPWriter_writeList_Test is Test {
         );
     }
 
-    function test_writeList_longlist1_succeeds() external {
+    function test_writeList_longlist1_succeeds() external pure {
         bytes[] memory list = new bytes[](4);
         bytes[] memory list2 = new bytes[](3);
 
@@ -148,7 +148,7 @@ contract RLPWriter_writeList_Test is Test {
         );
     }
 
-    function test_writeList_longlist2_succeeds() external {
+    function test_writeList_longlist2_succeeds() external pure {
         bytes[] memory list = new bytes[](32);
         bytes[] memory list2 = new bytes[](3);
 
@@ -166,7 +166,7 @@ contract RLPWriter_writeList_Test is Test {
         );
     }
 
-    function test_writeList_listoflists_succeeds() external {
+    function test_writeList_listoflists_succeeds() external pure {
         // [ [ [], [] ], [] ]
         bytes[] memory list = new bytes[](2);
         bytes[] memory list2 = new bytes[](2);
@@ -180,7 +180,7 @@ contract RLPWriter_writeList_Test is Test {
         assertEq(RLPWriter.writeList(list), hex"c4c2c0c0c0");
     }
 
-    function test_writeList_listoflists2_succeeds() external {
+    function test_writeList_listoflists2_succeeds() external pure {
         // [ [], [[]], [ [], [[]] ] ]
         bytes[] memory list = new bytes[](3);
         list[0] = RLPWriter.writeList(new bytes[](0));
@@ -199,7 +199,7 @@ contract RLPWriter_writeList_Test is Test {
         assertEq(RLPWriter.writeList(list), hex"c7c0c1c0c3c0c1c0");
     }
 
-    function test_writeList_dictTest1_succeeds() external {
+    function test_writeList_dictTest1_succeeds() external pure {
         bytes[] memory list = new bytes[](4);
 
         bytes[] memory list1 = new bytes[](2);
diff --git a/packages/contracts-bedrock/test/libraries/trie/MerkleTrie.t.sol b/packages/contracts-bedrock/test/libraries/trie/MerkleTrie.t.sol
index b989f513dc4f..7b5c7c6357b2 100644
--- a/packages/contracts-bedrock/test/libraries/trie/MerkleTrie.t.sol
+++ b/packages/contracts-bedrock/test/libraries/trie/MerkleTrie.t.sol
@@ -4,6 +4,7 @@ pragma solidity 0.8.15;
 import { Test } from "forge-std/Test.sol";
 import { MerkleTrie } from "src/libraries/trie/MerkleTrie.sol";
 import { FFIInterface } from "test/setup/FFIInterface.sol";
+import "src/libraries/rlp/RLPErrors.sol";
 
 contract MerkleTrie_get_Test is Test {
     FFIInterface constant ffi = FFIInterface(address(uint160(uint256(keccak256(abi.encode("optimism.ffi"))))));
@@ -13,7 +14,7 @@ contract MerkleTrie_get_Test is Test {
         vm.label(address(ffi), "FFIInterface");
     }
 
-    function test_get_validProof1_succeeds() external {
+    function test_get_validProof1_succeeds() external pure {
         bytes32 root = 0xd582f99275e227a1cf4284899e5ff06ee56da8859be71b553397c69151bc942f;
         bytes memory key = hex"6b6579326262";
         bytes memory val = hex"6176616c32";
@@ -26,7 +27,7 @@ contract MerkleTrie_get_Test is Test {
         assertEq(val, MerkleTrie.get(key, proof, root));
     }
 
-    function test_get_validProof2_succeeds() external {
+    function test_get_validProof2_succeeds() external pure {
         bytes32 root = 0xd582f99275e227a1cf4284899e5ff06ee56da8859be71b553397c69151bc942f;
         bytes memory key = hex"6b6579316161";
         bytes memory val = hex"303132333435363738393031323334353637383930313233343536373839303132333435363738397878";
@@ -39,7 +40,7 @@ contract MerkleTrie_get_Test is Test {
         assertEq(val, MerkleTrie.get(key, proof, root));
     }
 
-    function test_get_validProof3_succeeds() external {
+    function test_get_validProof3_succeeds() external pure {
         bytes32 root = 0xf838216fa749aefa91e0b672a9c06d3e6e983f913d7107b5dab4af60b5f5abed;
         bytes memory key = hex"6b6579316161";
         bytes memory val = hex"303132333435363738393031323334353637383930313233343536373839303132333435363738397878";
@@ -50,7 +51,7 @@ contract MerkleTrie_get_Test is Test {
         assertEq(val, MerkleTrie.get(key, proof, root));
     }
 
-    function test_get_validProof4_succeeds() external {
+    function test_get_validProof4_succeeds() external pure {
         bytes32 root = 0x37956bab6bba472308146808d5311ac19cb4a7daae5df7efcc0f32badc97f55e;
         bytes memory key = hex"6b6579316161";
         bytes memory val = hex"3031323334";
@@ -60,7 +61,7 @@ contract MerkleTrie_get_Test is Test {
         assertEq(val, MerkleTrie.get(key, proof, root));
     }
 
-    function test_get_validProof5_succeeds() external {
+    function test_get_validProof5_succeeds() external pure {
         bytes32 root = 0xcb65032e2f76c48b82b5c24b3db8f670ce73982869d38cd39a624f23d62a9e89;
         bytes memory key = hex"6b657931";
         bytes memory val =
@@ -75,7 +76,7 @@ contract MerkleTrie_get_Test is Test {
         assertEq(val, MerkleTrie.get(key, proof, root));
     }
 
-    function test_get_validProof6_succeeds() external {
+    function test_get_validProof6_succeeds() external pure {
         bytes32 root = 0xcb65032e2f76c48b82b5c24b3db8f670ce73982869d38cd39a624f23d62a9e89;
         bytes memory key = hex"6b657932";
         bytes memory val = hex"73686f7274";
@@ -88,7 +89,7 @@ contract MerkleTrie_get_Test is Test {
         assertEq(val, MerkleTrie.get(key, proof, root));
     }
 
-    function test_get_validProof7_succeeds() external {
+    function test_get_validProof7_succeeds() external pure {
         bytes32 root = 0xcb65032e2f76c48b82b5c24b3db8f670ce73982869d38cd39a624f23d62a9e89;
         bytes memory key = hex"6b657933";
         bytes memory val = hex"31323334353637383930313233343536373839303132333435363738393031";
@@ -102,7 +103,7 @@ contract MerkleTrie_get_Test is Test {
         assertEq(val, MerkleTrie.get(key, proof, root));
     }
 
-    function test_get_validProof8_succeeds() external {
+    function test_get_validProof8_succeeds() external pure {
         bytes32 root = 0x72e6c01ad0c9a7b517d4bc68a5b323287fe80f0e68f5415b4b95ecbc8ad83978;
         bytes memory key = hex"61";
         bytes memory val = hex"61";
@@ -114,7 +115,7 @@ contract MerkleTrie_get_Test is Test {
         assertEq(val, MerkleTrie.get(key, proof, root));
     }
 
-    function test_get_validProof9_succeeds() external {
+    function test_get_validProof9_succeeds() external pure {
         bytes32 root = 0x72e6c01ad0c9a7b517d4bc68a5b323287fe80f0e68f5415b4b95ecbc8ad83978;
         bytes memory key = hex"62";
         bytes memory val = hex"62";
@@ -126,7 +127,7 @@ contract MerkleTrie_get_Test is Test {
         assertEq(val, MerkleTrie.get(key, proof, root));
     }
 
-    function test_get_validProof10_succeeds() external {
+    function test_get_validProof10_succeeds() external pure {
         bytes32 root = 0x72e6c01ad0c9a7b517d4bc68a5b323287fe80f0e68f5415b4b95ecbc8ad83978;
         bytes memory key = hex"63";
         bytes memory val = hex"63";
@@ -186,7 +187,7 @@ contract MerkleTrie_get_Test is Test {
             hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080";
         proof[4] = hex"ca83206262856176616c32";
 
-        vm.expectRevert("RLPReader: decoded item type for list is not a list item");
+        vm.expectRevert(UnexpectedString.selector);
         MerkleTrie.get(key, proof, root);
     }
 
@@ -198,7 +199,7 @@ contract MerkleTrie_get_Test is Test {
         proof[1] = hex"d780808080808080808080c32081aac32081ab8080808080";
         proof[2] = hex"c32081aa000000000000000000000000000000";
 
-        vm.expectRevert("RLPReader: list item has an invalid data remainder");
+        vm.expectRevert(InvalidDataRemainder.selector);
         MerkleTrie.get(key, proof, root);
     }
 
@@ -328,7 +329,7 @@ contract MerkleTrie_get_Test is Test {
         // Generate an invalid test case where the proof is malformed.
         (bytes32 root, bytes memory key,, bytes[] memory proof) = ffi.getMerkleTrieFuzzCase("corrupted_proof");
 
-        vm.expectRevert("RLPReader: decoded item type for list is not a list item");
+        vm.expectRevert(UnexpectedString.selector);
         MerkleTrie.get(key, proof, root);
     }
 
@@ -338,7 +339,7 @@ contract MerkleTrie_get_Test is Test {
         // length designates within the RLP list encoding.
         (bytes32 root, bytes memory key,, bytes[] memory proof) = ffi.getMerkleTrieFuzzCase("invalid_data_remainder");
 
-        vm.expectRevert("RLPReader: list item has an invalid data remainder");
+        vm.expectRevert(InvalidDataRemainder.selector);
         MerkleTrie.get(key, proof, root);
     }
 
diff --git a/packages/contracts-bedrock/test/mocks/AlphabetVM.sol b/packages/contracts-bedrock/test/mocks/AlphabetVM.sol
index e7488f5384ec..b5d940c1cf6e 100644
--- a/packages/contracts-bedrock/test/mocks/AlphabetVM.sol
+++ b/packages/contracts-bedrock/test/mocks/AlphabetVM.sol
@@ -3,7 +3,7 @@ pragma solidity ^0.8.15;
 
 import { IBigStepper, IPreimageOracle } from "src/dispute/interfaces/IBigStepper.sol";
 import { PreimageOracle, PreimageKeyLib } from "src/cannon/PreimageOracle.sol";
-import "src/libraries/DisputeTypes.sol";
+import "src/dispute/lib/Types.sol";
 
 /// @title AlphabetVM
 /// @dev A mock VM for the purpose of testing the dispute game infrastructure. Note that this only works
diff --git a/packages/contracts-bedrock/test/mocks/EIP1967Helper.sol b/packages/contracts-bedrock/test/mocks/EIP1967Helper.sol
index a9330890d112..3de37bf6777f 100644
--- a/packages/contracts-bedrock/test/mocks/EIP1967Helper.sol
+++ b/packages/contracts-bedrock/test/mocks/EIP1967Helper.sol
@@ -8,20 +8,28 @@ import { Vm } from "forge-std/Vm.sol";
 library EIP1967Helper {
     /// @notice The storage slot that holds the address of a proxy implementation.
     /// @dev `bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)`
-    bytes32 internal constant PROXY_IMPLEMENTATION_ADDRESS =
+    bytes32 internal constant PROXY_IMPLEMENTATION_SLOT =
         0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 
     /// @notice The storage slot that holds the address of the owner.
     /// @dev `bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)`
-    bytes32 internal constant PROXY_OWNER_ADDRESS = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
+    bytes32 internal constant PROXY_ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
 
     Vm internal constant vm = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
 
     function getAdmin(address _proxy) internal view returns (address) {
-        return address(uint160(uint256(vm.load(address(_proxy), PROXY_OWNER_ADDRESS))));
+        return address(uint160(uint256(vm.load(address(_proxy), PROXY_ADMIN_SLOT))));
+    }
+
+    function setAdmin(address _addr, address _admin) internal {
+        vm.store(_addr, PROXY_ADMIN_SLOT, bytes32(uint256(uint160(_admin))));
     }
 
     function getImplementation(address _proxy) internal view returns (address) {
-        return address(uint160(uint256(vm.load(address(_proxy), PROXY_IMPLEMENTATION_ADDRESS))));
+        return address(uint160(uint256(vm.load(address(_proxy), PROXY_IMPLEMENTATION_SLOT))));
+    }
+
+    function setImplementation(address _addr, address _impl) internal {
+        vm.store(_addr, PROXY_IMPLEMENTATION_SLOT, bytes32(uint256(uint160(_impl))));
     }
 }
diff --git a/packages/contracts-bedrock/test/periphery/AssetReceiver.t.sol b/packages/contracts-bedrock/test/periphery/AssetReceiver.t.sol
index d2a6b938f714..0c6f7d57154d 100644
--- a/packages/contracts-bedrock/test/periphery/AssetReceiver.t.sol
+++ b/packages/contracts-bedrock/test/periphery/AssetReceiver.t.sol
@@ -44,7 +44,7 @@ contract AssetReceiver_Initializer is Test {
 
 contract AssetReceiverTest is AssetReceiver_Initializer {
     /// @notice Tests if the owner was set correctly during deploy.
-    function test_constructor_succeeds() external {
+    function test_constructor_succeeds() external view {
         assertEq(address(alice), assetReceiver.owner());
     }
 
diff --git a/packages/contracts-bedrock/test/periphery/Transactor.t.sol b/packages/contracts-bedrock/test/periphery/Transactor.t.sol
index af6ce0fba1ca..bfee0ddc3adf 100644
--- a/packages/contracts-bedrock/test/periphery/Transactor.t.sol
+++ b/packages/contracts-bedrock/test/periphery/Transactor.t.sol
@@ -34,7 +34,7 @@ contract Transactor_Initializer is Test {
 
 contract TransactorTest is Transactor_Initializer {
     /// @notice Tests if the owner was set correctly during deploy
-    function test_constructor_succeeds() external {
+    function test_constructor_succeeds() external view {
         assertEq(address(alice), transactor.owner());
     }
 
diff --git a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckBalanceLow.t.sol b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckBalanceLow.t.sol
index 0345fa248a8a..02cc4c479263 100644
--- a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckBalanceLow.t.sol
+++ b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckBalanceLow.t.sol
@@ -18,7 +18,7 @@ contract CheckBalanceLowTest is Test {
 
     /// @notice Fuzz the `check` function and assert that it always returns true
     ///         when the target's balance is smaller than the threshold.
-    function testFuzz_check_succeeds(address _target, uint256 _threshold) external {
+    function testFuzz_check_succeeds(address _target, uint256 _threshold) external view {
         CheckBalanceLow.Params memory p = CheckBalanceLow.Params({ target: _target, threshold: _threshold });
 
         vm.assume(_target.balance < _threshold);
diff --git a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckGelatoLow.t.sol b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckGelatoLow.t.sol
index b8a25a72e3b3..c85b510e41a0 100644
--- a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckGelatoLow.t.sol
+++ b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckGelatoLow.t.sol
@@ -40,7 +40,7 @@ contract CheckGelatoLowTest is Test {
 
     /// @notice Fuzz the `check` function and assert that it always returns true
     ///         when the user's balance in the treasury is less than the threshold.
-    function testFuzz_check_succeeds(uint256 _threshold, address _recipient) external {
+    function testFuzz_check_succeeds(uint256 _threshold, address _recipient) external view {
         CheckGelatoLow.Params memory p =
             CheckGelatoLow.Params({ treasury: address(gelato), threshold: _threshold, recipient: _recipient });
 
diff --git a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckSecrets.t.sol b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckSecrets.t.sol
new file mode 100644
index 000000000000..5afb843df3a5
--- /dev/null
+++ b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckSecrets.t.sol
@@ -0,0 +1,183 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.15;
+
+import { Test } from "forge-std/Test.sol";
+import { CheckSecrets } from "src/periphery/drippie/dripchecks/CheckSecrets.sol";
+
+/// @title  CheckSecretsTest
+contract CheckSecretsTest is Test {
+    /// @notice Event emitted when a secret is revealed.
+    event SecretRevealed(bytes32 indexed secretHash, bytes secret);
+
+    /// @notice An instance of the CheckSecrets contract.
+    CheckSecrets c;
+
+    /// @notice A secret that must exist.
+    bytes secretMustExist = bytes(string("secretMustExist"));
+
+    /// @notice A secret that must not exist.
+    bytes secretMustNotExist = bytes(string("secretMustNotExist"));
+
+    /// @notice A delay period for the check.
+    uint256 delay = 100;
+
+    /// @notice Deploy the `CheckSecrets` contract.
+    function setUp() external {
+        c = new CheckSecrets();
+    }
+
+    /// @notice Test that basic secret revealing works.
+    function test_reveal_succeeds() external {
+        // Simple reveal and check assertions.
+        vm.expectEmit(address(c));
+        emit SecretRevealed(keccak256(secretMustExist), secretMustExist);
+        c.reveal(secretMustExist);
+        assertEq(c.revealedSecrets(keccak256(secretMustExist)), block.timestamp);
+    }
+
+    /// @notice Test that revealing the same secret twice does not work.
+    function test_reveal_twice_fails() external {
+        // Reveal the secret once.
+        uint256 ts = block.timestamp;
+        c.reveal(secretMustExist);
+        assertEq(c.revealedSecrets(keccak256(secretMustExist)), ts);
+
+        // Forward time and reveal again, should fail, same original timestamp.
+        vm.warp(ts + 1);
+        vm.expectRevert("CheckSecrets: secret already revealed");
+        c.reveal(secretMustExist);
+        assertEq(c.revealedSecrets(keccak256(secretMustExist)), ts);
+    }
+
+    /// @notice Test that the check function returns true when the first secret is revealed but the
+    ///         second secret is still hidden and the delay period has elapsed when the delay
+    ///         period is non-zero. Here we warp to exactly the delay period.
+    function test_check_secretRevealedWithDelayEq_succeeds() external {
+        CheckSecrets.Params memory p = CheckSecrets.Params({
+            delay: delay,
+            secretHashMustExist: keccak256(secretMustExist),
+            secretHashMustNotExist: keccak256(secretMustNotExist)
+        });
+
+        // Reveal the secret that must exist.
+        c.reveal(secretMustExist);
+
+        // Forward time to the delay period.
+        vm.warp(block.timestamp + delay);
+
+        // Beyond the delay, secret revealed, check should succeed.
+        assertEq(c.check(abi.encode(p)), true);
+    }
+
+    /// @notice Test that the check function returns true when the first secret is revealed but the
+    ///         second secret is still hidden and the delay period has elapsed when the delay
+    ///         period is non-zero. Here we warp to after the delay period.
+    function test_check_secretRevealedWithDelayGt_succeeds() external {
+        CheckSecrets.Params memory p = CheckSecrets.Params({
+            delay: delay,
+            secretHashMustExist: keccak256(secretMustExist),
+            secretHashMustNotExist: keccak256(secretMustNotExist)
+        });
+
+        // Reveal the secret that must exist.
+        c.reveal(secretMustExist);
+
+        // Forward time to after the delay period.
+        vm.warp(block.timestamp + delay + 1);
+
+        // Beyond the delay, secret revealed, check should succeed.
+        assertEq(c.check(abi.encode(p)), true);
+    }
+
+    /// @notice Test that the check function returns true when the first secret is revealed but the
+    ///         second secret is still hidden and the delay period is zero, meaning the reveal can
+    ///         happen in the same block as the execution.
+    function test_check_secretRevealedZeroDelay_succeeds() external {
+        CheckSecrets.Params memory p = CheckSecrets.Params({
+            delay: 0,
+            secretHashMustExist: keccak256(secretMustExist),
+            secretHashMustNotExist: keccak256(secretMustNotExist)
+        });
+
+        // Reveal the secret that must exist.
+        c.reveal(secretMustExist);
+
+        // Note we don't need to forward time here.
+        // Secret revealed, no delay, check should succeed.
+        assertEq(c.check(abi.encode(p)), true);
+    }
+
+    /// @notice Test that the check function returns false when the first secret is revealed but
+    ///         the delay period has not yet elapsed.
+    function test_check_secretRevealedBeforeDelay_fails() external {
+        CheckSecrets.Params memory p = CheckSecrets.Params({
+            delay: delay,
+            secretHashMustExist: keccak256(secretMustExist),
+            secretHashMustNotExist: keccak256(secretMustNotExist)
+        });
+
+        // Reveal the secret that must exist.
+        c.reveal(secretMustExist);
+
+        // Forward time to before the delay period.
+        vm.warp(block.timestamp + delay - 1);
+
+        // Not beyond the delay, check should fail.
+        assertEq(c.check(abi.encode(p)), false);
+    }
+
+    /// @notice Test that the check function returns false when the first secret is not revealed.
+    function test_check_secretNotRevealed_fails() external {
+        CheckSecrets.Params memory p = CheckSecrets.Params({
+            delay: delay,
+            secretHashMustExist: keccak256(secretMustExist),
+            secretHashMustNotExist: keccak256(secretMustNotExist)
+        });
+
+        // Forward beyond the delay period.
+        vm.warp(block.timestamp + delay + 1);
+
+        // Secret not revealed, check should fail.
+        assertEq(c.check(abi.encode(p)), false);
+    }
+
+    /// @notice Test that the check function returns false when the second secret is revealed.
+    function test_check_secondSecretRevealed_fails() external {
+        CheckSecrets.Params memory p = CheckSecrets.Params({
+            delay: delay,
+            secretHashMustExist: keccak256(secretMustExist),
+            secretHashMustNotExist: keccak256(secretMustNotExist)
+        });
+
+        // Reveal the secret that must not exist.
+        c.reveal(secretMustNotExist);
+
+        // Forward beyond the delay period.
+        vm.warp(block.timestamp + delay + 1);
+
+        // Both secrets revealed, check should fail.
+        assertEq(c.check(abi.encode(p)), false);
+    }
+
+    /// @notice Test that the check function returns false when the second secret is revealed even
+    ///         though the first secret is also revealed.
+    function test_check_firstAndSecondSecretRevealed_fails() external {
+        CheckSecrets.Params memory p = CheckSecrets.Params({
+            delay: delay,
+            secretHashMustExist: keccak256(secretMustExist),
+            secretHashMustNotExist: keccak256(secretMustNotExist)
+        });
+
+        // Reveal the secret that must exist.
+        c.reveal(secretMustExist);
+
+        // Reveal the secret that must not exist.
+        c.reveal(secretMustNotExist);
+
+        // Forward beyond the delay period.
+        vm.warp(block.timestamp + delay + 1);
+
+        // Both secrets revealed, check should fail.
+        assertEq(c.check(abi.encode(p)), false);
+    }
+}
diff --git a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckTrue.t.sol b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckTrue.t.sol
index 2c7e4be070a2..7057df0776dd 100644
--- a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckTrue.t.sol
+++ b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckTrue.t.sol
@@ -16,7 +16,7 @@ contract CheckTrueTest is Test {
     }
 
     /// @notice Fuzz the `check` function and assert that it always returns true.
-    function testFuzz_always_true_succeeds(bytes memory input) external {
+    function testFuzz_always_true_succeeds(bytes memory input) external view {
         assertEq(c.check(input), true);
     }
 }
diff --git a/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol b/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol
index 087c8c56fca4..a0ef75f28d55 100644
--- a/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol
+++ b/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol
@@ -99,13 +99,15 @@ contract Faucet_Initializer is Test {
 }
 
 contract FaucetTest is Faucet_Initializer {
-    function test_initialize_succeeds() external {
+    function test_initialize_succeeds() external view {
         assertEq(faucet.ADMIN(), faucetContractAdmin);
     }
 
     function test_authAdmin_drip_succeeds() external {
         _enableFaucetAuthModules();
         bytes32 nonce = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         bytes memory signature = issueProofWithEIP712Domain(
             faucetAuthAdminKey,
             bytes(optimistNftFamName),
@@ -119,7 +121,7 @@ contract FaucetTest is Faucet_Initializer {
 
         vm.prank(nonAdmin);
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
             Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature)
         );
     }
@@ -127,6 +129,8 @@ contract FaucetTest is Faucet_Initializer {
     function test_nonAdmin_drip_fails() external {
         _enableFaucetAuthModules();
         bytes32 nonce = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         bytes memory signature = issueProofWithEIP712Domain(
             nonAdminKey,
             bytes(optimistNftFamName),
@@ -141,7 +145,7 @@ contract FaucetTest is Faucet_Initializer {
         vm.prank(nonAdmin);
         vm.expectRevert("Faucet: drip parameters could not be verified by security module");
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
             Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature)
         );
     }
@@ -149,6 +153,8 @@ contract FaucetTest is Faucet_Initializer {
     function test_drip_optimistNftSendsCorrectAmount_succeeds() external {
         _enableFaucetAuthModules();
         bytes32 nonce = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         bytes memory signature = issueProofWithEIP712Domain(
             faucetAuthAdminKey,
             bytes(optimistNftFamName),
@@ -163,7 +169,7 @@ contract FaucetTest is Faucet_Initializer {
         uint256 recipientBalanceBefore = address(fundsReceiver).balance;
         vm.prank(nonAdmin);
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
             Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature)
         );
         uint256 recipientBalanceAfter = address(fundsReceiver).balance;
@@ -173,6 +179,8 @@ contract FaucetTest is Faucet_Initializer {
     function test_drip_githubSendsCorrectAmount_succeeds() external {
         _enableFaucetAuthModules();
         bytes32 nonce = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         bytes memory signature = issueProofWithEIP712Domain(
             faucetAuthAdminKey,
             bytes(githubFamName),
@@ -187,7 +195,7 @@ contract FaucetTest is Faucet_Initializer {
         uint256 recipientBalanceBefore = address(fundsReceiver).balance;
         vm.prank(nonAdmin);
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
             Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature)
         );
         uint256 recipientBalanceAfter = address(fundsReceiver).balance;
@@ -197,6 +205,8 @@ contract FaucetTest is Faucet_Initializer {
     function test_drip_emitsEvent_succeeds() external {
         _enableFaucetAuthModules();
         bytes32 nonce = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         bytes memory signature = issueProofWithEIP712Domain(
             faucetAuthAdminKey,
             bytes(githubFamName),
@@ -213,7 +223,7 @@ contract FaucetTest is Faucet_Initializer {
 
         vm.prank(nonAdmin);
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
             Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature)
         );
     }
@@ -221,6 +231,8 @@ contract FaucetTest is Faucet_Initializer {
     function test_drip_disabledModule_reverts() external {
         _enableFaucetAuthModules();
         bytes32 nonce = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         bytes memory signature = issueProofWithEIP712Domain(
             faucetAuthAdminKey,
             bytes(githubFamName),
@@ -234,7 +246,7 @@ contract FaucetTest is Faucet_Initializer {
 
         vm.startPrank(faucetContractAdmin);
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
             Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature)
         );
 
@@ -242,7 +254,7 @@ contract FaucetTest is Faucet_Initializer {
 
         vm.expectRevert("Faucet: provided auth module is not supported by this faucet");
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
             Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature)
         );
         vm.stopPrank();
@@ -251,6 +263,8 @@ contract FaucetTest is Faucet_Initializer {
     function test_drip_preventsReplayAttacks_succeeds() external {
         _enableFaucetAuthModules();
         bytes32 nonce = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         bytes memory signature = issueProofWithEIP712Domain(
             faucetAuthAdminKey,
             bytes(githubFamName),
@@ -264,13 +278,13 @@ contract FaucetTest is Faucet_Initializer {
 
         vm.startPrank(faucetContractAdmin);
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
             Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature)
         );
 
         vm.expectRevert("Faucet: nonce has already been used");
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
             Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature)
         );
         vm.stopPrank();
@@ -279,6 +293,8 @@ contract FaucetTest is Faucet_Initializer {
     function test_drip_beforeTimeout_reverts() external {
         _enableFaucetAuthModules();
         bytes32 nonce0 = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         bytes memory signature0 = issueProofWithEIP712Domain(
             faucetAuthAdminKey,
             bytes(githubFamName),
@@ -292,7 +308,7 @@ contract FaucetTest is Faucet_Initializer {
 
         vm.startPrank(faucetContractAdmin);
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce0),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce0, gasLimit),
             Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature0)
         );
 
@@ -310,7 +326,7 @@ contract FaucetTest is Faucet_Initializer {
 
         vm.expectRevert("Faucet: auth cannot be used yet because timeout has not elapsed");
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce1),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce1, gasLimit),
             Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature1)
         );
         vm.stopPrank();
@@ -319,6 +335,8 @@ contract FaucetTest is Faucet_Initializer {
     function test_drip_afterTimeout_succeeds() external {
         _enableFaucetAuthModules();
         bytes32 nonce0 = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         bytes memory signature0 = issueProofWithEIP712Domain(
             faucetAuthAdminKey,
             bytes(githubFamName),
@@ -332,7 +350,7 @@ contract FaucetTest is Faucet_Initializer {
 
         vm.startPrank(faucetContractAdmin);
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce0),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce0, gasLimit),
             Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature0)
         );
 
@@ -350,7 +368,7 @@ contract FaucetTest is Faucet_Initializer {
 
         vm.warp(startingTimestamp + 1 days + 1 seconds);
         faucet.drip(
-            Faucet.DripParameters(payable(fundsReceiver), nonce1),
+            Faucet.DripParameters(payable(fundsReceiver), data, nonce1, gasLimit),
             Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature1)
         );
         vm.stopPrank();
diff --git a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol
index 93a10329b452..408c091135a2 100644
--- a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol
+++ b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol
@@ -81,6 +81,8 @@ contract AdminFaucetAuthModuleTest is Test {
     /// @notice Assert that verify returns true for valid proofs signed by admins.
     function test_adminProof_verify_succeeds() external {
         bytes32 nonce = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         address fundsReceiver = makeAddr("fundsReceiver");
         bytes memory proof = issueProofWithEIP712Domain(
             adminKey,
@@ -96,7 +98,9 @@ contract AdminFaucetAuthModuleTest is Test {
         vm.prank(nonAdmin);
         assertEq(
             adminFam.verify(
-                Faucet.DripParameters(payable(fundsReceiver), nonce), keccak256(abi.encodePacked(fundsReceiver)), proof
+                Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
+                keccak256(abi.encodePacked(fundsReceiver)),
+                proof
             ),
             true
         );
@@ -105,6 +109,8 @@ contract AdminFaucetAuthModuleTest is Test {
     /// @notice Assert that verify returns false for proofs signed by nonadmins.
     function test_nonAdminProof_verify_succeeds() external {
         bytes32 nonce = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         address fundsReceiver = makeAddr("fundsReceiver");
         bytes memory proof = issueProofWithEIP712Domain(
             nonAdminKey,
@@ -120,7 +126,9 @@ contract AdminFaucetAuthModuleTest is Test {
         vm.prank(admin);
         assertEq(
             adminFam.verify(
-                Faucet.DripParameters(payable(fundsReceiver), nonce), keccak256(abi.encodePacked(fundsReceiver)), proof
+                Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
+                keccak256(abi.encodePacked(fundsReceiver)),
+                proof
             ),
             false
         );
@@ -130,6 +138,8 @@ contract AdminFaucetAuthModuleTest is Test {
     ///         than the id in the call to verify.
     function test_proofWithWrongId_verify_succeeds() external {
         bytes32 nonce = faucetHelper.consumeNonce();
+        bytes memory data = "0x";
+        uint32 gasLimit = 200000;
         address fundsReceiver = makeAddr("fundsReceiver");
         address randomAddress = makeAddr("randomAddress");
         bytes memory proof = issueProofWithEIP712Domain(
@@ -146,7 +156,9 @@ contract AdminFaucetAuthModuleTest is Test {
         vm.prank(admin);
         assertEq(
             adminFam.verify(
-                Faucet.DripParameters(payable(fundsReceiver), nonce), keccak256(abi.encodePacked(randomAddress)), proof
+                Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit),
+                keccak256(abi.encodePacked(randomAddress)),
+                proof
             ),
             false
         );
diff --git a/packages/contracts-bedrock/test/periphery/op-nft/Optimist.t.sol b/packages/contracts-bedrock/test/periphery/op-nft/Optimist.t.sol
index e0dcb83e7537..9aab06fde007 100644
--- a/packages/contracts-bedrock/test/periphery/op-nft/Optimist.t.sol
+++ b/packages/contracts-bedrock/test/periphery/op-nft/Optimist.t.sol
@@ -203,7 +203,7 @@ contract Optimist_Initializer is Test {
 
 contract OptimistTest is Optimist_Initializer {
     /// @notice Check that constructor and initializer parameters are correctly set.
-    function test_initialize_succeeds() external {
+    function test_initialize_succeeds() external view {
         // expect name to be set
         assertEq(optimist.name(), name);
         // expect symbol to be set
@@ -498,7 +498,7 @@ contract OptimistTest is Optimist_Initializer {
     }
 
     /// @notice Should support ERC-721 interface.
-    function test_supportsInterface_returnsCorrectInterfaceForERC721_succeeds() external {
+    function test_supportsInterface_returnsCorrectInterfaceForERC721_succeeds() external view {
         bytes4 iface721 = type(IERC721).interfaceId;
         // check that it supports ERC-721 interface
         assertEq(optimist.supportsInterface(iface721), true);
diff --git a/packages/contracts-bedrock/test/periphery/op-nft/OptimistAllowlist.t.sol b/packages/contracts-bedrock/test/periphery/op-nft/OptimistAllowlist.t.sol
index d4a9d1e4ae12..c0c2aef2bce0 100644
--- a/packages/contracts-bedrock/test/periphery/op-nft/OptimistAllowlist.t.sol
+++ b/packages/contracts-bedrock/test/periphery/op-nft/OptimistAllowlist.t.sol
@@ -120,7 +120,7 @@ contract OptimistAllowlist_Initializer is Test {
 }
 
 contract OptimistAllowlistTest is OptimistAllowlist_Initializer {
-    function test_constructor_succeeds() external {
+    function test_constructor_succeeds() external view {
         // expect attestationStation to be set
         assertEq(address(optimistAllowlist.ATTESTATION_STATION()), address(attestationStation));
         assertEq(optimistAllowlist.ALLOWLIST_ATTESTOR(), alice_allowlistAttestor);
@@ -129,7 +129,7 @@ contract OptimistAllowlistTest is OptimistAllowlist_Initializer {
     }
 
     /// @notice Base case, a account without any relevant attestations should not be able to mint.
-    function test_isAllowedToMint_withoutAnyAttestations_fails() external {
+    function test_isAllowedToMint_withoutAnyAttestations_fails() external view {
         assertFalse(optimistAllowlist.isAllowedToMint(bob));
     }
 
diff --git a/packages/contracts-bedrock/test/periphery/op-nft/OptimistInviter.t.sol b/packages/contracts-bedrock/test/periphery/op-nft/OptimistInviter.t.sol
index 53d24105d122..a51ba54eff9c 100644
--- a/packages/contracts-bedrock/test/periphery/op-nft/OptimistInviter.t.sol
+++ b/packages/contracts-bedrock/test/periphery/op-nft/OptimistInviter.t.sol
@@ -139,7 +139,7 @@ contract OptimistInviter_Initializer is Test {
                 optimistInviterHelper.getDigestWithEIP712Domain(
                     claimableInvite, _eip712Name, _eip712Version, _eip712Chainid, _eip712VerifyingContract
                 )
-                )
+            )
         );
     }
 
@@ -222,7 +222,7 @@ contract OptimistInviter_Initializer is Test {
 }
 
 contract OptimistInviterTest is OptimistInviter_Initializer {
-    function test_initialize_succeeds() external {
+    function test_initialize_succeeds() external view {
         // expect attestationStation to be set
         assertEq(address(optimistInviter.ATTESTATION_STATION()), address(attestationStation));
         assertEq(optimistInviter.INVITE_GRANTER(), alice_inviteGranter);
diff --git a/packages/contracts-bedrock/test/safe-tools/CompatibilityFallbackHandler_1_3_0.sol b/packages/contracts-bedrock/test/safe-tools/CompatibilityFallbackHandler_1_3_0.sol
index caefc4cee1c0..ac0c264d3038 100644
--- a/packages/contracts-bedrock/test/safe-tools/CompatibilityFallbackHandler_1_3_0.sol
+++ b/packages/contracts-bedrock/test/safe-tools/CompatibilityFallbackHandler_1_3_0.sol
@@ -6,7 +6,7 @@ import "safe-contracts/interfaces/ERC721TokenReceiver.sol";
 import "safe-contracts/interfaces/ERC777TokensRecipient.sol";
 import "safe-contracts/interfaces/IERC165.sol";
 import "safe-contracts/interfaces/ISignatureValidator.sol";
-import { Safe as GnosisSafe } from "safe-contracts/Safe.sol";
+import { GnosisSafe } from "safe-contracts/GnosisSafe.sol";
 
 /// author: Colin Nielsen
 /// https://github.com/colinnielsen/safe-tools/blob/ce6c654a76d91b619ab7778c77d1a76b3ced6666/src/CompatibilityFallbackHandler_1_3_0.sol
diff --git a/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol b/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol
index 040b8e4efe64..1c5a505095a6 100644
--- a/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol
+++ b/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol
@@ -2,11 +2,14 @@
 pragma solidity >=0.7.0 <0.9.0;
 
 import "forge-std/Test.sol";
-import { LibSort } from "solady/utils/LibSort.sol";
-import { Safe as GnosisSafe, OwnerManager, ModuleManager, GuardManager } from "safe-contracts/Safe.sol";
-import { SafeProxyFactory as GnosisSafeProxyFactory } from "safe-contracts/proxies/SafeProxyFactory.sol";
+import { LibSort } from "@solady/utils/LibSort.sol";
+import { GnosisSafe } from "safe-contracts/GnosisSafe.sol";
+import { OwnerManager } from "safe-contracts/base/OwnerManager.sol";
+import { ModuleManager } from "safe-contracts/base/ModuleManager.sol";
+import { GuardManager } from "safe-contracts/base/GuardManager.sol";
+import { GnosisSafeProxyFactory } from "safe-contracts/proxies/GnosisSafeProxyFactory.sol";
 import { Enum } from "safe-contracts/common/Enum.sol";
-import { SignMessageLib } from "safe-contracts/libraries/SignMessageLib.sol";
+import { SignMessageLib } from "safe-contracts/examples/libraries/SignMessage.sol";
 import "./CompatibilityFallbackHandler_1_3_0.sol";
 
 // Tools to simplify testing Safe contracts
@@ -496,6 +499,8 @@ contract SafeTestTools {
 
     SafeInstance[] internal instances;
 
+    uint256 internal saltNonce = uint256(keccak256(bytes("SAFE TEST")));
+
     /// @dev can be called to reinitialize the singleton, proxyFactory and handler. Useful for forking.
     function _initializeSafeTools() internal {
         singleton = new GnosisSafe();
@@ -503,6 +508,12 @@ contract SafeTestTools {
         handler = new CompatibilityFallbackHandler();
     }
 
+    /// @dev Sets up a Safe with the given parameters.
+    /// @param ownerPKs The public keys of the owners.
+    /// @param threshold The threshold for the Safe.
+    /// @param initialBalance The initial balance of the Safe.
+    /// @param advancedParams The advanced parameters for the Safe initialization.
+    /// @return The initialized Safe instance.
     function _setupSafe(
         uint256[] memory ownerPKs,
         uint256 threshold,
@@ -557,6 +568,11 @@ contract SafeTestTools {
         return instance0;
     }
 
+    /// @dev Sets up a Safe with the given parameters.
+    /// @param ownerPKs The public keys of the owners.
+    /// @param threshold The threshold for the Safe.
+    /// @param initialBalance The initial balance of the Safe.
+    /// @return The initialized Safe instance.
     function _setupSafe(
         uint256[] memory ownerPKs,
         uint256 threshold,
@@ -572,7 +588,7 @@ contract SafeTestTools {
             AdvancedSafeInitParams({
                 includeFallbackHandler: true,
                 initData: "",
-                saltNonce: 0,
+                saltNonce: saltNonce,
                 setupModulesCall_to: address(0),
                 setupModulesCall_data: "",
                 refundAmount: 0,
@@ -582,6 +598,10 @@ contract SafeTestTools {
         );
     }
 
+    /// @dev Sets up a Safe with the given parameters.
+    /// @param ownerPKs The public keys of the owners.
+    /// @param threshold The threshold for the Safe.
+    /// @return The initialized Safe instance.
     function _setupSafe(uint256[] memory ownerPKs, uint256 threshold) public returns (SafeInstance memory) {
         return _setupSafe(
             ownerPKs,
@@ -590,7 +610,7 @@ contract SafeTestTools {
             AdvancedSafeInitParams({
                 includeFallbackHandler: true,
                 initData: "",
-                saltNonce: 0,
+                saltNonce: saltNonce,
                 setupModulesCall_to: address(0),
                 setupModulesCall_data: "",
                 refundAmount: 0,
@@ -600,6 +620,8 @@ contract SafeTestTools {
         );
     }
 
+    /// @dev Sets up a Safe with default parameters. The SafeInstance will have 3 owners and a threshold of 2.
+    /// @return The initialized Safe instance.
     function _setupSafe() public returns (SafeInstance memory) {
         (, uint256[] memory defaultPKs) = SafeTestLib.makeAddrsAndKeys("default", 3);
 
@@ -610,7 +632,7 @@ contract SafeTestTools {
             AdvancedSafeInitParams({
                 includeFallbackHandler: true,
                 initData: "",
-                saltNonce: uint256(keccak256(bytes("SAFE TEST"))),
+                saltNonce: saltNonce,
                 setupModulesCall_to: address(0),
                 setupModulesCall_data: "",
                 refundAmount: 0,
@@ -620,6 +642,8 @@ contract SafeTestTools {
         );
     }
 
+    /// @dev Returns the first Safe instance.
+    /// @return The first Safe instance.
     function getSafe() public view returns (SafeInstance memory) {
         if (instances.length == 0) {
             revert("SAFETESTTOOLS: Test Safe has not been deployed, use _setupSafe() calling safe()");
@@ -627,6 +651,9 @@ contract SafeTestTools {
         return instances[0];
     }
 
+    /// @dev Returns the Safe instance with the given address.
+    /// @param _safe The address of the Safe instance to return.
+    /// @return The Safe instance with the given address.
     function getSafe(address _safe) public view returns (SafeInstance memory) {
         for (uint256 i; i < instances.length; ++i) {
             if (address(instances[i].safe) == _safe) return instances[i];
diff --git a/packages/contracts-bedrock/test/setup/CommonTest.sol b/packages/contracts-bedrock/test/setup/CommonTest.sol
index 3b35bb53ebb9..86ed109fd7b3 100644
--- a/packages/contracts-bedrock/test/setup/CommonTest.sol
+++ b/packages/contracts-bedrock/test/setup/CommonTest.sol
@@ -5,6 +5,7 @@ import { Test } from "forge-std/Test.sol";
 import { Setup } from "test/setup/Setup.sol";
 import { Events } from "test/setup/Events.sol";
 import { FFIInterface } from "test/setup/FFIInterface.sol";
+import { Constants } from "src/libraries/Constants.sol";
 import "scripts/DeployConfig.s.sol";
 
 /// @title CommonTest
@@ -18,6 +19,9 @@ contract CommonTest is Test, Setup, Events {
     FFIInterface constant ffi = FFIInterface(address(uint160(uint256(keccak256(abi.encode("optimism.ffi"))))));
 
     bool usePlasmaOverride;
+    bool useFaultProofs;
+    address customGasToken;
+    bool useInteropOverride;
 
     function setUp() public virtual override {
         alice = makeAddr("alice");
@@ -27,10 +31,19 @@ contract CommonTest is Test, Setup, Events {
 
         Setup.setUp();
 
-        // Override the plasma config after the deploy script initialized the config
+        // Override the config after the deploy script initialized the config
         if (usePlasmaOverride) {
             deploy.cfg().setUsePlasma(true);
         }
+        if (useFaultProofs) {
+            deploy.cfg().setUseFaultProofs(true);
+        }
+        if (customGasToken != address(0)) {
+            deploy.cfg().setUseCustomGasToken(customGasToken);
+        }
+        if (useInteropOverride) {
+            deploy.cfg().setUseInterop(true);
+        }
 
         vm.etch(address(ffi), vm.getDeployedCode("FFIInterface.sol:FFIInterface"));
         vm.label(address(ffi), "FFIInterface");
@@ -103,13 +116,7 @@ contract CommonTest is Test, Setup, Events {
             revert("CommonTest: Cannot enable fault proofs after deployment. Consider overriding `setUp`.");
         }
 
-        // Set `useFaultProofs` to `true` in the deploy config so that the deploy script deploys the Fault Proof system.
-        // This directly overrides the deploy config's `useFaultProofs` value, if the test requires it.
-        vm.store(
-            address(uint160(uint256(keccak256(abi.encode("optimism.deployconfig"))))),
-            USE_FAULT_PROOFS_SLOT,
-            bytes32(uint256(1))
-        );
+        useFaultProofs = true;
     }
 
     function enablePlasma() public {
@@ -121,4 +128,25 @@ contract CommonTest is Test, Setup, Events {
 
         usePlasmaOverride = true;
     }
+
+    function enableCustomGasToken(address _token) public {
+        // Check if the system has already been deployed, based off of the heuristic that alice and bob have not been
+        // set by the `setUp` function yet.
+        if (!(alice == address(0) && bob == address(0))) {
+            revert("CommonTest: Cannot enable custom gas token after deployment. Consider overriding `setUp`.");
+        }
+        require(_token != Constants.ETHER);
+
+        customGasToken = _token;
+    }
+
+    function enableInterop() public {
+        // Check if the system has already been deployed, based off of the heuristic that alice and bob have not been
+        // set by the `setUp` function yet.
+        if (!(alice == address(0) && bob == address(0))) {
+            revert("CommonTest: Cannot enable interop after deployment. Consider overriding `setUp`.");
+        }
+
+        useInteropOverride = true;
+    }
 }
diff --git a/packages/contracts-bedrock/test/setup/Events.sol b/packages/contracts-bedrock/test/setup/Events.sol
index fabe171df625..a8eceed88fae 100644
--- a/packages/contracts-bedrock/test/setup/Events.sol
+++ b/packages/contracts-bedrock/test/setup/Events.sol
@@ -2,6 +2,8 @@
 pragma solidity ^0.8.0;
 
 import { FeeVault } from "src/universal/FeeVault.sol";
+import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
+import "src/dispute/lib/Types.sol";
 
 /// @title Events
 /// @dev Contains various events that are tested against. This contract needs to
@@ -14,6 +16,9 @@ contract Events {
 
     event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success);
     event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to);
+    event WithdrawalProvenExtension1(bytes32 indexed withdrawalHash, address indexed proofSubmitter);
+    event DisputeGameBlacklisted(IDisputeGame indexed disputeGame);
+    event RespectedGameTypeSet(GameType indexed newGameType, Timestamp indexed updatedAt);
 
     event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit);
     event SentMessageExtension1(address indexed sender, uint256 value);
diff --git a/packages/contracts-bedrock/test/setup/FFIInterface.sol b/packages/contracts-bedrock/test/setup/FFIInterface.sol
index 34f509633ff5..595fbbe2c9c2 100644
--- a/packages/contracts-bedrock/test/setup/FFIInterface.sol
+++ b/packages/contracts-bedrock/test/setup/FFIInterface.sol
@@ -243,4 +243,58 @@ contract FFIInterface {
         (bytes32 memRoot, bytes memory proof) = abi.decode(result, (bytes32, bytes));
         return (memRoot, proof);
     }
+
+    function encodeScalarEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) external returns (bytes32) {
+        string[] memory cmds = new string[](5);
+        cmds[0] = "scripts/go-ffi/go-ffi";
+        cmds[1] = "diff";
+        cmds[2] = "encodeScalarEcotone";
+        cmds[3] = vm.toString(_basefeeScalar);
+        cmds[4] = vm.toString(_blobbasefeeScalar);
+        bytes memory result = vm.ffi(cmds);
+        return abi.decode(result, (bytes32));
+    }
+
+    function decodeScalarEcotone(bytes32 _scalar) external returns (uint32, uint32) {
+        string[] memory cmds = new string[](4);
+        cmds[0] = "scripts/go-ffi/go-ffi";
+        cmds[1] = "diff";
+        cmds[2] = "decodeScalarEcotone";
+        cmds[3] = vm.toString(_scalar);
+        bytes memory result = vm.ffi(cmds);
+        return abi.decode(result, (uint32, uint32));
+    }
+
+    function encodeGasPayingToken(
+        address _token,
+        uint8 _decimals,
+        bytes32 _name,
+        bytes32 _symbol
+    )
+        external
+        returns (bytes memory)
+    {
+        string[] memory cmds = new string[](7);
+        cmds[0] = "scripts/go-ffi/go-ffi";
+        cmds[1] = "diff";
+        cmds[2] = "encodeGasPayingToken";
+        cmds[3] = vm.toString(_token);
+        cmds[4] = vm.toString(_decimals);
+        cmds[5] = vm.toString(_name);
+        cmds[6] = vm.toString(_symbol);
+
+        bytes memory result = vm.ffi(cmds);
+        return abi.decode(result, (bytes));
+    }
+
+    function encodeDependency(uint256 _chainId) external returns (bytes memory) {
+        string[] memory cmds = new string[](4);
+        cmds[0] = "scripts/go-ffi/go-ffi";
+        cmds[1] = "diff";
+        cmds[2] = "encodeDependency";
+        cmds[3] = vm.toString(_chainId);
+
+        bytes memory result = vm.ffi(cmds);
+        return abi.decode(result, (bytes));
+    }
 }
diff --git a/packages/contracts-bedrock/test/setup/Setup.sol b/packages/contracts-bedrock/test/setup/Setup.sol
index 20ffe1b344d3..8d319dfd8301 100644
--- a/packages/contracts-bedrock/test/setup/Setup.sol
+++ b/packages/contracts-bedrock/test/setup/Setup.sol
@@ -1,7 +1,9 @@
 // SPDX-License-Identifier: MIT
 pragma solidity 0.8.15;
 
+import { console2 as console } from "forge-std/console2.sol";
 import { Predeploys } from "src/libraries/Predeploys.sol";
+import { Preinstalls } from "src/libraries/Preinstalls.sol";
 import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol";
 import { L2StandardBridge } from "src/L2/L2StandardBridge.sol";
 import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol";
@@ -20,9 +22,11 @@ import { OptimismPortal } from "src/L1/OptimismPortal.sol";
 import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol";
 import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
 import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol";
+import { AnchorStateRegistry } from "src/dispute/AnchorStateRegistry.sol";
 import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
 import { DeployConfig } from "scripts/DeployConfig.s.sol";
 import { Deploy } from "scripts/Deploy.s.sol";
+import { L2Genesis, L1Dependencies, OutputMode } from "scripts/L2Genesis.s.sol";
 import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
 import { ProtocolVersions } from "src/L1/ProtocolVersions.sol";
 import { SystemConfig } from "src/L1/SystemConfig.sol";
@@ -34,6 +38,7 @@ import { Executables } from "scripts/Executables.sol";
 import { Vm } from "forge-std/Vm.sol";
 import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
 import { DataAvailabilityChallenge } from "src/L1/DataAvailabilityChallenge.sol";
+import { WETH } from "src/L2/WETH.sol";
 
 /// @title Setup
 /// @dev This contact is responsible for setting up the contracts in state. It currently
@@ -41,6 +46,8 @@ import { DataAvailabilityChallenge } from "src/L1/DataAvailabilityChallenge.sol"
 ///      up behind proxies. In the future we will migrate to importing the genesis JSON
 ///      file that is created to set up the L2 contracts instead of setting them up manually.
 contract Setup {
+    error FfiFailed(string);
+
     /// @notice The address of the foundry Vm contract.
     Vm private constant vm = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
 
@@ -48,6 +55,12 @@ contract Setup {
     ///         mutating any nonces. MUST not have constructor logic.
     Deploy internal constant deploy = Deploy(address(uint160(uint256(keccak256(abi.encode("optimism.deploy"))))));
 
+    L2Genesis internal constant l2Genesis =
+        L2Genesis(address(uint160(uint256(keccak256(abi.encode("optimism.l2genesis"))))));
+
+    // @notice Allows users of Setup to override what L2 genesis is being created.
+    OutputMode l2OutputMode = OutputMode.LOCAL_LATEST;
+
     OptimismPortal optimismPortal;
     OptimismPortal2 optimismPortal2;
     DisputeGameFactory disputeGameFactory;
@@ -62,6 +75,7 @@ contract Setup {
     ProtocolVersions protocolVersions;
     SuperchainConfig superchainConfig;
     DataAvailabilityChallenge dataAvailabilityChallenge;
+    AnchorStateRegistry anchorStateRegistry;
 
     L2CrossDomainMessenger l2CrossDomainMessenger =
         L2CrossDomainMessenger(payable(Predeploys.L2_CROSS_DOMAIN_MESSENGER));
@@ -77,6 +91,7 @@ contract Setup {
     L1Block l1Block = L1Block(Predeploys.L1_BLOCK_ATTRIBUTES);
     LegacyMessagePasser legacyMessagePasser = LegacyMessagePasser(Predeploys.LEGACY_MESSAGE_PASSER);
     GovernanceToken governanceToken = GovernanceToken(Predeploys.GOVERNANCE_TOKEN);
+    WETH weth = WETH(payable(Predeploys.WETH));
 
     /// @dev Deploys the Deploy contract without including its bytecode in the bytecode
     ///      of this contract by fetching the bytecode dynamically using `vm.getCode()`.
@@ -85,13 +100,22 @@ contract Setup {
     ///      will also need to include the bytecode for the Deploy contract.
     ///      This is a hack as we are pushing solidity to the edge.
     function setUp() public virtual {
+        console.log("L1 setup start!");
         vm.etch(address(deploy), vm.getDeployedCode("Deploy.s.sol:Deploy"));
         vm.allowCheatcodes(address(deploy));
         deploy.setUp();
+        console.log("L1 setup done!");
+
+        console.log("L2 setup start!");
+        vm.etch(address(l2Genesis), vm.getDeployedCode("L2Genesis.s.sol:L2Genesis"));
+        vm.allowCheatcodes(address(l2Genesis));
+        l2Genesis.setUp();
+        console.log("L2 setup done!");
     }
 
     /// @dev Sets up the L1 contracts.
     function L1() public {
+        console.log("Setup: creating L1 deployments");
         // Set the deterministic deployer in state to ensure that it is there
         vm.etch(
             0x4e59b44847b379578588920cA78FbF26c0B4956C,
@@ -99,6 +123,7 @@ contract Setup {
         );
 
         deploy.run();
+        console.log("Setup: completed L1 deployment, registering addresses now");
 
         optimismPortal = OptimismPortal(deploy.mustGetAddress("OptimismPortalProxy"));
         optimismPortal2 = OptimismPortal2(deploy.mustGetAddress("OptimismPortalProxy"));
@@ -114,6 +139,7 @@ contract Setup {
             OptimismMintableERC20Factory(deploy.mustGetAddress("OptimismMintableERC20FactoryProxy"));
         protocolVersions = ProtocolVersions(deploy.mustGetAddress("ProtocolVersionsProxy"));
         superchainConfig = SuperchainConfig(deploy.mustGetAddress("SuperchainConfigProxy"));
+        anchorStateRegistry = AnchorStateRegistry(deploy.mustGetAddress("AnchorStateRegistryProxy"));
 
         vm.label(address(l2OutputOracle), "L2OutputOracle");
         vm.label(deploy.mustGetAddress("L2OutputOracleProxy"), "L2OutputOracleProxy");
@@ -146,44 +172,65 @@ contract Setup {
             vm.label(address(dataAvailabilityChallenge), "DataAvailabilityChallengeProxy");
             vm.label(deploy.mustGetAddress("DataAvailabilityChallenge"), "DataAvailabilityChallenge");
         }
+        console.log("Setup: registered L1 deployments");
     }
 
     /// @dev Sets up the L2 contracts. Depends on `L1()` being called first.
     function L2() public {
-        string memory allocsPath = string.concat(vm.projectRoot(), "/.testdata/genesis.json");
-        if (vm.isFile(allocsPath) == false) {
-            string[] memory args = new string[](3);
-            args[0] = Executables.bash;
-            args[1] = "-c";
-            args[2] = string.concat(vm.projectRoot(), "/scripts/generate-l2-genesis.sh");
-            vm.ffi(args);
-        }
-
-        // Prevent race condition where the genesis.json file is not yet created
-        while (vm.isFile(allocsPath) == false) {
-            vm.sleep(1);
-        }
-
-        vm.loadAllocs(allocsPath);
+        console.log("Setup: creating L2 genesis, with output mode %d", uint256(l2OutputMode));
+        l2Genesis.runWithOptions(
+            l2OutputMode,
+            L1Dependencies({
+                l1CrossDomainMessengerProxy: payable(address(l1CrossDomainMessenger)),
+                l1StandardBridgeProxy: payable(address(l1StandardBridge)),
+                l1ERC721BridgeProxy: payable(address(l1ERC721Bridge))
+            })
+        );
 
         // Set the governance token's owner to be the final system owner
         address finalSystemOwner = deploy.cfg().finalSystemOwner();
-        vm.prank(governanceToken.owner());
+        vm.startPrank(governanceToken.owner());
         governanceToken.transferOwnership(finalSystemOwner);
+        vm.stopPrank();
+
+        // L2 predeploys
+        labelPredeploy(Predeploys.L2_STANDARD_BRIDGE);
+        labelPredeploy(Predeploys.L2_CROSS_DOMAIN_MESSENGER);
+        labelPredeploy(Predeploys.L2_TO_L1_MESSAGE_PASSER);
+        labelPredeploy(Predeploys.SEQUENCER_FEE_WALLET);
+        labelPredeploy(Predeploys.L2_ERC721_BRIDGE);
+        labelPredeploy(Predeploys.BASE_FEE_VAULT);
+        labelPredeploy(Predeploys.L1_FEE_VAULT);
+        labelPredeploy(Predeploys.L1_BLOCK_ATTRIBUTES);
+        labelPredeploy(Predeploys.GAS_PRICE_ORACLE);
+        labelPredeploy(Predeploys.LEGACY_MESSAGE_PASSER);
+        labelPredeploy(Predeploys.GOVERNANCE_TOKEN);
+        labelPredeploy(Predeploys.EAS);
+        labelPredeploy(Predeploys.SCHEMA_REGISTRY);
+        labelPredeploy(Predeploys.WETH);
+
+        // L2 Preinstalls
+        labelPreinstall(Preinstalls.MultiCall3);
+        labelPreinstall(Preinstalls.Create2Deployer);
+        labelPreinstall(Preinstalls.Safe_v130);
+        labelPreinstall(Preinstalls.SafeL2_v130);
+        labelPreinstall(Preinstalls.MultiSendCallOnly_v130);
+        labelPreinstall(Preinstalls.SafeSingletonFactory);
+        labelPreinstall(Preinstalls.DeterministicDeploymentProxy);
+        labelPreinstall(Preinstalls.MultiSend_v130);
+        labelPreinstall(Preinstalls.Permit2);
+        labelPreinstall(Preinstalls.SenderCreator);
+        labelPreinstall(Preinstalls.EntryPoint);
+        labelPreinstall(Preinstalls.BeaconBlockRoots);
+
+        console.log("Setup: completed L2 genesis");
+    }
+
+    function labelPredeploy(address _addr) internal {
+        vm.label(_addr, Predeploys.getName(_addr));
+    }
 
-        vm.label(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY, "OptimismMintableERC20Factory");
-        vm.label(Predeploys.L2_STANDARD_BRIDGE, "L2StandardBridge");
-        vm.label(Predeploys.L2_CROSS_DOMAIN_MESSENGER, "L2CrossDomainMessenger");
-        vm.label(Predeploys.L2_TO_L1_MESSAGE_PASSER, "L2ToL1MessagePasser");
-        vm.label(Predeploys.SEQUENCER_FEE_WALLET, "SequencerFeeVault");
-        vm.label(Predeploys.L2_ERC721_BRIDGE, "L2ERC721Bridge");
-        vm.label(Predeploys.BASE_FEE_VAULT, "BaseFeeVault");
-        vm.label(Predeploys.L1_FEE_VAULT, "L1FeeVault");
-        vm.label(Predeploys.L1_BLOCK_ATTRIBUTES, "L1Block");
-        vm.label(Predeploys.GAS_PRICE_ORACLE, "GasPriceOracle");
-        vm.label(Predeploys.LEGACY_MESSAGE_PASSER, "LegacyMessagePasser");
-        vm.label(Predeploys.GOVERNANCE_TOKEN, "GovernanceToken");
-        vm.label(Predeploys.EAS, "EAS");
-        vm.label(Predeploys.SCHEMA_REGISTRY, "SchemaRegistry");
+    function labelPreinstall(address _addr) internal {
+        vm.label(_addr, Preinstalls.getName(_addr));
     }
 }
diff --git a/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol
index a254b7312eee..f2a9a8d43d85 100644
--- a/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol
+++ b/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol
@@ -31,7 +31,7 @@ contract CrossDomainMessenger_BaseGas_Test is Bridge_Initializer {
     ///         or equal to the minimum gas limit value on the OptimismPortal.
     ///         This guarantees that the messengers will always pass sufficient
     ///         gas to the OptimismPortal.
-    function testFuzz_baseGas_portalMinGasLimit_succeeds(bytes memory _data, uint32 _minGasLimit) external {
+    function testFuzz_baseGas_portalMinGasLimit_succeeds(bytes memory _data, uint32 _minGasLimit) external view {
         vm.assume(_data.length <= type(uint64).max);
         uint64 baseGas = l1CrossDomainMessenger.baseGas(_data, _minGasLimit);
         uint64 minGasLimit = optimismPortal.minimumGasLimit(uint64(_data.length));
diff --git a/packages/contracts-bedrock/test/universal/FeeVault.t.sol b/packages/contracts-bedrock/test/universal/FeeVault.t.sol
index 83a8cc031291..2196644dc2be 100644
--- a/packages/contracts-bedrock/test/universal/FeeVault.t.sol
+++ b/packages/contracts-bedrock/test/universal/FeeVault.t.sol
@@ -10,14 +10,14 @@ import { FeeVault } from "src/universal/FeeVault.sol";
 // Test the implementations of the FeeVault
 contract FeeVault_Test is Bridge_Initializer {
     /// @dev Tests that the constructor sets the correct values.
-    function test_constructor_l1FeeVault_succeeds() external {
+    function test_constructor_l1FeeVault_succeeds() external view {
         assertEq(l1FeeVault.RECIPIENT(), deploy.cfg().l1FeeVaultRecipient());
         assertEq(l1FeeVault.MIN_WITHDRAWAL_AMOUNT(), deploy.cfg().l1FeeVaultMinimumWithdrawalAmount());
         assertEq(uint8(l1FeeVault.WITHDRAWAL_NETWORK()), uint8(FeeVault.WithdrawalNetwork.L1));
     }
 
     /// @dev Tests that the constructor sets the correct values.
-    function test_constructor_baseFeeVault_succeeds() external {
+    function test_constructor_baseFeeVault_succeeds() external view {
         assertEq(baseFeeVault.RECIPIENT(), deploy.cfg().baseFeeVaultRecipient());
         assertEq(baseFeeVault.MIN_WITHDRAWAL_AMOUNT(), deploy.cfg().baseFeeVaultMinimumWithdrawalAmount());
         assertEq(uint8(baseFeeVault.WITHDRAWAL_NETWORK()), uint8(FeeVault.WithdrawalNetwork.L1));
diff --git a/packages/contracts-bedrock/test/universal/OptimismMintableERC20.t.sol b/packages/contracts-bedrock/test/universal/OptimismMintableERC20.t.sol
index 6bb332473ecd..985b7bad8eb9 100644
--- a/packages/contracts-bedrock/test/universal/OptimismMintableERC20.t.sol
+++ b/packages/contracts-bedrock/test/universal/OptimismMintableERC20.t.sol
@@ -9,23 +9,23 @@ contract OptimismMintableERC20_Test is Bridge_Initializer {
     event Mint(address indexed account, uint256 amount);
     event Burn(address indexed account, uint256 amount);
 
-    function test_remoteToken_succeeds() external {
+    function test_remoteToken_succeeds() external view {
         assertEq(L2Token.remoteToken(), address(L1Token));
     }
 
-    function test_bridge_succeeds() external {
+    function test_bridge_succeeds() external view {
         assertEq(L2Token.bridge(), address(l2StandardBridge));
     }
 
-    function test_l1Token_succeeds() external {
+    function test_l1Token_succeeds() external view {
         assertEq(L2Token.l1Token(), address(L1Token));
     }
 
-    function test_l2Bridge_succeeds() external {
+    function test_l2Bridge_succeeds() external view {
         assertEq(L2Token.l2Bridge(), address(l2StandardBridge));
     }
 
-    function test_legacy_succeeds() external {
+    function test_legacy_succeeds() external view {
         // Getters for the remote token
         assertEq(L2Token.REMOTE_TOKEN(), address(L1Token));
         assertEq(L2Token.remoteToken(), address(L1Token));
@@ -73,7 +73,7 @@ contract OptimismMintableERC20_Test is Bridge_Initializer {
         L2Token.burn(alice, 100);
     }
 
-    function test_erc165_supportsInterface_succeeds() external {
+    function test_erc165_supportsInterface_succeeds() external view {
         // The assertEq calls in this test are comparing the manual calculation of the iface,
         // with what is returned by the solidity's type().interfaceId, just to be safe.
         bytes4 iface1 = bytes4(keccak256("supportsInterface(bytes4)"));
diff --git a/packages/contracts-bedrock/test/universal/OptimismMintableERC20Factory.t.sol b/packages/contracts-bedrock/test/universal/OptimismMintableERC20Factory.t.sol
index 08ee0343e53f..d1919a5ff555 100644
--- a/packages/contracts-bedrock/test/universal/OptimismMintableERC20Factory.t.sol
+++ b/packages/contracts-bedrock/test/universal/OptimismMintableERC20Factory.t.sol
@@ -25,7 +25,7 @@ contract OptimismMintableTokenFactory_Test is Bridge_Initializer {
     }
 
     /// @dev Tests that the proxy is initialized correctly.
-    function test_initialize_succeeds() external {
+    function test_initialize_succeeds() external view {
         assertEq(address(l1OptimismMintableERC20Factory.BRIDGE()), address(l1StandardBridge));
         assertEq(address(l1OptimismMintableERC20Factory.bridge()), address(l1StandardBridge));
     }
diff --git a/packages/contracts-bedrock/test/universal/OptimismMintableERC721.t.sol b/packages/contracts-bedrock/test/universal/OptimismMintableERC721.t.sol
index 56eb056c3d1e..daea00064cf4 100644
--- a/packages/contracts-bedrock/test/universal/OptimismMintableERC721.t.sol
+++ b/packages/contracts-bedrock/test/universal/OptimismMintableERC721.t.sol
@@ -30,7 +30,7 @@ contract OptimismMintableERC721_Test is Bridge_Initializer {
         vm.label(address(L2NFT), "L2ERC721Token");
     }
 
-    function test_constructor_succeeds() external {
+    function test_constructor_succeeds() external view {
         assertEq(L2NFT.name(), "L2NFT");
         assertEq(L2NFT.symbol(), "L2T");
         assertEq(L2NFT.remoteToken(), address(L1NFT));
@@ -42,7 +42,7 @@ contract OptimismMintableERC721_Test is Bridge_Initializer {
     }
 
     /// @notice Ensure that the contract supports the expected interfaces.
-    function test_supportsInterfaces_succeeds() external {
+    function test_supportsInterfaces_succeeds() external view {
         // Checks if the contract supports the IOptimismMintableERC721 interface.
         assertTrue(L2NFT.supportsInterface(type(IOptimismMintableERC721).interfaceId));
         // Checks if the contract supports the IERC721Enumerable interface.
diff --git a/packages/contracts-bedrock/test/universal/OptimismMintableERC721Factory.t.sol b/packages/contracts-bedrock/test/universal/OptimismMintableERC721Factory.t.sol
index 04a084f392d1..7fb6d079b85c 100644
--- a/packages/contracts-bedrock/test/universal/OptimismMintableERC721Factory.t.sol
+++ b/packages/contracts-bedrock/test/universal/OptimismMintableERC721Factory.t.sol
@@ -21,7 +21,7 @@ contract OptimismMintableERC721Factory_Test is Bridge_Initializer {
         vm.label(address(factory), "OptimismMintableERC721Factory");
     }
 
-    function test_constructor_succeeds() external {
+    function test_constructor_succeeds() external view {
         assertEq(factory.BRIDGE(), address(l2ERC721Bridge));
         assertEq(factory.REMOTE_CHAIN_ID(), 1);
     }
diff --git a/packages/contracts-bedrock/test/universal/ProxyAdmin.t.sol b/packages/contracts-bedrock/test/universal/ProxyAdmin.t.sol
index 9cd3e1772f64..4de72c872572 100644
--- a/packages/contracts-bedrock/test/universal/ProxyAdmin.t.sol
+++ b/packages/contracts-bedrock/test/universal/ProxyAdmin.t.sol
@@ -80,11 +80,11 @@ contract ProxyAdmin_Test is Test {
         admin.setProxyType(address(0), ProxyAdmin.ProxyType.CHUGSPLASH);
     }
 
-    function test_owner_succeeds() external {
+    function test_owner_succeeds() external view {
         assertEq(admin.owner(), alice);
     }
 
-    function test_proxyType_succeeds() external {
+    function test_proxyType_succeeds() external view {
         assertEq(uint256(admin.proxyType(address(proxy))), uint256(ProxyAdmin.ProxyType.ERC1967));
         assertEq(uint256(admin.proxyType(address(chugsplash))), uint256(ProxyAdmin.ProxyType.CHUGSPLASH));
         assertEq(uint256(admin.proxyType(address(resolved))), uint256(ProxyAdmin.ProxyType.RESOLVED));
@@ -117,19 +117,19 @@ contract ProxyAdmin_Test is Test {
         }
     }
 
-    function test_erc1967GetProxyAdmin_succeeds() external {
+    function test_erc1967GetProxyAdmin_succeeds() external view {
         getProxyAdmin(payable(proxy));
     }
 
-    function test_chugsplashGetProxyAdmin_succeeds() external {
+    function test_chugsplashGetProxyAdmin_succeeds() external view {
         getProxyAdmin(payable(chugsplash));
     }
 
-    function test_delegateResolvedGetProxyAdmin_succeeds() external {
+    function test_delegateResolvedGetProxyAdmin_succeeds() external view {
         getProxyAdmin(payable(resolved));
     }
 
-    function getProxyAdmin(address payable _proxy) internal {
+    function getProxyAdmin(address payable _proxy) internal view {
         address owner = admin.getProxyAdmin(_proxy);
         assertEq(owner, address(admin));
     }
diff --git a/packages/contracts-bedrock/test/universal/StandardBridge.t.sol b/packages/contracts-bedrock/test/universal/StandardBridge.t.sol
index c64e816dc0e7..e2f62b32b843 100644
--- a/packages/contracts-bedrock/test/universal/StandardBridge.t.sol
+++ b/packages/contracts-bedrock/test/universal/StandardBridge.t.sol
@@ -5,6 +5,7 @@ import { StandardBridge } from "src/universal/StandardBridge.sol";
 import { CommonTest } from "test/setup/CommonTest.sol";
 import { OptimismMintableERC20, ILegacyMintableERC20 } from "src/universal/OptimismMintableERC20.sol";
 import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import { Constants } from "src/libraries/Constants.sol";
 
 /// @title StandardBridgeTester
 /// @notice Simple wrapper around the StandardBridge contract that exposes
@@ -20,6 +21,10 @@ contract StandardBridgeTester is StandardBridge {
         return _isCorrectTokenPair(_mintableToken, _otherToken);
     }
 
+    function gasPayingToken() internal pure override returns (address, uint8) {
+        return (Constants.ETHER, 18);
+    }
+
     receive() external payable override { }
 }
 
@@ -78,7 +83,7 @@ contract StandardBridge_Stateless_Test is CommonTest {
     ///         This function should return true for both modern and legacy
     ///         OptimismMintableERC20 tokens and false for any accounts that
     ///         do not implement the interface.
-    function test_isOptimismMintableERC20_succeeds() external {
+    function test_isOptimismMintableERC20_succeeds() external view {
         // Both the modern and legacy mintable tokens should return true
         assertTrue(bridge.isOptimismMintableERC20(address(mintable)));
         assertTrue(bridge.isOptimismMintableERC20(address(legacy)));
@@ -111,7 +116,7 @@ contract StandardBridge_Stateless_Test is CommonTest {
     }
 
     /// @notice The bridge by default should be unpaused.
-    function test_paused_succeeds() external {
+    function test_paused_succeeds() external view {
         assertFalse(bridge.paused());
     }
 }
diff --git a/packages/contracts-bedrock/test/vendor/AddressAliasHelper.t.sol b/packages/contracts-bedrock/test/vendor/AddressAliasHelper.t.sol
index 45211879c17f..e562ddae9723 100644
--- a/packages/contracts-bedrock/test/vendor/AddressAliasHelper.t.sol
+++ b/packages/contracts-bedrock/test/vendor/AddressAliasHelper.t.sol
@@ -6,7 +6,7 @@ import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol";
 
 contract AddressAliasHelper_applyAndUndo_Test is Test {
     /// @notice Tests that applying and then undoing an alias results in the original address.
-    function testFuzz_applyAndUndo_succeeds(address _address) external {
+    function testFuzz_applyAndUndo_succeeds(address _address) external pure {
         address aliased = AddressAliasHelper.applyL1ToL2Alias(_address);
         address unaliased = AddressAliasHelper.undoL1ToL2Alias(aliased);
         assertEq(_address, unaliased);
diff --git a/packages/contracts-bedrock/test/vendor/Initializable.t.sol b/packages/contracts-bedrock/test/vendor/Initializable.t.sol
index ad72791e95d1..9fdeb8a4b4c1 100644
--- a/packages/contracts-bedrock/test/vendor/Initializable.t.sol
+++ b/packages/contracts-bedrock/test/vendor/Initializable.t.sol
@@ -11,6 +11,7 @@ import { ResourceMetering } from "src/L1/ResourceMetering.sol";
 import { OptimismPortal } from "src/L1/OptimismPortal.sol";
 import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol";
 import "src/L1/ProtocolVersions.sol";
+import "src/dispute/lib/Types.sol";
 import "scripts/Deployer.sol";
 
 /// @title Initializer_Test
@@ -59,7 +60,9 @@ contract Initializer_Test is Bridge_Initializer {
         contracts.push(
             InitializeableContract({
                 target: deploy.mustGetAddress("L1CrossDomainMessenger"),
-                initCalldata: abi.encodeCall(l1CrossDomainMessenger.initialize, (superchainConfig, optimismPortal)),
+                initCalldata: abi.encodeCall(
+                    l1CrossDomainMessenger.initialize, (superchainConfig, optimismPortal, systemConfig)
+                ),
                 initializedSlotVal: deploy.loadInitializedSlot("L1CrossDomainMessenger")
             })
         );
@@ -67,7 +70,9 @@ contract Initializer_Test is Bridge_Initializer {
         contracts.push(
             InitializeableContract({
                 target: address(l1CrossDomainMessenger),
-                initCalldata: abi.encodeCall(l1CrossDomainMessenger.initialize, (superchainConfig, optimismPortal)),
+                initCalldata: abi.encodeCall(
+                    l1CrossDomainMessenger.initialize, (superchainConfig, optimismPortal, systemConfig)
+                ),
                 initializedSlotVal: deploy.loadInitializedSlot("L1CrossDomainMessengerProxy")
             })
         );
@@ -132,8 +137,14 @@ contract Initializer_Test is Bridge_Initializer {
             InitializeableContract({
                 target: deploy.mustGetAddress("OptimismPortal2"),
                 initCalldata: abi.encodeCall(
-                    optimismPortal2.initialize, (disputeGameFactory, systemConfig, superchainConfig)
-                    ),
+                    optimismPortal2.initialize,
+                    (
+                        disputeGameFactory,
+                        systemConfig,
+                        superchainConfig,
+                        GameType.wrap(uint32(deploy.cfg().respectedGameType()))
+                    )
+                ),
                 initializedSlotVal: deploy.loadInitializedSlot("OptimismPortal2")
             })
         );
@@ -171,12 +182,13 @@ contract Initializer_Test is Bridge_Initializer {
                             l1CrossDomainMessenger: address(0),
                             l1ERC721Bridge: address(0),
                             l1StandardBridge: address(0),
-                            l2OutputOracle: address(0),
+                            disputeGameFactory: address(0),
                             optimismPortal: address(0),
-                            optimismMintableERC20Factory: address(0)
+                            optimismMintableERC20Factory: address(0),
+                            gasPayingToken: Constants.ETHER
                         })
                     )
-                    ),
+                ),
                 initializedSlotVal: deploy.loadInitializedSlot("SystemConfig")
             })
         );
@@ -206,12 +218,13 @@ contract Initializer_Test is Bridge_Initializer {
                             l1CrossDomainMessenger: address(0),
                             l1ERC721Bridge: address(0),
                             l1StandardBridge: address(0),
-                            l2OutputOracle: address(0),
+                            disputeGameFactory: address(0),
                             optimismPortal: address(0),
-                            optimismMintableERC20Factory: address(0)
+                            optimismMintableERC20Factory: address(0),
+                            gasPayingToken: Constants.ETHER
                         })
                     )
-                    ),
+                ),
                 initializedSlotVal: deploy.loadInitializedSlot("SystemConfigProxy")
             })
         );
@@ -221,7 +234,7 @@ contract Initializer_Test is Bridge_Initializer {
                 target: deploy.mustGetAddress("ProtocolVersions"),
                 initCalldata: abi.encodeCall(
                     protocolVersions.initialize, (address(0), ProtocolVersion.wrap(1), ProtocolVersion.wrap(2))
-                    ),
+                ),
                 initializedSlotVal: deploy.loadInitializedSlot("ProtocolVersions")
             })
         );
@@ -231,7 +244,7 @@ contract Initializer_Test is Bridge_Initializer {
                 target: address(protocolVersions),
                 initCalldata: abi.encodeCall(
                     protocolVersions.initialize, (address(0), ProtocolVersion.wrap(1), ProtocolVersion.wrap(2))
-                    ),
+                ),
                 initializedSlotVal: deploy.loadInitializedSlot("ProtocolVersionsProxy")
             })
         );
@@ -247,7 +260,9 @@ contract Initializer_Test is Bridge_Initializer {
         contracts.push(
             InitializeableContract({
                 target: deploy.mustGetAddress("L1StandardBridge"),
-                initCalldata: abi.encodeCall(l1StandardBridge.initialize, (l1CrossDomainMessenger, superchainConfig)),
+                initCalldata: abi.encodeCall(
+                    l1StandardBridge.initialize, (l1CrossDomainMessenger, superchainConfig, systemConfig)
+                ),
                 initializedSlotVal: deploy.loadInitializedSlot("L1StandardBridge")
             })
         );
@@ -255,7 +270,9 @@ contract Initializer_Test is Bridge_Initializer {
         contracts.push(
             InitializeableContract({
                 target: address(l1StandardBridge),
-                initCalldata: abi.encodeCall(l1StandardBridge.initialize, (l1CrossDomainMessenger, superchainConfig)),
+                initCalldata: abi.encodeCall(
+                    l1StandardBridge.initialize, (l1CrossDomainMessenger, superchainConfig, systemConfig)
+                ),
                 initializedSlotVal: deploy.loadInitializedSlot("L1StandardBridgeProxy")
             })
         );
@@ -334,7 +351,7 @@ contract Initializer_Test is Bridge_Initializer {
         // Ensure that all L1, L2 `Initializable` contracts are accounted for, in addition to
         // OptimismMintableERC20FactoryImpl, OptimismMintableERC20FactoryProxy, OptimismPortal2,
         // DisputeGameFactoryImpl, DisputeGameFactoryProxy, DelayedWETHImpl, DelayedWETHProxy.
-        assertEq(_getNumInitializable() + 5, contracts.length);
+        assertEq(_getNumInitializable() + 1, contracts.length);
 
         // Attempt to re-initialize all contracts within the `contracts` array.
         for (uint256 i; i < contracts.length; i++) {
diff --git a/packages/contracts-ts/.gitignore b/packages/contracts-ts/.gitignore
deleted file mode 100644
index a1e2a406af1b..000000000000
--- a/packages/contracts-ts/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-artifacts
-cache
-typechain
-.deps
-.envrc
-.env 
-/dist/
-coverage
diff --git a/packages/contracts-ts/.prettierignore b/packages/contracts-ts/.prettierignore
deleted file mode 100644
index ea808af54514..000000000000
--- a/packages/contracts-ts/.prettierignore
+++ /dev/null
@@ -1,7 +0,0 @@
-artifacts
-cache
-typechain
-.deps
-.envrc
-.env 
-/dist/
diff --git a/packages/contracts-ts/.prettierrc.cjs b/packages/contracts-ts/.prettierrc.cjs
deleted file mode 100644
index 2d293bab8925..000000000000
--- a/packages/contracts-ts/.prettierrc.cjs
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  ...require('../../.prettierrc.js'),
-}
diff --git a/packages/contracts-ts/CHANGELOG.md b/packages/contracts-ts/CHANGELOG.md
deleted file mode 100644
index 4e99d863c3f4..000000000000
--- a/packages/contracts-ts/CHANGELOG.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# @eth-optimism/contracts-ts
-
-## 0.17.0
-
-### Minor Changes
-
-- [#7644](https://github.com/ethereum-optimism/optimism/pull/7644) [`86bdaa075`](https://github.com/ethereum-optimism/optimism/commit/86bdaa075f424974531ce98ac9e21037e43db1bb) Thanks [@roninjin10](https://github.com/roninjin10)! - Removed unused hooks and actions
-
-## 0.16.2
-
-### Patch Changes
-
-- [#7450](https://github.com/ethereum-optimism/optimism/pull/7450) [`ac90e16a7`](https://github.com/ethereum-optimism/optimism/commit/ac90e16a7f85c4f73661ae6023135c3d00421c1e) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated dev dependencies related to testing that is causing audit tooling to report failures
diff --git a/packages/contracts-ts/CODE_GEN.md b/packages/contracts-ts/CODE_GEN.md
deleted file mode 100644
index bd637ff536b0..000000000000
--- a/packages/contracts-ts/CODE_GEN.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Code gen
-
-Summary -
-
-- This package is generated from [contracts-bedrock](../contracts-bedrock/)
-- Its version is kept in sync with contracts bedrock via the [changeset config](../../.changeset/config.json) e.g. if contracts-bedrock is `4.2.0` this package will have the same version.
-
-## Code gen instructions
-
-To run the code gen run the `generate` script from [package.json](./package.json). Make sure node modules is installed.
-
-```bash
-pnpm i && pnpm generate
-```
diff --git a/packages/contracts-ts/LICENSE b/packages/contracts-ts/LICENSE
deleted file mode 100644
index 86541fdc788e..000000000000
--- a/packages/contracts-ts/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2022 Optimism
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/packages/contracts-ts/README.md b/packages/contracts-ts/README.md
deleted file mode 100644
index 04df71cd3f62..000000000000
--- a/packages/contracts-ts/README.md
+++ /dev/null
@@ -1,64 +0,0 @@
-## Contracts TS
-
-[![codecov](https://codecov.io/gh/ethereum-optimism/optimism/branch/develop/graph/badge.svg?token=0VTG7PG7YR&flag=contracts-bedrock-tests)](https://codecov.io/gh/ethereum-optimism/optimism)
-
-ABI and Address constants + generated code from [@eth-optimism/contracts-bedrock/](../contracts-bedrock/) for use in TypeScript.
-
-Much of this package is generated. See [CODE_GEN.md](./CODE_GEN.md) for instructions on how to generate.
-
-#### @eth-optimism/contracts-ts
-
-The main entrypoint exports constants related to contracts bedrock as const. As const allows it to be [used in TypeScript with stronger typing than importing JSON](https://github.com/microsoft/TypeScript/issues/32063).
-
-- Exports contract abis.
-- Exports contract addresses
-
-```typescript
-import {
-  l2OutputOracleProxyABI,
-  l2OutputOracleAddresses,
-} from '@eth-optimism/contracts-ts'
-
-console.log(l2OutputOracleAddresses[10], abi)
-```
-
-Addresses are also exported as an object for convenience.
-
-```typescript
-import { addresses } from '@eth-optimism/contracts-ts'
-
-console.log(addresses.l2OutputOracle[10])
-```
-
-#### @eth-optimism/contracts-ts/react
-
-- All [React hooks](https://wagmi.sh/cli/plugins/react) `@eth-optimism/contracts-ts/react`
-
-```typescript
-import { useAddressManagerAddress } from '@eth-optimism/contracts-ts/react'
-
-const component = () => {
-  const { data, error, loading } = useAddressManagerAddress()
-  if (loading) {
-    return 
Loading
- } - if (err) { - return
Error
- } - return
{data}
-} -``` - -#### @eth-optimism/contracts-ts/actions - -- All [wagmi actions](https://wagmi.sh/react/actions) for use in Vanilla JS or non react code - -```typescript -import { readSystemConfig } from '@eth-optimism/contracts-ts/actions' -console.log(await readSystemConfig()) -``` - -#### See Also - -- [Contracts bedrock specs](../../specs/) -- [Wagmi](https://wagmi.sh) diff --git a/packages/contracts-ts/abis.json b/packages/contracts-ts/abis.json deleted file mode 100644 index 2c4576bf815c..000000000000 --- a/packages/contracts-ts/abis.json +++ /dev/null @@ -1,13618 +0,0 @@ -{ - "AddressManager": [ - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string", - "indexed": true - }, - { - "name": "_newAddress", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "_oldAddress", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "AddressSet" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "previousOwner", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnershipTransferred" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - } - ], - "name": "getAddress", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "renounceOwnership", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_address", - "internalType": "address", - "type": "address" - } - ], - "name": "setAddress", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [] - } - ], - "AssetReceiver": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_owner", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "user", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnerUpdated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "ReceivedETH" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "asset", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewERC20" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "asset", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "id", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewERC721" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewETH" - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_gas", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_value", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "CALL", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - }, - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_gas", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "DELEGATECALL", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - }, - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC20", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC20", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - } - ], - "name": "withdrawERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC721", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_id", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawERC721", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address payable", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawETH", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address payable", - "type": "address" - } - ], - "name": "withdrawETH", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "AttestationStation": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "creator", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "about", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "key", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - }, - { - "name": "val", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "AttestationCreated" - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_attestations", - "internalType": "struct AttestationStation.AttestationData[]", - "type": "tuple[]", - "components": [ - { - "name": "about", - "internalType": "address", - "type": "address" - }, - { - "name": "key", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "val", - "internalType": "bytes", - "type": "bytes" - } - ] - } - ], - "name": "attest", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_about", - "internalType": "address", - "type": "address" - }, - { - "name": "_key", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "_val", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "attest", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - }, - { - "name": "", - "internalType": "address", - "type": "address" - }, - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "attestations", - "outputs": [ - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "BaseFeeVault": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_recipient", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "value", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "Withdrawal" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MIN_WITHDRAWAL_AMOUNT", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RECIPIENT", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "totalProcessed", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "withdraw", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "CheckBalanceHigh": [ - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "params", - "internalType": "struct CheckBalanceHigh.Params", - "type": "tuple", - "components": [ - { - "name": "target", - "internalType": "address", - "type": "address" - }, - { - "name": "threshold", - "internalType": "uint256", - "type": "uint256" - } - ], - "indexed": false - } - ], - "name": "_EventToExposeStructInABI__Params" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_params", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "check", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - } - ], - "CheckBalanceLow": [ - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "params", - "internalType": "struct CheckBalanceLow.Params", - "type": "tuple", - "components": [ - { - "name": "target", - "internalType": "address", - "type": "address" - }, - { - "name": "threshold", - "internalType": "uint256", - "type": "uint256" - } - ], - "indexed": false - } - ], - "name": "_EventToExposeStructInABI__Params" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_params", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "check", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - } - ], - "CheckGelatoLow": [ - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "params", - "internalType": "struct CheckGelatoLow.Params", - "type": "tuple", - "components": [ - { - "name": "treasury", - "internalType": "address", - "type": "address" - }, - { - "name": "threshold", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "recipient", - "internalType": "address", - "type": "address" - } - ], - "indexed": false - } - ], - "name": "_EventToExposeStructInABI__Params" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_params", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "check", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - } - ], - "CheckTrue": [ - { - "stateMutability": "pure", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "check", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - } - ], - "Drippie": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_owner", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "nameref", - "internalType": "string", - "type": "string", - "indexed": true - }, - { - "name": "name", - "internalType": "string", - "type": "string", - "indexed": false - }, - { - "name": "config", - "internalType": "struct Drippie.DripConfig", - "type": "tuple", - "components": [ - { - "name": "reentrant", - "internalType": "bool", - "type": "bool" - }, - { - "name": "interval", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "dripcheck", - "internalType": "contract IDripCheck", - "type": "address" - }, - { - "name": "checkparams", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "actions", - "internalType": "struct Drippie.DripAction[]", - "type": "tuple[]", - "components": [ - { - "name": "target", - "internalType": "address payable", - "type": "address" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ], - "indexed": false - } - ], - "name": "DripCreated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "nameref", - "internalType": "string", - "type": "string", - "indexed": true - }, - { - "name": "name", - "internalType": "string", - "type": "string", - "indexed": false - }, - { - "name": "executor", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "timestamp", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "DripExecuted" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "nameref", - "internalType": "string", - "type": "string", - "indexed": true - }, - { - "name": "name", - "internalType": "string", - "type": "string", - "indexed": false - }, - { - "name": "status", - "internalType": "enum Drippie.DripStatus", - "type": "uint8", - "indexed": false - } - ], - "name": "DripStatusUpdated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "user", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnerUpdated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "ReceivedETH" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "asset", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewERC20" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "asset", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "id", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewERC721" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewETH" - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_value", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "CALL", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - }, - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "DELEGATECALL", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - }, - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_config", - "internalType": "struct Drippie.DripConfig", - "type": "tuple", - "components": [ - { - "name": "reentrant", - "internalType": "bool", - "type": "bool" - }, - { - "name": "interval", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "dripcheck", - "internalType": "contract IDripCheck", - "type": "address" - }, - { - "name": "checkparams", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "actions", - "internalType": "struct Drippie.DripAction[]", - "type": "tuple[]", - "components": [ - { - "name": "target", - "internalType": "address payable", - "type": "address" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ] - } - ], - "name": "create", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - } - ], - "name": "drip", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ], - "name": "drips", - "outputs": [ - { - "name": "status", - "internalType": "enum Drippie.DripStatus", - "type": "uint8" - }, - { - "name": "config", - "internalType": "struct Drippie.DripConfig", - "type": "tuple", - "components": [ - { - "name": "reentrant", - "internalType": "bool", - "type": "bool" - }, - { - "name": "interval", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "dripcheck", - "internalType": "contract IDripCheck", - "type": "address" - }, - { - "name": "checkparams", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "actions", - "internalType": "struct Drippie.DripAction[]", - "type": "tuple[]", - "components": [ - { - "name": "target", - "internalType": "address payable", - "type": "address" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ] - }, - { - "name": "last", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "count", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - } - ], - "name": "executable", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_status", - "internalType": "enum Drippie.DripStatus", - "type": "uint8" - } - ], - "name": "status", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC20", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC20", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - } - ], - "name": "withdrawERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC721", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_id", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawERC721", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address payable", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawETH", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address payable", - "type": "address" - } - ], - "name": "withdrawETH", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "Drippie_goerli": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_owner", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "nameref", - "internalType": "string", - "type": "string", - "indexed": true - }, - { - "name": "name", - "internalType": "string", - "type": "string", - "indexed": false - }, - { - "name": "config", - "internalType": "struct Drippie.DripConfig", - "type": "tuple", - "components": [ - { - "name": "reentrant", - "internalType": "bool", - "type": "bool" - }, - { - "name": "interval", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "dripcheck", - "internalType": "contract IDripCheck", - "type": "address" - }, - { - "name": "checkparams", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "actions", - "internalType": "struct Drippie.DripAction[]", - "type": "tuple[]", - "components": [ - { - "name": "target", - "internalType": "address payable", - "type": "address" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ], - "indexed": false - } - ], - "name": "DripCreated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "nameref", - "internalType": "string", - "type": "string", - "indexed": true - }, - { - "name": "name", - "internalType": "string", - "type": "string", - "indexed": false - }, - { - "name": "executor", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "timestamp", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "DripExecuted" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "nameref", - "internalType": "string", - "type": "string", - "indexed": true - }, - { - "name": "name", - "internalType": "string", - "type": "string", - "indexed": false - }, - { - "name": "status", - "internalType": "enum Drippie.DripStatus", - "type": "uint8", - "indexed": false - } - ], - "name": "DripStatusUpdated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "user", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnerUpdated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "ReceivedETH" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "asset", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewERC20" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "asset", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "id", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewERC721" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewETH" - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_value", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "CALL", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - }, - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "DELEGATECALL", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - }, - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_config", - "internalType": "struct Drippie.DripConfig", - "type": "tuple", - "components": [ - { - "name": "reentrant", - "internalType": "bool", - "type": "bool" - }, - { - "name": "interval", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "dripcheck", - "internalType": "contract IDripCheck", - "type": "address" - }, - { - "name": "checkparams", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "actions", - "internalType": "struct Drippie.DripAction[]", - "type": "tuple[]", - "components": [ - { - "name": "target", - "internalType": "address payable", - "type": "address" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ] - } - ], - "name": "create", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - } - ], - "name": "drip", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ], - "name": "drips", - "outputs": [ - { - "name": "status", - "internalType": "enum Drippie.DripStatus", - "type": "uint8" - }, - { - "name": "config", - "internalType": "struct Drippie.DripConfig", - "type": "tuple", - "components": [ - { - "name": "reentrant", - "internalType": "bool", - "type": "bool" - }, - { - "name": "interval", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "dripcheck", - "internalType": "contract IDripCheck", - "type": "address" - }, - { - "name": "checkparams", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "actions", - "internalType": "struct Drippie.DripAction[]", - "type": "tuple[]", - "components": [ - { - "name": "target", - "internalType": "address payable", - "type": "address" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ] - }, - { - "name": "last", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "count", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - } - ], - "name": "executable", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_status", - "internalType": "enum Drippie.DripStatus", - "type": "uint8" - } - ], - "name": "status", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC20", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC20", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - } - ], - "name": "withdrawERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC721", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_id", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawERC721", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address payable", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawETH", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address payable", - "type": "address" - } - ], - "name": "withdrawETH", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "Drippie_optimism-goerli": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_owner", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "nameref", - "internalType": "string", - "type": "string", - "indexed": true - }, - { - "name": "name", - "internalType": "string", - "type": "string", - "indexed": false - }, - { - "name": "config", - "internalType": "struct Drippie.DripConfig", - "type": "tuple", - "components": [ - { - "name": "interval", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "dripcheck", - "internalType": "contract IDripCheck", - "type": "address" - }, - { - "name": "checkparams", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "actions", - "internalType": "struct Drippie.DripAction[]", - "type": "tuple[]", - "components": [ - { - "name": "target", - "internalType": "address payable", - "type": "address" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ], - "indexed": false - } - ], - "name": "DripCreated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "nameref", - "internalType": "string", - "type": "string", - "indexed": true - }, - { - "name": "name", - "internalType": "string", - "type": "string", - "indexed": false - }, - { - "name": "executor", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "timestamp", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "DripExecuted" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "nameref", - "internalType": "string", - "type": "string", - "indexed": true - }, - { - "name": "name", - "internalType": "string", - "type": "string", - "indexed": false - }, - { - "name": "status", - "internalType": "enum Drippie.DripStatus", - "type": "uint8", - "indexed": false - } - ], - "name": "DripStatusUpdated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "user", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnerUpdated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "ReceivedETH" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "asset", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewERC20" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "asset", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "id", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewERC721" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewETH" - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_gas", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_value", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "CALL", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - }, - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_gas", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "DELEGATECALL", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - }, - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_config", - "internalType": "struct Drippie.DripConfig", - "type": "tuple", - "components": [ - { - "name": "interval", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "dripcheck", - "internalType": "contract IDripCheck", - "type": "address" - }, - { - "name": "checkparams", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "actions", - "internalType": "struct Drippie.DripAction[]", - "type": "tuple[]", - "components": [ - { - "name": "target", - "internalType": "address payable", - "type": "address" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ] - } - ], - "name": "create", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - } - ], - "name": "drip", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ], - "name": "drips", - "outputs": [ - { - "name": "status", - "internalType": "enum Drippie.DripStatus", - "type": "uint8" - }, - { - "name": "config", - "internalType": "struct Drippie.DripConfig", - "type": "tuple", - "components": [ - { - "name": "interval", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "dripcheck", - "internalType": "contract IDripCheck", - "type": "address" - }, - { - "name": "checkparams", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "actions", - "internalType": "struct Drippie.DripAction[]", - "type": "tuple[]", - "components": [ - { - "name": "target", - "internalType": "address payable", - "type": "address" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ] - }, - { - "name": "last", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "count", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - } - ], - "name": "executable", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_status", - "internalType": "enum Drippie.DripStatus", - "type": "uint8" - } - ], - "name": "status", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC20", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC20", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - } - ], - "name": "withdrawERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC721", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_id", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawERC721", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address payable", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawETH", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address payable", - "type": "address" - } - ], - "name": "withdrawETH", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "EAS": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "error", - "inputs": [], - "name": "AccessDenied" - }, - { - "type": "error", - "inputs": [], - "name": "AlreadyRevoked" - }, - { - "type": "error", - "inputs": [], - "name": "AlreadyRevokedOffchain" - }, - { - "type": "error", - "inputs": [], - "name": "AlreadyTimestamped" - }, - { - "type": "error", - "inputs": [], - "name": "InsufficientValue" - }, - { - "type": "error", - "inputs": [], - "name": "InvalidAttestation" - }, - { - "type": "error", - "inputs": [], - "name": "InvalidAttestations" - }, - { - "type": "error", - "inputs": [], - "name": "InvalidExpirationTime" - }, - { - "type": "error", - "inputs": [], - "name": "InvalidLength" - }, - { - "type": "error", - "inputs": [], - "name": "InvalidOffset" - }, - { - "type": "error", - "inputs": [], - "name": "InvalidRegistry" - }, - { - "type": "error", - "inputs": [], - "name": "InvalidRevocation" - }, - { - "type": "error", - "inputs": [], - "name": "InvalidRevocations" - }, - { - "type": "error", - "inputs": [], - "name": "InvalidSchema" - }, - { - "type": "error", - "inputs": [], - "name": "InvalidSignature" - }, - { - "type": "error", - "inputs": [], - "name": "InvalidVerifier" - }, - { - "type": "error", - "inputs": [], - "name": "Irrevocable" - }, - { - "type": "error", - "inputs": [], - "name": "NotFound" - }, - { - "type": "error", - "inputs": [], - "name": "NotPayable" - }, - { - "type": "error", - "inputs": [], - "name": "WrongSchema" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "attester", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32", - "indexed": false - }, - { - "name": "schema", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - } - ], - "name": "Attested" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "attester", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32", - "indexed": false - }, - { - "name": "schema", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - } - ], - "name": "Revoked" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "revoker", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "data", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - }, - { - "name": "timestamp", - "internalType": "uint64", - "type": "uint64", - "indexed": true - } - ], - "name": "RevokedOffchain" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "data", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - }, - { - "name": "timestamp", - "internalType": "uint64", - "type": "uint64", - "indexed": true - } - ], - "name": "Timestamped" - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "request", - "internalType": "struct AttestationRequest", - "type": "tuple", - "components": [ - { - "name": "schema", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "struct AttestationRequestData", - "type": "tuple", - "components": [ - { - "name": "recipient", - "internalType": "address", - "type": "address" - }, - { - "name": "expirationTime", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "revocable", - "internalType": "bool", - "type": "bool" - }, - { - "name": "refUID", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ] - } - ], - "name": "attest", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "delegatedRequest", - "internalType": "struct DelegatedAttestationRequest", - "type": "tuple", - "components": [ - { - "name": "schema", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "struct AttestationRequestData", - "type": "tuple", - "components": [ - { - "name": "recipient", - "internalType": "address", - "type": "address" - }, - { - "name": "expirationTime", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "revocable", - "internalType": "bool", - "type": "bool" - }, - { - "name": "refUID", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "name": "signature", - "internalType": "struct EIP712Signature", - "type": "tuple", - "components": [ - { - "name": "v", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "r", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "s", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "name": "attester", - "internalType": "address", - "type": "address" - } - ] - } - ], - "name": "attestByDelegation", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "pure", - "type": "function", - "inputs": [], - "name": "getAttestTypeHash", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "getAttestation", - "outputs": [ - { - "name": "", - "internalType": "struct Attestation", - "type": "tuple", - "components": [ - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "schema", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "time", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "expirationTime", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "revocationTime", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "refUID", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "recipient", - "internalType": "address", - "type": "address" - }, - { - "name": "attester", - "internalType": "address", - "type": "address" - }, - { - "name": "revocable", - "internalType": "bool", - "type": "bool" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - } - ] - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "getDomainSeparator", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "getName", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "account", - "internalType": "address", - "type": "address" - } - ], - "name": "getNonce", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "revoker", - "internalType": "address", - "type": "address" - }, - { - "name": "data", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "getRevokeOffchain", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "pure", - "type": "function", - "inputs": [], - "name": "getRevokeTypeHash", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "pure", - "type": "function", - "inputs": [], - "name": "getSchemaRegistry", - "outputs": [ - { - "name": "", - "internalType": "contract ISchemaRegistry", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "data", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "getTimestamp", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "isAttestationValid", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "multiRequests", - "internalType": "struct MultiAttestationRequest[]", - "type": "tuple[]", - "components": [ - { - "name": "schema", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "struct AttestationRequestData[]", - "type": "tuple[]", - "components": [ - { - "name": "recipient", - "internalType": "address", - "type": "address" - }, - { - "name": "expirationTime", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "revocable", - "internalType": "bool", - "type": "bool" - }, - { - "name": "refUID", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ] - } - ], - "name": "multiAttest", - "outputs": [ - { - "name": "", - "internalType": "bytes32[]", - "type": "bytes32[]" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "multiDelegatedRequests", - "internalType": "struct MultiDelegatedAttestationRequest[]", - "type": "tuple[]", - "components": [ - { - "name": "schema", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "struct AttestationRequestData[]", - "type": "tuple[]", - "components": [ - { - "name": "recipient", - "internalType": "address", - "type": "address" - }, - { - "name": "expirationTime", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "revocable", - "internalType": "bool", - "type": "bool" - }, - { - "name": "refUID", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "name": "signatures", - "internalType": "struct EIP712Signature[]", - "type": "tuple[]", - "components": [ - { - "name": "v", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "r", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "s", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "name": "attester", - "internalType": "address", - "type": "address" - } - ] - } - ], - "name": "multiAttestByDelegation", - "outputs": [ - { - "name": "", - "internalType": "bytes32[]", - "type": "bytes32[]" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "multiRequests", - "internalType": "struct MultiRevocationRequest[]", - "type": "tuple[]", - "components": [ - { - "name": "schema", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "struct RevocationRequestData[]", - "type": "tuple[]", - "components": [ - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ] - } - ], - "name": "multiRevoke", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "multiDelegatedRequests", - "internalType": "struct MultiDelegatedRevocationRequest[]", - "type": "tuple[]", - "components": [ - { - "name": "schema", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "struct RevocationRequestData[]", - "type": "tuple[]", - "components": [ - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "name": "signatures", - "internalType": "struct EIP712Signature[]", - "type": "tuple[]", - "components": [ - { - "name": "v", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "r", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "s", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "name": "revoker", - "internalType": "address", - "type": "address" - } - ] - } - ], - "name": "multiRevokeByDelegation", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "data", - "internalType": "bytes32[]", - "type": "bytes32[]" - } - ], - "name": "multiRevokeOffchain", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "data", - "internalType": "bytes32[]", - "type": "bytes32[]" - } - ], - "name": "multiTimestamp", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "request", - "internalType": "struct RevocationRequest", - "type": "tuple", - "components": [ - { - "name": "schema", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "struct RevocationRequestData", - "type": "tuple", - "components": [ - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ] - } - ], - "name": "revoke", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "delegatedRequest", - "internalType": "struct DelegatedRevocationRequest", - "type": "tuple", - "components": [ - { - "name": "schema", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "data", - "internalType": "struct RevocationRequestData", - "type": "tuple", - "components": [ - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "name": "signature", - "internalType": "struct EIP712Signature", - "type": "tuple", - "components": [ - { - "name": "v", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "r", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "s", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "name": "revoker", - "internalType": "address", - "type": "address" - } - ] - } - ], - "name": "revokeByDelegation", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "data", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "revokeOffchain", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "data", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "timestamp", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "GasPriceOracle": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "DECIMALS", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "baseFee", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "pure", - "type": "function", - "inputs": [], - "name": "decimals", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "gasPrice", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "getL1Fee", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "getL1GasUsed", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l1BaseFee", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "overhead", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "scalar", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "L1Block": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "DEPOSITOR_ACCOUNT", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "basefee", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "batcherHash", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "hash", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l1FeeOverhead", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l1FeeScalar", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "number", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "sequenceNumber", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_number", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "_timestamp", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "_basefee", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_hash", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "_sequenceNumber", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "_batcherHash", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "_l1FeeOverhead", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_l1FeeScalar", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "setL1BlockValues", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "timestamp", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "L1CrossDomainMessenger": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "msgHash", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - } - ], - "name": "FailedRelayedMessage" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "msgHash", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - } - ], - "name": "RelayedMessage" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "target", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "sender", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "message", - "internalType": "bytes", - "type": "bytes", - "indexed": false - }, - { - "name": "messageNonce", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "gasLimit", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "SentMessage" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "sender", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "SentMessageExtension1" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MESSAGE_VERSION", - "outputs": [ - { - "name": "", - "internalType": "uint16", - "type": "uint16" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MIN_GAS_CALLDATA_OVERHEAD", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "OTHER_MESSENGER", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "PORTAL", - "outputs": [ - { - "name": "", - "internalType": "contract OptimismPortal", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RELAY_CALL_OVERHEAD", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RELAY_CONSTANT_OVERHEAD", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RELAY_GAS_CHECK_BUFFER", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RELAY_RESERVED_GAS", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "pure", - "type": "function", - "inputs": [ - { - "name": "_message", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - } - ], - "name": "baseGas", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "failedMessages", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_portal", - "internalType": "contract OptimismPortal", - "type": "address" - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "messageNonce", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "portal", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_nonce", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_sender", - "internalType": "address", - "type": "address" - }, - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_value", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_message", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "relayMessage", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_message", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - } - ], - "name": "sendMessage", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "successfulMessages", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "xDomainMessageSender", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - } - ], - "L1ERC721Bridge": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC721BridgeFinalized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC721BridgeInitiated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MESSENGER", - "outputs": [ - { - "name": "", - "internalType": "contract CrossDomainMessenger", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "OTHER_BRIDGE", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_tokenId", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeERC721", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_tokenId", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeERC721To", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - }, - { - "name": "", - "internalType": "address", - "type": "address" - }, - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "deposits", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_from", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_tokenId", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "finalizeBridgeERC721", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_messenger", - "internalType": "contract CrossDomainMessenger", - "type": "address" - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "messenger", - "outputs": [ - { - "name": "", - "internalType": "contract CrossDomainMessenger", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "otherBridge", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "L1FeeVault": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_recipient", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "value", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "Withdrawal" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MIN_WITHDRAWAL_AMOUNT", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RECIPIENT", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "totalProcessed", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "withdraw", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "L1StandardBridge": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC20BridgeFinalized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC20BridgeInitiated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "l1Token", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "l2Token", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC20DepositInitiated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "l1Token", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "l2Token", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC20WithdrawalFinalized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ETHBridgeFinalized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ETHBridgeInitiated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ETHDepositInitiated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ETHWithdrawalFinalized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MESSENGER", - "outputs": [ - { - "name": "", - "internalType": "contract CrossDomainMessenger", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "OTHER_BRIDGE", - "outputs": [ - { - "name": "", - "internalType": "contract StandardBridge", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeERC20To", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeETH", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeETHTo", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_l1Token", - "internalType": "address", - "type": "address" - }, - { - "name": "_l2Token", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "depositERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_l1Token", - "internalType": "address", - "type": "address" - }, - { - "name": "_l2Token", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "depositERC20To", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "depositETH", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "depositETHTo", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - }, - { - "name": "", - "internalType": "address", - "type": "address" - } - ], - "name": "deposits", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_from", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "finalizeBridgeERC20", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_from", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "finalizeBridgeETH", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_l1Token", - "internalType": "address", - "type": "address" - }, - { - "name": "_l2Token", - "internalType": "address", - "type": "address" - }, - { - "name": "_from", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "finalizeERC20Withdrawal", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_from", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "finalizeETHWithdrawal", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_messenger", - "internalType": "contract CrossDomainMessenger", - "type": "address" - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l2TokenBridge", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "messenger", - "outputs": [ - { - "name": "", - "internalType": "contract CrossDomainMessenger", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "otherBridge", - "outputs": [ - { - "name": "", - "internalType": "contract StandardBridge", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "L2CrossDomainMessenger": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_l1CrossDomainMessenger", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "msgHash", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - } - ], - "name": "FailedRelayedMessage" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "msgHash", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - } - ], - "name": "RelayedMessage" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "target", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "sender", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "message", - "internalType": "bytes", - "type": "bytes", - "indexed": false - }, - { - "name": "messageNonce", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "gasLimit", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "SentMessage" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "sender", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "SentMessageExtension1" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MESSAGE_VERSION", - "outputs": [ - { - "name": "", - "internalType": "uint16", - "type": "uint16" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MIN_GAS_CALLDATA_OVERHEAD", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "OTHER_MESSENGER", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RELAY_CALL_OVERHEAD", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RELAY_CONSTANT_OVERHEAD", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RELAY_GAS_CHECK_BUFFER", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RELAY_RESERVED_GAS", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "pure", - "type": "function", - "inputs": [ - { - "name": "_message", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - } - ], - "name": "baseGas", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "failedMessages", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l1CrossDomainMessenger", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "messageNonce", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_nonce", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_sender", - "internalType": "address", - "type": "address" - }, - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_value", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_message", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "relayMessage", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_message", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - } - ], - "name": "sendMessage", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "successfulMessages", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "xDomainMessageSender", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - } - ], - "L2ERC721Bridge": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_messenger", - "internalType": "address", - "type": "address" - }, - { - "name": "_otherBridge", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC721BridgeFinalized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC721BridgeInitiated" - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_tokenId", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeERC721", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_tokenId", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeERC721To", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_from", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_tokenId", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "finalizeBridgeERC721", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "messenger", - "outputs": [ - { - "name": "", - "internalType": "contract CrossDomainMessenger", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "otherBridge", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "L2ERC721Bridge_optimism-goerli": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_messenger", - "internalType": "address", - "type": "address" - }, - { - "name": "_otherBridge", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC721BridgeFinalized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC721BridgeInitiated" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MESSENGER", - "outputs": [ - { - "name": "", - "internalType": "contract CrossDomainMessenger", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "OTHER_BRIDGE", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_tokenId", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeERC721", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_tokenId", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeERC721To", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_from", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_tokenId", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "finalizeBridgeERC721", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "messenger", - "outputs": [ - { - "name": "", - "internalType": "contract CrossDomainMessenger", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "otherBridge", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "L2OutputOracle": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_submissionInterval", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_l2BlockTime", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_finalizationPeriodSeconds", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "outputRoot", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - }, - { - "name": "l2OutputIndex", - "internalType": "uint256", - "type": "uint256", - "indexed": true - }, - { - "name": "l2BlockNumber", - "internalType": "uint256", - "type": "uint256", - "indexed": true - }, - { - "name": "l1Timestamp", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "OutputProposed" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "prevNextOutputIndex", - "internalType": "uint256", - "type": "uint256", - "indexed": true - }, - { - "name": "newNextOutputIndex", - "internalType": "uint256", - "type": "uint256", - "indexed": true - } - ], - "name": "OutputsDeleted" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "CHALLENGER", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "FINALIZATION_PERIOD_SECONDS", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "L2_BLOCK_TIME", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "PROPOSER", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "SUBMISSION_INTERVAL", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "challenger", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_l2BlockNumber", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "computeL2Timestamp", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_l2OutputIndex", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "deleteL2Outputs", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "finalizationPeriodSeconds", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_l2OutputIndex", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "getL2Output", - "outputs": [ - { - "name": "", - "internalType": "struct Types.OutputProposal", - "type": "tuple", - "components": [ - { - "name": "outputRoot", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "timestamp", - "internalType": "uint128", - "type": "uint128" - }, - { - "name": "l2BlockNumber", - "internalType": "uint128", - "type": "uint128" - } - ] - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_l2BlockNumber", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "getL2OutputAfter", - "outputs": [ - { - "name": "", - "internalType": "struct Types.OutputProposal", - "type": "tuple", - "components": [ - { - "name": "outputRoot", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "timestamp", - "internalType": "uint128", - "type": "uint128" - }, - { - "name": "l2BlockNumber", - "internalType": "uint128", - "type": "uint128" - } - ] - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_l2BlockNumber", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "getL2OutputIndexAfter", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_startingBlockNumber", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_startingTimestamp", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_proposer", - "internalType": "address", - "type": "address" - }, - { - "name": "_challenger", - "internalType": "address", - "type": "address" - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l2BlockTime", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "latestBlockNumber", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "latestOutputIndex", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "nextBlockNumber", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "nextOutputIndex", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_outputRoot", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "_l2BlockNumber", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_l1BlockHash", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "_l1BlockNumber", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "proposeL2Output", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "proposer", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "startingBlockNumber", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "startingTimestamp", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "submissionInterval", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "L2StandardBridge": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_otherBridge", - "internalType": "address payable", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "l1Token", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "l2Token", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "DepositFinalized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC20BridgeFinalized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ERC20BridgeInitiated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ETHBridgeFinalized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ETHBridgeInitiated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "l1Token", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "l2Token", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "extraData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "WithdrawalInitiated" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MESSENGER", - "outputs": [ - { - "name": "", - "internalType": "contract CrossDomainMessenger", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "OTHER_BRIDGE", - "outputs": [ - { - "name": "", - "internalType": "contract StandardBridge", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeERC20To", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeETH", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "bridgeETHTo", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - }, - { - "name": "", - "internalType": "address", - "type": "address" - } - ], - "name": "deposits", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_localToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_from", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "finalizeBridgeERC20", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_from", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "finalizeBridgeETH", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_l1Token", - "internalType": "address", - "type": "address" - }, - { - "name": "_l2Token", - "internalType": "address", - "type": "address" - }, - { - "name": "_from", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "finalizeDeposit", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l1TokenBridge", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "messenger", - "outputs": [ - { - "name": "", - "internalType": "contract CrossDomainMessenger", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_l2Token", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "withdraw", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_l2Token", - "internalType": "address", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_minGasLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "_extraData", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "withdrawTo", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "L2ToL1MessagePasser": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "nonce", - "internalType": "uint256", - "type": "uint256", - "indexed": true - }, - { - "name": "sender", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "target", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "gasLimit", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes", - "indexed": false - }, - { - "name": "withdrawalHash", - "internalType": "bytes32", - "type": "bytes32", - "indexed": false - } - ], - "name": "MessagePassed" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": true - } - ], - "name": "WithdrawerBalanceBurnt" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MESSAGE_VERSION", - "outputs": [ - { - "name": "", - "internalType": "uint16", - "type": "uint16" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "burn", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_gasLimit", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "initiateWithdrawal", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "messageNonce", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "sentMessages", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "MintManager": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_upgrader", - "internalType": "address", - "type": "address" - }, - { - "name": "_governanceToken", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "previousOwner", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnershipTransferred" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "DENOMINATOR", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MINT_CAP", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MINT_PERIOD", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "governanceToken", - "outputs": [ - { - "name": "", - "internalType": "contract GovernanceToken", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_account", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "mintPermittedAfter", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "renounceOwnership", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_newMintManager", - "internalType": "address", - "type": "address" - } - ], - "name": "upgrade", - "outputs": [] - } - ], - "OptimismMintableERC20Factory": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "deployer", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "OptimismMintableERC20Created" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "StandardL2TokenCreated" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "BRIDGE", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "bridge", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - } - ], - "name": "createOptimismMintableERC20", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - }, - { - "name": "_decimals", - "internalType": "uint8", - "type": "uint8" - } - ], - "name": "createOptimismMintableERC20WithDecimals", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - } - ], - "name": "createStandardL2Token", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_bridge", - "internalType": "address", - "type": "address" - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "OptimismMintableERC20Factory_goerli": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "deployer", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "OptimismMintableERC20Created" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "StandardL2TokenCreated" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "BRIDGE", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "bridge", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - } - ], - "name": "createOptimismMintableERC20", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - }, - { - "name": "_decimals", - "internalType": "uint8", - "type": "uint8" - } - ], - "name": "createOptimismMintableERC20WithDecimals", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - } - ], - "name": "createStandardL2Token", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_bridge", - "internalType": "address", - "type": "address" - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "OptimismMintableERC20Factory_optimism-goerli": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_bridge", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "deployer", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "OptimismMintableERC20Created" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "StandardL2TokenCreated" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "BRIDGE", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - } - ], - "name": "createOptimismMintableERC20", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - } - ], - "name": "createStandardL2Token", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "OptimismMintableERC721Factory": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_bridge", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteChainId", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "deployer", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "OptimismMintableERC721Created" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "bridge", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - } - ], - "name": "createOptimismMintableERC721", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ], - "name": "isOptimismMintableERC721", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "remoteChainId", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "OptimismMintableERC721Factory_optimism-goerli": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_bridge", - "internalType": "address", - "type": "address" - }, - { - "name": "_remoteChainId", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "localToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "remoteToken", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "deployer", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "OptimismMintableERC721Created" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "BRIDGE", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "REMOTE_CHAIN_ID", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_remoteToken", - "internalType": "address", - "type": "address" - }, - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - } - ], - "name": "createOptimismMintableERC721", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ], - "name": "isOptimismMintableERC721", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "OptimismPortal": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "account", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "Paused" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "version", - "internalType": "uint256", - "type": "uint256", - "indexed": true - }, - { - "name": "opaqueData", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "TransactionDeposited" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "account", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "Unpaused" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawalHash", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - }, - { - "name": "success", - "internalType": "bool", - "type": "bool", - "indexed": false - } - ], - "name": "WithdrawalFinalized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawalHash", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "WithdrawalProven" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "GUARDIAN", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "L2_ORACLE", - "outputs": [ - { - "name": "", - "internalType": "contract L2OutputOracle", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "SYSTEM_CONFIG", - "outputs": [ - { - "name": "", - "internalType": "contract SystemConfig", - "type": "address" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_value", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_gasLimit", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "_isCreation", - "internalType": "bool", - "type": "bool" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "depositTransaction", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [], - "name": "donateETH", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_tx", - "internalType": "struct Types.WithdrawalTransaction", - "type": "tuple", - "components": [ - { - "name": "nonce", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "sender", - "internalType": "address", - "type": "address" - }, - { - "name": "target", - "internalType": "address", - "type": "address" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "gasLimit", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - } - ] - } - ], - "name": "finalizeWithdrawalTransaction", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "finalizedWithdrawals", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "guardian", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_l2Oracle", - "internalType": "contract L2OutputOracle", - "type": "address" - }, - { - "name": "_guardian", - "internalType": "address", - "type": "address" - }, - { - "name": "_systemConfig", - "internalType": "contract SystemConfig", - "type": "address" - }, - { - "name": "_paused", - "internalType": "bool", - "type": "bool" - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_l2OutputIndex", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "isOutputFinalized", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l2Oracle", - "outputs": [ - { - "name": "", - "internalType": "contract L2OutputOracle", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l2Sender", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "pure", - "type": "function", - "inputs": [ - { - "name": "_byteCount", - "internalType": "uint64", - "type": "uint64" - } - ], - "name": "minimumGasLimit", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "params", - "outputs": [ - { - "name": "prevBaseFee", - "internalType": "uint128", - "type": "uint128" - }, - { - "name": "prevBoughtGas", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "prevBlockNum", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "pause", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "paused", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_tx", - "internalType": "struct Types.WithdrawalTransaction", - "type": "tuple", - "components": [ - { - "name": "nonce", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "sender", - "internalType": "address", - "type": "address" - }, - { - "name": "target", - "internalType": "address", - "type": "address" - }, - { - "name": "value", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "gasLimit", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "name": "_l2OutputIndex", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_outputRootProof", - "internalType": "struct Types.OutputRootProof", - "type": "tuple", - "components": [ - { - "name": "version", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "stateRoot", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "messagePasserStorageRoot", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "latestBlockhash", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "name": "_withdrawalProof", - "internalType": "bytes[]", - "type": "bytes[]" - } - ], - "name": "proveWithdrawalTransaction", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "provenWithdrawals", - "outputs": [ - { - "name": "outputRoot", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "timestamp", - "internalType": "uint128", - "type": "uint128" - }, - { - "name": "l2OutputIndex", - "internalType": "uint128", - "type": "uint128" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "systemConfig", - "outputs": [ - { - "name": "", - "internalType": "contract SystemConfig", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "unpause", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "Optimist": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - }, - { - "name": "_baseURIAttestor", - "internalType": "address", - "type": "address" - }, - { - "name": "_attestationStation", - "internalType": "contract AttestationStation", - "type": "address" - }, - { - "name": "_optimistAllowlist", - "internalType": "contract OptimistAllowlist", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "owner", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "approved", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256", - "indexed": true - } - ], - "name": "Approval" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "owner", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "operator", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "approved", - "internalType": "bool", - "type": "bool", - "indexed": false - } - ], - "name": "ApprovalForAll" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256", - "indexed": true - } - ], - "name": "Transfer" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "ATTESTATION_STATION", - "outputs": [ - { - "name": "", - "internalType": "contract AttestationStation", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "BASE_URI_ATTESTATION_KEY", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "BASE_URI_ATTESTOR", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "OPTIMIST_ALLOWLIST", - "outputs": [ - { - "name": "", - "internalType": "contract OptimistAllowlist", - "type": "address" - } - ] - }, - { - "stateMutability": "pure", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - }, - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "owner", - "internalType": "address", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "baseURI", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "getApproved", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_symbol", - "internalType": "string", - "type": "string" - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "owner", - "internalType": "address", - "type": "address" - }, - { - "name": "operator", - "internalType": "address", - "type": "address" - } - ], - "name": "isApprovedForAll", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_recipient", - "internalType": "address", - "type": "address" - } - ], - "name": "isOnAllowList", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_recipient", - "internalType": "address", - "type": "address" - } - ], - "name": "mint", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "name", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "ownerOf", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address" - }, - { - "name": "to", - "internalType": "address", - "type": "address" - }, - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "safeTransferFrom", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address" - }, - { - "name": "to", - "internalType": "address", - "type": "address" - }, - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "safeTransferFrom", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - }, - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ], - "name": "setApprovalForAll", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "interfaceId", - "internalType": "bytes4", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "symbol", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "pure", - "type": "function", - "inputs": [ - { - "name": "_owner", - "internalType": "address", - "type": "address" - } - ], - "name": "tokenIdOfAddress", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_tokenId", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "tokenURI", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address" - }, - { - "name": "to", - "internalType": "address", - "type": "address" - }, - { - "name": "tokenId", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "OptimistAllowlist": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_attestationStation", - "internalType": "contract AttestationStation", - "type": "address" - }, - { - "name": "_allowlistAttestor", - "internalType": "address", - "type": "address" - }, - { - "name": "_coinbaseQuestAttestor", - "internalType": "address", - "type": "address" - }, - { - "name": "_optimistInviter", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "ALLOWLIST_ATTESTOR", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "ATTESTATION_STATION", - "outputs": [ - { - "name": "", - "internalType": "contract AttestationStation", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "COINBASE_QUEST_ATTESTOR", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "COINBASE_QUEST_ELIGIBLE_ATTESTATION_KEY", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "OPTIMIST_CAN_MINT_ATTESTATION_KEY", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "OPTIMIST_INVITER", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_claimer", - "internalType": "address", - "type": "address" - } - ], - "name": "isAllowedToMint", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "OptimistInviter": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_inviteGranter", - "internalType": "address", - "type": "address" - }, - { - "name": "_attestationStation", - "internalType": "contract AttestationStation", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "issuer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "claimer", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "InviteClaimed" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "ATTESTATION_STATION", - "outputs": [ - { - "name": "", - "internalType": "contract AttestationStation", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "CAN_INVITE_ATTESTATION_KEY", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "CLAIMABLE_INVITE_TYPEHASH", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "EIP712_VERSION", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "INVITE_GRANTER", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MIN_COMMITMENT_PERIOD", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_claimer", - "internalType": "address", - "type": "address" - }, - { - "name": "_claimableInvite", - "internalType": "struct OptimistInviter.ClaimableInvite", - "type": "tuple", - "components": [ - { - "name": "issuer", - "internalType": "address", - "type": "address" - }, - { - "name": "nonce", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "name": "_signature", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "claimInvite", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_commitment", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "commitInvite", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "commitmentTimestamps", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ], - "name": "inviteCounts", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_accounts", - "internalType": "address[]", - "type": "address[]" - }, - { - "name": "_inviteCount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "setInviteCounts", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - }, - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "usedNonces", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "PortalSender": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_portal", - "internalType": "contract OptimismPortal", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "PORTAL", - "outputs": [ - { - "name": "", - "internalType": "contract OptimismPortal", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "donate", - "outputs": [] - } - ], - "ProtocolVersions": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint256", - "type": "uint256", - "indexed": true - }, - { - "name": "updateType", - "internalType": "enum ProtocolVersions.UpdateType", - "type": "uint8", - "indexed": true - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ConfigUpdate" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "previousOwner", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnershipTransferred" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RECOMMENDED_SLOT", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "REQUIRED_SLOT", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_owner", - "internalType": "address", - "type": "address" - }, - { - "name": "_required", - "internalType": "ProtocolVersion", - "type": "uint256" - }, - { - "name": "_recommended", - "internalType": "ProtocolVersion", - "type": "uint256" - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "recommended", - "outputs": [ - { - "name": "out_", - "internalType": "ProtocolVersion", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "renounceOwnership", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "required", - "outputs": [ - { - "name": "out_", - "internalType": "ProtocolVersion", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_recommended", - "internalType": "ProtocolVersion", - "type": "uint256" - } - ], - "name": "setRecommended", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_required", - "internalType": "ProtocolVersion", - "type": "uint256" - } - ], - "name": "setRequired", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "ProxyAdmin": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_owner", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "previousOwner", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnershipTransferred" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "addressManager", - "outputs": [ - { - "name": "", - "internalType": "contract AddressManager", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_proxy", - "internalType": "address payable", - "type": "address" - }, - { - "name": "_newAdmin", - "internalType": "address", - "type": "address" - } - ], - "name": "changeProxyAdmin", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_proxy", - "internalType": "address payable", - "type": "address" - } - ], - "name": "getProxyAdmin", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "_proxy", - "internalType": "address", - "type": "address" - } - ], - "name": "getProxyImplementation", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ], - "name": "implementationName", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "isUpgrading", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ], - "name": "proxyType", - "outputs": [ - { - "name": "", - "internalType": "enum ProxyAdmin.ProxyType", - "type": "uint8" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "renounceOwnership", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_name", - "internalType": "string", - "type": "string" - }, - { - "name": "_address", - "internalType": "address", - "type": "address" - } - ], - "name": "setAddress", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_address", - "internalType": "contract AddressManager", - "type": "address" - } - ], - "name": "setAddressManager", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_address", - "internalType": "address", - "type": "address" - }, - { - "name": "_name", - "internalType": "string", - "type": "string" - } - ], - "name": "setImplementationName", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_address", - "internalType": "address", - "type": "address" - }, - { - "name": "_type", - "internalType": "enum ProxyAdmin.ProxyType", - "type": "uint8" - } - ], - "name": "setProxyType", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_upgrading", - "internalType": "bool", - "type": "bool" - } - ], - "name": "setUpgrading", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_proxy", - "internalType": "address payable", - "type": "address" - }, - { - "name": "_implementation", - "internalType": "address", - "type": "address" - } - ], - "name": "upgrade", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_proxy", - "internalType": "address payable", - "type": "address" - }, - { - "name": "_implementation", - "internalType": "address", - "type": "address" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "upgradeAndCall", - "outputs": [] - } - ], - "SchemaRegistry": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "error", - "inputs": [], - "name": "AlreadyExists" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32", - "indexed": true - }, - { - "name": "registerer", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "Registered" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [ - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "getSchema", - "outputs": [ - { - "name": "", - "internalType": "struct SchemaRecord", - "type": "tuple", - "components": [ - { - "name": "uid", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "resolver", - "internalType": "contract ISchemaResolver", - "type": "address" - }, - { - "name": "revocable", - "internalType": "bool", - "type": "bool" - }, - { - "name": "schema", - "internalType": "string", - "type": "string" - } - ] - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "schema", - "internalType": "string", - "type": "string" - }, - { - "name": "resolver", - "internalType": "contract ISchemaResolver", - "type": "address" - }, - { - "name": "revocable", - "internalType": "bool", - "type": "bool" - } - ], - "name": "register", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "SequencerFeeVault": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_recipient", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "value", - "internalType": "uint256", - "type": "uint256", - "indexed": false - }, - { - "name": "to", - "internalType": "address", - "type": "address", - "indexed": false - }, - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": false - } - ], - "name": "Withdrawal" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "MIN_WITHDRAWAL_AMOUNT", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "RECIPIENT", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l1FeeWallet", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "totalProcessed", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "withdraw", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "SystemConfig": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint256", - "type": "uint256", - "indexed": true - }, - { - "name": "updateType", - "internalType": "enum SystemConfig.UpdateType", - "type": "uint8", - "indexed": true - }, - { - "name": "data", - "internalType": "bytes", - "type": "bytes", - "indexed": false - } - ], - "name": "ConfigUpdate" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "previousOwner", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnershipTransferred" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "BATCH_INBOX_SLOT", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "L1_CROSS_DOMAIN_MESSENGER_SLOT", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "L1_ERC_721_BRIDGE_SLOT", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "L1_STANDARD_BRIDGE_SLOT", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "L2_OUTPUT_ORACLE_SLOT", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "OPTIMISM_PORTAL_SLOT", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "UNSAFE_BLOCK_SIGNER_SLOT", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "batchInbox", - "outputs": [ - { - "name": "addr_", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "batcherHash", - "outputs": [ - { - "name": "", - "internalType": "bytes32", - "type": "bytes32" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "gasLimit", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_owner", - "internalType": "address", - "type": "address" - }, - { - "name": "_overhead", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_scalar", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_batcherHash", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "_gasLimit", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "_unsafeBlockSigner", - "internalType": "address", - "type": "address" - }, - { - "name": "_config", - "internalType": "struct ResourceMetering.ResourceConfig", - "type": "tuple", - "components": [ - { - "name": "maxResourceLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "elasticityMultiplier", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "baseFeeMaxChangeDenominator", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "minimumBaseFee", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "systemTxMaxGas", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "maximumBaseFee", - "internalType": "uint128", - "type": "uint128" - } - ] - }, - { - "name": "_startBlock", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_batchInbox", - "internalType": "address", - "type": "address" - }, - { - "name": "_addresses", - "internalType": "struct SystemConfig.Addresses", - "type": "tuple", - "components": [ - { - "name": "l1CrossDomainMessenger", - "internalType": "address", - "type": "address" - }, - { - "name": "l1ERC721Bridge", - "internalType": "address", - "type": "address" - }, - { - "name": "l1StandardBridge", - "internalType": "address", - "type": "address" - }, - { - "name": "l2OutputOracle", - "internalType": "address", - "type": "address" - }, - { - "name": "optimismPortal", - "internalType": "address", - "type": "address" - }, - { - "name": "optimismMintableERC20Factory", - "internalType": "address", - "type": "address" - } - ] - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l1CrossDomainMessenger", - "outputs": [ - { - "name": "addr_", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l1ERC721Bridge", - "outputs": [ - { - "name": "addr_", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l1StandardBridge", - "outputs": [ - { - "name": "addr_", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l2OutputOracle", - "outputs": [ - { - "name": "addr_", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "minimumGasLimit", - "outputs": [ - { - "name": "", - "internalType": "uint64", - "type": "uint64" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "optimismMintableERC20Factory", - "outputs": [ - { - "name": "addr_", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "optimismPortal", - "outputs": [ - { - "name": "addr_", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "overhead", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "renounceOwnership", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "resourceConfig", - "outputs": [ - { - "name": "", - "internalType": "struct ResourceMetering.ResourceConfig", - "type": "tuple", - "components": [ - { - "name": "maxResourceLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "elasticityMultiplier", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "baseFeeMaxChangeDenominator", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "minimumBaseFee", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "systemTxMaxGas", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "maximumBaseFee", - "internalType": "uint128", - "type": "uint128" - } - ] - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "scalar", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_batcherHash", - "internalType": "bytes32", - "type": "bytes32" - } - ], - "name": "setBatcherHash", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_overhead", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_scalar", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "setGasConfig", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_gasLimit", - "internalType": "uint64", - "type": "uint64" - } - ], - "name": "setGasLimit", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_config", - "internalType": "struct ResourceMetering.ResourceConfig", - "type": "tuple", - "components": [ - { - "name": "maxResourceLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "elasticityMultiplier", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "baseFeeMaxChangeDenominator", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "minimumBaseFee", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "systemTxMaxGas", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "maximumBaseFee", - "internalType": "uint128", - "type": "uint128" - } - ] - } - ], - "name": "setResourceConfig", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_unsafeBlockSigner", - "internalType": "address", - "type": "address" - } - ], - "name": "setUnsafeBlockSigner", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "startBlock", - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "unsafeBlockSigner", - "outputs": [ - { - "name": "addr_", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "version", - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - } - ], - "SystemDictator": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "previousOwner", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnershipTransferred" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "EXIT_1_NO_RETURN_STEP", - "outputs": [ - { - "name": "", - "internalType": "uint8", - "type": "uint8" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "PROXY_TRANSFER_STEP", - "outputs": [ - { - "name": "", - "internalType": "uint8", - "type": "uint8" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "config", - "outputs": [ - { - "name": "globalConfig", - "internalType": "struct SystemDictator.GlobalConfig", - "type": "tuple", - "components": [ - { - "name": "addressManager", - "internalType": "contract AddressManager", - "type": "address" - }, - { - "name": "proxyAdmin", - "internalType": "contract ProxyAdmin", - "type": "address" - }, - { - "name": "controller", - "internalType": "address", - "type": "address" - }, - { - "name": "finalOwner", - "internalType": "address", - "type": "address" - } - ] - }, - { - "name": "proxyAddressConfig", - "internalType": "struct SystemDictator.ProxyAddressConfig", - "type": "tuple", - "components": [ - { - "name": "l2OutputOracleProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "optimismPortalProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1CrossDomainMessengerProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1StandardBridgeProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "optimismMintableERC20FactoryProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1ERC721BridgeProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "systemConfigProxy", - "internalType": "address", - "type": "address" - } - ] - }, - { - "name": "implementationAddressConfig", - "internalType": "struct SystemDictator.ImplementationAddressConfig", - "type": "tuple", - "components": [ - { - "name": "l2OutputOracleImpl", - "internalType": "contract L2OutputOracle", - "type": "address" - }, - { - "name": "optimismPortalImpl", - "internalType": "contract OptimismPortal", - "type": "address" - }, - { - "name": "l1CrossDomainMessengerImpl", - "internalType": "contract L1CrossDomainMessenger", - "type": "address" - }, - { - "name": "l1StandardBridgeImpl", - "internalType": "contract L1StandardBridge", - "type": "address" - }, - { - "name": "optimismMintableERC20FactoryImpl", - "internalType": "contract OptimismMintableERC20Factory", - "type": "address" - }, - { - "name": "l1ERC721BridgeImpl", - "internalType": "contract L1ERC721Bridge", - "type": "address" - }, - { - "name": "portalSenderImpl", - "internalType": "contract PortalSender", - "type": "address" - }, - { - "name": "systemConfigImpl", - "internalType": "contract SystemConfig", - "type": "address" - } - ] - }, - { - "name": "systemConfigConfig", - "internalType": "struct SystemDictator.SystemConfigConfig", - "type": "tuple", - "components": [ - { - "name": "owner", - "internalType": "address", - "type": "address" - }, - { - "name": "overhead", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "scalar", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "batcherHash", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "gasLimit", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "unsafeBlockSigner", - "internalType": "address", - "type": "address" - }, - { - "name": "resourceConfig", - "internalType": "struct ResourceMetering.ResourceConfig", - "type": "tuple", - "components": [ - { - "name": "maxResourceLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "elasticityMultiplier", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "baseFeeMaxChangeDenominator", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "minimumBaseFee", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "systemTxMaxGas", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "maximumBaseFee", - "internalType": "uint128", - "type": "uint128" - } - ] - } - ] - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "currentStep", - "outputs": [ - { - "name": "", - "internalType": "uint8", - "type": "uint8" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "dynamicConfigSet", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "exit1", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "exited", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "finalize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "finalized", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_config", - "internalType": "struct SystemDictator.DeployConfig", - "type": "tuple", - "components": [ - { - "name": "globalConfig", - "internalType": "struct SystemDictator.GlobalConfig", - "type": "tuple", - "components": [ - { - "name": "addressManager", - "internalType": "contract AddressManager", - "type": "address" - }, - { - "name": "proxyAdmin", - "internalType": "contract ProxyAdmin", - "type": "address" - }, - { - "name": "controller", - "internalType": "address", - "type": "address" - }, - { - "name": "finalOwner", - "internalType": "address", - "type": "address" - } - ] - }, - { - "name": "proxyAddressConfig", - "internalType": "struct SystemDictator.ProxyAddressConfig", - "type": "tuple", - "components": [ - { - "name": "l2OutputOracleProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "optimismPortalProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1CrossDomainMessengerProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1StandardBridgeProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "optimismMintableERC20FactoryProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1ERC721BridgeProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "systemConfigProxy", - "internalType": "address", - "type": "address" - } - ] - }, - { - "name": "implementationAddressConfig", - "internalType": "struct SystemDictator.ImplementationAddressConfig", - "type": "tuple", - "components": [ - { - "name": "l2OutputOracleImpl", - "internalType": "contract L2OutputOracle", - "type": "address" - }, - { - "name": "optimismPortalImpl", - "internalType": "contract OptimismPortal", - "type": "address" - }, - { - "name": "l1CrossDomainMessengerImpl", - "internalType": "contract L1CrossDomainMessenger", - "type": "address" - }, - { - "name": "l1StandardBridgeImpl", - "internalType": "contract L1StandardBridge", - "type": "address" - }, - { - "name": "optimismMintableERC20FactoryImpl", - "internalType": "contract OptimismMintableERC20Factory", - "type": "address" - }, - { - "name": "l1ERC721BridgeImpl", - "internalType": "contract L1ERC721Bridge", - "type": "address" - }, - { - "name": "portalSenderImpl", - "internalType": "contract PortalSender", - "type": "address" - }, - { - "name": "systemConfigImpl", - "internalType": "contract SystemConfig", - "type": "address" - } - ] - }, - { - "name": "systemConfigConfig", - "internalType": "struct SystemDictator.SystemConfigConfig", - "type": "tuple", - "components": [ - { - "name": "owner", - "internalType": "address", - "type": "address" - }, - { - "name": "overhead", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "scalar", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "batcherHash", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "gasLimit", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "unsafeBlockSigner", - "internalType": "address", - "type": "address" - }, - { - "name": "resourceConfig", - "internalType": "struct ResourceMetering.ResourceConfig", - "type": "tuple", - "components": [ - { - "name": "maxResourceLimit", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "elasticityMultiplier", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "baseFeeMaxChangeDenominator", - "internalType": "uint8", - "type": "uint8" - }, - { - "name": "minimumBaseFee", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "systemTxMaxGas", - "internalType": "uint32", - "type": "uint32" - }, - { - "name": "maximumBaseFee", - "internalType": "uint128", - "type": "uint128" - } - ] - } - ] - } - ] - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l2OutputOracleDynamicConfig", - "outputs": [ - { - "name": "l2OutputOracleStartingBlockNumber", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "l2OutputOracleStartingTimestamp", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "oldL1CrossDomainMessenger", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "optimismPortalDynamicConfig", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "phase1", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "phase2", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "renounceOwnership", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "step1", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "step2", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "step3", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "step4", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "step5", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_l2OutputOracleDynamicConfig", - "internalType": "struct SystemDictator.L2OutputOracleDynamicConfig", - "type": "tuple", - "components": [ - { - "name": "l2OutputOracleStartingBlockNumber", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "l2OutputOracleStartingTimestamp", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "name": "_optimismPortalDynamicConfig", - "internalType": "bool", - "type": "bool" - } - ], - "name": "updateDynamicConfig", - "outputs": [] - } - ], - "SystemDictator_goerli": [ - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "version", - "internalType": "uint8", - "type": "uint8", - "indexed": false - } - ], - "name": "Initialized" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "previousOwner", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnershipTransferred" - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "EXIT_1_NO_RETURN_STEP", - "outputs": [ - { - "name": "", - "internalType": "uint8", - "type": "uint8" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "PROXY_TRANSFER_STEP", - "outputs": [ - { - "name": "", - "internalType": "uint8", - "type": "uint8" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "config", - "outputs": [ - { - "name": "globalConfig", - "internalType": "struct SystemDictator.GlobalConfig", - "type": "tuple", - "components": [ - { - "name": "addressManager", - "internalType": "contract AddressManager", - "type": "address" - }, - { - "name": "proxyAdmin", - "internalType": "contract ProxyAdmin", - "type": "address" - }, - { - "name": "controller", - "internalType": "address", - "type": "address" - }, - { - "name": "finalOwner", - "internalType": "address", - "type": "address" - } - ] - }, - { - "name": "proxyAddressConfig", - "internalType": "struct SystemDictator.ProxyAddressConfig", - "type": "tuple", - "components": [ - { - "name": "l2OutputOracleProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "optimismPortalProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1CrossDomainMessengerProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1StandardBridgeProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "optimismMintableERC20FactoryProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1ERC721BridgeProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "systemConfigProxy", - "internalType": "address", - "type": "address" - } - ] - }, - { - "name": "implementationAddressConfig", - "internalType": "struct SystemDictator.ImplementationAddressConfig", - "type": "tuple", - "components": [ - { - "name": "l2OutputOracleImpl", - "internalType": "contract L2OutputOracle", - "type": "address" - }, - { - "name": "optimismPortalImpl", - "internalType": "contract OptimismPortal", - "type": "address" - }, - { - "name": "l1CrossDomainMessengerImpl", - "internalType": "contract L1CrossDomainMessenger", - "type": "address" - }, - { - "name": "l1StandardBridgeImpl", - "internalType": "contract L1StandardBridge", - "type": "address" - }, - { - "name": "optimismMintableERC20FactoryImpl", - "internalType": "contract OptimismMintableERC20Factory", - "type": "address" - }, - { - "name": "l1ERC721BridgeImpl", - "internalType": "contract L1ERC721Bridge", - "type": "address" - }, - { - "name": "portalSenderImpl", - "internalType": "contract PortalSender", - "type": "address" - }, - { - "name": "systemConfigImpl", - "internalType": "contract SystemConfig", - "type": "address" - } - ] - }, - { - "name": "systemConfigConfig", - "internalType": "struct SystemDictator.SystemConfigConfig", - "type": "tuple", - "components": [ - { - "name": "owner", - "internalType": "address", - "type": "address" - }, - { - "name": "overhead", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "scalar", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "batcherHash", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "gasLimit", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "unsafeBlockSigner", - "internalType": "address", - "type": "address" - } - ] - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "currentStep", - "outputs": [ - { - "name": "", - "internalType": "uint8", - "type": "uint8" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "dynamicConfigSet", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "exit1", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "finalize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "finalized", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_config", - "internalType": "struct SystemDictator.DeployConfig", - "type": "tuple", - "components": [ - { - "name": "globalConfig", - "internalType": "struct SystemDictator.GlobalConfig", - "type": "tuple", - "components": [ - { - "name": "addressManager", - "internalType": "contract AddressManager", - "type": "address" - }, - { - "name": "proxyAdmin", - "internalType": "contract ProxyAdmin", - "type": "address" - }, - { - "name": "controller", - "internalType": "address", - "type": "address" - }, - { - "name": "finalOwner", - "internalType": "address", - "type": "address" - } - ] - }, - { - "name": "proxyAddressConfig", - "internalType": "struct SystemDictator.ProxyAddressConfig", - "type": "tuple", - "components": [ - { - "name": "l2OutputOracleProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "optimismPortalProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1CrossDomainMessengerProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1StandardBridgeProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "optimismMintableERC20FactoryProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "l1ERC721BridgeProxy", - "internalType": "address", - "type": "address" - }, - { - "name": "systemConfigProxy", - "internalType": "address", - "type": "address" - } - ] - }, - { - "name": "implementationAddressConfig", - "internalType": "struct SystemDictator.ImplementationAddressConfig", - "type": "tuple", - "components": [ - { - "name": "l2OutputOracleImpl", - "internalType": "contract L2OutputOracle", - "type": "address" - }, - { - "name": "optimismPortalImpl", - "internalType": "contract OptimismPortal", - "type": "address" - }, - { - "name": "l1CrossDomainMessengerImpl", - "internalType": "contract L1CrossDomainMessenger", - "type": "address" - }, - { - "name": "l1StandardBridgeImpl", - "internalType": "contract L1StandardBridge", - "type": "address" - }, - { - "name": "optimismMintableERC20FactoryImpl", - "internalType": "contract OptimismMintableERC20Factory", - "type": "address" - }, - { - "name": "l1ERC721BridgeImpl", - "internalType": "contract L1ERC721Bridge", - "type": "address" - }, - { - "name": "portalSenderImpl", - "internalType": "contract PortalSender", - "type": "address" - }, - { - "name": "systemConfigImpl", - "internalType": "contract SystemConfig", - "type": "address" - } - ] - }, - { - "name": "systemConfigConfig", - "internalType": "struct SystemDictator.SystemConfigConfig", - "type": "tuple", - "components": [ - { - "name": "owner", - "internalType": "address", - "type": "address" - }, - { - "name": "overhead", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "scalar", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "batcherHash", - "internalType": "bytes32", - "type": "bytes32" - }, - { - "name": "gasLimit", - "internalType": "uint64", - "type": "uint64" - }, - { - "name": "unsafeBlockSigner", - "internalType": "address", - "type": "address" - } - ] - } - ] - } - ], - "name": "initialize", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "l2OutputOracleDynamicConfig", - "outputs": [ - { - "name": "l2OutputOracleStartingBlockNumber", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "l2OutputOracleStartingTimestamp", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "oldL1CrossDomainMessenger", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "renounceOwnership", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "step1", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "step2", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "step3", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "step4", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "step5", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "step6", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_l2OutputOracleDynamicConfig", - "internalType": "struct SystemDictator.L2OutputOracleDynamicConfig", - "type": "tuple", - "components": [ - { - "name": "l2OutputOracleStartingBlockNumber", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "l2OutputOracleStartingTimestamp", - "internalType": "uint256", - "type": "uint256" - } - ] - } - ], - "name": "updateL2OutputOracleDynamicConfig", - "outputs": [] - } - ], - "TeleportrWithdrawer": [ - { - "stateMutability": "nonpayable", - "type": "constructor", - "inputs": [ - { - "name": "_owner", - "internalType": "address", - "type": "address" - } - ] - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "user", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "newOwner", - "internalType": "address", - "type": "address", - "indexed": true - } - ], - "name": "OwnerUpdated" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "from", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "ReceivedETH" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "asset", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewERC20" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "asset", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "id", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewERC721" - }, - { - "type": "event", - "anonymous": false, - "inputs": [ - { - "name": "withdrawer", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "recipient", - "internalType": "address", - "type": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256", - "indexed": false - } - ], - "name": "WithdrewETH" - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_gas", - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "_value", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "CALL", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - }, - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "payable", - "type": "function", - "inputs": [ - { - "name": "_target", - "internalType": "address", - "type": "address" - }, - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - }, - { - "name": "_gas", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "DELEGATECALL", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - }, - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "data", - "outputs": [ - { - "name": "", - "internalType": "bytes", - "type": "bytes" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "recipient", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_data", - "internalType": "bytes", - "type": "bytes" - } - ], - "name": "setData", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "newOwner", - "internalType": "address", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_recipient", - "internalType": "address", - "type": "address" - } - ], - "name": "setRecipient", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_teleportr", - "internalType": "address", - "type": "address" - } - ], - "name": "setTeleportr", - "outputs": [] - }, - { - "stateMutability": "view", - "type": "function", - "inputs": [], - "name": "teleportr", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC20", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC20", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - } - ], - "name": "withdrawERC20", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_asset", - "internalType": "contract ERC721", - "type": "address" - }, - { - "name": "_to", - "internalType": "address", - "type": "address" - }, - { - "name": "_id", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawERC721", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address payable", - "type": "address" - }, - { - "name": "_amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "withdrawETH", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "_to", - "internalType": "address payable", - "type": "address" - } - ], - "name": "withdrawETH", - "outputs": [] - }, - { - "stateMutability": "nonpayable", - "type": "function", - "inputs": [], - "name": "withdrawFromTeleportr", - "outputs": [] - }, - { - "stateMutability": "payable", - "type": "receive" - } - ] -} diff --git a/packages/contracts-ts/addresses.json b/packages/contracts-ts/addresses.json deleted file mode 100644 index a236783794ab..000000000000 --- a/packages/contracts-ts/addresses.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "AddressManager": { - "1": "0xdE1FCfB0851916CA5101820A69b13a4E276bd81F", - "5": "0xa6f73589243a6A7a9023b1Fa0651b1d89c177111" - }, - "AssetReceiver": { - "1": "0x15DdA60616Ffca20371ED1659dBB78E888f65556", - "10": "0x15DdA60616Ffca20371ED1659dBB78E888f65556" - }, - "AttestationStation": { - "10": "0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77", - "420": "0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77" - }, - "BaseFeeVault": { - "420": "0x4200000000000000000000000000000000000019" - }, - "CheckBalanceHigh": { - "1": "0x7eC64a8a591bFf829ff6C8be76074D540ACb813F", - "5": "0x7eC64a8a591bFf829ff6C8be76074D540ACb813F", - "420": "0x5d7103853f12109A7d27F118e54BbC654ad847E9" - }, - "CheckBalanceLow": { - "1": "0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640", - "5": "0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640", - "420": "0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474" - }, - "CheckGelatoLow": { - "1": "0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa", - "5": "0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa", - "420": "0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862" - }, - "CheckTrue": { - "1": "0x5c741a38cb11424711231777D71689C458eE835D", - "5": "0x5c741a38cb11424711231777D71689C458eE835D", - "420": "0x47443D0C184e022F19BD1578F5bca6B8a9F58E32" - }, - "Drippie": { - "1": "0x44b3A2a040057eBafC601A78647e805fd58B1f50" - }, - "Drippie_goerli": { - "5": "0x44b3A2a040057eBafC601A78647e805fd58B1f50" - }, - "Drippie_optimism-goerli": { - "420": "0x8D8d533C16D23847EB04EEB0925be8900Dd3af86" - }, - "EAS": { - "10": "0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088", - "420": "0x5A633F1cc84B03F7588486CF2F386c102061E6e1" - }, - "GasPriceOracle": { - "420": "0x420000000000000000000000000000000000000F" - }, - "L1Block": { - "420": "0x4200000000000000000000000000000000000015" - }, - "L1CrossDomainMessenger": { - "1": "0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1", - "5": "0x5086d1eEF304eb5284A0f6720f79403b4e9bE294" - }, - "L1ERC721Bridge": { - "1": "0x5a7749f83b81B301cAb5f48EB8516B986DAef23D", - "5": "0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9" - }, - "L1FeeVault": { - "420": "0x420000000000000000000000000000000000001a" - }, - "L1StandardBridge": { - "1": "0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1", - "5": "0x636Af16bf2f682dD3109e60102b8E1A089FedAa8" - }, - "L2CrossDomainMessenger": { - "420": "0x4200000000000000000000000000000000000007" - }, - "L2ERC721Bridge": { - "10": "0x4200000000000000000000000000000000000014" - }, - "L2ERC721Bridge_optimism-goerli": { - "420": "0x4200000000000000000000000000000000000014" - }, - "L2OutputOracle": { - "1": "0xdfe97868233d1aa22e815a266982f2cf17685a27", - "5": "0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0" - }, - "L2StandardBridge": { - "420": "0x4200000000000000000000000000000000000010" - }, - "L2ToL1MessagePasser": { - "420": "0x4200000000000000000000000000000000000016" - }, - "MintManager": { - "10": "0x5C4e7Ba1E219E47948e6e3F55019A647bA501005", - "420": "0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76" - }, - "OptimismMintableERC20Factory": { - "1": "0x4200000000000000000000000000000000000012" - }, - "OptimismMintableERC20Factory_goerli": { - "5": "0x4200000000000000000000000000000000000012" - }, - "OptimismMintableERC20Factory_optimism-goerli": { - "420": "0x4200000000000000000000000000000000000012" - }, - "OptimismMintableERC721Factory": { - "10": "0x4200000000000000000000000000000000000017" - }, - "OptimismMintableERC721Factory_optimism-goerli": { - "420": "0x4200000000000000000000000000000000000017" - }, - "OptimismPortal": { - "1": "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed", - "5": "0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383" - }, - "Optimist": { - "10": "0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5", - "420": "0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5" - }, - "OptimistAllowlist": { - "10": "0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180", - "420": "0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180" - }, - "OptimistInviter": { - "10": "0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929", - "420": "0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929" - }, - "PortalSender": { - "1": "0x0A893d9576b9cFD9EF78595963dc973238E78210", - "5": "0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4" - }, - "ProtocolVersions": { - "5": "0x0C24F5098774aA366827D667494e9F889f7cFc08" - }, - "ProxyAdmin": { - "1": "0x4200000000000000000000000000000000000018", - "5": "0x4200000000000000000000000000000000000018" - }, - "SchemaRegistry": { - "10": "0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13", - "420": "0x2545fa928d5d278cA75Fd47306e4a89096ff6403" - }, - "SequencerFeeVault": { - "420": "0x4200000000000000000000000000000000000011" - }, - "SystemConfig": { - "1": "0x229047fed2591dbec1eF1118d64F7aF3dB9EB290", - "5": "0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60" - }, - "SystemDictator": { - "1": "0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB" - }, - "SystemDictator_goerli": { - "5": "0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971" - }, - "TeleportrWithdrawer": { - "1": "0x78A25524D90E3D0596558fb43789bD800a5c3007" - } -} diff --git a/packages/contracts-ts/example.env b/packages/contracts-ts/example.env deleted file mode 100644 index cc58d719b78d..000000000000 --- a/packages/contracts-ts/example.env +++ /dev/null @@ -1,5 +0,0 @@ -VITE_RPC_URL_L2_GOERLI= -VITE_RPC_URL_L2_MAINNET= -VITE_RPC_URL_L1_GOERLI= -VITE_RPC_URL_L1_MAINNET= - diff --git a/packages/contracts-ts/package.json b/packages/contracts-ts/package.json deleted file mode 100644 index be4ff5e6229d..000000000000 --- a/packages/contracts-ts/package.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "@eth-optimism/contracts-ts", - "version": "0.17.0", - "description": "TypeScript interface for Contracts Bedrock", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/ethereum-optimism/optimism.git", - "directory": "packages/contracts-ts" - }, - "homepage": "https://optimism.io", - "type": "module", - "main": "dist/constants.cjs", - "module": "dist/constants.js", - "types": "src/constants.ts", - "exports": { - ".": { - "types": "./src/constants.ts", - "import": "./dist/constants.js", - "require": "./dist/constants.cjs" - }, - "./actions": { - "types": "./src/actions.ts", - "import": "./dist/actions.js", - "require": "./dist/actions.cjs" - }, - "./react": { - "types": "./src/react.ts", - "import": "./dist/react.js", - "require": "./dist/react.cjs" - } - }, - "files": [ - "dist/", - "src/" - ], - "scripts": { - "build": "tsup", - "clean": "rm -rf ./dist", - "generate": "wagmi generate && pnpm build && pnpm lint:fix", - "generate:check": "pnpm generate && git diff --exit-code ./addresses.json && git diff --exit-code ./abis.json", - "lint": "prettier --check .", - "lint:fix": "prettier --write .", - "test": "vitest", - "test:coverage": "vitest run --coverage", - "typecheck": "tsc --noEmit" - }, - "devDependencies": { - "@eth-optimism/contracts-bedrock": "workspace:*", - "@testing-library/jest-dom": "^6.4.2", - "@testing-library/react-hooks": "^8.0.1", - "@types/glob": "^8.1.0", - "@vitest/coverage-istanbul": "^1.2.2", - "@wagmi/cli": "^2.1.2", - "@wagmi/core": "^2.6.3", - "abitype": "^1.0.0", - "glob": "^10.3.10", - "isomorphic-fetch": "^3.0.0", - "jest-dom": "link:@types/@testing-library/jest-dom", - "jsdom": "^24.0.0", - "tsup": "^8.0.1", - "typescript": "^5.3.3", - "vite": "^5.1.5", - "wagmi": "^2.5.5", - "vitest": "^1.2.2" - }, - "peerDependencies": { - "@wagmi/core": "^2.6.3", - "wagmi": "^2.5.5" - }, - "peerDependenciesMeta": { - "wagmi": { - "optional": true - }, - "@wagmi/core": { - "optional": true - } - }, - "dependencies": { - "@testing-library/react": "^14.2.1", - "@types/change-case": "^2.3.1", - "change-case": "4.1.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "viem": "^2.7.19" - } -} diff --git a/packages/contracts-ts/setupVitest.ts b/packages/contracts-ts/setupVitest.ts deleted file mode 100644 index 0a879e628c88..000000000000 --- a/packages/contracts-ts/setupVitest.ts +++ /dev/null @@ -1,4 +0,0 @@ -import fetch from 'isomorphic-fetch' - -// viem needs this -global.fetch = fetch diff --git a/packages/contracts-ts/src/actions.ts b/packages/contracts-ts/src/actions.ts deleted file mode 100644 index b277991d6c3e..000000000000 --- a/packages/contracts-ts/src/actions.ts +++ /dev/null @@ -1,9818 +0,0 @@ -import { getContract, GetContractArgs } from 'wagmi/actions' - -/* eslint-disable */ - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// AddressManager -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export const addressManagerABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { name: '_name', internalType: 'string', type: 'string', indexed: true }, - { - name: '_newAddress', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: '_oldAddress', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'AddressSet', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'getAddress', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_address', internalType: 'address', type: 'address' }, - ], - name: 'setAddress', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export const addressManagerAddress = { - 1: '0xdE1FCfB0851916CA5101820A69b13a4E276bd81F', - 5: '0xa6f73589243a6A7a9023b1Fa0651b1d89c177111', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export const addressManagerConfig = { - address: addressManagerAddress, - abi: addressManagerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// AssetReceiver -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export const assetReceiverABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export const assetReceiverAddress = { - 1: '0x15DdA60616Ffca20371ED1659dBB78E888f65556', - 10: '0x15DdA60616Ffca20371ED1659dBB78E888f65556', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export const assetReceiverConfig = { - address: assetReceiverAddress, - abi: assetReceiverABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// AttestationStation -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export const attestationStationABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'creator', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'about', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'key', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { name: 'val', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'AttestationCreated', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_attestations', - internalType: 'struct AttestationStation.AttestationData[]', - type: 'tuple[]', - components: [ - { name: 'about', internalType: 'address', type: 'address' }, - { name: 'key', internalType: 'bytes32', type: 'bytes32' }, - { name: 'val', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - name: 'attest', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_about', internalType: 'address', type: 'address' }, - { name: '_key', internalType: 'bytes32', type: 'bytes32' }, - { name: '_val', internalType: 'bytes', type: 'bytes' }, - ], - name: 'attest', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'attestations', - outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export const attestationStationAddress = { - 10: '0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77', - 420: '0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export const attestationStationConfig = { - address: attestationStationAddress, - abi: attestationStationABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// BaseFeeVault -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export const baseFeeVaultABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export const baseFeeVaultAddress = { - 420: '0x4200000000000000000000000000000000000019', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export const baseFeeVaultConfig = { - address: baseFeeVaultAddress, - abi: baseFeeVaultABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckBalanceHigh -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export const checkBalanceHighABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckBalanceHigh.Params', - type: 'tuple', - components: [ - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export const checkBalanceHighAddress = { - 1: '0x7eC64a8a591bFf829ff6C8be76074D540ACb813F', - 5: '0x7eC64a8a591bFf829ff6C8be76074D540ACb813F', - 420: '0x5d7103853f12109A7d27F118e54BbC654ad847E9', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export const checkBalanceHighConfig = { - address: checkBalanceHighAddress, - abi: checkBalanceHighABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckBalanceLow -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export const checkBalanceLowABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckBalanceLow.Params', - type: 'tuple', - components: [ - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export const checkBalanceLowAddress = { - 1: '0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640', - 5: '0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640', - 420: '0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export const checkBalanceLowConfig = { - address: checkBalanceLowAddress, - abi: checkBalanceLowABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckGelatoLow -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export const checkGelatoLowABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckGelatoLow.Params', - type: 'tuple', - components: [ - { name: 'treasury', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - { name: 'recipient', internalType: 'address', type: 'address' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export const checkGelatoLowAddress = { - 1: '0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa', - 5: '0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa', - 420: '0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export const checkGelatoLowConfig = { - address: checkGelatoLowAddress, - abi: checkGelatoLowABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckTrue -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x47443D0C184e022F19BD1578F5bca6B8a9F58E32) - */ -export const checkTrueABI = [ - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x47443D0C184e022F19BD1578F5bca6B8a9F58E32) - */ -export const checkTrueAddress = { - 1: '0x5c741a38cb11424711231777D71689C458eE835D', - 5: '0x5c741a38cb11424711231777D71689C458eE835D', - 420: '0x47443D0C184e022F19BD1578F5bca6B8a9F58E32', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x47443D0C184e022F19BD1578F5bca6B8a9F58E32) - */ -export const checkTrueConfig = { - address: checkTrueAddress, - abi: checkTrueABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Drippie -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieAddress = { - 1: '0x44b3A2a040057eBafC601A78647e805fd58B1f50', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieConfig = { - address: drippieAddress, - abi: drippieABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Drippie_goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieGoerliAddress = { - 5: '0x44b3A2a040057eBafC601A78647e805fd58B1f50', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieGoerliConfig = { - address: drippieGoerliAddress, - abi: drippieGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Drippie_optimism-goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export const drippieOptimismGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export const drippieOptimismGoerliAddress = { - 420: '0x8D8d533C16D23847EB04EEB0925be8900Dd3af86', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export const drippieOptimismGoerliConfig = { - address: drippieOptimismGoerliAddress, - abi: drippieOptimismGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// EAS -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export const easABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { type: 'error', inputs: [], name: 'AccessDenied' }, - { type: 'error', inputs: [], name: 'AlreadyRevoked' }, - { type: 'error', inputs: [], name: 'AlreadyRevokedOffchain' }, - { type: 'error', inputs: [], name: 'AlreadyTimestamped' }, - { type: 'error', inputs: [], name: 'InsufficientValue' }, - { type: 'error', inputs: [], name: 'InvalidAttestation' }, - { type: 'error', inputs: [], name: 'InvalidAttestations' }, - { type: 'error', inputs: [], name: 'InvalidExpirationTime' }, - { type: 'error', inputs: [], name: 'InvalidLength' }, - { type: 'error', inputs: [], name: 'InvalidOffset' }, - { type: 'error', inputs: [], name: 'InvalidRegistry' }, - { type: 'error', inputs: [], name: 'InvalidRevocation' }, - { type: 'error', inputs: [], name: 'InvalidRevocations' }, - { type: 'error', inputs: [], name: 'InvalidSchema' }, - { type: 'error', inputs: [], name: 'InvalidSignature' }, - { type: 'error', inputs: [], name: 'InvalidVerifier' }, - { type: 'error', inputs: [], name: 'Irrevocable' }, - { type: 'error', inputs: [], name: 'NotFound' }, - { type: 'error', inputs: [], name: 'NotPayable' }, - { type: 'error', inputs: [], name: 'WrongSchema' }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'attester', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'uid', internalType: 'bytes32', type: 'bytes32', indexed: false }, - { - name: 'schema', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'Attested', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'attester', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'uid', internalType: 'bytes32', type: 'bytes32', indexed: false }, - { - name: 'schema', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'Revoked', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'revoker', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'data', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { - name: 'timestamp', - internalType: 'uint64', - type: 'uint64', - indexed: true, - }, - ], - name: 'RevokedOffchain', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'data', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { - name: 'timestamp', - internalType: 'uint64', - type: 'uint64', - indexed: true, - }, - ], - name: 'Timestamped', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'request', - internalType: 'struct AttestationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData', - type: 'tuple', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'attest', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'delegatedRequest', - internalType: 'struct DelegatedAttestationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData', - type: 'tuple', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signature', - internalType: 'struct EIP712Signature', - type: 'tuple', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'attester', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'attestByDelegation', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getAttestTypeHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'getAttestation', - outputs: [ - { - name: '', - internalType: 'struct Attestation', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { name: 'time', internalType: 'uint64', type: 'uint64' }, - { name: 'expirationTime', internalType: 'uint64', type: 'uint64' }, - { name: 'revocationTime', internalType: 'uint64', type: 'uint64' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'recipient', internalType: 'address', type: 'address' }, - { name: 'attester', internalType: 'address', type: 'address' }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'getDomainSeparator', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'getName', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'account', internalType: 'address', type: 'address' }], - name: 'getNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: 'revoker', internalType: 'address', type: 'address' }, - { name: 'data', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'getRevokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getRevokeTypeHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getSchemaRegistry', - outputs: [ - { name: '', internalType: 'contract ISchemaRegistry', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'getTimestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'isAttestationValid', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiRequests', - internalType: 'struct MultiAttestationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'multiAttest', - outputs: [{ name: '', internalType: 'bytes32[]', type: 'bytes32[]' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiDelegatedRequests', - internalType: 'struct MultiDelegatedAttestationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signatures', - internalType: 'struct EIP712Signature[]', - type: 'tuple[]', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'attester', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'multiAttestByDelegation', - outputs: [{ name: '', internalType: 'bytes32[]', type: 'bytes32[]' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiRequests', - internalType: 'struct MultiRevocationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'multiRevoke', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiDelegatedRequests', - internalType: 'struct MultiDelegatedRevocationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signatures', - internalType: 'struct EIP712Signature[]', - type: 'tuple[]', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'revoker', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'multiRevokeByDelegation', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32[]', type: 'bytes32[]' }], - name: 'multiRevokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32[]', type: 'bytes32[]' }], - name: 'multiTimestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'request', - internalType: 'struct RevocationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'revoke', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'delegatedRequest', - internalType: 'struct DelegatedRevocationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signature', - internalType: 'struct EIP712Signature', - type: 'tuple', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'revoker', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'revokeByDelegation', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'revokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'timestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export const easAddress = { - 10: '0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088', - 420: '0x5A633F1cc84B03F7588486CF2F386c102061E6e1', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export const easConfig = { address: easAddress, abi: easABI } as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// GasPriceOracle -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000000F) - */ -export const gasPriceOracleABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'baseFee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'decimals', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'gasPrice', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'getL1Fee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'getL1GasUsed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1BaseFee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'overhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'scalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000000F) - */ -export const gasPriceOracleAddress = { - 420: '0x420000000000000000000000000000000000000F', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000000F) - */ -export const gasPriceOracleConfig = { - address: gasPriceOracleAddress, - abi: gasPriceOracleABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1Block -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export const l1BlockABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'DEPOSITOR_ACCOUNT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'basefee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batcherHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'hash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeOverhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeScalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'number', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'sequenceNumber', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_number', internalType: 'uint64', type: 'uint64' }, - { name: '_timestamp', internalType: 'uint64', type: 'uint64' }, - { name: '_basefee', internalType: 'uint256', type: 'uint256' }, - { name: '_hash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_sequenceNumber', internalType: 'uint64', type: 'uint64' }, - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l1FeeOverhead', internalType: 'uint256', type: 'uint256' }, - { name: '_l1FeeScalar', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setL1BlockValues', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'timestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export const l1BlockAddress = { - 420: '0x4200000000000000000000000000000000000015', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export const l1BlockConfig = { - address: l1BlockAddress, - abi: l1BlockABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1CrossDomainMessenger -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export const l1CrossDomainMessengerABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'FailedRelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'RelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: false, - }, - { name: 'message', internalType: 'bytes', type: 'bytes', indexed: false }, - { - name: 'messageNonce', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessageExtension1', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_CALLDATA_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_MESSENGER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CALL_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CONSTANT_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_GAS_CHECK_BUFFER', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_RESERVED_GAS', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'baseGas', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'failedMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_portal', - internalType: 'contract OptimismPortal', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'portal', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_nonce', internalType: 'uint256', type: 'uint256' }, - { name: '_sender', internalType: 'address', type: 'address' }, - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - ], - name: 'relayMessage', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'sendMessage', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'successfulMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'xDomainMessageSender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export const l1CrossDomainMessengerAddress = { - 1: '0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1', - 5: '0x5086d1eEF304eb5284A0f6720f79403b4e9bE294', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export const l1CrossDomainMessengerConfig = { - address: l1CrossDomainMessengerAddress, - abi: l1CrossDomainMessengerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1ERC721Bridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export const l1Erc721BridgeABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721To', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'uint256', type: 'uint256' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_messenger', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export const l1Erc721BridgeAddress = { - 1: '0x5a7749f83b81B301cAb5f48EB8516B986DAef23D', - 5: '0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export const l1Erc721BridgeConfig = { - address: l1Erc721BridgeAddress, - abi: l1Erc721BridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1FeeVault -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export const l1FeeVaultABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export const l1FeeVaultAddress = { - 420: '0x420000000000000000000000000000000000001A', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export const l1FeeVaultConfig = { - address: l1FeeVaultAddress, - abi: l1FeeVaultABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1StandardBridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export const l1StandardBridgeABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20DepositInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20WithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHDepositInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHWithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETHTo', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositETHTo', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC20', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeERC20Withdrawal', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeETHWithdrawal', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_messenger', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2TokenBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [ - { name: '', internalType: 'contract StandardBridge', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export const l1StandardBridgeAddress = { - 1: '0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1', - 5: '0x636Af16bf2f682dD3109e60102b8E1A089FedAa8', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export const l1StandardBridgeConfig = { - address: l1StandardBridgeAddress, - abi: l1StandardBridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2CrossDomainMessenger -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export const l2CrossDomainMessengerABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_l1CrossDomainMessenger', - internalType: 'address', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'FailedRelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'RelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: false, - }, - { name: 'message', internalType: 'bytes', type: 'bytes', indexed: false }, - { - name: 'messageNonce', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessageExtension1', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_CALLDATA_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_MESSENGER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CALL_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CONSTANT_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_GAS_CHECK_BUFFER', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_RESERVED_GAS', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'baseGas', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'failedMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_nonce', internalType: 'uint256', type: 'uint256' }, - { name: '_sender', internalType: 'address', type: 'address' }, - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - ], - name: 'relayMessage', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'sendMessage', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'successfulMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'xDomainMessageSender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export const l2CrossDomainMessengerAddress = { - 420: '0x4200000000000000000000000000000000000007', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export const l2CrossDomainMessengerConfig = { - address: l2CrossDomainMessengerAddress, - abi: l2CrossDomainMessengerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2ERC721Bridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_messenger', internalType: 'address', type: 'address' }, - { name: '_otherBridge', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeInitiated', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721To', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC721', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeAddress = { - 10: '0x4200000000000000000000000000000000000014', - 420: '0x4200000000000000000000000000000000000014', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeConfig = { - address: l2Erc721BridgeAddress, - abi: l2Erc721BridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2OutputOracle -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export const l2OutputOracleABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_submissionInterval', internalType: 'uint256', type: 'uint256' }, - { name: '_l2BlockTime', internalType: 'uint256', type: 'uint256' }, - { - name: '_finalizationPeriodSeconds', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'outputRoot', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { - name: 'l2OutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'l2BlockNumber', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'l1Timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'OutputProposed', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'prevNextOutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'newNextOutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'OutputsDeleted', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'challenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'computeL2Timestamp', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'deleteL2Outputs', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalizationPeriodSeconds', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2Output', - outputs: [ - { - name: '', - internalType: 'struct Types.OutputProposal', - type: 'tuple', - components: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2BlockNumber', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2OutputAfter', - outputs: [ - { - name: '', - internalType: 'struct Types.OutputProposal', - type: 'tuple', - components: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2BlockNumber', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2OutputIndexAfter', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_startingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { name: '_startingTimestamp', internalType: 'uint256', type: 'uint256' }, - { name: '_proposer', internalType: 'address', type: 'address' }, - { name: '_challenger', internalType: 'address', type: 'address' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2BlockTime', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'latestBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'latestOutputIndex', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'nextBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'nextOutputIndex', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - { name: '_l1BlockHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l1BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'proposeL2Output', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'proposer', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startingBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startingTimestamp', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'submissionInterval', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export const l2OutputOracleAddress = { - 1: '0xdfe97868233d1aa22e815a266982f2cf17685a27', - 5: '0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export const l2OutputOracleConfig = { - address: l2OutputOracleAddress, - abi: l2OutputOracleABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2StandardBridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export const l2StandardBridgeABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_otherBridge', - internalType: 'address payable', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'DepositFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'WithdrawalInitiated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_BRIDGE', - outputs: [ - { name: '', internalType: 'contract StandardBridge', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETHTo', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC20', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeDeposit', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1TokenBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'withdraw', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'withdrawTo', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export const l2StandardBridgeAddress = { - 420: '0x4200000000000000000000000000000000000010', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export const l2StandardBridgeConfig = { - address: l2StandardBridgeAddress, - abi: l2StandardBridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2ToL1MessagePasser -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export const l2ToL1MessagePasserABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nonce', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: false, - }, - ], - name: 'MessagePassed', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'WithdrawerBalanceBurnt', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'burn', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'initiateWithdrawal', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'sentMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export const l2ToL1MessagePasserAddress = { - 420: '0x4200000000000000000000000000000000000016', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export const l2ToL1MessagePasserConfig = { - address: l2ToL1MessagePasserAddress, - abi: l2ToL1MessagePasserABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// MintManager -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export const mintManagerABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_upgrader', internalType: 'address', type: 'address' }, - { name: '_governanceToken', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'DENOMINATOR', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MINT_CAP', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MINT_PERIOD', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'governanceToken', - outputs: [ - { name: '', internalType: 'contract GovernanceToken', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_account', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'mint', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'mintPermittedAfter', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_newMintManager', internalType: 'address', type: 'address' }, - ], - name: 'upgrade', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export const mintManagerAddress = { - 10: '0x5C4e7Ba1E219E47948e6e3F55019A647bA501005', - 420: '0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export const mintManagerConfig = { - address: mintManagerAddress, - abi: mintManagerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC20Factory -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_decimals', internalType: 'uint8', type: 'uint8' }, - ], - name: 'createOptimismMintableERC20WithDecimals', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryAddress = { - 1: '0x4200000000000000000000000000000000000012', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryConfig = { - address: optimismMintableErc20FactoryAddress, - abi: optimismMintableErc20FactoryABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC20Factory_goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryGoerliABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_decimals', internalType: 'uint8', type: 'uint8' }, - ], - name: 'createOptimismMintableERC20WithDecimals', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryGoerliAddress = { - 5: '0x4200000000000000000000000000000000000012', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryGoerliConfig = { - address: optimismMintableErc20FactoryGoerliAddress, - abi: optimismMintableErc20FactoryGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC20Factory_optimism-goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryOptimismGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryOptimismGoerliAddress = { - 420: '0x4200000000000000000000000000000000000012', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryOptimismGoerliConfig = { - address: optimismMintableErc20FactoryOptimismGoerliAddress, - abi: optimismMintableErc20FactoryOptimismGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC721Factory -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_bridge', internalType: 'address', type: 'address' }, - { name: '_remoteChainId', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC721Created', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC721', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'isOptimismMintableERC721', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'remoteChainId', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryAddress = { - 10: '0x4200000000000000000000000000000000000017', -} as const - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryConfig = { - address: optimismMintableErc721FactoryAddress, - abi: optimismMintableErc721FactoryABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC721Factory_optimism-goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryOptimismGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_bridge', internalType: 'address', type: 'address' }, - { name: '_remoteChainId', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC721Created', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'REMOTE_CHAIN_ID', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC721', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'isOptimismMintableERC721', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryOptimismGoerliAddress = { - 420: '0x4200000000000000000000000000000000000017', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryOptimismGoerliConfig = { - address: optimismMintableErc721FactoryOptimismGoerliAddress, - abi: optimismMintableErc721FactoryOptimismGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismPortal -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export const optimismPortalABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Paused', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'opaqueData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'TransactionDeposited', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Unpaused', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { name: 'success', internalType: 'bool', type: 'bool', indexed: false }, - ], - name: 'WithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - ], - name: 'WithdrawalProven', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_gasLimit', internalType: 'uint64', type: 'uint64' }, - { name: '_isCreation', internalType: 'bool', type: 'bool' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositTransaction', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [], - name: 'donateETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_tx', - internalType: 'struct Types.WithdrawalTransaction', - type: 'tuple', - components: [ - { name: 'nonce', internalType: 'uint256', type: 'uint256' }, - { name: 'sender', internalType: 'address', type: 'address' }, - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - { name: 'gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - name: 'finalizeWithdrawalTransaction', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'finalizedWithdrawals', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'guardian', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2Oracle', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { name: '_guardian', internalType: 'address', type: 'address' }, - { - name: '_systemConfig', - internalType: 'contract SystemConfig', - type: 'address', - }, - { name: '_paused', internalType: 'bool', type: 'bool' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'isOutputFinalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2Oracle', - outputs: [ - { name: '', internalType: 'contract L2OutputOracle', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2Sender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '_byteCount', internalType: 'uint64', type: 'uint64' }], - name: 'minimumGasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'params', - outputs: [ - { name: 'prevBaseFee', internalType: 'uint128', type: 'uint128' }, - { name: 'prevBoughtGas', internalType: 'uint64', type: 'uint64' }, - { name: 'prevBlockNum', internalType: 'uint64', type: 'uint64' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'pause', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'paused', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_tx', - internalType: 'struct Types.WithdrawalTransaction', - type: 'tuple', - components: [ - { name: 'nonce', internalType: 'uint256', type: 'uint256' }, - { name: 'sender', internalType: 'address', type: 'address' }, - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - { name: 'gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - { - name: '_outputRootProof', - internalType: 'struct Types.OutputRootProof', - type: 'tuple', - components: [ - { name: 'version', internalType: 'bytes32', type: 'bytes32' }, - { name: 'stateRoot', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'messagePasserStorageRoot', - internalType: 'bytes32', - type: 'bytes32', - }, - { name: 'latestBlockhash', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: '_withdrawalProof', internalType: 'bytes[]', type: 'bytes[]' }, - ], - name: 'proveWithdrawalTransaction', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'provenWithdrawals', - outputs: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2OutputIndex', internalType: 'uint128', type: 'uint128' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'systemConfig', - outputs: [ - { name: '', internalType: 'contract SystemConfig', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'unpause', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export const optimismPortalAddress = { - 1: '0xbEb5Fc579115071764c7423A4f12eDde41f106Ed', - 5: '0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export const optimismPortalConfig = { - address: optimismPortalAddress, - abi: optimismPortalABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Optimist -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export const optimistABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_baseURIAttestor', internalType: 'address', type: 'address' }, - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - { - name: '_optimistAllowlist', - internalType: 'contract OptimistAllowlist', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'owner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'approved', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'Approval', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'owner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'operator', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'approved', internalType: 'bool', type: 'bool', indexed: false }, - ], - name: 'ApprovalForAll', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'Transfer', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BASE_URI_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BASE_URI_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_ALLOWLIST', - outputs: [ - { name: '', internalType: 'contract OptimistAllowlist', type: 'address' }, - ], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'uint256', type: 'uint256' }, - ], - name: 'approve', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'owner', internalType: 'address', type: 'address' }], - name: 'balanceOf', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'baseURI', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'burn', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'getApproved', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'operator', internalType: 'address', type: 'address' }, - ], - name: 'isApprovedForAll', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - name: 'isOnAllowList', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - name: 'mint', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'name', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'ownerOf', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - ], - name: 'safeTransferFrom', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'safeTransferFrom', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bool', type: 'bool' }, - ], - name: 'setApprovalForAll', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'interfaceId', internalType: 'bytes4', type: 'bytes4' }], - name: 'supportsInterface', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'symbol', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - name: 'tokenIdOfAddress', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'tokenURI', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - ], - name: 'transferFrom', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export const optimistAddress = { - 10: '0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5', - 420: '0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export const optimistConfig = { - address: optimistAddress, - abi: optimistABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimistAllowlist -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - */ -export const optimistAllowlistABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - { name: '_allowlistAttestor', internalType: 'address', type: 'address' }, - { - name: '_coinbaseQuestAttestor', - internalType: 'address', - type: 'address', - }, - { name: '_optimistInviter', internalType: 'address', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ALLOWLIST_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'COINBASE_QUEST_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'COINBASE_QUEST_ELIGIBLE_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_CAN_MINT_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_INVITER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_claimer', internalType: 'address', type: 'address' }], - name: 'isAllowedToMint', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - */ -export const optimistAllowlistAddress = { - 10: '0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180', - 420: '0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - */ -export const optimistAllowlistConfig = { - address: optimistAllowlistAddress, - abi: optimistAllowlistABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimistInviter -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export const optimistInviterABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_inviteGranter', internalType: 'address', type: 'address' }, - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'issuer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'claimer', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'InviteClaimed', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'CAN_INVITE_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'CLAIMABLE_INVITE_TYPEHASH', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EIP712_VERSION', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'INVITE_GRANTER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_COMMITMENT_PERIOD', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_claimer', internalType: 'address', type: 'address' }, - { - name: '_claimableInvite', - internalType: 'struct OptimistInviter.ClaimableInvite', - type: 'tuple', - components: [ - { name: 'issuer', internalType: 'address', type: 'address' }, - { name: 'nonce', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: '_signature', internalType: 'bytes', type: 'bytes' }, - ], - name: 'claimInvite', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_commitment', internalType: 'bytes32', type: 'bytes32' }], - name: 'commitInvite', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'commitmentTimestamps', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'inviteCounts', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_accounts', internalType: 'address[]', type: 'address[]' }, - { name: '_inviteCount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setInviteCounts', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'usedNonces', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export const optimistInviterAddress = { - 10: '0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929', - 420: '0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export const optimistInviterConfig = { - address: optimistInviterAddress, - abi: optimistInviterABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PortalSender -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export const portalSenderABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_portal', - internalType: 'contract OptimismPortal', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PORTAL', - outputs: [ - { name: '', internalType: 'contract OptimismPortal', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'donate', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export const portalSenderAddress = { - 1: '0x0A893d9576b9cFD9EF78595963dc973238E78210', - 5: '0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export const portalSenderConfig = { - address: portalSenderAddress, - abi: portalSenderABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ProtocolVersions -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export const protocolVersionsABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'updateType', - internalType: 'enum ProtocolVersions.UpdateType', - type: 'uint8', - indexed: true, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'ConfigUpdate', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECOMMENDED_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'REQUIRED_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_owner', internalType: 'address', type: 'address' }, - { name: '_required', internalType: 'ProtocolVersion', type: 'uint256' }, - { - name: '_recommended', - internalType: 'ProtocolVersion', - type: 'uint256', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'recommended', - outputs: [ - { name: 'out_', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'required', - outputs: [ - { name: 'out_', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_recommended', - internalType: 'ProtocolVersion', - type: 'uint256', - }, - ], - name: 'setRecommended', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_required', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - name: 'setRequired', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export const protocolVersionsAddress = { - 5: '0x0C24F5098774aA366827D667494e9F889f7cFc08', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export const protocolVersionsConfig = { - address: protocolVersionsAddress, - abi: protocolVersionsABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ProxyAdmin -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export const proxyAdminABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'addressManager', - outputs: [ - { name: '', internalType: 'contract AddressManager', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_newAdmin', internalType: 'address', type: 'address' }, - ], - name: 'changeProxyAdmin', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - ], - name: 'getProxyAdmin', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_proxy', internalType: 'address', type: 'address' }], - name: 'getProxyImplementation', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'implementationName', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'isUpgrading', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'proxyType', - outputs: [ - { name: '', internalType: 'enum ProxyAdmin.ProxyType', type: 'uint8' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_address', internalType: 'address', type: 'address' }, - ], - name: 'setAddress', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_address', - internalType: 'contract AddressManager', - type: 'address', - }, - ], - name: 'setAddressManager', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_address', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - ], - name: 'setImplementationName', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_address', internalType: 'address', type: 'address' }, - { - name: '_type', - internalType: 'enum ProxyAdmin.ProxyType', - type: 'uint8', - }, - ], - name: 'setProxyType', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_upgrading', internalType: 'bool', type: 'bool' }], - name: 'setUpgrading', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_implementation', internalType: 'address', type: 'address' }, - ], - name: 'upgrade', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_implementation', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'upgradeAndCall', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export const proxyAdminAddress = { - 1: '0x4200000000000000000000000000000000000018', - 5: '0x4200000000000000000000000000000000000018', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export const proxyAdminConfig = { - address: proxyAdminAddress, - abi: proxyAdminABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SchemaRegistry -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export const schemaRegistryABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { type: 'error', inputs: [], name: 'AlreadyExists' }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { - name: 'registerer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Registered', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'getSchema', - outputs: [ - { - name: '', - internalType: 'struct SchemaRecord', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'resolver', - internalType: 'contract ISchemaResolver', - type: 'address', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'schema', internalType: 'string', type: 'string' }, - ], - }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'schema', internalType: 'string', type: 'string' }, - { - name: 'resolver', - internalType: 'contract ISchemaResolver', - type: 'address', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - ], - name: 'register', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export const schemaRegistryAddress = { - 10: '0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13', - 420: '0x2545fa928d5d278cA75Fd47306e4a89096ff6403', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export const schemaRegistryConfig = { - address: schemaRegistryAddress, - abi: schemaRegistryABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SequencerFeeVault -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export const sequencerFeeVaultABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeWallet', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export const sequencerFeeVaultAddress = { - 420: '0x4200000000000000000000000000000000000011', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export const sequencerFeeVaultConfig = { - address: sequencerFeeVaultAddress, - abi: sequencerFeeVaultABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SystemConfig -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export const systemConfigABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'updateType', - internalType: 'enum SystemConfig.UpdateType', - type: 'uint8', - indexed: true, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'ConfigUpdate', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BATCH_INBOX_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_CROSS_DOMAIN_MESSENGER_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_ERC_721_BRIDGE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_STANDARD_BRIDGE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L2_OUTPUT_ORACLE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMISM_PORTAL_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'UNSAFE_BLOCK_SIGNER_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batchInbox', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batcherHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'gasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_owner', internalType: 'address', type: 'address' }, - { name: '_overhead', internalType: 'uint256', type: 'uint256' }, - { name: '_scalar', internalType: 'uint256', type: 'uint256' }, - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_gasLimit', internalType: 'uint64', type: 'uint64' }, - { name: '_unsafeBlockSigner', internalType: 'address', type: 'address' }, - { - name: '_config', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { name: 'maxResourceLimit', internalType: 'uint32', type: 'uint32' }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { name: 'maximumBaseFee', internalType: 'uint128', type: 'uint128' }, - ], - }, - { name: '_startBlock', internalType: 'uint256', type: 'uint256' }, - { name: '_batchInbox', internalType: 'address', type: 'address' }, - { - name: '_addresses', - internalType: 'struct SystemConfig.Addresses', - type: 'tuple', - components: [ - { - name: 'l1CrossDomainMessenger', - internalType: 'address', - type: 'address', - }, - { name: 'l1ERC721Bridge', internalType: 'address', type: 'address' }, - { - name: 'l1StandardBridge', - internalType: 'address', - type: 'address', - }, - { name: 'l2OutputOracle', internalType: 'address', type: 'address' }, - { name: 'optimismPortal', internalType: 'address', type: 'address' }, - { - name: 'optimismMintableERC20Factory', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1CrossDomainMessenger', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1ERC721Bridge', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1StandardBridge', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracle', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'minimumGasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismMintableERC20Factory', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismPortal', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'overhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'resourceConfig', - outputs: [ - { - name: '', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { name: 'maxResourceLimit', internalType: 'uint32', type: 'uint32' }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { name: 'maximumBaseFee', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'scalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'setBatcherHash', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_overhead', internalType: 'uint256', type: 'uint256' }, - { name: '_scalar', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setGasConfig', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_gasLimit', internalType: 'uint64', type: 'uint64' }], - name: 'setGasLimit', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { name: 'maxResourceLimit', internalType: 'uint32', type: 'uint32' }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { name: 'maximumBaseFee', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - name: 'setResourceConfig', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_unsafeBlockSigner', internalType: 'address', type: 'address' }, - ], - name: 'setUnsafeBlockSigner', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startBlock', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'unsafeBlockSigner', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export const systemConfigAddress = { - 1: '0x229047fed2591dbec1eF1118d64F7aF3dB9EB290', - 5: '0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export const systemConfigConfig = { - address: systemConfigAddress, - abi: systemConfigABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SystemDictator -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export const systemDictatorABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EXIT_1_NO_RETURN_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PROXY_TRANSFER_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'config', - outputs: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - { - name: 'resourceConfig', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { - name: 'maxResourceLimit', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'minimumBaseFee', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'systemTxMaxGas', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'maximumBaseFee', - internalType: 'uint128', - type: 'uint128', - }, - ], - }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'currentStep', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'dynamicConfigSet', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'exit1', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'exited', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'finalize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct SystemDictator.DeployConfig', - type: 'tuple', - components: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - { - name: 'resourceConfig', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { - name: 'maxResourceLimit', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'minimumBaseFee', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'systemTxMaxGas', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'maximumBaseFee', - internalType: 'uint128', - type: 'uint128', - }, - ], - }, - ], - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracleDynamicConfig', - outputs: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'oldL1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismPortalDynamicConfig', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'phase1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'phase2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step3', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step4', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step5', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2OutputOracleDynamicConfig', - internalType: 'struct SystemDictator.L2OutputOracleDynamicConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - name: '_optimismPortalDynamicConfig', - internalType: 'bool', - type: 'bool', - }, - ], - name: 'updateDynamicConfig', - outputs: [], - }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export const systemDictatorAddress = { - 1: '0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export const systemDictatorConfig = { - address: systemDictatorAddress, - abi: systemDictatorABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SystemDictator_goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export const systemDictatorGoerliABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EXIT_1_NO_RETURN_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PROXY_TRANSFER_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'config', - outputs: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'currentStep', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'dynamicConfigSet', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'exit1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'finalize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct SystemDictator.DeployConfig', - type: 'tuple', - components: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracleDynamicConfig', - outputs: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'oldL1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step3', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step4', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step5', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step6', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2OutputOracleDynamicConfig', - internalType: 'struct SystemDictator.L2OutputOracleDynamicConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - ], - name: 'updateL2OutputOracleDynamicConfig', - outputs: [], - }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export const systemDictatorGoerliAddress = { - 5: '0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export const systemDictatorGoerliConfig = { - address: systemDictatorGoerliAddress, - abi: systemDictatorGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// TeleportrWithdrawer -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export const teleportrWithdrawerABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'data', - outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'recipient', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'setData', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - name: 'setRecipient', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_teleportr', internalType: 'address', type: 'address' }], - name: 'setTeleportr', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'teleportr', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdrawFromTeleportr', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export const teleportrWithdrawerAddress = { - 1: '0x78A25524D90E3D0596558fb43789bD800a5c3007', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export const teleportrWithdrawerConfig = { - address: teleportrWithdrawerAddress, - abi: teleportrWithdrawerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// eslintIgnore -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Core -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link addressManagerABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export function getAddressManager( - config: Omit & { - chainId?: keyof typeof addressManagerAddress - } -) { - return getContract({ - abi: addressManagerABI, - address: - addressManagerAddress[ - config.chainId as keyof typeof addressManagerAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link assetReceiverABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export function getAssetReceiver( - config: Omit & { - chainId?: keyof typeof assetReceiverAddress - } -) { - return getContract({ - abi: assetReceiverABI, - address: - assetReceiverAddress[config.chainId as keyof typeof assetReceiverAddress], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link attestationStationABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export function getAttestationStation( - config: Omit & { - chainId?: keyof typeof attestationStationAddress - } -) { - return getContract({ - abi: attestationStationABI, - address: - attestationStationAddress[ - config.chainId as keyof typeof attestationStationAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link baseFeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export function getBaseFeeVault( - config: Omit & { - chainId?: keyof typeof baseFeeVaultAddress - } -) { - return getContract({ - abi: baseFeeVaultABI, - address: baseFeeVaultAddress[420], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link checkBalanceHighABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export function getCheckBalanceHigh( - config: Omit & { - chainId?: keyof typeof checkBalanceHighAddress - } -) { - return getContract({ - abi: checkBalanceHighABI, - address: - checkBalanceHighAddress[ - config.chainId as keyof typeof checkBalanceHighAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link checkBalanceLowABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export function getCheckBalanceLow( - config: Omit & { - chainId?: keyof typeof checkBalanceLowAddress - } -) { - return getContract({ - abi: checkBalanceLowABI, - address: - checkBalanceLowAddress[ - config.chainId as keyof typeof checkBalanceLowAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link checkGelatoLowABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export function getCheckGelatoLow( - config: Omit & { - chainId?: keyof typeof checkGelatoLowAddress - } -) { - return getContract({ - abi: checkGelatoLowABI, - address: - checkGelatoLowAddress[ - config.chainId as keyof typeof checkGelatoLowAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link checkTrueABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x47443D0C184e022F19BD1578F5bca6B8a9F58E32) - */ -export function getCheckTrue( - config: Omit & { - chainId?: keyof typeof checkTrueAddress - } -) { - return getContract({ - abi: checkTrueABI, - address: checkTrueAddress[config.chainId as keyof typeof checkTrueAddress], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link drippieABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export function getDrippie( - config: Omit & { - chainId?: keyof typeof drippieAddress - } -) { - return getContract({ abi: drippieABI, address: drippieAddress[1], ...config }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link drippieGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export function getDrippieGoerli( - config: Omit & { - chainId?: keyof typeof drippieGoerliAddress - } -) { - return getContract({ - abi: drippieGoerliABI, - address: drippieGoerliAddress[5], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link drippieOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export function getDrippieOptimismGoerli( - config: Omit & { - chainId?: keyof typeof drippieOptimismGoerliAddress - } -) { - return getContract({ - abi: drippieOptimismGoerliABI, - address: drippieOptimismGoerliAddress[420], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link easABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export function getEas( - config: Omit & { - chainId?: keyof typeof easAddress - } -) { - return getContract({ - abi: easABI, - address: easAddress[config.chainId as keyof typeof easAddress], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link gasPriceOracleABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000000F) - */ -export function getGasPriceOracle( - config: Omit & { - chainId?: keyof typeof gasPriceOracleAddress - } -) { - return getContract({ - abi: gasPriceOracleABI, - address: gasPriceOracleAddress[420], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link l1BlockABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export function getL1Block( - config: Omit & { - chainId?: keyof typeof l1BlockAddress - } -) { - return getContract({ - abi: l1BlockABI, - address: l1BlockAddress[420], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link l1CrossDomainMessengerABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export function getL1CrossDomainMessenger( - config: Omit & { - chainId?: keyof typeof l1CrossDomainMessengerAddress - } -) { - return getContract({ - abi: l1CrossDomainMessengerABI, - address: - l1CrossDomainMessengerAddress[ - config.chainId as keyof typeof l1CrossDomainMessengerAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link l1Erc721BridgeABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export function getL1Erc721Bridge( - config: Omit & { - chainId?: keyof typeof l1Erc721BridgeAddress - } -) { - return getContract({ - abi: l1Erc721BridgeABI, - address: - l1Erc721BridgeAddress[ - config.chainId as keyof typeof l1Erc721BridgeAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link l1FeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export function getL1FeeVault( - config: Omit & { - chainId?: keyof typeof l1FeeVaultAddress - } -) { - return getContract({ - abi: l1FeeVaultABI, - address: l1FeeVaultAddress[420], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link l1StandardBridgeABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export function getL1StandardBridge( - config: Omit & { - chainId?: keyof typeof l1StandardBridgeAddress - } -) { - return getContract({ - abi: l1StandardBridgeABI, - address: - l1StandardBridgeAddress[ - config.chainId as keyof typeof l1StandardBridgeAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link l2CrossDomainMessengerABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export function getL2CrossDomainMessenger( - config: Omit & { - chainId?: keyof typeof l2CrossDomainMessengerAddress - } -) { - return getContract({ - abi: l2CrossDomainMessengerABI, - address: l2CrossDomainMessengerAddress[420], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link l2Erc721BridgeABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export function getL2Erc721Bridge( - config: Omit & { - chainId?: keyof typeof l2Erc721BridgeAddress - } -) { - return getContract({ - abi: l2Erc721BridgeABI, - address: - l2Erc721BridgeAddress[ - config.chainId as keyof typeof l2Erc721BridgeAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link l2OutputOracleABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export function getL2OutputOracle( - config: Omit & { - chainId?: keyof typeof l2OutputOracleAddress - } -) { - return getContract({ - abi: l2OutputOracleABI, - address: - l2OutputOracleAddress[ - config.chainId as keyof typeof l2OutputOracleAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link l2StandardBridgeABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export function getL2StandardBridge( - config: Omit & { - chainId?: keyof typeof l2StandardBridgeAddress - } -) { - return getContract({ - abi: l2StandardBridgeABI, - address: l2StandardBridgeAddress[420], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link l2ToL1MessagePasserABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export function getL2ToL1MessagePasser( - config: Omit & { - chainId?: keyof typeof l2ToL1MessagePasserAddress - } -) { - return getContract({ - abi: l2ToL1MessagePasserABI, - address: l2ToL1MessagePasserAddress[420], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link mintManagerABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export function getMintManager( - config: Omit & { - chainId?: keyof typeof mintManagerAddress - } -) { - return getContract({ - abi: mintManagerABI, - address: - mintManagerAddress[config.chainId as keyof typeof mintManagerAddress], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link optimismMintableErc20FactoryABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function getOptimismMintableErc20Factory( - config: Omit & { - chainId?: keyof typeof optimismMintableErc20FactoryAddress - } -) { - return getContract({ - abi: optimismMintableErc20FactoryABI, - address: optimismMintableErc20FactoryAddress[1], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link optimismMintableErc20FactoryGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function getOptimismMintableErc20FactoryGoerli( - config: Omit & { - chainId?: keyof typeof optimismMintableErc20FactoryGoerliAddress - } -) { - return getContract({ - abi: optimismMintableErc20FactoryGoerliABI, - address: optimismMintableErc20FactoryGoerliAddress[5], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link optimismMintableErc20FactoryOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function getOptimismMintableErc20FactoryOptimismGoerli( - config: Omit & { - chainId?: keyof typeof optimismMintableErc20FactoryOptimismGoerliAddress - } -) { - return getContract({ - abi: optimismMintableErc20FactoryOptimismGoerliABI, - address: optimismMintableErc20FactoryOptimismGoerliAddress[420], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link optimismMintableErc721FactoryABI}__. - * - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export function getOptimismMintableErc721Factory( - config: Omit & { - chainId?: keyof typeof optimismMintableErc721FactoryAddress - } -) { - return getContract({ - abi: optimismMintableErc721FactoryABI, - address: optimismMintableErc721FactoryAddress[10], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link optimismMintableErc721FactoryOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export function getOptimismMintableErc721FactoryOptimismGoerli( - config: Omit & { - chainId?: keyof typeof optimismMintableErc721FactoryOptimismGoerliAddress - } -) { - return getContract({ - abi: optimismMintableErc721FactoryOptimismGoerliABI, - address: optimismMintableErc721FactoryOptimismGoerliAddress[420], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link optimismPortalABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export function getOptimismPortal( - config: Omit & { - chainId?: keyof typeof optimismPortalAddress - } -) { - return getContract({ - abi: optimismPortalABI, - address: - optimismPortalAddress[ - config.chainId as keyof typeof optimismPortalAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link optimistABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export function getOptimist( - config: Omit & { - chainId?: keyof typeof optimistAddress - } -) { - return getContract({ - abi: optimistABI, - address: optimistAddress[config.chainId as keyof typeof optimistAddress], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link optimistAllowlistABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - */ -export function getOptimistAllowlist( - config: Omit & { - chainId?: keyof typeof optimistAllowlistAddress - } -) { - return getContract({ - abi: optimistAllowlistABI, - address: - optimistAllowlistAddress[ - config.chainId as keyof typeof optimistAllowlistAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link optimistInviterABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export function getOptimistInviter( - config: Omit & { - chainId?: keyof typeof optimistInviterAddress - } -) { - return getContract({ - abi: optimistInviterABI, - address: - optimistInviterAddress[ - config.chainId as keyof typeof optimistInviterAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link portalSenderABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export function getPortalSender( - config: Omit & { - chainId?: keyof typeof portalSenderAddress - } -) { - return getContract({ - abi: portalSenderABI, - address: - portalSenderAddress[config.chainId as keyof typeof portalSenderAddress], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link protocolVersionsABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export function getProtocolVersions( - config: Omit & { - chainId?: keyof typeof protocolVersionsAddress - } -) { - return getContract({ - abi: protocolVersionsABI, - address: protocolVersionsAddress[5], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link proxyAdminABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export function getProxyAdmin( - config: Omit & { - chainId?: keyof typeof proxyAdminAddress - } -) { - return getContract({ - abi: proxyAdminABI, - address: - proxyAdminAddress[config.chainId as keyof typeof proxyAdminAddress], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link schemaRegistryABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export function getSchemaRegistry( - config: Omit & { - chainId?: keyof typeof schemaRegistryAddress - } -) { - return getContract({ - abi: schemaRegistryABI, - address: - schemaRegistryAddress[ - config.chainId as keyof typeof schemaRegistryAddress - ], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link sequencerFeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export function getSequencerFeeVault( - config: Omit & { - chainId?: keyof typeof sequencerFeeVaultAddress - } -) { - return getContract({ - abi: sequencerFeeVaultABI, - address: sequencerFeeVaultAddress[420], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link systemConfigABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export function getSystemConfig( - config: Omit & { - chainId?: keyof typeof systemConfigAddress - } -) { - return getContract({ - abi: systemConfigABI, - address: - systemConfigAddress[config.chainId as keyof typeof systemConfigAddress], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link systemDictatorABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export function getSystemDictator( - config: Omit & { - chainId?: keyof typeof systemDictatorAddress - } -) { - return getContract({ - abi: systemDictatorABI, - address: systemDictatorAddress[1], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link systemDictatorGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export function getSystemDictatorGoerli( - config: Omit & { - chainId?: keyof typeof systemDictatorGoerliAddress - } -) { - return getContract({ - abi: systemDictatorGoerliABI, - address: systemDictatorGoerliAddress[5], - ...config, - }) -} - -/** - * Wraps __{@link getContract}__ with `abi` set to __{@link teleportrWithdrawerABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export function getTeleportrWithdrawer( - config: Omit & { - chainId?: keyof typeof teleportrWithdrawerAddress - } -) { - return getContract({ - abi: teleportrWithdrawerABI, - address: teleportrWithdrawerAddress[1], - ...config, - }) -} diff --git a/packages/contracts-ts/src/constants.spec.ts b/packages/contracts-ts/src/constants.spec.ts deleted file mode 100644 index 69a3809bba92..000000000000 --- a/packages/contracts-ts/src/constants.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { test, expect } from 'vitest' -import { addresses } from './constants' -import { readFileSync } from 'fs' -import { join } from 'path' - -const jsonAddresses = JSON.parse( - readFileSync(join(__dirname, '../addresses.json'), 'utf8') -) - -test('should have generated addresses', () => { - expect(addresses).toEqual(jsonAddresses) -}) diff --git a/packages/contracts-ts/src/constants.ts b/packages/contracts-ts/src/constants.ts deleted file mode 100644 index 42c9cf74f63a..000000000000 --- a/packages/contracts-ts/src/constants.ts +++ /dev/null @@ -1,18455 +0,0 @@ -/* eslint-disable */ - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// AddressManager -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export const addressManagerABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { name: '_name', internalType: 'string', type: 'string', indexed: true }, - { - name: '_newAddress', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: '_oldAddress', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'AddressSet', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'getAddress', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_address', internalType: 'address', type: 'address' }, - ], - name: 'setAddress', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export const addressManagerAddress = { - 1: '0xdE1FCfB0851916CA5101820A69b13a4E276bd81F', - 5: '0xa6f73589243a6A7a9023b1Fa0651b1d89c177111', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export const addressManagerConfig = { - address: addressManagerAddress, - abi: addressManagerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// AssetReceiver -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export const assetReceiverABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export const assetReceiverAddress = { - 1: '0x15DdA60616Ffca20371ED1659dBB78E888f65556', - 10: '0x15DdA60616Ffca20371ED1659dBB78E888f65556', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export const assetReceiverConfig = { - address: assetReceiverAddress, - abi: assetReceiverABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// AttestationStation -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export const attestationStationABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'creator', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'about', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'key', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { name: 'val', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'AttestationCreated', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_attestations', - internalType: 'struct AttestationStation.AttestationData[]', - type: 'tuple[]', - components: [ - { name: 'about', internalType: 'address', type: 'address' }, - { name: 'key', internalType: 'bytes32', type: 'bytes32' }, - { name: 'val', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - name: 'attest', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_about', internalType: 'address', type: 'address' }, - { name: '_key', internalType: 'bytes32', type: 'bytes32' }, - { name: '_val', internalType: 'bytes', type: 'bytes' }, - ], - name: 'attest', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'attestations', - outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export const attestationStationAddress = { - 10: '0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77', - 420: '0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export const attestationStationConfig = { - address: attestationStationAddress, - abi: attestationStationABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// BaseFeeVault -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export const baseFeeVaultABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export const baseFeeVaultAddress = { - 420: '0x4200000000000000000000000000000000000019', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export const baseFeeVaultConfig = { - address: baseFeeVaultAddress, - abi: baseFeeVaultABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckBalanceHigh -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export const checkBalanceHighABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckBalanceHigh.Params', - type: 'tuple', - components: [ - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export const checkBalanceHighAddress = { - 1: '0x7eC64a8a591bFf829ff6C8be76074D540ACb813F', - 5: '0x7eC64a8a591bFf829ff6C8be76074D540ACb813F', - 420: '0x5d7103853f12109A7d27F118e54BbC654ad847E9', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export const checkBalanceHighConfig = { - address: checkBalanceHighAddress, - abi: checkBalanceHighABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckBalanceLow -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export const checkBalanceLowABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckBalanceLow.Params', - type: 'tuple', - components: [ - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export const checkBalanceLowAddress = { - 1: '0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640', - 5: '0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640', - 420: '0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export const checkBalanceLowConfig = { - address: checkBalanceLowAddress, - abi: checkBalanceLowABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckGelatoLow -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export const checkGelatoLowABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckGelatoLow.Params', - type: 'tuple', - components: [ - { name: 'treasury', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - { name: 'recipient', internalType: 'address', type: 'address' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export const checkGelatoLowAddress = { - 1: '0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa', - 5: '0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa', - 420: '0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export const checkGelatoLowConfig = { - address: checkGelatoLowAddress, - abi: checkGelatoLowABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckTrue -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x47443D0C184e022F19BD1578F5bca6B8a9F58E32) - */ -export const checkTrueABI = [ - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x47443D0C184e022F19BD1578F5bca6B8a9F58E32) - */ -export const checkTrueAddress = { - 1: '0x5c741a38cb11424711231777D71689C458eE835D', - 5: '0x5c741a38cb11424711231777D71689C458eE835D', - 420: '0x47443D0C184e022F19BD1578F5bca6B8a9F58E32', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x47443D0C184e022F19BD1578F5bca6B8a9F58E32) - */ -export const checkTrueConfig = { - address: checkTrueAddress, - abi: checkTrueABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Drippie -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieAddress = { - 1: '0x44b3A2a040057eBafC601A78647e805fd58B1f50', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieConfig = { - address: drippieAddress, - abi: drippieABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Drippie_goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieGoerliAddress = { - 5: '0x44b3A2a040057eBafC601A78647e805fd58B1f50', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieGoerliConfig = { - address: drippieGoerliAddress, - abi: drippieGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Drippie_optimism-goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export const drippieOptimismGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export const drippieOptimismGoerliAddress = { - 420: '0x8D8d533C16D23847EB04EEB0925be8900Dd3af86', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export const drippieOptimismGoerliConfig = { - address: drippieOptimismGoerliAddress, - abi: drippieOptimismGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// EAS -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export const easABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { type: 'error', inputs: [], name: 'AccessDenied' }, - { type: 'error', inputs: [], name: 'AlreadyRevoked' }, - { type: 'error', inputs: [], name: 'AlreadyRevokedOffchain' }, - { type: 'error', inputs: [], name: 'AlreadyTimestamped' }, - { type: 'error', inputs: [], name: 'InsufficientValue' }, - { type: 'error', inputs: [], name: 'InvalidAttestation' }, - { type: 'error', inputs: [], name: 'InvalidAttestations' }, - { type: 'error', inputs: [], name: 'InvalidExpirationTime' }, - { type: 'error', inputs: [], name: 'InvalidLength' }, - { type: 'error', inputs: [], name: 'InvalidOffset' }, - { type: 'error', inputs: [], name: 'InvalidRegistry' }, - { type: 'error', inputs: [], name: 'InvalidRevocation' }, - { type: 'error', inputs: [], name: 'InvalidRevocations' }, - { type: 'error', inputs: [], name: 'InvalidSchema' }, - { type: 'error', inputs: [], name: 'InvalidSignature' }, - { type: 'error', inputs: [], name: 'InvalidVerifier' }, - { type: 'error', inputs: [], name: 'Irrevocable' }, - { type: 'error', inputs: [], name: 'NotFound' }, - { type: 'error', inputs: [], name: 'NotPayable' }, - { type: 'error', inputs: [], name: 'WrongSchema' }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'attester', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'uid', internalType: 'bytes32', type: 'bytes32', indexed: false }, - { - name: 'schema', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'Attested', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'attester', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'uid', internalType: 'bytes32', type: 'bytes32', indexed: false }, - { - name: 'schema', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'Revoked', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'revoker', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'data', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { - name: 'timestamp', - internalType: 'uint64', - type: 'uint64', - indexed: true, - }, - ], - name: 'RevokedOffchain', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'data', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { - name: 'timestamp', - internalType: 'uint64', - type: 'uint64', - indexed: true, - }, - ], - name: 'Timestamped', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'request', - internalType: 'struct AttestationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData', - type: 'tuple', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'attest', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'delegatedRequest', - internalType: 'struct DelegatedAttestationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData', - type: 'tuple', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signature', - internalType: 'struct EIP712Signature', - type: 'tuple', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'attester', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'attestByDelegation', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getAttestTypeHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'getAttestation', - outputs: [ - { - name: '', - internalType: 'struct Attestation', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { name: 'time', internalType: 'uint64', type: 'uint64' }, - { name: 'expirationTime', internalType: 'uint64', type: 'uint64' }, - { name: 'revocationTime', internalType: 'uint64', type: 'uint64' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'recipient', internalType: 'address', type: 'address' }, - { name: 'attester', internalType: 'address', type: 'address' }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'getDomainSeparator', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'getName', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'account', internalType: 'address', type: 'address' }], - name: 'getNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: 'revoker', internalType: 'address', type: 'address' }, - { name: 'data', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'getRevokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getRevokeTypeHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getSchemaRegistry', - outputs: [ - { name: '', internalType: 'contract ISchemaRegistry', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'getTimestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'isAttestationValid', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiRequests', - internalType: 'struct MultiAttestationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'multiAttest', - outputs: [{ name: '', internalType: 'bytes32[]', type: 'bytes32[]' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiDelegatedRequests', - internalType: 'struct MultiDelegatedAttestationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signatures', - internalType: 'struct EIP712Signature[]', - type: 'tuple[]', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'attester', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'multiAttestByDelegation', - outputs: [{ name: '', internalType: 'bytes32[]', type: 'bytes32[]' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiRequests', - internalType: 'struct MultiRevocationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'multiRevoke', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiDelegatedRequests', - internalType: 'struct MultiDelegatedRevocationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signatures', - internalType: 'struct EIP712Signature[]', - type: 'tuple[]', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'revoker', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'multiRevokeByDelegation', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32[]', type: 'bytes32[]' }], - name: 'multiRevokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32[]', type: 'bytes32[]' }], - name: 'multiTimestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'request', - internalType: 'struct RevocationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'revoke', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'delegatedRequest', - internalType: 'struct DelegatedRevocationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signature', - internalType: 'struct EIP712Signature', - type: 'tuple', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'revoker', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'revokeByDelegation', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'revokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'timestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export const easAddress = { - 10: '0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088', - 420: '0x5A633F1cc84B03F7588486CF2F386c102061E6e1', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export const easConfig = { address: easAddress, abi: easABI } as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// GasPriceOracle -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000000F) - */ -export const gasPriceOracleABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'DECIMALS', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'baseFee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'decimals', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'gasPrice', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'getL1Fee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'getL1GasUsed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1BaseFee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'overhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'scalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000000F) - */ -export const gasPriceOracleAddress = { - 420: '0x420000000000000000000000000000000000000F', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000000F) - */ -export const gasPriceOracleConfig = { - address: gasPriceOracleAddress, - abi: gasPriceOracleABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1Block -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export const l1BlockABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'DEPOSITOR_ACCOUNT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'basefee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batcherHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'hash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeOverhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeScalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'number', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'sequenceNumber', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_number', internalType: 'uint64', type: 'uint64' }, - { name: '_timestamp', internalType: 'uint64', type: 'uint64' }, - { name: '_basefee', internalType: 'uint256', type: 'uint256' }, - { name: '_hash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_sequenceNumber', internalType: 'uint64', type: 'uint64' }, - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l1FeeOverhead', internalType: 'uint256', type: 'uint256' }, - { name: '_l1FeeScalar', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setL1BlockValues', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'timestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export const l1BlockAddress = { - 420: '0x4200000000000000000000000000000000000015', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export const l1BlockConfig = { - address: l1BlockAddress, - abi: l1BlockABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1CrossDomainMessenger -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export const l1CrossDomainMessengerABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'FailedRelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'RelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: false, - }, - { name: 'message', internalType: 'bytes', type: 'bytes', indexed: false }, - { - name: 'messageNonce', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessageExtension1', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_CALLDATA_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_MESSENGER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PORTAL', - outputs: [ - { name: '', internalType: 'contract OptimismPortal', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CALL_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CONSTANT_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_GAS_CHECK_BUFFER', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_RESERVED_GAS', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'baseGas', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'failedMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_portal', - internalType: 'contract OptimismPortal', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'portal', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_nonce', internalType: 'uint256', type: 'uint256' }, - { name: '_sender', internalType: 'address', type: 'address' }, - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - ], - name: 'relayMessage', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'sendMessage', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'successfulMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'xDomainMessageSender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export const l1CrossDomainMessengerAddress = { - 1: '0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1', - 5: '0x5086d1eEF304eb5284A0f6720f79403b4e9bE294', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export const l1CrossDomainMessengerConfig = { - address: l1CrossDomainMessengerAddress, - abi: l1CrossDomainMessengerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1ERC721Bridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export const l1Erc721BridgeABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSENGER', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721To', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'uint256', type: 'uint256' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_messenger', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export const l1Erc721BridgeAddress = { - 1: '0x5a7749f83b81B301cAb5f48EB8516B986DAef23D', - 5: '0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export const l1Erc721BridgeConfig = { - address: l1Erc721BridgeAddress, - abi: l1Erc721BridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1FeeVault -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export const l1FeeVaultABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export const l1FeeVaultAddress = { - 420: '0x420000000000000000000000000000000000001A', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export const l1FeeVaultConfig = { - address: l1FeeVaultAddress, - abi: l1FeeVaultABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1StandardBridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export const l1StandardBridgeABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20DepositInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20WithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHDepositInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHWithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSENGER', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_BRIDGE', - outputs: [ - { name: '', internalType: 'contract StandardBridge', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETHTo', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositETHTo', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC20', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeERC20Withdrawal', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeETHWithdrawal', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_messenger', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2TokenBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [ - { name: '', internalType: 'contract StandardBridge', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export const l1StandardBridgeAddress = { - 1: '0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1', - 5: '0x636Af16bf2f682dD3109e60102b8E1A089FedAa8', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export const l1StandardBridgeConfig = { - address: l1StandardBridgeAddress, - abi: l1StandardBridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2CrossDomainMessenger -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export const l2CrossDomainMessengerABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_l1CrossDomainMessenger', - internalType: 'address', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'FailedRelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'RelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: false, - }, - { name: 'message', internalType: 'bytes', type: 'bytes', indexed: false }, - { - name: 'messageNonce', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessageExtension1', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_CALLDATA_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_MESSENGER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CALL_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CONSTANT_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_GAS_CHECK_BUFFER', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_RESERVED_GAS', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'baseGas', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'failedMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_nonce', internalType: 'uint256', type: 'uint256' }, - { name: '_sender', internalType: 'address', type: 'address' }, - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - ], - name: 'relayMessage', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'sendMessage', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'successfulMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'xDomainMessageSender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export const l2CrossDomainMessengerAddress = { - 420: '0x4200000000000000000000000000000000000007', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export const l2CrossDomainMessengerConfig = { - address: l2CrossDomainMessengerAddress, - abi: l2CrossDomainMessengerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2ERC721Bridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_messenger', internalType: 'address', type: 'address' }, - { name: '_otherBridge', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeInitiated', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721To', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC721', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeAddress = { - 10: '0x4200000000000000000000000000000000000014', -} as const - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeConfig = { - address: l2Erc721BridgeAddress, - abi: l2Erc721BridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2ERC721Bridge_optimism-goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeOptimismGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_messenger', internalType: 'address', type: 'address' }, - { name: '_otherBridge', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeInitiated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSENGER', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721To', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC721', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeOptimismGoerliAddress = { - 420: '0x4200000000000000000000000000000000000014', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeOptimismGoerliConfig = { - address: l2Erc721BridgeOptimismGoerliAddress, - abi: l2Erc721BridgeOptimismGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2OutputOracle -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export const l2OutputOracleABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_submissionInterval', internalType: 'uint256', type: 'uint256' }, - { name: '_l2BlockTime', internalType: 'uint256', type: 'uint256' }, - { - name: '_finalizationPeriodSeconds', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'outputRoot', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { - name: 'l2OutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'l2BlockNumber', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'l1Timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'OutputProposed', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'prevNextOutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'newNextOutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'OutputsDeleted', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'CHALLENGER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'FINALIZATION_PERIOD_SECONDS', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L2_BLOCK_TIME', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PROPOSER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'SUBMISSION_INTERVAL', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'challenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'computeL2Timestamp', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'deleteL2Outputs', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalizationPeriodSeconds', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2Output', - outputs: [ - { - name: '', - internalType: 'struct Types.OutputProposal', - type: 'tuple', - components: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2BlockNumber', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2OutputAfter', - outputs: [ - { - name: '', - internalType: 'struct Types.OutputProposal', - type: 'tuple', - components: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2BlockNumber', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2OutputIndexAfter', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_startingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { name: '_startingTimestamp', internalType: 'uint256', type: 'uint256' }, - { name: '_proposer', internalType: 'address', type: 'address' }, - { name: '_challenger', internalType: 'address', type: 'address' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2BlockTime', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'latestBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'latestOutputIndex', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'nextBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'nextOutputIndex', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - { name: '_l1BlockHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l1BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'proposeL2Output', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'proposer', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startingBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startingTimestamp', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'submissionInterval', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export const l2OutputOracleAddress = { - 1: '0xdfe97868233d1aa22e815a266982f2cf17685a27', - 5: '0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export const l2OutputOracleConfig = { - address: l2OutputOracleAddress, - abi: l2OutputOracleABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2StandardBridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export const l2StandardBridgeABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_otherBridge', - internalType: 'address payable', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'DepositFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'WithdrawalInitiated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSENGER', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_BRIDGE', - outputs: [ - { name: '', internalType: 'contract StandardBridge', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETHTo', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC20', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeDeposit', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1TokenBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'withdraw', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'withdrawTo', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export const l2StandardBridgeAddress = { - 420: '0x4200000000000000000000000000000000000010', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export const l2StandardBridgeConfig = { - address: l2StandardBridgeAddress, - abi: l2StandardBridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2ToL1MessagePasser -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export const l2ToL1MessagePasserABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nonce', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: false, - }, - ], - name: 'MessagePassed', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'WithdrawerBalanceBurnt', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'burn', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'initiateWithdrawal', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'sentMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export const l2ToL1MessagePasserAddress = { - 420: '0x4200000000000000000000000000000000000016', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export const l2ToL1MessagePasserConfig = { - address: l2ToL1MessagePasserAddress, - abi: l2ToL1MessagePasserABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// MintManager -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export const mintManagerABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_upgrader', internalType: 'address', type: 'address' }, - { name: '_governanceToken', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'DENOMINATOR', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MINT_CAP', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MINT_PERIOD', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'governanceToken', - outputs: [ - { name: '', internalType: 'contract GovernanceToken', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_account', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'mint', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'mintPermittedAfter', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_newMintManager', internalType: 'address', type: 'address' }, - ], - name: 'upgrade', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export const mintManagerAddress = { - 10: '0x5C4e7Ba1E219E47948e6e3F55019A647bA501005', - 420: '0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export const mintManagerConfig = { - address: mintManagerAddress, - abi: mintManagerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC20Factory -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_decimals', internalType: 'uint8', type: 'uint8' }, - ], - name: 'createOptimismMintableERC20WithDecimals', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryAddress = { - 1: '0x4200000000000000000000000000000000000012', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryConfig = { - address: optimismMintableErc20FactoryAddress, - abi: optimismMintableErc20FactoryABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC20Factory_goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryGoerliABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_decimals', internalType: 'uint8', type: 'uint8' }, - ], - name: 'createOptimismMintableERC20WithDecimals', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryGoerliAddress = { - 5: '0x4200000000000000000000000000000000000012', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryGoerliConfig = { - address: optimismMintableErc20FactoryGoerliAddress, - abi: optimismMintableErc20FactoryGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC20Factory_optimism-goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryOptimismGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryOptimismGoerliAddress = { - 420: '0x4200000000000000000000000000000000000012', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryOptimismGoerliConfig = { - address: optimismMintableErc20FactoryOptimismGoerliAddress, - abi: optimismMintableErc20FactoryOptimismGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC721Factory -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_bridge', internalType: 'address', type: 'address' }, - { name: '_remoteChainId', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC721Created', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC721', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'isOptimismMintableERC721', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'remoteChainId', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryAddress = { - 10: '0x4200000000000000000000000000000000000017', -} as const - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryConfig = { - address: optimismMintableErc721FactoryAddress, - abi: optimismMintableErc721FactoryABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC721Factory_optimism-goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryOptimismGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_bridge', internalType: 'address', type: 'address' }, - { name: '_remoteChainId', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC721Created', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'REMOTE_CHAIN_ID', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC721', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'isOptimismMintableERC721', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryOptimismGoerliAddress = { - 420: '0x4200000000000000000000000000000000000017', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryOptimismGoerliConfig = { - address: optimismMintableErc721FactoryOptimismGoerliAddress, - abi: optimismMintableErc721FactoryOptimismGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismPortal -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export const optimismPortalABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Paused', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'opaqueData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'TransactionDeposited', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Unpaused', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { name: 'success', internalType: 'bool', type: 'bool', indexed: false }, - ], - name: 'WithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - ], - name: 'WithdrawalProven', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'GUARDIAN', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L2_ORACLE', - outputs: [ - { name: '', internalType: 'contract L2OutputOracle', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'SYSTEM_CONFIG', - outputs: [ - { name: '', internalType: 'contract SystemConfig', type: 'address' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_gasLimit', internalType: 'uint64', type: 'uint64' }, - { name: '_isCreation', internalType: 'bool', type: 'bool' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositTransaction', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [], - name: 'donateETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_tx', - internalType: 'struct Types.WithdrawalTransaction', - type: 'tuple', - components: [ - { name: 'nonce', internalType: 'uint256', type: 'uint256' }, - { name: 'sender', internalType: 'address', type: 'address' }, - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - { name: 'gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - name: 'finalizeWithdrawalTransaction', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'finalizedWithdrawals', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'guardian', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2Oracle', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { name: '_guardian', internalType: 'address', type: 'address' }, - { - name: '_systemConfig', - internalType: 'contract SystemConfig', - type: 'address', - }, - { name: '_paused', internalType: 'bool', type: 'bool' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'isOutputFinalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2Oracle', - outputs: [ - { name: '', internalType: 'contract L2OutputOracle', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2Sender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '_byteCount', internalType: 'uint64', type: 'uint64' }], - name: 'minimumGasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'params', - outputs: [ - { name: 'prevBaseFee', internalType: 'uint128', type: 'uint128' }, - { name: 'prevBoughtGas', internalType: 'uint64', type: 'uint64' }, - { name: 'prevBlockNum', internalType: 'uint64', type: 'uint64' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'pause', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'paused', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_tx', - internalType: 'struct Types.WithdrawalTransaction', - type: 'tuple', - components: [ - { name: 'nonce', internalType: 'uint256', type: 'uint256' }, - { name: 'sender', internalType: 'address', type: 'address' }, - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - { name: 'gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - { - name: '_outputRootProof', - internalType: 'struct Types.OutputRootProof', - type: 'tuple', - components: [ - { name: 'version', internalType: 'bytes32', type: 'bytes32' }, - { name: 'stateRoot', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'messagePasserStorageRoot', - internalType: 'bytes32', - type: 'bytes32', - }, - { name: 'latestBlockhash', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: '_withdrawalProof', internalType: 'bytes[]', type: 'bytes[]' }, - ], - name: 'proveWithdrawalTransaction', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'provenWithdrawals', - outputs: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2OutputIndex', internalType: 'uint128', type: 'uint128' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'systemConfig', - outputs: [ - { name: '', internalType: 'contract SystemConfig', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'unpause', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export const optimismPortalAddress = { - 1: '0xbEb5Fc579115071764c7423A4f12eDde41f106Ed', - 5: '0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export const optimismPortalConfig = { - address: optimismPortalAddress, - abi: optimismPortalABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Optimist -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export const optimistABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_baseURIAttestor', internalType: 'address', type: 'address' }, - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - { - name: '_optimistAllowlist', - internalType: 'contract OptimistAllowlist', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'owner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'approved', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'Approval', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'owner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'operator', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'approved', internalType: 'bool', type: 'bool', indexed: false }, - ], - name: 'ApprovalForAll', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'Transfer', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BASE_URI_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BASE_URI_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_ALLOWLIST', - outputs: [ - { name: '', internalType: 'contract OptimistAllowlist', type: 'address' }, - ], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'uint256', type: 'uint256' }, - ], - name: 'approve', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'owner', internalType: 'address', type: 'address' }], - name: 'balanceOf', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'baseURI', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'burn', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'getApproved', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'operator', internalType: 'address', type: 'address' }, - ], - name: 'isApprovedForAll', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - name: 'isOnAllowList', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - name: 'mint', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'name', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'ownerOf', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - ], - name: 'safeTransferFrom', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'safeTransferFrom', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bool', type: 'bool' }, - ], - name: 'setApprovalForAll', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'interfaceId', internalType: 'bytes4', type: 'bytes4' }], - name: 'supportsInterface', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'symbol', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - name: 'tokenIdOfAddress', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'tokenURI', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - ], - name: 'transferFrom', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export const optimistAddress = { - 10: '0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5', - 420: '0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export const optimistConfig = { - address: optimistAddress, - abi: optimistABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimistAllowlist -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - */ -export const optimistAllowlistABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - { name: '_allowlistAttestor', internalType: 'address', type: 'address' }, - { - name: '_coinbaseQuestAttestor', - internalType: 'address', - type: 'address', - }, - { name: '_optimistInviter', internalType: 'address', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ALLOWLIST_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'COINBASE_QUEST_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'COINBASE_QUEST_ELIGIBLE_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_CAN_MINT_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_INVITER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_claimer', internalType: 'address', type: 'address' }], - name: 'isAllowedToMint', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - */ -export const optimistAllowlistAddress = { - 10: '0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180', - 420: '0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - */ -export const optimistAllowlistConfig = { - address: optimistAllowlistAddress, - abi: optimistAllowlistABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimistInviter -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export const optimistInviterABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_inviteGranter', internalType: 'address', type: 'address' }, - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'issuer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'claimer', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'InviteClaimed', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'CAN_INVITE_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'CLAIMABLE_INVITE_TYPEHASH', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EIP712_VERSION', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'INVITE_GRANTER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_COMMITMENT_PERIOD', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_claimer', internalType: 'address', type: 'address' }, - { - name: '_claimableInvite', - internalType: 'struct OptimistInviter.ClaimableInvite', - type: 'tuple', - components: [ - { name: 'issuer', internalType: 'address', type: 'address' }, - { name: 'nonce', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: '_signature', internalType: 'bytes', type: 'bytes' }, - ], - name: 'claimInvite', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_commitment', internalType: 'bytes32', type: 'bytes32' }], - name: 'commitInvite', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'commitmentTimestamps', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'inviteCounts', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_accounts', internalType: 'address[]', type: 'address[]' }, - { name: '_inviteCount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setInviteCounts', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'usedNonces', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export const optimistInviterAddress = { - 10: '0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929', - 420: '0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export const optimistInviterConfig = { - address: optimistInviterAddress, - abi: optimistInviterABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PortalSender -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export const portalSenderABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_portal', - internalType: 'contract OptimismPortal', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PORTAL', - outputs: [ - { name: '', internalType: 'contract OptimismPortal', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'donate', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export const portalSenderAddress = { - 1: '0x0A893d9576b9cFD9EF78595963dc973238E78210', - 5: '0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export const portalSenderConfig = { - address: portalSenderAddress, - abi: portalSenderABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ProtocolVersions -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export const protocolVersionsABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'updateType', - internalType: 'enum ProtocolVersions.UpdateType', - type: 'uint8', - indexed: true, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'ConfigUpdate', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECOMMENDED_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'REQUIRED_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'VERSION', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_owner', internalType: 'address', type: 'address' }, - { name: '_required', internalType: 'ProtocolVersion', type: 'uint256' }, - { - name: '_recommended', - internalType: 'ProtocolVersion', - type: 'uint256', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'recommended', - outputs: [ - { name: 'out_', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'required', - outputs: [ - { name: 'out_', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_recommended', - internalType: 'ProtocolVersion', - type: 'uint256', - }, - ], - name: 'setRecommended', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_required', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - name: 'setRequired', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export const protocolVersionsAddress = { - 5: '0x0C24F5098774aA366827D667494e9F889f7cFc08', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export const protocolVersionsConfig = { - address: protocolVersionsAddress, - abi: protocolVersionsABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ProxyAdmin -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export const proxyAdminABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'addressManager', - outputs: [ - { name: '', internalType: 'contract AddressManager', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_newAdmin', internalType: 'address', type: 'address' }, - ], - name: 'changeProxyAdmin', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - ], - name: 'getProxyAdmin', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_proxy', internalType: 'address', type: 'address' }], - name: 'getProxyImplementation', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'implementationName', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'isUpgrading', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'proxyType', - outputs: [ - { name: '', internalType: 'enum ProxyAdmin.ProxyType', type: 'uint8' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_address', internalType: 'address', type: 'address' }, - ], - name: 'setAddress', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_address', - internalType: 'contract AddressManager', - type: 'address', - }, - ], - name: 'setAddressManager', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_address', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - ], - name: 'setImplementationName', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_address', internalType: 'address', type: 'address' }, - { - name: '_type', - internalType: 'enum ProxyAdmin.ProxyType', - type: 'uint8', - }, - ], - name: 'setProxyType', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_upgrading', internalType: 'bool', type: 'bool' }], - name: 'setUpgrading', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_implementation', internalType: 'address', type: 'address' }, - ], - name: 'upgrade', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_implementation', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'upgradeAndCall', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export const proxyAdminAddress = { - 1: '0x4200000000000000000000000000000000000018', - 5: '0x4200000000000000000000000000000000000018', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export const proxyAdminConfig = { - address: proxyAdminAddress, - abi: proxyAdminABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SchemaRegistry -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export const schemaRegistryABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { type: 'error', inputs: [], name: 'AlreadyExists' }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { - name: 'registerer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Registered', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'getSchema', - outputs: [ - { - name: '', - internalType: 'struct SchemaRecord', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'resolver', - internalType: 'contract ISchemaResolver', - type: 'address', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'schema', internalType: 'string', type: 'string' }, - ], - }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'schema', internalType: 'string', type: 'string' }, - { - name: 'resolver', - internalType: 'contract ISchemaResolver', - type: 'address', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - ], - name: 'register', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export const schemaRegistryAddress = { - 10: '0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13', - 420: '0x2545fa928d5d278cA75Fd47306e4a89096ff6403', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export const schemaRegistryConfig = { - address: schemaRegistryAddress, - abi: schemaRegistryABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SequencerFeeVault -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export const sequencerFeeVaultABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeWallet', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export const sequencerFeeVaultAddress = { - 420: '0x4200000000000000000000000000000000000011', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export const sequencerFeeVaultConfig = { - address: sequencerFeeVaultAddress, - abi: sequencerFeeVaultABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SystemConfig -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export const systemConfigABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'updateType', - internalType: 'enum SystemConfig.UpdateType', - type: 'uint8', - indexed: true, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'ConfigUpdate', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BATCH_INBOX_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_CROSS_DOMAIN_MESSENGER_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_ERC_721_BRIDGE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_STANDARD_BRIDGE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L2_OUTPUT_ORACLE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMISM_PORTAL_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'UNSAFE_BLOCK_SIGNER_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'VERSION', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batchInbox', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batcherHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'gasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_owner', internalType: 'address', type: 'address' }, - { name: '_overhead', internalType: 'uint256', type: 'uint256' }, - { name: '_scalar', internalType: 'uint256', type: 'uint256' }, - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_gasLimit', internalType: 'uint64', type: 'uint64' }, - { name: '_unsafeBlockSigner', internalType: 'address', type: 'address' }, - { - name: '_config', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { name: 'maxResourceLimit', internalType: 'uint32', type: 'uint32' }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { name: 'maximumBaseFee', internalType: 'uint128', type: 'uint128' }, - ], - }, - { name: '_startBlock', internalType: 'uint256', type: 'uint256' }, - { name: '_batchInbox', internalType: 'address', type: 'address' }, - { - name: '_addresses', - internalType: 'struct SystemConfig.Addresses', - type: 'tuple', - components: [ - { - name: 'l1CrossDomainMessenger', - internalType: 'address', - type: 'address', - }, - { name: 'l1ERC721Bridge', internalType: 'address', type: 'address' }, - { - name: 'l1StandardBridge', - internalType: 'address', - type: 'address', - }, - { name: 'l2OutputOracle', internalType: 'address', type: 'address' }, - { name: 'optimismPortal', internalType: 'address', type: 'address' }, - { - name: 'optimismMintableERC20Factory', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1CrossDomainMessenger', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1ERC721Bridge', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1StandardBridge', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracle', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'minimumGasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismMintableERC20Factory', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismPortal', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'overhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'resourceConfig', - outputs: [ - { - name: '', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { name: 'maxResourceLimit', internalType: 'uint32', type: 'uint32' }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { name: 'maximumBaseFee', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'scalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'setBatcherHash', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_overhead', internalType: 'uint256', type: 'uint256' }, - { name: '_scalar', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setGasConfig', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_gasLimit', internalType: 'uint64', type: 'uint64' }], - name: 'setGasLimit', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { name: 'maxResourceLimit', internalType: 'uint32', type: 'uint32' }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { name: 'maximumBaseFee', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - name: 'setResourceConfig', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_unsafeBlockSigner', internalType: 'address', type: 'address' }, - ], - name: 'setUnsafeBlockSigner', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startBlock', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'unsafeBlockSigner', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export const systemConfigAddress = { - 1: '0x229047fed2591dbec1eF1118d64F7aF3dB9EB290', - 5: '0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export const systemConfigConfig = { - address: systemConfigAddress, - abi: systemConfigABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SystemDictator -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export const systemDictatorABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EXIT_1_NO_RETURN_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PROXY_TRANSFER_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'config', - outputs: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - { - name: 'resourceConfig', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { - name: 'maxResourceLimit', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'minimumBaseFee', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'systemTxMaxGas', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'maximumBaseFee', - internalType: 'uint128', - type: 'uint128', - }, - ], - }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'currentStep', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'dynamicConfigSet', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'exit1', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'exited', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'finalize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct SystemDictator.DeployConfig', - type: 'tuple', - components: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - { - name: 'resourceConfig', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { - name: 'maxResourceLimit', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'minimumBaseFee', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'systemTxMaxGas', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'maximumBaseFee', - internalType: 'uint128', - type: 'uint128', - }, - ], - }, - ], - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracleDynamicConfig', - outputs: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'oldL1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismPortalDynamicConfig', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'phase1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'phase2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step3', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step4', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step5', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2OutputOracleDynamicConfig', - internalType: 'struct SystemDictator.L2OutputOracleDynamicConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - name: '_optimismPortalDynamicConfig', - internalType: 'bool', - type: 'bool', - }, - ], - name: 'updateDynamicConfig', - outputs: [], - }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export const systemDictatorAddress = { - 1: '0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export const systemDictatorConfig = { - address: systemDictatorAddress, - abi: systemDictatorABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SystemDictator_goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export const systemDictatorGoerliABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EXIT_1_NO_RETURN_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PROXY_TRANSFER_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'config', - outputs: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'currentStep', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'dynamicConfigSet', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'exit1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'finalize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct SystemDictator.DeployConfig', - type: 'tuple', - components: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracleDynamicConfig', - outputs: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'oldL1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step3', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step4', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step5', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step6', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2OutputOracleDynamicConfig', - internalType: 'struct SystemDictator.L2OutputOracleDynamicConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - ], - name: 'updateL2OutputOracleDynamicConfig', - outputs: [], - }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export const systemDictatorGoerliAddress = { - 5: '0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export const systemDictatorGoerliConfig = { - address: systemDictatorGoerliAddress, - abi: systemDictatorGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// TeleportrWithdrawer -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export const teleportrWithdrawerABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'data', - outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'recipient', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'setData', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - name: 'setRecipient', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_teleportr', internalType: 'address', type: 'address' }], - name: 'setTeleportr', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'teleportr', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdrawFromTeleportr', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export const teleportrWithdrawerAddress = { - 1: '0x78A25524D90E3D0596558fb43789bD800a5c3007', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export const teleportrWithdrawerConfig = { - address: teleportrWithdrawerAddress, - abi: teleportrWithdrawerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// eslintIgnore -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// addressesByContractByNetwork -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -export const addresses = { - AddressManager: { - '1': '0xdE1FCfB0851916CA5101820A69b13a4E276bd81F', - '5': '0xa6f73589243a6A7a9023b1Fa0651b1d89c177111', - }, - AssetReceiver: { - '1': '0x15DdA60616Ffca20371ED1659dBB78E888f65556', - '10': '0x15DdA60616Ffca20371ED1659dBB78E888f65556', - }, - AttestationStation: { - '10': '0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77', - '420': '0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77', - }, - BaseFeeVault: { '420': '0x4200000000000000000000000000000000000019' }, - CheckBalanceHigh: { - '1': '0x7eC64a8a591bFf829ff6C8be76074D540ACb813F', - '5': '0x7eC64a8a591bFf829ff6C8be76074D540ACb813F', - '420': '0x5d7103853f12109A7d27F118e54BbC654ad847E9', - }, - CheckBalanceLow: { - '1': '0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640', - '5': '0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640', - '420': '0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474', - }, - CheckGelatoLow: { - '1': '0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa', - '5': '0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa', - '420': '0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862', - }, - CheckTrue: { - '1': '0x5c741a38cb11424711231777D71689C458eE835D', - '5': '0x5c741a38cb11424711231777D71689C458eE835D', - '420': '0x47443D0C184e022F19BD1578F5bca6B8a9F58E32', - }, - Drippie: { '1': '0x44b3A2a040057eBafC601A78647e805fd58B1f50' }, - Drippie_goerli: { '5': '0x44b3A2a040057eBafC601A78647e805fd58B1f50' }, - 'Drippie_optimism-goerli': { - '420': '0x8D8d533C16D23847EB04EEB0925be8900Dd3af86', - }, - EAS: { - '10': '0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088', - '420': '0x5A633F1cc84B03F7588486CF2F386c102061E6e1', - }, - GasPriceOracle: { '420': '0x420000000000000000000000000000000000000F' }, - L1Block: { '420': '0x4200000000000000000000000000000000000015' }, - L1CrossDomainMessenger: { - '1': '0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1', - '5': '0x5086d1eEF304eb5284A0f6720f79403b4e9bE294', - }, - L1ERC721Bridge: { - '1': '0x5a7749f83b81B301cAb5f48EB8516B986DAef23D', - '5': '0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9', - }, - L1FeeVault: { '420': '0x420000000000000000000000000000000000001a' }, - L1StandardBridge: { - '1': '0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1', - '5': '0x636Af16bf2f682dD3109e60102b8E1A089FedAa8', - }, - L2CrossDomainMessenger: { - '420': '0x4200000000000000000000000000000000000007', - }, - L2ERC721Bridge: { '10': '0x4200000000000000000000000000000000000014' }, - 'L2ERC721Bridge_optimism-goerli': { - '420': '0x4200000000000000000000000000000000000014', - }, - L2OutputOracle: { - '1': '0xdfe97868233d1aa22e815a266982f2cf17685a27', - '5': '0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0', - }, - L2StandardBridge: { '420': '0x4200000000000000000000000000000000000010' }, - L2ToL1MessagePasser: { '420': '0x4200000000000000000000000000000000000016' }, - MintManager: { - '10': '0x5C4e7Ba1E219E47948e6e3F55019A647bA501005', - '420': '0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76', - }, - OptimismMintableERC20Factory: { - '1': '0x4200000000000000000000000000000000000012', - }, - OptimismMintableERC20Factory_goerli: { - '5': '0x4200000000000000000000000000000000000012', - }, - 'OptimismMintableERC20Factory_optimism-goerli': { - '420': '0x4200000000000000000000000000000000000012', - }, - OptimismMintableERC721Factory: { - '10': '0x4200000000000000000000000000000000000017', - }, - 'OptimismMintableERC721Factory_optimism-goerli': { - '420': '0x4200000000000000000000000000000000000017', - }, - OptimismPortal: { - '1': '0xbEb5Fc579115071764c7423A4f12eDde41f106Ed', - '5': '0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383', - }, - Optimist: { - '10': '0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5', - '420': '0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5', - }, - OptimistAllowlist: { - '10': '0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180', - '420': '0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180', - }, - OptimistInviter: { - '10': '0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929', - '420': '0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929', - }, - PortalSender: { - '1': '0x0A893d9576b9cFD9EF78595963dc973238E78210', - '5': '0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4', - }, - ProtocolVersions: { '5': '0x0C24F5098774aA366827D667494e9F889f7cFc08' }, - ProxyAdmin: { - '1': '0x4200000000000000000000000000000000000018', - '5': '0x4200000000000000000000000000000000000018', - }, - SchemaRegistry: { - '10': '0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13', - '420': '0x2545fa928d5d278cA75Fd47306e4a89096ff6403', - }, - SequencerFeeVault: { '420': '0x4200000000000000000000000000000000000011' }, - SystemConfig: { - '1': '0x229047fed2591dbec1eF1118d64F7aF3dB9EB290', - '5': '0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60', - }, - SystemDictator: { '1': '0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB' }, - SystemDictator_goerli: { '5': '0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971' }, - TeleportrWithdrawer: { '1': '0x78A25524D90E3D0596558fb43789bD800a5c3007' }, -} as const -export const predeploys = { - LegacyMessagePasser: { - address: '0x4200000000000000000000000000000000000000', - introduced: 'Legacy', - deprecated: true, - proxied: true, - }, - DeployerWhitelist: { - address: '0x4200000000000000000000000000000000000002', - introduced: 'Legacy', - deprecated: true, - proxied: true, - }, - LegacyERC20ETH: { - address: '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', - introduced: 'Legacy', - deprecated: true, - proxied: false, - }, - WETH9: { - address: '0x4200000000000000000000000000000000000006', - introduced: 'Legacy', - deprecated: false, - proxied: false, - }, - L2CrossDomainMessenger: { - address: '0x4200000000000000000000000000000000000007', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - L2StandardBridge: { - address: '0x4200000000000000000000000000000000000010', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - SequencerFeeVault: { - address: '0x4200000000000000000000000000000000000011', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - OptimismMintableERC20Factory: { - address: '0x4200000000000000000000000000000000000012', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - L1BlockNumber: { - address: '0x4200000000000000000000000000000000000013', - introduced: 'Legacy', - deprecated: true, - proxied: true, - }, - GasPriceOracle: { - address: '0x420000000000000000000000000000000000000F', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - GovernanceToken: { - address: '0x4200000000000000000000000000000000000042', - introduced: 'Legacy', - deprecated: false, - proxied: false, - }, - L1Block: { - address: '0x4200000000000000000000000000000000000015', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, - L2ToL1MessagePasser: { - address: '0x4200000000000000000000000000000000000016', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, - L2ERC721Bridge: { - address: '0x4200000000000000000000000000000000000014', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - OptimismMintableERC721Factory: { - address: '0x4200000000000000000000000000000000000017', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, - ProxyAdmin: { - address: '0x4200000000000000000000000000000000000018', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, - BaseFeeVault: { - address: '0x4200000000000000000000000000000000000019', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, - L1FeeVault: { - address: '0x420000000000000000000000000000000000001a', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// abisByContractByNetwork -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -export const abis = { - AddressManager: [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: '_name', - internalType: 'string', - type: 'string', - indexed: true, - }, - { - name: '_newAddress', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: '_oldAddress', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'AddressSet', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'getAddress', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_address', internalType: 'address', type: 'address' }, - ], - name: 'setAddress', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - ], - AssetReceiver: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'user', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'id', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, - ], - AttestationStation: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'creator', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'about', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'key', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { name: 'val', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'AttestationCreated', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_attestations', - internalType: 'struct AttestationStation.AttestationData[]', - type: 'tuple[]', - components: [ - { name: 'about', internalType: 'address', type: 'address' }, - { name: 'key', internalType: 'bytes32', type: 'bytes32' }, - { name: 'val', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - name: 'attest', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_about', internalType: 'address', type: 'address' }, - { name: '_key', internalType: 'bytes32', type: 'bytes32' }, - { name: '_val', internalType: 'bytes', type: 'bytes' }, - ], - name: 'attest', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'attestations', - outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - BaseFeeVault: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_recipient', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, - ], - CheckBalanceHigh: [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckBalanceHigh.Params', - type: 'tuple', - components: [ - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - ], - CheckBalanceLow: [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckBalanceLow.Params', - type: 'tuple', - components: [ - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - ], - CheckGelatoLow: [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckGelatoLow.Params', - type: 'tuple', - components: [ - { name: 'treasury', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - { name: 'recipient', internalType: 'address', type: 'address' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - ], - CheckTrue: [ - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - ], - Drippie: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { - name: 'name', - internalType: 'string', - type: 'string', - indexed: false, - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { - name: 'name', - internalType: 'string', - type: 'string', - indexed: false, - }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { - name: 'name', - internalType: 'string', - type: 'string', - indexed: false, - }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'user', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'id', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, - ], - Drippie_goerli: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { - name: 'name', - internalType: 'string', - type: 'string', - indexed: false, - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { - name: 'name', - internalType: 'string', - type: 'string', - indexed: false, - }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { - name: 'name', - internalType: 'string', - type: 'string', - indexed: false, - }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'user', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'id', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, - ], - 'Drippie_optimism-goerli': [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { - name: 'name', - internalType: 'string', - type: 'string', - indexed: false, - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { - name: 'name', - internalType: 'string', - type: 'string', - indexed: false, - }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { - name: 'name', - internalType: 'string', - type: 'string', - indexed: false, - }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'user', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'id', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, - ], - EAS: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { type: 'error', inputs: [], name: 'AccessDenied' }, - { type: 'error', inputs: [], name: 'AlreadyRevoked' }, - { type: 'error', inputs: [], name: 'AlreadyRevokedOffchain' }, - { type: 'error', inputs: [], name: 'AlreadyTimestamped' }, - { type: 'error', inputs: [], name: 'InsufficientValue' }, - { type: 'error', inputs: [], name: 'InvalidAttestation' }, - { type: 'error', inputs: [], name: 'InvalidAttestations' }, - { type: 'error', inputs: [], name: 'InvalidExpirationTime' }, - { type: 'error', inputs: [], name: 'InvalidLength' }, - { type: 'error', inputs: [], name: 'InvalidOffset' }, - { type: 'error', inputs: [], name: 'InvalidRegistry' }, - { type: 'error', inputs: [], name: 'InvalidRevocation' }, - { type: 'error', inputs: [], name: 'InvalidRevocations' }, - { type: 'error', inputs: [], name: 'InvalidSchema' }, - { type: 'error', inputs: [], name: 'InvalidSignature' }, - { type: 'error', inputs: [], name: 'InvalidVerifier' }, - { type: 'error', inputs: [], name: 'Irrevocable' }, - { type: 'error', inputs: [], name: 'NotFound' }, - { type: 'error', inputs: [], name: 'NotPayable' }, - { type: 'error', inputs: [], name: 'WrongSchema' }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'attester', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'uid', - internalType: 'bytes32', - type: 'bytes32', - indexed: false, - }, - { - name: 'schema', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'Attested', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'attester', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'uid', - internalType: 'bytes32', - type: 'bytes32', - indexed: false, - }, - { - name: 'schema', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'Revoked', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'revoker', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'data', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { - name: 'timestamp', - internalType: 'uint64', - type: 'uint64', - indexed: true, - }, - ], - name: 'RevokedOffchain', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'data', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { - name: 'timestamp', - internalType: 'uint64', - type: 'uint64', - indexed: true, - }, - ], - name: 'Timestamped', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'request', - internalType: 'struct AttestationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData', - type: 'tuple', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'attest', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'delegatedRequest', - internalType: 'struct DelegatedAttestationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData', - type: 'tuple', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signature', - internalType: 'struct EIP712Signature', - type: 'tuple', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'attester', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'attestByDelegation', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getAttestTypeHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'getAttestation', - outputs: [ - { - name: '', - internalType: 'struct Attestation', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { name: 'time', internalType: 'uint64', type: 'uint64' }, - { name: 'expirationTime', internalType: 'uint64', type: 'uint64' }, - { name: 'revocationTime', internalType: 'uint64', type: 'uint64' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'recipient', internalType: 'address', type: 'address' }, - { name: 'attester', internalType: 'address', type: 'address' }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'getDomainSeparator', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'getName', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'account', internalType: 'address', type: 'address' }], - name: 'getNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: 'revoker', internalType: 'address', type: 'address' }, - { name: 'data', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'getRevokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getRevokeTypeHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getSchemaRegistry', - outputs: [ - { name: '', internalType: 'contract ISchemaRegistry', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'getTimestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'isAttestationValid', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiRequests', - internalType: 'struct MultiAttestationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'multiAttest', - outputs: [{ name: '', internalType: 'bytes32[]', type: 'bytes32[]' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiDelegatedRequests', - internalType: 'struct MultiDelegatedAttestationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signatures', - internalType: 'struct EIP712Signature[]', - type: 'tuple[]', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'attester', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'multiAttestByDelegation', - outputs: [{ name: '', internalType: 'bytes32[]', type: 'bytes32[]' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiRequests', - internalType: 'struct MultiRevocationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'multiRevoke', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiDelegatedRequests', - internalType: 'struct MultiDelegatedRevocationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signatures', - internalType: 'struct EIP712Signature[]', - type: 'tuple[]', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'revoker', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'multiRevokeByDelegation', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32[]', type: 'bytes32[]' }], - name: 'multiRevokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32[]', type: 'bytes32[]' }], - name: 'multiTimestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'request', - internalType: 'struct RevocationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'revoke', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'delegatedRequest', - internalType: 'struct DelegatedRevocationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signature', - internalType: 'struct EIP712Signature', - type: 'tuple', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'revoker', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'revokeByDelegation', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'revokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'timestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - GasPriceOracle: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'DECIMALS', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'baseFee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'decimals', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'gasPrice', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'getL1Fee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'getL1GasUsed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1BaseFee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'overhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'scalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - L1Block: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'DEPOSITOR_ACCOUNT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'basefee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batcherHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'hash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeOverhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeScalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'number', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'sequenceNumber', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_number', internalType: 'uint64', type: 'uint64' }, - { name: '_timestamp', internalType: 'uint64', type: 'uint64' }, - { name: '_basefee', internalType: 'uint256', type: 'uint256' }, - { name: '_hash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_sequenceNumber', internalType: 'uint64', type: 'uint64' }, - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l1FeeOverhead', internalType: 'uint256', type: 'uint256' }, - { name: '_l1FeeScalar', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setL1BlockValues', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'timestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - L1CrossDomainMessenger: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'FailedRelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'RelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'message', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - { - name: 'messageNonce', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessageExtension1', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_CALLDATA_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_MESSENGER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PORTAL', - outputs: [ - { name: '', internalType: 'contract OptimismPortal', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CALL_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CONSTANT_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_GAS_CHECK_BUFFER', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_RESERVED_GAS', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'baseGas', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'failedMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_portal', - internalType: 'contract OptimismPortal', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'portal', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_nonce', internalType: 'uint256', type: 'uint256' }, - { name: '_sender', internalType: 'address', type: 'address' }, - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - ], - name: 'relayMessage', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'sendMessage', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'successfulMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'xDomainMessageSender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - ], - L1ERC721Bridge: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSENGER', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721To', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'uint256', type: 'uint256' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_messenger', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - L1FeeVault: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_recipient', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, - ], - L1StandardBridge: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20DepositInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20WithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHDepositInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHWithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSENGER', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_BRIDGE', - outputs: [ - { name: '', internalType: 'contract StandardBridge', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETHTo', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositETHTo', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC20', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeERC20Withdrawal', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeETHWithdrawal', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_messenger', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2TokenBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [ - { name: '', internalType: 'contract StandardBridge', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, - ], - L2CrossDomainMessenger: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_l1CrossDomainMessenger', - internalType: 'address', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'FailedRelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'RelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'message', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - { - name: 'messageNonce', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessageExtension1', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_CALLDATA_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_MESSENGER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CALL_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CONSTANT_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_GAS_CHECK_BUFFER', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_RESERVED_GAS', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'baseGas', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'failedMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_nonce', internalType: 'uint256', type: 'uint256' }, - { name: '_sender', internalType: 'address', type: 'address' }, - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - ], - name: 'relayMessage', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'sendMessage', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'successfulMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'xDomainMessageSender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - ], - L2ERC721Bridge: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_messenger', internalType: 'address', type: 'address' }, - { name: '_otherBridge', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeInitiated', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721To', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC721', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - 'L2ERC721Bridge_optimism-goerli': [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_messenger', internalType: 'address', type: 'address' }, - { name: '_otherBridge', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeInitiated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSENGER', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721To', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC721', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - L2OutputOracle: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_submissionInterval', - internalType: 'uint256', - type: 'uint256', - }, - { name: '_l2BlockTime', internalType: 'uint256', type: 'uint256' }, - { - name: '_finalizationPeriodSeconds', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'outputRoot', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { - name: 'l2OutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'l2BlockNumber', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'l1Timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'OutputProposed', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'prevNextOutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'newNextOutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'OutputsDeleted', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'CHALLENGER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'FINALIZATION_PERIOD_SECONDS', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L2_BLOCK_TIME', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PROPOSER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'SUBMISSION_INTERVAL', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'challenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'computeL2Timestamp', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'deleteL2Outputs', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalizationPeriodSeconds', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2Output', - outputs: [ - { - name: '', - internalType: 'struct Types.OutputProposal', - type: 'tuple', - components: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2BlockNumber', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2OutputAfter', - outputs: [ - { - name: '', - internalType: 'struct Types.OutputProposal', - type: 'tuple', - components: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2BlockNumber', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2OutputIndexAfter', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_startingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: '_startingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - { name: '_proposer', internalType: 'address', type: 'address' }, - { name: '_challenger', internalType: 'address', type: 'address' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2BlockTime', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'latestBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'latestOutputIndex', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'nextBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'nextOutputIndex', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - { name: '_l1BlockHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l1BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'proposeL2Output', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'proposer', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startingBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startingTimestamp', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'submissionInterval', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - L2StandardBridge: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_otherBridge', - internalType: 'address payable', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'DepositFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'WithdrawalInitiated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSENGER', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_BRIDGE', - outputs: [ - { name: '', internalType: 'contract StandardBridge', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETHTo', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC20', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeDeposit', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1TokenBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'withdraw', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'withdrawTo', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, - ], - L2ToL1MessagePasser: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nonce', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: false, - }, - ], - name: 'MessagePassed', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'WithdrawerBalanceBurnt', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'burn', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'initiateWithdrawal', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'sentMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, - ], - MintManager: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_upgrader', internalType: 'address', type: 'address' }, - { name: '_governanceToken', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'DENOMINATOR', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MINT_CAP', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MINT_PERIOD', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'governanceToken', - outputs: [ - { name: '', internalType: 'contract GovernanceToken', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_account', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'mint', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'mintPermittedAfter', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_newMintManager', internalType: 'address', type: 'address' }, - ], - name: 'upgrade', - outputs: [], - }, - ], - OptimismMintableERC20Factory: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_decimals', internalType: 'uint8', type: 'uint8' }, - ], - name: 'createOptimismMintableERC20WithDecimals', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - OptimismMintableERC20Factory_goerli: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_decimals', internalType: 'uint8', type: 'uint8' }, - ], - name: 'createOptimismMintableERC20WithDecimals', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - 'OptimismMintableERC20Factory_optimism-goerli': [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - OptimismMintableERC721Factory: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_bridge', internalType: 'address', type: 'address' }, - { name: '_remoteChainId', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC721Created', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC721', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'isOptimismMintableERC721', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'remoteChainId', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - 'OptimismMintableERC721Factory_optimism-goerli': [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_bridge', internalType: 'address', type: 'address' }, - { name: '_remoteChainId', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC721Created', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'REMOTE_CHAIN_ID', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC721', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'isOptimismMintableERC721', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - OptimismPortal: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Paused', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'opaqueData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'TransactionDeposited', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Unpaused', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { name: 'success', internalType: 'bool', type: 'bool', indexed: false }, - ], - name: 'WithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - ], - name: 'WithdrawalProven', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'GUARDIAN', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L2_ORACLE', - outputs: [ - { name: '', internalType: 'contract L2OutputOracle', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'SYSTEM_CONFIG', - outputs: [ - { name: '', internalType: 'contract SystemConfig', type: 'address' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_gasLimit', internalType: 'uint64', type: 'uint64' }, - { name: '_isCreation', internalType: 'bool', type: 'bool' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositTransaction', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [], - name: 'donateETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_tx', - internalType: 'struct Types.WithdrawalTransaction', - type: 'tuple', - components: [ - { name: 'nonce', internalType: 'uint256', type: 'uint256' }, - { name: 'sender', internalType: 'address', type: 'address' }, - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - { name: 'gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - name: 'finalizeWithdrawalTransaction', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'finalizedWithdrawals', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'guardian', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2Oracle', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { name: '_guardian', internalType: 'address', type: 'address' }, - { - name: '_systemConfig', - internalType: 'contract SystemConfig', - type: 'address', - }, - { name: '_paused', internalType: 'bool', type: 'bool' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'isOutputFinalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2Oracle', - outputs: [ - { name: '', internalType: 'contract L2OutputOracle', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2Sender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '_byteCount', internalType: 'uint64', type: 'uint64' }], - name: 'minimumGasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'params', - outputs: [ - { name: 'prevBaseFee', internalType: 'uint128', type: 'uint128' }, - { name: 'prevBoughtGas', internalType: 'uint64', type: 'uint64' }, - { name: 'prevBlockNum', internalType: 'uint64', type: 'uint64' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'pause', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'paused', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_tx', - internalType: 'struct Types.WithdrawalTransaction', - type: 'tuple', - components: [ - { name: 'nonce', internalType: 'uint256', type: 'uint256' }, - { name: 'sender', internalType: 'address', type: 'address' }, - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - { name: 'gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - { - name: '_outputRootProof', - internalType: 'struct Types.OutputRootProof', - type: 'tuple', - components: [ - { name: 'version', internalType: 'bytes32', type: 'bytes32' }, - { name: 'stateRoot', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'messagePasserStorageRoot', - internalType: 'bytes32', - type: 'bytes32', - }, - { - name: 'latestBlockhash', - internalType: 'bytes32', - type: 'bytes32', - }, - ], - }, - { name: '_withdrawalProof', internalType: 'bytes[]', type: 'bytes[]' }, - ], - name: 'proveWithdrawalTransaction', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'provenWithdrawals', - outputs: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2OutputIndex', internalType: 'uint128', type: 'uint128' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'systemConfig', - outputs: [ - { name: '', internalType: 'contract SystemConfig', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'unpause', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, - ], - Optimist: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_baseURIAttestor', internalType: 'address', type: 'address' }, - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - { - name: '_optimistAllowlist', - internalType: 'contract OptimistAllowlist', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'owner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'approved', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'Approval', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'owner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'operator', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'approved', - internalType: 'bool', - type: 'bool', - indexed: false, - }, - ], - name: 'ApprovalForAll', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'Transfer', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BASE_URI_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BASE_URI_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_ALLOWLIST', - outputs: [ - { - name: '', - internalType: 'contract OptimistAllowlist', - type: 'address', - }, - ], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'uint256', type: 'uint256' }, - ], - name: 'approve', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'owner', internalType: 'address', type: 'address' }], - name: 'balanceOf', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'baseURI', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'burn', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'getApproved', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'operator', internalType: 'address', type: 'address' }, - ], - name: 'isApprovedForAll', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_recipient', internalType: 'address', type: 'address' }, - ], - name: 'isOnAllowList', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_recipient', internalType: 'address', type: 'address' }, - ], - name: 'mint', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'name', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'ownerOf', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - ], - name: 'safeTransferFrom', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'safeTransferFrom', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bool', type: 'bool' }, - ], - name: 'setApprovalForAll', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'interfaceId', internalType: 'bytes4', type: 'bytes4' }], - name: 'supportsInterface', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'symbol', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - name: 'tokenIdOfAddress', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'tokenURI', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - ], - name: 'transferFrom', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - OptimistAllowlist: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - { - name: '_allowlistAttestor', - internalType: 'address', - type: 'address', - }, - { - name: '_coinbaseQuestAttestor', - internalType: 'address', - type: 'address', - }, - { name: '_optimistInviter', internalType: 'address', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ALLOWLIST_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'COINBASE_QUEST_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'COINBASE_QUEST_ELIGIBLE_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_CAN_MINT_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_INVITER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_claimer', internalType: 'address', type: 'address' }], - name: 'isAllowedToMint', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - OptimistInviter: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_inviteGranter', internalType: 'address', type: 'address' }, - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'issuer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'claimer', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'InviteClaimed', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'CAN_INVITE_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'CLAIMABLE_INVITE_TYPEHASH', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EIP712_VERSION', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'INVITE_GRANTER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_COMMITMENT_PERIOD', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_claimer', internalType: 'address', type: 'address' }, - { - name: '_claimableInvite', - internalType: 'struct OptimistInviter.ClaimableInvite', - type: 'tuple', - components: [ - { name: 'issuer', internalType: 'address', type: 'address' }, - { name: 'nonce', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: '_signature', internalType: 'bytes', type: 'bytes' }, - ], - name: 'claimInvite', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_commitment', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'commitInvite', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'commitmentTimestamps', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'inviteCounts', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_accounts', internalType: 'address[]', type: 'address[]' }, - { name: '_inviteCount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setInviteCounts', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'usedNonces', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - PortalSender: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_portal', - internalType: 'contract OptimismPortal', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PORTAL', - outputs: [ - { name: '', internalType: 'contract OptimismPortal', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'donate', - outputs: [], - }, - ], - ProtocolVersions: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'updateType', - internalType: 'enum ProtocolVersions.UpdateType', - type: 'uint8', - indexed: true, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'ConfigUpdate', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECOMMENDED_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'REQUIRED_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'VERSION', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_owner', internalType: 'address', type: 'address' }, - { name: '_required', internalType: 'ProtocolVersion', type: 'uint256' }, - { - name: '_recommended', - internalType: 'ProtocolVersion', - type: 'uint256', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'recommended', - outputs: [ - { name: 'out_', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'required', - outputs: [ - { name: 'out_', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_recommended', - internalType: 'ProtocolVersion', - type: 'uint256', - }, - ], - name: 'setRecommended', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_required', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - name: 'setRequired', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - ProxyAdmin: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'addressManager', - outputs: [ - { name: '', internalType: 'contract AddressManager', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_newAdmin', internalType: 'address', type: 'address' }, - ], - name: 'changeProxyAdmin', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - ], - name: 'getProxyAdmin', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_proxy', internalType: 'address', type: 'address' }], - name: 'getProxyImplementation', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'implementationName', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'isUpgrading', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'proxyType', - outputs: [ - { name: '', internalType: 'enum ProxyAdmin.ProxyType', type: 'uint8' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_address', internalType: 'address', type: 'address' }, - ], - name: 'setAddress', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_address', - internalType: 'contract AddressManager', - type: 'address', - }, - ], - name: 'setAddressManager', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_address', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - ], - name: 'setImplementationName', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_address', internalType: 'address', type: 'address' }, - { - name: '_type', - internalType: 'enum ProxyAdmin.ProxyType', - type: 'uint8', - }, - ], - name: 'setProxyType', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_upgrading', internalType: 'bool', type: 'bool' }], - name: 'setUpgrading', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_implementation', internalType: 'address', type: 'address' }, - ], - name: 'upgrade', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_implementation', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'upgradeAndCall', - outputs: [], - }, - ], - SchemaRegistry: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { type: 'error', inputs: [], name: 'AlreadyExists' }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'uid', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { - name: 'registerer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Registered', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'getSchema', - outputs: [ - { - name: '', - internalType: 'struct SchemaRecord', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'resolver', - internalType: 'contract ISchemaResolver', - type: 'address', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'schema', internalType: 'string', type: 'string' }, - ], - }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'schema', internalType: 'string', type: 'string' }, - { - name: 'resolver', - internalType: 'contract ISchemaResolver', - type: 'address', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - ], - name: 'register', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - SequencerFeeVault: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_recipient', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'to', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeWallet', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, - ], - SystemConfig: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'updateType', - internalType: 'enum SystemConfig.UpdateType', - type: 'uint8', - indexed: true, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'ConfigUpdate', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BATCH_INBOX_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_CROSS_DOMAIN_MESSENGER_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_ERC_721_BRIDGE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_STANDARD_BRIDGE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L2_OUTPUT_ORACLE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMISM_PORTAL_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'UNSAFE_BLOCK_SIGNER_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'VERSION', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batchInbox', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batcherHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'gasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_owner', internalType: 'address', type: 'address' }, - { name: '_overhead', internalType: 'uint256', type: 'uint256' }, - { name: '_scalar', internalType: 'uint256', type: 'uint256' }, - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: '_unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - { - name: '_config', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { - name: 'maxResourceLimit', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { - name: 'maximumBaseFee', - internalType: 'uint128', - type: 'uint128', - }, - ], - }, - { name: '_startBlock', internalType: 'uint256', type: 'uint256' }, - { name: '_batchInbox', internalType: 'address', type: 'address' }, - { - name: '_addresses', - internalType: 'struct SystemConfig.Addresses', - type: 'tuple', - components: [ - { - name: 'l1CrossDomainMessenger', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721Bridge', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridge', - internalType: 'address', - type: 'address', - }, - { - name: 'l2OutputOracle', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortal', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20Factory', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1CrossDomainMessenger', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1ERC721Bridge', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1StandardBridge', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracle', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'minimumGasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismMintableERC20Factory', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismPortal', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'overhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'resourceConfig', - outputs: [ - { - name: '', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { - name: 'maxResourceLimit', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { - name: 'maximumBaseFee', - internalType: 'uint128', - type: 'uint128', - }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'scalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'setBatcherHash', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_overhead', internalType: 'uint256', type: 'uint256' }, - { name: '_scalar', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setGasConfig', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_gasLimit', internalType: 'uint64', type: 'uint64' }], - name: 'setGasLimit', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { - name: 'maxResourceLimit', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { - name: 'maximumBaseFee', - internalType: 'uint128', - type: 'uint128', - }, - ], - }, - ], - name: 'setResourceConfig', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - ], - name: 'setUnsafeBlockSigner', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startBlock', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'unsafeBlockSigner', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - ], - SystemDictator: [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EXIT_1_NO_RETURN_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PROXY_TRANSFER_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'config', - outputs: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - { - name: 'resourceConfig', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { - name: 'maxResourceLimit', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'minimumBaseFee', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'systemTxMaxGas', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'maximumBaseFee', - internalType: 'uint128', - type: 'uint128', - }, - ], - }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'currentStep', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'dynamicConfigSet', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'exit1', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'exited', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'finalize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct SystemDictator.DeployConfig', - type: 'tuple', - components: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { - name: 'controller', - internalType: 'address', - type: 'address', - }, - { - name: 'finalOwner', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { - name: 'batcherHash', - internalType: 'bytes32', - type: 'bytes32', - }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - { - name: 'resourceConfig', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { - name: 'maxResourceLimit', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'minimumBaseFee', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'systemTxMaxGas', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'maximumBaseFee', - internalType: 'uint128', - type: 'uint128', - }, - ], - }, - ], - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracleDynamicConfig', - outputs: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'oldL1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismPortalDynamicConfig', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'phase1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'phase2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step3', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step4', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step5', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2OutputOracleDynamicConfig', - internalType: 'struct SystemDictator.L2OutputOracleDynamicConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - name: '_optimismPortalDynamicConfig', - internalType: 'bool', - type: 'bool', - }, - ], - name: 'updateDynamicConfig', - outputs: [], - }, - ], - SystemDictator_goerli: [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint8', - type: 'uint8', - indexed: false, - }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EXIT_1_NO_RETURN_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PROXY_TRANSFER_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'config', - outputs: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'currentStep', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'dynamicConfigSet', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'exit1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'finalize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct SystemDictator.DeployConfig', - type: 'tuple', - components: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { - name: 'controller', - internalType: 'address', - type: 'address', - }, - { - name: 'finalOwner', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { - name: 'batcherHash', - internalType: 'bytes32', - type: 'bytes32', - }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracleDynamicConfig', - outputs: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'oldL1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step3', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step4', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step5', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step6', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2OutputOracleDynamicConfig', - internalType: 'struct SystemDictator.L2OutputOracleDynamicConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - ], - name: 'updateL2OutputOracleDynamicConfig', - outputs: [], - }, - ], - TeleportrWithdrawer: [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'user', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'id', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'data', - outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'recipient', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'setData', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_recipient', internalType: 'address', type: 'address' }, - ], - name: 'setRecipient', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_teleportr', internalType: 'address', type: 'address' }, - ], - name: 'setTeleportr', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'teleportr', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdrawFromTeleportr', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, - ], -} as const diff --git a/packages/contracts-ts/src/react.ts b/packages/contracts-ts/src/react.ts deleted file mode 100644 index 268a9006bbc3..000000000000 --- a/packages/contracts-ts/src/react.ts +++ /dev/null @@ -1,12273 +0,0 @@ -import { - useNetwork, - useChainId, - useContractRead, - UseContractReadConfig, - useContractWrite, - Address, - UseContractWriteConfig, - useContractEvent, - UseContractEventConfig, -} from 'wagmi' -import { - ReadContractResult, - WriteContractMode, - PrepareWriteContractResult, -} from 'wagmi/actions' - -/* eslint-disable */ - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// AddressManager -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export const addressManagerABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { name: '_name', internalType: 'string', type: 'string', indexed: true }, - { - name: '_newAddress', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: '_oldAddress', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'AddressSet', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'getAddress', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_address', internalType: 'address', type: 'address' }, - ], - name: 'setAddress', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export const addressManagerAddress = { - 1: '0xdE1FCfB0851916CA5101820A69b13a4E276bd81F', - 5: '0xa6f73589243a6A7a9023b1Fa0651b1d89c177111', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export const addressManagerConfig = { - address: addressManagerAddress, - abi: addressManagerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// AssetReceiver -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export const assetReceiverABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export const assetReceiverAddress = { - 1: '0x15DdA60616Ffca20371ED1659dBB78E888f65556', - 10: '0x15DdA60616Ffca20371ED1659dBB78E888f65556', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export const assetReceiverConfig = { - address: assetReceiverAddress, - abi: assetReceiverABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// AttestationStation -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export const attestationStationABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'creator', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'about', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'key', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { name: 'val', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'AttestationCreated', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_attestations', - internalType: 'struct AttestationStation.AttestationData[]', - type: 'tuple[]', - components: [ - { name: 'about', internalType: 'address', type: 'address' }, - { name: 'key', internalType: 'bytes32', type: 'bytes32' }, - { name: 'val', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - name: 'attest', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_about', internalType: 'address', type: 'address' }, - { name: '_key', internalType: 'bytes32', type: 'bytes32' }, - { name: '_val', internalType: 'bytes', type: 'bytes' }, - ], - name: 'attest', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'attestations', - outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export const attestationStationAddress = { - 10: '0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77', - 420: '0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export const attestationStationConfig = { - address: attestationStationAddress, - abi: attestationStationABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// BaseFeeVault -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export const baseFeeVaultABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export const baseFeeVaultAddress = { - 420: '0x4200000000000000000000000000000000000019', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export const baseFeeVaultConfig = { - address: baseFeeVaultAddress, - abi: baseFeeVaultABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckBalanceHigh -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export const checkBalanceHighABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckBalanceHigh.Params', - type: 'tuple', - components: [ - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export const checkBalanceHighAddress = { - 1: '0x7eC64a8a591bFf829ff6C8be76074D540ACb813F', - 5: '0x7eC64a8a591bFf829ff6C8be76074D540ACb813F', - 420: '0x5d7103853f12109A7d27F118e54BbC654ad847E9', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export const checkBalanceHighConfig = { - address: checkBalanceHighAddress, - abi: checkBalanceHighABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckBalanceLow -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export const checkBalanceLowABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckBalanceLow.Params', - type: 'tuple', - components: [ - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export const checkBalanceLowAddress = { - 1: '0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640', - 5: '0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640', - 420: '0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export const checkBalanceLowConfig = { - address: checkBalanceLowAddress, - abi: checkBalanceLowABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckGelatoLow -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export const checkGelatoLowABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'params', - internalType: 'struct CheckGelatoLow.Params', - type: 'tuple', - components: [ - { name: 'treasury', internalType: 'address', type: 'address' }, - { name: 'threshold', internalType: 'uint256', type: 'uint256' }, - { name: 'recipient', internalType: 'address', type: 'address' }, - ], - indexed: false, - }, - ], - name: '_EventToExposeStructInABI__Params', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_params', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export const checkGelatoLowAddress = { - 1: '0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa', - 5: '0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa', - 420: '0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export const checkGelatoLowConfig = { - address: checkGelatoLowAddress, - abi: checkGelatoLowABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CheckTrue -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x47443D0C184e022F19BD1578F5bca6B8a9F58E32) - */ -export const checkTrueABI = [ - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - name: 'check', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x47443D0C184e022F19BD1578F5bca6B8a9F58E32) - */ -export const checkTrueAddress = { - 1: '0x5c741a38cb11424711231777D71689C458eE835D', - 5: '0x5c741a38cb11424711231777D71689C458eE835D', - 420: '0x47443D0C184e022F19BD1578F5bca6B8a9F58E32', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x47443D0C184e022F19BD1578F5bca6B8a9F58E32) - */ -export const checkTrueConfig = { - address: checkTrueAddress, - abi: checkTrueABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Drippie -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieAddress = { - 1: '0x44b3A2a040057eBafC601A78647e805fd58B1f50', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieConfig = { - address: drippieAddress, - abi: drippieABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Drippie_goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'reentrant', internalType: 'bool', type: 'bool' }, - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieGoerliAddress = { - 5: '0x44b3A2a040057eBafC601A78647e805fd58B1f50', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export const drippieGoerliConfig = { - address: drippieGoerliAddress, - abi: drippieGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Drippie_optimism-goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export const drippieOptimismGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - indexed: false, - }, - ], - name: 'DripCreated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'executor', - internalType: 'address', - type: 'address', - indexed: false, - }, - { - name: 'timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'DripExecuted', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nameref', - internalType: 'string', - type: 'string', - indexed: true, - }, - { name: 'name', internalType: 'string', type: 'string', indexed: false }, - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - indexed: false, - }, - ], - name: 'DripStatusUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'create', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'drip', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'string', type: 'string' }], - name: 'drips', - outputs: [ - { - name: 'status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - { - name: 'config', - internalType: 'struct Drippie.DripConfig', - type: 'tuple', - components: [ - { name: 'interval', internalType: 'uint256', type: 'uint256' }, - { - name: 'dripcheck', - internalType: 'contract IDripCheck', - type: 'address', - }, - { name: 'checkparams', internalType: 'bytes', type: 'bytes' }, - { - name: 'actions', - internalType: 'struct Drippie.DripAction[]', - type: 'tuple[]', - components: [ - { - name: 'target', - internalType: 'address payable', - type: 'address', - }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - { name: 'last', internalType: 'uint256', type: 'uint256' }, - { name: 'count', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'executable', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { - name: '_status', - internalType: 'enum Drippie.DripStatus', - type: 'uint8', - }, - ], - name: 'status', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export const drippieOptimismGoerliAddress = { - 420: '0x8D8d533C16D23847EB04EEB0925be8900Dd3af86', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export const drippieOptimismGoerliConfig = { - address: drippieOptimismGoerliAddress, - abi: drippieOptimismGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// EAS -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export const easABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { type: 'error', inputs: [], name: 'AccessDenied' }, - { type: 'error', inputs: [], name: 'AlreadyRevoked' }, - { type: 'error', inputs: [], name: 'AlreadyRevokedOffchain' }, - { type: 'error', inputs: [], name: 'AlreadyTimestamped' }, - { type: 'error', inputs: [], name: 'InsufficientValue' }, - { type: 'error', inputs: [], name: 'InvalidAttestation' }, - { type: 'error', inputs: [], name: 'InvalidAttestations' }, - { type: 'error', inputs: [], name: 'InvalidExpirationTime' }, - { type: 'error', inputs: [], name: 'InvalidLength' }, - { type: 'error', inputs: [], name: 'InvalidOffset' }, - { type: 'error', inputs: [], name: 'InvalidRegistry' }, - { type: 'error', inputs: [], name: 'InvalidRevocation' }, - { type: 'error', inputs: [], name: 'InvalidRevocations' }, - { type: 'error', inputs: [], name: 'InvalidSchema' }, - { type: 'error', inputs: [], name: 'InvalidSignature' }, - { type: 'error', inputs: [], name: 'InvalidVerifier' }, - { type: 'error', inputs: [], name: 'Irrevocable' }, - { type: 'error', inputs: [], name: 'NotFound' }, - { type: 'error', inputs: [], name: 'NotPayable' }, - { type: 'error', inputs: [], name: 'WrongSchema' }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'attester', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'uid', internalType: 'bytes32', type: 'bytes32', indexed: false }, - { - name: 'schema', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'Attested', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'attester', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'uid', internalType: 'bytes32', type: 'bytes32', indexed: false }, - { - name: 'schema', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'Revoked', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'revoker', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'data', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { - name: 'timestamp', - internalType: 'uint64', - type: 'uint64', - indexed: true, - }, - ], - name: 'RevokedOffchain', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'data', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { - name: 'timestamp', - internalType: 'uint64', - type: 'uint64', - indexed: true, - }, - ], - name: 'Timestamped', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'request', - internalType: 'struct AttestationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData', - type: 'tuple', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'attest', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'delegatedRequest', - internalType: 'struct DelegatedAttestationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData', - type: 'tuple', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signature', - internalType: 'struct EIP712Signature', - type: 'tuple', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'attester', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'attestByDelegation', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getAttestTypeHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'getAttestation', - outputs: [ - { - name: '', - internalType: 'struct Attestation', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { name: 'time', internalType: 'uint64', type: 'uint64' }, - { name: 'expirationTime', internalType: 'uint64', type: 'uint64' }, - { name: 'revocationTime', internalType: 'uint64', type: 'uint64' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'recipient', internalType: 'address', type: 'address' }, - { name: 'attester', internalType: 'address', type: 'address' }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'getDomainSeparator', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'getName', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'account', internalType: 'address', type: 'address' }], - name: 'getNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: 'revoker', internalType: 'address', type: 'address' }, - { name: 'data', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'getRevokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getRevokeTypeHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'getSchemaRegistry', - outputs: [ - { name: '', internalType: 'contract ISchemaRegistry', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'getTimestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'isAttestationValid', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiRequests', - internalType: 'struct MultiAttestationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'multiAttest', - outputs: [{ name: '', internalType: 'bytes32[]', type: 'bytes32[]' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiDelegatedRequests', - internalType: 'struct MultiDelegatedAttestationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct AttestationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'recipient', internalType: 'address', type: 'address' }, - { - name: 'expirationTime', - internalType: 'uint64', - type: 'uint64', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'refUID', internalType: 'bytes32', type: 'bytes32' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signatures', - internalType: 'struct EIP712Signature[]', - type: 'tuple[]', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'attester', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'multiAttestByDelegation', - outputs: [{ name: '', internalType: 'bytes32[]', type: 'bytes32[]' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiRequests', - internalType: 'struct MultiRevocationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'multiRevoke', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'multiDelegatedRequests', - internalType: 'struct MultiDelegatedRevocationRequest[]', - type: 'tuple[]', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData[]', - type: 'tuple[]', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signatures', - internalType: 'struct EIP712Signature[]', - type: 'tuple[]', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'revoker', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'multiRevokeByDelegation', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32[]', type: 'bytes32[]' }], - name: 'multiRevokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32[]', type: 'bytes32[]' }], - name: 'multiTimestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'request', - internalType: 'struct RevocationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - ], - }, - ], - name: 'revoke', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { - name: 'delegatedRequest', - internalType: 'struct DelegatedRevocationRequest', - type: 'tuple', - components: [ - { name: 'schema', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'data', - internalType: 'struct RevocationRequestData', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - name: 'signature', - internalType: 'struct EIP712Signature', - type: 'tuple', - components: [ - { name: 'v', internalType: 'uint8', type: 'uint8' }, - { name: 'r', internalType: 'bytes32', type: 'bytes32' }, - { name: 's', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: 'revoker', internalType: 'address', type: 'address' }, - ], - }, - ], - name: 'revokeByDelegation', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'revokeOffchain', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'data', internalType: 'bytes32', type: 'bytes32' }], - name: 'timestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export const easAddress = { - 10: '0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088', - 420: '0x5A633F1cc84B03F7588486CF2F386c102061E6e1', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export const easConfig = { address: easAddress, abi: easABI } as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// GasPriceOracle -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000000F) - */ -export const gasPriceOracleABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'baseFee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [], - name: 'decimals', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'gasPrice', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'getL1Fee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'getL1GasUsed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1BaseFee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'overhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'scalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000000F) - */ -export const gasPriceOracleAddress = { - 420: '0x420000000000000000000000000000000000000F', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000000F) - */ -export const gasPriceOracleConfig = { - address: gasPriceOracleAddress, - abi: gasPriceOracleABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1Block -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export const l1BlockABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'DEPOSITOR_ACCOUNT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'basefee', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batcherHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'hash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeOverhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeScalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'number', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'sequenceNumber', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_number', internalType: 'uint64', type: 'uint64' }, - { name: '_timestamp', internalType: 'uint64', type: 'uint64' }, - { name: '_basefee', internalType: 'uint256', type: 'uint256' }, - { name: '_hash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_sequenceNumber', internalType: 'uint64', type: 'uint64' }, - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l1FeeOverhead', internalType: 'uint256', type: 'uint256' }, - { name: '_l1FeeScalar', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setL1BlockValues', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'timestamp', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export const l1BlockAddress = { - 420: '0x4200000000000000000000000000000000000015', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export const l1BlockConfig = { - address: l1BlockAddress, - abi: l1BlockABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1CrossDomainMessenger -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export const l1CrossDomainMessengerABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'FailedRelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'RelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: false, - }, - { name: 'message', internalType: 'bytes', type: 'bytes', indexed: false }, - { - name: 'messageNonce', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessageExtension1', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_CALLDATA_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_MESSENGER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CALL_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CONSTANT_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_GAS_CHECK_BUFFER', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_RESERVED_GAS', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'baseGas', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'failedMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_portal', - internalType: 'contract OptimismPortal', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'portal', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_nonce', internalType: 'uint256', type: 'uint256' }, - { name: '_sender', internalType: 'address', type: 'address' }, - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - ], - name: 'relayMessage', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'sendMessage', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'successfulMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'xDomainMessageSender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export const l1CrossDomainMessengerAddress = { - 1: '0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1', - 5: '0x5086d1eEF304eb5284A0f6720f79403b4e9bE294', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export const l1CrossDomainMessengerConfig = { - address: l1CrossDomainMessengerAddress, - abi: l1CrossDomainMessengerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1ERC721Bridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export const l1Erc721BridgeABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721To', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'uint256', type: 'uint256' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_messenger', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export const l1Erc721BridgeAddress = { - 1: '0x5a7749f83b81B301cAb5f48EB8516B986DAef23D', - 5: '0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export const l1Erc721BridgeConfig = { - address: l1Erc721BridgeAddress, - abi: l1Erc721BridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1FeeVault -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export const l1FeeVaultABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export const l1FeeVaultAddress = { - 420: '0x420000000000000000000000000000000000001A', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export const l1FeeVaultConfig = { - address: l1FeeVaultAddress, - abi: l1FeeVaultABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L1StandardBridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export const l1StandardBridgeABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20DepositInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20WithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHDepositInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHWithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETHTo', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositETHTo', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC20', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeERC20Withdrawal', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeETHWithdrawal', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_messenger', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2TokenBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [ - { name: '', internalType: 'contract StandardBridge', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export const l1StandardBridgeAddress = { - 1: '0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1', - 5: '0x636Af16bf2f682dD3109e60102b8E1A089FedAa8', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export const l1StandardBridgeConfig = { - address: l1StandardBridgeAddress, - abi: l1StandardBridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2CrossDomainMessenger -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export const l2CrossDomainMessengerABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_l1CrossDomainMessenger', - internalType: 'address', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'FailedRelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'msgHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - ], - name: 'RelayedMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: false, - }, - { name: 'message', internalType: 'bytes', type: 'bytes', indexed: false }, - { - name: 'messageNonce', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessage', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'SentMessageExtension1', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_CALLDATA_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_MESSENGER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CALL_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_CONSTANT_OVERHEAD', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_GAS_CHECK_BUFFER', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RELAY_RESERVED_GAS', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'baseGas', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'failedMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_nonce', internalType: 'uint256', type: 'uint256' }, - { name: '_sender', internalType: 'address', type: 'address' }, - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - ], - name: 'relayMessage', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_message', internalType: 'bytes', type: 'bytes' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - ], - name: 'sendMessage', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'successfulMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'xDomainMessageSender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export const l2CrossDomainMessengerAddress = { - 420: '0x4200000000000000000000000000000000000007', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export const l2CrossDomainMessengerConfig = { - address: l2CrossDomainMessengerAddress, - abi: l2CrossDomainMessengerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2ERC721Bridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_messenger', internalType: 'address', type: 'address' }, - { name: '_otherBridge', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC721BridgeInitiated', - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC721To', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_tokenId', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC721', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'otherBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeAddress = { - 10: '0x4200000000000000000000000000000000000014', - 420: '0x4200000000000000000000000000000000000014', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export const l2Erc721BridgeConfig = { - address: l2Erc721BridgeAddress, - abi: l2Erc721BridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2OutputOracle -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export const l2OutputOracleABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_submissionInterval', internalType: 'uint256', type: 'uint256' }, - { name: '_l2BlockTime', internalType: 'uint256', type: 'uint256' }, - { - name: '_finalizationPeriodSeconds', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'outputRoot', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { - name: 'l2OutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'l2BlockNumber', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'l1Timestamp', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'OutputProposed', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'prevNextOutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'newNextOutputIndex', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'OutputsDeleted', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'challenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'computeL2Timestamp', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'deleteL2Outputs', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalizationPeriodSeconds', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2Output', - outputs: [ - { - name: '', - internalType: 'struct Types.OutputProposal', - type: 'tuple', - components: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2BlockNumber', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2OutputAfter', - outputs: [ - { - name: '', - internalType: 'struct Types.OutputProposal', - type: 'tuple', - components: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2BlockNumber', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'getL2OutputIndexAfter', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_startingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { name: '_startingTimestamp', internalType: 'uint256', type: 'uint256' }, - { name: '_proposer', internalType: 'address', type: 'address' }, - { name: '_challenger', internalType: 'address', type: 'address' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2BlockTime', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'latestBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'latestOutputIndex', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'nextBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'nextOutputIndex', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l2BlockNumber', internalType: 'uint256', type: 'uint256' }, - { name: '_l1BlockHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_l1BlockNumber', internalType: 'uint256', type: 'uint256' }, - ], - name: 'proposeL2Output', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'proposer', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startingBlockNumber', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startingTimestamp', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'submissionInterval', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export const l2OutputOracleAddress = { - 1: '0xdfe97868233d1aa22e815a266982f2cf17685a27', - 5: '0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export const l2OutputOracleConfig = { - address: l2OutputOracleAddress, - abi: l2OutputOracleABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2StandardBridge -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export const l2StandardBridgeABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_otherBridge', - internalType: 'address payable', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'DepositFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ERC20BridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'ETHBridgeInitiated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'l1Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'l2Token', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'extraData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'WithdrawalInitiated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OTHER_BRIDGE', - outputs: [ - { name: '', internalType: 'contract StandardBridge', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeERC20To', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'bridgeETHTo', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'address', type: 'address' }, - ], - name: 'deposits', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_localToken', internalType: 'address', type: 'address' }, - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeERC20', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeBridgeETH', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l1Token', internalType: 'address', type: 'address' }, - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_from', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'finalizeDeposit', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1TokenBridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messenger', - outputs: [ - { - name: '', - internalType: 'contract CrossDomainMessenger', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'withdraw', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_l2Token', internalType: 'address', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - { name: '_minGasLimit', internalType: 'uint32', type: 'uint32' }, - { name: '_extraData', internalType: 'bytes', type: 'bytes' }, - ], - name: 'withdrawTo', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export const l2StandardBridgeAddress = { - 420: '0x4200000000000000000000000000000000000010', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export const l2StandardBridgeConfig = { - address: l2StandardBridgeAddress, - abi: l2StandardBridgeABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// L2ToL1MessagePasser -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export const l2ToL1MessagePasserABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'nonce', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'sender', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'target', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { - name: 'gasLimit', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: false, - }, - ], - name: 'MessagePassed', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'WithdrawerBalanceBurnt', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MESSAGE_VERSION', - outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'burn', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'initiateWithdrawal', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'messageNonce', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'sentMessages', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export const l2ToL1MessagePasserAddress = { - 420: '0x4200000000000000000000000000000000000016', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export const l2ToL1MessagePasserConfig = { - address: l2ToL1MessagePasserAddress, - abi: l2ToL1MessagePasserABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// MintManager -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export const mintManagerABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_upgrader', internalType: 'address', type: 'address' }, - { name: '_governanceToken', internalType: 'address', type: 'address' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'DENOMINATOR', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MINT_CAP', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MINT_PERIOD', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'governanceToken', - outputs: [ - { name: '', internalType: 'contract GovernanceToken', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_account', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'mint', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'mintPermittedAfter', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_newMintManager', internalType: 'address', type: 'address' }, - ], - name: 'upgrade', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export const mintManagerAddress = { - 10: '0x5C4e7Ba1E219E47948e6e3F55019A647bA501005', - 420: '0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export const mintManagerConfig = { - address: mintManagerAddress, - abi: mintManagerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC20Factory -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_decimals', internalType: 'uint8', type: 'uint8' }, - ], - name: 'createOptimismMintableERC20WithDecimals', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryAddress = { - 1: '0x4200000000000000000000000000000000000012', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryConfig = { - address: optimismMintableErc20FactoryAddress, - abi: optimismMintableErc20FactoryABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC20Factory_goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryGoerliABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_decimals', internalType: 'uint8', type: 'uint8' }, - ], - name: 'createOptimismMintableERC20WithDecimals', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryGoerliAddress = { - 5: '0x4200000000000000000000000000000000000012', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryGoerliConfig = { - address: optimismMintableErc20FactoryGoerliAddress, - abi: optimismMintableErc20FactoryGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC20Factory_optimism-goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryOptimismGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_bridge', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC20Created', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'StandardL2TokenCreated', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC20', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createStandardL2Token', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryOptimismGoerliAddress = { - 420: '0x4200000000000000000000000000000000000012', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export const optimismMintableErc20FactoryOptimismGoerliConfig = { - address: optimismMintableErc20FactoryOptimismGoerliAddress, - abi: optimismMintableErc20FactoryOptimismGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC721Factory -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_bridge', internalType: 'address', type: 'address' }, - { name: '_remoteChainId', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC721Created', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'bridge', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC721', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'isOptimismMintableERC721', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'remoteChainId', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryAddress = { - 10: '0x4200000000000000000000000000000000000017', -} as const - -/** - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryConfig = { - address: optimismMintableErc721FactoryAddress, - abi: optimismMintableErc721FactoryABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismMintableERC721Factory_optimism-goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryOptimismGoerliABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_bridge', internalType: 'address', type: 'address' }, - { name: '_remoteChainId', internalType: 'uint256', type: 'uint256' }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'localToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'remoteToken', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'deployer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'OptimismMintableERC721Created', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BRIDGE', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'REMOTE_CHAIN_ID', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_remoteToken', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'createOptimismMintableERC721', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'isOptimismMintableERC721', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryOptimismGoerliAddress = { - 420: '0x4200000000000000000000000000000000000017', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export const optimismMintableErc721FactoryOptimismGoerliConfig = { - address: optimismMintableErc721FactoryOptimismGoerliAddress, - abi: optimismMintableErc721FactoryOptimismGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimismPortal -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export const optimismPortalABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Paused', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'opaqueData', - internalType: 'bytes', - type: 'bytes', - indexed: false, - }, - ], - name: 'TransactionDeposited', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Unpaused', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { name: 'success', internalType: 'bool', type: 'bool', indexed: false }, - ], - name: 'WithdrawalFinalized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawalHash', - internalType: 'bytes32', - type: 'bytes32', - indexed: true, - }, - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - ], - name: 'WithdrawalProven', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - { name: '_gasLimit', internalType: 'uint64', type: 'uint64' }, - { name: '_isCreation', internalType: 'bool', type: 'bool' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'depositTransaction', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [], - name: 'donateETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_tx', - internalType: 'struct Types.WithdrawalTransaction', - type: 'tuple', - components: [ - { name: 'nonce', internalType: 'uint256', type: 'uint256' }, - { name: 'sender', internalType: 'address', type: 'address' }, - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - { name: 'gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - ], - name: 'finalizeWithdrawalTransaction', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'finalizedWithdrawals', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'guardian', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2Oracle', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { name: '_guardian', internalType: 'address', type: 'address' }, - { - name: '_systemConfig', - internalType: 'contract SystemConfig', - type: 'address', - }, - { name: '_paused', internalType: 'bool', type: 'bool' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - ], - name: 'isOutputFinalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2Oracle', - outputs: [ - { name: '', internalType: 'contract L2OutputOracle', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2Sender', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '_byteCount', internalType: 'uint64', type: 'uint64' }], - name: 'minimumGasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'params', - outputs: [ - { name: 'prevBaseFee', internalType: 'uint128', type: 'uint128' }, - { name: 'prevBoughtGas', internalType: 'uint64', type: 'uint64' }, - { name: 'prevBlockNum', internalType: 'uint64', type: 'uint64' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'pause', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'paused', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_tx', - internalType: 'struct Types.WithdrawalTransaction', - type: 'tuple', - components: [ - { name: 'nonce', internalType: 'uint256', type: 'uint256' }, - { name: 'sender', internalType: 'address', type: 'address' }, - { name: 'target', internalType: 'address', type: 'address' }, - { name: 'value', internalType: 'uint256', type: 'uint256' }, - { name: 'gasLimit', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - }, - { name: '_l2OutputIndex', internalType: 'uint256', type: 'uint256' }, - { - name: '_outputRootProof', - internalType: 'struct Types.OutputRootProof', - type: 'tuple', - components: [ - { name: 'version', internalType: 'bytes32', type: 'bytes32' }, - { name: 'stateRoot', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'messagePasserStorageRoot', - internalType: 'bytes32', - type: 'bytes32', - }, - { name: 'latestBlockhash', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: '_withdrawalProof', internalType: 'bytes[]', type: 'bytes[]' }, - ], - name: 'proveWithdrawalTransaction', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'provenWithdrawals', - outputs: [ - { name: 'outputRoot', internalType: 'bytes32', type: 'bytes32' }, - { name: 'timestamp', internalType: 'uint128', type: 'uint128' }, - { name: 'l2OutputIndex', internalType: 'uint128', type: 'uint128' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'systemConfig', - outputs: [ - { name: '', internalType: 'contract SystemConfig', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'unpause', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export const optimismPortalAddress = { - 1: '0xbEb5Fc579115071764c7423A4f12eDde41f106Ed', - 5: '0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export const optimismPortalConfig = { - address: optimismPortalAddress, - abi: optimismPortalABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Optimist -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export const optimistABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - { name: '_baseURIAttestor', internalType: 'address', type: 'address' }, - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - { - name: '_optimistAllowlist', - internalType: 'contract OptimistAllowlist', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'owner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'approved', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'Approval', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'owner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'operator', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'approved', internalType: 'bool', type: 'bool', indexed: false }, - ], - name: 'ApprovalForAll', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { name: 'to', internalType: 'address', type: 'address', indexed: true }, - { - name: 'tokenId', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - ], - name: 'Transfer', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BASE_URI_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BASE_URI_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_ALLOWLIST', - outputs: [ - { name: '', internalType: 'contract OptimistAllowlist', type: 'address' }, - ], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'uint256', type: 'uint256' }, - ], - name: 'approve', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'owner', internalType: 'address', type: 'address' }], - name: 'balanceOf', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'baseURI', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'burn', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'getApproved', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_symbol', internalType: 'string', type: 'string' }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'operator', internalType: 'address', type: 'address' }, - ], - name: 'isApprovedForAll', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - name: 'isOnAllowList', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - name: 'mint', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'name', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'ownerOf', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - ], - name: 'safeTransferFrom', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - { name: 'data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'safeTransferFrom', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bool', type: 'bool' }, - ], - name: 'setApprovalForAll', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'interfaceId', internalType: 'bytes4', type: 'bytes4' }], - name: 'supportsInterface', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'symbol', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'pure', - type: 'function', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - name: 'tokenIdOfAddress', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_tokenId', internalType: 'uint256', type: 'uint256' }], - name: 'tokenURI', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'from', internalType: 'address', type: 'address' }, - { name: 'to', internalType: 'address', type: 'address' }, - { name: 'tokenId', internalType: 'uint256', type: 'uint256' }, - ], - name: 'transferFrom', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export const optimistAddress = { - 10: '0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5', - 420: '0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export const optimistConfig = { - address: optimistAddress, - abi: optimistABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimistAllowlist -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - */ -export const optimistAllowlistABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - { name: '_allowlistAttestor', internalType: 'address', type: 'address' }, - { - name: '_coinbaseQuestAttestor', - internalType: 'address', - type: 'address', - }, - { name: '_optimistInviter', internalType: 'address', type: 'address' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ALLOWLIST_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'COINBASE_QUEST_ATTESTOR', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'COINBASE_QUEST_ELIGIBLE_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_CAN_MINT_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMIST_INVITER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_claimer', internalType: 'address', type: 'address' }], - name: 'isAllowedToMint', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - */ -export const optimistAllowlistAddress = { - 10: '0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180', - 420: '0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - */ -export const optimistAllowlistConfig = { - address: optimistAllowlistAddress, - abi: optimistAllowlistABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// OptimistInviter -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export const optimistInviterABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { name: '_inviteGranter', internalType: 'address', type: 'address' }, - { - name: '_attestationStation', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'issuer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'claimer', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'InviteClaimed', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'ATTESTATION_STATION', - outputs: [ - { - name: '', - internalType: 'contract AttestationStation', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'CAN_INVITE_ATTESTATION_KEY', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'CLAIMABLE_INVITE_TYPEHASH', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EIP712_VERSION', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'INVITE_GRANTER', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_COMMITMENT_PERIOD', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_claimer', internalType: 'address', type: 'address' }, - { - name: '_claimableInvite', - internalType: 'struct OptimistInviter.ClaimableInvite', - type: 'tuple', - components: [ - { name: 'issuer', internalType: 'address', type: 'address' }, - { name: 'nonce', internalType: 'bytes32', type: 'bytes32' }, - ], - }, - { name: '_signature', internalType: 'bytes', type: 'bytes' }, - ], - name: 'claimInvite', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_commitment', internalType: 'bytes32', type: 'bytes32' }], - name: 'commitInvite', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - name: 'commitmentTimestamps', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_name', internalType: 'string', type: 'string' }], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'inviteCounts', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_accounts', internalType: 'address[]', type: 'address[]' }, - { name: '_inviteCount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setInviteCounts', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '', internalType: 'address', type: 'address' }, - { name: '', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'usedNonces', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export const optimistInviterAddress = { - 10: '0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929', - 420: '0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export const optimistInviterConfig = { - address: optimistInviterAddress, - abi: optimistInviterABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PortalSender -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export const portalSenderABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [ - { - name: '_portal', - internalType: 'contract OptimismPortal', - type: 'address', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PORTAL', - outputs: [ - { name: '', internalType: 'contract OptimismPortal', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'donate', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export const portalSenderAddress = { - 1: '0x0A893d9576b9cFD9EF78595963dc973238E78210', - 5: '0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export const portalSenderConfig = { - address: portalSenderAddress, - abi: portalSenderABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ProtocolVersions -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export const protocolVersionsABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'updateType', - internalType: 'enum ProtocolVersions.UpdateType', - type: 'uint8', - indexed: true, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'ConfigUpdate', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECOMMENDED_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'REQUIRED_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_owner', internalType: 'address', type: 'address' }, - { name: '_required', internalType: 'ProtocolVersion', type: 'uint256' }, - { - name: '_recommended', - internalType: 'ProtocolVersion', - type: 'uint256', - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'recommended', - outputs: [ - { name: 'out_', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'required', - outputs: [ - { name: 'out_', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_recommended', - internalType: 'ProtocolVersion', - type: 'uint256', - }, - ], - name: 'setRecommended', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_required', internalType: 'ProtocolVersion', type: 'uint256' }, - ], - name: 'setRequired', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export const protocolVersionsAddress = { - 5: '0x0C24F5098774aA366827D667494e9F889f7cFc08', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export const protocolVersionsConfig = { - address: protocolVersionsAddress, - abi: protocolVersionsABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ProxyAdmin -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export const proxyAdminABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'addressManager', - outputs: [ - { name: '', internalType: 'contract AddressManager', type: 'address' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_newAdmin', internalType: 'address', type: 'address' }, - ], - name: 'changeProxyAdmin', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - ], - name: 'getProxyAdmin', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '_proxy', internalType: 'address', type: 'address' }], - name: 'getProxyImplementation', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'implementationName', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'isUpgrading', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: '', internalType: 'address', type: 'address' }], - name: 'proxyType', - outputs: [ - { name: '', internalType: 'enum ProxyAdmin.ProxyType', type: 'uint8' }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_name', internalType: 'string', type: 'string' }, - { name: '_address', internalType: 'address', type: 'address' }, - ], - name: 'setAddress', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_address', - internalType: 'contract AddressManager', - type: 'address', - }, - ], - name: 'setAddressManager', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_address', internalType: 'address', type: 'address' }, - { name: '_name', internalType: 'string', type: 'string' }, - ], - name: 'setImplementationName', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_address', internalType: 'address', type: 'address' }, - { - name: '_type', - internalType: 'enum ProxyAdmin.ProxyType', - type: 'uint8', - }, - ], - name: 'setProxyType', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_upgrading', internalType: 'bool', type: 'bool' }], - name: 'setUpgrading', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_implementation', internalType: 'address', type: 'address' }, - ], - name: 'upgrade', - outputs: [], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_proxy', internalType: 'address payable', type: 'address' }, - { name: '_implementation', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - ], - name: 'upgradeAndCall', - outputs: [], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export const proxyAdminAddress = { - 1: '0x4200000000000000000000000000000000000018', - 5: '0x4200000000000000000000000000000000000018', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export const proxyAdminConfig = { - address: proxyAdminAddress, - abi: proxyAdminABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SchemaRegistry -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export const schemaRegistryABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { type: 'error', inputs: [], name: 'AlreadyExists' }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32', indexed: true }, - { - name: 'registerer', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Registered', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [{ name: 'uid', internalType: 'bytes32', type: 'bytes32' }], - name: 'getSchema', - outputs: [ - { - name: '', - internalType: 'struct SchemaRecord', - type: 'tuple', - components: [ - { name: 'uid', internalType: 'bytes32', type: 'bytes32' }, - { - name: 'resolver', - internalType: 'contract ISchemaResolver', - type: 'address', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - { name: 'schema', internalType: 'string', type: 'string' }, - ], - }, - ], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: 'schema', internalType: 'string', type: 'string' }, - { - name: 'resolver', - internalType: 'contract ISchemaResolver', - type: 'address', - }, - { name: 'revocable', internalType: 'bool', type: 'bool' }, - ], - name: 'register', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export const schemaRegistryAddress = { - 10: '0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13', - 420: '0x2545fa928d5d278cA75Fd47306e4a89096ff6403', -} as const - -/** - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export const schemaRegistryConfig = { - address: schemaRegistryAddress, - abi: schemaRegistryABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SequencerFeeVault -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export const sequencerFeeVaultABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'value', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - { name: 'to', internalType: 'address', type: 'address', indexed: false }, - { - name: 'from', - internalType: 'address', - type: 'address', - indexed: false, - }, - ], - name: 'Withdrawal', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'MIN_WITHDRAWAL_AMOUNT', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'RECIPIENT', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1FeeWallet', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'totalProcessed', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdraw', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export const sequencerFeeVaultAddress = { - 420: '0x4200000000000000000000000000000000000011', -} as const - -/** - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export const sequencerFeeVaultConfig = { - address: sequencerFeeVaultAddress, - abi: sequencerFeeVaultABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SystemConfig -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export const systemConfigABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'version', - internalType: 'uint256', - type: 'uint256', - indexed: true, - }, - { - name: 'updateType', - internalType: 'enum SystemConfig.UpdateType', - type: 'uint8', - indexed: true, - }, - { name: 'data', internalType: 'bytes', type: 'bytes', indexed: false }, - ], - name: 'ConfigUpdate', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'BATCH_INBOX_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_CROSS_DOMAIN_MESSENGER_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_ERC_721_BRIDGE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L1_STANDARD_BRIDGE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'L2_OUTPUT_ORACLE_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'OPTIMISM_PORTAL_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'UNSAFE_BLOCK_SIGNER_SLOT', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batchInbox', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'batcherHash', - outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'gasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_owner', internalType: 'address', type: 'address' }, - { name: '_overhead', internalType: 'uint256', type: 'uint256' }, - { name: '_scalar', internalType: 'uint256', type: 'uint256' }, - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: '_gasLimit', internalType: 'uint64', type: 'uint64' }, - { name: '_unsafeBlockSigner', internalType: 'address', type: 'address' }, - { - name: '_config', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { name: 'maxResourceLimit', internalType: 'uint32', type: 'uint32' }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { name: 'maximumBaseFee', internalType: 'uint128', type: 'uint128' }, - ], - }, - { name: '_startBlock', internalType: 'uint256', type: 'uint256' }, - { name: '_batchInbox', internalType: 'address', type: 'address' }, - { - name: '_addresses', - internalType: 'struct SystemConfig.Addresses', - type: 'tuple', - components: [ - { - name: 'l1CrossDomainMessenger', - internalType: 'address', - type: 'address', - }, - { name: 'l1ERC721Bridge', internalType: 'address', type: 'address' }, - { - name: 'l1StandardBridge', - internalType: 'address', - type: 'address', - }, - { name: 'l2OutputOracle', internalType: 'address', type: 'address' }, - { name: 'optimismPortal', internalType: 'address', type: 'address' }, - { - name: 'optimismMintableERC20Factory', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1CrossDomainMessenger', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1ERC721Bridge', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l1StandardBridge', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracle', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'minimumGasLimit', - outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismMintableERC20Factory', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismPortal', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'overhead', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'resourceConfig', - outputs: [ - { - name: '', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { name: 'maxResourceLimit', internalType: 'uint32', type: 'uint32' }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { name: 'maximumBaseFee', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'scalar', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_batcherHash', internalType: 'bytes32', type: 'bytes32' }, - ], - name: 'setBatcherHash', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_overhead', internalType: 'uint256', type: 'uint256' }, - { name: '_scalar', internalType: 'uint256', type: 'uint256' }, - ], - name: 'setGasConfig', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_gasLimit', internalType: 'uint64', type: 'uint64' }], - name: 'setGasLimit', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { name: 'maxResourceLimit', internalType: 'uint32', type: 'uint32' }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { name: 'minimumBaseFee', internalType: 'uint32', type: 'uint32' }, - { name: 'systemTxMaxGas', internalType: 'uint32', type: 'uint32' }, - { name: 'maximumBaseFee', internalType: 'uint128', type: 'uint128' }, - ], - }, - ], - name: 'setResourceConfig', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_unsafeBlockSigner', internalType: 'address', type: 'address' }, - ], - name: 'setUnsafeBlockSigner', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'startBlock', - outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'unsafeBlockSigner', - outputs: [{ name: 'addr_', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'version', - outputs: [{ name: '', internalType: 'string', type: 'string' }], - }, -] as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export const systemConfigAddress = { - 1: '0x229047fed2591dbec1eF1118d64F7aF3dB9EB290', - 5: '0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60', -} as const - -/** - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export const systemConfigConfig = { - address: systemConfigAddress, - abi: systemConfigABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SystemDictator -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export const systemDictatorABI = [ - { stateMutability: 'nonpayable', type: 'constructor', inputs: [] }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EXIT_1_NO_RETURN_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PROXY_TRANSFER_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'config', - outputs: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - { - name: 'resourceConfig', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { - name: 'maxResourceLimit', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'minimumBaseFee', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'systemTxMaxGas', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'maximumBaseFee', - internalType: 'uint128', - type: 'uint128', - }, - ], - }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'currentStep', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'dynamicConfigSet', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'exit1', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'exited', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'finalize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct SystemDictator.DeployConfig', - type: 'tuple', - components: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - { - name: 'resourceConfig', - internalType: 'struct ResourceMetering.ResourceConfig', - type: 'tuple', - components: [ - { - name: 'maxResourceLimit', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'elasticityMultiplier', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'baseFeeMaxChangeDenominator', - internalType: 'uint8', - type: 'uint8', - }, - { - name: 'minimumBaseFee', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'systemTxMaxGas', - internalType: 'uint32', - type: 'uint32', - }, - { - name: 'maximumBaseFee', - internalType: 'uint128', - type: 'uint128', - }, - ], - }, - ], - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracleDynamicConfig', - outputs: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'oldL1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'optimismPortalDynamicConfig', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'phase1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'phase2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step3', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step4', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step5', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2OutputOracleDynamicConfig', - internalType: 'struct SystemDictator.L2OutputOracleDynamicConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - name: '_optimismPortalDynamicConfig', - internalType: 'bool', - type: 'bool', - }, - ], - name: 'updateDynamicConfig', - outputs: [], - }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export const systemDictatorAddress = { - 1: '0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export const systemDictatorConfig = { - address: systemDictatorAddress, - abi: systemDictatorABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SystemDictator_goerli -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export const systemDictatorGoerliABI = [ - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'version', internalType: 'uint8', type: 'uint8', indexed: false }, - ], - name: 'Initialized', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'previousOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnershipTransferred', - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'EXIT_1_NO_RETURN_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'PROXY_TRANSFER_STEP', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'config', - outputs: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'currentStep', - outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'dynamicConfigSet', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'exit1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'finalize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'finalized', - outputs: [{ name: '', internalType: 'bool', type: 'bool' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_config', - internalType: 'struct SystemDictator.DeployConfig', - type: 'tuple', - components: [ - { - name: 'globalConfig', - internalType: 'struct SystemDictator.GlobalConfig', - type: 'tuple', - components: [ - { - name: 'addressManager', - internalType: 'contract AddressManager', - type: 'address', - }, - { - name: 'proxyAdmin', - internalType: 'contract ProxyAdmin', - type: 'address', - }, - { name: 'controller', internalType: 'address', type: 'address' }, - { name: 'finalOwner', internalType: 'address', type: 'address' }, - ], - }, - { - name: 'proxyAddressConfig', - internalType: 'struct SystemDictator.ProxyAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismPortalProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1StandardBridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'l1ERC721BridgeProxy', - internalType: 'address', - type: 'address', - }, - { - name: 'systemConfigProxy', - internalType: 'address', - type: 'address', - }, - ], - }, - { - name: 'implementationAddressConfig', - internalType: 'struct SystemDictator.ImplementationAddressConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleImpl', - internalType: 'contract L2OutputOracle', - type: 'address', - }, - { - name: 'optimismPortalImpl', - internalType: 'contract OptimismPortal', - type: 'address', - }, - { - name: 'l1CrossDomainMessengerImpl', - internalType: 'contract L1CrossDomainMessenger', - type: 'address', - }, - { - name: 'l1StandardBridgeImpl', - internalType: 'contract L1StandardBridge', - type: 'address', - }, - { - name: 'optimismMintableERC20FactoryImpl', - internalType: 'contract OptimismMintableERC20Factory', - type: 'address', - }, - { - name: 'l1ERC721BridgeImpl', - internalType: 'contract L1ERC721Bridge', - type: 'address', - }, - { - name: 'portalSenderImpl', - internalType: 'contract PortalSender', - type: 'address', - }, - { - name: 'systemConfigImpl', - internalType: 'contract SystemConfig', - type: 'address', - }, - ], - }, - { - name: 'systemConfigConfig', - internalType: 'struct SystemDictator.SystemConfigConfig', - type: 'tuple', - components: [ - { name: 'owner', internalType: 'address', type: 'address' }, - { name: 'overhead', internalType: 'uint256', type: 'uint256' }, - { name: 'scalar', internalType: 'uint256', type: 'uint256' }, - { name: 'batcherHash', internalType: 'bytes32', type: 'bytes32' }, - { name: 'gasLimit', internalType: 'uint64', type: 'uint64' }, - { - name: 'unsafeBlockSigner', - internalType: 'address', - type: 'address', - }, - ], - }, - ], - }, - ], - name: 'initialize', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'l2OutputOracleDynamicConfig', - outputs: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'oldL1CrossDomainMessenger', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'renounceOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step1', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step2', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step3', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step4', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step5', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'step6', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'transferOwnership', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { - name: '_l2OutputOracleDynamicConfig', - internalType: 'struct SystemDictator.L2OutputOracleDynamicConfig', - type: 'tuple', - components: [ - { - name: 'l2OutputOracleStartingBlockNumber', - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'l2OutputOracleStartingTimestamp', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - ], - name: 'updateL2OutputOracleDynamicConfig', - outputs: [], - }, -] as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export const systemDictatorGoerliAddress = { - 5: '0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971', -} as const - -/** - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export const systemDictatorGoerliConfig = { - address: systemDictatorGoerliAddress, - abi: systemDictatorGoerliABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// TeleportrWithdrawer -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export const teleportrWithdrawerABI = [ - { - stateMutability: 'nonpayable', - type: 'constructor', - inputs: [{ name: '_owner', internalType: 'address', type: 'address' }], - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'user', internalType: 'address', type: 'address', indexed: true }, - { - name: 'newOwner', - internalType: 'address', - type: 'address', - indexed: true, - }, - ], - name: 'OwnerUpdated', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { name: 'from', internalType: 'address', type: 'address', indexed: true }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'ReceivedETH', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewERC20', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'asset', - internalType: 'address', - type: 'address', - indexed: true, - }, - { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false }, - ], - name: 'WithdrewERC721', - }, - { - type: 'event', - anonymous: false, - inputs: [ - { - name: 'withdrawer', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'recipient', - internalType: 'address', - type: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - indexed: false, - }, - ], - name: 'WithdrewETH', - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - { name: '_value', internalType: 'uint256', type: 'uint256' }, - ], - name: 'CALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'payable', - type: 'function', - inputs: [ - { name: '_target', internalType: 'address', type: 'address' }, - { name: '_data', internalType: 'bytes', type: 'bytes' }, - { name: '_gas', internalType: 'uint256', type: 'uint256' }, - ], - name: 'DELEGATECALL', - outputs: [ - { name: '', internalType: 'bool', type: 'bool' }, - { name: '', internalType: 'bytes', type: 'bytes' }, - ], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'data', - outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'owner', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'recipient', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_data', internalType: 'bytes', type: 'bytes' }], - name: 'setData', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: 'newOwner', internalType: 'address', type: 'address' }], - name: 'setOwner', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_recipient', internalType: 'address', type: 'address' }], - name: 'setRecipient', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_teleportr', internalType: 'address', type: 'address' }], - name: 'setTeleportr', - outputs: [], - }, - { - stateMutability: 'view', - type: 'function', - inputs: [], - name: 'teleportr', - outputs: [{ name: '', internalType: 'address', type: 'address' }], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC20', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - ], - name: 'withdrawERC20', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_asset', internalType: 'contract ERC721', type: 'address' }, - { name: '_to', internalType: 'address', type: 'address' }, - { name: '_id', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawERC721', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [ - { name: '_to', internalType: 'address payable', type: 'address' }, - { name: '_amount', internalType: 'uint256', type: 'uint256' }, - ], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [{ name: '_to', internalType: 'address payable', type: 'address' }], - name: 'withdrawETH', - outputs: [], - }, - { - stateMutability: 'nonpayable', - type: 'function', - inputs: [], - name: 'withdrawFromTeleportr', - outputs: [], - }, - { stateMutability: 'payable', type: 'receive' }, -] as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export const teleportrWithdrawerAddress = { - 1: '0x78A25524D90E3D0596558fb43789bD800a5c3007', -} as const - -/** - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export const teleportrWithdrawerConfig = { - address: teleportrWithdrawerAddress, - abi: teleportrWithdrawerABI, -} as const - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// eslintIgnore -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// React -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link addressManagerABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export function useAddressManagerRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof addressManagerAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: addressManagerABI, - address: - addressManagerAddress[chainId as keyof typeof addressManagerAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link addressManagerABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export function useAddressManagerWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof addressManagerAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof addressManagerABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: addressManagerABI, - address: - addressManagerAddress[chainId as keyof typeof addressManagerAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link addressManagerABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdE1FCfB0851916CA5101820A69b13a4E276bd81F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xa6f73589243a6A7a9023b1Fa0651b1d89c177111) - */ -export function useAddressManagerEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof addressManagerAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: addressManagerABI, - address: - addressManagerAddress[chainId as keyof typeof addressManagerAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link assetReceiverABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export function useAssetReceiverRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof assetReceiverAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: assetReceiverABI, - address: assetReceiverAddress[chainId as keyof typeof assetReceiverAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link assetReceiverABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export function useAssetReceiverWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof assetReceiverAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof assetReceiverABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: assetReceiverABI, - address: assetReceiverAddress[chainId as keyof typeof assetReceiverAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link assetReceiverABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x15DdA60616Ffca20371ED1659dBB78E888f65556) - */ -export function useAssetReceiverEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof assetReceiverAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: assetReceiverABI, - address: assetReceiverAddress[chainId as keyof typeof assetReceiverAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link attestationStationABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export function useAttestationStationRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig< - typeof attestationStationABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof attestationStationAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: attestationStationABI, - address: - attestationStationAddress[ - chainId as keyof typeof attestationStationAddress - ], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link attestationStationABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export function useAttestationStationWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof attestationStationAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof attestationStationABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof attestationStationABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: attestationStationABI, - address: - attestationStationAddress[ - chainId as keyof typeof attestationStationAddress - ], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link attestationStationABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xEE36eaaD94d1Cc1d0eccaDb55C38bFfB6Be06C77) - */ -export function useAttestationStationEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof attestationStationAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: attestationStationABI, - address: - attestationStationAddress[ - chainId as keyof typeof attestationStationAddress - ], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link baseFeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export function useBaseFeeVaultRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof baseFeeVaultAddress } = {} as any -) { - return useContractRead({ - abi: baseFeeVaultABI, - address: baseFeeVaultAddress[420], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link baseFeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export function useBaseFeeVaultWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof baseFeeVaultAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof baseFeeVaultABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite({ - abi: baseFeeVaultABI, - address: baseFeeVaultAddress[420], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link baseFeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000019) - */ -export function useBaseFeeVaultEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof baseFeeVaultAddress } = {} as any -) { - return useContractEvent({ - abi: baseFeeVaultABI, - address: baseFeeVaultAddress[420], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link checkBalanceHighABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export function useCheckBalanceHighRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig< - typeof checkBalanceHighABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof checkBalanceHighAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: checkBalanceHighABI, - address: - checkBalanceHighAddress[chainId as keyof typeof checkBalanceHighAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link checkBalanceHighABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x7eC64a8a591bFf829ff6C8be76074D540ACb813F) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5d7103853f12109A7d27F118e54BbC654ad847E9) - */ -export function useCheckBalanceHighEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof checkBalanceHighAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: checkBalanceHighABI, - address: - checkBalanceHighAddress[chainId as keyof typeof checkBalanceHighAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link checkBalanceLowABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export function useCheckBalanceLowRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig< - typeof checkBalanceLowABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof checkBalanceLowAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: checkBalanceLowABI, - address: - checkBalanceLowAddress[chainId as keyof typeof checkBalanceLowAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link checkBalanceLowABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x381a4eFC2A2C914eA1889722bB4B44Fa6BD5b640) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x7Ce13D154FAEE5C8B3E6b19d4Add16f21d884474) - */ -export function useCheckBalanceLowEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof checkBalanceLowAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: checkBalanceLowABI, - address: - checkBalanceLowAddress[chainId as keyof typeof checkBalanceLowAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link checkGelatoLowABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export function useCheckGelatoLowRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof checkGelatoLowAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: checkGelatoLowABI, - address: - checkGelatoLowAddress[chainId as keyof typeof checkGelatoLowAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link checkGelatoLowABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4f7CFc43f6D262a085F3b946cAC69E7a8E39BBAa) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0xF9c8a4Cb4021f57F9f6d69799cA9BefF64524862) - */ -export function useCheckGelatoLowEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof checkGelatoLowAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: checkGelatoLowABI, - address: - checkGelatoLowAddress[chainId as keyof typeof checkGelatoLowAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link checkTrueABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5c741a38cb11424711231777D71689C458eE835D) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x47443D0C184e022F19BD1578F5bca6B8a9F58E32) - */ -export function useCheckTrueRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof checkTrueAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: checkTrueABI, - address: checkTrueAddress[chainId as keyof typeof checkTrueAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link drippieABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export function useDrippieRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof drippieAddress } = {} as any -) { - return useContractRead({ - abi: drippieABI, - address: drippieAddress[1], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link drippieABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export function useDrippieWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof drippieAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite({ - abi: drippieABI, - address: drippieAddress[1], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link drippieABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export function useDrippieEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof drippieAddress } = {} as any -) { - return useContractEvent({ - abi: drippieABI, - address: drippieAddress[1], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link drippieGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export function useDrippieGoerliRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof drippieGoerliAddress } = {} as any -) { - return useContractRead({ - abi: drippieGoerliABI, - address: drippieGoerliAddress[5], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link drippieGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export function useDrippieGoerliWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof drippieGoerliAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof drippieGoerliABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite({ - abi: drippieGoerliABI, - address: drippieGoerliAddress[5], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link drippieGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x44b3A2a040057eBafC601A78647e805fd58B1f50) - */ -export function useDrippieGoerliEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof drippieGoerliAddress } = {} as any -) { - return useContractEvent({ - abi: drippieGoerliABI, - address: drippieGoerliAddress[5], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link drippieOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export function useDrippieOptimismGoerliRead< - TFunctionName extends string, - TSelectData = ReadContractResult< - typeof drippieOptimismGoerliABI, - TFunctionName - > ->( - config: Omit< - UseContractReadConfig< - typeof drippieOptimismGoerliABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof drippieOptimismGoerliAddress } = {} as any -) { - return useContractRead({ - abi: drippieOptimismGoerliABI, - address: drippieOptimismGoerliAddress[420], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link drippieOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export function useDrippieOptimismGoerliWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof drippieOptimismGoerliAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof drippieOptimismGoerliABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof drippieOptimismGoerliABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite< - typeof drippieOptimismGoerliABI, - TFunctionName, - TMode - >({ - abi: drippieOptimismGoerliABI, - address: drippieOptimismGoerliAddress[420], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link drippieOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x8D8d533C16D23847EB04EEB0925be8900Dd3af86) - */ -export function useDrippieOptimismGoerliEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof drippieOptimismGoerliAddress } = {} as any -) { - return useContractEvent({ - abi: drippieOptimismGoerliABI, - address: drippieOptimismGoerliAddress[420], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link easABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export function useEasRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof easAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: easABI, - address: easAddress[chainId as keyof typeof easAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link easABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export function useEasWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof easAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: easABI, - address: easAddress[chainId as keyof typeof easAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link easABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x5A633F1cc84B03F7588486CF2F386c102061E6e1) - */ -export function useEasEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof easAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: easABI, - address: easAddress[chainId as keyof typeof easAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link gasPriceOracleABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000000F) - */ -export function useGasPriceOracleRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof gasPriceOracleAddress } = {} as any -) { - return useContractRead({ - abi: gasPriceOracleABI, - address: gasPriceOracleAddress[420], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link l1BlockABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export function useL1BlockRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l1BlockAddress } = {} as any -) { - return useContractRead({ - abi: l1BlockABI, - address: l1BlockAddress[420], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link l1BlockABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000015) - */ -export function useL1BlockWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof l1BlockAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite({ - abi: l1BlockABI, - address: l1BlockAddress[420], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link l1CrossDomainMessengerABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export function useL1CrossDomainMessengerRead< - TFunctionName extends string, - TSelectData = ReadContractResult< - typeof l1CrossDomainMessengerABI, - TFunctionName - > ->( - config: Omit< - UseContractReadConfig< - typeof l1CrossDomainMessengerABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof l1CrossDomainMessengerAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: l1CrossDomainMessengerABI, - address: - l1CrossDomainMessengerAddress[ - chainId as keyof typeof l1CrossDomainMessengerAddress - ], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link l1CrossDomainMessengerABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export function useL1CrossDomainMessengerWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof l1CrossDomainMessengerAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof l1CrossDomainMessengerABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof l1CrossDomainMessengerABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite< - typeof l1CrossDomainMessengerABI, - TFunctionName, - TMode - >({ - abi: l1CrossDomainMessengerABI, - address: - l1CrossDomainMessengerAddress[ - chainId as keyof typeof l1CrossDomainMessengerAddress - ], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link l1CrossDomainMessengerABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5086d1eEF304eb5284A0f6720f79403b4e9bE294) - */ -export function useL1CrossDomainMessengerEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l1CrossDomainMessengerAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: l1CrossDomainMessengerABI, - address: - l1CrossDomainMessengerAddress[ - chainId as keyof typeof l1CrossDomainMessengerAddress - ], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link l1Erc721BridgeABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export function useL1Erc721BridgeRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l1Erc721BridgeAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: l1Erc721BridgeABI, - address: - l1Erc721BridgeAddress[chainId as keyof typeof l1Erc721BridgeAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link l1Erc721BridgeABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export function useL1Erc721BridgeWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof l1Erc721BridgeAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof l1Erc721BridgeABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: l1Erc721BridgeABI, - address: - l1Erc721BridgeAddress[chainId as keyof typeof l1Erc721BridgeAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link l1Erc721BridgeABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x5a7749f83b81B301cAb5f48EB8516B986DAef23D) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x8DD330DdE8D9898d43b4dc840Da27A07dF91b3c9) - */ -export function useL1Erc721BridgeEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l1Erc721BridgeAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: l1Erc721BridgeABI, - address: - l1Erc721BridgeAddress[chainId as keyof typeof l1Erc721BridgeAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link l1FeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export function useL1FeeVaultRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l1FeeVaultAddress } = {} as any -) { - return useContractRead({ - abi: l1FeeVaultABI, - address: l1FeeVaultAddress[420], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link l1FeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export function useL1FeeVaultWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof l1FeeVaultAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof l1FeeVaultABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite({ - abi: l1FeeVaultABI, - address: l1FeeVaultAddress[420], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link l1FeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x420000000000000000000000000000000000001a) - */ -export function useL1FeeVaultEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l1FeeVaultAddress } = {} as any -) { - return useContractEvent({ - abi: l1FeeVaultABI, - address: l1FeeVaultAddress[420], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link l1StandardBridgeABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export function useL1StandardBridgeRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig< - typeof l1StandardBridgeABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof l1StandardBridgeAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: l1StandardBridgeABI, - address: - l1StandardBridgeAddress[chainId as keyof typeof l1StandardBridgeAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link l1StandardBridgeABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export function useL1StandardBridgeWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof l1StandardBridgeAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof l1StandardBridgeABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof l1StandardBridgeABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: l1StandardBridgeABI, - address: - l1StandardBridgeAddress[chainId as keyof typeof l1StandardBridgeAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link l1StandardBridgeABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x636Af16bf2f682dD3109e60102b8E1A089FedAa8) - */ -export function useL1StandardBridgeEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l1StandardBridgeAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: l1StandardBridgeABI, - address: - l1StandardBridgeAddress[chainId as keyof typeof l1StandardBridgeAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link l2CrossDomainMessengerABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export function useL2CrossDomainMessengerRead< - TFunctionName extends string, - TSelectData = ReadContractResult< - typeof l2CrossDomainMessengerABI, - TFunctionName - > ->( - config: Omit< - UseContractReadConfig< - typeof l2CrossDomainMessengerABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof l2CrossDomainMessengerAddress } = {} as any -) { - return useContractRead({ - abi: l2CrossDomainMessengerABI, - address: l2CrossDomainMessengerAddress[420], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link l2CrossDomainMessengerABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export function useL2CrossDomainMessengerWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof l2CrossDomainMessengerAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof l2CrossDomainMessengerABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof l2CrossDomainMessengerABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite< - typeof l2CrossDomainMessengerABI, - TFunctionName, - TMode - >({ - abi: l2CrossDomainMessengerABI, - address: l2CrossDomainMessengerAddress[420], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link l2CrossDomainMessengerABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000007) - */ -export function useL2CrossDomainMessengerEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l2CrossDomainMessengerAddress } = {} as any -) { - return useContractEvent({ - abi: l2CrossDomainMessengerABI, - address: l2CrossDomainMessengerAddress[420], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link l2Erc721BridgeABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export function useL2Erc721BridgeRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l2Erc721BridgeAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: l2Erc721BridgeABI, - address: - l2Erc721BridgeAddress[chainId as keyof typeof l2Erc721BridgeAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link l2Erc721BridgeABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export function useL2Erc721BridgeWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof l2Erc721BridgeAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof l2Erc721BridgeABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: l2Erc721BridgeABI, - address: - l2Erc721BridgeAddress[chainId as keyof typeof l2Erc721BridgeAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link l2Erc721BridgeABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000014) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000014) - */ -export function useL2Erc721BridgeEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l2Erc721BridgeAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: l2Erc721BridgeABI, - address: - l2Erc721BridgeAddress[chainId as keyof typeof l2Erc721BridgeAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link l2OutputOracleABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export function useL2OutputOracleRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l2OutputOracleAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: l2OutputOracleABI, - address: - l2OutputOracleAddress[chainId as keyof typeof l2OutputOracleAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link l2OutputOracleABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export function useL2OutputOracleWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof l2OutputOracleAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof l2OutputOracleABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: l2OutputOracleABI, - address: - l2OutputOracleAddress[chainId as keyof typeof l2OutputOracleAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link l2OutputOracleABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xdfe97868233d1aa22e815a266982f2cf17685a27) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0) - */ -export function useL2OutputOracleEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l2OutputOracleAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: l2OutputOracleABI, - address: - l2OutputOracleAddress[chainId as keyof typeof l2OutputOracleAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link l2StandardBridgeABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export function useL2StandardBridgeRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig< - typeof l2StandardBridgeABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof l2StandardBridgeAddress } = {} as any -) { - return useContractRead({ - abi: l2StandardBridgeABI, - address: l2StandardBridgeAddress[420], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link l2StandardBridgeABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export function useL2StandardBridgeWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof l2StandardBridgeAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof l2StandardBridgeABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof l2StandardBridgeABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite({ - abi: l2StandardBridgeABI, - address: l2StandardBridgeAddress[420], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link l2StandardBridgeABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000010) - */ -export function useL2StandardBridgeEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l2StandardBridgeAddress } = {} as any -) { - return useContractEvent({ - abi: l2StandardBridgeABI, - address: l2StandardBridgeAddress[420], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link l2ToL1MessagePasserABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export function useL2ToL1MessagePasserRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig< - typeof l2ToL1MessagePasserABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof l2ToL1MessagePasserAddress } = {} as any -) { - return useContractRead({ - abi: l2ToL1MessagePasserABI, - address: l2ToL1MessagePasserAddress[420], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link l2ToL1MessagePasserABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export function useL2ToL1MessagePasserWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof l2ToL1MessagePasserAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof l2ToL1MessagePasserABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof l2ToL1MessagePasserABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite({ - abi: l2ToL1MessagePasserABI, - address: l2ToL1MessagePasserAddress[420], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link l2ToL1MessagePasserABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000016) - */ -export function useL2ToL1MessagePasserEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof l2ToL1MessagePasserAddress } = {} as any -) { - return useContractEvent({ - abi: l2ToL1MessagePasserABI, - address: l2ToL1MessagePasserAddress[420], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link mintManagerABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export function useMintManagerRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof mintManagerAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: mintManagerABI, - address: mintManagerAddress[chainId as keyof typeof mintManagerAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link mintManagerABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export function useMintManagerWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof mintManagerAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof mintManagerABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: mintManagerABI, - address: mintManagerAddress[chainId as keyof typeof mintManagerAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link mintManagerABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x5C4e7Ba1E219E47948e6e3F55019A647bA501005) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x038a8825A3C3B0c08d52Cc76E5E361953Cf6Dc76) - */ -export function useMintManagerEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof mintManagerAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: mintManagerABI, - address: mintManagerAddress[chainId as keyof typeof mintManagerAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link optimismMintableErc20FactoryABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function useOptimismMintableErc20FactoryRead< - TFunctionName extends string, - TSelectData = ReadContractResult< - typeof optimismMintableErc20FactoryABI, - TFunctionName - > ->( - config: Omit< - UseContractReadConfig< - typeof optimismMintableErc20FactoryABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof optimismMintableErc20FactoryAddress } = {} as any -) { - return useContractRead({ - abi: optimismMintableErc20FactoryABI, - address: optimismMintableErc20FactoryAddress[1], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link optimismMintableErc20FactoryABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function useOptimismMintableErc20FactoryWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof optimismMintableErc20FactoryAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof optimismMintableErc20FactoryABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof optimismMintableErc20FactoryABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite< - typeof optimismMintableErc20FactoryABI, - TFunctionName, - TMode - >({ - abi: optimismMintableErc20FactoryABI, - address: optimismMintableErc20FactoryAddress[1], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link optimismMintableErc20FactoryABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function useOptimismMintableErc20FactoryEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof optimismMintableErc20FactoryAddress } = {} as any -) { - return useContractEvent({ - abi: optimismMintableErc20FactoryABI, - address: optimismMintableErc20FactoryAddress[1], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link optimismMintableErc20FactoryGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function useOptimismMintableErc20FactoryGoerliRead< - TFunctionName extends string, - TSelectData = ReadContractResult< - typeof optimismMintableErc20FactoryGoerliABI, - TFunctionName - > ->( - config: Omit< - UseContractReadConfig< - typeof optimismMintableErc20FactoryGoerliABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { - chainId?: keyof typeof optimismMintableErc20FactoryGoerliAddress - } = {} as any -) { - return useContractRead({ - abi: optimismMintableErc20FactoryGoerliABI, - address: optimismMintableErc20FactoryGoerliAddress[5], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link optimismMintableErc20FactoryGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function useOptimismMintableErc20FactoryGoerliWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof optimismMintableErc20FactoryGoerliAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof optimismMintableErc20FactoryGoerliABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof optimismMintableErc20FactoryGoerliABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite< - typeof optimismMintableErc20FactoryGoerliABI, - TFunctionName, - TMode - >({ - abi: optimismMintableErc20FactoryGoerliABI, - address: optimismMintableErc20FactoryGoerliAddress[5], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link optimismMintableErc20FactoryGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function useOptimismMintableErc20FactoryGoerliEvent< - TEventName extends string ->( - config: Omit< - UseContractEventConfig< - typeof optimismMintableErc20FactoryGoerliABI, - TEventName - >, - 'abi' | 'address' - > & { - chainId?: keyof typeof optimismMintableErc20FactoryGoerliAddress - } = {} as any -) { - return useContractEvent({ - abi: optimismMintableErc20FactoryGoerliABI, - address: optimismMintableErc20FactoryGoerliAddress[5], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link optimismMintableErc20FactoryOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function useOptimismMintableErc20FactoryOptimismGoerliRead< - TFunctionName extends string, - TSelectData = ReadContractResult< - typeof optimismMintableErc20FactoryOptimismGoerliABI, - TFunctionName - > ->( - config: Omit< - UseContractReadConfig< - typeof optimismMintableErc20FactoryOptimismGoerliABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { - chainId?: keyof typeof optimismMintableErc20FactoryOptimismGoerliAddress - } = {} as any -) { - return useContractRead({ - abi: optimismMintableErc20FactoryOptimismGoerliABI, - address: optimismMintableErc20FactoryOptimismGoerliAddress[420], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link optimismMintableErc20FactoryOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function useOptimismMintableErc20FactoryOptimismGoerliWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof optimismMintableErc20FactoryOptimismGoerliAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof optimismMintableErc20FactoryOptimismGoerliABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof optimismMintableErc20FactoryOptimismGoerliABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite< - typeof optimismMintableErc20FactoryOptimismGoerliABI, - TFunctionName, - TMode - >({ - abi: optimismMintableErc20FactoryOptimismGoerliABI, - address: optimismMintableErc20FactoryOptimismGoerliAddress[420], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link optimismMintableErc20FactoryOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000012) - */ -export function useOptimismMintableErc20FactoryOptimismGoerliEvent< - TEventName extends string ->( - config: Omit< - UseContractEventConfig< - typeof optimismMintableErc20FactoryOptimismGoerliABI, - TEventName - >, - 'abi' | 'address' - > & { - chainId?: keyof typeof optimismMintableErc20FactoryOptimismGoerliAddress - } = {} as any -) { - return useContractEvent({ - abi: optimismMintableErc20FactoryOptimismGoerliABI, - address: optimismMintableErc20FactoryOptimismGoerliAddress[420], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link optimismMintableErc721FactoryABI}__. - * - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export function useOptimismMintableErc721FactoryRead< - TFunctionName extends string, - TSelectData = ReadContractResult< - typeof optimismMintableErc721FactoryABI, - TFunctionName - > ->( - config: Omit< - UseContractReadConfig< - typeof optimismMintableErc721FactoryABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { - chainId?: keyof typeof optimismMintableErc721FactoryAddress - } = {} as any -) { - return useContractRead({ - abi: optimismMintableErc721FactoryABI, - address: optimismMintableErc721FactoryAddress[10], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link optimismMintableErc721FactoryABI}__. - * - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export function useOptimismMintableErc721FactoryWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof optimismMintableErc721FactoryAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof optimismMintableErc721FactoryABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof optimismMintableErc721FactoryABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite< - typeof optimismMintableErc721FactoryABI, - TFunctionName, - TMode - >({ - abi: optimismMintableErc721FactoryABI, - address: optimismMintableErc721FactoryAddress[10], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link optimismMintableErc721FactoryABI}__. - * - * [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x4200000000000000000000000000000000000017) - */ -export function useOptimismMintableErc721FactoryEvent< - TEventName extends string ->( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { - chainId?: keyof typeof optimismMintableErc721FactoryAddress - } = {} as any -) { - return useContractEvent({ - abi: optimismMintableErc721FactoryABI, - address: optimismMintableErc721FactoryAddress[10], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link optimismMintableErc721FactoryOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export function useOptimismMintableErc721FactoryOptimismGoerliRead< - TFunctionName extends string, - TSelectData = ReadContractResult< - typeof optimismMintableErc721FactoryOptimismGoerliABI, - TFunctionName - > ->( - config: Omit< - UseContractReadConfig< - typeof optimismMintableErc721FactoryOptimismGoerliABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { - chainId?: keyof typeof optimismMintableErc721FactoryOptimismGoerliAddress - } = {} as any -) { - return useContractRead({ - abi: optimismMintableErc721FactoryOptimismGoerliABI, - address: optimismMintableErc721FactoryOptimismGoerliAddress[420], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link optimismMintableErc721FactoryOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export function useOptimismMintableErc721FactoryOptimismGoerliWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof optimismMintableErc721FactoryOptimismGoerliAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof optimismMintableErc721FactoryOptimismGoerliABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof optimismMintableErc721FactoryOptimismGoerliABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite< - typeof optimismMintableErc721FactoryOptimismGoerliABI, - TFunctionName, - TMode - >({ - abi: optimismMintableErc721FactoryOptimismGoerliABI, - address: optimismMintableErc721FactoryOptimismGoerliAddress[420], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link optimismMintableErc721FactoryOptimismGoerliABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000017) - */ -export function useOptimismMintableErc721FactoryOptimismGoerliEvent< - TEventName extends string ->( - config: Omit< - UseContractEventConfig< - typeof optimismMintableErc721FactoryOptimismGoerliABI, - TEventName - >, - 'abi' | 'address' - > & { - chainId?: keyof typeof optimismMintableErc721FactoryOptimismGoerliAddress - } = {} as any -) { - return useContractEvent({ - abi: optimismMintableErc721FactoryOptimismGoerliABI, - address: optimismMintableErc721FactoryOptimismGoerliAddress[420], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link optimismPortalABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export function useOptimismPortalRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof optimismPortalAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: optimismPortalABI, - address: - optimismPortalAddress[chainId as keyof typeof optimismPortalAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link optimismPortalABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export function useOptimismPortalWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof optimismPortalAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof optimismPortalABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: optimismPortalABI, - address: - optimismPortalAddress[chainId as keyof typeof optimismPortalAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link optimismPortalABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xbEb5Fc579115071764c7423A4f12eDde41f106Ed) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383) - */ -export function useOptimismPortalEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof optimismPortalAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: optimismPortalABI, - address: - optimismPortalAddress[chainId as keyof typeof optimismPortalAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link optimistABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export function useOptimistRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof optimistAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: optimistABI, - address: optimistAddress[chainId as keyof typeof optimistAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link optimistABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export function useOptimistWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof optimistAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof optimistABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: optimistABI, - address: optimistAddress[chainId as keyof typeof optimistAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link optimistABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5) - */ -export function useOptimistEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof optimistAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: optimistABI, - address: optimistAddress[chainId as keyof typeof optimistAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link optimistAllowlistABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x482b1945D58f2E9Db0CEbe13c7fcFc6876b41180) - */ -export function useOptimistAllowlistRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig< - typeof optimistAllowlistABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof optimistAllowlistAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: optimistAllowlistABI, - address: - optimistAllowlistAddress[ - chainId as keyof typeof optimistAllowlistAddress - ], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link optimistInviterABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export function useOptimistInviterRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig< - typeof optimistInviterABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof optimistInviterAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: optimistInviterABI, - address: - optimistInviterAddress[chainId as keyof typeof optimistInviterAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link optimistInviterABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export function useOptimistInviterWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof optimistInviterAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof optimistInviterABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof optimistInviterABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: optimistInviterABI, - address: - optimistInviterAddress[chainId as keyof typeof optimistInviterAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link optimistInviterABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x073031A1E1b8F5458Ed41Ce56331F5fd7e1de929) - */ -export function useOptimistInviterEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof optimistInviterAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: optimistInviterABI, - address: - optimistInviterAddress[chainId as keyof typeof optimistInviterAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link portalSenderABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export function usePortalSenderRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof portalSenderAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: portalSenderABI, - address: portalSenderAddress[chainId as keyof typeof portalSenderAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link portalSenderABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x0A893d9576b9cFD9EF78595963dc973238E78210) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xe7FACd39531ee3C313330E93B4d7a8B8A3c84Aa4) - */ -export function usePortalSenderWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof portalSenderAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof portalSenderABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: portalSenderABI, - address: portalSenderAddress[chainId as keyof typeof portalSenderAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link protocolVersionsABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export function useProtocolVersionsRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig< - typeof protocolVersionsABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof protocolVersionsAddress } = {} as any -) { - return useContractRead({ - abi: protocolVersionsABI, - address: protocolVersionsAddress[5], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link protocolVersionsABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export function useProtocolVersionsWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof protocolVersionsAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof protocolVersionsABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof protocolVersionsABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite({ - abi: protocolVersionsABI, - address: protocolVersionsAddress[5], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link protocolVersionsABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x0C24F5098774aA366827D667494e9F889f7cFc08) - */ -export function useProtocolVersionsEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof protocolVersionsAddress } = {} as any -) { - return useContractEvent({ - abi: protocolVersionsABI, - address: protocolVersionsAddress[5], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link proxyAdminABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export function useProxyAdminRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof proxyAdminAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: proxyAdminABI, - address: proxyAdminAddress[chainId as keyof typeof proxyAdminAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link proxyAdminABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export function useProxyAdminWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof proxyAdminAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof proxyAdminABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: proxyAdminABI, - address: proxyAdminAddress[chainId as keyof typeof proxyAdminAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link proxyAdminABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x4200000000000000000000000000000000000018) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x4200000000000000000000000000000000000018) - */ -export function useProxyAdminEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof proxyAdminAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: proxyAdminABI, - address: proxyAdminAddress[chainId as keyof typeof proxyAdminAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link schemaRegistryABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export function useSchemaRegistryRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof schemaRegistryAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: schemaRegistryABI, - address: - schemaRegistryAddress[chainId as keyof typeof schemaRegistryAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link schemaRegistryABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export function useSchemaRegistryWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof schemaRegistryAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof schemaRegistryABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: schemaRegistryABI, - address: - schemaRegistryAddress[chainId as keyof typeof schemaRegistryAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link schemaRegistryABI}__. - * - * - [__View Contract on Op Mainnet Optimism Explorer__](https://explorer.optimism.io/address/0x6232208d66bAc2305b46b4Cb6BCB3857B298DF13) - * - [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x2545fa928d5d278cA75Fd47306e4a89096ff6403) - */ -export function useSchemaRegistryEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof schemaRegistryAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: schemaRegistryABI, - address: - schemaRegistryAddress[chainId as keyof typeof schemaRegistryAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link sequencerFeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export function useSequencerFeeVaultRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig< - typeof sequencerFeeVaultABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof sequencerFeeVaultAddress } = {} as any -) { - return useContractRead({ - abi: sequencerFeeVaultABI, - address: sequencerFeeVaultAddress[420], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link sequencerFeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export function useSequencerFeeVaultWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof sequencerFeeVaultAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof sequencerFeeVaultABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof sequencerFeeVaultABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite({ - abi: sequencerFeeVaultABI, - address: sequencerFeeVaultAddress[420], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link sequencerFeeVaultABI}__. - * - * [__View Contract on Optimism Goerli Etherscan__](https://goerli-optimism.etherscan.io/address/0x4200000000000000000000000000000000000011) - */ -export function useSequencerFeeVaultEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof sequencerFeeVaultAddress } = {} as any -) { - return useContractEvent({ - abi: sequencerFeeVaultABI, - address: sequencerFeeVaultAddress[420], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link systemConfigABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export function useSystemConfigRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof systemConfigAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractRead({ - abi: systemConfigABI, - address: systemConfigAddress[chainId as keyof typeof systemConfigAddress], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link systemConfigABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export function useSystemConfigWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof systemConfigAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof systemConfigABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractWrite({ - abi: systemConfigABI, - address: systemConfigAddress[chainId as keyof typeof systemConfigAddress], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link systemConfigABI}__. - * - * - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x229047fed2591dbec1eF1118d64F7aF3dB9EB290) - * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0xAe851f927Ee40dE99aaBb7461C00f9622ab91d60) - */ -export function useSystemConfigEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof systemConfigAddress } = {} as any -) { - const { chain } = useNetwork() - const defaultChainId = useChainId() - const chainId = config.chainId ?? chain?.id ?? defaultChainId - return useContractEvent({ - abi: systemConfigABI, - address: systemConfigAddress[chainId as keyof typeof systemConfigAddress], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link systemDictatorABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export function useSystemDictatorRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof systemDictatorAddress } = {} as any -) { - return useContractRead({ - abi: systemDictatorABI, - address: systemDictatorAddress[1], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link systemDictatorABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export function useSystemDictatorWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof systemDictatorAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof systemDictatorABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite({ - abi: systemDictatorABI, - address: systemDictatorAddress[1], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link systemDictatorABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0xB4453CEb33d2e67FA244A24acf2E50CEF31F53cB) - */ -export function useSystemDictatorEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof systemDictatorAddress } = {} as any -) { - return useContractEvent({ - abi: systemDictatorABI, - address: systemDictatorAddress[1], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link systemDictatorGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export function useSystemDictatorGoerliRead< - TFunctionName extends string, - TSelectData = ReadContractResult< - typeof systemDictatorGoerliABI, - TFunctionName - > ->( - config: Omit< - UseContractReadConfig< - typeof systemDictatorGoerliABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof systemDictatorGoerliAddress } = {} as any -) { - return useContractRead({ - abi: systemDictatorGoerliABI, - address: systemDictatorGoerliAddress[5], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link systemDictatorGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export function useSystemDictatorGoerliWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof systemDictatorGoerliAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof systemDictatorGoerliABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof systemDictatorGoerliABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite( - { - abi: systemDictatorGoerliABI, - address: systemDictatorGoerliAddress[5], - ...config, - } as any - ) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link systemDictatorGoerliABI}__. - * - * [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x1f0613A44c9a8ECE7B3A2e0CdBdF0F5B47A50971) - */ -export function useSystemDictatorGoerliEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof systemDictatorGoerliAddress } = {} as any -) { - return useContractEvent({ - abi: systemDictatorGoerliABI, - address: systemDictatorGoerliAddress[5], - ...config, - } as UseContractEventConfig) -} - -/** - * Wraps __{@link useContractRead}__ with `abi` set to __{@link teleportrWithdrawerABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export function useTeleportrWithdrawerRead< - TFunctionName extends string, - TSelectData = ReadContractResult ->( - config: Omit< - UseContractReadConfig< - typeof teleportrWithdrawerABI, - TFunctionName, - TSelectData - >, - 'abi' | 'address' - > & { chainId?: keyof typeof teleportrWithdrawerAddress } = {} as any -) { - return useContractRead({ - abi: teleportrWithdrawerABI, - address: teleportrWithdrawerAddress[1], - ...config, - } as UseContractReadConfig) -} - -/** - * Wraps __{@link useContractWrite}__ with `abi` set to __{@link teleportrWithdrawerABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export function useTeleportrWithdrawerWrite< - TFunctionName extends string, - TMode extends WriteContractMode = undefined, - TChainId extends number = keyof typeof teleportrWithdrawerAddress ->( - config: TMode extends 'prepared' - ? UseContractWriteConfig< - PrepareWriteContractResult< - typeof teleportrWithdrawerABI, - string - >['request']['abi'], - TFunctionName, - TMode - > & { address?: Address; chainId?: TChainId } - : UseContractWriteConfig< - typeof teleportrWithdrawerABI, - TFunctionName, - TMode - > & { - abi?: never - address?: never - chainId?: TChainId - } = {} as any -) { - return useContractWrite({ - abi: teleportrWithdrawerABI, - address: teleportrWithdrawerAddress[1], - ...config, - } as any) -} - -/** - * Wraps __{@link useContractEvent}__ with `abi` set to __{@link teleportrWithdrawerABI}__. - * - * [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x78A25524D90E3D0596558fb43789bD800a5c3007) - */ -export function useTeleportrWithdrawerEvent( - config: Omit< - UseContractEventConfig, - 'abi' | 'address' - > & { chainId?: keyof typeof teleportrWithdrawerAddress } = {} as any -) { - return useContractEvent({ - abi: teleportrWithdrawerABI, - address: teleportrWithdrawerAddress[1], - ...config, - } as UseContractEventConfig) -} diff --git a/packages/contracts-ts/src/vite-env.d.ts b/packages/contracts-ts/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2a006..000000000000 --- a/packages/contracts-ts/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/packages/contracts-ts/tsconfig.json b/packages/contracts-ts/tsconfig.json deleted file mode 100644 index 40f65330817c..000000000000 --- a/packages/contracts-ts/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "baseUrl": "./src", - "strict": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "node", - "jsx": "react", - "target": "ESNext", - "noEmit": true - }, - "include": ["./src"] -} diff --git a/packages/contracts-ts/tsup.config.ts b/packages/contracts-ts/tsup.config.ts deleted file mode 100644 index 08f18f247364..000000000000 --- a/packages/contracts-ts/tsup.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'tsup' -import packageJson from './package.json' - -export default defineConfig({ - name: packageJson.name, - entry: ['src/constants.ts', 'src/actions.ts', 'src/react.ts'], - outDir: 'dist', - format: ['esm', 'cjs'], - splitting: false, - sourcemap: true, - clean: false, -}) diff --git a/packages/contracts-ts/vite.config.ts b/packages/contracts-ts/vite.config.ts deleted file mode 100644 index b11d26442e70..000000000000 --- a/packages/contracts-ts/vite.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'vitest/config' - -// @see https://vitest.dev/config/ -export default defineConfig({ - test: { - setupFiles: './setupVitest.ts', - environment: 'jsdom', - coverage: { - provider: 'istanbul', - }, - }, -}) diff --git a/packages/contracts-ts/wagmi.config.ts b/packages/contracts-ts/wagmi.config.ts deleted file mode 100644 index 7dd906baeb37..000000000000 --- a/packages/contracts-ts/wagmi.config.ts +++ /dev/null @@ -1,405 +0,0 @@ -import { ContractConfig, defineConfig, Plugin } from '@wagmi/cli' -import { actions, react } from '@wagmi/cli/plugins' -import * as glob from 'glob' -import { readFileSync, writeFileSync } from 'fs' -import type { Abi, Address } from 'abitype' -import { isDeepStrictEqual } from 'util' -import { camelCase, constantCase } from 'change-case' - -/** - * Predeployed contract addresses - * In future it would be nice to have a json file in contracts bedrock be generated as source of truth - * Keep this in sync with op-bindings/predeploys/addresses.go in meantime - */ -const predeployContracts = { - LegacyMessagePasser: { - address: '0x4200000000000000000000000000000000000000', - introduced: 'Legacy', - deprecated: true, - proxied: true, - }, - DeployerWhitelist: { - address: '0x4200000000000000000000000000000000000002', - introduced: 'Legacy', - deprecated: true, - proxied: true, - }, - LegacyERC20ETH: { - address: '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', - introduced: 'Legacy', - deprecated: true, - proxied: false, - }, - WETH9: { - address: '0x4200000000000000000000000000000000000006', - introduced: 'Legacy', - deprecated: false, - proxied: false, - }, - L2CrossDomainMessenger: { - address: '0x4200000000000000000000000000000000000007', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - L2StandardBridge: { - address: '0x4200000000000000000000000000000000000010', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - SequencerFeeVault: { - address: '0x4200000000000000000000000000000000000011', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - OptimismMintableERC20Factory: { - address: '0x4200000000000000000000000000000000000012', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - L1BlockNumber: { - address: '0x4200000000000000000000000000000000000013', - introduced: 'Legacy', - deprecated: true, - proxied: true, - }, - GasPriceOracle: { - address: '0x420000000000000000000000000000000000000F', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - GovernanceToken: { - address: '0x4200000000000000000000000000000000000042', - introduced: 'Legacy', - deprecated: false, - proxied: false, - }, - L1Block: { - address: '0x4200000000000000000000000000000000000015', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, - L2ToL1MessagePasser: { - address: '0x4200000000000000000000000000000000000016', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, - L2ERC721Bridge: { - address: '0x4200000000000000000000000000000000000014', - introduced: 'Legacy', - deprecated: false, - proxied: true, - }, - OptimismMintableERC721Factory: { - address: '0x4200000000000000000000000000000000000017', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, - ProxyAdmin: { - address: '0x4200000000000000000000000000000000000018', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, - BaseFeeVault: { - address: '0x4200000000000000000000000000000000000019', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, - L1FeeVault: { - address: '0x420000000000000000000000000000000000001a', - introduced: 'Bedrock', - deprecated: false, - proxied: true, - }, -} as const - -type DeploymentJson = { - abi: Abi - address: `0x${string}` -} -const chains = { - 1: 'mainnet', - 10: 'optimism-mainnet', - 5: 'goerli', - 420: 'optimism-goerli', -} as const - -if (!glob.sync('node_modules/*').length) { - throw new Error( - 'No node_modules found. Please run `pnpm install` before running this script' - ) -} - -const deployments = { - [1]: glob.sync( - `node_modules/@eth-optimism/contracts-bedrock/deployments/${chains[1]}/*.json` - ), - [10]: glob.sync( - `node_modules/@eth-optimism/contracts-bedrock/deployments/${chains[10]}/*.json` - ), - [5]: glob.sync( - `node_modules/@eth-optimism/contracts-bedrock/deployments/${chains[5]}/*.json` - ), - [420]: glob.sync( - `node_modules/@eth-optimism/contracts-bedrock/deployments/${chains[420]}/*.json` - ), -} -Object.entries(deployments).forEach(([chain, deploymentFiles]) => { - if (deploymentFiles.length === 0) { - throw new Error(`No bedrock deployments found for ${chains[chain]}`) - } -}) - -const getWagmiContracts = ( - deploymentFiles: string[], - filterDuplicates = false -) => - deploymentFiles.map((artifactPath) => { - const deployment = JSON.parse( - readFileSync(artifactPath, 'utf8') - ) as DeploymentJson - - // There is a known bug in the wagmi/cli repo where some contracts have FOO_CASE and fooCase in same contract causing issues - // This is a common pattern at OP - // @see https://github.com/wagmi-dev/wagmi/issues/2724 - const abi = filterDuplicates - ? deployment.abi.filter((item) => { - if (item.type !== 'function') { - return true - } - if (item.name !== constantCase(item.name)) { - return true - } - // if constante case make sure it is not a duplicate - // e.g. make sure fooBar doesn't exist with FOO_BAR - return !deployment.abi.some( - (otherItem) => - otherItem.type === 'function' && - otherItem.name !== item.name && - otherItem.name === camelCase(item.name) - ) - }) - : deployment.abi - const contractConfig = { - abi, - name: artifactPath.split('/').reverse()[0]?.replace('.json', ''), - address: deployment.address, - } satisfies ContractConfig - if (!contractConfig.name) { - throw new Error( - 'Unable to identify the name of the contract at ' + artifactPath - ) - } - return contractConfig - }) - -/** - * Returns the contracts for the wagmi cli config - */ -const getContractConfigs = (filterDuplicates = false) => { - const contracts = { - 1: getWagmiContracts(deployments[1], filterDuplicates), - 10: getWagmiContracts(deployments[10], filterDuplicates), - 5: getWagmiContracts(deployments[5], filterDuplicates), - 420: getWagmiContracts(deployments[420], filterDuplicates), - } - - const allContracts = Object.values(contracts).flat() - - const config: ContractConfig[] = [] - - // this for loop is not terribly efficient but seems fast enough for the scale here - for (const contract of allContracts) { - // we will only process the implementation ABI but will use teh proxy addresses for deployments - const isProxy = contract.name.endsWith('Proxy') - // once we see the first deployment of a contract we will process all networks all at once - const alreadyProcessedContract = config.find( - (c) => c.name === contract.name - ) - if (isProxy || alreadyProcessedContract) { - continue - } - - const implementations = { - // @warning Later code assumes mainnet is first!!! - [1]: contracts[1].find((c) => c.name === contract.name), - // @warning Later code assumes mainnet is first!!! - [10]: contracts[10].find((c) => c.name === contract.name), - [5]: contracts[5].find((c) => c.name === contract.name), - [420]: contracts[420].find((c) => c.name === contract.name), - } - const maybeProxyName = contract.name + 'Proxy' - const proxies = { - // @warning Later code assumes mainnet is first!!! - [1]: contracts[1].find((c) => c.name === maybeProxyName), - // @warning Later code assumes mainnet is first!!! - [10]: contracts[10].find((c) => c.name === maybeProxyName), - [5]: contracts[5].find((c) => c.name === maybeProxyName), - [420]: contracts[420].find((c) => c.name === maybeProxyName), - } - - const predeploy = predeployContracts[ - contract.name as keyof typeof predeployContracts - ] as { address: Address } | undefined - - // If the contract has different abis on different networks we don't want to group them as a single abi - const isContractUnique = !Object.values(implementations).some( - (implementation) => - implementation && !isDeepStrictEqual(implementation.abi, contract.abi) - ) - if (!isContractUnique) { - Object.entries(implementations) - .filter(([_, implementation]) => implementation) - .forEach(([chain, implementation], i) => { - if (implementation) { - // make the first one canonical. This will be mainnet or op mainnet if they exist - const name = - i === 0 ? contract.name : `${contract.name}_${chains[chain]}` - const nextConfig = { - abi: implementation.abi, - name, - address: { - [Number.parseInt(chain)]: - predeploy?.address ?? - proxies[chain]?.address ?? - implementation?.address, - }, // predeploy?.address ?? proxies[chain]?.address ?? implementation?.address - } satisfies ContractConfig - config.push(nextConfig) - } - }) - continue - } - - const wagmiConfig = { - abi: contract.abi, - name: contract.name, - address: {}, - } satisfies ContractConfig - - Object.entries(implementations).forEach(([chain, proxy]) => { - if (proxy) { - wagmiConfig.address[chain] = - predeploy?.address ?? proxy.address ?? contract.address - } - }) - // if proxies exist overwrite the address with the proxy address - Object.entries(proxies).forEach(([chain, proxy]) => { - if (proxy) { - wagmiConfig.address[chain] = predeploy?.address ?? proxy.address - } - }) - - config.push(wagmiConfig) - } - - return config -} - -/** - * This plugin will create a addresses mapping from contract name to address - */ -const addressesByContractByNetworkPlugin: Plugin = { - name: 'addressesByContractByNetwork', - run: async ({ contracts }) => { - const addresses = Object.fromEntries( - contracts.map((contract) => [contract.name, contract.address ?? {}]) - ) - // write to json file so it's easy to audit in prs relative to the generated file diff - writeFileSync('./addresses.json', JSON.stringify(addresses, null, 2)) - return { - content: [ - `export const addresses = ${JSON.stringify(addresses)} as const`, - `export const predeploys = ${JSON.stringify(predeployContracts)}`, - ].join('\n'), - } - }, -} - -/** - * This plugin will create an abi mapping from contract name to abi - */ -const abiPlugin: Plugin = { - name: 'abisByContractByNetwork', - run: async ({ contracts }) => { - const abis = Object.fromEntries( - contracts.map((contract) => [contract.name, contract.abi]) - ) - // write to json file so it's easy to audit in prs relative to the generated file diff - writeFileSync('./abis.json', JSON.stringify(abis, null, 2)) - return { - content: `export const abis = ${JSON.stringify(abis)} as const`, - } - }, -} - -/** - * This plugin adds an eslint ignore to the generated code - */ -const eslintIgnorePlugin: Plugin = { - name: 'eslintIgnore', - run: async () => { - return { - prepend: `/* eslint-disable */`, - content: ``, - } - }, -} - -const contracts = getContractConfigs() -// there is a known wagmi bug with contracts who have both FOO_BAR and fooBar method -const contractsWithFilteredDuplicates = getContractConfigs(true) -// @see https://wagmi.sh/cli -export default defineConfig([ - { - out: 'src/constants.ts', - contracts, - plugins: [ - eslintIgnorePlugin, - addressesByContractByNetworkPlugin, - abiPlugin, - ], - }, - { - out: 'src/actions.ts', - contracts: contractsWithFilteredDuplicates, - plugins: [ - eslintIgnorePlugin, - actions({ - getContract: true, - // don't include actions because they can be more simply done via getContract - prepareWriteContract: false, - readContract: false, - watchContractEvent: false, - writeContract: false, - }), - ], - }, - { - out: 'src/react.ts', - contracts: contractsWithFilteredDuplicates, - plugins: [ - eslintIgnorePlugin, - react({ - useContractRead: true, - useContractWrite: true, - useContractEvent: true, - // don't include more niche actions to keep api more simple - useContractFunctionRead: false, - useContractFunctionWrite: false, - useContractItemEvent: false, - usePrepareContractFunctionWrite: false, - usePrepareContractWrite: false, - }), - ], - }, -]) diff --git a/packages/core-utils/.depcheckrc b/packages/core-utils/.depcheckrc deleted file mode 100644 index 3a691b778839..000000000000 --- a/packages/core-utils/.depcheckrc +++ /dev/null @@ -1,13 +0,0 @@ -ignores: [ - "@babel/eslint-parser", - "@typescript-eslint/parser", - "eslint-plugin-import", - "eslint-plugin-unicorn", - "eslint-plugin-jsdoc", - "eslint-plugin-prefer-arrow", - "eslint-plugin-react", - "@typescript-eslint/eslint-plugin", - "eslint-config-prettier", - "eslint-plugin-prettier", - "chai" -] diff --git a/packages/core-utils/.eslintrc.js b/packages/core-utils/.eslintrc.js deleted file mode 100644 index bfd2057be80b..000000000000 --- a/packages/core-utils/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: '../../.eslintrc.js', -} diff --git a/packages/core-utils/.gitignore b/packages/core-utils/.gitignore deleted file mode 100644 index b38db2f296ff..000000000000 --- a/packages/core-utils/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -build/ diff --git a/packages/core-utils/.lintstagedrc.yml b/packages/core-utils/.lintstagedrc.yml deleted file mode 100644 index a3035a2299b2..000000000000 --- a/packages/core-utils/.lintstagedrc.yml +++ /dev/null @@ -1,2 +0,0 @@ -"*.{ts,js}": - - eslint diff --git a/packages/core-utils/.prettierrc.js b/packages/core-utils/.prettierrc.js deleted file mode 100644 index 6b3fa8e2ce23..000000000000 --- a/packages/core-utils/.prettierrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - ...require('../../.prettierrc.js'), -}; \ No newline at end of file diff --git a/packages/core-utils/CHANGELOG.md b/packages/core-utils/CHANGELOG.md deleted file mode 100644 index f580cab10440..000000000000 --- a/packages/core-utils/CHANGELOG.md +++ /dev/null @@ -1,366 +0,0 @@ -# @eth-optimism/core-utils - -## 0.13.1 - -### Patch Changes - -- [#7450](https://github.com/ethereum-optimism/optimism/pull/7450) [`ac90e16a7`](https://github.com/ethereum-optimism/optimism/commit/ac90e16a7f85c4f73661ae6023135c3d00421c1e) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated dev dependencies related to testing that is causing audit tooling to report failures - -## 0.13.0 - -### Minor Changes - -- [#7336](https://github.com/ethereum-optimism/optimism/pull/7336) [`210b2c81d`](https://github.com/ethereum-optimism/optimism/commit/210b2c81dd383bad93480aa876b283d9a0c991c2) Thanks [@tynes](https://github.com/tynes)! - Delete unmaintained geth types - -## 0.12.3 - -### Patch Changes - -- [#6797](https://github.com/ethereum-optimism/optimism/pull/6797) [`dfa309e34`](https://github.com/ethereum-optimism/optimism/commit/dfa309e3430ebc8790b932554dde120aafc4161e) Thanks [@roninjin10](https://github.com/roninjin10)! - Upgraded npm dependencies to latest - -## 0.12.2 - -### Patch Changes - -- [#6164](https://github.com/ethereum-optimism/optimism/pull/6164) [`c11039060`](https://github.com/ethereum-optimism/optimism/commit/c11039060bc037a88916c2cba602687b6d69ad1a) Thanks [@pengin7384](https://github.com/pengin7384)! - fix typo - -- [#6198](https://github.com/ethereum-optimism/optimism/pull/6198) [`77da6edc6`](https://github.com/ethereum-optimism/optimism/commit/77da6edc643e0b5e39f7b6bb41c3c7ead418a876) Thanks [@tremarkley](https://github.com/tremarkley)! - Delete dead typescript https://github.com/ethereum-optimism/optimism/pull/6148. - -## 0.12.1 - -### Patch Changes - -- 8d7dcc70c: Delete legacy core-utils -- d6388be4a: Added a new service wallet-mon to identify unexpected transfers from key accounts - -## 0.12.0 - -### Minor Changes - -- c975c9620: Add suppory for finalizing legacy withdrawals after the Bedrock migration - -### Patch Changes - -- 136ea1785: Refactors the L2OutputOracle to key the l2Outputs mapping by index instead of by L2 block number. - -## 0.11.0 - -### Minor Changes - -- 1e76cdb86: Changes the type for Bedrock withdrawal proofs - -## 0.10.1 - -### Patch Changes - -- 7215f4ce: Bump ethers to 5.7.0 globally -- 206f6033: Fix outdated references to 'withdrawal contract' - -## 0.10.0 - -### Minor Changes - -- dbfea116: Removes ethers as a dependency in favor of individual ethers sub-packages - -## 0.9.3 - -### Patch Changes - -- 0df744f6: Implement basic OpNodeProvider -- 8ae39154: Update deposit transaction type -- dac4a9f0: Updates the SDK to be compatible with Bedrock (via the "bedrock: true" constructor param). Updates the build pipeline for contracts-bedrock to export a properly formatted dist folder that matches our other packages. - -## 0.9.2 - -### Patch Changes - -- 0bf3b9b4: Add encoding and hashing functions for bedrock -- 8d26459b: Remove subversion byte from deposit tx -- 4477fe9f: Update deposit transaction serialization - -## 0.9.1 - -### Patch Changes - -- f9fee446: Move the `DepositTx` type to `core-utils`. This way it can be more easily used across projects - -## 0.9.0 - -### Minor Changes - -- 700dcbb0: Update geth's Genesis type to work with modern geth - -## 0.8.7 - -### Patch Changes - -- 29ff7462: Revert es target back to 2017 - -## 0.8.6 - -### Patch Changes - -- 17962ca9: Update geth genesis type - -## 0.8.5 - -### Patch Changes - -- d18ae135: Updates all ethers versions in response to BN.js bug - -## 0.8.4 - -### Patch Changes - -- 5cb3a5f7: Add a `calldataCost` function that computes the cost of calldata -- 6b9fc055: Adds a one-liner for getting chain ID from provider - -## 0.8.3 - -### Patch Changes - -- b57014d1: Update to typescript@4.6.2 - -## 0.8.2 - -### Patch Changes - -- c1957126: Update Dockerfile to use Alpine - -## 0.8.1 - -### Patch Changes - -- 5a6f539c: Add toJSON methods to the batch primitives -- 27d8942e: Update batch serialization with typed batches and zlib compression - -## 0.8.0 - -### Minor Changes - -- 0b4453f7: Deletes the Watcher and injectL2Context functions. Use the SDK instead. - -## 0.7.7 - -### Patch Changes - -- b4165299: Added tests and docstrings to misc functions -- 3c2acd91: Refactor folder structure of @eth-optimism/core-utils. - -## 0.7.6 - -### Patch Changes - -- ba14c59d: Updates various ethers dependencies to their latest versions - -## 0.7.5 - -### Patch Changes - -- ad94b9d1: test/docs: Improve docstrings and tests for utils inside of hex-strings.ts - -## 0.7.4 - -### Patch Changes - -- ba96a455: Improved docstrings for BCFG typings -- c3e85fef: Cleans up the internal file and folder structure for the typings exported by core-utils - -## 0.7.3 - -### Patch Changes - -- 584cbc25: Clean up the L1 => L2 address aliasing utilities - -## 0.7.2 - -### Patch Changes - -- 8e634b49: Fix package JSON issues - -## 0.7.1 - -### Patch Changes - -- 243f33e5: Standardize package json file format - -## 0.7.0 - -### Minor Changes - -- 896168e2: Parse optimistic ethereum specific fields on transaction receipts -- 83a449c4: Change the expectApprox interface to allow setting an absoluteexpected deviation range -- 81ccd6e4: `regenesis/0.5.0` release - -### Patch Changes - -- 3ce62c81: Export bnToAddress -- cee2a464: Add awaitCondition to core utils -- 222a3eef: Add 'User-Agent' to the http headers for ethers providers -- 7c352b1e: Add bytes32ify -- b70ee70c: upgraded to solidity 0.8.9 -- 20c8969b: Correctly move chai into deps instead of dev deps -- 6d32d701: Expose lower level API for tx fees - -## 0.6.1 - -### Patch Changes - -- 6d3e1d7f: Update dependencies -- 2e929aa9: Parse the L1 timestamp in `injectContext` - -## 0.6.0 - -### Minor Changes - -- 8da04505: Allow a configurable L1 and L2 blocks to fetch in the watcher - -### Patch Changes - -- e0be02e1: Add fallback provider support to DTL using helper function in core-utils - -## 0.5.5 - -### Patch Changes - -- eb0854e7: increased coverage of core-utils -- 21b17edd: Added coverage for packages -- dfe3598f: Lower per tx fee overhead to more accurately represent L1 costs - -## 0.5.4 - -### Patch Changes - -- 085b35ba: Watcher: Even lower num blocks to fetch - -## 0.5.3 - -### Patch Changes - -- 2aa4416e: Watcher: Make blocks to fetch a config option -- 0b8180b0: Lower NUM_BLOCKS_TO_FETCH in Watcher - -## 0.5.2 - -### Patch Changes - -- 918c08ca: Bump ethers dependency to 5.4.x to support eip1559 - -## 0.5.1 - -### Patch Changes - -- c73c3939: Update the typescript version to `4.3.5` - -## 0.5.0 - -### Minor Changes - -- 049200f4: removed unused functions from core-utils - -## 0.4.7 - -### Patch Changes - -- 224b04c0: Adds a pollInterval delay to watcher.ts - -## 0.4.6 - -### Patch Changes - -- d9644c34: Minor fix on watchers to pick up finalization of transactions on L1 -- df5ff890: improved watcher ability to find transactions during periods of high load - -## 0.4.5 - -### Patch Changes - -- a64f8161: Implement the next fee spec in both geth and in core-utils -- 750a5021: Delete dead transaction coders. These are no longer used now that RLP encoded transactions are used -- c2b6e14b: Implement the latest fee spec such that the L2 gas limit is scaled and the tx.gasPrice/tx.gasLimit show correctly in metamask - -## 0.4.4 - -### Patch Changes - -- f091e86: Have watcher correctly handle failed L1 => L2 messages -- f880479: End to end fee integration with recoverable L2 gas limit - -## 0.4.3 - -### Patch Changes - -- 96a586e: Migrate bcfg interface to core-utils - -## 0.4.2 - -### Patch Changes - -- b799caa: Update toRpcHexString to accept ethers.BigNumber and add tests - -## 0.4.1 - -### Patch Changes - -- 1d40586: Removed various unused dependencies -- ce7fa52: Add an additional enum for EthSign transactions as they now are batch submitted with 2 different enum values - -## 0.4.0 - -### Minor Changes - -- 28dc442: move metrics, logger, and base-service to new common-ts package - -### Patch Changes - -- a0a0052: Update toRpcHexString to accept ethers.BigNumber and add tests - -## 0.3.2 - -### Patch Changes - -- 6daa408: update hardhat versions so that solc is resolved correctly -- dee74ef: migrate batch submitter types to core-utils -- d64b66d: reformat error context for Sentry - -## 0.3.1 - -### Patch Changes - -- 5077441: - Use raw transaction in batch submitter -- incompatible with L2Geth v0.1.2.1 - - Pass through raw transaction in l2context - -## 0.3.0 - -### Minor Changes - -- 91460d9: add Metrics and use in base-service, rename DTL services to avoid spaces -- a0a7956: initialize Sentry and streams in Logger, remove Sentry from Batch Submitter - -### Patch Changes - -- 0497d7d: Re-organize event typings to core-utils - -## 0.2.3 - -### Patch Changes - -- 35b99b0: add Sentry to TypeScript services for error tracking - -## 0.2.2 - -### Patch Changes - -- 01eaf2c: added extra logs to base-service / dtl to improve observability - -## 0.2.1 - -### Patch Changes - -- 5362d38: adds build files which were not published before to npm - -## 0.2.0 - -### Minor Changes - -- 6cbc54d: allow injecting L2 transaction and block context via core-utils (this removes the need to import the now deprecated @eth-optimism/provider package) diff --git a/packages/core-utils/LICENSE b/packages/core-utils/LICENSE deleted file mode 100644 index 6a7da5218bb2..000000000000 --- a/packages/core-utils/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright 2020-2021 Optimism - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/core-utils/README.md b/packages/core-utils/README.md deleted file mode 100644 index d2c88a1deef1..000000000000 --- a/packages/core-utils/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# @eth-optimism/core-utils - -[![codecov](https://codecov.io/gh/ethereum-optimism/optimism/branch/develop/graph/badge.svg?token=0VTG7PG7YR&flag=core-utils-tests)](https://codecov.io/gh/ethereum-optimism/optimism) - -## What is this? - -`@eth-optimism/core-utils` contains the Optimistic Virtual Machine core utilities. - -## Getting started - -### Building and usage - -After cloning and switching to the repository, install dependencies: - -```bash -$ pnpm i -``` - -Use the following commands to build, use, test, and lint: - -```bash -$ pnpm build -$ pnpm start -$ pnpm test -$ pnpm lint -``` diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json deleted file mode 100644 index 3b54061c0369..000000000000 --- a/packages/core-utils/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "@eth-optimism/core-utils", - "version": "0.13.1", - "description": "[Optimism] Core typescript utilities", - "main": "dist/index", - "types": "dist/index", - "files": [ - "dist/*" - ], - "scripts": { - "all": "pnpm clean && pnpm build && pnpm test && pnpm lint:fix && pnpm lint", - "build": "tsc -p tsconfig.json", - "clean": "rimraf dist/ ./tsconfig.tsbuildinfo", - "lint": "pnpm lint:fix && pnpm lint:check", - "lint:check": "eslint . --max-warnings=0", - "lint:fix": "pnpm lint:check --fix", - "pre-commit": "lint-staged", - "test": "ts-mocha test/**/*.spec.ts", - "test:coverage": "nyc ts-mocha test/**/*.spec.ts && nyc merge .nyc_output coverage.json" - }, - "keywords": [ - "optimism", - "ethereum", - "core", - "utils" - ], - "homepage": "https://github.com/ethereum-optimism/optimism/tree/develop/packages/core-utils#readme", - "license": "MIT", - "author": "Optimism PBC", - "repository": { - "type": "git", - "url": "https://github.com/ethereum-optimism/optimism.git" - }, - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/contracts": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/web": "^5.7.1", - "chai": "^4.3.10", - "ethers": "^5.7.2", - "node-fetch": "^2.6.7" - }, - "devDependencies": { - "@types/node": "^20.11.17", - "mocha": "^10.2.0" - } -} diff --git a/packages/core-utils/src/common/basic-types.ts b/packages/core-utils/src/common/basic-types.ts deleted file mode 100644 index 0ce466618db7..000000000000 --- a/packages/core-utils/src/common/basic-types.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Use this file for simple types that aren't necessarily associated with a specific project or -// package. Often used for alias types like Address = string. - -export interface Signature { - r: string - s: string - v: number -} -export type Bytes32 = string -export type Uint16 = number -export type Uint8 = number -export type Uint24 = number -export type Address = string diff --git a/packages/core-utils/src/common/bn.ts b/packages/core-utils/src/common/bn.ts deleted file mode 100644 index 4ef48ac69c3c..000000000000 --- a/packages/core-utils/src/common/bn.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { BigNumber } from '@ethersproject/bignumber' -import { getAddress } from '@ethersproject/address' - -import { remove0x, add0x } from './hex-strings' - -/** - * Converts an ethers BigNumber into an equivalent Ethereum address representation. - * - * @param bn BigNumber to convert to an address. - * @return BigNumber converted to an address, represented as a hex string. - */ -export const bnToAddress = (bn: BigNumber | number): string => { - // Coerce numbers into a BigNumber. - bn = BigNumber.from(bn) - - // Negative numbers are converted to addresses by adding MAX_ADDRESS + 1. - // TODO: Explain this in more detail, it's basically just matching the behavior of doing - // addr(uint256(addr) - some_number) in Solidity where some_number > uint256(addr). - if (bn.isNegative()) { - bn = BigNumber.from('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF') - .add(bn) - .add(1) - } - - // Convert to a hex string - let addr = bn.toHexString() - // Remove leading 0x so we can mutate the address a bit - addr = remove0x(addr) - // Make sure it's 40 characters (= 20 bytes) - addr = addr.padStart(40, '0') - // Only take the last 40 characters (= 20 bytes) - addr = addr.slice(addr.length - 40, addr.length) - // Add 0x again - addr = add0x(addr) - // Convert into a checksummed address - addr = getAddress(addr) - - return addr -} diff --git a/packages/core-utils/src/common/hex-strings.ts b/packages/core-utils/src/common/hex-strings.ts deleted file mode 100644 index bc9f365cccff..000000000000 --- a/packages/core-utils/src/common/hex-strings.ts +++ /dev/null @@ -1,135 +0,0 @@ -/* Imports: External */ -import { BigNumber } from '@ethersproject/bignumber' -import { isHexString, hexZeroPad } from '@ethersproject/bytes' - -/** - * Removes "0x" from start of a string if it exists. - * - * @param str String to modify. - * @returns the string without "0x". - */ -export const remove0x = (str: string): string => { - if (str === undefined) { - return str - } - return str.startsWith('0x') ? str.slice(2) : str -} - -/** - * Adds "0x" to the start of a string if necessary. - * - * @param str String to modify. - * @returns the string with "0x". - */ -export const add0x = (str: string): string => { - if (str === undefined) { - return str - } - return str.startsWith('0x') ? str : '0x' + str -} - -/** - * Casts a hex string to a buffer. - * - * @param inp Input to cast to a buffer. - * @return Input cast as a buffer. - */ -export const fromHexString = (inp: Buffer | string): Buffer => { - if (typeof inp === 'string' && inp.startsWith('0x')) { - return Buffer.from(inp.slice(2), 'hex') - } - - return Buffer.from(inp) -} - -/** - * Casts an input to a hex string. - * - * @param inp Input to cast to a hex string. - * @return Input cast as a hex string. - */ -export const toHexString = (inp: Buffer | string | number | null): string => { - if (typeof inp === 'number') { - return BigNumber.from(inp).toHexString() - } else { - return '0x' + fromHexString(inp).toString('hex') - } -} - -/** - * Casts a number to a hex string without zero padding. - * - * @param n Number to cast to a hex string. - * @return Number cast as a hex string. - */ -export const toRpcHexString = (n: number | BigNumber): string => { - let num - if (typeof n === 'number') { - num = '0x' + n.toString(16) - } else { - num = n.toHexString() - } - - if (num === '0x0') { - return num - } else { - // BigNumber pads a single 0 to keep hex length even - return num.replace(/^0x0/, '0x') - } -} - -/** - * Zero pads a hex string if str.length !== 2 + length * 2. Pads to length * 2. - * - * @param str Hex string to pad - * @param length Half the length of the desired padded hex string - * @return Hex string with length of 2 + length * 2 - */ -export const padHexString = (str: string, length: number): string => { - if (str.length === 2 + length * 2) { - return str - } else { - return '0x' + str.slice(2).padStart(length * 2, '0') - } -} - -/** - * Casts an input to hex string without '0x' prefix with conditional padding. - * Hex string will always start with a 0. - * - * @param val Input to cast to a hex string. - * @param len Desired length to pad hex string. Ignored if less than hex string length. - * @return Hex string with '0' prefix - */ -export const encodeHex = (val: any, len: number): string => - remove0x(BigNumber.from(val).toHexString()).padStart(len, '0') - -/** - * Case insensitive hex string equality check - * - * @param stringA Hex string A - * @param stringB Hex string B - * @throws {Error} Inputs must be valid hex strings - * @return True if equal - */ -export const hexStringEquals = (stringA: string, stringB: string): boolean => { - if (!isHexString(stringA)) { - throw new Error(`input is not a hex string: ${stringA}`) - } - - if (!isHexString(stringB)) { - throw new Error(`input is not a hex string: ${stringB}`) - } - - return stringA.toLowerCase() === stringB.toLowerCase() -} - -/** - * Casts a number to a 32-byte, zero padded hex string. - * - * @param value Number to cast to a hex string. - * @return Number cast as a hex string. - */ -export const bytes32ify = (value: number | BigNumber): string => { - return hexZeroPad(BigNumber.from(value).toHexString(), 32) -} diff --git a/packages/core-utils/src/common/index.ts b/packages/core-utils/src/common/index.ts deleted file mode 100644 index bb9db51af7be..000000000000 --- a/packages/core-utils/src/common/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Common JavaScript/TypeScript utilities - */ - -export * from './basic-types' -export * from './bn' -export * from './hex-strings' -export * from './misc' -export * from './test-utils' diff --git a/packages/core-utils/src/common/misc.ts b/packages/core-utils/src/common/misc.ts deleted file mode 100644 index 6f5230a79311..000000000000 --- a/packages/core-utils/src/common/misc.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Basic timeout-based async sleep function. - * - * @param ms Number of milliseconds to sleep. - */ -export const sleep = async (ms: number): Promise => { - return new Promise((resolve) => { - setTimeout(() => { - resolve(null) - }, ms) - }) -} - -/** - * Returns a clone of the object. - * - * @param obj Object to clone. - * @returns Clone of the object. - */ -export const clone = (obj: any): any => { - if (typeof obj === 'undefined') { - throw new Error(`Trying to clone undefined object`) - } - return { ...obj } -} - -/** - * Loads a variable from the environment and throws if the variable is not defined. - * - * @param name Name of the variable to load. - * @returns Value of the variable as a string. - */ -export const reqenv = (name: string): string => { - const value = process.env[name] - if (value === undefined) { - throw new Error(`missing env var ${name}`) - } - return value -} - -/** - * Loads a variable from the environment and returns a fallback if not found. - * - * @param name Name of the variable to load. - * @param [fallback] Optional value to be returned as fallback. - * @returns Value of the variable as a string, fallback or undefined. - */ -export const getenv = (name: string, fallback?: string): string | undefined => { - return process.env[name] || fallback -} - -/** - * Returns true if the given string is a valid address. - * - * @param a First address to check. - * @param b Second address to check. - * @returns True if the given addresses match. - */ -export const compareAddrs = (a: string, b: string): boolean => { - return a.toLowerCase() === b.toLowerCase() -} diff --git a/packages/core-utils/src/common/test-utils.ts b/packages/core-utils/src/common/test-utils.ts deleted file mode 100644 index 9ee8e11ebda6..000000000000 --- a/packages/core-utils/src/common/test-utils.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { expect } from 'chai' -import { BigNumber } from '@ethersproject/bignumber' - -import { sleep } from './misc' - -interface deviationRanges { - percentUpperDeviation?: number - percentLowerDeviation?: number - absoluteUpperDeviation?: number - absoluteLowerDeviation?: number -} - -export const awaitCondition = async ( - cond: () => Promise, - rate = 1000, - attempts = 10 -) => { - for (let i = 0; i < attempts; i++) { - const ok = await cond() - if (ok) { - return - } - - await sleep(rate) - } - - throw new Error('Timed out.') -} - -/** - * Assert that a number lies within a custom defined range of the target. - */ -export const expectApprox = ( - actual: BigNumber | number, - target: BigNumber | number, - { - percentUpperDeviation, - percentLowerDeviation, - absoluteUpperDeviation, - absoluteLowerDeviation, - }: deviationRanges -): void => { - actual = BigNumber.from(actual) - target = BigNumber.from(target) - - // Ensure at least one deviation parameter is defined - const nonNullDeviations = - percentUpperDeviation || - percentLowerDeviation || - absoluteUpperDeviation || - absoluteLowerDeviation - if (!nonNullDeviations) { - throw new Error( - 'Must define at least one parameter to limit the deviation of the actual value.' - ) - } - - // Upper bound calculation. - let upper: BigNumber - // Set the two possible upper bounds if and only if they are defined. - const upperPcnt: BigNumber = !percentUpperDeviation - ? null - : target.mul(100 + percentUpperDeviation).div(100) - const upperAbs: BigNumber = !absoluteUpperDeviation - ? null - : target.add(absoluteUpperDeviation) - - if (upperPcnt && upperAbs) { - // If both are set, take the lesser of the two upper bounds. - upper = upperPcnt.lte(upperAbs) ? upperPcnt : upperAbs - } else { - // Else take whichever is not undefined or set to null. - upper = upperPcnt || upperAbs - } - - // Lower bound calculation. - let lower: BigNumber - // Set the two possible lower bounds if and only if they are defined. - const lowerPcnt: BigNumber = !percentLowerDeviation - ? null - : target.mul(100 - percentLowerDeviation).div(100) - const lowerAbs: BigNumber = !absoluteLowerDeviation - ? null - : target.sub(absoluteLowerDeviation) - if (lowerPcnt && lowerAbs) { - // If both are set, take the greater of the two lower bounds. - lower = lowerPcnt.gte(lowerAbs) ? lowerPcnt : lowerAbs - } else { - // Else take whichever is not undefined or set to null. - lower = lowerPcnt || lowerAbs - } - - // Apply the assertions if they are non-null. - if (upper) { - expect( - actual.lte(upper), - `Actual value (${actual}) is greater than the calculated upper bound of (${upper})` - ).to.be.true - } - if (lower) { - expect( - actual.gte(lower), - `Actual value (${actual}) is less than the calculated lower bound of (${lower})` - ).to.be.true - } -} diff --git a/packages/core-utils/src/etherscan.ts b/packages/core-utils/src/etherscan.ts deleted file mode 100644 index 19bb5bf340e2..000000000000 --- a/packages/core-utils/src/etherscan.ts +++ /dev/null @@ -1,85 +0,0 @@ -import fetch from 'node-fetch' - -interface NetworkData { - chainId: number - names: string[] - etherscanApiUrl: string -} - -const networks: { - [id: number]: NetworkData -} = { - 1: { - chainId: 1, - names: ['mainnet', 'main', 'eth', 'ethereum'], - etherscanApiUrl: 'https://api.etherscan.io', - }, - 3: { - chainId: 3, - names: ['ropsten'], - etherscanApiUrl: 'https://api-ropsten.etherscan.io', - }, - 4: { - chainId: 4, - names: ['rinkeby'], - etherscanApiUrl: 'https://api-rinkeby.etherscan.io', - }, - 5: { - chainId: 5, - names: ['goerli'], - etherscanApiUrl: 'https://api-goerli.etherscan.io', - }, - 10: { - chainId: 10, - names: ['optimism'], - etherscanApiUrl: 'https://api-optimistic.etherscan.io', - }, - 42: { - chainId: 42, - names: ['kovan'], - etherscanApiUrl: 'https://api-kovan.etherscan.io', - }, - 69: { - chainId: 69, - names: ['opkovan', 'kovan-optimism', 'optimistic-kovan'], - etherscanApiUrl: 'https://api-kovan-optimistic.etherscan.io', - }, -} - -export class Etherscan { - net: NetworkData - - constructor( - private readonly apiKey: string, - private readonly network: string | number - ) { - if (typeof network === 'string') { - this.net = Object.values(networks).find((net) => { - return net.names.includes(network) - }) - } else { - this.net = networks[this.network] - } - } - - public async getContractSource(address: string): Promise { - const url = new URL(`${this.net.etherscanApiUrl}/api`) - url.searchParams.append('module', 'contract') - url.searchParams.append('action', 'getsourcecode') - url.searchParams.append('address', address) - url.searchParams.append('apikey', this.apiKey) - const response = await fetch(url) - const result = await response.json() - return (result as { result: number[] }).result[0] - } - - public async getContractABI(address: string): Promise { - const source = await this.getContractSource(address) - if (source.Proxy === '1') { - const impl = await this.getContractSource(source.Implementation) - return impl.ABI - } else { - return source.ABI - } - } -} diff --git a/packages/core-utils/src/external/bcfg/bcfg-types.ts b/packages/core-utils/src/external/bcfg/bcfg-types.ts deleted file mode 100644 index 15c4065cea5f..000000000000 --- a/packages/core-utils/src/external/bcfg/bcfg-types.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * TypeScript typings for bcoin's BCFG config parser (https://github.com/bcoin-org/bcfg) - * This is NOT a complete set of typings, just what we use at Optimism at the moment. - * We could consider expanding this into a full set of typings in the future. - */ -export interface Bcfg { - /** - * Loads configuration values from the environment. Must be called before environment variables - * can be accessed with other methods like str(...) or uint(...). - * - * @param options Options to use when loading arguments. - * @param options.env Boolean, whether or not to load from process.env. - * @param options.argv Boolean, whether or not to load from process.argv. - */ - load: (options: { env?: boolean; argv?: boolean }) => void - - /** - * Returns the variable with the given name and casts it as a string. Queries from the - * environment or from argv depending on which were loaded when load() was called. - * - * @param name Name of the variable to query. - * @param defaultValue Optional default value if the variable does not exist. - * @returns Variable cast to a string. - */ - str: (name: string, defaultValue?: string) => string - - /** - * Returns the variable with the given name and casts it as a uint. Will throw an error if the - * variable cannot be cast into a uint. Queries from the environment or from argv depending on - * which were loaded when load() was called. - * - * @param name Name of the variable to query. - * @param defaultValue Optional default value if the variable does not exist. - * @returns Variable cast to a uint. - */ - uint: (name: string, defaultValue?: number) => number - - /** - * Returns the variable with the given name and casts it as a bool. Will throw an error if the - * variable cannot be cast into a bool. Queries from the environment or from argv depending on - * which were loaded when load() was called. - * - * @param name Name of the variable to query. - * @param defaultValue Optional default value if the variable does not exist. - * @returns Variable cast to a bool. - */ - bool: (name: string, defaultValue?: boolean) => boolean - - /** - * Returns the variable with the given name and casts it as a ufloat. Will throw an error if the - * variable cannot be cast into a ufloat. Queries from the environment or from argv depending on - * which were loaded when load() was called. - * - * @param name Name of the variable to query. - * @param defaultValue Optional default value if the variable does not exist. - * @returns Variable cast to a ufloat. - */ - ufloat: (name: string, defaultValue?: number) => number - - /** - * Checks if the given variable exists. - * - * @param name Name of the variable to query. - * @returns True if the variable exists, false otherwise. - */ - has: (name: string) => boolean -} diff --git a/packages/core-utils/src/external/bcfg/index.ts b/packages/core-utils/src/external/bcfg/index.ts deleted file mode 100644 index 0d51f6a102d1..000000000000 --- a/packages/core-utils/src/external/bcfg/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Utilities related to BCFG - */ - -export * from './bcfg-types' diff --git a/packages/core-utils/src/external/ethers/index.ts b/packages/core-utils/src/external/ethers/index.ts deleted file mode 100644 index 2c3855bf3787..000000000000 --- a/packages/core-utils/src/external/ethers/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Utilities that extend or enhance the ethers.js library - */ - -export * from './network' diff --git a/packages/core-utils/src/external/ethers/network.ts b/packages/core-utils/src/external/ethers/network.ts deleted file mode 100644 index 603c980bd1b8..000000000000 --- a/packages/core-utils/src/external/ethers/network.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Provider } from '@ethersproject/abstract-provider' - -export const getChainId = async (provider: Provider): Promise => { - const network = await provider.getNetwork() - return network.chainId -} diff --git a/packages/core-utils/src/external/index.ts b/packages/core-utils/src/external/index.ts deleted file mode 100644 index 272bb5ff560d..000000000000 --- a/packages/core-utils/src/external/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Utilities related to specific external projects - */ - -export * from './bcfg' -export * from './ethers' diff --git a/packages/core-utils/src/gnosis-safe-checksum.ts b/packages/core-utils/src/gnosis-safe-checksum.ts deleted file mode 100644 index ca217e5b3ddb..000000000000 --- a/packages/core-utils/src/gnosis-safe-checksum.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { ethers } from 'ethers' - -// Slightly modified from: -// https://github.com/safe-global/safe-react-apps/blob/development/apps/tx-builder/src/lib/checksum.ts - -const stringifyReplacer = (_: string, value: any) => - value === undefined ? null : value - -const serializeJSONObject = (json: any): string => { - if (Array.isArray(json)) { - return `[${json.map((el) => serializeJSONObject(el)).join(',')}]` - } - - if (typeof json === 'object' && json !== null) { - let acc = '' - const keys = Object.keys(json).sort() - acc += `{${JSON.stringify(keys, stringifyReplacer)}` - - for (const key of keys) { - acc += `${serializeJSONObject(json[key])},` - } - - return `${acc}}` - } - - return `${JSON.stringify(json, stringifyReplacer)}` -} - -const calculateChecksum = (batchFile: any): string | undefined => { - const serialized = serializeJSONObject({ - ...batchFile, - meta: { ...batchFile.meta, name: null }, - }) - const sha = ethers.utils.solidityKeccak256(['string'], [serialized]) - - return sha || undefined -} - -export const addChecksum = (batchFile: any): any => { - return { - ...batchFile, - meta: { - ...batchFile.meta, - checksum: calculateChecksum(batchFile), - }, - } -} diff --git a/packages/core-utils/src/helpers/setupProxyContract.ts b/packages/core-utils/src/helpers/setupProxyContract.ts deleted file mode 100644 index 42dc44485b1f..000000000000 --- a/packages/core-utils/src/helpers/setupProxyContract.ts +++ /dev/null @@ -1,132 +0,0 @@ -import assert from 'assert' - -import { ethers, utils } from 'ethers' - -const { getAddress } = utils - -type ProxyConfig = { - targetImplAddress: string - targetProxyOwnerAddress: string - postUpgradeCallCalldata?: string -} - -// Sets up the newly deployed proxy contract such that: -// 1. The proxy's implementation is set to the target implementation -// 2. The proxy's admin is set to the target proxy owner -// -// If the values are set correctly already, it makes no transactions. - -const setupProxyContract = async ( - proxyContract: ethers.Contract, - signer: ethers.Signer, - { - targetImplAddress, - targetProxyOwnerAddress, - postUpgradeCallCalldata, - }: ProxyConfig -) => { - const currentAdmin = await proxyContract - .connect(ethers.constants.AddressZero) - .callStatic.admin() - - const signerAddress = await signer.getAddress() - - // Gets the current implementation address the proxy is pointing to. - // callStatic is used since the `Proxy.implementation()` is not a view function and ethers will - // try to make a transaction if we don't use callStatic. Using the zero address as `from` lets us - // call functions on the proxy and not trigger the delegatecall. See Proxy.sol proxyCallIfNotAdmin - // modifier for more details. - const currentImplementation = await proxyContract - .connect(ethers.constants.AddressZero) - .callStatic.implementation() - console.log(`implementation currently set to ${currentImplementation}`) - - if (getAddress(currentImplementation) !== getAddress(targetImplAddress)) { - // If the proxy isn't pointing to the correct implementation, we need to set it to the correct - // one, then call initialize() in the proxy's context. - - console.log('implementation not set to correct contract') - console.log(`Setting implementation to ${targetImplAddress}`) - - // The signer needs to be the current admin, otherwise we don't have permission - // to update the implementation or admin - assert( - signerAddress === currentAdmin, - 'the passed signer is not the admin, cannot update implementation' - ) - - let tx: ethers.providers.TransactionResponse - if (!postUpgradeCallCalldata) { - console.log( - 'postUpgradeCallCalldata is not provided. Using Proxy.upgrade()' - ) - // Point the proxy to the target implementation - tx = await proxyContract.connect(signer).upgradeTo(targetImplAddress) - } else { - console.log( - 'postUpgradeCallCalldata is provided. Using Proxy.upgradeAndCall()' - ) - // Point the proxy to the target implementation, - // and call function in the proxy's context - tx = await proxyContract - .connect(signer) - .upgradeToAndCall(targetImplAddress, postUpgradeCallCalldata) - } - - const receipt = await tx.wait() - - console.log(`implementation set in ${receipt.transactionHash}`) - } else { - console.log(`implementation already set correctly to ${targetImplAddress}`) - } - - console.log(`admin set to ${currentAdmin}`) - if (getAddress(currentAdmin) !== getAddress(targetProxyOwnerAddress)) { - // If the proxy admin isn't the l2ProxyOwnerAddress, we need to update it - // We're assuming that the proxy admin is the ddd right now. - - console.log('detected admin is not set correctly') - console.log(`Setting admin to ${targetProxyOwnerAddress}`) - - // The signer needs to be the current admin, otherwise we don't have permission - // to update the implementation or admin - assert( - signerAddress === currentAdmin, - 'proxyOwnerSigner is not the admin, cannot update admin' - ) - - // change admin to the l2ProxyOwnerAddress - const tx = await proxyContract - .connect(signer) - .changeAdmin(targetProxyOwnerAddress) - - const receipt = await tx.wait() - - console.log(`admin set in ${receipt.transactionHash}`) - } else { - console.log(`admin already set correctly to ${targetProxyOwnerAddress}`) - } - - const updatedImplementation = await proxyContract - .connect(ethers.constants.AddressZero) - .callStatic.implementation() - - const updatedAdmin = await proxyContract - .connect(ethers.constants.AddressZero) - .callStatic.admin() - - assert( - getAddress(updatedAdmin) === getAddress(targetProxyOwnerAddress), - 'Something went wrong - admin not set correctly after transaction' - ) - assert( - getAddress(updatedImplementation) === getAddress(targetImplAddress), - 'Something went wrong - implementation not set correctly after transaction' - ) - - console.log( - `Proxy at ${proxyContract.address} is set up with implementation: ${updatedImplementation} and admin: ${updatedAdmin}` - ) -} - -export { setupProxyContract } diff --git a/packages/core-utils/src/index.ts b/packages/core-utils/src/index.ts deleted file mode 100644 index 9df35af788d8..000000000000 --- a/packages/core-utils/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './common' -export * from './external' -export * from './optimism' -export * from './gnosis-safe-checksum' -export * from './etherscan' -export * from './helpers/setupProxyContract' diff --git a/packages/core-utils/src/optimism/alias.ts b/packages/core-utils/src/optimism/alias.ts deleted file mode 100644 index f0b33851ae34..000000000000 --- a/packages/core-utils/src/optimism/alias.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { isAddress } from '@ethersproject/address' -import { BigNumber } from '@ethersproject/bignumber' - -import { bnToAddress } from '../common' - -// Constant representing the alias to apply to the msg.sender when a contract sends an L1 => L2 -// message. We need this aliasing scheme because a contract can be deployed to the same address -// on both L1 and L2 but with different bytecode (address is not dependent on bytecode when using -// the standard CREATE opcode). We want to treat L1 contracts as having a different address while -// still making it possible for L2 contracts to easily reverse the aliasing scheme and figure out -// the real address of the contract that sent the L1 => L2 message. -export const L1_TO_L2_ALIAS_OFFSET = - '0x1111000000000000000000000000000000001111' - -/** - * Applies the L1 => L2 aliasing scheme to an address. - * - * @param address Address to apply the scheme to. - * @returns Address with the scheme applied. - */ -export const applyL1ToL2Alias = (address: string): string => { - if (!isAddress(address)) { - throw new Error(`not a valid address: ${address}`) - } - - return bnToAddress(BigNumber.from(address).add(L1_TO_L2_ALIAS_OFFSET)) -} - -/** - * Reverses the L1 => L2 aliasing scheme from an address. - * - * @param address Address to reverse the scheme from. - * @returns Alias with the scheme reversed. - */ -export const undoL1ToL2Alias = (address: string): string => { - if (!isAddress(address)) { - throw new Error(`not a valid address: ${address}`) - } - - return bnToAddress(BigNumber.from(address).sub(L1_TO_L2_ALIAS_OFFSET)) -} diff --git a/packages/core-utils/src/optimism/constants.ts b/packages/core-utils/src/optimism/constants.ts deleted file mode 100644 index f278267c769f..000000000000 --- a/packages/core-utils/src/optimism/constants.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ethers } from 'ethers' - -/** - * Predeploys are Solidity contracts that are injected into the initial L2 state and provide - * various useful functions. - * Notes: - * 0x42...04 was the address of the OVM_ProxySequencerEntrypoint. This contract is no longer in - * use and has therefore been removed. We may place a new predeployed contract at this address - * in the future. See https://github.com/ethereum-optimism/optimism/pull/549 for more info. - */ -export const predeploys = { - L2ToL1MessagePasser: '0x4200000000000000000000000000000000000016', - DeployerWhitelist: '0x4200000000000000000000000000000000000002', - L2CrossDomainMessenger: '0x4200000000000000000000000000000000000007', - GasPriceOracle: '0x420000000000000000000000000000000000000F', - L2StandardBridge: '0x4200000000000000000000000000000000000010', - SequencerFeeVault: '0x4200000000000000000000000000000000000011', - OptimismMintableERC20Factory: '0x4200000000000000000000000000000000000012', - L1BlockNumber: '0x4200000000000000000000000000000000000013', - L1Block: '0x4200000000000000000000000000000000000015', - LegacyERC20ETH: '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', - WETH9: '0x4200000000000000000000000000000000000006', - GovernanceToken: '0x4200000000000000000000000000000000000042', - LegacyMessagePasser: '0x4200000000000000000000000000000000000000', - L2ERC721Bridge: '0x4200000000000000000000000000000000000014', - OptimismMintableERC721Factory: '0x4200000000000000000000000000000000000017', - ProxyAdmin: '0x4200000000000000000000000000000000000018', - BaseFeeVault: '0x4200000000000000000000000000000000000019', - L1FeeVault: '0x420000000000000000000000000000000000001a', -} - -const uint128Max = ethers.BigNumber.from('0xffffffffffffffffffffffffffffffff') - -export const defaultResourceConfig = { - maxResourceLimit: 20_000_000, - elasticityMultiplier: 10, - baseFeeMaxChangeDenominator: 8, - minimumBaseFee: ethers.utils.parseUnits('1', 'gwei'), - systemTxMaxGas: 1_000_000, - maximumBaseFee: uint128Max, -} diff --git a/packages/core-utils/src/optimism/deposit-transaction.ts b/packages/core-utils/src/optimism/deposit-transaction.ts deleted file mode 100644 index 7715781352ba..000000000000 --- a/packages/core-utils/src/optimism/deposit-transaction.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { getAddress } from '@ethersproject/address' -import { ContractReceipt, Event } from '@ethersproject/contracts' -import { BigNumber, BigNumberish } from '@ethersproject/bignumber' -import { keccak256 } from '@ethersproject/keccak256' -import { Zero } from '@ethersproject/constants' -import * as RLP from '@ethersproject/rlp' -import { - arrayify, - BytesLike, - hexDataSlice, - stripZeros, - hexConcat, - zeroPad, -} from '@ethersproject/bytes' - -const formatBoolean = (value: boolean): Uint8Array => { - return value ? new Uint8Array([1]) : new Uint8Array([]) -} - -const formatNumber = (value: BigNumberish, name: string): Uint8Array => { - const result = stripZeros(BigNumber.from(value).toHexString()) - if (result.length > 32) { - throw new Error(`invalid length for ${name}`) - } - return result -} - -const handleBoolean = (value: string): boolean => { - if (value === '0x') { - return false - } - if (value === '0x01') { - return true - } - throw new Error(`invalid boolean RLP hex value ${value}`) -} - -const handleNumber = (value: string): BigNumber => { - if (value === '0x') { - return Zero - } - return BigNumber.from(value) -} - -const handleAddress = (value: string): string => { - if (value === '0x') { - // @ts-ignore - return null - } - return getAddress(value) -} - -export enum SourceHashDomain { - UserDeposit = 0, - L1InfoDeposit = 1, -} - -interface DepositTxOpts { - sourceHash?: string - from: string - to: string | null - mint: BigNumberish - value: BigNumberish - gas: BigNumberish - isSystemTransaction: boolean - data: string - domain?: SourceHashDomain - l1BlockHash?: string - logIndex?: BigNumberish - sequenceNumber?: BigNumberish -} - -interface DepositTxExtraOpts { - domain?: SourceHashDomain - l1BlockHash?: string - logIndex?: BigNumberish - sequenceNumber?: BigNumberish -} - -export class DepositTx { - public type = 0x7e - public version = 0x00 - private _sourceHash?: string - public from: string - public to: string | null - public mint: BigNumberish - public value: BigNumberish - public gas: BigNumberish - public isSystemTransaction: boolean - public data: BigNumberish - - public domain?: SourceHashDomain - public l1BlockHash?: string - public logIndex?: BigNumberish - public sequenceNumber?: BigNumberish - - constructor(opts: Partial = {}) { - this._sourceHash = opts.sourceHash - this.from = opts.from! - this.to = opts.to! - this.mint = opts.mint! - this.value = opts.value! - this.gas = opts.gas! - this.isSystemTransaction = opts.isSystemTransaction || false - this.data = opts.data! - this.domain = opts.domain - this.l1BlockHash = opts.l1BlockHash - this.logIndex = opts.logIndex - this.sequenceNumber = opts.sequenceNumber - } - - hash() { - const encoded = this.encode() - return keccak256(encoded) - } - - sourceHash() { - if (!this._sourceHash) { - let marker: string - switch (this.domain) { - case SourceHashDomain.UserDeposit: - marker = BigNumber.from(this.logIndex).toHexString() - break - case SourceHashDomain.L1InfoDeposit: - marker = BigNumber.from(this.sequenceNumber).toHexString() - break - default: - throw new Error(`Unknown domain: ${this.domain}`) - } - - if (!this.l1BlockHash) { - throw new Error('Need l1BlockHash to compute sourceHash') - } - - const l1BlockHash = this.l1BlockHash - const input = hexConcat([l1BlockHash, zeroPad(marker, 32)]) - const depositIDHash = keccak256(input) - const domain = BigNumber.from(this.domain).toHexString() - const domainInput = hexConcat([zeroPad(domain, 32), depositIDHash]) - this._sourceHash = keccak256(domainInput) - } - return this._sourceHash - } - - encode() { - const fields: any = [ - this.sourceHash() || '0x', - getAddress(this.from) || '0x', - this.to != null ? getAddress(this.to) : '0x', - formatNumber(this.mint || 0, 'mint'), - formatNumber(this.value || 0, 'value'), - formatNumber(this.gas || 0, 'gas'), - formatBoolean(this.isSystemTransaction), - this.data || '0x', - ] - - return hexConcat([ - BigNumber.from(this.type).toHexString(), - RLP.encode(fields), - ]) - } - - decode(raw: BytesLike, extra: DepositTxExtraOpts = {}) { - const payload = arrayify(raw) - if (payload[0] !== this.type) { - throw new Error(`Invalid type ${payload[0]}`) - } - this.version = payload[1] - const transaction = RLP.decode(payload.slice(1)) - this._sourceHash = transaction[0] - this.from = handleAddress(transaction[1]) - this.to = handleAddress(transaction[2]) - this.mint = handleNumber(transaction[3]) - this.value = handleNumber(transaction[4]) - this.gas = handleNumber(transaction[5]) - this.isSystemTransaction = handleBoolean(transaction[6]) - this.data = transaction[7] - - if ('l1BlockHash' in extra) { - this.l1BlockHash = extra.l1BlockHash - } - if ('domain' in extra) { - this.domain = extra.domain - } - if ('logIndex' in extra) { - this.logIndex = extra.logIndex - } - if ('sequenceNumber' in extra) { - this.sequenceNumber = extra.sequenceNumber - } - return this - } - - static decode(raw: BytesLike, extra?: DepositTxExtraOpts): DepositTx { - return new this().decode(raw, extra) - } - - fromL1Receipt(receipt: ContractReceipt, index: number): DepositTx { - if (!receipt.events) { - throw new Error('cannot parse receipt') - } - const event = receipt.events[index] - if (!event) { - throw new Error(`event index ${index} does not exist`) - } - return this.fromL1Event(event) - } - - static fromL1Receipt(receipt: ContractReceipt, index: number): DepositTx { - return new this({}).fromL1Receipt(receipt, index) - } - - fromL1Event(event: Event): DepositTx { - if (event.event !== 'TransactionDeposited') { - throw new Error(`incorrect event type: ${event.event}`) - } - if (typeof event.args === 'undefined') { - throw new Error('no event args') - } - if (typeof event.args.from === 'undefined') { - throw new Error('"from" undefined') - } - this.from = event.args.from - if (typeof event.args.to === 'undefined') { - throw new Error('"to" undefined') - } - if (typeof event.args.version === 'undefined') { - throw new Error(`"verison" undefined`) - } - if (!event.args.version.eq(0)) { - throw new Error(`Unsupported version ${event.args.version.toString()}`) - } - if (typeof event.args.opaqueData === 'undefined') { - throw new Error(`"opaqueData" undefined`) - } - - const opaqueData = event.args.opaqueData - if (opaqueData.length < 32 + 32 + 8 + 1) { - throw new Error(`invalid opaqueData size: ${opaqueData.length}`) - } - - let offset = 0 - this.mint = BigNumber.from(hexDataSlice(opaqueData, offset, offset + 32)) - offset += 32 - this.value = BigNumber.from(hexDataSlice(opaqueData, offset, offset + 32)) - offset += 32 - this.gas = BigNumber.from(hexDataSlice(opaqueData, offset, offset + 8)) - offset += 8 - const isCreation = BigNumber.from(opaqueData[offset]).eq(1) - offset += 1 - this.to = isCreation === true ? null : event.args.to - const length = opaqueData.length - offset - this.isSystemTransaction = false - this.data = hexDataSlice(opaqueData, offset, offset + length) - this.domain = SourceHashDomain.UserDeposit - this.l1BlockHash = event.blockHash - this.logIndex = event.logIndex - return this - } - - static fromL1Event(event: Event): DepositTx { - return new this({}).fromL1Event(event) - } -} diff --git a/packages/core-utils/src/optimism/encoding.ts b/packages/core-utils/src/optimism/encoding.ts deleted file mode 100644 index 665eea605508..000000000000 --- a/packages/core-utils/src/optimism/encoding.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { BigNumberish, BigNumber } from '@ethersproject/bignumber' -import { Interface } from '@ethersproject/abi' - -const iface = new Interface([ - 'function relayMessage(address,address,bytes,uint256)', - 'function relayMessage(uint256,address,address,uint256,uint256,bytes)', -]) - -const nonceMask = BigNumber.from( - '0x0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' -) - -/** - * Encodes the version into the nonce. - * - * @param nonce - * @param version - */ -export const encodeVersionedNonce = ( - nonce: BigNumber, - version: BigNumber -): BigNumber => { - return version.or(nonce.shl(240)) -} - -/** - * Decodes the version from the nonce and returns the unversioned nonce as well - * as the version. The version is encoded in the first byte of - * the nonce. Note that this nonce is the nonce held in the - * CrossDomainMessenger. - * - * @param nonce - */ -export const decodeVersionedNonce = ( - nonce: BigNumber -): { - version: BigNumber - nonce: BigNumber -} => { - return { - version: nonce.shr(240), - nonce: nonce.and(nonceMask), - } -} - -/** - * Encodes a V1 cross domain message. This message format was used before - * bedrock and does not support value transfer because ETH was represented as an - * ERC20 natively. - * - * @param target The target of the cross domain message - * @param sender The sender of the cross domain message - * @param data The data passed along with the cross domain message - * @param nonce The cross domain message nonce - */ -export const encodeCrossDomainMessageV0 = ( - target: string, - sender: string, - data: string, - nonce: BigNumber -) => { - return iface.encodeFunctionData( - 'relayMessage(address,address,bytes,uint256)', - [target, sender, data, nonce] - ) -} - -/** - * Encodes a V1 cross domain message. This message format shipped with bedrock - * and supports value transfer with native ETH. - * - * @param nonce The cross domain message nonce - * @param sender The sender of the cross domain message - * @param target The target of the cross domain message - * @param value The value being sent with the cross domain message - * @param gasLimit The gas limit of the cross domain execution - * @param data The data passed along with the cross domain message - */ -export const encodeCrossDomainMessageV1 = ( - nonce: BigNumber, - sender: string, - target: string, - value: BigNumberish, - gasLimit: BigNumberish, - data: string -) => { - return iface.encodeFunctionData( - 'relayMessage(uint256,address,address,uint256,uint256,bytes)', - [nonce, sender, target, value, gasLimit, data] - ) -} - -/** - * Encodes a cross domain message. The version byte in the nonce determines - * the serialization format that is used. - * - * @param nonce The cross domain message nonce - * @param sender The sender of the cross domain message - * @param target The target of the cross domain message - * @param value The value being sent with the cross domain message - * @param gasLimit The gas limit of the cross domain execution - * @param data The data passed along with the cross domain message - */ -export const encodeCrossDomainMessage = ( - nonce: BigNumber, - sender: string, - target: string, - value: BigNumber, - gasLimit: BigNumber, - data: string -) => { - const { version } = decodeVersionedNonce(nonce) - if (version.eq(0)) { - return encodeCrossDomainMessageV0(target, sender, data, nonce) - } else if (version.eq(1)) { - return encodeCrossDomainMessageV1( - nonce, - sender, - target, - value, - gasLimit, - data - ) - } - throw new Error(`unknown version ${version.toString()}`) -} diff --git a/packages/core-utils/src/optimism/fees.ts b/packages/core-utils/src/optimism/fees.ts deleted file mode 100644 index a1103e575408..000000000000 --- a/packages/core-utils/src/optimism/fees.ts +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Fee related serialization and deserialization - */ - -import { BigNumber } from '@ethersproject/bignumber' - -import { remove0x } from '../common' - -export const txDataZeroGas = 4 -export const txDataNonZeroGasEIP2028 = 16 -const big10 = BigNumber.from(10) - -export const scaleDecimals = ( - value: number | BigNumber, - decimals: number | BigNumber -): BigNumber => { - value = BigNumber.from(value) - decimals = BigNumber.from(decimals) - // 10**decimals - const divisor = big10.pow(decimals) - return value.div(divisor) -} - -// data is the RLP encoded unsigned transaction -export const calculateL1GasUsed = ( - data: string | Buffer, - overhead: number | BigNumber -): BigNumber => { - const [zeroes, ones] = zeroesAndOnes(data) - const zeroesCost = zeroes * txDataZeroGas - // Add a buffer to account for the signature - const onesCost = (ones + 68) * txDataNonZeroGasEIP2028 - return BigNumber.from(onesCost).add(zeroesCost).add(overhead) -} - -export const calculateL1Fee = ( - data: string | Buffer, - overhead: number | BigNumber, - l1GasPrice: number | BigNumber, - scalar: number | BigNumber, - decimals: number | BigNumber -): BigNumber => { - const l1GasUsed = calculateL1GasUsed(data, overhead) - const l1Fee = l1GasUsed.mul(l1GasPrice) - const scaled = l1Fee.mul(scalar) - const result = scaleDecimals(scaled, decimals) - return result -} - -// Count the number of zero bytes and non zero bytes in a buffer -export const zeroesAndOnes = (data: Buffer | string): Array => { - if (typeof data === 'string') { - data = Buffer.from(remove0x(data), 'hex') - } - let zeros = 0 - let ones = 0 - for (const byte of data) { - if (byte === 0) { - zeros++ - } else { - ones++ - } - } - return [zeros, ones] -} - -/** - * Computes the L1 calldata cost of bytes based - * on the London hardfork. - * - * @param data {Buffer|string} Bytes - * @returns {BigNumber} Gas consumed by the bytes - */ -export const calldataCost = (data: Buffer | string): BigNumber => { - const [zeros, ones] = zeroesAndOnes(data) - const zeroCost = BigNumber.from(zeros).mul(txDataZeroGas) - const nonZeroCost = BigNumber.from(ones).mul(txDataNonZeroGasEIP2028) - return zeroCost.add(nonZeroCost) -} diff --git a/packages/core-utils/src/optimism/hashing.ts b/packages/core-utils/src/optimism/hashing.ts deleted file mode 100644 index ccc20b6c0557..000000000000 --- a/packages/core-utils/src/optimism/hashing.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { BigNumberish, BigNumber } from '@ethersproject/bignumber' -import { keccak256 } from '@ethersproject/keccak256' -import { defaultAbiCoder } from '@ethersproject/abi' - -import { - decodeVersionedNonce, - encodeCrossDomainMessageV0, - encodeCrossDomainMessageV1, -} from './encoding' - -/** - * Bedrock output oracle data. - */ -export interface BedrockOutputData { - outputRoot: string - l1Timestamp: number - l2BlockNumber: number - l2OutputIndex: number -} - -/** - * Bedrock state commitment - */ -export interface OutputRootProof { - version: string - stateRoot: string - messagePasserStorageRoot: string - latestBlockhash: string -} - -/** - * Bedrock proof data required to finalize an L2 to L1 message. - */ -export interface BedrockCrossChainMessageProof { - l2OutputIndex: number - outputRootProof: OutputRootProof - withdrawalProof: string[] -} - -/** - * Parameters that govern the L2OutputOracle. - */ -export type L2OutputOracleParameters = { - submissionInterval: number - startingBlockNumber: number - l2BlockTime: number -} - -/** - * Hahses a cross domain message. - * - * @param nonce The cross domain message nonce - * @param sender The sender of the cross domain message - * @param target The target of the cross domain message - * @param value The value being sent with the cross domain message - * @param gasLimit The gas limit of the cross domain execution - * @param data The data passed along with the cross domain message - */ -export const hashCrossDomainMessage = ( - nonce: BigNumber, - sender: string, - target: string, - value: BigNumber, - gasLimit: BigNumber, - message: string -) => { - const { version } = decodeVersionedNonce(nonce) - if (version.eq(0)) { - return hashCrossDomainMessagev0(target, sender, message, nonce) - } else if (version.eq(1)) { - return hashCrossDomainMessagev1( - nonce, - sender, - target, - value, - gasLimit, - message - ) - } - throw new Error(`unknown version ${version.toString()}`) -} - -/** - * Hahses a V0 cross domain message - * - * @param target The target of the cross domain message - * @param sender The sender of the cross domain message - * @param message The message passed along with the cross domain message - * @param nonce The cross domain message nonce - */ -export const hashCrossDomainMessagev0 = ( - target: string, - sender: string, - message: string, - nonce: BigNumber -) => { - return keccak256(encodeCrossDomainMessageV0(target, sender, message, nonce)) -} - -/** - * Hahses a V1 cross domain message - * - * @param nonce The cross domain message nonce - * @param sender The sender of the cross domain message - * @param target The target of the cross domain message - * @param value The value being sent with the cross domain message - * @param gasLimit The gas limit of the cross domain execution - * @param message The message passed along with the cross domain message - */ -export const hashCrossDomainMessagev1 = ( - nonce: BigNumber, - sender: string, - target: string, - value: BigNumberish, - gasLimit: BigNumberish, - message: string -) => { - return keccak256( - encodeCrossDomainMessageV1(nonce, sender, target, value, gasLimit, message) - ) -} - -/** - * Hashes a withdrawal - * - * @param nonce The cross domain message nonce - * @param sender The sender of the cross domain message - * @param target The target of the cross domain message - * @param value The value being sent with the cross domain message - * @param gasLimit The gas limit of the cross domain execution - * @param message The message passed along with the cross domain message - */ -export const hashWithdrawal = ( - nonce: BigNumber, - sender: string, - target: string, - value: BigNumber, - gasLimit: BigNumber, - message: string -): string => { - const types = ['uint256', 'address', 'address', 'uint256', 'uint256', 'bytes'] - const encoded = defaultAbiCoder.encode(types, [ - nonce, - sender, - target, - value, - gasLimit, - message, - ]) - return keccak256(encoded) -} - -/** - * Hahses an output root proof - * - * @param proof OutputRootProof - */ -export const hashOutputRootProof = (proof: OutputRootProof): string => { - return keccak256( - defaultAbiCoder.encode( - ['bytes32', 'bytes32', 'bytes32', 'bytes32'], - [ - proof.version, - proof.stateRoot, - proof.messagePasserStorageRoot, - proof.latestBlockhash, - ] - ) - ) -} diff --git a/packages/core-utils/src/optimism/index.ts b/packages/core-utils/src/optimism/index.ts deleted file mode 100644 index 6dcc75c67e81..000000000000 --- a/packages/core-utils/src/optimism/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Utils specifically related to Optimism. - */ - -export * from './alias' -export * from './fees' -export * from './op-node' -export * from './deposit-transaction' -export * from './encoding' -export * from './hashing' -export * from './op-provider' -export * from './constants' diff --git a/packages/core-utils/src/optimism/op-node.ts b/packages/core-utils/src/optimism/op-node.ts deleted file mode 100644 index c994ce250265..000000000000 --- a/packages/core-utils/src/optimism/op-node.ts +++ /dev/null @@ -1,23 +0,0 @@ -export interface OpNodeConfig { - genesis: { - l1: { - hash: string - number: number - } - l2: { - hash: string - number: number - } - l2_time: number - } - block_time: number - max_sequencer_drift: number - seq_window_size: number - channel_timeout: number - l1_chain_id: number - l2_chain_id: number - p2p_sequencer_address: string - batch_inbox_address: string - batch_sender_address: string - deposit_contract_address: string -} diff --git a/packages/core-utils/src/optimism/op-provider.ts b/packages/core-utils/src/optimism/op-provider.ts deleted file mode 100644 index 2dd6e2ece3bf..000000000000 --- a/packages/core-utils/src/optimism/op-provider.ts +++ /dev/null @@ -1,158 +0,0 @@ -import EventEmitter from 'events' - -import { BigNumber } from '@ethersproject/bignumber' -import { deepCopy } from '@ethersproject/properties' -import { ConnectionInfo, fetchJson } from '@ethersproject/web' - -const getResult = (payload: { - error?: { code?: number; data?: any; message?: string } - result?: any -}): any => { - if (payload.error) { - const error: any = new Error(payload.error.message) - error.code = payload.error.code - error.data = payload.error.data - throw error - } - return payload.result -} - -export interface BlockDescriptor { - hash: string - number: BigNumber - parentHash: string - timestamp: BigNumber -} - -export interface L2BlockDescriptor extends BlockDescriptor { - l1Origin: { - hash: string - number: BigNumber - } - sequencerNumber: BigNumber -} - -export interface SyncStatusResponse { - currentL1: BlockDescriptor - headL1: BlockDescriptor - unsafeL2: L2BlockDescriptor - safeL2: L2BlockDescriptor - finalizedL2: L2BlockDescriptor -} - -export class OpNodeProvider extends EventEmitter { - readonly connection: ConnectionInfo - private _nextId: number = 0 - - constructor(url?: ConnectionInfo | string) { - super() - - if (typeof url === 'string') { - this.connection = { url } - } else { - this.connection = url - } - } - - async syncStatus(): Promise { - const result = await this.send('optimism_syncStatus', []) - - return { - currentL1: { - hash: result.current_l1.hash, - number: BigNumber.from(result.current_l1.number), - parentHash: result.current_l1.parentHash, - timestamp: BigNumber.from(result.current_l1.timestamp), - }, - headL1: { - hash: result.head_l1.hash, - number: BigNumber.from(result.head_l1.number), - parentHash: result.head_l1.parentHash, - timestamp: BigNumber.from(result.head_l1.timestamp), - }, - unsafeL2: { - hash: result.unsafe_l2.hash, - number: BigNumber.from(result.unsafe_l2.number), - parentHash: result.unsafe_l2.parentHash, - timestamp: BigNumber.from(result.unsafe_l2.timestamp), - l1Origin: { - hash: result.unsafe_l2.l1origin.hash, - number: BigNumber.from(result.unsafe_l2.l1origin.number), - }, - sequencerNumber: BigNumber.from(result.unsafe_l2.sequenceNumber), - }, - safeL2: { - hash: result.safe_l2.hash, - number: BigNumber.from(result.safe_l2.number), - parentHash: result.safe_l2.parentHash, - timestamp: BigNumber.from(result.safe_l2.timestamp), - l1Origin: { - hash: result.safe_l2.l1origin.hash, - number: BigNumber.from(result.safe_l2.l1origin.number), - }, - sequencerNumber: BigNumber.from(result.safe_l2.sequenceNumber), - }, - finalizedL2: { - hash: result.finalized_l2.hash, - number: BigNumber.from(result.finalized_l2.number), - parentHash: result.finalized_l2.parentHash, - timestamp: BigNumber.from(result.finalized_l2.timestamp), - l1Origin: { - hash: result.finalized_l2.l1origin.hash, - number: BigNumber.from(result.finalized_l2.l1origin.number), - }, - sequencerNumber: BigNumber.from(result.finalized_l2.sequenceNumber), - }, - } - } - - // TODO(tynes): turn the response into a stronger type - async rollupConfig() { - const result = await this.send('optimism_rollupConfig', []) - return result - } - - send(method: string, params: Array): Promise { - const request = { - method, - params, - id: this._nextId++, - jsonrpc: '2.0', - } - - this.emit('debug', { - action: 'request', - request: deepCopy(request), - provider: this, - }) - - const result = fetchJson( - this.connection, - JSON.stringify(request), - getResult - ).then( - (res) => { - this.emit('debug', { - action: 'response', - request, - response: res, - provider: this, - }) - - return res - }, - (error) => { - this.emit('debug', { - action: 'response', - error, - request, - provider: this, - }) - - throw error - } - ) - - return result - } -} diff --git a/packages/core-utils/test/common/hex-strings.spec.ts b/packages/core-utils/test/common/hex-strings.spec.ts deleted file mode 100644 index 7a60df7cac8e..000000000000 --- a/packages/core-utils/test/common/hex-strings.spec.ts +++ /dev/null @@ -1,314 +0,0 @@ -import { BigNumber } from '@ethersproject/bignumber' - -/* Imports: Internal */ -import { expect } from '../setup' -import { - toRpcHexString, - remove0x, - add0x, - fromHexString, - toHexString, - padHexString, - encodeHex, - hexStringEquals, - bytes32ify, -} from '../../src' - -describe('remove0x', () => { - it('should return undefined', () => { - expect(remove0x(undefined)).to.deep.equal(undefined) - }) - - it('should return without a 0x', () => { - const cases = [ - { input: '0x', output: '' }, - { - input: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', - output: '1f9840a85d5af5bf1d1762f925bdaddc4201f984', - }, - { input: 'a', output: 'a' }, - ] - for (const test of cases) { - expect(remove0x(test.input)).to.deep.equal(test.output) - } - }) -}) - -describe('add0x', () => { - it('should return undefined', () => { - expect(add0x(undefined)).to.deep.equal(undefined) - }) - - it('should return with a 0x', () => { - const cases = [ - { input: '0x', output: '0x' }, - { - input: '1f9840a85d5af5bf1d1762f925bdaddc4201f984', - output: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', - }, - { input: '', output: '0x' }, - ] - for (const test of cases) { - expect(add0x(test.input)).to.deep.equal(test.output) - } - }) -}) - -describe('toHexString', () => { - it('should throw an error when input is null', () => { - expect(() => { - toHexString(null) - }).to.throw( - 'The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received null' - ) - }) - - it('should return with a hex string', () => { - const cases = [ - { input: 0, output: '0x00' }, - { input: 48, output: '0x30' }, - { - input: '0', - output: '0x30', - }, - { input: '', output: '0x' }, - ] - for (const test of cases) { - expect(toHexString(test.input)).to.deep.equal(test.output) - } - }) -}) - -describe('fromHexString', () => { - it('should return a buffer from a hex string', () => { - const cases = [ - { input: '0x', output: Buffer.from('', 'hex') }, - { - input: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', - output: Buffer.from('1f9840a85d5af5bf1d1762f925bdaddc4201f984', 'hex'), - }, - { input: '', output: Buffer.from('', 'hex') }, - { - input: Buffer.from('1f9840a85d5af5bf1d1762f925bdaddc4201f984'), - output: Buffer.from('1f9840a85d5af5bf1d1762f925bdaddc4201f984'), - }, - ] - - for (const test of cases) { - expect(fromHexString(test.input)).to.deep.equal(test.output) - } - }) -}) - -describe('padHexString', () => { - it('should return return input string if length is 2 + length * 2', () => { - expect(padHexString('abcd', 1)).to.deep.equal('abcd') - expect(padHexString('abcdefgh', 3).length).to.deep.equal(8) - }) - - it('should return a string padded with 0x and zeros', () => { - expect(padHexString('0xabcd', 3)).to.deep.equal('0x00abcd') - }) -}) - -describe('toRpcHexString', () => { - it('should parse 0', () => { - expect(toRpcHexString(0)).to.deep.equal('0x0') - expect(toRpcHexString(BigNumber.from(0))).to.deep.equal('0x0') - }) - - it('should parse non 0', () => { - const cases = [ - { input: 2, output: '0x2' }, - { input: BigNumber.from(2), output: '0x2' }, - { input: 100, output: '0x64' }, - { input: BigNumber.from(100), output: '0x64' }, - { input: 300, output: '0x12c' }, - { input: BigNumber.from(300), output: '0x12c' }, - ] - for (const test of cases) { - expect(toRpcHexString(test.input)).to.deep.equal(test.output) - } - }) -}) - -describe('encodeHex', () => { - it('should throw an error when val is invalid', () => { - expect(() => { - encodeHex(null, 0) - }).to.throw('invalid BigNumber value') - - expect(() => { - encodeHex(10.5, 0) - }).to.throw('fault="underflow", operation="BigNumber.from", value=10.5') - - expect(() => { - encodeHex('10.5', 0) - }).to.throw('invalid BigNumber string') - }) - - it('should return a hex string of val with length len', () => { - const cases = [ - { - input: { - val: 0, - len: 0, - }, - output: '00', - }, - { - input: { - val: 0, - len: 4, - }, - output: '0000', - }, - { - input: { - val: 1, - len: 0, - }, - output: '01', - }, - { - input: { - val: 1, - len: 10, - }, - output: '0000000001', - }, - { - input: { - val: 100, - len: 4, - }, - output: '0064', - }, - { - input: { - val: '100', - len: 0, - }, - output: '64', - }, - ] - for (const test of cases) { - expect(encodeHex(test.input.val, test.input.len)).to.deep.equal( - test.output - ) - } - }) -}) - -describe('hexStringEquals', () => { - it('should throw an error when input is not a hex string', () => { - expect(() => { - hexStringEquals('', '') - }).to.throw('input is not a hex string: ') - - expect(() => { - hexStringEquals('0xx', '0x1') - }).to.throw('input is not a hex string: 0xx') - - expect(() => { - hexStringEquals('0x1', '2') - }).to.throw('input is not a hex string: 2') - - expect(() => { - hexStringEquals('-0x1', '0x1') - }).to.throw('input is not a hex string: -0x1') - }) - - it('should return the hex strings equality', () => { - const cases = [ - { - input: { - stringA: '0x', - stringB: '0x', - }, - output: true, - }, - { - input: { - stringA: '0x1', - stringB: '0x1', - }, - output: true, - }, - { - input: { - stringA: '0x064', - stringB: '0x064', - }, - output: true, - }, - { - input: { - stringA: '0x', - stringB: '0x0', - }, - output: false, - }, - { - input: { - stringA: '0x0', - stringB: '0x1', - }, - output: false, - }, - { - input: { - stringA: '0x64', - stringB: '0x064', - }, - output: false, - }, - ] - for (const test of cases) { - expect( - hexStringEquals(test.input.stringA, test.input.stringB) - ).to.deep.equal(test.output) - } - }) -}) - -describe('bytes32ify', () => { - it('should throw an error when input is invalid', () => { - expect(() => { - bytes32ify(-1) - }).to.throw('invalid hex string') - }) - - it('should return a zero padded, 32 bytes hex string', () => { - const cases = [ - { - input: 0, - output: - '0x0000000000000000000000000000000000000000000000000000000000000000', - }, - { - input: BigNumber.from(0), - output: - '0x0000000000000000000000000000000000000000000000000000000000000000', - }, - { - input: 2, - output: - '0x0000000000000000000000000000000000000000000000000000000000000002', - }, - { - input: BigNumber.from(2), - output: - '0x0000000000000000000000000000000000000000000000000000000000000002', - }, - { - input: 100, - output: - '0x0000000000000000000000000000000000000000000000000000000000000064', - }, - ] - for (const test of cases) { - expect(bytes32ify(test.input)).to.deep.equal(test.output) - } - }) -}) diff --git a/packages/core-utils/test/common/misc.spec.ts b/packages/core-utils/test/common/misc.spec.ts deleted file mode 100644 index 5ff04cde4bd1..000000000000 --- a/packages/core-utils/test/common/misc.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* Imports: Internal */ -import { expect } from '../setup' -import { sleep, clone, reqenv, getenv } from '../../src' - -describe('sleep', async () => { - it('should return wait input amount of ms', async () => { - const startTime = Date.now() - await sleep(1000) - const endTime = Date.now() - expect(startTime + 1000 <= endTime).to.deep.equal(true) - }) -}) - -describe('clone', async () => { - it('should return a cloned object', async () => { - const exampleObject = { example: 'Example' } - const clonedObject = clone(exampleObject) - expect(clonedObject).to.not.equal(exampleObject) - expect(JSON.stringify(clonedObject)).to.equal(JSON.stringify(exampleObject)) - }) -}) - -describe('reqenv', async () => { - let cachedEnvironment: NodeJS.ProcessEnv - const temporaryEnvironmentKey = 'testVariable' - const temporaryEnvironment = { - [temporaryEnvironmentKey]: 'This is an environment variable', - } - - before(() => { - cachedEnvironment = process.env - process.env = temporaryEnvironment - }) - - it('should return an existent environment variable', async () => { - const requiredEnvironmentValue = reqenv(temporaryEnvironmentKey) - expect(requiredEnvironmentValue).to.equal( - temporaryEnvironment[temporaryEnvironmentKey] - ) - }) - - it('should throw an error trying to return a variable that does not exist', async () => { - const undeclaredVariableName = 'undeclaredVariable' - const failedReqenv = () => reqenv(undeclaredVariableName) - expect(failedReqenv).to.throw() - }) - - after(() => { - process.env = cachedEnvironment - }) -}) - -describe('getenv', async () => { - let cachedEnvironment: NodeJS.ProcessEnv - const temporaryEnvironmentKey = 'testVariable' - const temporaryEnvironment = { - [temporaryEnvironmentKey]: 'This is an environment variable', - } - const fallback = 'fallback' - - before(() => { - cachedEnvironment = process.env - process.env = temporaryEnvironment - }) - - it('should return an existent environment variable', async () => { - const environmentVariable = getenv(temporaryEnvironmentKey) - expect(environmentVariable).to.equal( - temporaryEnvironment[temporaryEnvironmentKey] - ) - }) - - it('should return an existent environment variable even if fallback is passed', async () => { - const environmentVariable = getenv(temporaryEnvironmentKey, fallback) - expect(environmentVariable).to.equal( - temporaryEnvironment[temporaryEnvironmentKey] - ) - }) - - it('should return fallback if variable is not defined', async () => { - const undeclaredVariableName = 'undeclaredVariable' - expect(getenv(undeclaredVariableName, fallback)).to.equal(fallback) - }) - - it('should return undefined if no fallback is passed and variable is not defined', async () => { - expect(getenv('undeclaredVariable')).to.be.undefined - }) - - after(() => { - process.env = cachedEnvironment - }) -}) diff --git a/packages/core-utils/test/common/test-utils.spec.ts b/packages/core-utils/test/common/test-utils.spec.ts deleted file mode 100644 index bc5c65a30452..000000000000 --- a/packages/core-utils/test/common/test-utils.spec.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { assert } from 'chai' - -/* Imports: Internal */ -import { expect } from '../setup' -import { expectApprox, awaitCondition } from '../../src' - -describe('awaitCondition', () => { - it('should try the condition fn until it returns true', async () => { - let i = 0 - const condFn = async () => { - i++ - return Promise.resolve(i === 2) - } - - await awaitCondition(condFn, 50, 3) - expect(i).to.equal(2) - }) - - it('should only try the configured number of attempts', async () => { - let i = 0 - const condFn = async () => { - i++ - return Promise.resolve(i === 2) - } - - try { - await awaitCondition(condFn, 50, 1) - } catch (e) { - return - } - - assert.fail('Condition never failed, but it should have.') - }) -}) - -describe('expectApprox', () => { - it('should pass when the actual number is higher, but within the expected range of the target', async () => { - expectApprox(119, 100, { - percentUpperDeviation: 20, - percentLowerDeviation: 20, - absoluteUpperDeviation: 20, - absoluteLowerDeviation: 20, - }) - }) - - it('should pass when the actual number is lower, but within the expected range of the target', async () => { - expectApprox(81, 100, { - percentUpperDeviation: 20, - percentLowerDeviation: 20, - absoluteUpperDeviation: 20, - absoluteLowerDeviation: 20, - }) - }) - - it('should throw an error when no deviation values are given', async () => { - try { - expectApprox(101, 100, {}) - assert.fail('expectApprox did not throw an error') - } catch (error) { - expect(error.message).to.equal( - 'Must define at least one parameter to limit the deviation of the actual value.' - ) - } - }) - - describe('should throw an error if the actual value is higher than expected', () => { - describe('... when only one upper bound value is defined', () => { - it('... and percentUpperDeviation sets the upper bound', async () => { - try { - expectApprox(121, 100, { - percentUpperDeviation: 20, - }) - assert.fail('expectApprox did not throw an error') - } catch (error) { - expect(error.message).to.equal( - 'Actual value (121) is greater than the calculated upper bound of (120): expected false to be true' - ) - } - }) - - it('... and absoluteUpperDeviation sets the upper bound', async () => { - try { - expectApprox(121, 100, { - absoluteUpperDeviation: 20, - }) - assert.fail('expectApprox did not throw an error') - } catch (error) { - expect(error.message).to.equal( - 'Actual value (121) is greater than the calculated upper bound of (120): expected false to be true' - ) - } - }) - }) - - describe('... when both values are defined', () => { - it('... and percentUpperDeviation sets the upper bound', async () => { - try { - expectApprox(121, 100, { - percentUpperDeviation: 20, - absoluteUpperDeviation: 30, - }) - assert.fail('expectApprox did not throw an error') - } catch (error) { - expect(error.message).to.equal( - 'Actual value (121) is greater than the calculated upper bound of (120): expected false to be true' - ) - } - }) - - it('... and absoluteUpperDeviation sets the upper bound', async () => { - try { - expectApprox(121, 100, { - percentUpperDeviation: 30, - absoluteUpperDeviation: 20, - }) - assert.fail('expectApprox did not throw an error') - } catch (error) { - expect(error.message).to.equal( - 'Actual value (121) is greater than the calculated upper bound of (120): expected false to be true' - ) - } - }) - }) - }) - - describe('should throw an error if the actual value is lower than expected', () => { - describe('... when only one lower bound value is defined', () => { - it('... and percentLowerDeviation sets the lower bound', async () => { - try { - expectApprox(79, 100, { - percentLowerDeviation: 20, - }) - assert.fail('expectApprox did not throw an error') - } catch (error) { - expect(error.message).to.equal( - 'Actual value (79) is less than the calculated lower bound of (80): expected false to be true' - ) - } - }) - - it('... and absoluteLowerDeviation sets the lower bound', async () => { - try { - expectApprox(79, 100, { - absoluteLowerDeviation: 20, - }) - assert.fail('expectApprox did not throw an error') - } catch (error) { - expect(error.message).to.equal( - 'Actual value (79) is less than the calculated lower bound of (80): expected false to be true' - ) - } - }) - }) - - describe('... when both values are defined', () => { - it('... and percentLowerDeviation sets the lower bound', async () => { - try { - expectApprox(79, 100, { - percentLowerDeviation: 20, - absoluteLowerDeviation: 30, - }) - assert.fail('expectApprox did not throw an error') - } catch (error) { - expect(error.message).to.equal( - 'Actual value (79) is less than the calculated lower bound of (80): expected false to be true' - ) - } - }) - - it('... and absoluteLowerDeviation sets the lower bound', async () => { - try { - expectApprox(79, 100, { - percentLowerDeviation: 30, - absoluteLowerDeviation: 20, - }) - assert.fail('expectApprox did not throw an error') - } catch (error) { - expect(error.message).to.equal( - 'Actual value (79) is less than the calculated lower bound of (80): expected false to be true' - ) - } - }) - }) - }) -}) diff --git a/packages/core-utils/test/optimism/alias.spec.ts b/packages/core-utils/test/optimism/alias.spec.ts deleted file mode 100644 index 18cb42f08d34..000000000000 --- a/packages/core-utils/test/optimism/alias.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { expect } from '../setup' -import { applyL1ToL2Alias, undoL1ToL2Alias } from '../../src' - -describe('address aliasing utils', () => { - describe('applyL1ToL2Alias', () => { - it('should be able to apply the alias to a valid address', () => { - expect( - applyL1ToL2Alias('0x0000000000000000000000000000000000000000') - ).to.equal('0x1111000000000000000000000000000000001111') - }) - - it('should be able to apply the alias even if the operation overflows', () => { - expect( - applyL1ToL2Alias('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF') - ).to.equal('0x1111000000000000000000000000000000001110') - }) - - it('should throw if the input is not a valid address', () => { - expect(() => { - applyL1ToL2Alias('0x1234') - }).to.throw('not a valid address: 0x1234') - }) - }) - - describe('undoL1ToL2Alias', () => { - it('should be able to undo the alias from a valid address', () => { - expect( - undoL1ToL2Alias('0x1111000000000000000000000000000000001111') - ).to.equal('0x0000000000000000000000000000000000000000') - }) - - it('should be able to undo the alias even if the operation underflows', () => { - expect( - undoL1ToL2Alias('0x1111000000000000000000000000000000001110') - ).to.equal('0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF') - }) - - it('should throw if the input is not a valid address', () => { - expect(() => { - undoL1ToL2Alias('0x1234') - }).to.throw('not a valid address: 0x1234') - }) - }) -}) diff --git a/packages/core-utils/test/optimism/fees.spec.ts b/packages/core-utils/test/optimism/fees.spec.ts deleted file mode 100644 index e3da5a599506..000000000000 --- a/packages/core-utils/test/optimism/fees.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import '../setup' - -import { BigNumber } from '@ethersproject/bignumber' - -import { zeroesAndOnes, calldataCost } from '../../src' - -describe('Fees', () => { - it('should count zeros and ones', () => { - const cases = [ - { input: Buffer.from('0001', 'hex'), zeros: 1, ones: 1 }, - { input: '0x0001', zeros: 1, ones: 1 }, - { input: '0x', zeros: 0, ones: 0 }, - { input: '0x1111', zeros: 0, ones: 2 }, - ] - - for (const test of cases) { - const [zeros, ones] = zeroesAndOnes(test.input) - zeros.should.eq(test.zeros) - ones.should.eq(test.ones) - } - }) - - it('should compute calldata costs', () => { - const cases = [ - { input: '0x', output: BigNumber.from(0) }, - { input: '0x00', output: BigNumber.from(4) }, - { input: '0xff', output: BigNumber.from(16) }, - { input: Buffer.alloc(32), output: BigNumber.from(4 * 32) }, - { input: Buffer.alloc(32, 0xff), output: BigNumber.from(16 * 32) }, - ] - - for (const test of cases) { - const cost = calldataCost(test.input) - cost.should.deep.eq(test.output) - } - }) -}) diff --git a/packages/core-utils/test/setup.ts b/packages/core-utils/test/setup.ts deleted file mode 100644 index 5727181bde8d..000000000000 --- a/packages/core-utils/test/setup.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* External Imports */ -import chai = require('chai') -import Mocha from 'mocha' - -const should = chai.should() -const expect = chai.expect - -export { should, expect, Mocha } diff --git a/packages/core-utils/tsconfig.json b/packages/core-utils/tsconfig.json deleted file mode 100644 index 3a39940e5acf..000000000000 --- a/packages/core-utils/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "compilerOptions": { - "typeRoots": ["node_modules/@types"] - }, - "include": [ - "src/**/*" - ] -} diff --git a/packages/fee-estimation/.gitignore b/packages/fee-estimation/.gitignore deleted file mode 100644 index a1e2a406af1b..000000000000 --- a/packages/fee-estimation/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -artifacts -cache -typechain -.deps -.envrc -.env -/dist/ -coverage diff --git a/packages/fee-estimation/.prettierignore b/packages/fee-estimation/.prettierignore deleted file mode 100644 index ea808af54514..000000000000 --- a/packages/fee-estimation/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -artifacts -cache -typechain -.deps -.envrc -.env -/dist/ diff --git a/packages/fee-estimation/.prettierrc.cjs b/packages/fee-estimation/.prettierrc.cjs deleted file mode 100644 index 2d293bab8925..000000000000 --- a/packages/fee-estimation/.prettierrc.cjs +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - ...require('../../.prettierrc.js'), -} diff --git a/packages/fee-estimation/CHANGELOG.md b/packages/fee-estimation/CHANGELOG.md deleted file mode 100644 index 80fe59e3bec5..000000000000 --- a/packages/fee-estimation/CHANGELOG.md +++ /dev/null @@ -1,19 +0,0 @@ -# @eth-optimism/fee-estimation - -## 0.15.3 - -### Patch Changes - -- [#7450](https://github.com/ethereum-optimism/optimism/pull/7450) [`ac90e16a7`](https://github.com/ethereum-optimism/optimism/commit/ac90e16a7f85c4f73661ae6023135c3d00421c1e) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated dev dependencies related to testing that is causing audit tooling to report failures - -## 0.15.2 - -### Patch Changes - -- [#6609](https://github.com/ethereum-optimism/optimism/pull/6609) [`0e83c4452`](https://github.com/ethereum-optimism/optimism/commit/0e83c44522e1a13e4d5c1395fd4dc9dbae8be08d) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug with 'estimateFees' not taking into account the l2 gas price - -## 0.15.1 - -### Patch Changes - -- [#6418](https://github.com/ethereum-optimism/optimism/pull/6418) [`d046711a3`](https://github.com/ethereum-optimism/optimism/commit/d046711a37ac050df1742b7de19ac548ffc12c7b) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated docs diff --git a/packages/fee-estimation/LICENSE b/packages/fee-estimation/LICENSE deleted file mode 100644 index 86541fdc788e..000000000000 --- a/packages/fee-estimation/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Optimism - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/fee-estimation/README.md b/packages/fee-estimation/README.md deleted file mode 100644 index 6b9bff2ad273..000000000000 --- a/packages/fee-estimation/README.md +++ /dev/null @@ -1,359 +0,0 @@ -# @eth-optimism/fee-estimation - -Tools for estimating gas on OP chains - -- **Tip** the [specs file](./src/estimateFees.spec.ts) has usage examples of every method in this library. - -## Overview - -This package is designed to provide an easy way to estimate gas on OP chains. - -Fee estimation on OP-chains has both an l2 and l1 component. By default tools such as Viem, Wagmi, Ethers, and Web3.js do not support the l1 component. They will support this soon but in meantime, this library can help estimate fees for transactions, or act as a reference. -As these tools add support for gas estimation natively this README will be updated with framework specific instructions. - -For more detailed information about gas fees on Optimism's Layer 2, you can visit their [official documentation](https://community.optimism.io/docs/developers/build/transaction-fees/#the-l2-execution-fee). - -## GasPriceOracle contract - -- The l2 contract that can estimate l1Fees is called [GasPriceOracle](../contracts-bedrock/contracts/l2/GasPriceOracle.sol) contract. This library provides utils for interacting with it at a high level. -- The GasPriceOracle is [deployed to Optimism](https://optimistic.etherscan.io/address/0x420000000000000000000000000000000000000F) and other OP chains at a predeployed address of `0x420000000000000000000000000000000000000F` - -This library provides a higher level abstraction over the gasPriceOracle - -## Installation - -```bash -pnpm install @eth-optimism/fee-estimation -``` - -```bash -npm install @eth-optimism/fee-estimation -``` - -```bash -yarn add @eth-optimism/fee-estimation -``` - -### Basic Usage - -```ts -import { estimateFees } from '@eth-optimism/fee-estimation' -import { optimistABI } from '@eth-optimism/contracts-ts' -import { viemClient } from './viem-client' - -const optimistOwnerAddress = - '0x77194aa25a06f932c10c0f25090f3046af2c85a6' as const -const tokenId = BigInt(optimistOwnerAddress) - -const fees = await estimateFees({ - client: viemClient, - // If not using in viem can pass in this instead - /* - client: { - chainId: 10, - rpcUrl: 'https://mainnet.optimism.io', - }, - */ - functionName: 'burn', - abi: optimistABI, - args: [tokenId], - account: optimistOwnerAddress, - to: '0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5', -}) -``` - -## API - -### `estimateFees` function - -```ts -estimateFees(options: OracleTransactionParameters & GasPriceOracleOptions & Omit): Promise -``` - -#### Parameters - -`options`: An object with the following fields: - -- `abi`: A JSON object ABI of contract. - -- `account`: A hex address of the account making the transaction. - -- `args`: Array of arguments to contract function. The types of this will be inferred from the ABI - -- `blockNumber`(optional): A BigInt representing the block number at which you want to estimate the fees. - -- `chainId`: An integer chain id. - -- `client`: An object with rpcUrl field, or an instance of a Viem PublicClient. - -- `functionName`: A string representing the function name for the transaction call data. - -- `maxFeePerGas`(optional): A BigInt representing the maximum fee per gas that the user is willing to pay. - -- `maxPriorityFeePerGas`(optional): A BigInt representing the maximum priority fee per gas that the user is willing to pay. - -- `to`: A hex address of the recipient of the transaction. - -- `value`(optional): A BigInt representing the value in wei sent along with the transaction. - -#### Returns - -A Promise that resolves to a BigInt representing the estimated fee in wei. - -## Other methods - -This package also provides lower level methods for estimating gas - -### getL2Client() - -This method returns a Layer 2 (L2) client that communicates with an L2 network. - -```ts -getL2Client(options: ClientOptions): PublicClient; -``` - -#### Parameters - -- `options: ClientOptions` - The options required to initialize the L2 client. - -#### Returns - -- `PublicClient` - Returns a public client that can interact with the L2 network. - -#### Example - -```ts -const clientParams = { - chainId: 10, - rpcUrl: process.env.VITE_L2_RPC_URL ?? 'https://mainnet.optimism.io', -} as const - -const client = getL2Client(clientParams) -``` - ---- - -### baseFee() - -Returns the base fee. - -```ts -baseFee({ client, ...params }: GasPriceOracleOptions): Promise; -``` - -#### Parameters - -- `{ client, ...params }: GasPriceOracleOptions` - The options required to fetch the base fee. - -#### Returns - -- `Promise` - Returns a promise that resolves to the base fee. - -#### Example - -```ts -const blockNumber = BigInt(106889079) -const paramsWithClient = { - client: clientParams, - blockNumber, -} -const baseFeeValue = await baseFee(paramsWithClient) -``` - ---- - -### decimals() - -Returns the decimals used in the scalar. - -```ts -decimals({ client, ...params }: GasPriceOracleOptions): Promise; -``` - -#### Parameters - -- `{ client, ...params }: GasPriceOracleOptions` - The options required to fetch the decimals. - -#### Returns - -- `Promise` - Returns a promise that resolves to the decimals used in the scalar. - -#### Example - -```ts -const decimalsValue = await decimals(paramsWithClient) -``` - ---- - -### gasPrice() - -Returns the gas price. - -```ts -gasPrice({ client, ...params }: GasPriceOracleOptions): Promise; -``` - -#### Parameters - -- `{ client, ...params }: GasPriceOracleOptions` - The options required to fetch the gas price. - -#### Returns - -- `Promise` - Returns a promise that resolves to the gas price. - -#### Example - -```ts -const gasPriceValue = await gasPrice(paramsWithClient) -``` - ---- - -### getL1Fee() - -Computes the L1 portion of the fee based on the size of the rlp encoded input transaction, the current L1 base fee, and the various dynamic parameters. - -```ts -getL1Fee(data: Bytes, { client, ...params }: GasPriceOracleOptions): Promise; -``` - -#### Parameters - -- `data: Bytes` - The transaction call data as a 0x-prefixed hex string. -- `{ client, ...params }: GasPriceOracleOptions` - Optional lock options and provider options. - -#### Returns - -- `Promise` - Returns a promise that resolves to the L1 portion of the fee. - -#### Example - -```ts -const data = - '0x5c19a95c00000000000000000000000046abfe1c972fca43766d6ad70e1c1df72f4bb4d1' -const l1FeeValue = await getL1Fee(data, paramsWithClient) -``` - -### getL1GasUsed() - -This method returns the amount of gas used on the L1 network for a given transaction. - -```ts -getL1GasUsed(data: Bytes, { client, ...params }: GasPriceOracleOptions): Promise; -``` - -#### Parameters - -- `data: Bytes` - The transaction call data as a 0x-prefixed hex string. -- `{ client, ...params }: GasPriceOracleOptions` - Optional lock options and provider options. - -#### Returns - -- `Promise` - Returns a promise that resolves to the amount of gas used on the L1 network for the given transaction. - -#### Example - -```ts -const data = - '0x5c19a95c00000000000000000000000046abfe1c972fca43766d6ad70e1c1df72f4bb4d1' -const l1GasUsed = await getL1GasUsed(data, paramsWithClient) -``` - ---- - -### l1BaseFee() - -Returns the base fee on the L1 network. - -```ts -l1BaseFee({ client, ...params }: GasPriceOracleOptions): Promise; -``` - -#### Parameters - -- `{ client, ...params }: GasPriceOracleOptions` - Optional lock options and provider options. - -#### Returns - -- `Promise` - Returns a promise that resolves to the base fee on the L1 network. - -#### Example - -```ts -const l1BaseFeeValue = await l1BaseFee(paramsWithClient) -``` - ---- - -### overhead() - -Returns the overhead for the given transaction. - -```ts -overhead({ client, ...params }: GasPriceOracleOptions): Promise; -``` - -#### Parameters - -- `{ client, ...params }: GasPriceOracleOptions` - Optional lock options and provider options. - -#### Returns - -- `Promise` - Returns a promise that resolves to the overhead for the given transaction. - -#### Example - -```ts -const overheadValue = await overhead(paramsWithClient) -``` - ---- - -### scalar() - -Returns the scalar value for the gas estimation. - -```ts -scalar({ client, ...params }: GasPriceOracleOptions): Promise; -``` - -#### Parameters - -- `{ client, ...params }: GasPriceOracleOptions` - Optional lock options and provider options. - -#### Returns - -- `Promise` - Returns a promise that resolves to the scalar value for the gas estimation. - -#### Example - -```ts -const scalarValue = await scalar(paramsWithClient) -``` - ---- - -### version() - -Returns the version of the fee estimation library. - -```ts -version({ client, ...params }: GasPriceOracleOptions): Promise; -``` - -#### Parameters - -- `{ client, ...params }: GasPriceOracleOptions` - Optional lock options and provider options. - -#### Returns - -- `Promise` - Returns a promise that resolves to the version of the fee estimation library. - -#### Example - -```ts -const libraryVersion = await version(paramsWithClient) -``` - ---- diff --git a/packages/fee-estimation/example.env b/packages/fee-estimation/example.env deleted file mode 100644 index cc58d719b78d..000000000000 --- a/packages/fee-estimation/example.env +++ /dev/null @@ -1,5 +0,0 @@ -VITE_RPC_URL_L2_GOERLI= -VITE_RPC_URL_L2_MAINNET= -VITE_RPC_URL_L1_GOERLI= -VITE_RPC_URL_L1_MAINNET= - diff --git a/packages/fee-estimation/package.json b/packages/fee-estimation/package.json deleted file mode 100644 index c87b9a0fa74c..000000000000 --- a/packages/fee-estimation/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "@eth-optimism/fee-estimation", - "version": "0.15.3", - "description": "Lightweight library for doing OP-Chain gas estimation", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/ethereum-optimism/optimism.git", - "directory": "packages/fee-estimation" - }, - "homepage": "https://optimism.io", - "type": "module", - "main": "dist/estimateFees.cjs", - "module": "dist/estimateFees.js", - "exports": { - ".": { - "import": "./dist/estimateFees.js", - "require": "./dist/estimateFees.cjs", - "default": "./dist/estimateFees.js", - "types": "./src/estimateFees.ts" - } - }, - "types": "src/estimateFees.ts", - "files": [ - "dist/", - "src/" - ], - "scripts": { - "build": "tsup", - "lint": "prettier --check .", - "lint:fix": "prettier --write .", - "test": "vitest", - "test:coverage": "vitest run --coverage", - "typecheck": "tsc --noEmit" - }, - "devDependencies": { - "@eth-optimism/contracts-ts": "workspace:^", - "@testing-library/jest-dom": "^6.4.2", - "@testing-library/react-hooks": "^8.0.1", - "@vitest/coverage-istanbul": "^1.2.2", - "abitype": "^1.0.0", - "isomorphic-fetch": "^3.0.0", - "jest-dom": "link:@types/@testing-library/jest-dom", - "jsdom": "^24.0.0", - "tsup": "^8.0.1", - "typescript": "^5.3.3", - "viem": "^2.7.19", - "vite": "^5.1.5", - "vitest": "^1.2.2" - }, - "peerDependencies": { - "viem": "^0.3.30" - } -} diff --git a/packages/fee-estimation/setupVitest.ts b/packages/fee-estimation/setupVitest.ts deleted file mode 100644 index 0a879e628c88..000000000000 --- a/packages/fee-estimation/setupVitest.ts +++ /dev/null @@ -1,4 +0,0 @@ -import fetch from 'isomorphic-fetch' - -// viem needs this -global.fetch = fetch diff --git a/packages/fee-estimation/src/estimateFees.spec.ts b/packages/fee-estimation/src/estimateFees.spec.ts deleted file mode 100644 index f3cc9ffd4d85..000000000000 --- a/packages/fee-estimation/src/estimateFees.spec.ts +++ /dev/null @@ -1,248 +0,0 @@ -/** - * The first 2 test cases are good documentation of how to use this library - */ -import { vi, test, expect, beforeEach } from 'vitest' -import { formatEther } from 'viem/utils' -import { - baseFee, - decimals, - estimateFees, - gasPrice, - getL1Fee, - getL1GasUsed, - getL2Client, - l1BaseFee, - overhead, - scalar, - version, -} from './estimateFees' -import { - optimistABI, - optimistAddress, - l2StandardBridgeABI, - l2StandardBridgeAddress, -} from '@eth-optimism/contracts-ts' -import { parseEther, parseGwei } from 'viem' - -vi.mock('viem', async () => { - const _viem = (await vi.importActual('viem')) as any - return { - ..._viem, - // no way to get historical gas price - createPublicClient: (...args: [any]) => { - const client = _viem.createPublicClient(...args) - client.getGasPrice = async () => parseGwei('0.00000042') - return client - }, - } -}) - -// using this optimist https://optimistic.etherscan.io/tx/0xaa291efba7ea40b0742e5ff84a1e7831a2eb6c2fc35001fa03ba80fd3b609dc9 -const blockNumber = BigInt(107028270) -const optimistOwnerAddress = - '0x77194aa25a06f932c10c0f25090f3046af2c85a6' as const -const functionDataBurn = { - functionName: 'burn', - // this is an erc721 abi - abi: optimistABI, - args: [BigInt(optimistOwnerAddress)], - account: optimistOwnerAddress, - to: optimistAddress[10], - chainId: 10, -} as const -const functionDataBurnWithPriorityFees = { - ...functionDataBurn, - maxFeePerGas: parseGwei('2'), - maxPriorityFeePerGas: parseGwei('2'), -} as const -// This tx -// https://optimistic.etherscan.io/tx/0xe6f3719be7327a991b9cb562ebf8d979cbca72bbdb2775f55a18274f4d0c9bbf -const functionDataWithdraw = { - abi: l2StandardBridgeABI, - functionName: 'withdraw', - value: BigInt(parseEther('0.00000001')), - account: '0x6387a88a199120aD52Dd9742C7430847d3cB2CD4', - // currently a bug is making chain id 10 not exist - to: l2StandardBridgeAddress[420], - chainId: 10, - args: [ - // l2 token address - '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', - // amount - BigInt(parseEther('0.00000001')), - // l1 gas - 0, - // extra data - '0x0', - ], - maxFeePerGas: parseGwei('.2'), - maxPriorityFeePerGas: parseGwei('.1'), -} as const - -const clientParams = { - chainId: functionDataBurn.chainId, - rpcUrl: process.env.VITE_L2_RPC_URL ?? 'https://mainnet.optimism.io', -} as const - -const viemClient = getL2Client(clientParams) - -const paramsWithRpcUrl = { - client: clientParams, - blockNumber, -} as const -const paramsWithViemClient = { - client: viemClient, - viemClient, - blockNumber, -} as const -const blockNumberWithdraw = BigInt(107046472) -const paramsWithRpcUrlWithdraw = { - client: clientParams, - blockNumber: blockNumberWithdraw, -} as const - -beforeEach(() => { - vi.resetAllMocks() -}) - -test('estimateFees should return correct fees', async () => { - // burn - const res = await estimateFees({ ...paramsWithRpcUrl, ...functionDataBurn }) - expect(res).toMatchInlineSnapshot('20573203833264n') - expect(formatEther(res)).toMatchInlineSnapshot('"0.000020573203833264"') - expect( - await estimateFees({ ...paramsWithRpcUrl, ...functionDataBurn }) - ).toMatchInlineSnapshot('20573203833264n') - expect( - await estimateFees({ ...paramsWithViemClient, ...functionDataBurn }) - ).toMatchInlineSnapshot('20573203833264n') - expect( - await estimateFees({ - ...paramsWithRpcUrl, - ...functionDataBurnWithPriorityFees, - }) - ).toMatchInlineSnapshot('21536992690265n') - // what is the l2 and l1 part of the fees for reference? - const l1Fee = await getL1Fee({ ...paramsWithRpcUrl, ...functionDataBurn }) - const l2Fee = res - l1Fee - expect(l1Fee).toMatchInlineSnapshot('20573185216764n') - expect(formatEther(l1Fee)).toMatchInlineSnapshot('"0.000020573185216764"') - expect(l2Fee).toMatchInlineSnapshot('18616500n') - expect(formatEther(l2Fee)).toMatchInlineSnapshot('"0.0000000000186165"') - - // withdraw - const res2 = await estimateFees({ - ...paramsWithRpcUrlWithdraw, - ...functionDataWithdraw, - }) - expect(res2).toMatchInlineSnapshot('62857090247510n') - expect( - await estimateFees({ ...paramsWithRpcUrlWithdraw, ...functionDataWithdraw }) - ).toMatchInlineSnapshot('62857090247510n') - expect( - await estimateFees({ ...paramsWithRpcUrlWithdraw, ...functionDataWithdraw }) - ).toMatchInlineSnapshot('62857090247510n') - expect( - await estimateFees({ ...paramsWithRpcUrlWithdraw, ...functionDataWithdraw }) - ).toMatchInlineSnapshot('62857090247510n') - expect(formatEther(res2)).toMatchInlineSnapshot('"0.00006285709024751"') - // what is the l2 and l1 part of the fees for reference? - const l1Fee2 = await getL1Fee({ - ...paramsWithRpcUrlWithdraw, - ...functionDataWithdraw, - }) - const l2Fee2 = res2 - l1Fee - expect(l1Fee2).toMatchInlineSnapshot('62857038894110n') - expect(formatEther(l1Fee2)).toMatchInlineSnapshot('"0.00006285703889411"') - expect(l2Fee2).toMatchInlineSnapshot('42283905030746n') - expect(formatEther(l2Fee2)).toMatchInlineSnapshot('"0.000042283905030746"') -}) - -test('baseFee should return the correct result', async () => { - expect(await baseFee(paramsWithRpcUrl)).toMatchInlineSnapshot('64n') - expect(await baseFee(paramsWithViemClient)).toMatchInlineSnapshot('64n') -}) - -test('decimals should return the correct result', async () => { - expect(await decimals(paramsWithRpcUrl)).toMatchInlineSnapshot('6n') - expect(await decimals(paramsWithViemClient)).toMatchInlineSnapshot('6n') -}) - -test('gasPrice should return the correct result', async () => { - expect(await gasPrice(paramsWithRpcUrl)).toMatchInlineSnapshot('64n') - expect(await gasPrice(paramsWithViemClient)).toMatchInlineSnapshot('64n') -}) - -test('getL1Fee should return the correct result', async () => { - // burn - expect( - await getL1Fee({ ...paramsWithRpcUrl, ...functionDataBurn }) - ).toMatchInlineSnapshot('20573185216764n') - expect( - await getL1Fee({ ...paramsWithViemClient, ...functionDataBurn }) - ).toMatchInlineSnapshot('20573185216764n') - expect( - await getL1Fee({ - ...paramsWithViemClient, - ...functionDataBurnWithPriorityFees, - }) - ).toMatchInlineSnapshot('21536974073765n') - expect( - formatEther( - await getL1Fee({ ...paramsWithViemClient, ...functionDataBurn }) - ) - ).toMatchInlineSnapshot('"0.000020573185216764"') - // withdraw - expect( - await getL1Fee({ ...paramsWithRpcUrlWithdraw, ...functionDataWithdraw }) - ).toMatchInlineSnapshot('62857038894110n') - expect( - formatEther( - await getL1Fee({ ...paramsWithRpcUrlWithdraw, ...functionDataWithdraw }) - ) - ).toMatchInlineSnapshot('"0.00006285703889411"') -}) - -test('getL1GasUsed should return the correct result', async () => { - // burn - expect( - await getL1GasUsed({ ...paramsWithRpcUrl, ...functionDataBurn }) - ).toMatchInlineSnapshot('2220n') - expect( - await getL1GasUsed({ ...paramsWithViemClient, ...functionDataBurn }) - ).toMatchInlineSnapshot('2220n') - expect( - await getL1GasUsed({ - ...paramsWithViemClient, - ...functionDataBurnWithPriorityFees, - }) - ).toMatchInlineSnapshot('2324n') - // withdraw - expect( - await getL1GasUsed({ ...paramsWithRpcUrlWithdraw, ...functionDataWithdraw }) - ).toMatchInlineSnapshot('2868n') -}) - -test('l1BaseFee should return the correct result', async () => { - expect(await l1BaseFee(paramsWithRpcUrl)).toMatchInlineSnapshot( - '13548538813n' - ) - expect(await l1BaseFee(paramsWithViemClient)).toMatchInlineSnapshot( - '13548538813n' - ) -}) - -test('overhead should return the correct result', async () => { - expect(await overhead(paramsWithRpcUrl)).toMatchInlineSnapshot('188n') - expect(await overhead(paramsWithViemClient)).toMatchInlineSnapshot('188n') -}) - -test('scalar should return the correct result', async () => { - expect(await scalar(paramsWithRpcUrl)).toMatchInlineSnapshot('684000n') - expect(await scalar(paramsWithViemClient)).toMatchInlineSnapshot('684000n') -}) - -test('version should return the correct result', async () => { - expect(await version(paramsWithRpcUrl)).toMatchInlineSnapshot('"1.0.0"') - expect(await version(paramsWithViemClient)).toMatchInlineSnapshot('"1.0.0"') -}) diff --git a/packages/fee-estimation/src/estimateFees.ts b/packages/fee-estimation/src/estimateFees.ts deleted file mode 100644 index 4a7ba0f1f191..000000000000 --- a/packages/fee-estimation/src/estimateFees.ts +++ /dev/null @@ -1,353 +0,0 @@ -import { - gasPriceOracleABI, - gasPriceOracleAddress, -} from '@eth-optimism/contracts-ts' -import { - getContract, - createPublicClient, - http, - BlockTag, - Address, - EstimateGasParameters, - serializeTransaction, - encodeFunctionData, - EncodeFunctionDataParameters, - TransactionSerializableEIP1559, - TransactionSerializedEIP1559, - PublicClient, -} from 'viem' -import * as chains from 'viem/chains' -import { Abi } from 'abitype' - -/** - * Bytes type representing a hex string with a 0x prefix - * @typedef {`0x${string}`} Bytes - */ -export type Bytes = `0x${string}` - -/** - * Options to query a specific block - */ -type BlockOptions = { - /** - * Block number to query from - */ - blockNumber?: bigint - /** - * Block tag to query from - */ - blockTag?: BlockTag -} - -const knownChains = [ - chains.optimism.id, - chains.goerli.id, - chains.base, - chains.baseGoerli.id, - chains.zora, - chains.zoraTestnet, -] - -/** - * ClientOptions type - * @typedef {Object} ClientOptions - * @property {keyof typeof gasPriceOracleAddress | number} chainId - Chain ID - * @property {string} [rpcUrl] - RPC URL. If not provided the provider will attempt to use public RPC URLs for the chain - * @property {chains.Chain['nativeCurrency']} [nativeCurrency] - Native currency. Defaults to ETH - */ -type ClientOptions = - // for known chains like base don't require an rpcUrl - | { - chainId: (typeof knownChains)[number] - rpcUrl?: string - nativeCurrency?: chains.Chain['nativeCurrency'] - } - | { - chainId: number - rpcUrl: string - nativeCurrency?: chains.Chain['nativeCurrency'] - } - | PublicClient - -/** - * Options for all GasPriceOracle methods - */ -export type GasPriceOracleOptions = BlockOptions & { client: ClientOptions } - -/** - * Options for specifying the transaction being estimated - */ -export type OracleTransactionParameters< - TAbi extends Abi | readonly unknown[], - TFunctionName extends string | undefined = undefined -> = EncodeFunctionDataParameters & - Omit -/** - * Options for specifying the transaction being estimated - */ -export type GasPriceOracleEstimator = < - TAbi extends Abi | readonly unknown[], - TFunctionName extends string | undefined = undefined ->( - options: OracleTransactionParameters & - GasPriceOracleOptions -) => Promise - -/** - * Throws an error if fetch is not defined - * Viem requires fetch - */ -const validateFetch = (): void => { - if (typeof fetch === 'undefined') { - throw new Error( - 'No fetch implementation found. Please provide a fetch polyfill. This can be done in NODE by passing in NODE_OPTIONS=--experimental-fetch or by using the isomorphic-fetch npm package' - ) - } -} - -/** - * Internal helper to serialize a transaction - */ -const transactionSerializer = < - TAbi extends Abi | readonly unknown[], - TFunctionName extends string | undefined = undefined ->( - options: EncodeFunctionDataParameters & - Omit -): TransactionSerializedEIP1559 => { - const encodedFunctionData = encodeFunctionData(options) - const serializedTransaction = serializeTransaction({ - ...options, - data: encodedFunctionData, - type: 'eip1559', - }) - return serializedTransaction as TransactionSerializedEIP1559 -} - -/** - * Gets L2 client - * @example - * const client = getL2Client({ chainId: 1, rpcUrl: "http://localhost:8545" }); - */ -export const getL2Client = (options: ClientOptions): PublicClient => { - validateFetch() - - if ('chainId' in options && options.chainId) { - const viemChain = Object.values(chains)?.find( - (chain) => chain.id === options.chainId - ) - const rpcUrls = options.rpcUrl - ? { default: { http: [options.rpcUrl] } } - : viemChain?.rpcUrls - if (!rpcUrls) { - throw new Error( - `No rpcUrls found for chainId ${options.chainId}. Please explicitly provide one` - ) - } - return createPublicClient({ - chain: { - id: options.chainId, - name: viemChain?.name ?? 'op-chain', - nativeCurrency: - options.nativeCurrency ?? - viemChain?.nativeCurrency ?? - chains.optimism.nativeCurrency, - network: viemChain?.network ?? 'Unknown OP Chain', - rpcUrls, - explorers: - (viemChain as typeof chains.optimism)?.blockExplorers ?? - chains.optimism.blockExplorers, - }, - transport: http( - options.rpcUrl ?? chains[options.chainId].rpcUrls.public.http[0] - ), - }) - } - return options as PublicClient -} - -/** - * Get gas price Oracle contract - */ -export const getGasPriceOracleContract = (params: ClientOptions) => { - return getContract({ - address: gasPriceOracleAddress['420'], - abi: gasPriceOracleABI, - publicClient: getL2Client(params), - }) -} - -/** - * Returns the base fee - * @returns {Promise} - The base fee - * @example - * const baseFeeValue = await baseFee(params); - */ -export const baseFee = async ({ - client, - blockNumber, - blockTag, -}: GasPriceOracleOptions): Promise => { - const contract = getGasPriceOracleContract(client) - return contract.read.baseFee({ blockNumber, blockTag }) -} - -/** - * Returns the decimals used in the scalar - * @example - * const decimalsValue = await decimals(params); - */ -export const decimals = async ({ - client, - blockNumber, - blockTag, -}: GasPriceOracleOptions): Promise => { - const contract = getGasPriceOracleContract(client) - return contract.read.decimals({ blockNumber, blockTag }) -} - -/** - * Returns the gas price - * @example - * const gasPriceValue = await gasPrice(params); - */ -export const gasPrice = async ({ - client, - blockNumber, - blockTag, -}: GasPriceOracleOptions): Promise => { - const contract = getGasPriceOracleContract(client) - return contract.read.gasPrice({ blockNumber, blockTag }) -} - -/** - * Computes the L1 portion of the fee based on the size of the rlp encoded input - * transaction, the current L1 base fee, and the various dynamic parameters. - * @example - * const L1FeeValue = await getL1Fee(data, params); - */ -export const getL1Fee: GasPriceOracleEstimator = async (options) => { - const data = transactionSerializer(options) - const contract = getGasPriceOracleContract(options.client) - return contract.read.getL1Fee([data], { - blockNumber: options.blockNumber, - blockTag: options.blockTag, - }) -} - -/** - * Returns the L1 gas used - * @example - */ -export const getL1GasUsed: GasPriceOracleEstimator = async (options) => { - const data = transactionSerializer(options) - const contract = getGasPriceOracleContract(options.client) - return contract.read.getL1GasUsed([data], { - blockNumber: options.blockNumber, - blockTag: options.blockTag, - }) -} - -/** - * Returns the L1 base fee - * @example - * const L1BaseFeeValue = await l1BaseFee(params); - */ -export const l1BaseFee = async ({ - client, - blockNumber, - blockTag, -}: GasPriceOracleOptions): Promise => { - const contract = getGasPriceOracleContract(client) - return contract.read.l1BaseFee({ blockNumber, blockTag }) -} - -/** - * Returns the overhead - * @example - * const overheadValue = await overhead(params); - */ -export const overhead = async ({ - client, - blockNumber, - blockTag, -}: GasPriceOracleOptions): Promise => { - const contract = getGasPriceOracleContract(client) - return contract.read.overhead({ blockNumber, blockTag }) -} - -/** - * Returns the current fee scalar - * @example - * const scalarValue = await scalar(params); - */ -export const scalar = async ({ - client, - ...params -}: GasPriceOracleOptions): Promise => { - const contract = getGasPriceOracleContract(client) - return contract.read.scalar(params) -} - -/** - * Returns the version - * @example - * const versionValue = await version(params); - */ -export const version = async ({ - client, - ...params -}: GasPriceOracleOptions): Promise => { - const contract = getGasPriceOracleContract(client) - return contract.read.version(params) -} - -export type EstimateFeeParams = { - /** - * The transaction call data as a 0x-prefixed hex string - */ - data: Bytes - /** - * The address of the account that will be sending the transaction - */ - account: Address -} & GasPriceOracleOptions & - Omit - -export type EstimateFees = < - TAbi extends Abi | readonly unknown[], - TFunctionName extends string | undefined = undefined ->( - options: OracleTransactionParameters & - GasPriceOracleOptions & - Omit -) => Promise -/** - * Estimates gas for an L2 transaction including the l1 fee - */ -export const estimateFees: EstimateFees = async (options) => { - const client = getL2Client(options.client) - const encodedFunctionData = encodeFunctionData({ - abi: options.abi, - args: options.args, - functionName: options.functionName, - } as EncodeFunctionDataParameters) - const [l1Fee, l2Gas, l2GasPrice] = await Promise.all([ - getL1Fee({ - ...options, - // account must be undefined or else viem will return undefined - account: undefined as any, - }), - client.estimateGas({ - to: options.to, - account: options.account, - accessList: options.accessList, - blockNumber: options.blockNumber, - blockTag: options.blockTag, - data: encodedFunctionData, - value: options.value, - } as EstimateGasParameters), - client.getGasPrice(), - ]) - return l1Fee + l2Gas * l2GasPrice -} diff --git a/packages/fee-estimation/src/vite-env.d.ts b/packages/fee-estimation/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2a006..000000000000 --- a/packages/fee-estimation/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/packages/fee-estimation/tsconfig.json b/packages/fee-estimation/tsconfig.json deleted file mode 100644 index 40f65330817c..000000000000 --- a/packages/fee-estimation/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "baseUrl": "./src", - "strict": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "node", - "jsx": "react", - "target": "ESNext", - "noEmit": true - }, - "include": ["./src"] -} diff --git a/packages/fee-estimation/tsup.config.ts b/packages/fee-estimation/tsup.config.ts deleted file mode 100644 index 6c050931fe14..000000000000 --- a/packages/fee-estimation/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from 'tsup' -import packageJson from './package.json' - -// @see https://tsup.egoist.dev/ -export default defineConfig({ - name: packageJson.name, - entry: ['src/estimateFees.ts'], - outDir: 'dist', - format: ['esm', 'cjs'], - splitting: false, - sourcemap: true, - clean: false, -}) diff --git a/packages/fee-estimation/vite.config.ts b/packages/fee-estimation/vite.config.ts deleted file mode 100644 index b11d26442e70..000000000000 --- a/packages/fee-estimation/vite.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'vitest/config' - -// @see https://vitest.dev/config/ -export default defineConfig({ - test: { - setupFiles: './setupVitest.ts', - environment: 'jsdom', - coverage: { - provider: 'istanbul', - }, - }, -}) diff --git a/packages/sdk/CHANGELOG.md b/packages/sdk/CHANGELOG.md index 3064cc2591c0..872be3d6bc62 100644 --- a/packages/sdk/CHANGELOG.md +++ b/packages/sdk/CHANGELOG.md @@ -1,5 +1,37 @@ # @eth-optimism/sdk +## 3.3.1 + +### Patch Changes + +- [#10593](https://github.com/ethereum-optimism/optimism/pull/10593) [`799bc898bfb207e2ccd4b2027e3fb4db4372292b`](https://github.com/ethereum-optimism/optimism/commit/799bc898bfb207e2ccd4b2027e3fb4db4372292b) Thanks [@nitaliano](https://github.com/nitaliano)! - expose FaultDisputeGame in getOEContract + +## 3.3.0 + +### Minor Changes + +- [#9951](https://github.com/ethereum-optimism/optimism/pull/9951) [`ac5b061dfce6a9817b928a8703be9252daaeeca7`](https://github.com/ethereum-optimism/optimism/commit/ac5b061dfce6a9817b928a8703be9252daaeeca7) Thanks [@smartcontracts](https://github.com/smartcontracts)! - Updates SDK for FPAC proven withdrawals mapping. + +### Patch Changes + +- [#9964](https://github.com/ethereum-optimism/optimism/pull/9964) [`8241220898128e1f61064f22dcb6fdd0a5f043c3`](https://github.com/ethereum-optimism/optimism/commit/8241220898128e1f61064f22dcb6fdd0a5f043c3) Thanks [@roninjin10](https://github.com/roninjin10)! - Removed only-allow command from package.json + +- [#9973](https://github.com/ethereum-optimism/optimism/pull/9973) [`87093b0e9144a4709f11c7fbd631828847d891f9`](https://github.com/ethereum-optimism/optimism/commit/87093b0e9144a4709f11c7fbd631828847d891f9) Thanks [@raffaele-oplabs](https://github.com/raffaele-oplabs)! - Added support for MODE sepolia and MODE mainnet + +- [#9969](https://github.com/ethereum-optimism/optimism/pull/9969) [`372bca2257764be33797d67ddca9b53c3dd3c295`](https://github.com/ethereum-optimism/optimism/commit/372bca2257764be33797d67ddca9b53c3dd3c295) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug where replayable transactions would fail `finalize` if they previously were marked as errors but replayable. + +- Updated dependencies [[`8241220898128e1f61064f22dcb6fdd0a5f043c3`](https://github.com/ethereum-optimism/optimism/commit/8241220898128e1f61064f22dcb6fdd0a5f043c3)]: + - @eth-optimism/contracts-bedrock@0.17.2 + - @eth-optimism/core-utils@0.13.2 + +## 3.2.3 + +### Patch Changes + +- [#9907](https://github.com/ethereum-optimism/optimism/pull/9907) [`5fe797f183e502c1c7e91fc1e74dd3cc664ba22e`](https://github.com/ethereum-optimism/optimism/commit/5fe797f183e502c1c7e91fc1e74dd3cc664ba22e) Thanks [@smartcontracts](https://github.com/smartcontracts)! - Minor optimizations and improvements to FPAC functions. + +- [#9919](https://github.com/ethereum-optimism/optimism/pull/9919) [`3dc129fade77ddf9d45bb4c2ecd34360d1aa838a`](https://github.com/ethereum-optimism/optimism/commit/3dc129fade77ddf9d45bb4c2ecd34360d1aa838a) Thanks [@smartcontracts](https://github.com/smartcontracts)! - Sets the address of the DisputeGameFactory contract for OP Sepolia. + ## 3.2.2 ### Patch Changes diff --git a/packages/sdk/README.md b/packages/sdk/README.md index 46b37ec96f2d..3c1ac04157c1 100644 --- a/packages/sdk/README.md +++ b/packages/sdk/README.md @@ -9,7 +9,9 @@ The `@eth-optimism/sdk` package provides a set of tools for interacting with Opt `@eth-optimism/sdk` has been superseded by `op-viem`. For most developers we suggest you migrate to [viem](https://viem.sh/op-stack) which has native built in op-stack support built in. It also has additional benefits. -**The OP Labs team has no plans to update @eth-optimism/sdk and it is in maintenance mode at the moment** +**The OP Labs team has no plans to add new features @eth-optimism/sdk and it is in maintenance mode** + +If you are already using the sdk you are safe as it will continue to be maintained. - an intuitive API that learned from this package and is now revamped - great treeshaking with a 10x+ improvement to bundlesize diff --git a/packages/sdk/package.json b/packages/sdk/package.json index f7711ff5f2d2..3560cff4bbbd 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@eth-optimism/sdk", - "version": "3.2.2", + "version": "3.3.1", "description": "[Optimism] Tools for working with Optimism", "main": "dist/index", "types": "dist/index", @@ -49,21 +49,20 @@ "ethereum-waffle": "^4.0.10", "ethers": "^5.7.2", "hardhat": "^2.20.1", - "hardhat-deploy": "^0.11.44", + "hardhat-deploy": "^0.12.2", "isomorphic-fetch": "^3.0.0", "mocha": "^10.2.0", "nyc": "^15.1.0", "ts-node": "^10.9.2", "typedoc": "^0.25.7", - "typescript": "^5.3.3", - "viem": "^2.7.19", + "typescript": "^5.4.5", + "viem": "^2.8.13", "vitest": "^1.2.2", "zod": "^3.22.4" }, "dependencies": { "@eth-optimism/contracts": "0.6.0", - "@eth-optimism/contracts-bedrock": "workspace:*", - "@eth-optimism/core-utils": "workspace:*", + "@eth-optimism/core-utils": "^0.13.2", "lodash": "^4.17.21", "merkletreejs": "^0.3.11", "rlp": "^2.2.7", diff --git a/packages/sdk/src/adapters/standard-bridge.ts b/packages/sdk/src/adapters/standard-bridge.ts index 46d30880611b..9e5315cf421a 100644 --- a/packages/sdk/src/adapters/standard-bridge.ts +++ b/packages/sdk/src/adapters/standard-bridge.ts @@ -14,10 +14,10 @@ import { } from '@ethersproject/abstract-provider' import { predeploys } from '@eth-optimism/contracts' import { hexStringEquals } from '@eth-optimism/core-utils' -import l1StandardBridgeArtifact from '@eth-optimism/contracts-bedrock/forge-artifacts/L1StandardBridge.sol/L1StandardBridge.json' -import l2StandardBridgeArtifact from '@eth-optimism/contracts-bedrock/forge-artifacts/L2StandardBridge.sol/L2StandardBridge.json' -import optimismMintableERC20 from '@eth-optimism/contracts-bedrock/forge-artifacts/OptimismMintableERC20.sol/OptimismMintableERC20.json' +import l1StandardBridgeArtifact from '../forge-artifacts/L1StandardBridge.json' +import l2StandardBridgeArtifact from '../forge-artifacts/L2StandardBridge.json' +import optimismMintableERC20 from '../forge-artifacts/OptimismMintableERC20.json' import { CrossChainMessenger } from '../cross-chain-messenger' import { IBridgeAdapter, diff --git a/packages/sdk/src/cross-chain-messenger.ts b/packages/sdk/src/cross-chain-messenger.ts index 7d17f338b803..65df54dcf460 100644 --- a/packages/sdk/src/cross-chain-messenger.ts +++ b/packages/sdk/src/cross-chain-messenger.ts @@ -19,7 +19,6 @@ import { remove0x, toHexString, toRpcHexString, - hashCrossDomainMessage, encodeCrossDomainMessageV0, encodeCrossDomainMessageV1, BedrockOutputData, @@ -58,6 +57,7 @@ import { IBridgeAdapter, ProvenWithdrawal, LowLevelMessage, + FPACProvenWithdrawal, } from './interfaces' import { toSignerOrProvider, @@ -73,6 +73,8 @@ import { DEPOSIT_CONFIRMATION_BLOCKS, CHAIN_BLOCK_TIMES, hashMessageHash, + getContractInterfaceBedrock, + toJsonRpcProvider, } from './utils' export class CrossChainMessenger { @@ -121,6 +123,11 @@ export class CrossChainMessenger { */ public bedrock: boolean + /** + * Cache for output root validation. Output roots are expensive to verify, so we cache them. + */ + private _outputCache: Array<{ root: string; valid: boolean }> = [] + /** * Creates a new CrossChainProvider instance. * @@ -687,7 +694,13 @@ export class CrossChainMessenger { message: MessageLike, // consider making this an options object next breaking release messageIndex = 0, + /** + * @deprecated no longer used since no log filters are used + */ fromBlockOrBlockHash?: BlockTag, + /** + * @deprecated no longer used since no log filters are used + */ toBlockOrBlockHash?: BlockTag ): Promise { const resolved = await this.toCrossChainMessage(message, messageIndex) @@ -721,22 +734,23 @@ export class CrossChainMessenger { (await messenger.successfulMessages(messageHashV0)) || (await messenger.successfulMessages(messageHashV1)) + // Avoid the extra query if we already know the message was successful. + if (success) { + return MessageStatus.RELAYED + } + const failure = (await messenger.failedMessages(messageHashV0)) || (await messenger.failedMessages(messageHashV1)) if (resolved.direction === MessageDirection.L1_TO_L2) { - if (success) { - return MessageStatus.RELAYED - } else if (failure) { + if (failure) { return MessageStatus.FAILED_L1_TO_L2_MESSAGE } else { return MessageStatus.UNCONFIRMED_L1_TO_L2_MESSAGE } } else { - if (success) { - return MessageStatus.RELAYED - } else if (failure) { + if (failure) { return MessageStatus.READY_FOR_RELAY } else { let timestamp: number @@ -755,19 +769,16 @@ export class CrossChainMessenger { messageIndex ) - // Pick portal based on FPAC compatibility. - const portal = (await this.fpac()) - ? this.contracts.l1.OptimismPortal2 - : this.contracts.l1.OptimismPortal - // Attempt to fetch the proven withdrawal. - const provenWithdrawal = await portal.provenWithdrawals( + const provenWithdrawal = await this.getProvenWithdrawal( hashLowLevelMessage(withdrawal) ) - // If the withdrawal hash has not been proven on L1, - // return `READY_TO_PROVE` - if (provenWithdrawal.timestamp.eq(BigNumber.from(0))) { + // If the withdrawal hash has not been proven on L1, return READY_TO_PROVE. + // Note that this will also apply in the case that a withdrawal has been proven but the + // proposal used to create the proof was invalidated. This is fine because in that case + // the withdrawal needs to be proven again anyway. + if (provenWithdrawal === null) { return MessageStatus.READY_TO_PROVE } @@ -794,10 +805,36 @@ export class CrossChainMessenger { messageIndex ) + // Get the withdrawal hash. + const withdrawalHash = hashLowLevelMessage(withdrawal) + + // Grab the proven withdrawal data. + const provenWithdrawal = await this.getProvenWithdrawal( + withdrawalHash + ) + + // Sanity check, should've already happened above but do it just in case. + if (provenWithdrawal === null) { + // Ready to prove is the correct status here, we would not expect to hit this code path + // unless there was an unexpected reorg on L1. Since this is unlikely we log a warning. + console.warn( + 'Unexpected code path reached in getMessageStatus, returning READY_TO_PROVE' + ) + return MessageStatus.READY_TO_PROVE + } + + // Shouldn't happen, but worth checking just in case. + if (!('proofSubmitter' in provenWithdrawal)) { + throw new Error( + `expected to get FPAC withdrawal but got legacy withdrawal` + ) + } + try { // If this doesn't revert then we should be fine to relay. await this.contracts.l1.OptimismPortal2.checkWithdrawal( - hashLowLevelMessage(withdrawal) + hashLowLevelMessage(withdrawal), + provenWithdrawal.proofSubmitter ) return MessageStatus.READY_FOR_RELAY @@ -1234,12 +1271,168 @@ export class CrossChainMessenger { */ public async getProvenWithdrawal( withdrawalHash: string - ): Promise { + ): Promise { if (!this.bedrock) { throw new Error('message proving only applies after the bedrock upgrade') } - return this.contracts.l1.OptimismPortal.provenWithdrawals(withdrawalHash) + // Getting the withdrawal is easy before FPAC. + if (!(await this.fpac())) { + // Grab the proven withdrawal directly by hash. + const provenWithdrawal = + await this.contracts.l1.OptimismPortal.provenWithdrawals(withdrawalHash) + + // If the timestamp is 0 then the withdrawal has not been proven. + if (provenWithdrawal.timestamp.eq(0)) { + return null + } else { + return provenWithdrawal + } + } + + // Getting the withdrawal is a bit more complicated after FPAC. + // First we need to get the number of proof submitters for this withdrawal. + const numProofSubmitters = BigNumber.from( + await this.contracts.l1.OptimismPortal2.numProofSubmitters(withdrawalHash) + ).toNumber() + + // Now we need to find any withdrawal where the output proposal that the withdrawal was proven + // against is actually valid. We can use the same output validation cache used elsewhere. + for (let i = 0; i < numProofSubmitters; i++) { + // Grab the proof submitter. + const proofSubmitter = + await this.contracts.l1.OptimismPortal2.proofSubmitters( + withdrawalHash, + i + ) + + // Grab the ProvenWithdrawal struct for this proof. + const provenWithdrawal = + await this.contracts.l1.OptimismPortal2.provenWithdrawals( + withdrawalHash, + proofSubmitter + ) + + // Grab the game that was proven against. + const game = new ethers.Contract( + provenWithdrawal.disputeGameProxy, + getContractInterfaceBedrock('FaultDisputeGame'), + this.l1SignerOrProvider + ) + + // Check the game status. + const status = await game.status() + if (status === 1) { + // If status is CHALLENGER_WINS then it's no good. + continue + } else if (status === 2) { + // If status is DEFENDER_WINS then it's a valid proof. + return { + ...provenWithdrawal, + proofSubmitter, + } + } else if (status > 2) { + // Shouldn't happen in practice. + throw new Error('got invalid game status') + } + + // Otherwise we're IN_PROGRESS. + // Grab the block number from the extra data. Since this is not a standardized field we need + // to be defensive and assume that the extra data could be anything. If the extra data does + // not decode properly then we just skip this game. + const extraData = await game.extraData() + let l2BlockNumber: number + try { + ;[l2BlockNumber] = ethers.utils.defaultAbiCoder.decode( + ['uint256'], + extraData + ) + } catch (err) { + // Didn't decode properly, bad game. + continue + } + + // Finally we check if the output root is valid. If it is, then we can return the proven + // withdrawal. If it isn't, then we act as if this proof does not exist because it isn't + // useful for finalizing the withdrawal. + if (await this.isValidOutputRoot(await game.rootClaim(), l2BlockNumber)) { + return { + ...provenWithdrawal, + proofSubmitter, + } + } + } + + // Return null if we didn't find a valid proof. + return null + } + + /** + * Checks whether a given root claim is valid. Uses the L2 node that the SDK is connected to + * when verifying the claim. Assumes that the connected L2 node is honest. + * + * @param outputRoot Output root to verify. + * @param l2BlockNumber L2 block number the root is for. + * @returns Whether or not the root is valid. + */ + public async isValidOutputRoot( + outputRoot: string, + l2BlockNumber: number + ): Promise { + // Use the cache if we can. + const cached = this._outputCache.find((other) => { + return other.root === outputRoot + }) + + // Skip if we can use the cached. + if (cached) { + return cached.valid + } + + // If the cache ever gets to 10k elements, clear out the first half. Works well enough + // since the cache will generally tend to be used in a FIFO manner. + if (this._outputCache.length > 10000) { + this._outputCache = this._outputCache.slice(5000) + } + + // We didn't hit the cache so we're going to have to do the work. + try { + // Make sure this is a JSON RPC provider. + const provider = toJsonRpcProvider(this.l2Provider) + + // Grab the block and storage proof at the same time. + const [block, proof] = await Promise.all([ + provider.send('eth_getBlockByNumber', [ + toRpcHexString(l2BlockNumber), + false, + ]), + makeStateTrieProof( + provider, + l2BlockNumber, + this.contracts.l2.OVM_L2ToL1MessagePasser.address, + ethers.constants.HashZero + ), + ]) + + // Compute the output. + const output = ethers.utils.solidityKeccak256( + ['bytes32', 'bytes32', 'bytes32', 'bytes32'], + [ + ethers.constants.HashZero, + block.stateRoot, + proof.storageRoot, + block.hash, + ] + ) + + // If the output matches the proposal then we're good. + const valid = output === outputRoot + this._outputCache.push({ root: outputRoot, valid }) + return valid + } catch (err) { + // Assume the game is invalid but don't add it to the cache just in case we had a temp error. + return false + } } /** @@ -1279,29 +1472,43 @@ export class CrossChainMessenger { Math.min(100, gameCount.toNumber()) ) - // Find a game with a block number that is greater than or equal to the block number that the - // message was included in. We can use this proposal to prove the message to the portal. - let match: any + // Find all games that are for proposals about blocks newer than the message block. + const matches: any[] = [] for (const game of latestGames) { - const [blockNumber] = ethers.utils.defaultAbiCoder.decode( - ['uint256'], - game.extraData - ) - if (blockNumber.gte(resolved.blockNumber)) { - match = { - ...game, - l2BlockNumber: blockNumber, + try { + const [blockNumber] = ethers.utils.defaultAbiCoder.decode( + ['uint256'], + game.extraData + ) + if (blockNumber.gte(resolved.blockNumber)) { + matches.push({ + ...game, + l2BlockNumber: blockNumber, + }) } - break + } catch (err) { + // If we can't decode the extra data then we just skip this game. + continue } } - // TODO: It would be more correct here to actually verify the proposal since proposals are - // not guaranteed to be correct. proveMessage will actually do this verification for us but - // there's a devex edge case where this message appears to give back a valid proposal that - // ends up reverting inside of proveMessage. At least this is safe for users but not ideal - // for developers and we should work out the simplest way to fix it. Main blocker is that - // verifying the proposal may require access to an archive node. + // Shuffle the list of matches. We shuffle here to avoid potential DoS vectors where the + // latest games are all invalid and the SDK would be forced to make a bunch of archive calls. + for (let i = matches.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)) + ;[matches[i], matches[j]] = [matches[j], matches[i]] + } + + // Now we verify the proposals in the matches array. + let match: any + for (const option of matches) { + if ( + await this.isValidOutputRoot(option.rootClaim, option.l2BlockNumber) + ) { + match = option + break + } + } // If there's no match then we can't prove the message to the portal. if (!match) { @@ -1577,7 +1784,7 @@ export class CrossChainMessenger { ) const stateTrieProof = await makeStateTrieProof( - this.l2Provider as ethers.providers.JsonRpcProvider, + toJsonRpcProvider(this.l2Provider), resolved.blockNumber, this.contracts.l2.OVM_L2ToL1MessagePasser.address, messageSlot @@ -1623,16 +1830,16 @@ export class CrossChainMessenger { const hash = hashLowLevelMessage(withdrawal) const messageSlot = hashMessageHash(hash) + const provider = toJsonRpcProvider(this.l2Provider) + const stateTrieProof = await makeStateTrieProof( - this.l2Provider as ethers.providers.JsonRpcProvider, + provider, output.l2BlockNumber, this.contracts.l2.BedrockMessagePasser.address, messageSlot ) - const block = await ( - this.l2Provider as ethers.providers.JsonRpcProvider - ).send('eth_getBlockByNumber', [ + const block = await provider.send('eth_getBlockByNumber', [ toRpcHexString(output.l2BlockNumber), false, ]) @@ -2100,15 +2307,64 @@ export class CrossChainMessenger { } if (this.bedrock) { - const withdrawal = await this.toLowLevelMessage(resolved, messageIndex) + // get everything we need to finalize + const messageHashV1 = hashCrossDomainMessagev1( + resolved.messageNonce, + resolved.sender, + resolved.target, + resolved.value, + resolved.minGasLimit, + resolved.message + ) + + // fetch the following + // 1. Whether it needs to be replayed because it failed + // 2. The withdrawal as a low level message + const [isFailed, withdrawal] = await Promise.allSettled([ + this.contracts.l1.L1CrossDomainMessenger.failedMessages( + messageHashV1 + ), + this.toLowLevelMessage(resolved, messageIndex), + ]) + + // handle errors + if ( + isFailed.status === 'rejected' || + withdrawal.status === 'rejected' + ) { + const rejections = [isFailed, withdrawal] + .filter((p) => p.status === 'rejected') + .map((p: PromiseRejectedResult) => p.reason) + throw rejections.length > 1 + ? new AggregateError(rejections) + : rejections[0] + } + + if (isFailed.value === true) { + const xdmWithdrawal = + this.contracts.l1.L1CrossDomainMessenger.interface.decodeFunctionData( + 'relayMessage', + withdrawal.value.message + ) + return this.contracts.l1.L1CrossDomainMessenger.populateTransaction.relayMessage( + xdmWithdrawal._nonce, + xdmWithdrawal._sender, + xdmWithdrawal._target, + xdmWithdrawal._value, + xdmWithdrawal._minGasLimit, + xdmWithdrawal._message, + opts?.overrides || {} + ) + } + return this.contracts.l1.OptimismPortal.populateTransaction.finalizeWithdrawalTransaction( [ - withdrawal.messageNonce, - withdrawal.sender, - withdrawal.target, - withdrawal.value, - withdrawal.minGasLimit, - withdrawal.message, + withdrawal.value.messageNonce, + withdrawal.value.sender, + withdrawal.value.target, + withdrawal.value.value, + withdrawal.value.minGasLimit, + withdrawal.value.message, ], opts?.overrides || {} ) diff --git a/packages/sdk/src/forge-artifacts/DisputeGameFactory.json b/packages/sdk/src/forge-artifacts/DisputeGameFactory.json new file mode 100644 index 000000000000..e2db82b17cc3 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/DisputeGameFactory.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"create","inputs":[{"name":"_gameType","type":"uint32","internalType":"GameType"},{"name":"_rootClaim","type":"bytes32","internalType":"Claim"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"proxy_","type":"address","internalType":"contract IDisputeGame"}],"stateMutability":"payable"},{"type":"function","name":"findLatestGames","inputs":[{"name":"_gameType","type":"uint32","internalType":"GameType"},{"name":"_start","type":"uint256","internalType":"uint256"},{"name":"_n","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"games_","type":"tuple[]","internalType":"struct IDisputeGameFactory.GameSearchResult[]","components":[{"name":"index","type":"uint256","internalType":"uint256"},{"name":"metadata","type":"bytes32","internalType":"GameId"},{"name":"timestamp","type":"uint64","internalType":"Timestamp"},{"name":"rootClaim","type":"bytes32","internalType":"Claim"},{"name":"extraData","type":"bytes","internalType":"bytes"}]}],"stateMutability":"view"},{"type":"function","name":"gameAtIndex","inputs":[{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"gameType_","type":"uint32","internalType":"GameType"},{"name":"timestamp_","type":"uint64","internalType":"Timestamp"},{"name":"proxy_","type":"address","internalType":"contract IDisputeGame"}],"stateMutability":"view"},{"type":"function","name":"gameCount","inputs":[],"outputs":[{"name":"gameCount_","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"gameImpls","inputs":[{"name":"","type":"uint32","internalType":"GameType"}],"outputs":[{"name":"","type":"address","internalType":"contract IDisputeGame"}],"stateMutability":"view"},{"type":"function","name":"games","inputs":[{"name":"_gameType","type":"uint32","internalType":"GameType"},{"name":"_rootClaim","type":"bytes32","internalType":"Claim"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"proxy_","type":"address","internalType":"contract IDisputeGame"},{"name":"timestamp_","type":"uint64","internalType":"Timestamp"}],"stateMutability":"view"},{"type":"function","name":"getGameUUID","inputs":[{"name":"_gameType","type":"uint32","internalType":"GameType"},{"name":"_rootClaim","type":"bytes32","internalType":"Claim"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"uuid_","type":"bytes32","internalType":"Hash"}],"stateMutability":"pure"},{"type":"function","name":"initBonds","inputs":[{"name":"","type":"uint32","internalType":"GameType"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_owner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setImplementation","inputs":[{"name":"_gameType","type":"uint32","internalType":"GameType"},{"name":"_impl","type":"address","internalType":"contract IDisputeGame"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setInitBond","inputs":[{"name":"_gameType","type":"uint32","internalType":"GameType"},{"name":"_initBond","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"DisputeGameCreated","inputs":[{"name":"disputeProxy","type":"address","indexed":true,"internalType":"address"},{"name":"gameType","type":"uint32","indexed":true,"internalType":"GameType"},{"name":"rootClaim","type":"bytes32","indexed":true,"internalType":"Claim"}],"anonymous":false},{"type":"event","name":"ImplementationSet","inputs":[{"name":"impl","type":"address","indexed":true,"internalType":"address"},{"name":"gameType","type":"uint32","indexed":true,"internalType":"GameType"}],"anonymous":false},{"type":"event","name":"InitBondUpdated","inputs":[{"name":"gameType","type":"uint32","indexed":true,"internalType":"GameType"},{"name":"newBond","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"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":"error","name":"GameAlreadyExists","inputs":[{"name":"uuid","type":"bytes32","internalType":"Hash"}]},{"type":"error","name":"IncorrectBondAmount","inputs":[]},{"type":"error","name":"NoImplementation","inputs":[{"name":"gameType","type":"uint32","internalType":"GameType"}]}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b506200001e600062000024565b62000292565b600054610100900460ff1615808015620000455750600054600160ff909116105b8062000075575062000062306200016260201b62000cdd1760201c565b15801562000075575060005460ff166001145b620000de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000102576000805461ff0019166101001790555b6200010c62000171565b6200011782620001d9565b80156200015e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054610100900460ff16620001cd5760405162461bcd60e51b815260206004820152602b60248201526000805160206200185283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b620001d76200022b565b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16620002875760405162461bcd60e51b815260206004820152602b60248201526000805160206200185283398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b620001d733620001d9565b6115b080620002a26000396000f3fe6080604052600436106100e85760003560e01c80636593dc6e1161008a57806396cd97201161005957806396cd972014610313578063bb8aa1fc14610333578063c4d66de814610394578063f2fde38b146103b457600080fd5b80636593dc6e14610293578063715018a6146102c057806382ecf2f6146102d55780638da5cb5b146102e857600080fd5b8063254bd683116100c6578063254bd6831461019c5780634d1975b4146101c957806354fd4d50146101e85780635f0150cb1461023e57600080fd5b806314f6b1a3146100ed5780631b685b9e1461010f5780631e3342401461017c575b600080fd5b3480156100f957600080fd5b5061010d6101083660046110bf565b6103d4565b005b34801561011b57600080fd5b5061015261012a3660046110f6565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061010d610197366004611111565b61045e565b3480156101a857600080fd5b506101bc6101b736600461113b565b6104aa565b60405161017391906111e8565b3480156101d557600080fd5b506068545b604051908152602001610173565b3480156101f457600080fd5b506102316040518060400160405280600581526020017f302e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161017391906112a5565b34801561024a57600080fd5b5061025e6102593660046112b8565b6106ee565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff909116602083015201610173565b34801561029f57600080fd5b506101da6102ae3660046110f6565b60666020526000908152604090205481565b3480156102cc57600080fd5b5061010d610741565b6101526102e33660046112b8565b610755565b3480156102f457600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610152565b34801561031f57600080fd5b506101da61032e3660046112b8565b6109ef565b34801561033f57600080fd5b5061035361034e36600461133f565b610a28565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610173565b3480156103a057600080fd5b5061010d6103af366004611358565b610a8a565b3480156103c057600080fd5b5061010d6103cf366004611358565b610c26565b6103dc610cf9565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610466610cf9565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806104bc575081155b6106e7575060408051600583901b8101602001909152825b8381116106e5576000606882815481106104f0576104f0611375565b600091825260209091200154905060e081901c60a082901c67ffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff831663ffffffff891683036106b6576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d091908101906113d3565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610643919061149e565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a5161068591906114b7565b8151811061069557610695611375565b6020026020010181905250888851106106b3575050505050506106e5565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506104d49050565b505b9392505050565b60008060006106ff878787876109ef565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610749610cf9565b6107536000610d7a565b565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107c5576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff86166000908152606660205260409020543414610813576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108206001436114b7565b40905061088a338783888860405160200161083f9594939291906114f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff841690610df1565b92508273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108d457600080fd5b505af11580156108e8573d6000803e3d6000fd5b505050505060006108fb888888886109ef565b60008181526067602052604090205490915015610947576040517f014f6fe5000000000000000000000000000000000000000000000000000000008152600481018290526024016107bc565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610a089493929190611542565b604051602081830303815290604052805190602001209050949350505050565b6000806000610a7d60688581548110610a4357610a43611375565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9196909550909350915050565b600054610100900460ff1615808015610aaa5750600054600160ff909116105b80610ac45750303b158015610ac4575060005460ff166001145b610b50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bc565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bae57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bb6610dff565b610bbf82610d7a565b8015610c2257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610c2e610cf9565b73ffffffffffffffffffffffffffffffffffffffff8116610cd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bc565b610cda81610d7a565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006106e760008484610e9e565b600054610100900460ff16610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b610753610fe4565b600060608203516040830351602084035184518060208701018051600283016c5af43d3d93803e606057fd5bf3895289600d8a035278593da1005b363d3d373d3d3d3d610000806062363936013d738160481b1760218a03527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff603a8a035272fd6100003d81600a3d39f336602c57343d527f6062820160781b1761ff9e82106059018a03528060f01b8352606c8101604c8a038cf097505086610f6a5763301164256000526004601cfd5b905285527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09092019190915292915050565b600054610100900460ff1661107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b61075333610d7a565b803563ffffffff8116811461109857600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610cda57600080fd5b600080604083850312156110d257600080fd5b6110db83611084565b915060208301356110eb8161109d565b809150509250929050565b60006020828403121561110857600080fd5b6106e782611084565b6000806040838503121561112457600080fd5b61112d83611084565b946020939093013593505050565b60008060006060848603121561115057600080fd5b61115984611084565b95602085013595506040909401359392505050565b60005b83811015611189578181015183820152602001611171565b83811115611198576000848401525b50505050565b600081518084526111b681602086016020860161116e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611297578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a0918501829052906112838186018361119e565b96890196945050509086019060010161120f565b509098975050505050505050565b6020815260006106e7602083018461119e565b600080600080606085870312156112ce57600080fd5b6112d785611084565b935060208501359250604085013567ffffffffffffffff808211156112fb57600080fd5b818701915087601f83011261130f57600080fd5b81358181111561131e57600080fd5b88602082850101111561133057600080fd5b95989497505060200194505050565b60006020828403121561135157600080fd5b5035919050565b60006020828403121561136a57600080fd5b81356106e78161109d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113e557600080fd5b815167ffffffffffffffff808211156113fd57600080fd5b818401915084601f83011261141157600080fd5b815181811115611423576114236113a4565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611469576114696113a4565b8160405282815287602084870101111561148257600080fd5b61149383602083016020880161116e565b979650505050505050565b6000602082840312156114b057600080fd5b5051919050565b6000828210156114f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1681528460148201528360348201528183605483013760009101605401908152949350505050565b63ffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069","sourceMap":"989:7456:163:-:0;;;1965:74;;;;;;;;;-1:-1:-1;2010:22:163::1;2029:1;2010:10;:22::i;:::-;989:7456:::0;;2136:124;3111:19:27;3134:13;;;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:27;;3212:1;3197:12;;;;:16;3179:34;3178:108;;;;3220:44;3258:4;3220:29;;;;;:44;;:::i;:::-;3219:45;:66;;;;-1:-1:-1;3268:12:27;;;;;:17;3219:66;3157:201;;;;-1:-1:-1;;;3157:201:27;;216:2:357;3157:201:27;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:357;;;338:44;399:19;;3157:201:27;;;;;;;;;3368:12;:16;;-1:-1:-1;;3368:16:27;3383:1;3368:16;;;3394:65;;;;3428:13;:20;;-1:-1:-1;;3428:20:27;;;;;3394:65;2201:16:163::1;:14;:16::i;:::-;2227:26;2246:6:::0;2227:18:::1;:26::i;:::-;3483:14:27::0;3479:99;;;3529:5;3513:21;;-1:-1:-1;;3513:21:27;;;3553:14;;-1:-1:-1;581:36:357;;3553:14:27;;569:2:357;554:18;3553:14:27;;;;;;;3479:99;3101:483;2136:124:163;:::o;1186:320:33:-;-1:-1:-1;;;;;1476:19:33;;:23;;;1186:320::o;1003:95:26:-;4910:13:27;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:27;;830:2:357;4902:69:27;;;812:21:357;869:2;849:18;;;842:30;-1:-1:-1;;;;;;;;;;;888:18:357;;;881:62;-1:-1:-1;;;959:18:357;;;952:41;1010:19;;4902:69:27;628:407:357;4902:69:27;1065:26:26::1;:24;:26::i;:::-;1003:95::o:0;2673:187::-;2765:6;;;-1:-1:-1;;;;;2781:17:26;;;-1:-1:-1;;;;;;2781:17:26;;;;;;;2813:40;;2765:6;;;2781:17;2765:6;;2813:40;;2746:16;;2813:40;2736:124;2673:187;:::o;1104:111::-;4910:13:27;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:27;;830:2:357;4902:69:27;;;812:21:357;869:2;849:18;;;842:30;-1:-1:-1;;;;;;;;;;;888:18:357;;;881:62;-1:-1:-1;;;959:18:357;;;952:41;1010:19;;4902:69:27;628:407:357;4902:69:27;1176:32:26::1;929:10:34::0;1176:18:26::1;:32::i;628:407:357:-:0;989:7456:163;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106100e85760003560e01c80636593dc6e1161008a57806396cd97201161005957806396cd972014610313578063bb8aa1fc14610333578063c4d66de814610394578063f2fde38b146103b457600080fd5b80636593dc6e14610293578063715018a6146102c057806382ecf2f6146102d55780638da5cb5b146102e857600080fd5b8063254bd683116100c6578063254bd6831461019c5780634d1975b4146101c957806354fd4d50146101e85780635f0150cb1461023e57600080fd5b806314f6b1a3146100ed5780631b685b9e1461010f5780631e3342401461017c575b600080fd5b3480156100f957600080fd5b5061010d6101083660046110bf565b6103d4565b005b34801561011b57600080fd5b5061015261012a3660046110f6565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061010d610197366004611111565b61045e565b3480156101a857600080fd5b506101bc6101b736600461113b565b6104aa565b60405161017391906111e8565b3480156101d557600080fd5b506068545b604051908152602001610173565b3480156101f457600080fd5b506102316040518060400160405280600581526020017f302e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161017391906112a5565b34801561024a57600080fd5b5061025e6102593660046112b8565b6106ee565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff909116602083015201610173565b34801561029f57600080fd5b506101da6102ae3660046110f6565b60666020526000908152604090205481565b3480156102cc57600080fd5b5061010d610741565b6101526102e33660046112b8565b610755565b3480156102f457600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610152565b34801561031f57600080fd5b506101da61032e3660046112b8565b6109ef565b34801561033f57600080fd5b5061035361034e36600461133f565b610a28565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610173565b3480156103a057600080fd5b5061010d6103af366004611358565b610a8a565b3480156103c057600080fd5b5061010d6103cf366004611358565b610c26565b6103dc610cf9565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610466610cf9565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806104bc575081155b6106e7575060408051600583901b8101602001909152825b8381116106e5576000606882815481106104f0576104f0611375565b600091825260209091200154905060e081901c60a082901c67ffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff831663ffffffff891683036106b6576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d091908101906113d3565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610643919061149e565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a5161068591906114b7565b8151811061069557610695611375565b6020026020010181905250888851106106b3575050505050506106e5565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506104d49050565b505b9392505050565b60008060006106ff878787876109ef565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610749610cf9565b6107536000610d7a565b565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107c5576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff86166000908152606660205260409020543414610813576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108206001436114b7565b40905061088a338783888860405160200161083f9594939291906114f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff841690610df1565b92508273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108d457600080fd5b505af11580156108e8573d6000803e3d6000fd5b505050505060006108fb888888886109ef565b60008181526067602052604090205490915015610947576040517f014f6fe5000000000000000000000000000000000000000000000000000000008152600481018290526024016107bc565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610a089493929190611542565b604051602081830303815290604052805190602001209050949350505050565b6000806000610a7d60688581548110610a4357610a43611375565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9196909550909350915050565b600054610100900460ff1615808015610aaa5750600054600160ff909116105b80610ac45750303b158015610ac4575060005460ff166001145b610b50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bc565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bae57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bb6610dff565b610bbf82610d7a565b8015610c2257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610c2e610cf9565b73ffffffffffffffffffffffffffffffffffffffff8116610cd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bc565b610cda81610d7a565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006106e760008484610e9e565b600054610100900460ff16610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b610753610fe4565b600060608203516040830351602084035184518060208701018051600283016c5af43d3d93803e606057fd5bf3895289600d8a035278593da1005b363d3d373d3d3d3d610000806062363936013d738160481b1760218a03527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff603a8a035272fd6100003d81600a3d39f336602c57343d527f6062820160781b1761ff9e82106059018a03528060f01b8352606c8101604c8a038cf097505086610f6a5763301164256000526004601cfd5b905285527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09092019190915292915050565b600054610100900460ff1661107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b61075333610d7a565b803563ffffffff8116811461109857600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610cda57600080fd5b600080604083850312156110d257600080fd5b6110db83611084565b915060208301356110eb8161109d565b809150509250929050565b60006020828403121561110857600080fd5b6106e782611084565b6000806040838503121561112457600080fd5b61112d83611084565b946020939093013593505050565b60008060006060848603121561115057600080fd5b61115984611084565b95602085013595506040909401359392505050565b60005b83811015611189578181015183820152602001611171565b83811115611198576000848401525b50505050565b600081518084526111b681602086016020860161116e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611297578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a0918501829052906112838186018361119e565b96890196945050509086019060010161120f565b509098975050505050505050565b6020815260006106e7602083018461119e565b600080600080606085870312156112ce57600080fd5b6112d785611084565b935060208501359250604085013567ffffffffffffffff808211156112fb57600080fd5b818701915087601f83011261130f57600080fd5b81358181111561131e57600080fd5b88602082850101111561133057600080fd5b95989497505060200194505050565b60006020828403121561135157600080fd5b5035919050565b60006020828403121561136a57600080fd5b81356106e78161109d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113e557600080fd5b815167ffffffffffffffff808211156113fd57600080fd5b818401915084601f83011261141157600080fd5b815181811115611423576114236113a4565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611469576114696113a4565b8160405282815287602084870101111561148257600080fd5b61149383602083016020880161116e565b979650505050505050565b6000602082840312156114b057600080fd5b5051919050565b6000828210156114f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1681528460148201528360348201528183605483013760009101605401908152949350505050565b63ffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c634300080f000a","sourceMap":"989:7456:163:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8027:190;;;;;;;;;;-1:-1:-1;8027:190:163;;;;;:::i;:::-;;:::i;:::-;;1338:50;;;;;;;;;;-1:-1:-1;1338:50:163;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1237:42:357;1225:55;;;1207:74;;1195:2;1180:18;1338:50:163;;;;;;;;8263:180;;;;;;;;;;-1:-1:-1;8263:180:163;;;;;:::i;:::-;;:::i;6052:1929::-;;;;;;;;;;-1:-1:-1;6052:1929:163;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2306:117::-;;;;;;;;;;-1:-1:-1;2393:16:163;:23;2306:117;;;4100:25:357;;;4088:2;4073:18;2306:117:163;3954:177:357;1251:40:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2469:342::-;;;;;;;;;;-1:-1:-1;2469:342:163;;;;;:::i;:::-;;:::i;:::-;;;;5437:42:357;5425:55;;;5407:74;;5529:18;5517:31;;;5512:2;5497:18;;5490:59;5380:18;2469:342:163;5179:376:357;1435:45:163;;;;;;;;;;-1:-1:-1;1435:45:163;;;;;:::i;:::-;;;;;;;;;;;;;;2071:101:26;;;;;;;;;;;;;:::i;3138:2553:163:-;;;;;;:::i;:::-;;:::i;1441:85:26:-;;;;;;;;;;-1:-1:-1;1513:6:26;;;;1441:85;;5737:269:163;;;;;;;;;;-1:-1:-1;5737:269:163;;;;;:::i;:::-;;:::i;2857:235::-;;;;;;;;;;-1:-1:-1;2857:235:163;;;;;:::i;:::-;;:::i;:::-;;;;6501:10:357;6489:23;;;6471:42;;6561:18;6549:31;;;6544:2;6529:18;;6522:59;6629:42;6617:55;6597:18;;;6590:83;6459:2;6444:18;2857:235:163;6185:494:357;2136:124:163;;;;;;;;;;-1:-1:-1;2136:124:163;;;;;:::i;:::-;;:::i;2321:198:26:-;;;;;;;;;;-1:-1:-1;2321:198:26;;;;;:::i;:::-;;:::i;8027:190:163:-;1334:13:26;:11;:13::i;:::-;8123:20:163::1;::::0;::::1;;::::0;;;:9:::1;:20;::::0;;;;;:28;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;8166:44;;8123:28;;8166:44:::1;::::0;::::1;8027:190:::0;;:::o;8263:180::-;1334:13:26;:11;:13::i;:::-;8352:20:163::1;::::0;::::1;;::::0;;;:9:::1;:20;::::0;;;;;:32;;;8399:37;8375:9;;8352:20;8399:37:::1;::::0;::::1;8263:180:::0;;:::o;6052:1929::-;6384:16;:23;6202:32;;6374:33;;;;:44;;-1:-1:-1;6411:7:163;;6374:44;6420:13;6370:63;-1:-1:-1;6690:4:163;6684:11;;6747:4;6743:13;;;6721:37;;6737:4;6721:37;6708:51;;;6891:6;6874:1101;6914:6;6909:1;:11;6874:1101;;6937:9;6949:16;6966:1;6949:19;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;1277:3:174;1273:17;;;1325:3;1321:17;;;1340:18;1317:42;1399;1386:56;;7093:13:163;;;7075:33;;7071:834;;7433:4;7424:6;7418:13;7414:24;7406:6;7399:40;7475:22;7500:5;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7475:42;;7535:15;7553:5;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7535:35;;7616:226;;;;;;;;7662:1;7616:226;;;;7695:2;7616:226;;;;7730:9;7616:226;;;;;;7772:9;7616:226;;;;7814:9;7616:226;;;7588:6;7611:1;7595:6;:13;:17;;;;:::i;:::-;7588:25;;;;;;;;:::i;:::-;;;;;;:254;;;;7881:2;7864:6;:13;:19;7860:30;;7885:5;;;;;;;;7860:30;7110:795;;7071:834;-1:-1:-1;;7947:3:163;;;;;-1:-1:-1;6874:1101:163;;-1:-1:-1;6874:1101:163;;;6052:1929;;;;;;:::o;2469:342::-;2626:19;2647:20;2683:9;2695:46;2707:9;2718:10;2730;;2695:11;:46::i;:::-;2776:19;;;;:13;:19;;;;;;1399:42:174;1386:56;;;1325:3;1321:17;;;;1340:18;1317:42;;-1:-1:-1;2751:53:163;-1:-1:-1;;;;;;2469:342:163:o;2071:101:26:-;1334:13;:11;:13::i;:::-;2135:30:::1;2162:1;2135:18;:30::i;:::-;2071:101::o:0;3138:2553:163:-;3424:20;;;3299:19;3424:20;;;:9;:20;;;;;;;;;3539:67;;3579:27;;;;;8982:10:357;8970:23;;3579:27:163;;;8952:42:357;8925:18;;3579:27:163;;;;;;;;3539:67;3701:20;;;;;;;:9;:20;;;;;;3688:9;:33;3684:67;;3730:21;;;;;;;;;;;;;;3684:67;3807:18;3838:16;3853:1;3838:12;:16;:::i;:::-;3828:27;3807:48;;4890:85;4927:10;4939;4951;4963;;4910:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;4890:19;;;;;:85::i;:::-;4868:108;;4986:6;:17;;;5012:9;4986:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5099:9;5111:46;5123:9;5134:10;5146;;5111:11;:46::i;:::-;5290:1;5258:19;;;:13;:19;;;;;;5099:58;;-1:-1:-1;5244:48:163;5240:84;;5301:23;;;;;;;;4100:25:357;;;4073:18;;5301:23:163;3954:177:357;5240:84:163;5364:9;5424:15;767:3:174;763:20;746:3;742:19;;;739:45;736:61;;5552:19:163;;;;:13;:19;;;;;;:24;;;5586:16;:25;;;;;;;;;;;;;;;5626:58;5364:86;;-1:-1:-1;5673:10:163;;5626:58;;;;;;;;;;5552:19;5626:58;3324:2367;;;;3138:2553;;;;;;:::o;5737:269::-;5898:10;5963:9;5974:10;5986;;5952:45;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5942:56;;;;;;5924:75;;5737:269;;;;;;:::o;2857:235::-;2941:18;2961:20;2983:19;3052:33;:16;3069:6;3052:24;;;;;;;;:::i;:::-;;;;;;;;;1277:3:174;1273:17;;;;1325:3;1321:17;;;1340:18;1317:42;;1399;1386:56;;1077:381;3052:33:163;3018:67;;;;-1:-1:-1;3018:67:163;;-1:-1:-1;2857:235:163;-1:-1:-1;;2857:235:163:o;2136:124::-;3111:19:27;3134:13;;;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:27;;3212:1;3197:12;;;;:16;3179:34;3178:108;;;-1:-1:-1;3258:4:27;1476:19:33;:23;;;3219:66:27;;-1:-1:-1;3268:12:27;;;;;:17;3219:66;3157:201;;;;;;;10469:2:357;3157:201:27;;;10451:21:357;10508:2;10488:18;;;10481:30;10547:34;10527:18;;;10520:62;10618:16;10598:18;;;10591:44;10652:19;;3157:201:27;10267:410:357;3157:201:27;3368:12;:16;;;;3383:1;3368:16;;;3394:65;;;;3428:13;:20;;;;;;;;3394:65;2201:16:163::1;:14;:16::i;:::-;2227:26;2246:6;2227:18;:26::i;:::-;3483:14:27::0;3479:99;;;3529:5;3513:21;;;;;;3553:14;;-1:-1:-1;10834:36:357;;3553:14:27;;10822:2:357;10807:18;3553:14:27;;;;;;;3479:99;3101:483;2136:124:163;:::o;2321:198:26:-;1334:13;:11;:13::i;:::-;2409:22:::1;::::0;::::1;2401:73;;;::::0;::::1;::::0;;11083:2:357;2401:73:26::1;::::0;::::1;11065:21:357::0;11122:2;11102:18;;;11095:30;11161:34;11141:18;;;11134:62;11232:8;11212:18;;;11205:36;11258:19;;2401:73:26::1;10881:402:357::0;2401:73:26::1;2484:28;2503:8;2484:18;:28::i;:::-;2321:198:::0;:::o;1186:320:33:-;1476:19;;;:23;;;1186:320::o;1599:130:26:-;1513:6;;1662:23;1513:6;929:10:34;1662:23:26;1654:68;;;;;;;11490:2:357;1654:68:26;;;11472:21:357;;;11509:18;;;11502:30;11568:34;11548:18;;;11541:62;11620:18;;1654:68:26;11288:356:357;2673:187:26;2765:6;;;;2781:17;;;;;;;;;;;2813:40;;2765:6;;;2781:17;2765:6;;2813:40;;2746:16;;2813:40;2736:124;2673:187;:::o;19667:152:99:-;19743:16;19782:30;19788:1;19791:14;19807:4;19782:5;:30::i;1003:95:26:-;4910:13:27;;;;;;;4902:69;;;;;;;11851:2:357;4902:69:27;;;11833:21:357;11890:2;11870:18;;;11863:30;11929:34;11909:18;;;11902:62;12000:13;11980:18;;;11973:41;12031:19;;4902:69:27;11649:407:357;4902:69:27;1065:26:26::1;:24;:26::i;19918:11162:99:-:0;20025:16;20200:4;20194;20190:15;20184:22;20251:4;20245;20241:15;20235:22;20302:4;20296;20292:15;20286:22;20345:4;20339:11;20399:10;20392:4;20386;20382:15;20378:32;20444:7;20438:14;20582:1;20570:10;20566:18;29569:28;29563:4;29556:42;29674:14;29667:4;29661;29657:15;29650:39;29877:52;29863:11;29857:4;29853:22;29850:80;29827:4;29821;29817:15;29793:151;30048:66;30041:4;30035;30031:15;30007:121;30449:40;30441:4;30428:11;30424:22;30418:4;30414:33;30411:79;30384:6;30371:11;30368:23;30362:4;30358:34;30352:4;30348:45;30141:363;30543:11;30537:4;30533:22;30524:7;30517:39;30630:4;30617:11;30613:22;30606:4;30600;30596:15;30589:5;30582:54;30570:66;;;30659:8;30649:136;;30700:10;30694:4;30687:24;30766:4;30760;30753:18;30649:136;30865:24;;30902;;30946:15;;;30939:33;30992:15;;;30985:33;31038:15;;;;31031:33;;;;19918:11162;;-1:-1:-1;;19918:11162:99:o;1104:111:26:-;4910:13:27;;;;;;;4902:69;;;;;;;11851:2:357;4902:69:27;;;11833:21:357;11890:2;11870:18;;;11863:30;11929:34;11909:18;;;11902:62;12000:13;11980:18;;;11973:41;12031:19;;4902:69:27;11649:407:357;4902:69:27;1176:32:26::1;929:10:34::0;1176:18:26::1;:32::i;14:186:357:-:0;104:20;;164:10;153:22;;143:33;;133:61;;190:1;187;180:12;133:61;14:186;;;:::o;205:168::-;305:42;298:5;294:54;287:5;284:65;274:93;;363:1;360;353:12;378:411;500:6;508;561:2;549:9;540:7;536:23;532:32;529:52;;;577:1;574;567:12;529:52;600:51;641:9;600:51;:::i;:::-;590:61;;701:2;690:9;686:18;673:32;714:45;753:5;714:45;:::i;:::-;778:5;768:15;;;378:411;;;;;:::o;794:239::-;884:6;937:2;925:9;916:7;912:23;908:32;905:52;;;953:1;950;943:12;905:52;976:51;1017:9;976:51;:::i;1292:307::-;1391:6;1399;1452:2;1440:9;1431:7;1427:23;1423:32;1420:52;;;1468:1;1465;1458:12;1420:52;1491:51;1532:9;1491:51;:::i;:::-;1481:61;1589:2;1574:18;;;;1561:32;;-1:-1:-1;;;1292:307:357:o;1604:375::-;1712:6;1720;1728;1781:2;1769:9;1760:7;1756:23;1752:32;1749:52;;;1797:1;1794;1787:12;1749:52;1820:51;1861:9;1820:51;:::i;:::-;1810:61;1918:2;1903:18;;1890:32;;-1:-1:-1;1969:2:357;1954:18;;;1941:32;;1604:375;-1:-1:-1;;;1604:375:357:o;1984:258::-;2056:1;2066:113;2080:6;2077:1;2074:13;2066:113;;;2156:11;;;2150:18;2137:11;;;2130:39;2102:2;2095:10;2066:113;;;2197:6;2194:1;2191:13;2188:48;;;2232:1;2223:6;2218:3;2214:16;2207:27;2188:48;;1984:258;;;:::o;2247:316::-;2288:3;2326:5;2320:12;2353:6;2348:3;2341:19;2369:63;2425:6;2418:4;2413:3;2409:14;2402:4;2395:5;2391:16;2369:63;:::i;:::-;2477:2;2465:15;2482:66;2461:88;2452:98;;;;2552:4;2448:109;;2247:316;-1:-1:-1;;2247:316:357:o;2568:1381::-;2782:4;2811:2;2851;2840:9;2836:18;2881:2;2870:9;2863:21;2904:6;2939;2933:13;2970:6;2962;2955:22;2996:2;2986:12;;3029:2;3018:9;3014:18;3007:25;;3091:2;3081:6;3078:1;3074:14;3063:9;3059:30;3055:39;3129:2;3121:6;3117:15;3150:1;3160:760;3174:6;3171:1;3168:13;3160:760;;;3239:22;;;3263:66;3235:95;3223:108;;3354:13;;3422:9;;3407:25;;3475:11;;;3469:18;3452:15;;;3445:43;3535:11;;;3529:18;3549;3525:43;3508:15;;;3501:68;3592:4;3639:11;;;3633:18;3616:15;;;3609:43;3675:4;3718:11;;;3712:18;3390:4;3750:15;;;3743:27;;;3712:18;3793:47;3824:15;;;3712:18;3793:47;:::i;:::-;3898:12;;;;3783:57;-1:-1:-1;;;3863:15:357;;;;3196:1;3189:9;3160:760;;;-1:-1:-1;3937:6:357;;2568:1381;-1:-1:-1;;;;;;;;2568:1381:357:o;4136:219::-;4285:2;4274:9;4267:21;4248:4;4305:44;4345:2;4334:9;4330:18;4322:6;4305:44;:::i;4360:814::-;4507:6;4515;4523;4531;4584:2;4572:9;4563:7;4559:23;4555:32;4552:52;;;4600:1;4597;4590:12;4552:52;4623:51;4664:9;4623:51;:::i;:::-;4613:61;;4721:2;4710:9;4706:18;4693:32;4683:42;;4776:2;4765:9;4761:18;4748:32;4799:18;4840:2;4832:6;4829:14;4826:34;;;4856:1;4853;4846:12;4826:34;4894:6;4883:9;4879:22;4869:32;;4939:7;4932:4;4928:2;4924:13;4920:27;4910:55;;4961:1;4958;4951:12;4910:55;5001:2;4988:16;5027:2;5019:6;5016:14;5013:34;;;5043:1;5040;5033:12;5013:34;5088:7;5083:2;5074:6;5070:2;5066:15;5062:24;5059:37;5056:57;;;5109:1;5106;5099:12;5056:57;4360:814;;;;-1:-1:-1;;5140:2:357;5132:11;;-1:-1:-1;;;4360:814:357:o;6000:180::-;6059:6;6112:2;6100:9;6091:7;6087:23;6083:32;6080:52;;;6128:1;6125;6118:12;6080:52;-1:-1:-1;6151:23:357;;6000:180;-1:-1:-1;6000:180:357:o;6684:261::-;6743:6;6796:2;6784:9;6775:7;6771:23;6767:32;6764:52;;;6812:1;6809;6802:12;6764:52;6851:9;6838:23;6870:45;6909:5;6870:45;:::i;6950:184::-;7002:77;6999:1;6992:88;7099:4;7096:1;7089:15;7123:4;7120:1;7113:15;7139:184;7191:77;7188:1;7181:88;7288:4;7285:1;7278:15;7312:4;7309:1;7302:15;7328:942;7407:6;7460:2;7448:9;7439:7;7435:23;7431:32;7428:52;;;7476:1;7473;7466:12;7428:52;7509:9;7503:16;7538:18;7579:2;7571:6;7568:14;7565:34;;;7595:1;7592;7585:12;7565:34;7633:6;7622:9;7618:22;7608:32;;7678:7;7671:4;7667:2;7663:13;7659:27;7649:55;;7700:1;7697;7690:12;7649:55;7729:2;7723:9;7751:2;7747;7744:10;7741:36;;;7757:18;;:::i;:::-;7891:2;7885:9;7953:4;7945:13;;7796:66;7941:22;;;7965:2;7937:31;7933:40;7921:53;;;7989:18;;;8009:22;;;7986:46;7983:72;;;8035:18;;:::i;:::-;8075:10;8071:2;8064:22;8110:2;8102:6;8095:18;8150:7;8145:2;8140;8136;8132:11;8128:20;8125:33;8122:53;;;8171:1;8168;8161:12;8122:53;8184:55;8236:2;8231;8223:6;8219:15;8214:2;8210;8206:11;8184:55;:::i;:::-;8258:6;7328:942;-1:-1:-1;;;;;;;7328:942:357:o;8275:212::-;8373:6;8426:2;8414:9;8405:7;8401:23;8397:32;8394:52;;;8442:1;8439;8432:12;8394:52;-1:-1:-1;8465:16:357;;8275:212;-1:-1:-1;8275:212:357:o;8492:279::-;8532:4;8560:1;8557;8554:8;8551:188;;;8595:77;8592:1;8585:88;8696:4;8693:1;8686:15;8724:4;8721:1;8714:15;8551:188;-1:-1:-1;8756:9:357;;8492:279::o;9005:585::-;9307:66;9298:6;9294:2;9290:15;9286:88;9281:3;9274:101;9405:6;9400:2;9395:3;9391:12;9384:28;9442:6;9437:2;9432:3;9428:12;9421:28;9493:6;9485;9480:2;9475:3;9471:12;9458:42;9256:3;9523:16;;9541:2;9519:25;9553:13;;;9519:25;9005:585;-1:-1:-1;;;;9005:585:357:o;9595:667::-;9878:10;9870:6;9866:23;9855:9;9848:42;9926:6;9921:2;9910:9;9906:18;9899:34;9969:2;9964;9953:9;9949:18;9942:30;10008:6;10003:2;9992:9;9988:18;9981:34;10066:6;10058;10052:3;10041:9;10037:19;10024:49;10123:1;10093:22;;;10117:3;10089:32;;;10082:43;;;;10177:2;10165:15;;;10182:66;10161:88;10146:104;10142:114;;9595:667;-1:-1:-1;;;9595:667:357:o","linkReferences":{}},"methodIdentifiers":{"create(uint32,bytes32,bytes)":"82ecf2f6","findLatestGames(uint32,uint256,uint256)":"254bd683","gameAtIndex(uint256)":"bb8aa1fc","gameCount()":"4d1975b4","gameImpls(uint32)":"1b685b9e","games(uint32,bytes32,bytes)":"5f0150cb","getGameUUID(uint32,bytes32,bytes)":"96cd9720","initBonds(uint32)":"6593dc6e","initialize(address)":"c4d66de8","owner()":"8da5cb5b","renounceOwnership()":"715018a6","setImplementation(uint32,address)":"14f6b1a3","setInitBond(uint32,uint256)":"1e334240","transferOwnership(address)":"f2fde38b","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"Hash\",\"name\":\"uuid\",\"type\":\"bytes32\"}],\"name\":\"GameAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectBondAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType\",\"type\":\"uint32\"}],\"name\":\"NoImplementation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"disputeProxy\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"GameType\",\"name\":\"gameType\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"Claim\",\"name\":\"rootClaim\",\"type\":\"bytes32\"}],\"name\":\"DisputeGameCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"impl\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"GameType\",\"name\":\"gameType\",\"type\":\"uint32\"}],\"name\":\"ImplementationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"GameType\",\"name\":\"gameType\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newBond\",\"type\":\"uint256\"}],\"name\":\"InitBondUpdated\",\"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\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint32\"},{\"internalType\":\"Claim\",\"name\":\"_rootClaim\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract IDisputeGame\",\"name\":\"proxy_\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_start\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_n\",\"type\":\"uint256\"}],\"name\":\"findLatestGames\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"GameId\",\"name\":\"metadata\",\"type\":\"bytes32\"},{\"internalType\":\"Timestamp\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"Claim\",\"name\":\"rootClaim\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct IDisputeGameFactory.GameSearchResult[]\",\"name\":\"games_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"gameAtIndex\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType_\",\"type\":\"uint32\"},{\"internalType\":\"Timestamp\",\"name\":\"timestamp_\",\"type\":\"uint64\"},{\"internalType\":\"contract IDisputeGame\",\"name\":\"proxy_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"gameCount_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"gameImpls\",\"outputs\":[{\"internalType\":\"contract IDisputeGame\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint32\"},{\"internalType\":\"Claim\",\"name\":\"_rootClaim\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"games\",\"outputs\":[{\"internalType\":\"contract IDisputeGame\",\"name\":\"proxy_\",\"type\":\"address\"},{\"internalType\":\"Timestamp\",\"name\":\"timestamp_\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint32\"},{\"internalType\":\"Claim\",\"name\":\"_rootClaim\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"getGameUUID\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"uuid_\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"initBonds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint32\"},{\"internalType\":\"contract IDisputeGame\",\"name\":\"_impl\",\"type\":\"address\"}],\"name\":\"setImplementation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_initBond\",\"type\":\"uint256\"}],\"name\":\"setInitBond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"GameAlreadyExists(bytes32)\":[{\"params\":{\"uuid\":\"The UUID of the dispute game that already exists.\"}}],\"NoImplementation(uint32)\":[{\"params\":{\"gameType\":\"The unsupported game type.\"}}]},\"kind\":\"dev\",\"methods\":{\"create(uint32,bytes32,bytes)\":{\"params\":{\"_extraData\":\"Any extra data that should be provided to the created dispute game.\",\"_gameType\":\"The type of the DisputeGame - used to decide the proxy implementation.\",\"_rootClaim\":\"The root claim of the DisputeGame.\"},\"returns\":{\"proxy_\":\"The address of the created DisputeGame proxy.\"}},\"findLatestGames(uint32,uint256,uint256)\":{\"params\":{\"_gameType\":\"The type of game to find.\",\"_n\":\"The number of games to find.\",\"_start\":\"The index to start the reverse search from.\"}},\"gameAtIndex(uint256)\":{\"params\":{\"_index\":\"The index of the dispute game.\"},\"returns\":{\"gameType_\":\"The type of the DisputeGame - used to decide the proxy implementation.\",\"proxy_\":\"The clone of the `DisputeGame` created with the given parameters. Returns `address(0)` if nonexistent.\",\"timestamp_\":\"The timestamp of the creation of the dispute game.\"}},\"gameCount()\":{\"returns\":{\"gameCount_\":\"The total number of dispute games created by this factory.\"}},\"games(uint32,bytes32,bytes)\":{\"details\":\"`++` equates to concatenation.\",\"params\":{\"_extraData\":\"Any extra data that should be provided to the created dispute game.\",\"_gameType\":\"The type of the DisputeGame - used to decide the proxy implementation\",\"_rootClaim\":\"The root claim of the DisputeGame.\"},\"returns\":{\"proxy_\":\"The clone of the `DisputeGame` created with the given parameters. Returns `address(0)` if nonexistent.\",\"timestamp_\":\"The timestamp of the creation of the dispute game.\"}},\"getGameUUID(uint32,bytes32,bytes)\":{\"details\":\"Hashes the concatenation of `gameType . rootClaim . extraData` without expanding memory.\",\"params\":{\"_extraData\":\"Any extra data that should be provided to the created dispute game.\",\"_gameType\":\"The type of the DisputeGame.\",\"_rootClaim\":\"The root claim of the DisputeGame.\"},\"returns\":{\"uuid_\":\"The unique identifier for the given dispute game parameters.\"}},\"initialize(address)\":{\"params\":{\"_owner\":\"The owner of the contract.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setImplementation(uint32,address)\":{\"details\":\"May only be called by the `owner`.\",\"params\":{\"_gameType\":\"The type of the DisputeGame.\",\"_impl\":\"The implementation contract for the given `GameType`.\"}},\"setInitBond(uint32,uint256)\":{\"details\":\"May only be called by the `owner`.\",\"params\":{\"_gameType\":\"The type of the DisputeGame.\",\"_initBond\":\"The bond (in wei) for initializing a game type.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"stateVariables\":{\"gameImpls\":{\"params\":{\"_gameType\":\"The type of the dispute game.\"},\"return\":\"The address of the implementation of the game type. Will be cloned on creation of a new dispute game with the given `gameType`.\",\"returns\":{\"_0\":\"The address of the implementation of the game type. Will be cloned on creation of a new dispute game with the given `gameType`.\"}},\"initBonds\":{\"params\":{\"_gameType\":\"The type of the dispute game.\"},\"return\":\"The required bond for initializing a dispute game of the given type.\",\"returns\":{\"_0\":\"The required bond for initializing a dispute game of the given type.\"}},\"version\":{\"custom:semver\":\"0.6.0\"}},\"title\":\"DisputeGameFactory\",\"version\":1},\"userdoc\":{\"errors\":{\"GameAlreadyExists(bytes32)\":[{\"notice\":\"Thrown when a dispute game that already exists is attempted to be created.\"}],\"IncorrectBondAmount()\":[{\"notice\":\"Thrown when a supplied bond is not equal to the required bond amount to cover the cost of the interaction.\"}],\"NoImplementation(uint32)\":[{\"notice\":\"Thrown when a dispute game is attempted to be created with an unsupported game type.\"}]},\"events\":{\"DisputeGameCreated(address,uint32,bytes32)\":{\"notice\":\"Emitted when a new dispute game is created\"},\"ImplementationSet(address,uint32)\":{\"notice\":\"Emitted when a new game implementation added to the factory\"},\"InitBondUpdated(uint32,uint256)\":{\"notice\":\"Emitted when a game type's initialization bond is updated\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Constructs a new DisputeGameFactory contract.\"},\"create(uint32,bytes32,bytes)\":{\"notice\":\"Creates a new DisputeGame proxy contract.\"},\"findLatestGames(uint32,uint256,uint256)\":{\"notice\":\"Finds the `_n` most recent `GameId`'s of type `_gameType` starting at `_start`. If there are less than `_n` games of type `_gameType` starting at `_start`, then the returned array will be shorter than `_n`.\"},\"gameAtIndex(uint256)\":{\"notice\":\"`gameAtIndex` returns the dispute game contract address and its creation timestamp at the given index. Each created dispute game increments the underlying index.\"},\"gameCount()\":{\"notice\":\"The total number of dispute games created by this factory.\"},\"gameImpls(uint32)\":{\"notice\":\"`gameImpls` is a mapping that maps `GameType`s to their respective `IDisputeGame` implementations.\"},\"games(uint32,bytes32,bytes)\":{\"notice\":\"`games` queries an internal mapping that maps the hash of `gameType ++ rootClaim ++ extraData` to the deployed `DisputeGame` clone.\"},\"getGameUUID(uint32,bytes32,bytes)\":{\"notice\":\"Returns a unique identifier for the given dispute game parameters.\"},\"initBonds(uint32)\":{\"notice\":\"Returns the required bonds for initializing a dispute game of the given type.\"},\"initialize(address)\":{\"notice\":\"Initializes the contract.\"},\"setImplementation(uint32,address)\":{\"notice\":\"Sets the implementation contract for a specific `GameType`.\"},\"setInitBond(uint32,uint256)\":{\"notice\":\"Sets the bond (in wei) for initializing a game type.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"A factory contract for creating `IDisputeGame` contracts. All created dispute games are stored in both a mapping and an append only array. The timestamp of the creation time of the dispute game is packed tightly into the storage slot with the address of the dispute game to make offchain discoverability of playable dispute games easier.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/dispute/DisputeGameFactory.sol\":\"DisputeGameFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"lib/solady/src/utils/LibClone.sol\":{\"keccak256\":\"0xfd4b40a4584e736d9d0b045fbc748023804c83819f5e018635a9f447834774a4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://202fc57397118355d9d573c28d36ff45892e632a12b143f4bc5e7266bfb7737e\",\"dweb:/ipfs/QmZYD6Va3nNUC4B9NHZcyvFmK59i3WnEPPpsi8N355GivN\"]},\"src/dispute/DisputeGameFactory.sol\":{\"keccak256\":\"0xc7c6b0c2a051d4a14b3833243fa2e93e5e320bb106ef3979ce77098fb9d6629f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cd5cbabb1b0b41f9faf3d2329e519936ea43a1e7da1df6a9be90d2513603b09f\",\"dweb:/ipfs/QmQM5FpgogJQnbmJjdQdoxxMzczx5PBiCNbiRUQiJqHyhM\"]},\"src/dispute/interfaces/IDisputeGame.sol\":{\"keccak256\":\"0xe2611453d5cc05f8aa30dc0e5e15ee5ae29fd3eb55a2c034424250baebf12f9b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://274e00fbcea3b8455bbaa042130bf1f7a5b2b769f28ad57afbf9fabfd74a757a\",\"dweb:/ipfs/QmRKQTfYdMjQYVbuZhdXts1d752eUq8RwrjqqwV5XRYLi6\"]},\"src/dispute/interfaces/IDisputeGameFactory.sol\":{\"keccak256\":\"0x204d89d38d4dc0db40fbf898d95e639ac5608810a5a5506a3d80d71177648bda\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://71e5c0ff04f409f30ca4f8ebfae1592c6ca495e315b059f969d11812e6e84dbd\",\"dweb:/ipfs/QmaNKkhkJv7qHzX6bKB3LjpWBupfMPLhoATUGx1HRTLtXh\"]},\"src/dispute/interfaces/IInitializable.sol\":{\"keccak256\":\"0xbc553af6501a972850a98fc6284943f8e95a5183a7b4f64198c16fca2338c9dc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1f1c422ce4a9e72f0bbdec36434206da4af3a32d38f922acab957942e994ce5\",\"dweb:/ipfs/QmNQGWBceLxx1CKSMLfwTM584q8UCgUpF4rrFe8pdbWYtj\"]},\"src/dispute/lib/LibGameId.sol\":{\"keccak256\":\"0x9a9f30500da6eb7eeaa7193515dc5e45dc479f09ae7d522a07283c0fb5f4bfa6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be113d8198d5822385de3d6ff3d7b3e8241993484aa95604ffaf38c2d33f40e0\",\"dweb:/ipfs/QmY9mHC52fqc4gAFYCGobNyuP4TqugQgs8o1kTF33t17Hc\"]},\"src/dispute/lib/LibHashing.sol\":{\"keccak256\":\"0x5a072cd028094eee55acb84ed8d08d7422b1fb46658b7e043e916781530a383b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b67e54f1318f1fd67b28b16c6861a56e27217c26a12aaea5c446e2ec53143920\",\"dweb:/ipfs/QmVLSTP3PwXzRkR3A4qV9fjZhca9v8J1EnEYuVGUsSirAq\"]},\"src/dispute/lib/LibPosition.sol\":{\"keccak256\":\"0xf7ceb26f0ac7067ff8a43f263451050eef6fba2029eafb83d3cbe35224d894a6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3bb403b0d707a8e2e3780a19185b918bfe907ca2d1b939ea74ae095a5cdf3b48\",\"dweb:/ipfs/QmYFzkmF8TRomp1cBEbTsKxiEnqLnX6SvSh4y3rVa84pBR\"]},\"src/dispute/lib/LibUDT.sol\":{\"keccak256\":\"0x9b61b15f5edfac1e6528aec79c1be6ac712d5f6a62140db87ed749e41a46563f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://24ef4ecee91638e278886888192b7d2b1811ab99f4e90a06817a4b2651720046\",\"dweb:/ipfs/QmdisoBv1mE9jDv6jvpcbvKhdmJZMMjQmATrEYfBQQrXtZ\"]},\"src/libraries/DisputeErrors.sol\":{\"keccak256\":\"0x869bec0d79d97f2d0a00b1e70bf1e6955a2be585521e0084602e54455c0a6937\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a235c6349437cd2ade72909287404e2993c1c4bd356707299239c71fa3bf780e\",\"dweb:/ipfs/QmcFSh6PWJ5sNg1CeoRyF9EnV8APWDz1kYP98v6ooGxc71\"]},\"src/libraries/DisputeTypes.sol\":{\"keccak256\":\"0xae3d053cf40b3e47669b89438524fec4eb571a78be296cc7e7ba23025b3bdf0c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a2b90604718ad29d19a8f21d45a5f8c6188320781fdb7102b3fccadae549961\",\"dweb:/ipfs/QmUBTXgRFG7PvoCBJsXmgi2sZPZFPQQZTptQ91LL7tC2xQ\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"Hash","name":"uuid","type":"bytes32"}],"type":"error","name":"GameAlreadyExists"},{"inputs":[],"type":"error","name":"IncorrectBondAmount"},{"inputs":[{"internalType":"GameType","name":"gameType","type":"uint32"}],"type":"error","name":"NoImplementation"},{"inputs":[{"internalType":"address","name":"disputeProxy","type":"address","indexed":true},{"internalType":"GameType","name":"gameType","type":"uint32","indexed":true},{"internalType":"Claim","name":"rootClaim","type":"bytes32","indexed":true}],"type":"event","name":"DisputeGameCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"impl","type":"address","indexed":true},{"internalType":"GameType","name":"gameType","type":"uint32","indexed":true}],"type":"event","name":"ImplementationSet","anonymous":false},{"inputs":[{"internalType":"GameType","name":"gameType","type":"uint32","indexed":true},{"internalType":"uint256","name":"newBond","type":"uint256","indexed":true}],"type":"event","name":"InitBondUpdated","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":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"GameType","name":"_gameType","type":"uint32"},{"internalType":"Claim","name":"_rootClaim","type":"bytes32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"create","outputs":[{"internalType":"contract IDisputeGame","name":"proxy_","type":"address"}]},{"inputs":[{"internalType":"GameType","name":"_gameType","type":"uint32"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_n","type":"uint256"}],"stateMutability":"view","type":"function","name":"findLatestGames","outputs":[{"internalType":"struct IDisputeGameFactory.GameSearchResult[]","name":"games_","type":"tuple[]","components":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"GameId","name":"metadata","type":"bytes32"},{"internalType":"Timestamp","name":"timestamp","type":"uint64"},{"internalType":"Claim","name":"rootClaim","type":"bytes32"},{"internalType":"bytes","name":"extraData","type":"bytes"}]}]},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"stateMutability":"view","type":"function","name":"gameAtIndex","outputs":[{"internalType":"GameType","name":"gameType_","type":"uint32"},{"internalType":"Timestamp","name":"timestamp_","type":"uint64"},{"internalType":"contract IDisputeGame","name":"proxy_","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"gameCount","outputs":[{"internalType":"uint256","name":"gameCount_","type":"uint256"}]},{"inputs":[{"internalType":"GameType","name":"","type":"uint32"}],"stateMutability":"view","type":"function","name":"gameImpls","outputs":[{"internalType":"contract IDisputeGame","name":"","type":"address"}]},{"inputs":[{"internalType":"GameType","name":"_gameType","type":"uint32"},{"internalType":"Claim","name":"_rootClaim","type":"bytes32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"view","type":"function","name":"games","outputs":[{"internalType":"contract IDisputeGame","name":"proxy_","type":"address"},{"internalType":"Timestamp","name":"timestamp_","type":"uint64"}]},{"inputs":[{"internalType":"GameType","name":"_gameType","type":"uint32"},{"internalType":"Claim","name":"_rootClaim","type":"bytes32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"pure","type":"function","name":"getGameUUID","outputs":[{"internalType":"Hash","name":"uuid_","type":"bytes32"}]},{"inputs":[{"internalType":"GameType","name":"","type":"uint32"}],"stateMutability":"view","type":"function","name":"initBonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"GameType","name":"_gameType","type":"uint32"},{"internalType":"contract IDisputeGame","name":"_impl","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setImplementation"},{"inputs":[{"internalType":"GameType","name":"_gameType","type":"uint32"},{"internalType":"uint256","name":"_initBond","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setInitBond"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"create(uint32,bytes32,bytes)":{"params":{"_extraData":"Any extra data that should be provided to the created dispute game.","_gameType":"The type of the DisputeGame - used to decide the proxy implementation.","_rootClaim":"The root claim of the DisputeGame."},"returns":{"proxy_":"The address of the created DisputeGame proxy."}},"findLatestGames(uint32,uint256,uint256)":{"params":{"_gameType":"The type of game to find.","_n":"The number of games to find.","_start":"The index to start the reverse search from."}},"gameAtIndex(uint256)":{"params":{"_index":"The index of the dispute game."},"returns":{"gameType_":"The type of the DisputeGame - used to decide the proxy implementation.","proxy_":"The clone of the `DisputeGame` created with the given parameters. Returns `address(0)` if nonexistent.","timestamp_":"The timestamp of the creation of the dispute game."}},"gameCount()":{"returns":{"gameCount_":"The total number of dispute games created by this factory."}},"games(uint32,bytes32,bytes)":{"details":"`++` equates to concatenation.","params":{"_extraData":"Any extra data that should be provided to the created dispute game.","_gameType":"The type of the DisputeGame - used to decide the proxy implementation","_rootClaim":"The root claim of the DisputeGame."},"returns":{"proxy_":"The clone of the `DisputeGame` created with the given parameters. Returns `address(0)` if nonexistent.","timestamp_":"The timestamp of the creation of the dispute game."}},"getGameUUID(uint32,bytes32,bytes)":{"details":"Hashes the concatenation of `gameType . rootClaim . extraData` without expanding memory.","params":{"_extraData":"Any extra data that should be provided to the created dispute game.","_gameType":"The type of the DisputeGame.","_rootClaim":"The root claim of the DisputeGame."},"returns":{"uuid_":"The unique identifier for the given dispute game parameters."}},"initialize(address)":{"params":{"_owner":"The owner of the contract."}},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"setImplementation(uint32,address)":{"details":"May only be called by the `owner`.","params":{"_gameType":"The type of the DisputeGame.","_impl":"The implementation contract for the given `GameType`."}},"setInitBond(uint32,uint256)":{"details":"May only be called by the `owner`.","params":{"_gameType":"The type of the DisputeGame.","_initBond":"The bond (in wei) for initializing a game type."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{"constructor":{"notice":"Constructs a new DisputeGameFactory contract."},"create(uint32,bytes32,bytes)":{"notice":"Creates a new DisputeGame proxy contract."},"findLatestGames(uint32,uint256,uint256)":{"notice":"Finds the `_n` most recent `GameId`'s of type `_gameType` starting at `_start`. If there are less than `_n` games of type `_gameType` starting at `_start`, then the returned array will be shorter than `_n`."},"gameAtIndex(uint256)":{"notice":"`gameAtIndex` returns the dispute game contract address and its creation timestamp at the given index. Each created dispute game increments the underlying index."},"gameCount()":{"notice":"The total number of dispute games created by this factory."},"gameImpls(uint32)":{"notice":"`gameImpls` is a mapping that maps `GameType`s to their respective `IDisputeGame` implementations."},"games(uint32,bytes32,bytes)":{"notice":"`games` queries an internal mapping that maps the hash of `gameType ++ rootClaim ++ extraData` to the deployed `DisputeGame` clone."},"getGameUUID(uint32,bytes32,bytes)":{"notice":"Returns a unique identifier for the given dispute game parameters."},"initBonds(uint32)":{"notice":"Returns the required bonds for initializing a dispute game of the given type."},"initialize(address)":{"notice":"Initializes the contract."},"setImplementation(uint32,address)":{"notice":"Sets the implementation contract for a specific `GameType`."},"setInitBond(uint32,uint256)":{"notice":"Sets the bond (in wei) for initializing a game type."},"version()":{"notice":"Semantic version."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/dispute/DisputeGameFactory.sol":"DisputeGameFactory"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888","urls":["bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a","dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149","urls":["bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c","dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"],"license":"MIT"},"lib/solady/src/utils/LibClone.sol":{"keccak256":"0xfd4b40a4584e736d9d0b045fbc748023804c83819f5e018635a9f447834774a4","urls":["bzz-raw://202fc57397118355d9d573c28d36ff45892e632a12b143f4bc5e7266bfb7737e","dweb:/ipfs/QmZYD6Va3nNUC4B9NHZcyvFmK59i3WnEPPpsi8N355GivN"],"license":"MIT"},"src/dispute/DisputeGameFactory.sol":{"keccak256":"0xc7c6b0c2a051d4a14b3833243fa2e93e5e320bb106ef3979ce77098fb9d6629f","urls":["bzz-raw://cd5cbabb1b0b41f9faf3d2329e519936ea43a1e7da1df6a9be90d2513603b09f","dweb:/ipfs/QmQM5FpgogJQnbmJjdQdoxxMzczx5PBiCNbiRUQiJqHyhM"],"license":"MIT"},"src/dispute/interfaces/IDisputeGame.sol":{"keccak256":"0xe2611453d5cc05f8aa30dc0e5e15ee5ae29fd3eb55a2c034424250baebf12f9b","urls":["bzz-raw://274e00fbcea3b8455bbaa042130bf1f7a5b2b769f28ad57afbf9fabfd74a757a","dweb:/ipfs/QmRKQTfYdMjQYVbuZhdXts1d752eUq8RwrjqqwV5XRYLi6"],"license":"MIT"},"src/dispute/interfaces/IDisputeGameFactory.sol":{"keccak256":"0x204d89d38d4dc0db40fbf898d95e639ac5608810a5a5506a3d80d71177648bda","urls":["bzz-raw://71e5c0ff04f409f30ca4f8ebfae1592c6ca495e315b059f969d11812e6e84dbd","dweb:/ipfs/QmaNKkhkJv7qHzX6bKB3LjpWBupfMPLhoATUGx1HRTLtXh"],"license":"MIT"},"src/dispute/interfaces/IInitializable.sol":{"keccak256":"0xbc553af6501a972850a98fc6284943f8e95a5183a7b4f64198c16fca2338c9dc","urls":["bzz-raw://b1f1c422ce4a9e72f0bbdec36434206da4af3a32d38f922acab957942e994ce5","dweb:/ipfs/QmNQGWBceLxx1CKSMLfwTM584q8UCgUpF4rrFe8pdbWYtj"],"license":"MIT"},"src/dispute/lib/LibGameId.sol":{"keccak256":"0x9a9f30500da6eb7eeaa7193515dc5e45dc479f09ae7d522a07283c0fb5f4bfa6","urls":["bzz-raw://be113d8198d5822385de3d6ff3d7b3e8241993484aa95604ffaf38c2d33f40e0","dweb:/ipfs/QmY9mHC52fqc4gAFYCGobNyuP4TqugQgs8o1kTF33t17Hc"],"license":"MIT"},"src/dispute/lib/LibHashing.sol":{"keccak256":"0x5a072cd028094eee55acb84ed8d08d7422b1fb46658b7e043e916781530a383b","urls":["bzz-raw://b67e54f1318f1fd67b28b16c6861a56e27217c26a12aaea5c446e2ec53143920","dweb:/ipfs/QmVLSTP3PwXzRkR3A4qV9fjZhca9v8J1EnEYuVGUsSirAq"],"license":"MIT"},"src/dispute/lib/LibPosition.sol":{"keccak256":"0xf7ceb26f0ac7067ff8a43f263451050eef6fba2029eafb83d3cbe35224d894a6","urls":["bzz-raw://3bb403b0d707a8e2e3780a19185b918bfe907ca2d1b939ea74ae095a5cdf3b48","dweb:/ipfs/QmYFzkmF8TRomp1cBEbTsKxiEnqLnX6SvSh4y3rVa84pBR"],"license":"MIT"},"src/dispute/lib/LibUDT.sol":{"keccak256":"0x9b61b15f5edfac1e6528aec79c1be6ac712d5f6a62140db87ed749e41a46563f","urls":["bzz-raw://24ef4ecee91638e278886888192b7d2b1811ab99f4e90a06817a4b2651720046","dweb:/ipfs/QmdisoBv1mE9jDv6jvpcbvKhdmJZMMjQmATrEYfBQQrXtZ"],"license":"MIT"},"src/libraries/DisputeErrors.sol":{"keccak256":"0x869bec0d79d97f2d0a00b1e70bf1e6955a2be585521e0084602e54455c0a6937","urls":["bzz-raw://a235c6349437cd2ade72909287404e2993c1c4bd356707299239c71fa3bf780e","dweb:/ipfs/QmcFSh6PWJ5sNg1CeoRyF9EnV8APWDz1kYP98v6ooGxc71"],"license":"MIT"},"src/libraries/DisputeTypes.sol":{"keccak256":"0xae3d053cf40b3e47669b89438524fec4eb571a78be296cc7e7ba23025b3bdf0c","urls":["bzz-raw://4a2b90604718ad29d19a8f21d45a5f8c6188320781fdb7102b3fccadae549961","dweb:/ipfs/QmUBTXgRFG7PvoCBJsXmgi2sZPZFPQQZTptQ91LL7tC2xQ"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":46970,"contract":"src/dispute/DisputeGameFactory.sol:DisputeGameFactory","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":46973,"contract":"src/dispute/DisputeGameFactory.sol:DisputeGameFactory","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":48501,"contract":"src/dispute/DisputeGameFactory.sol:DisputeGameFactory","label":"__gap","offset":0,"slot":"1","type":"t_array(t_uint256)50_storage"},{"astId":46842,"contract":"src/dispute/DisputeGameFactory.sol:DisputeGameFactory","label":"_owner","offset":0,"slot":"51","type":"t_address"},{"astId":46962,"contract":"src/dispute/DisputeGameFactory.sol:DisputeGameFactory","label":"__gap","offset":0,"slot":"52","type":"t_array(t_uint256)49_storage"},{"astId":97221,"contract":"src/dispute/DisputeGameFactory.sol:DisputeGameFactory","label":"gameImpls","offset":0,"slot":"101","type":"t_mapping(t_userDefinedValueType(GameType)103271,t_contract(IDisputeGame)100327)"},{"astId":97227,"contract":"src/dispute/DisputeGameFactory.sol:DisputeGameFactory","label":"initBonds","offset":0,"slot":"102","type":"t_mapping(t_userDefinedValueType(GameType)103271,t_uint256)"},{"astId":97234,"contract":"src/dispute/DisputeGameFactory.sol:DisputeGameFactory","label":"_disputeGames","offset":0,"slot":"103","type":"t_mapping(t_userDefinedValueType(Hash)103253,t_userDefinedValueType(GameId)103265)"},{"astId":97239,"contract":"src/dispute/DisputeGameFactory.sol:DisputeGameFactory","label":"_disputeGameList","offset":0,"slot":"104","type":"t_array(t_userDefinedValueType(GameId)103265)dyn_storage"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_uint256)49_storage":{"encoding":"inplace","label":"uint256[49]","numberOfBytes":"1568","base":"t_uint256"},"t_array(t_uint256)50_storage":{"encoding":"inplace","label":"uint256[50]","numberOfBytes":"1600","base":"t_uint256"},"t_array(t_userDefinedValueType(GameId)103265)dyn_storage":{"encoding":"dynamic_array","label":"GameId[]","numberOfBytes":"32","base":"t_userDefinedValueType(GameId)103265"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_contract(IDisputeGame)100327":{"encoding":"inplace","label":"contract IDisputeGame","numberOfBytes":"20"},"t_mapping(t_userDefinedValueType(GameType)103271,t_contract(IDisputeGame)100327)":{"encoding":"mapping","key":"t_userDefinedValueType(GameType)103271","label":"mapping(GameType => contract IDisputeGame)","numberOfBytes":"32","value":"t_contract(IDisputeGame)100327"},"t_mapping(t_userDefinedValueType(GameType)103271,t_uint256)":{"encoding":"mapping","key":"t_userDefinedValueType(GameType)103271","label":"mapping(GameType => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_userDefinedValueType(Hash)103253,t_userDefinedValueType(GameId)103265)":{"encoding":"mapping","key":"t_userDefinedValueType(Hash)103253","label":"mapping(Hash => GameId)","numberOfBytes":"32","value":"t_userDefinedValueType(GameId)103265"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"},"t_userDefinedValueType(GameId)103265":{"encoding":"inplace","label":"GameId","numberOfBytes":"32"},"t_userDefinedValueType(GameType)103271":{"encoding":"inplace","label":"GameType","numberOfBytes":"4"},"t_userDefinedValueType(Hash)103253":{"encoding":"inplace","label":"Hash","numberOfBytes":"32"}}},"userdoc":{"version":1,"kind":"user","methods":{"constructor":{"notice":"Constructs a new DisputeGameFactory contract."},"create(uint32,bytes32,bytes)":{"notice":"Creates a new DisputeGame proxy contract."},"findLatestGames(uint32,uint256,uint256)":{"notice":"Finds the `_n` most recent `GameId`'s of type `_gameType` starting at `_start`. If there are less than `_n` games of type `_gameType` starting at `_start`, then the returned array will be shorter than `_n`."},"gameAtIndex(uint256)":{"notice":"`gameAtIndex` returns the dispute game contract address and its creation timestamp at the given index. Each created dispute game increments the underlying index."},"gameCount()":{"notice":"The total number of dispute games created by this factory."},"gameImpls(uint32)":{"notice":"`gameImpls` is a mapping that maps `GameType`s to their respective `IDisputeGame` implementations."},"games(uint32,bytes32,bytes)":{"notice":"`games` queries an internal mapping that maps the hash of `gameType ++ rootClaim ++ extraData` to the deployed `DisputeGame` clone."},"getGameUUID(uint32,bytes32,bytes)":{"notice":"Returns a unique identifier for the given dispute game parameters."},"initBonds(uint32)":{"notice":"Returns the required bonds for initializing a dispute game of the given type."},"initialize(address)":{"notice":"Initializes the contract."},"setImplementation(uint32,address)":{"notice":"Sets the implementation contract for a specific `GameType`."},"setInitBond(uint32,uint256)":{"notice":"Sets the bond (in wei) for initializing a game type."},"version()":{"notice":"Semantic version."}},"events":{"DisputeGameCreated(address,uint32,bytes32)":{"notice":"Emitted when a new dispute game is created"},"ImplementationSet(address,uint32)":{"notice":"Emitted when a new game implementation added to the factory"},"InitBondUpdated(uint32,uint256)":{"notice":"Emitted when a game type's initialization bond is updated"}},"errors":{"GameAlreadyExists(bytes32)":[{"notice":"Thrown when a dispute game that already exists is attempted to be created."}],"IncorrectBondAmount()":[{"notice":"Thrown when a supplied bond is not equal to the required bond amount to cover the cost of the interaction."}],"NoImplementation(uint32)":[{"notice":"Thrown when a dispute game is attempted to be created with an unsupported game type."}]},"notice":"A factory contract for creating `IDisputeGame` contracts. All created dispute games are stored in both a mapping and an append only array. The timestamp of the creation time of the dispute game is packed tightly into the storage slot with the address of the dispute game to make offchain discoverability of playable dispute games easier."},"devdoc":{"version":1,"kind":"dev","methods":{"create(uint32,bytes32,bytes)":{"params":{"_extraData":"Any extra data that should be provided to the created dispute game.","_gameType":"The type of the DisputeGame - used to decide the proxy implementation.","_rootClaim":"The root claim of the DisputeGame."},"returns":{"proxy_":"The address of the created DisputeGame proxy."}},"findLatestGames(uint32,uint256,uint256)":{"params":{"_gameType":"The type of game to find.","_n":"The number of games to find.","_start":"The index to start the reverse search from."}},"gameAtIndex(uint256)":{"params":{"_index":"The index of the dispute game."},"returns":{"gameType_":"The type of the DisputeGame - used to decide the proxy implementation.","proxy_":"The clone of the `DisputeGame` created with the given parameters. Returns `address(0)` if nonexistent.","timestamp_":"The timestamp of the creation of the dispute game."}},"gameCount()":{"returns":{"gameCount_":"The total number of dispute games created by this factory."}},"games(uint32,bytes32,bytes)":{"details":"`++` equates to concatenation.","params":{"_extraData":"Any extra data that should be provided to the created dispute game.","_gameType":"The type of the DisputeGame - used to decide the proxy implementation","_rootClaim":"The root claim of the DisputeGame."},"returns":{"proxy_":"The clone of the `DisputeGame` created with the given parameters. Returns `address(0)` if nonexistent.","timestamp_":"The timestamp of the creation of the dispute game."}},"getGameUUID(uint32,bytes32,bytes)":{"details":"Hashes the concatenation of `gameType . rootClaim . extraData` without expanding memory.","params":{"_extraData":"Any extra data that should be provided to the created dispute game.","_gameType":"The type of the DisputeGame.","_rootClaim":"The root claim of the DisputeGame."},"returns":{"uuid_":"The unique identifier for the given dispute game parameters."}},"initialize(address)":{"params":{"_owner":"The owner of the contract."}},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"setImplementation(uint32,address)":{"details":"May only be called by the `owner`.","params":{"_gameType":"The type of the DisputeGame.","_impl":"The implementation contract for the given `GameType`."}},"setInitBond(uint32,uint256)":{"details":"May only be called by the `owner`.","params":{"_gameType":"The type of the DisputeGame.","_initBond":"The bond (in wei) for initializing a game type."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"errors":{"GameAlreadyExists(bytes32)":[{"params":{"uuid":"The UUID of the dispute game that already exists."}}],"NoImplementation(uint32)":[{"params":{"gameType":"The unsupported game type."}}]},"title":"DisputeGameFactory"},"ast":{"absolutePath":"src/dispute/DisputeGameFactory.sol","id":97683,"exportedSymbols":{"AlreadyInitialized":[103120],"AnchorRootNotFound":[103192],"BadAuth":[103195],"BadExtraData":[103132],"BondAmount":[103259],"BondTransferFailed":[103129],"CannotDefendRootClaim":[103135],"Claim":[103255],"ClaimAboveSplit":[103177],"ClaimAlreadyExists":[103138],"ClaimAlreadyResolved":[103174],"ClaimHash":[103257],"Clock":[103267],"ClockNotExpired":[103150],"ClockTimeExceeded":[103147],"DisputeGameFactory":[97682],"DuplicateStep":[103189],"Duration":[103263],"GameAlreadyExists":[103111],"GameDepthExceeded":[103153],"GameId":[103265],"GameNotInProgress":[103144],"GameStatus":[103277],"GameType":[103271],"GameTypes":[103317],"Hash":[103253],"IDisputeGame":[100327],"IDisputeGameFactory":[100497],"ISemver":[109417],"IncorrectBondAmount":[103123],"InvalidClaim":[103141],"InvalidClockExtension":[103183],"InvalidLocalIdent":[103168],"InvalidParent":[103156],"InvalidPrestate":[103159],"InvalidSplitDepth":[103180],"L1HeadTooOld":[103165],"LibClaim":[101086],"LibClock":[101073],"LibClone":[62767],"LibDuration":[101099],"LibGameId":[100778],"LibGameType":[101151],"LibHash":[101112],"LibHashing":[100800],"LibPosition":[101018],"LibTimestamp":[101125],"LibVMStatus":[101138],"LocalPreimageKey":[103373],"MaxDepthTooLarge":[103186],"NoCreditToClaim":[103126],"NoImplementation":[103105],"OutOfOrderResolution":[103171],"OutputRoot":[103283],"OwnableUpgradeable":[46963],"Position":[103269],"Timestamp":[103261],"UnexpectedRootClaim":[103117],"VMStatus":[103273],"VMStatuses":[103351],"ValidStep":[103162]},"nodeType":"SourceUnit","src":"32:8414:163","nodes":[{"id":97186,"nodeType":"PragmaDirective","src":"32:23:163","nodes":[],"literals":["solidity","0.8",".15"]},{"id":97188,"nodeType":"ImportDirective","src":"57:54:163","nodes":[],"absolutePath":"lib/solady/src/utils/LibClone.sol","file":"@solady/utils/LibClone.sol","nameLocation":"-1:-1:-1","scope":97683,"sourceUnit":62768,"symbolAliases":[{"foreign":{"id":97187,"name":"LibClone","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62767,"src":"66:8:163","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97190,"nodeType":"ImportDirective","src":"112:103:163","nodes":[],"absolutePath":"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol","file":"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","nameLocation":"-1:-1:-1","scope":97683,"sourceUnit":46964,"symbolAliases":[{"foreign":{"id":97189,"name":"OwnableUpgradeable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":46963,"src":"121:18:163","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97192,"nodeType":"ImportDirective","src":"216:52:163","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":97683,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":97191,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"225:7:163","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97194,"nodeType":"ImportDirective","src":"270:71:163","nodes":[],"absolutePath":"src/dispute/interfaces/IDisputeGame.sol","file":"src/dispute/interfaces/IDisputeGame.sol","nameLocation":"-1:-1:-1","scope":97683,"sourceUnit":100328,"symbolAliases":[{"foreign":{"id":97193,"name":"IDisputeGame","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100327,"src":"279:12:163","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97196,"nodeType":"ImportDirective","src":"342:85:163","nodes":[],"absolutePath":"src/dispute/interfaces/IDisputeGameFactory.sol","file":"src/dispute/interfaces/IDisputeGameFactory.sol","nameLocation":"-1:-1:-1","scope":97683,"sourceUnit":100498,"symbolAliases":[{"foreign":{"id":97195,"name":"IDisputeGameFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100497,"src":"351:19:163","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97198,"nodeType":"ImportDirective","src":"429:58:163","nodes":[],"absolutePath":"src/dispute/lib/LibGameId.sol","file":"src/dispute/lib/LibGameId.sol","nameLocation":"-1:-1:-1","scope":97683,"sourceUnit":100779,"symbolAliases":[{"foreign":{"id":97197,"name":"LibGameId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100778,"src":"438:9:163","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97199,"nodeType":"ImportDirective","src":"489:40:163","nodes":[],"absolutePath":"src/libraries/DisputeTypes.sol","file":"src/libraries/DisputeTypes.sol","nameLocation":"-1:-1:-1","scope":97683,"sourceUnit":103374,"symbolAliases":[],"unitAlias":""},{"id":97200,"nodeType":"ImportDirective","src":"530:41:163","nodes":[],"absolutePath":"src/libraries/DisputeErrors.sol","file":"src/libraries/DisputeErrors.sol","nameLocation":"-1:-1:-1","scope":97683,"sourceUnit":103196,"symbolAliases":[],"unitAlias":""},{"id":97682,"nodeType":"ContractDefinition","src":"989:7456:163","nodes":[{"id":97210,"nodeType":"UsingForDirective","src":"1155:27:163","nodes":[],"global":false,"libraryName":{"id":97208,"name":"LibClone","nodeType":"IdentifierPath","referencedDeclaration":62767,"src":"1161:8:163"},"typeName":{"id":97209,"name":"address","nodeType":"ElementaryTypeName","src":"1174:7:163","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"id":97214,"nodeType":"VariableDeclaration","src":"1251:40:163","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":97211,"nodeType":"StructuredDocumentation","src":"1188:58:163","text":"@notice Semantic version.\n @custom:semver 0.6.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"1274:7:163","scope":97682,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":97212,"name":"string","nodeType":"ElementaryTypeName","src":"1251:6:163","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"302e362e30","id":97213,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1284:7:163","typeDescriptions":{"typeIdentifier":"t_stringliteral_98293d924c2515c22d1d357dd5a43b88356a9d20201dd01f3afa1023505a904d","typeString":"literal_string \"0.6.0\""},"value":"0.6.0"},"visibility":"public"},{"id":97221,"nodeType":"VariableDeclaration","src":"1338:50:163","nodes":[],"baseFunctions":[100423],"constant":false,"documentation":{"id":97215,"nodeType":"StructuredDocumentation","src":"1298:35:163","text":"@inheritdoc IDisputeGameFactory"},"functionSelector":"1b685b9e","mutability":"mutable","name":"gameImpls","nameLocation":"1379:9:163","scope":97682,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_GameType_$103271_$_t_contract$_IDisputeGame_$100327_$","typeString":"mapping(GameType => contract IDisputeGame)"},"typeName":{"id":97220,"keyType":{"id":97217,"nodeType":"UserDefinedTypeName","pathNode":{"id":97216,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"1346:8:163"},"referencedDeclaration":103271,"src":"1346:8:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"nodeType":"Mapping","src":"1338:33:163","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_GameType_$103271_$_t_contract$_IDisputeGame_$100327_$","typeString":"mapping(GameType => contract IDisputeGame)"},"valueType":{"id":97219,"nodeType":"UserDefinedTypeName","pathNode":{"id":97218,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"1358:12:163"},"referencedDeclaration":100327,"src":"1358:12:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}}},"visibility":"public"},{"id":97227,"nodeType":"VariableDeclaration","src":"1435:45:163","nodes":[],"baseFunctions":[100432],"constant":false,"documentation":{"id":97222,"nodeType":"StructuredDocumentation","src":"1395:35:163","text":"@inheritdoc IDisputeGameFactory"},"functionSelector":"6593dc6e","mutability":"mutable","name":"initBonds","nameLocation":"1471:9:163","scope":97682,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_GameType_$103271_$_t_uint256_$","typeString":"mapping(GameType => uint256)"},"typeName":{"id":97226,"keyType":{"id":97224,"nodeType":"UserDefinedTypeName","pathNode":{"id":97223,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"1443:8:163"},"referencedDeclaration":103271,"src":"1443:8:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"nodeType":"Mapping","src":"1435:28:163","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_GameType_$103271_$_t_uint256_$","typeString":"mapping(GameType => uint256)"},"valueType":{"id":97225,"name":"uint256","nodeType":"ElementaryTypeName","src":"1455:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"id":97234,"nodeType":"VariableDeclaration","src":"1650:46:163","nodes":[],"constant":false,"documentation":{"id":97228,"nodeType":"StructuredDocumentation","src":"1487:113:163","text":"@notice Mapping of a hash of `gameType || rootClaim || extraData` to the deployed `IDisputeGame` clone (where"},"mutability":"mutable","name":"_disputeGames","nameLocation":"1683:13:163","scope":97682,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_Hash_$103253_$_t_userDefinedValueType$_GameId_$103265_$","typeString":"mapping(Hash => GameId)"},"typeName":{"id":97233,"keyType":{"id":97230,"nodeType":"UserDefinedTypeName","pathNode":{"id":97229,"name":"Hash","nodeType":"IdentifierPath","referencedDeclaration":103253,"src":"1658:4:163"},"referencedDeclaration":103253,"src":"1658:4:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"nodeType":"Mapping","src":"1650:23:163","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_Hash_$103253_$_t_userDefinedValueType$_GameId_$103265_$","typeString":"mapping(Hash => GameId)"},"valueType":{"id":97232,"nodeType":"UserDefinedTypeName","pathNode":{"id":97231,"name":"GameId","nodeType":"IdentifierPath","referencedDeclaration":103265,"src":"1666:6:163"},"referencedDeclaration":103265,"src":"1666:6:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}}},"visibility":"internal"},{"id":97239,"nodeType":"VariableDeclaration","src":"1862:34:163","nodes":[],"constant":false,"documentation":{"id":97235,"nodeType":"StructuredDocumentation","src":"1703:154:163","text":"@notice An append-only array of disputeGames that have been created. Used by offchain game solvers to\n efficiently track dispute games."},"mutability":"mutable","name":"_disputeGameList","nameLocation":"1880:16:163","scope":97682,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_userDefinedValueType$_GameId_$103265_$dyn_storage","typeString":"GameId[]"},"typeName":{"baseType":{"id":97237,"nodeType":"UserDefinedTypeName","pathNode":{"id":97236,"name":"GameId","nodeType":"IdentifierPath","referencedDeclaration":103265,"src":"1862:6:163"},"referencedDeclaration":103265,"src":"1862:6:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},"id":97238,"nodeType":"ArrayTypeName","src":"1862:8:163","typeDescriptions":{"typeIdentifier":"t_array$_t_userDefinedValueType$_GameId_$103265_$dyn_storage_ptr","typeString":"GameId[]"}},"visibility":"internal"},{"id":97253,"nodeType":"FunctionDefinition","src":"1965:74:163","nodes":[],"body":{"id":97252,"nodeType":"Block","src":"2000:39:163","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"30","id":97248,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2029:1:163","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":97247,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2021:7:163","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":97246,"name":"address","nodeType":"ElementaryTypeName","src":"2021:7:163","typeDescriptions":{}}},"id":97249,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2021:10:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":97245,"name":"initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97269,"src":"2010:10:163","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":97250,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2010:22:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97251,"nodeType":"ExpressionStatement","src":"2010:22:163"}]},"documentation":{"id":97240,"nodeType":"StructuredDocumentation","src":"1903:57:163","text":"@notice Constructs a new DisputeGameFactory contract."},"implemented":true,"kind":"constructor","modifiers":[{"arguments":[],"id":97243,"kind":"baseConstructorSpecifier","modifierName":{"id":97242,"name":"OwnableUpgradeable","nodeType":"IdentifierPath","referencedDeclaration":46963,"src":"1979:18:163"},"nodeType":"ModifierInvocation","src":"1979:20:163"}],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":97241,"nodeType":"ParameterList","parameters":[],"src":"1976:2:163"},"returnParameters":{"id":97244,"nodeType":"ParameterList","parameters":[],"src":"2000:0:163"},"scope":97682,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":97269,"nodeType":"FunctionDefinition","src":"2136:124:163","nodes":[],"body":{"id":97268,"nodeType":"Block","src":"2191:69:163","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":97261,"name":"__Ownable_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":46858,"src":"2201:14:163","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":97262,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2201:16:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97263,"nodeType":"ExpressionStatement","src":"2201:16:163"},{"expression":{"arguments":[{"id":97265,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97256,"src":"2246:6:163","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":97264,"name":"_transferOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":46957,"src":"2227:18:163","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":97266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2227:26:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97267,"nodeType":"ExpressionStatement","src":"2227:26:163"}]},"documentation":{"id":97254,"nodeType":"StructuredDocumentation","src":"2045:86:163","text":"@notice Initializes the contract.\n @param _owner The owner of the contract."},"functionSelector":"c4d66de8","implemented":true,"kind":"function","modifiers":[{"id":97259,"kind":"modifierInvocation","modifierName":{"id":97258,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":47034,"src":"2179:11:163"},"nodeType":"ModifierInvocation","src":"2179:11:163"}],"name":"initialize","nameLocation":"2145:10:163","parameters":{"id":97257,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97256,"mutability":"mutable","name":"_owner","nameLocation":"2164:6:163","nodeType":"VariableDeclaration","scope":97269,"src":"2156:14:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":97255,"name":"address","nodeType":"ElementaryTypeName","src":"2156:7:163","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2155:16:163"},"returnParameters":{"id":97260,"nodeType":"ParameterList","parameters":[],"src":"2191:0:163"},"scope":97682,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":97281,"nodeType":"FunctionDefinition","src":"2306:117:163","nodes":[],"body":{"id":97280,"nodeType":"Block","src":"2370:53:163","nodes":[],"statements":[{"expression":{"id":97278,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97275,"name":"gameCount_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97273,"src":"2380:10:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":97276,"name":"_disputeGameList","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97239,"src":"2393:16:163","typeDescriptions":{"typeIdentifier":"t_array$_t_userDefinedValueType$_GameId_$103265_$dyn_storage","typeString":"GameId[] storage ref"}},"id":97277,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2393:23:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2380:36:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":97279,"nodeType":"ExpressionStatement","src":"2380:36:163"}]},"baseFunctions":[100380],"documentation":{"id":97270,"nodeType":"StructuredDocumentation","src":"2266:35:163","text":"@inheritdoc IDisputeGameFactory"},"functionSelector":"4d1975b4","implemented":true,"kind":"function","modifiers":[],"name":"gameCount","nameLocation":"2315:9:163","parameters":{"id":97271,"nodeType":"ParameterList","parameters":[],"src":"2324:2:163"},"returnParameters":{"id":97274,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97273,"mutability":"mutable","name":"gameCount_","nameLocation":"2358:10:163","nodeType":"VariableDeclaration","scope":97281,"src":"2350:18:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97272,"name":"uint256","nodeType":"ElementaryTypeName","src":"2350:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2349:20:163"},"scope":97682,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":97319,"nodeType":"FunctionDefinition","src":"2469:342:163","nodes":[],"body":{"id":97318,"nodeType":"Block","src":"2673:138:163","nodes":[],"statements":[{"assignments":[97301],"declarations":[{"constant":false,"id":97301,"mutability":"mutable","name":"uuid","nameLocation":"2688:4:163","nodeType":"VariableDeclaration","scope":97318,"src":"2683:9:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"},"typeName":{"id":97300,"nodeType":"UserDefinedTypeName","pathNode":{"id":97299,"name":"Hash","nodeType":"IdentifierPath","referencedDeclaration":103253,"src":"2683:4:163"},"referencedDeclaration":103253,"src":"2683:4:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"visibility":"internal"}],"id":97307,"initialValue":{"arguments":[{"id":97303,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97285,"src":"2707:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},{"id":97304,"name":"_rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97288,"src":"2718:10:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":97305,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97290,"src":"2730:10:163","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":97302,"name":"getGameUUID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97522,"src":"2695:11:163","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Claim_$103255_$_t_bytes_calldata_ptr_$returns$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (GameType,Claim,bytes calldata) pure returns (Hash)"}},"id":97306,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2695:46:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"nodeType":"VariableDeclarationStatement","src":"2683:58:163"},{"expression":{"id":97316,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[null,{"id":97308,"name":"timestamp_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97297,"src":"2754:10:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},{"id":97309,"name":"proxy_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97294,"src":"2766:6:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}}],"id":97310,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"2751:22:163","typeDescriptions":{"typeIdentifier":"t_tuple$__$_t_userDefinedValueType$_Timestamp_$103261_$_t_contract$_IDisputeGame_$100327_$","typeString":"tuple(,Timestamp,contract IDisputeGame)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"baseExpression":{"id":97311,"name":"_disputeGames","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97234,"src":"2776:13:163","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_Hash_$103253_$_t_userDefinedValueType$_GameId_$103265_$","typeString":"mapping(Hash => GameId)"}},"id":97313,"indexExpression":{"id":97312,"name":"uuid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97301,"src":"2790:4:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2776:19:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},"id":97314,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"unpack","nodeType":"MemberAccess","referencedDeclaration":100777,"src":"2776:26:163","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameId_$103265_$returns$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Timestamp_$103261_$_t_contract$_IDisputeGame_$100327_$bound_to$_t_userDefinedValueType$_GameId_$103265_$","typeString":"function (GameId) pure returns (GameType,Timestamp,contract IDisputeGame)"}},"id":97315,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2776:28:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Timestamp_$103261_$_t_contract$_IDisputeGame_$100327_$","typeString":"tuple(GameType,Timestamp,contract IDisputeGame)"}},"src":"2751:53:163","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97317,"nodeType":"ExpressionStatement","src":"2751:53:163"}]},"baseFunctions":[100398],"documentation":{"id":97282,"nodeType":"StructuredDocumentation","src":"2429:35:163","text":"@inheritdoc IDisputeGameFactory"},"functionSelector":"5f0150cb","implemented":true,"kind":"function","modifiers":[],"name":"games","nameLocation":"2478:5:163","parameters":{"id":97291,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97285,"mutability":"mutable","name":"_gameType","nameLocation":"2502:9:163","nodeType":"VariableDeclaration","scope":97319,"src":"2493:18:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":97284,"nodeType":"UserDefinedTypeName","pathNode":{"id":97283,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"2493:8:163"},"referencedDeclaration":103271,"src":"2493:8:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},{"constant":false,"id":97288,"mutability":"mutable","name":"_rootClaim","nameLocation":"2527:10:163","nodeType":"VariableDeclaration","scope":97319,"src":"2521:16:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":97287,"nodeType":"UserDefinedTypeName","pathNode":{"id":97286,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"2521:5:163"},"referencedDeclaration":103255,"src":"2521:5:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":97290,"mutability":"mutable","name":"_extraData","nameLocation":"2562:10:163","nodeType":"VariableDeclaration","scope":97319,"src":"2547:25:163","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":97289,"name":"bytes","nodeType":"ElementaryTypeName","src":"2547:5:163","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2483:95:163"},"returnParameters":{"id":97298,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97294,"mutability":"mutable","name":"proxy_","nameLocation":"2639:6:163","nodeType":"VariableDeclaration","scope":97319,"src":"2626:19:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"},"typeName":{"id":97293,"nodeType":"UserDefinedTypeName","pathNode":{"id":97292,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"2626:12:163"},"referencedDeclaration":100327,"src":"2626:12:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"visibility":"internal"},{"constant":false,"id":97297,"mutability":"mutable","name":"timestamp_","nameLocation":"2657:10:163","nodeType":"VariableDeclaration","scope":97319,"src":"2647:20:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"},"typeName":{"id":97296,"nodeType":"UserDefinedTypeName","pathNode":{"id":97295,"name":"Timestamp","nodeType":"IdentifierPath","referencedDeclaration":103261,"src":"2647:9:163"},"referencedDeclaration":103261,"src":"2647:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"visibility":"internal"}],"src":"2625:43:163"},"scope":97682,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":97346,"nodeType":"FunctionDefinition","src":"2857:235:163","nodes":[],"body":{"id":97345,"nodeType":"Block","src":"3008:84:163","nodes":[],"statements":[{"expression":{"id":97343,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":97334,"name":"gameType_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97326,"src":"3019:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},{"id":97335,"name":"timestamp_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97329,"src":"3030:10:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},{"id":97336,"name":"proxy_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97332,"src":"3042:6:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}}],"id":97337,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"3018:31:163","typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Timestamp_$103261_$_t_contract$_IDisputeGame_$100327_$","typeString":"tuple(GameType,Timestamp,contract IDisputeGame)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"baseExpression":{"id":97338,"name":"_disputeGameList","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97239,"src":"3052:16:163","typeDescriptions":{"typeIdentifier":"t_array$_t_userDefinedValueType$_GameId_$103265_$dyn_storage","typeString":"GameId[] storage ref"}},"id":97340,"indexExpression":{"id":97339,"name":"_index","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97322,"src":"3069:6:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3052:24:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},"id":97341,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"unpack","nodeType":"MemberAccess","referencedDeclaration":100777,"src":"3052:31:163","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameId_$103265_$returns$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Timestamp_$103261_$_t_contract$_IDisputeGame_$100327_$bound_to$_t_userDefinedValueType$_GameId_$103265_$","typeString":"function (GameId) pure returns (GameType,Timestamp,contract IDisputeGame)"}},"id":97342,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3052:33:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Timestamp_$103261_$_t_contract$_IDisputeGame_$100327_$","typeString":"tuple(GameType,Timestamp,contract IDisputeGame)"}},"src":"3018:67:163","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97344,"nodeType":"ExpressionStatement","src":"3018:67:163"}]},"baseFunctions":[100413],"documentation":{"id":97320,"nodeType":"StructuredDocumentation","src":"2817:35:163","text":"@inheritdoc IDisputeGameFactory"},"functionSelector":"bb8aa1fc","implemented":true,"kind":"function","modifiers":[],"name":"gameAtIndex","nameLocation":"2866:11:163","parameters":{"id":97323,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97322,"mutability":"mutable","name":"_index","nameLocation":"2886:6:163","nodeType":"VariableDeclaration","scope":97346,"src":"2878:14:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97321,"name":"uint256","nodeType":"ElementaryTypeName","src":"2878:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2877:16:163"},"returnParameters":{"id":97333,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97326,"mutability":"mutable","name":"gameType_","nameLocation":"2950:9:163","nodeType":"VariableDeclaration","scope":97346,"src":"2941:18:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":97325,"nodeType":"UserDefinedTypeName","pathNode":{"id":97324,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"2941:8:163"},"referencedDeclaration":103271,"src":"2941:8:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},{"constant":false,"id":97329,"mutability":"mutable","name":"timestamp_","nameLocation":"2971:10:163","nodeType":"VariableDeclaration","scope":97346,"src":"2961:20:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"},"typeName":{"id":97328,"nodeType":"UserDefinedTypeName","pathNode":{"id":97327,"name":"Timestamp","nodeType":"IdentifierPath","referencedDeclaration":103261,"src":"2961:9:163"},"referencedDeclaration":103261,"src":"2961:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"visibility":"internal"},{"constant":false,"id":97332,"mutability":"mutable","name":"proxy_","nameLocation":"2996:6:163","nodeType":"VariableDeclaration","scope":97346,"src":"2983:19:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"},"typeName":{"id":97331,"nodeType":"UserDefinedTypeName","pathNode":{"id":97330,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"2983:12:163"},"referencedDeclaration":100327,"src":"2983:12:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"visibility":"internal"}],"src":"2940:63:163"},"scope":97682,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":97492,"nodeType":"FunctionDefinition","src":"3138:2553:163","nodes":[],"body":{"id":97491,"nodeType":"Block","src":"3324:2367:163","nodes":[],"statements":[{"assignments":[97363],"declarations":[{"constant":false,"id":97363,"mutability":"mutable","name":"impl","nameLocation":"3417:4:163","nodeType":"VariableDeclaration","scope":97491,"src":"3404:17:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"},"typeName":{"id":97362,"nodeType":"UserDefinedTypeName","pathNode":{"id":97361,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"3404:12:163"},"referencedDeclaration":100327,"src":"3404:12:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"visibility":"internal"}],"id":97367,"initialValue":{"baseExpression":{"id":97364,"name":"gameImpls","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97221,"src":"3424:9:163","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_GameType_$103271_$_t_contract$_IDisputeGame_$100327_$","typeString":"mapping(GameType => contract IDisputeGame)"}},"id":97366,"indexExpression":{"id":97365,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97350,"src":"3434:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3424:20:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"nodeType":"VariableDeclarationStatement","src":"3404:40:163"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":97376,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":97370,"name":"impl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97363,"src":"3551:4:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}],"id":97369,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3543:7:163","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":97368,"name":"address","nodeType":"ElementaryTypeName","src":"3543:7:163","typeDescriptions":{}}},"id":97371,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3543:13:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":97374,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3568:1:163","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":97373,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3560:7:163","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":97372,"name":"address","nodeType":"ElementaryTypeName","src":"3560:7:163","typeDescriptions":{}}},"id":97375,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3560:10:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3543:27:163","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97381,"nodeType":"IfStatement","src":"3539:67:163","trueBody":{"errorCall":{"arguments":[{"id":97378,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97350,"src":"3596:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}],"id":97377,"name":"NoImplementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103105,"src":"3579:16:163","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_userDefinedValueType$_GameType_$103271_$returns$__$","typeString":"function (GameType) pure"}},"id":97379,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3579:27:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97380,"nodeType":"RevertStatement","src":"3572:34:163"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97387,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":97382,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3688:3:163","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":97383,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"3688:9:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"baseExpression":{"id":97384,"name":"initBonds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97227,"src":"3701:9:163","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_GameType_$103271_$_t_uint256_$","typeString":"mapping(GameType => uint256)"}},"id":97386,"indexExpression":{"id":97385,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97350,"src":"3711:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3701:20:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3688:33:163","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97391,"nodeType":"IfStatement","src":"3684:67:163","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":97388,"name":"IncorrectBondAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103123,"src":"3730:19:163","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":97389,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3730:21:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97390,"nodeType":"RevertStatement","src":"3723:28:163"}},{"assignments":[97393],"declarations":[{"constant":false,"id":97393,"mutability":"mutable","name":"parentHash","nameLocation":"3815:10:163","nodeType":"VariableDeclaration","scope":97491,"src":"3807:18:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":97392,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3807:7:163","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":97400,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97398,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":97395,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"3838:5:163","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":97396,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"number","nodeType":"MemberAccess","src":"3838:12:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":97397,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3853:1:163","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"3838:16:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":97394,"name":"blockhash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-5,"src":"3828:9:163","typeDescriptions":{"typeIdentifier":"t_function_blockhash_view$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256) view returns (bytes32)"}},"id":97399,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3828:27:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3807:48:163"},{"expression":{"id":97418,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97401,"name":"proxy_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97359,"src":"4868:6:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"arguments":[{"expression":{"id":97410,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4927:3:163","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":97411,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4927:10:163","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":97412,"name":"_rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97353,"src":"4939:10:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":97413,"name":"parentHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97393,"src":"4951:10:163","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":97414,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97355,"src":"4963:10:163","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":97408,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4910:3:163","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":97409,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"4910:16:163","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":97415,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4910:64:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"arguments":[{"id":97405,"name":"impl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97363,"src":"4898:4:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}],"id":97404,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4890:7:163","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":97403,"name":"address","nodeType":"ElementaryTypeName","src":"4890:7:163","typeDescriptions":{}}},"id":97406,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4890:13:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":97407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"clone","nodeType":"MemberAccess","referencedDeclaration":62515,"src":"4890:19:163","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$bound_to$_t_address_$","typeString":"function (address,bytes memory) returns (address)"}},"id":97416,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4890:85:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":97402,"name":"IDisputeGame","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100327,"src":"4877:12:163","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IDisputeGame_$100327_$","typeString":"type(contract IDisputeGame)"}},"id":97417,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4877:99:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"src":"4868:108:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"id":97419,"nodeType":"ExpressionStatement","src":"4868:108:163"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"argumentTypes":[],"expression":{"id":97420,"name":"proxy_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97359,"src":"4986:6:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"id":97422,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initialize","nodeType":"MemberAccess","referencedDeclaration":100615,"src":"4986:17:163","typeDescriptions":{"typeIdentifier":"t_function_external_payable$__$returns$__$","typeString":"function () payable external"}},"id":97425,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":97423,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5012:3:163","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":97424,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"5012:9:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"4986:37:163","typeDescriptions":{"typeIdentifier":"t_function_external_payable$__$returns$__$value","typeString":"function () payable external"}},"id":97426,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4986:39:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97427,"nodeType":"ExpressionStatement","src":"4986:39:163"},{"assignments":[97430],"declarations":[{"constant":false,"id":97430,"mutability":"mutable","name":"uuid","nameLocation":"5104:4:163","nodeType":"VariableDeclaration","scope":97491,"src":"5099:9:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"},"typeName":{"id":97429,"nodeType":"UserDefinedTypeName","pathNode":{"id":97428,"name":"Hash","nodeType":"IdentifierPath","referencedDeclaration":103253,"src":"5099:4:163"},"referencedDeclaration":103253,"src":"5099:4:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"visibility":"internal"}],"id":97436,"initialValue":{"arguments":[{"id":97432,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97350,"src":"5123:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},{"id":97433,"name":"_rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97353,"src":"5134:10:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":97434,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97355,"src":"5146:10:163","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":97431,"name":"getGameUUID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97522,"src":"5111:11:163","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Claim_$103255_$_t_bytes_calldata_ptr_$returns$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (GameType,Claim,bytes calldata) pure returns (Hash)"}},"id":97435,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5111:46:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"nodeType":"VariableDeclarationStatement","src":"5099:58:163"},{"condition":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":97447,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"baseExpression":{"id":97439,"name":"_disputeGames","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97234,"src":"5258:13:163","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_Hash_$103253_$_t_userDefinedValueType$_GameId_$103265_$","typeString":"mapping(Hash => GameId)"}},"id":97441,"indexExpression":{"id":97440,"name":"uuid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97430,"src":"5272:4:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5258:19:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}],"expression":{"id":97437,"name":"GameId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103265,"src":"5244:6:163","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_GameId_$103265_$","typeString":"type(GameId)"}},"id":97438,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"unwrap","nodeType":"MemberAccess","src":"5244:13:163","typeDescriptions":{"typeIdentifier":"t_function_unwrap_pure$_t_userDefinedValueType$_GameId_$103265_$returns$_t_bytes32_$","typeString":"function (GameId) pure returns (bytes32)"}},"id":97442,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5244:34:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":97445,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5290:1:163","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":97444,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5282:7:163","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":97443,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5282:7:163","typeDescriptions":{}}},"id":97446,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5282:10:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"5244:48:163","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97452,"nodeType":"IfStatement","src":"5240:84:163","trueBody":{"errorCall":{"arguments":[{"id":97449,"name":"uuid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97430,"src":"5319:4:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}],"id":97448,"name":"GameAlreadyExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103111,"src":"5301:17:163","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_userDefinedValueType$_Hash_$103253_$returns$__$","typeString":"function (Hash) pure"}},"id":97450,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5301:23:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97451,"nodeType":"RevertStatement","src":"5294:30:163"}},{"assignments":[97455],"declarations":[{"constant":false,"id":97455,"mutability":"mutable","name":"id","nameLocation":"5371:2:163","nodeType":"VariableDeclaration","scope":97491,"src":"5364:9:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"},"typeName":{"id":97454,"nodeType":"UserDefinedTypeName","pathNode":{"id":97453,"name":"GameId","nodeType":"IdentifierPath","referencedDeclaration":103265,"src":"5364:6:163"},"referencedDeclaration":103265,"src":"5364:6:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},"visibility":"internal"}],"id":97469,"initialValue":{"arguments":[{"id":97458,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97350,"src":"5391:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},{"arguments":[{"arguments":[{"expression":{"id":97463,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"5424:5:163","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":97464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"5424:15:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":97462,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5417:6:163","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":97461,"name":"uint64","nodeType":"ElementaryTypeName","src":"5417:6:163","typeDescriptions":{}}},"id":97465,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5417:23:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":97459,"name":"Timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103261,"src":"5402:9:163","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"type(Timestamp)"}},"id":97460,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"5402:14:163","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint64_$returns$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"function (uint64) pure returns (Timestamp)"}},"id":97466,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5402:39:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},{"id":97467,"name":"proxy_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97359,"src":"5443:6:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"},{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}],"expression":{"id":97456,"name":"LibGameId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100778,"src":"5376:9:163","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LibGameId_$100778_$","typeString":"type(library LibGameId)"}},"id":97457,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"pack","nodeType":"MemberAccess","referencedDeclaration":100759,"src":"5376:14:163","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Timestamp_$103261_$_t_contract$_IDisputeGame_$100327_$returns$_t_userDefinedValueType$_GameId_$103265_$","typeString":"function (GameType,Timestamp,contract IDisputeGame) pure returns (GameId)"}},"id":97468,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5376:74:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},"nodeType":"VariableDeclarationStatement","src":"5364:86:163"},{"expression":{"id":97474,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":97470,"name":"_disputeGames","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97234,"src":"5552:13:163","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_Hash_$103253_$_t_userDefinedValueType$_GameId_$103265_$","typeString":"mapping(Hash => GameId)"}},"id":97472,"indexExpression":{"id":97471,"name":"uuid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97430,"src":"5566:4:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5552:19:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97473,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97455,"src":"5574:2:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},"src":"5552:24:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},"id":97475,"nodeType":"ExpressionStatement","src":"5552:24:163"},{"expression":{"arguments":[{"id":97479,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97455,"src":"5608:2:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}],"expression":{"id":97476,"name":"_disputeGameList","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97239,"src":"5586:16:163","typeDescriptions":{"typeIdentifier":"t_array$_t_userDefinedValueType$_GameId_$103265_$dyn_storage","typeString":"GameId[] storage ref"}},"id":97478,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"push","nodeType":"MemberAccess","src":"5586:21:163","typeDescriptions":{"typeIdentifier":"t_function_arraypush_nonpayable$_t_array$_t_userDefinedValueType$_GameId_$103265_$dyn_storage_ptr_$_t_userDefinedValueType$_GameId_$103265_$returns$__$bound_to$_t_array$_t_userDefinedValueType$_GameId_$103265_$dyn_storage_ptr_$","typeString":"function (GameId[] storage pointer,GameId)"}},"id":97480,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5586:25:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97481,"nodeType":"ExpressionStatement","src":"5586:25:163"},{"eventCall":{"arguments":[{"arguments":[{"id":97485,"name":"proxy_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97359,"src":"5653:6:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}],"id":97484,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5645:7:163","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":97483,"name":"address","nodeType":"ElementaryTypeName","src":"5645:7:163","typeDescriptions":{}}},"id":97486,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5645:15:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":97487,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97350,"src":"5662:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},{"id":97488,"name":"_rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97353,"src":"5673:10:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}],"id":97482,"name":"DisputeGameCreated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100344,"src":"5626:18:163","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Claim_$103255_$returns$__$","typeString":"function (address,GameType,Claim)"}},"id":97489,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5626:58:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97490,"nodeType":"EmitStatement","src":"5621:63:163"}]},"baseFunctions":[100447],"documentation":{"id":97347,"nodeType":"StructuredDocumentation","src":"3098:35:163","text":"@inheritdoc IDisputeGameFactory"},"functionSelector":"82ecf2f6","implemented":true,"kind":"function","modifiers":[],"name":"create","nameLocation":"3147:6:163","parameters":{"id":97356,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97350,"mutability":"mutable","name":"_gameType","nameLocation":"3172:9:163","nodeType":"VariableDeclaration","scope":97492,"src":"3163:18:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":97349,"nodeType":"UserDefinedTypeName","pathNode":{"id":97348,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"3163:8:163"},"referencedDeclaration":103271,"src":"3163:8:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},{"constant":false,"id":97353,"mutability":"mutable","name":"_rootClaim","nameLocation":"3197:10:163","nodeType":"VariableDeclaration","scope":97492,"src":"3191:16:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":97352,"nodeType":"UserDefinedTypeName","pathNode":{"id":97351,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"3191:5:163"},"referencedDeclaration":103255,"src":"3191:5:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":97355,"mutability":"mutable","name":"_extraData","nameLocation":"3232:10:163","nodeType":"VariableDeclaration","scope":97492,"src":"3217:25:163","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":97354,"name":"bytes","nodeType":"ElementaryTypeName","src":"3217:5:163","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3153:95:163"},"returnParameters":{"id":97360,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97359,"mutability":"mutable","name":"proxy_","nameLocation":"3312:6:163","nodeType":"VariableDeclaration","scope":97492,"src":"3299:19:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"},"typeName":{"id":97358,"nodeType":"UserDefinedTypeName","pathNode":{"id":97357,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"3299:12:163"},"referencedDeclaration":100327,"src":"3299:12:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"visibility":"internal"}],"src":"3298:21:163"},"scope":97682,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":97522,"nodeType":"FunctionDefinition","src":"5737:269:163","nodes":[],"body":{"id":97521,"nodeType":"Block","src":"5914:92:163","nodes":[],"statements":[{"expression":{"id":97519,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97507,"name":"uuid_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97505,"src":"5924:5:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"arguments":[{"id":97513,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97496,"src":"5963:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},{"id":97514,"name":"_rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97499,"src":"5974:10:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":97515,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97501,"src":"5986:10:163","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":97511,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5952:3:163","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":97512,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"5952:10:163","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":97516,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5952:45:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":97510,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"5942:9:163","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":97517,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5942:56:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":97508,"name":"Hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103253,"src":"5932:4:163","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Hash_$103253_$","typeString":"type(Hash)"}},"id":97509,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"5932:9:163","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_bytes32_$returns$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (bytes32) pure returns (Hash)"}},"id":97518,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5932:67:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"src":"5924:75:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":97520,"nodeType":"ExpressionStatement","src":"5924:75:163"}]},"baseFunctions":[100481],"documentation":{"id":97493,"nodeType":"StructuredDocumentation","src":"5697:35:163","text":"@inheritdoc IDisputeGameFactory"},"functionSelector":"96cd9720","implemented":true,"kind":"function","modifiers":[],"name":"getGameUUID","nameLocation":"5746:11:163","parameters":{"id":97502,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97496,"mutability":"mutable","name":"_gameType","nameLocation":"5776:9:163","nodeType":"VariableDeclaration","scope":97522,"src":"5767:18:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":97495,"nodeType":"UserDefinedTypeName","pathNode":{"id":97494,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"5767:8:163"},"referencedDeclaration":103271,"src":"5767:8:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},{"constant":false,"id":97499,"mutability":"mutable","name":"_rootClaim","nameLocation":"5801:10:163","nodeType":"VariableDeclaration","scope":97522,"src":"5795:16:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":97498,"nodeType":"UserDefinedTypeName","pathNode":{"id":97497,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"5795:5:163"},"referencedDeclaration":103255,"src":"5795:5:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":97501,"mutability":"mutable","name":"_extraData","nameLocation":"5836:10:163","nodeType":"VariableDeclaration","scope":97522,"src":"5821:25:163","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":97500,"name":"bytes","nodeType":"ElementaryTypeName","src":"5821:5:163","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5757:95:163"},"returnParameters":{"id":97506,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97505,"mutability":"mutable","name":"uuid_","nameLocation":"5903:5:163","nodeType":"VariableDeclaration","scope":97522,"src":"5898:10:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"},"typeName":{"id":97504,"nodeType":"UserDefinedTypeName","pathNode":{"id":97503,"name":"Hash","nodeType":"IdentifierPath","referencedDeclaration":103253,"src":"5898:4:163"},"referencedDeclaration":103253,"src":"5898:4:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"visibility":"internal"}],"src":"5897:12:163"},"scope":97682,"stateMutability":"pure","virtual":false,"visibility":"public"},{"id":97631,"nodeType":"FunctionDefinition","src":"6052:1929:163","nodes":[],"body":{"id":97630,"nodeType":"Block","src":"6240:1741:163","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":97544,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":97537,"name":"_start","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97528,"src":"6374:6:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"expression":{"id":97538,"name":"_disputeGameList","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97239,"src":"6384:16:163","typeDescriptions":{"typeIdentifier":"t_array$_t_userDefinedValueType$_GameId_$103265_$dyn_storage","typeString":"GameId[] storage ref"}},"id":97539,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"6384:23:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6374:33:163","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97543,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":97541,"name":"_n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97530,"src":"6411:2:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":97542,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6417:1:163","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6411:7:163","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6374:44:163","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97547,"nodeType":"IfStatement","src":"6370:63:163","trueBody":{"expression":{"id":97545,"name":"games_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97535,"src":"6427:6:163","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_GameSearchResult_$100374_memory_ptr_$dyn_memory_ptr","typeString":"struct IDisputeGameFactory.GameSearchResult memory[] memory"}},"functionReturnParameters":97536,"id":97546,"nodeType":"Return","src":"6420:13:163"}},{"AST":{"nodeType":"YulBlock","src":"6660:109:163","statements":[{"nodeType":"YulAssignment","src":"6674:21:163","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6690:4:163","type":"","value":"0x40"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"6684:5:163"},"nodeType":"YulFunctionCall","src":"6684:11:163"},"variableNames":[{"name":"games_","nodeType":"YulIdentifier","src":"6674:6:163"}]},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6715:4:163","type":"","value":"0x40"},{"arguments":[{"name":"games_","nodeType":"YulIdentifier","src":"6725:6:163"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6737:4:163","type":"","value":"0x20"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"6747:4:163","type":"","value":"0x05"},{"name":"_n","nodeType":"YulIdentifier","src":"6753:2:163"}],"functionName":{"name":"shl","nodeType":"YulIdentifier","src":"6743:3:163"},"nodeType":"YulFunctionCall","src":"6743:13:163"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6733:3:163"},"nodeType":"YulFunctionCall","src":"6733:24:163"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"6721:3:163"},"nodeType":"YulFunctionCall","src":"6721:37:163"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"6708:6:163"},"nodeType":"YulFunctionCall","src":"6708:51:163"},"nodeType":"YulExpressionStatement","src":"6708:51:163"}]},"evmVersion":"london","externalReferences":[{"declaration":97530,"isOffset":false,"isSlot":false,"src":"6753:2:163","valueSize":1},{"declaration":97535,"isOffset":false,"isSlot":false,"src":"6674:6:163","valueSize":1},{"declaration":97535,"isOffset":false,"isSlot":false,"src":"6725:6:163","valueSize":1}],"id":97548,"nodeType":"InlineAssembly","src":"6651:118:163"},{"body":{"id":97628,"nodeType":"Block","src":"6923:1052:163","statements":[{"assignments":[97562],"declarations":[{"constant":false,"id":97562,"mutability":"mutable","name":"id","nameLocation":"6944:2:163","nodeType":"VariableDeclaration","scope":97628,"src":"6937:9:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"},"typeName":{"id":97561,"nodeType":"UserDefinedTypeName","pathNode":{"id":97560,"name":"GameId","nodeType":"IdentifierPath","referencedDeclaration":103265,"src":"6937:6:163"},"referencedDeclaration":103265,"src":"6937:6:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},"visibility":"internal"}],"id":97566,"initialValue":{"baseExpression":{"id":97563,"name":"_disputeGameList","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97239,"src":"6949:16:163","typeDescriptions":{"typeIdentifier":"t_array$_t_userDefinedValueType$_GameId_$103265_$dyn_storage","typeString":"GameId[] storage ref"}},"id":97565,"indexExpression":{"id":97564,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97550,"src":"6966:1:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6949:19:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},"nodeType":"VariableDeclarationStatement","src":"6937:31:163"},{"assignments":[97569,97572,97575],"declarations":[{"constant":false,"id":97569,"mutability":"mutable","name":"gameType","nameLocation":"6992:8:163","nodeType":"VariableDeclaration","scope":97628,"src":"6983:17:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":97568,"nodeType":"UserDefinedTypeName","pathNode":{"id":97567,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"6983:8:163"},"referencedDeclaration":103271,"src":"6983:8:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},{"constant":false,"id":97572,"mutability":"mutable","name":"timestamp","nameLocation":"7012:9:163","nodeType":"VariableDeclaration","scope":97628,"src":"7002:19:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"},"typeName":{"id":97571,"nodeType":"UserDefinedTypeName","pathNode":{"id":97570,"name":"Timestamp","nodeType":"IdentifierPath","referencedDeclaration":103261,"src":"7002:9:163"},"referencedDeclaration":103261,"src":"7002:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"visibility":"internal"},{"constant":false,"id":97575,"mutability":"mutable","name":"proxy","nameLocation":"7036:5:163","nodeType":"VariableDeclaration","scope":97628,"src":"7023:18:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"},"typeName":{"id":97574,"nodeType":"UserDefinedTypeName","pathNode":{"id":97573,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"7023:12:163"},"referencedDeclaration":100327,"src":"7023:12:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"visibility":"internal"}],"id":97579,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":97576,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97562,"src":"7045:2:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},"id":97577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"unpack","nodeType":"MemberAccess","referencedDeclaration":100777,"src":"7045:9:163","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameId_$103265_$returns$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Timestamp_$103261_$_t_contract$_IDisputeGame_$100327_$bound_to$_t_userDefinedValueType$_GameId_$103265_$","typeString":"function (GameId) pure returns (GameType,Timestamp,contract IDisputeGame)"}},"id":97578,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7045:11:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Timestamp_$103261_$_t_contract$_IDisputeGame_$100327_$","typeString":"tuple(GameType,Timestamp,contract IDisputeGame)"}},"nodeType":"VariableDeclarationStatement","src":"6982:74:163"},{"condition":{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":97586,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":97580,"name":"gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97569,"src":"7075:8:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"id":97581,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101150,"src":"7075:12:163","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameType_$103271_$returns$_t_uint32_$bound_to$_t_userDefinedValueType$_GameType_$103271_$","typeString":"function (GameType) pure returns (uint32)"}},"id":97582,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7075:14:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":97583,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97526,"src":"7093:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"id":97584,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101150,"src":"7093:13:163","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameType_$103271_$returns$_t_uint32_$bound_to$_t_userDefinedValueType$_GameType_$103271_$","typeString":"function (GameType) pure returns (uint32)"}},"id":97585,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7093:15:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"7075:33:163","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97623,"nodeType":"IfStatement","src":"7071:834:163","trueBody":{"id":97622,"nodeType":"Block","src":"7110:795:163","statements":[{"AST":{"nodeType":"YulBlock","src":"7377:80:163","statements":[{"expression":{"arguments":[{"name":"games_","nodeType":"YulIdentifier","src":"7406:6:163"},{"arguments":[{"arguments":[{"name":"games_","nodeType":"YulIdentifier","src":"7424:6:163"}],"functionName":{"name":"mload","nodeType":"YulIdentifier","src":"7418:5:163"},"nodeType":"YulFunctionCall","src":"7418:13:163"},{"kind":"number","nodeType":"YulLiteral","src":"7433:4:163","type":"","value":"0x01"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"7414:3:163"},"nodeType":"YulFunctionCall","src":"7414:24:163"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"7399:6:163"},"nodeType":"YulFunctionCall","src":"7399:40:163"},"nodeType":"YulExpressionStatement","src":"7399:40:163"}]},"evmVersion":"london","externalReferences":[{"declaration":97535,"isOffset":false,"isSlot":false,"src":"7406:6:163","valueSize":1},{"declaration":97535,"isOffset":false,"isSlot":false,"src":"7424:6:163","valueSize":1}],"id":97587,"nodeType":"InlineAssembly","src":"7368:89:163"},{"assignments":[97589],"declarations":[{"constant":false,"id":97589,"mutability":"mutable","name":"extraData","nameLocation":"7488:9:163","nodeType":"VariableDeclaration","scope":97622,"src":"7475:22:163","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":97588,"name":"bytes","nodeType":"ElementaryTypeName","src":"7475:5:163","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":97593,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":97590,"name":"proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97575,"src":"7500:5:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"id":97591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"extraData","nodeType":"MemberAccess","referencedDeclaration":100307,"src":"7500:15:163","typeDescriptions":{"typeIdentifier":"t_function_external_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure external returns (bytes memory)"}},"id":97592,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7500:17:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"7475:42:163"},{"assignments":[97596],"declarations":[{"constant":false,"id":97596,"mutability":"mutable","name":"rootClaim","nameLocation":"7541:9:163","nodeType":"VariableDeclaration","scope":97622,"src":"7535:15:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":97595,"nodeType":"UserDefinedTypeName","pathNode":{"id":97594,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"7535:5:163"},"referencedDeclaration":103255,"src":"7535:5:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"}],"id":97600,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":97597,"name":"proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97575,"src":"7553:5:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"id":97598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"rootClaim","nodeType":"MemberAccess","referencedDeclaration":100294,"src":"7553:15:163","typeDescriptions":{"typeIdentifier":"t_function_external_pure$__$returns$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function () pure external returns (Claim)"}},"id":97599,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7553:17:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"nodeType":"VariableDeclarationStatement","src":"7535:35:163"},{"expression":{"id":97614,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":97601,"name":"games_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97535,"src":"7588:6:163","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_GameSearchResult_$100374_memory_ptr_$dyn_memory_ptr","typeString":"struct IDisputeGameFactory.GameSearchResult memory[] memory"}},"id":97606,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97605,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":97602,"name":"games_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97535,"src":"7595:6:163","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_GameSearchResult_$100374_memory_ptr_$dyn_memory_ptr","typeString":"struct IDisputeGameFactory.GameSearchResult memory[] memory"}},"id":97603,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"7595:13:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":97604,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7611:1:163","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7595:17:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7588:25:163","typeDescriptions":{"typeIdentifier":"t_struct$_GameSearchResult_$100374_memory_ptr","typeString":"struct IDisputeGameFactory.GameSearchResult memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":97608,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97550,"src":"7662:1:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":97609,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97562,"src":"7695:2:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"}},{"id":97610,"name":"timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97572,"src":"7730:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},{"id":97611,"name":"rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97596,"src":"7772:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":97612,"name":"extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97589,"src":"7814:9:163","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_userDefinedValueType$_GameId_$103265","typeString":"GameId"},{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":97607,"name":"GameSearchResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100374,"src":"7616:16:163","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_GameSearchResult_$100374_storage_ptr_$","typeString":"type(struct IDisputeGameFactory.GameSearchResult storage pointer)"}},"id":97613,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":["index","metadata","timestamp","rootClaim","extraData"],"nodeType":"FunctionCall","src":"7616:226:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_GameSearchResult_$100374_memory_ptr","typeString":"struct IDisputeGameFactory.GameSearchResult memory"}},"src":"7588:254:163","typeDescriptions":{"typeIdentifier":"t_struct$_GameSearchResult_$100374_memory_ptr","typeString":"struct IDisputeGameFactory.GameSearchResult memory"}},"id":97615,"nodeType":"ExpressionStatement","src":"7588:254:163"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97619,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":97616,"name":"games_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97535,"src":"7864:6:163","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_GameSearchResult_$100374_memory_ptr_$dyn_memory_ptr","typeString":"struct IDisputeGameFactory.GameSearchResult memory[] memory"}},"id":97617,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"7864:13:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":97618,"name":"_n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97530,"src":"7881:2:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7864:19:163","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97621,"nodeType":"IfStatement","src":"7860:30:163","trueBody":{"id":97620,"nodeType":"Break","src":"7885:5:163"}}]}},{"id":97627,"nodeType":"UncheckedBlock","src":"7919:46:163","statements":[{"expression":{"id":97625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":false,"src":"7947:3:163","subExpression":{"id":97624,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97550,"src":"7947:1:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":97626,"nodeType":"ExpressionStatement","src":"7947:3:163"}]}]},"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":97559,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":97553,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97550,"src":"6899:1:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"hexValue":"30","id":97554,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6904:1:163","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6899:6:163","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97558,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":97556,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97550,"src":"6909:1:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":97557,"name":"_start","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97528,"src":"6914:6:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6909:11:163","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6899:21:163","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97629,"initializationExpression":{"assignments":[97550],"declarations":[{"constant":false,"id":97550,"mutability":"mutable","name":"i","nameLocation":"6887:1:163","nodeType":"VariableDeclaration","scope":97629,"src":"6879:9:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97549,"name":"uint256","nodeType":"ElementaryTypeName","src":"6879:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":97552,"initialValue":{"id":97551,"name":"_start","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97528,"src":"6891:6:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6879:18:163"},"nodeType":"ForStatement","src":"6874:1101:163"}]},"baseFunctions":[100496],"documentation":{"id":97523,"nodeType":"StructuredDocumentation","src":"6012:35:163","text":"@inheritdoc IDisputeGameFactory"},"functionSelector":"254bd683","implemented":true,"kind":"function","modifiers":[],"name":"findLatestGames","nameLocation":"6061:15:163","parameters":{"id":97531,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97526,"mutability":"mutable","name":"_gameType","nameLocation":"6095:9:163","nodeType":"VariableDeclaration","scope":97631,"src":"6086:18:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":97525,"nodeType":"UserDefinedTypeName","pathNode":{"id":97524,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"6086:8:163"},"referencedDeclaration":103271,"src":"6086:8:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},{"constant":false,"id":97528,"mutability":"mutable","name":"_start","nameLocation":"6122:6:163","nodeType":"VariableDeclaration","scope":97631,"src":"6114:14:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97527,"name":"uint256","nodeType":"ElementaryTypeName","src":"6114:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":97530,"mutability":"mutable","name":"_n","nameLocation":"6146:2:163","nodeType":"VariableDeclaration","scope":97631,"src":"6138:10:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97529,"name":"uint256","nodeType":"ElementaryTypeName","src":"6138:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6076:78:163"},"returnParameters":{"id":97536,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97535,"mutability":"mutable","name":"games_","nameLocation":"6228:6:163","nodeType":"VariableDeclaration","scope":97631,"src":"6202:32:163","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_GameSearchResult_$100374_memory_ptr_$dyn_memory_ptr","typeString":"struct IDisputeGameFactory.GameSearchResult[]"},"typeName":{"baseType":{"id":97533,"nodeType":"UserDefinedTypeName","pathNode":{"id":97532,"name":"GameSearchResult","nodeType":"IdentifierPath","referencedDeclaration":100374,"src":"6202:16:163"},"referencedDeclaration":100374,"src":"6202:16:163","typeDescriptions":{"typeIdentifier":"t_struct$_GameSearchResult_$100374_storage_ptr","typeString":"struct IDisputeGameFactory.GameSearchResult"}},"id":97534,"nodeType":"ArrayTypeName","src":"6202:18:163","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_GameSearchResult_$100374_storage_$dyn_storage_ptr","typeString":"struct IDisputeGameFactory.GameSearchResult[]"}},"visibility":"internal"}],"src":"6201:34:163"},"scope":97682,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":97658,"nodeType":"FunctionDefinition","src":"8027:190:163","nodes":[],"body":{"id":97657,"nodeType":"Block","src":"8113:104:163","nodes":[],"statements":[{"expression":{"id":97647,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":97643,"name":"gameImpls","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97221,"src":"8123:9:163","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_GameType_$103271_$_t_contract$_IDisputeGame_$100327_$","typeString":"mapping(GameType => contract IDisputeGame)"}},"id":97645,"indexExpression":{"id":97644,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97635,"src":"8133:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8123:20:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97646,"name":"_impl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97638,"src":"8146:5:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"src":"8123:28:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"id":97648,"nodeType":"ExpressionStatement","src":"8123:28:163"},{"eventCall":{"arguments":[{"arguments":[{"id":97652,"name":"_impl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97638,"src":"8192:5:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}],"id":97651,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8184:7:163","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":97650,"name":"address","nodeType":"ElementaryTypeName","src":"8184:7:163","typeDescriptions":{}}},"id":97653,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8184:14:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":97654,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97635,"src":"8200:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}],"id":97649,"name":"ImplementationSet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100352,"src":"8166:17:163","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_userDefinedValueType$_GameType_$103271_$returns$__$","typeString":"function (address,GameType)"}},"id":97655,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8166:44:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97656,"nodeType":"EmitStatement","src":"8161:49:163"}]},"baseFunctions":[100457],"documentation":{"id":97632,"nodeType":"StructuredDocumentation","src":"7987:35:163","text":"@inheritdoc IDisputeGameFactory"},"functionSelector":"14f6b1a3","implemented":true,"kind":"function","modifiers":[{"id":97641,"kind":"modifierInvocation","modifierName":{"id":97640,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":46877,"src":"8103:9:163"},"nodeType":"ModifierInvocation","src":"8103:9:163"}],"name":"setImplementation","nameLocation":"8036:17:163","parameters":{"id":97639,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97635,"mutability":"mutable","name":"_gameType","nameLocation":"8063:9:163","nodeType":"VariableDeclaration","scope":97658,"src":"8054:18:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":97634,"nodeType":"UserDefinedTypeName","pathNode":{"id":97633,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"8054:8:163"},"referencedDeclaration":103271,"src":"8054:8:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},{"constant":false,"id":97638,"mutability":"mutable","name":"_impl","nameLocation":"8087:5:163","nodeType":"VariableDeclaration","scope":97658,"src":"8074:18:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"},"typeName":{"id":97637,"nodeType":"UserDefinedTypeName","pathNode":{"id":97636,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"8074:12:163"},"referencedDeclaration":100327,"src":"8074:12:163","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"visibility":"internal"}],"src":"8053:40:163"},"returnParameters":{"id":97642,"nodeType":"ParameterList","parameters":[],"src":"8113:0:163"},"scope":97682,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":97681,"nodeType":"FunctionDefinition","src":"8263:180:163","nodes":[],"body":{"id":97680,"nodeType":"Block","src":"8342:101:163","nodes":[],"statements":[{"expression":{"id":97673,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":97669,"name":"initBonds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97227,"src":"8352:9:163","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_GameType_$103271_$_t_uint256_$","typeString":"mapping(GameType => uint256)"}},"id":97671,"indexExpression":{"id":97670,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97662,"src":"8362:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8352:20:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97672,"name":"_initBond","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97664,"src":"8375:9:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8352:32:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":97674,"nodeType":"ExpressionStatement","src":"8352:32:163"},{"eventCall":{"arguments":[{"id":97676,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97662,"src":"8415:9:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},{"id":97677,"name":"_initBond","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97664,"src":"8426:9:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":97675,"name":"InitBondUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100360,"src":"8399:15:163","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_userDefinedValueType$_GameType_$103271_$_t_uint256_$returns$__$","typeString":"function (GameType,uint256)"}},"id":97678,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8399:37:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97679,"nodeType":"EmitStatement","src":"8394:42:163"}]},"baseFunctions":[100466],"documentation":{"id":97659,"nodeType":"StructuredDocumentation","src":"8223:35:163","text":"@inheritdoc IDisputeGameFactory"},"functionSelector":"1e334240","implemented":true,"kind":"function","modifiers":[{"id":97667,"kind":"modifierInvocation","modifierName":{"id":97666,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":46877,"src":"8332:9:163"},"nodeType":"ModifierInvocation","src":"8332:9:163"}],"name":"setInitBond","nameLocation":"8272:11:163","parameters":{"id":97665,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97662,"mutability":"mutable","name":"_gameType","nameLocation":"8293:9:163","nodeType":"VariableDeclaration","scope":97681,"src":"8284:18:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":97661,"nodeType":"UserDefinedTypeName","pathNode":{"id":97660,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"8284:8:163"},"referencedDeclaration":103271,"src":"8284:8:163","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},{"constant":false,"id":97664,"mutability":"mutable","name":"_initBond","nameLocation":"8312:9:163","nodeType":"VariableDeclaration","scope":97681,"src":"8304:17:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97663,"name":"uint256","nodeType":"ElementaryTypeName","src":"8304:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8283:39:163"},"returnParameters":{"id":97668,"nodeType":"ParameterList","parameters":[],"src":"8342:0:163"},"scope":97682,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[{"baseName":{"id":97202,"name":"OwnableUpgradeable","nodeType":"IdentifierPath","referencedDeclaration":46963,"src":"1020:18:163"},"id":97203,"nodeType":"InheritanceSpecifier","src":"1020:18:163"},{"baseName":{"id":97204,"name":"IDisputeGameFactory","nodeType":"IdentifierPath","referencedDeclaration":100497,"src":"1040:19:163"},"id":97205,"nodeType":"InheritanceSpecifier","src":"1040:19:163"},{"baseName":{"id":97206,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"1061:7:163"},"id":97207,"nodeType":"InheritanceSpecifier","src":"1061:7:163"}],"canonicalName":"DisputeGameFactory","contractDependencies":[],"contractKind":"contract","documentation":{"id":97201,"nodeType":"StructuredDocumentation","src":"573:416:163","text":"@title DisputeGameFactory\n @notice A factory contract for creating `IDisputeGame` contracts. All created dispute games are stored in both a\n mapping and an append only array. The timestamp of the creation time of the dispute game is packed tightly\n into the storage slot with the address of the dispute game to make offchain discoverability of playable\n dispute games easier."},"fullyImplemented":true,"linearizedBaseContracts":[97682,109417,100497,46963,48502,47114],"name":"DisputeGameFactory","nameLocation":"998:18:163","scope":97683,"usedErrors":[103105,103111,103123]}],"license":"MIT"},"id":163} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/FaultDisputeGame.json b/packages/sdk/src/forge-artifacts/FaultDisputeGame.json new file mode 100644 index 000000000000..0f6ea9b686d0 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/FaultDisputeGame.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_gameType","type":"uint32","internalType":"GameType"},{"name":"_absolutePrestate","type":"bytes32","internalType":"Claim"},{"name":"_maxGameDepth","type":"uint256","internalType":"uint256"},{"name":"_splitDepth","type":"uint256","internalType":"uint256"},{"name":"_clockExtension","type":"uint64","internalType":"Duration"},{"name":"_maxClockDuration","type":"uint64","internalType":"Duration"},{"name":"_vm","type":"address","internalType":"contract IBigStepper"},{"name":"_weth","type":"address","internalType":"contract IDelayedWETH"},{"name":"_anchorStateRegistry","type":"address","internalType":"contract IAnchorStateRegistry"},{"name":"_l2ChainId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"absolutePrestate","inputs":[],"outputs":[{"name":"absolutePrestate_","type":"bytes32","internalType":"Claim"}],"stateMutability":"view"},{"type":"function","name":"addLocalData","inputs":[{"name":"_ident","type":"uint256","internalType":"uint256"},{"name":"_execLeafIdx","type":"uint256","internalType":"uint256"},{"name":"_partOffset","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"anchorStateRegistry","inputs":[],"outputs":[{"name":"registry_","type":"address","internalType":"contract IAnchorStateRegistry"}],"stateMutability":"view"},{"type":"function","name":"attack","inputs":[{"name":"_parentIndex","type":"uint256","internalType":"uint256"},{"name":"_claim","type":"bytes32","internalType":"Claim"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"claimCredit","inputs":[{"name":"_recipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimData","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"parentIndex","type":"uint32","internalType":"uint32"},{"name":"counteredBy","type":"address","internalType":"address"},{"name":"claimant","type":"address","internalType":"address"},{"name":"bond","type":"uint128","internalType":"uint128"},{"name":"claim","type":"bytes32","internalType":"Claim"},{"name":"position","type":"uint128","internalType":"Position"},{"name":"clock","type":"uint128","internalType":"Clock"}],"stateMutability":"view"},{"type":"function","name":"claimDataLen","inputs":[],"outputs":[{"name":"len_","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"claims","inputs":[{"name":"","type":"bytes32","internalType":"ClaimHash"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"clockExtension","inputs":[],"outputs":[{"name":"clockExtension_","type":"uint64","internalType":"Duration"}],"stateMutability":"view"},{"type":"function","name":"createdAt","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"Timestamp"}],"stateMutability":"view"},{"type":"function","name":"credit","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"defend","inputs":[{"name":"_parentIndex","type":"uint256","internalType":"uint256"},{"name":"_claim","type":"bytes32","internalType":"Claim"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"extraData","inputs":[],"outputs":[{"name":"extraData_","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"type":"function","name":"gameCreator","inputs":[],"outputs":[{"name":"creator_","type":"address","internalType":"address"}],"stateMutability":"pure"},{"type":"function","name":"gameData","inputs":[],"outputs":[{"name":"gameType_","type":"uint32","internalType":"GameType"},{"name":"rootClaim_","type":"bytes32","internalType":"Claim"},{"name":"extraData_","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"gameType","inputs":[],"outputs":[{"name":"gameType_","type":"uint32","internalType":"GameType"}],"stateMutability":"view"},{"type":"function","name":"getChallengerDuration","inputs":[{"name":"_claimIndex","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"duration_","type":"uint64","internalType":"Duration"}],"stateMutability":"view"},{"type":"function","name":"getRequiredBond","inputs":[{"name":"_position","type":"uint128","internalType":"Position"}],"outputs":[{"name":"requiredBond_","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"l1Head","inputs":[],"outputs":[{"name":"l1Head_","type":"bytes32","internalType":"Hash"}],"stateMutability":"pure"},{"type":"function","name":"l2BlockNumber","inputs":[],"outputs":[{"name":"l2BlockNumber_","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"type":"function","name":"l2ChainId","inputs":[],"outputs":[{"name":"l2ChainId_","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"maxClockDuration","inputs":[],"outputs":[{"name":"maxClockDuration_","type":"uint64","internalType":"Duration"}],"stateMutability":"view"},{"type":"function","name":"maxGameDepth","inputs":[],"outputs":[{"name":"maxGameDepth_","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"move","inputs":[{"name":"_challengeIndex","type":"uint256","internalType":"uint256"},{"name":"_claim","type":"bytes32","internalType":"Claim"},{"name":"_isAttack","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"resolve","inputs":[],"outputs":[{"name":"status_","type":"uint8","internalType":"enum GameStatus"}],"stateMutability":"nonpayable"},{"type":"function","name":"resolveClaim","inputs":[{"name":"_claimIndex","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resolvedAt","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"Timestamp"}],"stateMutability":"view"},{"type":"function","name":"resolvedSubgames","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"rootClaim","inputs":[],"outputs":[{"name":"rootClaim_","type":"bytes32","internalType":"Claim"}],"stateMutability":"pure"},{"type":"function","name":"splitDepth","inputs":[],"outputs":[{"name":"splitDepth_","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"startingBlockNumber","inputs":[],"outputs":[{"name":"startingBlockNumber_","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"startingOutputRoot","inputs":[],"outputs":[{"name":"root","type":"bytes32","internalType":"Hash"},{"name":"l2BlockNumber","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"startingRootHash","inputs":[],"outputs":[{"name":"startingRootHash_","type":"bytes32","internalType":"Hash"}],"stateMutability":"view"},{"type":"function","name":"status","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"enum GameStatus"}],"stateMutability":"view"},{"type":"function","name":"step","inputs":[{"name":"_claimIndex","type":"uint256","internalType":"uint256"},{"name":"_isAttack","type":"bool","internalType":"bool"},{"name":"_stateData","type":"bytes","internalType":"bytes"},{"name":"_proof","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"subgames","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"vm","inputs":[],"outputs":[{"name":"vm_","type":"address","internalType":"contract IBigStepper"}],"stateMutability":"view"},{"type":"function","name":"weth","inputs":[],"outputs":[{"name":"weth_","type":"address","internalType":"contract IDelayedWETH"}],"stateMutability":"view"},{"type":"event","name":"Move","inputs":[{"name":"parentIndex","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"claim","type":"bytes32","indexed":true,"internalType":"Claim"},{"name":"claimant","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Resolved","inputs":[{"name":"status","type":"uint8","indexed":true,"internalType":"enum GameStatus"}],"anonymous":false},{"type":"error","name":"AlreadyInitialized","inputs":[]},{"type":"error","name":"AnchorRootNotFound","inputs":[]},{"type":"error","name":"BondTransferFailed","inputs":[]},{"type":"error","name":"CannotDefendRootClaim","inputs":[]},{"type":"error","name":"ClaimAboveSplit","inputs":[]},{"type":"error","name":"ClaimAlreadyExists","inputs":[]},{"type":"error","name":"ClaimAlreadyResolved","inputs":[]},{"type":"error","name":"ClockNotExpired","inputs":[]},{"type":"error","name":"ClockTimeExceeded","inputs":[]},{"type":"error","name":"DuplicateStep","inputs":[]},{"type":"error","name":"GameDepthExceeded","inputs":[]},{"type":"error","name":"GameNotInProgress","inputs":[]},{"type":"error","name":"IncorrectBondAmount","inputs":[]},{"type":"error","name":"InvalidClockExtension","inputs":[]},{"type":"error","name":"InvalidLocalIdent","inputs":[]},{"type":"error","name":"InvalidParent","inputs":[]},{"type":"error","name":"InvalidPrestate","inputs":[]},{"type":"error","name":"InvalidSplitDepth","inputs":[]},{"type":"error","name":"MaxDepthTooLarge","inputs":[]},{"type":"error","name":"NoCreditToClaim","inputs":[]},{"type":"error","name":"OutOfOrderResolution","inputs":[]},{"type":"error","name":"UnexpectedRootClaim","inputs":[{"name":"rootClaim","type":"bytes32","internalType":"Claim"}]},{"type":"error","name":"ValidStep","inputs":[]}],"bytecode":{"object":"0x6101c06040523480156200001257600080fd5b5060405162004dfd38038062004dfd833981016040819052620000359162000187565b620000436001607e62000248565b60ff168811156200006757604051633beff19960e11b815260040160405180910390fd5b878710620000885760405163e62ccf3960e01b815260040160405180910390fd5b620000a7856001600160401b03166200014e60201b620029041760201c565b6001600160401b0316620000cf876001600160401b03166200014e60201b620029041760201c565b6001600160401b03161115620000f85760405163235dfb2b60e21b815260040160405180910390fd5b63ffffffff9099166101205260809790975260a09590955260c0939093526001600160401b039182166101a0521660e0526001600160a01b0390811661010052908116610140521661016052610180526200027a565b90565b80516001600160401b03811681146200016957600080fd5b919050565b6001600160a01b03811681146200018457600080fd5b50565b6000806000806000806000806000806101408b8d031215620001a857600080fd5b8a5163ffffffff81168114620001bd57600080fd5b809a505060208b0151985060408b0151975060608b01519650620001e460808c0162000151565b9550620001f460a08c0162000151565b945060c08b015162000206816200016e565b60e08c015190945062000219816200016e565b6101008c01519093506200022d816200016e565b809250506101208b015190509295989b9194979a5092959850565b600060ff821660ff8416808210156200027157634e487b7160e01b600052601160045260246000fd5b90039392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051614a0b620003f2600039600081816105c60152818161124f0152818161130d015261133701526000818161084a0152612b5501526000818161050b01528181610c1f015261186001526000818161045201528181610da50152818161170701528181611c610152613f310152600081816106a60152818161181f0152612bef01526000818161041f015281816124c6015261281b01526000818161089d015281816111e90152818161127a0152818161136f01528181611e6d01528181611eaf0152612ced0152600081816108d00152818161108f01528181611158015281816112d80152818161231901528181612a1d015281816130fd0152818161382c0152818161395a01528181613a5b0152613b30015260008181610987015281816110fb01528181611f7e015281816120040152818161220f015261233a01526000818161066b01526123d80152614a0b6000f3fe6080604052600436106102bb5760003560e01c80638b85902b1161016e578063d6ae3cd5116100cb578063f8f43ff61161007f578063fa315aa911610064578063fa315aa914610978578063fdffbb28146109ab578063fe2bbeb2146109cb57600080fd5b8063f8f43ff614610934578063fa24f7431461095457600080fd5b8063dabd396d116100b0578063dabd396d1461088e578063ec5e6308146108c1578063eff0f592146108f457600080fd5b8063d6ae3cd51461083b578063d8cc1a3c1461086e57600080fd5b8063c395e1ca11610122578063c6f0308c11610107578063c6f0308c14610763578063cf09e0d0146107ed578063d5d44d801461080e57600080fd5b8063c395e1ca14610730578063c55cd0c71461075057600080fd5b8063bbdc02db11610153578063bbdc02db1461068f578063bcef3b55146106d0578063bd8da9561461071057600080fd5b80638b85902b1461061c5780638d450a951461065c57600080fd5b806357da950e1161021c5780636361506d116101d057806370872aa5116101b557806370872aa5146105ea5780638129fc1c146105ff5780638980e0cc1461060757600080fd5b80636361506d146105775780636b6716c0146105b757600080fd5b8063609d333411610201578063609d33341461052f57806360e2746414610544578063632247ea1461056457600080fd5b806357da950e146104cc5780635c0cba33146104fc57600080fd5b806335fef567116102735780633a768463116102585780633a768463146104105780633fc8cef31461044357806354fd4d501461047657600080fd5b806335fef5671461039a57806337b1b229146103af57600080fd5b806325fc2ace116102a457806325fc2ace146103465780632810e1d6146103655780632ad69aeb1461037a57600080fd5b806319effeb4146102c0578063200d2ed21461030b575b600080fd5b3480156102cc57600080fd5b506000546102ed9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561031757600080fd5b5060005461033990700100000000000000000000000000000000900460ff1681565b60405161030291906142b6565b34801561035257600080fd5b506006545b604051908152602001610302565b34801561037157600080fd5b506103396109fb565b34801561038657600080fd5b506103576103953660046142f7565b610ca0565b6103ad6103a83660046142f7565b610cd1565b005b3480156103bb57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610302565b34801561041c57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103eb565b34801561044f57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103eb565b34801561048257600080fd5b506104bf6040518060400160405280600681526020017f302e31372e30000000000000000000000000000000000000000000000000000081525081565b6040516103029190614384565b3480156104d857600080fd5b506006546007546104e7919082565b60408051928352602083019190915201610302565b34801561050857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103eb565b34801561053b57600080fd5b506104bf610ce6565b34801561055057600080fd5b506103ad61055f3660046143bc565b610cf4565b6103ad6105723660046143f5565b610ea0565b34801561058357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360340135610357565b3480156105c357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ed565b3480156105f657600080fd5b50600754610357565b6103ad6117a0565b34801561061357600080fd5b50600154610357565b34801561062857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135610357565b34801561066857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b34801561069b57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610302565b3480156106dc57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135610357565b34801561071c57600080fd5b506102ed61072b36600461442a565b611cf8565b34801561073c57600080fd5b5061035761074b366004614443565b611ed8565b6103ad61075e3660046142f7565b6120bb565b34801561076f57600080fd5b5061078361077e36600461442a565b6120c7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610302565b3480156107f957600080fd5b506000546102ed9067ffffffffffffffff1681565b34801561081a57600080fd5b506103576108293660046143bc565b60026020526000908152604090205481565b34801561084757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b34801561087a57600080fd5b506103ad6108893660046144be565b61215e565b34801561089a57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ed565b3480156108cd57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b34801561090057600080fd5b5061092461090f36600461442a565b60036020526000908152604090205460ff1681565b6040519015158152602001610302565b34801561094057600080fd5b506103ad61094f366004614548565b61278d565b34801561096057600080fd5b50610969612bed565b60405161030293929190614574565b34801561098457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b3480156109b757600080fd5b506103ad6109c636600461442a565b612c4d565b3480156109d757600080fd5b506109246109e636600461442a565b60056020526000908152604090205460ff1681565b600080600054700100000000000000000000000000000000900460ff166002811115610a2957610a29614287565b14610a60576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc5460ff16610ac4576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600081548110610af057610af0614599565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614610b2b576001610b2e565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617700100000000000000000000000000000000836002811115610bdf57610bdf614287565b021790556002811115610bf457610bf4614287565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c8557600080fd5b505af1158015610c99573d6000803e3d6000fd5b5050505090565b60046020528160005260406000208181548110610cbc57600080fd5b90600052602060002001600091509150505481565b610cdd82826000610ea0565b5050565b905090565b6060610ce16054602061305f565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040812080549082905590819003610d59576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b158015610de957600080fd5b505af1158015610dfd573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610e5b576040519150601f19603f3d011682016040523d82523d6000602084013e610e60565b606091505b5050905080610e9b576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610ecc57610ecc614287565b14610f03576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610f1857610f18614599565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610fdd90839086906130b116565b9050600061107d826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508615806110b857506110b57f000000000000000000000000000000000000000000000000000000000000000060026145f7565b81145b80156110c2575084155b156110f9576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611153576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117e7f000000000000000000000000000000000000000000000000000000000000000060016145f7565b810361119057611190868885886130b9565b3461119a83611ed8565b146111d1576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111dc88611cf8565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690821603611244576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166112a4919061460f565b67ffffffffffffffff166112bf8267ffffffffffffffff1690565b67ffffffffffffffff1611156113a15760006112fc60017f0000000000000000000000000000000000000000000000000000000000000000614638565b83146113325767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611367565b6113677f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261464f565b905061139d817f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1661460f565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526003602052604090205490915060ff161561141f576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008b8152602001908152602001600020600180805490506116b49190614638565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b15801561174c57600080fd5b505af1158015611760573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a450505050505050505050565b60005471010000000000000000000000000000000000900460ff16156117f2576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690637258a807906024016040805180830381865afa1580156118a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ca919061467f565b909250905081611906576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526006829055600781905536607a1461193957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135116119d3576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c0190815282548084018455928a529a5160059092027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf787018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf985015551955182167001000000000000000000000000000000000295909116949094177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b158015611ca757600080fd5b505af1158015611cbb573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611d2657611d26614287565b14611d5d576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018381548110611d7257611d72614599565b600091825260208220600590910201805490925063ffffffff90811614611de157815460018054909163ffffffff16908110611db057611db0614599565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611e1990700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611e2d9067ffffffffffffffff1642614638565b611e4c611e0c846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611e6091906145f7565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff168167ffffffffffffffff1611611ead5780611ecf565b7f00000000000000000000000000000000000000000000000000000000000000005b95945050505050565b600080611f77836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000000811115611fd6576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a80630bebc2006000611ff183836146d2565b9050670de0b6b3a76400006000612028827f00000000000000000000000000000000000000000000000000000000000000006146e6565b90506000612046612041670de0b6b3a7640000866146e6565b613273565b9050600061205484846134ce565b90506000612062838361351d565b9050600061206f8261354b565b9050600061208e82612089670de0b6b3a76400008f6146e6565b613733565b9050600061209c8b8361351d565b90506120a8818d6146e6565b9f9e505050505050505050505050505050565b610cdd82826001610ea0565b600181815481106120d757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff16600281111561218a5761218a614287565b146121c1576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600187815481106121d6576121d6614599565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b90506122357f000000000000000000000000000000000000000000000000000000000000000060016145f7565b6122d1826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161461230b576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156124025761235e7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000614638565b6001901b61237d846fffffffffffffffffffffffffffffffff1661376d565b6fffffffffffffffffffffffffffffffff166123999190614723565b156123d6576123cd6123be60016fffffffffffffffffffffffffffffffff8716614737565b865463ffffffff16600061380c565b600301546123f8565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061242c565b600385015491506124296123be6fffffffffffffffffffffffffffffffff86166001614760565b90505b600882901b60088a8a604051612443929190614794565b6040518091039020901b14612484576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061248f8c6138f0565b9050600061249e836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290612518908f908f908f908f908a906004016147ed565b6020604051808303816000875af1158015612537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255b9190614827565b600485015491149150600090600290612606906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6126a2896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6126ac9190614840565b6126b69190614863565b60ff1615905081151581036126f7576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561274e576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156127b9576127b9614287565b146127f0576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806127ff8661391f565b9350935093509350600061281585858585613d28565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a89190614885565b9050600189036129a35773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84612907367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015612979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061299d9190614827565b50612be2565b600289036129cf5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489612907565b600389036129fb5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487612907565b60048903612b17576000612a416fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000613de2565b600754612a4e91906145f7565b612a599060016145f7565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015612aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b109190614827565b5050612be2565b60058903612bb0576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000000060c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161295a565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356060612c46610ce6565b9050909192565b60008054700100000000000000000000000000000000900460ff166002811115612c7957612c79614287565b14612cb0576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018281548110612cc557612cc5614599565b906000526020600020906005020190506000612ce083611cf8565b905067ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169082161015612d49576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526005602052604090205460ff1615612d92576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600460205260409020805480158015612daf57508415155b15612e49578354640100000000900473ffffffffffffffffffffffffffffffffffffffff1660008115612de25781612dfe565b600186015473ffffffffffffffffffffffffffffffffffffffff165b9050612e0a8187613e90565b505050600093845250506005602052506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006fffffffffffffffffffffffffffffffff815b83811015612f91576000858281548110612e7a57612e7a614599565b6000918252602080832090910154808352600590915260409091205490915060ff16612ed2576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018281548110612ee757612ee7614599565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff16158015612f40575060048101546fffffffffffffffffffffffffffffffff908116908516115b15612f7e576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b505080612f8a906148a2565b9050612e5e565b50612fd973ffffffffffffffffffffffffffffffffffffffff831615612fb75782612fd3565b600187015473ffffffffffffffffffffffffffffffffffffffff165b87613e90565b50845473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff90911617909355505050600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b151760011b90565b60006130d86fffffffffffffffffffffffffffffffff84166001614760565b905060006130e88286600161380c565b9050600086901a83806131d4575061312160027f0000000000000000000000000000000000000000000000000000000000000000614723565b60048301546002906131c5906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6131cf9190614863565b60ff16145b1561322c5760ff8116600114806131ee575060ff81166002145b613227576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016119ca565b61326a565b60ff81161561326a576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016119ca565b50505050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136132d257631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261350b57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b60008160001904831182021561353b5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d7821361357957919050565b680755bf798b4a1bf1e582126135975763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613764670de0b6b3a76400008361374b86613273565b61375591906148da565b61375f9190614996565b61354b565b90505b92915050565b6000806137fa837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b60008082613855576138506fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000613f89565b613870565b613870856fffffffffffffffffffffffffffffffff16614139565b90506001848154811061388557613885614599565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff8281169116146138e857815460018054909163ffffffff169081106138d3576138d3614599565b90600052602060002090600502019150613896565b509392505050565b60008060008060006139018661391f565b935093509350935061391584848484613d28565b9695505050505050565b600080600080600085905060006001828154811061393f5761393f614599565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090613a16906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613a50576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090613b17906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169250821115613b8c57825463ffffffff16613b567f000000000000000000000000000000000000000000000000000000000000000060016145f7565b8303613b60578391505b60018181548110613b7357613b73614599565b9060005260206000209060050201935080945050613a54565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff16613bf5613be0856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015613cc4576000613c2d836fffffffffffffffffffffffffffffffff1661376d565b6fffffffffffffffffffffffffffffffff161115613c98576000613c6f613c6760016fffffffffffffffffffffffffffffffff8616614737565b89600161380c565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50613c9e9050565b6006549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750613d1a565b6000613ce6613c676fffffffffffffffffffffffffffffffff85166001614760565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff841615613d955760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611ecf565b8282604051602001613dc39291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080613e6f847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60028082015473ffffffffffffffffffffffffffffffffffffffff841660009081526020929092526040822080546fffffffffffffffffffffffffffffffff909216928392613ee09084906145f7565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b158015613f7557600080fd5b505af115801561326a573d6000803e3d6000fd5b600081614028846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614062576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61406b83614139565b90508161410a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613767576137646141208360016145f7565b6fffffffffffffffffffffffffffffffff8316906141de565b600081196001830116816141cd827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b60008061426b847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106142f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561430a57600080fd5b50508035926020909101359150565b6000815180845260005b8181101561433f57602081850181015186830182015201614323565b81811115614351576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006137646020830184614319565b73ffffffffffffffffffffffffffffffffffffffff811681146143b957600080fd5b50565b6000602082840312156143ce57600080fd5b81356143d981614397565b9392505050565b803580151581146143f057600080fd5b919050565b60008060006060848603121561440a57600080fd5b8335925060208401359150614421604085016143e0565b90509250925092565b60006020828403121561443c57600080fd5b5035919050565b60006020828403121561445557600080fd5b81356fffffffffffffffffffffffffffffffff811681146143d957600080fd5b60008083601f84011261448757600080fd5b50813567ffffffffffffffff81111561449f57600080fd5b6020830191508360208285010111156144b757600080fd5b9250929050565b600080600080600080608087890312156144d757600080fd5b863595506144e7602088016143e0565b9450604087013567ffffffffffffffff8082111561450457600080fd5b6145108a838b01614475565b9096509450606089013591508082111561452957600080fd5b5061453689828a01614475565b979a9699509497509295939492505050565b60008060006060848603121561455d57600080fd5b505081359360208301359350604090920135919050565b63ffffffff84168152826020820152606060408201526000611ecf6060830184614319565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561460a5761460a6145c8565b500190565b600067ffffffffffffffff83811690831681811015614630576146306145c8565b039392505050565b60008282101561464a5761464a6145c8565b500390565b600067ffffffffffffffff80831681851681830481118215151615614676576146766145c8565b02949350505050565b6000806040838503121561469257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826146e1576146e16146a3565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561471e5761471e6145c8565b500290565b600082614732576147326146a3565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015614630576146306145c8565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561478b5761478b6145c8565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006148016060830187896147a4565b82810360208401526148148186886147a4565b9150508260408301529695505050505050565b60006020828403121561483957600080fd5b5051919050565b600060ff821660ff84168082101561485a5761485a6145c8565b90039392505050565b600060ff831680614876576148766146a3565b8060ff84160691505092915050565b60006020828403121561489757600080fd5b81516143d981614397565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148d3576148d36145c8565b5060010190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561491b5761491b6145c8565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614956576149566145c8565b60008712925087820587128484161615614972576149726145c8565b87850587128184161615614988576149886145c8565b505050929093029392505050565b6000826149a5576149a56146a3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156149f9576149f96145c8565b50059056fea164736f6c634300080f000a","sourceMap":"996:43827:164:-:0;;;4927:1230;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5391:35;5425:1;512:3:176;5391:35:164;:::i;:::-;5375:51;;:13;:51;5371:82;;;5435:18;;-1:-1:-1;;;5435:18:164;;;;;;;;;;;5371:82;5564:13;5549:11;:28;5545:60;;5586:19;;-1:-1:-1;;;5586:19:164;;;;;;;;;;;5545:60;5722:23;:17;-1:-1:-1;;;;;5722:21:164;;;;;;:23;;:::i;:::-;-1:-1:-1;;;;;5698:47:164;:21;:15;-1:-1:-1;;;;;5698:19:164;;;;;;:21;;:::i;:::-;-1:-1:-1;;;;;5698:47:164;;5694:83;;;5754:23;;-1:-1:-1;;;5754:23:164;;;;;;;;;;;5694:83;5788:21;;;;;;5819:37;;;;;-1:-1:-1;5866:30:164;;;;5906:25;;;;;-1:-1:-1;;;;;5941:33:164;;;;;5984:38;;;-1:-1:-1;;;;;6032:8:164;;;;;6050:12;;;;;6072:44;;;6126:24;;996:43827;;2881:145:177;3001:9;2881:145::o;14:198:357:-;115:13;;-1:-1:-1;;;;;157:30:357;;147:41;;137:69;;202:1;199;192:12;137:69;14:198;;;:::o;217:144::-;-1:-1:-1;;;;;305:31:357;;295:42;;285:70;;351:1;348;341:12;285:70;217:144;:::o;366:1384::-;714:6;722;730;738;746;754;762;770;778;786;839:3;827:9;818:7;814:23;810:33;807:53;;;856:1;853;846:12;807:53;888:9;882:16;938:10;931:5;927:22;920:5;917:33;907:61;;964:1;961;954:12;907:61;987:5;977:15;;;1032:2;1021:9;1017:18;1011:25;1001:35;;1076:2;1065:9;1061:18;1055:25;1045:35;;1120:2;1109:9;1105:18;1099:25;1089:35;;1143:72;1210:3;1199:9;1195:19;1143:72;:::i;:::-;1133:82;;1234:72;1301:3;1290:9;1286:19;1234:72;:::i;:::-;1224:82;;1351:3;1340:9;1336:19;1330:26;1365:46;1403:7;1365:46;:::i;:::-;1482:3;1467:19;;1461:26;1430:7;;-1:-1:-1;1496:46:357;1461:26;1496:46;:::i;:::-;1613:3;1598:19;;1592:26;1561:7;;-1:-1:-1;1627:46:357;1592:26;1627:46;:::i;:::-;1692:7;1682:17;;;1739:3;1728:9;1724:19;1718:26;1708:36;;366:1384;;;;;;;;;;;;;:::o;1755:292::-;1793:4;1830;1827:1;1823:12;1862:4;1859:1;1855:12;1887:3;1882;1879:12;1876:135;;;1933:10;1928:3;1924:20;1921:1;1914:31;1968:4;1965:1;1958:15;1996:4;1993:1;1986:15;1876:135;2028:13;;;1755:292;-1:-1:-1;;;1755:292:357:o;:::-;996:43827:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106102bb5760003560e01c80638b85902b1161016e578063d6ae3cd5116100cb578063f8f43ff61161007f578063fa315aa911610064578063fa315aa914610978578063fdffbb28146109ab578063fe2bbeb2146109cb57600080fd5b8063f8f43ff614610934578063fa24f7431461095457600080fd5b8063dabd396d116100b0578063dabd396d1461088e578063ec5e6308146108c1578063eff0f592146108f457600080fd5b8063d6ae3cd51461083b578063d8cc1a3c1461086e57600080fd5b8063c395e1ca11610122578063c6f0308c11610107578063c6f0308c14610763578063cf09e0d0146107ed578063d5d44d801461080e57600080fd5b8063c395e1ca14610730578063c55cd0c71461075057600080fd5b8063bbdc02db11610153578063bbdc02db1461068f578063bcef3b55146106d0578063bd8da9561461071057600080fd5b80638b85902b1461061c5780638d450a951461065c57600080fd5b806357da950e1161021c5780636361506d116101d057806370872aa5116101b557806370872aa5146105ea5780638129fc1c146105ff5780638980e0cc1461060757600080fd5b80636361506d146105775780636b6716c0146105b757600080fd5b8063609d333411610201578063609d33341461052f57806360e2746414610544578063632247ea1461056457600080fd5b806357da950e146104cc5780635c0cba33146104fc57600080fd5b806335fef567116102735780633a768463116102585780633a768463146104105780633fc8cef31461044357806354fd4d501461047657600080fd5b806335fef5671461039a57806337b1b229146103af57600080fd5b806325fc2ace116102a457806325fc2ace146103465780632810e1d6146103655780632ad69aeb1461037a57600080fd5b806319effeb4146102c0578063200d2ed21461030b575b600080fd5b3480156102cc57600080fd5b506000546102ed9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561031757600080fd5b5060005461033990700100000000000000000000000000000000900460ff1681565b60405161030291906142b6565b34801561035257600080fd5b506006545b604051908152602001610302565b34801561037157600080fd5b506103396109fb565b34801561038657600080fd5b506103576103953660046142f7565b610ca0565b6103ad6103a83660046142f7565b610cd1565b005b3480156103bb57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c5b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610302565b34801561041c57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103eb565b34801561044f57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103eb565b34801561048257600080fd5b506104bf6040518060400160405280600681526020017f302e31372e30000000000000000000000000000000000000000000000000000081525081565b6040516103029190614384565b3480156104d857600080fd5b506006546007546104e7919082565b60408051928352602083019190915201610302565b34801561050857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103eb565b34801561053b57600080fd5b506104bf610ce6565b34801561055057600080fd5b506103ad61055f3660046143bc565b610cf4565b6103ad6105723660046143f5565b610ea0565b34801561058357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360340135610357565b3480156105c357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ed565b3480156105f657600080fd5b50600754610357565b6103ad6117a0565b34801561061357600080fd5b50600154610357565b34801561062857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135610357565b34801561066857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b34801561069b57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610302565b3480156106dc57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135610357565b34801561071c57600080fd5b506102ed61072b36600461442a565b611cf8565b34801561073c57600080fd5b5061035761074b366004614443565b611ed8565b6103ad61075e3660046142f7565b6120bb565b34801561076f57600080fd5b5061078361077e36600461442a565b6120c7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610302565b3480156107f957600080fd5b506000546102ed9067ffffffffffffffff1681565b34801561081a57600080fd5b506103576108293660046143bc565b60026020526000908152604090205481565b34801561084757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b34801561087a57600080fd5b506103ad6108893660046144be565b61215e565b34801561089a57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ed565b3480156108cd57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b34801561090057600080fd5b5061092461090f36600461442a565b60036020526000908152604090205460ff1681565b6040519015158152602001610302565b34801561094057600080fd5b506103ad61094f366004614548565b61278d565b34801561096057600080fd5b50610969612bed565b60405161030293929190614574565b34801561098457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610357565b3480156109b757600080fd5b506103ad6109c636600461442a565b612c4d565b3480156109d757600080fd5b506109246109e636600461442a565b60056020526000908152604090205460ff1681565b600080600054700100000000000000000000000000000000900460ff166002811115610a2957610a29614287565b14610a60576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc5460ff16610ac4576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600081548110610af057610af0614599565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614610b2b576001610b2e565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617700100000000000000000000000000000000836002811115610bdf57610bdf614287565b021790556002811115610bf457610bf4614287565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c8557600080fd5b505af1158015610c99573d6000803e3d6000fd5b5050505090565b60046020528160005260406000208181548110610cbc57600080fd5b90600052602060002001600091509150505481565b610cdd82826000610ea0565b5050565b905090565b6060610ce16054602061305f565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040812080549082905590819003610d59576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b158015610de957600080fd5b505af1158015610dfd573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610e5b576040519150601f19603f3d011682016040523d82523d6000602084013e610e60565b606091505b5050905080610e9b576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610ecc57610ecc614287565b14610f03576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610f1857610f18614599565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610fdd90839086906130b116565b9050600061107d826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508615806110b857506110b57f000000000000000000000000000000000000000000000000000000000000000060026145f7565b81145b80156110c2575084155b156110f9576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611153576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117e7f000000000000000000000000000000000000000000000000000000000000000060016145f7565b810361119057611190868885886130b9565b3461119a83611ed8565b146111d1576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111dc88611cf8565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690821603611244576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166112a4919061460f565b67ffffffffffffffff166112bf8267ffffffffffffffff1690565b67ffffffffffffffff1611156113a15760006112fc60017f0000000000000000000000000000000000000000000000000000000000000000614638565b83146113325767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611367565b6113677f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261464f565b905061139d817f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1661460f565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526003602052604090205490915060ff161561141f576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008b8152602001908152602001600020600180805490506116b49190614638565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b15801561174c57600080fd5b505af1158015611760573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a450505050505050505050565b60005471010000000000000000000000000000000000900460ff16156117f2576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690637258a807906024016040805180830381865afa1580156118a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ca919061467f565b909250905081611906576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526006829055600781905536607a1461193957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135116119d3576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c0190815282548084018455928a529a5160059092027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf787018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf985015551955182167001000000000000000000000000000000000295909116949094177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b158015611ca757600080fd5b505af1158015611cbb573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611d2657611d26614287565b14611d5d576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018381548110611d7257611d72614599565b600091825260208220600590910201805490925063ffffffff90811614611de157815460018054909163ffffffff16908110611db057611db0614599565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611e1990700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611e2d9067ffffffffffffffff1642614638565b611e4c611e0c846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611e6091906145f7565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff168167ffffffffffffffff1611611ead5780611ecf565b7f00000000000000000000000000000000000000000000000000000000000000005b95945050505050565b600080611f77836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000000811115611fd6576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a80630bebc2006000611ff183836146d2565b9050670de0b6b3a76400006000612028827f00000000000000000000000000000000000000000000000000000000000000006146e6565b90506000612046612041670de0b6b3a7640000866146e6565b613273565b9050600061205484846134ce565b90506000612062838361351d565b9050600061206f8261354b565b9050600061208e82612089670de0b6b3a76400008f6146e6565b613733565b9050600061209c8b8361351d565b90506120a8818d6146e6565b9f9e505050505050505050505050505050565b610cdd82826001610ea0565b600181815481106120d757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff16600281111561218a5761218a614287565b146121c1576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600187815481106121d6576121d6614599565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b90506122357f000000000000000000000000000000000000000000000000000000000000000060016145f7565b6122d1826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161461230b576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156124025761235e7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000614638565b6001901b61237d846fffffffffffffffffffffffffffffffff1661376d565b6fffffffffffffffffffffffffffffffff166123999190614723565b156123d6576123cd6123be60016fffffffffffffffffffffffffffffffff8716614737565b865463ffffffff16600061380c565b600301546123f8565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061242c565b600385015491506124296123be6fffffffffffffffffffffffffffffffff86166001614760565b90505b600882901b60088a8a604051612443929190614794565b6040518091039020901b14612484576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061248f8c6138f0565b9050600061249e836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290612518908f908f908f908f908a906004016147ed565b6020604051808303816000875af1158015612537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255b9190614827565b600485015491149150600090600290612606906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6126a2896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6126ac9190614840565b6126b69190614863565b60ff1615905081151581036126f7576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561274e576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156127b9576127b9614287565b146127f0576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806127ff8661391f565b9350935093509350600061281585858585613d28565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a89190614885565b9050600189036129a35773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84612907367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015612979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061299d9190614827565b50612be2565b600289036129cf5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489612907565b600389036129fb5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487612907565b60048903612b17576000612a416fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000613de2565b600754612a4e91906145f7565b612a599060016145f7565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015612aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b109190614827565b5050612be2565b60058903612bb0576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000000060c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161295a565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356060612c46610ce6565b9050909192565b60008054700100000000000000000000000000000000900460ff166002811115612c7957612c79614287565b14612cb0576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018281548110612cc557612cc5614599565b906000526020600020906005020190506000612ce083611cf8565b905067ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169082161015612d49576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526005602052604090205460ff1615612d92576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600460205260409020805480158015612daf57508415155b15612e49578354640100000000900473ffffffffffffffffffffffffffffffffffffffff1660008115612de25781612dfe565b600186015473ffffffffffffffffffffffffffffffffffffffff165b9050612e0a8187613e90565b505050600093845250506005602052506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006fffffffffffffffffffffffffffffffff815b83811015612f91576000858281548110612e7a57612e7a614599565b6000918252602080832090910154808352600590915260409091205490915060ff16612ed2576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018281548110612ee757612ee7614599565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff16158015612f40575060048101546fffffffffffffffffffffffffffffffff908116908516115b15612f7e576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b505080612f8a906148a2565b9050612e5e565b50612fd973ffffffffffffffffffffffffffffffffffffffff831615612fb75782612fd3565b600187015473ffffffffffffffffffffffffffffffffffffffff165b87613e90565b50845473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff90911617909355505050600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b151760011b90565b60006130d86fffffffffffffffffffffffffffffffff84166001614760565b905060006130e88286600161380c565b9050600086901a83806131d4575061312160027f0000000000000000000000000000000000000000000000000000000000000000614723565b60048301546002906131c5906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6131cf9190614863565b60ff16145b1561322c5760ff8116600114806131ee575060ff81166002145b613227576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016119ca565b61326a565b60ff81161561326a576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016119ca565b50505050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136132d257631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261350b57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b60008160001904831182021561353b5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d7821361357957919050565b680755bf798b4a1bf1e582126135975763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613764670de0b6b3a76400008361374b86613273565b61375591906148da565b61375f9190614996565b61354b565b90505b92915050565b6000806137fa837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b60008082613855576138506fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000613f89565b613870565b613870856fffffffffffffffffffffffffffffffff16614139565b90506001848154811061388557613885614599565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff8281169116146138e857815460018054909163ffffffff169081106138d3576138d3614599565b90600052602060002090600502019150613896565b509392505050565b60008060008060006139018661391f565b935093509350935061391584848484613d28565b9695505050505050565b600080600080600085905060006001828154811061393f5761393f614599565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090613a16906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613a50576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090613b17906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169250821115613b8c57825463ffffffff16613b567f000000000000000000000000000000000000000000000000000000000000000060016145f7565b8303613b60578391505b60018181548110613b7357613b73614599565b9060005260206000209060050201935080945050613a54565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff16613bf5613be0856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015613cc4576000613c2d836fffffffffffffffffffffffffffffffff1661376d565b6fffffffffffffffffffffffffffffffff161115613c98576000613c6f613c6760016fffffffffffffffffffffffffffffffff8616614737565b89600161380c565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50613c9e9050565b6006549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750613d1a565b6000613ce6613c676fffffffffffffffffffffffffffffffff85166001614760565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff841615613d955760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611ecf565b8282604051602001613dc39291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080613e6f847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60028082015473ffffffffffffffffffffffffffffffffffffffff841660009081526020929092526040822080546fffffffffffffffffffffffffffffffff909216928392613ee09084906145f7565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b158015613f7557600080fd5b505af115801561326a573d6000803e3d6000fd5b600081614028846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614062576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61406b83614139565b90508161410a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613767576137646141208360016145f7565b6fffffffffffffffffffffffffffffffff8316906141de565b600081196001830116816141cd827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b60008061426b847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106142f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561430a57600080fd5b50508035926020909101359150565b6000815180845260005b8181101561433f57602081850181015186830182015201614323565b81811115614351576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006137646020830184614319565b73ffffffffffffffffffffffffffffffffffffffff811681146143b957600080fd5b50565b6000602082840312156143ce57600080fd5b81356143d981614397565b9392505050565b803580151581146143f057600080fd5b919050565b60008060006060848603121561440a57600080fd5b8335925060208401359150614421604085016143e0565b90509250925092565b60006020828403121561443c57600080fd5b5035919050565b60006020828403121561445557600080fd5b81356fffffffffffffffffffffffffffffffff811681146143d957600080fd5b60008083601f84011261448757600080fd5b50813567ffffffffffffffff81111561449f57600080fd5b6020830191508360208285010111156144b757600080fd5b9250929050565b600080600080600080608087890312156144d757600080fd5b863595506144e7602088016143e0565b9450604087013567ffffffffffffffff8082111561450457600080fd5b6145108a838b01614475565b9096509450606089013591508082111561452957600080fd5b5061453689828a01614475565b979a9699509497509295939492505050565b60008060006060848603121561455d57600080fd5b505081359360208301359350604090920135919050565b63ffffffff84168152826020820152606060408201526000611ecf6060830184614319565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561460a5761460a6145c8565b500190565b600067ffffffffffffffff83811690831681811015614630576146306145c8565b039392505050565b60008282101561464a5761464a6145c8565b500390565b600067ffffffffffffffff80831681851681830481118215151615614676576146766145c8565b02949350505050565b6000806040838503121561469257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826146e1576146e16146a3565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561471e5761471e6145c8565b500290565b600082614732576147326146a3565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015614630576146306145c8565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561478b5761478b6145c8565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006148016060830187896147a4565b82810360208401526148148186886147a4565b9150508260408301529695505050505050565b60006020828403121561483957600080fd5b5051919050565b600060ff821660ff84168082101561485a5761485a6145c8565b90039392505050565b600060ff831680614876576148766146a3565b8060ff84160691505092915050565b60006020828403121561489757600080fd5b81516143d981614397565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148d3576148d36145c8565b5060010190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561491b5761491b6145c8565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614956576149566145c8565b60008712925087820587128484161615614972576149726145c8565b87850587128184161615614988576149886145c8565b505050929093029392505050565b6000826149a5576149a56146a3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156149f9576149f96145c8565b50059056fea164736f6c634300080f000a","sourceMap":"996:43827:164:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3113:27;;;;;;;;;;-1:-1:-1;3113:27:164;;;;;;;;;;;;;;221:18:357;209:31;;;191:50;;179:2;164:18;3113:27:164;;;;;;;;3180:24;;;;;;;;;;-1:-1:-1;3180:24:164;;;;;;;;;;;;;;;;;;:::i;22098:135::-;;;;;;;;;;-1:-1:-1;22203:18:164;:23;22098:135;;;1021:25:357;;;1009:2;994:18;22098:135:164;848:204:357;22480:905:164;;;;;;;;;;;;;:::i;3777:45::-;;;;;;;;;;-1:-1:-1;3777:45:164;;;;;:::i;:::-;;:::i;19512:119::-;;;;;;:::i;:::-;;:::i;:::-;;27482:110;;;;;;;;;;-1:-1:-1;14565:14:97;14561:22;;;14548:36;14543:3;14539:46;14519:67;;1993:36;1989:2;1985:45;27482:110:164;;;1949:42:357;1937:55;;;1919:74;;1907:2;1892:18;27482:110:164;1773:226:357;34509:79:164;;;;;;;;;;-1:-1:-1;34579:2:164;34509:79;;34653:88;;;;;;;;;;-1:-1:-1;34730:4:164;34653:88;;2918:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4061:36::-;;;;;;;;;;-1:-1:-1;4061:36:164;;;;;;;;;;;;;3473:25:357;;;3529:2;3514:18;;3507:34;;;;3446:18;4061:36:164;3272:275:357;34807:136:164;;;;;;;;;;-1:-1:-1;34915:21:164;34807:136;;27942:231;;;;;;;;;;;;;:::i;31160:671::-;;;;;;;;;;-1:-1:-1;31160:671:164;;;;;:::i;:::-;;:::i;14106:5200::-;;;;;;:::i;:::-;;:::i;27792:111::-;;;;;;;;;;-1:-1:-1;14565:14:97;14561:22;;;14548:36;14543:3;14539:46;14519:67;;27890:4:164;3514:22:97;3501:36;27792:111:164;27482:110;34331:125;;;;;;;;;;-1:-1:-1;34434:15:164;34331:125;;21898:156;;;;;;;;;;-1:-1:-1;22015:32:164;;21898:156;;6198:2903;;;:::i;33244:101::-;;;;;;;;;;-1:-1:-1;33322:9:164;:16;33244:101;;21730:124;;;;;;;;;;-1:-1:-1;14565:14:97;14561:22;;;14548:36;14543:3;14539:46;14519:67;;21842:4:164;3514:22:97;3501:36;21730:124:164;27482:110;33631:130;;;;;;;;;;-1:-1:-1;33737:17:164;33631:130;;27335:108;;;;;;;;;;-1:-1:-1;27335:108:164;;5615:10:357;27427:9:164;5603:23:357;5585:42;;5573:2;5558:18;27335:108:164;5409:224:357;27631:122:164;;;;;;;;;;-1:-1:-1;14565:14:97;14561:22;;;14548:36;14543:3;14539:46;14519:67;;27740:4:164;3514:22:97;3501:36;27631:122:164;27482:110;32166:1011;;;;;;;;;;-1:-1:-1;32166:1011:164;;;;;:::i;:::-;;:::i;28849:2171::-;;;;;;;;;;-1:-1:-1;28849:2171:164;;;;;:::i;:::-;;:::i;19350:118::-;;;;;;:::i;:::-;;:::i;3405:28::-;;;;;;;;;;-1:-1:-1;3405:28:164;;;;;:::i;:::-;;:::i;:::-;;;;6590:10:357;6578:23;;;6560:42;;6621;6699:15;;;6694:2;6679:18;;6672:43;6751:15;;;;6731:18;;;6724:43;;;;6786:34;6856:15;;;6851:2;6836:18;;6829:43;6903:3;6888:19;;6881:35;6953:15;;;6947:3;6932:19;;6925:44;7006:15;7000:3;6985:19;;6978:44;6547:3;6532:19;3405:28:164;6160:868:357;3017:26:164;;;;;;;;;;-1:-1:-1;3017:26:164;;;;;;;;3500:41;;;;;;;;;;-1:-1:-1;3500:41:164;;;;;:::i;:::-;;;;;;;;;;;;;;35032:105;;;;;;;;;;-1:-1:-1;35119:11:164;35032:105;;9353:4442;;;;;;;;;;-1:-1:-1;9353:4442:164;;;;;:::i;:::-;;:::i;34137:134::-;;;;;;;;;;-1:-1:-1;34246:18:164;34137:134;;33975:108;;;;;;;;;;-1:-1:-1;34065:11:164;33975:108;;3629:40;;;;;;;;;;-1:-1:-1;3629:40:164;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8626:14:357;;8619:22;8601:41;;8589:2;8574:18;3629:40:164;8461:187:357;19675:2011:164;;;;;;;;;;-1:-1:-1;19675:2011:164;;;;;:::i;:::-;;:::i;28212:213::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;33811:117::-;;;;;;;;;;-1:-1:-1;33907:14:164;33811:117;;23429:3867;;;;;;;;;;-1:-1:-1;23429:3867:164;;;;;:::i;:::-;;:::i;3912:48::-;;;;;;;;;;-1:-1:-1;3912:48:164;;;;;:::i;:::-;;;;;;;;;;;;;;;;22480:905;22517:18;;22639:6;;;;;;;:32;;;;;;;;:::i;:::-;;22635:64;;22680:19;;;;;;;;;;;;;;22635:64;22813:19;;;:16;:19;;;;;;22808:55;;22841:22;;;;;;;;;;;;;;22808:55;22989:1;22953:38;;:9;22963:1;22953:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:24;;;;;;:38;:94;;23021:26;22953:94;;;22994:24;22953:94;23057:10;:52;;;23092:15;23057:52;;;;;;;;;;22943:104;;-1:-1:-1;22943:104:164;;23239:16;;;;;;;;22943:104;23239:16;;;;;;;;:::i;:::-;;;;;23230:26;;;;;;;;:::i;:::-;;;;;;;;23334:21;:42;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22480:905;:::o;3777:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19512:119::-;19591:33;19596:12;19610:6;19618:5;19591:4;:33::i;:::-;19512:119;;:::o;27565:20::-;27554:31;;27482:110;:::o;27942:231::-;27984:23;28142:24;28155:4;28161;28142:12;:24::i;31160:671::-;31333:18;;;31307:23;31333:18;;;:6;:18;;;;;;;31361:22;;;;31333:18;31457:20;;;31453:75;;31500:17;;;;;;;;;;;;;;31453:75;31605:42;;;;;:13;9795:55:357;;;31605:42:164;;;9777:74:357;9867:18;;;9860:34;;;31605:4:164;:13;;;;9750:18:357;;31605:42:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31708:12;31725:10;:15;;31749;31725:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31707:66;;;31788:7;31783:41;;31804:20;;;;;;;;;;;;;;31783:41;31210:621;;31160:671;:::o;14106:5200::-;14307:22;14297:6;;;;;;;:32;;;;;;;;:::i;:::-;;14293:64;;14338:19;;;;;;;;;;;;;;14293:64;14448:23;14474:9;14484:15;14474:26;;;;;;;;:::i;:::-;;;;;;;;;14448:52;;;;;;;;14474:26;;;;;;;14448:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14448:52:164;;14474:26;14829:25;;14448:52;;14844:9;;14829:14;:25;:::i;:::-;14805:49;;14864:25;14892:20;:12;:18;;2237:66:176;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;14892:20:164;14864:48;;;-1:-1:-1;15259:20:164;;;:60;;-1:-1:-1;15304:15:164;:11;15318:1;15304:15;:::i;:::-;15283:17;:36;15259:60;15258:76;;;;;15325:9;15324:10;15258:76;15254:137;;;15357:23;;;;;;;;;;;;;;15254:137;15752:14;15732:17;:34;15728:66;;;15775:19;;;;;;;;;;;;;;15728:66;16022:15;:11;16036:1;16022:15;:::i;:::-;16001:17;:36;15997:138;;16053:71;16078:6;16086:15;16103:9;16114;16053:24;:71::i;:::-;16258:9;16225:29;16241:12;16225:15;:29::i;:::-;:42;16221:76;;16276:21;;;;;;;;;;;;;;16221:76;16530:21;16554:38;16576:15;16554:21;:38::i;:::-;16530:62;-1:-1:-1;16764:22:164;:18;:22;;16742:16;;;:46;16738:78;;16797:19;;;;;;;;;;;;;;16738:78;17525:19;:15;:19;17498:22;:18;:22;:48;;;;:::i;:::-;17477:69;;:18;:12;:16;;3001:9:177;2881:145;17477:18:164;:69;;;17473:424;;;17671:22;17733:15;17747:1;17733:11;:15;:::i;:::-;17712:17;:36;:88;;17779:19;:15;:19;17712:88;;;17751:25;:15;:19;;17775:1;17751:25;:::i;:::-;17671:129;-1:-1:-1;17843:42:164;17671:129;17843:18;:22;;:42;:::i;:::-;17814:72;;17548:349;17473:424;17998:15;668:4:177;664:20;;;18066:15:164;661:36:177;18368:19:164;758:20:175;;;811:3;807:19;;;832:34;828:56;;804:81;798:4;791:95;929:4;913:21;;17998:86:164;;-1:-1:-1;18368:19:164;18454:17;;;;:6;:17;;;;;;18368:72;;-1:-1:-1;18454:17:164;;18450:50;;;18480:20;;;;;;;;;;;;;;18450:50;18530:4;18510:6;:17;18517:9;18510:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;18578:9;18606:366;;;;;;;;18654:15;18606:366;;;;;;18770:1;18606:366;;;;;;18800:10;18606:366;;;;;;18842:9;18606:366;;;;;;18877:6;18606:366;;;;18911:12;18606:366;;;;;;18948:9;18606:366;;;;;18578:404;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19051:8;:25;19060:15;19051:25;;;;;;;;;;;19101:1;19082:9;:16;;;;:20;;;;:::i;:::-;19051:52;;;;;;;-1:-1:-1;19051:52:164;;;;;;;;19143:34;;;;;;;;:12;:4;:12;;;;19164:9;;19143:34;;;;;-1:-1:-1;19143:34:164;;;;;19164:9;19143:12;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19258:41:164;;19288:10;;-1:-1:-1;19280:6:164;;-1:-1:-1;19263:15:164;;-1:-1:-1;19258:41:164;;;;;14198:5108;;;;;;;14106:5200;;;:::o;6198:2903::-;6888:11;;;;;;;6884:44;;;6908:20;;;;;;;;;;;;;;6884:44;7018:40;;;;;;7048:9;5603:23:357;7018:40:164;;;5585:42:357;6980:9:164;;;;7018:29;:21;:29;;;;5558:18:357;;7018:40:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6979:79;;-1:-1:-1;6979:79:164;-1:-1:-1;6979:79:164;7155:57;;7192:20;;;;;;;;;;;;;;7155:57;7285:58;;;;;;;;;;;;;;;;;7264:18;:79;;;;;;;7960:14;7976:4;7957:24;7947:195;;8082:10;8076:4;8069:24;8123:4;8117;8110:18;7947:195;8339:15;14565:14:97;14561:22;;;14548:36;14543:3;14539:46;14519:67;;21842:4:164;3514:22:97;3501:36;8320:34:164;8316:79;;8363:32;;;;;14565:14:97;14561:22;;;14548:36;14543:3;14539:46;14519:67;;27740:4:164;3514:22:97;3501:36;8363:32:164;;;1021:25:357;994:18;;8363:32:164;;;;;;;;8316:79;8464:370;;;;;;;;8505:16;8464:370;;;-1:-1:-1;8464:370:164;;;;;;14561:22:97;14565:14;14561:22;;;14548:36;14543:3;14539:46;14519:67;;1993:36;;1989:2;1985:45;;;8464:370:164;;;;;;8635:9;8464:370;;;;;;;;;;27740:4;3514:22:97;;;3501:36;8464:370:164;;;;;;8436:9;8464:370;;;;;;8801:15;8464:370;;;;;;;;8436:408;;;;;;;;;;;;;;;;;;;;;;;8464:370;8436:408;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8895:18;;;;;;;;8953:34;;;;;;;:4;:12;;;;;;8635:9;8436:408;8953:34;;;;-1:-1:-1;8953:34:164;;;;;8635:9;8953:12;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9043:9:164;:51;;;;9077:15;9043:51;;;;;-1:-1:-1;;;;;6198:2903:164:o;32166:1011::-;32239:18;;32381:6;;;;;;;:32;;;;;;;;:::i;:::-;;32377:89;;32436:19;;;;;;;;;;;;;;32377:89;32517:34;32554:9;32564:11;32554:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;32689:28;;32554:22;;-1:-1:-1;32721:16:164;32689:28;;;:48;32685:138;;32777:28;;32767:9;:39;;:9;;32777:28;;;32767:39;;;;;;:::i;:::-;;;;;;;;;;;:45;;;;;;;;;;;;32753:59;;32685:138;33006:22;;;;32910:24;;33006:40;;:22;;;1624:28:177;;33006:34:164;:38;;3001:9:177;2881:145;33006:40:164;32988:58;;;;:15;:58;:::i;:::-;32956:28;:22;:11;:20;;1135:4:177;1131:17;;913:251;32956:28:164;:91;;;;;;:::i;:::-;32910:138;-1:-1:-1;33090:22:164;:18;:22;33070:44;;:17;:44;;;:100;;33152:17;33070:100;;;33117:18;33070:100;33058:112;32166:1011;-1:-1:-1;;;;;32166:1011:164:o;28849:2171::-;28915:21;28948:13;28972:17;:9;:15;;2237:66:176;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;28972:17:164;28964:26;;28948:42;;29012:14;29004:5;:22;29000:54;;;29035:19;;;;;;;;;;;;;;29000:54;29145:8;29188:7;29230:11;29120:22;29997:31;29188:7;29230:11;29997:31;:::i;:::-;29985:43;-1:-1:-1;2458:4:98;30038:9:164;30093:38;2458:4:98;30093:14:164;:38;:::i;:::-;30081:50;-1:-1:-1;30228:11:164;30250:58;30281:25;2458:4:98;30281:1:164;:25;:::i;:::-;30250:23;:58::i;:::-;30228:81;;30386:14;30403:30;30428:1;30431;30403:24;:30::i;:::-;30386:47;;30567:17;30587:37;30612:3;30617:6;30587:24;:37::i;:::-;30567:57;;30634:11;30648:43;30680:9;30648:24;:43::i;:::-;30634:57;-1:-1:-1;30746:13:164;30762:69;30634:57;30800:29;2458:4:98;30800:5:164;:29;:::i;:::-;30762:24;:69::i;:::-;30746:85;;30841:19;30863:57;30888:14;30912:6;30863:24;:57::i;:::-;30841:79;-1:-1:-1;30985:28:164;30841:79;30985:14;:28;:::i;:::-;30969:44;28849:2171;-1:-1:-1;;;;;;;;;;;;;;;28849:2171:164:o;19350:118::-;19429:32;19434:12;19448:6;19456:4;19429;:32::i;3405:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3405:28:164;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9353:4442::-;9636:22;9626:6;;;;;;;:32;;;;;;;;:::i;:::-;;9622:64;;9667:19;;;;;;;;;;;;;;9622:64;9777:24;9804:9;9814:11;9804:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;9910:15;;;;9804:22;;-1:-1:-1;9910:15:164;;;8619:17:176;;8616:32;;8613:1;8609:40;9982:44:164;-1:-1:-1;10161:18:164;:14;10178:1;10161:18;:::i;:::-;10142:15;:7;:13;;2237:66:176;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;10142:15:164;:37;;;10138:65;;10188:15;;;;;;;;;;;;;;10138:65;10279:19;10308:27;10349:9;10345:1343;;;11080:28;11097:11;11080:14;:28;:::i;:::-;11074:1;:35;;11048:22;:7;:20;;;:22::i;:::-;:62;;;;;;:::i;:::-;11047:69;:211;;11171:81;11204:19;11222:1;11204:13;;;:19;:::i;:::-;11226:18;;;;;11171;:81::i;:::-;:87;;;11047:211;;;11135:17;11047:211;11031:227;;11351:6;11339:18;;10345:1343;;;11558:12;;;;;-1:-1:-1;11596:81:164;11629:19;:13;;;11647:1;11629:19;:::i;11596:81::-;11584:93;;10345:1343;12084:1;12061:13;:24;;12056:1;12041:10;;12031:21;;;;;;;:::i;:::-;;;;;;;;:26;;:54;12027:84;;12094:17;;;;;;;;;;;;;;12027:84;12182:9;12194:30;12212:11;12194:17;:30::i;:::-;12182:42;;13197:14;13257:21;:9;:15;;;3001:9:177;2881:145;13257:21:164;13214:39;;;;;:2;:7;;;;;:39;;13222:10;;;;13234:6;;;;13242:4;;13214:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13332:18;;;;13214:64;;;-1:-1:-1;13288:20:164;;13362:1;;13332:26;;:18;;2237:66:176;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;13332:26:164;13312:17;:9;:15;;2237:66:176;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;13312:17:164;:46;;;;:::i;:::-;13311:52;;;;:::i;:::-;:57;;;;-1:-1:-1;13382:28:164;;;;;13378:52;;13419:11;;;;;;;;;;;;;;13378:52;13524:18;;;;;:32;:18;:32;13520:60;;13565:15;;;;;;;;;;;;;;13520:60;-1:-1:-1;;13757:31:164;;;;13778:10;13757:31;;;;;;-1:-1:-1;;;;;;;;;;;9353:4442:164:o;19675:2011::-;19878:22;19868:6;;;;;;;:32;;;;;;;;:::i;:::-;;19864:64;;19909:19;;;;;;;;;;;;;;19864:64;19940:14;19956:20;19978:14;19994:20;20030:45;20062:12;20030:31;:45::i;:::-;19939:136;;;;;;;;20085:9;20097:66;20118:8;20128:11;20141:8;20151:11;20097:20;:66::i;:::-;20085:78;;20174:22;20199:2;:9;;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20174:36;;5253:4:194;20224:6:164;:39;20220:1460;;20316:20;;;;20337:6;20345:4;20357:14;14565::97;14561:22;;;14548:36;14543:3;14539:46;14519:67;;27890:4:164;3514:22:97;3501:36;3001:9:177;2881:145;20357:8:164;3001:9:177;2881:145;20357:14:164;20316:73;;;;;;;;;;;;;14739:25:357;;;;14780:18;;;14773:34;;;;14823:18;;;14816:34;20373:2:164;14866:18:357;;;14859:34;14909:19;;;14902:35;;;14711:19;;20316:73:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20220:1460;;;5374:4:194;20410:6:164;:47;20406:1274;;20530:20;;;;20551:6;20559:4;20571:8;:14;2881:145:177;20406:1274:164;5495:4:194;20624:6:164;:47;20620:1060;;20743:20;;;;20764:6;20772:4;20784:8;:14;2881:145:177;20620:1060:164;5624:4:194;20837:6:164;:51;20833:847;;21168:16;21222:35;:22;;;21245:11;21222:22;:35::i;:::-;21187:32;;:70;;;;:::i;:::-;:74;;21260:1;21187:74;:::i;:::-;21168:93;-1:-1:-1;21276:20:164;;;;21297:6;21305:4;21276:83;;;;;;;;;;;;;14739:25:357;;;;14780:18;;;14773:34;21337:4:164;21325:16;;;14823:18:357;;;14816:34;21344:1:164;14866:18:357;;;14859:34;14909:19;;;14902:35;;;14711:19;;21276:83:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20890:480;20833:847;;;5721:4:194;21380:6:164;:35;21376:304;;21526:86;;;;;;;;14739:25:357;;;14780:18;;;14773:34;;;21575:11:164;21590:4;21575:19;14823:18:357;;;14816:34;21597:1:164;14866:18:357;;;14859:34;14909:19;;;14902:35;;;21526:20:164;;;;;;14711:19:357;;21526:86:164;14471:472:357;21376:304:164;21650:19;;;;;;;;;;;;;;21376:304;19765:1921;;;;;;19675:2011;;;:::o;28212:213::-;27427:9;14565:14:97;14561:22;;;14548:36;14543:3;14539:46;14519:67;;27740:4:164;3514:22:97;3501:36;28293:23:164;28407:11;:9;:11::i;:::-;28394:24;;28212:213;;;:::o;23429:3867::-;23593:22;23583:6;;;;;;;:32;;;;;;;;:::i;:::-;;23579:64;;23624:19;;;;;;;;;;;;;;23579:64;23654:34;23691:9;23701:11;23691:22;;;;;;;;:::i;:::-;;;;;;;;;;;23654:59;;23723:31;23757:34;23779:11;23757:21;:34::i;:::-;23723:68;-1:-1:-1;24102:22:164;:18;:22;;24071:26;;;:55;24067:85;;;24135:17;;;;;;;;;;;;;;24067:85;24221:29;;;;:16;:29;;;;;;;;24217:64;;;24259:22;;;;;;;;;;;;;;24217:64;24292:34;24329:21;;;:8;:21;;;;;24390:23;;24576:24;;:44;;;;-1:-1:-1;24604:16:164;;;24576:44;24572:805;;;25109:28;;;;;;;25087:19;25171:25;;:67;;25227:11;25171:67;;;25199:25;;;;;;25171:67;25151:87;;25252:44;25268:9;25279:16;25252:15;:44::i;:::-;-1:-1:-1;;;25310:29:164;;;;-1:-1:-1;;25310:16:164;:29;;-1:-1:-1;25310:29:164;;;:36;;;;25342:4;25310:36;;;23429:3867::o;24572:805::-;25445:17;25526;25445;25554:1129;25578:19;25574:1;:23;25554:1129;;;25618:22;25643:16;25660:1;25643:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;25764:32;;;:16;:32;;;;;;;;25643:19;;-1:-1:-1;25764:32:164;;25759:68;;25805:22;;;;;;;;;;;;;;25759:68;25842:23;25868:9;25878:14;25868:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;26483:17;;25868:25;;-1:-1:-1;26483:17:164;;;:31;:17;:31;:79;;;;-1:-1:-1;26542:14:164;;;;;;;;26518:19;;;:44;26483:79;26479:194;;;26594:14;;;;26644;;;;26594;;;;;-1:-1:-1;26644:14:164;;;-1:-1:-1;26479:194:164;25604:1079;;25599:3;;;;:::i;:::-;;;25554:1129;;;-1:-1:-1;26891:98:164;26907:23;;;;:63;;26961:9;26907:63;;;26933:25;;;;;;26907:63;26972:16;26891:15;:98::i;:::-;-1:-1:-1;27161:40:164;;;;;;;;;;;;;;;;-1:-1:-1;;;27161:28:164;27253:29;;;:16;:29;;;;;:36;;;;-1:-1:-1;27253:36:164;;;23429:3867::o;1122:588:97:-;1389:4;1383:11;1407:19;;;14565:14;14561:22;;;14548:36;14543:3;14539:46;14519:67;;1407:19;1489:22;;;1482:4;1473:14;;1460:60;1562:6;1555:4;1550:3;1546:14;1542:27;1592:1;1589;1582:12;1664:4;1661:1;1657:12;1651:4;1644:26;;1362:342;1122:588;;;;:::o;8478:187:176:-;8619:17;8616:32;8613:1;8609:40;;8478:187::o;36108:1977:164:-;36860:24;36901:20;:14;;;36920:1;36901:20;:::i;:::-;36860:62;;36932:26;36961:80;36988:15;37013:10;37034:4;36961:18;:80::i;:::-;36932:109;-1:-1:-1;37051:14:164;37074:19;;;37109:9;;:61;;-1:-1:-1;37155:15:164;37169:1;37155:11;:15;:::i;:::-;37122:17;;;;37150:1;;37122:25;;:17;;2237:66:176;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;37122:25:164;:29;;;;:::i;:::-;:48;;;37109:61;37105:974;;;37648:36;;;4806:1:194;37648:36:164;;:74;;-1:-1:-1;37688:34:164;;;4900:1:194;37688:34:164;37648:74;37642:154;;37750:31;;;;;;;;1021:25:357;;;994:18;;37750:31:164;848:204:357;37642:154:164;37105:974;;;37816:34;;;;37812:267;;38037:31;;;;;;;;1021:25:357;;;994:18;;38037:31:164;848:204:357;37812:267:164;36289:1796;;;36108:1977;;;;:::o;11843:3927:98:-;12373:34;12370:41;-1:-1:-1;12367:1:98;12363:49;12466:9;;;12446:18;12443:33;12440:1;12436:41;12430:48;12524:9;;;12512:10;12509:25;12506:1;12502:33;12496:40;12578:9;;;12570:6;12567:21;12564:1;12560:29;12554:36;12630:9;;;12624:4;12621:19;12618:1;12614:27;12608:34;11891:8;12739:9;;12729:135;;12781:10;12775:4;12768:24;12845:4;12839;12832:18;12729:135;13016:66;12962:34;12951:9;;;12947:50;12941:4;12937:61;12932:151;12925:159;13210:9;;;13205:3;13201:19;;;14173:31;14169:39;;14272:9;;13660:2;14264:18;;;14230:32;14226:57;14348:9;;14340:18;;14305:33;14301:58;14424:9;;14416:18;;14381:33;14377:58;14500:9;;14492:18;;14457:33;14453:58;14575:9;;14567:18;;14533:32;14529:57;14648:9;;14640:18;;14608:30;14604:55;13672:31;13668:59;;13664:67;;13656:76;;13606:32;13602:131;13598:139;;13590:148;;13540:32;13536:203;13532:211;;13524:220;;13430:349;;13809:9;;13801:18;;13797:57;;13884:9;;13876:18;;;13872:57;;13951:9;;;13947:55;;15131:10;15261:43;15257:51;15499:11;;;15426:71;15422:89;15418:97;15595:72;15591:80;15747:3;15743:11;;11843:3927::o;5293:468::-;5354:9;5574:16;5568:23;;5586:3;5559:33;5552:41;5545:49;;5535:173;;5627:10;5621:4;5614:24;5689:4;5683;5676:18;5535:173;-1:-1:-1;5737:3:98;5730:11;;;;5726:19;;5293:468::o;2809:424::-;2870:9;3063:1;3059;3055:6;3051:14;3048:1;3045:21;3042:1;3038:29;3035:145;;;3099:10;3093:4;3086:24;3161:4;3155;3148:18;3035:145;-1:-1:-1;3213:3:98;3202:9;;3198:19;;2809:424::o;8260:3448::-;8309:8;8504:21;8499:1;:26;8495:40;;8260:3448;;;:::o;8495:40::-;8841:21;8838:1;8834:29;8824:164;;8900:10;8894:4;8887:24;8965:4;8959;8952:18;8824:164;9280:7;9274:2;9269:7;;;9268:19;;-1:-1:-1;9551:8:98;9619:2;9575:29;9564:7;;;9563:41;9607:7;9563:51;9562:59;;9647:29;9643:33;;9639:37;;;10328:35;;;10383:5;;9959:2;10382:13;;;10399:32;10381:50;10451:5;;10450:13;;10449:51;;10520:5;;10519:13;;10536:34;10518:52;10590:5;;10589:13;;10588:53;;10661:5;;10660:13;;10677:35;10659:53;9965:32;9898:31;9894:35;;9949:5;;9948:13;;9947:50;;;10022:5;;;:40;;10082:5;10081:13;;;10098:35;10080:53;10151:5;;;10160:40;10151:50;11079:10;11607:49;11594:62;11669:3;:7;;;;11593:84;;;;;;-1:-1:-1;;8260:3448:98:o;7938:186::-;7997:6;8081:36;2458:4;8100:1;8089:8;8095:1;8089:5;:8::i;:::-;:12;;;;:::i;:::-;8088:28;;;;:::i;:::-;8081:6;:36::i;:::-;8074:43;;7938:186;;;;;:::o;2826:363:176:-;2891:21;3066:11;3080:16;3086:9;2237:66;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;3080:16;3170:1;3066:30;;;;;3161:11;3146:27;;;;2826:363;-1:-1:-1;;2826:363:176:o;38605:677:164:-;38755:27;38854:25;38882:7;:71;;38915:38;:25;;;38941:11;38915:25;:38::i;:::-;38882:71;;;38892:20;:4;:18;;;:20::i;:::-;38854:99;;39121:9;39131:6;39121:17;;;;;;;;:::i;:::-;;;;;;;;;;;39109:29;;39148:128;39155:18;;;;39183:20;;;;39155:18;;:50;39148:128;;39243:21;;39233:9;:32;;:9;;39243:21;;;39233:32;;;;;;:::i;:::-;;;;;;;;;;;39221:44;;39148:128;;;38788:494;38605:677;;;;;:::o;43519:319::-;43590:10;43613:14;43629:20;43651:14;43667:20;43703:44;43735:11;43703:31;:44::i;:::-;43612:135;;;;;;;;43765:66;43786:8;43796:11;43809:8;43819:11;43765:20;:66::i;:::-;43757:74;43519:319;-1:-1:-1;;;;;;43519:319:164:o;39797:3468::-;39901:20;39923:21;39946:20;39968:21;40042:16;40061:6;40042:25;;40077:23;40103:9;40113:8;40103:19;;;;;;;;:::i;:::-;;;;;;;;;40245:14;40103:19;;;;;40245:14;;;;40103:19;;-1:-1:-1;40271:11:164;;40245:22;;:14;;2237:66:176;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;40245:22:164;:37;;;40241:67;;40291:17;;;;;;;;;;;;;;40241:67;40659:20;40723:5;40738:571;40761:14;;;;40787:11;;40761:22;;:14;;2237:66:176;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;40761:22:164;40746:37;;;;;40745:53;40738:571;;;40836:17;;;;41179:15;:11;40836:17;41179:15;:::i;:::-;41163:12;:31;41159:58;;41212:5;41196:21;;41159:58;41240:9;41250:11;41240:22;;;;;;;;:::i;:::-;;;;;;;;;;;41232:30;;41287:11;41276:22;;40800:509;40738:571;;;41622:22;;;;;41646:14;;;;41622:22;;;;;41646:14;41577:20;41646:14;41688:45;;:26;:20;:11;:18;;4185:1:176;4181:17;;4060:154;41688:20:164;:24;;3001:9:177;2881:145;41688:26:164;:45;;;41671:62;;42228:9;42224:1035;;;42567:1;42540:24;:9;:22;;;:24::i;:::-;:28;;;42536:349;;;42588:26;42617:70;42650:19;42668:1;42650:13;;;:19;:::i;:::-;42672:8;42682:4;42617:18;:70::i;:::-;42739:14;;;;42755:17;;;;;42739:14;;-1:-1:-1;42755:17:164;;;-1:-1:-1;42536:349:164;;-1:-1:-1;42536:349:164;;42840:18;:23;42812:58;;42536:349;42932:11;;;;42945:14;;;;42932:11;;-1:-1:-1;42945:14:164;;;-1:-1:-1;42224:1035:164;;;42991:26;43020:70;43053:19;:13;;;43071:1;43053:19;:::i;43020:70::-;43138:11;;;;;43151:14;;;;;43214;;;;43230:17;;;43138:11;;-1:-1:-1;43151:14:164;;;;;-1:-1:-1;43214:14:164;;-1:-1:-1;43230:17:164;;-1:-1:-1;;42224:1035:164;39995:3270;;;;;;;39797:3468;;;;;:::o;44205:616::-;44400:10;44622:16;;;:23;:192;;44752:60;;;;;;16946:25:357;;;16990:34;17060:15;;;17040:18;;;17033:43;;;;17092:18;;;17085:34;;;17155:15;;;17135:18;;;17128:43;16918:19;;44752:60:164;;;;;;;;;;;;44742:71;;;;;;44622:192;;;44691:9;44702:12;44680:35;;;;;;;;17415:25:357;;;17488:34;17476:47;17471:2;17456:18;;17449:75;17403:2;17388:18;;17182:348;44680:35:164;;;;;;;;;;;;;44670:46;;;;;;44614:200;44205:616;-1:-1:-1;;;;;44205:616:164:o;5396:336:176:-;5478:19;5509:11;5523:16;5529:9;2237:66;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;5523:16;5509:30;;;;5604:3;5593:9;5589:19;5713:1;5702:9;5698:17;5693:1;5689;5678:9;5674:17;5670:25;5658:9;5647;5643:25;5640:56;5636:80;5621:95;;;5558:168;5396:336;;;;:::o;35528:361:164:-;35721:12;;;;;35788:18;;;35706:12;35788:18;;;;;;;;;;;:26;;35721:12;;;;;;;35788:26;;35721:12;;35788:26;:::i;:::-;;;;-1:-1:-1;;35853:29:164;;;;;:11;9795:55:357;;;35853:29:164;;;9777:74:357;9867:18;;;9860:34;;;35853:4:164;:11;;;;9750:18:357;;35853:29:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7263:794:176;7412:18;7553:20;7532:17;:9;:15;;2237:66;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;7532:17;:41;;;7528:71;;7582:17;;;;;;;;;;;;;;7528:71;7665:24;7679:9;7665:13;:24::i;:::-;7653:36;;7946:20;7925:17;:9;:15;;2237:66;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;7925:17;:41;;;7921:130;;7994:46;8015:24;:20;8038:1;8015:24;:::i;:::-;7994:20;;;;;:46::i;6034:710::-;6100:18;6263:14;;6294:1;6279:17;;6259:38;6100:18;6398:10;6259:38;2237:66;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;6398:10;6384:24;;6607:19;;;;6718:9;;6712:16;;6034:710;-1:-1:-1;;;6034:710:176:o;4635:313::-;4717:20;4749:11;4763:16;4769:9;2237:66;2189:20;1511:18;1508:46;-1:-1:-1;1505:1:176;1501:54;1612:22;;;1600:10;1597:38;1594:1;1590:46;1579:58;1730:22;;;1796:1;1792:17;;;1778:32;1854:1;1850:17;;;1836:32;1912:1;1908:17;;;1894:32;1970:1;1966:17;;;1952:32;2028:2;2024:18;;;2010:33;2174:36;2169:3;2165:46;2135:190;2083:260;;1283:1076;4763:16;4749:30;;;;4844:3;4833:9;4829:19;4929:1;4925;4914:9;4910:17;4906:25;4894:9;4883;4879:25;4876:56;4861:71;;;4798:144;4635:313;;;;:::o;252:184:357:-;304:77;301:1;294:88;401:4;398:1;391:15;425:4;422:1;415:15;441:402;590:2;575:18;;623:1;612:13;;602:201;;659:77;656:1;649:88;760:4;757:1;750:15;788:4;785:1;778:15;602:201;812:25;;;441:402;:::o;1057:248::-;1125:6;1133;1186:2;1174:9;1165:7;1161:23;1157:32;1154:52;;;1202:1;1199;1192:12;1154:52;-1:-1:-1;;1225:23:357;;;1295:2;1280:18;;;1267:32;;-1:-1:-1;1057:248:357:o;2511:531::-;2553:3;2591:5;2585:12;2618:6;2613:3;2606:19;2643:1;2653:162;2667:6;2664:1;2661:13;2653:162;;;2729:4;2785:13;;;2781:22;;2775:29;2757:11;;;2753:20;;2746:59;2682:12;2653:162;;;2833:6;2830:1;2827:13;2824:87;;;2899:1;2892:4;2883:6;2878:3;2874:16;2870:27;2863:38;2824:87;-1:-1:-1;2956:2:357;2944:15;2961:66;2940:88;2931:98;;;;3031:4;2927:109;;2511:531;-1:-1:-1;;2511:531:357:o;3047:220::-;3196:2;3185:9;3178:21;3159:4;3216:45;3257:2;3246:9;3242:18;3234:6;3216:45;:::i;4037:154::-;4123:42;4116:5;4112:54;4105:5;4102:65;4092:93;;4181:1;4178;4171:12;4092:93;4037:154;:::o;4196:247::-;4255:6;4308:2;4296:9;4287:7;4283:23;4279:32;4276:52;;;4324:1;4321;4314:12;4276:52;4363:9;4350:23;4382:31;4407:5;4382:31;:::i;:::-;4432:5;4196:247;-1:-1:-1;;;4196:247:357:o;4448:160::-;4513:20;;4569:13;;4562:21;4552:32;;4542:60;;4598:1;4595;4588:12;4542:60;4448:160;;;:::o;4613:344::-;4715:6;4723;4731;4784:2;4772:9;4763:7;4759:23;4755:32;4752:52;;;4800:1;4797;4790:12;4752:52;4836:9;4823:23;4813:33;;4893:2;4882:9;4878:18;4865:32;4855:42;;4916:35;4947:2;4936:9;4932:18;4916:35;:::i;:::-;4906:45;;4613:344;;;;;:::o;5638:180::-;5697:6;5750:2;5738:9;5729:7;5725:23;5721:32;5718:52;;;5766:1;5763;5756:12;5718:52;-1:-1:-1;5789:23:357;;5638:180;-1:-1:-1;5638:180:357:o;5823:332::-;5913:6;5966:2;5954:9;5945:7;5941:23;5937:32;5934:52;;;5982:1;5979;5972:12;5934:52;6021:9;6008:23;6071:34;6064:5;6060:46;6053:5;6050:57;6040:85;;6121:1;6118;6111:12;7033:347;7084:8;7094:6;7148:3;7141:4;7133:6;7129:17;7125:27;7115:55;;7166:1;7163;7156:12;7115:55;-1:-1:-1;7189:20:357;;7232:18;7221:30;;7218:50;;;7264:1;7261;7254:12;7218:50;7301:4;7293:6;7289:17;7277:29;;7353:3;7346:4;7337:6;7329;7325:19;7321:30;7318:39;7315:59;;;7370:1;7367;7360:12;7315:59;7033:347;;;;;:::o;7385:854::-;7490:6;7498;7506;7514;7522;7530;7583:3;7571:9;7562:7;7558:23;7554:33;7551:53;;;7600:1;7597;7590:12;7551:53;7636:9;7623:23;7613:33;;7665:35;7696:2;7685:9;7681:18;7665:35;:::i;:::-;7655:45;;7751:2;7740:9;7736:18;7723:32;7774:18;7815:2;7807:6;7804:14;7801:34;;;7831:1;7828;7821:12;7801:34;7870:58;7920:7;7911:6;7900:9;7896:22;7870:58;:::i;:::-;7947:8;;-1:-1:-1;7844:84:357;-1:-1:-1;8035:2:357;8020:18;;8007:32;;-1:-1:-1;8051:16:357;;;8048:36;;;8080:1;8077;8070:12;8048:36;;8119:60;8171:7;8160:8;8149:9;8145:24;8119:60;:::i;:::-;7385:854;;;;-1:-1:-1;7385:854:357;;-1:-1:-1;7385:854:357;;8198:8;;7385:854;-1:-1:-1;;;7385:854:357:o;8653:316::-;8730:6;8738;8746;8799:2;8787:9;8778:7;8774:23;8770:32;8767:52;;;8815:1;8812;8805:12;8767:52;-1:-1:-1;;8838:23:357;;;8908:2;8893:18;;8880:32;;-1:-1:-1;8959:2:357;8944:18;;;8931:32;;8653:316;-1:-1:-1;8653:316:357:o;8974:435::-;9247:10;9239:6;9235:23;9224:9;9217:42;9295:6;9290:2;9279:9;9275:18;9268:34;9338:2;9333;9322:9;9318:18;9311:30;9198:4;9358:45;9399:2;9388:9;9384:18;9376:6;9358:45;:::i;9414:184::-;9466:77;9463:1;9456:88;9563:4;9560:1;9553:15;9587:4;9584:1;9577:15;10115:184;10167:77;10164:1;10157:88;10264:4;10261:1;10254:15;10288:4;10285:1;10278:15;10304:128;10344:3;10375:1;10371:6;10368:1;10365:13;10362:39;;;10381:18;;:::i;:::-;-1:-1:-1;10417:9:357;;10304:128::o;10437:229::-;10476:4;10505:18;10573:10;;;;10543;;10595:12;;;10592:38;;;10610:18;;:::i;:::-;10647:13;;10437:229;-1:-1:-1;;;10437:229:357:o;10671:125::-;10711:4;10739:1;10736;10733:8;10730:34;;;10744:18;;:::i;:::-;-1:-1:-1;10781:9:357;;10671:125::o;10801:270::-;10840:7;10872:18;10917:2;10914:1;10910:10;10947:2;10944:1;10940:10;11003:3;10999:2;10995:12;10990:3;10987:21;10980:3;10973:11;10966:19;10962:47;10959:73;;;11012:18;;:::i;:::-;11052:13;;10801:270;-1:-1:-1;;;;10801:270:357:o;11076:272::-;11182:6;11190;11243:2;11231:9;11222:7;11218:23;11214:32;11211:52;;;11259:1;11256;11249:12;11211:52;-1:-1:-1;;11282:16:357;;11338:2;11323:18;;;11317:25;11282:16;;11317:25;;-1:-1:-1;11076:272:357:o;11353:184::-;11405:77;11402:1;11395:88;11502:4;11499:1;11492:15;11526:4;11523:1;11516:15;11542:120;11582:1;11608;11598:35;;11613:18;;:::i;:::-;-1:-1:-1;11647:9:357;;11542:120::o;11667:228::-;11707:7;11833:1;11765:66;11761:74;11758:1;11755:81;11750:1;11743:9;11736:17;11732:105;11729:131;;;11840:18;;:::i;:::-;-1:-1:-1;11880:9:357;;11667:228::o;11900:112::-;11932:1;11958;11948:35;;11963:18;;:::i;:::-;-1:-1:-1;11997:9:357;;11900:112::o;12017:246::-;12057:4;12086:34;12170:10;;;;12140;;12192:12;;;12189:38;;;12207:18;;:::i;12268:253::-;12308:3;12336:34;12397:2;12394:1;12390:10;12427:2;12424:1;12420:10;12458:3;12454:2;12450:12;12445:3;12442:21;12439:47;;;12466:18;;:::i;:::-;12502:13;;12268:253;-1:-1:-1;;;;12268:253:357:o;12526:271::-;12709:6;12701;12696:3;12683:33;12665:3;12735:16;;12760:13;;;12735:16;12526:271;-1:-1:-1;12526:271:357:o;12802:325::-;12890:6;12885:3;12878:19;12942:6;12935:5;12928:4;12923:3;12919:14;12906:43;;12994:1;12987:4;12978:6;12973:3;12969:16;12965:27;12958:38;12860:3;13116:4;13046:66;13041:2;13033:6;13029:15;13025:88;13020:3;13016:98;13012:109;13005:116;;12802:325;;;;:::o;13132:502::-;13373:2;13362:9;13355:21;13336:4;13399:61;13456:2;13445:9;13441:18;13433:6;13425;13399:61;:::i;:::-;13508:9;13500:6;13496:22;13491:2;13480:9;13476:18;13469:50;13536:49;13578:6;13570;13562;13536:49;:::i;:::-;13528:57;;;13621:6;13616:2;13605:9;13601:18;13594:34;13132:502;;;;;;;;:::o;13639:184::-;13709:6;13762:2;13750:9;13741:7;13737:23;13733:32;13730:52;;;13778:1;13775;13768:12;13730:52;-1:-1:-1;13801:16:357;;13639:184;-1:-1:-1;13639:184:357:o;13828:195::-;13866:4;13903;13900:1;13896:12;13935:4;13932:1;13928:12;13960:3;13955;13952:12;13949:38;;;13967:18;;:::i;:::-;14004:13;;;13828:195;-1:-1:-1;;;13828:195:357:o;14028:157::-;14058:1;14092:4;14089:1;14085:12;14116:3;14106:37;;14123:18;;:::i;:::-;14175:3;14168:4;14165:1;14161:12;14157:22;14152:27;;;14028:157;;;;:::o;14190:276::-;14285:6;14338:2;14326:9;14317:7;14313:23;14309:32;14306:52;;;14354:1;14351;14344:12;14306:52;14386:9;14380:16;14405:31;14430:5;14405:31;:::i;15424:195::-;15463:3;15494:66;15487:5;15484:77;15481:103;;15564:18;;:::i;:::-;-1:-1:-1;15611:1:357;15600:13;;15424:195::o;15624:655::-;15663:7;15695:66;15787:1;15784;15780:9;15815:1;15812;15808:9;15860:1;15856:2;15852:10;15849:1;15846:17;15841:2;15837;15833:11;15829:35;15826:61;;;15867:18;;:::i;:::-;15906:66;15998:1;15995;15991:9;16045:1;16041:2;16036:11;16033:1;16029:19;16024:2;16020;16016:11;16012:37;16009:63;;;16052:18;;:::i;:::-;16098:1;16095;16091:9;16081:19;;16145:1;16141:2;16136:11;16133:1;16129:19;16124:2;16120;16116:11;16112:37;16109:63;;;16152:18;;:::i;:::-;16217:1;16213:2;16208:11;16205:1;16201:19;16196:2;16192;16188:11;16184:37;16181:63;;;16224:18;;:::i;:::-;-1:-1:-1;;;16264:9:357;;;;;15624:655;-1:-1:-1;;;15624:655:357:o;16284:308::-;16323:1;16349;16339:35;;16354:18;;:::i;:::-;16471:66;16468:1;16465:73;16396:66;16393:1;16390:73;16386:153;16383:179;;;16542:18;;:::i;:::-;-1:-1:-1;16576:10:357;;16284:308::o","linkReferences":{},"immutableReferences":{"97720":[{"start":1643,"length":32},{"start":9176,"length":32}],"97723":[{"start":2439,"length":32},{"start":4347,"length":32},{"start":8062,"length":32},{"start":8196,"length":32},{"start":8719,"length":32},{"start":9018,"length":32}],"97726":[{"start":2256,"length":32},{"start":4239,"length":32},{"start":4440,"length":32},{"start":4824,"length":32},{"start":8985,"length":32},{"start":10781,"length":32},{"start":12541,"length":32},{"start":14380,"length":32},{"start":14682,"length":32},{"start":14939,"length":32},{"start":15152,"length":32}],"97730":[{"start":2205,"length":32},{"start":4585,"length":32},{"start":4730,"length":32},{"start":4975,"length":32},{"start":7789,"length":32},{"start":7855,"length":32},{"start":11501,"length":32}],"97734":[{"start":1055,"length":32},{"start":9414,"length":32},{"start":10267,"length":32}],"97738":[{"start":1702,"length":32},{"start":6175,"length":32},{"start":11247,"length":32}],"97742":[{"start":1106,"length":32},{"start":3493,"length":32},{"start":5895,"length":32},{"start":7265,"length":32},{"start":16177,"length":32}],"97746":[{"start":1291,"length":32},{"start":3103,"length":32},{"start":6240,"length":32}],"97749":[{"start":2122,"length":32},{"start":11093,"length":32}],"97753":[{"start":1478,"length":32},{"start":4687,"length":32},{"start":4877,"length":32},{"start":4919,"length":32}]}},"methodIdentifiers":{"absolutePrestate()":"8d450a95","addLocalData(uint256,uint256,uint256)":"f8f43ff6","anchorStateRegistry()":"5c0cba33","attack(uint256,bytes32)":"c55cd0c7","claimCredit(address)":"60e27464","claimData(uint256)":"c6f0308c","claimDataLen()":"8980e0cc","claims(bytes32)":"eff0f592","clockExtension()":"6b6716c0","createdAt()":"cf09e0d0","credit(address)":"d5d44d80","defend(uint256,bytes32)":"35fef567","extraData()":"609d3334","gameCreator()":"37b1b229","gameData()":"fa24f743","gameType()":"bbdc02db","getChallengerDuration(uint256)":"bd8da956","getRequiredBond(uint128)":"c395e1ca","initialize()":"8129fc1c","l1Head()":"6361506d","l2BlockNumber()":"8b85902b","l2ChainId()":"d6ae3cd5","maxClockDuration()":"dabd396d","maxGameDepth()":"fa315aa9","move(uint256,bytes32,bool)":"632247ea","resolve()":"2810e1d6","resolveClaim(uint256)":"fdffbb28","resolvedAt()":"19effeb4","resolvedSubgames(uint256)":"fe2bbeb2","rootClaim()":"bcef3b55","splitDepth()":"ec5e6308","startingBlockNumber()":"70872aa5","startingOutputRoot()":"57da950e","startingRootHash()":"25fc2ace","status()":"200d2ed2","step(uint256,bool,bytes,bytes)":"d8cc1a3c","subgames(uint256,uint256)":"2ad69aeb","version()":"54fd4d50","vm()":"3a768463","weth()":"3fc8cef3"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint32\"},{\"internalType\":\"Claim\",\"name\":\"_absolutePrestate\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_maxGameDepth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_splitDepth\",\"type\":\"uint256\"},{\"internalType\":\"Duration\",\"name\":\"_clockExtension\",\"type\":\"uint64\"},{\"internalType\":\"Duration\",\"name\":\"_maxClockDuration\",\"type\":\"uint64\"},{\"internalType\":\"contract IBigStepper\",\"name\":\"_vm\",\"type\":\"address\"},{\"internalType\":\"contract IDelayedWETH\",\"name\":\"_weth\",\"type\":\"address\"},{\"internalType\":\"contract IAnchorStateRegistry\",\"name\":\"_anchorStateRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_l2ChainId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AnchorRootNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotDefendRootClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAboveSplit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimAlreadyResolved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClockNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClockTimeExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateStep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameDepthExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GameNotInProgress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectBondAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClockExtension\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidLocalIdent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidParent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPrestate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSplitDepth\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxDepthTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCreditToClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfOrderResolution\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"Claim\",\"name\":\"rootClaim\",\"type\":\"bytes32\"}],\"name\":\"UnexpectedRootClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValidStep\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"parentIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"Claim\",\"name\":\"claim\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"}],\"name\":\"Move\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum GameStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"Resolved\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"absolutePrestate\",\"outputs\":[{\"internalType\":\"Claim\",\"name\":\"absolutePrestate_\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_ident\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_execLeafIdx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_partOffset\",\"type\":\"uint256\"}],\"name\":\"addLocalData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"anchorStateRegistry\",\"outputs\":[{\"internalType\":\"contract IAnchorStateRegistry\",\"name\":\"registry_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_parentIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"}],\"name\":\"attack\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"}],\"name\":\"claimCredit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claimData\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"parentIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"counteredBy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"bond\",\"type\":\"uint128\"},{\"internalType\":\"Claim\",\"name\":\"claim\",\"type\":\"bytes32\"},{\"internalType\":\"Position\",\"name\":\"position\",\"type\":\"uint128\"},{\"internalType\":\"Clock\",\"name\":\"clock\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimDataLen\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"len_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"ClaimHash\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"claims\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clockExtension\",\"outputs\":[{\"internalType\":\"Duration\",\"name\":\"clockExtension_\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createdAt\",\"outputs\":[{\"internalType\":\"Timestamp\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"credit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_parentIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"}],\"name\":\"defend\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"extraData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"extraData_\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameCreator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"creator_\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameData\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType_\",\"type\":\"uint32\"},{\"internalType\":\"Claim\",\"name\":\"rootClaim_\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"extraData_\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gameType\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"gameType_\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"}],\"name\":\"getChallengerDuration\",\"outputs\":[{\"internalType\":\"Duration\",\"name\":\"duration_\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Position\",\"name\":\"_position\",\"type\":\"uint128\"}],\"name\":\"getRequiredBond\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requiredBond_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1Head\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"l1Head_\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"l2BlockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2ChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"l2ChainId_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxClockDuration\",\"outputs\":[{\"internalType\":\"Duration\",\"name\":\"maxClockDuration_\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxGameDepth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"maxGameDepth_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_challengeIndex\",\"type\":\"uint256\"},{\"internalType\":\"Claim\",\"name\":\"_claim\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_isAttack\",\"type\":\"bool\"}],\"name\":\"move\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"enum GameStatus\",\"name\":\"status_\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"}],\"name\":\"resolveClaim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resolvedAt\",\"outputs\":[{\"internalType\":\"Timestamp\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"resolvedSubgames\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rootClaim\",\"outputs\":[{\"internalType\":\"Claim\",\"name\":\"rootClaim_\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"splitDepth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"splitDepth_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startingBlockNumber_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingOutputRoot\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"root\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingRootHash\",\"outputs\":[{\"internalType\":\"Hash\",\"name\":\"startingRootHash_\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"status\",\"outputs\":[{\"internalType\":\"enum GameStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_claimIndex\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_isAttack\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_stateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_proof\",\"type\":\"bytes\"}],\"name\":\"step\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"subgames\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vm\",\"outputs\":[{\"internalType\":\"contract IBigStepper\",\"name\":\"vm_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weth\",\"outputs\":[{\"internalType\":\"contract IDelayedWETH\",\"name\":\"weth_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"UnexpectedRootClaim(bytes32)\":[{\"params\":{\"rootClaim\":\"is the claim that was unexpected.\"}}]},\"kind\":\"dev\",\"methods\":{\"addLocalData(uint256,uint256,uint256)\":{\"params\":{\"_execLeafIdx\":\"The index of the leaf claim in an execution subgame that requires the local data for a step.\",\"_ident\":\"The local identifier of the data to post.\",\"_partOffset\":\"The offset of the data to post.\"}},\"attack(uint256,bytes32)\":{\"params\":{\"_claim\":\"The `Claim` at the relative attack position.\",\"_parentIndex\":\"Index of the `Claim` to attack in the `claimData` array.\"}},\"claimCredit(address)\":{\"params\":{\"_recipient\":\"The owner and recipient of the credit.\"}},\"constructor\":{\"params\":{\"_absolutePrestate\":\"The absolute prestate of the instruction trace.\",\"_anchorStateRegistry\":\"The contract that stores the anchor state for each game type.\",\"_clockExtension\":\"The clock extension to perform when the remaining duration is less than the extension.\",\"_gameType\":\"The type ID of the game.\",\"_l2ChainId\":\"Chain ID of the L2 network this contract argues about.\",\"_maxClockDuration\":\"The maximum amount of time that may accumulate on a team's chess clock.\",\"_maxGameDepth\":\"The maximum depth of bisection.\",\"_splitDepth\":\"The final depth of the output bisection portion of the game.\",\"_vm\":\"An onchain VM that performs single instruction steps on an FPP trace.\",\"_weth\":\"WETH contract for holding ETH.\"}},\"defend(uint256,bytes32)\":{\"params\":{\"_claim\":\"The `Claim` at the relative defense position.\",\"_parentIndex\":\"Index of the claim to defend in the `claimData` array.\"}},\"extraData()\":{\"details\":\"`clones-with-immutable-args` argument #4\",\"returns\":{\"extraData_\":\"Any extra data supplied to the dispute game contract by the creator.\"}},\"gameCreator()\":{\"details\":\"`clones-with-immutable-args` argument #1\",\"returns\":{\"creator_\":\"The creator of the dispute game.\"}},\"gameData()\":{\"returns\":{\"extraData_\":\"Any extra data supplied to the dispute game contract by the creator.\",\"gameType_\":\"The type of proof system being used.\",\"rootClaim_\":\"The root claim of the DisputeGame.\"}},\"gameType()\":{\"details\":\"The reference impl should be entirely different depending on the type (fault, validity) i.e. The game type should indicate the security model.\",\"returns\":{\"gameType_\":\"The type of proof system being used.\"}},\"getChallengerDuration(uint256)\":{\"params\":{\"_claimIndex\":\"The index of the subgame root claim.\"},\"returns\":{\"duration_\":\"The time elapsed on the potential challenger to `_claimIndex`'s chess clock.\"}},\"getRequiredBond(uint128)\":{\"params\":{\"_position\":\"The position of the bonded interaction.\"},\"returns\":{\"requiredBond_\":\"The required ETH bond for the given move, in wei.\"}},\"initialize()\":{\"details\":\"This function may only be called once.\"},\"l1Head()\":{\"details\":\"`clones-with-immutable-args` argument #3\",\"returns\":{\"l1Head_\":\"The parent hash of the L1 block when the dispute game was created.\"}},\"move(uint256,bytes32,bool)\":{\"params\":{\"_challengeIndex\":\"The index of the claim being moved against.\",\"_claim\":\"The claim at the next logical position in the game.\",\"_isAttack\":\"Whether or not the move is an attack or defense.\"}},\"resolve()\":{\"details\":\"May only be called if the `status` is `IN_PROGRESS`.\",\"returns\":{\"status_\":\"The status of the game after resolution.\"}},\"resolveClaim(uint256)\":{\"details\":\"This function must be called bottom-up in the DAG A subgame is a tree of claims that has a maximum depth of 1. A subgame root claims is valid if, and only if, all of its child claims are invalid. At the deepest level in the DAG, a claim is invalid if there's a successful step against it.\",\"params\":{\"_claimIndex\":\"The index of the subgame root claim to resolve.\"}},\"rootClaim()\":{\"details\":\"`clones-with-immutable-args` argument #2\",\"returns\":{\"rootClaim_\":\"The root claim of the DisputeGame.\"}},\"step(uint256,bool,bytes,bytes)\":{\"details\":\"This function should point to a fault proof processor in order to execute a step in the fault proof program on-chain. The interface of the fault proof processor contract should adhere to the `IBigStepper` interface.\",\"params\":{\"_claimIndex\":\"The index of the challenged claim within `claimData`.\",\"_isAttack\":\"Whether or not the step is an attack or a defense.\",\"_proof\":\"Proof to access memory nodes in the VM's merkle state tree.\",\"_stateData\":\"The stateData of the step is the preimage of the claim at the given prestate, which is at `_stateIndex` if the move is an attack and `_claimIndex` if the move is a defense. If the step is an attack on the first instruction, it is the absolute prestate of the fault proof VM.\"}}},\"stateVariables\":{\"status\":{\"return\":\"The current status of the game.\",\"returns\":{\"_0\":\"The current status of the game.\"}},\"version\":{\"custom:semver\":\"0.17.0\"}},\"title\":\"FaultDisputeGame\",\"version\":1},\"userdoc\":{\"errors\":{\"AlreadyInitialized()\":[{\"notice\":\"Thrown when a dispute game has already been initialized.\"}],\"AnchorRootNotFound()\":[{\"notice\":\"Thrown when an anchor root is not found for a given game type.\"}],\"BondTransferFailed()\":[{\"notice\":\"Thrown when the transfer of credit to a recipient account reverts.\"}],\"CannotDefendRootClaim()\":[{\"notice\":\"Thrown when a defense against the root claim is attempted.\"}],\"ClaimAboveSplit()\":[{\"notice\":\"Thrown when a parent output root is attempted to be found on a claim that is in the output root portion of the tree.\"}],\"ClaimAlreadyExists()\":[{\"notice\":\"Thrown when a claim is attempting to be made that already exists.\"}],\"ClaimAlreadyResolved()\":[{\"notice\":\"Thrown when resolving a claim that has already been resolved.\"}],\"ClockNotExpired()\":[{\"notice\":\"Thrown when the game is attempted to be resolved too early.\"}],\"ClockTimeExceeded()\":[{\"notice\":\"Thrown when a move is attempted to be made after the clock has timed out.\"}],\"DuplicateStep()\":[{\"notice\":\"Thrown when trying to step against a claim for a second time, after it has already been countered with an instruction step.\"}],\"GameDepthExceeded()\":[{\"notice\":\"Thrown when a move is attempted to be made at or greater than the max depth of the game.\"}],\"GameNotInProgress()\":[{\"notice\":\"Thrown when an action that requires the game to be `IN_PROGRESS` is invoked when the game is not in progress.\"}],\"IncorrectBondAmount()\":[{\"notice\":\"Thrown when a supplied bond is not equal to the required bond amount to cover the cost of the interaction.\"}],\"InvalidClockExtension()\":[{\"notice\":\"Thrown on deployment if the max clock duration is less than or equal to the clock extension.\"}],\"InvalidLocalIdent()\":[{\"notice\":\"Thrown when an invalid local identifier is passed to the `addLocalData` function.\"}],\"InvalidParent()\":[{\"notice\":\"Thrown when a step is attempted above the maximum game depth.\"}],\"InvalidPrestate()\":[{\"notice\":\"Thrown when an invalid prestate is supplied to `step`.\"}],\"InvalidSplitDepth()\":[{\"notice\":\"Thrown on deployment if the split depth is greater than or equal to the max depth of the game.\"}],\"MaxDepthTooLarge()\":[{\"notice\":\"Thrown on deployment if the max depth is greater than `LibPosition.`\"}],\"NoCreditToClaim()\":[{\"notice\":\"Thrown when a credit claim is attempted for a value of 0.\"}],\"OutOfOrderResolution()\":[{\"notice\":\"Thrown when resolving claims out of order.\"}],\"UnexpectedRootClaim(bytes32)\":[{\"notice\":\"Thrown when the root claim has an unexpected VM status. Some games can only start with a root-claim with a specific status.\"}],\"ValidStep()\":[{\"notice\":\"Thrown when a step is made that computes the expected post state correctly.\"}]},\"events\":{\"Move(uint256,bytes32,address)\":{\"notice\":\"Emitted when a new claim is added to the DAG by `claimant`\"},\"Resolved(uint8)\":{\"notice\":\"Emitted when the game is resolved.\"}},\"kind\":\"user\",\"methods\":{\"absolutePrestate()\":{\"notice\":\"Returns the absolute prestate of the instruction trace.\"},\"addLocalData(uint256,uint256,uint256)\":{\"notice\":\"Posts the requested local data to the VM's `PreimageOralce`.\"},\"anchorStateRegistry()\":{\"notice\":\"Returns the anchor state registry contract.\"},\"attack(uint256,bytes32)\":{\"notice\":\"Attack a disagreed upon `Claim`.\"},\"claimCredit(address)\":{\"notice\":\"Claim the credit belonging to the recipient address.\"},\"claimData(uint256)\":{\"notice\":\"An append-only array of all claims made during the dispute game.\"},\"claimDataLen()\":{\"notice\":\"Returns the length of the `claimData` array.\"},\"claims(bytes32)\":{\"notice\":\"A mapping to allow for constant-time lookups of existing claims.\"},\"clockExtension()\":{\"notice\":\"Returns the clock extension constant.\"},\"createdAt()\":{\"notice\":\"The starting timestamp of the game\"},\"credit(address)\":{\"notice\":\"Credited balances for winning participants.\"},\"defend(uint256,bytes32)\":{\"notice\":\"Defend an agreed upon `Claim`.\"},\"extraData()\":{\"notice\":\"Getter for the extra data.\"},\"gameCreator()\":{\"notice\":\"Getter for the creator of the dispute game.\"},\"gameData()\":{\"notice\":\"A compliant implementation of this interface should return the components of the game UUID's preimage provided in the cwia payload. The preimage of the UUID is constructed as `keccak256(gameType . rootClaim . extraData)` where `.` denotes concatenation.\"},\"gameType()\":{\"notice\":\"Getter for the game type.\"},\"getChallengerDuration(uint256)\":{\"notice\":\"Returns the amount of time elapsed on the potential challenger to `_claimIndex`'s chess clock. Maxes out at `MAX_CLOCK_DURATION`.\"},\"getRequiredBond(uint128)\":{\"notice\":\"Returns the required bond for a given move kind.\"},\"initialize()\":{\"notice\":\"Initializes the contract.\"},\"l1Head()\":{\"notice\":\"Getter for the parent hash of the L1 block when the dispute game was created.\"},\"l2BlockNumber()\":{\"notice\":\"The l2BlockNumber of the disputed output root in the `L2OutputOracle`.\"},\"l2ChainId()\":{\"notice\":\"Returns the chain ID of the L2 network this contract argues about.\"},\"maxClockDuration()\":{\"notice\":\"Returns the max clock duration.\"},\"maxGameDepth()\":{\"notice\":\"Returns the max game depth.\"},\"move(uint256,bytes32,bool)\":{\"notice\":\"Generic move function, used for both `attack` and `defend` moves.\"},\"resolve()\":{\"notice\":\"If all necessary information has been gathered, this function should mark the game status as either `CHALLENGER_WINS` or `DEFENDER_WINS` and return the status of the resolved game. It is at this stage that the bonds should be awarded to the necessary parties.\"},\"resolveClaim(uint256)\":{\"notice\":\"Resolves the subgame rooted at the given claim index.\"},\"resolvedAt()\":{\"notice\":\"The timestamp of the game's global resolution.\"},\"resolvedSubgames(uint256)\":{\"notice\":\"An interneal mapping of resolved subgames rooted at a claim index.\"},\"rootClaim()\":{\"notice\":\"Getter for the root claim.\"},\"splitDepth()\":{\"notice\":\"Returns the split depth.\"},\"startingBlockNumber()\":{\"notice\":\"Only the starting block number of the game.\"},\"startingOutputRoot()\":{\"notice\":\"The latest finalized output root, serving as the anchor for output bisection.\"},\"startingRootHash()\":{\"notice\":\"Only the starting output root of the game.\"},\"status()\":{\"notice\":\"Returns the current status of the game.\"},\"step(uint256,bool,bytes,bytes)\":{\"notice\":\"Perform an instruction step via an on-chain fault proof processor.\"},\"subgames(uint256,uint256)\":{\"notice\":\"A mapping of subgames rooted at a claim index to other claim indices in the subgame.\"},\"version()\":{\"notice\":\"Semantic version.\"},\"vm()\":{\"notice\":\"Returns the address of the VM.\"},\"weth()\":{\"notice\":\"Returns the WETH contract for holding ETH.\"}},\"notice\":\"An implementation of the `IFaultDisputeGame` interface.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/dispute/FaultDisputeGame.sol\":\"FaultDisputeGame\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/solady/src/utils/Clone.sol\":{\"keccak256\":\"0xb408dc90294bacd394e59c83619e7dc76f45c83ad6f8e923eb07d3a5bab89f22\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c3abeb55ad062c4b29b5b5edab6167de36615c51621ef71ef3ddfd9f6735a93b\",\"dweb:/ipfs/Qmboh4zX6ZgFVhetUhZGJ14kKXiaGeB9bW3Vseg2MLMGHW\"]},\"lib/solady/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x1fbad6f61bd3e5875e6b0060b67626cb1ccb9542c0da368a44eb3870c9a9e160\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5189fcd5ecff0f449475cf3183e9d6b509cd1221555aba6cd76c70b097cc8260\",\"dweb:/ipfs/Qmbt34Kf5h2DeYzmqXtg3jprYxDCFdENtf41NgCdcARA7u\"]},\"src/cannon/interfaces/IPreimageOracle.sol\":{\"keccak256\":\"0x7bda0156571b468cf0e22321945655f2dacd7082f440f742aa4612b36b388a9f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5ba53777c65987bc20faa7731476c779e7794a58bafb40191a25275a05e3f8af\",\"dweb:/ipfs/QmbxQwE2BC9aabTruDqkd2CLojwq7G9i2rkWKv46Wucae1\"]},\"src/dispute/FaultDisputeGame.sol\":{\"keccak256\":\"0x0d90358576f7b5c14cfe338937ed4fea7d945f9a1b5e68111196310554b485b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5d6d4ce62af4902e17af3a70b6c4688be4d148498c841af9c8ead2c076794e6e\",\"dweb:/ipfs/QmS2ebpEDxbhnUwXYnKEChS2zVpFvfdnJr3AbfDSQovBAN\"]},\"src/dispute/interfaces/IAnchorStateRegistry.sol\":{\"keccak256\":\"0x5fd05f2482d149668897e54f92d556a0c3512aa35b51ba800ef15d18dd490cb3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://689d621bc5c43a41d5232980f0eceecd7a3d8aa99438dfd9fed5f73d5ecd2887\",\"dweb:/ipfs/QmQ5jw54TkdxLuLFti6JZown54rGQ3m3Q93pvnVU1j1HRj\"]},\"src/dispute/interfaces/IBigStepper.sol\":{\"keccak256\":\"0xc92ee3069677b903826c83d5b4e46e3be462f9ccf1d95e72a12b1052e3451f0a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f93692bd3c8d9533ab8024ce2df6d880328826d1a92fdb9cf45301e2d0c65884\",\"dweb:/ipfs/QmUcmbjTw9gnCUNasgmQjVbSgcCPKZ1FQyA31dH4k5Nc75\"]},\"src/dispute/interfaces/IDelayedWETH.sol\":{\"keccak256\":\"0x0bb035e9bbb411696841ea292eeed6d4463c3c3eee7d6c5d8e38a101e8a4ff04\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0477cf2c137392d35081f23bfd7f3565881767dcb1489a62e7e80b3c178cfce8\",\"dweb:/ipfs/QmTjALjrHg5rvhjfCKPmXLTgkMNneECWaqoarunSoVS37G\"]},\"src/dispute/interfaces/IDisputeGame.sol\":{\"keccak256\":\"0xe2611453d5cc05f8aa30dc0e5e15ee5ae29fd3eb55a2c034424250baebf12f9b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://274e00fbcea3b8455bbaa042130bf1f7a5b2b769f28ad57afbf9fabfd74a757a\",\"dweb:/ipfs/QmRKQTfYdMjQYVbuZhdXts1d752eUq8RwrjqqwV5XRYLi6\"]},\"src/dispute/interfaces/IDisputeGameFactory.sol\":{\"keccak256\":\"0x204d89d38d4dc0db40fbf898d95e639ac5608810a5a5506a3d80d71177648bda\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://71e5c0ff04f409f30ca4f8ebfae1592c6ca495e315b059f969d11812e6e84dbd\",\"dweb:/ipfs/QmaNKkhkJv7qHzX6bKB3LjpWBupfMPLhoATUGx1HRTLtXh\"]},\"src/dispute/interfaces/IFaultDisputeGame.sol\":{\"keccak256\":\"0xe2f3acb614ecffd6e0fee98443cf58fa95c1209f4ee43e723781733823da3437\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e4cffbd5b53e6459aad472249e629ae5f52c725b6f6828050df019a18ab50278\",\"dweb:/ipfs/QmTC1GgzbwSyqd9fbJz2veqHnbKJfAK5tBr5jUZcC5N271\"]},\"src/dispute/interfaces/IInitializable.sol\":{\"keccak256\":\"0xbc553af6501a972850a98fc6284943f8e95a5183a7b4f64198c16fca2338c9dc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1f1c422ce4a9e72f0bbdec36434206da4af3a32d38f922acab957942e994ce5\",\"dweb:/ipfs/QmNQGWBceLxx1CKSMLfwTM584q8UCgUpF4rrFe8pdbWYtj\"]},\"src/dispute/interfaces/IWETH.sol\":{\"keccak256\":\"0x3858f6c0ce3ec7978b1ea1772484c25aec7c8c480ceaf18239f726fdd06fdd1f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b72cf3bc31324409480e9ae6eb3e2654da8dff3cbf9f2136b19fe714293b3766\",\"dweb:/ipfs/QmTW3JiFUo8pYhDbthPH8ZSp5f1nmdga4CSzo4YdEzppnM\"]},\"src/dispute/lib/LibGameId.sol\":{\"keccak256\":\"0x9a9f30500da6eb7eeaa7193515dc5e45dc479f09ae7d522a07283c0fb5f4bfa6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be113d8198d5822385de3d6ff3d7b3e8241993484aa95604ffaf38c2d33f40e0\",\"dweb:/ipfs/QmY9mHC52fqc4gAFYCGobNyuP4TqugQgs8o1kTF33t17Hc\"]},\"src/dispute/lib/LibHashing.sol\":{\"keccak256\":\"0x5a072cd028094eee55acb84ed8d08d7422b1fb46658b7e043e916781530a383b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b67e54f1318f1fd67b28b16c6861a56e27217c26a12aaea5c446e2ec53143920\",\"dweb:/ipfs/QmVLSTP3PwXzRkR3A4qV9fjZhca9v8J1EnEYuVGUsSirAq\"]},\"src/dispute/lib/LibPosition.sol\":{\"keccak256\":\"0xf7ceb26f0ac7067ff8a43f263451050eef6fba2029eafb83d3cbe35224d894a6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3bb403b0d707a8e2e3780a19185b918bfe907ca2d1b939ea74ae095a5cdf3b48\",\"dweb:/ipfs/QmYFzkmF8TRomp1cBEbTsKxiEnqLnX6SvSh4y3rVa84pBR\"]},\"src/dispute/lib/LibUDT.sol\":{\"keccak256\":\"0x9b61b15f5edfac1e6528aec79c1be6ac712d5f6a62140db87ed749e41a46563f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://24ef4ecee91638e278886888192b7d2b1811ab99f4e90a06817a4b2651720046\",\"dweb:/ipfs/QmdisoBv1mE9jDv6jvpcbvKhdmJZMMjQmATrEYfBQQrXtZ\"]},\"src/libraries/DisputeErrors.sol\":{\"keccak256\":\"0x869bec0d79d97f2d0a00b1e70bf1e6955a2be585521e0084602e54455c0a6937\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a235c6349437cd2ade72909287404e2993c1c4bd356707299239c71fa3bf780e\",\"dweb:/ipfs/QmcFSh6PWJ5sNg1CeoRyF9EnV8APWDz1kYP98v6ooGxc71\"]},\"src/libraries/DisputeTypes.sol\":{\"keccak256\":\"0xae3d053cf40b3e47669b89438524fec4eb571a78be296cc7e7ba23025b3bdf0c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a2b90604718ad29d19a8f21d45a5f8c6188320781fdb7102b3fccadae549961\",\"dweb:/ipfs/QmUBTXgRFG7PvoCBJsXmgi2sZPZFPQQZTptQ91LL7tC2xQ\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"GameType","name":"_gameType","type":"uint32"},{"internalType":"Claim","name":"_absolutePrestate","type":"bytes32"},{"internalType":"uint256","name":"_maxGameDepth","type":"uint256"},{"internalType":"uint256","name":"_splitDepth","type":"uint256"},{"internalType":"Duration","name":"_clockExtension","type":"uint64"},{"internalType":"Duration","name":"_maxClockDuration","type":"uint64"},{"internalType":"contract IBigStepper","name":"_vm","type":"address"},{"internalType":"contract IDelayedWETH","name":"_weth","type":"address"},{"internalType":"contract IAnchorStateRegistry","name":"_anchorStateRegistry","type":"address"},{"internalType":"uint256","name":"_l2ChainId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyInitialized"},{"inputs":[],"type":"error","name":"AnchorRootNotFound"},{"inputs":[],"type":"error","name":"BondTransferFailed"},{"inputs":[],"type":"error","name":"CannotDefendRootClaim"},{"inputs":[],"type":"error","name":"ClaimAboveSplit"},{"inputs":[],"type":"error","name":"ClaimAlreadyExists"},{"inputs":[],"type":"error","name":"ClaimAlreadyResolved"},{"inputs":[],"type":"error","name":"ClockNotExpired"},{"inputs":[],"type":"error","name":"ClockTimeExceeded"},{"inputs":[],"type":"error","name":"DuplicateStep"},{"inputs":[],"type":"error","name":"GameDepthExceeded"},{"inputs":[],"type":"error","name":"GameNotInProgress"},{"inputs":[],"type":"error","name":"IncorrectBondAmount"},{"inputs":[],"type":"error","name":"InvalidClockExtension"},{"inputs":[],"type":"error","name":"InvalidLocalIdent"},{"inputs":[],"type":"error","name":"InvalidParent"},{"inputs":[],"type":"error","name":"InvalidPrestate"},{"inputs":[],"type":"error","name":"InvalidSplitDepth"},{"inputs":[],"type":"error","name":"MaxDepthTooLarge"},{"inputs":[],"type":"error","name":"NoCreditToClaim"},{"inputs":[],"type":"error","name":"OutOfOrderResolution"},{"inputs":[{"internalType":"Claim","name":"rootClaim","type":"bytes32"}],"type":"error","name":"UnexpectedRootClaim"},{"inputs":[],"type":"error","name":"ValidStep"},{"inputs":[{"internalType":"uint256","name":"parentIndex","type":"uint256","indexed":true},{"internalType":"Claim","name":"claim","type":"bytes32","indexed":true},{"internalType":"address","name":"claimant","type":"address","indexed":true}],"type":"event","name":"Move","anonymous":false},{"inputs":[{"internalType":"enum GameStatus","name":"status","type":"uint8","indexed":true}],"type":"event","name":"Resolved","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"absolutePrestate","outputs":[{"internalType":"Claim","name":"absolutePrestate_","type":"bytes32"}]},{"inputs":[{"internalType":"uint256","name":"_ident","type":"uint256"},{"internalType":"uint256","name":"_execLeafIdx","type":"uint256"},{"internalType":"uint256","name":"_partOffset","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"addLocalData"},{"inputs":[],"stateMutability":"view","type":"function","name":"anchorStateRegistry","outputs":[{"internalType":"contract IAnchorStateRegistry","name":"registry_","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_parentIndex","type":"uint256"},{"internalType":"Claim","name":"_claim","type":"bytes32"}],"stateMutability":"payable","type":"function","name":"attack"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"claimCredit"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"claimData","outputs":[{"internalType":"uint32","name":"parentIndex","type":"uint32"},{"internalType":"address","name":"counteredBy","type":"address"},{"internalType":"address","name":"claimant","type":"address"},{"internalType":"uint128","name":"bond","type":"uint128"},{"internalType":"Claim","name":"claim","type":"bytes32"},{"internalType":"Position","name":"position","type":"uint128"},{"internalType":"Clock","name":"clock","type":"uint128"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"claimDataLen","outputs":[{"internalType":"uint256","name":"len_","type":"uint256"}]},{"inputs":[{"internalType":"ClaimHash","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"claims","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"clockExtension","outputs":[{"internalType":"Duration","name":"clockExtension_","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"createdAt","outputs":[{"internalType":"Timestamp","name":"","type":"uint64"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"credit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_parentIndex","type":"uint256"},{"internalType":"Claim","name":"_claim","type":"bytes32"}],"stateMutability":"payable","type":"function","name":"defend"},{"inputs":[],"stateMutability":"pure","type":"function","name":"extraData","outputs":[{"internalType":"bytes","name":"extraData_","type":"bytes"}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"gameCreator","outputs":[{"internalType":"address","name":"creator_","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"gameData","outputs":[{"internalType":"GameType","name":"gameType_","type":"uint32"},{"internalType":"Claim","name":"rootClaim_","type":"bytes32"},{"internalType":"bytes","name":"extraData_","type":"bytes"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"gameType","outputs":[{"internalType":"GameType","name":"gameType_","type":"uint32"}]},{"inputs":[{"internalType":"uint256","name":"_claimIndex","type":"uint256"}],"stateMutability":"view","type":"function","name":"getChallengerDuration","outputs":[{"internalType":"Duration","name":"duration_","type":"uint64"}]},{"inputs":[{"internalType":"Position","name":"_position","type":"uint128"}],"stateMutability":"view","type":"function","name":"getRequiredBond","outputs":[{"internalType":"uint256","name":"requiredBond_","type":"uint256"}]},{"inputs":[],"stateMutability":"payable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"pure","type":"function","name":"l1Head","outputs":[{"internalType":"Hash","name":"l1Head_","type":"bytes32"}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"l2BlockNumber","outputs":[{"internalType":"uint256","name":"l2BlockNumber_","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"l2ChainId","outputs":[{"internalType":"uint256","name":"l2ChainId_","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"maxClockDuration","outputs":[{"internalType":"Duration","name":"maxClockDuration_","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"maxGameDepth","outputs":[{"internalType":"uint256","name":"maxGameDepth_","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_challengeIndex","type":"uint256"},{"internalType":"Claim","name":"_claim","type":"bytes32"},{"internalType":"bool","name":"_isAttack","type":"bool"}],"stateMutability":"payable","type":"function","name":"move"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resolve","outputs":[{"internalType":"enum GameStatus","name":"status_","type":"uint8"}]},{"inputs":[{"internalType":"uint256","name":"_claimIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"resolveClaim"},{"inputs":[],"stateMutability":"view","type":"function","name":"resolvedAt","outputs":[{"internalType":"Timestamp","name":"","type":"uint64"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"resolvedSubgames","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"rootClaim","outputs":[{"internalType":"Claim","name":"rootClaim_","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"splitDepth","outputs":[{"internalType":"uint256","name":"splitDepth_","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"startingBlockNumber","outputs":[{"internalType":"uint256","name":"startingBlockNumber_","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"startingOutputRoot","outputs":[{"internalType":"Hash","name":"root","type":"bytes32"},{"internalType":"uint256","name":"l2BlockNumber","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"startingRootHash","outputs":[{"internalType":"Hash","name":"startingRootHash_","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"status","outputs":[{"internalType":"enum GameStatus","name":"","type":"uint8"}]},{"inputs":[{"internalType":"uint256","name":"_claimIndex","type":"uint256"},{"internalType":"bool","name":"_isAttack","type":"bool"},{"internalType":"bytes","name":"_stateData","type":"bytes"},{"internalType":"bytes","name":"_proof","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"step"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"subgames","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"vm","outputs":[{"internalType":"contract IBigStepper","name":"vm_","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"weth","outputs":[{"internalType":"contract IDelayedWETH","name":"weth_","type":"address"}]}],"devdoc":{"kind":"dev","methods":{"addLocalData(uint256,uint256,uint256)":{"params":{"_execLeafIdx":"The index of the leaf claim in an execution subgame that requires the local data for a step.","_ident":"The local identifier of the data to post.","_partOffset":"The offset of the data to post."}},"attack(uint256,bytes32)":{"params":{"_claim":"The `Claim` at the relative attack position.","_parentIndex":"Index of the `Claim` to attack in the `claimData` array."}},"claimCredit(address)":{"params":{"_recipient":"The owner and recipient of the credit."}},"constructor":{"params":{"_absolutePrestate":"The absolute prestate of the instruction trace.","_anchorStateRegistry":"The contract that stores the anchor state for each game type.","_clockExtension":"The clock extension to perform when the remaining duration is less than the extension.","_gameType":"The type ID of the game.","_l2ChainId":"Chain ID of the L2 network this contract argues about.","_maxClockDuration":"The maximum amount of time that may accumulate on a team's chess clock.","_maxGameDepth":"The maximum depth of bisection.","_splitDepth":"The final depth of the output bisection portion of the game.","_vm":"An onchain VM that performs single instruction steps on an FPP trace.","_weth":"WETH contract for holding ETH."}},"defend(uint256,bytes32)":{"params":{"_claim":"The `Claim` at the relative defense position.","_parentIndex":"Index of the claim to defend in the `claimData` array."}},"extraData()":{"details":"`clones-with-immutable-args` argument #4","returns":{"extraData_":"Any extra data supplied to the dispute game contract by the creator."}},"gameCreator()":{"details":"`clones-with-immutable-args` argument #1","returns":{"creator_":"The creator of the dispute game."}},"gameData()":{"returns":{"extraData_":"Any extra data supplied to the dispute game contract by the creator.","gameType_":"The type of proof system being used.","rootClaim_":"The root claim of the DisputeGame."}},"gameType()":{"details":"The reference impl should be entirely different depending on the type (fault, validity) i.e. The game type should indicate the security model.","returns":{"gameType_":"The type of proof system being used."}},"getChallengerDuration(uint256)":{"params":{"_claimIndex":"The index of the subgame root claim."},"returns":{"duration_":"The time elapsed on the potential challenger to `_claimIndex`'s chess clock."}},"getRequiredBond(uint128)":{"params":{"_position":"The position of the bonded interaction."},"returns":{"requiredBond_":"The required ETH bond for the given move, in wei."}},"initialize()":{"details":"This function may only be called once."},"l1Head()":{"details":"`clones-with-immutable-args` argument #3","returns":{"l1Head_":"The parent hash of the L1 block when the dispute game was created."}},"move(uint256,bytes32,bool)":{"params":{"_challengeIndex":"The index of the claim being moved against.","_claim":"The claim at the next logical position in the game.","_isAttack":"Whether or not the move is an attack or defense."}},"resolve()":{"details":"May only be called if the `status` is `IN_PROGRESS`.","returns":{"status_":"The status of the game after resolution."}},"resolveClaim(uint256)":{"details":"This function must be called bottom-up in the DAG A subgame is a tree of claims that has a maximum depth of 1. A subgame root claims is valid if, and only if, all of its child claims are invalid. At the deepest level in the DAG, a claim is invalid if there's a successful step against it.","params":{"_claimIndex":"The index of the subgame root claim to resolve."}},"rootClaim()":{"details":"`clones-with-immutable-args` argument #2","returns":{"rootClaim_":"The root claim of the DisputeGame."}},"step(uint256,bool,bytes,bytes)":{"details":"This function should point to a fault proof processor in order to execute a step in the fault proof program on-chain. The interface of the fault proof processor contract should adhere to the `IBigStepper` interface.","params":{"_claimIndex":"The index of the challenged claim within `claimData`.","_isAttack":"Whether or not the step is an attack or a defense.","_proof":"Proof to access memory nodes in the VM's merkle state tree.","_stateData":"The stateData of the step is the preimage of the claim at the given prestate, which is at `_stateIndex` if the move is an attack and `_claimIndex` if the move is a defense. If the step is an attack on the first instruction, it is the absolute prestate of the fault proof VM."}}},"version":1},"userdoc":{"kind":"user","methods":{"absolutePrestate()":{"notice":"Returns the absolute prestate of the instruction trace."},"addLocalData(uint256,uint256,uint256)":{"notice":"Posts the requested local data to the VM's `PreimageOralce`."},"anchorStateRegistry()":{"notice":"Returns the anchor state registry contract."},"attack(uint256,bytes32)":{"notice":"Attack a disagreed upon `Claim`."},"claimCredit(address)":{"notice":"Claim the credit belonging to the recipient address."},"claimData(uint256)":{"notice":"An append-only array of all claims made during the dispute game."},"claimDataLen()":{"notice":"Returns the length of the `claimData` array."},"claims(bytes32)":{"notice":"A mapping to allow for constant-time lookups of existing claims."},"clockExtension()":{"notice":"Returns the clock extension constant."},"createdAt()":{"notice":"The starting timestamp of the game"},"credit(address)":{"notice":"Credited balances for winning participants."},"defend(uint256,bytes32)":{"notice":"Defend an agreed upon `Claim`."},"extraData()":{"notice":"Getter for the extra data."},"gameCreator()":{"notice":"Getter for the creator of the dispute game."},"gameData()":{"notice":"A compliant implementation of this interface should return the components of the game UUID's preimage provided in the cwia payload. The preimage of the UUID is constructed as `keccak256(gameType . rootClaim . extraData)` where `.` denotes concatenation."},"gameType()":{"notice":"Getter for the game type."},"getChallengerDuration(uint256)":{"notice":"Returns the amount of time elapsed on the potential challenger to `_claimIndex`'s chess clock. Maxes out at `MAX_CLOCK_DURATION`."},"getRequiredBond(uint128)":{"notice":"Returns the required bond for a given move kind."},"initialize()":{"notice":"Initializes the contract."},"l1Head()":{"notice":"Getter for the parent hash of the L1 block when the dispute game was created."},"l2BlockNumber()":{"notice":"The l2BlockNumber of the disputed output root in the `L2OutputOracle`."},"l2ChainId()":{"notice":"Returns the chain ID of the L2 network this contract argues about."},"maxClockDuration()":{"notice":"Returns the max clock duration."},"maxGameDepth()":{"notice":"Returns the max game depth."},"move(uint256,bytes32,bool)":{"notice":"Generic move function, used for both `attack` and `defend` moves."},"resolve()":{"notice":"If all necessary information has been gathered, this function should mark the game status as either `CHALLENGER_WINS` or `DEFENDER_WINS` and return the status of the resolved game. It is at this stage that the bonds should be awarded to the necessary parties."},"resolveClaim(uint256)":{"notice":"Resolves the subgame rooted at the given claim index."},"resolvedAt()":{"notice":"The timestamp of the game's global resolution."},"resolvedSubgames(uint256)":{"notice":"An interneal mapping of resolved subgames rooted at a claim index."},"rootClaim()":{"notice":"Getter for the root claim."},"splitDepth()":{"notice":"Returns the split depth."},"startingBlockNumber()":{"notice":"Only the starting block number of the game."},"startingOutputRoot()":{"notice":"The latest finalized output root, serving as the anchor for output bisection."},"startingRootHash()":{"notice":"Only the starting output root of the game."},"status()":{"notice":"Returns the current status of the game."},"step(uint256,bool,bytes,bytes)":{"notice":"Perform an instruction step via an on-chain fault proof processor."},"subgames(uint256,uint256)":{"notice":"A mapping of subgames rooted at a claim index to other claim indices in the subgame."},"version()":{"notice":"Semantic version."},"vm()":{"notice":"Returns the address of the VM."},"weth()":{"notice":"Returns the WETH contract for holding ETH."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/dispute/FaultDisputeGame.sol":"FaultDisputeGame"},"evmVersion":"london","libraries":{}},"sources":{"lib/solady/src/utils/Clone.sol":{"keccak256":"0xb408dc90294bacd394e59c83619e7dc76f45c83ad6f8e923eb07d3a5bab89f22","urls":["bzz-raw://c3abeb55ad062c4b29b5b5edab6167de36615c51621ef71ef3ddfd9f6735a93b","dweb:/ipfs/Qmboh4zX6ZgFVhetUhZGJ14kKXiaGeB9bW3Vseg2MLMGHW"],"license":"MIT"},"lib/solady/src/utils/FixedPointMathLib.sol":{"keccak256":"0x1fbad6f61bd3e5875e6b0060b67626cb1ccb9542c0da368a44eb3870c9a9e160","urls":["bzz-raw://5189fcd5ecff0f449475cf3183e9d6b509cd1221555aba6cd76c70b097cc8260","dweb:/ipfs/Qmbt34Kf5h2DeYzmqXtg3jprYxDCFdENtf41NgCdcARA7u"],"license":"MIT"},"src/cannon/interfaces/IPreimageOracle.sol":{"keccak256":"0x7bda0156571b468cf0e22321945655f2dacd7082f440f742aa4612b36b388a9f","urls":["bzz-raw://5ba53777c65987bc20faa7731476c779e7794a58bafb40191a25275a05e3f8af","dweb:/ipfs/QmbxQwE2BC9aabTruDqkd2CLojwq7G9i2rkWKv46Wucae1"],"license":"MIT"},"src/dispute/FaultDisputeGame.sol":{"keccak256":"0x0d90358576f7b5c14cfe338937ed4fea7d945f9a1b5e68111196310554b485b3","urls":["bzz-raw://5d6d4ce62af4902e17af3a70b6c4688be4d148498c841af9c8ead2c076794e6e","dweb:/ipfs/QmS2ebpEDxbhnUwXYnKEChS2zVpFvfdnJr3AbfDSQovBAN"],"license":"MIT"},"src/dispute/interfaces/IAnchorStateRegistry.sol":{"keccak256":"0x5fd05f2482d149668897e54f92d556a0c3512aa35b51ba800ef15d18dd490cb3","urls":["bzz-raw://689d621bc5c43a41d5232980f0eceecd7a3d8aa99438dfd9fed5f73d5ecd2887","dweb:/ipfs/QmQ5jw54TkdxLuLFti6JZown54rGQ3m3Q93pvnVU1j1HRj"],"license":"MIT"},"src/dispute/interfaces/IBigStepper.sol":{"keccak256":"0xc92ee3069677b903826c83d5b4e46e3be462f9ccf1d95e72a12b1052e3451f0a","urls":["bzz-raw://f93692bd3c8d9533ab8024ce2df6d880328826d1a92fdb9cf45301e2d0c65884","dweb:/ipfs/QmUcmbjTw9gnCUNasgmQjVbSgcCPKZ1FQyA31dH4k5Nc75"],"license":"MIT"},"src/dispute/interfaces/IDelayedWETH.sol":{"keccak256":"0x0bb035e9bbb411696841ea292eeed6d4463c3c3eee7d6c5d8e38a101e8a4ff04","urls":["bzz-raw://0477cf2c137392d35081f23bfd7f3565881767dcb1489a62e7e80b3c178cfce8","dweb:/ipfs/QmTjALjrHg5rvhjfCKPmXLTgkMNneECWaqoarunSoVS37G"],"license":"MIT"},"src/dispute/interfaces/IDisputeGame.sol":{"keccak256":"0xe2611453d5cc05f8aa30dc0e5e15ee5ae29fd3eb55a2c034424250baebf12f9b","urls":["bzz-raw://274e00fbcea3b8455bbaa042130bf1f7a5b2b769f28ad57afbf9fabfd74a757a","dweb:/ipfs/QmRKQTfYdMjQYVbuZhdXts1d752eUq8RwrjqqwV5XRYLi6"],"license":"MIT"},"src/dispute/interfaces/IDisputeGameFactory.sol":{"keccak256":"0x204d89d38d4dc0db40fbf898d95e639ac5608810a5a5506a3d80d71177648bda","urls":["bzz-raw://71e5c0ff04f409f30ca4f8ebfae1592c6ca495e315b059f969d11812e6e84dbd","dweb:/ipfs/QmaNKkhkJv7qHzX6bKB3LjpWBupfMPLhoATUGx1HRTLtXh"],"license":"MIT"},"src/dispute/interfaces/IFaultDisputeGame.sol":{"keccak256":"0xe2f3acb614ecffd6e0fee98443cf58fa95c1209f4ee43e723781733823da3437","urls":["bzz-raw://e4cffbd5b53e6459aad472249e629ae5f52c725b6f6828050df019a18ab50278","dweb:/ipfs/QmTC1GgzbwSyqd9fbJz2veqHnbKJfAK5tBr5jUZcC5N271"],"license":"MIT"},"src/dispute/interfaces/IInitializable.sol":{"keccak256":"0xbc553af6501a972850a98fc6284943f8e95a5183a7b4f64198c16fca2338c9dc","urls":["bzz-raw://b1f1c422ce4a9e72f0bbdec36434206da4af3a32d38f922acab957942e994ce5","dweb:/ipfs/QmNQGWBceLxx1CKSMLfwTM584q8UCgUpF4rrFe8pdbWYtj"],"license":"MIT"},"src/dispute/interfaces/IWETH.sol":{"keccak256":"0x3858f6c0ce3ec7978b1ea1772484c25aec7c8c480ceaf18239f726fdd06fdd1f","urls":["bzz-raw://b72cf3bc31324409480e9ae6eb3e2654da8dff3cbf9f2136b19fe714293b3766","dweb:/ipfs/QmTW3JiFUo8pYhDbthPH8ZSp5f1nmdga4CSzo4YdEzppnM"],"license":"MIT"},"src/dispute/lib/LibGameId.sol":{"keccak256":"0x9a9f30500da6eb7eeaa7193515dc5e45dc479f09ae7d522a07283c0fb5f4bfa6","urls":["bzz-raw://be113d8198d5822385de3d6ff3d7b3e8241993484aa95604ffaf38c2d33f40e0","dweb:/ipfs/QmY9mHC52fqc4gAFYCGobNyuP4TqugQgs8o1kTF33t17Hc"],"license":"MIT"},"src/dispute/lib/LibHashing.sol":{"keccak256":"0x5a072cd028094eee55acb84ed8d08d7422b1fb46658b7e043e916781530a383b","urls":["bzz-raw://b67e54f1318f1fd67b28b16c6861a56e27217c26a12aaea5c446e2ec53143920","dweb:/ipfs/QmVLSTP3PwXzRkR3A4qV9fjZhca9v8J1EnEYuVGUsSirAq"],"license":"MIT"},"src/dispute/lib/LibPosition.sol":{"keccak256":"0xf7ceb26f0ac7067ff8a43f263451050eef6fba2029eafb83d3cbe35224d894a6","urls":["bzz-raw://3bb403b0d707a8e2e3780a19185b918bfe907ca2d1b939ea74ae095a5cdf3b48","dweb:/ipfs/QmYFzkmF8TRomp1cBEbTsKxiEnqLnX6SvSh4y3rVa84pBR"],"license":"MIT"},"src/dispute/lib/LibUDT.sol":{"keccak256":"0x9b61b15f5edfac1e6528aec79c1be6ac712d5f6a62140db87ed749e41a46563f","urls":["bzz-raw://24ef4ecee91638e278886888192b7d2b1811ab99f4e90a06817a4b2651720046","dweb:/ipfs/QmdisoBv1mE9jDv6jvpcbvKhdmJZMMjQmATrEYfBQQrXtZ"],"license":"MIT"},"src/libraries/DisputeErrors.sol":{"keccak256":"0x869bec0d79d97f2d0a00b1e70bf1e6955a2be585521e0084602e54455c0a6937","urls":["bzz-raw://a235c6349437cd2ade72909287404e2993c1c4bd356707299239c71fa3bf780e","dweb:/ipfs/QmcFSh6PWJ5sNg1CeoRyF9EnV8APWDz1kYP98v6ooGxc71"],"license":"MIT"},"src/libraries/DisputeTypes.sol":{"keccak256":"0xae3d053cf40b3e47669b89438524fec4eb571a78be296cc7e7ba23025b3bdf0c","urls":["bzz-raw://4a2b90604718ad29d19a8f21d45a5f8c6188320781fdb7102b3fccadae549961","dweb:/ipfs/QmUBTXgRFG7PvoCBJsXmgi2sZPZFPQQZTptQ91LL7tC2xQ"],"license":"MIT"},"src/libraries/Types.sol":{"keccak256":"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4","urls":["bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e","dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":97769,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"createdAt","offset":0,"slot":"0","type":"t_userDefinedValueType(Timestamp)103261"},{"astId":97773,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"resolvedAt","offset":8,"slot":"0","type":"t_userDefinedValueType(Timestamp)103261"},{"astId":97777,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"status","offset":16,"slot":"0","type":"t_enum(GameStatus)103277"},{"astId":97780,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"initialized","offset":17,"slot":"0","type":"t_bool"},{"astId":97785,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"claimData","offset":0,"slot":"1","type":"t_array(t_struct(ClaimData)100523_storage)dyn_storage"},{"astId":97790,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"credit","offset":0,"slot":"2","type":"t_mapping(t_address,t_uint256)"},{"astId":97796,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"claims","offset":0,"slot":"3","type":"t_mapping(t_userDefinedValueType(ClaimHash)103257,t_bool)"},{"astId":97802,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"subgames","offset":0,"slot":"4","type":"t_mapping(t_uint256,t_array(t_uint256)dyn_storage)"},{"astId":97807,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"resolvedSubgames","offset":0,"slot":"5","type":"t_mapping(t_uint256,t_bool)"},{"astId":97811,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"startingOutputRoot","offset":0,"slot":"6","type":"t_struct(OutputRoot)103283_storage"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_struct(ClaimData)100523_storage)dyn_storage":{"encoding":"dynamic_array","label":"struct IFaultDisputeGame.ClaimData[]","numberOfBytes":"32","base":"t_struct(ClaimData)100523_storage"},"t_array(t_uint256)dyn_storage":{"encoding":"dynamic_array","label":"uint256[]","numberOfBytes":"32","base":"t_uint256"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_enum(GameStatus)103277":{"encoding":"inplace","label":"enum GameStatus","numberOfBytes":"1"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_uint256,t_array(t_uint256)dyn_storage)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => uint256[])","numberOfBytes":"32","value":"t_array(t_uint256)dyn_storage"},"t_mapping(t_uint256,t_bool)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => bool)","numberOfBytes":"32","value":"t_bool"},"t_mapping(t_userDefinedValueType(ClaimHash)103257,t_bool)":{"encoding":"mapping","key":"t_userDefinedValueType(ClaimHash)103257","label":"mapping(ClaimHash => bool)","numberOfBytes":"32","value":"t_bool"},"t_struct(ClaimData)100523_storage":{"encoding":"inplace","label":"struct IFaultDisputeGame.ClaimData","numberOfBytes":"160","members":[{"astId":100507,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"parentIndex","offset":0,"slot":"0","type":"t_uint32"},{"astId":100509,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"counteredBy","offset":4,"slot":"0","type":"t_address"},{"astId":100511,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"claimant","offset":0,"slot":"1","type":"t_address"},{"astId":100513,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"bond","offset":0,"slot":"2","type":"t_uint128"},{"astId":100516,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"claim","offset":0,"slot":"3","type":"t_userDefinedValueType(Claim)103255"},{"astId":100519,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"position","offset":0,"slot":"4","type":"t_userDefinedValueType(Position)103269"},{"astId":100522,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"clock","offset":16,"slot":"4","type":"t_userDefinedValueType(Clock)103267"}]},"t_struct(OutputRoot)103283_storage":{"encoding":"inplace","label":"struct OutputRoot","numberOfBytes":"64","members":[{"astId":103280,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"root","offset":0,"slot":"0","type":"t_userDefinedValueType(Hash)103253"},{"astId":103282,"contract":"src/dispute/FaultDisputeGame.sol:FaultDisputeGame","label":"l2BlockNumber","offset":0,"slot":"1","type":"t_uint256"}]},"t_uint128":{"encoding":"inplace","label":"uint128","numberOfBytes":"16"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint32":{"encoding":"inplace","label":"uint32","numberOfBytes":"4"},"t_userDefinedValueType(Claim)103255":{"encoding":"inplace","label":"Claim","numberOfBytes":"32"},"t_userDefinedValueType(ClaimHash)103257":{"encoding":"inplace","label":"ClaimHash","numberOfBytes":"32"},"t_userDefinedValueType(Clock)103267":{"encoding":"inplace","label":"Clock","numberOfBytes":"16"},"t_userDefinedValueType(Hash)103253":{"encoding":"inplace","label":"Hash","numberOfBytes":"32"},"t_userDefinedValueType(Position)103269":{"encoding":"inplace","label":"Position","numberOfBytes":"16"},"t_userDefinedValueType(Timestamp)103261":{"encoding":"inplace","label":"Timestamp","numberOfBytes":"8"}}},"userdoc":{"version":1,"kind":"user","methods":{"absolutePrestate()":{"notice":"Returns the absolute prestate of the instruction trace."},"addLocalData(uint256,uint256,uint256)":{"notice":"Posts the requested local data to the VM's `PreimageOralce`."},"anchorStateRegistry()":{"notice":"Returns the anchor state registry contract."},"attack(uint256,bytes32)":{"notice":"Attack a disagreed upon `Claim`."},"claimCredit(address)":{"notice":"Claim the credit belonging to the recipient address."},"claimData(uint256)":{"notice":"An append-only array of all claims made during the dispute game."},"claimDataLen()":{"notice":"Returns the length of the `claimData` array."},"claims(bytes32)":{"notice":"A mapping to allow for constant-time lookups of existing claims."},"clockExtension()":{"notice":"Returns the clock extension constant."},"createdAt()":{"notice":"The starting timestamp of the game"},"credit(address)":{"notice":"Credited balances for winning participants."},"defend(uint256,bytes32)":{"notice":"Defend an agreed upon `Claim`."},"extraData()":{"notice":"Getter for the extra data."},"gameCreator()":{"notice":"Getter for the creator of the dispute game."},"gameData()":{"notice":"A compliant implementation of this interface should return the components of the game UUID's preimage provided in the cwia payload. The preimage of the UUID is constructed as `keccak256(gameType . rootClaim . extraData)` where `.` denotes concatenation."},"gameType()":{"notice":"Getter for the game type."},"getChallengerDuration(uint256)":{"notice":"Returns the amount of time elapsed on the potential challenger to `_claimIndex`'s chess clock. Maxes out at `MAX_CLOCK_DURATION`."},"getRequiredBond(uint128)":{"notice":"Returns the required bond for a given move kind."},"initialize()":{"notice":"Initializes the contract."},"l1Head()":{"notice":"Getter for the parent hash of the L1 block when the dispute game was created."},"l2BlockNumber()":{"notice":"The l2BlockNumber of the disputed output root in the `L2OutputOracle`."},"l2ChainId()":{"notice":"Returns the chain ID of the L2 network this contract argues about."},"maxClockDuration()":{"notice":"Returns the max clock duration."},"maxGameDepth()":{"notice":"Returns the max game depth."},"move(uint256,bytes32,bool)":{"notice":"Generic move function, used for both `attack` and `defend` moves."},"resolve()":{"notice":"If all necessary information has been gathered, this function should mark the game status as either `CHALLENGER_WINS` or `DEFENDER_WINS` and return the status of the resolved game. It is at this stage that the bonds should be awarded to the necessary parties."},"resolveClaim(uint256)":{"notice":"Resolves the subgame rooted at the given claim index."},"resolvedAt()":{"notice":"The timestamp of the game's global resolution."},"resolvedSubgames(uint256)":{"notice":"An interneal mapping of resolved subgames rooted at a claim index."},"rootClaim()":{"notice":"Getter for the root claim."},"splitDepth()":{"notice":"Returns the split depth."},"startingBlockNumber()":{"notice":"Only the starting block number of the game."},"startingOutputRoot()":{"notice":"The latest finalized output root, serving as the anchor for output bisection."},"startingRootHash()":{"notice":"Only the starting output root of the game."},"status()":{"notice":"Returns the current status of the game."},"step(uint256,bool,bytes,bytes)":{"notice":"Perform an instruction step via an on-chain fault proof processor."},"subgames(uint256,uint256)":{"notice":"A mapping of subgames rooted at a claim index to other claim indices in the subgame."},"version()":{"notice":"Semantic version."},"vm()":{"notice":"Returns the address of the VM."},"weth()":{"notice":"Returns the WETH contract for holding ETH."}},"events":{"Move(uint256,bytes32,address)":{"notice":"Emitted when a new claim is added to the DAG by `claimant`"},"Resolved(uint8)":{"notice":"Emitted when the game is resolved."}},"errors":{"AlreadyInitialized()":[{"notice":"Thrown when a dispute game has already been initialized."}],"AnchorRootNotFound()":[{"notice":"Thrown when an anchor root is not found for a given game type."}],"BondTransferFailed()":[{"notice":"Thrown when the transfer of credit to a recipient account reverts."}],"CannotDefendRootClaim()":[{"notice":"Thrown when a defense against the root claim is attempted."}],"ClaimAboveSplit()":[{"notice":"Thrown when a parent output root is attempted to be found on a claim that is in the output root portion of the tree."}],"ClaimAlreadyExists()":[{"notice":"Thrown when a claim is attempting to be made that already exists."}],"ClaimAlreadyResolved()":[{"notice":"Thrown when resolving a claim that has already been resolved."}],"ClockNotExpired()":[{"notice":"Thrown when the game is attempted to be resolved too early."}],"ClockTimeExceeded()":[{"notice":"Thrown when a move is attempted to be made after the clock has timed out."}],"DuplicateStep()":[{"notice":"Thrown when trying to step against a claim for a second time, after it has already been countered with an instruction step."}],"GameDepthExceeded()":[{"notice":"Thrown when a move is attempted to be made at or greater than the max depth of the game."}],"GameNotInProgress()":[{"notice":"Thrown when an action that requires the game to be `IN_PROGRESS` is invoked when the game is not in progress."}],"IncorrectBondAmount()":[{"notice":"Thrown when a supplied bond is not equal to the required bond amount to cover the cost of the interaction."}],"InvalidClockExtension()":[{"notice":"Thrown on deployment if the max clock duration is less than or equal to the clock extension."}],"InvalidLocalIdent()":[{"notice":"Thrown when an invalid local identifier is passed to the `addLocalData` function."}],"InvalidParent()":[{"notice":"Thrown when a step is attempted above the maximum game depth."}],"InvalidPrestate()":[{"notice":"Thrown when an invalid prestate is supplied to `step`."}],"InvalidSplitDepth()":[{"notice":"Thrown on deployment if the split depth is greater than or equal to the max depth of the game."}],"MaxDepthTooLarge()":[{"notice":"Thrown on deployment if the max depth is greater than `LibPosition.`"}],"NoCreditToClaim()":[{"notice":"Thrown when a credit claim is attempted for a value of 0."}],"OutOfOrderResolution()":[{"notice":"Thrown when resolving claims out of order."}],"UnexpectedRootClaim(bytes32)":[{"notice":"Thrown when the root claim has an unexpected VM status. Some games can only start with a root-claim with a specific status."}],"ValidStep()":[{"notice":"Thrown when a step is made that computes the expected post state correctly."}]},"notice":"An implementation of the `IFaultDisputeGame` interface."},"devdoc":{"version":1,"kind":"dev","methods":{"addLocalData(uint256,uint256,uint256)":{"params":{"_execLeafIdx":"The index of the leaf claim in an execution subgame that requires the local data for a step.","_ident":"The local identifier of the data to post.","_partOffset":"The offset of the data to post."}},"attack(uint256,bytes32)":{"params":{"_claim":"The `Claim` at the relative attack position.","_parentIndex":"Index of the `Claim` to attack in the `claimData` array."}},"claimCredit(address)":{"params":{"_recipient":"The owner and recipient of the credit."}},"constructor":{"params":{"_absolutePrestate":"The absolute prestate of the instruction trace.","_anchorStateRegistry":"The contract that stores the anchor state for each game type.","_clockExtension":"The clock extension to perform when the remaining duration is less than the extension.","_gameType":"The type ID of the game.","_l2ChainId":"Chain ID of the L2 network this contract argues about.","_maxClockDuration":"The maximum amount of time that may accumulate on a team's chess clock.","_maxGameDepth":"The maximum depth of bisection.","_splitDepth":"The final depth of the output bisection portion of the game.","_vm":"An onchain VM that performs single instruction steps on an FPP trace.","_weth":"WETH contract for holding ETH."}},"defend(uint256,bytes32)":{"params":{"_claim":"The `Claim` at the relative defense position.","_parentIndex":"Index of the claim to defend in the `claimData` array."}},"extraData()":{"details":"`clones-with-immutable-args` argument #4","returns":{"extraData_":"Any extra data supplied to the dispute game contract by the creator."}},"gameCreator()":{"details":"`clones-with-immutable-args` argument #1","returns":{"creator_":"The creator of the dispute game."}},"gameData()":{"returns":{"extraData_":"Any extra data supplied to the dispute game contract by the creator.","gameType_":"The type of proof system being used.","rootClaim_":"The root claim of the DisputeGame."}},"gameType()":{"details":"The reference impl should be entirely different depending on the type (fault, validity) i.e. The game type should indicate the security model.","returns":{"gameType_":"The type of proof system being used."}},"getChallengerDuration(uint256)":{"params":{"_claimIndex":"The index of the subgame root claim."},"returns":{"duration_":"The time elapsed on the potential challenger to `_claimIndex`'s chess clock."}},"getRequiredBond(uint128)":{"params":{"_position":"The position of the bonded interaction."},"returns":{"requiredBond_":"The required ETH bond for the given move, in wei."}},"initialize()":{"details":"This function may only be called once."},"l1Head()":{"details":"`clones-with-immutable-args` argument #3","returns":{"l1Head_":"The parent hash of the L1 block when the dispute game was created."}},"move(uint256,bytes32,bool)":{"params":{"_challengeIndex":"The index of the claim being moved against.","_claim":"The claim at the next logical position in the game.","_isAttack":"Whether or not the move is an attack or defense."}},"resolve()":{"details":"May only be called if the `status` is `IN_PROGRESS`.","returns":{"status_":"The status of the game after resolution."}},"resolveClaim(uint256)":{"details":"This function must be called bottom-up in the DAG A subgame is a tree of claims that has a maximum depth of 1. A subgame root claims is valid if, and only if, all of its child claims are invalid. At the deepest level in the DAG, a claim is invalid if there's a successful step against it.","params":{"_claimIndex":"The index of the subgame root claim to resolve."}},"rootClaim()":{"details":"`clones-with-immutable-args` argument #2","returns":{"rootClaim_":"The root claim of the DisputeGame."}},"step(uint256,bool,bytes,bytes)":{"details":"This function should point to a fault proof processor in order to execute a step in the fault proof program on-chain. The interface of the fault proof processor contract should adhere to the `IBigStepper` interface.","params":{"_claimIndex":"The index of the challenged claim within `claimData`.","_isAttack":"Whether or not the step is an attack or a defense.","_proof":"Proof to access memory nodes in the VM's merkle state tree.","_stateData":"The stateData of the step is the preimage of the claim at the given prestate, which is at `_stateIndex` if the move is an attack and `_claimIndex` if the move is a defense. If the step is an attack on the first instruction, it is the absolute prestate of the fault proof VM."}}},"errors":{"UnexpectedRootClaim(bytes32)":[{"params":{"rootClaim":"is the claim that was unexpected."}}]},"title":"FaultDisputeGame"},"ast":{"absolutePath":"src/dispute/FaultDisputeGame.sol","id":99928,"exportedSymbols":{"AlreadyInitialized":[103120],"AnchorRootNotFound":[103192],"BadAuth":[103195],"BadExtraData":[103132],"BondAmount":[103259],"BondTransferFailed":[103129],"CannotDefendRootClaim":[103135],"Claim":[103255],"ClaimAboveSplit":[103177],"ClaimAlreadyExists":[103138],"ClaimAlreadyResolved":[103174],"ClaimHash":[103257],"Clock":[103267],"ClockNotExpired":[103150],"ClockTimeExceeded":[103147],"Clone":[60963],"DuplicateStep":[103189],"Duration":[103263],"FaultDisputeGame":[99927],"FixedPointMathLib":[62288],"GameAlreadyExists":[103111],"GameDepthExceeded":[103153],"GameId":[103265],"GameNotInProgress":[103144],"GameStatus":[103277],"GameType":[103271],"GameTypes":[103317],"Hash":[103253],"IAnchorStateRegistry":[100146],"IBigStepper":[100171],"IDelayedWETH":[100239],"IDisputeGame":[100327],"IFaultDisputeGame":[100608],"IInitializable":[100616],"IPreimageOracle":[96782],"ISemver":[109417],"IncorrectBondAmount":[103123],"InvalidClaim":[103141],"InvalidClockExtension":[103183],"InvalidLocalIdent":[103168],"InvalidParent":[103156],"InvalidPrestate":[103159],"InvalidSplitDepth":[103180],"L1HeadTooOld":[103165],"LibClaim":[101086],"LibClock":[101073],"LibDuration":[101099],"LibGameId":[100778],"LibGameType":[101151],"LibHash":[101112],"LibHashing":[100800],"LibPosition":[101018],"LibTimestamp":[101125],"LibVMStatus":[101138],"LocalPreimageKey":[103373],"MaxDepthTooLarge":[103186],"NoCreditToClaim":[103126],"NoImplementation":[103105],"OutOfOrderResolution":[103171],"OutputRoot":[103283],"Position":[103269],"Timestamp":[103261],"Types":[104349],"UnexpectedRootClaim":[103117],"VMStatus":[103273],"VMStatuses":[103351],"ValidStep":[103162]},"nodeType":"SourceUnit","src":"32:44792:164","nodes":[{"id":97684,"nodeType":"PragmaDirective","src":"32:23:164","nodes":[],"literals":["solidity","0.8",".15"]},{"id":97686,"nodeType":"ImportDirective","src":"57:72:164","nodes":[],"absolutePath":"lib/solady/src/utils/FixedPointMathLib.sol","file":"@solady/utils/FixedPointMathLib.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":62289,"symbolAliases":[{"foreign":{"id":97685,"name":"FixedPointMathLib","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62288,"src":"66:17:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97688,"nodeType":"ImportDirective","src":"131:71:164","nodes":[],"absolutePath":"src/dispute/interfaces/IDelayedWETH.sol","file":"src/dispute/interfaces/IDelayedWETH.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":100240,"symbolAliases":[{"foreign":{"id":97687,"name":"IDelayedWETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100239,"src":"140:12:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97690,"nodeType":"ImportDirective","src":"203:71:164","nodes":[],"absolutePath":"src/dispute/interfaces/IDisputeGame.sol","file":"src/dispute/interfaces/IDisputeGame.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":100328,"symbolAliases":[{"foreign":{"id":97689,"name":"IDisputeGame","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100327,"src":"212:12:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97692,"nodeType":"ImportDirective","src":"275:81:164","nodes":[],"absolutePath":"src/dispute/interfaces/IFaultDisputeGame.sol","file":"src/dispute/interfaces/IFaultDisputeGame.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":100609,"symbolAliases":[{"foreign":{"id":97691,"name":"IFaultDisputeGame","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100608,"src":"284:17:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97694,"nodeType":"ImportDirective","src":"357:75:164","nodes":[],"absolutePath":"src/dispute/interfaces/IInitializable.sol","file":"src/dispute/interfaces/IInitializable.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":100617,"symbolAliases":[{"foreign":{"id":97693,"name":"IInitializable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100616,"src":"366:14:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97697,"nodeType":"ImportDirective","src":"433:86:164","nodes":[],"absolutePath":"src/dispute/interfaces/IBigStepper.sol","file":"src/dispute/interfaces/IBigStepper.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":100172,"symbolAliases":[{"foreign":{"id":97695,"name":"IBigStepper","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100171,"src":"442:11:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":97696,"name":"IPreimageOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":96782,"src":"455:15:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97699,"nodeType":"ImportDirective","src":"520:87:164","nodes":[],"absolutePath":"src/dispute/interfaces/IAnchorStateRegistry.sol","file":"src/dispute/interfaces/IAnchorStateRegistry.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":100147,"symbolAliases":[{"foreign":{"id":97698,"name":"IAnchorStateRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100146,"src":"529:20:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97701,"nodeType":"ImportDirective","src":"609:48:164","nodes":[],"absolutePath":"lib/solady/src/utils/Clone.sol","file":"@solady/utils/Clone.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":60964,"symbolAliases":[{"foreign":{"id":97700,"name":"Clone","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":60963,"src":"618:5:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97703,"nodeType":"ImportDirective","src":"658:48:164","nodes":[],"absolutePath":"src/libraries/Types.sol","file":"src/libraries/Types.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":104350,"symbolAliases":[{"foreign":{"id":97702,"name":"Types","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104349,"src":"667:5:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97705,"nodeType":"ImportDirective","src":"707:52:164","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":97704,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"716:7:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97707,"nodeType":"ImportDirective","src":"760:54:164","nodes":[],"absolutePath":"src/dispute/lib/LibUDT.sol","file":"src/dispute/lib/LibUDT.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":101152,"symbolAliases":[{"foreign":{"id":97706,"name":"LibClock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":101073,"src":"769:8:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":97708,"nodeType":"ImportDirective","src":"816:40:164","nodes":[],"absolutePath":"src/libraries/DisputeTypes.sol","file":"src/libraries/DisputeTypes.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":103374,"symbolAliases":[],"unitAlias":""},{"id":97709,"nodeType":"ImportDirective","src":"857:41:164","nodes":[],"absolutePath":"src/libraries/DisputeErrors.sol","file":"src/libraries/DisputeErrors.sol","nameLocation":"-1:-1:-1","scope":99928,"sourceUnit":103196,"symbolAliases":[],"unitAlias":""},{"id":99927,"nodeType":"ContractDefinition","src":"996:43827:164","nodes":[{"id":97720,"nodeType":"VariableDeclaration","src":"1444:42:164","nodes":[],"constant":false,"documentation":{"id":97717,"nodeType":"StructuredDocumentation","src":"1273:166:164","text":"@notice The absolute prestate of the instruction trace. This is a constant that is defined\n by the program that is being used to execute the trace."},"mutability":"immutable","name":"ABSOLUTE_PRESTATE","nameLocation":"1469:17:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":97719,"nodeType":"UserDefinedTypeName","pathNode":{"id":97718,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"1444:5:164"},"referencedDeclaration":103255,"src":"1444:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"id":97723,"nodeType":"VariableDeclaration","src":"1536:41:164","nodes":[],"constant":false,"documentation":{"id":97721,"nodeType":"StructuredDocumentation","src":"1493:38:164","text":"@notice The max depth of the game."},"mutability":"immutable","name":"MAX_GAME_DEPTH","nameLocation":"1563:14:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97722,"name":"uint256","nodeType":"ElementaryTypeName","src":"1536:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"id":97726,"nodeType":"VariableDeclaration","src":"1750:38:164","nodes":[],"constant":false,"documentation":{"id":97724,"nodeType":"StructuredDocumentation","src":"1584:161:164","text":"@notice The max depth of the output bisection portion of the position tree. Immediately beneath\n this depth, execution trace bisection begins."},"mutability":"immutable","name":"SPLIT_DEPTH","nameLocation":"1777:11:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97725,"name":"uint256","nodeType":"ElementaryTypeName","src":"1750:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"id":97730,"nodeType":"VariableDeclaration","src":"1911:46:164","nodes":[],"constant":false,"documentation":{"id":97727,"nodeType":"StructuredDocumentation","src":"1795:111:164","text":"@notice The maximum duration that may accumulate on a team's chess clock before they may no longer respond."},"mutability":"immutable","name":"MAX_CLOCK_DURATION","nameLocation":"1939:18:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"},"typeName":{"id":97729,"nodeType":"UserDefinedTypeName","pathNode":{"id":97728,"name":"Duration","nodeType":"IdentifierPath","referencedDeclaration":103263,"src":"1911:8:164"},"referencedDeclaration":103263,"src":"1911:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"visibility":"internal"},{"id":97734,"nodeType":"VariableDeclaration","src":"2065:33:164","nodes":[],"constant":false,"documentation":{"id":97731,"nodeType":"StructuredDocumentation","src":"1964:96:164","text":"@notice An onchain VM that performs single instruction steps on a fault proof program trace."},"mutability":"immutable","name":"VM","nameLocation":"2096:2:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"},"typeName":{"id":97733,"nodeType":"UserDefinedTypeName","pathNode":{"id":97732,"name":"IBigStepper","nodeType":"IdentifierPath","referencedDeclaration":100171,"src":"2065:11:164"},"referencedDeclaration":100171,"src":"2065:11:164","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"}},"visibility":"internal"},{"id":97738,"nodeType":"VariableDeclaration","src":"2139:37:164","nodes":[],"constant":false,"documentation":{"id":97735,"nodeType":"StructuredDocumentation","src":"2105:29:164","text":"@notice The game type ID."},"mutability":"immutable","name":"GAME_TYPE","nameLocation":"2167:9:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":97737,"nodeType":"UserDefinedTypeName","pathNode":{"id":97736,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"2139:8:164"},"referencedDeclaration":103271,"src":"2139:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},{"id":97742,"nodeType":"VariableDeclaration","src":"2230:36:164","nodes":[],"constant":false,"documentation":{"id":97739,"nodeType":"StructuredDocumentation","src":"2183:42:164","text":"@notice WETH contract for holding ETH."},"mutability":"immutable","name":"WETH","nameLocation":"2262:4:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"},"typeName":{"id":97741,"nodeType":"UserDefinedTypeName","pathNode":{"id":97740,"name":"IDelayedWETH","nodeType":"IdentifierPath","referencedDeclaration":100239,"src":"2230:12:164"},"referencedDeclaration":100239,"src":"2230:12:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"visibility":"internal"},{"id":97746,"nodeType":"VariableDeclaration","src":"2316:61:164","nodes":[],"constant":false,"documentation":{"id":97743,"nodeType":"StructuredDocumentation","src":"2273:38:164","text":"@notice The anchor state registry."},"mutability":"immutable","name":"ANCHOR_STATE_REGISTRY","nameLocation":"2356:21:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"},"typeName":{"id":97745,"nodeType":"UserDefinedTypeName","pathNode":{"id":97744,"name":"IAnchorStateRegistry","nodeType":"IdentifierPath","referencedDeclaration":100146,"src":"2316:20:164"},"referencedDeclaration":100146,"src":"2316:20:164","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"}},"visibility":"internal"},{"id":97749,"nodeType":"VariableDeclaration","src":"2459:38:164","nodes":[],"constant":false,"documentation":{"id":97747,"nodeType":"StructuredDocumentation","src":"2384:70:164","text":"@notice The chain ID of the L2 network this contract argues about."},"mutability":"immutable","name":"L2_CHAIN_ID","nameLocation":"2486:11:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97748,"name":"uint256","nodeType":"ElementaryTypeName","src":"2459:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"id":97753,"nodeType":"VariableDeclaration","src":"2666:43:164","nodes":[],"constant":false,"documentation":{"id":97750,"nodeType":"StructuredDocumentation","src":"2504:157:164","text":"@notice The duration of the clock extension. Will be doubled if the grandchild is the root claim of an execution\n trace bisection subgame."},"mutability":"immutable","name":"CLOCK_EXTENSION","nameLocation":"2694:15:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"},"typeName":{"id":97752,"nodeType":"UserDefinedTypeName","pathNode":{"id":97751,"name":"Duration","nodeType":"IdentifierPath","referencedDeclaration":103263,"src":"2666:8:164"},"referencedDeclaration":103263,"src":"2666:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"visibility":"internal"},{"id":97761,"nodeType":"VariableDeclaration","src":"2788:59:164","nodes":[],"constant":true,"documentation":{"id":97754,"nodeType":"StructuredDocumentation","src":"2716:67:164","text":"@notice The global root claim's position is always at gindex 1."},"mutability":"constant","name":"ROOT_POSITION","nameLocation":"2815:13:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":97756,"nodeType":"UserDefinedTypeName","pathNode":{"id":97755,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"2788:8:164"},"referencedDeclaration":103269,"src":"2788:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"value":{"arguments":[{"hexValue":"31","id":97759,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2845:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"expression":{"id":97757,"name":"Position","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103269,"src":"2831:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Position_$103269_$","typeString":"type(Position)"}},"id":97758,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"2831:13:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint128_$returns$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (uint128) pure returns (Position)"}},"id":97760,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2831:16:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"},{"id":97765,"nodeType":"VariableDeclaration","src":"2918:41:164","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":97762,"nodeType":"StructuredDocumentation","src":"2854:59:164","text":"@notice Semantic version.\n @custom:semver 0.17.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"2941:7:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":97763,"name":"string","nodeType":"ElementaryTypeName","src":"2918:6:164","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"302e31372e30","id":97764,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2951:8:164","typeDescriptions":{"typeIdentifier":"t_stringliteral_512d9a572f9735444291a88a6ab37093045e89287be8ab073814769d70f29bc8","typeString":"literal_string \"0.17.0\""},"value":"0.17.0"},"visibility":"public"},{"id":97769,"nodeType":"VariableDeclaration","src":"3017:26:164","nodes":[],"baseFunctions":[100260],"constant":false,"documentation":{"id":97766,"nodeType":"StructuredDocumentation","src":"2966:46:164","text":"@notice The starting timestamp of the game"},"functionSelector":"cf09e0d0","mutability":"mutable","name":"createdAt","nameLocation":"3034:9:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"},"typeName":{"id":97768,"nodeType":"UserDefinedTypeName","pathNode":{"id":97767,"name":"Timestamp","nodeType":"IdentifierPath","referencedDeclaration":103261,"src":"3017:9:164"},"referencedDeclaration":103261,"src":"3017:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"visibility":"public"},{"id":97773,"nodeType":"VariableDeclaration","src":"3113:27:164","nodes":[],"baseFunctions":[100267],"constant":false,"documentation":{"id":97770,"nodeType":"StructuredDocumentation","src":"3050:58:164","text":"@notice The timestamp of the game's global resolution."},"functionSelector":"19effeb4","mutability":"mutable","name":"resolvedAt","nameLocation":"3130:10:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"},"typeName":{"id":97772,"nodeType":"UserDefinedTypeName","pathNode":{"id":97771,"name":"Timestamp","nodeType":"IdentifierPath","referencedDeclaration":103261,"src":"3113:9:164"},"referencedDeclaration":103261,"src":"3113:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"visibility":"public"},{"id":97777,"nodeType":"VariableDeclaration","src":"3180:24:164","nodes":[],"baseFunctions":[100274],"constant":false,"documentation":{"id":97774,"nodeType":"StructuredDocumentation","src":"3147:28:164","text":"@inheritdoc IDisputeGame"},"functionSelector":"200d2ed2","mutability":"mutable","name":"status","nameLocation":"3198:6:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"},"typeName":{"id":97776,"nodeType":"UserDefinedTypeName","pathNode":{"id":97775,"name":"GameStatus","nodeType":"IdentifierPath","referencedDeclaration":103277,"src":"3180:10:164"},"referencedDeclaration":103277,"src":"3180:10:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"visibility":"public"},{"id":97780,"nodeType":"VariableDeclaration","src":"3292:25:164","nodes":[],"constant":false,"documentation":{"id":97778,"nodeType":"StructuredDocumentation","src":"3211:76:164","text":"@notice Flag for the `initialize` function to prevent re-initialization."},"mutability":"mutable","name":"initialized","nameLocation":"3306:11:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":97779,"name":"bool","nodeType":"ElementaryTypeName","src":"3292:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"id":97785,"nodeType":"VariableDeclaration","src":"3405:28:164","nodes":[],"constant":false,"documentation":{"id":97781,"nodeType":"StructuredDocumentation","src":"3324:76:164","text":"@notice An append-only array of all claims made during the dispute game."},"functionSelector":"c6f0308c","mutability":"mutable","name":"claimData","nameLocation":"3424:9:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData[]"},"typeName":{"baseType":{"id":97783,"nodeType":"UserDefinedTypeName","pathNode":{"id":97782,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"3405:9:164"},"referencedDeclaration":100523,"src":"3405:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"id":97784,"nodeType":"ArrayTypeName","src":"3405:11:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData[]"}},"visibility":"public"},{"id":97790,"nodeType":"VariableDeclaration","src":"3500:41:164","nodes":[],"constant":false,"documentation":{"id":97786,"nodeType":"StructuredDocumentation","src":"3440:55:164","text":"@notice Credited balances for winning participants."},"functionSelector":"d5d44d80","mutability":"mutable","name":"credit","nameLocation":"3535:6:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":97789,"keyType":{"id":97787,"name":"address","nodeType":"ElementaryTypeName","src":"3508:7:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"3500:27:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":97788,"name":"uint256","nodeType":"ElementaryTypeName","src":"3519:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"id":97796,"nodeType":"VariableDeclaration","src":"3629:40:164","nodes":[],"constant":false,"documentation":{"id":97791,"nodeType":"StructuredDocumentation","src":"3548:76:164","text":"@notice A mapping to allow for constant-time lookups of existing claims."},"functionSelector":"eff0f592","mutability":"mutable","name":"claims","nameLocation":"3663:6:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_ClaimHash_$103257_$_t_bool_$","typeString":"mapping(ClaimHash => bool)"},"typeName":{"id":97795,"keyType":{"id":97793,"nodeType":"UserDefinedTypeName","pathNode":{"id":97792,"name":"ClaimHash","nodeType":"IdentifierPath","referencedDeclaration":103257,"src":"3637:9:164"},"referencedDeclaration":103257,"src":"3637:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_ClaimHash_$103257","typeString":"ClaimHash"}},"nodeType":"Mapping","src":"3629:26:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_ClaimHash_$103257_$_t_bool_$","typeString":"mapping(ClaimHash => bool)"},"valueType":{"id":97794,"name":"bool","nodeType":"ElementaryTypeName","src":"3650:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}},"visibility":"public"},{"id":97802,"nodeType":"VariableDeclaration","src":"3777:45:164","nodes":[],"constant":false,"documentation":{"id":97797,"nodeType":"StructuredDocumentation","src":"3676:96:164","text":"@notice A mapping of subgames rooted at a claim index to other claim indices in the subgame."},"functionSelector":"2ad69aeb","mutability":"mutable","name":"subgames","nameLocation":"3814:8:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_uint256_$dyn_storage_$","typeString":"mapping(uint256 => uint256[])"},"typeName":{"id":97801,"keyType":{"id":97798,"name":"uint256","nodeType":"ElementaryTypeName","src":"3785:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"3777:29:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_uint256_$dyn_storage_$","typeString":"mapping(uint256 => uint256[])"},"valueType":{"baseType":{"id":97799,"name":"uint256","nodeType":"ElementaryTypeName","src":"3796:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":97800,"nodeType":"ArrayTypeName","src":"3796:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}}},"visibility":"public"},{"id":97807,"nodeType":"VariableDeclaration","src":"3912:48:164","nodes":[],"constant":false,"documentation":{"id":97803,"nodeType":"StructuredDocumentation","src":"3829:78:164","text":"@notice An interneal mapping of resolved subgames rooted at a claim index."},"functionSelector":"fe2bbeb2","mutability":"mutable","name":"resolvedSubgames","nameLocation":"3944:16:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"},"typeName":{"id":97806,"keyType":{"id":97804,"name":"uint256","nodeType":"ElementaryTypeName","src":"3920:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"3912:24:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"},"valueType":{"id":97805,"name":"bool","nodeType":"ElementaryTypeName","src":"3931:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}},"visibility":"public"},{"id":97811,"nodeType":"VariableDeclaration","src":"4061:36:164","nodes":[],"baseFunctions":[100594],"constant":false,"documentation":{"id":97808,"nodeType":"StructuredDocumentation","src":"3967:89:164","text":"@notice The latest finalized output root, serving as the anchor for output bisection."},"functionSelector":"57da950e","mutability":"mutable","name":"startingOutputRoot","nameLocation":"4079:18:164","scope":99927,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRoot_$103283_storage","typeString":"struct OutputRoot"},"typeName":{"id":97810,"nodeType":"UserDefinedTypeName","pathNode":{"id":97809,"name":"OutputRoot","nodeType":"IdentifierPath","referencedDeclaration":103283,"src":"4061:10:164"},"referencedDeclaration":103283,"src":"4061:10:164","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRoot_$103283_storage_ptr","typeString":"struct OutputRoot"}},"visibility":"public"},{"id":97911,"nodeType":"FunctionDefinition","src":"4927:1230:164","nodes":[],"body":{"id":97910,"nodeType":"Block","src":"5268:889:164","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97847,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":97842,"name":"_maxGameDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97820,"src":"5375:13:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":97846,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":97843,"name":"LibPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":101018,"src":"5391:11:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LibPosition_$101018_$","typeString":"type(library LibPosition)"}},"id":97844,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"MAX_POSITION_BITLEN","nodeType":"MemberAccess","referencedDeclaration":100809,"src":"5391:31:164","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":97845,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5425:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"5391:35:164","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"5375:51:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97851,"nodeType":"IfStatement","src":"5371:82:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":97848,"name":"MaxDepthTooLarge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103186,"src":"5435:16:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":97849,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5435:18:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97850,"nodeType":"RevertStatement","src":"5428:25:164"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97854,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":97852,"name":"_splitDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97822,"src":"5549:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":97853,"name":"_maxGameDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97820,"src":"5564:13:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5549:28:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97858,"nodeType":"IfStatement","src":"5545:60:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":97855,"name":"InvalidSplitDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103180,"src":"5586:17:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":97856,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5586:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97857,"nodeType":"RevertStatement","src":"5579:26:164"}},{"condition":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":97865,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":97859,"name":"_clockExtension","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97825,"src":"5698:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":97860,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"5698:19:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":97861,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5698:21:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":97862,"name":"_maxClockDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97828,"src":"5722:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":97863,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"5722:21:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":97864,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5722:23:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"5698:47:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97869,"nodeType":"IfStatement","src":"5694:83:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":97866,"name":"InvalidClockExtension","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103183,"src":"5754:21:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":97867,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5754:23:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97868,"nodeType":"RevertStatement","src":"5747:30:164"}},{"expression":{"id":97872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97870,"name":"GAME_TYPE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97738,"src":"5788:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97871,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97815,"src":"5800:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"src":"5788:21:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"id":97873,"nodeType":"ExpressionStatement","src":"5788:21:164"},{"expression":{"id":97876,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97874,"name":"ABSOLUTE_PRESTATE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97720,"src":"5819:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97875,"name":"_absolutePrestate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97818,"src":"5839:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"src":"5819:37:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":97877,"nodeType":"ExpressionStatement","src":"5819:37:164"},{"expression":{"id":97880,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97878,"name":"MAX_GAME_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97723,"src":"5866:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97879,"name":"_maxGameDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97820,"src":"5883:13:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5866:30:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":97881,"nodeType":"ExpressionStatement","src":"5866:30:164"},{"expression":{"id":97884,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97882,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"5906:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97883,"name":"_splitDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97822,"src":"5920:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5906:25:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":97885,"nodeType":"ExpressionStatement","src":"5906:25:164"},{"expression":{"id":97888,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97886,"name":"CLOCK_EXTENSION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97753,"src":"5941:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97887,"name":"_clockExtension","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97825,"src":"5959:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"src":"5941:33:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":97889,"nodeType":"ExpressionStatement","src":"5941:33:164"},{"expression":{"id":97892,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97890,"name":"MAX_CLOCK_DURATION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97730,"src":"5984:18:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97891,"name":"_maxClockDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97828,"src":"6005:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"src":"5984:38:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":97893,"nodeType":"ExpressionStatement","src":"5984:38:164"},{"expression":{"id":97896,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97894,"name":"VM","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97734,"src":"6032:2:164","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97895,"name":"_vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97831,"src":"6037:3:164","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"}},"src":"6032:8:164","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"}},"id":97897,"nodeType":"ExpressionStatement","src":"6032:8:164"},{"expression":{"id":97900,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97898,"name":"WETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97742,"src":"6050:4:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97899,"name":"_weth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97834,"src":"6057:5:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"src":"6050:12:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"id":97901,"nodeType":"ExpressionStatement","src":"6050:12:164"},{"expression":{"id":97904,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97902,"name":"ANCHOR_STATE_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97746,"src":"6072:21:164","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97903,"name":"_anchorStateRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97837,"src":"6096:20:164","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"}},"src":"6072:44:164","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"}},"id":97905,"nodeType":"ExpressionStatement","src":"6072:44:164"},{"expression":{"id":97908,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97906,"name":"L2_CHAIN_ID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97749,"src":"6126:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":97907,"name":"_l2ChainId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97839,"src":"6140:10:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6126:24:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":97909,"nodeType":"ExpressionStatement","src":"6126:24:164"}]},"documentation":{"id":97812,"nodeType":"StructuredDocumentation","src":"4104:818:164","text":"@param _gameType The type ID of the game.\n @param _absolutePrestate The absolute prestate of the instruction trace.\n @param _maxGameDepth The maximum depth of bisection.\n @param _splitDepth The final depth of the output bisection portion of the game.\n @param _clockExtension The clock extension to perform when the remaining duration is less than the extension.\n @param _maxClockDuration The maximum amount of time that may accumulate on a team's chess clock.\n @param _vm An onchain VM that performs single instruction steps on an FPP trace.\n @param _weth WETH contract for holding ETH.\n @param _anchorStateRegistry The contract that stores the anchor state for each game type.\n @param _l2ChainId Chain ID of the L2 network this contract argues about."},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":97840,"nodeType":"ParameterList","parameters":[{"constant":false,"id":97815,"mutability":"mutable","name":"_gameType","nameLocation":"4957:9:164","nodeType":"VariableDeclaration","scope":97911,"src":"4948:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":97814,"nodeType":"UserDefinedTypeName","pathNode":{"id":97813,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"4948:8:164"},"referencedDeclaration":103271,"src":"4948:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},{"constant":false,"id":97818,"mutability":"mutable","name":"_absolutePrestate","nameLocation":"4982:17:164","nodeType":"VariableDeclaration","scope":97911,"src":"4976:23:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":97817,"nodeType":"UserDefinedTypeName","pathNode":{"id":97816,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"4976:5:164"},"referencedDeclaration":103255,"src":"4976:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":97820,"mutability":"mutable","name":"_maxGameDepth","nameLocation":"5017:13:164","nodeType":"VariableDeclaration","scope":97911,"src":"5009:21:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97819,"name":"uint256","nodeType":"ElementaryTypeName","src":"5009:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":97822,"mutability":"mutable","name":"_splitDepth","nameLocation":"5048:11:164","nodeType":"VariableDeclaration","scope":97911,"src":"5040:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97821,"name":"uint256","nodeType":"ElementaryTypeName","src":"5040:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":97825,"mutability":"mutable","name":"_clockExtension","nameLocation":"5078:15:164","nodeType":"VariableDeclaration","scope":97911,"src":"5069:24:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"},"typeName":{"id":97824,"nodeType":"UserDefinedTypeName","pathNode":{"id":97823,"name":"Duration","nodeType":"IdentifierPath","referencedDeclaration":103263,"src":"5069:8:164"},"referencedDeclaration":103263,"src":"5069:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"visibility":"internal"},{"constant":false,"id":97828,"mutability":"mutable","name":"_maxClockDuration","nameLocation":"5112:17:164","nodeType":"VariableDeclaration","scope":97911,"src":"5103:26:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"},"typeName":{"id":97827,"nodeType":"UserDefinedTypeName","pathNode":{"id":97826,"name":"Duration","nodeType":"IdentifierPath","referencedDeclaration":103263,"src":"5103:8:164"},"referencedDeclaration":103263,"src":"5103:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"visibility":"internal"},{"constant":false,"id":97831,"mutability":"mutable","name":"_vm","nameLocation":"5151:3:164","nodeType":"VariableDeclaration","scope":97911,"src":"5139:15:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"},"typeName":{"id":97830,"nodeType":"UserDefinedTypeName","pathNode":{"id":97829,"name":"IBigStepper","nodeType":"IdentifierPath","referencedDeclaration":100171,"src":"5139:11:164"},"referencedDeclaration":100171,"src":"5139:11:164","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"}},"visibility":"internal"},{"constant":false,"id":97834,"mutability":"mutable","name":"_weth","nameLocation":"5177:5:164","nodeType":"VariableDeclaration","scope":97911,"src":"5164:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"},"typeName":{"id":97833,"nodeType":"UserDefinedTypeName","pathNode":{"id":97832,"name":"IDelayedWETH","nodeType":"IdentifierPath","referencedDeclaration":100239,"src":"5164:12:164"},"referencedDeclaration":100239,"src":"5164:12:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"visibility":"internal"},{"constant":false,"id":97837,"mutability":"mutable","name":"_anchorStateRegistry","nameLocation":"5213:20:164","nodeType":"VariableDeclaration","scope":97911,"src":"5192:41:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"},"typeName":{"id":97836,"nodeType":"UserDefinedTypeName","pathNode":{"id":97835,"name":"IAnchorStateRegistry","nodeType":"IdentifierPath","referencedDeclaration":100146,"src":"5192:20:164"},"referencedDeclaration":100146,"src":"5192:20:164","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"}},"visibility":"internal"},{"constant":false,"id":97839,"mutability":"mutable","name":"_l2ChainId","nameLocation":"5251:10:164","nodeType":"VariableDeclaration","scope":97911,"src":"5243:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97838,"name":"uint256","nodeType":"ElementaryTypeName","src":"5243:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4938:329:164"},"returnParameters":{"id":97841,"nodeType":"ParameterList","parameters":[],"src":"5268:0:164"},"scope":99927,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":98025,"nodeType":"FunctionDefinition","src":"6198:2903:164","nodes":[],"body":{"id":98024,"nodeType":"Block","src":"6243:2858:164","nodes":[],"statements":[{"condition":{"id":97915,"name":"initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97780,"src":"6888:11:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97919,"nodeType":"IfStatement","src":"6884:44:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":97916,"name":"AlreadyInitialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103120,"src":"6908:18:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":97917,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6908:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97918,"nodeType":"RevertStatement","src":"6901:27:164"}},{"assignments":[97922,97924],"declarations":[{"constant":false,"id":97922,"mutability":"mutable","name":"root","nameLocation":"6985:4:164","nodeType":"VariableDeclaration","scope":98024,"src":"6980:9:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"},"typeName":{"id":97921,"nodeType":"UserDefinedTypeName","pathNode":{"id":97920,"name":"Hash","nodeType":"IdentifierPath","referencedDeclaration":103253,"src":"6980:4:164"},"referencedDeclaration":103253,"src":"6980:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"visibility":"internal"},{"constant":false,"id":97924,"mutability":"mutable","name":"rootBlockNumber","nameLocation":"6999:15:164","nodeType":"VariableDeclaration","scope":98024,"src":"6991:23:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":97923,"name":"uint256","nodeType":"ElementaryTypeName","src":"6991:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":97929,"initialValue":{"arguments":[{"id":97927,"name":"GAME_TYPE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97738,"src":"7048:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}],"expression":{"id":97925,"name":"ANCHOR_STATE_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97746,"src":"7018:21:164","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"}},"id":97926,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"anchors","nodeType":"MemberAccess","referencedDeclaration":100134,"src":"7018:29:164","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_userDefinedValueType$_GameType_$103271_$returns$_t_userDefinedValueType$_Hash_$103253_$_t_uint256_$","typeString":"function (GameType) view external returns (Hash,uint256)"}},"id":97928,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7018:40:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Hash_$103253_$_t_uint256_$","typeString":"tuple(Hash,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"6979:79:164"},{"condition":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":97937,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":97930,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97922,"src":"7159:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":97931,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101111,"src":"7159:8:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Hash_$103253_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (Hash) pure returns (bytes32)"}},"id":97932,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7159:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":97935,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7181:1:164","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":97934,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7173:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":97933,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7173:7:164","typeDescriptions":{}}},"id":97936,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7173:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"7159:24:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97941,"nodeType":"IfStatement","src":"7155:57:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":97938,"name":"AnchorRootNotFound","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103192,"src":"7192:18:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":97939,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7192:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97940,"nodeType":"RevertStatement","src":"7185:27:164"}},{"expression":{"id":97947,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":97942,"name":"startingOutputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97811,"src":"7264:18:164","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRoot_$103283_storage","typeString":"struct OutputRoot storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":97944,"name":"rootBlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97924,"src":"7313:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":97945,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97922,"src":"7336:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}],"id":97943,"name":"OutputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103283,"src":"7285:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_OutputRoot_$103283_storage_ptr_$","typeString":"type(struct OutputRoot storage pointer)"}},"id":97946,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":["l2BlockNumber","root"],"nodeType":"FunctionCall","src":"7285:58:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_OutputRoot_$103283_memory_ptr","typeString":"struct OutputRoot memory"}},"src":"7264:79:164","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRoot_$103283_storage","typeString":"struct OutputRoot storage ref"}},"id":97948,"nodeType":"ExpressionStatement","src":"7264:79:164"},{"AST":{"nodeType":"YulBlock","src":"7933:219:164","statements":[{"body":{"nodeType":"YulBlock","src":"7983:159:164","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8076:4:164","type":"","value":"0x00"},{"kind":"number","nodeType":"YulLiteral","src":"8082:10:164","type":"","value":"0x9824bdab"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"8069:6:164"},"nodeType":"YulFunctionCall","src":"8069:24:164"},"nodeType":"YulExpressionStatement","src":"8069:24:164"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"8117:4:164","type":"","value":"0x1C"},{"kind":"number","nodeType":"YulLiteral","src":"8123:4:164","type":"","value":"0x04"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"8110:6:164"},"nodeType":"YulFunctionCall","src":"8110:18:164"},"nodeType":"YulExpressionStatement","src":"8110:18:164"}]},"condition":{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nodeType":"YulIdentifier","src":"7960:12:164"},"nodeType":"YulFunctionCall","src":"7960:14:164"},{"kind":"number","nodeType":"YulLiteral","src":"7976:4:164","type":"","value":"0x7A"}],"functionName":{"name":"eq","nodeType":"YulIdentifier","src":"7957:2:164"},"nodeType":"YulFunctionCall","src":"7957:24:164"}],"functionName":{"name":"iszero","nodeType":"YulIdentifier","src":"7950:6:164"},"nodeType":"YulFunctionCall","src":"7950:32:164"},"nodeType":"YulIf","src":"7947:195:164"}]},"evmVersion":"london","externalReferences":[],"id":97949,"nodeType":"InlineAssembly","src":"7924:228:164"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":97953,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":97950,"name":"l2BlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98690,"src":"8320:13:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_uint256_$","typeString":"function () pure returns (uint256)"}},"id":97951,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8320:15:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":97952,"name":"rootBlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97924,"src":"8339:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8320:34:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":97959,"nodeType":"IfStatement","src":"8316:79:164","trueBody":{"errorCall":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":97955,"name":"rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99027,"src":"8383:9:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function () pure returns (Claim)"}},"id":97956,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8383:11:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}],"id":97954,"name":"UnexpectedRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103117,"src":"8363:19:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_userDefinedValueType$_Claim_$103255_$returns$__$","typeString":"function (Claim) pure"}},"id":97957,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8363:32:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":97958,"nodeType":"RevertStatement","src":"8356:39:164"}},{"expression":{"arguments":[{"arguments":[{"expression":{"arguments":[{"id":97966,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8510:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint32_$","typeString":"type(uint32)"},"typeName":{"id":97965,"name":"uint32","nodeType":"ElementaryTypeName","src":"8510:6:164","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint32_$","typeString":"type(uint32)"}],"id":97964,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"8505:4:164","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":97967,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8505:12:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint32","typeString":"type(uint32)"}},"id":97968,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"8505:16:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"arguments":[{"hexValue":"30","id":97971,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8560:1:164","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":97970,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8552:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":97969,"name":"address","nodeType":"ElementaryTypeName","src":"8552:7:164","typeDescriptions":{}}},"id":97972,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8552:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[],"expression":{"argumentTypes":[],"id":97973,"name":"gameCreator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99010,"src":"8590:11:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_address_$","typeString":"function () pure returns (address)"}},"id":97974,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8590:13:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"expression":{"id":97977,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"8635:3:164","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":97978,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"8635:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":97976,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8627:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint128_$","typeString":"type(uint128)"},"typeName":{"id":97975,"name":"uint128","nodeType":"ElementaryTypeName","src":"8627:7:164","typeDescriptions":{}}},"id":97979,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8627:18:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},{"arguments":[],"expression":{"argumentTypes":[],"id":97980,"name":"rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99027,"src":"8670:9:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function () pure returns (Claim)"}},"id":97981,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8670:11:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":97982,"name":"ROOT_POSITION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97761,"src":"8709:13:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"arguments":[{"arguments":[{"hexValue":"30","id":97987,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8775:1:164","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"}],"expression":{"id":97985,"name":"Duration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103263,"src":"8761:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Duration_$103263_$","typeString":"type(Duration)"}},"id":97986,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"8761:13:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint64_$returns$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (uint64) pure returns (Duration)"}},"id":97988,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8761:16:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},{"arguments":[{"arguments":[{"expression":{"id":97993,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"8801:5:164","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":97994,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"8801:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":97992,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8794:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":97991,"name":"uint64","nodeType":"ElementaryTypeName","src":"8794:6:164","typeDescriptions":{}}},"id":97995,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8794:23:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":97989,"name":"Timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103261,"src":"8779:9:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"type(Timestamp)"}},"id":97990,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"8779:14:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint64_$returns$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"function (uint64) pure returns (Timestamp)"}},"id":97996,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8779:39:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"},{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}],"expression":{"id":97983,"name":"LibClock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":101073,"src":"8747:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LibClock_$101073_$","typeString":"type(library LibClock)"}},"id":97984,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","referencedDeclaration":101037,"src":"8747:13:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$_t_userDefinedValueType$_Timestamp_$103261_$returns$_t_userDefinedValueType$_Clock_$103267_$","typeString":"function (Duration,Timestamp) pure returns (Clock)"}},"id":97997,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8747:72:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint128","typeString":"uint128"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}],"id":97963,"name":"ClaimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100523,"src":"8464:9:164","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ClaimData_$100523_storage_ptr_$","typeString":"type(struct IFaultDisputeGame.ClaimData storage pointer)"}},"id":97998,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":["parentIndex","counteredBy","claimant","bond","claim","position","clock"],"nodeType":"FunctionCall","src":"8464:370:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_memory_ptr","typeString":"struct IFaultDisputeGame.ClaimData memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_ClaimData_$100523_memory_ptr","typeString":"struct IFaultDisputeGame.ClaimData memory"}],"expression":{"id":97960,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"8436:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":97962,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"push","nodeType":"MemberAccess","src":"8436:14:164","typeDescriptions":{"typeIdentifier":"t_function_arraypush_nonpayable$_t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage_ptr_$_t_struct$_ClaimData_$100523_storage_$returns$__$bound_to$_t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage_ptr_$","typeString":"function (struct IFaultDisputeGame.ClaimData storage ref[] storage pointer,struct IFaultDisputeGame.ClaimData storage ref)"}},"id":97999,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8436:408:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98000,"nodeType":"ExpressionStatement","src":"8436:408:164"},{"expression":{"id":98003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98001,"name":"initialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97780,"src":"8895:11:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":98002,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"8909:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"8895:18:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98004,"nodeType":"ExpressionStatement","src":"8895:18:164"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"argumentTypes":[],"expression":{"id":98005,"name":"WETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97742,"src":"8953:4:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"id":98007,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":100691,"src":"8953:12:164","typeDescriptions":{"typeIdentifier":"t_function_external_payable$__$returns$__$","typeString":"function () payable external"}},"id":98010,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":98008,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"8974:3:164","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":98009,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"8974:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"8953:32:164","typeDescriptions":{"typeIdentifier":"t_function_external_payable$__$returns$__$value","typeString":"function () payable external"}},"id":98011,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8953:34:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98012,"nodeType":"ExpressionStatement","src":"8953:34:164"},{"expression":{"id":98022,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98013,"name":"createdAt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97769,"src":"9043:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"expression":{"id":98018,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"9077:5:164","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":98019,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"9077:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":98017,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9070:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":98016,"name":"uint64","nodeType":"ElementaryTypeName","src":"9070:6:164","typeDescriptions":{}}},"id":98020,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9070:23:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":98014,"name":"Timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103261,"src":"9055:9:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"type(Timestamp)"}},"id":98015,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"9055:14:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint64_$returns$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"function (uint64) pure returns (Timestamp)"}},"id":98021,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9055:39:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"src":"9043:51:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"id":98023,"nodeType":"ExpressionStatement","src":"9043:51:164"}]},"baseFunctions":[100615],"documentation":{"id":97912,"nodeType":"StructuredDocumentation","src":"6163:30:164","text":"@inheritdoc IInitializable"},"functionSelector":"8129fc1c","implemented":true,"kind":"function","modifiers":[],"name":"initialize","nameLocation":"6207:10:164","parameters":{"id":97913,"nodeType":"ParameterList","parameters":[],"src":"6217:2:164"},"returnParameters":{"id":97914,"nodeType":"ParameterList","parameters":[],"src":"6243:0:164"},"scope":99927,"stateMutability":"payable","virtual":true,"visibility":"public"},{"id":98227,"nodeType":"FunctionDefinition","src":"9353:4442:164","nodes":[],"body":{"id":98226,"nodeType":"Block","src":"9527:4268:164","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"},"id":98040,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98037,"name":"status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97777,"src":"9626:6:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":98038,"name":"GameStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103277,"src":"9636:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_GameStatus_$103277_$","typeString":"type(enum GameStatus)"}},"id":98039,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"IN_PROGRESS","nodeType":"MemberAccess","referencedDeclaration":103274,"src":"9636:22:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"src":"9626:32:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98044,"nodeType":"IfStatement","src":"9622:64:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98041,"name":"GameNotInProgress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103144,"src":"9667:17:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98042,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9667:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98043,"nodeType":"RevertStatement","src":"9660:26:164"}},{"assignments":[98047],"declarations":[{"constant":false,"id":98047,"mutability":"mutable","name":"parent","nameLocation":"9795:6:164","nodeType":"VariableDeclaration","scope":98226,"src":"9777:24:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":98046,"nodeType":"UserDefinedTypeName","pathNode":{"id":98045,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"9777:9:164"},"referencedDeclaration":100523,"src":"9777:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"id":98051,"initialValue":{"baseExpression":{"id":98048,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"9804:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":98050,"indexExpression":{"id":98049,"name":"_claimIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98028,"src":"9814:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9804:22:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref"}},"nodeType":"VariableDeclarationStatement","src":"9777:49:164"},{"assignments":[98054],"declarations":[{"constant":false,"id":98054,"mutability":"mutable","name":"parentPos","nameLocation":"9898:9:164","nodeType":"VariableDeclaration","scope":98226,"src":"9889:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":98053,"nodeType":"UserDefinedTypeName","pathNode":{"id":98052,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"9889:8:164"},"referencedDeclaration":103269,"src":"9889:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"id":98057,"initialValue":{"expression":{"id":98055,"name":"parent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98047,"src":"9910:6:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98056,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"9910:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"nodeType":"VariableDeclarationStatement","src":"9889:36:164"},{"assignments":[98060],"declarations":[{"constant":false,"id":98060,"mutability":"mutable","name":"stepPos","nameLocation":"9991:7:164","nodeType":"VariableDeclaration","scope":98226,"src":"9982:16:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":98059,"nodeType":"UserDefinedTypeName","pathNode":{"id":98058,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"9982:8:164"},"referencedDeclaration":103269,"src":"9982:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"id":98065,"initialValue":{"arguments":[{"id":98063,"name":"_isAttack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98030,"src":"10016:9:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":98061,"name":"parentPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98054,"src":"10001:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98062,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"move","nodeType":"MemberAccess","referencedDeclaration":101006,"src":"10001:14:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$_t_bool_$returns$_t_userDefinedValueType$_Position_$103269_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position,bool) pure returns (Position)"}},"id":98064,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10001:25:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"nodeType":"VariableDeclarationStatement","src":"9982:44:164"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98072,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98066,"name":"stepPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98060,"src":"10142:7:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98067,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depth","nodeType":"MemberAccess","referencedDeclaration":100833,"src":"10142:13:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint8_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint8)"}},"id":98068,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10142:15:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98071,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98069,"name":"MAX_GAME_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97723,"src":"10161:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":98070,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10178:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"10161:18:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10142:37:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98076,"nodeType":"IfStatement","src":"10138:65:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98073,"name":"InvalidParent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103156,"src":"10188:13:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98074,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10188:15:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98075,"nodeType":"RevertStatement","src":"10181:22:164"}},{"assignments":[98079],"declarations":[{"constant":false,"id":98079,"mutability":"mutable","name":"preStateClaim","nameLocation":"10285:13:164","nodeType":"VariableDeclaration","scope":98226,"src":"10279:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":98078,"nodeType":"UserDefinedTypeName","pathNode":{"id":98077,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"10279:5:164"},"referencedDeclaration":103255,"src":"10279:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"}],"id":98080,"nodeType":"VariableDeclarationStatement","src":"10279:19:164"},{"assignments":[98083],"declarations":[{"constant":false,"id":98083,"mutability":"mutable","name":"postState","nameLocation":"10326:9:164","nodeType":"VariableDeclaration","scope":98226,"src":"10308:27:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":98082,"nodeType":"UserDefinedTypeName","pathNode":{"id":98081,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"10308:9:164"},"referencedDeclaration":100523,"src":"10308:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"id":98084,"nodeType":"VariableDeclarationStatement","src":"10308:27:164"},{"condition":{"id":98085,"name":"_isAttack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98030,"src":"10349:9:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":98145,"nodeType":"Block","src":"11374:314:164","statements":[{"expression":{"id":98127,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98124,"name":"preStateClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98079,"src":"11542:13:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":98125,"name":"parent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98047,"src":"11558:6:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98126,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"claim","nodeType":"MemberAccess","referencedDeclaration":100516,"src":"11558:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"src":"11542:28:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":98128,"nodeType":"ExpressionStatement","src":"11542:28:164"},{"expression":{"id":98143,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98129,"name":"postState","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98083,"src":"11584:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":98137,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98133,"name":"parentPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98054,"src":"11629:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98134,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"11629:13:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":98135,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11629:15:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":98136,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11647:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"11629:19:164","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint128","typeString":"uint128"}],"expression":{"id":98131,"name":"Position","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103269,"src":"11615:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Position_$103269_$","typeString":"type(Position)"}},"id":98132,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"11615:13:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint128_$returns$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (uint128) pure returns (Position)"}},"id":98138,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11615:34:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"expression":{"id":98139,"name":"parent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98047,"src":"11651:6:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98140,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"parentIndex","nodeType":"MemberAccess","referencedDeclaration":100507,"src":"11651:18:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"hexValue":"66616c7365","id":98141,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"11671:5:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":98130,"name":"_findTraceAncestor","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99638,"src":"11596:18:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_userDefinedValueType$_Position_$103269_$_t_uint256_$_t_bool_$returns$_t_struct$_ClaimData_$100523_storage_ptr_$","typeString":"function (Position,uint256,bool) view returns (struct IFaultDisputeGame.ClaimData storage pointer)"}},"id":98142,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11596:81:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"src":"11584:93:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98144,"nodeType":"ExpressionStatement","src":"11584:93:164"}]},"id":98146,"nodeType":"IfStatement","src":"10345:1343:164","trueBody":{"id":98123,"nodeType":"Block","src":"10360:1008:164","statements":[{"expression":{"id":98117,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98086,"name":"preStateClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98079,"src":"11031:13:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98100,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98097,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98087,"name":"stepPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98060,"src":"11048:7:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98088,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"indexAtDepth","nodeType":"MemberAccess","referencedDeclaration":100850,"src":"11048:20:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":98089,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11048:22:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98095,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":98090,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11074:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98093,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98091,"name":"MAX_GAME_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97723,"src":"11080:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":98092,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"11097:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11080:28:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":98094,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"11079:30:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11074:35:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":98096,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"11073:37:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11048:62:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":98098,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"11047:64:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":98099,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11115:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11047:69:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"expression":{"arguments":[{"arguments":[{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":98109,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98105,"name":"parentPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98054,"src":"11204:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98106,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"11204:13:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":98107,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11204:15:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":98108,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11222:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"11204:19:164","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint128","typeString":"uint128"}],"expression":{"id":98103,"name":"Position","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103269,"src":"11190:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Position_$103269_$","typeString":"type(Position)"}},"id":98104,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"11190:13:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint128_$returns$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (uint128) pure returns (Position)"}},"id":98110,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11190:34:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"expression":{"id":98111,"name":"parent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98047,"src":"11226:6:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98112,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"parentIndex","nodeType":"MemberAccess","referencedDeclaration":100507,"src":"11226:18:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"hexValue":"66616c7365","id":98113,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"11246:5:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":98102,"name":"_findTraceAncestor","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99638,"src":"11171:18:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_userDefinedValueType$_Position_$103269_$_t_uint256_$_t_bool_$returns$_t_struct$_ClaimData_$100523_storage_ptr_$","typeString":"function (Position,uint256,bool) view returns (struct IFaultDisputeGame.ClaimData storage pointer)"}},"id":98114,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11171:81:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98115,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"claim","nodeType":"MemberAccess","referencedDeclaration":100516,"src":"11171:87:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":98116,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"11047:211:164","trueExpression":{"id":98101,"name":"ABSOLUTE_PRESTATE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97720,"src":"11135:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"src":"11031:227:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":98118,"nodeType":"ExpressionStatement","src":"11031:227:164"},{"expression":{"id":98121,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98119,"name":"postState","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98083,"src":"11339:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":98120,"name":"parent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98047,"src":"11351:6:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"src":"11339:18:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98122,"nodeType":"ExpressionStatement","src":"11339:18:164"}]}},{"condition":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":98157,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":98151,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":98148,"name":"_stateData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98032,"src":"12041:10:164","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":98147,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"12031:9:164","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":98149,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12031:21:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"38","id":98150,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12056:1:164","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"12031:26:164","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":98156,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98152,"name":"preStateClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98079,"src":"12061:13:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":98153,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101085,"src":"12061:17:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Claim_$103255_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function (Claim) pure returns (bytes32)"}},"id":98154,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12061:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"38","id":98155,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12084:1:164","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"12061:24:164","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"12031:54:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98161,"nodeType":"IfStatement","src":"12027:84:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98158,"name":"InvalidPrestate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103159,"src":"12094:15:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98159,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12094:17:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98160,"nodeType":"RevertStatement","src":"12087:24:164"}},{"assignments":[98164],"declarations":[{"constant":false,"id":98164,"mutability":"mutable","name":"uuid","nameLocation":"12187:4:164","nodeType":"VariableDeclaration","scope":98226,"src":"12182:9:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"},"typeName":{"id":98163,"nodeType":"UserDefinedTypeName","pathNode":{"id":98162,"name":"Hash","nodeType":"IdentifierPath","referencedDeclaration":103253,"src":"12182:4:164"},"referencedDeclaration":103253,"src":"12182:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"visibility":"internal"}],"id":98168,"initialValue":{"arguments":[{"id":98166,"name":"_claimIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98028,"src":"12212:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":98165,"name":"_findLocalContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99875,"src":"12194:17:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (uint256) view returns (Hash)"}},"id":98167,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12194:30:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"nodeType":"VariableDeclarationStatement","src":"12182:42:164"},{"assignments":[98170],"declarations":[{"constant":false,"id":98170,"mutability":"mutable","name":"validStep","nameLocation":"13202:9:164","nodeType":"VariableDeclaration","scope":98226,"src":"13197:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":98169,"name":"bool","nodeType":"ElementaryTypeName","src":"13197:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":98184,"initialValue":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":98183,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":98173,"name":"_stateData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98032,"src":"13222:10:164","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":98174,"name":"_proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98034,"src":"13234:6:164","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98175,"name":"uuid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98164,"src":"13242:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":98176,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101111,"src":"13242:8:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Hash_$103253_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (Hash) pure returns (bytes32)"}},"id":98177,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13242:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":98171,"name":"VM","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97734,"src":"13214:2:164","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"}},"id":98172,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"step","nodeType":"MemberAccess","referencedDeclaration":100163,"src":"13214:7:164","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes memory,bytes memory,bytes32) external returns (bytes32)"}},"id":98178,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13214:39:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":98179,"name":"postState","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98083,"src":"13257:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98180,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"claim","nodeType":"MemberAccess","referencedDeclaration":100516,"src":"13257:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":98181,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101085,"src":"13257:19:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Claim_$103255_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function (Claim) pure returns (bytes32)"}},"id":98182,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13257:21:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"13214:64:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"13197:81:164"},{"assignments":[98186],"declarations":[{"constant":false,"id":98186,"mutability":"mutable","name":"parentPostAgree","nameLocation":"13293:15:164","nodeType":"VariableDeclaration","scope":98226,"src":"13288:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":98185,"name":"bool","nodeType":"ElementaryTypeName","src":"13288:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":98200,"initialValue":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":98199,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":98197,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":98194,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98187,"name":"parentPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98054,"src":"13312:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98188,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depth","nodeType":"MemberAccess","referencedDeclaration":100833,"src":"13312:15:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint8_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint8)"}},"id":98189,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13312:17:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":98190,"name":"postState","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98083,"src":"13332:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98191,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"13332:18:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98192,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depth","nodeType":"MemberAccess","referencedDeclaration":100833,"src":"13332:24:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint8_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint8)"}},"id":98193,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13332:26:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"13312:46:164","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":98195,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"13311:48:164","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"hexValue":"32","id":98196,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13362:1:164","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"13311:52:164","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":98198,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13367:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"13311:57:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"13288:80:164"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":98203,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98201,"name":"parentPostAgree","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98186,"src":"13382:15:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":98202,"name":"validStep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98170,"src":"13401:9:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"13382:28:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98207,"nodeType":"IfStatement","src":"13378:52:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98204,"name":"ValidStep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103162,"src":"13419:9:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98205,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13419:11:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98206,"nodeType":"RevertStatement","src":"13412:18:164"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":98214,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":98208,"name":"parent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98047,"src":"13524:6:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98209,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"counteredBy","nodeType":"MemberAccess","referencedDeclaration":100509,"src":"13524:18:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":98212,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13554:1:164","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":98211,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13546:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":98210,"name":"address","nodeType":"ElementaryTypeName","src":"13546:7:164","typeDescriptions":{}}},"id":98213,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13546:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"13524:32:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98218,"nodeType":"IfStatement","src":"13520:60:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98215,"name":"DuplicateStep","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103189,"src":"13565:13:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98216,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13565:15:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98217,"nodeType":"RevertStatement","src":"13558:22:164"}},{"expression":{"id":98224,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":98219,"name":"parent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98047,"src":"13757:6:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98221,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"counteredBy","nodeType":"MemberAccess","referencedDeclaration":100509,"src":"13757:18:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":98222,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"13778:3:164","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":98223,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"13778:10:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"13757:31:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":98225,"nodeType":"ExpressionStatement","src":"13757:31:164"}]},"baseFunctions":[100563],"documentation":{"id":98026,"nodeType":"StructuredDocumentation","src":"9315:33:164","text":"@inheritdoc IFaultDisputeGame"},"functionSelector":"d8cc1a3c","implemented":true,"kind":"function","modifiers":[],"name":"step","nameLocation":"9362:4:164","parameters":{"id":98035,"nodeType":"ParameterList","parameters":[{"constant":false,"id":98028,"mutability":"mutable","name":"_claimIndex","nameLocation":"9384:11:164","nodeType":"VariableDeclaration","scope":98227,"src":"9376:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98027,"name":"uint256","nodeType":"ElementaryTypeName","src":"9376:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":98030,"mutability":"mutable","name":"_isAttack","nameLocation":"9410:9:164","nodeType":"VariableDeclaration","scope":98227,"src":"9405:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":98029,"name":"bool","nodeType":"ElementaryTypeName","src":"9405:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":98032,"mutability":"mutable","name":"_stateData","nameLocation":"9444:10:164","nodeType":"VariableDeclaration","scope":98227,"src":"9429:25:164","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":98031,"name":"bytes","nodeType":"ElementaryTypeName","src":"9429:5:164","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":98034,"mutability":"mutable","name":"_proof","nameLocation":"9479:6:164","nodeType":"VariableDeclaration","scope":98227,"src":"9464:21:164","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":98033,"name":"bytes","nodeType":"ElementaryTypeName","src":"9464:5:164","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9366:125:164"},"returnParameters":{"id":98036,"nodeType":"ParameterList","parameters":[],"src":"9527:0:164"},"scope":99927,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":98470,"nodeType":"FunctionDefinition","src":"14106:5200:164","nodes":[],"body":{"id":98469,"nodeType":"Block","src":"14198:5108:164","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"},"id":98241,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98238,"name":"status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97777,"src":"14297:6:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":98239,"name":"GameStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103277,"src":"14307:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_GameStatus_$103277_$","typeString":"type(enum GameStatus)"}},"id":98240,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"IN_PROGRESS","nodeType":"MemberAccess","referencedDeclaration":103274,"src":"14307:22:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"src":"14297:32:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98245,"nodeType":"IfStatement","src":"14293:64:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98242,"name":"GameNotInProgress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103144,"src":"14338:17:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98243,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14338:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98244,"nodeType":"RevertStatement","src":"14331:26:164"}},{"assignments":[98248],"declarations":[{"constant":false,"id":98248,"mutability":"mutable","name":"parent","nameLocation":"14465:6:164","nodeType":"VariableDeclaration","scope":98469,"src":"14448:23:164","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_memory_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":98247,"nodeType":"UserDefinedTypeName","pathNode":{"id":98246,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"14448:9:164"},"referencedDeclaration":100523,"src":"14448:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"id":98252,"initialValue":{"baseExpression":{"id":98249,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"14474:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":98251,"indexExpression":{"id":98250,"name":"_challengeIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98230,"src":"14484:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14474:26:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref"}},"nodeType":"VariableDeclarationStatement","src":"14448:52:164"},{"assignments":[98255],"declarations":[{"constant":false,"id":98255,"mutability":"mutable","name":"parentPos","nameLocation":"14768:9:164","nodeType":"VariableDeclaration","scope":98469,"src":"14759:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":98254,"nodeType":"UserDefinedTypeName","pathNode":{"id":98253,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"14759:8:164"},"referencedDeclaration":103269,"src":"14759:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"id":98258,"initialValue":{"expression":{"id":98256,"name":"parent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98248,"src":"14780:6:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_memory_ptr","typeString":"struct IFaultDisputeGame.ClaimData memory"}},"id":98257,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"14780:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"nodeType":"VariableDeclarationStatement","src":"14759:36:164"},{"assignments":[98261],"declarations":[{"constant":false,"id":98261,"mutability":"mutable","name":"nextPosition","nameLocation":"14814:12:164","nodeType":"VariableDeclaration","scope":98469,"src":"14805:21:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":98260,"nodeType":"UserDefinedTypeName","pathNode":{"id":98259,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"14805:8:164"},"referencedDeclaration":103269,"src":"14805:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"id":98266,"initialValue":{"arguments":[{"id":98264,"name":"_isAttack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98235,"src":"14844:9:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":98262,"name":"parentPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98255,"src":"14829:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98263,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"move","nodeType":"MemberAccess","referencedDeclaration":101006,"src":"14829:14:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$_t_bool_$returns$_t_userDefinedValueType$_Position_$103269_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position,bool) pure returns (Position)"}},"id":98265,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14829:25:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"nodeType":"VariableDeclarationStatement","src":"14805:49:164"},{"assignments":[98268],"declarations":[{"constant":false,"id":98268,"mutability":"mutable","name":"nextPositionDepth","nameLocation":"14872:17:164","nodeType":"VariableDeclaration","scope":98469,"src":"14864:25:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98267,"name":"uint256","nodeType":"ElementaryTypeName","src":"14864:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":98272,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98269,"name":"nextPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98261,"src":"14892:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98270,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depth","nodeType":"MemberAccess","referencedDeclaration":100833,"src":"14892:18:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint8_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint8)"}},"id":98271,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14892:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"VariableDeclarationStatement","src":"14864:48:164"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":98285,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":98281,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98275,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98273,"name":"_challengeIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98230,"src":"15259:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":98274,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15278:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"15259:20:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98280,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98276,"name":"nextPositionDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98268,"src":"15283:17:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98279,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98277,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"15304:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"32","id":98278,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15318:1:164","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"15304:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15283:36:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"15259:60:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":98282,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"15258:62:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"id":98284,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"15324:10:164","subExpression":{"id":98283,"name":"_isAttack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98235,"src":"15325:9:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"15258:76:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98290,"nodeType":"IfStatement","src":"15254:137:164","trueBody":{"id":98289,"nodeType":"Block","src":"15336:55:164","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98286,"name":"CannotDefendRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103135,"src":"15357:21:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98287,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15357:23:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98288,"nodeType":"RevertStatement","src":"15350:30:164"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98293,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98291,"name":"nextPositionDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98268,"src":"15732:17:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":98292,"name":"MAX_GAME_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97723,"src":"15752:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15732:34:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98297,"nodeType":"IfStatement","src":"15728:66:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98294,"name":"GameDepthExceeded","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103153,"src":"15775:17:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98295,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15775:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98296,"nodeType":"RevertStatement","src":"15768:26:164"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98302,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98298,"name":"nextPositionDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98268,"src":"16001:17:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98301,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98299,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"16022:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":98300,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16036:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"16022:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"16001:36:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98311,"nodeType":"IfStatement","src":"15997:138:164","trueBody":{"id":98310,"nodeType":"Block","src":"16039:96:164","statements":[{"expression":{"arguments":[{"id":98304,"name":"_claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98233,"src":"16078:6:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":98305,"name":"_challengeIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98230,"src":"16086:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":98306,"name":"parentPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98255,"src":"16103:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"id":98307,"name":"_isAttack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98235,"src":"16114:9:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":98303,"name":"_verifyExecBisectionRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99587,"src":"16053:24:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_userDefinedValueType$_Claim_$103255_$_t_uint256_$_t_userDefinedValueType$_Position_$103269_$_t_bool_$returns$__$","typeString":"function (Claim,uint256,Position,bool) view"}},"id":98308,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16053:71:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98309,"nodeType":"ExpressionStatement","src":"16053:71:164"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98317,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":98313,"name":"nextPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98261,"src":"16241:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}],"id":98312,"name":"getRequiredBond","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99215,"src":"16225:15:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint256_$","typeString":"function (Position) view returns (uint256)"}},"id":98314,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16225:29:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":98315,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"16258:3:164","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":98316,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"16258:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"16225:42:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98321,"nodeType":"IfStatement","src":"16221:76:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98318,"name":"IncorrectBondAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103123,"src":"16276:19:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98319,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16276:21:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98320,"nodeType":"RevertStatement","src":"16269:28:164"}},{"assignments":[98324],"declarations":[{"constant":false,"id":98324,"mutability":"mutable","name":"nextDuration","nameLocation":"16539:12:164","nodeType":"VariableDeclaration","scope":98469,"src":"16530:21:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"},"typeName":{"id":98323,"nodeType":"UserDefinedTypeName","pathNode":{"id":98322,"name":"Duration","nodeType":"IdentifierPath","referencedDeclaration":103263,"src":"16530:8:164"},"referencedDeclaration":103263,"src":"16530:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"visibility":"internal"}],"id":98328,"initialValue":{"arguments":[{"id":98326,"name":"_challengeIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98230,"src":"16576:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":98325,"name":"getChallengerDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99348,"src":"16554:21:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (uint256) view returns (Duration)"}},"id":98327,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16554:38:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"nodeType":"VariableDeclarationStatement","src":"16530:62:164"},{"condition":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":98335,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98329,"name":"nextDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98324,"src":"16742:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":98330,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"16742:16:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":98331,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16742:18:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98332,"name":"MAX_CLOCK_DURATION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97730,"src":"16764:18:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":98333,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"16764:22:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":98334,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16764:24:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"16742:46:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98339,"nodeType":"IfStatement","src":"16738:78:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98336,"name":"ClockTimeExceeded","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103147,"src":"16797:17:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98337,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16797:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98338,"nodeType":"RevertStatement","src":"16790:26:164"}},{"condition":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":98350,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98340,"name":"nextDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98324,"src":"17477:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":98341,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"17477:16:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":98342,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17477:18:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":98349,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98343,"name":"MAX_CLOCK_DURATION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97730,"src":"17498:18:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":98344,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"17498:22:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":98345,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17498:24:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98346,"name":"CLOCK_EXTENSION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97753,"src":"17525:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":98347,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"17525:19:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":98348,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17525:21:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"17498:48:164","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"17477:69:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98380,"nodeType":"IfStatement","src":"17473:424:164","trueBody":{"id":98379,"nodeType":"Block","src":"17548:349:164","statements":[{"assignments":[98352],"declarations":[{"constant":false,"id":98352,"mutability":"mutable","name":"extensionPeriod","nameLocation":"17678:15:164","nodeType":"VariableDeclaration","scope":98379,"src":"17671:22:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":98351,"name":"uint64","nodeType":"ElementaryTypeName","src":"17671:6:164","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"id":98367,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98357,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98353,"name":"nextPositionDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98268,"src":"17712:17:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98356,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98354,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"17733:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":98355,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17747:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"17733:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17712:36:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98363,"name":"CLOCK_EXTENSION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97753,"src":"17779:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":98364,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"17779:19:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":98365,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17779:21:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"id":98366,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"17712:88:164","trueExpression":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":98362,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98358,"name":"CLOCK_EXTENSION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97753,"src":"17751:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":98359,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"17751:19:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":98360,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17751:21:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"32","id":98361,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17775:1:164","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"17751:25:164","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"VariableDeclarationStatement","src":"17671:129:164"},{"expression":{"id":98377,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98368,"name":"nextDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98324,"src":"17814:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":98375,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98371,"name":"MAX_CLOCK_DURATION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97730,"src":"17843:18:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":98372,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"17843:22:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":98373,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17843:24:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":98374,"name":"extensionPeriod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98352,"src":"17870:15:164","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"17843:42:164","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":98369,"name":"Duration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103263,"src":"17829:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Duration_$103263_$","typeString":"type(Duration)"}},"id":98370,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"17829:13:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint64_$returns$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (uint64) pure returns (Duration)"}},"id":98376,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17829:57:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"src":"17814:72:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":98378,"nodeType":"ExpressionStatement","src":"17814:72:164"}]}},{"assignments":[98383],"declarations":[{"constant":false,"id":98383,"mutability":"mutable","name":"nextClock","nameLocation":"18004:9:164","nodeType":"VariableDeclaration","scope":98469,"src":"17998:15:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"},"typeName":{"id":98382,"nodeType":"UserDefinedTypeName","pathNode":{"id":98381,"name":"Clock","nodeType":"IdentifierPath","referencedDeclaration":103267,"src":"17998:5:164"},"referencedDeclaration":103267,"src":"17998:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}},"visibility":"internal"}],"id":98396,"initialValue":{"arguments":[{"id":98386,"name":"nextDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98324,"src":"18030:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},{"arguments":[{"arguments":[{"expression":{"id":98391,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"18066:5:164","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":98392,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"18066:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":98390,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18059:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":98389,"name":"uint64","nodeType":"ElementaryTypeName","src":"18059:6:164","typeDescriptions":{}}},"id":98393,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18059:23:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":98387,"name":"Timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103261,"src":"18044:9:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"type(Timestamp)"}},"id":98388,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"18044:14:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint64_$returns$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"function (uint64) pure returns (Timestamp)"}},"id":98394,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18044:39:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"},{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}],"expression":{"id":98384,"name":"LibClock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":101073,"src":"18016:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LibClock_$101073_$","typeString":"type(library LibClock)"}},"id":98385,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","referencedDeclaration":101037,"src":"18016:13:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$_t_userDefinedValueType$_Timestamp_$103261_$returns$_t_userDefinedValueType$_Clock_$103267_$","typeString":"function (Duration,Timestamp) pure returns (Clock)"}},"id":98395,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18016:68:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}},"nodeType":"VariableDeclarationStatement","src":"17998:86:164"},{"assignments":[98399],"declarations":[{"constant":false,"id":98399,"mutability":"mutable","name":"claimHash","nameLocation":"18378:9:164","nodeType":"VariableDeclaration","scope":98469,"src":"18368:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_ClaimHash_$103257","typeString":"ClaimHash"},"typeName":{"id":98398,"nodeType":"UserDefinedTypeName","pathNode":{"id":98397,"name":"ClaimHash","nodeType":"IdentifierPath","referencedDeclaration":103257,"src":"18368:9:164"},"referencedDeclaration":103257,"src":"18368:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_ClaimHash_$103257","typeString":"ClaimHash"}},"visibility":"internal"}],"id":98405,"initialValue":{"arguments":[{"id":98402,"name":"nextPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98261,"src":"18410:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"id":98403,"name":"_challengeIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98230,"src":"18424:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":98400,"name":"_claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98233,"src":"18390:6:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":98401,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hashClaimPos","nodeType":"MemberAccess","referencedDeclaration":100799,"src":"18390:19:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$_t_uint256_$returns$_t_userDefinedValueType$_ClaimHash_$103257_$bound_to$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function (Claim,Position,uint256) pure returns (ClaimHash)"}},"id":98404,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18390:50:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_ClaimHash_$103257","typeString":"ClaimHash"}},"nodeType":"VariableDeclarationStatement","src":"18368:72:164"},{"condition":{"baseExpression":{"id":98406,"name":"claims","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97796,"src":"18454:6:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_ClaimHash_$103257_$_t_bool_$","typeString":"mapping(ClaimHash => bool)"}},"id":98408,"indexExpression":{"id":98407,"name":"claimHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98399,"src":"18461:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_ClaimHash_$103257","typeString":"ClaimHash"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"18454:17:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98412,"nodeType":"IfStatement","src":"18450:50:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98409,"name":"ClaimAlreadyExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103138,"src":"18480:18:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98410,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18480:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98411,"nodeType":"RevertStatement","src":"18473:27:164"}},{"expression":{"id":98417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":98413,"name":"claims","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97796,"src":"18510:6:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_userDefinedValueType$_ClaimHash_$103257_$_t_bool_$","typeString":"mapping(ClaimHash => bool)"}},"id":98415,"indexExpression":{"id":98414,"name":"claimHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98399,"src":"18517:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_ClaimHash_$103257","typeString":"ClaimHash"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"18510:17:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":98416,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"18530:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"18510:24:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98418,"nodeType":"ExpressionStatement","src":"18510:24:164"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"id":98425,"name":"_challengeIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98230,"src":"18654:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":98424,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18647:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint32_$","typeString":"type(uint32)"},"typeName":{"id":98423,"name":"uint32","nodeType":"ElementaryTypeName","src":"18647:6:164","typeDescriptions":{}}},"id":98426,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18647:23:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"arguments":[{"hexValue":"30","id":98429,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18770:1:164","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":98428,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18762:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":98427,"name":"address","nodeType":"ElementaryTypeName","src":"18762:7:164","typeDescriptions":{}}},"id":98430,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18762:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":98431,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"18800:3:164","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":98432,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"18800:10:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"expression":{"id":98435,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"18842:3:164","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":98436,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"18842:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":98434,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18834:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint128_$","typeString":"type(uint128)"},"typeName":{"id":98433,"name":"uint128","nodeType":"ElementaryTypeName","src":"18834:7:164","typeDescriptions":{}}},"id":98437,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18834:18:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},{"id":98438,"name":"_claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98233,"src":"18877:6:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":98439,"name":"nextPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98261,"src":"18911:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"id":98440,"name":"nextClock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98383,"src":"18948:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint128","typeString":"uint128"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}],"id":98422,"name":"ClaimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100523,"src":"18606:9:164","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ClaimData_$100523_storage_ptr_$","typeString":"type(struct IFaultDisputeGame.ClaimData storage pointer)"}},"id":98441,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":["parentIndex","counteredBy","claimant","bond","claim","position","clock"],"nodeType":"FunctionCall","src":"18606:366:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_memory_ptr","typeString":"struct IFaultDisputeGame.ClaimData memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_ClaimData_$100523_memory_ptr","typeString":"struct IFaultDisputeGame.ClaimData memory"}],"expression":{"id":98419,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"18578:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":98421,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"push","nodeType":"MemberAccess","src":"18578:14:164","typeDescriptions":{"typeIdentifier":"t_function_arraypush_nonpayable$_t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage_ptr_$_t_struct$_ClaimData_$100523_storage_$returns$__$bound_to$_t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage_ptr_$","typeString":"function (struct IFaultDisputeGame.ClaimData storage ref[] storage pointer,struct IFaultDisputeGame.ClaimData storage ref)"}},"id":98442,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18578:404:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98443,"nodeType":"ExpressionStatement","src":"18578:404:164"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":98448,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"19082:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":98449,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"19082:16:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":98450,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19101:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"19082:20:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"baseExpression":{"id":98444,"name":"subgames","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97802,"src":"19051:8:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_uint256_$dyn_storage_$","typeString":"mapping(uint256 => uint256[] storage ref)"}},"id":98446,"indexExpression":{"id":98445,"name":"_challengeIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98230,"src":"19060:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19051:25:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage","typeString":"uint256[] storage ref"}},"id":98447,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"push","nodeType":"MemberAccess","src":"19051:30:164","typeDescriptions":{"typeIdentifier":"t_function_arraypush_nonpayable$_t_array$_t_uint256_$dyn_storage_ptr_$_t_uint256_$returns$__$bound_to$_t_array$_t_uint256_$dyn_storage_ptr_$","typeString":"function (uint256[] storage pointer,uint256)"}},"id":98452,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19051:52:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98453,"nodeType":"ExpressionStatement","src":"19051:52:164"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"argumentTypes":[],"expression":{"id":98454,"name":"WETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97742,"src":"19143:4:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"id":98456,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"deposit","nodeType":"MemberAccess","referencedDeclaration":100691,"src":"19143:12:164","typeDescriptions":{"typeIdentifier":"t_function_external_payable$__$returns$__$","typeString":"function () payable external"}},"id":98459,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":98457,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"19164:3:164","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":98458,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"19164:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"19143:32:164","typeDescriptions":{"typeIdentifier":"t_function_external_payable$__$returns$__$value","typeString":"function () payable external"}},"id":98460,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19143:34:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98461,"nodeType":"ExpressionStatement","src":"19143:34:164"},{"eventCall":{"arguments":[{"id":98463,"name":"_challengeIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98230,"src":"19263:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":98464,"name":"_claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98233,"src":"19280:6:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"expression":{"id":98465,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"19288:3:164","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":98466,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"19288:10:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_address","typeString":"address"}],"id":98462,"name":"Move","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100533,"src":"19258:4:164","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint256_$_t_userDefinedValueType$_Claim_$103255_$_t_address_$returns$__$","typeString":"function (uint256,Claim,address)"}},"id":98467,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19258:41:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98468,"nodeType":"EmitStatement","src":"19253:46:164"}]},"documentation":{"id":98228,"nodeType":"StructuredDocumentation","src":"13801:300:164","text":"@notice Generic move function, used for both `attack` and `defend` moves.\n @param _challengeIndex The index of the claim being moved against.\n @param _claim The claim at the next logical position in the game.\n @param _isAttack Whether or not the move is an attack or defense."},"functionSelector":"632247ea","implemented":true,"kind":"function","modifiers":[],"name":"move","nameLocation":"14115:4:164","parameters":{"id":98236,"nodeType":"ParameterList","parameters":[{"constant":false,"id":98230,"mutability":"mutable","name":"_challengeIndex","nameLocation":"14128:15:164","nodeType":"VariableDeclaration","scope":98470,"src":"14120:23:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98229,"name":"uint256","nodeType":"ElementaryTypeName","src":"14120:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":98233,"mutability":"mutable","name":"_claim","nameLocation":"14151:6:164","nodeType":"VariableDeclaration","scope":98470,"src":"14145:12:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":98232,"nodeType":"UserDefinedTypeName","pathNode":{"id":98231,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"14145:5:164"},"referencedDeclaration":103255,"src":"14145:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":98235,"mutability":"mutable","name":"_isAttack","nameLocation":"14164:9:164","nodeType":"VariableDeclaration","scope":98470,"src":"14159:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":98234,"name":"bool","nodeType":"ElementaryTypeName","src":"14159:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"14119:55:164"},"returnParameters":{"id":98237,"nodeType":"ParameterList","parameters":[],"src":"14198:0:164"},"scope":99927,"stateMutability":"payable","virtual":true,"visibility":"public"},{"id":98486,"nodeType":"FunctionDefinition","src":"19350:118:164","nodes":[],"body":{"id":98485,"nodeType":"Block","src":"19419:49:164","nodes":[],"statements":[{"expression":{"arguments":[{"id":98480,"name":"_parentIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98473,"src":"19434:12:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":98481,"name":"_claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98476,"src":"19448:6:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"hexValue":"74727565","id":98482,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"19456:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":98479,"name":"move","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98470,"src":"19429:4:164","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_userDefinedValueType$_Claim_$103255_$_t_bool_$returns$__$","typeString":"function (uint256,Claim,bool)"}},"id":98483,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19429:32:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98484,"nodeType":"ExpressionStatement","src":"19429:32:164"}]},"baseFunctions":[100542],"documentation":{"id":98471,"nodeType":"StructuredDocumentation","src":"19312:33:164","text":"@inheritdoc IFaultDisputeGame"},"functionSelector":"c55cd0c7","implemented":true,"kind":"function","modifiers":[],"name":"attack","nameLocation":"19359:6:164","parameters":{"id":98477,"nodeType":"ParameterList","parameters":[{"constant":false,"id":98473,"mutability":"mutable","name":"_parentIndex","nameLocation":"19374:12:164","nodeType":"VariableDeclaration","scope":98486,"src":"19366:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98472,"name":"uint256","nodeType":"ElementaryTypeName","src":"19366:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":98476,"mutability":"mutable","name":"_claim","nameLocation":"19394:6:164","nodeType":"VariableDeclaration","scope":98486,"src":"19388:12:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":98475,"nodeType":"UserDefinedTypeName","pathNode":{"id":98474,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"19388:5:164"},"referencedDeclaration":103255,"src":"19388:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"}],"src":"19365:36:164"},"returnParameters":{"id":98478,"nodeType":"ParameterList","parameters":[],"src":"19419:0:164"},"scope":99927,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":98502,"nodeType":"FunctionDefinition","src":"19512:119:164","nodes":[],"body":{"id":98501,"nodeType":"Block","src":"19581:50:164","nodes":[],"statements":[{"expression":{"arguments":[{"id":98496,"name":"_parentIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98489,"src":"19596:12:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":98497,"name":"_claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98492,"src":"19610:6:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"hexValue":"66616c7365","id":98498,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"19618:5:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":98495,"name":"move","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98470,"src":"19591:4:164","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_userDefinedValueType$_Claim_$103255_$_t_bool_$returns$__$","typeString":"function (uint256,Claim,bool)"}},"id":98499,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19591:33:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98500,"nodeType":"ExpressionStatement","src":"19591:33:164"}]},"baseFunctions":[100551],"documentation":{"id":98487,"nodeType":"StructuredDocumentation","src":"19474:33:164","text":"@inheritdoc IFaultDisputeGame"},"functionSelector":"35fef567","implemented":true,"kind":"function","modifiers":[],"name":"defend","nameLocation":"19521:6:164","parameters":{"id":98493,"nodeType":"ParameterList","parameters":[{"constant":false,"id":98489,"mutability":"mutable","name":"_parentIndex","nameLocation":"19536:12:164","nodeType":"VariableDeclaration","scope":98502,"src":"19528:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98488,"name":"uint256","nodeType":"ElementaryTypeName","src":"19528:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":98492,"mutability":"mutable","name":"_claim","nameLocation":"19556:6:164","nodeType":"VariableDeclaration","scope":98502,"src":"19550:12:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":98491,"nodeType":"UserDefinedTypeName","pathNode":{"id":98490,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"19550:5:164"},"referencedDeclaration":103255,"src":"19550:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"}],"src":"19527:36:164"},"returnParameters":{"id":98494,"nodeType":"ParameterList","parameters":[],"src":"19581:0:164"},"scope":99927,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":98677,"nodeType":"FunctionDefinition","src":"19675:2011:164","nodes":[],"body":{"id":98676,"nodeType":"Block","src":"19765:1921:164","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"},"id":98515,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98512,"name":"status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97777,"src":"19868:6:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":98513,"name":"GameStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103277,"src":"19878:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_GameStatus_$103277_$","typeString":"type(enum GameStatus)"}},"id":98514,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"IN_PROGRESS","nodeType":"MemberAccess","referencedDeclaration":103274,"src":"19878:22:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"src":"19868:32:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98519,"nodeType":"IfStatement","src":"19864:64:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98516,"name":"GameNotInProgress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103144,"src":"19909:17:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98517,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19909:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98518,"nodeType":"RevertStatement","src":"19902:26:164"}},{"assignments":[98522,98525,98528,98531],"declarations":[{"constant":false,"id":98522,"mutability":"mutable","name":"starting","nameLocation":"19946:8:164","nodeType":"VariableDeclaration","scope":98676,"src":"19940:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":98521,"nodeType":"UserDefinedTypeName","pathNode":{"id":98520,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"19940:5:164"},"referencedDeclaration":103255,"src":"19940:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":98525,"mutability":"mutable","name":"startingPos","nameLocation":"19965:11:164","nodeType":"VariableDeclaration","scope":98676,"src":"19956:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":98524,"nodeType":"UserDefinedTypeName","pathNode":{"id":98523,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"19956:8:164"},"referencedDeclaration":103269,"src":"19956:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"},{"constant":false,"id":98528,"mutability":"mutable","name":"disputed","nameLocation":"19984:8:164","nodeType":"VariableDeclaration","scope":98676,"src":"19978:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":98527,"nodeType":"UserDefinedTypeName","pathNode":{"id":98526,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"19978:5:164"},"referencedDeclaration":103255,"src":"19978:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":98531,"mutability":"mutable","name":"disputedPos","nameLocation":"20003:11:164","nodeType":"VariableDeclaration","scope":98676,"src":"19994:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":98530,"nodeType":"UserDefinedTypeName","pathNode":{"id":98529,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"19994:8:164"},"referencedDeclaration":103269,"src":"19994:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"id":98535,"initialValue":{"arguments":[{"id":98533,"name":"_execLeafIdx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98507,"src":"20062:12:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":98532,"name":"_findStartingAndDisputedOutputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99840,"src":"20030:31:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (uint256) view returns (Claim,Position,Claim,Position)"}},"id":98534,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20030:45:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"tuple(Claim,Position,Claim,Position)"}},"nodeType":"VariableDeclarationStatement","src":"19939:136:164"},{"assignments":[98538],"declarations":[{"constant":false,"id":98538,"mutability":"mutable","name":"uuid","nameLocation":"20090:4:164","nodeType":"VariableDeclaration","scope":98676,"src":"20085:9:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"},"typeName":{"id":98537,"nodeType":"UserDefinedTypeName","pathNode":{"id":98536,"name":"Hash","nodeType":"IdentifierPath","referencedDeclaration":103253,"src":"20085:4:164"},"referencedDeclaration":103253,"src":"20085:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"visibility":"internal"}],"id":98545,"initialValue":{"arguments":[{"id":98540,"name":"starting","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98522,"src":"20118:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":98541,"name":"startingPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98525,"src":"20128:11:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"id":98542,"name":"disputed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98528,"src":"20141:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":98543,"name":"disputedPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98531,"src":"20151:11:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}],"id":98539,"name":"_computeLocalContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99926,"src":"20097:20:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$returns$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (Claim,Position,Claim,Position) pure returns (Hash)"}},"id":98544,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20097:66:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"nodeType":"VariableDeclarationStatement","src":"20085:78:164"},{"assignments":[98548],"declarations":[{"constant":false,"id":98548,"mutability":"mutable","name":"oracle","nameLocation":"20190:6:164","nodeType":"VariableDeclaration","scope":98676,"src":"20174:22:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IPreimageOracle_$96782","typeString":"contract IPreimageOracle"},"typeName":{"id":98547,"nodeType":"UserDefinedTypeName","pathNode":{"id":98546,"name":"IPreimageOracle","nodeType":"IdentifierPath","referencedDeclaration":96782,"src":"20174:15:164"},"referencedDeclaration":96782,"src":"20174:15:164","typeDescriptions":{"typeIdentifier":"t_contract$_IPreimageOracle_$96782","typeString":"contract IPreimageOracle"}},"visibility":"internal"}],"id":98552,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98549,"name":"VM","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97734,"src":"20199:2:164","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"}},"id":98550,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"oracle","nodeType":"MemberAccess","referencedDeclaration":100170,"src":"20199:9:164","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_contract$_IPreimageOracle_$96782_$","typeString":"function () view external returns (contract IPreimageOracle)"}},"id":98551,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20199:11:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IPreimageOracle_$96782","typeString":"contract IPreimageOracle"}},"nodeType":"VariableDeclarationStatement","src":"20174:36:164"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98556,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98553,"name":"_ident","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98505,"src":"20224:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":98554,"name":"LocalPreimageKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103373,"src":"20234:16:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LocalPreimageKey_$103373_$","typeString":"type(library LocalPreimageKey)"}},"id":98555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L1_HEAD_HASH","nodeType":"MemberAccess","referencedDeclaration":103356,"src":"20234:29:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"20224:39:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98576,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98573,"name":"_ident","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98505,"src":"20410:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":98574,"name":"LocalPreimageKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103373,"src":"20420:16:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LocalPreimageKey_$103373_$","typeString":"type(library LocalPreimageKey)"}},"id":98575,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"STARTING_OUTPUT_ROOT","nodeType":"MemberAccess","referencedDeclaration":103360,"src":"20420:37:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"20410:47:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98595,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98592,"name":"_ident","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98505,"src":"20624:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":98593,"name":"LocalPreimageKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103373,"src":"20634:16:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LocalPreimageKey_$103373_$","typeString":"type(library LocalPreimageKey)"}},"id":98594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"DISPUTED_OUTPUT_ROOT","nodeType":"MemberAccess","referencedDeclaration":103364,"src":"20634:37:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"20624:47:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98614,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98611,"name":"_ident","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98505,"src":"20837:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":98612,"name":"LocalPreimageKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103373,"src":"20847:16:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LocalPreimageKey_$103373_$","typeString":"type(library LocalPreimageKey)"}},"id":98613,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"DISPUTED_L2_BLOCK_NUMBER","nodeType":"MemberAccess","referencedDeclaration":103368,"src":"20847:41:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"20837:51:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98648,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98645,"name":"_ident","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98505,"src":"21380:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":98646,"name":"LocalPreimageKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103373,"src":"21390:16:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LocalPreimageKey_$103373_$","typeString":"type(library LocalPreimageKey)"}},"id":98647,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"CHAIN_ID","nodeType":"MemberAccess","referencedDeclaration":103372,"src":"21390:25:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21380:35:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":98670,"nodeType":"Block","src":"21629:51:164","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98667,"name":"InvalidLocalIdent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103168,"src":"21650:17:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98668,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21650:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98669,"nodeType":"RevertStatement","src":"21643:26:164"}]},"id":98671,"nodeType":"IfStatement","src":"21376:304:164","trueBody":{"id":98666,"nodeType":"Block","src":"21417:206:164","statements":[{"expression":{"arguments":[{"id":98652,"name":"_ident","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98505,"src":"21547:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98653,"name":"uuid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98538,"src":"21555:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":98654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101111,"src":"21555:8:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Hash_$103253_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (Hash) pure returns (bytes32)"}},"id":98655,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21555:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98660,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98658,"name":"L2_CHAIN_ID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97749,"src":"21575:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"30784330","id":98659,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21590:4:164","typeDescriptions":{"typeIdentifier":"t_rational_192_by_1","typeString":"int_const 192"},"value":"0xC0"},"src":"21575:19:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":98657,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21567:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":98656,"name":"bytes32","nodeType":"ElementaryTypeName","src":"21567:7:164","typeDescriptions":{}}},"id":98661,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21567:28:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"38","id":98662,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21597:1:164","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},{"id":98663,"name":"_partOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98509,"src":"21600:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":98649,"name":"oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98548,"src":"21526:6:164","typeDescriptions":{"typeIdentifier":"t_contract$_IPreimageOracle_$96782","typeString":"contract IPreimageOracle"}},"id":98651,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"loadLocalData","nodeType":"MemberAccess","referencedDeclaration":96741,"src":"21526:20:164","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256,bytes32,bytes32,uint256,uint256) external returns (bytes32)"}},"id":98664,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21526:86:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":98665,"nodeType":"ExpressionStatement","src":"21526:86:164"}]}},"id":98672,"nodeType":"IfStatement","src":"20833:847:164","trueBody":{"id":98644,"nodeType":"Block","src":"20890:480:164","statements":[{"assignments":[98616],"declarations":[{"constant":false,"id":98616,"mutability":"mutable","name":"l2Number","nameLocation":"21176:8:164","nodeType":"VariableDeclaration","scope":98644,"src":"21168:16:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98615,"name":"uint256","nodeType":"ElementaryTypeName","src":"21168:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":98626,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98623,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":98617,"name":"startingOutputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97811,"src":"21187:18:164","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRoot_$103283_storage","typeString":"struct OutputRoot storage ref"}},"id":98618,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"l2BlockNumber","nodeType":"MemberAccess","referencedDeclaration":103282,"src":"21187:32:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"arguments":[{"id":98621,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"21245:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":98619,"name":"disputedPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98531,"src":"21222:11:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98620,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"traceIndex","nodeType":"MemberAccess","referencedDeclaration":100925,"src":"21222:22:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$_t_uint256_$returns$_t_uint256_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position,uint256) pure returns (uint256)"}},"id":98622,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21222:35:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21187:70:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":98624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21260:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"21187:74:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"21168:93:164"},{"expression":{"arguments":[{"id":98630,"name":"_ident","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98505,"src":"21297:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98631,"name":"uuid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98538,"src":"21305:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":98632,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101111,"src":"21305:8:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Hash_$103253_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (Hash) pure returns (bytes32)"}},"id":98633,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21305:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98638,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98636,"name":"l2Number","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98616,"src":"21325:8:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"30784330","id":98637,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21337:4:164","typeDescriptions":{"typeIdentifier":"t_rational_192_by_1","typeString":"int_const 192"},"value":"0xC0"},"src":"21325:16:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":98635,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21317:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":98634,"name":"bytes32","nodeType":"ElementaryTypeName","src":"21317:7:164","typeDescriptions":{}}},"id":98639,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21317:25:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"38","id":98640,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21344:1:164","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},{"id":98641,"name":"_partOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98509,"src":"21347:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":98627,"name":"oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98548,"src":"21276:6:164","typeDescriptions":{"typeIdentifier":"t_contract$_IPreimageOracle_$96782","typeString":"contract IPreimageOracle"}},"id":98629,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"loadLocalData","nodeType":"MemberAccess","referencedDeclaration":96741,"src":"21276:20:164","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256,bytes32,bytes32,uint256,uint256) external returns (bytes32)"}},"id":98642,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21276:83:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":98643,"nodeType":"ExpressionStatement","src":"21276:83:164"}]}},"id":98673,"nodeType":"IfStatement","src":"20620:1060:164","trueBody":{"id":98610,"nodeType":"Block","src":"20673:154:164","statements":[{"expression":{"arguments":[{"id":98599,"name":"_ident","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98505,"src":"20764:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98600,"name":"uuid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98538,"src":"20772:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":98601,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101111,"src":"20772:8:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Hash_$103253_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (Hash) pure returns (bytes32)"}},"id":98602,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20772:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98603,"name":"disputed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98528,"src":"20784:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":98604,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101085,"src":"20784:12:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Claim_$103255_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function (Claim) pure returns (bytes32)"}},"id":98605,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20784:14:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"3332","id":98606,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"20800:2:164","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},{"id":98607,"name":"_partOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98509,"src":"20804:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":98596,"name":"oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98548,"src":"20743:6:164","typeDescriptions":{"typeIdentifier":"t_contract$_IPreimageOracle_$96782","typeString":"contract IPreimageOracle"}},"id":98598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"loadLocalData","nodeType":"MemberAccess","referencedDeclaration":96741,"src":"20743:20:164","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256,bytes32,bytes32,uint256,uint256) external returns (bytes32)"}},"id":98608,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20743:73:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":98609,"nodeType":"ExpressionStatement","src":"20743:73:164"}]}},"id":98674,"nodeType":"IfStatement","src":"20406:1274:164","trueBody":{"id":98591,"nodeType":"Block","src":"20459:155:164","statements":[{"expression":{"arguments":[{"id":98580,"name":"_ident","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98505,"src":"20551:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98581,"name":"uuid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98538,"src":"20559:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":98582,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101111,"src":"20559:8:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Hash_$103253_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (Hash) pure returns (bytes32)"}},"id":98583,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20559:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98584,"name":"starting","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98522,"src":"20571:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":98585,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101085,"src":"20571:12:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Claim_$103255_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function (Claim) pure returns (bytes32)"}},"id":98586,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20571:14:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"3332","id":98587,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"20587:2:164","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},{"id":98588,"name":"_partOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98509,"src":"20591:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":98577,"name":"oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98548,"src":"20530:6:164","typeDescriptions":{"typeIdentifier":"t_contract$_IPreimageOracle_$96782","typeString":"contract IPreimageOracle"}},"id":98579,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"loadLocalData","nodeType":"MemberAccess","referencedDeclaration":96741,"src":"20530:20:164","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256,bytes32,bytes32,uint256,uint256) external returns (bytes32)"}},"id":98589,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20530:73:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":98590,"nodeType":"ExpressionStatement","src":"20530:73:164"}]}},"id":98675,"nodeType":"IfStatement","src":"20220:1460:164","trueBody":{"id":98572,"nodeType":"Block","src":"20265:135:164","statements":[{"expression":{"arguments":[{"id":98560,"name":"_ident","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98505,"src":"20337:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98561,"name":"uuid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98538,"src":"20345:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":98562,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101111,"src":"20345:8:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Hash_$103253_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (Hash) pure returns (bytes32)"}},"id":98563,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20345:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":98564,"name":"l1Head","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99044,"src":"20357:6:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function () pure returns (Hash)"}},"id":98565,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20357:8:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":98566,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101111,"src":"20357:12:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Hash_$103253_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (Hash) pure returns (bytes32)"}},"id":98567,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20357:14:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"3332","id":98568,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"20373:2:164","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},{"id":98569,"name":"_partOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98509,"src":"20377:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":98557,"name":"oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98548,"src":"20316:6:164","typeDescriptions":{"typeIdentifier":"t_contract$_IPreimageOracle_$96782","typeString":"contract IPreimageOracle"}},"id":98559,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"loadLocalData","nodeType":"MemberAccess","referencedDeclaration":96741,"src":"20316:20:164","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256,bytes32,bytes32,uint256,uint256) external returns (bytes32)"}},"id":98570,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20316:73:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":98571,"nodeType":"ExpressionStatement","src":"20316:73:164"}]}}]},"baseFunctions":[100573],"documentation":{"id":98503,"nodeType":"StructuredDocumentation","src":"19637:33:164","text":"@inheritdoc IFaultDisputeGame"},"functionSelector":"f8f43ff6","implemented":true,"kind":"function","modifiers":[],"name":"addLocalData","nameLocation":"19684:12:164","parameters":{"id":98510,"nodeType":"ParameterList","parameters":[{"constant":false,"id":98505,"mutability":"mutable","name":"_ident","nameLocation":"19705:6:164","nodeType":"VariableDeclaration","scope":98677,"src":"19697:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98504,"name":"uint256","nodeType":"ElementaryTypeName","src":"19697:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":98507,"mutability":"mutable","name":"_execLeafIdx","nameLocation":"19721:12:164","nodeType":"VariableDeclaration","scope":98677,"src":"19713:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98506,"name":"uint256","nodeType":"ElementaryTypeName","src":"19713:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":98509,"mutability":"mutable","name":"_partOffset","nameLocation":"19743:11:164","nodeType":"VariableDeclaration","scope":98677,"src":"19735:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98508,"name":"uint256","nodeType":"ElementaryTypeName","src":"19735:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"19696:59:164"},"returnParameters":{"id":98511,"nodeType":"ParameterList","parameters":[],"src":"19765:0:164"},"scope":99927,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":98690,"nodeType":"FunctionDefinition","src":"21730:124:164","nodes":[],"body":{"id":98689,"nodeType":"Block","src":"21800:54:164","nodes":[],"statements":[{"expression":{"id":98687,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98683,"name":"l2BlockNumber_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98681,"src":"21810:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30783534","id":98685,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21842:4:164","typeDescriptions":{"typeIdentifier":"t_rational_84_by_1","typeString":"int_const 84"},"value":"0x54"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_84_by_1","typeString":"int_const 84"}],"id":98684,"name":"_getArgUint256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":60489,"src":"21827:14:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":98686,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21827:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21810:37:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":98688,"nodeType":"ExpressionStatement","src":"21810:37:164"}]},"baseFunctions":[100585],"documentation":{"id":98678,"nodeType":"StructuredDocumentation","src":"21692:33:164","text":"@inheritdoc IFaultDisputeGame"},"functionSelector":"8b85902b","implemented":true,"kind":"function","modifiers":[],"name":"l2BlockNumber","nameLocation":"21739:13:164","parameters":{"id":98679,"nodeType":"ParameterList","parameters":[],"src":"21752:2:164"},"returnParameters":{"id":98682,"nodeType":"ParameterList","parameters":[{"constant":false,"id":98681,"mutability":"mutable","name":"l2BlockNumber_","nameLocation":"21784:14:164","nodeType":"VariableDeclaration","scope":98690,"src":"21776:22:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98680,"name":"uint256","nodeType":"ElementaryTypeName","src":"21776:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"21775:24:164"},"scope":99927,"stateMutability":"pure","virtual":false,"visibility":"public"},{"id":98702,"nodeType":"FunctionDefinition","src":"21898:156:164","nodes":[],"body":{"id":98701,"nodeType":"Block","src":"21982:72:164","nodes":[],"statements":[{"expression":{"id":98699,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98696,"name":"startingBlockNumber_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98694,"src":"21992:20:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":98697,"name":"startingOutputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97811,"src":"22015:18:164","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRoot_$103283_storage","typeString":"struct OutputRoot storage ref"}},"id":98698,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"l2BlockNumber","nodeType":"MemberAccess","referencedDeclaration":103282,"src":"22015:32:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21992:55:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":98700,"nodeType":"ExpressionStatement","src":"21992:55:164"}]},"baseFunctions":[100600],"documentation":{"id":98691,"nodeType":"StructuredDocumentation","src":"21860:33:164","text":"@inheritdoc IFaultDisputeGame"},"functionSelector":"70872aa5","implemented":true,"kind":"function","modifiers":[],"name":"startingBlockNumber","nameLocation":"21907:19:164","parameters":{"id":98692,"nodeType":"ParameterList","parameters":[],"src":"21926:2:164"},"returnParameters":{"id":98695,"nodeType":"ParameterList","parameters":[{"constant":false,"id":98694,"mutability":"mutable","name":"startingBlockNumber_","nameLocation":"21960:20:164","nodeType":"VariableDeclaration","scope":98702,"src":"21952:28:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98693,"name":"uint256","nodeType":"ElementaryTypeName","src":"21952:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"21951:30:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":98715,"nodeType":"FunctionDefinition","src":"22098:135:164","nodes":[],"body":{"id":98714,"nodeType":"Block","src":"22173:60:164","nodes":[],"statements":[{"expression":{"id":98712,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98709,"name":"startingRootHash_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98707,"src":"22183:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":98710,"name":"startingOutputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97811,"src":"22203:18:164","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRoot_$103283_storage","typeString":"struct OutputRoot storage ref"}},"id":98711,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"root","nodeType":"MemberAccess","referencedDeclaration":103280,"src":"22203:23:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"src":"22183:43:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":98713,"nodeType":"ExpressionStatement","src":"22183:43:164"}]},"baseFunctions":[100607],"documentation":{"id":98703,"nodeType":"StructuredDocumentation","src":"22060:33:164","text":"@inheritdoc IFaultDisputeGame"},"functionSelector":"25fc2ace","implemented":true,"kind":"function","modifiers":[],"name":"startingRootHash","nameLocation":"22107:16:164","parameters":{"id":98704,"nodeType":"ParameterList","parameters":[],"src":"22123:2:164"},"returnParameters":{"id":98708,"nodeType":"ParameterList","parameters":[{"constant":false,"id":98707,"mutability":"mutable","name":"startingRootHash_","nameLocation":"22154:17:164","nodeType":"VariableDeclaration","scope":98715,"src":"22149:22:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"},"typeName":{"id":98706,"nodeType":"UserDefinedTypeName","pathNode":{"id":98705,"name":"Hash","nodeType":"IdentifierPath","referencedDeclaration":103253,"src":"22149:4:164"},"referencedDeclaration":103253,"src":"22149:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"visibility":"internal"}],"src":"22148:24:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":98778,"nodeType":"FunctionDefinition","src":"22480:905:164","nodes":[],"body":{"id":98777,"nodeType":"Block","src":"22537:848:164","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"},"id":98725,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98722,"name":"status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97777,"src":"22639:6:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":98723,"name":"GameStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103277,"src":"22649:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_GameStatus_$103277_$","typeString":"type(enum GameStatus)"}},"id":98724,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"IN_PROGRESS","nodeType":"MemberAccess","referencedDeclaration":103274,"src":"22649:22:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"src":"22639:32:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98729,"nodeType":"IfStatement","src":"22635:64:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98726,"name":"GameNotInProgress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103144,"src":"22680:17:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98727,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22680:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98728,"nodeType":"RevertStatement","src":"22673:26:164"}},{"condition":{"id":98733,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"22812:20:164","subExpression":{"baseExpression":{"id":98730,"name":"resolvedSubgames","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97807,"src":"22813:16:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"}},"id":98732,"indexExpression":{"hexValue":"30","id":98731,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22830:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"22813:19:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98737,"nodeType":"IfStatement","src":"22808:55:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98734,"name":"OutOfOrderResolution","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103171,"src":"22841:20:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98735,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22841:22:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98736,"nodeType":"RevertStatement","src":"22834:29:164"}},{"expression":{"id":98753,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98738,"name":"status_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98720,"src":"22943:7:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":98747,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":98739,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"22953:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":98741,"indexExpression":{"hexValue":"30","id":98740,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22963:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"22953:12:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref"}},"id":98742,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"counteredBy","nodeType":"MemberAccess","referencedDeclaration":100509,"src":"22953:24:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":98745,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22989:1:164","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":98744,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"22981:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":98743,"name":"address","nodeType":"ElementaryTypeName","src":"22981:7:164","typeDescriptions":{}}},"id":98746,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22981:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"22953:38:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"expression":{"id":98750,"name":"GameStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103277,"src":"23021:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_GameStatus_$103277_$","typeString":"type(enum GameStatus)"}},"id":98751,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"CHALLENGER_WINS","nodeType":"MemberAccess","referencedDeclaration":103275,"src":"23021:26:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"id":98752,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"22953:94:164","trueExpression":{"expression":{"id":98748,"name":"GameStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103277,"src":"22994:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_GameStatus_$103277_$","typeString":"type(enum GameStatus)"}},"id":98749,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"DEFENDER_WINS","nodeType":"MemberAccess","referencedDeclaration":103276,"src":"22994:24:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"src":"22943:104:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"id":98754,"nodeType":"ExpressionStatement","src":"22943:104:164"},{"expression":{"id":98764,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98755,"name":"resolvedAt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97773,"src":"23057:10:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"expression":{"id":98760,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"23092:5:164","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":98761,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"23092:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":98759,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"23085:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":98758,"name":"uint64","nodeType":"ElementaryTypeName","src":"23085:6:164","typeDescriptions":{}}},"id":98762,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23085:23:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":98756,"name":"Timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103261,"src":"23070:9:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"type(Timestamp)"}},"id":98757,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"23070:14:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint64_$returns$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"function (uint64) pure returns (Timestamp)"}},"id":98763,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23070:39:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"src":"23057:52:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"id":98765,"nodeType":"ExpressionStatement","src":"23057:52:164"},{"eventCall":{"arguments":[{"id":98769,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98767,"name":"status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97777,"src":"23239:6:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":98768,"name":"status_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98720,"src":"23248:7:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"src":"23239:16:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}],"id":98766,"name":"Resolved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100253,"src":"23230:8:164","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_enum$_GameStatus_$103277_$returns$__$","typeString":"function (enum GameStatus)"}},"id":98770,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23230:26:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98771,"nodeType":"EmitStatement","src":"23225:31:164"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98772,"name":"ANCHOR_STATE_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97746,"src":"23334:21:164","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"}},"id":98774,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"tryUpdateAnchorState","nodeType":"MemberAccess","referencedDeclaration":100145,"src":"23334:42:164","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":98775,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23334:44:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98776,"nodeType":"ExpressionStatement","src":"23334:44:164"}]},"baseFunctions":[100314],"documentation":{"id":98716,"nodeType":"StructuredDocumentation","src":"22447:28:164","text":"@inheritdoc IDisputeGame"},"functionSelector":"2810e1d6","implemented":true,"kind":"function","modifiers":[],"name":"resolve","nameLocation":"22489:7:164","parameters":{"id":98717,"nodeType":"ParameterList","parameters":[],"src":"22496:2:164"},"returnParameters":{"id":98721,"nodeType":"ParameterList","parameters":[{"constant":false,"id":98720,"mutability":"mutable","name":"status_","nameLocation":"22528:7:164","nodeType":"VariableDeclaration","scope":98778,"src":"22517:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"},"typeName":{"id":98719,"nodeType":"UserDefinedTypeName","pathNode":{"id":98718,"name":"GameStatus","nodeType":"IdentifierPath","referencedDeclaration":103277,"src":"22517:10:164"},"referencedDeclaration":103277,"src":"22517:10:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"visibility":"internal"}],"src":"22516:20:164"},"scope":99927,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":98984,"nodeType":"FunctionDefinition","src":"23429:3867:164","nodes":[],"body":{"id":98983,"nodeType":"Block","src":"23481:3815:164","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"},"id":98787,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98784,"name":"status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97777,"src":"23583:6:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":98785,"name":"GameStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103277,"src":"23593:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_GameStatus_$103277_$","typeString":"type(enum GameStatus)"}},"id":98786,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"IN_PROGRESS","nodeType":"MemberAccess","referencedDeclaration":103274,"src":"23593:22:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"src":"23583:32:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98791,"nodeType":"IfStatement","src":"23579:64:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98788,"name":"GameNotInProgress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103144,"src":"23624:17:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98789,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23624:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98790,"nodeType":"RevertStatement","src":"23617:26:164"}},{"assignments":[98794],"declarations":[{"constant":false,"id":98794,"mutability":"mutable","name":"subgameRootClaim","nameLocation":"23672:16:164","nodeType":"VariableDeclaration","scope":98983,"src":"23654:34:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":98793,"nodeType":"UserDefinedTypeName","pathNode":{"id":98792,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"23654:9:164"},"referencedDeclaration":100523,"src":"23654:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"id":98798,"initialValue":{"baseExpression":{"id":98795,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"23691:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":98797,"indexExpression":{"id":98796,"name":"_claimIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98781,"src":"23701:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"23691:22:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref"}},"nodeType":"VariableDeclarationStatement","src":"23654:59:164"},{"assignments":[98801],"declarations":[{"constant":false,"id":98801,"mutability":"mutable","name":"challengeClockDuration","nameLocation":"23732:22:164","nodeType":"VariableDeclaration","scope":98983,"src":"23723:31:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"},"typeName":{"id":98800,"nodeType":"UserDefinedTypeName","pathNode":{"id":98799,"name":"Duration","nodeType":"IdentifierPath","referencedDeclaration":103263,"src":"23723:8:164"},"referencedDeclaration":103263,"src":"23723:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"visibility":"internal"}],"id":98805,"initialValue":{"arguments":[{"id":98803,"name":"_claimIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98781,"src":"23779:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":98802,"name":"getChallengerDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99348,"src":"23757:21:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (uint256) view returns (Duration)"}},"id":98804,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23757:34:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"nodeType":"VariableDeclarationStatement","src":"23723:68:164"},{"condition":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":98812,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98806,"name":"challengeClockDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98801,"src":"24071:22:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":98807,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"24071:26:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":98808,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"24071:28:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98809,"name":"MAX_CLOCK_DURATION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97730,"src":"24102:18:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":98810,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"24102:22:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":98811,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"24102:24:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"24071:55:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98816,"nodeType":"IfStatement","src":"24067:85:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98813,"name":"ClockNotExpired","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103150,"src":"24135:15:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98814,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"24135:17:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98815,"nodeType":"RevertStatement","src":"24128:24:164"}},{"condition":{"baseExpression":{"id":98817,"name":"resolvedSubgames","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97807,"src":"24221:16:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"}},"id":98819,"indexExpression":{"id":98818,"name":"_claimIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98781,"src":"24238:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"24221:29:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98823,"nodeType":"IfStatement","src":"24217:64:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98820,"name":"ClaimAlreadyResolved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103174,"src":"24259:20:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98821,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"24259:22:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98822,"nodeType":"RevertStatement","src":"24252:29:164"}},{"assignments":[98828],"declarations":[{"constant":false,"id":98828,"mutability":"mutable","name":"challengeIndices","nameLocation":"24310:16:164","nodeType":"VariableDeclaration","scope":98983,"src":"24292:34:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":98826,"name":"uint256","nodeType":"ElementaryTypeName","src":"24292:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":98827,"nodeType":"ArrayTypeName","src":"24292:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"id":98832,"initialValue":{"baseExpression":{"id":98829,"name":"subgames","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97802,"src":"24329:8:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_uint256_$dyn_storage_$","typeString":"mapping(uint256 => uint256[] storage ref)"}},"id":98831,"indexExpression":{"id":98830,"name":"_claimIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98781,"src":"24338:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"24329:21:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage","typeString":"uint256[] storage ref"}},"nodeType":"VariableDeclarationStatement","src":"24292:58:164"},{"assignments":[98834],"declarations":[{"constant":false,"id":98834,"mutability":"mutable","name":"challengeIndicesLen","nameLocation":"24368:19:164","nodeType":"VariableDeclaration","scope":98983,"src":"24360:27:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98833,"name":"uint256","nodeType":"ElementaryTypeName","src":"24360:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":98837,"initialValue":{"expression":{"id":98835,"name":"challengeIndices","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98828,"src":"24390:16:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[] storage pointer"}},"id":98836,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"24390:23:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"24360:53:164"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":98844,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98840,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98838,"name":"challengeIndicesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98834,"src":"24576:19:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":98839,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24599:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"24576:24:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98843,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98841,"name":"_claimIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98781,"src":"24604:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":98842,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24619:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"24604:16:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"24576:44:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98876,"nodeType":"IfStatement","src":"24572:805:164","trueBody":{"id":98875,"nodeType":"Block","src":"24622:755:164","statements":[{"assignments":[98846],"declarations":[{"constant":false,"id":98846,"mutability":"mutable","name":"counteredBy","nameLocation":"25095:11:164","nodeType":"VariableDeclaration","scope":98875,"src":"25087:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":98845,"name":"address","nodeType":"ElementaryTypeName","src":"25087:7:164","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":98849,"initialValue":{"expression":{"id":98847,"name":"subgameRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98794,"src":"25109:16:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98848,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"counteredBy","nodeType":"MemberAccess","referencedDeclaration":100509,"src":"25109:28:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"25087:50:164"},{"assignments":[98851],"declarations":[{"constant":false,"id":98851,"mutability":"mutable","name":"recipient","nameLocation":"25159:9:164","nodeType":"VariableDeclaration","scope":98875,"src":"25151:17:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":98850,"name":"address","nodeType":"ElementaryTypeName","src":"25151:7:164","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":98862,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":98857,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98852,"name":"counteredBy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98846,"src":"25171:11:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":98855,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25194:1:164","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":98854,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"25186:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":98853,"name":"address","nodeType":"ElementaryTypeName","src":"25186:7:164","typeDescriptions":{}}},"id":98856,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25186:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"25171:25:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":98860,"name":"counteredBy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98846,"src":"25227:11:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":98861,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"25171:67:164","trueExpression":{"expression":{"id":98858,"name":"subgameRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98794,"src":"25199:16:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98859,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"claimant","nodeType":"MemberAccess","referencedDeclaration":100511,"src":"25199:25:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"25151:87:164"},{"expression":{"arguments":[{"id":98864,"name":"recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98851,"src":"25268:9:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":98865,"name":"subgameRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98794,"src":"25279:16:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}],"id":98863,"name":"_distributeBond","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99493,"src":"25252:15:164","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_struct$_ClaimData_$100523_storage_ptr_$returns$__$","typeString":"function (address,struct IFaultDisputeGame.ClaimData storage pointer)"}},"id":98866,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25252:44:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98867,"nodeType":"ExpressionStatement","src":"25252:44:164"},{"expression":{"id":98872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":98868,"name":"resolvedSubgames","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97807,"src":"25310:16:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"}},"id":98870,"indexExpression":{"id":98869,"name":"_claimIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98781,"src":"25327:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"25310:29:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":98871,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"25342:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"25310:36:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98873,"nodeType":"ExpressionStatement","src":"25310:36:164"},{"functionReturnParameters":98783,"id":98874,"nodeType":"Return","src":"25360:7:164"}]}},{"assignments":[98878],"declarations":[{"constant":false,"id":98878,"mutability":"mutable","name":"countered","nameLocation":"25453:9:164","nodeType":"VariableDeclaration","scope":98983,"src":"25445:17:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":98877,"name":"address","nodeType":"ElementaryTypeName","src":"25445:7:164","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":98883,"initialValue":{"arguments":[{"hexValue":"30","id":98881,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25473:1:164","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":98880,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"25465:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":98879,"name":"address","nodeType":"ElementaryTypeName","src":"25465:7:164","typeDescriptions":{}}},"id":98882,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25465:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"25445:30:164"},{"assignments":[98886],"declarations":[{"constant":false,"id":98886,"mutability":"mutable","name":"leftmostCounter","nameLocation":"25494:15:164","nodeType":"VariableDeclaration","scope":98983,"src":"25485:24:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":98885,"nodeType":"UserDefinedTypeName","pathNode":{"id":98884,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"25485:8:164"},"referencedDeclaration":103269,"src":"25485:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"id":98895,"initialValue":{"arguments":[{"expression":{"arguments":[{"id":98891,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"25531:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint128_$","typeString":"type(uint128)"},"typeName":{"id":98890,"name":"uint128","nodeType":"ElementaryTypeName","src":"25531:7:164","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint128_$","typeString":"type(uint128)"}],"id":98889,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"25526:4:164","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":98892,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25526:13:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint128","typeString":"type(uint128)"}},"id":98893,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"25526:17:164","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint128","typeString":"uint128"}],"expression":{"id":98887,"name":"Position","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103269,"src":"25512:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Position_$103269_$","typeString":"type(Position)"}},"id":98888,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"25512:13:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint128_$returns$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (uint128) pure returns (Position)"}},"id":98894,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25512:32:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"nodeType":"VariableDeclarationStatement","src":"25485:59:164"},{"body":{"id":98955,"nodeType":"Block","src":"25604:1079:164","statements":[{"assignments":[98907],"declarations":[{"constant":false,"id":98907,"mutability":"mutable","name":"challengeIndex","nameLocation":"25626:14:164","nodeType":"VariableDeclaration","scope":98955,"src":"25618:22:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98906,"name":"uint256","nodeType":"ElementaryTypeName","src":"25618:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":98911,"initialValue":{"baseExpression":{"id":98908,"name":"challengeIndices","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98828,"src":"25643:16:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[] storage pointer"}},"id":98910,"indexExpression":{"id":98909,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98897,"src":"25660:1:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"25643:19:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25618:44:164"},{"condition":{"id":98915,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"25763:33:164","subExpression":{"baseExpression":{"id":98912,"name":"resolvedSubgames","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97807,"src":"25764:16:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"}},"id":98914,"indexExpression":{"id":98913,"name":"challengeIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98907,"src":"25781:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"25764:32:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98919,"nodeType":"IfStatement","src":"25759:68:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":98916,"name":"OutOfOrderResolution","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103171,"src":"25805:20:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":98917,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"25805:22:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98918,"nodeType":"RevertStatement","src":"25798:29:164"}},{"assignments":[98922],"declarations":[{"constant":false,"id":98922,"mutability":"mutable","name":"claim","nameLocation":"25860:5:164","nodeType":"VariableDeclaration","scope":98955,"src":"25842:23:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":98921,"nodeType":"UserDefinedTypeName","pathNode":{"id":98920,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"25842:9:164"},"referencedDeclaration":100523,"src":"25842:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"id":98926,"initialValue":{"baseExpression":{"id":98923,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"25868:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":98925,"indexExpression":{"id":98924,"name":"challengeIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98907,"src":"25878:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"25868:25:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref"}},"nodeType":"VariableDeclarationStatement","src":"25842:51:164"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":98942,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":98933,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":98927,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98922,"src":"26483:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98928,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"counteredBy","nodeType":"MemberAccess","referencedDeclaration":100509,"src":"26483:17:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":98931,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26512:1:164","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":98930,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"26504:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":98929,"name":"address","nodeType":"ElementaryTypeName","src":"26504:7:164","typeDescriptions":{}}},"id":98932,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"26504:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"26483:31:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":98941,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":98934,"name":"leftmostCounter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98886,"src":"26518:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98935,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"26518:19:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":98936,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"26518:21:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":98937,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98922,"src":"26542:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98938,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"26542:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98939,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"26542:18:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":98940,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"26542:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"src":"26518:44:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"26483:79:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98954,"nodeType":"IfStatement","src":"26479:194:164","trueBody":{"id":98953,"nodeType":"Block","src":"26564:109:164","statements":[{"expression":{"id":98946,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98943,"name":"countered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98878,"src":"26582:9:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":98944,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98922,"src":"26594:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98945,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"claimant","nodeType":"MemberAccess","referencedDeclaration":100511,"src":"26594:14:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"26582:26:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":98947,"nodeType":"ExpressionStatement","src":"26582:26:164"},{"expression":{"id":98951,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98948,"name":"leftmostCounter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98886,"src":"26626:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":98949,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98922,"src":"26644:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98950,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"26644:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"src":"26626:32:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":98952,"nodeType":"ExpressionStatement","src":"26626:32:164"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":98902,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98900,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98897,"src":"25574:1:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":98901,"name":"challengeIndicesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98834,"src":"25578:19:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25574:23:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98956,"initializationExpression":{"assignments":[98897],"declarations":[{"constant":false,"id":98897,"mutability":"mutable","name":"i","nameLocation":"25567:1:164","nodeType":"VariableDeclaration","scope":98956,"src":"25559:9:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98896,"name":"uint256","nodeType":"ElementaryTypeName","src":"25559:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":98899,"initialValue":{"hexValue":"30","id":98898,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25571:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"25559:13:164"},"loopExpression":{"expression":{"id":98904,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"25599:3:164","subExpression":{"id":98903,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98897,"src":"25601:1:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":98905,"nodeType":"ExpressionStatement","src":"25599:3:164"},"nodeType":"ForStatement","src":"25554:1129:164"},{"expression":{"arguments":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":98963,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":98958,"name":"countered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98878,"src":"26907:9:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":98961,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26928:1:164","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":98960,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"26920:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":98959,"name":"address","nodeType":"ElementaryTypeName","src":"26920:7:164","typeDescriptions":{}}},"id":98962,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"26920:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"26907:23:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":98966,"name":"countered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98878,"src":"26961:9:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":98967,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"26907:63:164","trueExpression":{"expression":{"id":98964,"name":"subgameRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98794,"src":"26933:16:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98965,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"claimant","nodeType":"MemberAccess","referencedDeclaration":100511,"src":"26933:25:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":98968,"name":"subgameRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98794,"src":"26972:16:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}],"id":98957,"name":"_distributeBond","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99493,"src":"26891:15:164","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_struct$_ClaimData_$100523_storage_ptr_$returns$__$","typeString":"function (address,struct IFaultDisputeGame.ClaimData storage pointer)"}},"id":98969,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"26891:98:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":98970,"nodeType":"ExpressionStatement","src":"26891:98:164"},{"expression":{"id":98975,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":98971,"name":"subgameRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98794,"src":"27161:16:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":98973,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"counteredBy","nodeType":"MemberAccess","referencedDeclaration":100509,"src":"27161:28:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":98974,"name":"countered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98878,"src":"27192:9:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"27161:40:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":98976,"nodeType":"ExpressionStatement","src":"27161:40:164"},{"expression":{"id":98981,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":98977,"name":"resolvedSubgames","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97807,"src":"27253:16:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"}},"id":98979,"indexExpression":{"id":98978,"name":"_claimIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98781,"src":"27270:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"27253:29:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":98980,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"27285:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"27253:36:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":98982,"nodeType":"ExpressionStatement","src":"27253:36:164"}]},"baseFunctions":[100579],"documentation":{"id":98779,"nodeType":"StructuredDocumentation","src":"23391:33:164","text":"@inheritdoc IFaultDisputeGame"},"functionSelector":"fdffbb28","implemented":true,"kind":"function","modifiers":[],"name":"resolveClaim","nameLocation":"23438:12:164","parameters":{"id":98782,"nodeType":"ParameterList","parameters":[{"constant":false,"id":98781,"mutability":"mutable","name":"_claimIndex","nameLocation":"23459:11:164","nodeType":"VariableDeclaration","scope":98984,"src":"23451:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98780,"name":"uint256","nodeType":"ElementaryTypeName","src":"23451:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"23450:21:164"},"returnParameters":{"id":98783,"nodeType":"ParameterList","parameters":[],"src":"23481:0:164"},"scope":99927,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":98997,"nodeType":"FunctionDefinition","src":"27335:108:164","nodes":[],"body":{"id":98996,"nodeType":"Block","src":"27405:38:164","nodes":[],"statements":[{"expression":{"id":98994,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":98992,"name":"gameType_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98990,"src":"27415:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":98993,"name":"GAME_TYPE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97738,"src":"27427:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"src":"27415:21:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"id":98995,"nodeType":"ExpressionStatement","src":"27415:21:164"}]},"baseFunctions":[100281],"documentation":{"id":98985,"nodeType":"StructuredDocumentation","src":"27302:28:164","text":"@inheritdoc IDisputeGame"},"functionSelector":"bbdc02db","implemented":true,"kind":"function","modifiers":[],"name":"gameType","nameLocation":"27344:8:164","overrides":{"id":98987,"nodeType":"OverrideSpecifier","overrides":[],"src":"27367:8:164"},"parameters":{"id":98986,"nodeType":"ParameterList","parameters":[],"src":"27352:2:164"},"returnParameters":{"id":98991,"nodeType":"ParameterList","parameters":[{"constant":false,"id":98990,"mutability":"mutable","name":"gameType_","nameLocation":"27394:9:164","nodeType":"VariableDeclaration","scope":98997,"src":"27385:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":98989,"nodeType":"UserDefinedTypeName","pathNode":{"id":98988,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"27385:8:164"},"referencedDeclaration":103271,"src":"27385:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"}],"src":"27384:20:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":99010,"nodeType":"FunctionDefinition","src":"27482:110:164","nodes":[],"body":{"id":99009,"nodeType":"Block","src":"27544:48:164","nodes":[],"statements":[{"expression":{"id":99007,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99003,"name":"creator_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99001,"src":"27554:8:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30783030","id":99005,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"27580:4:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0x00"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":99004,"name":"_getArgAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":60423,"src":"27565:14:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_address_$","typeString":"function (uint256) pure returns (address)"}},"id":99006,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"27565:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"27554:31:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":99008,"nodeType":"ExpressionStatement","src":"27554:31:164"}]},"baseFunctions":[100287],"documentation":{"id":98998,"nodeType":"StructuredDocumentation","src":"27449:28:164","text":"@inheritdoc IDisputeGame"},"functionSelector":"37b1b229","implemented":true,"kind":"function","modifiers":[],"name":"gameCreator","nameLocation":"27491:11:164","parameters":{"id":98999,"nodeType":"ParameterList","parameters":[],"src":"27502:2:164"},"returnParameters":{"id":99002,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99001,"mutability":"mutable","name":"creator_","nameLocation":"27534:8:164","nodeType":"VariableDeclaration","scope":99010,"src":"27526:16:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":99000,"name":"address","nodeType":"ElementaryTypeName","src":"27526:7:164","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"27525:18:164"},"scope":99927,"stateMutability":"pure","virtual":false,"visibility":"public"},{"id":99027,"nodeType":"FunctionDefinition","src":"27631:122:164","nodes":[],"body":{"id":99026,"nodeType":"Block","src":"27691:62:164","nodes":[],"statements":[{"expression":{"id":99024,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99017,"name":"rootClaim_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99015,"src":"27701:10:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"hexValue":"30783134","id":99021,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"27740:4:164","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"0x14"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"}],"id":99020,"name":"_getArgBytes32","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":60474,"src":"27725:14:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256) pure returns (bytes32)"}},"id":99022,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"27725:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":99018,"name":"Claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103255,"src":"27714:5:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Claim_$103255_$","typeString":"type(Claim)"}},"id":99019,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"27714:10:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_bytes32_$returns$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function (bytes32) pure returns (Claim)"}},"id":99023,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"27714:32:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"src":"27701:45:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":99025,"nodeType":"ExpressionStatement","src":"27701:45:164"}]},"baseFunctions":[100294],"documentation":{"id":99011,"nodeType":"StructuredDocumentation","src":"27598:28:164","text":"@inheritdoc IDisputeGame"},"functionSelector":"bcef3b55","implemented":true,"kind":"function","modifiers":[],"name":"rootClaim","nameLocation":"27640:9:164","parameters":{"id":99012,"nodeType":"ParameterList","parameters":[],"src":"27649:2:164"},"returnParameters":{"id":99016,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99015,"mutability":"mutable","name":"rootClaim_","nameLocation":"27679:10:164","nodeType":"VariableDeclaration","scope":99027,"src":"27673:16:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":99014,"nodeType":"UserDefinedTypeName","pathNode":{"id":99013,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"27673:5:164"},"referencedDeclaration":103255,"src":"27673:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"}],"src":"27672:18:164"},"scope":99927,"stateMutability":"pure","virtual":false,"visibility":"public"},{"id":99044,"nodeType":"FunctionDefinition","src":"27792:111:164","nodes":[],"body":{"id":99043,"nodeType":"Block","src":"27845:58:164","nodes":[],"statements":[{"expression":{"id":99041,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99034,"name":"l1Head_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99032,"src":"27855:7:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"hexValue":"30783334","id":99038,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"27890:4:164","typeDescriptions":{"typeIdentifier":"t_rational_52_by_1","typeString":"int_const 52"},"value":"0x34"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_52_by_1","typeString":"int_const 52"}],"id":99037,"name":"_getArgBytes32","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":60474,"src":"27875:14:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256) pure returns (bytes32)"}},"id":99039,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"27875:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":99035,"name":"Hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103253,"src":"27865:4:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Hash_$103253_$","typeString":"type(Hash)"}},"id":99036,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"27865:9:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_bytes32_$returns$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (bytes32) pure returns (Hash)"}},"id":99040,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"27865:31:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"src":"27855:41:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":99042,"nodeType":"ExpressionStatement","src":"27855:41:164"}]},"baseFunctions":[100301],"documentation":{"id":99028,"nodeType":"StructuredDocumentation","src":"27759:28:164","text":"@inheritdoc IDisputeGame"},"functionSelector":"6361506d","implemented":true,"kind":"function","modifiers":[],"name":"l1Head","nameLocation":"27801:6:164","parameters":{"id":99029,"nodeType":"ParameterList","parameters":[],"src":"27807:2:164"},"returnParameters":{"id":99033,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99032,"mutability":"mutable","name":"l1Head_","nameLocation":"27836:7:164","nodeType":"VariableDeclaration","scope":99044,"src":"27831:12:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"},"typeName":{"id":99031,"nodeType":"UserDefinedTypeName","pathNode":{"id":99030,"name":"Hash","nodeType":"IdentifierPath","referencedDeclaration":103253,"src":"27831:4:164"},"referencedDeclaration":103253,"src":"27831:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"visibility":"internal"}],"src":"27830:14:164"},"scope":99927,"stateMutability":"pure","virtual":false,"visibility":"public"},{"id":99058,"nodeType":"FunctionDefinition","src":"27942:231:164","nodes":[],"body":{"id":99057,"nodeType":"Block","src":"28009:164:164","nodes":[],"statements":[{"expression":{"id":99055,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99050,"name":"extraData_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99048,"src":"28129:10:164","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30783534","id":99052,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"28155:4:164","typeDescriptions":{"typeIdentifier":"t_rational_84_by_1","typeString":"int_const 84"},"value":"0x54"},{"hexValue":"30783230","id":99053,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"28161:4:164","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"0x20"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_84_by_1","typeString":"int_const 84"},{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"}],"id":99051,"name":"_getArgBytes","nodeType":"Identifier","overloadedDeclarations":[60391,60408],"referencedDeclaration":60408,"src":"28142:12:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (bytes memory)"}},"id":99054,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"28142:24:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"src":"28129:37:164","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":99056,"nodeType":"ExpressionStatement","src":"28129:37:164"}]},"baseFunctions":[100307],"documentation":{"id":99045,"nodeType":"StructuredDocumentation","src":"27909:28:164","text":"@inheritdoc IDisputeGame"},"functionSelector":"609d3334","implemented":true,"kind":"function","modifiers":[],"name":"extraData","nameLocation":"27951:9:164","parameters":{"id":99046,"nodeType":"ParameterList","parameters":[],"src":"27960:2:164"},"returnParameters":{"id":99049,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99048,"mutability":"mutable","name":"extraData_","nameLocation":"27997:10:164","nodeType":"VariableDeclaration","scope":99058,"src":"27984:23:164","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":99047,"name":"bytes","nodeType":"ElementaryTypeName","src":"27984:5:164","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"27983:25:164"},"scope":99927,"stateMutability":"pure","virtual":false,"visibility":"public"},{"id":99086,"nodeType":"FunctionDefinition","src":"28212:213:164","nodes":[],"body":{"id":99085,"nodeType":"Block","src":"28318:107:164","nodes":[],"statements":[{"expression":{"id":99073,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99070,"name":"gameType_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99063,"src":"28328:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"id":99071,"name":"gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":98997,"src":"28340:8:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_userDefinedValueType$_GameType_$103271_$","typeString":"function () view returns (GameType)"}},"id":99072,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"28340:10:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"src":"28328:22:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"id":99074,"nodeType":"ExpressionStatement","src":"28328:22:164"},{"expression":{"id":99078,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99075,"name":"rootClaim_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99066,"src":"28360:10:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"id":99076,"name":"rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99027,"src":"28373:9:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function () pure returns (Claim)"}},"id":99077,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"28373:11:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"src":"28360:24:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":99079,"nodeType":"ExpressionStatement","src":"28360:24:164"},{"expression":{"id":99083,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99080,"name":"extraData_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99068,"src":"28394:10:164","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"id":99081,"name":"extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99058,"src":"28407:9:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":99082,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"28407:11:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"src":"28394:24:164","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":99084,"nodeType":"ExpressionStatement","src":"28394:24:164"}]},"baseFunctions":[100326],"documentation":{"id":99059,"nodeType":"StructuredDocumentation","src":"28179:28:164","text":"@inheritdoc IDisputeGame"},"functionSelector":"fa24f743","implemented":true,"kind":"function","modifiers":[],"name":"gameData","nameLocation":"28221:8:164","parameters":{"id":99060,"nodeType":"ParameterList","parameters":[],"src":"28229:2:164"},"returnParameters":{"id":99069,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99063,"mutability":"mutable","name":"gameType_","nameLocation":"28264:9:164","nodeType":"VariableDeclaration","scope":99086,"src":"28255:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":99062,"nodeType":"UserDefinedTypeName","pathNode":{"id":99061,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"28255:8:164"},"referencedDeclaration":103271,"src":"28255:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},{"constant":false,"id":99066,"mutability":"mutable","name":"rootClaim_","nameLocation":"28281:10:164","nodeType":"VariableDeclaration","scope":99086,"src":"28275:16:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":99065,"nodeType":"UserDefinedTypeName","pathNode":{"id":99064,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"28275:5:164"},"referencedDeclaration":103255,"src":"28275:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":99068,"mutability":"mutable","name":"extraData_","nameLocation":"28306:10:164","nodeType":"VariableDeclaration","scope":99086,"src":"28293:23:164","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":99067,"name":"bytes","nodeType":"ElementaryTypeName","src":"28293:5:164","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"28254:63:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":99215,"nodeType":"FunctionDefinition","src":"28849:2171:164","nodes":[],"body":{"id":99214,"nodeType":"Block","src":"28938:2082:164","nodes":[],"statements":[{"assignments":[99096],"declarations":[{"constant":false,"id":99096,"mutability":"mutable","name":"depth","nameLocation":"28956:5:164","nodeType":"VariableDeclaration","scope":99214,"src":"28948:13:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99095,"name":"uint256","nodeType":"ElementaryTypeName","src":"28948:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99103,"initialValue":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99099,"name":"_position","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99090,"src":"28972:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99100,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depth","nodeType":"MemberAccess","referencedDeclaration":100833,"src":"28972:15:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint8_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint8)"}},"id":99101,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"28972:17:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":99098,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"28964:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":99097,"name":"uint256","nodeType":"ElementaryTypeName","src":"28964:7:164","typeDescriptions":{}}},"id":99102,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"28964:26:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"28948:42:164"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99106,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99104,"name":"depth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99096,"src":"29004:5:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":99105,"name":"MAX_GAME_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97723,"src":"29012:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"29004:22:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":99110,"nodeType":"IfStatement","src":"29000:54:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":99107,"name":"GameDepthExceeded","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103153,"src":"29035:17:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":99108,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"29035:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99109,"nodeType":"RevertStatement","src":"29028:26:164"}},{"assignments":[99112],"declarations":[{"constant":false,"id":99112,"mutability":"mutable","name":"assumedBaseFee","nameLocation":"29128:14:164","nodeType":"VariableDeclaration","scope":99214,"src":"29120:22:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99111,"name":"uint256","nodeType":"ElementaryTypeName","src":"29120:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99114,"initialValue":{"hexValue":"323030","id":99113,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29145:8:164","subdenomination":"gwei","typeDescriptions":{"typeIdentifier":"t_rational_200000000000_by_1","typeString":"int_const 200000000000"},"value":"200"},"nodeType":"VariableDeclarationStatement","src":"29120:33:164"},{"assignments":[99116],"declarations":[{"constant":false,"id":99116,"mutability":"mutable","name":"baseGasCharged","nameLocation":"29171:14:164","nodeType":"VariableDeclaration","scope":99214,"src":"29163:22:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99115,"name":"uint256","nodeType":"ElementaryTypeName","src":"29163:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99118,"initialValue":{"hexValue":"3430305f303030","id":99117,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29188:7:164","typeDescriptions":{"typeIdentifier":"t_rational_400000_by_1","typeString":"int_const 400000"},"value":"400_000"},"nodeType":"VariableDeclarationStatement","src":"29163:32:164"},{"assignments":[99120],"declarations":[{"constant":false,"id":99120,"mutability":"mutable","name":"highGasCharged","nameLocation":"29213:14:164","nodeType":"VariableDeclaration","scope":99214,"src":"29205:22:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99119,"name":"uint256","nodeType":"ElementaryTypeName","src":"29205:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99122,"initialValue":{"hexValue":"3230305f3030305f303030","id":99121,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29230:11:164","typeDescriptions":{"typeIdentifier":"t_rational_200000000_by_1","typeString":"int_const 200000000"},"value":"200_000_000"},"nodeType":"VariableDeclarationStatement","src":"29205:36:164"},{"assignments":[99124],"declarations":[{"constant":false,"id":99124,"mutability":"mutable","name":"a","nameLocation":"29993:1:164","nodeType":"VariableDeclaration","scope":99214,"src":"29985:9:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99123,"name":"uint256","nodeType":"ElementaryTypeName","src":"29985:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99128,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99127,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99125,"name":"highGasCharged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99120,"src":"29997:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":99126,"name":"baseGasCharged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99116,"src":"30014:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"29997:31:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"29985:43:164"},{"assignments":[99130],"declarations":[{"constant":false,"id":99130,"mutability":"mutable","name":"b","nameLocation":"30046:1:164","nodeType":"VariableDeclaration","scope":99214,"src":"30038:9:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99129,"name":"uint256","nodeType":"ElementaryTypeName","src":"30038:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99133,"initialValue":{"expression":{"id":99131,"name":"FixedPointMathLib","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62288,"src":"30050:17:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_FixedPointMathLib_$62288_$","typeString":"type(library FixedPointMathLib)"}},"id":99132,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"WAD","nodeType":"MemberAccess","referencedDeclaration":61009,"src":"30050:21:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"30038:33:164"},{"assignments":[99135],"declarations":[{"constant":false,"id":99135,"mutability":"mutable","name":"c","nameLocation":"30089:1:164","nodeType":"VariableDeclaration","scope":99214,"src":"30081:9:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99134,"name":"uint256","nodeType":"ElementaryTypeName","src":"30081:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99140,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99139,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99136,"name":"MAX_GAME_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97723,"src":"30093:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"expression":{"id":99137,"name":"FixedPointMathLib","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62288,"src":"30110:17:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_FixedPointMathLib_$62288_$","typeString":"type(library FixedPointMathLib)"}},"id":99138,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"WAD","nodeType":"MemberAccess","referencedDeclaration":61009,"src":"30110:21:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"30093:38:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"30081:50:164"},{"assignments":[99142],"declarations":[{"constant":false,"id":99142,"mutability":"mutable","name":"lnA","nameLocation":"30236:3:164","nodeType":"VariableDeclaration","scope":99214,"src":"30228:11:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99141,"name":"uint256","nodeType":"ElementaryTypeName","src":"30228:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99156,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99152,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99149,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99124,"src":"30281:1:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"expression":{"id":99150,"name":"FixedPointMathLib","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62288,"src":"30285:17:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_FixedPointMathLib_$62288_$","typeString":"type(library FixedPointMathLib)"}},"id":99151,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"WAD","nodeType":"MemberAccess","referencedDeclaration":61009,"src":"30285:21:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"30281:25:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":99148,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"30274:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"},"typeName":{"id":99147,"name":"int256","nodeType":"ElementaryTypeName","src":"30274:6:164","typeDescriptions":{}}},"id":99153,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"30274:33:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"expression":{"id":99145,"name":"FixedPointMathLib","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62288,"src":"30250:17:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_FixedPointMathLib_$62288_$","typeString":"type(library FixedPointMathLib)"}},"id":99146,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"lnWad","nodeType":"MemberAccess","referencedDeclaration":61377,"src":"30250:23:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_int256_$returns$_t_int256_$","typeString":"function (int256) pure returns (int256)"}},"id":99154,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"30250:58:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":99144,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"30242:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":99143,"name":"uint256","nodeType":"ElementaryTypeName","src":"30242:7:164","typeDescriptions":{}}},"id":99155,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"30242:67:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"30228:81:164"},{"assignments":[99158],"declarations":[{"constant":false,"id":99158,"mutability":"mutable","name":"bOverC","nameLocation":"30394:6:164","nodeType":"VariableDeclaration","scope":99214,"src":"30386:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99157,"name":"uint256","nodeType":"ElementaryTypeName","src":"30386:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99164,"initialValue":{"arguments":[{"id":99161,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99130,"src":"30428:1:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":99162,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99135,"src":"30431:1:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":99159,"name":"FixedPointMathLib","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62288,"src":"30403:17:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_FixedPointMathLib_$62288_$","typeString":"type(library FixedPointMathLib)"}},"id":99160,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"divWad","nodeType":"MemberAccess","referencedDeclaration":61093,"src":"30403:24:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":99163,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"30403:30:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"30386:47:164"},{"assignments":[99166],"declarations":[{"constant":false,"id":99166,"mutability":"mutable","name":"numerator","nameLocation":"30575:9:164","nodeType":"VariableDeclaration","scope":99214,"src":"30567:17:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99165,"name":"uint256","nodeType":"ElementaryTypeName","src":"30567:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99172,"initialValue":{"arguments":[{"id":99169,"name":"lnA","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99142,"src":"30612:3:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":99170,"name":"bOverC","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99158,"src":"30617:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":99167,"name":"FixedPointMathLib","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62288,"src":"30587:17:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_FixedPointMathLib_$62288_$","typeString":"type(library FixedPointMathLib)"}},"id":99168,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"mulWad","nodeType":"MemberAccess","referencedDeclaration":61021,"src":"30587:24:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":99171,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"30587:37:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"30567:57:164"},{"assignments":[99174],"declarations":[{"constant":false,"id":99174,"mutability":"mutable","name":"base","nameLocation":"30641:4:164","nodeType":"VariableDeclaration","scope":99214,"src":"30634:11:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":99173,"name":"int256","nodeType":"ElementaryTypeName","src":"30634:6:164","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"id":99182,"initialValue":{"arguments":[{"arguments":[{"id":99179,"name":"numerator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99166,"src":"30680:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":99178,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"30673:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"},"typeName":{"id":99177,"name":"int256","nodeType":"ElementaryTypeName","src":"30673:6:164","typeDescriptions":{}}},"id":99180,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"30673:17:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"expression":{"id":99175,"name":"FixedPointMathLib","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62288,"src":"30648:17:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_FixedPointMathLib_$62288_$","typeString":"type(library FixedPointMathLib)"}},"id":99176,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"expWad","nodeType":"MemberAccess","referencedDeclaration":61367,"src":"30648:24:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_int256_$returns$_t_int256_$","typeString":"function (int256) pure returns (int256)"}},"id":99181,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"30648:43:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"VariableDeclarationStatement","src":"30634:57:164"},{"assignments":[99184],"declarations":[{"constant":false,"id":99184,"mutability":"mutable","name":"rawGas","nameLocation":"30753:6:164","nodeType":"VariableDeclaration","scope":99214,"src":"30746:13:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":99183,"name":"int256","nodeType":"ElementaryTypeName","src":"30746:6:164","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"id":99196,"initialValue":{"arguments":[{"id":99187,"name":"base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99174,"src":"30787:4:164","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99193,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99190,"name":"depth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99096,"src":"30800:5:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"expression":{"id":99191,"name":"FixedPointMathLib","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62288,"src":"30808:17:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_FixedPointMathLib_$62288_$","typeString":"type(library FixedPointMathLib)"}},"id":99192,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"WAD","nodeType":"MemberAccess","referencedDeclaration":61009,"src":"30808:21:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"30800:29:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":99189,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"30793:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"},"typeName":{"id":99188,"name":"int256","nodeType":"ElementaryTypeName","src":"30793:6:164","typeDescriptions":{}}},"id":99194,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"30793:37:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"},{"typeIdentifier":"t_int256","typeString":"int256"}],"expression":{"id":99185,"name":"FixedPointMathLib","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62288,"src":"30762:17:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_FixedPointMathLib_$62288_$","typeString":"type(library FixedPointMathLib)"}},"id":99186,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"powWad","nodeType":"MemberAccess","referencedDeclaration":61178,"src":"30762:24:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$","typeString":"function (int256,int256) pure returns (int256)"}},"id":99195,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"30762:69:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"VariableDeclarationStatement","src":"30746:85:164"},{"assignments":[99198],"declarations":[{"constant":false,"id":99198,"mutability":"mutable","name":"requiredGas","nameLocation":"30849:11:164","nodeType":"VariableDeclaration","scope":99214,"src":"30841:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99197,"name":"uint256","nodeType":"ElementaryTypeName","src":"30841:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99207,"initialValue":{"arguments":[{"id":99201,"name":"baseGasCharged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99116,"src":"30888:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":99204,"name":"rawGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99184,"src":"30912:6:164","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":99203,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"30904:7:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":99202,"name":"uint256","nodeType":"ElementaryTypeName","src":"30904:7:164","typeDescriptions":{}}},"id":99205,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"30904:15:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":99199,"name":"FixedPointMathLib","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":62288,"src":"30863:17:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_FixedPointMathLib_$62288_$","typeString":"type(library FixedPointMathLib)"}},"id":99200,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"mulWad","nodeType":"MemberAccess","referencedDeclaration":61021,"src":"30863:24:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256)"}},"id":99206,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"30863:57:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"30841:79:164"},{"expression":{"id":99212,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99208,"name":"requiredBond_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99093,"src":"30969:13:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99211,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99209,"name":"assumedBaseFee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99112,"src":"30985:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":99210,"name":"requiredGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99198,"src":"31002:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"30985:28:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"30969:44:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":99213,"nodeType":"ExpressionStatement","src":"30969:44:164"}]},"documentation":{"id":99087,"nodeType":"StructuredDocumentation","src":"28639:205:164","text":"@notice Returns the required bond for a given move kind.\n @param _position The position of the bonded interaction.\n @return requiredBond_ The required ETH bond for the given move, in wei."},"functionSelector":"c395e1ca","implemented":true,"kind":"function","modifiers":[],"name":"getRequiredBond","nameLocation":"28858:15:164","parameters":{"id":99091,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99090,"mutability":"mutable","name":"_position","nameLocation":"28883:9:164","nodeType":"VariableDeclaration","scope":99215,"src":"28874:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99089,"nodeType":"UserDefinedTypeName","pathNode":{"id":99088,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"28874:8:164"},"referencedDeclaration":103269,"src":"28874:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"src":"28873:20:164"},"returnParameters":{"id":99094,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99093,"mutability":"mutable","name":"requiredBond_","nameLocation":"28923:13:164","nodeType":"VariableDeclaration","scope":99215,"src":"28915:21:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99092,"name":"uint256","nodeType":"ElementaryTypeName","src":"28915:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"28914:23:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":99264,"nodeType":"FunctionDefinition","src":"31160:671:164","nodes":[],"body":{"id":99263,"nodeType":"Block","src":"31210:621:164","nodes":[],"statements":[{"assignments":[99222],"declarations":[{"constant":false,"id":99222,"mutability":"mutable","name":"recipientCredit","nameLocation":"31315:15:164","nodeType":"VariableDeclaration","scope":99263,"src":"31307:23:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99221,"name":"uint256","nodeType":"ElementaryTypeName","src":"31307:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99226,"initialValue":{"baseExpression":{"id":99223,"name":"credit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97790,"src":"31333:6:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":99225,"indexExpression":{"id":99224,"name":"_recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99218,"src":"31340:10:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"31333:18:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"31307:44:164"},{"expression":{"id":99231,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":99227,"name":"credit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97790,"src":"31361:6:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":99229,"indexExpression":{"id":99228,"name":"_recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99218,"src":"31368:10:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"31361:18:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":99230,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31382:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"31361:22:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":99232,"nodeType":"ExpressionStatement","src":"31361:22:164"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99235,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99233,"name":"recipientCredit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99222,"src":"31457:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":99234,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31476:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"31457:20:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":99240,"nodeType":"IfStatement","src":"31453:75:164","trueBody":{"id":99239,"nodeType":"Block","src":"31479:49:164","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":99236,"name":"NoCreditToClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103126,"src":"31500:15:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":99237,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"31500:17:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99238,"nodeType":"RevertStatement","src":"31493:24:164"}]}},{"expression":{"arguments":[{"id":99244,"name":"_recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99218,"src":"31619:10:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":99245,"name":"recipientCredit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99222,"src":"31631:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":99241,"name":"WETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97742,"src":"31605:4:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"id":99243,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"withdraw","nodeType":"MemberAccess","referencedDeclaration":100224,"src":"31605:13:164","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256) external"}},"id":99246,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"31605:42:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99247,"nodeType":"ExpressionStatement","src":"31605:42:164"},{"assignments":[99249,null],"declarations":[{"constant":false,"id":99249,"mutability":"mutable","name":"success","nameLocation":"31713:7:164","nodeType":"VariableDeclaration","scope":99263,"src":"31708:12:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":99248,"name":"bool","nodeType":"ElementaryTypeName","src":"31708:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":99256,"initialValue":{"arguments":[{"hexValue":"","id":99254,"isConstant":false,"isLValue":false,"isPure":true,"kind":"hexString","lValueRequested":false,"nodeType":"Literal","src":"31767:5:164","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":99250,"name":"_recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99218,"src":"31725:10:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":99251,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","src":"31725:15:164","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":99253,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":99252,"name":"recipientCredit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99222,"src":"31749:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"31725:41:164","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":99255,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"31725:48:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"31707:66:164"},{"condition":{"id":99258,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"31787:8:164","subExpression":{"id":99257,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99249,"src":"31788:7:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":99262,"nodeType":"IfStatement","src":"31783:41:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":99259,"name":"BondTransferFailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103129,"src":"31804:18:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":99260,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"31804:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99261,"nodeType":"RevertStatement","src":"31797:27:164"}}]},"documentation":{"id":99216,"nodeType":"StructuredDocumentation","src":"31026:129:164","text":"@notice Claim the credit belonging to the recipient address.\n @param _recipient The owner and recipient of the credit."},"functionSelector":"60e27464","implemented":true,"kind":"function","modifiers":[],"name":"claimCredit","nameLocation":"31169:11:164","parameters":{"id":99219,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99218,"mutability":"mutable","name":"_recipient","nameLocation":"31189:10:164","nodeType":"VariableDeclaration","scope":99264,"src":"31181:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":99217,"name":"address","nodeType":"ElementaryTypeName","src":"31181:7:164","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"31180:20:164"},"returnParameters":{"id":99220,"nodeType":"ParameterList","parameters":[],"src":"31210:0:164"},"scope":99927,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":99348,"nodeType":"FunctionDefinition","src":"32166:1011:164","nodes":[],"body":{"id":99347,"nodeType":"Block","src":"32259:918:164","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"},"id":99276,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99273,"name":"status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97777,"src":"32381:6:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":99274,"name":"GameStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103277,"src":"32391:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_GameStatus_$103277_$","typeString":"type(enum GameStatus)"}},"id":99275,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"IN_PROGRESS","nodeType":"MemberAccess","referencedDeclaration":103274,"src":"32391:22:164","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"src":"32381:32:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":99281,"nodeType":"IfStatement","src":"32377:89:164","trueBody":{"id":99280,"nodeType":"Block","src":"32415:51:164","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":99277,"name":"GameNotInProgress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103144,"src":"32436:17:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":99278,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"32436:19:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99279,"nodeType":"RevertStatement","src":"32429:26:164"}]}},{"assignments":[99284],"declarations":[{"constant":false,"id":99284,"mutability":"mutable","name":"subgameRootClaim","nameLocation":"32535:16:164","nodeType":"VariableDeclaration","scope":99347,"src":"32517:34:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":99283,"nodeType":"UserDefinedTypeName","pathNode":{"id":99282,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"32517:9:164"},"referencedDeclaration":100523,"src":"32517:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"id":99288,"initialValue":{"baseExpression":{"id":99285,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"32554:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":99287,"indexExpression":{"id":99286,"name":"_claimIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99267,"src":"32564:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"32554:22:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref"}},"nodeType":"VariableDeclarationStatement","src":"32517:59:164"},{"assignments":[99291],"declarations":[{"constant":false,"id":99291,"mutability":"mutable","name":"parentClock","nameLocation":"32664:11:164","nodeType":"VariableDeclaration","scope":99347,"src":"32658:17:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"},"typeName":{"id":99290,"nodeType":"UserDefinedTypeName","pathNode":{"id":99289,"name":"Clock","nodeType":"IdentifierPath","referencedDeclaration":103267,"src":"32658:5:164"},"referencedDeclaration":103267,"src":"32658:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}},"visibility":"internal"}],"id":99292,"nodeType":"VariableDeclarationStatement","src":"32658:17:164"},{"condition":{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":99300,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":99293,"name":"subgameRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99284,"src":"32689:16:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99294,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"parentIndex","nodeType":"MemberAccess","referencedDeclaration":100507,"src":"32689:28:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"arguments":[{"id":99297,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"32726:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint32_$","typeString":"type(uint32)"},"typeName":{"id":99296,"name":"uint32","nodeType":"ElementaryTypeName","src":"32726:6:164","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint32_$","typeString":"type(uint32)"}],"id":99295,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"32721:4:164","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":99298,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"32721:12:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint32","typeString":"type(uint32)"}},"id":99299,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"32721:16:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"32689:48:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":99310,"nodeType":"IfStatement","src":"32685:138:164","trueBody":{"id":99309,"nodeType":"Block","src":"32739:84:164","statements":[{"expression":{"id":99307,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99301,"name":"parentClock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99291,"src":"32753:11:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"baseExpression":{"id":99302,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"32767:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":99305,"indexExpression":{"expression":{"id":99303,"name":"subgameRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99284,"src":"32777:16:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99304,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"parentIndex","nodeType":"MemberAccess","referencedDeclaration":100507,"src":"32777:28:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"32767:39:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref"}},"id":99306,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"clock","nodeType":"MemberAccess","referencedDeclaration":100522,"src":"32767:45:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}},"src":"32753:59:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}},"id":99308,"nodeType":"ExpressionStatement","src":"32753:59:164"}]}},{"assignments":[99312],"declarations":[{"constant":false,"id":99312,"mutability":"mutable","name":"challengeDuration","nameLocation":"32917:17:164","nodeType":"VariableDeclaration","scope":99347,"src":"32910:24:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":99311,"name":"uint64","nodeType":"ElementaryTypeName","src":"32910:6:164","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"id":99332,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99330,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99315,"name":"parentClock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99291,"src":"32956:11:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}},"id":99316,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"duration","nodeType":"MemberAccess","referencedDeclaration":101049,"src":"32956:20:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Clock_$103267_$returns$_t_userDefinedValueType$_Duration_$103263_$bound_to$_t_userDefinedValueType$_Clock_$103267_$","typeString":"function (Clock) pure returns (Duration)"}},"id":99317,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"32956:22:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":99318,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"32956:26:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":99319,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"32956:28:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99328,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":99320,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"32988:5:164","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":99321,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"32988:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":99322,"name":"subgameRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99284,"src":"33006:16:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99323,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"clock","nodeType":"MemberAccess","referencedDeclaration":100522,"src":"33006:22:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Clock_$103267","typeString":"Clock"}},"id":99324,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":101061,"src":"33006:32:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Clock_$103267_$returns$_t_userDefinedValueType$_Timestamp_$103261_$bound_to$_t_userDefinedValueType$_Clock_$103267_$","typeString":"function (Clock) pure returns (Timestamp)"}},"id":99325,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"33006:34:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"id":99326,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101124,"src":"33006:38:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Timestamp_$103261_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"function (Timestamp) pure returns (uint64)"}},"id":99327,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"33006:40:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"32988:58:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":99329,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"32987:60:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"32956:91:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":99314,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"32949:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":99313,"name":"uint64","nodeType":"ElementaryTypeName","src":"32949:6:164","typeDescriptions":{}}},"id":99331,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"32949:99:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"VariableDeclarationStatement","src":"32910:138:164"},{"expression":{"id":99345,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99333,"name":"duration_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99271,"src":"33058:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"condition":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":99338,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99334,"name":"challengeDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99312,"src":"33070:17:164","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99335,"name":"MAX_CLOCK_DURATION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97730,"src":"33090:18:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":99336,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101098,"src":"33090:22:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Duration_$103263_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (Duration) pure returns (uint64)"}},"id":99337,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"33090:24:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"33070:44:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[{"id":99342,"name":"challengeDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99312,"src":"33152:17:164","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":99340,"name":"Duration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103263,"src":"33138:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Duration_$103263_$","typeString":"type(Duration)"}},"id":99341,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"33138:13:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint64_$returns$_t_userDefinedValueType$_Duration_$103263_$","typeString":"function (uint64) pure returns (Duration)"}},"id":99343,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"33138:32:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":99344,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"33070:100:164","trueExpression":{"id":99339,"name":"MAX_CLOCK_DURATION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97730,"src":"33117:18:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"src":"33058:112:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":99346,"nodeType":"ExpressionStatement","src":"33058:112:164"}]},"documentation":{"id":99265,"nodeType":"StructuredDocumentation","src":"31837:324:164","text":"@notice Returns the amount of time elapsed on the potential challenger to `_claimIndex`'s chess clock. Maxes\n out at `MAX_CLOCK_DURATION`.\n @param _claimIndex The index of the subgame root claim.\n @return duration_ The time elapsed on the potential challenger to `_claimIndex`'s chess clock."},"functionSelector":"bd8da956","implemented":true,"kind":"function","modifiers":[],"name":"getChallengerDuration","nameLocation":"32175:21:164","parameters":{"id":99268,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99267,"mutability":"mutable","name":"_claimIndex","nameLocation":"32205:11:164","nodeType":"VariableDeclaration","scope":99348,"src":"32197:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99266,"name":"uint256","nodeType":"ElementaryTypeName","src":"32197:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"32196:21:164"},"returnParameters":{"id":99272,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99271,"mutability":"mutable","name":"duration_","nameLocation":"32248:9:164","nodeType":"VariableDeclaration","scope":99348,"src":"32239:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"},"typeName":{"id":99270,"nodeType":"UserDefinedTypeName","pathNode":{"id":99269,"name":"Duration","nodeType":"IdentifierPath","referencedDeclaration":103263,"src":"32239:8:164"},"referencedDeclaration":103263,"src":"32239:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"visibility":"internal"}],"src":"32238:20:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":99360,"nodeType":"FunctionDefinition","src":"33244:101:164","nodes":[],"body":{"id":99359,"nodeType":"Block","src":"33305:40:164","nodes":[],"statements":[{"expression":{"id":99357,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99354,"name":"len_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99352,"src":"33315:4:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":99355,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"33322:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":99356,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"33322:16:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"33315:23:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":99358,"nodeType":"ExpressionStatement","src":"33315:23:164"}]},"documentation":{"id":99349,"nodeType":"StructuredDocumentation","src":"33183:56:164","text":"@notice Returns the length of the `claimData` array."},"functionSelector":"8980e0cc","implemented":true,"kind":"function","modifiers":[],"name":"claimDataLen","nameLocation":"33253:12:164","parameters":{"id":99350,"nodeType":"ParameterList","parameters":[],"src":"33265:2:164"},"returnParameters":{"id":99353,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99352,"mutability":"mutable","name":"len_","nameLocation":"33299:4:164","nodeType":"VariableDeclaration","scope":99360,"src":"33291:12:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99351,"name":"uint256","nodeType":"ElementaryTypeName","src":"33291:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"33290:14:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":99372,"nodeType":"FunctionDefinition","src":"33631:130:164","nodes":[],"body":{"id":99371,"nodeType":"Block","src":"33707:54:164","nodes":[],"statements":[{"expression":{"id":99369,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99367,"name":"absolutePrestate_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99365,"src":"33717:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":99368,"name":"ABSOLUTE_PRESTATE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97720,"src":"33737:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"src":"33717:37:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":99370,"nodeType":"ExpressionStatement","src":"33717:37:164"}]},"documentation":{"id":99361,"nodeType":"StructuredDocumentation","src":"33559:67:164","text":"@notice Returns the absolute prestate of the instruction trace."},"functionSelector":"8d450a95","implemented":true,"kind":"function","modifiers":[],"name":"absolutePrestate","nameLocation":"33640:16:164","parameters":{"id":99362,"nodeType":"ParameterList","parameters":[],"src":"33656:2:164"},"returnParameters":{"id":99366,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99365,"mutability":"mutable","name":"absolutePrestate_","nameLocation":"33688:17:164","nodeType":"VariableDeclaration","scope":99372,"src":"33682:23:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":99364,"nodeType":"UserDefinedTypeName","pathNode":{"id":99363,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"33682:5:164"},"referencedDeclaration":103255,"src":"33682:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"}],"src":"33681:25:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":99383,"nodeType":"FunctionDefinition","src":"33811:117:164","nodes":[],"body":{"id":99382,"nodeType":"Block","src":"33881:47:164","nodes":[],"statements":[{"expression":{"id":99380,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99378,"name":"maxGameDepth_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99376,"src":"33891:13:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":99379,"name":"MAX_GAME_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97723,"src":"33907:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"33891:30:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":99381,"nodeType":"ExpressionStatement","src":"33891:30:164"}]},"documentation":{"id":99373,"nodeType":"StructuredDocumentation","src":"33767:39:164","text":"@notice Returns the max game depth."},"functionSelector":"fa315aa9","implemented":true,"kind":"function","modifiers":[],"name":"maxGameDepth","nameLocation":"33820:12:164","parameters":{"id":99374,"nodeType":"ParameterList","parameters":[],"src":"33832:2:164"},"returnParameters":{"id":99377,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99376,"mutability":"mutable","name":"maxGameDepth_","nameLocation":"33866:13:164","nodeType":"VariableDeclaration","scope":99383,"src":"33858:21:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99375,"name":"uint256","nodeType":"ElementaryTypeName","src":"33858:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"33857:23:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":99394,"nodeType":"FunctionDefinition","src":"33975:108:164","nodes":[],"body":{"id":99393,"nodeType":"Block","src":"34041:42:164","nodes":[],"statements":[{"expression":{"id":99391,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99389,"name":"splitDepth_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99387,"src":"34051:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":99390,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"34065:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"34051:25:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":99392,"nodeType":"ExpressionStatement","src":"34051:25:164"}]},"documentation":{"id":99384,"nodeType":"StructuredDocumentation","src":"33934:36:164","text":"@notice Returns the split depth."},"functionSelector":"ec5e6308","implemented":true,"kind":"function","modifiers":[],"name":"splitDepth","nameLocation":"33984:10:164","parameters":{"id":99385,"nodeType":"ParameterList","parameters":[],"src":"33994:2:164"},"returnParameters":{"id":99388,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99387,"mutability":"mutable","name":"splitDepth_","nameLocation":"34028:11:164","nodeType":"VariableDeclaration","scope":99394,"src":"34020:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99386,"name":"uint256","nodeType":"ElementaryTypeName","src":"34020:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"34019:21:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":99406,"nodeType":"FunctionDefinition","src":"34137:134:164","nodes":[],"body":{"id":99405,"nodeType":"Block","src":"34216:55:164","nodes":[],"statements":[{"expression":{"id":99403,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99401,"name":"maxClockDuration_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99399,"src":"34226:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":99402,"name":"MAX_CLOCK_DURATION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97730,"src":"34246:18:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"src":"34226:38:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":99404,"nodeType":"ExpressionStatement","src":"34226:38:164"}]},"documentation":{"id":99395,"nodeType":"StructuredDocumentation","src":"34089:43:164","text":"@notice Returns the max clock duration."},"functionSelector":"dabd396d","implemented":true,"kind":"function","modifiers":[],"name":"maxClockDuration","nameLocation":"34146:16:164","parameters":{"id":99396,"nodeType":"ParameterList","parameters":[],"src":"34162:2:164"},"returnParameters":{"id":99400,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99399,"mutability":"mutable","name":"maxClockDuration_","nameLocation":"34197:17:164","nodeType":"VariableDeclaration","scope":99406,"src":"34188:26:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"},"typeName":{"id":99398,"nodeType":"UserDefinedTypeName","pathNode":{"id":99397,"name":"Duration","nodeType":"IdentifierPath","referencedDeclaration":103263,"src":"34188:8:164"},"referencedDeclaration":103263,"src":"34188:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"visibility":"internal"}],"src":"34187:28:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":99418,"nodeType":"FunctionDefinition","src":"34331:125:164","nodes":[],"body":{"id":99417,"nodeType":"Block","src":"34406:50:164","nodes":[],"statements":[{"expression":{"id":99415,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99413,"name":"clockExtension_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99411,"src":"34416:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":99414,"name":"CLOCK_EXTENSION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97753,"src":"34434:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"src":"34416:33:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"id":99416,"nodeType":"ExpressionStatement","src":"34416:33:164"}]},"documentation":{"id":99407,"nodeType":"StructuredDocumentation","src":"34277:49:164","text":"@notice Returns the clock extension constant."},"functionSelector":"6b6716c0","implemented":true,"kind":"function","modifiers":[],"name":"clockExtension","nameLocation":"34340:14:164","parameters":{"id":99408,"nodeType":"ParameterList","parameters":[],"src":"34354:2:164"},"returnParameters":{"id":99412,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99411,"mutability":"mutable","name":"clockExtension_","nameLocation":"34389:15:164","nodeType":"VariableDeclaration","scope":99418,"src":"34380:24:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"},"typeName":{"id":99410,"nodeType":"UserDefinedTypeName","pathNode":{"id":99409,"name":"Duration","nodeType":"IdentifierPath","referencedDeclaration":103263,"src":"34380:8:164"},"referencedDeclaration":103263,"src":"34380:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Duration_$103263","typeString":"Duration"}},"visibility":"internal"}],"src":"34379:26:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":99430,"nodeType":"FunctionDefinition","src":"34509:79:164","nodes":[],"body":{"id":99429,"nodeType":"Block","src":"34563:25:164","nodes":[],"statements":[{"expression":{"id":99427,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99425,"name":"vm_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99423,"src":"34573:3:164","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":99426,"name":"VM","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97734,"src":"34579:2:164","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"}},"src":"34573:8:164","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"}},"id":99428,"nodeType":"ExpressionStatement","src":"34573:8:164"}]},"documentation":{"id":99419,"nodeType":"StructuredDocumentation","src":"34462:42:164","text":"@notice Returns the address of the VM."},"functionSelector":"3a768463","implemented":true,"kind":"function","modifiers":[],"name":"vm","nameLocation":"34518:2:164","parameters":{"id":99420,"nodeType":"ParameterList","parameters":[],"src":"34520:2:164"},"returnParameters":{"id":99424,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99423,"mutability":"mutable","name":"vm_","nameLocation":"34558:3:164","nodeType":"VariableDeclaration","scope":99430,"src":"34546:15:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"},"typeName":{"id":99422,"nodeType":"UserDefinedTypeName","pathNode":{"id":99421,"name":"IBigStepper","nodeType":"IdentifierPath","referencedDeclaration":100171,"src":"34546:11:164"},"referencedDeclaration":100171,"src":"34546:11:164","typeDescriptions":{"typeIdentifier":"t_contract$_IBigStepper_$100171","typeString":"contract IBigStepper"}},"visibility":"internal"}],"src":"34545:17:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":99442,"nodeType":"FunctionDefinition","src":"34653:88:164","nodes":[],"body":{"id":99441,"nodeType":"Block","src":"34712:29:164","nodes":[],"statements":[{"expression":{"id":99439,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99437,"name":"weth_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99435,"src":"34722:5:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":99438,"name":"WETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97742,"src":"34730:4:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"src":"34722:12:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"id":99440,"nodeType":"ExpressionStatement","src":"34722:12:164"}]},"documentation":{"id":99431,"nodeType":"StructuredDocumentation","src":"34594:54:164","text":"@notice Returns the WETH contract for holding ETH."},"functionSelector":"3fc8cef3","implemented":true,"kind":"function","modifiers":[],"name":"weth","nameLocation":"34662:4:164","parameters":{"id":99432,"nodeType":"ParameterList","parameters":[],"src":"34666:2:164"},"returnParameters":{"id":99436,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99435,"mutability":"mutable","name":"weth_","nameLocation":"34705:5:164","nodeType":"VariableDeclaration","scope":99442,"src":"34692:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"},"typeName":{"id":99434,"nodeType":"UserDefinedTypeName","pathNode":{"id":99433,"name":"IDelayedWETH","nodeType":"IdentifierPath","referencedDeclaration":100239,"src":"34692:12:164"},"referencedDeclaration":100239,"src":"34692:12:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"visibility":"internal"}],"src":"34691:20:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":99454,"nodeType":"FunctionDefinition","src":"34807:136:164","nodes":[],"body":{"id":99453,"nodeType":"Block","src":"34893:50:164","nodes":[],"statements":[{"expression":{"id":99451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99449,"name":"registry_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99447,"src":"34903:9:164","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":99450,"name":"ANCHOR_STATE_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97746,"src":"34915:21:164","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"}},"src":"34903:33:164","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"}},"id":99452,"nodeType":"ExpressionStatement","src":"34903:33:164"}]},"documentation":{"id":99443,"nodeType":"StructuredDocumentation","src":"34747:55:164","text":"@notice Returns the anchor state registry contract."},"functionSelector":"5c0cba33","implemented":true,"kind":"function","modifiers":[],"name":"anchorStateRegistry","nameLocation":"34816:19:164","parameters":{"id":99444,"nodeType":"ParameterList","parameters":[],"src":"34835:2:164"},"returnParameters":{"id":99448,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99447,"mutability":"mutable","name":"registry_","nameLocation":"34882:9:164","nodeType":"VariableDeclaration","scope":99454,"src":"34861:30:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"},"typeName":{"id":99446,"nodeType":"UserDefinedTypeName","pathNode":{"id":99445,"name":"IAnchorStateRegistry","nodeType":"IdentifierPath","referencedDeclaration":100146,"src":"34861:20:164"},"referencedDeclaration":100146,"src":"34861:20:164","typeDescriptions":{"typeIdentifier":"t_contract$_IAnchorStateRegistry_$100146","typeString":"contract IAnchorStateRegistry"}},"visibility":"internal"}],"src":"34860:32:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":99465,"nodeType":"FunctionDefinition","src":"35032:105:164","nodes":[],"body":{"id":99464,"nodeType":"Block","src":"35096:41:164","nodes":[],"statements":[{"expression":{"id":99462,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99460,"name":"l2ChainId_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99458,"src":"35106:10:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":99461,"name":"L2_CHAIN_ID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97749,"src":"35119:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"35106:24:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":99463,"nodeType":"ExpressionStatement","src":"35106:24:164"}]},"documentation":{"id":99455,"nodeType":"StructuredDocumentation","src":"34949:78:164","text":"@notice Returns the chain ID of the L2 network this contract argues about."},"functionSelector":"d6ae3cd5","implemented":true,"kind":"function","modifiers":[],"name":"l2ChainId","nameLocation":"35041:9:164","parameters":{"id":99456,"nodeType":"ParameterList","parameters":[],"src":"35050:2:164"},"returnParameters":{"id":99459,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99458,"mutability":"mutable","name":"l2ChainId_","nameLocation":"35084:10:164","nodeType":"VariableDeclaration","scope":99465,"src":"35076:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99457,"name":"uint256","nodeType":"ElementaryTypeName","src":"35076:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"35075:20:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":99493,"nodeType":"FunctionDefinition","src":"35528:361:164","nodes":[],"body":{"id":99492,"nodeType":"Block","src":"35609:280:164","nodes":[],"statements":[{"assignments":[99475],"declarations":[{"constant":false,"id":99475,"mutability":"mutable","name":"bond","nameLocation":"35714:4:164","nodeType":"VariableDeclaration","scope":99492,"src":"35706:12:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99474,"name":"uint256","nodeType":"ElementaryTypeName","src":"35706:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99478,"initialValue":{"expression":{"id":99476,"name":"_bonded","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99471,"src":"35721:7:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99477,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"bond","nodeType":"MemberAccess","referencedDeclaration":100513,"src":"35721:12:164","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"VariableDeclarationStatement","src":"35706:27:164"},{"expression":{"id":99483,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":99479,"name":"credit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97790,"src":"35788:6:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":99481,"indexExpression":{"id":99480,"name":"_recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99468,"src":"35795:10:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"35788:18:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":99482,"name":"bond","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99475,"src":"35810:4:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"35788:26:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":99484,"nodeType":"ExpressionStatement","src":"35788:26:164"},{"expression":{"arguments":[{"id":99488,"name":"_recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99468,"src":"35865:10:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":99489,"name":"bond","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99475,"src":"35877:4:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":99485,"name":"WETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97742,"src":"35853:4:164","typeDescriptions":{"typeIdentifier":"t_contract$_IDelayedWETH_$100239","typeString":"contract IDelayedWETH"}},"id":99487,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"unlock","nodeType":"MemberAccess","referencedDeclaration":100216,"src":"35853:11:164","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256) external"}},"id":99490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"35853:29:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99491,"nodeType":"ExpressionStatement","src":"35853:29:164"}]},"documentation":{"id":99466,"nodeType":"StructuredDocumentation","src":"35351:172:164","text":"@notice Pays out the bond of a claim to a given recipient.\n @param _recipient The recipient of the bond.\n @param _bonded The claim to pay out the bond of."},"implemented":true,"kind":"function","modifiers":[],"name":"_distributeBond","nameLocation":"35537:15:164","parameters":{"id":99472,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99468,"mutability":"mutable","name":"_recipient","nameLocation":"35561:10:164","nodeType":"VariableDeclaration","scope":99493,"src":"35553:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":99467,"name":"address","nodeType":"ElementaryTypeName","src":"35553:7:164","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":99471,"mutability":"mutable","name":"_bonded","nameLocation":"35591:7:164","nodeType":"VariableDeclaration","scope":99493,"src":"35573:25:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":99470,"nodeType":"UserDefinedTypeName","pathNode":{"id":99469,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"35573:9:164"},"referencedDeclaration":100523,"src":"35573:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"src":"35552:47:164"},"returnParameters":{"id":99473,"nodeType":"ParameterList","parameters":[],"src":"35609:0:164"},"scope":99927,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":99587,"nodeType":"FunctionDefinition","src":"36108:1977:164","nodes":[],"body":{"id":99586,"nodeType":"Block","src":"36289:1796:164","nodes":[],"statements":[{"assignments":[99509],"declarations":[{"constant":false,"id":99509,"mutability":"mutable","name":"disputedLeafPos","nameLocation":"36869:15:164","nodeType":"VariableDeclaration","scope":99586,"src":"36860:24:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99508,"nodeType":"UserDefinedTypeName","pathNode":{"id":99507,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"36860:8:164"},"referencedDeclaration":103269,"src":"36860:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"id":99518,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":99516,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99512,"name":"_parentPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99502,"src":"36901:10:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99513,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"36901:14:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":99514,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"36901:16:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":99515,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"36920:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"36901:20:164","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint128","typeString":"uint128"}],"expression":{"id":99510,"name":"Position","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103269,"src":"36887:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Position_$103269_$","typeString":"type(Position)"}},"id":99511,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"36887:13:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint128_$returns$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (uint128) pure returns (Position)"}},"id":99517,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"36887:35:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"nodeType":"VariableDeclarationStatement","src":"36860:62:164"},{"assignments":[99521],"declarations":[{"constant":false,"id":99521,"mutability":"mutable","name":"disputed","nameLocation":"36950:8:164","nodeType":"VariableDeclaration","scope":99586,"src":"36932:26:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":99520,"nodeType":"UserDefinedTypeName","pathNode":{"id":99519,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"36932:9:164"},"referencedDeclaration":100523,"src":"36932:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"id":99527,"initialValue":{"arguments":[{"id":99523,"name":"disputedLeafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99509,"src":"36988:15:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"id":99524,"name":"_parentIdx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99499,"src":"37013:10:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"74727565","id":99525,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"37034:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":99522,"name":"_findTraceAncestor","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99638,"src":"36961:18:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_userDefinedValueType$_Position_$103269_$_t_uint256_$_t_bool_$returns$_t_struct$_ClaimData_$100523_storage_ptr_$","typeString":"function (Position,uint256,bool) view returns (struct IFaultDisputeGame.ClaimData storage pointer)"}},"id":99526,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_pos","_start","_global"],"nodeType":"FunctionCall","src":"36961:80:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"nodeType":"VariableDeclarationStatement","src":"36932:109:164"},{"assignments":[99529],"declarations":[{"constant":false,"id":99529,"mutability":"mutable","name":"vmStatus","nameLocation":"37057:8:164","nodeType":"VariableDeclaration","scope":99586,"src":"37051:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":99528,"name":"uint8","nodeType":"ElementaryTypeName","src":"37051:5:164","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"id":99538,"initialValue":{"arguments":[{"baseExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99532,"name":"_rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99497,"src":"37074:10:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":99533,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101085,"src":"37074:14:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Claim_$103255_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function (Claim) pure returns (bytes32)"}},"id":99534,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"37074:16:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":99536,"indexExpression":{"hexValue":"30","id":99535,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"37091:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"37074:19:164","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes1","typeString":"bytes1"}],"id":99531,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"37068:5:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":99530,"name":"uint8","nodeType":"ElementaryTypeName","src":"37068:5:164","typeDescriptions":{}}},"id":99537,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"37068:26:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"VariableDeclarationStatement","src":"37051:43:164"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":99550,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99539,"name":"_isAttack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99504,"src":"37109:9:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99549,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":99545,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":99540,"name":"disputed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99521,"src":"37122:8:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99541,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"37122:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99542,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depth","nodeType":"MemberAccess","referencedDeclaration":100833,"src":"37122:23:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint8_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint8)"}},"id":99543,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"37122:25:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"hexValue":"32","id":99544,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"37150:1:164","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"37122:29:164","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99548,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99546,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"37155:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"hexValue":"32","id":99547,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"37169:1:164","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"37155:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"37122:48:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"37109:61:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":99578,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99573,"name":"vmStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99529,"src":"37816:8:164","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":99574,"name":"VMStatuses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103351,"src":"37828:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_VMStatuses_$103351_$","typeString":"type(library VMStatuses)"}},"id":99575,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"VALID","nodeType":"MemberAccess","referencedDeclaration":103326,"src":"37828:16:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_VMStatus_$103273","typeString":"VMStatus"}},"id":99576,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101137,"src":"37828:20:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_VMStatus_$103273_$returns$_t_uint8_$bound_to$_t_userDefinedValueType$_VMStatus_$103273_$","typeString":"function (VMStatus) pure returns (uint8)"}},"id":99577,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"37828:22:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"37816:34:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":99584,"nodeType":"IfStatement","src":"37812:267:164","trueBody":{"id":99583,"nodeType":"Block","src":"37852:227:164","statements":[{"errorCall":{"arguments":[{"id":99580,"name":"_rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99497,"src":"38057:10:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}],"id":99579,"name":"UnexpectedRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103117,"src":"38037:19:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_userDefinedValueType$_Claim_$103255_$returns$__$","typeString":"function (Claim) pure"}},"id":99581,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"38037:31:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99582,"nodeType":"RevertStatement","src":"38030:38:164"}]}},"id":99585,"nodeType":"IfStatement","src":"37105:974:164","trueBody":{"id":99572,"nodeType":"Block","src":"37172:634:164","statements":[{"condition":{"id":99565,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"37646:77:164","subExpression":{"components":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":99563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":99556,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99551,"name":"vmStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99529,"src":"37648:8:164","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":99552,"name":"VMStatuses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103351,"src":"37660:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_VMStatuses_$103351_$","typeString":"type(library VMStatuses)"}},"id":99553,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"INVALID","nodeType":"MemberAccess","referencedDeclaration":103334,"src":"37660:18:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_VMStatus_$103273","typeString":"VMStatus"}},"id":99554,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101137,"src":"37660:22:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_VMStatus_$103273_$returns$_t_uint8_$bound_to$_t_userDefinedValueType$_VMStatus_$103273_$","typeString":"function (VMStatus) pure returns (uint8)"}},"id":99555,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"37660:24:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"37648:36:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":99562,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99557,"name":"vmStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99529,"src":"37688:8:164","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":99558,"name":"VMStatuses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103351,"src":"37700:10:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_VMStatuses_$103351_$","typeString":"type(library VMStatuses)"}},"id":99559,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"PANIC","nodeType":"MemberAccess","referencedDeclaration":103342,"src":"37700:16:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_VMStatus_$103273","typeString":"VMStatus"}},"id":99560,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101137,"src":"37700:20:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_VMStatus_$103273_$returns$_t_uint8_$bound_to$_t_userDefinedValueType$_VMStatus_$103273_$","typeString":"function (VMStatus) pure returns (uint8)"}},"id":99561,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"37700:22:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"37688:34:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"37648:74:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":99564,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"37647:76:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":99571,"nodeType":"IfStatement","src":"37642:154:164","trueBody":{"id":99570,"nodeType":"Block","src":"37725:71:164","statements":[{"errorCall":{"arguments":[{"id":99567,"name":"_rootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99497,"src":"37770:10:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}],"id":99566,"name":"UnexpectedRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103117,"src":"37750:19:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_userDefinedValueType$_Claim_$103255_$returns$__$","typeString":"function (Claim) pure"}},"id":99568,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"37750:31:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99569,"nodeType":"RevertStatement","src":"37743:38:164"}]}}]}}]},"documentation":{"id":99494,"nodeType":"StructuredDocumentation","src":"35895:208:164","text":"@notice Verifies the integrity of an execution bisection subgame's root claim. Reverts if the claim\n is invalid.\n @param _rootClaim The root claim of the execution bisection subgame."},"implemented":true,"kind":"function","modifiers":[],"name":"_verifyExecBisectionRoot","nameLocation":"36117:24:164","parameters":{"id":99505,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99497,"mutability":"mutable","name":"_rootClaim","nameLocation":"36157:10:164","nodeType":"VariableDeclaration","scope":99587,"src":"36151:16:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":99496,"nodeType":"UserDefinedTypeName","pathNode":{"id":99495,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"36151:5:164"},"referencedDeclaration":103255,"src":"36151:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":99499,"mutability":"mutable","name":"_parentIdx","nameLocation":"36185:10:164","nodeType":"VariableDeclaration","scope":99587,"src":"36177:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99498,"name":"uint256","nodeType":"ElementaryTypeName","src":"36177:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":99502,"mutability":"mutable","name":"_parentPos","nameLocation":"36214:10:164","nodeType":"VariableDeclaration","scope":99587,"src":"36205:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99501,"nodeType":"UserDefinedTypeName","pathNode":{"id":99500,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"36205:8:164"},"referencedDeclaration":103269,"src":"36205:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"},{"constant":false,"id":99504,"mutability":"mutable","name":"_isAttack","nameLocation":"36239:9:164","nodeType":"VariableDeclaration","scope":99587,"src":"36234:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":99503,"name":"bool","nodeType":"ElementaryTypeName","src":"36234:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"36141:113:164"},"returnParameters":{"id":99506,"nodeType":"ParameterList","parameters":[],"src":"36289:0:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":99638,"nodeType":"FunctionDefinition","src":"38605:677:164","nodes":[],"body":{"id":99637,"nodeType":"Block","src":"38788:494:164","nodes":[],"statements":[{"assignments":[99603],"declarations":[{"constant":false,"id":99603,"mutability":"mutable","name":"traceAncestorPos","nameLocation":"38863:16:164","nodeType":"VariableDeclaration","scope":99637,"src":"38854:25:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99602,"nodeType":"UserDefinedTypeName","pathNode":{"id":99601,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"38854:8:164"},"referencedDeclaration":103269,"src":"38854:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"id":99613,"initialValue":{"condition":{"id":99604,"name":"_global","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99595,"src":"38882:7:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[{"id":99610,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"38941:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":99608,"name":"_pos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99591,"src":"38915:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99609,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"traceAncestorBounded","nodeType":"MemberAccess","referencedDeclaration":100992,"src":"38915:25:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$_t_uint256_$returns$_t_userDefinedValueType$_Position_$103269_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position,uint256) pure returns (Position)"}},"id":99611,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"38915:38:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99612,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"38882:71:164","trueExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99605,"name":"_pos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99591,"src":"38892:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99606,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"traceAncestor","nodeType":"MemberAccess","referencedDeclaration":100948,"src":"38892:18:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_userDefinedValueType$_Position_$103269_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (Position)"}},"id":99607,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"38892:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"nodeType":"VariableDeclarationStatement","src":"38854:99:164"},{"expression":{"id":99618,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99614,"name":"ancestor_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99599,"src":"39109:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":99615,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"39121:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":99617,"indexExpression":{"id":99616,"name":"_start","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99593,"src":"39131:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"39121:17:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref"}},"src":"39109:29:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99619,"nodeType":"ExpressionStatement","src":"39109:29:164"},{"body":{"id":99635,"nodeType":"Block","src":"39207:69:164","statements":[{"expression":{"id":99633,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99628,"name":"ancestor_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99599,"src":"39221:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":99629,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"39233:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":99632,"indexExpression":{"expression":{"id":99630,"name":"ancestor_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99599,"src":"39243:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99631,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"parentIndex","nodeType":"MemberAccess","referencedDeclaration":100507,"src":"39243:21:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"39233:32:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref"}},"src":"39221:44:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99634,"nodeType":"ExpressionStatement","src":"39221:44:164"}]},"condition":{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":99627,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":99620,"name":"ancestor_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99599,"src":"39155:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99621,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"39155:18:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99622,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"39155:22:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":99623,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"39155:24:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99624,"name":"traceAncestorPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99603,"src":"39183:16:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"39183:20:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":99626,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"39183:22:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"src":"39155:50:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":99636,"nodeType":"WhileStatement","src":"39148:128:164"}]},"documentation":{"id":99588,"nodeType":"StructuredDocumentation","src":"38091:509:164","text":"@notice Finds the trace ancestor of a given position within the DAG.\n @param _pos The position to find the trace ancestor claim of.\n @param _start The index to start searching from.\n @param _global Whether or not to search the entire dag or just within an execution trace subgame. If set to\n `true`, and `_pos` is at or above the split depth, this function will revert.\n @return ancestor_ The ancestor claim that commits to the same trace index as `_pos`."},"implemented":true,"kind":"function","modifiers":[],"name":"_findTraceAncestor","nameLocation":"38614:18:164","parameters":{"id":99596,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99591,"mutability":"mutable","name":"_pos","nameLocation":"38651:4:164","nodeType":"VariableDeclaration","scope":99638,"src":"38642:13:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99590,"nodeType":"UserDefinedTypeName","pathNode":{"id":99589,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"38642:8:164"},"referencedDeclaration":103269,"src":"38642:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"},{"constant":false,"id":99593,"mutability":"mutable","name":"_start","nameLocation":"38673:6:164","nodeType":"VariableDeclaration","scope":99638,"src":"38665:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99592,"name":"uint256","nodeType":"ElementaryTypeName","src":"38665:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":99595,"mutability":"mutable","name":"_global","nameLocation":"38694:7:164","nodeType":"VariableDeclaration","scope":99638,"src":"38689:12:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":99594,"name":"bool","nodeType":"ElementaryTypeName","src":"38689:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"38632:75:164"},"returnParameters":{"id":99600,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99599,"mutability":"mutable","name":"ancestor_","nameLocation":"38773:9:164","nodeType":"VariableDeclaration","scope":99638,"src":"38755:27:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":99598,"nodeType":"UserDefinedTypeName","pathNode":{"id":99597,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"38755:9:164"},"referencedDeclaration":100523,"src":"38755:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"src":"38754:29:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":99840,"nodeType":"FunctionDefinition","src":"39797:3468:164","nodes":[],"body":{"id":99839,"nodeType":"Block","src":"39995:3270:164","nodes":[],"statements":[{"assignments":[99657],"declarations":[{"constant":false,"id":99657,"mutability":"mutable","name":"claimIdx","nameLocation":"40050:8:164","nodeType":"VariableDeclaration","scope":99839,"src":"40042:16:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99656,"name":"uint256","nodeType":"ElementaryTypeName","src":"40042:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99659,"initialValue":{"id":99658,"name":"_start","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99641,"src":"40061:6:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"40042:25:164"},{"assignments":[99662],"declarations":[{"constant":false,"id":99662,"mutability":"mutable","name":"claim","nameLocation":"40095:5:164","nodeType":"VariableDeclaration","scope":99839,"src":"40077:23:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":99661,"nodeType":"UserDefinedTypeName","pathNode":{"id":99660,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"40077:9:164"},"referencedDeclaration":100523,"src":"40077:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"id":99666,"initialValue":{"baseExpression":{"id":99663,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"40103:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":99665,"indexExpression":{"id":99664,"name":"claimIdx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99657,"src":"40113:8:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"40103:19:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref"}},"nodeType":"VariableDeclarationStatement","src":"40077:45:164"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99672,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":99667,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99662,"src":"40245:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99668,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"40245:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99669,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depth","nodeType":"MemberAccess","referencedDeclaration":100833,"src":"40245:20:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint8_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint8)"}},"id":99670,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"40245:22:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":99671,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"40271:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"40245:37:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":99676,"nodeType":"IfStatement","src":"40241:67:164","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":99673,"name":"ClaimAboveSplit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103177,"src":"40291:15:164","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":99674,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"40291:17:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99675,"nodeType":"RevertStatement","src":"40284:24:164"}},{"assignments":[99678],"declarations":[{"constant":false,"id":99678,"mutability":"mutable","name":"currentDepth","nameLocation":"40667:12:164","nodeType":"VariableDeclaration","scope":99839,"src":"40659:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99677,"name":"uint256","nodeType":"ElementaryTypeName","src":"40659:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99679,"nodeType":"VariableDeclarationStatement","src":"40659:20:164"},{"assignments":[99682],"declarations":[{"constant":false,"id":99682,"mutability":"mutable","name":"execRootClaim","nameLocation":"40707:13:164","nodeType":"VariableDeclaration","scope":99839,"src":"40689:31:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":99681,"nodeType":"UserDefinedTypeName","pathNode":{"id":99680,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"40689:9:164"},"referencedDeclaration":100523,"src":"40689:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"id":99684,"initialValue":{"id":99683,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99662,"src":"40723:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"nodeType":"VariableDeclarationStatement","src":"40689:39:164"},{"body":{"id":99719,"nodeType":"Block","src":"40800:509:164","statements":[{"assignments":[99695],"declarations":[{"constant":false,"id":99695,"mutability":"mutable","name":"parentIndex","nameLocation":"40822:11:164","nodeType":"VariableDeclaration","scope":99719,"src":"40814:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99694,"name":"uint256","nodeType":"ElementaryTypeName","src":"40814:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99698,"initialValue":{"expression":{"id":99696,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99662,"src":"40836:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99697,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"parentIndex","nodeType":"MemberAccess","referencedDeclaration":100507,"src":"40836:17:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"VariableDeclarationStatement","src":"40814:39:164"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99703,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99699,"name":"currentDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99678,"src":"41163:12:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99702,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":99700,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"41179:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":99701,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"41193:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"41179:15:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"41163:31:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":99708,"nodeType":"IfStatement","src":"41159:58:164","trueBody":{"expression":{"id":99706,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99704,"name":"execRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99682,"src":"41196:13:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":99705,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99662,"src":"41212:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"src":"41196:21:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99707,"nodeType":"ExpressionStatement","src":"41196:21:164"}},{"expression":{"id":99713,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99709,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99662,"src":"41232:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":99710,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97785,"src":"41240:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ClaimData_$100523_storage_$dyn_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref[] storage ref"}},"id":99712,"indexExpression":{"id":99711,"name":"parentIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99695,"src":"41250:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"41240:22:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage","typeString":"struct IFaultDisputeGame.ClaimData storage ref"}},"src":"41232:30:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99714,"nodeType":"ExpressionStatement","src":"41232:30:164"},{"expression":{"id":99717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99715,"name":"claimIdx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99657,"src":"41276:8:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":99716,"name":"parentIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99695,"src":"41287:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"41276:22:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":99718,"nodeType":"ExpressionStatement","src":"41276:22:164"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":99693,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"id":99690,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99685,"name":"currentDepth","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99678,"src":"40746:12:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":99686,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99662,"src":"40761:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99687,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"40761:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depth","nodeType":"MemberAccess","referencedDeclaration":100833,"src":"40761:20:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint8_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint8)"}},"id":99689,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"40761:22:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"40746:37:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":99691,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"40745:39:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":99692,"name":"SPLIT_DEPTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97726,"src":"40787:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"40745:53:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":99720,"nodeType":"WhileStatement","src":"40738:571:164"},{"assignments":[99723,99726],"declarations":[{"constant":false,"id":99723,"mutability":"mutable","name":"execRootPos","nameLocation":"41586:11:164","nodeType":"VariableDeclaration","scope":99839,"src":"41577:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99722,"nodeType":"UserDefinedTypeName","pathNode":{"id":99721,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"41577:8:164"},"referencedDeclaration":103269,"src":"41577:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"},{"constant":false,"id":99726,"mutability":"mutable","name":"outputPos","nameLocation":"41608:9:164","nodeType":"VariableDeclaration","scope":99839,"src":"41599:18:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99725,"nodeType":"UserDefinedTypeName","pathNode":{"id":99724,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"41599:8:164"},"referencedDeclaration":103269,"src":"41599:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"id":99732,"initialValue":{"components":[{"expression":{"id":99727,"name":"execRootClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99682,"src":"41622:13:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99728,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"41622:22:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"expression":{"id":99729,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99662,"src":"41646:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99730,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"41646:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"id":99731,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"41621:40:164","typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Position_$103269_$_t_userDefinedValueType$_Position_$103269_$","typeString":"tuple(Position,Position)"}},"nodeType":"VariableDeclarationStatement","src":"41576:85:164"},{"assignments":[99734],"declarations":[{"constant":false,"id":99734,"mutability":"mutable","name":"wasAttack","nameLocation":"41676:9:164","nodeType":"VariableDeclaration","scope":99839,"src":"41671:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":99733,"name":"bool","nodeType":"ElementaryTypeName","src":"41671:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":99744,"initialValue":{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":99743,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99735,"name":"execRootPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99723,"src":"41688:11:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99736,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"parent","nodeType":"MemberAccess","referencedDeclaration":100886,"src":"41688:18:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_userDefinedValueType$_Position_$103269_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (Position)"}},"id":99737,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"41688:20:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99738,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"41688:24:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":99739,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"41688:26:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99740,"name":"outputPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99726,"src":"41718:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99741,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"41718:13:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":99742,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"41718:15:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"src":"41688:45:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"41671:62:164"},{"condition":{"id":99745,"name":"wasAttack","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99734,"src":"42228:9:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":99837,"nodeType":"Block","src":"42977:282:164","statements":[{"assignments":[99803],"declarations":[{"constant":false,"id":99803,"mutability":"mutable","name":"disputed","nameLocation":"43009:8:164","nodeType":"VariableDeclaration","scope":99837,"src":"42991:26:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":99802,"nodeType":"UserDefinedTypeName","pathNode":{"id":99801,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"42991:9:164"},"referencedDeclaration":100523,"src":"42991:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"id":99816,"initialValue":{"arguments":[{"arguments":[{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":99811,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99807,"name":"outputPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99726,"src":"43053:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99808,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"43053:13:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":99809,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"43053:15:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":99810,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"43071:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"43053:19:164","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint128","typeString":"uint128"}],"expression":{"id":99805,"name":"Position","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103269,"src":"43039:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Position_$103269_$","typeString":"type(Position)"}},"id":99806,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"43039:13:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint128_$returns$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (uint128) pure returns (Position)"}},"id":99812,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"43039:34:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"id":99813,"name":"claimIdx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99657,"src":"43075:8:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"74727565","id":99814,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"43085:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":99804,"name":"_findTraceAncestor","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99638,"src":"43020:18:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_userDefinedValueType$_Position_$103269_$_t_uint256_$_t_bool_$returns$_t_struct$_ClaimData_$100523_storage_ptr_$","typeString":"function (Position,uint256,bool) view returns (struct IFaultDisputeGame.ClaimData storage pointer)"}},"id":99815,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"43020:70:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"nodeType":"VariableDeclarationStatement","src":"42991:99:164"},{"expression":{"id":99825,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":99817,"name":"startingClaim_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99645,"src":"43105:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":99818,"name":"startingPos_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99648,"src":"43121:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"id":99819,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"43104:30:164","typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"tuple(Claim,Position)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"components":[{"expression":{"id":99820,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99662,"src":"43138:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99821,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"claim","nodeType":"MemberAccess","referencedDeclaration":100516,"src":"43138:11:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"expression":{"id":99822,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99662,"src":"43151:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99823,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"43151:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"id":99824,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"43137:29:164","typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"tuple(Claim,Position)"}},"src":"43104:62:164","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99826,"nodeType":"ExpressionStatement","src":"43104:62:164"},{"expression":{"id":99835,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":99827,"name":"disputedClaim_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99651,"src":"43181:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":99828,"name":"disputedPos_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99654,"src":"43197:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"id":99829,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"43180:30:164","typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"tuple(Claim,Position)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"components":[{"expression":{"id":99830,"name":"disputed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99803,"src":"43214:8:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99831,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"claim","nodeType":"MemberAccess","referencedDeclaration":100516,"src":"43214:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"expression":{"id":99832,"name":"disputed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99803,"src":"43230:8:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99833,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"43230:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"id":99834,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"43213:35:164","typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"tuple(Claim,Position)"}},"src":"43180:68:164","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99836,"nodeType":"ExpressionStatement","src":"43180:68:164"}]},"id":99838,"nodeType":"IfStatement","src":"42224:1035:164","trueBody":{"id":99800,"nodeType":"Block","src":"42239:732:164","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":99750,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99746,"name":"outputPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99726,"src":"42540:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99747,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"indexAtDepth","nodeType":"MemberAccess","referencedDeclaration":100850,"src":"42540:22:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":99748,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"42540:24:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":99749,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"42567:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"42540:28:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":99788,"nodeType":"Block","src":"42794:91:164","statements":[{"expression":{"id":99786,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99778,"name":"startingClaim_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99645,"src":"42812:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":99781,"name":"startingOutputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97811,"src":"42840:18:164","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRoot_$103283_storage","typeString":"struct OutputRoot storage ref"}},"id":99782,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"root","nodeType":"MemberAccess","referencedDeclaration":103280,"src":"42840:23:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":99783,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101111,"src":"42840:27:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Hash_$103253_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (Hash) pure returns (bytes32)"}},"id":99784,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"42840:29:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":99779,"name":"Claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103255,"src":"42829:5:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Claim_$103255_$","typeString":"type(Claim)"}},"id":99780,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"42829:10:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_bytes32_$returns$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function (bytes32) pure returns (Claim)"}},"id":99785,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"42829:41:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"src":"42812:58:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":99787,"nodeType":"ExpressionStatement","src":"42812:58:164"}]},"id":99789,"nodeType":"IfStatement","src":"42536:349:164","trueBody":{"id":99777,"nodeType":"Block","src":"42570:218:164","statements":[{"assignments":[99753],"declarations":[{"constant":false,"id":99753,"mutability":"mutable","name":"starting","nameLocation":"42606:8:164","nodeType":"VariableDeclaration","scope":99777,"src":"42588:26:164","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"},"typeName":{"id":99752,"nodeType":"UserDefinedTypeName","pathNode":{"id":99751,"name":"ClaimData","nodeType":"IdentifierPath","referencedDeclaration":100523,"src":"42588:9:164"},"referencedDeclaration":100523,"src":"42588:9:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData"}},"visibility":"internal"}],"id":99766,"initialValue":{"arguments":[{"arguments":[{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":99761,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99757,"name":"outputPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99726,"src":"42650:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99758,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"42650:13:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":99759,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"42650:15:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":99760,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"42668:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"42650:19:164","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint128","typeString":"uint128"}],"expression":{"id":99755,"name":"Position","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103269,"src":"42636:8:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Position_$103269_$","typeString":"type(Position)"}},"id":99756,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"42636:13:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint128_$returns$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (uint128) pure returns (Position)"}},"id":99762,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"42636:34:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"id":99763,"name":"claimIdx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99657,"src":"42672:8:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"74727565","id":99764,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"42682:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":99754,"name":"_findTraceAncestor","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99638,"src":"42617:18:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_userDefinedValueType$_Position_$103269_$_t_uint256_$_t_bool_$returns$_t_struct$_ClaimData_$100523_storage_ptr_$","typeString":"function (Position,uint256,bool) view returns (struct IFaultDisputeGame.ClaimData storage pointer)"}},"id":99765,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"42617:70:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"nodeType":"VariableDeclarationStatement","src":"42588:99:164"},{"expression":{"id":99775,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":99767,"name":"startingClaim_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99645,"src":"42706:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":99768,"name":"startingPos_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99648,"src":"42722:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"id":99769,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"42705:30:164","typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"tuple(Claim,Position)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"components":[{"expression":{"id":99770,"name":"starting","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99753,"src":"42739:8:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99771,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"claim","nodeType":"MemberAccess","referencedDeclaration":100516,"src":"42739:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"expression":{"id":99772,"name":"starting","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99753,"src":"42755:8:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99773,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"42755:17:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"id":99774,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"42738:35:164","typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"tuple(Claim,Position)"}},"src":"42705:68:164","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99776,"nodeType":"ExpressionStatement","src":"42705:68:164"}]}},{"expression":{"id":99798,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":99790,"name":"disputedClaim_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99651,"src":"42899:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":99791,"name":"disputedPos_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99654,"src":"42915:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"id":99792,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"42898:30:164","typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"tuple(Claim,Position)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"components":[{"expression":{"id":99793,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99662,"src":"42932:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99794,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"claim","nodeType":"MemberAccess","referencedDeclaration":100516,"src":"42932:11:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"expression":{"id":99795,"name":"claim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99662,"src":"42945:5:164","typeDescriptions":{"typeIdentifier":"t_struct$_ClaimData_$100523_storage_ptr","typeString":"struct IFaultDisputeGame.ClaimData storage pointer"}},"id":99796,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"position","nodeType":"MemberAccess","referencedDeclaration":100519,"src":"42945:14:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"id":99797,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"42931:29:164","typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"tuple(Claim,Position)"}},"src":"42898:62:164","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":99799,"nodeType":"ExpressionStatement","src":"42898:62:164"}]}}]},"documentation":{"id":99639,"nodeType":"StructuredDocumentation","src":"39288:504:164","text":"@notice Finds the starting and disputed output root for a given `ClaimData` within the DAG. This\n `ClaimData` must be below the `SPLIT_DEPTH`.\n @param _start The index within `claimData` of the claim to start searching from.\n @return startingClaim_ The starting output root claim.\n @return startingPos_ The starting output root position.\n @return disputedClaim_ The disputed output root claim.\n @return disputedPos_ The disputed output root position."},"implemented":true,"kind":"function","modifiers":[],"name":"_findStartingAndDisputedOutputs","nameLocation":"39806:31:164","parameters":{"id":99642,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99641,"mutability":"mutable","name":"_start","nameLocation":"39846:6:164","nodeType":"VariableDeclaration","scope":99840,"src":"39838:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99640,"name":"uint256","nodeType":"ElementaryTypeName","src":"39838:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"39837:16:164"},"returnParameters":{"id":99655,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99645,"mutability":"mutable","name":"startingClaim_","nameLocation":"39907:14:164","nodeType":"VariableDeclaration","scope":99840,"src":"39901:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":99644,"nodeType":"UserDefinedTypeName","pathNode":{"id":99643,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"39901:5:164"},"referencedDeclaration":103255,"src":"39901:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":99648,"mutability":"mutable","name":"startingPos_","nameLocation":"39932:12:164","nodeType":"VariableDeclaration","scope":99840,"src":"39923:21:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99647,"nodeType":"UserDefinedTypeName","pathNode":{"id":99646,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"39923:8:164"},"referencedDeclaration":103269,"src":"39923:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"},{"constant":false,"id":99651,"mutability":"mutable","name":"disputedClaim_","nameLocation":"39952:14:164","nodeType":"VariableDeclaration","scope":99840,"src":"39946:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":99650,"nodeType":"UserDefinedTypeName","pathNode":{"id":99649,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"39946:5:164"},"referencedDeclaration":103255,"src":"39946:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":99654,"mutability":"mutable","name":"disputedPos_","nameLocation":"39977:12:164","nodeType":"VariableDeclaration","scope":99840,"src":"39968:21:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99653,"nodeType":"UserDefinedTypeName","pathNode":{"id":99652,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"39968:8:164"},"referencedDeclaration":103269,"src":"39968:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"src":"39900:90:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":99875,"nodeType":"FunctionDefinition","src":"43519:319:164","nodes":[],"body":{"id":99874,"nodeType":"Block","src":"43602:236:164","nodes":[],"statements":[{"assignments":[99851,99854,99857,99860],"declarations":[{"constant":false,"id":99851,"mutability":"mutable","name":"starting","nameLocation":"43619:8:164","nodeType":"VariableDeclaration","scope":99874,"src":"43613:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":99850,"nodeType":"UserDefinedTypeName","pathNode":{"id":99849,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"43613:5:164"},"referencedDeclaration":103255,"src":"43613:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":99854,"mutability":"mutable","name":"startingPos","nameLocation":"43638:11:164","nodeType":"VariableDeclaration","scope":99874,"src":"43629:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99853,"nodeType":"UserDefinedTypeName","pathNode":{"id":99852,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"43629:8:164"},"referencedDeclaration":103269,"src":"43629:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"},{"constant":false,"id":99857,"mutability":"mutable","name":"disputed","nameLocation":"43657:8:164","nodeType":"VariableDeclaration","scope":99874,"src":"43651:14:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":99856,"nodeType":"UserDefinedTypeName","pathNode":{"id":99855,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"43651:5:164"},"referencedDeclaration":103255,"src":"43651:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":99860,"mutability":"mutable","name":"disputedPos","nameLocation":"43676:11:164","nodeType":"VariableDeclaration","scope":99874,"src":"43667:20:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99859,"nodeType":"UserDefinedTypeName","pathNode":{"id":99858,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"43667:8:164"},"referencedDeclaration":103269,"src":"43667:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"id":99864,"initialValue":{"arguments":[{"id":99862,"name":"_claimIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99843,"src":"43735:11:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":99861,"name":"_findStartingAndDisputedOutputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99840,"src":"43703:31:164","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (uint256) view returns (Claim,Position,Claim,Position)"}},"id":99863,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"43703:44:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$","typeString":"tuple(Claim,Position,Claim,Position)"}},"nodeType":"VariableDeclarationStatement","src":"43612:135:164"},{"expression":{"id":99872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99865,"name":"uuid_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99847,"src":"43757:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":99867,"name":"starting","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99851,"src":"43786:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":99868,"name":"startingPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99854,"src":"43796:11:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"id":99869,"name":"disputed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99857,"src":"43809:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":99870,"name":"disputedPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99860,"src":"43819:11:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}],"id":99866,"name":"_computeLocalContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99926,"src":"43765:20:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$_t_userDefinedValueType$_Claim_$103255_$_t_userDefinedValueType$_Position_$103269_$returns$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (Claim,Position,Claim,Position) pure returns (Hash)"}},"id":99871,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"43765:66:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"src":"43757:74:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":99873,"nodeType":"ExpressionStatement","src":"43757:74:164"}]},"documentation":{"id":99841,"nodeType":"StructuredDocumentation","src":"43271:243:164","text":"@notice Finds the local context hash for a given claim index that is present in an execution trace subgame.\n @param _claimIndex The index of the claim to find the local context hash for.\n @return uuid_ The local context hash."},"implemented":true,"kind":"function","modifiers":[],"name":"_findLocalContext","nameLocation":"43528:17:164","parameters":{"id":99844,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99843,"mutability":"mutable","name":"_claimIndex","nameLocation":"43554:11:164","nodeType":"VariableDeclaration","scope":99875,"src":"43546:19:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":99842,"name":"uint256","nodeType":"ElementaryTypeName","src":"43546:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"43545:21:164"},"returnParameters":{"id":99848,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99847,"mutability":"mutable","name":"uuid_","nameLocation":"43595:5:164","nodeType":"VariableDeclaration","scope":99875,"src":"43590:10:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"},"typeName":{"id":99846,"nodeType":"UserDefinedTypeName","pathNode":{"id":99845,"name":"Hash","nodeType":"IdentifierPath","referencedDeclaration":103253,"src":"43590:4:164"},"referencedDeclaration":103253,"src":"43590:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"visibility":"internal"}],"src":"43589:12:164"},"scope":99927,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":99926,"nodeType":"FunctionDefinition","src":"44205:616:164","nodes":[],"body":{"id":99925,"nodeType":"Block","src":"44416:405:164","nodes":[],"statements":[{"expression":{"id":99923,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":99894,"name":"uuid_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99892,"src":"44614:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"condition":{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":99899,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":99895,"name":"_startingPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99882,"src":"44622:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"id":99896,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101017,"src":"44622:16:164","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Position_$103269_$returns$_t_uint128_$bound_to$_t_userDefinedValueType$_Position_$103269_$","typeString":"function (Position) pure returns (uint128)"}},"id":99897,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"44622:18:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":99898,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"44644:1:164","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"44622:23:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[{"arguments":[{"arguments":[{"id":99915,"name":"_starting","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99879,"src":"44763:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":99916,"name":"_startingPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99882,"src":"44774:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},{"id":99917,"name":"_disputed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99885,"src":"44788:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":99918,"name":"_disputedPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99888,"src":"44799:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}],"expression":{"id":99913,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"44752:3:164","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":99914,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"44752:10:164","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":99919,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"44752:60:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":99912,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"44742:9:164","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":99920,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"44742:71:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":99910,"name":"Hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103253,"src":"44732:4:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Hash_$103253_$","typeString":"type(Hash)"}},"id":99911,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"44732:9:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_bytes32_$returns$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (bytes32) pure returns (Hash)"}},"id":99921,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"44732:82:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":99922,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"44622:192:164","trueExpression":{"arguments":[{"arguments":[{"arguments":[{"id":99905,"name":"_disputed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99885,"src":"44691:9:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},{"id":99906,"name":"_disputedPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99888,"src":"44702:12:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}],"expression":{"id":99903,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"44680:3:164","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":99904,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"44680:10:164","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":99907,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"44680:35:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":99902,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"44670:9:164","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":99908,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"44670:46:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":99900,"name":"Hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103253,"src":"44660:4:164","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_Hash_$103253_$","typeString":"type(Hash)"}},"id":99901,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"44660:9:164","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_bytes32_$returns$_t_userDefinedValueType$_Hash_$103253_$","typeString":"function (bytes32) pure returns (Hash)"}},"id":99909,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"44660:57:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"src":"44614:200:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"id":99924,"nodeType":"ExpressionStatement","src":"44614:200:164"}]},"documentation":{"id":99876,"nodeType":"StructuredDocumentation","src":"43844:356:164","text":"@notice Computes the local context hash for a set of starting/disputed claim values and positions.\n @param _starting The starting claim.\n @param _startingPos The starting claim's position.\n @param _disputed The disputed claim.\n @param _disputedPos The disputed claim's position.\n @return uuid_ The local context hash."},"implemented":true,"kind":"function","modifiers":[],"name":"_computeLocalContext","nameLocation":"44214:20:164","parameters":{"id":99889,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99879,"mutability":"mutable","name":"_starting","nameLocation":"44250:9:164","nodeType":"VariableDeclaration","scope":99926,"src":"44244:15:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":99878,"nodeType":"UserDefinedTypeName","pathNode":{"id":99877,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"44244:5:164"},"referencedDeclaration":103255,"src":"44244:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":99882,"mutability":"mutable","name":"_startingPos","nameLocation":"44278:12:164","nodeType":"VariableDeclaration","scope":99926,"src":"44269:21:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99881,"nodeType":"UserDefinedTypeName","pathNode":{"id":99880,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"44269:8:164"},"referencedDeclaration":103269,"src":"44269:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"},{"constant":false,"id":99885,"mutability":"mutable","name":"_disputed","nameLocation":"44306:9:164","nodeType":"VariableDeclaration","scope":99926,"src":"44300:15:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":99884,"nodeType":"UserDefinedTypeName","pathNode":{"id":99883,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"44300:5:164"},"referencedDeclaration":103255,"src":"44300:5:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"},{"constant":false,"id":99888,"mutability":"mutable","name":"_disputedPos","nameLocation":"44334:12:164","nodeType":"VariableDeclaration","scope":99926,"src":"44325:21:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"},"typeName":{"id":99887,"nodeType":"UserDefinedTypeName","pathNode":{"id":99886,"name":"Position","nodeType":"IdentifierPath","referencedDeclaration":103269,"src":"44325:8:164"},"referencedDeclaration":103269,"src":"44325:8:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Position_$103269","typeString":"Position"}},"visibility":"internal"}],"src":"44234:118:164"},"returnParameters":{"id":99893,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99892,"mutability":"mutable","name":"uuid_","nameLocation":"44405:5:164","nodeType":"VariableDeclaration","scope":99926,"src":"44400:10:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"},"typeName":{"id":99891,"nodeType":"UserDefinedTypeName","pathNode":{"id":99890,"name":"Hash","nodeType":"IdentifierPath","referencedDeclaration":103253,"src":"44400:4:164"},"referencedDeclaration":103253,"src":"44400:4:164","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Hash_$103253","typeString":"Hash"}},"visibility":"internal"}],"src":"44399:12:164"},"scope":99927,"stateMutability":"pure","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[{"baseName":{"id":97711,"name":"IFaultDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100608,"src":"1025:17:164"},"id":97712,"nodeType":"InheritanceSpecifier","src":"1025:17:164"},{"baseName":{"id":97713,"name":"Clone","nodeType":"IdentifierPath","referencedDeclaration":60963,"src":"1044:5:164"},"id":97714,"nodeType":"InheritanceSpecifier","src":"1044:5:164"},{"baseName":{"id":97715,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"1051:7:164"},"id":97716,"nodeType":"InheritanceSpecifier","src":"1051:7:164"}],"canonicalName":"FaultDisputeGame","contractDependencies":[],"contractKind":"contract","documentation":{"id":97710,"nodeType":"StructuredDocumentation","src":"900:96:164","text":"@title FaultDisputeGame\n @notice An implementation of the `IFaultDisputeGame` interface."},"fullyImplemented":true,"linearizedBaseContracts":[99927,109417,60963,100608,100327,100616],"name":"FaultDisputeGame","nameLocation":"1005:16:164","scope":99928,"usedErrors":[103117,103120,103123,103126,103129,103135,103138,103144,103147,103150,103153,103156,103159,103162,103168,103171,103174,103177,103180,103183,103186,103189,103192]}],"license":"MIT"},"id":164} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/GasPriceOracle.json b/packages/sdk/src/forge-artifacts/GasPriceOracle.json new file mode 100644 index 000000000000..2a5743a1323e --- /dev/null +++ b/packages/sdk/src/forge-artifacts/GasPriceOracle.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"DECIMALS","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"baseFee","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"baseFeeScalar","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"blobBaseFee","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"blobBaseFeeScalar","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"type":"function","name":"gasPrice","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getL1Fee","inputs":[{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getL1GasUsed","inputs":[{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"isEcotone","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"l1BaseFee","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"overhead","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"scalar","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"setEcotone","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"}],"bytecode":{"object":"0x608060405234801561001057600080fd5b50610fb5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806354fd4d5011610097578063de26c4a111610066578063de26c4a1146101da578063f45e65d8146101ed578063f8206140146101f5578063fe173b97146101cc57600080fd5b806354fd4d501461016657806368d5dca6146101af5780636ef25c3a146101cc578063c5985918146101d257600080fd5b8063313ce567116100d3578063313ce5671461012757806349948e0e1461012e5780634ef6e22414610141578063519b4bd31461015e57600080fd5b80630c18c162146100fa57806322b90ab3146101155780632e0f26251461011f575b600080fd5b6101026101fd565b6040519081526020015b60405180910390f35b61011d61031e565b005b610102600681565b6006610102565b61010261013c366004610b73565b610541565b60005461014e9060ff1681565b604051901515815260200161010c565b610102610565565b6101a26040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610c42565b6101b76105c6565b60405163ffffffff909116815260200161010c565b48610102565b6101b761064b565b6101026101e8366004610b73565b6106ac565b610102610760565b610102610853565b6000805460ff1615610296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f47617350726963654f7261636c653a206f76657268656164282920697320646560448201527f707265636174656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103199190610cb5565b905090565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663e591b2826040518163ffffffff1660e01b8152600401602060405180830381865afa15801561037d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a19190610cce565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e2073657420697345636f746f6e6520666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a40161028d565b60005460ff1615610514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a2045636f746f6e6520616c72656164792060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161028d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000805460ff161561055c57610556826108b4565b92915050565b61055682610958565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166368d5dca66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610627573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103199190610d04565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663c59859186040518163ffffffff1660e01b8152600401602060405180830381865afa158015610627573d6000803e3d6000fd5b6000806106b883610ab4565b60005490915060ff16156106cc5792915050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190610cb5565b6107599082610d59565b9392505050565b6000805460ff16156107f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a207363616c61722829206973206465707260448201527f6563617465640000000000000000000000000000000000000000000000000000606482015260840161028d565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663f82061406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b6000806108c083610ab4565b905060006108cc610565565b6108d461064b565b6108df906010610d71565b63ffffffff166108ef9190610d9d565b905060006108fb610853565b6109036105c6565b63ffffffff166109139190610d9d565b905060006109218284610d59565b61092b9085610d9d565b90506109396006600a610efa565b610944906010610d9d565b61094e9082610f06565b9695505050505050565b60008061096483610ab4565b9050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109eb9190610cb5565b6109f3610565565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a769190610cb5565b610a809085610d59565b610a8a9190610d9d565b610a949190610d9d565b9050610aa26006600a610efa565b610aac9082610f06565b949350505050565b80516000908190815b81811015610b3757848181518110610ad757610ad7610f41565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003610b1757610b10600484610d59565b9250610b25565b610b22601084610d59565b92505b80610b2f81610f70565b915050610abd565b50610aac82610440610d59565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610b8557600080fd5b813567ffffffffffffffff80821115610b9d57600080fd5b818401915084601f830112610bb157600080fd5b813581811115610bc357610bc3610b44565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610c0957610c09610b44565b81604052828152876020848701011115610c2257600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b81811015610c6f57858101830151858201604001528201610c53565b81811115610c81576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cc757600080fd5b5051919050565b600060208284031215610ce057600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461075957600080fd5b600060208284031215610d1657600080fd5b815163ffffffff8116811461075957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610d6c57610d6c610d2a565b500190565b600063ffffffff80831681851681830481118215151615610d9457610d94610d2a565b02949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610dd557610dd5610d2a565b500290565b600181815b80851115610e3357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e1957610e19610d2a565b80851615610e2657918102915b93841c9390800290610ddf565b509250929050565b600082610e4a57506001610556565b81610e5757506000610556565b8160018114610e6d5760028114610e7757610e93565b6001915050610556565b60ff841115610e8857610e88610d2a565b50506001821b610556565b5060208310610133831016604e8410600b8410161715610eb6575081810a610556565b610ec08383610dda565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610ef257610ef2610d2a565b029392505050565b60006107598383610e3b565b600082610f3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610fa157610fa1610d2a565b506001019056fea164736f6c634300080f000a","sourceMap":"1153:5825:144:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806354fd4d5011610097578063de26c4a111610066578063de26c4a1146101da578063f45e65d8146101ed578063f8206140146101f5578063fe173b97146101cc57600080fd5b806354fd4d501461016657806368d5dca6146101af5780636ef25c3a146101cc578063c5985918146101d257600080fd5b8063313ce567116100d3578063313ce5671461012757806349948e0e1461012e5780634ef6e22414610141578063519b4bd31461015e57600080fd5b80630c18c162146100fa57806322b90ab3146101155780632e0f26251461011f575b600080fd5b6101026101fd565b6040519081526020015b60405180910390f35b61011d61031e565b005b610102600681565b6006610102565b61010261013c366004610b73565b610541565b60005461014e9060ff1681565b604051901515815260200161010c565b610102610565565b6101a26040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161010c9190610c42565b6101b76105c6565b60405163ffffffff909116815260200161010c565b48610102565b6101b761064b565b6101026101e8366004610b73565b6106ac565b610102610760565b610102610853565b6000805460ff1615610296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f47617350726963654f7261636c653a206f76657268656164282920697320646560448201527f707265636174656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103199190610cb5565b905090565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663e591b2826040518163ffffffff1660e01b8152600401602060405180830381865afa15801561037d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a19190610cce565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e2073657420697345636f746f6e6520666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a40161028d565b60005460ff1615610514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a2045636f746f6e6520616c72656164792060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161028d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000805460ff161561055c57610556826108b4565b92915050565b61055682610958565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166368d5dca66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610627573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103199190610d04565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663c59859186040518163ffffffff1660e01b8152600401602060405180830381865afa158015610627573d6000803e3d6000fd5b6000806106b883610ab4565b60005490915060ff16156106cc5792915050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190610cb5565b6107599082610d59565b9392505050565b6000805460ff16156107f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a207363616c61722829206973206465707260448201527f6563617465640000000000000000000000000000000000000000000000000000606482015260840161028d565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663f82061406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f5573d6000803e3d6000fd5b6000806108c083610ab4565b905060006108cc610565565b6108d461064b565b6108df906010610d71565b63ffffffff166108ef9190610d9d565b905060006108fb610853565b6109036105c6565b63ffffffff166109139190610d9d565b905060006109218284610d59565b61092b9085610d9d565b90506109396006600a610efa565b610944906010610d9d565b61094e9082610f06565b9695505050505050565b60008061096483610ab4565b9050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109eb9190610cb5565b6109f3610565565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a769190610cb5565b610a809085610d59565b610a8a9190610d9d565b610a949190610d9d565b9050610aa26006600a610efa565b610aac9082610f06565b949350505050565b80516000908190815b81811015610b3757848181518110610ad757610ad7610f41565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003610b1757610b10600484610d59565b9250610b25565b610b22601084610d59565b92505b80610b2f81610f70565b915050610abd565b50610aac82610440610d59565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610b8557600080fd5b813567ffffffffffffffff80821115610b9d57600080fd5b818401915084601f830112610bb157600080fd5b813581811115610bc357610bc3610b44565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610c0957610c09610b44565b81604052828152876020848701011115610c2257600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b81811015610c6f57858101830151858201604001528201610c53565b81811115610c81576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cc757600080fd5b5051919050565b600060208284031215610ce057600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461075957600080fd5b600060208284031215610d1657600080fd5b815163ffffffff8116811461075957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610d6c57610d6c610d2a565b500190565b600063ffffffff80831681851681830481118215151615610d9457610d94610d2a565b02949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610dd557610dd5610d2a565b500290565b600181815b80851115610e3357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e1957610e19610d2a565b80851615610e2657918102915b93841c9390800290610ddf565b509250929050565b600082610e4a57506001610556565b81610e5757506000610556565b8160018114610e6d5760028114610e7757610e93565b6001915050610556565b60ff841115610e8857610e88610d2a565b50506001821b610556565b5060208310610133831016604e8410600b8410161715610eb6575081810a610556565b610ec08383610dda565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610ef257610ef2610d2a565b029392505050565b60006107598383610e3b565b600082610f3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610fa157610fa1610d2a565b506001019056fea164736f6c634300080f000a","sourceMap":"1153:5825:144:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2951:202;;;:::i;:::-;;;160:25:357;;;148:2;133:18;2951:202:144;;;;;;;;2115:338;;;:::i;:::-;;1249:36;;1284:1;1249:36;;4561:82;1284:1;4561:82;;1835:196;;;;;;:::i;:::-;;:::i;1486:21::-;;;;;;;;;;;;1535:14:357;;1528:22;1510:41;;1498:2;1483:18;1486:21:144;1370:187:357;3568:124:144;;;:::i;1355:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4267:141::-;;;:::i;:::-;;;2397:10:357;2385:23;;;2367:42;;2355:2;2340:18;4267:141:144;2223:192:357;2746:86:144;2812:13;2746:86;;4022:133;;;:::i;4975:280::-;;;;;;:::i;:::-;;:::i;3268:196::-;;;:::i;3790:130::-;;;:::i;2951:202::-;2992:7;3020:9;;;;3019:10;3011:63;;;;;;;2622:2:357;3011:63:144;;;2604:21:357;2661:2;2641:18;;;2634:30;2700:34;2680:18;;;2673:62;2771:10;2751:18;;;2744:38;2799:19;;3011:63:144;;;;;;;;;1455:42:199;3091:53:144;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3084:62;;2951:202;:::o;2115:338::-;1455:42:199;2191:57:144;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2177:73;;:10;:73;;;2156:185;;;;;;;3538:2:357;2156:185:144;;;3520:21:357;3577:2;3557:18;;;3550:30;3616:34;3596:18;;;3589:62;3687:34;3667:18;;;3660:62;3759:3;3738:19;;;3731:32;3780:19;;2156:185:144;3336:469:357;2156:185:144;2359:9;;;;:18;2351:69;;;;;;;4012:2:357;2351:69:144;;;3994:21:357;4051:2;4031:18;;;4024:30;4090:34;4070:18;;;4063:62;4161:8;4141:18;;;4134:36;4187:19;;2351:69:144;3810:402:357;2351:69:144;2430:9;:16;;;;2442:4;2430:16;;;2115:338::o;1835:196::-;1896:7;1919:9;;;;1915:70;;;1951:23;1968:5;1951:16;:23::i;:::-;1944:30;1835:196;-1:-1:-1;;1835:196:144:o;1915:70::-;2001:23;2018:5;2001:16;:23::i;3568:124::-;3610:7;1455:42:199;3636:47:144;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4267:141;4317:6;1455:42:199;4342:57:144;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4022:133::-;4068:6;1455:42:199;4093:53:144;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4975:280;5038:7;5057:17;5077:22;5093:5;5077:15;:22::i;:::-;5113:9;;5057:42;;-1:-1:-1;5113:9:144;;5109:56;;;5145:9;4975:280;-1:-1:-1;;4975:280:144:o;5109:56::-;1455:42:199;5193:53:144;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5181:67;;:9;:67;:::i;:::-;5174:74;4975:280;-1:-1:-1;;;4975:280:144:o;3268:196::-;3307:7;3335:9;;;;3334:10;3326:61;;;;;;;5026:2:357;3326:61:144;;;5008:21:357;5065:2;5045:18;;;5038:30;5104:34;5084:18;;;5077:62;5175:8;5155:18;;;5148:36;5201:19;;3326:61:144;4824:402:357;3326:61:144;1455:42:199;3404:51:144;;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3790:130;3834:7;1455:42:199;3860:51:144;;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6015:393;6084:7;6103:17;6123:22;6139:5;6123:15;:22::i;:::-;6103:42;;6155:21;6202:11;:9;:11::i;:::-;6179:15;:13;:15::i;:::-;:20;;6197:2;6179:20;:::i;:::-;:34;;;;;;:::i;:::-;6155:58;;6223:25;6273:13;:11;:13::i;:::-;6251:19;:17;:19::i;:::-;:35;;;;;;:::i;:::-;6223:63;-1:-1:-1;6296:11:144;6323:33;6223:63;6323:13;:33;:::i;:::-;6310:47;;:9;:47;:::i;:::-;6296:61;-1:-1:-1;6386:14:144;1284:1;6386:2;:14;:::i;:::-;6381:19;;:2;:19;:::i;:::-;6374:27;;:3;:27;:::i;:::-;6367:34;6015:393;-1:-1:-1;;;;;;6015:393:144:o;5468:351::-;5537:7;5556:17;5576:22;5592:5;5576:15;:22::i;:::-;5556:42;;5608:11;1455:42:199;5720:51:144;;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5694:11;:9;:11::i;:::-;1455:42:199;5635:53:144;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5623:67;;:9;:67;:::i;:::-;5622:83;;;;:::i;:::-;:151;;;;:::i;:::-;5608:165;-1:-1:-1;5797:14:144;1284:1;5797:2;:14;:::i;:::-;5790:22;;:3;:22;:::i;:::-;5783:29;5468:351;-1:-1:-1;;;;5468:351:144:o;6610:366::-;6741:12;;6678:7;;;;;6763:173;6787:6;6783:1;:10;6763:173;;;6818:5;6824:1;6818:8;;;;;;;;:::i;:::-;;;;;;;6830:1;6818:13;6814:112;;6851:10;6860:1;6851:10;;:::i;:::-;;;6814:112;;;6900:11;6909:2;6900:11;;:::i;:::-;;;6814:112;6795:3;;;;:::i;:::-;;;;6763:173;;;-1:-1:-1;6952:17:144;:5;6961:7;6952:17;:::i;196:184:357:-;248:77;245:1;238:88;345:4;342:1;335:15;369:4;366:1;359:15;385:980;453:6;506:2;494:9;485:7;481:23;477:32;474:52;;;522:1;519;512:12;474:52;562:9;549:23;591:18;632:2;624:6;621:14;618:34;;;648:1;645;638:12;618:34;686:6;675:9;671:22;661:32;;731:7;724:4;720:2;716:13;712:27;702:55;;753:1;750;743:12;702:55;789:2;776:16;811:2;807;804:10;801:36;;;817:18;;:::i;:::-;951:2;945:9;1013:4;1005:13;;856:66;1001:22;;;1025:2;997:31;993:40;981:53;;;1049:18;;;1069:22;;;1046:46;1043:72;;;1095:18;;:::i;:::-;1135:10;1131:2;1124:22;1170:2;1162:6;1155:18;1210:7;1205:2;1200;1196;1192:11;1188:20;1185:33;1182:53;;;1231:1;1228;1221:12;1182:53;1287:2;1282;1278;1274:11;1269:2;1261:6;1257:15;1244:46;1332:1;1310:15;;;1327:2;1306:24;1299:35;;;;-1:-1:-1;1314:6:357;385:980;-1:-1:-1;;;;;385:980:357:o;1562:656::-;1674:4;1703:2;1732;1721:9;1714:21;1764:6;1758:13;1807:6;1802:2;1791:9;1787:18;1780:34;1832:1;1842:140;1856:6;1853:1;1850:13;1842:140;;;1951:14;;;1947:23;;1941:30;1917:17;;;1936:2;1913:26;1906:66;1871:10;;1842:140;;;2000:6;1997:1;1994:13;1991:91;;;2070:1;2065:2;2056:6;2045:9;2041:22;2037:31;2030:42;1991:91;-1:-1:-1;2134:2:357;2122:15;2139:66;2118:88;2103:104;;;;2209:2;2099:113;;1562:656;-1:-1:-1;;;1562:656:357:o;2829:184::-;2899:6;2952:2;2940:9;2931:7;2927:23;2923:32;2920:52;;;2968:1;2965;2958:12;2920:52;-1:-1:-1;2991:16:357;;2829:184;-1:-1:-1;2829:184:357:o;3018:313::-;3088:6;3141:2;3129:9;3120:7;3116:23;3112:32;3109:52;;;3157:1;3154;3147:12;3109:52;3189:9;3183:16;3239:42;3232:5;3228:54;3221:5;3218:65;3208:93;;3297:1;3294;3287:12;4217:280;4286:6;4339:2;4327:9;4318:7;4314:23;4310:32;4307:52;;;4355:1;4352;4345:12;4307:52;4387:9;4381:16;4437:10;4430:5;4426:22;4419:5;4416:33;4406:61;;4463:1;4460;4453:12;4502:184;4554:77;4551:1;4544:88;4651:4;4648:1;4641:15;4675:4;4672:1;4665:15;4691:128;4731:3;4762:1;4758:6;4755:1;4752:13;4749:39;;;4768:18;;:::i;:::-;-1:-1:-1;4804:9:357;;4691:128::o;5231:262::-;5270:7;5302:10;5339:2;5336:1;5332:10;5369:2;5366:1;5362:10;5425:3;5421:2;5417:12;5412:3;5409:21;5402:3;5395:11;5388:19;5384:47;5381:73;;;5434:18;;:::i;:::-;5474:13;;5231:262;-1:-1:-1;;;;5231:262:357:o;5498:228::-;5538:7;5664:1;5596:66;5592:74;5589:1;5586:81;5581:1;5574:9;5567:17;5563:105;5560:131;;;5671:18;;:::i;:::-;-1:-1:-1;5711:9:357;;5498:228::o;5731:482::-;5820:1;5863:5;5820:1;5877:330;5898:7;5888:8;5885:21;5877:330;;;6017:4;5949:66;5945:77;5939:4;5936:87;5933:113;;;6026:18;;:::i;:::-;6076:7;6066:8;6062:22;6059:55;;;6096:16;;;;6059:55;6175:22;;;;6135:15;;;;5877:330;;;5881:3;5731:482;;;;;:::o;6218:866::-;6267:5;6297:8;6287:80;;-1:-1:-1;6338:1:357;6352:5;;6287:80;6386:4;6376:76;;-1:-1:-1;6423:1:357;6437:5;;6376:76;6468:4;6486:1;6481:59;;;;6554:1;6549:130;;;;6461:218;;6481:59;6511:1;6502:10;;6525:5;;;6549:130;6586:3;6576:8;6573:17;6570:43;;;6593:18;;:::i;:::-;-1:-1:-1;;6649:1:357;6635:16;;6664:5;;6461:218;;6763:2;6753:8;6750:16;6744:3;6738:4;6735:13;6731:36;6725:2;6715:8;6712:16;6707:2;6701:4;6698:12;6694:35;6691:77;6688:159;;;-1:-1:-1;6800:19:357;;;6832:5;;6688:159;6879:34;6904:8;6898:4;6879:34;:::i;:::-;7009:6;6941:66;6937:79;6928:7;6925:92;6922:118;;;7020:18;;:::i;:::-;7058:20;;6218:866;-1:-1:-1;;;6218:866:357:o;7089:131::-;7149:5;7178:36;7205:8;7199:4;7178:36;:::i;7225:274::-;7265:1;7291;7281:189;;7326:77;7323:1;7316:88;7427:4;7424:1;7417:15;7455:4;7452:1;7445:15;7281:189;-1:-1:-1;7484:9:357;;7225:274::o;7504:184::-;7556:77;7553:1;7546:88;7653:4;7650:1;7643:15;7677:4;7674:1;7667:15;7693:195;7732:3;7763:66;7756:5;7753:77;7750:103;;7833:18;;:::i;:::-;-1:-1:-1;7880:1:357;7869:13;;7693:195::o","linkReferences":{}},"methodIdentifiers":{"DECIMALS()":"2e0f2625","baseFee()":"6ef25c3a","baseFeeScalar()":"c5985918","blobBaseFee()":"f8206140","blobBaseFeeScalar()":"68d5dca6","decimals()":"313ce567","gasPrice()":"fe173b97","getL1Fee(bytes)":"49948e0e","getL1GasUsed(bytes)":"de26c4a1","isEcotone()":"4ef6e224","l1BaseFee()":"519b4bd3","overhead()":"0c18c162","scalar()":"f45e65d8","setEcotone()":"22b90ab3","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseFeeScalar\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blobBaseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blobBaseFeeScalar\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"getL1Fee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"getL1GasUsed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEcotone\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1BaseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"overhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"scalar\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"setEcotone\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:proxied\":\"@custom:predeploy 0x420000000000000000000000000000000000000F\",\"kind\":\"dev\",\"methods\":{\"baseFee()\":{\"returns\":{\"_0\":\"Current L2 base fee.\"}},\"baseFeeScalar()\":{\"returns\":{\"_0\":\"Current base fee scalar.\"}},\"blobBaseFee()\":{\"returns\":{\"_0\":\"Current blob base fee.\"}},\"blobBaseFeeScalar()\":{\"returns\":{\"_0\":\"Current blob base fee scalar.\"}},\"decimals()\":{\"custom:legacy\":\"@notice Retrieves the number of decimals used in the scalar.\",\"returns\":{\"_0\":\"Number of decimals used in the scalar.\"}},\"gasPrice()\":{\"returns\":{\"_0\":\"Current L2 gas price (base fee).\"}},\"getL1Fee(bytes)\":{\"params\":{\"_data\":\"Unsigned fully RLP-encoded transaction to get the L1 fee for.\"},\"returns\":{\"_0\":\"L1 fee that should be paid for the tx\"}},\"getL1GasUsed(bytes)\":{\"params\":{\"_data\":\"Unsigned fully RLP-encoded transaction to get the L1 gas for.\"},\"returns\":{\"_0\":\"Amount of L1 gas used to publish the transaction.\"}},\"l1BaseFee()\":{\"returns\":{\"_0\":\"Latest known L1 base fee.\"}},\"overhead()\":{\"custom:legacy\":\"@notice Retrieves the current fee overhead.\",\"returns\":{\"_0\":\"Current fee overhead.\"}},\"scalar()\":{\"custom:legacy\":\"@notice Retrieves the current fee scalar.\",\"returns\":{\"_0\":\"Current fee scalar.\"}}},\"stateVariables\":{\"version\":{\"custom:semver\":\"1.2.0\"}},\"title\":\"GasPriceOracle\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"DECIMALS()\":{\"notice\":\"Number of decimals used in the scalar.\"},\"baseFee()\":{\"notice\":\"Retrieves the current base fee.\"},\"baseFeeScalar()\":{\"notice\":\"Retrieves the current base fee scalar.\"},\"blobBaseFee()\":{\"notice\":\"Retrieves the current blob base fee.\"},\"blobBaseFeeScalar()\":{\"notice\":\"Retrieves the current blob base fee scalar.\"},\"gasPrice()\":{\"notice\":\"Retrieves the current gas price (base fee).\"},\"getL1Fee(bytes)\":{\"notice\":\"Computes the L1 portion of the fee based on the size of the rlp encoded input transaction, the current L1 base fee, and the various dynamic parameters.\"},\"getL1GasUsed(bytes)\":{\"notice\":\"Computes the amount of L1 gas used for a transaction. Adds 68 bytes of padding to account for the fact that the input does not have a signature.\"},\"isEcotone()\":{\"notice\":\"Indicates whether the network has gone through the Ecotone upgrade.\"},\"l1BaseFee()\":{\"notice\":\"Retrieves the latest known L1 base fee.\"},\"setEcotone()\":{\"notice\":\"Set chain to be Ecotone chain (callable by depositor account)\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"This contract maintains the variables responsible for computing the L1 portion of the total fee charged on L2. Before Bedrock, this contract held variables in state that were read during the state transition function to compute the L1 portion of the transaction fee. After Bedrock, this contract now simply proxies the L1Block contract, which has the values used to compute the L1 portion of the fee in its state. The contract exposes an API that is useful for knowing how large the L1 portion of the transaction fee will be. The following events were deprecated with Bedrock: - event OverheadUpdated(uint256 overhead); - event ScalarUpdated(uint256 scalar); - event DecimalsUpdated(uint256 decimals);\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L2/GasPriceOracle.sol\":\"GasPriceOracle\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"src/L2/GasPriceOracle.sol\":{\"keccak256\":\"0x299b0722d301a4bc075ba09c73e55a98e3dc509444906f285e2ceba9c1fa69b1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://17f7ffe4744b7bde10d61ce376ac0b497d40dab962b1c4c47bf7fd9784350cb7\",\"dweb:/ipfs/QmYp8vZtid8GBWrm7QSPxNCV9D4Mm9ELm29PGup7b6dJ7H\"]},\"src/L2/L1Block.sol\":{\"keccak256\":\"0x5819beb85b23c31c5f5d639977bf5d5cf6768975d6d3eecde78299f37ba04cd6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://55cdc404753dcc0cd9d3fac3554a4a16abd7dc39f43f7ae0ebcb0990fa52f7e7\",\"dweb:/ipfs/QmNXMUmNBmNCmL5k8tC1jJ6CmY2hZKJ7owFwuvhMKXr5fv\"]},\"src/libraries/Predeploys.sol\":{\"keccak256\":\"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663\",\"dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"view","type":"function","name":"DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"baseFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"baseFeeScalar","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"blobBaseFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"blobBaseFeeScalar","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"gasPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"view","type":"function","name":"getL1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"view","type":"function","name":"getL1GasUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"isEcotone","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"l1BaseFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"overhead","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"scalar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"setEcotone"},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"baseFee()":{"returns":{"_0":"Current L2 base fee."}},"baseFeeScalar()":{"returns":{"_0":"Current base fee scalar."}},"blobBaseFee()":{"returns":{"_0":"Current blob base fee."}},"blobBaseFeeScalar()":{"returns":{"_0":"Current blob base fee scalar."}},"decimals()":{"custom:legacy":"@notice Retrieves the number of decimals used in the scalar.","returns":{"_0":"Number of decimals used in the scalar."}},"gasPrice()":{"returns":{"_0":"Current L2 gas price (base fee)."}},"getL1Fee(bytes)":{"params":{"_data":"Unsigned fully RLP-encoded transaction to get the L1 fee for."},"returns":{"_0":"L1 fee that should be paid for the tx"}},"getL1GasUsed(bytes)":{"params":{"_data":"Unsigned fully RLP-encoded transaction to get the L1 gas for."},"returns":{"_0":"Amount of L1 gas used to publish the transaction."}},"l1BaseFee()":{"returns":{"_0":"Latest known L1 base fee."}},"overhead()":{"custom:legacy":"@notice Retrieves the current fee overhead.","returns":{"_0":"Current fee overhead."}},"scalar()":{"custom:legacy":"@notice Retrieves the current fee scalar.","returns":{"_0":"Current fee scalar."}}},"version":1},"userdoc":{"kind":"user","methods":{"DECIMALS()":{"notice":"Number of decimals used in the scalar."},"baseFee()":{"notice":"Retrieves the current base fee."},"baseFeeScalar()":{"notice":"Retrieves the current base fee scalar."},"blobBaseFee()":{"notice":"Retrieves the current blob base fee."},"blobBaseFeeScalar()":{"notice":"Retrieves the current blob base fee scalar."},"gasPrice()":{"notice":"Retrieves the current gas price (base fee)."},"getL1Fee(bytes)":{"notice":"Computes the L1 portion of the fee based on the size of the rlp encoded input transaction, the current L1 base fee, and the various dynamic parameters."},"getL1GasUsed(bytes)":{"notice":"Computes the amount of L1 gas used for a transaction. Adds 68 bytes of padding to account for the fact that the input does not have a signature."},"isEcotone()":{"notice":"Indicates whether the network has gone through the Ecotone upgrade."},"l1BaseFee()":{"notice":"Retrieves the latest known L1 base fee."},"setEcotone()":{"notice":"Set chain to be Ecotone chain (callable by depositor account)"},"version()":{"notice":"Semantic version."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L2/GasPriceOracle.sol":"GasPriceOracle"},"evmVersion":"london","libraries":{}},"sources":{"src/L2/GasPriceOracle.sol":{"keccak256":"0x299b0722d301a4bc075ba09c73e55a98e3dc509444906f285e2ceba9c1fa69b1","urls":["bzz-raw://17f7ffe4744b7bde10d61ce376ac0b497d40dab962b1c4c47bf7fd9784350cb7","dweb:/ipfs/QmYp8vZtid8GBWrm7QSPxNCV9D4Mm9ELm29PGup7b6dJ7H"],"license":"MIT"},"src/L2/L1Block.sol":{"keccak256":"0x5819beb85b23c31c5f5d639977bf5d5cf6768975d6d3eecde78299f37ba04cd6","urls":["bzz-raw://55cdc404753dcc0cd9d3fac3554a4a16abd7dc39f43f7ae0ebcb0990fa52f7e7","dweb:/ipfs/QmNXMUmNBmNCmL5k8tC1jJ6CmY2hZKJ7owFwuvhMKXr5fv"],"license":"MIT"},"src/libraries/Predeploys.sol":{"keccak256":"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02","urls":["bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663","dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":89850,"contract":"src/L2/GasPriceOracle.sol:GasPriceOracle","label":"isEcotone","offset":0,"slot":"0","type":"t_bool"}],"types":{"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"}}},"userdoc":{"version":1,"kind":"user","methods":{"DECIMALS()":{"notice":"Number of decimals used in the scalar."},"baseFee()":{"notice":"Retrieves the current base fee."},"baseFeeScalar()":{"notice":"Retrieves the current base fee scalar."},"blobBaseFee()":{"notice":"Retrieves the current blob base fee."},"blobBaseFeeScalar()":{"notice":"Retrieves the current blob base fee scalar."},"gasPrice()":{"notice":"Retrieves the current gas price (base fee)."},"getL1Fee(bytes)":{"notice":"Computes the L1 portion of the fee based on the size of the rlp encoded input transaction, the current L1 base fee, and the various dynamic parameters."},"getL1GasUsed(bytes)":{"notice":"Computes the amount of L1 gas used for a transaction. Adds 68 bytes of padding to account for the fact that the input does not have a signature."},"isEcotone()":{"notice":"Indicates whether the network has gone through the Ecotone upgrade."},"l1BaseFee()":{"notice":"Retrieves the latest known L1 base fee."},"setEcotone()":{"notice":"Set chain to be Ecotone chain (callable by depositor account)"},"version()":{"notice":"Semantic version."}},"notice":"This contract maintains the variables responsible for computing the L1 portion of the total fee charged on L2. Before Bedrock, this contract held variables in state that were read during the state transition function to compute the L1 portion of the transaction fee. After Bedrock, this contract now simply proxies the L1Block contract, which has the values used to compute the L1 portion of the fee in its state. The contract exposes an API that is useful for knowing how large the L1 portion of the transaction fee will be. The following events were deprecated with Bedrock: - event OverheadUpdated(uint256 overhead); - event ScalarUpdated(uint256 scalar); - event DecimalsUpdated(uint256 decimals);"},"devdoc":{"version":1,"kind":"dev","methods":{"baseFee()":{"returns":{"_0":"Current L2 base fee."}},"baseFeeScalar()":{"returns":{"_0":"Current base fee scalar."}},"blobBaseFee()":{"returns":{"_0":"Current blob base fee."}},"blobBaseFeeScalar()":{"returns":{"_0":"Current blob base fee scalar."}},"decimals()":{"returns":{"_0":"Number of decimals used in the scalar."}},"gasPrice()":{"returns":{"_0":"Current L2 gas price (base fee)."}},"getL1Fee(bytes)":{"params":{"_data":"Unsigned fully RLP-encoded transaction to get the L1 fee for."},"returns":{"_0":"L1 fee that should be paid for the tx"}},"getL1GasUsed(bytes)":{"params":{"_data":"Unsigned fully RLP-encoded transaction to get the L1 gas for."},"returns":{"_0":"Amount of L1 gas used to publish the transaction."}},"l1BaseFee()":{"returns":{"_0":"Latest known L1 base fee."}},"overhead()":{"returns":{"_0":"Current fee overhead."}},"scalar()":{"returns":{"_0":"Current fee scalar."}}},"title":"GasPriceOracle"},"ast":{"absolutePath":"src/L2/GasPriceOracle.sol","id":90203,"exportedSymbols":{"GasPriceOracle":[90202],"ISemver":[109417],"L1Block":[90318],"Predeploys":[104124]},"nodeType":"SourceUnit","src":"32:6947:144","nodes":[{"id":89830,"nodeType":"PragmaDirective","src":"32:23:144","nodes":[],"literals":["solidity","0.8",".15"]},{"id":89832,"nodeType":"ImportDirective","src":"57:52:144","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":90203,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":89831,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"66:7:144","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":89834,"nodeType":"ImportDirective","src":"110:58:144","nodes":[],"absolutePath":"src/libraries/Predeploys.sol","file":"src/libraries/Predeploys.sol","nameLocation":"-1:-1:-1","scope":90203,"sourceUnit":104125,"symbolAliases":[{"foreign":{"id":89833,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"119:10:144","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":89836,"nodeType":"ImportDirective","src":"169:45:144","nodes":[],"absolutePath":"src/L2/L1Block.sol","file":"src/L2/L1Block.sol","nameLocation":"-1:-1:-1","scope":90203,"sourceUnit":90319,"symbolAliases":[{"foreign":{"id":89835,"name":"L1Block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90318,"src":"178:7:144","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90202,"nodeType":"ContractDefinition","src":"1153:5825:144","nodes":[{"id":89843,"nodeType":"VariableDeclaration","src":"1249:36:144","nodes":[],"constant":true,"documentation":{"id":89840,"nodeType":"StructuredDocumentation","src":"1194:50:144","text":"@notice Number of decimals used in the scalar."},"functionSelector":"2e0f2625","mutability":"constant","name":"DECIMALS","nameLocation":"1273:8:144","scope":90202,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":89841,"name":"uint256","nodeType":"ElementaryTypeName","src":"1249:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"36","id":89842,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1284:1:144","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"visibility":"public"},{"id":89847,"nodeType":"VariableDeclaration","src":"1355:40:144","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":89844,"nodeType":"StructuredDocumentation","src":"1292:58:144","text":"@notice Semantic version.\n @custom:semver 1.2.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"1378:7:144","scope":90202,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":89845,"name":"string","nodeType":"ElementaryTypeName","src":"1355:6:144","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"312e322e30","id":89846,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1388:7:144","typeDescriptions":{"typeIdentifier":"t_stringliteral_e374587661e69268352d25204d81b23ce801573f4b09f3545e69536dc085a37a","typeString":"literal_string \"1.2.0\""},"value":"1.2.0"},"visibility":"public"},{"id":89850,"nodeType":"VariableDeclaration","src":"1486:21:144","nodes":[],"constant":false,"documentation":{"id":89848,"nodeType":"StructuredDocumentation","src":"1402:79:144","text":"@notice Indicates whether the network has gone through the Ecotone upgrade."},"functionSelector":"4ef6e224","mutability":"mutable","name":"isEcotone","nameLocation":"1498:9:144","scope":90202,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":89849,"name":"bool","nodeType":"ElementaryTypeName","src":"1486:4:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"public"},{"id":89870,"nodeType":"FunctionDefinition","src":"1835:196:144","nodes":[],"body":{"id":89869,"nodeType":"Block","src":"1905:126:144","nodes":[],"statements":[{"condition":{"id":89858,"name":"isEcotone","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89850,"src":"1919:9:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":89864,"nodeType":"IfStatement","src":"1915:70:144","trueBody":{"id":89863,"nodeType":"Block","src":"1930:55:144","statements":[{"expression":{"arguments":[{"id":89860,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89853,"src":"1968:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":89859,"name":"_getL1FeeEcotone","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90148,"src":"1951:16:144","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$_t_uint256_$","typeString":"function (bytes memory) view returns (uint256)"}},"id":89861,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1951:23:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":89857,"id":89862,"nodeType":"Return","src":"1944:30:144"}]}},{"expression":{"arguments":[{"id":89866,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89853,"src":"2018:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":89865,"name":"_getL1FeeBedrock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90097,"src":"2001:16:144","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$_t_uint256_$","typeString":"function (bytes memory) view returns (uint256)"}},"id":89867,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2001:23:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":89857,"id":89868,"nodeType":"Return","src":"1994:30:144"}]},"documentation":{"id":89851,"nodeType":"StructuredDocumentation","src":"1514:316:144","text":"@notice Computes the L1 portion of the fee based on the size of the rlp encoded input\n transaction, the current L1 base fee, and the various dynamic parameters.\n @param _data Unsigned fully RLP-encoded transaction to get the L1 fee for.\n @return L1 fee that should be paid for the tx"},"functionSelector":"49948e0e","implemented":true,"kind":"function","modifiers":[],"name":"getL1Fee","nameLocation":"1844:8:144","parameters":{"id":89854,"nodeType":"ParameterList","parameters":[{"constant":false,"id":89853,"mutability":"mutable","name":"_data","nameLocation":"1866:5:144","nodeType":"VariableDeclaration","scope":89870,"src":"1853:18:144","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":89852,"name":"bytes","nodeType":"ElementaryTypeName","src":"1853:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1852:20:144"},"returnParameters":{"id":89857,"nodeType":"ParameterList","parameters":[{"constant":false,"id":89856,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":89870,"src":"1896:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":89855,"name":"uint256","nodeType":"ElementaryTypeName","src":"1896:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1895:9:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":89899,"nodeType":"FunctionDefinition","src":"2115:338:144","nodes":[],"body":{"id":89898,"nodeType":"Block","src":"2146:307:144","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":89883,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":89875,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2177:3:144","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":89876,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2177:10:144","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"expression":{"id":89878,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"2199:10:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":89879,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L1_BLOCK_ATTRIBUTES","nodeType":"MemberAccess","referencedDeclaration":104027,"src":"2199:30:144","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":89877,"name":"L1Block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90318,"src":"2191:7:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1Block_$90318_$","typeString":"type(contract L1Block)"}},"id":89880,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2191:39:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1Block_$90318","typeString":"contract L1Block"}},"id":89881,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"DEPOSITOR_ACCOUNT","nodeType":"MemberAccess","referencedDeclaration":90213,"src":"2191:57:144","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":89882,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2191:59:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2177:73:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"47617350726963654f7261636c653a206f6e6c7920746865206465706f7369746f72206163636f756e742063616e2073657420697345636f746f6e6520666c6167","id":89884,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2264:67:144","typeDescriptions":{"typeIdentifier":"t_stringliteral_a6497d84b1fcb87671ee1e7d83fa633da5bca5b69ea1e0c7b61a9ee91a07700c","typeString":"literal_string \"GasPriceOracle: only the depositor account can set isEcotone flag\""},"value":"GasPriceOracle: only the depositor account can set isEcotone flag"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_a6497d84b1fcb87671ee1e7d83fa633da5bca5b69ea1e0c7b61a9ee91a07700c","typeString":"literal_string \"GasPriceOracle: only the depositor account can set isEcotone flag\""}],"id":89874,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2156:7:144","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":89885,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2156:185:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":89886,"nodeType":"ExpressionStatement","src":"2156:185:144"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":89890,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":89888,"name":"isEcotone","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89850,"src":"2359:9:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"66616c7365","id":89889,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2372:5:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"2359:18:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"47617350726963654f7261636c653a2045636f746f6e6520616c726561647920616374697665","id":89891,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2379:40:144","typeDescriptions":{"typeIdentifier":"t_stringliteral_5923a2a5f6dac6b5f7274d34a2dd94f4b6ab3b4a09fa25eddc1c3f3c5ff8cc39","typeString":"literal_string \"GasPriceOracle: Ecotone already active\""},"value":"GasPriceOracle: Ecotone already active"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5923a2a5f6dac6b5f7274d34a2dd94f4b6ab3b4a09fa25eddc1c3f3c5ff8cc39","typeString":"literal_string \"GasPriceOracle: Ecotone already active\""}],"id":89887,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2351:7:144","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":89892,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2351:69:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":89893,"nodeType":"ExpressionStatement","src":"2351:69:144"},{"expression":{"id":89896,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":89894,"name":"isEcotone","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89850,"src":"2430:9:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":89895,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2442:4:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"2430:16:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":89897,"nodeType":"ExpressionStatement","src":"2430:16:144"}]},"documentation":{"id":89871,"nodeType":"StructuredDocumentation","src":"2037:73:144","text":"@notice Set chain to be Ecotone chain (callable by depositor account)"},"functionSelector":"22b90ab3","implemented":true,"kind":"function","modifiers":[],"name":"setEcotone","nameLocation":"2124:10:144","parameters":{"id":89872,"nodeType":"ParameterList","parameters":[],"src":"2134:2:144"},"returnParameters":{"id":89873,"nodeType":"ParameterList","parameters":[],"src":"2146:0:144"},"scope":90202,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":89909,"nodeType":"FunctionDefinition","src":"2568:87:144","nodes":[],"body":{"id":89908,"nodeType":"Block","src":"2618:37:144","nodes":[],"statements":[{"expression":{"expression":{"id":89905,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2635:5:144","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":89906,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"basefee","nodeType":"MemberAccess","src":"2635:13:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":89904,"id":89907,"nodeType":"Return","src":"2628:20:144"}]},"documentation":{"id":89900,"nodeType":"StructuredDocumentation","src":"2459:104:144","text":"@notice Retrieves the current gas price (base fee).\n @return Current L2 gas price (base fee)."},"functionSelector":"fe173b97","implemented":true,"kind":"function","modifiers":[],"name":"gasPrice","nameLocation":"2577:8:144","parameters":{"id":89901,"nodeType":"ParameterList","parameters":[],"src":"2585:2:144"},"returnParameters":{"id":89904,"nodeType":"ParameterList","parameters":[{"constant":false,"id":89903,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":89909,"src":"2609:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":89902,"name":"uint256","nodeType":"ElementaryTypeName","src":"2609:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2608:9:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":89919,"nodeType":"FunctionDefinition","src":"2746:86:144","nodes":[],"body":{"id":89918,"nodeType":"Block","src":"2795:37:144","nodes":[],"statements":[{"expression":{"expression":{"id":89915,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2812:5:144","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":89916,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"basefee","nodeType":"MemberAccess","src":"2812:13:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":89914,"id":89917,"nodeType":"Return","src":"2805:20:144"}]},"documentation":{"id":89910,"nodeType":"StructuredDocumentation","src":"2661:80:144","text":"@notice Retrieves the current base fee.\n @return Current L2 base fee."},"functionSelector":"6ef25c3a","implemented":true,"kind":"function","modifiers":[],"name":"baseFee","nameLocation":"2755:7:144","parameters":{"id":89911,"nodeType":"ParameterList","parameters":[],"src":"2762:2:144"},"returnParameters":{"id":89914,"nodeType":"ParameterList","parameters":[{"constant":false,"id":89913,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":89919,"src":"2786:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":89912,"name":"uint256","nodeType":"ElementaryTypeName","src":"2786:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2785:9:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":89939,"nodeType":"FunctionDefinition","src":"2951:202:144","nodes":[],"body":{"id":89938,"nodeType":"Block","src":"3001:152:144","nodes":[],"statements":[{"expression":{"arguments":[{"id":89927,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3019:10:144","subExpression":{"id":89926,"name":"isEcotone","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89850,"src":"3020:9:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"47617350726963654f7261636c653a206f7665726865616428292069732064657072656361746564","id":89928,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3031:42:144","typeDescriptions":{"typeIdentifier":"t_stringliteral_25a8f9debbed12be50767fc7babd300130a5ca203afc2f904ec6e57d0959fbbf","typeString":"literal_string \"GasPriceOracle: overhead() is deprecated\""},"value":"GasPriceOracle: overhead() is deprecated"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_25a8f9debbed12be50767fc7babd300130a5ca203afc2f904ec6e57d0959fbbf","typeString":"literal_string \"GasPriceOracle: overhead() is deprecated\""}],"id":89925,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3011:7:144","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":89929,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3011:63:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":89930,"nodeType":"ExpressionStatement","src":"3011:63:144"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"expression":{"id":89932,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"3099:10:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":89933,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L1_BLOCK_ATTRIBUTES","nodeType":"MemberAccess","referencedDeclaration":104027,"src":"3099:30:144","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":89931,"name":"L1Block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90318,"src":"3091:7:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1Block_$90318_$","typeString":"type(contract L1Block)"}},"id":89934,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3091:39:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1Block_$90318","typeString":"contract L1Block"}},"id":89935,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"l1FeeOverhead","nodeType":"MemberAccess","referencedDeclaration":90240,"src":"3091:53:144","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":89936,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3091:55:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":89924,"id":89937,"nodeType":"Return","src":"3084:62:144"}]},"documentation":{"id":89920,"nodeType":"StructuredDocumentation","src":"2838:108:144","text":"@custom:legacy\n @notice Retrieves the current fee overhead.\n @return Current fee overhead."},"functionSelector":"0c18c162","implemented":true,"kind":"function","modifiers":[],"name":"overhead","nameLocation":"2960:8:144","parameters":{"id":89921,"nodeType":"ParameterList","parameters":[],"src":"2968:2:144"},"returnParameters":{"id":89924,"nodeType":"ParameterList","parameters":[{"constant":false,"id":89923,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":89939,"src":"2992:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":89922,"name":"uint256","nodeType":"ElementaryTypeName","src":"2992:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2991:9:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":89959,"nodeType":"FunctionDefinition","src":"3268:196:144","nodes":[],"body":{"id":89958,"nodeType":"Block","src":"3316:148:144","nodes":[],"statements":[{"expression":{"arguments":[{"id":89947,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3334:10:144","subExpression":{"id":89946,"name":"isEcotone","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89850,"src":"3335:9:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"47617350726963654f7261636c653a207363616c617228292069732064657072656361746564","id":89948,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3346:40:144","typeDescriptions":{"typeIdentifier":"t_stringliteral_fdcd11c052395e9256e13a80dcc0e9d323cf16472d08af1bed3d17258d3603d3","typeString":"literal_string \"GasPriceOracle: scalar() is deprecated\""},"value":"GasPriceOracle: scalar() is deprecated"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_fdcd11c052395e9256e13a80dcc0e9d323cf16472d08af1bed3d17258d3603d3","typeString":"literal_string \"GasPriceOracle: scalar() is deprecated\""}],"id":89945,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3326:7:144","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":89949,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3326:61:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":89950,"nodeType":"ExpressionStatement","src":"3326:61:144"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"expression":{"id":89952,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"3412:10:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":89953,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L1_BLOCK_ATTRIBUTES","nodeType":"MemberAccess","referencedDeclaration":104027,"src":"3412:30:144","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":89951,"name":"L1Block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90318,"src":"3404:7:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1Block_$90318_$","typeString":"type(contract L1Block)"}},"id":89954,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3404:39:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1Block_$90318","typeString":"contract L1Block"}},"id":89955,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"l1FeeScalar","nodeType":"MemberAccess","referencedDeclaration":90243,"src":"3404:51:144","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":89956,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3404:53:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":89944,"id":89957,"nodeType":"Return","src":"3397:60:144"}]},"documentation":{"id":89940,"nodeType":"StructuredDocumentation","src":"3159:104:144","text":"@custom:legacy\n @notice Retrieves the current fee scalar.\n @return Current fee scalar."},"functionSelector":"f45e65d8","implemented":true,"kind":"function","modifiers":[],"name":"scalar","nameLocation":"3277:6:144","parameters":{"id":89941,"nodeType":"ParameterList","parameters":[],"src":"3283:2:144"},"returnParameters":{"id":89944,"nodeType":"ParameterList","parameters":[{"constant":false,"id":89943,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":89959,"src":"3307:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":89942,"name":"uint256","nodeType":"ElementaryTypeName","src":"3307:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3306:9:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":89973,"nodeType":"FunctionDefinition","src":"3568:124:144","nodes":[],"body":{"id":89972,"nodeType":"Block","src":"3619:73:144","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"expression":{"id":89966,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"3644:10:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":89967,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L1_BLOCK_ATTRIBUTES","nodeType":"MemberAccess","referencedDeclaration":104027,"src":"3644:30:144","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":89965,"name":"L1Block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90318,"src":"3636:7:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1Block_$90318_$","typeString":"type(contract L1Block)"}},"id":89968,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3636:39:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1Block_$90318","typeString":"contract L1Block"}},"id":89969,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"basefee","nodeType":"MemberAccess","referencedDeclaration":90222,"src":"3636:47:144","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":89970,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3636:49:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":89964,"id":89971,"nodeType":"Return","src":"3629:56:144"}]},"documentation":{"id":89960,"nodeType":"StructuredDocumentation","src":"3470:93:144","text":"@notice Retrieves the latest known L1 base fee.\n @return Latest known L1 base fee."},"functionSelector":"519b4bd3","implemented":true,"kind":"function","modifiers":[],"name":"l1BaseFee","nameLocation":"3577:9:144","parameters":{"id":89961,"nodeType":"ParameterList","parameters":[],"src":"3586:2:144"},"returnParameters":{"id":89964,"nodeType":"ParameterList","parameters":[{"constant":false,"id":89963,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":89973,"src":"3610:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":89962,"name":"uint256","nodeType":"ElementaryTypeName","src":"3610:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3609:9:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":89987,"nodeType":"FunctionDefinition","src":"3790:130:144","nodes":[],"body":{"id":89986,"nodeType":"Block","src":"3843:77:144","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"expression":{"id":89980,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"3868:10:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":89981,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L1_BLOCK_ATTRIBUTES","nodeType":"MemberAccess","referencedDeclaration":104027,"src":"3868:30:144","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":89979,"name":"L1Block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90318,"src":"3860:7:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1Block_$90318_$","typeString":"type(contract L1Block)"}},"id":89982,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3860:39:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1Block_$90318","typeString":"contract L1Block"}},"id":89983,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"blobBaseFee","nodeType":"MemberAccess","referencedDeclaration":90246,"src":"3860:51:144","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":89984,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3860:53:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":89978,"id":89985,"nodeType":"Return","src":"3853:60:144"}]},"documentation":{"id":89974,"nodeType":"StructuredDocumentation","src":"3698:87:144","text":"@notice Retrieves the current blob base fee.\n @return Current blob base fee."},"functionSelector":"f8206140","implemented":true,"kind":"function","modifiers":[],"name":"blobBaseFee","nameLocation":"3799:11:144","parameters":{"id":89975,"nodeType":"ParameterList","parameters":[],"src":"3810:2:144"},"returnParameters":{"id":89978,"nodeType":"ParameterList","parameters":[{"constant":false,"id":89977,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":89987,"src":"3834:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":89976,"name":"uint256","nodeType":"ElementaryTypeName","src":"3834:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3833:9:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":90001,"nodeType":"FunctionDefinition","src":"4022:133:144","nodes":[],"body":{"id":90000,"nodeType":"Block","src":"4076:79:144","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"expression":{"id":89994,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"4101:10:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":89995,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L1_BLOCK_ATTRIBUTES","nodeType":"MemberAccess","referencedDeclaration":104027,"src":"4101:30:144","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":89993,"name":"L1Block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90318,"src":"4093:7:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1Block_$90318_$","typeString":"type(contract L1Block)"}},"id":89996,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4093:39:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1Block_$90318","typeString":"contract L1Block"}},"id":89997,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"baseFeeScalar","nodeType":"MemberAccess","referencedDeclaration":90234,"src":"4093:53:144","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint32_$","typeString":"function () view external returns (uint32)"}},"id":89998,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4093:55:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"functionReturnParameters":89992,"id":89999,"nodeType":"Return","src":"4086:62:144"}]},"documentation":{"id":89988,"nodeType":"StructuredDocumentation","src":"3926:91:144","text":"@notice Retrieves the current base fee scalar.\n @return Current base fee scalar."},"functionSelector":"c5985918","implemented":true,"kind":"function","modifiers":[],"name":"baseFeeScalar","nameLocation":"4031:13:144","parameters":{"id":89989,"nodeType":"ParameterList","parameters":[],"src":"4044:2:144"},"returnParameters":{"id":89992,"nodeType":"ParameterList","parameters":[{"constant":false,"id":89991,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":90001,"src":"4068:6:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":89990,"name":"uint32","nodeType":"ElementaryTypeName","src":"4068:6:144","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"4067:8:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":90015,"nodeType":"FunctionDefinition","src":"4267:141:144","nodes":[],"body":{"id":90014,"nodeType":"Block","src":"4325:83:144","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"expression":{"id":90008,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"4350:10:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":90009,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L1_BLOCK_ATTRIBUTES","nodeType":"MemberAccess","referencedDeclaration":104027,"src":"4350:30:144","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90007,"name":"L1Block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90318,"src":"4342:7:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1Block_$90318_$","typeString":"type(contract L1Block)"}},"id":90010,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4342:39:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1Block_$90318","typeString":"contract L1Block"}},"id":90011,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"blobBaseFeeScalar","nodeType":"MemberAccess","referencedDeclaration":90231,"src":"4342:57:144","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint32_$","typeString":"function () view external returns (uint32)"}},"id":90012,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4342:59:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"functionReturnParameters":90006,"id":90013,"nodeType":"Return","src":"4335:66:144"}]},"documentation":{"id":90002,"nodeType":"StructuredDocumentation","src":"4161:101:144","text":"@notice Retrieves the current blob base fee scalar.\n @return Current blob base fee scalar."},"functionSelector":"68d5dca6","implemented":true,"kind":"function","modifiers":[],"name":"blobBaseFeeScalar","nameLocation":"4276:17:144","parameters":{"id":90003,"nodeType":"ParameterList","parameters":[],"src":"4293:2:144"},"returnParameters":{"id":90006,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90005,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":90015,"src":"4317:6:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":90004,"name":"uint32","nodeType":"ElementaryTypeName","src":"4317:6:144","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"4316:8:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":90024,"nodeType":"FunctionDefinition","src":"4561:82:144","nodes":[],"body":{"id":90023,"nodeType":"Block","src":"4611:32:144","nodes":[],"statements":[{"expression":{"id":90021,"name":"DECIMALS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89843,"src":"4628:8:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":90020,"id":90022,"nodeType":"Return","src":"4621:15:144"}]},"documentation":{"id":90016,"nodeType":"StructuredDocumentation","src":"4414:142:144","text":"@custom:legacy\n @notice Retrieves the number of decimals used in the scalar.\n @return Number of decimals used in the scalar."},"functionSelector":"313ce567","implemented":true,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"4570:8:144","parameters":{"id":90017,"nodeType":"ParameterList","parameters":[],"src":"4578:2:144"},"returnParameters":{"id":90020,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90019,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":90024,"src":"4602:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90018,"name":"uint256","nodeType":"ElementaryTypeName","src":"4602:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4601:9:144"},"scope":90202,"stateMutability":"pure","virtual":false,"visibility":"public"},{"id":90053,"nodeType":"FunctionDefinition","src":"4975:280:144","nodes":[],"body":{"id":90052,"nodeType":"Block","src":"5047:208:144","nodes":[],"statements":[{"assignments":[90033],"declarations":[{"constant":false,"id":90033,"mutability":"mutable","name":"l1GasUsed","nameLocation":"5065:9:144","nodeType":"VariableDeclaration","scope":90052,"src":"5057:17:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90032,"name":"uint256","nodeType":"ElementaryTypeName","src":"5057:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":90037,"initialValue":{"arguments":[{"id":90035,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90027,"src":"5093:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":90034,"name":"_getCalldataGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90201,"src":"5077:15:144","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_uint256_$","typeString":"function (bytes memory) pure returns (uint256)"}},"id":90036,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5077:22:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5057:42:144"},{"condition":{"id":90038,"name":"isEcotone","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89850,"src":"5113:9:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":90042,"nodeType":"IfStatement","src":"5109:56:144","trueBody":{"id":90041,"nodeType":"Block","src":"5124:41:144","statements":[{"expression":{"id":90039,"name":"l1GasUsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90033,"src":"5145:9:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":90031,"id":90040,"nodeType":"Return","src":"5138:16:144"}]}},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90050,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90043,"name":"l1GasUsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90033,"src":"5181:9:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"expression":{"id":90045,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"5201:10:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":90046,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L1_BLOCK_ATTRIBUTES","nodeType":"MemberAccess","referencedDeclaration":104027,"src":"5201:30:144","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90044,"name":"L1Block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90318,"src":"5193:7:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1Block_$90318_$","typeString":"type(contract L1Block)"}},"id":90047,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5193:39:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1Block_$90318","typeString":"contract L1Block"}},"id":90048,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"l1FeeOverhead","nodeType":"MemberAccess","referencedDeclaration":90240,"src":"5193:53:144","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":90049,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5193:55:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5181:67:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":90031,"id":90051,"nodeType":"Return","src":"5174:74:144"}]},"documentation":{"id":90025,"nodeType":"StructuredDocumentation","src":"4649:321:144","text":"@notice Computes the amount of L1 gas used for a transaction. Adds 68 bytes\n of padding to account for the fact that the input does not have a signature.\n @param _data Unsigned fully RLP-encoded transaction to get the L1 gas for.\n @return Amount of L1 gas used to publish the transaction."},"functionSelector":"de26c4a1","implemented":true,"kind":"function","modifiers":[],"name":"getL1GasUsed","nameLocation":"4984:12:144","parameters":{"id":90028,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90027,"mutability":"mutable","name":"_data","nameLocation":"5010:5:144","nodeType":"VariableDeclaration","scope":90053,"src":"4997:18:144","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":90026,"name":"bytes","nodeType":"ElementaryTypeName","src":"4997:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4996:20:144"},"returnParameters":{"id":90031,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90030,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":90053,"src":"5038:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90029,"name":"uint256","nodeType":"ElementaryTypeName","src":"5038:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5037:9:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":90097,"nodeType":"FunctionDefinition","src":"5468:351:144","nodes":[],"body":{"id":90096,"nodeType":"Block","src":"5546:273:144","nodes":[],"statements":[{"assignments":[90062],"declarations":[{"constant":false,"id":90062,"mutability":"mutable","name":"l1GasUsed","nameLocation":"5564:9:144","nodeType":"VariableDeclaration","scope":90096,"src":"5556:17:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90061,"name":"uint256","nodeType":"ElementaryTypeName","src":"5556:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":90066,"initialValue":{"arguments":[{"id":90064,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90056,"src":"5592:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":90063,"name":"_getCalldataGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90201,"src":"5576:15:144","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_uint256_$","typeString":"function (bytes memory) pure returns (uint256)"}},"id":90065,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5576:22:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5556:42:144"},{"assignments":[90068],"declarations":[{"constant":false,"id":90068,"mutability":"mutable","name":"fee","nameLocation":"5616:3:144","nodeType":"VariableDeclaration","scope":90096,"src":"5608:11:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90067,"name":"uint256","nodeType":"ElementaryTypeName","src":"5608:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":90088,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90087,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90080,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90076,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90069,"name":"l1GasUsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90062,"src":"5623:9:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"expression":{"id":90071,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"5643:10:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":90072,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L1_BLOCK_ATTRIBUTES","nodeType":"MemberAccess","referencedDeclaration":104027,"src":"5643:30:144","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90070,"name":"L1Block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90318,"src":"5635:7:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1Block_$90318_$","typeString":"type(contract L1Block)"}},"id":90073,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5635:39:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1Block_$90318","typeString":"contract L1Block"}},"id":90074,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"l1FeeOverhead","nodeType":"MemberAccess","referencedDeclaration":90240,"src":"5635:53:144","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":90075,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5635:55:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5623:67:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":90077,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5622:69:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":90078,"name":"l1BaseFee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89973,"src":"5694:9:144","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":90079,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5694:11:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5622:83:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"expression":{"id":90082,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"5728:10:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":90083,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L1_BLOCK_ATTRIBUTES","nodeType":"MemberAccess","referencedDeclaration":104027,"src":"5728:30:144","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90081,"name":"L1Block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90318,"src":"5720:7:144","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1Block_$90318_$","typeString":"type(contract L1Block)"}},"id":90084,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5720:39:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1Block_$90318","typeString":"contract L1Block"}},"id":90085,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"l1FeeScalar","nodeType":"MemberAccess","referencedDeclaration":90243,"src":"5720:51:144","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":90086,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5720:53:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5622:151:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5608:165:144"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90094,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90089,"name":"fee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90068,"src":"5790:3:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90092,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":90090,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5797:2:144","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"id":90091,"name":"DECIMALS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89843,"src":"5803:8:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5797:14:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":90093,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"5796:16:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5790:22:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":90060,"id":90095,"nodeType":"Return","src":"5783:29:144"}]},"documentation":{"id":90054,"nodeType":"StructuredDocumentation","src":"5261:202:144","text":"@notice Computation of the L1 portion of the fee for Bedrock.\n @param _data Unsigned fully RLP-encoded transaction to get the L1 fee for.\n @return L1 fee that should be paid for the tx"},"implemented":true,"kind":"function","modifiers":[],"name":"_getL1FeeBedrock","nameLocation":"5477:16:144","parameters":{"id":90057,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90056,"mutability":"mutable","name":"_data","nameLocation":"5507:5:144","nodeType":"VariableDeclaration","scope":90097,"src":"5494:18:144","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":90055,"name":"bytes","nodeType":"ElementaryTypeName","src":"5494:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5493:20:144"},"returnParameters":{"id":90060,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90059,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":90097,"src":"5537:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90058,"name":"uint256","nodeType":"ElementaryTypeName","src":"5537:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5536:9:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":90148,"nodeType":"FunctionDefinition","src":"6015:393:144","nodes":[],"body":{"id":90147,"nodeType":"Block","src":"6093:315:144","nodes":[],"statements":[{"assignments":[90106],"declarations":[{"constant":false,"id":90106,"mutability":"mutable","name":"l1GasUsed","nameLocation":"6111:9:144","nodeType":"VariableDeclaration","scope":90147,"src":"6103:17:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90105,"name":"uint256","nodeType":"ElementaryTypeName","src":"6103:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":90110,"initialValue":{"arguments":[{"id":90108,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90100,"src":"6139:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":90107,"name":"_getCalldataGas","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90201,"src":"6123:15:144","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_uint256_$","typeString":"function (bytes memory) pure returns (uint256)"}},"id":90109,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6123:22:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6103:42:144"},{"assignments":[90112],"declarations":[{"constant":false,"id":90112,"mutability":"mutable","name":"scaledBaseFee","nameLocation":"6163:13:144","nodeType":"VariableDeclaration","scope":90147,"src":"6155:21:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90111,"name":"uint256","nodeType":"ElementaryTypeName","src":"6155:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":90120,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90119,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":90116,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":90113,"name":"baseFeeScalar","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90001,"src":"6179:13:144","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint32_$","typeString":"function () view returns (uint32)"}},"id":90114,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6179:15:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"3136","id":90115,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6197:2:144","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"6179:20:144","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":90117,"name":"l1BaseFee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89973,"src":"6202:9:144","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":90118,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6202:11:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6179:34:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6155:58:144"},{"assignments":[90122],"declarations":[{"constant":false,"id":90122,"mutability":"mutable","name":"scaledBlobBaseFee","nameLocation":"6231:17:144","nodeType":"VariableDeclaration","scope":90147,"src":"6223:25:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90121,"name":"uint256","nodeType":"ElementaryTypeName","src":"6223:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":90128,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90127,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":90123,"name":"blobBaseFeeScalar","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90015,"src":"6251:17:144","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint32_$","typeString":"function () view returns (uint32)"}},"id":90124,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6251:19:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":90125,"name":"blobBaseFee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89987,"src":"6273:11:144","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":90126,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6273:13:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6251:35:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6223:63:144"},{"assignments":[90130],"declarations":[{"constant":false,"id":90130,"mutability":"mutable","name":"fee","nameLocation":"6304:3:144","nodeType":"VariableDeclaration","scope":90147,"src":"6296:11:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90129,"name":"uint256","nodeType":"ElementaryTypeName","src":"6296:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":90137,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90136,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90131,"name":"l1GasUsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90106,"src":"6310:9:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90134,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90132,"name":"scaledBaseFee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90112,"src":"6323:13:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":90133,"name":"scaledBlobBaseFee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90122,"src":"6339:17:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6323:33:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":90135,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6322:35:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6310:47:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6296:61:144"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90145,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90138,"name":"fee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90130,"src":"6374:3:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90143,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3136","id":90139,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6381:2:144","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90142,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":90140,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6386:2:144","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"id":90141,"name":"DECIMALS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89843,"src":"6392:8:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6386:14:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6381:19:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":90144,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6380:21:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6374:27:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":90104,"id":90146,"nodeType":"Return","src":"6367:34:144"}]},"documentation":{"id":90098,"nodeType":"StructuredDocumentation","src":"5825:185:144","text":"@notice L1 portion of the fee after Ecotone.\n @param _data Unsigned fully RLP-encoded transaction to get the L1 fee for.\n @return L1 fee that should be paid for the tx"},"implemented":true,"kind":"function","modifiers":[],"name":"_getL1FeeEcotone","nameLocation":"6024:16:144","parameters":{"id":90101,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90100,"mutability":"mutable","name":"_data","nameLocation":"6054:5:144","nodeType":"VariableDeclaration","scope":90148,"src":"6041:18:144","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":90099,"name":"bytes","nodeType":"ElementaryTypeName","src":"6041:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6040:20:144"},"returnParameters":{"id":90104,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90103,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":90148,"src":"6084:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90102,"name":"uint256","nodeType":"ElementaryTypeName","src":"6084:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6083:9:144"},"scope":90202,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":90201,"nodeType":"FunctionDefinition","src":"6610:366:144","nodes":[],"body":{"id":90200,"nodeType":"Block","src":"6687:289:144","nodes":[],"statements":[{"assignments":[90157],"declarations":[{"constant":false,"id":90157,"mutability":"mutable","name":"total","nameLocation":"6705:5:144","nodeType":"VariableDeclaration","scope":90200,"src":"6697:13:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90156,"name":"uint256","nodeType":"ElementaryTypeName","src":"6697:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":90159,"initialValue":{"hexValue":"30","id":90158,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6713:1:144","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6697:17:144"},{"assignments":[90161],"declarations":[{"constant":false,"id":90161,"mutability":"mutable","name":"length","nameLocation":"6732:6:144","nodeType":"VariableDeclaration","scope":90200,"src":"6724:14:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90160,"name":"uint256","nodeType":"ElementaryTypeName","src":"6724:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":90164,"initialValue":{"expression":{"id":90162,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90151,"src":"6741:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":90163,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"6741:12:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6724:29:144"},{"body":{"id":90191,"nodeType":"Block","src":"6800:136:144","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":90179,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":90175,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90151,"src":"6818:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":90177,"indexExpression":{"id":90176,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90166,"src":"6824:1:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6818:8:144","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":90178,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6830:1:144","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6818:13:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":90189,"nodeType":"Block","src":"6882:44:144","statements":[{"expression":{"id":90187,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":90185,"name":"total","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90157,"src":"6900:5:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3136","id":90186,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6909:2:144","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"6900:11:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":90188,"nodeType":"ExpressionStatement","src":"6900:11:144"}]},"id":90190,"nodeType":"IfStatement","src":"6814:112:144","trueBody":{"id":90184,"nodeType":"Block","src":"6833:43:144","statements":[{"expression":{"id":90182,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":90180,"name":"total","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90157,"src":"6851:5:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"34","id":90181,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6860:1:144","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"6851:10:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":90183,"nodeType":"ExpressionStatement","src":"6851:10:144"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90171,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90169,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90166,"src":"6783:1:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":90170,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90161,"src":"6787:6:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6783:10:144","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":90192,"initializationExpression":{"assignments":[90166],"declarations":[{"constant":false,"id":90166,"mutability":"mutable","name":"i","nameLocation":"6776:1:144","nodeType":"VariableDeclaration","scope":90192,"src":"6768:9:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90165,"name":"uint256","nodeType":"ElementaryTypeName","src":"6768:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":90168,"initialValue":{"hexValue":"30","id":90167,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6780:1:144","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6768:13:144"},"loopExpression":{"expression":{"id":90173,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6795:3:144","subExpression":{"id":90172,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90166,"src":"6795:1:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":90174,"nodeType":"ExpressionStatement","src":"6795:3:144"},"nodeType":"ForStatement","src":"6763:173:144"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":90198,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90193,"name":"total","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90157,"src":"6952:5:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_1088_by_1","typeString":"int_const 1088"},"id":90196,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3638","id":90194,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6961:2:144","typeDescriptions":{"typeIdentifier":"t_rational_68_by_1","typeString":"int_const 68"},"value":"68"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"3136","id":90195,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6966:2:144","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"6961:7:144","typeDescriptions":{"typeIdentifier":"t_rational_1088_by_1","typeString":"int_const 1088"}}],"id":90197,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6960:9:144","typeDescriptions":{"typeIdentifier":"t_rational_1088_by_1","typeString":"int_const 1088"}},"src":"6952:17:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":90155,"id":90199,"nodeType":"Return","src":"6945:24:144"}]},"documentation":{"id":90149,"nodeType":"StructuredDocumentation","src":"6414:191:144","text":"@notice L1 gas estimation calculation.\n @param _data Unsigned fully RLP-encoded transaction to get the L1 gas for.\n @return Amount of L1 gas used to publish the transaction."},"implemented":true,"kind":"function","modifiers":[],"name":"_getCalldataGas","nameLocation":"6619:15:144","parameters":{"id":90152,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90151,"mutability":"mutable","name":"_data","nameLocation":"6648:5:144","nodeType":"VariableDeclaration","scope":90201,"src":"6635:18:144","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":90150,"name":"bytes","nodeType":"ElementaryTypeName","src":"6635:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6634:20:144"},"returnParameters":{"id":90155,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90154,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":90201,"src":"6678:7:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90153,"name":"uint256","nodeType":"ElementaryTypeName","src":"6678:7:144","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6677:9:144"},"scope":90202,"stateMutability":"pure","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[{"baseName":{"id":89838,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"1180:7:144"},"id":89839,"nodeType":"InheritanceSpecifier","src":"1180:7:144"}],"canonicalName":"GasPriceOracle","contractDependencies":[],"contractKind":"contract","documentation":{"id":89837,"nodeType":"StructuredDocumentation","src":"216:937:144","text":"@custom:proxied\n @custom:predeploy 0x420000000000000000000000000000000000000F\n @title GasPriceOracle\n @notice This contract maintains the variables responsible for computing the L1 portion of the\n total fee charged on L2. Before Bedrock, this contract held variables in state that were\n read during the state transition function to compute the L1 portion of the transaction\n fee. After Bedrock, this contract now simply proxies the L1Block contract, which has\n the values used to compute the L1 portion of the fee in its state.\n The contract exposes an API that is useful for knowing how large the L1 portion of the\n transaction fee will be. The following events were deprecated with Bedrock:\n - event OverheadUpdated(uint256 overhead);\n - event ScalarUpdated(uint256 scalar);\n - event DecimalsUpdated(uint256 decimals);"},"fullyImplemented":true,"linearizedBaseContracts":[90202,109417],"name":"GasPriceOracle","nameLocation":"1162:14:144","scope":90203,"usedErrors":[]}],"license":"MIT"},"id":144} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/L1Block.json b/packages/sdk/src/forge-artifacts/L1Block.json new file mode 100644 index 000000000000..c62500ca1155 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/L1Block.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"DEPOSITOR_ACCOUNT","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"baseFeeScalar","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"basefee","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"batcherHash","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"blobBaseFee","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"blobBaseFeeScalar","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"hash","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"l1FeeOverhead","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"l1FeeScalar","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"number","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"sequenceNumber","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"setL1BlockValues","inputs":[{"name":"_number","type":"uint64","internalType":"uint64"},{"name":"_timestamp","type":"uint64","internalType":"uint64"},{"name":"_basefee","type":"uint256","internalType":"uint256"},{"name":"_hash","type":"bytes32","internalType":"bytes32"},{"name":"_sequenceNumber","type":"uint64","internalType":"uint64"},{"name":"_batcherHash","type":"bytes32","internalType":"bytes32"},{"name":"_l1FeeOverhead","type":"uint256","internalType":"uint256"},{"name":"_l1FeeScalar","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setL1BlockValuesEcotone","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"timestamp","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061053e806100206000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638381f58a11610097578063c598591811610066578063c598591814610229578063e591b28214610249578063e81b2c6d14610289578063f82061401461029257600080fd5b80638381f58a146101e35780638b239f73146101f75780639e8c496614610200578063b80777ea1461020957600080fd5b806354fd4d50116100d357806354fd4d50146101335780635cf249691461017c57806364ca23ef1461018557806368d5dca6146101b257600080fd5b8063015d8eb9146100fa57806309bd5a601461010f578063440a5e201461012b575b600080fd5b61010d61010836600461044c565b61029b565b005b61011860025481565b6040519081526020015b60405180910390f35b61010d6103da565b61016f6040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161012291906104be565b61011860015481565b6003546101999067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610122565b6003546101ce9068010000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610122565b6000546101999067ffffffffffffffff1681565b61011860055481565b61011860065481565b6000546101999068010000000000000000900467ffffffffffffffff1681565b6003546101ce906c01000000000000000000000000900463ffffffff1681565b61026473deaddeaddeaddeaddeaddeaddeaddeaddead000181565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610122565b61011860045481565b61011860075481565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c7565730000000000606482015260840160405180910390fd5b6000805467ffffffffffffffff98891668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116998916999099179890981790975560019490945560029290925560038054919094167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009190911617909255600491909155600555600655565b3373deaddeaddeaddeaddeaddeaddeaddeaddead00011461040357633cc50b456000526004601cfd5b60043560801c60035560143560801c600055602435600155604435600755606435600255608435600455565b803567ffffffffffffffff8116811461044757600080fd5b919050565b600080600080600080600080610100898b03121561046957600080fd5b6104728961042f565b975061048060208a0161042f565b9650604089013595506060890135945061049c60808a0161042f565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600060208083528351808285015260005b818110156104eb578581018301518582016040015282016104cf565b818111156104fd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a","sourceMap":"588:4256:145:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80638381f58a11610097578063c598591811610066578063c598591814610229578063e591b28214610249578063e81b2c6d14610289578063f82061401461029257600080fd5b80638381f58a146101e35780638b239f73146101f75780639e8c496614610200578063b80777ea1461020957600080fd5b806354fd4d50116100d357806354fd4d50146101335780635cf249691461017c57806364ca23ef1461018557806368d5dca6146101b257600080fd5b8063015d8eb9146100fa57806309bd5a601461010f578063440a5e201461012b575b600080fd5b61010d61010836600461044c565b61029b565b005b61011860025481565b6040519081526020015b60405180910390f35b61010d6103da565b61016f6040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161012291906104be565b61011860015481565b6003546101999067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610122565b6003546101ce9068010000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610122565b6000546101999067ffffffffffffffff1681565b61011860055481565b61011860065481565b6000546101999068010000000000000000900467ffffffffffffffff1681565b6003546101ce906c01000000000000000000000000900463ffffffff1681565b61026473deaddeaddeaddeaddeaddeaddeaddeaddead000181565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610122565b61011860045481565b61011860075481565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c7565730000000000606482015260840160405180910390fd5b6000805467ffffffffffffffff98891668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116998916999099179890981790975560019490945560029290925560038054919094167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009190911617909255600491909155600555600655565b3373deaddeaddeaddeaddeaddeaddeaddeaddead00011461040357633cc50b456000526004601cfd5b60043560801c60035560143560801c600055602435600155604435600755606435600255608435600455565b803567ffffffffffffffff8116811461044757600080fd5b919050565b600080600080600080600080610100898b03121561046957600080fd5b6104728961042f565b975061048060208a0161042f565b9650604089013595506060890135945061049c60808a0161042f565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600060208083528351808285015260005b818110156104eb578581018301518582016040015282016104cf565b818111156104fd576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a","sourceMap":"588:4256:145:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2494:660;;;;;;:::i;:::-;;:::i;:::-;;1071:19;;;;;;;;;1014:25:357;;;1002:2;987:18;1071:19:145;;;;;;;;3886:956;;;:::i;1961:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1001:22::-;;;;;;1156:28;;;;;;;;;;;;2067:18:357;2055:31;;;2037:50;;2025:2;2010:18;1156:28:145;1893:200:357;1298:31:145;;;;;;;;;;;;;;;2272:10:357;2260:23;;;2242:42;;2230:2;2215:18;1298:31:145;2098:192:357;840:20:145;;;;;;;;;1680:28;;;;;;1821:26;;;;;;931:23;;;;;;;;;;;;1438:27;;;;;;;;;;;;680:86;;724:42;680:86;;;;;2471:42:357;2459:55;;;2441:74;;2429:2;2414:18;680:86:145;2295:226:357;1539:26:145;;;;;;1899;;;;;;2494:660;2789:10;724:42;2789:31;2781:103;;;;;;;2728:2:357;2781:103:145;;;2710:21:357;2767:2;2747:18;;;2740:30;2806:34;2786:18;;;2779:62;2877:29;2857:18;;;2850:57;2924:19;;2781:103:145;;;;;;;;2895:6;:16;;;2921:22;;;;;;;;;2895:16;;;2921:22;;;;;;;;;;;2895:16;2953:18;;;;2981:4;:12;;;;3003:14;:32;;;;;;2895:16;3003:32;;;;;;;;3045:11;:26;;;;3081:13;:30;3121:11;:26;2494:660::o;3886:956::-;4036:8;4046:17;4029:233;;;4096:10;4090:4;4083:24;4194:4;4188;4181:18;4029:233;4453:1;4440:15;4435:3;4431:25;4410:19;4403:54;4566:2;4553:16;4548:3;4544:26;4531:11;4524:47;4618:2;4605:16;4591:12;4584:38;4684:2;4671:16;4653;4646:42;4743:3;4730:17;4719:9;4712:36;4810:3;4797:17;4779:16;4772:43;3886:956::o;14:171:357:-;81:20;;141:18;130:30;;120:41;;110:69;;175:1;172;165:12;110:69;14:171;;;:::o;190:673::-;309:6;317;325;333;341;349;357;365;418:3;406:9;397:7;393:23;389:33;386:53;;;435:1;432;425:12;386:53;458:28;476:9;458:28;:::i;:::-;448:38;;505:37;538:2;527:9;523:18;505:37;:::i;:::-;495:47;;589:2;578:9;574:18;561:32;551:42;;640:2;629:9;625:18;612:32;602:42;;663:38;696:3;685:9;681:19;663:38;:::i;:::-;190:673;;;;-1:-1:-1;190:673:357;;;;653:48;748:3;733:19;;720:33;;-1:-1:-1;800:3:357;785:19;;772:33;;852:3;837:19;824:33;;-1:-1:-1;190:673:357;-1:-1:-1;;190:673:357:o;1050:656::-;1162:4;1191:2;1220;1209:9;1202:21;1252:6;1246:13;1295:6;1290:2;1279:9;1275:18;1268:34;1320:1;1330:140;1344:6;1341:1;1338:13;1330:140;;;1439:14;;;1435:23;;1429:30;1405:17;;;1424:2;1401:26;1394:66;1359:10;;1330:140;;;1488:6;1485:1;1482:13;1479:91;;;1558:1;1553:2;1544:6;1533:9;1529:22;1525:31;1518:42;1479:91;-1:-1:-1;1622:2:357;1610:15;1627:66;1606:88;1591:104;;;;1697:2;1587:113;;1050:656;-1:-1:-1;;;1050:656:357:o","linkReferences":{}},"methodIdentifiers":{"DEPOSITOR_ACCOUNT()":"e591b282","baseFeeScalar()":"c5985918","basefee()":"5cf24969","batcherHash()":"e81b2c6d","blobBaseFee()":"f8206140","blobBaseFeeScalar()":"68d5dca6","hash()":"09bd5a60","l1FeeOverhead()":"8b239f73","l1FeeScalar()":"9e8c4966","number()":"8381f58a","sequenceNumber()":"64ca23ef","setL1BlockValues(uint64,uint64,uint256,bytes32,uint64,bytes32,uint256,uint256)":"015d8eb9","setL1BlockValuesEcotone()":"440a5e20","timestamp()":"b80777ea","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"DEPOSITOR_ACCOUNT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseFeeScalar\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"basefee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batcherHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blobBaseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blobBaseFeeScalar\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"hash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1FeeOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1FeeScalar\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"number\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_number\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"_timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_basefee\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"_sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_batcherHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l1FeeOverhead\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l1FeeScalar\",\"type\":\"uint256\"}],\"name\":\"setL1BlockValues\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"setL1BlockValuesEcotone\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:proxied\":\"@custom:predeploy 0x4200000000000000000000000000000000000015\",\"kind\":\"dev\",\"methods\":{\"setL1BlockValues(uint64,uint64,uint256,bytes32,uint64,bytes32,uint256,uint256)\":{\"custom:legacy\":\"@notice Updates the L1 block values.\",\"params\":{\"_basefee\":\"L1 basefee.\",\"_batcherHash\":\"Versioned hash to authenticate batcher by.\",\"_hash\":\"L1 blockhash.\",\"_l1FeeOverhead\":\"L1 fee overhead.\",\"_l1FeeScalar\":\"L1 fee scalar.\",\"_number\":\"L1 blocknumber.\",\"_sequenceNumber\":\"Number of L2 blocks since epoch start.\",\"_timestamp\":\"L1 timestamp.\"}}},\"stateVariables\":{\"l1FeeOverhead\":{\"custom:legacy\":\"\"},\"l1FeeScalar\":{\"custom:legacy\":\"\"},\"version\":{\"custom:semver\":\"1.2.0\"}},\"title\":\"L1Block\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"DEPOSITOR_ACCOUNT()\":{\"notice\":\"Address of the special depositor account.\"},\"baseFeeScalar()\":{\"notice\":\"The scalar value applied to the L1 base fee portion of the blob-capable L1 cost func.\"},\"basefee()\":{\"notice\":\"The latest L1 base fee.\"},\"batcherHash()\":{\"notice\":\"The versioned hash to authenticate the batcher by.\"},\"blobBaseFee()\":{\"notice\":\"The latest L1 blob base fee.\"},\"blobBaseFeeScalar()\":{\"notice\":\"The scalar value applied to the L1 blob base fee portion of the blob-capable L1 cost func.\"},\"hash()\":{\"notice\":\"The latest L1 blockhash.\"},\"l1FeeOverhead()\":{\"notice\":\"The overhead value applied to the L1 portion of the transaction fee.\"},\"l1FeeScalar()\":{\"notice\":\"The scalar value applied to the L1 portion of the transaction fee.\"},\"number()\":{\"notice\":\"The latest L1 block number known by the L2 system.\"},\"sequenceNumber()\":{\"notice\":\"The number of L2 blocks in the same epoch.\"},\"setL1BlockValuesEcotone()\":{\"notice\":\"Updates the L1 block values for an Ecotone upgraded chain. Params are packed and passed in as raw msg.data instead of ABI to reduce calldata size. Params are expected to be in the following order: 1. _baseFeeScalar L1 base fee scalar 2. _blobBaseFeeScalar L1 blob base fee scalar 3. _sequenceNumber Number of L2 blocks since epoch start. 4. _timestamp L1 timestamp. 5. _number L1 blocknumber. 6. _basefee L1 base fee. 7. _blobBaseFee L1 blob base fee. 8. _hash L1 blockhash. 9. _batcherHash Versioned hash to authenticate batcher by.\"},\"timestamp()\":{\"notice\":\"The latest L1 timestamp known by the L2 system.\"}},\"notice\":\"The L1Block predeploy gives users access to information about the last known L1 block. Values within this contract are updated once per epoch (every L1 block) and can only be set by the \\\"depositor\\\" account, a special system address. Depositor account transactions are created by the protocol whenever we move to a new epoch.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L2/L1Block.sol\":\"L1Block\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"src/L2/L1Block.sol\":{\"keccak256\":\"0x5819beb85b23c31c5f5d639977bf5d5cf6768975d6d3eecde78299f37ba04cd6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://55cdc404753dcc0cd9d3fac3554a4a16abd7dc39f43f7ae0ebcb0990fa52f7e7\",\"dweb:/ipfs/QmNXMUmNBmNCmL5k8tC1jJ6CmY2hZKJ7owFwuvhMKXr5fv\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"view","type":"function","name":"DEPOSITOR_ACCOUNT","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"baseFeeScalar","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"basefee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"batcherHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"blobBaseFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"blobBaseFeeScalar","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"hash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"l1FeeOverhead","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"l1FeeScalar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"number","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"sequenceNumber","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"uint64","name":"_number","type":"uint64"},{"internalType":"uint64","name":"_timestamp","type":"uint64"},{"internalType":"uint256","name":"_basefee","type":"uint256"},{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"uint64","name":"_sequenceNumber","type":"uint64"},{"internalType":"bytes32","name":"_batcherHash","type":"bytes32"},{"internalType":"uint256","name":"_l1FeeOverhead","type":"uint256"},{"internalType":"uint256","name":"_l1FeeScalar","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setL1BlockValues"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"setL1BlockValuesEcotone"},{"inputs":[],"stateMutability":"view","type":"function","name":"timestamp","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"setL1BlockValues(uint64,uint64,uint256,bytes32,uint64,bytes32,uint256,uint256)":{"custom:legacy":"@notice Updates the L1 block values.","params":{"_basefee":"L1 basefee.","_batcherHash":"Versioned hash to authenticate batcher by.","_hash":"L1 blockhash.","_l1FeeOverhead":"L1 fee overhead.","_l1FeeScalar":"L1 fee scalar.","_number":"L1 blocknumber.","_sequenceNumber":"Number of L2 blocks since epoch start.","_timestamp":"L1 timestamp."}}},"version":1},"userdoc":{"kind":"user","methods":{"DEPOSITOR_ACCOUNT()":{"notice":"Address of the special depositor account."},"baseFeeScalar()":{"notice":"The scalar value applied to the L1 base fee portion of the blob-capable L1 cost func."},"basefee()":{"notice":"The latest L1 base fee."},"batcherHash()":{"notice":"The versioned hash to authenticate the batcher by."},"blobBaseFee()":{"notice":"The latest L1 blob base fee."},"blobBaseFeeScalar()":{"notice":"The scalar value applied to the L1 blob base fee portion of the blob-capable L1 cost func."},"hash()":{"notice":"The latest L1 blockhash."},"l1FeeOverhead()":{"notice":"The overhead value applied to the L1 portion of the transaction fee."},"l1FeeScalar()":{"notice":"The scalar value applied to the L1 portion of the transaction fee."},"number()":{"notice":"The latest L1 block number known by the L2 system."},"sequenceNumber()":{"notice":"The number of L2 blocks in the same epoch."},"setL1BlockValuesEcotone()":{"notice":"Updates the L1 block values for an Ecotone upgraded chain. Params are packed and passed in as raw msg.data instead of ABI to reduce calldata size. Params are expected to be in the following order: 1. _baseFeeScalar L1 base fee scalar 2. _blobBaseFeeScalar L1 blob base fee scalar 3. _sequenceNumber Number of L2 blocks since epoch start. 4. _timestamp L1 timestamp. 5. _number L1 blocknumber. 6. _basefee L1 base fee. 7. _blobBaseFee L1 blob base fee. 8. _hash L1 blockhash. 9. _batcherHash Versioned hash to authenticate batcher by."},"timestamp()":{"notice":"The latest L1 timestamp known by the L2 system."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L2/L1Block.sol":"L1Block"},"evmVersion":"london","libraries":{}},"sources":{"src/L2/L1Block.sol":{"keccak256":"0x5819beb85b23c31c5f5d639977bf5d5cf6768975d6d3eecde78299f37ba04cd6","urls":["bzz-raw://55cdc404753dcc0cd9d3fac3554a4a16abd7dc39f43f7ae0ebcb0990fa52f7e7","dweb:/ipfs/QmNXMUmNBmNCmL5k8tC1jJ6CmY2hZKJ7owFwuvhMKXr5fv"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":90216,"contract":"src/L2/L1Block.sol:L1Block","label":"number","offset":0,"slot":"0","type":"t_uint64"},{"astId":90219,"contract":"src/L2/L1Block.sol:L1Block","label":"timestamp","offset":8,"slot":"0","type":"t_uint64"},{"astId":90222,"contract":"src/L2/L1Block.sol:L1Block","label":"basefee","offset":0,"slot":"1","type":"t_uint256"},{"astId":90225,"contract":"src/L2/L1Block.sol:L1Block","label":"hash","offset":0,"slot":"2","type":"t_bytes32"},{"astId":90228,"contract":"src/L2/L1Block.sol:L1Block","label":"sequenceNumber","offset":0,"slot":"3","type":"t_uint64"},{"astId":90231,"contract":"src/L2/L1Block.sol:L1Block","label":"blobBaseFeeScalar","offset":8,"slot":"3","type":"t_uint32"},{"astId":90234,"contract":"src/L2/L1Block.sol:L1Block","label":"baseFeeScalar","offset":12,"slot":"3","type":"t_uint32"},{"astId":90237,"contract":"src/L2/L1Block.sol:L1Block","label":"batcherHash","offset":0,"slot":"4","type":"t_bytes32"},{"astId":90240,"contract":"src/L2/L1Block.sol:L1Block","label":"l1FeeOverhead","offset":0,"slot":"5","type":"t_uint256"},{"astId":90243,"contract":"src/L2/L1Block.sol:L1Block","label":"l1FeeScalar","offset":0,"slot":"6","type":"t_uint256"},{"astId":90246,"contract":"src/L2/L1Block.sol:L1Block","label":"blobBaseFee","offset":0,"slot":"7","type":"t_uint256"}],"types":{"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint32":{"encoding":"inplace","label":"uint32","numberOfBytes":"4"},"t_uint64":{"encoding":"inplace","label":"uint64","numberOfBytes":"8"}}},"userdoc":{"version":1,"kind":"user","methods":{"DEPOSITOR_ACCOUNT()":{"notice":"Address of the special depositor account."},"baseFeeScalar()":{"notice":"The scalar value applied to the L1 base fee portion of the blob-capable L1 cost func."},"basefee()":{"notice":"The latest L1 base fee."},"batcherHash()":{"notice":"The versioned hash to authenticate the batcher by."},"blobBaseFee()":{"notice":"The latest L1 blob base fee."},"blobBaseFeeScalar()":{"notice":"The scalar value applied to the L1 blob base fee portion of the blob-capable L1 cost func."},"hash()":{"notice":"The latest L1 blockhash."},"l1FeeOverhead()":{"notice":"The overhead value applied to the L1 portion of the transaction fee."},"l1FeeScalar()":{"notice":"The scalar value applied to the L1 portion of the transaction fee."},"number()":{"notice":"The latest L1 block number known by the L2 system."},"sequenceNumber()":{"notice":"The number of L2 blocks in the same epoch."},"setL1BlockValuesEcotone()":{"notice":"Updates the L1 block values for an Ecotone upgraded chain. Params are packed and passed in as raw msg.data instead of ABI to reduce calldata size. Params are expected to be in the following order: 1. _baseFeeScalar L1 base fee scalar 2. _blobBaseFeeScalar L1 blob base fee scalar 3. _sequenceNumber Number of L2 blocks since epoch start. 4. _timestamp L1 timestamp. 5. _number L1 blocknumber. 6. _basefee L1 base fee. 7. _blobBaseFee L1 blob base fee. 8. _hash L1 blockhash. 9. _batcherHash Versioned hash to authenticate batcher by."},"timestamp()":{"notice":"The latest L1 timestamp known by the L2 system."}},"notice":"The L1Block predeploy gives users access to information about the last known L1 block. Values within this contract are updated once per epoch (every L1 block) and can only be set by the \"depositor\" account, a special system address. Depositor account transactions are created by the protocol whenever we move to a new epoch."},"devdoc":{"version":1,"kind":"dev","methods":{"setL1BlockValues(uint64,uint64,uint256,bytes32,uint64,bytes32,uint256,uint256)":{"params":{"_basefee":"L1 basefee.","_batcherHash":"Versioned hash to authenticate batcher by.","_hash":"L1 blockhash.","_l1FeeOverhead":"L1 fee overhead.","_l1FeeScalar":"L1 fee scalar.","_number":"L1 blocknumber.","_sequenceNumber":"Number of L2 blocks since epoch start.","_timestamp":"L1 timestamp."}}},"title":"L1Block"},"ast":{"absolutePath":"src/L2/L1Block.sol","id":90319,"exportedSymbols":{"ISemver":[109417],"L1Block":[90318]},"nodeType":"SourceUnit","src":"32:4813:145","nodes":[{"id":90204,"nodeType":"PragmaDirective","src":"32:23:145","nodes":[],"literals":["solidity","0.8",".15"]},{"id":90206,"nodeType":"ImportDirective","src":"57:52:145","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":90319,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":90205,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"66:7:145","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90318,"nodeType":"ContractDefinition","src":"588:4256:145","nodes":[{"id":90213,"nodeType":"VariableDeclaration","src":"680:86:145","nodes":[],"constant":true,"documentation":{"id":90210,"nodeType":"StructuredDocumentation","src":"622:53:145","text":"@notice Address of the special depositor account."},"functionSelector":"e591b282","mutability":"constant","name":"DEPOSITOR_ACCOUNT","nameLocation":"704:17:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90211,"name":"address","nodeType":"ElementaryTypeName","src":"680:7:145","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"hexValue":"307844656144444561444465416444654164444541644445616464654164644541644445416430303031","id":90212,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"724:42:145","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"value":"0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001"},"visibility":"public"},{"id":90216,"nodeType":"VariableDeclaration","src":"840:20:145","nodes":[],"constant":false,"documentation":{"id":90214,"nodeType":"StructuredDocumentation","src":"773:62:145","text":"@notice The latest L1 block number known by the L2 system."},"functionSelector":"8381f58a","mutability":"mutable","name":"number","nameLocation":"854:6:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":90215,"name":"uint64","nodeType":"ElementaryTypeName","src":"840:6:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"public"},{"id":90219,"nodeType":"VariableDeclaration","src":"931:23:145","nodes":[],"constant":false,"documentation":{"id":90217,"nodeType":"StructuredDocumentation","src":"867:59:145","text":"@notice The latest L1 timestamp known by the L2 system."},"functionSelector":"b80777ea","mutability":"mutable","name":"timestamp","nameLocation":"945:9:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":90218,"name":"uint64","nodeType":"ElementaryTypeName","src":"931:6:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"public"},{"id":90222,"nodeType":"VariableDeclaration","src":"1001:22:145","nodes":[],"constant":false,"documentation":{"id":90220,"nodeType":"StructuredDocumentation","src":"961:35:145","text":"@notice The latest L1 base fee."},"functionSelector":"5cf24969","mutability":"mutable","name":"basefee","nameLocation":"1016:7:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90221,"name":"uint256","nodeType":"ElementaryTypeName","src":"1001:7:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":90225,"nodeType":"VariableDeclaration","src":"1071:19:145","nodes":[],"constant":false,"documentation":{"id":90223,"nodeType":"StructuredDocumentation","src":"1030:36:145","text":"@notice The latest L1 blockhash."},"functionSelector":"09bd5a60","mutability":"mutable","name":"hash","nameLocation":"1086:4:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":90224,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1071:7:145","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"public"},{"id":90228,"nodeType":"VariableDeclaration","src":"1156:28:145","nodes":[],"constant":false,"documentation":{"id":90226,"nodeType":"StructuredDocumentation","src":"1097:54:145","text":"@notice The number of L2 blocks in the same epoch."},"functionSelector":"64ca23ef","mutability":"mutable","name":"sequenceNumber","nameLocation":"1170:14:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":90227,"name":"uint64","nodeType":"ElementaryTypeName","src":"1156:6:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"public"},{"id":90231,"nodeType":"VariableDeclaration","src":"1298:31:145","nodes":[],"constant":false,"documentation":{"id":90229,"nodeType":"StructuredDocumentation","src":"1191:102:145","text":"@notice The scalar value applied to the L1 blob base fee portion of the blob-capable L1 cost func."},"functionSelector":"68d5dca6","mutability":"mutable","name":"blobBaseFeeScalar","nameLocation":"1312:17:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":90230,"name":"uint32","nodeType":"ElementaryTypeName","src":"1298:6:145","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"public"},{"id":90234,"nodeType":"VariableDeclaration","src":"1438:27:145","nodes":[],"constant":false,"documentation":{"id":90232,"nodeType":"StructuredDocumentation","src":"1336:97:145","text":"@notice The scalar value applied to the L1 base fee portion of the blob-capable L1 cost func."},"functionSelector":"c5985918","mutability":"mutable","name":"baseFeeScalar","nameLocation":"1452:13:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":90233,"name":"uint32","nodeType":"ElementaryTypeName","src":"1438:6:145","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"public"},{"id":90237,"nodeType":"VariableDeclaration","src":"1539:26:145","nodes":[],"constant":false,"documentation":{"id":90235,"nodeType":"StructuredDocumentation","src":"1472:62:145","text":"@notice The versioned hash to authenticate the batcher by."},"functionSelector":"e81b2c6d","mutability":"mutable","name":"batcherHash","nameLocation":"1554:11:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":90236,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1539:7:145","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"public"},{"id":90240,"nodeType":"VariableDeclaration","src":"1680:28:145","nodes":[],"constant":false,"documentation":{"id":90238,"nodeType":"StructuredDocumentation","src":"1572:103:145","text":"@notice The overhead value applied to the L1 portion of the transaction fee.\n @custom:legacy"},"functionSelector":"8b239f73","mutability":"mutable","name":"l1FeeOverhead","nameLocation":"1695:13:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90239,"name":"uint256","nodeType":"ElementaryTypeName","src":"1680:7:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":90243,"nodeType":"VariableDeclaration","src":"1821:26:145","nodes":[],"constant":false,"documentation":{"id":90241,"nodeType":"StructuredDocumentation","src":"1715:101:145","text":"@notice The scalar value applied to the L1 portion of the transaction fee.\n @custom:legacy"},"functionSelector":"9e8c4966","mutability":"mutable","name":"l1FeeScalar","nameLocation":"1836:11:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90242,"name":"uint256","nodeType":"ElementaryTypeName","src":"1821:7:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":90246,"nodeType":"VariableDeclaration","src":"1899:26:145","nodes":[],"constant":false,"documentation":{"id":90244,"nodeType":"StructuredDocumentation","src":"1854:40:145","text":"@notice The latest L1 blob base fee."},"functionSelector":"f8206140","mutability":"mutable","name":"blobBaseFee","nameLocation":"1914:11:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90245,"name":"uint256","nodeType":"ElementaryTypeName","src":"1899:7:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":90250,"nodeType":"VariableDeclaration","src":"1961:40:145","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":90247,"nodeType":"StructuredDocumentation","src":"1932:24:145","text":"@custom:semver 1.2.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"1984:7:145","scope":90318,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":90248,"name":"string","nodeType":"ElementaryTypeName","src":"1961:6:145","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"312e322e30","id":90249,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1994:7:145","typeDescriptions":{"typeIdentifier":"t_stringliteral_e374587661e69268352d25204d81b23ce801573f4b09f3545e69536dc085a37a","typeString":"literal_string \"1.2.0\""},"value":"1.2.0"},"visibility":"public"},{"id":90311,"nodeType":"FunctionDefinition","src":"2494:660:145","nodes":[],"body":{"id":90310,"nodeType":"Block","src":"2771:383:145","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90274,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":90271,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2789:3:145","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":90272,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2789:10:145","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":90273,"name":"DEPOSITOR_ACCOUNT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90213,"src":"2803:17:145","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2789:31:145","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f756e742063616e20736574204c3120626c6f636b2076616c756573","id":90275,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2822:61:145","typeDescriptions":{"typeIdentifier":"t_stringliteral_c3c76ba7c08c4e35ee9214a1ee03dd5f5eafa75e54f6dcd9b82029d1cceb0d7b","typeString":"literal_string \"L1Block: only the depositor account can set L1 block values\""},"value":"L1Block: only the depositor account can set L1 block values"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c3c76ba7c08c4e35ee9214a1ee03dd5f5eafa75e54f6dcd9b82029d1cceb0d7b","typeString":"literal_string \"L1Block: only the depositor account can set L1 block values\""}],"id":90270,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2781:7:145","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":90276,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2781:103:145","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90277,"nodeType":"ExpressionStatement","src":"2781:103:145"},{"expression":{"id":90280,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":90278,"name":"number","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90216,"src":"2895:6:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":90279,"name":"_number","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90253,"src":"2904:7:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"2895:16:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"id":90281,"nodeType":"ExpressionStatement","src":"2895:16:145"},{"expression":{"id":90284,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":90282,"name":"timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90219,"src":"2921:9:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":90283,"name":"_timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90255,"src":"2933:10:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"2921:22:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"id":90285,"nodeType":"ExpressionStatement","src":"2921:22:145"},{"expression":{"id":90288,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":90286,"name":"basefee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90222,"src":"2953:7:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":90287,"name":"_basefee","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90257,"src":"2963:8:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2953:18:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":90289,"nodeType":"ExpressionStatement","src":"2953:18:145"},{"expression":{"id":90292,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":90290,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90225,"src":"2981:4:145","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":90291,"name":"_hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90259,"src":"2988:5:145","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2981:12:145","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":90293,"nodeType":"ExpressionStatement","src":"2981:12:145"},{"expression":{"id":90296,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":90294,"name":"sequenceNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90228,"src":"3003:14:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":90295,"name":"_sequenceNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90261,"src":"3020:15:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"3003:32:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"id":90297,"nodeType":"ExpressionStatement","src":"3003:32:145"},{"expression":{"id":90300,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":90298,"name":"batcherHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90237,"src":"3045:11:145","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":90299,"name":"_batcherHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90263,"src":"3059:12:145","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"3045:26:145","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":90301,"nodeType":"ExpressionStatement","src":"3045:26:145"},{"expression":{"id":90304,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":90302,"name":"l1FeeOverhead","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90240,"src":"3081:13:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":90303,"name":"_l1FeeOverhead","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90265,"src":"3097:14:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3081:30:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":90305,"nodeType":"ExpressionStatement","src":"3081:30:145"},{"expression":{"id":90308,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":90306,"name":"l1FeeScalar","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90243,"src":"3121:11:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":90307,"name":"_l1FeeScalar","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90267,"src":"3135:12:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3121:26:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":90309,"nodeType":"ExpressionStatement","src":"3121:26:145"}]},"documentation":{"id":90251,"nodeType":"StructuredDocumentation","src":"2008:481:145","text":"@custom:legacy\n @notice Updates the L1 block values.\n @param _number L1 blocknumber.\n @param _timestamp L1 timestamp.\n @param _basefee L1 basefee.\n @param _hash L1 blockhash.\n @param _sequenceNumber Number of L2 blocks since epoch start.\n @param _batcherHash Versioned hash to authenticate batcher by.\n @param _l1FeeOverhead L1 fee overhead.\n @param _l1FeeScalar L1 fee scalar."},"functionSelector":"015d8eb9","implemented":true,"kind":"function","modifiers":[],"name":"setL1BlockValues","nameLocation":"2503:16:145","parameters":{"id":90268,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90253,"mutability":"mutable","name":"_number","nameLocation":"2536:7:145","nodeType":"VariableDeclaration","scope":90311,"src":"2529:14:145","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":90252,"name":"uint64","nodeType":"ElementaryTypeName","src":"2529:6:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"},{"constant":false,"id":90255,"mutability":"mutable","name":"_timestamp","nameLocation":"2560:10:145","nodeType":"VariableDeclaration","scope":90311,"src":"2553:17:145","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":90254,"name":"uint64","nodeType":"ElementaryTypeName","src":"2553:6:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"},{"constant":false,"id":90257,"mutability":"mutable","name":"_basefee","nameLocation":"2588:8:145","nodeType":"VariableDeclaration","scope":90311,"src":"2580:16:145","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90256,"name":"uint256","nodeType":"ElementaryTypeName","src":"2580:7:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":90259,"mutability":"mutable","name":"_hash","nameLocation":"2614:5:145","nodeType":"VariableDeclaration","scope":90311,"src":"2606:13:145","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":90258,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2606:7:145","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":90261,"mutability":"mutable","name":"_sequenceNumber","nameLocation":"2636:15:145","nodeType":"VariableDeclaration","scope":90311,"src":"2629:22:145","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":90260,"name":"uint64","nodeType":"ElementaryTypeName","src":"2629:6:145","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"},{"constant":false,"id":90263,"mutability":"mutable","name":"_batcherHash","nameLocation":"2669:12:145","nodeType":"VariableDeclaration","scope":90311,"src":"2661:20:145","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":90262,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2661:7:145","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":90265,"mutability":"mutable","name":"_l1FeeOverhead","nameLocation":"2699:14:145","nodeType":"VariableDeclaration","scope":90311,"src":"2691:22:145","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90264,"name":"uint256","nodeType":"ElementaryTypeName","src":"2691:7:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":90267,"mutability":"mutable","name":"_l1FeeScalar","nameLocation":"2731:12:145","nodeType":"VariableDeclaration","scope":90311,"src":"2723:20:145","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90266,"name":"uint256","nodeType":"ElementaryTypeName","src":"2723:7:145","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2519:230:145"},"returnParameters":{"id":90269,"nodeType":"ParameterList","parameters":[],"src":"2771:0:145"},"scope":90318,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":90317,"nodeType":"FunctionDefinition","src":"3886:956:145","nodes":[],"body":{"id":90316,"nodeType":"Block","src":"3930:912:145","nodes":[],"statements":[{"AST":{"nodeType":"YulBlock","src":"3949:887:145","statements":[{"body":{"nodeType":"YulBlock","src":"4065:197:145","statements":[{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4090:4:145","type":"","value":"0x00"},{"kind":"number","nodeType":"YulLiteral","src":"4096:10:145","type":"","value":"0x3cc50b45"}],"functionName":{"name":"mstore","nodeType":"YulIdentifier","src":"4083:6:145"},"nodeType":"YulFunctionCall","src":"4083:24:145"},"nodeType":"YulExpressionStatement","src":"4083:24:145"},{"expression":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4188:4:145","type":"","value":"0x1C"},{"kind":"number","nodeType":"YulLiteral","src":"4194:4:145","type":"","value":"0x04"}],"functionName":{"name":"revert","nodeType":"YulIdentifier","src":"4181:6:145"},"nodeType":"YulFunctionCall","src":"4181:18:145"},"nodeType":"YulExpressionStatement","src":"4181:18:145"}]},"condition":{"arguments":[{"arguments":[],"functionName":{"name":"caller","nodeType":"YulIdentifier","src":"4036:6:145"},"nodeType":"YulFunctionCall","src":"4036:8:145"},{"name":"DEPOSITOR_ACCOUNT","nodeType":"YulIdentifier","src":"4046:17:145"}],"functionName":{"name":"xor","nodeType":"YulIdentifier","src":"4032:3:145"},"nodeType":"YulFunctionCall","src":"4032:32:145"},"nodeType":"YulIf","src":"4029:233:145"},{"nodeType":"YulVariableDeclaration","src":"4275:27:145","value":{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4300:1:145","type":"","value":"4"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4287:12:145"},"nodeType":"YulFunctionCall","src":"4287:15:145"},"variables":[{"name":"data","nodeType":"YulTypedName","src":"4279:4:145","type":""}]},{"expression":{"arguments":[{"name":"sequenceNumber.slot","nodeType":"YulIdentifier","src":"4410:19:145"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4435:3:145","type":"","value":"128"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4453:1:145","type":"","value":"4"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4440:12:145"},"nodeType":"YulFunctionCall","src":"4440:15:145"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"4431:3:145"},"nodeType":"YulFunctionCall","src":"4431:25:145"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"4403:6:145"},"nodeType":"YulFunctionCall","src":"4403:54:145"},"nodeType":"YulExpressionStatement","src":"4403:54:145"},{"expression":{"arguments":[{"name":"number.slot","nodeType":"YulIdentifier","src":"4531:11:145"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4548:3:145","type":"","value":"128"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4566:2:145","type":"","value":"20"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4553:12:145"},"nodeType":"YulFunctionCall","src":"4553:16:145"}],"functionName":{"name":"shr","nodeType":"YulIdentifier","src":"4544:3:145"},"nodeType":"YulFunctionCall","src":"4544:26:145"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"4524:6:145"},"nodeType":"YulFunctionCall","src":"4524:47:145"},"nodeType":"YulExpressionStatement","src":"4524:47:145"},{"expression":{"arguments":[{"name":"basefee.slot","nodeType":"YulIdentifier","src":"4591:12:145"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4618:2:145","type":"","value":"36"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4605:12:145"},"nodeType":"YulFunctionCall","src":"4605:16:145"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"4584:6:145"},"nodeType":"YulFunctionCall","src":"4584:38:145"},"nodeType":"YulExpressionStatement","src":"4584:38:145"},{"expression":{"arguments":[{"name":"blobBaseFee.slot","nodeType":"YulIdentifier","src":"4653:16:145"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4684:2:145","type":"","value":"68"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4671:12:145"},"nodeType":"YulFunctionCall","src":"4671:16:145"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"4646:6:145"},"nodeType":"YulFunctionCall","src":"4646:42:145"},"nodeType":"YulExpressionStatement","src":"4646:42:145"},{"expression":{"arguments":[{"name":"hash.slot","nodeType":"YulIdentifier","src":"4719:9:145"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4743:3:145","type":"","value":"100"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4730:12:145"},"nodeType":"YulFunctionCall","src":"4730:17:145"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"4712:6:145"},"nodeType":"YulFunctionCall","src":"4712:36:145"},"nodeType":"YulExpressionStatement","src":"4712:36:145"},{"expression":{"arguments":[{"name":"batcherHash.slot","nodeType":"YulIdentifier","src":"4779:16:145"},{"arguments":[{"kind":"number","nodeType":"YulLiteral","src":"4810:3:145","type":"","value":"132"}],"functionName":{"name":"calldataload","nodeType":"YulIdentifier","src":"4797:12:145"},"nodeType":"YulFunctionCall","src":"4797:17:145"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"4772:6:145"},"nodeType":"YulFunctionCall","src":"4772:43:145"},"nodeType":"YulExpressionStatement","src":"4772:43:145"}]},"evmVersion":"london","externalReferences":[{"declaration":90213,"isOffset":false,"isSlot":false,"src":"4046:17:145","valueSize":1},{"declaration":90222,"isOffset":false,"isSlot":true,"src":"4591:12:145","suffix":"slot","valueSize":1},{"declaration":90237,"isOffset":false,"isSlot":true,"src":"4779:16:145","suffix":"slot","valueSize":1},{"declaration":90246,"isOffset":false,"isSlot":true,"src":"4653:16:145","suffix":"slot","valueSize":1},{"declaration":90225,"isOffset":false,"isSlot":true,"src":"4719:9:145","suffix":"slot","valueSize":1},{"declaration":90216,"isOffset":false,"isSlot":true,"src":"4531:11:145","suffix":"slot","valueSize":1},{"declaration":90228,"isOffset":false,"isSlot":true,"src":"4410:19:145","suffix":"slot","valueSize":1}],"id":90315,"nodeType":"InlineAssembly","src":"3940:896:145"}]},"documentation":{"id":90312,"nodeType":"StructuredDocumentation","src":"3160:721:145","text":"@notice Updates the L1 block values for an Ecotone upgraded chain.\n Params are packed and passed in as raw msg.data instead of ABI to reduce calldata size.\n Params are expected to be in the following order:\n 1. _baseFeeScalar L1 base fee scalar\n 2. _blobBaseFeeScalar L1 blob base fee scalar\n 3. _sequenceNumber Number of L2 blocks since epoch start.\n 4. _timestamp L1 timestamp.\n 5. _number L1 blocknumber.\n 6. _basefee L1 base fee.\n 7. _blobBaseFee L1 blob base fee.\n 8. _hash L1 blockhash.\n 9. _batcherHash Versioned hash to authenticate batcher by."},"functionSelector":"440a5e20","implemented":true,"kind":"function","modifiers":[],"name":"setL1BlockValuesEcotone","nameLocation":"3895:23:145","parameters":{"id":90313,"nodeType":"ParameterList","parameters":[],"src":"3918:2:145"},"returnParameters":{"id":90314,"nodeType":"ParameterList","parameters":[],"src":"3930:0:145"},"scope":90318,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[{"baseName":{"id":90208,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"608:7:145"},"id":90209,"nodeType":"InheritanceSpecifier","src":"608:7:145"}],"canonicalName":"L1Block","contractDependencies":[],"contractKind":"contract","documentation":{"id":90207,"nodeType":"StructuredDocumentation","src":"111:477:145","text":"@custom:proxied\n @custom:predeploy 0x4200000000000000000000000000000000000015\n @title L1Block\n @notice The L1Block predeploy gives users access to information about the last known L1 block.\n Values within this contract are updated once per epoch (every L1 block) and can only be\n set by the \"depositor\" account, a special system address. Depositor account transactions\n are created by the protocol whenever we move to a new epoch."},"fullyImplemented":true,"linearizedBaseContracts":[90318,109417],"name":"L1Block","nameLocation":"597:7:145","scope":90319,"usedErrors":[]}],"license":"MIT"},"id":145} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/L1CrossDomainMessenger.json b/packages/sdk/src/forge-artifacts/L1CrossDomainMessenger.json new file mode 100644 index 000000000000..9dba5479d699 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/L1CrossDomainMessenger.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"MESSAGE_VERSION","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"MIN_GAS_CALLDATA_OVERHEAD","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"OTHER_MESSENGER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"PORTAL","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract OptimismPortal"}],"stateMutability":"view"},{"type":"function","name":"RELAY_CALL_OVERHEAD","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"RELAY_CONSTANT_OVERHEAD","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"RELAY_GAS_CHECK_BUFFER","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"RELAY_RESERVED_GAS","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"baseGas","inputs":[{"name":"_message","type":"bytes","internalType":"bytes"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"pure"},{"type":"function","name":"failedMessages","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_superchainConfig","type":"address","internalType":"contract SuperchainConfig"},{"name":"_portal","type":"address","internalType":"contract OptimismPortal"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"messageNonce","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"otherMessenger","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"portal","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract OptimismPortal"}],"stateMutability":"view"},{"type":"function","name":"relayMessage","inputs":[{"name":"_nonce","type":"uint256","internalType":"uint256"},{"name":"_sender","type":"address","internalType":"address"},{"name":"_target","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint256","internalType":"uint256"},{"name":"_message","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"sendMessage","inputs":[{"name":"_target","type":"address","internalType":"address"},{"name":"_message","type":"bytes","internalType":"bytes"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"successfulMessages","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"superchainConfig","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract SuperchainConfig"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"xDomainMessageSender","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"event","name":"FailedRelayedMessage","inputs":[{"name":"msgHash","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"RelayedMessage","inputs":[{"name":"msgHash","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"SentMessage","inputs":[{"name":"target","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":false,"internalType":"address"},{"name":"message","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"messageNonce","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"gasLimit","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"SentMessageExtension1","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b506200001f60008062000025565b6200027f565b600054600160a81b900460ff16158080156200004e57506000546001600160a01b90910460ff16105b806200008557506200006b30620001b960201b620014d61760201c565b158015620000855750600054600160a01b900460ff166001145b620000ee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a01b1916600160a01b17905580156200011c576000805460ff60a81b1916600160a81b1790555b60fb80546001600160a01b038086166001600160a01b03199283161790925560fc8054928516929091169190911790556200016b734200000000000000000000000000000000000007620001c8565b8015620001b4576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054600160a81b900460ff16620002375760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000e5565b60cc546001600160a01b03166200025d5760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b611f94806200028f6000396000f3fe6080604052600436106101805760003560e01c80635c975abb116100d6578063a4e7f8bd1161007f578063d764ad0b11610059578063d764ad0b14610463578063db505d8014610476578063ecc70428146104a357600080fd5b8063a4e7f8bd146103e3578063b1b1b20914610413578063b28ade251461044357600080fd5b806383a74074116100b057806383a74074146103a15780638cbeeef2146102b85780639fce812c146103b857600080fd5b80635c975abb1461033a5780636425666b1461035f5780636e296e451461038c57600080fd5b80633dbb202b116101385780634c1d6a69116101125780634c1d6a69146102b857806354fd4d50146102ce5780635644cfdf1461032457600080fd5b80633dbb202b1461025b5780633f827a5a14610270578063485cc9551461029857600080fd5b80630ff754ea116101695780630ff754ea146101cd5780632828d7e81461021957806335e80ab31461022e57600080fd5b8063028f85f7146101855780630c568498146101b8575b600080fd5b34801561019157600080fd5b5061019a601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101c457600080fd5b5061019a603f81565b3480156101d957600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101af565b34801561022557600080fd5b5061019a604081565b34801561023a57600080fd5b5060fb546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b61026e610269366004611a22565b610508565b005b34801561027c57600080fd5b50610285600181565b60405161ffff90911681526020016101af565b3480156102a457600080fd5b5061026e6102b3366004611a89565b610765565b3480156102c457600080fd5b5061019a619c4081565b3480156102da57600080fd5b506103176040518060400160405280600581526020017f322e332e3000000000000000000000000000000000000000000000000000000081525081565b6040516101af9190611b2d565b34801561033057600080fd5b5061019a61138881565b34801561034657600080fd5b5061034f6109d3565b60405190151581526020016101af565b34801561036b57600080fd5b5060fc546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039857600080fd5b506101f4610a6c565b3480156103ad57600080fd5b5061019a62030d4081565b3480156103c457600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101f4565b3480156103ef57600080fd5b5061034f6103fe366004611b47565b60ce6020526000908152604090205460ff1681565b34801561041f57600080fd5b5061034f61042e366004611b47565b60cb6020526000908152604090205460ff1681565b34801561044f57600080fd5b5061019a61045e366004611b60565b610b53565b61026e610471366004611bb4565b610bc1565b34801561048257600080fd5b5060cf546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104af57600080fd5b506104fa60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101af565b60cf5461063a9073ffffffffffffffffffffffffffffffffffffffff16610530858585610b53565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061059c60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016105b89796959493929190611c83565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526114f2565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856106bf60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516106d1959493929190611ce2565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b6000547501000000000000000000000000000000000000000000900460ff16158080156107b0575060005460017401000000000000000000000000000000000000000090910460ff16105b806107e25750303b1580156107e2575060005474010000000000000000000000000000000000000000900460ff166001145b610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905580156108f957600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc80549285169290911691909117905561096b73420000000000000000000000000000000000000761158b565b80156109ce57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a679190611d30565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f74207365740000000000000000000000606482015260840161086a565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f610b6f604063ffffffff8816611d81565b610b799190611db1565b610b84601088611d81565b610b919062030d40611dff565b610b9b9190611dff565b610ba59190611dff565b610baf9190611dff565b610bb99190611dff565b949350505050565b610bc96109d3565b15610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a2070617573656400000000604482015260640161086a565b60f087901c60028110610ceb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161086a565b8061ffff16600003610de0576000610d3c878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506116c7915050565b600081815260cb602052604090205490915060ff1615610dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161086a565b505b6000610e26898989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116e692505050565b9050610e30611709565b15610e6857853414610e4457610e44611e2b565b600081815260ce602052604090205460ff1615610e6357610e63611e2b565b610fba565b3415610f1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a40161086a565b600081815260ce602052604090205460ff16610fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161086a565b610fc3876117e5565b15611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161086a565b600081815260cb602052604090205460ff1615611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161086a565b61113685611127611388619c40611dff565b67ffffffffffffffff1661182b565b158061115c575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561127557600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b50506114cd565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061130688619c405a6112c99190611e5a565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061184992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156113bc57600082815260cb602052604090205460ff161561135957611359611e2b565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26114c9565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611553908890839089906000908990600401611e71565b6000604051808303818588803b15801561156c57600080fd5b505af1158015611580573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161086a565b60cc5473ffffffffffffffffffffffffffffffffffffffff166116805760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006116d585858585611863565b805190602001209050949350505050565b60006116f68787878787876118fc565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff1633148015610a67575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190611ec9565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611825575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60608484848460405160240161187c9493929190611ee6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161191996959493929190611f30565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146119bd57600080fd5b50565b60008083601f8401126119d257600080fd5b50813567ffffffffffffffff8111156119ea57600080fd5b602083019150836020828501011115611a0257600080fd5b9250929050565b803563ffffffff81168114611a1d57600080fd5b919050565b60008060008060608587031215611a3857600080fd5b8435611a438161199b565b9350602085013567ffffffffffffffff811115611a5f57600080fd5b611a6b878288016119c0565b9094509250611a7e905060408601611a09565b905092959194509250565b60008060408385031215611a9c57600080fd5b8235611aa78161199b565b91506020830135611ab78161199b565b809150509250929050565b6000815180845260005b81811015611ae857602081850181015186830182015201611acc565b81811115611afa576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611b406020830184611ac2565b9392505050565b600060208284031215611b5957600080fd5b5035919050565b600080600060408486031215611b7557600080fd5b833567ffffffffffffffff811115611b8c57600080fd5b611b98868287016119c0565b9094509250611bab905060208501611a09565b90509250925092565b600080600080600080600060c0888a031215611bcf57600080fd5b873596506020880135611be18161199b565b95506040880135611bf18161199b565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611c1b57600080fd5b611c278a828b016119c0565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611cd560c083018486611c3a565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611d12608083018688611c3a565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611d4257600080fd5b81518015158114611b4057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611da857611da8611d52565b02949350505050565b600067ffffffffffffffff80841680611df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611e2257611e22611d52565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611e6c57611e6c611d52565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611ebe60a0830184611ac2565b979650505050505050565b600060208284031215611edb57600080fd5b8151611b408161199b565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611f1f6080830185611ac2565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611f7b60c0830184611ac2565b9897505050505050505056fea164736f6c634300080f000a","sourceMap":"701:2432:130:-:0;;;1159:163;;;;;;;;;-1:-1:-1;1206:109:130::1;1263:1;::::0;1206:10:::1;:109::i;:::-;701:2432:::0;;1542:296;3111:19:27;3134:13;-1:-1:-1;;;3134:13:27;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:27;;3212:1;-1:-1:-1;;;3197:12:27;;;;;:16;3179:34;3178:108;;;;3220:44;3258:4;3220:29;;;;;:44;;:::i;:::-;3219:45;:66;;;;-1:-1:-1;3268:12:27;;-1:-1:-1;;;3268:12:27;;;;3284:1;3268:17;3219:66;3157:201;;;;-1:-1:-1;;;3157:201:27;;216:2:357;3157:201:27;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:357;;;338:44;399:19;;3157:201:27;;;;;;;;;3368:12;:16;;-1:-1:-1;;;;3368:16:27;-1:-1:-1;;;3368:16:27;;;3394:65;;;;3428:13;:20;;-1:-1:-1;;;;3428:20:27;-1:-1:-1;;;3428:20:27;;;3394:65;1651:16:130::1;:36:::0;;-1:-1:-1;;;;;1651:36:130;;::::1;-1:-1:-1::0;;;;;;1651:36:130;;::::1;;::::0;;;1697:6:::1;:16:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;1723:108:::1;480:42:199;1723:27:130;:108::i;:::-;3483:14:27::0;3479:99;;;3529:5;3513:21;;-1:-1:-1;;;;3513:21:27;;;3553:14;;-1:-1:-1;581:36:357;;3553:14:27;;569:2:357;554:18;3553:14:27;;;;;;;3479:99;3101:483;1542:296:130;;:::o;1186:320:33:-;-1:-1:-1;;;;;1476:19:33;;:23;;;1186:320::o;18503:636:223:-;4910:13:27;;-1:-1:-1;;;4910:13:27;;;;4902:69;;;;-1:-1:-1;;;4902:69:27;;830:2:357;4902:69:27;;;812:21:357;869:2;849:18;;;842:30;908:34;888:18;;;881:62;-1:-1:-1;;;959:18:357;;;952:41;1010:19;;4902:69:27;628:407:357;4902:69:27;18988:16:223::1;::::0;-1:-1:-1;;;;;18988:16:223::1;18984:107;;19034:16;:46:::0;;-1:-1:-1;;;;;;19034:46:223::1;1338:42:192;19034:46:223;::::0;;18984:107:::1;19100:14;:32:::0;;-1:-1:-1;;;;;;19100:32:223::1;-1:-1:-1::0;;;;;19100:32:223;;;::::1;::::0;;;::::1;::::0;;18503:636::o;628:407:357:-;701:2432:130;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106101805760003560e01c80635c975abb116100d6578063a4e7f8bd1161007f578063d764ad0b11610059578063d764ad0b14610463578063db505d8014610476578063ecc70428146104a357600080fd5b8063a4e7f8bd146103e3578063b1b1b20914610413578063b28ade251461044357600080fd5b806383a74074116100b057806383a74074146103a15780638cbeeef2146102b85780639fce812c146103b857600080fd5b80635c975abb1461033a5780636425666b1461035f5780636e296e451461038c57600080fd5b80633dbb202b116101385780634c1d6a69116101125780634c1d6a69146102b857806354fd4d50146102ce5780635644cfdf1461032457600080fd5b80633dbb202b1461025b5780633f827a5a14610270578063485cc9551461029857600080fd5b80630ff754ea116101695780630ff754ea146101cd5780632828d7e81461021957806335e80ab31461022e57600080fd5b8063028f85f7146101855780630c568498146101b8575b600080fd5b34801561019157600080fd5b5061019a601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101c457600080fd5b5061019a603f81565b3480156101d957600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101af565b34801561022557600080fd5b5061019a604081565b34801561023a57600080fd5b5060fb546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b61026e610269366004611a22565b610508565b005b34801561027c57600080fd5b50610285600181565b60405161ffff90911681526020016101af565b3480156102a457600080fd5b5061026e6102b3366004611a89565b610765565b3480156102c457600080fd5b5061019a619c4081565b3480156102da57600080fd5b506103176040518060400160405280600581526020017f322e332e3000000000000000000000000000000000000000000000000000000081525081565b6040516101af9190611b2d565b34801561033057600080fd5b5061019a61138881565b34801561034657600080fd5b5061034f6109d3565b60405190151581526020016101af565b34801561036b57600080fd5b5060fc546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039857600080fd5b506101f4610a6c565b3480156103ad57600080fd5b5061019a62030d4081565b3480156103c457600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101f4565b3480156103ef57600080fd5b5061034f6103fe366004611b47565b60ce6020526000908152604090205460ff1681565b34801561041f57600080fd5b5061034f61042e366004611b47565b60cb6020526000908152604090205460ff1681565b34801561044f57600080fd5b5061019a61045e366004611b60565b610b53565b61026e610471366004611bb4565b610bc1565b34801561048257600080fd5b5060cf546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104af57600080fd5b506104fa60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101af565b60cf5461063a9073ffffffffffffffffffffffffffffffffffffffff16610530858585610b53565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061059c60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016105b89796959493929190611c83565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526114f2565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856106bf60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516106d1959493929190611ce2565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b6000547501000000000000000000000000000000000000000000900460ff16158080156107b0575060005460017401000000000000000000000000000000000000000090910460ff16105b806107e25750303b1580156107e2575060005474010000000000000000000000000000000000000000900460ff166001145b610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905580156108f957600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc80549285169290911691909117905561096b73420000000000000000000000000000000000000761158b565b80156109ce57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a679190611d30565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f74207365740000000000000000000000606482015260840161086a565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f610b6f604063ffffffff8816611d81565b610b799190611db1565b610b84601088611d81565b610b919062030d40611dff565b610b9b9190611dff565b610ba59190611dff565b610baf9190611dff565b610bb99190611dff565b949350505050565b610bc96109d3565b15610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a2070617573656400000000604482015260640161086a565b60f087901c60028110610ceb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161086a565b8061ffff16600003610de0576000610d3c878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506116c7915050565b600081815260cb602052604090205490915060ff1615610dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161086a565b505b6000610e26898989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116e692505050565b9050610e30611709565b15610e6857853414610e4457610e44611e2b565b600081815260ce602052604090205460ff1615610e6357610e63611e2b565b610fba565b3415610f1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a40161086a565b600081815260ce602052604090205460ff16610fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161086a565b610fc3876117e5565b15611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161086a565b600081815260cb602052604090205460ff1615611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161086a565b61113685611127611388619c40611dff565b67ffffffffffffffff1661182b565b158061115c575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561127557600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b50506114cd565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061130688619c405a6112c99190611e5a565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061184992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156113bc57600082815260cb602052604090205460ff161561135957611359611e2b565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26114c9565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611553908890839089906000908990600401611e71565b6000604051808303818588803b15801561156c57600080fd5b505af1158015611580573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161086a565b60cc5473ffffffffffffffffffffffffffffffffffffffff166116805760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006116d585858585611863565b805190602001209050949350505050565b60006116f68787878787876118fc565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff1633148015610a67575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190611ec9565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611825575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60608484848460405160240161187c9493929190611ee6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161191996959493929190611f30565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146119bd57600080fd5b50565b60008083601f8401126119d257600080fd5b50813567ffffffffffffffff8111156119ea57600080fd5b602083019150836020828501011115611a0257600080fd5b9250929050565b803563ffffffff81168114611a1d57600080fd5b919050565b60008060008060608587031215611a3857600080fd5b8435611a438161199b565b9350602085013567ffffffffffffffff811115611a5f57600080fd5b611a6b878288016119c0565b9094509250611a7e905060408601611a09565b905092959194509250565b60008060408385031215611a9c57600080fd5b8235611aa78161199b565b91506020830135611ab78161199b565b809150509250929050565b6000815180845260005b81811015611ae857602081850181015186830182015201611acc565b81811115611afa576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611b406020830184611ac2565b9392505050565b600060208284031215611b5957600080fd5b5035919050565b600080600060408486031215611b7557600080fd5b833567ffffffffffffffff811115611b8c57600080fd5b611b98868287016119c0565b9094509250611bab905060208501611a09565b90509250925092565b600080600080600080600060c0888a031215611bcf57600080fd5b873596506020880135611be18161199b565b95506040880135611bf18161199b565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611c1b57600080fd5b611c278a828b016119c0565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611cd560c083018486611c3a565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611d12608083018688611c3a565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611d4257600080fd5b81518015158114611b4057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611da857611da8611d52565b02949350505050565b600067ffffffffffffffff80841680611df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611e2257611e22611d52565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611e6c57611e6c611d52565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611ebe60a0830184611ac2565b979650505050505050565b600060208284031215611edb57600080fd5b8151611b408161199b565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611f1f6080830185611ac2565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611f7b60c0830184611ac2565b9897505050505050505056fea164736f6c634300080f000a","sourceMap":"701:2432:130:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4456:53:223;;;;;;;;;;;;4507:2;4456:53;;;;;188:18:357;176:31;;;158:50;;146:2;131:18;4456:53:223;;;;;;;;4301:64;;;;;;;;;;;;4363:2;4301:64;;2107:87:130;;;;;;;;;;-1:-1:-1;2181:6:130;;;;2107:87;;;427:42:357;415:55;;;397:74;;385:2;370:18;2107:87:130;219:258:357;4146:62:223;;;;;;;;;;;;4206:2;4146:62;;822:40:130;;;;;;;;;;-1:-1:-1;822:40:130;;;;;;;;8628:995:223;;;;;;:::i;:::-;;:::i;:::-;;3879:42;;;;;;;;;;;;3920:1;3879:42;;;;;2213:6:357;2201:19;;;2183:38;;2171:2;2156:18;3879:42:223;2039:188:357;1542:296:130;;;;;;;;;;-1:-1:-1;1542:296:130;;;;;:::i;:::-;;:::i;4597:51:223:-;;;;;;;;;;;;4642:6;4597:51;;1048:40:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4943:53:223:-;;;;;;;;;;;;4991:5;4943:53;;3028:103:130;;;;;;;;;;;;;:::i;:::-;;;3601:14:357;;3594:22;3576:41;;3564:2;3549:18;3028:103:130;3436:187:357;950:28:130;;;;;;;;;;-1:-1:-1;950:28:130;;;;;;;;15764:250:223;;;;;;;;;;;;;:::i;3999:56::-;;;;;;;;;;;;4048:7;3999:56;;16317:108;;;;;;;;;;-1:-1:-1;16404:14:223;;;;16317:108;;6234:46;;;;;;;;;;-1:-1:-1;6234:46:223;;;;;:::i;:::-;;;;;;;;;;;;;;;;5252:50;;;;;;;;;;-1:-1:-1;5252:50:223;;;;;:::i;:::-;;;;;;;;;;;;;;;;17493:894;;;;;;;;;;-1:-1:-1;17493:894:223;;;;;:::i;:::-;;:::i;10311:5066::-;;;;;;:::i;:::-;;:::i;6386:42::-;;;;;;;;;;-1:-1:-1;6386:42:223;;;;;;;;16746:134;;;;;;;;;;;;16847:8;;;;4855:18:195;4852:30;;3028:103:130;16746:134:223;;;5835:25:357;;;5823:2;5808:18;16746:134:223;5689:177:357;8628:995:223;9128:14;;9088:326;;9128:14;;9168:31;9176:8;;9186:12;9168:7;:31::i;:::-;9221:9;9291:26;9319:14;16847:8;;;;4855:18:195;4852:30;;3028:103:130;9319:14:223;9335:10;9347:7;9356:9;9367:12;9381:8;;9251:152;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9088:12;:326::i;:::-;9442:7;9430:72;;;9451:10;9463:8;;9473:14;16847:8;;;;4855:18:195;4852:30;;3028:103:130;9473:14:223;9489:12;9430:72;;;;;;;;;;:::i;:::-;;;;;;;;9517:44;;9551:9;5835:25:357;;9539:10:223;;9517:44;;5823:2:357;5808:18;9517:44:223;;;;;;;-1:-1:-1;;9598:8:223;9596:10;;;;;;;;;;;;;;;;-1:-1:-1;;8628:995:223:o;1542:296:130:-;3111:19:27;3134:13;;;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:27;;3212:1;3197:12;;;;;;:16;3179:34;3178:108;;;-1:-1:-1;3258:4:27;1476:19:33;:23;;;3219:66:27;;-1:-1:-1;3268:12:27;;;;;;;3284:1;3268:17;3219:66;3157:201;;;;;;;7634:2:357;3157:201:27;;;7616:21:357;7673:2;7653:18;;;7646:30;7712:34;7692:18;;;7685:62;7783:16;7763:18;;;7756:44;7817:19;;3157:201:27;;;;;;;;;3368:12;:16;;;;;;;;3394:65;;;;3428:13;:20;;;;;;;;3394:65;1651:16:130::1;:36:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;1697:6:::1;:16:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;1723:108:::1;480:42:199;1723:27:130;:108::i;:::-;3483:14:27::0;3479:99;;;3529:5;3513:21;;;;;;3553:14;;-1:-1:-1;7999:36:357;;3553:14:27;;7987:2:357;7972:18;3553:14:27;;;;;;;3479:99;3101:483;1542:296:130;;:::o;3028:103::-;3099:16;;:25;;;;;;;;3076:4;;3099:16;;;:23;;:25;;;;;;;;;;;;;;:16;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3092:32;;3028:103;:::o;15764:250:223:-;15859:16;;15819:7;;15859:47;:16;:47;;15838:135;;;;;;;8530:2:357;15838:135:223;;;8512:21:357;8569:2;8549:18;;;8542:30;8608:34;8588:18;;;8581:62;8679:23;8659:18;;;8652:51;8720:19;;15838:135:223;8328:417:357;15838:135:223;-1:-1:-1;15991:16:223;;;;;15764:250::o;17493:894::-;17577:6;4991:5;4796:6;;4363:2;17806:49;4206:2;17806:49;;;;:::i;:::-;17805:90;;;;:::i;:::-;17703:51;4507:2;17710:8;17703:51;:::i;:::-;17639:116;;4048:7;17639:116;:::i;:::-;:257;;;;:::i;:::-;:412;;;;:::i;:::-;:587;;;;:::i;:::-;:741;;;;:::i;:::-;17595:785;17493:894;-1:-1:-1;;;;17493:894:223:o;10311:5066::-;10722:8;:6;:8::i;:::-;:17;10714:58;;;;;;;10015:2:357;10714:58:223;;;9997:21:357;10054:2;10034:18;;;10027:30;10093;10073:18;;;10066:58;10141:18;;10714:58:223;9813:352:357;10714:58:223;5444:3:195;5440:16;;;10869:1:223;10859:11;;10851:101;;;;;;;10372:2:357;10851:101:223;;;10354:21:357;10411:2;10391:18;;;10384:30;10450:34;10430:18;;;10423:62;10521:34;10501:18;;;10494:62;10593:15;10572:19;;;10565:44;10626:19;;10851:101:223;10170:481:357;10851:101:223;11154:7;:12;;11165:1;11154:12;11150:247;;11182:15;11200:68;11233:7;11242;11251:8;;11200:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11261:6:223;;-1:-1:-1;11200:32:223;;-1:-1:-1;;11200:68:223:i;:::-;11290:27;;;;:18;:27;;;;;;11182:86;;-1:-1:-1;11290:27:223;;:36;11282:104;;;;;;;10858:2:357;11282:104:223;;;10840:21:357;10897:2;10877:18;;;10870:30;10936:34;10916:18;;;10909:62;11007:25;10987:18;;;10980:53;11050:19;;11282:104:223;10656:419:357;11282:104:223;11168:229;11150:247;11567:21;11603:90;11636:6;11644:7;11653;11662:6;11670:12;11684:8;;11603:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11603:32:223;;-1:-1:-1;;;11603:90:223:i;:::-;11567:126;;11708:19;:17;:19::i;:::-;11704:506;;;11897:6;11884:9;:19;11877:27;;;;:::i;:::-;11926:29;;;;:14;:29;;;;;;;;11925:30;11918:38;;;;:::i;:::-;11704:506;;;11995:9;:14;11987:107;;;;;;;11471:2:357;11987:107:223;;;11453:21:357;11510:2;11490:18;;;11483:30;11549:34;11529:18;;;11522:62;11620:34;11600:18;;;11593:62;11692:18;11671:19;;;11664:47;11728:19;;11987:107:223;11269:484:357;11987:107:223;12117:29;;;;:14;:29;;;;;;;;12109:90;;;;;;;11960:2:357;12109:90:223;;;11942:21:357;11999:2;11979:18;;;11972:30;12038:34;12018:18;;;12011:62;12109:18;12089;;;12082:46;12145:19;;12109:90:223;11758:412:357;12109:90:223;12241:24;12257:7;12241:15;:24::i;:::-;:33;12220:135;;;;;;;12377:2:357;12220:135:223;;;12359:21:357;12416:2;12396:18;;;12389:30;12455:34;12435:18;;;12428:62;12526:34;12506:18;;;12499:62;12598:5;12577:19;;;12570:34;12621:19;;12220:135:223;12175:471:357;12220:135:223;12374:33;;;;:18;:33;;;;;;;;:42;12366:109;;;;;;;12853:2:357;12366:109:223;;;12835:21:357;12892:2;12872:18;;;12865:30;12931:34;12911:18;;;12904:62;13002:24;12982:18;;;12975:52;13044:19;;12366:109:223;12651:418:357;12366:109:223;13169:77;13188:12;13202:43;4991:5;4796:6;13202:43;:::i;:::-;13169:77;;:18;:77::i;:::-;13168:78;:145;;;-1:-1:-1;13266:16:223;;:47;:16;1338:42:192;13266:47:223;;13168:145;13151:919;;;13338:29;;;;:14;:29;;;;;;:36;;;;13370:4;13338:36;;;13393:35;13353:13;;13393:35;;;13908:41;:9;:41;13904:135;;13969:55;;;;;13276:2:357;13969:55:223;;;13258:21:357;13315:2;13295:18;;;13288:30;13354:34;13334:18;;;13327:62;13425:15;13405:18;;;13398:43;13458:19;;13969:55:223;13074:409:357;13904:135:223;14053:7;;;;13151:919;14080:16;:26;;;;;;;;;;-1:-1:-1;14131:72:223;14145:7;4796:6;14154:9;:30;;;;:::i;:::-;14186:6;14194:8;;14131:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14131:13:223;;-1:-1:-1;;;14131:72:223:i;:::-;14213:16;:46;;;;1338:42:192;14213:46:223;;;14116:87;-1:-1:-1;14270:1101:223;;;;14484:33;;;;:18;:33;;;;;;;;:42;14477:50;;;;:::i;:::-;14541:33;;;;:18;:33;;;;;;:40;;;;14577:4;14541:40;;;14600:29;14560:13;;14600:29;;;14270:1101;;;14660:29;;;;:14;:29;;;;;;:36;;;;14692:4;14660:36;;;14715:35;14675:13;;14715:35;;;15230:41;:9;:41;15226:135;;15291:55;;;;;13276:2:357;15291:55:223;;;13258:21:357;13315:2;13295:18;;;13288:30;13354:34;13334:18;;;13327:62;13425:15;13405:18;;;13398:43;13458:19;;15291:55:223;13074:409:357;15226:135:223;10537:4840;;;10311:5066;;;;;;;;:::o;1186:320:33:-;1476:19;;;:23;;;1186:320::o;2241::130:-;2358:6;;:196;;;;;:6;;;;;:25;;2392:6;;2358:196;;2420:3;;2392:6;;2476:9;;2358:6;;2538:5;;2358:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2241:320;;;;:::o;18503:636:223:-;4910:13:27;;;;;;;4902:69;;;;;;;14412:2:357;4902:69:27;;;14394:21:357;14451:2;14431:18;;;14424:30;14490:34;14470:18;;;14463:62;14561:13;14541:18;;;14534:41;14592:19;;4902:69:27;14210:407:357;4902:69:27;18988:16:223::1;::::0;:30:::1;:16;18984:107;;19034:16;:46:::0;;;::::1;1338:42:192;19034:46:223;::::0;;18984:107:::1;19100:14;:32:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;18503:636::o;3100:305:196:-;3289:7;3329:68;3365:7;3374;3383:5;3390:6;3329:35;:68::i;:::-;3319:79;;;;;;3312:86;;3100:305;;;;;;:::o;3877:375::-;4117:7;4157:87;4193:6;4201:7;4210;4219:6;4227:9;4238:5;4157:35;:87::i;:::-;4147:98;;;;;;4140:105;;3877:375;;;;;;;;:::o;2608:168:130:-;2714:6;;2669:4;;2714:6;;2692:10;:29;:77;;;;-1:-1:-1;2754:14:130;;2725:6;;:17;;;;;;;;2754:14;;;;;2725:6;;;;:15;;:17;;;;;;;;;;;;;;;:6;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;;2685:84;;2608:168;:::o;2823:158::-;2897:4;2920:24;;;2939:4;2920:24;;:54;;-1:-1:-1;2967:6:130;;;2948:26;;;2967:6;;2948:26;2920:54;2913:61;2823:158;-1:-1:-1;;2823:158:130:o;3615:365:200:-;3696:4;3712:15;3931:2;3916:12;3909:5;3905:24;3901:33;3896:2;3887:7;3883:16;3879:56;3874:2;3867:5;3863:14;3860:76;3853:84;;3615:365;-1:-1:-1;;;;3615:365:200:o;1202:536::-;1305:4;1321:13;1668:1;1635;1594:9;1588:16;1554:2;1543:9;1539:18;1496:6;1454:7;1421:4;1395:302;1367:330;1202:536;-1:-1:-1;;;;;;1202:536:200:o;3073:336:195:-;3264:12;3370:7;3379;3388:5;3395:6;3299:103;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3073:336:195;;;;;;:::o;3883:516::-;4125:12;4272:6;4292:7;4313;4334:6;4354:9;4377:5;4160:232;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3883:516:195;;;;;;;;:::o;739:154:357:-;825:42;818:5;814:54;807:5;804:65;794:93;;883:1;880;873:12;794:93;739:154;:::o;898:347::-;949:8;959:6;1013:3;1006:4;998:6;994:17;990:27;980:55;;1031:1;1028;1021:12;980:55;-1:-1:-1;1054:20:357;;1097:18;1086:30;;1083:50;;;1129:1;1126;1119:12;1083:50;1166:4;1158:6;1154:17;1142:29;;1218:3;1211:4;1202:6;1194;1190:19;1186:30;1183:39;1180:59;;;1235:1;1232;1225:12;1180:59;898:347;;;;;:::o;1250:163::-;1317:20;;1377:10;1366:22;;1356:33;;1346:61;;1403:1;1400;1393:12;1346:61;1250:163;;;:::o;1418:616::-;1505:6;1513;1521;1529;1582:2;1570:9;1561:7;1557:23;1553:32;1550:52;;;1598:1;1595;1588:12;1550:52;1637:9;1624:23;1656:31;1681:5;1656:31;:::i;:::-;1706:5;-1:-1:-1;1762:2:357;1747:18;;1734:32;1789:18;1778:30;;1775:50;;;1821:1;1818;1811:12;1775:50;1860:58;1910:7;1901:6;1890:9;1886:22;1860:58;:::i;:::-;1937:8;;-1:-1:-1;1834:84:357;-1:-1:-1;1991:37:357;;-1:-1:-1;2024:2:357;2009:18;;1991:37;:::i;:::-;1981:47;;1418:616;;;;;;;:::o;2232:438::-;2350:6;2358;2411:2;2399:9;2390:7;2386:23;2382:32;2379:52;;;2427:1;2424;2417:12;2379:52;2466:9;2453:23;2485:31;2510:5;2485:31;:::i;:::-;2535:5;-1:-1:-1;2592:2:357;2577:18;;2564:32;2605:33;2564:32;2605:33;:::i;:::-;2657:7;2647:17;;;2232:438;;;;;:::o;2675:531::-;2717:3;2755:5;2749:12;2782:6;2777:3;2770:19;2807:1;2817:162;2831:6;2828:1;2825:13;2817:162;;;2893:4;2949:13;;;2945:22;;2939:29;2921:11;;;2917:20;;2910:59;2846:12;2817:162;;;2997:6;2994:1;2991:13;2988:87;;;3063:1;3056:4;3047:6;3042:3;3038:16;3034:27;3027:38;2988:87;-1:-1:-1;3120:2:357;3108:15;3125:66;3104:88;3095:98;;;;3195:4;3091:109;;2675:531;-1:-1:-1;;2675:531:357:o;3211:220::-;3360:2;3349:9;3342:21;3323:4;3380:45;3421:2;3410:9;3406:18;3398:6;3380:45;:::i;:::-;3372:53;3211:220;-1:-1:-1;;;3211:220:357:o;4121:180::-;4180:6;4233:2;4221:9;4212:7;4208:23;4204:32;4201:52;;;4249:1;4246;4239:12;4201:52;-1:-1:-1;4272:23:357;;4121:180;-1:-1:-1;4121:180:357:o;4306:481::-;4384:6;4392;4400;4453:2;4441:9;4432:7;4428:23;4424:32;4421:52;;;4469:1;4466;4459:12;4421:52;4509:9;4496:23;4542:18;4534:6;4531:30;4528:50;;;4574:1;4571;4564:12;4528:50;4613:58;4663:7;4654:6;4643:9;4639:22;4613:58;:::i;:::-;4690:8;;-1:-1:-1;4587:84:357;-1:-1:-1;4744:37:357;;-1:-1:-1;4777:2:357;4762:18;;4744:37;:::i;:::-;4734:47;;4306:481;;;;;:::o;4792:892::-;4907:6;4915;4923;4931;4939;4947;4955;5008:3;4996:9;4987:7;4983:23;4979:33;4976:53;;;5025:1;5022;5015:12;4976:53;5061:9;5048:23;5038:33;;5121:2;5110:9;5106:18;5093:32;5134:31;5159:5;5134:31;:::i;:::-;5184:5;-1:-1:-1;5241:2:357;5226:18;;5213:32;5254:33;5213:32;5254:33;:::i;:::-;5306:7;-1:-1:-1;5360:2:357;5345:18;;5332:32;;-1:-1:-1;5411:3:357;5396:19;;5383:33;;-1:-1:-1;5467:3:357;5452:19;;5439:33;5495:18;5484:30;;5481:50;;;5527:1;5524;5517:12;5481:50;5566:58;5616:7;5607:6;5596:9;5592:22;5566:58;:::i;:::-;4792:892;;;;-1:-1:-1;4792:892:357;;-1:-1:-1;4792:892:357;;;;5540:84;;-1:-1:-1;;;4792:892:357:o;5871:325::-;5959:6;5954:3;5947:19;6011:6;6004:5;5997:4;5992:3;5988:14;5975:43;;6063:1;6056:4;6047:6;6042:3;6038:16;6034:27;6027:38;5929:3;6185:4;6115:66;6110:2;6102:6;6098:15;6094:88;6089:3;6085:98;6081:109;6074:116;;5871:325;;;;:::o;6201:697::-;6496:6;6485:9;6478:25;6459:4;6522:42;6612:2;6604:6;6600:15;6595:2;6584:9;6580:18;6573:43;6664:2;6656:6;6652:15;6647:2;6636:9;6632:18;6625:43;;6704:6;6699:2;6688:9;6684:18;6677:34;6760:10;6752:6;6748:23;6742:3;6731:9;6727:19;6720:52;6809:3;6803;6792:9;6788:19;6781:32;6830:62;6887:3;6876:9;6872:19;6864:6;6856;6830:62;:::i;:::-;6822:70;6201:697;-1:-1:-1;;;;;;;;;6201:697:357:o;6903:524::-;7155:42;7147:6;7143:55;7132:9;7125:74;7235:3;7230:2;7219:9;7215:18;7208:31;7106:4;7256:62;7313:3;7302:9;7298:19;7290:6;7282;7256:62;:::i;:::-;7248:70;;7354:6;7349:2;7338:9;7334:18;7327:34;7409:10;7401:6;7397:23;7392:2;7381:9;7377:18;7370:51;6903:524;;;;;;;;:::o;8046:277::-;8113:6;8166:2;8154:9;8145:7;8141:23;8137:32;8134:52;;;8182:1;8179;8172:12;8134:52;8214:9;8208:16;8267:5;8260:13;8253:21;8246:5;8243:32;8233:60;;8289:1;8286;8279:12;8750:184;8802:77;8799:1;8792:88;8899:4;8896:1;8889:15;8923:4;8920:1;8913:15;8939:270;8978:7;9010:18;9055:2;9052:1;9048:10;9085:2;9082:1;9078:10;9141:3;9137:2;9133:12;9128:3;9125:21;9118:3;9111:11;9104:19;9100:47;9097:73;;;9150:18;;:::i;:::-;9190:13;;8939:270;-1:-1:-1;;;;8939:270:357:o;9214:353::-;9253:1;9279:18;9324:2;9321:1;9317:10;9346:3;9336:191;;9383:77;9380:1;9373:88;9484:4;9481:1;9474:15;9512:4;9509:1;9502:15;9336:191;9545:10;;9541:20;;;;;9214:353;-1:-1:-1;;9214:353:357:o;9572:236::-;9611:3;9639:18;9684:2;9681:1;9677:10;9714:2;9711:1;9707:10;9745:3;9741:2;9737:12;9732:3;9729:21;9726:47;;;9753:18;;:::i;:::-;9789:13;;9572:236;-1:-1:-1;;;;9572:236:357:o;11080:184::-;11132:77;11129:1;11122:88;11229:4;11226:1;11219:15;11253:4;11250:1;11243:15;13488:125;13528:4;13556:1;13553;13550:8;13547:34;;;13561:18;;:::i;:::-;-1:-1:-1;13598:9:357;;13488:125::o;13618:587::-;13881:42;13873:6;13869:55;13858:9;13851:74;13961:6;13956:2;13945:9;13941:18;13934:34;14016:18;14008:6;14004:31;13999:2;13988:9;13984:18;13977:59;14086:6;14079:14;14072:22;14067:2;14056:9;14052:18;14045:50;14132:3;14126;14115:9;14111:19;14104:32;13832:4;14153:46;14194:3;14183:9;14179:19;14171:6;14153:46;:::i;:::-;14145:54;13618:587;-1:-1:-1;;;;;;;13618:587:357:o;14622:251::-;14692:6;14745:2;14733:9;14724:7;14720:23;14716:32;14713:52;;;14761:1;14758;14751:12;14713:52;14793:9;14787:16;14812:31;14837:5;14812:31;:::i;14878:512::-;15072:4;15101:42;15182:2;15174:6;15170:15;15159:9;15152:34;15234:2;15226:6;15222:15;15217:2;15206:9;15202:18;15195:43;;15274:3;15269:2;15258:9;15254:18;15247:31;15295:46;15336:3;15325:9;15321:19;15313:6;15295:46;:::i;:::-;15287:54;;15377:6;15372:2;15361:9;15357:18;15350:34;14878:512;;;;;;;:::o;15395:656::-;15682:6;15671:9;15664:25;15645:4;15708:42;15798:2;15790:6;15786:15;15781:2;15770:9;15766:18;15759:43;15850:2;15842:6;15838:15;15833:2;15822:9;15818:18;15811:43;;15890:6;15885:2;15874:9;15870:18;15863:34;15934:6;15928:3;15917:9;15913:19;15906:35;15978:3;15972;15961:9;15957:19;15950:32;15999:46;16040:3;16029:9;16025:19;16017:6;15999:46;:::i;:::-;15991:54;15395:656;-1:-1:-1;;;;;;;;15395:656:357:o","linkReferences":{}},"methodIdentifiers":{"MESSAGE_VERSION()":"3f827a5a","MIN_GAS_CALLDATA_OVERHEAD()":"028f85f7","MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()":"0c568498","MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()":"2828d7e8","OTHER_MESSENGER()":"9fce812c","PORTAL()":"0ff754ea","RELAY_CALL_OVERHEAD()":"4c1d6a69","RELAY_CONSTANT_OVERHEAD()":"83a74074","RELAY_GAS_CHECK_BUFFER()":"5644cfdf","RELAY_RESERVED_GAS()":"8cbeeef2","baseGas(bytes,uint32)":"b28ade25","failedMessages(bytes32)":"a4e7f8bd","initialize(address,address)":"485cc955","messageNonce()":"ecc70428","otherMessenger()":"db505d80","paused()":"5c975abb","portal()":"6425666b","relayMessage(uint256,address,address,uint256,uint256,bytes)":"d764ad0b","sendMessage(address,bytes,uint32)":"3dbb202b","successfulMessages(bytes32)":"b1b1b209","superchainConfig()":"35e80ab3","version()":"54fd4d50","xDomainMessageSender()":"6e296e45"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SentMessageExtension1\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MESSAGE_VERSION\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_CALLDATA_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_MESSENGER\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PORTAL\",\"outputs\":[{\"internalType\":\"contract OptimismPortal\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_CALL_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_CONSTANT_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_GAS_CHECK_BUFFER\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_RESERVED_GAS\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"}],\"name\":\"baseGas\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract SuperchainConfig\",\"name\":\"_superchainConfig\",\"type\":\"address\"},{\"internalType\":\"contract OptimismPortal\",\"name\":\"_portal\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"otherMessenger\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"portal\",\"outputs\":[{\"internalType\":\"contract OptimismPortal\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superchainConfig\",\"outputs\":[{\"internalType\":\"contract SuperchainConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:proxied\":\"@title L1CrossDomainMessenger\",\"kind\":\"dev\",\"methods\":{\"OTHER_MESSENGER()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"CrossDomainMessenger contract on the other chain.\"}},\"PORTAL()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Contract of the OptimismPortal on this chain.\"}},\"baseGas(bytes,uint32)\":{\"params\":{\"_message\":\"Message to compute the amount of required gas for.\",\"_minGasLimit\":\"Minimum desired gas limit when message goes to target.\"},\"returns\":{\"_0\":\"Amount of gas required to guarantee message receipt.\"}},\"initialize(address,address)\":{\"params\":{\"_portal\":\"Contract of the OptimismPortal contract on this network.\",\"_superchainConfig\":\"Contract of the SuperchainConfig contract on this network.\"}},\"messageNonce()\":{\"returns\":{\"_0\":\"Nonce of the next message to be sent, with added message version.\"}},\"paused()\":{\"returns\":{\"_0\":\"Whether or not the contract is paused.\"}},\"relayMessage(uint256,address,address,uint256,uint256,bytes)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_minGasLimit\":\"Minimum amount of gas that the message can be executed with.\",\"_nonce\":\"Nonce of the message being relayed.\",\"_sender\":\"Address of the user who sent the message.\",\"_target\":\"Address that the message is targeted at.\",\"_value\":\"ETH value to send with the message.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_message\":\"Message to trigger the target address with.\",\"_minGasLimit\":\"Minimum gas limit that the message can be executed with.\",\"_target\":\"Target contract or wallet address.\"}},\"xDomainMessageSender()\":{\"returns\":{\"_0\":\"Address of the sender of the currently executing message on the other chain.\"}}},\"stateVariables\":{\"portal\":{\"custom:network-specific\":\"\"},\"version\":{\"custom:semver\":\"2.3.0\"}},\"version\":1},\"userdoc\":{\"events\":{\"FailedRelayedMessage(bytes32)\":{\"notice\":\"Emitted whenever a message fails to be relayed on this chain.\"},\"RelayedMessage(bytes32)\":{\"notice\":\"Emitted whenever a message is successfully relayed on this chain.\"},\"SentMessage(address,address,bytes,uint256,uint256)\":{\"notice\":\"Emitted whenever a message is sent to the other chain.\"},\"SentMessageExtension1(address,uint256)\":{\"notice\":\"Additional event data to emit, required as of Bedrock. Cannot be merged with the SentMessage event without breaking the ABI of this contract, this is good enough.\"}},\"kind\":\"user\",\"methods\":{\"MESSAGE_VERSION()\":{\"notice\":\"Current message version identifier.\"},\"MIN_GAS_CALLDATA_OVERHEAD()\":{\"notice\":\"Extra gas added to base gas for each byte of calldata in a message.\"},\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()\":{\"notice\":\"Denominator for dynamic overhead added to the base gas for a message.\"},\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()\":{\"notice\":\"Numerator for dynamic overhead added to the base gas for a message.\"},\"OTHER_MESSENGER()\":{\"notice\":\"Retrieves the address of the paired CrossDomainMessenger contract on the other chain Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead.\"},\"PORTAL()\":{\"notice\":\"Getter function for the OptimismPortal contract on this chain. Public getter is legacy and will be removed in the future. Use `portal()` instead.\"},\"RELAY_CALL_OVERHEAD()\":{\"notice\":\"Gas reserved for performing the external call in `relayMessage`.\"},\"RELAY_CONSTANT_OVERHEAD()\":{\"notice\":\"Constant overhead added to the base gas for a message.\"},\"RELAY_GAS_CHECK_BUFFER()\":{\"notice\":\"Gas reserved for the execution between the `hasMinGas` check and the external call in `relayMessage`.\"},\"RELAY_RESERVED_GAS()\":{\"notice\":\"Gas reserved for finalizing the execution of `relayMessage` after the safe call.\"},\"baseGas(bytes,uint32)\":{\"notice\":\"Computes the amount of gas required to guarantee that a given message will be received on the other chain without running out of gas. Guaranteeing that a message will not run out of gas is important because this ensures that a message can always be replayed on the other chain if it fails to execute completely.\"},\"constructor\":{\"notice\":\"Constructs the L1CrossDomainMessenger contract.\"},\"failedMessages(bytes32)\":{\"notice\":\"Mapping of message hashes to a boolean if and only if the message has failed to be executed at least once. A message will not be present in this mapping if it successfully executed on the first attempt.\"},\"initialize(address,address)\":{\"notice\":\"Initializes the contract.\"},\"messageNonce()\":{\"notice\":\"Retrieves the next message nonce. Message version will be added to the upper two bytes of the message nonce. Message version allows us to treat messages as having different structures.\"},\"otherMessenger()\":{\"notice\":\"CrossDomainMessenger contract on the other chain.\"},\"paused()\":{\"notice\":\"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op.\"},\"portal()\":{\"notice\":\"Contract of the OptimismPortal.\"},\"relayMessage(uint256,address,address,uint256,uint256,bytes)\":{\"notice\":\"Relays a message that was sent by the other CrossDomainMessenger contract. Can only be executed via cross-chain call from the other messenger OR if the message was already received once and is currently being replayed.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a message to some target address on the other chain. Note that if the call always reverts, then the message will be unrelayable, and any ETH sent will be permanently locked. The same will occur if the target on the other chain is considered unsafe (see the _isUnsafeTarget() function).\"},\"successfulMessages(bytes32)\":{\"notice\":\"Mapping of message hashes to boolean receipt values. Note that a message will only be present in this mapping if it has successfully been relayed on this chain, and can therefore not be relayed again.\"},\"superchainConfig()\":{\"notice\":\"Contract of the SuperchainConfig.\"},\"version()\":{\"notice\":\"Semantic version.\"},\"xDomainMessageSender()\":{\"notice\":\"Retrieves the address of the contract or wallet that initiated the currently executing message on the other chain. Will throw an error if there is no message currently being executed. Allows the recipient of a call to see who triggered it.\"}},\"notice\":\"The L1CrossDomainMessenger is a message passing interface between L1 and L2 responsible for sending and receiving data on the L1 side. Users are encouraged to use this interface instead of interacting with lower-level contracts directly.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L1/L1CrossDomainMessenger.sol\":\"L1CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"src/L1/L1CrossDomainMessenger.sol\":{\"keccak256\":\"0x1a93450f3f9e2262b32e7831709b01d4491befb79a90cc24509b569103674e06\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2896f906f07fb6ceb7fea3cb31a10b8289db628142cb0612d9890d62bce265b1\",\"dweb:/ipfs/QmYGAMecafbcT4LRBbDCYFj6mPCa3u5hNGUq2tfjWU3s18\"]},\"src/L1/L2OutputOracle.sol\":{\"keccak256\":\"0x342c5084f3c640c90530122bd78372c011d6162e698dd8c8daec9496fef01d42\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8700a3d486bd62cbb861ff80175b8040336940515791073af6a036db7c2df303\",\"dweb:/ipfs/QmSGKTH84rVHWgMg4d6GQZCmCJ16KuUuTsMwPMDdJxCsww\"]},\"src/L1/OptimismPortal.sol\":{\"keccak256\":\"0xf46a1158e86edcbb157d0b06a32db37867c0bc9d2aeeed6a8110547c7537201a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0aeb33d425db200953063e3576403b78c50e3a5e7b4f56ef4bead28919406ee2\",\"dweb:/ipfs/QmUFb1rEQnCFrGRZQPHgFFWJQ48SR7wodiSFLgQKu8Jx6k\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409\",\"dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM\"]},\"src/L1/SuperchainConfig.sol\":{\"keccak256\":\"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f\",\"dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB\"]},\"src/L1/SystemConfig.sol\":{\"keccak256\":\"0xc3d6392cbc44e38ddc93b84b82b08ab8e813df771a48926db3f94edde8f2b64a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d326d644dc59a57a71f4ff6eaa5c6d1464697c7df337b641fe82091b9050e6ce\",\"dweb:/ipfs/Qmd6tNzBmm8V4cpcMNyFWbWnKPNMRoysmmA62rZjGqpg7f\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72\",\"dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Bytes.sol\":{\"keccak256\":\"0x827f47d123b0fdf3b08816d5b33831811704dbf4e554e53f2269354f6bba8859\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3137ac7204d30a245a8b0d67aa6da5286f1bd8c90379daab561f84963b6db782\",\"dweb:/ipfs/QmWRhisw3axJK833gUScs23ETh2MLFbVzzqzYVMKSDN3S9\"]},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b\",\"dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp\"]},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff\",\"dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA\"]},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12\",\"dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF\"]},\"src/libraries/PortalErrors.sol\":{\"keccak256\":\"0x57adcaa45a1ce9c5af04d0fe4ecbc86e6ff3f947f7957ab55bdade129adcf558\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3cf485f11085ad6d1ba1386fdb340f65eb1048187692ad3d9eb8816e290140c1\",\"dweb:/ipfs/Qmb423b45TLV8PdhFa8Hs72eom5D2C5q4gVcYGNzDh4EMU\"]},\"src/libraries/Predeploys.sol\":{\"keccak256\":\"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663\",\"dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe\"]},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"]},\"src/libraries/Storage.sol\":{\"keccak256\":\"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269\",\"dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/libraries/rlp/RLPReader.sol\":{\"keccak256\":\"0x99731a39bc10203719d448117b0e6ef47771890440d595d118084d7988d59afb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1dbeb75d0cc8de58350cc15df8867bf97d8492e0617b1c62733ace6155c6915a\",\"dweb:/ipfs/QmNiXzskPE72h93F8EXT8wAXKzEh2EERLbubdVMfwTQbtj\"]},\"src/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b\",\"dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV\"]},\"src/libraries/trie/MerkleTrie.sol\":{\"keccak256\":\"0xf8ba770ee6666e73ae43184c700e9c704b2c4ace71f9e3c2227ddc11a8148b4c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4702ccee1fe44aea3ee01d59e6152eb755da083f786f00947fec4437c064fe74\",\"dweb:/ipfs/QmQjFj5J7hrEM1dxJjFszzW2Cs7g7eMhYNBXonF2DXBstE\"]},\"src/libraries/trie/SecureMerkleTrie.sol\":{\"keccak256\":\"0xeaff8315cfd21197bc6bc859c2decf5d4f4838c9c357c502cdf2b1eac863d288\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://79dcdcaa560aea51d138da4f5dc553a1808b6de090b2dc1629f18375edbff681\",\"dweb:/ipfs/QmbE4pUPhf5fLKW4W6cEjhQs55gEDvHmbmoBqkW1yz3bnw\"]},\"src/universal/CrossDomainMessenger.sol\":{\"keccak256\":\"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1\",\"dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"src/vendor/AddressAliasHelper.sol\":{\"keccak256\":\"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88\",\"dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"msgHash","type":"bytes32","indexed":true}],"type":"event","name":"FailedRelayedMessage","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"msgHash","type":"bytes32","indexed":true}],"type":"event","name":"RelayedMessage","anonymous":false},{"inputs":[{"internalType":"address","name":"target","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":false},{"internalType":"bytes","name":"message","type":"bytes","indexed":false},{"internalType":"uint256","name":"messageNonce","type":"uint256","indexed":false},{"internalType":"uint256","name":"gasLimit","type":"uint256","indexed":false}],"type":"event","name":"SentMessage","anonymous":false},{"inputs":[{"internalType":"address","name":"sender","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"SentMessageExtension1","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MESSAGE_VERSION","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MIN_GAS_CALLDATA_OVERHEAD","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"OTHER_MESSENGER","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PORTAL","outputs":[{"internalType":"contract OptimismPortal","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RELAY_CALL_OVERHEAD","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RELAY_CONSTANT_OVERHEAD","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RELAY_GAS_CHECK_BUFFER","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RELAY_RESERVED_GAS","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"}],"stateMutability":"pure","type":"function","name":"baseGas","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"failedMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"contract SuperchainConfig","name":"_superchainConfig","type":"address"},{"internalType":"contract OptimismPortal","name":"_portal","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"messageNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"otherMessenger","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"portal","outputs":[{"internalType":"contract OptimismPortal","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_minGasLimit","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"}],"stateMutability":"payable","type":"function","name":"relayMessage"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"}],"stateMutability":"payable","type":"function","name":"sendMessage"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"successfulMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"superchainConfig","outputs":[{"internalType":"contract SuperchainConfig","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"xDomainMessageSender","outputs":[{"internalType":"address","name":"","type":"address"}]}],"devdoc":{"kind":"dev","methods":{"OTHER_MESSENGER()":{"custom:legacy":"","returns":{"_0":"CrossDomainMessenger contract on the other chain."}},"PORTAL()":{"custom:legacy":"","returns":{"_0":"Contract of the OptimismPortal on this chain."}},"baseGas(bytes,uint32)":{"params":{"_message":"Message to compute the amount of required gas for.","_minGasLimit":"Minimum desired gas limit when message goes to target."},"returns":{"_0":"Amount of gas required to guarantee message receipt."}},"initialize(address,address)":{"params":{"_portal":"Contract of the OptimismPortal contract on this network.","_superchainConfig":"Contract of the SuperchainConfig contract on this network."}},"messageNonce()":{"returns":{"_0":"Nonce of the next message to be sent, with added message version."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}},"relayMessage(uint256,address,address,uint256,uint256,bytes)":{"params":{"_message":"Message to send to the target.","_minGasLimit":"Minimum amount of gas that the message can be executed with.","_nonce":"Nonce of the message being relayed.","_sender":"Address of the user who sent the message.","_target":"Address that the message is targeted at.","_value":"ETH value to send with the message."}},"sendMessage(address,bytes,uint32)":{"params":{"_message":"Message to trigger the target address with.","_minGasLimit":"Minimum gas limit that the message can be executed with.","_target":"Target contract or wallet address."}},"xDomainMessageSender()":{"returns":{"_0":"Address of the sender of the currently executing message on the other chain."}}},"version":1},"userdoc":{"kind":"user","methods":{"MESSAGE_VERSION()":{"notice":"Current message version identifier."},"MIN_GAS_CALLDATA_OVERHEAD()":{"notice":"Extra gas added to base gas for each byte of calldata in a message."},"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()":{"notice":"Denominator for dynamic overhead added to the base gas for a message."},"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()":{"notice":"Numerator for dynamic overhead added to the base gas for a message."},"OTHER_MESSENGER()":{"notice":"Retrieves the address of the paired CrossDomainMessenger contract on the other chain Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead."},"PORTAL()":{"notice":"Getter function for the OptimismPortal contract on this chain. Public getter is legacy and will be removed in the future. Use `portal()` instead."},"RELAY_CALL_OVERHEAD()":{"notice":"Gas reserved for performing the external call in `relayMessage`."},"RELAY_CONSTANT_OVERHEAD()":{"notice":"Constant overhead added to the base gas for a message."},"RELAY_GAS_CHECK_BUFFER()":{"notice":"Gas reserved for the execution between the `hasMinGas` check and the external call in `relayMessage`."},"RELAY_RESERVED_GAS()":{"notice":"Gas reserved for finalizing the execution of `relayMessage` after the safe call."},"baseGas(bytes,uint32)":{"notice":"Computes the amount of gas required to guarantee that a given message will be received on the other chain without running out of gas. Guaranteeing that a message will not run out of gas is important because this ensures that a message can always be replayed on the other chain if it fails to execute completely."},"constructor":{"notice":"Constructs the L1CrossDomainMessenger contract."},"failedMessages(bytes32)":{"notice":"Mapping of message hashes to a boolean if and only if the message has failed to be executed at least once. A message will not be present in this mapping if it successfully executed on the first attempt."},"initialize(address,address)":{"notice":"Initializes the contract."},"messageNonce()":{"notice":"Retrieves the next message nonce. Message version will be added to the upper two bytes of the message nonce. Message version allows us to treat messages as having different structures."},"otherMessenger()":{"notice":"CrossDomainMessenger contract on the other chain."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."},"portal()":{"notice":"Contract of the OptimismPortal."},"relayMessage(uint256,address,address,uint256,uint256,bytes)":{"notice":"Relays a message that was sent by the other CrossDomainMessenger contract. Can only be executed via cross-chain call from the other messenger OR if the message was already received once and is currently being replayed."},"sendMessage(address,bytes,uint32)":{"notice":"Sends a message to some target address on the other chain. Note that if the call always reverts, then the message will be unrelayable, and any ETH sent will be permanently locked. The same will occur if the target on the other chain is considered unsafe (see the _isUnsafeTarget() function)."},"successfulMessages(bytes32)":{"notice":"Mapping of message hashes to boolean receipt values. Note that a message will only be present in this mapping if it has successfully been relayed on this chain, and can therefore not be relayed again."},"superchainConfig()":{"notice":"Contract of the SuperchainConfig."},"version()":{"notice":"Semantic version."},"xDomainMessageSender()":{"notice":"Retrieves the address of the contract or wallet that initiated the currently executing message on the other chain. Will throw an error if there is no message currently being executed. Allows the recipient of a call to see who triggered it."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L1/L1CrossDomainMessenger.sol":"L1CrossDomainMessenger"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888","urls":["bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a","dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149","urls":["bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c","dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66","urls":["bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f","dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0","urls":["bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929","dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7","urls":["bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689","dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy"],"license":"MIT"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d","urls":["bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c","dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8"],"license":"MIT"},"src/L1/L1CrossDomainMessenger.sol":{"keccak256":"0x1a93450f3f9e2262b32e7831709b01d4491befb79a90cc24509b569103674e06","urls":["bzz-raw://2896f906f07fb6ceb7fea3cb31a10b8289db628142cb0612d9890d62bce265b1","dweb:/ipfs/QmYGAMecafbcT4LRBbDCYFj6mPCa3u5hNGUq2tfjWU3s18"],"license":"MIT"},"src/L1/L2OutputOracle.sol":{"keccak256":"0x342c5084f3c640c90530122bd78372c011d6162e698dd8c8daec9496fef01d42","urls":["bzz-raw://8700a3d486bd62cbb861ff80175b8040336940515791073af6a036db7c2df303","dweb:/ipfs/QmSGKTH84rVHWgMg4d6GQZCmCJ16KuUuTsMwPMDdJxCsww"],"license":"MIT"},"src/L1/OptimismPortal.sol":{"keccak256":"0xf46a1158e86edcbb157d0b06a32db37867c0bc9d2aeeed6a8110547c7537201a","urls":["bzz-raw://0aeb33d425db200953063e3576403b78c50e3a5e7b4f56ef4bead28919406ee2","dweb:/ipfs/QmUFb1rEQnCFrGRZQPHgFFWJQ48SR7wodiSFLgQKu8Jx6k"],"license":"MIT"},"src/L1/ResourceMetering.sol":{"keccak256":"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408","urls":["bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409","dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM"],"license":"MIT"},"src/L1/SuperchainConfig.sol":{"keccak256":"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d","urls":["bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f","dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB"],"license":"MIT"},"src/L1/SystemConfig.sol":{"keccak256":"0xc3d6392cbc44e38ddc93b84b82b08ab8e813df771a48926db3f94edde8f2b64a","urls":["bzz-raw://d326d644dc59a57a71f4ff6eaa5c6d1464697c7df337b641fe82091b9050e6ce","dweb:/ipfs/Qmd6tNzBmm8V4cpcMNyFWbWnKPNMRoysmmA62rZjGqpg7f"],"license":"MIT"},"src/libraries/Arithmetic.sol":{"keccak256":"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db","urls":["bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72","dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq"],"license":"MIT"},"src/libraries/Burn.sol":{"keccak256":"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010","urls":["bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f","dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"],"license":"MIT"},"src/libraries/Bytes.sol":{"keccak256":"0x827f47d123b0fdf3b08816d5b33831811704dbf4e554e53f2269354f6bba8859","urls":["bzz-raw://3137ac7204d30a245a8b0d67aa6da5286f1bd8c90379daab561f84963b6db782","dweb:/ipfs/QmWRhisw3axJK833gUScs23ETh2MLFbVzzqzYVMKSDN3S9"],"license":"MIT"},"src/libraries/Constants.sol":{"keccak256":"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132","urls":["bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b","dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp"],"license":"MIT"},"src/libraries/Encoding.sol":{"keccak256":"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87","urls":["bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff","dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA"],"license":"MIT"},"src/libraries/Hashing.sol":{"keccak256":"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8","urls":["bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12","dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF"],"license":"MIT"},"src/libraries/PortalErrors.sol":{"keccak256":"0x57adcaa45a1ce9c5af04d0fe4ecbc86e6ff3f947f7957ab55bdade129adcf558","urls":["bzz-raw://3cf485f11085ad6d1ba1386fdb340f65eb1048187692ad3d9eb8816e290140c1","dweb:/ipfs/Qmb423b45TLV8PdhFa8Hs72eom5D2C5q4gVcYGNzDh4EMU"],"license":"MIT"},"src/libraries/Predeploys.sol":{"keccak256":"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02","urls":["bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663","dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe"],"license":"MIT"},"src/libraries/SafeCall.sol":{"keccak256":"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f","urls":["bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a","dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq"],"license":"MIT"},"src/libraries/Storage.sol":{"keccak256":"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f","urls":["bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269","dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK"],"license":"MIT"},"src/libraries/Types.sol":{"keccak256":"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4","urls":["bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e","dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"],"license":"MIT"},"src/libraries/rlp/RLPReader.sol":{"keccak256":"0x99731a39bc10203719d448117b0e6ef47771890440d595d118084d7988d59afb","urls":["bzz-raw://1dbeb75d0cc8de58350cc15df8867bf97d8492e0617b1c62733ace6155c6915a","dweb:/ipfs/QmNiXzskPE72h93F8EXT8wAXKzEh2EERLbubdVMfwTQbtj"],"license":"MIT"},"src/libraries/rlp/RLPWriter.sol":{"keccak256":"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6","urls":["bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b","dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV"],"license":"MIT"},"src/libraries/trie/MerkleTrie.sol":{"keccak256":"0xf8ba770ee6666e73ae43184c700e9c704b2c4ace71f9e3c2227ddc11a8148b4c","urls":["bzz-raw://4702ccee1fe44aea3ee01d59e6152eb755da083f786f00947fec4437c064fe74","dweb:/ipfs/QmQjFj5J7hrEM1dxJjFszzW2Cs7g7eMhYNBXonF2DXBstE"],"license":"MIT"},"src/libraries/trie/SecureMerkleTrie.sol":{"keccak256":"0xeaff8315cfd21197bc6bc859c2decf5d4f4838c9c357c502cdf2b1eac863d288","urls":["bzz-raw://79dcdcaa560aea51d138da4f5dc553a1808b6de090b2dc1629f18375edbff681","dweb:/ipfs/QmbE4pUPhf5fLKW4W6cEjhQs55gEDvHmbmoBqkW1yz3bnw"],"license":"MIT"},"src/universal/CrossDomainMessenger.sol":{"keccak256":"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0","urls":["bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1","dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"},"src/vendor/AddressAliasHelper.sol":{"keccak256":"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237","urls":["bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88","dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR"],"license":"Apache-2.0"}},"version":1},"storageLayout":{"storage":[{"astId":108324,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"spacer_0_0_20","offset":0,"slot":"0","type":"t_address"},{"astId":46970,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"_initialized","offset":20,"slot":"0","type":"t_uint8"},{"astId":46973,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"_initializing","offset":21,"slot":"0","type":"t_bool"},{"astId":108331,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"spacer_1_0_1600","offset":0,"slot":"1","type":"t_array(t_uint256)50_storage"},{"astId":108334,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"spacer_51_0_20","offset":0,"slot":"51","type":"t_address"},{"astId":108339,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"spacer_52_0_1568","offset":0,"slot":"52","type":"t_array(t_uint256)49_storage"},{"astId":108342,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"spacer_101_0_1","offset":0,"slot":"101","type":"t_bool"},{"astId":108347,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"spacer_102_0_1568","offset":0,"slot":"102","type":"t_array(t_uint256)49_storage"},{"astId":108350,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"spacer_151_0_32","offset":0,"slot":"151","type":"t_uint256"},{"astId":108355,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"spacer_152_0_1568","offset":0,"slot":"152","type":"t_array(t_uint256)49_storage"},{"astId":108360,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"spacer_201_0_32","offset":0,"slot":"201","type":"t_mapping(t_bytes32,t_bool)"},{"astId":108365,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"spacer_202_0_32","offset":0,"slot":"202","type":"t_mapping(t_bytes32,t_bool)"},{"astId":108410,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"successfulMessages","offset":0,"slot":"203","type":"t_mapping(t_bytes32,t_bool)"},{"astId":108413,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"xDomainMsgSender","offset":0,"slot":"204","type":"t_address"},{"astId":108416,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"msgNonce","offset":0,"slot":"205","type":"t_uint240"},{"astId":108421,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"failedMessages","offset":0,"slot":"206","type":"t_mapping(t_bytes32,t_bool)"},{"astId":108425,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"otherMessenger","offset":0,"slot":"207","type":"t_contract(CrossDomainMessenger)108888"},{"astId":108430,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"__gap","offset":0,"slot":"208","type":"t_array(t_uint256)43_storage"},{"astId":84986,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"superchainConfig","offset":0,"slot":"251","type":"t_contract(SuperchainConfig)88793"},{"astId":84990,"contract":"src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger","label":"portal","offset":0,"slot":"252","type":"t_contract(OptimismPortal)87104"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_uint256)43_storage":{"encoding":"inplace","label":"uint256[43]","numberOfBytes":"1376","base":"t_uint256"},"t_array(t_uint256)49_storage":{"encoding":"inplace","label":"uint256[49]","numberOfBytes":"1568","base":"t_uint256"},"t_array(t_uint256)50_storage":{"encoding":"inplace","label":"uint256[50]","numberOfBytes":"1600","base":"t_uint256"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_contract(CrossDomainMessenger)108888":{"encoding":"inplace","label":"contract CrossDomainMessenger","numberOfBytes":"20"},"t_contract(OptimismPortal)87104":{"encoding":"inplace","label":"contract OptimismPortal","numberOfBytes":"20"},"t_contract(SuperchainConfig)88793":{"encoding":"inplace","label":"contract SuperchainConfig","numberOfBytes":"20"},"t_mapping(t_bytes32,t_bool)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => bool)","numberOfBytes":"32","value":"t_bool"},"t_uint240":{"encoding":"inplace","label":"uint240","numberOfBytes":"30"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"version":1,"kind":"user","methods":{"MESSAGE_VERSION()":{"notice":"Current message version identifier."},"MIN_GAS_CALLDATA_OVERHEAD()":{"notice":"Extra gas added to base gas for each byte of calldata in a message."},"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()":{"notice":"Denominator for dynamic overhead added to the base gas for a message."},"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()":{"notice":"Numerator for dynamic overhead added to the base gas for a message."},"OTHER_MESSENGER()":{"notice":"Retrieves the address of the paired CrossDomainMessenger contract on the other chain Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead."},"PORTAL()":{"notice":"Getter function for the OptimismPortal contract on this chain. Public getter is legacy and will be removed in the future. Use `portal()` instead."},"RELAY_CALL_OVERHEAD()":{"notice":"Gas reserved for performing the external call in `relayMessage`."},"RELAY_CONSTANT_OVERHEAD()":{"notice":"Constant overhead added to the base gas for a message."},"RELAY_GAS_CHECK_BUFFER()":{"notice":"Gas reserved for the execution between the `hasMinGas` check and the external call in `relayMessage`."},"RELAY_RESERVED_GAS()":{"notice":"Gas reserved for finalizing the execution of `relayMessage` after the safe call."},"baseGas(bytes,uint32)":{"notice":"Computes the amount of gas required to guarantee that a given message will be received on the other chain without running out of gas. Guaranteeing that a message will not run out of gas is important because this ensures that a message can always be replayed on the other chain if it fails to execute completely."},"constructor":{"notice":"Constructs the L1CrossDomainMessenger contract."},"failedMessages(bytes32)":{"notice":"Mapping of message hashes to a boolean if and only if the message has failed to be executed at least once. A message will not be present in this mapping if it successfully executed on the first attempt."},"initialize(address,address)":{"notice":"Initializes the contract."},"messageNonce()":{"notice":"Retrieves the next message nonce. Message version will be added to the upper two bytes of the message nonce. Message version allows us to treat messages as having different structures."},"otherMessenger()":{"notice":"CrossDomainMessenger contract on the other chain."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."},"portal()":{"notice":"Contract of the OptimismPortal."},"relayMessage(uint256,address,address,uint256,uint256,bytes)":{"notice":"Relays a message that was sent by the other CrossDomainMessenger contract. Can only be executed via cross-chain call from the other messenger OR if the message was already received once and is currently being replayed."},"sendMessage(address,bytes,uint32)":{"notice":"Sends a message to some target address on the other chain. Note that if the call always reverts, then the message will be unrelayable, and any ETH sent will be permanently locked. The same will occur if the target on the other chain is considered unsafe (see the _isUnsafeTarget() function)."},"successfulMessages(bytes32)":{"notice":"Mapping of message hashes to boolean receipt values. Note that a message will only be present in this mapping if it has successfully been relayed on this chain, and can therefore not be relayed again."},"superchainConfig()":{"notice":"Contract of the SuperchainConfig."},"version()":{"notice":"Semantic version."},"xDomainMessageSender()":{"notice":"Retrieves the address of the contract or wallet that initiated the currently executing message on the other chain. Will throw an error if there is no message currently being executed. Allows the recipient of a call to see who triggered it."}},"events":{"FailedRelayedMessage(bytes32)":{"notice":"Emitted whenever a message fails to be relayed on this chain."},"RelayedMessage(bytes32)":{"notice":"Emitted whenever a message is successfully relayed on this chain."},"SentMessage(address,address,bytes,uint256,uint256)":{"notice":"Emitted whenever a message is sent to the other chain."},"SentMessageExtension1(address,uint256)":{"notice":"Additional event data to emit, required as of Bedrock. Cannot be merged with the SentMessage event without breaking the ABI of this contract, this is good enough."}},"notice":"The L1CrossDomainMessenger is a message passing interface between L1 and L2 responsible for sending and receiving data on the L1 side. Users are encouraged to use this interface instead of interacting with lower-level contracts directly."},"devdoc":{"version":1,"kind":"dev","methods":{"OTHER_MESSENGER()":{"returns":{"_0":"CrossDomainMessenger contract on the other chain."}},"PORTAL()":{"returns":{"_0":"Contract of the OptimismPortal on this chain."}},"baseGas(bytes,uint32)":{"params":{"_message":"Message to compute the amount of required gas for.","_minGasLimit":"Minimum desired gas limit when message goes to target."},"returns":{"_0":"Amount of gas required to guarantee message receipt."}},"initialize(address,address)":{"params":{"_portal":"Contract of the OptimismPortal contract on this network.","_superchainConfig":"Contract of the SuperchainConfig contract on this network."}},"messageNonce()":{"returns":{"_0":"Nonce of the next message to be sent, with added message version."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}},"relayMessage(uint256,address,address,uint256,uint256,bytes)":{"params":{"_message":"Message to send to the target.","_minGasLimit":"Minimum amount of gas that the message can be executed with.","_nonce":"Nonce of the message being relayed.","_sender":"Address of the user who sent the message.","_target":"Address that the message is targeted at.","_value":"ETH value to send with the message."}},"sendMessage(address,bytes,uint32)":{"params":{"_message":"Message to trigger the target address with.","_minGasLimit":"Minimum gas limit that the message can be executed with.","_target":"Target contract or wallet address."}},"xDomainMessageSender()":{"returns":{"_0":"Address of the sender of the currently executing message on the other chain."}}}},"ast":{"absolutePath":"src/L1/L1CrossDomainMessenger.sol","id":85146,"exportedSymbols":{"CrossDomainMessenger":[108888],"ISemver":[109417],"L1CrossDomainMessenger":[85145],"OptimismPortal":[87104],"Predeploys":[104124],"SuperchainConfig":[88793]},"nodeType":"SourceUnit","src":"32:3102:130","nodes":[{"id":84967,"nodeType":"PragmaDirective","src":"32:23:130","nodes":[],"literals":["solidity","0.8",".15"]},{"id":84969,"nodeType":"ImportDirective","src":"57:58:130","nodes":[],"absolutePath":"src/libraries/Predeploys.sol","file":"src/libraries/Predeploys.sol","nameLocation":"-1:-1:-1","scope":85146,"sourceUnit":104125,"symbolAliases":[{"foreign":{"id":84968,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"66:10:130","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":84971,"nodeType":"ImportDirective","src":"116:59:130","nodes":[],"absolutePath":"src/L1/OptimismPortal.sol","file":"src/L1/OptimismPortal.sol","nameLocation":"-1:-1:-1","scope":85146,"sourceUnit":87105,"symbolAliases":[{"foreign":{"id":84970,"name":"OptimismPortal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87104,"src":"125:14:130","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":84973,"nodeType":"ImportDirective","src":"176:78:130","nodes":[],"absolutePath":"src/universal/CrossDomainMessenger.sol","file":"src/universal/CrossDomainMessenger.sol","nameLocation":"-1:-1:-1","scope":85146,"sourceUnit":108889,"symbolAliases":[{"foreign":{"id":84972,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"185:20:130","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":84975,"nodeType":"ImportDirective","src":"255:52:130","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":85146,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":84974,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"264:7:130","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":84977,"nodeType":"ImportDirective","src":"308:63:130","nodes":[],"absolutePath":"src/L1/SuperchainConfig.sol","file":"src/L1/SuperchainConfig.sol","nameLocation":"-1:-1:-1","scope":85146,"sourceUnit":88794,"symbolAliases":[{"foreign":{"id":84976,"name":"SuperchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88793,"src":"317:16:130","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85145,"nodeType":"ContractDefinition","src":"701:2432:130","nodes":[{"id":84986,"nodeType":"VariableDeclaration","src":"822:40:130","nodes":[],"constant":false,"documentation":{"id":84983,"nodeType":"StructuredDocumentation","src":"772:45:130","text":"@notice Contract of the SuperchainConfig."},"functionSelector":"35e80ab3","mutability":"mutable","name":"superchainConfig","nameLocation":"846:16:130","scope":85145,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},"typeName":{"id":84985,"nodeType":"UserDefinedTypeName","pathNode":{"id":84984,"name":"SuperchainConfig","nodeType":"IdentifierPath","referencedDeclaration":88793,"src":"822:16:130"},"referencedDeclaration":88793,"src":"822:16:130","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"visibility":"public"},{"id":84990,"nodeType":"VariableDeclaration","src":"950:28:130","nodes":[],"constant":false,"documentation":{"id":84987,"nodeType":"StructuredDocumentation","src":"869:76:130","text":"@notice Contract of the OptimismPortal.\n @custom:network-specific"},"functionSelector":"6425666b","mutability":"mutable","name":"portal","nameLocation":"972:6:130","scope":85145,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"},"typeName":{"id":84989,"nodeType":"UserDefinedTypeName","pathNode":{"id":84988,"name":"OptimismPortal","nodeType":"IdentifierPath","referencedDeclaration":87104,"src":"950:14:130"},"referencedDeclaration":87104,"src":"950:14:130","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}},"visibility":"public"},{"id":84994,"nodeType":"VariableDeclaration","src":"1048:40:130","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":84991,"nodeType":"StructuredDocumentation","src":"985:58:130","text":"@notice Semantic version.\n @custom:semver 2.3.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"1071:7:130","scope":85145,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":84992,"name":"string","nodeType":"ElementaryTypeName","src":"1048:6:130","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"322e332e30","id":84993,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1081:7:130","typeDescriptions":{"typeIdentifier":"t_stringliteral_22fd31a466cd79bdd552fae6268088a4b5436c44416a9eb8cc3035d8d9e397ab","typeString":"literal_string \"2.3.0\""},"value":"2.3.0"},"visibility":"public"},{"id":85019,"nodeType":"FunctionDefinition","src":"1159:163:130","nodes":[],"body":{"id":85018,"nodeType":"Block","src":"1196:126:130","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30","id":85004,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1263:1:130","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":85003,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1255:7:130","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85002,"name":"address","nodeType":"ElementaryTypeName","src":"1255:7:130","typeDescriptions":{}}},"id":85005,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1255:10:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":85001,"name":"SuperchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88793,"src":"1238:16:130","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SuperchainConfig_$88793_$","typeString":"type(contract SuperchainConfig)"}},"id":85006,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1238:28:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30","id":85012,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1308:1:130","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":85011,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1300:7:130","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85010,"name":"address","nodeType":"ElementaryTypeName","src":"1300:7:130","typeDescriptions":{}}},"id":85013,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1300:10:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":85009,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1292:8:130","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":85008,"name":"address","nodeType":"ElementaryTypeName","src":"1292:8:130","stateMutability":"payable","typeDescriptions":{}}},"id":85014,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1292:19:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":85007,"name":"OptimismPortal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87104,"src":"1277:14:130","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OptimismPortal_$87104_$","typeString":"type(contract OptimismPortal)"}},"id":85015,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1277:35:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}],"id":85000,"name":"initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85047,"src":"1206:10:130","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_SuperchainConfig_$88793_$_t_contract$_OptimismPortal_$87104_$returns$__$","typeString":"function (contract SuperchainConfig,contract OptimismPortal)"}},"id":85016,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_superchainConfig","_portal"],"nodeType":"FunctionCall","src":"1206:109:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85017,"nodeType":"ExpressionStatement","src":"1206:109:130"}]},"documentation":{"id":84995,"nodeType":"StructuredDocumentation","src":"1095:59:130","text":"@notice Constructs the L1CrossDomainMessenger contract."},"implemented":true,"kind":"constructor","modifiers":[{"arguments":[],"id":84998,"kind":"baseConstructorSpecifier","modifierName":{"id":84997,"name":"CrossDomainMessenger","nodeType":"IdentifierPath","referencedDeclaration":108888,"src":"1173:20:130"},"nodeType":"ModifierInvocation","src":"1173:22:130"}],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":84996,"nodeType":"ParameterList","parameters":[],"src":"1170:2:130"},"returnParameters":{"id":84999,"nodeType":"ParameterList","parameters":[],"src":"1196:0:130"},"scope":85145,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":85047,"nodeType":"FunctionDefinition","src":"1542:296:130","nodes":[],"body":{"id":85046,"nodeType":"Block","src":"1641:197:130","nodes":[],"statements":[{"expression":{"id":85033,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":85031,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84986,"src":"1651:16:130","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":85032,"name":"_superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85023,"src":"1670:17:130","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"src":"1651:36:130","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":85034,"nodeType":"ExpressionStatement","src":"1651:36:130"},{"expression":{"id":85037,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":85035,"name":"portal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84990,"src":"1697:6:130","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":85036,"name":"_portal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85026,"src":"1706:7:130","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}},"src":"1697:16:130","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}},"id":85038,"nodeType":"ExpressionStatement","src":"1697:16:130"},{"expression":{"arguments":[{"arguments":[{"expression":{"id":85041,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"1791:10:130","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":85042,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L2_CROSS_DOMAIN_MESSENGER","nodeType":"MemberAccess","referencedDeclaration":104004,"src":"1791:36:130","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":85040,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"1770:20:130","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CrossDomainMessenger_$108888_$","typeString":"type(contract CrossDomainMessenger)"}},"id":85043,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1770:58:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}],"id":85039,"name":"__CrossDomainMessenger_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108852,"src":"1723:27:130","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_CrossDomainMessenger_$108888_$returns$__$","typeString":"function (contract CrossDomainMessenger)"}},"id":85044,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_otherMessenger"],"nodeType":"FunctionCall","src":"1723:108:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85045,"nodeType":"ExpressionStatement","src":"1723:108:130"}]},"documentation":{"id":85020,"nodeType":"StructuredDocumentation","src":"1328:209:130","text":"@notice Initializes the contract.\n @param _superchainConfig Contract of the SuperchainConfig contract on this network.\n @param _portal Contract of the OptimismPortal contract on this network."},"functionSelector":"485cc955","implemented":true,"kind":"function","modifiers":[{"id":85029,"kind":"modifierInvocation","modifierName":{"id":85028,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":47034,"src":"1629:11:130"},"nodeType":"ModifierInvocation","src":"1629:11:130"}],"name":"initialize","nameLocation":"1551:10:130","parameters":{"id":85027,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85023,"mutability":"mutable","name":"_superchainConfig","nameLocation":"1579:17:130","nodeType":"VariableDeclaration","scope":85047,"src":"1562:34:130","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},"typeName":{"id":85022,"nodeType":"UserDefinedTypeName","pathNode":{"id":85021,"name":"SuperchainConfig","nodeType":"IdentifierPath","referencedDeclaration":88793,"src":"1562:16:130"},"referencedDeclaration":88793,"src":"1562:16:130","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"visibility":"internal"},{"constant":false,"id":85026,"mutability":"mutable","name":"_portal","nameLocation":"1613:7:130","nodeType":"VariableDeclaration","scope":85047,"src":"1598:22:130","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"},"typeName":{"id":85025,"nodeType":"UserDefinedTypeName","pathNode":{"id":85024,"name":"OptimismPortal","nodeType":"IdentifierPath","referencedDeclaration":87104,"src":"1598:14:130"},"referencedDeclaration":87104,"src":"1598:14:130","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}},"visibility":"internal"}],"src":"1561:60:130"},"returnParameters":{"id":85030,"nodeType":"ParameterList","parameters":[],"src":"1641:0:130"},"scope":85145,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":85057,"nodeType":"FunctionDefinition","src":"2107:87:130","nodes":[],"body":{"id":85056,"nodeType":"Block","src":"2164:30:130","nodes":[],"statements":[{"expression":{"id":85054,"name":"portal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84990,"src":"2181:6:130","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}},"functionReturnParameters":85053,"id":85055,"nodeType":"Return","src":"2174:13:130"}]},"documentation":{"id":85048,"nodeType":"StructuredDocumentation","src":"1844:258:130","text":"@notice Getter function for the OptimismPortal contract on this chain.\n Public getter is legacy and will be removed in the future. Use `portal()` instead.\n @return Contract of the OptimismPortal on this chain.\n @custom:legacy"},"functionSelector":"0ff754ea","implemented":true,"kind":"function","modifiers":[],"name":"PORTAL","nameLocation":"2116:6:130","parameters":{"id":85049,"nodeType":"ParameterList","parameters":[],"src":"2122:2:130"},"returnParameters":{"id":85053,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85052,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":85057,"src":"2148:14:130","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"},"typeName":{"id":85051,"nodeType":"UserDefinedTypeName","pathNode":{"id":85050,"name":"OptimismPortal","nodeType":"IdentifierPath","referencedDeclaration":87104,"src":"2148:14:130"},"referencedDeclaration":87104,"src":"2148:14:130","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}},"visibility":"internal"}],"src":"2147:16:130"},"scope":85145,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":85083,"nodeType":"FunctionDefinition","src":"2241:320:130","nodes":[],"body":{"id":85082,"nodeType":"Block","src":"2348:213:130","nodes":[],"statements":[{"expression":{"arguments":[{"id":85075,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85060,"src":"2420:3:130","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85076,"name":"_value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85064,"src":"2445:6:130","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85077,"name":"_gasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85062,"src":"2476:9:130","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},{"hexValue":"66616c7365","id":85078,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2512:5:130","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"id":85079,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85066,"src":"2538:5:130","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":85070,"name":"portal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84990,"src":"2358:6:130","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}},"id":85072,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"depositTransaction","nodeType":"MemberAccess","referencedDeclaration":87068,"src":"2358:25:130","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$_t_uint256_$_t_uint64_$_t_bool_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,uint256,uint64,bool,bytes memory) payable external"}},"id":85074,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":85073,"name":"_value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85064,"src":"2392:6:130","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"2358:42:130","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$_t_uint256_$_t_uint64_$_t_bool_$_t_bytes_memory_ptr_$returns$__$value","typeString":"function (address,uint256,uint64,bool,bytes memory) payable external"}},"id":85080,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_to","_value","_gasLimit","_isCreation","_data"],"nodeType":"FunctionCall","src":"2358:196:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85081,"nodeType":"ExpressionStatement","src":"2358:196:130"}]},"baseFunctions":[108864],"documentation":{"id":85058,"nodeType":"StructuredDocumentation","src":"2200:36:130","text":"@inheritdoc CrossDomainMessenger"},"implemented":true,"kind":"function","modifiers":[],"name":"_sendMessage","nameLocation":"2250:12:130","overrides":{"id":85068,"nodeType":"OverrideSpecifier","overrides":[],"src":"2339:8:130"},"parameters":{"id":85067,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85060,"mutability":"mutable","name":"_to","nameLocation":"2271:3:130","nodeType":"VariableDeclaration","scope":85083,"src":"2263:11:130","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85059,"name":"address","nodeType":"ElementaryTypeName","src":"2263:7:130","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85062,"mutability":"mutable","name":"_gasLimit","nameLocation":"2283:9:130","nodeType":"VariableDeclaration","scope":85083,"src":"2276:16:130","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":85061,"name":"uint64","nodeType":"ElementaryTypeName","src":"2276:6:130","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"},{"constant":false,"id":85064,"mutability":"mutable","name":"_value","nameLocation":"2302:6:130","nodeType":"VariableDeclaration","scope":85083,"src":"2294:14:130","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85063,"name":"uint256","nodeType":"ElementaryTypeName","src":"2294:7:130","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85066,"mutability":"mutable","name":"_data","nameLocation":"2323:5:130","nodeType":"VariableDeclaration","scope":85083,"src":"2310:18:130","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85065,"name":"bytes","nodeType":"ElementaryTypeName","src":"2310:5:130","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2262:67:130"},"returnParameters":{"id":85069,"nodeType":"ParameterList","parameters":[],"src":"2348:0:130"},"scope":85145,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":85108,"nodeType":"FunctionDefinition","src":"2608:168:130","nodes":[],"body":{"id":85107,"nodeType":"Block","src":"2675:101:130","nodes":[],"statements":[{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":85105,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":85096,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":85090,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2692:3:130","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":85091,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2692:10:130","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":85094,"name":"portal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84990,"src":"2714:6:130","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}],"id":85093,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2706:7:130","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85092,"name":"address","nodeType":"ElementaryTypeName","src":"2706:7:130","typeDescriptions":{}}},"id":85095,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2706:15:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2692:29:130","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":85104,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":85097,"name":"portal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84990,"src":"2725:6:130","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}},"id":85098,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"l2Sender","nodeType":"MemberAccess","referencedDeclaration":86489,"src":"2725:15:130","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":85099,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2725:17:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":85102,"name":"otherMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108425,"src":"2754:14:130","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}],"id":85101,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2746:7:130","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85100,"name":"address","nodeType":"ElementaryTypeName","src":"2746:7:130","typeDescriptions":{}}},"id":85103,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2746:23:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2725:44:130","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2692:77:130","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":85089,"id":85106,"nodeType":"Return","src":"2685:84:130"}]},"baseFunctions":[108870],"documentation":{"id":85084,"nodeType":"StructuredDocumentation","src":"2567:36:130","text":"@inheritdoc CrossDomainMessenger"},"implemented":true,"kind":"function","modifiers":[],"name":"_isOtherMessenger","nameLocation":"2617:17:130","overrides":{"id":85086,"nodeType":"OverrideSpecifier","overrides":[],"src":"2651:8:130"},"parameters":{"id":85085,"nodeType":"ParameterList","parameters":[],"src":"2634:2:130"},"returnParameters":{"id":85089,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85088,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":85108,"src":"2669:4:130","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":85087,"name":"bool","nodeType":"ElementaryTypeName","src":"2669:4:130","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2668:6:130"},"scope":85145,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":85132,"nodeType":"FunctionDefinition","src":"2823:158:130","nodes":[],"body":{"id":85131,"nodeType":"Block","src":"2903:78:130","nodes":[],"statements":[{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":85129,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":85122,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":85117,"name":"_target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85111,"src":"2920:7:130","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":85120,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2939:4:130","typeDescriptions":{"typeIdentifier":"t_contract$_L1CrossDomainMessenger_$85145","typeString":"contract L1CrossDomainMessenger"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_L1CrossDomainMessenger_$85145","typeString":"contract L1CrossDomainMessenger"}],"id":85119,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2931:7:130","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85118,"name":"address","nodeType":"ElementaryTypeName","src":"2931:7:130","typeDescriptions":{}}},"id":85121,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2931:13:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2920:24:130","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":85128,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":85123,"name":"_target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85111,"src":"2948:7:130","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":85126,"name":"portal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84990,"src":"2967:6:130","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}],"id":85125,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2959:7:130","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85124,"name":"address","nodeType":"ElementaryTypeName","src":"2959:7:130","typeDescriptions":{}}},"id":85127,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2959:15:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2948:26:130","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2920:54:130","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":85116,"id":85130,"nodeType":"Return","src":"2913:61:130"}]},"baseFunctions":[108878],"documentation":{"id":85109,"nodeType":"StructuredDocumentation","src":"2782:36:130","text":"@inheritdoc CrossDomainMessenger"},"implemented":true,"kind":"function","modifiers":[],"name":"_isUnsafeTarget","nameLocation":"2832:15:130","overrides":{"id":85113,"nodeType":"OverrideSpecifier","overrides":[],"src":"2879:8:130"},"parameters":{"id":85112,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85111,"mutability":"mutable","name":"_target","nameLocation":"2856:7:130","nodeType":"VariableDeclaration","scope":85132,"src":"2848:15:130","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85110,"name":"address","nodeType":"ElementaryTypeName","src":"2848:7:130","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2847:17:130"},"returnParameters":{"id":85116,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85115,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":85132,"src":"2897:4:130","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":85114,"name":"bool","nodeType":"ElementaryTypeName","src":"2897:4:130","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2896:6:130"},"scope":85145,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":85144,"nodeType":"FunctionDefinition","src":"3028:103:130","nodes":[],"body":{"id":85143,"nodeType":"Block","src":"3082:49:130","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":85139,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":84986,"src":"3099:16:130","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":85140,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paused","nodeType":"MemberAccess","referencedDeclaration":88707,"src":"3099:23:130","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_bool_$","typeString":"function () view external returns (bool)"}},"id":85141,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3099:25:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":85138,"id":85142,"nodeType":"Return","src":"3092:32:130"}]},"baseFunctions":[108887],"documentation":{"id":85133,"nodeType":"StructuredDocumentation","src":"2987:36:130","text":"@inheritdoc CrossDomainMessenger"},"functionSelector":"5c975abb","implemented":true,"kind":"function","modifiers":[],"name":"paused","nameLocation":"3037:6:130","overrides":{"id":85135,"nodeType":"OverrideSpecifier","overrides":[],"src":"3058:8:130"},"parameters":{"id":85134,"nodeType":"ParameterList","parameters":[],"src":"3043:2:130"},"returnParameters":{"id":85138,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85137,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":85144,"src":"3076:4:130","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":85136,"name":"bool","nodeType":"ElementaryTypeName","src":"3076:4:130","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3075:6:130"},"scope":85145,"stateMutability":"view","virtual":false,"visibility":"public"}],"abstract":false,"baseContracts":[{"baseName":{"id":84979,"name":"CrossDomainMessenger","nodeType":"IdentifierPath","referencedDeclaration":108888,"src":"736:20:130"},"id":84980,"nodeType":"InheritanceSpecifier","src":"736:20:130"},{"baseName":{"id":84981,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"758:7:130"},"id":84982,"nodeType":"InheritanceSpecifier","src":"758:7:130"}],"canonicalName":"L1CrossDomainMessenger","contractDependencies":[],"contractKind":"contract","documentation":{"id":84978,"nodeType":"StructuredDocumentation","src":"373:328:130","text":"@custom:proxied\n @title L1CrossDomainMessenger\n @notice The L1CrossDomainMessenger is a message passing interface between L1 and L2 responsible\n for sending and receiving data on the L1 side. Users are encouraged to use this\n interface instead of interacting with lower-level contracts directly."},"fullyImplemented":true,"linearizedBaseContracts":[85145,109417,108888,108366,47114,108325],"name":"L1CrossDomainMessenger","nameLocation":"710:22:130","scope":85146,"usedErrors":[]}],"license":"MIT"},"id":130} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/L1ERC721Bridge.json b/packages/sdk/src/forge-artifacts/L1ERC721Bridge.json new file mode 100644 index 000000000000..e986941bf60b --- /dev/null +++ b/packages/sdk/src/forge-artifacts/L1ERC721Bridge.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"MESSENGER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"OTHER_BRIDGE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract StandardBridge"}],"stateMutability":"view"},{"type":"function","name":"bridgeERC721","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bridgeERC721To","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"deposits","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"finalizeBridgeERC721","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[{"name":"_messenger","type":"address","internalType":"contract CrossDomainMessenger"},{"name":"_superchainConfig","type":"address","internalType":"contract SuperchainConfig"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"messenger","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"otherBridge","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract StandardBridge"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"superchainConfig","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract SuperchainConfig"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"ERC721BridgeFinalized","inputs":[{"name":"localToken","type":"address","indexed":true,"internalType":"address"},{"name":"remoteToken","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ERC721BridgeInitiated","inputs":[{"name":"localToken","type":"address","indexed":true,"internalType":"address"},{"name":"remoteToken","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b506200001f60008062000025565b62000234565b600054610100900460ff1615808015620000465750600054600160ff909116105b8062000076575062000063306200018a60201b62000b141760201c565b15801562000076575060005460ff166001145b620000df5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000103576000805461ff0019166101001790555b603280546001600160a01b0319166001600160a01b0384161790556200013e8373420000000000000000000000000000000000001462000199565b801562000185576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054610100900460ff16620002065760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d6565b600180546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b6113e980620002446000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a","sourceMap":"922:4498:131:-:0;;;1492:155;;;;;;;;;-1:-1:-1;1531:109:131::1;1585:1;::::0;1531:10:::1;:109::i;:::-;922:4498:::0;;1869:318;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;;3209:33;3236:4;3209:18;;;;;:33;;:::i;:::-;3208:34;:55;;;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;-1:-1:-1;;;3146:190:43;;216:2:357;3146:190:43;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:357;;;338:44;399:19;;3146:190:43;;;;;;;;;3346:12;:16;;-1:-1:-1;;3346:16:43;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;-1:-1:-1;;3406:20:43;;;;;3372:65;1987:16:131::1;:36:::0;;-1:-1:-1;;;;;;1987:36:131::1;-1:-1:-1::0;;;;;1987:36:131;::::1;;::::0;;2033:147:::1;2079:10:::0;786:42:199::1;2033:19:131;:147::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;-1:-1:-1;;3491:21:43;;;3531:14;;-1:-1:-1;581:36:357;;3531:14:43;;569:2:357;554:18;3531:14:43;;;;;;;3457:99;3090:472;1869:318:131;;:::o;1175:320:59:-;-1:-1:-1;;;;;1465:19:59;;:23;;;1175:320::o;3043:234:224:-;4888:13:43;;;;;;;4880:69;;;;-1:-1:-1;;;4880:69:43;;830:2:357;4880:69:43;;;812:21:357;869:2;849:18;;;842:30;908:34;888:18;;;881:62;-1:-1:-1;;;959:18:357;;;952:41;1010:19;;4880:69:43;628:407:357;4880:69:43;3212:9:224::1;:22:::0;;-1:-1:-1;;;;;3212:22:224;;::::1;-1:-1:-1::0;;;;;;3212:22:224;;::::1;;::::0;;;3244:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;3043:234::o;628:407:357:-;922:4498:131;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a","sourceMap":"922:4498:131:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1279:40;;;;;;;;;;;;216:42:357;204:55;;;186:74;;174:2;159:18;1279:40:131;;;;;;;;5688:971:224;;;;;;:::i;:::-;;:::i;:::-;;829:37;;;;;;;;;1869:318:131;;;;;;:::i;:::-;;:::i;1389:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2226:103::-;;;:::i;:::-;;;3420:14:357;;3413:22;3395:41;;3383:2;3368:18;2226:103:131;3255:187:357;1134:80:131;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3096:1207;;;;;;:::i;:::-;;:::i;3858:98:224:-;3938:11;;;;3858:98;;3511:99;3594:9;;;;3511:99;;7885:428;;;;;;:::i;:::-;;:::i;967:33::-;;;;;;;;;5688:971;6472:10;1465:19:59;:23;6444:89:224;;;;;;;6391:2:357;6444:89:224;;;6373:21:357;6430:2;6410:18;;;6403:30;6469:34;6449:18;;;6442:62;6540:15;6520:18;;;6513:43;6573:19;;6444:89:224;;;;;;;;;6544:108;6566:11;6579:12;6593:10;6605;6617:8;6627:12;6641:10;;6544:21;:108::i;:::-;5688:971;;;;;;:::o;1869:318:131:-;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;-1:-1:-1;3236:4:43;1465:19:59;:23;;;3208:55:43;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;;;;6805:2:357;3146:190:43;;;6787:21:357;6844:2;6824:18;;;6817:30;6883:34;6863:18;;;6856:62;6954:16;6934:18;;;6927:44;6988:19;;3146:190:43;6603:410:357;3146:190:43;3346:12;:16;;;;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;;;;;;;3372:65;1987:16:131::1;:36:::0;;;::::1;;::::0;::::1;;::::0;;2033:147:::1;2079:10:::0;786:42:199::1;2033:19:131;:147::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;;;;;3531:14;;-1:-1:-1;7170:36:357;;3531:14:43;;7158:2:357;7143:18;3531:14:43;;;;;;;3457:99;3090:472;1869:318:131;;:::o;2226:103::-;2297:16;;:25;;;;;;;;2274:4;;2297:16;;;:23;;:25;;;;;;;;;;;;;;:16;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2290:32;;2226:103;:::o;3096:1207::-;2669:9:224;;;;2647:10;:32;:92;;;;-1:-1:-1;2727:11:224;;;2683:9;:32;;;;;;;;2727:11;;;;;2683:9;;;;:30;;:32;;;;;;;;;;;;;;;:9;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;2647:92;2626:202;;;;;;;7957:2:357;2626:202:224;;;7939:21:357;7996:2;7976:18;;;7969:30;8035:34;8015:18;;;8008:62;8106:33;8086:18;;;8079:61;8157:19;;2626:202:224;7755:427:357;2626:202:224;3359:8:131::1;:6;:8::i;:::-;:17;3351:52;;;::::0;::::1;::::0;;8389:2:357;3351:52:131::1;::::0;::::1;8371:21:357::0;8428:2;8408:18;;;8401:30;8467:24;8447:18;;;8440:52;8509:18;;3351:52:131::1;8187:346:357::0;3351:52:131::1;3444:4;3421:28;::::0;::::1;::::0;3413:83:::1;;;::::0;::::1;::::0;;8740:2:357;3413:83:131::1;::::0;::::1;8722:21:357::0;8779:2;8759:18;;;8752:30;8818:34;8798:18;;;8791:62;8889:12;8869:18;;;8862:40;8919:19;;3413:83:131::1;8538:406:357::0;3413:83:131::1;3620:21;::::0;;::::1;;::::0;;;:8:::1;:21;::::0;;;;;;;:35;;::::1;::::0;;;;;;;;:45;;;;;;;::::1;;:53;;:45:::0;:53:::1;3599:157;;;::::0;::::1;::::0;;9151:2:357;3599:157:131::1;::::0;::::1;9133:21:357::0;9190:2;9170:18;;;9163:30;9229:34;9209:18;;;9202:62;9300:27;9280:18;;;9273:55;9345:19;;3599:157:131::1;8949:421:357::0;3599:157:131::1;3878:21;::::0;;::::1;3926:5;3878:21:::0;;;:8:::1;:21;::::0;;;;;;;:35;;::::1;::::0;;;;;;;:45;;;;;;;;;;:53;;;::::1;::::0;;4053:90;;;;4107:4:::1;4053:90;::::0;::::1;9638:34:357::0;9708:15;;;9688:18;;;9681:43;9740:18;;;9733:34;;;3878:21:131;4053:37:::1;::::0;9550:18:357;;4053:90:131::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4263:5;4214:82;;4249:12;4214:82;;4236:11;4214:82;;;4270:3;4275:8;4285:10;;4214:82;;;;;;;;;:::i;:::-;;;;;;;;3096:1207:::0;;;;;;;:::o;7885:428:224:-;8124:17;;;8116:78;;;;;;;10750:2:357;8116:78:224;;;10732:21:357;10789:2;10769:18;;;10762:30;10828:34;10808:18;;;10801:62;10899:18;10879;;;10872:46;10935:19;;8116:78:224;10548:412:357;8116:78:224;8205:101;8227:11;8240:12;8254:10;8266:3;8271:8;8281:12;8295:10;;8205:21;:101::i;:::-;7885:428;;;;;;;:::o;1175:320:59:-;1465:19;;;:23;;;1175:320::o;4342:1076:131:-;4628:26;;;4620:88;;;;;;;11167:2:357;4620:88:131;;;11149:21:357;11206:2;11186:18;;;11179:30;11245:34;11225:18;;;11218:62;11316:19;11296:18;;;11289:47;11353:19;;4620:88:131;10965:413:357;4620:88:131;4798:20;4857:44;;;4903:12;4917:11;4930:5;4937:3;4942:8;4952:10;;4821:151;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5017:21;;;;-1:-1:-1;5017:21:131;;;:8;:21;;;;;:35;;;;;;;;;;:45;;;;;;;;;;:52;;;;5065:4;5017:52;;;5079:88;;;;;9656:15:357;;;5079:88:131;;;9638:34:357;5140:4:131;9688:18:357;;;9681:43;9740:18;;;9733:34;;;4821:151:131;;-1:-1:-1;5079:33:131;;9550:18:357;;5079:88:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5211:9:131;;5252:11;;5211:103;;;;;:9;;;;;-1:-1:-1;5211:21:131;;-1:-1:-1;5211:103:131;;5252:11;;;;5276:7;;5299:12;;5211:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5378:5;5329:82;;5364:12;5329:82;;5351:11;5329:82;;;5385:3;5390:8;5400:10;;5329:82;;;;;;;;;:::i;:::-;;;;;;;;4610:808;4342:1076;;;;;;;;:::o;3043:234:224:-;4888:13:43;;;;;;;4880:69;;;;;;;12719:2:357;4880:69:43;;;12701:21:357;12758:2;12738:18;;;12731:30;12797:34;12777:18;;;12770:62;12868:13;12848:18;;;12841:41;12899:19;;4880:69:43;12517:407:357;4880:69:43;3212:9:224::1;:22:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;3244:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;3043:234::o;271:154:357:-;357:42;350:5;346:54;339:5;336:65;326:93;;415:1;412;405:12;326:93;271:154;:::o;430:163::-;497:20;;557:10;546:22;;536:33;;526:61;;583:1;580;573:12;526:61;430:163;;;:::o;598:347::-;649:8;659:6;713:3;706:4;698:6;694:17;690:27;680:55;;731:1;728;721:12;680:55;-1:-1:-1;754:20:357;;797:18;786:30;;783:50;;;829:1;826;819:12;783:50;866:4;858:6;854:17;842:29;;918:3;911:4;902:6;894;890:19;886:30;883:39;880:59;;;935:1;932;925:12;880:59;598:347;;;;;:::o;950:827::-;1055:6;1063;1071;1079;1087;1095;1148:3;1136:9;1127:7;1123:23;1119:33;1116:53;;;1165:1;1162;1155:12;1116:53;1204:9;1191:23;1223:31;1248:5;1223:31;:::i;:::-;1273:5;-1:-1:-1;1330:2:357;1315:18;;1302:32;1343:33;1302:32;1343:33;:::i;:::-;1395:7;-1:-1:-1;1449:2:357;1434:18;;1421:32;;-1:-1:-1;1472:37:357;1505:2;1490:18;;1472:37;:::i;:::-;1462:47;;1560:3;1549:9;1545:19;1532:33;1588:18;1580:6;1577:30;1574:50;;;1620:1;1617;1610:12;1574:50;1659:58;1709:7;1700:6;1689:9;1685:22;1659:58;:::i;:::-;950:827;;;;-1:-1:-1;950:827:357;;-1:-1:-1;950:827:357;;1736:8;;950:827;-1:-1:-1;;;950:827:357:o;2044:445::-;2169:6;2177;2230:2;2218:9;2209:7;2205:23;2201:32;2198:52;;;2246:1;2243;2236:12;2198:52;2285:9;2272:23;2304:31;2329:5;2304:31;:::i;:::-;2354:5;-1:-1:-1;2411:2:357;2396:18;;2383:32;2424:33;2383:32;2424:33;:::i;:::-;2476:7;2466:17;;;2044:445;;;;;:::o;2494:531::-;2536:3;2574:5;2568:12;2601:6;2596:3;2589:19;2626:1;2636:162;2650:6;2647:1;2644:13;2636:162;;;2712:4;2768:13;;;2764:22;;2758:29;2740:11;;;2736:20;;2729:59;2665:12;2636:162;;;2816:6;2813:1;2810:13;2807:87;;;2882:1;2875:4;2866:6;2861:3;2857:16;2853:27;2846:38;2807:87;-1:-1:-1;2939:2:357;2927:15;2944:66;2923:88;2914:98;;;;3014:4;2910:109;;2494:531;-1:-1:-1;;2494:531:357:o;3030:220::-;3179:2;3168:9;3161:21;3142:4;3199:45;3240:2;3229:9;3225:18;3217:6;3199:45;:::i;:::-;3191:53;3030:220;-1:-1:-1;;;3030:220:357:o;3447:456::-;3524:6;3532;3540;3593:2;3581:9;3572:7;3568:23;3564:32;3561:52;;;3609:1;3606;3599:12;3561:52;3648:9;3635:23;3667:31;3692:5;3667:31;:::i;:::-;3717:5;-1:-1:-1;3774:2:357;3759:18;;3746:32;3787:33;3746:32;3787:33;:::i;:::-;3447:456;;3839:7;;-1:-1:-1;;;3893:2:357;3878:18;;;;3865:32;;3447:456::o;3908:1038::-;4023:6;4031;4039;4047;4055;4063;4071;4124:3;4112:9;4103:7;4099:23;4095:33;4092:53;;;4141:1;4138;4131:12;4092:53;4180:9;4167:23;4199:31;4224:5;4199:31;:::i;:::-;4249:5;-1:-1:-1;4306:2:357;4291:18;;4278:32;4319:33;4278:32;4319:33;:::i;:::-;4371:7;-1:-1:-1;4430:2:357;4415:18;;4402:32;4443:33;4402:32;4443:33;:::i;:::-;4495:7;-1:-1:-1;4554:2:357;4539:18;;4526:32;4567:33;4526:32;4567:33;:::i;:::-;4619:7;-1:-1:-1;4673:3:357;4658:19;;4645:33;;-1:-1:-1;4729:3:357;4714:19;;4701:33;4757:18;4746:30;;4743:50;;;4789:1;4786;4779:12;4743:50;4828:58;4878:7;4869:6;4858:9;4854:22;4828:58;:::i;:::-;3908:1038;;;;-1:-1:-1;3908:1038:357;;-1:-1:-1;3908:1038:357;;;;4802:84;;-1:-1:-1;;;3908:1038:357:o;5215:969::-;5329:6;5337;5345;5353;5361;5369;5377;5430:3;5418:9;5409:7;5405:23;5401:33;5398:53;;;5447:1;5444;5437:12;5398:53;5486:9;5473:23;5505:31;5530:5;5505:31;:::i;:::-;5555:5;-1:-1:-1;5612:2:357;5597:18;;5584:32;5625:33;5584:32;5625:33;:::i;:::-;5677:7;-1:-1:-1;5736:2:357;5721:18;;5708:32;5749:33;5708:32;5749:33;:::i;:::-;5801:7;-1:-1:-1;5855:2:357;5840:18;;5827:32;;-1:-1:-1;5878:38:357;5911:3;5896:19;;5878:38;:::i;:::-;5868:48;;5967:3;5956:9;5952:19;5939:33;5995:18;5987:6;5984:30;5981:50;;;6027:1;6024;6017:12;7217:277;7284:6;7337:2;7325:9;7316:7;7312:23;7308:32;7305:52;;;7353:1;7350;7343:12;7305:52;7385:9;7379:16;7438:5;7431:13;7424:21;7417:5;7414:32;7404:60;;7460:1;7457;7450:12;7499:251;7569:6;7622:2;7610:9;7601:7;7597:23;7593:32;7590:52;;;7638:1;7635;7628:12;7590:52;7670:9;7664:16;7689:31;7714:5;7689:31;:::i;9778:325::-;9866:6;9861:3;9854:19;9918:6;9911:5;9904:4;9899:3;9895:14;9882:43;;9970:1;9963:4;9954:6;9949:3;9945:16;9941:27;9934:38;9836:3;10092:4;10022:66;10017:2;10009:6;10005:15;10001:88;9996:3;9992:98;9988:109;9981:116;;9778:325;;;;:::o;10108:435::-;10333:42;10325:6;10321:55;10310:9;10303:74;10413:6;10408:2;10397:9;10393:18;10386:34;10456:2;10451;10440:9;10436:18;10429:30;10284:4;10476:61;10533:2;10522:9;10518:18;10510:6;10502;10476:61;:::i;:::-;10468:69;10108:435;-1:-1:-1;;;;;;10108:435:357:o;11383:700::-;11643:4;11672:42;11753:2;11745:6;11741:15;11730:9;11723:34;11805:2;11797:6;11793:15;11788:2;11777:9;11773:18;11766:43;11857:2;11849:6;11845:15;11840:2;11829:9;11825:18;11818:43;11909:2;11901:6;11897:15;11892:2;11881:9;11877:18;11870:43;;11950:6;11944:3;11933:9;11929:19;11922:35;11994:3;11988;11977:9;11973:19;11966:32;12015:62;12072:3;12061:9;12057:19;12049:6;12041;12015:62;:::i;:::-;12007:70;11383:700;-1:-1:-1;;;;;;;;;11383:700:357:o;12088:424::-;12301:42;12293:6;12289:55;12278:9;12271:74;12381:2;12376;12365:9;12361:18;12354:30;12252:4;12401:45;12442:2;12431:9;12427:18;12419:6;12401:45;:::i;:::-;12393:53;;12494:10;12486:6;12482:23;12477:2;12466:9;12462:18;12455:51;12088:424;;;;;;:::o","linkReferences":{}},"methodIdentifiers":{"MESSENGER()":"927ede2d","OTHER_BRIDGE()":"7f46ddb2","bridgeERC721(address,address,uint256,uint32,bytes)":"3687011a","bridgeERC721To(address,address,address,uint256,uint32,bytes)":"aa557452","deposits(address,address,uint256)":"5d93a3fc","finalizeBridgeERC721(address,address,address,address,uint256,bytes)":"761f4493","initialize(address,address)":"485cc955","messenger()":"3cb747bf","otherBridge()":"c89701a2","paused()":"5c975abb","superchainConfig()":"35e80ab3","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC721BridgeFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC721BridgeInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_BRIDGE\",\"outputs\":[{\"internalType\":\"contract StandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC721To\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeBridgeERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"contract SuperchainConfig\",\"name\":\"_superchainConfig\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"otherBridge\",\"outputs\":[{\"internalType\":\"contract StandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superchainConfig\",\"outputs\":[{\"internalType\":\"contract SuperchainConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"MESSENGER()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Messenger contract on this domain.\"}},\"OTHER_BRIDGE()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Contract of the bridge on the other network.\"}},\"bridgeERC721(address,address,uint256,uint32,bytes)\":{\"params\":{\"_extraData\":\"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.\",\"_localToken\":\"Address of the ERC721 on this domain.\",\"_minGasLimit\":\"Minimum gas limit for the bridge message on the other domain.\",\"_remoteToken\":\"Address of the ERC721 on the remote domain.\",\"_tokenId\":\"Token ID to bridge.\"}},\"bridgeERC721To(address,address,address,uint256,uint32,bytes)\":{\"params\":{\"_extraData\":\"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.\",\"_localToken\":\"Address of the ERC721 on this domain.\",\"_minGasLimit\":\"Minimum gas limit for the bridge message on the other domain.\",\"_remoteToken\":\"Address of the ERC721 on the remote domain.\",\"_to\":\"Address to receive the token on the other domain.\",\"_tokenId\":\"Token ID to bridge.\"}},\"finalizeBridgeERC721(address,address,address,address,uint256,bytes)\":{\"params\":{\"_extraData\":\"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.\",\"_from\":\"Address that triggered the bridge on the other domain.\",\"_localToken\":\"Address of the ERC721 token on this domain.\",\"_remoteToken\":\"Address of the ERC721 token on the other domain.\",\"_to\":\"Address to receive the token on this domain.\",\"_tokenId\":\"ID of the token being deposited.\"}},\"initialize(address,address)\":{\"params\":{\"_messenger\":\"Contract of the CrossDomainMessenger on this network.\",\"_superchainConfig\":\"Contract of the SuperchainConfig contract on this network.\"}},\"paused()\":{\"returns\":{\"_0\":\"Whether or not the contract is paused.\"}}},\"stateVariables\":{\"version\":{\"custom:semver\":\"2.1.0\"}},\"title\":\"L1ERC721Bridge\",\"version\":1},\"userdoc\":{\"events\":{\"ERC721BridgeFinalized(address,address,address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ERC721 bridge from the other network is finalized.\"},\"ERC721BridgeInitiated(address,address,address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ERC721 bridge to the other network is initiated.\"}},\"kind\":\"user\",\"methods\":{\"MESSENGER()\":{\"notice\":\"Legacy getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead.\"},\"OTHER_BRIDGE()\":{\"notice\":\"Legacy getter for other bridge address. Public getter is legacy and will be removed in the future. Use `otherBridge` instead.\"},\"bridgeERC721(address,address,uint256,uint32,bytes)\":{\"notice\":\"Initiates a bridge of an NFT to the caller's account on the other chain. Note that this function can only be called by EOAs. Smart contract wallets should use the `bridgeERC721To` function after ensuring that the recipient address on the remote chain exists. Also note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2.\"},\"bridgeERC721To(address,address,address,uint256,uint32,bytes)\":{\"notice\":\"Initiates a bridge of an NFT to some recipient's account on the other chain. Note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2.\"},\"constructor\":{\"notice\":\"Constructs the L1ERC721Bridge contract.\"},\"deposits(address,address,uint256)\":{\"notice\":\"Mapping of L1 token to L2 token to ID to boolean, indicating if the given L1 token by ID was deposited for a given L2 token.\"},\"finalizeBridgeERC721(address,address,address,address,uint256,bytes)\":{\"notice\":\"Completes an ERC721 bridge from the other domain and sends the ERC721 token to the recipient on this domain.\"},\"initialize(address,address)\":{\"notice\":\"Initializes the contract.\"},\"messenger()\":{\"notice\":\"Messenger contract on this domain.\"},\"otherBridge()\":{\"notice\":\"Contract of the bridge on the other network.\"},\"paused()\":{\"notice\":\"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op.\"},\"superchainConfig()\":{\"notice\":\"Address of the SuperchainConfig contract.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"The L1 ERC721 bridge is a contract which works together with the L2 ERC721 bridge to make it possible to transfer ERC721 tokens from Ethereum to Optimism. This contract acts as an escrow for ERC721 tokens deposited into L2.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L1/L1ERC721Bridge.sol\":\"L1ERC721Bridge\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0\",\"dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95\",\"dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6\",\"dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf\"]},\"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0xed6a749c5373af398105ce6ee3ac4763aa450ea7285d268c85d9eeca809cdb1f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://20a97f891d06f0fe91560ea1a142aaa26fdd22bed1b51606b7d48f670deeb50f\",\"dweb:/ipfs/QmTbCtZKChpaX5H2iRiTDMcSz29GSLCpTCDgJpcMR4wg8x\"]},\"lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol\":{\"keccak256\":\"0xd1556954440b31c97a142c6ba07d5cade45f96fafd52091d33a14ebe365aecbf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26fef835622b46a5ba08b3ef6b46a22e94b5f285d0f0fb66b703bd30217d2c34\",\"dweb:/ipfs/QmZ548qdwfL1qF7aXz3xh1GCdTiST81kGGuKRqVUfYmPZR\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\":{\"keccak256\":\"0xc65c83c1039508fa7a42a09a3c6a32babd1c438ba4dbb23581255e784b5d5eed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1b3b38db0f76429db899909025e534c366415e9ea8b5ddc4c8901e6a7fc1461\",\"dweb:/ipfs/QmYv1KxyHjLEky9JWNSsSfpGJbiCxFyzVFgTwQKpiqYGUg\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"src/L1/L1ERC721Bridge.sol\":{\"keccak256\":\"0x2a3177a2b025bf7ac58450d7dfc7f4f984a265b651d9f57f83c4b43d9fe5ebdd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f24ea47b324c2683f3dd00f5b47c93bfe7b45fda3dd85c2fc08999c2f1e62db\",\"dweb:/ipfs/QmTKM64r67YGyRamy2pwBA47N7HeD6fk5HEMd3nM3vNkAK\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409\",\"dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM\"]},\"src/L1/SuperchainConfig.sol\":{\"keccak256\":\"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f\",\"dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB\"]},\"src/L2/L2ERC721Bridge.sol\":{\"keccak256\":\"0xcacb39a7b6e5d2d5293834195363397010130ab88d2f4de860277dae6d4265f9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f6cdcf63276957f9ca614567394b11ab3f6877baa5a6d33bf54dd8022ca2021f\",\"dweb:/ipfs/QmZQBBfjk2UPLFtKeTd5DJCTRWw1KxKbQMmWr8WVDzZsat\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72\",\"dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b\",\"dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp\"]},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff\",\"dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA\"]},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12\",\"dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF\"]},\"src/libraries/Predeploys.sol\":{\"keccak256\":\"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663\",\"dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe\"]},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"]},\"src/libraries/Storage.sol\":{\"keccak256\":\"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269\",\"dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b\",\"dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV\"]},\"src/universal/CrossDomainMessenger.sol\":{\"keccak256\":\"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1\",\"dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n\"]},\"src/universal/ERC721Bridge.sol\":{\"keccak256\":\"0xea04387e26c6b3ba2ce5762166b7f790ccb068012f2cd5cc16c5734b47e1cb4f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://37a697c0886aa201672ded4196c3e5506903522183f27c9c3455ccdbd5e1c3cb\",\"dweb:/ipfs/QmdxhxBFR8J2obRzuFCMtUirB4Fsc8CvKwNwR8DFc9SEGK\"]},\"src/universal/IOptimismMintableERC20.sol\":{\"keccak256\":\"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf\",\"dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ\"]},\"src/universal/IOptimismMintableERC721.sol\":{\"keccak256\":\"0xb3a65b067e67a9e1fa0493401c8d247970377c6725eba4e7b02ce8099c4f4f52\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://86bb6864027560ade2f4ced6a6e34213cbff8002977dc365377e5a0b473cf17b\",\"dweb:/ipfs/QmQvjtodTK27as1g1PzsYk9NyJJ3X6a6251o1vrBwx7DPT\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"src/universal/OptimismMintableERC20.sol\":{\"keccak256\":\"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7\",\"dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa\"]},\"src/universal/StandardBridge.sol\":{\"keccak256\":\"0x1a2f6afd7f14430ae2b797e09497c3dc860ed5db752e1847e30649668060c01d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fefe1356cdeb5b324e4e63e1c723c08f9e244ef2ef133b9f5df0cc0d180eeaa8\",\"dweb:/ipfs/QmZzR3zWKodwdwrdWwXUyh7G3qcFn2cjUQLrE45gRyQMn3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"localToken","type":"address","indexed":true},{"internalType":"address","name":"remoteToken","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ERC721BridgeFinalized","anonymous":false},{"inputs":[{"internalType":"address","name":"localToken","type":"address","indexed":true},{"internalType":"address","name":"remoteToken","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ERC721BridgeInitiated","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MESSENGER","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"OTHER_BRIDGE","outputs":[{"internalType":"contract StandardBridge","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"bridgeERC721"},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"bridgeERC721To"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"deposits","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"finalizeBridgeERC721"},{"inputs":[{"internalType":"contract CrossDomainMessenger","name":"_messenger","type":"address"},{"internalType":"contract SuperchainConfig","name":"_superchainConfig","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"messenger","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"otherBridge","outputs":[{"internalType":"contract StandardBridge","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"superchainConfig","outputs":[{"internalType":"contract SuperchainConfig","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"MESSENGER()":{"custom:legacy":"","returns":{"_0":"Messenger contract on this domain."}},"OTHER_BRIDGE()":{"custom:legacy":"","returns":{"_0":"Contract of the bridge on the other network."}},"bridgeERC721(address,address,uint256,uint32,bytes)":{"params":{"_extraData":"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.","_localToken":"Address of the ERC721 on this domain.","_minGasLimit":"Minimum gas limit for the bridge message on the other domain.","_remoteToken":"Address of the ERC721 on the remote domain.","_tokenId":"Token ID to bridge."}},"bridgeERC721To(address,address,address,uint256,uint32,bytes)":{"params":{"_extraData":"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.","_localToken":"Address of the ERC721 on this domain.","_minGasLimit":"Minimum gas limit for the bridge message on the other domain.","_remoteToken":"Address of the ERC721 on the remote domain.","_to":"Address to receive the token on the other domain.","_tokenId":"Token ID to bridge."}},"finalizeBridgeERC721(address,address,address,address,uint256,bytes)":{"params":{"_extraData":"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.","_from":"Address that triggered the bridge on the other domain.","_localToken":"Address of the ERC721 token on this domain.","_remoteToken":"Address of the ERC721 token on the other domain.","_to":"Address to receive the token on this domain.","_tokenId":"ID of the token being deposited."}},"initialize(address,address)":{"params":{"_messenger":"Contract of the CrossDomainMessenger on this network.","_superchainConfig":"Contract of the SuperchainConfig contract on this network."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}}},"version":1},"userdoc":{"kind":"user","methods":{"MESSENGER()":{"notice":"Legacy getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead."},"OTHER_BRIDGE()":{"notice":"Legacy getter for other bridge address. Public getter is legacy and will be removed in the future. Use `otherBridge` instead."},"bridgeERC721(address,address,uint256,uint32,bytes)":{"notice":"Initiates a bridge of an NFT to the caller's account on the other chain. Note that this function can only be called by EOAs. Smart contract wallets should use the `bridgeERC721To` function after ensuring that the recipient address on the remote chain exists. Also note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2."},"bridgeERC721To(address,address,address,uint256,uint32,bytes)":{"notice":"Initiates a bridge of an NFT to some recipient's account on the other chain. Note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2."},"constructor":{"notice":"Constructs the L1ERC721Bridge contract."},"deposits(address,address,uint256)":{"notice":"Mapping of L1 token to L2 token to ID to boolean, indicating if the given L1 token by ID was deposited for a given L2 token."},"finalizeBridgeERC721(address,address,address,address,uint256,bytes)":{"notice":"Completes an ERC721 bridge from the other domain and sends the ERC721 token to the recipient on this domain."},"initialize(address,address)":{"notice":"Initializes the contract."},"messenger()":{"notice":"Messenger contract on this domain."},"otherBridge()":{"notice":"Contract of the bridge on the other network."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."},"superchainConfig()":{"notice":"Address of the SuperchainConfig contract."},"version()":{"notice":"Semantic version."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L1/L1ERC721Bridge.sol":"L1ERC721Bridge"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66","urls":["bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f","dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"keccak256":"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238","urls":["bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0","dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca","urls":["bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd","dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"keccak256":"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329","urls":["bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95","dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29","urls":["bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6","dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol":{"keccak256":"0xed6a749c5373af398105ce6ee3ac4763aa450ea7285d268c85d9eeca809cdb1f","urls":["bzz-raw://20a97f891d06f0fe91560ea1a142aaa26fdd22bed1b51606b7d48f670deeb50f","dweb:/ipfs/QmTbCtZKChpaX5H2iRiTDMcSz29GSLCpTCDgJpcMR4wg8x"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol":{"keccak256":"0xd1556954440b31c97a142c6ba07d5cade45f96fafd52091d33a14ebe365aecbf","urls":["bzz-raw://26fef835622b46a5ba08b3ef6b46a22e94b5f285d0f0fb66b703bd30217d2c34","dweb:/ipfs/QmZ548qdwfL1qF7aXz3xh1GCdTiST81kGGuKRqVUfYmPZR"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"keccak256":"0xc65c83c1039508fa7a42a09a3c6a32babd1c438ba4dbb23581255e784b5d5eed","urls":["bzz-raw://a1b3b38db0f76429db899909025e534c366415e9ea8b5ddc4c8901e6a7fc1461","dweb:/ipfs/QmYv1KxyHjLEky9JWNSsSfpGJbiCxFyzVFgTwQKpiqYGUg"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1","urls":["bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f","dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0","urls":["bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929","dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7","urls":["bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689","dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy"],"license":"MIT"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d","urls":["bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c","dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8"],"license":"MIT"},"src/L1/L1ERC721Bridge.sol":{"keccak256":"0x2a3177a2b025bf7ac58450d7dfc7f4f984a265b651d9f57f83c4b43d9fe5ebdd","urls":["bzz-raw://2f24ea47b324c2683f3dd00f5b47c93bfe7b45fda3dd85c2fc08999c2f1e62db","dweb:/ipfs/QmTKM64r67YGyRamy2pwBA47N7HeD6fk5HEMd3nM3vNkAK"],"license":"MIT"},"src/L1/ResourceMetering.sol":{"keccak256":"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408","urls":["bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409","dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM"],"license":"MIT"},"src/L1/SuperchainConfig.sol":{"keccak256":"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d","urls":["bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f","dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB"],"license":"MIT"},"src/L2/L2ERC721Bridge.sol":{"keccak256":"0xcacb39a7b6e5d2d5293834195363397010130ab88d2f4de860277dae6d4265f9","urls":["bzz-raw://f6cdcf63276957f9ca614567394b11ab3f6877baa5a6d33bf54dd8022ca2021f","dweb:/ipfs/QmZQBBfjk2UPLFtKeTd5DJCTRWw1KxKbQMmWr8WVDzZsat"],"license":"MIT"},"src/libraries/Arithmetic.sol":{"keccak256":"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db","urls":["bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72","dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq"],"license":"MIT"},"src/libraries/Burn.sol":{"keccak256":"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010","urls":["bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f","dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"],"license":"MIT"},"src/libraries/Constants.sol":{"keccak256":"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132","urls":["bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b","dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp"],"license":"MIT"},"src/libraries/Encoding.sol":{"keccak256":"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87","urls":["bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff","dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA"],"license":"MIT"},"src/libraries/Hashing.sol":{"keccak256":"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8","urls":["bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12","dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF"],"license":"MIT"},"src/libraries/Predeploys.sol":{"keccak256":"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02","urls":["bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663","dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe"],"license":"MIT"},"src/libraries/SafeCall.sol":{"keccak256":"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f","urls":["bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a","dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq"],"license":"MIT"},"src/libraries/Storage.sol":{"keccak256":"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f","urls":["bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269","dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK"],"license":"MIT"},"src/libraries/Types.sol":{"keccak256":"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4","urls":["bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e","dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"],"license":"MIT"},"src/libraries/rlp/RLPWriter.sol":{"keccak256":"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6","urls":["bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b","dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV"],"license":"MIT"},"src/universal/CrossDomainMessenger.sol":{"keccak256":"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0","urls":["bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1","dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n"],"license":"MIT"},"src/universal/ERC721Bridge.sol":{"keccak256":"0xea04387e26c6b3ba2ce5762166b7f790ccb068012f2cd5cc16c5734b47e1cb4f","urls":["bzz-raw://37a697c0886aa201672ded4196c3e5506903522183f27c9c3455ccdbd5e1c3cb","dweb:/ipfs/QmdxhxBFR8J2obRzuFCMtUirB4Fsc8CvKwNwR8DFc9SEGK"],"license":"MIT"},"src/universal/IOptimismMintableERC20.sol":{"keccak256":"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c","urls":["bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf","dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ"],"license":"MIT"},"src/universal/IOptimismMintableERC721.sol":{"keccak256":"0xb3a65b067e67a9e1fa0493401c8d247970377c6725eba4e7b02ce8099c4f4f52","urls":["bzz-raw://86bb6864027560ade2f4ced6a6e34213cbff8002977dc365377e5a0b473cf17b","dweb:/ipfs/QmQvjtodTK27as1g1PzsYk9NyJJ3X6a6251o1vrBwx7DPT"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"},"src/universal/OptimismMintableERC20.sol":{"keccak256":"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df","urls":["bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7","dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa"],"license":"MIT"},"src/universal/StandardBridge.sol":{"keccak256":"0x1a2f6afd7f14430ae2b797e09497c3dc860ed5db752e1847e30649668060c01d","urls":["bzz-raw://fefe1356cdeb5b324e4e63e1c723c08f9e244ef2ef133b9f5df0cc0d180eeaa8","dweb:/ipfs/QmZzR3zWKodwdwrdWwXUyh7G3qcFn2cjUQLrE45gRyQMn3"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":49534,"contract":"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":49537,"contract":"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":108906,"contract":"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge","label":"spacer_0_2_30","offset":2,"slot":"0","type":"t_bytes30"},{"astId":108910,"contract":"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge","label":"messenger","offset":0,"slot":"1","type":"t_contract(CrossDomainMessenger)108888"},{"astId":108914,"contract":"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge","label":"otherBridge","offset":0,"slot":"2","type":"t_contract(StandardBridge)111675"},{"astId":108919,"contract":"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge","label":"__gap","offset":0,"slot":"3","type":"t_array(t_uint256)46_storage"},{"astId":85179,"contract":"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge","label":"deposits","offset":0,"slot":"49","type":"t_mapping(t_address,t_mapping(t_address,t_mapping(t_uint256,t_bool)))"},{"astId":85183,"contract":"src/L1/L1ERC721Bridge.sol:L1ERC721Bridge","label":"superchainConfig","offset":0,"slot":"50","type":"t_contract(SuperchainConfig)88793"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_uint256)46_storage":{"encoding":"inplace","label":"uint256[46]","numberOfBytes":"1472","base":"t_uint256"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes30":{"encoding":"inplace","label":"bytes30","numberOfBytes":"30"},"t_contract(CrossDomainMessenger)108888":{"encoding":"inplace","label":"contract CrossDomainMessenger","numberOfBytes":"20"},"t_contract(StandardBridge)111675":{"encoding":"inplace","label":"contract StandardBridge","numberOfBytes":"20"},"t_contract(SuperchainConfig)88793":{"encoding":"inplace","label":"contract SuperchainConfig","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_address,t_mapping(t_uint256,t_bool)))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(address => mapping(uint256 => bool)))","numberOfBytes":"32","value":"t_mapping(t_address,t_mapping(t_uint256,t_bool))"},"t_mapping(t_address,t_mapping(t_uint256,t_bool))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(uint256 => bool))","numberOfBytes":"32","value":"t_mapping(t_uint256,t_bool)"},"t_mapping(t_uint256,t_bool)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => bool)","numberOfBytes":"32","value":"t_bool"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"version":1,"kind":"user","methods":{"MESSENGER()":{"notice":"Legacy getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead."},"OTHER_BRIDGE()":{"notice":"Legacy getter for other bridge address. Public getter is legacy and will be removed in the future. Use `otherBridge` instead."},"bridgeERC721(address,address,uint256,uint32,bytes)":{"notice":"Initiates a bridge of an NFT to the caller's account on the other chain. Note that this function can only be called by EOAs. Smart contract wallets should use the `bridgeERC721To` function after ensuring that the recipient address on the remote chain exists. Also note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2."},"bridgeERC721To(address,address,address,uint256,uint32,bytes)":{"notice":"Initiates a bridge of an NFT to some recipient's account on the other chain. Note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2."},"constructor":{"notice":"Constructs the L1ERC721Bridge contract."},"deposits(address,address,uint256)":{"notice":"Mapping of L1 token to L2 token to ID to boolean, indicating if the given L1 token by ID was deposited for a given L2 token."},"finalizeBridgeERC721(address,address,address,address,uint256,bytes)":{"notice":"Completes an ERC721 bridge from the other domain and sends the ERC721 token to the recipient on this domain."},"initialize(address,address)":{"notice":"Initializes the contract."},"messenger()":{"notice":"Messenger contract on this domain."},"otherBridge()":{"notice":"Contract of the bridge on the other network."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."},"superchainConfig()":{"notice":"Address of the SuperchainConfig contract."},"version()":{"notice":"Semantic version."}},"events":{"ERC721BridgeFinalized(address,address,address,address,uint256,bytes)":{"notice":"Emitted when an ERC721 bridge from the other network is finalized."},"ERC721BridgeInitiated(address,address,address,address,uint256,bytes)":{"notice":"Emitted when an ERC721 bridge to the other network is initiated."}},"notice":"The L1 ERC721 bridge is a contract which works together with the L2 ERC721 bridge to make it possible to transfer ERC721 tokens from Ethereum to Optimism. This contract acts as an escrow for ERC721 tokens deposited into L2."},"devdoc":{"version":1,"kind":"dev","methods":{"MESSENGER()":{"returns":{"_0":"Messenger contract on this domain."}},"OTHER_BRIDGE()":{"returns":{"_0":"Contract of the bridge on the other network."}},"bridgeERC721(address,address,uint256,uint32,bytes)":{"params":{"_extraData":"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.","_localToken":"Address of the ERC721 on this domain.","_minGasLimit":"Minimum gas limit for the bridge message on the other domain.","_remoteToken":"Address of the ERC721 on the remote domain.","_tokenId":"Token ID to bridge."}},"bridgeERC721To(address,address,address,uint256,uint32,bytes)":{"params":{"_extraData":"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.","_localToken":"Address of the ERC721 on this domain.","_minGasLimit":"Minimum gas limit for the bridge message on the other domain.","_remoteToken":"Address of the ERC721 on the remote domain.","_to":"Address to receive the token on the other domain.","_tokenId":"Token ID to bridge."}},"finalizeBridgeERC721(address,address,address,address,uint256,bytes)":{"params":{"_extraData":"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.","_from":"Address that triggered the bridge on the other domain.","_localToken":"Address of the ERC721 token on this domain.","_remoteToken":"Address of the ERC721 token on the other domain.","_to":"Address to receive the token on this domain.","_tokenId":"ID of the token being deposited."}},"initialize(address,address)":{"params":{"_messenger":"Contract of the CrossDomainMessenger on this network.","_superchainConfig":"Contract of the SuperchainConfig contract on this network."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}}},"title":"L1ERC721Bridge"},"ast":{"absolutePath":"src/L1/L1ERC721Bridge.sol","id":85419,"exportedSymbols":{"Constants":[103096],"CrossDomainMessenger":[108888],"ERC721Bridge":[109118],"IERC721":[52560],"ISemver":[109417],"L1ERC721Bridge":[85418],"L2ERC721Bridge":[90723],"Predeploys":[104124],"StandardBridge":[111675],"SuperchainConfig":[88793]},"nodeType":"SourceUnit","src":"32:5389:131","nodes":[{"id":85147,"nodeType":"PragmaDirective","src":"32:23:131","nodes":[],"literals":["solidity","0.8",".15"]},{"id":85149,"nodeType":"ImportDirective","src":"57:62:131","nodes":[],"absolutePath":"src/universal/ERC721Bridge.sol","file":"src/universal/ERC721Bridge.sol","nameLocation":"-1:-1:-1","scope":85419,"sourceUnit":109119,"symbolAliases":[{"foreign":{"id":85148,"name":"ERC721Bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109118,"src":"66:12:131","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85151,"nodeType":"ImportDirective","src":"120:75:131","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol","file":"@openzeppelin/contracts/token/ERC721/IERC721.sol","nameLocation":"-1:-1:-1","scope":85419,"sourceUnit":52561,"symbolAliases":[{"foreign":{"id":85150,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52560,"src":"129:7:131","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85153,"nodeType":"ImportDirective","src":"196:59:131","nodes":[],"absolutePath":"src/L2/L2ERC721Bridge.sol","file":"src/L2/L2ERC721Bridge.sol","nameLocation":"-1:-1:-1","scope":85419,"sourceUnit":90724,"symbolAliases":[{"foreign":{"id":85152,"name":"L2ERC721Bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90723,"src":"205:14:131","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85155,"nodeType":"ImportDirective","src":"256:52:131","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":85419,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":85154,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"265:7:131","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85157,"nodeType":"ImportDirective","src":"309:58:131","nodes":[],"absolutePath":"src/libraries/Predeploys.sol","file":"src/libraries/Predeploys.sol","nameLocation":"-1:-1:-1","scope":85419,"sourceUnit":104125,"symbolAliases":[{"foreign":{"id":85156,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"318:10:131","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85159,"nodeType":"ImportDirective","src":"368:78:131","nodes":[],"absolutePath":"src/universal/CrossDomainMessenger.sol","file":"src/universal/CrossDomainMessenger.sol","nameLocation":"-1:-1:-1","scope":85419,"sourceUnit":108889,"symbolAliases":[{"foreign":{"id":85158,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"377:20:131","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85161,"nodeType":"ImportDirective","src":"447:66:131","nodes":[],"absolutePath":"src/universal/StandardBridge.sol","file":"src/universal/StandardBridge.sol","nameLocation":"-1:-1:-1","scope":85419,"sourceUnit":111676,"symbolAliases":[{"foreign":{"id":85160,"name":"StandardBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111675,"src":"456:14:131","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85163,"nodeType":"ImportDirective","src":"514:56:131","nodes":[],"absolutePath":"src/libraries/Constants.sol","file":"src/libraries/Constants.sol","nameLocation":"-1:-1:-1","scope":85419,"sourceUnit":103097,"symbolAliases":[{"foreign":{"id":85162,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"523:9:131","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85165,"nodeType":"ImportDirective","src":"571:63:131","nodes":[],"absolutePath":"src/L1/SuperchainConfig.sol","file":"src/L1/SuperchainConfig.sol","nameLocation":"-1:-1:-1","scope":85419,"sourceUnit":88794,"symbolAliases":[{"foreign":{"id":85164,"name":"SuperchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88793,"src":"580:16:131","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85418,"nodeType":"ContractDefinition","src":"922:4498:131","nodes":[{"id":85179,"nodeType":"VariableDeclaration","src":"1134:80:131","nodes":[],"constant":false,"documentation":{"id":85171,"nodeType":"StructuredDocumentation","src":"977:152:131","text":"@notice Mapping of L1 token to L2 token to ID to boolean, indicating if the given L1 token\n by ID was deposited for a given L2 token."},"functionSelector":"5d93a3fc","mutability":"mutable","name":"deposits","nameLocation":"1206:8:131","scope":85418,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_bool_$_$_$","typeString":"mapping(address => mapping(address => mapping(uint256 => bool)))"},"typeName":{"id":85178,"keyType":{"id":85172,"name":"address","nodeType":"ElementaryTypeName","src":"1142:7:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1134:64:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_bool_$_$_$","typeString":"mapping(address => mapping(address => mapping(uint256 => bool)))"},"valueType":{"id":85177,"keyType":{"id":85173,"name":"address","nodeType":"ElementaryTypeName","src":"1161:7:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1153:44:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_bool_$_$","typeString":"mapping(address => mapping(uint256 => bool))"},"valueType":{"id":85176,"keyType":{"id":85174,"name":"uint256","nodeType":"ElementaryTypeName","src":"1180:7:131","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"1172:24:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"},"valueType":{"id":85175,"name":"bool","nodeType":"ElementaryTypeName","src":"1191:4:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}}}},"visibility":"public"},{"id":85183,"nodeType":"VariableDeclaration","src":"1279:40:131","nodes":[],"constant":false,"documentation":{"id":85180,"nodeType":"StructuredDocumentation","src":"1221:53:131","text":"@notice Address of the SuperchainConfig contract."},"functionSelector":"35e80ab3","mutability":"mutable","name":"superchainConfig","nameLocation":"1303:16:131","scope":85418,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},"typeName":{"id":85182,"nodeType":"UserDefinedTypeName","pathNode":{"id":85181,"name":"SuperchainConfig","nodeType":"IdentifierPath","referencedDeclaration":88793,"src":"1279:16:131"},"referencedDeclaration":88793,"src":"1279:16:131","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"visibility":"public"},{"id":85187,"nodeType":"VariableDeclaration","src":"1389:40:131","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":85184,"nodeType":"StructuredDocumentation","src":"1326:58:131","text":"@notice Semantic version.\n @custom:semver 2.1.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"1412:7:131","scope":85418,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":85185,"name":"string","nodeType":"ElementaryTypeName","src":"1389:6:131","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"322e312e30","id":85186,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1422:7:131","typeDescriptions":{"typeIdentifier":"t_stringliteral_3bb4aeded157fe72f9bc813a9dc1bd69961c5b5f35dafc6dc601ab742eacac6b","typeString":"literal_string \"2.1.0\""},"value":"2.1.0"},"visibility":"public"},{"id":85209,"nodeType":"FunctionDefinition","src":"1492:155:131","nodes":[],"body":{"id":85208,"nodeType":"Block","src":"1521:126:131","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30","id":85197,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1585:1:131","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":85196,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1577:7:131","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85195,"name":"address","nodeType":"ElementaryTypeName","src":"1577:7:131","typeDescriptions":{}}},"id":85198,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1577:10:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":85194,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"1556:20:131","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CrossDomainMessenger_$108888_$","typeString":"type(contract CrossDomainMessenger)"}},"id":85199,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1556:32:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},{"arguments":[{"arguments":[{"hexValue":"30","id":85203,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1634:1:131","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":85202,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1626:7:131","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85201,"name":"address","nodeType":"ElementaryTypeName","src":"1626:7:131","typeDescriptions":{}}},"id":85204,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1626:10:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":85200,"name":"SuperchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88793,"src":"1609:16:131","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SuperchainConfig_$88793_$","typeString":"type(contract SuperchainConfig)"}},"id":85205,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1609:28:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"},{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}],"id":85193,"name":"initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85237,"src":"1531:10:131","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_CrossDomainMessenger_$108888_$_t_contract$_SuperchainConfig_$88793_$returns$__$","typeString":"function (contract CrossDomainMessenger,contract SuperchainConfig)"}},"id":85206,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_messenger","_superchainConfig"],"nodeType":"FunctionCall","src":"1531:109:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85207,"nodeType":"ExpressionStatement","src":"1531:109:131"}]},"documentation":{"id":85188,"nodeType":"StructuredDocumentation","src":"1436:51:131","text":"@notice Constructs the L1ERC721Bridge contract."},"implemented":true,"kind":"constructor","modifiers":[{"arguments":[],"id":85191,"kind":"baseConstructorSpecifier","modifierName":{"id":85190,"name":"ERC721Bridge","nodeType":"IdentifierPath","referencedDeclaration":109118,"src":"1506:12:131"},"nodeType":"ModifierInvocation","src":"1506:14:131"}],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":85189,"nodeType":"ParameterList","parameters":[],"src":"1503:2:131"},"returnParameters":{"id":85192,"nodeType":"ParameterList","parameters":[],"src":"1521:0:131"},"scope":85418,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":85237,"nodeType":"FunctionDefinition","src":"1869:318:131","nodes":[],"body":{"id":85236,"nodeType":"Block","src":"1977:210:131","nodes":[],"statements":[{"expression":{"id":85223,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":85221,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85183,"src":"1987:16:131","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":85222,"name":"_superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85216,"src":"2006:17:131","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"src":"1987:36:131","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":85224,"nodeType":"ExpressionStatement","src":"1987:36:131"},{"expression":{"arguments":[{"id":85226,"name":"_messenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85213,"src":"2079:10:131","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},{"arguments":[{"arguments":[{"expression":{"id":85230,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"2140:10:131","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":85231,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L2_ERC721_BRIDGE","nodeType":"MemberAccess","referencedDeclaration":104012,"src":"2140:27:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":85229,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2132:8:131","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":85228,"name":"address","nodeType":"ElementaryTypeName","src":"2132:8:131","stateMutability":"payable","typeDescriptions":{}}},"id":85232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2132:36:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":85227,"name":"StandardBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111675,"src":"2117:14:131","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StandardBridge_$111675_$","typeString":"type(contract StandardBridge)"}},"id":85233,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2117:52:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"},{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}],"id":85225,"name":"__ERC721Bridge_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108995,"src":"2033:19:131","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_CrossDomainMessenger_$108888_$_t_contract$_StandardBridge_$111675_$returns$__$","typeString":"function (contract CrossDomainMessenger,contract StandardBridge)"}},"id":85234,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_messenger","_otherBridge"],"nodeType":"FunctionCall","src":"2033:147:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85235,"nodeType":"ExpressionStatement","src":"2033:147:131"}]},"documentation":{"id":85210,"nodeType":"StructuredDocumentation","src":"1653:211:131","text":"@notice Initializes the contract.\n @param _messenger Contract of the CrossDomainMessenger on this network.\n @param _superchainConfig Contract of the SuperchainConfig contract on this network."},"functionSelector":"485cc955","implemented":true,"kind":"function","modifiers":[{"id":85219,"kind":"modifierInvocation","modifierName":{"id":85218,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":49598,"src":"1965:11:131"},"nodeType":"ModifierInvocation","src":"1965:11:131"}],"name":"initialize","nameLocation":"1878:10:131","parameters":{"id":85217,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85213,"mutability":"mutable","name":"_messenger","nameLocation":"1910:10:131","nodeType":"VariableDeclaration","scope":85237,"src":"1889:31:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"},"typeName":{"id":85212,"nodeType":"UserDefinedTypeName","pathNode":{"id":85211,"name":"CrossDomainMessenger","nodeType":"IdentifierPath","referencedDeclaration":108888,"src":"1889:20:131"},"referencedDeclaration":108888,"src":"1889:20:131","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},"visibility":"internal"},{"constant":false,"id":85216,"mutability":"mutable","name":"_superchainConfig","nameLocation":"1939:17:131","nodeType":"VariableDeclaration","scope":85237,"src":"1922:34:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},"typeName":{"id":85215,"nodeType":"UserDefinedTypeName","pathNode":{"id":85214,"name":"SuperchainConfig","nodeType":"IdentifierPath","referencedDeclaration":88793,"src":"1922:16:131"},"referencedDeclaration":88793,"src":"1922:16:131","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"visibility":"internal"}],"src":"1888:69:131"},"returnParameters":{"id":85220,"nodeType":"ParameterList","parameters":[],"src":"1977:0:131"},"scope":85418,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":85249,"nodeType":"FunctionDefinition","src":"2226:103:131","nodes":[],"body":{"id":85248,"nodeType":"Block","src":"2280:49:131","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":85244,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85183,"src":"2297:16:131","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":85245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paused","nodeType":"MemberAccess","referencedDeclaration":88707,"src":"2297:23:131","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_bool_$","typeString":"function () view external returns (bool)"}},"id":85246,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2297:25:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":85243,"id":85247,"nodeType":"Return","src":"2290:32:131"}]},"baseFunctions":[109024],"documentation":{"id":85238,"nodeType":"StructuredDocumentation","src":"2193:28:131","text":"@inheritdoc ERC721Bridge"},"functionSelector":"5c975abb","implemented":true,"kind":"function","modifiers":[],"name":"paused","nameLocation":"2235:6:131","overrides":{"id":85240,"nodeType":"OverrideSpecifier","overrides":[],"src":"2256:8:131"},"parameters":{"id":85239,"nodeType":"ParameterList","parameters":[],"src":"2241:2:131"},"returnParameters":{"id":85243,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85242,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":85249,"src":"2274:4:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":85241,"name":"bool","nodeType":"ElementaryTypeName","src":"2274:4:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2273:6:131"},"scope":85418,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":85330,"nodeType":"FunctionDefinition","src":"3096:1207:131","nodes":[],"body":{"id":85329,"nodeType":"Block","src":"3341:962:131","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":85271,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":85268,"name":"paused","nodeType":"Identifier","overloadedDeclarations":[85249],"referencedDeclaration":85249,"src":"3359:6:131","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bool_$","typeString":"function () view returns (bool)"}},"id":85269,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3359:8:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"66616c7365","id":85270,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3371:5:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"3359:17:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c314552433732314272696467653a20706175736564","id":85272,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3378:24:131","typeDescriptions":{"typeIdentifier":"t_stringliteral_0547274687a86ca0a34590eabb05ad0a44aae82bbc5d30b7acda91288e349519","typeString":"literal_string \"L1ERC721Bridge: paused\""},"value":"L1ERC721Bridge: paused"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_0547274687a86ca0a34590eabb05ad0a44aae82bbc5d30b7acda91288e349519","typeString":"literal_string \"L1ERC721Bridge: paused\""}],"id":85267,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3351:7:131","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":85273,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3351:52:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85274,"nodeType":"ExpressionStatement","src":"3351:52:131"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":85281,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":85276,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85252,"src":"3421:11:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":85279,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3444:4:131","typeDescriptions":{"typeIdentifier":"t_contract$_L1ERC721Bridge_$85418","typeString":"contract L1ERC721Bridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_L1ERC721Bridge_$85418","typeString":"contract L1ERC721Bridge"}],"id":85278,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3436:7:131","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85277,"name":"address","nodeType":"ElementaryTypeName","src":"3436:7:131","typeDescriptions":{}}},"id":85280,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3436:13:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3421:28:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e6f742062652073656c66","id":85282,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3451:44:131","typeDescriptions":{"typeIdentifier":"t_stringliteral_218d51cceb2e9e86022eea81b17e23e1e964bba3aa5268e422fe8d05e54eb832","typeString":"literal_string \"L1ERC721Bridge: local token cannot be self\""},"value":"L1ERC721Bridge: local token cannot be self"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_218d51cceb2e9e86022eea81b17e23e1e964bba3aa5268e422fe8d05e54eb832","typeString":"literal_string \"L1ERC721Bridge: local token cannot be self\""}],"id":85275,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3413:7:131","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":85283,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3413:83:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85284,"nodeType":"ExpressionStatement","src":"3413:83:131"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":85294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"baseExpression":{"baseExpression":{"id":85286,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85179,"src":"3620:8:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_bool_$_$_$","typeString":"mapping(address => mapping(address => mapping(uint256 => bool)))"}},"id":85288,"indexExpression":{"id":85287,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85252,"src":"3629:11:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3620:21:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_bool_$_$","typeString":"mapping(address => mapping(uint256 => bool))"}},"id":85290,"indexExpression":{"id":85289,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85254,"src":"3642:12:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3620:35:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"}},"id":85292,"indexExpression":{"id":85291,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85260,"src":"3656:8:131","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3620:45:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"74727565","id":85293,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3669:4:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"3620:53:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c314552433732314272696467653a20546f6b656e204944206973206e6f7420657363726f77656420696e20746865204c3120427269646765","id":85295,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3687:59:131","typeDescriptions":{"typeIdentifier":"t_stringliteral_bee7d98e66133cf40de344b202cc1df78b20213eed80aaf4210604281fdaa6af","typeString":"literal_string \"L1ERC721Bridge: Token ID is not escrowed in the L1 Bridge\""},"value":"L1ERC721Bridge: Token ID is not escrowed in the L1 Bridge"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bee7d98e66133cf40de344b202cc1df78b20213eed80aaf4210604281fdaa6af","typeString":"literal_string \"L1ERC721Bridge: Token ID is not escrowed in the L1 Bridge\""}],"id":85285,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3599:7:131","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":85296,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3599:157:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85297,"nodeType":"ExpressionStatement","src":"3599:157:131"},{"expression":{"id":85306,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"baseExpression":{"id":85298,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85179,"src":"3878:8:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_bool_$_$_$","typeString":"mapping(address => mapping(address => mapping(uint256 => bool)))"}},"id":85302,"indexExpression":{"id":85299,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85252,"src":"3887:11:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3878:21:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_bool_$_$","typeString":"mapping(address => mapping(uint256 => bool))"}},"id":85303,"indexExpression":{"id":85300,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85254,"src":"3900:12:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3878:35:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"}},"id":85304,"indexExpression":{"id":85301,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85260,"src":"3914:8:131","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3878:45:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"66616c7365","id":85305,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3926:5:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"3878:53:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":85307,"nodeType":"ExpressionStatement","src":"3878:53:131"},{"expression":{"arguments":[{"arguments":[{"id":85314,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4107:4:131","typeDescriptions":{"typeIdentifier":"t_contract$_L1ERC721Bridge_$85418","typeString":"contract L1ERC721Bridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_L1ERC721Bridge_$85418","typeString":"contract L1ERC721Bridge"}],"id":85313,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4099:7:131","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85312,"name":"address","nodeType":"ElementaryTypeName","src":"4099:7:131","typeDescriptions":{}}},"id":85315,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4099:13:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85316,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85258,"src":"4118:3:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85317,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85260,"src":"4132:8:131","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":85309,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85252,"src":"4061:11:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":85308,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52560,"src":"4053:7:131","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721_$52560_$","typeString":"type(contract IERC721)"}},"id":85310,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4053:20:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$52560","typeString":"contract IERC721"}},"id":85311,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":52515,"src":"4053:37:131","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256) external"}},"id":85318,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["from","to","tokenId"],"nodeType":"FunctionCall","src":"4053:90:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85319,"nodeType":"ExpressionStatement","src":"4053:90:131"},{"eventCall":{"arguments":[{"id":85321,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85252,"src":"4236:11:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85322,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85254,"src":"4249:12:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85323,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85256,"src":"4263:5:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85324,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85258,"src":"4270:3:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85325,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85260,"src":"4275:8:131","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85326,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85262,"src":"4285:10:131","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":85320,"name":"ERC721BridgeFinalized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108949,"src":"4214:21:131","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":85327,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4214:82:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85328,"nodeType":"EmitStatement","src":"4209:87:131"}]},"documentation":{"id":85250,"nodeType":"StructuredDocumentation","src":"2335:756:131","text":"@notice Completes an ERC721 bridge from the other domain and sends the ERC721 token to the\n recipient on this domain.\n @param _localToken Address of the ERC721 token on this domain.\n @param _remoteToken Address of the ERC721 token on the other domain.\n @param _from Address that triggered the bridge on the other domain.\n @param _to Address to receive the token on this domain.\n @param _tokenId ID of the token being deposited.\n @param _extraData Optional data to forward to L2.\n Data supplied here will not be used to execute any code on L2 and is\n only emitted as extra data for the convenience of off-chain tooling."},"functionSelector":"761f4493","implemented":true,"kind":"function","modifiers":[{"id":85265,"kind":"modifierInvocation","modifierName":{"id":85264,"name":"onlyOtherBridge","nodeType":"IdentifierPath","referencedDeclaration":108974,"src":"3321:15:131"},"nodeType":"ModifierInvocation","src":"3321:15:131"}],"name":"finalizeBridgeERC721","nameLocation":"3105:20:131","parameters":{"id":85263,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85252,"mutability":"mutable","name":"_localToken","nameLocation":"3143:11:131","nodeType":"VariableDeclaration","scope":85330,"src":"3135:19:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85251,"name":"address","nodeType":"ElementaryTypeName","src":"3135:7:131","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85254,"mutability":"mutable","name":"_remoteToken","nameLocation":"3172:12:131","nodeType":"VariableDeclaration","scope":85330,"src":"3164:20:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85253,"name":"address","nodeType":"ElementaryTypeName","src":"3164:7:131","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85256,"mutability":"mutable","name":"_from","nameLocation":"3202:5:131","nodeType":"VariableDeclaration","scope":85330,"src":"3194:13:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85255,"name":"address","nodeType":"ElementaryTypeName","src":"3194:7:131","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85258,"mutability":"mutable","name":"_to","nameLocation":"3225:3:131","nodeType":"VariableDeclaration","scope":85330,"src":"3217:11:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85257,"name":"address","nodeType":"ElementaryTypeName","src":"3217:7:131","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85260,"mutability":"mutable","name":"_tokenId","nameLocation":"3246:8:131","nodeType":"VariableDeclaration","scope":85330,"src":"3238:16:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85259,"name":"uint256","nodeType":"ElementaryTypeName","src":"3238:7:131","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85262,"mutability":"mutable","name":"_extraData","nameLocation":"3279:10:131","nodeType":"VariableDeclaration","scope":85330,"src":"3264:25:131","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":85261,"name":"bytes","nodeType":"ElementaryTypeName","src":"3264:5:131","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3125:170:131"},"returnParameters":{"id":85266,"nodeType":"ParameterList","parameters":[],"src":"3341:0:131"},"scope":85418,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":85417,"nodeType":"FunctionDefinition","src":"4342:1076:131","nodes":[],"body":{"id":85416,"nodeType":"Block","src":"4610:808:131","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":85355,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":85350,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85335,"src":"4628:12:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":85353,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4652:1:131","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":85352,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4644:7:131","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85351,"name":"address","nodeType":"ElementaryTypeName","src":"4644:7:131","typeDescriptions":{}}},"id":85354,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4644:10:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4628:26:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e6e6f742062652061646472657373283029","id":85356,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4656:51:131","typeDescriptions":{"typeIdentifier":"t_stringliteral_14e51418e54e820a40fc2643b1167465f7abe28f86e3d4e777c562f03e420dd1","typeString":"literal_string \"L1ERC721Bridge: remote token cannot be address(0)\""},"value":"L1ERC721Bridge: remote token cannot be address(0)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_14e51418e54e820a40fc2643b1167465f7abe28f86e3d4e777c562f03e420dd1","typeString":"literal_string \"L1ERC721Bridge: remote token cannot be address(0)\""}],"id":85349,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4620:7:131","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":85357,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4620:88:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85358,"nodeType":"ExpressionStatement","src":"4620:88:131"},{"assignments":[85360],"declarations":[{"constant":false,"id":85360,"mutability":"mutable","name":"message","nameLocation":"4811:7:131","nodeType":"VariableDeclaration","scope":85416,"src":"4798:20:131","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85359,"name":"bytes","nodeType":"ElementaryTypeName","src":"4798:5:131","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":85373,"initialValue":{"arguments":[{"expression":{"expression":{"id":85363,"name":"L2ERC721Bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90723,"src":"4857:14:131","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L2ERC721Bridge_$90723_$","typeString":"type(contract L2ERC721Bridge)"}},"id":85364,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"finalizeBridgeERC721","nodeType":"MemberAccess","referencedDeclaration":90622,"src":"4857:35:131","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$","typeString":"function L2ERC721Bridge.finalizeBridgeERC721(address,address,address,address,uint256,bytes calldata)"}},"id":85365,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"4857:44:131","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"id":85366,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85335,"src":"4903:12:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85367,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85333,"src":"4917:11:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85368,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85337,"src":"4930:5:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85369,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85339,"src":"4937:3:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85370,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85341,"src":"4942:8:131","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85371,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85345,"src":"4952:10:131","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":85361,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4821:3:131","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":85362,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSelector","nodeType":"MemberAccess","src":"4821:22:131","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes4) pure returns (bytes memory)"}},"id":85372,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4821:151:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"4798:174:131"},{"expression":{"id":85382,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"baseExpression":{"id":85374,"name":"deposits","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85179,"src":"5017:8:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_bool_$_$_$","typeString":"mapping(address => mapping(address => mapping(uint256 => bool)))"}},"id":85378,"indexExpression":{"id":85375,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85333,"src":"5026:11:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5017:21:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_bool_$_$","typeString":"mapping(address => mapping(uint256 => bool))"}},"id":85379,"indexExpression":{"id":85376,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85335,"src":"5039:12:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5017:35:131","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"}},"id":85380,"indexExpression":{"id":85377,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85341,"src":"5053:8:131","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5017:45:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":85381,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"5065:4:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"5017:52:131","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":85383,"nodeType":"ExpressionStatement","src":"5017:52:131"},{"expression":{"arguments":[{"id":85388,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85337,"src":"5121:5:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":85391,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5140:4:131","typeDescriptions":{"typeIdentifier":"t_contract$_L1ERC721Bridge_$85418","typeString":"contract L1ERC721Bridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_L1ERC721Bridge_$85418","typeString":"contract L1ERC721Bridge"}],"id":85390,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5132:7:131","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85389,"name":"address","nodeType":"ElementaryTypeName","src":"5132:7:131","typeDescriptions":{}}},"id":85392,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5132:13:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85393,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85341,"src":"5156:8:131","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":85385,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85333,"src":"5087:11:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":85384,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52560,"src":"5079:7:131","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721_$52560_$","typeString":"type(contract IERC721)"}},"id":85386,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5079:20:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$52560","typeString":"contract IERC721"}},"id":85387,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":52525,"src":"5079:33:131","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256) external"}},"id":85394,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["from","to","tokenId"],"nodeType":"FunctionCall","src":"5079:88:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85395,"nodeType":"ExpressionStatement","src":"5079:88:131"},{"expression":{"arguments":[{"arguments":[{"id":85401,"name":"otherBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108914,"src":"5252:11:131","typeDescriptions":{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}],"id":85400,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5244:7:131","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85399,"name":"address","nodeType":"ElementaryTypeName","src":"5244:7:131","typeDescriptions":{}}},"id":85402,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5244:20:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85403,"name":"message","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85360,"src":"5276:7:131","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":85404,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85343,"src":"5299:12:131","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"id":85396,"name":"messenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108910,"src":"5211:9:131","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},"id":85398,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sendMessage","nodeType":"MemberAccess","referencedDeclaration":108520,"src":"5211:21:131","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$_t_bytes_memory_ptr_$_t_uint32_$returns$__$","typeString":"function (address,bytes memory,uint32) payable external"}},"id":85405,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_target","_message","_minGasLimit"],"nodeType":"FunctionCall","src":"5211:103:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85406,"nodeType":"ExpressionStatement","src":"5211:103:131"},{"eventCall":{"arguments":[{"id":85408,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85333,"src":"5351:11:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85409,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85335,"src":"5364:12:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85410,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85337,"src":"5378:5:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85411,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85339,"src":"5385:3:131","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85412,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85341,"src":"5390:8:131","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85413,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85345,"src":"5400:10:131","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":85407,"name":"ERC721BridgeInitiated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108934,"src":"5329:21:131","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":85414,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5329:82:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85415,"nodeType":"EmitStatement","src":"5324:87:131"}]},"baseFunctions":[109117],"documentation":{"id":85331,"nodeType":"StructuredDocumentation","src":"4309:28:131","text":"@inheritdoc ERC721Bridge"},"implemented":true,"kind":"function","modifiers":[],"name":"_initiateBridgeERC721","nameLocation":"4351:21:131","overrides":{"id":85347,"nodeType":"OverrideSpecifier","overrides":[],"src":"4597:8:131"},"parameters":{"id":85346,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85333,"mutability":"mutable","name":"_localToken","nameLocation":"4390:11:131","nodeType":"VariableDeclaration","scope":85417,"src":"4382:19:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85332,"name":"address","nodeType":"ElementaryTypeName","src":"4382:7:131","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85335,"mutability":"mutable","name":"_remoteToken","nameLocation":"4419:12:131","nodeType":"VariableDeclaration","scope":85417,"src":"4411:20:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85334,"name":"address","nodeType":"ElementaryTypeName","src":"4411:7:131","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85337,"mutability":"mutable","name":"_from","nameLocation":"4449:5:131","nodeType":"VariableDeclaration","scope":85417,"src":"4441:13:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85336,"name":"address","nodeType":"ElementaryTypeName","src":"4441:7:131","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85339,"mutability":"mutable","name":"_to","nameLocation":"4472:3:131","nodeType":"VariableDeclaration","scope":85417,"src":"4464:11:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85338,"name":"address","nodeType":"ElementaryTypeName","src":"4464:7:131","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85341,"mutability":"mutable","name":"_tokenId","nameLocation":"4493:8:131","nodeType":"VariableDeclaration","scope":85417,"src":"4485:16:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85340,"name":"uint256","nodeType":"ElementaryTypeName","src":"4485:7:131","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85343,"mutability":"mutable","name":"_minGasLimit","nameLocation":"4518:12:131","nodeType":"VariableDeclaration","scope":85417,"src":"4511:19:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":85342,"name":"uint32","nodeType":"ElementaryTypeName","src":"4511:6:131","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":85345,"mutability":"mutable","name":"_extraData","nameLocation":"4555:10:131","nodeType":"VariableDeclaration","scope":85417,"src":"4540:25:131","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":85344,"name":"bytes","nodeType":"ElementaryTypeName","src":"4540:5:131","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4372:199:131"},"returnParameters":{"id":85348,"nodeType":"ParameterList","parameters":[],"src":"4610:0:131"},"scope":85418,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[{"baseName":{"id":85167,"name":"ERC721Bridge","nodeType":"IdentifierPath","referencedDeclaration":109118,"src":"949:12:131"},"id":85168,"nodeType":"InheritanceSpecifier","src":"949:12:131"},{"baseName":{"id":85169,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"963:7:131"},"id":85170,"nodeType":"InheritanceSpecifier","src":"963:7:131"}],"canonicalName":"L1ERC721Bridge","contractDependencies":[],"contractKind":"contract","documentation":{"id":85166,"nodeType":"StructuredDocumentation","src":"636:286:131","text":"@title L1ERC721Bridge\n @notice The L1 ERC721 bridge is a contract which works together with the L2 ERC721 bridge to\n make it possible to transfer ERC721 tokens from Ethereum to Optimism. This contract\n acts as an escrow for ERC721 tokens deposited into L2."},"fullyImplemented":true,"linearizedBaseContracts":[85418,109417,109118,49678],"name":"L1ERC721Bridge","nameLocation":"931:14:131","scope":85419,"usedErrors":[]}],"license":"MIT"},"id":131} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/L1StandardBridge.json b/packages/sdk/src/forge-artifacts/L1StandardBridge.json new file mode 100644 index 000000000000..41a38e7d7097 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/L1StandardBridge.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"MESSENGER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"OTHER_BRIDGE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract StandardBridge"}],"stateMutability":"view"},{"type":"function","name":"bridgeERC20","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bridgeERC20To","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bridgeETH","inputs":[{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"bridgeETHTo","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"depositERC20","inputs":[{"name":"_l1Token","type":"address","internalType":"address"},{"name":"_l2Token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"depositERC20To","inputs":[{"name":"_l1Token","type":"address","internalType":"address"},{"name":"_l2Token","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"depositETH","inputs":[{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"depositETHTo","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"deposits","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"finalizeBridgeERC20","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finalizeBridgeETH","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"finalizeERC20Withdrawal","inputs":[{"name":"_l1Token","type":"address","internalType":"address"},{"name":"_l2Token","type":"address","internalType":"address"},{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finalizeETHWithdrawal","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"initialize","inputs":[{"name":"_messenger","type":"address","internalType":"contract CrossDomainMessenger"},{"name":"_superchainConfig","type":"address","internalType":"contract SuperchainConfig"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"l2TokenBridge","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"messenger","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"otherBridge","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract StandardBridge"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"superchainConfig","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract SuperchainConfig"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"ERC20BridgeFinalized","inputs":[{"name":"localToken","type":"address","indexed":true,"internalType":"address"},{"name":"remoteToken","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ERC20BridgeInitiated","inputs":[{"name":"localToken","type":"address","indexed":true,"internalType":"address"},{"name":"remoteToken","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ERC20DepositInitiated","inputs":[{"name":"l1Token","type":"address","indexed":true,"internalType":"address"},{"name":"l2Token","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ERC20WithdrawalFinalized","inputs":[{"name":"l1Token","type":"address","indexed":true,"internalType":"address"},{"name":"l2Token","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ETHBridgeFinalized","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ETHBridgeInitiated","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ETHDepositInitiated","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ETHWithdrawalFinalized","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b506200001f60008062000025565b62000234565b600054610100900460ff1615808015620000465750600054600160ff909116105b8062000076575062000063306200018a60201b620005511760201c565b15801562000076575060005460ff166001145b620000df5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000103576000805461ff0019166101001790555b603280546001600160a01b0319166001600160a01b0384161790556200013e8373420000000000000000000000000000000000001062000199565b801562000185576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054610100900460ff16620002065760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d6565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b612c4d80620002446000396000f3fe6080604052600436106101795760003560e01c80637f46ddb2116100cb578063927ede2d1161007f578063b1a1a88211610059578063b1a1a882146104fe578063c89701a214610511578063e11013dd1461053e57600080fd5b8063927ede2d146104a05780639a2ac6d5146104cb578063a9f9e675146104de57600080fd5b806387087623116100b0578063870876231461043a5780638f601f661461045a57806391c49bf8146103ef57600080fd5b80637f46ddb2146103ef578063838b25201461041a57600080fd5b80633cb747bf1161012d57806354fd4d501161010757806354fd4d501461035457806358a997f6146103aa5780635c975abb146103ca57600080fd5b80633cb747bf146102e7578063485cc95514610314578063540abf731461033457600080fd5b80631532ec341161015e5780631532ec341461026a5780631635f5fd1461027d57806335e80ab31461029057600080fd5b80630166a07a1461023757806309fc88431461025757600080fd5b3661023257333b15610212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b610230333362030d406040518060200160405280600081525061056d565b005b600080fd5b34801561024357600080fd5b506102306102523660046126b1565b610580565b610230610265366004612762565b61099a565b6102306102783660046127b5565b610a71565b61023061028b3660046127b5565b610a85565b34801561029c57600080fd5b506032546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102f357600080fd5b506003546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032057600080fd5b5061023061032f366004612828565b610f4e565b34801561034057600080fd5b5061023061034f366004612861565b611137565b34801561036057600080fd5b5061039d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102de919061294e565b3480156103b657600080fd5b506102306103c5366004612961565b61117c565b3480156103d657600080fd5b506103df611250565b60405190151581526020016102de565b3480156103fb57600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102bd565b34801561042657600080fd5b50610230610435366004612861565b6112e9565b34801561044657600080fd5b50610230610455366004612961565b61132e565b34801561046657600080fd5b50610492610475366004612828565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102de565b3480156104ac57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102bd565b6102306104d93660046129e4565b611402565b3480156104ea57600080fd5b506102306104f93660046126b1565b611444565b61023061050c366004612762565b611453565b34801561051d57600080fd5b506004546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b61023061054c3660046129e4565b611524565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61057a8484348585611567565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610653575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b9190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b61070d611250565b15610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b61077d87611731565b156108cb5761078c8787611793565b61083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108ae57600080fd5b505af11580156108c2573d6000803e3d6000fd5b5050505061094d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610909908490612a93565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c168352939052919091209190915561094d9085856118b3565b610991878787878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061198792505050565b50505050505050565b333b15610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c3333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b505050565b610a7e8585858585610a85565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b58575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b409190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b610c12611250565b15610c79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b823414610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610209565b3073ffffffffffffffffffffffffffffffffffffffff851603610dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610209565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610209565b610e9a85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a1592505050565b6000610eb7855a8660405180602001604052806000815250611a88565b905080610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610209565b505050505050565b600054610100900460ff1615808015610f6e5750600054600160ff909116105b80610f885750303b158015610f88575060005460ff166001145b611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610209565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556110d083734200000000000000000000000000000000000010611aa2565b8015610a6c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b333b1561120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156112c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e49190612aaa565b905090565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b333b156113bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b61057a33858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61099187878787878787610580565b333b156114e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61057a3385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b8234146115f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610209565b61160285858584611ec6565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd0000000000000000000000000000000000000000000000000000000090611665908b908b9086908a90602401612acc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526116f892918890600401612b15565b6000604051808303818588803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b50505050505050505050565b600061175d827f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b8061178d575061178d827fec4fc8e300000000000000000000000000000000000000000000000000000000611f39565b92915050565b60006117bf837f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b15611868578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118339190612a47565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905061178d565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a6c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611f5c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b38686866040516119ff93929190612b5a565b60405180910390a4610f46868686868686612068565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611a74929190612b98565b60405180910390a361057a848484846120f0565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610209565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b611b9587611731565b15611ce357611ba48787611793565b611c56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611cc657600080fd5b505af1158015611cda573d6000803e3d6000fd5b50505050611d77565b611d0573ffffffffffffffffffffffffffffffffffffffff881686308661215d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611d43908490612bb1565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611d858787878787866121bb565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611de9908b908d908c908c908c908b90602401612bc9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611e7c92918790600401612b15565b600060405180830381600087803b158015611e9657600080fd5b505af1158015611eaa573d6000803e3d6000fd5b5050505050505050505050565b61099187878787878787611b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f238484604051611f25929190612b98565b60405180910390a361057a84848484612249565b6000611f44836122a8565b8015611f555750611f55838361230c565b9392505050565b6000611fbe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123db9092919063ffffffff16565b805190915015610a6c5780806020019051810190611fdc9190612aaa565b610a6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610209565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8686866040516120e093929190612b5a565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d848460405161214f929190612b98565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261057a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611905565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161223393929190612b5a565b60405180910390a4610f468686868686866123f2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5848460405161214f929190612b98565b60006122d4827f01ffc9a70000000000000000000000000000000000000000000000000000000061230c565b801561178d5750612305827fffffffff0000000000000000000000000000000000000000000000000000000061230c565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156123c4575060208210155b80156123d05750600081115b979650505050505050565b60606123ea848460008561246a565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8686866040516120e093929190612b5a565b6060824710156124fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610209565b73ffffffffffffffffffffffffffffffffffffffff85163b61257a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610209565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125a39190612c24565b60006040518083038185875af1925050503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b50915091506123d0828286606083156125ff575081611f55565b82511561260f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610209919061294e565b73ffffffffffffffffffffffffffffffffffffffff8116811461266557600080fd5b50565b60008083601f84011261267a57600080fd5b50813567ffffffffffffffff81111561269257600080fd5b6020830191508360208285010111156126aa57600080fd5b9250929050565b600080600080600080600060c0888a0312156126cc57600080fd5b87356126d781612643565b965060208801356126e781612643565b955060408801356126f781612643565b9450606088013561270781612643565b93506080880135925060a088013567ffffffffffffffff81111561272a57600080fd5b6127368a828b01612668565b989b979a50959850939692959293505050565b803563ffffffff8116811461275d57600080fd5b919050565b60008060006040848603121561277757600080fd5b61278084612749565b9250602084013567ffffffffffffffff81111561279c57600080fd5b6127a886828701612668565b9497909650939450505050565b6000806000806000608086880312156127cd57600080fd5b85356127d881612643565b945060208601356127e881612643565b935060408601359250606086013567ffffffffffffffff81111561280b57600080fd5b61281788828901612668565b969995985093965092949392505050565b6000806040838503121561283b57600080fd5b823561284681612643565b9150602083013561285681612643565b809150509250929050565b600080600080600080600060c0888a03121561287c57600080fd5b873561288781612643565b9650602088013561289781612643565b955060408801356128a781612643565b9450606088013593506128bc60808901612749565b925060a088013567ffffffffffffffff81111561272a57600080fd5b60005b838110156128f35781810151838201526020016128db565b8381111561057a5750506000910152565b6000815180845261291c8160208601602086016128d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f556020830184612904565b60008060008060008060a0878903121561297a57600080fd5b863561298581612643565b9550602087013561299581612643565b9450604087013593506129aa60608801612749565b9250608087013567ffffffffffffffff8111156129c657600080fd5b6129d289828a01612668565b979a9699509497509295939492505050565b600080600080606085870312156129fa57600080fd5b8435612a0581612643565b9350612a1360208601612749565b9250604085013567ffffffffffffffff811115612a2f57600080fd5b612a3b87828801612668565b95989497509550505050565b600060208284031215612a5957600080fd5b8151611f5581612643565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612aa557612aa5612a64565b500390565b600060208284031215612abc57600080fd5b81518015158114611f5557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612b0b6080830184612904565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612b446060830185612904565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612b8f6060830184612904565b95945050505050565b8281526040602082015260006123ea6040830184612904565b60008219821115612bc457612bc4612a64565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612c1860c0830184612904565b98975050505050505050565b60008251612c368184602087016128d8565b919091019291505056fea164736f6c634300080f000a","sourceMap":"1209:12690:132:-:0;;;3691:157;;;;;;;;;-1:-1:-1;3732:109:132::1;3786:1;::::0;3732:10:::1;:109::i;:::-;1209:12690:::0;;4055:322;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;;3209:33;3236:4;3209:18;;;;;:33;;:::i;:::-;3208:34;:55;;;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;-1:-1:-1;;;3146:190:43;;216:2:357;3146:190:43;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:357;;;338:44;399:19;;3146:190:43;;;;;;;;;3346:12;:16;;-1:-1:-1;;3346:16:43;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;-1:-1:-1;;3406:20:43;;;;;3372:65;4173:16:132::1;:36:::0;;-1:-1:-1;;;;;;4173:36:132::1;-1:-1:-1::0;;;;;4173:36:132;::::1;;::::0;;4219:151:::1;4267:10:::0;635:42:199::1;4219:21:132;:151::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;-1:-1:-1;;3491:21:43;;;3531:14;;-1:-1:-1;581:36:357;;3531:14:43;;569:2:357;554:18;3531:14:43;;;;;;;3457:99;3090:472;4055:322:132;;:::o;1175:320:59:-;-1:-1:-1;;;;;1465:19:59;;:23;;;1175:320::o;5373:236:235:-;4888:13:43;;;;;;;4880:69;;;;-1:-1:-1;;;4880:69:43;;830:2:357;4880:69:43;;;812:21:357;869:2;849:18;;;842:30;908:34;888:18;;;881:62;-1:-1:-1;;;959:18:357;;;952:41;1010:19;;4880:69:43;628:407:357;4880:69:43;5544:9:235::1;:22:::0;;-1:-1:-1;;;;;5544:22:235;;::::1;-1:-1:-1::0;;;;;;5544:22:235;;::::1;;::::0;;;5576:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;5373:236::o;628:407:357:-;1209:12690:132;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106101795760003560e01c80637f46ddb2116100cb578063927ede2d1161007f578063b1a1a88211610059578063b1a1a882146104fe578063c89701a214610511578063e11013dd1461053e57600080fd5b8063927ede2d146104a05780639a2ac6d5146104cb578063a9f9e675146104de57600080fd5b806387087623116100b0578063870876231461043a5780638f601f661461045a57806391c49bf8146103ef57600080fd5b80637f46ddb2146103ef578063838b25201461041a57600080fd5b80633cb747bf1161012d57806354fd4d501161010757806354fd4d501461035457806358a997f6146103aa5780635c975abb146103ca57600080fd5b80633cb747bf146102e7578063485cc95514610314578063540abf731461033457600080fd5b80631532ec341161015e5780631532ec341461026a5780631635f5fd1461027d57806335e80ab31461029057600080fd5b80630166a07a1461023757806309fc88431461025757600080fd5b3661023257333b15610212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b610230333362030d406040518060200160405280600081525061056d565b005b600080fd5b34801561024357600080fd5b506102306102523660046126b1565b610580565b610230610265366004612762565b61099a565b6102306102783660046127b5565b610a71565b61023061028b3660046127b5565b610a85565b34801561029c57600080fd5b506032546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102f357600080fd5b506003546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032057600080fd5b5061023061032f366004612828565b610f4e565b34801561034057600080fd5b5061023061034f366004612861565b611137565b34801561036057600080fd5b5061039d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102de919061294e565b3480156103b657600080fd5b506102306103c5366004612961565b61117c565b3480156103d657600080fd5b506103df611250565b60405190151581526020016102de565b3480156103fb57600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102bd565b34801561042657600080fd5b50610230610435366004612861565b6112e9565b34801561044657600080fd5b50610230610455366004612961565b61132e565b34801561046657600080fd5b50610492610475366004612828565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102de565b3480156104ac57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102bd565b6102306104d93660046129e4565b611402565b3480156104ea57600080fd5b506102306104f93660046126b1565b611444565b61023061050c366004612762565b611453565b34801561051d57600080fd5b506004546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b61023061054c3660046129e4565b611524565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61057a8484348585611567565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610653575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b9190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b61070d611250565b15610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b61077d87611731565b156108cb5761078c8787611793565b61083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108ae57600080fd5b505af11580156108c2573d6000803e3d6000fd5b5050505061094d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610909908490612a93565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c168352939052919091209190915561094d9085856118b3565b610991878787878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061198792505050565b50505050505050565b333b15610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c3333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b505050565b610a7e8585858585610a85565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b58575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b409190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b610c12611250565b15610c79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b823414610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610209565b3073ffffffffffffffffffffffffffffffffffffffff851603610dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610209565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610209565b610e9a85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a1592505050565b6000610eb7855a8660405180602001604052806000815250611a88565b905080610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610209565b505050505050565b600054610100900460ff1615808015610f6e5750600054600160ff909116105b80610f885750303b158015610f88575060005460ff166001145b611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610209565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556110d083734200000000000000000000000000000000000010611aa2565b8015610a6c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b333b1561120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156112c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e49190612aaa565b905090565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b333b156113bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b61057a33858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61099187878787878787610580565b333b156114e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61057a3385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b8234146115f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610209565b61160285858584611ec6565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd0000000000000000000000000000000000000000000000000000000090611665908b908b9086908a90602401612acc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526116f892918890600401612b15565b6000604051808303818588803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b50505050505050505050565b600061175d827f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b8061178d575061178d827fec4fc8e300000000000000000000000000000000000000000000000000000000611f39565b92915050565b60006117bf837f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b15611868578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118339190612a47565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905061178d565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a6c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611f5c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b38686866040516119ff93929190612b5a565b60405180910390a4610f46868686868686612068565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611a74929190612b98565b60405180910390a361057a848484846120f0565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610209565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b611b9587611731565b15611ce357611ba48787611793565b611c56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611cc657600080fd5b505af1158015611cda573d6000803e3d6000fd5b50505050611d77565b611d0573ffffffffffffffffffffffffffffffffffffffff881686308661215d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611d43908490612bb1565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611d858787878787866121bb565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611de9908b908d908c908c908c908b90602401612bc9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611e7c92918790600401612b15565b600060405180830381600087803b158015611e9657600080fd5b505af1158015611eaa573d6000803e3d6000fd5b5050505050505050505050565b61099187878787878787611b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f238484604051611f25929190612b98565b60405180910390a361057a84848484612249565b6000611f44836122a8565b8015611f555750611f55838361230c565b9392505050565b6000611fbe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123db9092919063ffffffff16565b805190915015610a6c5780806020019051810190611fdc9190612aaa565b610a6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610209565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8686866040516120e093929190612b5a565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d848460405161214f929190612b98565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261057a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611905565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161223393929190612b5a565b60405180910390a4610f468686868686866123f2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5848460405161214f929190612b98565b60006122d4827f01ffc9a70000000000000000000000000000000000000000000000000000000061230c565b801561178d5750612305827fffffffff0000000000000000000000000000000000000000000000000000000061230c565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156123c4575060208210155b80156123d05750600081115b979650505050505050565b60606123ea848460008561246a565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8686866040516120e093929190612b5a565b6060824710156124fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610209565b73ffffffffffffffffffffffffffffffffffffffff85163b61257a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610209565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125a39190612c24565b60006040518083038185875af1925050503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b50915091506123d0828286606083156125ff575081611f55565b82511561260f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610209919061294e565b73ffffffffffffffffffffffffffffffffffffffff8116811461266557600080fd5b50565b60008083601f84011261267a57600080fd5b50813567ffffffffffffffff81111561269257600080fd5b6020830191508360208285010111156126aa57600080fd5b9250929050565b600080600080600080600060c0888a0312156126cc57600080fd5b87356126d781612643565b965060208801356126e781612643565b955060408801356126f781612643565b9450606088013561270781612643565b93506080880135925060a088013567ffffffffffffffff81111561272a57600080fd5b6127368a828b01612668565b989b979a50959850939692959293505050565b803563ffffffff8116811461275d57600080fd5b919050565b60008060006040848603121561277757600080fd5b61278084612749565b9250602084013567ffffffffffffffff81111561279c57600080fd5b6127a886828701612668565b9497909650939450505050565b6000806000806000608086880312156127cd57600080fd5b85356127d881612643565b945060208601356127e881612643565b935060408601359250606086013567ffffffffffffffff81111561280b57600080fd5b61281788828901612668565b969995985093965092949392505050565b6000806040838503121561283b57600080fd5b823561284681612643565b9150602083013561285681612643565b809150509250929050565b600080600080600080600060c0888a03121561287c57600080fd5b873561288781612643565b9650602088013561289781612643565b955060408801356128a781612643565b9450606088013593506128bc60808901612749565b925060a088013567ffffffffffffffff81111561272a57600080fd5b60005b838110156128f35781810151838201526020016128db565b8381111561057a5750506000910152565b6000815180845261291c8160208601602086016128d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f556020830184612904565b60008060008060008060a0878903121561297a57600080fd5b863561298581612643565b9550602087013561299581612643565b9450604087013593506129aa60608801612749565b9250608087013567ffffffffffffffff8111156129c657600080fd5b6129d289828a01612668565b979a9699509497509295939492505050565b600080600080606085870312156129fa57600080fd5b8435612a0581612643565b9350612a1360208601612749565b9250604085013567ffffffffffffffff811115612a2f57600080fd5b612a3b87828801612668565b95989497509550505050565b600060208284031215612a5957600080fd5b8151611f5581612643565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612aa557612aa5612a64565b500390565b600060208284031215612abc57600080fd5b81518015158114611f5557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612b0b6080830184612904565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612b446060830185612904565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612b8f6060830184612904565b95945050505050565b8281526040602082015260006123ea6040830184612904565b60008219821115612bc457612bc4612a64565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612c1860c0830184612904565b98975050505050505050565b60008251612c368184602087016128d8565b919091019291505056fea164736f6c634300080f000a","sourceMap":"1209:12690:132:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4741:10:235;1465:19:59;:23;4713:99:235;;;;;;;216:2:357;4713:99:235;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;365:25;345:18;;;338:53;408:19;;4713:99:235;;;;;;;;;4658:81:132::1;4678:10;4690;1343:7:235;4729:9:132;;;;;;;;;;;::::0;4658:19:::1;:81::i;:::-;1209:12690:::0;;;;;12867:1084:235;;;;;;;;;;-1:-1:-1;12867:1084:235;;;;;:::i;:::-;;:::i;7253:186::-;;;;;;:::i;:::-;;:::i;8758:245:132:-;;;;;;:::i;:::-;;:::i;11233:902:235:-;;;;;;:::i;:::-;;:::i;3586:40:132:-;;;;;;;;;;-1:-1:-1;3586:40:132;;;;;;;;;;;3607:42:357;3595:55;;;3577:74;;3565:2;3550:18;3586:40:132;;;;;;;;1893:37:235;;;;;;;;;;-1:-1:-1;1893:37:235;;;;;;;;4055:322:132;;;;;;;;;;-1:-1:-1;4055:322:132;;;;;:::i;:::-;;:::i;10320:349:235:-;;;;;;;;;;-1:-1:-1;10320:349:235;;;;;:::i;:::-;;:::i;3481:40:132:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7066:339::-;;;;;;;;;;-1:-1:-1;7066:339:132;;;;;:::i;:::-;;:::i;4418:103::-;;;;;;;;;;;;;:::i;:::-;;;7155:14:357;;7148:22;7130:41;;7118:2;7103:18;4418:103:132;6990:187:357;6369:98:235;;;;;;;;;;-1:-1:-1;6449:11:235;;;;6369:98;;8106:339:132;;;;;;;;;;-1:-1:-1;8106:339:132;;;;;:::i;:::-;;:::i;9277:349:235:-;;;;;;;;;;-1:-1:-1;9277:349:235;;;;;:::i;:::-;;:::i;1739:63::-;;;;;;;;;;-1:-1:-1;1739:63:235;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;7985:25:357;;;7973:2;7958:18;1739:63:235;7839:177:357;6024:99:235;;;;;;;;;;-1:-1:-1;6107:9:235;;;;6024:99;;6242:179:132;;;;;;:::i;:::-;;:::i;9453:305::-;;;;;;;;;;-1:-1:-1;9453:305:132;;;;;:::i;:::-;;:::i;5183:179::-;;;;;;:::i;:::-;;:::i;2028:33:235:-;;;;;;;;;;-1:-1:-1;2028:33:235;;;;;;;;8450:186;;;;;;:::i;:::-;;:::i;1175:320:59:-;1465:19;;;:23;;;1175:320::o;10356:196:132:-;10478:67;10497:5;10504:3;10509:9;10520:12;10534:10;10478:18;:67::i;:::-;10356:196;;;;:::o;12867:1084:235:-;5004:9;;;;4982:10;:32;:92;;;;-1:-1:-1;5062:11:235;;;5018:9;;:32;;;;;;;;5062:11;;;;;5018:9;;;;;:30;;:32;;;;;;;;;;;;:9;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;4982:92;4961:204;;;;;;;9331:2:357;4961:204:235;;;9313:21:357;9370:2;9350:18;;;9343:30;9409:34;9389:18;;;9382:62;9480:34;9460:18;;;9453:62;9552:3;9531:19;;;9524:32;9573:19;;4961:204:235;9129:469:357;4961:204:235;13126:8:::1;:6;:8::i;:::-;:17;13118:52;;;::::0;::::1;::::0;;9805:2:357;13118:52:235::1;::::0;::::1;9787:21:357::0;9844:2;9824:18;;;9817:30;9883:24;9863:18;;;9856:52;9925:18;;13118:52:235::1;9603:346:357::0;13118:52:235::1;13184:37;13209:11;13184:24;:37::i;:::-;13180:489;;;13262:46;13282:11;13295:12;13262:19;:46::i;:::-;13237:179;;;::::0;::::1;::::0;;10156:2:357;13237:179:235::1;::::0;::::1;10138:21:357::0;10195:2;10175:18;;;10168:30;10234:34;10214:18;;;10207:62;10305:34;10285:18;;;10278:62;10377:12;10356:19;;;10349:41;10407:19;;13237:179:235::1;9954:478:357::0;13237:179:235::1;13431:53;::::0;;;;:39:::1;10629:55:357::0;;;13431:53:235::1;::::0;::::1;10611:74:357::0;10701:18;;;10694:34;;;13431:39:235;::::1;::::0;::::1;::::0;10584:18:357;;13431:53:235::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;13180:489;;;13553:21;::::0;;::::1;;::::0;;;:8:::1;:21;::::0;;;;;;;:35;;::::1;::::0;;;;;;;:45:::1;::::0;13591:7;;13553:45:::1;:::i;:::-;13515:21;::::0;;::::1;;::::0;;;:8:::1;:21;::::0;;;;;;;:35;;::::1;::::0;;;;;;;;;:83;;;;13612:46:::1;::::0;13645:3;13650:7;13612:32:::1;:46::i;:::-;13859:85;13885:11;13898:12;13912:5;13919:3;13924:7;13933:10;;13859:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;13859:25:235::1;::::0;-1:-1:-1;;;13859:85:235:i:1;:::-;12867:1084:::0;;;;;;;:::o;7253:186::-;4741:10;1465:19:59;:23;4713:99:235;;;;;;;216:2:357;4713:99:235;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;365:25;345:18;;;338:53;408:19;;4713:99:235;14:419:357;4713:99:235;7353:79:::1;7372:10;7384;7396:9;7407:12;7421:10;;7353:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;7353:18:235::1;::::0;-1:-1:-1;;;7353:79:235:i:1;:::-;7253:186:::0;;;:::o;8758:245:132:-;8946:50;8964:5;8971:3;8976:7;8985:10;;8946:17;:50::i;:::-;8758:245;;;;;:::o;11233:902:235:-;5004:9;;;;4982:10;:32;:92;;;;-1:-1:-1;5062:11:235;;;5018:9;;:32;;;;;;;;5062:11;;;;;5018:9;;;;;:30;;:32;;;;;;;;;;;;:9;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;4982:92;4961:204;;;;;;;9331:2:357;4961:204:235;;;9313:21:357;9370:2;9350:18;;;9343:30;9409:34;9389:18;;;9382:62;9480:34;9460:18;;;9453:62;9552:3;9531:19;;;9524:32;9573:19;;4961:204:235;9129:469:357;4961:204:235;11447:8:::1;:6;:8::i;:::-;:17;11439:52;;;::::0;::::1;::::0;;9805:2:357;11439:52:235::1;::::0;::::1;9787:21:357::0;9844:2;9824:18;;;9817:30;9883:24;9863:18;;;9856:52;9925:18;;11439:52:235::1;9603:346:357::0;11439:52:235::1;11522:7;11509:9;:20;11501:91;;;::::0;::::1;::::0;;11260:2:357;11501:91:235::1;::::0;::::1;11242:21:357::0;11299:2;11279:18;;;11272:30;11338:34;11318:18;;;11311:62;11409:28;11389:18;;;11382:56;11455:19;;11501:91:235::1;11058:422:357::0;11501:91:235::1;11625:4;11610:20;::::0;::::1;::::0;11602:68:::1;;;::::0;::::1;::::0;;11687:2:357;11602:68:235::1;::::0;::::1;11669:21:357::0;11726:2;11706:18;;;11699:30;11765:34;11745:18;;;11738:62;11836:5;11816:18;;;11809:33;11859:19;;11602:68:235::1;11485:399:357::0;11602:68:235::1;11703:9;::::0;::::1;::::0;;::::1;11688:25:::0;;::::1;::::0;11680:78:::1;;;::::0;::::1;::::0;;12091:2:357;11680:78:235::1;::::0;::::1;12073:21:357::0;12130:2;12110:18;;;12103:30;12169:34;12149:18;;;12142:62;12240:10;12220:18;;;12213:38;12268:19;;11680:78:235::1;11889:404:357::0;11680:78:235::1;11936:56;11960:5;11967:3;11972:7;11981:10;;11936:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;11936:23:235::1;::::0;-1:-1:-1;;;11936:56:235:i:1;:::-;12003:12;12018:45;12032:3;12037:9;12048:7;12018:45;;;;;;;;;;;::::0;:13:::1;:45::i;:::-;12003:60;;12081:7;12073:55;;;::::0;::::1;::::0;;12500:2:357;12073:55:235::1;::::0;::::1;12482:21:357::0;12539:2;12519:18;;;12512:30;12578:34;12558:18;;;12551:62;12649:5;12629:18;;;12622:33;12672:19;;12073:55:235::1;12298:399:357::0;12073:55:235::1;11429:706;11233:902:::0;;;;;:::o;4055:322:132:-;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;-1:-1:-1;3236:4:43;1465:19:59;:23;;;3208:55:43;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;;;;12904:2:357;3146:190:43;;;12886:21:357;12943:2;12923:18;;;12916:30;12982:34;12962:18;;;12955:62;13053:16;13033:18;;;13026:44;13087:19;;3146:190:43;12702:410:357;3146:190:43;3346:12;:16;;;;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;;;;;;;3372:65;4173:16:132::1;:36:::0;;;::::1;;::::0;::::1;;::::0;;4219:151:::1;4267:10:::0;635:42:199::1;4219:21:132;:151::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;;;;;3531:14;;-1:-1:-1;13269:36:357;;3531:14:43;;13257:2:357;13242:18;3531:14:43;;;;;;;3090:472;4055:322:132;;:::o;10320:349:235:-;10563:99;10584:11;10597:12;10611:10;10623:3;10628:7;10637:12;10651:10;;10563:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10563:20:235;;-1:-1:-1;;;10563:99:235:i;7066:339:132:-;4741:10:235;1465:19:59;:23;4713:99:235;;;;;;;216:2:357;4713:99:235;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;365:25;345:18;;;338:53;408:19;;4713:99:235;14:419:357;4713:99:235;7298:100:132::1;7320:8;7330;7340:10;7352;7364:7;7373:12;7387:10;;7298:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;7298:21:132::1;::::0;-1:-1:-1;;;7298:100:132:i:1;4418:103::-:0;4489:16;;:25;;;;;;;;4466:4;;4489:16;;;:23;;:25;;;;;;;;;;;;;;:16;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4482:32;;4418:103;:::o;8106:339::-;8345:93;8367:8;8377;8387:10;8399:3;8404:7;8413:12;8427:10;;8345:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8345:21:132;;-1:-1:-1;;;8345:93:132:i;9277:349:235:-;4741:10;1465:19:59;:23;4713:99:235;;;;;;;216:2:357;4713:99:235;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;365:25;345:18;;;338:53;408:19;;4713:99:235;14:419:357;4713:99:235;9513:106:::1;9534:11;9547:12;9561:10;9573;9585:7;9594:12;9608:10;;9513:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;9513:20:235::1;::::0;-1:-1:-1;;;9513:106:235:i:1;6242:179:132:-:0;6352:62;6372:10;6384:3;6389:12;6403:10;;6352:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6352:19:132;;-1:-1:-1;;;6352:62:132:i;9453:305::-;9679:72;9699:8;9709;9719:5;9726:3;9731:7;9740:10;;9679:19;:72::i;5183:179::-;4741:10:235;1465:19:59;:23;4713:99:235;;;;;;;216:2:357;4713:99:235;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;365:25;345:18;;;338:53;408:19;;4713:99:235;14:419:357;4713:99:235;5286:69:132::1;5306:10;5318;5330:12;5344:10;;5286:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;5286:19:132::1;::::0;-1:-1:-1;;;5286:69:132:i:1;8450:186:235:-:0;8557:72;8576:10;8588:3;8593:9;8604:12;8618:10;;8557:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8557:18:235;;-1:-1:-1;;;8557:72:235:i;14539:789::-;14756:7;14743:9;:20;14735:95;;;;;;;13800:2:357;14735:95:235;;;13782:21:357;13839:2;13819:18;;;13812:30;13878:34;13858:18;;;13851:62;13949:32;13929:18;;;13922:60;13999:19;;14735:95:235;13598:426:357;14735:95:235;15008:56;15032:5;15039:3;15044:7;15053:10;15008:23;:56::i;:::-;15075:9;;15146:11;;15182:88;;15075:9;;;;;:21;;15105:7;;15146:11;;;15205:31;;15182:88;;15238:5;;15245:3;;15105:7;;15259:10;;15182:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;15075:246;;;;;;;;;;;;;15298:12;;15075:246;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14539:789;;;;;:::o;17966:279::-;18039:4;18062:79;18094:6;18102:38;18062:31;:79::i;:::-;:176;;;;18157:81;18189:6;18197:40;18157:31;:81::i;:::-;18055:183;17966:279;-1:-1:-1;;17966:279:235:o;18692:410::-;18789:4;18809:87;18841:14;18857:38;18809:31;:87::i;:::-;18805:291;;;18955:14;18934:44;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18919:61;;:11;:61;;;18912:68;;;;18805:291;19056:14;19033:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;763:205:52;902:58;;10641:42:357;10629:55;;902:58:52;;;10611:74:357;10701:18;;;10694:34;;;875:86:52;;895:5;;925:23;;10584:18:357;;902:58:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:19;:86::i;13450:447:132:-;13757:5;13705:84;;13743:12;13705:84;;13730:11;13705:84;;;13764:3;13769:7;13778:10;13705:84;;;;;;;;:::i;:::-;;;;;;;;13799:91;13831:11;13844:12;13858:5;13865:3;13870:7;13879:10;13799:31;:91::i;12208:328::-;12432:3;12402:55;;12425:5;12402:55;;;12437:7;12446:10;12402:55;;;;;;;:::i;:::-;;;;;;;;12467:62;12497:5;12504:3;12509:7;12518:10;12467:29;:62::i;1202:536:200:-;1305:4;1321:13;1668:1;1635;1594:9;1588:16;1554:2;1543:9;1539:18;1496:6;1454:7;1421:4;1395:302;1367:330;1202:536;-1:-1:-1;;;;;;1202:536:200:o;5373:236:235:-;4888:13:43;;;;;;;4880:69;;;;;;;15885:2:357;4880:69:43;;;15867:21:357;15924:2;15904:18;;;15897:30;15963:34;15943:18;;;15936:62;16034:13;16014:18;;;16007:41;16065:19;;4880:69:43;15683:407:357;4880:69:43;5544:9:235::1;:22:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;5576:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;5373:236::o;16022:1680::-;16283:37;16308:11;16283:24;:37::i;:::-;16279:512;;;16361:46;16381:11;16394:12;16361:19;:46::i;:::-;16336:179;;;;;;;10156:2:357;16336:179:235;;;10138:21:357;10195:2;10175:18;;;10168:30;10234:34;10214:18;;;10207:62;10305:34;10285:18;;;10278:62;10377:12;10356:19;;;10349:41;10407:19;;16336:179:235;9954:478:357;16336:179:235;16530:55;;;;;:39;10629:55:357;;;16530::235;;;10611:74:357;10701:18;;;10694:34;;;16530:39:235;;;;;10584:18:357;;16530:55:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16279:512;;;16616:67;:36;;;16653:5;16668:4;16675:7;16616:36;:67::i;:::-;16735:21;;;;;;;;:8;:21;;;;;;;;:35;;;;;;;;;;:45;;16773:7;;16735:45;:::i;:::-;16697:21;;;;;;;;:8;:21;;;;;;;;:35;;;;;;;;;:83;16279:512;16981:85;17007:11;17020:12;17034:5;17041:3;17046:7;17055:10;16981:25;:85::i;:::-;17077:9;;17130:11;;17166:478;;17077:9;;;;;:21;;17130:11;;17206:33;;17166:478;;17492:12;;17522:11;;17551:5;;17574:3;;17595:7;;17620:10;;17166:478;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;17077:618;;;;;;;;;;;;;17672:12;;17077:618;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16022:1680;;;;;;;:::o;11078:345:132:-;11329:87;11350:8;11360;11370:5;11377:3;11382:7;11391:12;11405:10;11329:20;:87::i;11651:325::-;11872:3;11845:52;;11865:5;11845:52;;;11877:7;11886:10;11845:52;;;;;;;:::i;:::-;;;;;;;;11907:62;11937:5;11944:3;11949:7;11958:10;11907:29;:62::i;1333:274:67:-;1420:4;1527:23;1542:7;1527:14;:23::i;:::-;:73;;;;;1554:46;1579:7;1588:11;1554:24;:46::i;:::-;1520:80;1333:274;-1:-1:-1;;;1333:274:67:o;3747:706:52:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:52;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;;;;17109:2:357;4351:85:52;;;17091:21:357;17148:2;17128:18;;;17121:30;17187:34;17167:18;;;17160:62;17258:12;17238:18;;;17231:40;17288:19;;4351:85:52;16907:406:357;21757:341:235;22059:5;22011:80;;22045:12;22011:80;;22032:11;22011:80;;;22066:3;22071:7;22080:10;22011:80;;;;;;;;:::i;:::-;;;;;;;;21757:341;;;;;;:::o;20099:251::-;20318:3;20292:51;;20311:5;20292:51;;;20323:7;20332:10;20292:51;;;;;;;:::i;:::-;;;;;;;;20099:251;;;;:::o;974:241:52:-;1139:68;;17530:42:357;17599:15;;;1139:68:52;;;17581:34:357;17651:15;;17631:18;;;17624:43;17683:18;;;17676:34;;;1112:96:52;;1132:5;;1162:27;;17493:18:357;;1139:68:52;17318:398:357;12771:444:132;13075:5;13026:81;;13061:12;13026:81;;13048:11;13026:81;;;13082:3;13087:7;13096:10;13026:81;;;;;;;;:::i;:::-;;;;;;;;13117:91;13149:11;13162:12;13176:5;13183:3;13188:7;13197:10;13117:31;:91::i;19478:251:235:-;19697:3;19671:51;;19690:5;19671:51;;;19702:7;19711:10;19671:51;;;;;;;:::i;704:411:67:-;768:4;975:60;1000:7;1009:25;975:24;:60::i;:::-;:133;;;;-1:-1:-1;1052:56:67;1077:7;1086:21;1052:24;:56::i;:::-;1051:57;956:152;704:411;-1:-1:-1;;704:411:67:o;4223:638::-;4385:71;;;17895:66:357;17883:79;;4385:71:67;;;;17865:98:357;;;;4385:71:67;;;;;;;;;;17838:18:357;;;;4385:71:67;;;;;;;;;;;4408:34;4385:71;;;4664:20;;4316:4;;4385:71;4316:4;;;;;;4385:71;4316:4;;4664:20;4629:7;4622:5;4611:86;4600:97;;4724:16;4710:30;;4774:4;4768:11;4753:26;;4806:7;:29;;;;;4831:4;4817:10;:18;;4806:29;:48;;;;;4853:1;4839:11;:15;4806:48;4799:55;4223:638;-1:-1:-1;;;;;;;4223:638:67:o;3861:223:59:-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;3861:223;-1:-1:-1;;;;3861:223:59:o;20883:341:235:-;21185:5;21137:80;;21171:12;21137:80;;21158:11;21137:80;;;21192:3;21197:7;21206:10;21137:80;;;;;;;;:::i;4948:499:59:-;5113:12;5170:5;5145:21;:30;;5137:81;;;;;;;18176:2:357;5137:81:59;;;18158:21:357;18215:2;18195:18;;;18188:30;18254:34;18234:18;;;18227:62;18325:8;18305:18;;;18298:36;18351:19;;5137:81:59;17974:402:357;5137:81:59;1465:19;;;;5228:60;;;;;;;18583:2:357;5228:60:59;;;18565:21:357;18622:2;18602:18;;;18595:30;18661:31;18641:18;;;18634:59;18710:18;;5228:60:59;18381:353:357;5228:60:59;5300:12;5314:23;5341:6;:11;;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;7707;7735:7;7731:566;;;-1:-1:-1;7765:10:59;7758:17;;7731:566;7876:17;;:21;7872:415;;8120:10;8114:17;8180:15;8167:10;8163:2;8159:19;8152:44;7872:415;8259:12;8252:20;;;;;;;;;;;:::i;438:154:357:-;524:42;517:5;513:54;506:5;503:65;493:93;;582:1;579;572:12;493:93;438:154;:::o;597:347::-;648:8;658:6;712:3;705:4;697:6;693:17;689:27;679:55;;730:1;727;720:12;679:55;-1:-1:-1;753:20:357;;796:18;785:30;;782:50;;;828:1;825;818:12;782:50;865:4;857:6;853:17;841:29;;917:3;910:4;901:6;893;889:19;885:30;882:39;879:59;;;934:1;931;924:12;879:59;597:347;;;;;:::o;949:1038::-;1064:6;1072;1080;1088;1096;1104;1112;1165:3;1153:9;1144:7;1140:23;1136:33;1133:53;;;1182:1;1179;1172:12;1133:53;1221:9;1208:23;1240:31;1265:5;1240:31;:::i;:::-;1290:5;-1:-1:-1;1347:2:357;1332:18;;1319:32;1360:33;1319:32;1360:33;:::i;:::-;1412:7;-1:-1:-1;1471:2:357;1456:18;;1443:32;1484:33;1443:32;1484:33;:::i;:::-;1536:7;-1:-1:-1;1595:2:357;1580:18;;1567:32;1608:33;1567:32;1608:33;:::i;:::-;1660:7;-1:-1:-1;1714:3:357;1699:19;;1686:33;;-1:-1:-1;1770:3:357;1755:19;;1742:33;1798:18;1787:30;;1784:50;;;1830:1;1827;1820:12;1784:50;1869:58;1919:7;1910:6;1899:9;1895:22;1869:58;:::i;:::-;949:1038;;;;-1:-1:-1;949:1038:357;;-1:-1:-1;949:1038:357;;;;1843:84;;-1:-1:-1;;;949:1038:357:o;1992:163::-;2059:20;;2119:10;2108:22;;2098:33;;2088:61;;2145:1;2142;2135:12;2088:61;1992:163;;;:::o;2160:481::-;2238:6;2246;2254;2307:2;2295:9;2286:7;2282:23;2278:32;2275:52;;;2323:1;2320;2313:12;2275:52;2346:28;2364:9;2346:28;:::i;:::-;2336:38;;2425:2;2414:9;2410:18;2397:32;2452:18;2444:6;2441:30;2438:50;;;2484:1;2481;2474:12;2438:50;2523:58;2573:7;2564:6;2553:9;2549:22;2523:58;:::i;:::-;2160:481;;2600:8;;-1:-1:-1;2497:84:357;;-1:-1:-1;;;;2160:481:357:o;2646:754::-;2743:6;2751;2759;2767;2775;2828:3;2816:9;2807:7;2803:23;2799:33;2796:53;;;2845:1;2842;2835:12;2796:53;2884:9;2871:23;2903:31;2928:5;2903:31;:::i;:::-;2953:5;-1:-1:-1;3010:2:357;2995:18;;2982:32;3023:33;2982:32;3023:33;:::i;:::-;3075:7;-1:-1:-1;3129:2:357;3114:18;;3101:32;;-1:-1:-1;3184:2:357;3169:18;;3156:32;3211:18;3200:30;;3197:50;;;3243:1;3240;3233:12;3197:50;3282:58;3332:7;3323:6;3312:9;3308:22;3282:58;:::i;:::-;2646:754;;;;-1:-1:-1;2646:754:357;;-1:-1:-1;3359:8:357;;3256:84;2646:754;-1:-1:-1;;;2646:754:357:o;3924:445::-;4049:6;4057;4110:2;4098:9;4089:7;4085:23;4081:32;4078:52;;;4126:1;4123;4116:12;4078:52;4165:9;4152:23;4184:31;4209:5;4184:31;:::i;:::-;4234:5;-1:-1:-1;4291:2:357;4276:18;;4263:32;4304:33;4263:32;4304:33;:::i;:::-;4356:7;4346:17;;;3924:445;;;;;:::o;4374:969::-;4488:6;4496;4504;4512;4520;4528;4536;4589:3;4577:9;4568:7;4564:23;4560:33;4557:53;;;4606:1;4603;4596:12;4557:53;4645:9;4632:23;4664:31;4689:5;4664:31;:::i;:::-;4714:5;-1:-1:-1;4771:2:357;4756:18;;4743:32;4784:33;4743:32;4784:33;:::i;:::-;4836:7;-1:-1:-1;4895:2:357;4880:18;;4867:32;4908:33;4867:32;4908:33;:::i;:::-;4960:7;-1:-1:-1;5014:2:357;4999:18;;4986:32;;-1:-1:-1;5037:38:357;5070:3;5055:19;;5037:38;:::i;:::-;5027:48;;5126:3;5115:9;5111:19;5098:33;5154:18;5146:6;5143:30;5140:50;;;5186:1;5183;5176:12;5348:258;5420:1;5430:113;5444:6;5441:1;5438:13;5430:113;;;5520:11;;;5514:18;5501:11;;;5494:39;5466:2;5459:10;5430:113;;;5561:6;5558:1;5555:13;5552:48;;;-1:-1:-1;;5596:1:357;5578:16;;5571:27;5348:258::o;5611:317::-;5653:3;5691:5;5685:12;5718:6;5713:3;5706:19;5734:63;5790:6;5783:4;5778:3;5774:14;5767:4;5760:5;5756:16;5734:63;:::i;:::-;5842:2;5830:15;5847:66;5826:88;5817:98;;;;5917:4;5813:109;;5611:317;-1:-1:-1;;5611:317:357:o;5933:220::-;6082:2;6071:9;6064:21;6045:4;6102:45;6143:2;6132:9;6128:18;6120:6;6102:45;:::i;6158:827::-;6263:6;6271;6279;6287;6295;6303;6356:3;6344:9;6335:7;6331:23;6327:33;6324:53;;;6373:1;6370;6363:12;6324:53;6412:9;6399:23;6431:31;6456:5;6431:31;:::i;:::-;6481:5;-1:-1:-1;6538:2:357;6523:18;;6510:32;6551:33;6510:32;6551:33;:::i;:::-;6603:7;-1:-1:-1;6657:2:357;6642:18;;6629:32;;-1:-1:-1;6680:37:357;6713:2;6698:18;;6680:37;:::i;:::-;6670:47;;6768:3;6757:9;6753:19;6740:33;6796:18;6788:6;6785:30;6782:50;;;6828:1;6825;6818:12;6782:50;6867:58;6917:7;6908:6;6897:9;6893:22;6867:58;:::i;:::-;6158:827;;;;-1:-1:-1;6158:827:357;;-1:-1:-1;6158:827:357;;6944:8;;6158:827;-1:-1:-1;;;6158:827:357:o;8252:616::-;8339:6;8347;8355;8363;8416:2;8404:9;8395:7;8391:23;8387:32;8384:52;;;8432:1;8429;8422:12;8384:52;8471:9;8458:23;8490:31;8515:5;8490:31;:::i;:::-;8540:5;-1:-1:-1;8564:37:357;8597:2;8582:18;;8564:37;:::i;:::-;8554:47;;8652:2;8641:9;8637:18;8624:32;8679:18;8671:6;8668:30;8665:50;;;8711:1;8708;8701:12;8665:50;8750:58;8800:7;8791:6;8780:9;8776:22;8750:58;:::i;:::-;8252:616;;;;-1:-1:-1;8827:8:357;-1:-1:-1;;;;8252:616:357:o;8873:251::-;8943:6;8996:2;8984:9;8975:7;8971:23;8967:32;8964:52;;;9012:1;9009;9002:12;8964:52;9044:9;9038:16;9063:31;9088:5;9063:31;:::i;10739:184::-;10791:77;10788:1;10781:88;10888:4;10885:1;10878:15;10912:4;10909:1;10902:15;10928:125;10968:4;10996:1;10993;10990:8;10987:34;;;11001:18;;:::i;:::-;-1:-1:-1;11038:9:357;;10928:125::o;13316:277::-;13383:6;13436:2;13424:9;13415:7;13411:23;13407:32;13404:52;;;13452:1;13449;13442:12;13404:52;13484:9;13478:16;13537:5;13530:13;13523:21;13516:5;13513:32;13503:60;;13559:1;13556;13549:12;14029:512;14223:4;14252:42;14333:2;14325:6;14321:15;14310:9;14303:34;14385:2;14377:6;14373:15;14368:2;14357:9;14353:18;14346:43;;14425:6;14420:2;14409:9;14405:18;14398:34;14468:3;14463:2;14452:9;14448:18;14441:31;14489:46;14530:3;14519:9;14515:19;14507:6;14489:46;:::i;:::-;14481:54;14029:512;-1:-1:-1;;;;;;14029:512:357:o;14546:424::-;14759:42;14751:6;14747:55;14736:9;14729:74;14839:2;14834;14823:9;14819:18;14812:30;14710:4;14859:45;14900:2;14889:9;14885:18;14877:6;14859:45;:::i;:::-;14851:53;;14952:10;14944:6;14940:23;14935:2;14924:9;14920:18;14913:51;14546:424;;;;;;:::o;14975:409::-;15190:42;15182:6;15178:55;15167:9;15160:74;15270:6;15265:2;15254:9;15250:18;15243:34;15313:2;15308;15297:9;15293:18;15286:30;15141:4;15333:45;15374:2;15363:9;15359:18;15351:6;15333:45;:::i;:::-;15325:53;14975:409;-1:-1:-1;;;;;14975:409:357:o;15389:289::-;15564:6;15553:9;15546:25;15607:2;15602;15591:9;15587:18;15580:30;15527:4;15627:45;15668:2;15657:9;15653:18;15645:6;15627:45;:::i;16095:128::-;16135:3;16166:1;16162:6;16159:1;16156:13;16153:39;;;16172:18;;:::i;:::-;-1:-1:-1;16208:9:357;;16095:128::o;16228:674::-;16478:4;16507:42;16588:2;16580:6;16576:15;16565:9;16558:34;16640:2;16632:6;16628:15;16623:2;16612:9;16608:18;16601:43;16692:2;16684:6;16680:15;16675:2;16664:9;16660:18;16653:43;16744:2;16736:6;16732:15;16727:2;16716:9;16712:18;16705:43;;16785:6;16779:3;16768:9;16764:19;16757:35;16829:3;16823;16812:9;16808:19;16801:32;16850:46;16891:3;16880:9;16876:19;16868:6;16850:46;:::i;:::-;16842:54;16228:674;-1:-1:-1;;;;;;;;16228:674:357:o;18739:274::-;18868:3;18906:6;18900:13;18922:53;18968:6;18963:3;18956:4;18948:6;18944:17;18922:53;:::i;:::-;18991:16;;;;;18739:274;-1:-1:-1;;18739:274:357:o","linkReferences":{}},"methodIdentifiers":{"MESSENGER()":"927ede2d","OTHER_BRIDGE()":"7f46ddb2","bridgeERC20(address,address,uint256,uint32,bytes)":"87087623","bridgeERC20To(address,address,address,uint256,uint32,bytes)":"540abf73","bridgeETH(uint32,bytes)":"09fc8843","bridgeETHTo(address,uint32,bytes)":"e11013dd","depositERC20(address,address,uint256,uint32,bytes)":"58a997f6","depositERC20To(address,address,address,uint256,uint32,bytes)":"838b2520","depositETH(uint32,bytes)":"b1a1a882","depositETHTo(address,uint32,bytes)":"9a2ac6d5","deposits(address,address)":"8f601f66","finalizeBridgeERC20(address,address,address,address,uint256,bytes)":"0166a07a","finalizeBridgeETH(address,address,uint256,bytes)":"1635f5fd","finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)":"a9f9e675","finalizeETHWithdrawal(address,address,uint256,bytes)":"1532ec34","initialize(address,address)":"485cc955","l2TokenBridge()":"91c49bf8","messenger()":"3cb747bf","otherBridge()":"c89701a2","paused()":"5c975abb","superchainConfig()":"35e80ab3","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC20BridgeFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC20BridgeInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC20DepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC20WithdrawalFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ETHBridgeFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ETHBridgeInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ETHDepositInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ETHWithdrawalFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_BRIDGE\",\"outputs\":[{\"internalType\":\"contract StandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC20To\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeETHTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"depositERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"depositERC20To\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"depositETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"depositETHTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeBridgeERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeBridgeETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeERC20Withdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeETHWithdrawal\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"contract SuperchainConfig\",\"name\":\"_superchainConfig\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2TokenBridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"otherBridge\",\"outputs\":[{\"internalType\":\"contract StandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superchainConfig\",\"outputs\":[{\"internalType\":\"contract SuperchainConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"custom:proxied\":\"@title L1StandardBridge\",\"events\":{\"ERC20DepositInitiated(address,address,address,address,uint256,bytes)\":{\"custom:legacy\":\"@notice Emitted whenever an ERC20 deposit is initiated.\",\"params\":{\"amount\":\"Amount of the ERC20 deposited.\",\"extraData\":\"Extra data attached to the deposit.\",\"from\":\"Address of the depositor.\",\"l1Token\":\"Address of the token on L1.\",\"l2Token\":\"Address of the corresponding token on L2.\",\"to\":\"Address of the recipient on L2.\"}},\"ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)\":{\"custom:legacy\":\"@notice Emitted whenever an ERC20 withdrawal is finalized.\",\"params\":{\"amount\":\"Amount of the ERC20 withdrawn.\",\"extraData\":\"Extra data attached to the withdrawal.\",\"from\":\"Address of the withdrawer.\",\"l1Token\":\"Address of the token on L1.\",\"l2Token\":\"Address of the corresponding token on L2.\",\"to\":\"Address of the recipient on L1.\"}},\"ETHDepositInitiated(address,address,uint256,bytes)\":{\"custom:legacy\":\"@notice Emitted whenever a deposit of ETH from L1 into L2 is initiated.\",\"params\":{\"amount\":\"Amount of ETH deposited.\",\"extraData\":\"Extra data attached to the deposit.\",\"from\":\"Address of the depositor.\",\"to\":\"Address of the recipient on L2.\"}},\"ETHWithdrawalFinalized(address,address,uint256,bytes)\":{\"custom:legacy\":\"@notice Emitted whenever a withdrawal of ETH from L2 to L1 is finalized.\",\"params\":{\"amount\":\"Amount of ETH withdrawn.\",\"extraData\":\"Extra data attached to the withdrawal.\",\"from\":\"Address of the withdrawer.\",\"to\":\"Address of the recipient on L1.\"}}},\"kind\":\"dev\",\"methods\":{\"MESSENGER()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Contract of the messenger on this domain.\"}},\"OTHER_BRIDGE()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Contract of the bridge on the other network.\"}},\"bridgeERC20(address,address,uint256,uint32,bytes)\":{\"params\":{\"_amount\":\"Amount of local tokens to deposit.\",\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_localToken\":\"Address of the ERC20 on this chain.\",\"_minGasLimit\":\"Minimum amount of gas that the bridge can be relayed with.\",\"_remoteToken\":\"Address of the corresponding token on the remote chain.\"}},\"bridgeERC20To(address,address,address,uint256,uint32,bytes)\":{\"params\":{\"_amount\":\"Amount of local tokens to deposit.\",\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_localToken\":\"Address of the ERC20 on this chain.\",\"_minGasLimit\":\"Minimum amount of gas that the bridge can be relayed with.\",\"_remoteToken\":\"Address of the corresponding token on the remote chain.\",\"_to\":\"Address of the receiver.\"}},\"bridgeETH(uint32,bytes)\":{\"params\":{\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_minGasLimit\":\"Minimum amount of gas that the bridge can be relayed with.\"}},\"bridgeETHTo(address,uint32,bytes)\":{\"params\":{\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_minGasLimit\":\"Minimum amount of gas that the bridge can be relayed with.\",\"_to\":\"Address of the receiver.\"}},\"depositERC20(address,address,uint256,uint32,bytes)\":{\"custom:legacy\":\"@notice Deposits some amount of ERC20 tokens into the sender's account on L2.\",\"params\":{\"_amount\":\"Amount of the ERC20 to deposit.\",\"_extraData\":\"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.\",\"_l1Token\":\"Address of the L1 token being deposited.\",\"_l2Token\":\"Address of the corresponding token on L2.\",\"_minGasLimit\":\"Minimum gas limit for the deposit message on L2.\"}},\"depositERC20To(address,address,address,uint256,uint32,bytes)\":{\"custom:legacy\":\"@notice Deposits some amount of ERC20 tokens into a target account on L2.\",\"params\":{\"_amount\":\"Amount of the ERC20 to deposit.\",\"_extraData\":\"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.\",\"_l1Token\":\"Address of the L1 token being deposited.\",\"_l2Token\":\"Address of the corresponding token on L2.\",\"_minGasLimit\":\"Minimum gas limit for the deposit message on L2.\",\"_to\":\"Address of the recipient on L2.\"}},\"depositETH(uint32,bytes)\":{\"custom:legacy\":\"@notice Deposits some amount of ETH into the sender's account on L2.\",\"params\":{\"_extraData\":\"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.\",\"_minGasLimit\":\"Minimum gas limit for the deposit message on L2.\"}},\"depositETHTo(address,uint32,bytes)\":{\"custom:legacy\":\"@notice Deposits some amount of ETH into a target account on L2. Note that if ETH is sent to a contract on L2 and the call fails, then that ETH will be locked in the L2StandardBridge. ETH may be recoverable if the call can be successfully replayed by increasing the amount of gas supplied to the call. If the call will fail for any amount of gas, then the ETH will be locked permanently.\",\"params\":{\"_extraData\":\"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.\",\"_minGasLimit\":\"Minimum gas limit for the deposit message on L2.\",\"_to\":\"Address of the recipient on L2.\"}},\"finalizeBridgeERC20(address,address,address,address,uint256,bytes)\":{\"params\":{\"_amount\":\"Amount of the ERC20 being bridged.\",\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_from\":\"Address of the sender.\",\"_localToken\":\"Address of the ERC20 on this chain.\",\"_remoteToken\":\"Address of the corresponding token on the remote chain.\",\"_to\":\"Address of the receiver.\"}},\"finalizeBridgeETH(address,address,uint256,bytes)\":{\"params\":{\"_amount\":\"Amount of ETH being bridged.\",\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_from\":\"Address of the sender.\",\"_to\":\"Address of the receiver.\"}},\"finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)\":{\"custom:legacy\":\"@notice Finalizes a withdrawal of ERC20 tokens from L2.\",\"params\":{\"_amount\":\"Amount of the ERC20 to withdraw.\",\"_extraData\":\"Optional data forwarded from L2.\",\"_from\":\"Address of the withdrawer on L2.\",\"_l1Token\":\"Address of the token on L1.\",\"_l2Token\":\"Address of the corresponding token on L2.\",\"_to\":\"Address of the recipient on L1.\"}},\"finalizeETHWithdrawal(address,address,uint256,bytes)\":{\"custom:legacy\":\"@notice Finalizes a withdrawal of ETH from L2.\",\"params\":{\"_amount\":\"Amount of ETH to withdraw.\",\"_extraData\":\"Optional data forwarded from L2.\",\"_from\":\"Address of the withdrawer on L2.\",\"_to\":\"Address of the recipient on L1.\"}},\"initialize(address,address)\":{\"params\":{\"_messenger\":\"Contract for the CrossDomainMessenger on this network.\",\"_superchainConfig\":\"Contract for the SuperchainConfig on this network.\"}},\"l2TokenBridge()\":{\"custom:legacy\":\"@notice Retrieves the access of the corresponding L2 bridge contract.\",\"returns\":{\"_0\":\"Address of the corresponding L2 bridge contract.\"}},\"paused()\":{\"returns\":{\"_0\":\"Whether or not the contract is paused.\"}}},\"stateVariables\":{\"version\":{\"custom:semver\":\"2.1.0\"}},\"version\":1},\"userdoc\":{\"events\":{\"ERC20BridgeFinalized(address,address,address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ERC20 bridge is finalized on this chain.\"},\"ERC20BridgeInitiated(address,address,address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ERC20 bridge is initiated to the other chain.\"},\"ETHBridgeFinalized(address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ETH bridge is finalized on this chain.\"},\"ETHBridgeInitiated(address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ETH bridge is initiated to the other chain.\"}},\"kind\":\"user\",\"methods\":{\"MESSENGER()\":{\"notice\":\"Getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead.\"},\"OTHER_BRIDGE()\":{\"notice\":\"Getter for the other bridge contract. Public getter is legacy and will be removed in the future. Use `otherBridge` instead.\"},\"bridgeERC20(address,address,uint256,uint32,bytes)\":{\"notice\":\"Sends ERC20 tokens to the sender's address on the other chain.\"},\"bridgeERC20To(address,address,address,uint256,uint32,bytes)\":{\"notice\":\"Sends ERC20 tokens to a receiver's address on the other chain.\"},\"bridgeETH(uint32,bytes)\":{\"notice\":\"Sends ETH to the sender's address on the other chain.\"},\"bridgeETHTo(address,uint32,bytes)\":{\"notice\":\"Sends ETH to a receiver's address on the other chain. Note that if ETH is sent to a smart contract and the call fails, the ETH will be temporarily locked in the StandardBridge on the other chain until the call is replayed. If the call cannot be replayed with any amount of gas (call always reverts), then the ETH will be permanently locked in the StandardBridge on the other chain. ETH will also be locked if the receiver is the other bridge, because finalizeBridgeETH will revert in that case.\"},\"constructor\":{\"notice\":\"Constructs the L1StandardBridge contract.\"},\"deposits(address,address)\":{\"notice\":\"Mapping that stores deposits for a given pair of local and remote tokens.\"},\"finalizeBridgeERC20(address,address,address,address,uint256,bytes)\":{\"notice\":\"Finalizes an ERC20 bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain.\"},\"finalizeBridgeETH(address,address,uint256,bytes)\":{\"notice\":\"Finalizes an ETH bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain.\"},\"initialize(address,address)\":{\"notice\":\"Initializer.\"},\"messenger()\":{\"notice\":\"Messenger contract on this domain.\"},\"otherBridge()\":{\"notice\":\"Corresponding bridge on the other domain.\"},\"paused()\":{\"notice\":\"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op.\"},\"superchainConfig()\":{\"notice\":\"Address of the SuperchainConfig contract.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"The L1StandardBridge is responsible for transfering ETH and ERC20 tokens between L1 and L2. In the case that an ERC20 token is native to L1, it will be escrowed within this contract. If the ERC20 token is native to L2, it will be burnt. Before Bedrock, ETH was stored within this contract. After Bedrock, ETH is instead stored inside the OptimismPortal contract. NOTE: this contract is not intended to support all variations of ERC20 tokens. Examples of some token types that may not be properly supported by this contract include, but are not limited to: tokens with transfer fees, rebasing tokens, and tokens with blocklists.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L1/L1StandardBridge.sol\":\"L1StandardBridge\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0\",\"dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95\",\"dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6\",\"dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\":{\"keccak256\":\"0xc65c83c1039508fa7a42a09a3c6a32babd1c438ba4dbb23581255e784b5d5eed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1b3b38db0f76429db899909025e534c366415e9ea8b5ddc4c8901e6a7fc1461\",\"dweb:/ipfs/QmYv1KxyHjLEky9JWNSsSfpGJbiCxFyzVFgTwQKpiqYGUg\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"src/L1/L1StandardBridge.sol\":{\"keccak256\":\"0x2fdc6f6f464a24344847c81d394f502d000cd722f7ff21fa21104b5f7e392633\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://393fd96446ab8fce3bb7d1134e6ff847bf9940e0eaa199accf01118c3917367f\",\"dweb:/ipfs/QmX36camDYHu7pVzdjnfprinxPpZnjJehZXUKTyUdezKRK\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409\",\"dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM\"]},\"src/L1/SuperchainConfig.sol\":{\"keccak256\":\"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f\",\"dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72\",\"dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b\",\"dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp\"]},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff\",\"dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA\"]},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12\",\"dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF\"]},\"src/libraries/Predeploys.sol\":{\"keccak256\":\"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663\",\"dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe\"]},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"]},\"src/libraries/Storage.sol\":{\"keccak256\":\"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269\",\"dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b\",\"dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV\"]},\"src/universal/CrossDomainMessenger.sol\":{\"keccak256\":\"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1\",\"dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n\"]},\"src/universal/IOptimismMintableERC20.sol\":{\"keccak256\":\"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf\",\"dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"src/universal/OptimismMintableERC20.sol\":{\"keccak256\":\"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7\",\"dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa\"]},\"src/universal/StandardBridge.sol\":{\"keccak256\":\"0x1a2f6afd7f14430ae2b797e09497c3dc860ed5db752e1847e30649668060c01d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fefe1356cdeb5b324e4e63e1c723c08f9e244ef2ef133b9f5df0cc0d180eeaa8\",\"dweb:/ipfs/QmZzR3zWKodwdwrdWwXUyh7G3qcFn2cjUQLrE45gRyQMn3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"localToken","type":"address","indexed":true},{"internalType":"address","name":"remoteToken","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ERC20BridgeFinalized","anonymous":false},{"inputs":[{"internalType":"address","name":"localToken","type":"address","indexed":true},{"internalType":"address","name":"remoteToken","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ERC20BridgeInitiated","anonymous":false},{"inputs":[{"internalType":"address","name":"l1Token","type":"address","indexed":true},{"internalType":"address","name":"l2Token","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ERC20DepositInitiated","anonymous":false},{"inputs":[{"internalType":"address","name":"l1Token","type":"address","indexed":true},{"internalType":"address","name":"l2Token","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ERC20WithdrawalFinalized","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ETHBridgeFinalized","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ETHBridgeInitiated","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ETHDepositInitiated","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ETHWithdrawalFinalized","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MESSENGER","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"OTHER_BRIDGE","outputs":[{"internalType":"contract StandardBridge","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"bridgeERC20"},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"bridgeERC20To"},{"inputs":[{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"bridgeETH"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"bridgeETHTo"},{"inputs":[{"internalType":"address","name":"_l1Token","type":"address"},{"internalType":"address","name":"_l2Token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"depositERC20"},{"inputs":[{"internalType":"address","name":"_l1Token","type":"address"},{"internalType":"address","name":"_l2Token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"depositERC20To"},{"inputs":[{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"depositETH"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"depositETHTo"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"finalizeBridgeERC20"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"finalizeBridgeETH"},{"inputs":[{"internalType":"address","name":"_l1Token","type":"address"},{"internalType":"address","name":"_l2Token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"finalizeERC20Withdrawal"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"finalizeETHWithdrawal"},{"inputs":[{"internalType":"contract CrossDomainMessenger","name":"_messenger","type":"address"},{"internalType":"contract SuperchainConfig","name":"_superchainConfig","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"l2TokenBridge","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"messenger","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"otherBridge","outputs":[{"internalType":"contract StandardBridge","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"superchainConfig","outputs":[{"internalType":"contract SuperchainConfig","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"MESSENGER()":{"custom:legacy":"","returns":{"_0":"Contract of the messenger on this domain."}},"OTHER_BRIDGE()":{"custom:legacy":"","returns":{"_0":"Contract of the bridge on the other network."}},"bridgeERC20(address,address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of local tokens to deposit.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_localToken":"Address of the ERC20 on this chain.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_remoteToken":"Address of the corresponding token on the remote chain."}},"bridgeERC20To(address,address,address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of local tokens to deposit.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_localToken":"Address of the ERC20 on this chain.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_remoteToken":"Address of the corresponding token on the remote chain.","_to":"Address of the receiver."}},"bridgeETH(uint32,bytes)":{"params":{"_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with."}},"bridgeETHTo(address,uint32,bytes)":{"params":{"_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_to":"Address of the receiver."}},"depositERC20(address,address,uint256,uint32,bytes)":{"custom:legacy":"@notice Deposits some amount of ERC20 tokens into the sender's account on L2.","params":{"_amount":"Amount of the ERC20 to deposit.","_extraData":"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.","_l1Token":"Address of the L1 token being deposited.","_l2Token":"Address of the corresponding token on L2.","_minGasLimit":"Minimum gas limit for the deposit message on L2."}},"depositERC20To(address,address,address,uint256,uint32,bytes)":{"custom:legacy":"@notice Deposits some amount of ERC20 tokens into a target account on L2.","params":{"_amount":"Amount of the ERC20 to deposit.","_extraData":"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.","_l1Token":"Address of the L1 token being deposited.","_l2Token":"Address of the corresponding token on L2.","_minGasLimit":"Minimum gas limit for the deposit message on L2.","_to":"Address of the recipient on L2."}},"depositETH(uint32,bytes)":{"custom:legacy":"@notice Deposits some amount of ETH into the sender's account on L2.","params":{"_extraData":"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.","_minGasLimit":"Minimum gas limit for the deposit message on L2."}},"depositETHTo(address,uint32,bytes)":{"custom:legacy":"@notice Deposits some amount of ETH into a target account on L2. Note that if ETH is sent to a contract on L2 and the call fails, then that ETH will be locked in the L2StandardBridge. ETH may be recoverable if the call can be successfully replayed by increasing the amount of gas supplied to the call. If the call will fail for any amount of gas, then the ETH will be locked permanently.","params":{"_extraData":"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.","_minGasLimit":"Minimum gas limit for the deposit message on L2.","_to":"Address of the recipient on L2."}},"finalizeBridgeERC20(address,address,address,address,uint256,bytes)":{"params":{"_amount":"Amount of the ERC20 being bridged.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_from":"Address of the sender.","_localToken":"Address of the ERC20 on this chain.","_remoteToken":"Address of the corresponding token on the remote chain.","_to":"Address of the receiver."}},"finalizeBridgeETH(address,address,uint256,bytes)":{"params":{"_amount":"Amount of ETH being bridged.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_from":"Address of the sender.","_to":"Address of the receiver."}},"finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)":{"custom:legacy":"@notice Finalizes a withdrawal of ERC20 tokens from L2.","params":{"_amount":"Amount of the ERC20 to withdraw.","_extraData":"Optional data forwarded from L2.","_from":"Address of the withdrawer on L2.","_l1Token":"Address of the token on L1.","_l2Token":"Address of the corresponding token on L2.","_to":"Address of the recipient on L1."}},"finalizeETHWithdrawal(address,address,uint256,bytes)":{"custom:legacy":"@notice Finalizes a withdrawal of ETH from L2.","params":{"_amount":"Amount of ETH to withdraw.","_extraData":"Optional data forwarded from L2.","_from":"Address of the withdrawer on L2.","_to":"Address of the recipient on L1."}},"initialize(address,address)":{"params":{"_messenger":"Contract for the CrossDomainMessenger on this network.","_superchainConfig":"Contract for the SuperchainConfig on this network."}},"l2TokenBridge()":{"custom:legacy":"@notice Retrieves the access of the corresponding L2 bridge contract.","returns":{"_0":"Address of the corresponding L2 bridge contract."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}}},"version":1},"userdoc":{"kind":"user","methods":{"MESSENGER()":{"notice":"Getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead."},"OTHER_BRIDGE()":{"notice":"Getter for the other bridge contract. Public getter is legacy and will be removed in the future. Use `otherBridge` instead."},"bridgeERC20(address,address,uint256,uint32,bytes)":{"notice":"Sends ERC20 tokens to the sender's address on the other chain."},"bridgeERC20To(address,address,address,uint256,uint32,bytes)":{"notice":"Sends ERC20 tokens to a receiver's address on the other chain."},"bridgeETH(uint32,bytes)":{"notice":"Sends ETH to the sender's address on the other chain."},"bridgeETHTo(address,uint32,bytes)":{"notice":"Sends ETH to a receiver's address on the other chain. Note that if ETH is sent to a smart contract and the call fails, the ETH will be temporarily locked in the StandardBridge on the other chain until the call is replayed. If the call cannot be replayed with any amount of gas (call always reverts), then the ETH will be permanently locked in the StandardBridge on the other chain. ETH will also be locked if the receiver is the other bridge, because finalizeBridgeETH will revert in that case."},"constructor":{"notice":"Constructs the L1StandardBridge contract."},"deposits(address,address)":{"notice":"Mapping that stores deposits for a given pair of local and remote tokens."},"finalizeBridgeERC20(address,address,address,address,uint256,bytes)":{"notice":"Finalizes an ERC20 bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain."},"finalizeBridgeETH(address,address,uint256,bytes)":{"notice":"Finalizes an ETH bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain."},"initialize(address,address)":{"notice":"Initializer."},"messenger()":{"notice":"Messenger contract on this domain."},"otherBridge()":{"notice":"Corresponding bridge on the other domain."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."},"superchainConfig()":{"notice":"Address of the SuperchainConfig contract."},"version()":{"notice":"Semantic version."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L1/L1StandardBridge.sol":"L1StandardBridge"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66","urls":["bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f","dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"keccak256":"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238","urls":["bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0","dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca","urls":["bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd","dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"keccak256":"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329","urls":["bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95","dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29","urls":["bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6","dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"keccak256":"0xc65c83c1039508fa7a42a09a3c6a32babd1c438ba4dbb23581255e784b5d5eed","urls":["bzz-raw://a1b3b38db0f76429db899909025e534c366415e9ea8b5ddc4c8901e6a7fc1461","dweb:/ipfs/QmYv1KxyHjLEky9JWNSsSfpGJbiCxFyzVFgTwQKpiqYGUg"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1","urls":["bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f","dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0","urls":["bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929","dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7","urls":["bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689","dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy"],"license":"MIT"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d","urls":["bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c","dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8"],"license":"MIT"},"src/L1/L1StandardBridge.sol":{"keccak256":"0x2fdc6f6f464a24344847c81d394f502d000cd722f7ff21fa21104b5f7e392633","urls":["bzz-raw://393fd96446ab8fce3bb7d1134e6ff847bf9940e0eaa199accf01118c3917367f","dweb:/ipfs/QmX36camDYHu7pVzdjnfprinxPpZnjJehZXUKTyUdezKRK"],"license":"MIT"},"src/L1/ResourceMetering.sol":{"keccak256":"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408","urls":["bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409","dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM"],"license":"MIT"},"src/L1/SuperchainConfig.sol":{"keccak256":"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d","urls":["bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f","dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB"],"license":"MIT"},"src/libraries/Arithmetic.sol":{"keccak256":"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db","urls":["bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72","dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq"],"license":"MIT"},"src/libraries/Burn.sol":{"keccak256":"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010","urls":["bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f","dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"],"license":"MIT"},"src/libraries/Constants.sol":{"keccak256":"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132","urls":["bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b","dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp"],"license":"MIT"},"src/libraries/Encoding.sol":{"keccak256":"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87","urls":["bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff","dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA"],"license":"MIT"},"src/libraries/Hashing.sol":{"keccak256":"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8","urls":["bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12","dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF"],"license":"MIT"},"src/libraries/Predeploys.sol":{"keccak256":"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02","urls":["bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663","dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe"],"license":"MIT"},"src/libraries/SafeCall.sol":{"keccak256":"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f","urls":["bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a","dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq"],"license":"MIT"},"src/libraries/Storage.sol":{"keccak256":"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f","urls":["bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269","dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK"],"license":"MIT"},"src/libraries/Types.sol":{"keccak256":"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4","urls":["bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e","dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"],"license":"MIT"},"src/libraries/rlp/RLPWriter.sol":{"keccak256":"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6","urls":["bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b","dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV"],"license":"MIT"},"src/universal/CrossDomainMessenger.sol":{"keccak256":"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0","urls":["bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1","dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n"],"license":"MIT"},"src/universal/IOptimismMintableERC20.sol":{"keccak256":"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c","urls":["bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf","dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"},"src/universal/OptimismMintableERC20.sol":{"keccak256":"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df","urls":["bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7","dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa"],"license":"MIT"},"src/universal/StandardBridge.sol":{"keccak256":"0x1a2f6afd7f14430ae2b797e09497c3dc860ed5db752e1847e30649668060c01d","urls":["bzz-raw://fefe1356cdeb5b324e4e63e1c723c08f9e244ef2ef133b9f5df0cc0d180eeaa8","dweb:/ipfs/QmZzR3zWKodwdwrdWwXUyh7G3qcFn2cjUQLrE45gRyQMn3"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":49534,"contract":"src/L1/L1StandardBridge.sol:L1StandardBridge","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":49537,"contract":"src/L1/L1StandardBridge.sol:L1StandardBridge","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":110944,"contract":"src/L1/L1StandardBridge.sol:L1StandardBridge","label":"spacer_0_2_30","offset":2,"slot":"0","type":"t_bytes30"},{"astId":110947,"contract":"src/L1/L1StandardBridge.sol:L1StandardBridge","label":"spacer_1_0_20","offset":0,"slot":"1","type":"t_address"},{"astId":110954,"contract":"src/L1/L1StandardBridge.sol:L1StandardBridge","label":"deposits","offset":0,"slot":"2","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))"},{"astId":110958,"contract":"src/L1/L1StandardBridge.sol:L1StandardBridge","label":"messenger","offset":0,"slot":"3","type":"t_contract(CrossDomainMessenger)108888"},{"astId":110962,"contract":"src/L1/L1StandardBridge.sol:L1StandardBridge","label":"otherBridge","offset":0,"slot":"4","type":"t_contract(StandardBridge)111675"},{"astId":110967,"contract":"src/L1/L1StandardBridge.sol:L1StandardBridge","label":"__gap","offset":0,"slot":"5","type":"t_array(t_uint256)45_storage"},{"astId":85497,"contract":"src/L1/L1StandardBridge.sol:L1StandardBridge","label":"superchainConfig","offset":0,"slot":"50","type":"t_contract(SuperchainConfig)88793"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_uint256)45_storage":{"encoding":"inplace","label":"uint256[45]","numberOfBytes":"1440","base":"t_uint256"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes30":{"encoding":"inplace","label":"bytes30","numberOfBytes":"30"},"t_contract(CrossDomainMessenger)108888":{"encoding":"inplace","label":"contract CrossDomainMessenger","numberOfBytes":"20"},"t_contract(StandardBridge)111675":{"encoding":"inplace","label":"contract StandardBridge","numberOfBytes":"20"},"t_contract(SuperchainConfig)88793":{"encoding":"inplace","label":"contract SuperchainConfig","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"version":1,"kind":"user","methods":{"MESSENGER()":{"notice":"Getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead."},"OTHER_BRIDGE()":{"notice":"Getter for the other bridge contract. Public getter is legacy and will be removed in the future. Use `otherBridge` instead."},"bridgeERC20(address,address,uint256,uint32,bytes)":{"notice":"Sends ERC20 tokens to the sender's address on the other chain."},"bridgeERC20To(address,address,address,uint256,uint32,bytes)":{"notice":"Sends ERC20 tokens to a receiver's address on the other chain."},"bridgeETH(uint32,bytes)":{"notice":"Sends ETH to the sender's address on the other chain."},"bridgeETHTo(address,uint32,bytes)":{"notice":"Sends ETH to a receiver's address on the other chain. Note that if ETH is sent to a smart contract and the call fails, the ETH will be temporarily locked in the StandardBridge on the other chain until the call is replayed. If the call cannot be replayed with any amount of gas (call always reverts), then the ETH will be permanently locked in the StandardBridge on the other chain. ETH will also be locked if the receiver is the other bridge, because finalizeBridgeETH will revert in that case."},"constructor":{"notice":"Constructs the L1StandardBridge contract."},"deposits(address,address)":{"notice":"Mapping that stores deposits for a given pair of local and remote tokens."},"finalizeBridgeERC20(address,address,address,address,uint256,bytes)":{"notice":"Finalizes an ERC20 bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain."},"finalizeBridgeETH(address,address,uint256,bytes)":{"notice":"Finalizes an ETH bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain."},"initialize(address,address)":{"notice":"Initializer."},"messenger()":{"notice":"Messenger contract on this domain."},"otherBridge()":{"notice":"Corresponding bridge on the other domain."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."},"superchainConfig()":{"notice":"Address of the SuperchainConfig contract."},"version()":{"notice":"Semantic version."}},"events":{"ERC20BridgeFinalized(address,address,address,address,uint256,bytes)":{"notice":"Emitted when an ERC20 bridge is finalized on this chain."},"ERC20BridgeInitiated(address,address,address,address,uint256,bytes)":{"notice":"Emitted when an ERC20 bridge is initiated to the other chain."},"ETHBridgeFinalized(address,address,uint256,bytes)":{"notice":"Emitted when an ETH bridge is finalized on this chain."},"ETHBridgeInitiated(address,address,uint256,bytes)":{"notice":"Emitted when an ETH bridge is initiated to the other chain."}},"notice":"The L1StandardBridge is responsible for transfering ETH and ERC20 tokens between L1 and L2. In the case that an ERC20 token is native to L1, it will be escrowed within this contract. If the ERC20 token is native to L2, it will be burnt. Before Bedrock, ETH was stored within this contract. After Bedrock, ETH is instead stored inside the OptimismPortal contract. NOTE: this contract is not intended to support all variations of ERC20 tokens. Examples of some token types that may not be properly supported by this contract include, but are not limited to: tokens with transfer fees, rebasing tokens, and tokens with blocklists."},"devdoc":{"version":1,"kind":"dev","methods":{"MESSENGER()":{"returns":{"_0":"Contract of the messenger on this domain."}},"OTHER_BRIDGE()":{"returns":{"_0":"Contract of the bridge on the other network."}},"bridgeERC20(address,address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of local tokens to deposit.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_localToken":"Address of the ERC20 on this chain.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_remoteToken":"Address of the corresponding token on the remote chain."}},"bridgeERC20To(address,address,address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of local tokens to deposit.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_localToken":"Address of the ERC20 on this chain.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_remoteToken":"Address of the corresponding token on the remote chain.","_to":"Address of the receiver."}},"bridgeETH(uint32,bytes)":{"params":{"_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with."}},"bridgeETHTo(address,uint32,bytes)":{"params":{"_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_to":"Address of the receiver."}},"depositERC20(address,address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of the ERC20 to deposit.","_extraData":"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.","_l1Token":"Address of the L1 token being deposited.","_l2Token":"Address of the corresponding token on L2.","_minGasLimit":"Minimum gas limit for the deposit message on L2."}},"depositERC20To(address,address,address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of the ERC20 to deposit.","_extraData":"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.","_l1Token":"Address of the L1 token being deposited.","_l2Token":"Address of the corresponding token on L2.","_minGasLimit":"Minimum gas limit for the deposit message on L2.","_to":"Address of the recipient on L2."}},"depositETH(uint32,bytes)":{"params":{"_extraData":"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.","_minGasLimit":"Minimum gas limit for the deposit message on L2."}},"depositETHTo(address,uint32,bytes)":{"params":{"_extraData":"Optional data to forward to L2. Data supplied here will not be used to execute any code on L2 and is only emitted as extra data for the convenience of off-chain tooling.","_minGasLimit":"Minimum gas limit for the deposit message on L2.","_to":"Address of the recipient on L2."}},"finalizeBridgeERC20(address,address,address,address,uint256,bytes)":{"params":{"_amount":"Amount of the ERC20 being bridged.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_from":"Address of the sender.","_localToken":"Address of the ERC20 on this chain.","_remoteToken":"Address of the corresponding token on the remote chain.","_to":"Address of the receiver."}},"finalizeBridgeETH(address,address,uint256,bytes)":{"params":{"_amount":"Amount of ETH being bridged.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_from":"Address of the sender.","_to":"Address of the receiver."}},"finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)":{"params":{"_amount":"Amount of the ERC20 to withdraw.","_extraData":"Optional data forwarded from L2.","_from":"Address of the withdrawer on L2.","_l1Token":"Address of the token on L1.","_l2Token":"Address of the corresponding token on L2.","_to":"Address of the recipient on L1."}},"finalizeETHWithdrawal(address,address,uint256,bytes)":{"params":{"_amount":"Amount of ETH to withdraw.","_extraData":"Optional data forwarded from L2.","_from":"Address of the withdrawer on L2.","_to":"Address of the recipient on L1."}},"initialize(address,address)":{"params":{"_messenger":"Contract for the CrossDomainMessenger on this network.","_superchainConfig":"Contract for the SuperchainConfig on this network."}},"l2TokenBridge()":{"returns":{"_0":"Address of the corresponding L2 bridge contract."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}}},"events":{"ERC20DepositInitiated(address,address,address,address,uint256,bytes)":{"params":{"amount":"Amount of the ERC20 deposited.","extraData":"Extra data attached to the deposit.","from":"Address of the depositor.","l1Token":"Address of the token on L1.","l2Token":"Address of the corresponding token on L2.","to":"Address of the recipient on L2."}},"ERC20WithdrawalFinalized(address,address,address,address,uint256,bytes)":{"params":{"amount":"Amount of the ERC20 withdrawn.","extraData":"Extra data attached to the withdrawal.","from":"Address of the withdrawer.","l1Token":"Address of the token on L1.","l2Token":"Address of the corresponding token on L2.","to":"Address of the recipient on L1."}},"ETHDepositInitiated(address,address,uint256,bytes)":{"params":{"amount":"Amount of ETH deposited.","extraData":"Extra data attached to the deposit.","from":"Address of the depositor.","to":"Address of the recipient on L2."}},"ETHWithdrawalFinalized(address,address,uint256,bytes)":{"params":{"amount":"Amount of ETH withdrawn.","extraData":"Extra data attached to the withdrawal.","from":"Address of the withdrawer.","to":"Address of the recipient on L1."}}}},"ast":{"absolutePath":"src/L1/L1StandardBridge.sol","id":85922,"exportedSymbols":{"Constants":[103096],"CrossDomainMessenger":[108888],"ISemver":[109417],"L1StandardBridge":[85921],"Predeploys":[104124],"StandardBridge":[111675],"SuperchainConfig":[88793]},"nodeType":"SourceUnit","src":"32:13868:132","nodes":[{"id":85420,"nodeType":"PragmaDirective","src":"32:23:132","nodes":[],"literals":["solidity","0.8",".15"]},{"id":85422,"nodeType":"ImportDirective","src":"57:58:132","nodes":[],"absolutePath":"src/libraries/Predeploys.sol","file":"src/libraries/Predeploys.sol","nameLocation":"-1:-1:-1","scope":85922,"sourceUnit":104125,"symbolAliases":[{"foreign":{"id":85421,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"66:10:132","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85424,"nodeType":"ImportDirective","src":"116:66:132","nodes":[],"absolutePath":"src/universal/StandardBridge.sol","file":"src/universal/StandardBridge.sol","nameLocation":"-1:-1:-1","scope":85922,"sourceUnit":111676,"symbolAliases":[{"foreign":{"id":85423,"name":"StandardBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111675,"src":"125:14:132","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85426,"nodeType":"ImportDirective","src":"183:52:132","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":85922,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":85425,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"192:7:132","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85428,"nodeType":"ImportDirective","src":"236:78:132","nodes":[],"absolutePath":"src/universal/CrossDomainMessenger.sol","file":"src/universal/CrossDomainMessenger.sol","nameLocation":"-1:-1:-1","scope":85922,"sourceUnit":108889,"symbolAliases":[{"foreign":{"id":85427,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"245:20:132","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85430,"nodeType":"ImportDirective","src":"315:63:132","nodes":[],"absolutePath":"src/L1/SuperchainConfig.sol","file":"src/L1/SuperchainConfig.sol","nameLocation":"-1:-1:-1","scope":85922,"sourceUnit":88794,"symbolAliases":[{"foreign":{"id":85429,"name":"SuperchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88793,"src":"324:16:132","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85432,"nodeType":"ImportDirective","src":"379:56:132","nodes":[],"absolutePath":"src/libraries/Constants.sol","file":"src/libraries/Constants.sol","nameLocation":"-1:-1:-1","scope":85922,"sourceUnit":103097,"symbolAliases":[{"foreign":{"id":85431,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"388:9:132","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85921,"nodeType":"ContractDefinition","src":"1209:12690:132","nodes":[{"id":85448,"nodeType":"EventDefinition","src":"1590:101:132","nodes":[],"anonymous":false,"documentation":{"id":85438,"nodeType":"StructuredDocumentation","src":"1268:317:132","text":"@custom:legacy\n @notice Emitted whenever a deposit of ETH from L1 into L2 is initiated.\n @param from Address of the depositor.\n @param to Address of the recipient on L2.\n @param amount Amount of ETH deposited.\n @param extraData Extra data attached to the deposit."},"eventSelector":"35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23","name":"ETHDepositInitiated","nameLocation":"1596:19:132","parameters":{"id":85447,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85440,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"1632:4:132","nodeType":"VariableDeclaration","scope":85448,"src":"1616:20:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85439,"name":"address","nodeType":"ElementaryTypeName","src":"1616:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85442,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"1654:2:132","nodeType":"VariableDeclaration","scope":85448,"src":"1638:18:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85441,"name":"address","nodeType":"ElementaryTypeName","src":"1638:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85444,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"1666:6:132","nodeType":"VariableDeclaration","scope":85448,"src":"1658:14:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85443,"name":"uint256","nodeType":"ElementaryTypeName","src":"1658:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85446,"indexed":false,"mutability":"mutable","name":"extraData","nameLocation":"1680:9:132","nodeType":"VariableDeclaration","scope":85448,"src":"1674:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85445,"name":"bytes","nodeType":"ElementaryTypeName","src":"1674:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1615:75:132"}},{"id":85459,"nodeType":"EventDefinition","src":"2024:104:132","nodes":[],"anonymous":false,"documentation":{"id":85449,"nodeType":"StructuredDocumentation","src":"1697:322:132","text":"@custom:legacy\n @notice Emitted whenever a withdrawal of ETH from L2 to L1 is finalized.\n @param from Address of the withdrawer.\n @param to Address of the recipient on L1.\n @param amount Amount of ETH withdrawn.\n @param extraData Extra data attached to the withdrawal."},"eventSelector":"2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631","name":"ETHWithdrawalFinalized","nameLocation":"2030:22:132","parameters":{"id":85458,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85451,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"2069:4:132","nodeType":"VariableDeclaration","scope":85459,"src":"2053:20:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85450,"name":"address","nodeType":"ElementaryTypeName","src":"2053:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85453,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"2091:2:132","nodeType":"VariableDeclaration","scope":85459,"src":"2075:18:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85452,"name":"address","nodeType":"ElementaryTypeName","src":"2075:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85455,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"2103:6:132","nodeType":"VariableDeclaration","scope":85459,"src":"2095:14:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85454,"name":"uint256","nodeType":"ElementaryTypeName","src":"2095:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85457,"indexed":false,"mutability":"mutable","name":"extraData","nameLocation":"2117:9:132","nodeType":"VariableDeclaration","scope":85459,"src":"2111:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85456,"name":"bytes","nodeType":"ElementaryTypeName","src":"2111:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2052:75:132"}},{"id":85474,"nodeType":"EventDefinition","src":"2566:199:132","nodes":[],"anonymous":false,"documentation":{"id":85460,"nodeType":"StructuredDocumentation","src":"2134:427:132","text":"@custom:legacy\n @notice Emitted whenever an ERC20 deposit is initiated.\n @param l1Token Address of the token on L1.\n @param l2Token Address of the corresponding token on L2.\n @param from Address of the depositor.\n @param to Address of the recipient on L2.\n @param amount Amount of the ERC20 deposited.\n @param extraData Extra data attached to the deposit."},"eventSelector":"718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396","name":"ERC20DepositInitiated","nameLocation":"2572:21:132","parameters":{"id":85473,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85462,"indexed":true,"mutability":"mutable","name":"l1Token","nameLocation":"2619:7:132","nodeType":"VariableDeclaration","scope":85474,"src":"2603:23:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85461,"name":"address","nodeType":"ElementaryTypeName","src":"2603:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85464,"indexed":true,"mutability":"mutable","name":"l2Token","nameLocation":"2652:7:132","nodeType":"VariableDeclaration","scope":85474,"src":"2636:23:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85463,"name":"address","nodeType":"ElementaryTypeName","src":"2636:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85466,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"2685:4:132","nodeType":"VariableDeclaration","scope":85474,"src":"2669:20:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85465,"name":"address","nodeType":"ElementaryTypeName","src":"2669:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85468,"indexed":false,"mutability":"mutable","name":"to","nameLocation":"2707:2:132","nodeType":"VariableDeclaration","scope":85474,"src":"2699:10:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85467,"name":"address","nodeType":"ElementaryTypeName","src":"2699:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85470,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"2727:6:132","nodeType":"VariableDeclaration","scope":85474,"src":"2719:14:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85469,"name":"uint256","nodeType":"ElementaryTypeName","src":"2719:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85472,"indexed":false,"mutability":"mutable","name":"extraData","nameLocation":"2749:9:132","nodeType":"VariableDeclaration","scope":85474,"src":"2743:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85471,"name":"bytes","nodeType":"ElementaryTypeName","src":"2743:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2593:171:132"}},{"id":85489,"nodeType":"EventDefinition","src":"3210:202:132","nodes":[],"anonymous":false,"documentation":{"id":85475,"nodeType":"StructuredDocumentation","src":"2771:434:132","text":"@custom:legacy\n @notice Emitted whenever an ERC20 withdrawal is finalized.\n @param l1Token Address of the token on L1.\n @param l2Token Address of the corresponding token on L2.\n @param from Address of the withdrawer.\n @param to Address of the recipient on L1.\n @param amount Amount of the ERC20 withdrawn.\n @param extraData Extra data attached to the withdrawal."},"eventSelector":"3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3","name":"ERC20WithdrawalFinalized","nameLocation":"3216:24:132","parameters":{"id":85488,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85477,"indexed":true,"mutability":"mutable","name":"l1Token","nameLocation":"3266:7:132","nodeType":"VariableDeclaration","scope":85489,"src":"3250:23:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85476,"name":"address","nodeType":"ElementaryTypeName","src":"3250:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85479,"indexed":true,"mutability":"mutable","name":"l2Token","nameLocation":"3299:7:132","nodeType":"VariableDeclaration","scope":85489,"src":"3283:23:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85478,"name":"address","nodeType":"ElementaryTypeName","src":"3283:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85481,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"3332:4:132","nodeType":"VariableDeclaration","scope":85489,"src":"3316:20:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85480,"name":"address","nodeType":"ElementaryTypeName","src":"3316:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85483,"indexed":false,"mutability":"mutable","name":"to","nameLocation":"3354:2:132","nodeType":"VariableDeclaration","scope":85489,"src":"3346:10:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85482,"name":"address","nodeType":"ElementaryTypeName","src":"3346:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85485,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"3374:6:132","nodeType":"VariableDeclaration","scope":85489,"src":"3366:14:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85484,"name":"uint256","nodeType":"ElementaryTypeName","src":"3366:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85487,"indexed":false,"mutability":"mutable","name":"extraData","nameLocation":"3396:9:132","nodeType":"VariableDeclaration","scope":85489,"src":"3390:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85486,"name":"bytes","nodeType":"ElementaryTypeName","src":"3390:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3240:171:132"}},{"id":85493,"nodeType":"VariableDeclaration","src":"3481:40:132","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":85490,"nodeType":"StructuredDocumentation","src":"3418:58:132","text":"@notice Semantic version.\n @custom:semver 2.1.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"3504:7:132","scope":85921,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":85491,"name":"string","nodeType":"ElementaryTypeName","src":"3481:6:132","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"322e312e30","id":85492,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3514:7:132","typeDescriptions":{"typeIdentifier":"t_stringliteral_3bb4aeded157fe72f9bc813a9dc1bd69961c5b5f35dafc6dc601ab742eacac6b","typeString":"literal_string \"2.1.0\""},"value":"2.1.0"},"visibility":"public"},{"id":85497,"nodeType":"VariableDeclaration","src":"3586:40:132","nodes":[],"constant":false,"documentation":{"id":85494,"nodeType":"StructuredDocumentation","src":"3528:53:132","text":"@notice Address of the SuperchainConfig contract."},"functionSelector":"35e80ab3","mutability":"mutable","name":"superchainConfig","nameLocation":"3610:16:132","scope":85921,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},"typeName":{"id":85496,"nodeType":"UserDefinedTypeName","pathNode":{"id":85495,"name":"SuperchainConfig","nodeType":"IdentifierPath","referencedDeclaration":88793,"src":"3586:16:132"},"referencedDeclaration":88793,"src":"3586:16:132","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"visibility":"public"},{"id":85519,"nodeType":"FunctionDefinition","src":"3691:157:132","nodes":[],"body":{"id":85518,"nodeType":"Block","src":"3722:126:132","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30","id":85507,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3786:1:132","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":85506,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3778:7:132","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85505,"name":"address","nodeType":"ElementaryTypeName","src":"3778:7:132","typeDescriptions":{}}},"id":85508,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3778:10:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":85504,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"3757:20:132","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CrossDomainMessenger_$108888_$","typeString":"type(contract CrossDomainMessenger)"}},"id":85509,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3757:32:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},{"arguments":[{"arguments":[{"hexValue":"30","id":85513,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3835:1:132","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":85512,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3827:7:132","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85511,"name":"address","nodeType":"ElementaryTypeName","src":"3827:7:132","typeDescriptions":{}}},"id":85514,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3827:10:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":85510,"name":"SuperchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88793,"src":"3810:16:132","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SuperchainConfig_$88793_$","typeString":"type(contract SuperchainConfig)"}},"id":85515,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3810:28:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"},{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}],"id":85503,"name":"initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85547,"src":"3732:10:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_CrossDomainMessenger_$108888_$_t_contract$_SuperchainConfig_$88793_$returns$__$","typeString":"function (contract CrossDomainMessenger,contract SuperchainConfig)"}},"id":85516,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_messenger","_superchainConfig"],"nodeType":"FunctionCall","src":"3732:109:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85517,"nodeType":"ExpressionStatement","src":"3732:109:132"}]},"documentation":{"id":85498,"nodeType":"StructuredDocumentation","src":"3633:53:132","text":"@notice Constructs the L1StandardBridge contract."},"implemented":true,"kind":"constructor","modifiers":[{"arguments":[],"id":85501,"kind":"baseConstructorSpecifier","modifierName":{"id":85500,"name":"StandardBridge","nodeType":"IdentifierPath","referencedDeclaration":111675,"src":"3705:14:132"},"nodeType":"ModifierInvocation","src":"3705:16:132"}],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":85499,"nodeType":"ParameterList","parameters":[],"src":"3702:2:132"},"returnParameters":{"id":85502,"nodeType":"ParameterList","parameters":[],"src":"3722:0:132"},"scope":85921,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":85547,"nodeType":"FunctionDefinition","src":"4055:322:132","nodes":[],"body":{"id":85546,"nodeType":"Block","src":"4163:214:132","nodes":[],"statements":[{"expression":{"id":85533,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":85531,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85497,"src":"4173:16:132","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":85532,"name":"_superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85526,"src":"4192:17:132","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"src":"4173:36:132","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":85534,"nodeType":"ExpressionStatement","src":"4173:36:132"},{"expression":{"arguments":[{"id":85536,"name":"_messenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85523,"src":"4267:10:132","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},{"arguments":[{"arguments":[{"expression":{"id":85540,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"4328:10:132","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":85541,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L2_STANDARD_BRIDGE","nodeType":"MemberAccess","referencedDeclaration":104008,"src":"4328:29:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":85539,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4320:8:132","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":85538,"name":"address","nodeType":"ElementaryTypeName","src":"4320:8:132","stateMutability":"payable","typeDescriptions":{}}},"id":85542,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4320:38:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":85537,"name":"StandardBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111675,"src":"4305:14:132","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StandardBridge_$111675_$","typeString":"type(contract StandardBridge)"}},"id":85543,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4305:54:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"},{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}],"id":85535,"name":"__StandardBridge_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111080,"src":"4219:21:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_CrossDomainMessenger_$108888_$_t_contract$_StandardBridge_$111675_$returns$__$","typeString":"function (contract CrossDomainMessenger,contract StandardBridge)"}},"id":85544,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_messenger","_otherBridge"],"nodeType":"FunctionCall","src":"4219:151:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85545,"nodeType":"ExpressionStatement","src":"4219:151:132"}]},"documentation":{"id":85520,"nodeType":"StructuredDocumentation","src":"3854:196:132","text":"@notice Initializer.\n @param _messenger Contract for the CrossDomainMessenger on this network.\n @param _superchainConfig Contract for the SuperchainConfig on this network."},"functionSelector":"485cc955","implemented":true,"kind":"function","modifiers":[{"id":85529,"kind":"modifierInvocation","modifierName":{"id":85528,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":49598,"src":"4151:11:132"},"nodeType":"ModifierInvocation","src":"4151:11:132"}],"name":"initialize","nameLocation":"4064:10:132","parameters":{"id":85527,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85523,"mutability":"mutable","name":"_messenger","nameLocation":"4096:10:132","nodeType":"VariableDeclaration","scope":85547,"src":"4075:31:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"},"typeName":{"id":85522,"nodeType":"UserDefinedTypeName","pathNode":{"id":85521,"name":"CrossDomainMessenger","nodeType":"IdentifierPath","referencedDeclaration":108888,"src":"4075:20:132"},"referencedDeclaration":108888,"src":"4075:20:132","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},"visibility":"internal"},{"constant":false,"id":85526,"mutability":"mutable","name":"_superchainConfig","nameLocation":"4125:17:132","nodeType":"VariableDeclaration","scope":85547,"src":"4108:34:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},"typeName":{"id":85525,"nodeType":"UserDefinedTypeName","pathNode":{"id":85524,"name":"SuperchainConfig","nodeType":"IdentifierPath","referencedDeclaration":88793,"src":"4108:16:132"},"referencedDeclaration":88793,"src":"4108:16:132","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"visibility":"internal"}],"src":"4074:69:132"},"returnParameters":{"id":85530,"nodeType":"ParameterList","parameters":[],"src":"4163:0:132"},"scope":85921,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":85559,"nodeType":"FunctionDefinition","src":"4418:103:132","nodes":[],"body":{"id":85558,"nodeType":"Block","src":"4472:49:132","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":85554,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85497,"src":"4489:16:132","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":85555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paused","nodeType":"MemberAccess","referencedDeclaration":88707,"src":"4489:23:132","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_bool_$","typeString":"function () view external returns (bool)"}},"id":85556,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4489:25:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":85553,"id":85557,"nodeType":"Return","src":"4482:32:132"}]},"baseFunctions":[111113],"documentation":{"id":85548,"nodeType":"StructuredDocumentation","src":"4383:30:132","text":"@inheritdoc StandardBridge"},"functionSelector":"5c975abb","implemented":true,"kind":"function","modifiers":[],"name":"paused","nameLocation":"4427:6:132","overrides":{"id":85550,"nodeType":"OverrideSpecifier","overrides":[],"src":"4448:8:132"},"parameters":{"id":85549,"nodeType":"ParameterList","parameters":[],"src":"4433:2:132"},"returnParameters":{"id":85553,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85552,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":85559,"src":"4466:4:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":85551,"name":"bool","nodeType":"ElementaryTypeName","src":"4466:4:132","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4465:6:132"},"scope":85921,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":85579,"nodeType":"FunctionDefinition","src":"4604:142:132","nodes":[],"body":{"id":85578,"nodeType":"Block","src":"4648:98:132","nodes":[],"statements":[{"expression":{"arguments":[{"expression":{"id":85567,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4678:3:132","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":85568,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4678:10:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":85569,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4690:3:132","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":85570,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4690:10:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85571,"name":"RECEIVE_DEFAULT_GAS_LIMIT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110941,"src":"4702:25:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"arguments":[{"hexValue":"","id":85574,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4735:2:132","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":85573,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4729:5:132","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":85572,"name":"bytes","nodeType":"ElementaryTypeName","src":"4729:5:132","typeDescriptions":{}}},"id":85575,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4729:9:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":85566,"name":"_initiateETHDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85755,"src":"4658:19:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint32,bytes memory)"}},"id":85576,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4658:81:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85577,"nodeType":"ExpressionStatement","src":"4658:81:132"}]},"baseFunctions":[111084],"documentation":{"id":85560,"nodeType":"StructuredDocumentation","src":"4527:72:132","text":"@notice Allows EOAs to bridge ETH by sending directly to the bridge."},"implemented":true,"kind":"receive","modifiers":[{"id":85564,"kind":"modifierInvocation","modifierName":{"id":85563,"name":"onlyEOA","nodeType":"IdentifierPath","referencedDeclaration":111034,"src":"4640:7:132"},"nodeType":"ModifierInvocation","src":"4640:7:132"}],"name":"","nameLocation":"-1:-1:-1","overrides":{"id":85562,"nodeType":"OverrideSpecifier","overrides":[],"src":"4631:8:132"},"parameters":{"id":85561,"nodeType":"ParameterList","parameters":[],"src":"4611:2:132"},"returnParameters":{"id":85565,"nodeType":"ParameterList","parameters":[],"src":"4648:0:132"},"scope":85921,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":85599,"nodeType":"FunctionDefinition","src":"5183:179:132","nodes":[],"body":{"id":85598,"nodeType":"Block","src":"5276:86:132","nodes":[],"statements":[{"expression":{"arguments":[{"expression":{"id":85590,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5306:3:132","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":85591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5306:10:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":85592,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5318:3:132","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":85593,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5318:10:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85594,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85582,"src":"5330:12:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":85595,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85584,"src":"5344:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":85589,"name":"_initiateETHDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85755,"src":"5286:19:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint32,bytes memory)"}},"id":85596,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5286:69:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85597,"nodeType":"ExpressionStatement","src":"5286:69:132"}]},"documentation":{"id":85580,"nodeType":"StructuredDocumentation","src":"4752:426:132","text":"@custom:legacy\n @notice Deposits some amount of ETH into the sender's account on L2.\n @param _minGasLimit Minimum gas limit for the deposit message on L2.\n @param _extraData Optional data to forward to L2.\n Data supplied here will not be used to execute any code on L2 and is\n only emitted as extra data for the convenience of off-chain tooling."},"functionSelector":"b1a1a882","implemented":true,"kind":"function","modifiers":[{"id":85587,"kind":"modifierInvocation","modifierName":{"id":85586,"name":"onlyEOA","nodeType":"IdentifierPath","referencedDeclaration":111034,"src":"5268:7:132"},"nodeType":"ModifierInvocation","src":"5268:7:132"}],"name":"depositETH","nameLocation":"5192:10:132","parameters":{"id":85585,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85582,"mutability":"mutable","name":"_minGasLimit","nameLocation":"5210:12:132","nodeType":"VariableDeclaration","scope":85599,"src":"5203:19:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":85581,"name":"uint32","nodeType":"ElementaryTypeName","src":"5203:6:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":85584,"mutability":"mutable","name":"_extraData","nameLocation":"5239:10:132","nodeType":"VariableDeclaration","scope":85599,"src":"5224:25:132","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":85583,"name":"bytes","nodeType":"ElementaryTypeName","src":"5224:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5202:48:132"},"returnParameters":{"id":85588,"nodeType":"ParameterList","parameters":[],"src":"5276:0:132"},"scope":85921,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":85618,"nodeType":"FunctionDefinition","src":"6242:179:132","nodes":[],"body":{"id":85617,"nodeType":"Block","src":"6342:79:132","nodes":[],"statements":[{"expression":{"arguments":[{"expression":{"id":85610,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"6372:3:132","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":85611,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"6372:10:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85612,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85602,"src":"6384:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85613,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85604,"src":"6389:12:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":85614,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85606,"src":"6403:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":85609,"name":"_initiateETHDeposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85755,"src":"6352:19:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint32,bytes memory)"}},"id":85615,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6352:62:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85616,"nodeType":"ExpressionStatement","src":"6352:62:132"}]},"documentation":{"id":85600,"nodeType":"StructuredDocumentation","src":"5368:869:132","text":"@custom:legacy\n @notice Deposits some amount of ETH into a target account on L2.\n Note that if ETH is sent to a contract on L2 and the call fails, then that ETH will\n be locked in the L2StandardBridge. ETH may be recoverable if the call can be\n successfully replayed by increasing the amount of gas supplied to the call. If the\n call will fail for any amount of gas, then the ETH will be locked permanently.\n @param _to Address of the recipient on L2.\n @param _minGasLimit Minimum gas limit for the deposit message on L2.\n @param _extraData Optional data to forward to L2.\n Data supplied here will not be used to execute any code on L2 and is\n only emitted as extra data for the convenience of off-chain tooling."},"functionSelector":"9a2ac6d5","implemented":true,"kind":"function","modifiers":[],"name":"depositETHTo","nameLocation":"6251:12:132","parameters":{"id":85607,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85602,"mutability":"mutable","name":"_to","nameLocation":"6272:3:132","nodeType":"VariableDeclaration","scope":85618,"src":"6264:11:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85601,"name":"address","nodeType":"ElementaryTypeName","src":"6264:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85604,"mutability":"mutable","name":"_minGasLimit","nameLocation":"6284:12:132","nodeType":"VariableDeclaration","scope":85618,"src":"6277:19:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":85603,"name":"uint32","nodeType":"ElementaryTypeName","src":"6277:6:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":85606,"mutability":"mutable","name":"_extraData","nameLocation":"6313:10:132","nodeType":"VariableDeclaration","scope":85618,"src":"6298:25:132","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":85605,"name":"bytes","nodeType":"ElementaryTypeName","src":"6298:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6263:61:132"},"returnParameters":{"id":85608,"nodeType":"ParameterList","parameters":[],"src":"6342:0:132"},"scope":85921,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":85647,"nodeType":"FunctionDefinition","src":"7066:339:132","nodes":[],"body":{"id":85646,"nodeType":"Block","src":"7288:117:132","nodes":[],"statements":[{"expression":{"arguments":[{"id":85635,"name":"_l1Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85621,"src":"7320:8:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85636,"name":"_l2Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85623,"src":"7330:8:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":85637,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"7340:3:132","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":85638,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"7340:10:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":85639,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"7352:3:132","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":85640,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"7352:10:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85641,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85625,"src":"7364:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85642,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85627,"src":"7373:12:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":85643,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85629,"src":"7387:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":85634,"name":"_initiateERC20Deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85784,"src":"7298:21:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,uint32,bytes memory)"}},"id":85644,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7298:100:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85645,"nodeType":"ExpressionStatement","src":"7298:100:132"}]},"documentation":{"id":85619,"nodeType":"StructuredDocumentation","src":"6427:634:132","text":"@custom:legacy\n @notice Deposits some amount of ERC20 tokens into the sender's account on L2.\n @param _l1Token Address of the L1 token being deposited.\n @param _l2Token Address of the corresponding token on L2.\n @param _amount Amount of the ERC20 to deposit.\n @param _minGasLimit Minimum gas limit for the deposit message on L2.\n @param _extraData Optional data to forward to L2.\n Data supplied here will not be used to execute any code on L2 and is\n only emitted as extra data for the convenience of off-chain tooling."},"functionSelector":"58a997f6","implemented":true,"kind":"function","modifiers":[{"id":85632,"kind":"modifierInvocation","modifierName":{"id":85631,"name":"onlyEOA","nodeType":"IdentifierPath","referencedDeclaration":111034,"src":"7276:7:132"},"nodeType":"ModifierInvocation","src":"7276:7:132"}],"name":"depositERC20","nameLocation":"7075:12:132","parameters":{"id":85630,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85621,"mutability":"mutable","name":"_l1Token","nameLocation":"7105:8:132","nodeType":"VariableDeclaration","scope":85647,"src":"7097:16:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85620,"name":"address","nodeType":"ElementaryTypeName","src":"7097:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85623,"mutability":"mutable","name":"_l2Token","nameLocation":"7131:8:132","nodeType":"VariableDeclaration","scope":85647,"src":"7123:16:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85622,"name":"address","nodeType":"ElementaryTypeName","src":"7123:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85625,"mutability":"mutable","name":"_amount","nameLocation":"7157:7:132","nodeType":"VariableDeclaration","scope":85647,"src":"7149:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85624,"name":"uint256","nodeType":"ElementaryTypeName","src":"7149:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85627,"mutability":"mutable","name":"_minGasLimit","nameLocation":"7181:12:132","nodeType":"VariableDeclaration","scope":85647,"src":"7174:19:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":85626,"name":"uint32","nodeType":"ElementaryTypeName","src":"7174:6:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":85629,"mutability":"mutable","name":"_extraData","nameLocation":"7218:10:132","nodeType":"VariableDeclaration","scope":85647,"src":"7203:25:132","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":85628,"name":"bytes","nodeType":"ElementaryTypeName","src":"7203:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"7087:147:132"},"returnParameters":{"id":85633,"nodeType":"ParameterList","parameters":[],"src":"7288:0:132"},"scope":85921,"stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"id":85675,"nodeType":"FunctionDefinition","src":"8106:339:132","nodes":[],"body":{"id":85674,"nodeType":"Block","src":"8335:110:132","nodes":[],"statements":[{"expression":{"arguments":[{"id":85664,"name":"_l1Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85650,"src":"8367:8:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85665,"name":"_l2Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85652,"src":"8377:8:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":85666,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"8387:3:132","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":85667,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"8387:10:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85668,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85654,"src":"8399:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85669,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85656,"src":"8404:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85670,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85658,"src":"8413:12:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":85671,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85660,"src":"8427:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":85663,"name":"_initiateERC20Deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85784,"src":"8345:21:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,uint32,bytes memory)"}},"id":85672,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8345:93:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85673,"nodeType":"ExpressionStatement","src":"8345:93:132"}]},"documentation":{"id":85648,"nodeType":"StructuredDocumentation","src":"7411:690:132","text":"@custom:legacy\n @notice Deposits some amount of ERC20 tokens into a target account on L2.\n @param _l1Token Address of the L1 token being deposited.\n @param _l2Token Address of the corresponding token on L2.\n @param _to Address of the recipient on L2.\n @param _amount Amount of the ERC20 to deposit.\n @param _minGasLimit Minimum gas limit for the deposit message on L2.\n @param _extraData Optional data to forward to L2.\n Data supplied here will not be used to execute any code on L2 and is\n only emitted as extra data for the convenience of off-chain tooling."},"functionSelector":"838b2520","implemented":true,"kind":"function","modifiers":[],"name":"depositERC20To","nameLocation":"8115:14:132","parameters":{"id":85661,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85650,"mutability":"mutable","name":"_l1Token","nameLocation":"8147:8:132","nodeType":"VariableDeclaration","scope":85675,"src":"8139:16:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85649,"name":"address","nodeType":"ElementaryTypeName","src":"8139:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85652,"mutability":"mutable","name":"_l2Token","nameLocation":"8173:8:132","nodeType":"VariableDeclaration","scope":85675,"src":"8165:16:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85651,"name":"address","nodeType":"ElementaryTypeName","src":"8165:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85654,"mutability":"mutable","name":"_to","nameLocation":"8199:3:132","nodeType":"VariableDeclaration","scope":85675,"src":"8191:11:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85653,"name":"address","nodeType":"ElementaryTypeName","src":"8191:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85656,"mutability":"mutable","name":"_amount","nameLocation":"8220:7:132","nodeType":"VariableDeclaration","scope":85675,"src":"8212:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85655,"name":"uint256","nodeType":"ElementaryTypeName","src":"8212:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85658,"mutability":"mutable","name":"_minGasLimit","nameLocation":"8244:12:132","nodeType":"VariableDeclaration","scope":85675,"src":"8237:19:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":85657,"name":"uint32","nodeType":"ElementaryTypeName","src":"8237:6:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":85660,"mutability":"mutable","name":"_extraData","nameLocation":"8281:10:132","nodeType":"VariableDeclaration","scope":85675,"src":"8266:25:132","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":85659,"name":"bytes","nodeType":"ElementaryTypeName","src":"8266:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8129:168:132"},"returnParameters":{"id":85662,"nodeType":"ParameterList","parameters":[],"src":"8335:0:132"},"scope":85921,"stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"id":85695,"nodeType":"FunctionDefinition","src":"8758:245:132","nodes":[],"body":{"id":85694,"nodeType":"Block","src":"8936:67:132","nodes":[],"statements":[{"expression":{"arguments":[{"id":85688,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85678,"src":"8964:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85689,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85680,"src":"8971:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85690,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85682,"src":"8976:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85691,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85684,"src":"8985:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":85687,"name":"finalizeBridgeETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111287,"src":"8946:17:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes calldata)"}},"id":85692,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8946:50:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85693,"nodeType":"ExpressionStatement","src":"8946:50:132"}]},"documentation":{"id":85676,"nodeType":"StructuredDocumentation","src":"8451:302:132","text":"@custom:legacy\n @notice Finalizes a withdrawal of ETH from L2.\n @param _from Address of the withdrawer on L2.\n @param _to Address of the recipient on L1.\n @param _amount Amount of ETH to withdraw.\n @param _extraData Optional data forwarded from L2."},"functionSelector":"1532ec34","implemented":true,"kind":"function","modifiers":[],"name":"finalizeETHWithdrawal","nameLocation":"8767:21:132","parameters":{"id":85685,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85678,"mutability":"mutable","name":"_from","nameLocation":"8806:5:132","nodeType":"VariableDeclaration","scope":85695,"src":"8798:13:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85677,"name":"address","nodeType":"ElementaryTypeName","src":"8798:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85680,"mutability":"mutable","name":"_to","nameLocation":"8829:3:132","nodeType":"VariableDeclaration","scope":85695,"src":"8821:11:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85679,"name":"address","nodeType":"ElementaryTypeName","src":"8821:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85682,"mutability":"mutable","name":"_amount","nameLocation":"8850:7:132","nodeType":"VariableDeclaration","scope":85695,"src":"8842:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85681,"name":"uint256","nodeType":"ElementaryTypeName","src":"8842:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85684,"mutability":"mutable","name":"_extraData","nameLocation":"8882:10:132","nodeType":"VariableDeclaration","scope":85695,"src":"8867:25:132","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":85683,"name":"bytes","nodeType":"ElementaryTypeName","src":"8867:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8788:110:132"},"returnParameters":{"id":85686,"nodeType":"ParameterList","parameters":[],"src":"8936:0:132"},"scope":85921,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":85721,"nodeType":"FunctionDefinition","src":"9453:305:132","nodes":[],"body":{"id":85720,"nodeType":"Block","src":"9669:89:132","nodes":[],"statements":[{"expression":{"arguments":[{"id":85712,"name":"_l1Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85698,"src":"9699:8:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85713,"name":"_l2Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85700,"src":"9709:8:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85714,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85702,"src":"9719:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85715,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85704,"src":"9726:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85716,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85706,"src":"9731:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85717,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85708,"src":"9740:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":85711,"name":"finalizeBridgeERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111367,"src":"9679:19:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes calldata)"}},"id":85718,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9679:72:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85719,"nodeType":"ExpressionStatement","src":"9679:72:132"}]},"documentation":{"id":85696,"nodeType":"StructuredDocumentation","src":"9009:439:132","text":"@custom:legacy\n @notice Finalizes a withdrawal of ERC20 tokens from L2.\n @param _l1Token Address of the token on L1.\n @param _l2Token Address of the corresponding token on L2.\n @param _from Address of the withdrawer on L2.\n @param _to Address of the recipient on L1.\n @param _amount Amount of the ERC20 to withdraw.\n @param _extraData Optional data forwarded from L2."},"functionSelector":"a9f9e675","implemented":true,"kind":"function","modifiers":[],"name":"finalizeERC20Withdrawal","nameLocation":"9462:23:132","parameters":{"id":85709,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85698,"mutability":"mutable","name":"_l1Token","nameLocation":"9503:8:132","nodeType":"VariableDeclaration","scope":85721,"src":"9495:16:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85697,"name":"address","nodeType":"ElementaryTypeName","src":"9495:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85700,"mutability":"mutable","name":"_l2Token","nameLocation":"9529:8:132","nodeType":"VariableDeclaration","scope":85721,"src":"9521:16:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85699,"name":"address","nodeType":"ElementaryTypeName","src":"9521:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85702,"mutability":"mutable","name":"_from","nameLocation":"9555:5:132","nodeType":"VariableDeclaration","scope":85721,"src":"9547:13:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85701,"name":"address","nodeType":"ElementaryTypeName","src":"9547:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85704,"mutability":"mutable","name":"_to","nameLocation":"9578:3:132","nodeType":"VariableDeclaration","scope":85721,"src":"9570:11:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85703,"name":"address","nodeType":"ElementaryTypeName","src":"9570:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85706,"mutability":"mutable","name":"_amount","nameLocation":"9599:7:132","nodeType":"VariableDeclaration","scope":85721,"src":"9591:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85705,"name":"uint256","nodeType":"ElementaryTypeName","src":"9591:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85708,"mutability":"mutable","name":"_extraData","nameLocation":"9631:10:132","nodeType":"VariableDeclaration","scope":85721,"src":"9616:25:132","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":85707,"name":"bytes","nodeType":"ElementaryTypeName","src":"9616:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9485:162:132"},"returnParameters":{"id":85710,"nodeType":"ParameterList","parameters":[],"src":"9669:0:132"},"scope":85921,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":85733,"nodeType":"FunctionDefinition","src":"9930:101:132","nodes":[],"body":{"id":85732,"nodeType":"Block","src":"9987:44:132","nodes":[],"statements":[{"expression":{"arguments":[{"id":85729,"name":"otherBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110962,"src":"10012:11:132","typeDescriptions":{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}],"id":85728,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10004:7:132","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85727,"name":"address","nodeType":"ElementaryTypeName","src":"10004:7:132","typeDescriptions":{}}},"id":85730,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10004:20:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":85726,"id":85731,"nodeType":"Return","src":"9997:27:132"}]},"documentation":{"id":85722,"nodeType":"StructuredDocumentation","src":"9764:161:132","text":"@custom:legacy\n @notice Retrieves the access of the corresponding L2 bridge contract.\n @return Address of the corresponding L2 bridge contract."},"functionSelector":"91c49bf8","implemented":true,"kind":"function","modifiers":[],"name":"l2TokenBridge","nameLocation":"9939:13:132","parameters":{"id":85723,"nodeType":"ParameterList","parameters":[],"src":"9952:2:132"},"returnParameters":{"id":85726,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85725,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":85733,"src":"9978:7:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85724,"name":"address","nodeType":"ElementaryTypeName","src":"9978:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"9977:9:132"},"scope":85921,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":85755,"nodeType":"FunctionDefinition","src":"10356:196:132","nodes":[],"body":{"id":85754,"nodeType":"Block","src":"10468:84:132","nodes":[],"statements":[{"expression":{"arguments":[{"id":85746,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85736,"src":"10497:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85747,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85738,"src":"10504:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":85748,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"10509:3:132","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":85749,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"10509:9:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85750,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85740,"src":"10520:12:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":85751,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85742,"src":"10534:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":85745,"name":"_initiateBridgeETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111419,"src":"10478:18:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,uint32,bytes memory)"}},"id":85752,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10478:67:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85753,"nodeType":"ExpressionStatement","src":"10478:67:132"}]},"documentation":{"id":85734,"nodeType":"StructuredDocumentation","src":"10037:314:132","text":"@notice Internal function for initiating an ETH deposit.\n @param _from Address of the sender on L1.\n @param _to Address of the recipient on L2.\n @param _minGasLimit Minimum gas limit for the deposit message on L2.\n @param _extraData Optional data to forward to L2."},"implemented":true,"kind":"function","modifiers":[],"name":"_initiateETHDeposit","nameLocation":"10365:19:132","parameters":{"id":85743,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85736,"mutability":"mutable","name":"_from","nameLocation":"10393:5:132","nodeType":"VariableDeclaration","scope":85755,"src":"10385:13:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85735,"name":"address","nodeType":"ElementaryTypeName","src":"10385:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85738,"mutability":"mutable","name":"_to","nameLocation":"10408:3:132","nodeType":"VariableDeclaration","scope":85755,"src":"10400:11:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85737,"name":"address","nodeType":"ElementaryTypeName","src":"10400:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85740,"mutability":"mutable","name":"_minGasLimit","nameLocation":"10420:12:132","nodeType":"VariableDeclaration","scope":85755,"src":"10413:19:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":85739,"name":"uint32","nodeType":"ElementaryTypeName","src":"10413:6:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":85742,"mutability":"mutable","name":"_extraData","nameLocation":"10447:10:132","nodeType":"VariableDeclaration","scope":85755,"src":"10434:23:132","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85741,"name":"bytes","nodeType":"ElementaryTypeName","src":"10434:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"10384:74:132"},"returnParameters":{"id":85744,"nodeType":"ParameterList","parameters":[],"src":"10468:0:132"},"scope":85921,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":85784,"nodeType":"FunctionDefinition","src":"11078:345:132","nodes":[],"body":{"id":85783,"nodeType":"Block","src":"11319:104:132","nodes":[],"statements":[{"expression":{"arguments":[{"id":85774,"name":"_l1Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85758,"src":"11350:8:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85775,"name":"_l2Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85760,"src":"11360:8:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85776,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85762,"src":"11370:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85777,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85764,"src":"11377:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85778,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85766,"src":"11382:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85779,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85768,"src":"11391:12:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":85780,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85770,"src":"11405:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":85773,"name":"_initiateBridgeERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111517,"src":"11329:20:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,uint32,bytes memory)"}},"id":85781,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11329:87:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85782,"nodeType":"ExpressionStatement","src":"11329:87:132"}]},"documentation":{"id":85756,"nodeType":"StructuredDocumentation","src":"10558:515:132","text":"@notice Internal function for initiating an ERC20 deposit.\n @param _l1Token Address of the L1 token being deposited.\n @param _l2Token Address of the corresponding token on L2.\n @param _from Address of the sender on L1.\n @param _to Address of the recipient on L2.\n @param _amount Amount of the ERC20 to deposit.\n @param _minGasLimit Minimum gas limit for the deposit message on L2.\n @param _extraData Optional data to forward to L2."},"implemented":true,"kind":"function","modifiers":[],"name":"_initiateERC20Deposit","nameLocation":"11087:21:132","parameters":{"id":85771,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85758,"mutability":"mutable","name":"_l1Token","nameLocation":"11126:8:132","nodeType":"VariableDeclaration","scope":85784,"src":"11118:16:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85757,"name":"address","nodeType":"ElementaryTypeName","src":"11118:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85760,"mutability":"mutable","name":"_l2Token","nameLocation":"11152:8:132","nodeType":"VariableDeclaration","scope":85784,"src":"11144:16:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85759,"name":"address","nodeType":"ElementaryTypeName","src":"11144:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85762,"mutability":"mutable","name":"_from","nameLocation":"11178:5:132","nodeType":"VariableDeclaration","scope":85784,"src":"11170:13:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85761,"name":"address","nodeType":"ElementaryTypeName","src":"11170:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85764,"mutability":"mutable","name":"_to","nameLocation":"11201:3:132","nodeType":"VariableDeclaration","scope":85784,"src":"11193:11:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85763,"name":"address","nodeType":"ElementaryTypeName","src":"11193:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85766,"mutability":"mutable","name":"_amount","nameLocation":"11222:7:132","nodeType":"VariableDeclaration","scope":85784,"src":"11214:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85765,"name":"uint256","nodeType":"ElementaryTypeName","src":"11214:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85768,"mutability":"mutable","name":"_minGasLimit","nameLocation":"11246:12:132","nodeType":"VariableDeclaration","scope":85784,"src":"11239:19:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":85767,"name":"uint32","nodeType":"ElementaryTypeName","src":"11239:6:132","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":85770,"mutability":"mutable","name":"_extraData","nameLocation":"11281:10:132","nodeType":"VariableDeclaration","scope":85784,"src":"11268:23:132","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85769,"name":"bytes","nodeType":"ElementaryTypeName","src":"11268:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"11108:189:132"},"returnParameters":{"id":85772,"nodeType":"ParameterList","parameters":[],"src":"11319:0:132"},"scope":85921,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":85814,"nodeType":"FunctionDefinition","src":"11651:325:132","nodes":[],"body":{"id":85813,"nodeType":"Block","src":"11830:146:132","nodes":[],"statements":[{"eventCall":{"arguments":[{"id":85798,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85787,"src":"11865:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85799,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85789,"src":"11872:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85800,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85791,"src":"11877:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85801,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85793,"src":"11886:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":85797,"name":"ETHDepositInitiated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85448,"src":"11845:19:132","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes memory)"}},"id":85802,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11845:52:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85803,"nodeType":"EmitStatement","src":"11840:57:132"},{"expression":{"arguments":[{"id":85807,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85787,"src":"11937:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85808,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85789,"src":"11944:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85809,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85791,"src":"11949:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85810,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85793,"src":"11958:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":85804,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"11907:5:132","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_L1StandardBridge_$85921_$","typeString":"type(contract super L1StandardBridge)"}},"id":85806,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_emitETHBridgeInitiated","nodeType":"MemberAccess","referencedDeclaration":111602,"src":"11907:29:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes memory)"}},"id":85811,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11907:62:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85812,"nodeType":"ExpressionStatement","src":"11907:62:132"}]},"baseFunctions":[111602],"documentation":{"id":85785,"nodeType":"StructuredDocumentation","src":"11429:217:132","text":"@inheritdoc StandardBridge\n @notice Emits the legacy ETHDepositInitiated event followed by the ETHBridgeInitiated event.\n This is necessary for backwards compatibility with the legacy bridge."},"implemented":true,"kind":"function","modifiers":[],"name":"_emitETHBridgeInitiated","nameLocation":"11660:23:132","overrides":{"id":85795,"nodeType":"OverrideSpecifier","overrides":[],"src":"11817:8:132"},"parameters":{"id":85794,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85787,"mutability":"mutable","name":"_from","nameLocation":"11701:5:132","nodeType":"VariableDeclaration","scope":85814,"src":"11693:13:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85786,"name":"address","nodeType":"ElementaryTypeName","src":"11693:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85789,"mutability":"mutable","name":"_to","nameLocation":"11724:3:132","nodeType":"VariableDeclaration","scope":85814,"src":"11716:11:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85788,"name":"address","nodeType":"ElementaryTypeName","src":"11716:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85791,"mutability":"mutable","name":"_amount","nameLocation":"11745:7:132","nodeType":"VariableDeclaration","scope":85814,"src":"11737:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85790,"name":"uint256","nodeType":"ElementaryTypeName","src":"11737:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85793,"mutability":"mutable","name":"_extraData","nameLocation":"11775:10:132","nodeType":"VariableDeclaration","scope":85814,"src":"11762:23:132","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85792,"name":"bytes","nodeType":"ElementaryTypeName","src":"11762:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"11683:108:132"},"returnParameters":{"id":85796,"nodeType":"ParameterList","parameters":[],"src":"11830:0:132"},"scope":85921,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":85844,"nodeType":"FunctionDefinition","src":"12208:328:132","nodes":[],"body":{"id":85843,"nodeType":"Block","src":"12387:149:132","nodes":[],"statements":[{"eventCall":{"arguments":[{"id":85828,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85817,"src":"12425:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85829,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85819,"src":"12432:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85830,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85821,"src":"12437:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85831,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85823,"src":"12446:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":85827,"name":"ETHWithdrawalFinalized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85459,"src":"12402:22:132","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes memory)"}},"id":85832,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12402:55:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85833,"nodeType":"EmitStatement","src":"12397:60:132"},{"expression":{"arguments":[{"id":85837,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85817,"src":"12497:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85838,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85819,"src":"12504:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85839,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85821,"src":"12509:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85840,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85823,"src":"12518:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":85834,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"12467:5:132","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_L1StandardBridge_$85921_$","typeString":"type(contract super L1StandardBridge)"}},"id":85836,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_emitETHBridgeFinalized","nodeType":"MemberAccess","referencedDeclaration":111622,"src":"12467:29:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes memory)"}},"id":85841,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12467:62:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85842,"nodeType":"ExpressionStatement","src":"12467:62:132"}]},"baseFunctions":[111622],"documentation":{"id":85815,"nodeType":"StructuredDocumentation","src":"11982:221:132","text":"@inheritdoc StandardBridge\n @notice Emits the legacy ERC20DepositInitiated event followed by the ERC20BridgeInitiated\n event. This is necessary for backwards compatibility with the legacy bridge."},"implemented":true,"kind":"function","modifiers":[],"name":"_emitETHBridgeFinalized","nameLocation":"12217:23:132","overrides":{"id":85825,"nodeType":"OverrideSpecifier","overrides":[],"src":"12374:8:132"},"parameters":{"id":85824,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85817,"mutability":"mutable","name":"_from","nameLocation":"12258:5:132","nodeType":"VariableDeclaration","scope":85844,"src":"12250:13:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85816,"name":"address","nodeType":"ElementaryTypeName","src":"12250:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85819,"mutability":"mutable","name":"_to","nameLocation":"12281:3:132","nodeType":"VariableDeclaration","scope":85844,"src":"12273:11:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85818,"name":"address","nodeType":"ElementaryTypeName","src":"12273:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85821,"mutability":"mutable","name":"_amount","nameLocation":"12302:7:132","nodeType":"VariableDeclaration","scope":85844,"src":"12294:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85820,"name":"uint256","nodeType":"ElementaryTypeName","src":"12294:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85823,"mutability":"mutable","name":"_extraData","nameLocation":"12332:10:132","nodeType":"VariableDeclaration","scope":85844,"src":"12319:23:132","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85822,"name":"bytes","nodeType":"ElementaryTypeName","src":"12319:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"12240:108:132"},"returnParameters":{"id":85826,"nodeType":"ParameterList","parameters":[],"src":"12387:0:132"},"scope":85921,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":85882,"nodeType":"FunctionDefinition","src":"12771:444:132","nodes":[],"body":{"id":85881,"nodeType":"Block","src":"13011:204:132","nodes":[],"statements":[{"eventCall":{"arguments":[{"id":85862,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85847,"src":"13048:11:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85863,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85849,"src":"13061:12:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85864,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85851,"src":"13075:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85865,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85853,"src":"13082:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85866,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85855,"src":"13087:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85867,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85857,"src":"13096:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":85861,"name":"ERC20DepositInitiated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85474,"src":"13026:21:132","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":85868,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13026:81:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85869,"nodeType":"EmitStatement","src":"13021:86:132"},{"expression":{"arguments":[{"id":85873,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85847,"src":"13149:11:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85874,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85849,"src":"13162:12:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85875,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85851,"src":"13176:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85876,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85853,"src":"13183:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85877,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85855,"src":"13188:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85878,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85857,"src":"13197:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":85870,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"13117:5:132","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_L1StandardBridge_$85921_$","typeString":"type(contract super L1StandardBridge)"}},"id":85872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_emitERC20BridgeInitiated","nodeType":"MemberAccess","referencedDeclaration":111648,"src":"13117:31:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":85879,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13117:91:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85880,"nodeType":"ExpressionStatement","src":"13117:91:132"}]},"baseFunctions":[111648],"documentation":{"id":85845,"nodeType":"StructuredDocumentation","src":"12542:224:132","text":"@inheritdoc StandardBridge\n @notice Emits the legacy ERC20WithdrawalFinalized event followed by the ERC20BridgeFinalized\n event. This is necessary for backwards compatibility with the legacy bridge."},"implemented":true,"kind":"function","modifiers":[],"name":"_emitERC20BridgeInitiated","nameLocation":"12780:25:132","overrides":{"id":85859,"nodeType":"OverrideSpecifier","overrides":[],"src":"12998:8:132"},"parameters":{"id":85858,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85847,"mutability":"mutable","name":"_localToken","nameLocation":"12823:11:132","nodeType":"VariableDeclaration","scope":85882,"src":"12815:19:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85846,"name":"address","nodeType":"ElementaryTypeName","src":"12815:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85849,"mutability":"mutable","name":"_remoteToken","nameLocation":"12852:12:132","nodeType":"VariableDeclaration","scope":85882,"src":"12844:20:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85848,"name":"address","nodeType":"ElementaryTypeName","src":"12844:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85851,"mutability":"mutable","name":"_from","nameLocation":"12882:5:132","nodeType":"VariableDeclaration","scope":85882,"src":"12874:13:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85850,"name":"address","nodeType":"ElementaryTypeName","src":"12874:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85853,"mutability":"mutable","name":"_to","nameLocation":"12905:3:132","nodeType":"VariableDeclaration","scope":85882,"src":"12897:11:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85852,"name":"address","nodeType":"ElementaryTypeName","src":"12897:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85855,"mutability":"mutable","name":"_amount","nameLocation":"12926:7:132","nodeType":"VariableDeclaration","scope":85882,"src":"12918:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85854,"name":"uint256","nodeType":"ElementaryTypeName","src":"12918:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85857,"mutability":"mutable","name":"_extraData","nameLocation":"12956:10:132","nodeType":"VariableDeclaration","scope":85882,"src":"12943:23:132","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85856,"name":"bytes","nodeType":"ElementaryTypeName","src":"12943:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"12805:167:132"},"returnParameters":{"id":85860,"nodeType":"ParameterList","parameters":[],"src":"13011:0:132"},"scope":85921,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":85920,"nodeType":"FunctionDefinition","src":"13450:447:132","nodes":[],"body":{"id":85919,"nodeType":"Block","src":"13690:207:132","nodes":[],"statements":[{"eventCall":{"arguments":[{"id":85900,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85885,"src":"13730:11:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85901,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85887,"src":"13743:12:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85902,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85889,"src":"13757:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85903,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85891,"src":"13764:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85904,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85893,"src":"13769:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85905,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85895,"src":"13778:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":85899,"name":"ERC20WithdrawalFinalized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85489,"src":"13705:24:132","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":85906,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13705:84:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85907,"nodeType":"EmitStatement","src":"13700:89:132"},{"expression":{"arguments":[{"id":85911,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85885,"src":"13831:11:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85912,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85887,"src":"13844:12:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85913,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85889,"src":"13858:5:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85914,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85891,"src":"13865:3:132","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":85915,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85893,"src":"13870:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":85916,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85895,"src":"13879:10:132","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":85908,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"13799:5:132","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_L1StandardBridge_$85921_$","typeString":"type(contract super L1StandardBridge)"}},"id":85910,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_emitERC20BridgeFinalized","nodeType":"MemberAccess","referencedDeclaration":111674,"src":"13799:31:132","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":85917,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13799:91:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":85918,"nodeType":"ExpressionStatement","src":"13799:91:132"}]},"baseFunctions":[111674],"documentation":{"id":85883,"nodeType":"StructuredDocumentation","src":"13221:224:132","text":"@inheritdoc StandardBridge\n @notice Emits the legacy ERC20WithdrawalFinalized event followed by the ERC20BridgeFinalized\n event. This is necessary for backwards compatibility with the legacy bridge."},"implemented":true,"kind":"function","modifiers":[],"name":"_emitERC20BridgeFinalized","nameLocation":"13459:25:132","overrides":{"id":85897,"nodeType":"OverrideSpecifier","overrides":[],"src":"13677:8:132"},"parameters":{"id":85896,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85885,"mutability":"mutable","name":"_localToken","nameLocation":"13502:11:132","nodeType":"VariableDeclaration","scope":85920,"src":"13494:19:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85884,"name":"address","nodeType":"ElementaryTypeName","src":"13494:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85887,"mutability":"mutable","name":"_remoteToken","nameLocation":"13531:12:132","nodeType":"VariableDeclaration","scope":85920,"src":"13523:20:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85886,"name":"address","nodeType":"ElementaryTypeName","src":"13523:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85889,"mutability":"mutable","name":"_from","nameLocation":"13561:5:132","nodeType":"VariableDeclaration","scope":85920,"src":"13553:13:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85888,"name":"address","nodeType":"ElementaryTypeName","src":"13553:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85891,"mutability":"mutable","name":"_to","nameLocation":"13584:3:132","nodeType":"VariableDeclaration","scope":85920,"src":"13576:11:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85890,"name":"address","nodeType":"ElementaryTypeName","src":"13576:7:132","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":85893,"mutability":"mutable","name":"_amount","nameLocation":"13605:7:132","nodeType":"VariableDeclaration","scope":85920,"src":"13597:15:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85892,"name":"uint256","nodeType":"ElementaryTypeName","src":"13597:7:132","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85895,"mutability":"mutable","name":"_extraData","nameLocation":"13635:10:132","nodeType":"VariableDeclaration","scope":85920,"src":"13622:23:132","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":85894,"name":"bytes","nodeType":"ElementaryTypeName","src":"13622:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"13484:167:132"},"returnParameters":{"id":85898,"nodeType":"ParameterList","parameters":[],"src":"13690:0:132"},"scope":85921,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[{"baseName":{"id":85434,"name":"StandardBridge","nodeType":"IdentifierPath","referencedDeclaration":111675,"src":"1238:14:132"},"id":85435,"nodeType":"InheritanceSpecifier","src":"1238:14:132"},{"baseName":{"id":85436,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"1254:7:132"},"id":85437,"nodeType":"InheritanceSpecifier","src":"1254:7:132"}],"canonicalName":"L1StandardBridge","contractDependencies":[],"contractKind":"contract","documentation":{"id":85433,"nodeType":"StructuredDocumentation","src":"437:772:132","text":"@custom:proxied\n @title L1StandardBridge\n @notice The L1StandardBridge is responsible for transfering ETH and ERC20 tokens between L1 and\n L2. In the case that an ERC20 token is native to L1, it will be escrowed within this\n contract. If the ERC20 token is native to L2, it will be burnt. Before Bedrock, ETH was\n stored within this contract. After Bedrock, ETH is instead stored inside the\n OptimismPortal contract.\n NOTE: this contract is not intended to support all variations of ERC20 tokens. Examples\n of some token types that may not be properly supported by this contract include, but are\n not limited to: tokens with transfer fees, rebasing tokens, and tokens with blocklists."},"fullyImplemented":true,"linearizedBaseContracts":[85921,109417,111675,49678],"name":"L1StandardBridge","nameLocation":"1218:16:132","scope":85922,"usedErrors":[]}],"license":"MIT"},"id":132} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/L2CrossDomainMessenger.json b/packages/sdk/src/forge-artifacts/L2CrossDomainMessenger.json new file mode 100644 index 000000000000..9877d7506eb5 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/L2CrossDomainMessenger.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"MESSAGE_VERSION","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"MIN_GAS_CALLDATA_OVERHEAD","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"OTHER_MESSENGER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"RELAY_CALL_OVERHEAD","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"RELAY_CONSTANT_OVERHEAD","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"RELAY_GAS_CHECK_BUFFER","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"RELAY_RESERVED_GAS","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"baseGas","inputs":[{"name":"_message","type":"bytes","internalType":"bytes"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"pure"},{"type":"function","name":"failedMessages","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_l1CrossDomainMessenger","type":"address","internalType":"contract CrossDomainMessenger"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"l1CrossDomainMessenger","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"messageNonce","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"otherMessenger","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"relayMessage","inputs":[{"name":"_nonce","type":"uint256","internalType":"uint256"},{"name":"_sender","type":"address","internalType":"address"},{"name":"_target","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint256","internalType":"uint256"},{"name":"_message","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"sendMessage","inputs":[{"name":"_target","type":"address","internalType":"address"},{"name":"_message","type":"bytes","internalType":"bytes"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"successfulMessages","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"xDomainMessageSender","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"event","name":"FailedRelayedMessage","inputs":[{"name":"msgHash","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"RelayedMessage","inputs":[{"name":"msgHash","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"SentMessage","inputs":[{"name":"target","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":false,"internalType":"address"},{"name":"message","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"messageNonce","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"gasLimit","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"SentMessageExtension1","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b506200001e600062000024565b62000239565b600054600160a81b900460ff16158080156200004d57506000546001600160a01b90910460ff16105b806200008457506200006a306200017360201b620013071760201c565b158015620000845750600054600160a01b900460ff166001145b620000ed5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a01b1916600160a01b17905580156200011b576000805460ff60a81b1916600160a81b1790555b620001268262000182565b80156200016f576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054600160a81b900460ff16620001f15760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000e4565b60cc546001600160a01b0316620002175760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b611c8280620002496000396000f3fe60806040526004361061016a5760003560e01c806383a74074116100cb578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b146103c7578063db505d80146103da578063ecc704281461040757600080fd5b8063b1b1b20914610357578063b28ade2514610387578063c4d66de8146103a757600080fd5b80639fce812c116100b05780639fce812c146102fc578063a4e7f8bd14610327578063a7119869146102fc57600080fd5b806383a74074146102e55780638cbeeef21461020957600080fd5b80634c1d6a69116101225780635644cfdf116101075780635644cfdf146102755780635c975abb1461028b5780636e296e45146102ab57600080fd5b80634c1d6a691461020957806354fd4d501461021f57600080fd5b80632828d7e8116101535780632828d7e8146101b75780633dbb202b146101cc5780633f827a5a146101e157600080fd5b8063028f85f71461016f5780630c568498146101a2575b600080fd5b34801561017b57600080fd5b50610184601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101ae57600080fd5b50610184603f81565b3480156101c357600080fd5b50610184604081565b6101df6101da36600461177b565b61046c565b005b3480156101ed57600080fd5b506101f6600181565b60405161ffff9091168152602001610199565b34801561021557600080fd5b50610184619c4081565b34801561022b57600080fd5b506102686040518060400160405280600581526020017f322e302e3000000000000000000000000000000000000000000000000000000081525081565b604051610199919061184d565b34801561028157600080fd5b5061018461138881565b34801561029757600080fd5b5060005b6040519015158152602001610199565b3480156102b757600080fd5b506102c06106c9565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610199565b3480156102f157600080fd5b5061018462030d4081565b34801561030857600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166102c0565b34801561033357600080fd5b5061029b610342366004611867565b60ce6020526000908152604090205460ff1681565b34801561036357600080fd5b5061029b610372366004611867565b60cb6020526000908152604090205460ff1681565b34801561039357600080fd5b506101846103a2366004611880565b6107b5565b3480156103b357600080fd5b506101df6103c23660046118d4565b610823565b6101df6103d53660046118f1565b610a22565b3480156103e657600080fd5b5060cf546102c09073ffffffffffffffffffffffffffffffffffffffff1681565b34801561041357600080fd5b5061045e60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b604051908152602001610199565b60cf5461059e9073ffffffffffffffffffffffffffffffffffffffff166104948585856107b5565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061050060cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c60405160240161051c97969594939291906119c0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611323565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561062360cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b86604051610635959493929190611a1f565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084015b60405180910390fd5b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6107d1604063ffffffff8816611a9c565b6107db9190611acc565b6107e6601088611a9c565b6107f39062030d40611b1a565b6107fd9190611b1a565b6108079190611b1a565b6108119190611b1a565b61081b9190611b1a565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff161580801561086e575060005460017401000000000000000000000000000000000000000090910460ff16105b806108a05750303b1580156108a0575060005474010000000000000000000000000000000000000000900460ff166001145b61092c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161078f565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905580156109b257600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b6109bb826113b1565b8015610a1e57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60f087901c60028110610add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161078f565b8061ffff16600003610bd2576000610b2e878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506114ed915050565b600081815260cb602052604090205490915060ff1615610bd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161078f565b505b6000610c18898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061150c92505050565b9050610c6160cf54337fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef0173ffffffffffffffffffffffffffffffffffffffff90811691161490565b15610c9957853414610c7557610c75611b46565b600081815260ce602052604090205460ff1615610c9457610c94611b46565b610deb565b3415610d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a40161078f565b600081815260ce602052604090205460ff16610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161078f565b610df48761152f565b15610ea7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161078f565b600081815260cb602052604090205460ff1615610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161078f565b610f6785610f58611388619c40611b1a565b67ffffffffffffffff16611584565b1580610f8d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b156110a657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161109f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161078f565b50506112fe565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061113788619c405a6110fa9190611b75565b8988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506115a292505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156111ed57600082815260cb602052604090205460ff161561118a5761118a611b46565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26112fa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016112fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161078f565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6040517fc2b3e5ac0000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000169063c2b3e5ac90849061137990889088908790600401611b8c565b6000604051808303818588803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff1661145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161078f565b60cc5473ffffffffffffffffffffffffffffffffffffffff166114a65760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006114fb858585856115bc565b805190602001209050949350505050565b600061151c878787878787611655565b8051906020012090509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff821630148061157e575073ffffffffffffffffffffffffffffffffffffffff8216734200000000000000000000000000000000000016145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b6060848484846040516024016115d59493929190611bd4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161167296959493929190611c1e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461171657600080fd5b50565b60008083601f84011261172b57600080fd5b50813567ffffffffffffffff81111561174357600080fd5b60208301915083602082850101111561175b57600080fd5b9250929050565b803563ffffffff8116811461177657600080fd5b919050565b6000806000806060858703121561179157600080fd5b843561179c816116f4565b9350602085013567ffffffffffffffff8111156117b857600080fd5b6117c487828801611719565b90945092506117d7905060408601611762565b905092959194509250565b6000815180845260005b81811015611808576020818501810151868301820152016117ec565b8181111561181a576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061186060208301846117e2565b9392505050565b60006020828403121561187957600080fd5b5035919050565b60008060006040848603121561189557600080fd5b833567ffffffffffffffff8111156118ac57600080fd5b6118b886828701611719565b90945092506118cb905060208501611762565b90509250925092565b6000602082840312156118e657600080fd5b8135611860816116f4565b600080600080600080600060c0888a03121561190c57600080fd5b87359650602088013561191e816116f4565b9550604088013561192e816116f4565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561195857600080fd5b6119648a828b01611719565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611a1260c083018486611977565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611a4f608083018688611977565b905083604083015263ffffffff831660608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611ac357611ac3611a6d565b02949350505050565b600067ffffffffffffffff80841680611b0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611b3d57611b3d611a6d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611b8757611b87611a6d565b500390565b73ffffffffffffffffffffffffffffffffffffffff8416815267ffffffffffffffff83166020820152606060408201526000611bcb60608301846117e2565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611c0d60808301856117e2565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611c6960c08301846117e2565b9897505050505050505056fea164736f6c634300080f000a","sourceMap":"812:1752:147:-:0;;;1023:127;;;;;;;;;-1:-1:-1;1070:73:147::1;1137:1;1070:10;:73::i;:::-;812:1752:::0;;1278:175;3111:19:27;3134:13;-1:-1:-1;;;3134:13:27;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:27;;3212:1;-1:-1:-1;;;3197:12:27;;;;;:16;3179:34;3178:108;;;;3220:44;3258:4;3220:29;;;;;:44;;:::i;:::-;3219:45;:66;;;;-1:-1:-1;3268:12:27;;-1:-1:-1;;;3268:12:27;;;;3284:1;3268:17;3219:66;3157:201;;;;-1:-1:-1;;;3157:201:27;;216:2:357;3157:201:27;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:357;;;338:44;399:19;;3157:201:27;;;;;;;;;3368:12;:16;;-1:-1:-1;;;;3368:16:27;-1:-1:-1;;;3368:16:27;;;3394:65;;;;3428:13;:20;;-1:-1:-1;;;;3428:20:27;-1:-1:-1;;;3428:20:27;;;3394:65;1373:73:147::1;1420:23:::0;1373:27:::1;:73::i;:::-;3483:14:27::0;3479:99;;;3529:5;3513:21;;-1:-1:-1;;;;3513:21:27;;;3553:14;;-1:-1:-1;581:36:357;;3553:14:27;;569:2:357;554:18;3553:14:27;;;;;;;3479:99;3101:483;1278:175:147;:::o;1186:320:33:-;-1:-1:-1;;;;;1476:19:33;;:23;;;1186:320::o;18503:636:223:-;4910:13:27;;-1:-1:-1;;;4910:13:27;;;;4902:69;;;;-1:-1:-1;;;4902:69:27;;830:2:357;4902:69:27;;;812:21:357;869:2;849:18;;;842:30;908:34;888:18;;;881:62;-1:-1:-1;;;959:18:357;;;952:41;1010:19;;4902:69:27;628:407:357;4902:69:27;18988:16:223::1;::::0;-1:-1:-1;;;;;18988:16:223::1;18984:107;;19034:16;:46:::0;;-1:-1:-1;;;;;;19034:46:223::1;1338:42:192;19034:46:223;::::0;;18984:107:::1;19100:14;:32:::0;;-1:-1:-1;;;;;;19100:32:223::1;-1:-1:-1::0;;;;;19100:32:223;;;::::1;::::0;;;::::1;::::0;;18503:636::o;628:407:357:-;812:1752:147;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061016a5760003560e01c806383a74074116100cb578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b146103c7578063db505d80146103da578063ecc704281461040757600080fd5b8063b1b1b20914610357578063b28ade2514610387578063c4d66de8146103a757600080fd5b80639fce812c116100b05780639fce812c146102fc578063a4e7f8bd14610327578063a7119869146102fc57600080fd5b806383a74074146102e55780638cbeeef21461020957600080fd5b80634c1d6a69116101225780635644cfdf116101075780635644cfdf146102755780635c975abb1461028b5780636e296e45146102ab57600080fd5b80634c1d6a691461020957806354fd4d501461021f57600080fd5b80632828d7e8116101535780632828d7e8146101b75780633dbb202b146101cc5780633f827a5a146101e157600080fd5b8063028f85f71461016f5780630c568498146101a2575b600080fd5b34801561017b57600080fd5b50610184601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101ae57600080fd5b50610184603f81565b3480156101c357600080fd5b50610184604081565b6101df6101da36600461177b565b61046c565b005b3480156101ed57600080fd5b506101f6600181565b60405161ffff9091168152602001610199565b34801561021557600080fd5b50610184619c4081565b34801561022b57600080fd5b506102686040518060400160405280600581526020017f322e302e3000000000000000000000000000000000000000000000000000000081525081565b604051610199919061184d565b34801561028157600080fd5b5061018461138881565b34801561029757600080fd5b5060005b6040519015158152602001610199565b3480156102b757600080fd5b506102c06106c9565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610199565b3480156102f157600080fd5b5061018462030d4081565b34801561030857600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166102c0565b34801561033357600080fd5b5061029b610342366004611867565b60ce6020526000908152604090205460ff1681565b34801561036357600080fd5b5061029b610372366004611867565b60cb6020526000908152604090205460ff1681565b34801561039357600080fd5b506101846103a2366004611880565b6107b5565b3480156103b357600080fd5b506101df6103c23660046118d4565b610823565b6101df6103d53660046118f1565b610a22565b3480156103e657600080fd5b5060cf546102c09073ffffffffffffffffffffffffffffffffffffffff1681565b34801561041357600080fd5b5061045e60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b604051908152602001610199565b60cf5461059e9073ffffffffffffffffffffffffffffffffffffffff166104948585856107b5565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061050060cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c60405160240161051c97969594939291906119c0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611323565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561062360cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b86604051610635959493929190611a1f565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084015b60405180910390fd5b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6107d1604063ffffffff8816611a9c565b6107db9190611acc565b6107e6601088611a9c565b6107f39062030d40611b1a565b6107fd9190611b1a565b6108079190611b1a565b6108119190611b1a565b61081b9190611b1a565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff161580801561086e575060005460017401000000000000000000000000000000000000000090910460ff16105b806108a05750303b1580156108a0575060005474010000000000000000000000000000000000000000900460ff166001145b61092c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161078f565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905580156109b257600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b6109bb826113b1565b8015610a1e57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60f087901c60028110610add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161078f565b8061ffff16600003610bd2576000610b2e878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506114ed915050565b600081815260cb602052604090205490915060ff1615610bd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161078f565b505b6000610c18898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061150c92505050565b9050610c6160cf54337fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef0173ffffffffffffffffffffffffffffffffffffffff90811691161490565b15610c9957853414610c7557610c75611b46565b600081815260ce602052604090205460ff1615610c9457610c94611b46565b610deb565b3415610d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a40161078f565b600081815260ce602052604090205460ff16610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161078f565b610df48761152f565b15610ea7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161078f565b600081815260cb602052604090205460ff1615610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161078f565b610f6785610f58611388619c40611b1a565b67ffffffffffffffff16611584565b1580610f8d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b156110a657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161109f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161078f565b50506112fe565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061113788619c405a6110fa9190611b75565b8988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506115a292505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156111ed57600082815260cb602052604090205460ff161561118a5761118a611b46565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26112fa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016112fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161078f565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6040517fc2b3e5ac0000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000169063c2b3e5ac90849061137990889088908790600401611b8c565b6000604051808303818588803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff1661145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161078f565b60cc5473ffffffffffffffffffffffffffffffffffffffff166114a65760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006114fb858585856115bc565b805190602001209050949350505050565b600061151c878787878787611655565b8051906020012090509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff821630148061157e575073ffffffffffffffffffffffffffffffffffffffff8216734200000000000000000000000000000000000016145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b6060848484846040516024016115d59493929190611bd4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161167296959493929190611c1e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461171657600080fd5b50565b60008083601f84011261172b57600080fd5b50813567ffffffffffffffff81111561174357600080fd5b60208301915083602082850101111561175b57600080fd5b9250929050565b803563ffffffff8116811461177657600080fd5b919050565b6000806000806060858703121561179157600080fd5b843561179c816116f4565b9350602085013567ffffffffffffffff8111156117b857600080fd5b6117c487828801611719565b90945092506117d7905060408601611762565b905092959194509250565b6000815180845260005b81811015611808576020818501810151868301820152016117ec565b8181111561181a576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061186060208301846117e2565b9392505050565b60006020828403121561187957600080fd5b5035919050565b60008060006040848603121561189557600080fd5b833567ffffffffffffffff8111156118ac57600080fd5b6118b886828701611719565b90945092506118cb905060208501611762565b90509250925092565b6000602082840312156118e657600080fd5b8135611860816116f4565b600080600080600080600060c0888a03121561190c57600080fd5b87359650602088013561191e816116f4565b9550604088013561192e816116f4565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561195857600080fd5b6119648a828b01611719565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611a1260c083018486611977565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611a4f608083018688611977565b905083604083015263ffffffff831660608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611ac357611ac3611a6d565b02949350505050565b600067ffffffffffffffff80841680611b0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611b3d57611b3d611a6d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611b8757611b87611a6d565b500390565b73ffffffffffffffffffffffffffffffffffffffff8416815267ffffffffffffffff83166020820152606060408201526000611bcb60608301846117e2565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611c0d60808301856117e2565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611c6960c08301846117e2565b9897505050505050505056fea164736f6c634300080f000a","sourceMap":"812:1752:147:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4456:53:223;;;;;;;;;;;;4507:2;4456:53;;;;;188:18:357;176:31;;;158:50;;146:2;131:18;4456:53:223;;;;;;;;4301:64;;;;;;;;;;;;4363:2;4301:64;;4146:62;;;;;;;;;;;;4206:2;4146:62;;8628:995;;;;;;:::i;:::-;;:::i;:::-;;3879:42;;;;;;;;;;;;3920:1;3879:42;;;;;1693:6:357;1681:19;;;1663:38;;1651:2;1636:18;3879:42:223;1519:188:357;4597:51:223;;;;;;;;;;;;4642:6;4597:51;;912:40:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4943:53:223:-;;;;;;;;;;;;4991:5;4943:53;;21032:82;;;;;;;;;;-1:-1:-1;21079:4:223;21032:82;;;2638:14:357;;2631:22;2613:41;;2601:2;2586:18;21032:82:223;2473:187:357;15764:250:223;;;;;;;;;;;;;:::i;:::-;;;2841:42:357;2829:55;;;2811:74;;2799:2;2784:18;15764:250:223;2665:226:357;3999:56:223;;;;;;;;;;;;4048:7;3999:56;;16317:108;;;;;;;;;;-1:-1:-1;16404:14:223;;;;16317:108;;6234:46;;;;;;;;;;-1:-1:-1;6234:46:223;;;;;:::i;:::-;;;;;;;;;;;;;;;;5252:50;;;;;;;;;;-1:-1:-1;5252:50:223;;;;;:::i;:::-;;;;;;;;;;;;;;;;17493:894;;;;;;;;;;-1:-1:-1;17493:894:223;;;;;:::i;:::-;;:::i;1278:175:147:-;;;;;;;;;;-1:-1:-1;1278:175:147;;;;;:::i;:::-;;:::i;10311:5066:223:-;;;;;;:::i;:::-;;:::i;6386:42::-;;;;;;;;;;-1:-1:-1;6386:42:223;;;;;;;;16746:134;;;;;;;;;;;;16847:8;;;;4855:18:195;4852:30;;16746:134:223;;;;5155:25:357;;;5143:2;5128:18;16746:134:223;5009:177:357;8628:995:223;9128:14;;9088:326;;9128:14;;9168:31;9176:8;;9186:12;9168:7;:31::i;:::-;9221:9;9291:26;9319:14;16847:8;;;;4855:18:195;4852:30;;16746:134:223;9319:14;9335:10;9347:7;9356:9;9367:12;9381:8;;9251:152;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9088:12;:326::i;:::-;9442:7;9430:72;;;9451:10;9463:8;;9473:14;16847:8;;;;4855:18:195;4852:30;;16746:134:223;9473:14;9489:12;9430:72;;;;;;;;;;:::i;:::-;;;;;;;;9517:44;;9551:9;5155:25:357;;9539:10:223;;9517:44;;5143:2:357;5128:18;9517:44:223;;;;;;;-1:-1:-1;;9598:8:223;9596:10;;;;;;;;;;;;;;;;-1:-1:-1;;8628:995:223:o;15764:250::-;15859:16;;15819:7;;15859:47;:16;:47;;15838:135;;;;;;;6954:2:357;15838:135:223;;;6936:21:357;6993:2;6973:18;;;6966:30;7032:34;7012:18;;;7005:62;7103:23;7083:18;;;7076:51;7144:19;;15838:135:223;;;;;;;;;-1:-1:-1;15991:16:223;;;;;15764:250::o;17493:894::-;17577:6;4991:5;4796:6;;4363:2;17806:49;4206:2;17806:49;;;;:::i;:::-;17805:90;;;;:::i;:::-;17703:51;4507:2;17710:8;17703:51;:::i;:::-;17639:116;;4048:7;17639:116;:::i;:::-;:257;;;;:::i;:::-;:412;;;;:::i;:::-;:587;;;;:::i;:::-;:741;;;;:::i;:::-;17595:785;17493:894;-1:-1:-1;;;;17493:894:223:o;1278:175:147:-;3111:19:27;3134:13;;;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:27;;3212:1;3197:12;;;;;;:16;3179:34;3178:108;;;-1:-1:-1;3258:4:27;1476:19:33;:23;;;3219:66:27;;-1:-1:-1;3268:12:27;;;;;;;3284:1;3268:17;3219:66;3157:201;;;;;;;8439:2:357;3157:201:27;;;8421:21:357;8478:2;8458:18;;;8451:30;8517:34;8497:18;;;8490:62;8588:16;8568:18;;;8561:44;8622:19;;3157:201:27;8237:410:357;3157:201:27;3368:12;:16;;;;;;;;3394:65;;;;3428:13;:20;;;;;;;;3394:65;1373:73:147::1;1420:23;1373:27;:73::i;:::-;3483:14:27::0;3479:99;;;3529:5;3513:21;;;;;;3553:14;;-1:-1:-1;8804:36:357;;3553:14:27;;8792:2:357;8777:18;3553:14:27;;;;;;;3479:99;3101:483;1278:175:147;:::o;10311:5066:223:-;5444:3:195;5440:16;;;10869:1:223;10859:11;;10851:101;;;;;;;9410:2:357;10851:101:223;;;9392:21:357;9449:2;9429:18;;;9422:30;9488:34;9468:18;;;9461:62;9559:34;9539:18;;;9532:62;9631:15;9610:19;;;9603:44;9664:19;;10851:101:223;9208:481:357;10851:101:223;11154:7;:12;;11165:1;11154:12;11150:247;;11182:15;11200:68;11233:7;11242;11251:8;;11200:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11261:6:223;;-1:-1:-1;11200:32:223;;-1:-1:-1;;11200:68:223:i;:::-;11290:27;;;;:18;:27;;;;;;11182:86;;-1:-1:-1;11290:27:223;;:36;11282:104;;;;;;;9896:2:357;11282:104:223;;;9878:21:357;9935:2;9915:18;;;9908:30;9974:34;9954:18;;;9947:62;10045:25;10025:18;;;10018:53;10088:19;;11282:104:223;9694:419:357;11282:104:223;11168:229;11150:247;11567:21;11603:90;11636:6;11644:7;11653;11662:6;11670:12;11684:8;;11603:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11603:32:223;;-1:-1:-1;;;11603:90:223:i;:::-;11567:126;;11708:19;2307:14:147;;2284:10;1685:27:237;;2307:14:147;2249:73;;;2307:14;;2249:73;;2165:164;11708:19:223;11704:506;;;11897:6;11884:9;:19;11877:27;;;;:::i;:::-;11926:29;;;;:14;:29;;;;;;;;11925:30;11918:38;;;;:::i;:::-;11704:506;;;11995:9;:14;11987:107;;;;;;;10509:2:357;11987:107:223;;;10491:21:357;10548:2;10528:18;;;10521:30;10587:34;10567:18;;;10560:62;10658:34;10638:18;;;10631:62;10730:18;10709:19;;;10702:47;10766:19;;11987:107:223;10307:484:357;11987:107:223;12117:29;;;;:14;:29;;;;;;;;12109:90;;;;;;;10998:2:357;12109:90:223;;;10980:21:357;11037:2;11017:18;;;11010:30;11076:34;11056:18;;;11049:62;11147:18;11127;;;11120:46;11183:19;;12109:90:223;10796:412:357;12109:90:223;12241:24;12257:7;12241:15;:24::i;:::-;:33;12220:135;;;;;;;11415:2:357;12220:135:223;;;11397:21:357;11454:2;11434:18;;;11427:30;11493:34;11473:18;;;11466:62;11564:34;11544:18;;;11537:62;11636:5;11615:19;;;11608:34;11659:19;;12220:135:223;11213:471:357;12220:135:223;12374:33;;;;:18;:33;;;;;;;;:42;12366:109;;;;;;;11891:2:357;12366:109:223;;;11873:21:357;11930:2;11910:18;;;11903:30;11969:34;11949:18;;;11942:62;12040:24;12020:18;;;12013:52;12082:19;;12366:109:223;11689:418:357;12366:109:223;13169:77;13188:12;13202:43;4991:5;4796:6;13202:43;:::i;:::-;13169:77;;:18;:77::i;:::-;13168:78;:145;;;-1:-1:-1;13266:16:223;;:47;:16;1338:42:192;13266:47:223;;13168:145;13151:919;;;13338:29;;;;:14;:29;;;;;;:36;;;;13370:4;13338:36;;;13393:35;13353:13;;13393:35;;;13908:41;:9;:41;13904:135;;13969:55;;;;;12314:2:357;13969:55:223;;;12296:21:357;12353:2;12333:18;;;12326:30;12392:34;12372:18;;;12365:62;12463:15;12443:18;;;12436:43;12496:19;;13969:55:223;12112:409:357;13904:135:223;14053:7;;;;13151:919;14080:16;:26;;;;;;;;;;-1:-1:-1;14131:72:223;14145:7;4796:6;14154:9;:30;;;;:::i;:::-;14186:6;14194:8;;14131:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14131:13:223;;-1:-1:-1;;;14131:72:223:i;:::-;14213:16;:46;;;;1338:42:192;14213:46:223;;;14116:87;-1:-1:-1;14270:1101:223;;;;14484:33;;;;:18;:33;;;;;;;;:42;14477:50;;;;:::i;:::-;14541:33;;;;:18;:33;;;;;;:40;;;;14577:4;14541:40;;;14600:29;14560:13;;14600:29;;;14270:1101;;;14660:29;;;;:14;:29;;;;;;:36;;;;14692:4;14660:36;;;14715:35;14675:13;;14715:35;;;15230:41;:9;:41;15226:135;;15291:55;;;;;12314:2:357;15291:55:223;;;12296:21:357;12353:2;12333:18;;;12326:30;12392:34;12372:18;;;12365:62;12463:15;12443:18;;;12436:43;12496:19;;15291:55:223;12112:409:357;15226:135:223;10537:4840;;;10311:5066;;;;;;;;:::o;1186:320:33:-;1476:19;;;:23;;;1186:320::o;1849:269:147:-;1966:145;;;;;312:42:199;;1966:83:147;;2058:6;;1966:145;;2080:3;;2085:9;;2096:5;;1966:145;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1849:269;;;;:::o;18503:636:223:-;4910:13:27;;;;;;;4902:69;;;;;;;13296:2:357;4902:69:27;;;13278:21:357;13335:2;13315:18;;;13308:30;13374:34;13354:18;;;13347:62;13445:13;13425:18;;;13418:41;13476:19;;4902:69:27;13094:407:357;4902:69:27;18988:16:223::1;::::0;:30:::1;:16;18984:107;;19034:16;:46:::0;;;::::1;1338:42:192;19034:46:223;::::0;;18984:107:::1;19100:14;:32:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;18503:636::o;3100:305:196:-;3289:7;3329:68;3365:7;3374;3383:5;3390:6;3329:35;:68::i;:::-;3319:79;;;;;;3312:86;;3100:305;;;;;;:::o;3877:375::-;4117:7;4157:87;4193:6;4201:7;4210;4219:6;4227:9;4238:5;4157:35;:87::i;:::-;4147:98;;;;;;4140:105;;3877:375;;;;;;;;:::o;2376:186:147:-;2450:4;2473:24;;;2492:4;2473:24;;:82;;-1:-1:-1;2501:54:147;;;312:42:199;2501:54:147;2473:82;2466:89;2376:186;-1:-1:-1;;2376:186:147:o;3615:365:200:-;3696:4;3712:15;3931:2;3916:12;3909:5;3905:24;3901:33;3896:2;3887:7;3883:16;3879:56;3874:2;3867:5;3863:14;3860:76;3853:84;;3615:365;-1:-1:-1;;;;3615:365:200:o;1202:536::-;1305:4;1321:13;1668:1;1635;1594:9;1588:16;1554:2;1543:9;1539:18;1496:6;1454:7;1421:4;1395:302;1367:330;1202:536;-1:-1:-1;;;;;;1202:536:200:o;3073:336:195:-;3264:12;3370:7;3379;3388:5;3395:6;3299:103;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3073:336:195;;;;;;:::o;3883:516::-;4125:12;4272:6;4292:7;4313;4334:6;4354:9;4377:5;4160:232;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3883:516:195;;;;;;;;:::o;219:154:357:-;305:42;298:5;294:54;287:5;284:65;274:93;;363:1;360;353:12;274:93;219:154;:::o;378:347::-;429:8;439:6;493:3;486:4;478:6;474:17;470:27;460:55;;511:1;508;501:12;460:55;-1:-1:-1;534:20:357;;577:18;566:30;;563:50;;;609:1;606;599:12;563:50;646:4;638:6;634:17;622:29;;698:3;691:4;682:6;674;670:19;666:30;663:39;660:59;;;715:1;712;705:12;660:59;378:347;;;;;:::o;730:163::-;797:20;;857:10;846:22;;836:33;;826:61;;883:1;880;873:12;826:61;730:163;;;:::o;898:616::-;985:6;993;1001;1009;1062:2;1050:9;1041:7;1037:23;1033:32;1030:52;;;1078:1;1075;1068:12;1030:52;1117:9;1104:23;1136:31;1161:5;1136:31;:::i;:::-;1186:5;-1:-1:-1;1242:2:357;1227:18;;1214:32;1269:18;1258:30;;1255:50;;;1301:1;1298;1291:12;1255:50;1340:58;1390:7;1381:6;1370:9;1366:22;1340:58;:::i;:::-;1417:8;;-1:-1:-1;1314:84:357;-1:-1:-1;1471:37:357;;-1:-1:-1;1504:2:357;1489:18;;1471:37;:::i;:::-;1461:47;;898:616;;;;;;;:::o;1712:531::-;1754:3;1792:5;1786:12;1819:6;1814:3;1807:19;1844:1;1854:162;1868:6;1865:1;1862:13;1854:162;;;1930:4;1986:13;;;1982:22;;1976:29;1958:11;;;1954:20;;1947:59;1883:12;1854:162;;;2034:6;2031:1;2028:13;2025:87;;;2100:1;2093:4;2084:6;2079:3;2075:16;2071:27;2064:38;2025:87;-1:-1:-1;2157:2:357;2145:15;2162:66;2141:88;2132:98;;;;2232:4;2128:109;;1712:531;-1:-1:-1;;1712:531:357:o;2248:220::-;2397:2;2386:9;2379:21;2360:4;2417:45;2458:2;2447:9;2443:18;2435:6;2417:45;:::i;:::-;2409:53;2248:220;-1:-1:-1;;;2248:220:357:o;3158:180::-;3217:6;3270:2;3258:9;3249:7;3245:23;3241:32;3238:52;;;3286:1;3283;3276:12;3238:52;-1:-1:-1;3309:23:357;;3158:180;-1:-1:-1;3158:180:357:o;3343:481::-;3421:6;3429;3437;3490:2;3478:9;3469:7;3465:23;3461:32;3458:52;;;3506:1;3503;3496:12;3458:52;3546:9;3533:23;3579:18;3571:6;3568:30;3565:50;;;3611:1;3608;3601:12;3565:50;3650:58;3700:7;3691:6;3680:9;3676:22;3650:58;:::i;:::-;3727:8;;-1:-1:-1;3624:84:357;-1:-1:-1;3781:37:357;;-1:-1:-1;3814:2:357;3799:18;;3781:37;:::i;:::-;3771:47;;3343:481;;;;;:::o;3829:278::-;3919:6;3972:2;3960:9;3951:7;3947:23;3943:32;3940:52;;;3988:1;3985;3978:12;3940:52;4027:9;4014:23;4046:31;4071:5;4046:31;:::i;4112:892::-;4227:6;4235;4243;4251;4259;4267;4275;4328:3;4316:9;4307:7;4303:23;4299:33;4296:53;;;4345:1;4342;4335:12;4296:53;4381:9;4368:23;4358:33;;4441:2;4430:9;4426:18;4413:32;4454:31;4479:5;4454:31;:::i;:::-;4504:5;-1:-1:-1;4561:2:357;4546:18;;4533:32;4574:33;4533:32;4574:33;:::i;:::-;4626:7;-1:-1:-1;4680:2:357;4665:18;;4652:32;;-1:-1:-1;4731:3:357;4716:19;;4703:33;;-1:-1:-1;4787:3:357;4772:19;;4759:33;4815:18;4804:30;;4801:50;;;4847:1;4844;4837:12;4801:50;4886:58;4936:7;4927:6;4916:9;4912:22;4886:58;:::i;:::-;4112:892;;;;-1:-1:-1;4112:892:357;;-1:-1:-1;4112:892:357;;;;4860:84;;-1:-1:-1;;;4112:892:357:o;5191:325::-;5279:6;5274:3;5267:19;5331:6;5324:5;5317:4;5312:3;5308:14;5295:43;;5383:1;5376:4;5367:6;5362:3;5358:16;5354:27;5347:38;5249:3;5505:4;5435:66;5430:2;5422:6;5418:15;5414:88;5409:3;5405:98;5401:109;5394:116;;5191:325;;;;:::o;5521:697::-;5816:6;5805:9;5798:25;5779:4;5842:42;5932:2;5924:6;5920:15;5915:2;5904:9;5900:18;5893:43;5984:2;5976:6;5972:15;5967:2;5956:9;5952:18;5945:43;;6024:6;6019:2;6008:9;6004:18;5997:34;6080:10;6072:6;6068:23;6062:3;6051:9;6047:19;6040:52;6129:3;6123;6112:9;6108:19;6101:32;6150:62;6207:3;6196:9;6192:19;6184:6;6176;6150:62;:::i;:::-;6142:70;5521:697;-1:-1:-1;;;;;;;;;5521:697:357:o;6223:524::-;6475:42;6467:6;6463:55;6452:9;6445:74;6555:3;6550:2;6539:9;6535:18;6528:31;6426:4;6576:62;6633:3;6622:9;6618:19;6610:6;6602;6576:62;:::i;:::-;6568:70;;6674:6;6669:2;6658:9;6654:18;6647:34;6729:10;6721:6;6717:23;6712:2;6701:9;6697:18;6690:51;6223:524;;;;;;;;:::o;7174:184::-;7226:77;7223:1;7216:88;7323:4;7320:1;7313:15;7347:4;7344:1;7337:15;7363:270;7402:7;7434:18;7479:2;7476:1;7472:10;7509:2;7506:1;7502:10;7565:3;7561:2;7557:12;7552:3;7549:21;7542:3;7535:11;7528:19;7524:47;7521:73;;;7574:18;;:::i;:::-;7614:13;;7363:270;-1:-1:-1;;;;7363:270:357:o;7638:353::-;7677:1;7703:18;7748:2;7745:1;7741:10;7770:3;7760:191;;7807:77;7804:1;7797:88;7908:4;7905:1;7898:15;7936:4;7933:1;7926:15;7760:191;7969:10;;7965:20;;;;;7638:353;-1:-1:-1;;7638:353:357:o;7996:236::-;8035:3;8063:18;8108:2;8105:1;8101:10;8138:2;8135:1;8131:10;8169:3;8165:2;8161:12;8156:3;8153:21;8150:47;;;8177:18;;:::i;:::-;8213:13;;7996:236;-1:-1:-1;;;;7996:236:357:o;10118:184::-;10170:77;10167:1;10160:88;10267:4;10264:1;10257:15;10291:4;10288:1;10281:15;12526:125;12566:4;12594:1;12591;12588:8;12585:34;;;12599:18;;:::i;:::-;-1:-1:-1;12636:9:357;;12526:125::o;12656:433::-;12870:42;12862:6;12858:55;12847:9;12840:74;12962:18;12954:6;12950:31;12945:2;12934:9;12930:18;12923:59;13018:2;13013;13002:9;12998:18;12991:30;12821:4;13038:45;13079:2;13068:9;13064:18;13056:6;13038:45;:::i;:::-;13030:53;12656:433;-1:-1:-1;;;;;12656:433:357:o;13506:512::-;13700:4;13729:42;13810:2;13802:6;13798:15;13787:9;13780:34;13862:2;13854:6;13850:15;13845:2;13834:9;13830:18;13823:43;;13902:3;13897:2;13886:9;13882:18;13875:31;13923:46;13964:3;13953:9;13949:19;13941:6;13923:46;:::i;:::-;13915:54;;14005:6;14000:2;13989:9;13985:18;13978:34;13506:512;;;;;;;:::o;14023:656::-;14310:6;14299:9;14292:25;14273:4;14336:42;14426:2;14418:6;14414:15;14409:2;14398:9;14394:18;14387:43;14478:2;14470:6;14466:15;14461:2;14450:9;14446:18;14439:43;;14518:6;14513:2;14502:9;14498:18;14491:34;14562:6;14556:3;14545:9;14541:19;14534:35;14606:3;14600;14589:9;14585:19;14578:32;14627:46;14668:3;14657:9;14653:19;14645:6;14627:46;:::i;:::-;14619:54;14023:656;-1:-1:-1;;;;;;;;14023:656:357:o","linkReferences":{}},"methodIdentifiers":{"MESSAGE_VERSION()":"3f827a5a","MIN_GAS_CALLDATA_OVERHEAD()":"028f85f7","MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()":"0c568498","MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()":"2828d7e8","OTHER_MESSENGER()":"9fce812c","RELAY_CALL_OVERHEAD()":"4c1d6a69","RELAY_CONSTANT_OVERHEAD()":"83a74074","RELAY_GAS_CHECK_BUFFER()":"5644cfdf","RELAY_RESERVED_GAS()":"8cbeeef2","baseGas(bytes,uint32)":"b28ade25","failedMessages(bytes32)":"a4e7f8bd","initialize(address)":"c4d66de8","l1CrossDomainMessenger()":"a7119869","messageNonce()":"ecc70428","otherMessenger()":"db505d80","paused()":"5c975abb","relayMessage(uint256,address,address,uint256,uint256,bytes)":"d764ad0b","sendMessage(address,bytes,uint32)":"3dbb202b","successfulMessages(bytes32)":"b1b1b209","version()":"54fd4d50","xDomainMessageSender()":"6e296e45"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SentMessageExtension1\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MESSAGE_VERSION\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_CALLDATA_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_MESSENGER\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_CALL_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_CONSTANT_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_GAS_CHECK_BUFFER\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_RESERVED_GAS\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"}],\"name\":\"baseGas\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"_l1CrossDomainMessenger\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1CrossDomainMessenger\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"otherMessenger\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:proxied\":\"@custom:predeploy 0x4200000000000000000000000000000000000007\",\"kind\":\"dev\",\"methods\":{\"OTHER_MESSENGER()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"CrossDomainMessenger contract on the other chain.\"}},\"baseGas(bytes,uint32)\":{\"params\":{\"_message\":\"Message to compute the amount of required gas for.\",\"_minGasLimit\":\"Minimum desired gas limit when message goes to target.\"},\"returns\":{\"_0\":\"Amount of gas required to guarantee message receipt.\"}},\"initialize(address)\":{\"params\":{\"_l1CrossDomainMessenger\":\"L1CrossDomainMessenger contract on the other network.\"}},\"l1CrossDomainMessenger()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"L1CrossDomainMessenger contract.\"}},\"messageNonce()\":{\"returns\":{\"_0\":\"Nonce of the next message to be sent, with added message version.\"}},\"paused()\":{\"returns\":{\"_0\":\"Whether or not the contract is paused.\"}},\"relayMessage(uint256,address,address,uint256,uint256,bytes)\":{\"params\":{\"_message\":\"Message to send to the target.\",\"_minGasLimit\":\"Minimum amount of gas that the message can be executed with.\",\"_nonce\":\"Nonce of the message being relayed.\",\"_sender\":\"Address of the user who sent the message.\",\"_target\":\"Address that the message is targeted at.\",\"_value\":\"ETH value to send with the message.\"}},\"sendMessage(address,bytes,uint32)\":{\"params\":{\"_message\":\"Message to trigger the target address with.\",\"_minGasLimit\":\"Minimum gas limit that the message can be executed with.\",\"_target\":\"Target contract or wallet address.\"}},\"xDomainMessageSender()\":{\"returns\":{\"_0\":\"Address of the sender of the currently executing message on the other chain.\"}}},\"stateVariables\":{\"version\":{\"custom:semver\":\"2.0.0\"}},\"title\":\"L2CrossDomainMessenger\",\"version\":1},\"userdoc\":{\"events\":{\"FailedRelayedMessage(bytes32)\":{\"notice\":\"Emitted whenever a message fails to be relayed on this chain.\"},\"RelayedMessage(bytes32)\":{\"notice\":\"Emitted whenever a message is successfully relayed on this chain.\"},\"SentMessage(address,address,bytes,uint256,uint256)\":{\"notice\":\"Emitted whenever a message is sent to the other chain.\"},\"SentMessageExtension1(address,uint256)\":{\"notice\":\"Additional event data to emit, required as of Bedrock. Cannot be merged with the SentMessage event without breaking the ABI of this contract, this is good enough.\"}},\"kind\":\"user\",\"methods\":{\"MESSAGE_VERSION()\":{\"notice\":\"Current message version identifier.\"},\"MIN_GAS_CALLDATA_OVERHEAD()\":{\"notice\":\"Extra gas added to base gas for each byte of calldata in a message.\"},\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()\":{\"notice\":\"Denominator for dynamic overhead added to the base gas for a message.\"},\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()\":{\"notice\":\"Numerator for dynamic overhead added to the base gas for a message.\"},\"OTHER_MESSENGER()\":{\"notice\":\"Retrieves the address of the paired CrossDomainMessenger contract on the other chain Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead.\"},\"RELAY_CALL_OVERHEAD()\":{\"notice\":\"Gas reserved for performing the external call in `relayMessage`.\"},\"RELAY_CONSTANT_OVERHEAD()\":{\"notice\":\"Constant overhead added to the base gas for a message.\"},\"RELAY_GAS_CHECK_BUFFER()\":{\"notice\":\"Gas reserved for the execution between the `hasMinGas` check and the external call in `relayMessage`.\"},\"RELAY_RESERVED_GAS()\":{\"notice\":\"Gas reserved for finalizing the execution of `relayMessage` after the safe call.\"},\"baseGas(bytes,uint32)\":{\"notice\":\"Computes the amount of gas required to guarantee that a given message will be received on the other chain without running out of gas. Guaranteeing that a message will not run out of gas is important because this ensures that a message can always be replayed on the other chain if it fails to execute completely.\"},\"constructor\":{\"notice\":\"Constructs the L2CrossDomainMessenger contract.\"},\"failedMessages(bytes32)\":{\"notice\":\"Mapping of message hashes to a boolean if and only if the message has failed to be executed at least once. A message will not be present in this mapping if it successfully executed on the first attempt.\"},\"initialize(address)\":{\"notice\":\"Initializer.\"},\"l1CrossDomainMessenger()\":{\"notice\":\"Getter for the remote messenger. Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead.\"},\"messageNonce()\":{\"notice\":\"Retrieves the next message nonce. Message version will be added to the upper two bytes of the message nonce. Message version allows us to treat messages as having different structures.\"},\"otherMessenger()\":{\"notice\":\"CrossDomainMessenger contract on the other chain.\"},\"paused()\":{\"notice\":\"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op.\"},\"relayMessage(uint256,address,address,uint256,uint256,bytes)\":{\"notice\":\"Relays a message that was sent by the other CrossDomainMessenger contract. Can only be executed via cross-chain call from the other messenger OR if the message was already received once and is currently being replayed.\"},\"sendMessage(address,bytes,uint32)\":{\"notice\":\"Sends a message to some target address on the other chain. Note that if the call always reverts, then the message will be unrelayable, and any ETH sent will be permanently locked. The same will occur if the target on the other chain is considered unsafe (see the _isUnsafeTarget() function).\"},\"successfulMessages(bytes32)\":{\"notice\":\"Mapping of message hashes to boolean receipt values. Note that a message will only be present in this mapping if it has successfully been relayed on this chain, and can therefore not be relayed again.\"},\"xDomainMessageSender()\":{\"notice\":\"Retrieves the address of the contract or wallet that initiated the currently executing message on the other chain. Will throw an error if there is no message currently being executed. Allows the recipient of a call to see who triggered it.\"}},\"notice\":\"The L2CrossDomainMessenger is a high-level interface for message passing between L1 and L2 on the L2 side. Users are generally encouraged to use this contract instead of lower level message passing contracts.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L2/L2CrossDomainMessenger.sol\":\"L2CrossDomainMessenger\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409\",\"dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM\"]},\"src/L2/L2CrossDomainMessenger.sol\":{\"keccak256\":\"0xe6f3989bb296a3b8678a0d0734788cfdef8ed6632df10cba23af5a369293d355\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ec3c85753657891b6c6bc5a7b941ac7cffd312f9589683e006f2d0f5b725f4b\",\"dweb:/ipfs/QmTSLy4kv3ZVUR158NED6x31vy9J69wQunHWkJVDU5VYDC\"]},\"src/L2/L2ToL1MessagePasser.sol\":{\"keccak256\":\"0x67f440defc45e97bf1494274a9061876cbdcb10625707c534a0cb04b1c057e21\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://47900ccfcd1e4506d50dd3b14069da285eeb5f783020a0c74f58181b4c011460\",\"dweb:/ipfs/QmNUtEAxiwXT8QDbCHsX3uT4h2fh6k9f8LvMrmRK2N7K61\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72\",\"dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b\",\"dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp\"]},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff\",\"dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA\"]},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12\",\"dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF\"]},\"src/libraries/Predeploys.sol\":{\"keccak256\":\"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663\",\"dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe\"]},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b\",\"dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV\"]},\"src/universal/CrossDomainMessenger.sol\":{\"keccak256\":\"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1\",\"dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"src/vendor/AddressAliasHelper.sol\":{\"keccak256\":\"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88\",\"dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"msgHash","type":"bytes32","indexed":true}],"type":"event","name":"FailedRelayedMessage","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"msgHash","type":"bytes32","indexed":true}],"type":"event","name":"RelayedMessage","anonymous":false},{"inputs":[{"internalType":"address","name":"target","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":false},{"internalType":"bytes","name":"message","type":"bytes","indexed":false},{"internalType":"uint256","name":"messageNonce","type":"uint256","indexed":false},{"internalType":"uint256","name":"gasLimit","type":"uint256","indexed":false}],"type":"event","name":"SentMessage","anonymous":false},{"inputs":[{"internalType":"address","name":"sender","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"SentMessageExtension1","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MESSAGE_VERSION","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MIN_GAS_CALLDATA_OVERHEAD","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"OTHER_MESSENGER","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RELAY_CALL_OVERHEAD","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RELAY_CONSTANT_OVERHEAD","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RELAY_GAS_CHECK_BUFFER","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"RELAY_RESERVED_GAS","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"}],"stateMutability":"pure","type":"function","name":"baseGas","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"failedMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"contract CrossDomainMessenger","name":"_l1CrossDomainMessenger","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"l1CrossDomainMessenger","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"messageNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"otherMessenger","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_minGasLimit","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"}],"stateMutability":"payable","type":"function","name":"relayMessage"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"}],"stateMutability":"payable","type":"function","name":"sendMessage"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"successfulMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"xDomainMessageSender","outputs":[{"internalType":"address","name":"","type":"address"}]}],"devdoc":{"kind":"dev","methods":{"OTHER_MESSENGER()":{"custom:legacy":"","returns":{"_0":"CrossDomainMessenger contract on the other chain."}},"baseGas(bytes,uint32)":{"params":{"_message":"Message to compute the amount of required gas for.","_minGasLimit":"Minimum desired gas limit when message goes to target."},"returns":{"_0":"Amount of gas required to guarantee message receipt."}},"initialize(address)":{"params":{"_l1CrossDomainMessenger":"L1CrossDomainMessenger contract on the other network."}},"l1CrossDomainMessenger()":{"custom:legacy":"","returns":{"_0":"L1CrossDomainMessenger contract."}},"messageNonce()":{"returns":{"_0":"Nonce of the next message to be sent, with added message version."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}},"relayMessage(uint256,address,address,uint256,uint256,bytes)":{"params":{"_message":"Message to send to the target.","_minGasLimit":"Minimum amount of gas that the message can be executed with.","_nonce":"Nonce of the message being relayed.","_sender":"Address of the user who sent the message.","_target":"Address that the message is targeted at.","_value":"ETH value to send with the message."}},"sendMessage(address,bytes,uint32)":{"params":{"_message":"Message to trigger the target address with.","_minGasLimit":"Minimum gas limit that the message can be executed with.","_target":"Target contract or wallet address."}},"xDomainMessageSender()":{"returns":{"_0":"Address of the sender of the currently executing message on the other chain."}}},"version":1},"userdoc":{"kind":"user","methods":{"MESSAGE_VERSION()":{"notice":"Current message version identifier."},"MIN_GAS_CALLDATA_OVERHEAD()":{"notice":"Extra gas added to base gas for each byte of calldata in a message."},"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()":{"notice":"Denominator for dynamic overhead added to the base gas for a message."},"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()":{"notice":"Numerator for dynamic overhead added to the base gas for a message."},"OTHER_MESSENGER()":{"notice":"Retrieves the address of the paired CrossDomainMessenger contract on the other chain Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead."},"RELAY_CALL_OVERHEAD()":{"notice":"Gas reserved for performing the external call in `relayMessage`."},"RELAY_CONSTANT_OVERHEAD()":{"notice":"Constant overhead added to the base gas for a message."},"RELAY_GAS_CHECK_BUFFER()":{"notice":"Gas reserved for the execution between the `hasMinGas` check and the external call in `relayMessage`."},"RELAY_RESERVED_GAS()":{"notice":"Gas reserved for finalizing the execution of `relayMessage` after the safe call."},"baseGas(bytes,uint32)":{"notice":"Computes the amount of gas required to guarantee that a given message will be received on the other chain without running out of gas. Guaranteeing that a message will not run out of gas is important because this ensures that a message can always be replayed on the other chain if it fails to execute completely."},"constructor":{"notice":"Constructs the L2CrossDomainMessenger contract."},"failedMessages(bytes32)":{"notice":"Mapping of message hashes to a boolean if and only if the message has failed to be executed at least once. A message will not be present in this mapping if it successfully executed on the first attempt."},"initialize(address)":{"notice":"Initializer."},"l1CrossDomainMessenger()":{"notice":"Getter for the remote messenger. Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead."},"messageNonce()":{"notice":"Retrieves the next message nonce. Message version will be added to the upper two bytes of the message nonce. Message version allows us to treat messages as having different structures."},"otherMessenger()":{"notice":"CrossDomainMessenger contract on the other chain."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."},"relayMessage(uint256,address,address,uint256,uint256,bytes)":{"notice":"Relays a message that was sent by the other CrossDomainMessenger contract. Can only be executed via cross-chain call from the other messenger OR if the message was already received once and is currently being replayed."},"sendMessage(address,bytes,uint32)":{"notice":"Sends a message to some target address on the other chain. Note that if the call always reverts, then the message will be unrelayable, and any ETH sent will be permanently locked. The same will occur if the target on the other chain is considered unsafe (see the _isUnsafeTarget() function)."},"successfulMessages(bytes32)":{"notice":"Mapping of message hashes to boolean receipt values. Note that a message will only be present in this mapping if it has successfully been relayed on this chain, and can therefore not be relayed again."},"xDomainMessageSender()":{"notice":"Retrieves the address of the contract or wallet that initiated the currently executing message on the other chain. Will throw an error if there is no message currently being executed. Allows the recipient of a call to see who triggered it."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L2/L2CrossDomainMessenger.sol":"L2CrossDomainMessenger"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66","urls":["bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f","dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0","urls":["bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929","dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7","urls":["bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689","dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy"],"license":"MIT"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d","urls":["bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c","dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8"],"license":"MIT"},"src/L1/ResourceMetering.sol":{"keccak256":"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408","urls":["bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409","dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM"],"license":"MIT"},"src/L2/L2CrossDomainMessenger.sol":{"keccak256":"0xe6f3989bb296a3b8678a0d0734788cfdef8ed6632df10cba23af5a369293d355","urls":["bzz-raw://1ec3c85753657891b6c6bc5a7b941ac7cffd312f9589683e006f2d0f5b725f4b","dweb:/ipfs/QmTSLy4kv3ZVUR158NED6x31vy9J69wQunHWkJVDU5VYDC"],"license":"MIT"},"src/L2/L2ToL1MessagePasser.sol":{"keccak256":"0x67f440defc45e97bf1494274a9061876cbdcb10625707c534a0cb04b1c057e21","urls":["bzz-raw://47900ccfcd1e4506d50dd3b14069da285eeb5f783020a0c74f58181b4c011460","dweb:/ipfs/QmNUtEAxiwXT8QDbCHsX3uT4h2fh6k9f8LvMrmRK2N7K61"],"license":"MIT"},"src/libraries/Arithmetic.sol":{"keccak256":"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db","urls":["bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72","dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq"],"license":"MIT"},"src/libraries/Burn.sol":{"keccak256":"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010","urls":["bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f","dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"],"license":"MIT"},"src/libraries/Constants.sol":{"keccak256":"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132","urls":["bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b","dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp"],"license":"MIT"},"src/libraries/Encoding.sol":{"keccak256":"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87","urls":["bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff","dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA"],"license":"MIT"},"src/libraries/Hashing.sol":{"keccak256":"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8","urls":["bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12","dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF"],"license":"MIT"},"src/libraries/Predeploys.sol":{"keccak256":"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02","urls":["bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663","dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe"],"license":"MIT"},"src/libraries/SafeCall.sol":{"keccak256":"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f","urls":["bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a","dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq"],"license":"MIT"},"src/libraries/Types.sol":{"keccak256":"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4","urls":["bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e","dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"],"license":"MIT"},"src/libraries/rlp/RLPWriter.sol":{"keccak256":"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6","urls":["bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b","dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV"],"license":"MIT"},"src/universal/CrossDomainMessenger.sol":{"keccak256":"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0","urls":["bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1","dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"},"src/vendor/AddressAliasHelper.sol":{"keccak256":"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237","urls":["bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88","dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR"],"license":"Apache-2.0"}},"version":1},"storageLayout":{"storage":[{"astId":108324,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"spacer_0_0_20","offset":0,"slot":"0","type":"t_address"},{"astId":46970,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"_initialized","offset":20,"slot":"0","type":"t_uint8"},{"astId":46973,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"_initializing","offset":21,"slot":"0","type":"t_bool"},{"astId":108331,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"spacer_1_0_1600","offset":0,"slot":"1","type":"t_array(t_uint256)50_storage"},{"astId":108334,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"spacer_51_0_20","offset":0,"slot":"51","type":"t_address"},{"astId":108339,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"spacer_52_0_1568","offset":0,"slot":"52","type":"t_array(t_uint256)49_storage"},{"astId":108342,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"spacer_101_0_1","offset":0,"slot":"101","type":"t_bool"},{"astId":108347,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"spacer_102_0_1568","offset":0,"slot":"102","type":"t_array(t_uint256)49_storage"},{"astId":108350,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"spacer_151_0_32","offset":0,"slot":"151","type":"t_uint256"},{"astId":108355,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"spacer_152_0_1568","offset":0,"slot":"152","type":"t_array(t_uint256)49_storage"},{"astId":108360,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"spacer_201_0_32","offset":0,"slot":"201","type":"t_mapping(t_bytes32,t_bool)"},{"astId":108365,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"spacer_202_0_32","offset":0,"slot":"202","type":"t_mapping(t_bytes32,t_bool)"},{"astId":108410,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"successfulMessages","offset":0,"slot":"203","type":"t_mapping(t_bytes32,t_bool)"},{"astId":108413,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"xDomainMsgSender","offset":0,"slot":"204","type":"t_address"},{"astId":108416,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"msgNonce","offset":0,"slot":"205","type":"t_uint240"},{"astId":108421,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"failedMessages","offset":0,"slot":"206","type":"t_mapping(t_bytes32,t_bool)"},{"astId":108425,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"otherMessenger","offset":0,"slot":"207","type":"t_contract(CrossDomainMessenger)108888"},{"astId":108430,"contract":"src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger","label":"__gap","offset":0,"slot":"208","type":"t_array(t_uint256)43_storage"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_uint256)43_storage":{"encoding":"inplace","label":"uint256[43]","numberOfBytes":"1376","base":"t_uint256"},"t_array(t_uint256)49_storage":{"encoding":"inplace","label":"uint256[49]","numberOfBytes":"1568","base":"t_uint256"},"t_array(t_uint256)50_storage":{"encoding":"inplace","label":"uint256[50]","numberOfBytes":"1600","base":"t_uint256"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_contract(CrossDomainMessenger)108888":{"encoding":"inplace","label":"contract CrossDomainMessenger","numberOfBytes":"20"},"t_mapping(t_bytes32,t_bool)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => bool)","numberOfBytes":"32","value":"t_bool"},"t_uint240":{"encoding":"inplace","label":"uint240","numberOfBytes":"30"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"version":1,"kind":"user","methods":{"MESSAGE_VERSION()":{"notice":"Current message version identifier."},"MIN_GAS_CALLDATA_OVERHEAD()":{"notice":"Extra gas added to base gas for each byte of calldata in a message."},"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()":{"notice":"Denominator for dynamic overhead added to the base gas for a message."},"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()":{"notice":"Numerator for dynamic overhead added to the base gas for a message."},"OTHER_MESSENGER()":{"notice":"Retrieves the address of the paired CrossDomainMessenger contract on the other chain Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead."},"RELAY_CALL_OVERHEAD()":{"notice":"Gas reserved for performing the external call in `relayMessage`."},"RELAY_CONSTANT_OVERHEAD()":{"notice":"Constant overhead added to the base gas for a message."},"RELAY_GAS_CHECK_BUFFER()":{"notice":"Gas reserved for the execution between the `hasMinGas` check and the external call in `relayMessage`."},"RELAY_RESERVED_GAS()":{"notice":"Gas reserved for finalizing the execution of `relayMessage` after the safe call."},"baseGas(bytes,uint32)":{"notice":"Computes the amount of gas required to guarantee that a given message will be received on the other chain without running out of gas. Guaranteeing that a message will not run out of gas is important because this ensures that a message can always be replayed on the other chain if it fails to execute completely."},"constructor":{"notice":"Constructs the L2CrossDomainMessenger contract."},"failedMessages(bytes32)":{"notice":"Mapping of message hashes to a boolean if and only if the message has failed to be executed at least once. A message will not be present in this mapping if it successfully executed on the first attempt."},"initialize(address)":{"notice":"Initializer."},"l1CrossDomainMessenger()":{"notice":"Getter for the remote messenger. Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead."},"messageNonce()":{"notice":"Retrieves the next message nonce. Message version will be added to the upper two bytes of the message nonce. Message version allows us to treat messages as having different structures."},"otherMessenger()":{"notice":"CrossDomainMessenger contract on the other chain."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."},"relayMessage(uint256,address,address,uint256,uint256,bytes)":{"notice":"Relays a message that was sent by the other CrossDomainMessenger contract. Can only be executed via cross-chain call from the other messenger OR if the message was already received once and is currently being replayed."},"sendMessage(address,bytes,uint32)":{"notice":"Sends a message to some target address on the other chain. Note that if the call always reverts, then the message will be unrelayable, and any ETH sent will be permanently locked. The same will occur if the target on the other chain is considered unsafe (see the _isUnsafeTarget() function)."},"successfulMessages(bytes32)":{"notice":"Mapping of message hashes to boolean receipt values. Note that a message will only be present in this mapping if it has successfully been relayed on this chain, and can therefore not be relayed again."},"xDomainMessageSender()":{"notice":"Retrieves the address of the contract or wallet that initiated the currently executing message on the other chain. Will throw an error if there is no message currently being executed. Allows the recipient of a call to see who triggered it."}},"events":{"FailedRelayedMessage(bytes32)":{"notice":"Emitted whenever a message fails to be relayed on this chain."},"RelayedMessage(bytes32)":{"notice":"Emitted whenever a message is successfully relayed on this chain."},"SentMessage(address,address,bytes,uint256,uint256)":{"notice":"Emitted whenever a message is sent to the other chain."},"SentMessageExtension1(address,uint256)":{"notice":"Additional event data to emit, required as of Bedrock. Cannot be merged with the SentMessage event without breaking the ABI of this contract, this is good enough."}},"notice":"The L2CrossDomainMessenger is a high-level interface for message passing between L1 and L2 on the L2 side. Users are generally encouraged to use this contract instead of lower level message passing contracts."},"devdoc":{"version":1,"kind":"dev","methods":{"OTHER_MESSENGER()":{"returns":{"_0":"CrossDomainMessenger contract on the other chain."}},"baseGas(bytes,uint32)":{"params":{"_message":"Message to compute the amount of required gas for.","_minGasLimit":"Minimum desired gas limit when message goes to target."},"returns":{"_0":"Amount of gas required to guarantee message receipt."}},"initialize(address)":{"params":{"_l1CrossDomainMessenger":"L1CrossDomainMessenger contract on the other network."}},"l1CrossDomainMessenger()":{"returns":{"_0":"L1CrossDomainMessenger contract."}},"messageNonce()":{"returns":{"_0":"Nonce of the next message to be sent, with added message version."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}},"relayMessage(uint256,address,address,uint256,uint256,bytes)":{"params":{"_message":"Message to send to the target.","_minGasLimit":"Minimum amount of gas that the message can be executed with.","_nonce":"Nonce of the message being relayed.","_sender":"Address of the user who sent the message.","_target":"Address that the message is targeted at.","_value":"ETH value to send with the message."}},"sendMessage(address,bytes,uint32)":{"params":{"_message":"Message to trigger the target address with.","_minGasLimit":"Minimum gas limit that the message can be executed with.","_target":"Target contract or wallet address."}},"xDomainMessageSender()":{"returns":{"_0":"Address of the sender of the currently executing message on the other chain."}}},"title":"L2CrossDomainMessenger"},"ast":{"absolutePath":"src/L2/L2CrossDomainMessenger.sol","id":90489,"exportedSymbols":{"AddressAliasHelper":[111913],"Constants":[103096],"CrossDomainMessenger":[108888],"ISemver":[109417],"L2CrossDomainMessenger":[90488],"L2ToL1MessagePasser":[91307],"Predeploys":[104124]},"nodeType":"SourceUnit","src":"32:2533:147","nodes":[{"id":90353,"nodeType":"PragmaDirective","src":"32:23:147","nodes":[],"literals":["solidity","0.8",".15"]},{"id":90355,"nodeType":"ImportDirective","src":"57:71:147","nodes":[],"absolutePath":"src/vendor/AddressAliasHelper.sol","file":"src/vendor/AddressAliasHelper.sol","nameLocation":"-1:-1:-1","scope":90489,"sourceUnit":111914,"symbolAliases":[{"foreign":{"id":90354,"name":"AddressAliasHelper","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111913,"src":"66:18:147","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90357,"nodeType":"ImportDirective","src":"129:58:147","nodes":[],"absolutePath":"src/libraries/Predeploys.sol","file":"src/libraries/Predeploys.sol","nameLocation":"-1:-1:-1","scope":90489,"sourceUnit":104125,"symbolAliases":[{"foreign":{"id":90356,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"138:10:147","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90359,"nodeType":"ImportDirective","src":"188:78:147","nodes":[],"absolutePath":"src/universal/CrossDomainMessenger.sol","file":"src/universal/CrossDomainMessenger.sol","nameLocation":"-1:-1:-1","scope":90489,"sourceUnit":108889,"symbolAliases":[{"foreign":{"id":90358,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"197:20:147","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90361,"nodeType":"ImportDirective","src":"267:52:147","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":90489,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":90360,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"276:7:147","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90363,"nodeType":"ImportDirective","src":"320:69:147","nodes":[],"absolutePath":"src/L2/L2ToL1MessagePasser.sol","file":"src/L2/L2ToL1MessagePasser.sol","nameLocation":"-1:-1:-1","scope":90489,"sourceUnit":91308,"symbolAliases":[{"foreign":{"id":90362,"name":"L2ToL1MessagePasser","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91307,"src":"329:19:147","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90365,"nodeType":"ImportDirective","src":"390:56:147","nodes":[],"absolutePath":"src/libraries/Constants.sol","file":"src/libraries/Constants.sol","nameLocation":"-1:-1:-1","scope":90489,"sourceUnit":103097,"symbolAliases":[{"foreign":{"id":90364,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"399:9:147","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90488,"nodeType":"ContractDefinition","src":"812:1752:147","nodes":[{"id":90374,"nodeType":"VariableDeclaration","src":"912:40:147","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":90371,"nodeType":"StructuredDocumentation","src":"883:24:147","text":"@custom:semver 2.0.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"935:7:147","scope":90488,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":90372,"name":"string","nodeType":"ElementaryTypeName","src":"912:6:147","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"322e302e30","id":90373,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"945:7:147","typeDescriptions":{"typeIdentifier":"t_stringliteral_b4bcb154e38601c389396fa918314da42d4626f13ef6d0ceb07e5f5d26b2fbc3","typeString":"literal_string \"2.0.0\""},"value":"2.0.0"},"visibility":"public"},{"id":90390,"nodeType":"FunctionDefinition","src":"1023:127:147","nodes":[],"body":{"id":90389,"nodeType":"Block","src":"1060:90:147","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30","id":90384,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1137:1:147","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":90383,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1129:7:147","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":90382,"name":"address","nodeType":"ElementaryTypeName","src":"1129:7:147","typeDescriptions":{}}},"id":90385,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1129:10:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90381,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"1108:20:147","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CrossDomainMessenger_$108888_$","typeString":"type(contract CrossDomainMessenger)"}},"id":90386,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1108:32:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}],"id":90380,"name":"initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90404,"src":"1070:10:147","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_CrossDomainMessenger_$108888_$returns$__$","typeString":"function (contract CrossDomainMessenger)"}},"id":90387,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_l1CrossDomainMessenger"],"nodeType":"FunctionCall","src":"1070:73:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90388,"nodeType":"ExpressionStatement","src":"1070:73:147"}]},"documentation":{"id":90375,"nodeType":"StructuredDocumentation","src":"959:59:147","text":"@notice Constructs the L2CrossDomainMessenger contract."},"implemented":true,"kind":"constructor","modifiers":[{"arguments":[],"id":90378,"kind":"baseConstructorSpecifier","modifierName":{"id":90377,"name":"CrossDomainMessenger","nodeType":"IdentifierPath","referencedDeclaration":108888,"src":"1037:20:147"},"nodeType":"ModifierInvocation","src":"1037:22:147"}],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":90376,"nodeType":"ParameterList","parameters":[],"src":"1034:2:147"},"returnParameters":{"id":90379,"nodeType":"ParameterList","parameters":[],"src":"1060:0:147"},"scope":90488,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":90404,"nodeType":"FunctionDefinition","src":"1278:175:147","nodes":[],"body":{"id":90403,"nodeType":"Block","src":"1363:90:147","nodes":[],"statements":[{"expression":{"arguments":[{"id":90400,"name":"_l1CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90394,"src":"1420:23:147","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}],"id":90399,"name":"__CrossDomainMessenger_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108852,"src":"1373:27:147","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_CrossDomainMessenger_$108888_$returns$__$","typeString":"function (contract CrossDomainMessenger)"}},"id":90401,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_otherMessenger"],"nodeType":"FunctionCall","src":"1373:73:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90402,"nodeType":"ExpressionStatement","src":"1373:73:147"}]},"documentation":{"id":90391,"nodeType":"StructuredDocumentation","src":"1156:117:147","text":"@notice Initializer.\n @param _l1CrossDomainMessenger L1CrossDomainMessenger contract on the other network."},"functionSelector":"c4d66de8","implemented":true,"kind":"function","modifiers":[{"id":90397,"kind":"modifierInvocation","modifierName":{"id":90396,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":47034,"src":"1351:11:147"},"nodeType":"ModifierInvocation","src":"1351:11:147"}],"name":"initialize","nameLocation":"1287:10:147","parameters":{"id":90395,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90394,"mutability":"mutable","name":"_l1CrossDomainMessenger","nameLocation":"1319:23:147","nodeType":"VariableDeclaration","scope":90404,"src":"1298:44:147","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"},"typeName":{"id":90393,"nodeType":"UserDefinedTypeName","pathNode":{"id":90392,"name":"CrossDomainMessenger","nodeType":"IdentifierPath","referencedDeclaration":108888,"src":"1298:20:147"},"referencedDeclaration":108888,"src":"1298:20:147","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},"visibility":"internal"}],"src":"1297:46:147"},"returnParameters":{"id":90398,"nodeType":"ParameterList","parameters":[],"src":"1363:0:147"},"scope":90488,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":90414,"nodeType":"FunctionDefinition","src":"1687:115:147","nodes":[],"body":{"id":90413,"nodeType":"Block","src":"1764:38:147","nodes":[],"statements":[{"expression":{"id":90411,"name":"otherMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108425,"src":"1781:14:147","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},"functionReturnParameters":90410,"id":90412,"nodeType":"Return","src":"1774:21:147"}]},"documentation":{"id":90405,"nodeType":"StructuredDocumentation","src":"1459:223:147","text":"@notice Getter for the remote messenger.\n Public getter is legacy and will be removed in the future. Use `otherMessenger()` instead.\n @return L1CrossDomainMessenger contract.\n @custom:legacy"},"functionSelector":"a7119869","implemented":true,"kind":"function","modifiers":[],"name":"l1CrossDomainMessenger","nameLocation":"1696:22:147","parameters":{"id":90406,"nodeType":"ParameterList","parameters":[],"src":"1718:2:147"},"returnParameters":{"id":90410,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90409,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":90414,"src":"1742:20:147","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"},"typeName":{"id":90408,"nodeType":"UserDefinedTypeName","pathNode":{"id":90407,"name":"CrossDomainMessenger","nodeType":"IdentifierPath","referencedDeclaration":108888,"src":"1742:20:147"},"referencedDeclaration":108888,"src":"1742:20:147","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},"visibility":"internal"}],"src":"1741:22:147"},"scope":90488,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":90443,"nodeType":"FunctionDefinition","src":"1849:269:147","nodes":[],"body":{"id":90442,"nodeType":"Block","src":"1956:162:147","nodes":[],"statements":[{"expression":{"arguments":[{"id":90437,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90417,"src":"2080:3:147","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90438,"name":"_gasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90419,"src":"2085:9:147","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},{"id":90439,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90423,"src":"2096:5:147","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"arguments":[{"arguments":[{"expression":{"id":90430,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"1994:10:147","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":90431,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L2_TO_L1_MESSAGE_PASSER","nodeType":"MemberAccess","referencedDeclaration":104000,"src":"1994:34:147","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90429,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1986:8:147","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":90428,"name":"address","nodeType":"ElementaryTypeName","src":"1986:8:147","stateMutability":"payable","typeDescriptions":{}}},"id":90432,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1986:43:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":90427,"name":"L2ToL1MessagePasser","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91307,"src":"1966:19:147","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L2ToL1MessagePasser_$91307_$","typeString":"type(contract L2ToL1MessagePasser)"}},"id":90433,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1966:64:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L2ToL1MessagePasser_$91307","typeString":"contract L2ToL1MessagePasser"}},"id":90434,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"initiateWithdrawal","nodeType":"MemberAccess","referencedDeclaration":91293,"src":"1966:83:147","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,uint256,bytes memory) payable external"}},"id":90436,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":90435,"name":"_value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90421,"src":"2058:6:147","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"1966:100:147","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$value","typeString":"function (address,uint256,bytes memory) payable external"}},"id":90440,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1966:145:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90441,"nodeType":"ExpressionStatement","src":"1966:145:147"}]},"baseFunctions":[108864],"documentation":{"id":90415,"nodeType":"StructuredDocumentation","src":"1808:36:147","text":"@inheritdoc CrossDomainMessenger"},"implemented":true,"kind":"function","modifiers":[],"name":"_sendMessage","nameLocation":"1858:12:147","overrides":{"id":90425,"nodeType":"OverrideSpecifier","overrides":[],"src":"1947:8:147"},"parameters":{"id":90424,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90417,"mutability":"mutable","name":"_to","nameLocation":"1879:3:147","nodeType":"VariableDeclaration","scope":90443,"src":"1871:11:147","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90416,"name":"address","nodeType":"ElementaryTypeName","src":"1871:7:147","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90419,"mutability":"mutable","name":"_gasLimit","nameLocation":"1891:9:147","nodeType":"VariableDeclaration","scope":90443,"src":"1884:16:147","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":90418,"name":"uint64","nodeType":"ElementaryTypeName","src":"1884:6:147","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"},{"constant":false,"id":90421,"mutability":"mutable","name":"_value","nameLocation":"1910:6:147","nodeType":"VariableDeclaration","scope":90443,"src":"1902:14:147","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90420,"name":"uint256","nodeType":"ElementaryTypeName","src":"1902:7:147","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":90423,"mutability":"mutable","name":"_data","nameLocation":"1931:5:147","nodeType":"VariableDeclaration","scope":90443,"src":"1918:18:147","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":90422,"name":"bytes","nodeType":"ElementaryTypeName","src":"1918:5:147","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1870:67:147"},"returnParameters":{"id":90426,"nodeType":"ParameterList","parameters":[],"src":"1956:0:147"},"scope":90488,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":90462,"nodeType":"FunctionDefinition","src":"2165:164:147","nodes":[],"body":{"id":90461,"nodeType":"Block","src":"2232:97:147","nodes":[],"statements":[{"expression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90459,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":90452,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2284:3:147","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":90453,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2284:10:147","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":90450,"name":"AddressAliasHelper","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111913,"src":"2249:18:147","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AddressAliasHelper_$111913_$","typeString":"type(library AddressAliasHelper)"}},"id":90451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"undoL1ToL2Alias","nodeType":"MemberAccess","referencedDeclaration":111912,"src":"2249:34:147","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_address_$returns$_t_address_$","typeString":"function (address) pure returns (address)"}},"id":90454,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2249:46:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":90457,"name":"otherMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108425,"src":"2307:14:147","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}],"id":90456,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2299:7:147","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":90455,"name":"address","nodeType":"ElementaryTypeName","src":"2299:7:147","typeDescriptions":{}}},"id":90458,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2299:23:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2249:73:147","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":90449,"id":90460,"nodeType":"Return","src":"2242:80:147"}]},"baseFunctions":[108870],"documentation":{"id":90444,"nodeType":"StructuredDocumentation","src":"2124:36:147","text":"@inheritdoc CrossDomainMessenger"},"implemented":true,"kind":"function","modifiers":[],"name":"_isOtherMessenger","nameLocation":"2174:17:147","overrides":{"id":90446,"nodeType":"OverrideSpecifier","overrides":[],"src":"2208:8:147"},"parameters":{"id":90445,"nodeType":"ParameterList","parameters":[],"src":"2191:2:147"},"returnParameters":{"id":90449,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90448,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":90462,"src":"2226:4:147","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":90447,"name":"bool","nodeType":"ElementaryTypeName","src":"2226:4:147","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2225:6:147"},"scope":90488,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":90487,"nodeType":"FunctionDefinition","src":"2376:186:147","nodes":[],"body":{"id":90486,"nodeType":"Block","src":"2456:106:147","nodes":[],"statements":[{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":90484,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90471,"name":"_target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90465,"src":"2473:7:147","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":90474,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2492:4:147","typeDescriptions":{"typeIdentifier":"t_contract$_L2CrossDomainMessenger_$90488","typeString":"contract L2CrossDomainMessenger"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_L2CrossDomainMessenger_$90488","typeString":"contract L2CrossDomainMessenger"}],"id":90473,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2484:7:147","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":90472,"name":"address","nodeType":"ElementaryTypeName","src":"2484:7:147","typeDescriptions":{}}},"id":90475,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2484:13:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2473:24:147","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90483,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90477,"name":"_target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90465,"src":"2501:7:147","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"expression":{"id":90480,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"2520:10:147","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":90481,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L2_TO_L1_MESSAGE_PASSER","nodeType":"MemberAccess","referencedDeclaration":104000,"src":"2520:34:147","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90479,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2512:7:147","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":90478,"name":"address","nodeType":"ElementaryTypeName","src":"2512:7:147","typeDescriptions":{}}},"id":90482,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2512:43:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2501:54:147","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2473:82:147","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":90470,"id":90485,"nodeType":"Return","src":"2466:89:147"}]},"baseFunctions":[108878],"documentation":{"id":90463,"nodeType":"StructuredDocumentation","src":"2335:36:147","text":"@inheritdoc CrossDomainMessenger"},"implemented":true,"kind":"function","modifiers":[],"name":"_isUnsafeTarget","nameLocation":"2385:15:147","overrides":{"id":90467,"nodeType":"OverrideSpecifier","overrides":[],"src":"2432:8:147"},"parameters":{"id":90466,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90465,"mutability":"mutable","name":"_target","nameLocation":"2409:7:147","nodeType":"VariableDeclaration","scope":90487,"src":"2401:15:147","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90464,"name":"address","nodeType":"ElementaryTypeName","src":"2401:7:147","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2400:17:147"},"returnParameters":{"id":90470,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90469,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":90487,"src":"2450:4:147","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":90468,"name":"bool","nodeType":"ElementaryTypeName","src":"2450:4:147","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2449:6:147"},"scope":90488,"stateMutability":"view","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[{"baseName":{"id":90367,"name":"CrossDomainMessenger","nodeType":"IdentifierPath","referencedDeclaration":108888,"src":"847:20:147"},"id":90368,"nodeType":"InheritanceSpecifier","src":"847:20:147"},{"baseName":{"id":90369,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"869:7:147"},"id":90370,"nodeType":"InheritanceSpecifier","src":"869:7:147"}],"canonicalName":"L2CrossDomainMessenger","contractDependencies":[],"contractKind":"contract","documentation":{"id":90366,"nodeType":"StructuredDocumentation","src":"448:364:147","text":"@custom:proxied\n @custom:predeploy 0x4200000000000000000000000000000000000007\n @title L2CrossDomainMessenger\n @notice The L2CrossDomainMessenger is a high-level interface for message passing between L1 and\n L2 on the L2 side. Users are generally encouraged to use this contract instead of lower\n level message passing contracts."},"fullyImplemented":true,"linearizedBaseContracts":[90488,109417,108888,108366,47114,108325],"name":"L2CrossDomainMessenger","nameLocation":"821:22:147","scope":90489,"usedErrors":[]}],"license":"MIT"},"id":147} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/L2ERC721Bridge.json b/packages/sdk/src/forge-artifacts/L2ERC721Bridge.json new file mode 100644 index 000000000000..4ec47e1d9f16 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/L2ERC721Bridge.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"MESSENGER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"OTHER_BRIDGE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract StandardBridge"}],"stateMutability":"view"},{"type":"function","name":"bridgeERC721","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bridgeERC721To","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finalizeBridgeERC721","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[{"name":"_l1ERC721Bridge","type":"address","internalType":"address payable"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"messenger","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"otherBridge","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract StandardBridge"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"ERC721BridgeFinalized","inputs":[{"name":"localToken","type":"address","indexed":true,"internalType":"address"},{"name":"remoteToken","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ERC721BridgeInitiated","inputs":[{"name":"localToken","type":"address","indexed":true,"internalType":"address"},{"name":"remoteToken","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b506200001e600062000024565b62000217565b600054610100900460ff1615808015620000455750600054600160ff909116105b8062000075575062000062306200016d60201b62000a3e1760201c565b15801562000075575060005460ff166001145b620000de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000102576000805461ff0019166101001790555b62000122734200000000000000000000000000000000000007836200017c565b801562000169576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054610100900460ff16620001e95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b600180546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b61160c80620002276000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80637f46ddb211610076578063aa5574521161005b578063aa557452146101c9578063c4d66de8146101dc578063c89701a2146101ef57600080fd5b80637f46ddb21461018d578063927ede2d146101ab57600080fd5b806354fd4d50116100a757806354fd4d50146101225780635c975abb1461016b578063761f44931461017a57600080fd5b80633687011a146100c35780633cb747bf146100d8575b600080fd5b6100d66100d136600461128a565b61020f565b005b6001546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61015e6040518060400160405280600581526020017f312e372e3000000000000000000000000000000000000000000000000000000081525081565b6040516101199190611378565b60405160008152602001610119565b6100d661018836600461138b565b6102bb565b60025473ffffffffffffffffffffffffffffffffffffffff166100f8565b60015473ffffffffffffffffffffffffffffffffffffffff166100f8565b6100d66101d7366004611423565b6107d9565b6100d66101ea36600461149a565b610895565b6002546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b333b156102a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102b38686333388888888610a5a565b505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156103905750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa158015610354573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037891906114b7565b73ffffffffffffffffffffffffffffffffffffffff16145b61041c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161029a565b3073ffffffffffffffffffffffffffffffffffffffff8816036104c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c324552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161029a565b6104eb877f74259ebf00000000000000000000000000000000000000000000000000000000610fc2565b610577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324552433732314272696467653a206c6f63616c20746f6b656e20696e746560448201527f7266616365206973206e6f7420636f6d706c69616e7400000000000000000000606482015260840161029a565b8673ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e691906114b7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146106c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4c324552433732314272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433732312060648201527f6c6f63616c20746f6b656e000000000000000000000000000000000000000000608482015260a40161029a565b6040517fa144819400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301526024820185905288169063a144819490604401600060405180830381600087803b15801561073657600080fd5b505af115801561074a573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac878787876040516107c8949392919061151d565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff851661087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161029a565b61088c8787338888888888610a5a565b50505050505050565b600054610100900460ff16158080156108b55750600054600160ff909116105b806108cf5750303b1580156108cf575060005460ff166001145b61095b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161029a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156109b957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109d773420000000000000000000000000000000000000783610fe5565b8015610a3a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c324552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161029a565b6040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff891690636352211e90602401602060405180830381865afa158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c91906114b7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610c46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324552433732314272696467653a205769746864726177616c206973206e6f60448201527f74206265696e6720696e69746961746564206279204e4654206f776e65720000606482015260840161029a565b60008873ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb791906114b7565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c324552433732314272696467653a2072656d6f746520746f6b656e20646f6560448201527f73206e6f74206d6174636820676976656e2076616c7565000000000000000000606482015260840161029a565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018790528a1690639dc29fac90604401600060405180830381600087803b158015610de457600080fd5b505af1158015610df8573d6000803e3d6000fd5b50505050600063761f449360e01b828b8a8a8a8989604051602401610e23979695949392919061155d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260015460025492517f3dbb202b00000000000000000000000000000000000000000000000000000000815291935073ffffffffffffffffffffffffffffffffffffffff90811692633dbb202b92610f0292919091169085908a906004016115ba565b600060405180830381600087803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a58a8a8989604051610fae949392919061151d565b60405180910390a450505050505050505050565b6000610fcd836110cf565b8015610fde5750610fde8383611134565b9392505050565b600054610100900460ff1661107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161029a565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b60006110fb827f01ffc9a700000000000000000000000000000000000000000000000000000000611134565b801561112e575061112c827fffffffff00000000000000000000000000000000000000000000000000000000611134565b155b92915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156111ec575060208210155b80156111f85750600081115b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461122557600080fd5b50565b803563ffffffff8116811461123c57600080fd5b919050565b60008083601f84011261125357600080fd5b50813567ffffffffffffffff81111561126b57600080fd5b60208301915083602082850101111561128357600080fd5b9250929050565b60008060008060008060a087890312156112a357600080fd5b86356112ae81611203565b955060208701356112be81611203565b9450604087013593506112d360608801611228565b9250608087013567ffffffffffffffff8111156112ef57600080fd5b6112fb89828a01611241565b979a9699509497509295939492505050565b6000815180845260005b8181101561133357602081850181015186830182015201611317565b81811115611345576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610fde602083018461130d565b600080600080600080600060c0888a0312156113a657600080fd5b87356113b181611203565b965060208801356113c181611203565b955060408801356113d181611203565b945060608801356113e181611203565b93506080880135925060a088013567ffffffffffffffff81111561140457600080fd5b6114108a828b01611241565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561143e57600080fd5b873561144981611203565b9650602088013561145981611203565b9550604088013561146981611203565b94506060880135935061147e60808901611228565b925060a088013567ffffffffffffffff81111561140457600080fd5b6000602082840312156114ac57600080fd5b8135610fde81611203565b6000602082840312156114c957600080fd5b8151610fde81611203565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006115536060830184866114d4565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526115ad60c0830184866114d4565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006115e9606083018561130d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a","sourceMap":"1389:4507:148:-:0;;;1576:98;;;;;;;;;-1:-1:-1;1615:52:148::1;1661:1;1615:10;:52::i;:::-;1389:4507:::0;;1813:263;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;;3209:33;3236:4;3209:18;;;;;:33;;:::i;:::-;3208:34;:55;;;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;-1:-1:-1;;;3146:190:43;;216:2:357;3146:190:43;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:357;;;338:44;399:19;;3146:190:43;;;;;;;;;3346:12;:16;;-1:-1:-1;;3346:16:43;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;-1:-1:-1;;3406:20:43;;;;;3372:65;1895:174:148::1;480:42:199;2042:15:148::0;1895:19:::1;:174::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;-1:-1:-1;;3491:21:43;;;3531:14;;-1:-1:-1;581:36:357;;3531:14:43;;569:2:357;554:18;3531:14:43;;;;;;;3457:99;3090:472;1813:263:148;:::o;1175:320:59:-;-1:-1:-1;;;;;1465:19:59;;:23;;;1175:320::o;3043:234:224:-;4888:13:43;;;;;;;4880:69;;;;-1:-1:-1;;;4880:69:43;;830:2:357;4880:69:43;;;812:21:357;869:2;849:18;;;842:30;908:34;888:18;;;881:62;-1:-1:-1;;;959:18:357;;;952:41;1010:19;;4880:69:43;628:407:357;4880:69:43;3212:9:224::1;:22:::0;;-1:-1:-1;;;;;3212:22:224;;::::1;-1:-1:-1::0;;;;;;3212:22:224;;::::1;;::::0;;;3244:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;3043:234::o;628:407:357:-;1389:4507:148;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100be5760003560e01c80637f46ddb211610076578063aa5574521161005b578063aa557452146101c9578063c4d66de8146101dc578063c89701a2146101ef57600080fd5b80637f46ddb21461018d578063927ede2d146101ab57600080fd5b806354fd4d50116100a757806354fd4d50146101225780635c975abb1461016b578063761f44931461017a57600080fd5b80633687011a146100c35780633cb747bf146100d8575b600080fd5b6100d66100d136600461128a565b61020f565b005b6001546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61015e6040518060400160405280600581526020017f312e372e3000000000000000000000000000000000000000000000000000000081525081565b6040516101199190611378565b60405160008152602001610119565b6100d661018836600461138b565b6102bb565b60025473ffffffffffffffffffffffffffffffffffffffff166100f8565b60015473ffffffffffffffffffffffffffffffffffffffff166100f8565b6100d66101d7366004611423565b6107d9565b6100d66101ea36600461149a565b610895565b6002546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b333b156102a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102b38686333388888888610a5a565b505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156103905750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa158015610354573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037891906114b7565b73ffffffffffffffffffffffffffffffffffffffff16145b61041c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161029a565b3073ffffffffffffffffffffffffffffffffffffffff8816036104c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c324552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161029a565b6104eb877f74259ebf00000000000000000000000000000000000000000000000000000000610fc2565b610577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324552433732314272696467653a206c6f63616c20746f6b656e20696e746560448201527f7266616365206973206e6f7420636f6d706c69616e7400000000000000000000606482015260840161029a565b8673ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e691906114b7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146106c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4c324552433732314272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433732312060648201527f6c6f63616c20746f6b656e000000000000000000000000000000000000000000608482015260a40161029a565b6040517fa144819400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301526024820185905288169063a144819490604401600060405180830381600087803b15801561073657600080fd5b505af115801561074a573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac878787876040516107c8949392919061151d565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff851661087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161029a565b61088c8787338888888888610a5a565b50505050505050565b600054610100900460ff16158080156108b55750600054600160ff909116105b806108cf5750303b1580156108cf575060005460ff166001145b61095b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161029a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156109b957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109d773420000000000000000000000000000000000000783610fe5565b8015610a3a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c324552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161029a565b6040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff891690636352211e90602401602060405180830381865afa158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c91906114b7565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610c46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324552433732314272696467653a205769746864726177616c206973206e6f60448201527f74206265696e6720696e69746961746564206279204e4654206f776e65720000606482015260840161029a565b60008873ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb791906114b7565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c324552433732314272696467653a2072656d6f746520746f6b656e20646f6560448201527f73206e6f74206d6174636820676976656e2076616c7565000000000000000000606482015260840161029a565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018790528a1690639dc29fac90604401600060405180830381600087803b158015610de457600080fd5b505af1158015610df8573d6000803e3d6000fd5b50505050600063761f449360e01b828b8a8a8a8989604051602401610e23979695949392919061155d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260015460025492517f3dbb202b00000000000000000000000000000000000000000000000000000000815291935073ffffffffffffffffffffffffffffffffffffffff90811692633dbb202b92610f0292919091169085908a906004016115ba565b600060405180830381600087803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a58a8a8989604051610fae949392919061151d565b60405180910390a450505050505050505050565b6000610fcd836110cf565b8015610fde5750610fde8383611134565b9392505050565b600054610100900460ff1661107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161029a565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b60006110fb827f01ffc9a700000000000000000000000000000000000000000000000000000000611134565b801561112e575061112c827fffffffff00000000000000000000000000000000000000000000000000000000611134565b155b92915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156111ec575060208210155b80156111f85750600081115b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461122557600080fd5b50565b803563ffffffff8116811461123c57600080fd5b919050565b60008083601f84011261125357600080fd5b50813567ffffffffffffffff81111561126b57600080fd5b60208301915083602082850101111561128357600080fd5b9250929050565b60008060008060008060a087890312156112a357600080fd5b86356112ae81611203565b955060208701356112be81611203565b9450604087013593506112d360608801611228565b9250608087013567ffffffffffffffff8111156112ef57600080fd5b6112fb89828a01611241565b979a9699509497509295939492505050565b6000815180845260005b8181101561133357602081850181015186830182015201611317565b81811115611345576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610fde602083018461130d565b600080600080600080600060c0888a0312156113a657600080fd5b87356113b181611203565b965060208801356113c181611203565b955060408801356113d181611203565b945060608801356113e181611203565b93506080880135925060a088013567ffffffffffffffff81111561140457600080fd5b6114108a828b01611241565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561143e57600080fd5b873561144981611203565b9650602088013561145981611203565b9550604088013561146981611203565b94506060880135935061147e60808901611228565b925060a088013567ffffffffffffffff81111561140457600080fd5b6000602082840312156114ac57600080fd5b8135610fde81611203565b6000602082840312156114c957600080fd5b8151610fde81611203565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006115536060830184866114d4565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526115ad60c0830184866114d4565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006115e9606083018561130d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a","sourceMap":"1389:4507:148:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5688:971:224;;;;;;:::i;:::-;;:::i;:::-;;829:37;;;;;;;;;;;;1732:42:357;1720:55;;;1702:74;;1690:2;1675:18;829:37:224;;;;;;;;1473:40:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4239:82:224:-;;;4286:4;2688:41:357;;2676:2;2661:18;4239:82:224;2548:187:357;2843:1275:148;;;;;;:::i;:::-;;:::i;3858:98:224:-;3938:11;;;;3858:98;;3511:99;3594:9;;;;3511:99;;7885:428;;;;;;:::i;:::-;;:::i;1813:263:148:-;;;;;;:::i;:::-;;:::i;967:33:224:-;;;;;;;;;5688:971;6472:10;1465:19:59;:23;6444:89:224;;;;;;;5483:2:357;6444:89:224;;;5465:21:357;5522:2;5502:18;;;5495:30;5561:34;5541:18;;;5534:62;5632:15;5612:18;;;5605:43;5665:19;;6444:89:224;;;;;;;;;6544:108;6566:11;6579:12;6593:10;6605;6617:8;6627:12;6641:10;;6544:21;:108::i;:::-;5688:971;;;;;;:::o;2843:1275:148:-;2669:9:224;;;;2647:10;:32;:92;;;;-1:-1:-1;2727:11:224;;;2683:9;:32;;;;;;;;2727:11;;;;;2683:9;;;;:30;;:32;;;;;;;;;;;;;;;:9;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;2647:92;2626:202;;;;;;;6153:2:357;2626:202:224;;;6135:21:357;6192:2;6172:18;;;6165:30;6231:34;6211:18;;;6204:62;6302:33;6282:18;;;6275:61;6353:19;;2626:202:224;5951:427:357;2626:202:224;3129:4:148::1;3106:28;::::0;::::1;::::0;3098:83:::1;;;::::0;::::1;::::0;;6585:2:357;3098:83:148::1;::::0;::::1;6567:21:357::0;6624:2;6604:18;;;6597:30;6663:34;6643:18;;;6636:62;6734:12;6714:18;;;6707:40;6764:19;;3098:83:148::1;6383:406:357::0;3098:83:148::1;3331:87;3363:11;3376:41;3331:31;:87::i;:::-;3310:188;;;::::0;::::1;::::0;;6996:2:357;3310:188:148::1;::::0;::::1;6978:21:357::0;7035:2;7015:18;;;7008:30;7074:34;7054:18;;;7047:62;7145:24;7125:18;;;7118:52;7187:19;;3310:188:148::1;6794:418:357::0;3310:188:148::1;3570:11;3546:48;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3530:66;;:12;:66;;;3509:188;;;::::0;::::1;::::0;;7419:2:357;3509:188:148::1;::::0;::::1;7401:21:357::0;7458:2;7438:18;;;7431:30;7497:34;7477:18;;;7470:62;7568:34;7548:18;;;7541:62;7640:13;7619:19;;;7612:42;7671:19;;3509:188:148::1;7217:479:357::0;3509:188:148::1;3898:60;::::0;;;;:45:::1;7893:55:357::0;;;3898:60:148::1;::::0;::::1;7875:74:357::0;7965:18;;;7958:34;;;3898:45:148;::::1;::::0;::::1;::::0;7848:18:357;;3898:60:148::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4078:5;4029:82;;4064:12;4029:82;;4051:11;4029:82;;;4085:3;4090:8;4100:10;;4029:82;;;;;;;;;:::i;:::-;;;;;;;;2843:1275:::0;;;;;;;:::o;7885:428:224:-;8124:17;;;8116:78;;;;;;;8975:2:357;8116:78:224;;;8957:21:357;9014:2;8994:18;;;8987:30;9053:34;9033:18;;;9026:62;9124:18;9104;;;9097:46;9160:19;;8116:78:224;8773:412:357;8116:78:224;8205:101;8227:11;8240:12;8254:10;8266:3;8271:8;8281:12;8295:10;;8205:21;:101::i;:::-;7885:428;;;;;;;:::o;1813:263:148:-;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;-1:-1:-1;3236:4:43;1465:19:59;:23;;;3208:55:43;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;;;;9392:2:357;3146:190:43;;;9374:21:357;9431:2;9411:18;;;9404:30;9470:34;9450:18;;;9443:62;9541:16;9521:18;;;9514:44;9575:19;;3146:190:43;9190:410:357;3146:190:43;3346:12;:16;;;;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;;;;;;;3372:65;1895:174:148::1;480:42:199;2042:15:148;1895:19;:174::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;;;;;3531:14;;-1:-1:-1;9757:36:357;;3531:14:43;;9745:2:357;9730:18;3531:14:43;;;;;;;3457:99;3090:472;1813:263:148;:::o;1175:320:59:-;1465:19;;;:23;;;1175:320::o;4157:1737:148:-;4443:26;;;4435:88;;;;;;;10006:2:357;4435:88:148;;;9988:21:357;10045:2;10025:18;;;10018:30;10084:34;10064:18;;;10057:62;10155:19;10135:18;;;10128:47;10192:19;;4435:88:148;9804:413:357;4435:88:148;4637:54;;;;;;;;10368:25:357;;;4637:44:148;;;;;;10341:18:357;;4637:54:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4628:63;;:5;:63;;;4607:172;;;;;;;10606:2:357;4607:172:148;;;10588:21:357;10645:2;10625:18;;;10618:30;10684:34;10664:18;;;10657:62;10755:32;10735:18;;;10728:60;10805:19;;4607:172:148;10404:426:357;4607:172:148;4930:19;4976:11;4952:48;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4930:72;;5035:12;5020:27;;:11;:27;;;5012:95;;;;;;;11037:2:357;5012:95:148;;;11019:21:357;11076:2;11056:18;;;11049:30;11115:34;11095:18;;;11088:62;11186:25;11166:18;;;11159:53;11229:19;;5012:95:148;10835:419:357;5012:95:148;5287:58;;;;;:41;7893:55:357;;;5287:58:148;;;7875:74:357;7965:18;;;7958:34;;;5287:41:148;;;;;7848:18:357;;5287:58:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5356:20;5415:44;;;5461:11;5474;5487:5;5494:3;5499:8;5509:10;;5379:150;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5632:9;;5673:11;;5632:103;;;;;5379:150;;-1:-1:-1;5632:9:148;;;;;:21;;:103;;5673:11;;;;;5379:150;;5720:12;;5632:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5854:5;5806:81;;5841:11;5806:81;;5828:11;5806:81;;;5861:3;5866:8;5876:10;;5806:81;;;;;;;;;:::i;:::-;;;;;;;;4425:1469;;4157:1737;;;;;;;;:::o;1333:274:67:-;1420:4;1527:23;1542:7;1527:14;:23::i;:::-;:73;;;;;1554:46;1579:7;1588:11;1554:24;:46::i;:::-;1520:80;1333:274;-1:-1:-1;;;1333:274:67:o;3043:234:224:-;4888:13:43;;;;;;;4880:69;;;;;;;12595:2:357;4880:69:43;;;12577:21:357;12634:2;12614:18;;;12607:30;12673:34;12653:18;;;12646:62;12744:13;12724:18;;;12717:41;12775:19;;4880:69:43;12393:407:357;4880:69:43;3212:9:224::1;:22:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;3244:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;3043:234::o;704:411:67:-;768:4;975:60;1000:7;1009:25;975:24;:60::i;:::-;:133;;;;-1:-1:-1;1052:56:67;1077:7;1086:21;1052:24;:56::i;:::-;1051:57;975:133;956:152;704:411;-1:-1:-1;;704:411:67:o;4223:638::-;4385:71;;;12979:66:357;12967:79;;4385:71:67;;;;12949:98:357;;;;4385:71:67;;;;;;;;;;12922:18:357;;;;4385:71:67;;;;;;;;;;;4408:34;4385:71;;;4664:20;;4316:4;;4385:71;4316:4;;;;;;4385:71;4316:4;;4664:20;4629:7;4622:5;4611:86;4600:97;;4724:16;4710:30;;4774:4;4768:11;4753:26;;4806:7;:29;;;;;4831:4;4817:10;:18;;4806:29;:48;;;;;4853:1;4839:11;:15;4806:48;4799:55;4223:638;-1:-1:-1;;;;;;;4223:638:67:o;14:154:357:-;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;69:93;14:154;:::o;173:163::-;240:20;;300:10;289:22;;279:33;;269:61;;326:1;323;316:12;269:61;173:163;;;:::o;341:347::-;392:8;402:6;456:3;449:4;441:6;437:17;433:27;423:55;;474:1;471;464:12;423:55;-1:-1:-1;497:20:357;;540:18;529:30;;526:50;;;572:1;569;562:12;526:50;609:4;601:6;597:17;585:29;;661:3;654:4;645:6;637;633:19;629:30;626:39;623:59;;;678:1;675;668:12;623:59;341:347;;;;;:::o;693:827::-;798:6;806;814;822;830;838;891:3;879:9;870:7;866:23;862:33;859:53;;;908:1;905;898:12;859:53;947:9;934:23;966:31;991:5;966:31;:::i;:::-;1016:5;-1:-1:-1;1073:2:357;1058:18;;1045:32;1086:33;1045:32;1086:33;:::i;:::-;1138:7;-1:-1:-1;1192:2:357;1177:18;;1164:32;;-1:-1:-1;1215:37:357;1248:2;1233:18;;1215:37;:::i;:::-;1205:47;;1303:3;1292:9;1288:19;1275:33;1331:18;1323:6;1320:30;1317:50;;;1363:1;1360;1353:12;1317:50;1402:58;1452:7;1443:6;1432:9;1428:22;1402:58;:::i;:::-;693:827;;;;-1:-1:-1;693:827:357;;-1:-1:-1;693:827:357;;1479:8;;693:827;-1:-1:-1;;;693:827:357:o;1787:531::-;1829:3;1867:5;1861:12;1894:6;1889:3;1882:19;1919:1;1929:162;1943:6;1940:1;1937:13;1929:162;;;2005:4;2061:13;;;2057:22;;2051:29;2033:11;;;2029:20;;2022:59;1958:12;1929:162;;;2109:6;2106:1;2103:13;2100:87;;;2175:1;2168:4;2159:6;2154:3;2150:16;2146:27;2139:38;2100:87;-1:-1:-1;2232:2:357;2220:15;2237:66;2216:88;2207:98;;;;2307:4;2203:109;;1787:531;-1:-1:-1;;1787:531:357:o;2323:220::-;2472:2;2461:9;2454:21;2435:4;2492:45;2533:2;2522:9;2518:18;2510:6;2492:45;:::i;2740:1038::-;2855:6;2863;2871;2879;2887;2895;2903;2956:3;2944:9;2935:7;2931:23;2927:33;2924:53;;;2973:1;2970;2963:12;2924:53;3012:9;2999:23;3031:31;3056:5;3031:31;:::i;:::-;3081:5;-1:-1:-1;3138:2:357;3123:18;;3110:32;3151:33;3110:32;3151:33;:::i;:::-;3203:7;-1:-1:-1;3262:2:357;3247:18;;3234:32;3275:33;3234:32;3275:33;:::i;:::-;3327:7;-1:-1:-1;3386:2:357;3371:18;;3358:32;3399:33;3358:32;3399:33;:::i;:::-;3451:7;-1:-1:-1;3505:3:357;3490:19;;3477:33;;-1:-1:-1;3561:3:357;3546:19;;3533:33;3589:18;3578:30;;3575:50;;;3621:1;3618;3611:12;3575:50;3660:58;3710:7;3701:6;3690:9;3686:22;3660:58;:::i;:::-;2740:1038;;;;-1:-1:-1;2740:1038:357;;-1:-1:-1;2740:1038:357;;;;3634:84;;-1:-1:-1;;;2740:1038:357:o;4047:969::-;4161:6;4169;4177;4185;4193;4201;4209;4262:3;4250:9;4241:7;4237:23;4233:33;4230:53;;;4279:1;4276;4269:12;4230:53;4318:9;4305:23;4337:31;4362:5;4337:31;:::i;:::-;4387:5;-1:-1:-1;4444:2:357;4429:18;;4416:32;4457:33;4416:32;4457:33;:::i;:::-;4509:7;-1:-1:-1;4568:2:357;4553:18;;4540:32;4581:33;4540:32;4581:33;:::i;:::-;4633:7;-1:-1:-1;4687:2:357;4672:18;;4659:32;;-1:-1:-1;4710:38:357;4743:3;4728:19;;4710:38;:::i;:::-;4700:48;;4799:3;4788:9;4784:19;4771:33;4827:18;4819:6;4816:30;4813:50;;;4859:1;4856;4849:12;5021:255;5088:6;5141:2;5129:9;5120:7;5116:23;5112:32;5109:52;;;5157:1;5154;5147:12;5109:52;5196:9;5183:23;5215:31;5240:5;5215:31;:::i;5695:251::-;5765:6;5818:2;5806:9;5797:7;5793:23;5789:32;5786:52;;;5834:1;5831;5824:12;5786:52;5866:9;5860:16;5885:31;5910:5;5885:31;:::i;8003:325::-;8091:6;8086:3;8079:19;8143:6;8136:5;8129:4;8124:3;8120:14;8107:43;;8195:1;8188:4;8179:6;8174:3;8170:16;8166:27;8159:38;8061:3;8317:4;8247:66;8242:2;8234:6;8230:15;8226:88;8221:3;8217:98;8213:109;8206:116;;8003:325;;;;:::o;8333:435::-;8558:42;8550:6;8546:55;8535:9;8528:74;8638:6;8633:2;8622:9;8618:18;8611:34;8681:2;8676;8665:9;8661:18;8654:30;8509:4;8701:61;8758:2;8747:9;8743:18;8735:6;8727;8701:61;:::i;:::-;8693:69;8333:435;-1:-1:-1;;;;;;8333:435:357:o;11259:700::-;11519:4;11548:42;11629:2;11621:6;11617:15;11606:9;11599:34;11681:2;11673:6;11669:15;11664:2;11653:9;11649:18;11642:43;11733:2;11725:6;11721:15;11716:2;11705:9;11701:18;11694:43;11785:2;11777:6;11773:15;11768:2;11757:9;11753:18;11746:43;;11826:6;11820:3;11809:9;11805:19;11798:35;11870:3;11864;11853:9;11849:19;11842:32;11891:62;11948:3;11937:9;11933:19;11925:6;11917;11891:62;:::i;:::-;11883:70;11259:700;-1:-1:-1;;;;;;;;;11259:700:357:o;11964:424::-;12177:42;12169:6;12165:55;12154:9;12147:74;12257:2;12252;12241:9;12237:18;12230:30;12128:4;12277:45;12318:2;12307:9;12303:18;12295:6;12277:45;:::i;:::-;12269:53;;12370:10;12362:6;12358:23;12353:2;12342:9;12338:18;12331:51;11964:424;;;;;;:::o","linkReferences":{}},"methodIdentifiers":{"MESSENGER()":"927ede2d","OTHER_BRIDGE()":"7f46ddb2","bridgeERC721(address,address,uint256,uint32,bytes)":"3687011a","bridgeERC721To(address,address,address,uint256,uint32,bytes)":"aa557452","finalizeBridgeERC721(address,address,address,address,uint256,bytes)":"761f4493","initialize(address)":"c4d66de8","messenger()":"3cb747bf","otherBridge()":"c89701a2","paused()":"5c975abb","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC721BridgeFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC721BridgeInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_BRIDGE\",\"outputs\":[{\"internalType\":\"contract StandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC721To\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeBridgeERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_l1ERC721Bridge\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"otherBridge\",\"outputs\":[{\"internalType\":\"contract StandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"MESSENGER()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Messenger contract on this domain.\"}},\"OTHER_BRIDGE()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Contract of the bridge on the other network.\"}},\"bridgeERC721(address,address,uint256,uint32,bytes)\":{\"params\":{\"_extraData\":\"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.\",\"_localToken\":\"Address of the ERC721 on this domain.\",\"_minGasLimit\":\"Minimum gas limit for the bridge message on the other domain.\",\"_remoteToken\":\"Address of the ERC721 on the remote domain.\",\"_tokenId\":\"Token ID to bridge.\"}},\"bridgeERC721To(address,address,address,uint256,uint32,bytes)\":{\"params\":{\"_extraData\":\"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.\",\"_localToken\":\"Address of the ERC721 on this domain.\",\"_minGasLimit\":\"Minimum gas limit for the bridge message on the other domain.\",\"_remoteToken\":\"Address of the ERC721 on the remote domain.\",\"_to\":\"Address to receive the token on the other domain.\",\"_tokenId\":\"Token ID to bridge.\"}},\"finalizeBridgeERC721(address,address,address,address,uint256,bytes)\":{\"params\":{\"_extraData\":\"Optional data to forward to L1. Data supplied here will not be used to execute any code on L1 and is only emitted as extra data for the convenience of off-chain tooling.\",\"_from\":\"Address that triggered the bridge on the other domain.\",\"_localToken\":\"Address of the ERC721 token on this domain.\",\"_remoteToken\":\"Address of the ERC721 token on the other domain.\",\"_to\":\"Address to receive the token on this domain.\",\"_tokenId\":\"ID of the token being deposited.\"}},\"initialize(address)\":{\"params\":{\"_l1ERC721Bridge\":\"Address of the ERC721 bridge contract on the other network.\"}},\"paused()\":{\"returns\":{\"_0\":\"Whether or not the contract is paused.\"}}},\"stateVariables\":{\"version\":{\"custom:semver\":\"1.7.0\"}},\"title\":\"L2ERC721Bridge\",\"version\":1},\"userdoc\":{\"events\":{\"ERC721BridgeFinalized(address,address,address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ERC721 bridge from the other network is finalized.\"},\"ERC721BridgeInitiated(address,address,address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ERC721 bridge to the other network is initiated.\"}},\"kind\":\"user\",\"methods\":{\"MESSENGER()\":{\"notice\":\"Legacy getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead.\"},\"OTHER_BRIDGE()\":{\"notice\":\"Legacy getter for other bridge address. Public getter is legacy and will be removed in the future. Use `otherBridge` instead.\"},\"bridgeERC721(address,address,uint256,uint32,bytes)\":{\"notice\":\"Initiates a bridge of an NFT to the caller's account on the other chain. Note that this function can only be called by EOAs. Smart contract wallets should use the `bridgeERC721To` function after ensuring that the recipient address on the remote chain exists. Also note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2.\"},\"bridgeERC721To(address,address,address,uint256,uint32,bytes)\":{\"notice\":\"Initiates a bridge of an NFT to some recipient's account on the other chain. Note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2.\"},\"constructor\":{\"notice\":\"Constructs the L2ERC721Bridge contract.\"},\"finalizeBridgeERC721(address,address,address,address,uint256,bytes)\":{\"notice\":\"Completes an ERC721 bridge from the other domain and sends the ERC721 token to the recipient on this domain.\"},\"initialize(address)\":{\"notice\":\"Initializes the contract.\"},\"messenger()\":{\"notice\":\"Messenger contract on this domain.\"},\"otherBridge()\":{\"notice\":\"Contract of the bridge on the other network.\"},\"paused()\":{\"notice\":\"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op.\"}},\"notice\":\"The L2 ERC721 bridge is a contract which works together with the L1 ERC721 bridge to make it possible to transfer ERC721 tokens from Ethereum to Optimism. This contract acts as a minter for new tokens when it hears about deposits into the L1 ERC721 bridge. This contract also acts as a burner for tokens being withdrawn. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge ONLY supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L2/L2ERC721Bridge.sol\":\"L2ERC721Bridge\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0\",\"dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95\",\"dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6\",\"dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf\"]},\"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0xed6a749c5373af398105ce6ee3ac4763aa450ea7285d268c85d9eeca809cdb1f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://20a97f891d06f0fe91560ea1a142aaa26fdd22bed1b51606b7d48f670deeb50f\",\"dweb:/ipfs/QmTbCtZKChpaX5H2iRiTDMcSz29GSLCpTCDgJpcMR4wg8x\"]},\"lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol\":{\"keccak256\":\"0xd1556954440b31c97a142c6ba07d5cade45f96fafd52091d33a14ebe365aecbf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26fef835622b46a5ba08b3ef6b46a22e94b5f285d0f0fb66b703bd30217d2c34\",\"dweb:/ipfs/QmZ548qdwfL1qF7aXz3xh1GCdTiST81kGGuKRqVUfYmPZR\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\":{\"keccak256\":\"0xc65c83c1039508fa7a42a09a3c6a32babd1c438ba4dbb23581255e784b5d5eed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1b3b38db0f76429db899909025e534c366415e9ea8b5ddc4c8901e6a7fc1461\",\"dweb:/ipfs/QmYv1KxyHjLEky9JWNSsSfpGJbiCxFyzVFgTwQKpiqYGUg\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"src/L1/L1ERC721Bridge.sol\":{\"keccak256\":\"0x2a3177a2b025bf7ac58450d7dfc7f4f984a265b651d9f57f83c4b43d9fe5ebdd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2f24ea47b324c2683f3dd00f5b47c93bfe7b45fda3dd85c2fc08999c2f1e62db\",\"dweb:/ipfs/QmTKM64r67YGyRamy2pwBA47N7HeD6fk5HEMd3nM3vNkAK\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409\",\"dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM\"]},\"src/L1/SuperchainConfig.sol\":{\"keccak256\":\"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f\",\"dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB\"]},\"src/L2/L2ERC721Bridge.sol\":{\"keccak256\":\"0xcacb39a7b6e5d2d5293834195363397010130ab88d2f4de860277dae6d4265f9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f6cdcf63276957f9ca614567394b11ab3f6877baa5a6d33bf54dd8022ca2021f\",\"dweb:/ipfs/QmZQBBfjk2UPLFtKeTd5DJCTRWw1KxKbQMmWr8WVDzZsat\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72\",\"dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b\",\"dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp\"]},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff\",\"dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA\"]},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12\",\"dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF\"]},\"src/libraries/Predeploys.sol\":{\"keccak256\":\"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663\",\"dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe\"]},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"]},\"src/libraries/Storage.sol\":{\"keccak256\":\"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269\",\"dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b\",\"dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV\"]},\"src/universal/CrossDomainMessenger.sol\":{\"keccak256\":\"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1\",\"dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n\"]},\"src/universal/ERC721Bridge.sol\":{\"keccak256\":\"0xea04387e26c6b3ba2ce5762166b7f790ccb068012f2cd5cc16c5734b47e1cb4f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://37a697c0886aa201672ded4196c3e5506903522183f27c9c3455ccdbd5e1c3cb\",\"dweb:/ipfs/QmdxhxBFR8J2obRzuFCMtUirB4Fsc8CvKwNwR8DFc9SEGK\"]},\"src/universal/IOptimismMintableERC20.sol\":{\"keccak256\":\"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf\",\"dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ\"]},\"src/universal/IOptimismMintableERC721.sol\":{\"keccak256\":\"0xb3a65b067e67a9e1fa0493401c8d247970377c6725eba4e7b02ce8099c4f4f52\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://86bb6864027560ade2f4ced6a6e34213cbff8002977dc365377e5a0b473cf17b\",\"dweb:/ipfs/QmQvjtodTK27as1g1PzsYk9NyJJ3X6a6251o1vrBwx7DPT\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"src/universal/OptimismMintableERC20.sol\":{\"keccak256\":\"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7\",\"dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa\"]},\"src/universal/StandardBridge.sol\":{\"keccak256\":\"0x1a2f6afd7f14430ae2b797e09497c3dc860ed5db752e1847e30649668060c01d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fefe1356cdeb5b324e4e63e1c723c08f9e244ef2ef133b9f5df0cc0d180eeaa8\",\"dweb:/ipfs/QmZzR3zWKodwdwrdWwXUyh7G3qcFn2cjUQLrE45gRyQMn3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"localToken","type":"address","indexed":true},{"internalType":"address","name":"remoteToken","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ERC721BridgeFinalized","anonymous":false},{"inputs":[{"internalType":"address","name":"localToken","type":"address","indexed":true},{"internalType":"address","name":"remoteToken","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"tokenId","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ERC721BridgeInitiated","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MESSENGER","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"OTHER_BRIDGE","outputs":[{"internalType":"contract StandardBridge","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"bridgeERC721"},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"bridgeERC721To"},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"finalizeBridgeERC721"},{"inputs":[{"internalType":"address payable","name":"_l1ERC721Bridge","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"messenger","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"otherBridge","outputs":[{"internalType":"contract StandardBridge","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"MESSENGER()":{"custom:legacy":"","returns":{"_0":"Messenger contract on this domain."}},"OTHER_BRIDGE()":{"custom:legacy":"","returns":{"_0":"Contract of the bridge on the other network."}},"bridgeERC721(address,address,uint256,uint32,bytes)":{"params":{"_extraData":"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.","_localToken":"Address of the ERC721 on this domain.","_minGasLimit":"Minimum gas limit for the bridge message on the other domain.","_remoteToken":"Address of the ERC721 on the remote domain.","_tokenId":"Token ID to bridge."}},"bridgeERC721To(address,address,address,uint256,uint32,bytes)":{"params":{"_extraData":"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.","_localToken":"Address of the ERC721 on this domain.","_minGasLimit":"Minimum gas limit for the bridge message on the other domain.","_remoteToken":"Address of the ERC721 on the remote domain.","_to":"Address to receive the token on the other domain.","_tokenId":"Token ID to bridge."}},"finalizeBridgeERC721(address,address,address,address,uint256,bytes)":{"params":{"_extraData":"Optional data to forward to L1. Data supplied here will not be used to execute any code on L1 and is only emitted as extra data for the convenience of off-chain tooling.","_from":"Address that triggered the bridge on the other domain.","_localToken":"Address of the ERC721 token on this domain.","_remoteToken":"Address of the ERC721 token on the other domain.","_to":"Address to receive the token on this domain.","_tokenId":"ID of the token being deposited."}},"initialize(address)":{"params":{"_l1ERC721Bridge":"Address of the ERC721 bridge contract on the other network."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}}},"version":1},"userdoc":{"kind":"user","methods":{"MESSENGER()":{"notice":"Legacy getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead."},"OTHER_BRIDGE()":{"notice":"Legacy getter for other bridge address. Public getter is legacy and will be removed in the future. Use `otherBridge` instead."},"bridgeERC721(address,address,uint256,uint32,bytes)":{"notice":"Initiates a bridge of an NFT to the caller's account on the other chain. Note that this function can only be called by EOAs. Smart contract wallets should use the `bridgeERC721To` function after ensuring that the recipient address on the remote chain exists. Also note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2."},"bridgeERC721To(address,address,address,uint256,uint32,bytes)":{"notice":"Initiates a bridge of an NFT to some recipient's account on the other chain. Note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2."},"constructor":{"notice":"Constructs the L2ERC721Bridge contract."},"finalizeBridgeERC721(address,address,address,address,uint256,bytes)":{"notice":"Completes an ERC721 bridge from the other domain and sends the ERC721 token to the recipient on this domain."},"initialize(address)":{"notice":"Initializes the contract."},"messenger()":{"notice":"Messenger contract on this domain."},"otherBridge()":{"notice":"Contract of the bridge on the other network."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L2/L2ERC721Bridge.sol":"L2ERC721Bridge"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66","urls":["bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f","dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"keccak256":"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238","urls":["bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0","dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca","urls":["bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd","dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"keccak256":"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329","urls":["bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95","dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29","urls":["bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6","dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol":{"keccak256":"0xed6a749c5373af398105ce6ee3ac4763aa450ea7285d268c85d9eeca809cdb1f","urls":["bzz-raw://20a97f891d06f0fe91560ea1a142aaa26fdd22bed1b51606b7d48f670deeb50f","dweb:/ipfs/QmTbCtZKChpaX5H2iRiTDMcSz29GSLCpTCDgJpcMR4wg8x"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol":{"keccak256":"0xd1556954440b31c97a142c6ba07d5cade45f96fafd52091d33a14ebe365aecbf","urls":["bzz-raw://26fef835622b46a5ba08b3ef6b46a22e94b5f285d0f0fb66b703bd30217d2c34","dweb:/ipfs/QmZ548qdwfL1qF7aXz3xh1GCdTiST81kGGuKRqVUfYmPZR"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"keccak256":"0xc65c83c1039508fa7a42a09a3c6a32babd1c438ba4dbb23581255e784b5d5eed","urls":["bzz-raw://a1b3b38db0f76429db899909025e534c366415e9ea8b5ddc4c8901e6a7fc1461","dweb:/ipfs/QmYv1KxyHjLEky9JWNSsSfpGJbiCxFyzVFgTwQKpiqYGUg"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1","urls":["bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f","dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0","urls":["bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929","dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7","urls":["bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689","dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy"],"license":"MIT"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d","urls":["bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c","dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8"],"license":"MIT"},"src/L1/L1ERC721Bridge.sol":{"keccak256":"0x2a3177a2b025bf7ac58450d7dfc7f4f984a265b651d9f57f83c4b43d9fe5ebdd","urls":["bzz-raw://2f24ea47b324c2683f3dd00f5b47c93bfe7b45fda3dd85c2fc08999c2f1e62db","dweb:/ipfs/QmTKM64r67YGyRamy2pwBA47N7HeD6fk5HEMd3nM3vNkAK"],"license":"MIT"},"src/L1/ResourceMetering.sol":{"keccak256":"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408","urls":["bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409","dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM"],"license":"MIT"},"src/L1/SuperchainConfig.sol":{"keccak256":"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d","urls":["bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f","dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB"],"license":"MIT"},"src/L2/L2ERC721Bridge.sol":{"keccak256":"0xcacb39a7b6e5d2d5293834195363397010130ab88d2f4de860277dae6d4265f9","urls":["bzz-raw://f6cdcf63276957f9ca614567394b11ab3f6877baa5a6d33bf54dd8022ca2021f","dweb:/ipfs/QmZQBBfjk2UPLFtKeTd5DJCTRWw1KxKbQMmWr8WVDzZsat"],"license":"MIT"},"src/libraries/Arithmetic.sol":{"keccak256":"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db","urls":["bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72","dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq"],"license":"MIT"},"src/libraries/Burn.sol":{"keccak256":"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010","urls":["bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f","dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"],"license":"MIT"},"src/libraries/Constants.sol":{"keccak256":"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132","urls":["bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b","dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp"],"license":"MIT"},"src/libraries/Encoding.sol":{"keccak256":"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87","urls":["bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff","dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA"],"license":"MIT"},"src/libraries/Hashing.sol":{"keccak256":"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8","urls":["bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12","dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF"],"license":"MIT"},"src/libraries/Predeploys.sol":{"keccak256":"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02","urls":["bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663","dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe"],"license":"MIT"},"src/libraries/SafeCall.sol":{"keccak256":"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f","urls":["bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a","dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq"],"license":"MIT"},"src/libraries/Storage.sol":{"keccak256":"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f","urls":["bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269","dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK"],"license":"MIT"},"src/libraries/Types.sol":{"keccak256":"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4","urls":["bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e","dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"],"license":"MIT"},"src/libraries/rlp/RLPWriter.sol":{"keccak256":"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6","urls":["bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b","dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV"],"license":"MIT"},"src/universal/CrossDomainMessenger.sol":{"keccak256":"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0","urls":["bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1","dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n"],"license":"MIT"},"src/universal/ERC721Bridge.sol":{"keccak256":"0xea04387e26c6b3ba2ce5762166b7f790ccb068012f2cd5cc16c5734b47e1cb4f","urls":["bzz-raw://37a697c0886aa201672ded4196c3e5506903522183f27c9c3455ccdbd5e1c3cb","dweb:/ipfs/QmdxhxBFR8J2obRzuFCMtUirB4Fsc8CvKwNwR8DFc9SEGK"],"license":"MIT"},"src/universal/IOptimismMintableERC20.sol":{"keccak256":"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c","urls":["bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf","dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ"],"license":"MIT"},"src/universal/IOptimismMintableERC721.sol":{"keccak256":"0xb3a65b067e67a9e1fa0493401c8d247970377c6725eba4e7b02ce8099c4f4f52","urls":["bzz-raw://86bb6864027560ade2f4ced6a6e34213cbff8002977dc365377e5a0b473cf17b","dweb:/ipfs/QmQvjtodTK27as1g1PzsYk9NyJJ3X6a6251o1vrBwx7DPT"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"},"src/universal/OptimismMintableERC20.sol":{"keccak256":"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df","urls":["bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7","dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa"],"license":"MIT"},"src/universal/StandardBridge.sol":{"keccak256":"0x1a2f6afd7f14430ae2b797e09497c3dc860ed5db752e1847e30649668060c01d","urls":["bzz-raw://fefe1356cdeb5b324e4e63e1c723c08f9e244ef2ef133b9f5df0cc0d180eeaa8","dweb:/ipfs/QmZzR3zWKodwdwrdWwXUyh7G3qcFn2cjUQLrE45gRyQMn3"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":49534,"contract":"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":49537,"contract":"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":108906,"contract":"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge","label":"spacer_0_2_30","offset":2,"slot":"0","type":"t_bytes30"},{"astId":108910,"contract":"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge","label":"messenger","offset":0,"slot":"1","type":"t_contract(CrossDomainMessenger)108888"},{"astId":108914,"contract":"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge","label":"otherBridge","offset":0,"slot":"2","type":"t_contract(StandardBridge)111675"},{"astId":108919,"contract":"src/L2/L2ERC721Bridge.sol:L2ERC721Bridge","label":"__gap","offset":0,"slot":"3","type":"t_array(t_uint256)46_storage"}],"types":{"t_array(t_uint256)46_storage":{"encoding":"inplace","label":"uint256[46]","numberOfBytes":"1472","base":"t_uint256"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes30":{"encoding":"inplace","label":"bytes30","numberOfBytes":"30"},"t_contract(CrossDomainMessenger)108888":{"encoding":"inplace","label":"contract CrossDomainMessenger","numberOfBytes":"20"},"t_contract(StandardBridge)111675":{"encoding":"inplace","label":"contract StandardBridge","numberOfBytes":"20"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"version":1,"kind":"user","methods":{"MESSENGER()":{"notice":"Legacy getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead."},"OTHER_BRIDGE()":{"notice":"Legacy getter for other bridge address. Public getter is legacy and will be removed in the future. Use `otherBridge` instead."},"bridgeERC721(address,address,uint256,uint32,bytes)":{"notice":"Initiates a bridge of an NFT to the caller's account on the other chain. Note that this function can only be called by EOAs. Smart contract wallets should use the `bridgeERC721To` function after ensuring that the recipient address on the remote chain exists. Also note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2."},"bridgeERC721To(address,address,address,uint256,uint32,bytes)":{"notice":"Initiates a bridge of an NFT to some recipient's account on the other chain. Note that the current owner of the token on this chain must approve this contract to operate the NFT before it can be bridged. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge only supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2."},"constructor":{"notice":"Constructs the L2ERC721Bridge contract."},"finalizeBridgeERC721(address,address,address,address,uint256,bytes)":{"notice":"Completes an ERC721 bridge from the other domain and sends the ERC721 token to the recipient on this domain."},"initialize(address)":{"notice":"Initializes the contract."},"messenger()":{"notice":"Messenger contract on this domain."},"otherBridge()":{"notice":"Contract of the bridge on the other network."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."}},"events":{"ERC721BridgeFinalized(address,address,address,address,uint256,bytes)":{"notice":"Emitted when an ERC721 bridge from the other network is finalized."},"ERC721BridgeInitiated(address,address,address,address,uint256,bytes)":{"notice":"Emitted when an ERC721 bridge to the other network is initiated."}},"notice":"The L2 ERC721 bridge is a contract which works together with the L1 ERC721 bridge to make it possible to transfer ERC721 tokens from Ethereum to Optimism. This contract acts as a minter for new tokens when it hears about deposits into the L1 ERC721 bridge. This contract also acts as a burner for tokens being withdrawn. **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This bridge ONLY supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Optimism-native NFT can be refunded on L2."},"devdoc":{"version":1,"kind":"dev","methods":{"MESSENGER()":{"returns":{"_0":"Messenger contract on this domain."}},"OTHER_BRIDGE()":{"returns":{"_0":"Contract of the bridge on the other network."}},"bridgeERC721(address,address,uint256,uint32,bytes)":{"params":{"_extraData":"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.","_localToken":"Address of the ERC721 on this domain.","_minGasLimit":"Minimum gas limit for the bridge message on the other domain.","_remoteToken":"Address of the ERC721 on the remote domain.","_tokenId":"Token ID to bridge."}},"bridgeERC721To(address,address,address,uint256,uint32,bytes)":{"params":{"_extraData":"Optional data to forward to the other chain. Data supplied here will not be used to execute any code on the other chain and is only emitted as extra data for the convenience of off-chain tooling.","_localToken":"Address of the ERC721 on this domain.","_minGasLimit":"Minimum gas limit for the bridge message on the other domain.","_remoteToken":"Address of the ERC721 on the remote domain.","_to":"Address to receive the token on the other domain.","_tokenId":"Token ID to bridge."}},"finalizeBridgeERC721(address,address,address,address,uint256,bytes)":{"params":{"_extraData":"Optional data to forward to L1. Data supplied here will not be used to execute any code on L1 and is only emitted as extra data for the convenience of off-chain tooling.","_from":"Address that triggered the bridge on the other domain.","_localToken":"Address of the ERC721 token on this domain.","_remoteToken":"Address of the ERC721 token on the other domain.","_to":"Address to receive the token on this domain.","_tokenId":"ID of the token being deposited."}},"initialize(address)":{"params":{"_l1ERC721Bridge":"Address of the ERC721 bridge contract on the other network."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}}},"title":"L2ERC721Bridge"},"ast":{"absolutePath":"src/L2/L2ERC721Bridge.sol","id":90724,"exportedSymbols":{"Constants":[103096],"CrossDomainMessenger":[108888],"ERC165Checker":[54434],"ERC721Bridge":[109118],"IOptimismMintableERC721":[109407],"ISemver":[109417],"L1ERC721Bridge":[85418],"L2ERC721Bridge":[90723],"Predeploys":[104124],"StandardBridge":[111675]},"nodeType":"SourceUnit","src":"32:5865:148","nodes":[{"id":90490,"nodeType":"PragmaDirective","src":"32:23:148","nodes":[],"literals":["solidity","0.8",".15"]},{"id":90492,"nodeType":"ImportDirective","src":"57:62:148","nodes":[],"absolutePath":"src/universal/ERC721Bridge.sol","file":"src/universal/ERC721Bridge.sol","nameLocation":"-1:-1:-1","scope":90724,"sourceUnit":109119,"symbolAliases":[{"foreign":{"id":90491,"name":"ERC721Bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109118,"src":"66:12:148","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90494,"nodeType":"ImportDirective","src":"120:94:148","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol","file":"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol","nameLocation":"-1:-1:-1","scope":90724,"sourceUnit":54435,"symbolAliases":[{"foreign":{"id":90493,"name":"ERC165Checker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54434,"src":"129:13:148","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90496,"nodeType":"ImportDirective","src":"215:59:148","nodes":[],"absolutePath":"src/L1/L1ERC721Bridge.sol","file":"src/L1/L1ERC721Bridge.sol","nameLocation":"-1:-1:-1","scope":90724,"sourceUnit":85419,"symbolAliases":[{"foreign":{"id":90495,"name":"L1ERC721Bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85418,"src":"224:14:148","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90498,"nodeType":"ImportDirective","src":"275:84:148","nodes":[],"absolutePath":"src/universal/IOptimismMintableERC721.sol","file":"src/universal/IOptimismMintableERC721.sol","nameLocation":"-1:-1:-1","scope":90724,"sourceUnit":109408,"symbolAliases":[{"foreign":{"id":90497,"name":"IOptimismMintableERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109407,"src":"284:23:148","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90500,"nodeType":"ImportDirective","src":"360:78:148","nodes":[],"absolutePath":"src/universal/CrossDomainMessenger.sol","file":"src/universal/CrossDomainMessenger.sol","nameLocation":"-1:-1:-1","scope":90724,"sourceUnit":108889,"symbolAliases":[{"foreign":{"id":90499,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"369:20:148","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90502,"nodeType":"ImportDirective","src":"439:66:148","nodes":[],"absolutePath":"src/universal/StandardBridge.sol","file":"src/universal/StandardBridge.sol","nameLocation":"-1:-1:-1","scope":90724,"sourceUnit":111676,"symbolAliases":[{"foreign":{"id":90501,"name":"StandardBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111675,"src":"448:14:148","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90504,"nodeType":"ImportDirective","src":"506:52:148","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":90724,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":90503,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"515:7:148","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90506,"nodeType":"ImportDirective","src":"559:56:148","nodes":[],"absolutePath":"src/libraries/Constants.sol","file":"src/libraries/Constants.sol","nameLocation":"-1:-1:-1","scope":90724,"sourceUnit":103097,"symbolAliases":[{"foreign":{"id":90505,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"568:9:148","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90508,"nodeType":"ImportDirective","src":"616:58:148","nodes":[],"absolutePath":"src/libraries/Predeploys.sol","file":"src/libraries/Predeploys.sol","nameLocation":"-1:-1:-1","scope":90724,"sourceUnit":104125,"symbolAliases":[{"foreign":{"id":90507,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"625:10:148","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90723,"nodeType":"ContractDefinition","src":"1389:4507:148","nodes":[{"id":90517,"nodeType":"VariableDeclaration","src":"1473:40:148","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":90514,"nodeType":"StructuredDocumentation","src":"1444:24:148","text":"@custom:semver 1.7.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"1496:7:148","scope":90723,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":90515,"name":"string","nodeType":"ElementaryTypeName","src":"1473:6:148","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"312e372e30","id":90516,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1506:7:148","typeDescriptions":{"typeIdentifier":"t_stringliteral_fcd77289efc7773aa152b2b29fc41f05d9109a509f3f68a18547b233f97c1fdc","typeString":"literal_string \"1.7.0\""},"value":"1.7.0"},"visibility":"public"},{"id":90534,"nodeType":"FunctionDefinition","src":"1576:98:148","nodes":[],"body":{"id":90533,"nodeType":"Block","src":"1605:69:148","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30","id":90528,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1661:1:148","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":90527,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1653:7:148","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":90526,"name":"address","nodeType":"ElementaryTypeName","src":"1653:7:148","typeDescriptions":{}}},"id":90529,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1653:10:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90525,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1645:8:148","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":90524,"name":"address","nodeType":"ElementaryTypeName","src":"1645:8:148","stateMutability":"payable","typeDescriptions":{}}},"id":90530,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1645:19:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":90523,"name":"initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90553,"src":"1615:10:148","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_payable_$returns$__$","typeString":"function (address payable)"}},"id":90531,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_l1ERC721Bridge"],"nodeType":"FunctionCall","src":"1615:52:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90532,"nodeType":"ExpressionStatement","src":"1615:52:148"}]},"documentation":{"id":90518,"nodeType":"StructuredDocumentation","src":"1520:51:148","text":"@notice Constructs the L2ERC721Bridge contract."},"implemented":true,"kind":"constructor","modifiers":[{"arguments":[],"id":90521,"kind":"baseConstructorSpecifier","modifierName":{"id":90520,"name":"ERC721Bridge","nodeType":"IdentifierPath","referencedDeclaration":109118,"src":"1590:12:148"},"nodeType":"ModifierInvocation","src":"1590:14:148"}],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":90519,"nodeType":"ParameterList","parameters":[],"src":"1587:2:148"},"returnParameters":{"id":90522,"nodeType":"ParameterList","parameters":[],"src":"1605:0:148"},"scope":90723,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":90553,"nodeType":"FunctionDefinition","src":"1813:263:148","nodes":[],"body":{"id":90552,"nodeType":"Block","src":"1885:191:148","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"expression":{"id":90544,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"1962:10:148","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":90545,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L2_CROSS_DOMAIN_MESSENGER","nodeType":"MemberAccess","referencedDeclaration":104004,"src":"1962:36:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90543,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"1941:20:148","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CrossDomainMessenger_$108888_$","typeString":"type(contract CrossDomainMessenger)"}},"id":90546,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1941:58:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},{"arguments":[{"id":90548,"name":"_l1ERC721Bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90537,"src":"2042:15:148","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":90547,"name":"StandardBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111675,"src":"2027:14:148","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StandardBridge_$111675_$","typeString":"type(contract StandardBridge)"}},"id":90549,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2027:31:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"},{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}],"id":90542,"name":"__ERC721Bridge_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108995,"src":"1895:19:148","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_CrossDomainMessenger_$108888_$_t_contract$_StandardBridge_$111675_$returns$__$","typeString":"function (contract CrossDomainMessenger,contract StandardBridge)"}},"id":90550,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_messenger","_otherBridge"],"nodeType":"FunctionCall","src":"1895:174:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90551,"nodeType":"ExpressionStatement","src":"1895:174:148"}]},"documentation":{"id":90535,"nodeType":"StructuredDocumentation","src":"1680:128:148","text":"@notice Initializes the contract.\n @param _l1ERC721Bridge Address of the ERC721 bridge contract on the other network."},"functionSelector":"c4d66de8","implemented":true,"kind":"function","modifiers":[{"id":90540,"kind":"modifierInvocation","modifierName":{"id":90539,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":49598,"src":"1873:11:148"},"nodeType":"ModifierInvocation","src":"1873:11:148"}],"name":"initialize","nameLocation":"1822:10:148","parameters":{"id":90538,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90537,"mutability":"mutable","name":"_l1ERC721Bridge","nameLocation":"1849:15:148","nodeType":"VariableDeclaration","scope":90553,"src":"1833:31:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":90536,"name":"address","nodeType":"ElementaryTypeName","src":"1833:15:148","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"1832:33:148"},"returnParameters":{"id":90541,"nodeType":"ParameterList","parameters":[],"src":"1885:0:148"},"scope":90723,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":90622,"nodeType":"FunctionDefinition","src":"2843:1275:148","nodes":[],"body":{"id":90621,"nodeType":"Block","src":"3088:1030:148","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90572,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90556,"src":"3106:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":90575,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3129:4:148","typeDescriptions":{"typeIdentifier":"t_contract$_L2ERC721Bridge_$90723","typeString":"contract L2ERC721Bridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_L2ERC721Bridge_$90723","typeString":"contract L2ERC721Bridge"}],"id":90574,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3121:7:148","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":90573,"name":"address","nodeType":"ElementaryTypeName","src":"3121:7:148","typeDescriptions":{}}},"id":90576,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3121:13:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3106:28:148","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324552433732314272696467653a206c6f63616c20746f6b656e2063616e6e6f742062652073656c66","id":90578,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3136:44:148","typeDescriptions":{"typeIdentifier":"t_stringliteral_7e18be074e522c384c2b459d3f552ca9fb14628371ea9e81c37dfc2875bec911","typeString":"literal_string \"L2ERC721Bridge: local token cannot be self\""},"value":"L2ERC721Bridge: local token cannot be self"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_7e18be074e522c384c2b459d3f552ca9fb14628371ea9e81c37dfc2875bec911","typeString":"literal_string \"L2ERC721Bridge: local token cannot be self\""}],"id":90571,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3098:7:148","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":90579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3098:83:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90580,"nodeType":"ExpressionStatement","src":"3098:83:148"},{"expression":{"arguments":[{"arguments":[{"id":90584,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90556,"src":"3363:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"arguments":[{"id":90586,"name":"IOptimismMintableERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109407,"src":"3381:23:148","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IOptimismMintableERC721_$109407_$","typeString":"type(contract IOptimismMintableERC721)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IOptimismMintableERC721_$109407_$","typeString":"type(contract IOptimismMintableERC721)"}],"id":90585,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3376:4:148","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":90587,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3376:29:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IOptimismMintableERC721_$109407","typeString":"type(contract IOptimismMintableERC721)"}},"id":90588,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"interfaceId","nodeType":"MemberAccess","src":"3376:41:148","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"expression":{"id":90582,"name":"ERC165Checker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54434,"src":"3331:13:148","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC165Checker_$54434_$","typeString":"type(library ERC165Checker)"}},"id":90583,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"supportsInterface","nodeType":"MemberAccess","referencedDeclaration":54290,"src":"3331:31:148","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$","typeString":"function (address,bytes4) view returns (bool)"}},"id":90589,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3331:87:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324552433732314272696467653a206c6f63616c20746f6b656e20696e74657266616365206973206e6f7420636f6d706c69616e74","id":90590,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3432:56:148","typeDescriptions":{"typeIdentifier":"t_stringliteral_07efea2f6062b2acb6eac32db41367de7f7d64803f2496130d2183dc5a0651ad","typeString":"literal_string \"L2ERC721Bridge: local token interface is not compliant\""},"value":"L2ERC721Bridge: local token interface is not compliant"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_07efea2f6062b2acb6eac32db41367de7f7d64803f2496130d2183dc5a0651ad","typeString":"literal_string \"L2ERC721Bridge: local token interface is not compliant\""}],"id":90581,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3310:7:148","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":90591,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3310:188:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90592,"nodeType":"ExpressionStatement","src":"3310:188:148"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90600,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90594,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90558,"src":"3530:12:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":90596,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90556,"src":"3570:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90595,"name":"IOptimismMintableERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109407,"src":"3546:23:148","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IOptimismMintableERC721_$109407_$","typeString":"type(contract IOptimismMintableERC721)"}},"id":90597,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3546:36:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IOptimismMintableERC721_$109407","typeString":"contract IOptimismMintableERC721"}},"id":90598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"remoteToken","nodeType":"MemberAccess","referencedDeclaration":109400,"src":"3546:48:148","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":90599,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3546:50:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3530:66:148","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324552433732314272696467653a2077726f6e672072656d6f746520746f6b656e20666f72204f7074696d69736d204d696e7461626c6520455243373231206c6f63616c20746f6b656e","id":90601,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3610:77:148","typeDescriptions":{"typeIdentifier":"t_stringliteral_a297b13cacd808a47e4a8cb030741295c70e2e66399d9c0dd47e18d6f766c6dd","typeString":"literal_string \"L2ERC721Bridge: wrong remote token for Optimism Mintable ERC721 local token\""},"value":"L2ERC721Bridge: wrong remote token for Optimism Mintable ERC721 local token"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_a297b13cacd808a47e4a8cb030741295c70e2e66399d9c0dd47e18d6f766c6dd","typeString":"literal_string \"L2ERC721Bridge: wrong remote token for Optimism Mintable ERC721 local token\""}],"id":90593,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3509:7:148","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":90602,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3509:188:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90603,"nodeType":"ExpressionStatement","src":"3509:188:148"},{"expression":{"arguments":[{"id":90608,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90562,"src":"3944:3:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90609,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90564,"src":"3949:8:148","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":90605,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90556,"src":"3922:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90604,"name":"IOptimismMintableERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109407,"src":"3898:23:148","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IOptimismMintableERC721_$109407_$","typeString":"type(contract IOptimismMintableERC721)"}},"id":90606,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3898:36:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IOptimismMintableERC721_$109407","typeString":"contract IOptimismMintableERC721"}},"id":90607,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"safeMint","nodeType":"MemberAccess","referencedDeclaration":109362,"src":"3898:45:148","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256) external"}},"id":90610,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3898:60:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90611,"nodeType":"ExpressionStatement","src":"3898:60:148"},{"eventCall":{"arguments":[{"id":90613,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90556,"src":"4051:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90614,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90558,"src":"4064:12:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90615,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90560,"src":"4078:5:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90616,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90562,"src":"4085:3:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90617,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90564,"src":"4090:8:148","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":90618,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90566,"src":"4100:10:148","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":90612,"name":"ERC721BridgeFinalized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108949,"src":"4029:21:148","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":90619,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4029:82:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90620,"nodeType":"EmitStatement","src":"4024:87:148"}]},"documentation":{"id":90554,"nodeType":"StructuredDocumentation","src":"2082:756:148","text":"@notice Completes an ERC721 bridge from the other domain and sends the ERC721 token to the\n recipient on this domain.\n @param _localToken Address of the ERC721 token on this domain.\n @param _remoteToken Address of the ERC721 token on the other domain.\n @param _from Address that triggered the bridge on the other domain.\n @param _to Address to receive the token on this domain.\n @param _tokenId ID of the token being deposited.\n @param _extraData Optional data to forward to L1.\n Data supplied here will not be used to execute any code on L1 and is\n only emitted as extra data for the convenience of off-chain tooling."},"functionSelector":"761f4493","implemented":true,"kind":"function","modifiers":[{"id":90569,"kind":"modifierInvocation","modifierName":{"id":90568,"name":"onlyOtherBridge","nodeType":"IdentifierPath","referencedDeclaration":108974,"src":"3068:15:148"},"nodeType":"ModifierInvocation","src":"3068:15:148"}],"name":"finalizeBridgeERC721","nameLocation":"2852:20:148","parameters":{"id":90567,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90556,"mutability":"mutable","name":"_localToken","nameLocation":"2890:11:148","nodeType":"VariableDeclaration","scope":90622,"src":"2882:19:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90555,"name":"address","nodeType":"ElementaryTypeName","src":"2882:7:148","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90558,"mutability":"mutable","name":"_remoteToken","nameLocation":"2919:12:148","nodeType":"VariableDeclaration","scope":90622,"src":"2911:20:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90557,"name":"address","nodeType":"ElementaryTypeName","src":"2911:7:148","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90560,"mutability":"mutable","name":"_from","nameLocation":"2949:5:148","nodeType":"VariableDeclaration","scope":90622,"src":"2941:13:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90559,"name":"address","nodeType":"ElementaryTypeName","src":"2941:7:148","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90562,"mutability":"mutable","name":"_to","nameLocation":"2972:3:148","nodeType":"VariableDeclaration","scope":90622,"src":"2964:11:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90561,"name":"address","nodeType":"ElementaryTypeName","src":"2964:7:148","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90564,"mutability":"mutable","name":"_tokenId","nameLocation":"2993:8:148","nodeType":"VariableDeclaration","scope":90622,"src":"2985:16:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90563,"name":"uint256","nodeType":"ElementaryTypeName","src":"2985:7:148","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":90566,"mutability":"mutable","name":"_extraData","nameLocation":"3026:10:148","nodeType":"VariableDeclaration","scope":90622,"src":"3011:25:148","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":90565,"name":"bytes","nodeType":"ElementaryTypeName","src":"3011:5:148","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2872:170:148"},"returnParameters":{"id":90570,"nodeType":"ParameterList","parameters":[],"src":"3088:0:148"},"scope":90723,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":90722,"nodeType":"FunctionDefinition","src":"4157:1737:148","nodes":[],"body":{"id":90721,"nodeType":"Block","src":"4425:1469:148","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90647,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90642,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90627,"src":"4443:12:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":90645,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4467:1:148","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":90644,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4459:7:148","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":90643,"name":"address","nodeType":"ElementaryTypeName","src":"4459:7:148","typeDescriptions":{}}},"id":90646,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4459:10:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4443:26:148","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324552433732314272696467653a2072656d6f746520746f6b656e2063616e6e6f742062652061646472657373283029","id":90648,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4471:51:148","typeDescriptions":{"typeIdentifier":"t_stringliteral_dda13b674104cff93529fc9113589ef9eda6a9e3d2414ccc2ce12f79952de0f9","typeString":"literal_string \"L2ERC721Bridge: remote token cannot be address(0)\""},"value":"L2ERC721Bridge: remote token cannot be address(0)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_dda13b674104cff93529fc9113589ef9eda6a9e3d2414ccc2ce12f79952de0f9","typeString":"literal_string \"L2ERC721Bridge: remote token cannot be address(0)\""}],"id":90641,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4435:7:148","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":90649,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4435:88:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90650,"nodeType":"ExpressionStatement","src":"4435:88:148"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90659,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90652,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90629,"src":"4628:5:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":90657,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90633,"src":"4682:8:148","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":90654,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90625,"src":"4661:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90653,"name":"IOptimismMintableERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109407,"src":"4637:23:148","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IOptimismMintableERC721_$109407_$","typeString":"type(contract IOptimismMintableERC721)"}},"id":90655,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4637:36:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IOptimismMintableERC721_$109407","typeString":"contract IOptimismMintableERC721"}},"id":90656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"ownerOf","nodeType":"MemberAccess","referencedDeclaration":52493,"src":"4637:44:148","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_uint256_$returns$_t_address_$","typeString":"function (uint256) view external returns (address)"}},"id":90658,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4637:54:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4628:63:148","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324552433732314272696467653a205769746864726177616c206973206e6f74206265696e6720696e69746961746564206279204e4654206f776e6572","id":90660,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4705:64:148","typeDescriptions":{"typeIdentifier":"t_stringliteral_5ee75d9b9b0c7320a30e3101dd31a8695dfeba929ef037ce562e2025d1f1db7f","typeString":"literal_string \"L2ERC721Bridge: Withdrawal is not being initiated by NFT owner\""},"value":"L2ERC721Bridge: Withdrawal is not being initiated by NFT owner"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5ee75d9b9b0c7320a30e3101dd31a8695dfeba929ef037ce562e2025d1f1db7f","typeString":"literal_string \"L2ERC721Bridge: Withdrawal is not being initiated by NFT owner\""}],"id":90651,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4607:7:148","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":90661,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4607:172:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90662,"nodeType":"ExpressionStatement","src":"4607:172:148"},{"assignments":[90664],"declarations":[{"constant":false,"id":90664,"mutability":"mutable","name":"remoteToken","nameLocation":"4938:11:148","nodeType":"VariableDeclaration","scope":90721,"src":"4930:19:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90663,"name":"address","nodeType":"ElementaryTypeName","src":"4930:7:148","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":90670,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":90666,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90625,"src":"4976:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90665,"name":"IOptimismMintableERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109407,"src":"4952:23:148","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IOptimismMintableERC721_$109407_$","typeString":"type(contract IOptimismMintableERC721)"}},"id":90667,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4952:36:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IOptimismMintableERC721_$109407","typeString":"contract IOptimismMintableERC721"}},"id":90668,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"remoteToken","nodeType":"MemberAccess","referencedDeclaration":109400,"src":"4952:48:148","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":90669,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4952:50:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4930:72:148"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90674,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90672,"name":"remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90664,"src":"5020:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":90673,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90627,"src":"5035:12:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5020:27:148","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324552433732314272696467653a2072656d6f746520746f6b656e20646f6573206e6f74206d6174636820676976656e2076616c7565","id":90675,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5049:57:148","typeDescriptions":{"typeIdentifier":"t_stringliteral_3a41ad0de9429285711503556faaaf7a96337a91d3717dc15ffb9a52d12e98d9","typeString":"literal_string \"L2ERC721Bridge: remote token does not match given value\""},"value":"L2ERC721Bridge: remote token does not match given value"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3a41ad0de9429285711503556faaaf7a96337a91d3717dc15ffb9a52d12e98d9","typeString":"literal_string \"L2ERC721Bridge: remote token does not match given value\""}],"id":90671,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5012:7:148","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":90676,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5012:95:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90677,"nodeType":"ExpressionStatement","src":"5012:95:148"},{"expression":{"arguments":[{"id":90682,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90629,"src":"5329:5:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90683,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90633,"src":"5336:8:148","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[{"id":90679,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90625,"src":"5311:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90678,"name":"IOptimismMintableERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109407,"src":"5287:23:148","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IOptimismMintableERC721_$109407_$","typeString":"type(contract IOptimismMintableERC721)"}},"id":90680,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5287:36:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IOptimismMintableERC721_$109407","typeString":"contract IOptimismMintableERC721"}},"id":90681,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"burn","nodeType":"MemberAccess","referencedDeclaration":109370,"src":"5287:41:148","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256) external"}},"id":90684,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5287:58:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90685,"nodeType":"ExpressionStatement","src":"5287:58:148"},{"assignments":[90687],"declarations":[{"constant":false,"id":90687,"mutability":"mutable","name":"message","nameLocation":"5369:7:148","nodeType":"VariableDeclaration","scope":90721,"src":"5356:20:148","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":90686,"name":"bytes","nodeType":"ElementaryTypeName","src":"5356:5:148","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":90700,"initialValue":{"arguments":[{"expression":{"expression":{"id":90690,"name":"L1ERC721Bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85418,"src":"5415:14:148","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1ERC721Bridge_$85418_$","typeString":"type(contract L1ERC721Bridge)"}},"id":90691,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"finalizeBridgeERC721","nodeType":"MemberAccess","referencedDeclaration":85330,"src":"5415:35:148","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$","typeString":"function L1ERC721Bridge.finalizeBridgeERC721(address,address,address,address,uint256,bytes calldata)"}},"id":90692,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"selector","nodeType":"MemberAccess","src":"5415:44:148","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"id":90693,"name":"remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90664,"src":"5461:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90694,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90625,"src":"5474:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90695,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90629,"src":"5487:5:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90696,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90631,"src":"5494:3:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90697,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90633,"src":"5499:8:148","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":90698,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90637,"src":"5509:10:148","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":90688,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5379:3:148","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":90689,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSelector","nodeType":"MemberAccess","src":"5379:22:148","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes4) pure returns (bytes memory)"}},"id":90699,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5379:150:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"5356:173:148"},{"expression":{"arguments":[{"arguments":[{"id":90706,"name":"otherBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108914,"src":"5673:11:148","typeDescriptions":{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}],"id":90705,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5665:7:148","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":90704,"name":"address","nodeType":"ElementaryTypeName","src":"5665:7:148","typeDescriptions":{}}},"id":90707,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5665:20:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90708,"name":"message","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90687,"src":"5697:7:148","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":90709,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90635,"src":"5720:12:148","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"id":90701,"name":"messenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108910,"src":"5632:9:148","typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},"id":90703,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sendMessage","nodeType":"MemberAccess","referencedDeclaration":108520,"src":"5632:21:148","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$_t_bytes_memory_ptr_$_t_uint32_$returns$__$","typeString":"function (address,bytes memory,uint32) payable external"}},"id":90710,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_target","_message","_minGasLimit"],"nodeType":"FunctionCall","src":"5632:103:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90711,"nodeType":"ExpressionStatement","src":"5632:103:148"},{"eventCall":{"arguments":[{"id":90713,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90625,"src":"5828:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90714,"name":"remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90664,"src":"5841:11:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90715,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90629,"src":"5854:5:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90716,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90631,"src":"5861:3:148","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90717,"name":"_tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90633,"src":"5866:8:148","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":90718,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90637,"src":"5876:10:148","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":90712,"name":"ERC721BridgeInitiated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108934,"src":"5806:21:148","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":90719,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5806:81:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90720,"nodeType":"EmitStatement","src":"5801:86:148"}]},"baseFunctions":[109117],"documentation":{"id":90623,"nodeType":"StructuredDocumentation","src":"4124:28:148","text":"@inheritdoc ERC721Bridge"},"implemented":true,"kind":"function","modifiers":[],"name":"_initiateBridgeERC721","nameLocation":"4166:21:148","overrides":{"id":90639,"nodeType":"OverrideSpecifier","overrides":[],"src":"4412:8:148"},"parameters":{"id":90638,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90625,"mutability":"mutable","name":"_localToken","nameLocation":"4205:11:148","nodeType":"VariableDeclaration","scope":90722,"src":"4197:19:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90624,"name":"address","nodeType":"ElementaryTypeName","src":"4197:7:148","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90627,"mutability":"mutable","name":"_remoteToken","nameLocation":"4234:12:148","nodeType":"VariableDeclaration","scope":90722,"src":"4226:20:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90626,"name":"address","nodeType":"ElementaryTypeName","src":"4226:7:148","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90629,"mutability":"mutable","name":"_from","nameLocation":"4264:5:148","nodeType":"VariableDeclaration","scope":90722,"src":"4256:13:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90628,"name":"address","nodeType":"ElementaryTypeName","src":"4256:7:148","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90631,"mutability":"mutable","name":"_to","nameLocation":"4287:3:148","nodeType":"VariableDeclaration","scope":90722,"src":"4279:11:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90630,"name":"address","nodeType":"ElementaryTypeName","src":"4279:7:148","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90633,"mutability":"mutable","name":"_tokenId","nameLocation":"4308:8:148","nodeType":"VariableDeclaration","scope":90722,"src":"4300:16:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90632,"name":"uint256","nodeType":"ElementaryTypeName","src":"4300:7:148","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":90635,"mutability":"mutable","name":"_minGasLimit","nameLocation":"4333:12:148","nodeType":"VariableDeclaration","scope":90722,"src":"4326:19:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":90634,"name":"uint32","nodeType":"ElementaryTypeName","src":"4326:6:148","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":90637,"mutability":"mutable","name":"_extraData","nameLocation":"4370:10:148","nodeType":"VariableDeclaration","scope":90722,"src":"4355:25:148","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":90636,"name":"bytes","nodeType":"ElementaryTypeName","src":"4355:5:148","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4187:199:148"},"returnParameters":{"id":90640,"nodeType":"ParameterList","parameters":[],"src":"4425:0:148"},"scope":90723,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[{"baseName":{"id":90510,"name":"ERC721Bridge","nodeType":"IdentifierPath","referencedDeclaration":109118,"src":"1416:12:148"},"id":90511,"nodeType":"InheritanceSpecifier","src":"1416:12:148"},{"baseName":{"id":90512,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"1430:7:148"},"id":90513,"nodeType":"InheritanceSpecifier","src":"1430:7:148"}],"canonicalName":"L2ERC721Bridge","contractDependencies":[],"contractKind":"contract","documentation":{"id":90509,"nodeType":"StructuredDocumentation","src":"676:713:148","text":"@title L2ERC721Bridge\n @notice The L2 ERC721 bridge is a contract which works together with the L1 ERC721 bridge to\n make it possible to transfer ERC721 tokens from Ethereum to Optimism. This contract\n acts as a minter for new tokens when it hears about deposits into the L1 ERC721 bridge.\n This contract also acts as a burner for tokens being withdrawn.\n **WARNING**: Do not bridge an ERC721 that was originally deployed on Optimism. This\n bridge ONLY supports ERC721s originally deployed on Ethereum. Users will need to\n wait for the one-week challenge period to elapse before their Optimism-native NFT\n can be refunded on L2."},"fullyImplemented":true,"linearizedBaseContracts":[90723,109417,109118,49678],"name":"L2ERC721Bridge","nameLocation":"1398:14:148","scope":90724,"usedErrors":[]}],"license":"MIT"},"id":148} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/L2OutputOracle.json b/packages/sdk/src/forge-artifacts/L2OutputOracle.json new file mode 100644 index 000000000000..31c2aeb5292c --- /dev/null +++ b/packages/sdk/src/forge-artifacts/L2OutputOracle.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"CHALLENGER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"FINALIZATION_PERIOD_SECONDS","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"L2_BLOCK_TIME","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"PROPOSER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"SUBMISSION_INTERVAL","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"challenger","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"computeL2Timestamp","inputs":[{"name":"_l2BlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"deleteL2Outputs","inputs":[{"name":"_l2OutputIndex","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finalizationPeriodSeconds","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getL2Output","inputs":[{"name":"_l2OutputIndex","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Types.OutputProposal","components":[{"name":"outputRoot","type":"bytes32","internalType":"bytes32"},{"name":"timestamp","type":"uint128","internalType":"uint128"},{"name":"l2BlockNumber","type":"uint128","internalType":"uint128"}]}],"stateMutability":"view"},{"type":"function","name":"getL2OutputAfter","inputs":[{"name":"_l2BlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct Types.OutputProposal","components":[{"name":"outputRoot","type":"bytes32","internalType":"bytes32"},{"name":"timestamp","type":"uint128","internalType":"uint128"},{"name":"l2BlockNumber","type":"uint128","internalType":"uint128"}]}],"stateMutability":"view"},{"type":"function","name":"getL2OutputIndexAfter","inputs":[{"name":"_l2BlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_submissionInterval","type":"uint256","internalType":"uint256"},{"name":"_l2BlockTime","type":"uint256","internalType":"uint256"},{"name":"_startingBlockNumber","type":"uint256","internalType":"uint256"},{"name":"_startingTimestamp","type":"uint256","internalType":"uint256"},{"name":"_proposer","type":"address","internalType":"address"},{"name":"_challenger","type":"address","internalType":"address"},{"name":"_finalizationPeriodSeconds","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"l2BlockTime","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"latestBlockNumber","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"latestOutputIndex","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"nextBlockNumber","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"nextOutputIndex","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"proposeL2Output","inputs":[{"name":"_outputRoot","type":"bytes32","internalType":"bytes32"},{"name":"_l2BlockNumber","type":"uint256","internalType":"uint256"},{"name":"_l1BlockHash","type":"bytes32","internalType":"bytes32"},{"name":"_l1BlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"proposer","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"startingBlockNumber","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"startingTimestamp","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"submissionInterval","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OutputProposed","inputs":[{"name":"outputRoot","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"l2OutputIndex","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"l2BlockNumber","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"l1Timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OutputsDeleted","inputs":[{"name":"prevNextOutputIndex","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"newNextOutputIndex","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b50620000256001806000808080806200002b565b62000328565b600054610100900460ff16158080156200004c5750600054600160ff909116105b806200007c575062000069306200031960201b6200135d1760201c565b1580156200007c575060005460ff166001145b620000e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000109576000805461ff0019166101001790555b60008811620001815760405162461bcd60e51b815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e20300000000000006064820152608401620000dc565b60008711620001f95760405162461bcd60e51b815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e20300000000000000000000000006064820152608401620000dc565b428511156200027f5760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201526374696d6560e01b608482015260a401620000dc565b6004889055600587905560018690556002859055600780546001600160a01b038087166001600160a01b0319928316179092556006805492861692909116919091179055600882905580156200030f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6001600160a01b03163b151590565b6115d580620003386000396000f3fe60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a","sourceMap":"611:13425:133:-:0;;;2792:305;;;;;;;;;-1:-1:-1;2816:274:133;2862:1;;2928;;;;;2816:10;:274::i;:::-;611:13425;;3742:985;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;;3209:33;3236:4;3209:18;;;;;:33;;:::i;:::-;3208:34;:55;;;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;-1:-1:-1;;;3146:190:43;;216:2:357;3146:190:43;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:357;;;338:44;399:19;;3146:190:43;;;;;;;;;3346:12;:16;;-1:-1:-1;;3346:16:43;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;-1:-1:-1;;3406:20:43;;;;;3372:65;4088:1:133::1;4066:19;:23;4058:94;;;::::0;-1:-1:-1;;;4058:94:133;;631:2:357;4058:94:133::1;::::0;::::1;613:21:357::0;670:2;650:18;;;643:30;709:34;689:18;;;682:62;780:28;760:18;;;753:56;826:19;;4058:94:133::1;429:422:357::0;4058:94:133::1;4185:1;4170:12;:16;4162:81;;;::::0;-1:-1:-1;;;4162:81:133;;1058:2:357;4162:81:133::1;::::0;::::1;1040:21:357::0;1097:2;1077:18;;;1070:30;1136:34;1116:18;;;1109:62;1207:22;1187:18;;;1180:50;1247:19;;4162:81:133::1;856:416:357::0;4162:81:133::1;4296:15;4274:18;:37;;4253:152;;;::::0;-1:-1:-1;;;4253:152:133;;1479:2:357;4253:152:133::1;::::0;::::1;1461:21:357::0;1518:2;1498:18;;;1491:30;;;1557:34;1537:18;;;1530:62;1628:34;1608:18;;;1601:62;-1:-1:-1;;;1679:19:357;;;1672:35;1724:19;;4253:152:133::1;1277:472:357::0;4253:152:133::1;4416:18;:40:::0;;;4466:11:::1;:26:::0;;;4502:19:::1;:42:::0;;;4554:17:::1;:38:::0;;;4602:8:::1;:20:::0;;-1:-1:-1;;;;;4602:20:133;;::::1;-1:-1:-1::0;;;;;;4602:20:133;;::::1;;::::0;;;4632:10:::1;:24:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;4666:25:::1;:54:::0;;;3457:99:43;;;;3507:5;3491:21;;-1:-1:-1;;3491:21:43;;;3531:14;;-1:-1:-1;1906:36:357;;3531:14:43;;1894:2:357;1879:18;3531:14:43;;;;;;;3457:99;3090:472;3742:985:133;;;;;;;:::o;1175:320:59:-;-1:-1:-1;;;;;1465:19:59;;:23;;;1175:320::o;1754:194:357:-;611:13425:133;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a","sourceMap":"611:13425:133:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5264:92;;;;;;;;;;-1:-1:-1;5338:11:133;;5264:92;;;160:25:357;;;148:2;133:18;5264:92:133;;;;;;;;3742:985;;;;;;;;;;-1:-1:-1;3742:985:133;;;;;:::i;:::-;;:::i;:::-;;13212:174;;;;;;;;;;;;;:::i;4953:105::-;;;;;;;;;;-1:-1:-1;5033:18:133;;4953:105;;1426:25;;;;;;;;;;-1:-1:-1;1426:25:133;;;;;;;;;;;1182:42:357;1170:55;;;1152:74;;1140:2;1125:18;1426:25:133;1006:226:357;2598:40:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12608:105::-;;;;;;;;;;;;;:::i;12849:97::-;;;;;;;;;;-1:-1:-1;12923:9:133;:16;12849:97;;5580:88;;;;;;;;;;-1:-1:-1;5651:10:133;;;;5580:88;;743:34;;;;;;;;;;;;;;;;10969:896;;;;;;;;;;-1:-1:-1;10969:896:133;;;;;:::i;:::-;;:::i;863:32::-;;;;;;;;;;;;;;;;6689:975;;;;;;;;;;-1:-1:-1;6689:975:133;;;;;:::i;:::-;;:::i;1285:26::-;;;;;;;;;;;;;;;;8258:1981;;;;;;:::i;:::-;;:::i;10443:146::-;;;;;;;;;;-1:-1:-1;10443:146:133;;;;;:::i;:::-;;:::i;:::-;;;;2705:13:357;;2687:32;;2766:4;2754:17;;;2748:24;2791:34;2863:21;;;2841:20;;;2834:51;;;;2933:17;;;2927:24;2923:33;;;2901:20;;;2894:63;2675:2;2660:18;10443:146:133;2473:490:357;1564:23:133;;;;;;;;;;-1:-1:-1;1564:23:133;;;;;;;;5886:84;;;;;;;;;;-1:-1:-1;5955:8:133;;;;5886:84;;1728:40;;;;;;;;;;;;;;;;12228:174;;;;;;;;;;-1:-1:-1;12228:174:133;;;;;:::i;:::-;;:::i;13854:180::-;;;;;;;;;;-1:-1:-1;13854:180:133;;;;;:::i;:::-;;:::i;13524:121::-;;;;;;;;;;;;;:::i;1114:33::-;;;;;;;;;;;;;;;;6221:120;;;;;;;;;;-1:-1:-1;6309:25:133;;6221:120;;3742:985;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;-1:-1:-1;3236:4:43;1465:19:59;:23;;;3208:55:43;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;;;;3170:2:357;3146:190:43;;;3152:21:357;3209:2;3189:18;;;3182:30;3248:34;3228:18;;;3221:62;3319:16;3299:18;;;3292:44;3353:19;;3146:190:43;;;;;;;;;3346:12;:16;;;;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;;;;;;;3372:65;4088:1:133::1;4066:19;:23;4058:94;;;::::0;::::1;::::0;;3585:2:357;4058:94:133::1;::::0;::::1;3567:21:357::0;3624:2;3604:18;;;3597:30;3663:34;3643:18;;;3636:62;3734:28;3714:18;;;3707:56;3780:19;;4058:94:133::1;3383:422:357::0;4058:94:133::1;4185:1;4170:12;:16;4162:81;;;::::0;::::1;::::0;;4012:2:357;4162:81:133::1;::::0;::::1;3994:21:357::0;4051:2;4031:18;;;4024:30;4090:34;4070:18;;;4063:62;4161:22;4141:18;;;4134:50;4201:19;;4162:81:133::1;3810:416:357::0;4162:81:133::1;4296:15;4274:18;:37;;4253:152;;;::::0;::::1;::::0;;4433:2:357;4253:152:133::1;::::0;::::1;4415:21:357::0;4472:2;4452:18;;;4445:30;;;4511:34;4491:18;;;4484:62;4582:34;4562:18;;;4555:62;4654:6;4633:19;;;4626:35;4678:19;;4253:152:133::1;4231:472:357::0;4253:152:133::1;4416:18;:40:::0;;;4466:11:::1;:26:::0;;;4502:19:::1;:42:::0;;;4554:17:::1;:38:::0;;;4602:8:::1;:20:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;4632:10:::1;:24:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;4666:25:::1;:54:::0;;;3457:99:43;;;;3507:5;3491:21;;;;;;3531:14;;-1:-1:-1;4860:36:357;;3531:14:43;;4848:2:357;4833:18;3531:14:43;;;;;;;3457:99;3090:472;3742:985:133;;;;;;;:::o;13212:174::-;13288:9;:16;13262:7;;13288:21;:91;;13334:9;13344:16;;:20;;13363:1;;13344:20;:::i;:::-;13334:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:45;;;;;;;;;13212:174;-1:-1:-1;13212:174:133:o;13288:91::-;13312:19;;13288:91;13281:98;;13212:174;:::o;12608:105::-;12686:9;:16;12660:7;;12686:20;;12705:1;;12686:20;:::i;10969:896::-;11045:7;11184:19;:17;:19::i;:::-;11166:14;:37;;11145:156;;;;;;;5617:2:357;11145:156:133;;;5599:21:357;5656:2;5636:18;;;5629:30;5695:34;5675:18;;;5668:62;5766:34;5746:18;;;5739:62;5838:10;5817:19;;;5810:39;5866:19;;11145:156:133;5415:476:357;11145:156:133;11379:9;:16;11371:103;;;;;;;6098:2:357;11371:103:133;;;6080:21:357;6137:2;6117:18;;;6110:30;6176:34;6156:18;;;6149:62;6247:34;6227:18;;;6220:62;6319:8;6298:19;;;6291:37;6345:19;;11371:103:133;5896:474:357;11371:103:133;11589:9;:16;11552:10;;11615:224;11627:2;11622;:7;11615:224;;;11645:11;11671:1;11660:7;11665:2;11660;:7;:::i;:::-;11659:13;;;;:::i;:::-;11645:27;;11721:14;11690:9;11700:3;11690:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:28;;;;;;;;:45;11686:143;;;11760:7;:3;11766:1;11760:7;:::i;:::-;11755:12;;11686:143;;;11811:3;11806:8;;11686:143;11631:208;11615:224;;;-1:-1:-1;11856:2:133;10969:896;-1:-1:-1;;10969:896:133:o;6689:975::-;6779:10;;;;6765;:24;6757:99;;;;;;;6989:2:357;6757:99:133;;;6971:21:357;7028:2;7008:18;;;7001:30;7067:34;7047:18;;;7040:62;7138:32;7118:18;;;7111:60;7188:19;;6757:99:133;6787:426:357;6757:99:133;6974:9;:16;6957:33;;6936:135;;;;;;;7420:2:357;6936:135:133;;;7402:21:357;7459:2;7439:18;;;7432:30;7498:34;7478:18;;;7471:62;7569:34;7549:18;;;7542:62;7641:5;7620:19;;;7613:34;7664:19;;6936:135:133;7218:471:357;6936:135:133;7238:25;;7200:9;7210:14;7200:25;;;;;;;;:::i;:::-;;;;;;;;;:35;:25;;;;;:35;;7182:53;;7200:35;;7182:15;:53;:::i;:::-;:81;7161:198;;;;;;;7896:2:357;7161:198:133;;;7878:21:357;7935:2;7915:18;;;7908:30;7974:34;7954:18;;;7947:62;8045:34;8025:18;;;8018:62;8117:8;8096:19;;;8089:37;8143:19;;7161:198:133;7694:474:357;7161:198:133;7370:29;7402:17;12923:9;:16;;12849:97;7402:17;7370:49;;7564:14;7548;7541:38;7642:14;7619:21;7604:53;;;;;;;;;;6747:917;6689:975;:::o;8258:1981::-;8481:8;;;;8467:10;:22;8459:100;;;;;;;8375:2:357;8459:100:133;;;8357:21:357;8414:2;8394:18;;;8387:30;8453:34;8433:18;;;8426:62;8524:34;8504:18;;;8497:62;8596:3;8575:19;;;8568:32;8617:19;;8459:100:133;8173:469:357;8459:100:133;8609:17;:15;:17::i;:::-;8591:14;:35;8570:154;;;;;;;8849:2:357;8570:154:133;;;8831:21:357;8888:2;8868:18;;;8861:30;8927:34;8907:18;;;8900:62;8998:34;8978:18;;;8971:62;9070:10;9049:19;;;9042:39;9098:19;;8570:154:133;8647:476:357;8570:154:133;8793:15;8756:34;8775:14;8756:18;:34::i;:::-;:52;8735:153;;;;;;;9330:2:357;8735:153:133;;;9312:21:357;9369:2;9349:18;;;9342:30;9408:34;9388:18;;;9381:62;9479:24;9459:18;;;9452:52;9521:19;;8735:153:133;9128:418:357;8735:153:133;8907:11;8899:96;;;;;;;9753:2:357;8899:96:133;;;9735:21:357;9792:2;9772:18;;;9765:30;9831:34;9811:18;;;9804:62;9902:28;9882:18;;;9875:56;9948:19;;8899:96:133;9551:422:357;8899:96:133;9010:26;;9006:897;;9773:12;9754:14;9744:25;:41;9719:173;;;;;;;10180:2:357;9719:173:133;;;10162:21:357;10219:2;10199:18;;;10192:30;10258:34;10238:18;;;10231:62;10329:34;10309:18;;;10302:62;10401:11;10380:19;;;10373:40;10430:19;;9719:173:133;9978:477:357;9719:173:133;9965:14;9946:17;12923:9;:16;;12849:97;9946:17;9933:11;9918:79;9981:15;9918:79;;;;160:25:357;;148:2;133:18;;14:177;9918:79:133;;;;;;;;-1:-1:-1;;10036:186:133;;;;;;;;;;;;10135:15;10036:186;;;;;;;;;;;;;;;;;10008:9;:224;;;;;;;-1:-1:-1;10008:224:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8258:1981::o;10443:146::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;10557:9:133;10567:14;10557:25;;;;;;;;:::i;:::-;;;;;;;;;;10550:32;;;;;;;;10557:25;;;;;;;10550:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10443:146;-1:-1:-1;;10443:146:133:o;12228:174::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;12347:9:133;12357:37;12379:14;12357:21;:37::i;:::-;12347:48;;;;;;;;:::i;13854:180::-;13927:7;14015:11;;13992:19;;13975:14;:36;;;;:::i;:::-;13974:52;;;;:::i;:::-;13953:17;;:74;;;;:::i;:::-;13946:81;13854:180;-1:-1:-1;;13854:180:133:o;13524:121::-;13572:7;13620:18;;13598:19;:17;:19::i;:::-;:40;;;;:::i;1175:320:59:-;1465:19;;;:23;;;1175:320::o;196:196:357:-;264:20;;324:42;313:54;;303:65;;293:93;;382:1;379;372:12;293:93;196:196;;;:::o;397:604::-;510:6;518;526;534;542;550;558;611:3;599:9;590:7;586:23;582:33;579:53;;;628:1;625;618:12;579:53;664:9;651:23;641:33;;721:2;710:9;706:18;693:32;683:42;;772:2;761:9;757:18;744:32;734:42;;823:2;812:9;808:18;795:32;785:42;;846:39;880:3;869:9;865:19;846:39;:::i;:::-;836:49;;904:39;938:3;927:9;923:19;904:39;:::i;:::-;894:49;;990:3;979:9;975:19;962:33;952:43;;397:604;;;;;;;;;;:::o;1237:656::-;1349:4;1378:2;1407;1396:9;1389:21;1439:6;1433:13;1482:6;1477:2;1466:9;1462:18;1455:34;1507:1;1517:140;1531:6;1528:1;1525:13;1517:140;;;1626:14;;;1622:23;;1616:30;1592:17;;;1611:2;1588:26;1581:66;1546:10;;1517:140;;;1675:6;1672:1;1669:13;1666:91;;;1745:1;1740:2;1731:6;1720:9;1716:22;1712:31;1705:42;1666:91;-1:-1:-1;1809:2:357;1797:15;1814:66;1793:88;1778:104;;;;1884:2;1774:113;;1237:656;-1:-1:-1;;;1237:656:357:o;1898:180::-;1957:6;2010:2;1998:9;1989:7;1985:23;1981:32;1978:52;;;2026:1;2023;2016:12;1978:52;-1:-1:-1;2049:23:357;;1898:180;-1:-1:-1;1898:180:357:o;2083:385::-;2169:6;2177;2185;2193;2246:3;2234:9;2225:7;2221:23;2217:33;2214:53;;;2263:1;2260;2253:12;2214:53;-1:-1:-1;;2286:23:357;;;2356:2;2341:18;;2328:32;;-1:-1:-1;2407:2:357;2392:18;;2379:32;;2458:2;2443:18;2430:32;;-1:-1:-1;2083:385:357;-1:-1:-1;2083:385:357:o;4907:184::-;4959:77;4956:1;4949:88;5056:4;5053:1;5046:15;5080:4;5077:1;5070:15;5096:125;5136:4;5164:1;5161;5158:8;5155:34;;;5169:18;;:::i;:::-;-1:-1:-1;5206:9:357;;5096:125::o;5226:184::-;5278:77;5275:1;5268:88;5375:4;5372:1;5365:15;5399:4;5396:1;5389:15;6375:128;6415:3;6446:1;6442:6;6439:1;6436:13;6433:39;;;6452:18;;:::i;:::-;-1:-1:-1;6488:9:357;;6375:128::o;6508:274::-;6548:1;6574;6564:189;;6609:77;6606:1;6599:88;6710:4;6707:1;6700:15;6738:4;6735:1;6728:15;6564:189;-1:-1:-1;6767:9:357;;6508:274::o;10460:228::-;10500:7;10626:1;10558:66;10554:74;10551:1;10548:81;10543:1;10536:9;10529:17;10525:105;10522:131;;;10633:18;;:::i;:::-;-1:-1:-1;10673:9:357;;10460:228::o","linkReferences":{}},"methodIdentifiers":{"CHALLENGER()":"6b4d98dd","FINALIZATION_PERIOD_SECONDS()":"f4daa291","L2_BLOCK_TIME()":"002134cc","PROPOSER()":"bffa7f0f","SUBMISSION_INTERVAL()":"529933df","challenger()":"534db0e2","computeL2Timestamp(uint256)":"d1de856c","deleteL2Outputs(uint256)":"89c44cbb","finalizationPeriodSeconds()":"ce5db8d6","getL2Output(uint256)":"a25ae557","getL2OutputAfter(uint256)":"cf8e5cf0","getL2OutputIndexAfter(uint256)":"7f006420","initialize(uint256,uint256,uint256,uint256,address,address,uint256)":"1c89c97d","l2BlockTime()":"93991af3","latestBlockNumber()":"4599c788","latestOutputIndex()":"69f16eec","nextBlockNumber()":"dcec3348","nextOutputIndex()":"6abcf563","proposeL2Output(bytes32,uint256,bytes32,uint256)":"9aaab648","proposer()":"a8e4fb90","startingBlockNumber()":"70872aa5","startingTimestamp()":"88786272","submissionInterval()":"e1a41bcf","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2OutputIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\"}],\"name\":\"OutputProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"prevNextOutputIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newNextOutputIndex\",\"type\":\"uint256\"}],\"name\":\"OutputsDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CHALLENGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_BLOCK_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROPOSER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUBMISSION_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"challenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"computeL2Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"}],\"name\":\"deleteL2Outputs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"}],\"name\":\"getL2Output\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"}],\"internalType\":\"struct Types.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2OutputAfter\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"}],\"internalType\":\"struct Types.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2OutputIndexAfter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionInterval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BlockTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestOutputIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextOutputIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_l1BlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l1BlockNumber\",\"type\":\"uint256\"}],\"name\":\"proposeL2Output\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startingTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"submissionInterval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:proxied\":\"@title L2OutputOracle\",\"events\":{\"OutputProposed(bytes32,uint256,uint256,uint256)\":{\"params\":{\"l1Timestamp\":\"The L1 timestamp when proposed.\",\"l2BlockNumber\":\"The L2 block number of the output root.\",\"l2OutputIndex\":\"The index of the output in the l2Outputs array.\",\"outputRoot\":\"The output root.\"}},\"OutputsDeleted(uint256,uint256)\":{\"params\":{\"newNextOutputIndex\":\"Next L2 output index after the deletion.\",\"prevNextOutputIndex\":\"Next L2 output index before the deletion.\"}}},\"kind\":\"dev\",\"methods\":{\"CHALLENGER()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Address of the challenger.\"}},\"FINALIZATION_PERIOD_SECONDS()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Finalization period in seconds.\"}},\"L2_BLOCK_TIME()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"L2 block time.\"}},\"PROPOSER()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Address of the proposer.\"}},\"SUBMISSION_INTERVAL()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Submission interval.\"}},\"computeL2Timestamp(uint256)\":{\"params\":{\"_l2BlockNumber\":\"The L2 block number of the target block.\"},\"returns\":{\"_0\":\"L2 timestamp of the given block.\"}},\"deleteL2Outputs(uint256)\":{\"params\":{\"_l2OutputIndex\":\"Index of the first L2 output to be deleted. All outputs after this output will also be deleted.\"}},\"getL2Output(uint256)\":{\"params\":{\"_l2OutputIndex\":\"Index of the output to return.\"},\"returns\":{\"_0\":\"The output at the given index.\"}},\"getL2OutputAfter(uint256)\":{\"params\":{\"_l2BlockNumber\":\"L2 block number to find a checkpoint for.\"},\"returns\":{\"_0\":\"First checkpoint that commits to the given L2 block number.\"}},\"getL2OutputIndexAfter(uint256)\":{\"params\":{\"_l2BlockNumber\":\"L2 block number to find a checkpoint for.\"},\"returns\":{\"_0\":\"Index of the first checkpoint that commits to the given L2 block number.\"}},\"initialize(uint256,uint256,uint256,uint256,address,address,uint256)\":{\"params\":{\"_challenger\":\"The address of the challenger.\",\"_finalizationPeriodSeconds\":\"The minimum time (in seconds) that must elapse before a withdrawal can be finalized.\",\"_l2BlockTime\":\"The time per L2 block, in seconds.\",\"_proposer\":\"The address of the proposer.\",\"_startingBlockNumber\":\"The number of the first L2 block.\",\"_startingTimestamp\":\"The timestamp of the first L2 block.\",\"_submissionInterval\":\"Interval in blocks at which checkpoints must be submitted.\"}},\"latestBlockNumber()\":{\"returns\":{\"_0\":\"Latest submitted L2 block number.\"}},\"latestOutputIndex()\":{\"returns\":{\"_0\":\"The number of outputs that have been proposed.\"}},\"nextBlockNumber()\":{\"returns\":{\"_0\":\"Next L2 block number.\"}},\"nextOutputIndex()\":{\"returns\":{\"_0\":\"The index of the next output to be proposed.\"}},\"proposeL2Output(bytes32,uint256,bytes32,uint256)\":{\"params\":{\"_l1BlockHash\":\"A block hash which must be included in the current chain.\",\"_l1BlockNumber\":\"The block number with the specified block hash.\",\"_l2BlockNumber\":\"The L2 block number that resulted in _outputRoot.\",\"_outputRoot\":\"The L2 output of the checkpoint block.\"}}},\"stateVariables\":{\"challenger\":{\"custom:network-specific\":\"\"},\"finalizationPeriodSeconds\":{\"custom:network-specific\":\"\"},\"l2BlockTime\":{\"custom:network-specific\":\"\"},\"proposer\":{\"custom:network-specific\":\"\"},\"submissionInterval\":{\"custom:network-specific\":\"\"},\"version\":{\"custom:semver\":\"1.8.0\"}},\"version\":1},\"userdoc\":{\"events\":{\"OutputProposed(bytes32,uint256,uint256,uint256)\":{\"notice\":\"Emitted when an output is proposed.\"},\"OutputsDeleted(uint256,uint256)\":{\"notice\":\"Emitted when outputs are deleted.\"}},\"kind\":\"user\",\"methods\":{\"CHALLENGER()\":{\"notice\":\"Getter for the challenger address. Public getter is legacy and will be removed in the future. Use `challenger` instead.\"},\"FINALIZATION_PERIOD_SECONDS()\":{\"notice\":\"Getter for the finalizationPeriodSeconds. Public getter is legacy and will be removed in the future. Use `finalizationPeriodSeconds` instead.\"},\"L2_BLOCK_TIME()\":{\"notice\":\"Getter for the l2BlockTime. Public getter is legacy and will be removed in the future. Use `l2BlockTime` instead.\"},\"PROPOSER()\":{\"notice\":\"Getter for the proposer address. Public getter is legacy and will be removed in the future. Use `proposer` instead.\"},\"SUBMISSION_INTERVAL()\":{\"notice\":\"Getter for the submissionInterval. Public getter is legacy and will be removed in the future. Use `submissionInterval` instead.\"},\"challenger()\":{\"notice\":\"The address of the challenger. Can be updated via upgrade.\"},\"computeL2Timestamp(uint256)\":{\"notice\":\"Returns the L2 timestamp corresponding to a given L2 block number.\"},\"constructor\":{\"notice\":\"Constructs the L2OutputOracle contract. Initializes variables to the same values as in the getting-started config.\"},\"deleteL2Outputs(uint256)\":{\"notice\":\"Deletes all output proposals after and including the proposal that corresponds to the given output index. Only the challenger address can delete outputs.\"},\"finalizationPeriodSeconds()\":{\"notice\":\"The minimum time (in seconds) that must elapse before a withdrawal can be finalized.\"},\"getL2Output(uint256)\":{\"notice\":\"Returns an output by index. Needed to return a struct instead of a tuple.\"},\"getL2OutputAfter(uint256)\":{\"notice\":\"Returns the L2 output proposal that checkpoints a given L2 block number. Uses a binary search to find the first output greater than or equal to the given block.\"},\"getL2OutputIndexAfter(uint256)\":{\"notice\":\"Returns the index of the L2 output that checkpoints a given L2 block number. Uses a binary search to find the first output greater than or equal to the given block.\"},\"initialize(uint256,uint256,uint256,uint256,address,address,uint256)\":{\"notice\":\"Initializer.\"},\"l2BlockTime()\":{\"notice\":\"The time between L2 blocks in seconds. Once set, this value MUST NOT be modified.\"},\"latestBlockNumber()\":{\"notice\":\"Returns the block number of the latest submitted L2 output proposal. If no proposals been submitted yet then this function will return the starting block number.\"},\"latestOutputIndex()\":{\"notice\":\"Returns the number of outputs that have been proposed. Will revert if no outputs have been proposed yet.\"},\"nextBlockNumber()\":{\"notice\":\"Computes the block number of the next L2 block that needs to be checkpointed.\"},\"nextOutputIndex()\":{\"notice\":\"Returns the index of the next output to be proposed.\"},\"proposeL2Output(bytes32,uint256,bytes32,uint256)\":{\"notice\":\"Accepts an outputRoot and the timestamp of the corresponding L2 block. The timestamp must be equal to the current value returned by `nextTimestamp()` in order to be accepted. This function may only be called by the Proposer.\"},\"proposer()\":{\"notice\":\"The address of the proposer. Can be updated via upgrade.\"},\"startingBlockNumber()\":{\"notice\":\"The number of the first L2 block recorded in this contract.\"},\"startingTimestamp()\":{\"notice\":\"The timestamp of the first L2 block recorded in this contract.\"},\"submissionInterval()\":{\"notice\":\"The interval in L2 blocks at which checkpoints must be submitted.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"The L2OutputOracle contains an array of L2 state outputs, where each output is a commitment to the state of the L2 chain. Other contracts like the OptimismPortal use these outputs to verify information about the state of L2.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L1/L2OutputOracle.sol\":\"L2OutputOracle\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"src/L1/L2OutputOracle.sol\":{\"keccak256\":\"0x342c5084f3c640c90530122bd78372c011d6162e698dd8c8daec9496fef01d42\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8700a3d486bd62cbb861ff80175b8040336940515791073af6a036db7c2df303\",\"dweb:/ipfs/QmSGKTH84rVHWgMg4d6GQZCmCJ16KuUuTsMwPMDdJxCsww\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409\",\"dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72\",\"dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b\",\"dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"outputRoot","type":"bytes32","indexed":true},{"internalType":"uint256","name":"l2OutputIndex","type":"uint256","indexed":true},{"internalType":"uint256","name":"l2BlockNumber","type":"uint256","indexed":true},{"internalType":"uint256","name":"l1Timestamp","type":"uint256","indexed":false}],"type":"event","name":"OutputProposed","anonymous":false},{"inputs":[{"internalType":"uint256","name":"prevNextOutputIndex","type":"uint256","indexed":true},{"internalType":"uint256","name":"newNextOutputIndex","type":"uint256","indexed":true}],"type":"event","name":"OutputsDeleted","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"CHALLENGER","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"FINALIZATION_PERIOD_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"L2_BLOCK_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROPOSER","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"SUBMISSION_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"challenger","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_l2BlockNumber","type":"uint256"}],"stateMutability":"view","type":"function","name":"computeL2Timestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_l2OutputIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"deleteL2Outputs"},{"inputs":[],"stateMutability":"view","type":"function","name":"finalizationPeriodSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_l2OutputIndex","type":"uint256"}],"stateMutability":"view","type":"function","name":"getL2Output","outputs":[{"internalType":"struct Types.OutputProposal","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint128","name":"timestamp","type":"uint128"},{"internalType":"uint128","name":"l2BlockNumber","type":"uint128"}]}]},{"inputs":[{"internalType":"uint256","name":"_l2BlockNumber","type":"uint256"}],"stateMutability":"view","type":"function","name":"getL2OutputAfter","outputs":[{"internalType":"struct Types.OutputProposal","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint128","name":"timestamp","type":"uint128"},{"internalType":"uint128","name":"l2BlockNumber","type":"uint128"}]}]},{"inputs":[{"internalType":"uint256","name":"_l2BlockNumber","type":"uint256"}],"stateMutability":"view","type":"function","name":"getL2OutputIndexAfter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_submissionInterval","type":"uint256"},{"internalType":"uint256","name":"_l2BlockTime","type":"uint256"},{"internalType":"uint256","name":"_startingBlockNumber","type":"uint256"},{"internalType":"uint256","name":"_startingTimestamp","type":"uint256"},{"internalType":"address","name":"_proposer","type":"address"},{"internalType":"address","name":"_challenger","type":"address"},{"internalType":"uint256","name":"_finalizationPeriodSeconds","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"l2BlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"latestBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"latestOutputIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"nextBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"nextOutputIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"_outputRoot","type":"bytes32"},{"internalType":"uint256","name":"_l2BlockNumber","type":"uint256"},{"internalType":"bytes32","name":"_l1BlockHash","type":"bytes32"},{"internalType":"uint256","name":"_l1BlockNumber","type":"uint256"}],"stateMutability":"payable","type":"function","name":"proposeL2Output"},{"inputs":[],"stateMutability":"view","type":"function","name":"proposer","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"startingBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"startingTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"submissionInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"CHALLENGER()":{"custom:legacy":"","returns":{"_0":"Address of the challenger."}},"FINALIZATION_PERIOD_SECONDS()":{"custom:legacy":"","returns":{"_0":"Finalization period in seconds."}},"L2_BLOCK_TIME()":{"custom:legacy":"","returns":{"_0":"L2 block time."}},"PROPOSER()":{"custom:legacy":"","returns":{"_0":"Address of the proposer."}},"SUBMISSION_INTERVAL()":{"custom:legacy":"","returns":{"_0":"Submission interval."}},"computeL2Timestamp(uint256)":{"params":{"_l2BlockNumber":"The L2 block number of the target block."},"returns":{"_0":"L2 timestamp of the given block."}},"deleteL2Outputs(uint256)":{"params":{"_l2OutputIndex":"Index of the first L2 output to be deleted. All outputs after this output will also be deleted."}},"getL2Output(uint256)":{"params":{"_l2OutputIndex":"Index of the output to return."},"returns":{"_0":"The output at the given index."}},"getL2OutputAfter(uint256)":{"params":{"_l2BlockNumber":"L2 block number to find a checkpoint for."},"returns":{"_0":"First checkpoint that commits to the given L2 block number."}},"getL2OutputIndexAfter(uint256)":{"params":{"_l2BlockNumber":"L2 block number to find a checkpoint for."},"returns":{"_0":"Index of the first checkpoint that commits to the given L2 block number."}},"initialize(uint256,uint256,uint256,uint256,address,address,uint256)":{"params":{"_challenger":"The address of the challenger.","_finalizationPeriodSeconds":"The minimum time (in seconds) that must elapse before a withdrawal can be finalized.","_l2BlockTime":"The time per L2 block, in seconds.","_proposer":"The address of the proposer.","_startingBlockNumber":"The number of the first L2 block.","_startingTimestamp":"The timestamp of the first L2 block.","_submissionInterval":"Interval in blocks at which checkpoints must be submitted."}},"latestBlockNumber()":{"returns":{"_0":"Latest submitted L2 block number."}},"latestOutputIndex()":{"returns":{"_0":"The number of outputs that have been proposed."}},"nextBlockNumber()":{"returns":{"_0":"Next L2 block number."}},"nextOutputIndex()":{"returns":{"_0":"The index of the next output to be proposed."}},"proposeL2Output(bytes32,uint256,bytes32,uint256)":{"params":{"_l1BlockHash":"A block hash which must be included in the current chain.","_l1BlockNumber":"The block number with the specified block hash.","_l2BlockNumber":"The L2 block number that resulted in _outputRoot.","_outputRoot":"The L2 output of the checkpoint block."}}},"version":1},"userdoc":{"kind":"user","methods":{"CHALLENGER()":{"notice":"Getter for the challenger address. Public getter is legacy and will be removed in the future. Use `challenger` instead."},"FINALIZATION_PERIOD_SECONDS()":{"notice":"Getter for the finalizationPeriodSeconds. Public getter is legacy and will be removed in the future. Use `finalizationPeriodSeconds` instead."},"L2_BLOCK_TIME()":{"notice":"Getter for the l2BlockTime. Public getter is legacy and will be removed in the future. Use `l2BlockTime` instead."},"PROPOSER()":{"notice":"Getter for the proposer address. Public getter is legacy and will be removed in the future. Use `proposer` instead."},"SUBMISSION_INTERVAL()":{"notice":"Getter for the submissionInterval. Public getter is legacy and will be removed in the future. Use `submissionInterval` instead."},"challenger()":{"notice":"The address of the challenger. Can be updated via upgrade."},"computeL2Timestamp(uint256)":{"notice":"Returns the L2 timestamp corresponding to a given L2 block number."},"constructor":{"notice":"Constructs the L2OutputOracle contract. Initializes variables to the same values as in the getting-started config."},"deleteL2Outputs(uint256)":{"notice":"Deletes all output proposals after and including the proposal that corresponds to the given output index. Only the challenger address can delete outputs."},"finalizationPeriodSeconds()":{"notice":"The minimum time (in seconds) that must elapse before a withdrawal can be finalized."},"getL2Output(uint256)":{"notice":"Returns an output by index. Needed to return a struct instead of a tuple."},"getL2OutputAfter(uint256)":{"notice":"Returns the L2 output proposal that checkpoints a given L2 block number. Uses a binary search to find the first output greater than or equal to the given block."},"getL2OutputIndexAfter(uint256)":{"notice":"Returns the index of the L2 output that checkpoints a given L2 block number. Uses a binary search to find the first output greater than or equal to the given block."},"initialize(uint256,uint256,uint256,uint256,address,address,uint256)":{"notice":"Initializer."},"l2BlockTime()":{"notice":"The time between L2 blocks in seconds. Once set, this value MUST NOT be modified."},"latestBlockNumber()":{"notice":"Returns the block number of the latest submitted L2 output proposal. If no proposals been submitted yet then this function will return the starting block number."},"latestOutputIndex()":{"notice":"Returns the number of outputs that have been proposed. Will revert if no outputs have been proposed yet."},"nextBlockNumber()":{"notice":"Computes the block number of the next L2 block that needs to be checkpointed."},"nextOutputIndex()":{"notice":"Returns the index of the next output to be proposed."},"proposeL2Output(bytes32,uint256,bytes32,uint256)":{"notice":"Accepts an outputRoot and the timestamp of the corresponding L2 block. The timestamp must be equal to the current value returned by `nextTimestamp()` in order to be accepted. This function may only be called by the Proposer."},"proposer()":{"notice":"The address of the proposer. Can be updated via upgrade."},"startingBlockNumber()":{"notice":"The number of the first L2 block recorded in this contract."},"startingTimestamp()":{"notice":"The timestamp of the first L2 block recorded in this contract."},"submissionInterval()":{"notice":"The interval in L2 blocks at which checkpoints must be submitted."},"version()":{"notice":"Semantic version."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L1/L2OutputOracle.sol":"L2OutputOracle"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66","urls":["bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f","dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0","urls":["bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929","dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7","urls":["bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689","dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy"],"license":"MIT"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d","urls":["bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c","dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8"],"license":"MIT"},"src/L1/L2OutputOracle.sol":{"keccak256":"0x342c5084f3c640c90530122bd78372c011d6162e698dd8c8daec9496fef01d42","urls":["bzz-raw://8700a3d486bd62cbb861ff80175b8040336940515791073af6a036db7c2df303","dweb:/ipfs/QmSGKTH84rVHWgMg4d6GQZCmCJ16KuUuTsMwPMDdJxCsww"],"license":"MIT"},"src/L1/ResourceMetering.sol":{"keccak256":"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408","urls":["bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409","dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM"],"license":"MIT"},"src/libraries/Arithmetic.sol":{"keccak256":"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db","urls":["bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72","dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq"],"license":"MIT"},"src/libraries/Burn.sol":{"keccak256":"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010","urls":["bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f","dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"],"license":"MIT"},"src/libraries/Constants.sol":{"keccak256":"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132","urls":["bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b","dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp"],"license":"MIT"},"src/libraries/Types.sol":{"keccak256":"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4","urls":["bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e","dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":49534,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":49537,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":85939,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"startingBlockNumber","offset":0,"slot":"1","type":"t_uint256"},{"astId":85942,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"startingTimestamp","offset":0,"slot":"2","type":"t_uint256"},{"astId":85947,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"l2Outputs","offset":0,"slot":"3","type":"t_array(t_struct(OutputProposal)104307_storage)dyn_storage"},{"astId":85950,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"submissionInterval","offset":0,"slot":"4","type":"t_uint256"},{"astId":85953,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"l2BlockTime","offset":0,"slot":"5","type":"t_uint256"},{"astId":85956,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"challenger","offset":0,"slot":"6","type":"t_address"},{"astId":85959,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"proposer","offset":0,"slot":"7","type":"t_address"},{"astId":85962,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"finalizationPeriodSeconds","offset":0,"slot":"8","type":"t_uint256"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_struct(OutputProposal)104307_storage)dyn_storage":{"encoding":"dynamic_array","label":"struct Types.OutputProposal[]","numberOfBytes":"32","base":"t_struct(OutputProposal)104307_storage"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_struct(OutputProposal)104307_storage":{"encoding":"inplace","label":"struct Types.OutputProposal","numberOfBytes":"64","members":[{"astId":104302,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"outputRoot","offset":0,"slot":"0","type":"t_bytes32"},{"astId":104304,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"timestamp","offset":0,"slot":"1","type":"t_uint128"},{"astId":104306,"contract":"src/L1/L2OutputOracle.sol:L2OutputOracle","label":"l2BlockNumber","offset":16,"slot":"1","type":"t_uint128"}]},"t_uint128":{"encoding":"inplace","label":"uint128","numberOfBytes":"16"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"version":1,"kind":"user","methods":{"CHALLENGER()":{"notice":"Getter for the challenger address. Public getter is legacy and will be removed in the future. Use `challenger` instead."},"FINALIZATION_PERIOD_SECONDS()":{"notice":"Getter for the finalizationPeriodSeconds. Public getter is legacy and will be removed in the future. Use `finalizationPeriodSeconds` instead."},"L2_BLOCK_TIME()":{"notice":"Getter for the l2BlockTime. Public getter is legacy and will be removed in the future. Use `l2BlockTime` instead."},"PROPOSER()":{"notice":"Getter for the proposer address. Public getter is legacy and will be removed in the future. Use `proposer` instead."},"SUBMISSION_INTERVAL()":{"notice":"Getter for the submissionInterval. Public getter is legacy and will be removed in the future. Use `submissionInterval` instead."},"challenger()":{"notice":"The address of the challenger. Can be updated via upgrade."},"computeL2Timestamp(uint256)":{"notice":"Returns the L2 timestamp corresponding to a given L2 block number."},"constructor":{"notice":"Constructs the L2OutputOracle contract. Initializes variables to the same values as in the getting-started config."},"deleteL2Outputs(uint256)":{"notice":"Deletes all output proposals after and including the proposal that corresponds to the given output index. Only the challenger address can delete outputs."},"finalizationPeriodSeconds()":{"notice":"The minimum time (in seconds) that must elapse before a withdrawal can be finalized."},"getL2Output(uint256)":{"notice":"Returns an output by index. Needed to return a struct instead of a tuple."},"getL2OutputAfter(uint256)":{"notice":"Returns the L2 output proposal that checkpoints a given L2 block number. Uses a binary search to find the first output greater than or equal to the given block."},"getL2OutputIndexAfter(uint256)":{"notice":"Returns the index of the L2 output that checkpoints a given L2 block number. Uses a binary search to find the first output greater than or equal to the given block."},"initialize(uint256,uint256,uint256,uint256,address,address,uint256)":{"notice":"Initializer."},"l2BlockTime()":{"notice":"The time between L2 blocks in seconds. Once set, this value MUST NOT be modified."},"latestBlockNumber()":{"notice":"Returns the block number of the latest submitted L2 output proposal. If no proposals been submitted yet then this function will return the starting block number."},"latestOutputIndex()":{"notice":"Returns the number of outputs that have been proposed. Will revert if no outputs have been proposed yet."},"nextBlockNumber()":{"notice":"Computes the block number of the next L2 block that needs to be checkpointed."},"nextOutputIndex()":{"notice":"Returns the index of the next output to be proposed."},"proposeL2Output(bytes32,uint256,bytes32,uint256)":{"notice":"Accepts an outputRoot and the timestamp of the corresponding L2 block. The timestamp must be equal to the current value returned by `nextTimestamp()` in order to be accepted. This function may only be called by the Proposer."},"proposer()":{"notice":"The address of the proposer. Can be updated via upgrade."},"startingBlockNumber()":{"notice":"The number of the first L2 block recorded in this contract."},"startingTimestamp()":{"notice":"The timestamp of the first L2 block recorded in this contract."},"submissionInterval()":{"notice":"The interval in L2 blocks at which checkpoints must be submitted."},"version()":{"notice":"Semantic version."}},"events":{"OutputProposed(bytes32,uint256,uint256,uint256)":{"notice":"Emitted when an output is proposed."},"OutputsDeleted(uint256,uint256)":{"notice":"Emitted when outputs are deleted."}},"notice":"The L2OutputOracle contains an array of L2 state outputs, where each output is a commitment to the state of the L2 chain. Other contracts like the OptimismPortal use these outputs to verify information about the state of L2."},"devdoc":{"version":1,"kind":"dev","methods":{"CHALLENGER()":{"returns":{"_0":"Address of the challenger."}},"FINALIZATION_PERIOD_SECONDS()":{"returns":{"_0":"Finalization period in seconds."}},"L2_BLOCK_TIME()":{"returns":{"_0":"L2 block time."}},"PROPOSER()":{"returns":{"_0":"Address of the proposer."}},"SUBMISSION_INTERVAL()":{"returns":{"_0":"Submission interval."}},"computeL2Timestamp(uint256)":{"params":{"_l2BlockNumber":"The L2 block number of the target block."},"returns":{"_0":"L2 timestamp of the given block."}},"deleteL2Outputs(uint256)":{"params":{"_l2OutputIndex":"Index of the first L2 output to be deleted. All outputs after this output will also be deleted."}},"getL2Output(uint256)":{"params":{"_l2OutputIndex":"Index of the output to return."},"returns":{"_0":"The output at the given index."}},"getL2OutputAfter(uint256)":{"params":{"_l2BlockNumber":"L2 block number to find a checkpoint for."},"returns":{"_0":"First checkpoint that commits to the given L2 block number."}},"getL2OutputIndexAfter(uint256)":{"params":{"_l2BlockNumber":"L2 block number to find a checkpoint for."},"returns":{"_0":"Index of the first checkpoint that commits to the given L2 block number."}},"initialize(uint256,uint256,uint256,uint256,address,address,uint256)":{"params":{"_challenger":"The address of the challenger.","_finalizationPeriodSeconds":"The minimum time (in seconds) that must elapse before a withdrawal can be finalized.","_l2BlockTime":"The time per L2 block, in seconds.","_proposer":"The address of the proposer.","_startingBlockNumber":"The number of the first L2 block.","_startingTimestamp":"The timestamp of the first L2 block.","_submissionInterval":"Interval in blocks at which checkpoints must be submitted."}},"latestBlockNumber()":{"returns":{"_0":"Latest submitted L2 block number."}},"latestOutputIndex()":{"returns":{"_0":"The number of outputs that have been proposed."}},"nextBlockNumber()":{"returns":{"_0":"Next L2 block number."}},"nextOutputIndex()":{"returns":{"_0":"The index of the next output to be proposed."}},"proposeL2Output(bytes32,uint256,bytes32,uint256)":{"params":{"_l1BlockHash":"A block hash which must be included in the current chain.","_l1BlockNumber":"The block number with the specified block hash.","_l2BlockNumber":"The L2 block number that resulted in _outputRoot.","_outputRoot":"The L2 output of the checkpoint block."}}},"events":{"OutputProposed(bytes32,uint256,uint256,uint256)":{"params":{"l1Timestamp":"The L1 timestamp when proposed.","l2BlockNumber":"The L2 block number of the output root.","l2OutputIndex":"The index of the output in the l2Outputs array.","outputRoot":"The output root."}},"OutputsDeleted(uint256,uint256)":{"params":{"newNextOutputIndex":"Next L2 output index after the deletion.","prevNextOutputIndex":"Next L2 output index before the deletion."}}}},"ast":{"absolutePath":"src/L1/L2OutputOracle.sol","id":86436,"exportedSymbols":{"Constants":[103096],"ISemver":[109417],"Initializable":[49678],"L2OutputOracle":[86435],"Types":[104349]},"nodeType":"SourceUnit","src":"32:14005:133","nodes":[{"id":85923,"nodeType":"PragmaDirective","src":"32:23:133","nodes":[],"literals":["solidity","0.8",".15"]},{"id":85925,"nodeType":"ImportDirective","src":"57:86:133","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol","file":"@openzeppelin/contracts/proxy/utils/Initializable.sol","nameLocation":"-1:-1:-1","scope":86436,"sourceUnit":49679,"symbolAliases":[{"foreign":{"id":85924,"name":"Initializable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":49678,"src":"66:13:133","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85927,"nodeType":"ImportDirective","src":"144:52:133","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":86436,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":85926,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"153:7:133","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85929,"nodeType":"ImportDirective","src":"197:48:133","nodes":[],"absolutePath":"src/libraries/Types.sol","file":"src/libraries/Types.sol","nameLocation":"-1:-1:-1","scope":86436,"sourceUnit":104350,"symbolAliases":[{"foreign":{"id":85928,"name":"Types","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104349,"src":"206:5:133","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":85931,"nodeType":"ImportDirective","src":"246:56:133","nodes":[],"absolutePath":"src/libraries/Constants.sol","file":"src/libraries/Constants.sol","nameLocation":"-1:-1:-1","scope":86436,"sourceUnit":103097,"symbolAliases":[{"foreign":{"id":85930,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"255:9:133","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86435,"nodeType":"ContractDefinition","src":"611:13425:133","nodes":[{"id":85939,"nodeType":"VariableDeclaration","src":"743:34:133","nodes":[],"constant":false,"documentation":{"id":85937,"nodeType":"StructuredDocumentation","src":"667:71:133","text":"@notice The number of the first L2 block recorded in this contract."},"functionSelector":"70872aa5","mutability":"mutable","name":"startingBlockNumber","nameLocation":"758:19:133","scope":86435,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85938,"name":"uint256","nodeType":"ElementaryTypeName","src":"743:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":85942,"nodeType":"VariableDeclaration","src":"863:32:133","nodes":[],"constant":false,"documentation":{"id":85940,"nodeType":"StructuredDocumentation","src":"784:74:133","text":"@notice The timestamp of the first L2 block recorded in this contract."},"functionSelector":"88786272","mutability":"mutable","name":"startingTimestamp","nameLocation":"878:17:133","scope":86435,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85941,"name":"uint256","nodeType":"ElementaryTypeName","src":"863:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":85947,"nodeType":"VariableDeclaration","src":"951:41:133","nodes":[],"constant":false,"documentation":{"id":85943,"nodeType":"StructuredDocumentation","src":"902:44:133","text":"@notice An array of L2 output proposals."},"mutability":"mutable","name":"l2Outputs","nameLocation":"983:9:133","scope":86435,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal[]"},"typeName":{"baseType":{"id":85945,"nodeType":"UserDefinedTypeName","pathNode":{"id":85944,"name":"Types.OutputProposal","nodeType":"IdentifierPath","referencedDeclaration":104307,"src":"951:20:133"},"referencedDeclaration":104307,"src":"951:20:133","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_storage_ptr","typeString":"struct Types.OutputProposal"}},"id":85946,"nodeType":"ArrayTypeName","src":"951:22:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage_ptr","typeString":"struct Types.OutputProposal[]"}},"visibility":"internal"},{"id":85950,"nodeType":"VariableDeclaration","src":"1114:33:133","nodes":[],"constant":false,"documentation":{"id":85948,"nodeType":"StructuredDocumentation","src":"999:110:133","text":"@notice The interval in L2 blocks at which checkpoints must be submitted.\n @custom:network-specific"},"functionSelector":"e1a41bcf","mutability":"mutable","name":"submissionInterval","nameLocation":"1129:18:133","scope":86435,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85949,"name":"uint256","nodeType":"ElementaryTypeName","src":"1114:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":85953,"nodeType":"VariableDeclaration","src":"1285:26:133","nodes":[],"constant":false,"documentation":{"id":85951,"nodeType":"StructuredDocumentation","src":"1154:126:133","text":"@notice The time between L2 blocks in seconds. Once set, this value MUST NOT be modified.\n @custom:network-specific"},"functionSelector":"93991af3","mutability":"mutable","name":"l2BlockTime","nameLocation":"1300:11:133","scope":86435,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85952,"name":"uint256","nodeType":"ElementaryTypeName","src":"1285:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":85956,"nodeType":"VariableDeclaration","src":"1426:25:133","nodes":[],"constant":false,"documentation":{"id":85954,"nodeType":"StructuredDocumentation","src":"1318:103:133","text":"@notice The address of the challenger. Can be updated via upgrade.\n @custom:network-specific"},"functionSelector":"534db0e2","mutability":"mutable","name":"challenger","nameLocation":"1441:10:133","scope":86435,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85955,"name":"address","nodeType":"ElementaryTypeName","src":"1426:7:133","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":85959,"nodeType":"VariableDeclaration","src":"1564:23:133","nodes":[],"constant":false,"documentation":{"id":85957,"nodeType":"StructuredDocumentation","src":"1458:101:133","text":"@notice The address of the proposer. Can be updated via upgrade.\n @custom:network-specific"},"functionSelector":"a8e4fb90","mutability":"mutable","name":"proposer","nameLocation":"1579:8:133","scope":86435,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85958,"name":"address","nodeType":"ElementaryTypeName","src":"1564:7:133","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":85962,"nodeType":"VariableDeclaration","src":"1728:40:133","nodes":[],"constant":false,"documentation":{"id":85960,"nodeType":"StructuredDocumentation","src":"1594:129:133","text":"@notice The minimum time (in seconds) that must elapse before a withdrawal can be finalized.\n @custom:network-specific"},"functionSelector":"ce5db8d6","mutability":"mutable","name":"finalizationPeriodSeconds","nameLocation":"1743:25:133","scope":86435,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85961,"name":"uint256","nodeType":"ElementaryTypeName","src":"1728:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":85973,"nodeType":"EventDefinition","src":"2080:146:133","nodes":[],"anonymous":false,"documentation":{"id":85963,"nodeType":"StructuredDocumentation","src":"1775:300:133","text":"@notice Emitted when an output is proposed.\n @param outputRoot The output root.\n @param l2OutputIndex The index of the output in the l2Outputs array.\n @param l2BlockNumber The L2 block number of the output root.\n @param l1Timestamp The L1 timestamp when proposed."},"eventSelector":"a7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2","name":"OutputProposed","nameLocation":"2086:14:133","parameters":{"id":85972,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85965,"indexed":true,"mutability":"mutable","name":"outputRoot","nameLocation":"2126:10:133","nodeType":"VariableDeclaration","scope":85973,"src":"2110:26:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":85964,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2110:7:133","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":85967,"indexed":true,"mutability":"mutable","name":"l2OutputIndex","nameLocation":"2154:13:133","nodeType":"VariableDeclaration","scope":85973,"src":"2138:29:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85966,"name":"uint256","nodeType":"ElementaryTypeName","src":"2138:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85969,"indexed":true,"mutability":"mutable","name":"l2BlockNumber","nameLocation":"2185:13:133","nodeType":"VariableDeclaration","scope":85973,"src":"2169:29:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85968,"name":"uint256","nodeType":"ElementaryTypeName","src":"2169:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85971,"indexed":false,"mutability":"mutable","name":"l1Timestamp","nameLocation":"2208:11:133","nodeType":"VariableDeclaration","scope":85973,"src":"2200:19:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85970,"name":"uint256","nodeType":"ElementaryTypeName","src":"2200:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2100:125:133"}},{"id":85980,"nodeType":"EventDefinition","src":"2435:94:133","nodes":[],"anonymous":false,"documentation":{"id":85974,"nodeType":"StructuredDocumentation","src":"2232:198:133","text":"@notice Emitted when outputs are deleted.\n @param prevNextOutputIndex Next L2 output index before the deletion.\n @param newNextOutputIndex Next L2 output index after the deletion."},"eventSelector":"4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b6","name":"OutputsDeleted","nameLocation":"2441:14:133","parameters":{"id":85979,"nodeType":"ParameterList","parameters":[{"constant":false,"id":85976,"indexed":true,"mutability":"mutable","name":"prevNextOutputIndex","nameLocation":"2472:19:133","nodeType":"VariableDeclaration","scope":85980,"src":"2456:35:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85975,"name":"uint256","nodeType":"ElementaryTypeName","src":"2456:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":85978,"indexed":true,"mutability":"mutable","name":"newNextOutputIndex","nameLocation":"2509:18:133","nodeType":"VariableDeclaration","scope":85980,"src":"2493:34:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":85977,"name":"uint256","nodeType":"ElementaryTypeName","src":"2493:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2455:73:133"}},{"id":85984,"nodeType":"VariableDeclaration","src":"2598:40:133","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":85981,"nodeType":"StructuredDocumentation","src":"2535:58:133","text":"@notice Semantic version.\n @custom:semver 1.8.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"2621:7:133","scope":86435,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":85982,"name":"string","nodeType":"ElementaryTypeName","src":"2598:6:133","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"312e382e30","id":85983,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2631:7:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_cd02a4b5da981b4c403351c949b2ca4bdb2fb4b72b50891f7eb106d3eb7049e9","typeString":"literal_string \"1.8.0\""},"value":"1.8.0"},"visibility":"public"},{"id":86005,"nodeType":"FunctionDefinition","src":"2792:305:133","nodes":[],"body":{"id":86004,"nodeType":"Block","src":"2806:291:133","nodes":[],"statements":[{"expression":{"arguments":[{"hexValue":"31","id":85989,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2862:1:133","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},{"hexValue":"31","id":85990,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2891:1:133","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},{"hexValue":"30","id":85991,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2928:1:133","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":85992,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2963:1:133","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"arguments":[{"hexValue":"30","id":85995,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2997:1:133","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":85994,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2989:7:133","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85993,"name":"address","nodeType":"ElementaryTypeName","src":"2989:7:133","typeDescriptions":{}}},"id":85996,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2989:10:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":85999,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3034:1:133","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":85998,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3026:7:133","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":85997,"name":"address","nodeType":"ElementaryTypeName","src":"3026:7:133","typeDescriptions":{}}},"id":86000,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3026:10:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":86001,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3078:1:133","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":85988,"name":"initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86076,"src":"2816:10:133","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (uint256,uint256,uint256,uint256,address,address,uint256)"}},"id":86002,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_submissionInterval","_l2BlockTime","_startingBlockNumber","_startingTimestamp","_proposer","_challenger","_finalizationPeriodSeconds"],"nodeType":"FunctionCall","src":"2816:274:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86003,"nodeType":"ExpressionStatement","src":"2816:274:133"}]},"documentation":{"id":85985,"nodeType":"StructuredDocumentation","src":"2645:142:133","text":"@notice Constructs the L2OutputOracle contract. Initializes variables to the same values as\n in the getting-started config."},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":85986,"nodeType":"ParameterList","parameters":[],"src":"2803:2:133"},"returnParameters":{"id":85987,"nodeType":"ParameterList","parameters":[],"src":"2806:0:133"},"scope":86435,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":86076,"nodeType":"FunctionDefinition","src":"3742:985:133","nodes":[],"body":{"id":86075,"nodeType":"Block","src":"4048:679:133","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86028,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86026,"name":"_submissionInterval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86008,"src":"4066:19:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":86027,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4088:1:133","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4066:23:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657276616c206d7573742062652067726561746572207468616e2030","id":86029,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4091:60:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_a22226fa4dda9c6c644d22b26affbedef5d3fc150a8b26008a6baa26d85d543f","typeString":"literal_string \"L2OutputOracle: submission interval must be greater than 0\""},"value":"L2OutputOracle: submission interval must be greater than 0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_a22226fa4dda9c6c644d22b26affbedef5d3fc150a8b26008a6baa26d85d543f","typeString":"literal_string \"L2OutputOracle: submission interval must be greater than 0\""}],"id":86025,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4058:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86030,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4058:94:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86031,"nodeType":"ExpressionStatement","src":"4058:94:133"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86035,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86033,"name":"_l2BlockTime","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86010,"src":"4170:12:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":86034,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4185:1:133","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4170:16:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7573742062652067726561746572207468616e2030","id":86036,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4188:54:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_ac9ff37c1a6529ab3b67321d57550ba5021740edf6aa58a5708726b9aa5179b7","typeString":"literal_string \"L2OutputOracle: L2 block time must be greater than 0\""},"value":"L2OutputOracle: L2 block time must be greater than 0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ac9ff37c1a6529ab3b67321d57550ba5021740edf6aa58a5708726b9aa5179b7","typeString":"literal_string \"L2OutputOracle: L2 block time must be greater than 0\""}],"id":86032,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4162:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86037,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4162:81:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86038,"nodeType":"ExpressionStatement","src":"4162:81:133"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86043,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86040,"name":"_startingTimestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86014,"src":"4274:18:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"id":86041,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"4296:5:133","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":86042,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"4296:15:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4274:37:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a207374617274696e67204c322074696d657374616d70206d757374206265206c657373207468616e2063757272656e742074696d65","id":86044,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4325:70:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_898fd7ed8708de35483db60bd4b962ea9e8aa9058ba6455714580e35a9e067a7","typeString":"literal_string \"L2OutputOracle: starting L2 timestamp must be less than current time\""},"value":"L2OutputOracle: starting L2 timestamp must be less than current time"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_898fd7ed8708de35483db60bd4b962ea9e8aa9058ba6455714580e35a9e067a7","typeString":"literal_string \"L2OutputOracle: starting L2 timestamp must be less than current time\""}],"id":86039,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4253:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86045,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4253:152:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86046,"nodeType":"ExpressionStatement","src":"4253:152:133"},{"expression":{"id":86049,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86047,"name":"submissionInterval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85950,"src":"4416:18:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":86048,"name":"_submissionInterval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86008,"src":"4437:19:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4416:40:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":86050,"nodeType":"ExpressionStatement","src":"4416:40:133"},{"expression":{"id":86053,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86051,"name":"l2BlockTime","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85953,"src":"4466:11:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":86052,"name":"_l2BlockTime","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86010,"src":"4480:12:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4466:26:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":86054,"nodeType":"ExpressionStatement","src":"4466:26:133"},{"expression":{"id":86057,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86055,"name":"startingBlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85939,"src":"4502:19:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":86056,"name":"_startingBlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86012,"src":"4524:20:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4502:42:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":86058,"nodeType":"ExpressionStatement","src":"4502:42:133"},{"expression":{"id":86061,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86059,"name":"startingTimestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85942,"src":"4554:17:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":86060,"name":"_startingTimestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86014,"src":"4574:18:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4554:38:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":86062,"nodeType":"ExpressionStatement","src":"4554:38:133"},{"expression":{"id":86065,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86063,"name":"proposer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85959,"src":"4602:8:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":86064,"name":"_proposer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86016,"src":"4613:9:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4602:20:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":86066,"nodeType":"ExpressionStatement","src":"4602:20:133"},{"expression":{"id":86069,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86067,"name":"challenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85956,"src":"4632:10:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":86068,"name":"_challenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86018,"src":"4645:11:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4632:24:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":86070,"nodeType":"ExpressionStatement","src":"4632:24:133"},{"expression":{"id":86073,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86071,"name":"finalizationPeriodSeconds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85962,"src":"4666:25:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":86072,"name":"_finalizationPeriodSeconds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86020,"src":"4694:26:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4666:54:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":86074,"nodeType":"ExpressionStatement","src":"4666:54:133"}]},"documentation":{"id":86006,"nodeType":"StructuredDocumentation","src":"3103:634:133","text":"@notice Initializer.\n @param _submissionInterval Interval in blocks at which checkpoints must be submitted.\n @param _l2BlockTime The time per L2 block, in seconds.\n @param _startingBlockNumber The number of the first L2 block.\n @param _startingTimestamp The timestamp of the first L2 block.\n @param _proposer The address of the proposer.\n @param _challenger The address of the challenger.\n @param _finalizationPeriodSeconds The minimum time (in seconds) that must elapse before a withdrawal\n can be finalized."},"functionSelector":"1c89c97d","implemented":true,"kind":"function","modifiers":[{"id":86023,"kind":"modifierInvocation","modifierName":{"id":86022,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":49598,"src":"4032:11:133"},"nodeType":"ModifierInvocation","src":"4032:11:133"}],"name":"initialize","nameLocation":"3751:10:133","parameters":{"id":86021,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86008,"mutability":"mutable","name":"_submissionInterval","nameLocation":"3779:19:133","nodeType":"VariableDeclaration","scope":86076,"src":"3771:27:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86007,"name":"uint256","nodeType":"ElementaryTypeName","src":"3771:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":86010,"mutability":"mutable","name":"_l2BlockTime","nameLocation":"3816:12:133","nodeType":"VariableDeclaration","scope":86076,"src":"3808:20:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86009,"name":"uint256","nodeType":"ElementaryTypeName","src":"3808:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":86012,"mutability":"mutable","name":"_startingBlockNumber","nameLocation":"3846:20:133","nodeType":"VariableDeclaration","scope":86076,"src":"3838:28:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86011,"name":"uint256","nodeType":"ElementaryTypeName","src":"3838:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":86014,"mutability":"mutable","name":"_startingTimestamp","nameLocation":"3884:18:133","nodeType":"VariableDeclaration","scope":86076,"src":"3876:26:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86013,"name":"uint256","nodeType":"ElementaryTypeName","src":"3876:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":86016,"mutability":"mutable","name":"_proposer","nameLocation":"3920:9:133","nodeType":"VariableDeclaration","scope":86076,"src":"3912:17:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":86015,"name":"address","nodeType":"ElementaryTypeName","src":"3912:7:133","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":86018,"mutability":"mutable","name":"_challenger","nameLocation":"3947:11:133","nodeType":"VariableDeclaration","scope":86076,"src":"3939:19:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":86017,"name":"address","nodeType":"ElementaryTypeName","src":"3939:7:133","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":86020,"mutability":"mutable","name":"_finalizationPeriodSeconds","nameLocation":"3976:26:133","nodeType":"VariableDeclaration","scope":86076,"src":"3968:34:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86019,"name":"uint256","nodeType":"ElementaryTypeName","src":"3968:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3761:247:133"},"returnParameters":{"id":86024,"nodeType":"ParameterList","parameters":[],"src":"4048:0:133"},"scope":86435,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":86085,"nodeType":"FunctionDefinition","src":"4953:105:133","nodes":[],"body":{"id":86084,"nodeType":"Block","src":"5016:42:133","nodes":[],"statements":[{"expression":{"id":86082,"name":"submissionInterval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85950,"src":"5033:18:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":86081,"id":86083,"nodeType":"Return","src":"5026:25:133"}]},"documentation":{"id":86077,"nodeType":"StructuredDocumentation","src":"4733:215:133","text":"@notice Getter for the submissionInterval.\n Public getter is legacy and will be removed in the future. Use `submissionInterval` instead.\n @return Submission interval.\n @custom:legacy"},"functionSelector":"529933df","implemented":true,"kind":"function","modifiers":[],"name":"SUBMISSION_INTERVAL","nameLocation":"4962:19:133","parameters":{"id":86078,"nodeType":"ParameterList","parameters":[],"src":"4981:2:133"},"returnParameters":{"id":86081,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86080,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86085,"src":"5007:7:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86079,"name":"uint256","nodeType":"ElementaryTypeName","src":"5007:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5006:9:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":86094,"nodeType":"FunctionDefinition","src":"5264:92:133","nodes":[],"body":{"id":86093,"nodeType":"Block","src":"5321:35:133","nodes":[],"statements":[{"expression":{"id":86091,"name":"l2BlockTime","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85953,"src":"5338:11:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":86090,"id":86092,"nodeType":"Return","src":"5331:18:133"}]},"documentation":{"id":86086,"nodeType":"StructuredDocumentation","src":"5064:195:133","text":"@notice Getter for the l2BlockTime.\n Public getter is legacy and will be removed in the future. Use `l2BlockTime` instead.\n @return L2 block time.\n @custom:legacy"},"functionSelector":"002134cc","implemented":true,"kind":"function","modifiers":[],"name":"L2_BLOCK_TIME","nameLocation":"5273:13:133","parameters":{"id":86087,"nodeType":"ParameterList","parameters":[],"src":"5286:2:133"},"returnParameters":{"id":86090,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86089,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86094,"src":"5312:7:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86088,"name":"uint256","nodeType":"ElementaryTypeName","src":"5312:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5311:9:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":86103,"nodeType":"FunctionDefinition","src":"5580:88:133","nodes":[],"body":{"id":86102,"nodeType":"Block","src":"5634:34:133","nodes":[],"statements":[{"expression":{"id":86100,"name":"challenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85956,"src":"5651:10:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":86099,"id":86101,"nodeType":"Return","src":"5644:17:133"}]},"documentation":{"id":86095,"nodeType":"StructuredDocumentation","src":"5362:213:133","text":"@notice Getter for the challenger address.\n Public getter is legacy and will be removed in the future. Use `challenger` instead.\n @return Address of the challenger.\n @custom:legacy"},"functionSelector":"6b4d98dd","implemented":true,"kind":"function","modifiers":[],"name":"CHALLENGER","nameLocation":"5589:10:133","parameters":{"id":86096,"nodeType":"ParameterList","parameters":[],"src":"5599:2:133"},"returnParameters":{"id":86099,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86098,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86103,"src":"5625:7:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":86097,"name":"address","nodeType":"ElementaryTypeName","src":"5625:7:133","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5624:9:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":86112,"nodeType":"FunctionDefinition","src":"5886:84:133","nodes":[],"body":{"id":86111,"nodeType":"Block","src":"5938:32:133","nodes":[],"statements":[{"expression":{"id":86109,"name":"proposer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85959,"src":"5955:8:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":86108,"id":86110,"nodeType":"Return","src":"5948:15:133"}]},"documentation":{"id":86104,"nodeType":"StructuredDocumentation","src":"5674:207:133","text":"@notice Getter for the proposer address.\n Public getter is legacy and will be removed in the future. Use `proposer` instead.\n @return Address of the proposer.\n @custom:legacy"},"functionSelector":"bffa7f0f","implemented":true,"kind":"function","modifiers":[],"name":"PROPOSER","nameLocation":"5895:8:133","parameters":{"id":86105,"nodeType":"ParameterList","parameters":[],"src":"5903:2:133"},"returnParameters":{"id":86108,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86107,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86112,"src":"5929:7:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":86106,"name":"address","nodeType":"ElementaryTypeName","src":"5929:7:133","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5928:9:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":86121,"nodeType":"FunctionDefinition","src":"6221:120:133","nodes":[],"body":{"id":86120,"nodeType":"Block","src":"6292:49:133","nodes":[],"statements":[{"expression":{"id":86118,"name":"finalizationPeriodSeconds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85962,"src":"6309:25:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":86117,"id":86119,"nodeType":"Return","src":"6302:32:133"}]},"documentation":{"id":86113,"nodeType":"StructuredDocumentation","src":"5976:240:133","text":"@notice Getter for the finalizationPeriodSeconds.\n Public getter is legacy and will be removed in the future. Use `finalizationPeriodSeconds` instead.\n @return Finalization period in seconds.\n @custom:legacy"},"functionSelector":"f4daa291","implemented":true,"kind":"function","modifiers":[],"name":"FINALIZATION_PERIOD_SECONDS","nameLocation":"6230:27:133","parameters":{"id":86114,"nodeType":"ParameterList","parameters":[],"src":"6257:2:133"},"returnParameters":{"id":86117,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86116,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86121,"src":"6283:7:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86115,"name":"uint256","nodeType":"ElementaryTypeName","src":"6283:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6282:9:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":86168,"nodeType":"FunctionDefinition","src":"6689:975:133","nodes":[],"body":{"id":86167,"nodeType":"Block","src":"6747:917:133","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":86131,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86128,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"6765:3:133","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":86129,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"6765:10:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":86130,"name":"challenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85956,"src":"6779:10:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6765:24:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e67657220616464726573732063616e2064656c657465206f757470757473","id":86132,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6791:64:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_73ca084205f86e7b7b010a7bf147aa19f097b7f0a2c7768452f50d69ddf1c8a6","typeString":"literal_string \"L2OutputOracle: only the challenger address can delete outputs\""},"value":"L2OutputOracle: only the challenger address can delete outputs"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_73ca084205f86e7b7b010a7bf147aa19f097b7f0a2c7768452f50d69ddf1c8a6","typeString":"literal_string \"L2OutputOracle: only the challenger address can delete outputs\""}],"id":86127,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6757:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6757:99:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86134,"nodeType":"ExpressionStatement","src":"6757:99:133"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86139,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86136,"name":"_l2OutputIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86124,"src":"6957:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":86137,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"6974:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86138,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"6974:16:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6957:33:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f75747075747320616674657220746865206c6174657374206f757470757420696e646578","id":86140,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6992:69:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_8fade7eaadcf8920b61cd280bfaf9215de3229fd9b8bc0c114506f50c3323d08","typeString":"literal_string \"L2OutputOracle: cannot delete outputs after the latest output index\""},"value":"L2OutputOracle: cannot delete outputs after the latest output index"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_8fade7eaadcf8920b61cd280bfaf9215de3229fd9b8bc0c114506f50c3323d08","typeString":"literal_string \"L2OutputOracle: cannot delete outputs after the latest output index\""}],"id":86135,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6936:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86141,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6936:135:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86142,"nodeType":"ExpressionStatement","src":"6936:135:133"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86152,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86150,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86144,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"7182:5:133","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":86145,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"7182:15:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"expression":{"baseExpression":{"id":86146,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"7200:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86148,"indexExpression":{"id":86147,"name":"_l2OutputIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86124,"src":"7210:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7200:25:133","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_storage","typeString":"struct Types.OutputProposal storage ref"}},"id":86149,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":104304,"src":"7200:35:133","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"src":"7182:53:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":86151,"name":"finalizationPeriodSeconds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85962,"src":"7238:25:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7182:81:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7574707574732074686174206861766520616c7265616479206265656e2066696e616c697a6564","id":86153,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7277:72:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_d750945a6d3cdf9f7770d0a5d95aa9b56f37a0ad47759ca246a1b772fdac6c07","typeString":"literal_string \"L2OutputOracle: cannot delete outputs that have already been finalized\""},"value":"L2OutputOracle: cannot delete outputs that have already been finalized"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_d750945a6d3cdf9f7770d0a5d95aa9b56f37a0ad47759ca246a1b772fdac6c07","typeString":"literal_string \"L2OutputOracle: cannot delete outputs that have already been finalized\""}],"id":86143,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7161:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86154,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7161:198:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86155,"nodeType":"ExpressionStatement","src":"7161:198:133"},{"assignments":[86157],"declarations":[{"constant":false,"id":86157,"mutability":"mutable","name":"prevNextL2OutputIndex","nameLocation":"7378:21:133","nodeType":"VariableDeclaration","scope":86167,"src":"7370:29:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86156,"name":"uint256","nodeType":"ElementaryTypeName","src":"7370:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":86160,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":86158,"name":"nextOutputIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86382,"src":"7402:15:133","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":86159,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7402:17:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7370:49:133"},{"AST":{"nodeType":"YulBlock","src":"7527:62:133","statements":[{"expression":{"arguments":[{"name":"l2Outputs.slot","nodeType":"YulIdentifier","src":"7548:14:133"},{"name":"_l2OutputIndex","nodeType":"YulIdentifier","src":"7564:14:133"}],"functionName":{"name":"sstore","nodeType":"YulIdentifier","src":"7541:6:133"},"nodeType":"YulFunctionCall","src":"7541:38:133"},"nodeType":"YulExpressionStatement","src":"7541:38:133"}]},"evmVersion":"london","externalReferences":[{"declaration":86124,"isOffset":false,"isSlot":false,"src":"7564:14:133","valueSize":1},{"declaration":85947,"isOffset":false,"isSlot":true,"src":"7548:14:133","suffix":"slot","valueSize":1}],"id":86161,"nodeType":"InlineAssembly","src":"7518:71:133"},{"eventCall":{"arguments":[{"id":86163,"name":"prevNextL2OutputIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86157,"src":"7619:21:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":86164,"name":"_l2OutputIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86124,"src":"7642:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":86162,"name":"OutputsDeleted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85980,"src":"7604:14:133","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (uint256,uint256)"}},"id":86165,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7604:53:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86166,"nodeType":"EmitStatement","src":"7599:58:133"}]},"documentation":{"id":86122,"nodeType":"StructuredDocumentation","src":"6347:337:133","text":"@notice Deletes all output proposals after and including the proposal that corresponds to\n the given output index. Only the challenger address can delete outputs.\n @param _l2OutputIndex Index of the first L2 output to be deleted.\n All outputs after this output will also be deleted."},"functionSelector":"89c44cbb","implemented":true,"kind":"function","modifiers":[],"name":"deleteL2Outputs","nameLocation":"6698:15:133","parameters":{"id":86125,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86124,"mutability":"mutable","name":"_l2OutputIndex","nameLocation":"6722:14:133","nodeType":"VariableDeclaration","scope":86168,"src":"6714:22:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86123,"name":"uint256","nodeType":"ElementaryTypeName","src":"6714:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6713:24:133"},"returnParameters":{"id":86126,"nodeType":"ParameterList","parameters":[],"src":"6747:0:133"},"scope":86435,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":86261,"nodeType":"FunctionDefinition","src":"8258:1981:133","nodes":[],"body":{"id":86260,"nodeType":"Block","src":"8449:1790:133","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":86184,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86181,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"8467:3:133","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":86182,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"8467:10:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":86183,"name":"proposer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85959,"src":"8481:8:133","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8467:22:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f73657220616464726573732063616e2070726f706f7365206e6577206f757470757473","id":86185,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8491:67:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_9f1c67e2dc62ce3502755d353f72e304832f39c730ef77e02614e374f1fb53d3","typeString":"literal_string \"L2OutputOracle: only the proposer address can propose new outputs\""},"value":"L2OutputOracle: only the proposer address can propose new outputs"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_9f1c67e2dc62ce3502755d353f72e304832f39c730ef77e02614e374f1fb53d3","typeString":"literal_string \"L2OutputOracle: only the proposer address can propose new outputs\""}],"id":86180,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8459:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86186,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8459:100:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86187,"nodeType":"ExpressionStatement","src":"8459:100:133"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86192,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86189,"name":"_l2BlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86173,"src":"8591:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":86190,"name":"nextBlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86415,"src":"8609:15:133","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":86191,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8609:17:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8591:35:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d75737420626520657175616c20746f206e65787420657870656374656420626c6f636b206e756d626572","id":86193,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8640:74:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_06e1bf88480451e9a05edd933fbefd888745eeb4cd60fea580144d9699d6c8c6","typeString":"literal_string \"L2OutputOracle: block number must be equal to next expected block number\""},"value":"L2OutputOracle: block number must be equal to next expected block number"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_06e1bf88480451e9a05edd933fbefd888745eeb4cd60fea580144d9699d6c8c6","typeString":"literal_string \"L2OutputOracle: block number must be equal to next expected block number\""}],"id":86188,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8570:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86194,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8570:154:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86195,"nodeType":"ExpressionStatement","src":"8570:154:133"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86202,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":86198,"name":"_l2BlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86173,"src":"8775:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":86197,"name":"computeL2Timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86434,"src":"8756:18:133","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) view returns (uint256)"}},"id":86199,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8756:34:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":86200,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"8793:5:133","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":86201,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"8793:15:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8756:52:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c32206f757470757420696e2074686520667574757265","id":86203,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8822:56:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_398aa710210a226bac70935aec326d363ca55bd0968a10f188845909ad22cbc6","typeString":"literal_string \"L2OutputOracle: cannot propose L2 output in the future\""},"value":"L2OutputOracle: cannot propose L2 output in the future"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_398aa710210a226bac70935aec326d363ca55bd0968a10f188845909ad22cbc6","typeString":"literal_string \"L2OutputOracle: cannot propose L2 output in the future\""}],"id":86196,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8735:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86204,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8735:153:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86205,"nodeType":"ExpressionStatement","src":"8735:153:133"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":86212,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86207,"name":"_outputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86171,"src":"8907:11:133","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":86210,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8930:1:133","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":86209,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8922:7:133","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":86208,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8922:7:133","typeDescriptions":{}}},"id":86211,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8922:10:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"8907:25:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a204c32206f75747075742070726f706f73616c2063616e6e6f7420626520746865207a65726f2068617368","id":86213,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8934:60:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_bd49586dceb93dcaff5457c4b7f965cdcdd796092fef31828e5d2ee522ee1ffa","typeString":"literal_string \"L2OutputOracle: L2 output proposal cannot be the zero hash\""},"value":"L2OutputOracle: L2 output proposal cannot be the zero hash"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bd49586dceb93dcaff5457c4b7f965cdcdd796092fef31828e5d2ee522ee1ffa","typeString":"literal_string \"L2OutputOracle: L2 output proposal cannot be the zero hash\""}],"id":86206,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8899:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86214,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8899:96:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86215,"nodeType":"ExpressionStatement","src":"8899:96:133"},{"condition":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":86221,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86216,"name":"_l1BlockHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86175,"src":"9010:12:133","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":86219,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9034:1:133","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":86218,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9026:7:133","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":86217,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9026:7:133","typeDescriptions":{}}},"id":86220,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9026:10:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"9010:26:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":86232,"nodeType":"IfStatement","src":"9006:897:133","trueBody":{"id":86231,"nodeType":"Block","src":"9038:865:133","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":86227,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":86224,"name":"_l1BlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86177,"src":"9754:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":86223,"name":"blockhash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-5,"src":"9744:9:133","typeDescriptions":{"typeIdentifier":"t_function_blockhash_view$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256) view returns (bytes32)"}},"id":86225,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9744:25:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":86226,"name":"_l1BlockHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86175,"src":"9773:12:133","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"9744:41:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a20626c6f636b206861736820646f6573206e6f74206d617463682074686520686173682061742074686520657870656374656420686569676874","id":86228,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9803:75:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_126a709d462b085b243904a4250a7244b58590dd3a6ba08b7c943ca19e9fb452","typeString":"literal_string \"L2OutputOracle: block hash does not match the hash at the expected height\""},"value":"L2OutputOracle: block hash does not match the hash at the expected height"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_126a709d462b085b243904a4250a7244b58590dd3a6ba08b7c943ca19e9fb452","typeString":"literal_string \"L2OutputOracle: block hash does not match the hash at the expected height\""}],"id":86222,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"9719:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86229,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9719:173:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86230,"nodeType":"ExpressionStatement","src":"9719:173:133"}]}},{"eventCall":{"arguments":[{"id":86234,"name":"_outputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86171,"src":"9933:11:133","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":86235,"name":"nextOutputIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86382,"src":"9946:15:133","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":86236,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9946:17:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":86237,"name":"_l2BlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86173,"src":"9965:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":86238,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"9981:5:133","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":86239,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"9981:15:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":86233,"name":"OutputProposed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85973,"src":"9918:14:133","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256,uint256,uint256)"}},"id":86240,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9918:79:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86241,"nodeType":"EmitStatement","src":"9913:84:133"},{"expression":{"arguments":[{"arguments":[{"id":86247,"name":"_outputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86171,"src":"10087:11:133","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"expression":{"id":86250,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"10135:5:133","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":86251,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"10135:15:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":86249,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10127:7:133","typeDescriptions":{"typeIdentifier":"t_type$_t_uint128_$","typeString":"type(uint128)"},"typeName":{"id":86248,"name":"uint128","nodeType":"ElementaryTypeName","src":"10127:7:133","typeDescriptions":{}}},"id":86252,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10127:24:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},{"arguments":[{"id":86255,"name":"_l2BlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86173,"src":"10192:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":86254,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10184:7:133","typeDescriptions":{"typeIdentifier":"t_type$_t_uint128_$","typeString":"type(uint128)"},"typeName":{"id":86253,"name":"uint128","nodeType":"ElementaryTypeName","src":"10184:7:133","typeDescriptions":{}}},"id":86256,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10184:23:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint128","typeString":"uint128"},{"typeIdentifier":"t_uint128","typeString":"uint128"}],"expression":{"id":86245,"name":"Types","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104349,"src":"10036:5:133","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Types_$104349_$","typeString":"type(library Types)"}},"id":86246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"OutputProposal","nodeType":"MemberAccess","referencedDeclaration":104307,"src":"10036:20:133","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_OutputProposal_$104307_storage_ptr_$","typeString":"type(struct Types.OutputProposal storage pointer)"}},"id":86257,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":["outputRoot","timestamp","l2BlockNumber"],"nodeType":"FunctionCall","src":"10036:186:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_memory_ptr","typeString":"struct Types.OutputProposal memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_OutputProposal_$104307_memory_ptr","typeString":"struct Types.OutputProposal memory"}],"expression":{"id":86242,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"10008:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86244,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"push","nodeType":"MemberAccess","src":"10008:14:133","typeDescriptions":{"typeIdentifier":"t_function_arraypush_nonpayable$_t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage_ptr_$_t_struct$_OutputProposal_$104307_storage_$returns$__$bound_to$_t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage_ptr_$","typeString":"function (struct Types.OutputProposal storage ref[] storage pointer,struct Types.OutputProposal storage ref)"}},"id":86258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10008:224:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86259,"nodeType":"ExpressionStatement","src":"10008:224:133"}]},"documentation":{"id":86169,"nodeType":"StructuredDocumentation","src":"7670:583:133","text":"@notice Accepts an outputRoot and the timestamp of the corresponding L2 block.\n The timestamp must be equal to the current value returned by `nextTimestamp()` in\n order to be accepted. This function may only be called by the Proposer.\n @param _outputRoot The L2 output of the checkpoint block.\n @param _l2BlockNumber The L2 block number that resulted in _outputRoot.\n @param _l1BlockHash A block hash which must be included in the current chain.\n @param _l1BlockNumber The block number with the specified block hash."},"functionSelector":"9aaab648","implemented":true,"kind":"function","modifiers":[],"name":"proposeL2Output","nameLocation":"8267:15:133","parameters":{"id":86178,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86171,"mutability":"mutable","name":"_outputRoot","nameLocation":"8300:11:133","nodeType":"VariableDeclaration","scope":86261,"src":"8292:19:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":86170,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8292:7:133","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":86173,"mutability":"mutable","name":"_l2BlockNumber","nameLocation":"8329:14:133","nodeType":"VariableDeclaration","scope":86261,"src":"8321:22:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86172,"name":"uint256","nodeType":"ElementaryTypeName","src":"8321:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":86175,"mutability":"mutable","name":"_l1BlockHash","nameLocation":"8361:12:133","nodeType":"VariableDeclaration","scope":86261,"src":"8353:20:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":86174,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8353:7:133","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":86177,"mutability":"mutable","name":"_l1BlockNumber","nameLocation":"8391:14:133","nodeType":"VariableDeclaration","scope":86261,"src":"8383:22:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86176,"name":"uint256","nodeType":"ElementaryTypeName","src":"8383:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8282:129:133"},"returnParameters":{"id":86179,"nodeType":"ParameterList","parameters":[],"src":"8449:0:133"},"scope":86435,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":86275,"nodeType":"FunctionDefinition","src":"10443:146:133","nodes":[],"body":{"id":86274,"nodeType":"Block","src":"10540:49:133","nodes":[],"statements":[{"expression":{"baseExpression":{"id":86270,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"10557:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86272,"indexExpression":{"id":86271,"name":"_l2OutputIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86264,"src":"10567:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10557:25:133","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_storage","typeString":"struct Types.OutputProposal storage ref"}},"functionReturnParameters":86269,"id":86273,"nodeType":"Return","src":"10550:32:133"}]},"documentation":{"id":86262,"nodeType":"StructuredDocumentation","src":"10245:193:133","text":"@notice Returns an output by index. Needed to return a struct instead of a tuple.\n @param _l2OutputIndex Index of the output to return.\n @return The output at the given index."},"functionSelector":"a25ae557","implemented":true,"kind":"function","modifiers":[],"name":"getL2Output","nameLocation":"10452:11:133","parameters":{"id":86265,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86264,"mutability":"mutable","name":"_l2OutputIndex","nameLocation":"10472:14:133","nodeType":"VariableDeclaration","scope":86275,"src":"10464:22:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86263,"name":"uint256","nodeType":"ElementaryTypeName","src":"10464:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"10463:24:133"},"returnParameters":{"id":86269,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86268,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86275,"src":"10511:27:133","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_memory_ptr","typeString":"struct Types.OutputProposal"},"typeName":{"id":86267,"nodeType":"UserDefinedTypeName","pathNode":{"id":86266,"name":"Types.OutputProposal","nodeType":"IdentifierPath","referencedDeclaration":104307,"src":"10511:20:133"},"referencedDeclaration":104307,"src":"10511:20:133","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_storage_ptr","typeString":"struct Types.OutputProposal"}},"visibility":"internal"}],"src":"10510:29:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":86344,"nodeType":"FunctionDefinition","src":"10969:896:133","nodes":[],"body":{"id":86343,"nodeType":"Block","src":"11054:811:133","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86287,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86284,"name":"_l2BlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86278,"src":"11166:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":86285,"name":"latestBlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86403,"src":"11184:17:133","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":86286,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11184:19:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11166:37:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a2063616e6e6f7420676574206f757470757420666f72206120626c6f636b207468617420686173206e6f74206265656e2070726f706f736564","id":86288,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"11217:74:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_e20eea09cda66a0de8aaee9225052cff8973e85b47dc903dda82ca1d2f5e4f1e","typeString":"literal_string \"L2OutputOracle: cannot get output for a block that has not been proposed\""},"value":"L2OutputOracle: cannot get output for a block that has not been proposed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e20eea09cda66a0de8aaee9225052cff8973e85b47dc903dda82ca1d2f5e4f1e","typeString":"literal_string \"L2OutputOracle: cannot get output for a block that has not been proposed\""}],"id":86283,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"11145:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86289,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11145:156:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86290,"nodeType":"ExpressionStatement","src":"11145:156:133"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86295,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86292,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"11379:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86293,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"11379:16:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":86294,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11398:1:133","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11379:20:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707574206173206e6f206f7574707574732068617665206265656e2070726f706f73656420796574","id":86296,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"11401:72:133","typeDescriptions":{"typeIdentifier":"t_stringliteral_80c3451a3ec9750ebb6fb31ae69a5869a904e947867f132ba63cfb294c03b73e","typeString":"literal_string \"L2OutputOracle: cannot get output as no outputs have been proposed yet\""},"value":"L2OutputOracle: cannot get output as no outputs have been proposed yet"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_80c3451a3ec9750ebb6fb31ae69a5869a904e947867f132ba63cfb294c03b73e","typeString":"literal_string \"L2OutputOracle: cannot get output as no outputs have been proposed yet\""}],"id":86291,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"11371:7:133","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86297,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11371:103:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86298,"nodeType":"ExpressionStatement","src":"11371:103:133"},{"assignments":[86300],"declarations":[{"constant":false,"id":86300,"mutability":"mutable","name":"lo","nameLocation":"11560:2:133","nodeType":"VariableDeclaration","scope":86343,"src":"11552:10:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86299,"name":"uint256","nodeType":"ElementaryTypeName","src":"11552:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":86302,"initialValue":{"hexValue":"30","id":86301,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11565:1:133","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"11552:14:133"},{"assignments":[86304],"declarations":[{"constant":false,"id":86304,"mutability":"mutable","name":"hi","nameLocation":"11584:2:133","nodeType":"VariableDeclaration","scope":86343,"src":"11576:10:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86303,"name":"uint256","nodeType":"ElementaryTypeName","src":"11576:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":86307,"initialValue":{"expression":{"id":86305,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"11589:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86306,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"11589:16:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"11576:29:133"},{"body":{"id":86339,"nodeType":"Block","src":"11631:208:133","statements":[{"assignments":[86312],"declarations":[{"constant":false,"id":86312,"mutability":"mutable","name":"mid","nameLocation":"11653:3:133","nodeType":"VariableDeclaration","scope":86339,"src":"11645:11:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86311,"name":"uint256","nodeType":"ElementaryTypeName","src":"11645:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":86319,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86318,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86315,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86313,"name":"lo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86300,"src":"11660:2:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":86314,"name":"hi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86304,"src":"11665:2:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11660:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":86316,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"11659:9:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"hexValue":"32","id":86317,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11671:1:133","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"11659:13:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"11645:27:133"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86325,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":86320,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"11690:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86322,"indexExpression":{"id":86321,"name":"mid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86312,"src":"11700:3:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"11690:14:133","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_storage","typeString":"struct Types.OutputProposal storage ref"}},"id":86323,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"l2BlockNumber","nodeType":"MemberAccess","referencedDeclaration":104306,"src":"11690:28:133","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":86324,"name":"_l2BlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86278,"src":"11721:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11690:45:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":86337,"nodeType":"Block","src":"11788:41:133","statements":[{"expression":{"id":86335,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86333,"name":"hi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86304,"src":"11806:2:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":86334,"name":"mid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86312,"src":"11811:3:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11806:8:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":86336,"nodeType":"ExpressionStatement","src":"11806:8:133"}]},"id":86338,"nodeType":"IfStatement","src":"11686:143:133","trueBody":{"id":86332,"nodeType":"Block","src":"11737:45:133","statements":[{"expression":{"id":86330,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86326,"name":"lo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86300,"src":"11755:2:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86329,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86327,"name":"mid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86312,"src":"11760:3:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":86328,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11766:1:133","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"11760:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11755:12:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":86331,"nodeType":"ExpressionStatement","src":"11755:12:133"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86310,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86308,"name":"lo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86300,"src":"11622:2:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":86309,"name":"hi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86304,"src":"11627:2:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11622:7:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":86340,"nodeType":"WhileStatement","src":"11615:224:133"},{"expression":{"id":86341,"name":"lo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86300,"src":"11856:2:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":86282,"id":86342,"nodeType":"Return","src":"11849:9:133"}]},"documentation":{"id":86276,"nodeType":"StructuredDocumentation","src":"10595:369:133","text":"@notice Returns the index of the L2 output that checkpoints a given L2 block number.\n Uses a binary search to find the first output greater than or equal to the given\n block.\n @param _l2BlockNumber L2 block number to find a checkpoint for.\n @return Index of the first checkpoint that commits to the given L2 block number."},"functionSelector":"7f006420","implemented":true,"kind":"function","modifiers":[],"name":"getL2OutputIndexAfter","nameLocation":"10978:21:133","parameters":{"id":86279,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86278,"mutability":"mutable","name":"_l2BlockNumber","nameLocation":"11008:14:133","nodeType":"VariableDeclaration","scope":86344,"src":"11000:22:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86277,"name":"uint256","nodeType":"ElementaryTypeName","src":"11000:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"10999:24:133"},"returnParameters":{"id":86282,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86281,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86344,"src":"11045:7:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86280,"name":"uint256","nodeType":"ElementaryTypeName","src":"11045:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11044:9:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":86360,"nodeType":"FunctionDefinition","src":"12228:174:133","nodes":[],"body":{"id":86359,"nodeType":"Block","src":"12330:72:133","nodes":[],"statements":[{"expression":{"baseExpression":{"id":86353,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"12347:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86357,"indexExpression":{"arguments":[{"id":86355,"name":"_l2BlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86347,"src":"12379:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":86354,"name":"getL2OutputIndexAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86344,"src":"12357:21:133","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) view returns (uint256)"}},"id":86356,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12357:37:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"12347:48:133","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_storage","typeString":"struct Types.OutputProposal storage ref"}},"functionReturnParameters":86352,"id":86358,"nodeType":"Return","src":"12340:55:133"}]},"documentation":{"id":86345,"nodeType":"StructuredDocumentation","src":"11871:352:133","text":"@notice Returns the L2 output proposal that checkpoints a given L2 block number.\n Uses a binary search to find the first output greater than or equal to the given\n block.\n @param _l2BlockNumber L2 block number to find a checkpoint for.\n @return First checkpoint that commits to the given L2 block number."},"functionSelector":"cf8e5cf0","implemented":true,"kind":"function","modifiers":[],"name":"getL2OutputAfter","nameLocation":"12237:16:133","parameters":{"id":86348,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86347,"mutability":"mutable","name":"_l2BlockNumber","nameLocation":"12262:14:133","nodeType":"VariableDeclaration","scope":86360,"src":"12254:22:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86346,"name":"uint256","nodeType":"ElementaryTypeName","src":"12254:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12253:24:133"},"returnParameters":{"id":86352,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86351,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86360,"src":"12301:27:133","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_memory_ptr","typeString":"struct Types.OutputProposal"},"typeName":{"id":86350,"nodeType":"UserDefinedTypeName","pathNode":{"id":86349,"name":"Types.OutputProposal","nodeType":"IdentifierPath","referencedDeclaration":104307,"src":"12301:20:133"},"referencedDeclaration":104307,"src":"12301:20:133","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_storage_ptr","typeString":"struct Types.OutputProposal"}},"visibility":"internal"}],"src":"12300:29:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":86372,"nodeType":"FunctionDefinition","src":"12608:105:133","nodes":[],"body":{"id":86371,"nodeType":"Block","src":"12669:44:133","nodes":[],"statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86369,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86366,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"12686:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"12686:16:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":86368,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12705:1:133","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"12686:20:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":86365,"id":86370,"nodeType":"Return","src":"12679:27:133"}]},"documentation":{"id":86361,"nodeType":"StructuredDocumentation","src":"12408:195:133","text":"@notice Returns the number of outputs that have been proposed.\n Will revert if no outputs have been proposed yet.\n @return The number of outputs that have been proposed."},"functionSelector":"69f16eec","implemented":true,"kind":"function","modifiers":[],"name":"latestOutputIndex","nameLocation":"12617:17:133","parameters":{"id":86362,"nodeType":"ParameterList","parameters":[],"src":"12634:2:133"},"returnParameters":{"id":86365,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86364,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86372,"src":"12660:7:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86363,"name":"uint256","nodeType":"ElementaryTypeName","src":"12660:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12659:9:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":86382,"nodeType":"FunctionDefinition","src":"12849:97:133","nodes":[],"body":{"id":86381,"nodeType":"Block","src":"12906:40:133","nodes":[],"statements":[{"expression":{"expression":{"id":86378,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"12923:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86379,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"12923:16:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":86377,"id":86380,"nodeType":"Return","src":"12916:23:133"}]},"documentation":{"id":86373,"nodeType":"StructuredDocumentation","src":"12719:125:133","text":"@notice Returns the index of the next output to be proposed.\n @return The index of the next output to be proposed."},"functionSelector":"6abcf563","implemented":true,"kind":"function","modifiers":[],"name":"nextOutputIndex","nameLocation":"12858:15:133","parameters":{"id":86374,"nodeType":"ParameterList","parameters":[],"src":"12873:2:133"},"returnParameters":{"id":86377,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86376,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86382,"src":"12897:7:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86375,"name":"uint256","nodeType":"ElementaryTypeName","src":"12897:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12896:9:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":86403,"nodeType":"FunctionDefinition","src":"13212:174:133","nodes":[],"body":{"id":86402,"nodeType":"Block","src":"13271:115:133","nodes":[],"statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86391,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86388,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"13288:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86389,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"13288:16:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":86390,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13308:1:133","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"13288:21:133","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"expression":{"baseExpression":{"id":86393,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"13334:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86398,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86397,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86394,"name":"l2Outputs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85947,"src":"13344:9:133","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_OutputProposal_$104307_storage_$dyn_storage","typeString":"struct Types.OutputProposal storage ref[] storage ref"}},"id":86395,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"13344:16:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":86396,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13363:1:133","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"13344:20:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"13334:31:133","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_storage","typeString":"struct Types.OutputProposal storage ref"}},"id":86399,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"l2BlockNumber","nodeType":"MemberAccess","referencedDeclaration":104306,"src":"13334:45:133","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"id":86400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"13288:91:133","trueExpression":{"id":86392,"name":"startingBlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85939,"src":"13312:19:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":86387,"id":86401,"nodeType":"Return","src":"13281:98:133"}]},"documentation":{"id":86383,"nodeType":"StructuredDocumentation","src":"12952:255:133","text":"@notice Returns the block number of the latest submitted L2 output proposal.\n If no proposals been submitted yet then this function will return the starting\n block number.\n @return Latest submitted L2 block number."},"functionSelector":"4599c788","implemented":true,"kind":"function","modifiers":[],"name":"latestBlockNumber","nameLocation":"13221:17:133","parameters":{"id":86384,"nodeType":"ParameterList","parameters":[],"src":"13238:2:133"},"returnParameters":{"id":86387,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86386,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86403,"src":"13262:7:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86385,"name":"uint256","nodeType":"ElementaryTypeName","src":"13262:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"13261:9:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":86415,"nodeType":"FunctionDefinition","src":"13524:121:133","nodes":[],"body":{"id":86414,"nodeType":"Block","src":"13581:64:133","nodes":[],"statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86412,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":86409,"name":"latestBlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86403,"src":"13598:17:133","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":86410,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13598:19:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":86411,"name":"submissionInterval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85950,"src":"13620:18:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13598:40:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":86408,"id":86413,"nodeType":"Return","src":"13591:47:133"}]},"documentation":{"id":86404,"nodeType":"StructuredDocumentation","src":"13392:127:133","text":"@notice Computes the block number of the next L2 block that needs to be checkpointed.\n @return Next L2 block number."},"functionSelector":"dcec3348","implemented":true,"kind":"function","modifiers":[],"name":"nextBlockNumber","nameLocation":"13533:15:133","parameters":{"id":86405,"nodeType":"ParameterList","parameters":[],"src":"13548:2:133"},"returnParameters":{"id":86408,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86407,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86415,"src":"13572:7:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86406,"name":"uint256","nodeType":"ElementaryTypeName","src":"13572:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"13571:9:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":86434,"nodeType":"FunctionDefinition","src":"13854:180:133","nodes":[],"body":{"id":86433,"nodeType":"Block","src":"13936:98:133","nodes":[],"statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86431,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86423,"name":"startingTimestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85942,"src":"13953:17:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86426,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86424,"name":"_l2BlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86418,"src":"13975:14:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":86425,"name":"startingBlockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85939,"src":"13992:19:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13975:36:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":86427,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"13974:38:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":86428,"name":"l2BlockTime","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":85953,"src":"14015:11:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13974:52:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":86430,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"13973:54:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13953:74:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":86422,"id":86432,"nodeType":"Return","src":"13946:81:133"}]},"documentation":{"id":86416,"nodeType":"StructuredDocumentation","src":"13651:198:133","text":"@notice Returns the L2 timestamp corresponding to a given L2 block number.\n @param _l2BlockNumber The L2 block number of the target block.\n @return L2 timestamp of the given block."},"functionSelector":"d1de856c","implemented":true,"kind":"function","modifiers":[],"name":"computeL2Timestamp","nameLocation":"13863:18:133","parameters":{"id":86419,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86418,"mutability":"mutable","name":"_l2BlockNumber","nameLocation":"13890:14:133","nodeType":"VariableDeclaration","scope":86434,"src":"13882:22:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86417,"name":"uint256","nodeType":"ElementaryTypeName","src":"13882:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"13881:24:133"},"returnParameters":{"id":86422,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86421,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86434,"src":"13927:7:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86420,"name":"uint256","nodeType":"ElementaryTypeName","src":"13927:7:133","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"13926:9:133"},"scope":86435,"stateMutability":"view","virtual":false,"visibility":"public"}],"abstract":false,"baseContracts":[{"baseName":{"id":85933,"name":"Initializable","nodeType":"IdentifierPath","referencedDeclaration":49678,"src":"638:13:133"},"id":85934,"nodeType":"InheritanceSpecifier","src":"638:13:133"},{"baseName":{"id":85935,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"653:7:133"},"id":85936,"nodeType":"InheritanceSpecifier","src":"653:7:133"}],"canonicalName":"L2OutputOracle","contractDependencies":[],"contractKind":"contract","documentation":{"id":85932,"nodeType":"StructuredDocumentation","src":"304:307:133","text":"@custom:proxied\n @title L2OutputOracle\n @notice The L2OutputOracle contains an array of L2 state outputs, where each output is a\n commitment to the state of the L2 chain. Other contracts like the OptimismPortal use\n these outputs to verify information about the state of L2."},"fullyImplemented":true,"linearizedBaseContracts":[86435,109417,49678],"name":"L2OutputOracle","nameLocation":"620:14:133","scope":86436,"usedErrors":[]}],"license":"MIT"},"id":133} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/L2StandardBridge.json b/packages/sdk/src/forge-artifacts/L2StandardBridge.json new file mode 100644 index 000000000000..3e707fe88b52 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/L2StandardBridge.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"MESSENGER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"OTHER_BRIDGE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract StandardBridge"}],"stateMutability":"view"},{"type":"function","name":"bridgeERC20","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bridgeERC20To","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bridgeETH","inputs":[{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"bridgeETHTo","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"deposits","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"finalizeBridgeERC20","inputs":[{"name":"_localToken","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finalizeBridgeETH","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"finalizeDeposit","inputs":[{"name":"_l1Token","type":"address","internalType":"address"},{"name":"_l2Token","type":"address","internalType":"address"},{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"initialize","inputs":[{"name":"_otherBridge","type":"address","internalType":"contract StandardBridge"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"l1TokenBridge","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"messenger","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract CrossDomainMessenger"}],"stateMutability":"view"},{"type":"function","name":"otherBridge","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract StandardBridge"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"withdraw","inputs":[{"name":"_l2Token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"withdrawTo","inputs":[{"name":"_l2Token","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_minGasLimit","type":"uint32","internalType":"uint32"},{"name":"_extraData","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"DepositFinalized","inputs":[{"name":"l1Token","type":"address","indexed":true,"internalType":"address"},{"name":"l2Token","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ERC20BridgeFinalized","inputs":[{"name":"localToken","type":"address","indexed":true,"internalType":"address"},{"name":"remoteToken","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ERC20BridgeInitiated","inputs":[{"name":"localToken","type":"address","indexed":true,"internalType":"address"},{"name":"remoteToken","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ETHBridgeFinalized","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ETHBridgeInitiated","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"WithdrawalInitiated","inputs":[{"name":"l1Token","type":"address","indexed":true,"internalType":"address"},{"name":"l2Token","type":"address","indexed":true,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"extraData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b506200001e600062000024565b62000217565b600054610100900460ff1615808015620000455750600054600160ff909116105b8062000075575062000062306200016d60201b620004811760201c565b15801562000075575060005460ff166001145b620000de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000102576000805461ff0019166101001790555b62000122734200000000000000000000000000000000000007836200017c565b801562000169576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054610100900460ff16620001e95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b612a8380620002276000396000f3fe60806040526004361061012d5760003560e01c8063662a633a116100a5578063927ede2d11610074578063c4d66de811610059578063c4d66de814610421578063c89701a214610441578063e11013dd1461046e57600080fd5b8063927ede2d146103e3578063a3a795481461040e57600080fd5b8063662a633a1461036a5780637f46ddb21461025a578063870876231461037d5780638f601f661461039d57600080fd5b806336c717c1116100fc578063540abf73116100e1578063540abf73146102d857806354fd4d50146102f85780635c975abb1461034e57600080fd5b806336c717c11461025a5780633cb747bf146102ab57600080fd5b80630166a07a1461020157806309fc8843146102215780631635f5fd1461023457806332b7006d1461024757600080fd5b366101fc57333b156101c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b6101fa73deaddeaddeaddeaddeaddeaddeaddeaddead000033333462030d406040518060200160405280600081525061049d565b005b600080fd5b34801561020d57600080fd5b506101fa61021c366004612476565b610578565b6101fa61022f366004612527565b61091a565b6101fa61024236600461257a565b6109f1565b6101fa6102553660046125ed565b610e43565b34801561026657600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102b757600080fd5b506003546102819073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102e457600080fd5b506101fa6102f3366004612641565b610f1d565b34801561030457600080fd5b506103416040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516102a2919061272e565b34801561035a57600080fd5b50604051600081526020016102a2565b6101fa610378366004612476565b610f62565b34801561038957600080fd5b506101fa610398366004612741565b610fd5565b3480156103a957600080fd5b506103d56103b83660046127c4565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102a2565b3480156103ef57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff16610281565b6101fa61041c366004612741565b6110a9565b34801561042d57600080fd5b506101fa61043c3660046127fd565b6110ed565b34801561044d57600080fd5b506004546102819073ffffffffffffffffffffffffffffffffffffffff1681565b6101fa61047c36600461281a565b611296565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b7fffffffffffffffffffffffff215221522152215221522152215221522153000073ffffffffffffffffffffffffffffffffffffffff8716016104ec576104e785858585856112df565b610570565b60008673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055d919061287d565b905061056e878288888888886114a9565b505b505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561064b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561060f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610633919061287d565b73ffffffffffffffffffffffffffffffffffffffff16145b6106fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b610706876117d4565b15610854576107158787611836565b6107c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b15801561083757600080fd5b505af115801561084b573d6000803e3d6000fd5b505050506108d6565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a16835292905220546108929084906128c9565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c16835293905291909120919091556108d6908585611956565b61056e878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a2a92505050565b333b156109a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b6109ec3333348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112df92505050565b505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610ac4575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac919061287d565b73ffffffffffffffffffffffffffffffffffffffff16145b610b76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b823414610c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e7420726571756972656400000000000060648201526084016101bd565b3073ffffffffffffffffffffffffffffffffffffffff851603610caa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c66000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e67657200000000000000000000000000000000000000000000000060648201526084016101bd565b610d9785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ab892505050565b6000610db4855a8660405180602001604052806000815250611b59565b905080610570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b333b15610ed2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b610f16853333878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049d92505050565b5050505050565b61056e87873388888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114a992505050565b73ffffffffffffffffffffffffffffffffffffffff8716158015610faf575073ffffffffffffffffffffffffffffffffffffffff861673deaddeaddeaddeaddeaddeaddeaddeaddead0000145b15610fc657610fc185858585856109f1565b61056e565b61056e86888787878787610578565b333b15611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b61057086863333888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114a992505050565b610570863387878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049d92505050565b600054610100900460ff161580801561110d5750600054600160ff909116105b806111275750303b158015611127575060005460ff166001145b6111b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016101bd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561121157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61122f73420000000000000000000000000000000000000783611b73565b801561129257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6112d93385348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112df92505050565b50505050565b82341461136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c7565000060648201526084016101bd565b61137a85858584611c5d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906113dd908b908b9086908a906024016128e0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261147092918890600401612929565b6000604051808303818588803b15801561148957600080fd5b505af115801561149d573d6000803e3d6000fd5b50505050505050505050565b6114b2876117d4565b15611600576114c18787611836565b611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b1580156115e357600080fd5b505af11580156115f7573d6000803e3d6000fd5b50505050611694565b61162273ffffffffffffffffffffffffffffffffffffffff8816863086611cfe565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a168352929052205461166090849061296e565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b6116a2878787878786611d5c565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611706908b908d908c908c908c908b90602401612986565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b909216825261179992918790600401612929565b600060405180830381600087803b1580156117b357600080fd5b505af11580156117c7573d6000803e3d6000fd5b5050505050505050505050565b6000611800827f1d1d8b6300000000000000000000000000000000000000000000000000000000611dea565b806118305750611830827fec4fc8e300000000000000000000000000000000000000000000000000000000611dea565b92915050565b6000611862837f1d1d8b6300000000000000000000000000000000000000000000000000000000611dea565b1561190b578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d6919061287d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611830565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109ec9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611e0d565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611aa2939291906129e1565b60405180910390a4610570868686868686611f19565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611b45939291906129e1565b60405180910390a46112d984848484611fa1565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016101bd565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611cea939291906129e1565b60405180910390a46112d98484848461200e565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526112d99085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016119a8565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611dd4939291906129e1565b60405180910390a461057086868686868661206d565b6000611df5836120e5565b8015611e065750611e068383612149565b9392505050565b6000611e6f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122189092919063ffffffff16565b8051909150156109ec5780806020019051810190611e8d9190612a1f565b6109ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101bd565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd868686604051611f91939291906129e1565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612000929190612a41565b60405180910390a350505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612000929190612a41565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf868686604051611f91939291906129e1565b6000612111827f01ffc9a700000000000000000000000000000000000000000000000000000000612149565b80156118305750612142827fffffffff00000000000000000000000000000000000000000000000000000000612149565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015612201575060208210155b801561220d5750600081115b979650505050505050565b6060612227848460008561222f565b949350505050565b6060824710156122c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101bd565b73ffffffffffffffffffffffffffffffffffffffff85163b61233f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101bd565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516123689190612a5a565b60006040518083038185875af1925050503d80600081146123a5576040519150601f19603f3d011682016040523d82523d6000602084013e6123aa565b606091505b509150915061220d828286606083156123c4575081611e06565b8251156123d45782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101bd919061272e565b73ffffffffffffffffffffffffffffffffffffffff8116811461242a57600080fd5b50565b60008083601f84011261243f57600080fd5b50813567ffffffffffffffff81111561245757600080fd5b60208301915083602082850101111561246f57600080fd5b9250929050565b600080600080600080600060c0888a03121561249157600080fd5b873561249c81612408565b965060208801356124ac81612408565b955060408801356124bc81612408565b945060608801356124cc81612408565b93506080880135925060a088013567ffffffffffffffff8111156124ef57600080fd5b6124fb8a828b0161242d565b989b979a50959850939692959293505050565b803563ffffffff8116811461252257600080fd5b919050565b60008060006040848603121561253c57600080fd5b6125458461250e565b9250602084013567ffffffffffffffff81111561256157600080fd5b61256d8682870161242d565b9497909650939450505050565b60008060008060006080868803121561259257600080fd5b853561259d81612408565b945060208601356125ad81612408565b935060408601359250606086013567ffffffffffffffff8111156125d057600080fd5b6125dc8882890161242d565b969995985093965092949392505050565b60008060008060006080868803121561260557600080fd5b853561261081612408565b9450602086013593506126256040870161250e565b9250606086013567ffffffffffffffff8111156125d057600080fd5b600080600080600080600060c0888a03121561265c57600080fd5b873561266781612408565b9650602088013561267781612408565b9550604088013561268781612408565b94506060880135935061269c6080890161250e565b925060a088013567ffffffffffffffff8111156124ef57600080fd5b60005b838110156126d35781810151838201526020016126bb565b838111156112d95750506000910152565b600081518084526126fc8160208601602086016126b8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611e0660208301846126e4565b60008060008060008060a0878903121561275a57600080fd5b863561276581612408565b9550602087013561277581612408565b94506040870135935061278a6060880161250e565b9250608087013567ffffffffffffffff8111156127a657600080fd5b6127b289828a0161242d565b979a9699509497509295939492505050565b600080604083850312156127d757600080fd5b82356127e281612408565b915060208301356127f281612408565b809150509250929050565b60006020828403121561280f57600080fd5b8135611e0681612408565b6000806000806060858703121561283057600080fd5b843561283b81612408565b93506128496020860161250e565b9250604085013567ffffffffffffffff81111561286557600080fd5b6128718782880161242d565b95989497509550505050565b60006020828403121561288f57600080fd5b8151611e0681612408565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156128db576128db61289a565b500390565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261291f60808301846126e4565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600061295860608301856126e4565b905063ffffffff83166040830152949350505050565b600082198211156129815761298161289a565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a08301526129d560c08301846126e4565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612a1660608301846126e4565b95945050505050565b600060208284031215612a3157600080fd5b81518015158114611e0657600080fd5b82815260406020820152600061222760408301846126e4565b60008251612a6c8184602087016126b8565b919091019291505056fea164736f6c634300080f000a","sourceMap":"1141:9307:149:-:0;;;2615:113;;;;;;;;;-1:-1:-1;2656:65:149::1;2714:1;2656:10;:65::i;:::-;1141:9307:::0;;2849:242;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;;3209:33;3236:4;3209:18;;;;;:33;;:::i;:::-;3208:34;:55;;;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;-1:-1:-1;;;3146:190:43;;216:2:357;3146:190:43;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:357;;;338:44;399:19;;3146:190:43;;;;;;;;;3346:12;:16;;-1:-1:-1;;3346:16:43;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;-1:-1:-1;;3406:20:43;;;;;3372:65;2927:157:149::1;480:42:199;3061:12:149::0;2927:21:::1;:157::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;-1:-1:-1;;3491:21:43;;;3531:14;;-1:-1:-1;581:36:357;;3531:14:43;;569:2:357;554:18;3531:14:43;;;;;;;3457:99;3090:472;2849:242:149;:::o;1175:320:59:-;-1:-1:-1;;;;;1465:19:59;;:23;;;1175:320::o;5373:236:235:-;4888:13:43;;;;;;;4880:69;;;;-1:-1:-1;;;4880:69:43;;830:2:357;4880:69:43;;;812:21:357;869:2;849:18;;;842:30;908:34;888:18;;;881:62;-1:-1:-1;;;959:18:357;;;952:41;1010:19;;4880:69:43;628:407:357;4880:69:43;5544:9:235::1;:22:::0;;-1:-1:-1;;;;;5544:22:235;;::::1;-1:-1:-1::0;;;;;;5544:22:235;;::::1;;::::0;;;5576:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;5373:236::o;628:407:357:-;1141:9307:149;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061012d5760003560e01c8063662a633a116100a5578063927ede2d11610074578063c4d66de811610059578063c4d66de814610421578063c89701a214610441578063e11013dd1461046e57600080fd5b8063927ede2d146103e3578063a3a795481461040e57600080fd5b8063662a633a1461036a5780637f46ddb21461025a578063870876231461037d5780638f601f661461039d57600080fd5b806336c717c1116100fc578063540abf73116100e1578063540abf73146102d857806354fd4d50146102f85780635c975abb1461034e57600080fd5b806336c717c11461025a5780633cb747bf146102ab57600080fd5b80630166a07a1461020157806309fc8843146102215780631635f5fd1461023457806332b7006d1461024757600080fd5b366101fc57333b156101c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b6101fa73deaddeaddeaddeaddeaddeaddeaddeaddead000033333462030d406040518060200160405280600081525061049d565b005b600080fd5b34801561020d57600080fd5b506101fa61021c366004612476565b610578565b6101fa61022f366004612527565b61091a565b6101fa61024236600461257a565b6109f1565b6101fa6102553660046125ed565b610e43565b34801561026657600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102b757600080fd5b506003546102819073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102e457600080fd5b506101fa6102f3366004612641565b610f1d565b34801561030457600080fd5b506103416040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516102a2919061272e565b34801561035a57600080fd5b50604051600081526020016102a2565b6101fa610378366004612476565b610f62565b34801561038957600080fd5b506101fa610398366004612741565b610fd5565b3480156103a957600080fd5b506103d56103b83660046127c4565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102a2565b3480156103ef57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff16610281565b6101fa61041c366004612741565b6110a9565b34801561042d57600080fd5b506101fa61043c3660046127fd565b6110ed565b34801561044d57600080fd5b506004546102819073ffffffffffffffffffffffffffffffffffffffff1681565b6101fa61047c36600461281a565b611296565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b7fffffffffffffffffffffffff215221522152215221522152215221522153000073ffffffffffffffffffffffffffffffffffffffff8716016104ec576104e785858585856112df565b610570565b60008673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055d919061287d565b905061056e878288888888886114a9565b505b505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561064b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561060f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610633919061287d565b73ffffffffffffffffffffffffffffffffffffffff16145b6106fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b610706876117d4565b15610854576107158787611836565b6107c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b15801561083757600080fd5b505af115801561084b573d6000803e3d6000fd5b505050506108d6565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a16835292905220546108929084906128c9565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c16835293905291909120919091556108d6908585611956565b61056e878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a2a92505050565b333b156109a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b6109ec3333348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112df92505050565b505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610ac4575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac919061287d565b73ffffffffffffffffffffffffffffffffffffffff16145b610b76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b823414610c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e7420726571756972656400000000000060648201526084016101bd565b3073ffffffffffffffffffffffffffffffffffffffff851603610caa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c66000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e67657200000000000000000000000000000000000000000000000060648201526084016101bd565b610d9785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ab892505050565b6000610db4855a8660405180602001604052806000815250611b59565b905080610570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b333b15610ed2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b610f16853333878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049d92505050565b5050505050565b61056e87873388888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114a992505050565b73ffffffffffffffffffffffffffffffffffffffff8716158015610faf575073ffffffffffffffffffffffffffffffffffffffff861673deaddeaddeaddeaddeaddeaddeaddeaddead0000145b15610fc657610fc185858585856109f1565b61056e565b61056e86888787878787610578565b333b15611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b61057086863333888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114a992505050565b610570863387878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049d92505050565b600054610100900460ff161580801561110d5750600054600160ff909116105b806111275750303b158015611127575060005460ff166001145b6111b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016101bd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561121157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61122f73420000000000000000000000000000000000000783611b73565b801561129257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6112d93385348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112df92505050565b50505050565b82341461136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c7565000060648201526084016101bd565b61137a85858584611c5d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906113dd908b908b9086908a906024016128e0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261147092918890600401612929565b6000604051808303818588803b15801561148957600080fd5b505af115801561149d573d6000803e3d6000fd5b50505050505050505050565b6114b2876117d4565b15611600576114c18787611836565b611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b1580156115e357600080fd5b505af11580156115f7573d6000803e3d6000fd5b50505050611694565b61162273ffffffffffffffffffffffffffffffffffffffff8816863086611cfe565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a168352929052205461166090849061296e565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b6116a2878787878786611d5c565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611706908b908d908c908c908c908b90602401612986565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b909216825261179992918790600401612929565b600060405180830381600087803b1580156117b357600080fd5b505af11580156117c7573d6000803e3d6000fd5b5050505050505050505050565b6000611800827f1d1d8b6300000000000000000000000000000000000000000000000000000000611dea565b806118305750611830827fec4fc8e300000000000000000000000000000000000000000000000000000000611dea565b92915050565b6000611862837f1d1d8b6300000000000000000000000000000000000000000000000000000000611dea565b1561190b578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d6919061287d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611830565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109ec9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611e0d565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611aa2939291906129e1565b60405180910390a4610570868686868686611f19565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611b45939291906129e1565b60405180910390a46112d984848484611fa1565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016101bd565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611cea939291906129e1565b60405180910390a46112d98484848461200e565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526112d99085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016119a8565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611dd4939291906129e1565b60405180910390a461057086868686868661206d565b6000611df5836120e5565b8015611e065750611e068383612149565b9392505050565b6000611e6f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122189092919063ffffffff16565b8051909150156109ec5780806020019051810190611e8d9190612a1f565b6109ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101bd565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd868686604051611f91939291906129e1565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612000929190612a41565b60405180910390a350505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612000929190612a41565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf868686604051611f91939291906129e1565b6000612111827f01ffc9a700000000000000000000000000000000000000000000000000000000612149565b80156118305750612142827fffffffff00000000000000000000000000000000000000000000000000000000612149565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015612201575060208210155b801561220d5750600081115b979650505050505050565b6060612227848460008561222f565b949350505050565b6060824710156122c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101bd565b73ffffffffffffffffffffffffffffffffffffffff85163b61233f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101bd565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516123689190612a5a565b60006040518083038185875af1925050503d80600081146123a5576040519150601f19603f3d011682016040523d82523d6000602084013e6123aa565b606091505b509150915061220d828286606083156123c4575081611e06565b8251156123d45782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101bd919061272e565b73ffffffffffffffffffffffffffffffffffffffff8116811461242a57600080fd5b50565b60008083601f84011261243f57600080fd5b50813567ffffffffffffffff81111561245757600080fd5b60208301915083602082850101111561246f57600080fd5b9250929050565b600080600080600080600060c0888a03121561249157600080fd5b873561249c81612408565b965060208801356124ac81612408565b955060408801356124bc81612408565b945060608801356124cc81612408565b93506080880135925060a088013567ffffffffffffffff8111156124ef57600080fd5b6124fb8a828b0161242d565b989b979a50959850939692959293505050565b803563ffffffff8116811461252257600080fd5b919050565b60008060006040848603121561253c57600080fd5b6125458461250e565b9250602084013567ffffffffffffffff81111561256157600080fd5b61256d8682870161242d565b9497909650939450505050565b60008060008060006080868803121561259257600080fd5b853561259d81612408565b945060208601356125ad81612408565b935060408601359250606086013567ffffffffffffffff8111156125d057600080fd5b6125dc8882890161242d565b969995985093965092949392505050565b60008060008060006080868803121561260557600080fd5b853561261081612408565b9450602086013593506126256040870161250e565b9250606086013567ffffffffffffffff8111156125d057600080fd5b600080600080600080600060c0888a03121561265c57600080fd5b873561266781612408565b9650602088013561267781612408565b9550604088013561268781612408565b94506060880135935061269c6080890161250e565b925060a088013567ffffffffffffffff8111156124ef57600080fd5b60005b838110156126d35781810151838201526020016126bb565b838111156112d95750506000910152565b600081518084526126fc8160208601602086016126b8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611e0660208301846126e4565b60008060008060008060a0878903121561275a57600080fd5b863561276581612408565b9550602087013561277581612408565b94506040870135935061278a6060880161250e565b9250608087013567ffffffffffffffff8111156127a657600080fd5b6127b289828a0161242d565b979a9699509497509295939492505050565b600080604083850312156127d757600080fd5b82356127e281612408565b915060208301356127f281612408565b809150509250929050565b60006020828403121561280f57600080fd5b8135611e0681612408565b6000806000806060858703121561283057600080fd5b843561283b81612408565b93506128496020860161250e565b9250604085013567ffffffffffffffff81111561286557600080fd5b6128718782880161242d565b95989497509550505050565b60006020828403121561288f57600080fd5b8151611e0681612408565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156128db576128db61289a565b500390565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261291f60808301846126e4565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600061295860608301856126e4565b905063ffffffff83166040830152949350505050565b600082198211156129815761298161289a565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a08301526129d560c08301846126e4565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612a1660608301846126e4565b95945050505050565b600060208284031215612a3157600080fd5b81518015158114611e0657600080fd5b82815260406020820152600061222760408301846126e4565b60008251612a6c8184602087016126b8565b919091019291505056fea164736f6c634300080f000a","sourceMap":"1141:9307:149:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4741:10:235;1465:19:59;:23;4713:99:235;;;;;;;216:2:357;4713:99:235;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;365:25;345:18;;;338:53;408:19;;4713:99:235;;;;;;;;;3228:143:149::1;2708:42:199;3290:10:149;3302;3314:9;1343:7:235;3352:9:149;;;;;;;;;;;::::0;3228:19:::1;:143::i;:::-;1141:9307:::0;;;;;12867:1084:235;;;;;;;;;;-1:-1:-1;12867:1084:235;;;;;:::i;:::-;;:::i;7253:186::-;;;;;;:::i;:::-;;:::i;11233:902::-;;;;;;:::i;:::-;;:::i;3897:313:149:-;;;;;;:::i;:::-;;:::i;6764:101::-;;;;;;;;;;-1:-1:-1;6846:11:149;;;;6764:101;;;4271:42:357;4259:55;;;4241:74;;4229:2;4214:18;6764:101:149;;;;;;;;1893:37:235;;;;;;;;;;-1:-1:-1;1893:37:235;;;;;;;;10320:349;;;;;;;;;;-1:-1:-1;10320:349:235;;;;;:::i;:::-;;:::i;2510:40:149:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;6750:82:235:-;;;;;;;;;;-1:-1:-1;6750:82:235;;6797:4;6512:41:357;;6500:2;6485:18;6750:82:235;6372:187:357;6087:505:149;;;;;;:::i;:::-;;:::i;9277:349:235:-;;;;;;;;;;-1:-1:-1;9277:349:235;;;;;:::i;:::-;;:::i;1739:63::-;;;;;;;;;;-1:-1:-1;1739:63:235;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;8199:25:357;;;8187:2;8172:18;1739:63:235;8053:177:357;6024:99:235;;;;;;;;;;-1:-1:-1;6107:9:235;;;;6024:99;;5197:313:149;;;;;;:::i;:::-;;:::i;2849:242::-;;;;;;;;;;-1:-1:-1;2849:242:149;;;;;:::i;:::-;;:::i;2028:33:235:-;;;;;;;;;;-1:-1:-1;2028:33:235;;;;;;;;8450:186;;;;;;:::i;:::-;;:::i;1175:320:59:-;1465:19;;;:23;;;1175:320::o;7372:554:149:-;7599:39;;;;;7595:325;;7654:65;7673:5;7680:3;7685:7;7694:12;7708:10;7654:18;:65::i;:::-;7595:325;;;7750:15;7790:8;7768:39;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7750:59;;7823:86;7844:8;7854:7;7863:5;7870:3;7875:7;7884:12;7898:10;7823:20;:86::i;:::-;7736:184;7595:325;7372:554;;;;;;:::o;12867:1084:235:-;5004:9;;;;4982:10;:32;:92;;;;-1:-1:-1;5062:11:235;;;5018:9;;:32;;;;;;;;5062:11;;;;;5018:9;;;;;:30;;:32;;;;;;;;;;;;:9;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;4982:92;4961:204;;;;;;;9591:2:357;4961:204:235;;;9573:21:357;9630:2;9610:18;;;9603:30;9669:34;9649:18;;;9642:62;9740:34;9720:18;;;9713:62;9812:3;9791:19;;;9784:32;9833:19;;4961:204:235;9389:469:357;4961:204:235;13184:37:::1;13209:11;13184:24;:37::i;:::-;13180:489;;;13262:46;13282:11;13295:12;13262:19;:46::i;:::-;13237:179;;;::::0;::::1;::::0;;10416:2:357;13237:179:235::1;::::0;::::1;10398:21:357::0;10455:2;10435:18;;;10428:30;10494:34;10474:18;;;10467:62;10565:34;10545:18;;;10538:62;10637:12;10616:19;;;10609:41;10667:19;;13237:179:235::1;10214:478:357::0;13237:179:235::1;13431:53;::::0;;;;:39:::1;10889:55:357::0;;;13431:53:235::1;::::0;::::1;10871:74:357::0;10961:18;;;10954:34;;;13431:39:235;::::1;::::0;::::1;::::0;10844:18:357;;13431:53:235::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;13180:489;;;13553:21;::::0;;::::1;;::::0;;;:8:::1;:21;::::0;;;;;;;:35;;::::1;::::0;;;;;;;:45:::1;::::0;13591:7;;13553:45:::1;:::i;:::-;13515:21;::::0;;::::1;;::::0;;;:8:::1;:21;::::0;;;;;;;:35;;::::1;::::0;;;;;;;;;:83;;;;13612:46:::1;::::0;13645:3;13650:7;13612:32:::1;:46::i;:::-;13859:85;13885:11;13898:12;13912:5;13919:3;13924:7;13933:10;;13859:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;13859:25:235::1;::::0;-1:-1:-1;;;13859:85:235:i:1;7253:186::-:0;4741:10;1465:19:59;:23;4713:99:235;;;;;;;216:2:357;4713:99:235;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;365:25;345:18;;;338:53;408:19;;4713:99:235;14:419:357;4713:99:235;7353:79:::1;7372:10;7384;7396:9;7407:12;7421:10;;7353:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;7353:18:235::1;::::0;-1:-1:-1;;;7353:79:235:i:1;:::-;7253:186:::0;;;:::o;11233:902::-;5004:9;;;;4982:10;:32;:92;;;;-1:-1:-1;5062:11:235;;;5018:9;;:32;;;;;;;;5062:11;;;;;5018:9;;;;;:30;;:32;;;;;;;;;;;;:9;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;4982:92;4961:204;;;;;;;9591:2:357;4961:204:235;;;9573:21:357;9630:2;9610:18;;;9603:30;9669:34;9649:18;;;9642:62;9740:34;9720:18;;;9713:62;9812:3;9791:19;;;9784:32;9833:19;;4961:204:235;9389:469:357;4961:204:235;11522:7:::1;11509:9;:20;11501:91;;;::::0;::::1;::::0;;11520:2:357;11501:91:235::1;::::0;::::1;11502:21:357::0;11559:2;11539:18;;;11532:30;11598:34;11578:18;;;11571:62;11669:28;11649:18;;;11642:56;11715:19;;11501:91:235::1;11318:422:357::0;11501:91:235::1;11625:4;11610:20;::::0;::::1;::::0;11602:68:::1;;;::::0;::::1;::::0;;11947:2:357;11602:68:235::1;::::0;::::1;11929:21:357::0;11986:2;11966:18;;;11959:30;12025:34;12005:18;;;11998:62;12096:5;12076:18;;;12069:33;12119:19;;11602:68:235::1;11745:399:357::0;11602:68:235::1;11703:9;::::0;::::1;::::0;;::::1;11688:25:::0;;::::1;::::0;11680:78:::1;;;::::0;::::1;::::0;;12351:2:357;11680:78:235::1;::::0;::::1;12333:21:357::0;12390:2;12370:18;;;12363:30;12429:34;12409:18;;;12402:62;12500:10;12480:18;;;12473:38;12528:19;;11680:78:235::1;12149:404:357::0;11680:78:235::1;11936:56;11960:5;11967:3;11972:7;11981:10;;11936:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;11936:23:235::1;::::0;-1:-1:-1;;;11936:56:235:i:1;:::-;12003:12;12018:45;12032:3;12037:9;12048:7;12018:45;;;;;;;;;;;::::0;:13:::1;:45::i;:::-;12003:60;;12081:7;12073:55;;;::::0;::::1;::::0;;12760:2:357;12073:55:235::1;::::0;::::1;12742:21:357::0;12799:2;12779:18;;;12772:30;12838:34;12818:18;;;12811:62;12909:5;12889:18;;;12882:33;12932:19;;12073:55:235::1;12558:399:357::0;3897:313:149;4741:10:235;1465:19:59;:23;4713:99:235;;;;;;;216:2:357;4713:99:235;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;365:25;345:18;;;338:53;408:19;;4713:99:235;14:419:357;4713:99:235;4115:88:149::1;4135:8;4145:10;4157;4169:7;4178:12;4192:10;;4115:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;4115:19:149::1;::::0;-1:-1:-1;;;4115:88:149:i:1;:::-;3897:313:::0;;;;;:::o;10320:349:235:-;10563:99;10584:11;10597:12;10611:10;10623:3;10628:7;10637:12;10651:10;;10563:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10563:20:235;;-1:-1:-1;;;10563:99:235:i;6087:505:149:-;6341:22;;;;:65;;;;-1:-1:-1;6367:39:149;;;2708:42:199;6367:39:149;6341:65;6337:249;;;6422:50;6440:5;6447:3;6452:7;6461:10;;6422:17;:50::i;:::-;6337:249;;;6503:72;6523:8;6533;6543:5;6550:3;6555:7;6564:10;;6503:19;:72::i;9277:349:235:-;4741:10;1465:19:59;:23;4713:99:235;;;;;;;216:2:357;4713:99:235;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;365:25;345:18;;;338:53;408:19;;4713:99:235;14:419:357;4713:99:235;9513:106:::1;9534:11;9547:12;9561:10;9573;9585:7;9594:12;9608:10;;9513:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;9513:20:235::1;::::0;-1:-1:-1;;;9513:106:235:i:1;5197:313:149:-:0;5422:81;5442:8;5452:10;5464:3;5469:7;5478:12;5492:10;;5422:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5422:19:149;;-1:-1:-1;;;5422:81:149:i;2849:242::-;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;-1:-1:-1;3236:4:43;1465:19:59;:23;;;3208:55:43;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;;;;13164:2:357;3146:190:43;;;13146:21:357;13203:2;13183:18;;;13176:30;13242:34;13222:18;;;13215:62;13313:16;13293:18;;;13286:44;13347:19;;3146:190:43;12962:410:357;3146:190:43;3346:12;:16;;;;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;;;;;;;3372:65;2927:157:149::1;480:42:199;3061:12:149;2927:21;:157::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;;;;;3531:14;;-1:-1:-1;13529:36:357;;3531:14:43;;13517:2:357;13502:18;3531:14:43;;;;;;;3457:99;3090:472;2849:242:149;:::o;8450:186:235:-;8557:72;8576:10;8588:3;8593:9;8604:12;8618:10;;8557:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8557:18:235;;-1:-1:-1;;;8557:72:235:i;:::-;8450:186;;;;:::o;14539:789::-;14756:7;14743:9;:20;14735:95;;;;;;;13778:2:357;14735:95:235;;;13760:21:357;13817:2;13797:18;;;13790:30;13856:34;13836:18;;;13829:62;13927:32;13907:18;;;13900:60;13977:19;;14735:95:235;13576:426:357;14735:95:235;15008:56;15032:5;15039:3;15044:7;15053:10;15008:23;:56::i;:::-;15075:9;;15146:11;;15182:88;;15075:9;;;;;:21;;15105:7;;15146:11;;;15205:31;;15182:88;;15238:5;;15245:3;;15105:7;;15259:10;;15182:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;15075:246;;;;;;;;;;;;;15298:12;;15075:246;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14539:789;;;;;:::o;16022:1680::-;16283:37;16308:11;16283:24;:37::i;:::-;16279:512;;;16361:46;16381:11;16394:12;16361:19;:46::i;:::-;16336:179;;;;;;;10416:2:357;16336:179:235;;;10398:21:357;10455:2;10435:18;;;10428:30;10494:34;10474:18;;;10467:62;10565:34;10545:18;;;10538:62;10637:12;10616:19;;;10609:41;10667:19;;16336:179:235;10214:478:357;16336:179:235;16530:55;;;;;:39;10889:55:357;;;16530::235;;;10871:74:357;10961:18;;;10954:34;;;16530:39:235;;;;;10844:18:357;;16530:55:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16279:512;;;16616:67;:36;;;16653:5;16668:4;16675:7;16616:36;:67::i;:::-;16735:21;;;;;;;;:8;:21;;;;;;;;:35;;;;;;;;;;:45;;16773:7;;16735:45;:::i;:::-;16697:21;;;;;;;;:8;:21;;;;;;;;:35;;;;;;;;;:83;16279:512;16981:85;17007:11;17020:12;17034:5;17041:3;17046:7;17055:10;16981:25;:85::i;:::-;17077:9;;17130:11;;17166:478;;17077:9;;;;;:21;;17130:11;;17206:33;;17166:478;;17492:12;;17522:11;;17551:5;;17574:3;;17595:7;;17620:10;;17166:478;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;17077:618;;;;;;;;;;;;;17672:12;;17077:618;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16022:1680;;;;;;;:::o;17966:279::-;18039:4;18062:79;18094:6;18102:38;18062:31;:79::i;:::-;:176;;;;18157:81;18189:6;18197:40;18157:31;:81::i;:::-;18055:183;17966:279;-1:-1:-1;;17966:279:235:o;18692:410::-;18789:4;18809:87;18841:14;18857:38;18809:31;:87::i;:::-;18805:291;;;18955:14;18934:44;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18919:61;;:11;:61;;;18912:68;;;;18805:291;19056:14;19033:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;763:205:52;902:58;;10901:42:357;10889:55;;902:58:52;;;10871:74:357;10961:18;;;10954:34;;;875:86:52;;895:5;;925:23;;10844:18:357;;902:58:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:19;:86::i;10007:439:149:-;10306:5;10262:76;;10293:11;10262:76;;10279:12;10262:76;;;10313:3;10318:7;10327:10;10262:76;;;;;;;;:::i;:::-;;;;;;;;10348:91;10380:11;10393:12;10407:5;10414:3;10419:7;10428:10;10348:31;:91::i;8745:363::-;8997:5;8939:90;;2708:42:199;8939:90:149;;8964:1;8939:90;;;9004:3;9009:7;9018:10;8939:90;;;;;;;;:::i;:::-;;;;;;;;9039:62;9069:5;9076:3;9081:7;9090:10;9039:29;:62::i;1202:536:200:-;1305:4;1321:13;1668:1;1635;1594:9;1588:16;1554:2;1543:9;1539:18;1496:6;1454:7;1421:4;1395:302;1367:330;1202:536;-1:-1:-1;;;;;;1202:536:200:o;5373:236:235:-;4888:13:43;;;;;;;4880:69;;;;;;;16381:2:357;4880:69:43;;;16363:21:357;16420:2;16400:18;;;16393:30;16459:34;16439:18;;;16432:62;16530:13;16510:18;;;16503:41;16561:19;;4880:69:43;16179:407:357;4880:69:43;5544:9:235::1;:22:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;5576:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;5373:236::o;8154:366:149:-;8409:5;8348:93;;2708:42:199;8348:93:149;;8376:1;8348:93;;;8416:3;8421:7;8430:10;8348:93;;;;;;;;:::i;:::-;;;;;;;;8451:62;8481:5;8488:3;8493:7;8502:10;8451:29;:62::i;974:241:52:-;1139:68;;16803:42:357;16872:15;;;1139:68:52;;;16854:34:357;16924:15;;16904:18;;;16897:43;16956:18;;;16949:34;;;1112:96:52;;1132:5;;1162:27;;16766:18:357;;1139:68:52;16591:398:357;9338:442:149;9640:5;9593:79;;9627:11;9593:79;;9613:12;9593:79;;;9647:3;9652:7;9661:10;9593:79;;;;;;;;:::i;:::-;;;;;;;;9682:91;9714:11;9727:12;9741:5;9748:3;9753:7;9762:10;9682:31;:91::i;1333:274:67:-;1420:4;1527:23;1542:7;1527:14;:23::i;:::-;:73;;;;;1554:46;1579:7;1588:11;1554:24;:46::i;:::-;1520:80;1333:274;-1:-1:-1;;;1333:274:67:o;3747:706:52:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:52;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;;;;17478:2:357;4351:85:52;;;17460:21:357;17517:2;17497:18;;;17490:30;17556:34;17536:18;;;17529:62;17627:12;17607:18;;;17600:40;17657:19;;4351:85:52;17276:406:357;21757:341:235;22059:5;22011:80;;22045:12;22011:80;;22032:11;22011:80;;;22066:3;22071:7;22080:10;22011:80;;;;;;;;:::i;:::-;;;;;;;;21757:341;;;;;;:::o;20099:251::-;20318:3;20292:51;;20311:5;20292:51;;;20323:7;20332:10;20292:51;;;;;;;:::i;:::-;;;;;;;;20099:251;;;;:::o;19478:::-;19697:3;19671:51;;19690:5;19671:51;;;19702:7;19711:10;19671:51;;;;;;;:::i;20883:341::-;21185:5;21137:80;;21171:12;21137:80;;21158:11;21137:80;;;21192:3;21197:7;21206:10;21137:80;;;;;;;;:::i;704:411:67:-;768:4;975:60;1000:7;1009:25;975:24;:60::i;:::-;:133;;;;-1:-1:-1;1052:56:67;1077:7;1086:21;1052:24;:56::i;:::-;1051:57;956:152;704:411;-1:-1:-1;;704:411:67:o;4223:638::-;4385:71;;;18155:66:357;18143:79;;4385:71:67;;;;18125:98:357;;;;4385:71:67;;;;;;;;;;18098:18:357;;;;4385:71:67;;;;;;;;;;;4408:34;4385:71;;;4664:20;;4316:4;;4385:71;4316:4;;;;;;4385:71;4316:4;;4664:20;4629:7;4622:5;4611:86;4600:97;;4724:16;4710:30;;4774:4;4768:11;4753:26;;4806:7;:29;;;;;4831:4;4817:10;:18;;4806:29;:48;;;;;4853:1;4839:11;:15;4806:48;4799:55;4223:638;-1:-1:-1;;;;;;;4223:638:67:o;3861:223:59:-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;3861:223;-1:-1:-1;;;;3861:223:59:o;4948:499::-;5113:12;5170:5;5145:21;:30;;5137:81;;;;;;;18436:2:357;5137:81:59;;;18418:21:357;18475:2;18455:18;;;18448:30;18514:34;18494:18;;;18487:62;18585:8;18565:18;;;18558:36;18611:19;;5137:81:59;18234:402:357;5137:81:59;1465:19;;;;5228:60;;;;;;;18843:2:357;5228:60:59;;;18825:21:357;18882:2;18862:18;;;18855:30;18921:31;18901:18;;;18894:59;18970:18;;5228:60:59;18641:353:357;5228:60:59;5300:12;5314:23;5341:6;:11;;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;7707;7735:7;7731:566;;;-1:-1:-1;7765:10:59;7758:17;;7731:566;7876:17;;:21;7872:415;;8120:10;8114:17;8180:15;8167:10;8163:2;8159:19;8152:44;7872:415;8259:12;8252:20;;;;;;;;;;;:::i;438:154:357:-;524:42;517:5;513:54;506:5;503:65;493:93;;582:1;579;572:12;493:93;438:154;:::o;597:347::-;648:8;658:6;712:3;705:4;697:6;693:17;689:27;679:55;;730:1;727;720:12;679:55;-1:-1:-1;753:20:357;;796:18;785:30;;782:50;;;828:1;825;818:12;782:50;865:4;857:6;853:17;841:29;;917:3;910:4;901:6;893;889:19;885:30;882:39;879:59;;;934:1;931;924:12;879:59;597:347;;;;;:::o;949:1038::-;1064:6;1072;1080;1088;1096;1104;1112;1165:3;1153:9;1144:7;1140:23;1136:33;1133:53;;;1182:1;1179;1172:12;1133:53;1221:9;1208:23;1240:31;1265:5;1240:31;:::i;:::-;1290:5;-1:-1:-1;1347:2:357;1332:18;;1319:32;1360:33;1319:32;1360:33;:::i;:::-;1412:7;-1:-1:-1;1471:2:357;1456:18;;1443:32;1484:33;1443:32;1484:33;:::i;:::-;1536:7;-1:-1:-1;1595:2:357;1580:18;;1567:32;1608:33;1567:32;1608:33;:::i;:::-;1660:7;-1:-1:-1;1714:3:357;1699:19;;1686:33;;-1:-1:-1;1770:3:357;1755:19;;1742:33;1798:18;1787:30;;1784:50;;;1830:1;1827;1820:12;1784:50;1869:58;1919:7;1910:6;1899:9;1895:22;1869:58;:::i;:::-;949:1038;;;;-1:-1:-1;949:1038:357;;-1:-1:-1;949:1038:357;;;;1843:84;;-1:-1:-1;;;949:1038:357:o;1992:163::-;2059:20;;2119:10;2108:22;;2098:33;;2088:61;;2145:1;2142;2135:12;2088:61;1992:163;;;:::o;2160:481::-;2238:6;2246;2254;2307:2;2295:9;2286:7;2282:23;2278:32;2275:52;;;2323:1;2320;2313:12;2275:52;2346:28;2364:9;2346:28;:::i;:::-;2336:38;;2425:2;2414:9;2410:18;2397:32;2452:18;2444:6;2441:30;2438:50;;;2484:1;2481;2474:12;2438:50;2523:58;2573:7;2564:6;2553:9;2549:22;2523:58;:::i;:::-;2160:481;;2600:8;;-1:-1:-1;2497:84:357;;-1:-1:-1;;;;2160:481:357:o;2646:754::-;2743:6;2751;2759;2767;2775;2828:3;2816:9;2807:7;2803:23;2799:33;2796:53;;;2845:1;2842;2835:12;2796:53;2884:9;2871:23;2903:31;2928:5;2903:31;:::i;:::-;2953:5;-1:-1:-1;3010:2:357;2995:18;;2982:32;3023:33;2982:32;3023:33;:::i;:::-;3075:7;-1:-1:-1;3129:2:357;3114:18;;3101:32;;-1:-1:-1;3184:2:357;3169:18;;3156:32;3211:18;3200:30;;3197:50;;;3243:1;3240;3233:12;3197:50;3282:58;3332:7;3323:6;3312:9;3308:22;3282:58;:::i;:::-;2646:754;;;;-1:-1:-1;2646:754:357;;-1:-1:-1;3359:8:357;;3256:84;2646:754;-1:-1:-1;;;2646:754:357:o;3405:685::-;3501:6;3509;3517;3525;3533;3586:3;3574:9;3565:7;3561:23;3557:33;3554:53;;;3603:1;3600;3593:12;3554:53;3642:9;3629:23;3661:31;3686:5;3661:31;:::i;:::-;3711:5;-1:-1:-1;3763:2:357;3748:18;;3735:32;;-1:-1:-1;3786:37:357;3819:2;3804:18;;3786:37;:::i;:::-;3776:47;;3874:2;3863:9;3859:18;3846:32;3901:18;3893:6;3890:30;3887:50;;;3933:1;3930;3923:12;4588:969;4702:6;4710;4718;4726;4734;4742;4750;4803:3;4791:9;4782:7;4778:23;4774:33;4771:53;;;4820:1;4817;4810:12;4771:53;4859:9;4846:23;4878:31;4903:5;4878:31;:::i;:::-;4928:5;-1:-1:-1;4985:2:357;4970:18;;4957:32;4998:33;4957:32;4998:33;:::i;:::-;5050:7;-1:-1:-1;5109:2:357;5094:18;;5081:32;5122:33;5081:32;5122:33;:::i;:::-;5174:7;-1:-1:-1;5228:2:357;5213:18;;5200:32;;-1:-1:-1;5251:38:357;5284:3;5269:19;;5251:38;:::i;:::-;5241:48;;5340:3;5329:9;5325:19;5312:33;5368:18;5360:6;5357:30;5354:50;;;5400:1;5397;5390:12;5562:258;5634:1;5644:113;5658:6;5655:1;5652:13;5644:113;;;5734:11;;;5728:18;5715:11;;;5708:39;5680:2;5673:10;5644:113;;;5775:6;5772:1;5769:13;5766:48;;;-1:-1:-1;;5810:1:357;5792:16;;5785:27;5562:258::o;5825:317::-;5867:3;5905:5;5899:12;5932:6;5927:3;5920:19;5948:63;6004:6;5997:4;5992:3;5988:14;5981:4;5974:5;5970:16;5948:63;:::i;:::-;6056:2;6044:15;6061:66;6040:88;6031:98;;;;6131:4;6027:109;;5825:317;-1:-1:-1;;5825:317:357:o;6147:220::-;6296:2;6285:9;6278:21;6259:4;6316:45;6357:2;6346:9;6342:18;6334:6;6316:45;:::i;6828:827::-;6933:6;6941;6949;6957;6965;6973;7026:3;7014:9;7005:7;7001:23;6997:33;6994:53;;;7043:1;7040;7033:12;6994:53;7082:9;7069:23;7101:31;7126:5;7101:31;:::i;:::-;7151:5;-1:-1:-1;7208:2:357;7193:18;;7180:32;7221:33;7180:32;7221:33;:::i;:::-;7273:7;-1:-1:-1;7327:2:357;7312:18;;7299:32;;-1:-1:-1;7350:37:357;7383:2;7368:18;;7350:37;:::i;:::-;7340:47;;7438:3;7427:9;7423:19;7410:33;7466:18;7458:6;7455:30;7452:50;;;7498:1;7495;7488:12;7452:50;7537:58;7587:7;7578:6;7567:9;7563:22;7537:58;:::i;:::-;6828:827;;;;-1:-1:-1;6828:827:357;;-1:-1:-1;6828:827:357;;7614:8;;6828:827;-1:-1:-1;;;6828:827:357:o;7660:388::-;7728:6;7736;7789:2;7777:9;7768:7;7764:23;7760:32;7757:52;;;7805:1;7802;7795:12;7757:52;7844:9;7831:23;7863:31;7888:5;7863:31;:::i;:::-;7913:5;-1:-1:-1;7970:2:357;7955:18;;7942:32;7983:33;7942:32;7983:33;:::i;:::-;8035:7;8025:17;;;7660:388;;;;;:::o;8235:272::-;8319:6;8372:2;8360:9;8351:7;8347:23;8343:32;8340:52;;;8388:1;8385;8378:12;8340:52;8427:9;8414:23;8446:31;8471:5;8446:31;:::i;8512:616::-;8599:6;8607;8615;8623;8676:2;8664:9;8655:7;8651:23;8647:32;8644:52;;;8692:1;8689;8682:12;8644:52;8731:9;8718:23;8750:31;8775:5;8750:31;:::i;:::-;8800:5;-1:-1:-1;8824:37:357;8857:2;8842:18;;8824:37;:::i;:::-;8814:47;;8912:2;8901:9;8897:18;8884:32;8939:18;8931:6;8928:30;8925:50;;;8971:1;8968;8961:12;8925:50;9010:58;9060:7;9051:6;9040:9;9036:22;9010:58;:::i;:::-;8512:616;;;;-1:-1:-1;9087:8:357;-1:-1:-1;;;;8512:616:357:o;9133:251::-;9203:6;9256:2;9244:9;9235:7;9231:23;9227:32;9224:52;;;9272:1;9269;9262:12;9224:52;9304:9;9298:16;9323:31;9348:5;9323:31;:::i;10999:184::-;11051:77;11048:1;11041:88;11148:4;11145:1;11138:15;11172:4;11169:1;11162:15;11188:125;11228:4;11256:1;11253;11250:8;11247:34;;;11261:18;;:::i;:::-;-1:-1:-1;11298:9:357;;11188:125::o;14007:512::-;14201:4;14230:42;14311:2;14303:6;14299:15;14288:9;14281:34;14363:2;14355:6;14351:15;14346:2;14335:9;14331:18;14324:43;;14403:6;14398:2;14387:9;14383:18;14376:34;14446:3;14441:2;14430:9;14426:18;14419:31;14467:46;14508:3;14497:9;14493:19;14485:6;14467:46;:::i;:::-;14459:54;14007:512;-1:-1:-1;;;;;;14007:512:357:o;14524:424::-;14737:42;14729:6;14725:55;14714:9;14707:74;14817:2;14812;14801:9;14797:18;14790:30;14688:4;14837:45;14878:2;14867:9;14863:18;14855:6;14837:45;:::i;:::-;14829:53;;14930:10;14922:6;14918:23;14913:2;14902:9;14898:18;14891:51;14524:424;;;;;;:::o;14953:128::-;14993:3;15024:1;15020:6;15017:1;15014:13;15011:39;;;15030:18;;:::i;:::-;-1:-1:-1;15066:9:357;;14953:128::o;15086:674::-;15336:4;15365:42;15446:2;15438:6;15434:15;15423:9;15416:34;15498:2;15490:6;15486:15;15481:2;15470:9;15466:18;15459:43;15550:2;15542:6;15538:15;15533:2;15522:9;15518:18;15511:43;15602:2;15594:6;15590:15;15585:2;15574:9;15570:18;15563:43;;15643:6;15637:3;15626:9;15622:19;15615:35;15687:3;15681;15670:9;15666:19;15659:32;15708:46;15749:3;15738:9;15734:19;15726:6;15708:46;:::i;:::-;15700:54;15086:674;-1:-1:-1;;;;;;;;15086:674:357:o;15765:409::-;15980:42;15972:6;15968:55;15957:9;15950:74;16060:6;16055:2;16044:9;16040:18;16033:34;16103:2;16098;16087:9;16083:18;16076:30;15931:4;16123:45;16164:2;16153:9;16149:18;16141:6;16123:45;:::i;:::-;16115:53;15765:409;-1:-1:-1;;;;;15765:409:357:o;16994:277::-;17061:6;17114:2;17102:9;17093:7;17089:23;17085:32;17082:52;;;17130:1;17127;17120:12;17082:52;17162:9;17156:16;17215:5;17208:13;17201:21;17194:5;17191:32;17181:60;;17237:1;17234;17227:12;17687:289;17862:6;17851:9;17844:25;17905:2;17900;17889:9;17885:18;17878:30;17825:4;17925:45;17966:2;17955:9;17951:18;17943:6;17925:45;:::i;18999:274::-;19128:3;19166:6;19160:13;19182:53;19228:6;19223:3;19216:4;19208:6;19204:17;19182:53;:::i;:::-;19251:16;;;;;18999:274;-1:-1:-1;;18999:274:357:o","linkReferences":{}},"methodIdentifiers":{"MESSENGER()":"927ede2d","OTHER_BRIDGE()":"7f46ddb2","bridgeERC20(address,address,uint256,uint32,bytes)":"87087623","bridgeERC20To(address,address,address,uint256,uint32,bytes)":"540abf73","bridgeETH(uint32,bytes)":"09fc8843","bridgeETHTo(address,uint32,bytes)":"e11013dd","deposits(address,address)":"8f601f66","finalizeBridgeERC20(address,address,address,address,uint256,bytes)":"0166a07a","finalizeBridgeETH(address,address,uint256,bytes)":"1635f5fd","finalizeDeposit(address,address,address,address,uint256,bytes)":"662a633a","initialize(address)":"c4d66de8","l1TokenBridge()":"36c717c1","messenger()":"3cb747bf","otherBridge()":"c89701a2","paused()":"5c975abb","version()":"54fd4d50","withdraw(address,uint256,uint32,bytes)":"32b7006d","withdrawTo(address,address,uint256,uint32,bytes)":"a3a79548"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"DepositFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC20BridgeFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ERC20BridgeInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ETHBridgeFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"ETHBridgeInitiated\",\"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\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"WithdrawalInitiated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_BRIDGE\",\"outputs\":[{\"internalType\":\"contract StandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeERC20To\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"bridgeETHTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeBridgeERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeBridgeETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"finalizeDeposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract StandardBridge\",\"name\":\"_otherBridge\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1TokenBridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"contract CrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"otherBridge\",\"outputs\":[{\"internalType\":\"contract StandardBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"custom:proxied\":\"@custom:predeploy 0x4200000000000000000000000000000000000010\",\"events\":{\"DepositFinalized(address,address,address,address,uint256,bytes)\":{\"custom:legacy\":\"@notice Emitted whenever an ERC20 deposit is finalized.\",\"params\":{\"amount\":\"Amount of the ERC20 deposited.\",\"extraData\":\"Extra data attached to the deposit.\",\"from\":\"Address of the depositor.\",\"l1Token\":\"Address of the token on L1.\",\"l2Token\":\"Address of the corresponding token on L2.\",\"to\":\"Address of the recipient on L2.\"}},\"WithdrawalInitiated(address,address,address,address,uint256,bytes)\":{\"custom:legacy\":\"@notice Emitted whenever a withdrawal from L2 to L1 is initiated.\",\"params\":{\"amount\":\"Amount of the ERC20 withdrawn.\",\"extraData\":\"Extra data attached to the withdrawal.\",\"from\":\"Address of the withdrawer.\",\"l1Token\":\"Address of the token on L1.\",\"l2Token\":\"Address of the corresponding token on L2.\",\"to\":\"Address of the recipient on L1.\"}}},\"kind\":\"dev\",\"methods\":{\"MESSENGER()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Contract of the messenger on this domain.\"}},\"OTHER_BRIDGE()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Contract of the bridge on the other network.\"}},\"bridgeERC20(address,address,uint256,uint32,bytes)\":{\"params\":{\"_amount\":\"Amount of local tokens to deposit.\",\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_localToken\":\"Address of the ERC20 on this chain.\",\"_minGasLimit\":\"Minimum amount of gas that the bridge can be relayed with.\",\"_remoteToken\":\"Address of the corresponding token on the remote chain.\"}},\"bridgeERC20To(address,address,address,uint256,uint32,bytes)\":{\"params\":{\"_amount\":\"Amount of local tokens to deposit.\",\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_localToken\":\"Address of the ERC20 on this chain.\",\"_minGasLimit\":\"Minimum amount of gas that the bridge can be relayed with.\",\"_remoteToken\":\"Address of the corresponding token on the remote chain.\",\"_to\":\"Address of the receiver.\"}},\"bridgeETH(uint32,bytes)\":{\"params\":{\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_minGasLimit\":\"Minimum amount of gas that the bridge can be relayed with.\"}},\"bridgeETHTo(address,uint32,bytes)\":{\"params\":{\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_minGasLimit\":\"Minimum amount of gas that the bridge can be relayed with.\",\"_to\":\"Address of the receiver.\"}},\"finalizeBridgeERC20(address,address,address,address,uint256,bytes)\":{\"params\":{\"_amount\":\"Amount of the ERC20 being bridged.\",\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_from\":\"Address of the sender.\",\"_localToken\":\"Address of the ERC20 on this chain.\",\"_remoteToken\":\"Address of the corresponding token on the remote chain.\",\"_to\":\"Address of the receiver.\"}},\"finalizeBridgeETH(address,address,uint256,bytes)\":{\"params\":{\"_amount\":\"Amount of ETH being bridged.\",\"_extraData\":\"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.\",\"_from\":\"Address of the sender.\",\"_to\":\"Address of the receiver.\"}},\"finalizeDeposit(address,address,address,address,uint256,bytes)\":{\"custom:legacy\":\"@notice Finalizes a deposit from L1 to L2. To finalize a deposit of ether, use address(0) and the l1Token and the Legacy ERC20 ether predeploy address as the l2Token.\",\"params\":{\"_amount\":\"Amount of the tokens being deposited.\",\"_extraData\":\"Extra data attached to the deposit.\",\"_from\":\"Address of the depositor.\",\"_l1Token\":\"Address of the L1 token to deposit.\",\"_l2Token\":\"Address of the corresponding L2 token.\",\"_to\":\"Address of the recipient.\"}},\"initialize(address)\":{\"params\":{\"_otherBridge\":\"Contract for the corresponding bridge on the other chain.\"}},\"l1TokenBridge()\":{\"custom:legacy\":\"@notice Retrieves the access of the corresponding L1 bridge contract.\",\"returns\":{\"_0\":\"Address of the corresponding L1 bridge contract.\"}},\"paused()\":{\"returns\":{\"_0\":\"Whether or not the contract is paused.\"}},\"withdraw(address,uint256,uint32,bytes)\":{\"custom:legacy\":\"@notice Initiates a withdrawal from L2 to L1. This function only works with OptimismMintableERC20 tokens or ether. Use the `bridgeERC20` function to bridge native L2 tokens to L1.\",\"params\":{\"_amount\":\"Amount of the L2 token to withdraw.\",\"_extraData\":\"Extra data attached to the withdrawal.\",\"_l2Token\":\"Address of the L2 token to withdraw.\",\"_minGasLimit\":\"Minimum gas limit to use for the transaction.\"}},\"withdrawTo(address,address,uint256,uint32,bytes)\":{\"custom:legacy\":\"@notice Initiates a withdrawal from L2 to L1 to a target account on L1. Note that if ETH is sent to a contract on L1 and the call fails, then that ETH will be locked in the L1StandardBridge. ETH may be recoverable if the call can be successfully replayed by increasing the amount of gas supplied to the call. If the call will fail for any amount of gas, then the ETH will be locked permanently. This function only works with OptimismMintableERC20 tokens or ether. Use the `bridgeERC20To` function to bridge native L2 tokens to L1.\",\"params\":{\"_amount\":\"Amount of the L2 token to withdraw.\",\"_extraData\":\"Extra data attached to the withdrawal.\",\"_l2Token\":\"Address of the L2 token to withdraw.\",\"_minGasLimit\":\"Minimum gas limit to use for the transaction.\",\"_to\":\"Recipient account on L1.\"}}},\"stateVariables\":{\"version\":{\"custom:semver\":\"1.8.0\"}},\"title\":\"L2StandardBridge\",\"version\":1},\"userdoc\":{\"events\":{\"ERC20BridgeFinalized(address,address,address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ERC20 bridge is finalized on this chain.\"},\"ERC20BridgeInitiated(address,address,address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ERC20 bridge is initiated to the other chain.\"},\"ETHBridgeFinalized(address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ETH bridge is finalized on this chain.\"},\"ETHBridgeInitiated(address,address,uint256,bytes)\":{\"notice\":\"Emitted when an ETH bridge is initiated to the other chain.\"}},\"kind\":\"user\",\"methods\":{\"MESSENGER()\":{\"notice\":\"Getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead.\"},\"OTHER_BRIDGE()\":{\"notice\":\"Getter for the other bridge contract. Public getter is legacy and will be removed in the future. Use `otherBridge` instead.\"},\"bridgeERC20(address,address,uint256,uint32,bytes)\":{\"notice\":\"Sends ERC20 tokens to the sender's address on the other chain.\"},\"bridgeERC20To(address,address,address,uint256,uint32,bytes)\":{\"notice\":\"Sends ERC20 tokens to a receiver's address on the other chain.\"},\"bridgeETH(uint32,bytes)\":{\"notice\":\"Sends ETH to the sender's address on the other chain.\"},\"bridgeETHTo(address,uint32,bytes)\":{\"notice\":\"Sends ETH to a receiver's address on the other chain. Note that if ETH is sent to a smart contract and the call fails, the ETH will be temporarily locked in the StandardBridge on the other chain until the call is replayed. If the call cannot be replayed with any amount of gas (call always reverts), then the ETH will be permanently locked in the StandardBridge on the other chain. ETH will also be locked if the receiver is the other bridge, because finalizeBridgeETH will revert in that case.\"},\"constructor\":{\"notice\":\"Constructs the L2StandardBridge contract.\"},\"deposits(address,address)\":{\"notice\":\"Mapping that stores deposits for a given pair of local and remote tokens.\"},\"finalizeBridgeERC20(address,address,address,address,uint256,bytes)\":{\"notice\":\"Finalizes an ERC20 bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain.\"},\"finalizeBridgeETH(address,address,uint256,bytes)\":{\"notice\":\"Finalizes an ETH bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain.\"},\"initialize(address)\":{\"notice\":\"Initializer.\"},\"messenger()\":{\"notice\":\"Messenger contract on this domain.\"},\"otherBridge()\":{\"notice\":\"Corresponding bridge on the other domain.\"},\"paused()\":{\"notice\":\"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op.\"}},\"notice\":\"The L2StandardBridge is responsible for transfering ETH and ERC20 tokens between L1 and L2. In the case that an ERC20 token is native to L2, it will be escrowed within this contract. If the ERC20 token is native to L1, it will be burnt. NOTE: this contract is not intended to support all variations of ERC20 tokens. Examples of some token types that may not be properly supported by this contract include, but are not limited to: tokens with transfer fees, rebasing tokens, and tokens with blocklists.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L2/L2StandardBridge.sol\":\"L2StandardBridge\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0\",\"dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95\",\"dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6\",\"dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol\":{\"keccak256\":\"0xc65c83c1039508fa7a42a09a3c6a32babd1c438ba4dbb23581255e784b5d5eed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1b3b38db0f76429db899909025e534c366415e9ea8b5ddc4c8901e6a7fc1461\",\"dweb:/ipfs/QmYv1KxyHjLEky9JWNSsSfpGJbiCxFyzVFgTwQKpiqYGUg\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409\",\"dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM\"]},\"src/L2/L2StandardBridge.sol\":{\"keccak256\":\"0x9f17720ac0b3b44723b02385a19063cf22704cd0bd253fce3e6d24b9f76bd629\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1575cf22553428baf7abb23059cb97c29e534ab5214f13d54a1810349166c570\",\"dweb:/ipfs/Qme2oVH1pd1rBe1AyxUjHrofDgHXdHaUiqSgBVsSSLbKN5\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72\",\"dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b\",\"dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp\"]},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff\",\"dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA\"]},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12\",\"dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF\"]},\"src/libraries/Predeploys.sol\":{\"keccak256\":\"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663\",\"dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe\"]},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b\",\"dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV\"]},\"src/universal/CrossDomainMessenger.sol\":{\"keccak256\":\"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1\",\"dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n\"]},\"src/universal/IOptimismMintableERC20.sol\":{\"keccak256\":\"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf\",\"dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"src/universal/OptimismMintableERC20.sol\":{\"keccak256\":\"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7\",\"dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa\"]},\"src/universal/StandardBridge.sol\":{\"keccak256\":\"0x1a2f6afd7f14430ae2b797e09497c3dc860ed5db752e1847e30649668060c01d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fefe1356cdeb5b324e4e63e1c723c08f9e244ef2ef133b9f5df0cc0d180eeaa8\",\"dweb:/ipfs/QmZzR3zWKodwdwrdWwXUyh7G3qcFn2cjUQLrE45gRyQMn3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"l1Token","type":"address","indexed":true},{"internalType":"address","name":"l2Token","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"DepositFinalized","anonymous":false},{"inputs":[{"internalType":"address","name":"localToken","type":"address","indexed":true},{"internalType":"address","name":"remoteToken","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ERC20BridgeFinalized","anonymous":false},{"inputs":[{"internalType":"address","name":"localToken","type":"address","indexed":true},{"internalType":"address","name":"remoteToken","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ERC20BridgeInitiated","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ETHBridgeFinalized","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"ETHBridgeInitiated","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"l1Token","type":"address","indexed":true},{"internalType":"address","name":"l2Token","type":"address","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":false},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"bytes","name":"extraData","type":"bytes","indexed":false}],"type":"event","name":"WithdrawalInitiated","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MESSENGER","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"OTHER_BRIDGE","outputs":[{"internalType":"contract StandardBridge","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"bridgeERC20"},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"bridgeERC20To"},{"inputs":[{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"bridgeETH"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"bridgeETHTo"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"finalizeBridgeERC20"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"finalizeBridgeETH"},{"inputs":[{"internalType":"address","name":"_l1Token","type":"address"},{"internalType":"address","name":"_l2Token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"finalizeDeposit"},{"inputs":[{"internalType":"contract StandardBridge","name":"_otherBridge","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"l1TokenBridge","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"messenger","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"otherBridge","outputs":[{"internalType":"contract StandardBridge","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"address","name":"_l2Token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"withdraw"},{"inputs":[{"internalType":"address","name":"_l2Token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"stateMutability":"payable","type":"function","name":"withdrawTo"},{"inputs":[],"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"MESSENGER()":{"custom:legacy":"","returns":{"_0":"Contract of the messenger on this domain."}},"OTHER_BRIDGE()":{"custom:legacy":"","returns":{"_0":"Contract of the bridge on the other network."}},"bridgeERC20(address,address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of local tokens to deposit.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_localToken":"Address of the ERC20 on this chain.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_remoteToken":"Address of the corresponding token on the remote chain."}},"bridgeERC20To(address,address,address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of local tokens to deposit.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_localToken":"Address of the ERC20 on this chain.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_remoteToken":"Address of the corresponding token on the remote chain.","_to":"Address of the receiver."}},"bridgeETH(uint32,bytes)":{"params":{"_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with."}},"bridgeETHTo(address,uint32,bytes)":{"params":{"_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_to":"Address of the receiver."}},"finalizeBridgeERC20(address,address,address,address,uint256,bytes)":{"params":{"_amount":"Amount of the ERC20 being bridged.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_from":"Address of the sender.","_localToken":"Address of the ERC20 on this chain.","_remoteToken":"Address of the corresponding token on the remote chain.","_to":"Address of the receiver."}},"finalizeBridgeETH(address,address,uint256,bytes)":{"params":{"_amount":"Amount of ETH being bridged.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_from":"Address of the sender.","_to":"Address of the receiver."}},"finalizeDeposit(address,address,address,address,uint256,bytes)":{"custom:legacy":"@notice Finalizes a deposit from L1 to L2. To finalize a deposit of ether, use address(0) and the l1Token and the Legacy ERC20 ether predeploy address as the l2Token.","params":{"_amount":"Amount of the tokens being deposited.","_extraData":"Extra data attached to the deposit.","_from":"Address of the depositor.","_l1Token":"Address of the L1 token to deposit.","_l2Token":"Address of the corresponding L2 token.","_to":"Address of the recipient."}},"initialize(address)":{"params":{"_otherBridge":"Contract for the corresponding bridge on the other chain."}},"l1TokenBridge()":{"custom:legacy":"@notice Retrieves the access of the corresponding L1 bridge contract.","returns":{"_0":"Address of the corresponding L1 bridge contract."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}},"withdraw(address,uint256,uint32,bytes)":{"custom:legacy":"@notice Initiates a withdrawal from L2 to L1. This function only works with OptimismMintableERC20 tokens or ether. Use the `bridgeERC20` function to bridge native L2 tokens to L1.","params":{"_amount":"Amount of the L2 token to withdraw.","_extraData":"Extra data attached to the withdrawal.","_l2Token":"Address of the L2 token to withdraw.","_minGasLimit":"Minimum gas limit to use for the transaction."}},"withdrawTo(address,address,uint256,uint32,bytes)":{"custom:legacy":"@notice Initiates a withdrawal from L2 to L1 to a target account on L1. Note that if ETH is sent to a contract on L1 and the call fails, then that ETH will be locked in the L1StandardBridge. ETH may be recoverable if the call can be successfully replayed by increasing the amount of gas supplied to the call. If the call will fail for any amount of gas, then the ETH will be locked permanently. This function only works with OptimismMintableERC20 tokens or ether. Use the `bridgeERC20To` function to bridge native L2 tokens to L1.","params":{"_amount":"Amount of the L2 token to withdraw.","_extraData":"Extra data attached to the withdrawal.","_l2Token":"Address of the L2 token to withdraw.","_minGasLimit":"Minimum gas limit to use for the transaction.","_to":"Recipient account on L1."}}},"version":1},"userdoc":{"kind":"user","methods":{"MESSENGER()":{"notice":"Getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead."},"OTHER_BRIDGE()":{"notice":"Getter for the other bridge contract. Public getter is legacy and will be removed in the future. Use `otherBridge` instead."},"bridgeERC20(address,address,uint256,uint32,bytes)":{"notice":"Sends ERC20 tokens to the sender's address on the other chain."},"bridgeERC20To(address,address,address,uint256,uint32,bytes)":{"notice":"Sends ERC20 tokens to a receiver's address on the other chain."},"bridgeETH(uint32,bytes)":{"notice":"Sends ETH to the sender's address on the other chain."},"bridgeETHTo(address,uint32,bytes)":{"notice":"Sends ETH to a receiver's address on the other chain. Note that if ETH is sent to a smart contract and the call fails, the ETH will be temporarily locked in the StandardBridge on the other chain until the call is replayed. If the call cannot be replayed with any amount of gas (call always reverts), then the ETH will be permanently locked in the StandardBridge on the other chain. ETH will also be locked if the receiver is the other bridge, because finalizeBridgeETH will revert in that case."},"constructor":{"notice":"Constructs the L2StandardBridge contract."},"deposits(address,address)":{"notice":"Mapping that stores deposits for a given pair of local and remote tokens."},"finalizeBridgeERC20(address,address,address,address,uint256,bytes)":{"notice":"Finalizes an ERC20 bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain."},"finalizeBridgeETH(address,address,uint256,bytes)":{"notice":"Finalizes an ETH bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain."},"initialize(address)":{"notice":"Initializer."},"messenger()":{"notice":"Messenger contract on this domain."},"otherBridge()":{"notice":"Corresponding bridge on the other domain."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L2/L2StandardBridge.sol":"L2StandardBridge"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66","urls":["bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f","dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"keccak256":"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238","urls":["bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0","dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca","urls":["bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd","dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"keccak256":"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329","urls":["bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95","dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29","urls":["bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6","dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol":{"keccak256":"0xc65c83c1039508fa7a42a09a3c6a32babd1c438ba4dbb23581255e784b5d5eed","urls":["bzz-raw://a1b3b38db0f76429db899909025e534c366415e9ea8b5ddc4c8901e6a7fc1461","dweb:/ipfs/QmYv1KxyHjLEky9JWNSsSfpGJbiCxFyzVFgTwQKpiqYGUg"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1","urls":["bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f","dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0","urls":["bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929","dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7","urls":["bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689","dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy"],"license":"MIT"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d","urls":["bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c","dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8"],"license":"MIT"},"src/L1/ResourceMetering.sol":{"keccak256":"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408","urls":["bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409","dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM"],"license":"MIT"},"src/L2/L2StandardBridge.sol":{"keccak256":"0x9f17720ac0b3b44723b02385a19063cf22704cd0bd253fce3e6d24b9f76bd629","urls":["bzz-raw://1575cf22553428baf7abb23059cb97c29e534ab5214f13d54a1810349166c570","dweb:/ipfs/Qme2oVH1pd1rBe1AyxUjHrofDgHXdHaUiqSgBVsSSLbKN5"],"license":"MIT"},"src/libraries/Arithmetic.sol":{"keccak256":"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db","urls":["bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72","dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq"],"license":"MIT"},"src/libraries/Burn.sol":{"keccak256":"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010","urls":["bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f","dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"],"license":"MIT"},"src/libraries/Constants.sol":{"keccak256":"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132","urls":["bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b","dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp"],"license":"MIT"},"src/libraries/Encoding.sol":{"keccak256":"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87","urls":["bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff","dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA"],"license":"MIT"},"src/libraries/Hashing.sol":{"keccak256":"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8","urls":["bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12","dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF"],"license":"MIT"},"src/libraries/Predeploys.sol":{"keccak256":"0x7b48b32b75e9ba0cd7f83b3304c6c1676dd8de20a5d40e8846bf7018ae9aff02","urls":["bzz-raw://7574fcc79c0d545b90071023aa81ee7880ab50b3057df598fa693bc4cf303663","dweb:/ipfs/QmWLxHzgfaTJ7thfb7khXkTY5UtSBZ5VTUB4DaAXVw7DRe"],"license":"MIT"},"src/libraries/SafeCall.sol":{"keccak256":"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f","urls":["bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a","dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq"],"license":"MIT"},"src/libraries/Types.sol":{"keccak256":"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4","urls":["bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e","dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"],"license":"MIT"},"src/libraries/rlp/RLPWriter.sol":{"keccak256":"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6","urls":["bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b","dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV"],"license":"MIT"},"src/universal/CrossDomainMessenger.sol":{"keccak256":"0x330ae1479e88fc8a8b5b27a84df935a092a47ad13e59d9b9ea4982ad31bbe7b0","urls":["bzz-raw://66bf5fb4e78a03dcad4b9a8e2d5ed135f8e989aa02090747386843383fa6b7d1","dweb:/ipfs/QmTp66RoF6EaKeBrrZBuYAu3dsMfKo8de2XY9iHHnqfN3n"],"license":"MIT"},"src/universal/IOptimismMintableERC20.sol":{"keccak256":"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c","urls":["bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf","dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"},"src/universal/OptimismMintableERC20.sol":{"keccak256":"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df","urls":["bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7","dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa"],"license":"MIT"},"src/universal/StandardBridge.sol":{"keccak256":"0x1a2f6afd7f14430ae2b797e09497c3dc860ed5db752e1847e30649668060c01d","urls":["bzz-raw://fefe1356cdeb5b324e4e63e1c723c08f9e244ef2ef133b9f5df0cc0d180eeaa8","dweb:/ipfs/QmZzR3zWKodwdwrdWwXUyh7G3qcFn2cjUQLrE45gRyQMn3"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":49534,"contract":"src/L2/L2StandardBridge.sol:L2StandardBridge","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":49537,"contract":"src/L2/L2StandardBridge.sol:L2StandardBridge","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":110944,"contract":"src/L2/L2StandardBridge.sol:L2StandardBridge","label":"spacer_0_2_30","offset":2,"slot":"0","type":"t_bytes30"},{"astId":110947,"contract":"src/L2/L2StandardBridge.sol:L2StandardBridge","label":"spacer_1_0_20","offset":0,"slot":"1","type":"t_address"},{"astId":110954,"contract":"src/L2/L2StandardBridge.sol:L2StandardBridge","label":"deposits","offset":0,"slot":"2","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))"},{"astId":110958,"contract":"src/L2/L2StandardBridge.sol:L2StandardBridge","label":"messenger","offset":0,"slot":"3","type":"t_contract(CrossDomainMessenger)108888"},{"astId":110962,"contract":"src/L2/L2StandardBridge.sol:L2StandardBridge","label":"otherBridge","offset":0,"slot":"4","type":"t_contract(StandardBridge)111675"},{"astId":110967,"contract":"src/L2/L2StandardBridge.sol:L2StandardBridge","label":"__gap","offset":0,"slot":"5","type":"t_array(t_uint256)45_storage"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_uint256)45_storage":{"encoding":"inplace","label":"uint256[45]","numberOfBytes":"1440","base":"t_uint256"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes30":{"encoding":"inplace","label":"bytes30","numberOfBytes":"30"},"t_contract(CrossDomainMessenger)108888":{"encoding":"inplace","label":"contract CrossDomainMessenger","numberOfBytes":"20"},"t_contract(StandardBridge)111675":{"encoding":"inplace","label":"contract StandardBridge","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"version":1,"kind":"user","methods":{"MESSENGER()":{"notice":"Getter for messenger contract. Public getter is legacy and will be removed in the future. Use `messenger` instead."},"OTHER_BRIDGE()":{"notice":"Getter for the other bridge contract. Public getter is legacy and will be removed in the future. Use `otherBridge` instead."},"bridgeERC20(address,address,uint256,uint32,bytes)":{"notice":"Sends ERC20 tokens to the sender's address on the other chain."},"bridgeERC20To(address,address,address,uint256,uint32,bytes)":{"notice":"Sends ERC20 tokens to a receiver's address on the other chain."},"bridgeETH(uint32,bytes)":{"notice":"Sends ETH to the sender's address on the other chain."},"bridgeETHTo(address,uint32,bytes)":{"notice":"Sends ETH to a receiver's address on the other chain. Note that if ETH is sent to a smart contract and the call fails, the ETH will be temporarily locked in the StandardBridge on the other chain until the call is replayed. If the call cannot be replayed with any amount of gas (call always reverts), then the ETH will be permanently locked in the StandardBridge on the other chain. ETH will also be locked if the receiver is the other bridge, because finalizeBridgeETH will revert in that case."},"constructor":{"notice":"Constructs the L2StandardBridge contract."},"deposits(address,address)":{"notice":"Mapping that stores deposits for a given pair of local and remote tokens."},"finalizeBridgeERC20(address,address,address,address,uint256,bytes)":{"notice":"Finalizes an ERC20 bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain."},"finalizeBridgeETH(address,address,uint256,bytes)":{"notice":"Finalizes an ETH bridge on this chain. Can only be triggered by the other StandardBridge contract on the remote chain."},"initialize(address)":{"notice":"Initializer."},"messenger()":{"notice":"Messenger contract on this domain."},"otherBridge()":{"notice":"Corresponding bridge on the other domain."},"paused()":{"notice":"This function should return true if the contract is paused. On L1 this function will check the SuperchainConfig for its paused status. On L2 this function should be a no-op."}},"events":{"ERC20BridgeFinalized(address,address,address,address,uint256,bytes)":{"notice":"Emitted when an ERC20 bridge is finalized on this chain."},"ERC20BridgeInitiated(address,address,address,address,uint256,bytes)":{"notice":"Emitted when an ERC20 bridge is initiated to the other chain."},"ETHBridgeFinalized(address,address,uint256,bytes)":{"notice":"Emitted when an ETH bridge is finalized on this chain."},"ETHBridgeInitiated(address,address,uint256,bytes)":{"notice":"Emitted when an ETH bridge is initiated to the other chain."}},"notice":"The L2StandardBridge is responsible for transfering ETH and ERC20 tokens between L1 and L2. In the case that an ERC20 token is native to L2, it will be escrowed within this contract. If the ERC20 token is native to L1, it will be burnt. NOTE: this contract is not intended to support all variations of ERC20 tokens. Examples of some token types that may not be properly supported by this contract include, but are not limited to: tokens with transfer fees, rebasing tokens, and tokens with blocklists."},"devdoc":{"version":1,"kind":"dev","methods":{"MESSENGER()":{"returns":{"_0":"Contract of the messenger on this domain."}},"OTHER_BRIDGE()":{"returns":{"_0":"Contract of the bridge on the other network."}},"bridgeERC20(address,address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of local tokens to deposit.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_localToken":"Address of the ERC20 on this chain.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_remoteToken":"Address of the corresponding token on the remote chain."}},"bridgeERC20To(address,address,address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of local tokens to deposit.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_localToken":"Address of the ERC20 on this chain.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_remoteToken":"Address of the corresponding token on the remote chain.","_to":"Address of the receiver."}},"bridgeETH(uint32,bytes)":{"params":{"_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with."}},"bridgeETHTo(address,uint32,bytes)":{"params":{"_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_minGasLimit":"Minimum amount of gas that the bridge can be relayed with.","_to":"Address of the receiver."}},"finalizeBridgeERC20(address,address,address,address,uint256,bytes)":{"params":{"_amount":"Amount of the ERC20 being bridged.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_from":"Address of the sender.","_localToken":"Address of the ERC20 on this chain.","_remoteToken":"Address of the corresponding token on the remote chain.","_to":"Address of the receiver."}},"finalizeBridgeETH(address,address,uint256,bytes)":{"params":{"_amount":"Amount of ETH being bridged.","_extraData":"Extra data to be sent with the transaction. Note that the recipient will not be triggered with this data, but it will be emitted and can be used to identify the transaction.","_from":"Address of the sender.","_to":"Address of the receiver."}},"finalizeDeposit(address,address,address,address,uint256,bytes)":{"params":{"_amount":"Amount of the tokens being deposited.","_extraData":"Extra data attached to the deposit.","_from":"Address of the depositor.","_l1Token":"Address of the L1 token to deposit.","_l2Token":"Address of the corresponding L2 token.","_to":"Address of the recipient."}},"initialize(address)":{"params":{"_otherBridge":"Contract for the corresponding bridge on the other chain."}},"l1TokenBridge()":{"returns":{"_0":"Address of the corresponding L1 bridge contract."}},"paused()":{"returns":{"_0":"Whether or not the contract is paused."}},"withdraw(address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of the L2 token to withdraw.","_extraData":"Extra data attached to the withdrawal.","_l2Token":"Address of the L2 token to withdraw.","_minGasLimit":"Minimum gas limit to use for the transaction."}},"withdrawTo(address,address,uint256,uint32,bytes)":{"params":{"_amount":"Amount of the L2 token to withdraw.","_extraData":"Extra data attached to the withdrawal.","_l2Token":"Address of the L2 token to withdraw.","_minGasLimit":"Minimum gas limit to use for the transaction.","_to":"Recipient account on L1."}}},"events":{"DepositFinalized(address,address,address,address,uint256,bytes)":{"params":{"amount":"Amount of the ERC20 deposited.","extraData":"Extra data attached to the deposit.","from":"Address of the depositor.","l1Token":"Address of the token on L1.","l2Token":"Address of the corresponding token on L2.","to":"Address of the recipient on L2."}},"WithdrawalInitiated(address,address,address,address,uint256,bytes)":{"params":{"amount":"Amount of the ERC20 withdrawn.","extraData":"Extra data attached to the withdrawal.","from":"Address of the withdrawer.","l1Token":"Address of the token on L1.","l2Token":"Address of the corresponding token on L2.","to":"Address of the recipient on L1."}}},"title":"L2StandardBridge"},"ast":{"absolutePath":"src/L2/L2StandardBridge.sol","id":91147,"exportedSymbols":{"Constants":[103096],"CrossDomainMessenger":[108888],"ISemver":[109417],"L2StandardBridge":[91146],"OptimismMintableERC20":[109645],"Predeploys":[104124],"StandardBridge":[111675]},"nodeType":"SourceUnit","src":"32:10417:149","nodes":[{"id":90725,"nodeType":"PragmaDirective","src":"32:23:149","nodes":[],"literals":["solidity","0.8",".15"]},{"id":90727,"nodeType":"ImportDirective","src":"57:58:149","nodes":[],"absolutePath":"src/libraries/Predeploys.sol","file":"src/libraries/Predeploys.sol","nameLocation":"-1:-1:-1","scope":91147,"sourceUnit":104125,"symbolAliases":[{"foreign":{"id":90726,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"66:10:149","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90729,"nodeType":"ImportDirective","src":"116:66:149","nodes":[],"absolutePath":"src/universal/StandardBridge.sol","file":"src/universal/StandardBridge.sol","nameLocation":"-1:-1:-1","scope":91147,"sourceUnit":111676,"symbolAliases":[{"foreign":{"id":90728,"name":"StandardBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111675,"src":"125:14:149","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90731,"nodeType":"ImportDirective","src":"183:52:149","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":91147,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":90730,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"192:7:149","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90733,"nodeType":"ImportDirective","src":"236:80:149","nodes":[],"absolutePath":"src/universal/OptimismMintableERC20.sol","file":"src/universal/OptimismMintableERC20.sol","nameLocation":"-1:-1:-1","scope":91147,"sourceUnit":109646,"symbolAliases":[{"foreign":{"id":90732,"name":"OptimismMintableERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109645,"src":"245:21:149","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90735,"nodeType":"ImportDirective","src":"317:78:149","nodes":[],"absolutePath":"src/universal/CrossDomainMessenger.sol","file":"src/universal/CrossDomainMessenger.sol","nameLocation":"-1:-1:-1","scope":91147,"sourceUnit":108889,"symbolAliases":[{"foreign":{"id":90734,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"326:20:149","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":90737,"nodeType":"ImportDirective","src":"396:56:149","nodes":[],"absolutePath":"src/libraries/Constants.sol","file":"src/libraries/Constants.sol","nameLocation":"-1:-1:-1","scope":91147,"sourceUnit":103097,"symbolAliases":[{"foreign":{"id":90736,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"405:9:149","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":91146,"nodeType":"ContractDefinition","src":"1141:9307:149","nodes":[{"id":90757,"nodeType":"EventDefinition","src":"1646:197:149","nodes":[],"anonymous":false,"documentation":{"id":90743,"nodeType":"StructuredDocumentation","src":"1200:441:149","text":"@custom:legacy\n @notice Emitted whenever a withdrawal from L2 to L1 is initiated.\n @param l1Token Address of the token on L1.\n @param l2Token Address of the corresponding token on L2.\n @param from Address of the withdrawer.\n @param to Address of the recipient on L1.\n @param amount Amount of the ERC20 withdrawn.\n @param extraData Extra data attached to the withdrawal."},"eventSelector":"73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e","name":"WithdrawalInitiated","nameLocation":"1652:19:149","parameters":{"id":90756,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90745,"indexed":true,"mutability":"mutable","name":"l1Token","nameLocation":"1697:7:149","nodeType":"VariableDeclaration","scope":90757,"src":"1681:23:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90744,"name":"address","nodeType":"ElementaryTypeName","src":"1681:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90747,"indexed":true,"mutability":"mutable","name":"l2Token","nameLocation":"1730:7:149","nodeType":"VariableDeclaration","scope":90757,"src":"1714:23:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90746,"name":"address","nodeType":"ElementaryTypeName","src":"1714:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90749,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"1763:4:149","nodeType":"VariableDeclaration","scope":90757,"src":"1747:20:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90748,"name":"address","nodeType":"ElementaryTypeName","src":"1747:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90751,"indexed":false,"mutability":"mutable","name":"to","nameLocation":"1785:2:149","nodeType":"VariableDeclaration","scope":90757,"src":"1777:10:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90750,"name":"address","nodeType":"ElementaryTypeName","src":"1777:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90753,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"1805:6:149","nodeType":"VariableDeclaration","scope":90757,"src":"1797:14:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90752,"name":"uint256","nodeType":"ElementaryTypeName","src":"1797:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":90755,"indexed":false,"mutability":"mutable","name":"extraData","nameLocation":"1827:9:149","nodeType":"VariableDeclaration","scope":90757,"src":"1821:15:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":90754,"name":"bytes","nodeType":"ElementaryTypeName","src":"1821:5:149","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1671:171:149"}},{"id":90772,"nodeType":"EventDefinition","src":"2281:194:149","nodes":[],"anonymous":false,"documentation":{"id":90758,"nodeType":"StructuredDocumentation","src":"1849:427:149","text":"@custom:legacy\n @notice Emitted whenever an ERC20 deposit is finalized.\n @param l1Token Address of the token on L1.\n @param l2Token Address of the corresponding token on L2.\n @param from Address of the depositor.\n @param to Address of the recipient on L2.\n @param amount Amount of the ERC20 deposited.\n @param extraData Extra data attached to the deposit."},"eventSelector":"b0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89","name":"DepositFinalized","nameLocation":"2287:16:149","parameters":{"id":90771,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90760,"indexed":true,"mutability":"mutable","name":"l1Token","nameLocation":"2329:7:149","nodeType":"VariableDeclaration","scope":90772,"src":"2313:23:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90759,"name":"address","nodeType":"ElementaryTypeName","src":"2313:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90762,"indexed":true,"mutability":"mutable","name":"l2Token","nameLocation":"2362:7:149","nodeType":"VariableDeclaration","scope":90772,"src":"2346:23:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90761,"name":"address","nodeType":"ElementaryTypeName","src":"2346:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90764,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"2395:4:149","nodeType":"VariableDeclaration","scope":90772,"src":"2379:20:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90763,"name":"address","nodeType":"ElementaryTypeName","src":"2379:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90766,"indexed":false,"mutability":"mutable","name":"to","nameLocation":"2417:2:149","nodeType":"VariableDeclaration","scope":90772,"src":"2409:10:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90765,"name":"address","nodeType":"ElementaryTypeName","src":"2409:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90768,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"2437:6:149","nodeType":"VariableDeclaration","scope":90772,"src":"2429:14:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90767,"name":"uint256","nodeType":"ElementaryTypeName","src":"2429:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":90770,"indexed":false,"mutability":"mutable","name":"extraData","nameLocation":"2459:9:149","nodeType":"VariableDeclaration","scope":90772,"src":"2453:15:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":90769,"name":"bytes","nodeType":"ElementaryTypeName","src":"2453:5:149","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2303:171:149"}},{"id":90776,"nodeType":"VariableDeclaration","src":"2510:40:149","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":90773,"nodeType":"StructuredDocumentation","src":"2481:24:149","text":"@custom:semver 1.8.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"2533:7:149","scope":91146,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":90774,"name":"string","nodeType":"ElementaryTypeName","src":"2510:6:149","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"312e382e30","id":90775,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2543:7:149","typeDescriptions":{"typeIdentifier":"t_stringliteral_cd02a4b5da981b4c403351c949b2ca4bdb2fb4b72b50891f7eb106d3eb7049e9","typeString":"literal_string \"1.8.0\""},"value":"1.8.0"},"visibility":"public"},{"id":90795,"nodeType":"FunctionDefinition","src":"2615:113:149","nodes":[],"body":{"id":90794,"nodeType":"Block","src":"2646:82:149","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30","id":90788,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2714:1:149","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":90787,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2706:7:149","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":90786,"name":"address","nodeType":"ElementaryTypeName","src":"2706:7:149","typeDescriptions":{}}},"id":90789,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2706:10:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90785,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2698:8:149","typeDescriptions":{"typeIdentifier":"t_type$_t_address_payable_$","typeString":"type(address payable)"},"typeName":{"id":90784,"name":"address","nodeType":"ElementaryTypeName","src":"2698:8:149","stateMutability":"payable","typeDescriptions":{}}},"id":90790,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2698:19:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":90783,"name":"StandardBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111675,"src":"2683:14:149","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StandardBridge_$111675_$","typeString":"type(contract StandardBridge)"}},"id":90791,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2683:35:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}],"id":90782,"name":"initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90813,"src":"2656:10:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_StandardBridge_$111675_$returns$__$","typeString":"function (contract StandardBridge)"}},"id":90792,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_otherBridge"],"nodeType":"FunctionCall","src":"2656:65:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90793,"nodeType":"ExpressionStatement","src":"2656:65:149"}]},"documentation":{"id":90777,"nodeType":"StructuredDocumentation","src":"2557:53:149","text":"@notice Constructs the L2StandardBridge contract."},"implemented":true,"kind":"constructor","modifiers":[{"arguments":[],"id":90780,"kind":"baseConstructorSpecifier","modifierName":{"id":90779,"name":"StandardBridge","nodeType":"IdentifierPath","referencedDeclaration":111675,"src":"2629:14:149"},"nodeType":"ModifierInvocation","src":"2629:16:149"}],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":90778,"nodeType":"ParameterList","parameters":[],"src":"2626:2:149"},"returnParameters":{"id":90781,"nodeType":"ParameterList","parameters":[],"src":"2646:0:149"},"scope":91146,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":90813,"nodeType":"FunctionDefinition","src":"2849:242:149","nodes":[],"body":{"id":90812,"nodeType":"Block","src":"2917:174:149","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"expression":{"id":90806,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"2996:10:149","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":90807,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"L2_CROSS_DOMAIN_MESSENGER","nodeType":"MemberAccess","referencedDeclaration":104004,"src":"2996:36:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90805,"name":"CrossDomainMessenger","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108888,"src":"2975:20:149","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CrossDomainMessenger_$108888_$","typeString":"type(contract CrossDomainMessenger)"}},"id":90808,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2975:58:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"}},{"id":90809,"name":"_otherBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90799,"src":"3061:12:149","typeDescriptions":{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_CrossDomainMessenger_$108888","typeString":"contract CrossDomainMessenger"},{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}],"id":90804,"name":"__StandardBridge_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111080,"src":"2927:21:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_CrossDomainMessenger_$108888_$_t_contract$_StandardBridge_$111675_$returns$__$","typeString":"function (contract CrossDomainMessenger,contract StandardBridge)"}},"id":90810,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_messenger","_otherBridge"],"nodeType":"FunctionCall","src":"2927:157:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90811,"nodeType":"ExpressionStatement","src":"2927:157:149"}]},"documentation":{"id":90796,"nodeType":"StructuredDocumentation","src":"2734:110:149","text":"@notice Initializer.\n @param _otherBridge Contract for the corresponding bridge on the other chain."},"functionSelector":"c4d66de8","implemented":true,"kind":"function","modifiers":[{"id":90802,"kind":"modifierInvocation","modifierName":{"id":90801,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":49598,"src":"2905:11:149"},"nodeType":"ModifierInvocation","src":"2905:11:149"}],"name":"initialize","nameLocation":"2858:10:149","parameters":{"id":90800,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90799,"mutability":"mutable","name":"_otherBridge","nameLocation":"2884:12:149","nodeType":"VariableDeclaration","scope":90813,"src":"2869:27:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"},"typeName":{"id":90798,"nodeType":"UserDefinedTypeName","pathNode":{"id":90797,"name":"StandardBridge","nodeType":"IdentifierPath","referencedDeclaration":111675,"src":"2869:14:149"},"referencedDeclaration":111675,"src":"2869:14:149","typeDescriptions":{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}},"visibility":"internal"}],"src":"2868:29:149"},"returnParameters":{"id":90803,"nodeType":"ParameterList","parameters":[],"src":"2917:0:149"},"scope":91146,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":90837,"nodeType":"FunctionDefinition","src":"3174:204:149","nodes":[],"body":{"id":90836,"nodeType":"Block","src":"3218:160:149","nodes":[],"statements":[{"expression":{"arguments":[{"expression":{"id":90821,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"3261:10:149","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":90822,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"LEGACY_ERC20_ETH","nodeType":"MemberAccess","referencedDeclaration":104047,"src":"3261:27:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":90823,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3290:3:149","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":90824,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3290:10:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":90825,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3302:3:149","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":90826,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3302:10:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":90827,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3314:3:149","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":90828,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"3314:9:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":90829,"name":"RECEIVE_DEFAULT_GAS_LIMIT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110941,"src":"3325:25:149","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"arguments":[{"hexValue":"","id":90832,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3358:2:149","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":90831,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3352:5:149","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":90830,"name":"bytes","nodeType":"ElementaryTypeName","src":"3352:5:149","typeDescriptions":{}}},"id":90833,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3352:9:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":90820,"name":"_initiateWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90997,"src":"3228:19:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256,uint32,bytes memory)"}},"id":90834,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3228:143:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90835,"nodeType":"ExpressionStatement","src":"3228:143:149"}]},"baseFunctions":[111084],"documentation":{"id":90814,"nodeType":"StructuredDocumentation","src":"3097:72:149","text":"@notice Allows EOAs to bridge ETH by sending directly to the bridge."},"implemented":true,"kind":"receive","modifiers":[{"id":90818,"kind":"modifierInvocation","modifierName":{"id":90817,"name":"onlyEOA","nodeType":"IdentifierPath","referencedDeclaration":111034,"src":"3210:7:149"},"nodeType":"ModifierInvocation","src":"3210:7:149"}],"name":"","nameLocation":"-1:-1:-1","overrides":{"id":90816,"nodeType":"OverrideSpecifier","overrides":[],"src":"3201:8:149"},"parameters":{"id":90815,"nodeType":"ParameterList","parameters":[],"src":"3181:2:149"},"returnParameters":{"id":90819,"nodeType":"ParameterList","parameters":[],"src":"3218:0:149"},"scope":91146,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":90863,"nodeType":"FunctionDefinition","src":"3897:313:149","nodes":[],"body":{"id":90862,"nodeType":"Block","src":"4105:105:149","nodes":[],"statements":[{"expression":{"arguments":[{"id":90852,"name":"_l2Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90840,"src":"4135:8:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":90853,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4145:3:149","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":90854,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4145:10:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":90855,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4157:3:149","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":90856,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"4157:10:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90857,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90842,"src":"4169:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":90858,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90844,"src":"4178:12:149","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":90859,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90846,"src":"4192:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":90851,"name":"_initiateWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90997,"src":"4115:19:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256,uint32,bytes memory)"}},"id":90860,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4115:88:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90861,"nodeType":"ExpressionStatement","src":"4115:88:149"}]},"documentation":{"id":90838,"nodeType":"StructuredDocumentation","src":"3384:508:149","text":"@custom:legacy\n @notice Initiates a withdrawal from L2 to L1.\n This function only works with OptimismMintableERC20 tokens or ether. Use the\n `bridgeERC20` function to bridge native L2 tokens to L1.\n @param _l2Token Address of the L2 token to withdraw.\n @param _amount Amount of the L2 token to withdraw.\n @param _minGasLimit Minimum gas limit to use for the transaction.\n @param _extraData Extra data attached to the withdrawal."},"functionSelector":"32b7006d","implemented":true,"kind":"function","modifiers":[{"id":90849,"kind":"modifierInvocation","modifierName":{"id":90848,"name":"onlyEOA","nodeType":"IdentifierPath","referencedDeclaration":111034,"src":"4093:7:149"},"nodeType":"ModifierInvocation","src":"4093:7:149"}],"name":"withdraw","nameLocation":"3906:8:149","parameters":{"id":90847,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90840,"mutability":"mutable","name":"_l2Token","nameLocation":"3932:8:149","nodeType":"VariableDeclaration","scope":90863,"src":"3924:16:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90839,"name":"address","nodeType":"ElementaryTypeName","src":"3924:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90842,"mutability":"mutable","name":"_amount","nameLocation":"3958:7:149","nodeType":"VariableDeclaration","scope":90863,"src":"3950:15:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90841,"name":"uint256","nodeType":"ElementaryTypeName","src":"3950:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":90844,"mutability":"mutable","name":"_minGasLimit","nameLocation":"3982:12:149","nodeType":"VariableDeclaration","scope":90863,"src":"3975:19:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":90843,"name":"uint32","nodeType":"ElementaryTypeName","src":"3975:6:149","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":90846,"mutability":"mutable","name":"_extraData","nameLocation":"4019:10:149","nodeType":"VariableDeclaration","scope":90863,"src":"4004:25:149","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":90845,"name":"bytes","nodeType":"ElementaryTypeName","src":"4004:5:149","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3914:121:149"},"returnParameters":{"id":90850,"nodeType":"ParameterList","parameters":[],"src":"4105:0:149"},"scope":91146,"stateMutability":"payable","virtual":true,"visibility":"external"},{"id":90888,"nodeType":"FunctionDefinition","src":"5197:313:149","nodes":[],"body":{"id":90887,"nodeType":"Block","src":"5412:98:149","nodes":[],"statements":[{"expression":{"arguments":[{"id":90878,"name":"_l2Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90866,"src":"5442:8:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":90879,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5452:3:149","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":90880,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5452:10:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90881,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90868,"src":"5464:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90882,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90870,"src":"5469:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":90883,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90872,"src":"5478:12:149","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":90884,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90874,"src":"5492:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":90877,"name":"_initiateWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90997,"src":"5422:19:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256,uint32,bytes memory)"}},"id":90885,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5422:81:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90886,"nodeType":"ExpressionStatement","src":"5422:81:149"}]},"documentation":{"id":90864,"nodeType":"StructuredDocumentation","src":"4216:976:149","text":"@custom:legacy\n @notice Initiates a withdrawal from L2 to L1 to a target account on L1.\n Note that if ETH is sent to a contract on L1 and the call fails, then that ETH will\n be locked in the L1StandardBridge. ETH may be recoverable if the call can be\n successfully replayed by increasing the amount of gas supplied to the call. If the\n call will fail for any amount of gas, then the ETH will be locked permanently.\n This function only works with OptimismMintableERC20 tokens or ether. Use the\n `bridgeERC20To` function to bridge native L2 tokens to L1.\n @param _l2Token Address of the L2 token to withdraw.\n @param _to Recipient account on L1.\n @param _amount Amount of the L2 token to withdraw.\n @param _minGasLimit Minimum gas limit to use for the transaction.\n @param _extraData Extra data attached to the withdrawal."},"functionSelector":"a3a79548","implemented":true,"kind":"function","modifiers":[],"name":"withdrawTo","nameLocation":"5206:10:149","parameters":{"id":90875,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90866,"mutability":"mutable","name":"_l2Token","nameLocation":"5234:8:149","nodeType":"VariableDeclaration","scope":90888,"src":"5226:16:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90865,"name":"address","nodeType":"ElementaryTypeName","src":"5226:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90868,"mutability":"mutable","name":"_to","nameLocation":"5260:3:149","nodeType":"VariableDeclaration","scope":90888,"src":"5252:11:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90867,"name":"address","nodeType":"ElementaryTypeName","src":"5252:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90870,"mutability":"mutable","name":"_amount","nameLocation":"5281:7:149","nodeType":"VariableDeclaration","scope":90888,"src":"5273:15:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90869,"name":"uint256","nodeType":"ElementaryTypeName","src":"5273:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":90872,"mutability":"mutable","name":"_minGasLimit","nameLocation":"5305:12:149","nodeType":"VariableDeclaration","scope":90888,"src":"5298:19:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":90871,"name":"uint32","nodeType":"ElementaryTypeName","src":"5298:6:149","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":90874,"mutability":"mutable","name":"_extraData","nameLocation":"5342:10:149","nodeType":"VariableDeclaration","scope":90888,"src":"5327:25:149","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":90873,"name":"bytes","nodeType":"ElementaryTypeName","src":"5327:5:149","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5216:142:149"},"returnParameters":{"id":90876,"nodeType":"ParameterList","parameters":[],"src":"5412:0:149"},"scope":91146,"stateMutability":"payable","virtual":true,"visibility":"external"},{"id":90935,"nodeType":"FunctionDefinition","src":"6087:505:149","nodes":[],"body":{"id":90934,"nodeType":"Block","src":"6327:265:149","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":90914,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90909,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90904,"name":"_l1Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90891,"src":"6341:8:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":90907,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6361:1:149","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":90906,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6353:7:149","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":90905,"name":"address","nodeType":"ElementaryTypeName","src":"6353:7:149","typeDescriptions":{}}},"id":90908,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6353:10:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6341:22:149","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90913,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90910,"name":"_l2Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90893,"src":"6367:8:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":90911,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"6379:10:149","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":90912,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"LEGACY_ERC20_ETH","nodeType":"MemberAccess","referencedDeclaration":104047,"src":"6379:27:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6367:39:149","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6341:65:149","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":90932,"nodeType":"Block","src":"6489:97:149","statements":[{"expression":{"arguments":[{"id":90924,"name":"_l2Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90893,"src":"6523:8:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90925,"name":"_l1Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90891,"src":"6533:8:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90926,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90895,"src":"6543:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90927,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90897,"src":"6550:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90928,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90899,"src":"6555:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":90929,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90901,"src":"6564:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":90923,"name":"finalizeBridgeERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111367,"src":"6503:19:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes calldata)"}},"id":90930,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6503:72:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90931,"nodeType":"ExpressionStatement","src":"6503:72:149"}]},"id":90933,"nodeType":"IfStatement","src":"6337:249:149","trueBody":{"id":90922,"nodeType":"Block","src":"6408:75:149","statements":[{"expression":{"arguments":[{"id":90916,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90895,"src":"6440:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90917,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90897,"src":"6447:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90918,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90899,"src":"6452:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":90919,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90901,"src":"6461:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":90915,"name":"finalizeBridgeETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111287,"src":"6422:17:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes calldata)"}},"id":90920,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6422:50:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90921,"nodeType":"ExpressionStatement","src":"6422:50:149"}]}}]},"documentation":{"id":90889,"nodeType":"StructuredDocumentation","src":"5516:566:149","text":"@custom:legacy\n @notice Finalizes a deposit from L1 to L2. To finalize a deposit of ether, use address(0)\n and the l1Token and the Legacy ERC20 ether predeploy address as the l2Token.\n @param _l1Token Address of the L1 token to deposit.\n @param _l2Token Address of the corresponding L2 token.\n @param _from Address of the depositor.\n @param _to Address of the recipient.\n @param _amount Amount of the tokens being deposited.\n @param _extraData Extra data attached to the deposit."},"functionSelector":"662a633a","implemented":true,"kind":"function","modifiers":[],"name":"finalizeDeposit","nameLocation":"6096:15:149","parameters":{"id":90902,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90891,"mutability":"mutable","name":"_l1Token","nameLocation":"6129:8:149","nodeType":"VariableDeclaration","scope":90935,"src":"6121:16:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90890,"name":"address","nodeType":"ElementaryTypeName","src":"6121:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90893,"mutability":"mutable","name":"_l2Token","nameLocation":"6155:8:149","nodeType":"VariableDeclaration","scope":90935,"src":"6147:16:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90892,"name":"address","nodeType":"ElementaryTypeName","src":"6147:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90895,"mutability":"mutable","name":"_from","nameLocation":"6181:5:149","nodeType":"VariableDeclaration","scope":90935,"src":"6173:13:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90894,"name":"address","nodeType":"ElementaryTypeName","src":"6173:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90897,"mutability":"mutable","name":"_to","nameLocation":"6204:3:149","nodeType":"VariableDeclaration","scope":90935,"src":"6196:11:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90896,"name":"address","nodeType":"ElementaryTypeName","src":"6196:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90899,"mutability":"mutable","name":"_amount","nameLocation":"6225:7:149","nodeType":"VariableDeclaration","scope":90935,"src":"6217:15:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90898,"name":"uint256","nodeType":"ElementaryTypeName","src":"6217:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":90901,"mutability":"mutable","name":"_extraData","nameLocation":"6257:10:149","nodeType":"VariableDeclaration","scope":90935,"src":"6242:25:149","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":90900,"name":"bytes","nodeType":"ElementaryTypeName","src":"6242:5:149","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6111:162:149"},"returnParameters":{"id":90903,"nodeType":"ParameterList","parameters":[],"src":"6327:0:149"},"scope":91146,"stateMutability":"payable","virtual":true,"visibility":"external"},{"id":90947,"nodeType":"FunctionDefinition","src":"6764:101:149","nodes":[],"body":{"id":90946,"nodeType":"Block","src":"6821:44:149","nodes":[],"statements":[{"expression":{"arguments":[{"id":90943,"name":"otherBridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110962,"src":"6846:11:149","typeDescriptions":{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_StandardBridge_$111675","typeString":"contract StandardBridge"}],"id":90942,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6838:7:149","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":90941,"name":"address","nodeType":"ElementaryTypeName","src":"6838:7:149","typeDescriptions":{}}},"id":90944,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6838:20:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":90940,"id":90945,"nodeType":"Return","src":"6831:27:149"}]},"documentation":{"id":90936,"nodeType":"StructuredDocumentation","src":"6598:161:149","text":"@custom:legacy\n @notice Retrieves the access of the corresponding L1 bridge contract.\n @return Address of the corresponding L1 bridge contract."},"functionSelector":"36c717c1","implemented":true,"kind":"function","modifiers":[],"name":"l1TokenBridge","nameLocation":"6773:13:149","parameters":{"id":90937,"nodeType":"ParameterList","parameters":[],"src":"6786:2:149"},"returnParameters":{"id":90940,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90939,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":90947,"src":"6812:7:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90938,"name":"address","nodeType":"ElementaryTypeName","src":"6812:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"6811:9:149"},"scope":91146,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":90997,"nodeType":"FunctionDefinition","src":"7372:554:149","nodes":[],"body":{"id":90996,"nodeType":"Block","src":"7585:341:149","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":90966,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":90963,"name":"_l2Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90950,"src":"7599:8:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":90964,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"7611:10:149","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":90965,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"LEGACY_ERC20_ETH","nodeType":"MemberAccess","referencedDeclaration":104047,"src":"7611:27:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7599:39:149","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":90994,"nodeType":"Block","src":"7736:184:149","statements":[{"assignments":[90977],"declarations":[{"constant":false,"id":90977,"mutability":"mutable","name":"l1Token","nameLocation":"7758:7:149","nodeType":"VariableDeclaration","scope":90994,"src":"7750:15:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90976,"name":"address","nodeType":"ElementaryTypeName","src":"7750:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":90983,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":90979,"name":"_l2Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90950,"src":"7790:8:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":90978,"name":"OptimismMintableERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109645,"src":"7768:21:149","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OptimismMintableERC20_$109645_$","typeString":"type(contract OptimismMintableERC20)"}},"id":90980,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7768:31:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_OptimismMintableERC20_$109645","typeString":"contract OptimismMintableERC20"}},"id":90981,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"l1Token","nodeType":"MemberAccess","referencedDeclaration":109607,"src":"7768:39:149","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":90982,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7768:41:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"7750:59:149"},{"expression":{"arguments":[{"id":90985,"name":"_l2Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90950,"src":"7844:8:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90986,"name":"l1Token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90977,"src":"7854:7:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90987,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90952,"src":"7863:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90988,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90954,"src":"7870:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90989,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90956,"src":"7875:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":90990,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90958,"src":"7884:12:149","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":90991,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90960,"src":"7898:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":90984,"name":"_initiateBridgeERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111517,"src":"7823:20:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,uint32,bytes memory)"}},"id":90992,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7823:86:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90993,"nodeType":"ExpressionStatement","src":"7823:86:149"}]},"id":90995,"nodeType":"IfStatement","src":"7595:325:149","trueBody":{"id":90975,"nodeType":"Block","src":"7640:90:149","statements":[{"expression":{"arguments":[{"id":90968,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90952,"src":"7673:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90969,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90954,"src":"7680:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":90970,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90956,"src":"7685:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":90971,"name":"_minGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90958,"src":"7694:12:149","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":90972,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90960,"src":"7708:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":90967,"name":"_initiateBridgeETH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111419,"src":"7654:18:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint32_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,uint32,bytes memory)"}},"id":90973,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7654:65:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":90974,"nodeType":"ExpressionStatement","src":"7654:65:149"}]}}]},"documentation":{"id":90948,"nodeType":"StructuredDocumentation","src":"6871:496:149","text":"@custom:legacy\n @notice Internal function to initiate a withdrawal from L2 to L1 to a target account on L1.\n @param _l2Token Address of the L2 token to withdraw.\n @param _from Address of the withdrawer.\n @param _to Recipient account on L1.\n @param _amount Amount of the L2 token to withdraw.\n @param _minGasLimit Minimum gas limit to use for the transaction.\n @param _extraData Extra data attached to the withdrawal."},"implemented":true,"kind":"function","modifiers":[],"name":"_initiateWithdrawal","nameLocation":"7381:19:149","parameters":{"id":90961,"nodeType":"ParameterList","parameters":[{"constant":false,"id":90950,"mutability":"mutable","name":"_l2Token","nameLocation":"7418:8:149","nodeType":"VariableDeclaration","scope":90997,"src":"7410:16:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90949,"name":"address","nodeType":"ElementaryTypeName","src":"7410:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90952,"mutability":"mutable","name":"_from","nameLocation":"7444:5:149","nodeType":"VariableDeclaration","scope":90997,"src":"7436:13:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90951,"name":"address","nodeType":"ElementaryTypeName","src":"7436:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90954,"mutability":"mutable","name":"_to","nameLocation":"7467:3:149","nodeType":"VariableDeclaration","scope":90997,"src":"7459:11:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90953,"name":"address","nodeType":"ElementaryTypeName","src":"7459:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":90956,"mutability":"mutable","name":"_amount","nameLocation":"7488:7:149","nodeType":"VariableDeclaration","scope":90997,"src":"7480:15:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":90955,"name":"uint256","nodeType":"ElementaryTypeName","src":"7480:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":90958,"mutability":"mutable","name":"_minGasLimit","nameLocation":"7512:12:149","nodeType":"VariableDeclaration","scope":90997,"src":"7505:19:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":90957,"name":"uint32","nodeType":"ElementaryTypeName","src":"7505:6:149","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":90960,"mutability":"mutable","name":"_extraData","nameLocation":"7547:10:149","nodeType":"VariableDeclaration","scope":90997,"src":"7534:23:149","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":90959,"name":"bytes","nodeType":"ElementaryTypeName","src":"7534:5:149","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"7400:163:149"},"returnParameters":{"id":90962,"nodeType":"ParameterList","parameters":[],"src":"7585:0:149"},"scope":91146,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":91033,"nodeType":"FunctionDefinition","src":"8154:366:149","nodes":[],"body":{"id":91032,"nodeType":"Block","src":"8333:187:149","nodes":[],"statements":[{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":91013,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8376:1:149","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":91012,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8368:7:149","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":91011,"name":"address","nodeType":"ElementaryTypeName","src":"8368:7:149","typeDescriptions":{}}},"id":91014,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8368:10:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":91015,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"8380:10:149","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":91016,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"LEGACY_ERC20_ETH","nodeType":"MemberAccess","referencedDeclaration":104047,"src":"8380:27:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91017,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91000,"src":"8409:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91018,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91002,"src":"8416:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91019,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91004,"src":"8421:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91020,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91006,"src":"8430:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":91010,"name":"WithdrawalInitiated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90757,"src":"8348:19:149","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":91021,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8348:93:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91022,"nodeType":"EmitStatement","src":"8343:98:149"},{"expression":{"arguments":[{"id":91026,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91000,"src":"8481:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91027,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91002,"src":"8488:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91028,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91004,"src":"8493:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91029,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91006,"src":"8502:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":91023,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"8451:5:149","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_L2StandardBridge_$91146_$","typeString":"type(contract super L2StandardBridge)"}},"id":91025,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_emitETHBridgeInitiated","nodeType":"MemberAccess","referencedDeclaration":111602,"src":"8451:29:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes memory)"}},"id":91030,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8451:62:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91031,"nodeType":"ExpressionStatement","src":"8451:62:149"}]},"baseFunctions":[111602],"documentation":{"id":90998,"nodeType":"StructuredDocumentation","src":"7932:217:149","text":"@notice Emits the legacy WithdrawalInitiated event followed by the ETHBridgeInitiated event.\n This is necessary for backwards compatibility with the legacy bridge.\n @inheritdoc StandardBridge"},"implemented":true,"kind":"function","modifiers":[],"name":"_emitETHBridgeInitiated","nameLocation":"8163:23:149","overrides":{"id":91008,"nodeType":"OverrideSpecifier","overrides":[],"src":"8320:8:149"},"parameters":{"id":91007,"nodeType":"ParameterList","parameters":[{"constant":false,"id":91000,"mutability":"mutable","name":"_from","nameLocation":"8204:5:149","nodeType":"VariableDeclaration","scope":91033,"src":"8196:13:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":90999,"name":"address","nodeType":"ElementaryTypeName","src":"8196:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91002,"mutability":"mutable","name":"_to","nameLocation":"8227:3:149","nodeType":"VariableDeclaration","scope":91033,"src":"8219:11:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91001,"name":"address","nodeType":"ElementaryTypeName","src":"8219:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91004,"mutability":"mutable","name":"_amount","nameLocation":"8248:7:149","nodeType":"VariableDeclaration","scope":91033,"src":"8240:15:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91003,"name":"uint256","nodeType":"ElementaryTypeName","src":"8240:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":91006,"mutability":"mutable","name":"_extraData","nameLocation":"8278:10:149","nodeType":"VariableDeclaration","scope":91033,"src":"8265:23:149","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":91005,"name":"bytes","nodeType":"ElementaryTypeName","src":"8265:5:149","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8186:108:149"},"returnParameters":{"id":91009,"nodeType":"ParameterList","parameters":[],"src":"8333:0:149"},"scope":91146,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":91069,"nodeType":"FunctionDefinition","src":"8745:363:149","nodes":[],"body":{"id":91068,"nodeType":"Block","src":"8924:184:149","nodes":[],"statements":[{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":91049,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8964:1:149","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":91048,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8956:7:149","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":91047,"name":"address","nodeType":"ElementaryTypeName","src":"8956:7:149","typeDescriptions":{}}},"id":91050,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8956:10:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":91051,"name":"Predeploys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104124,"src":"8968:10:149","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Predeploys_$104124_$","typeString":"type(library Predeploys)"}},"id":91052,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"LEGACY_ERC20_ETH","nodeType":"MemberAccess","referencedDeclaration":104047,"src":"8968:27:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91053,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91036,"src":"8997:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91054,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91038,"src":"9004:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91055,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91040,"src":"9009:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91056,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91042,"src":"9018:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":91046,"name":"DepositFinalized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90772,"src":"8939:16:149","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":91057,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8939:90:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91058,"nodeType":"EmitStatement","src":"8934:95:149"},{"expression":{"arguments":[{"id":91062,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91036,"src":"9069:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91063,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91038,"src":"9076:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91064,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91040,"src":"9081:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91065,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91042,"src":"9090:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":91059,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"9039:5:149","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_L2StandardBridge_$91146_$","typeString":"type(contract super L2StandardBridge)"}},"id":91061,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_emitETHBridgeFinalized","nodeType":"MemberAccess","referencedDeclaration":111622,"src":"9039:29:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes memory)"}},"id":91066,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9039:62:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91067,"nodeType":"ExpressionStatement","src":"9039:62:149"}]},"baseFunctions":[111622],"documentation":{"id":91034,"nodeType":"StructuredDocumentation","src":"8526:214:149","text":"@notice Emits the legacy DepositFinalized event followed by the ETHBridgeFinalized event.\n This is necessary for backwards compatibility with the legacy bridge.\n @inheritdoc StandardBridge"},"implemented":true,"kind":"function","modifiers":[],"name":"_emitETHBridgeFinalized","nameLocation":"8754:23:149","overrides":{"id":91044,"nodeType":"OverrideSpecifier","overrides":[],"src":"8911:8:149"},"parameters":{"id":91043,"nodeType":"ParameterList","parameters":[{"constant":false,"id":91036,"mutability":"mutable","name":"_from","nameLocation":"8795:5:149","nodeType":"VariableDeclaration","scope":91069,"src":"8787:13:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91035,"name":"address","nodeType":"ElementaryTypeName","src":"8787:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91038,"mutability":"mutable","name":"_to","nameLocation":"8818:3:149","nodeType":"VariableDeclaration","scope":91069,"src":"8810:11:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91037,"name":"address","nodeType":"ElementaryTypeName","src":"8810:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91040,"mutability":"mutable","name":"_amount","nameLocation":"8839:7:149","nodeType":"VariableDeclaration","scope":91069,"src":"8831:15:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91039,"name":"uint256","nodeType":"ElementaryTypeName","src":"8831:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":91042,"mutability":"mutable","name":"_extraData","nameLocation":"8869:10:149","nodeType":"VariableDeclaration","scope":91069,"src":"8856:23:149","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":91041,"name":"bytes","nodeType":"ElementaryTypeName","src":"8856:5:149","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8777:108:149"},"returnParameters":{"id":91045,"nodeType":"ParameterList","parameters":[],"src":"8924:0:149"},"scope":91146,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":91107,"nodeType":"FunctionDefinition","src":"9338:442:149","nodes":[],"body":{"id":91106,"nodeType":"Block","src":"9578:202:149","nodes":[],"statements":[{"eventCall":{"arguments":[{"id":91087,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91074,"src":"9613:12:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91088,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91072,"src":"9627:11:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91089,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91076,"src":"9640:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91090,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91078,"src":"9647:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91091,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91080,"src":"9652:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91092,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91082,"src":"9661:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":91086,"name":"WithdrawalInitiated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90757,"src":"9593:19:149","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":91093,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9593:79:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91094,"nodeType":"EmitStatement","src":"9588:84:149"},{"expression":{"arguments":[{"id":91098,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91072,"src":"9714:11:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91099,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91074,"src":"9727:12:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91100,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91076,"src":"9741:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91101,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91078,"src":"9748:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91102,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91080,"src":"9753:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91103,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91082,"src":"9762:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":91095,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"9682:5:149","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_L2StandardBridge_$91146_$","typeString":"type(contract super L2StandardBridge)"}},"id":91097,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_emitERC20BridgeInitiated","nodeType":"MemberAccess","referencedDeclaration":111648,"src":"9682:31:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":91104,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9682:91:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91105,"nodeType":"ExpressionStatement","src":"9682:91:149"}]},"baseFunctions":[111648],"documentation":{"id":91070,"nodeType":"StructuredDocumentation","src":"9114:219:149","text":"@notice Emits the legacy WithdrawalInitiated event followed by the ERC20BridgeInitiated\n event. This is necessary for backwards compatibility with the legacy bridge.\n @inheritdoc StandardBridge"},"implemented":true,"kind":"function","modifiers":[],"name":"_emitERC20BridgeInitiated","nameLocation":"9347:25:149","overrides":{"id":91084,"nodeType":"OverrideSpecifier","overrides":[],"src":"9565:8:149"},"parameters":{"id":91083,"nodeType":"ParameterList","parameters":[{"constant":false,"id":91072,"mutability":"mutable","name":"_localToken","nameLocation":"9390:11:149","nodeType":"VariableDeclaration","scope":91107,"src":"9382:19:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91071,"name":"address","nodeType":"ElementaryTypeName","src":"9382:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91074,"mutability":"mutable","name":"_remoteToken","nameLocation":"9419:12:149","nodeType":"VariableDeclaration","scope":91107,"src":"9411:20:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91073,"name":"address","nodeType":"ElementaryTypeName","src":"9411:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91076,"mutability":"mutable","name":"_from","nameLocation":"9449:5:149","nodeType":"VariableDeclaration","scope":91107,"src":"9441:13:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91075,"name":"address","nodeType":"ElementaryTypeName","src":"9441:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91078,"mutability":"mutable","name":"_to","nameLocation":"9472:3:149","nodeType":"VariableDeclaration","scope":91107,"src":"9464:11:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91077,"name":"address","nodeType":"ElementaryTypeName","src":"9464:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91080,"mutability":"mutable","name":"_amount","nameLocation":"9493:7:149","nodeType":"VariableDeclaration","scope":91107,"src":"9485:15:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91079,"name":"uint256","nodeType":"ElementaryTypeName","src":"9485:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":91082,"mutability":"mutable","name":"_extraData","nameLocation":"9523:10:149","nodeType":"VariableDeclaration","scope":91107,"src":"9510:23:149","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":91081,"name":"bytes","nodeType":"ElementaryTypeName","src":"9510:5:149","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9372:167:149"},"returnParameters":{"id":91085,"nodeType":"ParameterList","parameters":[],"src":"9578:0:149"},"scope":91146,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":91145,"nodeType":"FunctionDefinition","src":"10007:439:149","nodes":[],"body":{"id":91144,"nodeType":"Block","src":"10247:199:149","nodes":[],"statements":[{"eventCall":{"arguments":[{"id":91125,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91112,"src":"10279:12:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91126,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91110,"src":"10293:11:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91127,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91114,"src":"10306:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91128,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91116,"src":"10313:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91129,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91118,"src":"10318:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91130,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91120,"src":"10327:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":91124,"name":"DepositFinalized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90772,"src":"10262:16:149","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":91131,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10262:76:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91132,"nodeType":"EmitStatement","src":"10257:81:149"},{"expression":{"arguments":[{"id":91136,"name":"_localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91110,"src":"10380:11:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91137,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91112,"src":"10393:12:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91138,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91114,"src":"10407:5:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91139,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91116,"src":"10414:3:149","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91140,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91118,"src":"10419:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91141,"name":"_extraData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91120,"src":"10428:10:149","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":91133,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"10348:5:149","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_L2StandardBridge_$91146_$","typeString":"type(contract super L2StandardBridge)"}},"id":91135,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"_emitERC20BridgeFinalized","nodeType":"MemberAccess","referencedDeclaration":111674,"src":"10348:31:149","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,address,uint256,bytes memory)"}},"id":91142,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10348:91:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91143,"nodeType":"ExpressionStatement","src":"10348:91:149"}]},"baseFunctions":[111674],"documentation":{"id":91108,"nodeType":"StructuredDocumentation","src":"9786:216:149","text":"@notice Emits the legacy DepositFinalized event followed by the ERC20BridgeFinalized event.\n This is necessary for backwards compatibility with the legacy bridge.\n @inheritdoc StandardBridge"},"implemented":true,"kind":"function","modifiers":[],"name":"_emitERC20BridgeFinalized","nameLocation":"10016:25:149","overrides":{"id":91122,"nodeType":"OverrideSpecifier","overrides":[],"src":"10234:8:149"},"parameters":{"id":91121,"nodeType":"ParameterList","parameters":[{"constant":false,"id":91110,"mutability":"mutable","name":"_localToken","nameLocation":"10059:11:149","nodeType":"VariableDeclaration","scope":91145,"src":"10051:19:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91109,"name":"address","nodeType":"ElementaryTypeName","src":"10051:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91112,"mutability":"mutable","name":"_remoteToken","nameLocation":"10088:12:149","nodeType":"VariableDeclaration","scope":91145,"src":"10080:20:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91111,"name":"address","nodeType":"ElementaryTypeName","src":"10080:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91114,"mutability":"mutable","name":"_from","nameLocation":"10118:5:149","nodeType":"VariableDeclaration","scope":91145,"src":"10110:13:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91113,"name":"address","nodeType":"ElementaryTypeName","src":"10110:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91116,"mutability":"mutable","name":"_to","nameLocation":"10141:3:149","nodeType":"VariableDeclaration","scope":91145,"src":"10133:11:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91115,"name":"address","nodeType":"ElementaryTypeName","src":"10133:7:149","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91118,"mutability":"mutable","name":"_amount","nameLocation":"10162:7:149","nodeType":"VariableDeclaration","scope":91145,"src":"10154:15:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91117,"name":"uint256","nodeType":"ElementaryTypeName","src":"10154:7:149","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":91120,"mutability":"mutable","name":"_extraData","nameLocation":"10192:10:149","nodeType":"VariableDeclaration","scope":91145,"src":"10179:23:149","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":91119,"name":"bytes","nodeType":"ElementaryTypeName","src":"10179:5:149","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"10041:167:149"},"returnParameters":{"id":91123,"nodeType":"ParameterList","parameters":[],"src":"10247:0:149"},"scope":91146,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[{"baseName":{"id":90739,"name":"StandardBridge","nodeType":"IdentifierPath","referencedDeclaration":111675,"src":"1170:14:149"},"id":90740,"nodeType":"InheritanceSpecifier","src":"1170:14:149"},{"baseName":{"id":90741,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"1186:7:149"},"id":90742,"nodeType":"InheritanceSpecifier","src":"1186:7:149"}],"canonicalName":"L2StandardBridge","contractDependencies":[],"contractKind":"contract","documentation":{"id":90738,"nodeType":"StructuredDocumentation","src":"454:687:149","text":"@custom:proxied\n @custom:predeploy 0x4200000000000000000000000000000000000010\n @title L2StandardBridge\n @notice The L2StandardBridge is responsible for transfering ETH and ERC20 tokens between L1 and\n L2. In the case that an ERC20 token is native to L2, it will be escrowed within this\n contract. If the ERC20 token is native to L1, it will be burnt.\n NOTE: this contract is not intended to support all variations of ERC20 tokens. Examples\n of some token types that may not be properly supported by this contract include, but are\n not limited to: tokens with transfer fees, rebasing tokens, and tokens with blocklists."},"fullyImplemented":true,"linearizedBaseContracts":[91146,109417,111675,49678],"name":"L2StandardBridge","nameLocation":"1150:16:149","scope":91147,"usedErrors":[]}],"license":"MIT"},"id":149} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/L2ToL1MessagePasser.json b/packages/sdk/src/forge-artifacts/L2ToL1MessagePasser.json new file mode 100644 index 000000000000..f7ed43e765c9 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/L2ToL1MessagePasser.json @@ -0,0 +1 @@ +{"abi":[{"type":"receive","stateMutability":"payable"},{"type":"function","name":"MESSAGE_VERSION","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"burn","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initiateWithdrawal","inputs":[{"name":"_target","type":"address","internalType":"address"},{"name":"_gasLimit","type":"uint256","internalType":"uint256"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"messageNonce","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"sentMessages","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"MessagePassed","inputs":[{"name":"nonce","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"target","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"gasLimit","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"data","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"withdrawalHash","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"WithdrawerBalanceBurnt","inputs":[{"name":"amount","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false}],"bytecode":{"object":"0x608060405234801561001057600080fd5b506106d3806100206000396000f3fe6080604052600436106100695760003560e01c806382e3702d1161004357806382e3702d1461012a578063c2b3e5ac1461016a578063ecc704281461017d57600080fd5b80633f827a5a1461009257806344df8e70146100bf57806354fd4d50146100d457600080fd5b3661008d5761008b33620186a0604051806020016040528060008152506101e2565b005b600080fd5b34801561009e57600080fd5b506100a7600181565b60405161ffff90911681526020015b60405180910390f35b3480156100cb57600080fd5b5061008b6103a6565b3480156100e057600080fd5b5061011d6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b691906104d1565b34801561013657600080fd5b5061015a6101453660046104eb565b60006020819052908152604090205460ff1681565b60405190151581526020016100b6565b61008b610178366004610533565b6101e2565b34801561018957600080fd5b506101d46001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016100b6565b60006102786040518060c0016040528061023c6001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b815233602082015273ffffffffffffffffffffffffffffffffffffffff871660408201523460608201526080810186905260a0018490526103de565b600081815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055905073ffffffffffffffffffffffffffffffffffffffff8416336103136001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b7f02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054348787876040516103489493929190610637565b60405180910390a45050600180547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082168301167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b476103b08161042b565b60405181907f7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f90600090a250565b80516020808301516040808501516060860151608087015160a0880151935160009761040e979096959101610667565b604051602081830303815290604052805190602001209050919050565b806040516104389061045a565b6040518091039082f0905080158015610455573d6000803e3d6000fd5b505050565b6008806106bf83390190565b6000815180845260005b8181101561048c57602081850181015186830182015201610470565b8181111561049e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104e46020830184610466565b9392505050565b6000602082840312156104fd57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060006060848603121561054857600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461056c57600080fd5b925060208401359150604084013567ffffffffffffffff8082111561059057600080fd5b818601915086601f8301126105a457600080fd5b8135818111156105b6576105b6610504565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156105fc576105fc610504565b8160405282815289602084870101111561061557600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b8481528360208201526080604082015260006106566080830185610466565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526106b260c0830184610466565b9897505050505050505056fe608060405230fffea164736f6c634300080f000a","sourceMap":"722:3696:150:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106100695760003560e01c806382e3702d1161004357806382e3702d1461012a578063c2b3e5ac1461016a578063ecc704281461017d57600080fd5b80633f827a5a1461009257806344df8e70146100bf57806354fd4d50146100d457600080fd5b3661008d5761008b33620186a0604051806020016040528060008152506101e2565b005b600080fd5b34801561009e57600080fd5b506100a7600181565b60405161ffff90911681526020015b60405180910390f35b3480156100cb57600080fd5b5061008b6103a6565b3480156100e057600080fd5b5061011d6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b691906104d1565b34801561013657600080fd5b5061015a6101453660046104eb565b60006020819052908152604090205460ff1681565b60405190151581526020016100b6565b61008b610178366004610533565b6101e2565b34801561018957600080fd5b506101d46001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016100b6565b60006102786040518060c0016040528061023c6001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b815233602082015273ffffffffffffffffffffffffffffffffffffffff871660408201523460608201526080810186905260a0018490526103de565b600081815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055905073ffffffffffffffffffffffffffffffffffffffff8416336103136001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b7f02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054348787876040516103489493929190610637565b60405180910390a45050600180547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082168301167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b476103b08161042b565b60405181907f7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f90600090a250565b80516020808301516040808501516060860151608087015160a0880151935160009761040e979096959101610667565b604051602081830303815290604052805190602001209050919050565b806040516104389061045a565b6040518091039082f0905080158015610455573d6000803e3d6000fd5b505050565b6008806106bf83390190565b6000815180845260005b8181101561048c57602081850181015186830182015201610470565b8181111561049e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104e46020830184610466565b9392505050565b6000602082840312156104fd57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060006060848603121561054857600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461056c57600080fd5b925060208401359150604084013567ffffffffffffffff8082111561059057600080fd5b818601915086601f8301126105a457600080fd5b8135818111156105b6576105b6610504565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156105fc576105fc610504565b8160405282815289602084870101111561061557600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b8481528360208201526080604082015260006106566080830185610466565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526106b260c0830184610466565b9897505050505050505056fe608060405230fffea164736f6c634300080f000a","sourceMap":"722:3696:150:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2474:68;2493:10;911:7;2532:9;;;;;;;;;;;;2474:18;:68::i;:::-;722:3696;;;;;981:42;;;;;;;;;;;;1022:1;981:42;;;;;188:6:357;176:19;;;158:38;;146:2;131:18;981:42:150;;;;;;;;2915:154;;;;;;;;;;;;;:::i;2307:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1094:44::-;;;;;;;;;;-1:-1:-1;1094:44:150;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;1318:14:357;;1311:22;1293:41;;1281:2;1266:18;1094:44:150;1153:187:357;3311:650:150;;;;;;:::i;:::-;;:::i;4282:134::-;;;;;;;;;;;;4383:8;;;;4855:18:195;4852:30;;4282:134:150;;;;2930:25:357;;;2918:2;2903:18;4282:134:150;2784:177:357;3311:650:150;3420:22;3445:297;3481:251;;;;;;;;3534:14;4383:8;;;;4855:18:195;4852:30;;4282:134:150;3534:14;3481:251;;3574:10;3481:251;;;;;;;;;;;3642:9;3481:251;;;;;;;;;;;;;;;3445:22;:297::i;:::-;3753:12;:28;;;;;;;;;;:35;;;;3784:4;3753:35;;;3420:322;-1:-1:-1;3804:95:150;;;3834:10;3818:14;4383:8;;;;4855:18:195;4852:30;;4282:134:150;3818:14;3804:95;3855:9;3866;3877:5;3884:14;3804:95;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;3936:8:150;3934:10;;;;;;;;;;;;;;;;-1:-1:-1;;3311:650:150:o;2915:154::-;2968:21;2999:17;2968:21;2999:8;:17::i;:::-;3031:31;;3054:7;;3031:31;;;;;2940:129;2915:154::o;4456:211:196:-;4590:9;;4601:10;;;;;4613;;;;;4625:9;;;;4636:12;;;;4650:8;;;;4579:80;;4543:7;;4579:80;;4590:9;;4601:10;4650:8;4579:80;;:::i;:::-;;;;;;;;;;;;;4569:91;;;;;;4562:98;;4456:211;;;:::o;224:86:190:-;292:7;273:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;224:86;:::o;-1:-1:-1:-;;;;;;;;:::o;207:531:357:-;249:3;287:5;281:12;314:6;309:3;302:19;339:1;349:162;363:6;360:1;357:13;349:162;;;425:4;481:13;;;477:22;;471:29;453:11;;;449:20;;442:59;378:12;349:162;;;529:6;526:1;523:13;520:87;;;595:1;588:4;579:6;574:3;570:16;566:27;559:38;520:87;-1:-1:-1;652:2:357;640:15;657:66;636:88;627:98;;;;727:4;623:109;;207:531;-1:-1:-1;;207:531:357:o;743:220::-;892:2;881:9;874:21;855:4;912:45;953:2;942:9;938:18;930:6;912:45;:::i;:::-;904:53;743:220;-1:-1:-1;;;743:220:357:o;968:180::-;1027:6;1080:2;1068:9;1059:7;1055:23;1051:32;1048:52;;;1096:1;1093;1086:12;1048:52;-1:-1:-1;1119:23:357;;968:180;-1:-1:-1;968:180:357:o;1345:184::-;1397:77;1394:1;1387:88;1494:4;1491:1;1484:15;1518:4;1515:1;1508:15;1534:1245;1620:6;1628;1636;1689:2;1677:9;1668:7;1664:23;1660:32;1657:52;;;1705:1;1702;1695:12;1657:52;1744:9;1731:23;1794:42;1787:5;1783:54;1776:5;1773:65;1763:93;;1852:1;1849;1842:12;1763:93;1875:5;-1:-1:-1;1927:2:357;1912:18;;1899:32;;-1:-1:-1;1982:2:357;1967:18;;1954:32;2005:18;2035:14;;;2032:34;;;2062:1;2059;2052:12;2032:34;2100:6;2089:9;2085:22;2075:32;;2145:7;2138:4;2134:2;2130:13;2126:27;2116:55;;2167:1;2164;2157:12;2116:55;2203:2;2190:16;2225:2;2221;2218:10;2215:36;;;2231:18;;:::i;:::-;2365:2;2359:9;2427:4;2419:13;;2270:66;2415:22;;;2439:2;2411:31;2407:40;2395:53;;;2463:18;;;2483:22;;;2460:46;2457:72;;;2509:18;;:::i;:::-;2549:10;2545:2;2538:22;2584:2;2576:6;2569:18;2624:7;2619:2;2614;2610;2606:11;2602:20;2599:33;2596:53;;;2645:1;2642;2635:12;2596:53;2701:2;2696;2692;2688:11;2683:2;2675:6;2671:15;2658:46;2746:1;2741:2;2736;2728:6;2724:15;2720:24;2713:35;2767:6;2757:16;;;;;;;1534:1245;;;;;:::o;2966:433::-;3197:6;3186:9;3179:25;3240:6;3235:2;3224:9;3220:18;3213:34;3283:3;3278:2;3267:9;3263:18;3256:31;3160:4;3304:46;3345:3;3334:9;3330:19;3322:6;3304:46;:::i;:::-;3296:54;;3386:6;3381:2;3370:9;3366:18;3359:34;2966:433;;;;;;;:::o;3404:656::-;3691:6;3680:9;3673:25;3654:4;3717:42;3807:2;3799:6;3795:15;3790:2;3779:9;3775:18;3768:43;3859:2;3851:6;3847:15;3842:2;3831:9;3827:18;3820:43;;3899:6;3894:2;3883:9;3879:18;3872:34;3943:6;3937:3;3926:9;3922:19;3915:35;3987:3;3981;3970:9;3966:19;3959:32;4008:46;4049:3;4038:9;4034:19;4026:6;4008:46;:::i;:::-;4000:54;3404:656;-1:-1:-1;;;;;;;;3404:656:357:o","linkReferences":{}},"methodIdentifiers":{"MESSAGE_VERSION()":"3f827a5a","burn()":"44df8e70","initiateWithdrawal(address,uint256,bytes)":"c2b3e5ac","messageNonce()":"ecc70428","sentMessages(bytes32)":"82e3702d","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"}],\"name\":\"MessagePassed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawerBalanceBurnt\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MESSAGE_VERSION\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"initiateWithdrawal\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"sentMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"custom:proxied\":\"@custom:predeploy 0x4200000000000000000000000000000000000016\",\"events\":{\"MessagePassed(uint256,address,address,uint256,uint256,bytes,bytes32)\":{\"params\":{\"data\":\"The data to be forwarded to the target on L1.\",\"gasLimit\":\"The minimum amount of gas that must be provided when withdrawing.\",\"nonce\":\"Unique value corresponding to each withdrawal.\",\"sender\":\"The L2 account address which initiated the withdrawal.\",\"target\":\"The L1 account address the call will be send to.\",\"value\":\"The ETH value submitted for withdrawal, to be forwarded to the target.\",\"withdrawalHash\":\"The hash of the withdrawal.\"}},\"WithdrawerBalanceBurnt(uint256)\":{\"params\":{\"amount\":\"Amount of ETh that was burned.\"}}},\"kind\":\"dev\",\"methods\":{\"initiateWithdrawal(address,uint256,bytes)\":{\"params\":{\"_data\":\"Data to forward to L1 target.\",\"_gasLimit\":\"Minimum gas limit for executing the message on L1.\",\"_target\":\"Address to call on L1 execution.\"}},\"messageNonce()\":{\"returns\":{\"_0\":\"Nonce of the next message to be sent, with added message version.\"}}},\"stateVariables\":{\"version\":{\"custom:semver\":\"1.1.0\"}},\"title\":\"L2ToL1MessagePasser\",\"version\":1},\"userdoc\":{\"events\":{\"MessagePassed(uint256,address,address,uint256,uint256,bytes,bytes32)\":{\"notice\":\"Emitted any time a withdrawal is initiated.\"},\"WithdrawerBalanceBurnt(uint256)\":{\"notice\":\"Emitted when the balance of this contract is burned.\"}},\"kind\":\"user\",\"methods\":{\"MESSAGE_VERSION()\":{\"notice\":\"The current message version identifier.\"},\"burn()\":{\"notice\":\"Removes all ETH held by this contract from the state. Used to prevent the amount of ETH on L2 inflating when ETH is withdrawn. Currently only way to do this is to create a contract and self-destruct it to itself. Anyone can call this function. Not incentivized since this function is very cheap.\"},\"initiateWithdrawal(address,uint256,bytes)\":{\"notice\":\"Sends a message from L2 to L1.\"},\"messageNonce()\":{\"notice\":\"Retrieves the next message nonce. Message version will be added to the upper two bytes of the message nonce. Message version allows us to treat messages as having different structures.\"},\"sentMessages(bytes32)\":{\"notice\":\"Includes the message hashes for all withdrawals\"}},\"notice\":\"The L2ToL1MessagePasser is a dedicated contract where messages that are being sent from L2 to L1 can be stored. The storage root of this contract is pulled up to the top level of the L2 output to reduce the cost of proving the existence of sent messages.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L2/L2ToL1MessagePasser.sol\":\"L2ToL1MessagePasser\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"src/L2/L2ToL1MessagePasser.sol\":{\"keccak256\":\"0x67f440defc45e97bf1494274a9061876cbdcb10625707c534a0cb04b1c057e21\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://47900ccfcd1e4506d50dd3b14069da285eeb5f783020a0c74f58181b4c011460\",\"dweb:/ipfs/QmNUtEAxiwXT8QDbCHsX3uT4h2fh6k9f8LvMrmRK2N7K61\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff\",\"dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA\"]},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12\",\"dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b\",\"dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true},{"internalType":"address","name":"target","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false},{"internalType":"uint256","name":"gasLimit","type":"uint256","indexed":false},{"internalType":"bytes","name":"data","type":"bytes","indexed":false},{"internalType":"bytes32","name":"withdrawalHash","type":"bytes32","indexed":false}],"type":"event","name":"MessagePassed","anonymous":false},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256","indexed":true}],"type":"event","name":"WithdrawerBalanceBurnt","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MESSAGE_VERSION","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"burn"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_gasLimit","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"initiateWithdrawal"},{"inputs":[],"stateMutability":"view","type":"function","name":"messageNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"sentMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"initiateWithdrawal(address,uint256,bytes)":{"params":{"_data":"Data to forward to L1 target.","_gasLimit":"Minimum gas limit for executing the message on L1.","_target":"Address to call on L1 execution."}},"messageNonce()":{"returns":{"_0":"Nonce of the next message to be sent, with added message version."}}},"version":1},"userdoc":{"kind":"user","methods":{"MESSAGE_VERSION()":{"notice":"The current message version identifier."},"burn()":{"notice":"Removes all ETH held by this contract from the state. Used to prevent the amount of ETH on L2 inflating when ETH is withdrawn. Currently only way to do this is to create a contract and self-destruct it to itself. Anyone can call this function. Not incentivized since this function is very cheap."},"initiateWithdrawal(address,uint256,bytes)":{"notice":"Sends a message from L2 to L1."},"messageNonce()":{"notice":"Retrieves the next message nonce. Message version will be added to the upper two bytes of the message nonce. Message version allows us to treat messages as having different structures."},"sentMessages(bytes32)":{"notice":"Includes the message hashes for all withdrawals"}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L2/L2ToL1MessagePasser.sol":"L2ToL1MessagePasser"},"evmVersion":"london","libraries":{}},"sources":{"src/L2/L2ToL1MessagePasser.sol":{"keccak256":"0x67f440defc45e97bf1494274a9061876cbdcb10625707c534a0cb04b1c057e21","urls":["bzz-raw://47900ccfcd1e4506d50dd3b14069da285eeb5f783020a0c74f58181b4c011460","dweb:/ipfs/QmNUtEAxiwXT8QDbCHsX3uT4h2fh6k9f8LvMrmRK2N7K61"],"license":"MIT"},"src/libraries/Burn.sol":{"keccak256":"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010","urls":["bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f","dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"],"license":"MIT"},"src/libraries/Encoding.sol":{"keccak256":"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87","urls":["bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff","dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA"],"license":"MIT"},"src/libraries/Hashing.sol":{"keccak256":"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8","urls":["bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12","dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF"],"license":"MIT"},"src/libraries/Types.sol":{"keccak256":"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4","urls":["bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e","dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"],"license":"MIT"},"src/libraries/rlp/RLPWriter.sol":{"keccak256":"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6","urls":["bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b","dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":91174,"contract":"src/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser","label":"sentMessages","offset":0,"slot":"0","type":"t_mapping(t_bytes32,t_bool)"},{"astId":91177,"contract":"src/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser","label":"msgNonce","offset":0,"slot":"1","type":"t_uint240"}],"types":{"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_mapping(t_bytes32,t_bool)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => bool)","numberOfBytes":"32","value":"t_bool"},"t_uint240":{"encoding":"inplace","label":"uint240","numberOfBytes":"30"}}},"userdoc":{"version":1,"kind":"user","methods":{"MESSAGE_VERSION()":{"notice":"The current message version identifier."},"burn()":{"notice":"Removes all ETH held by this contract from the state. Used to prevent the amount of ETH on L2 inflating when ETH is withdrawn. Currently only way to do this is to create a contract and self-destruct it to itself. Anyone can call this function. Not incentivized since this function is very cheap."},"initiateWithdrawal(address,uint256,bytes)":{"notice":"Sends a message from L2 to L1."},"messageNonce()":{"notice":"Retrieves the next message nonce. Message version will be added to the upper two bytes of the message nonce. Message version allows us to treat messages as having different structures."},"sentMessages(bytes32)":{"notice":"Includes the message hashes for all withdrawals"}},"events":{"MessagePassed(uint256,address,address,uint256,uint256,bytes,bytes32)":{"notice":"Emitted any time a withdrawal is initiated."},"WithdrawerBalanceBurnt(uint256)":{"notice":"Emitted when the balance of this contract is burned."}},"notice":"The L2ToL1MessagePasser is a dedicated contract where messages that are being sent from L2 to L1 can be stored. The storage root of this contract is pulled up to the top level of the L2 output to reduce the cost of proving the existence of sent messages."},"devdoc":{"version":1,"kind":"dev","methods":{"initiateWithdrawal(address,uint256,bytes)":{"params":{"_data":"Data to forward to L1 target.","_gasLimit":"Minimum gas limit for executing the message on L1.","_target":"Address to call on L1 execution."}},"messageNonce()":{"returns":{"_0":"Nonce of the next message to be sent, with added message version."}}},"events":{"MessagePassed(uint256,address,address,uint256,uint256,bytes,bytes32)":{"params":{"data":"The data to be forwarded to the target on L1.","gasLimit":"The minimum amount of gas that must be provided when withdrawing.","nonce":"Unique value corresponding to each withdrawal.","sender":"The L2 account address which initiated the withdrawal.","target":"The L1 account address the call will be send to.","value":"The ETH value submitted for withdrawal, to be forwarded to the target.","withdrawalHash":"The hash of the withdrawal."}},"WithdrawerBalanceBurnt(uint256)":{"params":{"amount":"Amount of ETh that was burned."}}},"title":"L2ToL1MessagePasser"},"ast":{"absolutePath":"src/L2/L2ToL1MessagePasser.sol","id":91308,"exportedSymbols":{"Burn":[102909],"Encoding":[103714],"Hashing":[103936],"ISemver":[109417],"L2ToL1MessagePasser":[91307],"Types":[104349]},"nodeType":"SourceUnit","src":"32:4387:150","nodes":[{"id":91148,"nodeType":"PragmaDirective","src":"32:23:150","nodes":[],"literals":["solidity","0.8",".15"]},{"id":91150,"nodeType":"ImportDirective","src":"57:48:150","nodes":[],"absolutePath":"src/libraries/Types.sol","file":"src/libraries/Types.sol","nameLocation":"-1:-1:-1","scope":91308,"sourceUnit":104350,"symbolAliases":[{"foreign":{"id":91149,"name":"Types","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104349,"src":"66:5:150","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":91152,"nodeType":"ImportDirective","src":"106:52:150","nodes":[],"absolutePath":"src/libraries/Hashing.sol","file":"src/libraries/Hashing.sol","nameLocation":"-1:-1:-1","scope":91308,"sourceUnit":103937,"symbolAliases":[{"foreign":{"id":91151,"name":"Hashing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103936,"src":"115:7:150","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":91154,"nodeType":"ImportDirective","src":"159:54:150","nodes":[],"absolutePath":"src/libraries/Encoding.sol","file":"src/libraries/Encoding.sol","nameLocation":"-1:-1:-1","scope":91308,"sourceUnit":103715,"symbolAliases":[{"foreign":{"id":91153,"name":"Encoding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103714,"src":"168:8:150","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":91156,"nodeType":"ImportDirective","src":"214:46:150","nodes":[],"absolutePath":"src/libraries/Burn.sol","file":"src/libraries/Burn.sol","nameLocation":"-1:-1:-1","scope":91308,"sourceUnit":102926,"symbolAliases":[{"foreign":{"id":91155,"name":"Burn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":102909,"src":"223:4:150","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":91158,"nodeType":"ImportDirective","src":"261:52:150","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":91308,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":91157,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"270:7:150","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":91307,"nodeType":"ContractDefinition","src":"722:3696:150","nodes":[{"id":91165,"nodeType":"VariableDeclaration","src":"857:61:150","nodes":[],"constant":true,"documentation":{"id":91162,"nodeType":"StructuredDocumentation","src":"768:84:150","text":"@notice The L1 gas limit set when eth is withdrawn using the receive() function."},"mutability":"constant","name":"RECEIVE_DEFAULT_GAS_LIMIT","nameLocation":"883:25:150","scope":91307,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91163,"name":"uint256","nodeType":"ElementaryTypeName","src":"857:7:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"3130305f303030","id":91164,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"911:7:150","typeDescriptions":{"typeIdentifier":"t_rational_100000_by_1","typeString":"int_const 100000"},"value":"100_000"},"visibility":"internal"},{"id":91169,"nodeType":"VariableDeclaration","src":"981:42:150","nodes":[],"constant":true,"documentation":{"id":91166,"nodeType":"StructuredDocumentation","src":"925:51:150","text":"@notice The current message version identifier."},"functionSelector":"3f827a5a","mutability":"constant","name":"MESSAGE_VERSION","nameLocation":"1004:15:150","scope":91307,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"},"typeName":{"id":91167,"name":"uint16","nodeType":"ElementaryTypeName","src":"981:6:150","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"value":{"hexValue":"31","id":91168,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1022:1:150","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"visibility":"public"},{"id":91174,"nodeType":"VariableDeclaration","src":"1094:44:150","nodes":[],"constant":false,"documentation":{"id":91170,"nodeType":"StructuredDocumentation","src":"1030:59:150","text":"@notice Includes the message hashes for all withdrawals"},"functionSelector":"82e3702d","mutability":"mutable","name":"sentMessages","nameLocation":"1126:12:150","scope":91307,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"},"typeName":{"id":91173,"keyType":{"id":91171,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1102:7:150","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"1094:24:150","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"},"valueType":{"id":91172,"name":"bool","nodeType":"ElementaryTypeName","src":"1113:4:150","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}},"visibility":"public"},{"id":91177,"nodeType":"VariableDeclaration","src":"1205:25:150","nodes":[],"constant":false,"documentation":{"id":91175,"nodeType":"StructuredDocumentation","src":"1145:55:150","text":"@notice A unique value hashed with each withdrawal."},"mutability":"mutable","name":"msgNonce","nameLocation":"1222:8:150","scope":91307,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint240","typeString":"uint240"},"typeName":{"id":91176,"name":"uint240","nodeType":"ElementaryTypeName","src":"1205:7:150","typeDescriptions":{"typeIdentifier":"t_uint240","typeString":"uint240"}},"visibility":"internal"},{"id":91194,"nodeType":"EventDefinition","src":"1869:222:150","nodes":[],"anonymous":false,"documentation":{"id":91178,"nodeType":"StructuredDocumentation","src":"1237:627:150","text":"@notice Emitted any time a withdrawal is initiated.\n @param nonce Unique value corresponding to each withdrawal.\n @param sender The L2 account address which initiated the withdrawal.\n @param target The L1 account address the call will be send to.\n @param value The ETH value submitted for withdrawal, to be forwarded to the target.\n @param gasLimit The minimum amount of gas that must be provided when withdrawing.\n @param data The data to be forwarded to the target on L1.\n @param withdrawalHash The hash of the withdrawal."},"eventSelector":"02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054","name":"MessagePassed","nameLocation":"1875:13:150","parameters":{"id":91193,"nodeType":"ParameterList","parameters":[{"constant":false,"id":91180,"indexed":true,"mutability":"mutable","name":"nonce","nameLocation":"1914:5:150","nodeType":"VariableDeclaration","scope":91194,"src":"1898:21:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91179,"name":"uint256","nodeType":"ElementaryTypeName","src":"1898:7:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":91182,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"1945:6:150","nodeType":"VariableDeclaration","scope":91194,"src":"1929:22:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91181,"name":"address","nodeType":"ElementaryTypeName","src":"1929:7:150","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91184,"indexed":true,"mutability":"mutable","name":"target","nameLocation":"1977:6:150","nodeType":"VariableDeclaration","scope":91194,"src":"1961:22:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91183,"name":"address","nodeType":"ElementaryTypeName","src":"1961:7:150","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91186,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"2001:5:150","nodeType":"VariableDeclaration","scope":91194,"src":"1993:13:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91185,"name":"uint256","nodeType":"ElementaryTypeName","src":"1993:7:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":91188,"indexed":false,"mutability":"mutable","name":"gasLimit","nameLocation":"2024:8:150","nodeType":"VariableDeclaration","scope":91194,"src":"2016:16:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91187,"name":"uint256","nodeType":"ElementaryTypeName","src":"2016:7:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":91190,"indexed":false,"mutability":"mutable","name":"data","nameLocation":"2048:4:150","nodeType":"VariableDeclaration","scope":91194,"src":"2042:10:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":91189,"name":"bytes","nodeType":"ElementaryTypeName","src":"2042:5:150","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":91192,"indexed":false,"mutability":"mutable","name":"withdrawalHash","nameLocation":"2070:14:150","nodeType":"VariableDeclaration","scope":91194,"src":"2062:22:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":91191,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2062:7:150","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1888:202:150"}},{"id":91199,"nodeType":"EventDefinition","src":"2219:53:150","nodes":[],"anonymous":false,"documentation":{"id":91195,"nodeType":"StructuredDocumentation","src":"2097:117:150","text":"@notice Emitted when the balance of this contract is burned.\n @param amount Amount of ETh that was burned."},"eventSelector":"7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f","name":"WithdrawerBalanceBurnt","nameLocation":"2225:22:150","parameters":{"id":91198,"nodeType":"ParameterList","parameters":[{"constant":false,"id":91197,"indexed":true,"mutability":"mutable","name":"amount","nameLocation":"2264:6:150","nodeType":"VariableDeclaration","scope":91199,"src":"2248:22:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91196,"name":"uint256","nodeType":"ElementaryTypeName","src":"2248:7:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2247:24:150"}},{"id":91203,"nodeType":"VariableDeclaration","src":"2307:40:150","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":91200,"nodeType":"StructuredDocumentation","src":"2278:24:150","text":"@custom:semver 1.1.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"2330:7:150","scope":91307,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":91201,"name":"string","nodeType":"ElementaryTypeName","src":"2307:6:150","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"312e312e30","id":91202,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2340:7:150","typeDescriptions":{"typeIdentifier":"t_stringliteral_6815ba53416ba06aff1932cc76b3832272bafab9bc8e066be382e32b06ba5546","typeString":"literal_string \"1.1.0\""},"value":"1.1.0"},"visibility":"public"},{"id":91218,"nodeType":"FunctionDefinition","src":"2437:112:150","nodes":[],"body":{"id":91217,"nodeType":"Block","src":"2464:85:150","nodes":[],"statements":[{"expression":{"arguments":[{"expression":{"id":91208,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2493:3:150","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":91209,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2493:10:150","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91210,"name":"RECEIVE_DEFAULT_GAS_LIMIT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91165,"src":"2505:25:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"hexValue":"","id":91213,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2538:2:150","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":91212,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2532:5:150","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":91211,"name":"bytes","nodeType":"ElementaryTypeName","src":"2532:5:150","typeDescriptions":{}}},"id":91214,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2532:9:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":91207,"name":"initiateWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91293,"src":"2474:18:150","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,uint256,bytes memory)"}},"id":91215,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2474:68:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91216,"nodeType":"ExpressionStatement","src":"2474:68:150"}]},"documentation":{"id":91204,"nodeType":"StructuredDocumentation","src":"2354:78:150","text":"@notice Allows users to withdraw ETH by sending directly to this contract."},"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":91205,"nodeType":"ParameterList","parameters":[],"src":"2444:2:150"},"returnParameters":{"id":91206,"nodeType":"ParameterList","parameters":[],"src":"2464:0:150"},"scope":91307,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":91241,"nodeType":"FunctionDefinition","src":"2915:154:150","nodes":[],"body":{"id":91240,"nodeType":"Block","src":"2940:129:150","nodes":[],"statements":[{"assignments":[91223],"declarations":[{"constant":false,"id":91223,"mutability":"mutable","name":"balance","nameLocation":"2958:7:150","nodeType":"VariableDeclaration","scope":91240,"src":"2950:15:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91222,"name":"uint256","nodeType":"ElementaryTypeName","src":"2950:7:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":91229,"initialValue":{"expression":{"arguments":[{"id":91226,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2976:4:150","typeDescriptions":{"typeIdentifier":"t_contract$_L2ToL1MessagePasser_$91307","typeString":"contract L2ToL1MessagePasser"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_L2ToL1MessagePasser_$91307","typeString":"contract L2ToL1MessagePasser"}],"id":91225,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2968:7:150","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":91224,"name":"address","nodeType":"ElementaryTypeName","src":"2968:7:150","typeDescriptions":{}}},"id":91227,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2968:13:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":91228,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"balance","nodeType":"MemberAccess","src":"2968:21:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2950:39:150"},{"expression":{"arguments":[{"id":91233,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91223,"src":"3008:7:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":91230,"name":"Burn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":102909,"src":"2999:4:150","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Burn_$102909_$","typeString":"type(library Burn)"}},"id":91232,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"eth","nodeType":"MemberAccess","referencedDeclaration":102881,"src":"2999:8:150","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$returns$__$","typeString":"function (uint256)"}},"id":91234,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2999:17:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91235,"nodeType":"ExpressionStatement","src":"2999:17:150"},{"eventCall":{"arguments":[{"id":91237,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91223,"src":"3054:7:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":91236,"name":"WithdrawerBalanceBurnt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91199,"src":"3031:22:150","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint256_$returns$__$","typeString":"function (uint256)"}},"id":91238,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3031:31:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91239,"nodeType":"EmitStatement","src":"3026:36:150"}]},"documentation":{"id":91219,"nodeType":"StructuredDocumentation","src":"2555:355:150","text":"@notice Removes all ETH held by this contract from the state. Used to prevent the amount of\n ETH on L2 inflating when ETH is withdrawn. Currently only way to do this is to\n create a contract and self-destruct it to itself. Anyone can call this function. Not\n incentivized since this function is very cheap."},"functionSelector":"44df8e70","implemented":true,"kind":"function","modifiers":[],"name":"burn","nameLocation":"2924:4:150","parameters":{"id":91220,"nodeType":"ParameterList","parameters":[],"src":"2928:2:150"},"returnParameters":{"id":91221,"nodeType":"ParameterList","parameters":[],"src":"2940:0:150"},"scope":91307,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":91293,"nodeType":"FunctionDefinition","src":"3311:650:150","nodes":[],"body":{"id":91292,"nodeType":"Block","src":"3410:551:150","nodes":[],"statements":[{"assignments":[91252],"declarations":[{"constant":false,"id":91252,"mutability":"mutable","name":"withdrawalHash","nameLocation":"3428:14:150","nodeType":"VariableDeclaration","scope":91292,"src":"3420:22:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":91251,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3420:7:150","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":91268,"initialValue":{"arguments":[{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":91257,"name":"messageNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91306,"src":"3534:12:150","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":91258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3534:14:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":91259,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3574:3:150","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":91260,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3574:10:150","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91261,"name":"_target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91244,"src":"3610:7:150","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":91262,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3642:3:150","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":91263,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"3642:9:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91264,"name":"_gasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91246,"src":"3679:9:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91265,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91248,"src":"3712:5:150","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":91255,"name":"Types","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104349,"src":"3481:5:150","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Types_$104349_$","typeString":"type(library Types)"}},"id":91256,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"WithdrawalTransaction","nodeType":"MemberAccess","referencedDeclaration":104348,"src":"3481:27:150","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_WithdrawalTransaction_$104348_storage_ptr_$","typeString":"type(struct Types.WithdrawalTransaction storage pointer)"}},"id":91266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":["nonce","sender","target","value","gasLimit","data"],"nodeType":"FunctionCall","src":"3481:251:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}],"expression":{"id":91253,"name":"Hashing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103936,"src":"3445:7:150","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Hashing_$103936_$","typeString":"type(library Hashing)"}},"id":91254,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hashWithdrawal","nodeType":"MemberAccess","referencedDeclaration":103911,"src":"3445:22:150","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_WithdrawalTransaction_$104348_memory_ptr_$returns$_t_bytes32_$","typeString":"function (struct Types.WithdrawalTransaction memory) pure returns (bytes32)"}},"id":91267,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3445:297:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3420:322:150"},{"expression":{"id":91273,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":91269,"name":"sentMessages","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91174,"src":"3753:12:150","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"}},"id":91271,"indexExpression":{"id":91270,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91252,"src":"3766:14:150","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3753:28:150","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":91272,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3784:4:150","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"3753:35:150","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":91274,"nodeType":"ExpressionStatement","src":"3753:35:150"},{"eventCall":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":91276,"name":"messageNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91306,"src":"3818:12:150","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":91277,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3818:14:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":91278,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3834:3:150","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":91279,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3834:10:150","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":91280,"name":"_target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91244,"src":"3846:7:150","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":91281,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3855:3:150","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":91282,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"3855:9:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91283,"name":"_gasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91246,"src":"3866:9:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":91284,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91248,"src":"3877:5:150","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":91285,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91252,"src":"3884:14:150","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":91275,"name":"MessagePassed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91194,"src":"3804:13:150","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint256_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$_t_bytes32_$returns$__$","typeString":"function (uint256,address,address,uint256,uint256,bytes memory,bytes32)"}},"id":91286,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3804:95:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":91287,"nodeType":"EmitStatement","src":"3799:100:150"},{"id":91291,"nodeType":"UncheckedBlock","src":"3910:45:150","statements":[{"expression":{"id":91289,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"3934:10:150","subExpression":{"id":91288,"name":"msgNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91177,"src":"3936:8:150","typeDescriptions":{"typeIdentifier":"t_uint240","typeString":"uint240"}},"typeDescriptions":{"typeIdentifier":"t_uint240","typeString":"uint240"}},"id":91290,"nodeType":"ExpressionStatement","src":"3934:10:150"}]}]},"documentation":{"id":91242,"nodeType":"StructuredDocumentation","src":"3075:231:150","text":"@notice Sends a message from L2 to L1.\n @param _target Address to call on L1 execution.\n @param _gasLimit Minimum gas limit for executing the message on L1.\n @param _data Data to forward to L1 target."},"functionSelector":"c2b3e5ac","implemented":true,"kind":"function","modifiers":[],"name":"initiateWithdrawal","nameLocation":"3320:18:150","parameters":{"id":91249,"nodeType":"ParameterList","parameters":[{"constant":false,"id":91244,"mutability":"mutable","name":"_target","nameLocation":"3347:7:150","nodeType":"VariableDeclaration","scope":91293,"src":"3339:15:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":91243,"name":"address","nodeType":"ElementaryTypeName","src":"3339:7:150","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":91246,"mutability":"mutable","name":"_gasLimit","nameLocation":"3364:9:150","nodeType":"VariableDeclaration","scope":91293,"src":"3356:17:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91245,"name":"uint256","nodeType":"ElementaryTypeName","src":"3356:7:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":91248,"mutability":"mutable","name":"_data","nameLocation":"3388:5:150","nodeType":"VariableDeclaration","scope":91293,"src":"3375:18:150","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":91247,"name":"bytes","nodeType":"ElementaryTypeName","src":"3375:5:150","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3338:56:150"},"returnParameters":{"id":91250,"nodeType":"ParameterList","parameters":[],"src":"3410:0:150"},"scope":91307,"stateMutability":"payable","virtual":false,"visibility":"public"},{"id":91306,"nodeType":"FunctionDefinition","src":"4282:134:150","nodes":[],"body":{"id":91305,"nodeType":"Block","src":"4336:80:150","nodes":[],"statements":[{"expression":{"arguments":[{"id":91301,"name":"msgNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91177,"src":"4383:8:150","typeDescriptions":{"typeIdentifier":"t_uint240","typeString":"uint240"}},{"id":91302,"name":"MESSAGE_VERSION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91169,"src":"4393:15:150","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint240","typeString":"uint240"},{"typeIdentifier":"t_uint16","typeString":"uint16"}],"expression":{"id":91299,"name":"Encoding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103714,"src":"4353:8:150","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Encoding_$103714_$","typeString":"type(library Encoding)"}},"id":91300,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"encodeVersionedNonce","nodeType":"MemberAccess","referencedDeclaration":103643,"src":"4353:29:150","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint240_$_t_uint16_$returns$_t_uint256_$","typeString":"function (uint240,uint16) pure returns (uint256)"}},"id":91303,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4353:56:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":91298,"id":91304,"nodeType":"Return","src":"4346:63:150"}]},"documentation":{"id":91294,"nodeType":"StructuredDocumentation","src":"3967:310:150","text":"@notice Retrieves the next message nonce. Message version will be added to the upper two\n bytes of the message nonce. Message version allows us to treat messages as having\n different structures.\n @return Nonce of the next message to be sent, with added message version."},"functionSelector":"ecc70428","implemented":true,"kind":"function","modifiers":[],"name":"messageNonce","nameLocation":"4291:12:150","parameters":{"id":91295,"nodeType":"ParameterList","parameters":[],"src":"4303:2:150"},"returnParameters":{"id":91298,"nodeType":"ParameterList","parameters":[{"constant":false,"id":91297,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":91306,"src":"4327:7:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":91296,"name":"uint256","nodeType":"ElementaryTypeName","src":"4327:7:150","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4326:9:150"},"scope":91307,"stateMutability":"view","virtual":false,"visibility":"public"}],"abstract":false,"baseContracts":[{"baseName":{"id":91160,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"754:7:150"},"id":91161,"nodeType":"InheritanceSpecifier","src":"754:7:150"}],"canonicalName":"L2ToL1MessagePasser","contractDependencies":[102925],"contractKind":"contract","documentation":{"id":91159,"nodeType":"StructuredDocumentation","src":"315:407:150","text":"@custom:proxied\n @custom:predeploy 0x4200000000000000000000000000000000000016\n @title L2ToL1MessagePasser\n @notice The L2ToL1MessagePasser is a dedicated contract where messages that are being sent from\n L2 to L1 can be stored. The storage root of this contract is pulled up to the top level\n of the L2 output to reduce the cost of proving the existence of sent messages."},"fullyImplemented":true,"linearizedBaseContracts":[91307,109417],"name":"L2ToL1MessagePasser","nameLocation":"731:19:150","scope":91308,"usedErrors":[]}],"license":"MIT"},"id":150} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/OptimismMintableERC20.json b/packages/sdk/src/forge-artifacts/OptimismMintableERC20.json new file mode 100644 index 000000000000..682ff763ac78 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/OptimismMintableERC20.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_bridge","type":"address","internalType":"address"},{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_name","type":"string","internalType":"string"},{"name":"_symbol","type":"string","internalType":"string"},{"name":"_decimals","type":"uint8","internalType":"uint8"}],"stateMutability":"nonpayable"},{"type":"function","name":"BRIDGE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"REMOTE_TOKEN","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"allowance","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bridge","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"burn","inputs":[{"name":"_from","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"decreaseAllowance","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"subtractedValue","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"increaseAllowance","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"addedValue","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"l1Token","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"l2Bridge","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"mint","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"remoteToken","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"supportsInterface","inputs":[{"name":"_interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transfer","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Burn","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Mint","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false}],"bytecode":{"object":"0x60e06040523480156200001157600080fd5b506040516200178a3803806200178a833981016040819052620000349162000163565b828260036200004483826200029e565b5060046200005382826200029e565b5050506001600160a01b039384166080529390921660a052505060ff1660c0526200036a565b80516001600160a01b03811681146200009157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000be57600080fd5b81516001600160401b0380821115620000db57620000db62000096565b604051601f8301601f19908116603f0116810190828211818310171562000106576200010662000096565b816040528381526020925086838588010111156200012357600080fd5b600091505b8382101562000147578582018301518183018401529082019062000128565b83821115620001595760008385830101525b9695505050505050565b600080600080600060a086880312156200017c57600080fd5b620001878662000079565b9450620001976020870162000079565b60408701519094506001600160401b0380821115620001b557600080fd5b620001c389838a01620000ac565b94506060880151915080821115620001da57600080fd5b50620001e988828901620000ac565b925050608086015160ff811681146200020157600080fd5b809150509295509295909350565b600181811c908216806200022457607f821691505b6020821081036200024557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029957600081815260208120601f850160051c81016020861015620002745750805b601f850160051c820191505b81811015620002955782815560010162000280565b5050505b505050565b81516001600160401b03811115620002ba57620002ba62000096565b620002d281620002cb84546200020f565b846200024b565b602080601f8311600181146200030a5760008415620002f15750858301515b600019600386901b1c1916600185901b17855562000295565b600085815260208120601f198616915b828110156200033b578886015182559484019460019091019084016200031a565b50858210156200035a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c0516113d4620003b6600039600061024401526000818161034b015281816103e001528181610625015261075c0152600081816101a9015261037101526113d46000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e14610395578063e78cea9214610349578063ee9a31a2146103db57600080fd5b8063ae1f6aaf14610349578063c01e1bd61461036f578063d6c0b2c41461036f57600080fd5b80639dc29fac116100bd5780639dc29fac14610310578063a457c2d714610323578063a9059cbb1461033657600080fd5b806370a08231146102d257806395d89b411461030857600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461026e57806340c10f191461028157806354fd4d501461029657600080fd5b806323b872dd1461022a578063313ce5671461023d57600080fd5b806306fdde031161016057806306fdde03146101f0578063095ea7b31461020557806318160ddd1461021857600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a36600461117d565b610402565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f86104f3565b60405161019b91906111c6565b61018f610213366004611262565b610585565b6002545b60405190815260200161019b565b61018f61023836600461128c565b61059d565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161019b565b61018f61027c366004611262565b6105c1565b61029461028f366004611262565b61060d565b005b6101f86040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b61021c6102e03660046112c8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101f8610735565b61029461031e366004611262565b610744565b61018f610331366004611262565b61085b565b61018f610344366004611262565b61092c565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61021c6103a33660046112e3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806104bb57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b806104ea57507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461050290611316565b80601f016020809104026020016040519081016040528092919081815260200182805461052e90611316565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b60003361059381858561093a565b5060019392505050565b6000336105ab858285610aee565b6105b6858585610bc5565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105939082908690610608908790611398565b61093a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6106e18282610e78565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161072991815260200190565b60405180910390a25050565b60606004805461050290611316565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016106ce565b6108138282610f98565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161072991815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106ce565b6105b6828686840361093a565b600033610593818585610bc5565b73ffffffffffffffffffffffffffffffffffffffff83166109dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bbf5781811015610bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ce565b610bbf848484840361093a565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610e05908490611398565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e6b91815260200190565b60405180910390a3610bbf565b73ffffffffffffffffffffffffffffffffffffffff8216610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106ce565b8060026000828254610f079190611398565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f41908490611398565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061112d9084906113b0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610ae1565b60006020828403121561118f57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111bf57600080fd5b9392505050565b600060208083528351808285015260005b818110156111f3578581018301518582016040015282016111d7565b81811115611205576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461125d57600080fd5b919050565b6000806040838503121561127557600080fd5b61127e83611239565b946020939093013593505050565b6000806000606084860312156112a157600080fd5b6112aa84611239565b92506112b860208501611239565b9150604084013590509250925092565b6000602082840312156112da57600080fd5b6111bf82611239565b600080604083850312156112f657600080fd5b6112ff83611239565b915061130d60208401611239565b90509250929050565b600181811c9082168061132a57607f821691505b602082108103611363577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156113ab576113ab611369565b500190565b6000828210156113c2576113c2611369565b50039056fea164736f6c634300080f000a","sourceMap":"833:4510:229:-:0;;;2268:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2440:5;2447:7;2044:5:45;:13;2440:5:229;2044::45;:13;:::i;:::-;-1:-1:-1;2067:7:45;:17;2077:7;2067;:17;:::i;:::-;-1:-1:-1;;;;;;;;2470:27:229;;::::1;;::::0;2507:16;;;::::1;;::::0;-1:-1:-1;;2533:20:229::1;;;::::0;833:4510;;14:177:357;93:13;;-1:-1:-1;;;;;135:31:357;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:127::-;257:10;252:3;248:20;245:1;238:31;288:4;285:1;278:15;312:4;309:1;302:15;328:885;382:5;435:3;428:4;420:6;416:17;412:27;402:55;;453:1;450;443:12;402:55;476:13;;-1:-1:-1;;;;;538:10:357;;;535:36;;;551:18;;:::i;:::-;626:2;620:9;594:2;680:13;;-1:-1:-1;;676:22:357;;;700:2;672:31;668:40;656:53;;;724:18;;;744:22;;;721:46;718:72;;;770:18;;:::i;:::-;810:10;806:2;799:22;845:2;837:6;830:18;867:4;857:14;;912:3;907:2;902;894:6;890:15;886:24;883:33;880:53;;;929:1;926;919:12;880:53;951:1;942:10;;961:133;975:2;972:1;969:9;961:133;;;1063:14;;;1059:23;;1053:30;1032:14;;;1028:23;;1021:63;986:10;;;;961:133;;;1112:2;1109:1;1106:9;1103:80;;;1171:1;1166:2;1161;1153:6;1149:15;1145:24;1138:35;1103:80;1201:6;328:885;-1:-1:-1;;;;;;328:885:357:o;1218:884::-;1342:6;1350;1358;1366;1374;1427:3;1415:9;1406:7;1402:23;1398:33;1395:53;;;1444:1;1441;1434:12;1395:53;1467:40;1497:9;1467:40;:::i;:::-;1457:50;;1526:49;1571:2;1560:9;1556:18;1526:49;:::i;:::-;1619:2;1604:18;;1598:25;1516:59;;-1:-1:-1;;;;;;1672:14:357;;;1669:34;;;1699:1;1696;1689:12;1669:34;1722:61;1775:7;1766:6;1755:9;1751:22;1722:61;:::i;:::-;1712:71;;1829:2;1818:9;1814:18;1808:25;1792:41;;1858:2;1848:8;1845:16;1842:36;;;1874:1;1871;1864:12;1842:36;;1897:63;1952:7;1941:8;1930:9;1926:24;1897:63;:::i;:::-;1887:73;;;2003:3;1992:9;1988:19;1982:26;2048:4;2041:5;2037:16;2030:5;2027:27;2017:55;;2068:1;2065;2058:12;2017:55;2091:5;2081:15;;;1218:884;;;;;;;;:::o;2107:380::-;2186:1;2182:12;;;;2229;;;2250:61;;2304:4;2296:6;2292:17;2282:27;;2250:61;2357:2;2349:6;2346:14;2326:18;2323:38;2320:161;;2403:10;2398:3;2394:20;2391:1;2384:31;2438:4;2435:1;2428:15;2466:4;2463:1;2456:15;2320:161;;2107:380;;;:::o;2618:545::-;2720:2;2715:3;2712:11;2709:448;;;2756:1;2781:5;2777:2;2770:17;2826:4;2822:2;2812:19;2896:2;2884:10;2880:19;2877:1;2873:27;2867:4;2863:38;2932:4;2920:10;2917:20;2914:47;;;-1:-1:-1;2955:4:357;2914:47;3010:2;3005:3;3001:12;2998:1;2994:20;2988:4;2984:31;2974:41;;3065:82;3083:2;3076:5;3073:13;3065:82;;;3128:17;;;3109:1;3098:13;3065:82;;;3069:3;;;2709:448;2618:545;;;:::o;3339:1352::-;3459:10;;-1:-1:-1;;;;;3481:30:357;;3478:56;;;3514:18;;:::i;:::-;3543:97;3633:6;3593:38;3625:4;3619:11;3593:38;:::i;:::-;3587:4;3543:97;:::i;:::-;3695:4;;3759:2;3748:14;;3776:1;3771:663;;;;4478:1;4495:6;4492:89;;;-1:-1:-1;4547:19:357;;;4541:26;4492:89;-1:-1:-1;;3296:1:357;3292:11;;;3288:24;3284:29;3274:40;3320:1;3316:11;;;3271:57;4594:81;;3741:944;;3771:663;2565:1;2558:14;;;2602:4;2589:18;;-1:-1:-1;;3807:20:357;;;3925:236;3939:7;3936:1;3933:14;3925:236;;;4028:19;;;4022:26;4007:42;;4120:27;;;;4088:1;4076:14;;;;3955:19;;3925:236;;;3929:3;4189:6;4180:7;4177:19;4174:201;;;4250:19;;;4244:26;-1:-1:-1;;4333:1:357;4329:14;;;4345:3;4325:24;4321:37;4317:42;4302:58;4287:74;;4174:201;-1:-1:-1;;;;;4421:1:357;4405:14;;;4401:22;4388:36;;-1:-1:-1;3339:1352:357:o;:::-;833:4510:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e14610395578063e78cea9214610349578063ee9a31a2146103db57600080fd5b8063ae1f6aaf14610349578063c01e1bd61461036f578063d6c0b2c41461036f57600080fd5b80639dc29fac116100bd5780639dc29fac14610310578063a457c2d714610323578063a9059cbb1461033657600080fd5b806370a08231146102d257806395d89b411461030857600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461026e57806340c10f191461028157806354fd4d501461029657600080fd5b806323b872dd1461022a578063313ce5671461023d57600080fd5b806306fdde031161016057806306fdde03146101f0578063095ea7b31461020557806318160ddd1461021857600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a36600461117d565b610402565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f86104f3565b60405161019b91906111c6565b61018f610213366004611262565b610585565b6002545b60405190815260200161019b565b61018f61023836600461128c565b61059d565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161019b565b61018f61027c366004611262565b6105c1565b61029461028f366004611262565b61060d565b005b6101f86040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b61021c6102e03660046112c8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101f8610735565b61029461031e366004611262565b610744565b61018f610331366004611262565b61085b565b61018f610344366004611262565b61092c565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61021c6103a33660046112e3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806104bb57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b806104ea57507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461050290611316565b80601f016020809104026020016040519081016040528092919081815260200182805461052e90611316565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b60003361059381858561093a565b5060019392505050565b6000336105ab858285610aee565b6105b6858585610bc5565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105939082908690610608908790611398565b61093a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6106e18282610e78565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161072991815260200190565b60405180910390a25050565b60606004805461050290611316565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016106ce565b6108138282610f98565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161072991815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106ce565b6105b6828686840361093a565b600033610593818585610bc5565b73ffffffffffffffffffffffffffffffffffffffff83166109dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bbf5781811015610bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ce565b610bbf848484840361093a565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610e05908490611398565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e6b91815260200190565b60405180910390a3610bbf565b73ffffffffffffffffffffffffffffffffffffffff8216610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106ce565b8060026000828254610f079190611398565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f41908490611398565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061112d9084906113b0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610ae1565b60006020828403121561118f57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111bf57600080fd5b9392505050565b600060208083528351808285015260005b818110156111f3578581018301518582016040015282016111d7565b81811115611205576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461125d57600080fd5b919050565b6000806040838503121561127557600080fd5b61127e83611239565b946020939093013593505050565b6000806000606084860312156112a157600080fd5b6112aa84611239565b92506112b860208501611239565b9150604084013590509250925092565b6000602082840312156112da57600080fd5b6111bf82611239565b600080604083850312156112f657600080fd5b6112ff83611239565b915061130d60208401611239565b90509250929050565b600181811c9082168061132a57607f821691505b602082108103611363577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156113ab576113ab611369565b500190565b6000828210156113c2576113c2611369565b50039056fea164736f6c634300080f000a","sourceMap":"833:4510:229:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3616:519;;;;;;:::i;:::-;;:::i;:::-;;;516:14:357;;509:22;491:41;;479:2;464:18;3616:519:229;;;;;;;;1022:37;;;;;;;;719:42:357;707:55;;;689:74;;677:2;662:18;1022:37:229;543:226:357;2156:98:45;;;:::i;:::-;;;;;;;:::i;4433:197::-;;;;;;:::i;:::-;;:::i;3244:106::-;3331:12;;3244:106;;;2041:25:357;;;2029:2;2014:18;3244:106:45;1895:177:357;5192:286:45;;;;;;:::i;:::-;;:::i;5252:89:229:-;;;2582:4:357;5326:8:229;2570:17:357;2552:36;;2540:2;2525:18;5252:89:229;2410:184:357;5873:234:45;;;;;;:::i;:::-;;:::i;2739:254:229:-;;;;;;:::i;:::-;;:::i;:::-;;2009:40;;;;;;;;;;;;;;;;;;;;;3408:125:45;;;;;;:::i;:::-;3508:18;;3482:7;3508:18;;;;;;;;;;;;3408:125;2367:102;;;:::i;3174:260:229:-;;;;;;:::i;:::-;;:::i;6594:427:45:-;;;;;;:::i;:::-;;:::i;3729:189::-;;;;;;:::i;:::-;;:::i;4434:80:229:-;4501:6;4434:80;;4248:85;4314:12;4248:85;;3976:149:45;;;;;;:::i;:::-;4091:18;;;;4065:7;4091:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3976:149;1129:31:229;;;;;3616:519;3695:4;3727:25;3844:38;3997:40;4054:22;;;;;;:48;;-1:-1:-1;4080:22:229;;;;;;;;4054:48;:74;;;-1:-1:-1;4106:22:229;;;;;;;;4054:74;4047:81;3616:519;-1:-1:-1;;;;;3616:519:229:o;2156:98:45:-;2210:13;2242:5;2235:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2156:98;:::o;4433:197::-;4516:4;719:10:60;4570:32:45;719:10:60;4586:7:45;4595:6;4570:8;:32::i;:::-;-1:-1:-1;4619:4:45;;4433:197;-1:-1:-1;;;4433:197:45:o;5192:286::-;5319:4;719:10:60;5375:38:45;5391:4;719:10:60;5406:6:45;5375:15;:38::i;:::-;5423:27;5433:4;5439:2;5443:6;5423:9;:27::i;:::-;-1:-1:-1;5467:4:45;;5192:286;-1:-1:-1;;;;5192:286:45:o;5873:234::-;719:10:60;5961:4:45;4091:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;5961:4;;719:10:60;6015:64:45;;719:10:60;;4091:27:45;;6040:38;;6068:10;;6040:38;:::i;:::-;6015:8;:64::i;2739:254:229:-;1845:10;:20;1859:6;1845:20;;1837:85;;;;;;;4021:2:357;1837:85:229;;;4003:21:357;4060:2;4040:18;;;4033:30;4099:34;4079:18;;;4072:62;4170:22;4150:18;;;4143:50;4210:19;;1837:85:229;;;;;;;;;2934:19:::1;2940:3;2945:7;2934:5;:19::i;:::-;2973:3;2968:18;;;2978:7;2968:18;;;;2041:25:357::0;;2029:2;2014:18;;1895:177;2968:18:229::1;;;;;;;;2739:254:::0;;:::o;2367:102:45:-;2423:13;2455:7;2448:14;;;;;:::i;3174:260:229:-;1845:10;:20;1859:6;1845:20;;1837:85;;;;;;;4021:2:357;1837:85:229;;;4003:21:357;4060:2;4040:18;;;4033:30;4099:34;4079:18;;;4072:62;4170:22;4150:18;;;4143:50;4210:19;;1837:85:229;3819:416:357;1837:85:229;3371:21:::1;3377:5;3384:7;3371:5;:21::i;:::-;3412:5;3407:20;;;3419:7;3407:20;;;;2041:25:357::0;;2029:2;2014:18;;1895:177;6594:427:45;719:10:60;6687:4:45;4091:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;6687:4;;719:10:60;6831:15:45;6811:16;:35;;6803:85;;;;;;;4442:2:357;6803:85:45;;;4424:21:357;4481:2;4461:18;;;4454:30;4520:34;4500:18;;;4493:62;4591:7;4571:18;;;4564:35;4616:19;;6803:85:45;4240:401:357;6803:85:45;6922:60;6931:5;6938:7;6966:15;6947:16;:34;6922:8;:60::i;3729:189::-;3808:4;719:10:60;3862:28:45;719:10:60;3879:2:45;3883:6;3862:9;:28::i;10110:370::-;10241:19;;;10233:68;;;;;;;4848:2:357;10233:68:45;;;4830:21:357;4887:2;4867:18;;;4860:30;4926:34;4906:18;;;4899:62;4997:6;4977:18;;;4970:34;5021:19;;10233:68:45;4646:400:357;10233:68:45;10319:21;;;10311:68;;;;;;;5253:2:357;10311:68:45;;;5235:21:357;5292:2;5272:18;;;5265:30;5331:34;5311:18;;;5304:62;5402:4;5382:18;;;5375:32;5424:19;;10311:68:45;5051:398:357;10311:68:45;10390:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10441:32;;2041:25:357;;;10441:32:45;;2014:18:357;10441:32:45;;;;;;;;10110:370;;;:::o;10761:441::-;4091:18;;;;10891:24;4091:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;10977:17;10957:37;;10953:243;;11038:6;11018:16;:26;;11010:68;;;;;;;5656:2:357;11010:68:45;;;5638:21:357;5695:2;5675:18;;;5668:30;5734:31;5714:18;;;5707:59;5783:18;;11010:68:45;5454:353:357;11010:68:45;11120:51;11129:5;11136:7;11164:6;11145:16;:25;11120:8;:51::i;:::-;10881:321;10761:441;;;:::o;7475:651::-;7601:18;;;7593:68;;;;;;;6014:2:357;7593:68:45;;;5996:21:357;6053:2;6033:18;;;6026:30;6092:34;6072:18;;;6065:62;6163:7;6143:18;;;6136:35;6188:19;;7593:68:45;5812:401:357;7593:68:45;7679:16;;;7671:64;;;;;;;6420:2:357;7671:64:45;;;6402:21:357;6459:2;6439:18;;;6432:30;6498:34;6478:18;;;6471:62;6569:5;6549:18;;;6542:33;6592:19;;7671:64:45;6218:399:357;7671:64:45;7817:15;;;7795:19;7817:15;;;;;;;;;;;7850:21;;;;7842:72;;;;;;;6824:2:357;7842:72:45;;;6806:21:357;6863:2;6843:18;;;6836:30;6902:34;6882:18;;;6875:62;6973:8;6953:18;;;6946:36;6999:19;;7842:72:45;6622:402:357;7842:72:45;7948:15;;;;:9;:15;;;;;;;;;;;7966:20;;;7948:38;;8006:13;;;;;;;;:23;;7980:6;;7948:9;8006:23;;7980:6;;8006:23;:::i;:::-;;;;;;;;8060:2;8045:26;;8054:4;8045:26;;;8064:6;8045:26;;;;2041:25:357;;2029:2;2014:18;;1895:177;8045:26:45;;;;;;;;8082:37;9111:576;8402:389;8485:21;;;8477:65;;;;;;;7231:2:357;8477:65:45;;;7213:21:357;7270:2;7250:18;;;7243:30;7309:33;7289:18;;;7282:61;7360:18;;8477:65:45;7029:355:357;8477:65:45;8629:6;8613:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;8645:18:45;;;:9;:18;;;;;;;;;;:28;;8667:6;;8645:9;:28;;8667:6;;8645:28;:::i;:::-;;;;-1:-1:-1;;8688:37:45;;2041:25:357;;;8688:37:45;;;;8705:1;;8688:37;;2029:2:357;2014:18;8688:37:45;;;;;;;8402:389;;:::o;9111:576::-;9194:21;;;9186:67;;;;;;;7591:2:357;9186:67:45;;;7573:21:357;7630:2;7610:18;;;7603:30;7669:34;7649:18;;;7642:62;7740:3;7720:18;;;7713:31;7761:19;;9186:67:45;7389:397:357;9186:67:45;9349:18;;;9324:22;9349:18;;;;;;;;;;;9385:24;;;;9377:71;;;;;;;7993:2:357;9377:71:45;;;7975:21:357;8032:2;8012:18;;;8005:30;8071:34;8051:18;;;8044:62;8142:4;8122:18;;;8115:32;8164:19;;9377:71:45;7791:398:357;9377:71:45;9482:18;;;:9;:18;;;;;;;;;;9503:23;;;9482:44;;9546:12;:22;;9520:6;;9482:9;9546:22;;9520:6;;9546:22;:::i;:::-;;;;-1:-1:-1;;9584:37:45;;2041:25:357;;;9610:1:45;;9584:37;;;;;;2029:2:357;2014:18;9584:37:45;1895:177:357;14:332;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:66;223:5;219:78;212:5;209:89;199:117;;312:1;309;302:12;199:117;335:5;14:332;-1:-1:-1;;;14:332:357:o;774:656::-;886:4;915:2;944;933:9;926:21;976:6;970:13;1019:6;1014:2;1003:9;999:18;992:34;1044:1;1054:140;1068:6;1065:1;1062:13;1054:140;;;1163:14;;;1159:23;;1153:30;1129:17;;;1148:2;1125:26;1118:66;1083:10;;1054:140;;;1212:6;1209:1;1206:13;1203:91;;;1282:1;1277:2;1268:6;1257:9;1253:22;1249:31;1242:42;1203:91;-1:-1:-1;1346:2:357;1334:15;1351:66;1330:88;1315:104;;;;1421:2;1311:113;;774:656;-1:-1:-1;;;774:656:357:o;1435:196::-;1503:20;;1563:42;1552:54;;1542:65;;1532:93;;1621:1;1618;1611:12;1532:93;1435:196;;;:::o;1636:254::-;1704:6;1712;1765:2;1753:9;1744:7;1740:23;1736:32;1733:52;;;1781:1;1778;1771:12;1733:52;1804:29;1823:9;1804:29;:::i;:::-;1794:39;1880:2;1865:18;;;;1852:32;;-1:-1:-1;;;1636:254:357:o;2077:328::-;2154:6;2162;2170;2223:2;2211:9;2202:7;2198:23;2194:32;2191:52;;;2239:1;2236;2229:12;2191:52;2262:29;2281:9;2262:29;:::i;:::-;2252:39;;2310:38;2344:2;2333:9;2329:18;2310:38;:::i;:::-;2300:48;;2395:2;2384:9;2380:18;2367:32;2357:42;;2077:328;;;;;:::o;2599:186::-;2658:6;2711:2;2699:9;2690:7;2686:23;2682:32;2679:52;;;2727:1;2724;2717:12;2679:52;2750:29;2769:9;2750:29;:::i;2790:260::-;2858:6;2866;2919:2;2907:9;2898:7;2894:23;2890:32;2887:52;;;2935:1;2932;2925:12;2887:52;2958:29;2977:9;2958:29;:::i;:::-;2948:39;;3006:38;3040:2;3029:9;3025:18;3006:38;:::i;:::-;2996:48;;2790:260;;;;;:::o;3055:437::-;3134:1;3130:12;;;;3177;;;3198:61;;3252:4;3244:6;3240:17;3230:27;;3198:61;3305:2;3297:6;3294:14;3274:18;3271:38;3268:218;;3342:77;3339:1;3332:88;3443:4;3440:1;3433:15;3471:4;3468:1;3461:15;3268:218;;3055:437;;;:::o;3497:184::-;3549:77;3546:1;3539:88;3646:4;3643:1;3636:15;3670:4;3667:1;3660:15;3686:128;3726:3;3757:1;3753:6;3750:1;3747:13;3744:39;;;3763:18;;:::i;:::-;-1:-1:-1;3799:9:357;;3686:128::o;8194:125::-;8234:4;8262:1;8259;8256:8;8253:34;;;8267:18;;:::i;:::-;-1:-1:-1;8304:9:357;;8194:125::o","linkReferences":{},"immutableReferences":{"109440":[{"start":425,"length":32},{"start":881,"length":32}],"109443":[{"start":843,"length":32},{"start":992,"length":32},{"start":1573,"length":32},{"start":1884,"length":32}],"109446":[{"start":580,"length":32}]}},"methodIdentifiers":{"BRIDGE()":"ee9a31a2","REMOTE_TOKEN()":"033964be","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","bridge()":"e78cea92","burn(address,uint256)":"9dc29fac","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","increaseAllowance(address,uint256)":"39509351","l1Token()":"c01e1bd6","l2Bridge()":"ae1f6aaf","mint(address,uint256)":"40c10f19","name()":"06fdde03","remoteToken()":"d6c0b2c4","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BRIDGE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REMOTE_TOKEN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1Token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Bridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Burn(address,uint256)\":{\"params\":{\"account\":\"Address of the account tokens are being burned from.\",\"amount\":\"Amount of tokens burned.\"}},\"Mint(address,uint256)\":{\"params\":{\"account\":\"Address of the account tokens are being minted for.\",\"amount\":\"Amount of tokens minted.\"}}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"bridge()\":{\"custom:legacy\":\"@notice Legacy getter for BRIDGE.\"},\"burn(address,uint256)\":{\"params\":{\"_amount\":\"Amount of tokens to burn.\",\"_from\":\"Address to burn tokens from.\"}},\"constructor\":{\"params\":{\"_bridge\":\"Address of the L2 standard bridge.\",\"_name\":\"ERC20 name.\",\"_remoteToken\":\"Address of the corresponding L1 token.\",\"_symbol\":\"ERC20 symbol.\"}},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"l1Token()\":{\"custom:legacy\":\"@notice Legacy getter for the remote token. Use REMOTE_TOKEN going forward.\"},\"l2Bridge()\":{\"custom:legacy\":\"@notice Legacy getter for the bridge. Use BRIDGE going forward.\"},\"mint(address,uint256)\":{\"params\":{\"_amount\":\"Amount of tokens to mint.\",\"_to\":\"Address to mint tokens to.\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"remoteToken()\":{\"custom:legacy\":\"@notice Legacy getter for REMOTE_TOKEN.\"},\"supportsInterface(bytes4)\":{\"params\":{\"_interfaceId\":\"Interface ID to check.\"},\"returns\":{\"_0\":\"Whether or not the interface is supported by this contract.\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"stateVariables\":{\"version\":{\"custom:semver\":\"1.3.0\"}},\"title\":\"OptimismMintableERC20\",\"version\":1},\"userdoc\":{\"events\":{\"Burn(address,uint256)\":{\"notice\":\"Emitted whenever tokens are burned from an account.\"},\"Mint(address,uint256)\":{\"notice\":\"Emitted whenever tokens are minted for an account.\"}},\"kind\":\"user\",\"methods\":{\"BRIDGE()\":{\"notice\":\"Address of the StandardBridge on this network.\"},\"REMOTE_TOKEN()\":{\"notice\":\"Address of the corresponding version of this token on the remote chain.\"},\"burn(address,uint256)\":{\"notice\":\"Allows the StandardBridge on this network to burn tokens.\"},\"mint(address,uint256)\":{\"notice\":\"Allows the StandardBridge on this network to mint tokens.\"},\"supportsInterface(bytes4)\":{\"notice\":\"ERC165 interface check function.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"OptimismMintableERC20 is a standard extension of the base ERC20 token contract designed to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to use an OptimismMintablERC20 as the L2 representation of an L1 token, or vice-versa. Designed to be backwards compatible with the older StandardL2ERC20 token which was only meant for use on L2.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/universal/OptimismMintableERC20.sol\":\"OptimismMintableERC20\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0\",\"dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"src/universal/IOptimismMintableERC20.sol\":{\"keccak256\":\"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf\",\"dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"src/universal/OptimismMintableERC20.sol\":{\"keccak256\":\"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7\",\"dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_bridge","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"spender","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"Burn","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"Mint","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"BRIDGE","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"REMOTE_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"stateMutability":"view","type":"function","name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"burn"},{"inputs":[],"stateMutability":"view","type":"function","name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"l1Token","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"l2Bridge","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"mint"},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"remoteToken","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"stateMutability":"pure","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"bridge()":{"custom:legacy":"@notice Legacy getter for BRIDGE."},"burn(address,uint256)":{"params":{"_amount":"Amount of tokens to burn.","_from":"Address to burn tokens from."}},"constructor":{"params":{"_bridge":"Address of the L2 standard bridge.","_name":"ERC20 name.","_remoteToken":"Address of the corresponding L1 token.","_symbol":"ERC20 symbol."}},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"decreaseAllowance(address,uint256)":{"details":"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{"details":"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."},"l1Token()":{"custom:legacy":"@notice Legacy getter for the remote token. Use REMOTE_TOKEN going forward."},"l2Bridge()":{"custom:legacy":"@notice Legacy getter for the bridge. Use BRIDGE going forward."},"mint(address,uint256)":{"params":{"_amount":"Amount of tokens to mint.","_to":"Address to mint tokens to."}},"name()":{"details":"Returns the name of the token."},"remoteToken()":{"custom:legacy":"@notice Legacy getter for REMOTE_TOKEN."},"supportsInterface(bytes4)":{"params":{"_interfaceId":"Interface ID to check."},"returns":{"_0":"Whether or not the interface is supported by this contract."}},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`."}},"version":1},"userdoc":{"kind":"user","methods":{"BRIDGE()":{"notice":"Address of the StandardBridge on this network."},"REMOTE_TOKEN()":{"notice":"Address of the corresponding version of this token on the remote chain."},"burn(address,uint256)":{"notice":"Allows the StandardBridge on this network to burn tokens."},"mint(address,uint256)":{"notice":"Allows the StandardBridge on this network to mint tokens."},"supportsInterface(bytes4)":{"notice":"ERC165 interface check function."},"version()":{"notice":"Semantic version."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/universal/OptimismMintableERC20.sol":"OptimismMintableERC20"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"keccak256":"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238","urls":["bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0","dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca","urls":["bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd","dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1","urls":["bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f","dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy"],"license":"MIT"},"src/universal/IOptimismMintableERC20.sol":{"keccak256":"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c","urls":["bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf","dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"},"src/universal/OptimismMintableERC20.sol":{"keccak256":"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df","urls":["bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7","dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":49734,"contract":"src/universal/OptimismMintableERC20.sol:OptimismMintableERC20","label":"_balances","offset":0,"slot":"0","type":"t_mapping(t_address,t_uint256)"},{"astId":49740,"contract":"src/universal/OptimismMintableERC20.sol:OptimismMintableERC20","label":"_allowances","offset":0,"slot":"1","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))"},{"astId":49742,"contract":"src/universal/OptimismMintableERC20.sol:OptimismMintableERC20","label":"_totalSupply","offset":0,"slot":"2","type":"t_uint256"},{"astId":49744,"contract":"src/universal/OptimismMintableERC20.sol:OptimismMintableERC20","label":"_name","offset":0,"slot":"3","type":"t_string_storage"},{"astId":49746,"contract":"src/universal/OptimismMintableERC20.sol:OptimismMintableERC20","label":"_symbol","offset":0,"slot":"4","type":"t_string_storage"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"version":1,"kind":"user","methods":{"BRIDGE()":{"notice":"Address of the StandardBridge on this network."},"REMOTE_TOKEN()":{"notice":"Address of the corresponding version of this token on the remote chain."},"burn(address,uint256)":{"notice":"Allows the StandardBridge on this network to burn tokens."},"mint(address,uint256)":{"notice":"Allows the StandardBridge on this network to mint tokens."},"supportsInterface(bytes4)":{"notice":"ERC165 interface check function."},"version()":{"notice":"Semantic version."}},"events":{"Burn(address,uint256)":{"notice":"Emitted whenever tokens are burned from an account."},"Mint(address,uint256)":{"notice":"Emitted whenever tokens are minted for an account."}},"notice":"OptimismMintableERC20 is a standard extension of the base ERC20 token contract designed to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to use an OptimismMintablERC20 as the L2 representation of an L1 token, or vice-versa. Designed to be backwards compatible with the older StandardL2ERC20 token which was only meant for use on L2."},"devdoc":{"version":1,"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"bridge()":{},"burn(address,uint256)":{"params":{"_amount":"Amount of tokens to burn.","_from":"Address to burn tokens from."}},"constructor":{"params":{"_bridge":"Address of the L2 standard bridge.","_name":"ERC20 name.","_remoteToken":"Address of the corresponding L1 token.","_symbol":"ERC20 symbol."}},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"decreaseAllowance(address,uint256)":{"details":"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{"details":"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."},"l1Token()":{},"l2Bridge()":{},"mint(address,uint256)":{"params":{"_amount":"Amount of tokens to mint.","_to":"Address to mint tokens to."}},"name()":{"details":"Returns the name of the token."},"remoteToken()":{},"supportsInterface(bytes4)":{"params":{"_interfaceId":"Interface ID to check."},"returns":{"_0":"Whether or not the interface is supported by this contract."}},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`."}},"events":{"Burn(address,uint256)":{"params":{"account":"Address of the account tokens are being burned from.","amount":"Amount of tokens burned."}},"Mint(address,uint256)":{"params":{"account":"Address of the account tokens are being minted for.","amount":"Amount of tokens minted."}}},"title":"OptimismMintableERC20"},"ast":{"absolutePath":"src/universal/OptimismMintableERC20.sol","id":109646,"exportedSymbols":{"ERC20":[50304],"IERC165":[54446],"ILegacyMintableERC20":[109333],"IOptimismMintableERC20":[109310],"ISemver":[109417],"OptimismMintableERC20":[109645]},"nodeType":"SourceUnit","src":"32:5312:229","nodes":[{"id":109419,"nodeType":"PragmaDirective","src":"32:23:229","nodes":[],"literals":["solidity","0.8",".15"]},{"id":109421,"nodeType":"ImportDirective","src":"57:70:229","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","file":"@openzeppelin/contracts/token/ERC20/ERC20.sol","nameLocation":"-1:-1:-1","scope":109646,"sourceUnit":50305,"symbolAliases":[{"foreign":{"id":109420,"name":"ERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50304,"src":"66:5:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":109423,"nodeType":"ImportDirective","src":"128:82:229","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol","file":"@openzeppelin/contracts/utils/introspection/IERC165.sol","nameLocation":"-1:-1:-1","scope":109646,"sourceUnit":54447,"symbolAliases":[{"foreign":{"id":109422,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54446,"src":"137:7:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":109426,"nodeType":"ImportDirective","src":"211:104:229","nodes":[],"absolutePath":"src/universal/IOptimismMintableERC20.sol","file":"src/universal/IOptimismMintableERC20.sol","nameLocation":"-1:-1:-1","scope":109646,"sourceUnit":109334,"symbolAliases":[{"foreign":{"id":109424,"name":"ILegacyMintableERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109333,"src":"220:20:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":109425,"name":"IOptimismMintableERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109310,"src":"242:22:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":109428,"nodeType":"ImportDirective","src":"316:52:229","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":109646,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":109427,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"325:7:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":109645,"nodeType":"ContractDefinition","src":"833:4510:229","nodes":[{"id":109440,"nodeType":"VariableDeclaration","src":"1022:37:229","nodes":[],"constant":false,"documentation":{"id":109438,"nodeType":"StructuredDocumentation","src":"934:83:229","text":"@notice Address of the corresponding version of this token on the remote chain."},"functionSelector":"033964be","mutability":"immutable","name":"REMOTE_TOKEN","nameLocation":"1047:12:229","scope":109645,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109439,"name":"address","nodeType":"ElementaryTypeName","src":"1022:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":109443,"nodeType":"VariableDeclaration","src":"1129:31:229","nodes":[],"constant":false,"documentation":{"id":109441,"nodeType":"StructuredDocumentation","src":"1066:58:229","text":"@notice Address of the StandardBridge on this network."},"functionSelector":"ee9a31a2","mutability":"immutable","name":"BRIDGE","nameLocation":"1154:6:229","scope":109645,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109442,"name":"address","nodeType":"ElementaryTypeName","src":"1129:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":109446,"nodeType":"VariableDeclaration","src":"1205:32:229","nodes":[],"constant":false,"documentation":{"id":109444,"nodeType":"StructuredDocumentation","src":"1167:33:229","text":"@notice Decimals of the token"},"mutability":"immutable","name":"DECIMALS","nameLocation":"1229:8:229","scope":109645,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":109445,"name":"uint8","nodeType":"ElementaryTypeName","src":"1205:5:229","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"private"},{"id":109453,"nodeType":"EventDefinition","src":"1434:52:229","nodes":[],"anonymous":false,"documentation":{"id":109447,"nodeType":"StructuredDocumentation","src":"1244:185:229","text":"@notice Emitted whenever tokens are minted for an account.\n @param account Address of the account tokens are being minted for.\n @param amount Amount of tokens minted."},"eventSelector":"0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885","name":"Mint","nameLocation":"1440:4:229","parameters":{"id":109452,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109449,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"1461:7:229","nodeType":"VariableDeclaration","scope":109453,"src":"1445:23:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109448,"name":"address","nodeType":"ElementaryTypeName","src":"1445:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109451,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"1478:6:229","nodeType":"VariableDeclaration","scope":109453,"src":"1470:14:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":109450,"name":"uint256","nodeType":"ElementaryTypeName","src":"1470:7:229","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1444:41:229"}},{"id":109460,"nodeType":"EventDefinition","src":"1684:52:229","nodes":[],"anonymous":false,"documentation":{"id":109454,"nodeType":"StructuredDocumentation","src":"1492:187:229","text":"@notice Emitted whenever tokens are burned from an account.\n @param account Address of the account tokens are being burned from.\n @param amount Amount of tokens burned."},"eventSelector":"cc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5","name":"Burn","nameLocation":"1690:4:229","parameters":{"id":109459,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109456,"indexed":true,"mutability":"mutable","name":"account","nameLocation":"1711:7:229","nodeType":"VariableDeclaration","scope":109460,"src":"1695:23:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109455,"name":"address","nodeType":"ElementaryTypeName","src":"1695:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109458,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"1728:6:229","nodeType":"VariableDeclaration","scope":109460,"src":"1720:14:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":109457,"name":"uint256","nodeType":"ElementaryTypeName","src":"1720:7:229","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1694:41:229"}},{"id":109473,"nodeType":"ModifierDefinition","src":"1805:135:229","nodes":[],"body":{"id":109472,"nodeType":"Block","src":"1827:113:229","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":109467,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":109464,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1845:3:229","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":109465,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"1845:10:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":109466,"name":"BRIDGE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109443,"src":"1859:6:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1845:20:229","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696467652063616e206d696e7420616e64206275726e","id":109468,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1867:54:229","typeDescriptions":{"typeIdentifier":"t_stringliteral_684e9b7e2c7fdcb543a3efbe7d9ca90113ea3f2c0463752c3d3de870c67a963a","typeString":"literal_string \"OptimismMintableERC20: only bridge can mint and burn\""},"value":"OptimismMintableERC20: only bridge can mint and burn"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_684e9b7e2c7fdcb543a3efbe7d9ca90113ea3f2c0463752c3d3de870c67a963a","typeString":"literal_string \"OptimismMintableERC20: only bridge can mint and burn\""}],"id":109463,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1837:7:229","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":109469,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1837:85:229","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":109470,"nodeType":"ExpressionStatement","src":"1837:85:229"},{"id":109471,"nodeType":"PlaceholderStatement","src":"1932:1:229"}]},"documentation":{"id":109461,"nodeType":"StructuredDocumentation","src":"1742:58:229","text":"@notice A modifier that only allows the bridge to call"},"name":"onlyBridge","nameLocation":"1814:10:229","parameters":{"id":109462,"nodeType":"ParameterList","parameters":[],"src":"1824:2:229"},"virtual":false,"visibility":"internal"},{"id":109477,"nodeType":"VariableDeclaration","src":"2009:40:229","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":109474,"nodeType":"StructuredDocumentation","src":"1946:58:229","text":"@notice Semantic version.\n @custom:semver 1.3.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"2032:7:229","scope":109645,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":109475,"name":"string","nodeType":"ElementaryTypeName","src":"2009:6:229","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"312e332e30","id":109476,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2042:7:229","typeDescriptions":{"typeIdentifier":"t_stringliteral_6a08c3e203132c561752255a4d52ffae85bb9c5d33cb3291520dea1b84356389","typeString":"literal_string \"1.3.0\""},"value":"1.3.0"},"visibility":"public"},{"id":109508,"nodeType":"FunctionDefinition","src":"2268:292:229","nodes":[],"body":{"id":109507,"nodeType":"Block","src":"2460:100:229","nodes":[],"statements":[{"expression":{"id":109497,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":109495,"name":"REMOTE_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109440,"src":"2470:12:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":109496,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109482,"src":"2485:12:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2470:27:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":109498,"nodeType":"ExpressionStatement","src":"2470:27:229"},{"expression":{"id":109501,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":109499,"name":"BRIDGE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109443,"src":"2507:6:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":109500,"name":"_bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109480,"src":"2516:7:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2507:16:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":109502,"nodeType":"ExpressionStatement","src":"2507:16:229"},{"expression":{"id":109505,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":109503,"name":"DECIMALS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109446,"src":"2533:8:229","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":109504,"name":"_decimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109488,"src":"2544:9:229","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"2533:20:229","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":109506,"nodeType":"ExpressionStatement","src":"2533:20:229"}]},"documentation":{"id":109478,"nodeType":"StructuredDocumentation","src":"2056:207:229","text":"@param _bridge Address of the L2 standard bridge.\n @param _remoteToken Address of the corresponding L1 token.\n @param _name ERC20 name.\n @param _symbol ERC20 symbol."},"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":109491,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109484,"src":"2440:5:229","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":109492,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109486,"src":"2447:7:229","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"id":109493,"kind":"baseConstructorSpecifier","modifierName":{"id":109490,"name":"ERC20","nodeType":"IdentifierPath","referencedDeclaration":50304,"src":"2434:5:229"},"nodeType":"ModifierInvocation","src":"2434:21:229"}],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":109489,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109480,"mutability":"mutable","name":"_bridge","nameLocation":"2297:7:229","nodeType":"VariableDeclaration","scope":109508,"src":"2289:15:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109479,"name":"address","nodeType":"ElementaryTypeName","src":"2289:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109482,"mutability":"mutable","name":"_remoteToken","nameLocation":"2322:12:229","nodeType":"VariableDeclaration","scope":109508,"src":"2314:20:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109481,"name":"address","nodeType":"ElementaryTypeName","src":"2314:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109484,"mutability":"mutable","name":"_name","nameLocation":"2358:5:229","nodeType":"VariableDeclaration","scope":109508,"src":"2344:19:229","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":109483,"name":"string","nodeType":"ElementaryTypeName","src":"2344:6:229","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":109486,"mutability":"mutable","name":"_symbol","nameLocation":"2387:7:229","nodeType":"VariableDeclaration","scope":109508,"src":"2373:21:229","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":109485,"name":"string","nodeType":"ElementaryTypeName","src":"2373:6:229","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":109488,"mutability":"mutable","name":"_decimals","nameLocation":"2410:9:229","nodeType":"VariableDeclaration","scope":109508,"src":"2404:15:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":109487,"name":"uint8","nodeType":"ElementaryTypeName","src":"2404:5:229","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"2279:146:229"},"returnParameters":{"id":109494,"nodeType":"ParameterList","parameters":[],"src":"2460:0:229"},"scope":109645,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":109532,"nodeType":"FunctionDefinition","src":"2739:254:229","nodes":[],"body":{"id":109531,"nodeType":"Block","src":"2924:69:229","nodes":[],"statements":[{"expression":{"arguments":[{"id":109522,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109511,"src":"2940:3:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":109523,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109513,"src":"2945:7:229","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":109521,"name":"_mint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50121,"src":"2934:5:229","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":109524,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2934:19:229","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":109525,"nodeType":"ExpressionStatement","src":"2934:19:229"},{"eventCall":{"arguments":[{"id":109527,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109511,"src":"2973:3:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":109528,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109513,"src":"2978:7:229","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":109526,"name":"Mint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109453,"src":"2968:4:229","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":109529,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2968:18:229","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":109530,"nodeType":"EmitStatement","src":"2963:23:229"}]},"baseFunctions":[109302,109325],"documentation":{"id":109509,"nodeType":"StructuredDocumentation","src":"2566:168:229","text":"@notice Allows the StandardBridge on this network to mint tokens.\n @param _to Address to mint tokens to.\n @param _amount Amount of tokens to mint."},"functionSelector":"40c10f19","implemented":true,"kind":"function","modifiers":[{"id":109519,"kind":"modifierInvocation","modifierName":{"id":109518,"name":"onlyBridge","nodeType":"IdentifierPath","referencedDeclaration":109473,"src":"2909:10:229"},"nodeType":"ModifierInvocation","src":"2909:10:229"}],"name":"mint","nameLocation":"2748:4:229","overrides":{"id":109517,"nodeType":"OverrideSpecifier","overrides":[{"id":109515,"name":"IOptimismMintableERC20","nodeType":"IdentifierPath","referencedDeclaration":109310,"src":"2855:22:229"},{"id":109516,"name":"ILegacyMintableERC20","nodeType":"IdentifierPath","referencedDeclaration":109333,"src":"2879:20:229"}],"src":"2846:54:229"},"parameters":{"id":109514,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109511,"mutability":"mutable","name":"_to","nameLocation":"2770:3:229","nodeType":"VariableDeclaration","scope":109532,"src":"2762:11:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109510,"name":"address","nodeType":"ElementaryTypeName","src":"2762:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109513,"mutability":"mutable","name":"_amount","nameLocation":"2791:7:229","nodeType":"VariableDeclaration","scope":109532,"src":"2783:15:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":109512,"name":"uint256","nodeType":"ElementaryTypeName","src":"2783:7:229","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2752:52:229"},"returnParameters":{"id":109520,"nodeType":"ParameterList","parameters":[],"src":"2924:0:229"},"scope":109645,"stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"id":109556,"nodeType":"FunctionDefinition","src":"3174:260:229","nodes":[],"body":{"id":109555,"nodeType":"Block","src":"3361:73:229","nodes":[],"statements":[{"expression":{"arguments":[{"id":109546,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109535,"src":"3377:5:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":109547,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109537,"src":"3384:7:229","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":109545,"name":"_burn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50193,"src":"3371:5:229","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":109548,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3371:21:229","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":109549,"nodeType":"ExpressionStatement","src":"3371:21:229"},{"eventCall":{"arguments":[{"id":109551,"name":"_from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109535,"src":"3412:5:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":109552,"name":"_amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109537,"src":"3419:7:229","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":109550,"name":"Burn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109460,"src":"3407:4:229","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":109553,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3407:20:229","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":109554,"nodeType":"EmitStatement","src":"3402:25:229"}]},"baseFunctions":[109309,109332],"documentation":{"id":109533,"nodeType":"StructuredDocumentation","src":"2999:170:229","text":"@notice Allows the StandardBridge on this network to burn tokens.\n @param _from Address to burn tokens from.\n @param _amount Amount of tokens to burn."},"functionSelector":"9dc29fac","implemented":true,"kind":"function","modifiers":[{"id":109543,"kind":"modifierInvocation","modifierName":{"id":109542,"name":"onlyBridge","nodeType":"IdentifierPath","referencedDeclaration":109473,"src":"3346:10:229"},"nodeType":"ModifierInvocation","src":"3346:10:229"}],"name":"burn","nameLocation":"3183:4:229","overrides":{"id":109541,"nodeType":"OverrideSpecifier","overrides":[{"id":109539,"name":"IOptimismMintableERC20","nodeType":"IdentifierPath","referencedDeclaration":109310,"src":"3292:22:229"},{"id":109540,"name":"ILegacyMintableERC20","nodeType":"IdentifierPath","referencedDeclaration":109333,"src":"3316:20:229"}],"src":"3283:54:229"},"parameters":{"id":109538,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109535,"mutability":"mutable","name":"_from","nameLocation":"3205:5:229","nodeType":"VariableDeclaration","scope":109556,"src":"3197:13:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109534,"name":"address","nodeType":"ElementaryTypeName","src":"3197:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109537,"mutability":"mutable","name":"_amount","nameLocation":"3228:7:229","nodeType":"VariableDeclaration","scope":109556,"src":"3220:15:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":109536,"name":"uint256","nodeType":"ElementaryTypeName","src":"3220:7:229","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3187:54:229"},"returnParameters":{"id":109544,"nodeType":"ParameterList","parameters":[],"src":"3361:0:229"},"scope":109645,"stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"id":109598,"nodeType":"FunctionDefinition","src":"3616:519:229","nodes":[],"body":{"id":109597,"nodeType":"Block","src":"3701:434:229","nodes":[],"statements":[{"assignments":[109565],"declarations":[{"constant":false,"id":109565,"mutability":"mutable","name":"iface1","nameLocation":"3718:6:229","nodeType":"VariableDeclaration","scope":109597,"src":"3711:13:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":109564,"name":"bytes4","nodeType":"ElementaryTypeName","src":"3711:6:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":109570,"initialValue":{"expression":{"arguments":[{"id":109567,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54446,"src":"3732:7:229","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC165_$54446_$","typeString":"type(contract IERC165)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC165_$54446_$","typeString":"type(contract IERC165)"}],"id":109566,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3727:4:229","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":109568,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3727:13:229","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC165_$54446","typeString":"type(contract IERC165)"}},"id":109569,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"interfaceId","nodeType":"MemberAccess","src":"3727:25:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"3711:41:229"},{"assignments":[109572],"declarations":[{"constant":false,"id":109572,"mutability":"mutable","name":"iface2","nameLocation":"3835:6:229","nodeType":"VariableDeclaration","scope":109597,"src":"3828:13:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":109571,"name":"bytes4","nodeType":"ElementaryTypeName","src":"3828:6:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":109577,"initialValue":{"expression":{"arguments":[{"id":109574,"name":"ILegacyMintableERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109333,"src":"3849:20:229","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ILegacyMintableERC20_$109333_$","typeString":"type(contract ILegacyMintableERC20)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_ILegacyMintableERC20_$109333_$","typeString":"type(contract ILegacyMintableERC20)"}],"id":109573,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3844:4:229","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":109575,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3844:26:229","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_ILegacyMintableERC20_$109333","typeString":"type(contract ILegacyMintableERC20)"}},"id":109576,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"interfaceId","nodeType":"MemberAccess","src":"3844:38:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"3828:54:229"},{"assignments":[109579],"declarations":[{"constant":false,"id":109579,"mutability":"mutable","name":"iface3","nameLocation":"3988:6:229","nodeType":"VariableDeclaration","scope":109597,"src":"3981:13:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":109578,"name":"bytes4","nodeType":"ElementaryTypeName","src":"3981:6:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":109584,"initialValue":{"expression":{"arguments":[{"id":109581,"name":"IOptimismMintableERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109310,"src":"4002:22:229","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IOptimismMintableERC20_$109310_$","typeString":"type(contract IOptimismMintableERC20)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IOptimismMintableERC20_$109310_$","typeString":"type(contract IOptimismMintableERC20)"}],"id":109580,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3997:4:229","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":109582,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3997:28:229","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IOptimismMintableERC20_$109310","typeString":"type(contract IOptimismMintableERC20)"}},"id":109583,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"interfaceId","nodeType":"MemberAccess","src":"3997:40:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"3981:56:229"},{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":109595,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":109591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":109587,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":109585,"name":"_interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109559,"src":"4054:12:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":109586,"name":"iface1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109565,"src":"4070:6:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"4054:22:229","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":109590,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":109588,"name":"_interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109559,"src":"4080:12:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":109589,"name":"iface2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109572,"src":"4096:6:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"4080:22:229","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4054:48:229","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":109594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":109592,"name":"_interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109559,"src":"4106:12:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":109593,"name":"iface3","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109579,"src":"4122:6:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"4106:22:229","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4054:74:229","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":109563,"id":109596,"nodeType":"Return","src":"4047:81:229"}]},"baseFunctions":[54445],"documentation":{"id":109557,"nodeType":"StructuredDocumentation","src":"3440:171:229","text":"@notice ERC165 interface check function.\n @param _interfaceId Interface ID to check.\n @return Whether or not the interface is supported by this contract."},"functionSelector":"01ffc9a7","implemented":true,"kind":"function","modifiers":[],"name":"supportsInterface","nameLocation":"3625:17:229","parameters":{"id":109560,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109559,"mutability":"mutable","name":"_interfaceId","nameLocation":"3650:12:229","nodeType":"VariableDeclaration","scope":109598,"src":"3643:19:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":109558,"name":"bytes4","nodeType":"ElementaryTypeName","src":"3643:6:229","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"3642:21:229"},"returnParameters":{"id":109563,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109562,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":109598,"src":"3695:4:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":109561,"name":"bool","nodeType":"ElementaryTypeName","src":"3695:4:229","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3694:6:229"},"scope":109645,"stateMutability":"pure","virtual":true,"visibility":"external"},{"id":109607,"nodeType":"FunctionDefinition","src":"4248:85:229","nodes":[],"body":{"id":109606,"nodeType":"Block","src":"4297:36:229","nodes":[],"statements":[{"expression":{"id":109604,"name":"REMOTE_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109440,"src":"4314:12:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":109603,"id":109605,"nodeType":"Return","src":"4307:19:229"}]},"baseFunctions":[109318],"documentation":{"id":109599,"nodeType":"StructuredDocumentation","src":"4141:102:229","text":"@custom:legacy\n @notice Legacy getter for the remote token. Use REMOTE_TOKEN going forward."},"functionSelector":"c01e1bd6","implemented":true,"kind":"function","modifiers":[],"name":"l1Token","nameLocation":"4257:7:229","parameters":{"id":109600,"nodeType":"ParameterList","parameters":[],"src":"4264:2:229"},"returnParameters":{"id":109603,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109602,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":109607,"src":"4288:7:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109601,"name":"address","nodeType":"ElementaryTypeName","src":"4288:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4287:9:229"},"scope":109645,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":109616,"nodeType":"FunctionDefinition","src":"4434:80:229","nodes":[],"body":{"id":109615,"nodeType":"Block","src":"4484:30:229","nodes":[],"statements":[{"expression":{"id":109613,"name":"BRIDGE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109443,"src":"4501:6:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":109612,"id":109614,"nodeType":"Return","src":"4494:13:229"}]},"documentation":{"id":109608,"nodeType":"StructuredDocumentation","src":"4339:90:229","text":"@custom:legacy\n @notice Legacy getter for the bridge. Use BRIDGE going forward."},"functionSelector":"ae1f6aaf","implemented":true,"kind":"function","modifiers":[],"name":"l2Bridge","nameLocation":"4443:8:229","parameters":{"id":109609,"nodeType":"ParameterList","parameters":[],"src":"4451:2:229"},"returnParameters":{"id":109612,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109611,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":109616,"src":"4475:7:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109610,"name":"address","nodeType":"ElementaryTypeName","src":"4475:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4474:9:229"},"scope":109645,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":109625,"nodeType":"FunctionDefinition","src":"4591:89:229","nodes":[],"body":{"id":109624,"nodeType":"Block","src":"4644:36:229","nodes":[],"statements":[{"expression":{"id":109622,"name":"REMOTE_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109440,"src":"4661:12:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":109621,"id":109623,"nodeType":"Return","src":"4654:19:229"}]},"baseFunctions":[109290],"documentation":{"id":109617,"nodeType":"StructuredDocumentation","src":"4520:66:229","text":"@custom:legacy\n @notice Legacy getter for REMOTE_TOKEN."},"functionSelector":"d6c0b2c4","implemented":true,"kind":"function","modifiers":[],"name":"remoteToken","nameLocation":"4600:11:229","parameters":{"id":109618,"nodeType":"ParameterList","parameters":[],"src":"4611:2:229"},"returnParameters":{"id":109621,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109620,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":109625,"src":"4635:7:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109619,"name":"address","nodeType":"ElementaryTypeName","src":"4635:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4634:9:229"},"scope":109645,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":109634,"nodeType":"FunctionDefinition","src":"4751:78:229","nodes":[],"body":{"id":109633,"nodeType":"Block","src":"4799:30:229","nodes":[],"statements":[{"expression":{"id":109631,"name":"BRIDGE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109443,"src":"4816:6:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":109630,"id":109632,"nodeType":"Return","src":"4809:13:229"}]},"baseFunctions":[109295],"documentation":{"id":109626,"nodeType":"StructuredDocumentation","src":"4686:60:229","text":"@custom:legacy\n @notice Legacy getter for BRIDGE."},"functionSelector":"e78cea92","implemented":true,"kind":"function","modifiers":[],"name":"bridge","nameLocation":"4760:6:229","parameters":{"id":109627,"nodeType":"ParameterList","parameters":[],"src":"4766:2:229"},"returnParameters":{"id":109630,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109629,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":109634,"src":"4790:7:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109628,"name":"address","nodeType":"ElementaryTypeName","src":"4790:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4789:9:229"},"scope":109645,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":109644,"nodeType":"FunctionDefinition","src":"5252:89:229","nodes":[],"body":{"id":109643,"nodeType":"Block","src":"5309:32:229","nodes":[],"statements":[{"expression":{"id":109641,"name":"DECIMALS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109446,"src":"5326:8:229","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"functionReturnParameters":109640,"id":109642,"nodeType":"Return","src":"5319:15:229"}]},"baseFunctions":[49793],"documentation":{"id":109635,"nodeType":"StructuredDocumentation","src":"4835:412:229","text":"@dev Returns the number of decimals used to get its user representation.\n For example, if `decimals` equals `2`, a balance of `505` tokens should\n be displayed to a user as `5.05` (`505 / 10 ** 2`).\n NOTE: This information is only used for _display_ purposes: it in\n no way affects any of the arithmetic of the contract, including\n {IERC20-balanceOf} and {IERC20-transfer}."},"functionSelector":"313ce567","implemented":true,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"5261:8:229","overrides":{"id":109637,"nodeType":"OverrideSpecifier","overrides":[],"src":"5284:8:229"},"parameters":{"id":109636,"nodeType":"ParameterList","parameters":[],"src":"5269:2:229"},"returnParameters":{"id":109640,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109639,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":109644,"src":"5302:5:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":109638,"name":"uint8","nodeType":"ElementaryTypeName","src":"5302:5:229","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"5301:7:229"},"scope":109645,"stateMutability":"view","virtual":false,"visibility":"public"}],"abstract":false,"baseContracts":[{"baseName":{"id":109430,"name":"IOptimismMintableERC20","nodeType":"IdentifierPath","referencedDeclaration":109310,"src":"867:22:229"},"id":109431,"nodeType":"InheritanceSpecifier","src":"867:22:229"},{"baseName":{"id":109432,"name":"ILegacyMintableERC20","nodeType":"IdentifierPath","referencedDeclaration":109333,"src":"891:20:229"},"id":109433,"nodeType":"InheritanceSpecifier","src":"891:20:229"},{"baseName":{"id":109434,"name":"ERC20","nodeType":"IdentifierPath","referencedDeclaration":50304,"src":"913:5:229"},"id":109435,"nodeType":"InheritanceSpecifier","src":"913:5:229"},{"baseName":{"id":109436,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"920:7:229"},"id":109437,"nodeType":"InheritanceSpecifier","src":"920:7:229"}],"canonicalName":"OptimismMintableERC20","contractDependencies":[],"contractKind":"contract","documentation":{"id":109429,"nodeType":"StructuredDocumentation","src":"370:463:229","text":"@title OptimismMintableERC20\n @notice OptimismMintableERC20 is a standard extension of the base ERC20 token contract designed\n to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to\n use an OptimismMintablERC20 as the L2 representation of an L1 token, or vice-versa.\n Designed to be backwards compatible with the older StandardL2ERC20 token which was only\n meant for use on L2."},"fullyImplemented":true,"linearizedBaseContracts":[109645,109417,50304,51088,50382,53291,109333,109310,54446],"name":"OptimismMintableERC20","nameLocation":"842:21:229","scope":109646,"usedErrors":[]}],"license":"MIT"},"id":229} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/OptimismMintableERC20Factory.json b/packages/sdk/src/forge-artifacts/OptimismMintableERC20Factory.json new file mode 100644 index 000000000000..c43204aaaace --- /dev/null +++ b/packages/sdk/src/forge-artifacts/OptimismMintableERC20Factory.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"BRIDGE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"bridge","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"createOptimismMintableERC20","inputs":[{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_name","type":"string","internalType":"string"},{"name":"_symbol","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"createOptimismMintableERC20WithDecimals","inputs":[{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_name","type":"string","internalType":"string"},{"name":"_symbol","type":"string","internalType":"string"},{"name":"_decimals","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"createStandardL2Token","inputs":[{"name":"_remoteToken","type":"address","internalType":"address"},{"name":"_name","type":"string","internalType":"string"},{"name":"_symbol","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[{"name":"_bridge","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OptimismMintableERC20Created","inputs":[{"name":"localToken","type":"address","indexed":true,"internalType":"address"},{"name":"remoteToken","type":"address","indexed":true,"internalType":"address"},{"name":"deployer","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StandardL2TokenCreated","inputs":[{"name":"remoteToken","type":"address","indexed":true,"internalType":"address"},{"name":"localToken","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001b6000610020565b610169565b600054610100900460ff16158080156100405750600054600160ff909116105b8061006b57506100593061015a60201b61059d1760201c565b15801561006b575060005460ff166001145b6100d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff1916600117905580156100f5576000805461ff0019166101001790555b600180546001600160a01b0319166001600160a01b0384161790558015610156576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b6120e5806101786000396000f3fe60806040523480156200001157600080fd5b5060043610620000875760003560e01c8063c4d66de81162000062578063c4d66de81462000135578063ce5ac90f146200014e578063e78cea921462000165578063ee9a31a2146200018657600080fd5b806354fd4d50146200008c578063896f93d114620000e15780638cf0629c146200011e575b600080fd5b620000c96040518060400160405280600581526020017f312e392e3000000000000000000000000000000000000000000000000000000081525081565b604051620000d8919062000635565b60405180910390f35b620000f8620000f23660046200075d565b620001a5565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620000d8565b620000f86200012f366004620007da565b620001bc565b6200014c6200014636600462000871565b620003ba565b005b620000f86200015f3660046200075d565b6200058c565b600154620000f89073ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16620000f8565b6000620001b48484846200058c565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff851662000267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d4d696e7461626c654552433230466163746f72793a206d7560448201527f73742070726f766964652072656d6f746520746f6b656e20616464726573730060648201526084015b60405180910390fd5b6000858585856040516020016200028294939291906200088f565b604051602081830303815290604052805190602001209050600081600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688888888604051620002d290620005b9565b620002e2959493929190620008e9565b8190604051809103906000f590508015801562000303573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf60405160405180910390a360405133815273ffffffffffffffffffffffffffffffffffffffff80891691908316907f52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb9060200160405180910390a39695505050505050565b600054610100900460ff1615808015620003db5750600054600160ff909116105b80620003f75750303b158015620003f7575060005460ff166001145b62000485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016200025e565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620004e457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905580156200058857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000620001b48484846012620001bc565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61178a806200094f83390190565b6000815180845260005b81811015620005ef57602081850181015186830182015201620005d1565b8181111562000602576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006200064a6020830184620005c7565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146200067657600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112620006bc57600080fd5b813567ffffffffffffffff80821115620006da57620006da6200067b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156200072357620007236200067b565b816040528381528660208588010111156200073d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156200077357600080fd5b6200077e8462000651565b9250602084013567ffffffffffffffff808211156200079c57600080fd5b620007aa87838801620006aa565b93506040860135915080821115620007c157600080fd5b50620007d086828701620006aa565b9150509250925092565b60008060008060808587031215620007f157600080fd5b620007fc8562000651565b9350602085013567ffffffffffffffff808211156200081a57600080fd5b6200082888838901620006aa565b945060408701359150808211156200083f57600080fd5b506200084e87828801620006aa565b925050606085013560ff811681146200086657600080fd5b939692955090935050565b6000602082840312156200088457600080fd5b6200064a8262000651565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000620008c06080830186620005c7565b8281036040840152620008d48186620005c7565b91505060ff8316606083015295945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526200092460a0830186620005c7565b8281036060840152620009388186620005c7565b91505060ff83166080830152969550505050505056fe60e06040523480156200001157600080fd5b506040516200178a3803806200178a833981016040819052620000349162000163565b828260036200004483826200029e565b5060046200005382826200029e565b5050506001600160a01b039384166080529390921660a052505060ff1660c0526200036a565b80516001600160a01b03811681146200009157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000be57600080fd5b81516001600160401b0380821115620000db57620000db62000096565b604051601f8301601f19908116603f0116810190828211818310171562000106576200010662000096565b816040528381526020925086838588010111156200012357600080fd5b600091505b8382101562000147578582018301518183018401529082019062000128565b83821115620001595760008385830101525b9695505050505050565b600080600080600060a086880312156200017c57600080fd5b620001878662000079565b9450620001976020870162000079565b60408701519094506001600160401b0380821115620001b557600080fd5b620001c389838a01620000ac565b94506060880151915080821115620001da57600080fd5b50620001e988828901620000ac565b925050608086015160ff811681146200020157600080fd5b809150509295509295909350565b600181811c908216806200022457607f821691505b6020821081036200024557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029957600081815260208120601f850160051c81016020861015620002745750805b601f850160051c820191505b81811015620002955782815560010162000280565b5050505b505050565b81516001600160401b03811115620002ba57620002ba62000096565b620002d281620002cb84546200020f565b846200024b565b602080601f8311600181146200030a5760008415620002f15750858301515b600019600386901b1c1916600185901b17855562000295565b600085815260208120601f198616915b828110156200033b578886015182559484019460019091019084016200031a565b50858210156200035a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c0516113d4620003b6600039600061024401526000818161034b015281816103e001528181610625015261075c0152600081816101a9015261037101526113d46000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e14610395578063e78cea9214610349578063ee9a31a2146103db57600080fd5b8063ae1f6aaf14610349578063c01e1bd61461036f578063d6c0b2c41461036f57600080fd5b80639dc29fac116100bd5780639dc29fac14610310578063a457c2d714610323578063a9059cbb1461033657600080fd5b806370a08231146102d257806395d89b411461030857600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461026e57806340c10f191461028157806354fd4d501461029657600080fd5b806323b872dd1461022a578063313ce5671461023d57600080fd5b806306fdde031161016057806306fdde03146101f0578063095ea7b31461020557806318160ddd1461021857600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a36600461117d565b610402565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f86104f3565b60405161019b91906111c6565b61018f610213366004611262565b610585565b6002545b60405190815260200161019b565b61018f61023836600461128c565b61059d565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161019b565b61018f61027c366004611262565b6105c1565b61029461028f366004611262565b61060d565b005b6101f86040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b61021c6102e03660046112c8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101f8610735565b61029461031e366004611262565b610744565b61018f610331366004611262565b61085b565b61018f610344366004611262565b61092c565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61021c6103a33660046112e3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806104bb57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b806104ea57507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461050290611316565b80601f016020809104026020016040519081016040528092919081815260200182805461052e90611316565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b60003361059381858561093a565b5060019392505050565b6000336105ab858285610aee565b6105b6858585610bc5565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105939082908690610608908790611398565b61093a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6106e18282610e78565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161072991815260200190565b60405180910390a25050565b60606004805461050290611316565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016106ce565b6108138282610f98565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161072991815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106ce565b6105b6828686840361093a565b600033610593818585610bc5565b73ffffffffffffffffffffffffffffffffffffffff83166109dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bbf5781811015610bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ce565b610bbf848484840361093a565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610e05908490611398565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e6b91815260200190565b60405180910390a3610bbf565b73ffffffffffffffffffffffffffffffffffffffff8216610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106ce565b8060026000828254610f079190611398565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f41908490611398565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061112d9084906113b0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610ae1565b60006020828403121561118f57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111bf57600080fd5b9392505050565b600060208083528351808285015260005b818110156111f3578581018301518582016040015282016111d7565b81811115611205576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461125d57600080fd5b919050565b6000806040838503121561127557600080fd5b61127e83611239565b946020939093013593505050565b6000806000606084860312156112a157600080fd5b6112aa84611239565b92506112b860208501611239565b9150604084013590509250925092565b6000602082840312156112da57600080fd5b6111bf82611239565b600080604083850312156112f657600080fd5b6112ff83611239565b915061130d60208401611239565b90509250929050565b600181811c9082168061132a57607f821691505b602082108103611363577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156113ab576113ab611369565b500190565b6000828210156113c2576113c2611369565b50039056fea164736f6c634300080f000aa164736f6c634300080f000a","sourceMap":"770:5093:230:-:0;;;2694:66;;;;;;;;;-1:-1:-1;2718:35:230;2748:1;2718:10;:35::i;:::-;770:5093;;2876:89;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;;3209:33;3236:4;3209:18;;;;;:33;;:::i;:::-;3208:34;:55;;;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;-1:-1:-1;;;3146:190:43;;216:2:357;3146:190:43;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:357;;;338:44;399:19;;3146:190:43;;;;;;;;3346:12;:16;;-1:-1:-1;;3346:16:43;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;-1:-1:-1;;3406:20:43;;;;;3372:65;2942:6:230::1;:16:::0;;-1:-1:-1;;;;;;2942:16:230::1;-1:-1:-1::0;;;;;2942:16:230;::::1;;::::0;;3457:99:43;;;;3507:5;3491:21;;-1:-1:-1;;3491:21:43;;;3531:14;;-1:-1:-1;581:36:357;;3531:14:43;;569:2:357;554:18;3531:14:43;;;;;;;3457:99;3090:472;2876:89:230;:::o;1175:320:59:-;-1:-1:-1;;;;;1465:19:59;;:23;;;1175:320::o;429:194:357:-;770:5093:230;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040523480156200001157600080fd5b5060043610620000875760003560e01c8063c4d66de81162000062578063c4d66de81462000135578063ce5ac90f146200014e578063e78cea921462000165578063ee9a31a2146200018657600080fd5b806354fd4d50146200008c578063896f93d114620000e15780638cf0629c146200011e575b600080fd5b620000c96040518060400160405280600581526020017f312e392e3000000000000000000000000000000000000000000000000000000081525081565b604051620000d8919062000635565b60405180910390f35b620000f8620000f23660046200075d565b620001a5565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620000d8565b620000f86200012f366004620007da565b620001bc565b6200014c6200014636600462000871565b620003ba565b005b620000f86200015f3660046200075d565b6200058c565b600154620000f89073ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16620000f8565b6000620001b48484846200058c565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff851662000267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d4d696e7461626c654552433230466163746f72793a206d7560448201527f73742070726f766964652072656d6f746520746f6b656e20616464726573730060648201526084015b60405180910390fd5b6000858585856040516020016200028294939291906200088f565b604051602081830303815290604052805190602001209050600081600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688888888604051620002d290620005b9565b620002e2959493929190620008e9565b8190604051809103906000f590508015801562000303573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf60405160405180910390a360405133815273ffffffffffffffffffffffffffffffffffffffff80891691908316907f52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb9060200160405180910390a39695505050505050565b600054610100900460ff1615808015620003db5750600054600160ff909116105b80620003f75750303b158015620003f7575060005460ff166001145b62000485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016200025e565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620004e457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905580156200058857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000620001b48484846012620001bc565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61178a806200094f83390190565b6000815180845260005b81811015620005ef57602081850181015186830182015201620005d1565b8181111562000602576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006200064a6020830184620005c7565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146200067657600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112620006bc57600080fd5b813567ffffffffffffffff80821115620006da57620006da6200067b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156200072357620007236200067b565b816040528381528660208588010111156200073d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156200077357600080fd5b6200077e8462000651565b9250602084013567ffffffffffffffff808211156200079c57600080fd5b620007aa87838801620006aa565b93506040860135915080821115620007c157600080fd5b50620007d086828701620006aa565b9150509250925092565b60008060008060808587031215620007f157600080fd5b620007fc8562000651565b9350602085013567ffffffffffffffff808211156200081a57600080fd5b6200082888838901620006aa565b945060408701359150808211156200083f57600080fd5b506200084e87828801620006aa565b925050606085013560ff811681146200086657600080fd5b939692955090935050565b6000602082840312156200088457600080fd5b6200064a8262000651565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000620008c06080830186620005c7565b8281036040840152620008d48186620005c7565b91505060ff8316606083015295945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526200092460a0830186620005c7565b8281036060840152620009388186620005c7565b91505060ff83166080830152969550505050505056fe60e06040523480156200001157600080fd5b506040516200178a3803806200178a833981016040819052620000349162000163565b828260036200004483826200029e565b5060046200005382826200029e565b5050506001600160a01b039384166080529390921660a052505060ff1660c0526200036a565b80516001600160a01b03811681146200009157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000be57600080fd5b81516001600160401b0380821115620000db57620000db62000096565b604051601f8301601f19908116603f0116810190828211818310171562000106576200010662000096565b816040528381526020925086838588010111156200012357600080fd5b600091505b8382101562000147578582018301518183018401529082019062000128565b83821115620001595760008385830101525b9695505050505050565b600080600080600060a086880312156200017c57600080fd5b620001878662000079565b9450620001976020870162000079565b60408701519094506001600160401b0380821115620001b557600080fd5b620001c389838a01620000ac565b94506060880151915080821115620001da57600080fd5b50620001e988828901620000ac565b925050608086015160ff811681146200020157600080fd5b809150509295509295909350565b600181811c908216806200022457607f821691505b6020821081036200024557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029957600081815260208120601f850160051c81016020861015620002745750805b601f850160051c820191505b81811015620002955782815560010162000280565b5050505b505050565b81516001600160401b03811115620002ba57620002ba62000096565b620002d281620002cb84546200020f565b846200024b565b602080601f8311600181146200030a5760008415620002f15750858301515b600019600386901b1c1916600185901b17855562000295565b600085815260208120601f198616915b828110156200033b578886015182559484019460019091019084016200031a565b50858210156200035a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c0516113d4620003b6600039600061024401526000818161034b015281816103e001528181610625015261075c0152600081816101a9015261037101526113d46000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e14610395578063e78cea9214610349578063ee9a31a2146103db57600080fd5b8063ae1f6aaf14610349578063c01e1bd61461036f578063d6c0b2c41461036f57600080fd5b80639dc29fac116100bd5780639dc29fac14610310578063a457c2d714610323578063a9059cbb1461033657600080fd5b806370a08231146102d257806395d89b411461030857600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461026e57806340c10f191461028157806354fd4d501461029657600080fd5b806323b872dd1461022a578063313ce5671461023d57600080fd5b806306fdde031161016057806306fdde03146101f0578063095ea7b31461020557806318160ddd1461021857600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a36600461117d565b610402565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f86104f3565b60405161019b91906111c6565b61018f610213366004611262565b610585565b6002545b60405190815260200161019b565b61018f61023836600461128c565b61059d565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161019b565b61018f61027c366004611262565b6105c1565b61029461028f366004611262565b61060d565b005b6101f86040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b61021c6102e03660046112c8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101f8610735565b61029461031e366004611262565b610744565b61018f610331366004611262565b61085b565b61018f610344366004611262565b61092c565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61021c6103a33660046112e3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806104bb57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b806104ea57507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461050290611316565b80601f016020809104026020016040519081016040528092919081815260200182805461052e90611316565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b60003361059381858561093a565b5060019392505050565b6000336105ab858285610aee565b6105b6858585610bc5565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105939082908690610608908790611398565b61093a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6106e18282610e78565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161072991815260200190565b60405180910390a25050565b60606004805461050290611316565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016106ce565b6108138282610f98565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161072991815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106ce565b6105b6828686840361093a565b600033610593818585610bc5565b73ffffffffffffffffffffffffffffffffffffffff83166109dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bbf5781811015610bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ce565b610bbf848484840361093a565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610e05908490611398565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e6b91815260200190565b60405180910390a3610bbf565b73ffffffffffffffffffffffffffffffffffffffff8216610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106ce565b8060026000828254610f079190611398565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f41908490611398565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061112d9084906113b0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610ae1565b60006020828403121561118f57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111bf57600080fd5b9392505050565b600060208083528351808285015260005b818110156111f3578581018301518582016040015282016111d7565b81811115611205576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461125d57600080fd5b919050565b6000806040838503121561127557600080fd5b61127e83611239565b946020939093013593505050565b6000806000606084860312156112a157600080fd5b6112aa84611239565b92506112b860208501611239565b9150604084013590509250925092565b6000602082840312156112da57600080fd5b6111bf82611239565b600080604083850312156112f657600080fd5b6112ff83611239565b915061130d60208401611239565b90509250929050565b600181811c9082168061132a57607f821691505b602082108103611363577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156113ab576113ab611369565b500190565b6000828210156113c2576113c2611369565b50039056fea164736f6c634300080f000aa164736f6c634300080f000a","sourceMap":"770:5093:230:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2577:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;3740:255;;;;;;:::i;:::-;;:::i;:::-;;;2746:42:357;2734:55;;;2716:74;;2704:2;2689:18;3740:255:230;2570:226:357;4908:953:230;;;;;;:::i;:::-;;:::i;2876:89::-;;;;;;:::i;:::-;;:::i;:::-;;4280:275;;;;;;:::i;:::-;;:::i;1115:21::-;;;;;;;;;3237:80;3304:6;;;;3237:80;;3740:255;3901:7;3931:57;3959:12;3973:5;3980:7;3931:27;:57::i;:::-;3924:64;3740:255;-1:-1:-1;;;;3740:255:230:o;4908:953::-;5110:7;5141:26;;;5133:102;;;;;;;3974:2:357;5133:102:230;;;3956:21:357;4013:2;3993:18;;;3986:30;4052:34;4032:18;;;4025:62;4123:33;4103:18;;;4096:61;4174:19;;5133:102:230;;;;;;;;;5246:12;5282;5296:5;5303:7;5312:9;5271:51;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5261:62;;;;;;5246:77;;5333:18;5407:4;5414:6;;;;;;;;;;;5422:12;5436:5;5443:7;5452:9;5374:88;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;5333:130;;5570:10;5533:48;;5556:12;5533:48;;;;;;;;;;;;5760:66;;5815:10;2716:74:357;;5760:66:230;;;;;;;;;;;2704:2:357;2689:18;5760:66:230;;;;;;;5844:10;4908:953;-1:-1:-1;;;;;;4908:953:230:o;2876:89::-;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;-1:-1:-1;3236:4:43;1465:19:59;:23;;;3208:55:43;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;;;;5684:2:357;3146:190:43;;;5666:21:357;5723:2;5703:18;;;5696:30;5762:34;5742:18;;;5735:62;5833:16;5813:18;;;5806:44;5867:19;;3146:190:43;5482:410:357;3146:190:43;3346:12;:16;;;;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;;;;;;;3372:65;2942:6:230::1;:16:::0;;;::::1;;::::0;::::1;;::::0;;3457:99:43;;;;3507:5;3491:21;;;;;;3531:14;;-1:-1:-1;6049:36:357;;3531:14:43;;6037:2:357;6022:18;3531:14:43;;;;;;;3457:99;3090:472;2876:89:230;:::o;4280:275::-;4445:7;4475:73;4515:12;4529:5;4536:7;4545:2;4475:39;:73::i;1175:320:59:-;1465:19;;;:23;;;1175:320::o;-1:-1:-1:-;;;;;;;;:::o;14:531:357:-;56:3;94:5;88:12;121:6;116:3;109:19;146:1;156:162;170:6;167:1;164:13;156:162;;;232:4;288:13;;;284:22;;278:29;260:11;;;256:20;;249:59;185:12;156:162;;;336:6;333:1;330:13;327:87;;;402:1;395:4;386:6;381:3;377:16;373:27;366:38;327:87;-1:-1:-1;459:2:357;447:15;464:66;443:88;434:98;;;;534:4;430:109;;14:531;-1:-1:-1;;14:531:357:o;550:220::-;699:2;688:9;681:21;662:4;719:45;760:2;749:9;745:18;737:6;719:45;:::i;:::-;711:53;550:220;-1:-1:-1;;;550:220:357:o;775:196::-;843:20;;903:42;892:54;;882:65;;872:93;;961:1;958;951:12;872:93;775:196;;;:::o;976:184::-;1028:77;1025:1;1018:88;1125:4;1122:1;1115:15;1149:4;1146:1;1139:15;1165:778;1208:5;1261:3;1254:4;1246:6;1242:17;1238:27;1228:55;;1279:1;1276;1269:12;1228:55;1315:6;1302:20;1341:18;1378:2;1374;1371:10;1368:36;;;1384:18;;:::i;:::-;1518:2;1512:9;1580:4;1572:13;;1423:66;1568:22;;;1592:2;1564:31;1560:40;1548:53;;;1616:18;;;1636:22;;;1613:46;1610:72;;;1662:18;;:::i;:::-;1702:10;1698:2;1691:22;1737:2;1729:6;1722:18;1783:3;1776:4;1771:2;1763:6;1759:15;1755:26;1752:35;1749:55;;;1800:1;1797;1790:12;1749:55;1864:2;1857:4;1849:6;1845:17;1838:4;1830:6;1826:17;1813:54;1911:1;1904:4;1899:2;1891:6;1887:15;1883:26;1876:37;1931:6;1922:15;;;;;;1165:778;;;;:::o;1948:617::-;2045:6;2053;2061;2114:2;2102:9;2093:7;2089:23;2085:32;2082:52;;;2130:1;2127;2120:12;2082:52;2153:29;2172:9;2153:29;:::i;:::-;2143:39;;2233:2;2222:9;2218:18;2205:32;2256:18;2297:2;2289:6;2286:14;2283:34;;;2313:1;2310;2303:12;2283:34;2336:50;2378:7;2369:6;2358:9;2354:22;2336:50;:::i;:::-;2326:60;;2439:2;2428:9;2424:18;2411:32;2395:48;;2468:2;2458:8;2455:16;2452:36;;;2484:1;2481;2474:12;2452:36;;2507:52;2551:7;2540:8;2529:9;2525:24;2507:52;:::i;:::-;2497:62;;;1948:617;;;;;:::o;2801:775::-;2905:6;2913;2921;2929;2982:3;2970:9;2961:7;2957:23;2953:33;2950:53;;;2999:1;2996;2989:12;2950:53;3022:29;3041:9;3022:29;:::i;:::-;3012:39;;3102:2;3091:9;3087:18;3074:32;3125:18;3166:2;3158:6;3155:14;3152:34;;;3182:1;3179;3172:12;3152:34;3205:50;3247:7;3238:6;3227:9;3223:22;3205:50;:::i;:::-;3195:60;;3308:2;3297:9;3293:18;3280:32;3264:48;;3337:2;3327:8;3324:16;3321:36;;;3353:1;3350;3343:12;3321:36;;3376:52;3420:7;3409:8;3398:9;3394:24;3376:52;:::i;:::-;3366:62;;;3478:2;3467:9;3463:18;3450:32;3522:4;3515:5;3511:16;3504:5;3501:27;3491:55;;3542:1;3539;3532:12;3491:55;2801:775;;;;-1:-1:-1;2801:775:357;;-1:-1:-1;;2801:775:357:o;3581:186::-;3640:6;3693:2;3681:9;3672:7;3668:23;3664:32;3661:52;;;3709:1;3706;3699:12;3661:52;3732:29;3751:9;3732:29;:::i;4204:583::-;4465:42;4457:6;4453:55;4442:9;4435:74;4545:3;4540:2;4529:9;4525:18;4518:31;4416:4;4572:46;4613:3;4602:9;4598:19;4590:6;4572:46;:::i;:::-;4666:9;4658:6;4654:22;4649:2;4638:9;4634:18;4627:50;4694:33;4720:6;4712;4694:33;:::i;:::-;4686:41;;;4775:4;4767:6;4763:17;4758:2;4747:9;4743:18;4736:45;4204:583;;;;;;;:::o;4792:685::-;5032:4;5061:42;5142:2;5134:6;5130:15;5119:9;5112:34;5194:2;5186:6;5182:15;5177:2;5166:9;5162:18;5155:43;;5234:3;5229:2;5218:9;5214:18;5207:31;5261:46;5302:3;5291:9;5287:19;5279:6;5261:46;:::i;:::-;5355:9;5347:6;5343:22;5338:2;5327:9;5323:18;5316:50;5383:33;5409:6;5401;5383:33;:::i;:::-;5375:41;;;5465:4;5457:6;5453:17;5447:3;5436:9;5432:19;5425:46;4792:685;;;;;;;;:::o","linkReferences":{}},"methodIdentifiers":{"BRIDGE()":"ee9a31a2","bridge()":"e78cea92","createOptimismMintableERC20(address,string,string)":"ce5ac90f","createOptimismMintableERC20WithDecimals(address,string,string,uint8)":"8cf0629c","createStandardL2Token(address,string,string)":"896f93d1","initialize(address)":"c4d66de8","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"deployer\",\"type\":\"address\"}],\"name\":\"OptimismMintableERC20Created\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"remoteToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"name\":\"StandardL2TokenCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BRIDGE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"createOptimismMintableERC20\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"name\":\"createOptimismMintableERC20WithDecimals\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"createStandardL2Token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridge\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:proxied\":\"@custom:predeployed 0x4200000000000000000000000000000000000012\",\"events\":{\"OptimismMintableERC20Created(address,address,address)\":{\"params\":{\"deployer\":\"Address of the account that deployed the token.\",\"localToken\":\"Address of the created token on the local chain.\",\"remoteToken\":\"Address of the corresponding token on the remote chain.\"}},\"StandardL2TokenCreated(address,address)\":{\"custom:legacy\":\"@notice Emitted whenever a new OptimismMintableERC20 is created. Legacy version of the newer OptimismMintableERC20Created event. We recommend relying on that event instead.\",\"params\":{\"localToken\":\"Address of the created token on the local chain.\",\"remoteToken\":\"Address of the token on the remote chain.\"}}},\"kind\":\"dev\",\"methods\":{\"BRIDGE()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Address of the StandardBridge on this chain.\"}},\"createOptimismMintableERC20(address,string,string)\":{\"params\":{\"_name\":\"ERC20 name.\",\"_remoteToken\":\"Address of the token on the remote chain.\",\"_symbol\":\"ERC20 symbol.\"},\"returns\":{\"_0\":\"Address of the newly created token.\"}},\"createOptimismMintableERC20WithDecimals(address,string,string,uint8)\":{\"params\":{\"_decimals\":\"ERC20 decimals\",\"_name\":\"ERC20 name.\",\"_remoteToken\":\"Address of the token on the remote chain.\",\"_symbol\":\"ERC20 symbol.\"},\"returns\":{\"_0\":\"Address of the newly created token.\"}},\"createStandardL2Token(address,string,string)\":{\"custom:legacy\":\"@notice Creates an instance of the OptimismMintableERC20 contract. Legacy version of the newer createOptimismMintableERC20 function, which has a more intuitive name.\",\"params\":{\"_name\":\"ERC20 name.\",\"_remoteToken\":\"Address of the token on the remote chain.\",\"_symbol\":\"ERC20 symbol.\"},\"returns\":{\"_0\":\"Address of the newly created token.\"}},\"initialize(address)\":{\"params\":{\"_bridge\":\"Address of the StandardBridge on this chain.\"}}},\"stateVariables\":{\"bridge\":{\"custom:network-specific\":\"\"},\"spacer_0_2_30\":{\"custom:spacer\":\"OptimismMintableERC20Factory's initializer slot spacing\"},\"version\":{\"custom:semver\":\"1.9.0\"}},\"title\":\"OptimismMintableERC20Factory\",\"version\":1},\"userdoc\":{\"events\":{\"OptimismMintableERC20Created(address,address,address)\":{\"notice\":\"Emitted whenever a new OptimismMintableERC20 is created.\"}},\"kind\":\"user\",\"methods\":{\"BRIDGE()\":{\"notice\":\"Getter function for the address of the StandardBridge on this chain. Public getter is legacy and will be removed in the future. Use `bridge` instead.\"},\"bridge()\":{\"notice\":\"Address of the StandardBridge on this chain.\"},\"constructor\":{\"notice\":\"Constructs the OptimismMintableERC20Factory contract.\"},\"createOptimismMintableERC20(address,string,string)\":{\"notice\":\"Creates an instance of the OptimismMintableERC20 contract.\"},\"createOptimismMintableERC20WithDecimals(address,string,string,uint8)\":{\"notice\":\"Creates an instance of the OptimismMintableERC20 contract, with specified decimals.\"},\"initialize(address)\":{\"notice\":\"Initializes the contract.\"},\"version()\":{\"notice\":\"The semver MUST be bumped any time that there is a change in the OptimismMintableERC20 token contract since this contract is responsible for deploying OptimismMintableERC20 contracts.Semantic version.\"}},\"notice\":\"OptimismMintableERC20Factory is a factory contract that generates OptimismMintableERC20 contracts on the network it's deployed to. Simplifies the deployment process for users who may be less familiar with deploying smart contracts. Designed to be backwards compatible with the older StandardL2ERC20Factory contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/universal/OptimismMintableERC20Factory.sol\":\"OptimismMintableERC20Factory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0\",\"dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"src/universal/IOptimismMintableERC20.sol\":{\"keccak256\":\"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf\",\"dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"src/universal/OptimismMintableERC20.sol\":{\"keccak256\":\"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7\",\"dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa\"]},\"src/universal/OptimismMintableERC20Factory.sol\":{\"keccak256\":\"0xb508dc7b6f7fbf6e7156a11ae7a1e6ceed86f627c82b94d4f37dd98691b5e00f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5e27f27581f94a983c92809aeda85232e37e1de4552777fbf734c9a0fd84a5a9\",\"dweb:/ipfs/QmVNzxCwipUN2UgcrYf8n7Ei7y6uE76cCYcorAwRg96Kp3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"localToken","type":"address","indexed":true},{"internalType":"address","name":"remoteToken","type":"address","indexed":true},{"internalType":"address","name":"deployer","type":"address","indexed":false}],"type":"event","name":"OptimismMintableERC20Created","anonymous":false},{"inputs":[{"internalType":"address","name":"remoteToken","type":"address","indexed":true},{"internalType":"address","name":"localToken","type":"address","indexed":true}],"type":"event","name":"StandardL2TokenCreated","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"BRIDGE","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"createOptimismMintableERC20","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"createOptimismMintableERC20WithDecimals","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"createStandardL2Token","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_bridge","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"BRIDGE()":{"custom:legacy":"","returns":{"_0":"Address of the StandardBridge on this chain."}},"createOptimismMintableERC20(address,string,string)":{"params":{"_name":"ERC20 name.","_remoteToken":"Address of the token on the remote chain.","_symbol":"ERC20 symbol."},"returns":{"_0":"Address of the newly created token."}},"createOptimismMintableERC20WithDecimals(address,string,string,uint8)":{"params":{"_decimals":"ERC20 decimals","_name":"ERC20 name.","_remoteToken":"Address of the token on the remote chain.","_symbol":"ERC20 symbol."},"returns":{"_0":"Address of the newly created token."}},"createStandardL2Token(address,string,string)":{"custom:legacy":"@notice Creates an instance of the OptimismMintableERC20 contract. Legacy version of the newer createOptimismMintableERC20 function, which has a more intuitive name.","params":{"_name":"ERC20 name.","_remoteToken":"Address of the token on the remote chain.","_symbol":"ERC20 symbol."},"returns":{"_0":"Address of the newly created token."}},"initialize(address)":{"params":{"_bridge":"Address of the StandardBridge on this chain."}}},"version":1},"userdoc":{"kind":"user","methods":{"BRIDGE()":{"notice":"Getter function for the address of the StandardBridge on this chain. Public getter is legacy and will be removed in the future. Use `bridge` instead."},"bridge()":{"notice":"Address of the StandardBridge on this chain."},"constructor":{"notice":"Constructs the OptimismMintableERC20Factory contract."},"createOptimismMintableERC20(address,string,string)":{"notice":"Creates an instance of the OptimismMintableERC20 contract."},"createOptimismMintableERC20WithDecimals(address,string,string,uint8)":{"notice":"Creates an instance of the OptimismMintableERC20 contract, with specified decimals."},"initialize(address)":{"notice":"Initializes the contract."},"version()":{"notice":"The semver MUST be bumped any time that there is a change in the OptimismMintableERC20 token contract since this contract is responsible for deploying OptimismMintableERC20 contracts.Semantic version."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/universal/OptimismMintableERC20Factory.sol":"OptimismMintableERC20Factory"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66","urls":["bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f","dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"keccak256":"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238","urls":["bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0","dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca","urls":["bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd","dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1","urls":["bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f","dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy"],"license":"MIT"},"src/universal/IOptimismMintableERC20.sol":{"keccak256":"0x6f8133b39efcbcbd5088f195dfacf1bedc3146508429c3865443909af735a04c","urls":["bzz-raw://adc36971e2e120458769f050428d9d2b0504516660345020c2521ee46e6d8abf","dweb:/ipfs/QmPbFusQkZgGKpU8Fv5JoqL4oVeJtM3yqnhRGLY9eZT5zZ"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"},"src/universal/OptimismMintableERC20.sol":{"keccak256":"0x18721f41a831ec39d47002e73ecc2aa3e6624f8d1ab7b9f25b53348e8b0765df","urls":["bzz-raw://2162fa7529a77b199a07f37fca26c778542f6c8805f0365f1ceef90c5cd3a3a7","dweb:/ipfs/QmaMmHJS52Bp95AGnrjh1zV7fLLqV3uAbFzkVLziMnPJYa"],"license":"MIT"},"src/universal/OptimismMintableERC20Factory.sol":{"keccak256":"0xb508dc7b6f7fbf6e7156a11ae7a1e6ceed86f627c82b94d4f37dd98691b5e00f","urls":["bzz-raw://5e27f27581f94a983c92809aeda85232e37e1de4552777fbf734c9a0fd84a5a9","dweb:/ipfs/QmVNzxCwipUN2UgcrYf8n7Ei7y6uE76cCYcorAwRg96Kp3"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":49534,"contract":"src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":49537,"contract":"src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":109661,"contract":"src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory","label":"spacer_0_2_30","offset":2,"slot":"0","type":"t_bytes30"},{"astId":109664,"contract":"src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory","label":"bridge","offset":0,"slot":"1","type":"t_address"},{"astId":109669,"contract":"src/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory","label":"__gap","offset":0,"slot":"2","type":"t_array(t_uint256)49_storage"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_uint256)49_storage":{"encoding":"inplace","label":"uint256[49]","numberOfBytes":"1568","base":"t_uint256"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes30":{"encoding":"inplace","label":"bytes30","numberOfBytes":"30"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"version":1,"kind":"user","methods":{"BRIDGE()":{"notice":"Getter function for the address of the StandardBridge on this chain. Public getter is legacy and will be removed in the future. Use `bridge` instead."},"bridge()":{"notice":"Address of the StandardBridge on this chain."},"constructor":{"notice":"Constructs the OptimismMintableERC20Factory contract."},"createOptimismMintableERC20(address,string,string)":{"notice":"Creates an instance of the OptimismMintableERC20 contract."},"createOptimismMintableERC20WithDecimals(address,string,string,uint8)":{"notice":"Creates an instance of the OptimismMintableERC20 contract, with specified decimals."},"initialize(address)":{"notice":"Initializes the contract."},"version()":{"notice":"The semver MUST be bumped any time that there is a change in the OptimismMintableERC20 token contract since this contract is responsible for deploying OptimismMintableERC20 contracts.Semantic version."}},"events":{"OptimismMintableERC20Created(address,address,address)":{"notice":"Emitted whenever a new OptimismMintableERC20 is created."}},"notice":"OptimismMintableERC20Factory is a factory contract that generates OptimismMintableERC20 contracts on the network it's deployed to. Simplifies the deployment process for users who may be less familiar with deploying smart contracts. Designed to be backwards compatible with the older StandardL2ERC20Factory contract."},"devdoc":{"version":1,"kind":"dev","methods":{"BRIDGE()":{"returns":{"_0":"Address of the StandardBridge on this chain."}},"createOptimismMintableERC20(address,string,string)":{"params":{"_name":"ERC20 name.","_remoteToken":"Address of the token on the remote chain.","_symbol":"ERC20 symbol."},"returns":{"_0":"Address of the newly created token."}},"createOptimismMintableERC20WithDecimals(address,string,string,uint8)":{"params":{"_decimals":"ERC20 decimals","_name":"ERC20 name.","_remoteToken":"Address of the token on the remote chain.","_symbol":"ERC20 symbol."},"returns":{"_0":"Address of the newly created token."}},"createStandardL2Token(address,string,string)":{"params":{"_name":"ERC20 name.","_remoteToken":"Address of the token on the remote chain.","_symbol":"ERC20 symbol."},"returns":{"_0":"Address of the newly created token."}},"initialize(address)":{"params":{"_bridge":"Address of the StandardBridge on this chain."}}},"events":{"OptimismMintableERC20Created(address,address,address)":{"params":{"deployer":"Address of the account that deployed the token.","localToken":"Address of the created token on the local chain.","remoteToken":"Address of the corresponding token on the remote chain."}},"StandardL2TokenCreated(address,address)":{"params":{"localToken":"Address of the created token on the local chain.","remoteToken":"Address of the token on the remote chain."}}},"title":"OptimismMintableERC20Factory"},"ast":{"absolutePath":"src/universal/OptimismMintableERC20Factory.sol","id":109832,"exportedSymbols":{"ISemver":[109417],"Initializable":[49678],"OptimismMintableERC20":[109645],"OptimismMintableERC20Factory":[109831]},"nodeType":"SourceUnit","src":"32:5832:230","nodes":[{"id":109647,"nodeType":"PragmaDirective","src":"32:23:230","nodes":[],"literals":["solidity","0.8",".15"]},{"id":109649,"nodeType":"ImportDirective","src":"57:80:230","nodes":[],"absolutePath":"src/universal/OptimismMintableERC20.sol","file":"src/universal/OptimismMintableERC20.sol","nameLocation":"-1:-1:-1","scope":109832,"sourceUnit":109646,"symbolAliases":[{"foreign":{"id":109648,"name":"OptimismMintableERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109645,"src":"66:21:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":109651,"nodeType":"ImportDirective","src":"138:52:230","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":109832,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":109650,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"147:7:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":109653,"nodeType":"ImportDirective","src":"191:86:230","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol","file":"@openzeppelin/contracts/proxy/utils/Initializable.sol","nameLocation":"-1:-1:-1","scope":109832,"sourceUnit":49679,"symbolAliases":[{"foreign":{"id":109652,"name":"Initializable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":49678,"src":"200:13:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":109831,"nodeType":"ContractDefinition","src":"770:5093:230","nodes":[{"id":109661,"nodeType":"VariableDeclaration","src":"985:29:230","nodes":[],"constant":false,"documentation":{"id":109659,"nodeType":"StructuredDocumentation","src":"840:140:230","text":"@custom:spacer OptimismMintableERC20Factory's initializer slot spacing\n @notice Spacer to avoid packing into the initializer slot"},"mutability":"mutable","name":"spacer_0_2_30","nameLocation":"1001:13:230","scope":109831,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes30","typeString":"bytes30"},"typeName":{"id":109660,"name":"bytes30","nodeType":"ElementaryTypeName","src":"985:7:230","typeDescriptions":{"typeIdentifier":"t_bytes30","typeString":"bytes30"}},"visibility":"private"},{"id":109664,"nodeType":"VariableDeclaration","src":"1115:21:230","nodes":[],"constant":false,"documentation":{"id":109662,"nodeType":"StructuredDocumentation","src":"1021:89:230","text":"@notice Address of the StandardBridge on this chain.\n @custom:network-specific"},"functionSelector":"e78cea92","mutability":"mutable","name":"bridge","nameLocation":"1130:6:230","scope":109831,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109663,"name":"address","nodeType":"ElementaryTypeName","src":"1115:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":109669,"nodeType":"VariableDeclaration","src":"1370:25:230","nodes":[],"constant":false,"documentation":{"id":109665,"nodeType":"StructuredDocumentation","src":"1143:222:230","text":"@notice Reserve extra slots in the storage layout for future upgrades.\n A gap size of 49 was chosen here, so that the first slot used in a child contract\n would be 1 plus a multiple of 50."},"mutability":"mutable","name":"__gap","nameLocation":"1390:5:230","scope":109831,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$49_storage","typeString":"uint256[49]"},"typeName":{"baseType":{"id":109666,"name":"uint256","nodeType":"ElementaryTypeName","src":"1370:7:230","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":109668,"length":{"hexValue":"3439","id":109667,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1378:2:230","typeDescriptions":{"typeIdentifier":"t_rational_49_by_1","typeString":"int_const 49"},"value":"49"},"nodeType":"ArrayTypeName","src":"1370:11:230","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$49_storage_ptr","typeString":"uint256[49]"}},"visibility":"private"},{"id":109676,"nodeType":"EventDefinition","src":"1767:86:230","nodes":[],"anonymous":false,"documentation":{"id":109670,"nodeType":"StructuredDocumentation","src":"1402:360:230","text":"@custom:legacy\n @notice Emitted whenever a new OptimismMintableERC20 is created. Legacy version of the newer\n OptimismMintableERC20Created event. We recommend relying on that event instead.\n @param remoteToken Address of the token on the remote chain.\n @param localToken Address of the created token on the local chain."},"eventSelector":"ceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf","name":"StandardL2TokenCreated","nameLocation":"1773:22:230","parameters":{"id":109675,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109672,"indexed":true,"mutability":"mutable","name":"remoteToken","nameLocation":"1812:11:230","nodeType":"VariableDeclaration","scope":109676,"src":"1796:27:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109671,"name":"address","nodeType":"ElementaryTypeName","src":"1796:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109674,"indexed":true,"mutability":"mutable","name":"localToken","nameLocation":"1841:10:230","nodeType":"VariableDeclaration","scope":109676,"src":"1825:26:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109673,"name":"address","nodeType":"ElementaryTypeName","src":"1825:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1795:57:230"}},{"id":109685,"nodeType":"EventDefinition","src":"2166:110:230","nodes":[],"anonymous":false,"documentation":{"id":109677,"nodeType":"StructuredDocumentation","src":"1859:302:230","text":"@notice Emitted whenever a new OptimismMintableERC20 is created.\n @param localToken Address of the created token on the local chain.\n @param remoteToken Address of the corresponding token on the remote chain.\n @param deployer Address of the account that deployed the token."},"eventSelector":"52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb","name":"OptimismMintableERC20Created","nameLocation":"2172:28:230","parameters":{"id":109684,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109679,"indexed":true,"mutability":"mutable","name":"localToken","nameLocation":"2217:10:230","nodeType":"VariableDeclaration","scope":109685,"src":"2201:26:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109678,"name":"address","nodeType":"ElementaryTypeName","src":"2201:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109681,"indexed":true,"mutability":"mutable","name":"remoteToken","nameLocation":"2245:11:230","nodeType":"VariableDeclaration","scope":109685,"src":"2229:27:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109680,"name":"address","nodeType":"ElementaryTypeName","src":"2229:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109683,"indexed":false,"mutability":"mutable","name":"deployer","nameLocation":"2266:8:230","nodeType":"VariableDeclaration","scope":109685,"src":"2258:16:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109682,"name":"address","nodeType":"ElementaryTypeName","src":"2258:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2200:75:230"}},{"id":109689,"nodeType":"VariableDeclaration","src":"2577:40:230","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":109686,"nodeType":"StructuredDocumentation","src":"2282:290:230","text":"@notice The semver MUST be bumped any time that there is a change in\n the OptimismMintableERC20 token contract since this contract\n is responsible for deploying OptimismMintableERC20 contracts.\n @notice Semantic version.\n @custom:semver 1.9.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"2600:7:230","scope":109831,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":109687,"name":"string","nodeType":"ElementaryTypeName","src":"2577:6:230","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"312e392e30","id":109688,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2610:7:230","typeDescriptions":{"typeIdentifier":"t_stringliteral_48b337767c221abef259fe87e655d8fa1026fb5e60ec68ad68fa7e00bb7f050c","typeString":"literal_string \"1.9.0\""},"value":"1.9.0"},"visibility":"public"},{"id":109701,"nodeType":"FunctionDefinition","src":"2694:66:230","nodes":[],"body":{"id":109700,"nodeType":"Block","src":"2708:52:230","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"30","id":109696,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2748:1:230","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":109695,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2740:7:230","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":109694,"name":"address","nodeType":"ElementaryTypeName","src":"2740:7:230","typeDescriptions":{}}},"id":109697,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2740:10:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":109693,"name":"initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109714,"src":"2718:10:230","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":109698,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_bridge"],"nodeType":"FunctionCall","src":"2718:35:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":109699,"nodeType":"ExpressionStatement","src":"2718:35:230"}]},"documentation":{"id":109690,"nodeType":"StructuredDocumentation","src":"2624:65:230","text":"@notice Constructs the OptimismMintableERC20Factory contract."},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":109691,"nodeType":"ParameterList","parameters":[],"src":"2705:2:230"},"returnParameters":{"id":109692,"nodeType":"ParameterList","parameters":[],"src":"2708:0:230"},"scope":109831,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":109714,"nodeType":"FunctionDefinition","src":"2876:89:230","nodes":[],"body":{"id":109713,"nodeType":"Block","src":"2932:33:230","nodes":[],"statements":[{"expression":{"id":109711,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":109709,"name":"bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109664,"src":"2942:6:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":109710,"name":"_bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109704,"src":"2951:7:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2942:16:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":109712,"nodeType":"ExpressionStatement","src":"2942:16:230"}]},"documentation":{"id":109702,"nodeType":"StructuredDocumentation","src":"2766:105:230","text":"@notice Initializes the contract.\n @param _bridge Address of the StandardBridge on this chain."},"functionSelector":"c4d66de8","implemented":true,"kind":"function","modifiers":[{"id":109707,"kind":"modifierInvocation","modifierName":{"id":109706,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":49598,"src":"2920:11:230"},"nodeType":"ModifierInvocation","src":"2920:11:230"}],"name":"initialize","nameLocation":"2885:10:230","parameters":{"id":109705,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109704,"mutability":"mutable","name":"_bridge","nameLocation":"2904:7:230","nodeType":"VariableDeclaration","scope":109714,"src":"2896:15:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109703,"name":"address","nodeType":"ElementaryTypeName","src":"2896:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2895:17:230"},"returnParameters":{"id":109708,"nodeType":"ParameterList","parameters":[],"src":"2932:0:230"},"scope":109831,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":109723,"nodeType":"FunctionDefinition","src":"3237:80:230","nodes":[],"body":{"id":109722,"nodeType":"Block","src":"3287:30:230","nodes":[],"statements":[{"expression":{"id":109720,"name":"bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109664,"src":"3304:6:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":109719,"id":109721,"nodeType":"Return","src":"3297:13:230"}]},"documentation":{"id":109715,"nodeType":"StructuredDocumentation","src":"2971:261:230","text":"@notice Getter function for the address of the StandardBridge on this chain.\n Public getter is legacy and will be removed in the future. Use `bridge` instead.\n @return Address of the StandardBridge on this chain.\n @custom:legacy"},"functionSelector":"ee9a31a2","implemented":true,"kind":"function","modifiers":[],"name":"BRIDGE","nameLocation":"3246:6:230","parameters":{"id":109716,"nodeType":"ParameterList","parameters":[],"src":"3252:2:230"},"returnParameters":{"id":109719,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109718,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":109723,"src":"3278:7:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109717,"name":"address","nodeType":"ElementaryTypeName","src":"3278:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3277:9:230"},"scope":109831,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":109742,"nodeType":"FunctionDefinition","src":"3740:255:230","nodes":[],"body":{"id":109741,"nodeType":"Block","src":"3914:81:230","nodes":[],"statements":[{"expression":{"arguments":[{"id":109736,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109726,"src":"3959:12:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":109737,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109728,"src":"3973:5:230","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":109738,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109730,"src":"3980:7:230","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":109735,"name":"createOptimismMintableERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109762,"src":"3931:27:230","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_address_$","typeString":"function (address,string memory,string memory) returns (address)"}},"id":109739,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3931:57:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":109734,"id":109740,"nodeType":"Return","src":"3924:64:230"}]},"documentation":{"id":109724,"nodeType":"StructuredDocumentation","src":"3323:412:230","text":"@custom:legacy\n @notice Creates an instance of the OptimismMintableERC20 contract. Legacy version of the\n newer createOptimismMintableERC20 function, which has a more intuitive name.\n @param _remoteToken Address of the token on the remote chain.\n @param _name ERC20 name.\n @param _symbol ERC20 symbol.\n @return Address of the newly created token."},"functionSelector":"896f93d1","implemented":true,"kind":"function","modifiers":[],"name":"createStandardL2Token","nameLocation":"3749:21:230","parameters":{"id":109731,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109726,"mutability":"mutable","name":"_remoteToken","nameLocation":"3788:12:230","nodeType":"VariableDeclaration","scope":109742,"src":"3780:20:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109725,"name":"address","nodeType":"ElementaryTypeName","src":"3780:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109728,"mutability":"mutable","name":"_name","nameLocation":"3824:5:230","nodeType":"VariableDeclaration","scope":109742,"src":"3810:19:230","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":109727,"name":"string","nodeType":"ElementaryTypeName","src":"3810:6:230","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":109730,"mutability":"mutable","name":"_symbol","nameLocation":"3853:7:230","nodeType":"VariableDeclaration","scope":109742,"src":"3839:21:230","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":109729,"name":"string","nodeType":"ElementaryTypeName","src":"3839:6:230","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3770:96:230"},"returnParameters":{"id":109734,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109733,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":109742,"src":"3901:7:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109732,"name":"address","nodeType":"ElementaryTypeName","src":"3901:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3900:9:230"},"scope":109831,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":109762,"nodeType":"FunctionDefinition","src":"4280:275:230","nodes":[],"body":{"id":109761,"nodeType":"Block","src":"4458:97:230","nodes":[],"statements":[{"expression":{"arguments":[{"id":109755,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109745,"src":"4515:12:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":109756,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109747,"src":"4529:5:230","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":109757,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109749,"src":"4536:7:230","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"3138","id":109758,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4545:2:230","typeDescriptions":{"typeIdentifier":"t_rational_18_by_1","typeString":"int_const 18"},"value":"18"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_rational_18_by_1","typeString":"int_const 18"}],"id":109754,"name":"createOptimismMintableERC20WithDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109830,"src":"4475:39:230","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$returns$_t_address_$","typeString":"function (address,string memory,string memory,uint8) returns (address)"}},"id":109759,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4475:73:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":109753,"id":109760,"nodeType":"Return","src":"4468:80:230"}]},"documentation":{"id":109743,"nodeType":"StructuredDocumentation","src":"4001:274:230","text":"@notice Creates an instance of the OptimismMintableERC20 contract.\n @param _remoteToken Address of the token on the remote chain.\n @param _name ERC20 name.\n @param _symbol ERC20 symbol.\n @return Address of the newly created token."},"functionSelector":"ce5ac90f","implemented":true,"kind":"function","modifiers":[],"name":"createOptimismMintableERC20","nameLocation":"4289:27:230","parameters":{"id":109750,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109745,"mutability":"mutable","name":"_remoteToken","nameLocation":"4334:12:230","nodeType":"VariableDeclaration","scope":109762,"src":"4326:20:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109744,"name":"address","nodeType":"ElementaryTypeName","src":"4326:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109747,"mutability":"mutable","name":"_name","nameLocation":"4370:5:230","nodeType":"VariableDeclaration","scope":109762,"src":"4356:19:230","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":109746,"name":"string","nodeType":"ElementaryTypeName","src":"4356:6:230","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":109749,"mutability":"mutable","name":"_symbol","nameLocation":"4399:7:230","nodeType":"VariableDeclaration","scope":109762,"src":"4385:21:230","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":109748,"name":"string","nodeType":"ElementaryTypeName","src":"4385:6:230","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"4316:96:230"},"returnParameters":{"id":109753,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109752,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":109762,"src":"4445:7:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109751,"name":"address","nodeType":"ElementaryTypeName","src":"4445:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4444:9:230"},"scope":109831,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":109830,"nodeType":"FunctionDefinition","src":"4908:953:230","nodes":[],"body":{"id":109829,"nodeType":"Block","src":"5123:738:230","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":109782,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":109777,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109765,"src":"5141:12:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":109780,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5165:1:230","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":109779,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5157:7:230","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":109778,"name":"address","nodeType":"ElementaryTypeName","src":"5157:7:230","typeDescriptions":{}}},"id":109781,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5157:10:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5141:26:230","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d4d696e7461626c654552433230466163746f72793a206d7573742070726f766964652072656d6f746520746f6b656e2061646472657373","id":109783,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5169:65:230","typeDescriptions":{"typeIdentifier":"t_stringliteral_1fc9c38ce58e5889170de515a92b1e54913f12f8fd8aa9ab11446ca47e097779","typeString":"literal_string \"OptimismMintableERC20Factory: must provide remote token address\""},"value":"OptimismMintableERC20Factory: must provide remote token address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_1fc9c38ce58e5889170de515a92b1e54913f12f8fd8aa9ab11446ca47e097779","typeString":"literal_string \"OptimismMintableERC20Factory: must provide remote token address\""}],"id":109776,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5133:7:230","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":109784,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5133:102:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":109785,"nodeType":"ExpressionStatement","src":"5133:102:230"},{"assignments":[109787],"declarations":[{"constant":false,"id":109787,"mutability":"mutable","name":"salt","nameLocation":"5254:4:230","nodeType":"VariableDeclaration","scope":109829,"src":"5246:12:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":109786,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5246:7:230","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":109797,"initialValue":{"arguments":[{"arguments":[{"id":109791,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109765,"src":"5282:12:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":109792,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109767,"src":"5296:5:230","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":109793,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109769,"src":"5303:7:230","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":109794,"name":"_decimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109771,"src":"5312:9:230","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"expression":{"id":109789,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5271:3:230","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":109790,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"5271:10:230","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":109795,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5271:51:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":109788,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"5261:9:230","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":109796,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5261:62:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"5246:77:230"},{"assignments":[109799],"declarations":[{"constant":false,"id":109799,"mutability":"mutable","name":"localToken","nameLocation":"5341:10:230","nodeType":"VariableDeclaration","scope":109829,"src":"5333:18:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109798,"name":"address","nodeType":"ElementaryTypeName","src":"5333:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":109814,"initialValue":{"arguments":[{"arguments":[{"id":109807,"name":"bridge","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109664,"src":"5414:6:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":109808,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109765,"src":"5422:12:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":109809,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109767,"src":"5436:5:230","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":109810,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109769,"src":"5443:7:230","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":109811,"name":"_decimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109771,"src":"5452:9:230","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":109804,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"5374:25:230","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_address_$_t_address_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$returns$_t_contract$_OptimismMintableERC20_$109645_$","typeString":"function (address,address,string memory,string memory,uint8) returns (contract OptimismMintableERC20)"},"typeName":{"id":109803,"nodeType":"UserDefinedTypeName","pathNode":{"id":109802,"name":"OptimismMintableERC20","nodeType":"IdentifierPath","referencedDeclaration":109645,"src":"5378:21:230"},"referencedDeclaration":109645,"src":"5378:21:230","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismMintableERC20_$109645","typeString":"contract OptimismMintableERC20"}}},"id":109806,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["salt"],"nodeType":"FunctionCallOptions","options":[{"id":109805,"name":"salt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109787,"src":"5407:4:230","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"src":"5374:39:230","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_address_$_t_address_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$returns$_t_contract$_OptimismMintableERC20_$109645_$salt","typeString":"function (address,address,string memory,string memory,uint8) returns (contract OptimismMintableERC20)"}},"id":109812,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5374:88:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_OptimismMintableERC20_$109645","typeString":"contract OptimismMintableERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_OptimismMintableERC20_$109645","typeString":"contract OptimismMintableERC20"}],"id":109801,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5366:7:230","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":109800,"name":"address","nodeType":"ElementaryTypeName","src":"5366:7:230","typeDescriptions":{}}},"id":109813,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5366:97:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"5333:130:230"},{"eventCall":{"arguments":[{"id":109816,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109765,"src":"5556:12:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":109817,"name":"localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109799,"src":"5570:10:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":109815,"name":"StandardL2TokenCreated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109676,"src":"5533:22:230","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":109818,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5533:48:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":109819,"nodeType":"EmitStatement","src":"5528:53:230"},{"eventCall":{"arguments":[{"id":109821,"name":"localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109799,"src":"5789:10:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":109822,"name":"_remoteToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109765,"src":"5801:12:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":109823,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5815:3:230","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":109824,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5815:10:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":109820,"name":"OptimismMintableERC20Created","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109685,"src":"5760:28:230","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$returns$__$","typeString":"function (address,address,address)"}},"id":109825,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5760:66:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":109826,"nodeType":"EmitStatement","src":"5755:71:230"},{"expression":{"id":109827,"name":"localToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109799,"src":"5844:10:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":109775,"id":109828,"nodeType":"Return","src":"5837:17:230"}]},"documentation":{"id":109763,"nodeType":"StructuredDocumentation","src":"4561:342:230","text":"@notice Creates an instance of the OptimismMintableERC20 contract, with specified decimals.\n @param _remoteToken Address of the token on the remote chain.\n @param _name ERC20 name.\n @param _symbol ERC20 symbol.\n @param _decimals ERC20 decimals\n @return Address of the newly created token."},"functionSelector":"8cf0629c","implemented":true,"kind":"function","modifiers":[],"name":"createOptimismMintableERC20WithDecimals","nameLocation":"4917:39:230","parameters":{"id":109772,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109765,"mutability":"mutable","name":"_remoteToken","nameLocation":"4974:12:230","nodeType":"VariableDeclaration","scope":109830,"src":"4966:20:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109764,"name":"address","nodeType":"ElementaryTypeName","src":"4966:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":109767,"mutability":"mutable","name":"_name","nameLocation":"5010:5:230","nodeType":"VariableDeclaration","scope":109830,"src":"4996:19:230","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":109766,"name":"string","nodeType":"ElementaryTypeName","src":"4996:6:230","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":109769,"mutability":"mutable","name":"_symbol","nameLocation":"5039:7:230","nodeType":"VariableDeclaration","scope":109830,"src":"5025:21:230","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":109768,"name":"string","nodeType":"ElementaryTypeName","src":"5025:6:230","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":109771,"mutability":"mutable","name":"_decimals","nameLocation":"5062:9:230","nodeType":"VariableDeclaration","scope":109830,"src":"5056:15:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":109770,"name":"uint8","nodeType":"ElementaryTypeName","src":"5056:5:230","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"4956:121:230"},"returnParameters":{"id":109775,"nodeType":"ParameterList","parameters":[{"constant":false,"id":109774,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":109830,"src":"5110:7:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":109773,"name":"address","nodeType":"ElementaryTypeName","src":"5110:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5109:9:230"},"scope":109831,"stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"abstract":false,"baseContracts":[{"baseName":{"id":109655,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"811:7:230"},"id":109656,"nodeType":"InheritanceSpecifier","src":"811:7:230"},{"baseName":{"id":109657,"name":"Initializable","nodeType":"IdentifierPath","referencedDeclaration":49678,"src":"820:13:230"},"id":109658,"nodeType":"InheritanceSpecifier","src":"820:13:230"}],"canonicalName":"OptimismMintableERC20Factory","contractDependencies":[109645],"contractKind":"contract","documentation":{"id":109654,"nodeType":"StructuredDocumentation","src":"279:491:230","text":"@custom:proxied\n @custom:predeployed 0x4200000000000000000000000000000000000012\n @title OptimismMintableERC20Factory\n @notice OptimismMintableERC20Factory is a factory contract that generates OptimismMintableERC20\n contracts on the network it's deployed to. Simplifies the deployment process for users\n who may be less familiar with deploying smart contracts. Designed to be backwards\n compatible with the older StandardL2ERC20Factory contract."},"fullyImplemented":true,"linearizedBaseContracts":[109831,49678,109417],"name":"OptimismMintableERC20Factory","nameLocation":"779:28:230","scope":109832,"usedErrors":[]}],"license":"MIT"},"id":230} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/OptimismPortal.json b/packages/sdk/src/forge-artifacts/OptimismPortal.json new file mode 100644 index 000000000000..4d3e3388ce41 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/OptimismPortal.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"depositTransaction","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_gasLimit","type":"uint64","internalType":"uint64"},{"name":"_isCreation","type":"bool","internalType":"bool"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"donateETH","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"finalizeWithdrawalTransaction","inputs":[{"name":"_tx","type":"tuple","internalType":"struct Types.WithdrawalTransaction","components":[{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"sender","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"gasLimit","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finalizedWithdrawals","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"guardian","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_l2Oracle","type":"address","internalType":"contract L2OutputOracle"},{"name":"_systemConfig","type":"address","internalType":"contract SystemConfig"},{"name":"_superchainConfig","type":"address","internalType":"contract SuperchainConfig"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isOutputFinalized","inputs":[{"name":"_l2OutputIndex","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"l2Oracle","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract L2OutputOracle"}],"stateMutability":"view"},{"type":"function","name":"l2Sender","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"minimumGasLimit","inputs":[{"name":"_byteCount","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"pure"},{"type":"function","name":"params","inputs":[],"outputs":[{"name":"prevBaseFee","type":"uint128","internalType":"uint128"},{"name":"prevBoughtGas","type":"uint64","internalType":"uint64"},{"name":"prevBlockNum","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"paused_","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"proveWithdrawalTransaction","inputs":[{"name":"_tx","type":"tuple","internalType":"struct Types.WithdrawalTransaction","components":[{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"sender","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"gasLimit","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}]},{"name":"_l2OutputIndex","type":"uint256","internalType":"uint256"},{"name":"_outputRootProof","type":"tuple","internalType":"struct Types.OutputRootProof","components":[{"name":"version","type":"bytes32","internalType":"bytes32"},{"name":"stateRoot","type":"bytes32","internalType":"bytes32"},{"name":"messagePasserStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"latestBlockhash","type":"bytes32","internalType":"bytes32"}]},{"name":"_withdrawalProof","type":"bytes[]","internalType":"bytes[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"provenWithdrawals","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"outputRoot","type":"bytes32","internalType":"bytes32"},{"name":"timestamp","type":"uint128","internalType":"uint128"},{"name":"l2OutputIndex","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"type":"function","name":"superchainConfig","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract SuperchainConfig"}],"stateMutability":"view"},{"type":"function","name":"systemConfig","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract SystemConfig"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"TransactionDeposited","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"version","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"opaqueData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"WithdrawalFinalized","inputs":[{"name":"withdrawalHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"success","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"WithdrawalProven","inputs":[{"name":"withdrawalHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"BadTarget","inputs":[]},{"type":"error","name":"CallPaused","inputs":[]},{"type":"error","name":"GasEstimation","inputs":[]},{"type":"error","name":"LargeCalldata","inputs":[]},{"type":"error","name":"OutOfGas","inputs":[]},{"type":"error","name":"SmallGasLimit","inputs":[]}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028f565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001c160201b6200191f1760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603680546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b03191661010085841602179055603254166200016a57603280546001600160a01b03191661dead1790555b62000174620001d0565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200023d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600154600160c01b90046001600160401b03166000036200028d5760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b615142806200029f6000396000f3fe6080604052600436106101125760003560e01c80638c3152e9116100a5578063a35d99df11610074578063cff0ab9611610059578063cff0ab961461039a578063e965084c1461043b578063e9e05c42146104c757600080fd5b8063a35d99df14610341578063c0c53b8b1461037a57600080fd5b80638c3152e9146102975780639b5f694a146102b75780639bf62d82146102e4578063a14238e71461031157600080fd5b806354fd4d50116100e157806354fd4d50146101fc5780635c975abb146102525780636dbffb78146102775780638b4c40b01461013757600080fd5b806333d7e2bd1461013e57806335e80ab314610195578063452a9320146101c75780634870496f146101dc57600080fd5b36610139576101373334620186a06000604051806020016040528060008152506104d5565b005b600080fd5b34801561014a57600080fd5b5060375461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101a157600080fd5b5060355461016b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156101d357600080fd5b5061016b610692565b3480156101e857600080fd5b506101376101f7366004614709565b61072a565b34801561020857600080fd5b506102456040518060400160405280600581526020017f322e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161018c919061485b565b34801561025e57600080fd5b50610267610d2d565b604051901515815260200161018c565b34801561028357600080fd5b5061026761029236600461486e565b610dc0565b3480156102a357600080fd5b506101376102b2366004614887565b610e7d565b3480156102c357600080fd5b5060365461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102f057600080fd5b5060325461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561031d57600080fd5b5061026761032c36600461486e565b60336020526000908152604090205460ff1681565b34801561034d57600080fd5b5061036161035c3660046148e1565b6116b8565b60405167ffffffffffffffff909116815260200161018c565b34801561038657600080fd5b506101376103953660046148fc565b6116d1565b3480156103a657600080fd5b50600154610402906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161018c565b34801561044757600080fd5b5061049961045636600461486e565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff928316602085015291169082015260600161018c565b6101376104d5366004614955565b8260005a90508380156104fd575073ffffffffffffffffffffffffffffffffffffffff871615155b15610534576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61053e83516116b8565b67ffffffffffffffff168567ffffffffffffffff16101561058b576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0835111156105c9576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146105ea575033731111000000000000000000000000000000001111015b600034888888886040516020016106059594939291906149d2565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610675919061485b565b60405180910390a45050610689828261193b565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614a37565b905090565b610732610d2d565b15610769576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff160361082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084015b60405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561089d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c19190614a74565b5190506108db6108d636869003860186614ad9565b611c12565b8114610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f6600000000000000000000000000000000000000000000006064820152608401610824565b600061097487611c6e565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610a8a5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614a74565b5114155b610b16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610824565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610bdf9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610bd5888a614b3f565b8a60400135611c9e565b610c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610824565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614bc3565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610e759173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190614a74565b602001516fffffffffffffffffffffffffffffffff16611cc2565b92915050565b565b610e85610d2d565b15610ebc576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14610f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e006064820152608401610824565b6000610f7082611c6e565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610824565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec9190614be0565b81602001516fffffffffffffffffffffffffffffffff1610156111b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610824565b6111d681602001516fffffffffffffffffffffffffffffffff16611cc2565b611288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610824565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561130f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113339190614a74565b82518151919250146113ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610824565b61140c81602001516fffffffffffffffffffffffffffffffff16611cc2565b6114be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610824565b60008381526033602052604090205460ff161561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610824565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a08801516115ff93929190611d68565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061166490841515815260200190565b60405180910390a28015801561167a5750326001145b156116b1576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60006116c5826010614c28565b610e7590615208614c58565b600054610100900460ff16158080156116f15750600054600160ff909116105b8061170b5750303b15801561170b575060005460ff166001145b611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610824565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156117f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010085841602179055603254166118ae57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b6118b6611dc6565b801561191957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611971907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614c84565b9050600061197d611ed9565b90506000816020015160ff16826000015163ffffffff1661199e9190614cca565b90508215611ad5576001546000906119d5908390700100000000000000000000000000000000900467ffffffffffffffff16614d32565b90506000836040015160ff16836119ec9190614da6565b600154611a0c9084906fffffffffffffffffffffffffffffffff16614da6565b611a169190614cca565b600154909150600090611a6790611a409084906fffffffffffffffffffffffffffffffff16614e62565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16611f9a565b90506001861115611a9657611a93611a4082876040015160ff1660018a611a8e9190614c84565b611fb9565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611b08908490700100000000000000000000000000000000900467ffffffffffffffff16614c58565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611b95576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090611bc1906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816614ed6565b90506000611bd348633b9aca0061200e565b611bdd9083614f13565b905060005a611bec9088614c84565b905080821115611c0857611c08611c038284614c84565b612025565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611c51949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611c51979096959101614f27565b600080611caa86612053565b9050611cb881868686612085565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015611d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d569190614be0565b611d609083614f7e565b421192915050565b6000806000611d788660006120b5565b905080611dae576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16611e5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610824565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003610e7b5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015611f76573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614fbb565b6000611faf611fa985856120d3565b836120e3565b90505b9392505050565b6000670de0b6b3a7640000611ffa611fd18583614cca565b611fe390670de0b6b3a7640000614d32565b611ff585670de0b6b3a7640000614da6565b6120f2565b6120049086614da6565b611faf9190614cca565b60008183101561201e5781611fb2565b5090919050565b6000805a90505b825a6120389083614c84565b101561204e576120478261505a565b915061202c565b505050565b6060818051906020012060405160200161206f91815260200190565b6040516020818303038152906040529050919050565b60006120ac84612096878686612123565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b60008183121561201e5781611fb2565b600081831261201e5781611fb2565b6000611fb2670de0b6b3a76400008361210a86612ba1565b6121149190614da6565b61211e9190614cca565b612de5565b60606000845111612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610824565b600061219b84613024565b905060006121a886613110565b90506000846040516020016121bf91815260200190565b60405160208183030381529060405290506000805b8451811015612b185760008582815181106121f1576121f1615092565b60200260200101519050845183111561228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610824565b8260000361234557805180516020918201206040516122da926122b492910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610824565b61249c565b8051516020116123fb578051805160209182012060405161236f926122b492910190815260200190565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610824565b80518451602080870191909120825191909201201461249c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610824565b6124a860106001614f7e565b81602001515103612684578451830361261c576124e281602001516010815181106124d5576124d5615092565b6020026020010151613173565b96506000875111612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610824565b600186516125839190614c84565b8214612611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610824565b505050505050611fb2565b600085848151811061263057612630615092565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061265b5761265b615092565b6020026020010151905061266e816132d3565b955061267b600186614f7e565b94505050612b05565b600281602001515103612a7d57600061269c826132f8565b90506000816000815181106126b3576126b3615092565b016020015160f81c905060006126ca6002836150c1565b6126d59060026150e3565b905060006126e6848360ff1661331c565b905060006126f48a8961331c565b905060006127028383613352565b905080835114612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610824565b60ff8516600214806127a9575060ff85166003145b15612998578082511461283e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610824565b61285887602001516001815181106124d5576124d5615092565b9c5060008d51116128eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610824565b60018c516128f99190614c84565b8814612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610824565b505050505050505050505050611fb2565b60ff851615806129ab575060ff85166001145b156129ea576129d787602001516001815181106129ca576129ca615092565b60200260200101516132d3565b99506129e3818a614f7e565b9850612a72565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610824565b505050505050612b05565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610824565b5080612b108161505a565b9150506121d4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610824565b6000808213612c0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b60006060612c1984613406565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213612e1657506000919050565b680755bf798b4a1bf1e58212612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610824565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff81111561304257613042614529565b60405190808252806020026020018201604052801561308757816020015b60408051808201909152606080825260208201528152602001906001900390816130605790505b50915060005b818110156131095760405180604001604052808583815181106130b2576130b2615092565b602002602001015181526020016130e18684815181106130d4576130d4615092565b60200260200101516134dc565b8152508382815181106130f6576130f6615092565b602090810291909101015260010161308d565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613168578060011b82018184015160001a8060041c8253600f81166001830153505060010161313a565b509295945050505050565b60606000806000613183856134ef565b91945092509050600081600181111561319e5761319e615106565b1461322b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610824565b6132358284614f7e565b8551146132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610824565b6120ac85602001518484613f5c565b606060208260000151106132ef576132ea82613173565b610e75565b610e7582613ff0565b6060610e7561331783602001516000815181106124d5576124d5615092565b613110565b60608251821061333b5750604080516020810190915260008152610e75565b611fb2838384865161334d9190614c84565b614006565b6000808251845110613365578251613368565b83515b90505b80821080156133ef575082828151811061338757613387615092565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106133c6576133c6615092565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156133ff5781600101915061336b565b5092915050565b6000808211613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060610e756134ea836141de565b6142c7565b6000806000808460000151116135ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b6020840151805160001a607f81116135d2576000600160009450945094505050613f55565b60b781116137e05760006135e7608083614c84565b9050808760000151116136a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610824565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061371b57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b6137cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610824565b5060019550935060009250613f55915050565b60bf8111613b2e5760006137f560b783614c84565b9050808760000151116138b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610824565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361398e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610824565b613a5c8184614f7e565b895111613b11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610824565b613b1c836001614f7e565b9750955060009450613f559350505050565b60f78111613c0f576000613b4360c083614c84565b905080876000015111613bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b600195509350849250613f55915050565b6000613c1c60f783614c84565b905080876000015111613cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610824565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610824565b613e838184614f7e565b895111613f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b613f43836001614f7e565b9750955060019450613f559350505050565b9193909250565b60608167ffffffffffffffff811115613f7757613f77614529565b6040519080825280601f01601f191660200182016040528015613fa1576020820181803683370190505b5090508115611fb2576000613fb68486614f7e565b90506020820160005b84811015613fd7578281015182820152602001613fbf565b84811115613fe6576000858301525b5050509392505050565b6060610e75826020015160008460000151613f5c565b60608182601f011015614075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8282840110156140e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8183018451101561414e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610824565b60608215801561416d57604051915060008252602082016040526141d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141a657805183526020928301920161418e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116142a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b50604080518082019091528151815260209182019181019190915290565b606060008060006142d7856134ef565b9194509250905060018160018111156142f2576142f2615106565b1461437f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610824565b845161438b8385614f7e565b14614418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610824565b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161442f5790505093506000835b865181101561451d576000806144a26040518060400160405280858c600001516144869190614c84565b8152602001858c6020015161449b9190614f7e565b90526134ef565b5091509150604051806040016040528083836144be9190614f7e565b8152602001848b602001516144d39190614f7e565b8152508885815181106144e8576144e8615092565b60209081029190910101526144fe600185614f7e565b935061450a8183614f7e565b6145149084614f7e565b9250505061445c565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561459f5761459f614529565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff811681146145c957600080fd5b50565b600082601f8301126145dd57600080fd5b813567ffffffffffffffff8111156145f7576145f7614529565b61462860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614558565b81815284602083860101111561463d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561466c57600080fd5b60405160c0810167ffffffffffffffff828210818311171561469057614690614529565b8160405282935084358352602085013591506146ab826145a7565b816020840152604085013591506146c1826145a7565b816040840152606085013560608401526080850135608084015260a08501359150808211156146ef57600080fd5b506146fc858286016145cc565b60a0830152505092915050565b600080600080600085870360e081121561472257600080fd5b863567ffffffffffffffff8082111561473a57600080fd5b6147468a838b0161465a565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561477f57600080fd5b60408901955060c089013592508083111561479957600080fd5b828901925089601f8401126147ad57600080fd5b82359150808211156147be57600080fd5b508860208260051b84010111156147d457600080fd5b959894975092955050506020019190565b60005b838110156148005781810151838201526020016147e8565b838111156119195750506000910152565b600081518084526148298160208601602086016147e5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fb26020830184614811565b60006020828403121561488057600080fd5b5035919050565b60006020828403121561489957600080fd5b813567ffffffffffffffff8111156148b057600080fd5b6148bc8482850161465a565b949350505050565b803567ffffffffffffffff811681146148dc57600080fd5b919050565b6000602082840312156148f357600080fd5b611fb2826148c4565b60008060006060848603121561491157600080fd5b833561491c816145a7565b9250602084013561492c816145a7565b9150604084013561493c816145a7565b809150509250925092565b80151581146145c957600080fd5b600080600080600060a0868803121561496d57600080fd5b8535614978816145a7565b94506020860135935061498d604087016148c4565b9250606086013561499d81614947565b9150608086013567ffffffffffffffff8111156149b957600080fd5b6149c5888289016145cc565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614a268160498501602087016147e5565b919091016049019695505050505050565b600060208284031215614a4957600080fd5b8151611fb2816145a7565b80516fffffffffffffffffffffffffffffffff811681146148dc57600080fd5b600060608284031215614a8657600080fd5b6040516060810181811067ffffffffffffffff82111715614aa957614aa9614529565b60405282518152614abc60208401614a54565b6020820152614acd60408401614a54565b60408201529392505050565b600060808284031215614aeb57600080fd5b6040516080810181811067ffffffffffffffff82111715614b0e57614b0e614529565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614b5a57614b5a614529565b8360051b6020614b6b818301614558565b868152918501918181019036841115614b8357600080fd5b865b84811015614bb757803586811115614b9d5760008081fd5b614ba936828b016145cc565b845250918301918301614b85565b50979650505050505050565b600060208284031215614bd557600080fd5b8151611fb281614947565b600060208284031215614bf257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614c4f57614c4f614bf9565b02949350505050565b600067ffffffffffffffff808316818516808303821115614c7b57614c7b614bf9565b01949350505050565b600082821015614c9657614c96614bf9565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614cd957614cd9614c9b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614d2d57614d2d614bf9565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615614d6c57614d6c614bf9565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614da057614da0614bf9565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614de757614de7614bf9565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614e2257614e22614bf9565b60008712925087820587128484161615614e3e57614e3e614bf9565b87850587128184161615614e5457614e54614bf9565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614e9c57614e9c614bf9565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614ed057614ed0614bf9565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f0e57614f0e614bf9565b500290565b600082614f2257614f22614c9b565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614f7260c0830184614811565b98975050505050505050565b60008219821115614f9157614f91614bf9565b500190565b805163ffffffff811681146148dc57600080fd5b805160ff811681146148dc57600080fd5b600060c08284031215614fcd57600080fd5b60405160c0810181811067ffffffffffffffff82111715614ff057614ff0614529565b604052614ffc83614f96565b815261500a60208401614faa565b602082015261501b60408401614faa565b604082015261502c60608401614f96565b606082015261503d60808401614f96565b608082015261504e60a08401614a54565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508b5761508b614bf9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff8316806150d4576150d4614c9b565b8060ff84160691505092915050565b600060ff821660ff8416808210156150fd576150fd614bf9565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a","sourceMap":"1240:19301:134:-:0;;;4633:218;;;;;;;;;-1:-1:-1;4657:187:134;4716:1;;;4657:10;:187::i;:::-;1240:19301;;5069:435;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;;3209:33;3236:4;3209:18;;;;;:33;;:::i;:::-;3208:34;:55;;;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;-1:-1:-1;;;3146:190:43;;216:2:357;3146:190:43;;;198:21:357;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:357;;;338:44;399:19;;3146:190:43;;;;;;;;;3346:12;:16;;-1:-1:-1;;3346:16:43;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;-1:-1:-1;;3406:20:43;;;;;3372:65;5258:8:134::1;:20:::0;;-1:-1:-1;;;;;;5258:20:134;;::::1;-1:-1:-1::0;;;;;5258:20:134;;::::1;::::0;;;::::1;::::0;;;5288:12:::1;:28:::0;;;;::::1;::::0;;::::1;;::::0;;5326:16:::1;:36:::0;;-1:-1:-1;;;;;;5326:36:134::1;5258:20;5326:36:::0;;::::1;;;::::0;;5376:8:::1;::::0;::::1;5372:91;;5414:8;:38:::0;;-1:-1:-1;;;;;;5414:38:134::1;1338:42:192;5414:38:134;::::0;;5372:91:::1;5472:25;:23;:25::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;-1:-1:-1;;3491:21:43;;;3531:14;;-1:-1:-1;581:36:357;;3531:14:43;;569:2:357;554:18;3531:14:43;;;;;;;3457:99;3090:472;5069:435:134;;;:::o;1175:320:59:-;-1:-1:-1;;;;;1465:19:59;;:23;;;1175:320::o;8340:234:137:-;4888:13:43;;;;;;;4880:69;;;;-1:-1:-1;;;4880:69:43;;830:2:357;4880:69:43;;;812:21:357;869:2;849:18;;;842:30;908:34;888:18;;;881:62;-1:-1:-1;;;959:18:357;;;952:41;1010:19;;4880:69:43;628:407:357;4880:69:43;8415:6:137::1;:19:::0;-1:-1:-1;;;8415:19:137;::::1;-1:-1:-1::0;;;;;8415:19:137::1;;:24:::0;8411:157:::1;;8464:93;::::0;;::::1;::::0;::::1;::::0;;8494:6:::1;8464:93:::0;;;-1:-1:-1;8464:93:137::1;::::0;::::1;::::0;8541:12:::1;-1:-1:-1::0;;;;;8464:93:137::1;::::0;;;;;;;-1:-1:-1;;;8455:102:137::1;;:6;:102:::0;8411:157:::1;8340:234::o:0;628:407:357:-;1240:19301:134;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106101125760003560e01c80638c3152e9116100a5578063a35d99df11610074578063cff0ab9611610059578063cff0ab961461039a578063e965084c1461043b578063e9e05c42146104c757600080fd5b8063a35d99df14610341578063c0c53b8b1461037a57600080fd5b80638c3152e9146102975780639b5f694a146102b75780639bf62d82146102e4578063a14238e71461031157600080fd5b806354fd4d50116100e157806354fd4d50146101fc5780635c975abb146102525780636dbffb78146102775780638b4c40b01461013757600080fd5b806333d7e2bd1461013e57806335e80ab314610195578063452a9320146101c75780634870496f146101dc57600080fd5b36610139576101373334620186a06000604051806020016040528060008152506104d5565b005b600080fd5b34801561014a57600080fd5b5060375461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101a157600080fd5b5060355461016b90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156101d357600080fd5b5061016b610692565b3480156101e857600080fd5b506101376101f7366004614709565b61072a565b34801561020857600080fd5b506102456040518060400160405280600581526020017f322e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161018c919061485b565b34801561025e57600080fd5b50610267610d2d565b604051901515815260200161018c565b34801561028357600080fd5b5061026761029236600461486e565b610dc0565b3480156102a357600080fd5b506101376102b2366004614887565b610e7d565b3480156102c357600080fd5b5060365461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102f057600080fd5b5060325461016b9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561031d57600080fd5b5061026761032c36600461486e565b60336020526000908152604090205460ff1681565b34801561034d57600080fd5b5061036161035c3660046148e1565b6116b8565b60405167ffffffffffffffff909116815260200161018c565b34801561038657600080fd5b506101376103953660046148fc565b6116d1565b3480156103a657600080fd5b50600154610402906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161018c565b34801561044757600080fd5b5061049961045636600461486e565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff928316602085015291169082015260600161018c565b6101376104d5366004614955565b8260005a90508380156104fd575073ffffffffffffffffffffffffffffffffffffffff871615155b15610534576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61053e83516116b8565b67ffffffffffffffff168567ffffffffffffffff16101561058b576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0835111156105c9576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146105ea575033731111000000000000000000000000000000001111015b600034888888886040516020016106059594939291906149d2565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610675919061485b565b60405180910390a45050610689828261193b565b50505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614a37565b905090565b610732610d2d565b15610769576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff160361082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084015b60405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561089d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c19190614a74565b5190506108db6108d636869003860186614ad9565b611c12565b8114610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f6600000000000000000000000000000000000000000000006064820152608401610824565b600061097487611c6e565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610a8a5750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190614a74565b5114155b610b16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610824565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610bdf9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610bd5888a614b3f565b8a60400135611c9e565b610c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610824565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614bc3565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610e759173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190614a74565b602001516fffffffffffffffffffffffffffffffff16611cc2565b92915050565b565b610e85610d2d565b15610ebc576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14610f65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e006064820152608401610824565b6000610f7082611c6e565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610824565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec9190614be0565b81602001516fffffffffffffffffffffffffffffffff1610156111b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610824565b6111d681602001516fffffffffffffffffffffffffffffffff16611cc2565b611288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610824565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561130f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113339190614a74565b82518151919250146113ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610824565b61140c81602001516fffffffffffffffffffffffffffffffff16611cc2565b6114be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610824565b60008381526033602052604090205460ff161561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610824565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a08801516115ff93929190611d68565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061166490841515815260200190565b60405180910390a28015801561167a5750326001145b156116b1576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60006116c5826010614c28565b610e7590615208614c58565b600054610100900460ff16158080156116f15750600054600160ff909116105b8061170b5750303b15801561170b575060005460ff166001145b611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610824565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156117f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010085841602179055603254166118ae57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b6118b6611dc6565b801561191957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611971907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614c84565b9050600061197d611ed9565b90506000816020015160ff16826000015163ffffffff1661199e9190614cca565b90508215611ad5576001546000906119d5908390700100000000000000000000000000000000900467ffffffffffffffff16614d32565b90506000836040015160ff16836119ec9190614da6565b600154611a0c9084906fffffffffffffffffffffffffffffffff16614da6565b611a169190614cca565b600154909150600090611a6790611a409084906fffffffffffffffffffffffffffffffff16614e62565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16611f9a565b90506001861115611a9657611a93611a4082876040015160ff1660018a611a8e9190614c84565b611fb9565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611b08908490700100000000000000000000000000000000900467ffffffffffffffff16614c58565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611b95576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090611bc1906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816614ed6565b90506000611bd348633b9aca0061200e565b611bdd9083614f13565b905060005a611bec9088614c84565b905080821115611c0857611c08611c038284614c84565b612025565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611c51949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611c51979096959101614f27565b600080611caa86612053565b9050611cb881868686612085565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015611d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d569190614be0565b611d609083614f7e565b421192915050565b6000806000611d788660006120b5565b905080611dae576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff16611e5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610824565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003610e7b5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015611f76573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190614fbb565b6000611faf611fa985856120d3565b836120e3565b90505b9392505050565b6000670de0b6b3a7640000611ffa611fd18583614cca565b611fe390670de0b6b3a7640000614d32565b611ff585670de0b6b3a7640000614da6565b6120f2565b6120049086614da6565b611faf9190614cca565b60008183101561201e5781611fb2565b5090919050565b6000805a90505b825a6120389083614c84565b101561204e576120478261505a565b915061202c565b505050565b6060818051906020012060405160200161206f91815260200190565b6040516020818303038152906040529050919050565b60006120ac84612096878686612123565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b60008183121561201e5781611fb2565b600081831261201e5781611fb2565b6000611fb2670de0b6b3a76400008361210a86612ba1565b6121149190614da6565b61211e9190614cca565b612de5565b60606000845111612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610824565b600061219b84613024565b905060006121a886613110565b90506000846040516020016121bf91815260200190565b60405160208183030381529060405290506000805b8451811015612b185760008582815181106121f1576121f1615092565b60200260200101519050845183111561228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610824565b8260000361234557805180516020918201206040516122da926122b492910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610824565b61249c565b8051516020116123fb578051805160209182012060405161236f926122b492910190815260200190565b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610824565b80518451602080870191909120825191909201201461249c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610824565b6124a860106001614f7e565b81602001515103612684578451830361261c576124e281602001516010815181106124d5576124d5615092565b6020026020010151613173565b96506000875111612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610824565b600186516125839190614c84565b8214612611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610824565b505050505050611fb2565b600085848151811061263057612630615092565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061265b5761265b615092565b6020026020010151905061266e816132d3565b955061267b600186614f7e565b94505050612b05565b600281602001515103612a7d57600061269c826132f8565b90506000816000815181106126b3576126b3615092565b016020015160f81c905060006126ca6002836150c1565b6126d59060026150e3565b905060006126e6848360ff1661331c565b905060006126f48a8961331c565b905060006127028383613352565b905080835114612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610824565b60ff8516600214806127a9575060ff85166003145b15612998578082511461283e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610824565b61285887602001516001815181106124d5576124d5615092565b9c5060008d51116128eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610824565b60018c516128f99190614c84565b8814612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610824565b505050505050505050505050611fb2565b60ff851615806129ab575060ff85166001145b156129ea576129d787602001516001815181106129ca576129ca615092565b60200260200101516132d3565b99506129e3818a614f7e565b9850612a72565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610824565b505050505050612b05565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610824565b5080612b108161505a565b9150506121d4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610824565b6000808213612c0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b60006060612c1984613406565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213612e1657506000919050565b680755bf798b4a1bf1e58212612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610824565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff81111561304257613042614529565b60405190808252806020026020018201604052801561308757816020015b60408051808201909152606080825260208201528152602001906001900390816130605790505b50915060005b818110156131095760405180604001604052808583815181106130b2576130b2615092565b602002602001015181526020016130e18684815181106130d4576130d4615092565b60200260200101516134dc565b8152508382815181106130f6576130f6615092565b602090810291909101015260010161308d565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613168578060011b82018184015160001a8060041c8253600f81166001830153505060010161313a565b509295945050505050565b60606000806000613183856134ef565b91945092509050600081600181111561319e5761319e615106565b1461322b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610824565b6132358284614f7e565b8551146132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610824565b6120ac85602001518484613f5c565b606060208260000151106132ef576132ea82613173565b610e75565b610e7582613ff0565b6060610e7561331783602001516000815181106124d5576124d5615092565b613110565b60608251821061333b5750604080516020810190915260008152610e75565b611fb2838384865161334d9190614c84565b614006565b6000808251845110613365578251613368565b83515b90505b80821080156133ef575082828151811061338757613387615092565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106133c6576133c6615092565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156133ff5781600101915061336b565b5092915050565b6000808211613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610824565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060610e756134ea836141de565b6142c7565b6000806000808460000151116135ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b6020840151805160001a607f81116135d2576000600160009450945094505050613f55565b60b781116137e05760006135e7608083614c84565b9050808760000151116136a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610824565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061371b57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b6137cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610824565b5060019550935060009250613f55915050565b60bf8111613b2e5760006137f560b783614c84565b9050808760000151116138b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610824565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361398e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610824565b613a5c8184614f7e565b895111613b11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610824565b613b1c836001614f7e565b9750955060009450613f559350505050565b60f78111613c0f576000613b4360c083614c84565b905080876000015111613bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b600195509350849250613f55915050565b6000613c1c60f783614c84565b905080876000015111613cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610824565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610824565b600184015160088302610100031c60378111613e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610824565b613e838184614f7e565b895111613f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610824565b613f43836001614f7e565b9750955060019450613f559350505050565b9193909250565b60608167ffffffffffffffff811115613f7757613f77614529565b6040519080825280601f01601f191660200182016040528015613fa1576020820181803683370190505b5090508115611fb2576000613fb68486614f7e565b90506020820160005b84811015613fd7578281015182820152602001613fbf565b84811115613fe6576000858301525b5050509392505050565b6060610e75826020015160008460000151613f5c565b60608182601f011015614075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8282840110156140e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610824565b8183018451101561414e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610824565b60608215801561416d57604051915060008252602082016040526141d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141a657805183526020928301920161418e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116142a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610824565b50604080518082019091528151815260209182019181019190915290565b606060008060006142d7856134ef565b9194509250905060018160018111156142f2576142f2615106565b1461437f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610824565b845161438b8385614f7e565b14614418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610824565b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161442f5790505093506000835b865181101561451d576000806144a26040518060400160405280858c600001516144869190614c84565b8152602001858c6020015161449b9190614f7e565b90526134ef565b5091509150604051806040016040528083836144be9190614f7e565b8152602001848b602001516144d39190614f7e565b8152508885815181106144e8576144e8615092565b60209081029190910101526144fe600185614f7e565b935061450a8183614f7e565b6145149084614f7e565b9250505061445c565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561459f5761459f614529565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff811681146145c957600080fd5b50565b600082601f8301126145dd57600080fd5b813567ffffffffffffffff8111156145f7576145f7614529565b61462860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614558565b81815284602083860101111561463d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561466c57600080fd5b60405160c0810167ffffffffffffffff828210818311171561469057614690614529565b8160405282935084358352602085013591506146ab826145a7565b816020840152604085013591506146c1826145a7565b816040840152606085013560608401526080850135608084015260a08501359150808211156146ef57600080fd5b506146fc858286016145cc565b60a0830152505092915050565b600080600080600085870360e081121561472257600080fd5b863567ffffffffffffffff8082111561473a57600080fd5b6147468a838b0161465a565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561477f57600080fd5b60408901955060c089013592508083111561479957600080fd5b828901925089601f8401126147ad57600080fd5b82359150808211156147be57600080fd5b508860208260051b84010111156147d457600080fd5b959894975092955050506020019190565b60005b838110156148005781810151838201526020016147e8565b838111156119195750506000910152565b600081518084526148298160208601602086016147e5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fb26020830184614811565b60006020828403121561488057600080fd5b5035919050565b60006020828403121561489957600080fd5b813567ffffffffffffffff8111156148b057600080fd5b6148bc8482850161465a565b949350505050565b803567ffffffffffffffff811681146148dc57600080fd5b919050565b6000602082840312156148f357600080fd5b611fb2826148c4565b60008060006060848603121561491157600080fd5b833561491c816145a7565b9250602084013561492c816145a7565b9150604084013561493c816145a7565b809150509250925092565b80151581146145c957600080fd5b600080600080600060a0868803121561496d57600080fd5b8535614978816145a7565b94506020860135935061498d604087016148c4565b9250606086013561499d81614947565b9150608086013567ffffffffffffffff8111156149b957600080fd5b6149c5888289016145cc565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614a268160498501602087016147e5565b919091016049019695505050505050565b600060208284031215614a4957600080fd5b8151611fb2816145a7565b80516fffffffffffffffffffffffffffffffff811681146148dc57600080fd5b600060608284031215614a8657600080fd5b6040516060810181811067ffffffffffffffff82111715614aa957614aa9614529565b60405282518152614abc60208401614a54565b6020820152614acd60408401614a54565b60408201529392505050565b600060808284031215614aeb57600080fd5b6040516080810181811067ffffffffffffffff82111715614b0e57614b0e614529565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614b5a57614b5a614529565b8360051b6020614b6b818301614558565b868152918501918181019036841115614b8357600080fd5b865b84811015614bb757803586811115614b9d5760008081fd5b614ba936828b016145cc565b845250918301918301614b85565b50979650505050505050565b600060208284031215614bd557600080fd5b8151611fb281614947565b600060208284031215614bf257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614c4f57614c4f614bf9565b02949350505050565b600067ffffffffffffffff808316818516808303821115614c7b57614c7b614bf9565b01949350505050565b600082821015614c9657614c96614bf9565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614cd957614cd9614c9b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614d2d57614d2d614bf9565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615614d6c57614d6c614bf9565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614da057614da0614bf9565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614de757614de7614bf9565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614e2257614e22614bf9565b60008712925087820587128484161615614e3e57614e3e614bf9565b87850587128184161615614e5457614e54614bf9565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614e9c57614e9c614bf9565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614ed057614ed0614bf9565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f0e57614f0e614bf9565b500290565b600082614f2257614f22614c9b565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614f7260c0830184614811565b98975050505050505050565b60008219821115614f9157614f91614bf9565b500190565b805163ffffffff811681146148dc57600080fd5b805160ff811681146148dc57600080fd5b600060c08284031215614fcd57600080fd5b60405160c0810181811067ffffffffffffffff82111715614ff057614ff0614529565b604052614ffc83614f96565b815261500a60208401614faa565b602082015261501b60408401614faa565b604082015261502c60608401614f96565b606082015261503d60808401614f96565b608082015261504e60a08401614a54565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361508b5761508b614bf9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff8316806150d4576150d4614c9b565b8060ff84160691505092915050565b600060ff821660ff8416808210156150fd576150fd614bf9565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a","sourceMap":"1240:19301:134:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7115:86;7134:10;7146:9;1971:7;7184:5;7191:9;;;;;;;;;;;;7115:18;:86::i;:::-;1240:19301;;;;;2983:32;;;;;;;;;;-1:-1:-1;2983:32:134;;;;;;;;;;;212:42:357;200:55;;;182:74;;170:2;155:18;2983:32:134;;;;;;;;2739:40;;;;;;;;;;-1:-1:-1;2739:40:134;;;;;;;;;;;5757:101;;;;;;;;;;;;;:::i;8288:3825::-;;;;;;;;;;-1:-1:-1;8288:3825:134;;;;;:::i;:::-;;:::i;4530:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5981:105::-;;;;;;;;;;;;;:::i;:::-;;;5228:14:357;;5221:22;5203:41;;5191:2;5176:18;5981:105:134;5063:187:357;19926:180:134;;;;;;;;;;-1:-1:-1;19926:180:134;;;;;:::i;:::-;;:::i;12226:4818::-;;;;;;;;;;-1:-1:-1;12226:4818:134;;;;;:::i;:::-;;:::i;2867:30::-;;;;;;;;;;-1:-1:-1;2867:30:134;;;;;;;;2234:23;;;;;;;;;;-1:-1:-1;2234:23:134;;;;;;;;2348:52;;;;;;;;;;-1:-1:-1;2348:52:134;;;;;:::i;:::-;;;;;;;;;;;;;;;;6579:120;;;;;;;;;;-1:-1:-1;6579:120:134;;;;;:::i;:::-;;:::i;:::-;;;6799:18:357;6787:31;;;6769:50;;6757:2;6742:18;6579:120:134;6625:200:357;5069:435:134;;;;;;;;;;-1:-1:-1;5069:435:134;;;;;:::i;:::-;;:::i;3093:28:137:-;;;;;;;;;;-1:-1:-1;3093:28:137;;;;;;;;;;;;;;;;;;;;;;;;;7664:34:357;7652:47;;;7634:66;;7719:18;7773:15;;;7768:2;7753:18;;7746:43;7825:15;;7805:18;;;7798:43;7622:2;7607:18;3093:28:137;7436:411:357;2482:61:134;;;;;;;;;;-1:-1:-1;2482:61:134;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8054:25:357;;;8098:34;8168:15;;;8163:2;8148:18;;8141:43;8220:15;;8200:18;;;8193:43;8042:2;8027:18;2482:61:134;7852:390:357;17774:1855:134;;;;;;:::i;:::-;17980:9;3511:18:137;3532:9;3511:30;;18134:11:134::1;:32;;;;-1:-1:-1::0;18149:17:134::1;::::0;::::1;::::0;::::1;18134:32;18130:56;;;18175:11;;;;;;;;;;;;;;18130:56;18350:37;18373:5;:12;18350:15;:37::i;:::-;18338:49;;:9;:49;;;18334:77;;;18396:15;;;;;;;;;;;;;;18334:77;18801:7;18786:5;:12;:22;18782:50;;;18817:15;;;;;;;;;;;;;;18782:50;18938:10;18976:9;18962:23:::0;::::1;18958:108;;-1:-1:-1::0;19044:10:134::1;741:42:237::0;1213:27;18958:108:134::1;19323:23;19366:9;19377:6;19385:9;19396:11;19409:5;19349:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19323:92;;1821:1;19589:3;19562:60;;19583:4;19562:60;;;19611:10;19562:60;;;;;;:::i;:::-;;;;;;;;17995:1634;;3642:29:137::0;3651:7;3660:10;3642:8;:29::i;:::-;3433:245;17774:1855:134;;;;;;:::o;5757:101::-;5798:7;5824:16;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5817:34;;5757:101;:::o;8288:3825::-;4414:8;:6;:8::i;:::-;4410:33;;;4431:12;;;;;;;;;;;;;;4410:33;8820:4:::1;8798:27;;:3;:10;;;:27;;::::0;8790:103:::1;;;::::0;::::1;::::0;;10435:2:357;8790:103:134::1;::::0;::::1;10417:21:357::0;10474:2;10454:18;;;10447:30;10513:34;10493:18;;;10486:62;10584:33;10564:18;;;10557:61;10635:19;;8790:103:134::1;;;;;;;;;9091:8;::::0;:36:::1;::::0;;;;::::1;::::0;::::1;10811:25:357::0;;;9070:18:134::1;::::0;9091:8:::1;;::::0;:20:::1;::::0;10784:18:357;;9091:36:134::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47:::0;;-1:-1:-1;9272:45:134::1;;;::::0;;::::1;::::0;::::1;9300:16:::0;9272:45:::1;:::i;:::-;:27;:45::i;:::-;9258:10;:59;9237:135;;;::::0;::::1;::::0;;12521:2:357;9237:135:134::1;::::0;::::1;12503:21:357::0;12560:2;12540:18;;;12533:30;12599:34;12579:18;;;12572:62;12670:11;12650:18;;;12643:39;12699:19;;9237:135:134::1;12319:405:357::0;9237:135:134::1;9483:22;9508:27;9531:3;9508:22;:27::i;:::-;9545:40;9588:33:::0;;;:17:::1;:33;::::0;;;;;;;;9545:76;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;;9483:52;;-1:-1:-1;9545:76:134;10175:31;;:145:::1;;-1:-1:-1::0;10293:27:134;;10226:8:::1;::::0;10247:30:::1;::::0;;::::1;::::0;10226:52;;;;;12905:34:357;12893:47;;;10226:52:134::1;::::0;::::1;12875:66:357::0;10226:8:134::1;::::0;;::::1;::::0;:20:::1;::::0;12848:18:357;;10226:52:134::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63:::0;:94:::1;;10175:145;10154:247;;;::::0;::::1;::::0;;13154:2:357;10154:247:134::1;::::0;::::1;13136:21:357::0;13193:2;13173:18;;;13166:30;13232:34;13212:18;;;13205:62;13303:25;13283:18;;;13276:53;13346:19;;10154:247:134::1;12952:419:357::0;10154:247:134::1;10681:147;::::0;;::::1;::::0;::::1;13550:25:357::0;;;10637:18:134::1;13591::357::0;;;13584:34;;;13523:18;;10681:147:134::1;::::0;;;;;::::1;::::0;;;;;;10658:180;;10681:147:::1;10658:180:::0;;::::1;::::0;11253:22;;::::1;10811:25:357::0;;;10658:180:134;-1:-1:-1;11191:240:134::1;::::0;10784:18:357;11253:22:134::1;::::0;;;;;::::1;::::0;;;11191:240;;::::1;::::0;;;::::1;::::0;;::::1;11253:22;11191:240:::0;::::1;::::0;11253:22;11191:240:::1;11334:16:::0;;11191:240:::1;:::i;:::-;11375:16;:41;;;11191:37;:240::i;:::-;11170:337;;;::::0;::::1;::::0;;14952:2:357;11170:337:134::1;::::0;::::1;14934:21:357::0;14991:2;14971:18;;;14964:30;15030:34;15010:18;;;15003:62;15101:20;15081:18;;;15074:48;15139:19;;11170:337:134::1;14750:414:357::0;11170:337:134::1;11825:165;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;11911:15;11825:165:::0;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;-1:-1:-1;11789:33:134;;;:17:::1;:33:::0;;;;;:201;;;;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;;12095:10;;::::1;::::0;12083;;::::1;::::0;12050:56;;::::1;::::0;;::::1;::::0;;;::::1;::::0;11807:14;;12050:56:::1;::::0;-1:-1:-1;12050:56:134::1;8553:3560;;;;8288:3825:::0;;;;;:::o;5981:105::-;6020:12;6054:16;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19926:180::-;20052:8;;:36;;;;;;;;10811:25:357;;;20000:4:134;;20023:76;;20052:8;;;;;:20;;10784:18:357;;20052:36:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;20023:76;;:28;:76::i;:::-;20016:83;19926:180;-1:-1:-1;;19926:180:134:o;7422:77::-;:::o;12226:4818::-;4414:8;:6;:8::i;:::-;4410:33;;;4431:12;;;;;;;;;;;;;;4410:33;12594:8:::1;::::0;:39:::1;:8;1338:42:192;12594:39:134;12573:137;;;::::0;::::1;::::0;;15621:2:357;12573:137:134::1;::::0;::::1;15603:21:357::0;15660:2;15640:18;;;15633:30;15699:34;15679:18;;;15672:62;15770:33;15750:18;;;15743:61;15821:19;;12573:137:134::1;15419:427:357::0;12573:137:134::1;12793:22;12818:27;12841:3;12818:22;:27::i;:::-;12855:40;12898:33:::0;;;:17:::1;:33;::::0;;;;;;;12855:76;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;;12793:52;;-1:-1:-1;13181:31:134;;13173:94:::1;;;::::0;::::1;::::0;;16053:2:357;13173:94:134::1;::::0;::::1;16035:21:357::0;16092:2;16072:18;;;16065:30;16131:34;16111:18;;;16104:62;16202:20;16182:18;;;16175:48;16240:19;;13173:94:134::1;15851:414:357::0;13173:94:134::1;13584:8;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13554:16;:26;;;:58;;;;13533:180;;;::::0;::::1;::::0;;16661:2:357;13533:180:134::1;::::0;::::1;16643:21:357::0;16700:2;16680:18;;;16673:30;16739:34;16719:18;;;16712:62;16810:34;16790:18;;;16783:62;16882:13;16861:19;;;16854:42;16913:19;;13533:180:134::1;16459:479:357::0;13533:180:134::1;14103:56;14132:16;:26;;;14103:56;;:28;:56::i;:::-;14082:172;;;::::0;::::1;::::0;;17145:2:357;14082:172:134::1;::::0;::::1;17127:21:357::0;17184:2;17164:18;;;17157:30;17223:34;17203:18;;;17196:62;17294:34;17274:18;;;17267:62;17366:7;17345:19;;;17338:36;17391:19;;14082:172:134::1;16943:473:357::0;14082:172:134::1;14464:8;::::0;14485:30:::1;::::0;;::::1;::::0;14464:52;;;;;12905:34:357;12893:47;;;14464:52:134::1;::::0;::::1;12875:66:357::0;14425:36:134::1;::::0;14464:8:::1;;::::0;:20:::1;::::0;12848:18:357;;14464:52:134::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14827:27:::0;;14804:19;;14425:91;;-1:-1:-1;14804:50:134::1;14783:170;;;::::0;::::1;::::0;;17623:2:357;14783:170:134::1;::::0;::::1;17605:21:357::0;17662:2;17642:18;;;17635:30;17701:34;17681:18;;;17674:62;17772:34;17752:18;;;17745:62;17844:11;17823:19;;;17816:40;17873:19;;14783:170:134::1;17421:477:357::0;14783:170:134::1;15052:48;15081:8;:18;;;15052:48;;:28;:48::i;:::-;15031:162;;;::::0;::::1;::::0;;18105:2:357;15031:162:134::1;::::0;::::1;18087:21:357::0;18144:2;18124:18;;;18117:30;18183:34;18163:18;;;18156:62;18254:34;18234:18;;;18227:62;18326:5;18305:19;;;18298:34;18349:19;;15031:162:134::1;17903:471:357::0;15031:162:134::1;15309:36;::::0;;;:20:::1;:36;::::0;;;;;::::1;;:45;15301:111;;;::::0;::::1;::::0;;18581:2:357;15301:111:134::1;::::0;::::1;18563:21:357::0;18620:2;18600:18;;;18593:30;18659:34;18639:18;;;18632:62;18730:23;18710:18;;;18703:51;18771:19;;15301:111:134::1;18379:417:357::0;15301:111:134::1;15492:36;::::0;;;:20:::1;:36;::::0;;;;;;;:43;;;::::1;15531:4;15492:43;::::0;;15640:10;;::::1;::::0;15629:8:::1;:21:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;16309:10;::::1;::::0;16321:12:::1;::::0;::::1;::::0;16335:9:::1;::::0;::::1;::::0;16346:8:::1;::::0;::::1;::::0;16285:70:::1;::::0;16309:10;16321:12;16335:9;16285:23:::1;:70::i;:::-;16423:8;:38:::0;;;::::1;1338:42:192;16423:38:134;::::0;;16620:44:::1;::::0;16270:85;;-1:-1:-1;16640:14:134;;16620:44:::1;::::0;::::1;::::0;16270:85;5228:14:357;5221:22;5203:41;;5191:2;5176:18;;5063:187;16620:44:134::1;;;;;;;;16928:16:::0;::::1;::::0;::::1;:61;;-1:-1:-1::0;16948:9:134::1;1016:1:192;16948:41:134;16928:61;16924:114;;;17012:15;;;;;;;;;;;;;;16924:114;12328:4716;;;;12226:4818:::0;:::o;6579:120::-;6644:6;6669:15;:10;6682:2;6669:15;:::i;:::-;:23;;6687:5;6669:23;:::i;5069:435::-;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;-1:-1:-1;3236:4:43;1465:19:59;:23;;;3208:55:43;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;;;;19708:2:357;3146:190:43;;;19690:21:357;19747:2;19727:18;;;19720:30;19786:34;19766:18;;;19759:62;19857:16;19837:18;;;19830:44;19891:19;;3146:190:43;19506:410:357;3146:190:43;3346:12;:16;;;;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;;;;;;;3372:65;5258:8:134::1;:20:::0;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;5288:12:::1;:28:::0;;;;::::1;::::0;;::::1;;::::0;;5326:16:::1;:36:::0;;;::::1;5258:20;5326:36:::0;;::::1;;;::::0;;5376:8:::1;::::0;::::1;5372:91;;5414:8;:38:::0;;;::::1;1338:42:192;5414:38:134;::::0;;5372:91:::1;5472:25;:23;:25::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;;;;;3531:14;;-1:-1:-1;20073:36:357;;3531:14:43;;20061:2:357;20046:18;3531:14:43;;;;;;;3457:99;3090:472;5069:435:134;;;:::o;1175:320:59:-;1465:19;;;:23;;;1175:320::o;3911:3974:137:-;4078:6;:19;4043:17;;4063:34;;4078:19;;;;;4063:12;:34;:::i;:::-;4043:54;;4108:28;4139:17;:15;:17::i;:::-;4108:48;;4166:26;4265:6;:27;;;4257:36;;4222:6;:23;;;4214:32;;4207:87;;;;:::i;:::-;4166:128;-1:-1:-1;4309:13:137;;4305:2229;;4666:6;:20;4629:19;;4651:59;;4691:19;;4666:20;;;;;4651:59;:::i;:::-;4629:81;;4724:19;4855:6;:34;;;4847:43;;4818:19;:73;;;;:::i;:::-;4762:6;:18;4747:50;;4785:12;;4762:18;;4747:50;:::i;:::-;4746:146;;;;:::i;:::-;5111:6;:18;4724:168;;-1:-1:-1;5033:17:137;;5053:232;;5096:50;;4724:168;;5111:18;;5096:50;:::i;:::-;5185:6;:21;;;5177:30;;5247:6;:21;;;5239:30;;5053:16;:232::i;:::-;5033:252;;5562:1;5550:9;:13;5546:741;;;5835:437;5882:239;5939:10;6004:6;:34;;;5996:43;;6096:1;6084:9;:13;;;;:::i;:::-;5882:16;:239::i;5835:437::-;5822:450;;5546:741;6380:49;;6481:42;6443:24;6510:12;6481:42;;;6380:6;6481:42;-1:-1:-1;;4305:2229:137;6628:6;:31;;6652:7;;6628:6;:20;;:31;;6652:7;;6628:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6728:6;:23;;;6720:32;;6688:6;:20;;;;;;;;;;;;6680:29;;6673:80;6669:128;;;6776:10;;;;;;;;;;;;;;6669:128;6908:6;:18;6858:20;;6881:46;;6908:18;;6881:16;;;:46;:::i;:::-;6858:69;;7409:15;7442:31;7451:13;7466:6;7442:8;:31::i;:::-;7427:46;;:12;:46;:::i;:::-;7409:64;;7753:15;7785:9;7771:23;;:11;:23;:::i;:::-;7753:41;;7818:7;7808;:17;7804:75;;;7841:27;7850:17;7860:7;7850;:17;:::i;:::-;7841:8;:27::i;:::-;3975:3910;;;;;;3911:3974;;:::o;4961:384:196:-;5060:7;5137:16;:24;;;5179:16;:26;;;5223:16;:41;;;5282:16;:32;;;5109:219;;;;;;;;;;22747:25:357;;;22803:2;22788:18;;22781:34;;;;22846:2;22831:18;;22824:34;22889:2;22874:18;;22867:34;22734:3;22719:19;;22516:391;5109:219:196;;;;;;;;;;;;;5086:252;;;;;;5079:259;;4961:384;;;:::o;4456:211::-;4590:9;;4601:10;;;;;4613;;;;;4625:9;;;;4636:12;;;;4650:8;;;;4579:80;;4543:7;;4579:80;;4590:9;;4601:10;4650:8;4579:80;;:::i;1041:343:206:-;1234:11;1261:16;1280:19;1294:4;1280:13;:19::i;:::-;1261:38;;1318:59;1350:3;1355:6;1363;1371:5;1318:31;:59::i;:::-;1309:68;1041:343;-1:-1:-1;;;;;;1041:343:206:o;20359:180:134:-;20494:8;;:38;;;;;;;;20440:4;;20494:8;;;:36;;:38;;;;;;;;;;;;;;:8;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20481:51;;:10;:51;:::i;:::-;20463:15;:69;;20359:180;-1:-1:-1;;20359:180:134:o;4419:2320:200:-;4589:4;4609:13;4632:15;4650:21;4660:7;4669:1;4650:9;:21::i;:::-;4632:39;;4782:10;4772:1146;;4894:10;4891:1;4884:21;5009:2;5005;4998:14;5747:56;5743:2;5736:68;5900:3;5896:2;5889:15;4772:1146;6666:4;6630;6589:9;6583:16;6549:2;6538:9;6534:18;6491:6;6449:7;6415:5;6389:309;6361:337;4419:2320;-1:-1:-1;;;;;;;4419:2320:200:o;8340:234:137:-;4888:13:43;;;;;;;4880:69;;;;;;;23908:2:357;4880:69:43;;;23890:21:357;23947:2;23927:18;;;23920:30;23986:34;23966:18;;;23959:62;24057:13;24037:18;;;24030:41;24088:19;;4880:69:43;23706:407:357;4880:69:43;8415:6:137::1;:19:::0;;;::::1;;;;:24:::0;8411:157:::1;;8464:93;::::0;;::::1;::::0;::::1;::::0;;8494:6:::1;8464:93:::0;;;-1:-1:-1;8464:93:137::1;::::0;::::1;::::0;8541:12:::1;8464:93;;::::0;;;;;;;8455:102;::::1;;:6;:102:::0;8340:234::o;7748:152:134:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7864:12:134;;:29;;;;;;;-1:-1:-1;;7864:12:134;;;;;:27;;:29;;;;;-1:-1:-1;;7864:29:134;;;;;;:12;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;537:161:189:-;616:6;641:50;656:28;671:6;679:4;656:14;:28::i;:::-;686:4;641:14;:50::i;:::-;634:57;;537:161;;;;;;:::o;1040:228::-;1138:6;1257:4;1180:72;1213:19;1220:12;1257:4;1213:19;:::i;:::-;1205:28;;:4;:28;:::i;:::-;1235:16;:9;1247:4;1235:16;:::i;:::-;1180:24;:72::i;:::-;1164:89;;:12;:89;:::i;:::-;1163:98;;;;:::i;413:105:69:-;471:7;502:1;497;:6;;:14;;510:1;497:14;;;-1:-1:-1;506:1:69;;490:21;-1:-1:-1;413:105:69:o;407:192:190:-;461:9;484:18;505:9;484:30;;524:69;556:7;544:9;531:22;;:10;:22;:::i;:::-;:32;524:69;;;579:3;;;:::i;:::-;;;524:69;;;451:148;;407:192;:::o;2052:142:206:-;2116:18;2181:4;2171:15;;;;;;2154:33;;;;;;25677:19:357;;25721:2;25712:12;;25548:182;2154:33:206;;;;;;;;;;;;;2146:41;;2052:142;;;:::o;2253:281:205:-;2446:11;2482:45;2494:6;2502:24;2506:4;2512:6;2520:5;2502:3;:24::i;:::-;6693:17:191;;;;;;;6672;;;;;;;;;;:38;;6569:148;2482:45:205;2473:54;2253:281;-1:-1:-1;;;;;2253:281:205:o;3615:365:200:-;3696:4;3712:15;3931:2;3916:12;3909:5;3905:24;3901:33;3896:2;3887:7;3883:16;3879:56;3874:2;3867:5;3863:14;3860:76;3853:84;;3615:365;-1:-1:-1;;;;3615:365:200:o;311:102:71:-;367:6;397:1;392;:6;;:14;;405:1;392:14;;491:101;547:6;576:1;572;:5;:13;;584:1;572:13;;1208:273:106;1267:6;1391:36;491:4;1410:1;1399:8;1405:1;1399:5;:8::i;:::-;:12;;;;:::i;:::-;1398:28;;;;:::i;:::-;1391:6;:36::i;2830:6314:205:-;2923:19;2976:1;2962:4;:11;:15;2954:49;;;;;;;25937:2:357;2954:49:205;;;25919:21:357;25976:2;25956:18;;;25949:30;26015:23;25995:18;;;25988:51;26056:18;;2954:49:205;25735:345:357;2954:49:205;3014:23;3040:19;3052:6;3040:11;:19::i;:::-;3014:45;;3069:16;3088:21;3104:4;3088:15;:21::i;:::-;3069:40;;3119:26;3165:5;3148:23;;;;;;25677:19:357;;25721:2;25712:12;;25548:182;3148:23:205;;;;;;;;;;;;;3119:52;;3181:23;3295:9;3290:5790;3314:5;:12;3310:1;:16;3290:5790;;;3347:27;3377:5;3383:1;3377:8;;;;;;;;:::i;:::-;;;;;;;3347:38;;3516:3;:10;3497:15;:29;;3489:88;;;;;;;26476:2:357;3489:88:205;;;26458:21:357;26515:2;26495:18;;;26488:30;26554:34;26534:18;;;26527:62;26625:16;26605:18;;;26598:44;26659:19;;3489:88:205;26274:410:357;3489:88:205;3596:15;3615:1;3596:20;3592:837;;3768:19;;3758:30;;;;;;;3741:48;;3729:76;;3741:48;;3758:30;3741:48;25677:19:357;;;25721:2;25712:12;;25548:182;3741:48:205;;;;;;;;;;;;;3791:13;6693:17:191;;;;;;;6672;;;;;;;;;;:38;;6569:148;3729:76:205;3700:176;;;;;;;26891:2:357;3700:176:205;;;26873:21:357;26930:2;26910:18;;;26903:30;26969:31;26949:18;;;26942:59;27018:18;;3700:176:205;26689:353:357;3700:176:205;3592:837;;;3901:19;;:26;3931:2;-1:-1:-1;3897:532:205;;4097:19;;4087:30;;;;;;;4070:48;;4058:76;;4070:48;;4087:30;4070:48;25677:19:357;;;25721:2;25712:12;;25548:182;4058:76:205;4029:186;;;;;;;27249:2:357;4029:186:205;;;27231:21:357;27288:2;27268:18;;;27261:30;27327:34;27307:18;;;27300:62;27398:9;27378:18;;;27371:37;27425:19;;4029:186:205;27047:403:357;3897:532:205;4336:19;;6693:17:191;;;;;;;;;;6672;;;;;;;:38;4316:98:205;;;;;;;27657:2:357;4316:98:205;;;27639:21:357;27696:2;27676:18;;;27669:30;27735:34;27715:18;;;27708:62;27806:8;27786:18;;;27779:36;27832:19;;4316:98:205;27455:402:357;4316:98:205;936:14;803:2;949:1;936:14;:::i;:::-;4447:11;:19;;;:26;:48;4443:4627;;4538:3;:10;4519:15;:29;4515:1346;;5047:52;5067:11;:19;;;803:2;5067:31;;;;;;;;:::i;:::-;;;;;;;5047:19;:52::i;:::-;5038:61;;5145:1;5129:6;:13;:17;5121:89;;;;;;;28064:2:357;5121:89:205;;;28046:21:357;28103:2;28083:18;;;28076:30;28142:34;28122:18;;;28115:62;28213:29;28193:18;;;28186:57;28260:19;;5121:89:205;27862:423:357;5121:89:205;5322:1;5307:5;:12;:16;;;;:::i;:::-;5302:1;:21;5294:92;;;;;;;28492:2:357;5294:92:205;;;28474:21:357;28531:2;28511:18;;;28504:30;28570:34;28550:18;;;28543:62;28641:28;28621:18;;;28614:56;28687:19;;5294:92:205;28290:422:357;5294:92:205;5409:13;;;;;;;;4515:1346;5609:15;5633:3;5637:15;5633:20;;;;;;;;:::i;:::-;;;;;;;;;5627:27;;5609:45;;5676:33;5712:11;:19;;;5732:9;5712:30;;;;;;;;;;:::i;:::-;;;;;;;5676:66;;5780:20;5791:8;5780:10;:20::i;:::-;5764:36;-1:-1:-1;5822:20:205;5841:1;5822:20;;:::i;:::-;;;5447:414;;4443:4627;;;1105:1;5885:11;:19;;;:26;:59;5881:3189;;5964:17;5984:25;5997:11;5984:12;:25::i;:::-;5964:45;;6027:12;6048:4;6053:1;6048:7;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;6074:12:205;6094:10;6103:1;6048:7;6094:10;:::i;:::-;6089:16;;:1;:16;:::i;:::-;6074:31;;6123:26;6152:25;6164:4;6170:6;6152:25;;:11;:25::i;:::-;6123:54;;6195:25;6223:33;6235:3;6240:15;6223:11;:33::i;:::-;6195:61;;6274:26;6303:51;6326:13;6341:12;6303:22;:51::i;:::-;6274:80;;6661:18;6637:13;:20;:42;6608:171;;;;;;;29281:2:357;6608:171:205;;;29263:21:357;29320:2;29300:18;;;29293:30;29359:34;29339:18;;;29332:62;29430:28;29410:18;;;29403:56;29476:19;;6608:171:205;29079:422:357;6608:171:205;6802:26;;;1447:1;6802:26;;:55;;-1:-1:-1;6832:25:205;;;1553:1;6832:25;6802:55;6798:2169;;;7498:18;7475:12;:19;:41;7442:185;;;;;;;29708:2:357;7442:185:205;;;29690:21:357;29747:2;29727:18;;;29720:30;29786:34;29766:18;;;29759:62;29857:31;29837:18;;;29830:59;29906:19;;7442:185:205;29506:425:357;7442:185:205;7985:43;8005:11;:19;;;8025:1;8005:22;;;;;;;;:::i;7985:43::-;7976:52;;8074:1;8058:6;:13;:17;8050:87;;;;;;;30138:2:357;8050:87:205;;;30120:21:357;30177:2;30157:18;;;30150:30;30216:34;30196:18;;;30189:62;30287:27;30267:18;;;30260:55;30332:19;;8050:87:205;29936:421:357;8050:87:205;8249:1;8234:5;:12;:16;;;;:::i;:::-;8229:1;:21;8221:90;;;;;;;30564:2:357;8221:90:205;;;30546:21:357;30603:2;30583:18;;;30576:30;30642:34;30622:18;;;30615:62;30713:26;30693:18;;;30686:54;30757:19;;8221:90:205;30362:420:357;8221:90:205;8334:13;;;;;;;;;;;;;;6798:2169;8376:31;;;;;:65;;-1:-1:-1;8411:30:205;;;1339:1;8411:30;8376:65;8372:595;;;8748:34;8759:11;:19;;;8779:1;8759:22;;;;;;;;:::i;:::-;;;;;;;8748:10;:34::i;:::-;8732:50;-1:-1:-1;8804:37:205;8823:18;8804:37;;:::i;:::-;;;8372:595;;;8888:60;;;;;30989:2:357;8888:60:205;;;30971:21:357;31028:2;31008:18;;;31001:30;31067:34;31047:18;;;31040:62;31138:20;31118:18;;;31111:48;31176:19;;8888:60:205;30787:414:357;8372:595:205;5946:3035;;;;;;5881:3189;;;9005:50;;;;;31408:2:357;9005:50:205;;;31390:21:357;31447:2;31427:18;;;31420:30;31486:34;31466:18;;;31459:62;31557:10;31537:18;;;31530:38;31585:19;;9005:50:205;31206:404:357;5881:3189:205;-1:-1:-1;3328:3:205;;;;:::i;:::-;;;;3290:5790;;;-1:-1:-1;9090:47:205;;;;;31817:2:357;9090:47:205;;;31799:21:357;31856:2;31836:18;;;31829:30;31895:34;31875:18;;;31868:62;31966:7;31946:18;;;31939:35;31991:19;;9090:47:205;31615:401:357;4596:2947:106;4644:8;4700:1;4696;:5;4688:27;;;;;;;32223:2:357;4688:27:106;;;32205:21:357;32262:1;32242:18;;;32235:29;32300:11;32280:18;;;32273:39;32329:18;;4688:27:106;32021:332:357;4688:27:106;5107:8;5145:2;5125:16;5138:1;5125:4;:16::i;:::-;5118:29;5175:3;:7;;;5161:22;;;;5208:17;;;6001:31;5997:35;;6052:5;;5459:2;6051:13;;;6068:32;6050:50;6120:5;;6119:13;;6136:33;6118:51;6189:5;;6188:13;;6205:33;6187:51;6258:5;;6257:13;;6274:33;6256:51;6327:5;;6326:13;;6343:32;6325:50;6395:5;;6394:13;;6411:30;6393:48;5398:31;5394:35;;5449:5;;5448:13;;5465:32;5447:50;5517:5;;5516:13;;5533:32;5515:50;5585:5;;5584:13;;5583:50;;5653:5;;5652:13;;5651:50;;5721:5;;5720:13;;;5719:50;;5787:5;;;:46;;6735:10;7125:43;7120:48;7232:71;:75;;;;7227:80;;;;7380:72;7375:77;7523:3;7517:9;;;-1:-1:-1;;4596:2947:106:o;1487:3103::-;1536:8;1718:21;1713:1;:26;1709:40;;-1:-1:-1;1748:1:106;;1487:3103;-1:-1:-1;1487:3103:106:o;1709:40::-;1948:21;1943:1;:26;1939:54;;1971:22;;;;;32560:2:357;1971:22:106;;;32542:21:357;32599:2;32579:18;;;32572:30;32638:14;32618:18;;;32611:42;32670:18;;1971:22:106;32358:336:357;1939:54:106;2266:5;2260:2;2255:7;;;2254:17;;-1:-1:-1;2535:8:106;2601:2;2559:29;2548:7;;;2547:41;2591:5;2547:49;2546:57;;2629:29;2625:33;;2621:37;;;3300:35;;;3355:5;;2935:2;3354:13;;;3371:32;3353:50;3423:5;;3422:13;;3421:51;;3492:5;;3491:13;;3508:34;3490:52;3562:5;;3561:13;;3560:53;;3633:5;;3632:13;;3649:35;3631:53;2941:32;2874:31;2870:35;;2925:5;;2924:13;;2923:50;;;2998:5;;;:40;;3058:5;3057:13;;;3074:35;3056:53;3127:5;;;3136:40;3127:50;4002:10;4502:49;4489:62;4564:3;:7;;;;4488:84;;;;;;-1:-1:-1;;1487:3103:106:o;9434:390:205:-;9553:13;;9500:24;;9553:13;9585:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;9585:22:205;;;;;;;;;;;;;;;;9576:31;;9622:9;9617:201;9641:6;9637:1;:10;9617:201;;;9676:72;;;;;;;;9696:6;9703:1;9696:9;;;;;;;;:::i;:::-;;;;;;;9676:72;;;;9716:29;9735:6;9742:1;9735:9;;;;;;;;:::i;:::-;;;;;;;9716:18;:29::i;:::-;9676:72;;;9664:6;9671:1;9664:9;;;;;;;;:::i;:::-;;;;;;;;;;:84;9790:3;;9617:201;;;;9526:298;9434:390;;;:::o;4332:1978:191:-;4395:12;4419:21;4550:4;4544:11;4532:23;;4663:6;4657:13;4836:11;4830:4;4826:22;5195:4;5180:13;5176:24;5169:4;5165:9;5161:40;5151:8;5147:55;5141:4;5134:69;5293:13;5283:8;5276:31;;5434:4;5426:6;5422:17;5571:4;5561:8;5557:19;5662:4;5647:622;5675:11;5672:1;5669:18;5647:622;;;5854:1;5848:4;5844:12;5830;5826:31;5996:1;5984:10;5980:18;5974:25;5968:4;5963:37;6119:1;6113:4;6109:12;6101:6;6093:29;6249:4;6246:1;6242:12;6235:4;6227:6;6223:17;6215:40;-1:-1:-1;;5702:4:191;5695:12;5647:622;;;-1:-1:-1;6295:8:191;;4332:1978;-1:-1:-1;;;;;4332:1978:191:o;3993:464:203:-;4055:17;4085:18;4105;4125:20;4149:18;4163:3;4149:13;:18::i;:::-;4084:83;;-1:-1:-1;4084:83:203;-1:-1:-1;4084:83:203;-1:-1:-1;4198:21:203;4186:8;:33;;;;;;;;:::i;:::-;;4178:103;;;;;;;33090:2:357;4178:103:203;;;33072:21:357;33129:2;33109:18;;;33102:30;33168:34;33148:18;;;33141:62;33239:27;33219:18;;;33212:55;33284:19;;4178:103:203;32888:421:357;4178:103:203;4314:23;4327:10;4314;:23;:::i;:::-;4300:10;;:37;4292:102;;;;;;;33516:2:357;4292:102:203;;;33498:21:357;33555:2;33535:18;;;33528:30;33594:34;33574:18;;;33567:62;33665:22;33645:18;;;33638:50;33705:19;;4292:102:203;33314:416:357;4292:102:203;4412:38;4418:3;:7;;;4427:10;4439;4412:5;:38::i;10121:193:205:-;10195:16;10244:2;10229:5;:12;;;:17;:78;;10281:26;10301:5;10281:19;:26::i;:::-;10229:78;;;10249:29;10272:5;10249:22;:29::i;10495:172::-;10562:21;10606:54;10622:37;10642:5;:13;;;10656:1;10642:16;;;;;;;;:::i;10622:37::-;10606:15;:54::i;3805:237:191:-;3880:12;3918:6;:13;3908:6;:23;3904:70;;-1:-1:-1;3954:9:191;;;;;;;;;-1:-1:-1;3954:9:191;;3947:16;;3904:70;3990:45;3996:6;4004;4028;4012;:13;:22;;;;:::i;:::-;3990:5;:45::i;10892:321:205:-;10980:15;11007:11;11034:2;:9;11022:2;:9;:21;11021:47;;11059:2;:9;11021:47;;;11047:2;:9;11021:47;11007:61;;11078:129;11095:3;11085:7;:13;:43;;;;;11117:2;11120:7;11117:11;;;;;;;;:::i;:::-;;;;;;;;;11102:26;;;:2;11105:7;11102:11;;;;;;;;:::i;:::-;;;;;;;:26;11085:43;11078:129;;;11173:9;;;;;11078:129;;;10997:216;10892:321;;;;:::o;15328:575:106:-;15376:9;15409:1;15405;:5;15397:27;;;;;;;32223:2:357;15397:27:106;;;32205:21:357;32262:1;32242:18;;;32235:29;32300:11;32280:18;;;32273:39;32329:18;;15397:27:106;32021:332:357;15397:27:106;-1:-1:-1;15821:1:106;15473:34;-1:-1:-1;;15467:1:106;15463:49;15566:9;;;15546:18;15543:33;15540:1;15536:41;15530:48;15624:9;;;15612:10;15609:25;15606:1;15602:33;15596:40;15678:9;;;15670:6;15667:21;15664:1;15660:29;15654:36;15730:9;;;15724:4;15721:19;15718:1;15714:27;;;15708:34;;;15781:9;;;15776:3;15773:18;15770:1;15766:26;15760:33;15832:9;;;15824:18;;;15817:26;;15811:33;15876:9;;;-1:-1:-1;15862:25:106;;15328:575::o;3732:130:203:-;3791:21;3831:24;3840:14;3850:3;3840:9;:14::i;:::-;3831:8;:24::i;5246:4079::-;5335:15;5352;5369:17;5705:1;5692:3;:10;;;:14;5684:101;;;;;;;33937:2:357;5684:101:203;;;33919:21:357;33976:2;33956:18;;;33949:30;34015:34;33995:18;;;33988:62;34086:34;34066:18;;;34059:62;34158:12;34137:19;;;34130:41;34188:19;;5684:101:203;33735:478:357;5684:101:203;5816:7;;;;5898:10;;5796:17;5890:19;5943:4;5933:14;;5929:3390;;5999:1;6002;6005:21;5991:36;;;;;;;;;;5929:3390;6058:4;6048:6;:14;6044:3275;;6164:14;6181:13;6190:4;6181:6;:13;:::i;:::-;6164:30;;6247:6;6234:3;:10;;;:19;6209:140;;;;;;;34420:2:357;6209:140:203;;;34402:21:357;34459:2;34439:18;;;34432:30;34498:34;34478:18;;;34471:62;34569:34;34549:18;;;34542:62;34641:16;34620:19;;;34613:45;34675:19;;6209:140:203;34218:482:357;6209:140:203;6471:1;6462:11;;;6456:18;6476:14;6452:39;;6544:11;;;;:41;;-1:-1:-1;6559:26:203;;;;;;6544:41;6519:177;;;;;;;34907:2:357;6519:177:203;;;34889:21:357;34946:2;34926:18;;;34919:30;34985:34;34965:18;;;34958:62;35056:34;35036:18;;;35029:62;35128:15;35107:19;;;35100:44;35161:19;;6519:177:203;34705:481:357;6519:177:203;-1:-1:-1;6719:1:203;;-1:-1:-1;6722:6:203;-1:-1:-1;6730:21:203;;-1:-1:-1;6711:41:203;;-1:-1:-1;;6711:41:203;6044:3275;6783:4;6773:6;:14;6769:2550;;6831:19;6853:13;6862:4;6853:6;:13;:::i;:::-;6831:35;;6919:11;6906:3;:10;;;:24;6881:164;;;;;;;35393:2:357;6881:164:203;;;35375:21:357;35432:2;35412:18;;;35405:30;35471:34;35451:18;;;35444:62;35542:34;35522:18;;;35515:62;35614:19;35593;;;35586:48;35651:19;;6881:164:203;35191:485:357;6881:164:203;7167:1;7158:11;;7152:18;7172:14;7148:39;7060:25;7240:26;;;7215:143;;;;;;;35883:2:357;7215:143:203;;;35865:21:357;35922:2;35902:18;;;35895:30;35961:34;35941:18;;;35934:62;36032:34;36012:18;;;36005:62;36104:12;36083:19;;;36076:41;36134:19;;7215:143:203;35681:478:357;7215:143:203;7488:1;7479:11;;7473:18;7455:1;7451:19;;7446:3;7442:29;7438:54;7537:2;7528:11;;7520:96;;;;;;;36366:2:357;7520:96:203;;;36348:21:357;36405:2;36385:18;;;36378:30;36444:34;36424:18;;;36417:62;36515:34;36495:18;;;36488:62;36587:10;36566:19;;;36559:39;36615:19;;7520:96:203;36164:476:357;7520:96:203;7669:20;7683:6;7669:11;:20;:::i;:::-;7656:10;;:33;7631:168;;;;;;;36847:2:357;7631:168:203;;;36829:21:357;36886:2;36866:18;;;36859:30;36925:34;36905:18;;;36898:62;36996:34;36976:18;;;36969:62;37068:14;37047:19;;;37040:43;37100:19;;7631:168:203;36645:480:357;7631:168:203;7822:15;7826:11;7822:1;:15;:::i;:::-;7814:55;-1:-1:-1;7839:6:203;-1:-1:-1;7847:21:203;;-1:-1:-1;7814:55:203;;-1:-1:-1;;;;7814:55:203;6769:2550;7900:4;7890:6;:14;7886:1433;;8003:15;8021:13;8030:4;8021:6;:13;:::i;:::-;8003:31;;8070:7;8057:3;:10;;;:20;8049:107;;;;;;;37332:2:357;8049:107:203;;;37314:21:357;37371:2;37351:18;;;37344:30;37410:34;37390:18;;;37383:62;37481:34;37461:18;;;37454:62;37553:12;37532:19;;;37525:41;37583:19;;8049:107:203;37130:478:357;8049:107:203;8179:1;;-1:-1:-1;8182:7:203;-1:-1:-1;8179:1:203;;-1:-1:-1;8171:42:203;;-1:-1:-1;;8171:42:203;7886:1433;8270:20;8293:13;8302:4;8293:6;:13;:::i;:::-;8270:36;;8359:12;8346:3;:10;;;:25;8321:161;;;;;;;37815:2:357;8321:161:203;;;37797:21:357;37854:2;37834:18;;;37827:30;37893:34;37873:18;;;37866:62;37964:34;37944:18;;;37937:62;38036:15;38015:19;;;38008:44;38069:19;;8321:161:203;37613:481:357;8321:161:203;8604:1;8595:11;;8589:18;8609:14;8585:39;8497:25;8677:26;;;8652:141;;;;;;;38301:2:357;8652:141:203;;;38283:21:357;38340:2;38320:18;;;38313:30;38379:34;38359:18;;;38352:62;38450:34;38430:18;;;38423:62;38522:10;38501:19;;;38494:39;38550:19;;8652:141:203;38099:476:357;8652:141:203;8926:1;8917:11;;8911:18;8892:1;8888:20;;8883:3;8879:30;8875:55;8976:2;8966:12;;8958:95;;;;;;;38782:2:357;8958:95:203;;;38764:21:357;38821:2;38801:18;;;38794:30;38860:34;38840:18;;;38833:62;38931:34;38911:18;;;38904:62;39003:8;38982:19;;;38975:37;39029:19;;8958:95:203;38580:474:357;8958:95:203;9106:22;9121:7;9106:12;:22;:::i;:::-;9093:10;;:35;9068:168;;;;;;;39261:2:357;9068:168:203;;;39243:21:357;39300:2;39280:18;;;39273:30;39339:34;39319:18;;;39312:62;39410:34;39390:18;;;39383:62;39482:12;39461:19;;;39454:41;39512:19;;9068:168:203;39059:478:357;9068:168:203;9259:16;9263:12;9259:1;:16;:::i;:::-;9251:57;-1:-1:-1;9277:7:203;-1:-1:-1;9286:21:203;;-1:-1:-1;9251:57:203;;-1:-1:-1;;;;9251:57:203;5246:4079;;;;;;:::o;9585:737::-;9676:17;9722:7;9712:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9712:18:203;-1:-1:-1;9705:25:203;-1:-1:-1;9740:54:203;;9772:11;9740:54;10010:11;10024:36;10053:7;10045:4;10024:36;:::i;:::-;10010:50;;10115:2;10109:4;10105:13;10140:1;10154:87;10168:7;10165:1;10162:14;10154:87;;;10226:11;;;10220:18;10206:12;;;10199:40;10191:2;10184:10;10154:87;;;10264:7;10261:1;10258:14;10255:51;;;10302:1;10292:7;10286:4;10282:18;10275:29;10255:51;;;10079:237;9585:737;;;;;:::o;4847:137::-;4912:17;4948:29;4954:3;:7;;;4963:1;4966:3;:10;;;4948:5;:29::i;660:2816:191:-;752:12;824:7;808;818:2;808:12;:23;;800:50;;;;;;;39744:2:357;800:50:191;;;39726:21:357;39783:2;39763:18;;;39756:30;39822:16;39802:18;;;39795:44;39856:18;;800:50:191;39542:338:357;800:50:191;892:6;881:7;872:6;:16;:26;;864:53;;;;;;;39744:2:357;864:53:191;;;39726:21:357;39783:2;39763:18;;;39756:30;39822:16;39802:18;;;39795:44;39856:18;;864:53:191;39542:338:357;864:53:191;965:7;956:6;:16;939:6;:13;:33;;931:63;;;;;;;40087:2:357;931:63:191;;;40069:21:357;40126:2;40106:18;;;40099:30;40165:19;40145:18;;;40138:47;40202:18;;931:63:191;39885:341:357;931:63:191;1015:22;1078:15;;1106:1931;;;;3178:4;3172:11;3159:24;;3365:1;3354:9;3347:20;3413:4;3402:9;3398:20;3392:4;3385:34;1071:2362;;1106:1931;1288:4;1282:11;1269:24;;1947:2;1938:7;1934:16;2329:9;2322:17;2316:4;2312:28;2300:9;2289;2285:25;2281:60;2377:7;2373:2;2369:16;2629:6;2615:9;2608:17;2602:4;2598:28;2586:9;2578:6;2574:22;2570:57;2566:70;2403:389;2662:3;2658:2;2655:11;2403:389;;;2780:9;;2769:21;;2703:4;2695:13;;;;2735;2403:389;;;-1:-1:-1;;2810:26:191;;;3018:2;3001:11;3014:7;2997:25;2991:4;2984:39;-1:-1:-1;1071:2362:191;-1:-1:-1;3460:9:191;660:2816;-1:-1:-1;;;;660:2816:191:o;1298:390:203:-;-1:-1:-1;;;;;;;;;;;;;;;;;1453:1:203;1440:3;:10;:14;1432:101;;;;;;;33937:2:357;1432:101:203;;;33919:21:357;33976:2;33956:18;;;33949:30;34015:34;33995:18;;;33988:62;34086:34;34066:18;;;34059:62;34158:12;34137:19;;;34130:41;34188:19;;1432:101:203;33735:478:357;1432:101:203;-1:-1:-1;1640:41:203;;;;;;;;;1658:10;;1640:41;;1610:2;1601:12;;;1640:41;;;;;;;;1298:390::o;1840:1740::-;1901:21;1935:18;1955;1975:20;1999:18;2013:3;1999:13;:18::i;:::-;1934:83;;-1:-1:-1;1934:83:203;-1:-1:-1;1934:83:203;-1:-1:-1;2048:21:203;2036:8;:33;;;;;;;;:::i;:::-;;2028:102;;;;;;;40433:2:357;2028:102:203;;;40415:21:357;40472:2;40452:18;;;40445:30;40511:34;40491:18;;;40484:62;40582:26;40562:18;;;40555:54;40626:19;;2028:102:203;40231:420:357;2028:102:203;2176:10;;2149:23;2162:10;2149;:23;:::i;:::-;:37;2141:100;;;;;;;40858:2:357;2141:100:203;;;40840:21:357;40897:2;40877:18;;;40870:30;40936:34;40916:18;;;40909:62;41007:20;40987:18;;;40980:48;41045:19;;2141:100:203;40656:414:357;2141:100:203;2651:30;;;1123:2;2651:30;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;2651:30:203;;;;;;;;;;;;;;-1:-1:-1;2644:37:203;-1:-1:-1;2692:17:203;2740:10;2760:681;2776:10;;2767:19;;2760:681;;;2803:18;2823;2846:150;2877:105;;;;;;;;2908:6;2895:3;:10;;;:19;;;;:::i;:::-;2877:105;;;;2972:6;2961:3;:7;;;2940:38;;;;:::i;:::-;2877:105;;2846:13;:150::i;:::-;2802:194;;;;;3201:153;;;;;;;;3248:10;3235;:23;;;;:::i;:::-;3201:153;;;;3332:6;3321:3;:7;;;3300:38;;;;:::i;:::-;3201:153;;;3183:4;3188:9;3183:15;;;;;;;;:::i;:::-;;;;;;;;;;:171;3369:14;3382:1;3369:14;;:::i;:::-;;-1:-1:-1;3407:23:203;3420:10;3407;:23;:::i;:::-;3397:33;;;;:::i;:::-;;;2788:653;;2760:681;;;-1:-1:-1;3541:23:203;;-1:-1:-1;3548:4:203;;1840:1740;-1:-1:-1;;;1840:1740:203:o;755:184:357:-;807:77;804:1;797:88;904:4;901:1;894:15;928:4;925:1;918:15;944:334;1015:2;1009:9;1071:2;1061:13;;1076:66;1057:86;1045:99;;1174:18;1159:34;;1195:22;;;1156:62;1153:88;;;1221:18;;:::i;:::-;1257:2;1250:22;944:334;;-1:-1:-1;944:334:357:o;1283:154::-;1369:42;1362:5;1358:54;1351:5;1348:65;1338:93;;1427:1;1424;1417:12;1338:93;1283:154;:::o;1442:589::-;1484:5;1537:3;1530:4;1522:6;1518:17;1514:27;1504:55;;1555:1;1552;1545:12;1504:55;1591:6;1578:20;1617:18;1613:2;1610:26;1607:52;;;1639:18;;:::i;:::-;1683:114;1791:4;1722:66;1715:4;1711:2;1707:13;1703:86;1699:97;1683:114;:::i;:::-;1822:2;1813:7;1806:19;1868:3;1861:4;1856:2;1848:6;1844:15;1840:26;1837:35;1834:55;;;1885:1;1882;1875:12;1834:55;1950:2;1943:4;1935:6;1931:17;1924:4;1915:7;1911:18;1898:55;1998:1;1973:16;;;1991:4;1969:27;1962:38;;;;1977:7;1442:589;-1:-1:-1;;;1442:589:357:o;2036:1032::-;2104:5;2152:4;2140:9;2135:3;2131:19;2127:30;2124:50;;;2170:1;2167;2160:12;2124:50;2203:2;2197:9;2245:4;2237:6;2233:17;2269:18;2337:6;2325:10;2322:22;2317:2;2305:10;2302:18;2299:46;2296:72;;;2348:18;;:::i;:::-;2388:10;2384:2;2377:22;2417:6;2408:15;;2460:9;2447:23;2439:6;2432:39;2523:2;2512:9;2508:18;2495:32;2480:47;;2536:33;2561:7;2536:33;:::i;:::-;2602:7;2597:2;2589:6;2585:15;2578:32;2662:2;2651:9;2647:18;2634:32;2619:47;;2675:33;2700:7;2675:33;:::i;:::-;2741:7;2736:2;2728:6;2724:15;2717:32;2810:2;2799:9;2795:18;2782:32;2777:2;2769:6;2765:15;2758:57;2877:3;2866:9;2862:19;2849:33;2843:3;2835:6;2831:16;2824:59;2934:3;2923:9;2919:19;2906:33;2892:47;;2962:2;2954:6;2951:14;2948:34;;;2978:1;2975;2968:12;2948:34;;3016:45;3057:3;3048:6;3037:9;3033:22;3016:45;:::i;:::-;3010:3;3002:6;2998:16;2991:71;;;2036:1032;;;;:::o;3073:1175::-;3275:6;3283;3291;3299;3307;3351:9;3342:7;3338:23;3381:3;3377:2;3373:12;3370:32;;;3398:1;3395;3388:12;3370:32;3438:9;3425:23;3467:18;3508:2;3500:6;3497:14;3494:34;;;3524:1;3521;3514:12;3494:34;3547:72;3611:7;3602:6;3591:9;3587:22;3547:72;:::i;:::-;3537:82;;3666:2;3655:9;3651:18;3638:32;3628:42;;3763:3;3694:66;3690:2;3686:75;3682:85;3679:105;;;3780:1;3777;3770:12;3679:105;3818:2;3807:9;3803:18;3793:28;;3874:3;3863:9;3859:19;3846:33;3830:49;;3904:2;3894:8;3891:16;3888:36;;;3920:1;3917;3910:12;3888:36;3958:8;3947:9;3943:24;3933:34;;4005:7;3998:4;3994:2;3990:13;3986:27;3976:55;;4027:1;4024;4017:12;3976:55;4067:2;4054:16;4040:30;;4093:2;4085:6;4082:14;4079:34;;;4109:1;4106;4099:12;4079:34;;4162:7;4157:2;4147:6;4144:1;4140:14;4136:2;4132:23;4128:32;4125:45;4122:65;;;4183:1;4180;4173:12;4122:65;3073:1175;;;;-1:-1:-1;3073:1175:357;;-1:-1:-1;;;4214:2:357;4206:11;;4236:6;3073:1175::o;4253:258::-;4325:1;4335:113;4349:6;4346:1;4343:13;4335:113;;;4425:11;;;4419:18;4406:11;;;4399:39;4371:2;4364:10;4335:113;;;4466:6;4463:1;4460:13;4457:48;;;-1:-1:-1;;4501:1:357;4483:16;;4476:27;4253:258::o;4516:317::-;4558:3;4596:5;4590:12;4623:6;4618:3;4611:19;4639:63;4695:6;4688:4;4683:3;4679:14;4672:4;4665:5;4661:16;4639:63;:::i;:::-;4747:2;4735:15;4752:66;4731:88;4722:98;;;;4822:4;4718:109;;4516:317;-1:-1:-1;;4516:317:357:o;4838:220::-;4987:2;4976:9;4969:21;4950:4;5007:45;5048:2;5037:9;5033:18;5025:6;5007:45;:::i;5255:180::-;5314:6;5367:2;5355:9;5346:7;5342:23;5338:32;5335:52;;;5383:1;5380;5373:12;5335:52;-1:-1:-1;5406:23:357;;5255:180;-1:-1:-1;5255:180:357:o;5440:375::-;5540:6;5593:2;5581:9;5572:7;5568:23;5564:32;5561:52;;;5609:1;5606;5599:12;5561:52;5649:9;5636:23;5682:18;5674:6;5671:30;5668:50;;;5714:1;5711;5704:12;5668:50;5737:72;5801:7;5792:6;5781:9;5777:22;5737:72;:::i;:::-;5727:82;5440:375;-1:-1:-1;;;;5440:375:357:o;6260:171::-;6327:20;;6387:18;6376:30;;6366:41;;6356:69;;6421:1;6418;6411:12;6356:69;6260:171;;;:::o;6436:184::-;6494:6;6547:2;6535:9;6526:7;6522:23;6518:32;6515:52;;;6563:1;6560;6553:12;6515:52;6586:28;6604:9;6586:28;:::i;6830:601::-;6979:6;6987;6995;7048:2;7036:9;7027:7;7023:23;7019:32;7016:52;;;7064:1;7061;7054:12;7016:52;7103:9;7090:23;7122:31;7147:5;7122:31;:::i;:::-;7172:5;-1:-1:-1;7229:2:357;7214:18;;7201:32;7242:33;7201:32;7242:33;:::i;:::-;7294:7;-1:-1:-1;7353:2:357;7338:18;;7325:32;7366:33;7325:32;7366:33;:::i;:::-;7418:7;7408:17;;;6830:601;;;;;:::o;8247:118::-;8333:5;8326:13;8319:21;8312:5;8309:32;8299:60;;8355:1;8352;8345:12;8370:732;8470:6;8478;8486;8494;8502;8555:3;8543:9;8534:7;8530:23;8526:33;8523:53;;;8572:1;8569;8562:12;8523:53;8611:9;8598:23;8630:31;8655:5;8630:31;:::i;:::-;8680:5;-1:-1:-1;8732:2:357;8717:18;;8704:32;;-1:-1:-1;8755:37:357;8788:2;8773:18;;8755:37;:::i;:::-;8745:47;;8844:2;8833:9;8829:18;8816:32;8857:30;8879:7;8857:30;:::i;:::-;8906:7;-1:-1:-1;8964:3:357;8949:19;;8936:33;8992:18;8981:30;;8978:50;;;9024:1;9021;9014:12;8978:50;9047:49;9088:7;9079:6;9068:9;9064:22;9047:49;:::i;:::-;9037:59;;;8370:732;;;;;;;;:::o;9107:642::-;9370:6;9365:3;9358:19;9407:6;9402:2;9397:3;9393:12;9386:28;9466:66;9457:6;9452:3;9448:16;9444:89;9439:2;9434:3;9430:12;9423:111;9587:6;9580:14;9573:22;9568:3;9564:32;9559:2;9554:3;9550:12;9543:54;9340:3;9626:6;9620:13;9642:60;9695:6;9690:2;9685:3;9681:12;9676:2;9668:6;9664:15;9642:60;:::i;:::-;9722:16;;;;9740:2;9718:25;;9107:642;-1:-1:-1;;;;;;9107:642:357:o;9977:251::-;10047:6;10100:2;10088:9;10079:7;10075:23;10071:32;10068:52;;;10116:1;10113;10106:12;10068:52;10148:9;10142:16;10167:31;10192:5;10167:31;:::i;10847:192::-;10926:13;;10979:34;10968:46;;10958:57;;10948:85;;11029:1;11026;11019:12;11044:617;11148:6;11201:2;11189:9;11180:7;11176:23;11172:32;11169:52;;;11217:1;11214;11207:12;11169:52;11250:2;11244:9;11292:2;11284:6;11280:15;11361:6;11349:10;11346:22;11325:18;11313:10;11310:34;11307:62;11304:88;;;11372:18;;:::i;:::-;11408:2;11401:22;11447:16;;11432:32;;11497:49;11542:2;11527:18;;11497:49;:::i;:::-;11492:2;11484:6;11480:15;11473:74;11580:49;11625:2;11614:9;11610:18;11580:49;:::i;:::-;11575:2;11563:15;;11556:74;11567:6;11044:617;-1:-1:-1;;;11044:617:357:o;11666:648::-;11760:6;11813:3;11801:9;11792:7;11788:23;11784:33;11781:53;;;11830:1;11827;11820:12;11781:53;11863:2;11857:9;11905:3;11897:6;11893:16;11975:6;11963:10;11960:22;11939:18;11927:10;11924:34;11921:62;11918:88;;;11986:18;;:::i;:::-;12026:10;12022:2;12015:22;;12074:9;12061:23;12053:6;12046:39;12146:2;12135:9;12131:18;12118:32;12113:2;12105:6;12101:15;12094:57;12212:2;12201:9;12197:18;12184:32;12179:2;12171:6;12167:15;12160:57;12278:2;12267:9;12263:18;12250:32;12245:2;12237:6;12233:15;12226:57;12302:6;12292:16;;;11666:648;;;;:::o;13811:934::-;13947:9;13981:18;14022:2;14014:6;14011:14;14008:40;;;14028:18;;:::i;:::-;14074:6;14071:1;14067:14;14100:4;14124:28;14148:2;14144;14140:11;14124:28;:::i;:::-;14186:19;;;14256:14;;;;14221:12;;;;14293:14;14282:26;;14279:46;;;14321:1;14318;14311:12;14279:46;14345:5;14359:353;14375:6;14370:3;14367:15;14359:353;;;14461:3;14448:17;14497:2;14484:11;14481:19;14478:109;;;14541:1;14570:2;14566;14559:14;14478:109;14612:57;14654:14;14640:11;14633:5;14629:23;14612:57;:::i;:::-;14600:70;;-1:-1:-1;14690:12:357;;;;14392;;14359:353;;;-1:-1:-1;14734:5:357;13811:934;-1:-1:-1;;;;;;;13811:934:357:o;15169:245::-;15236:6;15289:2;15277:9;15268:7;15264:23;15260:32;15257:52;;;15305:1;15302;15295:12;15257:52;15337:9;15331:16;15356:28;15378:5;15356:28;:::i;16270:184::-;16340:6;16393:2;16381:9;16372:7;16368:23;16364:32;16361:52;;;16409:1;16406;16399:12;16361:52;-1:-1:-1;16432:16:357;;16270:184;-1:-1:-1;16270:184:357:o;18801:::-;18853:77;18850:1;18843:88;18950:4;18947:1;18940:15;18974:4;18971:1;18964:15;18990:270;19029:7;19061:18;19106:2;19103:1;19099:10;19136:2;19133:1;19129:10;19192:3;19188:2;19184:12;19179:3;19176:21;19169:3;19162:11;19155:19;19151:47;19148:73;;;19201:18;;:::i;:::-;19241:13;;18990:270;-1:-1:-1;;;;18990:270:357:o;19265:236::-;19304:3;19332:18;19377:2;19374:1;19370:10;19407:2;19404:1;19400:10;19438:3;19434:2;19430:12;19425:3;19422:21;19419:47;;;19446:18;;:::i;:::-;19482:13;;19265:236;-1:-1:-1;;;;19265:236:357:o;20120:125::-;20160:4;20188:1;20185;20182:8;20179:34;;;20193:18;;:::i;:::-;-1:-1:-1;20230:9:357;;20120:125::o;20250:184::-;20302:77;20299:1;20292:88;20399:4;20396:1;20389:15;20423:4;20420:1;20413:15;20439:308;20478:1;20504;20494:35;;20509:18;;:::i;:::-;20626:66;20623:1;20620:73;20551:66;20548:1;20545:73;20541:153;20538:179;;;20697:18;;:::i;:::-;-1:-1:-1;20731:10:357;;20439:308::o;20752:369::-;20791:4;20827:1;20824;20820:9;20936:1;20868:66;20864:74;20861:1;20857:82;20852:2;20845:10;20841:99;20838:125;;;20943:18;;:::i;:::-;21062:1;20994:66;20990:74;20987:1;20983:82;20979:2;20975:91;20972:117;;;21069:18;;:::i;:::-;-1:-1:-1;;21106:9:357;;20752:369::o;21126:655::-;21165:7;21197:66;21289:1;21286;21282:9;21317:1;21314;21310:9;21362:1;21358:2;21354:10;21351:1;21348:17;21343:2;21339;21335:11;21331:35;21328:61;;;21369:18;;:::i;:::-;21408:66;21500:1;21497;21493:9;21547:1;21543:2;21538:11;21535:1;21531:19;21526:2;21522;21518:11;21514:37;21511:63;;;21554:18;;:::i;:::-;21600:1;21597;21593:9;21583:19;;21647:1;21643:2;21638:11;21635:1;21631:19;21626:2;21622;21618:11;21614:37;21611:63;;;21654:18;;:::i;:::-;21719:1;21715:2;21710:11;21707:1;21703:19;21698:2;21694;21690:11;21686:37;21683:63;;;21726:18;;:::i;:::-;-1:-1:-1;;;21766:9:357;;;;;21126:655;-1:-1:-1;;;21126:655:357:o;21786:367::-;21825:3;21860:1;21857;21853:9;21969:1;21901:66;21897:74;21894:1;21890:82;21885:2;21878:10;21874:99;21871:125;;;21976:18;;:::i;:::-;22095:1;22027:66;22023:74;22020:1;22016:82;22012:2;22008:91;22005:117;;;22102:18;;:::i;:::-;-1:-1:-1;;22138:9:357;;21786:367::o;22158:228::-;22198:7;22324:1;22256:66;22252:74;22249:1;22246:81;22241:1;22234:9;22227:17;22223:105;22220:131;;;22331:18;;:::i;:::-;-1:-1:-1;22371:9:357;;22158:228::o;22391:120::-;22431:1;22457;22447:35;;22462:18;;:::i;:::-;-1:-1:-1;22496:9:357;;22391:120::o;22912:656::-;23199:6;23188:9;23181:25;23162:4;23225:42;23315:2;23307:6;23303:15;23298:2;23287:9;23283:18;23276:43;23367:2;23359:6;23355:15;23350:2;23339:9;23335:18;23328:43;;23407:6;23402:2;23391:9;23387:18;23380:34;23451:6;23445:3;23434:9;23430:19;23423:35;23495:3;23489;23478:9;23474:19;23467:32;23516:46;23557:3;23546:9;23542:19;23534:6;23516:46;:::i;:::-;23508:54;22912:656;-1:-1:-1;;;;;;;;22912:656:357:o;23573:128::-;23613:3;23644:1;23640:6;23637:1;23634:13;23631:39;;;23650:18;;:::i;:::-;-1:-1:-1;23686:9:357;;23573:128::o;24118:167::-;24196:13;;24249:10;24238:22;;24228:33;;24218:61;;24275:1;24272;24265:12;24290:160;24367:13;;24420:4;24409:16;;24399:27;;24389:55;;24440:1;24437;24430:12;24455:888;24558:6;24611:3;24599:9;24590:7;24586:23;24582:33;24579:53;;;24628:1;24625;24618:12;24579:53;24661:2;24655:9;24703:3;24695:6;24691:16;24773:6;24761:10;24758:22;24737:18;24725:10;24722:34;24719:62;24716:88;;;24784:18;;:::i;:::-;24820:2;24813:22;24859:39;24888:9;24859:39;:::i;:::-;24851:6;24844:55;24932:47;24975:2;24964:9;24960:18;24932:47;:::i;:::-;24927:2;24919:6;24915:15;24908:72;25013:47;25056:2;25045:9;25041:18;25013:47;:::i;:::-;25008:2;25000:6;24996:15;24989:72;25094:48;25138:2;25127:9;25123:18;25094:48;:::i;:::-;25089:2;25081:6;25077:15;25070:73;25177:49;25221:3;25210:9;25206:19;25177:49;:::i;:::-;25171:3;25163:6;25159:16;25152:75;25261:50;25306:3;25295:9;25291:19;25261:50;:::i;:::-;25255:3;25243:16;;25236:76;25247:6;24455:888;-1:-1:-1;;;24455:888:357:o;25348:195::-;25387:3;25418:66;25411:5;25408:77;25405:103;;25488:18;;:::i;:::-;-1:-1:-1;25535:1:357;25524:13;;25348:195::o;26085:184::-;26137:77;26134:1;26127:88;26234:4;26231:1;26224:15;26258:4;26255:1;26248:15;28717:157;28747:1;28781:4;28778:1;28774:12;28805:3;28795:37;;28812:18;;:::i;:::-;28864:3;28857:4;28854:1;28850:12;28846:22;28841:27;;;28717:157;;;;:::o;28879:195::-;28917:4;28954;28951:1;28947:12;28986:4;28983:1;28979:12;29011:3;29006;29003:12;29000:38;;;29018:18;;:::i;:::-;29055:13;;;28879:195;-1:-1:-1;;;28879:195:357:o;32699:184::-;32751:77;32748:1;32741:88;32848:4;32845:1;32838:15;32872:4;32869:1;32862:15","linkReferences":{}},"methodIdentifiers":{"depositTransaction(address,uint256,uint64,bool,bytes)":"e9e05c42","donateETH()":"8b4c40b0","finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))":"8c3152e9","finalizedWithdrawals(bytes32)":"a14238e7","guardian()":"452a9320","initialize(address,address,address)":"c0c53b8b","isOutputFinalized(uint256)":"6dbffb78","l2Oracle()":"9b5f694a","l2Sender()":"9bf62d82","minimumGasLimit(uint64)":"a35d99df","params()":"cff0ab96","paused()":"5c975abb","proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])":"4870496f","provenWithdrawals(bytes32)":"e965084c","superchainConfig()":"35e80ab3","systemConfig()":"33d7e2bd","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadTarget\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CallPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasEstimation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LargeCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfGas\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SmallGasLimit\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"opaqueData\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"WithdrawalProven\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"donateETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Types.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"guardian\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract L2OutputOracle\",\"name\":\"_l2Oracle\",\"type\":\"address\"},{\"internalType\":\"contract SystemConfig\",\"name\":\"_systemConfig\",\"type\":\"address\"},{\"internalType\":\"contract SuperchainConfig\",\"name\":\"_superchainConfig\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"}],\"name\":\"isOutputFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Oracle\",\"outputs\":[{\"internalType\":\"contract L2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_byteCount\",\"type\":\"uint64\"}],\"name\":\"minimumGasLimit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"paused_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Types.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"struct Types.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\"}],\"name\":\"proveWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"provenWithdrawals\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2OutputIndex\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superchainConfig\",\"outputs\":[{\"internalType\":\"contract SuperchainConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"systemConfig\",\"outputs\":[{\"internalType\":\"contract SystemConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"custom:proxied\":\"@title OptimismPortal\",\"events\":{\"TransactionDeposited(address,address,uint256,bytes)\":{\"params\":{\"from\":\"Address that triggered the deposit transaction.\",\"opaqueData\":\"ABI encoded deposit data to be parsed off-chain.\",\"to\":\"Address that the deposit transaction is directed to.\",\"version\":\"Version of this deposit transaction event.\"}},\"WithdrawalFinalized(bytes32,bool)\":{\"params\":{\"success\":\"Whether the withdrawal transaction was successful.\",\"withdrawalHash\":\"Hash of the withdrawal transaction.\"}},\"WithdrawalProven(bytes32,address,address)\":{\"params\":{\"from\":\"Address that triggered the withdrawal transaction.\",\"to\":\"Address that the withdrawal transaction is directed to.\",\"withdrawalHash\":\"Hash of the withdrawal transaction.\"}}},\"kind\":\"dev\",\"methods\":{\"depositTransaction(address,uint256,uint64,bool,bytes)\":{\"params\":{\"_data\":\"Data to trigger the recipient with.\",\"_gasLimit\":\"Amount of L2 gas to purchase by burning gas on L1.\",\"_isCreation\":\"Whether or not the transaction is a contract creation.\",\"_to\":\"Target address on L2.\",\"_value\":\"ETH value to send to the recipient.\"}},\"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))\":{\"params\":{\"_tx\":\"Withdrawal transaction to finalize.\"}},\"guardian()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Address of the guardian.\"}},\"initialize(address,address,address)\":{\"params\":{\"_l2Oracle\":\"Contract of the L2OutputOracle.\",\"_superchainConfig\":\"Contract of the SuperchainConfig.\",\"_systemConfig\":\"Contract of the SystemConfig.\"}},\"isOutputFinalized(uint256)\":{\"params\":{\"_l2OutputIndex\":\"Index of the L2 output to check.\"},\"returns\":{\"_0\":\"Whether or not the output is finalized.\"}},\"minimumGasLimit(uint64)\":{\"params\":{\"_byteCount\":\"Number of bytes in the calldata.\"},\"returns\":{\"_0\":\"The minimum gas limit for a deposit.\"}},\"paused()\":{\"returns\":{\"paused_\":\"Whether or not the contract is paused.\"}},\"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])\":{\"params\":{\"_l2OutputIndex\":\"L2 output index to prove against.\",\"_outputRootProof\":\"Inclusion proof of the L2ToL1MessagePasser contract's storage root.\",\"_tx\":\"Withdrawal transaction to finalize.\",\"_withdrawalProof\":\"Inclusion proof of the withdrawal in L2ToL1MessagePasser contract.\"}}},\"stateVariables\":{\"l2Oracle\":{\"custom:network-specific\":\"\"},\"spacer_53_0_1\":{\"custom:legacy\":\"@custom:spacer paused\"},\"systemConfig\":{\"custom:network-specific\":\"\"},\"version\":{\"custom:semver\":\"2.6.0\"}},\"version\":1},\"userdoc\":{\"errors\":{\"BadTarget()\":[{\"notice\":\"Error for when a deposit or withdrawal is to a bad target.\"}],\"CallPaused()\":[{\"notice\":\"Error for when a method cannot be called when paused. This could be renamed to `Paused` in the future, but it collides with the `Paused` event.\"}],\"GasEstimation()\":[{\"notice\":\"Error for special gas estimation.\"}],\"LargeCalldata()\":[{\"notice\":\"Error for when a deposit has too much calldata.\"}],\"OutOfGas()\":[{\"notice\":\"Error returned when too much gas resource is consumed.\"}],\"SmallGasLimit()\":[{\"notice\":\"Error for when a deposit has too small of a gas limit.\"}]},\"events\":{\"TransactionDeposited(address,address,uint256,bytes)\":{\"notice\":\"Emitted when a transaction is deposited from L1 to L2. The parameters of this event are read by the rollup node and used to derive deposit transactions on L2.\"},\"WithdrawalFinalized(bytes32,bool)\":{\"notice\":\"Emitted when a withdrawal transaction is finalized.\"},\"WithdrawalProven(bytes32,address,address)\":{\"notice\":\"Emitted when a withdrawal transaction is proven.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Constructs the OptimismPortal contract.\"},\"depositTransaction(address,uint256,uint64,bool,bytes)\":{\"notice\":\"Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in deriving deposit transactions. Note that if a deposit is made by a contract, its address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider using the CrossDomainMessenger contracts for a simpler developer experience.\"},\"donateETH()\":{\"notice\":\"Accepts ETH value without triggering a deposit to L2. This function mainly exists for the sake of the migration between the legacy Optimism system and Bedrock.\"},\"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))\":{\"notice\":\"Finalizes a withdrawal transaction.\"},\"finalizedWithdrawals(bytes32)\":{\"notice\":\"A list of withdrawal hashes which have been successfully finalized.\"},\"guardian()\":{\"notice\":\"Getter function for the address of the guardian. Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead.\"},\"initialize(address,address,address)\":{\"notice\":\"Initializer.\"},\"isOutputFinalized(uint256)\":{\"notice\":\"Determine if a given output is finalized. Reverts if the call to l2Oracle.getL2Output reverts. Returns a boolean otherwise.\"},\"l2Oracle()\":{\"notice\":\"Contract of the L2OutputOracle.\"},\"l2Sender()\":{\"notice\":\"Address of the L2 account which initiated a withdrawal in this transaction. If the of this variable is the default L2 sender address, then we are NOT inside of a call to finalizeWithdrawalTransaction.\"},\"minimumGasLimit(uint64)\":{\"notice\":\"Computes the minimum gas limit for a deposit. The minimum gas limit linearly increases based on the size of the calldata. This is to prevent users from creating L2 resource usage without paying for it. This function can be used when interacting with the portal to ensure forwards compatibility.\"},\"params()\":{\"notice\":\"EIP-1559 style gas parameters.\"},\"paused()\":{\"notice\":\"Getter for the current paused status.\"},\"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])\":{\"notice\":\"Proves a withdrawal transaction.\"},\"provenWithdrawals(bytes32)\":{\"notice\":\"A mapping of withdrawal hashes to `ProvenWithdrawal` data.\"},\"superchainConfig()\":{\"notice\":\"Contract of the Superchain Config.\"},\"systemConfig()\":{\"notice\":\"Contract of the SystemConfig.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"The OptimismPortal is a low-level contract responsible for passing messages between L1 and L2. Messages sent directly to the OptimismPortal have no form of replayability. Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L1/OptimismPortal.sol\":\"OptimismPortal\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"src/L1/L2OutputOracle.sol\":{\"keccak256\":\"0x342c5084f3c640c90530122bd78372c011d6162e698dd8c8daec9496fef01d42\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8700a3d486bd62cbb861ff80175b8040336940515791073af6a036db7c2df303\",\"dweb:/ipfs/QmSGKTH84rVHWgMg4d6GQZCmCJ16KuUuTsMwPMDdJxCsww\"]},\"src/L1/OptimismPortal.sol\":{\"keccak256\":\"0xf46a1158e86edcbb157d0b06a32db37867c0bc9d2aeeed6a8110547c7537201a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0aeb33d425db200953063e3576403b78c50e3a5e7b4f56ef4bead28919406ee2\",\"dweb:/ipfs/QmUFb1rEQnCFrGRZQPHgFFWJQ48SR7wodiSFLgQKu8Jx6k\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409\",\"dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM\"]},\"src/L1/SuperchainConfig.sol\":{\"keccak256\":\"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f\",\"dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB\"]},\"src/L1/SystemConfig.sol\":{\"keccak256\":\"0xc3d6392cbc44e38ddc93b84b82b08ab8e813df771a48926db3f94edde8f2b64a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d326d644dc59a57a71f4ff6eaa5c6d1464697c7df337b641fe82091b9050e6ce\",\"dweb:/ipfs/Qmd6tNzBmm8V4cpcMNyFWbWnKPNMRoysmmA62rZjGqpg7f\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72\",\"dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Bytes.sol\":{\"keccak256\":\"0x827f47d123b0fdf3b08816d5b33831811704dbf4e554e53f2269354f6bba8859\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3137ac7204d30a245a8b0d67aa6da5286f1bd8c90379daab561f84963b6db782\",\"dweb:/ipfs/QmWRhisw3axJK833gUScs23ETh2MLFbVzzqzYVMKSDN3S9\"]},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b\",\"dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp\"]},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff\",\"dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA\"]},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12\",\"dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF\"]},\"src/libraries/PortalErrors.sol\":{\"keccak256\":\"0x57adcaa45a1ce9c5af04d0fe4ecbc86e6ff3f947f7957ab55bdade129adcf558\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3cf485f11085ad6d1ba1386fdb340f65eb1048187692ad3d9eb8816e290140c1\",\"dweb:/ipfs/Qmb423b45TLV8PdhFa8Hs72eom5D2C5q4gVcYGNzDh4EMU\"]},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"]},\"src/libraries/Storage.sol\":{\"keccak256\":\"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269\",\"dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/libraries/rlp/RLPReader.sol\":{\"keccak256\":\"0x99731a39bc10203719d448117b0e6ef47771890440d595d118084d7988d59afb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1dbeb75d0cc8de58350cc15df8867bf97d8492e0617b1c62733ace6155c6915a\",\"dweb:/ipfs/QmNiXzskPE72h93F8EXT8wAXKzEh2EERLbubdVMfwTQbtj\"]},\"src/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b\",\"dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV\"]},\"src/libraries/trie/MerkleTrie.sol\":{\"keccak256\":\"0xf8ba770ee6666e73ae43184c700e9c704b2c4ace71f9e3c2227ddc11a8148b4c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4702ccee1fe44aea3ee01d59e6152eb755da083f786f00947fec4437c064fe74\",\"dweb:/ipfs/QmQjFj5J7hrEM1dxJjFszzW2Cs7g7eMhYNBXonF2DXBstE\"]},\"src/libraries/trie/SecureMerkleTrie.sol\":{\"keccak256\":\"0xeaff8315cfd21197bc6bc859c2decf5d4f4838c9c357c502cdf2b1eac863d288\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://79dcdcaa560aea51d138da4f5dc553a1808b6de090b2dc1629f18375edbff681\",\"dweb:/ipfs/QmbE4pUPhf5fLKW4W6cEjhQs55gEDvHmbmoBqkW1yz3bnw\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"src/vendor/AddressAliasHelper.sol\":{\"keccak256\":\"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88\",\"dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"BadTarget"},{"inputs":[],"type":"error","name":"CallPaused"},{"inputs":[],"type":"error","name":"GasEstimation"},{"inputs":[],"type":"error","name":"LargeCalldata"},{"inputs":[],"type":"error","name":"OutOfGas"},{"inputs":[],"type":"error","name":"SmallGasLimit"},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"version","type":"uint256","indexed":true},{"internalType":"bytes","name":"opaqueData","type":"bytes","indexed":false}],"type":"event","name":"TransactionDeposited","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"withdrawalHash","type":"bytes32","indexed":true},{"internalType":"bool","name":"success","type":"bool","indexed":false}],"type":"event","name":"WithdrawalFinalized","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"withdrawalHash","type":"bytes32","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"WithdrawalProven","anonymous":false},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint64","name":"_gasLimit","type":"uint64"},{"internalType":"bool","name":"_isCreation","type":"bool"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"depositTransaction"},{"inputs":[],"stateMutability":"payable","type":"function","name":"donateETH"},{"inputs":[{"internalType":"struct Types.WithdrawalTransaction","name":"_tx","type":"tuple","components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"finalizeWithdrawalTransaction"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"finalizedWithdrawals","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"contract L2OutputOracle","name":"_l2Oracle","type":"address"},{"internalType":"contract SystemConfig","name":"_systemConfig","type":"address"},{"internalType":"contract SuperchainConfig","name":"_superchainConfig","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[{"internalType":"uint256","name":"_l2OutputIndex","type":"uint256"}],"stateMutability":"view","type":"function","name":"isOutputFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"l2Oracle","outputs":[{"internalType":"contract L2OutputOracle","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"l2Sender","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint64","name":"_byteCount","type":"uint64"}],"stateMutability":"pure","type":"function","name":"minimumGasLimit","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"params","outputs":[{"internalType":"uint128","name":"prevBaseFee","type":"uint128"},{"internalType":"uint64","name":"prevBoughtGas","type":"uint64"},{"internalType":"uint64","name":"prevBlockNum","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"paused_","type":"bool"}]},{"inputs":[{"internalType":"struct Types.WithdrawalTransaction","name":"_tx","type":"tuple","components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}]},{"internalType":"uint256","name":"_l2OutputIndex","type":"uint256"},{"internalType":"struct Types.OutputRootProof","name":"_outputRootProof","type":"tuple","components":[{"internalType":"bytes32","name":"version","type":"bytes32"},{"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"internalType":"bytes32","name":"messagePasserStorageRoot","type":"bytes32"},{"internalType":"bytes32","name":"latestBlockhash","type":"bytes32"}]},{"internalType":"bytes[]","name":"_withdrawalProof","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function","name":"proveWithdrawalTransaction"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"provenWithdrawals","outputs":[{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint128","name":"timestamp","type":"uint128"},{"internalType":"uint128","name":"l2OutputIndex","type":"uint128"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"superchainConfig","outputs":[{"internalType":"contract SuperchainConfig","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"systemConfig","outputs":[{"internalType":"contract SystemConfig","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"depositTransaction(address,uint256,uint64,bool,bytes)":{"params":{"_data":"Data to trigger the recipient with.","_gasLimit":"Amount of L2 gas to purchase by burning gas on L1.","_isCreation":"Whether or not the transaction is a contract creation.","_to":"Target address on L2.","_value":"ETH value to send to the recipient."}},"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))":{"params":{"_tx":"Withdrawal transaction to finalize."}},"guardian()":{"custom:legacy":"","returns":{"_0":"Address of the guardian."}},"initialize(address,address,address)":{"params":{"_l2Oracle":"Contract of the L2OutputOracle.","_superchainConfig":"Contract of the SuperchainConfig.","_systemConfig":"Contract of the SystemConfig."}},"isOutputFinalized(uint256)":{"params":{"_l2OutputIndex":"Index of the L2 output to check."},"returns":{"_0":"Whether or not the output is finalized."}},"minimumGasLimit(uint64)":{"params":{"_byteCount":"Number of bytes in the calldata."},"returns":{"_0":"The minimum gas limit for a deposit."}},"paused()":{"returns":{"paused_":"Whether or not the contract is paused."}},"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])":{"params":{"_l2OutputIndex":"L2 output index to prove against.","_outputRootProof":"Inclusion proof of the L2ToL1MessagePasser contract's storage root.","_tx":"Withdrawal transaction to finalize.","_withdrawalProof":"Inclusion proof of the withdrawal in L2ToL1MessagePasser contract."}}},"version":1},"userdoc":{"kind":"user","methods":{"constructor":{"notice":"Constructs the OptimismPortal contract."},"depositTransaction(address,uint256,uint64,bool,bytes)":{"notice":"Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in deriving deposit transactions. Note that if a deposit is made by a contract, its address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider using the CrossDomainMessenger contracts for a simpler developer experience."},"donateETH()":{"notice":"Accepts ETH value without triggering a deposit to L2. This function mainly exists for the sake of the migration between the legacy Optimism system and Bedrock."},"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))":{"notice":"Finalizes a withdrawal transaction."},"finalizedWithdrawals(bytes32)":{"notice":"A list of withdrawal hashes which have been successfully finalized."},"guardian()":{"notice":"Getter function for the address of the guardian. Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead."},"initialize(address,address,address)":{"notice":"Initializer."},"isOutputFinalized(uint256)":{"notice":"Determine if a given output is finalized. Reverts if the call to l2Oracle.getL2Output reverts. Returns a boolean otherwise."},"l2Oracle()":{"notice":"Contract of the L2OutputOracle."},"l2Sender()":{"notice":"Address of the L2 account which initiated a withdrawal in this transaction. If the of this variable is the default L2 sender address, then we are NOT inside of a call to finalizeWithdrawalTransaction."},"minimumGasLimit(uint64)":{"notice":"Computes the minimum gas limit for a deposit. The minimum gas limit linearly increases based on the size of the calldata. This is to prevent users from creating L2 resource usage without paying for it. This function can be used when interacting with the portal to ensure forwards compatibility."},"params()":{"notice":"EIP-1559 style gas parameters."},"paused()":{"notice":"Getter for the current paused status."},"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])":{"notice":"Proves a withdrawal transaction."},"provenWithdrawals(bytes32)":{"notice":"A mapping of withdrawal hashes to `ProvenWithdrawal` data."},"superchainConfig()":{"notice":"Contract of the Superchain Config."},"systemConfig()":{"notice":"Contract of the SystemConfig."},"version()":{"notice":"Semantic version."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L1/OptimismPortal.sol":"OptimismPortal"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888","urls":["bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a","dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149","urls":["bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c","dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66","urls":["bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f","dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0","urls":["bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929","dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7","urls":["bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689","dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy"],"license":"MIT"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d","urls":["bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c","dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8"],"license":"MIT"},"src/L1/L2OutputOracle.sol":{"keccak256":"0x342c5084f3c640c90530122bd78372c011d6162e698dd8c8daec9496fef01d42","urls":["bzz-raw://8700a3d486bd62cbb861ff80175b8040336940515791073af6a036db7c2df303","dweb:/ipfs/QmSGKTH84rVHWgMg4d6GQZCmCJ16KuUuTsMwPMDdJxCsww"],"license":"MIT"},"src/L1/OptimismPortal.sol":{"keccak256":"0xf46a1158e86edcbb157d0b06a32db37867c0bc9d2aeeed6a8110547c7537201a","urls":["bzz-raw://0aeb33d425db200953063e3576403b78c50e3a5e7b4f56ef4bead28919406ee2","dweb:/ipfs/QmUFb1rEQnCFrGRZQPHgFFWJQ48SR7wodiSFLgQKu8Jx6k"],"license":"MIT"},"src/L1/ResourceMetering.sol":{"keccak256":"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408","urls":["bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409","dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM"],"license":"MIT"},"src/L1/SuperchainConfig.sol":{"keccak256":"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d","urls":["bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f","dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB"],"license":"MIT"},"src/L1/SystemConfig.sol":{"keccak256":"0xc3d6392cbc44e38ddc93b84b82b08ab8e813df771a48926db3f94edde8f2b64a","urls":["bzz-raw://d326d644dc59a57a71f4ff6eaa5c6d1464697c7df337b641fe82091b9050e6ce","dweb:/ipfs/Qmd6tNzBmm8V4cpcMNyFWbWnKPNMRoysmmA62rZjGqpg7f"],"license":"MIT"},"src/libraries/Arithmetic.sol":{"keccak256":"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db","urls":["bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72","dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq"],"license":"MIT"},"src/libraries/Burn.sol":{"keccak256":"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010","urls":["bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f","dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"],"license":"MIT"},"src/libraries/Bytes.sol":{"keccak256":"0x827f47d123b0fdf3b08816d5b33831811704dbf4e554e53f2269354f6bba8859","urls":["bzz-raw://3137ac7204d30a245a8b0d67aa6da5286f1bd8c90379daab561f84963b6db782","dweb:/ipfs/QmWRhisw3axJK833gUScs23ETh2MLFbVzzqzYVMKSDN3S9"],"license":"MIT"},"src/libraries/Constants.sol":{"keccak256":"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132","urls":["bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b","dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp"],"license":"MIT"},"src/libraries/Encoding.sol":{"keccak256":"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87","urls":["bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff","dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA"],"license":"MIT"},"src/libraries/Hashing.sol":{"keccak256":"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8","urls":["bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12","dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF"],"license":"MIT"},"src/libraries/PortalErrors.sol":{"keccak256":"0x57adcaa45a1ce9c5af04d0fe4ecbc86e6ff3f947f7957ab55bdade129adcf558","urls":["bzz-raw://3cf485f11085ad6d1ba1386fdb340f65eb1048187692ad3d9eb8816e290140c1","dweb:/ipfs/Qmb423b45TLV8PdhFa8Hs72eom5D2C5q4gVcYGNzDh4EMU"],"license":"MIT"},"src/libraries/SafeCall.sol":{"keccak256":"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f","urls":["bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a","dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq"],"license":"MIT"},"src/libraries/Storage.sol":{"keccak256":"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f","urls":["bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269","dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK"],"license":"MIT"},"src/libraries/Types.sol":{"keccak256":"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4","urls":["bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e","dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"],"license":"MIT"},"src/libraries/rlp/RLPReader.sol":{"keccak256":"0x99731a39bc10203719d448117b0e6ef47771890440d595d118084d7988d59afb","urls":["bzz-raw://1dbeb75d0cc8de58350cc15df8867bf97d8492e0617b1c62733ace6155c6915a","dweb:/ipfs/QmNiXzskPE72h93F8EXT8wAXKzEh2EERLbubdVMfwTQbtj"],"license":"MIT"},"src/libraries/rlp/RLPWriter.sol":{"keccak256":"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6","urls":["bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b","dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV"],"license":"MIT"},"src/libraries/trie/MerkleTrie.sol":{"keccak256":"0xf8ba770ee6666e73ae43184c700e9c704b2c4ace71f9e3c2227ddc11a8148b4c","urls":["bzz-raw://4702ccee1fe44aea3ee01d59e6152eb755da083f786f00947fec4437c064fe74","dweb:/ipfs/QmQjFj5J7hrEM1dxJjFszzW2Cs7g7eMhYNBXonF2DXBstE"],"license":"MIT"},"src/libraries/trie/SecureMerkleTrie.sol":{"keccak256":"0xeaff8315cfd21197bc6bc859c2decf5d4f4838c9c357c502cdf2b1eac863d288","urls":["bzz-raw://79dcdcaa560aea51d138da4f5dc553a1808b6de090b2dc1629f18375edbff681","dweb:/ipfs/QmbE4pUPhf5fLKW4W6cEjhQs55gEDvHmbmoBqkW1yz3bnw"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"},"src/vendor/AddressAliasHelper.sol":{"keccak256":"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237","urls":["bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88","dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR"],"license":"Apache-2.0"}},"version":1},"storageLayout":{"storage":[{"astId":49534,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":49537,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":88262,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"params","offset":0,"slot":"1","type":"t_struct(ResourceParams)88245_storage"},{"astId":88267,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"__gap","offset":0,"slot":"2","type":"t_array(t_uint256)48_storage"},{"astId":86489,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"l2Sender","offset":0,"slot":"50","type":"t_address"},{"astId":86494,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"finalizedWithdrawals","offset":0,"slot":"51","type":"t_mapping(t_bytes32,t_bool)"},{"astId":86500,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"provenWithdrawals","offset":0,"slot":"52","type":"t_mapping(t_bytes32,t_struct(ProvenWithdrawal)86478_storage)"},{"astId":86503,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"spacer_53_0_1","offset":0,"slot":"53","type":"t_bool"},{"astId":86507,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"superchainConfig","offset":1,"slot":"53","type":"t_contract(SuperchainConfig)88793"},{"astId":86511,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"l2Oracle","offset":0,"slot":"54","type":"t_contract(L2OutputOracle)86435"},{"astId":86515,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"systemConfig","offset":0,"slot":"55","type":"t_contract(SystemConfig)89607"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_uint256)48_storage":{"encoding":"inplace","label":"uint256[48]","numberOfBytes":"1536","base":"t_uint256"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_contract(L2OutputOracle)86435":{"encoding":"inplace","label":"contract L2OutputOracle","numberOfBytes":"20"},"t_contract(SuperchainConfig)88793":{"encoding":"inplace","label":"contract SuperchainConfig","numberOfBytes":"20"},"t_contract(SystemConfig)89607":{"encoding":"inplace","label":"contract SystemConfig","numberOfBytes":"20"},"t_mapping(t_bytes32,t_bool)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => bool)","numberOfBytes":"32","value":"t_bool"},"t_mapping(t_bytes32,t_struct(ProvenWithdrawal)86478_storage)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal)","numberOfBytes":"32","value":"t_struct(ProvenWithdrawal)86478_storage"},"t_struct(ProvenWithdrawal)86478_storage":{"encoding":"inplace","label":"struct OptimismPortal.ProvenWithdrawal","numberOfBytes":"64","members":[{"astId":86473,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"outputRoot","offset":0,"slot":"0","type":"t_bytes32"},{"astId":86475,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"timestamp","offset":0,"slot":"1","type":"t_uint128"},{"astId":86477,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"l2OutputIndex","offset":16,"slot":"1","type":"t_uint128"}]},"t_struct(ResourceParams)88245_storage":{"encoding":"inplace","label":"struct ResourceMetering.ResourceParams","numberOfBytes":"32","members":[{"astId":88240,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"prevBaseFee","offset":0,"slot":"0","type":"t_uint128"},{"astId":88242,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"prevBoughtGas","offset":16,"slot":"0","type":"t_uint64"},{"astId":88244,"contract":"src/L1/OptimismPortal.sol:OptimismPortal","label":"prevBlockNum","offset":24,"slot":"0","type":"t_uint64"}]},"t_uint128":{"encoding":"inplace","label":"uint128","numberOfBytes":"16"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint64":{"encoding":"inplace","label":"uint64","numberOfBytes":"8"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{"version":1,"kind":"user","methods":{"constructor":{"notice":"Constructs the OptimismPortal contract."},"depositTransaction(address,uint256,uint64,bool,bytes)":{"notice":"Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in deriving deposit transactions. Note that if a deposit is made by a contract, its address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider using the CrossDomainMessenger contracts for a simpler developer experience."},"donateETH()":{"notice":"Accepts ETH value without triggering a deposit to L2. This function mainly exists for the sake of the migration between the legacy Optimism system and Bedrock."},"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))":{"notice":"Finalizes a withdrawal transaction."},"finalizedWithdrawals(bytes32)":{"notice":"A list of withdrawal hashes which have been successfully finalized."},"guardian()":{"notice":"Getter function for the address of the guardian. Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead."},"initialize(address,address,address)":{"notice":"Initializer."},"isOutputFinalized(uint256)":{"notice":"Determine if a given output is finalized. Reverts if the call to l2Oracle.getL2Output reverts. Returns a boolean otherwise."},"l2Oracle()":{"notice":"Contract of the L2OutputOracle."},"l2Sender()":{"notice":"Address of the L2 account which initiated a withdrawal in this transaction. If the of this variable is the default L2 sender address, then we are NOT inside of a call to finalizeWithdrawalTransaction."},"minimumGasLimit(uint64)":{"notice":"Computes the minimum gas limit for a deposit. The minimum gas limit linearly increases based on the size of the calldata. This is to prevent users from creating L2 resource usage without paying for it. This function can be used when interacting with the portal to ensure forwards compatibility."},"params()":{"notice":"EIP-1559 style gas parameters."},"paused()":{"notice":"Getter for the current paused status."},"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])":{"notice":"Proves a withdrawal transaction."},"provenWithdrawals(bytes32)":{"notice":"A mapping of withdrawal hashes to `ProvenWithdrawal` data."},"superchainConfig()":{"notice":"Contract of the Superchain Config."},"systemConfig()":{"notice":"Contract of the SystemConfig."},"version()":{"notice":"Semantic version."}},"events":{"TransactionDeposited(address,address,uint256,bytes)":{"notice":"Emitted when a transaction is deposited from L1 to L2. The parameters of this event are read by the rollup node and used to derive deposit transactions on L2."},"WithdrawalFinalized(bytes32,bool)":{"notice":"Emitted when a withdrawal transaction is finalized."},"WithdrawalProven(bytes32,address,address)":{"notice":"Emitted when a withdrawal transaction is proven."}},"errors":{"BadTarget()":[{"notice":"Error for when a deposit or withdrawal is to a bad target."}],"CallPaused()":[{"notice":"Error for when a method cannot be called when paused. This could be renamed to `Paused` in the future, but it collides with the `Paused` event."}],"GasEstimation()":[{"notice":"Error for special gas estimation."}],"LargeCalldata()":[{"notice":"Error for when a deposit has too much calldata."}],"OutOfGas()":[{"notice":"Error returned when too much gas resource is consumed."}],"SmallGasLimit()":[{"notice":"Error for when a deposit has too small of a gas limit."}]},"notice":"The OptimismPortal is a low-level contract responsible for passing messages between L1 and L2. Messages sent directly to the OptimismPortal have no form of replayability. Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface."},"devdoc":{"version":1,"kind":"dev","methods":{"depositTransaction(address,uint256,uint64,bool,bytes)":{"params":{"_data":"Data to trigger the recipient with.","_gasLimit":"Amount of L2 gas to purchase by burning gas on L1.","_isCreation":"Whether or not the transaction is a contract creation.","_to":"Target address on L2.","_value":"ETH value to send to the recipient."}},"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))":{"params":{"_tx":"Withdrawal transaction to finalize."}},"guardian()":{"returns":{"_0":"Address of the guardian."}},"initialize(address,address,address)":{"params":{"_l2Oracle":"Contract of the L2OutputOracle.","_superchainConfig":"Contract of the SuperchainConfig.","_systemConfig":"Contract of the SystemConfig."}},"isOutputFinalized(uint256)":{"params":{"_l2OutputIndex":"Index of the L2 output to check."},"returns":{"_0":"Whether or not the output is finalized."}},"minimumGasLimit(uint64)":{"params":{"_byteCount":"Number of bytes in the calldata."},"returns":{"_0":"The minimum gas limit for a deposit."}},"paused()":{"returns":{"paused_":"Whether or not the contract is paused."}},"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])":{"params":{"_l2OutputIndex":"L2 output index to prove against.","_outputRootProof":"Inclusion proof of the L2ToL1MessagePasser contract's storage root.","_tx":"Withdrawal transaction to finalize.","_withdrawalProof":"Inclusion proof of the withdrawal in L2ToL1MessagePasser contract."}}},"events":{"TransactionDeposited(address,address,uint256,bytes)":{"params":{"from":"Address that triggered the deposit transaction.","opaqueData":"ABI encoded deposit data to be parsed off-chain.","to":"Address that the deposit transaction is directed to.","version":"Version of this deposit transaction event."}},"WithdrawalFinalized(bytes32,bool)":{"params":{"success":"Whether the withdrawal transaction was successful.","withdrawalHash":"Hash of the withdrawal transaction."}},"WithdrawalProven(bytes32,address,address)":{"params":{"from":"Address that triggered the withdrawal transaction.","to":"Address that the withdrawal transaction is directed to.","withdrawalHash":"Hash of the withdrawal transaction."}}}},"ast":{"absolutePath":"src/L1/OptimismPortal.sol","id":87105,"exportedSymbols":{"AddressAliasHelper":[111913],"BadTarget":[103969],"CallPaused":[103990],"Constants":[103096],"GasEstimation":[103993],"Hashing":[103936],"ISemver":[109417],"Initializable":[49678],"L2OutputOracle":[86435],"LargeCalldata":[103972],"NoValue":[103984],"OnlyCustomGasToken":[103981],"OptimismPortal":[87104],"ResourceMetering":[88581],"SafeCall":[104213],"SecureMerkleTrie":[106033],"SmallGasLimit":[103975],"SuperchainConfig":[88793],"SystemConfig":[89607],"TransferFailed":[103978],"Types":[104349],"Unauthorized":[103987]},"nodeType":"SourceUnit","src":"32:20510:134","nodes":[{"id":86437,"nodeType":"PragmaDirective","src":"32:23:134","nodes":[],"literals":["solidity","0.8",".15"]},{"id":86439,"nodeType":"ImportDirective","src":"57:86:134","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol","file":"@openzeppelin/contracts/proxy/utils/Initializable.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":49679,"symbolAliases":[{"foreign":{"id":86438,"name":"Initializable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":49678,"src":"66:13:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86441,"nodeType":"ImportDirective","src":"144:54:134","nodes":[],"absolutePath":"src/libraries/SafeCall.sol","file":"src/libraries/SafeCall.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":104214,"symbolAliases":[{"foreign":{"id":86440,"name":"SafeCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104213,"src":"153:8:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86443,"nodeType":"ImportDirective","src":"199:59:134","nodes":[],"absolutePath":"src/L1/L2OutputOracle.sol","file":"src/L1/L2OutputOracle.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":86436,"symbolAliases":[{"foreign":{"id":86442,"name":"L2OutputOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86435,"src":"208:14:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86445,"nodeType":"ImportDirective","src":"259:55:134","nodes":[],"absolutePath":"src/L1/SystemConfig.sol","file":"src/L1/SystemConfig.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":89608,"symbolAliases":[{"foreign":{"id":86444,"name":"SystemConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89607,"src":"268:12:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86447,"nodeType":"ImportDirective","src":"315:63:134","nodes":[],"absolutePath":"src/L1/SuperchainConfig.sol","file":"src/L1/SuperchainConfig.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":88794,"symbolAliases":[{"foreign":{"id":86446,"name":"SuperchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88793,"src":"324:16:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86449,"nodeType":"ImportDirective","src":"379:56:134","nodes":[],"absolutePath":"src/libraries/Constants.sol","file":"src/libraries/Constants.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":103097,"symbolAliases":[{"foreign":{"id":86448,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"388:9:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86451,"nodeType":"ImportDirective","src":"436:48:134","nodes":[],"absolutePath":"src/libraries/Types.sol","file":"src/libraries/Types.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":104350,"symbolAliases":[{"foreign":{"id":86450,"name":"Types","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104349,"src":"445:5:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86453,"nodeType":"ImportDirective","src":"485:52:134","nodes":[],"absolutePath":"src/libraries/Hashing.sol","file":"src/libraries/Hashing.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":103937,"symbolAliases":[{"foreign":{"id":86452,"name":"Hashing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103936,"src":"494:7:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86455,"nodeType":"ImportDirective","src":"538:75:134","nodes":[],"absolutePath":"src/libraries/trie/SecureMerkleTrie.sol","file":"src/libraries/trie/SecureMerkleTrie.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":106034,"symbolAliases":[{"foreign":{"id":86454,"name":"SecureMerkleTrie","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106033,"src":"547:16:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86457,"nodeType":"ImportDirective","src":"614:71:134","nodes":[],"absolutePath":"src/vendor/AddressAliasHelper.sol","file":"src/vendor/AddressAliasHelper.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":111914,"symbolAliases":[{"foreign":{"id":86456,"name":"AddressAliasHelper","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111913,"src":"623:18:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86459,"nodeType":"ImportDirective","src":"686:63:134","nodes":[],"absolutePath":"src/L1/ResourceMetering.sol","file":"src/L1/ResourceMetering.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":88582,"symbolAliases":[{"foreign":{"id":86458,"name":"ResourceMetering","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88581,"src":"695:16:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86461,"nodeType":"ImportDirective","src":"750:52:134","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":86460,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"759:7:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86463,"nodeType":"ImportDirective","src":"803:56:134","nodes":[],"absolutePath":"src/libraries/Constants.sol","file":"src/libraries/Constants.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":103097,"symbolAliases":[{"foreign":{"id":86462,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"812:9:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":86464,"nodeType":"ImportDirective","src":"860:40:134","nodes":[],"absolutePath":"src/libraries/PortalErrors.sol","file":"src/libraries/PortalErrors.sol","nameLocation":"-1:-1:-1","scope":87105,"sourceUnit":103994,"symbolAliases":[],"unitAlias":""},{"id":87104,"nodeType":"ContractDefinition","src":"1240:19301:134","nodes":[{"id":86478,"nodeType":"StructDefinition","src":"1608:117:134","nodes":[],"canonicalName":"OptimismPortal.ProvenWithdrawal","members":[{"constant":false,"id":86473,"mutability":"mutable","name":"outputRoot","nameLocation":"1650:10:134","nodeType":"VariableDeclaration","scope":86478,"src":"1642:18:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":86472,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1642:7:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":86475,"mutability":"mutable","name":"timestamp","nameLocation":"1678:9:134","nodeType":"VariableDeclaration","scope":86478,"src":"1670:17:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"},"typeName":{"id":86474,"name":"uint128","nodeType":"ElementaryTypeName","src":"1670:7:134","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"visibility":"internal"},{"constant":false,"id":86477,"mutability":"mutable","name":"l2OutputIndex","nameLocation":"1705:13:134","nodeType":"VariableDeclaration","scope":86478,"src":"1697:21:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"},"typeName":{"id":86476,"name":"uint128","nodeType":"ElementaryTypeName","src":"1697:7:134","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"visibility":"internal"}],"name":"ProvenWithdrawal","nameLocation":"1615:16:134","scope":87104,"visibility":"public"},{"id":86482,"nodeType":"VariableDeclaration","src":"1777:45:134","nodes":[],"constant":true,"documentation":{"id":86479,"nodeType":"StructuredDocumentation","src":"1731:41:134","text":"@notice Version of the deposit event."},"mutability":"constant","name":"DEPOSIT_VERSION","nameLocation":"1803:15:134","scope":87104,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86480,"name":"uint256","nodeType":"ElementaryTypeName","src":"1777:7:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30","id":86481,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1821:1:134","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"visibility":"internal"},{"id":86486,"nodeType":"VariableDeclaration","src":"1918:60:134","nodes":[],"constant":true,"documentation":{"id":86483,"nodeType":"StructuredDocumentation","src":"1829:84:134","text":"@notice The L2 gas limit set when eth is deposited using the receive() function."},"mutability":"constant","name":"RECEIVE_DEFAULT_GAS_LIMIT","nameLocation":"1943:25:134","scope":87104,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":86484,"name":"uint64","nodeType":"ElementaryTypeName","src":"1918:6:134","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"value":{"hexValue":"3130305f303030","id":86485,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1971:7:134","typeDescriptions":{"typeIdentifier":"t_rational_100000_by_1","typeString":"int_const 100000"},"value":"100_000"},"visibility":"internal"},{"id":86489,"nodeType":"VariableDeclaration","src":"2234:23:134","nodes":[],"constant":false,"documentation":{"id":86487,"nodeType":"StructuredDocumentation","src":"1985:244:134","text":"@notice Address of the L2 account which initiated a withdrawal in this transaction.\n If the of this variable is the default L2 sender address, then we are NOT inside of\n a call to finalizeWithdrawalTransaction."},"functionSelector":"9bf62d82","mutability":"mutable","name":"l2Sender","nameLocation":"2249:8:134","scope":87104,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":86488,"name":"address","nodeType":"ElementaryTypeName","src":"2234:7:134","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":86494,"nodeType":"VariableDeclaration","src":"2348:52:134","nodes":[],"constant":false,"documentation":{"id":86490,"nodeType":"StructuredDocumentation","src":"2264:79:134","text":"@notice A list of withdrawal hashes which have been successfully finalized."},"functionSelector":"a14238e7","mutability":"mutable","name":"finalizedWithdrawals","nameLocation":"2380:20:134","scope":87104,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"},"typeName":{"id":86493,"keyType":{"id":86491,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2356:7:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"2348:24:134","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"},"valueType":{"id":86492,"name":"bool","nodeType":"ElementaryTypeName","src":"2367:4:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}},"visibility":"public"},{"id":86500,"nodeType":"VariableDeclaration","src":"2482:61:134","nodes":[],"constant":false,"documentation":{"id":86495,"nodeType":"StructuredDocumentation","src":"2407:70:134","text":"@notice A mapping of withdrawal hashes to `ProvenWithdrawal` data."},"functionSelector":"e965084c","mutability":"mutable","name":"provenWithdrawals","nameLocation":"2526:17:134","scope":87104,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$86478_storage_$","typeString":"mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal)"},"typeName":{"id":86499,"keyType":{"id":86496,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2490:7:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"2482:36:134","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$86478_storage_$","typeString":"mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal)"},"valueType":{"id":86498,"nodeType":"UserDefinedTypeName","pathNode":{"id":86497,"name":"ProvenWithdrawal","nodeType":"IdentifierPath","referencedDeclaration":86478,"src":"2501:16:134"},"referencedDeclaration":86478,"src":"2501:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_storage_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal"}}},"visibility":"public"},{"id":86503,"nodeType":"VariableDeclaration","src":"2655:26:134","nodes":[],"constant":false,"documentation":{"id":86501,"nodeType":"StructuredDocumentation","src":"2550:100:134","text":"@custom:legacy\n @custom:spacer paused\n @notice Spacer for backwards compatibility."},"mutability":"mutable","name":"spacer_53_0_1","nameLocation":"2668:13:134","scope":87104,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":86502,"name":"bool","nodeType":"ElementaryTypeName","src":"2655:4:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"private"},{"id":86507,"nodeType":"VariableDeclaration","src":"2739:40:134","nodes":[],"constant":false,"documentation":{"id":86504,"nodeType":"StructuredDocumentation","src":"2688:46:134","text":"@notice Contract of the Superchain Config."},"functionSelector":"35e80ab3","mutability":"mutable","name":"superchainConfig","nameLocation":"2763:16:134","scope":87104,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},"typeName":{"id":86506,"nodeType":"UserDefinedTypeName","pathNode":{"id":86505,"name":"SuperchainConfig","nodeType":"IdentifierPath","referencedDeclaration":88793,"src":"2739:16:134"},"referencedDeclaration":88793,"src":"2739:16:134","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"visibility":"public"},{"id":86511,"nodeType":"VariableDeclaration","src":"2867:30:134","nodes":[],"constant":false,"documentation":{"id":86508,"nodeType":"StructuredDocumentation","src":"2786:76:134","text":"@notice Contract of the L2OutputOracle.\n @custom:network-specific"},"functionSelector":"9b5f694a","mutability":"mutable","name":"l2Oracle","nameLocation":"2889:8:134","scope":87104,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"},"typeName":{"id":86510,"nodeType":"UserDefinedTypeName","pathNode":{"id":86509,"name":"L2OutputOracle","nodeType":"IdentifierPath","referencedDeclaration":86435,"src":"2867:14:134"},"referencedDeclaration":86435,"src":"2867:14:134","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},"visibility":"public"},{"id":86515,"nodeType":"VariableDeclaration","src":"2983:32:134","nodes":[],"constant":false,"documentation":{"id":86512,"nodeType":"StructuredDocumentation","src":"2904:74:134","text":"@notice Contract of the SystemConfig.\n @custom:network-specific"},"functionSelector":"33d7e2bd","mutability":"mutable","name":"systemConfig","nameLocation":"3003:12:134","scope":87104,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"},"typeName":{"id":86514,"nodeType":"UserDefinedTypeName","pathNode":{"id":86513,"name":"SystemConfig","nodeType":"IdentifierPath","referencedDeclaration":89607,"src":"2983:12:134"},"referencedDeclaration":89607,"src":"2983:12:134","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"visibility":"public"},{"id":86526,"nodeType":"EventDefinition","src":"3526:112:134","nodes":[],"anonymous":false,"documentation":{"id":86516,"nodeType":"StructuredDocumentation","src":"3022:499:134","text":"@notice Emitted when a transaction is deposited from L1 to L2.\n The parameters of this event are read by the rollup node and used to derive deposit\n transactions on L2.\n @param from Address that triggered the deposit transaction.\n @param to Address that the deposit transaction is directed to.\n @param version Version of this deposit transaction event.\n @param opaqueData ABI encoded deposit data to be parsed off-chain."},"eventSelector":"b3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32","name":"TransactionDeposited","nameLocation":"3532:20:134","parameters":{"id":86525,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86518,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"3569:4:134","nodeType":"VariableDeclaration","scope":86526,"src":"3553:20:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":86517,"name":"address","nodeType":"ElementaryTypeName","src":"3553:7:134","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":86520,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"3591:2:134","nodeType":"VariableDeclaration","scope":86526,"src":"3575:18:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":86519,"name":"address","nodeType":"ElementaryTypeName","src":"3575:7:134","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":86522,"indexed":true,"mutability":"mutable","name":"version","nameLocation":"3611:7:134","nodeType":"VariableDeclaration","scope":86526,"src":"3595:23:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86521,"name":"uint256","nodeType":"ElementaryTypeName","src":"3595:7:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":86524,"indexed":false,"mutability":"mutable","name":"opaqueData","nameLocation":"3626:10:134","nodeType":"VariableDeclaration","scope":86526,"src":"3620:16:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":86523,"name":"bytes","nodeType":"ElementaryTypeName","src":"3620:5:134","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3552:85:134"}},{"id":86535,"nodeType":"EventDefinition","src":"3942:97:134","nodes":[],"anonymous":false,"documentation":{"id":86527,"nodeType":"StructuredDocumentation","src":"3644:293:134","text":"@notice Emitted when a withdrawal transaction is proven.\n @param withdrawalHash Hash of the withdrawal transaction.\n @param from Address that triggered the withdrawal transaction.\n @param to Address that the withdrawal transaction is directed to."},"eventSelector":"67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62","name":"WithdrawalProven","nameLocation":"3948:16:134","parameters":{"id":86534,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86529,"indexed":true,"mutability":"mutable","name":"withdrawalHash","nameLocation":"3981:14:134","nodeType":"VariableDeclaration","scope":86535,"src":"3965:30:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":86528,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3965:7:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":86531,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"4013:4:134","nodeType":"VariableDeclaration","scope":86535,"src":"3997:20:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":86530,"name":"address","nodeType":"ElementaryTypeName","src":"3997:7:134","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":86533,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"4035:2:134","nodeType":"VariableDeclaration","scope":86535,"src":"4019:18:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":86532,"name":"address","nodeType":"ElementaryTypeName","src":"4019:7:134","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3964:74:134"}},{"id":86542,"nodeType":"EventDefinition","src":"4260:72:134","nodes":[],"anonymous":false,"documentation":{"id":86536,"nodeType":"StructuredDocumentation","src":"4045:210:134","text":"@notice Emitted when a withdrawal transaction is finalized.\n @param withdrawalHash Hash of the withdrawal transaction.\n @param success Whether the withdrawal transaction was successful."},"eventSelector":"db5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b","name":"WithdrawalFinalized","nameLocation":"4266:19:134","parameters":{"id":86541,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86538,"indexed":true,"mutability":"mutable","name":"withdrawalHash","nameLocation":"4302:14:134","nodeType":"VariableDeclaration","scope":86542,"src":"4286:30:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":86537,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4286:7:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":86540,"indexed":false,"mutability":"mutable","name":"success","nameLocation":"4323:7:134","nodeType":"VariableDeclaration","scope":86542,"src":"4318:12:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":86539,"name":"bool","nodeType":"ElementaryTypeName","src":"4318:4:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4285:46:134"}},{"id":86553,"nodeType":"ModifierDefinition","src":"4375:86:134","nodes":[],"body":{"id":86552,"nodeType":"Block","src":"4400:61:134","nodes":[],"statements":[{"condition":{"arguments":[],"expression":{"argumentTypes":[],"id":86545,"name":"paused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86651,"src":"4414:6:134","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bool_$","typeString":"function () view returns (bool)"}},"id":86546,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4414:8:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":86550,"nodeType":"IfStatement","src":"4410:33:134","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":86547,"name":"CallPaused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103990,"src":"4431:10:134","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":86548,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4431:12:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86549,"nodeType":"RevertStatement","src":"4424:19:134"}},{"id":86551,"nodeType":"PlaceholderStatement","src":"4453:1:134"}]},"documentation":{"id":86543,"nodeType":"StructuredDocumentation","src":"4338:32:134","text":"@notice Reverts when paused."},"name":"whenNotPaused","nameLocation":"4384:13:134","parameters":{"id":86544,"nodeType":"ParameterList","parameters":[],"src":"4397:2:134"},"virtual":false,"visibility":"internal"},{"id":86557,"nodeType":"VariableDeclaration","src":"4530:40:134","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":86554,"nodeType":"StructuredDocumentation","src":"4467:58:134","text":"@notice Semantic version.\n @custom:semver 2.6.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"4553:7:134","scope":87104,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":86555,"name":"string","nodeType":"ElementaryTypeName","src":"4530:6:134","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"322e362e30","id":86556,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4563:7:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_ad12b1ea91991aacd9b7a7ba82f559ec1ebe6024b70cee19177a7d0d7932dda1","typeString":"literal_string \"2.6.0\""},"value":"2.6.0"},"visibility":"public"},{"id":86583,"nodeType":"FunctionDefinition","src":"4633:218:134","nodes":[],"body":{"id":86582,"nodeType":"Block","src":"4647:204:134","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30","id":86565,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4716:1:134","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":86564,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4708:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":86563,"name":"address","nodeType":"ElementaryTypeName","src":"4708:7:134","typeDescriptions":{}}},"id":86566,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4708:10:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":86562,"name":"L2OutputOracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86435,"src":"4693:14:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L2OutputOracle_$86435_$","typeString":"type(contract L2OutputOracle)"}},"id":86567,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4693:26:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},{"arguments":[{"arguments":[{"hexValue":"30","id":86571,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4769:1:134","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":86570,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4761:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":86569,"name":"address","nodeType":"ElementaryTypeName","src":"4761:7:134","typeDescriptions":{}}},"id":86572,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4761:10:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":86568,"name":"SystemConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89607,"src":"4748:12:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SystemConfig_$89607_$","typeString":"type(contract SystemConfig)"}},"id":86573,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4748:24:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},{"arguments":[{"arguments":[{"hexValue":"30","id":86577,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4830:1:134","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":86576,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4822:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":86575,"name":"address","nodeType":"ElementaryTypeName","src":"4822:7:134","typeDescriptions":{}}},"id":86578,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4822:10:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":86574,"name":"SuperchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88793,"src":"4805:16:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SuperchainConfig_$88793_$","typeString":"type(contract SuperchainConfig)"}},"id":86579,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4805:28:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"},{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"},{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}],"id":86561,"name":"initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86627,"src":"4657:10:134","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_L2OutputOracle_$86435_$_t_contract$_SystemConfig_$89607_$_t_contract$_SuperchainConfig_$88793_$returns$__$","typeString":"function (contract L2OutputOracle,contract SystemConfig,contract SuperchainConfig)"}},"id":86580,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_l2Oracle","_systemConfig","_superchainConfig"],"nodeType":"FunctionCall","src":"4657:187:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86581,"nodeType":"ExpressionStatement","src":"4657:187:134"}]},"documentation":{"id":86558,"nodeType":"StructuredDocumentation","src":"4577:51:134","text":"@notice Constructs the OptimismPortal contract."},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":86559,"nodeType":"ParameterList","parameters":[],"src":"4644:2:134"},"returnParameters":{"id":86560,"nodeType":"ParameterList","parameters":[],"src":"4647:0:134"},"scope":87104,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":86627,"nodeType":"FunctionDefinition","src":"5069:435:134","nodes":[],"body":{"id":86626,"nodeType":"Block","src":"5248:256:134","nodes":[],"statements":[{"expression":{"id":86600,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86598,"name":"l2Oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86511,"src":"5258:8:134","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":86599,"name":"_l2Oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86587,"src":"5269:9:134","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},"src":"5258:20:134","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},"id":86601,"nodeType":"ExpressionStatement","src":"5258:20:134"},{"expression":{"id":86604,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86602,"name":"systemConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86515,"src":"5288:12:134","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":86603,"name":"_systemConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86590,"src":"5303:13:134","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"src":"5288:28:134","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"id":86605,"nodeType":"ExpressionStatement","src":"5288:28:134"},{"expression":{"id":86608,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86606,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86507,"src":"5326:16:134","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":86607,"name":"_superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86593,"src":"5345:17:134","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"src":"5326:36:134","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":86609,"nodeType":"ExpressionStatement","src":"5326:36:134"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":86615,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86610,"name":"l2Sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86489,"src":"5376:8:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":86613,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5396:1:134","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":86612,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5388:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":86611,"name":"address","nodeType":"ElementaryTypeName","src":"5388:7:134","typeDescriptions":{}}},"id":86614,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5388:10:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5376:22:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":86622,"nodeType":"IfStatement","src":"5372:91:134","trueBody":{"id":86621,"nodeType":"Block","src":"5400:63:134","statements":[{"expression":{"id":86619,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86616,"name":"l2Sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86489,"src":"5414:8:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":86617,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"5425:9:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Constants_$103096_$","typeString":"type(library Constants)"}},"id":86618,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"DEFAULT_L2_SENDER","nodeType":"MemberAccess","referencedDeclaration":103058,"src":"5425:27:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5414:38:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":86620,"nodeType":"ExpressionStatement","src":"5414:38:134"}]}},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":86623,"name":"__ResourceMetering_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88580,"src":"5472:23:134","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":86624,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5472:25:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86625,"nodeType":"ExpressionStatement","src":"5472:25:134"}]},"documentation":{"id":86584,"nodeType":"StructuredDocumentation","src":"4857:207:134","text":"@notice Initializer.\n @param _l2Oracle Contract of the L2OutputOracle.\n @param _systemConfig Contract of the SystemConfig.\n @param _superchainConfig Contract of the SuperchainConfig."},"functionSelector":"c0c53b8b","implemented":true,"kind":"function","modifiers":[{"id":86596,"kind":"modifierInvocation","modifierName":{"id":86595,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":49598,"src":"5232:11:134"},"nodeType":"ModifierInvocation","src":"5232:11:134"}],"name":"initialize","nameLocation":"5078:10:134","parameters":{"id":86594,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86587,"mutability":"mutable","name":"_l2Oracle","nameLocation":"5113:9:134","nodeType":"VariableDeclaration","scope":86627,"src":"5098:24:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"},"typeName":{"id":86586,"nodeType":"UserDefinedTypeName","pathNode":{"id":86585,"name":"L2OutputOracle","nodeType":"IdentifierPath","referencedDeclaration":86435,"src":"5098:14:134"},"referencedDeclaration":86435,"src":"5098:14:134","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},"visibility":"internal"},{"constant":false,"id":86590,"mutability":"mutable","name":"_systemConfig","nameLocation":"5145:13:134","nodeType":"VariableDeclaration","scope":86627,"src":"5132:26:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"},"typeName":{"id":86589,"nodeType":"UserDefinedTypeName","pathNode":{"id":86588,"name":"SystemConfig","nodeType":"IdentifierPath","referencedDeclaration":89607,"src":"5132:12:134"},"referencedDeclaration":89607,"src":"5132:12:134","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"visibility":"internal"},{"constant":false,"id":86593,"mutability":"mutable","name":"_superchainConfig","nameLocation":"5185:17:134","nodeType":"VariableDeclaration","scope":86627,"src":"5168:34:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},"typeName":{"id":86592,"nodeType":"UserDefinedTypeName","pathNode":{"id":86591,"name":"SuperchainConfig","nodeType":"IdentifierPath","referencedDeclaration":88793,"src":"5168:16:134"},"referencedDeclaration":88793,"src":"5168:16:134","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"visibility":"internal"}],"src":"5088:120:134"},"returnParameters":{"id":86597,"nodeType":"ParameterList","parameters":[],"src":"5248:0:134"},"scope":87104,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":86638,"nodeType":"FunctionDefinition","src":"5757:101:134","nodes":[],"body":{"id":86637,"nodeType":"Block","src":"5807:51:134","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":86633,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86507,"src":"5824:16:134","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":86634,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"guardian","nodeType":"MemberAccess","referencedDeclaration":88693,"src":"5824:25:134","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":86635,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5824:27:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":86632,"id":86636,"nodeType":"Return","src":"5817:34:134"}]},"documentation":{"id":86628,"nodeType":"StructuredDocumentation","src":"5510:242:134","text":"@notice Getter function for the address of the guardian.\n Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead.\n @return Address of the guardian.\n @custom:legacy"},"functionSelector":"452a9320","implemented":true,"kind":"function","modifiers":[],"name":"guardian","nameLocation":"5766:8:134","parameters":{"id":86629,"nodeType":"ParameterList","parameters":[],"src":"5774:2:134"},"returnParameters":{"id":86632,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86631,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86638,"src":"5798:7:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":86630,"name":"address","nodeType":"ElementaryTypeName","src":"5798:7:134","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5797:9:134"},"scope":87104,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":86651,"nodeType":"FunctionDefinition","src":"5981:105:134","nodes":[],"body":{"id":86650,"nodeType":"Block","src":"6034:52:134","nodes":[],"statements":[{"expression":{"id":86648,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86644,"name":"paused_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86642,"src":"6044:7:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":86645,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86507,"src":"6054:16:134","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":86646,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paused","nodeType":"MemberAccess","referencedDeclaration":88707,"src":"6054:23:134","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_bool_$","typeString":"function () view external returns (bool)"}},"id":86647,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6054:25:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6044:35:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":86649,"nodeType":"ExpressionStatement","src":"6044:35:134"}]},"documentation":{"id":86639,"nodeType":"StructuredDocumentation","src":"5864:112:134","text":"@notice Getter for the current paused status.\n @return paused_ Whether or not the contract is paused."},"functionSelector":"5c975abb","implemented":true,"kind":"function","modifiers":[],"name":"paused","nameLocation":"5990:6:134","parameters":{"id":86640,"nodeType":"ParameterList","parameters":[],"src":"5996:2:134"},"returnParameters":{"id":86643,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86642,"mutability":"mutable","name":"paused_","nameLocation":"6025:7:134","nodeType":"VariableDeclaration","scope":86651,"src":"6020:12:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":86641,"name":"bool","nodeType":"ElementaryTypeName","src":"6020:4:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"6019:14:134"},"scope":87104,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":86666,"nodeType":"FunctionDefinition","src":"6579:120:134","nodes":[],"body":{"id":86665,"nodeType":"Block","src":"6652:47:134","nodes":[],"statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":86663,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":86661,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86659,"name":"_byteCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86654,"src":"6669:10:134","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"3136","id":86660,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6682:2:134","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"6669:15:134","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3231303030","id":86662,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6687:5:134","typeDescriptions":{"typeIdentifier":"t_rational_21000_by_1","typeString":"int_const 21000"},"value":"21000"},"src":"6669:23:134","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"functionReturnParameters":86658,"id":86664,"nodeType":"Return","src":"6662:30:134"}]},"documentation":{"id":86652,"nodeType":"StructuredDocumentation","src":"6092:482:134","text":"@notice Computes the minimum gas limit for a deposit.\n The minimum gas limit linearly increases based on the size of the calldata.\n This is to prevent users from creating L2 resource usage without paying for it.\n This function can be used when interacting with the portal to ensure forwards\n compatibility.\n @param _byteCount Number of bytes in the calldata.\n @return The minimum gas limit for a deposit."},"functionSelector":"a35d99df","implemented":true,"kind":"function","modifiers":[],"name":"minimumGasLimit","nameLocation":"6588:15:134","parameters":{"id":86655,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86654,"mutability":"mutable","name":"_byteCount","nameLocation":"6611:10:134","nodeType":"VariableDeclaration","scope":86666,"src":"6604:17:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":86653,"name":"uint64","nodeType":"ElementaryTypeName","src":"6604:6:134","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"src":"6603:19:134"},"returnParameters":{"id":86658,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86657,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86666,"src":"6644:6:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":86656,"name":"uint64","nodeType":"ElementaryTypeName","src":"6644:6:134","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"src":"6643:8:134"},"scope":87104,"stateMutability":"pure","virtual":false,"visibility":"public"},{"id":86684,"nodeType":"FunctionDefinition","src":"7078:130:134","nodes":[],"body":{"id":86683,"nodeType":"Block","src":"7105:103:134","nodes":[],"statements":[{"expression":{"arguments":[{"expression":{"id":86671,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"7134:3:134","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":86672,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"7134:10:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":86673,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"7146:3:134","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":86674,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"7146:9:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":86675,"name":"RECEIVE_DEFAULT_GAS_LIMIT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86486,"src":"7157:25:134","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},{"hexValue":"66616c7365","id":86676,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"7184:5:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"arguments":[{"hexValue":"","id":86679,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7197:2:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":86678,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7191:5:134","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":86677,"name":"bytes","nodeType":"ElementaryTypeName","src":"7191:5:134","typeDescriptions":{}}},"id":86680,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7191:9:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":86670,"name":"depositTransaction","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87068,"src":"7115:18:134","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint64_$_t_bool_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,uint256,uint64,bool,bytes memory)"}},"id":86681,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7115:86:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86682,"nodeType":"ExpressionStatement","src":"7115:86:134"}]},"documentation":{"id":86667,"nodeType":"StructuredDocumentation","src":"6705:368:134","text":"@notice Accepts value so that users can send ETH directly to this contract and have the\n funds be deposited to their address on L2. This is intended as a convenience\n function for EOAs. Contracts should call the depositTransaction() function directly\n otherwise any deposited funds will be lost due to address aliasing."},"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":86668,"nodeType":"ParameterList","parameters":[],"src":"7085:2:134"},"returnParameters":{"id":86669,"nodeType":"ParameterList","parameters":[],"src":"7105:0:134"},"scope":87104,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":86689,"nodeType":"FunctionDefinition","src":"7422:77:134","nodes":[],"body":{"id":86688,"nodeType":"Block","src":"7460:39:134","nodes":[],"statements":[]},"documentation":{"id":86685,"nodeType":"StructuredDocumentation","src":"7214:203:134","text":"@notice Accepts ETH value without triggering a deposit to L2.\n This function mainly exists for the sake of the migration between the legacy\n Optimism system and Bedrock."},"functionSelector":"8b4c40b0","implemented":true,"kind":"function","modifiers":[],"name":"donateETH","nameLocation":"7431:9:134","parameters":{"id":86686,"nodeType":"ParameterList","parameters":[],"src":"7440:2:134"},"returnParameters":{"id":86687,"nodeType":"ParameterList","parameters":[],"src":"7460:0:134"},"scope":87104,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":86702,"nodeType":"FunctionDefinition","src":"7748:152:134","nodes":[],"body":{"id":86701,"nodeType":"Block","src":"7847:53:134","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":86697,"name":"systemConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86515,"src":"7864:12:134","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"id":86698,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"resourceConfig","nodeType":"MemberAccess","referencedDeclaration":89527,"src":"7864:27:134","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_struct$_ResourceConfig_$88258_memory_ptr_$","typeString":"function () view external returns (struct ResourceMetering.ResourceConfig memory)"}},"id":86699,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7864:29:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ResourceConfig_$88258_memory_ptr","typeString":"struct ResourceMetering.ResourceConfig memory"}},"functionReturnParameters":86696,"id":86700,"nodeType":"Return","src":"7857:36:134"}]},"baseFunctions":[88555],"documentation":{"id":86690,"nodeType":"StructuredDocumentation","src":"7505:238:134","text":"@notice Getter for the resource config.\n Used internally by the ResourceMetering contract.\n The SystemConfig is the source of truth for the resource config.\n @return ResourceMetering ResourceConfig"},"implemented":true,"kind":"function","modifiers":[],"name":"_resourceConfig","nameLocation":"7757:15:134","overrides":{"id":86692,"nodeType":"OverrideSpecifier","overrides":[],"src":"7789:8:134"},"parameters":{"id":86691,"nodeType":"ParameterList","parameters":[],"src":"7772:2:134"},"returnParameters":{"id":86696,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86695,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":86702,"src":"7807:38:134","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ResourceConfig_$88258_memory_ptr","typeString":"struct ResourceMetering.ResourceConfig"},"typeName":{"id":86694,"nodeType":"UserDefinedTypeName","pathNode":{"id":86693,"name":"ResourceMetering.ResourceConfig","nodeType":"IdentifierPath","referencedDeclaration":88258,"src":"7807:31:134"},"referencedDeclaration":88258,"src":"7807:31:134","typeDescriptions":{"typeIdentifier":"t_struct$_ResourceConfig_$88258_storage_ptr","typeString":"struct ResourceMetering.ResourceConfig"}},"visibility":"internal"}],"src":"7806:40:134"},"scope":87104,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":86834,"nodeType":"FunctionDefinition","src":"8288:3825:134","nodes":[],"body":{"id":86833,"nodeType":"Block","src":"8553:3560:134","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":86726,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86720,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86706,"src":"8798:3:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":86721,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"target","nodeType":"MemberAccess","referencedDeclaration":104341,"src":"8798:10:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":86724,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"8820:4:134","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_OptimismPortal_$87104","typeString":"contract OptimismPortal"}],"id":86723,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8812:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":86722,"name":"address","nodeType":"ElementaryTypeName","src":"8812:7:134","typeDescriptions":{}}},"id":86725,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8812:13:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8798:27:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e64206d6573736167657320746f2074686520706f7274616c20636f6e7472616374","id":86727,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8827:65:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_57e41062e2e7b97ddf730827f5249d28f602a3846dfe107ce36292fb1c029eb8","typeString":"literal_string \"OptimismPortal: you cannot send messages to the portal contract\""},"value":"OptimismPortal: you cannot send messages to the portal contract"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_57e41062e2e7b97ddf730827f5249d28f602a3846dfe107ce36292fb1c029eb8","typeString":"literal_string \"OptimismPortal: you cannot send messages to the portal contract\""}],"id":86719,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8790:7:134","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86728,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8790:103:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86729,"nodeType":"ExpressionStatement","src":"8790:103:134"},{"assignments":[86731],"declarations":[{"constant":false,"id":86731,"mutability":"mutable","name":"outputRoot","nameLocation":"9078:10:134","nodeType":"VariableDeclaration","scope":86833,"src":"9070:18:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":86730,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9070:7:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":86737,"initialValue":{"expression":{"arguments":[{"id":86734,"name":"_l2OutputIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86708,"src":"9112:14:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":86732,"name":"l2Oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86511,"src":"9091:8:134","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},"id":86733,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getL2Output","nodeType":"MemberAccess","referencedDeclaration":86275,"src":"9091:20:134","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$104307_memory_ptr_$","typeString":"function (uint256) view external returns (struct Types.OutputProposal memory)"}},"id":86735,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9091:36:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_memory_ptr","typeString":"struct Types.OutputProposal memory"}},"id":86736,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"outputRoot","nodeType":"MemberAccess","referencedDeclaration":104302,"src":"9091:47:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"9070:68:134"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":86744,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86739,"name":"outputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86731,"src":"9258:10:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":86742,"name":"_outputRootProof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86711,"src":"9300:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRootProof_$104316_calldata_ptr","typeString":"struct Types.OutputRootProof calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_OutputRootProof_$104316_calldata_ptr","typeString":"struct Types.OutputRootProof calldata"}],"expression":{"id":86740,"name":"Hashing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103936,"src":"9272:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Hashing_$103936_$","typeString":"type(library Hashing)"}},"id":86741,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hashOutputRootProof","nodeType":"MemberAccess","referencedDeclaration":103935,"src":"9272:27:134","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_OutputRootProof_$104316_memory_ptr_$returns$_t_bytes32_$","typeString":"function (struct Types.OutputRootProof memory) pure returns (bytes32)"}},"id":86743,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9272:45:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"9258:59:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a20696e76616c6964206f757470757420726f6f742070726f6f66","id":86745,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9319:43:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_490ec653897228799e7e4c4af8b1fd3b4a0688df98d026b46afa352ce9876996","typeString":"literal_string \"OptimismPortal: invalid output root proof\""},"value":"OptimismPortal: invalid output root proof"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_490ec653897228799e7e4c4af8b1fd3b4a0688df98d026b46afa352ce9876996","typeString":"literal_string \"OptimismPortal: invalid output root proof\""}],"id":86738,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"9237:7:134","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86746,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9237:135:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86747,"nodeType":"ExpressionStatement","src":"9237:135:134"},{"assignments":[86749],"declarations":[{"constant":false,"id":86749,"mutability":"mutable","name":"withdrawalHash","nameLocation":"9491:14:134","nodeType":"VariableDeclaration","scope":86833,"src":"9483:22:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":86748,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9483:7:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":86754,"initialValue":{"arguments":[{"id":86752,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86706,"src":"9531:3:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}],"expression":{"id":86750,"name":"Hashing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103936,"src":"9508:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Hashing_$103936_$","typeString":"type(library Hashing)"}},"id":86751,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hashWithdrawal","nodeType":"MemberAccess","referencedDeclaration":103911,"src":"9508:22:134","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_WithdrawalTransaction_$104348_memory_ptr_$returns$_t_bytes32_$","typeString":"function (struct Types.WithdrawalTransaction memory) pure returns (bytes32)"}},"id":86753,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9508:27:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"9483:52:134"},{"assignments":[86757],"declarations":[{"constant":false,"id":86757,"mutability":"mutable","name":"provenWithdrawal","nameLocation":"9569:16:134","nodeType":"VariableDeclaration","scope":86833,"src":"9545:40:134","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_memory_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal"},"typeName":{"id":86756,"nodeType":"UserDefinedTypeName","pathNode":{"id":86755,"name":"ProvenWithdrawal","nodeType":"IdentifierPath","referencedDeclaration":86478,"src":"9545:16:134"},"referencedDeclaration":86478,"src":"9545:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_storage_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal"}},"visibility":"internal"}],"id":86761,"initialValue":{"baseExpression":{"id":86758,"name":"provenWithdrawals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86500,"src":"9588:17:134","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$86478_storage_$","typeString":"mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal storage ref)"}},"id":86760,"indexExpression":{"id":86759,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86749,"src":"9606:14:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9588:33:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_storage","typeString":"struct OptimismPortal.ProvenWithdrawal storage ref"}},"nodeType":"VariableDeclarationStatement","src":"9545:76:134"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":86776,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":86766,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86763,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86757,"src":"10175:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_memory_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal memory"}},"id":86764,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":86475,"src":"10175:26:134","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":86765,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10205:1:134","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"10175:31:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":86775,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"expression":{"id":86769,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86757,"src":"10247:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_memory_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal memory"}},"id":86770,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"l2OutputIndex","nodeType":"MemberAccess","referencedDeclaration":86477,"src":"10247:30:134","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint128","typeString":"uint128"}],"expression":{"id":86767,"name":"l2Oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86511,"src":"10226:8:134","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},"id":86768,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getL2Output","nodeType":"MemberAccess","referencedDeclaration":86275,"src":"10226:20:134","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$104307_memory_ptr_$","typeString":"function (uint256) view external returns (struct Types.OutputProposal memory)"}},"id":86771,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10226:52:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_memory_ptr","typeString":"struct Types.OutputProposal memory"}},"id":86772,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"outputRoot","nodeType":"MemberAccess","referencedDeclaration":104302,"src":"10226:63:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":86773,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86757,"src":"10293:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_memory_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal memory"}},"id":86774,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"outputRoot","nodeType":"MemberAccess","referencedDeclaration":86473,"src":"10293:27:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"10226:94:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"10175:145:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a207769746864726177616c20686173682068617320616c7265616479206265656e2070726f76656e","id":86777,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"10334:57:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_5238e365e021f6fd781c2264a5a09100f0670031b56dacfc224b453789ac1dd0","typeString":"literal_string \"OptimismPortal: withdrawal hash has already been proven\""},"value":"OptimismPortal: withdrawal hash has already been proven"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5238e365e021f6fd781c2264a5a09100f0670031b56dacfc224b453789ac1dd0","typeString":"literal_string \"OptimismPortal: withdrawal hash has already been proven\""}],"id":86762,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"10154:7:134","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86778,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10154:247:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86779,"nodeType":"ExpressionStatement","src":"10154:247:134"},{"assignments":[86781],"declarations":[{"constant":false,"id":86781,"mutability":"mutable","name":"storageKey","nameLocation":"10645:10:134","nodeType":"VariableDeclaration","scope":86833,"src":"10637:18:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":86780,"name":"bytes32","nodeType":"ElementaryTypeName","src":"10637:7:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":86792,"initialValue":{"arguments":[{"arguments":[{"id":86785,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86749,"src":"10709:14:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"hexValue":"30","id":86788,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10749:1:134","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":86787,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10741:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":86786,"name":"uint256","nodeType":"ElementaryTypeName","src":"10741:7:134","typeDescriptions":{}}},"id":86789,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10741:10:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":86783,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"10681:3:134","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":86784,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"10681:10:134","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":86790,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10681:147:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":86782,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"10658:9:134","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":86791,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10658:180:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"10637:201:134"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"id":86798,"name":"storageKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86781,"src":"11264:10:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":86796,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"11253:3:134","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":86797,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"11253:10:134","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":86799,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11253:22:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"01","id":86800,"isConstant":false,"isLValue":false,"isPure":true,"kind":"hexString","lValueRequested":false,"nodeType":"Literal","src":"11301:7:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2","typeString":"literal_string hex\"01\""},"value":"\u0001"},{"id":86801,"name":"_withdrawalProof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86714,"src":"11334:16:134","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},{"expression":{"id":86802,"name":"_outputRootProof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86711,"src":"11375:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRootProof_$104316_calldata_ptr","typeString":"struct Types.OutputRootProof calldata"}},"id":86803,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"messagePasserStorageRoot","nodeType":"MemberAccess","referencedDeclaration":104313,"src":"11375:41:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_stringliteral_5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2","typeString":"literal_string hex\"01\""},{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":86794,"name":"SecureMerkleTrie","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106033,"src":"11191:16:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SecureMerkleTrie_$106033_$","typeString":"type(library SecureMerkleTrie)"}},"id":86795,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verifyInclusionProof","nodeType":"MemberAccess","referencedDeclaration":105985,"src":"11191:37:134","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_$_t_bytes32_$returns$_t_bool_$","typeString":"function (bytes memory,bytes memory,bytes memory[] memory,bytes32) pure returns (bool)"}},"id":86804,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_key","_value","_proof","_root"],"nodeType":"FunctionCall","src":"11191:240:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a20696e76616c6964207769746864726177616c20696e636c7573696f6e2070726f6f66","id":86805,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"11445:52:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_11b666636981dad70da1c1a9e87589eb7d9c042eacd4d25e887aac557f6cd6b9","typeString":"literal_string \"OptimismPortal: invalid withdrawal inclusion proof\""},"value":"OptimismPortal: invalid withdrawal inclusion proof"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_11b666636981dad70da1c1a9e87589eb7d9c042eacd4d25e887aac557f6cd6b9","typeString":"literal_string \"OptimismPortal: invalid withdrawal inclusion proof\""}],"id":86793,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"11170:7:134","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86806,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11170:337:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86807,"nodeType":"ExpressionStatement","src":"11170:337:134"},{"expression":{"id":86823,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":86808,"name":"provenWithdrawals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86500,"src":"11789:17:134","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$86478_storage_$","typeString":"mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal storage ref)"}},"id":86810,"indexExpression":{"id":86809,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86749,"src":"11807:14:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"11789:33:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_storage","typeString":"struct OptimismPortal.ProvenWithdrawal storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":86812,"name":"outputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86731,"src":"11868:10:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"expression":{"id":86815,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"11911:5:134","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":86816,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"11911:15:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":86814,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11903:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_uint128_$","typeString":"type(uint128)"},"typeName":{"id":86813,"name":"uint128","nodeType":"ElementaryTypeName","src":"11903:7:134","typeDescriptions":{}}},"id":86817,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11903:24:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},{"arguments":[{"id":86820,"name":"_l2OutputIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86708,"src":"11964:14:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":86819,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11956:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_uint128_$","typeString":"type(uint128)"},"typeName":{"id":86818,"name":"uint128","nodeType":"ElementaryTypeName","src":"11956:7:134","typeDescriptions":{}}},"id":86821,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11956:23:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint128","typeString":"uint128"},{"typeIdentifier":"t_uint128","typeString":"uint128"}],"id":86811,"name":"ProvenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86478,"src":"11825:16:134","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ProvenWithdrawal_$86478_storage_ptr_$","typeString":"type(struct OptimismPortal.ProvenWithdrawal storage pointer)"}},"id":86822,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":["outputRoot","timestamp","l2OutputIndex"],"nodeType":"FunctionCall","src":"11825:165:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_memory_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal memory"}},"src":"11789:201:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_storage","typeString":"struct OptimismPortal.ProvenWithdrawal storage ref"}},"id":86824,"nodeType":"ExpressionStatement","src":"11789:201:134"},{"eventCall":{"arguments":[{"id":86826,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86749,"src":"12067:14:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":86827,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86706,"src":"12083:3:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":86828,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":104339,"src":"12083:10:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":86829,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86706,"src":"12095:3:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":86830,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"target","nodeType":"MemberAccess","referencedDeclaration":104341,"src":"12095:10:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":86825,"name":"WithdrawalProven","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86535,"src":"12050:16:134","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$","typeString":"function (bytes32,address,address)"}},"id":86831,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12050:56:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86832,"nodeType":"EmitStatement","src":"12045:61:134"}]},"documentation":{"id":86703,"nodeType":"StructuredDocumentation","src":"7906:377:134","text":"@notice Proves a withdrawal transaction.\n @param _tx Withdrawal transaction to finalize.\n @param _l2OutputIndex L2 output index to prove against.\n @param _outputRootProof Inclusion proof of the L2ToL1MessagePasser contract's storage root.\n @param _withdrawalProof Inclusion proof of the withdrawal in L2ToL1MessagePasser contract."},"functionSelector":"4870496f","implemented":true,"kind":"function","modifiers":[{"id":86717,"kind":"modifierInvocation","modifierName":{"id":86716,"name":"whenNotPaused","nodeType":"IdentifierPath","referencedDeclaration":86553,"src":"8535:13:134"},"nodeType":"ModifierInvocation","src":"8535:13:134"}],"name":"proveWithdrawalTransaction","nameLocation":"8297:26:134","parameters":{"id":86715,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86706,"mutability":"mutable","name":"_tx","nameLocation":"8368:3:134","nodeType":"VariableDeclaration","scope":86834,"src":"8333:38:134","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction"},"typeName":{"id":86705,"nodeType":"UserDefinedTypeName","pathNode":{"id":86704,"name":"Types.WithdrawalTransaction","nodeType":"IdentifierPath","referencedDeclaration":104348,"src":"8333:27:134"},"referencedDeclaration":104348,"src":"8333:27:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_storage_ptr","typeString":"struct Types.WithdrawalTransaction"}},"visibility":"internal"},{"constant":false,"id":86708,"mutability":"mutable","name":"_l2OutputIndex","nameLocation":"8389:14:134","nodeType":"VariableDeclaration","scope":86834,"src":"8381:22:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86707,"name":"uint256","nodeType":"ElementaryTypeName","src":"8381:7:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":86711,"mutability":"mutable","name":"_outputRootProof","nameLocation":"8444:16:134","nodeType":"VariableDeclaration","scope":86834,"src":"8413:47:134","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRootProof_$104316_calldata_ptr","typeString":"struct Types.OutputRootProof"},"typeName":{"id":86710,"nodeType":"UserDefinedTypeName","pathNode":{"id":86709,"name":"Types.OutputRootProof","nodeType":"IdentifierPath","referencedDeclaration":104316,"src":"8413:21:134"},"referencedDeclaration":104316,"src":"8413:21:134","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRootProof_$104316_storage_ptr","typeString":"struct Types.OutputRootProof"}},"visibility":"internal"},{"constant":false,"id":86714,"mutability":"mutable","name":"_withdrawalProof","nameLocation":"8487:16:134","nodeType":"VariableDeclaration","scope":86834,"src":"8470:33:134","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes[]"},"typeName":{"baseType":{"id":86712,"name":"bytes","nodeType":"ElementaryTypeName","src":"8470:5:134","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"id":86713,"nodeType":"ArrayTypeName","src":"8470:7:134","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_storage_$dyn_storage_ptr","typeString":"bytes[]"}},"visibility":"internal"}],"src":"8323:186:134"},"returnParameters":{"id":86718,"nodeType":"ParameterList","parameters":[],"src":"8553:0:134"},"scope":87104,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":86978,"nodeType":"FunctionDefinition","src":"12226:4818:134","nodes":[],"body":{"id":86977,"nodeType":"Block","src":"12328:4716:134","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":86847,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86844,"name":"l2Sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86489,"src":"12594:8:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":86845,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"12606:9:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Constants_$103096_$","typeString":"type(library Constants)"}},"id":86846,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"DEFAULT_L2_SENDER","nodeType":"MemberAccess","referencedDeclaration":103058,"src":"12606:27:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"12594:39:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a2063616e206f6e6c792074726967676572206f6e65207769746864726177616c20706572207472616e73616374696f6e","id":86848,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"12635:65:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_452e6500a4013b85635a7a9b231d68a5197c7f7579d0b96d0b2f2e5fe6b5995b","typeString":"literal_string \"OptimismPortal: can only trigger one withdrawal per transaction\""},"value":"OptimismPortal: can only trigger one withdrawal per transaction"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_452e6500a4013b85635a7a9b231d68a5197c7f7579d0b96d0b2f2e5fe6b5995b","typeString":"literal_string \"OptimismPortal: can only trigger one withdrawal per transaction\""}],"id":86843,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"12573:7:134","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86849,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12573:137:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86850,"nodeType":"ExpressionStatement","src":"12573:137:134"},{"assignments":[86852],"declarations":[{"constant":false,"id":86852,"mutability":"mutable","name":"withdrawalHash","nameLocation":"12801:14:134","nodeType":"VariableDeclaration","scope":86977,"src":"12793:22:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":86851,"name":"bytes32","nodeType":"ElementaryTypeName","src":"12793:7:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":86857,"initialValue":{"arguments":[{"id":86855,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86838,"src":"12841:3:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}],"expression":{"id":86853,"name":"Hashing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103936,"src":"12818:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Hashing_$103936_$","typeString":"type(library Hashing)"}},"id":86854,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hashWithdrawal","nodeType":"MemberAccess","referencedDeclaration":103911,"src":"12818:22:134","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_WithdrawalTransaction_$104348_memory_ptr_$returns$_t_bytes32_$","typeString":"function (struct Types.WithdrawalTransaction memory) pure returns (bytes32)"}},"id":86856,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12818:27:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"12793:52:134"},{"assignments":[86860],"declarations":[{"constant":false,"id":86860,"mutability":"mutable","name":"provenWithdrawal","nameLocation":"12879:16:134","nodeType":"VariableDeclaration","scope":86977,"src":"12855:40:134","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_memory_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal"},"typeName":{"id":86859,"nodeType":"UserDefinedTypeName","pathNode":{"id":86858,"name":"ProvenWithdrawal","nodeType":"IdentifierPath","referencedDeclaration":86478,"src":"12855:16:134"},"referencedDeclaration":86478,"src":"12855:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_storage_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal"}},"visibility":"internal"}],"id":86864,"initialValue":{"baseExpression":{"id":86861,"name":"provenWithdrawals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86500,"src":"12898:17:134","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$86478_storage_$","typeString":"mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal storage ref)"}},"id":86863,"indexExpression":{"id":86862,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86852,"src":"12916:14:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"12898:33:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_storage","typeString":"struct OptimismPortal.ProvenWithdrawal storage ref"}},"nodeType":"VariableDeclarationStatement","src":"12855:76:134"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint128","typeString":"uint128"},"id":86869,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86866,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86860,"src":"13181:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_memory_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal memory"}},"id":86867,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":86475,"src":"13181:26:134","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":86868,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13211:1:134","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"13181:31:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e6f74206265656e2070726f76656e20796574","id":86870,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"13214:52:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_bc94f9f4f2ecd47ddd807efca122bcc34325481f7fe9d60687e25c709aff1610","typeString":"literal_string \"OptimismPortal: withdrawal has not been proven yet\""},"value":"OptimismPortal: withdrawal has not been proven yet"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bc94f9f4f2ecd47ddd807efca122bcc34325481f7fe9d60687e25c709aff1610","typeString":"literal_string \"OptimismPortal: withdrawal has not been proven yet\""}],"id":86865,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"13173:7:134","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86871,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13173:94:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86872,"nodeType":"ExpressionStatement","src":"13173:94:134"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":86879,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86874,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86860,"src":"13554:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_memory_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal memory"}},"id":86875,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":86475,"src":"13554:26:134","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":86876,"name":"l2Oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86511,"src":"13584:8:134","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},"id":86877,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startingTimestamp","nodeType":"MemberAccess","referencedDeclaration":85942,"src":"13584:26:134","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":86878,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13584:28:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13554:58:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657374616d70206c657373207468616e204c32204f7261636c65207374617274696e672074696d657374616d70","id":86880,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"13626:77:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_5c7c78dd7f8d5d79f2ff5ac1a4442209661a78fffa24392f88331b760a60bedd","typeString":"literal_string \"OptimismPortal: withdrawal timestamp less than L2 Oracle starting timestamp\""},"value":"OptimismPortal: withdrawal timestamp less than L2 Oracle starting timestamp"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5c7c78dd7f8d5d79f2ff5ac1a4442209661a78fffa24392f88331b760a60bedd","typeString":"literal_string \"OptimismPortal: withdrawal timestamp less than L2 Oracle starting timestamp\""}],"id":86873,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"13533:7:134","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86881,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13533:180:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86882,"nodeType":"ExpressionStatement","src":"13533:180:134"},{"expression":{"arguments":[{"arguments":[{"expression":{"id":86885,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86860,"src":"14132:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_memory_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal memory"}},"id":86886,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":86475,"src":"14132:26:134","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint128","typeString":"uint128"}],"id":86884,"name":"_isFinalizationPeriodElapsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87103,"src":"14103:28:134","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) view returns (bool)"}},"id":86887,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14103:56:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a2070726f76656e207769746864726177616c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c6170736564","id":86888,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14173:71:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_98a66ca0d4a8e5a839585f0aa5b4b8fc94a946382443fc5580ee1ed6e6237f70","typeString":"literal_string \"OptimismPortal: proven withdrawal finalization period has not elapsed\""},"value":"OptimismPortal: proven withdrawal finalization period has not elapsed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_98a66ca0d4a8e5a839585f0aa5b4b8fc94a946382443fc5580ee1ed6e6237f70","typeString":"literal_string \"OptimismPortal: proven withdrawal finalization period has not elapsed\""}],"id":86883,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"14082:7:134","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86889,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14082:172:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86890,"nodeType":"ExpressionStatement","src":"14082:172:134"},{"assignments":[86895],"declarations":[{"constant":false,"id":86895,"mutability":"mutable","name":"proposal","nameLocation":"14453:8:134","nodeType":"VariableDeclaration","scope":86977,"src":"14425:36:134","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_memory_ptr","typeString":"struct Types.OutputProposal"},"typeName":{"id":86894,"nodeType":"UserDefinedTypeName","pathNode":{"id":86893,"name":"Types.OutputProposal","nodeType":"IdentifierPath","referencedDeclaration":104307,"src":"14425:20:134"},"referencedDeclaration":104307,"src":"14425:20:134","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_storage_ptr","typeString":"struct Types.OutputProposal"}},"visibility":"internal"}],"id":86901,"initialValue":{"arguments":[{"expression":{"id":86898,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86860,"src":"14485:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_memory_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal memory"}},"id":86899,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"l2OutputIndex","nodeType":"MemberAccess","referencedDeclaration":86477,"src":"14485:30:134","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint128","typeString":"uint128"}],"expression":{"id":86896,"name":"l2Oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86511,"src":"14464:8:134","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},"id":86897,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getL2Output","nodeType":"MemberAccess","referencedDeclaration":86275,"src":"14464:20:134","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$104307_memory_ptr_$","typeString":"function (uint256) view external returns (struct Types.OutputProposal memory)"}},"id":86900,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14464:52:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_memory_ptr","typeString":"struct Types.OutputProposal memory"}},"nodeType":"VariableDeclarationStatement","src":"14425:91:134"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":86907,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86903,"name":"proposal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86895,"src":"14804:8:134","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_memory_ptr","typeString":"struct Types.OutputProposal memory"}},"id":86904,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"outputRoot","nodeType":"MemberAccess","referencedDeclaration":104302,"src":"14804:19:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":86905,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86860,"src":"14827:16:134","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$86478_memory_ptr","typeString":"struct OptimismPortal.ProvenWithdrawal memory"}},"id":86906,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"outputRoot","nodeType":"MemberAccess","referencedDeclaration":86473,"src":"14827:27:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"14804:50:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f76656e206973206e6f74207468652073616d652061732063757272656e74206f757470757420726f6f74","id":86908,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"14868:75:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_2bee9e90a055fc3fdea28727a1d039ffb281ae00c8962ca3262d0dabb187a280","typeString":"literal_string \"OptimismPortal: output root proven is not the same as current output root\""},"value":"OptimismPortal: output root proven is not the same as current output root"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2bee9e90a055fc3fdea28727a1d039ffb281ae00c8962ca3262d0dabb187a280","typeString":"literal_string \"OptimismPortal: output root proven is not the same as current output root\""}],"id":86902,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"14783:7:134","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86909,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14783:170:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86910,"nodeType":"ExpressionStatement","src":"14783:170:134"},{"expression":{"arguments":[{"arguments":[{"expression":{"id":86913,"name":"proposal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86895,"src":"15081:8:134","typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_memory_ptr","typeString":"struct Types.OutputProposal memory"}},"id":86914,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":104304,"src":"15081:18:134","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint128","typeString":"uint128"}],"id":86912,"name":"_isFinalizationPeriodElapsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87103,"src":"15052:28:134","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) view returns (bool)"}},"id":86915,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15052:48:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c6170736564","id":86916,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"15114:69:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_e2e53e5f2e5c146290963511529e48aa3e1570a42475ccc1fb3eba5190175c74","typeString":"literal_string \"OptimismPortal: output proposal finalization period has not elapsed\""},"value":"OptimismPortal: output proposal finalization period has not elapsed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e2e53e5f2e5c146290963511529e48aa3e1570a42475ccc1fb3eba5190175c74","typeString":"literal_string \"OptimismPortal: output proposal finalization period has not elapsed\""}],"id":86911,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"15031:7:134","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86917,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15031:162:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86918,"nodeType":"ExpressionStatement","src":"15031:162:134"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":86924,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":86920,"name":"finalizedWithdrawals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86494,"src":"15309:20:134","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"}},"id":86922,"indexExpression":{"id":86921,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86852,"src":"15330:14:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15309:36:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"66616c7365","id":86923,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"15349:5:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"15309:45:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a207769746864726177616c2068617320616c7265616479206265656e2066696e616c697a6564","id":86925,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"15356:55:134","typeDescriptions":{"typeIdentifier":"t_stringliteral_2a1157cbf4171a399f26106a5211324151853c78d2faca1fb1d3acbf755aa485","typeString":"literal_string \"OptimismPortal: withdrawal has already been finalized\""},"value":"OptimismPortal: withdrawal has already been finalized"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2a1157cbf4171a399f26106a5211324151853c78d2faca1fb1d3acbf755aa485","typeString":"literal_string \"OptimismPortal: withdrawal has already been finalized\""}],"id":86919,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"15301:7:134","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86926,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15301:111:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86927,"nodeType":"ExpressionStatement","src":"15301:111:134"},{"expression":{"id":86932,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":86928,"name":"finalizedWithdrawals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86494,"src":"15492:20:134","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"}},"id":86930,"indexExpression":{"id":86929,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86852,"src":"15513:14:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"15492:36:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":86931,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"15531:4:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"15492:43:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":86933,"nodeType":"ExpressionStatement","src":"15492:43:134"},{"expression":{"id":86937,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86934,"name":"l2Sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86489,"src":"15629:8:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":86935,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86838,"src":"15640:3:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":86936,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":104339,"src":"15640:10:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"15629:21:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":86938,"nodeType":"ExpressionStatement","src":"15629:21:134"},{"assignments":[86940],"declarations":[{"constant":false,"id":86940,"mutability":"mutable","name":"success","nameLocation":"16275:7:134","nodeType":"VariableDeclaration","scope":86977,"src":"16270:12:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":86939,"name":"bool","nodeType":"ElementaryTypeName","src":"16270:4:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":86952,"initialValue":{"arguments":[{"expression":{"id":86943,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86838,"src":"16309:3:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":86944,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"target","nodeType":"MemberAccess","referencedDeclaration":104341,"src":"16309:10:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":86945,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86838,"src":"16321:3:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":86946,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"gasLimit","nodeType":"MemberAccess","referencedDeclaration":104345,"src":"16321:12:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":86947,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86838,"src":"16335:3:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":86948,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","referencedDeclaration":104343,"src":"16335:9:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":86949,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86838,"src":"16346:3:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":86950,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"data","nodeType":"MemberAccess","referencedDeclaration":104347,"src":"16346:8:134","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":86941,"name":"SafeCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104213,"src":"16285:8:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCall_$104213_$","typeString":"type(library SafeCall)"}},"id":86942,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callWithMinGas","nodeType":"MemberAccess","referencedDeclaration":104212,"src":"16285:23:134","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (address,uint256,uint256,bytes memory) returns (bool)"}},"id":86951,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16285:70:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"16270:85:134"},{"expression":{"id":86956,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86953,"name":"l2Sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86489,"src":"16423:8:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":86954,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"16434:9:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Constants_$103096_$","typeString":"type(library Constants)"}},"id":86955,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"DEFAULT_L2_SENDER","nodeType":"MemberAccess","referencedDeclaration":103058,"src":"16434:27:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"16423:38:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":86957,"nodeType":"ExpressionStatement","src":"16423:38:134"},{"eventCall":{"arguments":[{"id":86959,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86852,"src":"16640:14:134","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":86960,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86940,"src":"16656:7:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":86958,"name":"WithdrawalFinalized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86542,"src":"16620:19:134","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_bool_$returns$__$","typeString":"function (bytes32,bool)"}},"id":86961,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16620:44:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86962,"nodeType":"EmitStatement","src":"16615:49:134"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":86971,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":86965,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86963,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86940,"src":"16928:7:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"66616c7365","id":86964,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"16939:5:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"16928:16:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":86970,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":86966,"name":"tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-26,"src":"16948:2:134","typeDescriptions":{"typeIdentifier":"t_magic_transaction","typeString":"tx"}},"id":86967,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"origin","nodeType":"MemberAccess","src":"16948:9:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":86968,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"16961:9:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Constants_$103096_$","typeString":"type(library Constants)"}},"id":86969,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"ESTIMATION_ADDRESS","nodeType":"MemberAccess","referencedDeclaration":103054,"src":"16961:28:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"16948:41:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"16928:61:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":86976,"nodeType":"IfStatement","src":"16924:114:134","trueBody":{"id":86975,"nodeType":"Block","src":"16991:47:134","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":86972,"name":"GasEstimation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103993,"src":"17012:13:134","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":86973,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17012:15:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":86974,"nodeType":"RevertStatement","src":"17005:22:134"}]}}]},"documentation":{"id":86835,"nodeType":"StructuredDocumentation","src":"12119:102:134","text":"@notice Finalizes a withdrawal transaction.\n @param _tx Withdrawal transaction to finalize."},"functionSelector":"8c3152e9","implemented":true,"kind":"function","modifiers":[{"id":86841,"kind":"modifierInvocation","modifierName":{"id":86840,"name":"whenNotPaused","nodeType":"IdentifierPath","referencedDeclaration":86553,"src":"12314:13:134"},"nodeType":"ModifierInvocation","src":"12314:13:134"}],"name":"finalizeWithdrawalTransaction","nameLocation":"12235:29:134","parameters":{"id":86839,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86838,"mutability":"mutable","name":"_tx","nameLocation":"12300:3:134","nodeType":"VariableDeclaration","scope":86978,"src":"12265:38:134","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction"},"typeName":{"id":86837,"nodeType":"UserDefinedTypeName","pathNode":{"id":86836,"name":"Types.WithdrawalTransaction","nodeType":"IdentifierPath","referencedDeclaration":104348,"src":"12265:27:134"},"referencedDeclaration":104348,"src":"12265:27:134","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_storage_ptr","typeString":"struct Types.WithdrawalTransaction"}},"visibility":"internal"}],"src":"12264:40:134"},"returnParameters":{"id":86842,"nodeType":"ParameterList","parameters":[],"src":"12328:0:134"},"scope":87104,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":87068,"nodeType":"FunctionDefinition","src":"17774:1855:134","nodes":[],"body":{"id":87067,"nodeType":"Block","src":"17995:1634:134","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":87002,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86995,"name":"_isCreation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86987,"src":"18134:11:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":87001,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":86996,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86981,"src":"18149:3:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":86999,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18164:1:134","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":86998,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18156:7:134","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":86997,"name":"address","nodeType":"ElementaryTypeName","src":"18156:7:134","typeDescriptions":{}}},"id":87000,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18156:10:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"18149:17:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"18134:32:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87006,"nodeType":"IfStatement","src":"18130:56:134","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":87003,"name":"BadTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103969,"src":"18175:9:134","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":87004,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18175:11:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87005,"nodeType":"RevertStatement","src":"18168:18:134"}},{"condition":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":87015,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":87007,"name":"_gasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86985,"src":"18338:9:134","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"arguments":[{"arguments":[{"expression":{"id":87011,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86989,"src":"18373:5:134","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":87012,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"18373:12:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":87010,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18366:6:134","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":87009,"name":"uint64","nodeType":"ElementaryTypeName","src":"18366:6:134","typeDescriptions":{}}},"id":87013,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18366:20:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":87008,"name":"minimumGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86666,"src":"18350:15:134","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint64_$returns$_t_uint64_$","typeString":"function (uint64) pure returns (uint64)"}},"id":87014,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18350:37:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"18338:49:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87019,"nodeType":"IfStatement","src":"18334:77:134","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":87016,"name":"SmallGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103975,"src":"18396:13:134","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":87017,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18396:15:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87018,"nodeType":"RevertStatement","src":"18389:22:134"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":87023,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87020,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86989,"src":"18786:5:134","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":87021,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"18786:12:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"3132305f303030","id":87022,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18801:7:134","typeDescriptions":{"typeIdentifier":"t_rational_120000_by_1","typeString":"int_const 120000"},"value":"120_000"},"src":"18786:22:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87027,"nodeType":"IfStatement","src":"18782:50:134","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":87024,"name":"LargeCalldata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103972,"src":"18817:13:134","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":87025,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18817:15:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87026,"nodeType":"RevertStatement","src":"18810:22:134"}},{"assignments":[87029],"declarations":[{"constant":false,"id":87029,"mutability":"mutable","name":"from","nameLocation":"18931:4:134","nodeType":"VariableDeclaration","scope":87067,"src":"18923:12:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87028,"name":"address","nodeType":"ElementaryTypeName","src":"18923:7:134","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":87032,"initialValue":{"expression":{"id":87030,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"18938:3:134","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87031,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"18938:10:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"18923:25:134"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":87037,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87033,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"18962:3:134","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87034,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"18962:10:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":87035,"name":"tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-26,"src":"18976:2:134","typeDescriptions":{"typeIdentifier":"t_magic_transaction","typeString":"tx"}},"id":87036,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"origin","nodeType":"MemberAccess","src":"18976:9:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"18962:23:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87047,"nodeType":"IfStatement","src":"18958:108:134","trueBody":{"id":87046,"nodeType":"Block","src":"18987:79:134","statements":[{"expression":{"id":87044,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87038,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87029,"src":"19001:4:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":87041,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"19044:3:134","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87042,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"19044:10:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":87039,"name":"AddressAliasHelper","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111913,"src":"19008:18:134","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AddressAliasHelper_$111913_$","typeString":"type(library AddressAliasHelper)"}},"id":87040,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"applyL1ToL2Alias","nodeType":"MemberAccess","referencedDeclaration":111890,"src":"19008:35:134","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_address_$returns$_t_address_$","typeString":"function (address) pure returns (address)"}},"id":87043,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19008:47:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"19001:54:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":87045,"nodeType":"ExpressionStatement","src":"19001:54:134"}]}},{"assignments":[87049],"declarations":[{"constant":false,"id":87049,"mutability":"mutable","name":"opaqueData","nameLocation":"19336:10:134","nodeType":"VariableDeclaration","scope":87067,"src":"19323:23:134","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":87048,"name":"bytes","nodeType":"ElementaryTypeName","src":"19323:5:134","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":87059,"initialValue":{"arguments":[{"expression":{"id":87052,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"19366:3:134","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87053,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"19366:9:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":87054,"name":"_value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86983,"src":"19377:6:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":87055,"name":"_gasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86985,"src":"19385:9:134","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},{"id":87056,"name":"_isCreation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86987,"src":"19396:11:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":87057,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86989,"src":"19409:5:134","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":87050,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"19349:3:134","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":87051,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"19349:16:134","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":87058,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19349:66:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"19323:92:134"},{"eventCall":{"arguments":[{"id":87061,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87029,"src":"19583:4:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":87062,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86981,"src":"19589:3:134","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":87063,"name":"DEPOSIT_VERSION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86482,"src":"19594:15:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":87064,"name":"opaqueData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87049,"src":"19611:10:134","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":87060,"name":"TransactionDeposited","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86526,"src":"19562:20:134","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes memory)"}},"id":87065,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19562:60:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87066,"nodeType":"EmitStatement","src":"19557:65:134"}]},"documentation":{"id":86979,"nodeType":"StructuredDocumentation","src":"17050:719:134","text":"@notice Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in\n deriving deposit transactions. Note that if a deposit is made by a contract, its\n address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider\n using the CrossDomainMessenger contracts for a simpler developer experience.\n @param _to Target address on L2.\n @param _value ETH value to send to the recipient.\n @param _gasLimit Amount of L2 gas to purchase by burning gas on L1.\n @param _isCreation Whether or not the transaction is a contract creation.\n @param _data Data to trigger the recipient with."},"functionSelector":"e9e05c42","implemented":true,"kind":"function","modifiers":[{"arguments":[{"id":86992,"name":"_gasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86985,"src":"17980:9:134","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"id":86993,"kind":"modifierInvocation","modifierName":{"id":86991,"name":"metered","nodeType":"IdentifierPath","referencedDeclaration":88284,"src":"17972:7:134"},"nodeType":"ModifierInvocation","src":"17972:18:134"}],"name":"depositTransaction","nameLocation":"17783:18:134","parameters":{"id":86990,"nodeType":"ParameterList","parameters":[{"constant":false,"id":86981,"mutability":"mutable","name":"_to","nameLocation":"17819:3:134","nodeType":"VariableDeclaration","scope":87068,"src":"17811:11:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":86980,"name":"address","nodeType":"ElementaryTypeName","src":"17811:7:134","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":86983,"mutability":"mutable","name":"_value","nameLocation":"17840:6:134","nodeType":"VariableDeclaration","scope":87068,"src":"17832:14:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":86982,"name":"uint256","nodeType":"ElementaryTypeName","src":"17832:7:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":86985,"mutability":"mutable","name":"_gasLimit","nameLocation":"17863:9:134","nodeType":"VariableDeclaration","scope":87068,"src":"17856:16:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":86984,"name":"uint64","nodeType":"ElementaryTypeName","src":"17856:6:134","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"},{"constant":false,"id":86987,"mutability":"mutable","name":"_isCreation","nameLocation":"17887:11:134","nodeType":"VariableDeclaration","scope":87068,"src":"17882:16:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":86986,"name":"bool","nodeType":"ElementaryTypeName","src":"17882:4:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":86989,"mutability":"mutable","name":"_data","nameLocation":"17921:5:134","nodeType":"VariableDeclaration","scope":87068,"src":"17908:18:134","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":86988,"name":"bytes","nodeType":"ElementaryTypeName","src":"17908:5:134","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"17801:131:134"},"returnParameters":{"id":86994,"nodeType":"ParameterList","parameters":[],"src":"17995:0:134"},"scope":87104,"stateMutability":"payable","virtual":false,"visibility":"public"},{"id":87085,"nodeType":"FunctionDefinition","src":"19926:180:134","nodes":[],"body":{"id":87084,"nodeType":"Block","src":"20006:100:134","nodes":[],"statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":87079,"name":"_l2OutputIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87071,"src":"20073:14:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":87077,"name":"l2Oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86511,"src":"20052:8:134","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},"id":87078,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getL2Output","nodeType":"MemberAccess","referencedDeclaration":86275,"src":"20052:20:134","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$104307_memory_ptr_$","typeString":"function (uint256) view external returns (struct Types.OutputProposal memory)"}},"id":87080,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20052:36:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_OutputProposal_$104307_memory_ptr","typeString":"struct Types.OutputProposal memory"}},"id":87081,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":104304,"src":"20052:46:134","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint128","typeString":"uint128"}],"id":87076,"name":"_isFinalizationPeriodElapsed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87103,"src":"20023:28:134","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) view returns (bool)"}},"id":87082,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20023:76:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":87075,"id":87083,"nodeType":"Return","src":"20016:83:134"}]},"documentation":{"id":87069,"nodeType":"StructuredDocumentation","src":"19635:286:134","text":"@notice Determine if a given output is finalized.\n Reverts if the call to l2Oracle.getL2Output reverts.\n Returns a boolean otherwise.\n @param _l2OutputIndex Index of the L2 output to check.\n @return Whether or not the output is finalized."},"functionSelector":"6dbffb78","implemented":true,"kind":"function","modifiers":[],"name":"isOutputFinalized","nameLocation":"19935:17:134","parameters":{"id":87072,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87071,"mutability":"mutable","name":"_l2OutputIndex","nameLocation":"19961:14:134","nodeType":"VariableDeclaration","scope":87085,"src":"19953:22:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87070,"name":"uint256","nodeType":"ElementaryTypeName","src":"19953:7:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"19952:24:134"},"returnParameters":{"id":87075,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87074,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":87085,"src":"20000:4:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":87073,"name":"bool","nodeType":"ElementaryTypeName","src":"20000:4:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"19999:6:134"},"scope":87104,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":87103,"nodeType":"FunctionDefinition","src":"20359:180:134","nodes":[],"body":{"id":87102,"nodeType":"Block","src":"20446:93:134","nodes":[],"statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":87100,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87093,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"20463:5:134","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":87094,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"20463:15:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":87099,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":87095,"name":"_timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87088,"src":"20481:10:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87096,"name":"l2Oracle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":86511,"src":"20494:8:134","typeDescriptions":{"typeIdentifier":"t_contract$_L2OutputOracle_$86435","typeString":"contract L2OutputOracle"}},"id":87097,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"FINALIZATION_PERIOD_SECONDS","nodeType":"MemberAccess","referencedDeclaration":86121,"src":"20494:36:134","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":87098,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20494:38:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"20481:51:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"20463:69:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":87092,"id":87101,"nodeType":"Return","src":"20456:76:134"}]},"documentation":{"id":87086,"nodeType":"StructuredDocumentation","src":"20112:242:134","text":"@notice Determines whether the finalization period has elapsed with respect to\n the provided block timestamp.\n @param _timestamp Timestamp to check.\n @return Whether or not the finalization period has elapsed."},"implemented":true,"kind":"function","modifiers":[],"name":"_isFinalizationPeriodElapsed","nameLocation":"20368:28:134","parameters":{"id":87089,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87088,"mutability":"mutable","name":"_timestamp","nameLocation":"20405:10:134","nodeType":"VariableDeclaration","scope":87103,"src":"20397:18:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87087,"name":"uint256","nodeType":"ElementaryTypeName","src":"20397:7:134","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"20396:20:134"},"returnParameters":{"id":87092,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87091,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":87103,"src":"20440:4:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":87090,"name":"bool","nodeType":"ElementaryTypeName","src":"20440:4:134","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"20439:6:134"},"scope":87104,"stateMutability":"view","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[{"baseName":{"id":86466,"name":"Initializable","nodeType":"IdentifierPath","referencedDeclaration":49678,"src":"1267:13:134"},"id":86467,"nodeType":"InheritanceSpecifier","src":"1267:13:134"},{"baseName":{"id":86468,"name":"ResourceMetering","nodeType":"IdentifierPath","referencedDeclaration":88581,"src":"1282:16:134"},"id":86469,"nodeType":"InheritanceSpecifier","src":"1282:16:134"},{"baseName":{"id":86470,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"1300:7:134"},"id":86471,"nodeType":"InheritanceSpecifier","src":"1300:7:134"}],"canonicalName":"OptimismPortal","contractDependencies":[],"contractKind":"contract","documentation":{"id":86465,"nodeType":"StructuredDocumentation","src":"902:338:134","text":"@custom:proxied\n @title OptimismPortal\n @notice The OptimismPortal is a low-level contract responsible for passing messages between L1\n and L2. Messages sent directly to the OptimismPortal have no form of replayability.\n Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface."},"fullyImplemented":true,"linearizedBaseContracts":[87104,109417,88581,49678],"name":"OptimismPortal","nameLocation":"1249:14:134","scope":87105,"usedErrors":[88238,103969,103972,103975,103990,103993]}],"license":"MIT"},"id":134} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/OptimismPortal2.json b/packages/sdk/src/forge-artifacts/OptimismPortal2.json new file mode 100644 index 000000000000..962c442e0c67 --- /dev/null +++ b/packages/sdk/src/forge-artifacts/OptimismPortal2.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_proofMaturityDelaySeconds","type":"uint256","internalType":"uint256"},{"name":"_disputeGameFinalityDelaySeconds","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"blacklistDisputeGame","inputs":[{"name":"_disputeGame","type":"address","internalType":"contract IDisputeGame"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"checkWithdrawal","inputs":[{"name":"_withdrawalHash","type":"bytes32","internalType":"bytes32"},{"name":"_proofSubmitter","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"depositTransaction","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"},{"name":"_gasLimit","type":"uint64","internalType":"uint64"},{"name":"_isCreation","type":"bool","internalType":"bool"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"disputeGameBlacklist","inputs":[{"name":"","type":"address","internalType":"contract IDisputeGame"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"disputeGameFactory","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract DisputeGameFactory"}],"stateMutability":"view"},{"type":"function","name":"disputeGameFinalityDelaySeconds","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"donateETH","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"finalizeWithdrawalTransaction","inputs":[{"name":"_tx","type":"tuple","internalType":"struct Types.WithdrawalTransaction","components":[{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"sender","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"gasLimit","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finalizeWithdrawalTransactionExternalProof","inputs":[{"name":"_tx","type":"tuple","internalType":"struct Types.WithdrawalTransaction","components":[{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"sender","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"gasLimit","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}]},{"name":"_proofSubmitter","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finalizedWithdrawals","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"guardian","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_disputeGameFactory","type":"address","internalType":"contract DisputeGameFactory"},{"name":"_systemConfig","type":"address","internalType":"contract SystemConfig"},{"name":"_superchainConfig","type":"address","internalType":"contract SuperchainConfig"},{"name":"_initialRespectedGameType","type":"uint32","internalType":"GameType"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"l2Sender","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"minimumGasLimit","inputs":[{"name":"_byteCount","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"pure"},{"type":"function","name":"numProofSubmitters","inputs":[{"name":"_withdrawalHash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"params","inputs":[],"outputs":[{"name":"prevBaseFee","type":"uint128","internalType":"uint128"},{"name":"prevBoughtGas","type":"uint64","internalType":"uint64"},{"name":"prevBlockNum","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"proofMaturityDelaySeconds","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"proofSubmitters","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proveWithdrawalTransaction","inputs":[{"name":"_tx","type":"tuple","internalType":"struct Types.WithdrawalTransaction","components":[{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"sender","type":"address","internalType":"address"},{"name":"target","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"gasLimit","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}]},{"name":"_disputeGameIndex","type":"uint256","internalType":"uint256"},{"name":"_outputRootProof","type":"tuple","internalType":"struct Types.OutputRootProof","components":[{"name":"version","type":"bytes32","internalType":"bytes32"},{"name":"stateRoot","type":"bytes32","internalType":"bytes32"},{"name":"messagePasserStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"latestBlockhash","type":"bytes32","internalType":"bytes32"}]},{"name":"_withdrawalProof","type":"bytes[]","internalType":"bytes[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"provenWithdrawals","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"disputeGameProxy","type":"address","internalType":"contract IDisputeGame"},{"name":"timestamp","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"respectedGameType","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"GameType"}],"stateMutability":"view"},{"type":"function","name":"respectedGameTypeUpdatedAt","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"setRespectedGameType","inputs":[{"name":"_gameType","type":"uint32","internalType":"GameType"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"superchainConfig","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract SuperchainConfig"}],"stateMutability":"view"},{"type":"function","name":"systemConfig","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract SystemConfig"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"TransactionDeposited","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"version","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"opaqueData","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"WithdrawalFinalized","inputs":[{"name":"withdrawalHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"success","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"WithdrawalProven","inputs":[{"name":"withdrawalHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"BadTarget","inputs":[]},{"type":"error","name":"CallPaused","inputs":[]},{"type":"error","name":"GasEstimation","inputs":[]},{"type":"error","name":"LargeCalldata","inputs":[]},{"type":"error","name":"OutOfGas","inputs":[]},{"type":"error","name":"SmallGasLimit","inputs":[]},{"type":"error","name":"Unauthorized","inputs":[]}],"bytecode":{"object":"0x60c06040523480156200001157600080fd5b5060405162005cbd38038062005cbd8339810160408190526200003491620002f2565b608082905260a08190526200004d600080808062000055565b505062000317565b600054610100900460ff1615808015620000765750600054600160ff909116105b80620000a6575062000093306200022460201b620020d41760201c565b158015620000a6575060005460ff166001145b6200010f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000133576000805461ff0019166101001790555b603880546001600160a01b03199081166001600160a01b03888116919091179092556037805490911686831617905560358054610100600160a81b0319166101008684160217905560325416620001cc576032805461dead6001600160a01b0319909116179055603b80546001600160601b031916640100000000426001600160401b03160263ffffffff19161763ffffffff84161790555b620001d662000233565b80156200021d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6001600160a01b03163b151590565b600054610100900460ff16620002a05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000106565b600154600160c01b90046001600160401b0316600003620002f05760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b600080604083850312156200030657600080fd5b505080516020909101519092909150565b60805160a0516159726200034b600039600081816104c30152611a4601526000818161063a015261168401526159726000f3fe6080604052600436106101b05760003560e01c80637fc48504116100ec578063a35d99df1161008a578063bf653a5c11610064578063bf653a5c1461062b578063cff0ab961461065e578063e9e05c42146106ff578063f2b4e6171461071257600080fd5b8063a35d99df14610544578063a3860f4814610564578063bb2c727e1461058457600080fd5b80638e819e54116100c65780638e819e5414610494578063952b2797146104b45780639bf62d82146104e7578063a14238e71461051457600080fd5b80637fc48504146104545780638b4c40b0146101d55780638c3152e91461047457600080fd5b80634870496f1161015957806354fd4d501161013357806354fd4d50146103a95780635c975abb146103ff57806371c1566e146104145780637d6be8dc1461043457600080fd5b80634870496f1461030c5780634fd0434c1461032c578063513747ab1461036e57600080fd5b806343ca1c501161018a57806343ca1c5014610297578063452a9320146102b757806345884d32146102cc57600080fd5b806333d7e2bd146101dc57806335e80ab3146102335780633c9f397c1461026557600080fd5b366101d7576101d53334620186a060006040518060200160405280600081525061073f565b005b600080fd5b3480156101e857600080fd5b506037546102099073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023f57600080fd5b5060355461020990610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561027157600080fd5b50603b546102829063ffffffff1681565b60405163ffffffff909116815260200161022a565b3480156102a357600080fd5b506101d56102b2366004614e15565b6108fc565b3480156102c357600080fd5b50610209610b5a565b3480156102d857600080fd5b506102fc6102e7366004614e67565b603a6020526000908152604090205460ff1681565b604051901515815260200161022a565b34801561031857600080fd5b506101d5610327366004614e84565b610bf2565b34801561033857600080fd5b50603b5461035590640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161022a565b34801561037a57600080fd5b5061039b610389366004614f60565b6000908152603c602052604090205490565b60405190815260200161022a565b3480156103b557600080fd5b506103f26040518060400160405280600581526020017f332e382e3000000000000000000000000000000000000000000000000000000081525081565b60405161022a9190614fef565b34801561040b57600080fd5b506102fc6112d6565b34801561042057600080fd5b506101d561042f366004615002565b611369565b34801561044057600080fd5b506101d561044f366004614e67565b611bfa565b34801561046057600080fd5b506101d561046f366004615039565b611cb5565b34801561048057600080fd5b506101d561048f366004615056565b611d6f565b3480156104a057600080fd5b506101d56104af366004615093565b611dbb565b3480156104c057600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039b565b3480156104f357600080fd5b506032546102099073ffffffffffffffffffffffffffffffffffffffff1681565b34801561052057600080fd5b506102fc61052f366004614f60565b60336020526000908152604090205460ff1681565b34801561055057600080fd5b5061035561055f366004615105565b612070565b34801561057057600080fd5b5061020961057f366004615122565b61208f565b34801561059057600080fd5b506105f661059f366004615002565b603960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301520161022a565b34801561063757600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039b565b34801561066a57600080fd5b506001546106c6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161022a565b6101d561070d366004615152565b61073f565b34801561071e57600080fd5b506038546102099073ffffffffffffffffffffffffffffffffffffffff1681565b8260005a9050838015610767575073ffffffffffffffffffffffffffffffffffffffff871615155b1561079e576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107a88351612070565b67ffffffffffffffff168567ffffffffffffffff1610156107f5576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c083511115610833576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33328114610854575033731111000000000000000000000000000000001111015b6000348888888860405160200161086f9594939291906151d1565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516108df9190614fef565b60405180910390a450506108f382826120f0565b50505050505050565b6109046112d6565b1561093b576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead146109e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084015b60405180910390fd5b60006109f4836123c7565b9050610a008183611369565b600081815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558401516080850151606086015160a0870151610aa293929190612414565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90610b0790841515815260200190565b60405180910390a280158015610b1d5750326001145b15610b54576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190615236565b905090565b610bfa6112d6565b15610c31576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610cf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016109e0565b6038546040517fbb8aa1fc00000000000000000000000000000000000000000000000000000000815260048101869052600091829173ffffffffffffffffffffffffffffffffffffffff9091169063bb8aa1fc90602401606060405180830381865afa158015610d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d889190615253565b925050915060008173ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfe91906152a0565b603b5490915063ffffffff848116911614610e9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b610eb2610ead368890038801886152b9565b612472565b8114610f40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016109e0565b6000610f4b896123c7565b905060018373ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe919061534e565b6002811115610fcf57610fcf61531f565b0361105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f742070726f76652061676160448201527f696e737420696e76616c696420646973707574652067616d657300000000000060648201526084016109e0565b60408051602081018390526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506111259101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529061111b898b61536f565b8b604001356124b1565b6111b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016109e0565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff808716825267ffffffffffffffff4281166020808501918252600088815260398252868120338252825286812095518654935190941674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931693851693909317919091179093558d840151928e01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4506000908152603c602090815260408220805460018101825590835291200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed91906153f3565b600082815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff85811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152818552603a90935292205490919060ff161561146e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652068617360448201527f206265656e20626c61636b6c697374656400000000000000000000000000000060648201526084016109e0565b816020015167ffffffffffffffff16600003611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2062792070726f6f66207375626d6974746560648201527f7220616464726573732079657400000000000000000000000000000000000000608482015260a4016109e0565b60006115b38273ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a69190615410565b67ffffffffffffffff1690565b90508067ffffffffffffffff16836020015167ffffffffffffffff1611611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e20646973707574652067616d65206372656160648201527f74696f6e2074696d657374616d70000000000000000000000000000000000000608482015260a4016109e0565b7f0000000000000000000000000000000000000000000000000000000000000000836020015167ffffffffffffffff16426116bd919061545c565b1161174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c20686173206e6f74206d61747572656420796574000000000000000000000060648201526084016109e0565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bb919061534e565b60028111156117cc576117cc61531f565b14611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f686173206e6f74206265656e2076616c6964617465640000000000000000000060648201526084016109e0565b603b5463ffffffff1663ffffffff166118e38373ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118da9190615473565b63ffffffff1690565b63ffffffff1614611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b603b5467ffffffffffffffff64010000000090910481169082161015611a44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652063726560448201527f61746564206265666f7265207265737065637465642067616d6520747970652060648201527f7761732075706461746564000000000000000000000000000000000000000000608482015260a4016109e0565b7f0000000000000000000000000000000000000000000000000000000000000000611ab38373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d6000803e3d6000fd5b611ac79067ffffffffffffffff164261545c565b11611b54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f696e206169722d6761700000000000000000000000000000000000000000000060648201526084016109e0565b60008581526033602052604090205460ff1615611bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016109e0565b5050505050565b611c02610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c66576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff166000908152603a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611cbd610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d21576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b805463ffffffff929092167fffffffffffffffffffffffffffffffffffffffff000000000000000000000000909216919091176401000000004267ffffffffffffffff1602179055565b565b611d776112d6565b15611dae576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611db881336108fc565b50565b600054610100900460ff1615808015611ddb5750600054600160ff909116105b80611df55750303b158015611df5575060005460ff166001145b611e81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109e0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611edf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8881169190911790925560378054909116868316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008684160217905560325416611fff576032805461dead7fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055603b80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166401000000004267ffffffffffffffff16027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000161763ffffffff84161790555b6120076124d5565b8015611bf357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600061207d826010615490565b612089906152086154c0565b92915050565b603c60205281600052604060002081815481106120ab57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090612126907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361545c565b905060006121326125e8565b90506000816020015160ff16826000015163ffffffff16612153919061551b565b9050821561228a5760015460009061218a908390700100000000000000000000000000000000900467ffffffffffffffff16615583565b90506000836040015160ff16836121a191906155f7565b6001546121c19084906fffffffffffffffffffffffffffffffff166155f7565b6121cb919061551b565b60015490915060009061221c906121f59084906fffffffffffffffffffffffffffffffff166156b3565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff166126a9565b9050600186111561224b576122486121f582876040015160ff1660018a612243919061545c565b6126c8565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b600180548691906010906122bd908490700100000000000000000000000000000000900467ffffffffffffffff166154c0565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561234a576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090612376906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615727565b9050600061238848633b9aca0061271d565b6123929083615764565b905060005a6123a1908861545c565b9050808211156123bd576123bd6123b8828461545c565b612734565b5050505050505050565b80516020808301516040808501516060860151608087015160a088015193516000976123f7979096959101615778565b604051602081830303815290604052805190602001209050919050565b6000806000612424866000612762565b90508061245a576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600081600001518260200151836040015184606001516040516020016123f7949392919093845260208401929092526040830152606082015260800190565b6000806124bd86612780565b90506124cb818686866127b2565b9695505050505050565b600054610100900460ff1661256c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e0565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003611d6d5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612685573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed91906157e5565b60006126be6126b885856127e2565b836127f2565b90505b9392505050565b6000670de0b6b3a76400006127096126e0858361551b565b6126f290670de0b6b3a7640000615583565b61270485670de0b6b3a76400006155f7565b612801565b61271390866155f7565b6126be919061551b565b60008183101561272d57816126c1565b5090919050565b6000805a90505b825a612747908361545c565b101561275d57612756826158a1565b915061273b565b505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6060818051906020012060405160200161279c91815260200190565b6040516020818303038152906040529050919050565b60006127d9846127c3878686612832565b8051602091820120825192909101919091201490565b95945050505050565b60008183121561272d57816126c1565b600081831261272d57816126c1565b60006126c1670de0b6b3a764000083612819866132b0565b61282391906155f7565b61282d919061551b565b6134f4565b6060600084511161289f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b6579000000000000000000000060448201526064016109e0565b60006128aa84613733565b905060006128b78661381f565b90506000846040516020016128ce91815260200190565b60405160208183030381529060405290506000805b8451811015613227576000858281518110612900576129006158d9565b60200260200101519050845183111561299b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016109e0565b82600003612a5457805180516020918201206040516129e9926129c392910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612a4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016109e0565b612bab565b805151602011612b0a5780518051602091820120604051612a7e926129c392910190815260200190565b612a4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016109e0565b805184516020808701919091208251919092012014612bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016109e0565b612bb760106001615908565b81602001515103612d935784518303612d2b57612bf18160200151601081518110612be457612be46158d9565b6020026020010151613882565b96506000875111612c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016109e0565b60018651612c92919061545c565b8214612d20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016109e0565b5050505050506126c1565b6000858481518110612d3f57612d3f6158d9565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110612d6a57612d6a6158d9565b60200260200101519050612d7d816139e2565b9550612d8a600186615908565b94505050613214565b60028160200151510361318c576000612dab82613a07565b9050600081600081518110612dc257612dc26158d9565b016020015160f81c90506000612dd9600283615920565b612de4906002615942565b90506000612df5848360ff16613a2b565b90506000612e038a89613a2b565b90506000612e118383613a61565b905080835114612ea3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016109e0565b60ff851660021480612eb8575060ff85166003145b156130a75780825114612f4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016109e0565b612f678760200151600181518110612be457612be46158d9565b9c5060008d5111612ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016109e0565b60018c51613008919061545c565b8814613096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016109e0565b5050505050505050505050506126c1565b60ff851615806130ba575060ff85166001145b156130f9576130e687602001516001815181106130d9576130d96158d9565b60200260200101516139e2565b99506130f2818a615908565b9850613181565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016109e0565b505050505050613214565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016109e0565b508061321f816158a1565b9150506128e3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016109e0565b600080821361331b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b6000606061332884613b15565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361352557506000919050565b680755bf798b4a1bf1e58212613597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016109e0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff81111561375157613751614c38565b60405190808252806020026020018201604052801561379657816020015b604080518082019091526060808252602082015281526020019060019003908161376f5790505b50915060005b818110156138185760405180604001604052808583815181106137c1576137c16158d9565b602002602001015181526020016137f08684815181106137e3576137e36158d9565b6020026020010151613beb565b815250838281518110613805576138056158d9565b602090810291909101015260010161379c565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613877578060011b82018184015160001a8060041c8253600f811660018301535050600101613849565b509295945050505050565b6060600080600061389285613bfe565b9194509250905060008160018111156138ad576138ad61531f565b1461393a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016109e0565b6139448284615908565b8551146139d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016109e0565b6127d98560200151848461466b565b606060208260000151106139fe576139f982613882565b612089565b612089826146ff565b6060612089613a268360200151600081518110612be457612be46158d9565b61381f565b606082518210613a4a5750604080516020810190915260008152612089565b6126c18383848651613a5c919061545c565b614715565b6000808251845110613a74578251613a77565b83515b90505b8082108015613afe5750828281518110613a9657613a966158d9565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613ad557613ad56158d9565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613b0e57816001019150613a7a565b5092915050565b6000808211613b80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060612089613bf9836148ed565b6149d6565b600080600080846000015111613cbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016109e0565b6020840151805160001a607f8111613ce1576000600160009450945094505050614664565b60b78111613eef576000613cf660808361545c565b905080876000015111613db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016109e0565b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082141580613e2a57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613edc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016109e0565b5060019550935060009250614664915050565b60bf811161423d576000613f0460b78361545c565b905080876000015111613fbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016109e0565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361409d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016109e0565b600184015160088302610100031c60378111614161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016109e0565b61416b8184615908565b895111614220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016109e0565b61422b836001615908565b97509550600094506146649350505050565b60f7811161431e57600061425260c08361545c565b90508087600001511161430d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016109e0565b600195509350849250614664915050565b600061432b60f78361545c565b9050808760000151116143e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016109e0565b60018301517fff000000000000000000000000000000000000000000000000000000000000001660008190036144c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016109e0565b600184015160088302610100031c60378111614588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016109e0565b6145928184615908565b895111614647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016109e0565b614652836001615908565b97509550600194506146649350505050565b9193909250565b60608167ffffffffffffffff81111561468657614686614c38565b6040519080825280601f01601f1916602001820160405280156146b0576020820181803683370190505b50905081156126c15760006146c58486615908565b90506020820160005b848110156146e65782810151828201526020016146ce565b848111156146f5576000858301525b5050509392505050565b606061208982602001516000846000015161466b565b60608182601f011015614784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b8282840110156147f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b8183018451101561485d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016109e0565b60608215801561487c57604051915060008252602082016040526148e4565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156148b557805183526020928301920161489d565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116149b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016109e0565b50604080518082019091528151815260209182019181019190915290565b606060008060006149e685613bfe565b919450925090506001816001811115614a0157614a0161531f565b14614a8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016109e0565b8451614a9a8385615908565b14614b27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016109e0565b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081614b3e5790505093506000835b8651811015614c2c57600080614bb16040518060400160405280858c60000151614b95919061545c565b8152602001858c60200151614baa9190615908565b9052613bfe565b509150915060405180604001604052808383614bcd9190615908565b8152602001848b60200151614be29190615908565b815250888581518110614bf757614bf76158d9565b6020908102919091010152614c0d600185615908565b9350614c198183615908565b614c239084615908565b92505050614b6b565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614cae57614cae614c38565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611db857600080fd5b600082601f830112614ce957600080fd5b813567ffffffffffffffff811115614d0357614d03614c38565b614d3460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614c67565b818152846020838601011115614d4957600080fd5b816020850160208301376000918101602001919091529392505050565b600060c08284031215614d7857600080fd5b60405160c0810167ffffffffffffffff8282108183111715614d9c57614d9c614c38565b816040528293508435835260208501359150614db782614cb6565b81602084015260408501359150614dcd82614cb6565b816040840152606085013560608401526080850135608084015260a0850135915080821115614dfb57600080fd5b50614e0885828601614cd8565b60a0830152505092915050565b60008060408385031215614e2857600080fd5b823567ffffffffffffffff811115614e3f57600080fd5b614e4b85828601614d66565b9250506020830135614e5c81614cb6565b809150509250929050565b600060208284031215614e7957600080fd5b81356126c181614cb6565b600080600080600085870360e0811215614e9d57600080fd5b863567ffffffffffffffff80821115614eb557600080fd5b614ec18a838b01614d66565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614efa57600080fd5b60408901955060c0890135925080831115614f1457600080fd5b828901925089601f840112614f2857600080fd5b8235915080821115614f3957600080fd5b508860208260051b8401011115614f4f57600080fd5b959894975092955050506020019190565b600060208284031215614f7257600080fd5b5035919050565b60005b83811015614f94578181015183820152602001614f7c565b83811115610b545750506000910152565b60008151808452614fbd816020860160208601614f79565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006126c16020830184614fa5565b6000806040838503121561501557600080fd5b823591506020830135614e5c81614cb6565b63ffffffff81168114611db857600080fd5b60006020828403121561504b57600080fd5b81356126c181615027565b60006020828403121561506857600080fd5b813567ffffffffffffffff81111561507f57600080fd5b61508b84828501614d66565b949350505050565b600080600080608085870312156150a957600080fd5b84356150b481614cb6565b935060208501356150c481614cb6565b925060408501356150d481614cb6565b915060608501356150e481615027565b939692955090935050565b67ffffffffffffffff81168114611db857600080fd5b60006020828403121561511757600080fd5b81356126c1816150ef565b6000806040838503121561513557600080fd5b50508035926020909101359150565b8015158114611db857600080fd5b600080600080600060a0868803121561516a57600080fd5b853561517581614cb6565b945060208601359350604086013561518c816150ef565b9250606086013561519c81615144565b9150608086013567ffffffffffffffff8111156151b857600080fd5b6151c488828901614cd8565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251615225816049850160208701614f79565b919091016049019695505050505050565b60006020828403121561524857600080fd5b81516126c181614cb6565b60008060006060848603121561526857600080fd5b835161527381615027565b6020850151909350615284816150ef565b604085015190925061529581614cb6565b809150509250925092565b6000602082840312156152b257600080fd5b5051919050565b6000608082840312156152cb57600080fd5b6040516080810181811067ffffffffffffffff821117156152ee576152ee614c38565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020828403121561536057600080fd5b8151600381106126c157600080fd5b600067ffffffffffffffff8084111561538a5761538a614c38565b8360051b602061539b818301614c67565b8681529185019181810190368411156153b357600080fd5b865b848110156153e7578035868111156153cd5760008081fd5b6153d936828b01614cd8565b8452509183019183016153b5565b50979650505050505050565b60006020828403121561540557600080fd5b81516126c181615144565b60006020828403121561542257600080fd5b81516126c1816150ef565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561546e5761546e61542d565b500390565b60006020828403121561548557600080fd5b81516126c181615027565b600067ffffffffffffffff808316818516818304811182151516156154b7576154b761542d565b02949350505050565b600067ffffffffffffffff8083168185168083038211156154e3576154e361542d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261552a5761552a6154ec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561557e5761557e61542d565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156155bd576155bd61542d565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156155f1576155f161542d565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156156385761563861542d565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156156735761567361542d565b6000871292508782058712848416161561568f5761568f61542d565b878505871281841616156156a5576156a561542d565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156156ed576156ed61542d565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156157215761572161542d565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561575f5761575f61542d565b500290565b600082615773576157736154ec565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526157c360c0830184614fa5565b98975050505050505050565b805160ff811681146157e057600080fd5b919050565b600060c082840312156157f757600080fd5b60405160c0810181811067ffffffffffffffff8211171561581a5761581a614c38565b604052825161582881615027565b8152615836602084016157cf565b6020820152615847604084016157cf565b6040820152606083015161585a81615027565b6060820152608083015161586d81615027565b608082015260a08301516fffffffffffffffffffffffffffffffff8116811461589557600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036158d2576158d261542d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561591b5761591b61542d565b500190565b600060ff831680615933576159336154ec565b8060ff84160691505092915050565b600060ff821660ff84168082101561595c5761595c61542d565b9003939250505056fea164736f6c634300080f000a","sourceMap":"1310:23607:135:-:0;;;5985:513;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6085:57;;;;6152:70;;;;6233:258;6306:1;;;;6233:10;:258::i;:::-;5985:513;;1310:23607;;6730:971;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;;3209:33;3236:4;3209:18;;;;;:33;;:::i;:::-;3208:34;:55;;;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;-1:-1:-1;;;3146:190:43;;466:2:357;3146:190:43;;;448:21:357;505:2;485:18;;;478:30;544:34;524:18;;;517:62;-1:-1:-1;;;595:18:357;;;588:44;649:19;;3146:190:43;;;;;;;;;3346:12;:16;;-1:-1:-1;;3346:16:43;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;-1:-1:-1;;3406:20:43;;;;;3372:65;6977:18:135::1;:40:::0;;-1:-1:-1;;;;;;6977:40:135;;::::1;-1:-1:-1::0;;;;;6977:40:135;;::::1;::::0;;;::::1;::::0;;;7027:12:::1;:28:::0;;;;::::1;::::0;;::::1;;::::0;;7065:16:::1;:36:::0;;-1:-1:-1;;;;;;7065:36:135::1;6977:40;7065:36:::0;;::::1;;;::::0;;7249:8:::1;::::0;::::1;7245:414;;7287:8;:38:::0;;1338:42:192::1;-1:-1:-1::0;;;;;;7287:38:135;;::::1;;::::0;;7485:26:::1;:52:::0;;-1:-1:-1;;;;;;7603:45:135;7485:52;7521:15:::1;-1:-1:-1::0;;;;;7485:52:135::1;;-1:-1:-1::0;;7603:45:135;;::::1;::::0;::::1;;::::0;;7245:414:::1;7669:25;:23;:25::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;-1:-1:-1;;3491:21:43;;;3531:14;;-1:-1:-1;831:36:357;;3531:14:43;;819:2:357;804:18;3531:14:43;;;;;;;3457:99;3090:472;6730:971:135;;;;:::o;1175:320:59:-;-1:-1:-1;;;;;1465:19:59;;:23;;;1175:320::o;8340:234:137:-;4888:13:43;;;;;;;4880:69;;;;-1:-1:-1;;;4880:69:43;;1080:2:357;4880:69:43;;;1062:21:357;1119:2;1099:18;;;1092:30;1158:34;1138:18;;;1131:62;-1:-1:-1;;;1209:18:357;;;1202:41;1260:19;;4880:69:43;878:407:357;4880:69:43;8415:6:137::1;:19:::0;-1:-1:-1;;;8415:19:137;::::1;-1:-1:-1::0;;;;;8415:19:137::1;;:24:::0;8411:157:::1;;8464:93;::::0;;::::1;::::0;::::1;::::0;;8494:6:::1;8464:93:::0;;;-1:-1:-1;8464:93:137::1;::::0;::::1;::::0;8541:12:::1;-1:-1:-1::0;;;;;8464:93:137::1;::::0;;;;;;;-1:-1:-1;;;8455:102:137::1;;:6;:102:::0;8411:157:::1;8340:234::o:0;14:245:357:-;93:6;101;154:2;142:9;133:7;129:23;125:32;122:52;;;170:1;167;160:12;122:52;-1:-1:-1;;193:16:357;;249:2;234:18;;;228:25;193:16;;228:25;;-1:-1:-1;14:245:357:o;878:407::-;1310:23607:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106101b05760003560e01c80637fc48504116100ec578063a35d99df1161008a578063bf653a5c11610064578063bf653a5c1461062b578063cff0ab961461065e578063e9e05c42146106ff578063f2b4e6171461071257600080fd5b8063a35d99df14610544578063a3860f4814610564578063bb2c727e1461058457600080fd5b80638e819e54116100c65780638e819e5414610494578063952b2797146104b45780639bf62d82146104e7578063a14238e71461051457600080fd5b80637fc48504146104545780638b4c40b0146101d55780638c3152e91461047457600080fd5b80634870496f1161015957806354fd4d501161013357806354fd4d50146103a95780635c975abb146103ff57806371c1566e146104145780637d6be8dc1461043457600080fd5b80634870496f1461030c5780634fd0434c1461032c578063513747ab1461036e57600080fd5b806343ca1c501161018a57806343ca1c5014610297578063452a9320146102b757806345884d32146102cc57600080fd5b806333d7e2bd146101dc57806335e80ab3146102335780633c9f397c1461026557600080fd5b366101d7576101d53334620186a060006040518060200160405280600081525061073f565b005b600080fd5b3480156101e857600080fd5b506037546102099073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023f57600080fd5b5060355461020990610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561027157600080fd5b50603b546102829063ffffffff1681565b60405163ffffffff909116815260200161022a565b3480156102a357600080fd5b506101d56102b2366004614e15565b6108fc565b3480156102c357600080fd5b50610209610b5a565b3480156102d857600080fd5b506102fc6102e7366004614e67565b603a6020526000908152604090205460ff1681565b604051901515815260200161022a565b34801561031857600080fd5b506101d5610327366004614e84565b610bf2565b34801561033857600080fd5b50603b5461035590640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161022a565b34801561037a57600080fd5b5061039b610389366004614f60565b6000908152603c602052604090205490565b60405190815260200161022a565b3480156103b557600080fd5b506103f26040518060400160405280600581526020017f332e382e3000000000000000000000000000000000000000000000000000000081525081565b60405161022a9190614fef565b34801561040b57600080fd5b506102fc6112d6565b34801561042057600080fd5b506101d561042f366004615002565b611369565b34801561044057600080fd5b506101d561044f366004614e67565b611bfa565b34801561046057600080fd5b506101d561046f366004615039565b611cb5565b34801561048057600080fd5b506101d561048f366004615056565b611d6f565b3480156104a057600080fd5b506101d56104af366004615093565b611dbb565b3480156104c057600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039b565b3480156104f357600080fd5b506032546102099073ffffffffffffffffffffffffffffffffffffffff1681565b34801561052057600080fd5b506102fc61052f366004614f60565b60336020526000908152604090205460ff1681565b34801561055057600080fd5b5061035561055f366004615105565b612070565b34801561057057600080fd5b5061020961057f366004615122565b61208f565b34801561059057600080fd5b506105f661059f366004615002565b603960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301520161022a565b34801561063757600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061039b565b34801561066a57600080fd5b506001546106c6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161022a565b6101d561070d366004615152565b61073f565b34801561071e57600080fd5b506038546102099073ffffffffffffffffffffffffffffffffffffffff1681565b8260005a9050838015610767575073ffffffffffffffffffffffffffffffffffffffff871615155b1561079e576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107a88351612070565b67ffffffffffffffff168567ffffffffffffffff1610156107f5576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c083511115610833576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33328114610854575033731111000000000000000000000000000000001111015b6000348888888860405160200161086f9594939291906151d1565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516108df9190614fef565b60405180910390a450506108f382826120f0565b50505050505050565b6109046112d6565b1561093b576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead146109e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084015b60405180910390fd5b60006109f4836123c7565b9050610a008183611369565b600081815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558401516080850151606086015160a0870151610aa293929190612414565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90610b0790841515815260200190565b60405180910390a280158015610b1d5750326001145b15610b54576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190615236565b905090565b610bfa6112d6565b15610c31576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610cf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016109e0565b6038546040517fbb8aa1fc00000000000000000000000000000000000000000000000000000000815260048101869052600091829173ffffffffffffffffffffffffffffffffffffffff9091169063bb8aa1fc90602401606060405180830381865afa158015610d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d889190615253565b925050915060008173ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfe91906152a0565b603b5490915063ffffffff848116911614610e9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b610eb2610ead368890038801886152b9565b612472565b8114610f40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016109e0565b6000610f4b896123c7565b905060018373ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe919061534e565b6002811115610fcf57610fcf61531f565b0361105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f742070726f76652061676160448201527f696e737420696e76616c696420646973707574652067616d657300000000000060648201526084016109e0565b60408051602081018390526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506111259101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529061111b898b61536f565b8b604001356124b1565b6111b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016109e0565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff808716825267ffffffffffffffff4281166020808501918252600088815260398252868120338252825286812095518654935190941674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931693851693909317919091179093558d840151928e01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4506000908152603c602090815260408220805460018101825590835291200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed91906153f3565b600082815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff85811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152818552603a90935292205490919060ff161561146e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652068617360448201527f206265656e20626c61636b6c697374656400000000000000000000000000000060648201526084016109e0565b816020015167ffffffffffffffff16600003611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2062792070726f6f66207375626d6974746560648201527f7220616464726573732079657400000000000000000000000000000000000000608482015260a4016109e0565b60006115b38273ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a69190615410565b67ffffffffffffffff1690565b90508067ffffffffffffffff16836020015167ffffffffffffffff1611611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e20646973707574652067616d65206372656160648201527f74696f6e2074696d657374616d70000000000000000000000000000000000000608482015260a4016109e0565b7f0000000000000000000000000000000000000000000000000000000000000000836020015167ffffffffffffffff16426116bd919061545c565b1161174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c20686173206e6f74206d61747572656420796574000000000000000000000060648201526084016109e0565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bb919061534e565b60028111156117cc576117cc61531f565b14611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f686173206e6f74206265656e2076616c6964617465640000000000000000000060648201526084016109e0565b603b5463ffffffff1663ffffffff166118e38373ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118da9190615473565b63ffffffff1690565b63ffffffff1614611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b603b5467ffffffffffffffff64010000000090910481169082161015611a44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652063726560448201527f61746564206265666f7265207265737065637465642067616d6520747970652060648201527f7761732075706461746564000000000000000000000000000000000000000000608482015260a4016109e0565b7f0000000000000000000000000000000000000000000000000000000000000000611ab38373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d6000803e3d6000fd5b611ac79067ffffffffffffffff164261545c565b11611b54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f696e206169722d6761700000000000000000000000000000000000000000000060648201526084016109e0565b60008581526033602052604090205460ff1615611bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016109e0565b5050505050565b611c02610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c66576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff166000908152603a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611cbd610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d21576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b805463ffffffff929092167fffffffffffffffffffffffffffffffffffffffff000000000000000000000000909216919091176401000000004267ffffffffffffffff1602179055565b565b611d776112d6565b15611dae576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611db881336108fc565b50565b600054610100900460ff1615808015611ddb5750600054600160ff909116105b80611df55750303b158015611df5575060005460ff166001145b611e81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109e0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611edf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8881169190911790925560378054909116868316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008684160217905560325416611fff576032805461dead7fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055603b80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166401000000004267ffffffffffffffff16027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000161763ffffffff84161790555b6120076124d5565b8015611bf357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600061207d826010615490565b612089906152086154c0565b92915050565b603c60205281600052604060002081815481106120ab57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090612126907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361545c565b905060006121326125e8565b90506000816020015160ff16826000015163ffffffff16612153919061551b565b9050821561228a5760015460009061218a908390700100000000000000000000000000000000900467ffffffffffffffff16615583565b90506000836040015160ff16836121a191906155f7565b6001546121c19084906fffffffffffffffffffffffffffffffff166155f7565b6121cb919061551b565b60015490915060009061221c906121f59084906fffffffffffffffffffffffffffffffff166156b3565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff166126a9565b9050600186111561224b576122486121f582876040015160ff1660018a612243919061545c565b6126c8565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b600180548691906010906122bd908490700100000000000000000000000000000000900467ffffffffffffffff166154c0565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561234a576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600090612376906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615727565b9050600061238848633b9aca0061271d565b6123929083615764565b905060005a6123a1908861545c565b9050808211156123bd576123bd6123b8828461545c565b612734565b5050505050505050565b80516020808301516040808501516060860151608087015160a088015193516000976123f7979096959101615778565b604051602081830303815290604052805190602001209050919050565b6000806000612424866000612762565b90508061245a576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600081600001518260200151836040015184606001516040516020016123f7949392919093845260208401929092526040830152606082015260800190565b6000806124bd86612780565b90506124cb818686866127b2565b9695505050505050565b600054610100900460ff1661256c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e0565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003611d6d5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612685573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed91906157e5565b60006126be6126b885856127e2565b836127f2565b90505b9392505050565b6000670de0b6b3a76400006127096126e0858361551b565b6126f290670de0b6b3a7640000615583565b61270485670de0b6b3a76400006155f7565b612801565b61271390866155f7565b6126be919061551b565b60008183101561272d57816126c1565b5090919050565b6000805a90505b825a612747908361545c565b101561275d57612756826158a1565b915061273b565b505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6060818051906020012060405160200161279c91815260200190565b6040516020818303038152906040529050919050565b60006127d9846127c3878686612832565b8051602091820120825192909101919091201490565b95945050505050565b60008183121561272d57816126c1565b600081831261272d57816126c1565b60006126c1670de0b6b3a764000083612819866132b0565b61282391906155f7565b61282d919061551b565b6134f4565b6060600084511161289f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b6579000000000000000000000060448201526064016109e0565b60006128aa84613733565b905060006128b78661381f565b90506000846040516020016128ce91815260200190565b60405160208183030381529060405290506000805b8451811015613227576000858281518110612900576129006158d9565b60200260200101519050845183111561299b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016109e0565b82600003612a5457805180516020918201206040516129e9926129c392910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612a4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016109e0565b612bab565b805151602011612b0a5780518051602091820120604051612a7e926129c392910190815260200190565b612a4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016109e0565b805184516020808701919091208251919092012014612bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016109e0565b612bb760106001615908565b81602001515103612d935784518303612d2b57612bf18160200151601081518110612be457612be46158d9565b6020026020010151613882565b96506000875111612c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016109e0565b60018651612c92919061545c565b8214612d20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016109e0565b5050505050506126c1565b6000858481518110612d3f57612d3f6158d9565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110612d6a57612d6a6158d9565b60200260200101519050612d7d816139e2565b9550612d8a600186615908565b94505050613214565b60028160200151510361318c576000612dab82613a07565b9050600081600081518110612dc257612dc26158d9565b016020015160f81c90506000612dd9600283615920565b612de4906002615942565b90506000612df5848360ff16613a2b565b90506000612e038a89613a2b565b90506000612e118383613a61565b905080835114612ea3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016109e0565b60ff851660021480612eb8575060ff85166003145b156130a75780825114612f4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016109e0565b612f678760200151600181518110612be457612be46158d9565b9c5060008d5111612ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016109e0565b60018c51613008919061545c565b8814613096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016109e0565b5050505050505050505050506126c1565b60ff851615806130ba575060ff85166001145b156130f9576130e687602001516001815181106130d9576130d96158d9565b60200260200101516139e2565b99506130f2818a615908565b9850613181565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016109e0565b505050505050613214565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016109e0565b508061321f816158a1565b9150506128e3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016109e0565b600080821361331b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b6000606061332884613b15565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361352557506000919050565b680755bf798b4a1bf1e58212613597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016109e0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff81111561375157613751614c38565b60405190808252806020026020018201604052801561379657816020015b604080518082019091526060808252602082015281526020019060019003908161376f5790505b50915060005b818110156138185760405180604001604052808583815181106137c1576137c16158d9565b602002602001015181526020016137f08684815181106137e3576137e36158d9565b6020026020010151613beb565b815250838281518110613805576138056158d9565b602090810291909101015260010161379c565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613877578060011b82018184015160001a8060041c8253600f811660018301535050600101613849565b509295945050505050565b6060600080600061389285613bfe565b9194509250905060008160018111156138ad576138ad61531f565b1461393a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016109e0565b6139448284615908565b8551146139d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016109e0565b6127d98560200151848461466b565b606060208260000151106139fe576139f982613882565b612089565b612089826146ff565b6060612089613a268360200151600081518110612be457612be46158d9565b61381f565b606082518210613a4a5750604080516020810190915260008152612089565b6126c18383848651613a5c919061545c565b614715565b6000808251845110613a74578251613a77565b83515b90505b8082108015613afe5750828281518110613a9657613a966158d9565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613ad557613ad56158d9565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613b0e57816001019150613a7a565b5092915050565b6000808211613b80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060612089613bf9836148ed565b6149d6565b600080600080846000015111613cbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016109e0565b6020840151805160001a607f8111613ce1576000600160009450945094505050614664565b60b78111613eef576000613cf660808361545c565b905080876000015111613db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016109e0565b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082141580613e2a57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613edc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016109e0565b5060019550935060009250614664915050565b60bf811161423d576000613f0460b78361545c565b905080876000015111613fbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016109e0565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361409d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016109e0565b600184015160088302610100031c60378111614161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016109e0565b61416b8184615908565b895111614220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016109e0565b61422b836001615908565b97509550600094506146649350505050565b60f7811161431e57600061425260c08361545c565b90508087600001511161430d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016109e0565b600195509350849250614664915050565b600061432b60f78361545c565b9050808760000151116143e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016109e0565b60018301517fff000000000000000000000000000000000000000000000000000000000000001660008190036144c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016109e0565b600184015160088302610100031c60378111614588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016109e0565b6145928184615908565b895111614647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016109e0565b614652836001615908565b97509550600194506146649350505050565b9193909250565b60608167ffffffffffffffff81111561468657614686614c38565b6040519080825280601f01601f1916602001820160405280156146b0576020820181803683370190505b50905081156126c15760006146c58486615908565b90506020820160005b848110156146e65782810151828201526020016146ce565b848111156146f5576000858301525b5050509392505050565b606061208982602001516000846000015161466b565b60608182601f011015614784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b8282840110156147f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b8183018451101561485d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016109e0565b60608215801561487c57604051915060008252602082016040526148e4565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156148b557805183526020928301920161489d565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116149b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016109e0565b50604080518082019091528151815260209182019181019190915290565b606060008060006149e685613bfe565b919450925090506001816001811115614a0157614a0161531f565b14614a8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016109e0565b8451614a9a8385615908565b14614b27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016109e0565b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081614b3e5790505093506000835b8651811015614c2c57600080614bb16040518060400160405280858c60000151614b95919061545c565b8152602001858c60200151614baa9190615908565b9052613bfe565b509150915060405180604001604052808383614bcd9190615908565b8152602001848b60200151614be29190615908565b815250888581518110614bf757614bf76158d9565b6020908102919091010152614c0d600185615908565b9350614c198183615908565b614c239084615908565b92505050614b6b565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614cae57614cae614c38565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611db857600080fd5b600082601f830112614ce957600080fd5b813567ffffffffffffffff811115614d0357614d03614c38565b614d3460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614c67565b818152846020838601011115614d4957600080fd5b816020850160208301376000918101602001919091529392505050565b600060c08284031215614d7857600080fd5b60405160c0810167ffffffffffffffff8282108183111715614d9c57614d9c614c38565b816040528293508435835260208501359150614db782614cb6565b81602084015260408501359150614dcd82614cb6565b816040840152606085013560608401526080850135608084015260a0850135915080821115614dfb57600080fd5b50614e0885828601614cd8565b60a0830152505092915050565b60008060408385031215614e2857600080fd5b823567ffffffffffffffff811115614e3f57600080fd5b614e4b85828601614d66565b9250506020830135614e5c81614cb6565b809150509250929050565b600060208284031215614e7957600080fd5b81356126c181614cb6565b600080600080600085870360e0811215614e9d57600080fd5b863567ffffffffffffffff80821115614eb557600080fd5b614ec18a838b01614d66565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614efa57600080fd5b60408901955060c0890135925080831115614f1457600080fd5b828901925089601f840112614f2857600080fd5b8235915080821115614f3957600080fd5b508860208260051b8401011115614f4f57600080fd5b959894975092955050506020019190565b600060208284031215614f7257600080fd5b5035919050565b60005b83811015614f94578181015183820152602001614f7c565b83811115610b545750506000910152565b60008151808452614fbd816020860160208601614f79565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006126c16020830184614fa5565b6000806040838503121561501557600080fd5b823591506020830135614e5c81614cb6565b63ffffffff81168114611db857600080fd5b60006020828403121561504b57600080fd5b81356126c181615027565b60006020828403121561506857600080fd5b813567ffffffffffffffff81111561507f57600080fd5b61508b84828501614d66565b949350505050565b600080600080608085870312156150a957600080fd5b84356150b481614cb6565b935060208501356150c481614cb6565b925060408501356150d481614cb6565b915060608501356150e481615027565b939692955090935050565b67ffffffffffffffff81168114611db857600080fd5b60006020828403121561511757600080fd5b81356126c1816150ef565b6000806040838503121561513557600080fd5b50508035926020909101359150565b8015158114611db857600080fd5b600080600080600060a0868803121561516a57600080fd5b853561517581614cb6565b945060208601359350604086013561518c816150ef565b9250606086013561519c81615144565b9150608086013567ffffffffffffffff8111156151b857600080fd5b6151c488828901614cd8565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251615225816049850160208701614f79565b919091016049019695505050505050565b60006020828403121561524857600080fd5b81516126c181614cb6565b60008060006060848603121561526857600080fd5b835161527381615027565b6020850151909350615284816150ef565b604085015190925061529581614cb6565b809150509250925092565b6000602082840312156152b257600080fd5b5051919050565b6000608082840312156152cb57600080fd5b6040516080810181811067ffffffffffffffff821117156152ee576152ee614c38565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020828403121561536057600080fd5b8151600381106126c157600080fd5b600067ffffffffffffffff8084111561538a5761538a614c38565b8360051b602061539b818301614c67565b8681529185019181810190368411156153b357600080fd5b865b848110156153e7578035868111156153cd5760008081fd5b6153d936828b01614cd8565b8452509183019183016153b5565b50979650505050505050565b60006020828403121561540557600080fd5b81516126c181615144565b60006020828403121561542257600080fd5b81516126c1816150ef565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561546e5761546e61542d565b500390565b60006020828403121561548557600080fd5b81516126c181615027565b600067ffffffffffffffff808316818516818304811182151516156154b7576154b761542d565b02949350505050565b600067ffffffffffffffff8083168185168083038211156154e3576154e361542d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261552a5761552a6154ec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561557e5761557e61542d565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156155bd576155bd61542d565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156155f1576155f161542d565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156156385761563861542d565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156156735761567361542d565b6000871292508782058712848416161561568f5761568f61542d565b878505871281841616156156a5576156a561542d565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156156ed576156ed61542d565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156157215761572161542d565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561575f5761575f61542d565b500290565b600082615773576157736154ec565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526157c360c0830184614fa5565b98975050505050505050565b805160ff811681146157e057600080fd5b919050565b600060c082840312156157f757600080fd5b60405160c0810181811067ffffffffffffffff8211171561581a5761581a614c38565b604052825161582881615027565b8152615836602084016157cf565b6020820152615847604084016157cf565b6040820152606083015161585a81615027565b6060820152608083015161586d81615027565b608082015260a08301516fffffffffffffffffffffffffffffffff8116811461589557600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036158d2576158d261542d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561591b5761591b61542d565b500190565b600060ff831680615933576159336154ec565b8060ff84160691505092915050565b600060ff821660ff84168082101561595c5761595c61542d565b9003939250505056fea164736f6c634300080f000a","sourceMap":"1310:23607:135:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9614:86;9633:10;9645:9;2352:7;9683:5;9690:9;;;;;;;;;;;;9614:18;:86::i;:::-;1310:23607;;;;;3443:32;;;;;;;;;;-1:-1:-1;3443:32:135;;;;;;;;;;;212:42:357;200:55;;;182:74;;170:2;155:18;3443:32:135;;;;;;;;3156:40;;;;;;;;;;-1:-1:-1;3156:40:135;;;;;;;;;;;4041:33;;;;;;;;;;-1:-1:-1;4041:33:135;;;;;;;;;;;730:10:357;718:23;;;700:42;;688:2;673:18;4041:33:135;524:224:357;14882:2403:135;;;;;;;;;;-1:-1:-1;14882:2403:135;;;;;:::i;:::-;;:::i;7954:101::-;;;;;;;;;;;;;:::i;3892:57::-;;;;;;;;;;-1:-1:-1;3892:57:135;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4257:14:357;;4250:22;4232:41;;4220:2;4205:18;3892:57:135;4092:187:357;10816:3564:135;;;;;;;;;;-1:-1:-1;10816:3564:135;;;;;:::i;:::-;;:::i;4162:40::-;;;;;;;;;;-1:-1:-1;4162:40:135;;;;;;;;;;;;;;5638:18:357;5626:31;;;5608:50;;5596:2;5581:18;4162:40:135;5464:200:357;24767:148:135;;;;;;;;;;-1:-1:-1;24767:148:135;;;;;:::i;:::-;24843:7;24869:32;;;:15;:32;;;;;:39;;24767:148;;;;6000:25:357;;;5988:2;5973:18;24767:148:135;5854:177:357;5882:40:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8115:94::-;;;;;;;;;;;;;:::i;21034:3510::-;;;;;;;;;;-1:-1:-1;21034:3510:135;;;;;:::i;:::-;;:::i;20049:185::-;;;;;;;;;;-1:-1:-1;20049:185:135;;;;;:::i;:::-;;:::i;20481:228::-;;;;;;;;;;-1:-1:-1;20481:228:135;;;;;:::i;:::-;;:::i;14493:178::-;;;;;;;;;;-1:-1:-1;14493:178:135;;;;;:::i;:::-;;:::i;6730:971::-;;;;;;;;;;-1:-1:-1;6730:971:135;;;;;:::i;:::-;;:::i;8453:132::-;;;;;;;;;;-1:-1:-1;8543:35:135;8453:132;;2615:23;;;;;;;;;;-1:-1:-1;2615:23:135;;;;;;;;2729:52;;;;;;;;;;-1:-1:-1;2729:52:135;;;;;:::i;:::-;;;;;;;;;;;;;;;;9078:120;;;;;;;;;;-1:-1:-1;9078:120:135;;;;;:::i;:::-;;:::i;4315:52::-;;;;;;;;;;-1:-1:-1;4315:52:135;;;;;:::i;:::-;;:::i;3712:81::-;;;;;;;;;;-1:-1:-1;3712:81:135;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9667:42:357;9655:55;;;9637:74;;9759:18;9747:31;;;9742:2;9727:18;;9720:59;9610:18;3712:81:135;9442:343:357;8268:119:135;;;;;;;;;;-1:-1:-1;8352:28:135;8268:119;;3093:28:137;;;;;;;;;;-1:-1:-1;3093:28:137;;;;;;;;;;;;;;;;;;;;;;;;;10018:34:357;10006:47;;;9988:66;;10073:18;10127:15;;;10122:2;10107:18;;10100:43;10179:15;;10159:18;;;10152:43;9976:2;9961:18;3093:28:137;9790:411:357;18015:1855:135;;;;;;:::i;:::-;;:::i;3566:44::-;;;;;;;;;;-1:-1:-1;3566:44:135;;;;;;;;18015:1855;18221:9;3511:18:137;3532:9;3511:30;;18375:11:135::1;:32;;;;-1:-1:-1::0;18390:17:135::1;::::0;::::1;::::0;::::1;18375:32;18371:56;;;18416:11;;;;;;;;;;;;;;18371:56;18591:37;18614:5;:12;18591:15;:37::i;:::-;18579:49;;:9;:49;;;18575:77;;;18637:15;;;;;;;;;;;;;;18575:77;19042:7;19027:5;:12;:22;19023:50;;;19058:15;;;;;;;;;;;;;;19023:50;19179:10;19217:9;19203:23:::0;::::1;19199:108;;-1:-1:-1::0;19285:10:135::1;741:42:237::0;1213:27;19199:108:135::1;19564:23;19607:9;19618:6;19626:9;19637:11;19650:5;19590:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19564:92;;2202:1;19830:3;19803:60;;19824:4;19803:60;;;19852:10;19803:60;;;;;;:::i;:::-;;;;;;;;18236:1634;;3642:29:137::0;3651:7;3660:10;3642:8;:29::i;:::-;3433:245;18015:1855:135;;;;;;:::o;14882:2403::-;5766:8;:6;:8::i;:::-;5762:33;;;5783:12;;;;;;;;;;;;;;5762:33;15328:8:::1;::::0;:39:::1;:8;1338:42:192;15328:39:135;15307:137;;;::::0;::::1;::::0;;12464:2:357;15307:137:135::1;::::0;::::1;12446:21:357::0;12503:2;12483:18;;;12476:30;12542:34;12522:18;;;12515:62;12613:33;12593:18;;;12586:61;12664:19;;15307:137:135::1;;;;;;;;;15495:22;15520:27;15543:3;15520:22;:27::i;:::-;15495:52;;15613:48;15629:14;15645:15;15613;:48::i;:::-;15741:36;::::0;;;:20:::1;:36;::::0;;;;;;;:43;;;::::1;15780:4;15741:43;::::0;;15889:10;;::::1;::::0;15878:8:::1;:21:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;16558:10;::::1;::::0;16570:12:::1;::::0;::::1;::::0;16584:9:::1;::::0;::::1;::::0;16595:8:::1;::::0;::::1;::::0;16534:70:::1;::::0;16558:10;16570:12;16584:9;16534:23:::1;:70::i;:::-;16672:8;:38:::0;;;::::1;1338:42:192;16672:38:135;::::0;;16869:44:::1;::::0;16519:85;;-1:-1:-1;16889:14:135;;16869:44:::1;::::0;::::1;::::0;16519:85;4257:14:357;4250:22;4232:41;;4220:2;4205:18;;4092:187;16869:44:135::1;;;;;;;;17178:7;17177:8;:53;;;;-1:-1:-1::0;17189:9:135::1;1016:1:192;17189:41:135;17177:53;17173:106;;;17253:15;;;;;;;;;;;;;;17173:106;15062:2223;;14882:2403:::0;;:::o;7954:101::-;7995:7;8021:16;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8014:34;;7954:101;:::o;10816:3564::-;5766:8;:6;:8::i;:::-;5762:33;;;5783:12;;;;;;;;;;;;;;5762:33;11351:4:::1;11329:27;;:3;:10;;;:27;;::::0;11321:103:::1;;;::::0;::::1;::::0;;13152:2:357;11321:103:135::1;::::0;::::1;13134:21:357::0;13191:2;13171:18;;;13164:30;13230:34;13210:18;;;13203:62;13301:33;13281:18;;;13274:61;13352:19;;11321:103:135::1;12950:427:357::0;11321:103:135::1;11562:18;::::0;:49:::1;::::0;;;;::::1;::::0;::::1;6000:25:357::0;;;11516:17:135::1;::::0;;;11562:18:::1;::::0;;::::1;::::0;:30:::1;::::0;5973:18:357;;11562:49:135::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11515:96;;;;;11621:16;11640:9;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11776:17;::::0;11621:40;;-1:-1:-1;11776:17:135::1;11758:12:::0;;::::1;11776:17:::0;::::1;11758:41;11750:87;;;::::0;::::1;::::0;;14432:2:357;11750:87:135::1;::::0;::::1;14414:21:357::0;14471:2;14451:18;;;14444:30;14510:34;14490:18;;;14483:62;14581:3;14561:18;;;14554:31;14602:19;;11750:87:135::1;14230:397:357::0;11750:87:135::1;11977:45;;;::::0;;::::1;::::0;::::1;12005:16:::0;11977:45:::1;:::i;:::-;:27;:45::i;:::-;11957:10:::0;:65:::1;11936:153;;;::::0;::::1;::::0;;15487:2:357;11936:153:135::1;::::0;::::1;15469:21:357::0;15526:2;15506:18;;;15499:30;15565:34;15545:18;;;15538:62;15636:11;15616:18;;;15609:39;15665:19;;11936:153:135::1;15285:405:357::0;11936:153:135::1;12200:22;12225:27;12248:3;12225:22;:27::i;:::-;12200:52:::0;-1:-1:-1;12446:26:135::1;12424:9;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;;;;;:::i;:::-;::::0;12403:153:::1;;;::::0;::::1;::::0;;16368:2:357;12403:153:135::1;::::0;::::1;16350:21:357::0;16407:2;16387:18;;;16380:30;16446:34;16426:18;;;16419:62;16517:28;16497:18;;;16490:56;16563:19;;12403:153:135::1;16166:422:357::0;12403:153:135::1;12836:147;::::0;;::::1;::::0;::::1;16767:25:357::0;;;12792:18:135::1;16808::357::0;;;16801:34;;;16740:18;;12836:147:135::1;::::0;;;;;::::1;::::0;;;;;;12813:180;;12836:147:::1;12813:180:::0;;::::1;::::0;13408:22;;::::1;6000:25:357::0;;;12813:180:135;-1:-1:-1;13346:240:135::1;::::0;5973:18:357;13408:22:135::1;::::0;;;;;::::1;::::0;;;13346:240;;::::1;::::0;;;::::1;::::0;;::::1;13408:22;13346:240:::0;::::1;::::0;13408:22;13346:240:::1;13489:16:::0;;13346:240:::1;:::i;:::-;13530:16;:41;;;13346:37;:240::i;:::-;13325:337;;;::::0;::::1;::::0;;18169:2:357;13325:337:135::1;::::0;::::1;18151:21:357::0;18208:2;18188:18;;;18181:30;18247:34;18227:18;;;18220:62;18318:20;18298:18;;;18291:48;18356:19;;13325:337:135::1;17967:414:357::0;13325:337:135::1;14020:85;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;14086:15;14020:85:::0;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;13960:33:135;;;:17:::1;:33:::0;;;;;13994:10:::1;13960:45:::0;;;;;;;:145;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;14210:10;;::::1;::::0;14198;;::::1;::::0;14165:56;;;;::::1;::::0;;;::::1;::::0;13978:14;;14165:56:::1;::::0;::::1;-1:-1:-1::0;14325:31:135::1;::::0;;;:15:::1;:31;::::0;;;;;;:48;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;::::1;14362:10;14325:48;::::0;;-1:-1:-1;;;;;;;;10816:3564:135:o;8115:94::-;8154:4;8177:16;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21034:3510::-;21131:40;21174:34;;;:17;:34;;;;;;;;:51;;;;;;;;;;;;21131:94;;;;;;;;;;;;;;;;;;;;;;;;;21373:38;;;:20;:38;;;;;;21131:94;;;21373:38;;21372:39;21364:101;;;;;;;18838:2:357;21364:101:135;;;18820:21:357;18877:2;18857:18;;;18850:30;18916:34;18896:18;;;18889:62;18987:19;18967:18;;;18960:47;19024:19;;21364:101:135;18636:413:357;21364:101:135;21728:16;:26;;;:31;;21758:1;21728:31;21707:155;;;;;;;19256:2:357;21707:155:135;;;19238:21:357;19295:2;19275:18;;;19268:30;19334:34;19314:18;;;19307:62;19405:34;19385:18;;;19378:62;19477:15;19456:19;;;19449:44;19510:19;;21707:155:135;19054:481:357;21707:155:135;21873:16;21892:34;:16;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;;5038:9:177;4918:145;21892:34:135;21873:53;;22240:9;22211:38;;:16;:26;;;:38;;;22190:163;;;;;;;20029:2:357;22190:163:135;;;20011:21:357;20068:2;20048:18;;;20041:30;20107:34;20087:18;;;20080:62;20178:34;20158:18;;;20151:62;20250:16;20229:19;;;20222:45;20284:19;;22190:163:135;19827:482:357;22190:163:135;22532:28;22503:16;:26;;;22485:44;;:15;:44;;;;:::i;:::-;:75;22464:175;;;;;;;20835:2:357;22464:175:135;;;20817:21:357;20874:2;20854:18;;;20847:30;20913:34;20893:18;;;20886:62;20984:23;20964:18;;;20957:51;21025:19;;22464:175:135;20633:417:357;22464:175:135;22972:24;22943:16;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;;;;;:::i;:::-;;22922:154;;;;;;;21257:2:357;22922:154:135;;;21239:21:357;21296:2;21276:18;;;21269:30;21335:34;21315:18;;;21308:62;21406:24;21386:18;;;21379:52;21448:19;;22922:154:135;21055:418:357;22922:154:135;23386:17;;;;23349:60;;:33;:16;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;;5038:9:177;4918:145;23349:33:135;:60;;;23341:106;;;;;;;14432:2:357;23341:106:135;;;14414:21:357;14471:2;14451:18;;;14444:30;14510:34;14490:18;;;14483:62;14581:3;14561:18;;;14554:31;14602:19;;23341:106:135;14230:397:357;23341:106:135;23722:26;;;;;;;;;23709:39;;;;;23688:161;;;;;;;21989:2:357;23688:161:135;;;21971:21:357;22028:2;22008:18;;;22001:30;22067:34;22047:18;;;22040:62;22138:34;22118:18;;;22111:62;22210:13;22189:19;;;22182:42;22241:19;;23688:161:135;21787:479:357;23688:161:135;24222:35;24184;:16;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:35;24166:53;;;;:15;:53;:::i;:::-;:91;24145:180;;;;;;;22473:2:357;24145:180:135;;;22455:21:357;22512:2;22492:18;;;22485:30;22551:34;22531:18;;;22524:62;22622:12;22602:18;;;22595:40;22652:19;;24145:180:135;22271:406:357;24145:180:135;24442:37;;;;:20;:37;;;;;;;;24441:38;24433:104;;;;;;;22884:2:357;24433:104:135;;;22866:21:357;22923:2;22903:18;;;22896:30;22962:34;22942:18;;;22935:62;23033:23;23013:18;;;23006:51;23074:19;;24433:104:135;22682:417:357;24433:104:135;21121:3423;;;21034:3510;;:::o;20049:185::-;20143:10;:8;:10::i;:::-;20129:24;;:10;:24;;;20125:51;;20162:14;;;;;;;;;;;;;;20125:51;20186:34;;;;;;:20;:34;;;;;:41;;;;20223:4;20186:41;;;20049:185::o;20481:228::-;20568:10;:8;:10::i;:::-;20554:24;;:10;:24;;;20550:51;;20587:14;;;;;;;;;;;;;;20550:51;20611:17;:29;;;;;;;20650:52;;;;;;;;;20686:15;20650:52;;;;;;20481:228::o;9921:77::-;:::o;14493:178::-;5766:8;:6;:8::i;:::-;5762:33;;;5783:12;;;;;;;;;;;;;;5762:33;14605:59:::1;14648:3;14653:10;14605:42;:59::i;:::-;14493:178:::0;:::o;6730:971::-;3100:19:43;3123:13;;;;;;3122:14;;3168:34;;;;-1:-1:-1;3186:12:43;;3201:1;3186:12;;;;:16;3168:34;3167:97;;;-1:-1:-1;3236:4:43;1465:19:59;:23;;;3208:55:43;;-1:-1:-1;3246:12:43;;;;;:17;3208:55;3146:190;;;;;;;23306:2:357;3146:190:43;;;23288:21:357;23345:2;23325:18;;;23318:30;23384:34;23364:18;;;23357:62;23455:16;23435:18;;;23428:44;23489:19;;3146:190:43;23104:410:357;3146:190:43;3346:12;:16;;;;3361:1;3346:16;;;3372:65;;;;3406:13;:20;;;;;;;;3372:65;6977:18:135::1;:40:::0;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;7027:12:::1;:28:::0;;;;::::1;::::0;;::::1;;::::0;;7065:16:::1;:36:::0;;;::::1;6977:40;7065:36:::0;;::::1;;;::::0;;7249:8:::1;::::0;::::1;7245:414;;7287:8;:38:::0;;1338:42:192::1;7287:38:135::0;;;::::1;;::::0;;7485:26:::1;:52:::0;;7603:45;;7485:52;7521:15:::1;7485:52;;;7603:45:::0;;;::::1;::::0;::::1;;::::0;;7245:414:::1;7669:25;:23;:25::i;:::-;3461:14:43::0;3457:99;;;3507:5;3491:21;;;;;;3531:14;;-1:-1:-1;23671:36:357;;3531:14:43;;23659:2:357;23644:18;3531:14:43;;;;;;;3090:472;6730:971:135;;;;:::o;9078:120::-;9143:6;9168:15;:10;9181:2;9168:15;:::i;:::-;:23;;9186:5;9168:23;:::i;:::-;9161:30;9078:120;-1:-1:-1;;9078:120:135:o;4315:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4315:52:135;;-1:-1:-1;4315:52:135:o;1175:320:59:-;1465:19;;;:23;;;1175:320::o;3911:3974:137:-;4078:6;:19;4043:17;;4063:34;;4078:19;;;;;4063:12;:34;:::i;:::-;4043:54;;4108:28;4139:17;:15;:17::i;:::-;4108:48;;4166:26;4265:6;:27;;;4257:36;;4222:6;:23;;;4214:32;;4207:87;;;;:::i;:::-;4166:128;-1:-1:-1;4309:13:137;;4305:2229;;4666:6;:20;4629:19;;4651:59;;4691:19;;4666:20;;;;;4651:59;:::i;:::-;4629:81;;4724:19;4855:6;:34;;;4847:43;;4818:19;:73;;;;:::i;:::-;4762:6;:18;4747:50;;4785:12;;4762:18;;4747:50;:::i;:::-;4746:146;;;;:::i;:::-;5111:6;:18;4724:168;;-1:-1:-1;5033:17:137;;5053:232;;5096:50;;4724:168;;5111:18;;5096:50;:::i;:::-;5185:6;:21;;;5177:30;;5247:6;:21;;;5239:30;;5053:16;:232::i;:::-;5033:252;;5562:1;5550:9;:13;5546:741;;;5835:437;5882:239;5939:10;6004:6;:34;;;5996:43;;6096:1;6084:9;:13;;;;:::i;:::-;5882:16;:239::i;5835:437::-;5822:450;;5546:741;6380:49;;6481:42;6443:24;6510:12;6481:42;;;6380:6;6481:42;-1:-1:-1;;4305:2229:137;6628:6;:31;;6652:7;;6628:6;:20;;:31;;6652:7;;6628:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6728:6;:23;;;6720:32;;6688:6;:20;;;;;;;;;;;;6680:29;;6673:80;6669:128;;;6776:10;;;;;;;;;;;;;;6669:128;6908:6;:18;6858:20;;6881:46;;6908:18;;6881:16;;;:46;:::i;:::-;6858:69;;7409:15;7442:31;7451:13;7466:6;7442:8;:31::i;:::-;7427:46;;:12;:46;:::i;:::-;7409:64;;7753:15;7785:9;7771:23;;:11;:23;:::i;:::-;7753:41;;7818:7;7808;:17;7804:75;;;7841:27;7850:17;7860:7;7850;:17;:::i;:::-;7841:8;:27::i;:::-;3975:3910;;;;;;3911:3974;;:::o;4456:211:196:-;4590:9;;4601:10;;;;;4613;;;;;4625:9;;;;4636:12;;;;4650:8;;;;4579:80;;4543:7;;4579:80;;4590:9;;4601:10;4650:8;4579:80;;:::i;:::-;;;;;;;;;;;;;4569:91;;;;;;4562:98;;4456:211;;;:::o;4419:2320:200:-;4589:4;4609:13;4632:15;4650:21;4660:7;4669:1;4650:9;:21::i;:::-;4632:39;;4782:10;4772:1146;;4894:10;4891:1;4884:21;5009:2;5005;4998:14;5747:56;5743:2;5736:68;5900:3;5896:2;5889:15;4772:1146;6666:4;6630;6589:9;6583:16;6549:2;6538:9;6534:18;6491:6;6449:7;6415:5;6389:309;6361:337;4419:2320;-1:-1:-1;;;;;;;4419:2320:200:o;4961:384:196:-;5060:7;5137:16;:24;;;5179:16;:26;;;5223:16;:41;;;5282:16;:32;;;5109:219;;;;;;;;;;27392:25:357;;;27448:2;27433:18;;27426:34;;;;27491:2;27476:18;;27469:34;27534:2;27519:18;;27512:34;27379:3;27364:19;;27161:391;1041:343:206;1234:11;1261:16;1280:19;1294:4;1280:13;:19::i;:::-;1261:38;;1318:59;1350:3;1355:6;1363;1371:5;1318:31;:59::i;:::-;1309:68;1041:343;-1:-1:-1;;;;;;1041:343:206:o;8340:234:137:-;4888:13:43;;;;;;;4880:69;;;;;;;27759:2:357;4880:69:43;;;27741:21:357;27798:2;27778:18;;;27771:30;27837:34;27817:18;;;27810:62;27908:13;27888:18;;;27881:41;27939:19;;4880:69:43;27557:407:357;4880:69:43;8415:6:137::1;:19:::0;;;::::1;;;;:24:::0;8411:157:::1;;8464:93;::::0;;::::1;::::0;::::1;::::0;;8494:6:::1;8464:93:::0;;;-1:-1:-1;8464:93:137::1;::::0;::::1;::::0;8541:12:::1;8464:93;;::::0;;;;;;;8455:102;::::1;;:6;:102:::0;8340:234::o;10247:152:135:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10363:12:135;;:29;;;;;;;-1:-1:-1;;10363:12:135;;;;;:27;;:29;;;;;-1:-1:-1;;10363:29:135;;;;;;:12;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;537:161:189:-;616:6;641:50;656:28;671:6;679:4;656:14;:28::i;:::-;686:4;641:14;:50::i;:::-;634:57;;537:161;;;;;;:::o;1040:228::-;1138:6;1257:4;1180:72;1213:19;1220:12;1257:4;1213:19;:::i;:::-;1205:28;;:4;:28;:::i;:::-;1235:16;:9;1247:4;1235:16;:::i;:::-;1180:24;:72::i;:::-;1164:89;;:12;:89;:::i;:::-;1163:98;;;;:::i;413:105:69:-;471:7;502:1;497;:6;;:14;;510:1;497:14;;;-1:-1:-1;506:1:69;;490:21;-1:-1:-1;413:105:69:o;407:192:190:-;461:9;484:18;505:9;484:30;;524:69;556:7;544:9;531:22;;:10;:22;:::i;:::-;:32;524:69;;;579:3;;;:::i;:::-;;;524:69;;;451:148;;407:192;:::o;3615:365:200:-;3696:4;3712:15;3931:2;3916:12;3909:5;3905:24;3901:33;3896:2;3887:7;3883:16;3879:56;3874:2;3867:5;3863:14;3860:76;3853:84;;3615:365;-1:-1:-1;;;;3615:365:200:o;2052:142:206:-;2116:18;2181:4;2171:15;;;;;;2154:33;;;;;;29671:19:357;;29715:2;29706:12;;29542:182;2154:33:206;;;;;;;;;;;;;2146:41;;2052:142;;;:::o;2253:281:205:-;2446:11;2482:45;2494:6;2502:24;2506:4;2512:6;2520:5;2502:3;:24::i;:::-;6693:17:191;;;;;;;6672;;;;;;;;;;:38;;6569:148;2482:45:205;2473:54;2253:281;-1:-1:-1;;;;;2253:281:205:o;311:102:71:-;367:6;397:1;392;:6;;:14;;405:1;392:14;;491:101;547:6;576:1;572;:5;:13;;584:1;572:13;;1208:273:106;1267:6;1391:36;491:4;1410:1;1399:8;1405:1;1399:5;:8::i;:::-;:12;;;;:::i;:::-;1398:28;;;;:::i;:::-;1391:6;:36::i;2830:6314:205:-;2923:19;2976:1;2962:4;:11;:15;2954:49;;;;;;;29931:2:357;2954:49:205;;;29913:21:357;29970:2;29950:18;;;29943:30;30009:23;29989:18;;;29982:51;30050:18;;2954:49:205;29729:345:357;2954:49:205;3014:23;3040:19;3052:6;3040:11;:19::i;:::-;3014:45;;3069:16;3088:21;3104:4;3088:15;:21::i;:::-;3069:40;;3119:26;3165:5;3148:23;;;;;;29671:19:357;;29715:2;29706:12;;29542:182;3148:23:205;;;;;;;;;;;;;3119:52;;3181:23;3295:9;3290:5790;3314:5;:12;3310:1;:16;3290:5790;;;3347:27;3377:5;3383:1;3377:8;;;;;;;;:::i;:::-;;;;;;;3347:38;;3516:3;:10;3497:15;:29;;3489:88;;;;;;;30470:2:357;3489:88:205;;;30452:21:357;30509:2;30489:18;;;30482:30;30548:34;30528:18;;;30521:62;30619:16;30599:18;;;30592:44;30653:19;;3489:88:205;30268:410:357;3489:88:205;3596:15;3615:1;3596:20;3592:837;;3768:19;;3758:30;;;;;;;3741:48;;3729:76;;3741:48;;3758:30;3741:48;29671:19:357;;;29715:2;29706:12;;29542:182;3741:48:205;;;;;;;;;;;;;3791:13;6693:17:191;;;;;;;6672;;;;;;;;;;:38;;6569:148;3729:76:205;3700:176;;;;;;;30885:2:357;3700:176:205;;;30867:21:357;30924:2;30904:18;;;30897:30;30963:31;30943:18;;;30936:59;31012:18;;3700:176:205;30683:353:357;3700:176:205;3592:837;;;3901:19;;:26;3931:2;-1:-1:-1;3897:532:205;;4097:19;;4087:30;;;;;;;4070:48;;4058:76;;4070:48;;4087:30;4070:48;29671:19:357;;;29715:2;29706:12;;29542:182;4058:76:205;4029:186;;;;;;;31243:2:357;4029:186:205;;;31225:21:357;31282:2;31262:18;;;31255:30;31321:34;31301:18;;;31294:62;31392:9;31372:18;;;31365:37;31419:19;;4029:186:205;31041:403:357;3897:532:205;4336:19;;6693:17:191;;;;;;;;;;6672;;;;;;;:38;4316:98:205;;;;;;;31651:2:357;4316:98:205;;;31633:21:357;31690:2;31670:18;;;31663:30;31729:34;31709:18;;;31702:62;31800:8;31780:18;;;31773:36;31826:19;;4316:98:205;31449:402:357;4316:98:205;936:14;803:2;949:1;936:14;:::i;:::-;4447:11;:19;;;:26;:48;4443:4627;;4538:3;:10;4519:15;:29;4515:1346;;5047:52;5067:11;:19;;;803:2;5067:31;;;;;;;;:::i;:::-;;;;;;;5047:19;:52::i;:::-;5038:61;;5145:1;5129:6;:13;:17;5121:89;;;;;;;32191:2:357;5121:89:205;;;32173:21:357;32230:2;32210:18;;;32203:30;32269:34;32249:18;;;32242:62;32340:29;32320:18;;;32313:57;32387:19;;5121:89:205;31989:423:357;5121:89:205;5322:1;5307:5;:12;:16;;;;:::i;:::-;5302:1;:21;5294:92;;;;;;;32619:2:357;5294:92:205;;;32601:21:357;32658:2;32638:18;;;32631:30;32697:34;32677:18;;;32670:62;32768:28;32748:18;;;32741:56;32814:19;;5294:92:205;32417:422:357;5294:92:205;5409:13;;;;;;;;4515:1346;5609:15;5633:3;5637:15;5633:20;;;;;;;;:::i;:::-;;;;;;;;;5627:27;;5609:45;;5676:33;5712:11;:19;;;5732:9;5712:30;;;;;;;;;;:::i;:::-;;;;;;;5676:66;;5780:20;5791:8;5780:10;:20::i;:::-;5764:36;-1:-1:-1;5822:20:205;5841:1;5822:20;;:::i;:::-;;;5447:414;;4443:4627;;;1105:1;5885:11;:19;;;:26;:59;5881:3189;;5964:17;5984:25;5997:11;5984:12;:25::i;:::-;5964:45;;6027:12;6048:4;6053:1;6048:7;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;6074:12:205;6094:10;6103:1;6048:7;6094:10;:::i;:::-;6089:16;;:1;:16;:::i;:::-;6074:31;;6123:26;6152:25;6164:4;6170:6;6152:25;;:11;:25::i;:::-;6123:54;;6195:25;6223:33;6235:3;6240:15;6223:11;:33::i;:::-;6195:61;;6274:26;6303:51;6326:13;6341:12;6303:22;:51::i;:::-;6274:80;;6661:18;6637:13;:20;:42;6608:171;;;;;;;33408:2:357;6608:171:205;;;33390:21:357;33447:2;33427:18;;;33420:30;33486:34;33466:18;;;33459:62;33557:28;33537:18;;;33530:56;33603:19;;6608:171:205;33206:422:357;6608:171:205;6802:26;;;1447:1;6802:26;;:55;;-1:-1:-1;6832:25:205;;;1553:1;6832:25;6802:55;6798:2169;;;7498:18;7475:12;:19;:41;7442:185;;;;;;;33835:2:357;7442:185:205;;;33817:21:357;33874:2;33854:18;;;33847:30;33913:34;33893:18;;;33886:62;33984:31;33964:18;;;33957:59;34033:19;;7442:185:205;33633:425:357;7442:185:205;7985:43;8005:11;:19;;;8025:1;8005:22;;;;;;;;:::i;7985:43::-;7976:52;;8074:1;8058:6;:13;:17;8050:87;;;;;;;34265:2:357;8050:87:205;;;34247:21:357;34304:2;34284:18;;;34277:30;34343:34;34323:18;;;34316:62;34414:27;34394:18;;;34387:55;34459:19;;8050:87:205;34063:421:357;8050:87:205;8249:1;8234:5;:12;:16;;;;:::i;:::-;8229:1;:21;8221:90;;;;;;;34691:2:357;8221:90:205;;;34673:21:357;34730:2;34710:18;;;34703:30;34769:34;34749:18;;;34742:62;34840:26;34820:18;;;34813:54;34884:19;;8221:90:205;34489:420:357;8221:90:205;8334:13;;;;;;;;;;;;;;6798:2169;8376:31;;;;;:65;;-1:-1:-1;8411:30:205;;;1339:1;8411:30;8376:65;8372:595;;;8748:34;8759:11;:19;;;8779:1;8759:22;;;;;;;;:::i;:::-;;;;;;;8748:10;:34::i;:::-;8732:50;-1:-1:-1;8804:37:205;8823:18;8804:37;;:::i;:::-;;;8372:595;;;8888:60;;;;;35116:2:357;8888:60:205;;;35098:21:357;35155:2;35135:18;;;35128:30;35194:34;35174:18;;;35167:62;35265:20;35245:18;;;35238:48;35303:19;;8888:60:205;34914:414:357;8372:595:205;5946:3035;;;;;;5881:3189;;;9005:50;;;;;35535:2:357;9005:50:205;;;35517:21:357;35574:2;35554:18;;;35547:30;35613:34;35593:18;;;35586:62;35684:10;35664:18;;;35657:38;35712:19;;9005:50:205;35333:404:357;5881:3189:205;-1:-1:-1;3328:3:205;;;;:::i;:::-;;;;3290:5790;;;-1:-1:-1;9090:47:205;;;;;35944:2:357;9090:47:205;;;35926:21:357;35983:2;35963:18;;;35956:30;36022:34;36002:18;;;35995:62;36093:7;36073:18;;;36066:35;36118:19;;9090:47:205;35742:401:357;4596:2947:106;4644:8;4700:1;4696;:5;4688:27;;;;;;;36350:2:357;4688:27:106;;;36332:21:357;36389:1;36369:18;;;36362:29;36427:11;36407:18;;;36400:39;36456:18;;4688:27:106;36148:332:357;4688:27:106;5107:8;5145:2;5125:16;5138:1;5125:4;:16::i;:::-;5118:29;5175:3;:7;;;5161:22;;;;5208:17;;;6001:31;5997:35;;6052:5;;5459:2;6051:13;;;6068:32;6050:50;6120:5;;6119:13;;6136:33;6118:51;6189:5;;6188:13;;6205:33;6187:51;6258:5;;6257:13;;6274:33;6256:51;6327:5;;6326:13;;6343:32;6325:50;6395:5;;6394:13;;6411:30;6393:48;5398:31;5394:35;;5449:5;;5448:13;;5465:32;5447:50;5517:5;;5516:13;;5533:32;5515:50;5585:5;;5584:13;;5583:50;;5653:5;;5652:13;;5651:50;;5721:5;;5720:13;;;5719:50;;5787:5;;;:46;;6735:10;7125:43;7120:48;7232:71;:75;;;;7227:80;;;;7380:72;7375:77;7523:3;7517:9;;;-1:-1:-1;;4596:2947:106:o;1487:3103::-;1536:8;1718:21;1713:1;:26;1709:40;;-1:-1:-1;1748:1:106;;1487:3103;-1:-1:-1;1487:3103:106:o;1709:40::-;1948:21;1943:1;:26;1939:54;;1971:22;;;;;36687:2:357;1971:22:106;;;36669:21:357;36726:2;36706:18;;;36699:30;36765:14;36745:18;;;36738:42;36797:18;;1971:22:106;36485:336:357;1939:54:106;2266:5;2260:2;2255:7;;;2254:17;;-1:-1:-1;2535:8:106;2601:2;2559:29;2548:7;;;2547:41;2591:5;2547:49;2546:57;;2629:29;2625:33;;2621:37;;;3300:35;;;3355:5;;2935:2;3354:13;;;3371:32;3353:50;3423:5;;3422:13;;3421:51;;3492:5;;3491:13;;3508:34;3490:52;3562:5;;3561:13;;3560:53;;3633:5;;3632:13;;3649:35;3631:53;2941:32;2874:31;2870:35;;2925:5;;2924:13;;2923:50;;;2998:5;;;:40;;3058:5;3057:13;;;3074:35;3056:53;3127:5;;;3136:40;3127:50;4002:10;4502:49;4489:62;4564:3;:7;;;;4488:84;;;;;;-1:-1:-1;;1487:3103:106:o;9434:390:205:-;9553:13;;9500:24;;9553:13;9585:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;9585:22:205;;;;;;;;;;;;;;;;9576:31;;9622:9;9617:201;9641:6;9637:1;:10;9617:201;;;9676:72;;;;;;;;9696:6;9703:1;9696:9;;;;;;;;:::i;:::-;;;;;;;9676:72;;;;9716:29;9735:6;9742:1;9735:9;;;;;;;;:::i;:::-;;;;;;;9716:18;:29::i;:::-;9676:72;;;9664:6;9671:1;9664:9;;;;;;;;:::i;:::-;;;;;;;;;;:84;9790:3;;9617:201;;;;9526:298;9434:390;;;:::o;4332:1978:191:-;4395:12;4419:21;4550:4;4544:11;4532:23;;4663:6;4657:13;4836:11;4830:4;4826:22;5195:4;5180:13;5176:24;5169:4;5165:9;5161:40;5151:8;5147:55;5141:4;5134:69;5293:13;5283:8;5276:31;;5434:4;5426:6;5422:17;5571:4;5561:8;5557:19;5662:4;5647:622;5675:11;5672:1;5669:18;5647:622;;;5854:1;5848:4;5844:12;5830;5826:31;5996:1;5984:10;5980:18;5974:25;5968:4;5963:37;6119:1;6113:4;6109:12;6101:6;6093:29;6249:4;6246:1;6242:12;6235:4;6227:6;6223:17;6215:40;-1:-1:-1;;5702:4:191;5695:12;5647:622;;;-1:-1:-1;6295:8:191;;4332:1978;-1:-1:-1;;;;;4332:1978:191:o;3993:464:203:-;4055:17;4085:18;4105;4125:20;4149:18;4163:3;4149:13;:18::i;:::-;4084:83;;-1:-1:-1;4084:83:203;-1:-1:-1;4084:83:203;-1:-1:-1;4198:21:203;4186:8;:33;;;;;;;;:::i;:::-;;4178:103;;;;;;;37028:2:357;4178:103:203;;;37010:21:357;37067:2;37047:18;;;37040:30;37106:34;37086:18;;;37079:62;37177:27;37157:18;;;37150:55;37222:19;;4178:103:203;36826:421:357;4178:103:203;4314:23;4327:10;4314;:23;:::i;:::-;4300:10;;:37;4292:102;;;;;;;37454:2:357;4292:102:203;;;37436:21:357;37493:2;37473:18;;;37466:30;37532:34;37512:18;;;37505:62;37603:22;37583:18;;;37576:50;37643:19;;4292:102:203;37252:416:357;4292:102:203;4412:38;4418:3;:7;;;4427:10;4439;4412:5;:38::i;10121:193:205:-;10195:16;10244:2;10229:5;:12;;;:17;:78;;10281:26;10301:5;10281:19;:26::i;:::-;10229:78;;;10249:29;10272:5;10249:22;:29::i;10495:172::-;10562:21;10606:54;10622:37;10642:5;:13;;;10656:1;10642:16;;;;;;;;:::i;10622:37::-;10606:15;:54::i;3805:237:191:-;3880:12;3918:6;:13;3908:6;:23;3904:70;;-1:-1:-1;3954:9:191;;;;;;;;;-1:-1:-1;3954:9:191;;3947:16;;3904:70;3990:45;3996:6;4004;4028;4012;:13;:22;;;;:::i;:::-;3990:5;:45::i;10892:321:205:-;10980:15;11007:11;11034:2;:9;11022:2;:9;:21;11021:47;;11059:2;:9;11021:47;;;11047:2;:9;11021:47;11007:61;;11078:129;11095:3;11085:7;:13;:43;;;;;11117:2;11120:7;11117:11;;;;;;;;:::i;:::-;;;;;;;;;11102:26;;;:2;11105:7;11102:11;;;;;;;;:::i;:::-;;;;;;;:26;11085:43;11078:129;;;11173:9;;;;;11078:129;;;10997:216;10892:321;;;;:::o;15328:575:106:-;15376:9;15409:1;15405;:5;15397:27;;;;;;;36350:2:357;15397:27:106;;;36332:21:357;36389:1;36369:18;;;36362:29;36427:11;36407:18;;;36400:39;36456:18;;15397:27:106;36148:332:357;15397:27:106;-1:-1:-1;15821:1:106;15473:34;-1:-1:-1;;15467:1:106;15463:49;15566:9;;;15546:18;15543:33;15540:1;15536:41;15530:48;15624:9;;;15612:10;15609:25;15606:1;15602:33;15596:40;15678:9;;;15670:6;15667:21;15664:1;15660:29;15654:36;15730:9;;;15724:4;15721:19;15718:1;15714:27;;;15708:34;;;15781:9;;;15776:3;15773:18;15770:1;15766:26;15760:33;15832:9;;;15824:18;;;15817:26;;15811:33;15876:9;;;-1:-1:-1;15862:25:106;;15328:575::o;3732:130:203:-;3791:21;3831:24;3840:14;3850:3;3840:9;:14::i;:::-;3831:8;:24::i;5246:4079::-;5335:15;5352;5369:17;5705:1;5692:3;:10;;;:14;5684:101;;;;;;;37875:2:357;5684:101:203;;;37857:21:357;37914:2;37894:18;;;37887:30;37953:34;37933:18;;;37926:62;38024:34;38004:18;;;37997:62;38096:12;38075:19;;;38068:41;38126:19;;5684:101:203;37673:478:357;5684:101:203;5816:7;;;;5898:10;;5796:17;5890:19;5943:4;5933:14;;5929:3390;;5999:1;6002;6005:21;5991:36;;;;;;;;;;5929:3390;6058:4;6048:6;:14;6044:3275;;6164:14;6181:13;6190:4;6181:6;:13;:::i;:::-;6164:30;;6247:6;6234:3;:10;;;:19;6209:140;;;;;;;38358:2:357;6209:140:203;;;38340:21:357;38397:2;38377:18;;;38370:30;38436:34;38416:18;;;38409:62;38507:34;38487:18;;;38480:62;38579:16;38558:19;;;38551:45;38613:19;;6209:140:203;38156:482:357;6209:140:203;6471:1;6462:11;;;6456:18;6476:14;6452:39;;6544:11;;;;:41;;-1:-1:-1;6559:26:203;;;;;;6544:41;6519:177;;;;;;;38845:2:357;6519:177:203;;;38827:21:357;38884:2;38864:18;;;38857:30;38923:34;38903:18;;;38896:62;38994:34;38974:18;;;38967:62;39066:15;39045:19;;;39038:44;39099:19;;6519:177:203;38643:481:357;6519:177:203;-1:-1:-1;6719:1:203;;-1:-1:-1;6722:6:203;-1:-1:-1;6730:21:203;;-1:-1:-1;6711:41:203;;-1:-1:-1;;6711:41:203;6044:3275;6783:4;6773:6;:14;6769:2550;;6831:19;6853:13;6862:4;6853:6;:13;:::i;:::-;6831:35;;6919:11;6906:3;:10;;;:24;6881:164;;;;;;;39331:2:357;6881:164:203;;;39313:21:357;39370:2;39350:18;;;39343:30;39409:34;39389:18;;;39382:62;39480:34;39460:18;;;39453:62;39552:19;39531;;;39524:48;39589:19;;6881:164:203;39129:485:357;6881:164:203;7167:1;7158:11;;7152:18;7172:14;7148:39;7060:25;7240:26;;;7215:143;;;;;;;39821:2:357;7215:143:203;;;39803:21:357;39860:2;39840:18;;;39833:30;39899:34;39879:18;;;39872:62;39970:34;39950:18;;;39943:62;40042:12;40021:19;;;40014:41;40072:19;;7215:143:203;39619:478:357;7215:143:203;7488:1;7479:11;;7473:18;7455:1;7451:19;;7446:3;7442:29;7438:54;7537:2;7528:11;;7520:96;;;;;;;40304:2:357;7520:96:203;;;40286:21:357;40343:2;40323:18;;;40316:30;40382:34;40362:18;;;40355:62;40453:34;40433:18;;;40426:62;40525:10;40504:19;;;40497:39;40553:19;;7520:96:203;40102:476:357;7520:96:203;7669:20;7683:6;7669:11;:20;:::i;:::-;7656:10;;:33;7631:168;;;;;;;40785:2:357;7631:168:203;;;40767:21:357;40824:2;40804:18;;;40797:30;40863:34;40843:18;;;40836:62;40934:34;40914:18;;;40907:62;41006:14;40985:19;;;40978:43;41038:19;;7631:168:203;40583:480:357;7631:168:203;7822:15;7826:11;7822:1;:15;:::i;:::-;7814:55;-1:-1:-1;7839:6:203;-1:-1:-1;7847:21:203;;-1:-1:-1;7814:55:203;;-1:-1:-1;;;;7814:55:203;6769:2550;7900:4;7890:6;:14;7886:1433;;8003:15;8021:13;8030:4;8021:6;:13;:::i;:::-;8003:31;;8070:7;8057:3;:10;;;:20;8049:107;;;;;;;41270:2:357;8049:107:203;;;41252:21:357;41309:2;41289:18;;;41282:30;41348:34;41328:18;;;41321:62;41419:34;41399:18;;;41392:62;41491:12;41470:19;;;41463:41;41521:19;;8049:107:203;41068:478:357;8049:107:203;8179:1;;-1:-1:-1;8182:7:203;-1:-1:-1;8179:1:203;;-1:-1:-1;8171:42:203;;-1:-1:-1;;8171:42:203;7886:1433;8270:20;8293:13;8302:4;8293:6;:13;:::i;:::-;8270:36;;8359:12;8346:3;:10;;;:25;8321:161;;;;;;;41753:2:357;8321:161:203;;;41735:21:357;41792:2;41772:18;;;41765:30;41831:34;41811:18;;;41804:62;41902:34;41882:18;;;41875:62;41974:15;41953:19;;;41946:44;42007:19;;8321:161:203;41551:481:357;8321:161:203;8604:1;8595:11;;8589:18;8609:14;8585:39;8497:25;8677:26;;;8652:141;;;;;;;42239:2:357;8652:141:203;;;42221:21:357;42278:2;42258:18;;;42251:30;42317:34;42297:18;;;42290:62;42388:34;42368:18;;;42361:62;42460:10;42439:19;;;42432:39;42488:19;;8652:141:203;42037:476:357;8652:141:203;8926:1;8917:11;;8911:18;8892:1;8888:20;;8883:3;8879:30;8875:55;8976:2;8966:12;;8958:95;;;;;;;42720:2:357;8958:95:203;;;42702:21:357;42759:2;42739:18;;;42732:30;42798:34;42778:18;;;42771:62;42869:34;42849:18;;;42842:62;42941:8;42920:19;;;42913:37;42967:19;;8958:95:203;42518:474:357;8958:95:203;9106:22;9121:7;9106:12;:22;:::i;:::-;9093:10;;:35;9068:168;;;;;;;43199:2:357;9068:168:203;;;43181:21:357;43238:2;43218:18;;;43211:30;43277:34;43257:18;;;43250:62;43348:34;43328:18;;;43321:62;43420:12;43399:19;;;43392:41;43450:19;;9068:168:203;42997:478:357;9068:168:203;9259:16;9263:12;9259:1;:16;:::i;:::-;9251:57;-1:-1:-1;9277:7:203;-1:-1:-1;9286:21:203;;-1:-1:-1;9251:57:203;;-1:-1:-1;;;;9251:57:203;5246:4079;;;;;;:::o;9585:737::-;9676:17;9722:7;9712:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9712:18:203;-1:-1:-1;9705:25:203;-1:-1:-1;9740:54:203;;9772:11;9740:54;10010:11;10024:36;10053:7;10045:4;10024:36;:::i;:::-;10010:50;;10115:2;10109:4;10105:13;10140:1;10154:87;10168:7;10165:1;10162:14;10154:87;;;10226:11;;;10220:18;10206:12;;;10199:40;10191:2;10184:10;10154:87;;;10264:7;10261:1;10258:14;10255:51;;;10302:1;10292:7;10286:4;10282:18;10275:29;10255:51;;;10079:237;9585:737;;;;;:::o;4847:137::-;4912:17;4948:29;4954:3;:7;;;4963:1;4966:3;:10;;;4948:5;:29::i;660:2816:191:-;752:12;824:7;808;818:2;808:12;:23;;800:50;;;;;;;43682:2:357;800:50:191;;;43664:21:357;43721:2;43701:18;;;43694:30;43760:16;43740:18;;;43733:44;43794:18;;800:50:191;43480:338:357;800:50:191;892:6;881:7;872:6;:16;:26;;864:53;;;;;;;43682:2:357;864:53:191;;;43664:21:357;43721:2;43701:18;;;43694:30;43760:16;43740:18;;;43733:44;43794:18;;864:53:191;43480:338:357;864:53:191;965:7;956:6;:16;939:6;:13;:33;;931:63;;;;;;;44025:2:357;931:63:191;;;44007:21:357;44064:2;44044:18;;;44037:30;44103:19;44083:18;;;44076:47;44140:18;;931:63:191;43823:341:357;931:63:191;1015:22;1078:15;;1106:1931;;;;3178:4;3172:11;3159:24;;3365:1;3354:9;3347:20;3413:4;3402:9;3398:20;3392:4;3385:34;1071:2362;;1106:1931;1288:4;1282:11;1269:24;;1947:2;1938:7;1934:16;2329:9;2322:17;2316:4;2312:28;2300:9;2289;2285:25;2281:60;2377:7;2373:2;2369:16;2629:6;2615:9;2608:17;2602:4;2598:28;2586:9;2578:6;2574:22;2570:57;2566:70;2403:389;2662:3;2658:2;2655:11;2403:389;;;2780:9;;2769:21;;2703:4;2695:13;;;;2735;2403:389;;;-1:-1:-1;;2810:26:191;;;3018:2;3001:11;3014:7;2997:25;2991:4;2984:39;-1:-1:-1;1071:2362:191;-1:-1:-1;3460:9:191;660:2816;-1:-1:-1;;;;660:2816:191:o;1298:390:203:-;-1:-1:-1;;;;;;;;;;;;;;;;;1453:1:203;1440:3;:10;:14;1432:101;;;;;;;37875:2:357;1432:101:203;;;37857:21:357;37914:2;37894:18;;;37887:30;37953:34;37933:18;;;37926:62;38024:34;38004:18;;;37997:62;38096:12;38075:19;;;38068:41;38126:19;;1432:101:203;37673:478:357;1432:101:203;-1:-1:-1;1640:41:203;;;;;;;;;1658:10;;1640:41;;1610:2;1601:12;;;1640:41;;;;;;;;1298:390::o;1840:1740::-;1901:21;1935:18;1955;1975:20;1999:18;2013:3;1999:13;:18::i;:::-;1934:83;;-1:-1:-1;1934:83:203;-1:-1:-1;1934:83:203;-1:-1:-1;2048:21:203;2036:8;:33;;;;;;;;:::i;:::-;;2028:102;;;;;;;44371:2:357;2028:102:203;;;44353:21:357;44410:2;44390:18;;;44383:30;44449:34;44429:18;;;44422:62;44520:26;44500:18;;;44493:54;44564:19;;2028:102:203;44169:420:357;2028:102:203;2176:10;;2149:23;2162:10;2149;:23;:::i;:::-;:37;2141:100;;;;;;;44796:2:357;2141:100:203;;;44778:21:357;44835:2;44815:18;;;44808:30;44874:34;44854:18;;;44847:62;44945:20;44925:18;;;44918:48;44983:19;;2141:100:203;44594:414:357;2141:100:203;2651:30;;;1123:2;2651:30;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;2651:30:203;;;;;;;;;;;;;;-1:-1:-1;2644:37:203;-1:-1:-1;2692:17:203;2740:10;2760:681;2776:10;;2767:19;;2760:681;;;2803:18;2823;2846:150;2877:105;;;;;;;;2908:6;2895:3;:10;;;:19;;;;:::i;:::-;2877:105;;;;2972:6;2961:3;:7;;;2940:38;;;;:::i;:::-;2877:105;;2846:13;:150::i;:::-;2802:194;;;;;3201:153;;;;;;;;3248:10;3235;:23;;;;:::i;:::-;3201:153;;;;3332:6;3321:3;:7;;;3300:38;;;;:::i;:::-;3201:153;;;3183:4;3188:9;3183:15;;;;;;;;:::i;:::-;;;;;;;;;;:171;3369:14;3382:1;3369:14;;:::i;:::-;;-1:-1:-1;3407:23:203;3420:10;3407;:23;:::i;:::-;3397:33;;;;:::i;:::-;;;2788:653;;2760:681;;;-1:-1:-1;3541:23:203;;-1:-1:-1;3548:4:203;;1840:1740;-1:-1:-1;;;1840:1740:203:o;753:184:357:-;805:77;802:1;795:88;902:4;899:1;892:15;926:4;923:1;916:15;942:334;1013:2;1007:9;1069:2;1059:13;;1074:66;1055:86;1043:99;;1172:18;1157:34;;1193:22;;;1154:62;1151:88;;;1219:18;;:::i;:::-;1255:2;1248:22;942:334;;-1:-1:-1;942:334:357:o;1281:154::-;1367:42;1360:5;1356:54;1349:5;1346:65;1336:93;;1425:1;1422;1415:12;1440:589;1482:5;1535:3;1528:4;1520:6;1516:17;1512:27;1502:55;;1553:1;1550;1543:12;1502:55;1589:6;1576:20;1615:18;1611:2;1608:26;1605:52;;;1637:18;;:::i;:::-;1681:114;1789:4;1720:66;1713:4;1709:2;1705:13;1701:86;1697:97;1681:114;:::i;:::-;1820:2;1811:7;1804:19;1866:3;1859:4;1854:2;1846:6;1842:15;1838:26;1835:35;1832:55;;;1883:1;1880;1873:12;1832:55;1948:2;1941:4;1933:6;1929:17;1922:4;1913:7;1909:18;1896:55;1996:1;1971:16;;;1989:4;1967:27;1960:38;;;;1975:7;1440:589;-1:-1:-1;;;1440:589:357:o;2034:1032::-;2102:5;2150:4;2138:9;2133:3;2129:19;2125:30;2122:50;;;2168:1;2165;2158:12;2122:50;2201:2;2195:9;2243:4;2235:6;2231:17;2267:18;2335:6;2323:10;2320:22;2315:2;2303:10;2300:18;2297:46;2294:72;;;2346:18;;:::i;:::-;2386:10;2382:2;2375:22;2415:6;2406:15;;2458:9;2445:23;2437:6;2430:39;2521:2;2510:9;2506:18;2493:32;2478:47;;2534:33;2559:7;2534:33;:::i;:::-;2600:7;2595:2;2587:6;2583:15;2576:32;2660:2;2649:9;2645:18;2632:32;2617:47;;2673:33;2698:7;2673:33;:::i;:::-;2739:7;2734:2;2726:6;2722:15;2715:32;2808:2;2797:9;2793:18;2780:32;2775:2;2767:6;2763:15;2756:57;2875:3;2864:9;2860:19;2847:33;2841:3;2833:6;2829:16;2822:59;2932:3;2921:9;2917:19;2904:33;2890:47;;2960:2;2952:6;2949:14;2946:34;;;2976:1;2973;2966:12;2946:34;;3014:45;3055:3;3046:6;3035:9;3031:22;3014:45;:::i;:::-;3008:3;3000:6;2996:16;2989:71;;;2034:1032;;;;:::o;3071:510::-;3180:6;3188;3241:2;3229:9;3220:7;3216:23;3212:32;3209:52;;;3257:1;3254;3247:12;3209:52;3297:9;3284:23;3330:18;3322:6;3319:30;3316:50;;;3362:1;3359;3352:12;3316:50;3385:72;3449:7;3440:6;3429:9;3425:22;3385:72;:::i;:::-;3375:82;;;3507:2;3496:9;3492:18;3479:32;3520:31;3545:5;3520:31;:::i;:::-;3570:5;3560:15;;;3071:510;;;;;:::o;3817:270::-;3899:6;3952:2;3940:9;3931:7;3927:23;3923:32;3920:52;;;3968:1;3965;3958:12;3920:52;4007:9;3994:23;4026:31;4051:5;4026:31;:::i;4284:1175::-;4486:6;4494;4502;4510;4518;4562:9;4553:7;4549:23;4592:3;4588:2;4584:12;4581:32;;;4609:1;4606;4599:12;4581:32;4649:9;4636:23;4678:18;4719:2;4711:6;4708:14;4705:34;;;4735:1;4732;4725:12;4705:34;4758:72;4822:7;4813:6;4802:9;4798:22;4758:72;:::i;:::-;4748:82;;4877:2;4866:9;4862:18;4849:32;4839:42;;4974:3;4905:66;4901:2;4897:75;4893:85;4890:105;;;4991:1;4988;4981:12;4890:105;5029:2;5018:9;5014:18;5004:28;;5085:3;5074:9;5070:19;5057:33;5041:49;;5115:2;5105:8;5102:16;5099:36;;;5131:1;5128;5121:12;5099:36;5169:8;5158:9;5154:24;5144:34;;5216:7;5209:4;5205:2;5201:13;5197:27;5187:55;;5238:1;5235;5228:12;5187:55;5278:2;5265:16;5251:30;;5304:2;5296:6;5293:14;5290:34;;;5320:1;5317;5310:12;5290:34;;5373:7;5368:2;5358:6;5355:1;5351:14;5347:2;5343:23;5339:32;5336:45;5333:65;;;5394:1;5391;5384:12;5333:65;4284:1175;;;;-1:-1:-1;4284:1175:357;;-1:-1:-1;;;5425:2:357;5417:11;;5447:6;4284:1175::o;5669:180::-;5728:6;5781:2;5769:9;5760:7;5756:23;5752:32;5749:52;;;5797:1;5794;5787:12;5749:52;-1:-1:-1;5820:23:357;;5669:180;-1:-1:-1;5669:180:357:o;6036:258::-;6108:1;6118:113;6132:6;6129:1;6126:13;6118:113;;;6208:11;;;6202:18;6189:11;;;6182:39;6154:2;6147:10;6118:113;;;6249:6;6246:1;6243:13;6240:48;;;-1:-1:-1;;6284:1:357;6266:16;;6259:27;6036:258::o;6299:317::-;6341:3;6379:5;6373:12;6406:6;6401:3;6394:19;6422:63;6478:6;6471:4;6466:3;6462:14;6455:4;6448:5;6444:16;6422:63;:::i;:::-;6530:2;6518:15;6535:66;6514:88;6505:98;;;;6605:4;6501:109;;6299:317;-1:-1:-1;;6299:317:357:o;6621:220::-;6770:2;6759:9;6752:21;6733:4;6790:45;6831:2;6820:9;6816:18;6808:6;6790:45;:::i;6846:315::-;6914:6;6922;6975:2;6963:9;6954:7;6950:23;6946:32;6943:52;;;6991:1;6988;6981:12;6943:52;7027:9;7014:23;7004:33;;7087:2;7076:9;7072:18;7059:32;7100:31;7125:5;7100:31;:::i;7166:144::-;7274:10;7267:5;7263:22;7256:5;7253:33;7243:61;;7300:1;7297;7290:12;7315:300;7405:6;7458:2;7446:9;7437:7;7433:23;7429:32;7426:52;;;7474:1;7471;7464:12;7426:52;7513:9;7500:23;7532:53;7579:5;7532:53;:::i;7620:375::-;7720:6;7773:2;7761:9;7752:7;7748:23;7744:32;7741:52;;;7789:1;7786;7779:12;7741:52;7829:9;7816:23;7862:18;7854:6;7851:30;7848:50;;;7894:1;7891;7884:12;7848:50;7917:72;7981:7;7972:6;7961:9;7957:22;7917:72;:::i;:::-;7907:82;7620:375;-1:-1:-1;;;;7620:375:357:o;8000:800::-;8193:6;8201;8209;8217;8270:3;8258:9;8249:7;8245:23;8241:33;8238:53;;;8287:1;8284;8277:12;8238:53;8326:9;8313:23;8345:31;8370:5;8345:31;:::i;:::-;8395:5;-1:-1:-1;8452:2:357;8437:18;;8424:32;8465:33;8424:32;8465:33;:::i;:::-;8517:7;-1:-1:-1;8576:2:357;8561:18;;8548:32;8589:33;8548:32;8589:33;:::i;:::-;8641:7;-1:-1:-1;8700:2:357;8685:18;;8672:32;8713:55;8672:32;8713:55;:::i;:::-;8000:800;;;;-1:-1:-1;8000:800:357;;-1:-1:-1;;8000:800:357:o;8805:129::-;8890:18;8883:5;8879:30;8872:5;8869:41;8859:69;;8924:1;8921;8914:12;8939:245;8997:6;9050:2;9038:9;9029:7;9025:23;9021:32;9018:52;;;9066:1;9063;9056:12;9018:52;9105:9;9092:23;9124:30;9148:5;9124:30;:::i;9189:248::-;9257:6;9265;9318:2;9306:9;9297:7;9293:23;9289:32;9286:52;;;9334:1;9331;9324:12;9286:52;-1:-1:-1;;9357:23:357;;;9427:2;9412:18;;;9399:32;;-1:-1:-1;9189:248:357:o;10206:118::-;10292:5;10285:13;10278:21;10271:5;10268:32;10258:60;;10314:1;10311;10304:12;10329:799;10429:6;10437;10445;10453;10461;10514:3;10502:9;10493:7;10489:23;10485:33;10482:53;;;10531:1;10528;10521:12;10482:53;10570:9;10557:23;10589:31;10614:5;10589:31;:::i;:::-;10639:5;-1:-1:-1;10691:2:357;10676:18;;10663:32;;-1:-1:-1;10747:2:357;10732:18;;10719:32;10760;10719;10760;:::i;:::-;10811:7;-1:-1:-1;10870:2:357;10855:18;;10842:32;10883:30;10842:32;10883:30;:::i;:::-;10932:7;-1:-1:-1;10990:3:357;10975:19;;10962:33;11018:18;11007:30;;11004:50;;;11050:1;11047;11040:12;11004:50;11073:49;11114:7;11105:6;11094:9;11090:22;11073:49;:::i;:::-;11063:59;;;10329:799;;;;;;;;:::o;11392:642::-;11655:6;11650:3;11643:19;11692:6;11687:2;11682:3;11678:12;11671:28;11751:66;11742:6;11737:3;11733:16;11729:89;11724:2;11719:3;11715:12;11708:111;11872:6;11865:14;11858:22;11853:3;11849:32;11844:2;11839:3;11835:12;11828:54;11625:3;11911:6;11905:13;11927:60;11980:6;11975:2;11970:3;11966:12;11961:2;11953:6;11949:15;11927:60;:::i;:::-;12007:16;;;;12025:2;12003:25;;11392:642;-1:-1:-1;;;;;;11392:642:357:o;12694:251::-;12764:6;12817:2;12805:9;12796:7;12792:23;12788:32;12785:52;;;12833:1;12830;12823:12;12785:52;12865:9;12859:16;12884:31;12909:5;12884:31;:::i;13382:626::-;13556:6;13564;13572;13625:2;13613:9;13604:7;13600:23;13596:32;13593:52;;;13641:1;13638;13631:12;13593:52;13673:9;13667:16;13692:53;13739:5;13692:53;:::i;:::-;13814:2;13799:18;;13793:25;13764:5;;-1:-1:-1;13827:32:357;13793:25;13827:32;:::i;:::-;13930:2;13915:18;;13909:25;13878:7;;-1:-1:-1;13943:33:357;13909:25;13943:33;:::i;:::-;13995:7;13985:17;;;13382:626;;;;;:::o;14013:212::-;14111:6;14164:2;14152:9;14143:7;14139:23;14135:32;14132:52;;;14180:1;14177;14170:12;14132:52;-1:-1:-1;14203:16:357;;14013:212;-1:-1:-1;14013:212:357:o;14632:648::-;14726:6;14779:3;14767:9;14758:7;14754:23;14750:33;14747:53;;;14796:1;14793;14786:12;14747:53;14829:2;14823:9;14871:3;14863:6;14859:16;14941:6;14929:10;14926:22;14905:18;14893:10;14890:34;14887:62;14884:88;;;14952:18;;:::i;:::-;14992:10;14988:2;14981:22;;15040:9;15027:23;15019:6;15012:39;15112:2;15101:9;15097:18;15084:32;15079:2;15071:6;15067:15;15060:57;15178:2;15167:9;15163:18;15150:32;15145:2;15137:6;15133:15;15126:57;15244:2;15233:9;15229:18;15216:32;15211:2;15203:6;15199:15;15192:57;15268:6;15258:16;;;14632:648;;;;:::o;15695:184::-;15747:77;15744:1;15737:88;15844:4;15841:1;15834:15;15868:4;15865:1;15858:15;15884:277;15971:6;16024:2;16012:9;16003:7;15999:23;15995:32;15992:52;;;16040:1;16037;16030:12;15992:52;16072:9;16066:16;16111:1;16104:5;16101:12;16091:40;;16127:1;16124;16117:12;17028:934;17164:9;17198:18;17239:2;17231:6;17228:14;17225:40;;;17245:18;;:::i;:::-;17291:6;17288:1;17284:14;17317:4;17341:28;17365:2;17361;17357:11;17341:28;:::i;:::-;17403:19;;;17473:14;;;;17438:12;;;;17510:14;17499:26;;17496:46;;;17538:1;17535;17528:12;17496:46;17562:5;17576:353;17592:6;17587:3;17584:15;17576:353;;;17678:3;17665:17;17714:2;17701:11;17698:19;17695:109;;;17758:1;17787:2;17783;17776:14;17695:109;17829:57;17871:14;17857:11;17850:5;17846:23;17829:57;:::i;:::-;17817:70;;-1:-1:-1;17907:12:357;;;;17609;;17576:353;;;-1:-1:-1;17951:5:357;17028:934;-1:-1:-1;;;;;;;17028:934:357:o;18386:245::-;18453:6;18506:2;18494:9;18485:7;18481:23;18477:32;18474:52;;;18522:1;18519;18512:12;18474:52;18554:9;18548:16;18573:28;18595:5;18573:28;:::i;19540:282::-;19642:6;19695:2;19683:9;19674:7;19670:23;19666:32;19663:52;;;19711:1;19708;19701:12;19663:52;19743:9;19737:16;19762:30;19786:5;19762:30;:::i;20314:184::-;20366:77;20363:1;20356:88;20463:4;20460:1;20453:15;20487:4;20484:1;20477:15;20503:125;20543:4;20571:1;20568;20565:8;20562:34;;;20576:18;;:::i;:::-;-1:-1:-1;20613:9:357;;20503:125::o;21478:304::-;21579:6;21632:2;21620:9;21611:7;21607:23;21603:32;21600:52;;;21648:1;21645;21638:12;21600:52;21680:9;21674:16;21699:53;21746:5;21699:53;:::i;23718:270::-;23757:7;23789:18;23834:2;23831:1;23827:10;23864:2;23861:1;23857:10;23920:3;23916:2;23912:12;23907:3;23904:21;23897:3;23890:11;23883:19;23879:47;23876:73;;;23929:18;;:::i;:::-;23969:13;;23718:270;-1:-1:-1;;;;23718:270:357:o;23993:236::-;24032:3;24060:18;24105:2;24102:1;24098:10;24135:2;24132:1;24128:10;24166:3;24162:2;24158:12;24153:3;24150:21;24147:47;;;24174:18;;:::i;:::-;24210:13;;23993:236;-1:-1:-1;;;;23993:236:357:o;24234:184::-;24286:77;24283:1;24276:88;24383:4;24380:1;24373:15;24407:4;24404:1;24397:15;24423:308;24462:1;24488;24478:35;;24493:18;;:::i;:::-;24610:66;24607:1;24604:73;24535:66;24532:1;24529:73;24525:153;24522:179;;;24681:18;;:::i;:::-;-1:-1:-1;24715:10:357;;24423:308::o;24736:369::-;24775:4;24811:1;24808;24804:9;24920:1;24852:66;24848:74;24845:1;24841:82;24836:2;24829:10;24825:99;24822:125;;;24927:18;;:::i;:::-;25046:1;24978:66;24974:74;24971:1;24967:82;24963:2;24959:91;24956:117;;;25053:18;;:::i;:::-;-1:-1:-1;;25090:9:357;;24736:369::o;25110:655::-;25149:7;25181:66;25273:1;25270;25266:9;25301:1;25298;25294:9;25346:1;25342:2;25338:10;25335:1;25332:17;25327:2;25323;25319:11;25315:35;25312:61;;;25353:18;;:::i;:::-;25392:66;25484:1;25481;25477:9;25531:1;25527:2;25522:11;25519:1;25515:19;25510:2;25506;25502:11;25498:37;25495:63;;;25538:18;;:::i;:::-;25584:1;25581;25577:9;25567:19;;25631:1;25627:2;25622:11;25619:1;25615:19;25610:2;25606;25602:11;25598:37;25595:63;;;25638:18;;:::i;:::-;25703:1;25699:2;25694:11;25691:1;25687:19;25682:2;25678;25674:11;25670:37;25667:63;;;25710:18;;:::i;:::-;-1:-1:-1;;;25750:9:357;;;;;25110:655;-1:-1:-1;;;25110:655:357:o;25770:367::-;25809:3;25844:1;25841;25837:9;25953:1;25885:66;25881:74;25878:1;25874:82;25869:2;25862:10;25858:99;25855:125;;;25960:18;;:::i;:::-;26079:1;26011:66;26007:74;26004:1;26000:82;25996:2;25992:91;25989:117;;;26086:18;;:::i;:::-;-1:-1:-1;;26122:9:357;;25770:367::o;26142:228::-;26182:7;26308:1;26240:66;26236:74;26233:1;26230:81;26225:1;26218:9;26211:17;26207:105;26204:131;;;26315:18;;:::i;:::-;-1:-1:-1;26355:9:357;;26142:228::o;26375:120::-;26415:1;26441;26431:35;;26446:18;;:::i;:::-;-1:-1:-1;26480:9:357;;26375:120::o;26500:656::-;26787:6;26776:9;26769:25;26750:4;26813:42;26903:2;26895:6;26891:15;26886:2;26875:9;26871:18;26864:43;26955:2;26947:6;26943:15;26938:2;26927:9;26923:18;26916:43;;26995:6;26990:2;26979:9;26975:18;26968:34;27039:6;27033:3;27022:9;27018:19;27011:35;27083:3;27077;27066:9;27062:19;27055:32;27104:46;27145:3;27134:9;27130:19;27122:6;27104:46;:::i;:::-;27096:54;26500:656;-1:-1:-1;;;;;;;;26500:656:357:o;27969:160::-;28046:13;;28099:4;28088:16;;28078:27;;28068:55;;28119:1;28116;28109:12;28068:55;27969:160;;;:::o;28134:1203::-;28237:6;28290:3;28278:9;28269:7;28265:23;28261:33;28258:53;;;28307:1;28304;28297:12;28258:53;28340:2;28334:9;28382:3;28374:6;28370:16;28452:6;28440:10;28437:22;28416:18;28404:10;28401:34;28398:62;28395:88;;;28463:18;;:::i;:::-;28499:2;28492:22;28536:16;;28561:53;28536:16;28561:53;:::i;:::-;28623:21;;28677:47;28720:2;28705:18;;28677:47;:::i;:::-;28672:2;28664:6;28660:15;28653:72;28758:47;28801:2;28790:9;28786:18;28758:47;:::i;:::-;28753:2;28745:6;28741:15;28734:72;28851:2;28840:9;28836:18;28830:25;28864:55;28911:7;28864:55;:::i;:::-;28947:2;28935:15;;28928:32;29005:3;28990:19;;28984:26;29019:55;28984:26;29019:55;:::i;:::-;29102:3;29090:16;;29083:33;29161:3;29146:19;;29140:26;29210:34;29197:48;;29185:61;;29175:89;;29260:1;29257;29250:12;29175:89;29292:3;29280:16;;29273:33;29284:6;28134:1203;-1:-1:-1;;;28134:1203:357:o;29342:195::-;29381:3;29412:66;29405:5;29402:77;29399:103;;29482:18;;:::i;:::-;-1:-1:-1;29529:1:357;29518:13;;29342:195::o;30079:184::-;30131:77;30128:1;30121:88;30228:4;30225:1;30218:15;30252:4;30249:1;30242:15;31856:128;31896:3;31927:1;31923:6;31920:1;31917:13;31914:39;;;31933:18;;:::i;:::-;-1:-1:-1;31969:9:357;;31856:128::o;32844:157::-;32874:1;32908:4;32905:1;32901:12;32932:3;32922:37;;32939:18;;:::i;:::-;32991:3;32984:4;32981:1;32977:12;32973:22;32968:27;;;32844:157;;;;:::o;33006:195::-;33044:4;33081;33078:1;33074:12;33113:4;33110:1;33106:12;33138:3;33133;33130:12;33127:38;;;33145:18;;:::i;:::-;33182:13;;;33006:195;-1:-1:-1;;;33006:195:357:o","linkReferences":{},"immutableReferences":{"87151":[{"start":1594,"length":32},{"start":5764,"length":32}],"87154":[{"start":1219,"length":32},{"start":6726,"length":32}]}},"methodIdentifiers":{"blacklistDisputeGame(address)":"7d6be8dc","checkWithdrawal(bytes32,address)":"71c1566e","depositTransaction(address,uint256,uint64,bool,bytes)":"e9e05c42","disputeGameBlacklist(address)":"45884d32","disputeGameFactory()":"f2b4e617","disputeGameFinalityDelaySeconds()":"952b2797","donateETH()":"8b4c40b0","finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))":"8c3152e9","finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes),address)":"43ca1c50","finalizedWithdrawals(bytes32)":"a14238e7","guardian()":"452a9320","initialize(address,address,address,uint32)":"8e819e54","l2Sender()":"9bf62d82","minimumGasLimit(uint64)":"a35d99df","numProofSubmitters(bytes32)":"513747ab","params()":"cff0ab96","paused()":"5c975abb","proofMaturityDelaySeconds()":"bf653a5c","proofSubmitters(bytes32,uint256)":"a3860f48","proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])":"4870496f","provenWithdrawals(bytes32,address)":"bb2c727e","respectedGameType()":"3c9f397c","respectedGameTypeUpdatedAt()":"4fd0434c","setRespectedGameType(uint32)":"7fc48504","superchainConfig()":"35e80ab3","systemConfig()":"33d7e2bd","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_proofMaturityDelaySeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_disputeGameFinalityDelaySeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadTarget\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CallPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasEstimation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LargeCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfGas\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SmallGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"opaqueData\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"WithdrawalProven\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"contract IDisputeGame\",\"name\":\"_disputeGame\",\"type\":\"address\"}],\"name\":\"blacklistDisputeGame\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_withdrawalHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_proofSubmitter\",\"type\":\"address\"}],\"name\":\"checkWithdrawal\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IDisputeGame\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"disputeGameBlacklist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disputeGameFactory\",\"outputs\":[{\"internalType\":\"contract DisputeGameFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disputeGameFinalityDelaySeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"donateETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Types.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Types.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_proofSubmitter\",\"type\":\"address\"}],\"name\":\"finalizeWithdrawalTransactionExternalProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"guardian\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract DisputeGameFactory\",\"name\":\"_disputeGameFactory\",\"type\":\"address\"},{\"internalType\":\"contract SystemConfig\",\"name\":\"_systemConfig\",\"type\":\"address\"},{\"internalType\":\"contract SuperchainConfig\",\"name\":\"_superchainConfig\",\"type\":\"address\"},{\"internalType\":\"GameType\",\"name\":\"_initialRespectedGameType\",\"type\":\"uint32\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_byteCount\",\"type\":\"uint64\"}],\"name\":\"minimumGasLimit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_withdrawalHash\",\"type\":\"bytes32\"}],\"name\":\"numProofSubmitters\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofMaturityDelaySeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"proofSubmitters\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Types.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_disputeGameIndex\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"struct Types.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\"}],\"name\":\"proveWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"provenWithdrawals\",\"outputs\":[{\"internalType\":\"contract IDisputeGame\",\"name\":\"disputeGameProxy\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"respectedGameType\",\"outputs\":[{\"internalType\":\"GameType\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"respectedGameTypeUpdatedAt\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"GameType\",\"name\":\"_gameType\",\"type\":\"uint32\"}],\"name\":\"setRespectedGameType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superchainConfig\",\"outputs\":[{\"internalType\":\"contract SuperchainConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"systemConfig\",\"outputs\":[{\"internalType\":\"contract SystemConfig\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"custom:proxied\":\"@title OptimismPortal2\",\"events\":{\"TransactionDeposited(address,address,uint256,bytes)\":{\"params\":{\"from\":\"Address that triggered the deposit transaction.\",\"opaqueData\":\"ABI encoded deposit data to be parsed off-chain.\",\"to\":\"Address that the deposit transaction is directed to.\",\"version\":\"Version of this deposit transaction event.\"}},\"WithdrawalFinalized(bytes32,bool)\":{\"params\":{\"success\":\"Whether the withdrawal transaction was successful.\",\"withdrawalHash\":\"Hash of the withdrawal transaction.\"}},\"WithdrawalProven(bytes32,address,address)\":{\"params\":{\"from\":\"Address that triggered the withdrawal transaction.\",\"to\":\"Address that the withdrawal transaction is directed to.\",\"withdrawalHash\":\"Hash of the withdrawal transaction.\"}}},\"kind\":\"dev\",\"methods\":{\"blacklistDisputeGame(address)\":{\"params\":{\"_disputeGame\":\"Dispute game to blacklist.\"}},\"checkWithdrawal(bytes32,address)\":{\"params\":{\"_proofSubmitter\":\"The submitter of the proof for the withdrawal hash\",\"_withdrawalHash\":\"Hash of the withdrawal to check.\"}},\"depositTransaction(address,uint256,uint64,bool,bytes)\":{\"params\":{\"_data\":\"Data to trigger the recipient with.\",\"_gasLimit\":\"Amount of L2 gas to purchase by burning gas on L1.\",\"_isCreation\":\"Whether or not the transaction is a contract creation.\",\"_to\":\"Target address on L2.\",\"_value\":\"ETH value to send to the recipient.\"}},\"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))\":{\"params\":{\"_tx\":\"Withdrawal transaction to finalize.\"}},\"finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes),address)\":{\"params\":{\"_proofSubmitter\":\"Address of the proof submitter.\",\"_tx\":\"Withdrawal transaction to finalize.\"}},\"guardian()\":{\"custom:legacy\":\"\",\"returns\":{\"_0\":\"Address of the guardian.\"}},\"initialize(address,address,address,uint32)\":{\"params\":{\"_disputeGameFactory\":\"Contract of the DisputeGameFactory.\",\"_superchainConfig\":\"Contract of the SuperchainConfig.\",\"_systemConfig\":\"Contract of the SystemConfig.\"}},\"minimumGasLimit(uint64)\":{\"params\":{\"_byteCount\":\"Number of bytes in the calldata.\"},\"returns\":{\"_0\":\"The minimum gas limit for a deposit.\"}},\"numProofSubmitters(bytes32)\":{\"params\":{\"_withdrawalHash\":\"Hash of the withdrawal.\"},\"returns\":{\"_0\":\"The number of proof submitters for the withdrawal hash.\"}},\"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])\":{\"params\":{\"_disputeGameIndex\":\"Index of the dispute game to prove the withdrawal against.\",\"_outputRootProof\":\"Inclusion proof of the L2ToL1MessagePasser contract's storage root.\",\"_tx\":\"Withdrawal transaction to finalize.\",\"_withdrawalProof\":\"Inclusion proof of the withdrawal in L2ToL1MessagePasser contract.\"}},\"setRespectedGameType(uint32)\":{\"params\":{\"_gameType\":\"The game type to consult for output proposals.\"}}},\"stateVariables\":{\"disputeGameFactory\":{\"custom:network-specific\":\"\"},\"spacer_52_0_32\":{\"custom:legacy\":\"@custom:spacer provenWithdrawals\"},\"spacer_53_0_1\":{\"custom:legacy\":\"@custom:spacer paused\"},\"spacer_54_0_20\":{\"custom:legacy\":\"@custom:spacer l2Oracle\"},\"systemConfig\":{\"custom:network-specific\":\"\"},\"version\":{\"custom:semver\":\"3.8.0\"}},\"version\":1},\"userdoc\":{\"errors\":{\"BadTarget()\":[{\"notice\":\"Error for when a deposit or withdrawal is to a bad target.\"}],\"CallPaused()\":[{\"notice\":\"Error for when a method cannot be called when paused. This could be renamed to `Paused` in the future, but it collides with the `Paused` event.\"}],\"GasEstimation()\":[{\"notice\":\"Error for special gas estimation.\"}],\"LargeCalldata()\":[{\"notice\":\"Error for when a deposit has too much calldata.\"}],\"OutOfGas()\":[{\"notice\":\"Error returned when too much gas resource is consumed.\"}],\"SmallGasLimit()\":[{\"notice\":\"Error for when a deposit has too small of a gas limit.\"}],\"Unauthorized()\":[{\"notice\":\"Error for an unauthorized CALLER.\"}]},\"events\":{\"TransactionDeposited(address,address,uint256,bytes)\":{\"notice\":\"Emitted when a transaction is deposited from L1 to L2. The parameters of this event are read by the rollup node and used to derive deposit transactions on L2.\"},\"WithdrawalFinalized(bytes32,bool)\":{\"notice\":\"Emitted when a withdrawal transaction is finalized.\"},\"WithdrawalProven(bytes32,address,address)\":{\"notice\":\"Emitted when a withdrawal transaction is proven.\"}},\"kind\":\"user\",\"methods\":{\"blacklistDisputeGame(address)\":{\"notice\":\"Blacklists a dispute game. Should only be used in the event that a dispute game resolves incorrectly.\"},\"checkWithdrawal(bytes32,address)\":{\"notice\":\"Checks if a withdrawal can be finalized. This function will revert if the withdrawal cannot be finalized, and otherwise has no side-effects.\"},\"constructor\":{\"notice\":\"Constructs the OptimismPortal contract.\"},\"depositTransaction(address,uint256,uint64,bool,bytes)\":{\"notice\":\"Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in deriving deposit transactions. Note that if a deposit is made by a contract, its address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider using the CrossDomainMessenger contracts for a simpler developer experience.\"},\"disputeGameBlacklist(address)\":{\"notice\":\"A mapping of dispute game addresses to whether or not they are blacklisted.\"},\"disputeGameFactory()\":{\"notice\":\"Address of the DisputeGameFactory.\"},\"disputeGameFinalityDelaySeconds()\":{\"notice\":\"Getter for the dispute game finality delay.\"},\"donateETH()\":{\"notice\":\"Accepts ETH value without triggering a deposit to L2. This function mainly exists for the sake of the migration between the legacy Optimism system and Bedrock.\"},\"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))\":{\"notice\":\"Finalizes a withdrawal transaction.\"},\"finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes),address)\":{\"notice\":\"Finalizes a withdrawal transaction, using an external proof submitter.\"},\"finalizedWithdrawals(bytes32)\":{\"notice\":\"A list of withdrawal hashes which have been successfully finalized.\"},\"guardian()\":{\"notice\":\"Getter function for the address of the guardian. Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead.\"},\"initialize(address,address,address,uint32)\":{\"notice\":\"Initializer.\"},\"l2Sender()\":{\"notice\":\"Address of the L2 account which initiated a withdrawal in this transaction. If the of this variable is the default L2 sender address, then we are NOT inside of a call to finalizeWithdrawalTransaction.\"},\"minimumGasLimit(uint64)\":{\"notice\":\"Computes the minimum gas limit for a deposit. The minimum gas limit linearly increases based on the size of the calldata. This is to prevent users from creating L2 resource usage without paying for it. This function can be used when interacting with the portal to ensure forwards compatibility.\"},\"numProofSubmitters(bytes32)\":{\"notice\":\"External getter for the number of proof submitters for a withdrawal hash.\"},\"params()\":{\"notice\":\"EIP-1559 style gas parameters.\"},\"paused()\":{\"notice\":\"Getter for the current paused status.\"},\"proofMaturityDelaySeconds()\":{\"notice\":\"Getter for the proof maturity delay.\"},\"proofSubmitters(bytes32,uint256)\":{\"notice\":\"Mapping of withdrawal hashes to addresses that have submitted a proof for the withdrawal.\"},\"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])\":{\"notice\":\"Proves a withdrawal transaction.\"},\"provenWithdrawals(bytes32,address)\":{\"notice\":\"A mapping of withdrawal hashes to proof submitters to `ProvenWithdrawal` data.\"},\"respectedGameType()\":{\"notice\":\"The game type that the OptimismPortal consults for output proposals.\"},\"respectedGameTypeUpdatedAt()\":{\"notice\":\"The timestamp at which the respected game type was last updated.\"},\"setRespectedGameType(uint32)\":{\"notice\":\"Sets the respected game type. Changing this value can alter the security properties of the system, depending on the new game's behavior.\"},\"superchainConfig()\":{\"notice\":\"Contract of the Superchain Config.\"},\"systemConfig()\":{\"notice\":\"Contract of the SystemConfig.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"The OptimismPortal is a low-level contract responsible for passing messages between L1 and L2. Messages sent directly to the OptimismPortal have no form of replayability. Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/L1/OptimismPortal2.sol\":\"OptimismPortal2\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"lib/solady/src/utils/LibClone.sol\":{\"keccak256\":\"0xfd4b40a4584e736d9d0b045fbc748023804c83819f5e018635a9f447834774a4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://202fc57397118355d9d573c28d36ff45892e632a12b143f4bc5e7266bfb7737e\",\"dweb:/ipfs/QmZYD6Va3nNUC4B9NHZcyvFmK59i3WnEPPpsi8N355GivN\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"src/L1/OptimismPortal2.sol\":{\"keccak256\":\"0xcd1bb48f8005d9ed77120615d936441a8fd000b15bec1f32416f819999e4f0ca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://251a0362b91185a1b53b4053651cc189e1411cdabc4003cbdc7f9efabbd7e22f\",\"dweb:/ipfs/QmfW9o4Pxa2SAbiohXRnqDEbpHWZeqFM4d9QmD3gJjFLQE\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409\",\"dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM\"]},\"src/L1/SuperchainConfig.sol\":{\"keccak256\":\"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f\",\"dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB\"]},\"src/L1/SystemConfig.sol\":{\"keccak256\":\"0xc3d6392cbc44e38ddc93b84b82b08ab8e813df771a48926db3f94edde8f2b64a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d326d644dc59a57a71f4ff6eaa5c6d1464697c7df337b641fe82091b9050e6ce\",\"dweb:/ipfs/Qmd6tNzBmm8V4cpcMNyFWbWnKPNMRoysmmA62rZjGqpg7f\"]},\"src/dispute/DisputeGameFactory.sol\":{\"keccak256\":\"0xc7c6b0c2a051d4a14b3833243fa2e93e5e320bb106ef3979ce77098fb9d6629f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cd5cbabb1b0b41f9faf3d2329e519936ea43a1e7da1df6a9be90d2513603b09f\",\"dweb:/ipfs/QmQM5FpgogJQnbmJjdQdoxxMzczx5PBiCNbiRUQiJqHyhM\"]},\"src/dispute/interfaces/IDisputeGame.sol\":{\"keccak256\":\"0xe2611453d5cc05f8aa30dc0e5e15ee5ae29fd3eb55a2c034424250baebf12f9b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://274e00fbcea3b8455bbaa042130bf1f7a5b2b769f28ad57afbf9fabfd74a757a\",\"dweb:/ipfs/QmRKQTfYdMjQYVbuZhdXts1d752eUq8RwrjqqwV5XRYLi6\"]},\"src/dispute/interfaces/IDisputeGameFactory.sol\":{\"keccak256\":\"0x204d89d38d4dc0db40fbf898d95e639ac5608810a5a5506a3d80d71177648bda\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://71e5c0ff04f409f30ca4f8ebfae1592c6ca495e315b059f969d11812e6e84dbd\",\"dweb:/ipfs/QmaNKkhkJv7qHzX6bKB3LjpWBupfMPLhoATUGx1HRTLtXh\"]},\"src/dispute/interfaces/IInitializable.sol\":{\"keccak256\":\"0xbc553af6501a972850a98fc6284943f8e95a5183a7b4f64198c16fca2338c9dc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1f1c422ce4a9e72f0bbdec36434206da4af3a32d38f922acab957942e994ce5\",\"dweb:/ipfs/QmNQGWBceLxx1CKSMLfwTM584q8UCgUpF4rrFe8pdbWYtj\"]},\"src/dispute/lib/LibGameId.sol\":{\"keccak256\":\"0x9a9f30500da6eb7eeaa7193515dc5e45dc479f09ae7d522a07283c0fb5f4bfa6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be113d8198d5822385de3d6ff3d7b3e8241993484aa95604ffaf38c2d33f40e0\",\"dweb:/ipfs/QmY9mHC52fqc4gAFYCGobNyuP4TqugQgs8o1kTF33t17Hc\"]},\"src/dispute/lib/LibHashing.sol\":{\"keccak256\":\"0x5a072cd028094eee55acb84ed8d08d7422b1fb46658b7e043e916781530a383b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b67e54f1318f1fd67b28b16c6861a56e27217c26a12aaea5c446e2ec53143920\",\"dweb:/ipfs/QmVLSTP3PwXzRkR3A4qV9fjZhca9v8J1EnEYuVGUsSirAq\"]},\"src/dispute/lib/LibPosition.sol\":{\"keccak256\":\"0xf7ceb26f0ac7067ff8a43f263451050eef6fba2029eafb83d3cbe35224d894a6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3bb403b0d707a8e2e3780a19185b918bfe907ca2d1b939ea74ae095a5cdf3b48\",\"dweb:/ipfs/QmYFzkmF8TRomp1cBEbTsKxiEnqLnX6SvSh4y3rVa84pBR\"]},\"src/dispute/lib/LibUDT.sol\":{\"keccak256\":\"0x9b61b15f5edfac1e6528aec79c1be6ac712d5f6a62140db87ed749e41a46563f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://24ef4ecee91638e278886888192b7d2b1811ab99f4e90a06817a4b2651720046\",\"dweb:/ipfs/QmdisoBv1mE9jDv6jvpcbvKhdmJZMMjQmATrEYfBQQrXtZ\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72\",\"dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Bytes.sol\":{\"keccak256\":\"0x827f47d123b0fdf3b08816d5b33831811704dbf4e554e53f2269354f6bba8859\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3137ac7204d30a245a8b0d67aa6da5286f1bd8c90379daab561f84963b6db782\",\"dweb:/ipfs/QmWRhisw3axJK833gUScs23ETh2MLFbVzzqzYVMKSDN3S9\"]},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b\",\"dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp\"]},\"src/libraries/DisputeErrors.sol\":{\"keccak256\":\"0x869bec0d79d97f2d0a00b1e70bf1e6955a2be585521e0084602e54455c0a6937\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a235c6349437cd2ade72909287404e2993c1c4bd356707299239c71fa3bf780e\",\"dweb:/ipfs/QmcFSh6PWJ5sNg1CeoRyF9EnV8APWDz1kYP98v6ooGxc71\"]},\"src/libraries/DisputeTypes.sol\":{\"keccak256\":\"0xae3d053cf40b3e47669b89438524fec4eb571a78be296cc7e7ba23025b3bdf0c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a2b90604718ad29d19a8f21d45a5f8c6188320781fdb7102b3fccadae549961\",\"dweb:/ipfs/QmUBTXgRFG7PvoCBJsXmgi2sZPZFPQQZTptQ91LL7tC2xQ\"]},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff\",\"dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA\"]},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12\",\"dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF\"]},\"src/libraries/PortalErrors.sol\":{\"keccak256\":\"0x57adcaa45a1ce9c5af04d0fe4ecbc86e6ff3f947f7957ab55bdade129adcf558\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3cf485f11085ad6d1ba1386fdb340f65eb1048187692ad3d9eb8816e290140c1\",\"dweb:/ipfs/Qmb423b45TLV8PdhFa8Hs72eom5D2C5q4gVcYGNzDh4EMU\"]},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"]},\"src/libraries/Storage.sol\":{\"keccak256\":\"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269\",\"dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/libraries/rlp/RLPReader.sol\":{\"keccak256\":\"0x99731a39bc10203719d448117b0e6ef47771890440d595d118084d7988d59afb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1dbeb75d0cc8de58350cc15df8867bf97d8492e0617b1c62733ace6155c6915a\",\"dweb:/ipfs/QmNiXzskPE72h93F8EXT8wAXKzEh2EERLbubdVMfwTQbtj\"]},\"src/libraries/rlp/RLPWriter.sol\":{\"keccak256\":\"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b\",\"dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV\"]},\"src/libraries/trie/MerkleTrie.sol\":{\"keccak256\":\"0xf8ba770ee6666e73ae43184c700e9c704b2c4ace71f9e3c2227ddc11a8148b4c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4702ccee1fe44aea3ee01d59e6152eb755da083f786f00947fec4437c064fe74\",\"dweb:/ipfs/QmQjFj5J7hrEM1dxJjFszzW2Cs7g7eMhYNBXonF2DXBstE\"]},\"src/libraries/trie/SecureMerkleTrie.sol\":{\"keccak256\":\"0xeaff8315cfd21197bc6bc859c2decf5d4f4838c9c357c502cdf2b1eac863d288\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://79dcdcaa560aea51d138da4f5dc553a1808b6de090b2dc1629f18375edbff681\",\"dweb:/ipfs/QmbE4pUPhf5fLKW4W6cEjhQs55gEDvHmbmoBqkW1yz3bnw\"]},\"src/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"src/vendor/AddressAliasHelper.sol\":{\"keccak256\":\"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88\",\"dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"_proofMaturityDelaySeconds","type":"uint256"},{"internalType":"uint256","name":"_disputeGameFinalityDelaySeconds","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"BadTarget"},{"inputs":[],"type":"error","name":"CallPaused"},{"inputs":[],"type":"error","name":"GasEstimation"},{"inputs":[],"type":"error","name":"LargeCalldata"},{"inputs":[],"type":"error","name":"OutOfGas"},{"inputs":[],"type":"error","name":"SmallGasLimit"},{"inputs":[],"type":"error","name":"Unauthorized"},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"version","type":"uint256","indexed":true},{"internalType":"bytes","name":"opaqueData","type":"bytes","indexed":false}],"type":"event","name":"TransactionDeposited","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"withdrawalHash","type":"bytes32","indexed":true},{"internalType":"bool","name":"success","type":"bool","indexed":false}],"type":"event","name":"WithdrawalFinalized","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"withdrawalHash","type":"bytes32","indexed":true},{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true}],"type":"event","name":"WithdrawalProven","anonymous":false},{"inputs":[{"internalType":"contract IDisputeGame","name":"_disputeGame","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"blacklistDisputeGame"},{"inputs":[{"internalType":"bytes32","name":"_withdrawalHash","type":"bytes32"},{"internalType":"address","name":"_proofSubmitter","type":"address"}],"stateMutability":"view","type":"function","name":"checkWithdrawal"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint64","name":"_gasLimit","type":"uint64"},{"internalType":"bool","name":"_isCreation","type":"bool"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"depositTransaction"},{"inputs":[{"internalType":"contract IDisputeGame","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"disputeGameBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"disputeGameFactory","outputs":[{"internalType":"contract DisputeGameFactory","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"disputeGameFinalityDelaySeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"payable","type":"function","name":"donateETH"},{"inputs":[{"internalType":"struct Types.WithdrawalTransaction","name":"_tx","type":"tuple","components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"finalizeWithdrawalTransaction"},{"inputs":[{"internalType":"struct Types.WithdrawalTransaction","name":"_tx","type":"tuple","components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}]},{"internalType":"address","name":"_proofSubmitter","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"finalizeWithdrawalTransactionExternalProof"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"finalizedWithdrawals","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"contract DisputeGameFactory","name":"_disputeGameFactory","type":"address"},{"internalType":"contract SystemConfig","name":"_systemConfig","type":"address"},{"internalType":"contract SuperchainConfig","name":"_superchainConfig","type":"address"},{"internalType":"GameType","name":"_initialRespectedGameType","type":"uint32"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"l2Sender","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint64","name":"_byteCount","type":"uint64"}],"stateMutability":"pure","type":"function","name":"minimumGasLimit","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"bytes32","name":"_withdrawalHash","type":"bytes32"}],"stateMutability":"view","type":"function","name":"numProofSubmitters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"params","outputs":[{"internalType":"uint128","name":"prevBaseFee","type":"uint128"},{"internalType":"uint64","name":"prevBoughtGas","type":"uint64"},{"internalType":"uint64","name":"prevBlockNum","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"proofMaturityDelaySeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"proofSubmitters","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"struct Types.WithdrawalTransaction","name":"_tx","type":"tuple","components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}]},{"internalType":"uint256","name":"_disputeGameIndex","type":"uint256"},{"internalType":"struct Types.OutputRootProof","name":"_outputRootProof","type":"tuple","components":[{"internalType":"bytes32","name":"version","type":"bytes32"},{"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"internalType":"bytes32","name":"messagePasserStorageRoot","type":"bytes32"},{"internalType":"bytes32","name":"latestBlockhash","type":"bytes32"}]},{"internalType":"bytes[]","name":"_withdrawalProof","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function","name":"proveWithdrawalTransaction"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"provenWithdrawals","outputs":[{"internalType":"contract IDisputeGame","name":"disputeGameProxy","type":"address"},{"internalType":"uint64","name":"timestamp","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"respectedGameType","outputs":[{"internalType":"GameType","name":"","type":"uint32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"respectedGameTypeUpdatedAt","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"GameType","name":"_gameType","type":"uint32"}],"stateMutability":"nonpayable","type":"function","name":"setRespectedGameType"},{"inputs":[],"stateMutability":"view","type":"function","name":"superchainConfig","outputs":[{"internalType":"contract SuperchainConfig","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"systemConfig","outputs":[{"internalType":"contract SystemConfig","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"blacklistDisputeGame(address)":{"params":{"_disputeGame":"Dispute game to blacklist."}},"checkWithdrawal(bytes32,address)":{"params":{"_proofSubmitter":"The submitter of the proof for the withdrawal hash","_withdrawalHash":"Hash of the withdrawal to check."}},"depositTransaction(address,uint256,uint64,bool,bytes)":{"params":{"_data":"Data to trigger the recipient with.","_gasLimit":"Amount of L2 gas to purchase by burning gas on L1.","_isCreation":"Whether or not the transaction is a contract creation.","_to":"Target address on L2.","_value":"ETH value to send to the recipient."}},"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))":{"params":{"_tx":"Withdrawal transaction to finalize."}},"finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes),address)":{"params":{"_proofSubmitter":"Address of the proof submitter.","_tx":"Withdrawal transaction to finalize."}},"guardian()":{"custom:legacy":"","returns":{"_0":"Address of the guardian."}},"initialize(address,address,address,uint32)":{"params":{"_disputeGameFactory":"Contract of the DisputeGameFactory.","_superchainConfig":"Contract of the SuperchainConfig.","_systemConfig":"Contract of the SystemConfig."}},"minimumGasLimit(uint64)":{"params":{"_byteCount":"Number of bytes in the calldata."},"returns":{"_0":"The minimum gas limit for a deposit."}},"numProofSubmitters(bytes32)":{"params":{"_withdrawalHash":"Hash of the withdrawal."},"returns":{"_0":"The number of proof submitters for the withdrawal hash."}},"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])":{"params":{"_disputeGameIndex":"Index of the dispute game to prove the withdrawal against.","_outputRootProof":"Inclusion proof of the L2ToL1MessagePasser contract's storage root.","_tx":"Withdrawal transaction to finalize.","_withdrawalProof":"Inclusion proof of the withdrawal in L2ToL1MessagePasser contract."}},"setRespectedGameType(uint32)":{"params":{"_gameType":"The game type to consult for output proposals."}}},"version":1},"userdoc":{"kind":"user","methods":{"blacklistDisputeGame(address)":{"notice":"Blacklists a dispute game. Should only be used in the event that a dispute game resolves incorrectly."},"checkWithdrawal(bytes32,address)":{"notice":"Checks if a withdrawal can be finalized. This function will revert if the withdrawal cannot be finalized, and otherwise has no side-effects."},"constructor":{"notice":"Constructs the OptimismPortal contract."},"depositTransaction(address,uint256,uint64,bool,bytes)":{"notice":"Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in deriving deposit transactions. Note that if a deposit is made by a contract, its address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider using the CrossDomainMessenger contracts for a simpler developer experience."},"disputeGameBlacklist(address)":{"notice":"A mapping of dispute game addresses to whether or not they are blacklisted."},"disputeGameFactory()":{"notice":"Address of the DisputeGameFactory."},"disputeGameFinalityDelaySeconds()":{"notice":"Getter for the dispute game finality delay."},"donateETH()":{"notice":"Accepts ETH value without triggering a deposit to L2. This function mainly exists for the sake of the migration between the legacy Optimism system and Bedrock."},"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))":{"notice":"Finalizes a withdrawal transaction."},"finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes),address)":{"notice":"Finalizes a withdrawal transaction, using an external proof submitter."},"finalizedWithdrawals(bytes32)":{"notice":"A list of withdrawal hashes which have been successfully finalized."},"guardian()":{"notice":"Getter function for the address of the guardian. Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead."},"initialize(address,address,address,uint32)":{"notice":"Initializer."},"l2Sender()":{"notice":"Address of the L2 account which initiated a withdrawal in this transaction. If the of this variable is the default L2 sender address, then we are NOT inside of a call to finalizeWithdrawalTransaction."},"minimumGasLimit(uint64)":{"notice":"Computes the minimum gas limit for a deposit. The minimum gas limit linearly increases based on the size of the calldata. This is to prevent users from creating L2 resource usage without paying for it. This function can be used when interacting with the portal to ensure forwards compatibility."},"numProofSubmitters(bytes32)":{"notice":"External getter for the number of proof submitters for a withdrawal hash."},"params()":{"notice":"EIP-1559 style gas parameters."},"paused()":{"notice":"Getter for the current paused status."},"proofMaturityDelaySeconds()":{"notice":"Getter for the proof maturity delay."},"proofSubmitters(bytes32,uint256)":{"notice":"Mapping of withdrawal hashes to addresses that have submitted a proof for the withdrawal."},"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])":{"notice":"Proves a withdrawal transaction."},"provenWithdrawals(bytes32,address)":{"notice":"A mapping of withdrawal hashes to proof submitters to `ProvenWithdrawal` data."},"respectedGameType()":{"notice":"The game type that the OptimismPortal consults for output proposals."},"respectedGameTypeUpdatedAt()":{"notice":"The timestamp at which the respected game type was last updated."},"setRespectedGameType(uint32)":{"notice":"Sets the respected game type. Changing this value can alter the security properties of the system, depending on the new game's behavior."},"superchainConfig()":{"notice":"Contract of the Superchain Config."},"systemConfig()":{"notice":"Contract of the SystemConfig."},"version()":{"notice":"Semantic version."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/L1/OptimismPortal2.sol":"OptimismPortal2"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888","urls":["bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a","dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149","urls":["bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c","dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66","urls":["bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f","dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0","urls":["bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929","dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7","urls":["bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689","dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy"],"license":"MIT"},"lib/solady/src/utils/LibClone.sol":{"keccak256":"0xfd4b40a4584e736d9d0b045fbc748023804c83819f5e018635a9f447834774a4","urls":["bzz-raw://202fc57397118355d9d573c28d36ff45892e632a12b143f4bc5e7266bfb7737e","dweb:/ipfs/QmZYD6Va3nNUC4B9NHZcyvFmK59i3WnEPPpsi8N355GivN"],"license":"MIT"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d","urls":["bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c","dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8"],"license":"MIT"},"src/L1/OptimismPortal2.sol":{"keccak256":"0xcd1bb48f8005d9ed77120615d936441a8fd000b15bec1f32416f819999e4f0ca","urls":["bzz-raw://251a0362b91185a1b53b4053651cc189e1411cdabc4003cbdc7f9efabbd7e22f","dweb:/ipfs/QmfW9o4Pxa2SAbiohXRnqDEbpHWZeqFM4d9QmD3gJjFLQE"],"license":"MIT"},"src/L1/ResourceMetering.sol":{"keccak256":"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408","urls":["bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409","dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM"],"license":"MIT"},"src/L1/SuperchainConfig.sol":{"keccak256":"0x5fab874f980fe3e52c3398ddd25b655c56af0c98c15588b2ad9ebf30671d859d","urls":["bzz-raw://4e0aa613d38eceb621f8569fc714f521bc1f2df3d029552186ab3cdf2ee5d53f","dweb:/ipfs/QmZDzFxhTXLW79eohQbr1nghNh3oNC4CUfH7uMX8CsjVAB"],"license":"MIT"},"src/L1/SystemConfig.sol":{"keccak256":"0xc3d6392cbc44e38ddc93b84b82b08ab8e813df771a48926db3f94edde8f2b64a","urls":["bzz-raw://d326d644dc59a57a71f4ff6eaa5c6d1464697c7df337b641fe82091b9050e6ce","dweb:/ipfs/Qmd6tNzBmm8V4cpcMNyFWbWnKPNMRoysmmA62rZjGqpg7f"],"license":"MIT"},"src/dispute/DisputeGameFactory.sol":{"keccak256":"0xc7c6b0c2a051d4a14b3833243fa2e93e5e320bb106ef3979ce77098fb9d6629f","urls":["bzz-raw://cd5cbabb1b0b41f9faf3d2329e519936ea43a1e7da1df6a9be90d2513603b09f","dweb:/ipfs/QmQM5FpgogJQnbmJjdQdoxxMzczx5PBiCNbiRUQiJqHyhM"],"license":"MIT"},"src/dispute/interfaces/IDisputeGame.sol":{"keccak256":"0xe2611453d5cc05f8aa30dc0e5e15ee5ae29fd3eb55a2c034424250baebf12f9b","urls":["bzz-raw://274e00fbcea3b8455bbaa042130bf1f7a5b2b769f28ad57afbf9fabfd74a757a","dweb:/ipfs/QmRKQTfYdMjQYVbuZhdXts1d752eUq8RwrjqqwV5XRYLi6"],"license":"MIT"},"src/dispute/interfaces/IDisputeGameFactory.sol":{"keccak256":"0x204d89d38d4dc0db40fbf898d95e639ac5608810a5a5506a3d80d71177648bda","urls":["bzz-raw://71e5c0ff04f409f30ca4f8ebfae1592c6ca495e315b059f969d11812e6e84dbd","dweb:/ipfs/QmaNKkhkJv7qHzX6bKB3LjpWBupfMPLhoATUGx1HRTLtXh"],"license":"MIT"},"src/dispute/interfaces/IInitializable.sol":{"keccak256":"0xbc553af6501a972850a98fc6284943f8e95a5183a7b4f64198c16fca2338c9dc","urls":["bzz-raw://b1f1c422ce4a9e72f0bbdec36434206da4af3a32d38f922acab957942e994ce5","dweb:/ipfs/QmNQGWBceLxx1CKSMLfwTM584q8UCgUpF4rrFe8pdbWYtj"],"license":"MIT"},"src/dispute/lib/LibGameId.sol":{"keccak256":"0x9a9f30500da6eb7eeaa7193515dc5e45dc479f09ae7d522a07283c0fb5f4bfa6","urls":["bzz-raw://be113d8198d5822385de3d6ff3d7b3e8241993484aa95604ffaf38c2d33f40e0","dweb:/ipfs/QmY9mHC52fqc4gAFYCGobNyuP4TqugQgs8o1kTF33t17Hc"],"license":"MIT"},"src/dispute/lib/LibHashing.sol":{"keccak256":"0x5a072cd028094eee55acb84ed8d08d7422b1fb46658b7e043e916781530a383b","urls":["bzz-raw://b67e54f1318f1fd67b28b16c6861a56e27217c26a12aaea5c446e2ec53143920","dweb:/ipfs/QmVLSTP3PwXzRkR3A4qV9fjZhca9v8J1EnEYuVGUsSirAq"],"license":"MIT"},"src/dispute/lib/LibPosition.sol":{"keccak256":"0xf7ceb26f0ac7067ff8a43f263451050eef6fba2029eafb83d3cbe35224d894a6","urls":["bzz-raw://3bb403b0d707a8e2e3780a19185b918bfe907ca2d1b939ea74ae095a5cdf3b48","dweb:/ipfs/QmYFzkmF8TRomp1cBEbTsKxiEnqLnX6SvSh4y3rVa84pBR"],"license":"MIT"},"src/dispute/lib/LibUDT.sol":{"keccak256":"0x9b61b15f5edfac1e6528aec79c1be6ac712d5f6a62140db87ed749e41a46563f","urls":["bzz-raw://24ef4ecee91638e278886888192b7d2b1811ab99f4e90a06817a4b2651720046","dweb:/ipfs/QmdisoBv1mE9jDv6jvpcbvKhdmJZMMjQmATrEYfBQQrXtZ"],"license":"MIT"},"src/libraries/Arithmetic.sol":{"keccak256":"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db","urls":["bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72","dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq"],"license":"MIT"},"src/libraries/Burn.sol":{"keccak256":"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010","urls":["bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f","dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"],"license":"MIT"},"src/libraries/Bytes.sol":{"keccak256":"0x827f47d123b0fdf3b08816d5b33831811704dbf4e554e53f2269354f6bba8859","urls":["bzz-raw://3137ac7204d30a245a8b0d67aa6da5286f1bd8c90379daab561f84963b6db782","dweb:/ipfs/QmWRhisw3axJK833gUScs23ETh2MLFbVzzqzYVMKSDN3S9"],"license":"MIT"},"src/libraries/Constants.sol":{"keccak256":"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132","urls":["bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b","dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp"],"license":"MIT"},"src/libraries/DisputeErrors.sol":{"keccak256":"0x869bec0d79d97f2d0a00b1e70bf1e6955a2be585521e0084602e54455c0a6937","urls":["bzz-raw://a235c6349437cd2ade72909287404e2993c1c4bd356707299239c71fa3bf780e","dweb:/ipfs/QmcFSh6PWJ5sNg1CeoRyF9EnV8APWDz1kYP98v6ooGxc71"],"license":"MIT"},"src/libraries/DisputeTypes.sol":{"keccak256":"0xae3d053cf40b3e47669b89438524fec4eb571a78be296cc7e7ba23025b3bdf0c","urls":["bzz-raw://4a2b90604718ad29d19a8f21d45a5f8c6188320781fdb7102b3fccadae549961","dweb:/ipfs/QmUBTXgRFG7PvoCBJsXmgi2sZPZFPQQZTptQ91LL7tC2xQ"],"license":"MIT"},"src/libraries/Encoding.sol":{"keccak256":"0x1dafabcbd4877c7abe9698957b0a44b7e911cb8b11c1437a4ed897135669fa87","urls":["bzz-raw://6addfacefa26fdb44f56d73fa0172b97740de75629a962905ec2a20a28d40fff","dweb:/ipfs/QmboHMouqU19Rnbqrfo1gkfnuDBFcPiC9wsKgGtF2W1cNA"],"license":"MIT"},"src/libraries/Hashing.sol":{"keccak256":"0x89c07a0ca102cbe57b4e082543f2dd6dae0e1fd4a87908a334bd076fc914e7b8","urls":["bzz-raw://69c83489c9544ab442dc244c2feb2c6811b726a5eb5a509b97fc5ccb90b98c12","dweb:/ipfs/QmPGGJeLasc1HWHzd6odvWcNvFPQrbYtDubZcv8yp1HLtF"],"license":"MIT"},"src/libraries/PortalErrors.sol":{"keccak256":"0x57adcaa45a1ce9c5af04d0fe4ecbc86e6ff3f947f7957ab55bdade129adcf558","urls":["bzz-raw://3cf485f11085ad6d1ba1386fdb340f65eb1048187692ad3d9eb8816e290140c1","dweb:/ipfs/Qmb423b45TLV8PdhFa8Hs72eom5D2C5q4gVcYGNzDh4EMU"],"license":"MIT"},"src/libraries/SafeCall.sol":{"keccak256":"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f","urls":["bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a","dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq"],"license":"MIT"},"src/libraries/Storage.sol":{"keccak256":"0x7ce27a05552aa69afa6b2ab6684dfe99f27366cf8ef2046baeb1fb62fff0022f","urls":["bzz-raw://a6a24f3ed56681720707a5ab0372fd67fcb1a4f6fb072c7140cda28bdb70f269","dweb:/ipfs/QmW9uTpUULV4xmP7A7MoBDeDhVfQgmJG5qVUFGtXxWpWWK"],"license":"MIT"},"src/libraries/Types.sol":{"keccak256":"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4","urls":["bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e","dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc"],"license":"MIT"},"src/libraries/rlp/RLPReader.sol":{"keccak256":"0x99731a39bc10203719d448117b0e6ef47771890440d595d118084d7988d59afb","urls":["bzz-raw://1dbeb75d0cc8de58350cc15df8867bf97d8492e0617b1c62733ace6155c6915a","dweb:/ipfs/QmNiXzskPE72h93F8EXT8wAXKzEh2EERLbubdVMfwTQbtj"],"license":"MIT"},"src/libraries/rlp/RLPWriter.sol":{"keccak256":"0x60ac401490f321c9c55e996a2c65151cd5e60de5f8f297e7c94d541c29820bb6","urls":["bzz-raw://070f5814db07e4a89173d44a36d90e4261ce530f7336034c01635347f2c2d88b","dweb:/ipfs/QmXqr9yW5Kc8MYgr5wSehU5AiqS9pZ4FKxv7vwiwpZCcyV"],"license":"MIT"},"src/libraries/trie/MerkleTrie.sol":{"keccak256":"0xf8ba770ee6666e73ae43184c700e9c704b2c4ace71f9e3c2227ddc11a8148b4c","urls":["bzz-raw://4702ccee1fe44aea3ee01d59e6152eb755da083f786f00947fec4437c064fe74","dweb:/ipfs/QmQjFj5J7hrEM1dxJjFszzW2Cs7g7eMhYNBXonF2DXBstE"],"license":"MIT"},"src/libraries/trie/SecureMerkleTrie.sol":{"keccak256":"0xeaff8315cfd21197bc6bc859c2decf5d4f4838c9c357c502cdf2b1eac863d288","urls":["bzz-raw://79dcdcaa560aea51d138da4f5dc553a1808b6de090b2dc1629f18375edbff681","dweb:/ipfs/QmbE4pUPhf5fLKW4W6cEjhQs55gEDvHmbmoBqkW1yz3bnw"],"license":"MIT"},"src/universal/ISemver.sol":{"keccak256":"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44","urls":["bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a","dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR"],"license":"MIT"},"src/vendor/AddressAliasHelper.sol":{"keccak256":"0x6ecb83b4ec80fbe49c22f4f95d90482de64660ef5d422a19f4d4b04df31c1237","urls":["bzz-raw://1d0885be6e473962f9a0622176a22300165ac0cc1a1d7f2e22b11c3d656ace88","dweb:/ipfs/QmPRa3KmRpXW5P9ykveKRDgYN5zYo4cYLAYSnoqHX3KnXR"],"license":"Apache-2.0"}},"version":1},"storageLayout":{"storage":[{"astId":49534,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"_initialized","offset":0,"slot":"0","type":"t_uint8"},{"astId":49537,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"_initializing","offset":1,"slot":"0","type":"t_bool"},{"astId":88262,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"params","offset":0,"slot":"1","type":"t_struct(ResourceParams)88245_storage"},{"astId":88267,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"__gap","offset":0,"slot":"2","type":"t_array(t_uint256)48_storage"},{"astId":87165,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"l2Sender","offset":0,"slot":"50","type":"t_address"},{"astId":87170,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"finalizedWithdrawals","offset":0,"slot":"51","type":"t_mapping(t_bytes32,t_bool)"},{"astId":87173,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"spacer_52_0_32","offset":0,"slot":"52","type":"t_bytes32"},{"astId":87176,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"spacer_53_0_1","offset":0,"slot":"53","type":"t_bool"},{"astId":87180,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"superchainConfig","offset":1,"slot":"53","type":"t_contract(SuperchainConfig)88793"},{"astId":87183,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"spacer_54_0_20","offset":0,"slot":"54","type":"t_address"},{"astId":87187,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"systemConfig","offset":0,"slot":"55","type":"t_contract(SystemConfig)89607"},{"astId":87191,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"disputeGameFactory","offset":0,"slot":"56","type":"t_contract(DisputeGameFactory)97682"},{"astId":87199,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"provenWithdrawals","offset":0,"slot":"57","type":"t_mapping(t_bytes32,t_mapping(t_address,t_struct(ProvenWithdrawal)87148_storage))"},{"astId":87205,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"disputeGameBlacklist","offset":0,"slot":"58","type":"t_mapping(t_contract(IDisputeGame)100327,t_bool)"},{"astId":87209,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"respectedGameType","offset":0,"slot":"59","type":"t_userDefinedValueType(GameType)103271"},{"astId":87212,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"respectedGameTypeUpdatedAt","offset":4,"slot":"59","type":"t_uint64"},{"astId":87218,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"proofSubmitters","offset":0,"slot":"60","type":"t_mapping(t_bytes32,t_array(t_address)dyn_storage)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_address)dyn_storage":{"encoding":"dynamic_array","label":"address[]","numberOfBytes":"32","base":"t_address"},"t_array(t_uint256)48_storage":{"encoding":"inplace","label":"uint256[48]","numberOfBytes":"1536","base":"t_uint256"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_contract(DisputeGameFactory)97682":{"encoding":"inplace","label":"contract DisputeGameFactory","numberOfBytes":"20"},"t_contract(IDisputeGame)100327":{"encoding":"inplace","label":"contract IDisputeGame","numberOfBytes":"20"},"t_contract(SuperchainConfig)88793":{"encoding":"inplace","label":"contract SuperchainConfig","numberOfBytes":"20"},"t_contract(SystemConfig)89607":{"encoding":"inplace","label":"contract SystemConfig","numberOfBytes":"20"},"t_mapping(t_address,t_struct(ProvenWithdrawal)87148_storage)":{"encoding":"mapping","key":"t_address","label":"mapping(address => struct OptimismPortal2.ProvenWithdrawal)","numberOfBytes":"32","value":"t_struct(ProvenWithdrawal)87148_storage"},"t_mapping(t_bytes32,t_array(t_address)dyn_storage)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => address[])","numberOfBytes":"32","value":"t_array(t_address)dyn_storage"},"t_mapping(t_bytes32,t_bool)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => bool)","numberOfBytes":"32","value":"t_bool"},"t_mapping(t_bytes32,t_mapping(t_address,t_struct(ProvenWithdrawal)87148_storage))":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => mapping(address => struct OptimismPortal2.ProvenWithdrawal))","numberOfBytes":"32","value":"t_mapping(t_address,t_struct(ProvenWithdrawal)87148_storage)"},"t_mapping(t_contract(IDisputeGame)100327,t_bool)":{"encoding":"mapping","key":"t_contract(IDisputeGame)100327","label":"mapping(contract IDisputeGame => bool)","numberOfBytes":"32","value":"t_bool"},"t_struct(ProvenWithdrawal)87148_storage":{"encoding":"inplace","label":"struct OptimismPortal2.ProvenWithdrawal","numberOfBytes":"32","members":[{"astId":87145,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"disputeGameProxy","offset":0,"slot":"0","type":"t_contract(IDisputeGame)100327"},{"astId":87147,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"timestamp","offset":20,"slot":"0","type":"t_uint64"}]},"t_struct(ResourceParams)88245_storage":{"encoding":"inplace","label":"struct ResourceMetering.ResourceParams","numberOfBytes":"32","members":[{"astId":88240,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"prevBaseFee","offset":0,"slot":"0","type":"t_uint128"},{"astId":88242,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"prevBoughtGas","offset":16,"slot":"0","type":"t_uint64"},{"astId":88244,"contract":"src/L1/OptimismPortal2.sol:OptimismPortal2","label":"prevBlockNum","offset":24,"slot":"0","type":"t_uint64"}]},"t_uint128":{"encoding":"inplace","label":"uint128","numberOfBytes":"16"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint64":{"encoding":"inplace","label":"uint64","numberOfBytes":"8"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"},"t_userDefinedValueType(GameType)103271":{"encoding":"inplace","label":"GameType","numberOfBytes":"4"}}},"userdoc":{"version":1,"kind":"user","methods":{"blacklistDisputeGame(address)":{"notice":"Blacklists a dispute game. Should only be used in the event that a dispute game resolves incorrectly."},"checkWithdrawal(bytes32,address)":{"notice":"Checks if a withdrawal can be finalized. This function will revert if the withdrawal cannot be finalized, and otherwise has no side-effects."},"constructor":{"notice":"Constructs the OptimismPortal contract."},"depositTransaction(address,uint256,uint64,bool,bytes)":{"notice":"Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in deriving deposit transactions. Note that if a deposit is made by a contract, its address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider using the CrossDomainMessenger contracts for a simpler developer experience."},"disputeGameBlacklist(address)":{"notice":"A mapping of dispute game addresses to whether or not they are blacklisted."},"disputeGameFactory()":{"notice":"Address of the DisputeGameFactory."},"disputeGameFinalityDelaySeconds()":{"notice":"Getter for the dispute game finality delay."},"donateETH()":{"notice":"Accepts ETH value without triggering a deposit to L2. This function mainly exists for the sake of the migration between the legacy Optimism system and Bedrock."},"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))":{"notice":"Finalizes a withdrawal transaction."},"finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes),address)":{"notice":"Finalizes a withdrawal transaction, using an external proof submitter."},"finalizedWithdrawals(bytes32)":{"notice":"A list of withdrawal hashes which have been successfully finalized."},"guardian()":{"notice":"Getter function for the address of the guardian. Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead."},"initialize(address,address,address,uint32)":{"notice":"Initializer."},"l2Sender()":{"notice":"Address of the L2 account which initiated a withdrawal in this transaction. If the of this variable is the default L2 sender address, then we are NOT inside of a call to finalizeWithdrawalTransaction."},"minimumGasLimit(uint64)":{"notice":"Computes the minimum gas limit for a deposit. The minimum gas limit linearly increases based on the size of the calldata. This is to prevent users from creating L2 resource usage without paying for it. This function can be used when interacting with the portal to ensure forwards compatibility."},"numProofSubmitters(bytes32)":{"notice":"External getter for the number of proof submitters for a withdrawal hash."},"params()":{"notice":"EIP-1559 style gas parameters."},"paused()":{"notice":"Getter for the current paused status."},"proofMaturityDelaySeconds()":{"notice":"Getter for the proof maturity delay."},"proofSubmitters(bytes32,uint256)":{"notice":"Mapping of withdrawal hashes to addresses that have submitted a proof for the withdrawal."},"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])":{"notice":"Proves a withdrawal transaction."},"provenWithdrawals(bytes32,address)":{"notice":"A mapping of withdrawal hashes to proof submitters to `ProvenWithdrawal` data."},"respectedGameType()":{"notice":"The game type that the OptimismPortal consults for output proposals."},"respectedGameTypeUpdatedAt()":{"notice":"The timestamp at which the respected game type was last updated."},"setRespectedGameType(uint32)":{"notice":"Sets the respected game type. Changing this value can alter the security properties of the system, depending on the new game's behavior."},"superchainConfig()":{"notice":"Contract of the Superchain Config."},"systemConfig()":{"notice":"Contract of the SystemConfig."},"version()":{"notice":"Semantic version."}},"events":{"TransactionDeposited(address,address,uint256,bytes)":{"notice":"Emitted when a transaction is deposited from L1 to L2. The parameters of this event are read by the rollup node and used to derive deposit transactions on L2."},"WithdrawalFinalized(bytes32,bool)":{"notice":"Emitted when a withdrawal transaction is finalized."},"WithdrawalProven(bytes32,address,address)":{"notice":"Emitted when a withdrawal transaction is proven."}},"errors":{"BadTarget()":[{"notice":"Error for when a deposit or withdrawal is to a bad target."}],"CallPaused()":[{"notice":"Error for when a method cannot be called when paused. This could be renamed to `Paused` in the future, but it collides with the `Paused` event."}],"GasEstimation()":[{"notice":"Error for special gas estimation."}],"LargeCalldata()":[{"notice":"Error for when a deposit has too much calldata."}],"OutOfGas()":[{"notice":"Error returned when too much gas resource is consumed."}],"SmallGasLimit()":[{"notice":"Error for when a deposit has too small of a gas limit."}],"Unauthorized()":[{"notice":"Error for an unauthorized CALLER."}]},"notice":"The OptimismPortal is a low-level contract responsible for passing messages between L1 and L2. Messages sent directly to the OptimismPortal have no form of replayability. Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface."},"devdoc":{"version":1,"kind":"dev","methods":{"blacklistDisputeGame(address)":{"params":{"_disputeGame":"Dispute game to blacklist."}},"checkWithdrawal(bytes32,address)":{"params":{"_proofSubmitter":"The submitter of the proof for the withdrawal hash","_withdrawalHash":"Hash of the withdrawal to check."}},"depositTransaction(address,uint256,uint64,bool,bytes)":{"params":{"_data":"Data to trigger the recipient with.","_gasLimit":"Amount of L2 gas to purchase by burning gas on L1.","_isCreation":"Whether or not the transaction is a contract creation.","_to":"Target address on L2.","_value":"ETH value to send to the recipient."}},"finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))":{"params":{"_tx":"Withdrawal transaction to finalize."}},"finalizeWithdrawalTransactionExternalProof((uint256,address,address,uint256,uint256,bytes),address)":{"params":{"_proofSubmitter":"Address of the proof submitter.","_tx":"Withdrawal transaction to finalize."}},"guardian()":{"returns":{"_0":"Address of the guardian."}},"initialize(address,address,address,uint32)":{"params":{"_disputeGameFactory":"Contract of the DisputeGameFactory.","_superchainConfig":"Contract of the SuperchainConfig.","_systemConfig":"Contract of the SystemConfig."}},"minimumGasLimit(uint64)":{"params":{"_byteCount":"Number of bytes in the calldata."},"returns":{"_0":"The minimum gas limit for a deposit."}},"numProofSubmitters(bytes32)":{"params":{"_withdrawalHash":"Hash of the withdrawal."},"returns":{"_0":"The number of proof submitters for the withdrawal hash."}},"proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])":{"params":{"_disputeGameIndex":"Index of the dispute game to prove the withdrawal against.","_outputRootProof":"Inclusion proof of the L2ToL1MessagePasser contract's storage root.","_tx":"Withdrawal transaction to finalize.","_withdrawalProof":"Inclusion proof of the withdrawal in L2ToL1MessagePasser contract."}},"setRespectedGameType(uint32)":{"params":{"_gameType":"The game type to consult for output proposals."}}},"events":{"TransactionDeposited(address,address,uint256,bytes)":{"params":{"from":"Address that triggered the deposit transaction.","opaqueData":"ABI encoded deposit data to be parsed off-chain.","to":"Address that the deposit transaction is directed to.","version":"Version of this deposit transaction event."}},"WithdrawalFinalized(bytes32,bool)":{"params":{"success":"Whether the withdrawal transaction was successful.","withdrawalHash":"Hash of the withdrawal transaction."}},"WithdrawalProven(bytes32,address,address)":{"params":{"from":"Address that triggered the withdrawal transaction.","to":"Address that the withdrawal transaction is directed to.","withdrawalHash":"Hash of the withdrawal transaction."}}}},"ast":{"absolutePath":"src/L1/OptimismPortal2.sol","id":87972,"exportedSymbols":{"AddressAliasHelper":[111913],"BadTarget":[103969],"BondAmount":[103259],"CallPaused":[103990],"Claim":[103255],"ClaimHash":[103257],"Clock":[103267],"Constants":[103096],"DisputeGameFactory":[97682],"Duration":[103263],"GameId":[103265],"GameStatus":[103277],"GameType":[103271],"GameTypes":[103317],"GasEstimation":[103993],"Hash":[103253],"Hashing":[103936],"IDisputeGame":[100327],"ISemver":[109417],"Initializable":[49678],"LargeCalldata":[103972],"LibClaim":[101086],"LibClock":[101073],"LibDuration":[101099],"LibGameId":[100778],"LibGameType":[101151],"LibHash":[101112],"LibHashing":[100800],"LibPosition":[101018],"LibTimestamp":[101125],"LibVMStatus":[101138],"LocalPreimageKey":[103373],"NoValue":[103984],"OnlyCustomGasToken":[103981],"OptimismPortal2":[87971],"OutputRoot":[103283],"Position":[103269],"ResourceMetering":[88581],"SafeCall":[104213],"SecureMerkleTrie":[106033],"SmallGasLimit":[103975],"SuperchainConfig":[88793],"SystemConfig":[89607],"Timestamp":[103261],"TransferFailed":[103978],"Types":[104349],"Unauthorized":[103987],"VMStatus":[103273],"VMStatuses":[103351]},"nodeType":"SourceUnit","src":"32:24886:135","nodes":[{"id":87106,"nodeType":"PragmaDirective","src":"32:23:135","nodes":[],"literals":["solidity","0.8",".15"]},{"id":87108,"nodeType":"ImportDirective","src":"57:86:135","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol","file":"@openzeppelin/contracts/proxy/utils/Initializable.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":49679,"symbolAliases":[{"foreign":{"id":87107,"name":"Initializable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":49678,"src":"66:13:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87110,"nodeType":"ImportDirective","src":"144:54:135","nodes":[],"absolutePath":"src/libraries/SafeCall.sol","file":"src/libraries/SafeCall.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":104214,"symbolAliases":[{"foreign":{"id":87109,"name":"SafeCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104213,"src":"153:8:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87113,"nodeType":"ImportDirective","src":"199:86:135","nodes":[],"absolutePath":"src/dispute/DisputeGameFactory.sol","file":"src/dispute/DisputeGameFactory.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":97683,"symbolAliases":[{"foreign":{"id":87111,"name":"DisputeGameFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97682,"src":"208:18:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":87112,"name":"IDisputeGame","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":100327,"src":"228:12:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87115,"nodeType":"ImportDirective","src":"286:55:135","nodes":[],"absolutePath":"src/L1/SystemConfig.sol","file":"src/L1/SystemConfig.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":89608,"symbolAliases":[{"foreign":{"id":87114,"name":"SystemConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89607,"src":"295:12:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87117,"nodeType":"ImportDirective","src":"342:63:135","nodes":[],"absolutePath":"src/L1/SuperchainConfig.sol","file":"src/L1/SuperchainConfig.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":88794,"symbolAliases":[{"foreign":{"id":87116,"name":"SuperchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88793,"src":"351:16:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87119,"nodeType":"ImportDirective","src":"406:56:135","nodes":[],"absolutePath":"src/libraries/Constants.sol","file":"src/libraries/Constants.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":103097,"symbolAliases":[{"foreign":{"id":87118,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"415:9:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87121,"nodeType":"ImportDirective","src":"463:48:135","nodes":[],"absolutePath":"src/libraries/Types.sol","file":"src/libraries/Types.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":104350,"symbolAliases":[{"foreign":{"id":87120,"name":"Types","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104349,"src":"472:5:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87123,"nodeType":"ImportDirective","src":"512:52:135","nodes":[],"absolutePath":"src/libraries/Hashing.sol","file":"src/libraries/Hashing.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":103937,"symbolAliases":[{"foreign":{"id":87122,"name":"Hashing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103936,"src":"521:7:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87125,"nodeType":"ImportDirective","src":"565:75:135","nodes":[],"absolutePath":"src/libraries/trie/SecureMerkleTrie.sol","file":"src/libraries/trie/SecureMerkleTrie.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":106034,"symbolAliases":[{"foreign":{"id":87124,"name":"SecureMerkleTrie","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106033,"src":"574:16:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87127,"nodeType":"ImportDirective","src":"641:71:135","nodes":[],"absolutePath":"src/vendor/AddressAliasHelper.sol","file":"src/vendor/AddressAliasHelper.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":111914,"symbolAliases":[{"foreign":{"id":87126,"name":"AddressAliasHelper","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111913,"src":"650:18:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87129,"nodeType":"ImportDirective","src":"713:63:135","nodes":[],"absolutePath":"src/L1/ResourceMetering.sol","file":"src/L1/ResourceMetering.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":88582,"symbolAliases":[{"foreign":{"id":87128,"name":"ResourceMetering","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88581,"src":"722:16:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87131,"nodeType":"ImportDirective","src":"777:52:135","nodes":[],"absolutePath":"src/universal/ISemver.sol","file":"src/universal/ISemver.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":109418,"symbolAliases":[{"foreign":{"id":87130,"name":"ISemver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":109417,"src":"786:7:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87133,"nodeType":"ImportDirective","src":"830:56:135","nodes":[],"absolutePath":"src/libraries/Constants.sol","file":"src/libraries/Constants.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":103097,"symbolAliases":[{"foreign":{"id":87132,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"839:9:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":87134,"nodeType":"ImportDirective","src":"888:40:135","nodes":[],"absolutePath":"src/libraries/PortalErrors.sol","file":"src/libraries/PortalErrors.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":103994,"symbolAliases":[],"unitAlias":""},{"id":87135,"nodeType":"ImportDirective","src":"929:40:135","nodes":[],"absolutePath":"src/libraries/DisputeTypes.sol","file":"src/libraries/DisputeTypes.sol","nameLocation":"-1:-1:-1","scope":87972,"sourceUnit":103374,"symbolAliases":[],"unitAlias":""},{"id":87971,"nodeType":"ContractDefinition","src":"1310:23607:135","nodes":[{"id":87148,"nodeType":"StructDefinition","src":"1635:96:135","nodes":[],"canonicalName":"OptimismPortal2.ProvenWithdrawal","members":[{"constant":false,"id":87145,"mutability":"mutable","name":"disputeGameProxy","nameLocation":"1682:16:135","nodeType":"VariableDeclaration","scope":87148,"src":"1669:29:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"},"typeName":{"id":87144,"nodeType":"UserDefinedTypeName","pathNode":{"id":87143,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"1669:12:135"},"referencedDeclaration":100327,"src":"1669:12:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"visibility":"internal"},{"constant":false,"id":87147,"mutability":"mutable","name":"timestamp","nameLocation":"1715:9:135","nodeType":"VariableDeclaration","scope":87148,"src":"1708:16:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":87146,"name":"uint64","nodeType":"ElementaryTypeName","src":"1708:6:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"name":"ProvenWithdrawal","nameLocation":"1642:16:135","scope":87971,"visibility":"public"},{"id":87151,"nodeType":"VariableDeclaration","src":"1841:55:135","nodes":[],"constant":false,"documentation":{"id":87149,"nodeType":"StructuredDocumentation","src":"1737:99:135","text":"@notice The delay between when a withdrawal transaction is proven and when it may be finalized."},"mutability":"immutable","name":"PROOF_MATURITY_DELAY_SECONDS","nameLocation":"1868:28:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87150,"name":"uint256","nodeType":"ElementaryTypeName","src":"1841:7:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"id":87154,"nodeType":"VariableDeclaration","src":"2043:62:135","nodes":[],"constant":false,"documentation":{"id":87152,"nodeType":"StructuredDocumentation","src":"1903:135:135","text":"@notice The delay between when a dispute game is resolved and when a withdrawal proven against it may be\n finalized."},"mutability":"immutable","name":"DISPUTE_GAME_FINALITY_DELAY_SECONDS","nameLocation":"2070:35:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87153,"name":"uint256","nodeType":"ElementaryTypeName","src":"2043:7:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"id":87158,"nodeType":"VariableDeclaration","src":"2158:45:135","nodes":[],"constant":true,"documentation":{"id":87155,"nodeType":"StructuredDocumentation","src":"2112:41:135","text":"@notice Version of the deposit event."},"mutability":"constant","name":"DEPOSIT_VERSION","nameLocation":"2184:15:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87156,"name":"uint256","nodeType":"ElementaryTypeName","src":"2158:7:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30","id":87157,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2202:1:135","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"visibility":"internal"},{"id":87162,"nodeType":"VariableDeclaration","src":"2299:60:135","nodes":[],"constant":true,"documentation":{"id":87159,"nodeType":"StructuredDocumentation","src":"2210:84:135","text":"@notice The L2 gas limit set when eth is deposited using the receive() function."},"mutability":"constant","name":"RECEIVE_DEFAULT_GAS_LIMIT","nameLocation":"2324:25:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":87160,"name":"uint64","nodeType":"ElementaryTypeName","src":"2299:6:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"value":{"hexValue":"3130305f303030","id":87161,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2352:7:135","typeDescriptions":{"typeIdentifier":"t_rational_100000_by_1","typeString":"int_const 100000"},"value":"100_000"},"visibility":"internal"},{"id":87165,"nodeType":"VariableDeclaration","src":"2615:23:135","nodes":[],"constant":false,"documentation":{"id":87163,"nodeType":"StructuredDocumentation","src":"2366:244:135","text":"@notice Address of the L2 account which initiated a withdrawal in this transaction.\n If the of this variable is the default L2 sender address, then we are NOT inside of\n a call to finalizeWithdrawalTransaction."},"functionSelector":"9bf62d82","mutability":"mutable","name":"l2Sender","nameLocation":"2630:8:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87164,"name":"address","nodeType":"ElementaryTypeName","src":"2615:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":87170,"nodeType":"VariableDeclaration","src":"2729:52:135","nodes":[],"constant":false,"documentation":{"id":87166,"nodeType":"StructuredDocumentation","src":"2645:79:135","text":"@notice A list of withdrawal hashes which have been successfully finalized."},"functionSelector":"a14238e7","mutability":"mutable","name":"finalizedWithdrawals","nameLocation":"2761:20:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"},"typeName":{"id":87169,"keyType":{"id":87167,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2737:7:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"2729:24:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"},"valueType":{"id":87168,"name":"bool","nodeType":"ElementaryTypeName","src":"2748:4:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}},"visibility":"public"},{"id":87173,"nodeType":"VariableDeclaration","src":"2930:30:135","nodes":[],"constant":false,"documentation":{"id":87171,"nodeType":"StructuredDocumentation","src":"2788:137:135","text":"@custom:legacy\n @custom:spacer provenWithdrawals\n @notice Spacer taking up the legacy `provenWithdrawals` mapping slot."},"mutability":"mutable","name":"spacer_52_0_32","nameLocation":"2946:14:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":87172,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2930:7:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"private"},{"id":87176,"nodeType":"VariableDeclaration","src":"3072:26:135","nodes":[],"constant":false,"documentation":{"id":87174,"nodeType":"StructuredDocumentation","src":"2967:100:135","text":"@custom:legacy\n @custom:spacer paused\n @notice Spacer for backwards compatibility."},"mutability":"mutable","name":"spacer_53_0_1","nameLocation":"3085:13:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":87175,"name":"bool","nodeType":"ElementaryTypeName","src":"3072:4:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"private"},{"id":87180,"nodeType":"VariableDeclaration","src":"3156:40:135","nodes":[],"constant":false,"documentation":{"id":87177,"nodeType":"StructuredDocumentation","src":"3105:46:135","text":"@notice Contract of the Superchain Config."},"functionSelector":"35e80ab3","mutability":"mutable","name":"superchainConfig","nameLocation":"3180:16:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},"typeName":{"id":87179,"nodeType":"UserDefinedTypeName","pathNode":{"id":87178,"name":"SuperchainConfig","nodeType":"IdentifierPath","referencedDeclaration":88793,"src":"3156:16:135"},"referencedDeclaration":88793,"src":"3156:16:135","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"visibility":"public"},{"id":87183,"nodeType":"VariableDeclaration","src":"3327:30:135","nodes":[],"constant":false,"documentation":{"id":87181,"nodeType":"StructuredDocumentation","src":"3203:119:135","text":"@custom:legacy\n @custom:spacer l2Oracle\n @notice Spacer taking up the legacy `l2Oracle` address slot."},"mutability":"mutable","name":"spacer_54_0_20","nameLocation":"3343:14:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87182,"name":"address","nodeType":"ElementaryTypeName","src":"3327:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"private"},{"id":87187,"nodeType":"VariableDeclaration","src":"3443:32:135","nodes":[],"constant":false,"documentation":{"id":87184,"nodeType":"StructuredDocumentation","src":"3364:74:135","text":"@notice Contract of the SystemConfig.\n @custom:network-specific"},"functionSelector":"33d7e2bd","mutability":"mutable","name":"systemConfig","nameLocation":"3463:12:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"},"typeName":{"id":87186,"nodeType":"UserDefinedTypeName","pathNode":{"id":87185,"name":"SystemConfig","nodeType":"IdentifierPath","referencedDeclaration":89607,"src":"3443:12:135"},"referencedDeclaration":89607,"src":"3443:12:135","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"visibility":"public"},{"id":87191,"nodeType":"VariableDeclaration","src":"3566:44:135","nodes":[],"constant":false,"documentation":{"id":87188,"nodeType":"StructuredDocumentation","src":"3482:79:135","text":"@notice Address of the DisputeGameFactory.\n @custom:network-specific"},"functionSelector":"f2b4e617","mutability":"mutable","name":"disputeGameFactory","nameLocation":"3592:18:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_DisputeGameFactory_$97682","typeString":"contract DisputeGameFactory"},"typeName":{"id":87190,"nodeType":"UserDefinedTypeName","pathNode":{"id":87189,"name":"DisputeGameFactory","nodeType":"IdentifierPath","referencedDeclaration":97682,"src":"3566:18:135"},"referencedDeclaration":97682,"src":"3566:18:135","typeDescriptions":{"typeIdentifier":"t_contract$_DisputeGameFactory_$97682","typeString":"contract DisputeGameFactory"}},"visibility":"public"},{"id":87199,"nodeType":"VariableDeclaration","src":"3712:81:135","nodes":[],"constant":false,"documentation":{"id":87192,"nodeType":"StructuredDocumentation","src":"3617:90:135","text":"@notice A mapping of withdrawal hashes to proof submitters to `ProvenWithdrawal` data."},"functionSelector":"bb2c727e","mutability":"mutable","name":"provenWithdrawals","nameLocation":"3776:17:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_mapping$_t_address_$_t_struct$_ProvenWithdrawal_$87148_storage_$_$","typeString":"mapping(bytes32 => mapping(address => struct OptimismPortal2.ProvenWithdrawal))"},"typeName":{"id":87198,"keyType":{"id":87193,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3720:7:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"3712:56:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_mapping$_t_address_$_t_struct$_ProvenWithdrawal_$87148_storage_$_$","typeString":"mapping(bytes32 => mapping(address => struct OptimismPortal2.ProvenWithdrawal))"},"valueType":{"id":87197,"keyType":{"id":87194,"name":"address","nodeType":"ElementaryTypeName","src":"3739:7:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"3731:36:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_ProvenWithdrawal_$87148_storage_$","typeString":"mapping(address => struct OptimismPortal2.ProvenWithdrawal)"},"valueType":{"id":87196,"nodeType":"UserDefinedTypeName","pathNode":{"id":87195,"name":"ProvenWithdrawal","nodeType":"IdentifierPath","referencedDeclaration":87148,"src":"3750:16:135"},"referencedDeclaration":87148,"src":"3750:16:135","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$87148_storage_ptr","typeString":"struct OptimismPortal2.ProvenWithdrawal"}}}},"visibility":"public"},{"id":87205,"nodeType":"VariableDeclaration","src":"3892:57:135","nodes":[],"constant":false,"documentation":{"id":87200,"nodeType":"StructuredDocumentation","src":"3800:87:135","text":"@notice A mapping of dispute game addresses to whether or not they are blacklisted."},"functionSelector":"45884d32","mutability":"mutable","name":"disputeGameBlacklist","nameLocation":"3929:20:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IDisputeGame_$100327_$_t_bool_$","typeString":"mapping(contract IDisputeGame => bool)"},"typeName":{"id":87204,"keyType":{"id":87202,"nodeType":"UserDefinedTypeName","pathNode":{"id":87201,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"3900:12:135"},"referencedDeclaration":100327,"src":"3900:12:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"nodeType":"Mapping","src":"3892:29:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IDisputeGame_$100327_$_t_bool_$","typeString":"mapping(contract IDisputeGame => bool)"},"valueType":{"id":87203,"name":"bool","nodeType":"ElementaryTypeName","src":"3916:4:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}},"visibility":"public"},{"id":87209,"nodeType":"VariableDeclaration","src":"4041:33:135","nodes":[],"constant":false,"documentation":{"id":87206,"nodeType":"StructuredDocumentation","src":"3956:80:135","text":"@notice The game type that the OptimismPortal consults for output proposals."},"functionSelector":"3c9f397c","mutability":"mutable","name":"respectedGameType","nameLocation":"4057:17:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":87208,"nodeType":"UserDefinedTypeName","pathNode":{"id":87207,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"4041:8:135"},"referencedDeclaration":103271,"src":"4041:8:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"public"},{"id":87212,"nodeType":"VariableDeclaration","src":"4162:40:135","nodes":[],"constant":false,"documentation":{"id":87210,"nodeType":"StructuredDocumentation","src":"4081:76:135","text":"@notice The timestamp at which the respected game type was last updated."},"functionSelector":"4fd0434c","mutability":"mutable","name":"respectedGameTypeUpdatedAt","nameLocation":"4176:26:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":87211,"name":"uint64","nodeType":"ElementaryTypeName","src":"4162:6:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"public"},{"id":87218,"nodeType":"VariableDeclaration","src":"4315:52:135","nodes":[],"constant":false,"documentation":{"id":87213,"nodeType":"StructuredDocumentation","src":"4209:101:135","text":"@notice Mapping of withdrawal hashes to addresses that have submitted a proof for the withdrawal."},"functionSelector":"a3860f48","mutability":"mutable","name":"proofSubmitters","nameLocation":"4352:15:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_array$_t_address_$dyn_storage_$","typeString":"mapping(bytes32 => address[])"},"typeName":{"id":87217,"keyType":{"id":87214,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4323:7:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"4315:29:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_array$_t_address_$dyn_storage_$","typeString":"mapping(bytes32 => address[])"},"valueType":{"baseType":{"id":87215,"name":"address","nodeType":"ElementaryTypeName","src":"4334:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":87216,"nodeType":"ArrayTypeName","src":"4334:9:135","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}}},"visibility":"public"},{"id":87229,"nodeType":"EventDefinition","src":"4878:112:135","nodes":[],"anonymous":false,"documentation":{"id":87219,"nodeType":"StructuredDocumentation","src":"4374:499:135","text":"@notice Emitted when a transaction is deposited from L1 to L2.\n The parameters of this event are read by the rollup node and used to derive deposit\n transactions on L2.\n @param from Address that triggered the deposit transaction.\n @param to Address that the deposit transaction is directed to.\n @param version Version of this deposit transaction event.\n @param opaqueData ABI encoded deposit data to be parsed off-chain."},"eventSelector":"b3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32","name":"TransactionDeposited","nameLocation":"4884:20:135","parameters":{"id":87228,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87221,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"4921:4:135","nodeType":"VariableDeclaration","scope":87229,"src":"4905:20:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87220,"name":"address","nodeType":"ElementaryTypeName","src":"4905:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":87223,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"4943:2:135","nodeType":"VariableDeclaration","scope":87229,"src":"4927:18:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87222,"name":"address","nodeType":"ElementaryTypeName","src":"4927:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":87225,"indexed":true,"mutability":"mutable","name":"version","nameLocation":"4963:7:135","nodeType":"VariableDeclaration","scope":87229,"src":"4947:23:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87224,"name":"uint256","nodeType":"ElementaryTypeName","src":"4947:7:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":87227,"indexed":false,"mutability":"mutable","name":"opaqueData","nameLocation":"4978:10:135","nodeType":"VariableDeclaration","scope":87229,"src":"4972:16:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":87226,"name":"bytes","nodeType":"ElementaryTypeName","src":"4972:5:135","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4904:85:135"}},{"id":87238,"nodeType":"EventDefinition","src":"5294:97:135","nodes":[],"anonymous":false,"documentation":{"id":87230,"nodeType":"StructuredDocumentation","src":"4996:293:135","text":"@notice Emitted when a withdrawal transaction is proven.\n @param withdrawalHash Hash of the withdrawal transaction.\n @param from Address that triggered the withdrawal transaction.\n @param to Address that the withdrawal transaction is directed to."},"eventSelector":"67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f62","name":"WithdrawalProven","nameLocation":"5300:16:135","parameters":{"id":87237,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87232,"indexed":true,"mutability":"mutable","name":"withdrawalHash","nameLocation":"5333:14:135","nodeType":"VariableDeclaration","scope":87238,"src":"5317:30:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":87231,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5317:7:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":87234,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"5365:4:135","nodeType":"VariableDeclaration","scope":87238,"src":"5349:20:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87233,"name":"address","nodeType":"ElementaryTypeName","src":"5349:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":87236,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"5387:2:135","nodeType":"VariableDeclaration","scope":87238,"src":"5371:18:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87235,"name":"address","nodeType":"ElementaryTypeName","src":"5371:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5316:74:135"}},{"id":87245,"nodeType":"EventDefinition","src":"5612:72:135","nodes":[],"anonymous":false,"documentation":{"id":87239,"nodeType":"StructuredDocumentation","src":"5397:210:135","text":"@notice Emitted when a withdrawal transaction is finalized.\n @param withdrawalHash Hash of the withdrawal transaction.\n @param success Whether the withdrawal transaction was successful."},"eventSelector":"db5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b","name":"WithdrawalFinalized","nameLocation":"5618:19:135","parameters":{"id":87244,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87241,"indexed":true,"mutability":"mutable","name":"withdrawalHash","nameLocation":"5654:14:135","nodeType":"VariableDeclaration","scope":87245,"src":"5638:30:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":87240,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5638:7:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":87243,"indexed":false,"mutability":"mutable","name":"success","nameLocation":"5675:7:135","nodeType":"VariableDeclaration","scope":87245,"src":"5670:12:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":87242,"name":"bool","nodeType":"ElementaryTypeName","src":"5670:4:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"5637:46:135"}},{"id":87256,"nodeType":"ModifierDefinition","src":"5727:86:135","nodes":[],"body":{"id":87255,"nodeType":"Block","src":"5752:61:135","nodes":[],"statements":[{"condition":{"arguments":[],"expression":{"argumentTypes":[],"id":87248,"name":"paused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87383,"src":"5766:6:135","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bool_$","typeString":"function () view returns (bool)"}},"id":87249,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5766:8:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87253,"nodeType":"IfStatement","src":"5762:33:135","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":87250,"name":"CallPaused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103990,"src":"5783:10:135","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":87251,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5783:12:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87252,"nodeType":"RevertStatement","src":"5776:19:135"}},{"id":87254,"nodeType":"PlaceholderStatement","src":"5805:1:135"}]},"documentation":{"id":87246,"nodeType":"StructuredDocumentation","src":"5690:32:135","text":"@notice Reverts when paused."},"name":"whenNotPaused","nameLocation":"5736:13:135","parameters":{"id":87247,"nodeType":"ParameterList","parameters":[],"src":"5749:2:135"},"virtual":false,"visibility":"internal"},{"id":87260,"nodeType":"VariableDeclaration","src":"5882:40:135","nodes":[],"baseFunctions":[109416],"constant":true,"documentation":{"id":87257,"nodeType":"StructuredDocumentation","src":"5819:58:135","text":"@notice Semantic version.\n @custom:semver 3.8.0"},"functionSelector":"54fd4d50","mutability":"constant","name":"version","nameLocation":"5905:7:135","scope":87971,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":87258,"name":"string","nodeType":"ElementaryTypeName","src":"5882:6:135","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"hexValue":"332e382e30","id":87259,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5915:7:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_f9c59c463d339610f985b3aa69b5b5031ed3afd32f941c9c4c60b492e8c1a90f","typeString":"literal_string \"3.8.0\""},"value":"3.8.0"},"visibility":"public"},{"id":87302,"nodeType":"FunctionDefinition","src":"5985:513:135","nodes":[],"body":{"id":87301,"nodeType":"Block","src":"6075:423:135","nodes":[],"statements":[{"expression":{"id":87270,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87268,"name":"PROOF_MATURITY_DELAY_SECONDS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87151,"src":"6085:28:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":87269,"name":"_proofMaturityDelaySeconds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87263,"src":"6116:26:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6085:57:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":87271,"nodeType":"ExpressionStatement","src":"6085:57:135"},{"expression":{"id":87274,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87272,"name":"DISPUTE_GAME_FINALITY_DELAY_SECONDS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87154,"src":"6152:35:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":87273,"name":"_disputeGameFinalityDelaySeconds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87265,"src":"6190:32:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6152:70:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":87275,"nodeType":"ExpressionStatement","src":"6152:70:135"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30","id":87280,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6306:1:135","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":87279,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6298:7:135","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":87278,"name":"address","nodeType":"ElementaryTypeName","src":"6298:7:135","typeDescriptions":{}}},"id":87281,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6298:10:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":87277,"name":"DisputeGameFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":97682,"src":"6279:18:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DisputeGameFactory_$97682_$","typeString":"type(contract DisputeGameFactory)"}},"id":87282,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6279:30:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_DisputeGameFactory_$97682","typeString":"contract DisputeGameFactory"}},{"arguments":[{"arguments":[{"hexValue":"30","id":87286,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6359:1:135","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":87285,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6351:7:135","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":87284,"name":"address","nodeType":"ElementaryTypeName","src":"6351:7:135","typeDescriptions":{}}},"id":87287,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6351:10:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":87283,"name":"SystemConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":89607,"src":"6338:12:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SystemConfig_$89607_$","typeString":"type(contract SystemConfig)"}},"id":87288,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6338:24:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},{"arguments":[{"arguments":[{"hexValue":"30","id":87292,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6420:1:135","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":87291,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6412:7:135","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":87290,"name":"address","nodeType":"ElementaryTypeName","src":"6412:7:135","typeDescriptions":{}}},"id":87293,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6412:10:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":87289,"name":"SuperchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88793,"src":"6395:16:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SuperchainConfig_$88793_$","typeString":"type(contract SuperchainConfig)"}},"id":87294,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6395:28:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},{"arguments":[{"hexValue":"30","id":87297,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6478:1:135","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"}],"expression":{"id":87295,"name":"GameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103271,"src":"6464:8:135","typeDescriptions":{"typeIdentifier":"t_type$_t_userDefinedValueType$_GameType_$103271_$","typeString":"type(GameType)"}},"id":87296,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"wrap","nodeType":"MemberAccess","src":"6464:13:135","typeDescriptions":{"typeIdentifier":"t_function_wrap_pure$_t_uint32_$returns$_t_userDefinedValueType$_GameType_$103271_$","typeString":"function (uint32) pure returns (GameType)"}},"id":87298,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6464:16:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_DisputeGameFactory_$97682","typeString":"contract DisputeGameFactory"},{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"},{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}],"id":87276,"name":"initialize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87361,"src":"6233:10:135","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_DisputeGameFactory_$97682_$_t_contract$_SystemConfig_$89607_$_t_contract$_SuperchainConfig_$88793_$_t_userDefinedValueType$_GameType_$103271_$returns$__$","typeString":"function (contract DisputeGameFactory,contract SystemConfig,contract SuperchainConfig,GameType)"}},"id":87299,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_disputeGameFactory","_systemConfig","_superchainConfig","_initialRespectedGameType"],"nodeType":"FunctionCall","src":"6233:258:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87300,"nodeType":"ExpressionStatement","src":"6233:258:135"}]},"documentation":{"id":87261,"nodeType":"StructuredDocumentation","src":"5929:51:135","text":"@notice Constructs the OptimismPortal contract."},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":87266,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87263,"mutability":"mutable","name":"_proofMaturityDelaySeconds","nameLocation":"6005:26:135","nodeType":"VariableDeclaration","scope":87302,"src":"5997:34:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87262,"name":"uint256","nodeType":"ElementaryTypeName","src":"5997:7:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":87265,"mutability":"mutable","name":"_disputeGameFinalityDelaySeconds","nameLocation":"6041:32:135","nodeType":"VariableDeclaration","scope":87302,"src":"6033:40:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87264,"name":"uint256","nodeType":"ElementaryTypeName","src":"6033:7:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5996:78:135"},"returnParameters":{"id":87267,"nodeType":"ParameterList","parameters":[],"src":"6075:0:135"},"scope":87971,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":87361,"nodeType":"FunctionDefinition","src":"6730:971:135","nodes":[],"body":{"id":87360,"nodeType":"Block","src":"6967:734:135","nodes":[],"statements":[{"expression":{"id":87322,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87320,"name":"disputeGameFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87191,"src":"6977:18:135","typeDescriptions":{"typeIdentifier":"t_contract$_DisputeGameFactory_$97682","typeString":"contract DisputeGameFactory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":87321,"name":"_disputeGameFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87306,"src":"6998:19:135","typeDescriptions":{"typeIdentifier":"t_contract$_DisputeGameFactory_$97682","typeString":"contract DisputeGameFactory"}},"src":"6977:40:135","typeDescriptions":{"typeIdentifier":"t_contract$_DisputeGameFactory_$97682","typeString":"contract DisputeGameFactory"}},"id":87323,"nodeType":"ExpressionStatement","src":"6977:40:135"},{"expression":{"id":87326,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87324,"name":"systemConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87187,"src":"7027:12:135","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":87325,"name":"_systemConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87309,"src":"7042:13:135","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"src":"7027:28:135","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"id":87327,"nodeType":"ExpressionStatement","src":"7027:28:135"},{"expression":{"id":87330,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87328,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87180,"src":"7065:16:135","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":87329,"name":"_superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87312,"src":"7084:17:135","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"src":"7065:36:135","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":87331,"nodeType":"ExpressionStatement","src":"7065:36:135"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":87337,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":87332,"name":"l2Sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87165,"src":"7249:8:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":87335,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7269:1:135","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":87334,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7261:7:135","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":87333,"name":"address","nodeType":"ElementaryTypeName","src":"7261:7:135","typeDescriptions":{}}},"id":87336,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7261:10:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7249:22:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87356,"nodeType":"IfStatement","src":"7245:414:135","trueBody":{"id":87355,"nodeType":"Block","src":"7273:386:135","statements":[{"expression":{"id":87341,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87338,"name":"l2Sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87165,"src":"7287:8:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":87339,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"7298:9:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Constants_$103096_$","typeString":"type(library Constants)"}},"id":87340,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"DEFAULT_L2_SENDER","nodeType":"MemberAccess","referencedDeclaration":103058,"src":"7298:27:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7287:38:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":87342,"nodeType":"ExpressionStatement","src":"7287:38:135"},{"expression":{"id":87349,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87343,"name":"respectedGameTypeUpdatedAt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87212,"src":"7485:26:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":87346,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"7521:5:135","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":87347,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"7521:15:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":87345,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7514:6:135","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":87344,"name":"uint64","nodeType":"ElementaryTypeName","src":"7514:6:135","typeDescriptions":{}}},"id":87348,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7514:23:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"7485:52:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"id":87350,"nodeType":"ExpressionStatement","src":"7485:52:135"},{"expression":{"id":87353,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87351,"name":"respectedGameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87209,"src":"7603:17:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":87352,"name":"_initialRespectedGameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87315,"src":"7623:25:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"src":"7603:45:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"id":87354,"nodeType":"ExpressionStatement","src":"7603:45:135"}]}},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":87357,"name":"__ResourceMetering_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":88580,"src":"7669:23:135","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":87358,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7669:25:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87359,"nodeType":"ExpressionStatement","src":"7669:25:135"}]},"documentation":{"id":87303,"nodeType":"StructuredDocumentation","src":"6504:221:135","text":"@notice Initializer.\n @param _disputeGameFactory Contract of the DisputeGameFactory.\n @param _systemConfig Contract of the SystemConfig.\n @param _superchainConfig Contract of the SuperchainConfig."},"functionSelector":"8e819e54","implemented":true,"kind":"function","modifiers":[{"id":87318,"kind":"modifierInvocation","modifierName":{"id":87317,"name":"initializer","nodeType":"IdentifierPath","referencedDeclaration":49598,"src":"6951:11:135"},"nodeType":"ModifierInvocation","src":"6951:11:135"}],"name":"initialize","nameLocation":"6739:10:135","parameters":{"id":87316,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87306,"mutability":"mutable","name":"_disputeGameFactory","nameLocation":"6778:19:135","nodeType":"VariableDeclaration","scope":87361,"src":"6759:38:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_DisputeGameFactory_$97682","typeString":"contract DisputeGameFactory"},"typeName":{"id":87305,"nodeType":"UserDefinedTypeName","pathNode":{"id":87304,"name":"DisputeGameFactory","nodeType":"IdentifierPath","referencedDeclaration":97682,"src":"6759:18:135"},"referencedDeclaration":97682,"src":"6759:18:135","typeDescriptions":{"typeIdentifier":"t_contract$_DisputeGameFactory_$97682","typeString":"contract DisputeGameFactory"}},"visibility":"internal"},{"constant":false,"id":87309,"mutability":"mutable","name":"_systemConfig","nameLocation":"6820:13:135","nodeType":"VariableDeclaration","scope":87361,"src":"6807:26:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"},"typeName":{"id":87308,"nodeType":"UserDefinedTypeName","pathNode":{"id":87307,"name":"SystemConfig","nodeType":"IdentifierPath","referencedDeclaration":89607,"src":"6807:12:135"},"referencedDeclaration":89607,"src":"6807:12:135","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"visibility":"internal"},{"constant":false,"id":87312,"mutability":"mutable","name":"_superchainConfig","nameLocation":"6860:17:135","nodeType":"VariableDeclaration","scope":87361,"src":"6843:34:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"},"typeName":{"id":87311,"nodeType":"UserDefinedTypeName","pathNode":{"id":87310,"name":"SuperchainConfig","nodeType":"IdentifierPath","referencedDeclaration":88793,"src":"6843:16:135"},"referencedDeclaration":88793,"src":"6843:16:135","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"visibility":"internal"},{"constant":false,"id":87315,"mutability":"mutable","name":"_initialRespectedGameType","nameLocation":"6896:25:135","nodeType":"VariableDeclaration","scope":87361,"src":"6887:34:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":87314,"nodeType":"UserDefinedTypeName","pathNode":{"id":87313,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"6887:8:135"},"referencedDeclaration":103271,"src":"6887:8:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"}],"src":"6749:178:135"},"returnParameters":{"id":87319,"nodeType":"ParameterList","parameters":[],"src":"6967:0:135"},"scope":87971,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":87372,"nodeType":"FunctionDefinition","src":"7954:101:135","nodes":[],"body":{"id":87371,"nodeType":"Block","src":"8004:51:135","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87367,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87180,"src":"8021:16:135","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":87368,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"guardian","nodeType":"MemberAccess","referencedDeclaration":88693,"src":"8021:25:135","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":87369,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8021:27:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":87366,"id":87370,"nodeType":"Return","src":"8014:34:135"}]},"documentation":{"id":87362,"nodeType":"StructuredDocumentation","src":"7707:242:135","text":"@notice Getter function for the address of the guardian.\n Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead.\n @return Address of the guardian.\n @custom:legacy"},"functionSelector":"452a9320","implemented":true,"kind":"function","modifiers":[],"name":"guardian","nameLocation":"7963:8:135","parameters":{"id":87363,"nodeType":"ParameterList","parameters":[],"src":"7971:2:135"},"returnParameters":{"id":87366,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87365,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":87372,"src":"7995:7:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87364,"name":"address","nodeType":"ElementaryTypeName","src":"7995:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"7994:9:135"},"scope":87971,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":87383,"nodeType":"FunctionDefinition","src":"8115:94:135","nodes":[],"body":{"id":87382,"nodeType":"Block","src":"8160:49:135","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87378,"name":"superchainConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87180,"src":"8177:16:135","typeDescriptions":{"typeIdentifier":"t_contract$_SuperchainConfig_$88793","typeString":"contract SuperchainConfig"}},"id":87379,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"paused","nodeType":"MemberAccess","referencedDeclaration":88707,"src":"8177:23:135","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_bool_$","typeString":"function () view external returns (bool)"}},"id":87380,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8177:25:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":87377,"id":87381,"nodeType":"Return","src":"8170:32:135"}]},"documentation":{"id":87373,"nodeType":"StructuredDocumentation","src":"8061:49:135","text":"@notice Getter for the current paused status."},"functionSelector":"5c975abb","implemented":true,"kind":"function","modifiers":[],"name":"paused","nameLocation":"8124:6:135","parameters":{"id":87374,"nodeType":"ParameterList","parameters":[],"src":"8130:2:135"},"returnParameters":{"id":87377,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87376,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":87383,"src":"8154:4:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":87375,"name":"bool","nodeType":"ElementaryTypeName","src":"8154:4:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"8153:6:135"},"scope":87971,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":87392,"nodeType":"FunctionDefinition","src":"8268:119:135","nodes":[],"body":{"id":87391,"nodeType":"Block","src":"8335:52:135","nodes":[],"statements":[{"expression":{"id":87389,"name":"PROOF_MATURITY_DELAY_SECONDS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87151,"src":"8352:28:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":87388,"id":87390,"nodeType":"Return","src":"8345:35:135"}]},"documentation":{"id":87384,"nodeType":"StructuredDocumentation","src":"8215:48:135","text":"@notice Getter for the proof maturity delay."},"functionSelector":"bf653a5c","implemented":true,"kind":"function","modifiers":[],"name":"proofMaturityDelaySeconds","nameLocation":"8277:25:135","parameters":{"id":87385,"nodeType":"ParameterList","parameters":[],"src":"8302:2:135"},"returnParameters":{"id":87388,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87387,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":87392,"src":"8326:7:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87386,"name":"uint256","nodeType":"ElementaryTypeName","src":"8326:7:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8325:9:135"},"scope":87971,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":87401,"nodeType":"FunctionDefinition","src":"8453:132:135","nodes":[],"body":{"id":87400,"nodeType":"Block","src":"8526:59:135","nodes":[],"statements":[{"expression":{"id":87398,"name":"DISPUTE_GAME_FINALITY_DELAY_SECONDS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87154,"src":"8543:35:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":87397,"id":87399,"nodeType":"Return","src":"8536:42:135"}]},"documentation":{"id":87393,"nodeType":"StructuredDocumentation","src":"8393:55:135","text":"@notice Getter for the dispute game finality delay."},"functionSelector":"952b2797","implemented":true,"kind":"function","modifiers":[],"name":"disputeGameFinalityDelaySeconds","nameLocation":"8462:31:135","parameters":{"id":87394,"nodeType":"ParameterList","parameters":[],"src":"8493:2:135"},"returnParameters":{"id":87397,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87396,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":87401,"src":"8517:7:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87395,"name":"uint256","nodeType":"ElementaryTypeName","src":"8517:7:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8516:9:135"},"scope":87971,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":87416,"nodeType":"FunctionDefinition","src":"9078:120:135","nodes":[],"body":{"id":87415,"nodeType":"Block","src":"9151:47:135","nodes":[],"statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":87413,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":87411,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":87409,"name":"_byteCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87404,"src":"9168:10:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"3136","id":87410,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9181:2:135","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"9168:15:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3231303030","id":87412,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9186:5:135","typeDescriptions":{"typeIdentifier":"t_rational_21000_by_1","typeString":"int_const 21000"},"value":"21000"},"src":"9168:23:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"functionReturnParameters":87408,"id":87414,"nodeType":"Return","src":"9161:30:135"}]},"documentation":{"id":87402,"nodeType":"StructuredDocumentation","src":"8591:482:135","text":"@notice Computes the minimum gas limit for a deposit.\n The minimum gas limit linearly increases based on the size of the calldata.\n This is to prevent users from creating L2 resource usage without paying for it.\n This function can be used when interacting with the portal to ensure forwards\n compatibility.\n @param _byteCount Number of bytes in the calldata.\n @return The minimum gas limit for a deposit."},"functionSelector":"a35d99df","implemented":true,"kind":"function","modifiers":[],"name":"minimumGasLimit","nameLocation":"9087:15:135","parameters":{"id":87405,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87404,"mutability":"mutable","name":"_byteCount","nameLocation":"9110:10:135","nodeType":"VariableDeclaration","scope":87416,"src":"9103:17:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":87403,"name":"uint64","nodeType":"ElementaryTypeName","src":"9103:6:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"src":"9102:19:135"},"returnParameters":{"id":87408,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87407,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":87416,"src":"9143:6:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":87406,"name":"uint64","nodeType":"ElementaryTypeName","src":"9143:6:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"src":"9142:8:135"},"scope":87971,"stateMutability":"pure","virtual":false,"visibility":"public"},{"id":87434,"nodeType":"FunctionDefinition","src":"9577:130:135","nodes":[],"body":{"id":87433,"nodeType":"Block","src":"9604:103:135","nodes":[],"statements":[{"expression":{"arguments":[{"expression":{"id":87421,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"9633:3:135","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87422,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"9633:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":87423,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"9645:3:135","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87424,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"9645:9:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":87425,"name":"RECEIVE_DEFAULT_GAS_LIMIT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87162,"src":"9656:25:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},{"hexValue":"66616c7365","id":87426,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"9683:5:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"arguments":[{"hexValue":"","id":87429,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9696:2:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":87428,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9690:5:135","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":87427,"name":"bytes","nodeType":"ElementaryTypeName","src":"9690:5:135","typeDescriptions":{}}},"id":87430,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9690:9:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":87420,"name":"depositTransaction","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87785,"src":"9614:18:135","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint64_$_t_bool_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,uint256,uint64,bool,bytes memory)"}},"id":87431,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9614:86:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87432,"nodeType":"ExpressionStatement","src":"9614:86:135"}]},"documentation":{"id":87417,"nodeType":"StructuredDocumentation","src":"9204:368:135","text":"@notice Accepts value so that users can send ETH directly to this contract and have the\n funds be deposited to their address on L2. This is intended as a convenience\n function for EOAs. Contracts should call the depositTransaction() function directly\n otherwise any deposited funds will be lost due to address aliasing."},"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":87418,"nodeType":"ParameterList","parameters":[],"src":"9584:2:135"},"returnParameters":{"id":87419,"nodeType":"ParameterList","parameters":[],"src":"9604:0:135"},"scope":87971,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":87439,"nodeType":"FunctionDefinition","src":"9921:77:135","nodes":[],"body":{"id":87438,"nodeType":"Block","src":"9959:39:135","nodes":[],"statements":[]},"documentation":{"id":87435,"nodeType":"StructuredDocumentation","src":"9713:203:135","text":"@notice Accepts ETH value without triggering a deposit to L2.\n This function mainly exists for the sake of the migration between the legacy\n Optimism system and Bedrock."},"functionSelector":"8b4c40b0","implemented":true,"kind":"function","modifiers":[],"name":"donateETH","nameLocation":"9930:9:135","parameters":{"id":87436,"nodeType":"ParameterList","parameters":[],"src":"9939:2:135"},"returnParameters":{"id":87437,"nodeType":"ParameterList","parameters":[],"src":"9959:0:135"},"scope":87971,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":87452,"nodeType":"FunctionDefinition","src":"10247:152:135","nodes":[],"body":{"id":87451,"nodeType":"Block","src":"10346:53:135","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87447,"name":"systemConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87187,"src":"10363:12:135","typeDescriptions":{"typeIdentifier":"t_contract$_SystemConfig_$89607","typeString":"contract SystemConfig"}},"id":87448,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"resourceConfig","nodeType":"MemberAccess","referencedDeclaration":89527,"src":"10363:27:135","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_struct$_ResourceConfig_$88258_memory_ptr_$","typeString":"function () view external returns (struct ResourceMetering.ResourceConfig memory)"}},"id":87449,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10363:29:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ResourceConfig_$88258_memory_ptr","typeString":"struct ResourceMetering.ResourceConfig memory"}},"functionReturnParameters":87446,"id":87450,"nodeType":"Return","src":"10356:36:135"}]},"baseFunctions":[88555],"documentation":{"id":87440,"nodeType":"StructuredDocumentation","src":"10004:238:135","text":"@notice Getter for the resource config.\n Used internally by the ResourceMetering contract.\n The SystemConfig is the source of truth for the resource config.\n @return ResourceMetering ResourceConfig"},"implemented":true,"kind":"function","modifiers":[],"name":"_resourceConfig","nameLocation":"10256:15:135","overrides":{"id":87442,"nodeType":"OverrideSpecifier","overrides":[],"src":"10288:8:135"},"parameters":{"id":87441,"nodeType":"ParameterList","parameters":[],"src":"10271:2:135"},"returnParameters":{"id":87446,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87445,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":87452,"src":"10306:38:135","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ResourceConfig_$88258_memory_ptr","typeString":"struct ResourceMetering.ResourceConfig"},"typeName":{"id":87444,"nodeType":"UserDefinedTypeName","pathNode":{"id":87443,"name":"ResourceMetering.ResourceConfig","nodeType":"IdentifierPath","referencedDeclaration":88258,"src":"10306:31:135"},"referencedDeclaration":88258,"src":"10306:31:135","typeDescriptions":{"typeIdentifier":"t_struct$_ResourceConfig_$88258_storage_ptr","typeString":"struct ResourceMetering.ResourceConfig"}},"visibility":"internal"}],"src":"10305:40:135"},"scope":87971,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":87599,"nodeType":"FunctionDefinition","src":"10816:3564:135","nodes":[],"body":{"id":87598,"nodeType":"Block","src":"11084:3296:135","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":87476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87470,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87456,"src":"11329:3:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":87471,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"target","nodeType":"MemberAccess","referencedDeclaration":104341,"src":"11329:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":87474,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"11351:4:135","typeDescriptions":{"typeIdentifier":"t_contract$_OptimismPortal2_$87971","typeString":"contract OptimismPortal2"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_OptimismPortal2_$87971","typeString":"contract OptimismPortal2"}],"id":87473,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11343:7:135","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":87472,"name":"address","nodeType":"ElementaryTypeName","src":"11343:7:135","typeDescriptions":{}}},"id":87475,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11343:13:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"11329:27:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e64206d6573736167657320746f2074686520706f7274616c20636f6e7472616374","id":87477,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"11358:65:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_57e41062e2e7b97ddf730827f5249d28f602a3846dfe107ce36292fb1c029eb8","typeString":"literal_string \"OptimismPortal: you cannot send messages to the portal contract\""},"value":"OptimismPortal: you cannot send messages to the portal contract"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_57e41062e2e7b97ddf730827f5249d28f602a3846dfe107ce36292fb1c029eb8","typeString":"literal_string \"OptimismPortal: you cannot send messages to the portal contract\""}],"id":87469,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"11321:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87478,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11321:103:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87479,"nodeType":"ExpressionStatement","src":"11321:103:135"},{"assignments":[87482,null,87485],"declarations":[{"constant":false,"id":87482,"mutability":"mutable","name":"gameType","nameLocation":"11525:8:135","nodeType":"VariableDeclaration","scope":87598,"src":"11516:17:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":87481,"nodeType":"UserDefinedTypeName","pathNode":{"id":87480,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"11516:8:135"},"referencedDeclaration":103271,"src":"11516:8:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"},null,{"constant":false,"id":87485,"mutability":"mutable","name":"gameProxy","nameLocation":"11549:9:135","nodeType":"VariableDeclaration","scope":87598,"src":"11536:22:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"},"typeName":{"id":87484,"nodeType":"UserDefinedTypeName","pathNode":{"id":87483,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"11536:12:135"},"referencedDeclaration":100327,"src":"11536:12:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"visibility":"internal"}],"id":87490,"initialValue":{"arguments":[{"id":87488,"name":"_disputeGameIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87458,"src":"11593:17:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":87486,"name":"disputeGameFactory","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87191,"src":"11562:18:135","typeDescriptions":{"typeIdentifier":"t_contract$_DisputeGameFactory_$97682","typeString":"contract DisputeGameFactory"}},"id":87487,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"gameAtIndex","nodeType":"MemberAccess","referencedDeclaration":97346,"src":"11562:30:135","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_uint256_$returns$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Timestamp_$103261_$_t_contract$_IDisputeGame_$100327_$","typeString":"function (uint256) view external returns (GameType,Timestamp,contract IDisputeGame)"}},"id":87489,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11562:49:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_userDefinedValueType$_GameType_$103271_$_t_userDefinedValueType$_Timestamp_$103261_$_t_contract$_IDisputeGame_$100327_$","typeString":"tuple(GameType,Timestamp,contract IDisputeGame)"}},"nodeType":"VariableDeclarationStatement","src":"11515:96:135"},{"assignments":[87493],"declarations":[{"constant":false,"id":87493,"mutability":"mutable","name":"outputRoot","nameLocation":"11627:10:135","nodeType":"VariableDeclaration","scope":87598,"src":"11621:16:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"},"typeName":{"id":87492,"nodeType":"UserDefinedTypeName","pathNode":{"id":87491,"name":"Claim","nodeType":"IdentifierPath","referencedDeclaration":103255,"src":"11621:5:135"},"referencedDeclaration":103255,"src":"11621:5:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"visibility":"internal"}],"id":87497,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87494,"name":"gameProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87485,"src":"11640:9:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"id":87495,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"rootClaim","nodeType":"MemberAccess","referencedDeclaration":100294,"src":"11640:19:135","typeDescriptions":{"typeIdentifier":"t_function_external_pure$__$returns$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function () pure external returns (Claim)"}},"id":87496,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11640:21:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"nodeType":"VariableDeclarationStatement","src":"11621:40:135"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":87505,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87499,"name":"gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87482,"src":"11758:8:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"id":87500,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101150,"src":"11758:12:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameType_$103271_$returns$_t_uint32_$bound_to$_t_userDefinedValueType$_GameType_$103271_$","typeString":"function (GameType) pure returns (uint32)"}},"id":87501,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11758:14:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87502,"name":"respectedGameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87209,"src":"11776:17:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"id":87503,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101150,"src":"11776:21:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameType_$103271_$returns$_t_uint32_$bound_to$_t_userDefinedValueType$_GameType_$103271_$","typeString":"function (GameType) pure returns (uint32)"}},"id":87504,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11776:23:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"11758:41:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797065","id":87506,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"11801:35:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_ea6e52a7a06be8d460d58a9fb591f5b7ad20643cdd834b0004aaeaa0647b1d4b","typeString":"literal_string \"OptimismPortal: invalid game type\""},"value":"OptimismPortal: invalid game type"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ea6e52a7a06be8d460d58a9fb591f5b7ad20643cdd834b0004aaeaa0647b1d4b","typeString":"literal_string \"OptimismPortal: invalid game type\""}],"id":87498,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"11750:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87507,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11750:87:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87508,"nodeType":"ExpressionStatement","src":"11750:87:135"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":87517,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87510,"name":"outputRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87493,"src":"11957:10:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Claim_$103255","typeString":"Claim"}},"id":87511,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101085,"src":"11957:14:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Claim_$103255_$returns$_t_bytes32_$bound_to$_t_userDefinedValueType$_Claim_$103255_$","typeString":"function (Claim) pure returns (bytes32)"}},"id":87512,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11957:16:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":87515,"name":"_outputRootProof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87461,"src":"12005:16:135","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRootProof_$104316_calldata_ptr","typeString":"struct Types.OutputRootProof calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_OutputRootProof_$104316_calldata_ptr","typeString":"struct Types.OutputRootProof calldata"}],"expression":{"id":87513,"name":"Hashing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103936,"src":"11977:7:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Hashing_$103936_$","typeString":"type(library Hashing)"}},"id":87514,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hashOutputRootProof","nodeType":"MemberAccess","referencedDeclaration":103935,"src":"11977:27:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_OutputRootProof_$104316_memory_ptr_$returns$_t_bytes32_$","typeString":"function (struct Types.OutputRootProof memory) pure returns (bytes32)"}},"id":87516,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11977:45:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"11957:65:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a20696e76616c6964206f757470757420726f6f742070726f6f66","id":87518,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"12036:43:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_490ec653897228799e7e4c4af8b1fd3b4a0688df98d026b46afa352ce9876996","typeString":"literal_string \"OptimismPortal: invalid output root proof\""},"value":"OptimismPortal: invalid output root proof"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_490ec653897228799e7e4c4af8b1fd3b4a0688df98d026b46afa352ce9876996","typeString":"literal_string \"OptimismPortal: invalid output root proof\""}],"id":87509,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"11936:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87519,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11936:153:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87520,"nodeType":"ExpressionStatement","src":"11936:153:135"},{"assignments":[87522],"declarations":[{"constant":false,"id":87522,"mutability":"mutable","name":"withdrawalHash","nameLocation":"12208:14:135","nodeType":"VariableDeclaration","scope":87598,"src":"12200:22:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":87521,"name":"bytes32","nodeType":"ElementaryTypeName","src":"12200:7:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":87527,"initialValue":{"arguments":[{"id":87525,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87456,"src":"12248:3:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}],"expression":{"id":87523,"name":"Hashing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103936,"src":"12225:7:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Hashing_$103936_$","typeString":"type(library Hashing)"}},"id":87524,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hashWithdrawal","nodeType":"MemberAccess","referencedDeclaration":103911,"src":"12225:22:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_WithdrawalTransaction_$104348_memory_ptr_$returns$_t_bytes32_$","typeString":"function (struct Types.WithdrawalTransaction memory) pure returns (bytes32)"}},"id":87526,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12225:27:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"12200:52:135"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"},"id":87534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87529,"name":"gameProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87485,"src":"12424:9:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"id":87530,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"status","nodeType":"MemberAccess","referencedDeclaration":100274,"src":"12424:16:135","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_enum$_GameStatus_$103277_$","typeString":"function () view external returns (enum GameStatus)"}},"id":87531,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12424:18:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":87532,"name":"GameStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103277,"src":"12446:10:135","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_GameStatus_$103277_$","typeString":"type(enum GameStatus)"}},"id":87533,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"CHALLENGER_WINS","nodeType":"MemberAccess","referencedDeclaration":103275,"src":"12446:26:135","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"src":"12424:48:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a2063616e6e6f742070726f766520616761696e737420696e76616c696420646973707574652067616d6573","id":87535,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"12486:60:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_69fd02e8f1261d2d4a8ae7fdb140ea99e9eb488a3b5b9ae3c51756d573f7f1f7","typeString":"literal_string \"OptimismPortal: cannot prove against invalid dispute games\""},"value":"OptimismPortal: cannot prove against invalid dispute games"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_69fd02e8f1261d2d4a8ae7fdb140ea99e9eb488a3b5b9ae3c51756d573f7f1f7","typeString":"literal_string \"OptimismPortal: cannot prove against invalid dispute games\""}],"id":87528,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"12403:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87536,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12403:153:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87537,"nodeType":"ExpressionStatement","src":"12403:153:135"},{"assignments":[87539],"declarations":[{"constant":false,"id":87539,"mutability":"mutable","name":"storageKey","nameLocation":"12800:10:135","nodeType":"VariableDeclaration","scope":87598,"src":"12792:18:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":87538,"name":"bytes32","nodeType":"ElementaryTypeName","src":"12792:7:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":87550,"initialValue":{"arguments":[{"arguments":[{"id":87543,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87522,"src":"12864:14:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"hexValue":"30","id":87546,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12904:1:135","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":87545,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12896:7:135","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":87544,"name":"uint256","nodeType":"ElementaryTypeName","src":"12896:7:135","typeDescriptions":{}}},"id":87547,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12896:10:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":87541,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"12836:3:135","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":87542,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"12836:10:135","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":87548,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12836:147:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":87540,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"12813:9:135","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":87549,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"12813:180:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"12792:201:135"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"id":87556,"name":"storageKey","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87539,"src":"13419:10:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":87554,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"13408:3:135","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":87555,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"13408:10:135","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":87557,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13408:22:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"01","id":87558,"isConstant":false,"isLValue":false,"isPure":true,"kind":"hexString","lValueRequested":false,"nodeType":"Literal","src":"13456:7:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2","typeString":"literal_string hex\"01\""},"value":"\u0001"},{"id":87559,"name":"_withdrawalProof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87464,"src":"13489:16:135","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},{"expression":{"id":87560,"name":"_outputRootProof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87461,"src":"13530:16:135","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRootProof_$104316_calldata_ptr","typeString":"struct Types.OutputRootProof calldata"}},"id":87561,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"messagePasserStorageRoot","nodeType":"MemberAccess","referencedDeclaration":104313,"src":"13530:41:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_stringliteral_5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2","typeString":"literal_string hex\"01\""},{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":87552,"name":"SecureMerkleTrie","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106033,"src":"13346:16:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SecureMerkleTrie_$106033_$","typeString":"type(library SecureMerkleTrie)"}},"id":87553,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verifyInclusionProof","nodeType":"MemberAccess","referencedDeclaration":105985,"src":"13346:37:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_$_t_bytes32_$returns$_t_bool_$","typeString":"function (bytes memory,bytes memory,bytes memory[] memory,bytes32) pure returns (bool)"}},"id":87562,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":["_key","_value","_proof","_root"],"nodeType":"FunctionCall","src":"13346:240:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a20696e76616c6964207769746864726177616c20696e636c7573696f6e2070726f6f66","id":87563,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"13600:52:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_11b666636981dad70da1c1a9e87589eb7d9c042eacd4d25e887aac557f6cd6b9","typeString":"literal_string \"OptimismPortal: invalid withdrawal inclusion proof\""},"value":"OptimismPortal: invalid withdrawal inclusion proof"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_11b666636981dad70da1c1a9e87589eb7d9c042eacd4d25e887aac557f6cd6b9","typeString":"literal_string \"OptimismPortal: invalid withdrawal inclusion proof\""}],"id":87551,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"13325:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87564,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"13325:337:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87565,"nodeType":"ExpressionStatement","src":"13325:337:135"},{"expression":{"id":87580,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":87566,"name":"provenWithdrawals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87199,"src":"13960:17:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_mapping$_t_address_$_t_struct$_ProvenWithdrawal_$87148_storage_$_$","typeString":"mapping(bytes32 => mapping(address => struct OptimismPortal2.ProvenWithdrawal storage ref))"}},"id":87570,"indexExpression":{"id":87567,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87522,"src":"13978:14:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"13960:33:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_ProvenWithdrawal_$87148_storage_$","typeString":"mapping(address => struct OptimismPortal2.ProvenWithdrawal storage ref)"}},"id":87571,"indexExpression":{"expression":{"id":87568,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"13994:3:135","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"13994:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"13960:45:135","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$87148_storage","typeString":"struct OptimismPortal2.ProvenWithdrawal storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":87573,"name":"gameProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87485,"src":"14057:9:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},{"arguments":[{"expression":{"id":87576,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"14086:5:135","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":87577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"14086:15:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":87575,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14079:6:135","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":87574,"name":"uint64","nodeType":"ElementaryTypeName","src":"14079:6:135","typeDescriptions":{}}},"id":87578,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14079:23:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":87572,"name":"ProvenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87148,"src":"14020:16:135","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_ProvenWithdrawal_$87148_storage_ptr_$","typeString":"type(struct OptimismPortal2.ProvenWithdrawal storage pointer)"}},"id":87579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":["disputeGameProxy","timestamp"],"nodeType":"FunctionCall","src":"14020:85:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$87148_memory_ptr","typeString":"struct OptimismPortal2.ProvenWithdrawal memory"}},"src":"13960:145:135","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$87148_storage","typeString":"struct OptimismPortal2.ProvenWithdrawal storage ref"}},"id":87581,"nodeType":"ExpressionStatement","src":"13960:145:135"},{"eventCall":{"arguments":[{"id":87583,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87522,"src":"14182:14:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":87584,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87456,"src":"14198:3:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":87585,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":104339,"src":"14198:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":87586,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87456,"src":"14210:3:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":87587,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"target","nodeType":"MemberAccess","referencedDeclaration":104341,"src":"14210:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":87582,"name":"WithdrawalProven","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87238,"src":"14165:16:135","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$","typeString":"function (bytes32,address,address)"}},"id":87588,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14165:56:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87589,"nodeType":"EmitStatement","src":"14160:61:135"},{"expression":{"arguments":[{"expression":{"id":87594,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"14362:3:135","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87595,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"14362:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"baseExpression":{"id":87590,"name":"proofSubmitters","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87218,"src":"14325:15:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_array$_t_address_$dyn_storage_$","typeString":"mapping(bytes32 => address[] storage ref)"}},"id":87592,"indexExpression":{"id":87591,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87522,"src":"14341:14:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14325:31:135","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage","typeString":"address[] storage ref"}},"id":87593,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"push","nodeType":"MemberAccess","src":"14325:36:135","typeDescriptions":{"typeIdentifier":"t_function_arraypush_nonpayable$_t_array$_t_address_$dyn_storage_ptr_$_t_address_$returns$__$bound_to$_t_array$_t_address_$dyn_storage_ptr_$","typeString":"function (address[] storage pointer,address)"}},"id":87596,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14325:48:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87597,"nodeType":"ExpressionStatement","src":"14325:48:135"}]},"documentation":{"id":87453,"nodeType":"StructuredDocumentation","src":"10405:406:135","text":"@notice Proves a withdrawal transaction.\n @param _tx Withdrawal transaction to finalize.\n @param _disputeGameIndex Index of the dispute game to prove the withdrawal against.\n @param _outputRootProof Inclusion proof of the L2ToL1MessagePasser contract's storage root.\n @param _withdrawalProof Inclusion proof of the withdrawal in L2ToL1MessagePasser contract."},"functionSelector":"4870496f","implemented":true,"kind":"function","modifiers":[{"id":87467,"kind":"modifierInvocation","modifierName":{"id":87466,"name":"whenNotPaused","nodeType":"IdentifierPath","referencedDeclaration":87256,"src":"11066:13:135"},"nodeType":"ModifierInvocation","src":"11066:13:135"}],"name":"proveWithdrawalTransaction","nameLocation":"10825:26:135","parameters":{"id":87465,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87456,"mutability":"mutable","name":"_tx","nameLocation":"10896:3:135","nodeType":"VariableDeclaration","scope":87599,"src":"10861:38:135","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction"},"typeName":{"id":87455,"nodeType":"UserDefinedTypeName","pathNode":{"id":87454,"name":"Types.WithdrawalTransaction","nodeType":"IdentifierPath","referencedDeclaration":104348,"src":"10861:27:135"},"referencedDeclaration":104348,"src":"10861:27:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_storage_ptr","typeString":"struct Types.WithdrawalTransaction"}},"visibility":"internal"},{"constant":false,"id":87458,"mutability":"mutable","name":"_disputeGameIndex","nameLocation":"10917:17:135","nodeType":"VariableDeclaration","scope":87599,"src":"10909:25:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87457,"name":"uint256","nodeType":"ElementaryTypeName","src":"10909:7:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":87461,"mutability":"mutable","name":"_outputRootProof","nameLocation":"10975:16:135","nodeType":"VariableDeclaration","scope":87599,"src":"10944:47:135","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRootProof_$104316_calldata_ptr","typeString":"struct Types.OutputRootProof"},"typeName":{"id":87460,"nodeType":"UserDefinedTypeName","pathNode":{"id":87459,"name":"Types.OutputRootProof","nodeType":"IdentifierPath","referencedDeclaration":104316,"src":"10944:21:135"},"referencedDeclaration":104316,"src":"10944:21:135","typeDescriptions":{"typeIdentifier":"t_struct$_OutputRootProof_$104316_storage_ptr","typeString":"struct Types.OutputRootProof"}},"visibility":"internal"},{"constant":false,"id":87464,"mutability":"mutable","name":"_withdrawalProof","nameLocation":"11018:16:135","nodeType":"VariableDeclaration","scope":87599,"src":"11001:33:135","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes[]"},"typeName":{"baseType":{"id":87462,"name":"bytes","nodeType":"ElementaryTypeName","src":"11001:5:135","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"id":87463,"nodeType":"ArrayTypeName","src":"11001:7:135","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_storage_$dyn_storage_ptr","typeString":"bytes[]"}},"visibility":"internal"}],"src":"10851:189:135"},"returnParameters":{"id":87468,"nodeType":"ParameterList","parameters":[],"src":"11084:0:135"},"scope":87971,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":87615,"nodeType":"FunctionDefinition","src":"14493:178:135","nodes":[],"body":{"id":87614,"nodeType":"Block","src":"14595:76:135","nodes":[],"statements":[{"expression":{"arguments":[{"id":87609,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87603,"src":"14648:3:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},{"expression":{"id":87610,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"14653:3:135","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87611,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"14653:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"},{"typeIdentifier":"t_address","typeString":"address"}],"id":87608,"name":"finalizeWithdrawalTransactionExternalProof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87695,"src":"14605:42:135","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_WithdrawalTransaction_$104348_memory_ptr_$_t_address_$returns$__$","typeString":"function (struct Types.WithdrawalTransaction memory,address)"}},"id":87612,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"14605:59:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87613,"nodeType":"ExpressionStatement","src":"14605:59:135"}]},"documentation":{"id":87600,"nodeType":"StructuredDocumentation","src":"14386:102:135","text":"@notice Finalizes a withdrawal transaction.\n @param _tx Withdrawal transaction to finalize."},"functionSelector":"8c3152e9","implemented":true,"kind":"function","modifiers":[{"id":87606,"kind":"modifierInvocation","modifierName":{"id":87605,"name":"whenNotPaused","nodeType":"IdentifierPath","referencedDeclaration":87256,"src":"14581:13:135"},"nodeType":"ModifierInvocation","src":"14581:13:135"}],"name":"finalizeWithdrawalTransaction","nameLocation":"14502:29:135","parameters":{"id":87604,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87603,"mutability":"mutable","name":"_tx","nameLocation":"14567:3:135","nodeType":"VariableDeclaration","scope":87615,"src":"14532:38:135","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction"},"typeName":{"id":87602,"nodeType":"UserDefinedTypeName","pathNode":{"id":87601,"name":"Types.WithdrawalTransaction","nodeType":"IdentifierPath","referencedDeclaration":104348,"src":"14532:27:135"},"referencedDeclaration":104348,"src":"14532:27:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_storage_ptr","typeString":"struct Types.WithdrawalTransaction"}},"visibility":"internal"}],"src":"14531:40:135"},"returnParameters":{"id":87607,"nodeType":"ParameterList","parameters":[],"src":"14595:0:135"},"scope":87971,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":87695,"nodeType":"FunctionDefinition","src":"14882:2403:135","nodes":[],"body":{"id":87694,"nodeType":"Block","src":"15062:2223:135","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":87630,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":87627,"name":"l2Sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87165,"src":"15328:8:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":87628,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"15340:9:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Constants_$103096_$","typeString":"type(library Constants)"}},"id":87629,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"DEFAULT_L2_SENDER","nodeType":"MemberAccess","referencedDeclaration":103058,"src":"15340:27:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"15328:39:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a2063616e206f6e6c792074726967676572206f6e65207769746864726177616c20706572207472616e73616374696f6e","id":87631,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"15369:65:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_452e6500a4013b85635a7a9b231d68a5197c7f7579d0b96d0b2f2e5fe6b5995b","typeString":"literal_string \"OptimismPortal: can only trigger one withdrawal per transaction\""},"value":"OptimismPortal: can only trigger one withdrawal per transaction"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_452e6500a4013b85635a7a9b231d68a5197c7f7579d0b96d0b2f2e5fe6b5995b","typeString":"literal_string \"OptimismPortal: can only trigger one withdrawal per transaction\""}],"id":87626,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"15307:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87632,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15307:137:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87633,"nodeType":"ExpressionStatement","src":"15307:137:135"},{"assignments":[87635],"declarations":[{"constant":false,"id":87635,"mutability":"mutable","name":"withdrawalHash","nameLocation":"15503:14:135","nodeType":"VariableDeclaration","scope":87694,"src":"15495:22:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":87634,"name":"bytes32","nodeType":"ElementaryTypeName","src":"15495:7:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":87640,"initialValue":{"arguments":[{"id":87638,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87619,"src":"15543:3:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}],"expression":{"id":87636,"name":"Hashing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103936,"src":"15520:7:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Hashing_$103936_$","typeString":"type(library Hashing)"}},"id":87637,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hashWithdrawal","nodeType":"MemberAccess","referencedDeclaration":103911,"src":"15520:22:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_WithdrawalTransaction_$104348_memory_ptr_$returns$_t_bytes32_$","typeString":"function (struct Types.WithdrawalTransaction memory) pure returns (bytes32)"}},"id":87639,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15520:27:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"15495:52:135"},{"expression":{"arguments":[{"id":87642,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87635,"src":"15629:14:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":87643,"name":"_proofSubmitter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87621,"src":"15645:15:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"id":87641,"name":"checkWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87956,"src":"15613:15:135","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_address_$returns$__$","typeString":"function (bytes32,address) view"}},"id":87644,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"15613:48:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87645,"nodeType":"ExpressionStatement","src":"15613:48:135"},{"expression":{"id":87650,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":87646,"name":"finalizedWithdrawals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87170,"src":"15741:20:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"}},"id":87648,"indexExpression":{"id":87647,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87635,"src":"15762:14:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"15741:36:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":87649,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"15780:4:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"15741:43:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87651,"nodeType":"ExpressionStatement","src":"15741:43:135"},{"expression":{"id":87655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87652,"name":"l2Sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87165,"src":"15878:8:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":87653,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87619,"src":"15889:3:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":87654,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":104339,"src":"15889:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"15878:21:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":87656,"nodeType":"ExpressionStatement","src":"15878:21:135"},{"assignments":[87658],"declarations":[{"constant":false,"id":87658,"mutability":"mutable","name":"success","nameLocation":"16524:7:135","nodeType":"VariableDeclaration","scope":87694,"src":"16519:12:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":87657,"name":"bool","nodeType":"ElementaryTypeName","src":"16519:4:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":87670,"initialValue":{"arguments":[{"expression":{"id":87661,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87619,"src":"16558:3:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":87662,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"target","nodeType":"MemberAccess","referencedDeclaration":104341,"src":"16558:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":87663,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87619,"src":"16570:3:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":87664,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"gasLimit","nodeType":"MemberAccess","referencedDeclaration":104345,"src":"16570:12:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":87665,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87619,"src":"16584:3:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":87666,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","referencedDeclaration":104343,"src":"16584:9:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":87667,"name":"_tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87619,"src":"16595:3:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction memory"}},"id":87668,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"data","nodeType":"MemberAccess","referencedDeclaration":104347,"src":"16595:8:135","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":87659,"name":"SafeCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":104213,"src":"16534:8:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCall_$104213_$","typeString":"type(library SafeCall)"}},"id":87660,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callWithMinGas","nodeType":"MemberAccess","referencedDeclaration":104212,"src":"16534:23:135","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (address,uint256,uint256,bytes memory) returns (bool)"}},"id":87669,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16534:70:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"16519:85:135"},{"expression":{"id":87674,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87671,"name":"l2Sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87165,"src":"16672:8:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":87672,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"16683:9:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Constants_$103096_$","typeString":"type(library Constants)"}},"id":87673,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"DEFAULT_L2_SENDER","nodeType":"MemberAccess","referencedDeclaration":103058,"src":"16683:27:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"16672:38:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":87675,"nodeType":"ExpressionStatement","src":"16672:38:135"},{"eventCall":{"arguments":[{"id":87677,"name":"withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87635,"src":"16889:14:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":87678,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87658,"src":"16905:7:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":87676,"name":"WithdrawalFinalized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87245,"src":"16869:19:135","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_bool_$returns$__$","typeString":"function (bytes32,bool)"}},"id":87679,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"16869:44:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87680,"nodeType":"EmitStatement","src":"16864:49:135"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":87688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":87682,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"17177:8:135","subExpression":{"id":87681,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87658,"src":"17178:7:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":87687,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87683,"name":"tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-26,"src":"17189:2:135","typeDescriptions":{"typeIdentifier":"t_magic_transaction","typeString":"tx"}},"id":87684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"origin","nodeType":"MemberAccess","src":"17189:9:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":87685,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"17202:9:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Constants_$103096_$","typeString":"type(library Constants)"}},"id":87686,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"ESTIMATION_ADDRESS","nodeType":"MemberAccess","referencedDeclaration":103054,"src":"17202:28:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"17189:41:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"17177:53:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87693,"nodeType":"IfStatement","src":"17173:106:135","trueBody":{"id":87692,"nodeType":"Block","src":"17232:47:135","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":87689,"name":"GasEstimation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103993,"src":"17253:13:135","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":87690,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"17253:15:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87691,"nodeType":"RevertStatement","src":"17246:22:135"}]}}]},"documentation":{"id":87616,"nodeType":"StructuredDocumentation","src":"14677:200:135","text":"@notice Finalizes a withdrawal transaction, using an external proof submitter.\n @param _tx Withdrawal transaction to finalize.\n @param _proofSubmitter Address of the proof submitter."},"functionSelector":"43ca1c50","implemented":true,"kind":"function","modifiers":[{"id":87624,"kind":"modifierInvocation","modifierName":{"id":87623,"name":"whenNotPaused","nodeType":"IdentifierPath","referencedDeclaration":87256,"src":"15044:13:135"},"nodeType":"ModifierInvocation","src":"15044:13:135"}],"name":"finalizeWithdrawalTransactionExternalProof","nameLocation":"14891:42:135","parameters":{"id":87622,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87619,"mutability":"mutable","name":"_tx","nameLocation":"14978:3:135","nodeType":"VariableDeclaration","scope":87695,"src":"14943:38:135","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_memory_ptr","typeString":"struct Types.WithdrawalTransaction"},"typeName":{"id":87618,"nodeType":"UserDefinedTypeName","pathNode":{"id":87617,"name":"Types.WithdrawalTransaction","nodeType":"IdentifierPath","referencedDeclaration":104348,"src":"14943:27:135"},"referencedDeclaration":104348,"src":"14943:27:135","typeDescriptions":{"typeIdentifier":"t_struct$_WithdrawalTransaction_$104348_storage_ptr","typeString":"struct Types.WithdrawalTransaction"}},"visibility":"internal"},{"constant":false,"id":87621,"mutability":"mutable","name":"_proofSubmitter","nameLocation":"14999:15:135","nodeType":"VariableDeclaration","scope":87695,"src":"14991:23:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87620,"name":"address","nodeType":"ElementaryTypeName","src":"14991:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"14933:87:135"},"returnParameters":{"id":87625,"nodeType":"ParameterList","parameters":[],"src":"15062:0:135"},"scope":87971,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":87785,"nodeType":"FunctionDefinition","src":"18015:1855:135","nodes":[],"body":{"id":87784,"nodeType":"Block","src":"18236:1634:135","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":87719,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":87712,"name":"_isCreation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87704,"src":"18375:11:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":87718,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":87713,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87698,"src":"18390:3:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":87716,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18405:1:135","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":87715,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18397:7:135","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":87714,"name":"address","nodeType":"ElementaryTypeName","src":"18397:7:135","typeDescriptions":{}}},"id":87717,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18397:10:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"18390:17:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"18375:32:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87723,"nodeType":"IfStatement","src":"18371:56:135","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":87720,"name":"BadTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103969,"src":"18416:9:135","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":87721,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18416:11:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87722,"nodeType":"RevertStatement","src":"18409:18:135"}},{"condition":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":87732,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":87724,"name":"_gasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87702,"src":"18579:9:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"arguments":[{"arguments":[{"expression":{"id":87728,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87706,"src":"18614:5:135","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":87729,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"18614:12:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":87727,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18607:6:135","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":87726,"name":"uint64","nodeType":"ElementaryTypeName","src":"18607:6:135","typeDescriptions":{}}},"id":87730,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18607:20:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":87725,"name":"minimumGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87416,"src":"18591:15:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint64_$returns$_t_uint64_$","typeString":"function (uint64) pure returns (uint64)"}},"id":87731,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18591:37:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"18579:49:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87736,"nodeType":"IfStatement","src":"18575:77:135","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":87733,"name":"SmallGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103975,"src":"18637:13:135","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":87734,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"18637:15:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87735,"nodeType":"RevertStatement","src":"18630:22:135"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":87740,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87737,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87706,"src":"19027:5:135","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":87738,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"19027:12:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"3132305f303030","id":87739,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19042:7:135","typeDescriptions":{"typeIdentifier":"t_rational_120000_by_1","typeString":"int_const 120000"},"value":"120_000"},"src":"19027:22:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87744,"nodeType":"IfStatement","src":"19023:50:135","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":87741,"name":"LargeCalldata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103972,"src":"19058:13:135","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":87742,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19058:15:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87743,"nodeType":"RevertStatement","src":"19051:22:135"}},{"assignments":[87746],"declarations":[{"constant":false,"id":87746,"mutability":"mutable","name":"from","nameLocation":"19172:4:135","nodeType":"VariableDeclaration","scope":87784,"src":"19164:12:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87745,"name":"address","nodeType":"ElementaryTypeName","src":"19164:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":87749,"initialValue":{"expression":{"id":87747,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"19179:3:135","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87748,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"19179:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"19164:25:135"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":87754,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87750,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"19203:3:135","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87751,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"19203:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":87752,"name":"tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-26,"src":"19217:2:135","typeDescriptions":{"typeIdentifier":"t_magic_transaction","typeString":"tx"}},"id":87753,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"origin","nodeType":"MemberAccess","src":"19217:9:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"19203:23:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87764,"nodeType":"IfStatement","src":"19199:108:135","trueBody":{"id":87763,"nodeType":"Block","src":"19228:79:135","statements":[{"expression":{"id":87761,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87755,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87746,"src":"19242:4:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":87758,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"19285:3:135","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87759,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"19285:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":87756,"name":"AddressAliasHelper","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":111913,"src":"19249:18:135","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AddressAliasHelper_$111913_$","typeString":"type(library AddressAliasHelper)"}},"id":87757,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"applyL1ToL2Alias","nodeType":"MemberAccess","referencedDeclaration":111890,"src":"19249:35:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_address_$returns$_t_address_$","typeString":"function (address) pure returns (address)"}},"id":87760,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19249:47:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"19242:54:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":87762,"nodeType":"ExpressionStatement","src":"19242:54:135"}]}},{"assignments":[87766],"declarations":[{"constant":false,"id":87766,"mutability":"mutable","name":"opaqueData","nameLocation":"19577:10:135","nodeType":"VariableDeclaration","scope":87784,"src":"19564:23:135","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":87765,"name":"bytes","nodeType":"ElementaryTypeName","src":"19564:5:135","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":87776,"initialValue":{"arguments":[{"expression":{"id":87769,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"19607:3:135","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87770,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"19607:9:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":87771,"name":"_value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87700,"src":"19618:6:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":87772,"name":"_gasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87702,"src":"19626:9:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},{"id":87773,"name":"_isCreation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87704,"src":"19637:11:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":87774,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87706,"src":"19650:5:135","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":87767,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"19590:3:135","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":87768,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"19590:16:135","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":87775,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19590:66:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"19564:92:135"},{"eventCall":{"arguments":[{"id":87778,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87746,"src":"19824:4:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":87779,"name":"_to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87698,"src":"19830:3:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":87780,"name":"DEPOSIT_VERSION","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87158,"src":"19835:15:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":87781,"name":"opaqueData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87766,"src":"19852:10:135","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":87777,"name":"TransactionDeposited","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87229,"src":"19803:20:135","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes memory)"}},"id":87782,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"19803:60:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87783,"nodeType":"EmitStatement","src":"19798:65:135"}]},"documentation":{"id":87696,"nodeType":"StructuredDocumentation","src":"17291:719:135","text":"@notice Accepts deposits of ETH and data, and emits a TransactionDeposited event for use in\n deriving deposit transactions. Note that if a deposit is made by a contract, its\n address will be aliased when retrieved using `tx.origin` or `msg.sender`. Consider\n using the CrossDomainMessenger contracts for a simpler developer experience.\n @param _to Target address on L2.\n @param _value ETH value to send to the recipient.\n @param _gasLimit Amount of L2 gas to purchase by burning gas on L1.\n @param _isCreation Whether or not the transaction is a contract creation.\n @param _data Data to trigger the recipient with."},"functionSelector":"e9e05c42","implemented":true,"kind":"function","modifiers":[{"arguments":[{"id":87709,"name":"_gasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87702,"src":"18221:9:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"id":87710,"kind":"modifierInvocation","modifierName":{"id":87708,"name":"metered","nodeType":"IdentifierPath","referencedDeclaration":88284,"src":"18213:7:135"},"nodeType":"ModifierInvocation","src":"18213:18:135"}],"name":"depositTransaction","nameLocation":"18024:18:135","parameters":{"id":87707,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87698,"mutability":"mutable","name":"_to","nameLocation":"18060:3:135","nodeType":"VariableDeclaration","scope":87785,"src":"18052:11:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87697,"name":"address","nodeType":"ElementaryTypeName","src":"18052:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":87700,"mutability":"mutable","name":"_value","nameLocation":"18081:6:135","nodeType":"VariableDeclaration","scope":87785,"src":"18073:14:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87699,"name":"uint256","nodeType":"ElementaryTypeName","src":"18073:7:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":87702,"mutability":"mutable","name":"_gasLimit","nameLocation":"18104:9:135","nodeType":"VariableDeclaration","scope":87785,"src":"18097:16:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":87701,"name":"uint64","nodeType":"ElementaryTypeName","src":"18097:6:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"},{"constant":false,"id":87704,"mutability":"mutable","name":"_isCreation","nameLocation":"18128:11:135","nodeType":"VariableDeclaration","scope":87785,"src":"18123:16:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":87703,"name":"bool","nodeType":"ElementaryTypeName","src":"18123:4:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":87706,"mutability":"mutable","name":"_data","nameLocation":"18162:5:135","nodeType":"VariableDeclaration","scope":87785,"src":"18149:18:135","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":87705,"name":"bytes","nodeType":"ElementaryTypeName","src":"18149:5:135","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"18042:131:135"},"returnParameters":{"id":87711,"nodeType":"ParameterList","parameters":[],"src":"18236:0:135"},"scope":87971,"stateMutability":"payable","virtual":false,"visibility":"public"},{"id":87808,"nodeType":"FunctionDefinition","src":"20049:185:135","nodes":[],"body":{"id":87807,"nodeType":"Block","src":"20115:119:135","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":87796,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87792,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"20129:3:135","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87793,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"20129:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":87794,"name":"guardian","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87372,"src":"20143:8:135","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":87795,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20143:10:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"20129:24:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87800,"nodeType":"IfStatement","src":"20125:51:135","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":87797,"name":"Unauthorized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103987,"src":"20162:12:135","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":87798,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20162:14:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87799,"nodeType":"RevertStatement","src":"20155:21:135"}},{"expression":{"id":87805,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":87801,"name":"disputeGameBlacklist","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87205,"src":"20186:20:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IDisputeGame_$100327_$_t_bool_$","typeString":"mapping(contract IDisputeGame => bool)"}},"id":87803,"indexExpression":{"id":87802,"name":"_disputeGame","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87789,"src":"20207:12:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"20186:34:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":87804,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"20223:4:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"20186:41:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87806,"nodeType":"ExpressionStatement","src":"20186:41:135"}]},"documentation":{"id":87786,"nodeType":"StructuredDocumentation","src":"19876:168:135","text":"@notice Blacklists a dispute game. Should only be used in the event that a dispute game resolves incorrectly.\n @param _disputeGame Dispute game to blacklist."},"functionSelector":"7d6be8dc","implemented":true,"kind":"function","modifiers":[],"name":"blacklistDisputeGame","nameLocation":"20058:20:135","parameters":{"id":87790,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87789,"mutability":"mutable","name":"_disputeGame","nameLocation":"20092:12:135","nodeType":"VariableDeclaration","scope":87808,"src":"20079:25:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"},"typeName":{"id":87788,"nodeType":"UserDefinedTypeName","pathNode":{"id":87787,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"20079:12:135"},"referencedDeclaration":100327,"src":"20079:12:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"visibility":"internal"}],"src":"20078:27:135"},"returnParameters":{"id":87791,"nodeType":"ParameterList","parameters":[],"src":"20115:0:135"},"scope":87971,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":87837,"nodeType":"FunctionDefinition","src":"20481:228:135","nodes":[],"body":{"id":87836,"nodeType":"Block","src":"20540:169:135","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":87819,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87815,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"20554:3:135","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":87816,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"20554:10:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":87817,"name":"guardian","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87372,"src":"20568:8:135","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":87818,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20568:10:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"20554:24:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":87823,"nodeType":"IfStatement","src":"20550:51:135","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":87820,"name":"Unauthorized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103987,"src":"20587:12:135","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":87821,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20587:14:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87822,"nodeType":"RevertStatement","src":"20580:21:135"}},{"expression":{"id":87826,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87824,"name":"respectedGameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87209,"src":"20611:17:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":87825,"name":"_gameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87812,"src":"20631:9:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"src":"20611:29:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"id":87827,"nodeType":"ExpressionStatement","src":"20611:29:135"},{"expression":{"id":87834,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":87828,"name":"respectedGameTypeUpdatedAt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87212,"src":"20650:26:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":87831,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"20686:5:135","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":87832,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"20686:15:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":87830,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"20679:6:135","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":87829,"name":"uint64","nodeType":"ElementaryTypeName","src":"20679:6:135","typeDescriptions":{}}},"id":87833,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"20679:23:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"20650:52:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"id":87835,"nodeType":"ExpressionStatement","src":"20650:52:135"}]},"documentation":{"id":87809,"nodeType":"StructuredDocumentation","src":"20240:236:135","text":"@notice Sets the respected game type. Changing this value can alter the security properties of the system,\n depending on the new game's behavior.\n @param _gameType The game type to consult for output proposals."},"functionSelector":"7fc48504","implemented":true,"kind":"function","modifiers":[],"name":"setRespectedGameType","nameLocation":"20490:20:135","parameters":{"id":87813,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87812,"mutability":"mutable","name":"_gameType","nameLocation":"20520:9:135","nodeType":"VariableDeclaration","scope":87837,"src":"20511:18:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"},"typeName":{"id":87811,"nodeType":"UserDefinedTypeName","pathNode":{"id":87810,"name":"GameType","nodeType":"IdentifierPath","referencedDeclaration":103271,"src":"20511:8:135"},"referencedDeclaration":103271,"src":"20511:8:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"visibility":"internal"}],"src":"20510:20:135"},"returnParameters":{"id":87814,"nodeType":"ParameterList","parameters":[],"src":"20540:0:135"},"scope":87971,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":87956,"nodeType":"FunctionDefinition","src":"21034:3510:135","nodes":[],"body":{"id":87955,"nodeType":"Block","src":"21121:3423:135","nodes":[],"statements":[{"assignments":[87847],"declarations":[{"constant":false,"id":87847,"mutability":"mutable","name":"provenWithdrawal","nameLocation":"21155:16:135","nodeType":"VariableDeclaration","scope":87955,"src":"21131:40:135","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$87148_memory_ptr","typeString":"struct OptimismPortal2.ProvenWithdrawal"},"typeName":{"id":87846,"nodeType":"UserDefinedTypeName","pathNode":{"id":87845,"name":"ProvenWithdrawal","nodeType":"IdentifierPath","referencedDeclaration":87148,"src":"21131:16:135"},"referencedDeclaration":87148,"src":"21131:16:135","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$87148_storage_ptr","typeString":"struct OptimismPortal2.ProvenWithdrawal"}},"visibility":"internal"}],"id":87853,"initialValue":{"baseExpression":{"baseExpression":{"id":87848,"name":"provenWithdrawals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87199,"src":"21174:17:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_mapping$_t_address_$_t_struct$_ProvenWithdrawal_$87148_storage_$_$","typeString":"mapping(bytes32 => mapping(address => struct OptimismPortal2.ProvenWithdrawal storage ref))"}},"id":87850,"indexExpression":{"id":87849,"name":"_withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87840,"src":"21192:15:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"21174:34:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_ProvenWithdrawal_$87148_storage_$","typeString":"mapping(address => struct OptimismPortal2.ProvenWithdrawal storage ref)"}},"id":87852,"indexExpression":{"id":87851,"name":"_proofSubmitter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87842,"src":"21209:15:135","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"21174:51:135","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$87148_storage","typeString":"struct OptimismPortal2.ProvenWithdrawal storage ref"}},"nodeType":"VariableDeclarationStatement","src":"21131:94:135"},{"assignments":[87856],"declarations":[{"constant":false,"id":87856,"mutability":"mutable","name":"disputeGameProxy","nameLocation":"21248:16:135","nodeType":"VariableDeclaration","scope":87955,"src":"21235:29:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"},"typeName":{"id":87855,"nodeType":"UserDefinedTypeName","pathNode":{"id":87854,"name":"IDisputeGame","nodeType":"IdentifierPath","referencedDeclaration":100327,"src":"21235:12:135"},"referencedDeclaration":100327,"src":"21235:12:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"visibility":"internal"}],"id":87859,"initialValue":{"expression":{"id":87857,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87847,"src":"21267:16:135","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$87148_memory_ptr","typeString":"struct OptimismPortal2.ProvenWithdrawal memory"}},"id":87858,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"disputeGameProxy","nodeType":"MemberAccess","referencedDeclaration":87145,"src":"21267:33:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"nodeType":"VariableDeclarationStatement","src":"21235:65:135"},{"expression":{"arguments":[{"id":87864,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"21372:39:135","subExpression":{"baseExpression":{"id":87861,"name":"disputeGameBlacklist","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87205,"src":"21373:20:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_contract$_IDisputeGame_$100327_$_t_bool_$","typeString":"mapping(contract IDisputeGame => bool)"}},"id":87863,"indexExpression":{"id":87862,"name":"disputeGameProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87856,"src":"21394:16:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"21373:38:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a20646973707574652067616d6520686173206265656e20626c61636b6c6973746564","id":87865,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"21413:51:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_73f1817c6693b1e67cebb729644f638bfff163fd990e09b18d9a753bee9d3156","typeString":"literal_string \"OptimismPortal: dispute game has been blacklisted\""},"value":"OptimismPortal: dispute game has been blacklisted"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_73f1817c6693b1e67cebb729644f638bfff163fd990e09b18d9a753bee9d3156","typeString":"literal_string \"OptimismPortal: dispute game has been blacklisted\""}],"id":87860,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"21364:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87866,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21364:101:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87867,"nodeType":"ExpressionStatement","src":"21364:101:135"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":87872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87869,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87847,"src":"21728:16:135","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$87148_memory_ptr","typeString":"struct OptimismPortal2.ProvenWithdrawal memory"}},"id":87870,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":87147,"src":"21728:26:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":87871,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21758:1:135","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"21728:31:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e6f74206265656e2070726f76656e2062792070726f6f66207375626d6974746572206164647265737320796574","id":87873,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"21773:79:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_dff7e2322b891da5e795cf007265ba6491e079cdcc6285755ab2ef47d12c1b3e","typeString":"literal_string \"OptimismPortal: withdrawal has not been proven by proof submitter address yet\""},"value":"OptimismPortal: withdrawal has not been proven by proof submitter address yet"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_dff7e2322b891da5e795cf007265ba6491e079cdcc6285755ab2ef47d12c1b3e","typeString":"literal_string \"OptimismPortal: withdrawal has not been proven by proof submitter address yet\""}],"id":87868,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"21707:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87874,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21707:155:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87875,"nodeType":"ExpressionStatement","src":"21707:155:135"},{"assignments":[87877],"declarations":[{"constant":false,"id":87877,"mutability":"mutable","name":"createdAt","nameLocation":"21880:9:135","nodeType":"VariableDeclaration","scope":87955,"src":"21873:16:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":87876,"name":"uint64","nodeType":"ElementaryTypeName","src":"21873:6:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"id":87883,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87878,"name":"disputeGameProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87856,"src":"21892:16:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"id":87879,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"createdAt","nodeType":"MemberAccess","referencedDeclaration":100260,"src":"21892:26:135","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"function () view external returns (Timestamp)"}},"id":87880,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21892:28:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"id":87881,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101124,"src":"21892:32:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Timestamp_$103261_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"function (Timestamp) pure returns (uint64)"}},"id":87882,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"21892:34:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"VariableDeclarationStatement","src":"21873:53:135"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":87888,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87885,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87847,"src":"22211:16:135","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$87148_memory_ptr","typeString":"struct OptimismPortal2.ProvenWithdrawal memory"}},"id":87886,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":87147,"src":"22211:26:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":87887,"name":"createdAt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87877,"src":"22240:9:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"22211:38:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657374616d70206c657373207468616e20646973707574652067616d65206372656174696f6e2074696d657374616d70","id":87889,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"22263:80:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_0ad74f1e06ee42b3b76dc1e11cd4cd398b1f9faab8a48965612e5077366f3ac5","typeString":"literal_string \"OptimismPortal: withdrawal timestamp less than dispute game creation timestamp\""},"value":"OptimismPortal: withdrawal timestamp less than dispute game creation timestamp"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_0ad74f1e06ee42b3b76dc1e11cd4cd398b1f9faab8a48965612e5077366f3ac5","typeString":"literal_string \"OptimismPortal: withdrawal timestamp less than dispute game creation timestamp\""}],"id":87884,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"22190:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87890,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22190:163:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87891,"nodeType":"ExpressionStatement","src":"22190:163:135"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":87899,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":87897,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87893,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"22485:5:135","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":87894,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"22485:15:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"expression":{"id":87895,"name":"provenWithdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87847,"src":"22503:16:135","typeDescriptions":{"typeIdentifier":"t_struct$_ProvenWithdrawal_$87148_memory_ptr","typeString":"struct OptimismPortal2.ProvenWithdrawal memory"}},"id":87896,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":87147,"src":"22503:26:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"22485:44:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":87898,"name":"PROOF_MATURITY_DELAY_SECONDS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87151,"src":"22532:28:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22485:75:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a2070726f76656e207769746864726177616c20686173206e6f74206d61747572656420796574","id":87900,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"22574:55:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_76db07ababbe7ead3930082886fa1efd5937fe1ef0c82ee1c6b5f5e6f3c5b440","typeString":"literal_string \"OptimismPortal: proven withdrawal has not matured yet\""},"value":"OptimismPortal: proven withdrawal has not matured yet"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_76db07ababbe7ead3930082886fa1efd5937fe1ef0c82ee1c6b5f5e6f3c5b440","typeString":"literal_string \"OptimismPortal: proven withdrawal has not matured yet\""}],"id":87892,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"22464:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87901,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22464:175:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87902,"nodeType":"ExpressionStatement","src":"22464:175:135"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"},"id":87909,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87904,"name":"disputeGameProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87856,"src":"22943:16:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"id":87905,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"status","nodeType":"MemberAccess","referencedDeclaration":100274,"src":"22943:23:135","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_enum$_GameStatus_$103277_$","typeString":"function () view external returns (enum GameStatus)"}},"id":87906,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22943:25:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":87907,"name":"GameStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103277,"src":"22972:10:135","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_GameStatus_$103277_$","typeString":"type(enum GameStatus)"}},"id":87908,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"DEFENDER_WINS","nodeType":"MemberAccess","referencedDeclaration":103276,"src":"22972:24:135","typeDescriptions":{"typeIdentifier":"t_enum$_GameStatus_$103277","typeString":"enum GameStatus"}},"src":"22943:53:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c20686173206e6f74206265656e2076616c696461746564","id":87910,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"23010:56:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_6a59e1f27f0a2f1f7f0bcad40a1f45d3cc032caa0d85e86ecaf6cb415c3f90fc","typeString":"literal_string \"OptimismPortal: output proposal has not been validated\""},"value":"OptimismPortal: output proposal has not been validated"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_6a59e1f27f0a2f1f7f0bcad40a1f45d3cc032caa0d85e86ecaf6cb415c3f90fc","typeString":"literal_string \"OptimismPortal: output proposal has not been validated\""}],"id":87903,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"22922:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87911,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"22922:154:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87912,"nodeType":"ExpressionStatement","src":"22922:154:135"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":87922,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87914,"name":"disputeGameProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87856,"src":"23349:16:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"id":87915,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"gameType","nodeType":"MemberAccess","referencedDeclaration":100281,"src":"23349:25:135","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_userDefinedValueType$_GameType_$103271_$","typeString":"function () view external returns (GameType)"}},"id":87916,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23349:27:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"id":87917,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101150,"src":"23349:31:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameType_$103271_$returns$_t_uint32_$bound_to$_t_userDefinedValueType$_GameType_$103271_$","typeString":"function (GameType) pure returns (uint32)"}},"id":87918,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23349:33:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87919,"name":"respectedGameType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87209,"src":"23386:17:135","typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_GameType_$103271","typeString":"GameType"}},"id":87920,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101150,"src":"23386:21:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_GameType_$103271_$returns$_t_uint32_$bound_to$_t_userDefinedValueType$_GameType_$103271_$","typeString":"function (GameType) pure returns (uint32)"}},"id":87921,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23386:23:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"23349:60:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797065","id":87923,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"23411:35:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_ea6e52a7a06be8d460d58a9fb591f5b7ad20643cdd834b0004aaeaa0647b1d4b","typeString":"literal_string \"OptimismPortal: invalid game type\""},"value":"OptimismPortal: invalid game type"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ea6e52a7a06be8d460d58a9fb591f5b7ad20643cdd834b0004aaeaa0647b1d4b","typeString":"literal_string \"OptimismPortal: invalid game type\""}],"id":87913,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"23341:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87924,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23341:106:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87925,"nodeType":"ExpressionStatement","src":"23341:106:135"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":87929,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":87927,"name":"createdAt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87877,"src":"23709:9:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":87928,"name":"respectedGameTypeUpdatedAt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87212,"src":"23722:26:135","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"23709:39:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a20646973707574652067616d652063726561746564206265666f7265207265737065637465642067616d652074797065207761732075706461746564","id":87930,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"23762:77:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_eb316f1f3803f121f540c3c08dac6b170256917a9481e6e8393a29885b3a291f","typeString":"literal_string \"OptimismPortal: dispute game created before respected game type was updated\""},"value":"OptimismPortal: dispute game created before respected game type was updated"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_eb316f1f3803f121f540c3c08dac6b170256917a9481e6e8393a29885b3a291f","typeString":"literal_string \"OptimismPortal: dispute game created before respected game type was updated\""}],"id":87926,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"23688:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87931,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"23688:161:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87932,"nodeType":"ExpressionStatement","src":"23688:161:135"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":87943,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":87941,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":87934,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"24166:5:135","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":87935,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"24166:15:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":87936,"name":"disputeGameProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87856,"src":"24184:16:135","typeDescriptions":{"typeIdentifier":"t_contract$_IDisputeGame_$100327","typeString":"contract IDisputeGame"}},"id":87937,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"resolvedAt","nodeType":"MemberAccess","referencedDeclaration":100267,"src":"24184:27:135","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"function () view external returns (Timestamp)"}},"id":87938,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"24184:29:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_userDefinedValueType$_Timestamp_$103261","typeString":"Timestamp"}},"id":87939,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"raw","nodeType":"MemberAccess","referencedDeclaration":101124,"src":"24184:33:135","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_userDefinedValueType$_Timestamp_$103261_$returns$_t_uint64_$bound_to$_t_userDefinedValueType$_Timestamp_$103261_$","typeString":"function (Timestamp) pure returns (uint64)"}},"id":87940,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"24184:35:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"24166:53:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":87942,"name":"DISPUTE_GAME_FINALITY_DELAY_SECONDS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87154,"src":"24222:35:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24166:91:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c20696e206169722d676170","id":87944,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"24271:44:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_2a9b71e2152e178b3e39fef8c45fff793ac6b1f468eb7fbc612e0d564625c10f","typeString":"literal_string \"OptimismPortal: output proposal in air-gap\""},"value":"OptimismPortal: output proposal in air-gap"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2a9b71e2152e178b3e39fef8c45fff793ac6b1f468eb7fbc612e0d564625c10f","typeString":"literal_string \"OptimismPortal: output proposal in air-gap\""}],"id":87933,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"24145:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87945,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"24145:180:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87946,"nodeType":"ExpressionStatement","src":"24145:180:135"},{"expression":{"arguments":[{"id":87951,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"24441:38:135","subExpression":{"baseExpression":{"id":87948,"name":"finalizedWithdrawals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87170,"src":"24442:20:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"}},"id":87950,"indexExpression":{"id":87949,"name":"_withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87840,"src":"24463:15:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"24442:37:135","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4f7074696d69736d506f7274616c3a207769746864726177616c2068617320616c7265616479206265656e2066696e616c697a6564","id":87952,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"24481:55:135","typeDescriptions":{"typeIdentifier":"t_stringliteral_2a1157cbf4171a399f26106a5211324151853c78d2faca1fb1d3acbf755aa485","typeString":"literal_string \"OptimismPortal: withdrawal has already been finalized\""},"value":"OptimismPortal: withdrawal has already been finalized"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2a1157cbf4171a399f26106a5211324151853c78d2faca1fb1d3acbf755aa485","typeString":"literal_string \"OptimismPortal: withdrawal has already been finalized\""}],"id":87947,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"24433:7:135","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":87953,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"24433:104:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87954,"nodeType":"ExpressionStatement","src":"24433:104:135"}]},"documentation":{"id":87838,"nodeType":"StructuredDocumentation","src":"20715:314:135","text":"@notice Checks if a withdrawal can be finalized. This function will revert if the withdrawal cannot be\n finalized, and otherwise has no side-effects.\n @param _withdrawalHash Hash of the withdrawal to check.\n @param _proofSubmitter The submitter of the proof for the withdrawal hash"},"functionSelector":"71c1566e","implemented":true,"kind":"function","modifiers":[],"name":"checkWithdrawal","nameLocation":"21043:15:135","parameters":{"id":87843,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87840,"mutability":"mutable","name":"_withdrawalHash","nameLocation":"21067:15:135","nodeType":"VariableDeclaration","scope":87956,"src":"21059:23:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":87839,"name":"bytes32","nodeType":"ElementaryTypeName","src":"21059:7:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":87842,"mutability":"mutable","name":"_proofSubmitter","nameLocation":"21092:15:135","nodeType":"VariableDeclaration","scope":87956,"src":"21084:23:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":87841,"name":"address","nodeType":"ElementaryTypeName","src":"21084:7:135","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"21058:50:135"},"returnParameters":{"id":87844,"nodeType":"ParameterList","parameters":[],"src":"21121:0:135"},"scope":87971,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":87970,"nodeType":"FunctionDefinition","src":"24767:148:135","nodes":[],"body":{"id":87969,"nodeType":"Block","src":"24852:63:135","nodes":[],"statements":[{"expression":{"expression":{"baseExpression":{"id":87964,"name":"proofSubmitters","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87218,"src":"24869:15:135","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_array$_t_address_$dyn_storage_$","typeString":"mapping(bytes32 => address[] storage ref)"}},"id":87966,"indexExpression":{"id":87965,"name":"_withdrawalHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":87959,"src":"24885:15:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"24869:32:135","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage","typeString":"address[] storage ref"}},"id":87967,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"24869:39:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":87963,"id":87968,"nodeType":"Return","src":"24862:46:135"}]},"documentation":{"id":87957,"nodeType":"StructuredDocumentation","src":"24550:212:135","text":"@notice External getter for the number of proof submitters for a withdrawal hash.\n @param _withdrawalHash Hash of the withdrawal.\n @return The number of proof submitters for the withdrawal hash."},"functionSelector":"513747ab","implemented":true,"kind":"function","modifiers":[],"name":"numProofSubmitters","nameLocation":"24776:18:135","parameters":{"id":87960,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87959,"mutability":"mutable","name":"_withdrawalHash","nameLocation":"24803:15:135","nodeType":"VariableDeclaration","scope":87970,"src":"24795:23:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":87958,"name":"bytes32","nodeType":"ElementaryTypeName","src":"24795:7:135","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"24794:25:135"},"returnParameters":{"id":87963,"nodeType":"ParameterList","parameters":[{"constant":false,"id":87962,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":87970,"src":"24843:7:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87961,"name":"uint256","nodeType":"ElementaryTypeName","src":"24843:7:135","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"24842:9:135"},"scope":87971,"stateMutability":"view","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[{"baseName":{"id":87137,"name":"Initializable","nodeType":"IdentifierPath","referencedDeclaration":49678,"src":"1338:13:135"},"id":87138,"nodeType":"InheritanceSpecifier","src":"1338:13:135"},{"baseName":{"id":87139,"name":"ResourceMetering","nodeType":"IdentifierPath","referencedDeclaration":88581,"src":"1353:16:135"},"id":87140,"nodeType":"InheritanceSpecifier","src":"1353:16:135"},{"baseName":{"id":87141,"name":"ISemver","nodeType":"IdentifierPath","referencedDeclaration":109417,"src":"1371:7:135"},"id":87142,"nodeType":"InheritanceSpecifier","src":"1371:7:135"}],"canonicalName":"OptimismPortal2","contractDependencies":[],"contractKind":"contract","documentation":{"id":87136,"nodeType":"StructuredDocumentation","src":"971:339:135","text":"@custom:proxied\n @title OptimismPortal2\n @notice The OptimismPortal is a low-level contract responsible for passing messages between L1\n and L2. Messages sent directly to the OptimismPortal have no form of replayability.\n Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface."},"fullyImplemented":true,"linearizedBaseContracts":[87971,109417,88581,49678],"name":"OptimismPortal2","nameLocation":"1319:15:135","scope":87972,"usedErrors":[88238,103969,103972,103975,103987,103990,103993]}],"license":"MIT"},"id":135} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/ProxyAdmin.json b/packages/sdk/src/forge-artifacts/ProxyAdmin.json new file mode 100644 index 000000000000..2edb1663c68a --- /dev/null +++ b/packages/sdk/src/forge-artifacts/ProxyAdmin.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_owner","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"addressManager","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract AddressManager"}],"stateMutability":"view"},{"type":"function","name":"changeProxyAdmin","inputs":[{"name":"_proxy","type":"address","internalType":"address payable"},{"name":"_newAdmin","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getProxyAdmin","inputs":[{"name":"_proxy","type":"address","internalType":"address payable"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getProxyImplementation","inputs":[{"name":"_proxy","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"implementationName","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"isUpgrading","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxyType","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ProxyAdmin.ProxyType"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setAddress","inputs":[{"name":"_name","type":"string","internalType":"string"},{"name":"_address","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setAddressManager","inputs":[{"name":"_address","type":"address","internalType":"contract AddressManager"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setImplementationName","inputs":[{"name":"_address","type":"address","internalType":"address"},{"name":"_name","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setProxyType","inputs":[{"name":"_address","type":"address","internalType":"address"},{"name":"_type","type":"uint8","internalType":"enum ProxyAdmin.ProxyType"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setUpgrading","inputs":[{"name":"_upgrading","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgrade","inputs":[{"name":"_proxy","type":"address","internalType":"address payable"},{"name":"_implementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeAndCall","inputs":[{"name":"_proxy","type":"address","internalType":"address payable"},{"name":"_implementation","type":"address","internalType":"address"},{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b5060405162001a5f38038062001a5f8339810160408190526200003491620000a1565b6200003f3362000051565b6200004a8162000051565b50620000d3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000b457600080fd5b81516001600160a01b0381168114620000cc57600080fd5b9392505050565b61197c80620000e36000396000f3fe60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a","sourceMap":"1241:8036:234:-:0;;;2494:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;936:32:40;719:10:60;936:18:40;:32::i;:::-;2542:26:234::1;2561:6:::0;2542:18:::1;:26::i;:::-;2494:81:::0;1241:8036;;2433:187:40;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:40;;;-1:-1:-1;;;;;;2541:17:40;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:290:357:-;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:357;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:357:o;:::-;1241:8036:234;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a","sourceMap":"1241:8036:234:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3571:113;;;;;;;;;;-1:-1:-1;3571:113:234;;;;;:::i;:::-;;:::i;:::-;;4430:97;;;;;;;;;;-1:-1:-1;4430:97:234;;;;;:::i;:::-;;:::i;5236:569::-;;;;;;;;;;-1:-1:-1;5236:569:234;;;;;:::i;:::-;;:::i;:::-;;;1204:42:357;1192:55;;;1174:74;;1162:2;1147:18;5236:569:234;;;;;;;;2087:52;;;;;;;;;;-1:-1:-1;2087:52:234;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2273:36::-;;;;;;;;;;-1:-1:-1;2273:36:234;;;;;;;;1760:46;;;;;;;;;;-1:-1:-1;1760:46:234;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;1831:101:40:-;;;;;;;;;;;;;:::i;6689:531:234:-;;;;;;;;;;-1:-1:-1;6689:531:234;;;;;:::i;:::-;;:::i;3219:142::-;;;;;;;;;;-1:-1:-1;3219:142:234;;;;;:::i;:::-;;:::i;2796:120::-;;;;;;;;;;-1:-1:-1;2796:120:234;;;;;:::i;:::-;;:::i;1201:85:40:-;;;;;;;;;;-1:-1:-1;1247:7:40;1273:6;;;1201:85;;8644:631:234;;;;;;:::i;:::-;;:::i;7423:816::-;;;;;;;;;;-1:-1:-1;7423:816:234;;;;;:::i;:::-;;:::i;4126:137::-;;;;;;;;;;-1:-1:-1;4126:137:234;;;;;:::i;:::-;;:::i;4941:85::-;;;;;;;;;;-1:-1:-1;5010:9:234;;;;;;;4941:85;;7028:14:357;;7021:22;7003:41;;6991:2;6976:18;4941:85:234;6863:187:357;2081:198:40;;;;;;;;;;-1:-1:-1;2081:198:40;;;;;:::i;:::-;;:::i;5988:519:234:-;;;;;;;;;;-1:-1:-1;5988:519:234;;;;;:::i;:::-;;:::i;3571:113::-;1094:13:40;:11;:13::i;:::-;3652:14:234::1;:25:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;3571:113::o;4430:97::-;1094:13:40;:11;:13::i;:::-;4498:9:234::1;:22:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;4430:97::o;5236:569::-;5344:17;;;5307:7;5344:17;;;:9;:17;;;;;;;;5307:7;5375:5;:26;;;;;;;;:::i;:::-;;5371:428;;5444:6;5424:42;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5417:51;5236:569;-1:-1:-1;;;5236:569:234:o;5371:428::-;5498:20;5489:5;:29;;;;;;;;:::i;:::-;;5485:314;;5566:6;5541:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5485:314;5623:18;5614:5;:27;;;;;;;;:::i;:::-;;5610:189;;5664:14;;;5690:26;;;5664:14;5690:26;;;:18;:26;;;;;;;5664:53;;;;;:14;;;;;:25;;:53;;5690:26;5664:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5610:189;5748:40;;;;;9399:2:357;5748:40:234;;;9381:21:357;9438:2;9418:18;;;9411:30;9477:32;9457:18;;;9450:60;9527:18;;5748:40:234;;;;;;;;5610:189;5316:489;5236:569;;;:::o;2087:52::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1831:101:40:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;6689:531:234:-;1094:13:40;:11;:13::i;:::-;6805:17:234::1;::::0;::::1;6787:15;6805:17:::0;;;:9:::1;:17;::::0;;;;;::::1;;::::0;6836:5:::1;:26;;;;;;;;:::i;:::-;::::0;6832:382:::1;;6878:36;::::0;;;;:25:::1;1192:55:357::0;;;6878:36:234::1;::::0;::::1;1174:74:357::0;6878:25:234;::::1;::::0;::::1;::::0;1147:18:357;;6878:36:234::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;6777:443;6689:531:::0;;:::o;6832:382::-:1;6944:20;6935:5;:29;;;;;;;;:::i;:::-;::::0;6931:283:::1;;6980:45;::::0;;;;:34:::1;1192:55:357::0;;;6980:45:234::1;::::0;::::1;1174:74:357::0;6980:34:234;::::1;::::0;::::1;::::0;1147:18:357;;6980:45:234::1;1028:226:357::0;6931:283:234::1;7055:18;7046:5;:27;;;;;;;;:::i;:::-;::::0;7042:172:::1;;7089:14;::::0;:43:::1;::::0;;;;:14:::1;1192:55:357::0;;;7089:43:234::1;::::0;::::1;1174:74:357::0;7089:14:234;;::::1;::::0;:32:::1;::::0;1147:18:357;;7089:43:234::1;1028:226:357::0;7042:172:234::1;6777:443;6689:531:::0;;:::o;3219:142::-;1094:13:40;:11;:13::i;:::-;3318:28:234::1;::::0;::::1;;::::0;;;:18:::1;:28;::::0;;;;:36:::1;3349:5:::0;3318:28;:36:::1;:::i;2796:120::-:0;1094:13:40;:11;:13::i;:::-;2882:19:234::1;::::0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;;;:27;;2904:5;;2882:27;;;::::1;::::0;2904:5;2882:27:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;2796:120:::0;;:::o;8644:631::-;1094:13:40;:11;:13::i;:::-;8850:17:234::1;::::0;::::1;8832:15;8850:17:::0;;;:9:::1;:17;::::0;;;;;::::1;;::::0;8881:5:::1;:26;;;;;;;;:::i;:::-;::::0;8877:392:::1;;8923:74;::::0;;;;:30:::1;::::0;::::1;::::0;::::1;::::0;8962:9:::1;::::0;8923:74:::1;::::0;8974:15;;8991:5;;8923:74:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;;8877:392;;;9076:32;9084:6;9092:15;9076:7;:32::i;:::-;9123:12;9140:6;:11;;9160:9;9172:5;9140:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9122:56;;;9200:7;9192:66;;;::::0;::::1;::::0;;13277:2:357;9192:66:234::1;::::0;::::1;13259:21:357::0;13316:2;13296:18;;;13289:30;13355:34;13335:18;;;13328:62;13426:16;13406:18;;;13399:44;13460:19;;9192:66:234::1;13075:410:357::0;9192:66:234::1;9014:255;8877:392;8822:453;8644:631:::0;;;:::o;7423:816::-;1094:13:40;:11;:13::i;:::-;7534:17:234::1;::::0;::::1;7516:15;7534:17:::0;;;:9:::1;:17;::::0;;;;;::::1;;::::0;7565:5:::1;:26;;;;;;;;:::i;:::-;::::0;7561:672:::1;;7607:40;::::0;;;;:23:::1;1192:55:357::0;;;7607:40:234::1;::::0;::::1;1174:74:357::0;7607:23:234;::::1;::::0;::::1;::::0;1147:18:357;;7607:40:234::1;1028:226:357::0;7561:672:234::1;7677:20;7668:5;:29;;;;;;;;:::i;:::-;::::0;7664:569:::1;;7713:150;::::0;;;;1614:66:192::1;7713:150:234;::::0;::::1;13664:25:357::0;7713:36:234::1;7815:33:::0;;::::1;13705:18:357::0;;;13698:34;7713:36:234;::::1;::::0;::::1;::::0;13637:18:357;;7713:150:234::1;13490:248:357::0;7664:569:234::1;7893:18;7884:5;:27;;;;;;;;:::i;:::-;::::0;7880:353:::1;;7948:26;::::0;::::1;7927:18;7948:26:::0;;;:18:::1;:26;::::0;;;;7927:47;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;7988:14:234::1;::::0;:48:::1;::::0;;;;7927:47;;-1:-1:-1;7988:14:234::1;;::::0;:25:::1;::::0;-1:-1:-1;7988:48:234::1;::::0;-1:-1:-1;7927:47:234;;-1:-1:-1;8020:15:234;;7988:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7913:134;6777:443;6689:531:::0;;:::o;7880:353::-:1;8209:13;;:::i;4126:137::-:0;1094:13:40;:11;:13::i;:::-;4214:14:234::1;::::0;:42:::1;::::0;;;;:14:::1;::::0;;::::1;::::0;:25:::1;::::0;:42:::1;::::0;4240:5;;4247:8;;4214:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4126:137:::0;;:::o;2081:198:40:-;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;::::1;::::0;;14479:2:357;2161:73:40::1;::::0;::::1;14461:21:357::0;14518:2;14498:18;;;14491:30;14557:34;14537:18;;;14530:62;14628:8;14608:18;;;14601:36;14654:19;;2161:73:40::1;14277:402:357::0;2161:73:40::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;5988:519:234:-;6095:17;;;6058:7;6095:17;;;:9;:17;;;;;;;;6058:7;6126:5;:26;;;;;;;;:::i;:::-;;6122:379;;6195:6;6175:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6122:379;6240:20;6231:5;:29;;;;;;;;:::i;:::-;;6227:274;;6308:6;6283:41;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6227:274;6356:18;6347:5;:27;;;;;;;;:::i;:::-;;6343:158;;6397:14;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1359:130:40;1247:7;1273:6;1422:23;1273:6;719:10:60;1422:23:40;1414:68;;;;;;;14886:2:357;1414:68:40;;;14868:21:357;;;14905:18;;;14898:30;14964:34;14944:18;;;14937:62;15016:18;;1414:68:40;14684:356:357;2433:187:40;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:170:357:-;116:42;109:5;105:54;98:5;95:65;85:93;;174:1;171;164:12;189:288;273:6;326:2;314:9;305:7;301:23;297:32;294:52;;;342:1;339;332:12;294:52;381:9;368:23;400:47;441:5;400:47;:::i;482:273::-;538:6;591:2;579:9;570:7;566:23;562:32;559:52;;;607:1;604;597:12;559:52;646:9;633:23;699:5;692:13;685:21;678:5;675:32;665:60;;721:1;718;711:12;1259:258;1331:1;1341:113;1355:6;1352:1;1349:13;1341:113;;;1431:11;;;1425:18;1412:11;;;1405:39;1377:2;1370:10;1341:113;;;1472:6;1469:1;1466:13;1463:48;;;-1:-1:-1;;1507:1:357;1489:16;;1482:27;1259:258::o;1522:317::-;1564:3;1602:5;1596:12;1629:6;1624:3;1617:19;1645:63;1701:6;1694:4;1689:3;1685:14;1678:4;1671:5;1667:16;1645:63;:::i;:::-;1753:2;1741:15;1758:66;1737:88;1728:98;;;;1828:4;1724:109;;1522:317;-1:-1:-1;;1522:317:357:o;1844:220::-;1993:2;1982:9;1975:21;1956:4;2013:45;2054:2;2043:9;2039:18;2031:6;2013:45;:::i;2325:184::-;2377:77;2374:1;2367:88;2474:4;2471:1;2464:15;2498:4;2495:1;2488:15;2514:401;2662:2;2647:18;;2695:1;2684:13;;2674:201;;2731:77;2728:1;2721:88;2832:4;2829:1;2822:15;2860:4;2857:1;2850:15;2674:201;2884:25;;;2514:401;:::o;2920:428::-;2996:6;3004;3057:2;3045:9;3036:7;3032:23;3028:32;3025:52;;;3073:1;3070;3063:12;3025:52;3112:9;3099:23;3131:47;3172:5;3131:47;:::i;:::-;3197:5;-1:-1:-1;3254:2:357;3239:18;;3226:32;3267:49;3226:32;3267:49;:::i;:::-;3335:7;3325:17;;;2920:428;;;;;:::o;3353:184::-;3405:77;3402:1;3395:88;3502:4;3499:1;3492:15;3526:4;3523:1;3516:15;3542:334;3613:2;3607:9;3669:2;3659:13;;3674:66;3655:86;3643:99;;3772:18;3757:34;;3793:22;;;3754:62;3751:88;;;3819:18;;:::i;:::-;3855:2;3848:22;3542:334;;-1:-1:-1;3542:334:357:o;3881:246::-;3930:4;3963:18;3955:6;3952:30;3949:56;;;3985:18;;:::i;:::-;-1:-1:-1;4042:2:357;4030:15;4047:66;4026:88;4116:4;4022:99;;3881:246::o;4132:338::-;4197:5;4226:53;4242:36;4271:6;4242:36;:::i;:::-;4226:53;:::i;:::-;4217:62;;4302:6;4295:5;4288:21;4342:3;4333:6;4328:3;4324:16;4321:25;4318:45;;;4359:1;4356;4349:12;4318:45;4408:6;4403:3;4396:4;4389:5;4385:16;4372:43;4462:1;4455:4;4446:6;4439:5;4435:18;4431:29;4424:40;4132:338;;;;;:::o;4475:222::-;4518:5;4571:3;4564:4;4556:6;4552:17;4548:27;4538:55;;4589:1;4586;4579:12;4538:55;4611:80;4687:3;4678:6;4665:20;4658:4;4650:6;4646:17;4611:80;:::i;4702:473::-;4780:6;4788;4841:2;4829:9;4820:7;4816:23;4812:32;4809:52;;;4857:1;4854;4847:12;4809:52;4896:9;4883:23;4915:47;4956:5;4915:47;:::i;:::-;4981:5;-1:-1:-1;5037:2:357;5022:18;;5009:32;5064:18;5053:30;;5050:50;;;5096:1;5093;5086:12;5050:50;5119;5161:7;5152:6;5141:9;5137:22;5119:50;:::i;:::-;5109:60;;;4702:473;;;;;:::o;5180:429::-;5264:6;5272;5325:2;5313:9;5304:7;5300:23;5296:32;5293:52;;;5341:1;5338;5331:12;5293:52;5380:9;5367:23;5399:47;5440:5;5399:47;:::i;:::-;5465:5;-1:-1:-1;5522:2:357;5507:18;;5494:32;5557:1;5545:14;;5535:42;;5573:1;5570;5563:12;5614:766;5708:6;5716;5724;5777:2;5765:9;5756:7;5752:23;5748:32;5745:52;;;5793:1;5790;5783:12;5745:52;5832:9;5819:23;5851:47;5892:5;5851:47;:::i;:::-;5917:5;-1:-1:-1;5974:2:357;5959:18;;5946:32;5987:49;5946:32;5987:49;:::i;:::-;6055:7;-1:-1:-1;6113:2:357;6098:18;;6085:32;6140:18;6129:30;;6126:50;;;6172:1;6169;6162:12;6126:50;6195:22;;6248:4;6240:13;;6236:27;-1:-1:-1;6226:55:357;;6277:1;6274;6267:12;6226:55;6300:74;6366:7;6361:2;6348:16;6343:2;6339;6335:11;6300:74;:::i;:::-;6290:84;;;5614:766;;;;;:::o;6385:473::-;6463:6;6471;6524:2;6512:9;6503:7;6499:23;6495:32;6492:52;;;6540:1;6537;6530:12;6492:52;6580:9;6567:23;6613:18;6605:6;6602:30;6599:50;;;6645:1;6642;6635:12;6599:50;6668;6710:7;6701:6;6690:9;6686:22;6668:50;:::i;:::-;6658:60;;;6768:2;6757:9;6753:18;6740:32;6781:47;6822:5;6781:47;:::i;7331:267::-;7401:6;7454:2;7442:9;7433:7;7429:23;7425:32;7422:52;;;7470:1;7467;7460:12;7422:52;7502:9;7496:16;7521:47;7562:5;7521:47;:::i;7603:437::-;7682:1;7678:12;;;;7725;;;7746:61;;7800:4;7792:6;7788:17;7778:27;;7746:61;7853:2;7845:6;7842:14;7822:18;7819:38;7816:218;;7890:77;7887:1;7880:88;7991:4;7988:1;7981:15;8019:4;8016:1;8009:15;8171:1021;8280:4;8309:2;8338;8327:9;8320:21;8361:1;8394:6;8388:13;8424:36;8450:9;8424:36;:::i;:::-;8496:6;8491:2;8480:9;8476:18;8469:34;8522:2;8543:1;8575:2;8564:9;8560:18;8592:1;8587:216;;;;8817:1;8812:354;;;;8553:613;;8587:216;8650:66;8639:9;8635:82;8630:2;8619:9;8615:18;8608:110;8790:2;8778:6;8771:14;8764:22;8761:1;8757:30;8746:9;8742:46;8738:55;8731:62;;8587:216;;8812:354;8843:6;8840:1;8833:17;8891:2;8888:1;8878:16;8916:1;8930:180;8944:6;8941:1;8938:13;8930:180;;;9037:14;;9013:17;;;9009:26;;9002:50;9080:16;;;;8959:10;;8930:180;;;9134:17;;9130:26;;;-1:-1:-1;;8553:613:357;-1:-1:-1;9183:3:357;;8171:1021;-1:-1:-1;;;;;;;;8171:1021:357:o;9556:545::-;9658:2;9653:3;9650:11;9647:448;;;9694:1;9719:5;9715:2;9708:17;9764:4;9760:2;9750:19;9834:2;9822:10;9818:19;9815:1;9811:27;9805:4;9801:38;9870:4;9858:10;9855:20;9852:47;;;-1:-1:-1;9893:4:357;9852:47;9948:2;9943:3;9939:12;9936:1;9932:20;9926:4;9922:31;9912:41;;10003:82;10021:2;10014:5;10011:13;10003:82;;;10066:17;;;10047:1;10036:13;10003:82;;10337:1471;10463:3;10457:10;10490:18;10482:6;10479:30;10476:56;;;10512:18;;:::i;:::-;10541:97;10631:6;10591:38;10623:4;10617:11;10591:38;:::i;:::-;10585:4;10541:97;:::i;:::-;10693:4;;10757:2;10746:14;;10774:1;10769:782;;;;11595:1;11612:6;11609:89;;;-1:-1:-1;11664:19:357;;;11658:26;11609:89;10243:66;10234:1;10230:11;;;10226:84;10222:89;10212:100;10318:1;10314:11;;;10209:117;11711:81;;10739:1063;;10769:782;8118:1;8111:14;;;8155:4;8142:18;;10817:66;10805:79;;;10982:236;10996:7;10993:1;10990:14;10982:236;;;11085:19;;;11079:26;11064:42;;11177:27;;;;11145:1;11133:14;;;;11012:19;;10982:236;;;10986:3;11246:6;11237:7;11234:19;11231:261;;;11307:19;;;11301:26;11408:66;11390:1;11386:14;;;11402:3;11382:24;11378:97;11374:102;11359:118;11344:134;;11231:261;-1:-1:-1;;;;;11538:1:357;11522:14;;;11518:22;11505:36;;-1:-1:-1;10337:1471:357:o;11813:338::-;12000:42;11992:6;11988:55;11977:9;11970:74;12080:2;12075;12064:9;12060:18;12053:30;11951:4;12100:45;12141:2;12130:9;12126:18;12118:6;12100:45;:::i;:::-;12092:53;11813:338;-1:-1:-1;;;;11813:338:357:o;12156:635::-;12235:6;12288:2;12276:9;12267:7;12263:23;12259:32;12256:52;;;12304:1;12301;12294:12;12256:52;12337:9;12331:16;12370:18;12362:6;12359:30;12356:50;;;12402:1;12399;12392:12;12356:50;12425:22;;12478:4;12470:13;;12466:27;-1:-1:-1;12456:55:357;;12507:1;12504;12497:12;12456:55;12536:2;12530:9;12561:49;12577:32;12606:2;12577:32;:::i;12561:49::-;12633:2;12626:5;12619:17;12673:7;12668:2;12663;12659;12655:11;12651:20;12648:33;12645:53;;;12694:1;12691;12684:12;12645:53;12707:54;12758:2;12753;12746:5;12742:14;12737:2;12733;12729:11;12707:54;:::i;:::-;12780:5;12156:635;-1:-1:-1;;;;;12156:635:357:o;12796:274::-;12925:3;12963:6;12957:13;12979:53;13025:6;13020:3;13013:4;13005:6;13001:17;12979:53;:::i;:::-;13048:16;;;;;12796:274;-1:-1:-1;;12796:274:357:o;13743:340::-;13920:2;13909:9;13902:21;13883:4;13940:45;13981:2;13970:9;13966:18;13958:6;13940:45;:::i;:::-;13932:53;;14033:42;14025:6;14021:55;14016:2;14005:9;14001:18;13994:83;13743:340;;;;;:::o;14088:184::-;14140:77;14137:1;14130:88;14237:4;14234:1;14227:15;14261:4;14258:1;14251:15","linkReferences":{}},"methodIdentifiers":{"addressManager()":"3ab76e9f","changeProxyAdmin(address,address)":"7eff275e","getProxyAdmin(address)":"f3b7dead","getProxyImplementation(address)":"204e1c7a","implementationName(address)":"238181ae","isUpgrading()":"b7947262","owner()":"8da5cb5b","proxyType(address)":"6bd9f516","renounceOwnership()":"715018a6","setAddress(string,address)":"9b2ea4bd","setAddressManager(address)":"0652b57a","setImplementationName(address,string)":"860f7cda","setProxyType(address,uint8)":"8d52d4a0","setUpgrading(bool)":"07c8f7b0","transferOwnership(address)":"f2fde38b","upgrade(address,address)":"99a88ec4","upgradeAndCall(address,address,bytes)":"9623609d"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"contract AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_proxy\",\"type\":\"address\"}],\"name\":\"getProxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_proxy\",\"type\":\"address\"}],\"name\":\"getProxyImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"implementationName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isUpgrading\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"proxyType\",\"outputs\":[{\"internalType\":\"enum ProxyAdmin.ProxyType\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract AddressManager\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddressManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"setImplementationName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"enum ProxyAdmin.ProxyType\",\"name\":\"_type\",\"type\":\"uint8\"}],\"name\":\"setProxyType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_upgrading\",\"type\":\"bool\"}],\"name\":\"setUpgrading\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"name\":\"upgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"upgradeAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"changeProxyAdmin(address,address)\":{\"params\":{\"_newAdmin\":\"Address of the new proxy admin.\",\"_proxy\":\"Address of the proxy to update.\"}},\"constructor\":{\"params\":{\"_owner\":\"Address of the initial owner of this contract.\"}},\"getProxyAdmin(address)\":{\"params\":{\"_proxy\":\"Address of the proxy to get the admin of.\"},\"returns\":{\"_0\":\"Address of the admin of the proxy.\"}},\"getProxyImplementation(address)\":{\"params\":{\"_proxy\":\"Address of the proxy to get the implementation of.\"},\"returns\":{\"_0\":\"Address of the implementation of the proxy.\"}},\"isUpgrading()\":{\"custom:legacy\":\"@notice Legacy function used to tell ChugSplashProxy contracts if an upgrade is happening.\",\"returns\":{\"_0\":\"Whether or not there is an upgrade going on. May not actually tell you whether an upgrade is going on, since we don't currently plan to use this variable for anything other than a legacy indicator to fix a UX bug in the ChugSplash proxy.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAddress(string,address)\":{\"custom:legacy\":\"@notice Set an address in the address manager. Since only the owner of the AddressManager can directly modify addresses and the ProxyAdmin will own the AddressManager, this gives the owner of the ProxyAdmin the ability to modify addresses directly.\",\"params\":{\"_address\":\"Address to attach to the given name.\",\"_name\":\"Name to set within the AddressManager.\"}},\"setAddressManager(address)\":{\"params\":{\"_address\":\"Address of the AddressManager.\"}},\"setImplementationName(address,string)\":{\"params\":{\"_address\":\"Address of the ResolvedDelegateProxy.\",\"_name\":\"Name of the implementation for the proxy.\"}},\"setProxyType(address,uint8)\":{\"params\":{\"_address\":\"Address of the proxy.\",\"_type\":\"Type of the proxy.\"}},\"setUpgrading(bool)\":{\"custom:legacy\":\"@notice Set the upgrading status for the Chugsplash proxy type.\",\"params\":{\"_upgrading\":\"Whether or not the system is upgrading.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgrade(address,address)\":{\"params\":{\"_implementation\":\"Address of the new implementation address.\",\"_proxy\":\"Address of the proxy to upgrade.\"}},\"upgradeAndCall(address,address,bytes)\":{\"params\":{\"_data\":\"Data to trigger the new implementation with.\",\"_implementation\":\"Address of the new implementation address.\",\"_proxy\":\"Address of the proxy to upgrade.\"}}},\"title\":\"ProxyAdmin\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addressManager()\":{\"notice\":\"The address of the address manager, this is required to manage the ResolvedDelegateProxy type.\"},\"changeProxyAdmin(address,address)\":{\"notice\":\"Updates the admin of the given proxy address.\"},\"getProxyAdmin(address)\":{\"notice\":\"Returns the admin of the given proxy address.\"},\"getProxyImplementation(address)\":{\"notice\":\"Returns the implementation of the given proxy address.\"},\"implementationName(address)\":{\"notice\":\"A reverse mapping of addresses to names held in the AddressManager. This must be manually kept up to date with changes in the AddressManager for this contract to be able to work as an admin for the ResolvedDelegateProxy type.\"},\"proxyType(address)\":{\"notice\":\"A mapping of proxy types, used for backwards compatibility.\"},\"setAddressManager(address)\":{\"notice\":\"Set the address of the AddressManager. This is required to manage legacy ResolvedDelegateProxy type proxy contracts.\"},\"setImplementationName(address,string)\":{\"notice\":\"Sets the implementation name for a given address. Only required for ResolvedDelegateProxy type proxies that have an implementation name.\"},\"setProxyType(address,uint8)\":{\"notice\":\"Sets the proxy type for a given address. Only required for non-standard (legacy) proxy types.\"},\"upgrade(address,address)\":{\"notice\":\"Changes a proxy's implementation contract.\"},\"upgradeAndCall(address,address,bytes)\":{\"notice\":\"Changes a proxy's implementation contract and delegatecalls the new implementation with some given data. Useful for atomic upgrade-and-initialize calls.\"}},\"notice\":\"This is an auxiliary contract meant to be assigned as the admin of an ERC1967 Proxy, based on the OpenZeppelin implementation. It has backwards compatibility logic to work with the various types of proxies that have been deployed by Optimism in the past.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/universal/ProxyAdmin.sol\":\"ProxyAdmin\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f\",\"dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929\",\"dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689\",\"dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy\"]},\"lib/solmate/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c\",\"dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409\",\"dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM\"]},\"src/legacy/AddressManager.sol\":{\"keccak256\":\"0x1fcb990df6473f7fa360d5924d62d39ce2ca97d45668e3901e5405cfbe598b19\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9d08358b60dea54dbc32e988a1bb7ea909488063eaae3c5ae28a322f125c9b34\",\"dweb:/ipfs/QmZPQwdjLh9gaamNAoTUmWwwbRKj3yHovBYfnTPnfuKvUt\"]},\"src/legacy/L1ChugSplashProxy.sol\":{\"keccak256\":\"0xdde5626645fa217ad3a37805c4c3012e4251de01df868aae73b986f5d03cdb23\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a99fd0ec440c17c826465001dc88c5185dd41dc72396254fdd3cdfcc84aeae8c\",\"dweb:/ipfs/QmStHuecN89zBL8FH9SUK1TtkyYwfzMY2KkQaFJLHZLuyA\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72\",\"dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq\"]},\"src/libraries/Burn.sol\":{\"keccak256\":\"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f\",\"dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb\"]},\"src/libraries/Constants.sol\":{\"keccak256\":\"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b\",\"dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp\"]},\"src/universal/Proxy.sol\":{\"keccak256\":\"0x4f6f02e154bbb37137bcedcc256bef1e647865c79ec694fcaf5b6968799d7ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://00df4d4c6f4813c883eb33e1ec812c953840e78237fecf09c5739389c0777223\",\"dweb:/ipfs/QmQ1D5j7EwxBPtbQju55hKFQuruAwm8gnPHUTSXtDFjHUe\"]},\"src/universal/ProxyAdmin.sol\":{\"keccak256\":\"0xd15267cf5ed8c24d5a0f2099b8d470178d7ad729db52be16232eb143620b8dcf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e9300ee0feb16fcf6c06ee541f2496eac533256bd97f79fe2128527d2f096894\",\"dweb:/ipfs/Qme3Md8pGSnjkG94WFXUdi5UF3a47BTQgKCdGmTKcMgcRa\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"addressManager","outputs":[{"internalType":"contract AddressManager","name":"","type":"address"}]},{"inputs":[{"internalType":"address payable","name":"_proxy","type":"address"},{"internalType":"address","name":"_newAdmin","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"changeProxyAdmin"},{"inputs":[{"internalType":"address payable","name":"_proxy","type":"address"}],"stateMutability":"view","type":"function","name":"getProxyAdmin","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_proxy","type":"address"}],"stateMutability":"view","type":"function","name":"getProxyImplementation","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"implementationName","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"isUpgrading","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"proxyType","outputs":[{"internalType":"enum ProxyAdmin.ProxyType","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_address","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setAddress"},{"inputs":[{"internalType":"contract AddressManager","name":"_address","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setAddressManager"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"setImplementationName"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"enum ProxyAdmin.ProxyType","name":"_type","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"setProxyType"},{"inputs":[{"internalType":"bool","name":"_upgrading","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setUpgrading"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address payable","name":"_proxy","type":"address"},{"internalType":"address","name":"_implementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"upgrade"},{"inputs":[{"internalType":"address payable","name":"_proxy","type":"address"},{"internalType":"address","name":"_implementation","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeAndCall"}],"devdoc":{"kind":"dev","methods":{"changeProxyAdmin(address,address)":{"params":{"_newAdmin":"Address of the new proxy admin.","_proxy":"Address of the proxy to update."}},"constructor":{"params":{"_owner":"Address of the initial owner of this contract."}},"getProxyAdmin(address)":{"params":{"_proxy":"Address of the proxy to get the admin of."},"returns":{"_0":"Address of the admin of the proxy."}},"getProxyImplementation(address)":{"params":{"_proxy":"Address of the proxy to get the implementation of."},"returns":{"_0":"Address of the implementation of the proxy."}},"isUpgrading()":{"custom:legacy":"@notice Legacy function used to tell ChugSplashProxy contracts if an upgrade is happening.","returns":{"_0":"Whether or not there is an upgrade going on. May not actually tell you whether an upgrade is going on, since we don't currently plan to use this variable for anything other than a legacy indicator to fix a UX bug in the ChugSplash proxy."}},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"setAddress(string,address)":{"custom:legacy":"@notice Set an address in the address manager. Since only the owner of the AddressManager can directly modify addresses and the ProxyAdmin will own the AddressManager, this gives the owner of the ProxyAdmin the ability to modify addresses directly.","params":{"_address":"Address to attach to the given name.","_name":"Name to set within the AddressManager."}},"setAddressManager(address)":{"params":{"_address":"Address of the AddressManager."}},"setImplementationName(address,string)":{"params":{"_address":"Address of the ResolvedDelegateProxy.","_name":"Name of the implementation for the proxy."}},"setProxyType(address,uint8)":{"params":{"_address":"Address of the proxy.","_type":"Type of the proxy."}},"setUpgrading(bool)":{"custom:legacy":"@notice Set the upgrading status for the Chugsplash proxy type.","params":{"_upgrading":"Whether or not the system is upgrading."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"upgrade(address,address)":{"params":{"_implementation":"Address of the new implementation address.","_proxy":"Address of the proxy to upgrade."}},"upgradeAndCall(address,address,bytes)":{"params":{"_data":"Data to trigger the new implementation with.","_implementation":"Address of the new implementation address.","_proxy":"Address of the proxy to upgrade."}}},"version":1},"userdoc":{"kind":"user","methods":{"addressManager()":{"notice":"The address of the address manager, this is required to manage the ResolvedDelegateProxy type."},"changeProxyAdmin(address,address)":{"notice":"Updates the admin of the given proxy address."},"getProxyAdmin(address)":{"notice":"Returns the admin of the given proxy address."},"getProxyImplementation(address)":{"notice":"Returns the implementation of the given proxy address."},"implementationName(address)":{"notice":"A reverse mapping of addresses to names held in the AddressManager. This must be manually kept up to date with changes in the AddressManager for this contract to be able to work as an admin for the ResolvedDelegateProxy type."},"proxyType(address)":{"notice":"A mapping of proxy types, used for backwards compatibility."},"setAddressManager(address)":{"notice":"Set the address of the AddressManager. This is required to manage legacy ResolvedDelegateProxy type proxy contracts."},"setImplementationName(address,string)":{"notice":"Sets the implementation name for a given address. Only required for ResolvedDelegateProxy type proxies that have an implementation name."},"setProxyType(address,uint8)":{"notice":"Sets the proxy type for a given address. Only required for non-standard (legacy) proxy types."},"upgrade(address,address)":{"notice":"Changes a proxy's implementation contract."},"upgradeAndCall(address,address,bytes)":{"notice":"Changes a proxy's implementation contract and delegatecalls the new implementation with some given data. Useful for atomic upgrade-and-initialize calls."}},"version":1}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/universal/ProxyAdmin.sol":"ProxyAdmin"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts/contracts/access/Ownable.sol":{"keccak256":"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673","urls":["bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2","dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x2a21b14ff90012878752f230d3ffd5c3405e5938d06c97a7d89c0a64561d0d66","urls":["bzz-raw://3313a8f9bb1f9476857c9050067b31982bf2140b83d84f3bc0cec1f62bbe947f","dweb:/ipfs/Qma17Pk8NRe7aB4UD3jjVxk7nSFaov3eQyv86hcyqkwJRV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0","urls":["bzz-raw://b600b852e0597aa69989cc263111f02097e2827edc1bdc70306303e3af5e9929","dweb:/ipfs/QmU4WfM28A1nDqghuuGeFmN3CnVrk6opWtiF65K4vhFPeC"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb3ebde1c8d27576db912d87c3560dab14adfb9cd001be95890ec4ba035e652e7","urls":["bzz-raw://a709421c4f5d4677db8216055d2d4dac96a613efdb08178a9f7041f0c5cef689","dweb:/ipfs/QmYs2rStvVLDnSJs8HgaMD1ABwoKKWdiVbQyNfLfFWTjTy"],"license":"MIT"},"lib/solmate/src/utils/FixedPointMathLib.sol":{"keccak256":"0x622fcd8a49e132df5ec7651cc6ae3aaf0cf59bdcd67a9a804a1b9e2485113b7d","urls":["bzz-raw://af77088eb606427d4c55e578984a615779c86bc30646a20f7bb27299ba390f7c","dweb:/ipfs/QmZGQdhdQDtHc7gZXWrKXgA3govc74X8U63BiWhPQK3mK8"],"license":"MIT"},"src/L1/ResourceMetering.sol":{"keccak256":"0xde3ac62c60f27a3f1ba06eec94f4eda45e7ec5544c6a5d6b79543a7184e44408","urls":["bzz-raw://265a2845c4ff0d9076dd0505755cf2bdf799f4fdc09ef016865a26b51f5c3409","dweb:/ipfs/QmRzSdBD8jmQf3U9u2ATRAzzuyo6c5ugz8VA5ZM4vzoGiM"],"license":"MIT"},"src/legacy/AddressManager.sol":{"keccak256":"0x1fcb990df6473f7fa360d5924d62d39ce2ca97d45668e3901e5405cfbe598b19","urls":["bzz-raw://9d08358b60dea54dbc32e988a1bb7ea909488063eaae3c5ae28a322f125c9b34","dweb:/ipfs/QmZPQwdjLh9gaamNAoTUmWwwbRKj3yHovBYfnTPnfuKvUt"],"license":"MIT"},"src/legacy/L1ChugSplashProxy.sol":{"keccak256":"0xdde5626645fa217ad3a37805c4c3012e4251de01df868aae73b986f5d03cdb23","urls":["bzz-raw://a99fd0ec440c17c826465001dc88c5185dd41dc72396254fdd3cdfcc84aeae8c","dweb:/ipfs/QmStHuecN89zBL8FH9SUK1TtkyYwfzMY2KkQaFJLHZLuyA"],"license":"MIT"},"src/libraries/Arithmetic.sol":{"keccak256":"0x91345e053584f82ad04d682ba821cf3ede808304f5b2a88116a894cf692c21db","urls":["bzz-raw://005e3c42d2edfca0a506cbda94d3b0104eddf20c00bd1bd25272f53f2ef74c72","dweb:/ipfs/QmdaW6Nge6NKoGvFqRpQjBpM2fXpc5y8WpZyBnDnKicdJq"],"license":"MIT"},"src/libraries/Burn.sol":{"keccak256":"0x90a795bcea3ef06d6d5011256c4bd63d1a4271f519246dbf1ee3e8f1c0e21010","urls":["bzz-raw://9f60c3aa77cf0c484ddda4754157cff4dc0e2eace4bea67990daff4c0612ab5f","dweb:/ipfs/QmSYGanMFve9uBC17X7hFneSFnwnJxz86Jgh6MX9BRMweb"],"license":"MIT"},"src/libraries/Constants.sol":{"keccak256":"0xe0aeec7d6e5d1e44a11405d3b5bfc384ea092c39bea0b763ab937a26fd427132","urls":["bzz-raw://11aa3bff9da26ca2545132ec7994866690446a5321023811c254410d9593bd9b","dweb:/ipfs/QmVxWqadxvdfkqdrhfWisDqeAthibn4HEE1P6o9aFxXLhp"],"license":"MIT"},"src/universal/Proxy.sol":{"keccak256":"0x4f6f02e154bbb37137bcedcc256bef1e647865c79ec694fcaf5b6968799d7ddc","urls":["bzz-raw://00df4d4c6f4813c883eb33e1ec812c953840e78237fecf09c5739389c0777223","dweb:/ipfs/QmQ1D5j7EwxBPtbQju55hKFQuruAwm8gnPHUTSXtDFjHUe"],"license":"MIT"},"src/universal/ProxyAdmin.sol":{"keccak256":"0xd15267cf5ed8c24d5a0f2099b8d470178d7ad729db52be16232eb143620b8dcf","urls":["bzz-raw://e9300ee0feb16fcf6c06ee541f2496eac533256bd97f79fe2128527d2f096894","dweb:/ipfs/Qme3Md8pGSnjkG94WFXUdi5UF3a47BTQgKCdGmTKcMgcRa"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":49330,"contract":"src/universal/ProxyAdmin.sol:ProxyAdmin","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":110483,"contract":"src/universal/ProxyAdmin.sol:ProxyAdmin","label":"proxyType","offset":0,"slot":"1","type":"t_mapping(t_address,t_enum(ProxyType)110477)"},{"astId":110488,"contract":"src/universal/ProxyAdmin.sol:ProxyAdmin","label":"implementationName","offset":0,"slot":"2","type":"t_mapping(t_address,t_string_storage)"},{"astId":110492,"contract":"src/universal/ProxyAdmin.sol:ProxyAdmin","label":"addressManager","offset":0,"slot":"3","type":"t_contract(AddressManager)102008"},{"astId":110495,"contract":"src/universal/ProxyAdmin.sol:ProxyAdmin","label":"upgrading","offset":20,"slot":"3","type":"t_bool"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_contract(AddressManager)102008":{"encoding":"inplace","label":"contract AddressManager","numberOfBytes":"20"},"t_enum(ProxyType)110477":{"encoding":"inplace","label":"enum ProxyAdmin.ProxyType","numberOfBytes":"1"},"t_mapping(t_address,t_enum(ProxyType)110477)":{"encoding":"mapping","key":"t_address","label":"mapping(address => enum ProxyAdmin.ProxyType)","numberOfBytes":"32","value":"t_enum(ProxyType)110477"},"t_mapping(t_address,t_string_storage)":{"encoding":"mapping","key":"t_address","label":"mapping(address => string)","numberOfBytes":"32","value":"t_string_storage"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"}}},"userdoc":{"version":1,"kind":"user","methods":{"addressManager()":{"notice":"The address of the address manager, this is required to manage the ResolvedDelegateProxy type."},"changeProxyAdmin(address,address)":{"notice":"Updates the admin of the given proxy address."},"getProxyAdmin(address)":{"notice":"Returns the admin of the given proxy address."},"getProxyImplementation(address)":{"notice":"Returns the implementation of the given proxy address."},"implementationName(address)":{"notice":"A reverse mapping of addresses to names held in the AddressManager. This must be manually kept up to date with changes in the AddressManager for this contract to be able to work as an admin for the ResolvedDelegateProxy type."},"proxyType(address)":{"notice":"A mapping of proxy types, used for backwards compatibility."},"setAddressManager(address)":{"notice":"Set the address of the AddressManager. This is required to manage legacy ResolvedDelegateProxy type proxy contracts."},"setImplementationName(address,string)":{"notice":"Sets the implementation name for a given address. Only required for ResolvedDelegateProxy type proxies that have an implementation name."},"setProxyType(address,uint8)":{"notice":"Sets the proxy type for a given address. Only required for non-standard (legacy) proxy types."},"upgrade(address,address)":{"notice":"Changes a proxy's implementation contract."},"upgradeAndCall(address,address,bytes)":{"notice":"Changes a proxy's implementation contract and delegatecalls the new implementation with some given data. Useful for atomic upgrade-and-initialize calls."}},"notice":"This is an auxiliary contract meant to be assigned as the admin of an ERC1967 Proxy, based on the OpenZeppelin implementation. It has backwards compatibility logic to work with the various types of proxies that have been deployed by Optimism in the past."},"devdoc":{"version":1,"kind":"dev","methods":{"changeProxyAdmin(address,address)":{"params":{"_newAdmin":"Address of the new proxy admin.","_proxy":"Address of the proxy to update."}},"constructor":{"params":{"_owner":"Address of the initial owner of this contract."}},"getProxyAdmin(address)":{"params":{"_proxy":"Address of the proxy to get the admin of."},"returns":{"_0":"Address of the admin of the proxy."}},"getProxyImplementation(address)":{"params":{"_proxy":"Address of the proxy to get the implementation of."},"returns":{"_0":"Address of the implementation of the proxy."}},"isUpgrading()":{"returns":{"_0":"Whether or not there is an upgrade going on. May not actually tell you whether an upgrade is going on, since we don't currently plan to use this variable for anything other than a legacy indicator to fix a UX bug in the ChugSplash proxy."}},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"setAddress(string,address)":{"params":{"_address":"Address to attach to the given name.","_name":"Name to set within the AddressManager."}},"setAddressManager(address)":{"params":{"_address":"Address of the AddressManager."}},"setImplementationName(address,string)":{"params":{"_address":"Address of the ResolvedDelegateProxy.","_name":"Name of the implementation for the proxy."}},"setProxyType(address,uint8)":{"params":{"_address":"Address of the proxy.","_type":"Type of the proxy."}},"setUpgrading(bool)":{"params":{"_upgrading":"Whether or not the system is upgrading."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"upgrade(address,address)":{"params":{"_implementation":"Address of the new implementation address.","_proxy":"Address of the proxy to upgrade."}},"upgradeAndCall(address,address,bytes)":{"params":{"_data":"Data to trigger the new implementation with.","_implementation":"Address of the new implementation address.","_proxy":"Address of the proxy to upgrade."}}},"title":"ProxyAdmin"},"ast":{"absolutePath":"src/universal/ProxyAdmin.sol","id":110910,"exportedSymbols":{"AddressManager":[102008],"Constants":[103096],"IStaticERC1967Proxy":[110458],"IStaticL1ChugSplashProxy":[110470],"L1ChugSplashProxy":[102516],"Ownable":[49435],"Proxy":[110434],"ProxyAdmin":[110909]},"nodeType":"SourceUnit","src":"32:9246:234","nodes":[{"id":110436,"nodeType":"PragmaDirective","src":"32:23:234","nodes":[],"literals":["solidity","0.8",".15"]},{"id":110438,"nodeType":"ImportDirective","src":"57:69:234","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/access/Ownable.sol","file":"@openzeppelin/contracts/access/Ownable.sol","nameLocation":"-1:-1:-1","scope":110910,"sourceUnit":49436,"symbolAliases":[{"foreign":{"id":110437,"name":"Ownable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":49435,"src":"66:7:234","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":110440,"nodeType":"ImportDirective","src":"127:48:234","nodes":[],"absolutePath":"src/universal/Proxy.sol","file":"src/universal/Proxy.sol","nameLocation":"-1:-1:-1","scope":110910,"sourceUnit":110435,"symbolAliases":[{"foreign":{"id":110439,"name":"Proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110434,"src":"136:5:234","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":110442,"nodeType":"ImportDirective","src":"176:63:234","nodes":[],"absolutePath":"src/legacy/AddressManager.sol","file":"src/legacy/AddressManager.sol","nameLocation":"-1:-1:-1","scope":110910,"sourceUnit":102009,"symbolAliases":[{"foreign":{"id":110441,"name":"AddressManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":102008,"src":"185:14:234","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":110444,"nodeType":"ImportDirective","src":"240:69:234","nodes":[],"absolutePath":"src/legacy/L1ChugSplashProxy.sol","file":"src/legacy/L1ChugSplashProxy.sol","nameLocation":"-1:-1:-1","scope":110910,"sourceUnit":102517,"symbolAliases":[{"foreign":{"id":110443,"name":"L1ChugSplashProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":102516,"src":"249:17:234","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":110446,"nodeType":"ImportDirective","src":"310:56:234","nodes":[],"absolutePath":"src/libraries/Constants.sol","file":"src/libraries/Constants.sol","nameLocation":"-1:-1:-1","scope":110910,"sourceUnit":103097,"symbolAliases":[{"foreign":{"id":110445,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"319:9:234","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":110458,"nodeType":"ContractDefinition","src":"483:151:234","nodes":[{"id":110452,"nodeType":"FunctionDefinition","src":"519:58:234","nodes":[],"functionSelector":"5c60da1b","implemented":false,"kind":"function","modifiers":[],"name":"implementation","nameLocation":"528:14:234","parameters":{"id":110448,"nodeType":"ParameterList","parameters":[],"src":"542:2:234"},"returnParameters":{"id":110451,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110450,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":110452,"src":"568:7:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110449,"name":"address","nodeType":"ElementaryTypeName","src":"568:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"567:9:234"},"scope":110458,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":110457,"nodeType":"FunctionDefinition","src":"583:49:234","nodes":[],"functionSelector":"f851a440","implemented":false,"kind":"function","modifiers":[],"name":"admin","nameLocation":"592:5:234","parameters":{"id":110453,"nodeType":"ParameterList","parameters":[],"src":"597:2:234"},"returnParameters":{"id":110456,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110455,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":110457,"src":"623:7:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110454,"name":"address","nodeType":"ElementaryTypeName","src":"623:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"622:9:234"},"scope":110458,"stateMutability":"view","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"IStaticERC1967Proxy","contractDependencies":[],"contractKind":"interface","documentation":{"id":110447,"nodeType":"StructuredDocumentation","src":"368:115:234","text":"@title IStaticERC1967Proxy\n @notice IStaticERC1967Proxy is a static version of the ERC1967 proxy interface."},"fullyImplemented":false,"linearizedBaseContracts":[110458],"name":"IStaticERC1967Proxy","nameLocation":"493:19:234","scope":110910,"usedErrors":[]},{"id":110470,"nodeType":"ContractDefinition","src":"764:162:234","nodes":[{"id":110464,"nodeType":"FunctionDefinition","src":"805:61:234","nodes":[],"functionSelector":"aaf10f42","implemented":false,"kind":"function","modifiers":[],"name":"getImplementation","nameLocation":"814:17:234","parameters":{"id":110460,"nodeType":"ParameterList","parameters":[],"src":"831:2:234"},"returnParameters":{"id":110463,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110462,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":110464,"src":"857:7:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110461,"name":"address","nodeType":"ElementaryTypeName","src":"857:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"856:9:234"},"scope":110470,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":110469,"nodeType":"FunctionDefinition","src":"872:52:234","nodes":[],"functionSelector":"893d20e8","implemented":false,"kind":"function","modifiers":[],"name":"getOwner","nameLocation":"881:8:234","parameters":{"id":110465,"nodeType":"ParameterList","parameters":[],"src":"889:2:234"},"returnParameters":{"id":110468,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110467,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":110469,"src":"915:7:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110466,"name":"address","nodeType":"ElementaryTypeName","src":"915:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"914:9:234"},"scope":110470,"stateMutability":"view","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"IStaticL1ChugSplashProxy","contractDependencies":[],"contractKind":"interface","documentation":{"id":110459,"nodeType":"StructuredDocumentation","src":"636:128:234","text":"@title IStaticL1ChugSplashProxy\n @notice IStaticL1ChugSplashProxy is a static version of the ChugSplash proxy interface."},"fullyImplemented":false,"linearizedBaseContracts":[110470],"name":"IStaticL1ChugSplashProxy","nameLocation":"774:24:234","scope":110910,"usedErrors":[]},{"id":110909,"nodeType":"ContractDefinition","src":"1241:8036:234","nodes":[{"id":110477,"nodeType":"EnumDefinition","src":"1602:76:234","nodes":[],"canonicalName":"ProxyAdmin.ProxyType","members":[{"id":110474,"name":"ERC1967","nameLocation":"1627:7:234","nodeType":"EnumValue","src":"1627:7:234"},{"id":110475,"name":"CHUGSPLASH","nameLocation":"1644:10:234","nodeType":"EnumValue","src":"1644:10:234"},{"id":110476,"name":"RESOLVED","nameLocation":"1664:8:234","nodeType":"EnumValue","src":"1664:8:234"}],"name":"ProxyType","nameLocation":"1607:9:234"},{"id":110483,"nodeType":"VariableDeclaration","src":"1760:46:234","nodes":[],"constant":false,"documentation":{"id":110478,"nodeType":"StructuredDocumentation","src":"1684:71:234","text":"@notice A mapping of proxy types, used for backwards compatibility."},"functionSelector":"6bd9f516","mutability":"mutable","name":"proxyType","nameLocation":"1797:9:234","scope":110909,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_ProxyType_$110477_$","typeString":"mapping(address => enum ProxyAdmin.ProxyType)"},"typeName":{"id":110482,"keyType":{"id":110479,"name":"address","nodeType":"ElementaryTypeName","src":"1768:7:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1760:29:234","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_ProxyType_$110477_$","typeString":"mapping(address => enum ProxyAdmin.ProxyType)"},"valueType":{"id":110481,"nodeType":"UserDefinedTypeName","pathNode":{"id":110480,"name":"ProxyType","nodeType":"IdentifierPath","referencedDeclaration":110477,"src":"1779:9:234"},"referencedDeclaration":110477,"src":"1779:9:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}}},"visibility":"public"},{"id":110488,"nodeType":"VariableDeclaration","src":"2087:52:234","nodes":[],"constant":false,"documentation":{"id":110484,"nodeType":"StructuredDocumentation","src":"1813:269:234","text":"@notice A reverse mapping of addresses to names held in the AddressManager. This must be\n manually kept up to date with changes in the AddressManager for this contract\n to be able to work as an admin for the ResolvedDelegateProxy type."},"functionSelector":"238181ae","mutability":"mutable","name":"implementationName","nameLocation":"2121:18:234","scope":110909,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string)"},"typeName":{"id":110487,"keyType":{"id":110485,"name":"address","nodeType":"ElementaryTypeName","src":"2095:7:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"2087:26:234","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string)"},"valueType":{"id":110486,"name":"string","nodeType":"ElementaryTypeName","src":"2106:6:234","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}}},"visibility":"public"},{"id":110492,"nodeType":"VariableDeclaration","src":"2273:36:234","nodes":[],"constant":false,"documentation":{"id":110489,"nodeType":"StructuredDocumentation","src":"2146:122:234","text":"@notice The address of the address manager, this is required to manage the\n ResolvedDelegateProxy type."},"functionSelector":"3ab76e9f","mutability":"mutable","name":"addressManager","nameLocation":"2295:14:234","scope":110909,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"},"typeName":{"id":110491,"nodeType":"UserDefinedTypeName","pathNode":{"id":110490,"name":"AddressManager","nodeType":"IdentifierPath","referencedDeclaration":102008,"src":"2273:14:234"},"referencedDeclaration":102008,"src":"2273:14:234","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"}},"visibility":"public"},{"id":110495,"nodeType":"VariableDeclaration","src":"2395:23:234","nodes":[],"constant":false,"documentation":{"id":110493,"nodeType":"StructuredDocumentation","src":"2316:74:234","text":"@notice A legacy upgrading indicator used by the old Chugsplash Proxy."},"mutability":"mutable","name":"upgrading","nameLocation":"2409:9:234","scope":110909,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":110494,"name":"bool","nodeType":"ElementaryTypeName","src":"2395:4:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"id":110508,"nodeType":"FunctionDefinition","src":"2494:81:234","nodes":[],"body":{"id":110507,"nodeType":"Block","src":"2532:43:234","nodes":[],"statements":[{"expression":{"arguments":[{"id":110504,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110498,"src":"2561:6:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":110503,"name":"_transferOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":49434,"src":"2542:18:234","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":110505,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2542:26:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110506,"nodeType":"ExpressionStatement","src":"2542:26:234"}]},"documentation":{"id":110496,"nodeType":"StructuredDocumentation","src":"2425:64:234","text":"@param _owner Address of the initial owner of this contract."},"implemented":true,"kind":"constructor","modifiers":[{"arguments":[],"id":110501,"kind":"baseConstructorSpecifier","modifierName":{"id":110500,"name":"Ownable","nodeType":"IdentifierPath","referencedDeclaration":49435,"src":"2522:7:234"},"nodeType":"ModifierInvocation","src":"2522:9:234"}],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":110499,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110498,"mutability":"mutable","name":"_owner","nameLocation":"2514:6:234","nodeType":"VariableDeclaration","scope":110508,"src":"2506:14:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110497,"name":"address","nodeType":"ElementaryTypeName","src":"2506:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2505:16:234"},"returnParameters":{"id":110502,"nodeType":"ParameterList","parameters":[],"src":"2532:0:234"},"scope":110909,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":110526,"nodeType":"FunctionDefinition","src":"2796:120:234","nodes":[],"body":{"id":110525,"nodeType":"Block","src":"2872:44:234","nodes":[],"statements":[{"expression":{"id":110523,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":110519,"name":"proxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110483,"src":"2882:9:234","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_ProxyType_$110477_$","typeString":"mapping(address => enum ProxyAdmin.ProxyType)"}},"id":110521,"indexExpression":{"id":110520,"name":"_address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110511,"src":"2892:8:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2882:19:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":110522,"name":"_type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110514,"src":"2904:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"2882:27:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"id":110524,"nodeType":"ExpressionStatement","src":"2882:27:234"}]},"documentation":{"id":110509,"nodeType":"StructuredDocumentation","src":"2581:210:234","text":"@notice Sets the proxy type for a given address. Only required for non-standard (legacy)\n proxy types.\n @param _address Address of the proxy.\n @param _type Type of the proxy."},"functionSelector":"8d52d4a0","implemented":true,"kind":"function","modifiers":[{"id":110517,"kind":"modifierInvocation","modifierName":{"id":110516,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":49354,"src":"2862:9:234"},"nodeType":"ModifierInvocation","src":"2862:9:234"}],"name":"setProxyType","nameLocation":"2805:12:234","parameters":{"id":110515,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110511,"mutability":"mutable","name":"_address","nameLocation":"2826:8:234","nodeType":"VariableDeclaration","scope":110526,"src":"2818:16:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110510,"name":"address","nodeType":"ElementaryTypeName","src":"2818:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":110514,"mutability":"mutable","name":"_type","nameLocation":"2846:5:234","nodeType":"VariableDeclaration","scope":110526,"src":"2836:15:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"typeName":{"id":110513,"nodeType":"UserDefinedTypeName","pathNode":{"id":110512,"name":"ProxyType","nodeType":"IdentifierPath","referencedDeclaration":110477,"src":"2836:9:234"},"referencedDeclaration":110477,"src":"2836:9:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"visibility":"internal"}],"src":"2817:35:234"},"returnParameters":{"id":110518,"nodeType":"ParameterList","parameters":[],"src":"2872:0:234"},"scope":110909,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":110543,"nodeType":"FunctionDefinition","src":"3219:142:234","nodes":[],"body":{"id":110542,"nodeType":"Block","src":"3308:53:234","nodes":[],"statements":[{"expression":{"id":110540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":110536,"name":"implementationName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110488,"src":"3318:18:234","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string storage ref)"}},"id":110538,"indexExpression":{"id":110537,"name":"_address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110529,"src":"3337:8:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3318:28:234","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":110539,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110531,"src":"3349:5:234","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"3318:36:234","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":110541,"nodeType":"ExpressionStatement","src":"3318:36:234"}]},"documentation":{"id":110527,"nodeType":"StructuredDocumentation","src":"2922:292:234","text":"@notice Sets the implementation name for a given address. Only required for\n ResolvedDelegateProxy type proxies that have an implementation name.\n @param _address Address of the ResolvedDelegateProxy.\n @param _name Name of the implementation for the proxy."},"functionSelector":"860f7cda","implemented":true,"kind":"function","modifiers":[{"id":110534,"kind":"modifierInvocation","modifierName":{"id":110533,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":49354,"src":"3298:9:234"},"nodeType":"ModifierInvocation","src":"3298:9:234"}],"name":"setImplementationName","nameLocation":"3228:21:234","parameters":{"id":110532,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110529,"mutability":"mutable","name":"_address","nameLocation":"3258:8:234","nodeType":"VariableDeclaration","scope":110543,"src":"3250:16:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110528,"name":"address","nodeType":"ElementaryTypeName","src":"3250:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":110531,"mutability":"mutable","name":"_name","nameLocation":"3282:5:234","nodeType":"VariableDeclaration","scope":110543,"src":"3268:19:234","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":110530,"name":"string","nodeType":"ElementaryTypeName","src":"3268:6:234","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3249:39:234"},"returnParameters":{"id":110535,"nodeType":"ParameterList","parameters":[],"src":"3308:0:234"},"scope":110909,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":110557,"nodeType":"FunctionDefinition","src":"3571:113:234","nodes":[],"body":{"id":110556,"nodeType":"Block","src":"3642:42:234","nodes":[],"statements":[{"expression":{"id":110554,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":110552,"name":"addressManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110492,"src":"3652:14:234","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":110553,"name":"_address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110547,"src":"3669:8:234","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"}},"src":"3652:25:234","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"}},"id":110555,"nodeType":"ExpressionStatement","src":"3652:25:234"}]},"documentation":{"id":110544,"nodeType":"StructuredDocumentation","src":"3367:199:234","text":"@notice Set the address of the AddressManager. This is required to manage legacy\n ResolvedDelegateProxy type proxy contracts.\n @param _address Address of the AddressManager."},"functionSelector":"0652b57a","implemented":true,"kind":"function","modifiers":[{"id":110550,"kind":"modifierInvocation","modifierName":{"id":110549,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":49354,"src":"3632:9:234"},"nodeType":"ModifierInvocation","src":"3632:9:234"}],"name":"setAddressManager","nameLocation":"3580:17:234","parameters":{"id":110548,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110547,"mutability":"mutable","name":"_address","nameLocation":"3613:8:234","nodeType":"VariableDeclaration","scope":110557,"src":"3598:23:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"},"typeName":{"id":110546,"nodeType":"UserDefinedTypeName","pathNode":{"id":110545,"name":"AddressManager","nodeType":"IdentifierPath","referencedDeclaration":102008,"src":"3598:14:234"},"referencedDeclaration":102008,"src":"3598:14:234","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"}},"visibility":"internal"}],"src":"3597:25:234"},"returnParameters":{"id":110551,"nodeType":"ParameterList","parameters":[],"src":"3642:0:234"},"scope":110909,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":110575,"nodeType":"FunctionDefinition","src":"4126:137:234","nodes":[],"body":{"id":110574,"nodeType":"Block","src":"4204:59:234","nodes":[],"statements":[{"expression":{"arguments":[{"id":110570,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110560,"src":"4240:5:234","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":110571,"name":"_address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110562,"src":"4247:8:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":110567,"name":"addressManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110492,"src":"4214:14:234","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"}},"id":110569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"setAddress","nodeType":"MemberAccess","referencedDeclaration":101976,"src":"4214:25:234","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) external"}},"id":110572,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4214:42:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110573,"nodeType":"ExpressionStatement","src":"4214:42:234"}]},"documentation":{"id":110558,"nodeType":"StructuredDocumentation","src":"3690:431:234","text":"@custom:legacy\n @notice Set an address in the address manager. Since only the owner of the AddressManager\n can directly modify addresses and the ProxyAdmin will own the AddressManager, this\n gives the owner of the ProxyAdmin the ability to modify addresses directly.\n @param _name Name to set within the AddressManager.\n @param _address Address to attach to the given name."},"functionSelector":"9b2ea4bd","implemented":true,"kind":"function","modifiers":[{"id":110565,"kind":"modifierInvocation","modifierName":{"id":110564,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":49354,"src":"4194:9:234"},"nodeType":"ModifierInvocation","src":"4194:9:234"}],"name":"setAddress","nameLocation":"4135:10:234","parameters":{"id":110563,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110560,"mutability":"mutable","name":"_name","nameLocation":"4160:5:234","nodeType":"VariableDeclaration","scope":110575,"src":"4146:19:234","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":110559,"name":"string","nodeType":"ElementaryTypeName","src":"4146:6:234","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":110562,"mutability":"mutable","name":"_address","nameLocation":"4175:8:234","nodeType":"VariableDeclaration","scope":110575,"src":"4167:16:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110561,"name":"address","nodeType":"ElementaryTypeName","src":"4167:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4145:39:234"},"returnParameters":{"id":110566,"nodeType":"ParameterList","parameters":[],"src":"4204:0:234"},"scope":110909,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":110588,"nodeType":"FunctionDefinition","src":"4430:97:234","nodes":[],"body":{"id":110587,"nodeType":"Block","src":"4488:39:234","nodes":[],"statements":[{"expression":{"id":110585,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":110583,"name":"upgrading","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110495,"src":"4498:9:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":110584,"name":"_upgrading","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110578,"src":"4510:10:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4498:22:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":110586,"nodeType":"ExpressionStatement","src":"4498:22:234"}]},"documentation":{"id":110576,"nodeType":"StructuredDocumentation","src":"4269:156:234","text":"@custom:legacy\n @notice Set the upgrading status for the Chugsplash proxy type.\n @param _upgrading Whether or not the system is upgrading."},"functionSelector":"07c8f7b0","implemented":true,"kind":"function","modifiers":[{"id":110581,"kind":"modifierInvocation","modifierName":{"id":110580,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":49354,"src":"4478:9:234"},"nodeType":"ModifierInvocation","src":"4478:9:234"}],"name":"setUpgrading","nameLocation":"4439:12:234","parameters":{"id":110579,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110578,"mutability":"mutable","name":"_upgrading","nameLocation":"4457:10:234","nodeType":"VariableDeclaration","scope":110588,"src":"4452:15:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":110577,"name":"bool","nodeType":"ElementaryTypeName","src":"4452:4:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4451:17:234"},"returnParameters":{"id":110582,"nodeType":"ParameterList","parameters":[],"src":"4488:0:234"},"scope":110909,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":110597,"nodeType":"FunctionDefinition","src":"4941:85:234","nodes":[],"body":{"id":110596,"nodeType":"Block","src":"4993:33:234","nodes":[],"statements":[{"expression":{"id":110594,"name":"upgrading","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110495,"src":"5010:9:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":110593,"id":110595,"nodeType":"Return","src":"5003:16:234"}]},"documentation":{"id":110589,"nodeType":"StructuredDocumentation","src":"4533:403:234","text":"@custom:legacy\n @notice Legacy function used to tell ChugSplashProxy contracts if an upgrade is happening.\n @return Whether or not there is an upgrade going on. May not actually tell you whether an\n upgrade is going on, since we don't currently plan to use this variable for anything\n other than a legacy indicator to fix a UX bug in the ChugSplash proxy."},"functionSelector":"b7947262","implemented":true,"kind":"function","modifiers":[],"name":"isUpgrading","nameLocation":"4950:11:234","parameters":{"id":110590,"nodeType":"ParameterList","parameters":[],"src":"4961:2:234"},"returnParameters":{"id":110593,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110592,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":110597,"src":"4987:4:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":110591,"name":"bool","nodeType":"ElementaryTypeName","src":"4987:4:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4986:6:234"},"scope":110909,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":110655,"nodeType":"FunctionDefinition","src":"5236:569:234","nodes":[],"body":{"id":110654,"nodeType":"Block","src":"5316:489:234","nodes":[],"statements":[{"assignments":[110607],"declarations":[{"constant":false,"id":110607,"mutability":"mutable","name":"ptype","nameLocation":"5336:5:234","nodeType":"VariableDeclaration","scope":110654,"src":"5326:15:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"typeName":{"id":110606,"nodeType":"UserDefinedTypeName","pathNode":{"id":110605,"name":"ProxyType","nodeType":"IdentifierPath","referencedDeclaration":110477,"src":"5326:9:234"},"referencedDeclaration":110477,"src":"5326:9:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"visibility":"internal"}],"id":110611,"initialValue":{"baseExpression":{"id":110608,"name":"proxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110483,"src":"5344:9:234","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_ProxyType_$110477_$","typeString":"mapping(address => enum ProxyAdmin.ProxyType)"}},"id":110610,"indexExpression":{"id":110609,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110600,"src":"5354:6:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5344:17:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"VariableDeclarationStatement","src":"5326:35:234"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110615,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110612,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110607,"src":"5375:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110613,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"5384:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110614,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"ERC1967","nodeType":"MemberAccess","referencedDeclaration":110474,"src":"5384:17:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"5375:26:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110626,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110623,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110607,"src":"5489:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110624,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"5498:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110625,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"CHUGSPLASH","nodeType":"MemberAccess","referencedDeclaration":110475,"src":"5498:20:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"5489:29:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110637,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110634,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110607,"src":"5614:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110635,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"5623:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110636,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"RESOLVED","nodeType":"MemberAccess","referencedDeclaration":110476,"src":"5623:18:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"5614:27:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":110650,"nodeType":"Block","src":"5734:65:234","statements":[{"expression":{"arguments":[{"hexValue":"50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065","id":110647,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5755:32:234","typeDescriptions":{"typeIdentifier":"t_stringliteral_0d595a635c8f2d148646b25cd19d12c4c97462aeb17388cbeb2bf405cffe65f2","typeString":"literal_string \"ProxyAdmin: unknown proxy type\""},"value":"ProxyAdmin: unknown proxy type"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_0d595a635c8f2d148646b25cd19d12c4c97462aeb17388cbeb2bf405cffe65f2","typeString":"literal_string \"ProxyAdmin: unknown proxy type\""}],"id":110646,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"5748:6:234","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":110648,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5748:40:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110649,"nodeType":"ExpressionStatement","src":"5748:40:234"}]},"id":110651,"nodeType":"IfStatement","src":"5610:189:234","trueBody":{"id":110645,"nodeType":"Block","src":"5643:85:234","statements":[{"expression":{"arguments":[{"baseExpression":{"id":110640,"name":"implementationName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110488,"src":"5690:18:234","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string storage ref)"}},"id":110642,"indexExpression":{"id":110641,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110600,"src":"5709:6:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5690:26:234","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}],"expression":{"id":110638,"name":"addressManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110492,"src":"5664:14:234","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"}},"id":110639,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getAddress","nodeType":"MemberAccess","referencedDeclaration":101991,"src":"5664:25:234","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$_t_address_$","typeString":"function (string memory) view external returns (address)"}},"id":110643,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5664:53:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":110604,"id":110644,"nodeType":"Return","src":"5657:60:234"}]}},"id":110652,"nodeType":"IfStatement","src":"5485:314:234","trueBody":{"id":110633,"nodeType":"Block","src":"5520:84:234","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":110628,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110600,"src":"5566:6:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":110627,"name":"IStaticL1ChugSplashProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110470,"src":"5541:24:234","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IStaticL1ChugSplashProxy_$110470_$","typeString":"type(contract IStaticL1ChugSplashProxy)"}},"id":110629,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5541:32:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IStaticL1ChugSplashProxy_$110470","typeString":"contract IStaticL1ChugSplashProxy"}},"id":110630,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getImplementation","nodeType":"MemberAccess","referencedDeclaration":110464,"src":"5541:50:234","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":110631,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5541:52:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":110604,"id":110632,"nodeType":"Return","src":"5534:59:234"}]}},"id":110653,"nodeType":"IfStatement","src":"5371:428:234","trueBody":{"id":110622,"nodeType":"Block","src":"5403:76:234","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":110617,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110600,"src":"5444:6:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":110616,"name":"IStaticERC1967Proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110458,"src":"5424:19:234","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IStaticERC1967Proxy_$110458_$","typeString":"type(contract IStaticERC1967Proxy)"}},"id":110618,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5424:27:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IStaticERC1967Proxy_$110458","typeString":"contract IStaticERC1967Proxy"}},"id":110619,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"implementation","nodeType":"MemberAccess","referencedDeclaration":110452,"src":"5424:42:234","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":110620,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5424:44:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":110604,"id":110621,"nodeType":"Return","src":"5417:51:234"}]}}]},"documentation":{"id":110598,"nodeType":"StructuredDocumentation","src":"5032:199:234","text":"@notice Returns the implementation of the given proxy address.\n @param _proxy Address of the proxy to get the implementation of.\n @return Address of the implementation of the proxy."},"functionSelector":"204e1c7a","implemented":true,"kind":"function","modifiers":[],"name":"getProxyImplementation","nameLocation":"5245:22:234","parameters":{"id":110601,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110600,"mutability":"mutable","name":"_proxy","nameLocation":"5276:6:234","nodeType":"VariableDeclaration","scope":110655,"src":"5268:14:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110599,"name":"address","nodeType":"ElementaryTypeName","src":"5268:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5267:16:234"},"returnParameters":{"id":110604,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110603,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":110655,"src":"5307:7:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110602,"name":"address","nodeType":"ElementaryTypeName","src":"5307:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5306:9:234"},"scope":110909,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":110710,"nodeType":"FunctionDefinition","src":"5988:519:234","nodes":[],"body":{"id":110709,"nodeType":"Block","src":"6067:440:234","nodes":[],"statements":[{"assignments":[110665],"declarations":[{"constant":false,"id":110665,"mutability":"mutable","name":"ptype","nameLocation":"6087:5:234","nodeType":"VariableDeclaration","scope":110709,"src":"6077:15:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"typeName":{"id":110664,"nodeType":"UserDefinedTypeName","pathNode":{"id":110663,"name":"ProxyType","nodeType":"IdentifierPath","referencedDeclaration":110477,"src":"6077:9:234"},"referencedDeclaration":110477,"src":"6077:9:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"visibility":"internal"}],"id":110669,"initialValue":{"baseExpression":{"id":110666,"name":"proxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110483,"src":"6095:9:234","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_ProxyType_$110477_$","typeString":"mapping(address => enum ProxyAdmin.ProxyType)"}},"id":110668,"indexExpression":{"id":110667,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110658,"src":"6105:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6095:17:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"VariableDeclarationStatement","src":"6077:35:234"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110673,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110670,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110665,"src":"6126:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110671,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"6135:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110672,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"ERC1967","nodeType":"MemberAccess","referencedDeclaration":110474,"src":"6135:17:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"6126:26:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110681,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110665,"src":"6231:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110682,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"6240:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110683,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"CHUGSPLASH","nodeType":"MemberAccess","referencedDeclaration":110475,"src":"6240:20:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"6231:29:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110695,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110692,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110665,"src":"6347:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110693,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"6356:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110694,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"RESOLVED","nodeType":"MemberAccess","referencedDeclaration":110476,"src":"6356:18:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"6347:27:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":110705,"nodeType":"Block","src":"6436:65:234","statements":[{"expression":{"arguments":[{"hexValue":"50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065","id":110702,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6457:32:234","typeDescriptions":{"typeIdentifier":"t_stringliteral_0d595a635c8f2d148646b25cd19d12c4c97462aeb17388cbeb2bf405cffe65f2","typeString":"literal_string \"ProxyAdmin: unknown proxy type\""},"value":"ProxyAdmin: unknown proxy type"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_0d595a635c8f2d148646b25cd19d12c4c97462aeb17388cbeb2bf405cffe65f2","typeString":"literal_string \"ProxyAdmin: unknown proxy type\""}],"id":110701,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"6450:6:234","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":110703,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6450:40:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110704,"nodeType":"ExpressionStatement","src":"6450:40:234"}]},"id":110706,"nodeType":"IfStatement","src":"6343:158:234","trueBody":{"id":110700,"nodeType":"Block","src":"6376:54:234","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":110696,"name":"addressManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110492,"src":"6397:14:234","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"}},"id":110697,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"owner","nodeType":"MemberAccess","referencedDeclaration":49363,"src":"6397:20:234","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":110698,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6397:22:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":110662,"id":110699,"nodeType":"Return","src":"6390:29:234"}]}},"id":110707,"nodeType":"IfStatement","src":"6227:274:234","trueBody":{"id":110691,"nodeType":"Block","src":"6262:75:234","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":110686,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110658,"src":"6308:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":110685,"name":"IStaticL1ChugSplashProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110470,"src":"6283:24:234","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IStaticL1ChugSplashProxy_$110470_$","typeString":"type(contract IStaticL1ChugSplashProxy)"}},"id":110687,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6283:32:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IStaticL1ChugSplashProxy_$110470","typeString":"contract IStaticL1ChugSplashProxy"}},"id":110688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getOwner","nodeType":"MemberAccess","referencedDeclaration":110469,"src":"6283:41:234","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":110689,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6283:43:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":110662,"id":110690,"nodeType":"Return","src":"6276:50:234"}]}},"id":110708,"nodeType":"IfStatement","src":"6122:379:234","trueBody":{"id":110680,"nodeType":"Block","src":"6154:67:234","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":110675,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110658,"src":"6195:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":110674,"name":"IStaticERC1967Proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110458,"src":"6175:19:234","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IStaticERC1967Proxy_$110458_$","typeString":"type(contract IStaticERC1967Proxy)"}},"id":110676,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6175:27:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IStaticERC1967Proxy_$110458","typeString":"contract IStaticERC1967Proxy"}},"id":110677,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"admin","nodeType":"MemberAccess","referencedDeclaration":110457,"src":"6175:33:234","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":110678,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6175:35:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":110662,"id":110679,"nodeType":"Return","src":"6168:42:234"}]}}]},"documentation":{"id":110656,"nodeType":"StructuredDocumentation","src":"5811:172:234","text":"@notice Returns the admin of the given proxy address.\n @param _proxy Address of the proxy to get the admin of.\n @return Address of the admin of the proxy."},"functionSelector":"f3b7dead","implemented":true,"kind":"function","modifiers":[],"name":"getProxyAdmin","nameLocation":"5997:13:234","parameters":{"id":110659,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110658,"mutability":"mutable","name":"_proxy","nameLocation":"6027:6:234","nodeType":"VariableDeclaration","scope":110710,"src":"6011:22:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":110657,"name":"address","nodeType":"ElementaryTypeName","src":"6011:15:234","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"6010:24:234"},"returnParameters":{"id":110662,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110661,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":110710,"src":"6058:7:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110660,"name":"address","nodeType":"ElementaryTypeName","src":"6058:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"6057:9:234"},"scope":110909,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":110771,"nodeType":"FunctionDefinition","src":"6689:531:234","nodes":[],"body":{"id":110770,"nodeType":"Block","src":"6777:443:234","nodes":[],"statements":[{"assignments":[110722],"declarations":[{"constant":false,"id":110722,"mutability":"mutable","name":"ptype","nameLocation":"6797:5:234","nodeType":"VariableDeclaration","scope":110770,"src":"6787:15:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"typeName":{"id":110721,"nodeType":"UserDefinedTypeName","pathNode":{"id":110720,"name":"ProxyType","nodeType":"IdentifierPath","referencedDeclaration":110477,"src":"6787:9:234"},"referencedDeclaration":110477,"src":"6787:9:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"visibility":"internal"}],"id":110726,"initialValue":{"baseExpression":{"id":110723,"name":"proxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110483,"src":"6805:9:234","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_ProxyType_$110477_$","typeString":"mapping(address => enum ProxyAdmin.ProxyType)"}},"id":110725,"indexExpression":{"id":110724,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110713,"src":"6815:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6805:17:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"VariableDeclarationStatement","src":"6787:35:234"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110730,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110727,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110722,"src":"6836:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110728,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"6845:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110729,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"ERC1967","nodeType":"MemberAccess","referencedDeclaration":110474,"src":"6845:17:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"6836:26:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110742,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110739,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110722,"src":"6935:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110740,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"6944:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110741,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"CHUGSPLASH","nodeType":"MemberAccess","referencedDeclaration":110475,"src":"6944:20:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"6935:29:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110754,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110751,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110722,"src":"7046:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110752,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"7055:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110753,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"RESOLVED","nodeType":"MemberAccess","referencedDeclaration":110476,"src":"7055:18:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"7046:27:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":110766,"nodeType":"Block","src":"7149:65:234","statements":[{"expression":{"arguments":[{"hexValue":"50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065","id":110763,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7170:32:234","typeDescriptions":{"typeIdentifier":"t_stringliteral_0d595a635c8f2d148646b25cd19d12c4c97462aeb17388cbeb2bf405cffe65f2","typeString":"literal_string \"ProxyAdmin: unknown proxy type\""},"value":"ProxyAdmin: unknown proxy type"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_0d595a635c8f2d148646b25cd19d12c4c97462aeb17388cbeb2bf405cffe65f2","typeString":"literal_string \"ProxyAdmin: unknown proxy type\""}],"id":110762,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"7163:6:234","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":110764,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7163:40:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110765,"nodeType":"ExpressionStatement","src":"7163:40:234"}]},"id":110767,"nodeType":"IfStatement","src":"7042:172:234","trueBody":{"id":110761,"nodeType":"Block","src":"7075:68:234","statements":[{"expression":{"arguments":[{"id":110758,"name":"_newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110715,"src":"7122:9:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":110755,"name":"addressManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110492,"src":"7089:14:234","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"}},"id":110757,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"transferOwnership","nodeType":"MemberAccess","referencedDeclaration":49414,"src":"7089:32:234","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":110759,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7089:43:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110760,"nodeType":"ExpressionStatement","src":"7089:43:234"}]}},"id":110768,"nodeType":"IfStatement","src":"6931:283:234","trueBody":{"id":110750,"nodeType":"Block","src":"6966:70:234","statements":[{"expression":{"arguments":[{"id":110747,"name":"_newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110715,"src":"7015:9:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[{"id":110744,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110713,"src":"6998:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":110743,"name":"L1ChugSplashProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":102516,"src":"6980:17:234","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1ChugSplashProxy_$102516_$","typeString":"type(contract L1ChugSplashProxy)"}},"id":110745,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6980:25:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1ChugSplashProxy_$102516","typeString":"contract L1ChugSplashProxy"}},"id":110746,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"setOwner","nodeType":"MemberAccess","referencedDeclaration":102391,"src":"6980:34:234","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":110748,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6980:45:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110749,"nodeType":"ExpressionStatement","src":"6980:45:234"}]}},"id":110769,"nodeType":"IfStatement","src":"6832:382:234","trueBody":{"id":110738,"nodeType":"Block","src":"6864:61:234","statements":[{"expression":{"arguments":[{"id":110735,"name":"_newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110715,"src":"6904:9:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[{"id":110732,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110713,"src":"6884:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":110731,"name":"Proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110434,"src":"6878:5:234","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Proxy_$110434_$","typeString":"type(contract Proxy)"}},"id":110733,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6878:13:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_Proxy_$110434","typeString":"contract Proxy"}},"id":110734,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"changeAdmin","nodeType":"MemberAccess","referencedDeclaration":110312,"src":"6878:25:234","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":110736,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6878:36:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110737,"nodeType":"ExpressionStatement","src":"6878:36:234"}]}}]},"documentation":{"id":110711,"nodeType":"StructuredDocumentation","src":"6513:171:234","text":"@notice Updates the admin of the given proxy address.\n @param _proxy Address of the proxy to update.\n @param _newAdmin Address of the new proxy admin."},"functionSelector":"7eff275e","implemented":true,"kind":"function","modifiers":[{"id":110718,"kind":"modifierInvocation","modifierName":{"id":110717,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":49354,"src":"6767:9:234"},"nodeType":"ModifierInvocation","src":"6767:9:234"}],"name":"changeProxyAdmin","nameLocation":"6698:16:234","parameters":{"id":110716,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110713,"mutability":"mutable","name":"_proxy","nameLocation":"6731:6:234","nodeType":"VariableDeclaration","scope":110771,"src":"6715:22:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":110712,"name":"address","nodeType":"ElementaryTypeName","src":"6715:15:234","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":110715,"mutability":"mutable","name":"_newAdmin","nameLocation":"6747:9:234","nodeType":"VariableDeclaration","scope":110771,"src":"6739:17:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110714,"name":"address","nodeType":"ElementaryTypeName","src":"6739:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"6714:43:234"},"returnParameters":{"id":110719,"nodeType":"ParameterList","parameters":[],"src":"6777:0:234"},"scope":110909,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":110850,"nodeType":"FunctionDefinition","src":"7423:816:234","nodes":[],"body":{"id":110849,"nodeType":"Block","src":"7506:733:234","nodes":[],"statements":[{"assignments":[110783],"declarations":[{"constant":false,"id":110783,"mutability":"mutable","name":"ptype","nameLocation":"7526:5:234","nodeType":"VariableDeclaration","scope":110849,"src":"7516:15:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"typeName":{"id":110782,"nodeType":"UserDefinedTypeName","pathNode":{"id":110781,"name":"ProxyType","nodeType":"IdentifierPath","referencedDeclaration":110477,"src":"7516:9:234"},"referencedDeclaration":110477,"src":"7516:9:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"visibility":"internal"}],"id":110787,"initialValue":{"baseExpression":{"id":110784,"name":"proxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110483,"src":"7534:9:234","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_ProxyType_$110477_$","typeString":"mapping(address => enum ProxyAdmin.ProxyType)"}},"id":110786,"indexExpression":{"id":110785,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110774,"src":"7544:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7534:17:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"VariableDeclarationStatement","src":"7516:35:234"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110791,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110788,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110783,"src":"7565:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110789,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"7574:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110790,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"ERC1967","nodeType":"MemberAccess","referencedDeclaration":110474,"src":"7574:17:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"7565:26:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110803,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110800,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110783,"src":"7668:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110801,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"7677:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110802,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"CHUGSPLASH","nodeType":"MemberAccess","referencedDeclaration":110475,"src":"7677:20:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"7668:29:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110826,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110823,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110783,"src":"7884:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110824,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"7893:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110825,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"RESOLVED","nodeType":"MemberAccess","referencedDeclaration":110476,"src":"7893:18:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"7884:27:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":110845,"nodeType":"Block","src":"8053:180:234","statements":[{"expression":{"arguments":[{"hexValue":"66616c7365","id":110842,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"8216:5:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":110841,"name":"assert","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-3,"src":"8209:6:234","typeDescriptions":{"typeIdentifier":"t_function_assert_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":110843,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8209:13:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110844,"nodeType":"ExpressionStatement","src":"8209:13:234"}]},"id":110846,"nodeType":"IfStatement","src":"7880:353:234","trueBody":{"id":110840,"nodeType":"Block","src":"7913:134:234","statements":[{"assignments":[110828],"declarations":[{"constant":false,"id":110828,"mutability":"mutable","name":"name","nameLocation":"7941:4:234","nodeType":"VariableDeclaration","scope":110840,"src":"7927:18:234","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":110827,"name":"string","nodeType":"ElementaryTypeName","src":"7927:6:234","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":110832,"initialValue":{"baseExpression":{"id":110829,"name":"implementationName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110488,"src":"7948:18:234","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string storage ref)"}},"id":110831,"indexExpression":{"id":110830,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110774,"src":"7967:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7948:26:234","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"VariableDeclarationStatement","src":"7927:47:234"},{"expression":{"arguments":[{"id":110836,"name":"name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110828,"src":"8014:4:234","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":110837,"name":"_implementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110776,"src":"8020:15:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":110833,"name":"addressManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110492,"src":"7988:14:234","typeDescriptions":{"typeIdentifier":"t_contract$_AddressManager_$102008","typeString":"contract AddressManager"}},"id":110835,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"setAddress","nodeType":"MemberAccess","referencedDeclaration":101976,"src":"7988:25:234","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) external"}},"id":110838,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7988:48:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110839,"nodeType":"ExpressionStatement","src":"7988:48:234"}]}},"id":110847,"nodeType":"IfStatement","src":"7664:569:234","trueBody":{"id":110822,"nodeType":"Block","src":"7699:175:234","statements":[{"expression":{"arguments":[{"expression":{"id":110808,"name":"Constants","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103096,"src":"7767:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Constants_$103096_$","typeString":"type(library Constants)"}},"id":110809,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"PROXY_IMPLEMENTATION_ADDRESS","nodeType":"MemberAccess","referencedDeclaration":103062,"src":"7767:38:234","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"arguments":[{"arguments":[{"id":110816,"name":"_implementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110776,"src":"7831:15:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":110815,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7823:7:234","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":110814,"name":"uint160","nodeType":"ElementaryTypeName","src":"7823:7:234","typeDescriptions":{}}},"id":110817,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7823:24:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":110813,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7815:7:234","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":110812,"name":"uint256","nodeType":"ElementaryTypeName","src":"7815:7:234","typeDescriptions":{}}},"id":110818,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7815:33:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":110811,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7807:7:234","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":110810,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7807:7:234","typeDescriptions":{}}},"id":110819,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7807:42:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"arguments":[{"id":110805,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110774,"src":"7731:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":110804,"name":"L1ChugSplashProxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":102516,"src":"7713:17:234","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_L1ChugSplashProxy_$102516_$","typeString":"type(contract L1ChugSplashProxy)"}},"id":110806,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7713:25:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_L1ChugSplashProxy_$102516","typeString":"contract L1ChugSplashProxy"}},"id":110807,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"setStorage","nodeType":"MemberAccess","referencedDeclaration":102378,"src":"7713:36:234","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes32_$_t_bytes32_$returns$__$","typeString":"function (bytes32,bytes32) external"}},"id":110820,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7713:150:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110821,"nodeType":"ExpressionStatement","src":"7713:150:234"}]}},"id":110848,"nodeType":"IfStatement","src":"7561:672:234","trueBody":{"id":110799,"nodeType":"Block","src":"7593:65:234","statements":[{"expression":{"arguments":[{"id":110796,"name":"_implementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110776,"src":"7631:15:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[{"id":110793,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110774,"src":"7613:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":110792,"name":"Proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110434,"src":"7607:5:234","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Proxy_$110434_$","typeString":"type(contract Proxy)"}},"id":110794,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7607:13:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_Proxy_$110434","typeString":"contract Proxy"}},"id":110795,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"upgradeTo","nodeType":"MemberAccess","referencedDeclaration":110266,"src":"7607:23:234","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":110797,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7607:40:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110798,"nodeType":"ExpressionStatement","src":"7607:40:234"}]}}]},"documentation":{"id":110772,"nodeType":"StructuredDocumentation","src":"7226:192:234","text":"@notice Changes a proxy's implementation contract.\n @param _proxy Address of the proxy to upgrade.\n @param _implementation Address of the new implementation address."},"functionSelector":"99a88ec4","implemented":true,"kind":"function","modifiers":[{"id":110779,"kind":"modifierInvocation","modifierName":{"id":110778,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":49354,"src":"7496:9:234"},"nodeType":"ModifierInvocation","src":"7496:9:234"}],"name":"upgrade","nameLocation":"7432:7:234","parameters":{"id":110777,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110774,"mutability":"mutable","name":"_proxy","nameLocation":"7456:6:234","nodeType":"VariableDeclaration","scope":110850,"src":"7440:22:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":110773,"name":"address","nodeType":"ElementaryTypeName","src":"7440:15:234","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":110776,"mutability":"mutable","name":"_implementation","nameLocation":"7472:15:234","nodeType":"VariableDeclaration","scope":110850,"src":"7464:23:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110775,"name":"address","nodeType":"ElementaryTypeName","src":"7464:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"7439:49:234"},"returnParameters":{"id":110780,"nodeType":"ParameterList","parameters":[],"src":"7506:0:234"},"scope":110909,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":110908,"nodeType":"FunctionDefinition","src":"8644:631:234","nodes":[],"body":{"id":110907,"nodeType":"Block","src":"8822:453:234","nodes":[],"statements":[{"assignments":[110864],"declarations":[{"constant":false,"id":110864,"mutability":"mutable","name":"ptype","nameLocation":"8842:5:234","nodeType":"VariableDeclaration","scope":110907,"src":"8832:15:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"typeName":{"id":110863,"nodeType":"UserDefinedTypeName","pathNode":{"id":110862,"name":"ProxyType","nodeType":"IdentifierPath","referencedDeclaration":110477,"src":"8832:9:234"},"referencedDeclaration":110477,"src":"8832:9:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"visibility":"internal"}],"id":110868,"initialValue":{"baseExpression":{"id":110865,"name":"proxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110483,"src":"8850:9:234","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_ProxyType_$110477_$","typeString":"mapping(address => enum ProxyAdmin.ProxyType)"}},"id":110867,"indexExpression":{"id":110866,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110853,"src":"8860:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8850:17:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"VariableDeclarationStatement","src":"8832:35:234"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"},"id":110872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":110869,"name":"ptype","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110864,"src":"8881:5:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":110870,"name":"ProxyType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110477,"src":"8890:9:234","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_ProxyType_$110477_$","typeString":"type(enum ProxyAdmin.ProxyType)"}},"id":110871,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"ERC1967","nodeType":"MemberAccess","referencedDeclaration":110474,"src":"8890:17:234","typeDescriptions":{"typeIdentifier":"t_enum$_ProxyType_$110477","typeString":"enum ProxyAdmin.ProxyType"}},"src":"8881:26:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":110905,"nodeType":"Block","src":"9014:255:234","statements":[{"expression":{"arguments":[{"id":110886,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110853,"src":"9084:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"id":110887,"name":"_implementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110855,"src":"9092:15:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_address","typeString":"address"}],"id":110885,"name":"upgrade","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110850,"src":"9076:7:234","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_payable_$_t_address_$returns$__$","typeString":"function (address payable,address)"}},"id":110888,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9076:32:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110889,"nodeType":"ExpressionStatement","src":"9076:32:234"},{"assignments":[110891,null],"declarations":[{"constant":false,"id":110891,"mutability":"mutable","name":"success","nameLocation":"9128:7:234","nodeType":"VariableDeclaration","scope":110905,"src":"9123:12:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":110890,"name":"bool","nodeType":"ElementaryTypeName","src":"9123:4:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},null],"id":110899,"initialValue":{"arguments":[{"id":110897,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110857,"src":"9172:5:234","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":110892,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110853,"src":"9140:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":110893,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call","nodeType":"MemberAccess","src":"9140:11:234","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":110896,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":110894,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"9160:3:234","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":110895,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"9160:9:234","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"9140:31:234","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":110898,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9140:38:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"9122:56:234"},{"expression":{"arguments":[{"id":110901,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110891,"src":"9200:7:234","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722075706772616465206661696c6564","id":110902,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9209:48:234","typeDescriptions":{"typeIdentifier":"t_stringliteral_9dbbe4927f0b34687229d178ecf6fef1e21d5f949373ef3cb14376a90927e2f4","typeString":"literal_string \"ProxyAdmin: call to proxy after upgrade failed\""},"value":"ProxyAdmin: call to proxy after upgrade failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_9dbbe4927f0b34687229d178ecf6fef1e21d5f949373ef3cb14376a90927e2f4","typeString":"literal_string \"ProxyAdmin: call to proxy after upgrade failed\""}],"id":110900,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"9192:7:234","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":110903,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9192:66:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":110904,"nodeType":"ExpressionStatement","src":"9192:66:234"}]},"id":110906,"nodeType":"IfStatement","src":"8877:392:234","trueBody":{"id":110884,"nodeType":"Block","src":"8909:99:234","statements":[{"expression":{"arguments":[{"id":110880,"name":"_implementation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110855,"src":"8974:15:234","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":110881,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110857,"src":"8991:5:234","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"arguments":[{"id":110874,"name":"_proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110853,"src":"8929:6:234","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":110873,"name":"Proxy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110434,"src":"8923:5:234","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Proxy_$110434_$","typeString":"type(contract Proxy)"}},"id":110875,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8923:13:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_Proxy_$110434","typeString":"contract Proxy"}},"id":110876,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"upgradeToAndCall","nodeType":"MemberAccess","referencedDeclaration":110299,"src":"8923:30:234","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory) payable external returns (bytes memory)"}},"id":110879,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":110877,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"8962:3:234","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":110878,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","src":"8962:9:234","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"8923:50:234","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$value","typeString":"function (address,bytes memory) payable external returns (bytes memory)"}},"id":110882,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8923:74:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":110883,"nodeType":"ExpressionStatement","src":"8923:74:234"}]}}]},"documentation":{"id":110851,"nodeType":"StructuredDocumentation","src":"8245:394:234","text":"@notice Changes a proxy's implementation contract and delegatecalls the new implementation\n with some given data. Useful for atomic upgrade-and-initialize calls.\n @param _proxy Address of the proxy to upgrade.\n @param _implementation Address of the new implementation address.\n @param _data Data to trigger the new implementation with."},"functionSelector":"9623609d","implemented":true,"kind":"function","modifiers":[{"id":110860,"kind":"modifierInvocation","modifierName":{"id":110859,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":49354,"src":"8808:9:234"},"nodeType":"ModifierInvocation","src":"8808:9:234"}],"name":"upgradeAndCall","nameLocation":"8653:14:234","parameters":{"id":110858,"nodeType":"ParameterList","parameters":[{"constant":false,"id":110853,"mutability":"mutable","name":"_proxy","nameLocation":"8693:6:234","nodeType":"VariableDeclaration","scope":110908,"src":"8677:22:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":110852,"name":"address","nodeType":"ElementaryTypeName","src":"8677:15:234","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":110855,"mutability":"mutable","name":"_implementation","nameLocation":"8717:15:234","nodeType":"VariableDeclaration","scope":110908,"src":"8709:23:234","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":110854,"name":"address","nodeType":"ElementaryTypeName","src":"8709:7:234","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":110857,"mutability":"mutable","name":"_data","nameLocation":"8755:5:234","nodeType":"VariableDeclaration","scope":110908,"src":"8742:18:234","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":110856,"name":"bytes","nodeType":"ElementaryTypeName","src":"8742:5:234","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8667:99:234"},"returnParameters":{"id":110861,"nodeType":"ParameterList","parameters":[],"src":"8822:0:234"},"scope":110909,"stateMutability":"payable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[{"baseName":{"id":110472,"name":"Ownable","nodeType":"IdentifierPath","referencedDeclaration":49435,"src":"1264:7:234"},"id":110473,"nodeType":"InheritanceSpecifier","src":"1264:7:234"}],"canonicalName":"ProxyAdmin","contractDependencies":[],"contractKind":"contract","documentation":{"id":110471,"nodeType":"StructuredDocumentation","src":"928:313:234","text":"@title ProxyAdmin\n @notice This is an auxiliary contract meant to be assigned as the admin of an ERC1967 Proxy,\n based on the OpenZeppelin implementation. It has backwards compatibility logic to work\n with the various types of proxies that have been deployed by Optimism in the past."},"fullyImplemented":true,"linearizedBaseContracts":[110909,49435,53291],"name":"ProxyAdmin","nameLocation":"1250:10:234","scope":110910,"usedErrors":[]}],"license":"MIT"},"id":234} \ No newline at end of file diff --git a/packages/sdk/src/forge-artifacts/WETH9.json b/packages/sdk/src/forge-artifacts/WETH9.json new file mode 100644 index 000000000000..d89e081d4a7f --- /dev/null +++ b/packages/sdk/src/forge-artifacts/WETH9.json @@ -0,0 +1 @@ +{"abi":[{"type":"fallback","stateMutability":"payable"},{"type":"function","name":"allowance","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"guy","type":"address","internalType":"address"},{"name":"wad","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"deposit","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transfer","inputs":[{"name":"dst","type":"address","internalType":"address"},{"name":"wad","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferFrom","inputs":[{"name":"src","type":"address","internalType":"address"},{"name":"dst","type":"address","internalType":"address"},{"name":"wad","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"withdraw","inputs":[{"name":"wad","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"src","type":"address","indexed":true,"internalType":"address"},{"name":"guy","type":"address","indexed":true,"internalType":"address"},{"name":"wad","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"name":"dst","type":"address","indexed":true,"internalType":"address"},{"name":"wad","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"src","type":"address","indexed":true,"internalType":"address"},{"name":"dst","type":"address","indexed":true,"internalType":"address"},{"name":"wad","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Withdrawal","inputs":[{"name":"src","type":"address","indexed":true,"internalType":"address"},{"name":"wad","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false}],"bytecode":{"object":"0x60c0604052600d60808190526c2bb930b83832b21022ba3432b960991b60a090815261002e916000919061007a565b50604080518082019091526004808252630ae8aa8960e31b602090920191825261005a9160019161007a565b506002805460ff1916601217905534801561007457600080fd5b50610115565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100bb57805160ff19168380011785556100e8565b828001600101855582156100e8579182015b828111156100e85782518255916020019190600101906100cd565b506100f49291506100f8565b5090565b61011291905b808211156100f457600081556001016100fe565b90565b6107f9806101246000396000f3fe6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a72315820d9a21886186e04516cbdaa611a54950fabc4d47164691bf70de28f6c54060de964736f6c63430005110032","sourceMap":"739:40:0:-;718:1809;739:40;;718:1809;739:40;;;-1:-1:-1;;;739:40:0;;;;;;-1:-1:-1;;739:40:0;;:::i;:::-;-1:-1:-1;785:31:0;;;;;;;;;;;;;-1:-1:-1;;;785:31:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;822:27:0;;;-1:-1:-1;;822:27:0;847:2;822:27;;;718:1809;5:2:-1;;;;30:1;27;20:12;5:2;718:1809:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;718:1809:0;;;-1:-1:-1;718:1809:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a72315820d9a21886186e04516cbdaa611a54950fabc4d47164691bf70de28f6c54060de964736f6c63430005110032","sourceMap":"718:1809:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1289:9;:7;:9::i;:::-;718:1809;739:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;739:40:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;739:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1755:177;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1755:177:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1755:177:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1654:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1654:95:0;;;:::i;:::-;;;;;;;;;;;;;;;;2065:460;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2065:460:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2065:460:0;;;;;;;;;;;;;;;;;;:::i;1445:203::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1445:203:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1445:203:0;;:::i;822:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;822:27:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1108:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1108:65:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1108:65:0;;;;:::i;785:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;785:31:0;;;:::i;1938:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1938:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1938:121:0;;;;;;;;;:::i;1179:65::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1179:65:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1179:65:0;;;;;;;;;;;:::i;1310:130::-;1364:10;1354:21;;;;:9;:21;;;;;;;;;:34;;1379:9;1354:34;;;;;;1403:30;;;;;;;;;;;;;;;;;1310:130::o;739:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1755:177::-;1837:10;1811:4;1827:21;;;:9;:21;;;;;;;;;:26;;;;;;;;;;;:32;;;1874:30;;;;;;;1811:4;;1827:26;;1837:10;;1874:30;;;;;;;;-1:-1:-1;1921:4:0;1755:177;;;;:::o;1654:95::-;1721:21;1654:95;:::o;2065:460::-;2183:14;;;2155:4;2183:14;;;:9;:14;;;;;;:21;-1:-1:-1;2183:21:0;2175:30;;;;;;2220:17;;;2227:10;2220:17;;;;:59;;-1:-1:-1;2241:14:0;;;;;;;:9;:14;;;;;;;;2256:10;2241:26;;;;;;;;2276:2;2241:38;;2220:59;2216:179;;;2303:14;;;;;;;:9;:14;;;;;;;;2318:10;2303:26;;;;;;;;:33;-1:-1:-1;2303:33:0;2295:42;;;;;;2351:14;;;;;;;:9;:14;;;;;;;;2366:10;2351:26;;;;;;;:33;;;;;;;2216:179;2405:14;;;;;;;;:9;:14;;;;;;;;:21;;;;;;;2436:14;;;;;;;;;;:21;;;;;;2473:23;;;;;;;2436:14;;2473:23;;;;;;;;;;;-1:-1:-1;2514:4:0;2065:460;;;;;:::o;1445:203::-;1508:10;1498:21;;;;:9;:21;;;;;;:28;-1:-1:-1;1498:28:0;1490:37;;;;;;1547:10;1537:21;;;;:9;:21;;;;;;:28;;;;;;;1575:24;;;;;;1562:3;;1575:24;;1537:21;1575:24;1562:3;1547:10;1575:24;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;1614:27:0;;;;;;;;1625:10;;1614:27;;;;;;;;;;1445:203;:::o;822:27::-;;;;;;:::o;1108:65::-;;;;;;;;;;;;;:::o;785:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1938:121;1995:4;2018:34;2031:10;2043:3;2048;2018:12;:34::i;:::-;2011:41;1938:121;-1:-1:-1;;;1938:121:0:o;1179:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o","linkReferences":{}},"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","deposit()":"d0e30db0","name()":"06fdde03","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","withdraw(uint256)":"2e1a7d4d"},"rawMetadata":"{\"compiler\":{\"version\":\"0.5.17+commit.d19bba13\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"guy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"guy\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"src/vendor/WETH9.sol\":\"WETH9\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@lib-keccak/=lib/lib-keccak/contracts/lib/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":@solady-test/=lib/lib-keccak/lib/solady/test/\",\":@solady/=lib/solady/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"src/vendor/WETH9.sol\":{\"keccak256\":\"0x5cf72b1d2b0f0a758d5540c663352aa757c80a975c2e2d9b22cc6bc9f1ada1a1\",\"urls\":[\"bzz-raw://aba380794ab2878afe942d0c093cb41820afa854182668af91bffa3f26492244\",\"dweb:/ipfs/QmTW9EWupsNX3DgoJc13uu2V3P4UPRErvaVCPmLyCbDnM1\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.5.17+commit.d19bba13"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"src","type":"address","indexed":true},{"internalType":"address","name":"guy","type":"address","indexed":true},{"internalType":"uint256","name":"wad","type":"uint256","indexed":false}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"dst","type":"address","indexed":true},{"internalType":"uint256","name":"wad","type":"uint256","indexed":false}],"type":"event","name":"Deposit","anonymous":false},{"inputs":[{"internalType":"address","name":"src","type":"address","indexed":true},{"internalType":"address","name":"dst","type":"address","indexed":true},{"internalType":"uint256","name":"wad","type":"uint256","indexed":false}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"src","type":"address","indexed":true},{"internalType":"uint256","name":"wad","type":"uint256","indexed":false}],"type":"event","name":"Withdrawal","anonymous":false},{"inputs":[],"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"guy","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"payable","type":"function","name":"deposit"},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"withdraw"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"remappings":["@lib-keccak/=lib/lib-keccak/contracts/lib/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@rari-capital/solmate/=lib/solmate/","@solady-test/=lib/lib-keccak/lib/solady/test/","@solady/=lib/solady/src/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"compilationTarget":{"src/vendor/WETH9.sol":"WETH9"},"evmVersion":"istanbul","libraries":{}},"sources":{"src/vendor/WETH9.sol":{"keccak256":"0x5cf72b1d2b0f0a758d5540c663352aa757c80a975c2e2d9b22cc6bc9f1ada1a1","urls":["bzz-raw://aba380794ab2878afe942d0c093cb41820afa854182668af91bffa3f26492244","dweb:/ipfs/QmTW9EWupsNX3DgoJc13uu2V3P4UPRErvaVCPmLyCbDnM1"],"license":null}},"version":1},"storageLayout":{"storage":[{"astId":4,"contract":"src/vendor/WETH9.sol:WETH9","label":"name","offset":0,"slot":"0","type":"t_string_storage"},{"astId":7,"contract":"src/vendor/WETH9.sol:WETH9","label":"symbol","offset":0,"slot":"1","type":"t_string_storage"},{"astId":10,"contract":"src/vendor/WETH9.sol:WETH9","label":"decimals","offset":0,"slot":"2","type":"t_uint8"},{"astId":42,"contract":"src/vendor/WETH9.sol:WETH9","label":"balanceOf","offset":0,"slot":"3","type":"t_mapping(t_address,t_uint256)"},{"astId":48,"contract":"src/vendor/WETH9.sol:WETH9","label":"allowance","offset":0,"slot":"4","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(address => uint256))","numberOfBytes":"32","value":"t_mapping(t_address,t_uint256)"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}},"userdoc":{},"devdoc":{},"ast":{"absolutePath":"src/vendor/WETH9.sol","id":246,"exportedSymbols":{"WETH9":[245]},"nodeType":"SourceUnit","src":"686:36998:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"686:30:0","nodes":[],"literals":["solidity",">=","0.4",".22","<","0.6"]},{"id":245,"nodeType":"ContractDefinition","src":"718:1809:0","nodes":[{"id":4,"nodeType":"VariableDeclaration","src":"739:40:0","nodes":[],"constant":false,"name":"name","scope":245,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string"},"typeName":{"id":2,"name":"string","nodeType":"ElementaryTypeName","src":"739:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"argumentTypes":null,"hexValue":"57726170706564204574686572","id":3,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"764:15:0","subdenomination":null,"typeDescriptions":{"typeIdentifier":"t_stringliteral_00cd3d46df44f2cbb950cf84eb2e92aa2ddd23195b1a009173ea59a063357ed3","typeString":"literal_string \"Wrapped Ether\""},"value":"Wrapped Ether"},"visibility":"public"},{"id":7,"nodeType":"VariableDeclaration","src":"785:31:0","nodes":[],"constant":false,"name":"symbol","scope":245,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string"},"typeName":{"id":5,"name":"string","nodeType":"ElementaryTypeName","src":"785:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"value":{"argumentTypes":null,"hexValue":"57455448","id":6,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"810:6:0","subdenomination":null,"typeDescriptions":{"typeIdentifier":"t_stringliteral_0f8a193ff464434486c0daf7db2a895884365d2bc84ba47a68fcf89c1b14b5b8","typeString":"literal_string \"WETH\""},"value":"WETH"},"visibility":"public"},{"id":10,"nodeType":"VariableDeclaration","src":"822:27:0","nodes":[],"constant":false,"name":"decimals","scope":245,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":8,"name":"uint8","nodeType":"ElementaryTypeName","src":"822:5:0","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"value":{"argumentTypes":null,"hexValue":"3138","id":9,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"847:2:0","subdenomination":null,"typeDescriptions":{"typeIdentifier":"t_rational_18_by_1","typeString":"int_const 18"},"value":"18"},"visibility":"public"},{"id":18,"nodeType":"EventDefinition","src":"856:68:0","nodes":[],"anonymous":false,"documentation":null,"name":"Approval","parameters":{"id":17,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12,"indexed":true,"name":"src","nodeType":"VariableDeclaration","scope":18,"src":"872:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11,"name":"address","nodeType":"ElementaryTypeName","src":"872:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":null,"visibility":"internal"},{"constant":false,"id":14,"indexed":true,"name":"guy","nodeType":"VariableDeclaration","scope":18,"src":"893:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13,"name":"address","nodeType":"ElementaryTypeName","src":"893:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":null,"visibility":"internal"},{"constant":false,"id":16,"indexed":false,"name":"wad","nodeType":"VariableDeclaration","scope":18,"src":"914:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15,"name":"uint","nodeType":"ElementaryTypeName","src":"914:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":null,"visibility":"internal"}],"src":"871:52:0"}},{"id":26,"nodeType":"EventDefinition","src":"929:68:0","nodes":[],"anonymous":false,"documentation":null,"name":"Transfer","parameters":{"id":25,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20,"indexed":true,"name":"src","nodeType":"VariableDeclaration","scope":26,"src":"945:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19,"name":"address","nodeType":"ElementaryTypeName","src":"945:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":null,"visibility":"internal"},{"constant":false,"id":22,"indexed":true,"name":"dst","nodeType":"VariableDeclaration","scope":26,"src":"966:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21,"name":"address","nodeType":"ElementaryTypeName","src":"966:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":null,"visibility":"internal"},{"constant":false,"id":24,"indexed":false,"name":"wad","nodeType":"VariableDeclaration","scope":26,"src":"987:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23,"name":"uint","nodeType":"ElementaryTypeName","src":"987:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":null,"visibility":"internal"}],"src":"944:52:0"}},{"id":32,"nodeType":"EventDefinition","src":"1002:46:0","nodes":[],"anonymous":false,"documentation":null,"name":"Deposit","parameters":{"id":31,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28,"indexed":true,"name":"dst","nodeType":"VariableDeclaration","scope":32,"src":"1017:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27,"name":"address","nodeType":"ElementaryTypeName","src":"1017:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":null,"visibility":"internal"},{"constant":false,"id":30,"indexed":false,"name":"wad","nodeType":"VariableDeclaration","scope":32,"src":"1038:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29,"name":"uint","nodeType":"ElementaryTypeName","src":"1038:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":null,"visibility":"internal"}],"src":"1016:31:0"}},{"id":38,"nodeType":"EventDefinition","src":"1053:49:0","nodes":[],"anonymous":false,"documentation":null,"name":"Withdrawal","parameters":{"id":37,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34,"indexed":true,"name":"src","nodeType":"VariableDeclaration","scope":38,"src":"1071:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33,"name":"address","nodeType":"ElementaryTypeName","src":"1071:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":null,"visibility":"internal"},{"constant":false,"id":36,"indexed":false,"name":"wad","nodeType":"VariableDeclaration","scope":38,"src":"1092:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":35,"name":"uint","nodeType":"ElementaryTypeName","src":"1092:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":null,"visibility":"internal"}],"src":"1070:31:0"}},{"id":42,"nodeType":"VariableDeclaration","src":"1108:65:0","nodes":[],"constant":false,"name":"balanceOf","scope":245,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":41,"keyType":{"id":39,"name":"address","nodeType":"ElementaryTypeName","src":"1117:7:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1108:25:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":40,"name":"uint","nodeType":"ElementaryTypeName","src":"1128:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"value":null,"visibility":"public"},{"id":48,"nodeType":"VariableDeclaration","src":"1179:65:0","nodes":[],"constant":false,"name":"allowance","scope":245,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"typeName":{"id":47,"keyType":{"id":43,"name":"address","nodeType":"ElementaryTypeName","src":"1188:7:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1179:46:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"valueType":{"id":46,"keyType":{"id":44,"name":"address","nodeType":"ElementaryTypeName","src":"1208:7:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1199:25:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":45,"name":"uint","nodeType":"ElementaryTypeName","src":"1219:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"value":null,"visibility":"public"},{"id":55,"nodeType":"FunctionDefinition","src":"1251:54:0","nodes":[],"body":{"id":54,"nodeType":"Block","src":"1279:26:0","nodes":[],"statements":[{"expression":{"argumentTypes":null,"arguments":[],"expression":{"argumentTypes":[],"id":51,"name":"deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":74,"src":"1289:7:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":52,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1289:9:0","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":53,"nodeType":"ExpressionStatement","src":"1289:9:0"}]},"documentation":null,"implemented":true,"kind":"fallback","modifiers":[],"name":"","parameters":{"id":49,"nodeType":"ParameterList","parameters":[],"src":"1259:2:0"},"returnParameters":{"id":50,"nodeType":"ParameterList","parameters":[],"src":"1279:0:0"},"scope":245,"stateMutability":"payable","superFunction":null,"visibility":"external"},{"id":74,"nodeType":"FunctionDefinition","src":"1310:130:0","nodes":[],"body":{"id":73,"nodeType":"Block","src":"1344:96:0","nodes":[],"statements":[{"expression":{"argumentTypes":null,"id":64,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"id":58,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":42,"src":"1354:9:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":61,"indexExpression":{"argumentTypes":null,"expression":{"argumentTypes":null,"id":59,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"1364:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":60,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1364:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1354:21:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"argumentTypes":null,"expression":{"argumentTypes":null,"id":62,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"1379:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":63,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1379:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1354:34:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":65,"nodeType":"ExpressionStatement","src":"1354:34:0"},{"eventCall":{"argumentTypes":null,"arguments":[{"argumentTypes":null,"expression":{"argumentTypes":null,"id":67,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"1411:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":68,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1411:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"argumentTypes":null,"expression":{"argumentTypes":null,"id":69,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"1423:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":70,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"value","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1423:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":66,"name":"Deposit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32,"src":"1403:7:0","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":71,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1403:30:0","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":72,"nodeType":"EmitStatement","src":"1398:35:0"}]},"documentation":null,"implemented":true,"kind":"function","modifiers":[],"name":"deposit","parameters":{"id":56,"nodeType":"ParameterList","parameters":[],"src":"1326:2:0"},"returnParameters":{"id":57,"nodeType":"ParameterList","parameters":[],"src":"1344:0:0"},"scope":245,"stateMutability":"payable","superFunction":null,"visibility":"public"},{"id":110,"nodeType":"FunctionDefinition","src":"1445:203:0","nodes":[],"body":{"id":109,"nodeType":"Block","src":"1480:168:0","nodes":[],"statements":[{"expression":{"argumentTypes":null,"arguments":[{"argumentTypes":null,"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":85,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"id":80,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":42,"src":"1498:9:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":83,"indexExpression":{"argumentTypes":null,"expression":{"argumentTypes":null,"id":81,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"1508:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":82,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1508:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1498:21:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"argumentTypes":null,"id":84,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":76,"src":"1523:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1498:28:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":79,"name":"require","nodeType":"Identifier","overloadedDeclarations":[263,264],"referencedDeclaration":263,"src":"1490:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":86,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1490:37:0","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87,"nodeType":"ExpressionStatement","src":"1490:37:0"},{"expression":{"argumentTypes":null,"id":93,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"id":88,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":42,"src":"1537:9:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":91,"indexExpression":{"argumentTypes":null,"expression":{"argumentTypes":null,"id":89,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"1547:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":90,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1547:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1537:21:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"argumentTypes":null,"id":92,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":76,"src":"1562:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1537:28:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":94,"nodeType":"ExpressionStatement","src":"1537:28:0"},{"expression":{"argumentTypes":null,"arguments":[{"argumentTypes":null,"id":100,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":76,"src":"1595:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"argumentTypes":null,"expression":{"argumentTypes":null,"id":95,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"1575:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":98,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1575:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":99,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"transfer","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1575:19:0","typeDescriptions":{"typeIdentifier":"t_function_transfer_nonpayable$_t_uint256_$returns$__$","typeString":"function (uint256)"}},"id":101,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1575:24:0","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":102,"nodeType":"ExpressionStatement","src":"1575:24:0"},{"eventCall":{"argumentTypes":null,"arguments":[{"argumentTypes":null,"expression":{"argumentTypes":null,"id":104,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"1625:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":105,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1625:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"argumentTypes":null,"id":106,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":76,"src":"1637:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":103,"name":"Withdrawal","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38,"src":"1614:10:0","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":107,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1614:27:0","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":108,"nodeType":"EmitStatement","src":"1609:32:0"}]},"documentation":null,"implemented":true,"kind":"function","modifiers":[],"name":"withdraw","parameters":{"id":77,"nodeType":"ParameterList","parameters":[{"constant":false,"id":76,"name":"wad","nodeType":"VariableDeclaration","scope":110,"src":"1463:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":75,"name":"uint","nodeType":"ElementaryTypeName","src":"1463:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":null,"visibility":"internal"}],"src":"1462:10:0"},"returnParameters":{"id":78,"nodeType":"ParameterList","parameters":[],"src":"1480:0:0"},"scope":245,"stateMutability":"nonpayable","superFunction":null,"visibility":"public"},{"id":121,"nodeType":"FunctionDefinition","src":"1654:95:0","nodes":[],"body":{"id":120,"nodeType":"Block","src":"1704:45:0","nodes":[],"statements":[{"expression":{"argumentTypes":null,"expression":{"argumentTypes":null,"arguments":[{"argumentTypes":null,"id":116,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":274,"src":"1729:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_WETH9_$245","typeString":"contract WETH9"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_WETH9_$245","typeString":"contract WETH9"}],"id":115,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1721:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":"address"},"id":117,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1721:13:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":118,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"balance","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1721:21:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":114,"id":119,"nodeType":"Return","src":"1714:28:0"}]},"documentation":null,"implemented":true,"kind":"function","modifiers":[],"name":"totalSupply","parameters":{"id":111,"nodeType":"ParameterList","parameters":[],"src":"1674:2:0"},"returnParameters":{"id":114,"nodeType":"ParameterList","parameters":[{"constant":false,"id":113,"name":"","nodeType":"VariableDeclaration","scope":121,"src":"1698:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":112,"name":"uint","nodeType":"ElementaryTypeName","src":"1698:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":null,"visibility":"internal"}],"src":"1697:6:0"},"scope":245,"stateMutability":"view","superFunction":null,"visibility":"public"},{"id":149,"nodeType":"FunctionDefinition","src":"1755:177:0","nodes":[],"body":{"id":148,"nodeType":"Block","src":"1817:115:0","nodes":[],"statements":[{"expression":{"argumentTypes":null,"id":137,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"id":130,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":48,"src":"1827:9:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":134,"indexExpression":{"argumentTypes":null,"expression":{"argumentTypes":null,"id":131,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"1837:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":132,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1837:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1827:21:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":135,"indexExpression":{"argumentTypes":null,"id":133,"name":"guy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":123,"src":"1849:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1827:26:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"argumentTypes":null,"id":136,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":125,"src":"1856:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1827:32:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":138,"nodeType":"ExpressionStatement","src":"1827:32:0"},{"eventCall":{"argumentTypes":null,"arguments":[{"argumentTypes":null,"expression":{"argumentTypes":null,"id":140,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"1883:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":141,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"1883:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"argumentTypes":null,"id":142,"name":"guy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":123,"src":"1895:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"argumentTypes":null,"id":143,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":125,"src":"1900:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":139,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18,"src":"1874:8:0","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":144,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1874:30:0","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":145,"nodeType":"EmitStatement","src":"1869:35:0"},{"expression":{"argumentTypes":null,"hexValue":"74727565","id":146,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1921:4:0","subdenomination":null,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":129,"id":147,"nodeType":"Return","src":"1914:11:0"}]},"documentation":null,"implemented":true,"kind":"function","modifiers":[],"name":"approve","parameters":{"id":126,"nodeType":"ParameterList","parameters":[{"constant":false,"id":123,"name":"guy","nodeType":"VariableDeclaration","scope":149,"src":"1772:11:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":122,"name":"address","nodeType":"ElementaryTypeName","src":"1772:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":null,"visibility":"internal"},{"constant":false,"id":125,"name":"wad","nodeType":"VariableDeclaration","scope":149,"src":"1785:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":124,"name":"uint","nodeType":"ElementaryTypeName","src":"1785:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":null,"visibility":"internal"}],"src":"1771:23:0"},"returnParameters":{"id":129,"nodeType":"ParameterList","parameters":[{"constant":false,"id":128,"name":"","nodeType":"VariableDeclaration","scope":149,"src":"1811:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":127,"name":"bool","nodeType":"ElementaryTypeName","src":"1811:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"value":null,"visibility":"internal"}],"src":"1810:6:0"},"scope":245,"stateMutability":"nonpayable","superFunction":null,"visibility":"public"},{"id":166,"nodeType":"FunctionDefinition","src":"1938:121:0","nodes":[],"body":{"id":165,"nodeType":"Block","src":"2001:58:0","nodes":[],"statements":[{"expression":{"argumentTypes":null,"arguments":[{"argumentTypes":null,"expression":{"argumentTypes":null,"id":159,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"2031:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":160,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"2031:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},{"argumentTypes":null,"id":161,"name":"dst","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":151,"src":"2043:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"argumentTypes":null,"id":162,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":153,"src":"2048:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":158,"name":"transferFrom","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":244,"src":"2018:12:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,address,uint256) returns (bool)"}},"id":163,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2018:34:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":157,"id":164,"nodeType":"Return","src":"2011:41:0"}]},"documentation":null,"implemented":true,"kind":"function","modifiers":[],"name":"transfer","parameters":{"id":154,"nodeType":"ParameterList","parameters":[{"constant":false,"id":151,"name":"dst","nodeType":"VariableDeclaration","scope":166,"src":"1956:11:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":150,"name":"address","nodeType":"ElementaryTypeName","src":"1956:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":null,"visibility":"internal"},{"constant":false,"id":153,"name":"wad","nodeType":"VariableDeclaration","scope":166,"src":"1969:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":152,"name":"uint","nodeType":"ElementaryTypeName","src":"1969:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":null,"visibility":"internal"}],"src":"1955:23:0"},"returnParameters":{"id":157,"nodeType":"ParameterList","parameters":[{"constant":false,"id":156,"name":"","nodeType":"VariableDeclaration","scope":166,"src":"1995:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":155,"name":"bool","nodeType":"ElementaryTypeName","src":"1995:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"value":null,"visibility":"internal"}],"src":"1994:6:0"},"scope":245,"stateMutability":"nonpayable","superFunction":null,"visibility":"public"},{"id":244,"nodeType":"FunctionDefinition","src":"2065:460:0","nodes":[],"body":{"id":243,"nodeType":"Block","src":"2165:360:0","nodes":[],"statements":[{"expression":{"argumentTypes":null,"arguments":[{"argumentTypes":null,"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":182,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"id":178,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":42,"src":"2183:9:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":180,"indexExpression":{"argumentTypes":null,"id":179,"name":"src","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":168,"src":"2193:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2183:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"argumentTypes":null,"id":181,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":172,"src":"2201:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2183:21:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":177,"name":"require","nodeType":"Identifier","overloadedDeclarations":[263,264],"referencedDeclaration":263,"src":"2175:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":183,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2175:30:0","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":184,"nodeType":"ExpressionStatement","src":"2175:30:0"},{"condition":{"argumentTypes":null,"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":200,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"argumentTypes":null,"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":188,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"argumentTypes":null,"id":185,"name":"src","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":168,"src":"2220:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"argumentTypes":null,"expression":{"argumentTypes":null,"id":186,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"2227:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":187,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"2227:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"src":"2220:17:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"argumentTypes":null,"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":199,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"id":189,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":48,"src":"2241:9:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":191,"indexExpression":{"argumentTypes":null,"id":190,"name":"src","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":168,"src":"2251:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2241:14:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":194,"indexExpression":{"argumentTypes":null,"expression":{"argumentTypes":null,"id":192,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"2256:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":193,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"2256:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2241:26:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"argumentTypes":null,"arguments":[{"argumentTypes":null,"id":197,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"-","prefix":true,"src":"2276:2:0","subExpression":{"argumentTypes":null,"hexValue":"31","id":196,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2277:1:0","subdenomination":null,"typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"typeDescriptions":{"typeIdentifier":"t_rational_minus_1_by_1","typeString":"int_const -1"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_minus_1_by_1","typeString":"int_const -1"}],"id":195,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2271:4:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":"uint"},"id":198,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2271:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2241:38:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2220:59:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":null,"id":222,"nodeType":"IfStatement","src":"2216:179:0","trueBody":{"id":221,"nodeType":"Block","src":"2281:114:0","statements":[{"expression":{"argumentTypes":null,"arguments":[{"argumentTypes":null,"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":209,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"id":202,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":48,"src":"2303:9:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":204,"indexExpression":{"argumentTypes":null,"id":203,"name":"src","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":168,"src":"2313:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2303:14:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":207,"indexExpression":{"argumentTypes":null,"expression":{"argumentTypes":null,"id":205,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"2318:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":206,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"2318:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2303:26:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"argumentTypes":null,"id":208,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":172,"src":"2333:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2303:33:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":201,"name":"require","nodeType":"Identifier","overloadedDeclarations":[263,264],"referencedDeclaration":263,"src":"2295:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":210,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2295:42:0","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":211,"nodeType":"ExpressionStatement","src":"2295:42:0"},{"expression":{"argumentTypes":null,"id":219,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"id":212,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":48,"src":"2351:9:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":216,"indexExpression":{"argumentTypes":null,"id":213,"name":"src","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":168,"src":"2361:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2351:14:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":217,"indexExpression":{"argumentTypes":null,"expression":{"argumentTypes":null,"id":214,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":260,"src":"2366:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":215,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","referencedDeclaration":null,"src":"2366:10:0","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2351:26:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"argumentTypes":null,"id":218,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":172,"src":"2381:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2351:33:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":220,"nodeType":"ExpressionStatement","src":"2351:33:0"}]}},{"expression":{"argumentTypes":null,"id":227,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"id":223,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":42,"src":"2405:9:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":225,"indexExpression":{"argumentTypes":null,"id":224,"name":"src","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":168,"src":"2415:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2405:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"argumentTypes":null,"id":226,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":172,"src":"2423:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2405:21:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":228,"nodeType":"ExpressionStatement","src":"2405:21:0"},{"expression":{"argumentTypes":null,"id":233,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"argumentTypes":null,"baseExpression":{"argumentTypes":null,"id":229,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":42,"src":"2436:9:0","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":231,"indexExpression":{"argumentTypes":null,"id":230,"name":"dst","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":170,"src":"2446:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2436:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"argumentTypes":null,"id":232,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":172,"src":"2454:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2436:21:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":234,"nodeType":"ExpressionStatement","src":"2436:21:0"},{"eventCall":{"argumentTypes":null,"arguments":[{"argumentTypes":null,"id":236,"name":"src","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":168,"src":"2482:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"argumentTypes":null,"id":237,"name":"dst","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":170,"src":"2487:3:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"argumentTypes":null,"id":238,"name":"wad","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":172,"src":"2492:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":235,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26,"src":"2473:8:0","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":239,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2473:23:0","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":240,"nodeType":"EmitStatement","src":"2468:28:0"},{"expression":{"argumentTypes":null,"hexValue":"74727565","id":241,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2514:4:0","subdenomination":null,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":176,"id":242,"nodeType":"Return","src":"2507:11:0"}]},"documentation":null,"implemented":true,"kind":"function","modifiers":[],"name":"transferFrom","parameters":{"id":173,"nodeType":"ParameterList","parameters":[{"constant":false,"id":168,"name":"src","nodeType":"VariableDeclaration","scope":244,"src":"2087:11:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":167,"name":"address","nodeType":"ElementaryTypeName","src":"2087:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":null,"visibility":"internal"},{"constant":false,"id":170,"name":"dst","nodeType":"VariableDeclaration","scope":244,"src":"2100:11:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":169,"name":"address","nodeType":"ElementaryTypeName","src":"2100:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":null,"visibility":"internal"},{"constant":false,"id":172,"name":"wad","nodeType":"VariableDeclaration","scope":244,"src":"2113:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":171,"name":"uint","nodeType":"ElementaryTypeName","src":"2113:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":null,"visibility":"internal"}],"src":"2086:36:0"},"returnParameters":{"id":176,"nodeType":"ParameterList","parameters":[{"constant":false,"id":175,"name":"","nodeType":"VariableDeclaration","scope":244,"src":"2155:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":174,"name":"bool","nodeType":"ElementaryTypeName","src":"2155:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"value":null,"visibility":"internal"}],"src":"2154:6:0"},"scope":245,"stateMutability":"nonpayable","superFunction":null,"visibility":"public"}],"baseContracts":[],"contractDependencies":[],"contractKind":"contract","documentation":null,"fullyImplemented":true,"linearizedBaseContracts":[245],"name":"WETH9","scope":246}]},"id":0} \ No newline at end of file diff --git a/packages/sdk/src/interfaces/types.ts b/packages/sdk/src/interfaces/types.ts index f6b6b1c4eac0..6b78b9e9234b 100644 --- a/packages/sdk/src/interfaces/types.ts +++ b/packages/sdk/src/interfaces/types.ts @@ -35,6 +35,8 @@ export enum L2ChainID { BASE_MAINNET = 8453, ZORA_GOERLI = 999, ZORA_MAINNET = 7777777, + MODE_SEPOLIA = 919, + MODE_MAINNET = 34443, } /** @@ -53,6 +55,7 @@ export interface OEL1Contracts { // FPAC OptimismPortal2?: Contract DisputeGameFactory?: Contract + FaultDisputeGame?: Contract } /** @@ -258,14 +261,28 @@ export interface MessageReceipt { } /** - * ProvenWithdrawal in OptimismPortal + * ProvenWithdrawal in OptimismPortal. */ -export interface ProvenWithdrawal { +export interface LegacyProvenWithdrawal { outputRoot: string timestamp: BigNumber l2BlockNumber: BigNumber } +/** + * ProvenWithdrawal in OptimismPortal (FPAC). + */ +export interface FPACProvenWithdrawal { + proofSubmitter: string + disputeGameProxy: string + timestamp: BigNumber +} + +/** + * ProvenWithdrawal in OptimismPortal (FPAC or Legacy). + */ +export type ProvenWithdrawal = LegacyProvenWithdrawal | FPACProvenWithdrawal + /** * Header for a state root batch. */ diff --git a/packages/sdk/src/utils/chain-constants.ts b/packages/sdk/src/utils/chain-constants.ts index c9dccd49b214..15a7c1a98855 100644 --- a/packages/sdk/src/utils/chain-constants.ts +++ b/packages/sdk/src/utils/chain-constants.ts @@ -33,6 +33,12 @@ const l1CrossDomainMessengerAddresses = { sepolia: '0x58Cc85b8D04EA49cC6DBd3CbFFd00B4B8D6cb3ef', } +const disputeGameFactoryAddresses = { + mainnet: ethers.constants.AddressZero, + goerli: ethers.constants.AddressZero, + sepolia: '0x05F9613aDB30026FFd634f38e5C4dFd30a197Fa1', +} + // legacy const stateCommitmentChainAddresses = { mainnet: '0xBe5dAb4A2e9cd0F27300dB4aB94BeE3A233AEB19', @@ -75,6 +81,8 @@ export const DEPOSIT_CONFIRMATION_BLOCKS: { [L2ChainID.BASE_MAINNET]: 10 as const, [L2ChainID.ZORA_GOERLI]: 12 as const, [L2ChainID.ZORA_MAINNET]: 50 as const, + [L2ChainID.MODE_SEPOLIA]: 25 as const, + [L2ChainID.MODE_MAINNET]: 50 as const, } export const CHAIN_BLOCK_TIMES: { @@ -121,7 +129,7 @@ const getL1ContractsByNetworkName = (network: string): OEL1ContractsLike => { OptimismPortal: portalAddresses[network], L2OutputOracle: l2OutputOracleAddresses[network], OptimismPortal2: portalAddresses[network], - DisputeGameFactory: ethers.constants.AddressZero, + DisputeGameFactory: disputeGameFactoryAddresses[network], } } @@ -296,6 +304,42 @@ export const CONTRACT_ADDRESSES: { }, l2: DEFAULT_L2_CONTRACT_ADDRESSES, }, + [L2ChainID.MODE_SEPOLIA]: { + l1: { + AddressManager: '0x83D45725d6562d8CD717673D6bb4c67C07dC1905' as const, + L1CrossDomainMessenger: + '0xc19a60d9E8C27B9A43527c3283B4dd8eDC8bE15C' as const, + L1StandardBridge: '0xbC5C679879B2965296756CD959C3C739769995E2' as const, + StateCommitmentChain: + '0x0000000000000000000000000000000000000000' as const, + CanonicalTransactionChain: + '0x0000000000000000000000000000000000000000' as const, + BondManager: '0x0000000000000000000000000000000000000000' as const, + OptimismPortal: '0x320e1580effF37E008F1C92700d1eBa47c1B23fD' as const, + L2OutputOracle: '0x2634BD65ba27AB63811c74A63118ACb312701Bfa' as const, + OptimismPortal2: '0x0000000000000000000000000000000000000000' as const, + DisputeGameFactory: '0x0000000000000000000000000000000000000000' as const, + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + [L2ChainID.MODE_MAINNET]: { + l1: { + AddressManager: '0x50eF494573f28Cad6B64C31b7a00Cdaa48306e15' as const, + L1CrossDomainMessenger: + '0x95bDCA6c8EdEB69C98Bd5bd17660BaCef1298A6f' as const, + L1StandardBridge: '0x735aDBbE72226BD52e818E7181953f42E3b0FF21' as const, + StateCommitmentChain: + '0x0000000000000000000000000000000000000000' as const, + CanonicalTransactionChain: + '0x0000000000000000000000000000000000000000' as const, + BondManager: '0x0000000000000000000000000000000000000000' as const, + OptimismPortal: '0x8B34b14c7c7123459Cf3076b8Cb929BE097d0C07' as const, + L2OutputOracle: '0x4317ba146D4933D889518a3e5E11Fe7a53199b04' as const, + OptimismPortal2: '0x0000000000000000000000000000000000000000' as const, + DisputeGameFactory: '0x0000000000000000000000000000000000000000' as const, + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, } /** diff --git a/packages/sdk/src/utils/coercion.ts b/packages/sdk/src/utils/coercion.ts index eb5497f319bd..b57f8ba04418 100644 --- a/packages/sdk/src/utils/coercion.ts +++ b/packages/sdk/src/utils/coercion.ts @@ -53,6 +53,26 @@ export const toProvider = (provider: ProviderLike): Provider => { } } +/** + * Converts a ProviderLike into a JsonRpcProvider. + * + * @param provider ProviderLike to turn into a JsonRpcProvider. + * @returns Input as a JsonRpcProvider. + */ +export const toJsonRpcProvider = ( + provider: ProviderLike +): ethers.providers.JsonRpcProvider => { + const coerced = toProvider(provider) + if ('send' in coerced) { + // Existence of "send" is basically the only function that matters for determining if we can + // use this provider as a JsonRpcProvider, because "send" is the function that we usually want + // access to when we specifically care about having a JsonRpcProvider. + return coerced as ethers.providers.JsonRpcProvider + } else { + throw new Error('Invalid JsonRpcProvider, does not have "send" function') + } +} + /** * Pulls a transaction hash out of a TransactionLike object. * diff --git a/packages/sdk/src/utils/contracts.ts b/packages/sdk/src/utils/contracts.ts index e285f16d384b..c9a4184b0367 100644 --- a/packages/sdk/src/utils/contracts.ts +++ b/packages/sdk/src/utils/contracts.ts @@ -1,22 +1,23 @@ import { getContractInterface, predeploys } from '@eth-optimism/contracts' import { ethers, Contract } from 'ethers' -import l1StandardBridge from '@eth-optimism/contracts-bedrock/forge-artifacts/L1StandardBridge.sol/L1StandardBridge.json' -import l2StandardBridge from '@eth-optimism/contracts-bedrock/forge-artifacts/L2StandardBridge.sol/L2StandardBridge.json' -import optimismMintableERC20 from '@eth-optimism/contracts-bedrock/forge-artifacts/OptimismMintableERC20.sol/OptimismMintableERC20.json' -import optimismPortal from '@eth-optimism/contracts-bedrock/forge-artifacts/OptimismPortal.sol/OptimismPortal.json' -import l1CrossDomainMessenger from '@eth-optimism/contracts-bedrock/forge-artifacts/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.json' -import l2CrossDomainMessenger from '@eth-optimism/contracts-bedrock/forge-artifacts/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.json' -import optimismMintableERC20Factory from '@eth-optimism/contracts-bedrock/forge-artifacts/OptimismMintableERC20Factory.sol/OptimismMintableERC20Factory.json' -import proxyAdmin from '@eth-optimism/contracts-bedrock/forge-artifacts/ProxyAdmin.sol/ProxyAdmin.json' -import l2OutputOracle from '@eth-optimism/contracts-bedrock/forge-artifacts/L2OutputOracle.sol/L2OutputOracle.json' -import l1ERC721Bridge from '@eth-optimism/contracts-bedrock/forge-artifacts/L1ERC721Bridge.sol/L1ERC721Bridge.json' -import l2ERC721Bridge from '@eth-optimism/contracts-bedrock/forge-artifacts/L2ERC721Bridge.sol/L2ERC721Bridge.json' -import l1Block from '@eth-optimism/contracts-bedrock/forge-artifacts/L1Block.sol/L1Block.json' -import l2ToL1MessagePasser from '@eth-optimism/contracts-bedrock/forge-artifacts/L2ToL1MessagePasser.sol/L2ToL1MessagePasser.json' -import gasPriceOracle from '@eth-optimism/contracts-bedrock/forge-artifacts/GasPriceOracle.sol/GasPriceOracle.json' -import disputeGameFactory from '@eth-optimism/contracts-bedrock/forge-artifacts/DisputeGameFactory.sol/DisputeGameFactory.json' -import optimismPortal2 from '@eth-optimism/contracts-bedrock/forge-artifacts/OptimismPortal2.sol/OptimismPortal2.json' +import l1StandardBridge from '../forge-artifacts/L1StandardBridge.json' +import l2StandardBridge from '../forge-artifacts/L2StandardBridge.json' +import optimismMintableERC20 from '../forge-artifacts/OptimismMintableERC20.json' +import optimismPortal from '../forge-artifacts/OptimismPortal.json' +import l1CrossDomainMessenger from '../forge-artifacts/L1CrossDomainMessenger.json' +import l2CrossDomainMessenger from '../forge-artifacts/L2CrossDomainMessenger.json' +import optimismMintableERC20Factory from '../forge-artifacts/OptimismMintableERC20Factory.json' +import proxyAdmin from '../forge-artifacts/ProxyAdmin.json' +import l2OutputOracle from '../forge-artifacts/L2OutputOracle.json' +import l1ERC721Bridge from '../forge-artifacts/L1ERC721Bridge.json' +import l2ERC721Bridge from '../forge-artifacts/L2ERC721Bridge.json' +import l1Block from '../forge-artifacts/L1Block.json' +import l2ToL1MessagePasser from '../forge-artifacts/L2ToL1MessagePasser.json' +import gasPriceOracle from '../forge-artifacts/GasPriceOracle.json' +import disputeGameFactory from '../forge-artifacts/DisputeGameFactory.json' +import optimismPortal2 from '../forge-artifacts/OptimismPortal2.json' +import faultDisputeGame from '../forge-artifacts/FaultDisputeGame.json' import { toAddress } from './coercion' import { DeepPartial } from './type-utils' import { CrossChainMessenger } from '../cross-chain-messenger' @@ -48,7 +49,9 @@ const NAME_REMAPPING = { BedrockMessagePasser: 'L2ToL1MessagePasser' as const, } -const getContractInterfaceBedrock = (name: string): ethers.utils.Interface => { +export const getContractInterfaceBedrock = ( + name: string +): ethers.utils.Interface => { let artifact: any = '' switch (name) { case 'Lib_AddressManager': @@ -103,6 +106,9 @@ const getContractInterfaceBedrock = (name: string): ethers.utils.Interface => { case 'OptimismPortal2': artifact = optimismPortal2 break + case 'FaultDisputeGame': + artifact = faultDisputeGame + break } return new ethers.utils.Interface(artifact.abi) } diff --git a/packages/sdk/tasks/deposit-erc20.ts b/packages/sdk/tasks/deposit-erc20.ts index 9b62aea1eac4..e98f2b2398a5 100644 --- a/packages/sdk/tasks/deposit-erc20.ts +++ b/packages/sdk/tasks/deposit-erc20.ts @@ -7,17 +7,17 @@ import '@nomiclabs/hardhat-ethers' import 'hardhat-deploy' import { Event, Contract, Wallet, providers, utils, ethers } from 'ethers' import { predeploys, sleep } from '@eth-optimism/core-utils' -import Artifact__WETH9 from '@eth-optimism/contracts-bedrock/forge-artifacts/WETH9.sol/WETH9.json' -import Artifact__OptimismMintableERC20TokenFactory from '@eth-optimism/contracts-bedrock/forge-artifacts/OptimismMintableERC20Factory.sol/OptimismMintableERC20Factory.json' -import Artifact__OptimismMintableERC20Token from '@eth-optimism/contracts-bedrock/forge-artifacts/OptimismMintableERC20.sol/OptimismMintableERC20.json' -import Artifact__L2ToL1MessagePasser from '@eth-optimism/contracts-bedrock/forge-artifacts/L2ToL1MessagePasser.sol/L2ToL1MessagePasser.json' -import Artifact__L2CrossDomainMessenger from '@eth-optimism/contracts-bedrock/forge-artifacts/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.json' -import Artifact__L2StandardBridge from '@eth-optimism/contracts-bedrock/forge-artifacts/L2StandardBridge.sol/L2StandardBridge.json' -import Artifact__OptimismPortal from '@eth-optimism/contracts-bedrock/forge-artifacts/OptimismPortal.sol/OptimismPortal.json' -import Artifact__L1CrossDomainMessenger from '@eth-optimism/contracts-bedrock/forge-artifacts/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.json' -import Artifact__L1StandardBridge from '@eth-optimism/contracts-bedrock/forge-artifacts/L1StandardBridge.sol/L1StandardBridge.json' -import Artifact__L2OutputOracle from '@eth-optimism/contracts-bedrock/forge-artifacts/L2OutputOracle.sol/L2OutputOracle.json' +import Artifact__WETH9 from '../src/forge-artifacts/WETH9.json' +import Artifact__OptimismMintableERC20TokenFactory from '../src/forge-artifacts/OptimismMintableERC20Factory.json' +import Artifact__OptimismMintableERC20Token from '../src/forge-artifacts/OptimismMintableERC20.json' +import Artifact__L2ToL1MessagePasser from '../src/forge-artifacts/L2ToL1MessagePasser.json' +import Artifact__L2CrossDomainMessenger from '../src/forge-artifacts/L2CrossDomainMessenger.json' +import Artifact__L2StandardBridge from '../src/forge-artifacts/L2StandardBridge.json' +import Artifact__OptimismPortal from '../src/forge-artifacts/OptimismPortal.json' +import Artifact__L1CrossDomainMessenger from '../src/forge-artifacts/L1CrossDomainMessenger.json' +import Artifact__L1StandardBridge from '../src/forge-artifacts/L1StandardBridge.json' +import Artifact__L2OutputOracle from '../src/forge-artifacts/L2OutputOracle.json' import { CrossChainMessenger, MessageStatus, diff --git a/packages/sdk/tasks/deposit-eth.ts b/packages/sdk/tasks/deposit-eth.ts index a6766a8646c3..8e145a246a02 100644 --- a/packages/sdk/tasks/deposit-eth.ts +++ b/packages/sdk/tasks/deposit-eth.ts @@ -6,14 +6,14 @@ import 'hardhat-deploy' import { Deployment } from 'hardhat-deploy/types' import { predeploys } from '@eth-optimism/core-utils' import { providers, utils, ethers } from 'ethers' -import Artifact__L2ToL1MessagePasser from '@eth-optimism/contracts-bedrock/forge-artifacts/L2ToL1MessagePasser.sol/L2ToL1MessagePasser.json' -import Artifact__L2CrossDomainMessenger from '@eth-optimism/contracts-bedrock/forge-artifacts/L2CrossDomainMessenger.sol/L2CrossDomainMessenger.json' -import Artifact__L2StandardBridge from '@eth-optimism/contracts-bedrock/forge-artifacts/L2StandardBridge.sol/L2StandardBridge.json' -import Artifact__OptimismPortal from '@eth-optimism/contracts-bedrock/forge-artifacts/OptimismPortal.sol/OptimismPortal.json' -import Artifact__L1CrossDomainMessenger from '@eth-optimism/contracts-bedrock/forge-artifacts/L1CrossDomainMessenger.sol/L1CrossDomainMessenger.json' -import Artifact__L1StandardBridge from '@eth-optimism/contracts-bedrock/forge-artifacts/L1StandardBridge.sol/L1StandardBridge.json' -import Artifact__L2OutputOracle from '@eth-optimism/contracts-bedrock/forge-artifacts/L2OutputOracle.sol/L2OutputOracle.json' +import Artifact__L2ToL1MessagePasser from '../src/forge-artifacts/L2ToL1MessagePasser.json' +import Artifact__L2CrossDomainMessenger from '../src/forge-artifacts/L2CrossDomainMessenger.json' +import Artifact__L2StandardBridge from '../src/forge-artifacts/L2StandardBridge.json' +import Artifact__OptimismPortal from '../src/forge-artifacts/OptimismPortal.json' +import Artifact__L1CrossDomainMessenger from '../src/forge-artifacts/L1CrossDomainMessenger.json' +import Artifact__L1StandardBridge from '../src/forge-artifacts/L1StandardBridge.json' +import Artifact__L2OutputOracle from '../src/forge-artifacts/L2OutputOracle.json' import { CrossChainMessenger, MessageStatus, diff --git a/packages/sdk/test-next/README.md b/packages/sdk/test-next/README.md index 5b620b0bdf62..a46dbfa069a9 100644 --- a/packages/sdk/test-next/README.md +++ b/packages/sdk/test-next/README.md @@ -1,5 +1,5 @@ # test-next -- The new tests for the next version of sdk will use vitest -- The vitest tests are kept here seperated from mocha tests for now -- Can find values needed in a `.env` file in `example.env` +To run these tests it is expected that anvil is already running. + +See [circle config sdk-next tests](../../../.circleci/config.yml) for which anvil commands you should run diff --git a/packages/sdk/test-next/bridgeEcoToken.spec.ts b/packages/sdk/test-next/bridgeEcoToken.spec.ts index de4c009b0a4e..cebb5bc86bcf 100644 --- a/packages/sdk/test-next/bridgeEcoToken.spec.ts +++ b/packages/sdk/test-next/bridgeEcoToken.spec.ts @@ -58,7 +58,7 @@ const getL2ERC20TokenBalance = async (ownerAddress: Address) => { ) } -describe('ECO token', () => { +describe.skip('ECO token', () => { it('sdk should be able to deposit to l1 bridge contract correctly', async () => { await l1TestClient.impersonateAccount({ address: ECO_WHALE }) diff --git a/packages/sdk/test-next/failedMessages.spec.ts b/packages/sdk/test-next/failedMessages.spec.ts new file mode 100644 index 000000000000..ac2ea9554a68 --- /dev/null +++ b/packages/sdk/test-next/failedMessages.spec.ts @@ -0,0 +1,95 @@ +import { describe, it, expect } from 'vitest' +import { Address, Hex, encodePacked, keccak256, toHex } from 'viem' +import { ethers } from 'ethers' +import { z } from 'zod' +import { hashCrossDomainMessagev1 } from '@eth-optimism/core-utils' +import { optimismSepolia } from 'viem/chains' + +import { CONTRACT_ADDRESSES, CrossChainMessenger } from '../src' +import { sepoliaPublicClient, sepoliaTestClient } from './testUtils/viemClients' +import { sepoliaProvider, opSepoliaProvider } from './testUtils/ethersProviders' + +/** + * Generated on Mar 28 2024 using + * `forge inspect L1CrossDomainMessenger storage-layout` + **/ +const failedMessagesStorageLayout = { + astId: 7989, + contract: 'src/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger', + label: 'failedMessages', + offset: 0, + slot: 206n, + type: 't_mapping(t_bytes32,t_bool)', +} + +const sepoliaCrossDomainMessengerAddress = CONTRACT_ADDRESSES[ + optimismSepolia.id +].l1.L1CrossDomainMessenger as Address + +const setMessageAsFailed = async (tx: Hex) => { + const message = await crossChainMessenger.toCrossChainMessage(tx) + const messageHash = hashCrossDomainMessagev1( + message.messageNonce, + message.sender, + message.target, + message.value, + message.minGasLimit, + message.message + ) as Hex + + const keySlotHash = keccak256( + encodePacked( + ['bytes32', 'uint256'], + [messageHash, failedMessagesStorageLayout.slot] + ) + ) + return sepoliaTestClient.setStorageAt({ + address: sepoliaCrossDomainMessengerAddress, + index: keySlotHash, + value: toHex(true, { size: 32 }), + }) +} + +const E2E_PRIVATE_KEY = z + .string() + .describe('Private key') + // Mnemonic: test test test test test test test test test test test junk + .default('0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6') + .parse(import.meta.env.VITE_E2E_PRIVATE_KEY) + +const sepoliaWallet = new ethers.Wallet(E2E_PRIVATE_KEY, sepoliaProvider) +const crossChainMessenger = new CrossChainMessenger({ + l1SignerOrProvider: sepoliaWallet, + l2SignerOrProvider: opSepoliaProvider, + l1ChainId: 11155111, + l2ChainId: 11155420, + bedrock: true, +}) + +describe('replaying failed messages', () => { + it('should be able to replay failed messages', async () => { + // Grab an existing tx but mark it as failed + // @see https://sepolia-optimism.etherscan.io/tx/0x28249a36f764afab583a4633d59ff6c2a0e934293062bffa7cedb662e5da9abd + const tx = + '0x28249a36f764afab583a4633d59ff6c2a0e934293062bffa7cedb662e5da9abd' + + await setMessageAsFailed(tx) + + // debugging ethers.js is brutal because of error message so let's instead + // send the tx with viem. If it succeeds we will then test with ethers + const txData = + await crossChainMessenger.populateTransaction.finalizeMessage(tx) + + await sepoliaPublicClient.call({ + data: txData.data as Hex, + to: txData.to as Address, + }) + + // finalize the message + const finalizeTx = await crossChainMessenger.finalizeMessage(tx) + + const receipt = await finalizeTx.wait() + + expect(receipt.transactionHash).toBeDefined() + }) +}) diff --git a/packages/sdk/test-next/messageStatus.spec.ts b/packages/sdk/test-next/messageStatus.spec.ts index 3415a6572728..c66eecc9e353 100644 --- a/packages/sdk/test-next/messageStatus.spec.ts +++ b/packages/sdk/test-next/messageStatus.spec.ts @@ -11,7 +11,7 @@ const crossChainMessenger = new CrossChainMessenger({ bedrock: true, }) -describe('getMessageStatus', () => { +describe.skip('getMessageStatus', () => { it(`should be able to correctly find a finalized withdrawal`, async () => { /** * Tx hash of a withdrawal diff --git a/packages/sdk/test-next/proveMessage.spec.ts b/packages/sdk/test-next/proveMessage.spec.ts index e5dc9ab24b41..b3a7da4cfda4 100644 --- a/packages/sdk/test-next/proveMessage.spec.ts +++ b/packages/sdk/test-next/proveMessage.spec.ts @@ -64,7 +64,7 @@ const crossChainMessenger = new CrossChainMessenger({ bedrock: true, }) -describe('prove message', () => { +describe.skip('prove message', () => { it(`should prove a legacy tx `, async () => { /** diff --git a/packages/sdk/test-next/testUtils/ethersProviders.ts b/packages/sdk/test-next/testUtils/ethersProviders.ts index 2b5bf58b7051..7098afe0015c 100644 --- a/packages/sdk/test-next/testUtils/ethersProviders.ts +++ b/packages/sdk/test-next/testUtils/ethersProviders.ts @@ -1,28 +1,58 @@ import ethers from 'ethers' import { z } from 'zod' +/** + * @deprecated + */ const E2E_RPC_URL_L1 = z .string() .url() + .default('http://localhost:8545') .describe('L1 ethereum rpc Url') .parse(import.meta.env.VITE_E2E_RPC_URL_L1) +/** + * @deprecated + */ const E2E_RPC_URL_L2 = z .string() .url() - .describe('L1 ethereum rpc Url') + .default('http://localhost:9545') + .describe('L2 ethereum rpc Url') .parse(import.meta.env.VITE_E2E_RPC_URL_L2) const jsonRpcHeaders = { 'User-Agent': 'eth-optimism/@gateway/backend' } /** - * Initialize the signer, prover, and cross chain messenger + * @deprecated */ -const l1Provider = new ethers.providers.JsonRpcProvider({ +export const l1Provider = new ethers.providers.JsonRpcProvider({ url: E2E_RPC_URL_L1, headers: jsonRpcHeaders, }) -const l2Provider = new ethers.providers.JsonRpcProvider({ +/** + * @deprecated + */ +export const l2Provider = new ethers.providers.JsonRpcProvider({ url: E2E_RPC_URL_L2, headers: jsonRpcHeaders, }) -export { l1Provider, l2Provider } +export const E2E_RPC_URL_SEPOLIA = z + .string() + .url() + .default('http://localhost:8545') + .describe('SEPOLIA ethereum rpc Url') + .parse(import.meta.env.VITE_E2E_RPC_URL_SEPOLIA) +export const E2E_RPC_URL_OP_SEPOLIA = z + .string() + .url() + .default('http://localhost:9545') + .describe('OP_SEPOLIA ethereum rpc Url') + .parse(import.meta.env.VITE_E2E_RPC_URL_OP_SEPOLIA) +export const sepoliaProvider = new ethers.providers.JsonRpcProvider({ + url: E2E_RPC_URL_SEPOLIA, + headers: jsonRpcHeaders, +}) +export const opSepoliaProvider = new ethers.providers.JsonRpcProvider({ + url: E2E_RPC_URL_OP_SEPOLIA, + headers: jsonRpcHeaders, +}) diff --git a/packages/sdk/test-next/testUtils/viemClients.ts b/packages/sdk/test-next/testUtils/viemClients.ts index 6f503d808412..a33f4c6721d0 100644 --- a/packages/sdk/test-next/testUtils/viemClients.ts +++ b/packages/sdk/test-next/testUtils/viemClients.ts @@ -4,51 +4,108 @@ import { createWalletClient, http, } from 'viem' -import { goerli, optimismGoerli } from 'viem/chains' +import { goerli, optimismGoerli, optimismSepolia, sepolia } from 'viem/chains' -// we should instead use .env to determine chain so we can support alternate l1/l2 pairs +import { E2E_RPC_URL_OP_SEPOLIA, E2E_RPC_URL_SEPOLIA } from './ethersProviders' + +/** + * @deprecated + */ const L1_CHAIN = goerli +/** + * @deprecated + */ const L2_CHAIN = optimismGoerli +/** + * @deprecated + */ const L1_RPC_URL = 'http://localhost:8545' +/** + * @deprecated + */ const L2_RPC_URL = 'http://localhost:9545' -const l1TestClient = createTestClient({ +/** + * @deprecated + */ +export const l1TestClient = createTestClient({ mode: 'anvil', chain: L1_CHAIN, transport: http(L1_RPC_URL), }) -const l2TestClient = createTestClient({ +/** + * @deprecated + */ +export const l2TestClient = createTestClient({ mode: 'anvil', chain: L2_CHAIN, transport: http(L2_RPC_URL), }) -const l1PublicClient = createPublicClient({ +/** + * @deprecated + */ +export const l1PublicClient = createPublicClient({ chain: L1_CHAIN, transport: http(L1_RPC_URL), }) -const l2PublicClient = createPublicClient({ +/** + * @deprecated + */ +export const l2PublicClient = createPublicClient({ chain: L2_CHAIN, transport: http(L2_RPC_URL), }) -const l1WalletClient = createWalletClient({ +/** + * @deprecated + */ +export const l1WalletClient = createWalletClient({ chain: L1_CHAIN, transport: http(L1_RPC_URL), }) -const l2WalletClient = createWalletClient({ +/** + * @deprecated + */ +export const l2WalletClient = createWalletClient({ chain: L2_CHAIN, transport: http(L2_RPC_URL), }) -export { - l1TestClient, - l2TestClient, - l1PublicClient, - l2PublicClient, - l1WalletClient, - l2WalletClient, -} +const SEPOLIA_CHAIN = sepolia +const OP_SEPOLIA_CHAIN = optimismSepolia + +export const sepoliaTestClient = createTestClient({ + mode: 'anvil', + chain: SEPOLIA_CHAIN, + transport: http(E2E_RPC_URL_SEPOLIA), +}) + +export const opSepoliaTestClient = createTestClient({ + mode: 'anvil', + chain: OP_SEPOLIA_CHAIN, + transport: http(E2E_RPC_URL_OP_SEPOLIA), +}) + +export const sepoliaPublicClient = createPublicClient({ + chain: SEPOLIA_CHAIN, + transport: http(E2E_RPC_URL_SEPOLIA), +}) + +export const opSepoliaPublicClient = createPublicClient({ + chain: OP_SEPOLIA_CHAIN, + transport: http(E2E_RPC_URL_OP_SEPOLIA), +}) + +export const sepoliaWalletClient = createWalletClient({ + chain: SEPOLIA_CHAIN, + transport: http(E2E_RPC_URL_SEPOLIA), +}) + +export const opSepoliaWalletClient = createWalletClient({ + chain: OP_SEPOLIA_CHAIN, + transport: http(E2E_RPC_URL_OP_SEPOLIA), +}) diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json index 5cb4fda3c546..c59f2e54c42b 100644 --- a/packages/sdk/tsconfig.json +++ b/packages/sdk/tsconfig.json @@ -1,10 +1,12 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "lib": ["ES2021"], "rootDir": "./src", "outDir": "./dist" }, "include": [ - "src/**/*" + "src/**/*", + "src/forge-artifacts/*.json" ] } diff --git a/packages/web3js-plugin/.prettierignore b/packages/web3js-plugin/.prettierignore deleted file mode 100644 index ea808af54514..000000000000 --- a/packages/web3js-plugin/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -artifacts -cache -typechain -.deps -.envrc -.env -/dist/ diff --git a/packages/web3js-plugin/.prettierrc.cjs b/packages/web3js-plugin/.prettierrc.cjs deleted file mode 100644 index 2d293bab8925..000000000000 --- a/packages/web3js-plugin/.prettierrc.cjs +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - ...require('../../.prettierrc.js'), -} diff --git a/packages/web3js-plugin/CHANGELOG.md b/packages/web3js-plugin/CHANGELOG.md deleted file mode 100644 index f763e06b4c05..000000000000 --- a/packages/web3js-plugin/CHANGELOG.md +++ /dev/null @@ -1,19 +0,0 @@ -# @eth-optimism/web3.js-plugin - -## 0.1.3 - -### Patch Changes - -- [#7450](https://github.com/ethereum-optimism/optimism/pull/7450) [`ac90e16a7`](https://github.com/ethereum-optimism/optimism/commit/ac90e16a7f85c4f73661ae6023135c3d00421c1e) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated dev dependencies related to testing that is causing audit tooling to report failures - -## 0.1.2 - -### Patch Changes - -- [#6873](https://github.com/ethereum-optimism/optimism/pull/6873) [`fdab6caa7`](https://github.com/ethereum-optimism/optimism/commit/fdab6caa7e6684b08882d2a766ccd727068c2b2f) Thanks [@spacesailor24](https://github.com/spacesailor24)! - Update code exmaples in README - -## 0.1.1 - -### Patch Changes - -- [#6848](https://github.com/ethereum-optimism/optimism/pull/6848) [`b08fccd9e`](https://github.com/ethereum-optimism/optimism/commit/b08fccd9e21c499f9fefd4d58fb8a36bfa0d800a) Thanks [@spacesailor24](https://github.com/spacesailor24)! - Correct use of web3js-plugin to web3.js-plugin in README. Rename OptimismFeeEstimationPlugin export to OptimismPlugin diff --git a/packages/web3js-plugin/LICENSE b/packages/web3js-plugin/LICENSE deleted file mode 100644 index b7328e483ff7..000000000000 --- a/packages/web3js-plugin/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Optimism - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/web3js-plugin/README.md b/packages/web3js-plugin/README.md deleted file mode 100644 index f4c3392c96b0..000000000000 --- a/packages/web3js-plugin/README.md +++ /dev/null @@ -1,604 +0,0 @@ -# @eth-optimism/web3.js-plugin - -This web3.js plugin adds utility functions for estimating L1 and L2 gas for OP chains by wrapping the [GasPriceOracle](../contracts-bedrock/contracts/l2/GasPriceOracle.sol) contract - -The GasPriceOracle is [deployed to Optimism](https://optimistic.etherscan.io/address/0x420000000000000000000000000000000000000F) and other OP chains at a predeployed address of `0x420000000000000000000000000000000000000F` - -For more detailed information about gas fees on Optimism's Layer 2, you can visit the [official documentation](https://community.optimism.io/docs/developers/build/transaction-fees/#the-l2-execution-fee) - -## Installation - -This plugin is intended to be [registered](https://docs.web3js.org/guides/web3_plugin_guide/plugin_users#registering-the-plugin) onto an instance of `Web3`. It has a [peerDependency](https://nodejs.org/es/blog/npm/peer-dependencies) of `web3` version `4.x`, so make sure you have that latest version of `web3` installed for your project before installing the plugin - -### Installing the Plugin - -```bash -pnpm install @eth-optimism/web3.js-plugin -``` - -```bash -npm install @eth-optimism/web3.js-plugin -``` - -```bash -yarn add @eth-optimism/web3.js-plugin -``` - -### Registering the Plugin - -```typescript -import Web3 from 'web3' -import { OptimismPlugin } from '@eth-optimism/web3.js-plugin' - -const web3 = new Web3('http://yourProvider.com') -web3.registerPlugin(new OptimismPlugin()) -``` - -You will now have access to the following functions under the `op` namespace, i.e. `web3.op.someMethod` - -## API - -| Function Name | Returns | -| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [estimateFees](#estimatefees) | The combined estimated L1 and L2 fees for a transaction | -| [getL1Fee](#getl1fee) | The L1 portion of the fee based on the size of the [RLP](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/) encoded transaction, the current L1 base fee, and other various dynamic parameters | -| [getL2Fee](#getl2fee) | The L2 portion of the fee based on the simulated execution of the provided transaction and current `gasPrice` | -| [getBaseFee](#getbasefee) | The current L2 base fee | -| [getDecimals](#getdecimals) | The decimals used in the scalar | -| [getGasPrice](#getgasprice) | The current L2 gas price | -| [getL1GasUsed](#getl1gasused) | The amount of L1 gas estimated to be used to execute a transaction | -| [getL1BaseFee](#getdegetl1basefeecimals) | The L1 base fee | -| [getOverhead](#getoverhead) | The current overhead | -| [getScalar](#getscalar) | The current fee scalar | -| [getVersion](#getversion) | The current version of `GasPriceOracle` | - ---- - -### `estimateFees` - -Computes the total (L1 + L2) fee estimate to execute a transaction - -```typescript -async estimateFees(transaction: Transaction, returnFormat?: ReturnFormat) -``` - -#### Parameters - -- `transaction: Transaction` - An unsigned web3.js [transaction](https://docs.web3js.org/api/web3-types/interface/Transaction) object -- `returnFormat?: ReturnFormat` - A web3.js [DataFormat][1] object that specifies how to format number and bytes values - - If `returnFormat` is not provided, [DEFAULT_RETURN_FORMAT][2] is used which will format numbers to `BigInt`s - -#### Returns - -- `Promise` - The estimated total fee as a `BigInt` by default, but `returnFormat` determines type - -#### Example - -```typescript -import Web3 from 'web3' -import { OptimismPlugin } from '@eth-optimism/web3.js-plugin' -import { - l2StandardBridgeABI, - l2StandardBridgeAddress, -} from '@eth-optimism/contracts-ts' - -const web3 = new Web3('https://mainnet.optimism.io') -web3.registerPlugin(new OptimismPlugin()) - -const l2BridgeContract = new web3.eth.Contract( - l2StandardBridgeABI, - optimistAddress[420] -) -const encodedWithdrawMethod = l2BridgeContract.methods - .withdraw( - // l2 token address - '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', - // amount - Web3.utils.toWei('0.00000001', 'ether'), - // l1 gas - 0, - // extra data - '0x00' - ) - .encodeABI() - -const totalFee = await web3.op.estimateFees({ - chainId: 10, - data: encodedWithdrawMethod, - value: Web3.utils.toWei('0.00000001', 'ether'), - type: 2, - to: '0x420000000000000000000000000000000000000F', - from: '0x6387a88a199120aD52Dd9742C7430847d3cB2CD4', - maxFeePerGas: Web3.utils.toWei('0.2', 'gwei'), - maxPriorityFeePerGas: Web3.utils.toWei('0.1', 'gwei'), -}) - -console.log(totalFee) // 26608988767659n -``` - -##### Formatting Response as a Hex String - -```typescript -import Web3 from 'web3' -import { OptimismPlugin } from '@eth-optimism/web3.js-plugin' -import { - l2StandardBridgeABI, - l2StandardBridgeAddress, -} from '@eth-optimism/contracts-ts' - -const web3 = new Web3('https://mainnet.optimism.io') -web3.registerPlugin(new OptimismPlugin()) - -const l2BridgeContract = new web3.eth.Contract( - l2StandardBridgeABI, - optimistAddress[420] -) -const encodedWithdrawMethod = l2BridgeContract.methods - .withdraw( - // l2 token address - '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', - // amount - Web3.utils.toWei('0.00000001', 'ether'), - // l1 gas - 0, - // extra data - '0x00' - ) - .encodeABI() - -const totalFee = await web3.op.estimateFees( - { - chainId: 10, - data: encodedWithdrawMethod, - value: Web3.utils.toWei('0.00000001', 'ether'), - type: 2, - to: '0x420000000000000000000000000000000000000F', - from: '0x6387a88a199120aD52Dd9742C7430847d3cB2CD4', - maxFeePerGas: Web3.utils.toWei('0.2', 'gwei'), - maxPriorityFeePerGas: Web3.utils.toWei('0.1', 'gwei'), - }, - { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX } -) - -console.log(totalFee) // 0x18336352c5ab -``` - -### `getL1Fee` - -Computes the L1 portion of the fee based on the size of the rlp encoded input transaction, the current L1 base fee, and the various dynamic parameters - -```typescript -async getL1Fee(transaction: Transaction, returnFormat?: ReturnFormat) -``` - -#### Parameters - -- `transaction: Transaction` - An unsigned web3.js [transaction](https://docs.web3js.org/api/web3-types/interface/Transaction) object -- `returnFormat?: ReturnFormat` - A web3.js [DataFormat][1] object that specifies how to format number and bytes values - - If `returnFormat` is not provided, [DEFAULT_RETURN_FORMAT][2] is used which will format numbers to `BigInt`s - -#### Returns - -- `Promise` - The estimated L1 fee as a `BigInt` by default, but `returnFormat` determines type - -#### Example - -```typescript -import { Contract } from 'web3' -import { optimistABI, optimistAddress } from '@eth-optimism/contracts-ts' - -const optimistContract = new Contract(optimistABI, optimistAddress[420]) -const encodedBurnMethod = optimistContract.methods - .burn('0x77194aa25a06f932c10c0f25090f3046af2c85a6') - .encodeABI() - -const l1Fee = await web3.op.getL1Fee({ - chainId: 10, - data: encodedBurnMethod, - type: 2, -}) - -console.log(l1Fee) // 18589035222172n -``` - -##### Formatting Response as a Hex String - -```typescript -import { Contract } from 'web3' -import { optimistABI, optimistAddress } from '@eth-optimism/contracts-ts' - -const optimistContract = new Contract(optimistABI, optimistAddress[420]) -const encodedBurnMethod = optimistContract.methods - .burn('0x77194aa25a06f932c10c0f25090f3046af2c85a6') - .encodeABI() - -const l1Fee = await web3.op.getL1Fee( - { - chainId: 10, - data: encodedBurnMethod, - type: 2, - }, - { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX } -) - -console.log(l1Fee) // 0x10e818d7549c -``` - -### `getL2Fee` - -Retrieves the amount of L2 gas estimated to execute `transaction` - -```typescript -async getL2Fee(transaction: Transaction, returnFormat?: ReturnFormat) -``` - -#### Parameters - -- `transaction: Transaction` - An unsigned web3.js [transaction](https://docs.web3js.org/api/web3-types/interface/Transaction) object -- `options?: { blockNumber?: BlockNumberOrTag, returnFormat?: ReturnFormat }` - An optional object with properties: - - `blockNumber?: BlockNumberOrTag` - Specifies what block to use for gas estimation. Can be either: - - **Note** Specifying a block to estimate L2 gas for is currently not working - - A web3.js [Numbers](https://docs.web3js.org/api/web3-types#Numbers) - - A web3.js [BlockTags](https://docs.web3js.org/api/web3-types/enum/BlockTags) - - If not provided, `BlockTags.LATEST` is used - - `returnFormat?: ReturnFormat` - A web3.js [DataFormat][1] object that specifies how to format number and bytes values - - If `returnFormat` is not provided, [DEFAULT_RETURN_FORMAT][2] is used which will format numbers to `BigInt`s - -#### Returns - -- `Promise` - The estimated total fee as a `BigInt` by default, but `returnFormat` determines type - -#### Example - -```typescript -import { Contract } from 'web3' -import { optimistABI, optimistAddress } from '@eth-optimism/contracts-ts' - -const optimistContract = new Contract(optimistABI, optimistAddress[420]) -const encodedBurnMethod = optimistContract.methods - .burn('0x77194aa25a06f932c10c0f25090f3046af2c85a6') - .encodeABI() - -const l2Fee = await web3.op.getL2Fee({ - chainId: '0xa', - data: encodedBurnMethod, - type: '0x2', - to: optimistAddress[420], - from: '0x77194aa25a06f932c10c0f25090f3046af2c85a6', -}) - -console.log(l2Fee) // 2659500n -``` - -##### Formatting Response as a Hex String - -```typescript -import { Contract } from 'web3' -import { optimistABI, optimistAddress } from '@eth-optimism/contracts-ts' - -const optimistContract = new Contract(optimistABI, optimistAddress[420]) -const encodedBurnMethod = optimistContract.methods - .burn('0x77194aa25a06f932c10c0f25090f3046af2c85a6') - .encodeABI() - -const l2Fee = await web3.op.getL2Fee( - { - chainId: '0xa', - data: encodedBurnMethod, - type: '0x2', - to: optimistAddress[420], - from: '0x77194aa25a06f932c10c0f25090f3046af2c85a6', - }, - { - returnFormat: { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX }, - } -) - -console.log(l2Fee) // 0x2894ac -``` - -### `getBaseFee` - -Retrieves the current L2 base fee - -```typescript -async getBaseFee(returnFormat?: ReturnFormat) -``` - -#### Parameters - -- `returnFormat?: ReturnFormat` - A web3.js [DataFormat][1] object that specifies how to format number and bytes values - - If `returnFormat` is not provided, [DEFAULT_RETURN_FORMAT][2] is used which will format numbers to `BigInt`s - -#### Returns - -- `Promise` - The L2 base fee as a `BigInt` by default, but `returnFormat` determines type - -#### Example - -```typescript -const baseFee = await web3.op.getBaseFee() - -console.log(baseFee) // 68n -``` - -##### Formatting Response as a Hex String - -```typescript -const baseFee = await web3.op.getBaseFee({ - number: FMT_NUMBER.HEX, - bytes: FMT_BYTES.HEX, -}) - -console.log(baseFee) // 0x44 -``` - -### `getDecimals` - -Retrieves the decimals used in the scalar - -```typescript -async getDecimals(returnFormat?: ReturnFormat) -``` - -#### Parameters - -- `returnFormat?: ReturnFormat` - A web3.js [DataFormat][3] object that specifies how to format number and bytes values - - If `returnFormat` is not provided, [DEFAULT_RETURN_FORMAT][2] is used which will format numbers to `BigInt`s - -#### Returns - -- `Promise` - The number of decimals as a `BigInt` by default, but `returnFormat` determines type - -#### Example - -```typescript -const decimals = await web3.op.getDecimals() - -console.log(decimals) // 6n -``` - -##### Formatting Response as a Hex String - -```typescript -const decimals = await web3.op.getDecimals({ - number: FMT_NUMBER.HEX, - bytes: FMT_BYTES.HEX, -}) - -console.log(decimals) // 0x6 -``` - -### `getGasPrice` - -Retrieves the current L2 gas price (base fee) - -```typescript -async getGasPrice(returnFormat?: ReturnFormat) -``` - -#### Parameters - -- `returnFormat?: ReturnFormat` - A web3.js [DataFormat][3] object that specifies how to format number and bytes values - - If `returnFormat` is not provided, [DEFAULT_RETURN_FORMAT][2] is used which will format numbers to `BigInt`s - -#### Returns - -- `Promise` - The current L2 gas price as a `BigInt` by default, but `returnFormat` determines type - -#### Example - -```typescript -const gasPrice = await web3.op.getGasPrice() - -console.log(gasPrice) // 77n -``` - -##### Formatting Response as a Hex String - -```typescript -const gasPrice = await web3.op.getGasPrice({ - number: FMT_NUMBER.HEX, - bytes: FMT_BYTES.HEX, -}) - -console.log(gasPrice) // 0x4d -``` - -### `getL1GasUsed` - -Computes the amount of L1 gas used for {transaction}. Adds the overhead which represents the per-transaction gas overhead of posting the {transaction} and state roots to L1. Adds 68 bytes of padding to account for the fact that the input does not have a signature. - -```typescript -async getL1GasUsed(transaction: Transaction, returnFormat?: ReturnFormat) -``` - -#### Parameters - -- `transaction: Transaction` - An unsigned web3.js [transaction](https://docs.web3js.org/api/web3-types/interface/Transaction) object -- `returnFormat?: ReturnFormat` - A web3.js [DataFormat][3] object that specifies how to format number and bytes values - - If `returnFormat` is not provided, [DEFAULT_RETURN_FORMAT][2] is used which will format numbers to `BigInt`s - -#### Returns - -- `Promise` - The amount of gas as a `BigInt` by default, but `returnFormat` determines type - -#### Example - -```typescript -import { Contract } from 'web3' -import { optimistABI, optimistAddress } from '@eth-optimism/contracts-ts' - -const optimistContract = new Contract(optimistABI, optimistAddress[420]) -const encodedBurnMethod = optimistContract.methods - .burn('0x77194aa25a06f932c10c0f25090f3046af2c85a6') - .encodeABI() - -const l1GasUsed = await web3.op.getL1GasUsed({ - chainId: 10, - data: encodedBurnMethod, - type: 2, -}) - -console.log(l1GasUsed) // 1884n -``` - -##### Formatting Response as a Hex String - -```typescript -import { Contract } from 'web3' -import { optimistABI, optimistAddress } from '@eth-optimism/contracts-ts' - -const optimistContract = new Contract(optimistABI, optimistAddress[420]) -const encodedBurnMethod = optimistContract.methods - .burn('0x77194aa25a06f932c10c0f25090f3046af2c85a6') - .encodeABI() - -const l1GasUsed = await web3.op.getL1GasUsed( - { - chainId: 10, - data: encodedBurnMethod, - type: 2, - }, - { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX } -) - -console.log(l1GasUsed) // 0x75c -``` - -### `getL1BaseFee` - -Retrieves the latest known L1 base fee - -```typescript -async getL1BaseFee(returnFormat?: ReturnFormat) -``` - -#### Parameters - -- `returnFormat?: ReturnFormat` - A web3.js [DataFormat][3] object that specifies how to format number and bytes values - - If `returnFormat` is not provided, [DEFAULT_RETURN_FORMAT][2] is used which will format numbers to `BigInt`s - -#### Returns - -- `Promise` - The L1 base fee as a `BigInt` by default, but `returnFormat` determines type - -#### Example - -```typescript -const baseFee = await web3.op.getL1BaseFee() - -console.log(baseFee) // 13752544112n -``` - -##### Formatting Response as a Hex String - -```typescript -const baseFee = await web3.op.getL1BaseFee({ - number: FMT_NUMBER.HEX, - bytes: FMT_BYTES.HEX, -}) - -console.log(baseFee) // 0x333b72b70 -``` - -### `getOverhead` - -Retrieves the current fee overhead - -```typescript -async getOverhead(returnFormat?: ReturnFormat) -``` - -#### Parameters - -- `returnFormat?: ReturnFormat` - A web3.js [DataFormat][3] object that specifies how to format number and bytes values - - If `returnFormat` is not provided, [DEFAULT_RETURN_FORMAT][2] is used which will format numbers to `BigInt`s - -#### Returns - -- `Promise` - The current overhead as a `BigInt` by default, but `returnFormat` determines type - -#### Example - -```typescript -const overhead = await web3.op.getOverhead() - -console.log(overhead) // 188n -``` - -##### Formatting Response as a Hex String - -```typescript -const overhead = await web3.op.getOverhead({ - number: FMT_NUMBER.HEX, - bytes: FMT_BYTES.HEX, -}) - -console.log(overhead) // 0xbc -``` - -### `getScalar` - -Retrieves the current fee scalar - -```typescript -async getScalar(returnFormat?: ReturnFormat) -``` - -#### Parameters - -- `returnFormat?: ReturnFormat` - A web3.js [DataFormat][1] object that specifies how to format number and bytes values - - If `returnFormat` is not provided, [DEFAULT_RETURN_FORMAT][2] is used which will format numbers to `BigInt`s - -#### Returns - -- `Promise` - The current scalar fee as a `BigInt` by default, but `returnFormat` determines type - -#### Example - -```typescript -const scalarFee = await web3.op.getScalar() - -console.log(scalarFee) // 684000n -``` - -##### Formatting Response as a Hex String - -```typescript -const scalarFee = await web3.op.getScalar({ - number: FMT_NUMBER.HEX, - bytes: FMT_BYTES.HEX, -}) - -console.log(scalarFee) // 0xa6fe0 -``` - -### `getVersion` - -Retrieves the full semver version of GasPriceOracle - -```typescript -async getVersion() -``` - -#### Returns - -- `Promise` - The semver version - -#### Example - -```typescript -const version = await web3.op.getVersion() - -console.log(version) // 1.0.0 -``` - -## Known Issues - -- As of version `4.0.3` of web3.js, both `input` and `data` parameters are automatically added to a transaction objects causing the gas estimations to be inflated. This was corrected in [this](https://github.com/web3/web3.js/pull/6294) PR, but has yet to be released -- For the plugin function `getL2Fee`, you should be able to get the fee estimates using the state of the blockchain at a specified block, however, this doesn't seem to be working with web3.js and requires further investigation - -[1]: https://docs.web3js.org/api/web3-types#DataFormat -[2]: https://docs.web3js.org/api/web3-types#DEFAULT_RETURN_FORMAT -[3]: https://docs.web3js.org/api/web3-types#DataFormat diff --git a/packages/web3js-plugin/package.json b/packages/web3js-plugin/package.json deleted file mode 100644 index d5cbb29a4006..000000000000 --- a/packages/web3js-plugin/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "@eth-optimism/web3.js-plugin", - "version": "0.1.3", - "description": "A Web3.js plugin for doing OP-Chain gas estimation", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/ethereum-optimism/optimism.git", - "directory": "packages/web3js-plugin" - }, - "homepage": "https://optimism.io", - "type": "module", - "exports": { - ".": { - "import": "./dist/plugin.js", - "require": "./dist/plugin.cjs", - "default": "./dist/plugin.js", - "types": "./src/plugin.d.ts" - } - }, - "types": "dist/plugin.d.ts", - "files": [ - "dist/", - "src/" - ], - "scripts": { - "build": "tsup", - "lint": "prettier --check .", - "lint:fix": "prettier --write .", - "test": "vitest --coverage", - "test:coverage": "vitest run --coverage", - "typecheck": "tsc --noEmit" - }, - "devDependencies": { - "@eth-optimism/contracts-ts": "workspace:^", - "@swc/core": "^1.4.6", - "@vitest/coverage-istanbul": "^1.2.2", - "tsup": "^8.0.1", - "typescript": "^5.3.3", - "viem": "^2.7.19", - "vite": "^5.1.5", - "vitest": "^1.2.2", - "zod": "^3.22.4" - }, - "dependencies": { - "@ethereumjs/rlp": "^5.0.2", - "web3-eth": "^4.0.3", - "web3-eth-accounts": "^4.0.3" - }, - "peerDependencies": { - "web3": ">= 4.0.3 < 5.x" - } -} diff --git a/packages/web3js-plugin/src/plugin.spec.ts b/packages/web3js-plugin/src/plugin.spec.ts deleted file mode 100644 index 11c10b35bb53..000000000000 --- a/packages/web3js-plugin/src/plugin.spec.ts +++ /dev/null @@ -1,346 +0,0 @@ -import { beforeAll, describe, expect, test } from 'vitest' -import { z } from 'zod' -import Web3, { Contract, FMT_BYTES, FMT_NUMBER } from 'web3' -import { - l2StandardBridgeABI, - l2StandardBridgeAddress, - optimistABI, - optimistAddress, -} from '@eth-optimism/contracts-ts' - -import { OptimismPlugin } from './plugin' - -const defaultProvider = 'https://mainnet.optimism.io' -const provider = z - .string() - .url() - .default(defaultProvider) - .parse(process.env['VITE_L2_RPC_URL']) -if (provider === defaultProvider) - console.warn( - 'Warning: Using default public provider, this could cause tests to fail due to rate limits. Set the VITE_L2_RPC_URL env to override default provider' - ) - -describe('OptimismPlugin', () => { - let web3: Web3 - - beforeAll(() => { - web3 = new Web3(provider) - web3.registerPlugin(new OptimismPlugin()) - }) - - test('should be registered under .op namespace', () => - expect(web3.op).toMatchInlineSnapshot(` - OptimismPlugin { - "_accountProvider": { - "create": [Function], - "decrypt": [Function], - "encrypt": [Function], - "hashMessage": [Function], - "privateKeyToAccount": [Function], - "recover": [Function], - "recoverTransaction": [Function], - "sign": [Function], - "signTransaction": [Function], - "wallet": Wallet [], - }, - "_emitter": EventEmitter { - "_events": {}, - "_eventsCount": 0, - "_maxListeners": undefined, - Symbol(kCapture): false, - }, - "_gasPriceOracleContract": undefined, - "_requestManager": Web3RequestManager { - "_emitter": EventEmitter { - "_events": { - "BEFORE_PROVIDER_CHANGE": [Function], - "PROVIDER_CHANGED": [Function], - }, - "_eventsCount": 2, - "_maxListeners": undefined, - Symbol(kCapture): false, - }, - "_provider": HttpProvider { - "clientUrl": "https://opt-mainnet.g.alchemy.com/v2/OVlbpe9COlhG-ijOXGvL_phb5ns6p9-w", - "httpProviderOptions": undefined, - }, - "useRpcCallSpecification": undefined, - }, - "_subscriptionManager": Web3SubscriptionManager { - "_subscriptions": Map {}, - "registeredSubscriptions": { - "logs": [Function], - "newBlockHeaders": [Function], - "newHeads": [Function], - "newPendingTransactions": [Function], - "pendingTransactions": [Function], - "syncing": [Function], - }, - "requestManager": Web3RequestManager { - "_emitter": EventEmitter { - "_events": { - "BEFORE_PROVIDER_CHANGE": [Function], - "PROVIDER_CHANGED": [Function], - }, - "_eventsCount": 2, - "_maxListeners": undefined, - Symbol(kCapture): false, - }, - "_provider": HttpProvider { - "clientUrl": "https://opt-mainnet.g.alchemy.com/v2/OVlbpe9COlhG-ijOXGvL_phb5ns6p9-w", - "httpProviderOptions": undefined, - }, - "useRpcCallSpecification": undefined, - }, - "tolerateUnlinkedSubscription": false, - }, - "_wallet": Wallet [], - "config": { - "blockHeaderTimeout": 10, - "defaultAccount": undefined, - "defaultBlock": "latest", - "defaultChain": "mainnet", - "defaultCommon": undefined, - "defaultHardfork": "london", - "defaultMaxPriorityFeePerGas": "0x9502f900", - "defaultNetworkId": undefined, - "defaultTransactionType": "0x0", - "enableExperimentalFeatures": { - "useRpcCallSpecification": false, - "useSubscriptionWhenCheckingBlockTimeout": false, - }, - "handleRevert": false, - "maxListenersWarningThreshold": 100, - "transactionBlockTimeout": 50, - "transactionBuilder": undefined, - "transactionConfirmationBlocks": 24, - "transactionConfirmationPollingInterval": undefined, - "transactionPollingInterval": 1000, - "transactionPollingTimeout": 750000, - "transactionReceiptPollingInterval": undefined, - "transactionSendTimeout": 750000, - "transactionTypeParser": undefined, - }, - "pluginNamespace": "op", - "providers": { - "HttpProvider": [Function], - "WebsocketProvider": [Function], - }, - } - `)) - - describe('should return a bigint by default', () => { - test('getBaseFee', async () => - expect(await web3.op.getBaseFee()).toBeTypeOf('bigint')) - - test('getDecimals should return 6n', async () => - expect(await web3.op.getDecimals()).toBe(BigInt(6))) - - test('getGasPrice', async () => - expect(await web3.op.getGasPrice()).toBeTypeOf('bigint')) - - test('getL1BaseFee', async () => - expect(await web3.op.getL1BaseFee()).toBeTypeOf('bigint')) - - test('getOverhead should return 188n', async () => - expect(await web3.op.getOverhead()).toBe(BigInt(188))) - - test('getScalar should return 684000n', async () => - expect(await web3.op.getScalar()).toBe(BigInt(684000))) - }) - - describe('should return a number', () => { - const numberFormat = { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX } - - test('getBaseFee', async () => - expect(await web3.op.getBaseFee(numberFormat)).toBeTypeOf('number')) - - test('getDecimals should return 6', async () => - expect(await web3.op.getDecimals(numberFormat)).toBe(6)) - - test('getGasPrice', async () => - expect(await web3.op.getGasPrice(numberFormat)).toBeTypeOf('number')) - - test('getL1BaseFee', async () => - expect(await web3.op.getL1BaseFee(numberFormat)).toBeTypeOf('number')) - - test('getOverhead should return 188', async () => - expect(await web3.op.getOverhead(numberFormat)).toBe(188)) - - test('getScalar should return 684000', async () => - expect(await web3.op.getScalar(numberFormat)).toBe(684000)) - }) - - test('getVersion should return the string 1.0.0', async () => - expect(await web3.op.getVersion()).toBe('1.0.0')) - - describe('Contract transaction gas estimates - optimistABI.burn', () => { - let optimistContract: Contract - let encodedBurnMethod: string - - beforeAll(() => { - optimistContract = new web3.eth.Contract(optimistABI) - encodedBurnMethod = optimistContract.methods - .burn('0x77194aa25a06f932c10c0f25090f3046af2c85a6') - .encodeABI() - }) - - describe('should return a bigint by default', () => { - test('getL1Fee', async () => { - expect( - await web3.op.getL1Fee({ - chainId: '0xa', - data: encodedBurnMethod, - type: '0x2', - }) - ).toBeTypeOf('bigint') - }) - - test('getL1GasUsed should return 1884n', async () => - expect( - await web3.op.getL1GasUsed({ - chainId: '0xa', - data: encodedBurnMethod, - type: '0x2', - }) - ).toBe(BigInt(1884))) - - test('estimateFees', async () => - expect( - await web3.op.estimateFees({ - chainId: 10, - data: encodedBurnMethod, - type: 2, - to: optimistAddress[10], - from: '0x77194aa25a06f932c10c0f25090f3046af2c85a6', - }) - ).toBeTypeOf('bigint')) - - test('getL2Fee', async () => { - expect( - await web3.op.getL2Fee({ - chainId: '0xa', - data: encodedBurnMethod, - type: '0x2', - to: optimistAddress[10], - from: '0x77194aa25a06f932c10c0f25090f3046af2c85a6', - }) - ).toBeTypeOf('bigint') - }) - - test('estimateFees', async () => - expect( - await web3.op.estimateFees({ - chainId: 10, - data: encodedBurnMethod, - type: 2, - to: optimistAddress[10], - from: '0x77194aa25a06f932c10c0f25090f3046af2c85a6', - }) - ).toBeTypeOf('bigint')) - }) - - describe('should return a hexString', () => { - const hexStringFormat = { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX } - - test('getL1Fee', async () => { - expect( - await web3.op.getL1Fee( - { - chainId: '0xa', - data: encodedBurnMethod, - type: '0x2', - }, - hexStringFormat - ) - ).toBeTypeOf('string') - }) - - test('getL1GasUsed should return 0x75c', async () => - expect( - await web3.op.getL1GasUsed( - { - chainId: '0xa', - data: encodedBurnMethod, - type: '0x2', - }, - hexStringFormat - ) - ).toBe('0x75c')) - - test('estimateFees', async () => - expect( - await web3.op.estimateFees( - { - chainId: 10, - data: encodedBurnMethod, - type: 2, - to: optimistAddress[10], - from: '0x77194aa25a06f932c10c0f25090f3046af2c85a6', - }, - hexStringFormat - ) - ).toBeTypeOf('string')) - }) - }) - - describe('Contract transaction gas estimates - l2StandardBridgeABI.withdraw', () => { - let l2BridgeContract: Contract - let encodedWithdrawMethod: string - - beforeAll(() => { - l2BridgeContract = new Contract( - l2StandardBridgeABI, - l2StandardBridgeAddress[420] - ) - encodedWithdrawMethod = l2BridgeContract.methods - .withdraw( - // l2 token address - '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', - // amount - Web3.utils.toWei('0.00000001', 'ether'), - // l1 gas - 0, - // extra data - '0x00' - ) - .encodeABI() - }) - - describe('should return a bigint by default', () => { - test('getL1Fee', async () => { - expect( - await web3.op.getL1Fee({ - chainId: '0xa', - data: encodedWithdrawMethod, - type: '0x2', - }) - ).toBeTypeOf('bigint') - }) - - test('getL1GasUsed should return 2592n', async () => - expect( - await web3.op.getL1GasUsed({ - chainId: '0xa', - data: encodedWithdrawMethod, - type: '0x2', - }) - ).toBe(BigInt(2592))) - - test('estimateFees', async () => - expect( - await web3.op.estimateFees({ - chainId: 10, - data: encodedWithdrawMethod, - value: Web3.utils.toWei('0.00000001', 'ether'), - type: 2, - to: l2StandardBridgeAddress[420], - from: '0x6387a88a199120aD52Dd9742C7430847d3cB2CD4', - maxFeePerGas: Web3.utils.toWei('0.2', 'gwei'), - maxPriorityFeePerGas: Web3.utils.toWei('0.1', 'gwei'), - }) - ).toBeTypeOf('bigint')) - }) - }) -}) diff --git a/packages/web3js-plugin/src/plugin.ts b/packages/web3js-plugin/src/plugin.ts deleted file mode 100644 index 0776a0a70529..000000000000 --- a/packages/web3js-plugin/src/plugin.ts +++ /dev/null @@ -1,323 +0,0 @@ -import Web3, { - type BlockNumberOrTag, - BlockTags, - Contract, - type DataFormat, - DEFAULT_RETURN_FORMAT, - FMT_BYTES, - FMT_NUMBER, - type Transaction, - Web3PluginBase, -} from 'web3' -import { TransactionFactory, type TxData } from 'web3-eth-accounts' -import { estimateGas, formatTransaction } from 'web3-eth' -import { - gasPriceOracleABI, - gasPriceOracleAddress, -} from '@eth-optimism/contracts-ts' -import { RLP } from '@ethereumjs/rlp' - -export class OptimismPlugin extends Web3PluginBase { - public pluginNamespace = 'op' - - private _gasPriceOracleContract: - | Contract - | undefined - - /** - * Retrieves the current L2 base fee - * @param {DataFormat} [returnFormat=DEFAULT_RETURN_FORMAT] - The web3.js format object that specifies how to format number and bytes values - * @returns {Promise} - The L2 base fee as a BigInt by default, but {returnFormat} determines type - * @example - * const baseFeeValue: bigint = await web3.op.getBaseFee(); - * @example - * const numberFormat = { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX } - * const baseFeeValue: number = await web3.op.getBaseFee(numberFormat); - */ - public async getBaseFee< - ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT - >(returnFormat?: ReturnFormat) { - return Web3.utils.format( - { format: 'uint' }, - await this._getPriceOracleContractInstance().methods.baseFee().call(), - returnFormat ?? DEFAULT_RETURN_FORMAT - ) - } - - /** - * Retrieves the decimals used in the scalar - * @param {DataFormat} [returnFormat=DEFAULT_RETURN_FORMAT] - The web3.js format object that specifies how to format number and bytes values - * @returns {Promise} - The number of decimals as a BigInt by default, but {returnFormat} determines type - * @example - * const decimalsValue: bigint = await web3.op.getDecimals(); - * @example - * const numberFormat = { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX } - * const decimalsValue: number = await web3.op.getDecimals(numberFormat); - */ - public async getDecimals< - ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT - >(returnFormat?: ReturnFormat) { - return Web3.utils.format( - { format: 'uint' }, - await this._getPriceOracleContractInstance().methods.decimals().call(), - returnFormat ?? DEFAULT_RETURN_FORMAT - ) - } - - /** - * Retrieves the current L2 gas price (base fee) - * @param {DataFormat} [returnFormat=DEFAULT_RETURN_FORMAT] - The web3.js format object that specifies how to format number and bytes values - * @returns {Promise} - The current L2 gas price as a BigInt by default, but {returnFormat} determines type - * @example - * const gasPriceValue: bigint = await web3.op.getGasPrice(); - * @example - * const numberFormat = { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX } - * const gasPriceValue: number = await web3.op.getGasPrice(numberFormat); - */ - public async getGasPrice< - ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT - >(returnFormat?: ReturnFormat) { - return Web3.utils.format( - { format: 'uint' }, - await this._getPriceOracleContractInstance().methods.gasPrice().call(), - returnFormat ?? DEFAULT_RETURN_FORMAT - ) - } - - /** - * Computes the L1 portion of the fee based on the size of the rlp encoded input - * transaction, the current L1 base fee, and the various dynamic parameters - * @param transaction - An unsigned web3.js {Transaction} object - * @param {DataFormat} [returnFormat=DEFAULT_RETURN_FORMAT] - The web3.js format object that specifies how to format number and bytes values - * @returns {Promise} - The fee as a BigInt by default, but {returnFormat} determines type - * @example - * const l1FeeValue: bigint = await getL1Fee(transaction); - * @example - * const numberFormat = { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX } - * const l1FeeValue: number = await getL1Fee(transaction, numberFormat); - */ - public async getL1Fee< - ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT - >(transaction: Transaction, returnFormat?: ReturnFormat) { - return Web3.utils.format( - { format: 'uint' }, - await this._getPriceOracleContractInstance() - .methods.getL1Fee(this._serializeTransaction(transaction)) - .call(), - returnFormat ?? DEFAULT_RETURN_FORMAT - ) - } - - /** - * Computes the amount of L1 gas used for {transaction}. Adds the overhead which - * represents the per-transaction gas overhead of posting the {transaction} and state - * roots to L1. Adds 68 bytes of padding to account for the fact that the input does - * not have a signature. - * @param transaction - An unsigned web3.js {Transaction} object - * @param {DataFormat} [returnFormat=DEFAULT_RETURN_FORMAT] - The web3.js format object that specifies how to format number and bytes values - * @returns {Promise} - The amount gas as a BigInt by default, but {returnFormat} determines type - * @example - * const gasUsedValue: bigint = await getL1GasUsed(transaction); - * @example - * const numberFormat = { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX } - * const gasUsedValue: number = await getL1GasUsed(transaction, numberFormat); - */ - public async getL1GasUsed< - ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT - >(transaction: Transaction, returnFormat?: ReturnFormat) { - return Web3.utils.format( - { format: 'uint' }, - await this._getPriceOracleContractInstance() - .methods.getL1GasUsed(this._serializeTransaction(transaction)) - .call(), - returnFormat ?? DEFAULT_RETURN_FORMAT - ) - } - - /** - * Retrieves the latest known L1 base fee - * @param {DataFormat} [returnFormat=DEFAULT_RETURN_FORMAT] - The web3.js format object that specifies how to format number and bytes values - * @returns {Promise} - The L1 base fee as a BigInt by default, but {returnFormat} determines type - * @example - * const baseFeeValue: bigint = await web3.op.getL1BaseFee(); - * @example - * const numberFormat = { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX } - * const baseFeeValue: number = await web3.op.getL1BaseFee(numberFormat); - */ - public async getL1BaseFee< - ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT - >(returnFormat?: ReturnFormat) { - return Web3.utils.format( - { format: 'uint' }, - await this._getPriceOracleContractInstance().methods.l1BaseFee().call(), - returnFormat ?? DEFAULT_RETURN_FORMAT - ) - } - - /** - * Retrieves the current fee overhead - * @param {DataFormat} [returnFormat=DEFAULT_RETURN_FORMAT] - The web3.js format object that specifies how to format number and bytes values - * @returns {Promise} - The current overhead fee as a BigInt by default, but {returnFormat} determines type - * @example - * const overheadValue: bigint = await web3.op.getOverhead(); - * @example - * const numberFormat = { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX } - * const overheadValue: number = await web3.op.getOverhead(numberFormat); - */ - public async getOverhead< - ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT - >(returnFormat?: ReturnFormat) { - return Web3.utils.format( - { format: 'uint' }, - await this._getPriceOracleContractInstance().methods.overhead().call(), - returnFormat ?? DEFAULT_RETURN_FORMAT - ) - } - - /** - * Retrieves the current fee scalar - * @param {DataFormat} [returnFormat=DEFAULT_RETURN_FORMAT] - The web3.js format object that specifies how to format number and bytes values - * @returns {Promise} - The current scalar fee as a BigInt by default, but {returnFormat} determines type - * @example - * const scalarValue: bigint = await web3.op.getScalar(); - * @example - * const numberFormat = { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX } - * const scalarValue: number = await web3.op.getScalar(numberFormat); - */ - public async getScalar< - ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT - >(returnFormat?: ReturnFormat) { - return Web3.utils.format( - { format: 'uint' }, - await this._getPriceOracleContractInstance().methods.scalar().call(), - returnFormat ?? DEFAULT_RETURN_FORMAT - ) - } - - /** - * Retrieves the full semver version of GasPriceOracle - * @returns {Promise} - The semver version - * @example - * const version = await web3.op.getVersion(); - */ - public async getVersion() { - return this._getPriceOracleContractInstance().methods.version().call() - } - - /** - * Retrieves the amount of L2 gas estimated to execute {transaction} - * @param transaction - An unsigned web3.js {Transaction} object - * @param {{ blockNumber: BlockNumberOrTag, returnFormat: DataFormat }} [options={blockNumber: BlockTags.LATEST, returnFormat: DEFAULT_RETURN_FORMAT}] - - * An options object specifying what block to use for gas estimates and the web3.js format object that specifies how to format number and bytes values - * @returns {Promise} - The gas estimate as a BigInt by default, but {returnFormat} determines type - * @example - * const l2Fee: bigint = await getL2Fee(transaction); - * @example - * const numberFormat = { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX } - * const l2Fee: number = await getL2Fee(transaction, numberFormat); - */ - public async getL2Fee< - ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT - >( - transaction: Transaction, - options?: { - blockNumber?: BlockNumberOrTag | undefined - returnFormat?: ReturnFormat - } - ) { - const [gasCost, gasPrice] = await Promise.all([ - estimateGas( - this, - transaction, - options?.blockNumber ?? BlockTags.LATEST, - DEFAULT_RETURN_FORMAT - ), - this.getGasPrice(), - ]) - - return Web3.utils.format( - { format: 'uint' }, - gasCost * gasPrice, - options?.returnFormat ?? DEFAULT_RETURN_FORMAT - ) - } - - /** - * Computes the total (L1 + L2) fee estimate to execute {transaction} - * @param transaction - An unsigned web3.js {Transaction} object - * @param {DataFormat} [returnFormat=DEFAULT_RETURN_FORMAT] - The web3.js format object that specifies how to format number and bytes values - * @returns {Promise} - The estimated total fee as a BigInt by default, but {returnFormat} determines type - * @example - * const estimatedFees: bigint = await estimateFees(transaction); - * @example - * const numberFormat = { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX } - * const estimatedFees: number = await estimateFees(transaction, numberFormat); - */ - public async estimateFees< - ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT - >(transaction: Transaction, returnFormat?: ReturnFormat) { - const [l1Fee, l2Fee] = await Promise.all([ - this.getL1Fee(transaction), - this.getL2Fee(transaction), - ]) - - return Web3.utils.format( - { format: 'uint' }, - l1Fee + l2Fee, - returnFormat ?? DEFAULT_RETURN_FORMAT - ) - } - - /** - * Used to get the web3.js contract instance for gas price oracle contract - * @returns {Contract} - A web.js contract instance with an RPC provider inherited from root {web3} instance - */ - private _getPriceOracleContractInstance() { - if (this._gasPriceOracleContract === undefined) { - this._gasPriceOracleContract = new Contract( - gasPriceOracleABI, - gasPriceOracleAddress[420] - ) - // This plugin's Web3Context is overridden with main Web3 instance's context - // when the plugin is registered. This overwrites the Contract instance's context - this._gasPriceOracleContract.link(this) - } - - return this._gasPriceOracleContract - } - - /** - * Returns the RLP encoded hex string for {transaction} - * @param transaction - A web3.js {Transaction} object - * @returns {string} - The RLP encoded hex string - */ - private _serializeTransaction(transaction: Transaction) { - const ethereumjsTransaction = TransactionFactory.fromTxData( - formatTransaction(transaction, { - number: FMT_NUMBER.HEX, - bytes: FMT_BYTES.HEX, - }) as TxData - ) - - return Web3.utils.bytesToHex( - Web3.utils.uint8ArrayConcat( - Web3.utils.hexToBytes( - ethereumjsTransaction.type.toString(16).padStart(2, '0') - ), - // If doesn't include a signature, - // will autofill v, r, and s - // with empty uint8Array. Because L1 fee calculation - // is dependent on the number of bytes, we are removing - // the zero values bytes - RLP.encode(ethereumjsTransaction.raw().slice(0, -3)) - ) - ) - } -} - -// Module Augmentation to add op namespace to root {web3} instance -declare module 'web3' { - interface Web3Context { - op: OptimismPlugin - } -} diff --git a/packages/web3js-plugin/tsconfig.json b/packages/web3js-plugin/tsconfig.json deleted file mode 100644 index c0e9f8672231..000000000000 --- a/packages/web3js-plugin/tsconfig.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "baseUrl": "./src", - "noEmit": true, - "target": "ESNext", - "lib": ["esnext"], - "module": "esnext", - "moduleResolution": "Node", - "isolatedModules": true, - "allowUnreachableCode": false, - "skipLibCheck": false, - "allowUnusedLabels": false, - "alwaysStrict": true, - "exactOptionalPropertyTypes": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "noImplicitOverride": true, - "noImplicitThis": true, - "forceConsistentCasingInFileNames": true, - "verbatimModuleSyntax": true, - "noPropertyAccessFromIndexSignature": true, - "noUncheckedIndexedAccess": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "strict": true - }, - "include": ["./src"] -} diff --git a/packages/web3js-plugin/tsup.config.ts b/packages/web3js-plugin/tsup.config.ts deleted file mode 100644 index 869dbc7c3c51..000000000000 --- a/packages/web3js-plugin/tsup.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from 'tsup' -import packageJson from './package.json' - -// @see https://tsup.egoist.dev/ -export default defineConfig({ - name: packageJson.name, - entry: ['src/plugin.ts'], - outDir: 'dist', - format: ['esm', 'cjs'], - splitting: false, - sourcemap: true, - clean: false, - dts: true, -}) diff --git a/packages/web3js-plugin/vite.config.ts b/packages/web3js-plugin/vite.config.ts deleted file mode 100644 index 1d05447f3614..000000000000 --- a/packages/web3js-plugin/vite.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from 'vitest/config' - -// @see https://vitest.dev/config/ -export default defineConfig({ - test: { - environment: 'jsdom', - coverage: { - provider: 'istanbul', - }, - }, -}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a751776d4baa..f4db3ad30750 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,11 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false +pnpmfileChecksum: vipskp6rjsbh4jjdio2kmcz6ye + importers: .: @@ -32,10 +34,10 @@ importers: version: 20.11.17 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^6.21.0 - version: 6.21.0(eslint@8.56.0)(typescript@5.3.3) + version: 6.21.0(eslint@8.56.0)(typescript@5.4.5) chai: specifier: ^4.3.10 version: 4.3.10 @@ -53,10 +55,10 @@ importers: version: 9.1.0(eslint@8.56.0) eslint-config-standard: specifier: ^16.0.3 - version: 16.0.3(eslint-plugin-import@2.29.1)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.56.0) + version: 16.0.3(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0))(eslint-plugin-node@11.1.0(eslint@8.56.0))(eslint-plugin-promise@5.2.0(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint@8.56.0) + version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0) eslint-plugin-jsdoc: specifier: ^48.0.6 version: 48.0.6(eslint@8.56.0) @@ -68,7 +70,7 @@ importers: version: 1.2.3(eslint@8.56.0) eslint-plugin-prettier: specifier: ^4.0.0 - version: 4.2.1(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@2.8.8) + version: 4.2.1(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@2.8.8) eslint-plugin-promise: specifier: ^5.1.0 version: 5.2.0(eslint@8.56.0) @@ -88,8 +90,8 @@ importers: specifier: ^10.2.0 version: 10.2.0 nx: - specifier: 18.0.4 - version: 18.0.4 + specifier: 18.2.2 + version: 18.2.2(@swc/core@1.4.13) nx-cloud: specifier: latest version: 18.0.0 @@ -106,25 +108,26 @@ importers: specifier: ^10.0.0 version: 10.0.0(mocha@10.2.0) typescript: - specifier: ^5.3.3 - version: 5.3.3 - - endpoint-monitor: {} + specifier: ^5.4.5 + version: 5.4.5 + wait-on: + specifier: ^7.2.0 + version: 7.2.0 indexer/api-ts: devDependencies: tsup: specifier: ^8.0.1 - version: 8.0.1(@swc/core@1.4.6)(typescript@5.3.3) + version: 8.0.1(@swc/core@1.4.13)(postcss@8.4.35)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5) vitest: specifier: ^1.2.2 - version: 1.2.2(@types/node@20.11.17)(jsdom@24.0.0) + version: 1.2.2(@types/node@20.11.17)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.7))(terser@5.26.0) packages/chain-mon: dependencies: '@eth-optimism/common-ts': - specifier: workspace:* - version: link:../common-ts + specifier: ^0.8.9 + version: 0.8.9(bufferutil@4.0.8)(utf-8-validate@5.0.7) '@eth-optimism/contracts-bedrock': specifier: workspace:* version: link:../contracts-bedrock @@ -132,11 +135,11 @@ importers: specifier: 1.0.8 version: 1.0.8 '@eth-optimism/core-utils': - specifier: workspace:* - version: link:../core-utils + specifier: ^0.13.2 + version: 0.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) '@eth-optimism/sdk': - specifier: workspace:* - version: link:../sdk + specifier: ^3.3.1 + version: 3.3.1(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(utf-8-validate@5.0.7) '@types/dateformat': specifier: ^5.0.0 version: 5.0.0 @@ -151,296 +154,50 @@ importers: version: 16.4.5 ethers: specifier: ^5.7.2 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) devDependencies: '@ethersproject/abstract-provider': specifier: ^5.7.0 version: 5.7.0 '@nomiclabs/hardhat-ethers': specifier: ^2.2.3 - version: 2.2.3(ethers@5.7.2)(hardhat@2.20.1) + version: 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.6 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.5)(ethereum-waffle@4.0.10)(ethers@5.7.2)(hardhat@2.20.1) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7)))(@types/sinon-chai@3.2.5)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(typescript@5.4.5))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7)) hardhat: specifier: ^2.20.1 - version: 2.20.1(ts-node@10.9.2)(typescript@5.3.3) + version: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.11.17)(typescript@5.3.3) + version: 10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5) tsx: specifier: ^4.7.0 version: 4.7.0 - packages/common-ts: - dependencies: - '@eth-optimism/core-utils': - specifier: workspace:* - version: link:../core-utils - '@sentry/node': - specifier: ^7.99.0 - version: 7.99.0 - bcfg: - specifier: ^0.2.1 - version: 0.2.1 - body-parser: - specifier: ^1.20.2 - version: 1.20.2 - commander: - specifier: ^11.1.0 - version: 11.1.0 - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - envalid: - specifier: ^8.0.0 - version: 8.0.0 - ethers: - specifier: ^5.7.2 - version: 5.7.2 - express: - specifier: ^4.18.2 - version: 4.18.2 - express-prom-bundle: - specifier: ^7.0.0 - version: 7.0.0(prom-client@14.2.0) - lodash: - specifier: ^4.17.21 - version: 4.17.21 - morgan: - specifier: ^1.10.0 - version: 1.10.0 - pino: - specifier: ^8.19.0 - version: 8.19.0 - pino-multi-stream: - specifier: ^6.0.0 - version: 6.0.0 - pino-sentry: - specifier: ^0.14.0 - version: 0.14.0 - prom-client: - specifier: ^14.2.0 - version: 14.2.0 - devDependencies: - '@ethersproject/abstract-provider': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/abstract-signer': - specifier: ^5.7.0 - version: 5.7.0 - '@types/express': - specifier: ^4.17.21 - version: 4.17.21 - '@types/morgan': - specifier: ^1.9.9 - version: 1.9.9 - '@types/pino': - specifier: ^7.0.5 - version: 7.0.5 - '@types/pino-multi-stream': - specifier: ^5.1.6 - version: 5.1.6 - chai: - specifier: ^4.3.10 - version: 4.3.10 - supertest: - specifier: ^6.3.4 - version: 6.3.4 - packages/contracts-bedrock: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^6.21.0 - version: 6.21.0(eslint@8.56.0)(typescript@5.3.3) + version: 6.21.0(eslint@8.56.0)(typescript@5.4.5) tsx: specifier: ^4.7.0 version: 4.7.0 typescript: - specifier: ^5.3.3 - version: 5.3.3 - - packages/contracts-ts: - dependencies: - '@testing-library/react': - specifier: ^14.2.1 - version: 14.2.1(react-dom@18.2.0)(react@18.2.0) - '@types/change-case': - specifier: ^2.3.1 - version: 2.3.1 - change-case: - specifier: 4.1.2 - version: 4.1.2 - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - viem: - specifier: ^2.7.19 - version: 2.7.19(typescript@5.3.3)(zod@3.22.4) - devDependencies: - '@eth-optimism/contracts-bedrock': - specifier: workspace:* - version: link:../contracts-bedrock - '@testing-library/jest-dom': - specifier: ^6.4.2 - version: 6.4.2(vitest@1.2.2) - '@testing-library/react-hooks': - specifier: ^8.0.1 - version: 8.0.1(react-dom@18.2.0)(react@18.2.0) - '@types/glob': - specifier: ^8.1.0 - version: 8.1.0 - '@vitest/coverage-istanbul': - specifier: ^1.2.2 - version: 1.2.2(vitest@1.2.2) - '@wagmi/cli': - specifier: ^2.1.2 - version: 2.1.2(typescript@5.3.3) - '@wagmi/core': - specifier: ^2.6.3 - version: 2.6.3(react@18.2.0)(typescript@5.3.3)(viem@2.7.19) - abitype: - specifier: ^1.0.0 - version: 1.0.0(typescript@5.3.3)(zod@3.22.4) - glob: - specifier: ^10.3.10 - version: 10.3.10 - isomorphic-fetch: - specifier: ^3.0.0 - version: 3.0.0 - jest-dom: - specifier: link:@types/@testing-library/jest-dom - version: link:@types/@testing-library/jest-dom - jsdom: - specifier: ^24.0.0 - version: 24.0.0 - tsup: - specifier: ^8.0.1 - version: 8.0.1(@swc/core@1.4.6)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - vite: - specifier: ^5.1.5 - version: 5.1.5(@types/node@20.11.17) - vitest: - specifier: ^1.2.2 - version: 1.2.2(@types/node@20.11.17)(jsdom@24.0.0) - wagmi: - specifier: ^2.5.5 - version: 2.5.5(@tanstack/react-query@5.17.1)(react-dom@18.2.0)(react-native@0.73.1)(react@18.2.0)(typescript@5.3.3)(viem@2.7.19) - - packages/core-utils: - dependencies: - '@ethersproject/abi': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/abstract-provider': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/address': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/bignumber': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/bytes': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/constants': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/contracts': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/keccak256': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/properties': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/rlp': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/web': - specifier: ^5.7.1 - version: 5.7.1 - chai: - specifier: ^4.3.10 - version: 4.3.10 - ethers: - specifier: ^5.7.2 - version: 5.7.2 - node-fetch: - specifier: ^2.6.7 - version: 2.6.7 - devDependencies: - '@types/node': - specifier: ^20.11.17 - version: 20.11.17 - mocha: - specifier: ^10.2.0 - version: 10.2.0 - - packages/fee-estimation: - devDependencies: - '@eth-optimism/contracts-ts': - specifier: workspace:^ - version: link:../contracts-ts - '@testing-library/jest-dom': - specifier: ^6.4.2 - version: 6.4.2(vitest@1.2.2) - '@testing-library/react-hooks': - specifier: ^8.0.1 - version: 8.0.1(react@17.0.2) - '@vitest/coverage-istanbul': - specifier: ^1.2.2 - version: 1.2.2(vitest@1.2.2) - abitype: - specifier: ^1.0.0 - version: 1.0.0(typescript@5.3.3)(zod@3.22.4) - isomorphic-fetch: - specifier: ^3.0.0 - version: 3.0.0 - jest-dom: - specifier: link:@types/@testing-library/jest-dom - version: link:@types/@testing-library/jest-dom - jsdom: - specifier: ^24.0.0 - version: 24.0.0 - tsup: - specifier: ^8.0.1 - version: 8.0.1(@swc/core@1.4.6)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - viem: - specifier: ^2.7.19 - version: 2.7.19(typescript@5.3.3)(zod@3.22.4) - vite: - specifier: ^5.1.5 - version: 5.1.5(@types/node@20.11.17) - vitest: - specifier: ^1.2.2 - version: 1.2.2(@types/node@20.11.17)(jsdom@24.0.0) + specifier: ^5.4.5 + version: 5.4.5 packages/sdk: dependencies: '@eth-optimism/contracts': specifier: 0.6.0 - version: 0.6.0(ethers@5.7.2) - '@eth-optimism/contracts-bedrock': - specifier: workspace:* - version: link:../contracts-bedrock + version: 0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(utf-8-validate@5.0.7) '@eth-optimism/core-utils': - specifier: workspace:* - version: link:../core-utils + specifier: ^0.13.2 + version: 0.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -465,10 +222,10 @@ importers: version: 5.7.0 '@nomiclabs/hardhat-ethers': specifier: ^2.2.3 - version: 2.2.3(ethers@5.7.2)(hardhat@2.20.1) + version: 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.1 - version: 2.0.1(@nomiclabs/hardhat-ethers@2.2.3)(ethereum-waffle@4.0.10)(ethers@5.7.2)(hardhat@2.20.1) + version: 2.0.1(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7)))(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(typescript@5.4.5))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7)) '@types/chai': specifier: ^4.3.11 version: 4.3.11 @@ -489,16 +246,16 @@ importers: version: 7.1.1(chai@4.3.10) ethereum-waffle: specifier: ^4.0.10 - version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.3.3) + version: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(typescript@5.4.5) ethers: specifier: ^5.7.2 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) hardhat: specifier: ^2.20.1 - version: 2.20.1(ts-node@10.9.2)(typescript@5.3.3) + version: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7) hardhat-deploy: - specifier: ^0.11.44 - version: 0.11.44 + specifier: ^0.12.2 + version: 0.12.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) isomorphic-fetch: specifier: ^3.0.0 version: 3.0.0 @@ -510,6700 +267,8178 @@ importers: version: 15.1.0 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.11.17)(typescript@5.3.3) + version: 10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5) typedoc: specifier: ^0.25.7 - version: 0.25.7(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - viem: - specifier: ^2.7.19 - version: 2.7.19(typescript@5.3.3)(zod@3.22.4) - vitest: - specifier: ^1.2.2 - version: 1.2.2(@types/node@20.11.17)(jsdom@24.0.0) - zod: - specifier: ^3.22.4 - version: 3.22.4 - - packages/web3js-plugin: - dependencies: - '@ethereumjs/rlp': - specifier: ^5.0.2 - version: 5.0.2 - web3: - specifier: '>= 4.0.3 < 5.x' - version: 4.0.3 - web3-eth: - specifier: ^4.0.3 - version: 4.0.3 - web3-eth-accounts: - specifier: ^4.0.3 - version: 4.0.3 - devDependencies: - '@eth-optimism/contracts-ts': - specifier: workspace:^ - version: link:../contracts-ts - '@swc/core': - specifier: ^1.4.6 - version: 1.4.6 - '@vitest/coverage-istanbul': - specifier: ^1.2.2 - version: 1.2.2(vitest@1.2.2) - tsup: - specifier: ^8.0.1 - version: 8.0.1(@swc/core@1.4.6)(typescript@5.3.3) + version: 0.25.7(typescript@5.4.5) typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.5 + version: 5.4.5 viem: - specifier: ^2.7.19 - version: 2.7.19(typescript@5.3.3)(zod@3.22.4) - vite: - specifier: ^5.1.5 - version: 5.1.5(@types/node@20.11.17) + specifier: ^2.8.13 + version: 2.8.13(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.7)(zod@3.22.4) vitest: specifier: ^1.2.2 - version: 1.2.2(@types/node@20.11.17)(jsdom@24.0.0) + version: 1.2.2(@types/node@20.11.17)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.7))(terser@5.26.0) zod: specifier: ^3.22.4 version: 3.22.4 packages: - /@aashutoshrathi/word-wrap@1.2.6: + '@aashutoshrathi/word-wrap@1.2.6': resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - dev: true - /@adobe/css-tools@4.3.2: - resolution: {integrity: sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==} - dev: true - - /@adraffy/ens-normalize@1.10.0: + '@adraffy/ens-normalize@1.10.0': resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - /@ampproject/remapping@2.2.1: + '@ampproject/remapping@2.2.1': resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - dev: true - /@babel/code-frame@7.22.13: + '@babel/code-frame@7.22.13': resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 - /@babel/compat-data@7.23.5: + '@babel/compat-data@7.23.5': resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/core@7.22.10: + '@babel/core@7.22.10': resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.3 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.10) - '@babel/helpers': 7.22.10 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.3 - '@babel/types': 7.23.6 - convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/eslint-parser@7.23.10(@babel/core@7.22.10)(eslint@8.56.0): + '@babel/eslint-parser@7.23.10': resolution: {integrity: sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 - dependencies: - '@babel/core': 7.22.10 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.56.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - dev: true - /@babel/generator@7.23.3: + '@babel/generator@7.23.3': resolution: {integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - jsesc: 2.5.2 - dev: true - - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - /@babel/helper-compilation-targets@7.23.6: + '@babel/helper-compilation-targets@7.23.6': resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.2 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.22.10): - resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.10) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - dev: true - - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.22.10): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: true - - /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.22.10): - resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) - lodash.debounce: 4.0.8 - resolve: 1.22.4 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-environment-visitor@7.22.20: + '@babel/helper-environment-visitor@7.22.20': resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-function-name@7.23.0: + '@babel/helper-function-name@7.23.0': resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 - dev: true - /@babel/helper-hoist-variables@7.22.5: + '@babel/helper-hoist-variables@7.22.5': resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-member-expression-to-functions@7.23.0: - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - /@babel/helper-module-imports@7.22.15: + '@babel/helper-module-imports@7.22.15': resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.22.10): + '@babel/helper-module-transforms@7.23.3': resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.22.10): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 - dev: true - - /@babel/helper-replace-supers@7.22.20(@babel/core@7.22.10): - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - dev: true - /@babel/helper-simple-access@7.22.5: + '@babel/helper-simple-access@7.22.5': resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - /@babel/helper-split-export-declaration@7.22.6: + '@babel/helper-split-export-declaration@7.22.6': resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - dev: true - /@babel/helper-string-parser@7.23.4: + '@babel/helper-string-parser@7.23.4': resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.22.20: + '@babel/helper-validator-identifier@7.22.20': resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.23.5: + '@babel/helper-validator-option@7.23.5': resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-wrap-function@7.22.20: - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 - dev: true - /@babel/helpers@7.22.10: + '@babel/helpers@7.22.10': resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.3 - '@babel/types': 7.23.6 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/highlight@7.22.20: + '@babel/highlight@7.22.20': resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - /@babel/parser@7.23.0: + '@babel/parser@7.23.0': resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.23.6 - dev: true - /@babel/parser@7.23.6: + '@babel/parser@7.23.6': resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.23.6 - dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} + '@babel/runtime@7.23.7': + resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} + '@babel/template@7.22.15': + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.22.10) - dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.22.10): - resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} + '@babel/traverse@7.23.3': + resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.10): - resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + '@babel/types@7.23.6': + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.10) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) - dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.10): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/apply-release-plan@7.0.0': + resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} - /@babel/plugin-proposal-export-default-from@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.22.10) - dev: true + '@changesets/assemble-release-plan@6.0.0': + resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.10): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - dev: true + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.10): - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) - dev: true + '@changesets/changelog-github@0.4.8': + resolution: {integrity: sha512-jR1DHibkMAb5v/8ym77E4AMNWZKB5NPzw5a5Wtqm1JepAuIF+hrKp2u04NKM14oBZhHglkCfrla9uq8ORnK/dw==} - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.10): - resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.22.10) - dev: true + '@changesets/cli@2.27.1': + resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + hasBin: true - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.22.10): - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) - dev: true + '@changesets/config@3.0.0': + resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.10): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - dev: true + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.10): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - dev: true + '@changesets/get-dependents-graph@2.0.0': + resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.10): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/get-github-info@0.5.2': + resolution: {integrity: sha512-JppheLu7S114aEs157fOZDjFqUDpm7eHdq5E8SSR0gUBTEK0cNSHsrSR5a66xs0z3RWuo46QvA3vawp8BxDHvg==} - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.10): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/get-release-plan@4.0.0': + resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.10): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/git@3.0.0': + resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} - /@babel/plugin-syntax-export-default-from@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/logger@0.1.0': + resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} - /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/pre@2.0.0': + resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} - /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/read@0.6.0': + resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} - /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.10): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/types@5.2.1': + resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@changesets/write@0.3.0': + resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.10): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@ensdomains/ens@0.4.5': + resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} + deprecated: Please use @ensdomains/ens-contracts - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.10): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@ensdomains/resolver@0.2.4': + resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} + deprecated: Please use @ensdomains/ens-contracts - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@es-joy/jsdoccomment@0.42.0': + resolution: {integrity: sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==} + engines: {node: '>=16'} - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/aix-ppc64@0.19.10': + resolution: {integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.10): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/android-arm64@0.19.10': + resolution: {integrity: sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.10): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/android-arm64@0.19.7': + resolution: {integrity: sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.10): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/android-arm@0.19.10': + resolution: {integrity: sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/android-arm@0.19.7': + resolution: {integrity: sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.10): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/android-x64@0.19.10': + resolution: {integrity: sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/android-x64@0.19.7': + resolution: {integrity: sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] - /@babel/plugin-transform-async-generator-functions@7.23.7(@babel/core@7.22.10): - resolution: {integrity: sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.10) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) - dev: true + '@esbuild/darwin-arm64@0.19.10': + resolution: {integrity: sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] - /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.10) - dev: true + '@esbuild/darwin-arm64@0.19.7': + resolution: {integrity: sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/darwin-x64@0.19.10': + resolution: {integrity: sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/darwin-x64@0.19.7': + resolution: {integrity: sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] - /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/freebsd-arm64@0.19.10': + resolution: {integrity: sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] - /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.10) - dev: true + '@esbuild/freebsd-arm64@0.19.7': + resolution: {integrity: sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] - /@babel/plugin-transform-classes@7.23.5(@babel/core@7.22.10): - resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.10) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - dev: true + '@esbuild/freebsd-x64@0.19.10': + resolution: {integrity: sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 - dev: true + '@esbuild/freebsd-x64@0.19.7': + resolution: {integrity: sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/linux-arm64@0.19.10': + resolution: {integrity: sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] - /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/linux-arm64@0.19.7': + resolution: {integrity: sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] - /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/linux-arm@0.19.10': + resolution: {integrity: sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] - /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.10) - dev: true + '@esbuild/linux-arm@0.19.7': + resolution: {integrity: sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] - /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/linux-ia32@0.19.10': + resolution: {integrity: sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] - /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.10) - dev: true + '@esbuild/linux-ia32@0.19.7': + resolution: {integrity: sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] - /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.22.10) - dev: true + '@esbuild/linux-loong64@0.19.10': + resolution: {integrity: sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] - /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.22.10): - resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true + '@esbuild/linux-loong64@0.19.7': + resolution: {integrity: sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/linux-mips64el@0.19.10': + resolution: {integrity: sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] - /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) - dev: true + '@esbuild/linux-mips64el@0.19.7': + resolution: {integrity: sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/linux-ppc64@0.19.10': + resolution: {integrity: sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] - /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) - dev: true + '@esbuild/linux-ppc64@0.19.7': + resolution: {integrity: sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/linux-riscv64@0.19.10': + resolution: {integrity: sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] - /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/linux-riscv64@0.19.7': + resolution: {integrity: sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - dev: true + '@esbuild/linux-s390x@0.19.10': + resolution: {integrity: sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] - /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - dev: true + '@esbuild/linux-s390x@0.19.7': + resolution: {integrity: sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] - /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/linux-x64@0.19.10': + resolution: {integrity: sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/linux-x64@0.19.7': + resolution: {integrity: sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] - /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/netbsd-x64@0.19.10': + resolution: {integrity: sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] - /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - dev: true + '@esbuild/netbsd-x64@0.19.7': + resolution: {integrity: sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] - /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) - dev: true + '@esbuild/openbsd-x64@0.19.10': + resolution: {integrity: sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] - /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.22.10) - dev: true + '@esbuild/openbsd-x64@0.19.7': + resolution: {integrity: sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.10) - dev: true + '@esbuild/sunos-x64@0.19.10': + resolution: {integrity: sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] - /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) - dev: true + '@esbuild/sunos-x64@0.19.7': + resolution: {integrity: sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] - /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - dev: true + '@esbuild/win32-arm64@0.19.10': + resolution: {integrity: sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/win32-arm64@0.19.7': + resolution: {integrity: sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] - /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/win32-ia32@0.19.10': + resolution: {integrity: sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] - /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.10) - dev: true - - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/win32-ia32@0.19.7': + resolution: {integrity: sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] - /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/win32-x64@0.19.10': + resolution: {integrity: sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] - /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@esbuild/win32-x64@0.19.7': + resolution: {integrity: sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] - /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} - engines: {node: '>=6.9.0'} + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.22.10): - resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.22.10) - '@babel/types': 7.23.6 - dev: true + '@eslint-community/regexpp@4.6.2': + resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 - dev: true + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@eslint/js@8.56.0': + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@babel/plugin-transform-runtime@7.23.7(@babel/core@7.22.10): - resolution: {integrity: sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.22.10) - babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.22.10) - babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.22.10) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true + '@eth-optimism/common-ts@0.8.9': + resolution: {integrity: sha512-Ftsl8yzS/Zr7XOWau4PK6Z75LNykHINfTvAe2WFT1Wu5nsFCKt16RJNRKtk44CcXHDHS4ixMs/jDxyWzZC1OQw==} - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@eth-optimism/contracts-periphery@1.0.8': + resolution: {integrity: sha512-n8a9rmlMxl1lWSiC1zHUlr5Qk6qy85nhsmSgpU12El1WY75MOIPknSTQKj+yJhEmrTtI0PViWlKfgviY09pwUg==} - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} - engines: {node: '>=6.9.0'} + '@eth-optimism/contracts@0.6.0': + resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true + ethers: ^5 - /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@eth-optimism/core-utils@0.12.0': + resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@eth-optimism/core-utils@0.13.2': + resolution: {integrity: sha512-u7TOKm1RxH1V5zw7dHmfy91bOuEAZU68LT/9vJPkuWEjaTl+BgvPDRDTurjzclHzN0GbWdcpOqPZg4ftjkJGaw==} - /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} - engines: {node: '>=6.9.0'} + '@eth-optimism/sdk@3.3.1': + resolution: {integrity: sha512-zf8qL+KwYWUUwvdcjF1HpBxgKSt5wsKr8oa6jwqUhdPkQHUtVK5SRKtqXqYplnAgKtxDQYwlK512GU16odEl1w==} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + ethers: ^5 - /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.22.10): - resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.22.10) - dev: true - - /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} - engines: {node: '>=6.9.0'} + '@ethereum-waffle/chai@4.0.10': + resolution: {integrity: sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==} + engines: {node: '>=10.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + ethers: '*' - /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} - engines: {node: '>=6.9.0'} + '@ethereum-waffle/compiler@4.0.3': + resolution: {integrity: sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==} + engines: {node: '>=10.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: true + ethers: '*' + solc: '*' + typechain: ^8.0.0 - /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} - engines: {node: '>=6.9.0'} + '@ethereum-waffle/ens@4.0.3': + resolution: {integrity: sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==} + engines: {node: '>=10.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@ensdomains/ens': ^0.4.4 + '@ensdomains/resolver': ^0.2.4 + ethers: '*' - /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} - engines: {node: '>=6.9.0'} + '@ethereum-waffle/mock-contract@4.0.4': + resolution: {integrity: sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==} + engines: {node: '>=10.0'} peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - dev: true + ethers: '*' - /@babel/preset-env@7.23.7(@babel/core@7.22.10): - resolution: {integrity: sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==} - engines: {node: '>=6.9.0'} + '@ethereum-waffle/provider@4.0.5': + resolution: {integrity: sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==} + engines: {node: '>=10.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.22.10) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.10) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.10) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.10) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.10) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-async-generator-functions': 7.23.7(@babel/core@7.22.10) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.22.10) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.22.10) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.22.10) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.10) - babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.22.10) - babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.22.10) - babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.22.10) - core-js-compat: 3.35.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true + ethers: '*' - /@babel/preset-flow@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.22.10) - dev: true + '@ethereumjs/block@3.6.2': + resolution: {integrity: sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw==} - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.10): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.6 - esutils: 2.0.3 - dev: true + '@ethereumjs/blockchain@5.5.2': + resolution: {integrity: sha512-Jz26iJmmsQtngerW6r5BDFaew/f2mObLrRZo3rskLOx1lmtMZ8+TX/vJexmivrnWgmAsTdNWhlKUYY4thPhPig==} - /@babel/preset-typescript@7.23.3(@babel/core@7.22.10): - resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.22.10) - dev: true + '@ethereumjs/common@2.6.0': + resolution: {integrity: sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==} - /@babel/register@7.23.7(@babel/core@7.22.10): - resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.6 - source-map-support: 0.5.21 - dev: true + '@ethereumjs/common@2.6.4': + resolution: {integrity: sha512-RDJh/R/EAr+B7ZRg5LfJ0BIpf/1LydFgYdvZEuTraojCbVypO2sQ+QnpP5u2wJf9DASyooKqu8O4FJEWUV6NXw==} - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: true + '@ethereumjs/ethash@1.1.0': + resolution: {integrity: sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==} - /@babel/runtime@7.22.6: - resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - dev: true + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true - /@babel/runtime@7.23.7: - resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 + '@ethereumjs/tx@3.4.0': + resolution: {integrity: sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==} - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - dev: true + '@ethereumjs/tx@3.5.1': + resolution: {integrity: sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA==} - /@babel/traverse@7.23.3: - resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.3 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} - /@babel/types@7.23.6: - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true + '@ethereumjs/vm@5.6.0': + resolution: {integrity: sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==} - /@changesets/apply-release-plan@7.0.0: - resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} - dependencies: - '@babel/runtime': 7.23.7 - '@changesets/config': 3.0.0 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.6.0 - dev: false + '@ethersproject/abi@5.7.0': + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} - /@changesets/assemble-release-plan@6.0.0: - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} - dependencies: - '@babel/runtime': 7.23.7 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.6.0 - dev: false + '@ethersproject/abstract-provider@5.7.0': + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} - /@changesets/changelog-git@0.2.0: - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - dependencies: - '@changesets/types': 6.0.0 - dev: false + '@ethersproject/abstract-signer@5.7.0': + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} - /@changesets/changelog-github@0.4.8: - resolution: {integrity: sha512-jR1DHibkMAb5v/8ym77E4AMNWZKB5NPzw5a5Wtqm1JepAuIF+hrKp2u04NKM14oBZhHglkCfrla9uq8ORnK/dw==} - dependencies: - '@changesets/get-github-info': 0.5.2 - '@changesets/types': 5.2.1 - dotenv: 8.6.0 - transitivePeerDependencies: - - encoding - dev: true + '@ethersproject/address@5.7.0': + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - /@changesets/cli@2.27.1: - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} - hasBin: true - dependencies: - '@babel/runtime': 7.23.7 - '@changesets/apply-release-plan': 7.0.0 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.0 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/get-release-plan': 4.0.0 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.0 - '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.7 - ansi-colors: 4.1.3 - chalk: 2.4.2 - ci-info: 3.8.0 - enquirer: 2.3.6 - external-editor: 3.1.0 - fs-extra: 7.0.1 - human-id: 1.0.2 - meow: 6.1.1 - outdent: 0.5.0 - p-limit: 2.3.0 - preferred-pm: 3.0.3 - resolve-from: 5.0.0 - semver: 7.6.0 - spawndamnit: 2.0.0 - term-size: 2.2.1 - tty-table: 4.1.6 - dev: false + '@ethersproject/base64@5.7.0': + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} - /@changesets/config@3.0.0: - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/logger': 0.1.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.5 - dev: false + '@ethersproject/basex@5.7.0': + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} - /@changesets/errors@0.2.0: - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - dependencies: - extendable-error: 0.1.7 - dev: false + '@ethersproject/bignumber@5.7.0': + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - /@changesets/get-dependents-graph@2.0.0: - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} - dependencies: - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - chalk: 2.4.2 - fs-extra: 7.0.1 - semver: 7.6.0 - dev: false + '@ethersproject/bytes@5.7.0': + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - /@changesets/get-github-info@0.5.2: - resolution: {integrity: sha512-JppheLu7S114aEs157fOZDjFqUDpm7eHdq5E8SSR0gUBTEK0cNSHsrSR5a66xs0z3RWuo46QvA3vawp8BxDHvg==} - dependencies: - dataloader: 1.4.0 - node-fetch: 2.6.12 - transitivePeerDependencies: - - encoding - dev: true + '@ethersproject/constants@5.7.0': + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} - /@changesets/get-release-plan@4.0.0: - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} - dependencies: - '@babel/runtime': 7.23.7 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/config': 3.0.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - dev: false + '@ethersproject/contracts@5.7.0': + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} - /@changesets/get-version-range-type@0.4.0: - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - dev: false + '@ethersproject/hash@5.7.0': + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - /@changesets/git@3.0.0: - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} - dependencies: - '@babel/runtime': 7.23.7 - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.5 - spawndamnit: 2.0.0 - dev: false + '@ethersproject/hdnode@5.7.0': + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} - /@changesets/logger@0.1.0: - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} - dependencies: - chalk: 2.4.2 - dev: false + '@ethersproject/json-wallets@5.7.0': + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} - /@changesets/parse@0.4.0: - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} - dependencies: - '@changesets/types': 6.0.0 - js-yaml: 3.14.1 - dev: false + '@ethersproject/keccak256@5.7.0': + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - /@changesets/pre@2.0.0: - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} - dependencies: - '@babel/runtime': 7.23.7 - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - dev: false + '@ethersproject/logger@5.7.0': + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - /@changesets/read@0.6.0: - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} - dependencies: - '@babel/runtime': 7.23.7 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 - chalk: 2.4.2 - fs-extra: 7.0.1 - p-filter: 2.1.0 - dev: false + '@ethersproject/networks@5.7.1': + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} - /@changesets/types@4.1.0: - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - dev: false + '@ethersproject/pbkdf2@5.7.0': + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} - /@changesets/types@5.2.1: - resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} - dev: true + '@ethersproject/properties@5.7.0': + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} - /@changesets/types@6.0.0: - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - dev: false + '@ethersproject/providers@5.7.2': + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} - /@changesets/write@0.3.0: - resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} - dependencies: - '@babel/runtime': 7.23.7 - '@changesets/types': 6.0.0 - fs-extra: 7.0.1 - human-id: 1.0.2 - prettier: 2.8.8 - dev: false + '@ethersproject/random@5.7.0': + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} - /@coinbase/wallet-sdk@3.9.1: - resolution: {integrity: sha512-cGUE8wm1/cMI8irRMVOqbFWYcnNugqCtuy2lnnHfgloBg+GRLs9RsrkOUDMdv/StfUeeKhCDyYudsXXvcL1xIA==} - dependencies: - bn.js: 5.2.1 - buffer: 6.0.3 - clsx: 1.2.1 - eth-block-tracker: 7.1.0 - eth-json-rpc-filters: 6.0.1 - eventemitter3: 5.0.1 - keccak: 3.0.3 - preact: 10.16.0 - sha.js: 2.4.11 - transitivePeerDependencies: - - supports-color - dev: true + '@ethersproject/rlp@5.7.0': + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - dev: true + '@ethersproject/sha2@5.7.0': + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} - /@emotion/babel-plugin@11.11.0: - resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} - dependencies: - '@babel/helper-module-imports': 7.22.15 - '@babel/runtime': 7.23.7 - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/serialize': 1.1.3 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - dev: true + '@ethersproject/signing-key@5.7.0': + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} - /@emotion/cache@11.11.0: - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} - dependencies: - '@emotion/memoize': 0.8.1 - '@emotion/sheet': 1.2.2 - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - stylis: 4.2.0 - dev: true + '@ethersproject/solidity@5.7.0': + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} - /@emotion/hash@0.9.1: - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - dev: true + '@ethersproject/strings@5.7.0': + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} - /@emotion/is-prop-valid@1.2.1: - resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} - dependencies: - '@emotion/memoize': 0.8.1 - dev: true + '@ethersproject/transactions@5.7.0': + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - /@emotion/memoize@0.8.1: - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: true + '@ethersproject/units@5.7.0': + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} - /@emotion/react@11.11.3(react@18.2.0): - resolution: {integrity: sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@emotion/babel-plugin': 11.11.0 - '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - dev: true - - /@emotion/serialize@1.1.3: - resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} - dependencies: - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/unitless': 0.8.1 - '@emotion/utils': 1.2.1 - csstype: 3.1.2 - dev: true - - /@emotion/sheet@1.2.2: - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - dev: true - - /@emotion/styled@11.11.0(@emotion/react@11.11.3)(react@18.2.0): - resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.7 - '@emotion/babel-plugin': 11.11.0 - '@emotion/is-prop-valid': 1.2.1 - '@emotion/react': 11.11.3(react@18.2.0) - '@emotion/serialize': 1.1.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) - '@emotion/utils': 1.2.1 - react: 18.2.0 - dev: true - - /@emotion/unitless@0.8.1: - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - dev: true - - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): - resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} - peerDependencies: - react: '>=16.8.0' - dependencies: - react: 18.2.0 - dev: true + '@ethersproject/wallet@5.7.0': + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} - /@emotion/utils@1.2.1: - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} - dev: true + '@ethersproject/web@5.7.1': + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} - /@emotion/weak-memoize@0.3.1: - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - dev: true + '@ethersproject/wordlists@5.7.0': + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - /@ensdomains/ens@0.4.5: - resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} - deprecated: Please use @ensdomains/ens-contracts - dependencies: - bluebird: 3.7.2 - eth-ens-namehash: 2.0.8 - solc: 0.4.26 - testrpc: 0.0.1 - web3-utils: 1.10.1 - dev: true + '@ganache/ethereum-address@0.1.4': + resolution: {integrity: sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==} - /@ensdomains/resolver@0.2.4: - resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} - deprecated: Please use @ensdomains/ens-contracts - dev: true + '@ganache/ethereum-options@0.1.4': + resolution: {integrity: sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==} - /@es-joy/jsdoccomment@0.42.0: - resolution: {integrity: sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==} - engines: {node: '>=16'} - dependencies: - comment-parser: 1.4.1 - esquery: 1.5.0 - jsdoc-type-pratt-parser: 4.0.0 - dev: true + '@ganache/ethereum-utils@0.1.4': + resolution: {integrity: sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==} - /@esbuild/aix-ppc64@0.19.10: - resolution: {integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true + '@ganache/options@0.1.4': + resolution: {integrity: sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==} - /@esbuild/android-arm64@0.19.10: - resolution: {integrity: sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ganache/rlp@0.1.4': + resolution: {integrity: sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==} - /@esbuild/android-arm64@0.19.7: - resolution: {integrity: sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ganache/utils@0.1.4': + resolution: {integrity: sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==} - /@esbuild/android-arm@0.19.10: - resolution: {integrity: sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - /@esbuild/android-arm@0.19.7: - resolution: {integrity: sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - /@esbuild/android-x64@0.19.10: - resolution: {integrity: sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@humanwhocodes/config-array@0.11.13': + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} - /@esbuild/android-x64@0.19.7: - resolution: {integrity: sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} - /@esbuild/darwin-arm64@0.19.10: - resolution: {integrity: sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@humanwhocodes/object-schema@2.0.1': + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - /@esbuild/darwin-arm64@0.19.7: - resolution: {integrity: sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw==} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.10: - resolution: {integrity: sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} - /@esbuild/darwin-x64@0.19.7: - resolution: {integrity: sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} - /@esbuild/freebsd-arm64@0.19.10: - resolution: {integrity: sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - /@esbuild/freebsd-arm64@0.19.7: - resolution: {integrity: sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} - /@esbuild/freebsd-x64@0.19.10: - resolution: {integrity: sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} - /@esbuild/freebsd-x64@0.19.7: - resolution: {integrity: sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} - /@esbuild/linux-arm64@0.19.10: - resolution: {integrity: sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@jridgewell/source-map@0.3.5': + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - /@esbuild/linux-arm64@0.19.7: - resolution: {integrity: sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@esbuild/linux-arm@0.19.10: - resolution: {integrity: sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@jridgewell/trace-mapping@0.3.19': + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} - /@esbuild/linux-arm@0.19.7: - resolution: {integrity: sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - /@esbuild/linux-ia32@0.19.10: - resolution: {integrity: sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - /@esbuild/linux-ia32@0.19.7: - resolution: {integrity: sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - /@esbuild/linux-loong64@0.19.10: - resolution: {integrity: sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@metamask/eth-sig-util@4.0.0': + resolution: {integrity: sha512-LczOjjxY4A7XYloxzyxJIHONELmUxVZncpOLoClpEcTiebiVdM46KRPYXGuULro9oNNR2xdVx3yoKiQjdfWmoA==} + engines: {node: '>=12.0.0'} - /@esbuild/linux-loong64@0.19.7: - resolution: {integrity: sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - /@esbuild/linux-mips64el@0.19.10: - resolution: {integrity: sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/curves@1.1.0': + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} - /@esbuild/linux-mips64el@0.19.7: - resolution: {integrity: sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - /@esbuild/linux-ppc64@0.19.10: - resolution: {integrity: sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/hashes@1.2.0': + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - /@esbuild/linux-ppc64@0.19.7: - resolution: {integrity: sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/hashes@1.3.1': + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} - /@esbuild/linux-riscv64@0.19.10: - resolution: {integrity: sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} - /@esbuild/linux-riscv64@0.19.7: - resolution: {integrity: sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} - /@esbuild/linux-s390x@0.19.10: - resolution: {integrity: sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} - /@esbuild/linux-s390x@0.19.7: - resolution: {integrity: sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} - /@esbuild/linux-x64@0.19.10: - resolution: {integrity: sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} - /@esbuild/linux-x64@0.19.7: - resolution: {integrity: sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@nomicfoundation/ethereumjs-block@5.0.4': + resolution: {integrity: sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==} + engines: {node: '>=18'} - /@esbuild/netbsd-x64@0.19.10: - resolution: {integrity: sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true + '@nomicfoundation/ethereumjs-blockchain@7.0.4': + resolution: {integrity: sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg==} + engines: {node: '>=18'} - /@esbuild/netbsd-x64@0.19.7: - resolution: {integrity: sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true + '@nomicfoundation/ethereumjs-common@4.0.4': + resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} - /@esbuild/openbsd-x64@0.19.10: - resolution: {integrity: sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true + '@nomicfoundation/ethereumjs-ethash@3.0.4': + resolution: {integrity: sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ==} + engines: {node: '>=18'} - /@esbuild/openbsd-x64@0.19.7: - resolution: {integrity: sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true + '@nomicfoundation/ethereumjs-evm@2.0.4': + resolution: {integrity: sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w==} + engines: {node: '>=18'} - /@esbuild/sunos-x64@0.19.10: - resolution: {integrity: sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==} - engines: {node: '>=12'} + '@nomicfoundation/ethereumjs-rlp@5.0.4': + resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} + engines: {node: '>=18'} + hasBin: true + + '@nomicfoundation/ethereumjs-statemanager@2.0.4': + resolution: {integrity: sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q==} + peerDependencies: + '@nomicfoundation/ethereumjs-verkle': 0.0.2 + peerDependenciesMeta: + '@nomicfoundation/ethereumjs-verkle': + optional: true + + '@nomicfoundation/ethereumjs-trie@6.0.4': + resolution: {integrity: sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==} + engines: {node: '>=18'} + + '@nomicfoundation/ethereumjs-tx@5.0.4': + resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/ethereumjs-util@9.0.4': + resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/ethereumjs-verkle@0.0.2': + resolution: {integrity: sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ==} + engines: {node: '>=18'} + + '@nomicfoundation/ethereumjs-vm@7.0.4': + resolution: {integrity: sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ==} + engines: {node: '>=18'} + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': + resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': + resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} + engines: {node: '>= 10'} cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true + os: [darwin] - /@esbuild/sunos-x64@0.19.7: - resolution: {integrity: sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw==} - engines: {node: '>=12'} + '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': + resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} + engines: {node: '>= 10'} cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true + os: [freebsd] - /@esbuild/win32-arm64@0.19.10: - resolution: {integrity: sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==} - engines: {node: '>=12'} + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': + resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} + engines: {node: '>= 10'} cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + os: [linux] - /@esbuild/win32-arm64@0.19.7: - resolution: {integrity: sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw==} - engines: {node: '>=12'} + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': + resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} + engines: {node: '>= 10'} cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + os: [linux] - /@esbuild/win32-ia32@0.19.10: - resolution: {integrity: sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==} - engines: {node: '>=12'} - cpu: [ia32] + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': + resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': + resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': + resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} + engines: {node: '>= 10'} + cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.7: - resolution: {integrity: sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A==} - engines: {node: '>=12'} + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': + resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} + engines: {node: '>= 10'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.10: - resolution: {integrity: sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==} - engines: {node: '>=12'} + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': + resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.7: - resolution: {integrity: sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@nomicfoundation/solidity-analyzer@0.1.1': + resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} + engines: {node: '>= 12'} - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@nomiclabs/hardhat-ethers@2.2.3': + resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - dev: true + ethers: ^5.0.0 + hardhat: ^2.0.0 - /@eslint-community/regexpp@4.6.2: - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@nomiclabs/hardhat-waffle@2.0.1': + resolution: {integrity: sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ==} + peerDependencies: + '@nomiclabs/hardhat-ethers': ^2.0.0 + ethereum-waffle: ^3.2.0 + ethers: ^5.0.0 + hardhat: ^2.0.0 - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true + '@nomiclabs/hardhat-waffle@2.0.6': + resolution: {integrity: sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg==} + peerDependencies: + '@nomiclabs/hardhat-ethers': ^2.0.0 + '@types/sinon-chai': ^3.2.3 + ethereum-waffle: '*' + ethers: ^5.0.0 + hardhat: ^2.0.0 + + '@nrwl/nx-cloud@18.0.0': + resolution: {integrity: sha512-rjjcJgzDmKwFD1QVIMs5O3X4SoMQIk0bzh3pL90ZP/B5YJUlTySv7+R0JoGQ6ROGwVQHjPFMVKKLB09zl5perA==} + + '@nrwl/tao@18.2.2': + resolution: {integrity: sha512-tXjAbbw8Ir3cY/PQVHiC7q10jsU43r5kkEVwa2vzd1rfPtPFvj9WtgwISd+GstuppYtsbNi+UgTNmHX8dRKPYQ==} + hasBin: true + + '@nx/nx-darwin-arm64@18.2.2': + resolution: {integrity: sha512-mZ5X2rmtzmEGnt5ddpKlyQDGRd1wh0HSJtWvjruj6fYLNNpoosnXefI0PQLZUw13hf8OpJNo8J6xKfjIViSa8g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@nx/nx-darwin-x64@18.2.2': + resolution: {integrity: sha512-FeYvbr0OOIdn9xvuNZlLHQKwdAPN9KcWnmIysJTQZeanvUf6tifkhBUU1cXDduAkdut5iibnnA91JhcEj4x9yg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@nx/nx-freebsd-x64@18.2.2': + resolution: {integrity: sha512-Owt/5jT8IG5I6eRbs8en+bHvi2St+k1Z1S1CLArlnfTzkTgVGz/R39HD4OouEVnr2dQPkfc7ms6+XkhlYx5NLg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@nx/nx-linux-arm-gnueabihf@18.2.2': + resolution: {integrity: sha512-6D6ZC4EdBjAE0QgLYXuk7AC5r/LM+XUUOa5tFAV6fsAKn+GjVFsmP8dl/HEHfg+vx619+o+IrVrOA+h6ztmNJA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@nx/nx-linux-arm64-gnu@18.2.2': + resolution: {integrity: sha512-RHZ9nPZ4ivv9p+djO9WqoilMhjlR8/rj7P4sog5OpeRE5EWc65Rb7SFwjek1IovS2gbbK+3P2y8Q4G7lyvbe5w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@nx/nx-linux-arm64-musl@18.2.2': + resolution: {integrity: sha512-WginA4UHdrRhK40pDV8sv3Izho5aOzWf3iC8WVXi8r850mVbOE88JaWnO7TJ7zNWgiM32/OZeVyaYQ/Wv8pYjw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@nx/nx-linux-x64-gnu@18.2.2': + resolution: {integrity: sha512-Fekq6TWZAN7T1Yi+IVAPQ3wUmsmtvu3WyvXiVBjVKh8C1H/PKPcNi+4kaG9Ys1BhBZhqiEfTgc44RF9xLM9IAQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nx/nx-linux-x64-musl@18.2.2': + resolution: {integrity: sha512-3Uk7x2/giczRCva7RsWd/KjgeYH9kOQFiqzE4heMrjBEuJQfACDlasjIrTRv9bwLrZ6otkBVeX/zmE9kBo3tOA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nx/nx-win32-arm64-msvc@18.2.2': + resolution: {integrity: sha512-y0d79+FYtSEI96KGAjIUrD7/xybAp7aSjqqesM0WP2+DIJBYkdjK6maTKxkB5gb3FBJyhfNYr4A1NqDnvbPtvA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@nx/nx-win32-x64-msvc@18.2.2': + resolution: {integrity: sha512-17b7hh8VMGWHq0yQDxevLUM0K4ZoNUah3oYVbYe46tp1w7D4u44vDkOOE2SpV2E/alllcDES1etcVsYQSMTGig==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@resolver-engine/core@0.3.3': + resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==} + + '@resolver-engine/fs@0.3.3': + resolution: {integrity: sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==} + + '@resolver-engine/imports-fs@0.3.3': + resolution: {integrity: sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==} + + '@resolver-engine/imports@0.3.3': + resolution: {integrity: sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==} + + '@rollup/rollup-android-arm-eabi@4.5.1': + resolution: {integrity: sha512-YaN43wTyEBaMqLDYeze+gQ4ZrW5RbTEGtT5o1GVDkhpdNcsLTnLRcLccvwy3E9wiDKWg9RIhuoy3JQKDRBfaZA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.5.1': + resolution: {integrity: sha512-n1bX+LCGlQVuPlCofO0zOKe1b2XkFozAVRoczT+yxWZPGnkEAKTTYVOGZz8N4sKuBnKMxDbfhUsB1uwYdup/sw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.5.1': + resolution: {integrity: sha512-QqJBumdvfBqBBmyGHlKxje+iowZwrHna7pokj/Go3dV1PJekSKfmjKrjKQ/e6ESTGhkfPNLq3VXdYLAc+UtAQw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.5.1': + resolution: {integrity: sha512-RrkDNkR/P5AEQSPkxQPmd2ri8WTjSl0RYmuFOiEABkEY/FSg0a4riihWQGKDJ4LnV9gigWZlTMx2DtFGzUrYQw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.5.1': + resolution: {integrity: sha512-ZFPxvUZmE+fkB/8D9y/SWl/XaDzNSaxd1TJUSE27XAKlRpQ2VNce/86bGd9mEUgL3qrvjJ9XTGwoX0BrJkYK/A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.5.1': + resolution: {integrity: sha512-FEuAjzVIld5WVhu+M2OewLmjmbXWd3q7Zcx+Rwy4QObQCqfblriDMMS7p7+pwgjZoo9BLkP3wa9uglQXzsB9ww==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.5.1': + resolution: {integrity: sha512-f5Gs8WQixqGRtI0Iq/cMqvFYmgFzMinuJO24KRfnv7Ohi/HQclwrBCYkzQu1XfLEEt3DZyvveq9HWo4bLJf1Lw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.5.1': + resolution: {integrity: sha512-CWPkPGrFfN2vj3mw+S7A/4ZaU3rTV7AkXUr08W9lNP+UzOvKLVf34tWCqrKrfwQ0NTk5GFqUr2XGpeR2p6R4gw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.5.1': + resolution: {integrity: sha512-ZRETMFA0uVukUC9u31Ed1nx++29073goCxZtmZARwk5aF/ltuENaeTtRVsSQzFlzdd4J6L3qUm+EW8cbGt0CKQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.5.1': + resolution: {integrity: sha512-ihqfNJNb2XtoZMSCPeoo0cYMgU04ksyFIoOw5S0JUVbOhafLot+KD82vpKXOurE2+9o/awrqIxku9MRR9hozHQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.5.1': + resolution: {integrity: sha512-zK9MRpC8946lQ9ypFn4gLpdwr5a01aQ/odiIJeL9EbgZDMgbZjjT/XzTqJvDfTmnE1kHdbG20sAeNlpc91/wbg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.5.1': + resolution: {integrity: sha512-5I3Nz4Sb9TYOtkRwlH0ow+BhMH2vnh38tZ4J4mggE48M/YyJyp/0sPSxhw1UeS1+oBgQ8q7maFtSeKpeRJu41Q==} + cpu: [x64] + os: [win32] + + '@scure/base@1.1.3': + resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + + '@scure/bip32@1.1.5': + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + + '@scure/bip32@1.3.1': + resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + + '@scure/bip32@1.3.2': + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + + '@scure/bip39@1.1.1': + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + + '@scure/bip39@1.2.1': + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + + '@sentry-internal/tracing@7.99.0': + resolution: {integrity: sha512-z3JQhHjoM1KdM20qrHwRClKJrNLr2CcKtCluq7xevLtXHJWNAQQbafnWD+Aoj85EWXBzKt9yJMv2ltcXJ+at+w==} + engines: {node: '>=8'} + + '@sentry/core@5.30.0': + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + + '@sentry/core@7.99.0': + resolution: {integrity: sha512-vOAtzcAXEUtS/oW7wi3wMkZ3hsb5Ch96gKyrrj/mXdOp2zrcwdNV6N9/pawq2E9P/7Pw8AXw4CeDZztZrjQLuA==} + engines: {node: '>=8'} + + '@sentry/hub@5.30.0': + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + + '@sentry/minimal@5.30.0': + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + + '@sentry/node@5.30.0': + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + + '@sentry/node@7.99.0': + resolution: {integrity: sha512-34wYtLddnPcQ8qvKq62AfxowaMFw+GMUZGv7fIs9FxeBqqqn6Ckl0gFCTADudIIBQ3rSbmN7sHJIXdyiQv+pcw==} + engines: {node: '>=8'} + + '@sentry/tracing@5.30.0': + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + + '@sentry/types@5.30.0': + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + + '@sentry/types@7.99.0': + resolution: {integrity: sha512-94qwOw4w40sAs5mCmzcGyj8ZUu/KhnWnuMZARRq96k+SjRW/tHFAOlIdnFSrt3BLPvSOK7R3bVAskZQ0N4FTmA==} + engines: {node: '>=8'} + + '@sentry/utils@5.30.0': + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + + '@sentry/utils@7.99.0': + resolution: {integrity: sha512-cYZy5WNTkWs5GgggGnjfGqC44CWir0pAv4GVVSx0fsup4D4pMKBJPrtub15f9uC+QkUf3vVkqwpBqeFxtmJQTQ==} + engines: {node: '>=8'} + + '@sideway/address@4.1.4': + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@1.8.3': + resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} + + '@sinonjs/fake-timers@7.1.2': + resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} + + '@swc/core-darwin-arm64@1.4.13': + resolution: {integrity: sha512-36P72FLpm5iq85IvoEjBvi22DiqkkEIanJ1M0E8bkxcFHUbjBrYfPY9T6cpPyK5oQqkaTBvNAc3j1BlVD6IH6w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.4.13': + resolution: {integrity: sha512-ye7OgKpDdyA8AMIVVdmD1ICDaFXgoEXORnVO8bBHyul0WN71yUBZMX+YxEx2lpWtiftA2vY/1MAuOR80vHkBCw==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.4.13': + resolution: {integrity: sha512-+x593Jlmu4c3lJtZUKRejWpV2MAij1Js5nmQLLdjo6ChR2D4B2rzj3iMiKn5gITew7fraF9t3fvXALdWh7HmUg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.4.13': + resolution: {integrity: sha512-0x8OVw4dfyNerrs/9eZX9wNnmvwbwXSMCi+LbE6Xt1pXOIwvoLtFIXcV3NsrlkFboO3sr5UAQIwDxKqbIZA9pQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.4.13': + resolution: {integrity: sha512-Z9c4JiequtZvngPcxbCuAOkmWBxi2vInZbjjhD5I+Q9oiJdXUz1t2USGwsGPS41Xvk1BOA3ecK2Sn1ilY3titg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.4.13': + resolution: {integrity: sha512-ChatHtk+vX0Ke5QG+jO+rIapw/KwZsi9MedCBHFXHH6iWF4z8d51cJeN68ykcn+vAXzjNeFNdlNy5Vbkd1zAqg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.4.13': + resolution: {integrity: sha512-0Pz39YR530mXpsztwQkmEKdkkZy4fY4Smdh4pkm6Ly8Nndyo0te/l4bcAGqN24Jp7aVwF/QSy14SAtw4HRjU9g==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.4.13': + resolution: {integrity: sha512-LVZfhlD+jHcAbz5NN+gAJ1BEasB0WpcvUzcsJt0nQSRsojgzPzFjJ+fzEBnvT7SMtqKkrnVJ0OmDYeh88bDRpw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.4.13': + resolution: {integrity: sha512-78hxHWUvUZtWsnhcf8DKwhBcNFJw+j4y4fN2B9ioXmBWX2tIyw+BqUHOrismOtjPihaZmwe/Ok2e4qmkawE2fw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.4.13': + resolution: {integrity: sha512-WSfy1u2Xde6jU7UpHIInCUMW98Zw9iZglddKUAvmr1obkZji5U6EX0Oca3asEJdZPFb+2lMLjt0Mh5a1YisROg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.4.13': + resolution: {integrity: sha512-rOtusBE+2gaeRkAJn5E4zp5yzZekZOypzSOz5ZG6P1hFbd+Cc26fWEdK6sUSnrkkvTd0Oj33KXLB/4UkbK/UHA==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.5': + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + + '@textlint/ast-node-types@12.2.1': + resolution: {integrity: sha512-NXYza6aG1+LdZ4g83gjRhDht+gdrTjJYkdcQhpvzNCtTar/sVpaykkauRcAKLhkIWrQpfb311pfMlU6qNDW76Q==} + + '@textlint/markdown-to-ast@12.2.1': + resolution: {integrity: sha512-p+LlVcrgHnSNEWWflYU412uu+v4Cejs6hmI4SgZCheNg4u7Ik78aKgpe4jT5BhjLSBZ/KP6IrJxtCUOoJIUWmQ==} + + '@trufflesuite/bigint-buffer@1.1.9': + resolution: {integrity: sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==} + engines: {node: '>= 10.0.0'} + + '@tsconfig/node10@1.0.9': + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@typechain/ethers-v5@10.2.1': + resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} + peerDependencies: + '@ethersproject/abi': ^5.0.0 + '@ethersproject/providers': ^5.0.0 + ethers: ^5.1.3 + typechain: ^8.1.1 + typescript: '>=4.3.0' + + '@types/abstract-leveldown@5.0.2': + resolution: {integrity: sha512-+jA1XXF3jsz+Z7FcuiNqgK53hTa/luglT2TyTpKPqoYbxVY+mCPF22Rm+q3KPBrMHJwNXFrTViHszBOfU4vftQ==} + + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + + '@types/bn.js@5.1.0': + resolution: {integrity: sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==} + + '@types/body-parser@1.19.1': + resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==} + + '@types/chai-as-promised@7.1.8': + resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} + + '@types/chai@4.3.11': + resolution: {integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==} + + '@types/connect@3.4.35': + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + + '@types/dateformat@5.0.0': + resolution: {integrity: sha512-SZg4JdHIWHQGEokbYGZSDvo5wA4TLYPXaqhigs/wH+REDOejcJzgH+qyY+HtEUtWOZxEUkbhbdYPqQDiEgrXeA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.17.35': + resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/json-schema@7.0.12': + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/level-errors@3.0.0': + resolution: {integrity: sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==} + + '@types/levelup@4.3.3': + resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} + + '@types/lru-cache@5.1.1': + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + + '@types/mdast@3.0.10': + resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + + '@types/mime@1.3.2': + resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + '@types/minimist@1.2.2': + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + + '@types/mkdirp@0.5.2': + resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} + + '@types/mocha@10.0.6': + resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} + + '@types/ms@0.7.31': + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + + '@types/node-fetch@2.6.4': + resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} + + '@types/node@11.11.6': + resolution: {integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@20.11.17': + resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==} + + '@types/normalize-package-data@2.4.1': + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + + '@types/parse-json@4.0.0': + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + + '@types/pbkdf2@3.1.0': + resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} + + '@types/prettier@2.3.2': + resolution: {integrity: sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==} + + '@types/qs@6.9.7': + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + + '@types/range-parser@1.2.4': + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + + '@types/readable-stream@2.3.15': + resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} + + '@types/secp256k1@4.0.6': + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + + '@types/semver@7.5.7': + resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} + + '@types/send@0.17.1': + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + + '@types/serve-static@1.13.10': + resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} + + '@types/sinon-chai@3.2.5': + resolution: {integrity: sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ==} + + '@types/sinon@10.0.2': + resolution: {integrity: sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==} + + '@types/underscore@1.11.3': + resolution: {integrity: sha512-Fl1TX1dapfXyDqFg2ic9M+vlXRktcPJrc4PR7sRc7sdVrjavg/JHlbUXBt8qWWqhJrmSqg3RNAkAPRiOYw6Ahw==} + + '@types/unist@2.0.6': + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + + '@types/web3@1.0.19': + resolution: {integrity: sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitest/expect@1.2.2': + resolution: {integrity: sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==} + + '@vitest/runner@1.2.2': + resolution: {integrity: sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==} + + '@vitest/snapshot@1.2.2': + resolution: {integrity: sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==} + + '@vitest/spy@1.2.2': + resolution: {integrity: sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==} + + '@vitest/utils@1.2.2': + resolution: {integrity: sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==} + + '@vue/compiler-core@3.3.4': + resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + + '@vue/compiler-dom@3.3.4': + resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + + '@vue/compiler-sfc@3.3.4': + resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + + '@vue/compiler-ssr@3.3.4': + resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + + '@vue/reactivity-transform@3.3.4': + resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + + '@vue/shared@3.3.4': + resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + + '@yarnpkg/lockfile@1.1.0': + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + + '@yarnpkg/parsers@3.0.0-rc.46': + resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} + engines: {node: '>=14.15.0'} + + '@zkochan/js-yaml@0.0.6': + resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} + hasBin: true + + abitype@1.0.0: + resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + abstract-leveldown@6.2.3: + resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==} + engines: {node: '>=6'} + + abstract-leveldown@6.3.0: + resolution: {integrity: sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==} + engines: {node: '>=6'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + engines: {node: '>=0.4.0'} + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + anchor-markdown-header@0.6.0: + resolution: {integrity: sha512-v7HJMtE1X7wTpNFseRhxsY/pivP4uAJbidVhPT+yhz4i/vV1+qx371IXuV9V7bN6KjFtheLJxqaSm0Y/8neJTA==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + + array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + + array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + + arraybuffer.prototype.slice@1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + + asn1@0.2.4: + resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + async-eventemitter@0.2.4: + resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} + + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + + asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.11.0: + resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} + + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + + axios@1.1.3: + resolution: {integrity: sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==} + + axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + + bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.8: + resolution: {integrity: sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + + bcfg@0.2.1: + resolution: {integrity: sha512-Q69DG2V9QJexdXvYoiXM4xfQ5m65tIOAzJCcW4USQdvbWEJJqBQ9MEDdyJb2ei5fadAJPVp8rUpLbFnkC37FZA==} + engines: {node: '>=8.0.0'} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + bigint-crypto-utils@3.3.0: + resolution: {integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==} + engines: {node: '>=14.0.0'} + + bignumber.js@9.0.1: + resolution: {integrity: sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bintrees@1.0.1: + resolution: {integrity: sha512-tbaUB1QpTIj4cKY8c1rvNAvEQXA+ekzHmbe4jzNfW3QWsF9GnnP/BRWyl6/qqS53heoYJ93naaFcm/jooONH8g==} + + bip39@3.0.4: + resolution: {integrity: sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + blakejs@1.1.1: + resolution: {integrity: sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + breakword@1.0.5: + resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + + bsert@0.0.10: + resolution: {integrity: sha512-NHNwlac+WPy4t2LoNh8pXk8uaIGH3NSaIUbTTRXGpE2WEbq0te/tDykYHkFK57YKLPjv/aGHmbqvnGeVWDz57Q==} + engines: {node: '>=8.0.0'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-reverse@1.0.1: + resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer-xor@2.0.2: + resolution: {integrity: sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.0.5: + resolution: {integrity: sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==} + engines: {node: '>=6.14.2'} + + bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + + bufio@1.2.0: + resolution: {integrity: sha512-UlFk8z/PwdhYQTXSQQagwGAdtRI83gib2n4uy4rQnenxUM2yQi8lBDzF230BNk+3wAoZDxYRoBwVVUPgHa9MCA==} + engines: {node: '>=8.0.0'} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + bundle-require@4.0.1: + resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + + call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + + callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001574: + resolution: {integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + ccount@1.1.0: + resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} + + chai-as-promised@7.1.1: + resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + peerDependencies: + chai: '>= 2.1.2 < 5' + + chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} + + cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + engines: {node: '>=6'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@3.0.2: + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.4.1: + resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} + engines: {node: '>= 0.6'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + core-js-compat@3.35.0: + resolution: {integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==} + + core-js-pure@3.16.2: + resolution: {integrity: sha512-oxKe64UH049mJqrKkynWp6Vu0Rlm/BTXO/bJZuN2mmR3RtOFNepLlSWDd1eo16PzHpQAoNG97rLU1V/YxesJjw==} + deprecated: core-js-pure@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js-pure. + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + cssstyle@4.0.1: + resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} + engines: {node: '>=18'} + + csv-generate@3.4.3: + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + + csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + + csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + + csv@5.5.3: + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + dataloader@1.4.0: + resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + + dateformat@4.5.1: + resolution: {integrity: sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.0: + resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-require-extensions@3.0.0: + resolution: {integrity: sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==} + engines: {node: '>=8'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + deferred-leveldown@5.3.0: + resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==} + engines: {node: '>=6'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depcheck@1.4.7: + resolution: {integrity: sha512-1lklS/bV5chOxwNKA/2XUUk/hPORp8zihZsXflr8x0kLwmcZ9Y9BsS6Hs3ssvA+2wUVbG0U2Ciqvm1SokNjPkA==} + engines: {node: '>=10'} + hasBin: true + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + deps-regex@0.2.0: + resolution: {integrity: sha512-PwuBojGMQAYbWkMXOY9Pd/NWCDNHVH12pnS7WHqZkTSeMESe4hwnKKRp0yR87g37113x4JPbo/oIvXY+s/f56Q==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@3.5.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctoc@2.2.1: + resolution: {integrity: sha512-qNJ1gsuo7hH40vlXTVVrADm6pdg30bns/Mo7Nv1SxuXSM1bwF9b4xQ40a6EFT/L1cI+Yylbyi8MPI4G4y7XJzQ==} + hasBin: true + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv@10.0.0: + resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} + engines: {node: '>=10'} + + dotenv@16.3.2: + resolution: {integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==} + engines: {node: '>=12'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + dotenv@8.6.0: + resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} + engines: {node: '>=10'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + duplexify@4.1.2: + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.4.621: + resolution: {integrity: sha512-MGJM6S0MuF/wTzM9NoItWXN56J1kolrHS/vzl/KlhXAbVkogTy0wzKYliQDJgNypxSCFjxdRhHYS3bffyYUGEw==} + + elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + + emittery@0.10.0: + resolution: {integrity: sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==} + engines: {node: '>=12'} + + emoji-regex@10.1.0: + resolution: {integrity: sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encoding-down@6.3.0: + resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==} + engines: {node: '>=6'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envalid@8.0.0: + resolution: {integrity: sha512-PGeYJnJB5naN0ME6SH8nFcDj9HVbLpYIfg1p5lAyM9T4cH2lwtu2fLbozC/bq+HUUOIFxhX/LP0/GmlqPHT4tQ==} + engines: {node: '>=8.12'} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.13: + resolution: {integrity: sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==} + + es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + esbuild@0.19.10: + resolution: {integrity: sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.7: + resolution: {integrity: sha512-6brbTZVqxhqgbpqBR5MzErImcpA0SQdoKOkcWK/U30HtQxnokIpG3TX2r0IJqbFUzqLjhU/zC1S5ndgakObVCQ==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-config-standard@16.0.3: + resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==} + peerDependencies: + eslint: ^7.12.1 + eslint-plugin-import: ^2.22.1 + eslint-plugin-node: ^11.1.0 + eslint-plugin-promise: ^4.2.1 || ^5.0.0 + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.8.0: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-es@3.0.1: + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsdoc@48.0.6: + resolution: {integrity: sha512-LgwXOX6TWxxFYcbdVe+BJ94Kl/pgjSPYHLzqEdAMXTA1BH9WDx7iJ+9/iDajPF64LtzWX8C1mCfpbMZjJGhAOw==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-node@11.1.0: + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + + eslint-plugin-prefer-arrow@1.2.3: + resolution: {integrity: sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==} + peerDependencies: + eslint: '>=2.0.0' + + eslint-plugin-prettier@4.2.1: + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + + eslint-plugin-promise@5.2.0: + resolution: {integrity: sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^7.0.0 + + eslint-plugin-react@7.33.2: + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-unicorn@50.0.1: + resolution: {integrity: sha512-KxenCZxqSYW0GWHH18okDlOQcpezcitm5aOSz6EnobyJ6BIByiPDviQRjJIUAjG/tMN11958MxaQ+qCoU6lfDA==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eth-ens-namehash@2.0.8: + resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + + ethereum-bloom-filters@1.0.10: + resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + + ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + + ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + + ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + + ethereum-waffle@4.0.10: + resolution: {integrity: sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==} + engines: {node: '>=10.0'} + hasBin: true + peerDependencies: + ethers: '*' + + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + + ethereumjs-util@7.1.3: + resolution: {integrity: sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==} + engines: {node: '>=10.0.0'} + + ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + + ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + + ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + express-prom-bundle@7.0.0: + resolution: {integrity: sha512-VwVaCyGBGHkHdecpTqRdW1Jm2fXK8weCUKjGjNWorc9g4M+cZ3xoj+N9uQzfRWfIPXJG5QOaiAziOIalQzMwgA==} + engines: {node: '>=18'} + peerDependencies: + prom-client: '>=15.0.0' + + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + extsprintf@1.4.0: + resolution: {integrity: sha512-6NW8DZ8pWBc5NbGYUiqqccj9dXnuSzilZYqprdKJBZsQodGH9IyUoFOGxIWVDcBzHMb8ET24aqx9p66tZEWZkA==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-redact@3.2.0: + resolution: {integrity: sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==} + engines: {node: '>=6'} + + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + + fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + + find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + + findup-sync@5.0.0: + resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} + engines: {node: '>= 10.13.0'} + + flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.2.2: + resolution: {integrity: sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==} + + fmix@0.1.0: + resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} + + follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + + fp-ts@1.19.5: + resolution: {integrity: sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@0.30.0: + resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + ganache@7.4.3: + resolution: {integrity: sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==} + hasBin: true + bundledDependencies: + - '@trufflesuite/bigint-buffer' + - emittery + - keccak + - leveldown + - secp256k1 + - '@types/bn.js' + - '@types/lru-cache' + - '@types/seedrandom' + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + + glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + hardhat-deploy@0.12.2: + resolution: {integrity: sha512-Xp/4Lb5lC/j3kvitaWW5IZN5Meqv5D3kTIifc3ZwBoQtFLN26/fDfRV6MWAAcRO9gH64hZVokvtcDdl/fd7w3A==} + + hardhat@2.20.1: + resolution: {integrity: sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + + has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + + has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + + hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + htmlparser2@7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.0.10: + resolution: {integrity: sha512-TQGNknoiy6bURzIO77pPRu+XHi6zI7T93rX+QnJsoYFf3xdjKOur+IlfqzJGMHIK/wXrLg+GsvMs8Op7vI2jVA==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + idna-uts46-hx@2.3.1: + resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} + engines: {node: '>=4.0.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + immediate@3.2.3: + resolution: {integrity: sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==} + + immediate@3.3.0: + resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} + + immutable@4.1.0: + resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imul@1.0.1: + resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} + engines: {node: '>=0.10.0'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + + invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + + is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + + is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-fetch@3.0.0: + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + + isows@1.0.3: + resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + peerDependencies: + ws: '*' + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + istanbul-lib-coverage@3.0.0: + resolution: {integrity: sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==} + engines: {node: '>=8'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + + istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + + istanbul-lib-processinfo@2.0.2: + resolution: {integrity: sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.0: + resolution: {integrity: sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==} + engines: {node: '>=8'} + + istanbul-reports@3.0.2: + resolution: {integrity: sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==} + engines: {node: '>=8'} + + iterator.prototype@1.1.0: + resolution: {integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + joi@17.11.0: + resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-sdsl@4.4.2: + resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} + + js-sha3@0.5.7: + resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdoc-type-pratt-parser@4.0.0: + resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} + engines: {node: '>=12.0.0'} + + jsdom@24.0.0: + resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.2.3: + resolution: {integrity: sha512-a3xHnILGMtk+hDOqNwHzF6e2fNbiMrXZvxKQiEv2MlgQP+pjIOzqAmKYD2mDpXYE/44M7g+n9p2bKkYWDUcXCQ==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + jsonfile@2.4.0: + resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsprim@1.4.1: + resolution: {integrity: sha512-4Dj8Rf+fQ+/Pn7C5qeEX02op1WfOss3PKTE9Nsop3Dx+6UPxlm1dr/og7o2cRa5hNN07CACr4NFzRLtj/rjWog==} + engines: {'0': node >=0.6.0} + + jsx-ast-utils@3.2.0: + resolution: {integrity: sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==} + engines: {node: '>=4.0'} + + keccak@3.0.1: + resolution: {integrity: sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==} + engines: {node: '>=10.0.0'} + + keccak@3.0.3: + resolution: {integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==} + engines: {node: '>=10.0.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + klaw@1.3.1: + resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + + level-codec@9.0.2: + resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==} + engines: {node: '>=6'} + + level-concat-iterator@2.0.1: + resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==} + engines: {node: '>=6'} + + level-errors@2.0.1: + resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==} + engines: {node: '>=6'} + + level-iterator-stream@4.0.2: + resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==} + engines: {node: '>=6'} + + level-mem@5.0.1: + resolution: {integrity: sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==} + engines: {node: '>=6'} + + level-packager@5.1.1: + resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==} + engines: {node: '>=6'} + + level-supports@1.0.1: + resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==} + engines: {node: '>=6'} + + level-ws@2.0.0: + resolution: {integrity: sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==} + engines: {node: '>=6'} + + levelup@4.4.0: + resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lines-and-columns@2.0.3: + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lint-staged@15.2.0: + resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.0.0: + resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} + engines: {node: '>=18.0.0'} + + load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.assign@4.2.0: + resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + + longest-streak@2.0.4: + resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + + ltgt@2.2.1: + resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + match-all@1.2.6: + resolution: {integrity: sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==} + + mcl-wasm@0.7.8: + resolution: {integrity: sha512-qNHlYO6wuEtSoH5A8TcZfCEHtw8gGPqF6hLZpQn2SVd/Mck0ELIKOkmj072D98S9B9CI/jZybTUC96q1P2/ZDw==} + engines: {node: '>=8.9.0'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + mdast-util-find-and-replace@1.1.1: + resolution: {integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==} + + mdast-util-footnote@0.1.7: + resolution: {integrity: sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==} + + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + + mdast-util-frontmatter@0.2.0: + resolution: {integrity: sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==} + + mdast-util-gfm-autolink-literal@0.1.3: + resolution: {integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==} + + mdast-util-gfm-strikethrough@0.2.3: + resolution: {integrity: sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==} + + mdast-util-gfm-table@0.1.6: + resolution: {integrity: sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==} + + mdast-util-gfm-task-list-item@0.1.6: + resolution: {integrity: sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==} + + mdast-util-gfm@0.1.2: + resolution: {integrity: sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==} + + mdast-util-to-markdown@0.6.5: + resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} + + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memdown@5.1.0: + resolution: {integrity: sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==} + engines: {node: '>=6'} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + meow@6.1.1: + resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} + engines: {node: '>=8'} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + merkle-patricia-tree@4.2.4: + resolution: {integrity: sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==} + + merkletreejs@0.3.11: + resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} + engines: {node: '>= 7.6.0'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micromark-extension-footnote@0.3.2: + resolution: {integrity: sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==} + + micromark-extension-frontmatter@0.2.2: + resolution: {integrity: sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==} + + micromark-extension-gfm-autolink-literal@0.5.7: + resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} + + micromark-extension-gfm-strikethrough@0.6.5: + resolution: {integrity: sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==} + + micromark-extension-gfm-table@0.4.3: + resolution: {integrity: sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==} + + micromark-extension-gfm-tagfilter@0.3.0: + resolution: {integrity: sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==} + + micromark-extension-gfm-task-list-item@0.3.3: + resolution: {integrity: sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==} + + micromark-extension-gfm@0.3.3: + resolution: {integrity: sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==} + + micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@7.0.3: + resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mixme@0.5.4: + resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} + engines: {node: '>= 8.0.0'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.4.2: + resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + + mnemonist@0.38.3: + resolution: {integrity: sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==} + + mocha@10.2.0: + resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} + engines: {node: '>= 14.0.0'} + hasBin: true + + morgan@1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multimatch@5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + + murmur-128@0.2.1: + resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.3: + resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.3.0: + resolution: {integrity: sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==} + hasBin: true + + node-gyp-build@4.6.0: + resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + hasBin: true + + node-machine-id@1.1.12: + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + + node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + + nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + + nx-cloud@18.0.0: + resolution: {integrity: sha512-VpPywcHmFIU3GSWb3KV3nQ+TAMLc06DTO39vTFsM+HreB6qRloDxbADRvfM5eHAbY26TNmwflT7wxd0fluv2+A==} + hasBin: true + + nx@18.2.2: + resolution: {integrity: sha512-ZEnN+2XV6QWI3q6N/I9byjSK2ErxAJJjKIWFQ45RW7+KCFbiwF0zeGnn5zruSHY7nbTrUf5C7MDA80eXam5DTg==} + hasBin: true + peerDependencies: + '@swc-node/register': ^1.8.0 + '@swc/core': ^1.3.85 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true + + nyc@15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} + hasBin: true + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + + object.hasown@1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + + object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + + object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + + obliterator@1.6.1: + resolution: {integrity: sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==} + + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + + on-exit-leak-free@2.1.0: + resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.3.0: + resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} + engines: {node: '>=10'} + + os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + + pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + + pino-multi-stream@6.0.0: + resolution: {integrity: sha512-oCuTtaDSUB5xK1S45r9oWE0Dj8RWdHVvaGTft5pO/rmzgIqQRkilf5Ooilz3uRm0IYj8sPRho3lVx48LCmXjvQ==} + deprecated: No longer supported. Use the multi-stream support in the latest core Pino + + pino-sentry@0.14.0: + resolution: {integrity: sha512-UwX0zgJk2ToA1c1f6QpJ7OlWEwxMFt5apJgCYNhhBbuuJuPDmqEzDRMrWKcbF3HKFuupoaNWK6S3o4XXPmI9Rw==} + engines: {node: '>=10'} + hasBin: true + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + + pino@8.19.0: + resolution: {integrity: sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + + please-upgrade-node@3.2.0: + resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss-load-config@4.0.1: + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + engines: {node: ^10 || ^12 || >=14} + + preferred-pm@3.0.3: + resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + engines: {node: '>=10'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process-on-spawn@1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prom-client@14.2.0: + resolution: {integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==} + engines: {node: '>=10'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + pumpify@2.0.1: + resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.1.0: + resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + + reflect.getprototypeof@1.0.3: + resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + + remark-footnotes@3.0.0: + resolution: {integrity: sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==} + + remark-frontmatter@3.0.0: + resolution: {integrity: sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==} + + remark-gfm@1.0.0: + resolution: {integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==} + + remark-parse@9.0.0: + resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@1.2.1: + resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + require-package-name@2.0.1: + resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + + resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + + resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + + resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rlp@2.2.6: + resolution: {integrity: sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==} + hasBin: true + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + rollup@4.5.1: + resolution: {integrity: sha512-0EQribZoPKpb5z1NW/QYm3XSR//Xr8BeEXU49Lc/mQmpmVVG5jPUVrpc2iptup/0WMrY9mzas0fxH+TjYvG2CA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rust-verkle-wasm@0.0.1: + resolution: {integrity: sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA==} + + rustbn-wasm@0.2.0: + resolution: {integrity: sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==} + + rustbn.js@0.2.0: + resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + + seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + + semaphore-async-await@1.5.1: + resolution: {integrity: sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==} + engines: {node: '>=4.1'} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@0.14.7: + resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + smartwrap@2.0.2: + resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} + engines: {node: '>=6'} + hasBin: true + + solc@0.4.26: + resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} + hasBin: true + + solc@0.7.3: + resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} + engines: {node: '>=8.0.0'} + hasBin: true + + solc@0.8.15: + resolution: {integrity: sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==} + engines: {node: '>=10.0.0'} + hasBin: true + + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + + sonic-boom@3.7.0: + resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + + spdx-correct@3.1.1: + resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + + spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + + spdx-license-ids@3.0.10: + resolution: {integrity: sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sshpk@1.16.1: + resolution: {integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==} + engines: {node: '>=0.10.0'} + hasBin: true + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.6.0: + resolution: {integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==} + + stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + + stream-transform@2.1.3: + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.0.0: + resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} + engines: {node: '>=18'} + + string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + + string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + + string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + + strong-log-transformer@2.1.0: + resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} + engines: {node: '>=4'} + hasBin: true + + sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + + tdigest@0.1.1: + resolution: {integrity: sha512-CXcDY/NIgIbKZPx5H4JJNpq6JwJhU5Z4+yWj4ZghDc7/9nVajiRlPPyMXRePPPlBfcayUqtoCXjo7/Hm82ecUA==} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + terser@5.26.0: + resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + testrpc@0.0.1: + resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} + deprecated: testrpc has been renamed to ganache-cli, please use this package from now on. + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + + thread-stream@2.4.0: + resolution: {integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==} + + through2@3.0.2: + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tinybench@2.5.1: + resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} + + tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + engines: {node: '>=14.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + + traverse@0.6.6: + resolution: {integrity: sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + treeify@1.1.0: + resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} + engines: {node: '>=0.6'} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + + ts-api-utils@1.0.1: + resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + + ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true + + ts-essentials@7.0.3: + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-mocha@10.0.0: + resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} + engines: {node: '>= 6.X.X'} + hasBin: true + peerDependencies: + mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + ts-node@7.0.1: + resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} + engines: {node: '>=4.2.0'} + hasBin: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + + tsup@8.0.1: + resolution: {integrity: sha512-hvW7gUSG96j53ZTSlT4j/KL0q1Q2l6TqGBFc6/mu/L46IoNWqLLUzLRLP1R8Q7xrJTmkDxxDoojV5uCVs1sVOg==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsx@4.7.0: + resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} + engines: {node: '>=18.0.0'} + hasBin: true + + tty-table@4.1.6: + resolution: {integrity: sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==} + engines: {node: '>=8.0.0'} + hasBin: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typechain@8.3.1: + resolution: {integrity: sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' + + typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typedoc@0.25.7: + resolution: {integrity: sha512-m6A6JjQRg39p2ZVRIN3NKXgrN8vzlHhOS+r9ymUYtcUP/TIQPvWSq7YgE5ZjASfv5Vd5BW5xrir6Gm2XNNcOow==} + engines: {node: '>= 16'} + hasBin: true + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + + ufo@1.3.2: + resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + underscore@1.13.4: + resolution: {integrity: sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.24.0: + resolution: {integrity: sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ==} + engines: {node: '>=14.0'} + + unified@9.2.2: + resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - /@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - /@eth-optimism/contracts-periphery@1.0.8: - resolution: {integrity: sha512-n8a9rmlMxl1lWSiC1zHUlr5Qk6qy85nhsmSgpU12El1WY75MOIPknSTQKj+yJhEmrTtI0PViWlKfgviY09pwUg==} - dev: false + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} - /@eth-optimism/contracts@0.6.0(ethers@5.7.2): - resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} - peerDependencies: - ethers: ^5 - dependencies: - '@eth-optimism/core-utils': 0.12.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - ethers: 5.7.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} - /@eth-optimism/core-utils@0.12.0: - resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/contracts': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - bufio: 1.2.0 - chai: 4.3.10 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false + universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} - /@ethereum-waffle/chai@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2): - resolution: {integrity: sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==} - engines: {node: '>=10.0'} + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true peerDependencies: - ethers: '*' - dependencies: - '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) - debug: 4.3.4(supports-color@8.1.1) - ethers: 5.7.2 - json-bigint: 1.0.0 - transitivePeerDependencies: - - '@ensdomains/ens' - - '@ensdomains/resolver' - - supports-color - dev: true + browserslist: '>= 4.21.0' - /@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.1)(typescript@5.3.3): - resolution: {integrity: sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==} - engines: {node: '>=10.0'} + update-section@0.3.3: + resolution: {integrity: sha512-BpRZMZpgXLuTiKeiu7kK0nIPwGdyrqrs6EDSaXtjD/aQ2T+qVo9a5hRC3HN3iJjCMxNT/VxoLGQ7E/OzE5ucnw==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + url-value-parser@2.0.3: + resolution: {integrity: sha512-FjIX+Q9lYmDM9uYIGdMYfQW0uLbWVwN2NrL2ayAI7BTOvEwzH+VoDdNquwB9h4dFAx+u6mb0ONLa3sHD5DvyvA==} + engines: {node: '>=6.0.0'} + + url@0.11.1: + resolution: {integrity: sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==} + + utf-8-validate@5.0.7: + resolution: {integrity: sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==} + engines: {node: '>=6.14.2'} + + utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + + vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + + viem@2.8.13: + resolution: {integrity: sha512-jEbRUjsiBwmoDr3fnKL1Bh1GhK5ERhmZcPLeARtEaQoBTPB6bcO2siKhNPVOF8qrYRnGHGQrZHncBWMQhTjGYg==} peerDependencies: - ethers: '*' - solc: '*' - typechain: ^8.0.0 - dependencies: - '@resolver-engine/imports': 0.3.3 - '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.3.3) - '@types/mkdirp': 0.5.2 - '@types/node-fetch': 2.6.4 - ethers: 5.7.2 - mkdirp: 0.5.6 - node-fetch: 2.6.12 - solc: 0.8.15 - typechain: 8.3.1(typescript@5.3.3) - transitivePeerDependencies: - - '@ethersproject/abi' - - '@ethersproject/providers' - - encoding - - supports-color - - typescript - dev: true + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true - /@ethereum-waffle/ens@4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2): - resolution: {integrity: sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==} - engines: {node: '>=10.0'} + vite-node@1.2.2: + resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.1.5: + resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true peerDependencies: - '@ensdomains/ens': ^0.4.4 - '@ensdomains/resolver': ^0.2.4 - ethers: '*' - dependencies: - '@ensdomains/ens': 0.4.5 - '@ensdomains/resolver': 0.2.4 - ethers: 5.7.2 - dev: true + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true - /@ethereum-waffle/mock-contract@4.0.4(ethers@5.7.2): - resolution: {integrity: sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==} - engines: {node: '>=10.0'} + vite@5.1.7: + resolution: {integrity: sha512-sgnEEFTZYMui/sTlH1/XEnVNHMujOahPLGMxn1+5sIT45Xjng1Ec1K78jRP15dSmVgg5WBin9yO81j3o9OxofA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true peerDependencies: - ethers: '*' - dependencies: - ethers: 5.7.2 - dev: true + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true - /@ethereum-waffle/provider@4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2): - resolution: {integrity: sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==} - engines: {node: '>=10.0'} + vitest@1.2.2: + resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true peerDependencies: - ethers: '*' - dependencies: - '@ethereum-waffle/ens': 4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) - '@ganache/ethereum-options': 0.1.4 - debug: 4.3.4(supports-color@8.1.1) - ethers: 5.7.2 - ganache: 7.4.3 - transitivePeerDependencies: - - '@ensdomains/ens' - - '@ensdomains/resolver' - - supports-color - dev: true + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': ^1.0.0 + '@vitest/ui': ^1.0.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true - /@ethereumjs/block@3.6.2: - resolution: {integrity: sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw==} - dependencies: - '@ethereumjs/common': 2.6.4 - '@ethereumjs/tx': 3.5.1 - ethereumjs-util: 7.1.5 - merkle-patricia-tree: 4.2.4 - dev: true + vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - /@ethereumjs/blockchain@5.5.2: - resolution: {integrity: sha512-Jz26iJmmsQtngerW6r5BDFaew/f2mObLrRZo3rskLOx1lmtMZ8+TX/vJexmivrnWgmAsTdNWhlKUYY4thPhPig==} - dependencies: - '@ethereumjs/block': 3.6.2 - '@ethereumjs/common': 2.6.4 - '@ethereumjs/ethash': 1.1.0 - debug: 4.3.4(supports-color@8.1.1) - ethereumjs-util: 7.1.5 - level-mem: 5.0.1 - lru-cache: 5.1.1 - semaphore-async-await: 1.5.1 - transitivePeerDependencies: - - supports-color - dev: true + vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - /@ethereumjs/common@2.6.0: - resolution: {integrity: sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==} - dependencies: - crc-32: 1.2.2 - ethereumjs-util: 7.1.5 - dev: true + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} - /@ethereumjs/common@2.6.4: - resolution: {integrity: sha512-RDJh/R/EAr+B7ZRg5LfJ0BIpf/1LydFgYdvZEuTraojCbVypO2sQ+QnpP5u2wJf9DASyooKqu8O4FJEWUV6NXw==} - dependencies: - crc-32: 1.2.2 - ethereumjs-util: 7.1.5 - dev: true + wait-on@7.2.0: + resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} + engines: {node: '>=12.0.0'} + hasBin: true + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web3-utils@1.10.1: + resolution: {integrity: sha512-r6iUUw/uMnNcWXjhRv33Nyrhxq3VGOPBXeSzxhOXIci4SvC/LPTpROY0uTrMX7ztKyODYrHp8WhTkEf+ZnHssw==} + engines: {node: '>=8.0.0'} - /@ethereumjs/common@3.2.0: - resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} - dependencies: - '@ethereumjs/util': 8.1.0 - crc-32: 1.2.2 - dev: true + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /@ethereumjs/ethash@1.1.0: - resolution: {integrity: sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==} - dependencies: - '@ethereumjs/block': 3.6.2 - '@types/levelup': 4.3.3 - buffer-xor: 2.0.2 - ethereumjs-util: 7.1.5 - miller-rabin: 4.0.1 - dev: true + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - /@ethereumjs/rlp@4.0.1: - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} - /@ethereumjs/rlp@5.0.2: - resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} - hasBin: true - dev: false - /@ethereumjs/tx@3.4.0: - resolution: {integrity: sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==} - dependencies: - '@ethereumjs/common': 2.6.4 - ethereumjs-util: 7.1.5 - dev: true + whatwg-fetch@3.6.17: + resolution: {integrity: sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==} - /@ethereumjs/tx@3.5.1: - resolution: {integrity: sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA==} - dependencies: - '@ethereumjs/common': 2.6.4 - ethereumjs-util: 7.1.5 - dev: true + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} - /@ethereumjs/tx@4.2.0: - resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} - engines: {node: '>=14'} - dependencies: - '@ethereumjs/common': 3.2.0 - '@ethereumjs/rlp': 4.0.1 - '@ethereumjs/util': 8.1.0 - ethereum-cryptography: 2.1.2 - dev: true + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} - /@ethereumjs/util@8.1.0: - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} - dependencies: - '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.1.2 - micro-ftch: 0.3.1 + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - /@ethereumjs/vm@5.6.0: - resolution: {integrity: sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==} - dependencies: - '@ethereumjs/block': 3.6.2 - '@ethereumjs/blockchain': 5.5.2 - '@ethereumjs/common': 2.6.4 - '@ethereumjs/tx': 3.5.1 - async-eventemitter: 0.2.4 - core-js-pure: 3.16.2 - debug: 2.6.9 - ethereumjs-util: 7.1.5 - functional-red-black-tree: 1.0.1 - mcl-wasm: 0.7.8 - merkle-patricia-tree: 4.2.4 - rustbn.js: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - /@ethersproject/abi@5.7.0: - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - /@ethersproject/abstract-provider@5.7.0: - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} - /@ethersproject/abstract-signer@5.7.0: - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 + which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - /@ethersproject/address@5.7.0: - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 + which-module@1.0.0: + resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} - /@ethersproject/base64@5.7.0: - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 + which-module@2.0.0: + resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} - /@ethersproject/basex@5.7.0: - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/properties': 5.7.0 + which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} - /@ethersproject/bignumber@5.7.0: - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - bn.js: 5.2.1 + which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} - /@ethersproject/bytes@5.7.0: - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - dependencies: - '@ethersproject/logger': 5.7.0 + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true - /@ethersproject/constants@5.7.0: - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true - /@ethersproject/contracts@5.7.0: - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true - /@ethersproject/hash@5.7.0: - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} - /@ethersproject/hdnode@5.7.0: - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 + window-size@0.2.0: + resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} + engines: {node: '>= 0.10.0'} + hasBin: true - /@ethersproject/json-wallets@5.7.0: - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - aes-js: 3.0.0 - scrypt-js: 3.0.1 + wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} - /@ethersproject/keccak256@5.7.0: - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - js-sha3: 0.8.0 + workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} - /@ethersproject/logger@5.7.0: - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} - /@ethersproject/networks@5.7.1: - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} - dependencies: - '@ethersproject/logger': 5.7.0 + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} - /@ethersproject/pbkdf2@5.7.0: - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/sha2': 5.7.0 + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} - /@ethersproject/properties@5.7.0: - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} - dependencies: - '@ethersproject/logger': 5.7.0 + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} - /@ethersproject/providers@5.7.2: - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - bech32: 1.1.4 - ws: 7.4.6 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} - /@ethersproject/random@5.7.0: - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /@ethersproject/rlp@5.7.0: - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - /@ethersproject/sha2@5.7.0: - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - hash.js: 1.1.7 + ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - /@ethersproject/signing-key@5.7.0: - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - bn.js: 5.2.1 - elliptic: 6.5.4 - hash.js: 1.1.7 + ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - /@ethersproject/solidity@5.7.0: - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 + ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - /@ethersproject/strings@5.7.0: - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} - /@ethersproject/transactions@5.7.0: - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/signing-key': 5.7.0 + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - /@ethersproject/units@5.7.0: - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} - /@ethersproject/wallet@5.7.0: - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/json-wallets': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 + y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - /@ethersproject/web@5.7.1: - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} - dependencies: - '@ethersproject/base64': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - /@ethersproject/wordlists@5.7.0: - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} - /@ganache/ethereum-address@0.1.4: - resolution: {integrity: sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==} - dependencies: - '@ganache/utils': 0.1.4 - dev: true + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - /@ganache/ethereum-options@0.1.4: - resolution: {integrity: sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==} - dependencies: - '@ganache/ethereum-address': 0.1.4 - '@ganache/ethereum-utils': 0.1.4 - '@ganache/options': 0.1.4 - '@ganache/utils': 0.1.4 - bip39: 3.0.4 - seedrandom: 3.0.5 - transitivePeerDependencies: - - supports-color - dev: true + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - /@ganache/ethereum-utils@0.1.4: - resolution: {integrity: sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==} - dependencies: - '@ethereumjs/common': 2.6.0 - '@ethereumjs/tx': 3.4.0 - '@ethereumjs/vm': 5.6.0 - '@ganache/ethereum-address': 0.1.4 - '@ganache/rlp': 0.1.4 - '@ganache/utils': 0.1.4 - emittery: 0.10.0 - ethereumjs-abi: 0.6.8 - ethereumjs-util: 7.1.3 - transitivePeerDependencies: - - supports-color - dev: true + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /@ganache/options@0.1.4: - resolution: {integrity: sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==} - dependencies: - '@ganache/utils': 0.1.4 - bip39: 3.0.4 - seedrandom: 3.0.5 - dev: true + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} - /@ganache/rlp@0.1.4: - resolution: {integrity: sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==} - dependencies: - '@ganache/utils': 0.1.4 - rlp: 2.2.6 - dev: true + yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} - /@ganache/utils@0.1.4: - resolution: {integrity: sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==} - dependencies: - emittery: 0.10.0 - keccak: 3.0.1 - seedrandom: 3.0.5 - optionalDependencies: - '@trufflesuite/bigint-buffer': 1.1.9 - dev: true + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} - /@hapi/hoek@9.3.0: - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - dev: true + yargs-parser@2.4.1: + resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} - /@hapi/topo@5.1.0: - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - dependencies: - '@hapi/hoek': 9.3.0 - dev: true + yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - dev: true + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} - /@ioredis/commands@1.2.0: - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - dev: true + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} - /@isaacs/ttlcache@1.4.1: - resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - dev: true - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true + yargs@4.8.1: + resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true + yn@2.0.0: + resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} + engines: {node: '>=4'} - /@jest/create-cache-key-function@29.7.0: - resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - dev: true + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.11.17 - jest-mock: 29.7.0 - dev: true + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.11.17 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true + zksync-ethers@5.6.0: + resolution: {integrity: sha512-+lw1dhURpVZos6+g82HdXVw2i/OI+S2nTqyNvBK2xwnQYv8vqxv0Ux/cMPV2AflswTG1/zrMmseRp+UJUCaw9g==} + engines: {node: '>=16.0.0'} + peerDependencies: + ethers: ~5.7.0 - /@jest/types@26.6.2: - resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} - engines: {node: '>= 10.14.2'} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.17 - '@types/yargs': 15.0.19 - chalk: 4.1.2 - dev: true + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.17 - '@types/yargs': 17.0.32 - chalk: 4.1.2 - dev: true + zwitch@1.0.5: + resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 - dev: true +snapshots: - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: true + '@aashutoshrathi/word-wrap@1.2.6': {} - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true + '@adraffy/ens-normalize@1.10.0': {} - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + '@ampproject/remapping@2.2.1': dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@babel/code-frame@7.22.13': dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + '@babel/highlight': 7.22.20 + chalk: 2.4.2 - /@lit-labs/ssr-dom-shim@1.1.1: - resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} - dev: true + '@babel/compat-data@7.23.5': {} - /@lit/reactive-element@1.6.2: - resolution: {integrity: sha512-rDfl+QnCYjuIGf5xI2sVJWdYIi56CTCwWa+nidKYX6oIuBYwUbT/vX4qbUDlHiZKJ/3FRNQ/tWJui44p6/stSA==} + '@babel/core@7.22.10': dependencies: - '@lit-labs/ssr-dom-shim': 1.1.1 - dev: true + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.3 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.22.10) + '@babel/helpers': 7.22.10 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.6 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - /@manypkg/find-root@1.1.0: - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + '@babel/eslint-parser@7.23.10(@babel/core@7.22.10)(eslint@8.56.0)': dependencies: - '@babel/runtime': 7.23.7 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 - dev: false + '@babel/core': 7.22.10 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.56.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 - /@manypkg/get-packages@1.1.3: - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@babel/generator@7.23.3': dependencies: - '@babel/runtime': 7.23.7 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 - dev: false + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 - /@metamask/eth-json-rpc-provider@1.0.1: - resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} - engines: {node: '>=14.0.0'} + '@babel/helper-compilation-targets@7.23.6': dependencies: - '@metamask/json-rpc-engine': 7.3.1 - '@metamask/safe-event-emitter': 3.0.0 - '@metamask/utils': 5.0.2 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 - /@metamask/eth-sig-util@4.0.0: - resolution: {integrity: sha512-LczOjjxY4A7XYloxzyxJIHONELmUxVZncpOLoClpEcTiebiVdM46KRPYXGuULro9oNNR2xdVx3yoKiQjdfWmoA==} - engines: {node: '>=12.0.0'} + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': dependencies: - ethereumjs-abi: 0.6.8 - ethereumjs-util: 6.2.1 - ethjs-util: 0.1.6 - tweetnacl: 1.0.3 - tweetnacl-util: 0.15.1 - dev: true + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 - /@metamask/json-rpc-engine@7.3.1: - resolution: {integrity: sha512-OVxccX/IFOjPzCzSFAEceccPIAf7A7IwnvjyWjyHCkLrO+LWV4e7Tpe79JNXiORywNulHxrg+q6QrmrnGEwssQ==} - engines: {node: '>=16.0.0'} + '@babel/helper-hoist-variables@7.22.5': dependencies: - '@metamask/rpc-errors': 6.1.0 - '@metamask/safe-event-emitter': 3.0.0 - '@metamask/utils': 8.2.1 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/types': 7.23.6 - /@metamask/object-multiplex@1.3.0: - resolution: {integrity: sha512-czcQeVYdSNtabd+NcYQnrM69MciiJyd1qvKH8WM2Id3C0ZiUUX5Xa/MK+/VUk633DBhVOwdNzAKIQ33lGyA+eQ==} - engines: {node: '>=12.0.0'} + '@babel/helper-module-imports@7.22.15': dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - readable-stream: 2.3.8 - dev: true + '@babel/types': 7.23.6 - /@metamask/onboarding@1.0.1: - resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + '@babel/helper-module-transforms@7.23.3(@babel/core@7.22.10)': dependencies: - bowser: 2.11.0 - dev: true + '@babel/core': 7.22.10 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 - /@metamask/post-message-stream@6.2.0: - resolution: {integrity: sha512-WunZ0bruClF862mvbKQGETn5SM0XKGmocPMQR1Ew6sYix9/FDzeoZnoI8RkXk01E+70FCdxhTE/r8kk5SFOuTw==} - engines: {node: '>=14.0.0'} + '@babel/helper-simple-access@7.22.5': dependencies: - '@metamask/utils': 5.0.2 - readable-stream: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/types': 7.23.6 - /@metamask/providers@10.2.1: - resolution: {integrity: sha512-p2TXw2a1Nb8czntDGfeIYQnk4LLVbd5vlcb3GY//lylYlKdSqp+uUTegCvxiFblRDOT68jsY8Ib1VEEzVUOolA==} - engines: {node: '>=14.0.0'} + '@babel/helper-split-export-declaration@7.22.6': dependencies: - '@metamask/object-multiplex': 1.3.0 - '@metamask/safe-event-emitter': 2.0.0 - '@types/chrome': 0.0.136 - detect-browser: 5.3.0 - eth-rpc-errors: 4.0.3 - extension-port-stream: 2.1.1 - fast-deep-equal: 2.0.1 - is-stream: 2.0.1 - json-rpc-engine: 6.1.0 - json-rpc-middleware-stream: 4.2.3 - pump: 3.0.0 - webextension-polyfill-ts: 0.25.0 - dev: true + '@babel/types': 7.23.6 - /@metamask/rpc-errors@6.1.0: - resolution: {integrity: sha512-JQElKxai26FpDyRKO/yH732wI+BV90i1u6pOuDOpdADSbppB2g1pPh3AGST1zkZqEE9eIKIUw8UdBQ4rp3VTSg==} - engines: {node: '>=16.0.0'} + '@babel/helper-string-parser@7.23.4': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helpers@7.22.10': dependencies: - '@metamask/utils': 8.2.1 - fast-safe-stringify: 2.1.1 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.6 transitivePeerDependencies: - supports-color - dev: true - /@metamask/safe-event-emitter@2.0.0: - resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} - dev: true + '@babel/highlight@7.22.20': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 - /@metamask/safe-event-emitter@3.0.0: - resolution: {integrity: sha512-j6Z47VOmVyGMlnKXZmL0fyvWfEYtKWCA9yGZkU3FCsGZUT5lHGmvaV9JA5F2Y+010y7+ROtR3WMXIkvl/nVzqQ==} - engines: {node: '>=12.0.0'} - dev: true + '@babel/parser@7.23.0': + dependencies: + '@babel/types': 7.23.6 - /@metamask/sdk-communication-layer@0.14.1: - resolution: {integrity: sha512-K1KhkKMdAAPi079G/bX/cIazqT6qnkRnykrs7nA1sU2BouG7BYD4qPgv7ridc3BNIewnFg9eMzzYIgOgfXzJKw==} + '@babel/parser@7.23.6': dependencies: - bufferutil: 4.0.8 - cross-fetch: 3.1.8 - date-fns: 2.30.0 - eciesjs: 0.3.18 - eventemitter2: 6.4.9 - socket.io-client: 4.7.3(bufferutil@4.0.8)(utf-8-validate@6.0.3) - utf-8-validate: 6.0.3 - uuid: 8.3.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@metamask/sdk-install-modal-web@0.14.1(react-native@0.73.1): - resolution: {integrity: sha512-emT8HKbnfVwGhPxyUfMja6DWzvtJvDEBQxqCVx93H0HsyrrOzOC43iGCAosslw6o5h7gOfRKLqWmK8V7jQAS2Q==} - dependencies: - '@emotion/react': 11.11.3(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(react@18.2.0) - i18next: 22.5.1 - qr-code-styling: 1.6.0-rc.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.2.0)(react-native@0.73.1)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - react-native - dev: true + '@babel/types': 7.23.6 - /@metamask/sdk@0.14.1(react-dom@18.2.0)(react-native@0.73.1)(react@18.2.0): - resolution: {integrity: sha512-52kfvnlyMXRO8/oPGoQOFMevSjgkLzpl8aGG6Ivx/6jiqSv5ScuOg6YdSWXR937Ts0zWE0V8KTUBMfnGGt0S9Q==} - peerDependencies: - react: ^18.2.0 - react-native: '*' - peerDependenciesMeta: - react: - optional: true - react-native: - optional: true + '@babel/runtime@7.23.7': dependencies: - '@metamask/onboarding': 1.0.1 - '@metamask/post-message-stream': 6.2.0 - '@metamask/providers': 10.2.1 - '@metamask/sdk-communication-layer': 0.14.1 - '@metamask/sdk-install-modal-web': 0.14.1(react-native@0.73.1) - '@react-native-async-storage/async-storage': 1.21.0(react-native@0.73.1) - '@types/dom-screen-wake-lock': 1.0.3 - bowser: 2.11.0 - cross-fetch: 4.0.0 - eciesjs: 0.3.18 - eth-rpc-errors: 4.0.3 - eventemitter2: 6.4.9 - extension-port-stream: 2.1.1 - i18next: 22.5.1 - i18next-browser-languagedetector: 7.2.0 - obj-multiplex: 1.0.0 - pump: 3.0.0 - qrcode-terminal-nooctal: 0.12.1 - react: 18.2.0 - react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.2.0)(react-native@0.73.1)(react@18.2.0) - react-native: 0.73.1(@babel/core@7.22.10)(@babel/preset-env@7.23.7)(react@18.2.0) - react-native-webview: 11.26.1(react-native@0.73.1)(react@18.2.0) - readable-stream: 2.3.8 - rollup-plugin-visualizer: 5.12.0 - socket.io-client: 4.7.3(bufferutil@4.0.8)(utf-8-validate@6.0.3) - util: 0.12.5 - uuid: 8.3.2 - transitivePeerDependencies: - - '@types/react' - - bufferutil - - encoding - - react-dom - - rollup - - supports-color - - utf-8-validate - dev: true + regenerator-runtime: 0.14.1 - /@metamask/utils@5.0.2: - resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} - engines: {node: '>=14.0.0'} + '@babel/template@7.22.15': dependencies: - '@ethereumjs/tx': 4.2.0 - '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@8.1.1) - semver: 7.6.0 - superstruct: 1.0.3 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 - /@metamask/utils@8.2.1: - resolution: {integrity: sha512-dlnpow8r0YHDDL1xKCEwUoTGOAo9icdv+gaJG0EbgDnkD/BDqW2eH1XMtm9i7rPaiHWo/aLtcrh9WBhkCq/viw==} - engines: {node: '>=16.0.0'} + '@babel/traverse@7.23.3': dependencies: - '@ethereumjs/tx': 4.2.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.3 - '@types/debug': 4.1.12 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 debug: 4.3.4(supports-color@8.1.1) - pony-cause: 2.1.10 - semver: 7.6.0 - superstruct: 1.0.3 + globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true - /@motionone/animation@10.15.1: - resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} + '@babel/types@7.23.6': dependencies: - '@motionone/easing': 10.15.1 - '@motionone/types': 10.15.1 - '@motionone/utils': 10.15.1 - tslib: 2.6.2 - dev: true + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 - /@motionone/dom@10.16.2: - resolution: {integrity: sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==} + '@changesets/apply-release-plan@7.0.0': dependencies: - '@motionone/animation': 10.15.1 - '@motionone/generators': 10.15.1 - '@motionone/types': 10.15.1 - '@motionone/utils': 10.15.1 - hey-listen: 1.0.8 - tslib: 2.6.2 - dev: true + '@babel/runtime': 7.23.7 + '@changesets/config': 3.0.0 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.6.0 - /@motionone/easing@10.15.1: - resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==} + '@changesets/assemble-release-plan@6.0.0': dependencies: - '@motionone/utils': 10.15.1 - tslib: 2.6.2 - dev: true + '@babel/runtime': 7.23.7 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.6.0 - /@motionone/generators@10.15.1: - resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==} + '@changesets/changelog-git@0.2.0': dependencies: - '@motionone/types': 10.15.1 - '@motionone/utils': 10.15.1 - tslib: 2.6.2 - dev: true + '@changesets/types': 6.0.0 - /@motionone/svelte@10.16.2: - resolution: {integrity: sha512-38xsroKrfK+aHYhuQlE6eFcGy0EwrB43Q7RGjF73j/kRUTcLNu/LAaKiLLsN5lyqVzCgTBVt4TMT/ShWbTbc5Q==} + '@changesets/changelog-github@0.4.8': dependencies: - '@motionone/dom': 10.16.2 - tslib: 2.6.2 - dev: true - - /@motionone/types@10.15.1: - resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==} - dev: true + '@changesets/get-github-info': 0.5.2 + '@changesets/types': 5.2.1 + dotenv: 8.6.0 + transitivePeerDependencies: + - encoding - /@motionone/utils@10.15.1: - resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==} + '@changesets/cli@2.27.1': dependencies: - '@motionone/types': 10.15.1 - hey-listen: 1.0.8 - tslib: 2.6.2 - dev: true + '@babel/runtime': 7.23.7 + '@changesets/apply-release-plan': 7.0.0 + '@changesets/assemble-release-plan': 6.0.0 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.0 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/get-release-plan': 4.0.0 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.0 + '@manypkg/get-packages': 1.1.3 + '@types/semver': 7.5.7 + ansi-colors: 4.1.3 + chalk: 2.4.2 + ci-info: 3.8.0 + enquirer: 2.3.6 + external-editor: 3.1.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + meow: 6.1.1 + outdent: 0.5.0 + p-limit: 2.3.0 + preferred-pm: 3.0.3 + resolve-from: 5.0.0 + semver: 7.6.0 + spawndamnit: 2.0.0 + term-size: 2.2.1 + tty-table: 4.1.6 - /@motionone/vue@10.16.2: - resolution: {integrity: sha512-7/dEK/nWQXOkJ70bqb2KyNfSWbNvWqKKq1C8juj+0Mg/AorgD8O5wE3naddK0G+aXuNMqRuc4jlsYHHWHtIzVw==} - deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion + '@changesets/config@3.0.0': dependencies: - '@motionone/dom': 10.16.2 - tslib: 2.6.2 - dev: true + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/logger': 0.1.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.5 - /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + '@changesets/errors@0.2.0': dependencies: - eslint-scope: 5.1.1 - dev: true + extendable-error: 0.1.7 - /@noble/curves@1.1.0: - resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + '@changesets/get-dependents-graph@2.0.0': dependencies: - '@noble/hashes': 1.3.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + chalk: 2.4.2 + fs-extra: 7.0.1 + semver: 7.6.0 - /@noble/curves@1.2.0: - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + '@changesets/get-github-info@0.5.2': dependencies: - '@noble/hashes': 1.3.2 - - /@noble/hashes@1.2.0: - resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - dev: true - - /@noble/hashes@1.3.1: - resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} - engines: {node: '>= 16'} - - /@noble/hashes@1.3.2: - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - - /@noble/secp256k1@1.7.1: - resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} - dev: true + dataloader: 1.4.0 + node-fetch: 2.6.12 + transitivePeerDependencies: + - encoding - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@changesets/get-release-plan@4.0.0': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@babel/runtime': 7.23.7 + '@changesets/assemble-release-plan': 6.0.0 + '@changesets/config': 3.0.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@changesets/get-version-range-type@0.4.0': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@changesets/git@3.0.0': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + '@babel/runtime': 7.23.7 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.5 + spawndamnit: 2.0.0 - /@nomicfoundation/ethereumjs-block@5.0.4: - resolution: {integrity: sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==} - engines: {node: '>=18'} + '@changesets/logger@0.1.0': dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-trie': 6.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - ethereum-cryptography: 0.1.3 - transitivePeerDependencies: - - c-kzg - dev: true + chalk: 2.4.2 - /@nomicfoundation/ethereumjs-blockchain@7.0.4: - resolution: {integrity: sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg==} - engines: {node: '>=18'} + '@changesets/parse@0.4.0': dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.4 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-ethash': 3.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-trie': 6.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - lru-cache: 10.1.0 - transitivePeerDependencies: - - c-kzg - - supports-color - dev: true + '@changesets/types': 6.0.0 + js-yaml: 3.14.1 - /@nomicfoundation/ethereumjs-common@4.0.4: - resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} + '@changesets/pre@2.0.0': dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.4 - transitivePeerDependencies: - - c-kzg - dev: true + '@babel/runtime': 7.23.7 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 - /@nomicfoundation/ethereumjs-ethash@3.0.4: - resolution: {integrity: sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ==} - engines: {node: '>=18'} + '@changesets/read@0.6.0': dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - bigint-crypto-utils: 3.3.0 - ethereum-cryptography: 0.1.3 - transitivePeerDependencies: - - c-kzg - dev: true + '@babel/runtime': 7.23.7 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + chalk: 2.4.2 + fs-extra: 7.0.1 + p-filter: 2.1.0 - /@nomicfoundation/ethereumjs-evm@2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2): - resolution: {integrity: sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w==} - engines: {node: '>=18'} - dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-statemanager': 2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - rustbn-wasm: 0.2.0 - transitivePeerDependencies: - - '@nomicfoundation/ethereumjs-verkle' - - c-kzg - - supports-color - dev: true + '@changesets/types@4.1.0': {} - /@nomicfoundation/ethereumjs-rlp@5.0.4: - resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} - engines: {node: '>=18'} - hasBin: true - dev: true + '@changesets/types@5.2.1': {} - /@nomicfoundation/ethereumjs-statemanager@2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2): - resolution: {integrity: sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q==} - peerDependencies: - '@nomicfoundation/ethereumjs-verkle': 0.0.2 - peerDependenciesMeta: - '@nomicfoundation/ethereumjs-verkle': - optional: true - dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-trie': 6.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomicfoundation/ethereumjs-verkle': 0.0.2 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - js-sdsl: 4.4.2 - lru-cache: 10.1.0 - transitivePeerDependencies: - - c-kzg - - supports-color - dev: true + '@changesets/types@6.0.0': {} - /@nomicfoundation/ethereumjs-trie@6.0.4: - resolution: {integrity: sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==} - engines: {node: '>=18'} + '@changesets/write@0.3.0': dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - '@types/readable-stream': 2.3.15 - ethereum-cryptography: 0.1.3 - lru-cache: 10.1.0 - readable-stream: 3.6.2 - transitivePeerDependencies: - - c-kzg - dev: true + '@babel/runtime': 7.23.7 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 - /@nomicfoundation/ethereumjs-tx@5.0.4: - resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true + '@cspotcode/source-map-support@0.8.1': dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - ethereum-cryptography: 0.1.3 - dev: true + '@jridgewell/trace-mapping': 0.3.9 - /@nomicfoundation/ethereumjs-util@9.0.4: - resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true + '@ensdomains/ens@0.4.5': dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - ethereum-cryptography: 0.1.3 - dev: true + bluebird: 3.7.2 + eth-ens-namehash: 2.0.8 + solc: 0.4.26 + testrpc: 0.0.1 + web3-utils: 1.10.1 - /@nomicfoundation/ethereumjs-verkle@0.0.2: - resolution: {integrity: sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ==} - engines: {node: '>=18'} - dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - lru-cache: 10.1.0 - rust-verkle-wasm: 0.0.1 - transitivePeerDependencies: - - c-kzg - dev: true + '@ensdomains/resolver@0.2.4': {} - /@nomicfoundation/ethereumjs-vm@7.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2): - resolution: {integrity: sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ==} - engines: {node: '>=18'} + '@es-joy/jsdoccomment@0.42.0': dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.4 - '@nomicfoundation/ethereumjs-blockchain': 7.0.4 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-evm': 2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-statemanager': 2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) - '@nomicfoundation/ethereumjs-trie': 6.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - transitivePeerDependencies: - - '@nomicfoundation/ethereumjs-verkle' - - c-kzg - - supports-color - dev: true + comment-parser: 1.4.1 + esquery: 1.5.0 + jsdoc-type-pratt-parser: 4.0.0 - /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1: - resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/aix-ppc64@0.19.10': optional: true - /@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1: - resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/android-arm64@0.19.10': optional: true - /@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1: - resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/android-arm64@0.19.7': optional: true - /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1: - resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/android-arm@0.19.10': optional: true - /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1: - resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/android-arm@0.19.7': optional: true - /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1: - resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/android-x64@0.19.10': optional: true - /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1: - resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/android-x64@0.19.7': optional: true - /@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1: - resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/darwin-arm64@0.19.10': optional: true - /@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1: - resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/darwin-arm64@0.19.7': optional: true - /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1: - resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/darwin-x64@0.19.10': optional: true - /@nomicfoundation/solidity-analyzer@0.1.1: - resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} - engines: {node: '>= 12'} - optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 - '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 - dev: true + '@esbuild/darwin-x64@0.19.7': + optional: true - /@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1): - resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==} - peerDependencies: - ethers: ^5.0.0 - hardhat: ^2.0.0 - dependencies: - ethers: 5.7.2 - hardhat: 2.20.1(ts-node@10.9.2)(typescript@5.3.3) - dev: true + '@esbuild/freebsd-arm64@0.19.10': + optional: true - /@nomiclabs/hardhat-waffle@2.0.1(@nomiclabs/hardhat-ethers@2.2.3)(ethereum-waffle@4.0.10)(ethers@5.7.2)(hardhat@2.20.1): - resolution: {integrity: sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ==} - peerDependencies: - '@nomiclabs/hardhat-ethers': ^2.0.0 - ethereum-waffle: ^3.2.0 - ethers: ^5.0.0 - hardhat: ^2.0.0 - dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.20.1) - '@types/sinon-chai': 3.2.5 - '@types/web3': 1.0.19 - ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.3.3) - ethers: 5.7.2 - hardhat: 2.20.1(ts-node@10.9.2)(typescript@5.3.3) - dev: true + '@esbuild/freebsd-arm64@0.19.7': + optional: true + + '@esbuild/freebsd-x64@0.19.10': + optional: true + + '@esbuild/freebsd-x64@0.19.7': + optional: true + + '@esbuild/linux-arm64@0.19.10': + optional: true + + '@esbuild/linux-arm64@0.19.7': + optional: true + + '@esbuild/linux-arm@0.19.10': + optional: true - /@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.5)(ethereum-waffle@4.0.10)(ethers@5.7.2)(hardhat@2.20.1): - resolution: {integrity: sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg==} - peerDependencies: - '@nomiclabs/hardhat-ethers': ^2.0.0 - '@types/sinon-chai': ^3.2.3 - ethereum-waffle: '*' - ethers: ^5.0.0 - hardhat: ^2.0.0 - dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.20.1) - '@types/sinon-chai': 3.2.5 - ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.3.3) - ethers: 5.7.2 - hardhat: 2.20.1(ts-node@10.9.2)(typescript@5.3.3) - dev: true + '@esbuild/linux-arm@0.19.7': + optional: true - /@nrwl/nx-cloud@18.0.0: - resolution: {integrity: sha512-rjjcJgzDmKwFD1QVIMs5O3X4SoMQIk0bzh3pL90ZP/B5YJUlTySv7+R0JoGQ6ROGwVQHjPFMVKKLB09zl5perA==} - dependencies: - nx-cloud: 18.0.0 - transitivePeerDependencies: - - debug - dev: true + '@esbuild/linux-ia32@0.19.10': + optional: true - /@nrwl/tao@18.0.4: - resolution: {integrity: sha512-/PzGOJevlDQnp5RPXF3WDe+w1cdohGkY+mbJUgDVA4Q5JEPT1DtE10h9GgdHdzkPjVPNYsaI4Vs/53NUdlVHHA==} - hasBin: true - dependencies: - nx: 18.0.4 - tslib: 2.6.2 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - debug - dev: true + '@esbuild/linux-ia32@0.19.7': + optional: true - /@nx/nx-darwin-arm64@18.0.4: - resolution: {integrity: sha512-9KJVONxUwdnFHHRNocsg7q5pliOTTfbjlr3rvhLuroV5HeTJFhUipKCQrVEhLy8e4auRdLuSz/HsgpJat3Z2cg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/linux-loong64@0.19.10': optional: true - /@nx/nx-darwin-x64@18.0.4: - resolution: {integrity: sha512-rFKHjeU0Ngz1R7UJAsbncpqwuFDjUdpcvI783r6s2eP7JoiiwtDBXvDcHiy8Odk0lPYmwDELaFZBhvdENqaDNA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/linux-loong64@0.19.7': optional: true - /@nx/nx-freebsd-x64@18.0.4: - resolution: {integrity: sha512-jJx47wgRoUxVpQ+WG5+yLdxtJVuVgjphiTMRc0LOfUwKQaEHWyCA0hMK5fNmo0FAHIhGVCb/j2j9FxnCWTWpkg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/linux-mips64el@0.19.10': optional: true - /@nx/nx-linux-arm-gnueabihf@18.0.4: - resolution: {integrity: sha512-C3qWbFhEMIdTzvAHlIUHecZN3YBu7bx3S0p3gPNGmEMUMbYHP2zMlimBrZIbAxzntyGqWCqhXiFB21QhJ0t1Dw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-mips64el@0.19.7': optional: true - /@nx/nx-linux-arm64-gnu@18.0.4: - resolution: {integrity: sha512-PxVMh9ikp8Q3hKagb66FAsek8O/08GcMF5dXBH7xc5AiQMaZ6Az/gAXOeHp274nmu3StQEpl9Il/YH6Z9f4V0w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ppc64@0.19.10': optional: true - /@nx/nx-linux-arm64-musl@18.0.4: - resolution: {integrity: sha512-Iz7Z4h2/dXJJvBcyeRHa+d3Ncc4Qz+OiGm6iRDXv4zjFm5EyC1tkSZIFNlNiRjmTToNHFr4savrCjCh8wRYejw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ppc64@0.19.7': optional: true - /@nx/nx-linux-x64-gnu@18.0.4: - resolution: {integrity: sha512-BVLkegIwxHnEB64VBraBxyC01D3C3dVNxq2b4iNaqr4mpWNmos+G/mvcTU3NS7W8ZjpBjlXgdEkpgkl2hMKTEA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-riscv64@0.19.10': optional: true - /@nx/nx-linux-x64-musl@18.0.4: - resolution: {integrity: sha512-WgVy41psjCE9uxjFi4P62UrWyKQ1e2IN2FZaIuwXEB9h8OU/+g9PFpL1Cs1llNoEKnapKXX4+9b5FHF9i7EKQw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-riscv64@0.19.7': optional: true - /@nx/nx-win32-arm64-msvc@18.0.4: - resolution: {integrity: sha512-YoxhOrVKnS+kcNTnCg9M61cbigzGErYgnlI8kdZzH2ArD7mhv8bfZnSZUInf5Y8oDBVpKusel7AkCSofzSwigA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/linux-s390x@0.19.10': optional: true - /@nx/nx-win32-x64-msvc@18.0.4: - resolution: {integrity: sha512-FdAdl5buvtUXp8hZVRkK0AZeiCu35l0u+yHsulNViYdh3OXRT1hYJ0CeqpxlLfvbHqB9JzDPtJtG0dpKHH/O0Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/linux-s390x@0.19.7': optional: true - /@parcel/watcher-android-arm64@2.3.0: - resolution: {integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@esbuild/linux-x64@0.19.10': optional: true - /@parcel/watcher-darwin-arm64@2.3.0: - resolution: {integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/linux-x64@0.19.7': optional: true - /@parcel/watcher-darwin-x64@2.3.0: - resolution: {integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/netbsd-x64@0.19.10': optional: true - /@parcel/watcher-freebsd-x64@2.3.0: - resolution: {integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/netbsd-x64@0.19.7': optional: true - /@parcel/watcher-linux-arm-glibc@2.3.0: - resolution: {integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/openbsd-x64@0.19.10': optional: true - /@parcel/watcher-linux-arm64-glibc@2.3.0: - resolution: {integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/openbsd-x64@0.19.7': optional: true - /@parcel/watcher-linux-arm64-musl@2.3.0: - resolution: {integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/sunos-x64@0.19.10': optional: true - /@parcel/watcher-linux-x64-glibc@2.3.0: - resolution: {integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/sunos-x64@0.19.7': optional: true - /@parcel/watcher-linux-x64-musl@2.3.0: - resolution: {integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/win32-arm64@0.19.10': optional: true - /@parcel/watcher-wasm@2.3.0: - resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} - engines: {node: '>= 10.0.0'} - dependencies: - is-glob: 4.0.3 - micromatch: 4.0.5 - napi-wasm: 1.1.0 - dev: true - bundledDependencies: - - napi-wasm + '@esbuild/win32-arm64@0.19.7': + optional: true - /@parcel/watcher-win32-arm64@2.3.0: - resolution: {integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-ia32@0.19.10': optional: true - /@parcel/watcher-win32-ia32@2.3.0: - resolution: {integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-ia32@0.19.7': optional: true - /@parcel/watcher-win32-x64@2.3.0: - resolution: {integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-x64@0.19.10': optional: true - /@parcel/watcher@2.3.0: - resolution: {integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==} - engines: {node: '>= 10.0.0'} - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.5 - node-addon-api: 7.0.0 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.3.0 - '@parcel/watcher-darwin-arm64': 2.3.0 - '@parcel/watcher-darwin-x64': 2.3.0 - '@parcel/watcher-freebsd-x64': 2.3.0 - '@parcel/watcher-linux-arm-glibc': 2.3.0 - '@parcel/watcher-linux-arm64-glibc': 2.3.0 - '@parcel/watcher-linux-arm64-musl': 2.3.0 - '@parcel/watcher-linux-x64-glibc': 2.3.0 - '@parcel/watcher-linux-x64-musl': 2.3.0 - '@parcel/watcher-win32-arm64': 2.3.0 - '@parcel/watcher-win32-ia32': 2.3.0 - '@parcel/watcher-win32-x64': 2.3.0 - dev: true - - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true + '@esbuild/win32-x64@0.19.7': optional: true - /@react-native-async-storage/async-storage@1.21.0(react-native@0.73.1): - resolution: {integrity: sha512-JL0w36KuFHFCvnbOXRekqVAUplmOyT/OuCQkogo6X98MtpSaJOKEAeZnYO8JB0U/RIEixZaGI5px73YbRm/oag==} - peerDependencies: - react-native: ^0.0.0-0 || >=0.60 <1.0 + '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)': dependencies: - merge-options: 3.0.4 - react-native: 0.73.1(@babel/core@7.22.10)(@babel/preset-env@7.23.7)(react@18.2.0) - dev: true + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.6.2': {} - /@react-native-community/cli-clean@12.3.0: - resolution: {integrity: sha512-iAgLCOWYRGh9ukr+eVQnhkV/OqN3V2EGd/in33Ggn/Mj4uO6+oUncXFwB+yjlyaUNz6FfjudhIz09yYGSF+9sg==} + '@eslint/eslintrc@2.1.4': dependencies: - '@react-native-community/cli-tools': 12.3.0 - chalk: 4.1.2 - execa: 5.1.1 + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.21.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 transitivePeerDependencies: - - encoding - dev: true + - supports-color + + '@eslint/js@8.56.0': {} - /@react-native-community/cli-config@12.3.0: - resolution: {integrity: sha512-BrTn5ndFD9uOxO8kxBQ32EpbtOvAsQExGPI7SokdI4Zlve70FziLtTq91LTlTUgMq1InVZn/jJb3VIDk6BTInQ==} + '@eth-optimism/common-ts@0.8.9(bufferutil@4.0.8)(utf-8-validate@5.0.7)': dependencies: - '@react-native-community/cli-tools': 12.3.0 - chalk: 4.1.2 - cosmiconfig: 5.2.1 - deepmerge: 4.3.1 - glob: 7.2.3 - joi: 17.11.0 + '@eth-optimism/core-utils': 0.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + '@sentry/node': 7.99.0 + bcfg: 0.2.1 + body-parser: 1.20.2 + commander: 11.1.0 + dotenv: 16.4.5 + envalid: 8.0.0 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + express: 4.19.2 + express-prom-bundle: 7.0.0(prom-client@14.2.0) + lodash: 4.17.21 + morgan: 1.10.0 + pino: 8.19.0 + pino-multi-stream: 6.0.0 + pino-sentry: 0.14.0 + prom-client: 14.2.0 transitivePeerDependencies: + - bufferutil - encoding - dev: true + - supports-color + - utf-8-validate - /@react-native-community/cli-debugger-ui@12.3.0: - resolution: {integrity: sha512-w3b0iwjQlk47GhZWHaeTG8kKH09NCMUJO729xSdMBXE8rlbm4kHpKbxQY9qKb6NlfWSJN4noGY+FkNZS2rRwnQ==} + '@eth-optimism/contracts-periphery@1.0.8': {} + + '@eth-optimism/contracts@0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(utf-8-validate@5.0.7)': dependencies: - serve-static: 1.15.0 + '@eth-optimism/core-utils': 0.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.7) + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) transitivePeerDependencies: - - supports-color - dev: true + - bufferutil + - utf-8-validate - /@react-native-community/cli-doctor@12.3.0: - resolution: {integrity: sha512-BPCwNNesoQMkKsxB08Ayy6URgGQ8Kndv6mMhIvJSNdST3J1+x3ehBHXzG9B9Vfi+DrTKRb8lmEl/b/7VkDlPkA==} + '@eth-optimism/core-utils@0.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.7)': dependencies: - '@react-native-community/cli-config': 12.3.0 - '@react-native-community/cli-platform-android': 12.3.0 - '@react-native-community/cli-platform-ios': 12.3.0 - '@react-native-community/cli-tools': 12.3.0 - chalk: 4.1.2 - command-exists: 1.2.9 - deepmerge: 4.3.1 - envinfo: 7.11.0 - execa: 5.1.1 - hermes-profile-transformer: 0.0.6 - ip: 1.1.9 - node-stream-zip: 1.15.0 - ora: 5.4.1 - semver: 7.6.0 - strip-ansi: 5.2.0 - wcwidth: 1.0.1 - yaml: 2.3.4 + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + '@ethersproject/rlp': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bufio: 1.2.0 + chai: 4.3.10 transitivePeerDependencies: - - encoding - dev: true + - bufferutil + - utf-8-validate - /@react-native-community/cli-hermes@12.3.0: - resolution: {integrity: sha512-G6FxpeZBO4AimKZwtWR3dpXRqTvsmEqlIkkxgwthdzn3LbVjDVIXKpVYU9PkR5cnT+KuAUxO0WwthrJ6Nmrrlg==} + '@eth-optimism/core-utils@0.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.7)': dependencies: - '@react-native-community/cli-platform-android': 12.3.0 - '@react-native-community/cli-tools': 12.3.0 - chalk: 4.1.2 - hermes-profile-transformer: 0.0.6 - ip: 1.1.9 + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/web': 5.7.1 + chai: 4.3.10 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + node-fetch: 2.6.12 transitivePeerDependencies: + - bufferutil - encoding - dev: true + - utf-8-validate - /@react-native-community/cli-platform-android@12.3.0: - resolution: {integrity: sha512-VU1NZw63+GLU2TnyQ919bEMThpHQ/oMFju9MCfrd3pyPJz4Sn+vc3NfnTDUVA5Z5yfLijFOkHIHr4vo/C9bjnw==} + '@eth-optimism/sdk@3.3.1(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(utf-8-validate@5.0.7)': dependencies: - '@react-native-community/cli-tools': 12.3.0 - chalk: 4.1.2 - execa: 5.1.1 - fast-xml-parser: 4.3.2 - glob: 7.2.3 - logkitty: 0.7.1 + '@eth-optimism/contracts': 0.6.0(bufferutil@4.0.8)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(utf-8-validate@5.0.7) + '@eth-optimism/core-utils': 0.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + lodash: 4.17.21 + merkletreejs: 0.3.11 + rlp: 2.2.7 + semver: 7.6.0 transitivePeerDependencies: + - bufferutil - encoding - dev: true + - utf-8-validate - /@react-native-community/cli-platform-ios@12.3.0: - resolution: {integrity: sha512-H95Sgt3wT7L8V75V0syFJDtv4YgqK5zbu69ko4yrXGv8dv2EBi6qZP0VMmkqXDamoPm9/U7tDTdbcf26ctnLfg==} + '@ethereum-waffle/chai@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))': dependencies: - '@react-native-community/cli-tools': 12.3.0 - chalk: 4.1.2 - execa: 5.1.1 - fast-xml-parser: 4.3.2 - glob: 7.2.3 - ora: 5.4.1 - transitivePeerDependencies: - - encoding - dev: true - - /@react-native-community/cli-plugin-metro@12.3.0: - resolution: {integrity: sha512-tYNHIYnNmxrBcsqbE2dAnLMzlKI3Cp1p1xUgTrNaOMsGPDN1epzNfa34n6Nps3iwKElSL7Js91CzYNqgTalucA==} - dev: true - - /@react-native-community/cli-server-api@12.3.0: - resolution: {integrity: sha512-Rode8NrdyByC+lBKHHn+/W8Zu0c+DajJvLmOWbe2WY/ECvnwcd9MHHbu92hlT2EQaJ9LbLhGrSbQE3cQy9EOCw==} - dependencies: - '@react-native-community/cli-debugger-ui': 12.3.0 - '@react-native-community/cli-tools': 12.3.0 - compression: 1.7.4 - connect: 3.7.0 - errorhandler: 1.5.1 - nocache: 3.0.4 - pretty-format: 26.6.2 - serve-static: 1.15.0 - ws: 7.5.9 + '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7)) + debug: 4.3.4(supports-color@8.1.1) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + json-bigint: 1.0.0 transitivePeerDependencies: - - bufferutil - - encoding + - '@ensdomains/ens' + - '@ensdomains/resolver' - supports-color - - utf-8-validate - dev: true - /@react-native-community/cli-tools@12.3.0: - resolution: {integrity: sha512-2GafnCr8D88VdClwnm9KZfkEb+lzVoFdr/7ybqhdeYM0Vnt/tr2N+fM1EQzwI1DpzXiBzTYemw8GjRq+Utcz2Q==} + '@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(solc@0.8.15)(typechain@8.3.1(typescript@5.4.5))(typescript@5.4.5)': dependencies: - appdirsjs: 1.2.7 - chalk: 4.1.2 - find-up: 5.0.0 - mime: 2.6.0 + '@resolver-engine/imports': 0.3.3 + '@resolver-engine/imports-fs': 0.3.3 + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(typechain@8.3.1(typescript@5.4.5))(typescript@5.4.5) + '@types/mkdirp': 0.5.2 + '@types/node-fetch': 2.6.4 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + mkdirp: 0.5.6 node-fetch: 2.6.12 - open: 6.4.0 - ora: 5.4.1 - semver: 7.6.0 - shell-quote: 1.8.1 - sudo-prompt: 9.2.1 + solc: 0.8.15 + typechain: 8.3.1(typescript@5.4.5) transitivePeerDependencies: + - '@ethersproject/abi' + - '@ethersproject/providers' - encoding - dev: true + - supports-color + - typescript - /@react-native-community/cli-types@12.3.0: - resolution: {integrity: sha512-MgOkmrXH4zsGxhte4YqKL7d+N8ZNEd3w1wo56MZlhu5WabwCJh87wYpU5T8vyfujFLYOFuFK5jjlcbs8F4/WDw==} + '@ethereum-waffle/ens@4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))': dependencies: - joi: 17.11.0 - dev: true + '@ensdomains/ens': 0.4.5 + '@ensdomains/resolver': 0.2.4 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) - /@react-native-community/cli@12.3.0: - resolution: {integrity: sha512-XeQohi2E+S2+MMSz97QcEZ/bWpi8sfKiQg35XuYeJkc32Til2g0b97jRpn0/+fV0BInHoG1CQYWwHA7opMsrHg==} - engines: {node: '>=18'} - hasBin: true + '@ethereum-waffle/mock-contract@4.0.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))': dependencies: - '@react-native-community/cli-clean': 12.3.0 - '@react-native-community/cli-config': 12.3.0 - '@react-native-community/cli-debugger-ui': 12.3.0 - '@react-native-community/cli-doctor': 12.3.0 - '@react-native-community/cli-hermes': 12.3.0 - '@react-native-community/cli-plugin-metro': 12.3.0 - '@react-native-community/cli-server-api': 12.3.0 - '@react-native-community/cli-tools': 12.3.0 - '@react-native-community/cli-types': 12.3.0 - chalk: 4.1.2 - commander: 9.5.0 - deepmerge: 4.3.1 - execa: 5.1.1 - find-up: 4.1.0 - fs-extra: 8.1.0 - graceful-fs: 4.2.11 - prompts: 2.4.2 - semver: 7.6.0 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + + '@ethereum-waffle/provider@4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))': + dependencies: + '@ethereum-waffle/ens': 4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7)) + '@ganache/ethereum-options': 0.1.4 + debug: 4.3.4(supports-color@8.1.1) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + ganache: 7.4.3 transitivePeerDependencies: - - bufferutil - - encoding + - '@ensdomains/ens' + - '@ensdomains/resolver' - supports-color - - utf-8-validate - dev: true - /@react-native/assets-registry@0.73.1: - resolution: {integrity: sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg==} - engines: {node: '>=18'} - dev: true + '@ethereumjs/block@3.6.2': + dependencies: + '@ethereumjs/common': 2.6.4 + '@ethereumjs/tx': 3.5.1 + ethereumjs-util: 7.1.5 + merkle-patricia-tree: 4.2.4 + + '@ethereumjs/blockchain@5.5.2': + dependencies: + '@ethereumjs/block': 3.6.2 + '@ethereumjs/common': 2.6.4 + '@ethereumjs/ethash': 1.1.0 + debug: 4.3.4(supports-color@8.1.1) + ethereumjs-util: 7.1.5 + level-mem: 5.0.1 + lru-cache: 5.1.1 + semaphore-async-await: 1.5.1 + transitivePeerDependencies: + - supports-color + + '@ethereumjs/common@2.6.0': + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 - /@react-native/babel-plugin-codegen@0.71.3(@babel/preset-env@7.23.7): - resolution: {integrity: sha512-udPH9oWVTO0q7OJL672k7pmBzMA7Ei83hQwk/dxUlveTwjHz1ChHwMXhDJBhG/dNFijl9wcHrD1aXrI8WchZQg==} + '@ethereumjs/common@2.6.4': dependencies: - react-native-codegen: 0.71.6(@babel/preset-env@7.23.7) - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color - dev: true + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 - /@react-native/babel-preset@0.74.0(@babel/core@7.22.10)(@babel/preset-env@7.23.7): - resolution: {integrity: sha512-k+1aaYQeLn+GBmGA5Qs3NKI8uzhLvRRMML+pB/+43ZL6DvCklbuJ5KO5oqRRpF3KZ2t/VKUqqSichpXfFrXGjg==} - engines: {node: '>=18'} - peerDependencies: - '@babel/core': '*' + '@ethereumjs/ethash@1.1.0': dependencies: - '@babel/core': 7.22.10 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.10) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-export-default-from': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.10) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.10) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.22.10) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-runtime': 7.23.7(@babel/core@7.22.10) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.22.10) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.22.10) - '@babel/template': 7.22.15 - '@react-native/babel-plugin-codegen': 0.71.3(@babel/preset-env@7.23.7) - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.22.10) - react-refresh: 0.14.0 - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color - dev: true + '@ethereumjs/block': 3.6.2 + '@types/levelup': 4.3.3 + buffer-xor: 2.0.2 + ethereumjs-util: 7.1.5 + miller-rabin: 4.0.1 - /@react-native/codegen@0.73.2(@babel/preset-env@7.23.7): - resolution: {integrity: sha512-lfy8S7umhE3QLQG5ViC4wg5N1Z+E6RnaeIw8w1voroQsXXGPB72IBozh8dAHR3+ceTxIU0KX3A8OpJI8e1+HpQ==} - engines: {node: '>=18'} - peerDependencies: - '@babel/preset-env': ^7.1.6 + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/tx@3.4.0': dependencies: - '@babel/parser': 7.23.6 - '@babel/preset-env': 7.23.7(@babel/core@7.22.10) - flow-parser: 0.206.0 - glob: 7.2.3 - invariant: 2.2.4 - jscodeshift: 0.14.0(@babel/preset-env@7.23.7) - mkdirp: 0.5.6 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - dev: true + '@ethereumjs/common': 2.6.4 + ethereumjs-util: 7.1.5 - /@react-native/community-cli-plugin@0.73.11(@babel/core@7.22.10)(@babel/preset-env@7.23.7): - resolution: {integrity: sha512-s0bprwljKS1Al8wOKathDDmRyF+70CcNE2G/aqZ7+L0NoOE0Uxxx/5P2BxlM2Mfht7O33B4SeMNiPdE/FqIubQ==} - engines: {node: '>=18'} + '@ethereumjs/tx@3.5.1': dependencies: - '@react-native-community/cli-server-api': 12.3.0 - '@react-native-community/cli-tools': 12.3.0 - '@react-native/dev-middleware': 0.73.6 - '@react-native/metro-babel-transformer': 0.73.12(@babel/core@7.22.10)(@babel/preset-env@7.23.7) - chalk: 4.1.2 - execa: 5.1.1 - metro: 0.80.3 - metro-config: 0.80.3 - metro-core: 0.80.3 - node-fetch: 2.6.12 - readline: 1.3.0 - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true + '@ethereumjs/common': 2.6.4 + ethereumjs-util: 7.1.5 - /@react-native/debugger-frontend@0.73.3: - resolution: {integrity: sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw==} - engines: {node: '>=18'} - dev: true + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.1.2 + micro-ftch: 0.3.1 - /@react-native/dev-middleware@0.73.6: - resolution: {integrity: sha512-9SD7gIso+hO1Jy1Y/Glbd+JWQwyH7Xjnwebtkxdm5TMB51LQPjaGtMcwEigbIZyAtvoaDGmhWmudwbKpDlS+gA==} - engines: {node: '>=18'} + '@ethereumjs/vm@5.6.0': dependencies: - '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.73.3 - chrome-launcher: 0.15.2 - chromium-edge-launcher: 1.0.0 - connect: 3.7.0 + '@ethereumjs/block': 3.6.2 + '@ethereumjs/blockchain': 5.5.2 + '@ethereumjs/common': 2.6.4 + '@ethereumjs/tx': 3.5.1 + async-eventemitter: 0.2.4 + core-js-pure: 3.16.2 debug: 2.6.9 - node-fetch: 2.6.12 - open: 7.4.2 - serve-static: 1.15.0 - temp-dir: 2.0.0 + ethereumjs-util: 7.1.5 + functional-red-black-tree: 1.0.1 + mcl-wasm: 0.7.8 + merkle-patricia-tree: 4.2.4 + rustbn.js: 0.2.0 transitivePeerDependencies: - - encoding - supports-color - dev: true - /@react-native/gradle-plugin@0.73.4: - resolution: {integrity: sha512-PMDnbsZa+tD55Ug+W8CfqXiGoGneSSyrBZCMb5JfiB3AFST3Uj5e6lw8SgI/B6SKZF7lG0BhZ6YHZsRZ5MlXmg==} - engines: {node: '>=18'} - dev: true + '@ethersproject/abi@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 - /@react-native/js-polyfills@0.73.1: - resolution: {integrity: sha512-ewMwGcumrilnF87H4jjrnvGZEaPFCAC4ebraEK+CurDDmwST/bIicI4hrOAv+0Z0F7DEK4O4H7r8q9vH7IbN4g==} - engines: {node: '>=18'} - dev: true + '@ethersproject/abstract-provider@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 - /@react-native/metro-babel-transformer@0.73.12(@babel/core@7.22.10)(@babel/preset-env@7.23.7): - resolution: {integrity: sha512-VmxN5aaoOprzDzUR+8c3XYhG0FoMOO6n0ToylCW6EeZCuf5RTY7HWVOhacabGoB1mHrWzJ0wWEsqX+eD4iFxoA==} - engines: {node: '>=18'} - peerDependencies: - '@babel/core': '*' + '@ethersproject/abstract-signer@5.7.0': dependencies: - '@babel/core': 7.22.10 - '@react-native/babel-preset': 0.74.0(@babel/core@7.22.10)(@babel/preset-env@7.23.7) - babel-preset-fbjs: 3.4.0(@babel/core@7.22.10) - hermes-parser: 0.15.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color - dev: true + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 - /@react-native/normalize-colors@0.73.2: - resolution: {integrity: sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==} - dev: true + '@ethersproject/address@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 - /@react-native/virtualized-lists@0.73.4(react-native@0.73.1): - resolution: {integrity: sha512-HpmLg1FrEiDtrtAbXiwCgXFYyloK/dOIPIuWW3fsqukwJEWAiTzm1nXGJ7xPU5XTHiWZ4sKup5Ebaj8z7iyWog==} - engines: {node: '>=18'} - peerDependencies: - react-native: '*' + '@ethersproject/base64@5.7.0': dependencies: - invariant: 2.2.4 - nullthrows: 1.1.1 - react-native: 0.73.1(@babel/core@7.22.10)(@babel/preset-env@7.23.7)(react@18.2.0) - dev: true + '@ethersproject/bytes': 5.7.0 - /@resolver-engine/core@0.3.3: - resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==} + '@ethersproject/basex@5.7.0': dependencies: - debug: 3.2.7 - is-url: 1.2.4 - request: 2.88.2 - transitivePeerDependencies: - - supports-color - dev: true + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 - /@resolver-engine/fs@0.3.3: - resolution: {integrity: sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==} + '@ethersproject/bignumber@5.7.0': dependencies: - '@resolver-engine/core': 0.3.3 - debug: 3.2.7 - transitivePeerDependencies: - - supports-color - dev: true + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 - /@resolver-engine/imports-fs@0.3.3: - resolution: {integrity: sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==} + '@ethersproject/bytes@5.7.0': dependencies: - '@resolver-engine/fs': 0.3.3 - '@resolver-engine/imports': 0.3.3 - debug: 3.2.7 - transitivePeerDependencies: - - supports-color - dev: true + '@ethersproject/logger': 5.7.0 - /@resolver-engine/imports@0.3.3: - resolution: {integrity: sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==} + '@ethersproject/constants@5.7.0': dependencies: - '@resolver-engine/core': 0.3.3 - debug: 3.2.7 - hosted-git-info: 2.8.9 - path-browserify: 1.0.1 - url: 0.11.1 - transitivePeerDependencies: - - supports-color - dev: true + '@ethersproject/bignumber': 5.7.0 - /@rollup/rollup-android-arm-eabi@4.5.1: - resolution: {integrity: sha512-YaN43wTyEBaMqLDYeze+gQ4ZrW5RbTEGtT5o1GVDkhpdNcsLTnLRcLccvwy3E9wiDKWg9RIhuoy3JQKDRBfaZA==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ethersproject/contracts@5.7.0': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 - /@rollup/rollup-android-arm64@4.5.1: - resolution: {integrity: sha512-n1bX+LCGlQVuPlCofO0zOKe1b2XkFozAVRoczT+yxWZPGnkEAKTTYVOGZz8N4sKuBnKMxDbfhUsB1uwYdup/sw==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ethersproject/hash@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 - /@rollup/rollup-darwin-arm64@4.5.1: - resolution: {integrity: sha512-QqJBumdvfBqBBmyGHlKxje+iowZwrHna7pokj/Go3dV1PJekSKfmjKrjKQ/e6ESTGhkfPNLq3VXdYLAc+UtAQw==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@ethersproject/hdnode@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 - /@rollup/rollup-darwin-x64@4.5.1: - resolution: {integrity: sha512-RrkDNkR/P5AEQSPkxQPmd2ri8WTjSl0RYmuFOiEABkEY/FSg0a4riihWQGKDJ4LnV9gigWZlTMx2DtFGzUrYQw==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@ethersproject/json-wallets@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 - /@rollup/rollup-linux-arm-gnueabihf@4.5.1: - resolution: {integrity: sha512-ZFPxvUZmE+fkB/8D9y/SWl/XaDzNSaxd1TJUSE27XAKlRpQ2VNce/86bGd9mEUgL3qrvjJ9XTGwoX0BrJkYK/A==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@ethersproject/keccak256@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 - /@rollup/rollup-linux-arm64-gnu@4.5.1: - resolution: {integrity: sha512-FEuAjzVIld5WVhu+M2OewLmjmbXWd3q7Zcx+Rwy4QObQCqfblriDMMS7p7+pwgjZoo9BLkP3wa9uglQXzsB9ww==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@ethersproject/logger@5.7.0': {} - /@rollup/rollup-linux-arm64-musl@4.5.1: - resolution: {integrity: sha512-f5Gs8WQixqGRtI0Iq/cMqvFYmgFzMinuJO24KRfnv7Ohi/HQclwrBCYkzQu1XfLEEt3DZyvveq9HWo4bLJf1Lw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@ethersproject/networks@5.7.1': + dependencies: + '@ethersproject/logger': 5.7.0 - /@rollup/rollup-linux-x64-gnu@4.5.1: - resolution: {integrity: sha512-CWPkPGrFfN2vj3mw+S7A/4ZaU3rTV7AkXUr08W9lNP+UzOvKLVf34tWCqrKrfwQ0NTk5GFqUr2XGpeR2p6R4gw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@ethersproject/pbkdf2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 - /@rollup/rollup-linux-x64-musl@4.5.1: - resolution: {integrity: sha512-ZRETMFA0uVukUC9u31Ed1nx++29073goCxZtmZARwk5aF/ltuENaeTtRVsSQzFlzdd4J6L3qUm+EW8cbGt0CKQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@ethersproject/properties@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 - /@rollup/rollup-win32-arm64-msvc@4.5.1: - resolution: {integrity: sha512-ihqfNJNb2XtoZMSCPeoo0cYMgU04ksyFIoOw5S0JUVbOhafLot+KD82vpKXOurE2+9o/awrqIxku9MRR9hozHQ==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7)': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.7) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethersproject/random@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/rlp@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 - /@rollup/rollup-win32-ia32-msvc@4.5.1: - resolution: {integrity: sha512-zK9MRpC8946lQ9ypFn4gLpdwr5a01aQ/odiIJeL9EbgZDMgbZjjT/XzTqJvDfTmnE1kHdbG20sAeNlpc91/wbg==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@ethersproject/sha2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 - /@rollup/rollup-win32-x64-msvc@4.5.1: - resolution: {integrity: sha512-5I3Nz4Sb9TYOtkRwlH0ow+BhMH2vnh38tZ4J4mggE48M/YyJyp/0sPSxhw1UeS1+oBgQ8q7maFtSeKpeRJu41Q==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@ethersproject/signing-key@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 - /@safe-global/safe-apps-provider@0.18.1(typescript@5.3.3): - resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} + '@ethersproject/solidity@5.7.0': dependencies: - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.3.3) - events: 3.3.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - dev: true + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 - /@safe-global/safe-apps-sdk@8.1.0(typescript@5.3.3): - resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} + '@ethersproject/strings@5.7.0': dependencies: - '@safe-global/safe-gateway-typescript-sdk': 3.7.3 - viem: 1.20.3(typescript@5.3.3) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - dev: true + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 - /@safe-global/safe-gateway-typescript-sdk@3.7.3: - resolution: {integrity: sha512-O6JCgXNZWG0Vv8FnOEjKfcbsP0WxGvoPJk5ufqUrsyBlHup16It6oaLnn+25nXFLBZOHI1bz8429JlqAc2t2hg==} + '@ethersproject/transactions@5.7.0': dependencies: - cross-fetch: 3.1.8 - transitivePeerDependencies: - - encoding - dev: true + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 - /@scure/base@1.1.3: - resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + '@ethersproject/units@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 - /@scure/bip32@1.1.5: - resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + '@ethersproject/wallet@5.7.0': dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.3 - dev: true + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 - /@scure/bip32@1.3.1: - resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + '@ethersproject/web@5.7.1': dependencies: - '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.3 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 - /@scure/bip32@1.3.2: - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + '@ethersproject/wordlists@5.7.0': dependencies: - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.3 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 - /@scure/bip39@1.1.1: - resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + '@ganache/ethereum-address@0.1.4': dependencies: - '@noble/hashes': 1.2.0 - '@scure/base': 1.1.3 - dev: true + '@ganache/utils': 0.1.4 - /@scure/bip39@1.2.1: - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + '@ganache/ethereum-options@0.1.4': dependencies: - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.3 + '@ganache/ethereum-address': 0.1.4 + '@ganache/ethereum-utils': 0.1.4 + '@ganache/options': 0.1.4 + '@ganache/utils': 0.1.4 + bip39: 3.0.4 + seedrandom: 3.0.5 + transitivePeerDependencies: + - supports-color - /@sentry-internal/tracing@7.99.0: - resolution: {integrity: sha512-z3JQhHjoM1KdM20qrHwRClKJrNLr2CcKtCluq7xevLtXHJWNAQQbafnWD+Aoj85EWXBzKt9yJMv2ltcXJ+at+w==} - engines: {node: '>=8'} + '@ganache/ethereum-utils@0.1.4': dependencies: - '@sentry/core': 7.99.0 - '@sentry/types': 7.99.0 - '@sentry/utils': 7.99.0 - dev: false + '@ethereumjs/common': 2.6.0 + '@ethereumjs/tx': 3.4.0 + '@ethereumjs/vm': 5.6.0 + '@ganache/ethereum-address': 0.1.4 + '@ganache/rlp': 0.1.4 + '@ganache/utils': 0.1.4 + emittery: 0.10.0 + ethereumjs-abi: 0.6.8 + ethereumjs-util: 7.1.3 + transitivePeerDependencies: + - supports-color - /@sentry/core@5.30.0: - resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} - engines: {node: '>=6'} + '@ganache/options@0.1.4': dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - dev: true + '@ganache/utils': 0.1.4 + bip39: 3.0.4 + seedrandom: 3.0.5 - /@sentry/core@7.99.0: - resolution: {integrity: sha512-vOAtzcAXEUtS/oW7wi3wMkZ3hsb5Ch96gKyrrj/mXdOp2zrcwdNV6N9/pawq2E9P/7Pw8AXw4CeDZztZrjQLuA==} - engines: {node: '>=8'} + '@ganache/rlp@0.1.4': dependencies: - '@sentry/types': 7.99.0 - '@sentry/utils': 7.99.0 - dev: false + '@ganache/utils': 0.1.4 + rlp: 2.2.6 - /@sentry/hub@5.30.0: - resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} - engines: {node: '>=6'} + '@ganache/utils@0.1.4': dependencies: - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - dev: true + emittery: 0.10.0 + keccak: 3.0.1 + seedrandom: 3.0.5 + optionalDependencies: + '@trufflesuite/bigint-buffer': 1.1.9 - /@sentry/minimal@5.30.0: - resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} - engines: {node: '>=6'} + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': dependencies: - '@sentry/hub': 5.30.0 - '@sentry/types': 5.30.0 - tslib: 1.14.1 - dev: true + '@hapi/hoek': 9.3.0 - /@sentry/node@5.30.0: - resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} - engines: {node: '>=6'} + '@humanwhocodes/config-array@0.11.13': dependencies: - '@sentry/core': 5.30.0 - '@sentry/hub': 5.30.0 - '@sentry/tracing': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - cookie: 0.4.1 - https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 1.14.1 + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@sentry/node@7.99.0: - resolution: {integrity: sha512-34wYtLddnPcQ8qvKq62AfxowaMFw+GMUZGv7fIs9FxeBqqqn6Ckl0gFCTADudIIBQ3rSbmN7sHJIXdyiQv+pcw==} - engines: {node: '>=8'} + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.1': {} + + '@isaacs/cliui@8.0.2': dependencies: - '@sentry-internal/tracing': 7.99.0 - '@sentry/core': 7.99.0 - '@sentry/types': 7.99.0 - '@sentry/utils': 7.99.0 - dev: false + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@sentry/tracing@5.30.0: - resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} - engines: {node: '>=6'} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - dev: true + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 - /@sentry/types@5.30.0: - resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} - engines: {node: '>=6'} - dev: true + '@istanbuljs/schema@0.1.3': {} - /@sentry/types@7.99.0: - resolution: {integrity: sha512-94qwOw4w40sAs5mCmzcGyj8ZUu/KhnWnuMZARRq96k+SjRW/tHFAOlIdnFSrt3BLPvSOK7R3bVAskZQ0N4FTmA==} - engines: {node: '>=8'} - dev: false + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 - /@sentry/utils@5.30.0: - resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} - engines: {node: '>=6'} + '@jridgewell/gen-mapping@0.3.3': dependencies: - '@sentry/types': 5.30.0 - tslib: 1.14.1 - dev: true + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 - /@sentry/utils@7.99.0: - resolution: {integrity: sha512-cYZy5WNTkWs5GgggGnjfGqC44CWir0pAv4GVVSx0fsup4D4pMKBJPrtub15f9uC+QkUf3vVkqwpBqeFxtmJQTQ==} - engines: {node: '>=8'} + '@jridgewell/resolve-uri@3.1.1': {} + + '@jridgewell/set-array@1.1.2': {} + + '@jridgewell/source-map@0.3.5': dependencies: - '@sentry/types': 7.99.0 - dev: false + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + optional: true - /@sideway/address@4.1.4: - resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.19': dependencies: - '@hapi/hoek': 9.3.0 - dev: true + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 - /@sideway/formula@3.0.1: - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - dev: true + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 - /@sideway/pinpoint@2.0.0: - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - dev: true + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.23.7 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.23.7 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 - /@sinonjs/commons@1.8.3: - resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} + '@metamask/eth-sig-util@4.0.0': dependencies: - type-detect: 4.0.8 - dev: true + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: - type-detect: 4.0.8 - dev: true + eslint-scope: 5.1.1 + + '@noble/curves@1.1.0': + dependencies: + '@noble/hashes': 1.3.1 + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.0 - dev: true + '@noble/hashes@1.2.0': {} - /@sinonjs/fake-timers@7.1.2: - resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} - dependencies: - '@sinonjs/commons': 1.8.3 - dev: true + '@noble/hashes@1.3.1': {} - /@socket.io/component-emitter@3.1.0: - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - dev: true + '@noble/hashes@1.3.2': {} - /@stablelib/aead@1.0.1: - resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} - dev: true + '@noble/secp256k1@1.7.1': {} - /@stablelib/binary@1.0.1: - resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + '@nodelib/fs.scandir@2.1.5': dependencies: - '@stablelib/int': 1.0.1 - dev: true + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - /@stablelib/bytes@1.0.1: - resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /@stablelib/chacha20poly1305@1.0.1: - resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} + '@nodelib/fs.walk@1.2.8': dependencies: - '@stablelib/aead': 1.0.1 - '@stablelib/binary': 1.0.1 - '@stablelib/chacha': 1.0.1 - '@stablelib/constant-time': 1.0.1 - '@stablelib/poly1305': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: true + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 - /@stablelib/chacha@1.0.1: - resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} + '@nomicfoundation/ethereumjs-block@5.0.4': dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: true - - /@stablelib/constant-time@1.0.1: - resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} - dev: true + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-trie': 6.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 + transitivePeerDependencies: + - c-kzg - /@stablelib/ed25519@1.0.3: - resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} + '@nomicfoundation/ethereumjs-blockchain@7.0.4': dependencies: - '@stablelib/random': 1.0.2 - '@stablelib/sha512': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: true + '@nomicfoundation/ethereumjs-block': 5.0.4 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-ethash': 3.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-trie': 6.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + lru-cache: 10.1.0 + transitivePeerDependencies: + - c-kzg + - supports-color - /@stablelib/hash@1.0.1: - resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} - dev: true + '@nomicfoundation/ethereumjs-common@4.0.4': + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.4 + transitivePeerDependencies: + - c-kzg - /@stablelib/hkdf@1.0.1: - resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} + '@nomicfoundation/ethereumjs-ethash@3.0.4': dependencies: - '@stablelib/hash': 1.0.1 - '@stablelib/hmac': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: true + '@nomicfoundation/ethereumjs-block': 5.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + bigint-crypto-utils: 3.3.0 + ethereum-cryptography: 0.1.3 + transitivePeerDependencies: + - c-kzg - /@stablelib/hmac@1.0.1: - resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} + '@nomicfoundation/ethereumjs-evm@2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2)': dependencies: - '@stablelib/constant-time': 1.0.1 - '@stablelib/hash': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: true + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-statemanager': 2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@types/debug': 4.1.12 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + rustbn-wasm: 0.2.0 + transitivePeerDependencies: + - '@nomicfoundation/ethereumjs-verkle' + - c-kzg + - supports-color - /@stablelib/int@1.0.1: - resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} - dev: true + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} - /@stablelib/keyagreement@1.0.1: - resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} + '@nomicfoundation/ethereumjs-statemanager@2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2)': dependencies: - '@stablelib/bytes': 1.0.1 - dev: true + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-trie': 6.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + js-sdsl: 4.4.2 + lru-cache: 10.1.0 + optionalDependencies: + '@nomicfoundation/ethereumjs-verkle': 0.0.2 + transitivePeerDependencies: + - c-kzg + - supports-color - /@stablelib/poly1305@1.0.1: - resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} + '@nomicfoundation/ethereumjs-trie@6.0.4': dependencies: - '@stablelib/constant-time': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: true + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@types/readable-stream': 2.3.15 + ethereum-cryptography: 0.1.3 + lru-cache: 10.1.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - c-kzg - /@stablelib/random@1.0.2: - resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + '@nomicfoundation/ethereumjs-tx@5.0.4': dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: true + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 - /@stablelib/sha256@1.0.1: - resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} + '@nomicfoundation/ethereumjs-util@9.0.4': dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/hash': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: true + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + ethereum-cryptography: 0.1.3 - /@stablelib/sha512@1.0.1: - resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} + '@nomicfoundation/ethereumjs-verkle@0.0.2': dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/hash': 1.0.1 - '@stablelib/wipe': 1.0.1 - dev: true - - /@stablelib/wipe@1.0.1: - resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} - dev: true + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + lru-cache: 10.1.0 + rust-verkle-wasm: 0.0.1 + transitivePeerDependencies: + - c-kzg - /@stablelib/x25519@1.0.3: - resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + '@nomicfoundation/ethereumjs-vm@7.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2)': dependencies: - '@stablelib/keyagreement': 1.0.1 - '@stablelib/random': 1.0.2 - '@stablelib/wipe': 1.0.1 - dev: true + '@nomicfoundation/ethereumjs-block': 5.0.4 + '@nomicfoundation/ethereumjs-blockchain': 7.0.4 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-evm': 2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-statemanager': 2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) + '@nomicfoundation/ethereumjs-trie': 6.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + transitivePeerDependencies: + - '@nomicfoundation/ethereumjs-verkle' + - c-kzg + - supports-color - /@swc/core-darwin-arm64@1.4.6: - resolution: {integrity: sha512-bpggpx/BfLFyy48aUKq1PsNUxb7J6CINlpAUk0V4yXfmGnpZH80Gp1pM3GkFDQyCfq7L7IpjPrIjWQwCrL4hYw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': optional: true - /@swc/core-darwin-x64@1.4.6: - resolution: {integrity: sha512-vJn+/ZuBTg+vtNkcmgZdH6FQpa0hFVdnB9bAeqYwKkyqP15zaPe6jfC+qL2y/cIeC7ASvHXEKrnCZgBLxfVQ9w==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': optional: true - /@swc/core-linux-arm-gnueabihf@1.4.6: - resolution: {integrity: sha512-hEmYcB/9XBAl02MtuVHszhNjQpjBzhk/NFulnU33tBMbNZpy2TN5yTsitezMq090QXdDz8sKIALApDyg07ZR8g==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': optional: true - /@swc/core-linux-arm64-gnu@1.4.6: - resolution: {integrity: sha512-/UCYIVoGpm2YVvGHZM2QOA3dexa28BjcpLAIYnoCbgH5f7ulDhE8FAIO/9pasj+kixDBsdqewHfsNXFYlgGJjQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': optional: true - /@swc/core-linux-arm64-musl@1.4.6: - resolution: {integrity: sha512-LGQsKJ8MA9zZ8xHCkbGkcPSmpkZL2O7drvwsGKynyCttHhpwVjj9lguhD4DWU3+FWIsjvho5Vu0Ggei8OYi/Lw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': optional: true - /@swc/core-linux-x64-gnu@1.4.6: - resolution: {integrity: sha512-10JL2nLIreMQDKvq2TECnQe5fCuoqBHu1yW8aChqgHUyg9d7gfZX/kppUsuimqcgRBnS0AjTDAA+JF6UsG/2Yg==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': optional: true - /@swc/core-linux-x64-musl@1.4.6: - resolution: {integrity: sha512-EGyjFVzVY6Do89x8sfah7I3cuP4MwtwzmA6OlfD/KASqfCFf5eIaEBMbajgR41bVfMV7lK72lwAIea5xEyq1AQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': optional: true - /@swc/core-win32-arm64-msvc@1.4.6: - resolution: {integrity: sha512-gfW9AuXvwSyK07Vb8Y8E9m2oJZk21WqcD+X4BZhkbKB0TCZK0zk1j/HpS2UFlr1JB2zPKPpSWLU3ll0GEHRG2A==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': optional: true - /@swc/core-win32-ia32-msvc@1.4.6: - resolution: {integrity: sha512-ZuQm81FhhvNVYtVb9GfZ+Du6e7fZlkisWvuCeBeRiyseNt1tcrQ8J3V67jD2nxje8CVXrwG3oUIbPcybv2rxfQ==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': optional: true - /@swc/core-win32-x64-msvc@1.4.6: - resolution: {integrity: sha512-UagPb7w5V0uzWSjrXwOavGa7s9iv3wrVdEgWy+/inm0OwY4lj3zpK9qDnMWAwYLuFwkI3UG4Q3dH8wD+CUUcjw==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': optional: true - /@swc/core@1.4.6: - resolution: {integrity: sha512-A7iK9+1qzTCIuc3IYcS8gPHCm9bZVKUJrfNnwveZYyo6OFp3jLno4WOM2yBy5uqedgYATEiWgBYHKq37KrU6IA==} - engines: {node: '>=10'} - requiresBuild: true - peerDependencies: - '@swc/helpers': ^0.5.0 - peerDependenciesMeta: - '@swc/helpers': - optional: true - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.5 + '@nomicfoundation/solidity-analyzer@0.1.1': optionalDependencies: - '@swc/core-darwin-arm64': 1.4.6 - '@swc/core-darwin-x64': 1.4.6 - '@swc/core-linux-arm-gnueabihf': 1.4.6 - '@swc/core-linux-arm64-gnu': 1.4.6 - '@swc/core-linux-arm64-musl': 1.4.6 - '@swc/core-linux-x64-gnu': 1.4.6 - '@swc/core-linux-x64-musl': 1.4.6 - '@swc/core-win32-arm64-msvc': 1.4.6 - '@swc/core-win32-ia32-msvc': 1.4.6 - '@swc/core-win32-x64-msvc': 1.4.6 - dev: true - - /@swc/counter@0.1.3: - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - dev: true - - /@swc/types@0.1.5: - resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} - dev: true - - /@tanstack/query-core@5.17.1: - resolution: {integrity: sha512-kUXozQmU7NBtzX5dM6qfFNZN+YK/9Ct37hnG/ogdgI4mExIx7VH/qRepsPhKfNrJz2w81/JykmM3Uug6sVpUSw==} - dev: true - - /@tanstack/react-query@5.17.1(react@18.2.0): - resolution: {integrity: sha512-4JYgX0kU+pvwVQi5eRiHGvBK7WnahEl6lmaxd32ZVSKmByAxLgaewoxBR03cdDNse8lUD2zGOe0sx3M/EGRlmA==} - peerDependencies: - react: ^18.0.0 - dependencies: - '@tanstack/query-core': 5.17.1 - react: 18.2.0 - dev: true - - /@testing-library/dom@9.3.1: - resolution: {integrity: sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==} - engines: {node: '>=14'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/runtime': 7.23.7 - '@types/aria-query': 5.0.1 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - dev: false - - /@testing-library/jest-dom@6.4.2(vitest@1.2.2): - resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true - dependencies: - '@adobe/css-tools': 4.3.2 - '@babel/runtime': 7.23.7 - aria-query: 5.3.0 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - vitest: 1.2.2(@types/node@20.11.17)(jsdom@24.0.0) - dev: true + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 - /@testing-library/react-hooks@8.0.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==} - engines: {node: '>=12'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 - react: ^16.9.0 || ^17.0.0 - react-dom: ^16.9.0 || ^17.0.0 - react-test-renderer: ^16.9.0 || ^17.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - react-dom: - optional: true - react-test-renderer: - optional: true + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7))': dependencies: - '@babel/runtime': 7.22.6 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-error-boundary: 3.1.4(react@18.2.0) - dev: true + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + hardhat: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7) - /@testing-library/react-hooks@8.0.1(react@17.0.2): - resolution: {integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==} - engines: {node: '>=12'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 - react: ^16.9.0 || ^17.0.0 - react-dom: ^16.9.0 || ^17.0.0 - react-test-renderer: ^16.9.0 || ^17.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - react-dom: - optional: true - react-test-renderer: - optional: true + '@nomiclabs/hardhat-waffle@2.0.1(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7)))(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(typescript@5.4.5))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7))': dependencies: - '@babel/runtime': 7.22.6 - react: 17.0.2 - react-error-boundary: 3.1.4(react@17.0.2) - dev: true + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7)) + '@types/sinon-chai': 3.2.5 + '@types/web3': 1.0.19 + ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(typescript@5.4.5) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + hardhat: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7) - /@testing-library/react@14.2.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7)))(@types/sinon-chai@3.2.5)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(typescript@5.4.5))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7))': dependencies: - '@babel/runtime': 7.23.7 - '@testing-library/dom': 9.3.1 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@textlint/ast-node-types@12.2.1: - resolution: {integrity: sha512-NXYza6aG1+LdZ4g83gjRhDht+gdrTjJYkdcQhpvzNCtTar/sVpaykkauRcAKLhkIWrQpfb311pfMlU6qNDW76Q==} - dev: true + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7)) + '@types/sinon-chai': 3.2.5 + ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(typescript@5.4.5) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + hardhat: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7) - /@textlint/markdown-to-ast@12.2.1: - resolution: {integrity: sha512-p+LlVcrgHnSNEWWflYU412uu+v4Cejs6hmI4SgZCheNg4u7Ik78aKgpe4jT5BhjLSBZ/KP6IrJxtCUOoJIUWmQ==} + '@nrwl/nx-cloud@18.0.0': dependencies: - '@textlint/ast-node-types': 12.2.1 - debug: 4.3.4(supports-color@8.1.1) - remark-footnotes: 3.0.0 - remark-frontmatter: 3.0.0 - remark-gfm: 1.0.0 - remark-parse: 9.0.0 - traverse: 0.6.6 - unified: 9.2.2 + nx-cloud: 18.0.0 transitivePeerDependencies: - - supports-color - dev: true + - debug - /@trufflesuite/bigint-buffer@1.1.10: - resolution: {integrity: sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==} - engines: {node: '>= 14.0.0'} - requiresBuild: true + '@nrwl/tao@18.2.2(@swc/core@1.4.13)': dependencies: - node-gyp-build: 4.4.0 - dev: true + nx: 18.2.2(@swc/core@1.4.13) + tslib: 2.6.2 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - debug - /@trufflesuite/bigint-buffer@1.1.9: - resolution: {integrity: sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==} - engines: {node: '>= 10.0.0'} - requiresBuild: true - dependencies: - node-gyp-build: 4.3.0 - dev: true + '@nx/nx-darwin-arm64@18.2.2': optional: true - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: true - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: true - - /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.3.3): - resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} - peerDependencies: - '@ethersproject/abi': ^5.0.0 - '@ethersproject/providers': ^5.0.0 - ethers: ^5.1.3 - typechain: ^8.1.1 - typescript: '>=4.3.0' - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - ethers: 5.7.2 - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.3.3) - typechain: 8.3.1(typescript@5.3.3) - typescript: 5.3.3 - dev: true - - /@types/abstract-leveldown@5.0.2: - resolution: {integrity: sha512-+jA1XXF3jsz+Z7FcuiNqgK53hTa/luglT2TyTpKPqoYbxVY+mCPF22Rm+q3KPBrMHJwNXFrTViHszBOfU4vftQ==} - dev: true - - /@types/aria-query@5.0.1: - resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} - dev: false - - /@types/bn.js@4.11.6: - resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} - dependencies: - '@types/node': 20.11.17 - dev: true - - /@types/bn.js@5.1.0: - resolution: {integrity: sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==} - dependencies: - '@types/node': 20.11.17 - dev: true - - /@types/body-parser@1.19.1: - resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==} - dependencies: - '@types/connect': 3.4.35 - '@types/node': 20.11.17 + '@nx/nx-darwin-x64@18.2.2': + optional: true - /@types/chai-as-promised@7.1.8: - resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - dependencies: - '@types/chai': 4.3.11 - dev: true + '@nx/nx-freebsd-x64@18.2.2': + optional: true - /@types/chai@4.3.11: - resolution: {integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==} - dev: true + '@nx/nx-linux-arm-gnueabihf@18.2.2': + optional: true - /@types/change-case@2.3.1: - resolution: {integrity: sha512-HYiGjhmGInNzJjtt6ciXEfl2s8ZQGUQpPiwgWSth1fycE69hXbV/RgWH7MvSq2QPhMBzi4SGhu1vE+cMx1xB8g==} - deprecated: This is a stub types definition for change-case (https://github.com/blakeembrey/change-case). change-case provides its own type definitions, so you don't need @types/change-case installed! - dependencies: - change-case: 4.1.2 - dev: false + '@nx/nx-linux-arm64-gnu@18.2.2': + optional: true - /@types/chrome@0.0.136: - resolution: {integrity: sha512-XDEiRhLkMd+SB7Iw3ZUIj/fov3wLd4HyTdLltVszkgl1dBfc3Rb7oPMVZ2Mz2TLqnF7Ow+StbR8E7r9lqpb4DA==} - dependencies: - '@types/filesystem': 0.0.35 - '@types/har-format': 1.2.15 - dev: true + '@nx/nx-linux-arm64-musl@18.2.2': + optional: true - /@types/connect@3.4.35: - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} - dependencies: - '@types/node': 20.11.17 + '@nx/nx-linux-x64-gnu@18.2.2': + optional: true - /@types/dateformat@5.0.0: - resolution: {integrity: sha512-SZg4JdHIWHQGEokbYGZSDvo5wA4TLYPXaqhigs/wH+REDOejcJzgH+qyY+HtEUtWOZxEUkbhbdYPqQDiEgrXeA==} - dev: false + '@nx/nx-linux-x64-musl@18.2.2': + optional: true - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - dependencies: - '@types/ms': 0.7.31 - dev: true + '@nx/nx-win32-arm64-msvc@18.2.2': + optional: true - /@types/dom-screen-wake-lock@1.0.3: - resolution: {integrity: sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw==} - dev: true + '@nx/nx-win32-x64-msvc@18.2.2': + optional: true - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + '@pkgjs/parseargs@0.11.0': + optional: true - /@types/express-serve-static-core@4.17.35: - resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + '@resolver-engine/core@0.3.3': dependencies: - '@types/node': 20.11.17 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 - '@types/send': 0.17.1 + debug: 3.2.7 + is-url: 1.2.4 + request: 2.88.2 + transitivePeerDependencies: + - supports-color - /@types/express@4.17.21: - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@resolver-engine/fs@0.3.3': dependencies: - '@types/body-parser': 1.19.1 - '@types/express-serve-static-core': 4.17.35 - '@types/qs': 6.9.7 - '@types/serve-static': 1.13.10 + '@resolver-engine/core': 0.3.3 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color - /@types/filesystem@0.0.35: - resolution: {integrity: sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==} + '@resolver-engine/imports-fs@0.3.3': dependencies: - '@types/filewriter': 0.0.32 - dev: true - - /@types/filewriter@0.0.32: - resolution: {integrity: sha512-Kpi2GXQyYJdjL8mFclL1eDgihn1SIzorMZjD94kdPZh9E4VxGOeyjPxi5LpsM4Zku7P0reqegZTt2GxhmA9VBg==} - dev: true + '@resolver-engine/fs': 0.3.3 + '@resolver-engine/imports': 0.3.3 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color - /@types/glob@8.1.0: - resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + '@resolver-engine/imports@0.3.3': dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 20.11.16 - dev: true - - /@types/har-format@1.2.15: - resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} - dev: true + '@resolver-engine/core': 0.3.3 + debug: 3.2.7 + hosted-git-info: 2.8.9 + path-browserify: 1.0.1 + url: 0.11.1 + transitivePeerDependencies: + - supports-color - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true + '@rollup/rollup-android-arm-eabi@4.5.1': + optional: true - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - dev: true + '@rollup/rollup-android-arm64@4.5.1': + optional: true - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 - dev: true + '@rollup/rollup-darwin-arm64@4.5.1': + optional: true - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true + '@rollup/rollup-darwin-x64@4.5.1': + optional: true - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-gnueabihf@4.5.1': + optional: true - /@types/level-errors@3.0.0: - resolution: {integrity: sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==} - dev: true + '@rollup/rollup-linux-arm64-gnu@4.5.1': + optional: true - /@types/levelup@4.3.3: - resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} - dependencies: - '@types/abstract-leveldown': 5.0.2 - '@types/level-errors': 3.0.0 - '@types/node': 20.11.17 - dev: true + '@rollup/rollup-linux-arm64-musl@4.5.1': + optional: true - /@types/lru-cache@5.1.1: - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - dev: true + '@rollup/rollup-linux-x64-gnu@4.5.1': + optional: true - /@types/mdast@3.0.10: - resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} - dependencies: - '@types/unist': 2.0.6 - dev: true + '@rollup/rollup-linux-x64-musl@4.5.1': + optional: true - /@types/mime@1.3.2: - resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + '@rollup/rollup-win32-arm64-msvc@4.5.1': + optional: true - /@types/minimatch@3.0.5: - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - dev: true + '@rollup/rollup-win32-ia32-msvc@4.5.1': + optional: true - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true + '@rollup/rollup-win32-x64-msvc@4.5.1': + optional: true - /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: false + '@scure/base@1.1.3': {} - /@types/mkdirp@0.5.2: - resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} + '@scure/bip32@1.1.5': dependencies: - '@types/node': 20.11.17 - dev: true - - /@types/mocha@10.0.6: - resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} - dev: true + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.3 - /@types/morgan@1.9.9: - resolution: {integrity: sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==} + '@scure/bip32@1.3.1': dependencies: - '@types/node': 20.11.16 - dev: true - - /@types/ms@0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: true + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 - /@types/node-fetch@2.6.4: - resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} + '@scure/bip32@1.3.2': dependencies: - '@types/node': 20.11.17 - form-data: 3.0.1 - dev: true - - /@types/node@11.11.6: - resolution: {integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==} - dev: true - - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: false + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 - /@types/node@20.11.16: - resolution: {integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==} + '@scure/bip39@1.1.1': dependencies: - undici-types: 5.26.5 - dev: true + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.3 - /@types/node@20.11.17: - resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==} + '@scure/bip39@1.2.1': dependencies: - undici-types: 5.26.5 - - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: true + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 - /@types/pbkdf2@3.1.0: - resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} + '@sentry-internal/tracing@7.99.0': dependencies: - '@types/node': 20.11.17 - dev: true + '@sentry/core': 7.99.0 + '@sentry/types': 7.99.0 + '@sentry/utils': 7.99.0 - /@types/pino-multi-stream@5.1.6: - resolution: {integrity: sha512-LEDs2CdCkFwu4zWPZonZdfKfrAyG3OVqxVvBluRwrPF21Xr9dSw1A3k1NHhSXoBFp91cOFv2T7aLUxP6IO6LUw==} + '@sentry/core@5.30.0': dependencies: - '@types/pino': 6.3.11 - dev: true + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 - /@types/pino-pretty@4.7.1: - resolution: {integrity: sha512-l1ntNXdpVWsnPYUk5HyO5Lxfr38zLCgxVfEn/9Zhhm+nGF04/BiIou/m8XPwvoVZLV+livUo79VdHXMJPfUYxA==} + '@sentry/core@7.99.0': dependencies: - '@types/pino': 7.0.5 - dev: true + '@sentry/types': 7.99.0 + '@sentry/utils': 7.99.0 - /@types/pino-std-serializers@2.4.1: - resolution: {integrity: sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==} + '@sentry/hub@5.30.0': dependencies: - '@types/node': 20.11.17 - dev: true + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 - /@types/pino@6.3.11: - resolution: {integrity: sha512-S7+fLONqSpHeW9d7TApUqO6VN47KYgOXhCNKwGBVLHObq8HhaAYlVqUNdfnvoXjCMiwE5xcPm/5R2ZUh8bgaXQ==} + '@sentry/minimal@5.30.0': dependencies: - '@types/node': 20.11.17 - '@types/pino-pretty': 4.7.1 - '@types/pino-std-serializers': 2.4.1 - sonic-boom: 2.8.0 - dev: true + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 - /@types/pino@7.0.5: - resolution: {integrity: sha512-wKoab31pknvILkxAF8ss+v9iNyhw5Iu/0jLtRkUD74cNfOOLJNnqfFKAv0r7wVaTQxRZtWrMpGfShwwBjOcgcg==} - deprecated: This is a stub types definition. pino provides its own type definitions, so you do not need this installed. + '@sentry/node@5.30.0': dependencies: - pino: 8.19.0 - dev: true + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.1 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color - /@types/prettier@2.3.2: - resolution: {integrity: sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==} - dev: true + '@sentry/node@7.99.0': + dependencies: + '@sentry-internal/tracing': 7.99.0 + '@sentry/core': 7.99.0 + '@sentry/types': 7.99.0 + '@sentry/utils': 7.99.0 - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - dev: false + '@sentry/tracing@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 - /@types/qs@6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + '@sentry/types@5.30.0': {} - /@types/range-parser@1.2.4: - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + '@sentry/types@7.99.0': {} - /@types/react-dom@18.2.7: - resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + '@sentry/utils@5.30.0': dependencies: - '@types/react': 18.2.15 - dev: false + '@sentry/types': 5.30.0 + tslib: 1.14.1 - /@types/react@18.2.15: - resolution: {integrity: sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==} + '@sentry/utils@7.99.0': dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 - csstype: 3.1.2 - dev: false + '@sentry/types': 7.99.0 - /@types/readable-stream@2.3.15: - resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} + '@sideway/address@4.1.4': dependencies: - '@types/node': 20.11.17 - safe-buffer: 5.1.2 - dev: true - - /@types/scheduler@0.16.3: - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - dev: false + '@hapi/hoek': 9.3.0 - /@types/secp256k1@4.0.6: - resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - dependencies: - '@types/node': 20.11.17 - dev: true + '@sideway/formula@3.0.1': {} - /@types/seedrandom@3.0.1: - resolution: {integrity: sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==} - dev: true + '@sideway/pinpoint@2.0.0': {} - /@types/semver@7.5.7: - resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} + '@sinclair/typebox@0.27.8': {} - /@types/send@0.17.1: - resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + '@sinonjs/commons@1.8.3': dependencies: - '@types/mime': 1.3.2 - '@types/node': 20.11.17 + type-detect: 4.0.8 - /@types/serve-static@1.13.10: - resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} + '@sinonjs/fake-timers@7.1.2': dependencies: - '@types/mime': 1.3.2 - '@types/node': 20.11.17 + '@sinonjs/commons': 1.8.3 - /@types/sinon-chai@3.2.5: - resolution: {integrity: sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ==} - dependencies: - '@types/chai': 4.3.11 - '@types/sinon': 10.0.2 - dev: true + '@swc/core-darwin-arm64@1.4.13': + optional: true - /@types/sinon@10.0.2: - resolution: {integrity: sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==} - dependencies: - '@sinonjs/fake-timers': 7.1.2 - dev: true + '@swc/core-darwin-x64@1.4.13': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.4.13': + optional: true - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - dev: true + '@swc/core-linux-arm64-gnu@1.4.13': + optional: true - /@types/trusted-types@2.0.3: - resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} - dev: true + '@swc/core-linux-arm64-musl@1.4.13': + optional: true - /@types/underscore@1.11.3: - resolution: {integrity: sha512-Fl1TX1dapfXyDqFg2ic9M+vlXRktcPJrc4PR7sRc7sdVrjavg/JHlbUXBt8qWWqhJrmSqg3RNAkAPRiOYw6Ahw==} - dev: true + '@swc/core-linux-x64-gnu@1.4.13': + optional: true - /@types/unist@2.0.6: - resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - dev: true + '@swc/core-linux-x64-musl@1.4.13': + optional: true - /@types/web3@1.0.19: - resolution: {integrity: sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A==} - dependencies: - '@types/bn.js': 5.1.0 - '@types/underscore': 1.11.3 - dev: true + '@swc/core-win32-arm64-msvc@1.4.13': + optional: true - /@types/ws@8.5.3: - resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} - dependencies: - '@types/node': 20.11.17 - dev: false + '@swc/core-win32-ia32-msvc@1.4.13': + optional: true - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true + '@swc/core-win32-x64-msvc@1.4.13': + optional: true - /@types/yargs@15.0.19: - resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + '@swc/core@1.4.13': dependencies: - '@types/yargs-parser': 21.0.3 - dev: true + '@swc/counter': 0.1.3 + '@swc/types': 0.1.5 + optionalDependencies: + '@swc/core-darwin-arm64': 1.4.13 + '@swc/core-darwin-x64': 1.4.13 + '@swc/core-linux-arm-gnueabihf': 1.4.13 + '@swc/core-linux-arm64-gnu': 1.4.13 + '@swc/core-linux-arm64-musl': 1.4.13 + '@swc/core-linux-x64-gnu': 1.4.13 + '@swc/core-linux-x64-musl': 1.4.13 + '@swc/core-win32-arm64-msvc': 1.4.13 + '@swc/core-win32-ia32-msvc': 1.4.13 + '@swc/core-win32-x64-msvc': 1.4.13 + optional: true - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - dependencies: - '@types/yargs-parser': 21.0.3 - dev: true + '@swc/counter@0.1.3': + optional: true - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.0.1(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true + '@swc/types@0.1.5': + optional: true - /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@textlint/ast-node-types@12.2.1': {} + + '@textlint/markdown-to-ast@12.2.1': dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.21.0 + '@textlint/ast-node-types': 12.2.1 debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 - typescript: 5.3.3 + remark-footnotes: 3.0.0 + remark-frontmatter: 3.0.0 + remark-gfm: 1.0.0 + remark-parse: 9.0.0 + traverse: 0.6.6 + unified: 9.2.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@6.21.0: - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@trufflesuite/bigint-buffer@1.1.9': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - dev: true + node-gyp-build: 4.3.0 + optional: true - /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@tsconfig/node10@1.0.9': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(typechain@8.3.1(typescript@5.4.5))(typescript@5.4.5)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 - ts-api-utils: 1.0.1(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true + '@ethersproject/abi': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.4.5) + typechain: 8.3.1(typescript@5.4.5) + typescript: 5.4.5 - /@typescript-eslint/types@6.21.0: - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + '@types/abstract-leveldown@5.0.2': {} - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3): - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@types/bn.js@4.11.6': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.0.1(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true + '@types/node': 20.11.17 - /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@types/bn.js@5.1.0': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.7 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - eslint: 8.56.0 - semver: 7.6.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true + '@types/node': 20.11.17 - /@typescript-eslint/visitor-keys@6.21.0: - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@types/body-parser@1.19.1': dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - dev: true + '@types/connect': 3.4.35 + '@types/node': 20.11.17 - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true + '@types/chai-as-promised@7.1.8': + dependencies: + '@types/chai': 4.3.11 - /@vitest/coverage-istanbul@1.2.2(vitest@1.2.2): - resolution: {integrity: sha512-tJybwO8JT4H9ANz0T0/tJ1M5g3BkuHKYF1w5YO3z9sAiHBdGANrxN9c5lomJx1WSnLzCxQR5xxlJ4TLKbzrR3w==} - peerDependencies: - vitest: ^1.0.0 + '@types/chai@4.3.11': {} + + '@types/connect@3.4.35': dependencies: - debug: 4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.1 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - magicast: 0.3.3 - picocolors: 1.0.0 - test-exclude: 6.0.0 - vitest: 1.2.2(@types/node@20.11.17)(jsdom@24.0.0) - transitivePeerDependencies: - - supports-color - dev: true + '@types/node': 20.11.17 - /@vitest/expect@1.2.2: - resolution: {integrity: sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==} + '@types/dateformat@5.0.0': {} + + '@types/debug@4.1.12': dependencies: - '@vitest/spy': 1.2.2 - '@vitest/utils': 1.2.2 - chai: 4.3.10 - dev: true + '@types/ms': 0.7.31 - /@vitest/runner@1.2.2: - resolution: {integrity: sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==} + '@types/estree@1.0.5': {} + + '@types/express-serve-static-core@4.17.35': dependencies: - '@vitest/utils': 1.2.2 - p-limit: 5.0.0 - pathe: 1.1.1 - dev: true + '@types/node': 20.11.17 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + '@types/send': 0.17.1 - /@vitest/snapshot@1.2.2: - resolution: {integrity: sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==} + '@types/express@4.17.21': dependencies: - magic-string: 0.30.5 - pathe: 1.1.1 - pretty-format: 29.7.0 - dev: true + '@types/body-parser': 1.19.1 + '@types/express-serve-static-core': 4.17.35 + '@types/qs': 6.9.7 + '@types/serve-static': 1.13.10 - /@vitest/spy@1.2.2: - resolution: {integrity: sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==} + '@types/json-schema@7.0.12': {} + + '@types/json5@0.0.29': {} + + '@types/level-errors@3.0.0': {} + + '@types/levelup@4.3.3': dependencies: - tinyspy: 2.2.0 - dev: true + '@types/abstract-leveldown': 5.0.2 + '@types/level-errors': 3.0.0 + '@types/node': 20.11.17 - /@vitest/utils@1.2.2: - resolution: {integrity: sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==} + '@types/lru-cache@5.1.1': {} + + '@types/mdast@3.0.10': dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true + '@types/unist': 2.0.6 - /@vue/compiler-core@3.3.4: - resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + '@types/mime@1.3.2': {} + + '@types/minimatch@3.0.5': {} + + '@types/minimist@1.2.2': {} + + '@types/mkdirp@0.5.2': dependencies: - '@babel/parser': 7.23.6 - '@vue/shared': 3.3.4 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: true + '@types/node': 20.11.17 - /@vue/compiler-dom@3.3.4: - resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + '@types/mocha@10.0.6': {} + + '@types/ms@0.7.31': {} + + '@types/node-fetch@2.6.4': dependencies: - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 - dev: true + '@types/node': 20.11.17 + form-data: 3.0.1 - /@vue/compiler-sfc@3.3.4: - resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + '@types/node@11.11.6': {} + + '@types/node@12.20.55': {} + + '@types/node@20.11.17': dependencies: - '@babel/parser': 7.23.6 - '@vue/compiler-core': 3.3.4 - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-ssr': 3.3.4 - '@vue/reactivity-transform': 3.3.4 - '@vue/shared': 3.3.4 - estree-walker: 2.0.2 - magic-string: 0.30.5 - postcss: 8.4.35 - source-map-js: 1.0.2 - dev: true + undici-types: 5.26.5 - /@vue/compiler-ssr@3.3.4: - resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + '@types/normalize-package-data@2.4.1': {} + + '@types/parse-json@4.0.0': {} + + '@types/pbkdf2@3.1.0': dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/shared': 3.3.4 - dev: true + '@types/node': 20.11.17 - /@vue/reactivity-transform@3.3.4: - resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + '@types/prettier@2.3.2': {} + + '@types/qs@6.9.7': {} + + '@types/range-parser@1.2.4': {} + + '@types/readable-stream@2.3.15': dependencies: - '@babel/parser': 7.23.6 - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 - estree-walker: 2.0.2 - magic-string: 0.30.5 - dev: true + '@types/node': 20.11.17 + safe-buffer: 5.1.2 - /@vue/shared@3.3.4: - resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} - dev: true + '@types/secp256k1@4.0.6': + dependencies: + '@types/node': 20.11.17 - /@wagmi/cli@2.1.2(typescript@5.3.3): - resolution: {integrity: sha512-gJLjPDD+xc7IN6OJYQdOl3xhfnf7nXZoaELCchNo9Pt+1hUVFYq2uC4HGBXYvUQ03RJNmZca1X8qP8pJeuJFYA==} - hasBin: true - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true + '@types/semver@7.5.7': {} + + '@types/send@0.17.1': dependencies: - abitype: 0.9.8(typescript@5.3.3)(zod@3.22.4) - bundle-require: 4.0.2(esbuild@0.19.10) - cac: 6.7.14 - change-case: 4.1.2 - chokidar: 3.5.3 - dedent: 0.7.0 - dotenv: 16.4.5 - dotenv-expand: 10.0.0 - esbuild: 0.19.10 - execa: 8.0.1 - find-up: 6.3.0 - fs-extra: 11.1.1 - globby: 13.2.2 - ora: 6.3.1 - pathe: 1.1.1 - picocolors: 1.0.0 - prettier: 3.1.1 - typescript: 5.3.3 - viem: 2.7.19(typescript@5.3.3)(zod@3.22.4) - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true + '@types/mime': 1.3.2 + '@types/node': 20.11.17 - /@wagmi/connectors@4.1.12(@wagmi/core@2.6.3)(react-dom@18.2.0)(react-native@0.73.1)(react@18.2.0)(typescript@5.3.3)(viem@2.7.19): - resolution: {integrity: sha512-zqCJMOwpi8ssFjndVxVh3iUMwzcA7dPCjswhcy4xZyy1jm/VvGYC3o1wotq/gTCqUrz0SPIMGimZm4S6865b8A==} - peerDependencies: - '@wagmi/core': 2.6.3 - typescript: '>=5.0.4' - viem: 2.x - peerDependenciesMeta: - typescript: - optional: true + '@types/serve-static@1.13.10': dependencies: - '@coinbase/wallet-sdk': 3.9.1 - '@metamask/sdk': 0.14.1(react-dom@18.2.0)(react-native@0.73.1)(react@18.2.0) - '@safe-global/safe-apps-provider': 0.18.1(typescript@5.3.3) - '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.3.3) - '@wagmi/core': 2.6.3(react@18.2.0)(typescript@5.3.3)(viem@2.7.19) - '@walletconnect/ethereum-provider': 2.11.0(react@18.2.0) - '@walletconnect/modal': 2.6.2(react@18.2.0) - typescript: 5.3.3 - viem: 2.7.19(typescript@5.3.3)(zod@3.22.4) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - react - - react-dom - - react-native - - rollup - - supports-color - - utf-8-validate - - zod - dev: true + '@types/mime': 1.3.2 + '@types/node': 20.11.17 - /@wagmi/core@2.6.3(react@18.2.0)(typescript@5.3.3)(viem@2.7.19): - resolution: {integrity: sha512-hHvJkXFqfj56nAD0SH5bAHYxBItUBDIn6yGUBguMu121v6R4NxhwciEeff56lSjnKhmXjaWdJCEJ9C1YwkmDVw==} - peerDependencies: - '@tanstack/query-core': '>=5.0.0' - typescript: '>=5.0.4' - viem: 2.x - peerDependenciesMeta: - '@tanstack/query-core': - optional: true - typescript: - optional: true + '@types/sinon-chai@3.2.5': dependencies: - eventemitter3: 5.0.1 - mipd: 0.0.5(typescript@5.3.3) - typescript: 5.3.3 - viem: 2.7.19(typescript@5.3.3)(zod@3.22.4) - zustand: 4.4.1(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - bufferutil - - immer - - react - - utf-8-validate - - zod - dev: true - - /@walletconnect/core@2.11.0: - resolution: {integrity: sha512-2Tjp5BCevI7dbmqo/OrCjX4tqgMqwJNQLlQAlphqPfvwlF9+tIu6pGcVbSN3U9zyXzWIZCeleqEaWUeSeET4Ew==} - dependencies: - '@walletconnect/heartbeat': 1.2.1 - '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.14 - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.0.1 - '@walletconnect/relay-api': 1.0.9 - '@walletconnect/relay-auth': 1.0.4 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.11.0 - '@walletconnect/utils': 2.11.0 - events: 3.3.0 - isomorphic-unfetch: 3.1.0 - lodash.isequal: 4.5.0 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true + '@types/chai': 4.3.11 + '@types/sinon': 10.0.2 - /@walletconnect/environment@1.0.1: - resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + '@types/sinon@10.0.2': dependencies: - tslib: 1.14.1 - dev: true - - /@walletconnect/ethereum-provider@2.11.0(react@18.2.0): - resolution: {integrity: sha512-YrTeHVjuSuhlUw7SQ6xBJXDuJ6iAC+RwINm9nVhoKYJSHAy3EVSJZOofMKrnecL0iRMtD29nj57mxAInIBRuZA==} - dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.7 - '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/modal': 2.6.2(react@18.2.0) - '@walletconnect/sign-client': 2.11.0 - '@walletconnect/types': 2.11.0 - '@walletconnect/universal-provider': 2.11.0 - '@walletconnect/utils': 2.11.0 - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - react - - supports-color - - utf-8-validate - dev: true + '@sinonjs/fake-timers': 7.1.2 + + '@types/underscore@1.11.3': {} - /@walletconnect/events@1.0.1: - resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + '@types/unist@2.0.6': {} + + '@types/web3@1.0.19': dependencies: - keyvaluestorage-interface: 1.0.0 - tslib: 1.14.1 - dev: true + '@types/bn.js': 5.1.0 + '@types/underscore': 1.11.3 - /@walletconnect/heartbeat@1.2.1: - resolution: {integrity: sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q==} + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5)': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/time': 1.0.2 - tslib: 1.14.1 - dev: true + '@eslint-community/regexpp': 4.6.2 + '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.0.1(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color - /@walletconnect/jsonrpc-http-connection@1.0.7: - resolution: {integrity: sha512-qlfh8fCfu8LOM9JRR9KE0s0wxP6ZG9/Jom8M0qsoIQeKF3Ni0FyV4V1qy/cc7nfI46SLQLSl4tgWSfLiE1swyQ==} + '@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5)': dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - cross-fetch: 3.1.8 - tslib: 1.14.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.56.0 + optionalDependencies: + typescript: 5.4.5 transitivePeerDependencies: - - encoding - dev: true + - supports-color - /@walletconnect/jsonrpc-provider@1.0.13: - resolution: {integrity: sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g==} + '@typescript-eslint/scope-manager@6.21.0': dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - tslib: 1.14.1 - dev: true + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 - /@walletconnect/jsonrpc-types@1.0.3: - resolution: {integrity: sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw==} + '@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.4.5)': dependencies: - keyvaluestorage-interface: 1.0.0 - tslib: 1.14.1 - dev: true + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.4.5) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.56.0 + ts-api-utils: 1.0.1(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color - /@walletconnect/jsonrpc-utils@1.0.8: - resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} - dependencies: - '@walletconnect/environment': 1.0.1 - '@walletconnect/jsonrpc-types': 1.0.3 - tslib: 1.14.1 - dev: true + '@typescript-eslint/types@6.21.0': {} - /@walletconnect/jsonrpc-ws-connection@1.0.14: - resolution: {integrity: sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA==} + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5)': dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - events: 3.3.0 - ws: 7.5.9 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.0 + ts-api-utils: 1.0.1(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true + - supports-color - /@walletconnect/keyvaluestorage@1.1.1: - resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} - peerDependencies: - '@react-native-async-storage/async-storage': 1.x - peerDependenciesMeta: - '@react-native-async-storage/async-storage': - optional: true + '@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.4.5)': dependencies: - '@walletconnect/safe-json': 1.0.2 - idb-keyval: 6.2.1 - unstorage: 1.10.1(idb-keyval@6.2.1) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.7 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + eslint: 8.56.0 + semver: 7.6.0 transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/kv' - supports-color - dev: true + - typescript - /@walletconnect/logger@2.0.1: - resolution: {integrity: sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ==} + '@typescript-eslint/visitor-keys@6.21.0': dependencies: - pino: 7.11.0 - tslib: 1.14.1 - dev: true + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 - /@walletconnect/modal-core@2.6.2(react@18.2.0): - resolution: {integrity: sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==} + '@ungap/structured-clone@1.2.0': {} + + '@vitest/expect@1.2.2': dependencies: - valtio: 1.11.2(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - react - dev: true + '@vitest/spy': 1.2.2 + '@vitest/utils': 1.2.2 + chai: 4.3.10 - /@walletconnect/modal-ui@2.6.2(react@18.2.0): - resolution: {integrity: sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==} + '@vitest/runner@1.2.2': dependencies: - '@walletconnect/modal-core': 2.6.2(react@18.2.0) - lit: 2.8.0 - motion: 10.16.2 - qrcode: 1.5.3 - transitivePeerDependencies: - - '@types/react' - - react - dev: true + '@vitest/utils': 1.2.2 + p-limit: 5.0.0 + pathe: 1.1.1 - /@walletconnect/modal@2.6.2(react@18.2.0): - resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} + '@vitest/snapshot@1.2.2': dependencies: - '@walletconnect/modal-core': 2.6.2(react@18.2.0) - '@walletconnect/modal-ui': 2.6.2(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - react - dev: true + magic-string: 0.30.5 + pathe: 1.1.1 + pretty-format: 29.7.0 - /@walletconnect/relay-api@1.0.9: - resolution: {integrity: sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg==} + '@vitest/spy@1.2.2': dependencies: - '@walletconnect/jsonrpc-types': 1.0.3 - tslib: 1.14.1 - dev: true + tinyspy: 2.2.0 - /@walletconnect/relay-auth@1.0.4: - resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} + '@vitest/utils@1.2.2': dependencies: - '@stablelib/ed25519': 1.0.3 - '@stablelib/random': 1.0.2 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - tslib: 1.14.1 - uint8arrays: 3.1.1 - dev: true + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 - /@walletconnect/safe-json@1.0.2: - resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + '@vue/compiler-core@3.3.4': dependencies: - tslib: 1.14.1 - dev: true - - /@walletconnect/sign-client@2.11.0: - resolution: {integrity: sha512-H2ukscibBS+6WrzQWh+WyVBqO5z4F5et12JcwobdwgHnJSlqIoZxqnUYYWNCI5rUR5UKsKWaUyto4AE9N5dw4Q==} - dependencies: - '@walletconnect/core': 2.11.0 - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.1 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.0.1 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.11.0 - '@walletconnect/utils': 2.11.0 - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true + '@babel/parser': 7.23.6 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + source-map-js: 1.0.2 - /@walletconnect/time@1.0.2: - resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + '@vue/compiler-dom@3.3.4': dependencies: - tslib: 1.14.1 - dev: true + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 - /@walletconnect/types@2.11.0: - resolution: {integrity: sha512-AB5b1lrEbCGHxqS2vqfCkIoODieH+ZAUp9rA1O2ftrhnqDJiJK983Df87JhYhECsQUBHHfALphA8ydER0q+9sw==} + '@vue/compiler-sfc@3.3.4': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.1 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.0.1 - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/kv' - - supports-color - dev: true - - /@walletconnect/universal-provider@2.11.0: - resolution: {integrity: sha512-zgJv8jDvIMP4Qse/D9oIRXGdfoNqonsrjPZanQ/CHNe7oXGOBiQND2IIeX+tS0H7uNA0TPvctljCLiIN9nw4eA==} - dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.7 - '@walletconnect/jsonrpc-provider': 1.0.13 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.0.1 - '@walletconnect/sign-client': 2.11.0 - '@walletconnect/types': 2.11.0 - '@walletconnect/utils': 2.11.0 - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - /@walletconnect/utils@2.11.0: - resolution: {integrity: sha512-hxkHPlTlDQILHfIKXlmzgNJau/YcSBC3XHUSuZuKZbNEw3duFT6h6pm3HT/1+j1a22IG05WDsNBuTCRkwss+BQ==} - dependencies: - '@stablelib/chacha20poly1305': 1.0.1 - '@stablelib/hkdf': 1.0.1 - '@stablelib/random': 1.0.2 - '@stablelib/sha256': 1.0.1 - '@stablelib/x25519': 1.0.3 - '@walletconnect/relay-api': 1.0.9 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.11.0 - '@walletconnect/window-getters': 1.0.1 - '@walletconnect/window-metadata': 1.0.1 - detect-browser: 5.3.0 - query-string: 7.1.3 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/kv' - - supports-color - dev: true + '@babel/parser': 7.23.6 + '@vue/compiler-core': 3.3.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-ssr': 3.3.4 + '@vue/reactivity-transform': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.5 + postcss: 8.4.35 + source-map-js: 1.0.2 - /@walletconnect/window-getters@1.0.1: - resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + '@vue/compiler-ssr@3.3.4': dependencies: - tslib: 1.14.1 - dev: true + '@vue/compiler-dom': 3.3.4 + '@vue/shared': 3.3.4 - /@walletconnect/window-metadata@1.0.1: - resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + '@vue/reactivity-transform@3.3.4': dependencies: - '@walletconnect/window-getters': 1.0.1 - tslib: 1.14.1 - dev: true + '@babel/parser': 7.23.6 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.5 - /@yarnpkg/lockfile@1.1.0: - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - dev: true + '@vue/shared@3.3.4': {} - /@yarnpkg/parsers@3.0.0-rc.46: - resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} - engines: {node: '>=14.15.0'} + '@yarnpkg/lockfile@1.1.0': {} + + '@yarnpkg/parsers@3.0.0-rc.46': dependencies: js-yaml: 3.14.1 tslib: 2.6.2 - dev: true - /@zkochan/js-yaml@0.0.6: - resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} - hasBin: true + '@zkochan/js-yaml@0.0.6': dependencies: argparse: 2.0.1 - dev: true - - /abitype@0.9.8(typescript@5.3.3)(zod@3.22.4): - resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.19.1 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: - typescript: 5.3.3 - zod: 3.22.4 - dev: true - /abitype@1.0.0(typescript@5.3.3)(zod@3.22.4): - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: - typescript: 5.3.3 + abitype@1.0.0(typescript@5.4.5)(zod@3.22.4): + optionalDependencies: + typescript: 5.4.5 zod: 3.22.4 - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - /abstract-leveldown@6.2.3: - resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==} - engines: {node: '>=6'} + abstract-leveldown@6.2.3: dependencies: buffer: 5.7.1 immediate: 3.3.0 level-concat-iterator: 2.0.1 level-supports: 1.0.1 xtend: 4.0.2 - dev: true - /abstract-leveldown@6.3.0: - resolution: {integrity: sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==} - engines: {node: '>=6'} + abstract-leveldown@6.3.0: dependencies: buffer: 5.7.1 immediate: 3.3.0 level-concat-iterator: 2.0.1 level-supports: 1.0.1 xtend: 4.0.2 - dev: true - - /abstract-leveldown@7.2.0: - resolution: {integrity: sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==} - engines: {node: '>=10'} - dependencies: - buffer: 6.0.3 - catering: 2.1.1 - is-buffer: 2.0.5 - level-concat-iterator: 3.1.0 - level-supports: 2.1.0 - queue-microtask: 1.2.3 - dev: true - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.10.0): dependencies: acorn: 8.10.0 - dev: true - /acorn-walk@8.3.0: - resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} - engines: {node: '>=0.4.0'} - dev: true + acorn-walk@8.3.0: {} - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true + acorn-walk@8.3.2: {} - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.10.0: {} - /adm-zip@0.4.16: - resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} - engines: {node: '>=0.3.0'} - dev: true + adm-zip@0.4.16: {} - /aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + aes-js@3.0.0: {} - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + agent-base@6.0.2: dependencies: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} + agent-base@7.1.0: dependencies: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true + optional: true - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /anchor-markdown-header@0.6.0: - resolution: {integrity: sha512-v7HJMtE1X7wTpNFseRhxsY/pivP4uAJbidVhPT+yhz4i/vV1+qx371IXuV9V7bN6KjFtheLJxqaSm0Y/8neJTA==} + anchor-markdown-header@0.6.0: dependencies: emoji-regex: 10.1.0 - dev: true - - /anser@1.4.10: - resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} - dev: true - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - dev: true - /ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - dev: true + ansi-colors@4.1.1: {} - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + ansi-colors@4.1.3: {} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: true - /ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} - engines: {node: '>=14.16'} + ansi-escapes@6.2.0: dependencies: type-fest: 3.13.1 - dev: true - - /ansi-fragments@0.2.1: - resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} - dependencies: - colorette: 1.4.0 - slice-ansi: 2.1.0 - strip-ansi: 5.2.0 - dev: true - - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: true - /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - dev: true + ansi-regex@2.1.1: {} - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-sequence-parser@1.1.1: - resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - dev: true + ansi-sequence-parser@1.1.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true - - /appdirsjs@1.2.7: - resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} - dev: true - /append-transform@2.0.0: - resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} - engines: {node: '>=8'} + append-transform@2.0.0: dependencies: default-require-extensions: 3.0.0 - dev: true - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: true - - /archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - dev: true + archy@1.0.0: {} - /are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} - dev: true + are-docs-informative@0.0.2: {} - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true + arg@4.1.3: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.2 - dev: false - - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - dependencies: - dequal: 2.0.3 - dev: true + argparse@2.0.1: {} - /array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} - dev: true + array-back@3.1.0: {} - /array-back@4.0.2: - resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} - engines: {node: '>=8'} - dev: true + array-back@4.0.2: {} - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 - /array-differ@3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} - engines: {node: '>=8'} - dev: true + array-differ@3.0.0: {} - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: false + array-flatten@1.1.1: {} - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} + array-includes@3.1.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 get-intrinsic: 1.2.1 is-string: 1.0.7 - dev: true - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.7: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 get-intrinsic: 1.2.1 is-string: 1.0.7 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + array-union@2.1.0: {} - /array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} - engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.3: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 get-intrinsic: 1.2.1 - dev: true - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 - /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.1: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 - dev: true - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 - dev: true - /array.prototype.tosorted@1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + array.prototype.tosorted@1.1.1: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 get-intrinsic: 1.2.1 - dev: true - /arraybuffer.prototype.slice@1.0.1: - resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.1: dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.2 @@ -7212,350 +8447,122 @@ packages: is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - /arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - dev: true + arrify@1.0.1: {} - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: true + arrify@2.0.1: {} - /asn1@0.2.4: - resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==} + asn1@0.2.4: dependencies: safer-buffer: 2.1.2 - dev: true - /assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - /ast-types@0.15.2: - resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} - engines: {node: '>=4'} - dependencies: - tslib: 2.6.2 - dev: true + assert-plus@1.0.0: {} - /astral-regex@1.0.0: - resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} - engines: {node: '>=4'} - dev: true + assertion-error@1.1.0: {} - /async-eventemitter@0.2.4: - resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} + async-eventemitter@0.2.4: dependencies: async: 2.6.4 - dev: true - - /async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - dev: true - - /async-mutex@0.2.6: - resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} - dependencies: - tslib: 2.6.2 - dev: true - /async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + async@2.6.4: dependencies: lodash: 4.17.21 - dev: true - /asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + asynciterator.prototype@1.0.0: dependencies: has-symbols: 1.0.3 - dev: true - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true + asynckit@0.4.0: {} - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} + atomic-sleep@1.0.0: {} - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.5: {} - /aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - dev: true + aws-sign2@0.7.0: {} - /aws4@1.11.0: - resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} - dev: true + aws4@1.11.0: {} - /axios@0.21.4(debug@4.3.4): - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + axios@0.21.4(debug@4.3.4): dependencies: follow-redirects: 1.15.5(debug@4.3.4) transitivePeerDependencies: - debug - dev: true - /axios@1.1.3: - resolution: {integrity: sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==} + axios@1.1.3: dependencies: follow-redirects: 1.15.5(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: true - /axios@1.6.7: - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + axios@1.6.7: dependencies: follow-redirects: 1.15.5(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: true - - /babel-core@7.0.0-bridge.0(@babel/core@7.22.10): - resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - dev: true - - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - dependencies: - '@babel/runtime': 7.23.7 - cosmiconfig: 7.1.0 - resolve: 1.22.4 - dev: true - - /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.22.10): - resolution: {integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.22.10 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.22.10) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.22.10): - resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.22.10) - core-js-compat: 3.35.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.22.10): - resolution: {integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.22.10) - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: - resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} - dev: true - - /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.22.10): - resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} - dependencies: - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.22.10) - transitivePeerDependencies: - - '@babel/core' - dev: true - - /babel-preset-fbjs@3.4.0(@babel/core@7.22.10): - resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10) - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.22.10) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.22.10) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.22.10) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.22.10) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.22.10) - babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 - dev: true - - /bail@1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} - dev: true + bail@1.0.5: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /base-x@3.0.8: - resolution: {integrity: sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==} + base-x@3.0.8: dependencies: safe-buffer: 5.2.1 - dev: true - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64-js@1.5.1: {} - /basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} + basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 - dev: false - /bcfg@0.2.1: - resolution: {integrity: sha512-Q69DG2V9QJexdXvYoiXM4xfQ5m65tIOAzJCcW4USQdvbWEJJqBQ9MEDdyJb2ei5fadAJPVp8rUpLbFnkC37FZA==} - engines: {node: '>=8.0.0'} + bcfg@0.2.1: dependencies: bsert: 0.0.10 - dev: false - /bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 - dev: true - /bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + bech32@1.1.4: {} - /better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 - dev: false - /bigint-crypto-utils@3.3.0: - resolution: {integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==} - engines: {node: '>=14.0.0'} - dev: true + bigint-crypto-utils@3.3.0: {} - /bignumber.js@9.0.1: - resolution: {integrity: sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==} + bignumber.js@9.0.1: {} - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true + binary-extensions@2.2.0: {} - /bintrees@1.0.1: - resolution: {integrity: sha512-tbaUB1QpTIj4cKY8c1rvNAvEQXA+ekzHmbe4jzNfW3QWsF9GnnP/BRWyl6/qqS53heoYJ93naaFcm/jooONH8g==} - dev: false + bintrees@1.0.1: {} - /bip39@3.0.4: - resolution: {integrity: sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==} + bip39@3.0.4: dependencies: '@types/node': 11.11.6 create-hash: 1.2.0 pbkdf2: 3.1.2 randombytes: 2.1.0 - dev: true - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - - /bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} - dependencies: - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true - - /blakejs@1.1.1: - resolution: {integrity: sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==} - dev: true - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true + blakejs@1.1.1: {} - /bn.js@4.11.6: - resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + bluebird@3.7.2: {} - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + bn.js@4.11.6: {} - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + bn.js@4.12.0: {} - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false + bn.js@5.2.1: {} - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -7571,15 +8578,8 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: false - /bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - dev: true - - /boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} + boxen@5.1.2: dependencies: ansi-align: 3.0.1 camelcase: 6.3.0 @@ -7589,42 +8589,29 @@ packages: type-fest: 0.20.2 widest-line: 3.1.0 wrap-ansi: 7.0.0 - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /breakword@1.0.5: - resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} + breakword@1.0.5: dependencies: wcwidth: 1.0.1 - dev: false - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + brorand@1.1.0: {} - /browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - dev: true + browser-stdout@1.3.1: {} - /browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 cipher-base: 1.0.4 @@ -7632,251 +8619,113 @@ packages: evp_bytestokey: 1.0.3 inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - /browserslist@4.22.2: - resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.22.2: dependencies: caniuse-lite: 1.0.30001574 electron-to-chromium: 1.4.621 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) - dev: true - /bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + bs58@4.0.1: dependencies: base-x: 3.0.8 - dev: true - /bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + bs58check@2.1.2: dependencies: bs58: 4.0.1 create-hash: 1.2.0 safe-buffer: 5.2.1 - dev: true - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - - /bsert@0.0.10: - resolution: {integrity: sha512-NHNwlac+WPy4t2LoNh8pXk8uaIGH3NSaIUbTTRXGpE2WEbq0te/tDykYHkFK57YKLPjv/aGHmbqvnGeVWDz57Q==} - engines: {node: '>=8.0.0'} - dev: false + bsert@0.0.10: {} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true + buffer-from@1.1.2: {} - /buffer-reverse@1.0.1: - resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} - dev: false + buffer-reverse@1.0.1: {} - /buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - dev: true + buffer-xor@1.0.3: {} - /buffer-xor@2.0.2: - resolution: {integrity: sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==} + buffer-xor@2.0.2: dependencies: safe-buffer: 5.2.1 - dev: true - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /bufferutil@4.0.5: - resolution: {integrity: sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==} - engines: {node: '>=6.14.2'} - requiresBuild: true + bufferutil@4.0.5: dependencies: node-gyp-build: 4.6.0 - dev: true optional: true - /bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - requiresBuild: true + bufferutil@4.0.8: dependencies: node-gyp-build: 4.6.0 - dev: true + optional: true - /bufio@1.2.0: - resolution: {integrity: sha512-UlFk8z/PwdhYQTXSQQagwGAdtRI83gib2n4uy4rQnenxUM2yQi8lBDzF230BNk+3wAoZDxYRoBwVVUPgHa9MCA==} - engines: {node: '>=8.0.0'} - dev: false + bufio@1.2.0: {} - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: true + builtin-modules@3.3.0: {} - /bundle-require@4.0.1(esbuild@0.19.7): - resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.17' + bundle-require@4.0.1(esbuild@0.19.7): dependencies: esbuild: 0.19.7 load-tsconfig: 0.2.5 - dev: true - - /bundle-require@4.0.2(esbuild@0.19.10): - resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.17' - dependencies: - esbuild: 0.19.10 - load-tsconfig: 0.2.5 - dev: true - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - dev: true - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true - - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + bytes@3.1.2: {} - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + cac@6.7.14: {} - /caching-transform@4.0.0: - resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} - engines: {node: '>=8'} + caching-transform@4.0.0: dependencies: hasha: 5.2.2 make-dir: 3.1.0 package-hash: 4.0.0 write-file-atomic: 3.0.3 - dev: true - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + call-bind@1.0.2: dependencies: function-bind: 1.1.2 get-intrinsic: 1.2.1 - /caller-callsite@2.0.0: - resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} - engines: {node: '>=4'} - dependencies: - callsites: 2.0.0 - dev: true - - /caller-path@2.0.0: - resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} - engines: {node: '>=4'} - dependencies: - caller-callsite: 2.0.0 - dev: true - - /callsite@1.0.0: - resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} - dev: true - - /callsites@2.0.0: - resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} - engines: {node: '>=4'} - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsite@1.0.0: {} - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - dependencies: - pascal-case: 3.1.2 - tslib: 2.6.2 + callsites@3.1.0: {} - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: false - - /camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - dev: true - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true + camelcase@3.0.0: {} - /caniuse-lite@1.0.30001574: - resolution: {integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==} - dev: true + camelcase@5.3.1: {} - /capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - upper-case-first: 2.0.2 + camelcase@6.3.0: {} - /caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - dev: true + caniuse-lite@1.0.30001574: {} - /catering@2.1.1: - resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} - engines: {node: '>=6'} - dev: true + caseless@0.12.0: {} - /ccount@1.1.0: - resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} - dev: true + ccount@1.1.0: {} - /chai-as-promised@7.1.1(chai@4.3.10): - resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} - peerDependencies: - chai: '>= 2.1.2 < 5' + chai-as-promised@7.1.1(chai@4.3.10): dependencies: chai: 4.3.10 check-error: 1.0.2 - /chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} - engines: {node: '>=4'} + chai@4.3.10: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -7886,77 +8735,34 @@ packages: pathval: 1.1.1 type-detect: 4.0.8 - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.6.2 + chalk@5.3.0: {} - /character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - dev: true + character-entities-legacy@1.1.4: {} - /character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - dev: true + character-entities@1.2.4: {} - /character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - dev: true + character-reference-invalid@1.1.4: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: false + chardet@0.7.0: {} - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + check-error@1.0.2: {} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + chokidar@3.5.3: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -7967,431 +8773,168 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: true - - /chrome-launcher@0.15.2: - resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} - engines: {node: '>=12.13.0'} - hasBin: true - dependencies: - '@types/node': 20.11.17 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 - transitivePeerDependencies: - - supports-color - dev: true - - /chromium-edge-launcher@1.0.0: - resolution: {integrity: sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==} - dependencies: - '@types/node': 20.11.17 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 - mkdirp: 1.0.4 - rimraf: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true + chownr@2.0.0: {} - /ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: true + ci-info@2.0.0: {} - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} + ci-info@3.8.0: {} - /ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - dev: true + ci-info@4.0.0: {} - /cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + cipher-base@1.0.4: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - - /citty@0.1.5: - resolution: {integrity: sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==} - dependencies: - consola: 3.2.3 - dev: true - /clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true + clean-stack@2.2.0: {} - /cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} - dev: true + cli-boxes@2.2.1: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - dev: true - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 - dev: true - /cli-spinners@2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.6.1: {} - /cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.9.0: {} - /cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 string-width: 7.0.0 - dev: true - - /clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - dev: true - /cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + cliui@3.2.0: dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 wrap-ansi: 2.1.0 - dev: true - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@6.0.0: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: true - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - - /clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - dev: true - - /cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} - dev: true + clone@1.0.4: {} - /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - dev: true + code-point-at@1.1.0: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.3: {} - /colorette@1.4.0: - resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - dev: true + color-name@1.1.4: {} - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true + colorette@2.0.20: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - dev: true - /command-exists@1.2.9: - resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - dev: true + command-exists@1.2.9: {} - /command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} + command-line-args@5.2.1: dependencies: array-back: 3.1.0 find-replace: 3.0.0 lodash.camelcase: 4.3.0 typical: 4.0.0 - dev: true - /command-line-usage@6.1.3: - resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} - engines: {node: '>=8.0.0'} + command-line-usage@6.1.3: dependencies: array-back: 4.0.2 chalk: 2.4.2 table-layout: 1.0.2 typical: 5.2.0 - dev: true - - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - /commander@3.0.2: - resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} - dev: true - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true - - /commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: true - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true - - /comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - dev: true - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true + commander@11.1.0: {} - /component-emitter@1.3.0: - resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} - dev: true + commander@2.20.3: {} - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true + commander@3.0.2: {} - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true + commander@4.1.1: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + commander@8.3.0: {} - /connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} - dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 - parseurl: 1.3.3 - utils-merge: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: true + comment-parser@1.4.1: {} - /consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} - dev: true + commondir@1.0.1: {} - /constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - upper-case: 2.0.2 + concat-map@0.0.1: {} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - dev: false - - /content-type@1.0.4: - resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} - engines: {node: '>= 0.6'} - dev: false - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: false + content-type@1.0.5: {} - /convert-source-map@1.8.0: - resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} + convert-source-map@1.8.0: dependencies: safe-buffer: 5.1.2 - dev: true - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - /cookie-es@1.0.0: - resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} - dev: true + convert-source-map@1.9.0: {} - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: false - - /cookie@0.4.1: - resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} - engines: {node: '>= 0.6'} - dev: true + cookie-signature@1.0.6: {} - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: false + cookie@0.4.1: {} - /cookiejar@2.1.4: - resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - requiresBuild: true - dev: true + cookie@0.6.0: {} - /core-js-compat@3.35.0: - resolution: {integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==} + core-js-compat@3.35.0: dependencies: browserslist: 4.22.2 - dev: true - - /core-js-pure@3.16.2: - resolution: {integrity: sha512-oxKe64UH049mJqrKkynWp6Vu0Rlm/BTXO/bJZuN2mmR3RtOFNepLlSWDd1eo16PzHpQAoNG97rLU1V/YxesJjw==} - deprecated: core-js-pure@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js-pure. - requiresBuild: true - dev: true - /core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - dev: true + core-js-pure@3.16.2: {} - /cosmiconfig@5.2.1: - resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} - engines: {node: '>=4'} - dependencies: - import-fresh: 2.0.0 - is-directory: 0.3.1 - js-yaml: 3.14.1 - parse-json: 4.0.0 - dev: true + core-util-is@1.0.2: {} - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.0 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: true - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true + crc-32@1.2.2: {} - /create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + create-hash@1.2.0: dependencies: cipher-base: 1.0.4 inherits: 2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 sha.js: 2.4.11 - dev: true - /create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + create-hmac@1.1.7: dependencies: cipher-base: 1.0.4 create-hash: 1.2.0 @@ -8399,279 +8942,112 @@ packages: ripemd160: 2.0.2 safe-buffer: 5.2.1 sha.js: 2.4.11 - dev: true - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - - /cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} - dependencies: - node-fetch: 2.6.12 - transitivePeerDependencies: - - encoding - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - dependencies: - node-fetch: 2.6.12 - transitivePeerDependencies: - - encoding - dev: true + create-require@1.1.1: {} - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 which: 1.3.1 - dev: false - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - - /crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - dev: false - /css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - dev: true + crypto-js@4.2.0: {} - /cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} + cssstyle@4.0.1: dependencies: rrweb-cssom: 0.6.0 - dev: true - - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + optional: true - /csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - dev: false + csv-generate@3.4.3: {} - /csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - dev: false + csv-parse@4.16.3: {} - /csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - dev: false + csv-stringify@5.6.5: {} - /csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} + csv@5.5.3: dependencies: csv-generate: 3.4.3 csv-parse: 4.16.3 csv-stringify: 5.6.5 stream-transform: 2.1.3 - dev: false - /dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} + dashdash@1.14.1: dependencies: assert-plus: 1.0.0 - dev: true - /data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - dev: true - - /dataloader@1.4.0: - resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} - dev: true - - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.23.7 - dev: true + optional: true - /dateformat@4.5.1: - resolution: {integrity: sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==} - dev: false + dataloader@1.4.0: {} - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: true + dateformat@4.5.1: {} - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true - /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4(supports-color@8.1.1): dependencies: ms: 2.1.2 + optionalDependencies: supports-color: 8.1.1 - dev: true - /decamelize-keys@1.1.0: - resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==} - engines: {node: '>=0.10.0'} + decamelize-keys@1.1.0: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: false - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - /decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - dev: true - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true + decamelize@1.2.0: {} - /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - dev: true + decamelize@4.0.0: {} - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true + decimal.js@10.4.3: + optional: true - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - /deep-equal@2.2.2: - resolution: {integrity: sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.1 - is-arguments: 1.1.1 - is-array-buffer: 3.0.2 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.11 - dev: false - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-extend@0.6.0: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true + deep-is@0.1.4: {} - /default-require-extensions@3.0.0: - resolution: {integrity: sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==} - engines: {node: '>=8'} + default-require-extensions@3.0.0: dependencies: strip-bom: 4.0.0 - dev: true - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - /deferred-leveldown@5.3.0: - resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==} - engines: {node: '>=6'} + deferred-leveldown@5.3.0: dependencies: abstract-leveldown: 6.2.3 inherits: 2.0.4 - dev: true - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true + define-lazy-prop@2.0.0: {} - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} + define-properties@1.2.0: dependencies: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - /defu@6.1.3: - resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==} - dev: true + delayed-stream@1.0.0: {} - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - - /denodeify@1.2.1: - resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} - dev: true - - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - dev: true - - /depcheck@1.4.7: - resolution: {integrity: sha512-1lklS/bV5chOxwNKA/2XUUk/hPORp8zihZsXflr8x0kLwmcZ9Y9BsS6Hs3ssvA+2wUVbG0U2Ciqvm1SokNjPkA==} - engines: {node: '>=10'} - hasBin: true + depcheck@1.4.7: dependencies: '@babel/parser': 7.23.0 '@babel/traverse': 7.23.3 @@ -8698,98 +9074,30 @@ packages: yargs: 16.2.0 transitivePeerDependencies: - supports-color - dev: true - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - /deprecated-react-native-prop-types@5.0.0: - resolution: {integrity: sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==} - engines: {node: '>=18'} - dependencies: - '@react-native/normalize-colors': 0.73.2 - invariant: 2.2.4 - prop-types: 15.8.1 - dev: true - - /deps-regex@0.2.0: - resolution: {integrity: sha512-PwuBojGMQAYbWkMXOY9Pd/NWCDNHVH12pnS7WHqZkTSeMESe4hwnKKRp0yR87g37113x4JPbo/oIvXY+s/f56Q==} - dev: true - - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true - - /destr@2.0.2: - resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} - dev: true - - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - /detect-browser@5.3.0: - resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} - dev: true + depd@2.0.0: {} - /detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - dev: true - - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: false + deps-regex@0.2.0: {} - /detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + destroy@1.2.0: {} - /dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - dependencies: - asap: 2.0.6 - wrappy: 1.0.2 - dev: true + detect-file@1.0.0: {} - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + detect-indent@6.1.0: {} - /diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - dev: true + diff-sequences@29.6.3: {} - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true + diff@3.5.0: {} - /diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - dev: true + diff@4.0.2: {} - /dijkstrajs@1.0.3: - resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} - dev: true + diff@5.0.0: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - /doctoc@2.2.1: - resolution: {integrity: sha512-qNJ1gsuo7hH40vlXTVVrADm6pdg30bns/Mo7Nv1SxuXSM1bwF9b4xQ40a6EFT/L1cI+Yylbyi8MPI4G4y7XJzQ==} - hasBin: true + doctoc@2.2.1: dependencies: '@textlint/markdown-to-ast': 12.2.1 anchor-markdown-header: 0.6.0 @@ -8799,127 +9107,64 @@ packages: update-section: 0.3.3 transitivePeerDependencies: - supports-color - dev: true - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: false - /dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dev: true - - /dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dom-serializer@1.4.1: dependencies: domelementtype: 2.3.0 domhandler: 4.3.1 entities: 2.2.0 - dev: true - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true + domelementtype@2.3.0: {} - /domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} + domhandler@4.3.1: dependencies: domelementtype: 2.3.0 - dev: true - /domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + domutils@2.8.0: dependencies: dom-serializer: 1.4.1 domelementtype: 2.3.0 domhandler: 4.3.1 - dev: true - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: true + dotenv-expand@10.0.0: {} - /dotenv@10.0.0: - resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} - engines: {node: '>=10'} - dev: true + dotenv@10.0.0: {} - /dotenv@16.3.2: - resolution: {integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==} - engines: {node: '>=12'} - dev: true + dotenv@16.3.2: {} - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} + dotenv@16.4.5: {} - /dotenv@8.6.0: - resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} - engines: {node: '>=10'} - dev: true + dotenv@8.6.0: {} - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true + duplexer@0.1.2: {} - /duplexify@4.1.2: - resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + duplexify@4.1.2: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 3.6.2 stream-shift: 1.0.1 - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + ecc-jsbn@0.1.2: dependencies: jsbn: 0.1.1 safer-buffer: 2.1.2 - dev: true - - /eciesjs@0.3.18: - resolution: {integrity: sha512-RQhegEtLSyIiGJmFTZfvCTHER/fymipXFVx6OwSRYD6hOuy+6Kjpk0dGvIfP9kxn/smBpxQy71uxpGO406ITCw==} - dependencies: - '@types/secp256k1': 4.0.6 - futoin-hkdf: 1.5.3 - secp256k1: 5.0.0 - dev: true - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ee-first@1.1.1: {} - /electron-to-chromium@1.4.621: - resolution: {integrity: sha512-MGJM6S0MuF/wTzM9NoItWXN56J1kolrHS/vzl/KlhXAbVkogTy0wzKYliQDJgNypxSCFjxdRhHYS3bffyYUGEw==} - dev: true + electron-to-chromium@1.4.621: {} - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + elliptic@6.5.4: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -8929,135 +9174,57 @@ packages: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - /emittery@0.10.0: - resolution: {integrity: sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==} - engines: {node: '>=12'} - dev: true + emittery@0.10.0: {} - /emoji-regex@10.1.0: - resolution: {integrity: sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==} - dev: true + emoji-regex@10.1.0: {} - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: true + emoji-regex@10.3.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /encode-utf8@1.0.3: - resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} - dev: true + encode-utf8@1.0.3: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + encodeurl@1.0.2: {} - /encoding-down@6.3.0: - resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==} - engines: {node: '>=6'} + encoding-down@6.3.0: dependencies: abstract-leveldown: 6.3.0 inherits: 2.0.4 level-codec: 9.0.2 level-errors: 2.0.1 - dev: true - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - /engine.io-client@6.5.3(bufferutil@4.0.8)(utf-8-validate@6.0.3): - resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@8.1.1) - engine.io-parser: 5.2.1 - ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - xmlhttprequest-ssl: 2.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /engine.io-parser@5.2.1: - resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} - engines: {node: '>=10.0.0'} - dev: true - - /enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} + enquirer@2.3.6: dependencies: ansi-colors: 4.1.3 - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: true + entities@2.2.0: {} - /entities@3.0.1: - resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} - engines: {node: '>=0.12'} - dev: true + entities@3.0.1: {} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + entities@4.5.0: + optional: true - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true + env-paths@2.2.1: {} - /envalid@8.0.0: - resolution: {integrity: sha512-PGeYJnJB5naN0ME6SH8nFcDj9HVbLpYIfg1p5lAyM9T4cH2lwtu2fLbozC/bq+HUUOIFxhX/LP0/GmlqPHT4tQ==} - engines: {node: '>=8.12'} + envalid@8.0.0: dependencies: tslib: 2.6.2 - dev: false - /envinfo@7.11.0: - resolution: {integrity: sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true + errno@0.1.8: dependencies: prr: 1.0.1 - dev: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - /error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - dependencies: - stackframe: 1.3.4 - dev: true - - /errorhandler@1.5.1: - resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} - engines: {node: '>= 0.8'} - dependencies: - accepts: 1.3.8 - escape-html: 1.0.3 - dev: true - - /es-abstract@1.22.1: - resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} - engines: {node: '>= 0.4'} + es-abstract@1.22.1: dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.1 @@ -9099,22 +9266,7 @@ packages: unbox-primitive: 1.0.2 which-typed-array: 1.1.11 - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: false - - /es-iterator-helpers@1.0.13: - resolution: {integrity: sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==} + es-iterator-helpers@1.0.13: dependencies: asynciterator.prototype: 1.0.0 call-bind: 1.0.2 @@ -9130,38 +9282,26 @@ packages: internal-slot: 1.0.5 iterator.prototype: 1.1.0 safe-array-concat: 1.0.0 - dev: true - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.1: dependencies: get-intrinsic: 1.2.1 has: 1.0.3 has-tostringtag: 1.0.0 - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + es-shim-unscopables@1.0.0: dependencies: has: 1.0.3 - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - /es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - dev: true + es6-error@4.1.1: {} - /esbuild@0.19.10: - resolution: {integrity: sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.19.10: optionalDependencies: '@esbuild/aix-ppc64': 0.19.10 '@esbuild/android-arm': 0.19.10 @@ -9186,13 +9326,8 @@ packages: '@esbuild/win32-arm64': 0.19.10 '@esbuild/win32-ia32': 0.19.10 '@esbuild/win32-x64': 0.19.10 - dev: true - /esbuild@0.19.7: - resolution: {integrity: sha512-6brbTZVqxhqgbpqBR5MzErImcpA0SQdoKOkcWK/U30HtQxnokIpG3TX2r0IJqbFUzqLjhU/zC1S5ndgakObVCQ==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.19.7: optionalDependencies: '@esbuild/android-arm': 0.19.7 '@esbuild/android-arm64': 0.19.7 @@ -9216,113 +9351,52 @@ packages: '@esbuild/win32-arm64': 0.19.7 '@esbuild/win32-ia32': 0.19.7 '@esbuild/win32-x64': 0.19.7 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escalade@3.1.1: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-html@1.0.3: {} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /eslint-config-prettier@9.1.0(eslint@8.56.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@9.1.0(eslint@8.56.0): dependencies: eslint: 8.56.0 - dev: true - /eslint-config-standard@16.0.3(eslint-plugin-import@2.29.1)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.56.0): - resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==} - peerDependencies: - eslint: ^7.12.1 - eslint-plugin-import: ^2.22.1 - eslint-plugin-node: ^11.1.0 - eslint-plugin-promise: ^4.2.1 || ^5.0.0 + eslint-config-standard@16.0.3(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0))(eslint-plugin-node@11.1.0(eslint@8.56.0))(eslint-plugin-promise@5.2.0(eslint@8.56.0))(eslint@8.56.0): dependencies: eslint: 8.56.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0) eslint-plugin-node: 11.1.0(eslint@8.56.0) eslint-plugin-promise: 5.2.0(eslint@8.56.0) - dev: true - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.4 transitivePeerDependencies: - supports-color - dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.4.5) eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-es@3.0.1(eslint@8.56.0): - resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' + eslint-plugin-es@3.0.1(eslint@8.56.0): dependencies: eslint: 8.56.0 eslint-utils: 2.1.0 regexpp: 3.2.0 - dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint@8.56.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -9331,7 +9405,7 @@ packages: doctrine: 2.1.0 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -9341,17 +9415,14 @@ packages: object.values: 1.1.7 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.4.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-plugin-jsdoc@48.0.6(eslint@8.56.0): - resolution: {integrity: sha512-LgwXOX6TWxxFYcbdVe+BJ94Kl/pgjSPYHLzqEdAMXTA1BH9WDx7iJ+9/iDajPF64LtzWX8C1mCfpbMZjJGhAOw==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint-plugin-jsdoc@48.0.6(eslint@8.56.0): dependencies: '@es-joy/jsdoccomment': 0.42.0 are-docs-informative: 0.0.2 @@ -9365,13 +9436,8 @@ packages: spdx-expression-parse: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-node@11.1.0(eslint@8.56.0): - resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=5.16.0' + eslint-plugin-node@11.1.0(eslint@8.56.0): dependencies: eslint: 8.56.0 eslint-plugin-es: 3.0.1(eslint@8.56.0) @@ -9380,47 +9446,24 @@ packages: minimatch: 3.1.2 resolve: 1.22.2 semver: 6.3.1 - dev: true - /eslint-plugin-prefer-arrow@1.2.3(eslint@8.56.0): - resolution: {integrity: sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==} - peerDependencies: - eslint: '>=2.0.0' + eslint-plugin-prefer-arrow@1.2.3(eslint@8.56.0): dependencies: eslint: 8.56.0 - dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@2.8.8): - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true + eslint-plugin-prettier@4.2.1(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@2.8.8): dependencies: eslint: 8.56.0 - eslint-config-prettier: 9.1.0(eslint@8.56.0) prettier: 2.8.8 prettier-linter-helpers: 1.0.0 - dev: true + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.56.0) - /eslint-plugin-promise@5.2.0(eslint@8.56.0): - resolution: {integrity: sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: ^7.0.0 + eslint-plugin-promise@5.2.0(eslint@8.56.0): dependencies: eslint: 8.56.0 - dev: true - /eslint-plugin-react@7.33.2(eslint@8.56.0): - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-react@7.33.2(eslint@8.56.0): dependencies: array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 @@ -9439,13 +9482,8 @@ packages: resolve: 2.0.0-next.4 semver: 6.3.1 string.prototype.matchall: 4.0.8 - dev: true - /eslint-plugin-unicorn@50.0.1(eslint@8.56.0): - resolution: {integrity: sha512-KxenCZxqSYW0GWHH18okDlOQcpezcitm5aOSz6EnobyJ6BIByiPDviQRjJIUAjG/tMN11958MxaQ+qCoU6lfDA==} - engines: {node: '>=16'} - peerDependencies: - eslint: '>=8.56.0' + eslint-plugin-unicorn@50.0.1(eslint@8.56.0): dependencies: '@babel/helper-validator-identifier': 7.22.20 '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) @@ -9466,50 +9504,28 @@ packages: strip-indent: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} + eslint-utils@2.1.0: dependencies: eslint-visitor-keys: 1.3.0 - dev: true - /eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - dev: true + eslint-visitor-keys@1.3.0: {} - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true + eslint-visitor-keys@2.1.0: {} - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.56.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@eslint-community/regexpp': 4.6.2 @@ -9551,116 +9567,47 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true + estree-walker@2.0.2: {} - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + esutils@2.0.3: {} - /eth-block-tracker@7.1.0: - resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} - engines: {node: '>=14.0.0'} - dependencies: - '@metamask/eth-json-rpc-provider': 1.0.1 - '@metamask/safe-event-emitter': 3.0.0 - '@metamask/utils': 5.0.2 - json-rpc-random-id: 1.0.1 - pify: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true + etag@1.8.1: {} - /eth-ens-namehash@2.0.8: - resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + eth-ens-namehash@2.0.8: dependencies: idna-uts46-hx: 2.3.1 js-sha3: 0.5.7 - dev: true - - /eth-json-rpc-filters@6.0.1: - resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} - engines: {node: '>=14.0.0'} - dependencies: - '@metamask/safe-event-emitter': 3.0.0 - async-mutex: 0.2.6 - eth-query: 2.1.2 - json-rpc-engine: 6.1.0 - pify: 5.0.0 - dev: true - /eth-query@2.1.2: - resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} - dependencies: - json-rpc-random-id: 1.0.1 - xtend: 4.0.2 - dev: true - - /eth-rpc-errors@4.0.3: - resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} - dependencies: - fast-safe-stringify: 2.1.1 - dev: true - - /ethereum-bloom-filters@1.0.10: - resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + ethereum-bloom-filters@1.0.10: dependencies: js-sha3: 0.8.0 - /ethereum-cryptography@0.1.3: - resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + ethereum-cryptography@0.1.3: dependencies: '@types/pbkdf2': 3.1.0 '@types/secp256k1': 4.0.6 @@ -9677,39 +9624,30 @@ packages: scrypt-js: 3.0.1 secp256k1: 4.0.3 setimmediate: 1.0.5 - dev: true - /ethereum-cryptography@1.2.0: - resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + ethereum-cryptography@1.2.0: dependencies: '@noble/hashes': 1.2.0 '@noble/secp256k1': 1.7.1 '@scure/bip32': 1.1.5 '@scure/bip39': 1.1.1 - dev: true - /ethereum-cryptography@2.1.2: - resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + ethereum-cryptography@2.1.2: dependencies: '@noble/curves': 1.1.0 '@noble/hashes': 1.3.1 '@scure/bip32': 1.3.1 '@scure/bip39': 1.2.1 - /ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.3.3): - resolution: {integrity: sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==} - engines: {node: '>=10.0'} - hasBin: true - peerDependencies: - ethers: '*' + ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(typescript@5.4.5): dependencies: - '@ethereum-waffle/chai': 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) - '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.1)(typescript@5.3.3) - '@ethereum-waffle/mock-contract': 4.0.4(ethers@5.7.2) - '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) - ethers: 5.7.2 + '@ethereum-waffle/chai': 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7)) + '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))(solc@0.8.15)(typechain@8.3.1(typescript@5.4.5))(typescript@5.4.5) + '@ethereum-waffle/mock-contract': 4.0.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7)) + '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7)) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) solc: 0.8.15 - typechain: 8.3.1(typescript@5.3.3) + typechain: 8.3.1(typescript@5.4.5) transitivePeerDependencies: - '@ensdomains/ens' - '@ensdomains/resolver' @@ -9719,17 +9657,13 @@ packages: - encoding - supports-color - typescript - dev: true - /ethereumjs-abi@0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + ethereumjs-abi@0.6.8: dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 - dev: true - /ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + ethereumjs-util@6.2.1: dependencies: '@types/bn.js': 4.11.6 bn.js: 4.12.0 @@ -9738,32 +9672,24 @@ packages: ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 rlp: 2.2.7 - dev: true - /ethereumjs-util@7.1.3: - resolution: {integrity: sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==} - engines: {node: '>=10.0.0'} + ethereumjs-util@7.1.3: dependencies: '@types/bn.js': 5.1.0 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 rlp: 2.2.7 - dev: true - /ethereumjs-util@7.1.5: - resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} - engines: {node: '>=10.0.0'} + ethereumjs-util@7.1.5: dependencies: '@types/bn.js': 5.1.0 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 rlp: 2.2.7 - dev: true - /ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7): dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -9783,7 +9709,7 @@ packages: '@ethersproject/networks': 5.7.1 '@ethersproject/pbkdf2': 5.7.0 '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) '@ethersproject/random': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/sha2': 5.7.0 @@ -9799,47 +9725,28 @@ packages: - bufferutil - utf-8-validate - /ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} + ethjs-unit@0.1.6: dependencies: bn.js: 4.11.6 number-to-bn: 1.7.0 - /ethjs-util@0.1.6: - resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} - engines: {node: '>=6.5.0', npm: '>=3'} + ethjs-util@0.1.6: dependencies: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 - dev: true - - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - /eventemitter2@6.4.9: - resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - dev: true + event-target-shim@5.0.1: {} - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: true - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + eventemitter3@5.0.1: {} - /evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + events@3.3.0: {} + + evp_bytestokey@1.0.3: dependencies: md5.js: 1.3.5 safe-buffer: 5.2.1 - dev: true - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -9850,11 +9757,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@8.0.1: dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -9865,40 +9769,29 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} + expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 - dev: true - /express-prom-bundle@7.0.0(prom-client@14.2.0): - resolution: {integrity: sha512-VwVaCyGBGHkHdecpTqRdW1Jm2fXK8weCUKjGjNWorc9g4M+cZ3xoj+N9uQzfRWfIPXJG5QOaiAziOIalQzMwgA==} - engines: {node: '>=18'} - peerDependencies: - prom-client: '>=15.0.0' + express-prom-bundle@7.0.0(prom-client@14.2.0): dependencies: '@types/express': 4.17.21 - express: 4.18.2 + express: 4.19.2 on-finished: 2.4.1 prom-client: 14.2.0 url-value-parser: 2.0.3 transitivePeerDependencies: - supports-color - dev: false - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} + express@4.19.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1 + body-parser: 1.20.2 content-disposition: 0.5.4 - content-type: 1.0.4 - cookie: 0.5.0 + content-type: 1.0.5 + cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 @@ -9926,57 +9819,26 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: false - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true - /extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - dev: false + extend@3.0.2: {} - /extension-port-stream@2.1.1: - resolution: {integrity: sha512-qknp5o5rj2J9CRKfVB8KJr+uXQlrojNZzdESUPhKYLXf97TPcGf6qWWKmpsNNtUyOdzFhab1ON0jzouNxHHvow==} - engines: {node: '>=12.0.0'} - dependencies: - webextension-polyfill: 0.10.0 - dev: true + extendable-error@0.1.7: {} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: false - - /extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - dev: true - /extsprintf@1.4.0: - resolution: {integrity: sha512-6NW8DZ8pWBc5NbGYUiqqccj9dXnuSzilZYqprdKJBZsQodGH9IyUoFOGxIWVDcBzHMb8ET24aqx9p66tZEWZkA==} - engines: {'0': node >=0.6.0} - dev: true + extsprintf@1.3.0: {} - /fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} - dev: true + extsprintf@1.4.0: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - dev: true + fast-diff@1.2.0: {} - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.1: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -9984,89 +9846,33 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fast-redact@3.2.0: - resolution: {integrity: sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==} - engines: {node: '>=6'} + fast-json-stable-stringify@2.1.0: {} - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: true + fast-levenshtein@2.0.6: {} - /fast-xml-parser@4.3.2: - resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} - hasBin: true - dependencies: - strnum: 1.0.5 - dev: true + fast-redact@3.2.0: {} - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.15.0: dependencies: reusify: 1.0.4 - /fault@1.0.4: - resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + fault@1.0.4: dependencies: format: 0.2.2 - dev: true - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: true - - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.0.4 - dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} - dev: true - - /finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.3.0 - parseurl: 1.3.3 - statuses: 1.5.0 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@1.2.0: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -10077,457 +9883,225 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: false - - /find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} - dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 - dev: true - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 - dev: true - /find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} + find-replace@3.0.0: dependencies: array-back: 3.1.0 - dev: true - - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: true - /find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} + find-up@1.1.2: dependencies: path-exists: 2.1.0 pinkie-promise: 2.0.1 - dev: true - /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} + find-up@2.1.0: dependencies: locate-path: 2.0.0 - dev: true - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - dependencies: - locate-path: 3.0.0 - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - dev: true - - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + find-yarn-workspace-root2@1.2.16: dependencies: micromatch: 4.0.5 pkg-dir: 4.2.0 - dev: false - /findup-sync@5.0.0: - resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} - engines: {node: '>= 10.13.0'} + findup-sync@5.0.0: dependencies: detect-file: 1.0.0 is-glob: 4.0.3 micromatch: 4.0.5 resolve-dir: 1.0.1 - dev: true - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.0.4: dependencies: flatted: 3.2.2 rimraf: 3.0.2 - dev: true - - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: true - - /flatted@3.2.2: - resolution: {integrity: sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==} - dev: true - /flow-enums-runtime@0.0.6: - resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} - dev: true + flat@5.0.2: {} - /flow-parser@0.185.2: - resolution: {integrity: sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ==} - engines: {node: '>=0.4.0'} - dev: true - - /flow-parser@0.206.0: - resolution: {integrity: sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==} - engines: {node: '>=0.4.0'} - dev: true + flatted@3.2.2: {} - /fmix@0.1.0: - resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} + fmix@0.1.0: dependencies: imul: 1.0.1 - dev: true - /follow-redirects@1.15.5(debug@4.3.4): - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: + follow-redirects@1.15.5(debug@4.3.4): + optionalDependencies: debug: 4.3.4(supports-color@8.1.1) - dev: true - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} + foreground-child@2.0.0: dependencies: cross-spawn: 7.0.3 signal-exit: 3.0.7 - dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - /forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - dev: true + forever-agent@0.6.1: {} - /form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} + form-data@2.3.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} + form-data@3.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - - /format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - dev: true - /formidable@2.1.2: - resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} - dependencies: - dezalgo: 1.0.4 - hexoid: 1.0.0 - once: 1.4.0 - qs: 6.11.2 - dev: true + format@0.2.2: {} - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: false + forwarded@0.2.0: {} - /fp-ts@1.19.3: - resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} - dev: true + fp-ts@1.19.3: {} - /fp-ts@1.19.5: - resolution: {integrity: sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==} - dev: true + fp-ts@1.19.5: {} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + fresh@0.5.2: {} - /fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - dev: true + fromentries@1.3.2: {} - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true + fs-constants@1.0.0: {} - /fs-extra@0.30.0: - resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} + fs-extra@0.30.0: dependencies: graceful-fs: 4.2.11 jsonfile: 2.4.0 klaw: 1.3.1 path-is-absolute: 1.0.1 rimraf: 2.7.1 - dev: true - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - dev: true - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} + fs-extra@11.1.1: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - dev: true - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - dev: true - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.5: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 functions-have-names: 1.2.3 - /functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + functional-red-black-tree@1.0.1: {} - /futoin-hkdf@1.5.3: - resolution: {integrity: sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==} - engines: {node: '>=8'} - dev: true + functions-have-names@1.2.3: {} - /ganache@7.4.3: - resolution: {integrity: sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==} - hasBin: true - dependencies: - '@trufflesuite/bigint-buffer': 1.1.10 - '@types/bn.js': 5.1.0 - '@types/lru-cache': 5.1.1 - '@types/seedrandom': 3.0.1 - emittery: 0.10.0 - keccak: 3.0.2 - leveldown: 6.1.0 - secp256k1: 4.0.3 + ganache@7.4.3: optionalDependencies: bufferutil: 4.0.5 utf-8-validate: 5.0.7 - dev: true - bundledDependencies: - - '@trufflesuite/bigint-buffer' - - emittery - - keccak - - leveldown - - secp256k1 - - '@types/bn.js' - - '@types/lru-cache' - - '@types/seedrandom' - - /generate-function@2.3.1: - resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} - dependencies: - is-property: 1.0.2 - dev: false - - /generate-object-property@1.2.0: - resolution: {integrity: sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==} - dependencies: - is-property: 1.0.2 - dev: false - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + gensync@1.0.0-beta.2: {} - /get-caller-file@1.0.3: - resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} - dev: true + get-caller-file@1.0.3: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + get-caller-file@2.0.5: {} - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - dev: true + get-east-asian-width@1.2.0: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + get-func-name@2.0.2: {} - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + get-intrinsic@1.2.1: dependencies: function-bind: 1.1.2 has: 1.0.3 has-proto: 1.0.1 has-symbols: 1.0.3 - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - - /get-port-please@3.1.1: - resolution: {integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==} - dev: true + get-package-type@0.1.0: {} - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + get-stream@8.0.1: {} - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 - /get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + get-tsconfig@4.7.2: dependencies: resolve-pkg-maps: 1.0.0 - dev: true - /getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + getpass@0.1.7: dependencies: assert-plus: 1.0.0 - dev: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.3 minipass: 7.0.3 path-scurry: 1.10.1 - dev: true - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + glob@7.1.6: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -10535,10 +10109,8 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + glob@7.1.7: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -10546,10 +10118,8 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + glob@7.2.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -10557,10 +10127,8 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -10568,49 +10136,32 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} + global-modules@1.0.0: dependencies: global-prefix: 1.0.2 is-windows: 1.0.2 resolve-dir: 1.0.1 - dev: true - /global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} + global-prefix@1.0.2: dependencies: expand-tilde: 2.0.2 homedir-polyfill: 1.0.3 ini: 1.3.8 is-windows: 1.0.2 which: 1.3.1 - dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true + globals@11.12.0: {} - /globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} - engines: {node: '>=8'} + globals@13.21.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.0 - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -10619,67 +10170,26 @@ packages: merge2: 1.4.1 slash: 3.0.0 - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.1 - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: false + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + grapheme-splitter@1.0.4: {} - /h3@1.9.0: - resolution: {integrity: sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA==} - dependencies: - cookie-es: 1.0.0 - defu: 6.1.3 - destr: 2.0.2 - iron-webcrypto: 1.0.0 - radix3: 1.1.0 - ufo: 1.3.2 - uncrypto: 0.1.3 - unenv: 1.8.0 - dev: true + graphemer@1.4.0: {} - /har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - dev: true + har-schema@2.0.0: {} - /har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported + har-validator@5.1.5: dependencies: ajv: 6.12.6 har-schema: 2.0.0 - dev: true - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: false + hard-rejection@2.1.0: {} - /hardhat-deploy@0.11.44: - resolution: {integrity: sha512-kAkCvTYPpdIvnWCc3F0xg3AbVsa/SgH9aePPO7e7nHUOkg07LGKuknU/UaVAfWwHe7Zs57pQIAolAQyKI+mnXw==} + hardhat-deploy@0.12.2(bufferutil@4.0.8)(utf-8-validate@5.0.7): dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -10688,7 +10198,7 @@ packages: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/contracts': 5.7.0 - '@ethersproject/providers': 5.7.2 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) '@ethersproject/solidity': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 @@ -10698,30 +10208,19 @@ packages: chokidar: 3.5.3 debug: 4.3.4(supports-color@8.1.1) enquirer: 2.3.6 - ethers: 5.7.2 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) form-data: 4.0.0 fs-extra: 10.1.0 match-all: 1.2.6 murmur-128: 0.2.1 qs: 6.11.2 - zksync-web3: 0.14.3(ethers@5.7.2) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /hardhat@2.20.1(ts-node@10.9.2)(typescript@5.3.3): - resolution: {integrity: sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw==} - hasBin: true - peerDependencies: - ts-node: '*' - typescript: '*' - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true + zksync-ethers: 5.6.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7)) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.7): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.0 @@ -10769,183 +10268,90 @@ packages: solc: 0.7.3(debug@4.3.4) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.2(@types/node@20.11.17)(typescript@5.3.3) tsort: 0.0.1 - typescript: 5.3.3 undici: 5.24.0 uuid: 8.3.2 - ws: 7.5.9 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.7) + optionalDependencies: + ts-node: 10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - bufferutil - c-kzg - supports-color - utf-8-validate - dev: true - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + has-property-descriptors@1.0.0: dependencies: get-intrinsic: 1.2.1 - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} + has-proto@1.0.1: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + has-symbols@1.0.3: {} - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + has@1.0.3: dependencies: function-bind: 1.1.2 - /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} + hash-base@3.1.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 safe-buffer: 5.2.1 - dev: true - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hash.js@1.1.7: dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - /hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} + hasha@5.2.2: dependencies: is-stream: 2.0.1 type-fest: 0.8.1 - dev: true - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} + hasown@2.0.0: dependencies: function-bind: 1.1.2 - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true - - /header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - dependencies: - capital-case: 1.0.4 - tslib: 2.6.2 - - /hermes-estree@0.15.0: - resolution: {integrity: sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==} - dev: true - - /hermes-estree@0.18.2: - resolution: {integrity: sha512-KoLsoWXJ5o81nit1wSyEZnWUGy9cBna9iYMZBR7skKh7okYAYKqQ9/OczwpMHn/cH0hKDyblulGsJ7FknlfVxQ==} - dev: true - - /hermes-parser@0.15.0: - resolution: {integrity: sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==} - dependencies: - hermes-estree: 0.15.0 - dev: true - - /hermes-parser@0.18.2: - resolution: {integrity: sha512-1eQfvib+VPpgBZ2zYKQhpuOjw1tH+Emuib6QmjkJWJMhyjM8xnXMvA+76o9LhF0zOAJDZgPfQhg43cyXEyl5Ew==} - dependencies: - hermes-estree: 0.18.2 - dev: true - - /hermes-profile-transformer@0.0.6: - resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} - engines: {node: '>=8'} - dependencies: - source-map: 0.7.4 - dev: true - - /hexoid@1.0.0: - resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} - engines: {node: '>=8'} - dev: true - - /hey-listen@1.0.8: - resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} - dev: true + he@1.2.0: {} - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - dependencies: - react-is: 16.13.1 - dev: true - - /homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 - dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + hosted-git-info@2.8.9: {} - /html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 - dev: true - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + optional: true - /html-parse-stringify@3.0.1: - resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} - dependencies: - void-elements: 3.1.0 - dev: true + html-escaper@2.0.2: {} - /htmlparser2@7.2.0: - resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + htmlparser2@7.2.0: dependencies: domelementtype: 2.3.0 domhandler: 4.3.1 domutils: 2.8.0 entities: 3.0.1 - dev: true - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 @@ -10953,637 +10359,289 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 - /http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} - engines: {node: '>= 14'} + http-proxy-agent@7.0.0: dependencies: agent-base: 7.1.0 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - - /http-shutdown@1.2.2: - resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true + optional: true - /http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} + http-signature@1.2.0: dependencies: assert-plus: 1.0.0 jsprim: 1.4.1 sshpk: 1.16.1 - dev: true - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} - engines: {node: '>= 14'} + https-proxy-agent@7.0.2: dependencies: agent-base: 7.1.0 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - - /human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - dev: false - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + optional: true - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + human-id@1.0.2: {} - /husky@9.0.10: - resolution: {integrity: sha512-TQGNknoiy6bURzIO77pPRu+XHi6zI7T93rX+QnJsoYFf3xdjKOur+IlfqzJGMHIK/wXrLg+GsvMs8Op7vI2jVA==} - engines: {node: '>=18'} - hasBin: true - dev: true + human-signals@2.1.0: {} - /i18next-browser-languagedetector@7.2.0: - resolution: {integrity: sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==} - dependencies: - '@babel/runtime': 7.23.7 - dev: true + human-signals@5.0.0: {} - /i18next@22.5.1: - resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==} - dependencies: - '@babel/runtime': 7.23.7 - dev: true + husky@9.0.10: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true - - /idb-keyval@6.2.1: - resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} - dev: true + optional: true - /idna-uts46-hx@2.3.1: - resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} - engines: {node: '>=4.0.0'} + idna-uts46-hx@2.3.1: dependencies: punycode: 2.1.0 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - /image-size@1.1.1: - resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} - engines: {node: '>=16.x'} - hasBin: true - dependencies: - queue: 6.0.2 - dev: true + ieee754@1.2.1: {} - /immediate@3.2.3: - resolution: {integrity: sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==} - dev: true + ignore@5.2.4: {} - /immediate@3.3.0: - resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} - dev: true + immediate@3.2.3: {} - /immutable@4.1.0: - resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} - dev: true + immediate@3.3.0: {} - /import-fresh@2.0.0: - resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} - engines: {node: '>=4'} - dependencies: - caller-path: 2.0.0 - resolve-from: 3.0.0 - dev: true + immutable@4.1.0: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /imul@1.0.1: - resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} - engines: {node: '>=0.10.0'} - dev: true + imul@1.0.1: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + indent-string@4.0.0: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} + internal-slot@1.0.5: dependencies: get-intrinsic: 1.2.1 has: 1.0.3 side-channel: 1.0.4 - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - dependencies: - loose-envify: 1.4.0 - dev: true - - /invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} - dev: true + invert-kv@1.0.0: {} - /io-ts@1.10.4: - resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + io-ts@1.10.4: dependencies: fp-ts: 1.19.5 - dev: true - - /ioredis@5.3.2: - resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} - engines: {node: '>=12.22.0'} - dependencies: - '@ioredis/commands': 1.2.0 - cluster-key-slot: 1.1.2 - debug: 4.3.4(supports-color@8.1.1) - denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 - redis-errors: 1.2.0 - redis-parser: 3.0.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /ip@1.1.9: - resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} - dev: true - - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: false - /iron-webcrypto@1.0.0: - resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==} - dev: true + ipaddr.js@1.9.1: {} - /is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: true + is-alphabetical@1.0.4: {} - /is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + is-alphanumerical@1.0.4: dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - dev: true - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.2.1: {} - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.0 - dev: true - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: true + is-buffer@2.0.5: {} - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + is-callable@1.2.7: {} - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + is-core-module@2.13.0: dependencies: has: 1.0.3 - dev: true - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.0 - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.0 - /is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: true - - /is-directory@0.3.1: - resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} - engines: {node: '>=0.10.0'} - dev: true + is-decimal@1.0.4: {} - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true + is-docker@2.2.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.2 - dev: true - /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} + is-fullwidth-code-point@1.0.0: dependencies: number-is-nan: 1.0.1 - dev: true - - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - dev: true - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true + is-fullwidth-code-point@4.0.0: {} - /is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} + is-fullwidth-code-point@5.0.0: dependencies: get-east-asian-width: 1.2.0 - dev: true - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.0 - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} - - /is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - dev: true - - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true - - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: true + is-hex-prefixed@1.0.0: {} - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + is-hexadecimal@1.0.4: {} - /is-my-ip-valid@1.0.1: - resolution: {integrity: sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==} - dev: false + is-interactive@1.0.0: {} - /is-my-json-valid@2.20.6: - resolution: {integrity: sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==} - dependencies: - generate-function: 2.3.1 - generate-object-property: 1.2.0 - is-my-ip-valid: 1.0.1 - jsonpointer: 5.0.1 - xtend: 4.0.2 - dev: false + is-map@2.0.2: {} - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} + is-negative-zero@2.0.2: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.0 - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: false + is-number@7.0.0: {} - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true + is-plain-obj@1.1.0: {} - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true + is-plain-obj@2.1.0: {} - /is-property@1.0.2: - resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - dev: false + is-potential-custom-element-name@1.0.1: + optional: true - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + is-set@2.0.2: {} - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.2: dependencies: call-bind: 1.0.2 - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 - /is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - dev: false - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.12: dependencies: which-typed-array: 1.1.11 - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true - - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true + is-typedarray@1.0.0: {} - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: true + is-unicode-supported@0.1.0: {} - /is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - dev: true + is-url@1.2.4: {} - /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - dev: true + is-utf8@0.2.1: {} - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + is-weakmap@2.0.1: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.2 - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + is-weakset@2.0.2: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - /is-wsl@1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} - dev: true + is-windows@1.0.2: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: true - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true + isarray@2.0.5: {} - /isomorphic-fetch@3.0.0: - resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} - dependencies: - node-fetch: 2.6.12 - whatwg-fetch: 3.6.17 - transitivePeerDependencies: - - encoding - dev: true + isexe@2.0.0: {} - /isomorphic-unfetch@3.1.0: - resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + isomorphic-fetch@3.0.0: dependencies: node-fetch: 2.6.12 - unfetch: 4.2.0 + whatwg-fetch: 3.6.17 transitivePeerDependencies: - encoding - dev: true - - /isomorphic-ws@5.0.0(ws@8.16.0): - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' - dependencies: - ws: 8.16.0 - dev: false - /isows@1.0.3(ws@8.13.0): - resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} - peerDependencies: - ws: '*' + isows@1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.7)): dependencies: - ws: 8.13.0 + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.7) - /isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - dev: true + isstream@0.1.2: {} - /istanbul-lib-coverage@3.0.0: - resolution: {integrity: sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==} - engines: {node: '>=8'} - dev: true + istanbul-lib-coverage@3.0.0: {} - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true + istanbul-lib-coverage@3.2.2: {} - /istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} - engines: {node: '>=8'} + istanbul-lib-hook@3.0.0: dependencies: append-transform: 2.0.0 - dev: true - /istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} + istanbul-lib-instrument@4.0.3: dependencies: '@babel/core': 7.22.10 '@istanbuljs/schema': 0.1.3 @@ -11591,24 +10649,8 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - - /istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} - engines: {node: '>=10'} - dependencies: - '@babel/core': 7.22.10 - '@babel/parser': 7.23.6 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.6.0 - transitivePeerDependencies: - - supports-color - dev: true - /istanbul-lib-processinfo@2.0.2: - resolution: {integrity: sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==} - engines: {node: '>=8'} + istanbul-lib-processinfo@2.0.2: dependencies: archy: 1.0.0 cross-spawn: 7.0.3 @@ -11617,271 +10659,87 @@ packages: p-map: 3.0.0 rimraf: 3.0.2 uuid: 3.4.0 - dev: true - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} + istanbul-lib-report@3.0.0: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 3.1.0 supports-color: 7.2.0 - dev: true - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps@4.0.0: - resolution: {integrity: sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==} - engines: {node: '>=8'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.0: dependencies: debug: 4.3.4(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true - - /istanbul-reports@3.0.2: - resolution: {integrity: sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} + istanbul-reports@3.0.2: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - dev: true - /iterator.prototype@1.1.0: - resolution: {integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==} + iterator.prototype@1.1.0: dependencies: define-properties: 1.2.0 get-intrinsic: 1.2.1 has-symbols: 1.0.3 has-tostringtag: 1.0.0 reflect.getprototypeof: 1.0.3 - dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@29.7.0: dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.11.17 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.22.13 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.11.17 - jest-util: 29.7.0 - dev: true - - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.11.17 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 - dev: true - - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 20.11.17 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: true + jest-get-type@29.6.3: {} - /joi@17.11.0: - resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==} + joi@17.11.0: dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 '@sideway/address': 4.1.4 '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - dev: true - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: true + joycon@3.1.1: {} - /js-sdsl@4.4.2: - resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} - dev: true + js-sdsl@4.4.2: {} - /js-sha3@0.5.7: - resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} - dev: true + js-sha3@0.5.7: {} - /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + js-sha3@0.8.0: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - - /jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - dev: true - - /jsc-android@250231.0.0: - resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} - dev: true - - /jsc-safe-url@0.2.4: - resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} - dev: true - /jscodeshift@0.14.0(@babel/preset-env@7.23.7): - resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 - dependencies: - '@babel/core': 7.22.10 - '@babel/parser': 7.23.6 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.10) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.10) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.22.10) - '@babel/preset-env': 7.23.7(@babel/core@7.22.10) - '@babel/preset-flow': 7.23.3(@babel/core@7.22.10) - '@babel/preset-typescript': 7.23.3(@babel/core@7.22.10) - '@babel/register': 7.23.7(@babel/core@7.22.10) - babel-core: 7.0.0-bridge.0(@babel/core@7.22.10) - chalk: 4.1.2 - flow-parser: 0.206.0 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - neo-async: 2.6.2 - node-dir: 0.1.17 - recast: 0.21.5 - temp: 0.8.4 - write-file-atomic: 2.4.3 - transitivePeerDependencies: - - supports-color - dev: true + jsbn@0.1.1: {} - /jsdoc-type-pratt-parser@4.0.0: - resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} - engines: {node: '>=12.0.0'} - dev: true + jsdoc-type-pratt-parser@4.0.0: {} - /jsdom@24.0.0: - resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true + jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.7): dependencies: cssstyle: 4.0.1 data-urls: 5.0.0 @@ -11902,338 +10760,149 @@ packages: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - ws: 8.16.0 + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@5.0.7) xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - dev: true + optional: true - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true + jsesc@0.5.0: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true + jsesc@2.5.2: {} - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - dev: true + jsesc@3.0.2: {} - /json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-bigint@1.0.0: dependencies: bignumber.js: 9.0.1 - dev: true - - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - /json-rpc-engine@6.1.0: - resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} - engines: {node: '>=10.0.0'} - dependencies: - '@metamask/safe-event-emitter': 2.0.0 - eth-rpc-errors: 4.0.3 - dev: true - - /json-rpc-middleware-stream@4.2.3: - resolution: {integrity: sha512-4iFb0yffm5vo3eFKDbQgke9o17XBcLQ2c3sONrXSbcOLzP8LTojqo8hRGVgtJShhm5q4ZDSNq039fAx9o65E1w==} - engines: {node: '>=14.0.0'} - dependencies: - '@metamask/safe-event-emitter': 3.0.0 - json-rpc-engine: 6.1.0 - readable-stream: 2.3.8 - dev: true - - /json-rpc-random-id@1.0.1: - resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema@0.2.3: - resolution: {integrity: sha512-a3xHnILGMtk+hDOqNwHzF6e2fNbiMrXZvxKQiEv2MlgQP+pjIOzqAmKYD2mDpXYE/44M7g+n9p2bKkYWDUcXCQ==} - dev: true + json-schema@0.2.3: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true + json-stringify-safe@5.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - requiresBuild: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json5@2.2.3: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + jsonc-parser@3.2.0: {} - /jsonfile@2.4.0: - resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + jsonfile@2.4.0: optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.11 - dev: true - - /jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - dev: false - /jsprim@1.4.1: - resolution: {integrity: sha512-4Dj8Rf+fQ+/Pn7C5qeEX02op1WfOss3PKTE9Nsop3Dx+6UPxlm1dr/og7o2cRa5hNN07CACr4NFzRLtj/rjWog==} - engines: {'0': node >=0.6.0} + jsprim@1.4.1: dependencies: assert-plus: 1.0.0 extsprintf: 1.3.0 json-schema: 0.2.3 verror: 1.10.0 - dev: true - /jsx-ast-utils@3.2.0: - resolution: {integrity: sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==} - engines: {node: '>=4.0'} + jsx-ast-utils@3.2.0: dependencies: array-includes: 3.1.7 object.assign: 4.1.4 - dev: true - - /keccak@3.0.1: - resolution: {integrity: sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==} - engines: {node: '>=10.0.0'} - requiresBuild: true - dependencies: - node-addon-api: 2.0.2 - node-gyp-build: 4.6.0 - dev: true - /keccak@3.0.2: - resolution: {integrity: sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==} - engines: {node: '>=10.0.0'} - requiresBuild: true + keccak@3.0.1: dependencies: node-addon-api: 2.0.2 node-gyp-build: 4.6.0 - readable-stream: 3.6.2 - dev: true - /keccak@3.0.3: - resolution: {integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==} - engines: {node: '>=10.0.0'} - requiresBuild: true + keccak@3.0.3: dependencies: node-addon-api: 2.0.2 node-gyp-build: 4.6.0 readable-stream: 3.6.2 - dev: true - - /keyvaluestorage-interface@1.0.0: - resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} - dev: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + kind-of@6.0.3: {} - /klaw@1.3.1: - resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} + klaw@1.3.1: optionalDependencies: graceful-fs: 4.2.11 - dev: true - - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: false + kleur@4.1.5: {} - /lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} + lcid@1.0.0: dependencies: invert-kv: 1.0.0 - dev: true - /level-codec@9.0.2: - resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==} - engines: {node: '>=6'} + level-codec@9.0.2: dependencies: buffer: 5.7.1 - dev: true - - /level-concat-iterator@2.0.1: - resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==} - engines: {node: '>=6'} - dev: true - /level-concat-iterator@3.1.0: - resolution: {integrity: sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==} - engines: {node: '>=10'} - dependencies: - catering: 2.1.1 - dev: true + level-concat-iterator@2.0.1: {} - /level-errors@2.0.1: - resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==} - engines: {node: '>=6'} + level-errors@2.0.1: dependencies: errno: 0.1.8 - dev: true - /level-iterator-stream@4.0.2: - resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==} - engines: {node: '>=6'} + level-iterator-stream@4.0.2: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 xtend: 4.0.2 - dev: true - /level-mem@5.0.1: - resolution: {integrity: sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==} - engines: {node: '>=6'} + level-mem@5.0.1: dependencies: level-packager: 5.1.1 memdown: 5.1.0 - dev: true - /level-packager@5.1.1: - resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==} - engines: {node: '>=6'} + level-packager@5.1.1: dependencies: encoding-down: 6.3.0 levelup: 4.4.0 - dev: true - /level-supports@1.0.1: - resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==} - engines: {node: '>=6'} + level-supports@1.0.1: dependencies: xtend: 4.0.2 - dev: true - - /level-supports@2.1.0: - resolution: {integrity: sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==} - engines: {node: '>=10'} - dev: true - /level-ws@2.0.0: - resolution: {integrity: sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==} - engines: {node: '>=6'} + level-ws@2.0.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 xtend: 4.0.2 - dev: true - - /leveldown@6.1.0: - resolution: {integrity: sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==} - engines: {node: '>=10.12.0'} - requiresBuild: true - dependencies: - abstract-leveldown: 7.2.0 - napi-macros: 2.0.0 - node-gyp-build: 4.6.0 - dev: true - /levelup@4.4.0: - resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==} - engines: {node: '>=6'} + levelup@4.4.0: dependencies: deferred-leveldown: 5.3.0 level-errors: 2.0.1 level-iterator-stream: 4.0.2 level-supports: 1.0.1 xtend: 4.0.2 - dev: true - - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - - /lighthouse-logger@1.4.2: - resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} - dependencies: - debug: 2.6.9 - marky: 1.2.5 - transitivePeerDependencies: - - supports-color - dev: true - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: true + lilconfig@2.1.0: {} - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - dev: true + lilconfig@3.0.0: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lines-and-columns@1.2.4: {} - /lines-and-columns@2.0.3: - resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + lines-and-columns@2.0.3: {} - /lint-staged@15.2.0: - resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} - engines: {node: '>=18.12.0'} - hasBin: true + lint-staged@15.2.0: dependencies: chalk: 5.3.0 commander: 11.1.0 @@ -12247,34 +10916,8 @@ packages: yaml: 2.3.4 transitivePeerDependencies: - supports-color - dev: true - - /listhen@1.5.5: - resolution: {integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==} - hasBin: true - dependencies: - '@parcel/watcher': 2.3.0 - '@parcel/watcher-wasm': 2.3.0 - citty: 0.1.5 - clipboardy: 3.0.0 - consola: 3.2.3 - defu: 6.1.3 - get-port-please: 3.1.1 - h3: 1.9.0 - http-shutdown: 1.2.2 - jiti: 1.21.0 - mlly: 1.4.2 - node-forge: 1.3.1 - pathe: 1.1.1 - std-env: 3.6.0 - ufo: 1.3.2 - untun: 0.1.2 - uqr: 0.1.2 - dev: true - /listr2@8.0.0: - resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} - engines: {node: '>=18.0.0'} + listr2@8.0.0: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -12282,354 +10925,150 @@ packages: log-update: 6.0.0 rfdc: 1.3.0 wrap-ansi: 9.0.0 - dev: true - - /lit-element@3.3.2: - resolution: {integrity: sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ==} - dependencies: - '@lit-labs/ssr-dom-shim': 1.1.1 - '@lit/reactive-element': 1.6.2 - lit-html: 2.8.0 - dev: true - - /lit-html@2.8.0: - resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} - dependencies: - '@types/trusted-types': 2.0.3 - dev: true - - /lit@2.8.0: - resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} - dependencies: - '@lit/reactive-element': 1.6.2 - lit-element: 3.3.2 - lit-html: 2.8.0 - dev: true - /load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} + load-json-file@1.1.0: dependencies: graceful-fs: 4.2.11 parse-json: 2.2.0 pify: 2.3.0 pinkie-promise: 2.0.1 strip-bom: 2.0.0 - dev: true - - /load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} + load-tsconfig@0.2.5: {} + + load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 - dev: false - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} + local-pkg@0.5.0: dependencies: mlly: 1.4.2 pkg-types: 1.0.3 - dev: true - /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + locate-path@2.0.0: dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - dev: true - - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-locate: 6.0.0 - dev: true - - /lodash.assign@4.2.0: - resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} - dev: true - - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true - - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: true - - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: true - - /lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - dev: true - - /lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - dev: true + lodash.assign@4.2.0: {} - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: true + lodash.camelcase@4.3.0: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.flattendeep@4.4.0: {} - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true + lodash.merge@4.6.2: {} - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: false + lodash.sortby@4.7.0: {} - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: true + lodash.startcase@4.4.0: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - - /log-symbols@5.1.0: - resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} - engines: {node: '>=12'} - dependencies: - chalk: 5.3.0 - is-unicode-supported: 1.3.0 - dev: true - /log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} - engines: {node: '>=18'} + log-update@6.0.0: dependencies: ansi-escapes: 6.2.0 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - dev: true - - /logkitty@0.7.1: - resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} - hasBin: true - dependencies: - ansi-fragments: 0.2.1 - dayjs: 1.11.10 - yargs: 15.4.1 - dev: true - /longest-streak@2.0.4: - resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} - dev: true + longest-streak@2.0.4: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - dependencies: - tslib: 2.6.2 - - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} - engines: {node: 14 || >=16.14} - dev: true + lru-cache@10.1.0: {} - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 - dev: false - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - /lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - dev: true - - /ltgt@2.2.1: - resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} - dev: true + lru_map@0.3.3: {} - /lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - dev: true + ltgt@2.2.1: {} - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: false + lunr@2.3.9: {} - /magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} + magic-string@0.30.5: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /magicast@0.3.3: - resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} - dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - source-map-js: 1.0.2 - dev: true - - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - dependencies: - pify: 4.0.1 - semver: 5.7.2 - dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.1 - dev: true - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: semver: 7.6.0 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true + make-error@1.3.6: {} - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: false + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: false + map-obj@4.3.0: {} - /markdown-table@2.0.0: - resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + markdown-table@2.0.0: dependencies: repeat-string: 1.6.1 - dev: true - - /marked@4.3.0: - resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} - engines: {node: '>= 12'} - hasBin: true - dev: true - /marky@1.2.5: - resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} - dev: true + marked@4.3.0: {} - /match-all@1.2.6: - resolution: {integrity: sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==} - dev: true + match-all@1.2.6: {} - /mcl-wasm@0.7.8: - resolution: {integrity: sha512-qNHlYO6wuEtSoH5A8TcZfCEHtw8gGPqF6hLZpQn2SVd/Mck0ELIKOkmj072D98S9B9CI/jZybTUC96q1P2/ZDw==} - engines: {node: '>=8.9.0'} + mcl-wasm@0.7.8: dependencies: typescript: 4.9.5 - dev: true - /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + md5.js@1.3.5: dependencies: hash-base: 3.1.0 inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - /mdast-util-find-and-replace@1.1.1: - resolution: {integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==} + mdast-util-find-and-replace@1.1.1: dependencies: escape-string-regexp: 4.0.0 unist-util-is: 4.1.0 unist-util-visit-parents: 3.1.1 - dev: true - /mdast-util-footnote@0.1.7: - resolution: {integrity: sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==} + mdast-util-footnote@0.1.7: dependencies: mdast-util-to-markdown: 0.6.5 micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + mdast-util-from-markdown@0.8.5: dependencies: '@types/mdast': 3.0.10 mdast-util-to-string: 2.0.0 @@ -12638,45 +11077,33 @@ packages: unist-util-stringify-position: 2.0.3 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-frontmatter@0.2.0: - resolution: {integrity: sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==} + mdast-util-frontmatter@0.2.0: dependencies: micromark-extension-frontmatter: 0.2.2 - dev: true - /mdast-util-gfm-autolink-literal@0.1.3: - resolution: {integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==} + mdast-util-gfm-autolink-literal@0.1.3: dependencies: ccount: 1.1.0 mdast-util-find-and-replace: 1.1.1 micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-gfm-strikethrough@0.2.3: - resolution: {integrity: sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==} + mdast-util-gfm-strikethrough@0.2.3: dependencies: mdast-util-to-markdown: 0.6.5 - dev: true - /mdast-util-gfm-table@0.1.6: - resolution: {integrity: sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==} + mdast-util-gfm-table@0.1.6: dependencies: markdown-table: 2.0.0 mdast-util-to-markdown: 0.6.5 - dev: true - /mdast-util-gfm-task-list-item@0.1.6: - resolution: {integrity: sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==} + mdast-util-gfm-task-list-item@0.1.6: dependencies: mdast-util-to-markdown: 0.6.5 - dev: true - /mdast-util-gfm@0.1.2: - resolution: {integrity: sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==} + mdast-util-gfm@0.1.2: dependencies: mdast-util-gfm-autolink-literal: 0.1.3 mdast-util-gfm-strikethrough: 0.2.3 @@ -12685,10 +11112,8 @@ packages: mdast-util-to-markdown: 0.6.5 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-to-markdown@0.6.5: - resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} + mdast-util-to-markdown@0.6.5: dependencies: '@types/unist': 2.0.6 longest-streak: 2.0.4 @@ -12696,20 +11121,12 @@ packages: parse-entities: 2.0.0 repeat-string: 1.6.1 zwitch: 1.0.5 - dev: true - /mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - dev: true + mdast-util-to-string@2.0.0: {} - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: false + media-typer@0.3.0: {} - /memdown@5.1.0: - resolution: {integrity: sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==} - engines: {node: '>=6'} + memdown@5.1.0: dependencies: abstract-leveldown: 6.2.3 functional-red-black-tree: 1.0.1 @@ -12717,20 +11134,10 @@ packages: inherits: 2.0.4 ltgt: 2.2.1 safe-buffer: 5.2.1 - dev: true - - /memoize-one@5.2.1: - resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} - dev: true - /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - dev: true + memorystream@0.3.1: {} - /meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} + meow@6.1.1: dependencies: '@types/minimist': 1.2.2 camelcase-keys: 6.2.2 @@ -12743,29 +11150,14 @@ packages: trim-newlines: 3.0.1 type-fest: 0.13.1 yargs-parser: 18.1.3 - dev: false - - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: false - /merge-options@3.0.4: - resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} - engines: {node: '>=10'} - dependencies: - is-plain-obj: 2.1.0 - dev: true + merge-descriptors@1.0.1: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + merge2@1.4.1: {} - /merkle-patricia-tree@4.2.4: - resolution: {integrity: sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==} + merkle-patricia-tree@4.2.4: dependencies: '@types/levelup': 4.3.3 ethereumjs-util: 7.1.5 @@ -12773,289 +11165,56 @@ packages: level-ws: 2.0.0 readable-stream: 3.6.2 semaphore-async-await: 1.5.1 - dev: true - /merkletreejs@0.3.11: - resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} - engines: {node: '>= 7.6.0'} + merkletreejs@0.3.11: dependencies: bignumber.js: 9.0.1 buffer-reverse: 1.0.1 crypto-js: 4.2.0 treeify: 1.1.0 web3-utils: 1.10.1 - dev: false - - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - /metro-babel-transformer@0.80.3: - resolution: {integrity: sha512-Si1GO9fhiLi3DfHseFDaZcU+Y6iYHx54rszILnBIx80aas3pRZpL3z/UsEZ7coTQZTFsblt2QDIE+Izxlq4mwQ==} - engines: {node: '>=18'} - dependencies: - '@babel/core': 7.22.10 - hermes-parser: 0.18.2 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /metro-cache-key@0.80.3: - resolution: {integrity: sha512-WNrtDpbhtW2Yqjp1t0WxJhKNR/Zbo1LZ4WvHsdv/PraAs2mr+SaM5bbiptBSKOOGJkV/FIQveW5riZi53JnCbw==} - engines: {node: '>=18'} - dev: true - - /metro-cache@0.80.3: - resolution: {integrity: sha512-7gHcOIXdAHCBzsovF4b+VgcfIZtCpCIFiT2zx9amU58xrmkx+PRIl1KZDIUfRBbGrO9HJtZxH7lr7/hoiLIUWA==} - engines: {node: '>=18'} - dependencies: - metro-core: 0.80.3 - rimraf: 3.0.2 - dev: true - - /metro-config@0.80.3: - resolution: {integrity: sha512-cE7KPT1Usdrd2nLEVpzukKWmeBU1PufHPkuD9BjjtoABbzdj35gMLDnK+mhjSq9km2vF2QEPtE0M+WKvq9pXfQ==} - engines: {node: '>=18'} - dependencies: - connect: 3.7.0 - cosmiconfig: 5.2.1 - jest-validate: 29.7.0 - metro: 0.80.3 - metro-cache: 0.80.3 - metro-core: 0.80.3 - metro-runtime: 0.80.3 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - /metro-core@0.80.3: - resolution: {integrity: sha512-X2ZfAvR55TdD/Rv9i4gYVI68JpRPHcpKpkr6IVtidFPoNjf4Fodh1qH7gEAJUnO5FL3a1JyPffbW6eFaXPxkFw==} - engines: {node: '>=18'} - dependencies: - lodash.throttle: 4.1.1 - metro-resolver: 0.80.3 - dev: true - - /metro-file-map@0.80.3: - resolution: {integrity: sha512-4qu1ABPZRvboGGB8Q2RlQ26kZRWRCMDiktgCCrX/57V6cnWgdbdTrpnsgmU3i0Q7iiw+FevOGlfD4HqdauQ59g==} - engines: {node: '>=18'} - dependencies: - anymatch: 3.1.3 - debug: 2.6.9 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - invariant: 2.2.4 - jest-worker: 29.7.0 - micromatch: 4.0.5 - node-abort-controller: 3.1.1 - nullthrows: 1.1.1 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /metro-minify-terser@0.80.3: - resolution: {integrity: sha512-gVFwoL86emFoYbI2DZKk1Ved2CklYv//huWriF0UpLJHmVEO9ii2ajTx3aIxgSeuxFLPJhdp8RgUB2EDCooaJw==} - engines: {node: '>=18'} - dependencies: - terser: 5.26.0 - dev: true - - /metro-resolver@0.80.3: - resolution: {integrity: sha512-zwa0i32rj/TI3NivcvMXHJwTG2gUgo2dXdcnAJlhEKKQvyN+7AfhNdQSlDdDqMQmU7FaLRdeWORnQJbYCrprQQ==} - engines: {node: '>=18'} - dev: true - - /metro-runtime@0.80.3: - resolution: {integrity: sha512-16RKcwpxriNnPdE5eKWJu7/KLgxE+AaDAdYthoS6zbzjaOu7RiY2zPM1Elz175Rw//74kOwtKXgxTW8ADHB8SQ==} - engines: {node: '>=18'} - dependencies: - '@babel/runtime': 7.23.7 - dev: true - - /metro-source-map@0.80.3: - resolution: {integrity: sha512-5DYcOLPjDLx84ZCZ1i0DuWSPU7AY5G/7tR+u/WN6CZNxLyYEe3TwUBdIUgQj4HgZJl/zZ/7bGYJQOHd7ubuO0w==} - engines: {node: '>=18'} - dependencies: - '@babel/traverse': 7.23.3 - '@babel/types': 7.23.6 - invariant: 2.2.4 - metro-symbolicate: 0.80.3 - nullthrows: 1.1.1 - ob1: 0.80.3 - source-map: 0.5.7 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /metro-symbolicate@0.80.3: - resolution: {integrity: sha512-baIt8Ss2vTGbxolRTa5yg+tKVAIAB1OpwMzJ0FSUjLs+HDAzaOtSpGbNd3DPc+pzX8Gj/rdbDOA0wPuOhVsHKQ==} - engines: {node: '>=18'} - hasBin: true - dependencies: - invariant: 2.2.4 - metro-source-map: 0.80.3 - nullthrows: 1.1.1 - source-map: 0.5.7 - through2: 2.0.5 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /metro-transform-plugins@0.80.3: - resolution: {integrity: sha512-/2hGGRdJPrNfB9lz8unukaqQpGpDhYwNM0Odfh37OVFjygMB30Ffd8neQ4FNqnHnFxhl5j8VTcopUg6QhygMGQ==} - engines: {node: '>=18'} - dependencies: - '@babel/core': 7.22.10 - '@babel/generator': 7.23.3 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.3 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /metro-transform-worker@0.80.3: - resolution: {integrity: sha512-10ZwMDuSWyHwqNnZ50baNtHNuHhOnqThbTOgv03PsrmPHWmSv4/rrmm7711tEyLUxptY3A1hEgJ+LKYyOIQiUA==} - engines: {node: '>=18'} - dependencies: - '@babel/core': 7.22.10 - '@babel/generator': 7.23.3 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - metro: 0.80.3 - metro-babel-transformer: 0.80.3 - metro-cache: 0.80.3 - metro-cache-key: 0.80.3 - metro-source-map: 0.80.3 - metro-transform-plugins: 0.80.3 - nullthrows: 1.1.1 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - /metro@0.80.3: - resolution: {integrity: sha512-7u6HjWVQR7wA/HbxzB0n6iQ0GI9s/fr49N++dZQ41BcrcFxrguIGaRe4W8VI5DtYifCVCjXDIFw6e9+MAccx/Q==} - engines: {node: '>=18'} - hasBin: true - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/core': 7.22.10 - '@babel/generator': 7.23.3 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.3 - '@babel/types': 7.23.6 - accepts: 1.3.8 - chalk: 4.1.2 - ci-info: 2.0.0 - connect: 3.7.0 - debug: 2.6.9 - denodeify: 1.2.1 - error-stack-parser: 2.1.4 - graceful-fs: 4.2.11 - hermes-parser: 0.18.2 - image-size: 1.1.1 - invariant: 2.2.4 - jest-worker: 29.7.0 - jsc-safe-url: 0.2.4 - lodash.throttle: 4.1.1 - metro-babel-transformer: 0.80.3 - metro-cache: 0.80.3 - metro-cache-key: 0.80.3 - metro-config: 0.80.3 - metro-core: 0.80.3 - metro-file-map: 0.80.3 - metro-minify-terser: 0.80.3 - metro-resolver: 0.80.3 - metro-runtime: 0.80.3 - metro-source-map: 0.80.3 - metro-symbolicate: 0.80.3 - metro-transform-plugins: 0.80.3 - metro-transform-worker: 0.80.3 - mime-types: 2.1.35 - node-fetch: 2.6.12 - nullthrows: 1.1.1 - rimraf: 3.0.2 - serialize-error: 2.1.0 - source-map: 0.5.7 - strip-ansi: 6.0.1 - throat: 5.0.0 - ws: 7.5.9 - yargs: 17.7.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true + methods@1.1.2: {} - /micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + micro-ftch@0.3.1: {} - /micromark-extension-footnote@0.3.2: - resolution: {integrity: sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==} + micromark-extension-footnote@0.3.2: dependencies: micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /micromark-extension-frontmatter@0.2.2: - resolution: {integrity: sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==} + micromark-extension-frontmatter@0.2.2: dependencies: fault: 1.0.4 - dev: true - /micromark-extension-gfm-autolink-literal@0.5.7: - resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} + micromark-extension-gfm-autolink-literal@0.5.7: dependencies: micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /micromark-extension-gfm-strikethrough@0.6.5: - resolution: {integrity: sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==} + micromark-extension-gfm-strikethrough@0.6.5: dependencies: micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /micromark-extension-gfm-table@0.4.3: - resolution: {integrity: sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==} + micromark-extension-gfm-table@0.4.3: dependencies: micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /micromark-extension-gfm-tagfilter@0.3.0: - resolution: {integrity: sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==} - dev: true + micromark-extension-gfm-tagfilter@0.3.0: {} - /micromark-extension-gfm-task-list-item@0.3.3: - resolution: {integrity: sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==} + micromark-extension-gfm-task-list-item@0.3.3: dependencies: micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /micromark-extension-gfm@0.3.3: - resolution: {integrity: sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==} + micromark-extension-gfm@0.3.3: dependencies: micromark: 2.11.4 micromark-extension-gfm-autolink-literal: 0.5.7 @@ -13065,192 +11224,97 @@ packages: micromark-extension-gfm-task-list-item: 0.3.3 transitivePeerDependencies: - supports-color - dev: true - /micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + micromark@2.11.4: dependencies: debug: 4.3.4(supports-color@8.1.1) parse-entities: 2.0.0 transitivePeerDependencies: - supports-color - dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - /miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} - hasBin: true + miller-rabin@4.0.1: dependencies: bn.js: 4.12.0 brorand: 1.1.0 - dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true - - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: true + mime@1.6.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + min-indent@1.0.1: {} - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + minimalistic-assert@1.0.1: {} - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimalistic-crypto-utils@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} + minimatch@5.0.1: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} + minimatch@7.4.6: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: false - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + minimist@1.2.8: {} - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - dev: true - /minipass@7.0.3: - resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.0.3: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: true - - /mipd@0.0.5(typescript@5.3.3): - resolution: {integrity: sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 5.3.3 - viem: 1.20.3(typescript@5.3.3) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - dev: true - /mixme@0.5.4: - resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} - engines: {node: '>= 8.0.0'} - dev: false + mixme@0.5.4: {} - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - dev: true - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true + mkdirp@1.0.4: {} - /mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + mlly@1.4.2: dependencies: acorn: 8.10.0 pathe: 1.1.1 pkg-types: 1.0.3 ufo: 1.3.2 - dev: true - /mnemonist@0.38.3: - resolution: {integrity: sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==} + mnemonist@0.38.3: dependencies: obliterator: 1.6.1 - dev: true - /mocha@10.2.0: - resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} - engines: {node: '>= 14.0.0'} - hasBin: true + mocha@10.2.0: dependencies: ansi-colors: 4.1.1 browser-stdout: 1.3.1 @@ -13273,11 +11337,8 @@ packages: yargs: 16.2.0 yargs-parser: 20.2.4 yargs-unparser: 2.0.0 - dev: true - /morgan@1.10.0: - resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} - engines: {node: '>= 0.8.0'} + morgan@1.10.0: dependencies: basic-auth: 2.0.1 debug: 2.6.9 @@ -13286,254 +11347,88 @@ packages: on-headers: 1.0.2 transitivePeerDependencies: - supports-color - dev: false - - /motion@10.16.2: - resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} - dependencies: - '@motionone/animation': 10.15.1 - '@motionone/dom': 10.16.2 - '@motionone/svelte': 10.16.2 - '@motionone/types': 10.15.1 - '@motionone/utils': 10.15.1 - '@motionone/vue': 10.16.2 - dev: true - - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: true - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + ms@2.0.0: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + ms@2.1.2: {} - /multiformats@9.9.0: - resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} - dev: true + ms@2.1.3: {} - /multimatch@5.0.0: - resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} - engines: {node: '>=10'} + multimatch@5.0.0: dependencies: '@types/minimatch': 3.0.5 array-differ: 3.0.0 array-union: 2.1.0 arrify: 2.0.1 minimatch: 3.1.2 - dev: true - /murmur-128@0.2.1: - resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} + murmur-128@0.2.1: dependencies: encode-utf8: 1.0.3 fmix: 0.1.0 imul: 1.0.1 - dev: true - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: true - - /nanoid@3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /napi-macros@2.0.0: - resolution: {integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==} - dev: true - - /napi-wasm@1.1.0: - resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true - - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - dependencies: - lower-case: 2.0.2 - tslib: 2.6.2 - - /nocache@3.0.4: - resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} - engines: {node: '>=12.0.0'} - dev: true - /node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - dev: true + nanoid@3.3.3: {} - /node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - dev: true - - /node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - dev: true + nanoid@3.3.7: {} - /node-addon-api@7.0.0: - resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} - dev: true - - /node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} - dependencies: - minimatch: 3.1.2 - dev: true + natural-compare@1.4.0: {} - /node-fetch-native@1.4.1: - resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} - dev: true + negotiator@0.6.3: {} - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 + node-addon-api@2.0.2: {} - /node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.6.12: dependencies: whatwg-url: 5.0.0 - dev: false - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true - - /node-gyp-build@4.3.0: - resolution: {integrity: sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==} - hasBin: true - requiresBuild: true - dev: true + node-gyp-build@4.3.0: optional: true - /node-gyp-build@4.4.0: - resolution: {integrity: sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==} - hasBin: true - dev: true - - /node-gyp-build@4.6.0: - resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} - hasBin: true - dev: true - - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true + node-gyp-build@4.6.0: {} - /node-machine-id@1.1.12: - resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - dev: true + node-machine-id@1.1.12: {} - /node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} + node-preload@0.2.1: dependencies: process-on-spawn: 1.0.0 - dev: true - - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true - /node-stream-zip@1.15.0: - resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} - engines: {node: '>=0.12.0'} - dev: true + node-releases@2.0.14: {} - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.4 semver: 5.7.2 validate-npm-package-license: 3.0.4 - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-path@3.0.0: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.1.0: dependencies: path-key: 4.0.0 - dev: true - - /nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - dev: true - /number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - dev: true + number-is-nan@1.0.1: {} - /number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} + number-to-bn@1.7.0: dependencies: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: true + nwsapi@2.2.7: + optional: true - /nx-cloud@18.0.0: - resolution: {integrity: sha512-VpPywcHmFIU3GSWb3KV3nQ+TAMLc06DTO39vTFsM+HreB6qRloDxbADRvfM5eHAbY26TNmwflT7wxd0fluv2+A==} - hasBin: true + nx-cloud@18.0.0: dependencies: '@nrwl/nx-cloud': 18.0.0 axios: 1.1.3 @@ -13547,22 +11442,10 @@ packages: yargs-parser: 21.1.1 transitivePeerDependencies: - debug - dev: true - /nx@18.0.4: - resolution: {integrity: sha512-Njb1fGppOw/wM7nOA1hYlLduV2aL4PdXSv5QS5cVYicHT5tw5RnG/0z4j9e6QfFj2EydxVeDUtlGR98diZ3/Yw==} - hasBin: true - requiresBuild: true - peerDependencies: - '@swc-node/register': ^1.8.0 - '@swc/core': ^1.3.85 - peerDependenciesMeta: - '@swc-node/register': - optional: true - '@swc/core': - optional: true + nx@18.2.2(@swc/core@1.4.13): dependencies: - '@nrwl/tao': 18.0.4 + '@nrwl/tao': 18.2.2(@swc/core@1.4.13) '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.6 @@ -13597,24 +11480,21 @@ packages: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 18.0.4 - '@nx/nx-darwin-x64': 18.0.4 - '@nx/nx-freebsd-x64': 18.0.4 - '@nx/nx-linux-arm-gnueabihf': 18.0.4 - '@nx/nx-linux-arm64-gnu': 18.0.4 - '@nx/nx-linux-arm64-musl': 18.0.4 - '@nx/nx-linux-x64-gnu': 18.0.4 - '@nx/nx-linux-x64-musl': 18.0.4 - '@nx/nx-win32-arm64-msvc': 18.0.4 - '@nx/nx-win32-x64-msvc': 18.0.4 + '@nx/nx-darwin-arm64': 18.2.2 + '@nx/nx-darwin-x64': 18.2.2 + '@nx/nx-freebsd-x64': 18.2.2 + '@nx/nx-linux-arm-gnueabihf': 18.2.2 + '@nx/nx-linux-arm64-gnu': 18.2.2 + '@nx/nx-linux-arm64-musl': 18.2.2 + '@nx/nx-linux-x64-gnu': 18.2.2 + '@nx/nx-linux-x64-musl': 18.2.2 + '@nx/nx-win32-arm64-msvc': 18.2.2 + '@nx/nx-win32-x64-msvc': 18.2.2 + '@swc/core': 1.4.13 transitivePeerDependencies: - debug - dev: true - /nyc@15.1.0: - resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} - engines: {node: '>=8.9'} - hasBin: true + nyc@15.1.0: dependencies: '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 @@ -13645,195 +11525,99 @@ packages: yargs: 15.4.1 transitivePeerDependencies: - supports-color - dev: true - - /oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - dev: true - /ob1@0.80.3: - resolution: {integrity: sha512-lKJ/Wp6eSyYKYKYds1lgiDRtD2j9nNhrhx4hwegxYXTBkWz4dqermZV+Bq0iw0SszUIb+fC+btNSXwc4AG1lBQ==} - engines: {node: '>=18'} - dev: true - - /obj-multiplex@1.0.0: - resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - readable-stream: 2.3.8 - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true + oauth-sign@0.9.0: {} - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + object-assign@4.1.1: {} - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - dev: false + object-inspect@1.12.3: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + object-keys@1.1.1: {} - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.4: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 has-symbols: 1.0.3 object-keys: 1.1.1 - /object.entries@1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} - engines: {node: '>= 0.4'} + object.entries@1.1.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true - /object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.7: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true - /object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + object.groupby@1.0.1: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 get-intrinsic: 1.2.1 - dev: true - /object.hasown@1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + object.hasown@1.1.2: dependencies: define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} - engines: {node: '>= 0.4'} + object.values@1.1.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} + object.values@1.1.7: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true - - /obliterator@1.6.1: - resolution: {integrity: sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==} - dev: true - /ofetch@1.3.3: - resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} - dependencies: - destr: 2.0.2 - node-fetch-native: 1.4.1 - ufo: 1.3.2 - dev: true + obliterator@1.6.1: {} - /on-exit-leak-free@0.2.0: - resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + on-exit-leak-free@0.2.0: {} - /on-exit-leak-free@2.1.0: - resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} + on-exit-leak-free@2.1.0: {} - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} + on-headers@1.0.2: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - - /open@6.4.0: - resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} - engines: {node: '>=8'} - dependencies: - is-wsl: 1.1.0 - dev: true - - /open@7.4.2: - resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: true - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -13841,193 +11625,84 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - - /ora@5.3.0: - resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.0 - is-interactive: 1.0.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.3.0: dependencies: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.9.0 is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - - /ora@6.3.1: - resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - chalk: 5.3.0 - cli-cursor: 4.0.0 - cli-spinners: 2.9.0 - is-interactive: 2.0.0 - is-unicode-supported: 1.3.0 - log-symbols: 5.1.0 - stdin-discarder: 0.1.0 - strip-ansi: 7.1.0 - wcwidth: 1.0.1 - dev: true - /os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} + os-locale@1.4.0: dependencies: lcid: 1.0.0 - dev: true - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + os-tmpdir@1.0.2: {} - /outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - dev: false + outdent@0.5.0: {} - /p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} + p-filter@2.1.0: dependencies: p-map: 2.1.0 - dev: false - /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + p-limit@1.3.0: dependencies: p-try: 1.0.0 - dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + p-limit@5.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + p-locate@2.0.0: dependencies: p-limit: 1.3.0 - dev: true - - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@4.1.0: dependencies: - p-limit: 3.1.0 + p-limit: 2.3.0 - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@5.0.0: dependencies: - p-limit: 4.0.0 - dev: true + p-limit: 3.1.0 - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: false + p-map@2.1.0: {} - /p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} + p-map@3.0.0: dependencies: aggregate-error: 3.1.0 - dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - dev: true - /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - dev: true + p-try@1.0.0: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + p-try@2.2.0: {} - /package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} + package-hash@4.0.0: dependencies: graceful-fs: 4.2.11 hasha: 5.2.2 lodash.flattendeep: 4.4.0 release-zalgo: 1.0.0 - dev: true - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-entities@2.0.0: dependencies: character-entities: 1.2.4 character-entities-legacy: 1.1.4 @@ -14035,234 +11710,117 @@ packages: is-alphanumerical: 1.0.4 is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - dev: true - - /parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - dependencies: - error-ex: 1.3.2 - dev: true - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + parse-json@2.2.0: dependencies: error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.22.13 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - dev: true + parse-passwd@1.0.0: {} - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: true - - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 + optional: true - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true + parseurl@1.3.3: {} - /path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 + path-browserify@1.0.1: {} - /path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} + path-exists@2.1.0: dependencies: pinkie-promise: 2.0.1 - dev: true - - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + path-exists@3.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parse@1.0.7: {} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.1: dependencies: lru-cache: 10.1.0 minipass: 7.0.3 - dev: true - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: false + path-to-regexp@0.1.7: {} - /path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} + path-type@1.1.0: dependencies: graceful-fs: 4.2.11 pify: 2.3.0 pinkie-promise: 2.0.1 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-type@4.0.0: {} - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true + pathe@1.1.1: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@1.1.1: {} - /pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} + pbkdf2@3.1.2: dependencies: create-hash: 1.2.0 create-hmac: 1.1.7 ripemd160: 2.0.2 safe-buffer: 5.2.1 sha.js: 2.4.11 - dev: true - - /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + performance-now@2.1.0: {} - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + picocolors@1.0.0: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true + picomatch@2.3.1: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true + pidtree@0.6.0: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + pify@2.3.0: {} - /pify@5.0.0: - resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} - engines: {node: '>=10'} - dev: true + pify@4.0.1: {} - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + pinkie-promise@2.0.1: dependencies: pinkie: 2.0.4 - dev: true - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: true + pinkie@2.0.4: {} - /pino-abstract-transport@0.5.0: - resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + pino-abstract-transport@0.5.0: dependencies: duplexify: 4.1.2 split2: 4.2.0 - /pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + pino-abstract-transport@1.1.0: dependencies: readable-stream: 4.4.2 split2: 4.2.0 - /pino-multi-stream@6.0.0: - resolution: {integrity: sha512-oCuTtaDSUB5xK1S45r9oWE0Dj8RWdHVvaGTft5pO/rmzgIqQRkilf5Ooilz3uRm0IYj8sPRho3lVx48LCmXjvQ==} - deprecated: No longer supported. Use the multi-stream support in the latest core Pino + pino-multi-stream@6.0.0: dependencies: pino: 7.11.0 - dev: false - /pino-sentry@0.14.0: - resolution: {integrity: sha512-UwX0zgJk2ToA1c1f6QpJ7OlWEwxMFt5apJgCYNhhBbuuJuPDmqEzDRMrWKcbF3HKFuupoaNWK6S3o4XXPmI9Rw==} - engines: {node: '>=10'} - hasBin: true + pino-sentry@0.14.0: dependencies: '@sentry/node': 7.99.0 commander: 2.20.3 pumpify: 2.0.1 split2: 3.2.2 through2: 3.0.2 - dev: false - /pino-std-serializers@4.0.0: - resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + pino-std-serializers@4.0.0: {} - /pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + pino-std-serializers@6.2.2: {} - /pino@7.11.0: - resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} - hasBin: true + pino@7.11.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.2.0 @@ -14276,9 +11834,7 @@ packages: sonic-boom: 2.8.0 thread-stream: 0.15.2 - /pino@8.19.0: - resolution: {integrity: sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==} - hasBin: true + pino@8.19.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.2.0 @@ -14292,627 +11848,183 @@ packages: sonic-boom: 3.7.0 thread-stream: 2.4.0 - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - - /pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} - dependencies: - find-up: 3.0.0 - dev: true + pirates@4.0.6: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + pkg-types@1.0.3: dependencies: jsonc-parser: 3.2.0 mlly: 1.4.2 pathe: 1.1.1 - dev: true - /please-upgrade-node@3.2.0: - resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + please-upgrade-node@3.2.0: dependencies: semver-compare: 1.0.0 - dev: true - - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true - - /pngjs@5.0.0: - resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} - engines: {node: '>=10.13.0'} - dev: true - /pony-cause@2.1.10: - resolution: {integrity: sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw==} - engines: {node: '>=12.0.0'} - dev: true + pluralize@8.0.0: {} - /postcss-load-config@4.0.1: - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss-load-config@4.0.1(postcss@8.4.35)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5)): dependencies: lilconfig: 2.1.0 yaml: 2.3.4 - dev: true - - /postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true + optionalDependencies: + postcss: 8.4.35 + ts-node: 10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5) - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.35: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true - /preact@10.16.0: - resolution: {integrity: sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA==} - dev: true - - /preferred-pm@3.0.3: - resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} - engines: {node: '>=10'} + preferred-pm@3.0.3: dependencies: find-up: 5.0.0 find-yarn-workspace-root2: 1.2.16 path-exists: 4.0.0 - which-pm: 2.0.0 - dev: false - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - dependencies: - fast-diff: 1.2.0 - dev: true - - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - /prettier@3.1.1: - resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /pretty-format@26.6.2: - resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} - engines: {node: '>= 10'} - dependencies: - '@jest/types': 26.6.2 - ansi-regex: 5.0.1 - ansi-styles: 4.3.0 - react-is: 17.0.2 - dev: true - - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: false - - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /process-nextick-args@1.0.7: - resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} - dev: true - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - - /process-on-spawn@1.0.0: - resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} - engines: {node: '>=8'} - dependencies: - fromentries: 1.3.2 - dev: true - - /process-warning@1.0.0: - resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} - - /process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - /prom-client@14.2.0: - resolution: {integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==} - engines: {node: '>=10'} - dependencies: - tdigest: 0.1.1 - dev: false - - /promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} - dependencies: - asap: 2.0.6 - dev: true - - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - dev: true - - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - dev: false - - /proxy-compare@2.5.1: - resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} - dev: true - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true - - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - dev: true - - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: false - - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - /pumpify@2.0.1: - resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} - dependencies: - duplexify: 4.1.2 - inherits: 2.0.4 - pump: 3.0.0 - dev: false - - /punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - dev: true - - /punycode@2.1.0: - resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} - engines: {node: '>=6'} - dev: true - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true - - /qr-code-styling@1.6.0-rc.1: - resolution: {integrity: sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==} - dependencies: - qrcode-generator: 1.4.4 - dev: true - - /qrcode-generator@1.4.4: - resolution: {integrity: sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==} - dev: true - - /qrcode-terminal-nooctal@0.12.1: - resolution: {integrity: sha512-jy/kkD0iIMDjTucB+5T6KBsnirlhegDH47vHgrj5MejchSQmi/EAMM0xMFeePgV9CJkkAapNakpVUWYgHvtdKg==} - hasBin: true - dev: true - - /qrcode@1.5.3: - resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} - engines: {node: '>=10.13.0'} - hasBin: true - dependencies: - dijkstrajs: 1.0.3 - encode-utf8: 1.0.3 - pngjs: 5.0.0 - yargs: 15.4.1 - dev: true - - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: false - - /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true + which-pm: 2.0.0 - /qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} - dev: true + prelude-ls@1.2.1: {} - /query-string@7.1.3: - resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} - engines: {node: '>=6'} + prettier-linter-helpers@1.0.0: dependencies: - decode-uri-component: 0.2.2 - filter-obj: 1.1.0 - split-on-first: 1.1.0 - strict-uri-encode: 2.0.0 - dev: true + fast-diff: 1.2.0 - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true + prettier@2.8.8: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 - /queue@6.0.2: - resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + process-on-spawn@1.0.0: dependencies: - inherits: 2.0.4 - dev: true + fromentries: 1.3.2 - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + process-warning@1.0.0: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: false + process-warning@3.0.0: {} - /radix3@1.1.0: - resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} - dev: true + process@0.11.10: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + prom-client@14.2.0: dependencies: - safe-buffer: 5.2.1 - - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + tdigest: 0.1.1 - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} + prop-types@15.8.1: dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: false + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + proxy-addr@2.0.7: dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 + forwarded: 0.2.0 + ipaddr.js: 1.9.1 - /react-devtools-core@4.28.5: - resolution: {integrity: sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==} - dependencies: - shell-quote: 1.8.1 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true + proxy-from-env@1.1.0: {} - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 + prr@1.0.1: {} - /react-error-boundary@3.1.4(react@17.0.2): - resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} - engines: {node: '>=10', npm: '>=6'} - peerDependencies: - react: '>=16.13.1' - dependencies: - '@babel/runtime': 7.23.7 - react: 17.0.2 - dev: true + pseudomap@1.0.2: {} - /react-error-boundary@3.1.4(react@18.2.0): - resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} - engines: {node: '>=10', npm: '>=6'} - peerDependencies: - react: '>=16.13.1' + psl@1.9.0: {} + + pump@3.0.0: dependencies: - '@babel/runtime': 7.23.7 - react: 18.2.0 - dev: true + end-of-stream: 1.4.4 + once: 1.4.0 - /react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0)(react-native@0.73.1)(react@18.2.0): - resolution: {integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==} - peerDependencies: - i18next: '>= 23.2.3' - react: '>= 16.8.0' - react-dom: '*' - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true + pumpify@2.0.1: dependencies: - '@babel/runtime': 7.23.7 - html-parse-stringify: 3.0.1 - i18next: 22.5.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-native: 0.73.1(@babel/core@7.22.10)(@babel/preset-env@7.23.7)(react@18.2.0) - dev: true - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: true + duplexify: 4.1.2 + inherits: 2.0.4 + pump: 3.0.0 - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + punycode@1.4.1: {} - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true + punycode@2.1.0: {} + + punycode@2.3.1: {} - /react-native-codegen@0.71.6(@babel/preset-env@7.23.7): - resolution: {integrity: sha512-e5pR4VldIhEaFctfSAEgxbng0uG4gjBQxAHes3EKLdosH/Av90pQfSe9IDVdFIngvNPzt8Y14pNjrtqov/yNIg==} + qs@6.11.0: dependencies: - '@babel/parser': 7.23.6 - flow-parser: 0.185.2 - jscodeshift: 0.14.0(@babel/preset-env@7.23.7) - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color - dev: true + side-channel: 1.0.4 - /react-native-webview@11.26.1(react-native@0.73.1)(react@18.2.0): - resolution: {integrity: sha512-hC7BkxOpf+z0UKhxFSFTPAM4shQzYmZHoELa6/8a/MspcjEP7ukYKpuSUTLDywQditT8yI9idfcKvfZDKQExGw==} - peerDependencies: - react: '*' - react-native: '*' + qs@6.11.2: dependencies: - escape-string-regexp: 2.0.0 - invariant: 2.2.4 - react: 18.2.0 - react-native: 0.73.1(@babel/core@7.22.10)(@babel/preset-env@7.23.7)(react@18.2.0) - dev: true + side-channel: 1.0.4 - /react-native@0.73.1(@babel/core@7.22.10)(@babel/preset-env@7.23.7)(react@18.2.0): - resolution: {integrity: sha512-nLl9O2yKRh1nMXwsk4SUiD0ddd19RqlKgNU9AU8bTK/zD2xwnVOG56YK1/22SN67niWyoeG83vVg1eTk+S6ReA==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - react: 18.2.0 - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@react-native-community/cli': 12.3.0 - '@react-native-community/cli-platform-android': 12.3.0 - '@react-native-community/cli-platform-ios': 12.3.0 - '@react-native/assets-registry': 0.73.1 - '@react-native/codegen': 0.73.2(@babel/preset-env@7.23.7) - '@react-native/community-cli-plugin': 0.73.11(@babel/core@7.22.10)(@babel/preset-env@7.23.7) - '@react-native/gradle-plugin': 0.73.4 - '@react-native/js-polyfills': 0.73.1 - '@react-native/normalize-colors': 0.73.2 - '@react-native/virtualized-lists': 0.73.4(react-native@0.73.1) - abort-controller: 3.0.0 - anser: 1.4.10 - ansi-regex: 5.0.1 - base64-js: 1.5.1 - deprecated-react-native-prop-types: 5.0.0 - event-target-shim: 5.0.1 - flow-enums-runtime: 0.0.6 - invariant: 2.2.4 - jest-environment-node: 29.7.0 - jsc-android: 250231.0.0 - memoize-one: 5.2.1 - metro-runtime: 0.80.3 - metro-source-map: 0.80.3 - mkdirp: 0.5.6 - nullthrows: 1.1.1 - pretty-format: 26.6.2 - promise: 8.3.0 - react: 18.2.0 - react-devtools-core: 4.28.5 - react-refresh: 0.14.0 - react-shallow-renderer: 16.15.0(react@18.2.0) - regenerator-runtime: 0.13.11 - scheduler: 0.24.0-canary-efb381bbf-20230505 - stacktrace-parser: 0.1.10 - whatwg-fetch: 3.6.17 - ws: 6.2.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true + qs@6.5.3: {} - /react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} - engines: {node: '>=0.10.0'} - dev: true + querystringify@2.2.0: + optional: true - /react-shallow-renderer@16.15.0(react@18.2.0): - resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - dependencies: - object-assign: 4.1.1 - react: 18.2.0 - react-is: 18.2.0 - dev: true + queue-microtask@1.2.3: {} - /react@17.0.2: - resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} - engines: {node: '>=0.10.0'} + quick-format-unescaped@4.0.4: {} + + quick-lru@4.0.1: {} + + randombytes@2.1.0: dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - dev: true + safe-buffer: 5.2.1 - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} + range-parser@1.2.1: {} + + raw-body@2.5.2: dependencies: - loose-envify: 1.4.0 + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 - /read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} + react-is@16.13.1: {} + + react-is@18.2.0: {} + + read-pkg-up@1.0.1: dependencies: find-up: 1.1.2 read-pkg: 1.1.0 - dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - /read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} + read-pkg@1.1.0: dependencies: load-json-file: 1.1.0 normalize-package-data: 2.5.0 path-type: 1.1.0 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.1 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - /read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 - dev: false - - /readable-stream@2.3.3: - resolution: {integrity: sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==} - dependencies: - core-util-is: 1.0.2 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 1.0.7 - safe-buffer: 5.1.2 - string_decoder: 1.0.3 - util-deprecate: 1.0.2 - dev: true - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.2 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.4.2: - resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readable-stream@4.4.2: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 @@ -14920,62 +12032,22 @@ packages: process: 0.11.10 string_decoder: 1.3.0 - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - - /readline@1.3.0: - resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} - dev: true - /real-require@0.1.0: - resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} - engines: {node: '>= 12.13.0'} - - /real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} + real-require@0.1.0: {} - /recast@0.21.5: - resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} - engines: {node: '>= 4'} - dependencies: - ast-types: 0.15.2 - esprima: 4.0.1 - source-map: 0.6.1 - tslib: 2.6.2 - dev: true + real-require@0.2.0: {} - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - /redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} - dev: true - - /redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} - dependencies: - redis-errors: 1.2.0 - dev: true - - /reduce-flatten@2.0.0: - resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} - engines: {node: '>=6'} - dev: true + reduce-flatten@2.0.0: {} - /reflect.getprototypeof@1.0.3: - resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==} - engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.3: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -14983,125 +12055,55 @@ packages: get-intrinsic: 1.2.1 globalthis: 1.0.3 which-builtin-type: 1.1.3 - dev: true - - /regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} - engines: {node: '>=4'} - dependencies: - regenerate: 1.4.2 - dev: true - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: true + regenerator-runtime@0.14.1: {} - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: true + regexp-tree@0.1.27: {} - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - dependencies: - '@babel/runtime': 7.23.7 - dev: true - - /regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: true - - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.0: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 functions-have-names: 1.2.3 - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} - dependencies: - '@babel/regjsgen': 0.8.0 - regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 - regjsparser: 0.9.1 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - dev: true - - /regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: true + regexpp@3.2.0: {} - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true + regjsparser@0.10.0: dependencies: jsesc: 0.5.0 - dev: true - /release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} + release-zalgo@1.0.0: dependencies: es6-error: 4.1.1 - dev: true - /remark-footnotes@3.0.0: - resolution: {integrity: sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==} + remark-footnotes@3.0.0: dependencies: mdast-util-footnote: 0.1.7 micromark-extension-footnote: 0.3.2 transitivePeerDependencies: - supports-color - dev: true - /remark-frontmatter@3.0.0: - resolution: {integrity: sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==} + remark-frontmatter@3.0.0: dependencies: mdast-util-frontmatter: 0.2.0 micromark-extension-frontmatter: 0.2.2 - dev: true - /remark-gfm@1.0.0: - resolution: {integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==} + remark-gfm@1.0.0: dependencies: mdast-util-gfm: 0.1.2 micromark-extension-gfm: 0.3.3 transitivePeerDependencies: - supports-color - dev: true - /remark-parse@9.0.0: - resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} + remark-parse@9.0.0: dependencies: mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - dev: true - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: true + repeat-string@1.6.1: {} - /request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + request@2.88.2: dependencies: aws-sign2: 0.7.0 aws4: 1.11.0 @@ -15123,188 +12125,95 @@ packages: tough-cookie: 2.5.0 tunnel-agent: 0.6.0 uuid: 3.4.0 - dev: true - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + require-directory@2.1.1: {} - /require-from-string@1.2.1: - resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} - engines: {node: '>=0.10.0'} - dev: true + require-from-string@1.2.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true + require-from-string@2.0.2: {} - /require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - dev: true + require-main-filename@1.0.1: {} - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + require-main-filename@2.0.0: {} - /require-package-name@2.0.1: - resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} - dev: true + require-package-name@2.0.1: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true + requires-port@1.0.0: + optional: true - /resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} + resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 global-modules: 1.0.0 - dev: true - - /resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolve-from@5.0.0: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true + resolve-pkg-maps@1.0.0: {} - /resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + resolve@1.17.0: dependencies: path-parse: 1.0.7 - dev: true - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true + resolve@1.22.2: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /resolve@1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} - hasBin: true + resolve@1.22.4: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} - hasBin: true + resolve@2.0.0-next.4: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true + reusify@1.0.4: {} - /rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true + rfdc@1.3.0: {} - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true + rimraf@2.7.1: dependencies: glob: 7.2.3 - dev: true - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} - hasBin: true + rimraf@5.0.5: dependencies: glob: 10.3.10 - dev: true - /ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + ripemd160@2.0.2: dependencies: hash-base: 3.1.0 inherits: 2.0.4 - dev: true - /rlp@2.2.6: - resolution: {integrity: sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==} - hasBin: true + rlp@2.2.6: dependencies: bn.js: 4.12.0 - dev: true - /rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} - hasBin: true + rlp@2.2.7: dependencies: bn.js: 5.2.1 - - /rollup-plugin-visualizer@5.12.0: - resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - rollup: 2.x || 3.x || 4.x - peerDependenciesMeta: - rollup: - optional: true - dependencies: - open: 8.4.2 - picomatch: 2.3.1 - source-map: 0.7.4 - yargs: 17.7.2 - dev: true - - /rollup@4.5.1: - resolution: {integrity: sha512-0EQribZoPKpb5z1NW/QYm3XSR//Xr8BeEXU49Lc/mQmpmVVG5jPUVrpc2iptup/0WMrY9mzas0fxH+TjYvG2CA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + + rollup@4.5.1: optionalDependencies: '@rollup/rollup-android-arm-eabi': 4.5.1 '@rollup/rollup-android-arm64': 4.5.1 @@ -15319,133 +12228,75 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.5.1 '@rollup/rollup-win32-x64-msvc': 4.5.1 fsevents: 2.3.3 - dev: true - /rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - dev: true + rrweb-cssom@0.6.0: + optional: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - /rust-verkle-wasm@0.0.1: - resolution: {integrity: sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA==} - dev: true + rust-verkle-wasm@0.0.1: {} - /rustbn-wasm@0.2.0: - resolution: {integrity: sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==} + rustbn-wasm@0.2.0: dependencies: '@scure/base': 1.1.3 - dev: true - /rustbn.js@0.2.0: - resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} - dev: true + rustbn.js@0.2.0: {} - /safe-array-concat@1.0.0: - resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} - engines: {node: '>=0.4'} + rxjs@7.8.1: + dependencies: + tslib: 2.6.2 + + safe-array-concat@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 has-symbols: 1.0.3 isarray: 2.0.5 - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-regex-test@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-regex: 1.1.4 - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} + safe-stable-stringify@2.4.3: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + safer-buffer@2.1.2: {} - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 - dev: true - - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - dependencies: - loose-envify: 1.4.0 - - /scheduler@0.24.0-canary-efb381bbf-20230505: - resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} - dependencies: - loose-envify: 1.4.0 - dev: true + optional: true - /scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + scrypt-js@3.0.1: {} - /secp256k1@4.0.3: - resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} - engines: {node: '>=10.0.0'} - requiresBuild: true + secp256k1@4.0.3: dependencies: elliptic: 6.5.4 node-addon-api: 2.0.2 node-gyp-build: 4.6.0 - dev: true - - /secp256k1@5.0.0: - resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==} - engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - elliptic: 6.5.4 - node-addon-api: 5.1.0 - node-gyp-build: 4.6.0 - dev: true - /seedrandom@3.0.5: - resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} - dev: true + seedrandom@3.0.5: {} - /semaphore-async-await@1.5.1: - resolution: {integrity: sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==} - engines: {node: '>=4.1'} - dev: true + semaphore-async-await@1.5.1: {} - /semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - dev: true + semver-compare@1.0.0: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@0.18.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -15463,27 +12314,11 @@ packages: transitivePeerDependencies: - supports-color - /sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - upper-case-first: 2.0.2 - - /serialize-error@2.1.0: - resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} - engines: {node: '>=0.10.0'} - dev: true - - /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + serialize-javascript@6.0.0: dependencies: randombytes: 2.1.0 - dev: true - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -15492,128 +12327,61 @@ packages: transitivePeerDependencies: - supports-color - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-blocking@2.0.0: {} - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setimmediate@1.0.5: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + setprototypeof@1.2.0: {} - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true + sha.js@2.4.11: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - dependencies: - kind-of: 6.0.3 - dev: true - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 - dev: false - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: false - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@1.0.0: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true + shebang-regex@3.0.0: {} - /shiki@0.14.7: - resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} + shiki@0.14.7: dependencies: ansi-sequence-parser: 1.1.1 jsonc-parser: 3.2.0 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 - dev: true - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.4: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 object-inspect: 1.12.3 - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + siginfo@2.0.0: {} - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + signal-exit@3.0.7: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true + signal-exit@4.1.0: {} - /slice-ansi@2.1.0: - resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} - engines: {node: '>=6'} - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 - dev: true + slash@3.0.0: {} - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - dev: true - /slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} + slice-ansi@7.1.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - dev: true - /smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true + smartwrap@2.0.2: dependencies: array.prototype.flat: 1.3.2 breakword: 1.0.5 @@ -15621,53 +12389,16 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 yargs: 15.4.1 - dev: false - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 - - /socket.io-client@4.7.3(bufferutil@4.0.8)(utf-8-validate@6.0.3): - resolution: {integrity: sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@8.1.1) - engine.io-client: 6.5.3(bufferutil@4.0.8)(utf-8-validate@6.0.3) - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - /solc@0.4.26: - resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} - hasBin: true + solc@0.4.26: dependencies: fs-extra: 0.30.0 memorystream: 0.3.1 require-from-string: 1.2.1 semver: 5.7.2 yargs: 4.8.1 - dev: true - /solc@0.7.3(debug@4.3.4): - resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} - engines: {node: '>=8.0.0'} - hasBin: true + solc@0.7.3(debug@4.3.4): dependencies: command-exists: 1.2.9 commander: 3.0.2 @@ -15680,12 +12411,8 @@ packages: tmp: 0.0.33 transitivePeerDependencies: - debug - dev: true - /solc@0.8.15: - resolution: {integrity: sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==} - engines: {node: '>=10.0.0'} - hasBin: true + solc@0.8.15: dependencies: command-exists: 1.2.9 commander: 8.3.0 @@ -15696,55 +12423,29 @@ packages: tmp: 0.0.33 transitivePeerDependencies: - debug - dev: true - /sonic-boom@2.8.0: - resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + sonic-boom@2.8.0: dependencies: atomic-sleep: 1.0.0 - /sonic-boom@3.7.0: - resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} + sonic-boom@3.7.0: dependencies: atomic-sleep: 1.0.0 - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.0.2: {} - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: true - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true + source-map@0.6.1: {} - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - dev: true - /spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} + spawn-wrap@2.0.0: dependencies: foreground-child: 2.0.0 is-windows: 1.0.2 @@ -15752,62 +12453,40 @@ packages: rimraf: 3.0.2 signal-exit: 3.0.7 which: 2.0.2 - dev: true - /spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + spawndamnit@2.0.0: dependencies: cross-spawn: 5.1.0 signal-exit: 3.0.7 - dev: false - /spdx-correct@3.1.1: - resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + spdx-correct@3.1.1: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.10 - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + spdx-exceptions@2.3.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.10 - /spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.10 - dev: true - - /spdx-license-ids@3.0.10: - resolution: {integrity: sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==} - /split-on-first@1.1.0: - resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} - engines: {node: '>=6'} - dev: true + spdx-license-ids@3.0.10: {} - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@3.2.2: dependencies: readable-stream: 3.6.2 - dev: false - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + split2@4.2.0: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.0.3: {} - /sshpk@1.16.1: - resolution: {integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==} - engines: {node: '>=0.10.0'} - hasBin: true + sshpk@1.16.1: dependencies: asn1: 0.2.4 assert-plus: 1.0.0 @@ -15818,126 +12497,54 @@ packages: jsbn: 0.1.1 safer-buffer: 2.1.2 tweetnacl: 0.14.5 - dev: true - - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - /stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - dev: true + stackback@0.0.2: {} - /stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} + stacktrace-parser@0.1.10: dependencies: type-fest: 0.7.1 - dev: true - - /standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - dev: true - - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: true - - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - /std-env@3.6.0: - resolution: {integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==} - dev: true - - /stdin-discarder@0.1.0: - resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - bl: 5.1.0 - dev: true + statuses@2.0.1: {} - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.5 - dev: false + std-env@3.6.0: {} - /stream-shift@1.0.1: - resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + stream-shift@1.0.1: {} - /stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + stream-transform@2.1.3: dependencies: mixme: 0.5.4 - dev: false - - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: true - /strict-uri-encode@2.0.0: - resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} - engines: {node: '>=4'} - dev: true + streamsearch@1.1.0: {} - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + string-argv@0.3.2: {} - /string-format@2.0.0: - resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} - dev: true + string-format@2.0.0: {} - /string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} + string-width@1.0.2: dependencies: code-point-at: 1.1.0 is-fullwidth-code-point: 1.0.0 strip-ansi: 3.0.1 - dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string-width@7.0.0: - resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} - engines: {node: '>=18'} + string-width@7.0.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - dev: true - /string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + string.prototype.matchall@4.0.8: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -15947,243 +12554,116 @@ packages: internal-slot: 1.0.5 regexp.prototype.flags: 1.5.0 side-channel: 1.0.4 - dev: true - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.7: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + string.prototype.trimend@1.0.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + string.prototype.trimstart@1.0.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - /string_decoder@1.0.3: - resolution: {integrity: sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} + strip-ansi@3.0.1: dependencies: ansi-regex: 2.1.1 - dev: true - - /strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - dependencies: - ansi-regex: 4.1.1 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} + strip-bom@2.0.0: dependencies: is-utf8: 0.2.1 - dev: true - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + strip-bom@3.0.0: {} - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true + strip-bom@4.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} + strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed: 1.0.0 - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + strip-literal@1.3.0: dependencies: acorn: 8.10.0 - dev: true - /strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - dev: true - - /strong-log-transformer@2.1.0: - resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} - engines: {node: '>=4'} - hasBin: true + strong-log-transformer@2.1.0: dependencies: duplexer: 0.1.2 minimist: 1.2.8 through: 2.3.8 - dev: true - /stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - dev: true - - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true + sucrase@3.34.0: dependencies: '@jridgewell/gen-mapping': 0.3.3 commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: true - - /sudo-prompt@9.2.1: - resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} - dev: true - - /superagent@8.1.2: - resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} - engines: {node: '>=6.4.0 <13 || >=14'} - dependencies: - component-emitter: 1.3.0 - cookiejar: 2.1.4 - debug: 4.3.4(supports-color@8.1.1) - fast-safe-stringify: 2.1.1 - form-data: 4.0.0 - formidable: 2.1.2 - methods: 1.1.2 - mime: 2.6.0 - qs: 6.11.2 - semver: 7.6.0 - transitivePeerDependencies: - - supports-color - dev: true - - /superstruct@1.0.3: - resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} - engines: {node: '>=14.0.0'} - dev: true - - /supertest@6.3.4: - resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} - engines: {node: '>=6.4.0'} - dependencies: - methods: 1.1.2 - superagent: 8.1.2 - transitivePeerDependencies: - - supports-color - dev: true + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + supports-preserve-symlinks-flag@1.0.0: {} - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true + symbol-tree@3.2.4: + optional: true - /table-layout@1.0.2: - resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} - engines: {node: '>=8.0.0'} + table-layout@1.0.2: dependencies: array-back: 4.0.2 deep-extend: 0.6.0 typical: 5.2.0 wordwrapjs: 4.0.1 - dev: true - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-stream@2.2.0: dependencies: bl: 4.1.0 end-of-stream: 1.4.4 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /tar@6.1.11: - resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} - engines: {node: '>= 10'} + tar@6.1.11: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -16191,265 +12671,135 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: true - /tdigest@0.1.1: - resolution: {integrity: sha512-CXcDY/NIgIbKZPx5H4JJNpq6JwJhU5Z4+yWj4ZghDc7/9nVajiRlPPyMXRePPPlBfcayUqtoCXjo7/Hm82ecUA==} + tdigest@0.1.1: dependencies: bintrees: 1.0.1 - dev: false - - /temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - dev: true - /temp@0.8.4: - resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} - engines: {node: '>=6.0.0'} - dependencies: - rimraf: 2.6.3 - dev: true - - /term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - dev: false + term-size@2.2.1: {} - /terser@5.26.0: - resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} - engines: {node: '>=10'} - hasBin: true + terser@5.26.0: dependencies: '@jridgewell/source-map': 0.3.5 acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 - dev: true + optional: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - dev: true - /testrpc@0.0.1: - resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} - deprecated: testrpc has been renamed to ganache-cli, please use this package from now on. - dev: true + testrpc@0.0.1: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: true - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: true - /thread-stream@0.15.2: - resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + thread-stream@0.15.2: dependencies: real-require: 0.1.0 - /thread-stream@2.4.0: - resolution: {integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==} + thread-stream@2.4.0: dependencies: real-require: 0.2.0 - /throat@5.0.0: - resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} - dev: true - - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: true - - /through2@3.0.2: - resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} + through2@3.0.2: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 - dev: false - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + through@2.3.8: {} - /tinybench@2.5.1: - resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} - dev: true + tinybench@2.5.1: {} - /tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} - engines: {node: '>=14.0.0'} - dev: true + tinypool@0.8.2: {} - /tinyspy@2.2.0: - resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} - engines: {node: '>=14.0.0'} - dev: true + tinyspy@2.2.0: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} + tmp@0.2.1: dependencies: rimraf: 3.0.2 - dev: true - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + toidentifier@1.0.1: {} - /tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} + tough-cookie@2.5.0: dependencies: psl: 1.9.0 punycode: 2.3.1 - dev: true - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} + tough-cookie@4.1.3: dependencies: psl: 1.9.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 - dev: true + optional: true - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@0.0.3: {} - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@1.0.1: dependencies: punycode: 2.3.1 - dev: true - /tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} + tr46@5.0.0: dependencies: punycode: 2.3.1 - dev: true + optional: true - /traverse@0.6.6: - resolution: {integrity: sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==} - dev: true + traverse@0.6.6: {} - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-kill@1.2.2: {} - /treeify@1.1.0: - resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} - engines: {node: '>=0.6'} - dev: false + treeify@1.1.0: {} - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: false + trim-newlines@3.0.1: {} - /trough@1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - dev: true + trough@1.0.5: {} - /ts-api-utils@1.0.1(typescript@5.3.3): - resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.0.1(typescript@5.4.5): dependencies: - typescript: 5.3.3 - dev: true + typescript: 5.4.5 - /ts-command-line-args@2.5.1: - resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} - hasBin: true + ts-command-line-args@2.5.1: dependencies: chalk: 4.1.2 command-line-args: 5.2.1 command-line-usage: 6.1.3 string-format: 2.0.0 - dev: true - /ts-essentials@7.0.3(typescript@5.3.3): - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} - peerDependencies: - typescript: '>=3.7.0' + ts-essentials@7.0.3(typescript@5.4.5): dependencies: - typescript: 5.3.3 - dev: true + typescript: 5.4.5 - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true + ts-interface-checker@0.1.13: {} - /ts-mocha@10.0.0(mocha@10.2.0): - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X + ts-mocha@10.0.0(mocha@10.2.0): dependencies: mocha: 10.2.0 ts-node: 7.0.1 optionalDependencies: tsconfig-paths: 3.15.0 - dev: true - /ts-node@10.9.2(@types/node@20.11.17)(typescript@5.3.3): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -16463,15 +12813,13 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.4.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true + optionalDependencies: + '@swc/core': 1.4.13 - /ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true + ts-node@7.0.1: dependencies: arrify: 1.0.1 buffer-from: 1.1.2 @@ -16481,58 +12829,28 @@ packages: mkdirp: 0.5.6 source-map-support: 0.5.21 yn: 2.0.0 - dev: true - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - requiresBuild: true + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true + tslib@1.14.1: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.2: {} - /tsort@0.0.1: - resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} - dev: true + tsort@0.0.1: {} - /tsup@8.0.1(@swc/core@1.4.6)(typescript@5.3.3): - resolution: {integrity: sha512-hvW7gUSG96j53ZTSlT4j/KL0q1Q2l6TqGBFc6/mu/L46IoNWqLLUzLRLP1R8Q7xrJTmkDxxDoojV5uCVs1sVOg==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true + tsup@8.0.1(@swc/core@1.4.13)(postcss@8.4.35)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5))(typescript@5.4.5): dependencies: - '@swc/core': 1.4.6 bundle-require: 4.0.1(esbuild@0.19.7) cac: 6.7.14 chokidar: 3.5.3 @@ -16541,33 +12859,28 @@ packages: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.1 + postcss-load-config: 4.0.1(postcss@8.4.35)(ts-node@10.9.2(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5)) resolve-from: 5.0.0 rollup: 4.5.1 source-map: 0.8.0-beta.0 sucrase: 3.34.0 tree-kill: 1.2.2 - typescript: 5.3.3 + optionalDependencies: + '@swc/core': 1.4.13 + postcss: 8.4.35 + typescript: 5.4.5 transitivePeerDependencies: - supports-color - ts-node - dev: true - /tsx@4.7.0: - resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} - engines: {node: '>=18.0.0'} - hasBin: true + tsx@4.7.0: dependencies: esbuild: 0.19.10 get-tsconfig: 4.7.2 optionalDependencies: fsevents: 2.3.3 - dev: true - /tty-table@4.1.6: - resolution: {integrity: sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==} - engines: {node: '>=8.0.0'} - hasBin: true + tty-table@4.1.6: dependencies: chalk: 4.1.2 csv: 5.5.3 @@ -16576,83 +12889,43 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 yargs: 17.7.2 - dev: false - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 - dev: true - /tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} - dev: true + tweetnacl-util@0.15.1: {} - /tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - dev: true + tweetnacl@0.14.5: {} - /tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} - dev: true + tweetnacl@1.0.3: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + type-detect@4.0.8: {} - /type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - dev: false + type-fest@0.13.1: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + type-fest@0.21.3: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} + type-fest@0.6.0: {} - /type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - dev: true + type-fest@0.7.1: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + type-fest@0.8.1: {} - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: true + type-fest@3.13.1: {} - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - dev: false - /typechain@8.3.1(typescript@5.3.3): - resolution: {integrity: sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==} - hasBin: true - peerDependencies: - typescript: '>=4.3.0' + typechain@8.3.1(typescript@5.4.5): dependencies: '@types/prettier': 2.3.2 debug: 4.3.4(supports-color@8.1.1) @@ -16663,32 +12936,25 @@ packages: mkdirp: 1.0.4 prettier: 2.8.8 ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-essentials: 7.0.3(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.0: dependencies: call-bind: 1.0.2 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.0: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -16696,129 +12962,50 @@ packages: has-proto: 1.0.1 is-typed-array: 1.1.12 - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-array-length@1.0.4: dependencies: call-bind: 1.0.2 for-each: 0.3.3 is-typed-array: 1.1.12 - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - dev: true - /typedoc@0.25.7(typescript@5.3.3): - resolution: {integrity: sha512-m6A6JjQRg39p2ZVRIN3NKXgrN8vzlHhOS+r9ymUYtcUP/TIQPvWSq7YgE5ZjASfv5Vd5BW5xrir6Gm2XNNcOow==} - engines: {node: '>= 16'} - hasBin: true - peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x + typedoc@0.25.7(typescript@5.4.5): dependencies: lunr: 2.3.9 marked: 4.3.0 minimatch: 9.0.3 shiki: 0.14.7 - typescript: 5.3.3 - dev: true - - /typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true + typescript: 5.4.5 - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true + typescript@4.9.5: {} - /typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} - dev: true + typescript@5.4.5: {} - /typical@5.2.0: - resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} - engines: {node: '>=8'} - dev: true + typical@4.0.0: {} - /ufo@1.3.2: - resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} - dev: true + typical@5.2.0: {} - /uint8arrays@3.1.1: - resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} - dependencies: - multiformats: 9.9.0 - dev: true + ufo@1.3.2: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.2 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - /uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - dev: true - - /underscore@1.13.4: - resolution: {integrity: sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==} - dev: true + underscore@1.13.4: {} - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@5.26.5: {} - /undici@5.24.0: - resolution: {integrity: sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ==} - engines: {node: '>=14.0'} + undici@5.24.0: dependencies: busboy: 1.6.0 - dev: true - - /unenv@1.8.0: - resolution: {integrity: sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg==} - dependencies: - consola: 3.2.3 - defu: 6.1.3 - mime: 3.0.0 - node-fetch-native: 1.4.1 - pathe: 1.1.1 - dev: true - - /unfetch@4.2.0: - resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} - dev: true - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - dev: true - - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.1.0 - dev: true - - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - dev: true - - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - dev: true - - /unified@9.2.2: - resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + unified@9.2.2: dependencies: '@types/unist': 2.0.6 bail: 1.0.5 @@ -16827,329 +13014,118 @@ packages: is-plain-obj: 2.1.0 trough: 1.0.5 vfile: 4.2.1 - dev: true - /unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - dev: true + unist-util-is@4.1.0: {} - /unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + unist-util-stringify-position@2.0.3: dependencies: '@types/unist': 2.0.6 - dev: true - /unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + unist-util-visit-parents@3.1.1: dependencies: '@types/unist': 2.0.6 unist-util-is: 4.1.0 - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true - - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@0.1.2: {} - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + universalify@0.2.0: + optional: true - /unstorage@1.10.1(idb-keyval@6.2.1): - resolution: {integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==} - peerDependencies: - '@azure/app-configuration': ^1.4.1 - '@azure/cosmos': ^4.0.0 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^3.3.2 - '@azure/keyvault-secrets': ^4.7.0 - '@azure/storage-blob': ^12.16.0 - '@capacitor/preferences': ^5.0.6 - '@netlify/blobs': ^6.2.0 - '@planetscale/database': ^1.11.0 - '@upstash/redis': ^1.23.4 - '@vercel/kv': ^0.2.3 - idb-keyval: ^6.2.1 - peerDependenciesMeta: - '@azure/app-configuration': - optional: true - '@azure/cosmos': - optional: true - '@azure/data-tables': - optional: true - '@azure/identity': - optional: true - '@azure/keyvault-secrets': - optional: true - '@azure/storage-blob': - optional: true - '@capacitor/preferences': - optional: true - '@netlify/blobs': - optional: true - '@planetscale/database': - optional: true - '@upstash/redis': - optional: true - '@vercel/kv': - optional: true - idb-keyval: - optional: true - dependencies: - anymatch: 3.1.3 - chokidar: 3.5.3 - destr: 2.0.2 - h3: 1.9.0 - idb-keyval: 6.2.1 - ioredis: 5.3.2 - listhen: 1.5.5 - lru-cache: 10.1.0 - mri: 1.2.0 - node-fetch-native: 1.4.1 - ofetch: 1.3.3 - ufo: 1.3.2 - transitivePeerDependencies: - - supports-color - dev: true + universalify@2.0.0: {} - /untun@0.1.2: - resolution: {integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==} - hasBin: true - dependencies: - citty: 0.1.5 - consola: 3.2.3 - pathe: 1.1.1 - dev: true + unpipe@1.0.0: {} - /update-browserslist-db@1.0.13(browserslist@4.22.2): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.13(browserslist@4.22.2): dependencies: browserslist: 4.22.2 escalade: 3.1.1 picocolors: 1.0.0 - dev: true - - /update-section@0.3.3: - resolution: {integrity: sha512-BpRZMZpgXLuTiKeiu7kK0nIPwGdyrqrs6EDSaXtjD/aQ2T+qVo9a5hRC3HN3iJjCMxNT/VxoLGQ7E/OzE5ucnw==} - dev: true - - /upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - dependencies: - tslib: 2.6.2 - - /upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - dependencies: - tslib: 2.6.2 - /uqr@0.1.2: - resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} - dev: true + update-section@0.3.3: {} - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: true + optional: true - /url-value-parser@2.0.3: - resolution: {integrity: sha512-FjIX+Q9lYmDM9uYIGdMYfQW0uLbWVwN2NrL2ayAI7BTOvEwzH+VoDdNquwB9h4dFAx+u6mb0ONLa3sHD5DvyvA==} - engines: {node: '>=6.0.0'} - dev: false + url-value-parser@2.0.3: {} - /url@0.11.1: - resolution: {integrity: sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==} + url@0.11.1: dependencies: punycode: 1.4.1 qs: 6.11.2 - dev: true - - /use-sync-external-store@1.2.0(react@18.2.0): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - dev: true - /utf-8-validate@5.0.7: - resolution: {integrity: sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==} - engines: {node: '>=6.14.2'} - requiresBuild: true + utf-8-validate@5.0.7: dependencies: node-gyp-build: 4.6.0 - dev: true optional: true - /utf-8-validate@6.0.3: - resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.6.0 - dev: true - - /utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utf8@3.0.0: {} - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.12 - which-typed-array: 1.1.11 + util-deprecate@1.0.2: {} - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + utils-merge@1.0.1: {} - /uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: true + uuid@3.4.0: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true + uuid@8.3.2: {} - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true + v8-compile-cache-lib@3.0.1: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 - /valtio@1.11.2(react@18.2.0): - resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=16.8' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - dependencies: - proxy-compare: 2.5.1 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - dev: true - - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + vary@1.1.2: {} - /verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} + verror@1.10.0: dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 extsprintf: 1.4.0 - dev: true - /vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + vfile-message@2.0.4: dependencies: '@types/unist': 2.0.6 unist-util-stringify-position: 2.0.3 - dev: true - /vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + vfile@4.2.1: dependencies: '@types/unist': 2.0.6 is-buffer: 2.0.5 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - dev: true - - /viem@1.20.3(typescript@5.3.3): - resolution: {integrity: sha512-7CrmeCb2KYkeCgUmUyb1hsf+IX/PLwi+Np+Vm4YUTPeG82y3HRSgGHSaCOp3d0YtR2kXD3nv9y5kE7LBFE+wWw==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.3.3)(zod@3.22.4) - isows: 1.0.3(ws@8.13.0) - typescript: 5.3.3 - ws: 8.13.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - dev: true - /viem@2.7.19(typescript@5.3.3)(zod@3.22.4): - resolution: {integrity: sha512-UOMeqy+8p2709ra2j9HEOL1NfjsXZzlJ8gwR6YO/zXH8KIZvyzW07t4iQARF5+ShVZ/7+/1ec8oPjVi1M//33A==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true + viem@2.8.13(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.7)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.3.3)(zod@3.22.4) - isows: 1.0.3(ws@8.13.0) - typescript: 5.3.3 - ws: 8.13.0 + abitype: 1.0.0(typescript@5.4.5)(zod@3.22.4) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.7)) + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.7) + optionalDependencies: + typescript: 5.4.5 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - /vite-node@1.2.2(@types/node@20.11.17): - resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + vite-node@1.2.2(@types/node@20.11.17)(terser@5.26.0): dependencies: cac: 6.7.14 debug: 4.3.4(supports-color@8.1.1) pathe: 1.1.1 picocolors: 1.0.0 - vite: 5.1.5(@types/node@20.11.17) + vite: 5.1.7(@types/node@20.11.17)(terser@5.26.0) transitivePeerDependencies: - '@types/node' - less @@ -17159,106 +13135,29 @@ packages: - sugarss - supports-color - terser - dev: true - /vite@5.0.12(@types/node@20.11.17): - resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.1.5(@types/node@20.11.17)(terser@5.26.0): dependencies: - '@types/node': 20.11.17 esbuild: 0.19.10 - postcss: 8.4.32 + postcss: 8.4.35 rollup: 4.5.1 optionalDependencies: + '@types/node': 20.11.17 fsevents: 2.3.3 - dev: true + terser: 5.26.0 - /vite@5.1.5(@types/node@20.11.17): - resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.1.7(@types/node@20.11.17)(terser@5.26.0): dependencies: - '@types/node': 20.11.17 esbuild: 0.19.10 postcss: 8.4.35 rollup: 4.5.1 optionalDependencies: + '@types/node': 20.11.17 fsevents: 2.3.3 - dev: true + terser: 5.26.0 - /vitest@1.2.2(@types/node@20.11.17)(jsdom@24.0.0): - resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': ^1.0.0 - '@vitest/ui': ^1.0.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + vitest@1.2.2(@types/node@20.11.17)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.7))(terser@5.26.0): dependencies: - '@types/node': 20.11.17 '@vitest/expect': 1.2.2 '@vitest/runner': 1.2.2 '@vitest/snapshot': 1.2.2 @@ -17269,361 +13168,53 @@ packages: chai: 4.3.10 debug: 4.3.4(supports-color@8.1.1) execa: 8.0.1 - jsdom: 24.0.0 local-pkg: 0.5.0 magic-string: 0.30.5 pathe: 1.1.1 picocolors: 1.0.0 - std-env: 3.6.0 - strip-literal: 1.3.0 - tinybench: 2.5.1 - tinypool: 0.8.2 - vite: 5.0.12(@types/node@20.11.17) - vite-node: 1.2.2(@types/node@20.11.17) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vlq@1.0.1: - resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} - dev: true - - /void-elements@3.1.0: - resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} - engines: {node: '>=0.10.0'} - dev: true - - /vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: true - - /vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - dev: true - - /w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - dependencies: - xml-name-validator: 5.0.0 - dev: true - - /wagmi@2.5.5(@tanstack/react-query@5.17.1)(react-dom@18.2.0)(react-native@0.73.1)(react@18.2.0)(typescript@5.3.3)(viem@2.7.19): - resolution: {integrity: sha512-U9F5+e4bFXhSvIAWaImP4oCDXnOG/7q1xnBlkWBwbGy+oWg3BBiD01BZUnkplFGu6scSZ+TPURGtOkwH0rnxBQ==} - peerDependencies: - '@tanstack/react-query': '>=5.0.0' - react: '>=18' - typescript: '>=5.0.4' - viem: 2.x - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@tanstack/react-query': 5.17.1(react@18.2.0) - '@wagmi/connectors': 4.1.12(@wagmi/core@2.6.3)(react-dom@18.2.0)(react-native@0.73.1)(react@18.2.0)(typescript@5.3.3)(viem@2.7.19) - '@wagmi/core': 2.6.3(react@18.2.0)(typescript@5.3.3)(viem@2.7.19) - react: 18.2.0 - typescript: 5.3.3 - use-sync-external-store: 1.2.0(react@18.2.0) - viem: 2.7.19(typescript@5.3.3)(zod@3.22.4) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@tanstack/query-core' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - immer - - react-dom - - react-native - - rollup - - supports-color - - utf-8-validate - - zod - dev: true - - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.4 - - /web3-core@4.1.0: - resolution: {integrity: sha512-fVGmPInWNlT/lGj1aKDmmSDIqYO5iwVlZ3NdD4q/u/i9j8/o7a8S0jz8Js8oS/fqoBqF25WSJ8il2KKdSDGzXw==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - web3-errors: 1.1.0 - web3-eth-iban: 4.0.4 - web3-providers-http: 4.0.4 - web3-providers-ws: 4.0.4 - web3-types: 1.1.0 - web3-utils: 4.0.5 - web3-validator: 2.0.0 - optionalDependencies: - web3-providers-ipc: 4.0.5 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /web3-errors@1.1.0: - resolution: {integrity: sha512-XKkq4uLp/I75qid+/eXjc/veZywmcmsYy1yNZHePIS2riBcqTGKrdKiplyNCoVwY9OGWlKv9NpxZBd32k8a9mg==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - web3-types: 1.1.0 - dev: false - - /web3-errors@1.1.1: - resolution: {integrity: sha512-9IEhcympCJEK3Nmkz2oE/daKnOh+3CxHceuVWWRkHWKUfuIiJQgXAv9wRkPGk63JJTP/R9jtGmP+IbkScKoTBA==} - engines: {node: '>=14', npm: '>=6.12.0'} - requiresBuild: true - dependencies: - web3-types: 1.1.1 - dev: false - - /web3-eth-abi@4.1.0: - resolution: {integrity: sha512-qd+zCGKi2YsL2KkbM5M8Qztles/WPOvFpw6Lg3a904DRIVxkIvWdQfoK0JbA6Vbt8DSVKCc4rpZ15D6I/wfBKQ==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - web3-errors: 1.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.5 - dev: false - - /web3-eth-accounts@4.0.3: - resolution: {integrity: sha512-qS4r25weJYlKzHPIneL3g33LG+I6QkRCs25ZtooK6elurlZY4HyRE04BIWv12xZswtsvdmMt4HysMUNKgLrgPg==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - '@ethereumjs/rlp': 4.0.1 - crc-32: 1.2.2 - ethereum-cryptography: 2.1.2 - web3-errors: 1.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.4 - web3-validator: 1.0.2 - dev: false - - /web3-eth-accounts@4.0.4: - resolution: {integrity: sha512-Ed7WNLEv92CkdxB8iDkr4SOZ0L0jHBYFBcnPX8T0+QcqECU0REVOs5IBddm5dlSaAPRezaGT5mHDYNZhwhr02w==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - '@ethereumjs/rlp': 4.0.1 - crc-32: 1.2.2 - ethereum-cryptography: 2.1.2 - web3-errors: 1.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.5 - web3-validator: 2.0.0 - dev: false - - /web3-eth-contract@4.0.4: - resolution: {integrity: sha512-0WHAeNjJUQ47Ysijuf3oJAZ/ex+G3EgBvI590/wd7D7IA2WbhbpTyr9NPALHmnmO3zzF37FMKJp7mDwpm7hHXg==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - web3-core: 4.1.0 - web3-errors: 1.1.0 - web3-eth: 4.1.0 - web3-eth-abi: 4.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.5 - web3-validator: 2.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /web3-eth-ens@4.0.4: - resolution: {integrity: sha512-CCaPO/EQZe4wJQp4SUVB75brEWPh+Sd/dUW6/vI41liurr8Q4yD86j2FfoQQScgQhvByMs4OKNQ3QuTVRIyVKA==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - '@adraffy/ens-normalize': 1.10.0 - web3-core: 4.1.0 - web3-errors: 1.1.0 - web3-eth: 4.1.0 - web3-eth-contract: 4.0.4 - web3-net: 4.0.4 - web3-types: 1.1.0 - web3-utils: 4.0.5 - web3-validator: 2.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /web3-eth-iban@4.0.4: - resolution: {integrity: sha512-ukX2K45Hdn+sVdCqNzSJ1ztzouy/4V88vn4M6gCnpw7cc39uDprSmoMi8LEVEJbJM9BqeFN3FXaDQvZJIsv26A==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - web3-errors: 1.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.5 - web3-validator: 2.0.0 - dev: false - - /web3-eth-personal@4.0.4: - resolution: {integrity: sha512-rZksHMLC1z9frT7sI9+aq3KqfxfZeTW/N7GVCoYVMtVTaTLBDO4n4++0It1KWeSogGE11niBxSev7nHsOVRRRw==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - web3-core: 4.1.0 - web3-eth: 4.1.0 - web3-rpc-methods: 1.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.5 - web3-validator: 2.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /web3-eth@4.0.3: - resolution: {integrity: sha512-4t1+lpqzk3ljubr0CKE9Ila82p2Pim6Bn7ZIruVfMt9AOA5wL6M0OeMTy0fWBODLJiZJ7R77Ugm0kvEVWD3lqg==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - setimmediate: 1.0.5 - web3-core: 4.1.0 - web3-errors: 1.1.0 - web3-eth-abi: 4.1.0 - web3-eth-accounts: 4.0.3 - web3-net: 4.0.4 - web3-providers-ws: 4.0.4 - web3-rpc-methods: 1.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.4 - web3-validator: 1.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /web3-eth@4.1.0: - resolution: {integrity: sha512-eZBmqRPnyLsgGsQrGV37g4MkS0a5YaMooDRv0Ye4a44ZCwd4wXlQu4zwFNdc+8esyJBhCzELwRDyHN/lSBwQNA==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - setimmediate: 1.0.5 - web3-core: 4.1.0 - web3-errors: 1.1.0 - web3-eth-abi: 4.1.0 - web3-eth-accounts: 4.0.4 - web3-net: 4.0.4 - web3-providers-ws: 4.0.4 - web3-rpc-methods: 1.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.5 - web3-validator: 2.0.0 + std-env: 3.6.0 + strip-literal: 1.3.0 + tinybench: 2.5.1 + tinypool: 0.8.2 + vite: 5.1.5(@types/node@20.11.17)(terser@5.26.0) + vite-node: 1.2.2(@types/node@20.11.17)(terser@5.26.0) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.11.17 + jsdom: 24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.7) transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser - /web3-net@4.0.4: - resolution: {integrity: sha512-t7Ribrohjkr/lKf8lopi1VJ2YsZ49QgOe3lWr+vlxwQH/KE383CixTEMTxldsM9uMUWVyg9ff2SN5p+Qle3l2Q==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - web3-core: 4.1.0 - web3-rpc-methods: 1.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.5 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false + vscode-oniguruma@1.7.0: {} - /web3-providers-http@4.0.4: - resolution: {integrity: sha512-vybOsMlXW/sBp3mus6AKNvYobXPQx4F5K/1C2h8sBPszksXWdj7Wch/uDYSc+zYzc78yaByE0nxXmL6LfAJCKA==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - cross-fetch: 3.1.8 - web3-errors: 1.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.5 - transitivePeerDependencies: - - encoding - dev: false + vscode-textmate@8.0.0: {} - /web3-providers-ipc@4.0.5: - resolution: {integrity: sha512-1mJWqBnKbQ6UGHVxuXDJRpw4NwkpJ7NabyF2XBmzctzFHKvzE0X1dAocy3tih49J38d0vKrmubTOqxxkMpq49Q==} - engines: {node: '>=14', npm: '>=6.12.0'} - requiresBuild: true + w3c-xmlserializer@5.0.0: dependencies: - web3-errors: 1.1.1 - web3-types: 1.1.1 - web3-utils: 4.0.5 - dev: false + xml-name-validator: 5.0.0 optional: true - /web3-providers-ws@4.0.4: - resolution: {integrity: sha512-ygRuC73NxNItBg9E1AMBZHMQMddWLg+IE1WvYpCD4oRVw9yDB06/z5M/sGt7/Evx5NkK/qccqi1/4NZ7+HudEw==} - engines: {node: '>=14', npm: '>=6.12.0'} + wait-on@7.2.0: dependencies: - '@types/ws': 8.5.3 - isomorphic-ws: 5.0.0(ws@8.16.0) - web3-errors: 1.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.5 - ws: 8.16.0 + axios: 1.6.7 + joi: 17.11.0 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.1 transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false + - debug - /web3-rpc-methods@1.1.0: - resolution: {integrity: sha512-4tYjn05NDZtHPpJz7dFfsdef+0mxM4NDva5S1Yqnxb3ar6ceIqiQuDRe2MB0Lg5gD3A93udrJ+Cu1EULPTS3qw==} - engines: {node: '>=14', npm: '>=6.12.0'} + wcwidth@1.0.1: dependencies: - web3-core: 4.1.0 - web3-types: 1.1.0 - web3-validator: 2.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /web3-types@1.1.0: - resolution: {integrity: sha512-t/2kx8Is0EmQQYu+UU7riGmJB4oN4232r7r/mA7ZZmkBg3BjZmJGHhnmCllZOigbzdWBfw/rrxe+sLCKN+eDug==} - engines: {node: '>=14', npm: '>=6.12.0'} - dev: false - - /web3-types@1.1.1: - resolution: {integrity: sha512-bXmIPJi/NPed43JBcya71gT+euZSMvfQx6NYv8G97PSNxR1HWwANYBKbamTZvzBbq10QCwQLh0hZw3tyOXuPFA==} - engines: {node: '>=14', npm: '>=6.12.0'} - requiresBuild: true - dev: false + defaults: 1.0.4 - /web3-utils@1.10.1: - resolution: {integrity: sha512-r6iUUw/uMnNcWXjhRv33Nyrhxq3VGOPBXeSzxhOXIci4SvC/LPTpROY0uTrMX7ztKyODYrHp8WhTkEf+ZnHssw==} - engines: {node: '>=8.0.0'} + web3-utils@1.10.1: dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 @@ -17634,153 +13225,41 @@ packages: randombytes: 2.1.0 utf8: 3.0.0 - /web3-utils@4.0.4: - resolution: {integrity: sha512-DuoAMY6RQkiKsQ0fAHv+oAAYmCPWRv4PJMDsy5CJN5JaW021JtXtPsEQtVIQ3iYzgQgr3SRBfGyE78WyroIkdg==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - ethereum-cryptography: 2.1.2 - web3-errors: 1.1.0 - web3-types: 1.1.0 - web3-validator: 2.0.0 - dev: false - - /web3-utils@4.0.5: - resolution: {integrity: sha512-43xIM7rr3htYNzliVQLpWLQmEf4XX8IXgjvqLcEuC/xje14O5UQM4kamRCtz8v3JZN3X6QTfsV6Zgby67mVmCg==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - ethereum-cryptography: 2.1.2 - web3-errors: 1.1.1 - web3-types: 1.1.1 - web3-validator: 2.0.1 - dev: false - - /web3-validator@1.0.2: - resolution: {integrity: sha512-orx1CQAEnwJUnl/8iF2II2zSA4wiooNJvFmVE0Dbmt/kE370SugIDViQP76snhxtouG2AXzz4GyKbPCMlLGh/A==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - ethereum-cryptography: 2.1.2 - is-my-json-valid: 2.20.6 - util: 0.12.5 - web3-errors: 1.1.0 - web3-types: 1.1.0 - dev: false - - /web3-validator@2.0.0: - resolution: {integrity: sha512-JGOuJFX4mjBMaR7e0VI1xrBXDHz1Z6+824eJiJZFaGOt1kjMsrbYX/z4cHJ8rgv+DdZqIFjOlxsAVJV5T8ODXQ==} - engines: {node: '>=14', npm: '>=6.12.0'} - dependencies: - ethereum-cryptography: 2.1.2 - util: 0.12.5 - web3-errors: 1.1.0 - web3-types: 1.1.0 - zod: 3.22.4 - dev: false - - /web3-validator@2.0.1: - resolution: {integrity: sha512-RIdZCNhceBEOQpmzcEk6K3qqLHRfDIMkg2PJe7yllpuEc0fa0cmUZgGUl1FEnioc5Rx9GBEE8eTllaneIAiiQQ==} - engines: {node: '>=14', npm: '>=6.12.0'} - requiresBuild: true - dependencies: - ethereum-cryptography: 2.1.2 - util: 0.12.5 - web3-errors: 1.1.1 - web3-types: 1.1.1 - zod: 3.22.4 - dev: false - - /web3@4.0.3: - resolution: {integrity: sha512-rUMxui5f52yPWjiMRQV6xqIrTQSovYM2CNhl57y+xj/fGXNLbI1D5FsLPnUMZjMaFHJBTteaBxq/sTEaw/1jNA==} - engines: {node: '>=14.0.0', npm: '>=6.12.0'} - dependencies: - web3-core: 4.1.0 - web3-errors: 1.1.0 - web3-eth: 4.1.0 - web3-eth-abi: 4.1.0 - web3-eth-accounts: 4.0.3 - web3-eth-contract: 4.0.4 - web3-eth-ens: 4.0.4 - web3-eth-iban: 4.0.4 - web3-eth-personal: 4.0.4 - web3-net: 4.0.4 - web3-providers-http: 4.0.4 - web3-providers-ws: 4.0.4 - web3-rpc-methods: 1.1.0 - web3-types: 1.1.0 - web3-utils: 4.0.4 - web3-validator: 1.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /webextension-polyfill-ts@0.25.0: - resolution: {integrity: sha512-ikQhwwHYkpBu00pFaUzIKY26I6L87DeRI+Q6jBT1daZUNuu8dSrg5U9l/ZbqdaQ1M/TTSPKeAa3kolP5liuedw==} - deprecated: This project has moved to @types/webextension-polyfill - dependencies: - webextension-polyfill: 0.7.0 - dev: true - - /webextension-polyfill@0.10.0: - resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} - dev: true - - /webextension-polyfill@0.7.0: - resolution: {integrity: sha512-su48BkMLxqzTTvPSE1eWxKToPS2Tv5DLGxKexLEVpwFd6Po6N8hhSLIvG6acPAg7qERoEaDL+Y5HQJeJeml5Aw==} - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@3.0.1: {} - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true + webidl-conversions@4.0.2: {} - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true + webidl-conversions@7.0.0: + optional: true - /whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 - dev: true + optional: true - /whatwg-fetch@3.6.17: - resolution: {integrity: sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==} - dev: true + whatwg-fetch@3.6.17: {} - /whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - dev: true + whatwg-mimetype@4.0.0: + optional: true - /whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + whatwg-url@14.0.0: dependencies: tr46: 5.0.0 webidl-conversions: 7.0.0 - dev: true + optional: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 @@ -17788,9 +13267,7 @@ packages: is-string: 1.0.7 is-symbol: 1.0.4 - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} + which-builtin-type@1.1.3: dependencies: function.prototype.name: 1.1.5 has-tostringtag: 1.0.0 @@ -17804,34 +13281,24 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.1 which-typed-array: 1.1.11 - dev: true - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + which-collection@1.0.1: dependencies: is-map: 2.0.2 is-set: 2.0.2 is-weakmap: 2.0.1 is-weakset: 2.0.2 - /which-module@1.0.0: - resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} - dev: true + which-module@1.0.0: {} - /which-module@2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + which-module@2.0.0: {} - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} + which-pm@2.0.0: dependencies: load-yaml-file: 0.2.0 path-exists: 4.0.0 - dev: false - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.11: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -17839,286 +13306,139 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + why-is-node-running@2.2.2: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true - /widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} + widest-line@3.1.0: dependencies: string-width: 4.2.3 - dev: true - /window-size@0.2.0: - resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} - engines: {node: '>= 0.10.0'} - hasBin: true - dev: true + window-size@0.2.0: {} - /wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} - engines: {node: '>=8.0.0'} + wordwrapjs@4.0.1: dependencies: reduce-flatten: 2.0.0 typical: 5.2.0 - dev: true - /workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} - dev: true + workerpool@6.2.1: {} - /wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} + wrap-ansi@2.1.0: dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 - dev: true - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} + wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 string-width: 7.0.0 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true + wrappy@1.0.2: {} - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@3.0.3: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: true - - /ws@6.2.2: - resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: - async-limiter: 1.0.1 - dev: true - - /ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - /ws@8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: + ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.7): + optionalDependencies: bufferutil: 4.0.8 - utf-8-validate: 6.0.3 - dev: true + utf-8-validate: 5.0.7 - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.7): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.7 - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.7): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.7 - /xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - dev: true + ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@5.0.7): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.7 + optional: true - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true + xml-name-validator@5.0.0: + optional: true - /xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} - engines: {node: '>=0.4.0'} - dev: true + xmlchars@2.2.0: + optional: true - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + xtend@4.0.2: {} - /y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - dev: true + y18n@3.2.2: {} - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@4.0.3: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + y18n@5.0.8: {} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: false + yallist@2.1.2: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true + yaml@1.10.2: {} - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true + yaml@2.3.4: {} - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - /yargs-parser@2.4.1: - resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} + yargs-parser@2.4.1: dependencies: camelcase: 3.0.0 lodash.assign: 4.2.0 - dev: true - /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - dev: true + yargs-parser@20.2.4: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} - /yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} + yargs-unparser@2.0.0: dependencies: camelcase: 6.3.0 decamelize: 4.0.0 flat: 5.0.2 is-plain-obj: 2.1.0 - dev: true - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + yargs@15.4.1: dependencies: cliui: 6.0.0 decamelize: 1.2.0 @@ -18132,9 +13452,7 @@ packages: y18n: 4.0.3 yargs-parser: 18.1.3 - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + yargs@16.2.0: dependencies: cliui: 7.0.4 escalade: 3.1.1 @@ -18143,11 +13461,8 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.1 @@ -18157,8 +13472,7 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yargs@4.8.1: - resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} + yargs@4.8.1: dependencies: cliui: 3.2.0 decamelize: 1.2.0 @@ -18174,57 +13488,19 @@ packages: window-size: 0.2.0 y18n: 3.2.2 yargs-parser: 2.4.1 - dev: true - /yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - dev: true + yn@2.0.0: {} - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true + yn@3.1.1: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.0.0: {} - /zksync-web3@0.14.3(ethers@5.7.2): - resolution: {integrity: sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ==} - peerDependencies: - ethers: ^5.7.0 + zksync-ethers@5.6.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7)): dependencies: - ethers: 5.7.2 - dev: true - - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) - /zustand@4.4.1(react@18.2.0): - resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - dependencies: - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - dev: true + zod@3.22.4: {} - /zwitch@1.0.5: - resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} - dev: true + zwitch@1.0.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d357a4260cd9..a3cef3117ea0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,3 @@ packages: - 'packages/*' - - 'endpoint-monitor' - 'indexer/api-ts' diff --git a/proxyd/backend.go b/proxyd/backend.go index f00e951dbf11..81ec23c25ff6 100644 --- a/proxyd/backend.go +++ b/proxyd/backend.go @@ -30,6 +30,7 @@ import ( const ( JSONRPCVersion = "2.0" JSONRPCErrorInternal = -32000 + notFoundRpcError = -32601 ) var ( @@ -44,7 +45,7 @@ var ( HTTPErrorCode: 500, } ErrMethodNotWhitelisted = &RPCErr{ - Code: JSONRPCErrorInternal - 1, + Code: notFoundRpcError, Message: "rpc method is not whitelisted", HTTPErrorCode: 403, } diff --git a/proxyd/cmd/proxyd/main.go b/proxyd/cmd/proxyd/main.go index 2f7579a9c538..3daa80b38710 100644 --- a/proxyd/cmd/proxyd/main.go +++ b/proxyd/cmd/proxyd/main.go @@ -28,8 +28,7 @@ var ( func main() { // Set up logger with a default INFO level in case we fail to parse flags. // Otherwise the final critical log won't show what the parsing error was. - log.SetDefault(log.NewLogger(slog.NewJSONHandler( - os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))) + proxyd.SetLogLevel(slog.LevelInfo) log.Info("starting proxyd", "version", GitVersion, "commit", GitCommit, "date", GitDate) @@ -50,8 +49,7 @@ func main() { log.Warn("invalid server.log_level set: " + config.Server.LogLevel) } } - log.SetDefault(log.NewLogger(slog.NewJSONHandler( - os.Stdout, &slog.HandlerOptions{Level: logLevel}))) + proxyd.SetLogLevel(logLevel) if config.Server.EnablePprof { log.Info("starting pprof", "addr", "0.0.0.0", "port", "6060") diff --git a/proxyd/config.go b/proxyd/config.go index cd0cca135101..4eed3302162e 100644 --- a/proxyd/config.go +++ b/proxyd/config.go @@ -26,6 +26,7 @@ type ServerConfig struct { MaxRequestBodyLogLen int `toml:"max_request_body_log_len"` EnablePprof bool `toml:"enable_pprof"` EnableXServedByHeader bool `toml:"enable_served_by_header"` + AllowAllOrigins bool `toml:"allow_all_origins"` } type CacheConfig struct { @@ -111,8 +112,9 @@ type BackendGroupConfig struct { WeightedRouting bool `toml:"weighted_routing"` - ConsensusAware bool `toml:"consensus_aware"` - ConsensusAsyncHandler string `toml:"consensus_handler"` + ConsensusAware bool `toml:"consensus_aware"` + ConsensusAsyncHandler string `toml:"consensus_handler"` + ConsensusPollerInterval TOMLDuration `toml:"consensus_poller_interval"` ConsensusBanPeriod TOMLDuration `toml:"consensus_ban_period"` ConsensusMaxUpdateThreshold TOMLDuration `toml:"consensus_max_update_threshold"` @@ -123,6 +125,7 @@ type BackendGroupConfig struct { ConsensusHA bool `toml:"consensus_ha"` ConsensusHAHeartbeatInterval TOMLDuration `toml:"consensus_ha_heartbeat_interval"` ConsensusHALockPeriod TOMLDuration `toml:"consensus_ha_lock_period"` + ConsensusHARedis RedisConfig `toml:"consensus_ha_redis"` } type BackendGroupsConfig map[string]*BackendGroupConfig diff --git a/proxyd/consensus_poller.go b/proxyd/consensus_poller.go index c72992cbd5e1..79f27b5b586e 100644 --- a/proxyd/consensus_poller.go +++ b/proxyd/consensus_poller.go @@ -14,7 +14,7 @@ import ( ) const ( - PollerInterval = 1 * time.Second + DefaultPollerInterval = 1 * time.Second ) type OnConsensusBroken func() @@ -40,6 +40,7 @@ type ConsensusPoller struct { maxUpdateThreshold time.Duration maxBlockLag uint64 maxBlockRange uint64 + interval time.Duration } type backendState struct { @@ -125,7 +126,7 @@ func (ah *PollerAsyncHandler) Init() { for _, be := range ah.cp.backendGroup.Backends { go func(be *Backend) { for { - timer := time.NewTimer(PollerInterval) + timer := time.NewTimer(ah.cp.interval) ah.cp.UpdateBackend(ah.ctx, be) select { @@ -141,7 +142,7 @@ func (ah *PollerAsyncHandler) Init() { // create the group consensus poller go func() { for { - timer := time.NewTimer(PollerInterval) + timer := time.NewTimer(ah.cp.interval) ah.cp.UpdateBackendGroupConsensus(ah.ctx) select { @@ -215,6 +216,12 @@ func WithMinPeerCount(minPeerCount uint64) ConsensusOpt { } } +func WithPollerInterval(interval time.Duration) ConsensusOpt { + return func(cp *ConsensusPoller) { + cp.interval = interval + } +} + func NewConsensusPoller(bg *BackendGroup, opts ...ConsensusOpt) *ConsensusPoller { ctx, cancelFunc := context.WithCancel(context.Background()) @@ -230,6 +237,7 @@ func NewConsensusPoller(bg *BackendGroup, opts ...ConsensusOpt) *ConsensusPoller maxUpdateThreshold: 30 * time.Second, maxBlockLag: 8, // 8*12 seconds = 96 seconds ~ 1.6 minutes minPeerCount: 3, + interval: DefaultPollerInterval, } for _, opt := range opts { diff --git a/proxyd/go.mod b/proxyd/go.mod index d207332e3570..088bf9bc9ed3 100644 --- a/proxyd/go.mod +++ b/proxyd/go.mod @@ -6,7 +6,7 @@ require ( github.com/BurntSushi/toml v1.3.2 github.com/alicebob/miniredis v2.5.0+incompatible github.com/emirpasic/gods v1.18.1 - github.com/ethereum/go-ethereum v1.13.8 + github.com/ethereum/go-ethereum v1.13.15 github.com/go-redsync/redsync/v4 v4.10.0 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb github.com/gorilla/mux v1.8.0 @@ -78,7 +78,7 @@ require ( github.com/yusufpapurcu/wmi v1.2.3 // indirect golang.org/x/crypto v0.17.0 // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.15.0 // indirect google.golang.org/protobuf v1.33.0 // indirect diff --git a/proxyd/go.sum b/proxyd/go.sum index 9b7fd5e3a4cc..11a684f0e398 100644 --- a/proxyd/go.sum +++ b/proxyd/go.sum @@ -62,8 +62,8 @@ github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.8 h1:1od+thJel3tM52ZUNQwvpYOeRHlbkVFZ5S8fhi0Lgsg= -github.com/ethereum/go-ethereum v1.13.8/go.mod h1:sc48XYQxCzH3fG9BcrXCOOgQk2JfZzNAmIKnceogzsA= +github.com/ethereum/go-ethereum v1.13.15 h1:U7sSGYGo4SPjP6iNIifNoyIAiNjrmQkz6EwQG+/EZWo= +github.com/ethereum/go-ethereum v1.13.15/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -247,8 +247,8 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/proxyd/integration_tests/smoke_test.go b/proxyd/integration_tests/smoke_test.go new file mode 100644 index 000000000000..5fed7571bcec --- /dev/null +++ b/proxyd/integration_tests/smoke_test.go @@ -0,0 +1,51 @@ +package integration_tests + +import ( + "fmt" + "io" + "os" + "strings" + "testing" + + "github.com/ethereum-optimism/optimism/proxyd" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +func TestInitProxyd(t *testing.T) { + goodBackend := NewMockBackend(BatchedResponseHandler(200, goodResponse)) + defer goodBackend.Close() + + require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) + + config := ReadConfig("smoke") + + sysStdOut := os.Stdout + r, w, err := os.Pipe() + require.NoError(t, err) + os.Stdout = w + + proxyd.SetLogLevel(log.LevelInfo) + + defer func() { + w.Close() + out, _ := io.ReadAll(r) + require.True(t, strings.Contains(string(out), "started proxyd")) + require.True(t, strings.Contains(string(out), "shutting down proxyd")) + fmt.Println(string(out)) + os.Stdout = sysStdOut + }() + + _, shutdown, err := proxyd.Start(config) + require.NoError(t, err) + defer shutdown() + + t.Run("initialization", func(t *testing.T) { + client := NewProxydClient("http://127.0.0.1:8545") + res, code, err := client.SendRPC(ethChainID, nil) + require.NoError(t, err) + require.Equal(t, 200, code) + require.NotNil(t, res) + }) + +} diff --git a/proxyd/integration_tests/testdata/smoke.toml b/proxyd/integration_tests/testdata/smoke.toml new file mode 100644 index 000000000000..a2187a25055d --- /dev/null +++ b/proxyd/integration_tests/testdata/smoke.toml @@ -0,0 +1,18 @@ +[server] +rpc_port = 8545 + +[backend] +response_timeout_seconds = 1 + +[backends] +[backends.good] +rpc_url = "$GOOD_BACKEND_RPC_URL" +ws_url = "$GOOD_BACKEND_RPC_URL" + +[backend_groups] +[backend_groups.main] +backends = ["good"] + +[rpc_method_mappings] +eth_chainId = "main" + diff --git a/proxyd/integration_tests/testdata/testdata.txt b/proxyd/integration_tests/testdata/testdata.txt index 14c91246b5f1..4bdd635a38fc 100644 --- a/proxyd/integration_tests/testdata/testdata.txt +++ b/proxyd/integration_tests/testdata/testdata.txt @@ -2,7 +2,7 @@ name|body|responseBody not json|not json|{"jsonrpc":"2.0","error":{"code":-32700,"message":"parse error"},"id":null} not json-rpc|{"foo":"bar"}|{"jsonrpc":"2.0","error":{"code":-32600,"message":"invalid JSON-RPC version"},"id":null} missing fields json-rpc|{"jsonrpc":"2.0"}|{"jsonrpc":"2.0","error":{"code":-32600,"message":"no method specified"},"id":null} -bad method json-rpc|{"jsonrpc":"2.0","method":"eth_notSendRawTransaction","id":1}|{"jsonrpc":"2.0","error":{"code":-32001,"message":"rpc method is not whitelisted"},"id":1} +bad method json-rpc|{"jsonrpc":"2.0","method":"eth_notSendRawTransaction","id":1}|{"jsonrpc":"2.0","error":{"code":-32601,"message":"rpc method is not whitelisted"},"id":1} no transaction data|{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[],"id":1}|{"jsonrpc":"2.0","error":{"code":-32602,"message":"missing value for required argument 0"},"id":1} invalid transaction data|{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xf6806872fcc650ad4e77e0629206426cd183d751e9ddcc8d5e77"],"id":1}|{"jsonrpc":"2.0","error":{"code":-32602,"message":"rlp: value size exceeds available input length"},"id":1} invalid transaction data|{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x1234"],"id":1}|{"jsonrpc":"2.0","error":{"code":-32602,"message":"transaction type not supported"},"id":1} @@ -11,4 +11,4 @@ valid transaction data - contract call|{"jsonrpc":"2.0","method":"eth_sendRawTra valid chain id - simple send|{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x02f8748201a415843b9aca31843b9aca3182520894f80267194936da1e98db10bce06f3147d580a62e880de0b6b3a764000080c001a0b50ee053102360ff5fedf0933b912b7e140c90fe57fa07a0cebe70dbd72339dda072974cb7bfe5c3dc54dde110e2b049408ccab8a879949c3b4d42a3a7555a618b"],"id":1}|{"id": 123, "jsonrpc": "2.0", "result": "dummy"} invalid chain id - simple send|{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x02f87683ab41308217af84773594008504a817c80082520894be53e587975603a13d0923d0aa6d37c5233dd750865af3107a400080c001a04ae265f17e882b922d39f0f0cb058a6378df1dc89da8b8165ab6bc53851b426aa0682079486be2aa23bc7514477473362cc7d63afa12c99f7d8fb15e68d69d9a48"],"id":1}|{"jsonrpc":"2.0","error":{"code":-32000,"message":"invalid sender"},"id":1} no chain id (pre eip-155) - simple send|{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0xf865808609184e72a00082271094000000000000000000000000000000000000000001001ba0d937ddb66e7788f917864b8e6974cac376b091154db1c25ff8429a6e61016e74a054ced39349e7658b7efceccfabc461e02418eb510124377949cfae8ccf1831af"],"id":1}|{"id": 123, "jsonrpc": "2.0", "result": "dummy"} -batch with mixed results|[{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x02f87683ab41308217af84773594008504a817c80082520894be53e587975603a13d0923d0aa6d37c5233dd750865af3107a400080c001a04ae265f17e882b922d39f0f0cb058a6378df1dc89da8b8165ab6bc53851b426aa0682079486be2aa23bc7514477473362cc7d63afa12c99f7d8fb15e68d69d9a48"],"id":1},{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x02f8748201a415843b9aca31843b9aca3182520894f80267194936da1e98db10bce06f3147d580a62e880de0b6b3a764000080c001a0b50ee053102360ff5fedf0933b912b7e140c90fe57fa07a0cebe70dbd72339dda072974cb7bfe5c3dc54dde110e2b049408ccab8a879949c3b4d42a3a7555a618b"],"id":1},{"bad":"json"},{"jsonrpc":"2.0","method":"eth_fooTheBar","params":[],"id":123}]|[{"jsonrpc":"2.0","error":{"code":-32000,"message":"invalid sender"},"id":1},{"id": 123, "jsonrpc": "2.0", "result": "dummy"},{"jsonrpc":"2.0","error":{"code":-32600,"message":"invalid JSON-RPC version"},"id":null},{"jsonrpc":"2.0","error":{"code":-32001,"message":"rpc method is not whitelisted"},"id":123}] +batch with mixed results|[{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x02f87683ab41308217af84773594008504a817c80082520894be53e587975603a13d0923d0aa6d37c5233dd750865af3107a400080c001a04ae265f17e882b922d39f0f0cb058a6378df1dc89da8b8165ab6bc53851b426aa0682079486be2aa23bc7514477473362cc7d63afa12c99f7d8fb15e68d69d9a48"],"id":1},{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x02f8748201a415843b9aca31843b9aca3182520894f80267194936da1e98db10bce06f3147d580a62e880de0b6b3a764000080c001a0b50ee053102360ff5fedf0933b912b7e140c90fe57fa07a0cebe70dbd72339dda072974cb7bfe5c3dc54dde110e2b049408ccab8a879949c3b4d42a3a7555a618b"],"id":1},{"bad":"json"},{"jsonrpc":"2.0","method":"eth_fooTheBar","params":[],"id":123}]|[{"jsonrpc":"2.0","error":{"code":-32000,"message":"invalid sender"},"id":1},{"id": 123, "jsonrpc": "2.0", "result": "dummy"},{"jsonrpc":"2.0","error":{"code":-32600,"message":"invalid JSON-RPC version"},"id":null},{"jsonrpc":"2.0","error":{"code":-32601,"message":"rpc method is not whitelisted"},"id":123}] diff --git a/proxyd/integration_tests/validation_test.go b/proxyd/integration_tests/validation_test.go index 5f7d5aefacab..95cfc295b7aa 100644 --- a/proxyd/integration_tests/validation_test.go +++ b/proxyd/integration_tests/validation_test.go @@ -11,7 +11,7 @@ import ( ) const ( - notWhitelistedResponse = `{"jsonrpc":"2.0","error":{"code":-32001,"message":"rpc method is not whitelisted custom message"},"id":999}` + notWhitelistedResponse = `{"jsonrpc":"2.0","error":{"code":-32601,"message":"rpc method is not whitelisted custom message"},"id":999}` parseErrResponse = `{"jsonrpc":"2.0","error":{"code":-32700,"message":"parse error"},"id":null}` invalidJSONRPCVersionResponse = `{"error":{"code":-32600,"message":"invalid JSON-RPC version"},"id":null,"jsonrpc":"2.0"}` invalidIDResponse = `{"error":{"code":-32600,"message":"invalid ID"},"id":null,"jsonrpc":"2.0"}` diff --git a/proxyd/integration_tests/ws_test.go b/proxyd/integration_tests/ws_test.go index 1548f2aa15bf..d52cfab5cdd7 100644 --- a/proxyd/integration_tests/ws_test.go +++ b/proxyd/integration_tests/ws_test.go @@ -101,7 +101,7 @@ func TestWS(t *testing.T) { { "blacklisted RPC", "}", - "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32001,\"message\":\"rpc method is not whitelisted\"},\"id\":1}", + "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32601,\"message\":\"rpc method is not whitelisted\"},\"id\":1}", "{\"id\": 1, \"method\": \"eth_whatever\", \"params\": []}", }, { diff --git a/proxyd/pkg/avg-sliding-window/sliding_test.go b/proxyd/pkg/avg-sliding-window/sliding_test.go index 7f5e9b7d1a65..37074dba8061 100644 --- a/proxyd/pkg/avg-sliding-window/sliding_test.go +++ b/proxyd/pkg/avg-sliding-window/sliding_test.go @@ -269,8 +269,7 @@ func TestSlidingWindow_CustomBucket(t *testing.T) { // ts is a convenient method that must parse a time.Time from a string in format `"2006-01-02 15:04:05"` func ts(s string) time.Time { - format := "2006-01-02 15:04:05" - t, err := time.Parse(format, s) + t, err := time.Parse(time.DateTime, s) if err != nil { panic(err) } diff --git a/proxyd/proxyd.go b/proxyd/proxyd.go index 7af47b1a7d20..73a311777293 100644 --- a/proxyd/proxyd.go +++ b/proxyd/proxyd.go @@ -13,9 +13,15 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/redis/go-redis/v9" + "golang.org/x/exp/slog" "golang.org/x/sync/semaphore" ) +func SetLogLevel(logLevel slog.Leveler) { + log.SetDefault(log.NewLogger(slog.NewJSONHandler( + os.Stdout, &slog.HandlerOptions{Level: logLevel}))) +} + func Start(config *Config) (*Server, func(), error) { if len(config.Backends) == 0 { return nil, nil, errors.New("must define at least one backend") @@ -266,6 +272,14 @@ func Start(config *Config) (*Server, func(), error) { return nil, nil, fmt.Errorf("error creating server: %w", err) } + // Enable to support browser websocket connections. + // See https://pkg.go.dev/github.com/gorilla/websocket#hdr-Origin_Considerations + if config.Server.AllowAllOrigins { + srv.upgrader.CheckOrigin = func(r *http.Request) bool { + return true + } + } + if config.Metrics.Enabled { addr := fmt.Sprintf("%s:%d", config.Metrics.Host, config.Metrics.Port) log.Info("starting metrics server", "addr", addr) @@ -332,20 +346,28 @@ func Start(config *Config) (*Server, func(), error) { if bgcfg.ConsensusMaxBlockRange > 0 { copts = append(copts, WithMaxBlockRange(bgcfg.ConsensusMaxBlockRange)) } + if bgcfg.ConsensusPollerInterval > 0 { + copts = append(copts, WithPollerInterval(time.Duration(bgcfg.ConsensusPollerInterval))) + } var tracker ConsensusTracker if bgcfg.ConsensusHA { - if redisClient == nil { - log.Crit("cant start - consensus high availability requires redis") + if bgcfg.ConsensusHARedis.URL == "" { + log.Crit("must specify a consensus_ha_redis config when consensus_ha is true") } topts := make([]RedisConsensusTrackerOpt, 0) if bgcfg.ConsensusHALockPeriod > 0 { topts = append(topts, WithLockPeriod(time.Duration(bgcfg.ConsensusHALockPeriod))) } if bgcfg.ConsensusHAHeartbeatInterval > 0 { - topts = append(topts, WithLockPeriod(time.Duration(bgcfg.ConsensusHAHeartbeatInterval))) + topts = append(topts, WithHeartbeatInterval(time.Duration(bgcfg.ConsensusHAHeartbeatInterval))) + } + consensusHARedisClient, err := NewRedisClient(bgcfg.ConsensusHARedis.URL) + if err != nil { + return nil, nil, err } - tracker = NewRedisConsensusTracker(context.Background(), redisClient, bg, bg.Name, topts...) + ns := fmt.Sprintf("%s:%s", bgcfg.ConsensusHARedis.Namespace, bg.Name) + tracker = NewRedisConsensusTracker(context.Background(), consensusHARedisClient, bg, ns, topts...) copts = append(copts, WithTracker(tracker)) } diff --git a/proxyd/server.go b/proxyd/server.go index 3fa3e0003c13..527c2e6c1ff8 100644 --- a/proxyd/server.go +++ b/proxyd/server.go @@ -156,11 +156,7 @@ func NewServer( overrideLims := make(map[string]FrontendRateLimiter) globalMethodLims := make(map[string]bool) for method, override := range rateLimitConfig.MethodOverrides { - var err error overrideLims[method] = limiterFactory(time.Duration(override.Interval), override.Limit, method) - if err != nil { - return nil, err - } if override.Global { globalMethodLims[method] = true diff --git a/versions.json b/versions.json index cace6e6c340b..bfc73ea636fb 100644 --- a/versions.json +++ b/versions.json @@ -1,8 +1,8 @@ { "abigen": "v1.10.25", - "foundry": "a170021b0e058925047a2c9697ba61f10fc0b2ce", - "geth": "v1.13.4", + "foundry": "63fff3510408b552f11efb8196f48cfe6c1da664", + "geth": "v1.13.14", "nvm": "v20.9.0", - "slither": "0.10.0", - "kontrol": "0.1.196" + "slither": "0.10.2", + "kontrol": "0.1.247" }